aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore9
-rw-r--r--bootstrap/bin/start.bootbin5330 -> 5330 bytes
-rw-r--r--bootstrap/bin/start.script8
-rw-r--r--bootstrap/bin/start_clean.bootbin5330 -> 5330 bytes
-rw-r--r--bootstrap/bin/start_clean.script8
-rw-r--r--bootstrap/lib/compiler/ebin/beam_asm.beambin9028 -> 9028 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/beam_dict.beambin3948 -> 3956 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/cerl.beambin28424 -> 28236 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/compile.beambin31504 -> 33652 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/compiler.app2
-rw-r--r--bootstrap/lib/compiler/ebin/core_parse.beambin35236 -> 35288 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/rec_env.beambin4352 -> 4312 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/sys_core_fold.beambin42184 -> 43932 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/v3_codegen.beambin47932 -> 47920 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/v3_core.beambin45376 -> 45460 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/v3_kernel.beambin40832 -> 40848 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/v3_kernel_pp.beambin10624 -> 10868 bytes
-rw-r--r--bootstrap/lib/compiler/egen/core_parse.erl6
-rw-r--r--bootstrap/lib/kernel/ebin/code.beambin6352 -> 6284 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/file.beambin11488 -> 11368 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/global.beambin29308 -> 29312 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/hipe_unified_loader.beambin11428 -> 11428 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/inet.beambin18176 -> 18124 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/inet6_tcp_dist.beambin5856 -> 5832 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/kernel.app2
-rw-r--r--bootstrap/lib/kernel/ebin/kernel.appup2
-rw-r--r--bootstrap/lib/kernel/ebin/net_kernel.beambin21108 -> 21032 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/os.beambin4852 -> 4872 bytes
-rw-r--r--bootstrap/lib/orber/include/ifr_types.hrl6
-rw-r--r--bootstrap/lib/stdlib/ebin/base64.beambin3828 -> 4096 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/beam_lib.beambin16584 -> 16504 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/c.beambin12752 -> 12752 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/calendar.beambin4236 -> 4696 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/dets.beambin48440 -> 48400 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/digraph.beambin7728 -> 7664 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/erl_compile.beambin4780 -> 4736 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/erl_lint.beambin77048 -> 77224 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/erl_parse.beambin66176 -> 66332 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/erl_posix_msg.beambin4908 -> 4992 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/erl_pp.beambin21540 -> 21384 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/erl_scan.beambin30440 -> 30368 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/escript.beambin15268 -> 15428 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/ets.beambin18312 -> 18268 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/filename.beambin11660 -> 11628 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/io.beambin6224 -> 6172 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/io_lib.beambin8336 -> 8300 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/io_lib_format.beambin10964 -> 10928 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/io_lib_fread.beambin6916 -> 6836 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/log_mf_h.beambin2376 -> 2444 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/ordsets.beambin1844 -> 1808 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/proc_lib.beambin8516 -> 8472 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/proplists.beambin4600 -> 4560 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/re.beambin11296 -> 11268 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/stdlib.app2
-rw-r--r--bootstrap/lib/stdlib/ebin/stdlib.appup2
-rw-r--r--bootstrap/lib/stdlib/ebin/supervisor.beambin14544 -> 15580 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/timer.beambin4876 -> 4840 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/unicode.beambin10848 -> 10808 bytes
-rw-r--r--bootstrap/lib/stdlib/egen/erl_parse.erl188
-rw-r--r--erts/aclocal.m4141
-rwxr-xr-xerts/autoconf/configure.vxworks2
-rw-r--r--erts/autoconf/vxworks/sed.general2
-rw-r--r--erts/configure.in23
-rw-r--r--erts/doc/src/driver.xml39
-rw-r--r--erts/doc/src/driver_entry.xml26
-rw-r--r--erts/doc/src/epmd.xml19
-rw-r--r--erts/doc/src/erl.xml57
-rw-r--r--erts/doc/src/erl_dist_protocol.xml2
-rw-r--r--erts/doc/src/erl_driver.xml94
-rw-r--r--erts/doc/src/erl_ext_dist.xml2
-rw-r--r--erts/doc/src/erl_nif.xml85
-rw-r--r--erts/doc/src/erlang.xml5
-rw-r--r--erts/doc/src/erlc.xml46
-rw-r--r--erts/doc/src/escript.xml10
-rw-r--r--erts/doc/src/init.xml13
-rw-r--r--erts/doc/src/notes.xml289
-rw-r--r--erts/doc/src/run_erl.xml8
-rw-r--r--erts/emulator/Makefile.in17
-rw-r--r--erts/emulator/beam/beam_bif_load.c15
-rw-r--r--erts/emulator/beam/beam_bp.c4
-rw-r--r--erts/emulator/beam/beam_bp.h2
-rw-r--r--erts/emulator/beam/beam_debug.c131
-rw-r--r--erts/emulator/beam/beam_emu.c1295
-rw-r--r--erts/emulator/beam/beam_load.c588
-rw-r--r--erts/emulator/beam/bif.c69
-rw-r--r--erts/emulator/beam/bif.h8
-rw-r--r--erts/emulator/beam/bif.tab1
-rw-r--r--erts/emulator/beam/big.c8
-rw-r--r--erts/emulator/beam/big.h8
-rw-r--r--erts/emulator/beam/binary.c4
-rw-r--r--erts/emulator/beam/break.c21
-rw-r--r--erts/emulator/beam/copy.c115
-rw-r--r--erts/emulator/beam/dist.c173
-rw-r--r--erts/emulator/beam/dist.h3
-rw-r--r--erts/emulator/beam/erl_alloc.c37
-rw-r--r--erts/emulator/beam/erl_alloc.h32
-rw-r--r--erts/emulator/beam/erl_alloc.types5
-rw-r--r--erts/emulator/beam/erl_alloc_util.c70
-rw-r--r--erts/emulator/beam/erl_alloc_util.h5
-rw-r--r--erts/emulator/beam/erl_bif_ddll.c6
-rw-r--r--erts/emulator/beam/erl_bif_info.c36
-rw-r--r--erts/emulator/beam/erl_bif_lists.c4
-rw-r--r--erts/emulator/beam/erl_bif_timer.c15
-rw-r--r--erts/emulator/beam/erl_binary.h19
-rw-r--r--erts/emulator/beam/erl_bits.c20
-rw-r--r--erts/emulator/beam/erl_cpu_topology.c24
-rw-r--r--erts/emulator/beam/erl_db.c210
-rw-r--r--erts/emulator/beam/erl_db.h3
-rw-r--r--erts/emulator/beam/erl_db_hash.c88
-rw-r--r--erts/emulator/beam/erl_db_tree.c336
-rw-r--r--erts/emulator/beam/erl_db_util.c814
-rw-r--r--erts/emulator/beam/erl_db_util.h76
-rw-r--r--erts/emulator/beam/erl_driver.h59
-rw-r--r--erts/emulator/beam/erl_drv_thread.c60
-rw-r--r--erts/emulator/beam/erl_fun.c8
-rw-r--r--erts/emulator/beam/erl_gc.c13
-rw-r--r--erts/emulator/beam/erl_init.c12
-rw-r--r--erts/emulator/beam/erl_lock_check.c12
-rw-r--r--erts/emulator/beam/erl_lock_check.h2
-rw-r--r--erts/emulator/beam/erl_lock_count.c14
-rw-r--r--erts/emulator/beam/erl_monitors.c18
-rw-r--r--erts/emulator/beam/erl_nif.c59
-rw-r--r--erts/emulator/beam/erl_nif.h15
-rw-r--r--erts/emulator/beam/erl_nif_api_funcs.h21
-rw-r--r--erts/emulator/beam/erl_nmgc.c3
-rw-r--r--erts/emulator/beam/erl_node_container_utils.h17
-rw-r--r--erts/emulator/beam/erl_node_tables.c10
-rw-r--r--erts/emulator/beam/erl_port_task.c25
-rw-r--r--erts/emulator/beam/erl_port_task.h5
-rw-r--r--erts/emulator/beam/erl_printf_term.c452
-rw-r--r--erts/emulator/beam/erl_process.c791
-rw-r--r--erts/emulator/beam/erl_process.h80
-rw-r--r--erts/emulator/beam/erl_process_dump.c242
-rw-r--r--erts/emulator/beam/erl_process_lock.c12
-rw-r--r--erts/emulator/beam/erl_process_lock.h30
-rw-r--r--erts/emulator/beam/erl_smp.h401
-rw-r--r--erts/emulator/beam/erl_term.c49
-rw-r--r--erts/emulator/beam/erl_term.h174
-rw-r--r--erts/emulator/beam/erl_threads.h453
-rw-r--r--erts/emulator/beam/erl_time.h66
-rw-r--r--erts/emulator/beam/erl_time_sup.c19
-rw-r--r--erts/emulator/beam/erl_trace.c6
-rw-r--r--erts/emulator/beam/erl_unicode.c4
-rw-r--r--erts/emulator/beam/erl_vm.h9
-rw-r--r--erts/emulator/beam/external.c4
-rw-r--r--erts/emulator/beam/global.h146
-rw-r--r--erts/emulator/beam/io.c79
-rw-r--r--erts/emulator/beam/ops.tab271
-rw-r--r--erts/emulator/beam/sys.h112
-rw-r--r--erts/emulator/beam/time.c291
-rw-r--r--erts/emulator/beam/utils.c324
-rw-r--r--erts/emulator/drivers/common/efile_drv.c9
-rw-r--r--erts/emulator/drivers/common/gzio.c2
-rw-r--r--erts/emulator/drivers/common/inet_drv.c99
-rw-r--r--erts/emulator/drivers/unix/unix_efile.c2
-rw-r--r--erts/emulator/drivers/win32/win_con.c14
-rwxr-xr-xerts/emulator/drivers/win32/win_efile.c6
-rw-r--r--erts/emulator/hipe/hipe_abi.txt2
-rw-r--r--erts/emulator/hipe/hipe_amd64.c54
-rw-r--r--erts/emulator/hipe/hipe_amd64.h14
-rw-r--r--erts/emulator/hipe/hipe_amd64.tab14
-rw-r--r--erts/emulator/hipe/hipe_amd64_abi.txt2
-rw-r--r--erts/emulator/hipe/hipe_amd64_asm.m47
-rw-r--r--erts/emulator/hipe/hipe_amd64_bifs.m46
-rw-r--r--erts/emulator/hipe/hipe_amd64_gc.h12
-rw-r--r--erts/emulator/hipe/hipe_amd64_glue.S6
-rw-r--r--erts/emulator/hipe/hipe_amd64_glue.h15
-rw-r--r--erts/emulator/hipe/hipe_amd64_primops.h14
-rw-r--r--erts/emulator/hipe/hipe_arch.h14
-rw-r--r--erts/emulator/hipe/hipe_arm.c14
-rw-r--r--erts/emulator/hipe/hipe_arm.h14
-rw-r--r--erts/emulator/hipe/hipe_arm.tab12
-rw-r--r--erts/emulator/hipe/hipe_arm_abi.txt2
-rw-r--r--erts/emulator/hipe/hipe_arm_asm.m415
-rw-r--r--erts/emulator/hipe/hipe_arm_bifs.m414
-rw-r--r--erts/emulator/hipe/hipe_arm_gc.h12
-rw-r--r--erts/emulator/hipe/hipe_arm_glue.S14
-rw-r--r--erts/emulator/hipe/hipe_arm_glue.h12
-rw-r--r--erts/emulator/hipe/hipe_arm_primops.h14
-rw-r--r--erts/emulator/hipe/hipe_bif0.c52
-rw-r--r--erts/emulator/hipe/hipe_bif0.h17
-rw-r--r--erts/emulator/hipe/hipe_bif0.tab12
-rw-r--r--erts/emulator/hipe/hipe_bif1.c13
-rw-r--r--erts/emulator/hipe/hipe_bif1.h12
-rw-r--r--erts/emulator/hipe/hipe_bif2.c26
-rw-r--r--erts/emulator/hipe/hipe_bif2.tab3
-rw-r--r--erts/emulator/hipe/hipe_bif64.c68
-rw-r--r--erts/emulator/hipe/hipe_bif64.h26
-rw-r--r--erts/emulator/hipe/hipe_bif64.tab22
-rw-r--r--erts/emulator/hipe/hipe_bif_list.m412
-rw-r--r--erts/emulator/hipe/hipe_debug.c18
-rw-r--r--erts/emulator/hipe/hipe_debug.h12
-rw-r--r--erts/emulator/hipe/hipe_gbif_list.h12
-rw-r--r--erts/emulator/hipe/hipe_gc.c5
-rw-r--r--erts/emulator/hipe/hipe_gc.h14
-rw-r--r--erts/emulator/hipe/hipe_mkliterals.c16
-rw-r--r--erts/emulator/hipe/hipe_mode_switch.c51
-rw-r--r--erts/emulator/hipe/hipe_mode_switch.h14
-rw-r--r--erts/emulator/hipe/hipe_native_bif.c12
-rw-r--r--erts/emulator/hipe/hipe_native_bif.h12
-rw-r--r--erts/emulator/hipe/hipe_ops.tab10
-rw-r--r--erts/emulator/hipe/hipe_perfctr.c14
-rw-r--r--erts/emulator/hipe/hipe_perfctr.h13
-rw-r--r--erts/emulator/hipe/hipe_perfctr.tab11
-rw-r--r--erts/emulator/hipe/hipe_ppc.c124
-rw-r--r--erts/emulator/hipe/hipe_ppc.h24
-rw-r--r--erts/emulator/hipe/hipe_ppc.tab12
-rw-r--r--erts/emulator/hipe/hipe_ppc64.tab4
-rw-r--r--erts/emulator/hipe/hipe_ppc_abi.txt2
-rw-r--r--erts/emulator/hipe/hipe_ppc_asm.m431
-rw-r--r--erts/emulator/hipe/hipe_ppc_bifs.m414
-rw-r--r--erts/emulator/hipe/hipe_ppc_gc.h12
-rw-r--r--erts/emulator/hipe/hipe_ppc_glue.S26
-rw-r--r--erts/emulator/hipe/hipe_ppc_glue.h14
-rw-r--r--erts/emulator/hipe/hipe_ppc_primops.h14
-rw-r--r--erts/emulator/hipe/hipe_primops.h14
-rw-r--r--erts/emulator/hipe/hipe_process.h12
-rw-r--r--erts/emulator/hipe/hipe_risc_gc.h12
-rw-r--r--erts/emulator/hipe/hipe_risc_glue.h14
-rw-r--r--erts/emulator/hipe/hipe_risc_stack.c14
-rw-r--r--erts/emulator/hipe/hipe_signal.h12
-rw-r--r--erts/emulator/hipe/hipe_sparc.c14
-rw-r--r--erts/emulator/hipe/hipe_sparc.h14
-rw-r--r--erts/emulator/hipe/hipe_sparc.tab12
-rw-r--r--erts/emulator/hipe/hipe_sparc_abi.txt2
-rw-r--r--erts/emulator/hipe/hipe_sparc_asm.m415
-rw-r--r--erts/emulator/hipe/hipe_sparc_bifs.m414
-rw-r--r--erts/emulator/hipe/hipe_sparc_gc.h12
-rw-r--r--erts/emulator/hipe/hipe_sparc_glue.S15
-rw-r--r--erts/emulator/hipe/hipe_sparc_glue.h14
-rw-r--r--erts/emulator/hipe/hipe_sparc_primops.h14
-rw-r--r--erts/emulator/hipe/hipe_stack.c14
-rw-r--r--erts/emulator/hipe/hipe_stack.h14
-rw-r--r--erts/emulator/hipe/hipe_x86.c14
-rw-r--r--erts/emulator/hipe/hipe_x86.h14
-rw-r--r--erts/emulator/hipe/hipe_x86.tab12
-rw-r--r--erts/emulator/hipe/hipe_x86_abi.txt4
-rw-r--r--erts/emulator/hipe/hipe_x86_asm.m415
-rw-r--r--erts/emulator/hipe/hipe_x86_bifs.m414
-rw-r--r--erts/emulator/hipe/hipe_x86_gc.h12
-rw-r--r--erts/emulator/hipe/hipe_x86_glue.S15
-rw-r--r--erts/emulator/hipe/hipe_x86_glue.h15
-rw-r--r--erts/emulator/hipe/hipe_x86_primops.h14
-rw-r--r--erts/emulator/hipe/hipe_x86_signal.c13
-rw-r--r--erts/emulator/hipe/hipe_x86_stack.c14
-rw-r--r--erts/emulator/sys/common/erl_mseg.c698
-rw-r--r--erts/emulator/sys/common/erl_poll.c287
-rw-r--r--erts/emulator/sys/unix/erl_unix_sys.h9
-rw-r--r--erts/emulator/sys/unix/sys.c290
-rw-r--r--erts/emulator/sys/unix/sys_float.c7
-rw-r--r--erts/emulator/sys/vxworks/sys.c2
-rw-r--r--erts/emulator/sys/win32/erl_poll.c386
-rw-r--r--erts/emulator/sys/win32/erl_win_dyn_driver.h14
-rw-r--r--erts/emulator/sys/win32/sys.c203
-rw-r--r--erts/emulator/sys/win32/sys_interrupt.c8
-rw-r--r--erts/emulator/test/Makefile16
-rw-r--r--erts/emulator/test/a_SUITE.erl29
-rw-r--r--erts/emulator/test/after_SUITE.erl37
-rw-r--r--erts/emulator/test/alloc_SUITE.erl41
-rw-r--r--erts/emulator/test/beam_SUITE.erl51
-rw-r--r--erts/emulator/test/beam_literals_SUITE.erl78
-rw-r--r--erts/emulator/test/beam_literals_SUITE_data/literal_case_expression.S80
-rw-r--r--erts/emulator/test/bif_SUITE.erl61
-rw-r--r--erts/emulator/test/big_SUITE.erl42
-rw-r--r--erts/emulator/test/binary_SUITE.erl63
-rw-r--r--erts/emulator/test/bs_bincomp_SUITE.erl31
-rw-r--r--erts/emulator/test/bs_bit_binaries_SUITE.erl34
-rw-r--r--erts/emulator/test/bs_construct_SUITE.erl50
-rw-r--r--erts/emulator/test/bs_match_bin_SUITE.erl30
-rw-r--r--erts/emulator/test/bs_match_int_SUITE.erl32
-rw-r--r--erts/emulator/test/bs_match_misc_SUITE.erl36
-rw-r--r--erts/emulator/test/bs_match_tail_SUITE.erl28
-rw-r--r--erts/emulator/test/bs_utf_SUITE.erl36
-rw-r--r--erts/emulator/test/busy_port_SUITE.erl35
-rw-r--r--erts/emulator/test/call_trace_SUITE.erl39
-rw-r--r--erts/emulator/test/code_SUITE.erl52
-rw-r--r--erts/emulator/test/crypto_SUITE.erl30
-rw-r--r--erts/emulator/test/crypto_reference.erl2
-rw-r--r--erts/emulator/test/ddll_SUITE.erl65
-rw-r--r--erts/emulator/test/decode_packet_SUITE.erl30
-rw-r--r--erts/emulator/test/dgawd_handler.erl2
-rw-r--r--erts/emulator/test/distribution_SUITE.erl383
-rw-r--r--erts/emulator/test/driver_SUITE.erl124
-rw-r--r--erts/emulator/test/driver_SUITE_data/chkio_drv.c15
-rw-r--r--erts/emulator/test/efile_SUITE.erl28
-rw-r--r--erts/emulator/test/emulator.spec2
-rw-r--r--erts/emulator/test/erl_drv_thread_SUITE.erl28
-rw-r--r--erts/emulator/test/erl_link_SUITE.erl43
-rw-r--r--erts/emulator/test/erts_debug_SUITE.erl40
-rw-r--r--erts/emulator/test/estone_SUITE.erl34
-rw-r--r--erts/emulator/test/evil_SUITE.erl47
-rw-r--r--erts/emulator/test/exception_SUITE.erl46
-rw-r--r--erts/emulator/test/float_SUITE.erl39
-rw-r--r--erts/emulator/test/fun_SUITE.erl38
-rw-r--r--erts/emulator/test/fun_r12_SUITE.erl31
-rw-r--r--erts/emulator/test/gc_SUITE.erl29
-rw-r--r--erts/emulator/test/guard_SUITE.erl31
-rw-r--r--erts/emulator/test/hash_SUITE.erl38
-rw-r--r--erts/emulator/test/hibernate_SUITE.erl74
-rw-r--r--[l---------]erts/emulator/test/ignore_cores.erl159
-rw-r--r--erts/emulator/test/list_bif_SUITE.erl33
-rw-r--r--erts/emulator/test/long_timers_test.erl2
-rw-r--r--erts/emulator/test/match_spec_SUITE.erl72
-rw-r--r--erts/emulator/test/module_info_SUITE.erl43
-rw-r--r--erts/emulator/test/monitor_SUITE.erl44
-rw-r--r--erts/emulator/test/mtx_SUITE.erl44
-rw-r--r--erts/emulator/test/nested_SUITE.erl30
-rw-r--r--erts/emulator/test/nif_SUITE.erl72
-rw-r--r--erts/emulator/test/nif_SUITE_data/nif_SUITE.c18
-rw-r--r--erts/emulator/test/nif_SUITE_data/nif_mod.erl4
-rw-r--r--erts/emulator/test/nif_SUITE_data/tester.erl2
-rw-r--r--erts/emulator/test/node_container_SUITE.erl56
-rw-r--r--erts/emulator/test/nofrag_SUITE.erl33
-rw-r--r--erts/emulator/test/num_bif_SUITE.erl36
-rw-r--r--erts/emulator/test/old_mod.erl2
-rw-r--r--erts/emulator/test/old_scheduler_SUITE.erl40
-rw-r--r--erts/emulator/test/op_SUITE.erl33
-rw-r--r--erts/emulator/test/port_SUITE.erl68
-rw-r--r--erts/emulator/test/port_bif_SUITE.erl44
-rw-r--r--erts/emulator/test/process_SUITE.erl176
-rw-r--r--erts/emulator/test/pseudoknot_SUITE.erl38
-rw-r--r--erts/emulator/test/random_iolist.erl2
-rw-r--r--erts/emulator/test/receive_SUITE.erl33
-rw-r--r--erts/emulator/test/ref_SUITE.erl31
-rw-r--r--erts/emulator/test/register_SUITE.erl31
-rw-r--r--erts/emulator/test/save_calls_SUITE.erl27
-rw-r--r--erts/emulator/test/scheduler_SUITE.erl125
-rw-r--r--erts/emulator/test/send_term_SUITE.erl31
-rw-r--r--erts/emulator/test/sensitive_SUITE.erl37
-rw-r--r--erts/emulator/test/signal_SUITE.erl45
-rw-r--r--erts/emulator/test/statistics_SUITE.erl48
-rw-r--r--erts/emulator/test/system_info_SUITE.erl33
-rw-r--r--erts/emulator/test/system_profile_SUITE.erl41
-rw-r--r--erts/emulator/test/time_SUITE.erl36
-rw-r--r--erts/emulator/test/timer_bif_SUITE.erl36
-rw-r--r--erts/emulator/test/trace_SUITE.erl44
-rw-r--r--erts/emulator/test/trace_bif_SUITE.erl34
-rw-r--r--erts/emulator/test/trace_call_count_SUITE.erl38
-rw-r--r--erts/emulator/test/trace_call_time_SUITE.erl46
-rw-r--r--erts/emulator/test/trace_local_SUITE.erl61
-rw-r--r--erts/emulator/test/trace_meta_SUITE.erl48
-rw-r--r--erts/emulator/test/trace_nif_SUITE.erl39
-rw-r--r--erts/emulator/test/trace_port_SUITE.erl45
-rw-r--r--erts/emulator/test/tuple_SUITE.erl37
-rw-r--r--erts/emulator/test/z_SUITE.erl38
-rwxr-xr-xerts/emulator/utils/beam_makeops118
-rwxr-xr-xerts/emulator/utils/count127
-rw-r--r--erts/emulator/utils/loaded44
-rw-r--r--erts/epmd/src/epmd.c45
-rw-r--r--erts/epmd/src/epmd_cli.c2
-rw-r--r--erts/epmd/src/epmd_int.h59
-rw-r--r--erts/epmd/src/epmd_srv.c224
-rw-r--r--erts/epmd/test/Makefile2
-rw-r--r--erts/epmd/test/epmd.spec2
-rw-r--r--erts/epmd/test/epmd_SUITE.erl75
-rw-r--r--erts/etc/common/dialyzer.c2
-rw-r--r--erts/etc/common/erlc.c101
-rw-r--r--erts/etc/common/heart.c8
-rw-r--r--erts/etc/common/inet_gethost.c2
-rw-r--r--erts/etc/common/typer.c2
-rw-r--r--erts/etc/unix/cerl.src25
-rw-r--r--erts/etc/unix/run_erl.c80
-rw-r--r--erts/etc/unix/to_erl.c8
-rw-r--r--erts/etc/win32/erlsrv/erlsrv_service.c4
-rw-r--r--erts/etc/win32/nsis/Makefile2
-rwxr-xr-xerts/etc/win32/nsis/dll_version_helper.sh75
-rwxr-xr-xerts/etc/win32/nsis/find_redist.sh46
-rw-r--r--erts/example/next_perm.cc2
-rw-r--r--erts/include/internal/ethr_atomics.h726
-rw-r--r--erts/include/internal/ethr_mutex.h78
-rw-r--r--erts/include/internal/ethr_optimized_fallbacks.h74
-rw-r--r--erts/include/internal/ethread.h376
-rw-r--r--erts/include/internal/ethread_header_config.h.in36
-rw-r--r--erts/include/internal/gcc/ethr_atomic.h222
-rw-r--r--erts/include/internal/gcc/ethread.h10
-rw-r--r--erts/include/internal/i386/atomic.h190
-rw-r--r--erts/include/internal/i386/ethread.h7
-rw-r--r--erts/include/internal/libatomic_ops/ethr_atomic.h200
-rw-r--r--erts/include/internal/ppc32/atomic.h94
-rw-r--r--erts/include/internal/ppc32/ethread.h2
-rw-r--r--erts/include/internal/pthread/ethr_event.h60
-rw-r--r--erts/include/internal/sparc32/atomic.h172
-rw-r--r--erts/include/internal/sparc32/ethread.h7
-rw-r--r--erts/include/internal/tile/atomic.h104
-rw-r--r--erts/include/internal/win/ethr_atomic.h415
-rw-r--r--erts/include/internal/win/ethr_event.h16
-rw-r--r--erts/include/internal/win/ethread.h6
-rw-r--r--erts/lib_src/Makefile.in7
-rw-r--r--erts/lib_src/common/erl_misc_utils.c4
-rw-r--r--erts/lib_src/common/erl_printf_format.c27
-rw-r--r--erts/lib_src/common/ethr_atomics.c402
-rw-r--r--erts/lib_src/common/ethr_aux.c202
-rw-r--r--erts/lib_src/common/ethr_mutex.c327
-rw-r--r--erts/lib_src/pthread/ethr_event.c34
-rw-r--r--erts/lib_src/pthread/ethread.c40
-rw-r--r--erts/lib_src/win/ethr_event.c7
-rw-r--r--erts/lib_src/win/ethread.c55
-rw-r--r--erts/preloaded/ebin/erl_prim_loader.beambin50384 -> 50384 bytes
-rw-r--r--erts/preloaded/ebin/erlang.beambin24320 -> 24144 bytes
-rw-r--r--erts/preloaded/ebin/init.beambin44876 -> 44876 bytes
-rw-r--r--erts/preloaded/ebin/otp_ring0.beambin1432 -> 1432 bytes
-rw-r--r--erts/preloaded/ebin/prim_file.beambin31552 -> 31528 bytes
-rw-r--r--erts/preloaded/ebin/prim_inet.beambin65060 -> 64888 bytes
-rw-r--r--erts/preloaded/ebin/prim_zip.beambin22432 -> 22432 bytes
-rw-r--r--erts/preloaded/ebin/zlib.beambin10616 -> 10616 bytes
-rw-r--r--erts/preloaded/src/erlang.erl18
-rw-r--r--erts/preloaded/src/prim_file.erl30
-rw-r--r--erts/preloaded/src/prim_inet.erl6
-rw-r--r--erts/test/Makefile2
-rw-r--r--erts/test/autoimport_SUITE.erl30
-rw-r--r--erts/test/erl_print_SUITE.erl44
-rw-r--r--erts/test/erlc_SUITE.erl25
-rw-r--r--erts/test/erlexec_SUITE.erl31
-rw-r--r--erts/test/ethread_SUITE.erl59
-rw-r--r--erts/test/ethread_SUITE_data/ethread_tests.c65
-rw-r--r--erts/test/install_SUITE.erl44
-rw-r--r--erts/test/nt_SUITE.erl38
-rw-r--r--erts/test/otp_SUITE.erl25
-rw-r--r--erts/test/run_erl_SUITE.erl30
-rw-r--r--erts/test/system.spec2
-rw-r--r--erts/test/z_SUITE.erl31
-rw-r--r--erts/vsn.mk6
-rw-r--r--lib/.gitignore4
-rw-r--r--lib/Makefile4
-rw-r--r--lib/appmon/doc/src/appmon.xml2
-rw-r--r--lib/asn1/doc/src/notes.xml38
-rw-r--r--lib/asn1/src/asn1ct.erl120
-rw-r--r--lib/asn1/src/asn1ct_check.erl133
-rw-r--r--lib/asn1/src/asn1ct_constructed_per.erl6
-rw-r--r--lib/asn1/src/asn1ct_gen.erl10
-rw-r--r--lib/asn1/src/asn1rt_ber_bin.erl7
-rw-r--r--lib/asn1/src/asn1rt_driver_handler.erl2
-rw-r--r--lib/asn1/test/External.hrl2
-rw-r--r--lib/asn1/test/Makefile6
-rw-r--r--lib/asn1/test/asn1.cover2
-rw-r--r--lib/asn1/test/asn1.spec4
-rw-r--r--lib/asn1/test/asn1_SUITE.erl2489
-rw-r--r--lib/asn1/test/asn1_SUITE.erl.src3
-rw-r--r--lib/asn1/test/asn1_SUITE_data/CAP.asn141
-rw-r--r--lib/asn1/test/asn1_SUITE_data/TCAPPackage_msg.erl2
-rw-r--r--lib/asn1/test/asn1_SUITE_data/a_SeqIn.erl2
-rw-r--r--lib/asn1/test/asn1_SUITE_data/b_SeqIn.erl2
-rw-r--r--lib/asn1/test/asn1_SUITE_data/test_records.erl2
-rw-r--r--lib/asn1/test/asn1_app_test.erl33
-rw-r--r--lib/asn1/test/asn1_appup_test.erl30
-rw-r--r--lib/asn1/test/asn1_bin_SUITE.erl2382
-rw-r--r--lib/asn1/test/asn1_bin_v2_SUITE.erl2474
-rw-r--r--lib/asn1/test/asn1_common_SUITE.erl.src2
-rw-r--r--lib/asn1/test/test_inline.erl6
-rw-r--r--lib/asn1/vsn.mk2
-rw-r--r--lib/common_test/doc/src/Makefile5
-rw-r--r--lib/common_test/doc/src/common_test_app.xml24
-rw-r--r--lib/common_test/doc/src/cover_chapter.xml2
-rw-r--r--lib/common_test/doc/src/ct_hooks.xml556
-rw-r--r--lib/common_test/doc/src/ct_hooks_chapter.xml401
-rw-r--r--lib/common_test/doc/src/ct_junit_report.xml109
-rw-r--r--lib/common_test/doc/src/event_handler_chapter.xml13
-rw-r--r--lib/common_test/doc/src/notes.xml38
-rw-r--r--lib/common_test/doc/src/part.xml3
-rw-r--r--lib/common_test/doc/src/ref_man.xml3
-rw-r--r--lib/common_test/doc/src/run_test_chapter.xml23
-rw-r--r--lib/common_test/doc/src/write_test_chapter.xml15
-rw-r--r--lib/common_test/priv/Makefile.in2
-rw-r--r--lib/common_test/src/Makefile6
-rw-r--r--lib/common_test/src/ct.erl9
-rw-r--r--lib/common_test/src/ct_framework.erl230
-rw-r--r--lib/common_test/src/ct_hooks.erl312
-rw-r--r--lib/common_test/src/ct_hooks_lock.erl132
-rw-r--r--lib/common_test/src/ct_logs.erl224
-rw-r--r--lib/common_test/src/ct_run.erl146
-rw-r--r--lib/common_test/src/ct_testspec.erl153
-rw-r--r--lib/common_test/src/ct_util.erl57
-rw-r--r--lib/common_test/src/ct_util.hrl6
-rw-r--r--lib/common_test/src/vts.erl30
-rw-r--r--lib/common_test/test/Makefile7
-rw-r--r--lib/common_test/test/common_test.spec2
-rw-r--r--lib/common_test/test/ct_config_SUITE.erl172
-rw-r--r--lib/common_test/test/ct_error_SUITE.erl178
-rw-r--r--lib/common_test/test/ct_error_SUITE_data/error/test/cfg_error_9_SUITE.erl9
-rw-r--r--lib/common_test/test/ct_error_SUITE_data/error/test/timetrap_2_SUITE.erl26
-rw-r--r--lib/common_test/test/ct_event_handler_SUITE.erl29
-rw-r--r--lib/common_test/test/ct_groups_test_1_SUITE.erl48
-rw-r--r--lib/common_test/test/ct_groups_test_2_SUITE.erl80
-rw-r--r--lib/common_test/test/ct_groups_test_2_SUITE_data/groups_2/groups_22_SUITE.erl51
-rw-r--r--lib/common_test/test/ct_hooks_SUITE.erl1044
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/crash_id_cth.erl34
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/crash_init_cth.erl34
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_cth_empty_SUITE.erl47
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_cth_fail_one_skip_one_SUITE.erl64
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_cth_fail_per_suite_SUITE.erl47
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_exit_in_init_scope_suite_cth_SUITE.erl50
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_per_group_cth_SUITE.erl56
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_per_group_state_cth_SUITE.erl56
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_per_suite_cth_SUITE.erl47
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_per_suite_state_cth_SUITE.erl47
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_per_tc_cth_SUITE.erl110
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_suite_crash_in_cth_SUITE.erl50
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_suite_cth_SUITE.erl50
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_suite_state_cth_SUITE.erl50
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_update_config_SUITE.erl56
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/empty_cth.erl278
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/fail_post_suite_cth.erl72
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/fail_pre_suite_cth.erl72
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/id_no_init_cth.erl32
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/minimal_cth.erl33
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/minimal_terminate_cth.erl38
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/recover_post_suite_cth.erl74
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/same_id_cth.erl75
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/skip_post_suite_cth.erl72
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/skip_pre_suite_cth.erl73
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/state_update_cth.erl83
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/undef_cth.erl71
-rw-r--r--lib/common_test/test/ct_hooks_SUITE_data/cth/tests/update_config_cth.erl82
-rw-r--r--lib/common_test/test/ct_master_SUITE.erl31
-rw-r--r--lib/common_test/test/ct_misc_1_SUITE.erl36
-rw-r--r--lib/common_test/test/ct_repeat_1_SUITE.erl42
-rw-r--r--lib/common_test/test/ct_sequence_1_SUITE.erl24
-rw-r--r--lib/common_test/test/ct_skip_SUITE.erl34
-rw-r--r--lib/common_test/test/ct_smoke_test_SUITE.erl61
-rw-r--r--lib/common_test/test/ct_test_server_if_1_SUITE.erl28
-rw-r--r--lib/common_test/test/ct_test_support.erl293
-rw-r--r--lib/common_test/test/ct_testspec_1_SUITE.erl995
-rw-r--r--lib/common_test/vsn.mk2
-rw-r--r--lib/compiler/doc/src/compile.xml66
-rw-r--r--lib/compiler/doc/src/notes.xml39
-rw-r--r--lib/compiler/doc/src/part_notes_history.xml2
-rw-r--r--lib/compiler/src/Makefile6
-rw-r--r--lib/compiler/src/beam_bsm.erl6
-rw-r--r--lib/compiler/src/beam_dead.erl44
-rw-r--r--lib/compiler/src/beam_dict.erl15
-rw-r--r--lib/compiler/src/compile.erl297
-rw-r--r--lib/compiler/src/sys_core_fold.erl192
-rw-r--r--lib/compiler/src/v3_codegen.erl4
-rw-r--r--lib/compiler/src/v3_core.erl69
-rw-r--r--lib/compiler/src/v3_kernel.erl1
-rw-r--r--lib/compiler/src/v3_kernel_pp.erl55
-rw-r--r--lib/compiler/test/Makefile4
-rw-r--r--lib/compiler/test/andor_SUITE.erl31
-rw-r--r--lib/compiler/test/apply_SUITE.erl29
-rw-r--r--lib/compiler/test/beam_validator_SUITE.erl53
-rw-r--r--lib/compiler/test/bs_bincomp_SUITE.erl31
-rw-r--r--lib/compiler/test/bs_bit_binaries_SUITE.erl34
-rw-r--r--lib/compiler/test/bs_construct_SUITE.erl37
-rw-r--r--lib/compiler/test/bs_match_SUITE.erl78
-rw-r--r--lib/compiler/test/bs_utf_SUITE.erl33
-rw-r--r--lib/compiler/test/compilation_SUITE.erl71
-rw-r--r--lib/compiler/test/compile_SUITE.erl114
-rw-r--r--lib/compiler/test/compile_SUITE_data/simple-basic1.mk1
-rw-r--r--lib/compiler/test/compile_SUITE_data/simple-basic2.mk1
-rw-r--r--lib/compiler/test/compile_SUITE_data/simple-missing.mk1
-rw-r--r--lib/compiler/test/compile_SUITE_data/simple-target1.mk1
-rw-r--r--lib/compiler/test/compile_SUITE_data/simple-target2.mk1
-rw-r--r--lib/compiler/test/compile_SUITE_data/simple.erl6
-rw-r--r--lib/compiler/test/compiler.cover4
-rw-r--r--lib/compiler/test/compiler.dynspec10
-rw-r--r--lib/compiler/test/compiler.spec2
-rw-r--r--lib/compiler/test/core_SUITE.erl32
-rw-r--r--lib/compiler/test/core_fold_SUITE.erl31
-rw-r--r--lib/compiler/test/error_SUITE.erl28
-rw-r--r--lib/compiler/test/float_SUITE.erl31
-rw-r--r--lib/compiler/test/fun_SUITE.erl29
-rw-r--r--lib/compiler/test/guard_SUITE.erl51
-rw-r--r--lib/compiler/test/inline_SUITE.erl31
-rw-r--r--lib/compiler/test/lc_SUITE.erl34
-rw-r--r--lib/compiler/test/match_SUITE.erl47
-rw-r--r--lib/compiler/test/misc_SUITE.erl35
-rw-r--r--lib/compiler/test/num_bif_SUITE.erl35
-rw-r--r--lib/compiler/test/parteval_SUITE.erl28
-rw-r--r--lib/compiler/test/pmod_SUITE.erl30
-rw-r--r--lib/compiler/test/receive_SUITE.erl33
-rw-r--r--lib/compiler/test/record_SUITE.erl52
-rw-r--r--lib/compiler/test/test_lib.erl18
-rw-r--r--lib/compiler/test/trycatch_SUITE.erl37
-rw-r--r--lib/compiler/test/warnings_SUITE.erl46
-rw-r--r--lib/compiler/vsn.mk2
-rw-r--r--lib/cosEvent/doc/src/CosEventChannelAdmin_ConsumerAdmin.xml2
-rw-r--r--lib/cosEvent/doc/src/CosEventChannelAdmin_EventChannel.xml2
-rw-r--r--lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPullConsumer.xml2
-rw-r--r--lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPullSupplier.xml2
-rw-r--r--lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPushConsumer.xml2
-rw-r--r--lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPushSupplier.xml2
-rw-r--r--lib/cosEvent/doc/src/CosEventChannelAdmin_SupplierAdmin.xml2
-rw-r--r--lib/cosEvent/doc/src/ch_contents.xml2
-rw-r--r--lib/cosEvent/doc/src/ch_introduction.xml2
-rw-r--r--lib/cosEvent/doc/src/cosEventApp.xml2
-rw-r--r--lib/cosEvent/doc/src/notes.xml26
-rw-r--r--lib/cosEvent/src/cosEventApp.erl44
-rw-r--r--lib/cosEvent/test/Makefile5
-rw-r--r--lib/cosEvent/test/cosEvent.cover2
-rw-r--r--lib/cosEvent/test/cosEvent.spec20
-rw-r--r--lib/cosEvent/test/event_channel_SUITE.erl42
-rw-r--r--lib/cosEvent/test/event_test_PullC_impl.erl2
-rw-r--r--lib/cosEvent/test/event_test_PullS_impl.erl2
-rw-r--r--lib/cosEvent/test/event_test_PushC_impl.erl2
-rw-r--r--lib/cosEvent/test/event_test_PushS_impl.erl2
-rw-r--r--lib/cosEvent/test/generated_SUITE.erl53
-rw-r--r--lib/cosEvent/vsn.mk4
-rw-r--r--lib/cosEventDomain/doc/src/CosEventDomainAdmin.xml2
-rw-r--r--lib/cosEventDomain/doc/src/CosEventDomainAdmin_EventDomainFactory.xml2
-rw-r--r--lib/cosEventDomain/doc/src/cosEventDomainApp.xml2
-rw-r--r--lib/cosEventDomain/doc/src/notes.xml20
-rw-r--r--lib/cosEventDomain/src/CosEventDomainAdmin_EventDomain_impl.erl24
-rw-r--r--lib/cosEventDomain/src/cosEventDomainApp.erl13
-rw-r--r--lib/cosEventDomain/test/Makefile5
-rw-r--r--lib/cosEventDomain/test/cosEventDomain.cover2
-rw-r--r--lib/cosEventDomain/test/cosEventDomain.spec20
-rw-r--r--lib/cosEventDomain/test/event_domain_SUITE.erl39
-rw-r--r--lib/cosEventDomain/test/generated_SUITE.erl51
-rw-r--r--lib/cosEventDomain/vsn.mk4
-rw-r--r--lib/cosFileTransfer/doc/src/CosFileTransfer_Directory.xml2
-rw-r--r--lib/cosFileTransfer/doc/src/CosFileTransfer_File.xml2
-rw-r--r--lib/cosFileTransfer/doc/src/CosFileTransfer_VirtualFileSystem.xml2
-rw-r--r--lib/cosFileTransfer/test/Makefile7
-rw-r--r--lib/cosFileTransfer/test/cosFileTransfer.cover2
-rw-r--r--lib/cosFileTransfer/test/cosFileTransfer.spec2
-rw-r--r--lib/cosFileTransfer/test/fileTransfer_SUITE.erl112
-rw-r--r--lib/cosNotification/doc/src/CosNotification.xml2
-rw-r--r--lib/cosNotification/doc/src/CosNotification_AdminPropertiesAdmin.xml2
-rw-r--r--lib/cosNotification/doc/src/CosNotifyChannelAdmin_ConsumerAdmin.xml2
-rw-r--r--lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyConsumer.xml2
-rw-r--r--lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyPullConsumer.xml2
-rw-r--r--lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyPullSupplier.xml2
-rw-r--r--lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyPushConsumer.xml2
-rw-r--r--lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyPushSupplier.xml2
-rw-r--r--lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxySupplier.xml2
-rw-r--r--lib/cosNotification/doc/src/CosNotifyChannelAdmin_SequenceProxyPullConsumer.xml2
-rw-r--r--lib/cosNotification/doc/src/CosNotifyChannelAdmin_SequenceProxyPullSupplier.xml2
-rw-r--r--lib/cosNotification/doc/src/CosNotifyChannelAdmin_SequenceProxyPushSupplier.xml2
-rw-r--r--lib/cosNotification/doc/src/CosNotifyChannelAdmin_StructuredProxyPullConsumer.xml2
-rw-r--r--lib/cosNotification/doc/src/CosNotifyChannelAdmin_StructuredProxyPullSupplier.xml2
-rw-r--r--lib/cosNotification/doc/src/CosNotifyChannelAdmin_StructuredProxyPushConsumer.xml2
-rw-r--r--lib/cosNotification/doc/src/CosNotifyChannelAdmin_StructuredProxyPushSupplier.xml2
-rw-r--r--lib/cosNotification/doc/src/CosNotifyChannelAdmin_SupplierAdmin.xml2
-rw-r--r--lib/cosNotification/doc/src/CosNotifyComm_NotifyPublish.xml2
-rw-r--r--lib/cosNotification/doc/src/CosNotifyComm_NotifySubscribe.xml2
-rw-r--r--lib/cosNotification/doc/src/CosNotifyFilter_FilterAdmin.xml2
-rw-r--r--lib/cosNotification/doc/src/CosNotifyFilter_FilterFactory.xml2
-rw-r--r--lib/cosNotification/doc/src/notes.xml16
-rw-r--r--lib/cosNotification/src/CosNotification_Common.erl46
-rw-r--r--lib/cosNotification/test/Makefile5
-rw-r--r--lib/cosNotification/test/cosNotification.cover2
-rw-r--r--lib/cosNotification/test/cosNotification.spec20
-rw-r--r--lib/cosNotification/test/eventDB_SUITE.erl44
-rw-r--r--lib/cosNotification/test/generated_SUITE.erl156
-rw-r--r--lib/cosNotification/test/grammar_SUITE.erl43
-rw-r--r--lib/cosNotification/test/notification_SUITE.erl46
-rw-r--r--lib/cosNotification/test/notify_test_impl.erl2
-rw-r--r--lib/cosNotification/vsn.mk3
-rw-r--r--lib/cosProperty/doc/src/CosPropertyService_PropertyNamesIterator.xml2
-rw-r--r--lib/cosProperty/doc/src/CosPropertyService_PropertySet.xml2
-rw-r--r--lib/cosProperty/doc/src/CosPropertyService_PropertySetDefFactory.xml2
-rw-r--r--lib/cosProperty/doc/src/CosPropertyService_PropertySetFactory.xml2
-rw-r--r--lib/cosProperty/doc/src/notes.xml24
-rw-r--r--lib/cosProperty/src/CosPropertyService_PropertySetDefFactory_impl.erl14
-rw-r--r--lib/cosProperty/src/CosPropertyService_PropertySetFactory_impl.erl14
-rw-r--r--lib/cosProperty/test/Makefile5
-rw-r--r--lib/cosProperty/test/cosProperty.cover2
-rw-r--r--lib/cosProperty/test/cosProperty.spec21
-rw-r--r--lib/cosProperty/test/generated_SUITE.erl70
-rw-r--r--lib/cosProperty/test/property_SUITE.erl43
-rw-r--r--lib/cosProperty/vsn.mk3
-rw-r--r--lib/cosTime/doc/src/CosTime_TIO.xml2
-rw-r--r--lib/cosTime/doc/src/CosTime_TimeService.xml2
-rw-r--r--lib/cosTime/doc/src/CosTime_UTO.xml2
-rw-r--r--lib/cosTime/doc/src/CosTimerEvent_TimerEventHandler.xml2
-rw-r--r--lib/cosTime/doc/src/CosTimerEvent_TimerEventService.xml2
-rw-r--r--lib/cosTime/doc/src/cosTime.xml2
-rw-r--r--lib/cosTime/doc/src/notes.xml18
-rw-r--r--lib/cosTime/src/cosTime.erl60
-rw-r--r--lib/cosTime/test/Makefile5
-rw-r--r--lib/cosTime/test/cosTime.cover2
-rw-r--r--lib/cosTime/test/cosTime.spec20
-rw-r--r--lib/cosTime/test/generated_SUITE.erl38
-rw-r--r--lib/cosTime/test/time_SUITE.erl39
-rw-r--r--lib/cosTime/vsn.mk3
-rw-r--r--lib/cosTransactions/doc/src/CosTransactions_Control.xml2
-rw-r--r--lib/cosTransactions/doc/src/CosTransactions_Synchronization.xml2
-rw-r--r--lib/cosTransactions/doc/src/CosTransactions_Terminator.xml2
-rw-r--r--lib/cosTransactions/doc/src/CosTransactions_TransactionFactory.xml2
-rw-r--r--lib/cosTransactions/doc/src/cosTransactions.xml2
-rw-r--r--lib/cosTransactions/test/Makefile5
-rw-r--r--lib/cosTransactions/test/cosTransactions.cover2
-rw-r--r--lib/cosTransactions/test/cosTransactions.spec20
-rw-r--r--lib/cosTransactions/test/etrap_test_lib.erl2
-rw-r--r--lib/cosTransactions/test/etrap_test_lib.hrl2
-rw-r--r--lib/cosTransactions/test/generated_SUITE.erl64
-rw-r--r--lib/cosTransactions/test/transactions_SUITE.erl37
-rw-r--r--lib/crypto/c_src/crypto.c77
-rw-r--r--lib/crypto/doc/src/crypto.xml54
-rw-r--r--lib/crypto/doc/src/crypto_app.xml2
-rw-r--r--lib/crypto/doc/src/notes.xml32
-rw-r--r--lib/crypto/doc/src/release_notes.xml2
-rw-r--r--lib/crypto/src/crypto.erl25
-rw-r--r--lib/crypto/test/Makefile4
-rw-r--r--lib/crypto/test/blowfish_SUITE.erl35
-rw-r--r--lib/crypto/test/crypto.cover2
-rw-r--r--lib/crypto/test/crypto.spec3
-rw-r--r--lib/crypto/test/crypto_SUITE.erl108
-rw-r--r--lib/crypto/vsn.mk2
-rw-r--r--lib/debugger/doc/src/notes.xml15
-rw-r--r--lib/debugger/src/dbg_icmd.erl2
-rw-r--r--lib/debugger/src/dbg_ieval.erl2
-rw-r--r--lib/debugger/src/dbg_iserver.erl2
-rw-r--r--lib/debugger/src/dbg_ui_break_win.erl2
-rw-r--r--lib/debugger/src/dbg_ui_filedialog_win.erl2
-rw-r--r--lib/debugger/src/dbg_ui_mon_win.erl2
-rw-r--r--lib/debugger/src/dbg_ui_view.erl13
-rw-r--r--lib/debugger/src/dbg_ui_winman.erl2
-rw-r--r--lib/debugger/src/dbg_wx_break_win.erl2
-rw-r--r--lib/debugger/src/dbg_wx_interpret.erl2
-rw-r--r--lib/debugger/src/dbg_wx_trace.erl2
-rw-r--r--lib/debugger/src/dbg_wx_view.erl11
-rwxr-xr-xlib/debugger/src/dbg_wx_winman.erl2
-rw-r--r--lib/debugger/src/i.erl2
-rw-r--r--lib/debugger/src/int.erl2
-rw-r--r--lib/debugger/test/Makefile6
-rw-r--r--lib/debugger/test/andor_SUITE.erl37
-rw-r--r--lib/debugger/test/bs_bincomp_SUITE.erl34
-rw-r--r--lib/debugger/test/bs_construct_SUITE.erl38
-rw-r--r--lib/debugger/test/bs_match_bin_SUITE.erl36
-rw-r--r--lib/debugger/test/bs_match_int_SUITE.erl36
-rw-r--r--lib/debugger/test/bs_match_misc_SUITE.erl36
-rw-r--r--lib/debugger/test/bs_match_tail_SUITE.erl36
-rw-r--r--lib/debugger/test/bs_utf_SUITE.erl39
-rw-r--r--lib/debugger/test/bug_SUITE.erl32
-rw-r--r--lib/debugger/test/cleanup.erl17
-rw-r--r--lib/debugger/test/dbg_ui_SUITE.erl73
-rw-r--r--lib/debugger/test/debugger.cover2
-rw-r--r--lib/debugger/test/debugger.spec2
-rw-r--r--lib/debugger/test/debugger_SUITE.erl33
-rw-r--r--lib/debugger/test/erl_eval_SUITE.erl42
-rw-r--r--lib/debugger/test/exception_SUITE.erl34
-rw-r--r--lib/debugger/test/fun_SUITE.erl35
-rw-r--r--lib/debugger/test/guard_SUITE.erl51
-rw-r--r--lib/debugger/test/int_SUITE.erl40
-rw-r--r--lib/debugger/test/int_break_SUITE.erl32
-rw-r--r--lib/debugger/test/int_eval_SUITE.erl43
-rw-r--r--lib/debugger/test/lc_SUITE.erl34
-rw-r--r--lib/debugger/test/record_SUITE.erl36
-rw-r--r--lib/debugger/test/trycatch_SUITE.erl40
-rw-r--r--lib/debugger/vsn.mk2
-rw-r--r--lib/dialyzer/RELEASE_NOTES12
-rw-r--r--lib/dialyzer/doc/manual.txt37
-rw-r--r--lib/dialyzer/doc/src/dialyzer.xml78
-rwxr-xr-xlib/dialyzer/doc/src/notes.xml86
-rw-r--r--lib/dialyzer/src/dialyzer.erl35
-rw-r--r--lib/dialyzer/src/dialyzer.hrl19
-rw-r--r--lib/dialyzer/src/dialyzer_cl.erl20
-rw-r--r--lib/dialyzer/src/dialyzer_cl_parse.erl60
-rw-r--r--lib/dialyzer/src/dialyzer_dataflow.erl260
-rw-r--r--lib/dialyzer/src/dialyzer_gui.erl2
-rw-r--r--lib/dialyzer/src/dialyzer_options.erl26
-rw-r--r--lib/dialyzer/src/dialyzer_plt.erl26
-rw-r--r--lib/dialyzer/src/dialyzer_succ_typings.erl33
-rw-r--r--lib/dialyzer/src/dialyzer_typesig.erl10
-rw-r--r--lib/dialyzer/src/dialyzer_utils.erl24
-rw-r--r--lib/dialyzer/test/Makefile34
-rw-r--r--lib/dialyzer/test/README38
-rw-r--r--lib/dialyzer/test/callgraph_SUITE_data/dialyzer_options1
-rw-r--r--lib/dialyzer/test/callgraph_SUITE_data/results/test_missing_functions3
-rw-r--r--lib/dialyzer/test/callgraph_SUITE_data/src/test_missing_functions/t1.erl16
-rw-r--r--lib/dialyzer/test/callgraph_SUITE_data/src/test_missing_functions/t2.erl16
-rw-r--r--lib/dialyzer/test/dialyzer.spec5
-rw-r--r--lib/dialyzer/test/dialyzer_common.erl377
-rw-r--r--lib/dialyzer/test/dialyzer_test_constants.hrl1
-rw-r--r--lib/dialyzer/test/file_utils.erl155
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/dialyzer_options1
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/array3
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/crash7
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/dict15
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/ets3
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/ewgi4
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/gb_sets0
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/inf_loop15
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/int3
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/mixed_opaque2
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/my_digraph0
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/my_queue7
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/opaque2
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/queue11
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/rec6
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/timer4
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/union5
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/wings11
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/array/array_use.erl15
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/crash/crash_1.erl55
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/dict/dict_use.erl82
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/ets/ets_use.erl16
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/ewgi/ewgi.hrl240
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/ewgi/ewgi_api.erl65
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/ewgi/ewgi_testapp.erl46
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/ewgi2/ewgi.hrl241
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/ewgi2/ewgi_api.erl65
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/ewgi2/ewgi_testapp.erl46
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/gb_sets/gb_sets_rec.erl23
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/inf_loop1.erl172
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/int/int_adt.erl33
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/int/int_use.erl11
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/mixed_opaque/mixed_opaque_queue_adt.erl26
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/mixed_opaque/mixed_opaque_rec_adt.erl25
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/mixed_opaque/mixed_opaque_use.erl31
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/my_digraph/my_digraph_adt.erl51
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/my_queue/my_queue_adt.erl23
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/my_queue/my_queue_use.erl35
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_adt.erl9
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug1.erl16
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug2.erl13
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug3.erl19
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug4.erl21
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/queue/queue_use.erl65
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/rec/rec_adt.erl22
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/rec/rec_use.erl30
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/schuett_bug.erl28
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/timer/timer_use.erl20
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/union/union_adt.erl19
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/union/union_use.erl16
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/wings/wings.hrl204
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_dissolve.erl375
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_edge.erl243
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_edge_cmd.erl90
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_face.erl127
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_facemat.erl299
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_intl.hrl15
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_io.erl37
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_sel.erl68
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_shape.erl69
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_util.erl38
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_we.erl250
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis1.erl14
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis2.erl14
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis3.erl14
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis4.erl13
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis5.erl14
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis6.erl14
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/dialyzer_options2
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/my_include/CVS/Entries3
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/my_include/CVS/Repository1
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/my_include/CVS/Root1
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/my_include/erl_bits.hrl43
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/my_include/erl_compile.hrl41
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/results/compiler35
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_asm.erl358
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_block.erl601
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_bool.erl617
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_clean.erl232
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_dict.erl196
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_disasm.erl964
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_flatten.erl137
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_jump.erl477
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_listing.erl117
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_opcodes.erl240
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_opcodes.hrl11
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_type.erl551
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_validator.erl1022
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/cerl.erl4169
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/cerl_clauses.erl409
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/cerl_inline.erl2762
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/cerl_trees.erl801
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/compile.erl1109
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/core_lib.erl509
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/core_lint.erl515
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/core_parse.erl4909
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/core_parse.hrl111
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/core_pp.erl430
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/core_scan.erl495
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/erl_bifs.erl486
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/rec_env.erl611
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/sys_expand_pmod.erl425
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/sys_pre_attributes.erl212
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/sys_pre_expand.erl1026
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_codegen.erl1755
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_core.erl1319
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_kernel.erl1567
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_kernel.hrl77
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_kernel_pp.erl444
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_life.erl448
-rw-r--r--lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_life.hrl24
-rw-r--r--lib/dialyzer/test/options2_SUITE_data/dialyzer_options1
-rw-r--r--lib/dialyzer/test/options2_SUITE_data/results/kernel0
-rw-r--r--lib/dialyzer/test/options2_SUITE_data/src/kernel/global.erl1999
-rw-r--r--lib/dialyzer/test/plt_SUITE.erl21
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/dialyzer_options2
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/results/asn1106
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/results/inets59
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/results/mnesia34
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/Makefile142
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/Restrictions.txt55
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1.app.src20
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1.appup.src162
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1_db.erl160
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1_records.hrl96
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct.erl1904
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_check.erl5566
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_constructed_ber.erl1468
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_constructed_ber_bin_v2.erl1357
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_constructed_per.erl1234
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_gen.erl1664
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_gen_ber.erl1525
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_gen_ber_bin_v2.erl1562
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_gen_per.erl1189
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_gen_per_rt2ct.erl1811
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_name.erl225
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_parser.yrl1162
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_parser2.erl2763
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_pretty_format.erl197
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_tok.erl351
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_value.erl330
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt.erl69
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_ber_bin.erl2310
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_ber_bin_v2.erl1849
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_check.erl333
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_driver_handler.erl108
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_per.erl1593
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_per_bin.erl2176
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_per_bin_rt2ct.erl2102
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_per_v1.erl1827
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/notes_history.sgml97
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/asn1/notes_latest.sgml97
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/Makefile178
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/ftp.erl1582
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/http.erl260
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/http.hrl127
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/http_lib.erl745
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/httpc_handler.erl724
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/httpc_manager.erl542
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd.erl594
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd.hrl77
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_acceptor.erl174
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_acceptor_sup.erl116
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_conf.erl688
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_example.erl134
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_manager.erl1029
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_misc_sup.erl113
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_parse.erl344
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_request_handler.erl994
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_response.erl437
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_socket.erl381
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_sup.erl202
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_util.erl773
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_verbosity.erl93
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_verbosity.hrl62
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/inets.app.src56
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/inets.appup.src133
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/inets.config2
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/inets_sup.erl158
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/jnets_httpd.hrl138
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_actions.erl92
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_alias.erl175
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth.erl748
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth.hrl26
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth_dets.erl222
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth_mnesia.erl269
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth_plain.erl338
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth_server.erl422
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_browser.erl213
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_cgi.erl692
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_dir.erl266
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_disk_log.erl404
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_esi.erl481
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_get.erl151
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_head.erl89
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_htaccess.erl1136
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_include.erl722
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_log.erl250
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_range.erl380
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_responsecontrol.erl320
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_security.erl307
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_security_server.erl727
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_trace.erl64
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/inets/uri.erl349
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/Makefile136
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia.app.src50
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia.appup.src6
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia.erl2191
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia.hrl117
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_backup.erl194
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_bup.erl1168
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_checkpoint.erl1283
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_checkpoint_sup.erl39
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_controller.erl2010
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_dumper.erl1092
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_event.erl260
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_frag.erl1201
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_frag_hash.erl118
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_frag_old_hash.erl127
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_index.erl379
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_kernel_sup.erl60
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_late_loader.erl95
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_lib.erl1276
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_loader.erl805
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_locker.erl1021
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_log.erl1019
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_monitor.erl776
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_recover.erl1174
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_registry.erl276
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_schema.erl2898
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_snmp_hook.erl271
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_snmp_sup.erl39
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_sp.erl35
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_subscr.erl491
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_sup.erl136
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_text.erl189
-rw-r--r--lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_tm.erl2173
-rw-r--r--lib/dialyzer/test/race_SUITE_data/dialyzer_options1
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_args12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_args22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_args30
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_args42
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_args52
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_args62
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_args72
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_args82
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow23
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow33
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow43
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow55
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race32
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race42
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race52
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race62
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_double14
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_double24
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_funs12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_funs22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_new0
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_param5
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_public2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/extract_translations5
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/mnesia_diff_atoms_race12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/mnesia_diff_atoms_race22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_one_write_two2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_two_write_one2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double32
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double42
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_one2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_two2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow23
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow32
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow43
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow52
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow62
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_atoms_no_race0
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_atoms_race2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions13
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_nested2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_pathsens2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_twice3
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_nested2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_pathsens2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_twice3
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions32
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions3_nested2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions3_pathsens2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions42
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions52
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions62
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules1_pathsens2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules1_rec2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules2_pathsens2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules2_rec2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules32
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules_nested2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules_twice3
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_vars_no_race0
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_vars_race2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module32
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module42
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module52
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module62
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module72
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module82
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_param2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_param_inter_module2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function32
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function42
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function52
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function62
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function72
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function82
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_try_catch3
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars10
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars102
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars110
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars122
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars132
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars142
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars152
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars162
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars172
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars180
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars190
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars200
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars210
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars222
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars32
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars42
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars52
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars62
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars72
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars82
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars92
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_args1.erl17
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_args2.erl17
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_args3.erl17
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_args4.erl17
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_args5.erl17
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_args6.erl17
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_args7.erl17
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_args8.erl16
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow1.erl20
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow2.erl26
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow3.erl31
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow4.erl31
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow5.erl34
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race1.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race2.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race3.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race4.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race5.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race6.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_double1.erl28
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_double2.erl28
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_funs1.erl18
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_funs2.erl18
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_new.erl15
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_param.erl26
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_public.erl23
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/extract_translations.erl293
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/mnesia_diff_atoms_race1.erl33
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/mnesia_diff_atoms_race2.erl37
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_one_write_two.erl20
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_two_write_one.erl20
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double1.erl25
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double2.erl25
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double3.erl25
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double4.erl25
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_one.erl20
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_two.erl20
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow1.erl17
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow2.erl19
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow3.erl25
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow4.erl29
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow5.erl12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow6.erl12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_atoms_no_race.erl23
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_atoms_race.erl34
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_nested.erl23
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_pathsens.erl32
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_twice.erl30
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2.erl25
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_nested.erl20
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_pathsens.erl29
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_twice.erl27
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3.erl11
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3_nested.erl21
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3_pathsens.erl29
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions4.erl32
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions5.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions6.erl29
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1/whereis_diff_modules1.erl16
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1/whereis_diff_modules2.erl11
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_pathsens/whereis_diff_modules1_pathsens.erl26
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_pathsens/whereis_diff_modules2_pathsens.erl12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_rec/whereis_diff_modules1_rec.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_rec/whereis_diff_modules2_rec.erl8
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2/whereis_diff_modules3.erl8
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2/whereis_diff_modules4.erl11
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_pathsens/whereis_diff_modules3_pathsens.erl25
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_pathsens/whereis_diff_modules4_pathsens.erl13
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_rec/whereis_diff_modules3_rec.erl25
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_rec/whereis_diff_modules4_rec.erl8
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules3/whereis_diff_modules5.erl23
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules3/whereis_diff_modules6.erl11
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules1_nested.erl14
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules2_nested.erl11
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules3_nested.erl11
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_twice/whereis_diff_modules1_twice.erl21
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_twice/whereis_diff_modules2_twice.erl11
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_vars_no_race.erl13
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_vars_race.erl19
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module1/whereis_intra_inter_module1.erl19
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module1/whereis_intra_inter_module2.erl11
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module2/whereis_intra_inter_module3.erl16
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module2/whereis_intra_inter_module4.erl14
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module3/whereis_intra_inter_module5.erl19
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module3/whereis_intra_inter_module6.erl14
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module4/whereis_intra_inter_module7.erl11
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module4/whereis_intra_inter_module8.erl13
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module5/whereis_intra_inter_module10.erl16
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module5/whereis_intra_inter_module9.erl11
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module6/whereis_intra_inter_module11.erl27
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module6/whereis_intra_inter_module12.erl14
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module7/whereis_intra_inter_module13.erl19
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module7/whereis_intra_inter_module14.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module8/whereis_intra_inter_module15.erl19
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module8/whereis_intra_inter_module16.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_param.erl16
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_param_inter_module/whereis_param_inter_module1.erl8
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_param_inter_module/whereis_param_inter_module2.erl13
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function1.erl19
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function2.erl24
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function3.erl27
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function4.erl27
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function5.erl21
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function6.erl24
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function7.erl19
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function8.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_try_catch.erl25
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars1.erl17
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars10.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars11.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars12.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars13.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars14.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars15.erl23
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars16.erl23
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars17.erl23
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars18.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars19.erl23
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars2.erl18
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars20.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars21.erl23
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars22.erl27
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars3.erl18
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars4.erl18
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars5.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars6.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars7.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars8.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars9.erl22
-rw-r--r--lib/dialyzer/test/small_SUITE_data/dialyzer_options1
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/andalso_test0
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/app_call3
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/appmon_place0
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/areq2
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/atom_call3
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/atom_widen3
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/blame_contract_range4
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/bs_fail_constr9
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/bs_utf80
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/cerl_hipeify4
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/comm_layer2
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/compare14
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/confusing_record_warning3
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/confusing_warning2
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/contract13
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/contract22
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/contract33
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/contract52
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/eqeq2
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/ets_select0
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/exhaust_case3
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/failing_guard14
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/flatten2
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/fun_app7
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/fun_ref_match2
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/gencall4
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/gs_make0
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/guard_warnings97
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/guards17
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/inf_loop24
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/invalid_specs3
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/letrec10
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/list_match2
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/lzip0
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/make_tuple3
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/minus_minus0
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/mod_info0
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/my_filter0
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/my_sofs3
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/no_match4
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/no_unused_fun0
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/no_unused_fun20
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/non_existing2
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/none_scc_inf_loop5
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/not_bogus_warning3
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/not_guard_crash0
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/or_bug0
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/orelsebug0
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/orelsebug20
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/overloaded13
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/port_info_test6
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/process_info_test0
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/pubsub0
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/receive12
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/record_construct7
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/record_pat2
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/record_send_test2
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/record_test3
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/recursive_types10
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/recursive_types20
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/recursive_types30
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/recursive_types40
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/recursive_types50
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/recursive_types60
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/recursive_types70
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/refine_failing2
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/toth0
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/trec7
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/try10
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/tuple15
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/tuple_set_crash15
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/unsafe_beamcode_bug0
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/unused_cases4
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/unused_clauses3
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/zero_tuple5
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/app_call.erl17
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/appmon_place.erl70
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/areq.erl11
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/atom_call.erl14
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/atom_guard.erl8
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/atom_widen.erl24
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/bin_compr.erl16
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/blame_contract_range.erl16
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/bs_fail_constr.erl15
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/bs_utf8.erl27
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/cerl_hipeify.erl684
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_acceptor.erl119
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_connection.erl206
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_layer.erl83
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_layer.hrl29
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_logger.erl143
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_port.erl240
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_port_sup.erl88
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/compare1.erl21
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/confusing_record_warning.erl19
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/confusing_warning.erl22
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/contract2.erl18
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/contract3.erl33
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/contract5.erl15
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/disj_norm_form.erl23
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/eqeq.erl15
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/ets_select.erl11
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/ets_update_counter.erl25
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/exhaust_case.erl23
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/failing_guard1.erl15
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/false_false.erl32
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/file_open_encoding.erl26
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/flatten.erl18
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/fun_app.erl41
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/fun_ref_match.erl21
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/fun_ref_record.erl17
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/gencall.erl12
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/gs_make.erl260
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/guard_warnings.erl118
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/guards.erl136
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/inf_loop2.erl23
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/invalid_specs/invalid_spec1.erl28
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/invalid_specs/invalid_spec2.erl11
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/letrec1.erl13
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/list_match.erl20
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/lzip.erl8
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/make_tuple.erl5
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/minus_minus.erl8
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/mod_info.erl5
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/my_filter.erl17
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/my_sofs.erl83
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/no_match.erl9
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/no_unused_fun.erl20
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/no_unused_fun2.erl20
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/non_existing.erl13
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/none_scc_inf_loop.erl21
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/not_bogus_warning.erl25
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/not_guard_crash.erl49
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/or_bug.erl24
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/orelsebug.erl16
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/orelsebug2.erl23
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/overloaded1.erl31
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/param_types_crash.erl77
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/port_info_test.erl33
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/process_info_test.erl20
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/pubsub/pubsub_api.erl99
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/pubsub/pubsub_publish.erl49
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/receive1.erl16
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/record_construct.erl21
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/record_pat.erl15
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/record_send_test.erl32
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/record_test.erl22
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/recursive_types1.erl10
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/recursive_types2.erl12
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/recursive_types3.erl15
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/recursive_types4.erl13
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/recursive_types5.erl13
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/recursive_types6.erl17
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/recursive_types7.erl13
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/refine_bug1.erl11
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/refine_failing.erl26
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/toth.erl99
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/trec.erl37
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/try1.erl26
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/tuple1.erl29
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/tuple_set_crash.erl207
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/unsafe_beamcode_bug.erl14
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/unused_cases.erl41
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/unused_clauses.erl18
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/zero_tuple.erl12
-rw-r--r--lib/dialyzer/test/user_SUITE_data/dialyzer_options2
-rw-r--r--lib/dialyzer/test/user_SUITE_data/results/broken_dialyzer0
-rw-r--r--lib/dialyzer/test/user_SUITE_data/results/gcpFlowControl2
-rw-r--r--lib/dialyzer/test/user_SUITE_data/results/qlc_error0
-rw-r--r--lib/dialyzer/test/user_SUITE_data/results/spvcOrig193
-rw-r--r--lib/dialyzer/test/user_SUITE_data/results/wsp_pdu25
-rw-r--r--lib/dialyzer/test/user_SUITE_data/src/broken_dialyzer.erl130
-rw-r--r--lib/dialyzer/test/user_SUITE_data/src/gcp.hrl166
-rw-r--r--lib/dialyzer/test/user_SUITE_data/src/gcpFlowControl.erl397
-rw-r--r--lib/dialyzer/test/user_SUITE_data/src/qlc_error.erl15
-rw-r--r--lib/dialyzer/test/user_SUITE_data/src/spvcOrig.erl3520
-rw-r--r--lib/dialyzer/test/user_SUITE_data/src/wdp.hrl96
-rw-r--r--lib/dialyzer/test/user_SUITE_data/src/wsp.hrl239
-rw-r--r--lib/dialyzer/test/user_SUITE_data/src/wsp_pdu.erl5423
-rw-r--r--lib/dialyzer/vsn.mk2
-rw-r--r--lib/docbuilder/doc/src/character_entities.xml4
-rw-r--r--lib/docbuilder/doc/src/docb_gen.xml2
-rw-r--r--lib/docbuilder/doc/src/docb_transform.xml2
-rw-r--r--lib/docbuilder/doc/src/docb_xml_check.xml2
-rw-r--r--lib/docbuilder/doc/src/docbuilder_app.xml2
-rw-r--r--lib/docbuilder/doc/src/inline_tags.xml7
-rw-r--r--lib/docbuilder/test/Makefile4
-rw-r--r--lib/docbuilder/test/docb.cover2
-rw-r--r--lib/docbuilder/test/docb_SUITE.erl25
-rw-r--r--lib/edoc/doc/overview.edoc103
-rw-r--r--lib/edoc/doc/src/Makefile2
-rw-r--r--lib/edoc/doc/src/notes.xml55
-rw-r--r--lib/edoc/doc/src/ref_man.xml2
-rw-r--r--lib/edoc/src/Makefile3
-rw-r--r--lib/edoc/src/edoc.app.src1
-rw-r--r--lib/edoc/src/edoc.erl34
-rw-r--r--lib/edoc/src/edoc.hrl11
-rw-r--r--lib/edoc/src/edoc_data.erl16
-rw-r--r--lib/edoc/src/edoc_doclet.erl4
-rw-r--r--lib/edoc/src/edoc_extract.erl154
-rw-r--r--lib/edoc/src/edoc_layout.erl395
-rw-r--r--lib/edoc/src/edoc_lib.erl44
-rw-r--r--lib/edoc/src/edoc_parser.yrl106
-rw-r--r--lib/edoc/src/edoc_refs.erl2
-rw-r--r--lib/edoc/src/edoc_scanner.erl22
-rw-r--r--lib/edoc/src/edoc_specs.erl603
-rw-r--r--lib/edoc/src/edoc_tags.erl133
-rw-r--r--lib/edoc/src/edoc_types.erl107
-rw-r--r--lib/edoc/src/edoc_types.hrl45
-rw-r--r--lib/edoc/src/edoc_wiki.erl5
-rw-r--r--lib/edoc/test/Makefile4
-rw-r--r--lib/edoc/test/edoc.cover2
-rw-r--r--lib/edoc/test/edoc.spec2
-rw-r--r--lib/edoc/test/edoc_SUITE.erl25
-rw-r--r--lib/edoc/vsn.mk2
-rw-r--r--lib/erl_docgen/doc/src/notes.xml27
-rwxr-xr-xlib/erl_docgen/priv/bin/xref_mod_app.escript4
-rw-r--r--lib/erl_docgen/priv/xsl/db_eix.xsl2
-rw-r--r--lib/erl_docgen/priv/xsl/db_html.xsl8
-rw-r--r--lib/erl_docgen/priv/xsl/db_pdf.xsl20
-rw-r--r--lib/erl_docgen/vsn.mk3
-rw-r--r--lib/erl_interface/doc/src/ei.xml2
-rw-r--r--lib/erl_interface/doc/src/notes.xml43
-rw-r--r--lib/erl_interface/include/ei.h29
-rw-r--r--lib/erl_interface/src/connect/ei_connect.c8
-rw-r--r--lib/erl_interface/src/connect/ei_resolve.c2
-rw-r--r--lib/erl_interface/src/connect/eirecv.c6
-rw-r--r--lib/erl_interface/src/connect/send.c2
-rw-r--r--lib/erl_interface/src/connect/send_exit.c2
-rw-r--r--lib/erl_interface/src/connect/send_reg.c2
-rw-r--r--lib/erl_interface/src/decode/decode_atom.c4
-rw-r--r--lib/erl_interface/src/decode/decode_big.c2
-rw-r--r--lib/erl_interface/src/decode/decode_pid.c4
-rw-r--r--lib/erl_interface/src/decode/decode_port.c4
-rw-r--r--lib/erl_interface/src/decode/decode_ref.c5
-rw-r--r--lib/erl_interface/src/epmd/epmd_unpublish.c2
-rw-r--r--lib/erl_interface/src/legacy/erl_connect.c14
-rw-r--r--lib/erl_interface/src/legacy/erl_format.c4
-rw-r--r--lib/erl_interface/src/legacy/erl_marshal.c19
-rw-r--r--lib/erl_interface/src/legacy/erl_timeout.c5
-rw-r--r--lib/erl_interface/src/legacy/global_register.c14
-rw-r--r--lib/erl_interface/src/legacy/global_unregister.c14
-rw-r--r--lib/erl_interface/src/misc/ei_decode_term.c7
-rw-r--r--lib/erl_interface/src/misc/ei_format.c20
-rw-r--r--lib/erl_interface/src/misc/ei_portio.c2
-rw-r--r--lib/erl_interface/src/misc/show_msg.c9
-rw-r--r--lib/erl_interface/src/prog/erl_call.c2
-rw-r--r--lib/erl_interface/src/registry/reg_dump.c2
-rw-r--r--lib/erl_interface/src/registry/reg_restore.c2
-rw-r--r--lib/erl_interface/test/Makefile13
-rw-r--r--lib/erl_interface/test/ei_accept_SUITE.erl31
-rw-r--r--lib/erl_interface/test/ei_connect_SUITE.erl73
-rw-r--r--lib/erl_interface/test/ei_connect_SUITE_data/ei_connect_test.c25
-rw-r--r--lib/erl_interface/test/ei_decode_SUITE.erl40
-rw-r--r--lib/erl_interface/test/ei_decode_encode_SUITE.erl31
-rw-r--r--lib/erl_interface/test/ei_encode_SUITE.erl40
-rw-r--r--lib/erl_interface/test/ei_format_SUITE.erl44
-rw-r--r--lib/erl_interface/test/ei_format_SUITE_data/ei_format_test.c4
-rw-r--r--lib/erl_interface/test/ei_print_SUITE.erl29
-rw-r--r--lib/erl_interface/test/ei_tmo_SUITE.erl33
-rw-r--r--lib/erl_interface/test/erl_connect_SUITE.erl32
-rw-r--r--lib/erl_interface/test/erl_eterm_SUITE.erl72
-rw-r--r--lib/erl_interface/test/erl_ext_SUITE.erl45
-rw-r--r--lib/erl_interface/test/erl_ext_SUITE_data/ext_test.c14
-rw-r--r--lib/erl_interface/test/erl_format_SUITE.erl28
-rw-r--r--lib/erl_interface/test/erl_global_SUITE.erl142
-rw-r--r--lib/erl_interface/test/erl_global_SUITE_data/Makefile.first21
-rw-r--r--lib/erl_interface/test/erl_global_SUITE_data/Makefile.src41
-rw-r--r--lib/erl_interface/test/erl_global_SUITE_data/erl_global_test.c263
-rw-r--r--lib/erl_interface/test/erl_interface.cover2
-rw-r--r--lib/erl_interface/test/erl_interface.spec3
-rw-r--r--lib/erl_interface/test/erl_match_SUITE.erl31
-rw-r--r--lib/erl_interface/test/port_call_SUITE.erl30
-rw-r--r--lib/erl_interface/test/runner.erl2
-rw-r--r--lib/erl_interface/vsn.mk2
-rw-r--r--lib/et/doc/src/et_tutorial.xmlsrc2
-rw-r--r--lib/et/src/et_wx_contents_viewer.erl6
-rw-r--r--lib/et/src/et_wx_viewer.erl6
-rw-r--r--lib/et/test/Makefile6
-rw-r--r--lib/et/test/et.cover2
-rw-r--r--lib/et/test/et.spec3
-rw-r--r--lib/et/test/et_test_lib.erl8
-rw-r--r--lib/et/test/et_wx_SUITE.erl29
-rw-r--r--lib/eunit/doc/src/book.xml2
-rw-r--r--lib/eunit/doc/src/notes.xml2
-rw-r--r--lib/eunit/doc/src/part.xml2
-rw-r--r--lib/eunit/doc/src/part_notes.xml2
-rw-r--r--lib/eunit/doc/src/ref_man.xml2
-rw-r--r--lib/eunit/src/eunit.erl10
-rw-r--r--lib/eunit/src/eunit_lib.erl18
-rw-r--r--lib/eunit/src/eunit_surefire.erl18
-rw-r--r--lib/eunit/test/Makefile2
-rw-r--r--lib/eunit/test/eunit.cover4
-rw-r--r--lib/eunit/test/eunit.dynspec6
-rw-r--r--lib/eunit/test/eunit.spec3
-rw-r--r--lib/eunit/test/eunit_SUITE.erl27
-rw-r--r--lib/hipe/cerl/erl_bif_types.erl244
-rw-r--r--lib/hipe/cerl/erl_types.erl177
-rw-r--r--lib/hipe/doc/src/notes.xml112
-rw-r--r--lib/hipe/doc/src/ref_man.xml2
-rw-r--r--lib/hipe/icode/hipe_beam_to_icode.erl6
-rw-r--r--lib/hipe/icode/hipe_icode_callgraph.erl2
-rw-r--r--lib/hipe/icode/hipe_icode_exceptions.erl2
-rw-r--r--lib/hipe/icode/hipe_icode_primops.erl13
-rw-r--r--lib/hipe/icode/hipe_icode_range.erl364
-rw-r--r--lib/hipe/main/hipe_main.erl6
-rw-r--r--lib/hipe/ppc/hipe_ppc.erl172
-rw-r--r--lib/hipe/ppc/hipe_ppc_assemble.erl76
-rw-r--r--lib/hipe/ppc/hipe_ppc_frame.erl30
-rw-r--r--lib/hipe/ppc/hipe_rtl_to_ppc.erl260
-rw-r--r--lib/hipe/regalloc/hipe_graph_coloring_regalloc.erl2
-rw-r--r--lib/hipe/rtl/hipe_rtl.erl2
-rw-r--r--lib/hipe/rtl/hipe_rtl_arch.erl57
-rw-r--r--lib/hipe/rtl/hipe_rtl_arith.inc2
-rw-r--r--lib/hipe/rtl/hipe_rtl_primops.erl2
-rw-r--r--lib/hipe/rtl/hipe_rtl_ssa_const_prop.erl2
-rw-r--r--lib/hipe/rtl/hipe_tagscheme.erl4
-rw-r--r--lib/hipe/vsn.mk2
-rw-r--r--lib/ic/doc/src/notes.xml20
-rw-r--r--lib/ic/src/ic_forms.erl6
-rw-r--r--lib/ic/src/ic_pragma.erl12
-rw-r--r--lib/ic/src/ic_symtab.erl4
-rw-r--r--lib/ic/src/icforms.hrl3
-rw-r--r--lib/ic/src/icparse.yrl22
-rw-r--r--lib/ic/src/ictype.erl41
-rw-r--r--lib/ic/test/Makefile6
-rw-r--r--lib/ic/test/c_client_erl_server_SUITE.erl51
-rw-r--r--lib/ic/test/c_client_erl_server_SUITE_data/Makefile.src2
-rw-r--r--lib/ic/test/c_client_erl_server_SUITE_data/erl_server.erl2
-rw-r--r--lib/ic/test/c_client_erl_server_SUITE_data/m_i_impl.erl2
-rw-r--r--lib/ic/test/c_client_erl_server_proto_SUITE.erl51
-rw-r--r--lib/ic/test/c_client_erl_server_proto_SUITE_data/Makefile.src2
-rw-r--r--lib/ic/test/c_client_erl_server_proto_SUITE_data/erl_server.erl2
-rw-r--r--lib/ic/test/c_client_erl_server_proto_SUITE_data/m_i_impl.erl2
-rw-r--r--lib/ic/test/c_client_erl_server_proto_SUITE_data/my.c2
-rw-r--r--lib/ic/test/c_client_erl_server_proto_tmo_SUITE.erl53
-rw-r--r--lib/ic/test/c_client_erl_server_proto_tmo_SUITE_data/Makefile.src2
-rw-r--r--lib/ic/test/c_client_erl_server_proto_tmo_SUITE_data/erl_server.erl2
-rw-r--r--lib/ic/test/c_client_erl_server_proto_tmo_SUITE_data/m_i_impl.erl2
-rw-r--r--lib/ic/test/c_client_erl_server_proto_tmo_SUITE_data/my.c2
-rw-r--r--lib/ic/test/erl_client_c_server_SUITE.erl48
-rw-r--r--lib/ic/test/erl_client_c_server_SUITE_data/Makefile.src2
-rw-r--r--lib/ic/test/erl_client_c_server_SUITE_data/c_server.c2
-rw-r--r--lib/ic/test/erl_client_c_server_SUITE_data/callbacks.c2
-rw-r--r--lib/ic/test/erl_client_c_server_proto_SUITE.erl48
-rw-r--r--lib/ic/test/erl_client_c_server_proto_SUITE_data/Makefile.src2
-rw-r--r--lib/ic/test/erl_client_c_server_proto_SUITE_data/c_server.c2
-rw-r--r--lib/ic/test/erl_client_c_server_proto_SUITE_data/callbacks.c2
-rw-r--r--lib/ic/test/erl_client_c_server_proto_SUITE_data/erl_client.erl2
-rw-r--r--lib/ic/test/erl_client_c_server_proto_SUITE_data/my.c2
-rw-r--r--lib/ic/test/ic.cover2
-rw-r--r--lib/ic/test/ic.spec2
-rw-r--r--lib/ic/test/ic_SUITE.erl101
-rw-r--r--lib/ic/test/ic_be_SUITE.erl28
-rw-r--r--lib/ic/test/ic_pp_SUITE.erl107
-rw-r--r--lib/ic/test/ic_pragma_SUITE.erl33
-rw-r--r--lib/ic/test/ic_register_SUITE.erl36
-rw-r--r--lib/ic/test/java_client_erl_server_SUITE.erl42
-rw-r--r--lib/ic/test/java_client_erl_server_SUITE_data/JavaClient.java2
-rw-r--r--lib/ic/test/java_client_erl_server_SUITE_data/Makefile.src2
-rw-r--r--lib/ic/test/java_client_erl_server_SUITE_data/m_i_impl.erl2
-rw-r--r--lib/ic/vsn.mk2
-rw-r--r--lib/inets/doc/src/http_client.xml8
-rw-r--r--lib/inets/doc/src/http_server.xml12
-rw-r--r--lib/inets/doc/src/httpc.xml108
-rw-r--r--lib/inets/doc/src/httpd.xml5
-rw-r--r--lib/inets/doc/src/mod_auth.xml2
-rw-r--r--lib/inets/doc/src/mod_esi.xml19
-rw-r--r--lib/inets/doc/src/notes.xml83
-rw-r--r--lib/inets/include/mod_auth.hrl33
-rw-r--r--lib/inets/src/http_client/httpc.erl2
-rw-r--r--lib/inets/src/http_lib/http_chunk.erl10
-rw-r--r--lib/inets/src/http_server/Makefile5
-rw-r--r--lib/inets/src/http_server/httpd.hrl27
-rw-r--r--lib/inets/src/http_server/mod_auth.hrl26
-rw-r--r--lib/inets/src/inets_app/Makefile11
-rw-r--r--lib/inets/src/inets_app/inets.appup.src14
-rw-r--r--lib/inets/test/Makefile13
-rw-r--r--lib/inets/test/ftp_SUITE.erl105
-rw-r--r--lib/inets/test/ftp_format_SUITE.erl51
-rw-r--r--lib/inets/test/ftp_freebsd_x86_test.erl27
-rw-r--r--lib/inets/test/ftp_linux_ppc_test.erl27
-rw-r--r--lib/inets/test/ftp_linux_x86_test.erl36
-rw-r--r--lib/inets/test/ftp_macosx_ppc_test.erl27
-rw-r--r--lib/inets/test/ftp_macosx_x86_test.erl25
-rw-r--r--lib/inets/test/ftp_netbsd_x86_test.erl27
-rw-r--r--lib/inets/test/ftp_openbsd_x86_test.erl27
-rw-r--r--lib/inets/test/ftp_solaris10_sparc_test.erl27
-rw-r--r--lib/inets/test/ftp_solaris10_x86_test.erl27
-rw-r--r--lib/inets/test/ftp_solaris8_sparc_test.erl27
-rw-r--r--lib/inets/test/ftp_solaris9_sparc_test.erl27
-rw-r--r--lib/inets/test/ftp_suite_lib.erl10
-rw-r--r--lib/inets/test/ftp_ticket_test.erl20
-rw-r--r--lib/inets/test/ftp_windows_2003_server_test.erl27
-rw-r--r--lib/inets/test/ftp_windows_xp_test.erl27
-rw-r--r--lib/inets/test/http_format_SUITE.erl67
-rw-r--r--lib/inets/test/httpc_SUITE.erl138
-rw-r--r--lib/inets/test/httpc_cookie_SUITE.erl45
-rw-r--r--lib/inets/test/httpd_1_1.erl2
-rw-r--r--lib/inets/test/httpd_SUITE.erl329
-rw-r--r--lib/inets/test/httpd_SUITE_data/server_root/conf/httpd.conf2
-rw-r--r--lib/inets/test/httpd_basic_SUITE.erl25
-rw-r--r--lib/inets/test/httpd_load.erl2
-rw-r--r--lib/inets/test/httpd_test_data/server_root/conf/httpd.conf2
-rw-r--r--lib/inets/test/inets.cover2
-rw-r--r--lib/inets/test/inets.spec3
-rw-r--r--lib/inets/test/inets_SUITE.erl43
-rw-r--r--lib/inets/test/inets_app_test.erl39
-rw-r--r--lib/inets/test/inets_appup_test.erl36
-rw-r--r--lib/inets/test/inets_sup_SUITE.erl29
-rw-r--r--lib/inets/test/tftp_SUITE.erl38
-rw-r--r--lib/inets/test/tftp_test_lib.erl6
-rw-r--r--lib/inets/test/tftp_test_lib.hrl2
-rw-r--r--lib/inets/vsn.mk4
-rw-r--r--lib/inviso/doc/src/inviso_as_lib.xml2
-rw-r--r--lib/inviso/doc/src/inviso_lfm.xml2
-rw-r--r--lib/inviso/doc/src/inviso_lfm_tpfreader.xml2
-rw-r--r--lib/inviso/doc/src/inviso_rt.xml2
-rw-r--r--lib/inviso/doc/src/notes.xml2
-rw-r--r--lib/inviso/src/inviso_tool.erl6511
-rw-r--r--lib/inviso/src/inviso_tool_sh.erl3480
-rw-r--r--lib/inviso/test/Makefile4
-rw-r--r--lib/inviso/test/inviso.cover2
-rw-r--r--lib/inviso/test/inviso.spec2
-rw-r--r--lib/inviso/test/inviso_tool_SUITE.erl95
-rw-r--r--lib/jinterface/doc/src/notes.xml16
-rw-r--r--lib/jinterface/java_src/Makefile2
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/AbstractConnection.java7
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/OtpMbox.java2
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/OtpMsg.java3
-rw-r--r--lib/jinterface/test/Makefile7
-rw-r--r--lib/jinterface/test/jinterface.cover2
-rw-r--r--lib/jinterface/test/jinterface.spec (renamed from lib/jinterface/test/jinterface.dynspec)14
-rw-r--r--lib/jinterface/test/jinterface_SUITE.erl48
-rw-r--r--lib/jinterface/test/nc_SUITE.erl48
-rw-r--r--lib/jinterface/vsn.mk2
-rw-r--r--lib/kernel/doc/src/code.xml2
-rw-r--r--lib/kernel/doc/src/disk_log.xml2
-rw-r--r--lib/kernel/doc/src/error_handler.xml2
-rw-r--r--lib/kernel/doc/src/file.xml4
-rw-r--r--lib/kernel/doc/src/gen_tcp.xml1
-rw-r--r--lib/kernel/doc/src/inet.xml2
-rw-r--r--lib/kernel/doc/src/notes.xml59
-rw-r--r--lib/kernel/doc/src/part_notes_history.xml2
-rw-r--r--lib/kernel/doc/src/rpc.xml2
-rw-r--r--lib/kernel/doc/src/user.xml2
-rw-r--r--lib/kernel/src/application.erl6
-rw-r--r--lib/kernel/src/code.erl129
-rw-r--r--lib/kernel/src/disk_log_1.erl8
-rw-r--r--lib/kernel/src/erl_ddll.erl33
-rw-r--r--lib/kernel/src/error_handler.erl6
-rw-r--r--lib/kernel/src/file.erl4
-rw-r--r--lib/kernel/src/global.erl30
-rw-r--r--lib/kernel/src/hipe_unified_loader.erl11
-rw-r--r--lib/kernel/src/inet6_tcp_dist.erl6
-rw-r--r--lib/kernel/src/inet_res.erl203
-rw-r--r--lib/kernel/src/net_kernel.erl35
-rw-r--r--lib/kernel/src/os.erl33
-rw-r--r--lib/kernel/test/Makefile4
-rw-r--r--lib/kernel/test/appinc1.erl2
-rw-r--r--lib/kernel/test/appinc1x.erl2
-rw-r--r--lib/kernel/test/appinc2.erl2
-rw-r--r--lib/kernel/test/appinc2A.erl2
-rw-r--r--lib/kernel/test/appinc2B.erl2
-rw-r--r--lib/kernel/test/appinc2top.erl2
-rw-r--r--lib/kernel/test/application_SUITE.erl53
-rw-r--r--lib/kernel/test/bif_SUITE.erl50
-rw-r--r--lib/kernel/test/ch.erl2
-rw-r--r--lib/kernel/test/ch_sup.erl2
-rw-r--r--lib/kernel/test/cleanup.erl17
-rw-r--r--lib/kernel/test/code_SUITE.erl58
-rw-r--r--lib/kernel/test/code_a_test.erl2
-rw-r--r--lib/kernel/test/code_b_test.erl2
-rw-r--r--lib/kernel/test/disk_log_SUITE.erl127
-rw-r--r--lib/kernel/test/erl_boot_server_SUITE.erl26
-rw-r--r--lib/kernel/test/erl_distribution_SUITE.erl79
-rw-r--r--lib/kernel/test/erl_distribution_wb_SUITE.erl33
-rw-r--r--lib/kernel/test/erl_prim_loader_SUITE.erl50
-rw-r--r--lib/kernel/test/error_logger_SUITE.erl32
-rw-r--r--lib/kernel/test/error_logger_warn_SUITE.erl36
-rw-r--r--lib/kernel/test/file_SUITE.erl114
-rw-r--r--lib/kernel/test/file_name_SUITE.erl43
-rw-r--r--lib/kernel/test/gen_sctp_SUITE.erl48
-rw-r--r--lib/kernel/test/gen_tcp_api_SUITE.erl100
-rw-r--r--lib/kernel/test/gen_tcp_echo_SUITE.erl36
-rw-r--r--lib/kernel/test/gen_tcp_misc_SUITE.erl195
-rw-r--r--lib/kernel/test/gen_udp_SUITE.erl92
-rw-r--r--lib/kernel/test/global_SUITE.erl98
-rw-r--r--lib/kernel/test/global_group_SUITE.erl66
-rw-r--r--lib/kernel/test/heart_SUITE.erl44
-rw-r--r--lib/kernel/test/inet_SUITE.erl132
-rw-r--r--lib/kernel/test/inet_res_SUITE.erl182
-rw-r--r--lib/kernel/test/inet_sockopt_SUITE.erl35
-rw-r--r--lib/kernel/test/init_SUITE.erl108
-rw-r--r--lib/kernel/test/interactive_shell_SUITE.erl30
-rw-r--r--lib/kernel/test/kernel.cover3
-rw-r--r--lib/kernel/test/kernel.dynspec57
-rw-r--r--lib/kernel/test/kernel.spec4
-rw-r--r--lib/kernel/test/kernel.spec.wxworks63
-rw-r--r--lib/kernel/test/kernel_SUITE.erl33
-rw-r--r--lib/kernel/test/kernel_config_SUITE.erl36
-rw-r--r--lib/kernel/test/myApp.erl2
-rw-r--r--lib/kernel/test/os_SUITE.erl46
-rw-r--r--lib/kernel/test/pdict_SUITE.erl31
-rw-r--r--lib/kernel/test/pg2_SUITE.erl39
-rw-r--r--lib/kernel/test/prim_file_SUITE.erl114
-rw-r--r--lib/kernel/test/ram_file_SUITE.erl33
-rw-r--r--lib/kernel/test/rpc_SUITE.erl35
-rw-r--r--lib/kernel/test/seq_trace_SUITE.erl39
-rw-r--r--lib/kernel/test/topApp.erl2
-rw-r--r--lib/kernel/test/topApp2.erl2
-rw-r--r--lib/kernel/test/topApp3.erl2
-rw-r--r--lib/kernel/test/wrap_log_reader_SUITE.erl52
-rw-r--r--lib/kernel/test/zlib_SUITE.erl81
-rw-r--r--lib/kernel/vsn.mk2
-rw-r--r--lib/megaco/Makefile34
-rw-r--r--lib/megaco/doc/src/megaco_flex_scanner.xml2
-rw-r--r--lib/megaco/doc/src/notes.xml86
-rw-r--r--lib/megaco/src/app/megaco.app.src3
-rw-r--r--lib/megaco/src/app/megaco.appup.src50
-rw-r--r--lib/megaco/src/binary/megaco_binary_encoder_lib.erl31
-rw-r--r--lib/megaco/src/engine/depend.mk4
-rw-r--r--lib/megaco/src/engine/megaco_config.erl156
-rw-r--r--lib/megaco/src/engine/megaco_config_misc.erl113
-rw-r--r--lib/megaco/src/engine/megaco_filter.erl33
-rw-r--r--lib/megaco/src/engine/megaco_sdp.erl6
-rw-r--r--lib/megaco/src/engine/megaco_timer.erl14
-rw-r--r--lib/megaco/src/engine/modules.mk3
-rw-r--r--lib/megaco/src/flex/megaco_flex_scanner.erl18
-rw-r--r--lib/megaco/test/Makefile2
-rw-r--r--lib/megaco/test/megaco.cover4
-rw-r--r--lib/megaco/test/megaco.spec7
-rw-r--r--lib/megaco/test/megaco_SUITE.erl137
-rw-r--r--lib/megaco/test/megaco_actions_test.erl33
-rw-r--r--lib/megaco/test/megaco_app_test.erl48
-rw-r--r--lib/megaco/test/megaco_appup_mg.erl2
-rw-r--r--lib/megaco/test/megaco_appup_mgc.erl2
-rw-r--r--lib/megaco/test/megaco_appup_test.erl37
-rw-r--r--lib/megaco/test/megaco_binary_term_id_test.erl39
-rw-r--r--lib/megaco/test/megaco_call_flow_test.erl38
-rw-r--r--lib/megaco/test/megaco_codec_flex_lib.erl2
-rw-r--r--lib/megaco/test/megaco_codec_mini_test.erl82
-rw-r--r--lib/megaco/test/megaco_codec_prev3a_test.erl469
-rw-r--r--lib/megaco/test/megaco_codec_prev3b_test.erl481
-rw-r--r--lib/megaco/test/megaco_codec_prev3c_test.erl485
-rw-r--r--lib/megaco/test/megaco_codec_test.erl39
-rw-r--r--lib/megaco/test/megaco_codec_test_lib.erl2
-rw-r--r--lib/megaco/test/megaco_codec_v1_test.erl508
-rw-r--r--lib/megaco/test/megaco_codec_v2_test.erl484
-rw-r--r--lib/megaco/test/megaco_codec_v3_test.erl478
-rw-r--r--lib/megaco/test/megaco_config_test.erl38
-rw-r--r--lib/megaco/test/megaco_digit_map_test.erl67
-rw-r--r--lib/megaco/test/megaco_examples_test.erl25
-rw-r--r--lib/megaco/test/megaco_flex_test.erl45
-rw-r--r--lib/megaco/test/megaco_load_test.erl35
-rw-r--r--lib/megaco/test/megaco_mess_otp8212_test.erl2
-rw-r--r--lib/megaco/test/megaco_mess_test.erl129
-rw-r--r--lib/megaco/test/megaco_mess_user_test.erl2
-rw-r--r--lib/megaco/test/megaco_mib_test.erl26
-rw-r--r--lib/megaco/test/megaco_mreq_test.erl26
-rw-r--r--lib/megaco/test/megaco_pending_limit_test.erl60
-rw-r--r--lib/megaco/test/megaco_profile.erl2
-rw-r--r--lib/megaco/test/megaco_sdp_test.erl32
-rw-r--r--lib/megaco/test/megaco_segment_test.erl70
-rw-r--r--lib/megaco/test/megaco_tc_controller.erl2
-rw-r--r--lib/megaco/test/megaco_tcp_test.erl62
-rw-r--r--lib/megaco/test/megaco_test_deliver.erl2
-rw-r--r--lib/megaco/test/megaco_test_generator.erl6
-rw-r--r--lib/megaco/test/megaco_test_generator_lib.erl2
-rw-r--r--lib/megaco/test/megaco_test_generic_transport.erl2
-rw-r--r--lib/megaco/test/megaco_test_lib.erl244
-rw-r--r--lib/megaco/test/megaco_test_megaco_generator.erl4
-rw-r--r--lib/megaco/test/megaco_test_mg.erl2
-rw-r--r--lib/megaco/test/megaco_test_mgc.erl2
-rw-r--r--lib/megaco/test/megaco_test_msg_prev3a_lib.erl6
-rw-r--r--lib/megaco/test/megaco_test_msg_prev3b_lib.erl6
-rw-r--r--lib/megaco/test/megaco_test_msg_prev3c_lib.erl6
-rw-r--r--lib/megaco/test/megaco_test_msg_v1_lib.erl6
-rw-r--r--lib/megaco/test/megaco_test_msg_v2_lib.erl6
-rw-r--r--lib/megaco/test/megaco_test_msg_v3_lib.erl6
-rw-r--r--lib/megaco/test/megaco_test_tcp_generator.erl4
-rw-r--r--lib/megaco/test/megaco_timer_test.erl65
-rw-r--r--lib/megaco/test/megaco_trans_test.erl107
-rw-r--r--lib/megaco/test/megaco_udp_test.erl53
-rw-r--r--lib/megaco/vsn.mk25
-rw-r--r--lib/mnesia/doc/src/Mnesia_chap2.xmlsrc2
-rw-r--r--lib/mnesia/doc/src/Mnesia_chap3.xml2
-rw-r--r--lib/mnesia/doc/src/Mnesia_chap4.xmlsrc2
-rw-r--r--lib/mnesia/doc/src/mnesia_frag_hash.xml2
-rw-r--r--lib/mnesia/doc/src/mnesia_registry.xml2
-rw-r--r--lib/mnesia/doc/src/notes.xml66
-rw-r--r--lib/mnesia/doc/src/part_notes_history.xml2
-rw-r--r--lib/mnesia/src/mnesia.appup.src32
-rw-r--r--lib/mnesia/src/mnesia.erl9
-rw-r--r--lib/mnesia/src/mnesia_bup.erl7
-rw-r--r--lib/mnesia/src/mnesia_controller.erl83
-rw-r--r--lib/mnesia/src/mnesia_frag.erl28
-rw-r--r--lib/mnesia/src/mnesia_index.erl2
-rw-r--r--lib/mnesia/src/mnesia_lib.erl4
-rw-r--r--lib/mnesia/src/mnesia_locker.erl3
-rw-r--r--lib/mnesia/src/mnesia_log.erl2
-rw-r--r--lib/mnesia/src/mnesia_recover.erl2
-rw-r--r--lib/mnesia/src/mnesia_schema.erl9
-rw-r--r--lib/mnesia/src/mnesia_snmp_hook.erl2
-rw-r--r--lib/mnesia/src/mnesia_tm.erl4
-rw-r--r--lib/mnesia/test/Makefile6
-rw-r--r--lib/mnesia/test/mnesia.cover2
-rw-r--r--lib/mnesia/test/mnesia.spec99
-rw-r--r--lib/mnesia/test/mnesia_SUITE.erl261
-rw-r--r--lib/mnesia/test/mnesia_atomicity_test.erl131
-rw-r--r--lib/mnesia/test/mnesia_config_backup.erl2
-rw-r--r--lib/mnesia/test/mnesia_config_event.erl2
-rw-r--r--lib/mnesia/test/mnesia_config_test.erl116
-rw-r--r--lib/mnesia/test/mnesia_consistency_test.erl322
-rw-r--r--lib/mnesia/test/mnesia_cost.erl2
-rw-r--r--lib/mnesia/test/mnesia_dirty_access_test.erl167
-rw-r--r--lib/mnesia/test/mnesia_durability_test.erl103
-rw-r--r--lib/mnesia/test/mnesia_evil_backup.erl52
-rw-r--r--lib/mnesia/test/mnesia_evil_coverage_test.erl144
-rw-r--r--lib/mnesia/test/mnesia_examples_test.erl42
-rw-r--r--lib/mnesia/test/mnesia_frag_test.erl60
-rw-r--r--lib/mnesia/test/mnesia_inconsistent_database_test.erl2
-rw-r--r--lib/mnesia/test/mnesia_install_test.erl49
-rw-r--r--lib/mnesia/test/mnesia_isolation_test.erl152
-rw-r--r--lib/mnesia/test/mnesia_measure_test.erl149
-rw-r--r--lib/mnesia/test/mnesia_nice_coverage_test.erl22
-rw-r--r--lib/mnesia/test/mnesia_qlc_test.erl48
-rw-r--r--lib/mnesia/test/mnesia_recovery_test.erl245
-rw-r--r--lib/mnesia/test/mnesia_registry_test.erl23
-rw-r--r--lib/mnesia/test/mnesia_schema_recovery_test.erl166
-rw-r--r--lib/mnesia/test/mnesia_test_lib.erl10
-rw-r--r--lib/mnesia/test/mnesia_test_lib.hrl2
-rw-r--r--lib/mnesia/test/mnesia_tpcb.erl2
-rw-r--r--lib/mnesia/test/mnesia_trans_access_test.erl97
-rw-r--r--lib/mnesia/vsn.mk2
-rw-r--r--lib/observer/doc/src/crashdump.xml6
-rw-r--r--lib/observer/doc/src/crashdump_help.html4
-rw-r--r--lib/observer/doc/src/crashdump_ug.xml44
-rw-r--r--lib/observer/doc/src/etop.xml43
-rw-r--r--lib/observer/doc/src/notes.xml40
-rw-r--r--lib/observer/doc/src/notes_history.xml2
-rw-r--r--lib/observer/doc/src/observer_app.xml2
-rw-r--r--lib/observer/doc/src/part_notes_history.xml2
-rw-r--r--lib/observer/doc/src/ttb.xml2
-rwxr-xr-xlib/observer/priv/bin/cdv4
-rw-r--r--lib/observer/priv/bin/cdv.bat2
-rw-r--r--lib/observer/src/Makefile6
-rw-r--r--lib/observer/src/crashdump_viewer.erl1111
-rw-r--r--lib/observer/src/crashdump_viewer.hrl185
-rw-r--r--lib/observer/src/crashdump_viewer_html.erl601
-rw-r--r--lib/observer/test/Makefile4
-rw-r--r--lib/observer/test/crashdump_helper.erl2
-rw-r--r--lib/observer/test/crashdump_viewer_SUITE.erl86
-rw-r--r--lib/observer/test/etop_SUITE.erl32
-rw-r--r--lib/observer/test/observer.cover6
-rw-r--r--lib/observer/test/observer.spec3
-rw-r--r--lib/observer/test/observer_SUITE.erl27
-rw-r--r--lib/observer/test/ttb_SUITE.erl39
-rw-r--r--lib/observer/vsn.mk2
-rw-r--r--lib/odbc/c_src/odbcserver.c4
-rw-r--r--lib/odbc/doc/src/notes.xml17
-rw-r--r--lib/odbc/src/odbc.appup.src4
-rw-r--r--lib/odbc/test/Makefile8
-rw-r--r--lib/odbc/test/odbc.cover2
-rw-r--r--lib/odbc/test/odbc.spec34
-rw-r--r--lib/odbc/test/odbc_connect_SUITE.erl45
-rw-r--r--lib/odbc/test/odbc_data_type_SUITE.erl83
-rw-r--r--lib/odbc/test/odbc_query_SUITE.erl80
-rw-r--r--lib/odbc/test/odbc_start_SUITE.erl24
-rw-r--r--lib/odbc/test/odbc_test_lib.erl2
-rw-r--r--lib/odbc/vsn.mk2
-rw-r--r--lib/orber/doc/src/CosNaming_BindingIterator.xml2
-rw-r--r--lib/orber/doc/src/CosNaming_NamingContextExt.xml2
-rw-r--r--lib/orber/doc/src/Module_Interface.xml2
-rw-r--r--lib/orber/doc/src/any.xml2
-rw-r--r--lib/orber/doc/src/ch_idl_to_erlang_mapping.xml37
-rw-r--r--lib/orber/doc/src/corba_object.xml2
-rw-r--r--lib/orber/doc/src/fixed.xml2
-rw-r--r--lib/orber/doc/src/intro_part.xml2
-rw-r--r--lib/orber/doc/src/notes.xml48
-rw-r--r--lib/orber/doc/src/orber_acl.xml2
-rw-r--r--lib/orber/doc/src/orber_tc.xml2
-rw-r--r--lib/orber/doc/src/tools_debugging_part.xml2
-rw-r--r--lib/orber/include/ifr_types.hrl6
-rw-r--r--lib/orber/src/cdr_decode.erl78
-rw-r--r--lib/orber/src/cdr_encode.erl30
-rw-r--r--lib/orber/src/corba.erl6
-rw-r--r--lib/orber/src/orber.app.src2
-rw-r--r--lib/orber/src/orber.erl18
-rw-r--r--lib/orber/src/orber_socket.erl28
-rw-r--r--lib/orber/test/Makefile13
-rw-r--r--lib/orber/test/cdrcoding_10_SUITE.erl45
-rw-r--r--lib/orber/test/cdrcoding_11_SUITE.erl45
-rw-r--r--lib/orber/test/cdrcoding_12_SUITE.erl45
-rw-r--r--lib/orber/test/cdrlib_SUITE.erl35
-rw-r--r--lib/orber/test/corba_SUITE.erl47
-rw-r--r--lib/orber/test/csiv2_SUITE.erl85
-rw-r--r--lib/orber/test/data_types_SUITE.erl31
-rw-r--r--lib/orber/test/generated_SUITE.erl50
-rw-r--r--lib/orber/test/iiop_module_do_test_impl.erl2
-rw-r--r--lib/orber/test/iiop_module_test_impl.erl2
-rw-r--r--lib/orber/test/iiop_test_impl.erl2
-rw-r--r--lib/orber/test/interceptors_SUITE.erl30
-rw-r--r--lib/orber/test/iop_ior_10_SUITE.erl30
-rw-r--r--lib/orber/test/iop_ior_11_SUITE.erl30
-rw-r--r--lib/orber/test/iop_ior_12_SUITE.erl30
-rw-r--r--lib/orber/test/lname_SUITE.erl30
-rw-r--r--lib/orber/test/multi_ORB_SUITE.erl324
-rw-r--r--lib/orber/test/naming_context_SUITE.erl35
-rw-r--r--lib/orber/test/orber.cover2
-rw-r--r--lib/orber/test/orber.spec20
-rw-r--r--lib/orber/test/orber_SUITE.erl37
-rw-r--r--lib/orber/test/orber_acl_SUITE.erl27
-rw-r--r--lib/orber/test/orber_firewall_ipv4_in_SUITE.erl40
-rw-r--r--lib/orber/test/orber_firewall_ipv4_out_SUITE.erl35
-rw-r--r--lib/orber/test/orber_firewall_ipv6_in_SUITE.erl41
-rw-r--r--lib/orber/test/orber_firewall_ipv6_out_SUITE.erl35
-rw-r--r--lib/orber/test/orber_nat_SUITE.erl255
-rw-r--r--lib/orber/test/orber_test_lib.erl60
-rw-r--r--lib/orber/test/orber_test_server.idl25
-rw-r--r--lib/orber/test/orber_test_server_impl.erl15
-rw-r--r--lib/orber/test/orber_test_timeout_server_impl.erl2
-rw-r--r--lib/orber/test/orber_web_SUITE.erl36
-rw-r--r--lib/orber/test/tc_SUITE.erl45
-rw-r--r--lib/orber/vsn.mk4
-rw-r--r--lib/os_mon/src/disksup.erl4
-rw-r--r--lib/os_mon/src/memsup.erl10
-rw-r--r--lib/os_mon/test/Makefile4
-rw-r--r--lib/os_mon/test/cpu_sup_SUITE.erl40
-rw-r--r--lib/os_mon/test/disksup_SUITE.erl40
-rw-r--r--lib/os_mon/test/memsup_SUITE.erl29
-rw-r--r--lib/os_mon/test/os_mon.cover2
-rw-r--r--lib/os_mon/test/os_mon.spec2
-rw-r--r--lib/os_mon/test/os_mon_SUITE.erl33
-rw-r--r--lib/os_mon/test/os_mon_mib_SUITE.erl64
-rw-r--r--lib/os_mon/test/os_sup_SUITE.erl31
-rw-r--r--lib/parsetools/test/Makefile6
-rw-r--r--lib/parsetools/test/leex_SUITE.erl44
-rw-r--r--lib/parsetools/test/parsetools.cover2
-rw-r--r--lib/parsetools/test/parsetools.spec2
-rw-r--r--lib/parsetools/test/yecc_SUITE.erl67
-rw-r--r--lib/percept/doc/src/book.xml2
-rw-r--r--lib/percept/doc/src/egd_ug.xmlsrc2
-rw-r--r--lib/percept/doc/src/notes.xml17
-rw-r--r--lib/percept/doc/src/part.xml2
-rwxr-xr-xlib/percept/doc/src/part_notes.xml2
-rw-r--r--lib/percept/doc/src/percept_ug.xmlsrc2
-rw-r--r--lib/percept/doc/src/ref_man.xml2
-rw-r--r--lib/percept/src/egd.erl3
-rw-r--r--lib/percept/src/percept.erl32
-rw-r--r--lib/percept/src/percept_db.erl49
-rw-r--r--lib/percept/test/Makefile6
-rw-r--r--lib/percept/test/egd_SUITE.erl32
-rw-r--r--lib/percept/test/percept.cover2
-rw-r--r--lib/percept/test/percept.spec3
-rw-r--r--lib/percept/test/percept_SUITE.erl30
-rw-r--r--lib/percept/test/percept_db_SUITE.erl76
-rw-r--r--lib/percept/vsn.mk2
-rw-r--r--lib/pman/doc/src/pman.xml2
-rw-r--r--lib/public_key/doc/src/book.xml2
-rw-r--r--lib/public_key/doc/src/cert_records.xml2
-rw-r--r--lib/public_key/doc/src/introduction.xml2
-rw-r--r--lib/public_key/doc/src/notes.xml19
-rw-r--r--lib/public_key/doc/src/part.xml2
-rw-r--r--lib/public_key/doc/src/part_notes.xml2
-rw-r--r--lib/public_key/doc/src/public_key.xml119
-rw-r--r--lib/public_key/doc/src/public_key_records.xml2
-rw-r--r--lib/public_key/doc/src/ref_man.xml2
-rw-r--r--lib/public_key/include/public_key.hrl19
-rw-r--r--lib/public_key/src/Makefile3
-rw-r--r--lib/public_key/src/pubkey_cert.erl6
-rw-r--r--lib/public_key/src/pubkey_cert_records.erl20
-rw-r--r--lib/public_key/src/pubkey_pem.erl57
-rw-r--r--lib/public_key/src/pubkey_ssh.erl431
-rw-r--r--lib/public_key/src/public_key.app.src6
-rw-r--r--lib/public_key/src/public_key.appup.src46
-rw-r--r--lib/public_key/src/public_key.erl112
-rw-r--r--lib/public_key/test/Makefile2
-rw-r--r--lib/public_key/test/pkits_SUITE.erl1498
-rw-r--r--lib/public_key/test/public_key.cover4
-rw-r--r--lib/public_key/test/public_key.spec3
-rw-r--r--lib/public_key/test/public_key_SUITE.erl470
-rw-r--r--lib/public_key/test/public_key_SUITE_data/auth_keys3
-rw-r--r--lib/public_key/test/public_key_SUITE_data/dsa_pub.pem12
-rw-r--r--lib/public_key/test/public_key_SUITE_data/known_hosts3
-rw-r--r--lib/public_key/test/public_key_SUITE_data/openssh_dsa_pub1
-rw-r--r--lib/public_key/test/public_key_SUITE_data/openssh_dsa_with_comment_pub3
-rw-r--r--lib/public_key/test/public_key_SUITE_data/openssh_rsa_pub1
-rw-r--r--lib/public_key/test/public_key_SUITE_data/rsa_pub.pem4
-rw-r--r--lib/public_key/test/public_key_SUITE_data/rsa_pub_key.pem4
-rw-r--r--lib/public_key/test/public_key_SUITE_data/ssh1_auth_keys3
-rw-r--r--lib/public_key/test/public_key_SUITE_data/ssh1_known_hosts2
-rw-r--r--lib/public_key/test/public_key_SUITE_data/ssh2_dsa_comment_pub13
-rw-r--r--lib/public_key/test/public_key_SUITE_data/ssh2_dsa_pub12
-rw-r--r--lib/public_key/test/public_key_SUITE_data/ssh2_rsa_comment_pub7
-rw-r--r--lib/public_key/test/public_key_SUITE_data/ssh2_rsa_pub13
-rw-r--r--lib/public_key/test/public_key_SUITE_data/ssh2_subject_pub8
-rw-r--r--lib/public_key/test/public_key_SUITE_data/ssh_rsa_long_comment_pub9
-rw-r--r--lib/public_key/test/public_key_SUITE_data/ssh_rsa_long_header_pub9
-rw-r--r--lib/public_key/vsn.mk2
-rw-r--r--lib/reltool/doc/src/notes.xml26
-rw-r--r--lib/reltool/doc/src/reltool.xml2
-rw-r--r--lib/reltool/doc/src/reltool_examples.xml2
-rw-r--r--lib/reltool/doc/src/reltool_usage.xml2
-rw-r--r--lib/reltool/src/reltool.app.src4
-rw-r--r--lib/reltool/src/reltool.erl45
-rw-r--r--lib/reltool/src/reltool.hrl100
-rw-r--r--lib/reltool/src/reltool_mod_win.erl4
-rw-r--r--lib/reltool/src/reltool_server.erl113
-rw-r--r--lib/reltool/src/reltool_target.erl27
-rw-r--r--lib/reltool/test/Makefile6
-rw-r--r--lib/reltool/test/reltool.cover2
-rw-r--r--lib/reltool/test/reltool.spec3
-rw-r--r--lib/reltool/test/reltool_app_SUITE.erl47
-rw-r--r--lib/reltool/test/reltool_server_SUITE.erl70
-rw-r--r--lib/reltool/test/reltool_test_lib.erl8
-rw-r--r--lib/reltool/test/reltool_wx_SUITE.erl29
-rw-r--r--lib/reltool/test/rtt.erl2
-rw-r--r--lib/reltool/vsn.mk2
-rw-r--r--lib/runtime_tools/c_src/trace_file_drv.c2
-rw-r--r--lib/runtime_tools/doc/src/notes.xml17
-rw-r--r--lib/runtime_tools/doc/src/notes_history.xml2
-rw-r--r--lib/runtime_tools/doc/src/part_notes_history.xml2
-rw-r--r--lib/runtime_tools/doc/src/runtime_tools_app.xml2
-rw-r--r--lib/runtime_tools/src/inviso_rt.erl70
-rw-r--r--lib/runtime_tools/test/Makefile4
-rw-r--r--lib/runtime_tools/test/dbg_SUITE.erl39
-rw-r--r--lib/runtime_tools/test/erts_alloc_config_SUITE.erl32
-rw-r--r--lib/runtime_tools/test/inviso_SUITE.erl77
-rw-r--r--lib/runtime_tools/test/runtime_tools.cover4
-rw-r--r--lib/runtime_tools/test/runtime_tools.spec2
-rw-r--r--lib/runtime_tools/test/runtime_tools_SUITE.erl27
-rw-r--r--lib/runtime_tools/vsn.mk2
-rw-r--r--lib/sasl/doc/src/alarm_handler.xml2
-rw-r--r--lib/sasl/doc/src/appup.xml12
-rw-r--r--lib/sasl/doc/src/notes.xml33
-rw-r--r--lib/sasl/doc/src/part_notes_history.xml2
-rw-r--r--lib/sasl/doc/src/rel.xml2
-rw-r--r--lib/sasl/doc/src/relup.xml2
-rw-r--r--lib/sasl/doc/src/sasl_app.xml7
-rw-r--r--lib/sasl/doc/src/script.xml2
-rw-r--r--lib/sasl/doc/src/systools.xml18
-rw-r--r--lib/sasl/src/rb.erl4
-rw-r--r--lib/sasl/src/release_handler.erl42
-rw-r--r--lib/sasl/src/release_handler_1.erl44
-rw-r--r--lib/sasl/src/sasl.erl21
-rw-r--r--lib/sasl/src/systools_make.erl83
-rw-r--r--lib/sasl/src/systools_rc.erl28
-rw-r--r--lib/sasl/src/systools_relup.erl15
-rw-r--r--lib/sasl/vsn.mk2
-rw-r--r--lib/snmp/doc/man1/.gitignore0
-rw-r--r--lib/snmp/doc/src/Makefile34
-rw-r--r--lib/snmp/doc/src/depend.mk3
-rw-r--r--lib/snmp/doc/src/files.mk21
-rw-r--r--lib/snmp/doc/src/make.dep4
-rw-r--r--lib/snmp/doc/src/notes.xml137
-rw-r--r--lib/snmp/doc/src/ref_man.xml5
-rw-r--r--lib/snmp/doc/src/snmp_agent_config_files.xml11
-rw-r--r--lib/snmp/doc/src/snmp_config.xml44
-rw-r--r--lib/snmp/doc/src/snmp_view_based_acm_mib.xml74
-rw-r--r--lib/snmp/doc/src/snmpa.xml37
-rw-r--r--lib/snmp/doc/src/snmpa_error.xml7
-rw-r--r--lib/snmp/doc/src/snmpc.xml45
-rw-r--r--lib/snmp/doc/src/snmpc_cmd.xml191
-rw-r--r--lib/snmp/include/snmp_types.hrl4
-rw-r--r--lib/snmp/mibs/Makefile.in26
-rw-r--r--lib/snmp/src/agent/snmp_community_mib.erl4
-rw-r--r--lib/snmp/src/agent/snmp_framework_mib.erl12
-rw-r--r--lib/snmp/src/agent/snmp_standard_mib.erl275
-rw-r--r--lib/snmp/src/agent/snmp_target_mib.erl13
-rw-r--r--lib/snmp/src/agent/snmp_user_based_sm_mib.erl60
-rw-r--r--lib/snmp/src/agent/snmp_view_based_acm_mib.erl236
-rw-r--r--lib/snmp/src/agent/snmpa.erl182
-rw-r--r--lib/snmp/src/agent/snmpa_mib_lib.erl59
-rw-r--r--lib/snmp/src/agent/snmpa_vacm.erl9
-rw-r--r--lib/snmp/src/app/snmp.appup.src120
-rw-r--r--lib/snmp/src/compile/Makefile16
-rw-r--r--lib/snmp/src/compile/depend.mk5
-rw-r--r--lib/snmp/src/compile/modules.mk5
-rw-r--r--lib/snmp/src/compile/snmpc.erl138
-rw-r--r--lib/snmp/src/compile/snmpc.hrl63
-rw-r--r--lib/snmp/src/compile/snmpc.src381
-rw-r--r--lib/snmp/src/compile/snmpc_lib.erl5
-rw-r--r--lib/snmp/src/compile/snmpc_mib_gram.yrl330
-rw-r--r--lib/snmp/src/compile/snmpc_mib_to_hrl.erl5
-rw-r--r--lib/snmp/src/compile/snmpc_tok.erl9
-rw-r--r--lib/snmp/test/Makefile2
-rw-r--r--lib/snmp/test/klas3.erl2
-rw-r--r--lib/snmp/test/modules.mk4
-rw-r--r--lib/snmp/test/sa.erl2
-rw-r--r--lib/snmp/test/snmp.cover4
-rw-r--r--lib/snmp/test/snmp.spec2
-rw-r--r--lib/snmp/test/snmp_SUITE.erl171
-rw-r--r--lib/snmp/test/snmp_agent_bl_test.erl4
-rw-r--r--lib/snmp/test/snmp_agent_mibs_test.erl59
-rw-r--r--lib/snmp/test/snmp_agent_ms_test.erl478
-rw-r--r--lib/snmp/test/snmp_agent_mt_test.erl478
-rw-r--r--lib/snmp/test/snmp_agent_nfilter_test.erl14
-rw-r--r--lib/snmp/test/snmp_agent_test.erl658
-rw-r--r--lib/snmp/test/snmp_agent_v1_test.erl4
-rw-r--r--lib/snmp/test/snmp_agent_v2_test.erl478
-rw-r--r--lib/snmp/test/snmp_agent_v3_test.erl478
-rw-r--r--lib/snmp/test/snmp_app_test.erl108
-rw-r--r--lib/snmp/test/snmp_appup_mgr.erl2
-rw-r--r--lib/snmp/test/snmp_appup_test.erl40
-rw-r--r--lib/snmp/test/snmp_compiler_test.erl128
-rw-r--r--lib/snmp/test/snmp_conf_test.erl46
-rw-r--r--lib/snmp/test/snmp_log_test.erl69
-rw-r--r--lib/snmp/test/snmp_manager_config_test.erl208
-rw-r--r--lib/snmp/test/snmp_manager_test.erl210
-rw-r--r--lib/snmp/test/snmp_manager_user.erl2
-rwxr-xr-xlib/snmp/test/snmp_manager_user_old.erl2
-rw-r--r--lib/snmp/test/snmp_manager_user_test.erl85
-rw-r--r--lib/snmp/test/snmp_manager_user_test_lib.erl2
-rw-r--r--lib/snmp/test/snmp_note_store_test.erl30
-rw-r--r--lib/snmp/test/snmp_pdus_test.erl33
-rw-r--r--lib/snmp/test/snmp_test_data/AC-TEST-MIB.mib131
-rw-r--r--lib/snmp/test/snmp_test_data/MC-TEST-MIB.mib173
-rw-r--r--lib/snmp/test/snmp_test_manager.erl2
-rw-r--r--lib/snmp/test/snmp_test_mgr_misc.erl4
-rw-r--r--lib/snmp/test/snmp_test_server.erl8
-rw-r--r--lib/snmp/test/snmp_test_suite.erl4
-rw-r--r--lib/snmp/test/test1.erl2
-rw-r--r--lib/snmp/test/test2.erl2
-rw-r--r--lib/snmp/test/test_config/.gitignore19
-rw-r--r--lib/snmp/test/test_config/Makefile199
-rw-r--r--lib/snmp/test/test_config/agent/agent.conf.src19
-rw-r--r--lib/snmp/test/test_config/agent/community.conf.src15
-rw-r--r--lib/snmp/test/test_config/agent/context.conf.src14
-rw-r--r--lib/snmp/test/test_config/agent/notify.conf.src13
-rw-r--r--lib/snmp/test/test_config/agent/standard.conf.src21
-rw-r--r--lib/snmp/test/test_config/agent/target_addr.conf.src21
-rw-r--r--lib/snmp/test/test_config/agent/target_params.conf.src11
-rw-r--r--lib/snmp/test/test_config/agent/usm.conf.src17
-rw-r--r--lib/snmp/test/test_config/agent/vacm.conf.src27
-rw-r--r--lib/snmp/test/test_config/manager/manager.conf.src16
-rw-r--r--lib/snmp/test/test_config/manager/usm.conf.src9
-rw-r--r--lib/snmp/test/test_config/modules.mk41
-rw-r--r--lib/snmp/test/test_config/snmp_test_config.erl32
-rw-r--r--lib/snmp/test/test_config/sys-agent.config.src43
-rw-r--r--lib/snmp/test/test_config/sys-manager.config.src35
-rw-r--r--lib/snmp/test/test_config/sys.config.src68
-rw-r--r--lib/snmp/vsn.mk21
-rw-r--r--lib/ssh/doc/src/notes.xml68
-rw-r--r--lib/ssh/doc/src/ssh.xml32
-rw-r--r--lib/ssh/doc/src/ssh_connection.xml2
-rw-r--r--lib/ssh/src/ssh.appup.src10
-rw-r--r--lib/ssh/src/ssh.erl49
-rw-r--r--lib/ssh/src/ssh_acceptor.erl6
-rwxr-xr-xlib/ssh/src/ssh_bits.erl56
-rw-r--r--lib/ssh/src/ssh_cli.erl2
-rw-r--r--lib/ssh/src/ssh_connection_handler.erl11
-rw-r--r--lib/ssh/src/ssh_connection_manager.erl6
-rwxr-xr-xlib/ssh/src/ssh_file.erl25
-rwxr-xr-xlib/ssh/src/ssh_rsa.erl3
-rw-r--r--lib/ssh/src/ssh_transport.erl4
-rw-r--r--lib/ssh/src/ssh_userreg.erl28
-rw-r--r--lib/ssh/vsn.mk2
-rw-r--r--lib/ssl/doc/src/book.xml2
-rw-r--r--lib/ssl/doc/src/notes.xml77
-rw-r--r--lib/ssl/doc/src/ssl.xml41
-rw-r--r--lib/ssl/doc/src/using_ssl.xml2
-rw-r--r--lib/ssl/examples/certs/Makefile2
-rw-r--r--lib/ssl/examples/src/Makefile2
-rw-r--r--lib/ssl/src/inet_ssl_dist.erl29
-rw-r--r--lib/ssl/src/ssl.appup.src8
-rw-r--r--lib/ssl/src/ssl.erl68
-rw-r--r--lib/ssl/src/ssl_app.erl2
-rw-r--r--lib/ssl/src/ssl_certificate_db.erl58
-rw-r--r--lib/ssl/src/ssl_connection.erl188
-rw-r--r--lib/ssl/src/ssl_handshake.erl26
-rw-r--r--lib/ssl/src/ssl_handshake.hrl6
-rw-r--r--lib/ssl/src/ssl_internal.hrl9
-rw-r--r--lib/ssl/src/ssl_manager.erl89
-rw-r--r--lib/ssl/src/ssl_session.erl30
-rw-r--r--lib/ssl/src/ssl_ssl3.erl5
-rw-r--r--lib/ssl/src/ssl_tls1.erl5
-rw-r--r--lib/ssl/test/Makefile7
-rw-r--r--lib/ssl/test/make_certs.erl2
-rw-r--r--lib/ssl/test/old_ssl_active_SUITE.erl84
-rw-r--r--lib/ssl/test/old_ssl_active_once_SUITE.erl86
-rw-r--r--lib/ssl/test/old_ssl_dist_SUITE.erl34
-rw-r--r--lib/ssl/test/old_ssl_misc_SUITE.erl70
-rw-r--r--lib/ssl/test/old_ssl_passive_SUITE.erl84
-rw-r--r--lib/ssl/test/old_ssl_peer_cert_SUITE.erl73
-rw-r--r--lib/ssl/test/old_ssl_protocol_SUITE.erl70
-rw-r--r--lib/ssl/test/old_ssl_verify_SUITE.erl70
-rw-r--r--lib/ssl/test/old_transport_accept_SUITE.erl39
-rw-r--r--lib/ssl/test/ssl.cover36
-rw-r--r--lib/ssl/test/ssl.spec2
-rw-r--r--lib/ssl/test/ssl_basic_SUITE.erl818
-rw-r--r--lib/ssl/test/ssl_packet_SUITE.erl115
-rw-r--r--lib/ssl/test/ssl_payload_SUITE.erl63
-rw-r--r--lib/ssl/test/ssl_session_cache_SUITE.erl55
-rw-r--r--lib/ssl/test/ssl_test_lib.erl134
-rw-r--r--lib/ssl/test/ssl_to_openssl_SUITE.erl64
-rw-r--r--lib/ssl/vsn.mk3
-rw-r--r--lib/stdlib/doc/src/binary.xml2
-rw-r--r--lib/stdlib/doc/src/calendar.xml34
-rw-r--r--lib/stdlib/doc/src/dict.xml16
-rw-r--r--lib/stdlib/doc/src/erl_expand_records.xml2
-rw-r--r--lib/stdlib/doc/src/erl_internal.xml2
-rw-r--r--lib/stdlib/doc/src/erl_pp.xml2
-rw-r--r--lib/stdlib/doc/src/filelib.xml6
-rw-r--r--lib/stdlib/doc/src/io.xml61
-rw-r--r--lib/stdlib/doc/src/io_protocol.xml2
-rw-r--r--lib/stdlib/doc/src/log_mf_h.xml2
-rw-r--r--lib/stdlib/doc/src/math.xml2
-rw-r--r--lib/stdlib/doc/src/notes.xml109
-rw-r--r--lib/stdlib/doc/src/orddict.xml10
-rw-r--r--lib/stdlib/doc/src/part_notes_history.xml2
-rw-r--r--lib/stdlib/doc/src/pg.xml2
-rw-r--r--lib/stdlib/doc/src/re.xml2
-rw-r--r--lib/stdlib/doc/src/shell_default.xml2
-rw-r--r--lib/stdlib/doc/src/supervisor.xml43
-rw-r--r--lib/stdlib/doc/src/supervisor_bridge.xml2
-rw-r--r--lib/stdlib/doc/src/sys.xml6
-rw-r--r--lib/stdlib/doc/src/timer.xml10
-rw-r--r--lib/stdlib/doc/src/unicode.xml18
-rw-r--r--lib/stdlib/doc/src/unicode_usage.xml12
-rw-r--r--lib/stdlib/doc/src/zip.xml20
-rw-r--r--lib/stdlib/src/base64.erl113
-rw-r--r--lib/stdlib/src/c.erl52
-rw-r--r--lib/stdlib/src/calendar.erl55
-rw-r--r--lib/stdlib/src/erl_lint.erl22
-rw-r--r--lib/stdlib/src/erl_parse.yrl10
-rw-r--r--lib/stdlib/src/erl_posix_msg.erl285
-rw-r--r--lib/stdlib/src/erl_pp.erl10
-rw-r--r--lib/stdlib/src/escript.erl24
-rw-r--r--lib/stdlib/src/filename.erl14
-rw-r--r--lib/stdlib/src/gb_sets.erl2
-rw-r--r--lib/stdlib/src/gen.erl9
-rw-r--r--lib/stdlib/src/gen_event.erl3
-rw-r--r--lib/stdlib/src/gen_fsm.erl11
-rw-r--r--lib/stdlib/src/gen_server.erl11
-rw-r--r--lib/stdlib/src/io.erl40
-rw-r--r--lib/stdlib/src/io_lib_format.erl44
-rw-r--r--lib/stdlib/src/log_mf_h.erl14
-rw-r--r--lib/stdlib/src/ms_transform.erl2
-rw-r--r--lib/stdlib/src/orddict.erl2
-rw-r--r--lib/stdlib/src/ordsets.erl2
-rw-r--r--lib/stdlib/src/pool.erl3
-rw-r--r--lib/stdlib/src/re.erl63
-rw-r--r--lib/stdlib/src/string.erl2
-rw-r--r--lib/stdlib/src/supervisor.erl179
-rw-r--r--lib/stdlib/src/timer.erl25
-rw-r--r--lib/stdlib/src/unicode.erl2
-rw-r--r--lib/stdlib/test/Makefile4
-rw-r--r--lib/stdlib/test/array_SUITE.erl57
-rw-r--r--lib/stdlib/test/base64_SUITE.erl118
-rw-r--r--lib/stdlib/test/beam_lib_SUITE.erl47
-rw-r--r--lib/stdlib/test/binary_module_SUITE.erl54
-rw-r--r--lib/stdlib/test/c_SUITE.erl28
-rw-r--r--lib/stdlib/test/calendar_SUITE.erl52
-rw-r--r--lib/stdlib/test/dets_SUITE.erl69
-rw-r--r--lib/stdlib/test/dict_SUITE.erl32
-rw-r--r--lib/stdlib/test/dict_test_lib.erl2
-rw-r--r--lib/stdlib/test/digraph_SUITE.erl36
-rw-r--r--lib/stdlib/test/digraph_utils_SUITE.erl30
-rw-r--r--lib/stdlib/test/dummy_h.erl2
-rw-r--r--lib/stdlib/test/edlin_expand_SUITE.erl37
-rw-r--r--lib/stdlib/test/epp_SUITE.erl53
-rw-r--r--lib/stdlib/test/erl_eval_SUITE.erl63
-rw-r--r--lib/stdlib/test/erl_eval_helper.erl2
-rw-r--r--lib/stdlib/test/erl_expand_records_SUITE.erl39
-rw-r--r--lib/stdlib/test/erl_internal_SUITE.erl32
-rw-r--r--lib/stdlib/test/erl_lint_SUITE.erl114
-rw-r--r--lib/stdlib/test/erl_pp_SUITE.erl88
-rw-r--r--lib/stdlib/test/erl_scan_SUITE.erl41
-rw-r--r--lib/stdlib/test/error_logger_forwarder.erl2
-rw-r--r--lib/stdlib/test/escript_SUITE.erl46
-rw-r--r--lib/stdlib/test/ets_SUITE.erl449
-rw-r--r--lib/stdlib/test/ets_tough_SUITE.erl32
-rw-r--r--lib/stdlib/test/file_sorter_SUITE.erl49
-rw-r--r--lib/stdlib/test/filelib_SUITE.erl34
-rw-r--r--lib/stdlib/test/filename_SUITE.erl28
-rw-r--r--lib/stdlib/test/fixtable_SUITE.erl37
-rw-r--r--lib/stdlib/test/format_SUITE.erl33
-rw-r--r--lib/stdlib/test/gen_event_SUITE.erl57
-rw-r--r--lib/stdlib/test/gen_fsm_SUITE.erl43
-rw-r--r--lib/stdlib/test/gen_server_SUITE.erl75
-rw-r--r--lib/stdlib/test/id_transform_SUITE.erl30
-rw-r--r--lib/stdlib/test/io_SUITE.erl121
-rw-r--r--lib/stdlib/test/io_proto_SUITE.erl49
-rw-r--r--lib/stdlib/test/lists_SUITE.erl139
-rw-r--r--lib/stdlib/test/log_mf_h_SUITE.erl28
-rw-r--r--lib/stdlib/test/ms_transform_SUITE.erl40
-rw-r--r--lib/stdlib/test/naughty_child.erl2
-rw-r--r--lib/stdlib/test/proc_lib_SUITE.erl35
-rw-r--r--lib/stdlib/test/qlc_SUITE.erl108
-rw-r--r--lib/stdlib/test/queue_SUITE.erl33
-rw-r--r--lib/stdlib/test/random_SUITE.erl33
-rw-r--r--lib/stdlib/test/random_iolist.erl2
-rw-r--r--lib/stdlib/test/random_unicode_list.erl2
-rw-r--r--lib/stdlib/test/re_SUITE.erl37
-rw-r--r--lib/stdlib/test/select_SUITE.erl36
-rw-r--r--lib/stdlib/test/sets_SUITE.erl36
-rw-r--r--lib/stdlib/test/sets_test_lib.erl2
-rw-r--r--lib/stdlib/test/shell_SUITE.erl88
-rw-r--r--lib/stdlib/test/slave_SUITE.erl27
-rw-r--r--lib/stdlib/test/sofs_SUITE.erl75
-rw-r--r--lib/stdlib/test/stdlib.cover25
-rw-r--r--lib/stdlib/test/stdlib.spec5
-rw-r--r--lib/stdlib/test/stdlib_SUITE.erl37
-rw-r--r--lib/stdlib/test/string_SUITE.erl42
-rw-r--r--lib/stdlib/test/supervisor_1.erl2
-rw-r--r--lib/stdlib/test/supervisor_SUITE.erl1623
-rw-r--r--lib/stdlib/test/supervisor_bridge_SUITE.erl29
-rw-r--r--lib/stdlib/test/sys_SUITE.erl29
-rw-r--r--lib/stdlib/test/tar_SUITE.erl36
-rw-r--r--lib/stdlib/test/timer_SUITE.erl27
-rw-r--r--lib/stdlib/test/timer_simple_SUITE.erl82
-rw-r--r--lib/stdlib/test/unicode_SUITE.erl35
-rw-r--r--lib/stdlib/test/win32reg_SUITE.erl28
-rw-r--r--lib/stdlib/test/y2k_SUITE.erl44
-rw-r--r--lib/stdlib/test/zip_SUITE.erl37
-rw-r--r--lib/stdlib/vsn.mk2
-rw-r--r--lib/syntax_tools/src/erl_recomment.erl2
-rw-r--r--lib/syntax_tools/test/Makefile4
-rw-r--r--lib/syntax_tools/test/syntax_tools.cover2
-rw-r--r--lib/syntax_tools/test/syntax_tools.dynspec5
-rw-r--r--lib/syntax_tools/test/syntax_tools.spec2
-rw-r--r--lib/syntax_tools/test/syntax_tools_SUITE.erl25
-rw-r--r--lib/test_server/doc/src/notes.xml37
-rw-r--r--lib/test_server/doc/src/test_server.xml2
-rw-r--r--lib/test_server/doc/src/test_server_ctrl.xml2
-rw-r--r--lib/test_server/doc/src/ts.xml2
-rw-r--r--lib/test_server/src/Makefile9
-rw-r--r--lib/test_server/src/test_server.erl215
-rw-r--r--lib/test_server/src/test_server_ctrl.erl81
-rw-r--r--lib/test_server/src/test_server_node.erl4
-rw-r--r--lib/test_server/src/test_server_sup.erl7
-rw-r--r--lib/test_server/src/ts.config83
-rw-r--r--lib/test_server/src/ts.erl36
-rw-r--r--lib/test_server/src/ts.unix.config2
-rw-r--r--lib/test_server/src/ts.vxworks.config19
-rw-r--r--lib/test_server/src/ts.win32.config15
-rw-r--r--lib/test_server/src/ts_install.erl7
-rw-r--r--lib/test_server/src/ts_install_cth.erl286
-rw-r--r--lib/test_server/src/ts_run.erl465
-rw-r--r--lib/test_server/test/Makefile13
-rw-r--r--lib/test_server/test/test_server.cover34
-rw-r--r--lib/test_server/test/test_server.spec3
-rw-r--r--lib/test_server/test/test_server_SUITE.erl656
-rw-r--r--lib/test_server/test/test_server_SUITE_data/Makefile.src2
-rw-r--r--lib/test_server/test/test_server_SUITE_data/test_server_SUITE.erl554
-rw-r--r--lib/test_server/test/test_server_SUITE_data/test_server_SUITE_data/dummy_file (renamed from lib/test_server/test/test_server_SUITE_data/dummy_file)0
-rw-r--r--lib/test_server/test/test_server_SUITE_data/test_server_conf01_SUITE.erl (renamed from lib/test_server/test/test_server_conf01_SUITE.erl)2
-rw-r--r--lib/test_server/test/test_server_SUITE_data/test_server_conf02_SUITE.erl (renamed from lib/test_server/test/test_server_conf02_SUITE.erl)2
-rw-r--r--lib/test_server/test/test_server_SUITE_data/test_server_parallel01_SUITE.erl (renamed from lib/test_server/test/test_server_parallel01_SUITE.erl)2
-rw-r--r--lib/test_server/test/test_server_SUITE_data/test_server_shuffle01_SUITE.erl (renamed from lib/test_server/test/test_server_shuffle01_SUITE.erl)2
-rw-r--r--lib/test_server/test/test_server_SUITE_data/test_server_skip_SUITE.erl (renamed from lib/test_server/test/test_server_skip_SUITE.erl)2
-rw-r--r--lib/test_server/test/test_server_line_SUITE.erl21
-rw-r--r--lib/test_server/test/test_server_line_SUITE_data/parse_transform_test.erl2
-rw-r--r--lib/test_server/test/test_server_test_lib.erl191
-rw-r--r--lib/test_server/test/test_server_test_lib.hrl23
-rw-r--r--lib/test_server/vsn.mk2
-rw-r--r--lib/toolbar/doc/src/toolbar.xml2
-rw-r--r--lib/tools/doc/src/cover.xml31
-rw-r--r--lib/tools/doc/src/cover_chapter.xml9
-rw-r--r--lib/tools/doc/src/cprof.xml2
-rw-r--r--lib/tools/doc/src/erlang_mode.xml2
-rw-r--r--lib/tools/doc/src/erlang_mode_chapter.xml2
-rw-r--r--lib/tools/doc/src/make.xml2
-rw-r--r--lib/tools/doc/src/notes.xml49
-rw-r--r--lib/tools/doc/src/part_notes_history.xml2
-rw-r--r--lib/tools/doc/src/tags.xml2
-rw-r--r--lib/tools/emacs/erlang.el18
-rw-r--r--lib/tools/src/cover.erl594
-rw-r--r--lib/tools/src/make.erl15
-rw-r--r--lib/tools/test/Makefile10
-rw-r--r--lib/tools/test/cover_SUITE.erl63
-rw-r--r--lib/tools/test/cprof_SUITE.erl37
-rw-r--r--lib/tools/test/emem_SUITE.erl40
-rw-r--r--lib/tools/test/eprof_SUITE.erl28
-rw-r--r--lib/tools/test/fprof_SUITE.erl34
-rw-r--r--[l---------]lib/tools/test/ignore_cores.erl159
-rw-r--r--lib/tools/test/instrument_SUITE.erl31
-rw-r--r--lib/tools/test/lcnt_SUITE.erl21
-rw-r--r--lib/tools/test/make_SUITE.erl33
-rw-r--r--lib/tools/test/tools.cover2
-rw-r--r--lib/tools/test/tools.spec2
-rw-r--r--lib/tools/test/tools_SUITE.erl33
-rw-r--r--lib/tools/test/xref_SUITE.erl60
-rw-r--r--lib/tools/vsn.mk2
-rw-r--r--lib/tv/doc/src/tv.xml2
-rw-r--r--lib/tv/src/tv_io_lib.erl9
-rw-r--r--lib/typer/RELEASE_NOTES22
-rw-r--r--lib/typer/src/Makefile25
-rw-r--r--lib/typer/src/typer.app.src7
-rw-r--r--lib/typer/src/typer.erl1008
-rw-r--r--lib/typer/src/typer.hrl64
-rw-r--r--lib/typer/src/typer_annotator.erl384
-rw-r--r--lib/typer/src/typer_info.erl162
-rw-r--r--lib/typer/src/typer_map.erl47
-rw-r--r--lib/typer/src/typer_options.erl191
-rw-r--r--lib/typer/src/typer_preprocess.erl154
-rw-r--r--lib/typer/vsn.mk2
-rw-r--r--lib/webtool/doc/src/notes_history.xml2
-rw-r--r--lib/webtool/doc/src/part_notes_history.xml2
-rw-r--r--lib/webtool/doc/src/webtool.xml2
-rw-r--r--lib/webtool/doc/src/webtool_chapter.xml4
-rw-r--r--lib/wx/c_src/wxe_driver.c6
-rw-r--r--lib/wx/c_src/wxe_impl.cpp40
-rw-r--r--lib/wx/c_src/wxe_ps_init.c2
-rw-r--r--lib/wx/doc/src/notes.xml25
-rw-r--r--lib/wx/src/wxe_master.erl28
-rw-r--r--lib/wx/test/Makefile4
-rw-r--r--lib/wx/test/wx.cover2
-rw-r--r--lib/wx/test/wx.spec3
-rw-r--r--lib/wx/test/wx_app_SUITE.erl36
-rw-r--r--lib/wx/test/wx_basic_SUITE.erl34
-rw-r--r--lib/wx/test/wx_class_SUITE.erl39
-rw-r--r--lib/wx/test/wx_event_SUITE.erl36
-rw-r--r--lib/wx/test/wx_opengl_SUITE.erl32
-rw-r--r--lib/wx/test/wx_test_lib.erl10
-rw-r--r--lib/wx/test/wx_xtra_SUITE.erl33
-rw-r--r--lib/wx/vsn.mk2
-rw-r--r--lib/xmerl/doc/examples/Makefile61
-rw-r--r--lib/xmerl/doc/examples/mkdocs.erl9
-rw-r--r--lib/xmerl/doc/examples/sdocbook2xhtml.erl823
-rwxr-xr-xlib/xmerl/doc/examples/test_html.erl225
-rw-r--r--lib/xmerl/doc/examples/xmerl_test.erl522
-rwxr-xr-xlib/xmerl/doc/examples/xml/test.xml6
-rwxr-xr-xlib/xmerl/doc/examples/xml/test2.xml8
-rwxr-xr-xlib/xmerl/doc/examples/xml/test3.xml8
-rwxr-xr-xlib/xmerl/doc/examples/xml/test4.xml9
-rwxr-xr-xlib/xmerl/doc/examples/xml/test5.xml9
-rwxr-xr-xlib/xmerl/doc/examples/xml/testdtd.dtd17
-rwxr-xr-xlib/xmerl/doc/examples/xml/xmerl.xml523
-rw-r--r--lib/xmerl/doc/examples/xml/xmerl_xs.xml541
-rw-r--r--lib/xmerl/doc/examples/xserl_test.erl85
-rw-r--r--lib/xmerl/doc/src/notes.xml29
-rw-r--r--lib/xmerl/doc/src/notes_history.xml2
-rw-r--r--lib/xmerl/doc/src/xmerl_sax_parser.xml2
-rw-r--r--lib/xmerl/src/xmerl_lib.erl9
-rw-r--r--lib/xmerl/src/xmerl_sax_parser.erl1
-rw-r--r--lib/xmerl/src/xmerl_sax_parser_utf16be.erlsrc4
-rw-r--r--lib/xmerl/src/xmerl_sax_parser_utf16le.erlsrc4
-rw-r--r--lib/xmerl/src/xmerl_scan.erl15
-rw-r--r--lib/xmerl/src/xmerl_uri.erl8
-rw-r--r--lib/xmerl/src/xmerl_xpath.erl4
-rw-r--r--lib/xmerl/src/xmerl_xsd.erl16
-rw-r--r--lib/xmerl/src/xmerl_xsd_type.erl4
-rw-r--r--lib/xmerl/test/Makefile127
-rw-r--r--lib/xmerl/test/ReadMe24
-rw-r--r--lib/xmerl/test/testcases.dtd103
-rw-r--r--lib/xmerl/test/xmerl.cover2
-rw-r--r--lib/xmerl/test/xmerl.spec1
-rw-r--r--lib/xmerl/test/xmerl_SUITE.erl634
-rw-r--r--lib/xmerl/test/xmerl_SUITE_data/cpd.tar.gzbin0 -> 2128 bytes
-rw-r--r--lib/xmerl/test/xmerl_SUITE_data/eventp/CMOM.xml30261
-rw-r--r--lib/xmerl/test/xmerl_SUITE_data/eventp/CelloMOM.stub14
-rw-r--r--lib/xmerl/test/xmerl_SUITE_data/eventp/CelloMOM.xml30261
-rw-r--r--lib/xmerl/test/xmerl_SUITE_data/eventp/mp.dtd274
-rw-r--r--lib/xmerl/test/xmerl_SUITE_data/eventp/wurfl.stub5
-rw-r--r--lib/xmerl/test/xmerl_SUITE_data/eventp/wurfl.xml9
-rw-r--r--lib/xmerl/test/xmerl_SUITE_data/misc.tar.gzbin0 -> 47121 bytes
-rw-r--r--lib/xmerl/test/xmerl_SUITE_data/xpath/documentRoot.xml43
-rw-r--r--lib/xmerl/test/xmerl_SUITE_data/xpath/e1074.xml18
-rw-r--r--lib/xmerl/test/xmerl_SUITE_data/xpath/e1075.xml18
-rw-r--r--lib/xmerl/test/xmerl_SUITE_data/xpath/e1076.xml13
-rw-r--r--lib/xmerl/test/xmerl_SUITE_data/xpath/e1077.xml16
-rw-r--r--lib/xmerl/test/xmerl_SUITE_data/xpath/e1078.xml11
-rw-r--r--lib/xmerl/test/xmerl_SUITE_data/xpath/motorcycles.xml25
-rw-r--r--lib/xmerl/test/xmerl_SUITE_data/xpath/myBS_model.xml6
-rw-r--r--lib/xmerl/test/xmerl_SUITE_data/xpath/purchaseOrder.xml36
-rw-r--r--lib/xmerl/test/xmerl_SUITE_data/xpath/xpath.xml25
-rw-r--r--lib/xmerl/test/xmerl_SUITE_data/xpath/xpath_abbrev.erl266
-rw-r--r--lib/xmerl/test/xmerl_SUITE_data/xpath/xpath_lib.erl184
-rw-r--r--lib/xmerl/test/xmerl_SUITE_data/xpath/xpath_text.erl28
-rw-r--r--lib/xmerl/test/xmerl_app_test.erl242
-rw-r--r--lib/xmerl/test/xmerl_appup_test.erl392
-rw-r--r--lib/xmerl/test/xmerl_sax_SUITE.erl110
-rw-r--r--lib/xmerl/test/xmerl_sax_std_SUITE.erl25635
-rw-r--r--lib/xmerl/test/xmerl_std_SUITE.erl11799
-rw-r--r--lib/xmerl/test/xmerl_std_SUITE_data/ibm.tgzbin0 -> 112986 bytes
-rw-r--r--lib/xmerl/test/xmerl_std_SUITE_data/japanese.tgzbin0 -> 376850 bytes
-rw-r--r--lib/xmerl/test/xmerl_std_SUITE_data/oasis.tgzbin0 -> 26750 bytes
-rw-r--r--lib/xmerl/test/xmerl_std_SUITE_data/sun.tgzbin0 -> 23117 bytes
-rw-r--r--lib/xmerl/test/xmerl_std_SUITE_data/w3c-copyright-19980720.html81
-rw-r--r--lib/xmerl/test/xmerl_std_SUITE_data/xmltest.tgzbin0 -> 43920 bytes
-rw-r--r--lib/xmerl/test/xmerl_test_lib.erl92
-rw-r--r--lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE.erl24131
-rw-r--r--lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE_data/msx_failed_cases.log2234
-rw-r--r--lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE_data/msxsdtest.tar.gzbin0 -> 703416 bytes
-rw-r--r--lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE_data/w3c-copyright-19990405.html82
-rw-r--r--lib/xmerl/test/xmerl_xsd_NIST2002-01-16_SUITE.erl15962
-rw-r--r--lib/xmerl/test/xmerl_xsd_NIST2002-01-16_SUITE_data/nist_failed_cases.log894
-rw-r--r--lib/xmerl/test/xmerl_xsd_NIST2002-01-16_SUITE_data/nisttest.tar.gzbin0 -> 1113062 bytes
-rw-r--r--lib/xmerl/test/xmerl_xsd_NIST2002-01-16_SUITE_data/w3c-copyright-19990405.html82
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE.erl1148
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/4Q99.xml25
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/CxDataType_Rel5.xsd211
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/address.xsd69
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/complexTypes.xsd112
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/complexTypes1.xml44
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/complexTypes2.xml44
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/enum_bug.xml2
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/enum_bug.xsd20
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/gpx/clementine_loop.gpx3594
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/gpx/gpx.xsd227
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/instance.xml149
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/int.xml4
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/ipo.xml32
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/ipo.xsd60
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/ipo_redefine.xml34
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/ipo_redefine.xsd73
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/ipo_substGroup.xml37
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/ipo_substGroup.xsd65
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/measCollec.xsd160
-rwxr-xr-xlib/xmerl/test/xmerl_xsd_SUITE_data/mim.xsd511
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/EricssonSpecificAttributes.5.1.xsd1531
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/EricssonSpecificAttributes.5.1Tran.xsd2164
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/ImportExportMap.xsd75
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/configData.xsd41
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/genericNrm.xsd230
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/geranNrm.xsd63
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/rnc.xml23763
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/utranNrm.xsd174
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/po.xml32
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/po.xsd67
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/po1.tab424
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/po1.tab2424
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/po1.xml36
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/po1.xsd64
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/po1_all.xsd65
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/po1_all1.xml36
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/po1_all2.xml35
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/po1_all_err1.xml37
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/po1_all_err2.xml28
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/po1_global.xsd86
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/po2.xml36
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/po_attrGroup.xml32
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/po_attrGroup.xsd81
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/report.tab850
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/report.tab2850
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/report.xsd82
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/report2.xsd82
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/simple_int.xsd13
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/sis/IntegratedSite.xsd5238
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/sis/IsTypes.xsd42
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/sis/MainSwitch_1.xsd1496
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/sis/MyBsModel_1.xsd502
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/sis/bs_mim.xml1187
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/sis/dummy_action_mim.xml186
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/sis/hwm_mim.xml631
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/sis/instance.xml240
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/sis/mim.xsd486
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/sis/mim2.xsd506
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/sis/nc.xsd14
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/sis/swm_mim.xml881
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/small.xml8
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/small.xsd60
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_7288.xml56
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_8599.xml6
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_8599.xsd17
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/vehicle.xml117
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/vehicle.xsd82
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/vehicle2.xml61
-rw-r--r--lib/xmerl/test/xmerl_xsd_SUITE_data/vehicle3.xml117
-rw-r--r--lib/xmerl/test/xmerl_xsd_Sun2002-01-16_SUITE.erl812
-rw-r--r--lib/xmerl/test/xmerl_xsd_Sun2002-01-16_SUITE_data/sun_failed_cases.log33
-rw-r--r--lib/xmerl/test/xmerl_xsd_Sun2002-01-16_SUITE_data/suntest.tar.gzbin0 -> 21294 bytes
-rw-r--r--lib/xmerl/test/xmerl_xsd_Sun2002-01-16_SUITE_data/w3c-copyright-19990405.html82
-rw-r--r--lib/xmerl/test/xmerl_xsd_lib.erl321
-rw-r--r--lib/xmerl/test/xmlconf.xml53
-rw-r--r--lib/xmerl/test/xmlconformance.msxsl527
-rw-r--r--lib/xmerl/test/xmlconformance.xsl498
-rw-r--r--lib/xmerl/vsn.mk2
-rw-r--r--system/COPYRIGHT2
-rw-r--r--system/README8
-rw-r--r--system/doc/design_principles/events.xml19
-rw-r--r--system/doc/design_principles/fsm.xml7
-rw-r--r--system/doc/design_principles/gen_server_concepts.xml7
-rw-r--r--system/doc/design_principles/sup_princ.xml8
-rw-r--r--system/doc/efficiency_guide/advanced.xml6
-rw-r--r--system/doc/efficiency_guide/appendix.xml2
-rw-r--r--system/doc/efficiency_guide/binaryhandling.xml8
-rw-r--r--system/doc/efficiency_guide/drivers.xml2
-rw-r--r--system/doc/efficiency_guide/functions.xml2
-rw-r--r--system/doc/efficiency_guide/myths.xml2
-rw-r--r--system/doc/efficiency_guide/processes.xml8
-rw-r--r--system/doc/efficiency_guide/profiling.xml16
-rw-r--r--system/doc/efficiency_guide/tablesDatabases.xml6
-rw-r--r--system/doc/embedded/intro.xml2
-rw-r--r--system/doc/embedded/vme_problems.xml2
-rw-r--r--system/doc/embedded/xntp.xml2
-rw-r--r--system/doc/reference_manual/errors.xml12
-rw-r--r--system/doc/reference_manual/expressions.xml4
-rw-r--r--system/doc/top/src/erl_html_tools.erl14
-rw-r--r--system/doc/tutorial/c_port.xmlsrc2
-rw-r--r--system/doc/tutorial/nif.xmlsrc2
2639 files changed, 403867 insertions, 34962 deletions
diff --git a/.gitignore b/.gitignore
index d67116d6e3..b35a6c1c31 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,10 @@
# Match at any level.
+
+# emacs
*~
+# vim
+.*.sw[a-z]
+
autom4te.cache
*.beam
*.asn1db
@@ -160,8 +165,10 @@ make/win32/
/lib/*/test/*_SUITE_make.erl
/lib/*/test/*_SUITE_data/Makefile
/erts/emulator/test/*_SUITE_make.erl
+/erts/emulator/test/*_native_SUITE.erl
/erts/emulator/test/*_SUITE_data/Makefile
/erts/test/install_SUITE_data/install_bin
+/erts/test/autoimport_SUITE_data/erlang.xml
# asn1
@@ -172,6 +179,7 @@ make/win32/
# common_test
+/lib/common_test/doc/src/ct_slave.xml
/lib/common_test/priv/install.sh
# compiler
@@ -297,6 +305,7 @@ make/win32/
# snmp
/lib/snmp/bin/snmp-v2tov1
+/lib/snmp/bin/snmpc
/lib/snmp/examples/ex1/EX1-MIB.bin
/lib/snmp/mibs/Makefile
/lib/snmp/mibs/v1/OTP-SNMPEA-MIB.mib.v1
diff --git a/bootstrap/bin/start.boot b/bootstrap/bin/start.boot
index c7f5785eee..875f1b1c8b 100644
--- a/bootstrap/bin/start.boot
+++ b/bootstrap/bin/start.boot
Binary files differ
diff --git a/bootstrap/bin/start.script b/bootstrap/bin/start.script
index c5106e3709..ba1aed08e7 100644
--- a/bootstrap/bin/start.script
+++ b/bootstrap/bin/start.script
@@ -1,6 +1,6 @@
-%% script generated at {2010,12,3} {17,41,47}
+%% script generated at {2011,3,30} {10,45,5}
{script,
- {"OTP APN 181 01","R14B01"},
+ {"OTP APN 181 01","R14B03"},
[{preLoaded,
[erl_prim_loader,erlang,init,otp_ring0,prim_file,prim_inet,prim_zip,
zlib]},
@@ -43,7 +43,7 @@
{application_controller,start,
[{application,kernel,
[{description,"ERTS CXC 138 10"},
- {vsn,"2.14.2"},
+ {vsn,"2.14.4"},
{id,[]},
{modules,
[application,application_controller,application_master,
@@ -80,7 +80,7 @@
{application,load,
[{application,stdlib,
[{description,"ERTS CXC 138 10"},
- {vsn,"1.17.2"},
+ {vsn,"1.17.4"},
{id,[]},
{modules,
[array,base64,beam_lib,binary,c,calendar,dets,
diff --git a/bootstrap/bin/start_clean.boot b/bootstrap/bin/start_clean.boot
index c7f5785eee..875f1b1c8b 100644
--- a/bootstrap/bin/start_clean.boot
+++ b/bootstrap/bin/start_clean.boot
Binary files differ
diff --git a/bootstrap/bin/start_clean.script b/bootstrap/bin/start_clean.script
index c5106e3709..ba1aed08e7 100644
--- a/bootstrap/bin/start_clean.script
+++ b/bootstrap/bin/start_clean.script
@@ -1,6 +1,6 @@
-%% script generated at {2010,12,3} {17,41,47}
+%% script generated at {2011,3,30} {10,45,5}
{script,
- {"OTP APN 181 01","R14B01"},
+ {"OTP APN 181 01","R14B03"},
[{preLoaded,
[erl_prim_loader,erlang,init,otp_ring0,prim_file,prim_inet,prim_zip,
zlib]},
@@ -43,7 +43,7 @@
{application_controller,start,
[{application,kernel,
[{description,"ERTS CXC 138 10"},
- {vsn,"2.14.2"},
+ {vsn,"2.14.4"},
{id,[]},
{modules,
[application,application_controller,application_master,
@@ -80,7 +80,7 @@
{application,load,
[{application,stdlib,
[{description,"ERTS CXC 138 10"},
- {vsn,"1.17.2"},
+ {vsn,"1.17.4"},
{id,[]},
{modules,
[array,base64,beam_lib,binary,c,calendar,dets,
diff --git a/bootstrap/lib/compiler/ebin/beam_asm.beam b/bootstrap/lib/compiler/ebin/beam_asm.beam
index 7a40486b42..5719592cae 100644
--- a/bootstrap/lib/compiler/ebin/beam_asm.beam
+++ b/bootstrap/lib/compiler/ebin/beam_asm.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/beam_dict.beam b/bootstrap/lib/compiler/ebin/beam_dict.beam
index 6e3c32607e..b65ebca3cd 100644
--- a/bootstrap/lib/compiler/ebin/beam_dict.beam
+++ b/bootstrap/lib/compiler/ebin/beam_dict.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/cerl.beam b/bootstrap/lib/compiler/ebin/cerl.beam
index 197e726ba6..9f45f9f441 100644
--- a/bootstrap/lib/compiler/ebin/cerl.beam
+++ b/bootstrap/lib/compiler/ebin/cerl.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/compile.beam b/bootstrap/lib/compiler/ebin/compile.beam
index d9b955baff..c4b31874cc 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/compiler.app b/bootstrap/lib/compiler/ebin/compiler.app
index 3fd5add16b..b7518ff62f 100644
--- a/bootstrap/lib/compiler/ebin/compiler.app
+++ b/bootstrap/lib/compiler/ebin/compiler.app
@@ -18,7 +18,7 @@
{application, compiler,
[{description, "ERTS CXC 138 10"},
- {vsn, "4.7.1"},
+ {vsn, "4.7.3"},
{modules, [
beam_asm,
beam_block,
diff --git a/bootstrap/lib/compiler/ebin/core_parse.beam b/bootstrap/lib/compiler/ebin/core_parse.beam
index 5e39a05dc5..973659b27b 100644
--- a/bootstrap/lib/compiler/ebin/core_parse.beam
+++ b/bootstrap/lib/compiler/ebin/core_parse.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/rec_env.beam b/bootstrap/lib/compiler/ebin/rec_env.beam
index 7d53fa3353..8a1de81396 100644
--- a/bootstrap/lib/compiler/ebin/rec_env.beam
+++ b/bootstrap/lib/compiler/ebin/rec_env.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 f780a2fae6..c7b247762c 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/compiler/ebin/v3_codegen.beam b/bootstrap/lib/compiler/ebin/v3_codegen.beam
index 7cdb5fe92a..51fac17844 100644
--- a/bootstrap/lib/compiler/ebin/v3_codegen.beam
+++ b/bootstrap/lib/compiler/ebin/v3_codegen.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/v3_core.beam b/bootstrap/lib/compiler/ebin/v3_core.beam
index 7a60d7b23d..87cb60e41c 100644
--- a/bootstrap/lib/compiler/ebin/v3_core.beam
+++ b/bootstrap/lib/compiler/ebin/v3_core.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/v3_kernel.beam b/bootstrap/lib/compiler/ebin/v3_kernel.beam
index f87360f259..18790f80a6 100644
--- a/bootstrap/lib/compiler/ebin/v3_kernel.beam
+++ b/bootstrap/lib/compiler/ebin/v3_kernel.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/v3_kernel_pp.beam b/bootstrap/lib/compiler/ebin/v3_kernel_pp.beam
index e938467630..b7d2a409b5 100644
--- a/bootstrap/lib/compiler/ebin/v3_kernel_pp.beam
+++ b/bootstrap/lib/compiler/ebin/v3_kernel_pp.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/egen/core_parse.erl b/bootstrap/lib/compiler/egen/core_parse.erl
index 6e3fead4a3..b99bc0dbc3 100644
--- a/bootstrap/lib/compiler/egen/core_parse.erl
+++ b/bootstrap/lib/compiler/egen/core_parse.erl
@@ -13,7 +13,7 @@
tok_val(T) -> element(3, T).
tok_line(T) -> element(2, T).
--file("/usr/local/otp/releases/sles10_64_R14B_patched/lib/parsetools-2.0.4/include/yeccpre.hrl", 0).
+-file("/usr/local/otp/releases/sles10_32_R14B02_patched/lib/parsetools-2.0.5/include/yeccpre.hrl", 0).
%%
%% %CopyrightBegin%
%%
@@ -183,7 +183,7 @@ yecctoken2string({char,_,C}) -> io_lib:write_char(C);
yecctoken2string({var,_,V}) -> io_lib:format("~s", [V]);
yecctoken2string({string,_,S}) -> io_lib:write_unicode_string(S);
yecctoken2string({reserved_symbol, _, A}) -> io_lib:write(A);
-yecctoken2string({_Cat, _, Val}) -> io_lib:write(Val);
+yecctoken2string({_Cat, _, Val}) -> io_lib:format("~p",[Val]);
yecctoken2string({dot, _}) -> "'.'";
yecctoken2string({'$end', _}) ->
[];
@@ -196,7 +196,7 @@ yecctoken2string(Other) ->
--file("/ldisk/pan/git/otp/bootstrap/lib/compiler/egen/core_parse.erl", 199).
+-file("/ldisk/bjorn/otp/bootstrap/lib/compiler/egen/core_parse.erl", 199).
yeccpars2(0=S, Cat, Ss, Stack, T, Ts, Tzr) ->
yeccpars2_0(S, Cat, Ss, Stack, T, Ts, Tzr);
diff --git a/bootstrap/lib/kernel/ebin/code.beam b/bootstrap/lib/kernel/ebin/code.beam
index 18947d98c3..960b96ce4c 100644
--- a/bootstrap/lib/kernel/ebin/code.beam
+++ b/bootstrap/lib/kernel/ebin/code.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/file.beam b/bootstrap/lib/kernel/ebin/file.beam
index 343cee3fe7..39af418b30 100644
--- a/bootstrap/lib/kernel/ebin/file.beam
+++ b/bootstrap/lib/kernel/ebin/file.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/global.beam b/bootstrap/lib/kernel/ebin/global.beam
index 525d4ebdfa..333dd35c7e 100644
--- a/bootstrap/lib/kernel/ebin/global.beam
+++ b/bootstrap/lib/kernel/ebin/global.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/hipe_unified_loader.beam b/bootstrap/lib/kernel/ebin/hipe_unified_loader.beam
index 0c39512bb3..0bab2d23c7 100644
--- a/bootstrap/lib/kernel/ebin/hipe_unified_loader.beam
+++ b/bootstrap/lib/kernel/ebin/hipe_unified_loader.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/inet.beam b/bootstrap/lib/kernel/ebin/inet.beam
index 622110bcdb..52dc98319f 100644
--- a/bootstrap/lib/kernel/ebin/inet.beam
+++ b/bootstrap/lib/kernel/ebin/inet.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/inet6_tcp_dist.beam b/bootstrap/lib/kernel/ebin/inet6_tcp_dist.beam
index c2dac7dee1..05d8da8751 100644
--- a/bootstrap/lib/kernel/ebin/inet6_tcp_dist.beam
+++ b/bootstrap/lib/kernel/ebin/inet6_tcp_dist.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/kernel.app b/bootstrap/lib/kernel/ebin/kernel.app
index 5ea0891375..296382abc2 100644
--- a/bootstrap/lib/kernel/ebin/kernel.app
+++ b/bootstrap/lib/kernel/ebin/kernel.app
@@ -21,7 +21,7 @@
{application, kernel,
[
{description, "ERTS CXC 138 10"},
- {vsn, "2.14.2"},
+ {vsn, "2.14.4"},
{modules, [application,
application_controller,
application_master,
diff --git a/bootstrap/lib/kernel/ebin/kernel.appup b/bootstrap/lib/kernel/ebin/kernel.appup
index 77f9f42fea..f287e992f1 100644
--- a/bootstrap/lib/kernel/ebin/kernel.appup
+++ b/bootstrap/lib/kernel/ebin/kernel.appup
@@ -1 +1 @@
-{"2.14.2",[],[]}.
+{"2.14.3",[],[]}.
diff --git a/bootstrap/lib/kernel/ebin/net_kernel.beam b/bootstrap/lib/kernel/ebin/net_kernel.beam
index 1245322a7d..2e79781da8 100644
--- a/bootstrap/lib/kernel/ebin/net_kernel.beam
+++ b/bootstrap/lib/kernel/ebin/net_kernel.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/os.beam b/bootstrap/lib/kernel/ebin/os.beam
index e73189921f..cd112bb1cf 100644
--- a/bootstrap/lib/kernel/ebin/os.beam
+++ b/bootstrap/lib/kernel/ebin/os.beam
Binary files differ
diff --git a/bootstrap/lib/orber/include/ifr_types.hrl b/bootstrap/lib/orber/include/ifr_types.hrl
index 144ec7f8a1..324b32bd4f 100644
--- a/bootstrap/lib/orber/include/ifr_types.hrl
+++ b/bootstrap/lib/orber/include/ifr_types.hrl
@@ -1,9 +1,9 @@
%%--------------------------------------------------------------------
%%
%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
-%%
+%%
+%% Copyright Ericsson AB 1997-2011. 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
diff --git a/bootstrap/lib/stdlib/ebin/base64.beam b/bootstrap/lib/stdlib/ebin/base64.beam
index d48d8d6f58..3d429d9de0 100644
--- a/bootstrap/lib/stdlib/ebin/base64.beam
+++ b/bootstrap/lib/stdlib/ebin/base64.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/beam_lib.beam b/bootstrap/lib/stdlib/ebin/beam_lib.beam
index 04681ac12d..8615d4872e 100644
--- a/bootstrap/lib/stdlib/ebin/beam_lib.beam
+++ b/bootstrap/lib/stdlib/ebin/beam_lib.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/c.beam b/bootstrap/lib/stdlib/ebin/c.beam
index af54466541..e5acfa207d 100644
--- a/bootstrap/lib/stdlib/ebin/c.beam
+++ b/bootstrap/lib/stdlib/ebin/c.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/calendar.beam b/bootstrap/lib/stdlib/ebin/calendar.beam
index 715eed8dd9..09cd444a79 100644
--- a/bootstrap/lib/stdlib/ebin/calendar.beam
+++ b/bootstrap/lib/stdlib/ebin/calendar.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/dets.beam b/bootstrap/lib/stdlib/ebin/dets.beam
index 4b6e3756e9..7b3b5719b6 100644
--- a/bootstrap/lib/stdlib/ebin/dets.beam
+++ b/bootstrap/lib/stdlib/ebin/dets.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/digraph.beam b/bootstrap/lib/stdlib/ebin/digraph.beam
index c68611ccdc..d80b3a09c4 100644
--- a/bootstrap/lib/stdlib/ebin/digraph.beam
+++ b/bootstrap/lib/stdlib/ebin/digraph.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/erl_compile.beam b/bootstrap/lib/stdlib/ebin/erl_compile.beam
index c5d7557a15..18693b47a3 100644
--- a/bootstrap/lib/stdlib/ebin/erl_compile.beam
+++ b/bootstrap/lib/stdlib/ebin/erl_compile.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/erl_lint.beam b/bootstrap/lib/stdlib/ebin/erl_lint.beam
index 9b54fff03b..33d62a7a37 100644
--- a/bootstrap/lib/stdlib/ebin/erl_lint.beam
+++ b/bootstrap/lib/stdlib/ebin/erl_lint.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/erl_parse.beam b/bootstrap/lib/stdlib/ebin/erl_parse.beam
index 4d07a75daf..753080584f 100644
--- a/bootstrap/lib/stdlib/ebin/erl_parse.beam
+++ b/bootstrap/lib/stdlib/ebin/erl_parse.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/erl_posix_msg.beam b/bootstrap/lib/stdlib/ebin/erl_posix_msg.beam
index 696c854e8a..7d934adb92 100644
--- a/bootstrap/lib/stdlib/ebin/erl_posix_msg.beam
+++ b/bootstrap/lib/stdlib/ebin/erl_posix_msg.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/erl_pp.beam b/bootstrap/lib/stdlib/ebin/erl_pp.beam
index 2b6f0a5bd6..8036376515 100644
--- a/bootstrap/lib/stdlib/ebin/erl_pp.beam
+++ b/bootstrap/lib/stdlib/ebin/erl_pp.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/erl_scan.beam b/bootstrap/lib/stdlib/ebin/erl_scan.beam
index 1420d376f2..eb0ddd4397 100644
--- a/bootstrap/lib/stdlib/ebin/erl_scan.beam
+++ b/bootstrap/lib/stdlib/ebin/erl_scan.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/escript.beam b/bootstrap/lib/stdlib/ebin/escript.beam
index 5c09e4aa54..a76250e466 100644
--- a/bootstrap/lib/stdlib/ebin/escript.beam
+++ b/bootstrap/lib/stdlib/ebin/escript.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/ets.beam b/bootstrap/lib/stdlib/ebin/ets.beam
index 9ade9e2edd..ec0a566d14 100644
--- a/bootstrap/lib/stdlib/ebin/ets.beam
+++ b/bootstrap/lib/stdlib/ebin/ets.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/filename.beam b/bootstrap/lib/stdlib/ebin/filename.beam
index 69af1ef3c2..d8c81df4d9 100644
--- a/bootstrap/lib/stdlib/ebin/filename.beam
+++ b/bootstrap/lib/stdlib/ebin/filename.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/io.beam b/bootstrap/lib/stdlib/ebin/io.beam
index fd788a8160..7af592caa0 100644
--- a/bootstrap/lib/stdlib/ebin/io.beam
+++ b/bootstrap/lib/stdlib/ebin/io.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/io_lib.beam b/bootstrap/lib/stdlib/ebin/io_lib.beam
index 23d5122581..c0af612d77 100644
--- a/bootstrap/lib/stdlib/ebin/io_lib.beam
+++ b/bootstrap/lib/stdlib/ebin/io_lib.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/io_lib_format.beam b/bootstrap/lib/stdlib/ebin/io_lib_format.beam
index 25f8f7b37a..cfebe1597a 100644
--- a/bootstrap/lib/stdlib/ebin/io_lib_format.beam
+++ b/bootstrap/lib/stdlib/ebin/io_lib_format.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/io_lib_fread.beam b/bootstrap/lib/stdlib/ebin/io_lib_fread.beam
index a06b3d3c8a..bebe0a6c75 100644
--- a/bootstrap/lib/stdlib/ebin/io_lib_fread.beam
+++ b/bootstrap/lib/stdlib/ebin/io_lib_fread.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/log_mf_h.beam b/bootstrap/lib/stdlib/ebin/log_mf_h.beam
index 70b887857c..04c1bf5824 100644
--- a/bootstrap/lib/stdlib/ebin/log_mf_h.beam
+++ b/bootstrap/lib/stdlib/ebin/log_mf_h.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/ordsets.beam b/bootstrap/lib/stdlib/ebin/ordsets.beam
index 48effb764e..c3f2c3b7b1 100644
--- a/bootstrap/lib/stdlib/ebin/ordsets.beam
+++ b/bootstrap/lib/stdlib/ebin/ordsets.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/proc_lib.beam b/bootstrap/lib/stdlib/ebin/proc_lib.beam
index 690b3efe07..8a40aa650d 100644
--- a/bootstrap/lib/stdlib/ebin/proc_lib.beam
+++ b/bootstrap/lib/stdlib/ebin/proc_lib.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/proplists.beam b/bootstrap/lib/stdlib/ebin/proplists.beam
index 9b63909024..bed96c6b1a 100644
--- a/bootstrap/lib/stdlib/ebin/proplists.beam
+++ b/bootstrap/lib/stdlib/ebin/proplists.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/re.beam b/bootstrap/lib/stdlib/ebin/re.beam
index fb8888ad58..8f763f66bf 100644
--- a/bootstrap/lib/stdlib/ebin/re.beam
+++ b/bootstrap/lib/stdlib/ebin/re.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/stdlib.app b/bootstrap/lib/stdlib/ebin/stdlib.app
index 6aac1e2f19..ac8b4ec113 100644
--- a/bootstrap/lib/stdlib/ebin/stdlib.app
+++ b/bootstrap/lib/stdlib/ebin/stdlib.app
@@ -19,7 +19,7 @@
%%
{application, stdlib,
[{description, "ERTS CXC 138 10"},
- {vsn, "1.17.2"},
+ {vsn, "1.17.4"},
{modules, [array,
base64,
beam_lib,
diff --git a/bootstrap/lib/stdlib/ebin/stdlib.appup b/bootstrap/lib/stdlib/ebin/stdlib.appup
index ca89dcf43a..1b03a40251 100644
--- a/bootstrap/lib/stdlib/ebin/stdlib.appup
+++ b/bootstrap/lib/stdlib/ebin/stdlib.appup
@@ -1 +1 @@
-{"1.17.2",[],[]}.
+{"1.17.3",[],[]}.
diff --git a/bootstrap/lib/stdlib/ebin/supervisor.beam b/bootstrap/lib/stdlib/ebin/supervisor.beam
index 13cb6032a9..124920f0a5 100644
--- a/bootstrap/lib/stdlib/ebin/supervisor.beam
+++ b/bootstrap/lib/stdlib/ebin/supervisor.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/timer.beam b/bootstrap/lib/stdlib/ebin/timer.beam
index 1f84ff37ac..b4d979c577 100644
--- a/bootstrap/lib/stdlib/ebin/timer.beam
+++ b/bootstrap/lib/stdlib/ebin/timer.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/unicode.beam b/bootstrap/lib/stdlib/ebin/unicode.beam
index cc3a3c1859..2a72ee9af6 100644
--- a/bootstrap/lib/stdlib/ebin/unicode.beam
+++ b/bootstrap/lib/stdlib/ebin/unicode.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/egen/erl_parse.erl b/bootstrap/lib/stdlib/egen/erl_parse.erl
index f15deb37f1..9999fad385 100644
--- a/bootstrap/lib/stdlib/egen/erl_parse.erl
+++ b/bootstrap/lib/stdlib/egen/erl_parse.erl
@@ -258,7 +258,8 @@ record_fields([{typed,Expr,TypeInfo}|Fields]) ->
{atom, La, _} ->
case has_undefined(TypeInfo) of
false ->
- lift_unions(abstract(undefined, La), TypeInfo);
+ TypeInfo2 = maybe_add_paren(TypeInfo),
+ lift_unions(abstract(undefined, La), TypeInfo2);
true ->
TypeInfo
end
@@ -279,6 +280,11 @@ has_undefined({type,_,union,Ts}) ->
has_undefined(_) ->
false.
+maybe_add_paren({ann_type,L,T}) ->
+ {paren_type,L,[{ann_type,L,T}]};
+maybe_add_paren(T) ->
+ T.
+
term(Expr) ->
try normalise(Expr)
catch _:_R -> ret_err(?line(Expr), "bad attribute")
@@ -556,7 +562,7 @@ get_attribute(L, Name) ->
get_attributes(L) ->
erl_scan:attributes_info(L).
--file("/usr/local/otp/releases/sles10_64_R14B_patched/lib/parsetools-2.0.4/include/yeccpre.hrl", 0).
+-file("/usr/local/otp/releases/sles10_32_R14B02_patched/lib/parsetools-2.0.5/include/yeccpre.hrl", 0).
%%
%% %CopyrightBegin%
%%
@@ -726,7 +732,7 @@ yecctoken2string({char,_,C}) -> io_lib:write_char(C);
yecctoken2string({var,_,V}) -> io_lib:format("~s", [V]);
yecctoken2string({string,_,S}) -> io_lib:write_unicode_string(S);
yecctoken2string({reserved_symbol, _, A}) -> io_lib:write(A);
-yecctoken2string({_Cat, _, Val}) -> io_lib:write(Val);
+yecctoken2string({_Cat, _, Val}) -> io_lib:format("~p",[Val]);
yecctoken2string({dot, _}) -> "'.'";
yecctoken2string({'$end', _}) ->
[];
@@ -739,7 +745,7 @@ yecctoken2string(Other) ->
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 742).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 748).
yeccpars2(0=S, Cat, Ss, Stack, T, Ts, Tzr) ->
yeccpars2_0(S, Cat, Ss, Stack, T, Ts, Tzr);
@@ -8195,7 +8201,7 @@ yeccpars2_39_(__Stack0) ->
[ __1 ]
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8198).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8204).
-compile({inline,yeccpars2_46_/1}).
-file("erl_parse.yrl", 434).
yeccpars2_46_(__Stack0) ->
@@ -8204,7 +8210,7 @@ yeccpars2_46_(__Stack0) ->
{ [ ] , ? line ( __1 ) }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8207).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8213).
-compile({inline,yeccpars2_70_/1}).
-file("erl_parse.yrl", 325).
yeccpars2_70_(__Stack0) ->
@@ -8213,7 +8219,7 @@ yeccpars2_70_(__Stack0) ->
{ tuple , ? line ( __1 ) , [ ] }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8216).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8222).
-compile({inline,yeccpars2_71_/1}).
-file("erl_parse.yrl", 326).
yeccpars2_71_(__Stack0) ->
@@ -8222,7 +8228,7 @@ yeccpars2_71_(__Stack0) ->
{ tuple , ? line ( __1 ) , __2 }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8225).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8231).
-compile({inline,yeccpars2_73_/1}).
-file("erl_parse.yrl", 408).
yeccpars2_73_(__Stack0) ->
@@ -8254,7 +8260,7 @@ yeccpars2_81_(__Stack0) ->
[ __1 | __3 ]
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8257).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8263).
-compile({inline,yeccpars2_82_/1}).
-file("erl_parse.yrl", 406).
yeccpars2_82_(__Stack0) ->
@@ -8287,7 +8293,7 @@ yeccpars2_88_(__Stack0) ->
[ __1 | __3 ]
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8290).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8296).
-compile({inline,yeccpars2_89_/1}).
-file("erl_parse.yrl", 381).
yeccpars2_89_(__Stack0) ->
@@ -8326,7 +8332,7 @@ yeccpars2_98_(__Stack0) ->
[ ]
end | __Stack0].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8329).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8335).
-compile({inline,yeccpars2_100_/1}).
-file("erl_parse.yrl", 427).
yeccpars2_100_(__Stack0) ->
@@ -8343,7 +8349,7 @@ yeccpars2_102_(__Stack0) ->
[ ]
end | __Stack0].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8346).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8352).
-compile({inline,yeccpars2_104_/1}).
-file("erl_parse.yrl", 424).
yeccpars2_104_(__Stack0) ->
@@ -8353,7 +8359,7 @@ yeccpars2_104_(__Stack0) ->
{ clause , L , [ { tuple , L , [ __1 , __3 , { var , L , '_' } ] } ] , __4 , __5 }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8356).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8362).
-compile({inline,yeccpars2_106_/1}).
-file("erl_parse.yrl", 421).
yeccpars2_106_(__Stack0) ->
@@ -8395,7 +8401,7 @@ yeccpars2_114_(__Stack0) ->
{ [ ] , __2 }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8398).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8404).
-compile({inline,yeccpars2_115_/1}).
-file("erl_parse.yrl", 452).
yeccpars2_115_(__Stack0) ->
@@ -8404,7 +8410,7 @@ yeccpars2_115_(__Stack0) ->
{ string , ? line ( __1 ) , element ( 3 , __1 ) ++ element ( 3 , __2 ) }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8407).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8413).
-compile({inline,yeccpars2_120_/1}).
-file("erl_parse.yrl", 386).
yeccpars2_120_(__Stack0) ->
@@ -8413,7 +8419,7 @@ yeccpars2_120_(__Stack0) ->
{ 'receive' , ? line ( __1 ) , [ ] , __3 , __4 }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8416).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8422).
-compile({inline,yeccpars2_122_/1}).
-file("erl_parse.yrl", 384).
yeccpars2_122_(__Stack0) ->
@@ -8422,7 +8428,7 @@ yeccpars2_122_(__Stack0) ->
{ 'receive' , ? line ( __1 ) , __2 }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8425).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8431).
-compile({inline,yeccpars2_125_/1}).
-file("erl_parse.yrl", 388).
yeccpars2_125_(__Stack0) ->
@@ -8439,7 +8445,7 @@ yeccpars2_131_(__Stack0) ->
[ __1 ]
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8442).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8448).
-compile({inline,yeccpars2_135_/1}).
-file("erl_parse.yrl", 323).
yeccpars2_135_(__Stack0) ->
@@ -8448,7 +8454,7 @@ yeccpars2_135_(__Stack0) ->
{ b_generate , ? line ( __2 ) , __1 , __3 }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8451).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8457).
-compile({inline,yeccpars2_137_/1}).
-file("erl_parse.yrl", 322).
yeccpars2_137_(__Stack0) ->
@@ -8465,7 +8471,7 @@ yeccpars2_139_(__Stack0) ->
[ __1 | __3 ]
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8468).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8474).
-compile({inline,yeccpars2_140_/1}).
-file("erl_parse.yrl", 315).
yeccpars2_140_(__Stack0) ->
@@ -8474,7 +8480,7 @@ yeccpars2_140_(__Stack0) ->
{ lc , ? line ( __1 ) , __2 , __4 }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8477).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8483).
-compile({inline,yeccpars2_141_/1}).
-file("erl_parse.yrl", 431).
yeccpars2_141_(__Stack0) ->
@@ -8491,7 +8497,7 @@ yeccpars2_143_(__Stack0) ->
[ __1 ]
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8494).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8500).
-compile({inline,yeccpars2_145_/1}).
-file("erl_parse.yrl", 371).
yeccpars2_145_(__Stack0) ->
@@ -8508,7 +8514,7 @@ yeccpars2_147_(__Stack0) ->
[ __1 | __3 ]
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8511).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8517).
-compile({inline,yeccpars2_148_/1}).
-file("erl_parse.yrl", 365).
yeccpars2_148_(__Stack0) ->
@@ -8532,7 +8538,7 @@ yeccpars2_151_(__Stack0) ->
[ ]
end | __Stack0].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8535).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8541).
-compile({inline,yeccpars2_157_/1}).
-file("erl_parse.yrl", 394).
yeccpars2_157_(__Stack0) ->
@@ -8541,7 +8547,7 @@ yeccpars2_157_(__Stack0) ->
{ 'fun' , ? line ( __1 ) , { function , element ( 3 , __2 ) , element ( 3 , __4 ) , element ( 3 , __6 ) } }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8544).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8550).
-compile({inline,yeccpars2_158_/1}).
-file("erl_parse.yrl", 392).
yeccpars2_158_(__Stack0) ->
@@ -8567,7 +8573,7 @@ yeccpars2_162_(__Stack0) ->
[ __1 | __3 ]
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8570).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8576).
-compile({inline,yeccpars2_163_/1}).
-file("erl_parse.yrl", 396).
yeccpars2_163_(__Stack0) ->
@@ -8576,7 +8582,7 @@ yeccpars2_163_(__Stack0) ->
build_fun ( ? line ( __1 ) , __2 )
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8579).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8585).
-compile({inline,yeccpars2_164_/1}).
-file("erl_parse.yrl", 214).
yeccpars2_164_(__Stack0) ->
@@ -8585,7 +8591,7 @@ yeccpars2_164_(__Stack0) ->
{ 'catch' , ? line ( __1 ) , __2 }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8588).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8594).
-compile({inline,yeccpars2_168_/1}).
-file("erl_parse.yrl", 375).
yeccpars2_168_(__Stack0) ->
@@ -8594,7 +8600,7 @@ yeccpars2_168_(__Stack0) ->
{ 'case' , ? line ( __1 ) , __2 , __4 }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8597).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8603).
-compile({inline,yeccpars2_170_/1}).
-file("erl_parse.yrl", 270).
yeccpars2_170_(__Stack0) ->
@@ -8603,7 +8609,7 @@ yeccpars2_170_(__Stack0) ->
{ block , ? line ( __1 ) , __2 }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8606).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8612).
-compile({inline,yeccpars2_172_/1}).
-file("erl_parse.yrl", 279).
yeccpars2_172_(__Stack0) ->
@@ -8612,7 +8618,7 @@ yeccpars2_172_(__Stack0) ->
{ nil , ? line ( __1 ) }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8615).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8621).
-compile({inline,yeccpars2_173_/1}).
-file("erl_parse.yrl", 280).
yeccpars2_173_(__Stack0) ->
@@ -8621,7 +8627,7 @@ yeccpars2_173_(__Stack0) ->
{ cons , ? line ( __1 ) , __2 , __3 }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8624).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8630).
-compile({inline,yeccpars2_175_/1}).
-file("erl_parse.yrl", 282).
yeccpars2_175_(__Stack0) ->
@@ -8638,7 +8644,7 @@ yeccpars2_178_(__Stack0) ->
__2
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8641).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8647).
-compile({inline,yeccpars2_180_/1}).
-file("erl_parse.yrl", 284).
yeccpars2_180_(__Stack0) ->
@@ -8662,7 +8668,7 @@ yeccpars2_186_(__Stack0) ->
[ __1 ]
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8665).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8671).
-compile({inline,yeccpars2_187_/1}).
-file("erl_parse.yrl", 287).
yeccpars2_187_(__Stack0) ->
@@ -8679,7 +8685,7 @@ yeccpars2_189_(__Stack0) ->
[ __1 | __3 ]
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8682).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8688).
-compile({inline,yeccpars2_190_/1}).
-file("erl_parse.yrl", 288).
yeccpars2_190_(__Stack0) ->
@@ -8688,7 +8694,7 @@ yeccpars2_190_(__Stack0) ->
{ bin , ? line ( __1 ) , __2 }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8691).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8697).
-compile({inline,yeccpars2_193_/1}).
-file("erl_parse.yrl", 317).
yeccpars2_193_(__Stack0) ->
@@ -8712,7 +8718,7 @@ yeccpars2_197_(__Stack0) ->
__2
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8715).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8721).
-compile({inline,yeccpars2_198_/1}).
-file("erl_parse.yrl", 294).
yeccpars2_198_(__Stack0) ->
@@ -8761,7 +8767,7 @@ yeccpars2_206_(__Stack0) ->
[ __1 | __3 ]
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8764).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8770).
-compile({inline,yeccpars2_207_/1}).
-file("erl_parse.yrl", 296).
yeccpars2_207_(__Stack0) ->
@@ -8770,7 +8776,7 @@ yeccpars2_207_(__Stack0) ->
? mkop1 ( __1 , __2 )
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8773).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8779).
-compile({inline,yeccpars2_208_/1}).
-file("erl_parse.yrl", 256).
yeccpars2_208_(__Stack0) ->
@@ -8787,7 +8793,7 @@ yeccpars2_210_(__Stack0) ->
__2
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8790).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8796).
-compile({inline,yeccpars2_212_/1}).
-file("erl_parse.yrl", 340).
yeccpars2_212_(__Stack0) ->
@@ -8812,7 +8818,7 @@ yeccpars2_219_(__Stack0) ->
[ ]
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8815).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8821).
-compile({inline,yeccpars2_221_/1}).
-file("erl_parse.yrl", 356).
yeccpars2_221_(__Stack0) ->
@@ -8821,7 +8827,7 @@ yeccpars2_221_(__Stack0) ->
{ record_field , ? line ( __1 ) , __1 , __3 }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8824).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8830).
-compile({inline,yeccpars2_223_/1}).
-file("erl_parse.yrl", 357).
yeccpars2_223_(__Stack0) ->
@@ -8846,7 +8852,7 @@ yeccpars2_226_(__Stack0) ->
__2
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8849).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8855).
-compile({inline,yeccpars2_227_/1}).
-file("erl_parse.yrl", 338).
yeccpars2_227_(__Stack0) ->
@@ -8863,7 +8869,7 @@ yeccpars2_229_(__Stack0) ->
[ __1 | __3 ]
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8866).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8872).
-compile({inline,yeccpars2_232_/1}).
-file("erl_parse.yrl", 217).
yeccpars2_232_(__Stack0) ->
@@ -8872,7 +8878,7 @@ yeccpars2_232_(__Stack0) ->
{ match , ? line ( __2 ) , __1 , __3 }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8875).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8881).
-compile({inline,yeccpars2_233_/1}).
-file("erl_parse.yrl", 218).
yeccpars2_233_(__Stack0) ->
@@ -8881,7 +8887,7 @@ yeccpars2_233_(__Stack0) ->
? mkop2 ( __1 , __2 , __3 )
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8884).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8890).
-compile({inline,yeccpars2_235_/1}).
-file("erl_parse.yrl", 221).
yeccpars2_235_(__Stack0) ->
@@ -8890,7 +8896,7 @@ yeccpars2_235_(__Stack0) ->
? mkop2 ( __1 , __2 , __3 )
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8893).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8899).
-compile({inline,yeccpars2_237_/1}).
-file("erl_parse.yrl", 224).
yeccpars2_237_(__Stack0) ->
@@ -8899,7 +8905,7 @@ yeccpars2_237_(__Stack0) ->
? mkop2 ( __1 , __2 , __3 )
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8902).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8908).
-compile({inline,yeccpars2_247_/1}).
-file("erl_parse.yrl", 228).
yeccpars2_247_(__Stack0) ->
@@ -8908,7 +8914,7 @@ yeccpars2_247_(__Stack0) ->
? mkop2 ( __1 , __2 , __3 )
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8911).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8917).
-compile({inline,yeccpars2_260_/1}).
-file("erl_parse.yrl", 236).
yeccpars2_260_(__Stack0) ->
@@ -8917,7 +8923,7 @@ yeccpars2_260_(__Stack0) ->
? mkop2 ( __1 , __2 , __3 )
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8920).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8926).
-compile({inline,yeccpars2_268_/1}).
-file("erl_parse.yrl", 240).
yeccpars2_268_(__Stack0) ->
@@ -8926,7 +8932,7 @@ yeccpars2_268_(__Stack0) ->
? mkop2 ( __1 , __2 , __3 )
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8929).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8935).
-compile({inline,yeccpars2_269_/1}).
-file("erl_parse.yrl", 232).
yeccpars2_269_(__Stack0) ->
@@ -8935,7 +8941,7 @@ yeccpars2_269_(__Stack0) ->
? mkop2 ( __1 , __2 , __3 )
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8938).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8944).
-compile({inline,yeccpars2_270_/1}).
-file("erl_parse.yrl", 362).
yeccpars2_270_(__Stack0) ->
@@ -8944,7 +8950,7 @@ yeccpars2_270_(__Stack0) ->
{ call , ? line ( __1 ) , __1 , element ( 1 , __2 ) }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8947).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8953).
-compile({inline,yeccpars2_273_/1}).
-file("erl_parse.yrl", 252).
yeccpars2_273_(__Stack0) ->
@@ -8953,7 +8959,7 @@ yeccpars2_273_(__Stack0) ->
{ remote , ? line ( __2 ) , __1 , __3 }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8956).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8962).
-compile({inline,yeccpars2_274_/1}).
-file("erl_parse.yrl", 258).
yeccpars2_274_(__Stack0) ->
@@ -8962,7 +8968,7 @@ yeccpars2_274_(__Stack0) ->
{ record_field , ? line ( __2 ) , __1 , __3 }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8965).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8971).
-compile({inline,yeccpars2_277_/1}).
-file("erl_parse.yrl", 344).
yeccpars2_277_(__Stack0) ->
@@ -8971,7 +8977,7 @@ yeccpars2_277_(__Stack0) ->
{ record , ? line ( __2 ) , __1 , element ( 3 , __3 ) , __4 }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8974).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8980).
-compile({inline,yeccpars2_279_/1}).
-file("erl_parse.yrl", 342).
yeccpars2_279_(__Stack0) ->
@@ -8980,7 +8986,7 @@ yeccpars2_279_(__Stack0) ->
{ record_field , ? line ( __2 ) , __1 , element ( 3 , __3 ) , __5 }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8983).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8989).
-compile({inline,yeccpars2_280_/1}).
-file("erl_parse.yrl", 435).
yeccpars2_280_(__Stack0) ->
@@ -8989,7 +8995,7 @@ yeccpars2_280_(__Stack0) ->
{ __2 , ? line ( __1 ) }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8992).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 8998).
-compile({inline,yeccpars2_281_/1}).
-file("erl_parse.yrl", 244).
yeccpars2_281_(__Stack0) ->
@@ -8998,7 +9004,7 @@ yeccpars2_281_(__Stack0) ->
? mkop1 ( __1 , __2 )
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9001).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9007).
-compile({inline,yeccpars2_284_/1}).
-file("erl_parse.yrl", 348).
yeccpars2_284_(__Stack0) ->
@@ -9007,7 +9013,7 @@ yeccpars2_284_(__Stack0) ->
{ record , ? line ( __2 ) , __1 , element ( 3 , __3 ) , __4 }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9010).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9016).
-compile({inline,yeccpars2_286_/1}).
-file("erl_parse.yrl", 346).
yeccpars2_286_(__Stack0) ->
@@ -9016,7 +9022,7 @@ yeccpars2_286_(__Stack0) ->
{ record_field , ? line ( __2 ) , __1 , element ( 3 , __3 ) , __5 }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9019).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9025).
-compile({inline,yeccpars2_288_/1}).
-file("erl_parse.yrl", 493).
yeccpars2_288_(__Stack0) ->
@@ -9025,7 +9031,7 @@ yeccpars2_288_(__Stack0) ->
{ clause , ? line ( __1 ) , element ( 3 , __1 ) , __2 , __3 , __4 }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9028).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9034).
-compile({inline,yeccpars2_289_/1}).
-file("erl_parse.yrl", 203).
yeccpars2_289_(__Stack0) ->
@@ -9090,7 +9096,7 @@ yeccpars2_318_(__Stack0) ->
[ __1 ]
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9093).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9099).
-compile({inline,yeccpars2_332_/1}).
-file("erl_parse.yrl", 152).
yeccpars2_332_(__Stack0) ->
@@ -9099,7 +9105,7 @@ yeccpars2_332_(__Stack0) ->
{ type , ? line ( __1 ) , tuple , [ ] }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9102).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9108).
-compile({inline,yeccpars2_333_/1}).
-file("erl_parse.yrl", 153).
yeccpars2_333_(__Stack0) ->
@@ -9108,7 +9114,7 @@ yeccpars2_333_(__Stack0) ->
{ type , ? line ( __1 ) , tuple , __2 }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9111).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9117).
-compile({inline,yeccpars2_335_/1}).
-file("erl_parse.yrl", 116).
yeccpars2_335_(__Stack0) ->
@@ -9117,7 +9123,7 @@ yeccpars2_335_(__Stack0) ->
{ ann_type , ? line ( __1 ) , [ __1 , __3 ] }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9120).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9126).
-compile({inline,yeccpars2_341_/1}).
-file("erl_parse.yrl", 159).
yeccpars2_341_(__Stack0) ->
@@ -9126,7 +9132,7 @@ yeccpars2_341_(__Stack0) ->
{ type , ? line ( __1 ) , 'fun' , [ ] }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9129).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9135).
-compile({inline,yeccpars2_345_/1}).
-file("erl_parse.yrl", 163).
yeccpars2_345_(__Stack0) ->
@@ -9144,7 +9150,7 @@ yeccpars2_346_(__Stack0) ->
__3
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9147).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9153).
-compile({inline,yeccpars2_352_/1}).
-file("erl_parse.yrl", 144).
yeccpars2_352_(__Stack0) ->
@@ -9154,7 +9160,7 @@ yeccpars2_352_(__Stack0) ->
[ __1 , __3 , [ ] ] }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9157).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9163).
-compile({inline,yeccpars2_353_/1}).
-file("erl_parse.yrl", 146).
yeccpars2_353_(__Stack0) ->
@@ -9172,7 +9178,7 @@ yeccpars2_355_(__Stack0) ->
build_gen_type ( __1 )
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9175).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9181).
-compile({inline,yeccpars2_356_/1}).
-file("erl_parse.yrl", 142).
yeccpars2_356_(__Stack0) ->
@@ -9182,7 +9188,7 @@ yeccpars2_356_(__Stack0) ->
normalise ( __1 ) , __3 }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9185).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9191).
-compile({inline,yeccpars2_358_/1}).
-file("erl_parse.yrl", 148).
yeccpars2_358_(__Stack0) ->
@@ -9191,7 +9197,7 @@ yeccpars2_358_(__Stack0) ->
{ type , ? line ( __1 ) , nil , [ ] }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9194).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9200).
-compile({inline,yeccpars2_360_/1}).
-file("erl_parse.yrl", 149).
yeccpars2_360_(__Stack0) ->
@@ -9200,7 +9206,7 @@ yeccpars2_360_(__Stack0) ->
{ type , ? line ( __1 ) , list , [ __2 ] }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9203).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9209).
-compile({inline,yeccpars2_362_/1}).
-file("erl_parse.yrl", 150).
yeccpars2_362_(__Stack0) ->
@@ -9210,7 +9216,7 @@ yeccpars2_362_(__Stack0) ->
nonempty_list , [ __2 ] }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9213).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9219).
-compile({inline,yeccpars2_365_/1}).
-file("erl_parse.yrl", 179).
yeccpars2_365_(__Stack0) ->
@@ -9237,7 +9243,7 @@ yeccpars2_371_(__Stack0) ->
build_bin_type ( [ __1 , __3 ] , __5 )
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9240).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9246).
-compile({inline,yeccpars2_373_/1}).
-file("erl_parse.yrl", 182).
yeccpars2_373_(__Stack0) ->
@@ -9247,7 +9253,7 @@ yeccpars2_373_(__Stack0) ->
[ __2 , abstract ( 0 , ? line ( __1 ) ) ] }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9250).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9256).
-compile({inline,yeccpars2_378_/1}).
-file("erl_parse.yrl", 187).
yeccpars2_378_(__Stack0) ->
@@ -9256,7 +9262,7 @@ yeccpars2_378_(__Stack0) ->
{ type , ? line ( __1 ) , binary , [ __2 , __4 ] }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9259).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9265).
-compile({inline,yeccpars2_379_/1}).
-file("erl_parse.yrl", 184).
yeccpars2_379_(__Stack0) ->
@@ -9266,7 +9272,7 @@ yeccpars2_379_(__Stack0) ->
[ abstract ( 0 , ? line ( __1 ) ) , __2 ] }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9269).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9275).
-compile({inline,yeccpars2_381_/1}).
-file("erl_parse.yrl", 167).
yeccpars2_381_(__Stack0) ->
@@ -9276,7 +9282,7 @@ yeccpars2_381_(__Stack0) ->
[ { type , ? line ( __1 ) , product , [ ] } , __4 ] }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9279).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9285).
-compile({inline,yeccpars2_383_/1}).
-file("erl_parse.yrl", 138).
yeccpars2_383_(__Stack0) ->
@@ -9293,7 +9299,7 @@ yeccpars2_387_(__Stack0) ->
[ __1 ]
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9296).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9302).
-compile({inline,yeccpars2_389_/1}).
-file("erl_parse.yrl", 154).
yeccpars2_389_(__Stack0) ->
@@ -9302,7 +9308,7 @@ yeccpars2_389_(__Stack0) ->
{ type , ? line ( __1 ) , record , [ __2 ] }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9305).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9311).
-compile({inline,yeccpars2_391_/1}).
-file("erl_parse.yrl", 176).
yeccpars2_391_(__Stack0) ->
@@ -9320,7 +9326,7 @@ yeccpars2_393_(__Stack0) ->
[ __1 | __3 ]
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9323).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9329).
-compile({inline,yeccpars2_394_/1}).
-file("erl_parse.yrl", 155).
yeccpars2_394_(__Stack0) ->
@@ -9330,7 +9336,7 @@ yeccpars2_394_(__Stack0) ->
record , [ __2 | __4 ] }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9333).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9339).
-compile({inline,yeccpars2_395_/1}).
-file("erl_parse.yrl", 135).
yeccpars2_395_(__Stack0) ->
@@ -9347,7 +9353,7 @@ yeccpars2_397_(__Stack0) ->
[ __1 | __3 ]
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9350).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9356).
-compile({inline,yeccpars2_400_/1}).
-file("erl_parse.yrl", 170).
yeccpars2_400_(__Stack0) ->
@@ -9365,7 +9371,7 @@ yeccpars2_402_(__Stack0) ->
lift_unions ( __1 , __3 )
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9368).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9374).
-compile({inline,yeccpars2_405_/1}).
-file("erl_parse.yrl", 122).
yeccpars2_405_(__Stack0) ->
@@ -9376,7 +9382,7 @@ yeccpars2_405_(__Stack0) ->
skip_paren ( __3 ) ] }
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9379).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9385).
-compile({inline,yeccpars2_406_/1}).
-file("erl_parse.yrl", 127).
yeccpars2_406_(__Stack0) ->
@@ -9386,7 +9392,7 @@ yeccpars2_406_(__Stack0) ->
__2 , skip_paren ( __3 ) )
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9389).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9395).
-compile({inline,yeccpars2_408_/1}).
-file("erl_parse.yrl", 131).
yeccpars2_408_(__Stack0) ->
@@ -9396,7 +9402,7 @@ yeccpars2_408_(__Stack0) ->
__2 , skip_paren ( __3 ) )
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9399).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9405).
-compile({inline,yeccpars2_410_/1}).
-file("erl_parse.yrl", 103).
yeccpars2_410_(__Stack0) ->
@@ -9422,7 +9428,7 @@ yeccpars2_415_(__Stack0) ->
build_def ( __1 , __3 )
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9425).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9431).
-compile({inline,yeccpars2_418_/1}).
-file("erl_parse.yrl", 109).
yeccpars2_418_(__Stack0) ->
@@ -9552,7 +9558,7 @@ yeccpars2_446_(__Stack0) ->
[ __1 | __3 ]
end | __Stack].
--file("/ldisk/pan/git/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9555).
+-file("/ldisk/bjorn/otp/bootstrap/lib/stdlib/egen/erl_parse.erl", 9561).
-compile({inline,yeccpars2_447_/1}).
-file("erl_parse.yrl", 90).
yeccpars2_447_(__Stack0) ->
@@ -9640,4 +9646,4 @@ yeccpars2_463_(__Stack0) ->
end | __Stack0].
--file("erl_parse.yrl", 1057).
+-file("erl_parse.yrl", 1063).
diff --git a/erts/aclocal.m4 b/erts/aclocal.m4
index 443d8622bf..a1211bbf0c 100644
--- a/erts/aclocal.m4
+++ b/erts/aclocal.m4
@@ -747,9 +747,124 @@ case "$THR_LIB_NAME" in
if test $found_win32_winnt = no; then
AC_MSG_ERROR([-D_WIN32_WINNT missing in CPPFLAGS])
fi
- ethr_have_native_atomics=yes
- ethr_have_native_spinlock=yes
+
AC_DEFINE(ETHR_WIN32_THREADS, 1, [Define if you have win32 threads])
+
+ have_ilckd=no
+ AC_MSG_CHECKING([for _InterlockedCompareExchange64()])
+ AC_TRY_LINK([
+ #define WIN32_LEAN_AND_MEAN
+ #include <windows.h>
+ ],
+ [
+ volatile __int64 *var;
+ _InterlockedCompareExchange64(var, (__int64) 1, (__int64) 0);
+ return 0;
+ ],
+ have_ilckd=yes)
+ AC_MSG_RESULT([$have_ilckd])
+ test $have_ilckd = yes && AC_DEFINE(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64, 1, [Define if you have _InterlockedCompareExchange64()])
+
+ AC_CHECK_SIZEOF(void *)
+ case "$ac_cv_sizeof_void_p-$have_ilckd" in
+ 8-no)
+ ethr_have_native_atomics=no
+ ethr_have_native_spinlock=no;;
+ *)
+ ethr_have_native_atomics=yes
+ ethr_have_native_spinlock=yes;;
+ esac
+
+ have_ilckd=no
+ AC_MSG_CHECKING([for _InterlockedDecrement64()])
+ AC_TRY_LINK([
+ #define WIN32_LEAN_AND_MEAN
+ #include <windows.h>
+ ],
+ [
+ volatile __int64 *var;
+ _InterlockedDecrement64(var);
+ return 0;
+ ],
+ have_ilckd=yes)
+ AC_MSG_RESULT([$have_ilckd])
+ test $have_ilckd = yes && AC_DEFINE(ETHR_HAVE__INTERLOCKEDDECREMENT64, 1, [Define if you have _InterlockedDecrement64()])
+
+ have_ilckd=no
+ AC_MSG_CHECKING([for _InterlockedIncrement64()])
+ AC_TRY_LINK([
+ #define WIN32_LEAN_AND_MEAN
+ #include <windows.h>
+ ],
+ [
+ volatile __int64 *var;
+ _InterlockedIncrement64(var);
+ return 0;
+ ],
+ have_ilckd=yes)
+ AC_MSG_RESULT([$have_ilckd])
+ test $have_ilckd = yes && AC_DEFINE(ETHR_HAVE__INTERLOCKEDINCREMENT64, 1, [Define if you have _InterlockedIncrement64()])
+
+ have_ilckd=no
+ AC_MSG_CHECKING([for _InterlockedExchangeAdd64()])
+ AC_TRY_LINK([
+ #define WIN32_LEAN_AND_MEAN
+ #include <windows.h>
+ ],
+ [
+ volatile __int64 *var;
+ _InterlockedExchangeAdd64(var, (__int64) 1);
+ return 0;
+ ],
+ have_ilckd=yes)
+ AC_MSG_RESULT([$have_ilckd])
+ test $have_ilckd = yes && AC_DEFINE(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64, 1, [Define if you have _InterlockedExchangeAdd64()])
+
+ have_ilckd=no
+ AC_MSG_CHECKING([for _InterlockedExchange64()])
+ AC_TRY_LINK([
+ #define WIN32_LEAN_AND_MEAN
+ #include <windows.h>
+ ],
+ [
+ volatile __int64 *var;
+ _InterlockedExchange64(var, (__int64) 1);
+ return 0;
+ ],
+ have_ilckd=yes)
+ AC_MSG_RESULT([$have_ilckd])
+ test $have_ilckd = yes && AC_DEFINE(ETHR_HAVE__INTERLOCKEDEXCHANGE64, 1, [Define if you have _InterlockedExchange64()])
+
+ have_ilckd=no
+ AC_MSG_CHECKING([for _InterlockedAnd64()])
+ AC_TRY_LINK([
+ #define WIN32_LEAN_AND_MEAN
+ #include <windows.h>
+ ],
+ [
+ volatile __int64 *var;
+ _InterlockedAnd64(var, (__int64) 1);
+ return 0;
+ ],
+ have_ilckd=yes)
+ AC_MSG_RESULT([$have_ilckd])
+ test $have_ilckd = yes && AC_DEFINE(ETHR_HAVE__INTERLOCKEDAND64, 1, [Define if you have _InterlockedAnd64()])
+
+ have_ilckd=no
+ AC_MSG_CHECKING([for _InterlockedOr64()])
+ AC_TRY_LINK([
+ #define WIN32_LEAN_AND_MEAN
+ #include <windows.h>
+ ],
+ [
+ volatile __int64 *var;
+ _InterlockedOr64(var, (__int64) 1);
+ return 0;
+ ],
+ have_ilckd=yes)
+ AC_MSG_RESULT([$have_ilckd])
+ test $have_ilckd = yes && AC_DEFINE(ETHR_HAVE__INTERLOCKEDOR64, 1, [Define if you have _InterlockedOr64()])
+
;;
pthread)
@@ -1087,6 +1202,28 @@ fi
AC_CHECK_SIZEOF(void *)
AC_DEFINE_UNQUOTED(ETHR_SIZEOF_PTR, $ac_cv_sizeof_void_p, [Define to the size of pointers])
+AC_CHECK_SIZEOF(int)
+AC_DEFINE_UNQUOTED(ETHR_SIZEOF_INT, $ac_cv_sizeof_int, [Define to the size of int])
+AC_CHECK_SIZEOF(long)
+AC_DEFINE_UNQUOTED(ETHR_SIZEOF_LONG, $ac_cv_sizeof_long, [Define to the size of long])
+AC_CHECK_SIZEOF(long long)
+AC_DEFINE_UNQUOTED(ETHR_SIZEOF_LONG_LONG, $ac_cv_sizeof_long_long, [Define to the size of long long])
+AC_CHECK_SIZEOF(__int64)
+AC_DEFINE_UNQUOTED(ETHR_SIZEOF___INT64, $ac_cv_sizeof___int64, [Define to the size of __int64])
+
+
+case X$erl_xcomp_bigendian in
+ X) ;;
+ Xyes|Xno) ac_cv_c_bigendian=$erl_xcomp_bigendian;;
+ *) AC_MSG_ERROR([Bad erl_xcomp_bigendian value: $erl_xcomp_bigendian]);;
+esac
+
+AC_C_BIGENDIAN
+
+if test "$ac_cv_c_bigendian" = "yes"; then
+ AC_DEFINE(ETHR_BIGENDIAN, 1, [Define if bigendian])
+fi
+
AC_ARG_ENABLE(native-ethr-impls,
AS_HELP_STRING([--disable-native-ethr-impls],
[disable native ethread implementations]),
diff --git a/erts/autoconf/configure.vxworks b/erts/autoconf/configure.vxworks
index 14fbf766dc..23a93faa31 100755
--- a/erts/autoconf/configure.vxworks
+++ b/erts/autoconf/configure.vxworks
@@ -2,7 +2,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2009. All Rights Reserved.
+# Copyright Ericsson AB 1997-2011. 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
diff --git a/erts/autoconf/vxworks/sed.general b/erts/autoconf/vxworks/sed.general
index 551458daf5..88697b788d 100644
--- a/erts/autoconf/vxworks/sed.general
+++ b/erts/autoconf/vxworks/sed.general
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2009. All Rights Reserved.
+# Copyright Ericsson AB 1997-2011. 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
diff --git a/erts/configure.in b/erts/configure.in
index 6e983a07b0..31d1d55b8a 100644
--- a/erts/configure.in
+++ b/erts/configure.in
@@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script. -*-m4-*-
dnl %CopyrightBegin%
dnl
-dnl Copyright Ericsson AB 1997-2010. All Rights Reserved.
+dnl Copyright Ericsson AB 1997-2011. All Rights Reserved.
dnl
dnl The contents of this file are subject to the Erlang Public License,
dnl Version 1.1, (the "License"); you may not use this file except in
@@ -580,6 +580,11 @@ AC_SUBST(WFLAGS)
AC_SUBST(CFLAG_RUNTIME_LIBRARY_PATH)
AC_CHECK_SIZEOF(void *) # Needed for ARCH and smp checks below
+if test "x$ac_cv_sizeof_void_p" = x8; then
+ AC_SUBST(EXTERNAL_WORD_SIZE, 64)
+else
+ AC_SUBST(EXTERNAL_WORD_SIZE, 32)
+fi
dnl
dnl Figure out operating system and cpu architecture
@@ -1788,7 +1793,7 @@ AC_CHECK_FUNCS([getipnodebyname getipnodebyaddr gethostbyname2])
AC_CHECK_FUNCS([ieee_handler fpsetmask finite isnan isinf res_gethostbyname dlopen \
pread pwrite writev memmove strerror strerror_r strncasecmp \
- gethrtime localtime_r gmtime_r mmap mremap memcpy mallopt \
+ gethrtime localtime_r gmtime_r inet_pton mmap mremap memcpy mallopt \
sbrk _sbrk __sbrk brk _brk __brk \
flockfile fstat strlcpy strlcat setsid posix2time setlocale nl_langinfo poll])
@@ -2394,9 +2399,15 @@ if test "$cross_compiling" != "yes" && test X${enable_hipe} != Xno; then
if test -z "$M4"; then
enable_hipe=no
AC_MSG_NOTICE([HiPE disabled as no valid m4 is found in PATH])
+ elif test "$enable_halfword_emulator" = "yes"; then
+ if test X${enable_hipe} = Xyes; then
+ AC_MSG_ERROR([HiPE can not be combined with halfword emulator (yet)])
+ else
+ AC_MSG_NOTICE([HiPE auto-disabled on halfword emulator])
+ fi
else
case "$ARCH-$OPSYS" in
- x86-linux|amd64-linux|x86-darwin*|amd64-darwin*|ppc-linux|ppc-darwin|arm-linux|amd64-freebsd|x86-freebsd|x86-sol2|amd64-sol2|ultrasparc-linux)
+ x86-linux|amd64-linux|x86-darwin*|amd64-darwin*|ppc-linux|ppc64-linux|ppc-darwin|arm-linux|amd64-freebsd|x86-freebsd|x86-sol2|amd64-sol2|ultrasparc-linux)
enable_hipe=yes
;;
esac
@@ -3655,6 +3666,12 @@ case "$erl_xcomp_without_sysroot-$with_ssl" in
urp="uninstall/openssl_is1/inno setup: app path"
rp="$wrp$urp"
if regtool -q get "$rp" > /dev/null; then
+ true
+ else
+ urp="uninstall/openssl (32-bit)_is1/inno setup: app path"
+ rp="$wrp$urp"
+ fi
+ if regtool -q get "$rp" > /dev/null; then
ssl_install_dir=`regtool -q get "$rp"`
# Try hard to get rid of spaces...
if cygpath -d "$ssl_install_dir" > /dev/null 2>&1; then
diff --git a/erts/doc/src/driver.xml b/erts/doc/src/driver.xml
index db455312ec..2b1ed398ee 100644
--- a/erts/doc/src/driver.xml
+++ b/erts/doc/src/driver.xml
@@ -63,7 +63,8 @@
<p>This is a simple driver for accessing a postgres
database using the libpq C client library. Postgres
is used because it's free and open source. For information
- on postgres, refer to the website www.postgres.org.</p>
+ on postgres, refer to the website
+ <url href="http://www.postgres.org">www.postgres.org</url>.</p>
<p>The driver is synchronous, it uses the synchronous calls of
the client library. This is only for simplicity, and is
generally not good, since it will
@@ -210,7 +211,7 @@ static void stop(ErlDrvData drv_data)
input data is a string paramater for <c><![CDATA[connect]]></c> and
<c><![CDATA[select]]></c>. The returned data consists of Erlang terms.</p>
<p>The functions <c><![CDATA[get_s]]></c> and <c><![CDATA[ei_x_to_new_binary]]></c> are
- utilities that is used to make the code shorter. <c><![CDATA[get_s]]></c>
+ utilities that are used to make the code shorter. <c><![CDATA[get_s]]></c>
duplicates the string and zero-terminates it, since the
postgres client library wants that. <c><![CDATA[ei_x_to_new_binary]]></c>
takes an <c><![CDATA[ei_x_buff]]></c> buffer and allocates a binary and
@@ -244,7 +245,7 @@ static int control(ErlDrvData drv_data, unsigned int command, char *buf,
return r;
}
]]></code>
- <p>In <c><![CDATA[do_connect]]></c> is where we log in to the database. If the connection
+ <p><c><![CDATA[do_connect]]></c> is where we log in to the database. If the connection
was successful we store the connection handle in our driver
data, and return ok. Otherwise, we return the error message
from postgres, and store <c><![CDATA[NULL]]></c> in the driver data.</p>
@@ -264,7 +265,7 @@ static int do_connect(const char *s, our_data_t* data, ei_x_buff* x)
}
]]></code>
<p>If we are connected (if the connection handle is not <c><![CDATA[NULL]]></c>),
- we log out from the database. We need to check if a we should
+ we log out from the database. We need to check if we should
encode an ok, since we might get here from the <c><![CDATA[stop]]></c>
function, which doesn't return data to the emulator.</p>
<code type="none"><![CDATA[
@@ -279,7 +280,7 @@ static int do_disconnect(our_data_t* data, ei_x_buff* x)
return 0;
}
]]></code>
- <p>We execute a query and encodes the result. Encoding is done
+ <p>We execute a query and encode the result. Encoding is done
in another C module, <c><![CDATA[pg_encode.c]]></c> which is also provided
as sample code.</p>
<code type="none"><![CDATA[
@@ -291,7 +292,7 @@ static int do_select(const char* s, our_data_t* data, ei_x_buff* x)
return 0;
}
]]></code>
- <p>Here we simply checks the result from postgres, and
+ <p>Here we simply check the result from postgres, and
if it's data we encode it as lists of lists with
column data. Everything from postgres is C strings,
so we just use <c><![CDATA[ei_x_encode_string]]></c> to send
@@ -392,7 +393,7 @@ disconnect(Port) ->
select(Port, Query) ->
binary_to_term(port_control(Port, ?DRV_SELECT, Query)).
]]></code>
- <p>The api is simple: <c><![CDATA[connect/1]]></c> loads the driver, opens it
+ <p>The API is simple: <c><![CDATA[connect/1]]></c> loads the driver, opens it
and logs on to the database, returning the Erlang port
if successful, <c><![CDATA[select/2]]></c> sends a query to the driver,
and returns the result, <c><![CDATA[disconnect/1]]></c> closes the
@@ -417,7 +418,7 @@ select(Port, Query) ->
<p>Sometimes database queries can take long time to
complete, in our <c><![CDATA[pg_sync]]></c> driver, the emulator
halts while the driver is doing its job. This is
- often not acceptable, since no other Erlang processes
+ often not acceptable, since no other Erlang process
gets a chance to do anything. To improve on our
postgres driver, we reimplement it using the asynchronous
calls in LibPQ.</p>
@@ -472,7 +473,7 @@ typedef struct our_data_t {
whether the driver is waiting for a connection or waiting
for the result of a query. (This is needed since the entry
<c><![CDATA[ready_io]]></c> will be called both when connecting and
- when there is query result.)</p>
+ when there is a query result.)</p>
<code type="none"><![CDATA[
static int do_connect(const char *s, our_data_t* data)
{
@@ -571,7 +572,7 @@ static void ready_io(ErlDrvData drv_data, ErlDrvEvent event)
connection is successful, or error if it's not. If the
connection is not yet established, we simply return; <c><![CDATA[ready_io]]></c>
will be called again.</p>
- <p>If we have result from a connect, indicated that we have data in
+ <p>If we have a result from a connect, indicated by having data in
the <c><![CDATA[x]]></c> buffer, we no longer need to select on
output (<c><![CDATA[ready_output]]></c>), so we remove this by calling
<c><![CDATA[driver_select]]></c>.</p>
@@ -630,9 +631,9 @@ return_port_data(Port) ->
message queue. The function <c><![CDATA[return_port_data]]></c> above
receives data from the port. Since the data is in
binary format, we use <c><![CDATA[binary_to_term/1]]></c> to convert
- it to Erlang term. Note that the driver is opened in
- binary mode, <c><![CDATA[open_port/2]]></c> is called with the option
- <c><![CDATA[[binary]]]></c>. This means that data sent from the driver
+ it to an Erlang term. Note that the driver is opened in
+ binary mode (<c><![CDATA[open_port/2]]></c> is called with the option
+ <c><![CDATA[[binary]]]></c>). This means that data sent from the driver
to the emulator is sent as binaries. Without the <c><![CDATA[binary]]></c>
option, they would have been lists of integers.</p>
</section>
@@ -646,15 +647,15 @@ return_port_data(Port) ->
of a list of integers. For large lists (more than 100000
elements), this will take some time, so we will perform this
as an asynchronous task.</p>
- <p>The asynchronous api for drivers are quite complicated. First
+ <p>The asynchronous API for drivers is quite complicated. First
of all, the work must be prepared. In our example we do this
in <c><![CDATA[output]]></c>. We could have used <c><![CDATA[control]]></c> just as well,
but we want some variation in our examples. In our driver, we allocate
- a structure that contains all needed for the asynchronous task
+ a structure that contains anything that's needed for the asynchronous task
to do the work. This is done in the main emulator thread.
Then the asynchronous function is called from a driver thread,
- separate from the main emulator thread. Note that the driver-
- functions are not reentrant, so they shouldn't be used.
+ separate from the main emulator thread. Note that the driver-functions
+ are not reentrant, so they shouldn't be used.
Finally, after the function is completed, the driver callback
<c><![CDATA[ready_async]]></c> is called from the main emulator thread,
this is where we return the result to Erlang. (We can't
@@ -692,7 +693,7 @@ static ErlDrvEntry next_perm_driver_entry = {
be sent later from the <c><![CDATA[ready_async]]></c> call-back.</p>
<p>The <c><![CDATA[async_data]]></c> will be passed to the <c><![CDATA[do_perm]]></c> function.
We do not use a <c><![CDATA[async_free]]></c> function (the last argument to
- <c><![CDATA[driver_async]]></c>, it's only used if the task is cancelled
+ <c><![CDATA[driver_async]]></c>), it's only used if the task is cancelled
programmatically.</p>
<code type="none"><![CDATA[
struct our_async_data {
@@ -743,7 +744,7 @@ static void ready_async(ErlDrvData drv_data, ErlDrvThreadData async_data)
ErlDrvPort port = reinterpret_cast<ErlDrvPort>(drv_data);
our_async_data* d = reinterpret_cast<our_async_data*>(async_data);
int n = d->data.size(), result_n = n*2 + 3;
- ErlDrvTermData* result = new ErlDrvTermData[result_n], * rp = result;
+ ErlDrvTermData *result = new ErlDrvTermData[result_n], *rp = result;
for (vector<int>::iterator i = d->data.begin();
i != d->data.end(); ++i) {
*rp++ = ERL_DRV_INT;
diff --git a/erts/doc/src/driver_entry.xml b/erts/doc/src/driver_entry.xml
index dd949d4048..8bdd154cb9 100644
--- a/erts/doc/src/driver_entry.xml
+++ b/erts/doc/src/driver_entry.xml
@@ -4,7 +4,7 @@
<cref>
<header>
<copyright>
- <year>2001</year><year>2010</year>
+ <year>2001</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -36,7 +36,7 @@
<description>
<p>As of erts version 5.5.3 the driver interface has been extended
(see <seealso marker="driver_entry#extended_marker">extended marker</seealso>).
- The extended interface introduce
+ The extended interface introduces
<seealso marker="erl_driver#version_management">version management</seealso>,
the possibility to pass capability flags
(see <seealso marker="driver_entry#driver_flags">driver flags</seealso>)
@@ -45,21 +45,21 @@
<note>
<p>Old drivers (compiled with an <c>erl_driver.h</c> from an
earlier erts version than 5.5.3) have to be recompiled
- (but does not have to use the extended interface).</p>
+ (but do not have to use the extended interface).</p>
</note>
<p>The <c>driver_entry</c> structure is a C struct that all erlang
- drivers defines. It contains entry points for the erlang driver
+ drivers define. It contains entry points for the erlang driver
that are called by the erlang emulator when erlang code accesses
the driver.</p>
<p>
<marker id="emulator"></marker>
The <seealso marker="driver_entry">erl_driver</seealso> driver
- API functions needs a port handle
+ API functions need a port handle
that identifies the driver instance (and the port in the
emulator). This is only passed to the <c>start</c> function, but
not to the other functions. The <c>start</c> function returns a
driver-defined handle that is passed to the other functions. A
- common practice is to have the <c>start</c> function allocating
+ common practice is to have the <c>start</c> function allocate
some application-defined structure and stash the <c>port</c>
handle in it, to use it later with the driver API functions.</p>
<p>The driver call-back functions are called synchronously from the
@@ -121,7 +121,7 @@ typedef struct erl_drv_entry {
the port */
void (*ready_input)(ErlDrvData drv_data, ErlDrvEvent event);
/* called when we have input from one of
- the driver's handles) */
+ the driver's handles */
void (*ready_output)(ErlDrvData drv_data, ErlDrvEvent event);
/* called when output is possible to one of
the driver's handles */
@@ -133,7 +133,7 @@ typedef struct erl_drv_entry {
int (*control)(ErlDrvData drv_data, unsigned int command, char *buf,
int len, char **rbuf, int rlen);
/* "ioctl" for drivers - invoked by
- port_control/3) */
+ port_control/3 */
void (*timeout)(ErlDrvData drv_data); /* Handling of timeout in driver */
void (*outputv)(ErlDrvData drv_data, ErlIOVec *ev);
/* called when we have output from erlang
@@ -146,7 +146,7 @@ typedef struct erl_drv_entry {
before 'stop' can be called */
int (*call)(ErlDrvData drv_data, unsigned int command, char *buf,
int len, char **rbuf, int rlen, unsigned int *flags);
- /* Works mostly like 'control', a syncronous
+ /* Works mostly like 'control', a synchronous
call into the driver. */
void (*event)(ErlDrvData drv_data, ErlDrvEvent event,
ErlDrvEventData event_data);
@@ -219,6 +219,10 @@ typedef struct erl_drv_entry {
completes, write to the pipe (use <c>SetEvent</c> on
Windows), this will make the emulator call
<c>ready_input</c> or <c>ready_output</c>.</p>
+ <p>Spurious events may happen. That is, calls to <c>ready_input</c>
+ or <c>ready_output</c> even though no real events are signaled. In
+ reality it should be rare (and OS dependant), but a robust driver
+ must nevertheless be able to handle such cases.</p>
</item>
<tag><marker id="driver_name"/>char *driver_name</tag>
<item>
@@ -235,7 +239,7 @@ typedef struct erl_drv_entry {
</item>
<tag>void *handle</tag>
<item>
- <p>This field is reserved for the emulators internal use. The
+ <p>This field is reserved for the emulator's internal use. The
emulator will modify this field; therefore, it is important
that the <c>driver_entry</c> isn't declared <c>const</c>.</p>
</item>
@@ -399,7 +403,7 @@ typedef struct erl_drv_entry {
<tag>void *handle2</tag>
<item>
<p>
- This field is reserved for the emulators internal use. The
+ This field is reserved for the emulator's internal use. The
emulator will modify this field; therefore, it is important
that the <c>driver_entry</c> isn't declared <c>const</c>.
</p>
diff --git a/erts/doc/src/epmd.xml b/erts/doc/src/epmd.xml
index 474230cb38..8c3c1e5237 100644
--- a/erts/doc/src/epmd.xml
+++ b/erts/doc/src/epmd.xml
@@ -116,6 +116,16 @@
<p>These options are available when starting the actual name server. The name server is normally started automatically by the <c>erl</c> command (if not already available), but it can also be started at i.e. system start-up.</p>
<taglist>
+ <tag><c><![CDATA[-address List]]></c></tag>
+ <item>
+ <p>Let this instance of <c>epmd</c> listen only on the
+ comma-separated list of IP addresses and on the loopback address
+ (which is implicitely added to the list if it has not been
+ specified). This can also be set using the
+ <c><![CDATA[ERL_EPMD_ADDRESS]]></c> environment variable, see the
+ section <seealso marker="#environment_variables">Environment
+ variables</seealso> below.</p>
+ </item>
<tag><c><![CDATA[-port No]]></c></tag>
<item>
<p>Let this instance of epmd listen to another TCP port than
@@ -228,6 +238,15 @@
<marker id="environment_variables"></marker>
<title>Environment variables</title>
<taglist>
+ <tag><c><![CDATA[ERL_EPMD_ADDRESS]]></c></tag>
+ <item>
+ <p>This environment variable may be set to a comma-separated
+ list of IP addresses, in which case the <c>epmd</c> daemon
+ will listen only on the specified address(es) and on the
+ loopback address (which is implicitely added to the list if it
+ has not been specified). The default behaviour is to listen on
+ all available IP addresses.</p>
+ </item>
<tag><c><![CDATA[ERL_EPMD_PORT]]></c></tag>
<item>
<p>This environment variable can contain the port number epmd will use.
diff --git a/erts/doc/src/erl.xml b/erts/doc/src/erl.xml
index 77bd952d41..514ee5ffaf 100644
--- a/erts/doc/src/erl.xml
+++ b/erts/doc/src/erl.xml
@@ -4,7 +4,7 @@
<comref>
<header>
<copyright>
- <year>1996</year><year>2010</year>
+ <year>1996</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -231,7 +231,8 @@
<tag><c><![CDATA[-detached]]></c></tag>
<item>
<p>Starts the Erlang runtime system detached from the system
- console. Useful for running daemons and backgrounds processes.</p>
+ console. Useful for running daemons and backgrounds processes. Implies
+ <c><![CDATA[-noinput]]></c>.</p>
</item>
<tag><c><![CDATA[-emu_args]]></c></tag>
<item>
@@ -1003,6 +1004,15 @@
add to the code path.
See <seealso marker="kernel:code">code(3)</seealso>.</p>
</item>
+ <tag><c><![CDATA[ERL_EPMD_ADDRESS]]></c></tag>
+ <item>
+ <p>This environment variable may be set to a comma-separated
+ list of IP addresses, in which case the
+ <seealso marker="epmd">epmd</seealso> daemon
+ will listen only on the specified address(es) and on the
+ loopback address (which is implicitely added to the list if it
+ has not been specified).</p>
+ </item>
<tag><c><![CDATA[ERL_EPMD_PORT]]></c></tag>
<item>
<p>This environment variable can contain the port number to use when
@@ -1015,6 +1025,49 @@
</section>
<section>
+ <marker id="configuration"></marker>
+ <title>Configuration</title>
+ <p>The standard Erlang/OTP system can be re-configured to change the default
+ behavior on start-up.</p>
+ <taglist>
+ <tag>The .erlang Start-up File</tag>
+ <item>
+ <p>When Erlang/OTP is started, the system searches for a file named .erlang
+ in the directory where Erlang/OTP is started. If not found, the user's home
+ directory is searched for an .erlang file.</p>
+ <p>If an .erlang file is found, it is assumed to contain valid Erlang expressions.
+ These expressions are evaluated as if they were input to the shell.</p>
+ <p>A typical .erlang file contains a set of search paths, for example:</p>
+ <code type="none"><![CDATA[
+ io:format("executing user profile in HOME/.erlang\n",[]).
+ code:add_path("/home/calvin/test/ebin").
+ code:add_path("/home/hobbes/bigappl-1.2/ebin").
+ io:format(".erlang rc finished\n",[]).
+ ]]></code>
+ </item>
+ <tag>user_default and shell_default</tag>
+ <item>
+ <p>Functions in the shell which are not prefixed by a module name are assumed
+ to be functional objects (Funs), built-in functions (BIFs), or belong to the
+ module user_default or shell_default.</p>
+ <p>To include private shell commands, define them in a module user_default and
+ add the following argument as the first line in the .erlang file.</p>
+ <code type="none"><![CDATA[
+ code:load_abs("..../user_default").
+ ]]></code>
+ </item>
+ <tag>erl</tag>
+ <item>
+ <p>If the contents of .erlang are changed and a private version of
+ user_default is defined, it is possible to customize the Erlang/OTP environment.
+ More powerful changes can be made by supplying command line arguments in the
+ start-up script erl. Refer to erl(1) and <seealso marker="init">init(3)</seealso>
+ for further information.</p>
+ </item>
+ </taglist>
+ </section>
+
+ <section>
<title>SEE ALSO</title>
<p><seealso marker="init">init(3)</seealso>,
<seealso marker="erl_prim_loader">erl_prim_loader(3)</seealso>,
diff --git a/erts/doc/src/erl_dist_protocol.xml b/erts/doc/src/erl_dist_protocol.xml
index 1fe7ac7ecd..6c725fc82d 100644
--- a/erts/doc/src/erl_dist_protocol.xml
+++ b/erts/doc/src/erl_dist_protocol.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2007</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/erts/doc/src/erl_driver.xml b/erts/doc/src/erl_driver.xml
index 497a2fa01d..066a2a4b92 100644
--- a/erts/doc/src/erl_driver.xml
+++ b/erts/doc/src/erl_driver.xml
@@ -56,16 +56,16 @@
instance is connected to an Erlang port. Every port has a port
owner process. Communication with the port is normally done
through the port owner process.</p>
- <p>Most of the functions takes the <c>port</c> handle as an
+ <p>Most of the functions take the <c>port</c> handle as an
argument. This identifies the driver instance. Note that this
port handle must be stored by the driver, it is not given when
the driver is called from the emulator (see
<seealso marker="driver_entry#emulator">driver_entry</seealso>).</p>
- <p>Some of the functions takes a parameter of type
+ <p>Some of the functions take a parameter of type
<c>ErlDrvBinary</c>, a driver binary. It should be both
- allocated and freed by the caller. Using a binary directly avoid
+ allocated and freed by the caller. Using a binary directly avoids
one extra copying of data.</p>
- <p>Many of the output functions has a "header buffer", with
+ <p>Many of the output functions have a "header buffer", with
<c>hbuf</c> and <c>hlen</c> parameters. This buffer is sent as a
list before the binary (or list, depending on port mode) that is
sent. This is convenient when matching on messages received from
@@ -92,7 +92,7 @@
with SMP support without being rewritten if driver
level locking is used.</p>
<note>
- <p>It is assumed that drivers does not access other drivers. If
+ <p>It is assumed that drivers do not access other drivers. If
drivers should access each other they have to provide their own
mechanism for thread safe synchronization. Such "inter driver
communication" is strongly discouraged.</p>
@@ -113,12 +113,12 @@
call-backs may be made from different threads.</p>
</note>
<p>Most functions in this API are <em>not</em> thread-safe, i.e.,
- they may <em>not</em> be called from an arbitrary thread. Function
+ they may <em>not</em> be called from an arbitrary thread. Functions
that are not documented as thread-safe may only be called from
driver call-backs or function calls descending from a driver
call-back call. Note that driver call-backs may be called from
different threads. This, however, is not a problem for any
- functions in this API, since the emulator have control over
+ function in this API, since the emulator has control over
these threads.</p>
<note>
<p>Functions not explicitly documented as thread-safe are
@@ -155,10 +155,10 @@
more information.</p>
</item>
<tag>Output functions</tag>
- <item>With the output functions, the driver sends data back
+ <item>With the output functions, the driver sends data back to
the emulator. They will be received as messages by the port owner
process, see <c>open_port/2</c>. The vector function and the
- function taking a driver binary is faster, because that avoid
+ function taking a driver binary are faster, because they avoid
copying the data buffer. There is also a fast way of sending
terms from the driver, without going through the binary term
format.</item>
@@ -193,14 +193,14 @@
use functionality from the POSIX thread API or the Windows
native thread API.
</p>
- <p>The Erlang driver thread API only return error codes when it is
+ <p>The Erlang driver thread API only returns error codes when it is
reasonable to recover from an error condition. If it isn't reasonable
to recover from an error condition, the whole runtime system is
terminated. For example, if a create mutex operation fails, an error
code is returned, but if a lock operation on a mutex fails, the
whole runtime system is terminated.
</p>
- <p>Note that there exist no "condition variable wait with timeout" in
+ <p>Note that there exists no "condition variable wait with timeout" in
the Erlang driver thread API. This is due to issues with
<c>pthread_cond_timedwait()</c>. When the system clock suddenly
is changed, it isn't always guaranteed that you will wake up from
@@ -241,7 +241,7 @@
to give you better error reports.
</p>
</item>
- <tag>Adding / remove drivers</tag>
+ <tag>Adding / removing drivers</tag>
<item>A driver can add and later remove drivers.</item>
<tag>Monitoring processes</tag>
<item>A driver can monitor a process that does not own a port.</item>
@@ -262,7 +262,7 @@
could, under rare circumstances, mean that drivers have to
be slightly modified. If so, this will of course be documented.
<c>ERL_DRV_EXTENDED_MINOR_VERSION</c> will be incremented when
- new features are added. The runtime system use the minor version
+ new features are added. The runtime system uses the minor version
of the driver to determine what features to use.
The runtime system will refuse to load a driver if the major
versions differ, or if the major versions are equal and the
@@ -273,7 +273,7 @@
It can, however, not make sure that it isn't incompatible. Therefore,
when loading a driver that doesn't use the extended driver
interface, there is a risk that it will be loaded also when
- the driver is incompatible. When the driver use the extended driver
+ the driver is incompatible. When the driver uses the extended driver
interface, the emulator can verify that it isn't of an incompatible
driver version. You are therefore advised to use the extended driver
interface.</p>
@@ -309,7 +309,7 @@ typedef struct ErlDrvSysInfo {
<seealso marker="#driver_system_info">driver_system_info()</seealso>
will write the system information when passed a reference to
a <c>ErlDrvSysInfo</c> structure. A description of the
- fields in the structure follow:
+ fields in the structure follows:
</p>
<taglist>
<tag><c>driver_major_version</c></tag>
@@ -347,14 +347,6 @@ typedef struct ErlDrvSysInfo {
<item>A value <c>!= 0</c> if the runtime system has SMP support;
otherwise, <c>0</c>.
</item>
- <tag><c>thread_support</c></tag>
- <item>A value <c>!= 0</c> if the runtime system has thread support;
- otherwise, <c>0</c>.
- </item>
- <tag><c>smp_support</c></tag>
- <item>A value <c>!= 0</c> if the runtime system has SMP support;
- otherwise, <c>0</c>.
- </item>
<tag><c>async_threads</c></tag>
<item>The number of async threads in the async thread pool used
by <seealso marker="#driver_async">driver_async()</seealso>
@@ -401,8 +393,8 @@ typedef struct ErlDrvBinary {
<seealso marker="#driver_binary_dec_refc">driver_binary_dec_refc()</seealso>.</p>
</note>
<p>Some driver calls, such as <c>driver_enq_binary</c>,
- increments the driver reference count, and others, such as
- <c>driver_deq</c> decrements it.</p>
+ increment the driver reference count, and others, such as
+ <c>driver_deq</c> decrement it.</p>
<p>Using a driver binary instead of a normal buffer, is often
faster, since the emulator doesn't need to copy the data,
only the pointer is used.</p>
@@ -415,7 +407,7 @@ typedef struct ErlDrvBinary {
<c>driver_outputv</c> calls, and in the queue. Also the
driver call-back <seealso marker="driver_entry#outputv">outputv</seealso> uses driver
binaries.</p>
- <p>If the driver of some reason or another, wants to keep a
+ <p>If the driver for some reason or another, wants to keep a
driver binary around, in a static variable for instance, the
reference count should be incremented,
and the binary can later be freed in the <seealso marker="driver_entry#stop">stop</seealso> call-back, with
@@ -423,7 +415,7 @@ typedef struct ErlDrvBinary {
<p>Note that since a driver binary is shared by the driver and
the emulator, a binary received from the emulator or sent to
the emulator, must not be changed by the driver.</p>
- <p>From erts version 5.5 (OTP release R11B), orig_bytes is
+ <p>Since erts version 5.5 (OTP release R11B), orig_bytes is
guaranteed to be properly aligned for storage of an array of
doubles (usually 8-byte aligned).</p>
</item>
@@ -447,7 +439,7 @@ typedef struct ErlIOVec {
int vsize;
int size;
SysIOVec* iov;
- >ErlDrvBinary** binv;
+ ErlDrvBinary** binv;
} ErlIOVec;
</code>
<p>The I/O vector used by the emulator and drivers, is a list
@@ -495,17 +487,17 @@ typedef struct ErlIOVec {
Currently, the only port specific data that the emulator
associates with the port data lock is the driver queue.</p>
<p>Normally a driver instance does not have a port data lock. If
- the driver instance want to use a port data lock, it has to
+ the driver instance wants to use a port data lock, it has to
create the port data lock by calling
<seealso marker="#driver_pdl_create">driver_pdl_create()</seealso>.
<em>NOTE</em>: Once the port data lock has been created, every
- access to data associated with the port data lock have to be done
+ access to data associated with the port data lock has to be done
while having the port data lock locked. The port data lock is
locked, and unlocked, respectively, by use of
<seealso marker="#driver_pdl_lock">driver_pdl_lock()</seealso>, and
<seealso marker="#driver_pdl_unlock">driver_pdl_unlock()</seealso>.</p>
<p>A port data lock is reference counted, and when the reference
- count reach zero, it will be destroyed. The emulator will at
+ count reaches zero, it will be destroyed. The emulator will at
least increment the reference count once when the lock is
created and decrement it once when the port associated with
the lock terminates. The emulator will also increment the
@@ -545,7 +537,7 @@ typedef struct ErlIOVec {
</p>
<taglist>
<tag>suggested_stack_size</tag>
- <item>A suggestion, in kilo-words, on how large stack to use. A value less
+ <item>A suggestion, in kilo-words, on how large a stack to use. A value less
than zero means default size.
</item>
</taglist>
@@ -648,7 +640,7 @@ typedef struct ErlIOVec {
opened.</p>
<p>The data is queued in the port owner process' message
queue. Note that this does not yield to the emulator. (Since
- the driver and the emulator runs in the same thread.)</p>
+ the driver and the emulator run in the same thread.)</p>
<p>The parameter <c>buf</c> points to the data to send, and
<c>len</c> is the number of bytes.</p>
<p>The return value for all output functions is 0. (Unless the
@@ -749,7 +741,7 @@ typedef struct ErlIOVec {
function <seealso marker="driver_entry#emulator">timeout</seealso> is called.</p>
<p>Note that there is only one timer on each driver instance;
setting a new timer will replace an older one.</p>
- <p>Return value i 0 (-1 only when the <c>timeout</c> driver
+ <p>Return value is 0 (-1 only when the <c>timeout</c> driver
function is <c>NULL</c>).</p>
</desc>
</func>
@@ -799,20 +791,20 @@ typedef struct ErlIOVec {
event object must be a socket or pipe (or other object that
<c>select</c>/<c>poll</c> can use).
On windows, the Win32 API function <c>WaitForMultipleObjects</c>
- is used. This places other restriction on the event object.
+ is used. This places other restrictions on the event object.
Refer to the Win32 SDK documentation.</p>
<p>The <c>on</c> parameter should be <c>1</c> for setting events
and <c>0</c> for clearing them.</p>
- <p>The <c>mode</c> argument is bitwise-or combination of
+ <p>The <c>mode</c> argument is a bitwise-or combination of
<c>ERL_DRV_READ</c>, <c>ERL_DRV_WRITE</c> and <c>ERL_DRV_USE</c>.
- The first two specifies whether to wait for read events and/or write
+ The first two specify whether to wait for read events and/or write
events. A fired read event will call
<seealso marker="driver_entry#ready_input">ready_input</seealso>
while a fired write event will call
<seealso marker="driver_entry#ready_output">ready_output</seealso>.
</p>
<note>
- <p>Some OS (Windows) does not differ between read and write events.
+ <p>Some OS (Windows) do not differentiate between read and write events.
The call-back for a fired event then only depends on the value of <c>mode</c>.</p>
</note>
<p><c>ERL_DRV_USE</c> specifies if we are using the event object or if we want to close it.
@@ -834,9 +826,9 @@ typedef struct ErlIOVec {
as before. But it is recommended to update them to use <c>ERL_DRV_USE</c> and
<c>stop_select</c> to make sure that event objects are closed in a safe way.</p>
</note>
- <p>The return value is 0 (Failure, -1, only if the
+ <p>The return value is 0 (failure, -1, only if the
<c>ready_input</c>/<c>ready_output</c> is
- <c>NULL</c>.</p>
+ <c>NULL</c>).</p>
</desc>
</func>
<func>
@@ -1076,7 +1068,7 @@ typedef struct ErlIOVec {
array of <c>SysIOVec</c>s. It also returns the number of
elements in <c>vlen</c>. This is the only way to get data
out of the queue.</p>
- <p>Nothing is remove from the queue by this function, that must be done
+ <p>Nothing is removed from the queue by this function, that must be done
with <c>driver_deq</c>.</p>
<p>The returned array is suitable to use with the Unix system
call <c>writev</c>.</p>
@@ -1209,7 +1201,7 @@ typedef struct ErlIOVec {
<fsummary>Stop monitoring a process from a driver</fsummary>
<desc>
<marker id="driver_demonitor_process"></marker>
- <p>This function cancels an monitor created earlier. </p>
+ <p>This function cancels a monitor created earlier. </p>
<p>The function returns 0 if a monitor was removed and &gt; 0
if the monitor did no longer exist.</p>
</desc>
@@ -1326,7 +1318,7 @@ typedef struct ErlIOVec {
<p>This function signals to erlang that the driver has
encountered an EOF and should be closed, unless the port was
opened with the <c>eof</c> option, in that case eof is sent
- to the port. Otherwise, the port is close and an
+ to the port. Otherwise, the port is closed and an
<c>'EXIT'</c> message is sent to the port owner process.</p>
<p>The return value is 0.</p>
</desc>
@@ -1349,8 +1341,8 @@ typedef struct ErlIOVec {
(<c>driver_failure</c>).</p>
<p>The driver should fail only when in severe error situations,
when the driver cannot possibly keep open, for instance
- buffer allocation gets out of memory. Normal errors is more
- appropriate to handle with sending error codes with
+ buffer allocation gets out of memory. For normal errors
+ it is more appropriate to send error codes with
<c>driver_output</c>.</p>
<p>The return value is 0.</p>
</desc>
@@ -1371,7 +1363,7 @@ typedef struct ErlIOVec {
<p>This function returns the process id of the process that
made the current call to the driver. The process id can be
used with <c>driver_send_term</c> to send back data to the
- caller. <c>driver_caller()</c> only return valid data
+ caller. <c>driver_caller()</c> only returns valid data
when currently executing in one of the following driver
callbacks:</p>
<taglist>
@@ -1409,7 +1401,7 @@ typedef struct ErlIOVec {
tuple, the elements are given first, and then the tuple
term, with a count. Likewise for lists.</p>
<p>A tuple must be specified with the number of elements. (The
- elements precedes the <c>ERL_DRV_TUPLE</c> term.)</p>
+ elements precede the <c>ERL_DRV_TUPLE</c> term.)</p>
<p>A list must be specified with the number of elements,
including the tail, which is the last term preceding
<c>ERL_DRV_LIST</c>.</p>
@@ -1518,7 +1510,7 @@ ERL_DRV_EXT2TERM char *buf, ErlDrvUInt len
};
driver_output_term(port, spec, sizeof(spec) / sizeof(spec[0]));
]]></code>
- <p>If you want to pass a binary and doesn't already have the content
+ <p>If you want to pass a binary and don't already have the content
of the binary in an <c>ErlDrvBinary</c>, you can benefit from using
<c>ERL_DRV_BUF2BINARY</c> instead of creating an <c>ErlDrvBinary</c>
via <c>driver_alloc_binary()</c> and then pass the binary via
@@ -1565,7 +1557,7 @@ ERL_DRV_EXT2TERM char *buf, ErlDrvUInt len
<em>other</em> processes than the port owner process. The
<c>receiver</c> parameter specifies the process to receive
the data.</p>
- <p>The parameters <c>term</c> and <c>n</c> does the same thing
+ <p>The parameters <c>term</c> and <c>n</c> do the same thing
as in <seealso marker="#driver_output_term">driver_output_term</seealso>.</p>
<p>This function is only thread-safe when the emulator with SMP
support is used.</p>
@@ -1660,7 +1652,7 @@ ERL_DRV_EXT2TERM char *buf, ErlDrvUInt len
<desc>
<marker id="driver_lock_driver"></marker>
<p>This function locks the driver used by the port <c>port</c>
- in memory for the rest of the emulator process
+ in memory for the rest of the emulator process'
lifetime. After this call, the driver behaves as one of Erlang's
statically linked in drivers.</p>
</desc>
@@ -1904,7 +1896,7 @@ ERL_DRV_EXT2TERM char *buf, ErlDrvUInt len
corresponding to one of the involved thread identifiers
has terminated since the thread identifier was saved,
the result of <c>erl_drv_equal_tids()</c> might not give
- expected result.
+ the expected result.
</p></note>
<p>This function is thread-safe.</p>
</desc>
diff --git a/erts/doc/src/erl_ext_dist.xml b/erts/doc/src/erl_ext_dist.xml
index c2d58d1ef1..fd2da2cfe3 100644
--- a/erts/doc/src/erl_ext_dist.xml
+++ b/erts/doc/src/erl_ext_dist.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2007</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/erts/doc/src/erl_nif.xml b/erts/doc/src/erl_nif.xml
index 27887cbdf6..cdce4ec0b8 100644
--- a/erts/doc/src/erl_nif.xml
+++ b/erts/doc/src/erl_nif.xml
@@ -4,7 +4,7 @@
<cref>
<header>
<copyright>
- <year>2001</year><year>2010</year>
+ <year>2001</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -193,9 +193,9 @@ ok
A handle ("safe pointer") to this memory block can then be returned to Erlang by the use of
<seealso marker="#enif_make_resource">enif_make_resource</seealso>.
The term returned by <c>enif_make_resource</c>
- is totally opaque in nature. It can be stored and passed between processses
- on the same node, but the only real end usage is to pass it back as argument to a NIF.
- The NIF can then do <seealso marker="#enif_get_resource">enif_get_resource</seealso>
+ is totally opaque in nature. It can be stored and passed between processes
+ on the same node, but the only real end usage is to pass it back as an argument to a NIF.
+ The NIF can then call <seealso marker="#enif_get_resource">enif_get_resource</seealso>
and get back a pointer to the memory block that is guaranteed to still be
valid. A resource object will not be deallocated until the last handle term
has been garbage collected by the VM and the resource has been
@@ -212,17 +212,7 @@ ok
the garbage collector or <c>enif_release_resource</c>). Resource types
are uniquely identified by a supplied name string and the name of the
implementing module.</p>
- <p>Resource types support upgrade in runtime by allowing a loaded NIF
- library to takeover an already existing resource type and thereby
- "inherit" all existing objects of that type. The destructor of the new
- library will thereafter be called for the inherited objects and the
- library with the old destructor function can be safely unloaded. Existing
- resource objects, of a module that is upgraded, must either be deleted
- or taken over by the new NIF library. The unloading of a library will be
- postponed as long as there exist resource objects with a destructor
- function in the library.
- </p>
- <p>Here is a template example of how to create and return a resource object.</p>
+ <marker id="enif_resource_example"/><p>Here is a template example of how to create and return a resource object.</p>
<p/>
<code type="none">
ERL_NIF_TERM term;
@@ -240,8 +230,13 @@ ok
/* resource now only owned by "Erlang" */
}
return term;
-}
-</code>
+ </code>
+ <p>Note that once <c>enif_make_resource</c> creates the term to
+ return to Erlang, the code can choose to either keep its own
+ native pointer to the allocated struct and release it later, or
+ release it immediately and rely solely on the garbage collector
+ to eventually deallocate the resource object when it collects
+ the term.</p>
<p>Another usage of resource objects is to create binary terms with
user defined memory management.
<seealso marker="#enif_make_resource_binary">enif_make_resource_binary</seealso>
@@ -251,6 +246,16 @@ ok
this can be a binary term consisting of data from a <c>mmap</c>'ed file.
The destructor can then do <c>munmap</c> to release the memory
region.</p>
+ <p>Resource types support upgrade in runtime by allowing a loaded NIF
+ library to takeover an already existing resource type and thereby
+ "inherit" all existing objects of that type. The destructor of the new
+ library will thereafter be called for the inherited objects and the
+ library with the old destructor function can be safely unloaded. Existing
+ resource objects, of a module that is upgraded, must either be deleted
+ or taken over by the new NIF library. The unloading of a library will be
+ postponed as long as there exist resource objects with a destructor
+ function in the library.
+ </p>
</item>
<tag>Threads and concurrency</tag>
<item><p>A NIF is thread-safe without any explicit synchronization as
@@ -368,7 +373,7 @@ ok
environments between NIF calls. </p>
<p>A <em>process independent environment</em> is created by calling
<seealso marker="#enif_alloc_env">enif_alloc_env</seealso>. It can be
- used to store terms beteen NIF calls and to send terms with
+ used to store terms between NIF calls and to send terms with
<seealso marker="#enif_send">enif_send</seealso>. A process
independent environment with all its terms is valid until you explicitly
invalidates it with <seealso marker="#enif_free_env">enif_free_env</seealso>
@@ -464,7 +469,7 @@ typedef enum {
</section>
<funcs>
- <func><name><ret>void*</ret><nametext>enif_alloc(ErlNifEnv* env, size_t size)</nametext></name>
+ <func><name><ret>void*</ret><nametext>enif_alloc(size_t size)</nametext></name>
<fsummary>Allocate dynamic memory.</fsummary>
<desc><p>Allocate memory of <c>size</c> bytes. Return NULL if allocation failed.</p></desc>
</func>
@@ -539,7 +544,7 @@ typedef enum {
<desc><p>Same as <seealso marker="erl_driver#erl_drv_equal_tids">erl_drv_equal_tids</seealso>.
</p></desc>
</func>
- <func><name><ret>void</ret><nametext>enif_free(ErlNifEnv* env, void* ptr)</nametext></name>
+ <func><name><ret>void</ret><nametext>enif_free(void* ptr)</nametext></name>
<fsummary>Free dynamic memory</fsummary>
<desc><p>Free memory allocated by <c>enif_alloc</c>.</p></desc>
</func>
@@ -683,6 +688,10 @@ typedef enum {
<fsummary>Determine if a term is an empty list</fsummary>
<desc><p>Return true if <c>term</c> is an empty list.</p></desc>
</func>
+ <marker id="enif_is_exception"/><func><name><ret>int</ret><nametext>enif_is_exception(ErlNifEnv* env, ERL_NIF_TERM term)</nametext></name>
+ <fsummary>Determine if a term is an exception</fsummary>
+ <desc><p>Return true if <c>term</c> is an exception.</p></desc>
+ </func>
<func><name><ret>int</ret><nametext>enif_is_fun(ErlNifEnv* env, ERL_NIF_TERM term)</nametext></name>
<fsummary>Determine if a term is a fun</fsummary>
<desc><p>Return true if <c>term</c> is a fun.</p></desc>
@@ -733,7 +742,14 @@ typedef enum {
</func>
<func><name><ret>ERL_NIF_TERM</ret><nametext>enif_make_badarg(ErlNifEnv* env)</nametext></name>
<fsummary>Make a badarg exception.</fsummary>
- <desc><p>Make a badarg exception to be returned from a NIF.</p></desc>
+ <desc><p>Make a badarg exception to be returned from a NIF, and set
+ an associated exception reason in <c>env</c>. If
+ <c>enif_make_badarg</c> is called, the term it returns <em>must</em>
+ be returned from the function that called it. No other return value
+ is allowed. Also, the term returned from <c>enif_make_badarg</c> may
+ be passed only to
+ <seealso marker="#enif_is_exception">enif_is_exception</seealso> and
+ not to any other NIF API function.</p></desc>
</func>
<func><name><ret>ERL_NIF_TERM</ret><nametext>enif_make_binary(ErlNifEnv* env, ErlNifBinary* bin)</nametext></name>
<fsummary>Make a binary term.</fsummary>
@@ -832,8 +848,14 @@ typedef enum {
<fsummary>Create an opaque handle to a resource object</fsummary>
<desc><p>Create an opaque handle to a memory managed resource object
obtained by <seealso marker="#enif_alloc_resource">enif_alloc_resource</seealso>.
- No ownership transfer is done, the resource object still needs to be released by
- <seealso marker="#enif_release_resource">enif_release_resource</seealso>.</p>
+ No ownership transfer is done, as the resource object still needs to be released by
+ <seealso marker="#enif_release_resource">enif_release_resource</seealso>,
+ but note that the call to <c>enif_release_resource</c> can occur
+ immediately after obtaining the term from <c>enif_make_resource</c>,
+ in which case the resource object will be deallocated when the
+ term is garbage collected. See the
+ <seealso marker="#enif_resource_example">example of creating and
+ returning a resource object</seealso> for more details.</p>
<p>Note that the only defined behaviour of using a resource term in
an Erlang program is to store it and send it between processes on the
same node. Other operations such as matching or <c>term_to_binary</c>
@@ -857,11 +879,6 @@ typedef enum {
<seealso marker="#enif_release_resource">enif_release_resource</seealso>.</p>
</desc>
</func>
- <func><name><ret>ErlNifPid*</ret><nametext>enif_self(ErlNifEnv* caller_env, ErlNifPid* pid)</nametext></name>
- <fsummary>Get the pid of the calling process.</fsummary>
- <desc><p>Initialize the pid variable <c>*pid</c> to represent the
- calling process. Return <c>pid</c>.</p></desc>
- </func>
<func><name><ret>ERL_NIF_TERM</ret><nametext>enif_make_string(ErlNifEnv* env, const char* string, ErlNifCharEncoding encoding)</nametext></name>
<fsummary>Create a string.</fsummary>
<desc><p>Create a list containing the characters of the
@@ -980,11 +997,12 @@ typedef enum {
<c>reload</c> or <c>upgrade</c>.</p>
<p>Was previously named <c>enif_get_data</c>.</p></desc>
</func>
- <func><name><ret>void</ret><nametext>enif_realloc_binary(ErlNifBinary* bin, size_t size)</nametext></name>
+ <func><name><ret>int</ret><nametext>enif_realloc_binary(ErlNifBinary* bin, size_t size)</nametext></name>
<fsummary>Change the size of a binary.</fsummary>
<desc><p>Change the size of a binary <c>bin</c>. The source binary
may be read-only, in which case it will be left untouched and
- a mutable copy is allocated and assigned to <c>*bin</c>.</p></desc>
+ a mutable copy is allocated and assigned to <c>*bin</c>. Return true on success,
+ false if memory allocation failed.</p></desc>
</func>
<func><name><ret>void</ret><nametext>enif_release_binary(ErlNifBinary* bin)</nametext></name>
<fsummary>Release a binary.</fsummary>
@@ -1041,7 +1059,12 @@ typedef enum {
<desc><p>Same as <seealso marker="erl_driver#erl_drv_rwlock_tryrwlock">erl_drv_rwlock_tryrwlock</seealso>.
</p></desc>
</func>
- <func><name><ret>unsigned</ret><nametext>enif_send(ErlNifEnv* env, ErlNifPid* to_pid, ErlNifEnv* msg_env, ERL_NIF_TERM msg)</nametext></name>
+ <func><name><ret>ErlNifPid*</ret><nametext>enif_self(ErlNifEnv* caller_env, ErlNifPid* pid)</nametext></name>
+ <fsummary>Get the pid of the calling process.</fsummary>
+ <desc><p>Initialize the pid variable <c>*pid</c> to represent the
+ calling process. Return <c>pid</c>.</p></desc>
+ </func>
+ <func><name><ret>int</ret><nametext>enif_send(ErlNifEnv* env, ErlNifPid* to_pid, ErlNifEnv* msg_env, ERL_NIF_TERM msg)</nametext></name>
<fsummary>Send a message to a process.</fsummary>
<desc><p>Send a message to a process.</p>
<taglist>
diff --git a/erts/doc/src/erlang.xml b/erts/doc/src/erlang.xml
index 78d58a1e56..19f501391f 100644
--- a/erts/doc/src/erlang.xml
+++ b/erts/doc/src/erlang.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1996</year><year>2010</year>
+ <year>1996</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -3980,7 +3980,8 @@ os_prompt%</pre>
<tag><c>{status, Status}</c></tag>
<item>
<p><c>Status</c> is the status of the process. <c>Status</c>
- is <c>waiting</c> (waiting for a message), <c>running</c>,
+ is <c>exiting</c>, <c>garbage_collecting</c>,
+ <c>waiting</c> (for a message), <c>running</c>,
<c>runnable</c> (ready to run, but another process is
running), or <c>suspended</c> (suspended on a "busy" port
or by the <c>erlang:suspend_process/[1,2]</c> BIF).</p>
diff --git a/erts/doc/src/erlc.xml b/erts/doc/src/erlc.xml
index 1e8960c22c..ebf76a2afe 100644
--- a/erts/doc/src/erlc.xml
+++ b/erts/doc/src/erlc.xml
@@ -4,7 +4,7 @@
<comref>
<header>
<copyright>
- <year>1997</year><year>2010</year>
+ <year>1997</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -141,6 +141,50 @@
for compiling native code, which needs to be compiled with the same
run-time system that it should be run on.</p>
</item>
+ <tag>-M</tag>
+ <item>
+ <p>Produces a Makefile rule to track headers dependencies. The
+ rule is sent to stdout. No object file is produced.
+ </p>
+ </item>
+ <tag>-MF <em>Makefile</em></tag>
+ <item>
+ <p>Like the <c><![CDATA[-M]]></c> option above, except that the
+ Makefile is written to <em>Makefile</em>. No object
+ file is produced.
+ </p>
+ </item>
+ <tag>-MD</tag>
+ <item>
+ <p>Same as <c><![CDATA[-M -MF <File>.Pbeam]]></c>.
+ </p>
+ </item>
+ <tag>-MT <em>Target</em></tag>
+ <item>
+ <p>In conjunction with <c><![CDATA[-M]]></c> or
+ <c><![CDATA[-MF]]></c>, change the name of the rule emitted
+ to <em>Target</em>.
+ </p>
+ </item>
+ <tag>-MQ <em>Target</em></tag>
+ <item>
+ <p>Like the <c><![CDATA[-MT]]></c> option above, except that
+ characters special to make(1) are quoted.
+ </p>
+ </item>
+ <tag>-MP</tag>
+ <item>
+ <p>In conjunction with <c><![CDATA[-M]]></c> or
+ <c><![CDATA[-MF]]></c>, add a phony target for each dependency.
+ </p>
+ </item>
+ <tag>-MG</tag>
+ <item>
+ <p>In conjunction with <c><![CDATA[-M]]></c> or
+ <c><![CDATA[-MF]]></c>, consider missing headers as generated
+ files and add them to the dependencies.
+ </p>
+ </item>
<tag>--</tag>
<item>
<p>Signals that no more options will follow.
diff --git a/erts/doc/src/escript.xml b/erts/doc/src/escript.xml
index 44c9a5ac68..66e904f64f 100644
--- a/erts/doc/src/escript.xml
+++ b/erts/doc/src/escript.xml
@@ -4,7 +4,7 @@
<comref>
<header>
<copyright>
- <year>2007</year><year>2010</year>
+ <year>2007</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -153,7 +153,10 @@ halt(1).</pre>
<p>Execution of interpreted code is slower than compiled code.
If much of the execution takes place in interpreted code it
may be worthwhile to compile it, even though the compilation
- itself will take a little while.</p>
+ itself will take a little while. It is also possible to supply
+ <c>native</c> instead of compile, this will compile the script
+ using the native flag, again depending on the characteristics
+ of the escript this could or could not be worth while.</p>
<p>As mentioned earlier, it is possible to have a script which
contains precompiled <c>beam</c> code. In a precompiled
@@ -397,6 +400,9 @@ ok
Warnings and errors (if any) are written to the standard output, but
the script will not be run. The exit status will be 0 if there were
no errors, and 127 otherwise.</item>
+
+ <tag>-n</tag>
+ <item>Compile the escript using the +native flag.</item>
</taglist>
</section>
</comref>
diff --git a/erts/doc/src/init.xml b/erts/doc/src/init.xml
index 33364c709a..0e828389f6 100644
--- a/erts/doc/src/init.xml
+++ b/erts/doc/src/init.xml
@@ -67,19 +67,6 @@
</desc>
</func>
<func>
- <name>get_args() -> [Arg]</name>
- <fsummary>Get all non-flag command line arguments</fsummary>
- <type>
- <v>Arg = atom()</v>
- </type>
- <desc>
- <p>Returns any plain command line arguments as a list of atoms
- (possibly empty). It is recommended that
- <c>get_plain_arguments/1</c> is used instead, because of
- the limited length of atoms.</p>
- </desc>
- </func>
- <func>
<name>get_argument(Flag) -> {ok, Arg} | error</name>
<fsummary>Get the values associated with a command line user flag</fsummary>
<type>
diff --git a/erts/doc/src/notes.xml b/erts/doc/src/notes.xml
index 77181d3407..f5607945a8 100644
--- a/erts/doc/src/notes.xml
+++ b/erts/doc/src/notes.xml
@@ -30,6 +30,295 @@
</header>
<p>This document describes the changes made to the ERTS application.</p>
+<section><title>Erts 5.8.3.2</title>
+
+ <section><title>Known Bugs and Problems</title>
+ <list>
+ <item>
+ <p>
+ Fix halfword emulator bug in <c>ets:select_delete</c> for
+ <c>ordered_set</c> that caused emulator to crash.</p>
+ <p>
+ Own Id: OTP-9258 Aux Id: seq11836 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>Erts 5.8.3.1</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Ets table type ordered_set could order large integer keys
+ wrongly on pure 64bit platforms. This is now corrected.</p>
+ <p>
+ Own Id: OTP-9181</p>
+ </item>
+ <item>
+ <p>
+ The status of a process was unnecessarily set to waiting
+ before a process was enqueued in a run queue. This bug
+ was harmless up until OTP-R14B01. In OTP-R14B02
+ <c>erlang:hibernate/3</c> was fixed (OTP-9125). After the
+ introduction of OTP-9125, the previously harmless process
+ status bug sometimes caused erroneous badarg exceptions
+ from <c>process_info()</c>.</p>
+ <p>
+ OTP-9125 also introduced a thread unsafe access to the
+ status field of a process which now also have been fixed.</p>
+ <p>
+ *** INCOMPATIBILITY with noxs ***</p>
+ <p>
+ Own Id: OTP-9197</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>Erts 5.8.3</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ The scroll wheel now scrolls the werl window on Windows.</p>
+ <p>
+ Own Id: OTP-8985</p>
+ </item>
+ <item>
+ <p>
+ Some malformed distribution messages could cause VM to
+ crash, this is now corrected.</p>
+ <p>
+ Own Id: OTP-8993</p>
+ </item>
+ <item>
+ <p>
+ The OS function getifaddrs() can return NULL in some
+ address fields for e.g PPP and tunnel devices which
+ caused the emulator to segfault. This bug has now been
+ corrected.</p>
+ <p>
+ Own Id: OTP-8996</p>
+ </item>
+ <item>
+ <p>
+ The expression &lt;&lt;A:0&gt;&gt; would always produce
+ an empty binary, even if <c>A</c> was not an integer.
+ Corrected to cause a <c>badarg</c> exception if the type
+ of <c>A</c> is invalid. (Thanks to Zvi.)</p>
+ <p>
+ Own Id: OTP-8997</p>
+ </item>
+ <item>
+ <p>
+ A bug that potentially could cause an emulator crash when
+ deleting an ETS-table has been fixed. A resource leak
+ when hitting the maximum amount of ETS-tables allowed has
+ also been fixed.</p>
+ <p>
+ Own Id: OTP-8999</p>
+ </item>
+ <item>
+ <p>
+ A bug in the <c>exit/2</c> BIF could potentially cause an
+ emulator crash.</p>
+ <p>
+ Own Id: OTP-9005</p>
+ </item>
+ <item>
+ <p>
+ Due to a bug in glibc the runtime system could abort
+ while trying to destroy a mutex. The runtime system will
+ now issue a warning instead of aborting.</p>
+ <p>
+ Own Id: OTP-9009</p>
+ </item>
+ <item>
+ <p>
+ A bug in epmd could create strange behaviour when
+ listen() calls failed. This is now corrected thanks to
+ Steve Vinoski.</p>
+ <p>
+ Own Id: OTP-9024</p>
+ </item>
+ <item>
+ <p>When setting file_info the win32_driver will now
+ correctly set access and modified time. Previously these
+ entities were swapped.</p>
+ <p>
+ Own Id: OTP-9046</p>
+ </item>
+ <item>
+ <p>
+ Setting scheduler bind type to <c>unbound</c> failed if
+ binding of schedulers wasn't supported, or if CPU
+ topology wasn't present. This even though the
+ documentation stated that it is possible to set the bind
+ type to <c>unbound</c>.</p>
+ <p>
+ Own Id: OTP-9056 Aux Id: Seq11779 </p>
+ </item>
+ <item>
+ <p>Two problems were fixed in crash dump: The time left
+ for timers are now shown as unsigned integers and the
+ contents of ordered_set ETS tables is no longer
+ included.</p>
+ <p>
+ Own Id: OTP-9057</p>
+ </item>
+ <item>
+ <p>
+ The VM could fail to set IP_TOS and SO_PRIORITY in
+ certain situations, either because sockets were supplied
+ as open file descriptors, or because SO_PRIORITY by
+ default was set higher than the user can explicitly set
+ it to. Those situations are now handled.</p>
+ <p>
+ Own Id: OTP-9069</p>
+ </item>
+ <item>
+ <p>
+ Wx on MacOS X generated complains on stderr about certain
+ cocoa functions not beeing called from the "Main thread".
+ This is now corrected.</p>
+ <p>
+ Own Id: OTP-9081</p>
+ </item>
+ <item>
+ <p>
+ Fix a couple typos in driver_entry(3) (thanks to Tuncer
+ Ayaz).</p>
+ <p>
+ Own Id: OTP-9085</p>
+ </item>
+ <item>
+ <p>
+ Mention that "-detached" implies "-noinput"</p>
+ <p>
+ Clarify that specifying "-noinput" is unnecessary if the
+ "-detached" flag is given. (thanks to Holger Wei�)</p>
+ <p>
+ Own Id: OTP-9086</p>
+ </item>
+ <item>
+ <p>
+ A potential problem (found by code inspection) when
+ calling a fun whose code was not loaded has been fixed.</p>
+ <p>
+ Own Id: OTP-9095</p>
+ </item>
+ <item>
+ <p>
+ The emulator could get into a state where it didn't check
+ for I/O.</p>
+ <p>
+ Own Id: OTP-9105 Aux Id: Seq11798 </p>
+ </item>
+ <item>
+ <p>
+ Attempting to create binaries exceeding 2Gb (using for
+ example <c>term_to_binary/1</c>) would crash the emulator
+ with an attempt to allocate huge amounts of memory.
+ (Thanks to Jon Meredith.)</p>
+ <p>
+ Own Id: OTP-9117</p>
+ </item>
+ <item>
+ <p>
+ Fix erlang:hibernate/3 on HiPE enabled emulator (Thanks
+ to Paul Guyot)</p>
+ <p>
+ Own Id: OTP-9125</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>From this release, the previously experimental
+ halfword emulator is now official. It can be enabled by
+ giving the <c>--enable-halfword-emulator</c> option to
+ the <c>configure</c> script.</p>
+ <p>The halfword emulator is a 64-bit application, but
+ uses halfwords (32-bit words) for all data in Erlang
+ processes, therefore using less memory and being faster
+ than the standard 64-bit emulator. The total size of all
+ BEAM code and all process data for all processes is
+ limited to 4Gb, but ETS tables and off-heap binaries are
+ only limited by the amount of available memory.</p>
+ <p>
+ Own Id: OTP-8941</p>
+ </item>
+ <item>
+ <p>
+ 32-bit atomic memory operations have been introduced
+ internally in the run time system, and are now used where
+ appropriate. There were previously only atomic memory
+ operations of word size available. The 32-bit atomic
+ memory operations slightly reduce memory consumption, and
+ slightly improve performance on 64-bit runtime systems.</p>
+ <p>
+ Own Id: OTP-8974</p>
+ </item>
+ <item>
+ <p>
+ Performance enhancements for looking up timer-entries and
+ removing timers from the wheel.</p>
+ <p>
+ Own Id: OTP-8990</p>
+ </item>
+ <item>
+ <p>
+ Write accesses to ETS tables have been optimized by
+ reducing the amount of atomic memory operations needed
+ during a write access.</p>
+ <p>
+ Own Id: OTP-9000</p>
+ </item>
+ <item>
+ <p>
+ Strange C coding in the VM made the -D_FORTIFY_SOURCE
+ option to gcc-4.5 react badly. The code is now cleaned up
+ so that it's accepted by gcc-4.5.</p>
+ <p>
+ Own Id: OTP-9025</p>
+ </item>
+ <item>
+ <p>
+ The memory footprint for loaded code has been somewhat
+ reduced (especially in the 64-bit BEAM machine).</p>
+ <p>
+ Own Id: OTP-9030</p>
+ </item>
+ <item>
+ <p>
+ The maximum number of allowed arguments for an Erlang
+ function has been lowered from 256 to 255, so that the
+ number of arguments can now fit in a byte.</p>
+ <p>
+ Own Id: OTP-9049</p>
+ </item>
+ <item>
+ <p>
+ Dependency generation for Makefiles has been added to the
+ compiler and erlc. See the manual pages for
+ <c>compile</c> and <c>erlc</c>. (Thanks to Jean-Sebastien
+ Pedron.)</p>
+ <p>
+ Own Id: OTP-9065</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Erts 5.8.2</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/erts/doc/src/run_erl.xml b/erts/doc/src/run_erl.xml
index 7bf7f559c5..da08859c7b 100644
--- a/erts/doc/src/run_erl.xml
+++ b/erts/doc/src/run_erl.xml
@@ -144,6 +144,14 @@
<item>The size (in bytes) of a log file before switching to a
new log file. Default is 100000, minimum is 1000 and maximum is
approximately 2^30.</item>
+ <tag>RUN_ERL_DISABLE_FLOWCNTRL</tag>
+ <item>If defined, disables input and output flow control for the pty opend by run_erl.
+ Useful if you want to remove any risk of accidentally blocking the flow control
+ by hit Ctrl-S (instead of Ctrl-D to detach).
+ Which may result in blocking of the entire beam process
+ and in the case of running heart as supervisor
+ even the heart process will be blocked when writing log message to terminal.
+ Leaving the heart process unable to do its work.</item>
</taglist>
</section>
diff --git a/erts/emulator/Makefile.in b/erts/emulator/Makefile.in
index 6c33e2ca16..c9076a9d64 100644
--- a/erts/emulator/Makefile.in
+++ b/erts/emulator/Makefile.in
@@ -505,19 +505,22 @@ ifdef HIPE_ENABLED
OPCODE_TABLES += hipe/hipe_ops.tab
endif
-$(TTF_DIR)/beam_opcodes.h $(TTF_DIR)/beam_opcodes.c: $(OPCODE_TABLES)
- LANG=C $(PERL) utils/beam_makeops -outdir $(TTF_DIR) \
+$(TTF_DIR)/beam_opcodes.h $(TTF_DIR)/beam_opcodes.c: $(OPCODE_TABLES) utils/beam_makeops
+ LANG=C $(PERL) utils/beam_makeops \
+ -wordsize @EXTERNAL_WORD_SIZE@ \
+ -outdir $(TTF_DIR) \
-emulator $(OPCODE_TABLES)
# bif and atom table
ATOMS= beam/atom.names
BIFS = beam/bif.tab
ifdef HIPE_ENABLED
+HIPE_ARCH64_TAB=hipe/hipe_bif64.tab
HIPE_x86_TAB=hipe/hipe_x86.tab
-HIPE_amd64_TAB=hipe/hipe_amd64.tab
+HIPE_amd64_TAB=hipe/hipe_amd64.tab $(HIPE_ARCH64_TAB)
HIPE_ultrasparc_TAB=hipe/hipe_sparc.tab
HIPE_ppc_TAB=hipe/hipe_ppc.tab
-HIPE_ppc64_TAB=hipe/hipe_ppc64.tab
+HIPE_ppc64_TAB=hipe/hipe_ppc64.tab $(HIPE_ARCH64_TAB)
HIPE_arm_TAB=hipe/hipe_arm.tab
HIPE_ARCH_TAB=$(HIPE_$(ARCH)_TAB)
BIFS += hipe/hipe_bif0.tab hipe/hipe_bif1.tab hipe/hipe_bif2.tab $(HIPE_ARCH_TAB)
@@ -799,12 +802,14 @@ OS_OBJS += $(OBJDIR)/erl_mseg.o \
$(OBJDIR)/erl_mtrace_sys_wrap.o \
$(OBJDIR)/erl_sys_common_misc.o
+HIPE_ARCH64_OBJS=$(OBJDIR)/hipe_bif64.o
+
HIPE_x86_OS_OBJS=$(HIPE_x86_$(OPSYS)_OBJS)
HIPE_x86_OBJS=$(OBJDIR)/hipe_x86.o $(OBJDIR)/hipe_x86_glue.o $(OBJDIR)/hipe_x86_bifs.o $(OBJDIR)/hipe_x86_signal.o $(OBJDIR)/hipe_x86_stack.o $(HIPE_x86_OS_OBJS)
-HIPE_amd64_OBJS=$(OBJDIR)/hipe_amd64.o $(OBJDIR)/hipe_amd64_glue.o $(OBJDIR)/hipe_amd64_bifs.o $(OBJDIR)/hipe_x86_signal.o $(OBJDIR)/hipe_x86_stack.o
+HIPE_amd64_OBJS=$(OBJDIR)/hipe_amd64.o $(OBJDIR)/hipe_amd64_glue.o $(OBJDIR)/hipe_amd64_bifs.o $(OBJDIR)/hipe_x86_signal.o $(OBJDIR)/hipe_x86_stack.o $(HIPE_ARCH64_OBJS)
HIPE_ultrasparc_OBJS=$(OBJDIR)/hipe_sparc.o $(OBJDIR)/hipe_sparc_glue.o $(OBJDIR)/hipe_sparc_bifs.o $(OBJDIR)/hipe_risc_stack.o
HIPE_ppc_OBJS=$(OBJDIR)/hipe_ppc.o $(OBJDIR)/hipe_ppc_glue.o $(OBJDIR)/hipe_ppc_bifs.o $(OBJDIR)/hipe_risc_stack.o
-HIPE_ppc64_OBJS=$(HIPE_ppc_OBJS)
+HIPE_ppc64_OBJS=$(HIPE_ppc_OBJS) $(HIPE_ARCH64_OBJS)
HIPE_arm_OBJS=$(OBJDIR)/hipe_arm.o $(OBJDIR)/hipe_arm_glue.o $(OBJDIR)/hipe_arm_bifs.o $(OBJDIR)/hipe_risc_stack.o
HIPE_noarch_OBJS=
HIPE_ARCH_OBJS=$(HIPE_$(ARCH)_OBJS)
diff --git a/erts/emulator/beam/beam_bif_load.c b/erts/emulator/beam/beam_bif_load.c
index 6ae9736141..1dbf6f9b92 100644
--- a/erts/emulator/beam/beam_bif_load.c
+++ b/erts/emulator/beam/beam_bif_load.c
@@ -175,8 +175,12 @@ check_process_code_2(BIF_ALIST_2)
Eterm res;
if (internal_pid_index(BIF_ARG_1) >= erts_max_processes)
goto error;
- rp = erts_pid2proc_not_running(BIF_P, ERTS_PROC_LOCK_MAIN,
- BIF_ARG_1, ERTS_PROC_LOCK_MAIN);
+#ifdef ERTS_SMP
+ rp = erts_pid2proc_suspend(BIF_P, ERTS_PROC_LOCK_MAIN,
+ BIF_ARG_1, ERTS_PROC_LOCK_MAIN);
+#else
+ rp = erts_pid2proc(BIF_P, 0, BIF_ARG_1, 0);
+#endif
if (!rp) {
BIF_RET(am_false);
}
@@ -187,8 +191,10 @@ check_process_code_2(BIF_ALIST_2)
modp = erts_get_module(BIF_ARG_2);
res = check_process_code(rp, modp);
#ifdef ERTS_SMP
- if (BIF_P != rp)
+ if (BIF_P != rp) {
+ erts_resume(rp, ERTS_PROC_LOCK_MAIN);
erts_smp_proc_unlock(rp, ERTS_PROC_LOCK_MAIN);
+ }
#endif
BIF_RET(res);
}
@@ -472,9 +478,6 @@ check_process_code(Process* rp, Module* modp)
for (oh = MSO(rp).first; oh; oh = oh->next) {
if (thing_subtag(oh->thing_word) == FUN_SUBTAG) {
ErlFunThing* funp = (ErlFunThing*) oh;
- BeamInstr* fun_code;
-
- fun_code = funp->fe->address;
if (INSIDE((BeamInstr *) funp->fe->address)) {
if (done_gc) {
diff --git a/erts/emulator/beam/beam_bp.c b/erts/emulator/beam/beam_bp.c
index 682f31b83f..31910888d1 100644
--- a/erts/emulator/beam/beam_bp.c
+++ b/erts/emulator/beam/beam_bp.c
@@ -950,8 +950,8 @@ static int set_function_break(Module *modp, BeamInstr *pc, int bif,
MatchSetUnref(old_match_spec);
} else {
BpDataCount *bdc = (BpDataCount *) bd;
- long count = 0;
- long res = 0;
+ erts_aint_t count = 0;
+ erts_aint_t res = 0;
ASSERT(! match_spec);
ASSERT(is_nil(tracer_pid));
diff --git a/erts/emulator/beam/beam_bp.h b/erts/emulator/beam/beam_bp.h
index ebc171078d..bd8a7249a7 100644
--- a/erts/emulator/beam/beam_bp.h
+++ b/erts/emulator/beam/beam_bp.h
@@ -157,7 +157,7 @@ do { \
BpData **bds = (BpData **) (pc)[-4]; \
BpDataCount *bdc = NULL; \
Uint ix = bp_sched2ix_proc( (p) ); \
- long count = 0; \
+ erts_aint_t count = 0; \
\
ASSERT((pc)[-5] == (BeamInstr) BeamOp(op_i_func_info_IaaI)); \
ASSERT(bds); \
diff --git a/erts/emulator/beam/beam_debug.c b/erts/emulator/beam/beam_debug.c
index b0bf14b94f..fffb172c68 100644
--- a/erts/emulator/beam/beam_debug.c
+++ b/erts/emulator/beam/beam_debug.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2011. 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
@@ -48,7 +48,6 @@
void dbg_bt(Process* p, Eterm* sp);
void dbg_where(BeamInstr* addr, Eterm x0, Eterm* reg);
-static void print_big(int to, void *to_arg, Eterm* addr);
static int print_op(int to, void *to_arg, int op, int size, BeamInstr* addr);
Eterm
erts_debug_same_2(Process* p, Eterm term1, Eterm term2)
@@ -157,6 +156,25 @@ void debug_dump_code(BeamInstr *I, int num)
}
#endif
+BIF_RETTYPE
+erts_debug_instructions_0(BIF_ALIST_0)
+{
+ int i = 0;
+ Uint needed = num_instructions * 2;
+ Eterm* hp;
+ Eterm res = NIL;
+
+ for (i = 0; i < num_instructions; i++) {
+ needed += 2*strlen(opc[i].name);
+ }
+ hp = HAlloc(BIF_P, needed);
+ for (i = num_instructions-1; i >= 0; i--) {
+ Eterm s = erts_bld_string_n(&hp, 0, opc[i].name, strlen(opc[i].name));
+ res = erts_bld_cons(&hp, 0, s, res);
+ }
+ return res;
+}
+
Eterm
erts_debug_disassemble_1(Process* p, Eterm addr)
{
@@ -249,7 +267,7 @@ erts_debug_disassemble_1(Process* p, Eterm addr)
"unknown " HEXF "\n", instr);
code_ptr++;
}
- bin = new_binary(p, (byte *) dsbufp->str, (int) dsbufp->str_len);
+ bin = new_binary(p, (byte *) dsbufp->str, dsbufp->str_len);
erts_destroy_tmp_dsbuf(dsbufp);
hsz = 4+4;
(void) erts_bld_uword(NULL, &hsz, (BeamInstr) code_ptr);
@@ -273,7 +291,7 @@ dbg_bt(Process* p, Eterm* sp)
if (addr)
erts_fprintf(stderr,
HEXF ": %T:%T/%bpu\n",
- addr, (Eterm) addr[0], (Eterm) addr[1], (Uint) addr[2]);
+ addr, (Eterm) addr[0], (Eterm) addr[1], addr[2]);
}
sp++;
}
@@ -312,6 +330,7 @@ print_op(int to, void *to_arg, int op, int size, BeamInstr* addr)
BeamInstr packed = 0; /* Accumulator for packed operations. */
BeamInstr args[8]; /* Arguments for this instruction. */
BeamInstr* ap; /* Pointer to arguments. */
+ BeamInstr* unpacked; /* Unpacked arguments */
start_prog = opc[op].pack;
@@ -360,6 +379,12 @@ print_op(int to, void *to_arg, int op, int size, BeamInstr* addr)
*ap++ = packed & BEAM_LOOSE_MASK;
packed >>= BEAM_LOOSE_SHIFT;
break;
+#ifdef ARCH_64
+ case 'w': /* Shift 32 steps */
+ *ap++ = packed & BEAM_WIDE_MASK;
+ packed >>= BEAM_WIDE_SHIFT;
+ break;
+#endif
case 'p':
*sp++ = *--ap;
break;
@@ -386,7 +411,7 @@ print_op(int to, void *to_arg, int op, int size, BeamInstr* addr)
break;
case 'x': /* x(N) */
if (reg_index(ap[0]) == 0) {
- erts_print(to, to_arg, "X[0]");
+ erts_print(to, to_arg, "x[0]");
} else {
erts_print(to, to_arg, "x(%d)", reg_index(ap[0]));
}
@@ -459,7 +484,7 @@ print_op(int to, void *to_arg, int op, int size, BeamInstr* addr)
if (f+3 != (BeamInstr *) *ap) {
erts_print(to, to_arg, "f(" HEXF ")", *ap);
} else {
- erts_print(to, to_arg, "%T:%T/%bpu", (Eterm) f[0], (Eterm) f[1], (Eterm) f[2]);
+ erts_print(to, to_arg, "%T:%T/%bpu", (Eterm) f[0], (Eterm) f[1], f[2]);
}
ap++;
}
@@ -470,7 +495,7 @@ print_op(int to, void *to_arg, int op, int size, BeamInstr* addr)
if (f+3 != (BeamInstr *) *ap) {
erts_print(to, to_arg, "p(" HEXF ")", *ap);
} else {
- erts_print(to, to_arg, "%T:%T/%bpu", (Eterm) f[0], (Eterm) f[1], (Eterm) f[2]);
+ erts_print(to, to_arg, "%T:%T/%bpu", (Eterm) f[0], (Eterm) f[1], f[2]);
}
ap++;
}
@@ -483,7 +508,7 @@ print_op(int to, void *to_arg, int op, int size, BeamInstr* addr)
{
Export* ex = (Export *) *ap;
erts_print(to, to_arg,
- "%T:%T/%bpu", (Eterm) ex->code[0], (Eterm) ex->code[1], (Uint) ex->code[2]);
+ "%T:%T/%bpu", (Eterm) ex->code[0], (Eterm) ex->code[1], ex->code[2]);
ap++;
}
break;
@@ -506,6 +531,7 @@ print_op(int to, void *to_arg, int op, int size, BeamInstr* addr)
ap++;
break;
case 'P': /* Byte offset into tuple (see beam_load.c) */
+ case 'Q': /* Like 'P', but packable */
erts_print(to, to_arg, "%d", (*ap / sizeof(Eterm)) - 1);
ap++;
break;
@@ -526,9 +552,12 @@ print_op(int to, void *to_arg, int op, int size, BeamInstr* addr)
* Print more information about certain instructions.
*/
+ unpacked = ap;
ap = addr + size;
switch (op) {
- case op_i_select_val_sfI:
+ case op_i_select_val_rfI:
+ case op_i_select_val_xfI:
+ case op_i_select_val_yfI:
{
int n = ap[-1];
@@ -540,7 +569,24 @@ print_op(int to, void *to_arg, int op, int size, BeamInstr* addr)
}
}
break;
- case op_i_jump_on_val_sfII:
+ case op_i_select_tuple_arity_rfI:
+ case op_i_select_tuple_arity_xfI:
+ case op_i_select_tuple_arity_yfI:
+ {
+ int n = ap[-1];
+
+ while (n > 0) {
+ Uint arity = arityval(ap[0]);
+ erts_print(to, to_arg, " {%d} f(" HEXF ")", arity, ap[1]);
+ ap += 2;
+ size += 2;
+ n--;
+ }
+ }
+ break;
+ case op_i_jump_on_val_rfII:
+ case op_i_jump_on_val_xfII:
+ case op_i_jump_on_val_yfII:
{
int n;
for (n = ap[-2]; n > 0; n--) {
@@ -550,39 +596,46 @@ print_op(int to, void *to_arg, int op, int size, BeamInstr* addr)
}
}
break;
- case op_i_select_big_sf:
- while (ap[0]) {
- Eterm *bigp = (Eterm *) ap;
- int arity = thing_arityval(*bigp);
- print_big(to, to_arg, bigp);
- size += TermWords(arity+1);
- ap += TermWords(arity+1);
- erts_print(to, to_arg, " f(" HEXF ") ", ap[0]);
- ap++;
- size++;
+ case op_i_jump_on_val_zero_rfI:
+ case op_i_jump_on_val_zero_xfI:
+ case op_i_jump_on_val_zero_yfI:
+ {
+ int n;
+ for (n = ap[-1]; n > 0; n--) {
+ erts_print(to, to_arg, "f(" HEXF ") ", ap[0]);
+ ap++;
+ size++;
+ }
+ }
+ break;
+ case op_i_put_tuple_rI:
+ case op_i_put_tuple_xI:
+ case op_i_put_tuple_yI:
+ {
+ int n = unpacked[-1];
+
+ while (n > 0) {
+ if (!is_header(ap[0])) {
+ erts_print(to, to_arg, " %T", (Eterm) ap[0]);
+ } else {
+ switch ((ap[0] >> 2) & 0x03) {
+ case R_REG_DEF:
+ erts_print(to, to_arg, " x(0)");
+ break;
+ case X_REG_DEF:
+ erts_print(to, to_arg, " x(%d)", ap[0] >> 4);
+ break;
+ case Y_REG_DEF:
+ erts_print(to, to_arg, " y(%d)", ap[0] >> 4);
+ break;
+ }
+ }
+ ap++, size++, n--;
+ }
}
- ap++;
- size++;
break;
}
erts_print(to, to_arg, "\n");
return size;
}
-
-static void
-print_big(int to, void *to_arg, Eterm* addr)
-{
- int i;
- int k;
-
- i = BIG_SIZE(addr);
- if (BIG_SIGN(addr))
- erts_print(to, to_arg, "-#integer(%d) = {", i);
- else
- erts_print(to, to_arg, "#integer(%d) = {", i);
- erts_print(to, to_arg, "0x%x", BIG_DIGIT(addr, 0));
- for (k = 1; k < i; k++)
- erts_print(to, to_arg, ",0x%x", BIG_DIGIT(addr, k));
- erts_print(to, to_arg, "}");
-}
diff --git a/erts/emulator/beam/beam_emu.c b/erts/emulator/beam/beam_emu.c
index 8a0e12dd4f..32ea8588d2 100644
--- a/erts/emulator/beam/beam_emu.c
+++ b/erts/emulator/beam/beam_emu.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -321,6 +321,7 @@ extern int count_instructions;
# define POST_BIF_GC_SWAPIN_0(_p, _res) \
ERTS_SMP_REQ_PROC_MAIN_LOCK((_p)); \
PROCESS_MAIN_CHK_LOCKS((_p)); \
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC((_p)); \
if (((_p)->mbuf) || (MSO(_p).overhead >= BIN_VHEAP_SZ(_p)) ) { \
_res = erts_gc_after_bif_call((_p), (_res), NULL, 0); \
E = (_p)->stop; \
@@ -328,6 +329,7 @@ extern int count_instructions;
HTOP = HEAP_TOP((_p))
# define POST_BIF_GC_SWAPIN(_p, _res, _regs, _arity) \
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC((_p)); \
ERTS_SMP_REQ_PROC_MAIN_LOCK((_p)); \
PROCESS_MAIN_CHK_LOCKS((_p)); \
if (((_p)->mbuf) || (MSO(_p).overhead >= BIN_VHEAP_SZ(_p)) ) { \
@@ -344,6 +346,8 @@ extern int count_instructions;
#define xb(N) (*(Eterm *) (((unsigned char *)reg) + (N)))
#define yb(N) (*(Eterm *) (((unsigned char *)E) + (N)))
#define fb(N) (*(double *) (((unsigned char *)&(freg[0].fd)) + (N)))
+#define Qb(N) (N)
+#define Ib(N) (N)
#define x(N) reg[N]
#define y(N) E[N]
#define r(N) x##N
@@ -365,6 +369,7 @@ extern int count_instructions;
reg[0] = r(0); \
PROCESS_MAIN_CHK_LOCKS(c_p); \
FCALLS -= erts_garbage_collect(c_p, needed + (HeapNeed), reg, (M)); \
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p); \
PROCESS_MAIN_CHK_LOCKS(c_p); \
r(0) = reg[0]; \
SWAPIN; \
@@ -418,6 +423,7 @@ extern int count_instructions;
reg[0] = r(0); \
PROCESS_MAIN_CHK_LOCKS(c_p); \
FCALLS -= erts_garbage_collect(c_p, need, reg, (Live)); \
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p); \
PROCESS_MAIN_CHK_LOCKS(c_p); \
r(0) = reg[0]; \
SWAPIN; \
@@ -440,6 +446,7 @@ extern int count_instructions;
reg[0] = r(0); \
PROCESS_MAIN_CHK_LOCKS(c_p); \
FCALLS -= erts_garbage_collect(c_p, need, reg, (Live)); \
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p); \
PROCESS_MAIN_CHK_LOCKS(c_p); \
r(0) = reg[0]; \
SWAPIN; \
@@ -462,6 +469,7 @@ extern int count_instructions;
reg[Live] = Extra; \
PROCESS_MAIN_CHK_LOCKS(c_p); \
FCALLS -= erts_garbage_collect(c_p, need, reg, (Live)+1); \
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p); \
PROCESS_MAIN_CHK_LOCKS(c_p); \
if (Live > 0) { \
r(0) = reg[0]; \
@@ -472,6 +480,13 @@ extern int count_instructions;
HEAP_SPACE_VERIFIED(need); \
} while (0)
+#define TestHeapPutList(Need, Reg) \
+ do { \
+ TestHeap((Need), 1); \
+ PutList(Reg, r(0), r(0), StoreSimpleDest); \
+ CHECK_TERM(r(0)); \
+ } while (0)
+
#ifdef HYBRID
#ifdef INCREMENTAL
#define TestGlobalHeap(Nh, Live, hp) \
@@ -516,6 +531,11 @@ extern int count_instructions;
SWAPIN; \
} while (0)
+#define PutTuple(Dst, Arity) \
+ do { \
+ Dst = make_tuple(HTOP); \
+ pt_arity = (Arity); \
+ } while (0)
/*
* Check that we haven't used the reductions and jump to function pointed to by
@@ -674,6 +694,11 @@ extern int count_instructions;
SET_I((BeamInstr *) CallDest); \
Dispatch();
+#define MoveJump(Src) \
+ r(0) = (Src); \
+ SET_I((BeamInstr *) Arg(0)); \
+ Goto(*I);
+
#define GetList(Src, H, T) do { \
Eterm* tmp_ptr = list_val(Src); \
H = CAR(tmp_ptr); \
@@ -723,16 +748,8 @@ extern int count_instructions;
(Dest) = (* (Eterm *) EXPAND_POINTER(tmp_arg1)); \
} while (0)
-#define PutTuple(Arity, Src, Dest) \
- ASSERT(is_arity_value(Arity)); \
- Dest = make_tuple(HTOP); \
- HTOP[0] = (Arity); \
- HTOP[1] = (Src); \
- HTOP += 2
-
-#define Put(Word) *HTOP++ = (Word)
-
#define EqualImmed(X, Y, Action) if (X != Y) { Action; }
+#define NotEqualImmed(X, Y, Action) if (X == Y) { Action; }
#define IsFloat(Src, Fail) if (is_not_float(Src)) { Fail; }
@@ -984,8 +1001,39 @@ extern int count_instructions;
#define IsPid(Src, Fail) if (is_not_pid(Src)) { Fail; }
#define IsRef(Src, Fail) if (is_not_ref(Src)) { Fail; }
-static BifFunction translate_gc_bif(void* gcf);
-static BeamInstr* handle_error(Process* c_p, BeamInstr* pc, Eterm* reg, BifFunction bf);
+/*
+ * process_main() is already huge, so we want to avoid inlining
+ * into it. Especially functions that are seldom used.
+ */
+#ifdef __GNUC__
+# define NOINLINE __attribute__((__noinline__))
+#else
+# define NOINLINE
+#endif
+
+/*
+ * The following functions are called directly by process_main().
+ * Don't inline them.
+ */
+static BifFunction translate_gc_bif(void* gcf) NOINLINE;
+static BeamInstr* handle_error(Process* c_p, BeamInstr* pc,
+ Eterm* reg, BifFunction bf) NOINLINE;
+static BeamInstr* call_error_handler(Process* p, BeamInstr* ip,
+ Eterm* reg, Eterm func) NOINLINE;
+static BeamInstr* fixed_apply(Process* p, Eterm* reg, Uint arity) NOINLINE;
+static BeamInstr* apply(Process* p, Eterm module, Eterm function,
+ Eterm args, Eterm* reg) NOINLINE;
+static BeamInstr* call_fun(Process* p, int arity,
+ Eterm* reg, Eterm args) NOINLINE;
+static BeamInstr* apply_fun(Process* p, Eterm fun,
+ Eterm args, Eterm* reg) NOINLINE;
+static Eterm new_fun(Process* p, Eterm* reg,
+ ErlFunEntry* fe, int num_free) NOINLINE;
+
+
+/*
+ * Functions not directly called by process_main(). OK to inline.
+ */
static BeamInstr* next_catch(Process* c_p, Eterm *reg);
static void terminate_proc(Process* c_p, Eterm Value);
static Eterm add_stacktrace(Process* c_p, Eterm Value, Eterm exc);
@@ -993,16 +1041,6 @@ static void save_stacktrace(Process* c_p, BeamInstr* pc, Eterm* reg,
BifFunction bf, Eterm args);
static struct StackTrace * get_trace_from_exc(Eterm exc);
static Eterm make_arglist(Process* c_p, Eterm* reg, int a);
-static Eterm call_error_handler(Process* p, BeamInstr* ip, Eterm* reg);
-static Eterm call_breakpoint_handler(Process* p, BeamInstr* fi, Eterm* reg);
-static BeamInstr* fixed_apply(Process* p, Eterm* reg, Uint arity);
-static BeamInstr* apply(Process* p, Eterm module, Eterm function,
- Eterm args, Eterm* reg);
-static int hibernate(Process* c_p, Eterm module, Eterm function,
- Eterm args, Eterm* reg);
-static BeamInstr* call_fun(Process* p, int arity, Eterm* reg, Eterm args);
-static BeamInstr* apply_fun(Process* p, Eterm fun, Eterm args, Eterm* reg);
-static Eterm new_fun(Process* p, Eterm* reg, ErlFunEntry* fe, int num_free);
#if defined(VXWORKS)
static int init_done;
@@ -1146,6 +1184,8 @@ void process_main(void)
Uint temp_bits; /* Temporary used by BsSkipBits2 & BsGetInteger2 */
+ Eterm pt_arity; /* Used by do_put_tuple */
+
ERL_BITS_DECLARE_STATEP; /* Has to be last declaration */
@@ -1178,7 +1218,12 @@ void process_main(void)
do_schedule1:
PROCESS_MAIN_CHK_LOCKS(c_p);
ERTS_SMP_UNREQ_PROC_MAIN_LOCK(c_p);
+#if HALFWORD_HEAP
+ ASSERT(erts_get_scheduler_data()->num_tmp_heap_used == 0);
+#endif
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
c_p = schedule(c_p, reds_used);
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
#ifdef DEBUG
pid = c_p->id;
#endif
@@ -1246,6 +1291,52 @@ void process_main(void)
#define STORE_ARITH_RESULT(res) StoreBifResult(2, (res));
#define ARITH_FUNC(name) erts_gc_##name
+ {
+ Eterm increment_reg_val;
+ Eterm increment_val;
+ Uint live;
+ Eterm result;
+
+ OpCase(i_increment_yIId):
+ increment_reg_val = yb(Arg(0));
+ goto do_increment;
+
+ OpCase(i_increment_xIId):
+ increment_reg_val = xb(Arg(0));
+ goto do_increment;
+
+ OpCase(i_increment_rIId):
+ increment_reg_val = r(0);
+ I--;
+
+ do_increment:
+ increment_val = Arg(1);
+ if (is_small(increment_reg_val)) {
+ Sint i = signed_val(increment_reg_val) + increment_val;
+ ASSERT(MY_IS_SSMALL(i) == IS_SSMALL(i));
+ if (MY_IS_SSMALL(i)) {
+ result = make_small(i);
+ store_result:
+ StoreBifResult(3, result);
+ }
+ }
+
+ live = Arg(2);
+ SWAPOUT;
+ reg[0] = r(0);
+ reg[live] = increment_reg_val;
+ reg[live+1] = make_small(increment_val);
+ result = erts_gc_mixed_plus(c_p, reg, live);
+ r(0) = reg[0];
+ SWAPIN;
+ ERTS_HOLE_CHECK(c_p);
+ if (is_value(result)) {
+ goto store_result;
+ }
+ ASSERT(c_p->freason != BADMATCH || is_value(c_p->fvalue));
+ goto find_func_info;
+ }
+
OpCase(i_plus_jId):
{
Eterm result;
@@ -1309,6 +1400,52 @@ void process_main(void)
}
Next(1);
+ {
+ Eterm is_eq_exact_lit_val;
+
+ OpCase(i_is_eq_exact_literal_xfc):
+ is_eq_exact_lit_val = xb(Arg(0));
+ I++;
+ goto do_is_eq_exact_literal;
+
+ OpCase(i_is_eq_exact_literal_yfc):
+ is_eq_exact_lit_val = yb(Arg(0));
+ I++;
+ goto do_is_eq_exact_literal;
+
+ OpCase(i_is_eq_exact_literal_rfc):
+ is_eq_exact_lit_val = r(0);
+
+ do_is_eq_exact_literal:
+ if (!eq(Arg(1), is_eq_exact_lit_val)) {
+ ClauseFail();
+ }
+ Next(2);
+ }
+
+ {
+ Eterm is_ne_exact_lit_val;
+
+ OpCase(i_is_ne_exact_literal_xfc):
+ is_ne_exact_lit_val = xb(Arg(0));
+ I++;
+ goto do_is_ne_exact_literal;
+
+ OpCase(i_is_ne_exact_literal_yfc):
+ is_ne_exact_lit_val = yb(Arg(0));
+ I++;
+ goto do_is_ne_exact_literal;
+
+ OpCase(i_is_ne_exact_literal_rfc):
+ is_ne_exact_lit_val = r(0);
+
+ do_is_ne_exact_literal:
+ if (eq(Arg(1), is_ne_exact_lit_val)) {
+ ClauseFail();
+ }
+ Next(2);
+ }
+
OpCase(i_move_call_only_fcr): {
r(0) = Arg(1);
}
@@ -1392,6 +1529,17 @@ void process_main(void)
NextPF(1, next);
}
+ OpCase(move_x1_c): {
+ x(1) = Arg(0);
+ Next(1);
+ }
+
+ OpCase(move_x2_c): {
+ x(2) = Arg(0);
+ Next(1);
+ }
+
+
OpCase(return): {
SET_I(c_p->cp);
/*
@@ -1405,16 +1553,6 @@ void process_main(void)
Goto(*I);
}
- OpCase(test_heap_1_put_list_Iy): {
- BeamInstr *next;
-
- PreFetch(2, next);
- TestHeap(Arg(0), 1);
- PutList(yb(Arg(1)), r(0), r(0), StoreSimpleDest);
- CHECK_TERM(r(0));
- NextPF(2, next);
- }
-
/*
* Send is almost a standard call-BIF with two arguments, except for:
* 1) It cannot be traced.
@@ -1447,24 +1585,36 @@ void process_main(void)
goto find_func_info;
}
- OpCase(i_element_jssd): {
- Eterm index;
- Eterm tuple;
-
- /*
- * Inlined version of element/2 for speed.
- */
- GetArg2(1, index, tuple);
- if (is_small(index) && is_tuple(tuple)) {
- Eterm* tp = tuple_val(tuple);
-
- if ((signed_val(index) >= 1) &&
- (signed_val(index) <= arityval(*tp))) {
- Eterm result = tp[signed_val(index)];
- StoreBifResult(3, result);
- }
- }
- }
+ {
+ Eterm element_index;
+ Eterm element_tuple;
+
+ OpCase(i_element_xjsd):
+ element_tuple = xb(Arg(0));
+ I++;
+ goto do_element;
+
+ OpCase(i_element_yjsd):
+ element_tuple = yb(Arg(0));
+ I++;
+ goto do_element;
+
+ OpCase(i_element_rjsd):
+ element_tuple = r(0);
+ /* Fall through */
+
+ do_element:
+ GetArg1(1, element_index);
+ if (is_small(element_index) && is_tuple(element_tuple)) {
+ Eterm* tp = tuple_val(element_tuple);
+
+ if ((signed_val(element_index) >= 1) &&
+ (signed_val(element_index) <= arityval(*tp))) {
+ Eterm result = tp[signed_val(element_index)];
+ StoreBifResult(2, result);
+ }
+ }
+ }
/* Fall through */
OpCase(badarg_j):
@@ -1472,24 +1622,32 @@ void process_main(void)
c_p->freason = BADARG;
goto lb_Cl_error;
- OpCase(i_fast_element_jIsd): {
- Eterm tuple;
-
- /*
- * Inlined version of element/2 for even more speed.
- * The first argument is an untagged integer >= 1.
- * The second argument is guaranteed to be a register operand.
- */
- GetArg1(2, tuple);
- if (is_tuple(tuple)) {
- Eterm* tp = tuple_val(tuple);
- tmp_arg2 = Arg(1);
- if (tmp_arg2 <= arityval(*tp)) {
- Eterm result = tp[tmp_arg2];
- StoreBifResult(3, result);
- }
- }
+ {
+ Eterm fast_element_tuple;
+
+ OpCase(i_fast_element_rjId):
+ fast_element_tuple = r(0);
+
+ do_fast_element:
+ if (is_tuple(fast_element_tuple)) {
+ Eterm* tp = tuple_val(fast_element_tuple);
+ Eterm pos = Arg(1); /* Untagged integer >= 1 */
+ if (pos <= arityval(*tp)) {
+ Eterm result = tp[pos];
+ StoreBifResult(2, result);
+ }
+ }
goto badarg;
+
+ OpCase(i_fast_element_xjId):
+ fast_element_tuple = xb(Arg(0));
+ I++;
+ goto do_fast_element;
+
+ OpCase(i_fast_element_yjId):
+ fast_element_tuple = yb(Arg(0));
+ I++;
+ goto do_fast_element;
}
OpCase(catch_yf):
@@ -1515,6 +1673,7 @@ void process_main(void)
SWAPOUT;
PROCESS_MAIN_CHK_LOCKS(c_p);
FCALLS -= erts_garbage_collect(c_p, 3, reg+2, 1);
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
PROCESS_MAIN_CHK_LOCKS(c_p);
SWAPIN;
}
@@ -1633,6 +1792,7 @@ void process_main(void)
PROCESS_MAIN_CHK_LOCKS(c_p);
},
{
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
PROCESS_MAIN_CHK_LOCKS(c_p);
r(0) = reg[0];
SWAPIN;
@@ -1691,6 +1851,7 @@ void process_main(void)
CANCEL_TIMER(c_p);
free_message(msgp);
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
PROCESS_MAIN_CHK_LOCKS(c_p);
NextPF(0, next);
@@ -1842,8 +2003,87 @@ void process_main(void)
NextPF(0, next);
}
- OpCase(i_select_val_sfI):
- GetArg1(0, tmp_arg1);
+
+ {
+ Eterm select_val2;
+
+ OpCase(i_select_tuple_arity2_yfAfAf):
+ select_val2 = yb(Arg(0));
+ goto do_select_tuple_arity2;
+
+ OpCase(i_select_tuple_arity2_xfAfAf):
+ select_val2 = xb(Arg(0));
+ goto do_select_tuple_arity2;
+
+ OpCase(i_select_tuple_arity2_rfAfAf):
+ select_val2 = r(0);
+ I--;
+
+ do_select_tuple_arity2:
+ if (is_not_tuple(select_val2)) {
+ goto select_val2_fail;
+ }
+ select_val2 = *tuple_val(select_val2);
+ goto do_select_val2;
+
+ OpCase(i_select_val2_yfcfcf):
+ select_val2 = yb(Arg(0));
+ goto do_select_val2;
+
+ OpCase(i_select_val2_xfcfcf):
+ select_val2 = xb(Arg(0));
+ goto do_select_val2;
+
+ OpCase(i_select_val2_rfcfcf):
+ select_val2 = r(0);
+ I--;
+
+ do_select_val2:
+ if (select_val2 == Arg(2)) {
+ I += 2;
+ } else if (select_val2 == Arg(4)) {
+ I += 4;
+ }
+
+ select_val2_fail:
+ SET_I((BeamInstr *) Arg(1));
+ Goto(*I);
+ }
+
+ {
+ Eterm select_val;
+
+ OpCase(i_select_tuple_arity_xfI):
+ select_val = xb(Arg(0));
+ goto do_select_tuple_arity;
+
+ OpCase(i_select_tuple_arity_yfI):
+ select_val = yb(Arg(0));
+ goto do_select_tuple_arity;
+
+ OpCase(i_select_tuple_arity_rfI):
+ select_val = r(0);
+ I--;
+
+ do_select_tuple_arity:
+ if (is_tuple(select_val)) {
+ select_val = *tuple_val(select_val);
+ goto do_binary_search;
+ }
+ SET_I((BeamInstr *) Arg(1));
+ Goto(*I);
+
+ OpCase(i_select_val_xfI):
+ select_val = xb(Arg(0));
+ goto do_binary_search;
+
+ OpCase(i_select_val_yfI):
+ select_val = yb(Arg(0));
+ goto do_binary_search;
+
+ OpCase(i_select_val_rfI):
+ select_val = r(0);
+ I--;
do_binary_search:
{
@@ -1880,9 +2120,9 @@ void process_main(void)
unsigned int boffset = ((unsigned int)bdiff >> 1) & ~(sizeof(struct Pairs)-1);
mid = (struct Pairs*)((char*)low + boffset);
- if (tmp_arg1 < mid->val) {
+ if (select_val < mid->val) {
high = mid;
- } else if (tmp_arg1 > mid->val) {
+ } else if (select_val > mid->val) {
low = mid + 1;
} else {
SET_I(mid->addr);
@@ -1892,16 +2132,28 @@ void process_main(void)
SET_I((BeamInstr *) Arg(1));
Goto(*I);
}
+ }
- OpCase(i_jump_on_val_zero_sfI):
{
- Eterm index;
-
- GetArg1(0, index);
- if (is_small(index)) {
- index = signed_val(index);
- if (index < Arg(2)) {
- SET_I((BeamInstr *) (&Arg(3))[index]);
+ Eterm jump_on_val_zero_index;
+
+ OpCase(i_jump_on_val_zero_yfI):
+ jump_on_val_zero_index = yb(Arg(0));
+ goto do_jump_on_val_zero_index;
+
+ OpCase(i_jump_on_val_zero_xfI):
+ jump_on_val_zero_index = xb(Arg(0));
+ goto do_jump_on_val_zero_index;
+
+ OpCase(i_jump_on_val_zero_rfI):
+ jump_on_val_zero_index = r(0);
+ I--;
+
+ do_jump_on_val_zero_index:
+ if (is_small(jump_on_val_zero_index)) {
+ jump_on_val_zero_index = signed_val(jump_on_val_zero_index);
+ if (jump_on_val_zero_index < Arg(2)) {
+ SET_I((BeamInstr *) (&Arg(3))[jump_on_val_zero_index]);
Goto(*I);
}
}
@@ -1909,15 +2161,27 @@ void process_main(void)
Goto(*I);
}
- OpCase(i_jump_on_val_sfII):
{
- Eterm index;
+ Eterm jump_on_val_index;
- GetArg1(0, index);
- if (is_small(index)) {
- index = (Uint) (signed_val(index) - Arg(3));
- if (index < Arg(2)) {
- SET_I((BeamInstr *) (&Arg(4))[index]);
+
+ OpCase(i_jump_on_val_yfII):
+ jump_on_val_index = yb(Arg(0));
+ goto do_jump_on_val_index;
+
+ OpCase(i_jump_on_val_xfII):
+ jump_on_val_index = xb(Arg(0));
+ goto do_jump_on_val_index;
+
+ OpCase(i_jump_on_val_rfII):
+ jump_on_val_index = r(0);
+ I--;
+
+ do_jump_on_val_index:
+ if (is_small(jump_on_val_index)) {
+ jump_on_val_index = (Uint) (signed_val(jump_on_val_index) - Arg(3));
+ if (jump_on_val_index < Arg(2)) {
+ SET_I((BeamInstr *) (&Arg(4))[jump_on_val_index]);
Goto(*I);
}
}
@@ -1925,6 +2189,32 @@ void process_main(void)
Goto(*I);
}
+ do_put_tuple: {
+ Eterm* hp = HTOP;
+
+ *hp++ = make_arityval(pt_arity);
+
+ do {
+ Eterm term = *I++;
+ switch (term & _TAG_IMMED1_MASK) {
+ case (R_REG_DEF << _TAG_PRIMARY_SIZE) | TAG_PRIMARY_HEADER:
+ *hp++ = r(0);
+ break;
+ case (X_REG_DEF << _TAG_PRIMARY_SIZE) | TAG_PRIMARY_HEADER:
+ *hp++ = x(term >> _TAG_IMMED1_SIZE);
+ break;
+ case (Y_REG_DEF << _TAG_PRIMARY_SIZE) | TAG_PRIMARY_HEADER:
+ *hp++ = y(term >> _TAG_IMMED1_SIZE);
+ break;
+ default:
+ *hp++ = term;
+ break;
+ }
+ } while (--pt_arity != 0);
+ HTOP = hp;
+ Goto(*I);
+ }
+
/*
* All guards with zero arguments have special instructions:
* self/0
@@ -1952,6 +2242,7 @@ void process_main(void)
ASSERT(!ERTS_PROC_IS_EXITING(c_p));
result = (*bf)(c_p, arg);
ASSERT(!ERTS_PROC_IS_EXITING(c_p) || is_non_value(result));
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
PROCESS_MAIN_CHK_LOCKS(c_p);
ERTS_HOLE_CHECK(c_p);
FCALLS = c_p->fcalls;
@@ -1980,6 +2271,7 @@ void process_main(void)
ASSERT(!ERTS_PROC_IS_EXITING(c_p));
result = (*bf)(c_p, arg);
ASSERT(!ERTS_PROC_IS_EXITING(c_p) || is_non_value(result));
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
PROCESS_MAIN_CHK_LOCKS(c_p);
ERTS_HOLE_CHECK(c_p);
FCALLS = c_p->fcalls;
@@ -2009,6 +2301,7 @@ void process_main(void)
PROCESS_MAIN_CHK_LOCKS(c_p);
ERTS_SMP_UNREQ_PROC_MAIN_LOCK(c_p);
result = (*bf)(c_p, reg, live);
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
ERTS_SMP_REQ_PROC_MAIN_LOCK(c_p);
PROCESS_MAIN_CHK_LOCKS(c_p);
SWAPIN;
@@ -2044,6 +2337,7 @@ void process_main(void)
PROCESS_MAIN_CHK_LOCKS(c_p);
ERTS_SMP_UNREQ_PROC_MAIN_LOCK(c_p);
result = (*bf)(c_p, reg, live);
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
ERTS_SMP_REQ_PROC_MAIN_LOCK(c_p);
PROCESS_MAIN_CHK_LOCKS(c_p);
SWAPIN;
@@ -2082,6 +2376,7 @@ void process_main(void)
PROCESS_MAIN_CHK_LOCKS(c_p);
ERTS_SMP_UNREQ_PROC_MAIN_LOCK(c_p);
result = (*bf)(c_p, reg, live);
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
ERTS_SMP_REQ_PROC_MAIN_LOCK(c_p);
PROCESS_MAIN_CHK_LOCKS(c_p);
SWAPIN;
@@ -2116,6 +2411,7 @@ void process_main(void)
ASSERT(!ERTS_PROC_IS_EXITING(c_p));
result = (*bf)(c_p, tmp_arg1, tmp_arg2);
ASSERT(!ERTS_PROC_IS_EXITING(c_p) || is_non_value(result));
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
PROCESS_MAIN_CHK_LOCKS(c_p);
ERTS_HOLE_CHECK(c_p);
FCALLS = c_p->fcalls;
@@ -2139,6 +2435,7 @@ void process_main(void)
ASSERT(!ERTS_PROC_IS_EXITING(c_p));
result = (*bf)(c_p, tmp_arg1, tmp_arg2);
ASSERT(!ERTS_PROC_IS_EXITING(c_p) || is_non_value(result));
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
PROCESS_MAIN_CHK_LOCKS(c_p);
ERTS_HOLE_CHECK(c_p);
if (is_value(result)) {
@@ -2562,23 +2859,25 @@ void process_main(void)
OpCase(i_int_bnot_jsId):
{
- GetArg1(1, tmp_arg1);
- if (is_small(tmp_arg1)) {
- tmp_arg1 = make_small(~signed_val(tmp_arg1));
+ Eterm bnot_val;
+
+ GetArg1(1, bnot_val);
+ if (is_small(bnot_val)) {
+ bnot_val = make_small(~signed_val(bnot_val));
} else {
Uint live = Arg(2);
SWAPOUT;
reg[0] = r(0);
- reg[live] = tmp_arg1;
- tmp_arg1 = erts_gc_bnot(c_p, reg, live);
+ reg[live] = bnot_val;
+ bnot_val = erts_gc_bnot(c_p, reg, live);
r(0) = reg[0];
SWAPIN;
ERTS_HOLE_CHECK(c_p);
- if (is_nil(tmp_arg1)) {
+ if (is_nil(bnot_val)) {
goto lb_Cl_error;
}
}
- StoreBifResult(3, tmp_arg1);
+ StoreBifResult(3, bnot_val);
}
badarith:
@@ -2833,121 +3132,6 @@ void process_main(void)
goto do_schedule1;
}
- OpCase(i_select_tuple_arity_sfI):
- {
- GetArg1(0, tmp_arg1);
-
- if (is_tuple(tmp_arg1)) {
- tmp_arg1 = *tuple_val(tmp_arg1);
- goto do_binary_search;
- }
- SET_I((BeamInstr *) Arg(1));
- Goto(*I);
- }
-
- OpCase(i_select_big_sf):
- {
- Eterm* bigp;
- Uint arity;
- Eterm* given;
- Uint given_arity;
- Uint given_size;
-
- GetArg1(0, tmp_arg1);
- if (is_big(tmp_arg1)) {
-
- /*
- * The loader has sorted the bignumbers in descending order
- * on the arity word. Therefore, we know that the search
- * has failed as soon as we encounter an arity word less than
- * the arity word of the given number. There is a zero word
- * (less than any valid arity word) stored after the last bignumber.
- */
-
- given = big_val(tmp_arg1);
- given_arity = given[0];
- given_size = thing_arityval(given_arity);
- bigp = (Eterm *) &Arg(2);
- while ((arity = bigp[0]) > given_arity) {
- bigp += (TermWords(thing_arityval(arity) + 1) + 1) * (sizeof(BeamInstr)/sizeof(Eterm));
- }
- while (bigp[0] == given_arity) {
- if (memcmp(bigp+1, given+1, sizeof(Eterm)*given_size) == 0) {
- BeamInstr *tmp =
- ((BeamInstr *) (UWord) bigp) + TermWords(given_size + 1);
- SET_I((BeamInstr *) *tmp);
- Goto(*I);
- }
- bigp += (TermWords(thing_arityval(arity) + 1) + 1) * (sizeof(BeamInstr)/sizeof(Eterm));
- }
- }
-
- /*
- * Failed.
- */
-
- SET_I((BeamInstr *) Arg(1));
- Goto(*I);
- }
-
-#if defined(ARCH_64) && !HALFWORD_HEAP
- OpCase(i_select_float_sfI):
- {
- Uint f;
- int n;
- struct ValLabel {
- Uint f;
- BeamInstr* addr;
- };
- struct ValLabel* ptr;
-
- GetArg1(0, tmp_arg1);
- ASSERT(is_float(tmp_arg1));
- f = float_val(tmp_arg1)[1];
- n = Arg(2);
- ptr = (struct ValLabel *) &Arg(3);
- while (n-- > 0) {
- if (ptr->f == f) {
- SET_I(ptr->addr);
- Goto(*I);
- }
- ptr++;
- }
- SET_I((Eterm *) Arg(1));
- Goto(*I);
- }
-#else
- OpCase(i_select_float_sfI):
- {
- Uint fpart1;
- Uint fpart2;
- int n;
- struct ValLabel {
- Uint fpart1;
- Uint fpart2;
- BeamInstr* addr;
- };
- struct ValLabel* ptr;
-
- GetArg1(0, tmp_arg1);
- ASSERT(is_float(tmp_arg1));
- fpart1 = float_val(tmp_arg1)[1];
- fpart2 = float_val(tmp_arg1)[2];
-
- n = Arg(2);
- ptr = (struct ValLabel *) &Arg(3);
- while (n-- > 0) {
- if (ptr->fpart1 == fpart1 && ptr->fpart2 == fpart2) {
- SET_I(ptr->addr);
- Goto(*I);
- }
- ptr++;
- }
- SET_I((BeamInstr *) Arg(1));
- Goto(*I);
- }
-#endif
-
OpCase(set_tuple_element_sdP): {
Eterm element;
Eterm tuple;
@@ -2993,15 +3177,17 @@ void process_main(void)
the first argument. We also handle atom tags in the first
argument for backwards compatibility.
*/
- GetArg2(0, tmp_arg1, tmp_arg2);
- c_p->fvalue = tmp_arg2;
+ Eterm raise_val1;
+ Eterm raise_val2;
+ GetArg2(0, raise_val1, raise_val2);
+ c_p->fvalue = raise_val2;
if (c_p->freason == EXC_NULL) {
/* a safety check for the R10-0 case; should not happen */
c_p->ftrace = NIL;
c_p->freason = EXC_ERROR;
}
/* for R10-0 code, keep existing c_p->ftrace and hope it's correct */
- switch (tmp_arg1) {
+ switch (raise_val1) {
case am_throw:
c_p->freason = EXC_THROWN & ~EXF_SAVETRACE;
break;
@@ -3017,8 +3203,8 @@ void process_main(void)
passed from a user! Currently only expecting generated calls.
*/
struct StackTrace *s;
- c_p->ftrace = tmp_arg1;
- s = get_trace_from_exc(tmp_arg1);
+ c_p->ftrace = raise_val1;
+ s = get_trace_from_exc(raise_val1);
if (s == NULL) {
c_p->freason = EXC_ERROR;
} else {
@@ -3029,11 +3215,24 @@ void process_main(void)
goto find_func_info;
}
- OpCase(badmatch_s): {
- GetArg1(0, tmp_arg1);
- c_p->fvalue = tmp_arg1;
- c_p->freason = BADMATCH;
- }
+ {
+ Eterm badmatch_val;
+
+ OpCase(badmatch_y):
+ badmatch_val = yb(Arg(0));
+ goto do_badmatch;
+
+ OpCase(badmatch_x):
+ badmatch_val = xb(Arg(0));
+ goto do_badmatch;
+
+ OpCase(badmatch_r):
+ badmatch_val = r(0);
+
+ do_badmatch:
+ c_p->fvalue = badmatch_val;
+ c_p->freason = BADMATCH;
+ }
/* Fall through here */
find_func_info: {
@@ -3056,12 +3255,11 @@ void process_main(void)
*/
SWAPOUT;
reg[0] = r(0);
- tmp_arg1 = call_error_handler(c_p, I-3, reg);
+ I = call_error_handler(c_p, I-3, reg, am_undefined_function);
r(0) = reg[0];
SWAPIN;
- if (tmp_arg1) {
- SET_I(c_p->i);
- Dispatch();
+ if (I) {
+ Goto(*I);
}
/* Fall through */
@@ -3084,128 +3282,154 @@ void process_main(void)
}
}
- OpCase(call_nif):
- {
- /*
- * call_nif is always first instruction in function:
- *
- * I[-3]: Module
- * I[-2]: Function
- * I[-1]: Arity
- * I[0]: &&call_nif
- * I[1]: Function pointer to NIF function
- * I[2]: Pointer to erl_module_nif
- */
- BifFunction vbf;
-
- c_p->current = I-3; /* current and vbf set to please handle_error */
- SWAPOUT;
- c_p->fcalls = FCALLS - 1;
- PROCESS_MAIN_CHK_LOCKS(c_p);
- tmp_arg2 = I[-1];
- ERTS_SMP_UNREQ_PROC_MAIN_LOCK(c_p);
+ {
+ Eterm nif_bif_result;
+ Eterm bif_nif_arity;
- ASSERT(!ERTS_PROC_IS_EXITING(c_p));
- {
- typedef Eterm NifF(struct enif_environment_t*, int argc, Eterm argv[]);
- NifF* fp = vbf = (NifF*) I[1];
- struct enif_environment_t env;
- erts_pre_nif(&env, c_p, (struct erl_module_nif*)I[2]);
- reg[0] = r(0);
- tmp_arg1 = (*fp)(&env, tmp_arg2, reg);
- erts_post_nif(&env);
- }
- ASSERT(!ERTS_PROC_IS_EXITING(c_p) || is_non_value(tmp_arg1));
- PROCESS_MAIN_CHK_LOCKS(c_p);
- goto apply_bif_or_nif_epilogue;
-
- OpCase(apply_bif):
- /*
- * At this point, I points to the code[3] in the export entry for
- * the BIF:
- *
- * code[0]: Module
- * code[1]: Function
- * code[2]: Arity
- * code[3]: &&apply_bif
- * code[4]: Function pointer to BIF function
- */
+ OpCase(call_nif):
+ {
+ /*
+ * call_nif is always first instruction in function:
+ *
+ * I[-3]: Module
+ * I[-2]: Function
+ * I[-1]: Arity
+ * I[0]: &&call_nif
+ * I[1]: Function pointer to NIF function
+ * I[2]: Pointer to erl_module_nif
+ */
+ BifFunction vbf;
- c_p->current = I-3; /* In case we apply process_info/1,2 or load_nif/1 */
- c_p->i = I; /* In case we apply check_process_code/2. */
- c_p->arity = 0; /* To allow garbage collection on ourselves
- * (check_process_code/2).
- */
- SWAPOUT;
- c_p->fcalls = FCALLS - 1;
- vbf = (BifFunction) Arg(0);
- PROCESS_MAIN_CHK_LOCKS(c_p);
- tmp_arg2 = I[-1];
- ASSERT(tmp_arg2 <= 3);
- ERTS_SMP_UNREQ_PROC_MAIN_LOCK(c_p);
- switch (tmp_arg2) {
- case 3:
+ c_p->current = I-3; /* current and vbf set to please handle_error */
+ SWAPOUT;
+ c_p->fcalls = FCALLS - 1;
+ PROCESS_MAIN_CHK_LOCKS(c_p);
+ bif_nif_arity = I[-1];
+ ERTS_SMP_UNREQ_PROC_MAIN_LOCK(c_p);
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
+
+ ASSERT(!ERTS_PROC_IS_EXITING(c_p));
{
- Eterm (*bf)(Process*, Eterm, Eterm, Eterm, BeamInstr*) = vbf;
- ASSERT(!ERTS_PROC_IS_EXITING(c_p));
- tmp_arg1 = (*bf)(c_p, r(0), x(1), x(2), I);
- ASSERT(!ERTS_PROC_IS_EXITING(c_p) || is_non_value(tmp_arg1));
- PROCESS_MAIN_CHK_LOCKS(c_p);
+ typedef Eterm NifF(struct enif_environment_t*, int argc, Eterm argv[]);
+ NifF* fp = vbf = (NifF*) I[1];
+ struct enif_environment_t env;
+ erts_pre_nif(&env, c_p, (struct erl_module_nif*)I[2]);
+ reg[0] = r(0);
+ nif_bif_result = (*fp)(&env, bif_nif_arity, reg);
+ erts_post_nif(&env);
}
- break;
- case 2:
- {
- Eterm (*bf)(Process*, Eterm, Eterm, BeamInstr*) = vbf;
- ASSERT(!ERTS_PROC_IS_EXITING(c_p));
- tmp_arg1 = (*bf)(c_p, r(0), x(1), I);
- ASSERT(!ERTS_PROC_IS_EXITING(c_p) || is_non_value(tmp_arg1));
- PROCESS_MAIN_CHK_LOCKS(c_p);
+ ASSERT(!ERTS_PROC_IS_EXITING(c_p) || is_non_value(nif_bif_result));
+ PROCESS_MAIN_CHK_LOCKS(c_p);
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
+ goto apply_bif_or_nif_epilogue;
+
+ OpCase(apply_bif):
+ /*
+ * At this point, I points to the code[3] in the export entry for
+ * the BIF:
+ *
+ * code[0]: Module
+ * code[1]: Function
+ * code[2]: Arity
+ * code[3]: &&apply_bif
+ * code[4]: Function pointer to BIF function
+ */
+
+ c_p->current = I-3; /* In case we apply process_info/1,2 or load_nif/1 */
+ c_p->i = I; /* In case we apply check_process_code/2. */
+ c_p->arity = 0; /* To allow garbage collection on ourselves
+ * (check_process_code/2).
+ */
+ SWAPOUT;
+ c_p->fcalls = FCALLS - 1;
+ vbf = (BifFunction) Arg(0);
+ PROCESS_MAIN_CHK_LOCKS(c_p);
+ bif_nif_arity = I[-1];
+ ASSERT(bif_nif_arity <= 3);
+ ERTS_SMP_UNREQ_PROC_MAIN_LOCK(c_p);
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
+ switch (bif_nif_arity) {
+ case 3:
+ {
+ Eterm (*bf)(Process*, Eterm, Eterm, Eterm, BeamInstr*) = vbf;
+ ASSERT(!ERTS_PROC_IS_EXITING(c_p));
+ nif_bif_result = (*bf)(c_p, r(0), x(1), x(2), I);
+ ASSERT(!ERTS_PROC_IS_EXITING(c_p) ||
+ is_non_value(nif_bif_result));
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
+ PROCESS_MAIN_CHK_LOCKS(c_p);
+ }
+ break;
+ case 2:
+ {
+ Eterm (*bf)(Process*, Eterm, Eterm, BeamInstr*) = vbf;
+ ASSERT(!ERTS_PROC_IS_EXITING(c_p));
+ nif_bif_result = (*bf)(c_p, r(0), x(1), I);
+ ASSERT(!ERTS_PROC_IS_EXITING(c_p) ||
+ is_non_value(nif_bif_result));
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
+ PROCESS_MAIN_CHK_LOCKS(c_p);
+ }
+ break;
+ case 1:
+ {
+ Eterm (*bf)(Process*, Eterm, BeamInstr*) = vbf;
+ ASSERT(!ERTS_PROC_IS_EXITING(c_p));
+ nif_bif_result = (*bf)(c_p, r(0), I);
+ ASSERT(!ERTS_PROC_IS_EXITING(c_p) ||
+ is_non_value(nif_bif_result));
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
+ PROCESS_MAIN_CHK_LOCKS(c_p);
+ }
+ break;
+ case 0:
+ {
+ Eterm (*bf)(Process*, BeamInstr*) = vbf;
+ ASSERT(!ERTS_PROC_IS_EXITING(c_p));
+ nif_bif_result = (*bf)(c_p, I);
+ ASSERT(!ERTS_PROC_IS_EXITING(c_p) ||
+ is_non_value(nif_bif_result));
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
+ PROCESS_MAIN_CHK_LOCKS(c_p);
+ break;
+ }
+ default:
+ erl_exit(1, "apply_bif: invalid arity: %u\n",
+ bif_nif_arity);
}
- break;
- case 1:
- {
- Eterm (*bf)(Process*, Eterm, BeamInstr*) = vbf;
- ASSERT(!ERTS_PROC_IS_EXITING(c_p));
- tmp_arg1 = (*bf)(c_p, r(0), I);
- ASSERT(!ERTS_PROC_IS_EXITING(c_p) || is_non_value(tmp_arg1));
- PROCESS_MAIN_CHK_LOCKS(c_p);
+
+ apply_bif_or_nif_epilogue:
+ ERTS_SMP_REQ_PROC_MAIN_LOCK(c_p);
+ ERTS_HOLE_CHECK(c_p);
+ if (c_p->mbuf) {
+ reg[0] = r(0);
+ nif_bif_result = erts_gc_after_bif_call(c_p, nif_bif_result,
+ reg, bif_nif_arity);
+ r(0) = reg[0];
}
- break;
- case 0:
- {
- Eterm (*bf)(Process*, BeamInstr*) = vbf;
- ASSERT(!ERTS_PROC_IS_EXITING(c_p));
- tmp_arg1 = (*bf)(c_p, I);
- ASSERT(!ERTS_PROC_IS_EXITING(c_p) || is_non_value(tmp_arg1));
- PROCESS_MAIN_CHK_LOCKS(c_p);
- break;
+ SWAPIN; /* There might have been a garbage collection. */
+ FCALLS = c_p->fcalls;
+ if (is_value(nif_bif_result)) {
+ r(0) = nif_bif_result;
+ CHECK_TERM(r(0));
+ SET_I(c_p->cp);
+ c_p->cp = 0;
+ Goto(*I);
+ } else if (c_p->freason == TRAP) {
+ SET_I(*((BeamInstr **) (UWord) ((c_p)->def_arg_reg + 3)));
+ r(0) = c_p->def_arg_reg[0];
+ x(1) = c_p->def_arg_reg[1];
+ x(2) = c_p->def_arg_reg[2];
+ if (c_p->flags & F_HIBERNATE_SCHED) {
+ c_p->flags &= ~F_HIBERNATE_SCHED;
+ goto do_schedule;
+ }
+ Dispatch();
}
- }
-apply_bif_or_nif_epilogue:
- ERTS_SMP_REQ_PROC_MAIN_LOCK(c_p);
- ERTS_HOLE_CHECK(c_p);
- if (c_p->mbuf) {
reg[0] = r(0);
- tmp_arg1 = erts_gc_after_bif_call(c_p, tmp_arg1, reg, tmp_arg2);
- r(0) = reg[0];
+ I = handle_error(c_p, c_p->cp, reg, vbf);
+ goto post_error_handling;
}
- SWAPIN; /* There might have been a garbage collection. */
- FCALLS = c_p->fcalls;
- if (is_value(tmp_arg1)) {
- r(0) = tmp_arg1;
- CHECK_TERM(r(0));
- SET_I(c_p->cp);
- Goto(*I);
- } else if (c_p->freason == TRAP) {
- SET_I(*((BeamInstr **) (UWord) ((c_p)->def_arg_reg + 3)));
- r(0) = c_p->def_arg_reg[0];
- x(1) = c_p->def_arg_reg[1];
- x(2) = c_p->def_arg_reg[2];
- Dispatch();
- }
- reg[0] = r(0);
- I = handle_error(c_p, c_p->cp, reg, vbf);
- goto post_error_handling;
}
OpCase(i_get_sd):
@@ -3218,11 +3442,25 @@ apply_bif_or_nif_epilogue:
StoreBifResult(1, result);
}
- OpCase(case_end_s):
- GetArg1(0, tmp_arg1);
- c_p->fvalue = tmp_arg1;
- c_p->freason = EXC_CASE_CLAUSE;
- goto find_func_info;
+ {
+ Eterm case_end_val;
+
+ OpCase(case_end_x):
+ case_end_val = xb(Arg(0));
+ goto do_case_end;
+
+ OpCase(case_end_y):
+ case_end_val = yb(Arg(0));
+ goto do_case_end;
+
+ OpCase(case_end_r):
+ case_end_val = r(0);
+
+ do_case_end:
+ c_p->fvalue = case_end_val;
+ c_p->freason = EXC_CASE_CLAUSE;
+ goto find_func_info;
+ }
OpCase(if_end):
c_p->freason = EXC_IF_CLAUSE;
@@ -3235,10 +3473,13 @@ apply_bif_or_nif_epilogue:
}
OpCase(try_case_end_s):
- GetArg1(0, tmp_arg1);
- c_p->fvalue = tmp_arg1;
- c_p->freason = EXC_TRY_CLAUSE;
- goto find_func_info;
+ {
+ Eterm try_case_end_val;
+ GetArg1(0, try_case_end_val);
+ c_p->fvalue = try_case_end_val;
+ c_p->freason = EXC_TRY_CLAUSE;
+ goto find_func_info;
+ }
/*
* Construction of binaries using new instructions.
@@ -3786,19 +4027,20 @@ apply_bif_or_nif_epilogue:
Eterm header;
BeamInstr *next;
Uint slots;
+ Eterm context;
OpCase(i_bs_start_match2_rfIId): {
- tmp_arg1 = r(0);
+ context = r(0);
do_start_match:
slots = Arg(2);
- if (!is_boxed(tmp_arg1)) {
+ if (!is_boxed(context)) {
ClauseFail();
}
PreFetch(4, next);
- header = *boxed_val(tmp_arg1);
+ header = *boxed_val(context);
if (header_is_bin_matchstate(header)) {
- ErlBinMatchState* ms = (ErlBinMatchState *) boxed_val(tmp_arg1);
+ ErlBinMatchState* ms = (ErlBinMatchState *) boxed_val(context);
Uint actual_slots = HEADER_NUM_SLOTS(header);
ms->save_offset[0] = ms->mb.offset;
if (actual_slots < slots) {
@@ -3806,8 +4048,8 @@ apply_bif_or_nif_epilogue:
Uint live = Arg(1);
Uint wordsneeded = ERL_BIN_MATCHSTATE_SIZE(slots);
- TestHeapPreserve(wordsneeded, live, tmp_arg1);
- ms = (ErlBinMatchState *) boxed_val(tmp_arg1);
+ TestHeapPreserve(wordsneeded, live, context);
+ ms = (ErlBinMatchState *) boxed_val(context);
dst = (ErlBinMatchState *) HTOP;
*dst = *ms;
*HTOP = HEADER_BIN_MATCHSTATE(slots);
@@ -3819,12 +4061,12 @@ apply_bif_or_nif_epilogue:
Eterm result;
Uint live = Arg(1);
Uint wordsneeded = ERL_BIN_MATCHSTATE_SIZE(slots);
- TestHeapPreserve(wordsneeded, live, tmp_arg1);
+ TestHeapPreserve(wordsneeded, live, context);
HEAP_TOP(c_p) = HTOP;
#ifdef DEBUG
c_p->stop = E; /* Needed for checking in HeapOnlyAlloc(). */
#endif
- result = erts_bs_start_match_2(c_p, tmp_arg1, slots);
+ result = erts_bs_start_match_2(c_p, context, slots);
HTOP = HEAP_TOP(c_p);
HEAP_SPACE_VERIFIED(0);
if (is_non_value(result)) {
@@ -3838,12 +4080,12 @@ apply_bif_or_nif_epilogue:
NextPF(4, next);
}
OpCase(i_bs_start_match2_xfIId): {
- tmp_arg1 = xb(Arg(0));
+ context = xb(Arg(0));
I++;
goto do_start_match;
}
OpCase(i_bs_start_match2_yfIId): {
- tmp_arg1 = yb(Arg(0));
+ context = yb(Arg(0));
I++;
goto do_start_match;
}
@@ -3936,93 +4178,105 @@ apply_bif_or_nif_epilogue:
NextPF(2, next);
}
+ {
+ Eterm bs_get_integer8_context;
+
OpCase(i_bs_get_integer_8_rfd): {
- tmp_arg1 = r(0);
- goto do_bs_get_integer_8;
- }
+ bs_get_integer8_context = r(0);
+ goto do_bs_get_integer_8;
+ }
OpCase(i_bs_get_integer_8_xfd): {
- tmp_arg1 = xb(Arg(0));
- I++;
- }
+ bs_get_integer8_context = xb(Arg(0));
+ I++;
+ }
do_bs_get_integer_8: {
- ErlBinMatchBuffer *_mb;
- Eterm _result;
- _mb = ms_matchbuffer(tmp_arg1);
- if (_mb->size - _mb->offset < 8) {
- ClauseFail();
- }
- if (BIT_OFFSET(_mb->offset) != 0) {
- _result = erts_bs_get_integer_2(c_p, 8, 0, _mb);
- } else {
- _result = make_small(_mb->base[BYTE_OFFSET(_mb->offset)]);
- _mb->offset += 8;
+ ErlBinMatchBuffer *_mb;
+ Eterm _result;
+ _mb = ms_matchbuffer(bs_get_integer8_context);
+ if (_mb->size - _mb->offset < 8) {
+ ClauseFail();
+ }
+ if (BIT_OFFSET(_mb->offset) != 0) {
+ _result = erts_bs_get_integer_2(c_p, 8, 0, _mb);
+ } else {
+ _result = make_small(_mb->base[BYTE_OFFSET(_mb->offset)]);
+ _mb->offset += 8;
+ }
+ StoreBifResult(1, _result);
}
- StoreBifResult(1, _result);
}
- OpCase(i_bs_get_integer_16_rfd): {
- tmp_arg1 = r(0);
+ {
+ Eterm bs_get_integer_16_context;
+
+ OpCase(i_bs_get_integer_16_rfd):
+ bs_get_integer_16_context = r(0);
goto do_bs_get_integer_16;
- }
- OpCase(i_bs_get_integer_16_xfd): {
- tmp_arg1 = xb(Arg(0));
+ OpCase(i_bs_get_integer_16_xfd):
+ bs_get_integer_16_context = xb(Arg(0));
I++;
- }
- do_bs_get_integer_16: {
- ErlBinMatchBuffer *_mb;
- Eterm _result;
- _mb = ms_matchbuffer(tmp_arg1);
- if (_mb->size - _mb->offset < 16) {
- ClauseFail();
- }
- if (BIT_OFFSET(_mb->offset) != 0) {
- _result = erts_bs_get_integer_2(c_p, 16, 0, _mb);
- } else {
- _result = make_small(get_int16(_mb->base+BYTE_OFFSET(_mb->offset)));
- _mb->offset += 16;
+ do_bs_get_integer_16:
+ {
+ ErlBinMatchBuffer *_mb;
+ Eterm _result;
+ _mb = ms_matchbuffer(bs_get_integer_16_context);
+ if (_mb->size - _mb->offset < 16) {
+ ClauseFail();
+ }
+ if (BIT_OFFSET(_mb->offset) != 0) {
+ _result = erts_bs_get_integer_2(c_p, 16, 0, _mb);
+ } else {
+ _result = make_small(get_int16(_mb->base+BYTE_OFFSET(_mb->offset)));
+ _mb->offset += 16;
+ }
+ StoreBifResult(1, _result);
}
- StoreBifResult(1, _result);
}
- OpCase(i_bs_get_integer_32_rfId): {
- tmp_arg1 = r(0);
+ {
+ Eterm bs_get_integer_32_context;
+
+ OpCase(i_bs_get_integer_32_rfId):
+ bs_get_integer_32_context = r(0);
goto do_bs_get_integer_32;
- }
+
- OpCase(i_bs_get_integer_32_xfId): {
- tmp_arg1 = xb(Arg(0));
+ OpCase(i_bs_get_integer_32_xfId):
+ bs_get_integer_32_context = xb(Arg(0));
I++;
- }
- do_bs_get_integer_32: {
- ErlBinMatchBuffer *_mb;
- Uint32 _integer;
- Eterm _result;
- _mb = ms_matchbuffer(tmp_arg1);
- if (_mb->size - _mb->offset < 32) { ClauseFail(); }
- if (BIT_OFFSET(_mb->offset) != 0) {
- _integer = erts_bs_get_unaligned_uint32(_mb);
- } else {
- _integer = get_int32(_mb->base + _mb->offset/8);
- }
- _mb->offset += 32;
+
+ do_bs_get_integer_32:
+ {
+ ErlBinMatchBuffer *_mb;
+ Uint32 _integer;
+ Eterm _result;
+ _mb = ms_matchbuffer(bs_get_integer_32_context);
+ if (_mb->size - _mb->offset < 32) { ClauseFail(); }
+ if (BIT_OFFSET(_mb->offset) != 0) {
+ _integer = erts_bs_get_unaligned_uint32(_mb);
+ } else {
+ _integer = get_int32(_mb->base + _mb->offset/8);
+ }
+ _mb->offset += 32;
#if !defined(ARCH_64) || HALFWORD_HEAP
- if (IS_USMALL(0, _integer)) {
+ if (IS_USMALL(0, _integer)) {
#endif
- _result = make_small(_integer);
+ _result = make_small(_integer);
#if !defined(ARCH_64) || HALFWORD_HEAP
- } else {
- TestHeap(BIG_UINT_HEAP_SIZE, Arg(1));
- _result = uint_to_big((Uint) _integer, HTOP);
- HTOP += BIG_UINT_HEAP_SIZE;
- HEAP_SPACE_VERIFIED(0);
- }
+ } else {
+ TestHeap(BIG_UINT_HEAP_SIZE, Arg(1));
+ _result = uint_to_big((Uint) _integer, HTOP);
+ HTOP += BIG_UINT_HEAP_SIZE;
+ HEAP_SPACE_VERIFIED(0);
+ }
#endif
- StoreBifResult(2, _result);
+ StoreBifResult(2, _result);
+ }
}
/* Operands: Size Live Fail Flags Dst */
@@ -4120,54 +4374,64 @@ apply_bif_or_nif_epilogue:
StoreBifResult(3, result);
}
- /* Operands: MatchContext Fail Dst */
+ {
+ Eterm get_utf8_context;
+
+ /* Operands: MatchContext Fail Dst */
OpCase(i_bs_get_utf8_rfd): {
- tmp_arg1 = r(0);
- goto do_bs_get_utf8;
- }
+ get_utf8_context = r(0);
+ goto do_bs_get_utf8;
+ }
OpCase(i_bs_get_utf8_xfd): {
- tmp_arg1 = xb(Arg(0));
- I++;
- }
+ get_utf8_context = xb(Arg(0));
+ I++;
+ }
- /*
- * tmp_arg1 = match_context
- * Operands: Fail Dst
- */
+ /*
+ * get_utf8_context = match_context
+ * Operands: Fail Dst
+ */
- do_bs_get_utf8: {
- Eterm result = erts_bs_get_utf8(ms_matchbuffer(tmp_arg1));
- if (is_non_value(result)) {
- ClauseFail();
+ do_bs_get_utf8: {
+ Eterm result = erts_bs_get_utf8(ms_matchbuffer(get_utf8_context));
+ if (is_non_value(result)) {
+ ClauseFail();
+ }
+ StoreBifResult(1, result);
}
- StoreBifResult(1, result);
}
- /* Operands: MatchContext Fail Flags Dst */
+ {
+ Eterm get_utf16_context;
+
+ /* Operands: MatchContext Fail Flags Dst */
OpCase(i_bs_get_utf16_rfId): {
- tmp_arg1 = r(0);
- goto do_bs_get_utf16;
- }
+ get_utf16_context = r(0);
+ goto do_bs_get_utf16;
+ }
OpCase(i_bs_get_utf16_xfId): {
- tmp_arg1 = xb(Arg(0));
- I++;
- }
+ get_utf16_context = xb(Arg(0));
+ I++;
+ }
- /*
- * tmp_arg1 = match_context
- * Operands: Fail Flags Dst
- */
- do_bs_get_utf16: {
- Eterm result = erts_bs_get_utf16(ms_matchbuffer(tmp_arg1), Arg(1));
- if (is_non_value(result)) {
- ClauseFail();
+ /*
+ * get_utf16_context = match_context
+ * Operands: Fail Flags Dst
+ */
+ do_bs_get_utf16: {
+ Eterm result = erts_bs_get_utf16(ms_matchbuffer(get_utf16_context),
+ Arg(1));
+ if (is_non_value(result)) {
+ ClauseFail();
+ }
+ StoreBifResult(2, result);
}
- StoreBifResult(2, result);
}
{
+ Eterm context_to_binary_context;
ErlBinMatchBuffer* mb;
ErlSubBin* sb;
Uint size;
@@ -4176,27 +4440,29 @@ apply_bif_or_nif_epilogue:
Uint hole_size;
OpCase(bs_context_to_binary_r): {
- tmp_arg1 = x0;
+ context_to_binary_context = x0;
I -= 2;
goto do_context_to_binary;
}
/* Unfortunately, inlining can generate this instruction. */
OpCase(bs_context_to_binary_y): {
- tmp_arg1 = yb(Arg(0));
+ context_to_binary_context = yb(Arg(0));
goto do_context_to_binary0;
}
OpCase(bs_context_to_binary_x): {
- tmp_arg1 = xb(Arg(0));
+ context_to_binary_context = xb(Arg(0));
do_context_to_binary0:
I--;
}
do_context_to_binary:
- if (is_boxed(tmp_arg1) && header_is_bin_matchstate(*boxed_val(tmp_arg1))) {
- ErlBinMatchState* ms = (ErlBinMatchState *) boxed_val(tmp_arg1);
+ if (is_boxed(context_to_binary_context) &&
+ header_is_bin_matchstate(*boxed_val(context_to_binary_context))) {
+ ErlBinMatchState* ms;
+ ms = (ErlBinMatchState *) boxed_val(context_to_binary_context);
mb = &ms->mb;
offs = ms->save_offset[0];
size = mb->size - offs;
@@ -4205,17 +4471,17 @@ apply_bif_or_nif_epilogue:
Next(2);
OpCase(i_bs_get_binary_all_reuse_rfI): {
- tmp_arg1 = x0;
+ context_to_binary_context = x0;
goto do_bs_get_binary_all_reuse;
}
OpCase(i_bs_get_binary_all_reuse_xfI): {
- tmp_arg1 = xb(Arg(0));
+ context_to_binary_context = xb(Arg(0));
I++;
}
do_bs_get_binary_all_reuse:
- mb = ms_matchbuffer(tmp_arg1);
+ mb = ms_matchbuffer(context_to_binary_context);
size = mb->size - mb->offset;
if (size % Arg(1) != 0) {
ClauseFail();
@@ -4224,7 +4490,7 @@ apply_bif_or_nif_epilogue:
do_bs_get_binary_all_reuse_common:
orig = mb->orig;
- sb = (ErlSubBin *) boxed_val(tmp_arg1);
+ sb = (ErlSubBin *) boxed_val(context_to_binary_context);
hole_size = 1 + header_arity(sb->thing_word) - ERL_SUB_BIN_SIZE;
sb->thing_word = HEADER_SUB_BIN;
sb->size = BYTE_OFFSET(size);
@@ -4240,12 +4506,14 @@ apply_bif_or_nif_epilogue:
}
{
+ Eterm match_string_context;
+
OpCase(i_bs_match_string_rfII): {
- tmp_arg1 = r(0);
+ match_string_context = r(0);
goto do_bs_match_string;
}
OpCase(i_bs_match_string_xfII): {
- tmp_arg1 = xb(Arg(0));
+ match_string_context = xb(Arg(0));
I++;
}
@@ -4260,7 +4528,7 @@ apply_bif_or_nif_epilogue:
PreFetch(3, next);
bits = Arg(1);
bytes = (byte *) Arg(2);
- mb = ms_matchbuffer(tmp_arg1);
+ mb = ms_matchbuffer(match_string_context);
if (mb->size - mb->offset < bits) {
ClauseFail();
}
@@ -4353,6 +4621,7 @@ apply_bif_or_nif_epilogue:
ERTS_SMP_UNREQ_PROC_MAIN_LOCK(c_p);
flags = erts_call_trace(c_p, ep->code, ep->match_prog_set, reg,
0, &c_p->tracer_proc);
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
ERTS_SMP_REQ_PROC_MAIN_LOCK(c_p);
PROCESS_MAIN_CHK_LOCKS(c_p);
ASSERT(!ERTS_PROC_IS_EXITING(c_p));
@@ -4364,6 +4633,7 @@ apply_bif_or_nif_epilogue:
/* SWAPOUT, SWAPIN was done and r(0) was saved above */
PROCESS_MAIN_CHK_LOCKS(c_p);
FCALLS -= erts_garbage_collect(c_p, 3, reg, ep->code[2]);
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
PROCESS_MAIN_CHK_LOCKS(c_p);
r(0) = reg[0];
SWAPIN;
@@ -4453,6 +4723,7 @@ apply_bif_or_nif_epilogue:
reg[0] = r(0);
PROCESS_MAIN_CHK_LOCKS(c_p);
FCALLS -= erts_garbage_collect(c_p, 2, reg, I[-1]);
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
PROCESS_MAIN_CHK_LOCKS(c_p);
r(0) = reg[0];
}
@@ -4556,6 +4827,7 @@ apply_bif_or_nif_epilogue:
/* SWAPOUT was done and r(0) was saved above */
PROCESS_MAIN_CHK_LOCKS(c_p);
FCALLS -= erts_garbage_collect(c_p, need, reg, I[-1]);
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
PROCESS_MAIN_CHK_LOCKS(c_p);
r(0) = reg[0];
SWAPIN;
@@ -4723,7 +4995,7 @@ apply_bif_or_nif_epilogue:
NextPF(2, next);
}
- OpCase(fmove_new_ld): {
+ OpCase(fmove_ld): {
Eterm fr = Arg(0);
Eterm dest = make_float(HTOP);
@@ -4753,11 +5025,6 @@ apply_bif_or_nif_epilogue:
NextPF(2, next);
}
- /*
- * Old allocating fmove.
- */
-
-
#ifdef NO_FPE_SIGNALS
OpCase(fclearerror):
OpCase(i_fcheckerror):
@@ -4958,7 +5225,8 @@ apply_bif_or_nif_epilogue:
OpCase(i_hibernate): {
SWAPOUT;
- if (hibernate(c_p, r(0), x(1), x(2), reg)) {
+ if (erts_hibernate(c_p, r(0), x(1), x(2), reg)) {
+ c_p->flags &= ~F_HIBERNATE_SCHED;
goto do_schedule;
} else {
I = handle_error(c_p, I, reg, hibernate_3);
@@ -4969,12 +5237,11 @@ apply_bif_or_nif_epilogue:
OpCase(i_debug_breakpoint): {
SWAPOUT;
reg[0] = r(0);
- tmp_arg1 = call_breakpoint_handler(c_p, I-3, reg);
+ I = call_error_handler(c_p, I-3, reg, am_breakpoint);
r(0) = reg[0];
SWAPIN;
- if (tmp_arg1) {
- SET_I(c_p->i);
- Dispatch();
+ if (I) {
+ Goto(*I);
}
goto no_error_handler;
}
@@ -5633,9 +5900,6 @@ build_stacktrace(Process* c_p, Eterm exc) {
Eterm args;
int depth;
BeamInstr* current;
-#if HALFWORD_HEAP
- BeamInstr current_buff[3];
-#endif
Eterm Where = NIL;
Eterm *next_p = &Where;
@@ -5665,14 +5929,7 @@ build_stacktrace(Process* c_p, Eterm exc) {
* (e.g. spawn_link(erlang, abs, [1])).
*/
if (current == NULL) {
-#if HALFWORD_HEAP
- current = current_buff;
- current[0] = (BeamInstr) c_p->initial[0];
- current[1] = (BeamInstr) c_p->initial[1];
- current[2] = (BeamInstr) c_p->initial[2];
-#else
current = c_p->initial;
-#endif
args = am_true; /* Just in case */
} else {
args = get_args_from_exc(exc);
@@ -5724,8 +5981,8 @@ build_stacktrace(Process* c_p, Eterm exc) {
}
-static Eterm
-call_error_handler(Process* p, BeamInstr* fi, Eterm* reg)
+static BeamInstr*
+call_error_handler(Process* p, BeamInstr* fi, Eterm* reg, Eterm func)
{
Eterm* hp;
Export* ep;
@@ -5737,62 +5994,12 @@ call_error_handler(Process* p, BeamInstr* fi, Eterm* reg)
/*
* Search for the error_handler module.
*/
- ep = erts_find_function(erts_proc_get_error_handler(p),
- am_undefined_function, 3);
- if (ep == NULL) { /* No error handler */
- p->current = fi;
- p->freason = EXC_UNDEF;
- return 0;
- }
- p->i = ep->address;
-
- /*
- * Create a list with all arguments in the x registers.
- */
-
- arity = fi[2];
- sz = 2 * arity;
- if (HeapWordsLeft(p) < sz) {
- erts_garbage_collect(p, sz, reg, arity);
- }
- hp = HEAP_TOP(p);
- HEAP_TOP(p) += sz;
- args = NIL;
- for (i = arity-1; i >= 0; i--) {
- args = CONS(hp, reg[i], args);
- hp += 2;
- }
-
- /*
- * Set up registers for call to error_handler:undefined_function/3.
- */
- reg[0] = fi[0];
- reg[1] = fi[1];
- reg[2] = args;
- return 1;
-}
-
-static Eterm
-call_breakpoint_handler(Process* p, BeamInstr* fi, Eterm* reg)
-{
- Eterm* hp;
- Export* ep;
- int arity;
- Eterm args;
- Uint sz;
- int i;
-
- /*
- * Search for error handler module.
- */
- ep = erts_find_function(erts_proc_get_error_handler(p),
- am_breakpoint, 3);
+ ep = erts_find_function(erts_proc_get_error_handler(p), func, 3);
if (ep == NULL) { /* No error handler */
p->current = fi;
p->freason = EXC_UNDEF;
return 0;
}
- p->i = ep->address;
/*
* Create a list with all arguments in the x registers.
@@ -5812,15 +6019,14 @@ call_breakpoint_handler(Process* p, BeamInstr* fi, Eterm* reg)
}
/*
- * Set up registers for call to error_handler:breakpoint/3.
+ * Set up registers for call to error_handler:<func>/3.
*/
reg[0] = fi[0];
reg[1] = fi[1];
reg[2] = args;
- return 1;
+ return ep->address;
}
-
static Export*
apply_setup_error_handler(Process* p, Eterm module, Eterm function, Uint arity, Eterm* reg)
@@ -5997,8 +6203,8 @@ fixed_apply(Process* p, Eterm* reg, Uint arity)
return ep->address;
}
-static int
-hibernate(Process* c_p, Eterm module, Eterm function, Eterm args, Eterm* reg)
+int
+erts_hibernate(Process* c_p, Eterm module, Eterm function, Eterm args, Eterm* reg)
{
int arity;
Eterm tmp;
@@ -6069,18 +6275,21 @@ hibernate(Process* c_p, Eterm module, Eterm function, Eterm args, Eterm* reg)
c_p->fvalue = NIL;
PROCESS_MAIN_CHK_LOCKS(c_p);
erts_garbage_collect_hibernate(c_p);
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
PROCESS_MAIN_CHK_LOCKS(c_p);
erts_smp_proc_lock(c_p, ERTS_PROC_LOCK_MSGQ|ERTS_PROC_LOCK_STATUS);
ASSERT(!ERTS_PROC_IS_EXITING(c_p));
- c_p->status = P_WAITING;
#ifdef ERTS_SMP
ERTS_SMP_MSGQ_MV_INQ2PRIVQ(c_p);
if (c_p->msg.len > 0)
erts_add_to_runq(c_p);
+ else
#endif
+ c_p->status = P_WAITING;
}
erts_smp_proc_unlock(c_p, ERTS_PROC_LOCK_MSGQ|ERTS_PROC_LOCK_STATUS);
c_p->current = bif_export[BIF_hibernate_3]->code;
+ c_p->flags |= F_HIBERNATE_SCHED; /* Needed also when woken! */
return 1;
}
@@ -6195,6 +6404,7 @@ call_fun(Process* p, /* Current process. */
reg[0] = module;
reg[1] = fun;
reg[2] = args;
+ reg[3] = NIL;
return ep->address;
}
}
@@ -6314,6 +6524,7 @@ new_fun(Process* p, Eterm* reg, ErlFunEntry* fe, int num_free)
if (HEAP_LIMIT(p) - HEAP_TOP(p) <= needed) {
PROCESS_MAIN_CHK_LOCKS(p);
erts_garbage_collect(p, needed, reg, num_free);
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(p);
PROCESS_MAIN_CHK_LOCKS(p);
}
hp = p->htop;
diff --git a/erts/emulator/beam/beam_load.c b/erts/emulator/beam/beam_load.c
index df5602b040..57fe25453d 100644
--- a/erts/emulator/beam/beam_load.c
+++ b/erts/emulator/beam/beam_load.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -89,13 +89,12 @@ typedef struct {
} Label;
/*
- * Type for a operand for a generic instruction.
+ * Type for an operand for a generic instruction.
*/
typedef struct {
unsigned type; /* Type of operand. */
- BeamInstr val; /* Value of operand. */
- Uint bigarity; /* Arity for bignumbers (only). */
+ BeamInstr val; /* Value of operand. */
} GenOpArg;
/*
@@ -326,11 +325,6 @@ typedef struct {
Literal* literals; /* Array of literals. */
LiteralPatch* literal_patches; /* Operands that need to be patched. */
Uint total_literal_size; /* Total heap size for all literals. */
-
- /*
- * Floating point.
- */
- int new_float_instructions; /* New allocation scheme for floating point. */
} LoaderState;
typedef struct {
@@ -476,16 +470,16 @@ static int read_code_header(LoaderState* stp);
static int load_code(LoaderState* stp);
static GenOp* gen_element(LoaderState* stp, GenOpArg Fail, GenOpArg Index,
GenOpArg Tuple, GenOpArg Dst);
-static GenOp* gen_split_values(LoaderState* stp, GenOpArg S, GenOpArg Fail,
+static GenOp* gen_split_values(LoaderState* stp, GenOpArg S,
+ GenOpArg TypeFail, GenOpArg Fail,
GenOpArg Size, GenOpArg* Rest);
static GenOp* gen_select_val(LoaderState* stp, GenOpArg S, GenOpArg Fail,
GenOpArg Size, GenOpArg* Rest);
-static GenOp* gen_select_big(LoaderState* stp, GenOpArg S, GenOpArg Fail,
- GenOpArg Size, GenOpArg* Rest);
+static GenOp* gen_select_literals(LoaderState* stp, GenOpArg S,
+ GenOpArg Fail, GenOpArg Size,
+ GenOpArg* Rest);
static GenOp* const_select_val(LoaderState* stp, GenOpArg S, GenOpArg Fail,
GenOpArg Size, GenOpArg* Rest);
-static GenOp* gen_func_info(LoaderState* stp, GenOpArg mod, GenOpArg Func,
- GenOpArg arity, GenOpArg label);
static int freeze_code(LoaderState* stp);
@@ -818,7 +812,6 @@ init_state(LoaderState* stp)
stp->total_literal_size = 0;
stp->literal_patches = 0;
stp->string_patches = 0;
- stp->new_float_instructions = 0;
stp->may_load_nif = 0;
stp->on_load = 0;
}
@@ -1418,7 +1411,6 @@ static int
load_code(LoaderState* stp)
{
int i;
- int tmp;
int ci;
int last_func_start = 0;
char* sign;
@@ -1618,7 +1610,6 @@ load_code(LoaderState* stp)
BeamInstr val;
BeamInstr words = 0;
- stp->new_float_instructions = 1;
GetTagAndValue(stp, tag, n);
VerifyTag(stp, tag, TAG_u);
while (n-- > 0) {
@@ -1772,7 +1763,7 @@ load_code(LoaderState* stp)
}
stp->specific_op = specific;
- CodeNeed(opc[stp->specific_op].sz+2); /* Extra margin for packing */
+ CodeNeed(opc[stp->specific_op].sz+16); /* Extra margin for packing */
code[ci++] = BeamOpCode(stp->specific_op);
}
@@ -1936,9 +1927,9 @@ load_code(LoaderState* stp)
}
code[ci++] = (BeamInstr) stp->import[i].bf;
break;
- case 'P': /* Byte offset into tuple */
+ case 'P': /* Byte offset into tuple or stack */
+ case 'Q': /* Like 'P', but packable */
VerifyTag(stp, tag, TAG_u);
- tmp = tmp_op->a[arg].val;
code[ci++] = (BeamInstr) ((tmp_op->a[arg].val+1) * sizeof(Eterm));
break;
case 'l': /* Floating point register. */
@@ -1957,84 +1948,6 @@ load_code(LoaderState* stp)
}
/*
- * Load any list arguments using the primitive tags.
- */
-
- for ( ; arg < tmp_op->arity; arg++) {
- switch (tmp_op->a[arg].type) {
- case TAG_i:
- CodeNeed(1);
- code[ci++] = make_small(tmp_op->a[arg].val);
- break;
- case TAG_u:
- case TAG_a:
- case TAG_v:
- CodeNeed(1);
- code[ci++] = tmp_op->a[arg].val;
- break;
- case TAG_f:
- CodeNeed(1);
- code[ci] = stp->labels[tmp_op->a[arg].val].patches;
- stp->labels[tmp_op->a[arg].val].patches = ci;
- ci++;
- break;
- case TAG_q:
- {
- Eterm lit;
-
- lit = stp->literals[tmp_op->a[arg].val].term;
- if (is_big(lit)) {
- Eterm* bigp;
- Eterm *tmp;
- Uint size;
- Uint term_size;
-
- bigp = big_val(lit);
- term_size = bignum_header_arity(*bigp);
- size = TermWords(term_size + 1);
- CodeNeed(size);
- tmp = (Eterm *) (code + ci);
- *tmp++ = *bigp++;
- while (term_size-- > 0) {
- *tmp++ = *bigp++;
- }
- ci +=size;
- } else if (is_float(lit)) {
-#if defined(ARCH_64) && !HALFWORD_HEAP
- CodeNeed(1);
- code[ci++] = float_val(stp->literals[tmp_op->a[arg].val].term)[1];
-#elif HALFWORD_HEAP
- Eterm* fptr;
- Uint size;
- Eterm *tmp;
-
- fptr = float_val(stp->literals[tmp_op->a[arg].val].term)+1;
- size = TermWords(2);
- CodeNeed(size);
- tmp = (Eterm *) (code + ci);
- *tmp++ = *fptr++;
- *tmp = *fptr;
- ci += size;
-#else
- Eterm* fptr;
-
- fptr = float_val(stp->literals[tmp_op->a[arg].val].term)+1;
- CodeNeed(2);
- code[ci++] = *fptr++;
- code[ci++] = *fptr;
-#endif
- } else {
- LoadError0(stp, "literal is neither float nor big");
- }
- }
- break;
- default:
- LoadError1(stp, "unsupported primitive type '%c'",
- tag_to_letter[tmp_op->a[arg].type]);
- }
- }
-
- /*
* The packing engine.
*/
if (opc[stp->specific_op].pack[0]) {
@@ -2057,6 +1970,11 @@ load_code(LoaderState* stp)
case '6': /* Shift 16 steps */
packed = (packed << BEAM_LOOSE_SHIFT) | code[--ci];
break;
+#ifdef ARCH_64
+ case 'w': /* Shift 32 steps */
+ packed = (packed << BEAM_WIDE_SHIFT) | code[--ci];
+ break;
+#endif
case 'p': /* Put instruction (from stack). */
code[ci++] = *--sp;
break;
@@ -2072,6 +1990,58 @@ load_code(LoaderState* stp)
}
/*
+ * Load any list arguments using the primitive tags.
+ */
+
+ for ( ; arg < tmp_op->arity; arg++) {
+ switch (tmp_op->a[arg].type) {
+ case TAG_i:
+ CodeNeed(1);
+ code[ci++] = make_small(tmp_op->a[arg].val);
+ break;
+ case TAG_u:
+ case TAG_a:
+ case TAG_v:
+ CodeNeed(1);
+ code[ci++] = tmp_op->a[arg].val;
+ break;
+ case TAG_f:
+ CodeNeed(1);
+ code[ci] = stp->labels[tmp_op->a[arg].val].patches;
+ stp->labels[tmp_op->a[arg].val].patches = ci;
+ ci++;
+ break;
+ case TAG_r:
+ CodeNeed(1);
+ code[ci++] = (R_REG_DEF << _TAG_PRIMARY_SIZE) |
+ TAG_PRIMARY_HEADER;
+ break;
+ case TAG_x:
+ CodeNeed(1);
+ code[ci++] = (tmp_op->a[arg].val << _TAG_IMMED1_SIZE) |
+ (X_REG_DEF << _TAG_PRIMARY_SIZE) | TAG_PRIMARY_HEADER;
+ break;
+ case TAG_y:
+ CodeNeed(1);
+ code[ci++] = (tmp_op->a[arg].val << _TAG_IMMED1_SIZE) |
+ (Y_REG_DEF << _TAG_PRIMARY_SIZE) | TAG_PRIMARY_HEADER;
+ break;
+ case TAG_n:
+ CodeNeed(1);
+ code[ci++] = NIL;
+ break;
+ case TAG_q:
+ CodeNeed(1);
+ new_literal_patch(stp, ci);
+ code[ci++] = tmp_op->a[arg].val;
+ break;
+ default:
+ LoadError1(stp, "unsupported primitive type '%c'",
+ tag_to_letter[tmp_op->a[arg].type]);
+ }
+ }
+
+ /*
* Handle a few special cases.
*/
switch (stp->specific_op) {
@@ -2239,11 +2209,12 @@ use_jump_tab(LoaderState* stp, GenOpArg Size, GenOpArg* Rest)
}
/*
- * Predicate to test whether all values in a table are big numbers.
+ * Predicate to test whether all values in a table are either
+ * floats or bignums.
*/
static int
-all_values_are_big(LoaderState* stp, GenOpArg Size, GenOpArg* Rest)
+floats_or_bignums(LoaderState* stp, GenOpArg Size, GenOpArg* Rest)
{
int i;
@@ -2255,9 +2226,6 @@ all_values_are_big(LoaderState* stp, GenOpArg Size, GenOpArg* Rest)
if (Rest[i].type != TAG_q) {
return 0;
}
- if (is_not_big(stp->literals[Rest[i].val].term)) {
- return 0;
- }
if (Rest[i+1].type != TAG_f) {
return 0;
}
@@ -2317,6 +2285,14 @@ mixed_types(LoaderState* stp, GenOpArg Size, GenOpArg* Rest)
return 0;
}
+static int
+same_label(LoaderState* stp, GenOpArg Target, GenOpArg Label)
+{
+ return Target.type = TAG_f && Label.type == TAG_u &&
+ Target.val == Label.val;
+}
+
+
/*
* Generate an instruction for element/2.
*/
@@ -2328,23 +2304,23 @@ gen_element(LoaderState* stp, GenOpArg Fail, GenOpArg Index,
GenOp* op;
NEW_GENOP(stp, op);
- op->op = genop_i_element_4;
op->arity = 4;
- op->a[0] = Fail;
- op->a[1] = Index;
- op->a[2] = Tuple;
- op->a[3] = Dst;
op->next = NULL;
- /*
- * If safe, generate a faster instruction.
- */
-
if (Index.type == TAG_i && Index.val > 0 &&
(Tuple.type == TAG_r || Tuple.type == TAG_x || Tuple.type == TAG_y)) {
op->op = genop_i_fast_element_4;
- op->a[1].type = TAG_u;
- op->a[1].val = Index.val;
+ op->a[0] = Tuple;
+ op->a[1] = Fail;
+ op->a[2].type = TAG_u;
+ op->a[2].val = Index.val;
+ op->a[3] = Dst;
+ } else {
+ op->op = genop_i_element_4;
+ op->a[0] = Tuple;
+ op->a[1] = Fail;
+ op->a[2] = Index;
+ op->a[3] = Dst;
}
return op;
@@ -2595,8 +2571,6 @@ binary_too_big_bits(LoaderState* stp, GenOpArg Size)
return Size.type == TAG_u && (((Size.val+7)/8) >> (8*sizeof(Uint)-3) != 0);
}
-#define new_float_allocation(Stp) ((Stp)->new_float_instructions)
-
static GenOp*
gen_put_binary(LoaderState* stp, GenOpArg Fail,GenOpArg Size,
GenOpArg Unit, GenOpArg Flags, GenOpArg Src)
@@ -2809,6 +2783,52 @@ gen_skip_bits2(LoaderState* stp, GenOpArg Fail, GenOpArg Ms,
return op;
}
+static GenOp*
+gen_increment(LoaderState* stp, GenOpArg Reg, GenOpArg Integer,
+ GenOpArg Live, GenOpArg Dst)
+{
+ GenOp* op;
+
+ NEW_GENOP(stp, op);
+ op->op = genop_i_increment_4;
+ op->arity = 4;
+ op->next = NULL;
+ op->a[0] = Reg;
+ op->a[1].type = TAG_u;
+ op->a[1].val = Integer.val;
+ op->a[2] = Live;
+ op->a[3] = Dst;
+ return op;
+}
+
+static GenOp*
+gen_increment_from_minus(LoaderState* stp, GenOpArg Reg, GenOpArg Integer,
+ GenOpArg Live, GenOpArg Dst)
+{
+ GenOp* op;
+
+ NEW_GENOP(stp, op);
+ op->op = genop_i_increment_4;
+ op->arity = 4;
+ op->next = NULL;
+ op->a[0] = Reg;
+ op->a[1].type = TAG_u;
+ op->a[1].val = -Integer.val;
+ op->a[2] = Live;
+ op->a[3] = Dst;
+ return op;
+}
+
+/*
+ * Test whether the negation of the given number is small.
+ */
+static int
+negation_is_small(LoaderState* stp, GenOpArg Int)
+{
+ return Int.type == TAG_i && IS_SSMALL(-Int.val);
+}
+
+
static int
smp(LoaderState* stp)
{
@@ -3000,6 +3020,21 @@ gen_select_tuple_arity(LoaderState* stp, GenOpArg S, GenOpArg Fail,
ASSERT(op->a[i].val < op->a[i+2].val);
}
#endif
+
+ /*
+ * Use a special-cased instruction if there are only two values.
+ */
+ if (size == 2) {
+ op->op = genop_i_select_tuple_arity2_6;
+ op->arity--;
+ op->a[2].type = TAG_u;
+ op->a[2].val = arityval(op->a[3].val);
+ op->a[3] = op->a[4];
+ op->a[4].type = TAG_u;
+ op->a[4].val = arityval(op->a[5].val);
+ op->a[5] = op->a[6];
+ }
+
return op;
}
@@ -3009,18 +3044,24 @@ gen_select_tuple_arity(LoaderState* stp, GenOpArg S, GenOpArg Fail,
*/
static GenOp*
-gen_split_values(LoaderState* stp, GenOpArg S, GenOpArg Fail,
- GenOpArg Size, GenOpArg* Rest)
+gen_split_values(LoaderState* stp, GenOpArg S, GenOpArg TypeFail,
+ GenOpArg Fail, GenOpArg Size, GenOpArg* Rest)
{
GenOp* op1;
GenOp* op2;
GenOp* label;
- Uint type;
+ GenOp* is_integer;
int i;
ASSERT(Size.val >= 2 && Size.val % 2 == 0);
+ NEW_GENOP(stp, is_integer);
+ is_integer->op = genop_is_integer_2;
+ is_integer->arity = 2;
+ is_integer->a[0] = TypeFail;
+ is_integer->a[1] = S;
+
NEW_GENOP(stp, label);
label->op = genop_label_1;
label->arity = 1;
@@ -3046,15 +3087,13 @@ gen_split_values(LoaderState* stp, GenOpArg S, GenOpArg Fail,
op2->a[2].type = TAG_u;
op2->a[2].val = 0;
- op1->next = label;
- label->next = op2;
- op2->next = NULL;
-
- type = Rest[0].type;
+ /*
+ * Split the list.
+ */
ASSERT(Size.type == TAG_u);
for (i = 0; i < Size.val; i += 2) {
- GenOp* op = (Rest[i].type == type) ? op1 : op2;
+ GenOp* op = (Rest[i].type == TAG_q) ? op2 : op1;
int dst = 3 + op->a[2].val;
ASSERT(Rest[i+1].type == TAG_f);
@@ -3063,13 +3102,36 @@ gen_split_values(LoaderState* stp, GenOpArg S, GenOpArg Fail,
op->arity += 2;
op->a[2].val += 2;
}
+ ASSERT(op1->a[2].val > 0);
+ ASSERT(op2->a[2].val > 0);
/*
- * None of the instructions should have zero elements in the list.
+ * Order the instruction sequence appropriately.
*/
- ASSERT(op1->a[2].val > 0);
- ASSERT(op2->a[2].val > 0);
+ if (TypeFail.val == Fail.val) {
+ /*
+ * select_val L1 S ... (small numbers)
+ * label L1
+ * is_integer Fail S
+ * select_val Fail S ... (bignums)
+ */
+ op1->next = label;
+ label->next = is_integer;
+ is_integer->next = op2;
+ } else {
+ /*
+ * is_integer TypeFail S
+ * select_val L1 S ... (small numbers)
+ * label L1
+ * select_val Fail S ... (bignums)
+ */
+ is_integer->next = op1;
+ op1->next = label;
+ label->next = op2;
+ op1 = is_integer;
+ }
+ op2->next = NULL;
return op1;
}
@@ -3091,6 +3153,29 @@ gen_jump_tab(LoaderState* stp, GenOpArg S, GenOpArg Fail, GenOpArg Size, GenOpAr
ASSERT(Size.val >= 2 && Size.val % 2 == 0);
/*
+ * If there is only one choice, don't generate a jump table.
+ */
+ if (Size.val == 2) {
+ GenOp* jump;
+
+ NEW_GENOP(stp, op);
+ op->arity = 3;
+ op->op = genop_is_ne_exact_3;
+ op->a[0] = Rest[1];
+ op->a[1] = S;
+ op->a[2] = Rest[0];
+
+ NEW_GENOP(stp, jump);
+ jump->next = NULL;
+ jump->arity = 1;
+ jump->op = genop_jump_1;
+ jump->a[0] = Fail;
+
+ op->next = jump;
+ return op;
+ }
+
+ /*
* Calculate the minimum and maximum values and size of jump table.
*/
@@ -3162,8 +3247,9 @@ genopargcompare(GenOpArg* a, GenOpArg* b)
}
/*
- * Generate a select_val instruction. We know that a jump table is not suitable,
- * and that all values are of the same type (integer, atoms, floats; never bignums).
+ * Generate a select_val instruction. We know that a jump table
+ * is not suitable, and that all values are of the same type
+ * (integer or atoms).
*/
static GenOp*
@@ -3177,12 +3263,7 @@ gen_select_val(LoaderState* stp, GenOpArg S, GenOpArg Fail,
NEW_GENOP(stp, op);
op->next = NULL;
- if (Rest[0].type != TAG_q) {
- op->op = genop_i_select_val_3;
- } else {
- ASSERT(is_float(stp->literals[Rest[0].val].term));
- op->op = genop_i_select_float_3;
- }
+ op->op = genop_i_select_val_3;
GENOP_ARITY(op, arity);
op->a[0] = S;
op->a[1] = Fail;
@@ -3204,19 +3285,19 @@ gen_select_val(LoaderState* stp, GenOpArg S, GenOpArg Fail,
}
#endif
- return op;
-}
-
-/*
- * Compare function for qsort().
- */
+ /*
+ * Use a special-cased instruction if there are only two values.
+ */
+ if (size == 2) {
+ op->op = genop_i_select_val2_6;
+ op->arity--;
+ op->a[2] = op->a[3];
+ op->a[3] = op->a[4];
+ op->a[4] = op->a[5];
+ op->a[5] = op->a[6];
+ }
-static int
-genbigcompare(GenOpArg* a, GenOpArg* b)
-{
- int val = (int)(b->bigarity - a->bigarity);
-
- return val != 0 ? val : ((int) (a->val - b->val));
+ return op;
}
/*
@@ -3224,37 +3305,35 @@ genbigcompare(GenOpArg* a, GenOpArg* b)
*/
static GenOp*
-gen_select_big(LoaderState* stp, GenOpArg S, GenOpArg Fail,
+gen_select_literals(LoaderState* stp, GenOpArg S, GenOpArg Fail,
GenOpArg Size, GenOpArg* Rest)
{
GenOp* op;
- int arity = Size.val + 2 + 1;
- int size = Size.val / 2;
+ GenOp* jump;
+ GenOp** prev_next = &op;
+
int i;
- NEW_GENOP(stp, op);
- op->next = NULL;
- op->op = genop_i_select_big_2;
- GENOP_ARITY(op, arity);
- op->a[0] = S;
- op->a[1] = Fail;
for (i = 0; i < Size.val; i += 2) {
+ GenOp* op;
ASSERT(Rest[i].type == TAG_q);
- op->a[i+2] = Rest[i];
- op->a[i+2].bigarity = *big_val(stp->literals[op->a[i+2].val].term);
- op->a[i+3] = Rest[i+1];
- }
- ASSERT(i+2 == arity-1);
- op->a[arity-1].type = TAG_u;
- op->a[arity-1].val = 0;
-
- /*
- * Sort the values in descending arity order.
- */
-
- qsort(op->a+2, size, 2*sizeof(GenOpArg),
- (int (*)(const void *, const void *)) genbigcompare);
+ NEW_GENOP(stp, op);
+ op->op = genop_is_ne_exact_3;
+ op->arity = 3;
+ op->a[0] = Rest[i+1];
+ op->a[1] = S;
+ op->a[2] = Rest[i];
+ *prev_next = op;
+ prev_next = &op->next;
+ }
+
+ NEW_GENOP(stp, jump);
+ jump->next = NULL;
+ jump->op = genop_jump_1;
+ jump->arity = 1;
+ jump->a[0] = Fail;
+ *prev_next = jump;
return op;
}
@@ -3272,7 +3351,6 @@ const_select_val(LoaderState* stp, GenOpArg S, GenOpArg Fail,
int i;
ASSERT(Size.type == TAG_u);
- ASSERT(S.type == TAG_q);
NEW_GENOP(stp, op);
op->next = NULL;
@@ -3283,18 +3361,32 @@ const_select_val(LoaderState* stp, GenOpArg S, GenOpArg Fail,
* Search for a literal matching the controlling expression.
*/
- if (S.type == TAG_q) {
- Eterm expr = stp->literals[S.val].term;
- for (i = 0; i < Size.val; i += 2) {
- if (Rest[i].type == TAG_q) {
- Eterm term = stp->literals[Rest[i].val].term;
- if (eq(term, expr)) {
- ASSERT(Rest[i+1].type == TAG_f);
- op->a[0] = Rest[i+1];
- return op;
+ switch (S.type) {
+ case TAG_q:
+ {
+ Eterm expr = stp->literals[S.val].term;
+ for (i = 0; i < Size.val; i += 2) {
+ if (Rest[i].type == TAG_q) {
+ Eterm term = stp->literals[Rest[i].val].term;
+ if (eq(term, expr)) {
+ ASSERT(Rest[i+1].type == TAG_f);
+ op->a[0] = Rest[i+1];
+ return op;
+ }
}
}
}
+ break;
+ case TAG_i:
+ case TAG_a:
+ for (i = 0; i < Size.val; i += 2) {
+ if (Rest[i].val == S.val && Rest[i].type == S.type) {
+ ASSERT(Rest[i+1].type == TAG_f);
+ op->a[0] = Rest[i+1];
+ return op;
+ }
+ }
+ break;
}
/*
@@ -3305,36 +3397,6 @@ const_select_val(LoaderState* stp, GenOpArg S, GenOpArg Fail,
return op;
}
-
-static GenOp*
-gen_func_info(LoaderState* stp, GenOpArg mod, GenOpArg func,
- GenOpArg arity, GenOpArg label)
-{
- GenOp* fi;
- GenOp* op;
-
- NEW_GENOP(stp, fi);
- fi->op = genop_i_func_info_4;
- fi->arity = 4;
- fi->a[0].type = TAG_u; /* untagged Zero */
- fi->a[0].val = 0;
- fi->a[1] = mod;
- fi->a[2] = func;
- fi->a[3] = arity;
-
- NEW_GENOP(stp, op);
- op->op = genop_label_1;
- op->arity = 1;
- op->a[0] = label;
-
- fi->next = op;
- op->next = NULL;
-
- return fi;
-}
-
-
-
static GenOp*
gen_make_fun2(LoaderState* stp, GenOpArg idx)
{
@@ -3477,6 +3539,56 @@ gen_guard_bif3(LoaderState* stp, GenOpArg Fail, GenOpArg Live, GenOpArg Bif,
return op;
}
+static GenOp*
+tuple_append_put5(LoaderState* stp, GenOpArg Arity, GenOpArg Dst,
+ GenOpArg* Puts, GenOpArg S1, GenOpArg S2, GenOpArg S3,
+ GenOpArg S4, GenOpArg S5)
+{
+ GenOp* op;
+ int arity = Arity.val; /* Arity of tuple, not the instruction */
+ int i;
+
+ NEW_GENOP(stp, op);
+ op->next = NULL;
+ GENOP_ARITY(op, arity+2+5);
+ op->op = genop_i_put_tuple_2;
+ op->a[0] = Dst;
+ op->a[1].type = TAG_u;
+ op->a[1].val = arity + 5;
+ for (i = 0; i < arity; i++) {
+ op->a[i+2] = Puts[i];
+ }
+ op->a[arity+2] = S1;
+ op->a[arity+3] = S2;
+ op->a[arity+4] = S3;
+ op->a[arity+5] = S4;
+ op->a[arity+6] = S5;
+ return op;
+}
+
+static GenOp*
+tuple_append_put(LoaderState* stp, GenOpArg Arity, GenOpArg Dst,
+ GenOpArg* Puts, GenOpArg S)
+{
+ GenOp* op;
+ int arity = Arity.val; /* Arity of tuple, not the instruction */
+ int i;
+
+ NEW_GENOP(stp, op);
+ op->next = NULL;
+ GENOP_ARITY(op, arity+2+1);
+ op->op = genop_i_put_tuple_2;
+ op->a[0] = Dst;
+ op->a[1].type = TAG_u;
+ op->a[1].val = arity + 1;
+ for (i = 0; i < arity; i++) {
+ op->a[i+2] = Puts[i];
+ }
+ op->a[arity+2] = S;
+ return op;
+}
+
+
/*
* Freeze the code in memory, move the string table into place,
@@ -3624,25 +3736,32 @@ freeze_code(LoaderState* stp)
CHKBLK(ERTS_ALC_T_CODE,code);
if (compile_size) {
byte* compile_info = str_table + strtab_size + attr_size;
- CHKBLK(ERTS_ALC_T_CODE,code);
+ CHKBLK(ERTS_ALC_T_CODE,code);
sys_memcpy(compile_info, stp->chunks[COMPILE_CHUNK].start,
stp->chunks[COMPILE_CHUNK].size);
- CHKBLK(ERTS_ALC_T_CODE,code);
+
+ CHKBLK(ERTS_ALC_T_CODE,code);
code[MI_COMPILE_PTR] = (BeamInstr) compile_info;
- CHKBLK(ERTS_ALC_T_CODE,code);
+ CHKBLK(ERTS_ALC_T_CODE,code);
code[MI_COMPILE_SIZE] = (BeamInstr) stp->chunks[COMPILE_CHUNK].size;
- CHKBLK(ERTS_ALC_T_CODE,code);
+ CHKBLK(ERTS_ALC_T_CODE,code);
decoded_size = erts_decode_ext_size(compile_info, compile_size, 0);
- CHKBLK(ERTS_ALC_T_CODE,code);
+ CHKBLK(ERTS_ALC_T_CODE,code);
if (decoded_size < 0) {
LoadError0(stp, "bad external term representation of compilation information");
}
- CHKBLK(ERTS_ALC_T_CODE,code);
+ CHKBLK(ERTS_ALC_T_CODE,code);
code[MI_COMPILE_SIZE_ON_HEAP] = decoded_size;
}
CHKBLK(ERTS_ALC_T_CODE,code);
/*
+ * Make sure that we have not overflowed the allocated code space.
+ */
+ ASSERT(str_table + strtab_size + attr_size + compile_size ==
+ ((byte *) code) + size);
+
+ /*
* Go through all i_new_bs_put_strings instructions, restore the pointer to
* the instruction and convert string offsets to pointers (to the
* FIRST character).
@@ -3876,11 +3995,23 @@ transform_engine(LoaderState* st)
if (i == 0)
goto restart;
break;
+#if defined(TOP_is_eq)
case TOP_is_eq:
ASSERT(ap < instr->arity);
if (*pc++ != instr->a[ap].val)
goto restart;
break;
+#endif
+ case TOP_is_type_eq:
+ mask = *pc++;
+
+ ASSERT(ap < instr->arity);
+ ASSERT(instr->a[ap].type < BEAM_NUM_TAGS);
+ if (((1 << instr->a[ap].type) & mask) == 0)
+ goto restart;
+ if (*pc++ != instr->a[ap].val)
+ goto restart;
+ break;
case TOP_is_same_var:
ASSERT(ap < instr->arity);
i = *pc++;
@@ -4001,14 +4132,17 @@ transform_engine(LoaderState* st)
case TOP_rest_args:
{
int n = *pc++;
+ int formal_arity = gen_opc[instr->op].arity;
+ int num_vars = n + (instr->arity - formal_arity);
+ int j = formal_arity;
+
var = erts_alloc(ERTS_ALC_T_LOADER_TMP,
- instr->arity * sizeof(GenOpArg));
+ num_vars * sizeof(GenOpArg));
for (i = 0; i < n; i++) {
var[i] = def_vars[i];
}
- while (i < instr->arity) {
- var[i] = instr->a[i];
- i++;
+ while (i < num_vars) {
+ var[i++] = instr->a[j++];
}
}
break;
@@ -5315,6 +5449,9 @@ erts_make_stub_module(Process* p, Eterm Mod, Eterm Beam, Eterm Info)
if (state.lambdas != state.def_lambdas) {
erts_free(ERTS_ALC_T_LOADER_TMP, (void *) state.lambdas);
}
+ erts_free(ERTS_ALC_T_LOADER_TMP, (void *) state.labels);
+ erts_free(ERTS_ALC_T_LOADER_TMP, (void *) state.atom);
+ erts_free(ERTS_ALC_T_LOADER_TMP, (void *) state.export);
if (bin != NULL) {
driver_free_binary(bin);
}
@@ -5326,9 +5463,18 @@ erts_make_stub_module(Process* p, Eterm Mod, Eterm Beam, Eterm Info)
if (code != NULL) {
erts_free(ERTS_ALC_T_CODE, code);
}
+ if (state.labels != NULL) {
+ erts_free(ERTS_ALC_T_LOADER_TMP, (void *) state.labels);
+ }
if (state.lambdas != state.def_lambdas) {
erts_free(ERTS_ALC_T_LOADER_TMP, (void *) state.lambdas);
}
+ if (state.atom != NULL) {
+ erts_free(ERTS_ALC_T_LOADER_TMP, (void *) state.atom);
+ }
+ if (state.export != NULL) {
+ erts_free(ERTS_ALC_T_LOADER_TMP, (void *) state.export);
+ }
if (bin != NULL) {
driver_free_binary(bin);
}
diff --git a/erts/emulator/beam/bif.c b/erts/emulator/beam/bif.c
index 6e9755ad48..8c35644125 100644
--- a/erts/emulator/beam/bif.c
+++ b/erts/emulator/beam/bif.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -368,7 +368,6 @@ static int demonitor(Process *c_p, Eterm ref)
ErtsMonitor *mon = NULL; /* The monitor entry to delete */
Process *rp; /* Local target process */
Eterm to = NIL; /* Monitor link traget */
- Eterm ref_p; /* Pid of this end */
DistEntry *dep = NULL; /* Target's distribution entry */
int deref_de = 0;
int res;
@@ -381,7 +380,6 @@ static int demonitor(Process *c_p, Eterm ref)
res = ERTS_DEMONITOR_BADARG;
goto done; /* Cannot be this monitor's ref */
}
- ref_p = c_p->id;
mon = erts_lookup_monitor(c_p->monitors, ref);
if (!mon) {
@@ -813,7 +811,7 @@ BIF_RETTYPE spawn_opt_1(BIF_ALIST_1)
so.min_heap_size = H_MIN_SIZE;
so.min_vheap_size = BIN_VH_MIN_SIZE;
so.priority = PRIORITY_NORMAL;
- so.max_gen_gcs = (Uint16) erts_smp_atomic_read(&erts_max_gen_gcs);
+ so.max_gen_gcs = (Uint16) erts_smp_atomic32_read(&erts_max_gen_gcs);
so.scheduler = 0;
/*
@@ -1091,10 +1089,20 @@ BIF_RETTYPE unlink_1(BIF_ALIST_1)
BIF_RETTYPE hibernate_3(BIF_ALIST_3)
{
/*
- * hibernate/3 is implemented as an instruction; therefore
- * this function will never be called.
+ * hibernate/3 is usually translated to an instruction; therefore
+ * this function is only called from HiPE or when the call could not
+ * be translated.
*/
- BIF_ERROR(BIF_P, BADARG);
+ Eterm reg[3];
+
+ if (erts_hibernate(BIF_P, BIF_ARG_1, BIF_ARG_2, BIF_ARG_3, reg)) {
+ /*
+ * If hibernate succeeded, TRAP. The process will be suspended
+ * if status is P_WAITING or continue (if any message was in the queue).
+ */
+ BIF_TRAP_CODE_PTR_(BIF_P, BIF_P->i);
+ }
+ return THE_NON_VALUE;
}
/**********************************************************************/
@@ -1351,9 +1359,10 @@ BIF_RETTYPE exit_2(BIF_ALIST_2)
#ifdef ERTS_SMP
if (rp == BIF_P)
rp_locks &= ~ERTS_PROC_LOCK_MAIN;
- else
+ if (rp_locks)
+ erts_smp_proc_unlock(rp, rp_locks);
+ if (rp != BIF_P)
erts_smp_proc_dec_refc(rp);
- erts_smp_proc_unlock(rp, rp_locks);
#endif
/*
* We may have exited ourselves and may have to take action.
@@ -3206,20 +3215,32 @@ BIF_RETTYPE garbage_collect_1(BIF_ALIST_1)
BIF_ERROR(BIF_P, BADARG);
}
- rp = erts_pid2proc_not_running(BIF_P, ERTS_PROC_LOCK_MAIN,
+ if (BIF_P->id == BIF_ARG_1)
+ rp = BIF_P;
+ else {
+#ifdef ERTS_SMP
+ rp = erts_pid2proc_suspend(BIF_P, ERTS_PROC_LOCK_MAIN,
BIF_ARG_1, ERTS_PROC_LOCK_MAIN);
- if (!rp)
- BIF_RET(am_false);
- if (rp == ERTS_PROC_LOCK_BUSY)
- ERTS_BIF_YIELD1(bif_export[BIF_garbage_collect_1], BIF_P, BIF_ARG_1);
+ if (rp == ERTS_PROC_LOCK_BUSY)
+ ERTS_BIF_YIELD1(bif_export[BIF_garbage_collect_1], BIF_P, BIF_ARG_1);
+#else
+ rp = erts_pid2proc(BIF_P, 0, BIF_ARG_1, 0);
+#endif
+ if (!rp)
+ BIF_RET(am_false);
+ }
/* The GC cost is taken for the process executing this BIF. */
FLAGS(rp) |= F_NEED_FULLSWEEP;
reds = erts_garbage_collect(rp, 0, rp->arg_reg, rp->arity);
- if (BIF_P != rp)
+#ifdef ERTS_SMP
+ if (BIF_P != rp) {
+ erts_resume(rp, ERTS_PROC_LOCK_MAIN);
erts_smp_proc_unlock(rp, ERTS_PROC_LOCK_MAIN);
+ }
+#endif
BIF_RET2(am_true, reds);
}
@@ -3269,12 +3290,13 @@ BIF_RETTYPE ports_0(BIF_ALIST_0)
erts_smp_mtx_lock(&ports_snapshot_mtx); /* One snapshot at a time */
- erts_smp_atomic_set(&erts_dead_ports_ptr, (long) (port_buf + erts_max_ports));
+ erts_smp_atomic_set(&erts_dead_ports_ptr,
+ (erts_aint_t) (port_buf + erts_max_ports));
next_ss = erts_smp_atomic_inctest(&erts_ports_snapshot);
if (erts_smp_atomic_read(&erts_ports_alive) > 0) {
- long i;
+ erts_aint_t i;
for (i = erts_max_ports-1; i >= 0; i--) {
Port* prt = &erts_port[i];
erts_smp_port_state_lock(prt);
@@ -3289,7 +3311,7 @@ BIF_RETTYPE ports_0(BIF_ALIST_0)
}
dead_ports = (Eterm*)erts_smp_atomic_xchg(&erts_dead_ports_ptr,
- (long)NULL);
+ (erts_aint_t) NULL);
erts_smp_mtx_unlock(&ports_snapshot_mtx);
ASSERT(pp <= dead_ports);
@@ -3300,7 +3322,7 @@ BIF_RETTYPE ports_0(BIF_ALIST_0)
ASSERT((alive+dead) <= erts_max_ports);
if (alive+dead > 0) {
- long i;
+ erts_aint_t i;
Eterm *hp = HAlloc(BIF_P, (alive+dead)*2);
for (i = 0; i < alive; i++) {
@@ -3350,7 +3372,7 @@ BIF_RETTYPE erts_debug_display_1(BIF_ALIST_1)
erts_dsprintf_buf_t *dsbufp = erts_create_tmp_dsbuf(64);
pres = erts_dsprintf(dsbufp, "%.*T\n", INT_MAX, BIF_ARG_1);
if (pres < 0)
- erl_exit(1, "Failed to convert term to string: %d (s)\n",
+ erl_exit(1, "Failed to convert term to string: %d (%s)\n",
-pres, erl_errno_id(-pres));
hp = HAlloc(BIF_P, 2*dsbufp->str_len); /* we need length * 2 heap words */
res = buf_to_intlist(&hp, dsbufp->str, dsbufp->str_len, NIL);
@@ -3468,7 +3490,7 @@ term2list_dsprintf(Process *p, Eterm term)
erts_dsprintf_buf_t *dsbufp = erts_create_tmp_dsbuf(64);
pres = erts_dsprintf(dsbufp, "%T", term);
if (pres < 0)
- erl_exit(1, "Failed to convert term to list: %d (s)\n",
+ erl_exit(1, "Failed to convert term to list: %d (%s)\n",
-pres, erl_errno_id(-pres));
hp = HAlloc(p, 2*dsbufp->str_len); /* we need length * 2 heap words */
res = buf_to_intlist(&hp, dsbufp->str, dsbufp->str_len, NIL);
@@ -3796,7 +3818,8 @@ BIF_RETTYPE system_flag_2(BIF_ALIST_2)
goto error;
}
nval = (n > (Sint) ((Uint16) -1)) ? ((Uint16) -1) : ((Uint16) n);
- oval = (Uint) erts_smp_atomic_xchg(&erts_max_gen_gcs, (long) nval);
+ oval = (Uint) erts_smp_atomic32_xchg(&erts_max_gen_gcs,
+ (erts_aint32_t) nval);
BIF_RET(make_small(oval));
} else if (BIF_ARG_1 == am_min_heap_size) {
int oval = H_MIN_SIZE;
@@ -4139,7 +4162,7 @@ void erts_init_bif(void)
erts_smp_spinlock_init(&make_ref_lock, "make_ref");
erts_smp_mtx_init(&ports_snapshot_mtx, "ports_snapshot");
- erts_smp_atomic_init(&erts_dead_ports_ptr, (long)NULL);
+ erts_smp_atomic_init(&erts_dead_ports_ptr, (erts_aint_t) NULL);
/*
* bif_return_trap/1 is a hidden BIF that bifs that need to
diff --git a/erts/emulator/beam/bif.h b/erts/emulator/beam/bif.h
index a84ee7bb23..8faa09feb8 100644
--- a/erts/emulator/beam/bif.h
+++ b/erts/emulator/beam/bif.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -201,6 +201,12 @@ do { \
return THE_NON_VALUE; \
} while(0)
+#define BIF_TRAP_CODE_PTR_(p, Code_) do { \
+ *((UWord *) (UWord) ((p)->def_arg_reg + 3)) = (UWord) (Code_); \
+ (p)->freason = TRAP; \
+ return THE_NON_VALUE; \
+ } while(0)
+
extern Export bif_return_trap_export;
#ifdef DEBUG
#define ERTS_BIF_PREP_YIELD_RETURN_X(RET, P, VAL, DEBUG_VAL) \
diff --git a/erts/emulator/beam/bif.tab b/erts/emulator/beam/bif.tab
index 60b4b1946b..d9dd80fa8b 100644
--- a/erts/emulator/beam/bif.tab
+++ b/erts/emulator/beam/bif.tab
@@ -660,6 +660,7 @@ bif erts_debug:display/1
bif 'erl.system.debug':display/1 ebif_erts_debug_display_1
bif erts_debug:dist_ext_to_term/2
bif 'erl.system.debug':dist_ext_to_term/2 ebif_erts_debug_dist_ext_to_term_2
+bif erts_debug:instructions/0
#
# Monitor testing bif's...
diff --git a/erts/emulator/beam/big.c b/erts/emulator/beam/big.c
index ff15d834ab..f47f5a9c0c 100644
--- a/erts/emulator/beam/big.c
+++ b/erts/emulator/beam/big.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -1558,7 +1558,7 @@ Eterm erts_sint64_to_big(Sint64 x, Eterm **hpp)
** Convert a bignum to a double float
*/
int
-big_to_double(Eterm x, double* resp)
+big_to_double(Wterm x, double* resp)
{
double d = 0.0;
Eterm* xp = big_val(x);
@@ -1725,7 +1725,7 @@ static Eterm big_norm(Eterm *x, dsize_t xl, short sign)
/*
** Compare bignums
*/
-int big_comp(Eterm x, Eterm y)
+int big_comp(Wterm x, Wterm y)
{
Eterm* xp = big_val(x);
Eterm* yp = big_val(y);
@@ -2060,7 +2060,7 @@ static Eterm B_plus_minus(ErtsDigit *x, dsize_t xl, short xsgn,
/*
** Add bignums
*/
-Eterm big_plus(Eterm x, Eterm y, Eterm *r)
+Eterm big_plus(Wterm x, Wterm y, Eterm *r)
{
Eterm* xp = big_val(x);
Eterm* yp = big_val(y);
diff --git a/erts/emulator/beam/big.h b/erts/emulator/beam/big.h
index 25466cd3c2..f28a390aea 100644
--- a/erts/emulator/beam/big.h
+++ b/erts/emulator/beam/big.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -120,7 +120,7 @@ char *erts_big_to_string(Eterm x, char *buf, Uint buf_sz);
Eterm small_times(Sint, Sint, Eterm*);
-Eterm big_plus(Eterm, Eterm, Eterm*);
+Eterm big_plus(Wterm, Wterm, Eterm*);
Eterm big_minus(Eterm, Eterm, Eterm*);
Eterm big_times(Eterm, Eterm, Eterm*);
Eterm big_div(Eterm, Eterm, Eterm*);
@@ -137,9 +137,9 @@ Eterm big_bxor(Eterm, Eterm, Eterm*);
Eterm big_bnot(Eterm, Eterm*);
Eterm big_lshift(Eterm, Sint, Eterm*);
-int big_comp (Eterm, Eterm);
+int big_comp (Wterm, Wterm);
int big_ucomp (Eterm, Eterm);
-int big_to_double(Eterm x, double* resp);
+int big_to_double(Wterm x, double* resp);
Eterm small_to_big(Sint, Eterm*);
Eterm uint_to_big(Uint, Eterm*);
Eterm uword_to_big(UWord, Eterm*);
diff --git a/erts/emulator/beam/binary.c b/erts/emulator/beam/binary.c
index 4be869f269..9486602633 100644
--- a/erts/emulator/beam/binary.c
+++ b/erts/emulator/beam/binary.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -56,7 +56,7 @@ erts_init_binary(void)
*/
Eterm
-new_binary(Process *p, byte *buf, int len)
+new_binary(Process *p, byte *buf, Uint len)
{
ProcBin* pb;
Binary* bptr;
diff --git a/erts/emulator/beam/break.c b/erts/emulator/beam/break.c
index f339e19761..b8889e6206 100644
--- a/erts/emulator/beam/break.c
+++ b/erts/emulator/beam/break.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -98,7 +98,7 @@ process_killer(void)
switch(j) {
case 'k':
if (rp->status == P_WAITING) {
- Uint32 rp_locks = ERTS_PROC_LOCKS_XSIG_SEND;
+ ErtsProcLocks rp_locks = ERTS_PROC_LOCKS_XSIG_SEND;
erts_smp_proc_inc_refc(rp);
erts_smp_proc_lock(rp, rp_locks);
(void) erts_send_exit_signal(NULL,
@@ -266,7 +266,7 @@ print_process_info(int to, void *to_arg, Process *p)
}
erts_print(to, to_arg, "Number of heap fragments: %d\n", frags);
}
- erts_print(to, to_arg, "Heap fragment data: %bpu\n", MBUF_SIZE(p));
+ erts_print(to, to_arg, "Heap fragment data: %beu\n", MBUF_SIZE(p));
scb = ERTS_PROC_GET_SAVED_CALLS_BUF(p);
if (scb) {
@@ -313,12 +313,11 @@ print_process_info(int to, void *to_arg, Process *p)
}
/* print the number of reductions etc */
- erts_print(to, to_arg, "Reductions: %bpu\n", p->reds);
+ erts_print(to, to_arg, "Reductions: %beu\n", p->reds);
- erts_print(to, to_arg, "Stack+heap: %bpu\n", p->heap_sz);
+ erts_print(to, to_arg, "Stack+heap: %beu\n", p->heap_sz);
erts_print(to, to_arg, "OldHeap: %bpu\n",
- (OLD_HEAP(p) == NULL) ? 0 :
- (unsigned)(OLD_HEND(p) - OLD_HEAP(p)) );
+ (OLD_HEAP(p) == NULL) ? 0 : (OLD_HEND(p) - OLD_HEAP(p)) );
erts_print(to, to_arg, "Heap unused: %bpu\n", (p->hend - p->htop));
erts_print(to, to_arg, "OldHeap unused: %bpu\n",
(OLD_HEAP(p) == NULL) ? 0 : (OLD_HEND(p) - OLD_HTOP(p)) );
@@ -558,7 +557,7 @@ do_break(void)
#endif
#ifdef DEBUG
case 't':
- p_slpq();
+ erts_p_slpq();
return;
case 'b':
bin_check();
@@ -624,9 +623,9 @@ bin_check(void)
erts_printf("Process %T holding binary data \n", rp->id);
printed = 1;
}
- erts_printf("0x%08lx orig_size: %ld, norefs = %ld\n",
- (unsigned long)bp->val,
- (long)bp->val->orig_size,
+ erts_printf("%p orig_size: %bpd, norefs = %bpd\n",
+ bp->val,
+ bp->val->orig_size,
erts_smp_atomic_read(&bp->val->refc));
}
}
diff --git a/erts/emulator/beam/copy.c b/erts/emulator/beam/copy.c
index 8bee47232e..90201f3a90 100644
--- a/erts/emulator/beam/copy.c
+++ b/erts/emulator/beam/copy.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -72,8 +72,11 @@ copy_object(Eterm obj, Process* to)
* Return the "flat" size of the object.
*/
-Uint
-size_object(Eterm obj)
+#if HALFWORD_HEAP
+Uint size_object_rel(Eterm obj, Eterm* base)
+#else
+Uint size_object(Eterm obj)
+#endif
{
Uint sum = 0;
Eterm* ptr;
@@ -84,7 +87,7 @@ size_object(Eterm obj)
switch (primary_tag(obj)) {
case TAG_PRIMARY_LIST:
sum += 2;
- ptr = list_val(obj);
+ ptr = list_val_rel(obj,base);
obj = *ptr++;
if (!IS_CONST(obj)) {
ESTACK_PUSH(s, obj);
@@ -93,11 +96,11 @@ size_object(Eterm obj)
break;
case TAG_PRIMARY_BOXED:
{
- Eterm hdr = *boxed_val(obj);
+ Eterm hdr = *boxed_val_rel(obj,base);
ASSERT(is_header(hdr));
switch (hdr & _TAG_HEADER_MASK) {
case ARITYVAL_SUBTAG:
- ptr = tuple_val(obj);
+ ptr = tuple_val_rel(obj,base);
arity = header_arity(hdr);
sum += arity + 1;
if (arity == 0) { /* Empty tuple -- unusual. */
@@ -113,7 +116,7 @@ size_object(Eterm obj)
break;
case FUN_SUBTAG:
{
- Eterm* bptr = fun_val(obj);
+ Eterm* bptr = fun_val_rel(obj,base);
ErlFunThing* funp = (ErlFunThing *) bptr;
unsigned eterms = 1 /* creator */ + funp->num_free;
unsigned sz = thing_arityval(hdr);
@@ -136,7 +139,7 @@ size_object(Eterm obj)
Uint bitoffs;
Uint extra_bytes;
Eterm hdr;
- ERTS_GET_REAL_BIN(obj, real_bin, offset, bitoffs, bitsize);
+ ERTS_GET_REAL_BIN_REL(obj, real_bin, offset, bitoffs, bitsize, base);
if ((bitsize + bitoffs) > 8) {
sum += ERL_SUB_BIN_SIZE;
extra_bytes = 2;
@@ -146,11 +149,11 @@ size_object(Eterm obj)
} else {
extra_bytes = 0;
}
- hdr = *binary_val(real_bin);
+ hdr = *binary_val_rel(real_bin,base);
if (thing_subtag(hdr) == REFC_BINARY_SUBTAG) {
sum += PROC_BIN_SIZE;
} else {
- sum += heap_bin_size(binary_size(obj)+extra_bytes);
+ sum += heap_bin_size(binary_size_rel(obj,base)+extra_bytes);
}
goto pop_next;
}
@@ -181,8 +184,12 @@ size_object(Eterm obj)
/*
* Copy a structure to a heap.
*/
-Eterm
-copy_struct(Eterm obj, Uint sz, Eterm** hpp, ErlOffHeap* off_heap)
+#if HALFWORD_HEAP
+Eterm copy_struct_rel(Eterm obj, Uint sz, Eterm** hpp, ErlOffHeap* off_heap,
+ Eterm* src_base, Eterm* dst_base)
+#else
+Eterm copy_struct(Eterm obj, Uint sz, Eterm** hpp, ErlOffHeap* off_heap)
+#endif
{
char* hstart;
Uint hsize;
@@ -214,7 +221,10 @@ copy_struct(Eterm obj, Uint sz, Eterm** hpp, ErlOffHeap* off_heap)
/* Copy the object onto the heap */
switch (primary_tag(obj)) {
- case TAG_PRIMARY_LIST: argp = &res; goto L_copy_list;
+ case TAG_PRIMARY_LIST:
+ argp = &res;
+ objp = list_val_rel(obj,src_base);
+ goto L_copy_list;
case TAG_PRIMARY_BOXED: argp = &res; goto L_copy_boxed;
default:
erl_exit(ERTS_ABORT_EXIT,
@@ -231,32 +241,46 @@ copy_struct(Eterm obj, Uint sz, Eterm** hpp, ErlOffHeap* off_heap)
hp++;
break;
case TAG_PRIMARY_LIST:
- objp = list_val(obj);
+ objp = list_val_rel(obj,src_base);
+ #if !HALFWORD_HEAP || defined(DEBUG)
if (in_area(objp,hstart,hsize)) {
+ ASSERT(!HALFWORD_HEAP);
hp++;
break;
}
+ #endif
argp = hp++;
/* Fall through */
L_copy_list:
tailp = argp;
- while (is_list(obj)) {
- objp = list_val(obj);
+ for (;;) {
tp = tailp;
- elem = *objp;
+ elem = CAR(objp);
if (IS_CONST(elem)) {
- *(hbot-2) = elem;
- tailp = hbot-1;
hbot -= 2;
+ CAR(hbot) = elem;
+ tailp = &CDR(hbot);
}
else {
- *htop = elem;
- tailp = htop+1;
+ CAR(htop) = elem;
+ #if HALFWORD_HEAP
+ CDR(htop) = CDR(objp);
+ *tailp = make_list_rel(htop,dst_base);
+ htop += 2;
+ goto L_copy;
+ #else
+ tailp = &CDR(htop);
htop += 2;
+ #endif
+ }
+ ASSERT(!HALFWORD_HEAP || tp < hp || tp >= hbot);
+ *tp = make_list_rel(tailp - 1, dst_base);
+ obj = CDR(objp);
+ if (!is_list(obj)) {
+ break;
}
- *tp = make_list(tailp - 1);
- obj = *(objp+1);
+ objp = list_val_rel(obj,src_base);
}
switch (primary_tag(obj)) {
case TAG_PRIMARY_IMMED1: *tailp = obj; goto L_copy;
@@ -268,21 +292,24 @@ copy_struct(Eterm obj, Uint sz, Eterm** hpp, ErlOffHeap* off_heap)
}
case TAG_PRIMARY_BOXED:
- if (in_area(boxed_val(obj),hstart,hsize)) {
+ #if !HALFWORD_HEAP || defined(DEBUG)
+ if (in_area(boxed_val_rel(obj,src_base),hstart,hsize)) {
+ ASSERT(!HALFWORD_HEAP);
hp++;
break;
}
+ #endif
argp = hp++;
L_copy_boxed:
- objp = boxed_val(obj);
+ objp = boxed_val_rel(obj, src_base);
hdr = *objp;
switch (hdr & _TAG_HEADER_MASK) {
case ARITYVAL_SUBTAG:
{
int const_flag = 1; /* assume constant tuple */
i = arityval(hdr);
- *argp = make_tuple(htop);
+ *argp = make_tuple_rel(htop, dst_base);
tp = htop; /* tp is pointer to new arity value */
*htop++ = *objp++; /* copy arity value */
while (i--) {
@@ -311,7 +338,7 @@ copy_struct(Eterm obj, Uint sz, Eterm** hpp, ErlOffHeap* off_heap)
while (i--) {
*tp++ = *objp++;
}
- *argp = make_binary(hbot);
+ *argp = make_binary_rel(hbot, dst_base);
pb = (ProcBin*) hbot;
erts_refc_inc(&pb->val->refc, 2);
pb->next = off_heap->first;
@@ -338,7 +365,7 @@ copy_struct(Eterm obj, Uint sz, Eterm** hpp, ErlOffHeap* off_heap)
extra_bytes = 0;
}
real_size = size+extra_bytes;
- objp = binary_val(real_bin);
+ objp = binary_val_rel(real_bin,src_base);
if (thing_subtag(*objp) == HEAP_BINARY_SUBTAG) {
ErlHeapBin* from = (ErlHeapBin *) objp;
ErlHeapBin* to;
@@ -368,7 +395,7 @@ copy_struct(Eterm obj, Uint sz, Eterm** hpp, ErlOffHeap* off_heap)
off_heap->first = (struct erl_off_heap_header*) to;
OH_OVERHEAD(off_heap, to->size / sizeof(Eterm));
}
- *argp = make_binary(hbot);
+ *argp = make_binary_rel(hbot, dst_base);
if (extra_bytes != 0) {
ErlSubBin* res;
hbot -= ERL_SUB_BIN_SIZE;
@@ -380,7 +407,7 @@ copy_struct(Eterm obj, Uint sz, Eterm** hpp, ErlOffHeap* off_heap)
res->offs = 0;
res->is_writable = 0;
res->orig = *argp;
- *argp = make_binary(hbot);
+ *argp = make_binary_rel(hbot, dst_base);
}
break;
}
@@ -400,7 +427,7 @@ copy_struct(Eterm obj, Uint sz, Eterm** hpp, ErlOffHeap* off_heap)
off_heap->first = (struct erl_off_heap_header*) funp;
erts_refc_inc(&funp->fe->refc, 2);
#endif
- *argp = make_fun(tp);
+ *argp = make_fun_rel(tp, dst_base);
}
break;
case EXTERNAL_PID_SUBTAG:
@@ -420,7 +447,7 @@ copy_struct(Eterm obj, Uint sz, Eterm** hpp, ErlOffHeap* off_heap)
off_heap->first = (struct erl_off_heap_header*)etp;
erts_refc_inc(&etp->node->refc, 2);
- *argp = make_external(tp);
+ *argp = make_external_rel(tp, dst_base);
}
break;
case BIN_MATCHSTATE_SUBTAG:
@@ -430,7 +457,7 @@ copy_struct(Eterm obj, Uint sz, Eterm** hpp, ErlOffHeap* off_heap)
i = thing_arityval(hdr)+1;
hbot -= i;
tp = hbot;
- *argp = make_boxed(hbot);
+ *argp = make_boxed_rel(hbot, dst_base);
while (i--) {
*tp++ = *objp++;
}
@@ -450,7 +477,7 @@ copy_struct(Eterm obj, Uint sz, Eterm** hpp, ErlOffHeap* off_heap)
if (htop != hbot)
erl_exit(ERTS_ABORT_EXIT,
"Internal error in copy_struct() when copying %T:"
- " htop=%p != hbot=%p (sz=%bpu)\n",
+ " htop=%p != hbot=%p (sz=%beu)\n",
org_obj, htop, hbot, org_sz);
#else
if (htop > hbot) {
@@ -885,12 +912,21 @@ Eterm copy_struct_lazy(Process *from, Eterm orig, Uint offs)
*
* NOTE: Assumes that term is a tuple (ptr is an untagged tuple ptr).
*/
-Eterm
-copy_shallow(Eterm* ptr, Uint sz, Eterm** hpp, ErlOffHeap* off_heap)
+#if HALFWORD_HEAP
+Eterm copy_shallow_rel(Eterm* ptr, Uint sz, Eterm** hpp, ErlOffHeap* off_heap,
+ Eterm* src_base)
+#else
+Eterm copy_shallow(Eterm* ptr, Uint sz, Eterm** hpp, ErlOffHeap* off_heap)
+#endif
{
Eterm* tp = ptr;
Eterm* hp = *hpp;
- Sint offs = hp - tp;
+ const Eterm res = make_tuple(hp);
+#if HALFWORD_HEAP
+ const Sint offs = COMPRESS_POINTER(hp - (tp - src_base));
+#else
+ const Sint offs = (hp - tp) * sizeof(Eterm);
+#endif
while (sz--) {
Eterm val = *tp++;
@@ -901,7 +937,7 @@ copy_shallow(Eterm* ptr, Uint sz, Eterm** hpp, ErlOffHeap* off_heap)
break;
case TAG_PRIMARY_LIST:
case TAG_PRIMARY_BOXED:
- *hp++ = offset_ptr(val, offs);
+ *hp++ = byte_offset_ptr(val, offs);
break;
case TAG_PRIMARY_HEADER:
*hp++ = val;
@@ -958,7 +994,8 @@ copy_shallow(Eterm* ptr, Uint sz, Eterm** hpp, ErlOffHeap* off_heap)
}
}
*hpp = hp;
- return make_tuple(ptr + offs);
+
+ return res;
}
/* Move all terms in heap fragments into heap. The terms must be guaranteed to
diff --git a/erts/emulator/beam/dist.c b/erts/emulator/beam/dist.c
index 694460d702..b1cdd0660a 100644
--- a/erts/emulator/beam/dist.c
+++ b/erts/emulator/beam/dist.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -864,11 +864,15 @@ erts_dsig_send_group_leader(ErtsDSigData *dsdp, Eterm leader, Eterm remote)
#include <valgrind/valgrind.h>
#include <valgrind/memcheck.h>
+#ifndef HAVE_VALGRIND_PRINTF_XML
+#define VALGRIND_PRINTF_XML VALGRIND_PRINTF
+#endif
+
# define PURIFY_MSG(msg) \
do { \
char buf__[1]; size_t bufsz__ = sizeof(buf__); \
if (erts_sys_getenv("VALGRIND_LOG_XML", buf__, &bufsz__) >= 0) { \
- VALGRIND_PRINTF("<erlang_error_log>" \
+ VALGRIND_PRINTF_XML("<erlang_error_log>" \
"%s, line %d: %s</erlang_error_log>\n", \
__FILE__, __LINE__, msg); \
} else { \
@@ -900,7 +904,6 @@ int erts_net_message(Port *prt,
ErtsDistExternal ede;
byte *t;
Sint ctl_len;
- int orig_ctl_len;
Eterm arg;
Eterm from, to;
Eterm watcher, watched;
@@ -917,6 +920,7 @@ int erts_net_message(Port *prt,
Eterm token_size;
ErtsMonitor *mon;
ErtsLink *lnk;
+ Uint tuple_arity;
int res;
#ifdef ERTS_DIST_MSG_DBG
int orig_len = len;
@@ -980,7 +984,6 @@ int erts_net_message(Port *prt,
PURIFY_MSG("data error");
goto data_error;
}
- orig_ctl_len = ctl_len;
if (ctl_len > DIST_CTL_DEFAULT_SIZE) {
ctl = erts_alloc(ERTS_ALC_T_DCTRL_BUF, ctl_len * sizeof(Eterm));
@@ -1003,29 +1006,23 @@ int erts_net_message(Port *prt,
#endif
if (is_not_tuple(arg) ||
- (tuple = tuple_val(arg), arityval(*tuple) < 1) ||
+ (tuple = tuple_val(arg), (tuple_arity = arityval(*tuple)) < 1) ||
is_not_small(tuple[1])) {
- erts_dsprintf_buf_t *dsbufp = erts_create_logger_dsbuf();
- erts_dsprintf(dsbufp, "Invalid distribution message: %.200T", arg);
- erts_send_error_to_logger_nogl(dsbufp);
- goto data_error;
+ goto invalid_message;
}
token_size = 0;
switch (type = unsigned_val(tuple[1])) {
case DOP_LINK:
+ if (tuple_arity != 3) {
+ goto invalid_message;
+ }
from = tuple[2];
to = tuple[3]; /* local proc to link to */
if (is_not_pid(from) || is_not_pid(to)) {
- erts_dsprintf_buf_t *dsbufp = erts_create_logger_dsbuf();
- PURIFY_MSG("data error");
- erts_dsprintf(dsbufp,
- "Invalid DOP_LINK distribution message: %.200T",
- arg);
- erts_send_error_to_logger_nogl(dsbufp);
- goto data_error;
+ goto invalid_message;
}
rp = erts_pid2proc_opt(NULL, 0,
@@ -1064,8 +1061,14 @@ int erts_net_message(Port *prt,
case DOP_UNLINK: {
ErtsDistLinkData dld;
+ if (tuple_arity != 3) {
+ goto invalid_message;
+ }
from = tuple[2];
to = tuple[3];
+ if (is_not_pid(from) || is_not_pid(to)) {
+ goto invalid_message;
+ }
rp = erts_pid2proc_opt(NULL, 0,
to, ERTS_PROC_LOCK_LINK,
@@ -1092,11 +1095,19 @@ int erts_net_message(Port *prt,
/* A remote process wants to monitor us, we get:
{DOP_MONITOR_P, Remote pid, local pid or name, ref} */
Eterm name;
+
+ if (tuple_arity != 4) {
+ goto invalid_message;
+ }
watcher = tuple[2];
watched = tuple[3]; /* local proc to monitor */
ref = tuple[4];
+ if (is_not_ref(ref)) {
+ goto invalid_message;
+ }
+
if (is_atom(watched)) {
name = watched;
rp = erts_whereis_process(NULL, 0,
@@ -1138,10 +1149,17 @@ int erts_net_message(Port *prt,
We get {DOP_DEMONITOR_P, Remote pid, Local pid or name, ref},
We need only the ref of course */
+ if (tuple_arity != 4) {
+ goto invalid_message;
+ }
/* watcher = tuple[2]; */
/* watched = tuple[3]; May be an atom in case of monitor name */
ref = tuple[4];
+ if(is_not_ref(ref)) {
+ goto invalid_message;
+ }
+
erts_smp_de_links_lock(dep);
mon = erts_remove_monitor(&(dep->monitors),ref);
erts_smp_de_links_unlock(dep);
@@ -1166,10 +1184,11 @@ int erts_net_message(Port *prt,
erts_destroy_monitor(mon);
break;
- case DOP_NODE_LINK: /* XXX never sent ?? */
- break;
-
case DOP_REG_SEND_TT:
+ if (tuple_arity != 5) {
+ goto invalid_message;
+ }
+
token_size = size_object(tuple[5]);
/* Fall through ... */
case DOP_REG_SEND:
@@ -1180,12 +1199,19 @@ int erts_net_message(Port *prt,
* There is intentionally no testing of the cookie (it is always '')
* from R9B and onwards.
*/
+ if (type != DOP_REG_SEND_TT && tuple_arity != 4) {
+ goto invalid_message;
+ }
+
#ifdef ERTS_DIST_MSG_DBG
dist_msg_dbg(&ede, "MSG", buf, orig_len);
#endif
from = tuple[2];
to = tuple[4];
+ if (is_not_pid(from) || is_not_atom(to)){
+ goto invalid_message;
+ }
rp = erts_whereis_process(NULL, 0, to, 0, ERTS_P2P_FLG_SMP_INC_REFC);
if (rp) {
Uint xsize = (type == DOP_REG_SEND
@@ -1217,6 +1243,10 @@ int erts_net_message(Port *prt,
break;
case DOP_SEND_TT:
+ if (tuple_arity != 4) {
+ goto invalid_message;
+ }
+
token_size = size_object(tuple[4]);
/* Fall through ... */
case DOP_SEND:
@@ -1227,8 +1257,13 @@ int erts_net_message(Port *prt,
#ifdef ERTS_DIST_MSG_DBG
dist_msg_dbg(&ede, "MSG", buf, orig_len);
#endif
-
+ if (type != DOP_SEND_TT && tuple_arity != 3) {
+ goto invalid_message;
+ }
to = tuple[3];
+ if (is_not_pid(to)) {
+ goto invalid_message;
+ }
rp = erts_pid2proc_opt(NULL, 0, to, 0, ERTS_P2P_FLG_SMP_INC_REFC);
if (rp) {
Uint xsize = type == DOP_SEND ? 0 : ERTS_HEAP_FRAG_SIZE(token_size);
@@ -1266,11 +1301,19 @@ int erts_net_message(Port *prt,
Eterm sysname;
ErtsProcLocks rp_locks = ERTS_PROC_LOCKS_MSG_SEND|ERTS_PROC_LOCK_LINK;
+ if (tuple_arity != 5) {
+ goto invalid_message;
+ }
+
/* watched = tuple[2]; */ /* remote proc which died */
/* watcher = tuple[3]; */
ref = tuple[4];
reason = tuple[5];
+ if(is_not_ref(ref)) {
+ goto invalid_message;
+ }
+
erts_smp_de_links_lock(dep);
sysname = dep->sysname;
mon = erts_remove_monitor(&(dep->monitors), ref);
@@ -1317,24 +1360,25 @@ int erts_net_message(Port *prt,
ErtsProcLocks rp_locks = ERTS_PROC_LOCK_LINK|ERTS_PROC_LOCKS_XSIG_SEND;
/* 'from', which 'to' is linked to, died */
if (type == DOP_EXIT) {
- from = tuple[2];
- to = tuple[3];
- reason = tuple[4];
- token = NIL;
+ if (tuple_arity != 4) {
+ goto invalid_message;
+ }
+
+ from = tuple[2];
+ to = tuple[3];
+ reason = tuple[4];
+ token = NIL;
} else {
- from = tuple[2];
- to = tuple[3];
- token = tuple[4];
- reason = tuple[5];
+ if (tuple_arity != 5) {
+ goto invalid_message;
+ }
+ from = tuple[2];
+ to = tuple[3];
+ token = tuple[4];
+ reason = tuple[5];
}
- if (is_not_internal_pid(to)) {
- erts_dsprintf_buf_t *dsbufp = erts_create_logger_dsbuf();
- PURIFY_MSG("data error");
- erts_dsprintf(dsbufp,
- "Invalid DOP_EXIT distribution message: %.200T",
- arg);
- erts_send_error_to_logger_nogl(dsbufp);
- goto data_error;
+ if (is_not_pid(from) || is_not_internal_pid(to)) {
+ goto invalid_message;
}
rp = erts_pid2proc(NULL, 0, to, rp_locks);
@@ -1381,15 +1425,24 @@ int erts_net_message(Port *prt,
ErtsProcLocks rp_locks = ERTS_PROC_LOCKS_XSIG_SEND;
/* 'from' is send an exit signal to 'to' */
if (type == DOP_EXIT2) {
- from = tuple[2];
- to = tuple[3];
- reason = tuple[4];
- token = NIL;
+ if (tuple_arity != 4) {
+ goto invalid_message;
+ }
+ from = tuple[2];
+ to = tuple[3];
+ reason = tuple[4];
+ token = NIL;
} else {
- from = tuple[2];
- to = tuple[3];
- token = tuple[4];
- reason = tuple[5];
+ if (tuple_arity != 5) {
+ goto invalid_message;
+ }
+ from = tuple[2];
+ to = tuple[3];
+ token = tuple[4];
+ reason = tuple[5];
+ }
+ if (is_not_pid(from) || is_not_internal_pid(to)) {
+ goto invalid_message;
}
rp = erts_pid2proc_opt(NULL, 0, to, rp_locks,
ERTS_P2P_FLG_SMP_INC_REFC);
@@ -1408,10 +1461,14 @@ int erts_net_message(Port *prt,
break;
}
case DOP_GROUP_LEADER:
+ if (tuple_arity != 3) {
+ goto invalid_message;
+ }
from = tuple[2]; /* Group leader */
to = tuple[3]; /* new member */
- if (is_not_pid(from))
- break;
+ if (is_not_pid(from) || is_not_pid(to)) {
+ goto invalid_message;
+ }
rp = erts_pid2proc(NULL, 0, to, ERTS_PROC_LOCK_MAIN);
if (!rp)
@@ -1420,16 +1477,8 @@ int erts_net_message(Port *prt,
erts_smp_proc_unlock(rp, ERTS_PROC_LOCK_MAIN);
break;
- default: {
- erts_dsprintf_buf_t *dsbufp = erts_create_logger_dsbuf();
- erts_dsprintf(dsbufp,
- "Illegal value in distribution dispatch switch: "
- "%.200T",
- arg);
- erts_send_error_to_logger_nogl(dsbufp);
- PURIFY_MSG("data error");
- goto data_error;
- }
+ default:
+ goto invalid_message;
}
erts_cleanup_offheap(&off_heap);
@@ -1441,8 +1490,14 @@ int erts_net_message(Port *prt,
UnUseTmpHeapNoproc(DIST_CTL_DEFAULT_SIZE);
ERTS_SMP_CHK_NO_PROC_LOCKS;
return 0;
-
+ invalid_message:
+ {
+ erts_dsprintf_buf_t *dsbufp = erts_create_logger_dsbuf();
+ erts_dsprintf(dsbufp, "Invalid distribution message: %.200T", arg);
+ erts_send_error_to_logger_nogl(dsbufp);
+ }
data_error:
+ PURIFY_MSG("data error");
erts_cleanup_offheap(&off_heap);
#ifndef HYBRID /* FIND ME! */
if (ctl != ctl_default) {
@@ -1632,7 +1687,7 @@ dist_port_command(Port *prt, ErtsDistOutputBuf *obuf)
if (size > (Uint) INT_MAX)
erl_exit(ERTS_ABORT_EXIT,
"Absurdly large distribution output data buffer "
- "(%bpu bytes) passed.\n",
+ "(%beu bytes) passed.\n",
size);
prt->caller = NIL;
@@ -1659,7 +1714,7 @@ dist_port_commandv(Port *prt, ErtsDistOutputBuf *obuf)
if (size > (Uint) INT_MAX)
erl_exit(ERTS_ABORT_EXIT,
"Absurdly large distribution output data buffer "
- "(%bpu bytes) passed.\n",
+ "(%beu bytes) passed.\n",
size);
iov[0].iov_base = NULL;
diff --git a/erts/emulator/beam/dist.h b/erts/emulator/beam/dist.h
index 9ccc3e5ba9..695a4fc3fe 100644
--- a/erts/emulator/beam/dist.h
+++ b/erts/emulator/beam/dist.h
@@ -52,7 +52,7 @@
#define DOP_SEND 2
#define DOP_EXIT 3
#define DOP_UNLINK 4
-#define DOP_NODE_LINK 5
+/* Ancient DOP_NODE_LINK (5) was here, can be reused */
#define DOP_REG_SEND 6
#define DOP_GROUP_LEADER 7
#define DOP_EXIT2 8
@@ -69,7 +69,6 @@
/* distribution trap functions */
extern Export* dsend2_trap;
extern Export* dsend3_trap;
-/*extern Export* dsend_nosuspend_trap;*/
extern Export* dlink_trap;
extern Export* dunlink_trap;
extern Export* dmonitor_node_trap;
diff --git a/erts/emulator/beam/erl_alloc.c b/erts/emulator/beam/erl_alloc.c
index 7793f60f4f..673eac7fea 100644
--- a/erts/emulator/beam/erl_alloc.c
+++ b/erts/emulator/beam/erl_alloc.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2002-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2002-2011. 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
@@ -1411,6 +1411,33 @@ void erts_alloc_reg_scheduler_id(Uint id)
erts_tsd_set(thr_ix_key, (void *)(long) ix);
}
+static void
+no_verify(Allctr_t *allctr)
+{
+
+}
+
+erts_alloc_verify_func_t
+erts_alloc_get_verify_unused_temp_alloc(Allctr_t **allctr)
+{
+ if (erts_allctrs_info[ERTS_ALC_A_TEMPORARY].alloc_util
+ && erts_allctrs_info[ERTS_ALC_A_TEMPORARY].thr_spec) {
+ ErtsAllocatorThrSpec_t *tspec;
+ tspec = &erts_allctr_thr_spec[ERTS_ALC_A_TEMPORARY];
+ if (!tspec->all_thr_safe) {
+ int ix = erts_alc_get_thr_ix();
+
+ if (ix < tspec->size) {
+ *allctr = tspec->allctr[ix];
+ return erts_alcu_verify_unused;
+ }
+ }
+ }
+
+ *allctr = NULL;
+ return no_verify;
+}
+
__decl_noreturn void
erts_alc_fatal_error(int error, int func, ErtsAlcType_t n, ...)
{
@@ -1568,7 +1595,6 @@ erts_memory(int *print_to_p, void *print_to_arg, void *proc, Eterm earg)
Eterm atoms[sizeof(size)/sizeof(Uint)];
Uint *uintps[sizeof(size)/sizeof(Uint)];
Eterm euints[sizeof(size)/sizeof(Uint)];
- int need_atom;
int want_tot_or_sys;
int length;
Eterm res = THE_NON_VALUE;
@@ -1756,7 +1782,6 @@ erts_memory(int *print_to_p, void *print_to_arg, void *proc, Eterm earg)
/* Calculate values needed... */
want_tot_or_sys = want.total || want.system;
- need_atom = ERTS_MEM_NEED_ALL_ALCU || want.atom;
if (ERTS_MEM_NEED_ALL_ALCU) {
size.total = 0;
@@ -1888,7 +1913,7 @@ erts_memory(int *print_to_p, void *print_to_arg, void *proc, Eterm earg)
/* Print result... */
erts_print(to, arg, "=memory\n");
for (i = 0; i < length; i++)
- erts_print(to, arg, "%T: %bpu\n", atoms[i], *uintps[i]);
+ erts_print(to, arg, "%T: %beu\n", atoms[i], *uintps[i]);
}
if (proc) {
@@ -2082,11 +2107,11 @@ erts_allocated_areas(int *print_to_p, void *print_to_arg, void *proc)
for (i = 0; i < length; i++) {
switch (values[i].arity) {
case 2:
- erts_print(to, arg, "%s: %bpu\n",
+ erts_print(to, arg, "%s: %beu\n",
values[i].name, values[i].ui[0]);
break;
case 3:
- erts_print(to, arg, "%s: %bpu %bpu\n",
+ erts_print(to, arg, "%s: %beu %beu\n",
values[i].name, values[i].ui[0], values[i].ui[1]);
break;
default:
diff --git a/erts/emulator/beam/erl_alloc.h b/erts/emulator/beam/erl_alloc.h
index 3e96c76dbf..ce792d4d17 100644
--- a/erts/emulator/beam/erl_alloc.h
+++ b/erts/emulator/beam/erl_alloc.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2002-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2002-2011. 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
@@ -172,9 +172,17 @@ void *erts_realloc(ErtsAlcType_t type, void *ptr, Uint size);
void erts_free(ErtsAlcType_t type, void *ptr);
void *erts_alloc_fnf(ErtsAlcType_t type, Uint size);
void *erts_realloc_fnf(ErtsAlcType_t type, void *ptr, Uint size);
+void *erts_alloc_permanent_cache_aligned(ErtsAlcType_t type, Uint size);
+
#endif /* #if !ERTS_ALC_DO_INLINE */
+#ifndef ERTS_CACHE_LINE_SIZE
+/* Assume a cache line size of 64 bytes */
+# define ERTS_CACHE_LINE_SIZE ((UWord) 64)
+# define ERTS_CACHE_LINE_MASK (ERTS_CACHE_LINE_SIZE - 1)
+#endif
+
#if ERTS_ALC_DO_INLINE || defined(ERTS_ALC_INTERNAL__)
ERTS_ALC_INLINE
@@ -234,13 +242,25 @@ void *erts_realloc_fnf(ErtsAlcType_t type, void *ptr, Uint size)
size);
}
+ERTS_ALC_INLINE
+void *erts_alloc_permanent_cache_aligned(ErtsAlcType_t type, Uint size)
+{
+ UWord v = (UWord) erts_alloc(type, size + (ERTS_CACHE_LINE_SIZE-1));
+
+ if (v & ERTS_CACHE_LINE_MASK) {
+ v = (v & ~ERTS_CACHE_LINE_MASK) + ERTS_CACHE_LINE_SIZE;
+ }
+ ASSERT((v & ERTS_CACHE_LINE_MASK) == 0);
+ return (void*)v;
+}
+
#endif /* #if ERTS_ALC_DO_INLINE || defined(ERTS_ALC_INTERNAL__) */
-#ifndef ERTS_CACHE_LINE_SIZE
-/* Assume a cache line size of 64 bytes */
-# define ERTS_CACHE_LINE_SIZE ((UWord) 64)
-# define ERTS_CACHE_LINE_MASK (ERTS_CACHE_LINE_SIZE - 1)
-#endif
+typedef void (*erts_alloc_verify_func_t)(Allctr_t *);
+
+erts_alloc_verify_func_t
+erts_alloc_get_verify_unused_temp_alloc(Allctr_t **allctr);
+
#define ERTS_ALC_CACHE_LINE_ALIGN_SIZE(SZ) \
(((((SZ) - 1) / ERTS_CACHE_LINE_SIZE) + 1) * ERTS_CACHE_LINE_SIZE)
diff --git a/erts/emulator/beam/erl_alloc.types b/erts/emulator/beam/erl_alloc.types
index 408ffd12f7..ca71798917 100644
--- a/erts/emulator/beam/erl_alloc.types
+++ b/erts/emulator/beam/erl_alloc.types
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2003-2010. All Rights Reserved.
+# Copyright Ericsson AB 2003-2011. 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
@@ -193,6 +193,7 @@ type DB_FIXATION SHORT_LIVED ETS db_fixation
type DB_FIX_DEL SHORT_LIVED ETS fixed_del
type DB_TABLES LONG_LIVED ETS db_tabs
type DB_NTAB_ENT STANDARD ETS db_named_table_entry
+type DB_HEIR_DATA STANDARD ETS db_heir_data
type DB_TMP TEMPORARY ETS db_tmp
type DB_MC_STK TEMPORARY ETS db_mc_stack
type DB_MS_PSDO_PROC LONG_LIVED ETS db_match_pseudo_proc
@@ -263,6 +264,8 @@ type XPORTS_LIST SHORT_LIVED SYSTEM extra_port_list
type PROC_LCK_WTR LONG_LIVED SYSTEM proc_lock_waiter
type PROC_LCK_QS LONG_LIVED SYSTEM proc_lock_queues
type RUNQ_BLNS LONG_LIVED SYSTEM run_queue_balancing
+type MISC_AUX_WORK_Q LONG_LIVED SYSTEM misc_aux_work_q
+type MISC_AUX_WORK SHORT_LIVED SYSTEM misc_aux_work
+endif
#
diff --git a/erts/emulator/beam/erl_alloc_util.c b/erts/emulator/beam/erl_alloc_util.c
index 8b184899c9..84c72439a3 100644
--- a/erts/emulator/beam/erl_alloc_util.c
+++ b/erts/emulator/beam/erl_alloc_util.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2002-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2002-2011. 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
@@ -1877,7 +1877,7 @@ sz_info_carriers(Allctr_t *allctr,
cs->blocks.max_ever.size);
erts_print(to,
arg,
- "%scarriers size: %bpu %bpu %bpu\n",
+ "%scarriers size: %beu %bpu %bpu\n",
prefix,
curr_size,
cs->max.size,
@@ -1933,7 +1933,7 @@ info_carriers(Allctr_t *allctr,
cs->blocks.max_ever.size);
erts_print(to,
arg,
- "%scarriers: %bpu %bpu %bpu\n",
+ "%scarriers: %beu %bpu %bpu\n",
prefix,
curr_no,
cs->max.no,
@@ -1952,7 +1952,7 @@ info_carriers(Allctr_t *allctr,
cs->curr_sys_alloc.no);
erts_print(to,
arg,
- "%scarriers size: %bpu %bpu %bpu\n",
+ "%scarriers size: %beu %bpu %bpu\n",
prefix,
curr_size,
cs->max.size,
@@ -2053,15 +2053,15 @@ info_calls(Allctr_t *allctr,
#define PRINT_CC_4(TO, TOA, NAME, CC) \
if ((CC).giga_no == 0) \
- erts_print(TO, TOA, "%s calls: %bpu\n", NAME, CC.no); \
+ erts_print(TO, TOA, "%s calls: %b32u\n", NAME, CC.no); \
else \
- erts_print(TO, TOA, "%s calls: %bpu%09lu\n", NAME, CC.giga_no, CC.no)
+ erts_print(TO, TOA, "%s calls: %b32u%09lu\n", NAME, CC.giga_no, CC.no)
#define PRINT_CC_5(TO, TOA, PRFX, NAME, CC) \
if ((CC).giga_no == 0) \
- erts_print(TO, TOA, "%s%s calls: %bpu\n",PRFX,NAME,CC.no); \
+ erts_print(TO, TOA, "%s%s calls: %b32u\n",PRFX,NAME,CC.no); \
else \
- erts_print(TO, TOA, "%s%s calls: %bpu%09lu\n",PRFX,NAME,CC.giga_no,CC.no)
+ erts_print(TO, TOA, "%s%s calls: %b32u%09lu\n",PRFX,NAME,CC.giga_no,CC.no)
char *prefix = allctr->name_prefix;
int to = *print_to_p;
@@ -2168,21 +2168,21 @@ info_options(Allctr_t *allctr,
"option e: true\n"
"option t: %s\n"
"option ramv: %s\n"
- "option sbct: %bpu\n"
+ "option sbct: %beu\n"
#if HAVE_ERTS_MSEG
"option asbcst: %bpu\n"
"option rsbcst: %bpu\n"
#endif
- "option rsbcmt: %bpu\n"
- "option rmbcmt: %bpu\n"
- "option mmbcs: %bpu\n"
+ "option rsbcmt: %beu\n"
+ "option rmbcmt: %beu\n"
+ "option mmbcs: %beu\n"
#if HAVE_ERTS_MSEG
- "option mmsbc: %bpu\n"
- "option mmmbc: %bpu\n"
+ "option mmsbc: %beu\n"
+ "option mmmbc: %beu\n"
#endif
- "option lmbcs: %bpu\n"
- "option smbcs: %bpu\n"
- "option mbcgs: %bpu\n",
+ "option lmbcs: %beu\n"
+ "option smbcs: %beu\n"
+ "option mbcgs: %beu\n",
topt,
allctr->ramv ? "true" : "false",
allctr->sbc_threshold,
@@ -2292,9 +2292,9 @@ erts_alcu_au_info_options(int *print_to_p, void *print_to_arg,
erts_print(*print_to_p,
print_to_arg,
#if HAVE_ERTS_MSEG
- "option mmc: %bpu\n"
+ "option mmc: %beu\n"
#endif
- "option ycs: %bpu\n",
+ "option ycs: %beu\n",
#if HAVE_ERTS_MSEG
max_mseg_carriers,
#endif
@@ -3368,6 +3368,38 @@ erts_alcu_test(unsigned long op, unsigned long a1, unsigned long a2)
* Debug functions *
\* */
+void
+erts_alcu_verify_unused(Allctr_t *allctr)
+{
+ UWord no;
+
+ no = allctr->sbcs.curr_mseg.no;
+ no += allctr->sbcs.curr_sys_alloc.no;
+ no += allctr->mbcs.blocks.curr.no;
+
+ if (no) {
+ UWord sz = allctr->sbcs.blocks.curr.size;
+ sz += allctr->mbcs.blocks.curr.size;
+ erl_exit(ERTS_ABORT_EXIT,
+ "%salloc() used when expected to be unused!\n"
+ "Total amount of blocks allocated: %bpu\n"
+ "Total amount of bytes allocated: %bpu\n",
+ allctr->name_prefix, no, sz);
+ }
+}
+
+void
+erts_alcu_verify_unused_ts(Allctr_t *allctr)
+{
+#ifdef USE_THREADS
+ erts_mtx_lock(&allctr->mutex);
+#endif
+ erts_alcu_verify_unused(allctr);
+#ifdef USE_THREADS
+ erts_mtx_unlock(&allctr->mutex);
+#endif
+}
+
#ifdef ERTS_ALLOC_UTIL_HARD_DEBUG
static void
diff --git a/erts/emulator/beam/erl_alloc_util.h b/erts/emulator/beam/erl_alloc_util.h
index f2b951bca6..d296081714 100644
--- a/erts/emulator/beam/erl_alloc_util.h
+++ b/erts/emulator/beam/erl_alloc_util.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2002-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2002-2011. 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
@@ -333,6 +333,9 @@ struct Allctr_t_ {
int erts_alcu_start(Allctr_t *, AllctrInit_t *);
void erts_alcu_stop(Allctr_t *);
+void erts_alcu_verify_unused(Allctr_t *);
+void erts_alcu_verify_unused_ts(Allctr_t *allctr);
+
unsigned long erts_alcu_test(unsigned long, unsigned long, unsigned long);
diff --git a/erts/emulator/beam/erl_bif_ddll.c b/erts/emulator/beam/erl_bif_ddll.c
index 2c2e283f65..c9cdcb87a6 100644
--- a/erts/emulator/beam/erl_bif_ddll.c
+++ b/erts/emulator/beam/erl_bif_ddll.c
@@ -1193,7 +1193,7 @@ int erts_ddll_driver_ok(DE_Handle *dh)
static void ddll_no_more_references(void *vdh)
{
DE_Handle *dh = (DE_Handle *) vdh;
- int x;
+ erts_aint_t x;
lock_drv_list();
@@ -1604,7 +1604,7 @@ static int do_load_driver_entry(DE_Handle *dh, char *path, char *name)
erts_sys_ddll_close(dh->handle);
return ERL_DE_LOAD_ERROR_BAD_NAME;
}
- erts_smp_atomic_init(&(dh->refc), (long) 0);
+ erts_smp_atomic_init(&(dh->refc), (erts_aint_t) 0);
dh->port_count = 0;
dh->full_path = erts_alloc(ERTS_ALC_T_DDLL_HANDLE, sys_strlen(path) + 1);
sys_strcpy(dh->full_path, path);
@@ -1672,7 +1672,7 @@ static int load_driver_entry(DE_Handle **dhp, char *path, char *name)
dh->handle = NULL;
dh->procs = NULL;
dh->port_count = 0;
- erts_refc_init(&(dh->refc), (long) 0);
+ erts_refc_init(&(dh->refc), (erts_aint_t) 0);
dh->status = -1;
dh->reload_full_path = NULL;
dh->reload_driver_name = NULL;
diff --git a/erts/emulator/beam/erl_bif_info.c b/erts/emulator/beam/erl_bif_info.c
index 75d8db880c..e50fc18e64 100644
--- a/erts/emulator/beam/erl_bif_info.c
+++ b/erts/emulator/beam/erl_bif_info.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1999-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1999-2011. 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
@@ -71,9 +71,9 @@ static char erts_system_version[] = ("Erlang " ERLANG_OTP_RELEASE
#endif
#endif
#ifdef ERTS_SMP
- " [smp:%bpu:%bpu]"
+ " [smp:%beu:%beu]"
#endif
- " [rq:%bpu]"
+ " [rq:%beu]"
#ifdef USE_THREADS
" [async-threads:%d]"
#endif
@@ -1545,7 +1545,7 @@ process_info_aux(Process *BIF_P,
case am_backtrace: {
erts_dsprintf_buf_t *dsbufp = erts_create_tmp_dsbuf(0);
erts_stack_dump(ERTS_PRINT_DSBUF, (void *) dsbufp, rp);
- res = new_binary(BIF_P, (byte *) dsbufp->str, (int) dsbufp->str_len);
+ res = new_binary(BIF_P, (byte *) dsbufp->str, dsbufp->str_len);
erts_destroy_tmp_dsbuf(dsbufp);
hp = HAlloc(BIF_P, 3);
break;
@@ -1723,8 +1723,14 @@ info_1_tuple(Process* BIF_P, /* Pointer to current process. */
} else if (is_list(*tp)) {
#if defined(PURIFY)
#define ERTS_ERROR_CHECKER_PRINTF purify_printf
+#define ERTS_ERROR_CHECKER_PRINTF_XML purify_printf
#elif defined(VALGRIND)
#define ERTS_ERROR_CHECKER_PRINTF VALGRIND_PRINTF
+# ifndef HAVE_VALGRIND_PRINTF_XML
+# define ERTS_ERROR_CHECKER_PRINTF_XML VALGRIND_PRINTF
+# else
+# define ERTS_ERROR_CHECKER_PRINTF_XML VALGRIND_PRINTF_XML
+# endif
#endif
int buf_size = 8*1024; /* Try with 8KB first */
char *buf = erts_alloc(ERTS_ALC_T_TMP, buf_size);
@@ -1741,8 +1747,8 @@ info_1_tuple(Process* BIF_P, /* Pointer to current process. */
}
buf[buf_size - 1 - r] = '\0';
if (check_if_xml()) {
- ERTS_ERROR_CHECKER_PRINTF("<erlang_info_log>"
- "%s</erlang_info_log>\n", buf);
+ ERTS_ERROR_CHECKER_PRINTF_XML("<erlang_info_log>"
+ "%s</erlang_info_log>\n", buf);
} else {
ERTS_ERROR_CHECKER_PRINTF("%s\n", buf);
}
@@ -2020,7 +2026,7 @@ BIF_RETTYPE system_info_1(BIF_ALIST_1)
res = TUPLE2(hp, am_sequential_tracer, val);
BIF_RET(res);
} else if (BIF_ARG_1 == am_garbage_collection){
- Uint val = (Uint) erts_smp_atomic_read(&erts_max_gen_gcs);
+ Uint val = (Uint) erts_smp_atomic32_read(&erts_max_gen_gcs);
Eterm tup;
hp = HAlloc(BIF_P, 3+2 + 3+2 + 3+2);
@@ -2035,7 +2041,7 @@ BIF_RETTYPE system_info_1(BIF_ALIST_1)
BIF_RET(res);
} else if (BIF_ARG_1 == am_fullsweep_after){
- Uint val = (Uint) erts_smp_atomic_read(&erts_max_gen_gcs);
+ Uint val = (Uint) erts_smp_atomic32_read(&erts_max_gen_gcs);
hp = HAlloc(BIF_P, 3);
res = TUPLE2(hp, am_fullsweep_after, make_small(val));
BIF_RET(res);
@@ -2074,7 +2080,7 @@ BIF_RETTYPE system_info_1(BIF_ALIST_1)
erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN);
ASSERT(dsbufp && dsbufp->str);
- res = new_binary(BIF_P, (byte *) dsbufp->str, (int) dsbufp->str_len);
+ res = new_binary(BIF_P, (byte *) dsbufp->str, dsbufp->str_len);
erts_destroy_info_dsbuf(dsbufp);
BIF_RET(res);
} else if (ERTS_IS_ATOM_STR("dist_ctrl", BIF_ARG_1)) {
@@ -3430,8 +3436,8 @@ BIF_RETTYPE erts_debug_set_internal_state_2(BIF_ALIST_2)
*/
if (ERTS_IS_ATOM_STR("available_internal_state", BIF_ARG_1)
&& (BIF_ARG_2 == am_true || BIF_ARG_2 == am_false)) {
- long on = (long) (BIF_ARG_2 == am_true);
- long prev_on = erts_smp_atomic_xchg(&available_internal_state, on);
+ erts_aint_t on = (erts_aint_t) (BIF_ARG_2 == am_true);
+ erts_aint_t prev_on = erts_smp_atomic_xchg(&available_internal_state, on);
if (on) {
erts_dsprintf_buf_t *dsbufp = erts_create_logger_dsbuf();
erts_dsprintf(dsbufp, "Process %T ", BIF_P->id);
@@ -3628,7 +3634,7 @@ BIF_RETTYPE erts_debug_set_internal_state_2(BIF_ALIST_2)
}
else if (ERTS_IS_ATOM_STR("hipe_test_reschedule_suspend", BIF_ARG_1)) {
/* Used by hipe test suites */
- long flag = erts_smp_atomic_read(&hipe_test_reschedule_flag);
+ erts_aint_t flag = erts_smp_atomic_read(&hipe_test_reschedule_flag);
if (!flag && BIF_ARG_2 != am_false) {
erts_smp_atomic_set(&hipe_test_reschedule_flag, 1);
erts_suspend(BIF_P, ERTS_PROC_LOCK_MAIN, NULL);
@@ -3703,7 +3709,7 @@ BIF_RETTYPE erts_debug_set_internal_state_2(BIF_ALIST_2)
#ifdef ERTS_ENABLE_LOCK_COUNT
static Eterm lcnt_build_lock_stats_term(Eterm **hpp, Uint *szp, erts_lcnt_lock_stats_t *stats, Eterm res) {
- unsigned long tries = 0, colls = 0;
+ Uint tries = 0, colls = 0;
unsigned long timer_s = 0, timer_ns = 0, timer_n = 0;
unsigned int line = 0;
@@ -3716,8 +3722,8 @@ static Eterm lcnt_build_lock_stats_term(Eterm **hpp, Uint *szp, erts_lcnt_lock_s
* [{{file, line}, {tries, colls, {seconds, nanoseconds, n_blocks}}}]
*/
- tries = (unsigned long) ethr_atomic_read(&stats->tries);
- colls = (unsigned long) ethr_atomic_read(&stats->colls);
+ tries = (Uint) ethr_atomic_read(&stats->tries);
+ colls = (Uint) ethr_atomic_read(&stats->colls);
line = stats->line;
timer_s = stats->timer.s;
diff --git a/erts/emulator/beam/erl_bif_lists.c b/erts/emulator/beam/erl_bif_lists.c
index ce13469801..47c48e74d6 100644
--- a/erts/emulator/beam/erl_bif_lists.c
+++ b/erts/emulator/beam/erl_bif_lists.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1999-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1999-2011. 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
@@ -378,7 +378,7 @@ keyfind(int Bif, Process* p, Eterm Key, Eterm Pos, Eterm List)
Eterm *tuple_ptr = tuple_val(term);
if (pos <= arityval(*tuple_ptr)) {
Eterm element = tuple_ptr[pos];
- if (cmp(Key, element) == 0) {
+ if (CMP(Key, element) == 0) {
return term;
}
}
diff --git a/erts/emulator/beam/erl_bif_timer.c b/erts/emulator/beam/erl_bif_timer.c
index 4ae2f6ebf4..db771bd216 100644
--- a/erts/emulator/beam/erl_bif_timer.c
+++ b/erts/emulator/beam/erl_bif_timer.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2005-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2005-2011. 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
@@ -478,7 +478,7 @@ setup_bif_timer(Uint32 xflags,
tab_insert(btm);
ASSERT(btm == tab_find(ref));
btm->tm.active = 0; /* MUST be initalized */
- erl_set_timer(&btm->tm,
+ erts_set_timer(&btm->tm,
(ErlTimeoutProc) bif_timer_timeout,
(ErlCancelProc) bif_timer_cleanup,
(void *) btm,
@@ -550,7 +550,7 @@ BIF_RETTYPE cancel_timer_1(BIF_ALIST_1)
res = am_false;
}
else {
- Uint left = time_left(&btm->tm);
+ Uint left = erts_time_left(&btm->tm);
if (!(btm->flags & BTM_FLG_BYNAME)) {
erts_smp_proc_lock(btm->receiver.proc.ess, ERTS_PROC_LOCK_MSGQ);
unlink_proc(btm);
@@ -558,7 +558,7 @@ BIF_RETTYPE cancel_timer_1(BIF_ALIST_1)
}
tab_remove(btm);
ASSERT(!tab_find(BIF_ARG_1));
- erl_cancel_timer(&btm->tm);
+ erts_cancel_timer(&btm->tm);
erts_smp_btm_rwunlock();
res = erts_make_integer(left, BIF_P);
}
@@ -587,7 +587,7 @@ BIF_RETTYPE read_timer_1(BIF_ALIST_1)
res = am_false;
}
else {
- Uint left = time_left(&btm->tm);
+ Uint left = erts_time_left(&btm->tm);
res = erts_make_integer(left, BIF_P);
}
@@ -613,7 +613,8 @@ erts_print_bif_timer_info(int to, void *to_arg)
: btm->receiver.proc.ess->id);
erts_print(to, to_arg, "=timer:%T\n", receiver);
erts_print(to, to_arg, "Message: %T\n", btm->message);
- erts_print(to, to_arg, "Time left: %d ms\n", time_left(&btm->tm));
+ erts_print(to, to_arg, "Time left: %u ms\n",
+ erts_time_left(&btm->tm));
}
}
@@ -640,7 +641,7 @@ erts_cancel_bif_timers(Process *p, ErtsProcLocks plocks)
tab_remove(btm);
tmp_btm = btm;
btm = btm->receiver.proc.next;
- erl_cancel_timer(&tmp_btm->tm);
+ erts_cancel_timer(&tmp_btm->tm);
}
p->bif_timers = NULL;
diff --git a/erts/emulator/beam/erl_binary.h b/erts/emulator/beam/erl_binary.h
index bdf0fe23fc..506c4813fa 100644
--- a/erts/emulator/beam/erl_binary.h
+++ b/erts/emulator/beam/erl_binary.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2000-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2000-2011. 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
@@ -71,6 +71,7 @@ typedef struct erl_heap_bin {
*/
#define binary_size(Bin) (binary_val(Bin)[1])
+#define binary_size_rel(Bin,BasePtr) (binary_val_rel(Bin,BasePtr)[1])
#define binary_bitsize(Bin) \
((*binary_val(Bin) == HEADER_SUB_BIN) ? \
@@ -93,9 +94,12 @@ typedef struct erl_heap_bin {
* Bitsize: output variable (Uint)
*/
-#define ERTS_GET_BINARY_BYTES(Bin,Bytep,Bitoffs,Bitsize) \
+#define ERTS_GET_BINARY_BYTES(Bin,Bytep,Bitoffs,Bitsize) \
+ ERTS_GET_BINARY_BYTES_REL(Bin,Bytep,Bitoffs,Bitsize,NULL)
+
+#define ERTS_GET_BINARY_BYTES_REL(Bin,Bytep,Bitoffs,Bitsize,BasePtr) \
do { \
- Eterm* _real_bin = binary_val(Bin); \
+ Eterm* _real_bin = binary_val_rel(Bin,BasePtr); \
Uint _offs = 0; \
Bitoffs = Bitsize = 0; \
if (*_real_bin == HEADER_SUB_BIN) { \
@@ -103,7 +107,7 @@ do { \
_offs = _sb->offs; \
Bitoffs = _sb->bitoffs; \
Bitsize = _sb->bitsize; \
- _real_bin = binary_val(_sb->orig); \
+ _real_bin = binary_val_rel(_sb->orig,BasePtr); \
} \
if (*_real_bin == HEADER_PROC_BIN) { \
Bytep = ((ProcBin *) _real_bin)->bytes + _offs; \
@@ -125,9 +129,12 @@ do { \
* BitSize: Extra bit size (Uint)
*/
-#define ERTS_GET_REAL_BIN(Bin, RealBin, ByteOffset, BitOffset, BitSize) \
+#define ERTS_GET_REAL_BIN(Bin, RealBin, ByteOffset, BitOffset, BitSize) \
+ ERTS_GET_REAL_BIN_REL(Bin, RealBin, ByteOffset, BitOffset, BitSize, NULL)
+
+#define ERTS_GET_REAL_BIN_REL(Bin, RealBin, ByteOffset, BitOffset, BitSize, BasePtr) \
do { \
- ErlSubBin* _sb = (ErlSubBin *) binary_val(Bin); \
+ ErlSubBin* _sb = (ErlSubBin *) binary_val_rel(Bin,BasePtr); \
if (_sb->thing_word == HEADER_SUB_BIN) { \
RealBin = _sb->orig; \
ByteOffset = _sb->offs; \
diff --git a/erts/emulator/beam/erl_bits.c b/erts/emulator/beam/erl_bits.c
index 88d2c06246..0174e5fc43 100644
--- a/erts/emulator/beam/erl_bits.c
+++ b/erts/emulator/beam/erl_bits.c
@@ -177,7 +177,6 @@ erts_bs_get_integer_2(Process *p, Uint num_bits, unsigned flags, ErlBinMatchBuff
byte* LSB;
byte* MSB;
Uint* hp;
- Uint* hp_end;
Uint words_needed;
Uint actual;
Uint v32;
@@ -405,7 +404,6 @@ erts_bs_get_integer_2(Process *p, Uint num_bits, unsigned flags, ErlBinMatchBuff
default:
words_needed = 1+WSIZE(bytes);
hp = HeapOnlyAlloc(p, words_needed);
- hp_end = hp + words_needed;
res = bytes_to_big(LSB, bytes, sgn, hp);
if (is_small(res)) {
p->htop = hp;
@@ -425,7 +423,6 @@ Eterm
erts_bs_get_binary_2(Process *p, Uint num_bits, unsigned flags, ErlBinMatchBuffer* mb)
{
ErlSubBin* sb;
- size_t num_bytes; /* Number of bytes in binary. */
if (mb->size - mb->offset < num_bits) { /* Asked for too many bits. */
return THE_NON_VALUE;
@@ -435,7 +432,6 @@ erts_bs_get_binary_2(Process *p, Uint num_bits, unsigned flags, ErlBinMatchBuffe
* From now on, we can't fail.
*/
- num_bytes = NBYTES(num_bits);
sb = (ErlSubBin *) HeapOnlyAlloc(p, ERL_SUB_BIN_SIZE);
sb->thing_word = HEADER_SUB_BIN;
@@ -555,10 +551,11 @@ fmt_int(byte *buf, Uint sz, Eterm val, Uint size, Uint flags)
{
unsigned long offs;
- ASSERT(size != 0);
offs = BIT_OFFSET(size);
if (is_small(val)) {
Sint v = signed_val(val);
+
+ ASSERT(size != 0); /* Tested by caller */
if (flags & BSF_LITTLE) { /* Little endian */
sz--;
COPY_VAL(buf,1,v,sz);
@@ -578,6 +575,9 @@ fmt_int(byte *buf, Uint sz, Eterm val, Uint size, Uint flags)
ErtsDigit* dp = big_v(val);
int n = MIN(sz,ds);
+ if (size == 0) {
+ return 0;
+ }
if (flags & BSF_LITTLE) {
sz -= n; /* pad with this amount */
if (sign) {
@@ -729,15 +729,13 @@ erts_new_bs_put_integer(ERL_BITS_PROTO_3(Eterm arg, Uint num_bits, unsigned flag
Uint b;
byte *iptr;
- if (num_bits == 0) {
- return 1;
- }
-
bit_offset = BIT_OFFSET(bin_offset);
if (is_small(arg)) {
Uint rbits = 8 - bit_offset;
- if (bit_offset + num_bits <= 8) {
+ if (num_bits == 0) {
+ return 1;
+ } else if (bit_offset + num_bits <= 8) {
/*
* All bits are in the same byte.
*/
@@ -1555,7 +1553,6 @@ Uint32
erts_bs_get_unaligned_uint32(ErlBinMatchBuffer* mb)
{
Uint bytes;
- Uint bits;
Uint offs;
byte bigbuf[4];
byte* LSB;
@@ -1565,7 +1562,6 @@ erts_bs_get_unaligned_uint32(ErlBinMatchBuffer* mb)
ASSERT(mb->size - mb->offset >= 32);
bytes = 4;
- bits = 8;
offs = 0;
LSB = bigbuf;
diff --git a/erts/emulator/beam/erl_cpu_topology.c b/erts/emulator/beam/erl_cpu_topology.c
index db95c4a5d4..bcf8bcf270 100644
--- a/erts/emulator/beam/erl_cpu_topology.c
+++ b/erts/emulator/beam/erl_cpu_topology.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2010. All Rights Reserved.
+ * Copyright Ericsson AB 2010-2011. 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
@@ -487,7 +487,7 @@ erts_sched_check_cpu_bind_post_suspend(ErtsSchedulerData *esdp)
/* Make sure we check if we should bind to a cpu or not... */
if (esdp->run_queue->flags & ERTS_RUNQ_FLG_SHARED_RUNQ)
- erts_smp_atomic_set(&esdp->chk_cpu_bind, 1);
+ erts_smp_atomic32_set(&esdp->chk_cpu_bind, 1);
else
esdp->run_queue->flags |= ERTS_RUNQ_FLG_CHK_CPU_BIND;
}
@@ -503,7 +503,7 @@ erts_sched_check_cpu_bind(ErtsSchedulerData *esdp)
erts_cpu_groups_callback_call_t *cgcc;
#ifdef ERTS_SMP
if (erts_common_run_queue)
- erts_smp_atomic_set(&esdp->chk_cpu_bind, 0);
+ erts_smp_atomic32_set(&esdp->chk_cpu_bind, 0);
else {
esdp->run_queue->flags &= ~ERTS_RUNQ_FLG_CHK_CPU_BIND;
}
@@ -630,13 +630,13 @@ write_schedulers_bind_change(erts_cpu_topology_t *cpudata, int size)
int
erts_init_scheduler_bind_type_string(char *how)
{
- if (erts_bind_to_cpu(cpuinfo, -1) == -ENOTSUP)
+ if (sys_strcmp(how, "u") == 0)
+ cpu_bind_order = ERTS_CPU_BIND_NONE;
+ else if (erts_bind_to_cpu(cpuinfo, -1) == -ENOTSUP)
return ERTS_INIT_SCHED_BIND_TYPE_NOT_SUPPORTED;
-
- if (!system_cpudata && !user_cpudata)
+ else if (!system_cpudata && !user_cpudata)
return ERTS_INIT_SCHED_BIND_TYPE_ERROR_NO_CPU_TOPOLOGY;
-
- if (sys_strcmp(how, "db") == 0)
+ else if (sys_strcmp(how, "db") == 0)
cpu_bind_order = ERTS_CPU_BIND_DEFAULT_BIND;
else if (sys_strcmp(how, "s") == 0)
cpu_bind_order = ERTS_CPU_BIND_SPREAD;
@@ -652,11 +652,8 @@ erts_init_scheduler_bind_type_string(char *how)
cpu_bind_order = ERTS_CPU_BIND_NO_NODE_THREAD_SPREAD;
else if (sys_strcmp(how, "ns") == 0)
cpu_bind_order = ERTS_CPU_BIND_NO_SPREAD;
- else if (sys_strcmp(how, "u") == 0)
- cpu_bind_order = ERTS_CPU_BIND_NONE;
else
return ERTS_INIT_SCHED_BIND_TYPE_ERROR_NO_BAD_TYPE;
-
return ERTS_INIT_SCHED_BIND_TYPE_SUCCESS;
}
@@ -724,6 +721,11 @@ erts_bind_schedulers(Process *c_p, Eterm how)
erts_smp_rwmtx_rwlock(&cpuinfo_rwmtx);
if (erts_bind_to_cpu(cpuinfo, -1) == -ENOTSUP) {
+ if (cpu_bind_order == ERTS_CPU_BIND_NONE
+ && ERTS_IS_ATOM_STR("unbound", how)) {
+ res = bound_schedulers_term(ERTS_CPU_BIND_NONE);
+ goto done;
+ }
ERTS_BIF_PREP_ERROR(res, c_p, EXC_NOTSUP);
}
else {
diff --git a/erts/emulator/beam/erl_db.c b/erts/emulator/beam/erl_db.c
index 8577354d27..e0a6aa05c6 100644
--- a/erts/emulator/beam/erl_db.c
+++ b/erts/emulator/beam/erl_db.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -219,47 +219,68 @@ Export ets_select_continue_exp;
* Static traps
*/
static Export ets_delete_continue_exp;
-
-static ERTS_INLINE DbTable* db_ref(DbTable* tb, db_lock_kind_t kind)
-{
- if (tb != NULL && kind != LCK_READ) {
- erts_refc_inc(&tb->common.ref, 2);
- }
- return tb;
-}
-
-static ERTS_INLINE DbTable* db_unref(DbTable* tb, db_lock_kind_t kind)
+
+static void
+free_dbtable(DbTable* tb)
{
- if (kind != LCK_READ && !erts_refc_dectest(&tb->common.ref, 0)) {
#ifdef HARDDEBUG
if (erts_smp_atomic_read(&tb->common.memory_size) != sizeof(DbTable)) {
- erts_fprintf(stderr, "ets: db_unref memory remain=%ld fix=%x\n",
- erts_smp_atomic_read(&tb->common.memory_size)-sizeof(DbTable),
+ erts_fprintf(stderr, "ets: free_dbtable memory remain=%ld fix=%x\n",
+ erts_smp_atomic_read(&tb->common.memory_size)-sizeof(DbTable),
tb->common.fixations);
}
- erts_fprintf(stderr, "ets: db_unref(%T) deleted!!!\r\n",
+ erts_fprintf(stderr, "ets: free_dbtable(%T) deleted!!!\r\n",
tb->common.id);
- erts_fprintf(stderr, "ets: db_unref: meta_pid_to_tab common.memory_size = %ld\n",
+ erts_fprintf(stderr, "ets: free_dbtable: meta_pid_to_tab common.memory_size = %ld\n",
erts_smp_atomic_read(&meta_pid_to_tab->common.memory_size));
print_table(ERTS_PRINT_STDOUT, NULL, 1, meta_pid_to_tab);
- erts_fprintf(stderr, "ets: db_unref: meta_pid_to_fixed_tab common.memory_size = %ld\n",
+ erts_fprintf(stderr, "ets: free_dbtable: meta_pid_to_fixed_tab common.memory_size = %ld\n",
erts_smp_atomic_read(&meta_pid_to_fixed_tab->common.memory_size));
print_table(ERTS_PRINT_STDOUT, NULL, 1, meta_pid_to_fixed_tab);
-
#endif
#ifdef ERTS_SMP
erts_smp_rwmtx_destroy(&tb->common.rwlock);
erts_smp_mtx_destroy(&tb->common.fixlock);
#endif
ASSERT(is_immed(tb->common.heir_data));
- erts_db_free(ERTS_ALC_T_DB_TABLE, tb, (void *) tb, sizeof(DbTable));
+ erts_db_free(ERTS_ALC_T_DB_TABLE, tb, (void *) tb, sizeof(DbTable));
ERTS_ETS_MISC_MEM_ADD(-sizeof(DbTable));
- return NULL;
- }
- return tb;
+}
+
+#ifdef ERTS_SMP
+static void
+chk_free_dbtable(void *vtb)
+{
+ DbTable * tb = (DbTable *) vtb;
+ ERTS_THR_MEMORY_BARRIER;
+ if (erts_refc_dectest(&tb->common.ref, 0) == 0)
+ free_dbtable(tb);
+}
+#endif
+
+static void schedule_free_dbtable(DbTable* tb)
+{
+ /*
+ * NON-SMP case: Caller is *not* allowed to access the *tb
+ * structure after this function has returned!
+ * SMP case: Caller is allowed to access the *tb structure
+ * until the bif has returned (we typically
+ * need to unlock the table lock after this
+ * function has returned).
+ */
+#ifdef ERTS_SMP
+ int scheds = erts_get_max_no_executing_schedulers();
+ ASSERT(scheds >= 1);
+ ASSERT(erts_refc_read(&tb->common.ref, 0) == 0);
+ erts_refc_init(&tb->common.ref, scheds);
+ ERTS_THR_MEMORY_BARRIER;
+ erts_smp_schedule_misc_aux_work(0, scheds, chk_free_dbtable, tb);
+#else
+ free_dbtable(tb);
+#endif
}
static ERTS_INLINE void db_init_lock(DbTable* tb, int use_frequent_read_lock,
@@ -270,8 +291,6 @@ static ERTS_INLINE void db_init_lock(DbTable* tb, int use_frequent_read_lock,
if (use_frequent_read_lock)
rwmtx_opt.type = ERTS_SMP_RWMTX_TYPE_FREQUENT_READ;
#endif
- erts_refc_init(&tb->common.ref, 1);
- erts_refc_init(&tb->common.fixref, 0);
#ifdef ERTS_SMP
erts_smp_rwmtx_init_opt_x(&tb->common.rwlock, &rwmtx_opt,
rwname, tb->common.the_name);
@@ -280,7 +299,7 @@ static ERTS_INLINE void db_init_lock(DbTable* tb, int use_frequent_read_lock,
#endif
}
-static ERTS_INLINE void db_lock_take_over_ref(DbTable* tb, db_lock_kind_t kind)
+static ERTS_INLINE void db_lock(DbTable* tb, db_lock_kind_t kind)
{
#ifdef ERTS_SMP
ASSERT(tb != meta_pid_to_tab && tb != meta_pid_to_fixed_tab);
@@ -308,16 +327,13 @@ static ERTS_INLINE void db_lock_take_over_ref(DbTable* tb, db_lock_kind_t kind)
#endif
}
-static ERTS_INLINE void db_lock(DbTable* tb, db_lock_kind_t kind)
-{
- (void) db_ref(tb, kind);
-#ifdef ERTS_SMP
- db_lock_take_over_ref(tb, kind);
-#endif
-}
-
static ERTS_INLINE void db_unlock(DbTable* tb, db_lock_kind_t kind)
{
+ /*
+ * In NON-SMP case tb may refer to an already deallocated
+ * DbTable structure. That is, ONLY the SMP case is allowed
+ * to follow the tb pointer!
+ */
#ifdef ERTS_SMP
ASSERT(tb != meta_pid_to_tab && tb != meta_pid_to_fixed_tab);
@@ -344,7 +360,6 @@ static ERTS_INLINE void db_unlock(DbTable* tb, db_lock_kind_t kind)
}
}
#endif
- (void) db_unref(tb, kind); /* May delete table... */
}
@@ -371,6 +386,13 @@ DbTable* db_get_table_aux(Process *p,
DbTable *tb = NULL;
erts_smp_rwmtx_t *mtl = NULL;
+ /*
+ * IMPORTANT: Only scheduler threads are allowed
+ * to access tables. Memory management
+ * depend on it.
+ */
+ ASSERT(erts_get_scheduler_data());
+
if (is_small(id)) {
Uint slot = unsigned_val(id) & meta_main_tab_slot_mask;
if (!meta_already_locked) {
@@ -384,12 +406,8 @@ DbTable* db_get_table_aux(Process *p,
|| erts_lc_rwmtx_is_rwlocked(test_mtl));
}
#endif
- if (slot < db_max_tabs && IS_SLOT_ALIVE(slot)) {
- /* SMP: inc to prevent race, between unlock of meta_main_tab_lock
- * and the table locking outside the meta_main_tab_lock
- */
- tb = db_ref(meta_main_tab[slot].u.tb, kind);
- }
+ if (slot < db_max_tabs && IS_SLOT_ALIVE(slot))
+ tb = meta_main_tab[slot].u.tb;
}
else if (is_atom(id)) {
struct meta_name_tab_entry* bucket = meta_name_tab_bucket(id,&mtl);
@@ -403,16 +421,15 @@ DbTable* db_get_table_aux(Process *p,
if (bucket->pu.tb != NULL) {
if (is_atom(bucket->u.name_atom)) { /* single */
- if (bucket->u.name_atom == id) {
- tb = db_ref(bucket->pu.tb, kind);
- }
+ if (bucket->u.name_atom == id)
+ tb = bucket->pu.tb;
}
else { /* multi */
Uint cnt = unsigned_val(bucket->u.mcnt);
Uint i;
for (i=0; i<cnt; i++) {
if (bucket->pu.mvec[i].u.name_atom == id) {
- tb = db_ref(bucket->pu.mvec[i].pu.tb, kind);
+ tb = bucket->pu.mvec[i].pu.tb;
break;
}
}
@@ -420,7 +437,7 @@ DbTable* db_get_table_aux(Process *p,
}
}
if (tb) {
- db_lock_take_over_ref(tb, kind);
+ db_lock(tb, kind);
if (tb->common.id != id
|| ((tb->common.status & what) == 0 && p->id != tb->common.owner)) {
db_unlock(tb, kind);
@@ -594,11 +611,11 @@ done:
*/
static ERTS_INLINE void local_fix_table(DbTable* tb)
{
- erts_refc_inc(&tb->common.fixref, 1);
+ erts_refc_inc(&tb->common.ref, 1);
}
static ERTS_INLINE void local_unfix_table(DbTable* tb)
{
- if (erts_refc_dectest(&tb->common.fixref, 0) == 0) {
+ if (erts_refc_dectest(&tb->common.ref, 0) == 0) {
ASSERT(IS_HASH_TABLE(tb->common.status));
db_unfix_table_hash(&(tb->hash));
}
@@ -893,7 +910,8 @@ BIF_RETTYPE ets_update_counter_3(BIF_ALIST_3)
Eterm upop;
Eterm* tpl;
Sint position;
- Eterm incr, warp, oldcnt;
+ Eterm incr, warp;
+ Wterm oldcnt;
if (is_not_list(iter)) {
goto finalize;
@@ -968,7 +986,7 @@ BIF_RETTYPE ets_update_counter_3(BIF_ALIST_3)
Eterm* tpl = tuple_val(CAR(list_val(iter)));
Sint position = signed_val(tpl[1]);
Eterm incr = tpl[2];
- Eterm oldcnt = handle.dbterm->tpl[position];
+ Wterm oldcnt = db_do_read_element(&handle,position);
Eterm newcnt = db_add_counter(&htop, oldcnt, incr);
if (newcnt == NIL) {
@@ -981,9 +999,9 @@ BIF_RETTYPE ets_update_counter_3(BIF_ALIST_3)
if (arityval(*tpl) == 4) { /* Maybe warp it */
Eterm threshold = tpl[3];
- if ((cmp(incr,make_small(0)) < 0) ? /* negative increment? */
- (cmp(newcnt,threshold) < 0) : /* if negative, check if below */
- (cmp(newcnt,threshold) > 0)) { /* else check if above threshold */
+ if ((CMP(incr,make_small(0)) < 0) ? /* negative increment? */
+ (CMP(newcnt,threshold) < 0) : /* if negative, check if below */
+ (CMP(newcnt,threshold) > 0)) { /* else check if above threshold */
newcnt = tpl[4];
}
@@ -1414,6 +1432,7 @@ BIF_RETTYPE ets_new_2(BIF_ALIST_2)
tb->common.type = status & ERTS_ETS_TABLE_TYPES;
/* Note, 'type' is *read only* from now on... */
#endif
+ erts_refc_init(&tb->common.ref, 0);
db_init_lock(tb, status & (DB_FINE_LOCKED|DB_FREQ_READ),
"db_tab", "db_tab_fix");
tb->common.keypos = keypos;
@@ -1436,8 +1455,7 @@ BIF_RETTYPE ets_new_2(BIF_ALIST_2)
"** Too many db tables **\n");
free_heir_data(tb);
tb->common.meth->db_free_table(tb);
- erts_db_free(ERTS_ALC_T_DB_TABLE, tb, (void *) tb, sizeof(DbTable));
- ERTS_ETS_MISC_MEM_ADD(-sizeof(DbTable));
+ free_dbtable(tb);
BIF_ERROR(BIF_P, SYSTEM_LIMIT);
}
@@ -1471,9 +1489,10 @@ BIF_RETTYPE ets_new_2(BIF_ALIST_2)
free_slot(slot);
erts_smp_rwmtx_rwunlock(mmtl);
- db_lock_take_over_ref(tb,LCK_WRITE);
+ db_lock(tb,LCK_WRITE);
free_heir_data(tb);
tb->common.meth->db_free_table(tb);
+ schedule_free_dbtable(tb);
db_unlock(tb,LCK_WRITE);
BIF_ERROR(BIF_P, BADARG);
}
@@ -2694,7 +2713,6 @@ BIF_RETTYPE ets_match_spec_run_r_3(BIF_ALIST_3)
Binary *mp;
Eterm res;
Uint32 dummy;
- Uint sz;
if (!(is_list(BIF_ARG_1) || BIF_ARG_1 == NIL) || !is_binary(BIF_ARG_2)) {
error:
@@ -2719,11 +2737,10 @@ BIF_RETTYPE ets_match_spec_run_r_3(BIF_ALIST_3)
BIF_TRAP3(bif_export[BIF_ets_match_spec_run_r_3],
BIF_P,lst,BIF_ARG_2,ret);
}
- res = db_prog_match(BIF_P, mp, CAR(list_val(lst)), NULL, 0, &dummy);
+ res = db_prog_match(BIF_P, mp, CAR(list_val(lst)), NULL, NULL, 0,
+ ERTS_PAM_COPY_RESULT, &dummy);
if (is_value(res)) {
- sz = size_object(res);
- hp = HAlloc(BIF_P, sz + 2);
- res = copy_struct(res, sz, &hp, &MSO(BIF_P));
+ hp = HAlloc(BIF_P, 2);
ret = CONS(hp,res,ret);
/*hp += 2;*/
}
@@ -2756,17 +2773,10 @@ void init_db(void)
rwmtx_opt.type = ERTS_SMP_RWMTX_TYPE_FREQUENT_READ;
rwmtx_opt.lived = ERTS_SMP_RWMTX_LONG_LIVED;
- meta_main_tab_locks = erts_alloc(ERTS_ALC_T_DB_TABLES,
- (sizeof(erts_meta_main_tab_lock_t)
- * (ERTS_META_MAIN_TAB_LOCK_TAB_SIZE+1)));
-
- if ((((UWord) meta_main_tab_locks) & ERTS_CACHE_LINE_MASK) != 0)
- meta_main_tab_locks = ((erts_meta_main_tab_lock_t *)
- ((((UWord) meta_main_tab_locks)
- & ~ERTS_CACHE_LINE_MASK)
- + ERTS_CACHE_LINE_SIZE));
-
- ASSERT((((UWord) meta_main_tab_locks) & ERTS_CACHE_LINE_MASK) == 0);
+ meta_main_tab_locks =
+ erts_alloc_permanent_cache_aligned(ERTS_ALC_T_DB_TABLES,
+ sizeof(erts_meta_main_tab_lock_t)
+ * ERTS_META_MAIN_TAB_LOCK_TAB_SIZE);
for (i = 0; i < ERTS_META_MAIN_TAB_LOCK_TAB_SIZE; i++) {
erts_smp_rwmtx_init_opt_x(&meta_main_tab_locks[i].rwmtx, &rwmtx_opt,
@@ -2845,8 +2855,7 @@ void init_db(void)
meta_pid_to_tab->common.meth = &db_hash;
meta_pid_to_tab->common.compress = 0;
- erts_refc_init(&meta_pid_to_tab->common.ref, 1);
- erts_refc_init(&meta_pid_to_tab->common.fixref, 0);
+ erts_refc_init(&meta_pid_to_tab->common.ref, 0);
/* Neither rwlock or fixlock used
db_init_lock(meta_pid_to_tab, "meta_pid_to_tab", "meta_pid_to_tab_FIX");*/
@@ -2878,8 +2887,7 @@ void init_db(void)
meta_pid_to_fixed_tab->common.meth = &db_hash;
meta_pid_to_fixed_tab->common.compress = 0;
- erts_refc_init(&meta_pid_to_fixed_tab->common.ref, 1);
- erts_refc_init(&meta_pid_to_fixed_tab->common.fixref, 0);
+ erts_refc_init(&meta_pid_to_fixed_tab->common.ref, 0);
/* Neither rwlock or fixlock used
db_init_lock(meta_pid_to_fixed_tab, "meta_pid_to_fixed_tab", "meta_pid_to_fixed_tab_FIX");*/
@@ -3037,12 +3045,10 @@ retry:
to_pid, to_locks,
ERTS_P2P_FLG_TRY_LOCK);
if (to_proc == ERTS_PROC_LOCK_BUSY) {
- db_ref(tb, LCK_NONE); /* while unlocked */
db_unlock(tb,LCK_WRITE);
to_proc = erts_pid2proc(p, ERTS_PROC_LOCK_MAIN,
to_pid, to_locks);
db_lock(tb,LCK_WRITE);
- tb = db_unref(tb, LCK_NONE);
ASSERT(tb != NULL);
if (tb->common.owner != p->id) {
@@ -3153,13 +3159,13 @@ erts_db_process_exiting(Process *c_p, ErtsProcLocks c_p_locks)
erts_smp_rwmtx_t *mmtl = get_meta_main_tab_lock(ix);
erts_smp_rwmtx_rlock(mmtl);
if (!IS_SLOT_FREE(ix)) {
- tb = db_ref(GET_ANY_SLOT_TAB(ix), LCK_WRITE);
+ tb = GET_ANY_SLOT_TAB(ix);
ASSERT(tb);
}
erts_smp_rwmtx_runlock(mmtl);
if (tb) {
int do_yield;
- db_lock_take_over_ref(tb, LCK_WRITE);
+ db_lock(tb, LCK_WRITE);
/* Ownership may have changed since
we looked up the table. */
if (tb->common.owner != pid) {
@@ -3241,7 +3247,7 @@ erts_db_process_exiting(Process *c_p, ErtsProcLocks c_p_locks)
erts_smp_rwmtx_t *mmtl = get_meta_main_tab_lock(ix);
erts_smp_rwmtx_rlock(mmtl);
if (IS_SLOT_ALIVE(ix)) {
- tb = db_ref(meta_main_tab[ix].u.tb, LCK_WRITE_REC);
+ tb = meta_main_tab[ix].u.tb;
ASSERT(tb);
}
erts_smp_rwmtx_runlock(mmtl);
@@ -3249,7 +3255,7 @@ erts_db_process_exiting(Process *c_p, ErtsProcLocks c_p_locks)
int reds;
DbFixation** pp;
- db_lock_take_over_ref(tb, LCK_WRITE_REC);
+ db_lock(tb, LCK_WRITE_REC);
#ifdef ERTS_SMP
erts_smp_mtx_lock(&tb->common.fixlock);
#endif
@@ -3259,8 +3265,8 @@ erts_db_process_exiting(Process *c_p, ErtsProcLocks c_p_locks)
pp = &(*pp)->next) {
if ((*pp)->pid == pid) {
DbFixation* fix = *pp;
- long diff = -(long)fix->counter;
- erts_refc_add(&tb->common.fixref,diff,0);
+ erts_aint_t diff = -((erts_aint_t) fix->counter);
+ erts_refc_add(&tb->common.ref,diff,0);
*pp = fix->next;
erts_db_free(ERTS_ALC_T_DB_FIXATION,
tb, fix, sizeof(DbFixation));
@@ -3335,7 +3341,7 @@ static void fix_table_locked(Process* p, DbTable* tb)
#ifdef ERTS_SMP
erts_smp_mtx_lock(&tb->common.fixlock);
#endif
- erts_refc_inc(&tb->common.fixref,1);
+ erts_refc_inc(&tb->common.ref,1);
fix = tb->common.fixations;
if (fix == NULL) {
get_now(&(tb->common.megasec),
@@ -3389,7 +3395,7 @@ static void unfix_table_locked(Process* p, DbTable* tb,
for (pp = &tb->common.fixations; *pp != NULL; pp = &(*pp)->next) {
if ((*pp)->pid == p->id) {
DbFixation* fix = *pp;
- erts_refc_dec(&tb->common.fixref,0);
+ erts_refc_dec(&tb->common.ref,0);
--(fix->counter);
ASSERT(fix->counter >= 0);
if (fix->counter > 0) {
@@ -3415,11 +3421,10 @@ static void unfix_table_locked(Process* p, DbTable* tb,
unlocked:
if (!IS_FIXED(tb) && IS_HASH_TABLE(tb->common.status)
- && erts_smp_atomic_read(&tb->hash.fixdel) != (long)NULL) {
+ && erts_smp_atomic_read(&tb->hash.fixdel) != (erts_aint_t)NULL) {
#ifdef ERTS_SMP
if (*kind_p == LCK_READ && tb->common.is_thread_safe) {
/* Must have write lock while purging pseudo-deleted (OTP-8166) */
- db_ref(tb, LCK_WRITE); /* LCK_WRITE need it, but not LCK_READ */
erts_smp_rwmtx_runlock(&tb->common.rwlock);
erts_smp_rwmtx_rwlock(&tb->common.rwlock);
*kind_p = LCK_WRITE;
@@ -3438,6 +3443,8 @@ static void free_fixations_locked(DbTable *tb)
fix = tb->common.fixations;
while (fix != NULL) {
+ erts_aint_t diff = -((erts_aint_t) fix->counter);
+ erts_refc_add(&tb->common.ref,diff,0);
next_fix = fix->next;
db_meta_lock(meta_pid_to_fixed_tab, LCK_WRITE_REC);
db_erase_bag_exact2(meta_pid_to_fixed_tab,
@@ -3475,11 +3482,24 @@ static void set_heir(Process* me, DbTable* tb, Eterm heir, UWord heir_data)
if (!is_immed(heir_data)) {
DeclareTmpHeap(tmp,2,me);
+ Eterm wrap_tpl;
+ int size;
+ DbTerm* dbterm;
+ Eterm* top;
+ ErlOffHeap tmp_offheap;
UseTmpHeap(2,me);
- /* Make a dummy 1-tuple around data to use db_get_term() */
- heir_data = (UWord) db_store_term(&tb->common, NULL, 0,
- TUPLE1(tmp,heir_data));
+ /* Make a dummy 1-tuple around data to use DbTerm */
+ wrap_tpl = TUPLE1(tmp,heir_data);
+ size = size_object(wrap_tpl);
+ dbterm = erts_db_alloc(ERTS_ALC_T_DB_HEIR_DATA, (DbTable *)tb,
+ (sizeof(DbTerm) + sizeof(Eterm)*(size-1)));
+ dbterm->size = size;
+ top = dbterm->tpl;
+ tmp_offheap.first = NULL;
+ copy_struct(wrap_tpl, size, &top, &tmp_offheap);
+ dbterm->first_oh = tmp_offheap.first;
+ heir_data = (UWord)dbterm;
UnUseTmpHeap(2,me);
ASSERT(!is_immed(heir_data));
}
@@ -3491,7 +3511,7 @@ static void free_heir_data(DbTable* tb)
if (tb->common.heir != am_none && !is_immed(tb->common.heir_data)) {
DbTerm* p = (DbTerm*) tb->common.heir_data;
db_cleanup_offheap_comp(p);
- erts_db_free(ERTS_ALC_T_DB_TERM, tb, (void *)p,
+ erts_db_free(ERTS_ALC_T_DB_HEIR_DATA, tb, (void *)p,
sizeof(DbTerm) + (p->size-1)*sizeof(Eterm));
}
#ifdef DEBUG
@@ -3561,10 +3581,6 @@ static int free_table_cont(Process *p,
mmtl = get_meta_main_tab_lock(tb->common.slot);
#ifdef ERTS_SMP
if (erts_smp_rwmtx_tryrwlock(mmtl) == EBUSY) {
- /*
- * We keep our increased refc over this op in order to
- * prevent the table from disapearing.
- */
erts_smp_rwmtx_rwunlock(&tb->common.rwlock);
erts_smp_rwmtx_rwlock(mmtl);
erts_smp_rwmtx_rwlock(&tb->common.rwlock);
@@ -3579,7 +3595,7 @@ static int free_table_cont(Process *p,
make_small(tb->common.slot));
db_meta_unlock(meta_pid_to_tab, LCK_WRITE_REC);
}
- db_unref(tb, LCK_NONE);
+ schedule_free_dbtable(tb);
BUMP_REDS(p, 100);
return 0;
}
@@ -3721,7 +3737,7 @@ static void print_table(int to, void *to_arg, int show, DbTable* tb)
erts_print(to, to_arg, "Objects: %d\n", (int)erts_smp_atomic_read(&tb->common.nitems));
erts_print(to, to_arg, "Words: %bpu\n",
- (Uint) ((erts_smp_atomic_read(&tb->common.memory_size)
+ (UWord) ((erts_smp_atomic_read(&tb->common.memory_size)
+ sizeof(Uint)
- 1)
/ sizeof(Uint)));
diff --git a/erts/emulator/beam/erl_db.h b/erts/emulator/beam/erl_db.h
index cb2da603f0..e0bdebcb01 100644
--- a/erts/emulator/beam/erl_db.h
+++ b/erts/emulator/beam/erl_db.h
@@ -83,7 +83,8 @@ Eterm erts_ets_colliding_names(Process*, Eterm name, Uint cnt);
#define ERTS_DB_ALC_MEM_UPDATE_(TAB, FREE_SZ, ALLOC_SZ) \
do { \
- long sz__ = ((long) (ALLOC_SZ)) - ((long) (FREE_SZ)); \
+ erts_aint_t sz__ = (((erts_aint_t) (ALLOC_SZ)) \
+ - ((erts_aint_t) (FREE_SZ))); \
ASSERT((TAB)); \
erts_smp_atomic_add(&(TAB)->common.memory_size, sz__); \
} while (0)
diff --git a/erts/emulator/beam/erl_db_hash.c b/erts/emulator/beam/erl_db_hash.c
index 14ee63100a..9ef990cc4f 100644
--- a/erts/emulator/beam/erl_db_hash.c
+++ b/erts/emulator/beam/erl_db_hash.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2011. 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
@@ -135,8 +135,8 @@ static ERTS_INLINE Uint hash_to_ix(DbTableHash* tb, HashValue hval)
*/
static ERTS_INLINE void add_fixed_deletion(DbTableHash* tb, int ix)
{
- long was_next;
- long exp_next;
+ erts_aint_t was_next;
+ erts_aint_t exp_next;
FixedDeletion* fixd = (FixedDeletion*) erts_db_alloc(ERTS_ALC_T_DB_FIX_DEL,
(DbTable *) tb,
sizeof(FixedDeletion));
@@ -146,7 +146,9 @@ static ERTS_INLINE void add_fixed_deletion(DbTableHash* tb, int ix)
do { /* Lockless atomic insertion in linked list: */
exp_next = was_next;
fixd->next = (FixedDeletion*) exp_next;
- was_next = erts_smp_atomic_cmpxchg(&tb->fixdel, (long)fixd, exp_next);
+ was_next = erts_smp_atomic_cmpxchg(&tb->fixdel,
+ (erts_aint_t) fixd,
+ exp_next);
}while (was_next != exp_next);
}
@@ -256,12 +258,6 @@ static ERTS_INLINE Sint next_slot_w(DbTableHash* tb, Uint ix,
}
-/*
- * tplp is an untagged pointer to a tuple we know is large enough
- * and dth is a pointer to a DbTableHash.
- */
-#define GETKEY(dth, tplp) (*((tplp) + (dth)->common.keypos))
-
/*
* Some special binary flags
*/
@@ -432,6 +428,9 @@ static ERTS_INLINE void try_shrink(DbTableHash* tb)
}
}
+#define EQ_REL(x,y,y_base) \
+ (is_same(x,NULL,y,y_base) || (is_not_both_immed((x),(y)) && eq_rel((x),NULL,(y),y_base)))
+
/* Is this a live object (not pseodo-deleted) with the specified key?
*/
static ERTS_INLINE int has_live_key(DbTableHash* tb, HashDbTerm* b,
@@ -441,7 +440,7 @@ static ERTS_INLINE int has_live_key(DbTableHash* tb, HashDbTerm* b,
else {
Eterm itemKey = GETKEY(tb, b->dbterm.tpl);
ASSERT(!is_header(itemKey));
- return EQ(key,itemKey);
+ return EQ_REL(key, itemKey, b->dbterm.tpl);
}
}
@@ -454,7 +453,7 @@ static ERTS_INLINE int has_key(DbTableHash* tb, HashDbTerm* b,
else {
Eterm itemKey = GETKEY(tb, b->dbterm.tpl);
ASSERT(!is_header(itemKey));
- return EQ(key,itemKey);
+ return EQ_REL(key, itemKey, b->dbterm.tpl);
}
}
@@ -541,12 +540,12 @@ static void restore_fixdel(DbTableHash* tb, FixedDeletion* fixdel)
{
/*int tries = 0;*/
DEBUG_WAIT();
- if (erts_smp_atomic_cmpxchg(&tb->fixdel, (long)fixdel,
- (long)NULL) != (long)NULL) {
+ if (erts_smp_atomic_cmpxchg(&tb->fixdel, (erts_aint_t)fixdel,
+ (erts_aint_t)NULL) != (erts_aint_t)NULL) {
/* Oboy, must join lists */
FixedDeletion* last = fixdel;
- long was_tail;
- long exp_tail;
+ erts_aint_t was_tail;
+ erts_aint_t exp_tail;
while (last->next != NULL) last = last->next;
was_tail = erts_smp_atomic_read(&tb->fixdel);
@@ -555,7 +554,7 @@ static void restore_fixdel(DbTableHash* tb, FixedDeletion* fixdel)
last->next = (FixedDeletion*) exp_tail;
/*++tries;*/
DEBUG_WAIT();
- was_tail = erts_smp_atomic_cmpxchg(&tb->fixdel, (long)fixdel,
+ was_tail = erts_smp_atomic_cmpxchg(&tb->fixdel, (erts_aint_t)fixdel,
exp_tail);
}while (was_tail != exp_tail);
}
@@ -573,7 +572,7 @@ void db_unfix_table_hash(DbTableHash *tb)
|| (erts_smp_lc_rwmtx_is_rlocked(&tb->common.rwlock)
&& !tb->common.is_thread_safe));
restart:
- fixdel = (FixedDeletion*) erts_smp_atomic_xchg(&tb->fixdel, (long)NULL);
+ fixdel = (FixedDeletion*) erts_smp_atomic_xchg(&tb->fixdel, (erts_aint_t)NULL);
while (fixdel != NULL) {
FixedDeletion *fx = fixdel;
int ix = fx->slot;
@@ -642,8 +641,8 @@ int db_create_hash(Process *p, DbTable *tbl)
erts_smp_atomic_init(&tb->szm, SEGSZ_MASK);
erts_smp_atomic_init(&tb->nactive, SEGSZ);
- erts_smp_atomic_init(&tb->fixdel, (long)NULL);
- erts_smp_atomic_init(&tb->segtab, (long) alloc_ext_seg(tb,0,NULL)->segtab);
+ erts_smp_atomic_init(&tb->fixdel, (erts_aint_t)NULL);
+ erts_smp_atomic_init(&tb->segtab, (erts_aint_t) alloc_ext_seg(tb,0,NULL)->segtab);
tb->nsegs = NSEG_1;
tb->nslots = SEGSZ;
@@ -694,9 +693,7 @@ static int db_first_hash(Process *p, DbTable *tbl, Eterm *ret)
}
}
if (list != NULL) {
- Eterm key = GETKEY(tb, list->dbterm.tpl);
-
- COPY_OBJECT(key, p, ret);
+ *ret = db_copy_key(p, tbl, &list->dbterm);
RUNLOCK_HASH(lck);
}
else {
@@ -744,7 +741,7 @@ static int db_next_hash(Process *p, DbTable *tbl, Eterm key, Eterm *ret)
*ret = am_EOT;
}
else {
- COPY_OBJECT(GETKEY(tb, b->dbterm.tpl), p, ret);
+ *ret = db_copy_key(p, tbl, &b->dbterm);
RUNLOCK_HASH(lck);
}
return DB_ERROR_NONE;
@@ -1306,8 +1303,8 @@ static int db_select_continue_hash(Process *p,
}
for(;;) {
if (current->hvalue != INVALID_HASH &&
- (match_res = db_prog_match_and_copy(&tb->common, p, mp, all_objects,
- &current->dbterm, &hp, 2),
+ (match_res = db_match_dbterm(&tb->common, p, mp, all_objects,
+ &current->dbterm, &hp, 2),
is_value(match_res))) {
match_list = CONS(hp, match_res, match_list);
@@ -1471,8 +1468,8 @@ static int db_select_chunk_hash(Process *p, DbTable *tbl,
for(;;) {
if (current != NULL) {
if (current->hvalue != INVALID_HASH) {
- match_res = db_prog_match_and_copy(&tb->common, p, mpi.mp, 0,
- &current->dbterm, &hp, 2);
+ match_res = db_match_dbterm(&tb->common, p, mpi.mp, 0,
+ &current->dbterm, &hp, 2);
if (is_value(match_res)) {
match_list = CONS(hp, match_res, match_list);
++got;
@@ -1637,8 +1634,8 @@ static int db_select_count_hash(Process *p,
for(;;) {
if (current != NULL) {
if (current->hvalue != INVALID_HASH) {
- if (db_prog_match_and_copy(&tb->common, p, mpi.mp, 0,
- &current->dbterm, NULL,0) == am_true) {
+ if (db_match_dbterm(&tb->common, p, mpi.mp, 0,
+ &current->dbterm, NULL,0) == am_true) {
++got;
}
--num_left;
@@ -1715,9 +1712,9 @@ static int db_select_delete_hash(Process *p,
Eterm mpb;
Eterm egot;
#ifdef ERTS_SMP
- int fixated_by_me = tb->common.is_thread_safe ? 0 : 1; /* ToDo: something nicer */
+ erts_aint_t fixated_by_me = tb->common.is_thread_safe ? 0 : 1; /* ToDo: something nicer */
#else
- int fixated_by_me = 0;
+ erts_aint_t fixated_by_me = 0;
#endif
erts_smp_rwmtx_t* lck;
@@ -1786,8 +1783,8 @@ static int db_select_delete_hash(Process *p,
}
else {
int did_erase = 0;
- if (db_prog_match_and_copy(&tb->common, p, mpi.mp, 0,
- &(*current)->dbterm, NULL, 0) == am_true) {
+ if (db_match_dbterm(&tb->common, p, mpi.mp, 0,
+ &(*current)->dbterm, NULL, 0) == am_true) {
if (NFIXED(tb) > fixated_by_me) { /* fixated by others? */
if (slot_ix != last_pseudo_delete) {
add_fixed_deletion(tb, slot_ix);
@@ -1897,8 +1894,8 @@ static int db_select_delete_continue_hash(Process *p,
}
else {
int did_erase = 0;
- if (db_prog_match_and_copy(&tb->common, p, mp, 0,
- &(*current)->dbterm, NULL, 0) == am_true) {
+ if (db_match_dbterm(&tb->common, p, mp, 0,
+ &(*current)->dbterm, NULL, 0) == am_true) {
if (NFIXED(tb) > fixated_by_me) { /* fixated by others? */
if (slot_ix != last_pseudo_delete) {
add_fixed_deletion(tb, slot_ix);
@@ -1997,8 +1994,8 @@ static int db_select_count_continue_hash(Process *p,
current = current->next;
continue;
}
- if (db_prog_match_and_copy(&tb->common, p, mp, 0, &current->dbterm,
- NULL, 0) == am_true) {
+ if (db_match_dbterm(&tb->common, p, mp, 0, &current->dbterm,
+ NULL, 0) == am_true) {
++got;
}
--num_left;
@@ -2124,11 +2121,11 @@ static int db_free_table_continue_hash(DbTable *tbl)
sizeof(FixedDeletion));
ERTS_ETS_MISC_MEM_ADD(-sizeof(FixedDeletion));
if (++done >= 2*DELETE_RECORD_LIMIT) {
- erts_smp_atomic_set(&tb->fixdel, (long)fixdel);
+ erts_smp_atomic_set(&tb->fixdel, (erts_aint_t)fixdel);
return 0; /* Not done */
}
}
- erts_smp_atomic_set(&tb->fixdel, (long)NULL);
+ erts_smp_atomic_set(&tb->fixdel, (erts_aint_t)NULL);
done /= 2;
while(tb->nslots != 0) {
@@ -2177,7 +2174,7 @@ static int analyze_pattern(DbTableHash *tb, Eterm pattern,
HashValue hval = NIL;
int num_heads = 0;
int i;
-
+
mpi->lists = mpi->dlists;
mpi->num_lists = 0;
mpi->key_given = 1;
@@ -2345,7 +2342,7 @@ static int alloc_seg(DbTableHash *tb)
struct ext_segment* eseg;
eseg = (struct ext_segment*) SEGTAB(tb)[seg_ix-1];
MY_ASSERT(eseg!=NULL && eseg->s.is_ext_segment);
- erts_smp_atomic_set(&tb->segtab, (long) eseg->segtab);
+ erts_smp_atomic_set(&tb->segtab, (erts_aint_t) eseg->segtab);
tb->nsegs = eseg->nsegs;
}
ASSERT(seg_ix < tb->nsegs);
@@ -2417,7 +2414,7 @@ static int free_seg(DbTableHash *tb, int free_records)
MY_ASSERT(newtop->s.is_ext_segment);
if (newtop->prev_segtab != NULL) {
/* Time to use a smaller segtab */
- erts_smp_atomic_set(&tb->segtab, (long)newtop->prev_segtab);
+ erts_smp_atomic_set(&tb->segtab, (erts_aint_t)newtop->prev_segtab);
tb->nsegs = seg_ix;
ASSERT(tb->nsegs == EXTSEG(SEGTAB(tb))->nsegs);
}
@@ -2434,7 +2431,7 @@ static int free_seg(DbTableHash *tb, int free_records)
if (seg_ix > 0) {
if (seg_ix < tb->nsegs) SEGTAB(tb)[seg_ix] = NULL;
} else {
- erts_smp_atomic_set(&tb->segtab, (long)NULL);
+ erts_smp_atomic_set(&tb->segtab, (erts_aint_t)NULL);
}
#endif
tb->nslots -= SEGSZ;
@@ -2693,6 +2690,9 @@ static int db_lookup_dbterm_hash(DbTable *tbl, Eterm key, DbUpdateHandle* handle
handle->dbterm = &b->dbterm;
handle->mustResize = 0;
handle->new_size = b->dbterm.size;
+ #if HALFWORD_HEAP
+ handle->abs_vec = NULL;
+ #endif
handle->lck = lck;
/* KEEP hval WLOCKED, db_finalize_dbterm_hash will WUNLOCK */
return 1;
diff --git a/erts/emulator/beam/erl_db_tree.c b/erts/emulator/beam/erl_db_tree.c
index 8108494fc5..a59c0c258d 100644
--- a/erts/emulator/beam/erl_db_tree.c
+++ b/erts/emulator/beam/erl_db_tree.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2011. 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
@@ -48,9 +48,6 @@
#include "erl_db_tree.h"
-
-
-#define GETKEY(dtt, tplp) (*((tplp) + (dtt)->common.keypos))
#define GETKEY_WITH_POS(Keypos, Tplp) (*((Tplp) + Keypos))
#define NITEMS(tb) ((int)erts_smp_atomic_read(&(tb)->common.nitems))
@@ -282,7 +279,7 @@ struct select_delete_context {
/*
** Forward declarations
*/
-static TreeDbTerm *linkout_tree(DbTableTree *tb, Eterm key);
+static TreeDbTerm *linkout_tree(DbTableTree *tb, Eterm key, Eterm* key_base);
static TreeDbTerm *linkout_object_tree(DbTableTree *tb,
Eterm object);
static int do_free_tree_cont(DbTableTree *tb, int num_left);
@@ -293,15 +290,15 @@ static int delsub(TreeDbTerm **this);
static TreeDbTerm *slot_search(Process *p, DbTableTree *tb, Sint slot);
static TreeDbTerm *find_node(DbTableTree *tb, Eterm key);
static TreeDbTerm **find_node2(DbTableTree *tb, Eterm key);
-static TreeDbTerm *find_next(DbTableTree *tb, DbTreeStack*, Eterm key);
-static TreeDbTerm *find_prev(DbTableTree *tb, DbTreeStack*, Eterm key);
+static TreeDbTerm *find_next(DbTableTree *tb, DbTreeStack*, Eterm key, Eterm* kbase);
+static TreeDbTerm *find_prev(DbTableTree *tb, DbTreeStack*, Eterm key, Eterm* kbase);
static TreeDbTerm *find_next_from_pb_key(DbTableTree *tb, DbTreeStack*,
Eterm key);
static TreeDbTerm *find_prev_from_pb_key(DbTableTree *tb, DbTreeStack*,
Eterm key);
static void traverse_backwards(DbTableTree *tb,
DbTreeStack*,
- Eterm lastkey,
+ Eterm lastkey, Eterm* lk_base,
int (*doit)(DbTableTree *tb,
TreeDbTerm *,
void *,
@@ -309,7 +306,7 @@ static void traverse_backwards(DbTableTree *tb,
void *context);
static void traverse_forward(DbTableTree *tb,
DbTreeStack*,
- Eterm lastkey,
+ Eterm lastkey, Eterm* lk_base,
int (*doit)(DbTableTree *tb,
TreeDbTerm *,
void *,
@@ -317,8 +314,8 @@ static void traverse_forward(DbTableTree *tb,
void *context);
static int key_given(DbTableTree *tb, Eterm pattern, TreeDbTerm **ret,
Eterm *partly_bound_key);
-static Sint cmp_partly_bound(Eterm partly_bound_key, Eterm bound_key);
-static Sint do_cmp_partly_bound(Eterm a, Eterm b, int *done);
+static Sint cmp_partly_bound(Eterm partly_bound_key, Eterm bound_key, Eterm* bk_base);
+static Sint do_cmp_partly_bound(Eterm a, Eterm b, Eterm* b_base, int *done);
static int analyze_pattern(DbTableTree *tb, Eterm pattern,
struct mp_info *mpi);
@@ -338,7 +335,6 @@ static int doit_select_delete(DbTableTree *tb,
TreeDbTerm *this,
void *ptr,
int forward);
-static void do_dump_tree(int to, void *to_arg, TreeDbTerm *t);
static int partly_bound_can_match_lesser(Eterm partly_bound_1,
Eterm partly_bound_2);
@@ -492,9 +488,6 @@ static int db_first_tree(Process *p, DbTable *tbl, Eterm *ret)
DbTableTree *tb = &tbl->tree;
DbTreeStack* stack;
TreeDbTerm *this;
- Eterm e;
- Eterm *hp;
- Uint sz;
if (( this = tb->root ) == NULL) {
*ret = am_EOT;
@@ -513,13 +506,7 @@ static int db_first_tree(Process *p, DbTable *tbl, Eterm *ret)
stack->slot = 1;
release_stack(tb,stack);
}
- e = GETKEY(tb, this->dbterm.tpl);
- sz = size_object(e);
-
- hp = HAlloc(p, sz);
-
- *ret = copy_struct(e,sz,&hp,&MSO(p));
-
+ *ret = db_copy_key(p, tbl, &this->dbterm);
return DB_ERROR_NONE;
}
@@ -528,26 +515,17 @@ static int db_next_tree(Process *p, DbTable *tbl, Eterm key, Eterm *ret)
DbTableTree *tb = &tbl->tree;
DbTreeStack* stack;
TreeDbTerm *this;
- Eterm e;
- Eterm *hp;
- Uint sz;
if (is_atom(key) && key == am_EOT)
return DB_ERROR_BADKEY;
stack = get_any_stack(tb);
- this = find_next(tb, stack, key);
+ this = find_next(tb, stack, key, NULL);
release_stack(tb,stack);
if (this == NULL) {
*ret = am_EOT;
return DB_ERROR_NONE;
}
- e = GETKEY(tb, this->dbterm.tpl);
- sz = size_object(e);
-
- hp = HAlloc(p, sz);
-
- *ret = copy_struct(e,sz,&hp,&MSO(p));
-
+ *ret = db_copy_key(p, tbl, &this->dbterm);
return DB_ERROR_NONE;
}
@@ -556,9 +534,6 @@ static int db_last_tree(Process *p, DbTable *tbl, Eterm *ret)
DbTableTree *tb = &tbl->tree;
TreeDbTerm *this;
DbTreeStack* stack;
- Eterm e;
- Eterm *hp;
- Uint sz;
if (( this = tb->root ) == NULL) {
*ret = am_EOT;
@@ -577,13 +552,7 @@ static int db_last_tree(Process *p, DbTable *tbl, Eterm *ret)
stack->slot = NITEMS(tb);
release_stack(tb,stack);
}
- e = GETKEY(tb, this->dbterm.tpl);
- sz = size_object(e);
-
- hp = HAlloc(p, sz);
-
- *ret = copy_struct(e,sz,&hp,&MSO(p));
-
+ *ret = db_copy_key(p, tbl, &this->dbterm);
return DB_ERROR_NONE;
}
@@ -592,27 +561,33 @@ static int db_prev_tree(Process *p, DbTable *tbl, Eterm key, Eterm *ret)
DbTableTree *tb = &tbl->tree;
TreeDbTerm *this;
DbTreeStack* stack;
- Eterm e;
- Eterm *hp;
- Uint sz;
if (is_atom(key) && key == am_EOT)
return DB_ERROR_BADKEY;
stack = get_any_stack(tb);
- this = find_prev(tb, stack, key);
+ this = find_prev(tb, stack, key, NULL);
release_stack(tb,stack);
if (this == NULL) {
*ret = am_EOT;
return DB_ERROR_NONE;
}
- e = GETKEY(tb, this->dbterm.tpl);
- sz = size_object(e);
+ *ret = db_copy_key(p, tbl, &this->dbterm);
+ return DB_ERROR_NONE;
+}
- hp = HAlloc(p, sz);
+static ERTS_INLINE Sint cmp_key(DbTableTree* tb, Eterm key, Eterm* key_base,
+ TreeDbTerm* obj)
+{
+ return cmp_rel(key, key_base,
+ GETKEY(tb,obj->dbterm.tpl), obj->dbterm.tpl);
+}
- *ret = copy_struct(e,sz,&hp,&MSO(p));
-
- return DB_ERROR_NONE;
+static ERTS_INLINE int cmp_key_eq(DbTableTree* tb, Eterm key, Eterm* key_base,
+ TreeDbTerm* obj)
+{
+ Eterm obj_key = GETKEY(tb,obj->dbterm.tpl);
+ return is_same(key, key_base, obj_key, obj->dbterm.tpl)
+ || cmp_rel(key, key_base, obj_key, obj->dbterm.tpl) == 0;
}
static int db_put_tree(DbTable *tbl, Eterm obj, int key_clash_fail)
@@ -646,8 +621,8 @@ static int db_put_tree(DbTable *tbl, Eterm obj, int key_clash_fail)
(*this)->balance = 0;
(*this)->left = (*this)->right = NULL;
break;
- } else if ((c = cmp(key,GETKEY(tb,(*this)->dbterm.tpl))) < 0) {
- /* go left */
+ } else if ((c = cmp_key(tb, key, NULL, *this)) < 0) {
+ /* go lefts */
dstack[dpos++] = DIR_LEFT;
tstack[tpos++] = this;
this = &((*this)->left);
@@ -801,7 +776,7 @@ static int db_erase_tree(DbTable *tbl, Eterm key, Eterm *ret)
*ret = am_true;
- if ((res = linkout_tree(tb, key)) != NULL) {
+ if ((res = linkout_tree(tb, key, NULL)) != NULL) {
free_term(tb, res);
}
return DB_ERROR_NONE;
@@ -993,15 +968,15 @@ static int db_select_continue_tree(Process *p,
stack = get_any_stack(tb);
if (chunk_size) {
if (reverse) {
- traverse_backwards(tb, stack, lastkey, &doit_select_chunk, &sc);
+ traverse_backwards(tb, stack, lastkey, NULL, &doit_select_chunk, &sc);
} else {
- traverse_forward(tb, stack, lastkey, &doit_select_chunk, &sc);
+ traverse_forward(tb, stack, lastkey, NULL, &doit_select_chunk, &sc);
}
} else {
if (reverse) {
- traverse_forward(tb, stack, lastkey, &doit_select, &sc);
+ traverse_forward(tb, stack, lastkey, NULL, &doit_select, &sc);
} else {
- traverse_backwards(tb, stack, lastkey, &doit_select, &sc);
+ traverse_backwards(tb, stack, lastkey, NULL, &doit_select, &sc);
}
}
release_stack(tb,stack);
@@ -1026,10 +1001,9 @@ static int db_select_continue_tree(Process *p,
}
key = GETKEY(tb, sc.lastobj);
-
- sz = size_object(key);
+ sz = size_object_rel(key,sc.lastobj);
hp = HAlloc(p, 9 + sz);
- key = copy_struct(key, sz, &hp, &MSO(p));
+ key = copy_struct_rel(key, sz, &hp, &MSO(p), sc.lastobj, NULL);
continuation = TUPLE8
(hp,
tptr[1],
@@ -1050,8 +1024,8 @@ static int db_select_continue_tree(Process *p,
key = GETKEY(tb, sc.lastobj);
if (chunk_size) {
if (end_condition != NIL &&
- ((!reverse && cmp_partly_bound(end_condition,key) < 0) ||
- (reverse && cmp_partly_bound(end_condition,key) > 0))) {
+ ((!reverse && cmp_partly_bound(end_condition,key,sc.lastobj) < 0) ||
+ (reverse && cmp_partly_bound(end_condition,key,sc.lastobj) > 0))) {
/* done anyway */
if (!sc.got) {
RET_TO_BIF(am_EOT, DB_ERROR_NONE);
@@ -1063,16 +1037,16 @@ static int db_select_continue_tree(Process *p,
}
} else {
if (end_condition != NIL &&
- ((!reverse && cmp_partly_bound(end_condition,key) > 0) ||
- (reverse && cmp_partly_bound(end_condition,key) < 0))) {
+ ((!reverse && cmp_partly_bound(end_condition,key,sc.lastobj) > 0) ||
+ (reverse && cmp_partly_bound(end_condition,key,sc.lastobj) < 0))) {
/* done anyway */
RET_TO_BIF(sc.accum,DB_ERROR_NONE);
}
}
/* Not done yet, let's trap. */
- sz = size_object(key);
+ sz = size_object_rel(key,sc.lastobj);
hp = HAlloc(p, 9 + sz);
- key = copy_struct(key, sz, &hp, &MSO(p));
+ key = copy_struct_rel(key, sz, &hp, &MSO(p), sc.lastobj, NULL);
continuation = TUPLE8
(hp,
tptr[1],
@@ -1099,6 +1073,7 @@ static int db_select_tree(Process *p, DbTable *tbl,
struct select_context sc;
struct mp_info mpi;
Eterm lastkey = THE_NON_VALUE;
+ Eterm* lk_base = NULL;
Eterm key;
Eterm continuation;
unsigned sz;
@@ -1140,7 +1115,7 @@ static int db_select_tree(Process *p, DbTable *tbl,
sc.all_objects = mpi.all_objects;
if (!mpi.got_partial && mpi.some_limitation &&
- cmp(mpi.least,mpi.most) == 0) {
+ CMP(mpi.least,mpi.most) == 0) {
doit_select(tb,mpi.save_term,&sc,0 /* direction doesn't matter */);
RET_TO_BIF(sc.accum,DB_ERROR_NONE);
}
@@ -1150,20 +1125,20 @@ static int db_select_tree(Process *p, DbTable *tbl,
if (mpi.some_limitation) {
if ((this = find_prev_from_pb_key(tb, stack, mpi.least)) != NULL) {
lastkey = GETKEY(tb, this->dbterm.tpl);
+ lk_base = this->dbterm.tpl;
}
sc.end_condition = mpi.most;
}
-
- traverse_forward(tb, stack, lastkey, &doit_select, &sc);
+ traverse_forward(tb, stack, lastkey, lk_base, &doit_select, &sc);
} else {
if (mpi.some_limitation) {
if ((this = find_next_from_pb_key(tb, stack, mpi.most)) != NULL) {
lastkey = GETKEY(tb, this->dbterm.tpl);
+ lk_base = this->dbterm.tpl;
}
sc.end_condition = mpi.least;
}
-
- traverse_backwards(tb, stack, lastkey, &doit_select, &sc);
+ traverse_backwards(tb, stack, lastkey, lk_base, &doit_select, &sc);
}
release_stack(tb,stack);
#ifdef HARDDEBUG
@@ -1176,9 +1151,9 @@ static int db_select_tree(Process *p, DbTable *tbl,
}
key = GETKEY(tb, sc.lastobj);
- sz = size_object(key);
+ sz = size_object_rel(key, sc.lastobj);
hp = HAlloc(p, 9 + sz + PROC_BIN_SIZE);
- key = copy_struct(key, sz, &hp, &MSO(p));
+ key = copy_struct_rel(key, sz, &hp, &MSO(p), sc.lastobj, NULL);
if (mpi.all_objects)
(mpi.mp)->flags |= BIN_FLAG_ALL_OBJECTS;
mpb=db_make_mp_binary(p,mpi.mp,&hp);
@@ -1259,7 +1234,7 @@ static int db_select_count_continue_tree(Process *p,
}
stack = get_any_stack(tb);
- traverse_backwards(tb, stack, lastkey, &doit_select_count, &sc);
+ traverse_backwards(tb, stack, lastkey, NULL, &doit_select_count, &sc);
release_stack(tb,stack);
BUMP_REDS(p, 1000 - sc.max);
@@ -1269,12 +1244,12 @@ static int db_select_count_continue_tree(Process *p,
}
key = GETKEY(tb, sc.lastobj);
if (end_condition != NIL &&
- (cmp_partly_bound(end_condition,key) > 0)) {
+ (cmp_partly_bound(end_condition,key,sc.lastobj) > 0)) {
/* done anyway */
RET_TO_BIF(make_small(sc.got),DB_ERROR_NONE);
}
/* Not done yet, let's trap. */
- sz = size_object(key);
+ sz = size_object_rel(key, sc.lastobj);
if (IS_USMALL(0, sc.got)) {
hp = HAlloc(p, sz + 6);
egot = make_small(sc.got);
@@ -1284,7 +1259,7 @@ static int db_select_count_continue_tree(Process *p,
egot = uint_to_big(sc.got, hp);
hp += BIG_UINT_HEAP_SIZE;
}
- key = copy_struct(key, sz, &hp, &MSO(p));
+ key = copy_struct_rel(key, sz, &hp, &MSO(p), sc.lastobj, NULL);
continuation = TUPLE5
(hp,
tptr[1],
@@ -1307,6 +1282,7 @@ static int db_select_count_tree(Process *p, DbTable *tbl,
struct select_count_context sc;
struct mp_info mpi;
Eterm lastkey = THE_NON_VALUE;
+ Eterm* lk_base = NULL;
Eterm key;
Eterm continuation;
unsigned sz;
@@ -1347,7 +1323,7 @@ static int db_select_count_tree(Process *p, DbTable *tbl,
sc.all_objects = mpi.all_objects;
if (!mpi.got_partial && mpi.some_limitation &&
- cmp(mpi.least,mpi.most) == 0) {
+ CMP(mpi.least,mpi.most) == 0) {
doit_select_count(tb,mpi.save_term,&sc,0 /* dummy */);
RET_TO_BIF(erts_make_integer(sc.got,p),DB_ERROR_NONE);
}
@@ -1356,11 +1332,12 @@ static int db_select_count_tree(Process *p, DbTable *tbl,
if (mpi.some_limitation) {
if ((this = find_next_from_pb_key(tb, stack, mpi.most)) != NULL) {
lastkey = GETKEY(tb, this->dbterm.tpl);
+ lk_base = this->dbterm.tpl;
}
sc.end_condition = mpi.least;
}
- traverse_backwards(tb, stack, lastkey, &doit_select_count, &sc);
+ traverse_backwards(tb, stack, lastkey, lk_base, &doit_select_count, &sc);
release_stack(tb,stack);
BUMP_REDS(p, 1000 - sc.max);
if (sc.max > 0) {
@@ -1368,7 +1345,7 @@ static int db_select_count_tree(Process *p, DbTable *tbl,
}
key = GETKEY(tb, sc.lastobj);
- sz = size_object(key);
+ sz = size_object_rel(key, sc.lastobj);
if (IS_USMALL(0, sc.got)) {
hp = HAlloc(p, sz + PROC_BIN_SIZE + 6);
egot = make_small(sc.got);
@@ -1378,7 +1355,7 @@ static int db_select_count_tree(Process *p, DbTable *tbl,
egot = uint_to_big(sc.got, hp);
hp += BIG_UINT_HEAP_SIZE;
}
- key = copy_struct(key, sz, &hp, &MSO(p));
+ key = copy_struct_rel(key, sz, &hp, &MSO(p), sc.lastobj, NULL);
if (mpi.all_objects)
(mpi.mp)->flags |= BIN_FLAG_ALL_OBJECTS;
mpb = db_make_mp_binary(p,mpi.mp,&hp);
@@ -1409,6 +1386,7 @@ static int db_select_chunk_tree(Process *p, DbTable *tbl,
struct select_context sc;
struct mp_info mpi;
Eterm lastkey = THE_NON_VALUE;
+ Eterm* lk_base = NULL;
Eterm key;
Eterm continuation;
unsigned sz;
@@ -1450,7 +1428,7 @@ static int db_select_chunk_tree(Process *p, DbTable *tbl,
sc.all_objects = mpi.all_objects;
if (!mpi.got_partial && mpi.some_limitation &&
- cmp(mpi.least,mpi.most) == 0) {
+ CMP(mpi.least,mpi.most) == 0) {
doit_select(tb,mpi.save_term,&sc, 0 /* direction doesn't matter */);
if (sc.accum != NIL) {
hp=HAlloc(p, 3);
@@ -1465,20 +1443,20 @@ static int db_select_chunk_tree(Process *p, DbTable *tbl,
if (mpi.some_limitation) {
if ((this = find_next_from_pb_key(tb, stack, mpi.most)) != NULL) {
lastkey = GETKEY(tb, this->dbterm.tpl);
+ lk_base = this->dbterm.tpl;
}
sc.end_condition = mpi.least;
}
-
- traverse_backwards(tb, stack, lastkey, &doit_select_chunk, &sc);
+ traverse_backwards(tb, stack, lastkey, lk_base, &doit_select_chunk, &sc);
} else {
if (mpi.some_limitation) {
if ((this = find_prev_from_pb_key(tb, stack, mpi.least)) != NULL) {
lastkey = GETKEY(tb, this->dbterm.tpl);
+ lk_base = this->dbterm.tpl;
}
sc.end_condition = mpi.most;
}
-
- traverse_forward(tb, stack, lastkey, &doit_select_chunk, &sc);
+ traverse_forward(tb, stack, lastkey, lk_base, &doit_select_chunk, &sc);
}
release_stack(tb,stack);
@@ -1503,9 +1481,9 @@ static int db_select_chunk_tree(Process *p, DbTable *tbl,
}
key = GETKEY(tb, sc.lastobj);
- sz = size_object(key);
+ sz = size_object_rel(key, sc.lastobj);
hp = HAlloc(p, 9 + sz + PROC_BIN_SIZE);
- key = copy_struct(key, sz, &hp, &MSO(p));
+ key = copy_struct_rel(key, sz, &hp, &MSO(p), sc.lastobj, NULL);
if (mpi.all_objects)
(mpi.mp)->flags |= BIN_FLAG_ALL_OBJECTS;
mpb = db_make_mp_binary(p,mpi.mp,&hp);
@@ -1528,9 +1506,9 @@ static int db_select_chunk_tree(Process *p, DbTable *tbl,
}
key = GETKEY(tb, sc.lastobj);
- sz = size_object(key);
+ sz = size_object_rel(key, sc.lastobj);
hp = HAlloc(p, 9 + sz + PROC_BIN_SIZE);
- key = copy_struct(key, sz, &hp, &MSO(p));
+ key = copy_struct_rel(key, sz, &hp, &MSO(p), sc.lastobj, NULL);
if (mpi.all_objects)
(mpi.mp)->flags |= BIN_FLAG_ALL_OBJECTS;
@@ -1606,7 +1584,7 @@ static int db_select_delete_continue_tree(Process *p,
sc.keypos = tb->common.keypos;
ASSERT(!erts_smp_atomic_read(&tb->is_stack_busy));
- traverse_backwards(tb, &tb->static_stack, lastkey, &doit_select_delete, &sc);
+ traverse_backwards(tb, &tb->static_stack, lastkey, NULL, &doit_select_delete, &sc);
BUMP_REDS(p, 1000 - sc.max);
@@ -1615,11 +1593,11 @@ static int db_select_delete_continue_tree(Process *p,
}
key = GETKEY(tb, (sc.lastterm)->dbterm.tpl);
if (end_condition != NIL &&
- cmp_partly_bound(end_condition,key) > 0) { /* done anyway */
+ cmp_partly_bound(end_condition,key,sc.lastterm->dbterm.tpl) > 0) { /* done anyway */
RET_TO_BIF(erts_make_integer(sc.accum,p),DB_ERROR_NONE);
}
/* Not done yet, let's trap. */
- sz = size_object(key);
+ sz = size_object_rel(key, sc.lastterm->dbterm.tpl);
if (IS_USMALL(0, sc.accum)) {
hp = HAlloc(p, sz + 6);
eaccsum = make_small(sc.accum);
@@ -1629,7 +1607,7 @@ static int db_select_delete_continue_tree(Process *p,
eaccsum = uint_to_big(sc.accum, hp);
hp += BIG_UINT_HEAP_SIZE;
}
- key = copy_struct(key, sz, &hp, &MSO(p));
+ key = copy_struct_rel(key, sz, &hp, &MSO(p), sc.lastterm->dbterm.tpl, NULL);
continuation = TUPLE5
(hp,
tptr[1],
@@ -1650,6 +1628,7 @@ static int db_select_delete_tree(Process *p, DbTable *tbl,
struct select_delete_context sc;
struct mp_info mpi;
Eterm lastkey = THE_NON_VALUE;
+ Eterm* lk_base = NULL;
Eterm key;
Eterm continuation;
unsigned sz;
@@ -1693,7 +1672,7 @@ static int db_select_delete_tree(Process *p, DbTable *tbl,
sc.mp = mpi.mp;
if (!mpi.got_partial && mpi.some_limitation &&
- cmp(mpi.least,mpi.most) == 0) {
+ CMP(mpi.least,mpi.most) == 0) {
doit_select_delete(tb,mpi.save_term,&sc, 0 /* direction doesn't
matter */);
RET_TO_BIF(erts_make_integer(sc.accum,p),DB_ERROR_NONE);
@@ -1702,11 +1681,12 @@ static int db_select_delete_tree(Process *p, DbTable *tbl,
if (mpi.some_limitation) {
if ((this = find_next_from_pb_key(tb, &tb->static_stack, mpi.most)) != NULL) {
lastkey = GETKEY(tb, this->dbterm.tpl);
+ lk_base = this->dbterm.tpl;
}
sc.end_condition = mpi.least;
}
- traverse_backwards(tb, &tb->static_stack, lastkey, &doit_select_delete, &sc);
+ traverse_backwards(tb, &tb->static_stack, lastkey, lk_base, &doit_select_delete, &sc);
BUMP_REDS(p, 1000 - sc.max);
if (sc.max > 0) {
@@ -1714,7 +1694,7 @@ static int db_select_delete_tree(Process *p, DbTable *tbl,
}
key = GETKEY(tb, (sc.lastterm)->dbterm.tpl);
- sz = size_object(key);
+ sz = size_object_rel(key, sc.lastterm->dbterm.tpl);
if (IS_USMALL(0, sc.accum)) {
hp = HAlloc(p, sz + PROC_BIN_SIZE + 6);
eaccsum = make_small(sc.accum);
@@ -1724,7 +1704,7 @@ static int db_select_delete_tree(Process *p, DbTable *tbl,
eaccsum = uint_to_big(sc.accum, hp);
hp += BIG_UINT_HEAP_SIZE;
}
- key = copy_struct(key, sz, &hp, &MSO(p));
+ key = copy_struct_rel(key, sz, &hp, &MSO(p), sc.lastterm->dbterm.tpl, NULL);
mpb = db_make_mp_binary(p,mpi.mp,&hp);
continuation = TUPLE5
@@ -1766,7 +1746,6 @@ static void db_print_tree(int to, void *to_arg,
"------------------------------------------------\n");
#else
erts_print(to, to_arg, "Ordered set (AVL tree), Elements: %d\n", NITEMS(tb));
- do_dump_tree(to, to_arg, tb->root);
#endif
}
@@ -1842,7 +1821,7 @@ do_db_tree_foreach_offheap(TreeDbTerm *tdbt,
}
static TreeDbTerm *linkout_tree(DbTableTree *tb,
- Eterm key)
+ Eterm key, Eterm* key_base)
{
TreeDbTerm **tstack[STACK_NEED];
int tpos = 0;
@@ -1865,7 +1844,7 @@ static TreeDbTerm *linkout_tree(DbTableTree *tb,
for (;;) {
if (!*this) { /* Failure */
return NULL;
- } else if ((c = cmp(key,GETKEY(tb,(*this)->dbterm.tpl))) < 0) {
+ } else if ((c = cmp_key(tb, key, key_base, *this)) < 0) {
dstack[dpos++] = DIR_LEFT;
tstack[tpos++] = this;
this = &((*this)->left);
@@ -1929,7 +1908,7 @@ static TreeDbTerm *linkout_object_tree(DbTableTree *tb,
for (;;) {
if (!*this) { /* Failure */
return NULL;
- } else if ((c = cmp(key,GETKEY(tb,(*this)->dbterm.tpl))) < 0) {
+ } else if ((c = cmp_key(tb,key,NULL,*this)) < 0) {
dstack[dpos++] = DIR_LEFT;
tstack[tpos++] = this;
this = &((*this)->left);
@@ -2082,15 +2061,6 @@ static int analyze_pattern(DbTableTree *tb, Eterm pattern,
return DB_ERROR_NONE;
}
-static void do_dump_tree(int to, void *to_arg, TreeDbTerm *t)
-{
- if (t != NULL) {
- do_dump_tree(to, to_arg, t->left);
- erts_print(to, to_arg, "%T\n", make_tuple(t->dbterm.tpl));
- do_dump_tree(to, to_arg, t->right);
- }
-}
-
static int do_free_tree_cont(DbTableTree *tb, int num_left)
{
TreeDbTerm *root;
@@ -2324,14 +2294,15 @@ done:
* Find next and previous in sort order
*/
-static TreeDbTerm *find_next(DbTableTree *tb, DbTreeStack* stack, Eterm key)
+static TreeDbTerm *find_next(DbTableTree *tb, DbTreeStack* stack,
+ Eterm key, Eterm* key_base)
{
TreeDbTerm *this;
TreeDbTerm *tmp;
Sint c;
if(( this = TOP_NODE(stack)) != NULL) {
- if (!CMP_EQ(GETKEY(tb, this->dbterm.tpl),key)) {
+ if (!cmp_key_eq(tb,key,key_base,this)) {
/* Start from the beginning */
stack->pos = stack->slot = 0;
}
@@ -2341,14 +2312,14 @@ static TreeDbTerm *find_next(DbTableTree *tb, DbTreeStack* stack, Eterm key)
return NULL;
for (;;) {
PUSH_NODE(stack, this);
- if (( c = cmp(GETKEY(tb, this->dbterm.tpl),key) ) < 0) {
+ if (( c = cmp_key(tb,key,key_base,this) ) > 0) {
if (this->right == NULL) /* We are at the previos
and the element does
not exist */
break;
else
this = this->right;
- } else if (c > 0) {
+ } else if (c < 0) {
if (this->left == NULL) /* Done */
return this;
else
@@ -2381,14 +2352,15 @@ static TreeDbTerm *find_next(DbTableTree *tb, DbTreeStack* stack, Eterm key)
return this;
}
-static TreeDbTerm *find_prev(DbTableTree *tb, DbTreeStack* stack, Eterm key)
+static TreeDbTerm *find_prev(DbTableTree *tb, DbTreeStack* stack,
+ Eterm key, Eterm* key_base)
{
TreeDbTerm *this;
TreeDbTerm *tmp;
Sint c;
if(( this = TOP_NODE(stack)) != NULL) {
- if (!CMP_EQ(GETKEY(tb, this->dbterm.tpl),key)) {
+ if (!cmp_key_eq(tb,key,key_base,this)) {
/* Start from the beginning */
stack->pos = stack->slot = 0;
}
@@ -2398,14 +2370,14 @@ static TreeDbTerm *find_prev(DbTableTree *tb, DbTreeStack* stack, Eterm key)
return NULL;
for (;;) {
PUSH_NODE(stack, this);
- if (( c = cmp(GETKEY(tb, this->dbterm.tpl),key) ) > 0) {
+ if (( c = cmp_key(tb,key,key_base,this) ) < 0) {
if (this->left == NULL) /* We are at the next
and the element does
not exist */
break;
else
this = this->left;
- } else if (c < 0) {
+ } else if (c > 0) {
if (this->right == NULL) /* Done */
return this;
else
@@ -2451,7 +2423,8 @@ static TreeDbTerm *find_next_from_pb_key(DbTableTree *tb, DbTreeStack* stack,
return NULL;
for (;;) {
PUSH_NODE(stack, this);
- if (( c = cmp_partly_bound(key,GETKEY(tb, this->dbterm.tpl)) ) >= 0) {
+ if (( c = cmp_partly_bound(key,GETKEY(tb, this->dbterm.tpl),
+ this->dbterm.tpl) ) >= 0) {
if (this->right == NULL) {
do {
tmp = POP_NODE(stack);
@@ -2484,7 +2457,8 @@ static TreeDbTerm *find_prev_from_pb_key(DbTableTree *tb, DbTreeStack* stack,
return NULL;
for (;;) {
PUSH_NODE(stack, this);
- if (( c = cmp_partly_bound(key,GETKEY(tb, this->dbterm.tpl)) ) <= 0) {
+ if (( c = cmp_partly_bound(key,GETKEY(tb, this->dbterm.tpl),
+ this->dbterm.tpl) ) <= 0) {
if (this->left == NULL) {
do {
tmp = POP_NODE(stack);
@@ -2514,12 +2488,11 @@ static TreeDbTerm *find_node(DbTableTree *tb, Eterm key)
Sint res;
DbTreeStack* stack = get_static_stack(tb);
- if(!stack || EMPTY_NODE(stack)
- || !CMP_EQ(GETKEY(tb, ( this = TOP_NODE(stack) )->dbterm.tpl), key)) {
+ if(!stack || EMPTY_NODE(stack)
+ || !cmp_key_eq(tb, key, NULL, (this=TOP_NODE(stack)))) {
this = tb->root;
- while (this != NULL &&
- ( res = cmp(key, GETKEY(tb, this->dbterm.tpl)) ) != 0) {
+ while (this != NULL && (res = cmp_key(tb,key,NULL,this)) != 0) {
if (res < 0)
this = this->left;
else
@@ -2541,8 +2514,7 @@ static TreeDbTerm **find_node2(DbTableTree *tb, Eterm key)
Sint res;
this = &tb->root;
- while ((*this) != NULL &&
- ( res = cmp(key, GETKEY(tb, (*this)->dbterm.tpl)) ) != 0) {
+ while ((*this) != NULL && (res = cmp_key(tb, key, NULL, *this)) != 0) {
if (res < 0)
this = &((*this)->left);
else
@@ -2565,6 +2537,9 @@ static int db_lookup_dbterm_tree(DbTable *tbl, Eterm key, DbUpdateHandle* handle
handle->mustResize = 0;
handle->bp = (void**) pp;
handle->new_size = (*pp)->dbterm.size;
+#if HALFWORD_HEAP
+ handle->abs_vec = NULL;
+#endif
return 1;
}
@@ -2589,7 +2564,7 @@ static void db_finalize_dbterm_tree(DbUpdateHandle* handle)
*/
static void traverse_backwards(DbTableTree *tb,
DbTreeStack* stack,
- Eterm lastkey,
+ Eterm lastkey, Eterm* lk_base,
int (*doit)(DbTableTree *,
TreeDbTerm *,
void *,
@@ -2608,15 +2583,16 @@ static void traverse_backwards(DbTableTree *tb,
this = this->right;
}
this = TOP_NODE(stack);
- next = find_prev(tb, stack, GETKEY(tb, this->dbterm.tpl));
+ next = find_prev(tb, stack, GETKEY(tb, this->dbterm.tpl),
+ this->dbterm.tpl);
if (!((*doit)(tb, this, context, 0)))
return;
} else {
- next = find_prev(tb, stack, lastkey);
+ next = find_prev(tb, stack, lastkey, lk_base);
}
while ((this = next) != NULL) {
- next = find_prev(tb, stack, GETKEY(tb, this->dbterm.tpl));
+ next = find_prev(tb, stack, GETKEY(tb, this->dbterm.tpl), this->dbterm.tpl);
if (!((*doit)(tb, this, context, 0)))
return;
}
@@ -2627,7 +2603,7 @@ static void traverse_backwards(DbTableTree *tb,
*/
static void traverse_forward(DbTableTree *tb,
DbTreeStack* stack,
- Eterm lastkey,
+ Eterm lastkey, Eterm* lk_base,
int (*doit)(DbTableTree *,
TreeDbTerm *,
void *,
@@ -2646,15 +2622,15 @@ static void traverse_forward(DbTableTree *tb,
this = this->left;
}
this = TOP_NODE(stack);
- next = find_next(tb, stack, GETKEY(tb, this->dbterm.tpl));
+ next = find_next(tb, stack, GETKEY(tb, this->dbterm.tpl), this->dbterm.tpl);
if (!((*doit)(tb, this, context, 1)))
return;
} else {
- next = find_next(tb, stack, lastkey);
+ next = find_next(tb, stack, lastkey, lk_base);
}
while ((this = next) != NULL) {
- next = find_next(tb, stack, GETKEY(tb, this->dbterm.tpl));
+ next = find_next(tb, stack, GETKEY(tb, this->dbterm.tpl), this->dbterm.tpl);
if (!((*doit)(tb, this, context, 1)))
return;
}
@@ -2680,7 +2656,7 @@ static int key_given(DbTableTree *tb, Eterm pattern, TreeDbTerm **ret,
if (( this = find_node(tb, key) ) == NULL) {
return -1;
}
- *ret = this;
+ *ret = this;
return 1;
} else if (partly_bound != NULL && key != am_Underscore &&
db_is_variable(key) < 0)
@@ -2691,7 +2667,7 @@ static int key_given(DbTableTree *tb, Eterm pattern, TreeDbTerm **ret,
-static Sint do_cmp_partly_bound(Eterm a, Eterm b, int *done)
+static Sint do_cmp_partly_bound(Eterm a, Eterm b, Eterm* b_base, int *done)
{
Eterm* aa;
Eterm* bb;
@@ -2705,44 +2681,44 @@ static Sint do_cmp_partly_bound(Eterm a, Eterm b, int *done)
*done = 1;
return 0;
}
- if (a == b)
+ if (is_same(a,NULL,b,b_base))
return 0;
switch (a & _TAG_PRIMARY_MASK) {
case TAG_PRIMARY_LIST:
if (!is_list(b)) {
- return cmp(a,b);
+ return cmp_rel(a,NULL,b,b_base);
}
aa = list_val(a);
- bb = list_val(b);
+ bb = list_val_rel(b,b_base);
while (1) {
- if ((j = do_cmp_partly_bound(*aa++, *bb++, done)) != 0 || *done)
+ if ((j = do_cmp_partly_bound(*aa++, *bb++, b_base, done)) != 0 || *done)
return j;
if (*aa==*bb)
return 0;
if (is_not_list(*aa) || is_not_list(*bb))
- return do_cmp_partly_bound(*aa, *bb, done);
+ return do_cmp_partly_bound(*aa, *bb, b_base, done);
aa = list_val(*aa);
- bb = list_val(*bb);
+ bb = list_val_rel(*bb,b_base);
}
case TAG_PRIMARY_BOXED:
if ((b & _TAG_PRIMARY_MASK) != TAG_PRIMARY_BOXED) {
- return cmp(a,b);
+ return cmp_rel(a,NULL,b,b_base);
}
a_hdr = ((*boxed_val(a)) & _TAG_HEADER_MASK) >> _TAG_PRIMARY_SIZE;
- b_hdr = ((*boxed_val(b)) & _TAG_HEADER_MASK) >> _TAG_PRIMARY_SIZE;
+ b_hdr = ((*boxed_val_rel(b,b_base)) & _TAG_HEADER_MASK) >> _TAG_PRIMARY_SIZE;
if (a_hdr != b_hdr) {
- return cmp(a, b);
+ return cmp_rel(a, NULL, b, b_base);
}
if (a_hdr == (_TAG_HEADER_ARITYVAL >> _TAG_PRIMARY_SIZE)) {
aa = tuple_val(a);
- bb = tuple_val(b);
+ bb = tuple_val_rel(b, b_base);
/* compare the arities */
i = arityval(*aa); /* get the arity*/
if (i < arityval(*bb)) return(-1);
if (i > arityval(*bb)) return(1);
while (i--) {
- if ((j = do_cmp_partly_bound(*++aa, *++bb, done)) != 0
+ if ((j = do_cmp_partly_bound(*++aa, *++bb, b_base, done)) != 0
|| *done)
return j;
}
@@ -2750,14 +2726,14 @@ static Sint do_cmp_partly_bound(Eterm a, Eterm b, int *done)
}
/* Drop through */
default:
- return cmp(a, b);
+ return cmp_rel(a, NULL, b, b_base);
}
}
-static Sint cmp_partly_bound(Eterm partly_bound_key, Eterm bound_key)
+static Sint cmp_partly_bound(Eterm partly_bound_key, Eterm bound_key, Eterm* bk_base)
{
int done = 0;
- Sint ret = do_cmp_partly_bound(partly_bound_key, bound_key, &done);
+ Sint ret = do_cmp_partly_bound(partly_bound_key, bound_key, bk_base, &done);
#ifdef HARDDEBUG
erts_fprintf(stderr,"\ncmp_partly_bound: %T", partly_bound_key);
if (ret < 0)
@@ -2766,7 +2742,7 @@ static Sint cmp_partly_bound(Eterm partly_bound_key, Eterm bound_key)
erts_fprintf(stderr," > ");
else
erts_fprintf(stderr," == ");
- erts_fprintf(stderr,"%T\n",bound_key);
+ erts_fprintf(stderr,"%T\n",bound_key); // HALFWORD BUG: printing rterm
#endif
return ret;
}
@@ -2853,7 +2829,7 @@ static int do_partly_bound_can_match_lesser(Eterm a, Eterm b,
if (not_eq_tags(a,b)) {
*done = 1;
- return (cmp(a, b) < 0) ? 1 : 0;
+ return (CMP(a, b) < 0) ? 1 : 0;
}
/* we now know that tags are the same */
@@ -2889,7 +2865,7 @@ static int do_partly_bound_can_match_lesser(Eterm a, Eterm b,
bb = list_val(*bb);
}
default:
- if((i = cmp(a, b)) != 0) {
+ if((i = CMP(a, b)) != 0) {
*done = 1;
}
return (i < 0) ? 1 : 0;
@@ -2924,7 +2900,7 @@ static int do_partly_bound_can_match_greater(Eterm a, Eterm b,
if (not_eq_tags(a,b)) {
*done = 1;
- return (cmp(a, b) > 0) ? 1 : 0;
+ return (CMP(a, b) > 0) ? 1 : 0;
}
/* we now know that tags are the same */
@@ -2960,7 +2936,7 @@ static int do_partly_bound_can_match_greater(Eterm a, Eterm b,
bb = list_val(*bb);
}
default:
- if((i = cmp(a, b)) != 0) {
+ if((i = CMP(a, b)) != 0) {
*done = 1;
}
return (i > 0) ? 1 : 0;
@@ -2983,16 +2959,16 @@ static int doit_select(DbTableTree *tb, TreeDbTerm *this, void *ptr,
if (sc->end_condition != NIL &&
((forward &&
cmp_partly_bound(sc->end_condition,
- GETKEY_WITH_POS(sc->keypos,
- this->dbterm.tpl)) < 0) ||
+ GETKEY_WITH_POS(sc->keypos, this->dbterm.tpl),
+ this->dbterm.tpl) < 0) ||
(!forward &&
cmp_partly_bound(sc->end_condition,
- GETKEY_WITH_POS(sc->keypos,
- this->dbterm.tpl)) > 0))) {
+ GETKEY_WITH_POS(sc->keypos, this->dbterm.tpl),
+ this->dbterm.tpl) > 0))) {
return 0;
}
- ret = db_prog_match_and_copy(&tb->common,sc->p,sc->mp,sc->all_objects,
- &this->dbterm, &hp, 2);
+ ret = db_match_dbterm(&tb->common,sc->p,sc->mp,sc->all_objects,
+ &this->dbterm, &hp, 2);
if (is_value(ret)) {
sc->accum = CONS(hp, ret, sc->accum);
}
@@ -3020,12 +2996,12 @@ static int doit_select_count(DbTableTree *tb, TreeDbTerm *this, void *ptr,
/* Always backwards traversing */
if (sc->end_condition != NIL &&
(cmp_partly_bound(sc->end_condition,
- GETKEY_WITH_POS(sc->keypos,
- this->dbterm.tpl)) > 0)) {
+ GETKEY_WITH_POS(sc->keypos, this->dbterm.tpl),
+ this->dbterm.tpl) > 0)) {
return 0;
}
- ret = db_prog_match_and_copy(&tb->common, sc->p, sc->mp, 0,
- &this->dbterm, NULL, 0);
+ ret = db_match_dbterm(&tb->common, sc->p, sc->mp, 0,
+ &this->dbterm, NULL, 0);
if (ret == am_true) {
++(sc->got);
}
@@ -3047,17 +3023,17 @@ static int doit_select_chunk(DbTableTree *tb, TreeDbTerm *this, void *ptr,
if (sc->end_condition != NIL &&
((forward &&
cmp_partly_bound(sc->end_condition,
- GETKEY_WITH_POS(sc->keypos,
- this->dbterm.tpl)) < 0) ||
+ GETKEY_WITH_POS(sc->keypos, this->dbterm.tpl),
+ this->dbterm.tpl) < 0) ||
(!forward &&
cmp_partly_bound(sc->end_condition,
- GETKEY_WITH_POS(sc->keypos,
- this->dbterm.tpl)) > 0))) {
+ GETKEY_WITH_POS(sc->keypos, this->dbterm.tpl),
+ this->dbterm.tpl) > 0))) {
return 0;
}
- ret = db_prog_match_and_copy(&tb->common, sc->p, sc->mp, sc->all_objects,
- &this->dbterm, &hp, 2);
+ ret = db_match_dbterm(&tb->common, sc->p, sc->mp, sc->all_objects,
+ &this->dbterm, &hp, 2);
if (is_value(ret)) {
++(sc->got);
sc->accum = CONS(hp, ret, sc->accum);
@@ -3090,14 +3066,14 @@ static int doit_select_delete(DbTableTree *tb, TreeDbTerm *this, void *ptr,
if (sc->end_condition != NIL &&
cmp_partly_bound(sc->end_condition,
- GETKEY_WITH_POS(sc->keypos,
- this->dbterm.tpl)) > 0)
+ GETKEY_WITH_POS(sc->keypos, this->dbterm.tpl),
+ this->dbterm.tpl) > 0)
return 0;
- ret = db_prog_match_and_copy(&tb->common, sc->p, sc->mp, 0,
- &this->dbterm, NULL, 0);
+ ret = db_match_dbterm(&tb->common, sc->p, sc->mp, 0,
+ &this->dbterm, NULL, 0);
if (ret == am_true) {
key = GETKEY(sc->tb, this->dbterm.tpl);
- linkout_tree(sc->tb, key);
+ linkout_tree(sc->tb, key, this->dbterm.tpl);
sc->erase_lastterm = 1;
++sc->accum;
}
diff --git a/erts/emulator/beam/erl_db_util.c b/erts/emulator/beam/erl_db_util.c
index e773361619..c3b074f782 100644
--- a/erts/emulator/beam/erl_db_util.c
+++ b/erts/emulator/beam/erl_db_util.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2011. 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
@@ -57,6 +57,7 @@
DBIF_TABLE_GUARD | DBIF_TABLE_BODY | DBIF_TRACE_GUARD | DBIF_TRACE_BODY
+#define HEAP_XTRA 100
/*
** Some convenience macros for stacks (DMC == db_match_compile)
@@ -229,6 +230,11 @@ typedef enum {
matchCall2,
matchCall3,
matchPushV,
+#if HALFWORD_HEAP
+ matchPushVGuard, /* First guard-only variable reference */
+#endif
+ matchPushVResult, /* First variable reference in result, or (if HALFWORD)
+ in guard if also referenced in result */
matchPushExpr, /* Push the whole expression we're matching ('$_') */
matchPushArrayAsList, /* Only when parameter is an Array and
not an erlang term (DCOMP_TRACE) */
@@ -292,11 +298,19 @@ DMC_DECLARE_STACK_TYPE(unsigned);
** Data about the heap during compilation
*/
+typedef struct DMCVariable {
+ int is_bound;
+ int is_in_body;
+#if HALFWORD_HEAP
+ int first_guard_label; /* to maybe change from PushVGuard to PushVResult */
+#endif
+} DMCVariable;
+
typedef struct DMCHeap {
int size;
- unsigned def[DMC_DEFAULT_SIZE];
- unsigned *data;
- int used;
+ DMCVariable vars_def[DMC_DEFAULT_SIZE];
+ DMCVariable* vars;
+ int vars_used;
} DMCHeap;
/*
@@ -323,7 +337,6 @@ typedef struct dmc_context {
Eterm *bodyexpr;
int num_match;
int current_match;
- int eheap_need;
Uint cflags;
int is_guard; /* 1 if in guard, 0 if in body */
int special; /* 1 if the head in the match was a single expression */
@@ -346,9 +359,22 @@ typedef struct dmc_context {
#define ERTS_DEFAULT_MS_HEAP_SIZE 128
+/* Runtime info about a $-variable
+*/
+typedef struct MatchVariable {
+ Eterm term;
+#ifdef DEBUG
+ Process* proc;
+ Eterm* base;
+#endif
+} MatchVariable;
+
typedef struct {
Process process;
- Eterm *heap;
+ union {
+ Eterm* heap;
+ MatchVariable* variables; /* first on "heap" */
+ }u;
Eterm default_heap[ERTS_DEFAULT_MS_HEAP_SIZE];
} ErtsMatchPseudoProcess;
@@ -371,10 +397,10 @@ cleanup_match_pseudo_process(ErtsMatchPseudoProcess *mpsp, int keep_heap)
}
#endif
if (!keep_heap) {
- if (mpsp->heap != &mpsp->default_heap[0]) {
+ if (mpsp->u.heap != mpsp->default_heap) {
/* Have to be done *after* call to erts_cleanup_empty_process() */
- erts_free(ERTS_ALC_T_DB_MS_RUN_HEAP, (void *) mpsp->heap);
- mpsp->heap = &mpsp->default_heap[0];
+ erts_free(ERTS_ALC_T_DB_MS_RUN_HEAP, (void *) mpsp->u.heap);
+ mpsp->u.heap = mpsp->default_heap;
}
#ifdef DEBUG
else {
@@ -398,7 +424,7 @@ create_match_pseudo_process(void)
mpsp = (ErtsMatchPseudoProcess *)erts_alloc(ERTS_ALC_T_DB_MS_PSDO_PROC,
sizeof(ErtsMatchPseudoProcess));
erts_init_empty_process(&mpsp->process);
- mpsp->heap = &mpsp->default_heap[0];
+ mpsp->u.heap = mpsp->default_heap;
return mpsp;
}
@@ -422,11 +448,11 @@ get_match_pseudo_process(Process *c_p, Uint heap_size)
mpsp = match_pseudo_process;
cleanup_match_pseudo_process(mpsp, 0);
#endif
- if (heap_size > ERTS_DEFAULT_MS_HEAP_SIZE)
- mpsp->heap = (Eterm *) erts_alloc(ERTS_ALC_T_DB_MS_RUN_HEAP,
- heap_size*sizeof(Uint));
+ if (heap_size > ERTS_DEFAULT_MS_HEAP_SIZE*sizeof(Eterm)) {
+ mpsp->u.heap = (Eterm*) erts_alloc(ERTS_ALC_T_DB_MS_RUN_HEAP, heap_size);
+ }
else {
- ASSERT(mpsp->heap == &mpsp->default_heap[0]);
+ ASSERT(mpsp->u.heap == mpsp->default_heap);
}
return mpsp;
}
@@ -467,23 +493,6 @@ erts_match_set_release_result(Process* c_p)
static erts_smp_atomic_t trace_control_word;
-
-Eterm
-erts_ets_copy_object(Eterm obj, Process* to)
-{
- Uint size = size_object(obj);
- Eterm* hp = HAlloc(to, size);
- Eterm res;
-
- res = copy_struct(obj, size, &hp, &MSO(to));
-#ifdef DEBUG
- if (eq(obj, res) == 0) {
- erl_exit(1, "copy not equal to source\n");
- }
-#endif
- return res;
-}
-
/* This needs to be here, before the bif table... */
static Eterm db_set_trace_control_word_fake_1(Process *p, Eterm val);
@@ -869,9 +878,9 @@ static DMCRet dmc_one_term(DMCContext *context,
#ifdef DMC_DEBUG
static int test_disassemble_next = 0;
-static void db_match_dis(Binary *prog);
+void db_match_dis(Binary *prog);
#define TRACE erts_fprintf(stderr,"Trace: %s:%d\n",__FILE__,__LINE__)
-#define FENCE_PATTERN_SIZE 1
+#define FENCE_PATTERN_SIZE (1*sizeof(Uint))
#define FENCE_PATTERN 0xDEADBEEFUL
#else
#define TRACE /* Nothing */
@@ -915,7 +924,7 @@ BIF_RETTYPE db_set_trace_control_word_1(Process *p, Eterm new)
if (val != ((Uint32)val))
BIF_ERROR(p, BADARG);
- old_tcw = (Uint32) erts_smp_atomic_xchg(&trace_control_word, (long) val);
+ old_tcw = (Uint32) erts_smp_atomic_xchg(&trace_control_word, (erts_aint_t) val);
BIF_RET(erts_make_integer((Uint) old_tcw, p));
}
@@ -1179,14 +1188,14 @@ done:
}
Eterm erts_match_set_run(Process *p, Binary *mpsp,
- Eterm *args, int num_args,
+ Eterm *args, int num_args,
+ enum erts_pam_run_flags in_flags,
Uint32 *return_flags)
{
Eterm ret;
- ret = db_prog_match(p, mpsp,
- NIL, args,
- num_args, return_flags);
+ ret = db_prog_match(p, mpsp, NIL, NULL, args, num_args,
+ in_flags, return_flags);
#if defined(HARDDEBUG)
if (is_non_value(ret)) {
erts_fprintf(stderr, "Failed\n");
@@ -1210,9 +1219,9 @@ static Eterm erts_match_set_run_ets(Process *p, Binary *mpsp,
{
Eterm ret;
- ret = db_prog_match(p, mpsp,
- args, NULL,
- num_args, return_flags);
+ ret = db_prog_match(p, mpsp, args, NULL, NULL, num_args,
+ ERTS_PAM_CONTIGUOUS_TUPLE | ERTS_PAM_COPY_RESULT,
+ return_flags);
#if defined(HARDDEBUG)
if (is_non_value(ret)) {
erts_fprintf(stderr, "Failed\n");
@@ -1280,7 +1289,6 @@ Binary *db_match_compile(Eterm *matchexpr,
int structure_checked;
DMCRet res;
int current_try_label;
- Uint max_eheap_need;
Binary *bp = NULL;
unsigned clause_start;
@@ -1293,27 +1301,24 @@ Binary *db_match_compile(Eterm *matchexpr,
context.matchexpr = matchexpr;
context.guardexpr = guards;
context.bodyexpr = body;
- context.eheap_need = 0;
context.err_info = err_info;
context.cflags = flags;
heap.size = DMC_DEFAULT_SIZE;
- heap.data = heap.def;
+ heap.vars = heap.vars_def;
/*
** Compile the match expression
*/
restart:
- heap.used = 0;
- max_eheap_need = 0;
+ heap.vars_used = 0;
for (context.current_match = 0;
context.current_match < num_progs;
++context.current_match) { /* This loop is long,
too long */
- memset(heap.data, 0, heap.size * sizeof(*heap.data));
+ memset(heap.vars, 0, heap.size * sizeof(*heap.vars));
t = context.matchexpr[context.current_match];
context.stack_used = 0;
- context.eheap_need = 0;
structure_checked = 0;
if (context.current_match < num_progs - 1) {
DMC_PUSH(text,matchTryMeElse);
@@ -1485,10 +1490,6 @@ restart:
if (current_try_label >= 0) {
DMC_POKE(text, current_try_label, DMC_STACK_NUM(text));
}
- /* So, how much eheap did this part of the match program need? */
- if (context.eheap_need > max_eheap_need) {
- max_eheap_need = context.eheap_need;
- }
} /* for (context.current_match = 0 ...) */
@@ -1524,16 +1525,13 @@ restart:
ret->saved_program_buf = NULL;
ret->saved_program = NIL;
ret->term_save = context.save;
- ret->num_bindings = heap.used;
+ ret->num_bindings = heap.vars_used;
ret->single_variable = context.special;
sys_memcpy(ret->text, DMC_STACK_DATA(text),
DMC_STACK_NUM(text) * sizeof(UWord));
- ret->heap_size = ((heap.used * sizeof(Eterm)) +
- (max_eheap_need * sizeof(Eterm)) +
- (context.stack_need * sizeof(Eterm *)) +
- (3 * (FENCE_PATTERN_SIZE * sizeof(Eterm *))));
- ret->eheap_offset = heap.used + FENCE_PATTERN_SIZE;
- ret->stack_offset = ret->eheap_offset + max_eheap_need + FENCE_PATTERN_SIZE;
+ ret->stack_offset = heap.vars_used*sizeof(MatchVariable) + FENCE_PATTERN_SIZE;
+ ret->heap_size = ret->stack_offset + context.stack_need * sizeof(Eterm*) + FENCE_PATTERN_SIZE;
+
#ifdef DMC_DEBUG
ret->prog_end = ret->text + DMC_STACK_NUM(text);
#endif
@@ -1551,8 +1549,8 @@ error: /* Here is were we land when compilation failed. */
DMC_FREE(text);
if (context.copy != NULL)
free_message_buffer(context.copy);
- if (heap.data != heap.def)
- erts_free(ERTS_ALC_T_DB_MS_CMPL_HEAP, (void *) heap.data);
+ if (heap.vars != heap.vars_def)
+ erts_free(ERTS_ALC_T_DB_MS_CMPL_HEAP, (void *) heap.vars);
return bp;
}
@@ -1597,7 +1595,7 @@ erts_match_prog_foreach_offheap(Binary *bprog,
*/
static Eterm dpm_array_to_list(Process *psp, Eterm *arr, int arity)
{
- Eterm *hp = HAlloc(psp, arity * 2);
+ Eterm *hp = HAllocX(psp, arity * 2, HEAP_XTRA);
Eterm ret = NIL;
while (--arity >= 0) {
ret = CONS(hp, arr[arity], ret);
@@ -1606,15 +1604,82 @@ static Eterm dpm_array_to_list(Process *psp, Eterm *arr, int arity)
return ret;
}
+
+#if HALFWORD_HEAP
+struct heap_checkpoint_t
+{
+ Process *p;
+ Eterm* htop;
+ ErlHeapFragment* mbuf;
+ unsigned used_size;
+ ErlOffHeap off_heap;
+};
+
+static void heap_checkpoint_init(Process* p, struct heap_checkpoint_t* hcp)
+{
+ hcp->p = p;
+ hcp->htop = HEAP_TOP(p);
+ hcp->mbuf = MBUF(p);
+ hcp->used_size = hcp->mbuf ? hcp->mbuf->used_size : 0;
+ hcp->off_heap = MSO(p);
+}
+
+static void heap_checkpoint_revert(struct heap_checkpoint_t* hcp)
+{
+ struct erl_off_heap_header* oh = MSO(hcp->p).first;
+
+ if (oh != hcp->off_heap.first) {
+ ASSERT(oh != NULL);
+ if (hcp->off_heap.first) {
+ while (oh->next != hcp->off_heap.first) {
+ oh = oh->next;
+ }
+ oh->next = NULL;
+ }
+ erts_cleanup_offheap(&MSO(hcp->p));
+ MSO(hcp->p) = hcp->off_heap;
+ }
+ if (MBUF(hcp->p) != hcp->mbuf) {
+ ErlHeapFragment* hf = MBUF(hcp->p);
+ ASSERT(hf != NULL);
+ if (hcp->mbuf) {
+ while (hf->next != hcp->mbuf) {
+ hf = hf->next;
+ }
+ hf->next = NULL;
+ }
+ free_message_buffer(MBUF(hcp->p));
+ MBUF(hcp->p) = hcp->mbuf;
+ }
+ if (hcp->mbuf != NULL && hcp->mbuf->used_size != hcp->used_size) {
+ hcp->mbuf->used_size = hcp->used_size;
+ }
+ HEAP_TOP(hcp->p) = hcp->htop;
+}
+#endif /* HALFWORD_HEAP */
+
+static ERTS_INLINE Eterm copy_object_rel(Process* p, Eterm term, Eterm* base)
+{
+ if (!is_immed(term)) {
+ Uint sz = size_object_rel(term, base);
+ Eterm* top = HAllocX(p, sz, HEAP_XTRA);
+ return copy_struct_rel(term, sz, &top, &MSO(p), base, NULL);
+ }
+ return term;
+}
+
+
/*
** Execution of the match program, this is Pam.
** May return THE_NON_VALUE, which is a bailout.
-** the para meter 'arity' is only used if 'term' is actually an array,
+** the parameter 'arity' is only used if 'term' is actually an array,
** i.e. 'DCOMP_TRACE' was specified
*/
-Eterm db_prog_match(Process *c_p, Binary *bprog, Eterm term,
+Eterm db_prog_match(Process *c_p, Binary *bprog,
+ Eterm term, Eterm* base,
Eterm *termp,
int arity,
+ enum erts_pam_run_flags in_flags,
Uint32 *return_flags)
{
MatchProg *prog = Binary2MatchProg(bprog);
@@ -1623,7 +1688,7 @@ Eterm db_prog_match(Process *c_p, Binary *bprog, Eterm term,
Eterm t;
Eterm **sp;
Eterm *esp;
- Eterm *hp;
+ MatchVariable* variables;
BeamInstr *cp;
UWord *pc = prog->text;
Eterm *ehp;
@@ -1633,19 +1698,24 @@ Eterm db_prog_match(Process *c_p, Binary *bprog, Eterm term,
unsigned do_catch;
ErtsMatchPseudoProcess *mpsp;
Process *psp;
+ Process* build_proc;
Process *tmpp;
Process *current_scheduled;
ErtsSchedulerData *esdp;
Eterm (*bif)(Process*, ...);
int fail_label;
int atomic_trace;
+#if HALFWORD_HEAP
+ struct heap_checkpoint_t c_p_checkpoint = {};
+#endif
#ifdef DMC_DEBUG
Uint *heap_fence;
- Uint *eheap_fence;
Uint *stack_fence;
Uint save_op;
#endif /* DMC_DEBUG */
+ ASSERT(base==NULL || HALFWORD_HEAP);
+
mpsp = get_match_pseudo_process(c_p, prog->heap_size);
psp = &mpsp->process;
@@ -1655,7 +1725,6 @@ Eterm db_prog_match(Process *c_p, Binary *bprog, Eterm term,
esdp = ERTS_GET_SCHEDULER_DATA_FROM_PROC(c_p);
ASSERT(esdp != NULL);
current_scheduled = esdp->current_process;
- esdp->current_process = psp;
/* SMP: psp->scheduler_data is set by get_match_pseudo_process */
atomic_trace = 0;
@@ -1678,11 +1747,9 @@ Eterm db_prog_match(Process *c_p, Binary *bprog, Eterm term,
#ifdef DMC_DEBUG
save_op = 0;
- heap_fence = (Uint *) mpsp->heap + prog->eheap_offset - 1;
- eheap_fence = (Uint *) mpsp->heap + prog->stack_offset - 1;
- stack_fence = (Uint *) mpsp->heap + prog->heap_size - 1;
+ heap_fence = (Eterm*)((char*) mpsp->u.heap + prog->stack_offset) - 1;
+ stack_fence = (Eterm*)((char*) mpsp->u.heap + prog->heap_size) - 1;
*heap_fence = FENCE_PATTERN;
- *eheap_fence = FENCE_PATTERN;
*stack_fence = FENCE_PATTERN;
#endif /* DMC_DEBUG */
@@ -1696,36 +1763,48 @@ Eterm db_prog_match(Process *c_p, Binary *bprog, Eterm term,
*return_flags = 0U;
+ variables = mpsp->u.variables;
+#if HALFWORD_HEAP
+ c_p_checkpoint.p = NULL;
+#endif
+
restart:
ep = &term;
- esp = mpsp->heap + prog->stack_offset;
+ esp = (Eterm*)((char*)mpsp->u.heap + prog->stack_offset);
sp = (Eterm **) esp;
- hp = mpsp->heap;
- ehp = mpsp->heap + prog->eheap_offset;
ret = am_true;
do_catch = 0;
fail_label = -1;
+ build_proc = psp;
+ esdp->current_process = psp;
+ ASSERT_HALFWORD(!c_p_checkpoint.p);
+
+#ifdef DEBUG
+ ASSERT(variables == mpsp->u.variables);
+ for (i=0; i<prog->num_bindings; i++) {
+ variables[i].term = THE_NON_VALUE;
+ variables[i].proc = NULL;
+ variables[i].base = base;
+ }
+#endif
for (;;) {
-#ifdef DMC_DEBUG
+
+ #ifdef DMC_DEBUG
if (*heap_fence != FENCE_PATTERN) {
erl_exit(1, "Heap fence overwritten in db_prog_match after op "
"0x%08x, overwritten with 0x%08x.", save_op, *heap_fence);
}
- if (*eheap_fence != FENCE_PATTERN) {
- erl_exit(1, "Eheap fence overwritten in db_prog_match after op "
- "0x%08x, overwritten with 0x%08x.", save_op,
- *eheap_fence);
- }
if (*stack_fence != FENCE_PATTERN) {
erl_exit(1, "Stack fence overwritten in db_prog_match after op "
"0x%08x, overwritten with 0x%08x.", save_op,
*stack_fence);
}
save_op = *pc;
-#endif
+ #endif
switch (*pc++) {
case matchTryMeElse:
+ ASSERT(fail_label == -1);
fail_label = *pc++;
break;
case matchArray: /* only when DCOMP_TRACE, is always first
@@ -1736,13 +1815,14 @@ restart:
ep = termp;
break;
case matchArrayBind: /* When the array size is unknown. */
+ ASSERT(termp);
n = *pc++;
- hp[n] = dpm_array_to_list(psp, termp, arity);
+ variables[n].term = dpm_array_to_list(psp, termp, arity);
break;
case matchTuple: /* *ep is a tuple of arity n */
- if (!is_tuple(*ep))
+ if (!is_tuple_rel(*ep,base))
FAIL();
- ep = tuple_val(*ep);
+ ep = tuple_val_rel(*ep,base);
n = *pc++;
if (arityval(*ep) != n)
FAIL();
@@ -1750,9 +1830,9 @@ restart:
break;
case matchPushT: /* *ep is a tuple of arity n,
push ptr to first element */
- if (!is_tuple(*ep))
+ if (!is_tuple_rel(*ep,base))
FAIL();
- tp = tuple_val(*ep);
+ tp = tuple_val_rel(*ep,base);
n = *pc++;
if (arityval(*tp) != n)
FAIL();
@@ -1762,12 +1842,12 @@ restart:
case matchList:
if (!is_list(*ep))
FAIL();
- ep = list_val(*ep);
+ ep = list_val_rel(*ep,base);
break;
case matchPushL:
if (!is_list(*ep))
FAIL();
- *sp++ = list_val(*ep);
+ *sp++ = list_val_rel(*ep,base);
++ep;
break;
case matchPop:
@@ -1775,41 +1855,44 @@ restart:
break;
case matchBind:
n = *pc++;
- hp[n] = *ep++;
+ variables[n].term = *ep++;
break;
case matchCmp:
n = *pc++;
- if (!eq(hp[n],*ep))
+ if (!eq_rel(variables[n].term, base, *ep, base))
FAIL();
++ep;
break;
case matchEqBin:
t = (Eterm) *pc++;
- if (!eq(*ep,t))
+ if (!eq_rel(t,NULL,*ep,base))
FAIL();
++ep;
break;
case matchEqFloat:
- if (!is_float(*ep))
+ if (!is_float_rel(*ep,base))
FAIL();
- if (memcmp(float_val(*ep) + 1, pc, sizeof(double)))
+ if (memcmp(float_val_rel(*ep,base) + 1, pc, sizeof(double)))
FAIL();
pc += TermWords(2);
++ep;
break;
- case matchEqRef:
- if (!is_ref(*ep))
+ case matchEqRef: {
+ Eterm* epc = (Eterm*)pc;
+ if (!is_ref_rel(*ep,base))
FAIL();
- if (!eq(*ep, make_internal_ref((Uint *) pc)))
+ if (!eq_rel(make_internal_ref_rel(epc, epc), epc, *ep, base)) {
FAIL();
- i = thing_arityval(*((Uint *) pc));
+ }
+ i = thing_arityval(*epc);
pc += TermWords(i+1);
++ep;
break;
+ }
case matchEqBig:
- if (!is_big(*ep))
+ if (!is_big_rel(*ep,base))
FAIL();
- tp = big_val(*ep);
+ tp = big_val_rel(*ep,base);
{
Eterm *epc = (Eterm *) pc;
if (*tp != *epc)
@@ -1825,7 +1908,8 @@ restart:
++ep;
break;
case matchEq:
- t = (Eterm) *pc++;
+ t = (Eterm) *pc++;
+ ASSERT(is_immed(t));
if (t != *ep++)
FAIL();
break;
@@ -1833,25 +1917,32 @@ restart:
++ep;
break;
/*
- * Here comes guard instructions
+ * Here comes guard & body instructions
*/
case matchPushC: /* Push constant */
- *esp++ = *pc++;
+ if ((in_flags & ERTS_PAM_COPY_RESULT)
+ && do_catch && !is_immed(*pc)) {
+ *esp++ = copy_object(*pc++, c_p);
+ }
+ else {
+ *esp++ = *pc++;
+ }
break;
case matchConsA:
- ehp[1] = *--esp;
- ehp[0] = esp[-1];
+ ehp = HAllocX(build_proc, 2, HEAP_XTRA);
+ CDR(ehp) = *--esp;
+ CAR(ehp) = esp[-1];
esp[-1] = make_list(ehp);
- ehp += 2;
break;
case matchConsB:
- ehp[0] = *--esp;
- ehp[1] = esp[-1];
+ ehp = HAllocX(build_proc, 2, HEAP_XTRA);
+ CAR(ehp) = *--esp;
+ CDR(ehp) = esp[-1];
esp[-1] = make_list(ehp);
- ehp += 2;
break;
case matchMkTuple:
n = *pc++;
+ ehp = HAllocX(build_proc, n+1, HEAP_XTRA);
t = make_tuple(ehp);
*ehp++ = make_arityval(n);
while (n--) {
@@ -1861,7 +1952,7 @@ restart:
break;
case matchCall0:
bif = (Eterm (*)(Process*, ...)) *pc++;
- t = (*bif)(psp);
+ t = (*bif)(build_proc);
if (is_non_value(t)) {
if (do_catch)
t = FAIL_TERM;
@@ -1872,7 +1963,7 @@ restart:
break;
case matchCall1:
bif = (Eterm (*)(Process*, ...)) *pc++;
- t = (*bif)(psp, esp[-1]);
+ t = (*bif)(build_proc, esp[-1]);
if (is_non_value(t)) {
if (do_catch)
t = FAIL_TERM;
@@ -1883,7 +1974,7 @@ restart:
break;
case matchCall2:
bif = (Eterm (*)(Process*, ...)) *pc++;
- t = (*bif)(psp, esp[-1], esp[-2]);
+ t = (*bif)(build_proc, esp[-1], esp[-2]);
if (is_non_value(t)) {
if (do_catch)
t = FAIL_TERM;
@@ -1895,7 +1986,7 @@ restart:
break;
case matchCall3:
bif = (Eterm (*)(Process*, ...)) *pc++;
- t = (*bif)(psp, esp[-1], esp[-2], esp[-3]);
+ t = (*bif)(build_proc, esp[-1], esp[-2], esp[-3]);
if (is_non_value(t)) {
if (do_catch)
t = FAIL_TERM;
@@ -1905,15 +1996,73 @@ restart:
esp -= 2;
esp[-1] = t;
break;
+
+ #if HALFWORD_HEAP
+ case matchPushVGuard:
+ if (!base) goto case_matchPushV;
+ /* Build NULL-based copy on pseudo heap for easy disposal */
+ n = *pc++;
+ ASSERT(is_value(variables[n].term));
+ ASSERT(!variables[n].proc);
+ variables[n].term = copy_object_rel(psp, variables[n].term, base);
+ *esp++ = variables[n].term;
+ #ifdef DEBUG
+ variables[n].proc = psp;
+ variables[n].base = NULL;
+ #endif
+ break;
+ #endif
+ case matchPushVResult:
+ if (!(in_flags & ERTS_PAM_COPY_RESULT)) goto case_matchPushV;
+
+ /* Build (NULL-based) copy on callers heap */
+ #if HALFWORD_HEAP
+ if (!do_catch && !c_p_checkpoint.p) {
+ heap_checkpoint_init(c_p, &c_p_checkpoint);
+ }
+ #endif
+ n = *pc++;
+ ASSERT(is_value(variables[n].term));
+ ASSERT(!variables[n].proc);
+ variables[n].term = copy_object_rel(c_p, variables[n].term, base);
+ *esp++ = variables[n].term;
+ #ifdef DEBUG
+ variables[n].proc = c_p;
+ variables[n].base = NULL;
+ #endif
+ break;
case matchPushV:
- *esp++ = hp[*pc++];
+ case_matchPushV:
+ n = *pc++;
+ ASSERT(is_value(variables[n].term));
+ ASSERT(!variables[n].base);
+ *esp++ = variables[n].term;
break;
case matchPushExpr:
- *esp++ = term;
+ if (in_flags & ERTS_PAM_COPY_RESULT) {
+ Uint sz;
+ Eterm* top;
+ sz = size_object_rel(term, base);
+ top = HAllocX(build_proc, sz, HEAP_XTRA);
+ if (in_flags & ERTS_PAM_CONTIGUOUS_TUPLE) {
+ ASSERT(is_tuple_rel(term,base));
+ *esp++ = copy_shallow_rel(tuple_val_rel(term,base), sz,
+ &top, &MSO(build_proc), base);
+ }
+ else {
+ *esp++ = copy_struct_rel(term, sz, &top, &MSO(build_proc),
+ base, NULL);
+ }
+ }
+ else {
+ *esp = term;
+ }
break;
case matchPushArrayAsList:
+ ASSERT_HALFWORD(base == NULL);
n = arity; /* Only happens when 'term' is an array */
tp = termp;
+ ehp = HAllocX(build_proc, n*2, HEAP_XTRA);
*esp++ = make_list(ehp);
while (n--) {
*ehp++ = *tp++;
@@ -1926,7 +2075,8 @@ restart:
break;
case matchPushArrayAsListU:
/* This instruction is NOT efficient. */
- *esp++ = dpm_array_to_list(psp, termp, arity);
+ ASSERT_HALFWORD(base == NULL);
+ *esp++ = dpm_array_to_list(build_proc, termp, arity);
break;
case matchTrue:
if (*--esp != am_true)
@@ -2012,7 +2162,8 @@ restart:
case matchProcessDump: {
erts_dsprintf_buf_t *dsbufp = erts_create_tmp_dsbuf(0);
print_process_info(ERTS_PRINT_DSBUF, (void *) dsbufp, c_p);
- *esp++ = new_binary(psp, (byte *)dsbufp->str, (int)dsbufp->str_len);
+ *esp++ = new_binary(build_proc, (byte *)dsbufp->str,
+ dsbufp->str_len);
erts_destroy_tmp_dsbuf(dsbufp);
break;
}
@@ -2056,29 +2207,24 @@ restart:
if (SEQ_TRACE_TOKEN(c_p) == NIL)
*esp++ = NIL;
else {
+ Eterm sender = SEQ_TRACE_TOKEN_SENDER(c_p);
+ Uint sender_sz = is_immed(sender) ? 0 : size_object(sender);
+ ehp = HAllocX(build_proc, 6 + sender_sz, HEAP_XTRA);
+ if (sender_sz) {
+ sender = copy_struct(sender, sender_sz, &ehp, &MSO(build_proc));
+ }
*esp++ = make_tuple(ehp);
ehp[0] = make_arityval(5);
ehp[1] = SEQ_TRACE_TOKEN_FLAGS(c_p);
ehp[2] = SEQ_TRACE_TOKEN_LABEL(c_p);
ehp[3] = SEQ_TRACE_TOKEN_SERIAL(c_p);
- ehp[4] = SEQ_TRACE_TOKEN_SENDER(c_p);
+ ehp[4] = sender;
ehp[5] = SEQ_TRACE_TOKEN_LASTCNT(c_p);
ASSERT(SEQ_TRACE_TOKEN_ARITY(c_p) == 5);
ASSERT(is_immed(ehp[1]));
ASSERT(is_immed(ehp[2]));
ASSERT(is_immed(ehp[3]));
ASSERT(is_immed(ehp[5]));
- if(!is_immed(ehp[4])) {
- Eterm *sender = &ehp[4];
- ehp += 6;
- *sender = copy_struct(*sender,
- size_object(*sender),
- &ehp,
- &MSO(psp));
- }
- else
- ehp += 6;
-
}
break;
case matchEnableTrace:
@@ -2127,12 +2273,12 @@ restart:
if (!(c_p->cp) || !(cp = find_function_from_pc(c_p->cp))) {
*esp++ = am_undefined;
} else {
+ ehp = HAllocX(build_proc, 4, HEAP_XTRA);
*esp++ = make_tuple(ehp);
ehp[0] = make_arityval(3);
ehp[1] = cp[0];
ehp[2] = cp[1];
ehp[3] = make_small((Uint) cp[2]);
- ehp += 4;
}
break;
case matchSilent:
@@ -2209,8 +2355,12 @@ restart:
}
}
break;
- case matchCatch:
+ case matchCatch: /* Match success, now build result */
do_catch = 1;
+ if (in_flags & ERTS_PAM_COPY_RESULT) {
+ build_proc = c_p;
+ esdp->current_process = c_p;
+ }
break;
case matchHalt:
goto success;
@@ -2219,9 +2369,16 @@ restart:
}
}
fail:
+#if HALFWORD_HEAP
+ if (c_p_checkpoint.p) {
+ /* Dispose garbage built by guards on caller heap */
+ heap_checkpoint_revert(&c_p_checkpoint);
+ c_p_checkpoint.p = NULL;
+ }
+#endif
*return_flags = 0U;
- if (fail_label >= 0) { /* We failed during a "TryMeElse",
- lets restart, with the next match
+ if (fail_label >= 0) { /* We failed during a "TryMeElse",
+ lets restart, with the next match
program */
pc = (prog->text) + fail_label;
cleanup_match_pseudo_process(mpsp, 1);
@@ -2235,11 +2392,6 @@ success:
erl_exit(1, "Heap fence overwritten in db_prog_match after op "
"0x%08x, overwritten with 0x%08x.", save_op, *heap_fence);
}
- if (*eheap_fence != FENCE_PATTERN) {
- erl_exit(1, "Eheap fence overwritten in db_prog_match after op "
- "0x%08x, overwritten with 0x%08x.", save_op,
- *eheap_fence);
- }
if (*stack_fence != FENCE_PATTERN) {
erl_exit(1, "Stack fence overwritten in db_prog_match after op "
"0x%08x, overwritten with 0x%08x.", save_op,
@@ -2250,6 +2402,7 @@ success:
esdp->current_process = current_scheduled;
END_ATOMIC_TRACE(c_p);
+
return ret;
#undef FAIL
#undef FAIL_TERM
@@ -2261,7 +2414,8 @@ success:
/*
* Convert a match program to a "magic" binary to return up to erlang
*/
-Eterm db_make_mp_binary(Process *p, Binary *mp, Eterm **hpp) {
+Eterm db_make_mp_binary(Process *p, Binary *mp, Eterm **hpp)
+{
return erts_mk_magic_binary_term(hpp, &MSO(p), mp);
}
@@ -2327,13 +2481,13 @@ void db_free_dmc_err_info(DMCErrInfo *ei){
** Store bignum in *hpp and increase *hpp accordingly.
** *hpp is assumed to be large enough to hold the result.
*/
-Eterm db_add_counter(Eterm** hpp, Eterm counter, Eterm incr)
+Eterm db_add_counter(Eterm** hpp, Wterm counter, Eterm incr)
{
DeclareTmpHeapNoproc(big_tmp,2);
Eterm res;
Sint ires;
- Eterm arg1;
- Eterm arg2;
+ Wterm arg1;
+ Wterm arg2;
if (is_both_small(counter,incr)) {
ires = signed_val(counter) + signed_val(incr);
@@ -2374,6 +2528,34 @@ Eterm db_add_counter(Eterm** hpp, Eterm counter, Eterm incr)
}
}
+/* Must be called to read elements after db_lookup_dbterm.
+** Will decompress if needed.
+** HEALFWORD_HEAP:
+** Will convert from relative to Wterm format if needed.
+** (but only on top level, tuples and lists will still contain rterms)
+*/
+Wterm db_do_read_element(DbUpdateHandle* handle, Sint position)
+{
+ Eterm elem = handle->dbterm->tpl[position];
+ if (!is_header(elem)) {
+#if HALFWORD_HEAP
+ if (!is_immed(elem)
+ && !handle->tb->common.compress
+ && !(handle->abs_vec && handle->abs_vec[position])) {
+ return rterm2wterm(elem, handle->dbterm->tpl);
+ }
+#endif
+ return elem;
+ }
+
+ ASSERT(((DbTableCommon*)handle->tb)->compress);
+ ASSERT(!handle->mustResize);
+ handle->dbterm = db_alloc_tmp_uncompressed(&handle->tb->common,
+ handle->dbterm);
+ handle->mustResize = 1;
+ return handle->dbterm->tpl[position];
+}
+
/*
** Update one element:
** handle: Initialized by db_lookup_dbterm()
@@ -2390,14 +2572,17 @@ void db_do_update_element(DbUpdateHandle* handle,
Eterm* oldp;
Uint newval_sz;
Uint oldval_sz;
+#if HALFWORD_HEAP
+ Eterm* old_base;
+#endif
if (is_both_immed(newval,oldval)) {
handle->dbterm->tpl[position] = newval;
-#ifdef DEBUG_CLONE
+ #ifdef DEBUG_CLONE
if (handle->dbterm->debug_clone) {
handle->dbterm->debug_clone[position] = newval;
}
-#endif
+ #endif
return;
}
if (!handle->mustResize) {
@@ -2406,49 +2591,78 @@ void db_do_update_element(DbUpdateHandle* handle,
handle->dbterm);
handle->mustResize = 1;
oldval = handle->dbterm->tpl[position];
+ #if HALFWORD_HEAP
+ old_base = NULL;
+ #endif
}
- else if (is_boxed(newval)) {
- newp = boxed_val(newval);
- switch (*newp & _TAG_HEADER_MASK) {
- case _TAG_HEADER_POS_BIG:
- case _TAG_HEADER_NEG_BIG:
- case _TAG_HEADER_FLOAT:
- case _TAG_HEADER_HEAP_BIN:
- newval_sz = header_arity(*newp) + 1;
- if (is_boxed(oldval)) {
- oldp = boxed_val(oldval);
- switch (*oldp & _TAG_HEADER_MASK) {
- case _TAG_HEADER_POS_BIG:
- case _TAG_HEADER_NEG_BIG:
- case _TAG_HEADER_FLOAT:
- case _TAG_HEADER_HEAP_BIN:
- oldval_sz = header_arity(*oldp) + 1;
- if (oldval_sz == newval_sz) {
- /* "self contained" terms of same size, do memcpy */
- sys_memcpy(oldp, newp, newval_sz*sizeof(Eterm));
- return;
+ else {
+ #if HALFWORD_HEAP
+ ASSERT(!handle->abs_vec);
+ old_base = handle->dbterm->tpl;
+ #endif
+ if (is_boxed(newval)) {
+ newp = boxed_val(newval);
+ switch (*newp & _TAG_HEADER_MASK) {
+ case _TAG_HEADER_POS_BIG:
+ case _TAG_HEADER_NEG_BIG:
+ case _TAG_HEADER_FLOAT:
+ case _TAG_HEADER_HEAP_BIN:
+ newval_sz = header_arity(*newp) + 1;
+ if (is_boxed(oldval)) {
+ oldp = boxed_val_rel(oldval,old_base);
+ switch (*oldp & _TAG_HEADER_MASK) {
+ case _TAG_HEADER_POS_BIG:
+ case _TAG_HEADER_NEG_BIG:
+ case _TAG_HEADER_FLOAT:
+ case _TAG_HEADER_HEAP_BIN:
+ oldval_sz = header_arity(*oldp) + 1;
+ if (oldval_sz == newval_sz) {
+ /* "self contained" terms of same size, do memcpy */
+ sys_memcpy(oldp, newp, newval_sz*sizeof(Eterm));
+ return;
+ }
+ goto both_size_set;
}
- goto both_size_set;
}
+ goto new_size_set;
}
- goto new_size_set;
}
}
}
+#if HALFWORD_HEAP
+ else {
+ old_base = (handle->tb->common.compress
+ || (handle->abs_vec && handle->abs_vec[position])) ?
+ NULL : handle->dbterm->tpl;
+ }
+#endif
/* Not possible for simple memcpy or dbterm is already non-contiguous, */
/* need to realloc... */
newval_sz = is_immed(newval) ? 0 : size_object(newval);
new_size_set:
-
- oldval_sz = is_immed(oldval) ? 0 : size_object(oldval);
+
+ oldval_sz = is_immed(oldval) ? 0 : size_object_rel(oldval,old_base);
both_size_set:
handle->new_size = handle->new_size - oldval_sz + newval_sz;
- /* write new value in old dbterm, finalize will make a flat copy */
+ /* write new value in old dbterm, finalize will make a flat copy */
handle->dbterm->tpl[position] = newval;
handle->mustResize = 1;
+
+#if HALFWORD_HEAP
+ if (old_base && newval_sz > 0) {
+ ASSERT(!handle->tb->common.compress);
+ if (!handle->abs_vec) {
+ int i = header_arity(handle->dbterm->tpl[0]);
+ handle->abs_vec = erts_alloc(ERTS_ALC_T_TMP, (i+1)*sizeof(char));
+ sys_memset(handle->abs_vec, 0, i+1);
+ /* abs_vec[0] not used */
+ }
+ handle->abs_vec[position] = 1;
+ }
+#endif
}
static ERTS_INLINE byte* db_realloc_term(DbTableCommon* tb, void* old,
@@ -2547,7 +2761,7 @@ static void* copy_to_comp(DbTableCommon* tb, Eterm obj, DbTerm* dest,
tpl[arity + 1] = alloc_size;
tmp_offheap.first = NULL;
- tpl[tb->keypos] = copy_struct(key, size_object(key), &top.ep, &tmp_offheap);
+ tpl[tb->keypos] = copy_struct_rel(key, size_object(key), &top.ep, &tmp_offheap, NULL, tpl);
dest->first_oh = tmp_offheap.first;
for (i=1; i<=arity; i++) {
if (i != tb->keypos) {
@@ -2566,7 +2780,7 @@ static void* copy_to_comp(DbTableCommon* tb, Eterm obj, DbTerm* dest,
Eterm* dbg_top = erts_alloc(ERTS_ALC_T_DB_TERM, dest->size * sizeof(Eterm));
dest->debug_clone = dbg_top;
tmp_offheap.first = dest->first_oh;
- copy_struct(obj, dest->size, &dbg_top, &tmp_offheap);
+ copy_struct_rel(obj, dest->size, &dbg_top, &tmp_offheap, NULL, dbg_top);
dest->first_oh = tmp_offheap.first;
ASSERT(dbg_top == dest->debug_clone + dest->size);
}
@@ -2613,7 +2827,7 @@ void* db_store_term(DbTableCommon *tb, DbTerm* old, Uint offset, Eterm obj)
newp->size = size;
top = newp->tpl;
tmp_offheap.first = NULL;
- copy_struct(obj, size, &top, &tmp_offheap);
+ copy_struct_rel(obj, size, &top, &tmp_offheap, NULL, top);
newp->first_oh = tmp_offheap.first;
#ifdef DEBUG_CLONE
newp->debug_clone = NULL;
@@ -2652,7 +2866,7 @@ void* db_store_term_comp(DbTableCommon *tb, DbTerm* old, Uint offset, Eterm obj)
top = copy_to_comp(tb, obj, newp, new_sz);
ASSERT(top <= basep + new_sz);
- // SVERK: realloc?
+ /* ToDo: Maybe realloc if ((basep+new_sz) - top) > WASTED_SPACE_LIMIT */
return basep;
}
@@ -2673,6 +2887,9 @@ void db_finalize_resize(DbUpdateHandle* handle, Uint offset)
*(handle->bp) = newp;
newDbTerm = (DbTerm*) (newp + offset);
newDbTerm->size = handle->new_size;
+#ifdef DEBUG_CLONE
+ newDbTerm->debug_clone = NULL;
+#endif
/* make a flat copy */
@@ -2682,17 +2899,38 @@ void db_finalize_resize(DbUpdateHandle* handle, Uint offset)
db_free_tmp_uncompressed(handle->dbterm);
}
else {
- Eterm* top;
ErlOffHeap tmp_offheap;
+ Eterm* tpl = handle->dbterm->tpl;
+ Eterm* top = newDbTerm->tpl;
+
tmp_offheap.first = NULL;
- top = newDbTerm->tpl;
- copy_struct(make_tuple(handle->dbterm->tpl), handle->new_size,
- &top, &tmp_offheap);
- newDbTerm->first_oh = tmp_offheap.first;
-#ifdef DEBUG_CLONE
- newDbTerm->debug_clone = NULL;
-#endif
- ASSERT((byte*)top <= (newp + alloc_sz));
+
+ #if HALFWORD_HEAP
+ if (handle->abs_vec) {
+ int i, arity = header_arity(handle->dbterm->tpl[0]);
+
+ top[0] = tpl[0];
+ top += arity + 1;
+ for (i=1; i<=arity; i++) {
+ Eterm* src_base = handle->abs_vec[i] ? NULL : tpl;
+
+ newDbTerm->tpl[i] = copy_struct_rel(tpl[i],
+ size_object_rel(tpl[i],src_base),
+ &top, &tmp_offheap, src_base,
+ newDbTerm->tpl);
+ }
+ newDbTerm->first_oh = tmp_offheap.first;
+ ASSERT((byte*)top <= (newp + alloc_sz));
+ erts_free(ERTS_ALC_T_TMP, handle->abs_vec);
+ }
+ else
+ #endif /* HALFWORD_HEAP */
+ {
+ copy_struct_rel(make_tuple_rel(tpl,tpl), handle->new_size, &top,
+ &tmp_offheap, tpl, top);
+ newDbTerm->first_oh = tmp_offheap.first;
+ ASSERT((byte*)top == (newp + alloc_sz));
+ }
}
}
@@ -2705,9 +2943,9 @@ Eterm db_copy_from_comp(DbTableCommon* tb, DbTerm* bp, Eterm** hpp,
hp[0] = bp->tpl[0];
*hpp += arity + 1;
- hp[tb->keypos] = copy_struct(bp->tpl[tb->keypos],
- size_object(bp->tpl[tb->keypos]),
- hpp, off_heap);
+ hp[tb->keypos] = copy_struct_rel(bp->tpl[tb->keypos],
+ size_object_rel(bp->tpl[tb->keypos], bp->tpl),
+ hpp, off_heap, bp->tpl, NULL);
for (i=arity; i>0; i--) {
if (i != tb->keypos) {
if (is_immed(bp->tpl[i])) {
@@ -2721,7 +2959,7 @@ Eterm db_copy_from_comp(DbTableCommon* tb, DbTerm* bp, Eterm** hpp,
}
ASSERT((*hpp - hp) <= bp->size);
#ifdef DEBUG_CLONE
- ASSERT(eq(make_tuple(hp),make_tuple(bp->debug_clone)));
+ ASSERT(eq_rel(make_tuple(hp),make_tuple(bp->debug_clone),bp->debug_clone));
#endif
return make_tuple(hp);
}
@@ -2744,14 +2982,14 @@ Eterm db_copy_element_from_ets(DbTableCommon* tb, Process* p,
hp += extra;
HRelease(p, endp, hp);
#ifdef DEBUG_CLONE
- ASSERT(eq(copy,obj->debug_clone[pos]));
+ ASSERT(eq_rel(copy, obj->debug_clone[pos], obj->debug_clone));
#endif
return copy;
}
else {
- Uint sz = size_object(obj->tpl[pos]);
+ Uint sz = size_object_rel(obj->tpl[pos], obj->tpl);
*hpp = HAlloc(p, sz + extra);
- return copy_struct(obj->tpl[pos], sz, hpp, &MSO(p));
+ return copy_struct_rel(obj->tpl[pos], sz, hpp, &MSO(p), obj->tpl, NULL);
}
}
@@ -2765,7 +3003,7 @@ void db_cleanup_offheap_comp(DbTerm* obj)
ProcBin tmp;
for (u.hdr = obj->first_oh; u.hdr; u.hdr = u.hdr->next) {
- if ((UWord)u.voidp % sizeof(UWord) != 0) { /* unaligned ptr */
+ if ((UWord)u.voidp % sizeof(Uint) != 0) { /* unaligned ptr */
sys_memcpy(&tmp, u.voidp, sizeof(tmp));
/* Warning, must pass (void*)-variable to memcpy. Otherwise it will
cause Bus error on Sparc due to false compile time assumptions
@@ -2961,7 +3199,7 @@ static DMCRet dmc_one_term(DMCContext *context,
** Ouch, big integer in match variable.
*/
Eterm *save_hp;
- ASSERT(heap->data == heap->def);
+ ASSERT(heap->vars == heap->vars_def);
sz = sz2 = sz3 = 0;
for (j = 0; j < context->num_match; ++j) {
sz += size_object(context->matchexpr[j]);
@@ -2999,24 +3237,23 @@ static DMCRet dmc_one_term(DMCContext *context,
may be atoms that changed */
context->matchexpr[j] = context->copy->mem[j];
}
- heap->data = erts_alloc(ERTS_ALC_T_DB_MS_CMPL_HEAP,
- heap->size*sizeof(unsigned));
- sys_memset(heap->data, 0,
- heap->size * sizeof(unsigned));
+ heap->vars = erts_alloc(ERTS_ALC_T_DB_MS_CMPL_HEAP,
+ heap->size*sizeof(DMCVariable));
+ sys_memset(heap->vars, 0, heap->size * sizeof(DMCVariable));
DMC_CLEAR(*stack);
/*DMC_PUSH(*stack,NIL);*/
DMC_CLEAR(*text);
return retRestart;
}
- if (heap->data[n]) { /* already bound ? */
+ if (heap->vars[n].is_bound) {
DMC_PUSH(*text,matchCmp);
DMC_PUSH(*text,n);
} else { /* Not bound, bind! */
- if (n >= heap->used)
- heap->used = n + 1;
+ if (n >= heap->vars_used)
+ heap->vars_used = n + 1;
DMC_PUSH(*text,matchBind);
DMC_PUSH(*text,n);
- heap->data[n] = 1;
+ heap->vars[n].is_bound = 1;
}
} else if (c == am_Underscore) {
DMC_PUSH(*text, matchSkip);
@@ -3041,6 +3278,8 @@ static DMCRet dmc_one_term(DMCContext *context,
DMC_PUSH(*stack, c);
break;
case (_TAG_HEADER_REF >> _TAG_PRIMARY_SIZE):
+ {
+ Eterm* ref_val = internal_ref_val(c);
DMC_PUSH(*text, matchEqRef);
#if HALFWORD_HEAP
{
@@ -3048,25 +3287,27 @@ static DMCRet dmc_one_term(DMCContext *context,
UWord u;
Uint t[2];
} fiddle;
- ASSERT(thing_arityval(*internal_ref_val(c)) == 3);
- fiddle.t[0] = *internal_ref_val(c);
- fiddle.t[1] = (Uint) internal_ref_val(c)[1];
+ ASSERT(thing_arityval(ref_val[0]) == 3);
+ fiddle.t[0] = ref_val[0];
+ fiddle.t[1] = ref_val[1];
DMC_PUSH(*text, fiddle.u);
- fiddle.t[0] = (Uint) internal_ref_val(c)[2];
- fiddle.t[1] = (Uint) internal_ref_val(c)[3];
+ fiddle.t[0] = ref_val[2];
+ fiddle.t[1] = ref_val[3];
DMC_PUSH(*text, fiddle.u);
}
#else
- n = thing_arityval(*internal_ref_val(c));
- DMC_PUSH(*text, *internal_ref_val(c));
- for (i = 1; i <= n; ++i) {
- DMC_PUSH(*text, (Uint) internal_ref_val(c)[i]);
+ n = thing_arityval(ref_val[0]);
+ for (i = 0; i <= n; ++i) {
+ DMC_PUSH(*text, ref_val[i]);
}
#endif
break;
+ }
case (_TAG_HEADER_POS_BIG >> _TAG_PRIMARY_SIZE):
case (_TAG_HEADER_NEG_BIG >> _TAG_PRIMARY_SIZE):
- n = thing_arityval(*big_val(c));
+ {
+ Eterm* bval = big_val(c);
+ n = thing_arityval(bval[0]);
DMC_PUSH(*text, matchEqBig);
#if HALFWORD_HEAP
{
@@ -3075,13 +3316,13 @@ static DMCRet dmc_one_term(DMCContext *context,
Uint t[2];
} fiddle;
ASSERT(n >= 1);
- fiddle.t[0] = *big_val(c);
- fiddle.t[1] = big_val(c)[1];
+ fiddle.t[0] = bval[0];
+ fiddle.t[1] = bval[1];
DMC_PUSH(*text, fiddle.u);
for (i = 2; i <= n; ++i) {
- fiddle.t[0] = big_val(c)[i];
+ fiddle.t[0] = bval[i];
if (++i <= n) {
- fiddle.t[1] = big_val(c)[i];
+ fiddle.t[1] = bval[i];
} else {
fiddle.t[1] = (Uint) 0;
}
@@ -3089,12 +3330,12 @@ static DMCRet dmc_one_term(DMCContext *context,
}
}
#else
- DMC_PUSH(*text, *big_val(c));
- for (i = 1; i <= n; ++i) {
- DMC_PUSH(*text, (Uint) big_val(c)[i]);
+ for (i = 0; i <= n; ++i) {
+ DMC_PUSH(*text, (Uint) bval[i]);
}
#endif
break;
+ }
case (_TAG_HEADER_FLOAT >> _TAG_PRIMARY_SIZE):
DMC_PUSH(*text,matchEqFloat);
#if HALFWORD_HEAP
@@ -3227,7 +3468,6 @@ static DMCRet dmc_list(DMCContext *context,
DMC_PUSH(*text, matchConsB);
}
--context->stack_used; /* Two objects on stack becomes one */
- context->eheap_need += 2;
return retOk;
}
@@ -3286,7 +3526,6 @@ static DMCRet dmc_tuple(DMCContext *context,
DMC_PUSH(*text, matchMkTuple);
DMC_PUSH(*text, nelems);
context->stack_used -= (nelems - 1);
- context->eheap_need += (nelems + 1);
*constant = 0;
return retOk;
}
@@ -3304,9 +3543,6 @@ static DMCRet dmc_whole_expression(DMCContext *context,
} else {
ASSERT(is_tuple(context->matchexpr
[context->current_match]));
- context->eheap_need +=
- arityval(*(tuple_val(context->matchexpr
- [context->current_match]))) * 2;
DMC_PUSH(*text, matchPushArrayAsList);
}
} else {
@@ -3319,6 +3555,41 @@ static DMCRet dmc_whole_expression(DMCContext *context,
return retOk;
}
+/* Figure out which PushV instruction to use.
+*/
+static void dmc_add_pushv_variant(DMCContext *context, DMCHeap *heap,
+ DMC_STACK_TYPE(UWord) *text, Uint n)
+{
+ DMCVariable* v = &heap->vars[n];
+ MatchOps instr = matchPushV;
+
+ ASSERT(n < heap->vars_used && v->is_bound);
+ if (context->is_guard) {
+ #if HALFWORD_HEAP
+ if (!v->first_guard_label) {
+ v->first_guard_label = DMC_STACK_NUM(*text);
+ ASSERT(v->first_guard_label);
+ instr = matchPushVGuard; /* may be changed to PushVResult below */
+ }
+ #endif
+ }
+ else { /* body */
+ #if HALFWORD_HEAP
+ if (v->first_guard_label) {
+ /* Avoid double-copy, copy to result heap at first encounter in guard */
+ DMC_POKE(*text, v->first_guard_label, matchPushVResult);
+ v->is_in_body = 1;
+ }
+ #endif
+ if (!v->is_in_body) {
+ instr = matchPushVResult;
+ v->is_in_body = 1;
+ }
+ }
+ DMC_PUSH(*text, instr);
+ DMC_PUSH(*text, n);
+}
+
static DMCRet dmc_variable(DMCContext *context,
DMCHeap *heap,
DMC_STACK_TYPE(UWord) *text,
@@ -3326,13 +3597,13 @@ static DMCRet dmc_variable(DMCContext *context,
int *constant)
{
Uint n = db_is_variable(t);
- ASSERT(n >= 0);
- if (n >= heap->used)
- RETURN_VAR_ERROR("Variable $%d is unbound.", n, context, *constant);
- if (heap->data[n] == 0U)
+
+ if (n >= heap->vars_used || !heap->vars[n].is_bound) {
RETURN_VAR_ERROR("Variable $%d is unbound.", n, context, *constant);
- DMC_PUSH(*text, matchPushV);
- DMC_PUSH(*text, n);
+ }
+
+ dmc_add_pushv_variant(context, heap, text, n);
+
++context->stack_used;
if (context->stack_used > context->stack_need)
context->stack_need = context->stack_used;
@@ -3351,10 +3622,9 @@ static DMCRet dmc_all_bindings(DMCContext *context,
DMC_PUSH(*text, matchPushC);
DMC_PUSH(*text, NIL);
- for (i = heap->used - 1; i >= 0; --i) {
- if (heap->data[i]) {
- DMC_PUSH(*text, matchPushV);
- DMC_PUSH(*text, i);
+ for (i = heap->vars_used - 1; i >= 0; --i) {
+ if (heap->vars[i].is_bound) {
+ dmc_add_pushv_variant(context, heap, text, i);
DMC_PUSH(*text, matchConsB);
heap_used += 2;
}
@@ -3362,7 +3632,6 @@ static DMCRet dmc_all_bindings(DMCContext *context,
++context->stack_used;
if ((context->stack_used + 1) > context->stack_need)
context->stack_need = (context->stack_used + 1);
- context->eheap_need += heap_used;
*constant = 0;
return retOk;
}
@@ -3765,10 +4034,6 @@ static DMCRet dmc_get_seq_token(DMCContext *context,
*constant = 0;
DMC_PUSH(*text, matchGetSeqToken);
- context->eheap_need += (6 /* A 5-tuple is built */
- + EXTERNAL_THING_HEAD_SIZE + 2 /* Sender can
- be an external
- pid */);
if (++context->stack_used > context->stack_need)
context->stack_need = context->stack_used;
return retOk;
@@ -4065,7 +4330,6 @@ static DMCRet dmc_caller(DMCContext *context,
}
*constant = 0;
DMC_PUSH(*text, matchCaller); /* Creates binary */
- context->eheap_need += 4; /* A 3-tuple is built */
if (++context->stack_used > context->stack_need)
context->stack_need = context->stack_used;
return retOk;
@@ -4663,7 +4927,8 @@ static Eterm match_spec_test(Process *p, Eterm against, Eterm spec, int trace)
}
save_cp = p->cp;
p->cp = NULL;
- res = erts_match_set_run(p, mps, arr, n, &ret_flags);
+ res = erts_match_set_run(p, mps, arr, n,
+ ERTS_PAM_COPY_RESULT, &ret_flags);
p->cp = save_cp;
} else {
n = 0;
@@ -4676,11 +4941,10 @@ static Eterm match_spec_test(Process *p, Eterm against, Eterm spec, int trace)
if (is_non_value(res)) {
res = am_false;
}
- sz = size_object(res);
+ sz = 0;
if (ret_flags & MATCH_SET_EXCEPTION_TRACE) sz += 2;
if (ret_flags & MATCH_SET_RETURN_TRACE) sz += 2;
hp = HAlloc(p, 5 + sz);
- res = copy_struct(res, sz, &hp, &MSO(p));
flg = NIL;
if (ret_flags & MATCH_SET_EXCEPTION_TRACE) {
flg = CONS(hp, am_exception_trace, flg);
@@ -4735,28 +4999,24 @@ void db_free_tmp_uncompressed(DbTerm* obj)
erts_free(ERTS_ALC_T_TMP, obj);
}
-Eterm db_prog_match_and_copy(DbTableCommon* tb, Process* c_p, Binary* bprog,
+Eterm db_match_dbterm(DbTableCommon* tb, Process* c_p, Binary* bprog,
int all, DbTerm* obj, Eterm** hpp, Uint extra)
{
Uint32 dummy;
+ Eterm* base;
Eterm res;
if (tb->compress) {
obj = db_alloc_tmp_uncompressed(tb, obj);
+ base = NULL;
}
+ else base = HALFWORD_HEAP ? obj->tpl : NULL;
- res = db_prog_match(c_p, bprog, make_tuple(obj->tpl), NULL, 0, &dummy);
+ res = db_prog_match(c_p, bprog, make_tuple_rel(obj->tpl,base), base, NULL, 0,
+ ERTS_PAM_COPY_RESULT|ERTS_PAM_CONTIGUOUS_TUPLE, &dummy);
if (is_value(res) && hpp!=NULL) {
- if (all) {
- *hpp = HAlloc(c_p, obj->size + extra);
- res = copy_shallow(obj->tpl, obj->size, hpp, &MSO(c_p));
- }
- else {
- Uint sz = size_object(res);
- *hpp = HAlloc(c_p, sz + extra);
- res = copy_struct(res, sz, hpp, &MSO(c_p));
- }
+ *hpp = HAlloc(c_p, extra);
}
if (tb->compress) {
@@ -4767,10 +5027,11 @@ Eterm db_prog_match_and_copy(DbTableCommon* tb, Process* c_p, Binary* bprog,
#ifdef DMC_DEBUG
+
/*
** Disassemble match program
*/
-static void db_match_dis(Binary *bp)
+void db_match_dis(Binary *bp)
{
MatchProg *prog = Binary2MatchProg(bp);
UWord *t = prog->text;
@@ -4785,31 +5046,31 @@ static void db_match_dis(Binary *bp)
++t;
n = *t;
++t;
- erts_printf("TryMeElse\t%bpu\n", n);
+ erts_printf("TryMeElse\t%beu\n", n);
break;
case matchArray:
++t;
n = *t;
++t;
- erts_printf("Array\t%bpu\n", n);
+ erts_printf("Array\t%beu\n", n);
break;
case matchArrayBind:
++t;
n = *t;
++t;
- erts_printf("ArrayBind\t%bpu\n", n);
+ erts_printf("ArrayBind\t%beu\n", n);
break;
case matchTuple:
++t;
n = *t;
++t;
- erts_printf("Tuple\t%bpu\n", n);
+ erts_printf("Tuple\t%beu\n", n);
break;
case matchPushT:
++t;
n = *t;
++t;
- erts_printf("PushT\t%bpu\n", n);
+ erts_printf("PushT\t%beu\n", n);
break;
case matchPushL:
++t;
@@ -4823,13 +5084,13 @@ static void db_match_dis(Binary *bp)
++t;
n = *t;
++t;
- erts_printf("Bind\t%bpu\n", n);
+ erts_printf("Bind\t%beu\n", n);
break;
case matchCmp:
++t;
n = *t;
++t;
- erts_printf("Cmp\t%bpu\n", n);
+ erts_printf("Cmp\t%beu\n", n);
break;
case matchEqBin:
++t;
@@ -4851,9 +5112,9 @@ static void db_match_dis(Binary *bp)
else
erts_printf(", ");
#if defined(ARCH_64) && !HALFWORD_HEAP
- erts_printf("0x%016bpx", rt->data.ui[ri]);
+ erts_printf("0x%016bex", rt->data.ui[ri]);
#else
- erts_printf("0x%08bpx", rt->data.ui[ri]);
+ erts_printf("0x%08bex", rt->data.ui[ri]);
#endif
}
}
@@ -4875,9 +5136,9 @@ static void db_match_dis(Binary *bp)
else
erts_printf(", ");
#if defined(ARCH_64) && !HALFWORD_HEAP
- erts_printf("0x%016bpx", *et);
+ erts_printf("0x%016bex", *et);
#else
- erts_printf("0x%08bpx", *et);
+ erts_printf("0x%08bex", *et);
#endif
++et;
}
@@ -4929,31 +5190,31 @@ static void db_match_dis(Binary *bp)
++t;
n = *t;
++t;
- erts_printf("MkTuple\t%bpu\n", n);
+ erts_printf("MkTuple\t%beu\n", n);
break;
case matchOr:
++t;
n = *t;
++t;
- erts_printf("Or\t%bpu\n", n);
+ erts_printf("Or\t%beu\n", n);
break;
case matchAnd:
++t;
n = *t;
++t;
- erts_printf("And\t%bpu\n", n);
+ erts_printf("And\t%beu\n", n);
break;
case matchOrElse:
++t;
n = *t;
++t;
- erts_printf("OrElse\t%bpu\n", n);
+ erts_printf("OrElse\t%beu\n", n);
break;
case matchAndAlso:
++t;
n = *t;
++t;
- erts_printf("AndAlso\t%bpu\n", n);
+ erts_printf("AndAlso\t%beu\n", n);
break;
case matchCall0:
++t;
@@ -4983,7 +5244,19 @@ static void db_match_dis(Binary *bp)
++t;
n = (Uint) *t;
++t;
- erts_printf("PushV\t%bpu\n", n);
+ erts_printf("PushV\t%beu\n", n);
+ break;
+ #if HALFWORD_HEAP
+ case matchPushVGuard:
+ n = (Uint) *++t;
+ ++t;
+ erts_printf("PushVGuard\t%beu\n", n);
+ break;
+ #endif
+ case matchPushVResult:
+ n = (Uint) *++t;
+ ++t;
+ erts_printf("PushVResult\t%beu\n", n);
break;
case matchTrue:
++t;
@@ -5094,9 +5367,8 @@ static void db_match_dis(Binary *bp)
}
erts_printf("}\n");
erts_printf("num_bindings: %d\n", prog->num_bindings);
- erts_printf("heap_size: %bpu\n", prog->heap_size);
- erts_printf("eheap_offset: %bpu\n", prog->eheap_offset);
- erts_printf("stack_offset: %bpu\n", prog->stack_offset);
+ erts_printf("heap_size: %beu\n", prog->heap_size);
+ erts_printf("stack_offset: %beu\n", prog->stack_offset);
erts_printf("text: 0x%08x\n", (unsigned long) prog->text);
erts_printf("stack_size: %d (words)\n", prog->heap_size-prog->stack_offset);
diff --git a/erts/emulator/beam/erl_db_util.h b/erts/emulator/beam/erl_db_util.h
index 10ba755e80..bb1751d309 100644
--- a/erts/emulator/beam/erl_db_util.h
+++ b/erts/emulator/beam/erl_db_util.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2011. 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
@@ -86,6 +86,9 @@ typedef struct {
Uint new_size;
int mustResize;
void* lck;
+#if HALFWORD_HEAP
+ unsigned char* abs_vec; /* [i] true if dbterm->tpl[i] is absolute Eterm */
+#endif
} DbUpdateHandle;
@@ -206,8 +209,7 @@ typedef struct db_fixation {
*/
typedef struct db_table_common {
- erts_refc_t ref;
- erts_refc_t fixref; /* fixation counter */
+ erts_refc_t ref; /* fixation counter and delete counter */
#ifdef ERTS_SMP
erts_smp_rwmtx_t rwlock; /* rw lock on table */
erts_smp_mtx_t fixlock; /* Protects fixations,megasec,sec,microsec */
@@ -253,10 +255,17 @@ typedef struct db_table_common {
(DB_BAG | DB_SET | DB_DUPLICATE_BAG)))
#define IS_TREE_TABLE(Status) (!!((Status) & \
DB_ORDERED_SET))
-#define NFIXED(T) (erts_refc_read(&(T)->common.fixref,0))
+#define NFIXED(T) (erts_refc_read(&(T)->common.ref,0))
#define IS_FIXED(T) (NFIXED(T) != 0)
-Eterm erts_ets_copy_object(Eterm, Process*);
+/*
+ * tplp is an untagged pointer to a tuple we know is large enough
+ * and dth is a pointer to a DbTableHash.
+ */
+#define GETKEY(dth, tplp) (*((tplp) + ((DbTableCommon*)(dth))->keypos))
+
+
+ERTS_GLB_INLINE Eterm db_copy_key(Process* p, DbTable* tb, DbTerm* obj);
Eterm db_copy_from_comp(DbTableCommon* tb, DbTerm* bp, Eterm** hpp,
ErlOffHeap* off_heap);
int db_eq_comp(DbTableCommon* tb, Eterm a, DbTerm* b);
@@ -265,9 +274,23 @@ DbTerm* db_alloc_tmp_uncompressed(DbTableCommon* tb, DbTerm* org);
ERTS_GLB_INLINE Eterm db_copy_object_from_ets(DbTableCommon* tb, DbTerm* bp,
Eterm** hpp, ErlOffHeap* off_heap);
ERTS_GLB_INLINE int db_eq(DbTableCommon* tb, Eterm a, DbTerm* b);
-ERTS_GLB_INLINE Eterm db_do_read_element(DbUpdateHandle* handle, Sint position);
+Wterm db_do_read_element(DbUpdateHandle* handle, Sint position);
#if ERTS_GLB_INLINE_INCL_FUNC_DEF
+
+ERTS_GLB_INLINE Eterm db_copy_key(Process* p, DbTable* tb, DbTerm* obj)
+{
+ Eterm key = GETKEY(tb, obj->tpl);
+ if IS_CONST(key) return key;
+ else {
+ Uint size = size_object_rel(key, obj->tpl);
+ Eterm* hp = HAlloc(p, size);
+ Eterm res = copy_struct_rel(key, size, &hp, &MSO(p), obj->tpl, NULL);
+ ASSERT(eq_rel(res,NULL,key,obj->tpl));
+ return res;
+ }
+}
+
ERTS_GLB_INLINE Eterm db_copy_object_from_ets(DbTableCommon* tb, DbTerm* bp,
Eterm** hpp, ErlOffHeap* off_heap)
{
@@ -275,49 +298,27 @@ ERTS_GLB_INLINE Eterm db_copy_object_from_ets(DbTableCommon* tb, DbTerm* bp,
return db_copy_from_comp(tb, bp, hpp, off_heap);
}
else {
- return copy_shallow(bp->tpl, bp->size, hpp, off_heap);
+ return copy_shallow_rel(bp->tpl, bp->size, hpp, off_heap, bp->tpl);
}
}
ERTS_GLB_INLINE int db_eq(DbTableCommon* tb, Eterm a, DbTerm* b)
{
if (!tb->compress) {
- return eq(a, make_tuple(b->tpl));
+ return eq_rel(a, NULL, make_tuple_rel(b->tpl,b->tpl), b->tpl);
}
else {
return db_eq_comp(tb, a, b);
}
}
-/* Must be called to read elements after db_lookup_dbterm.
-** Will decompress if needed. */
-ERTS_GLB_INLINE Eterm db_do_read_element(DbUpdateHandle* handle, Sint position)
-{
- Eterm elem = handle->dbterm->tpl[position];
- if (!is_header(elem)) {
- return elem;
- }
- ASSERT(((DbTableCommon*)handle->tb)->compress);
- ASSERT(!handle->mustResize);
- handle->dbterm = db_alloc_tmp_uncompressed((DbTableCommon*)handle->tb, handle->dbterm);
- handle->mustResize = 1;
- return handle->dbterm->tpl[position];
-}
-
#endif /* ERTS_GLB_INLINE_INCL_FUNC_DEF */
-/* optimised version of copy_object (normal case? atomic object) */
-#define COPY_OBJECT(obj, p, objp) \
- if (IS_CONST(obj)) { *(objp) = (obj); } \
- else { *objp = erts_ets_copy_object(obj, p); }
#define DB_READ (DB_PROTECTED|DB_PUBLIC)
#define DB_WRITE DB_PUBLIC
#define DB_INFO (DB_PROTECTED|DB_PUBLIC|DB_PRIVATE)
-/* tb is an DbTableCommon and obj is an Eterm (tagged) */
-#define TERM_GETKEY(tb, obj) db_getkey((tb)->common.keypos, (obj))
-
#define ONLY_WRITER(P,T) (((T)->common.status & (DB_PRIVATE|DB_PROTECTED)) \
&& (T)->common.owner == (P)->id)
@@ -338,12 +339,11 @@ Eterm db_copy_element_from_ets(DbTableCommon* tb, Process* p, DbTerm* obj,
Uint pos, Eterm** hpp, Uint extra);
int db_has_variable(Eterm obj);
int db_is_variable(Eterm obj);
-Eterm db_do_read_element(DbUpdateHandle* handle, Sint position);
void db_do_update_element(DbUpdateHandle* handle,
Sint position,
Eterm newval);
void db_finalize_resize(DbUpdateHandle* handle, Uint offset);
-Eterm db_add_counter(Eterm** hpp, Eterm counter, Eterm incr);
+Eterm db_add_counter(Eterm** hpp, Wterm counter, Eterm incr);
Eterm db_match_set_lint(Process *p, Eterm matchexpr, Uint flags);
Binary *db_match_set_compile(Process *p, Eterm matchexpr,
Uint flags);
@@ -360,7 +360,6 @@ typedef struct match_prog {
struct erl_heap_fragment *saved_program_buf;
Eterm saved_program;
Uint heap_size; /* size of: heap + eheap + stack */
- Uint eheap_offset;
Uint stack_offset;
#ifdef DMC_DEBUG
UWord* prog_end; /* End of program */
@@ -424,11 +423,16 @@ Binary *db_match_compile(Eterm *matchexpr, Eterm *guards,
Eterm *body, int num_matches,
Uint flags,
DMCErrInfo *err_info);
-Eterm db_prog_match_and_copy(DbTableCommon* tb, Process* c_p, Binary* bprog,
- int all, DbTerm* obj, Eterm** hpp, Uint extra);
/* Returns newly allocated MatchProg binary with refc == 0*/
-Eterm db_prog_match(Process *p, Binary *prog, Eterm term, Eterm *termp, int arity,
+
+Eterm db_match_dbterm(DbTableCommon* tb, Process* c_p, Binary* bprog,
+ int all, DbTerm* obj, Eterm** hpp, Uint extra);
+
+Eterm db_prog_match(Process *p, Binary *prog, Eterm term, Eterm* base,
+ Eterm *termp, int arity,
+ enum erts_pam_run_flags in_flags,
Uint32 *return_flags /* Zeroed on enter */);
+
/* returns DB_ERROR_NONE if matches, 1 if not matches and some db error on
error. */
DMCErrInfo *db_new_dmc_err_info(void);
diff --git a/erts/emulator/beam/erl_driver.h b/erts/emulator/beam/erl_driver.h
index 9733c0e5b5..069b71ab0d 100644
--- a/erts/emulator/beam/erl_driver.h
+++ b/erts/emulator/beam/erl_driver.h
@@ -150,6 +150,27 @@ typedef struct {
#define ERL_DRV_FLAG_SOFT_BUSY (1 << 1)
/*
+ * Integer types
+ */
+
+typedef unsigned long ErlDrvTermData;
+typedef unsigned long ErlDrvUInt;
+typedef signed long ErlDrvSInt;
+
+#if defined(__WIN32__)
+typedef unsigned __int64 ErlDrvUInt64;
+typedef __int64 ErlDrvSInt64;
+#elif SIZEOF_LONG == 8
+typedef unsigned long ErlDrvUInt64;
+typedef long ErlDrvSInt64;
+#elif SIZEOF_LONG_LONG == 8
+typedef unsigned long long ErlDrvUInt64;
+typedef long long ErlDrvSInt64;
+#else
+#error No 64-bit integer type
+#endif
+
+/*
* A binary as seen in a driver. Note that a binary should never be
* altered by the driver when it has been sent to Erlang.
*/
@@ -179,26 +200,6 @@ struct erl_drv_event_data {
#endif
typedef struct erl_drv_event_data *ErlDrvEventData; /* Event data */
-/*
- * Used in monitors...
- */
-typedef unsigned long ErlDrvTermData;
-typedef unsigned long ErlDrvUInt;
-typedef signed long ErlDrvSInt;
-
-#if defined(__WIN32__)
-typedef unsigned __int64 ErlDrvUInt64;
-typedef __int64 ErlDrvSInt64;
-#elif SIZEOF_LONG == 8
-typedef unsigned long ErlDrvUInt64;
-typedef long ErlDrvSInt64;
-#elif SIZEOF_LONG_LONG == 8
-typedef unsigned long long ErlDrvUInt64;
-typedef long long ErlDrvSInt64;
-#else
-#error No 64-bit integer type
-#endif
-
/*
* A driver monitor
*/
@@ -281,7 +282,7 @@ typedef struct erl_drv_entry {
the port */
void (*ready_input)(ErlDrvData drv_data, ErlDrvEvent event);
/* called when we have input from one of
- the driver's handles) */
+ the driver's handles */
void (*ready_output)(ErlDrvData drv_data, ErlDrvEvent event);
/* called when output is possible to one of
the driver's handles */
@@ -293,7 +294,7 @@ typedef struct erl_drv_entry {
int (*control)(ErlDrvData drv_data, unsigned int command, char *buf,
int len, char **rbuf, int rlen);
/* "ioctl" for drivers - invoked by
- port_control/3) */
+ port_control/3 */
void (*timeout)(ErlDrvData drv_data); /* Handling of timeout in driver */
void (*outputv)(ErlDrvData drv_data, ErlIOVec *ev);
/* called when we have output from erlang
@@ -306,7 +307,7 @@ typedef struct erl_drv_entry {
before 'stop' can be called */
int (*call)(ErlDrvData drv_data, unsigned int command, char *buf,
int len, char **rbuf, int rlen, unsigned int *flags);
- /* Works mostly like 'control', a syncronous
+ /* Works mostly like 'control', a synchronous
call into the driver. */
void (*event)(ErlDrvData drv_data, ErlDrvEvent event,
ErlDrvEventData event_data);
@@ -394,9 +395,9 @@ EXTERN int driver_exit (ErlDrvPort port, int err);
EXTERN ErlDrvPDL driver_pdl_create(ErlDrvPort);
EXTERN void driver_pdl_lock(ErlDrvPDL);
EXTERN void driver_pdl_unlock(ErlDrvPDL);
-EXTERN long driver_pdl_get_refc(ErlDrvPDL);
-EXTERN long driver_pdl_inc_refc(ErlDrvPDL);
-EXTERN long driver_pdl_dec_refc(ErlDrvPDL);
+EXTERN ErlDrvSInt driver_pdl_get_refc(ErlDrvPDL);
+EXTERN ErlDrvSInt driver_pdl_inc_refc(ErlDrvPDL);
+EXTERN ErlDrvSInt driver_pdl_dec_refc(ErlDrvPDL);
/*
* Process monitors
@@ -432,9 +433,9 @@ EXTERN ErlDrvBinary* driver_realloc_binary(ErlDrvBinary *bin, int size);
EXTERN void driver_free_binary(ErlDrvBinary *bin);
/* Referenc count on driver binaries */
-EXTERN long driver_binary_get_refc(ErlDrvBinary *dbp);
-EXTERN long driver_binary_inc_refc(ErlDrvBinary *dbp);
-EXTERN long driver_binary_dec_refc(ErlDrvBinary *dbp);
+EXTERN ErlDrvSInt driver_binary_get_refc(ErlDrvBinary *dbp);
+EXTERN ErlDrvSInt driver_binary_inc_refc(ErlDrvBinary *dbp);
+EXTERN ErlDrvSInt driver_binary_dec_refc(ErlDrvBinary *dbp);
/* Allocation interface */
EXTERN void *driver_alloc(size_t size);
diff --git a/erts/emulator/beam/erl_drv_thread.c b/erts/emulator/beam/erl_drv_thread.c
index 17b08a71d4..39bbe9633b 100644
--- a/erts/emulator/beam/erl_drv_thread.c
+++ b/erts/emulator/beam/erl_drv_thread.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2007-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2007-2011. 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
@@ -24,6 +24,10 @@
#include "global.h"
#include <string.h>
+#if defined(__APPLE__) && defined(__MACH__) && !defined(__DARWIN__)
+#define __DARWIN__ 1
+#endif
+
#define ERL_DRV_THR_OPTS_SIZE(LAST_FIELD) \
(((size_t) &((ErlDrvThreadOpts *) 0)->LAST_FIELD) \
+ sizeof(((ErlDrvThreadOpts *) 0)->LAST_FIELD))
@@ -692,3 +696,57 @@ erl_drv_thread_join(ErlDrvTid tid, void **respp)
#endif
}
+#if defined(__DARWIN__) && defined(USE_THREADS) && defined(ERTS_SMP)
+extern int erts_darwin_main_thread_pipe[2];
+extern int erts_darwin_main_thread_result_pipe[2];
+
+
+int
+erl_drv_stolen_main_thread_join(ErlDrvTid tid, void **respp)
+{
+ void *dummy;
+ void **x;
+ if (respp == NULL)
+ x = &dummy;
+ else
+ x = respp;
+ read(erts_darwin_main_thread_result_pipe[0],x,sizeof(void *));
+ return 0;
+}
+
+int
+erl_drv_steal_main_thread(char *name,
+ ErlDrvTid *tid,
+ void* (*func)(void*),
+ void* arg,
+ ErlDrvThreadOpts *opts)
+{
+ char buff[sizeof(void* (*)(void*)) + sizeof(void *)];
+ int buff_sz = sizeof(void* (*)(void*)) + sizeof(void *);
+ /*struct ErlDrvTid_ *dtid;
+
+ dtid = erts_alloc_fnf(ERTS_ALC_T_DRV_TID,
+ (sizeof(struct ErlDrvTid_)
+ + (name ? sys_strlen(name) + 1 : 0)));
+ if (!dtid)
+ return ENOMEM;
+ memset(dtid,0,sizeof(ErlDrvTid_));
+ dtid->tid = (void * ) -1;
+ dtid->drv_thr = 1;
+ dtid->func = func;
+ dtid->arg = arg;
+ dtid->tsd = NULL;
+ dtid->tsd_len = 0;
+ dtid->name = no_name;
+ *tid = (ErlDrvTid) dtid;
+ */
+ *tid = NULL;
+ /* Ignore options and name... */
+
+ memcpy(buff,&func,sizeof(void* (*)(void*)));
+ memcpy(buff + sizeof(void* (*)(void*)),&arg,sizeof(void *));
+ write(erts_darwin_main_thread_pipe[1],buff,buff_sz);
+ return 0;
+}
+
+#endif
diff --git a/erts/emulator/beam/erl_fun.c b/erts/emulator/beam/erl_fun.c
index 84869f12d6..88947b5536 100644
--- a/erts/emulator/beam/erl_fun.c
+++ b/erts/emulator/beam/erl_fun.c
@@ -97,7 +97,7 @@ erts_put_fun_entry(Eterm mod, int uniq, int index)
{
ErlFunEntry template;
ErlFunEntry* fe;
- long refc;
+ erts_aint_t refc;
ASSERT(is_atom(mod));
template.old_uniq = uniq;
template.old_index = index;
@@ -119,7 +119,7 @@ erts_put_fun_entry2(Eterm mod, int old_uniq, int old_index,
{
ErlFunEntry template;
ErlFunEntry* fe;
- long refc;
+ erts_aint_t refc;
ASSERT(is_atom(mod));
template.old_uniq = old_uniq;
@@ -157,7 +157,7 @@ erts_get_fun_entry(Eterm mod, int uniq, int index)
erts_fun_read_lock();
ret = (ErlFunEntry *) hash_get(&erts_fun_table, (void*) &template);
if (ret) {
- long refc = erts_refc_inctest(&ret->refc, 1);
+ erts_aint_t refc = erts_refc_inctest(&ret->refc, 1);
if (refc < 2) /* Pending delete */
erts_refc_inc(&ret->refc, 1);
}
@@ -257,7 +257,7 @@ erts_dump_fun_entries(int to, void *to_arg)
#ifdef HIPE
erts_print(to, to_arg, "Native_address: %p\n", fe->native_address);
#endif
- erts_print(to, to_arg, "Refc: %d\n", erts_refc_read(&fe->refc, 1));
+ erts_print(to, to_arg, "Refc: %ld\n", erts_refc_read(&fe->refc, 1));
b = b->next;
}
}
diff --git a/erts/emulator/beam/erl_gc.c b/erts/emulator/beam/erl_gc.c
index 0f4d2a2ef9..5edcd667e7 100644
--- a/erts/emulator/beam/erl_gc.c
+++ b/erts/emulator/beam/erl_gc.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2002-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2002-2011. 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
@@ -33,6 +33,7 @@
#include "erl_gc.h"
#if HIPE
#include "hipe_stack.h"
+#include "hipe_mode_switch.h"
#endif
#define ERTS_INACT_WR_PB_LEAVE_MUCH_LIMIT 1
@@ -214,7 +215,7 @@ erts_next_heap_size(Uint size, Uint offset)
low = mid + 1;
}
}
- erl_exit(1, "no next heap size found: %d, offset %d\n", size, offset);
+ erl_exit(1, "no next heap size found: %lu, offset %lu\n", (unsigned long)size, (unsigned long)offset);
}
return 0;
}
@@ -454,7 +455,6 @@ erts_garbage_collect_hibernate(Process* p)
Eterm* heap;
Eterm* htop;
Rootset rootset;
- int n;
char* src;
Uint src_size;
Uint actual_size;
@@ -485,7 +485,10 @@ erts_garbage_collect_hibernate(Process* p)
sizeof(Eterm)*heap_size);
htop = heap;
- n = setup_rootset(p, p->arg_reg, p->arity, &rootset);
+ (void) setup_rootset(p, p->arg_reg, p->arity, &rootset);
+#if HIPE
+ hipe_empty_nstack(p);
+#endif
src = (char *) p->heap;
src_size = (char *) p->htop - src;
@@ -2471,7 +2474,7 @@ erts_check_off_heap2(Process *p, Eterm *htop)
old = 0;
for (u.hdr = MSO(p).first; u.hdr; u.hdr = u.hdr->next) {
- long refc;
+ erts_aint_t refc;
switch (thing_subtag(u.hdr->thing_word)) {
case REFC_BINARY_SUBTAG:
refc = erts_refc_read(&u.pb->val->refc, 1);
diff --git a/erts/emulator/beam/erl_init.c b/erts/emulator/beam/erl_init.c
index 464ee750f7..0a57eb6d88 100644
--- a/erts/emulator/beam/erl_init.c
+++ b/erts/emulator/beam/erl_init.c
@@ -100,7 +100,7 @@ int erts_backtrace_depth; /* How many functions to show in a backtrace
int erts_async_max_threads; /* number of threads for async support */
int erts_async_thread_suggested_stack_size;
-erts_smp_atomic_t erts_max_gen_gcs;
+erts_smp_atomic32_t erts_max_gen_gcs;
Eterm erts_error_logger_warnings; /* What to map warning logs to, am_error,
am_info or am_warning, am_error is
@@ -250,7 +250,7 @@ erl_init(int ncpu)
erts_init_monitors();
erts_init_gc();
- init_time();
+ erts_init_time();
erts_init_sys_common_misc();
erts_init_process(ncpu);
erts_init_scheduling(use_multi_run_queue,
@@ -289,7 +289,7 @@ erl_init(int ncpu)
erts_delay_trap = erts_export_put(am_erlang, am_delay_trap, 2);
erts_late_init_process();
#if HAVE_ERTS_MSEG
- erts_mseg_late_init(); /* Must be after timer (init_time()) and thread
+ erts_mseg_late_init(); /* Must be after timer (erts_init_time()) and thread
initializations */
#endif
#ifdef HIPE
@@ -323,7 +323,7 @@ init_shared_memory(int argc, char **argv)
#endif
global_gen_gcs = 0;
- global_max_gen_gcs = erts_smp_atomic_read(&erts_max_gen_gcs);
+ global_max_gen_gcs = (Uint16) erts_smp_atomic32_read(&erts_max_gen_gcs);
global_gc_flags = erts_default_process_flags;
erts_global_offheap.mso = NULL;
@@ -651,7 +651,7 @@ early_init(int *argc, char **argv) /*
erts_writing_erl_crash_dump = 0;
#endif
- erts_smp_atomic_init(&erts_max_gen_gcs, (long)((Uint16) -1));
+ erts_smp_atomic32_init(&erts_max_gen_gcs, (erts_aint32_t) ((Uint16) -1));
erts_pre_init_process();
#if defined(USE_THREADS) && !defined(ERTS_SMP)
@@ -856,7 +856,7 @@ erl_start(int argc, char **argv)
envbufsz = sizeof(envbuf);
if (erts_sys_getenv("ERL_FULLSWEEP_AFTER", envbuf, &envbufsz) == 0) {
Uint16 max_gen_gcs = atoi(envbuf);
- erts_smp_atomic_set(&erts_max_gen_gcs, (long) max_gen_gcs);
+ erts_smp_atomic32_set(&erts_max_gen_gcs, (erts_aint32_t) max_gen_gcs);
}
envbufsz = sizeof(envbuf);
diff --git a/erts/emulator/beam/erl_lock_check.c b/erts/emulator/beam/erl_lock_check.c
index 04c7dbd2ec..9e18997890 100644
--- a/erts/emulator/beam/erl_lock_check.c
+++ b/erts/emulator/beam/erl_lock_check.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2005-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2005-2011. 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
@@ -155,7 +155,7 @@ static erts_lc_lock_order_t erts_lock_order[] = {
{ "alcu_allocator", "index" },
{ "alcu_delayed_free", "index" },
{ "mseg", NULL },
-#ifdef HALFWORD_HEAP
+#if HALFWORD_HEAP
{ "pmmap", NULL },
#endif
#ifdef ERTS_SMP
@@ -177,6 +177,8 @@ static erts_lc_lock_order_t erts_lock_order[] = {
{ "async_id", NULL },
{ "pix_lock", "address" },
{ "run_queues_lists", NULL },
+ { "misc_aux_work_queue", "index" },
+ { "misc_aux_work_pre_alloc_lock", "address" },
{ "sched_stat", NULL },
{ "run_queue_sleep_list", "address" },
#endif
@@ -978,10 +980,10 @@ erts_lc_trylock_force_busy_flg(erts_lc_lock_t *lck, Uint16 op_flags)
/* We only force busy if a lock order violation would occur
and when on an even millisecond. */
{
- erts_thr_timeval_t time;
- erts_thr_time_now(&time);
+ SysTimeval tv;
+ sys_gettimeofday(&tv);
- if ((time.tv_nsec / 1000000) & 1)
+ if ((tv.tv_usec / 1000) & 1)
return 0;
}
#endif
diff --git a/erts/emulator/beam/erl_lock_check.h b/erts/emulator/beam/erl_lock_check.h
index 0372e6850d..cdb06d4458 100644
--- a/erts/emulator/beam/erl_lock_check.h
+++ b/erts/emulator/beam/erl_lock_check.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2005-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2005-2011. 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
diff --git a/erts/emulator/beam/erl_lock_count.c b/erts/emulator/beam/erl_lock_count.c
index 239773f366..a36c53560e 100644
--- a/erts/emulator/beam/erl_lock_count.c
+++ b/erts/emulator/beam/erl_lock_count.c
@@ -159,7 +159,7 @@ static char* lock_opt(Uint16 flag) {
}
static void print_lock_x(erts_lcnt_lock_t *lock, Uint16 flag, char *action, char *extra) {
- long int colls, tries, w_state, r_state;
+ erts_aint_t colls, tries, w_state, r_state;
erts_lcnt_lock_stats_t *stats = NULL;
char *type;
@@ -385,7 +385,7 @@ void erts_lcnt_destroy_lock(erts_lcnt_lock_t *lock) {
/* lock */
void erts_lcnt_lock_opt(erts_lcnt_lock_t *lock, Uint16 option) {
- long r_state = 0, w_state = 0;
+ erts_aint_t r_state = 0, w_state = 0;
erts_lcnt_thread_data_t *eltd;
if (erts_lcnt_rt_options & ERTS_LCNT_OPT_SUSPEND) return;
@@ -418,7 +418,7 @@ void erts_lcnt_lock_opt(erts_lcnt_lock_t *lock, Uint16 option) {
}
void erts_lcnt_lock(erts_lcnt_lock_t *lock) {
- long w_state;
+ erts_aint_t w_state;
erts_lcnt_thread_data_t *eltd;
if (erts_lcnt_rt_options & ERTS_LCNT_OPT_SUSPEND) return;
@@ -471,7 +471,7 @@ void erts_lcnt_lock_post_x(erts_lcnt_lock_t *lock, char *file, unsigned int line
erts_lcnt_time_t time_wait;
erts_lcnt_lock_stats_t *stats;
#ifdef DEBUG
- long flowstate;
+ erts_aint_t flowstate;
#endif
if (erts_lcnt_rt_options & ERTS_LCNT_OPT_SUSPEND) return;
@@ -516,8 +516,8 @@ void erts_lcnt_unlock_opt(erts_lcnt_lock_t *lock, Uint16 option) {
void erts_lcnt_unlock(erts_lcnt_lock_t *lock) {
#ifdef DEBUG
- long w_state;
- long flowstate;
+ erts_aint_t w_state;
+ erts_aint_t flowstate;
#endif
if (erts_lcnt_rt_options & ERTS_LCNT_OPT_SUSPEND) return;
#ifdef DEBUG
@@ -552,7 +552,7 @@ void erts_lcnt_trylock_opt(erts_lcnt_lock_t *lock, int res, Uint16 option) {
void erts_lcnt_trylock(erts_lcnt_lock_t *lock, int res) {
/* Determine lock_state via res instead of state */
#ifdef DEBUG
- long flowstate;
+ erts_aint_t flowstate;
#endif
if (erts_lcnt_rt_options & ERTS_LCNT_OPT_SUSPEND) return;
if (res != EBUSY) {
diff --git a/erts/emulator/beam/erl_monitors.c b/erts/emulator/beam/erl_monitors.c
index d873c7a701..9751b5d77c 100644
--- a/erts/emulator/beam/erl_monitors.c
+++ b/erts/emulator/beam/erl_monitors.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2004-2011. 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
@@ -85,7 +85,7 @@ static ERTS_INLINE int cmp_mon_ref(Eterm ref1, Eterm ref2)
if (is_ref_thing_header(*b2)) {
return 1;
}
- return cmp(ref1,ref2);
+ return CMP(ref1,ref2);
}
#define CP_LINK_VAL(To, Hp, From) \
@@ -380,7 +380,7 @@ int erts_add_link(ErtsLink **root, Uint type, Eterm pid)
state = 1;
*this = create_link(type,pid);
break;
- } else if ((c = cmp(pid,(*this)->pid)) < 0) {
+ } else if ((c = CMP(pid,(*this)->pid)) < 0) {
/* go left */
dstack[dpos++] = DIR_LEFT;
tstack[tpos++] = this;
@@ -415,7 +415,7 @@ erts_add_or_lookup_suspend_monitor(ErtsSuspendMonitor **root, Eterm pid)
state = 1;
res = *this = create_suspend_monitor(pid);
break;
- } else if ((c = cmp(pid,(*this)->pid)) < 0) {
+ } else if ((c = CMP(pid,(*this)->pid)) < 0) {
/* go left */
dstack[dpos++] = DIR_LEFT;
tstack[tpos++] = this;
@@ -453,7 +453,7 @@ ErtsLink *erts_add_or_lookup_link(ErtsLink **root, Uint type, Eterm pid)
*this = create_link(type,pid);
ret = *this;
break;
- } else if ((c = cmp(pid,(*this)->pid)) < 0) {
+ } else if ((c = CMP(pid,(*this)->pid)) < 0) {
/* go left */
dstack[dpos++] = DIR_LEFT;
tstack[tpos++] = this;
@@ -663,7 +663,7 @@ ErtsLink *erts_remove_link(ErtsLink **root, Eterm pid)
for (;;) {
if (!*this) { /* Failure */
return NULL;
- } else if ((c = cmp(pid,(*this)->pid)) < 0) {
+ } else if ((c = CMP(pid,(*this)->pid)) < 0) {
dstack[dpos++] = DIR_LEFT;
tstack[tpos++] = this;
this = &((*this)->left);
@@ -715,7 +715,7 @@ erts_delete_suspend_monitor(ErtsSuspendMonitor **root, Eterm pid)
for (;;) {
if (!*this) { /* Nothing found */
return;
- } else if ((c = cmp(pid,(*this)->pid)) < 0) {
+ } else if ((c = CMP(pid,(*this)->pid)) < 0) {
dstack[dpos++] = DIR_LEFT;
tstack[tpos++] = this;
this = &((*this)->left);
@@ -771,7 +771,7 @@ ErtsLink *erts_lookup_link(ErtsLink *root, Eterm pid)
Sint c;
for (;;) {
- if (root == NULL || (c = cmp(pid,root->pid)) == 0) {
+ if (root == NULL || (c = CMP(pid,root->pid)) == 0) {
return root;
} else if (c < 0) {
root = root->left;
@@ -787,7 +787,7 @@ erts_lookup_suspend_monitor(ErtsSuspendMonitor *root, Eterm pid)
Sint c;
for (;;) {
- if (root == NULL || (c = cmp(pid,root->pid)) == 0) {
+ if (root == NULL || (c = CMP(pid,root->pid)) == 0) {
return root;
} else if (c < 0) {
root = root->left;
diff --git a/erts/emulator/beam/erl_nif.c b/erts/emulator/beam/erl_nif.c
index a680097c2d..8b48444904 100644
--- a/erts/emulator/beam/erl_nif.c
+++ b/erts/emulator/beam/erl_nif.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2009-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2009-2011. 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
@@ -81,7 +81,6 @@ static ERTS_INLINE Eterm* alloc_heap(ErlNifEnv* env, unsigned need)
static Eterm* alloc_heap_heavy(ErlNifEnv* env, unsigned need, Eterm* hp)
{
- unsigned frag_sz;
env->hp = hp;
if (env->heap_frag == NULL) {
ASSERT(HEAP_LIMIT(env->proc) == env->hp_end);
@@ -91,11 +90,11 @@ static Eterm* alloc_heap_heavy(ErlNifEnv* env, unsigned need, Eterm* hp)
env->heap_frag->used_size = hp - env->heap_frag->mem;
ASSERT(env->heap_frag->used_size <= env->heap_frag->alloc_size);
}
- frag_sz = need + MIN_HEAP_FRAG_SZ;
- hp = erts_heap_alloc(env->proc, frag_sz);
- env->hp = hp + need;
- env->hp_end = hp + frag_sz;
+ hp = erts_heap_alloc(env->proc, need, MIN_HEAP_FRAG_SZ);
env->heap_frag = MBUF(env->proc);
+ env->hp = hp + need;
+ env->hp_end = env->heap_frag->mem + env->heap_frag->alloc_size;
+
return hp;
}
@@ -431,6 +430,11 @@ int enif_is_list(ErlNifEnv* env, ERL_NIF_TERM term)
return is_list(term) || is_nil(term);
}
+int enif_is_exception(ErlNifEnv* env, ERL_NIF_TERM term)
+{
+ return term == THE_NON_VALUE;
+}
+
static void aligned_binary_dtor(struct enif_tmp_obj_t* obj)
{
erts_free_aligned_binary_bytes_extra((byte*)obj,ERTS_ALC_T_TMP);
@@ -574,7 +578,7 @@ int enif_is_identical(Eterm lhs, Eterm rhs)
int enif_compare(Eterm lhs, Eterm rhs)
{
- return cmp(lhs,rhs);
+ return CMP(lhs,rhs);
}
int enif_get_tuple(ErlNifEnv* env, Eterm tpl, int* arity, const Eterm** array)
@@ -939,21 +943,26 @@ ERL_NIF_TERM enif_make_list_cell(ErlNifEnv* env, Eterm car, Eterm cdr)
ERL_NIF_TERM enif_make_list(ErlNifEnv* env, unsigned cnt, ...)
{
- Eterm* hp = alloc_heap(env,cnt*2);
- Eterm ret = make_list(hp);
- Eterm* last = &ret;
- va_list ap;
-
- va_start(ap,cnt);
- while (cnt--) {
- *last = make_list(hp);
- *hp = va_arg(ap,Eterm);
- last = ++hp;
- ++hp;
+ if (cnt == 0) {
+ return NIL;
+ }
+ else {
+ Eterm* hp = alloc_heap(env,cnt*2);
+ Eterm ret = make_list(hp);
+ Eterm* last = &ret;
+ va_list ap;
+
+ va_start(ap,cnt);
+ while (cnt--) {
+ *last = make_list(hp);
+ *hp = va_arg(ap,Eterm);
+ last = ++hp;
+ ++hp;
+ }
+ va_end(ap);
+ *last = NIL;
+ return ret;
}
- va_end(ap);
- *last = NIL;
- return ret;
}
ERL_NIF_TERM enif_make_list_from_array(ErlNifEnv* env, const ERL_NIF_TERM arr[], unsigned cnt)
@@ -1474,7 +1483,13 @@ BIF_RETTYPE load_nif_2(BIF_ALIST_2)
ret = load_nif_error(BIF_P, bad_lib, "Library version (%d.%d) not compatible (with %d.%d).",
entry->major, entry->minor, ERL_NIF_MAJOR_VERSION, ERL_NIF_MINOR_VERSION);
- }
+ }
+ else if (entry->minor >= 1
+ && sys_strcmp(entry->vm_variant, ERL_NIF_VM_VARIANT) != 0) {
+ ret = load_nif_error(BIF_P, bad_lib, "Library (%s) not compiled for "
+ "this vm variant (%s).",
+ entry->vm_variant, ERL_NIF_VM_VARIANT);
+ }
else if (!erts_is_atom_str((char*)entry->name, mod_atom)) {
ret = load_nif_error(BIF_P, bad_lib, "Library module name '%s' does not"
" match calling module '%T'", entry->name, mod_atom);
diff --git a/erts/emulator/beam/erl_nif.h b/erts/emulator/beam/erl_nif.h
index ee3a7cd5f4..d028567faf 100644
--- a/erts/emulator/beam/erl_nif.h
+++ b/erts/emulator/beam/erl_nif.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2009-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2009-2011. 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
@@ -30,9 +30,11 @@
** 0.1: R13B03
** 1.0: R13B04
** 2.0: R14A
+** 2.1: R14B02 "vm_variant"
+** 2.2: R14B03 enif_is_exception
*/
#define ERL_NIF_MAJOR_VERSION 2
-#define ERL_NIF_MINOR_VERSION 0
+#define ERL_NIF_MINOR_VERSION 2
#include <stdlib.h>
@@ -80,8 +82,10 @@ typedef long long ErlNifSInt64;
#endif
#ifdef HALFWORD_HEAP_EMULATOR
+# define ERL_NIF_VM_VARIANT "beam.halfword"
typedef unsigned int ERL_NIF_TERM;
#else
+# define ERL_NIF_VM_VARIANT "beam.vanilla"
typedef unsigned long ERL_NIF_TERM;
#endif
@@ -105,7 +109,8 @@ typedef struct enif_entry_t
int (*load) (ErlNifEnv*, void** priv_data, ERL_NIF_TERM load_info);
int (*reload) (ErlNifEnv*, void** priv_data, ERL_NIF_TERM load_info);
int (*upgrade)(ErlNifEnv*, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info);
- void (*unload) (ErlNifEnv*, void* priv_data);
+ void (*unload) (ErlNifEnv*, void* priv_data);
+ const char* vm_variant;
}ErlNifEntry;
@@ -198,6 +203,7 @@ extern TWinDynNifCallbacks WinDynNifCallbacks;
#define ERL_NIF_INIT(NAME, FUNCS, LOAD, RELOAD, UPGRADE, UNLOAD) \
ERL_NIF_INIT_PROLOGUE \
ERL_NIF_INIT_GLOB \
+ERL_NIF_INIT_DECL(NAME); \
ERL_NIF_INIT_DECL(NAME) \
{ \
static ErlNifEntry entry = \
@@ -207,7 +213,8 @@ ERL_NIF_INIT_DECL(NAME) \
#NAME, \
sizeof(FUNCS) / sizeof(*FUNCS), \
FUNCS, \
- LOAD, RELOAD, UPGRADE, UNLOAD \
+ LOAD, RELOAD, UPGRADE, UNLOAD, \
+ ERL_NIF_VM_VARIANT \
}; \
ERL_NIF_INIT_BODY; \
return &entry; \
diff --git a/erts/emulator/beam/erl_nif_api_funcs.h b/erts/emulator/beam/erl_nif_api_funcs.h
index eca506593d..c991b61abe 100644
--- a/erts/emulator/beam/erl_nif_api_funcs.h
+++ b/erts/emulator/beam/erl_nif_api_funcs.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2009-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2009-2011. 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
@@ -21,6 +21,13 @@
# error This file should not be included directly
#endif
+/*
+** WARNING: add new ERL_NIF_API_FUNC_DECL entries at the bottom of the list
+** to keep compatibility on Windows!!!
+**
+** And don't forget to increase ERL_NIF_MINOR_VERSION in erl_nif.h
+** when adding functions to the API.
+*/
#ifdef ERL_NIF_API_FUNC_DECL
ERL_NIF_API_FUNC_DECL(void*,enif_priv_data,(ErlNifEnv*));
ERL_NIF_API_FUNC_DECL(void*,enif_alloc,(size_t size));
@@ -128,12 +135,17 @@ ERL_NIF_API_FUNC_DECL(int,enif_get_uint64,(ErlNifEnv*, ERL_NIF_TERM term, ErlNif
ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_int64,(ErlNifEnv*, ErlNifSInt64));
ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_uint64,(ErlNifEnv*, ErlNifUInt64));
#endif
+ERL_NIF_API_FUNC_DECL(int,enif_is_exception,(ErlNifEnv*, ERL_NIF_TERM term));
/*
-** Add last to keep compatibility on Windows!!!
+** Add new entries here to keep compatibility on Windows!!!
*/
#endif
+/*
+** Please keep the ERL_NIF_API_FUNC_MACRO list below in the same order
+** as the ERL_NIF_API_FUNC_DECL list above
+*/
#ifdef ERL_NIF_API_FUNC_MACRO
# define enif_priv_data ERL_NIF_API_FUNC_MACRO(enif_priv_data)
# define enif_alloc ERL_NIF_API_FUNC_MACRO(enif_alloc)
@@ -243,6 +255,11 @@ ERL_NIF_API_FUNC_DECL(ERL_NIF_TERM,enif_make_uint64,(ErlNifEnv*, ErlNifUInt64));
# define enif_make_uint64 ERL_NIF_API_FUNC_MACRO(enif_make_uint64)
#endif
+# define enif_is_exception ERL_NIF_API_FUNC_MACRO(enif_is_exception)
+
+/*
+** Add new entries here
+*/
#endif
#ifndef enif_make_list1
diff --git a/erts/emulator/beam/erl_nmgc.c b/erts/emulator/beam/erl_nmgc.c
index 626d4e295a..d7bfb2ab12 100644
--- a/erts/emulator/beam/erl_nmgc.c
+++ b/erts/emulator/beam/erl_nmgc.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2004-2011. 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
@@ -26,7 +26,6 @@
#include "erl_nmgc.h"
#include "erl_debug.h"
#if HIPE
-#include "hipe_bif0.h" /* for hipe_constants_{start,next} */
#include "hipe_stack.h"
#endif
diff --git a/erts/emulator/beam/erl_node_container_utils.h b/erts/emulator/beam/erl_node_container_utils.h
index ae1316eba2..2c67e781e0 100644
--- a/erts/emulator/beam/erl_node_container_utils.h
+++ b/erts/emulator/beam/erl_node_container_utils.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2001-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2001-2011. 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
@@ -255,19 +255,32 @@ extern int erts_use_r9_pids_ports;
#define internal_ref_no_of_numbers(x) \
(internal_ref_data((x))[0])
+#define internal_thing_ref_no_of_numbers(thing) \
+ (internal_thing_ref_data(thing)[0])
#define internal_ref_numbers(x) \
(&internal_ref_data((x))[1])
+#define internal_thing_ref_numbers(thing) \
+ (&internal_thing_ref_data(thing)[1])
#define external_ref_no_of_numbers(x) \
(external_ref_data((x))[0])
+#define external_thing_ref_no_of_numbers(thing) \
+ (external_thing_ref_data(thing)[0])
#define external_ref_numbers(x) \
(&external_ref_data((x))[1])
+#define external_thing_ref_numbers(thing) \
+ (&external_thing_ref_data(thing)[1])
+
#else
#define internal_ref_no_of_numbers(x) (internal_ref_data_words((x)))
+#define internal_thing_ref_no_of_numbers(t) (internal_thing_ref_data_words(t))
#define internal_ref_numbers(x) (internal_ref_data((x)))
+#define internal_thing_ref_numbers(t) (internal_thing_ref_data(t))
#define external_ref_no_of_numbers(x) (external_ref_data_words((x)))
+#define external_thing_ref_no_of_numbers(t) (external_thing_ref_data_words((t)))
#define external_ref_numbers(x) (external_ref_data((x)))
+#define external_thing_ref_numbers(t) (external_thing_ref_data((t)))
#endif
@@ -311,6 +324,8 @@ extern int erts_use_r9_pids_ports;
: external_ref_channel_no((x)))
#define is_ref(x) (is_internal_ref((x)) \
|| is_external_ref((x)))
+#define is_ref_rel(x,Base) (is_internal_ref_rel((x),Base) \
+ || is_external_ref_rel((x),Base))
#define is_not_ref(x) (!is_ref(x))
#endif
diff --git a/erts/emulator/beam/erl_node_tables.c b/erts/emulator/beam/erl_node_tables.c
index 8cdda395df..6daa127d23 100644
--- a/erts/emulator/beam/erl_node_tables.c
+++ b/erts/emulator/beam/erl_node_tables.c
@@ -235,7 +235,7 @@ erts_sysname_to_connected_dist_entry(Eterm sysname)
erts_smp_rwmtx_rlock(&erts_dist_table_rwmtx);
res_dep = (DistEntry *) hash_get(&erts_dist_table, (void *) &de);
if (res_dep) {
- long refc = erts_refc_inctest(&res_dep->refc, 1);
+ erts_aint_t refc = erts_refc_inctest(&res_dep->refc, 1);
if (refc < 2) /* Pending delete */
erts_refc_inc(&res_dep->refc, 1);
}
@@ -257,7 +257,7 @@ DistEntry *erts_find_or_insert_dist_entry(Eterm sysname)
{
DistEntry *res;
DistEntry de;
- long refc;
+ erts_aint_t refc;
res = erts_find_dist_entry(sysname);
if (res)
return res;
@@ -279,7 +279,7 @@ DistEntry *erts_find_dist_entry(Eterm sysname)
erts_smp_rwmtx_rlock(&erts_dist_table_rwmtx);
res = hash_get(&erts_dist_table, (void *) &de);
if (res) {
- long refc = erts_refc_inctest(&res->refc, 1);
+ erts_aint_t refc = erts_refc_inctest(&res->refc, 1);
if (refc < 2) /* Pending delete */
erts_refc_inc(&res->refc, 1);
}
@@ -586,7 +586,7 @@ ErlNode *erts_find_or_insert_node(Eterm sysname, Uint creation)
erts_smp_rwmtx_rlock(&erts_node_table_rwmtx);
res = hash_get(&erts_node_table, (void *) &ne);
if (res && res != erts_this_node) {
- long refc = erts_refc_inctest(&res->refc, 0);
+ erts_aint_t refc = erts_refc_inctest(&res->refc, 0);
if (refc < 2) /* New or pending delete */
erts_refc_inc(&res->refc, 1);
}
@@ -598,7 +598,7 @@ ErlNode *erts_find_or_insert_node(Eterm sysname, Uint creation)
res = hash_put(&erts_node_table, (void *) &ne);
ASSERT(res);
if (res != erts_this_node) {
- long refc = erts_refc_inctest(&res->refc, 0);
+ erts_aint_t refc = erts_refc_inctest(&res->refc, 0);
if (refc < 2) /* New or pending delete */
erts_refc_inc(&res->refc, 1);
}
diff --git a/erts/emulator/beam/erl_port_task.c b/erts/emulator/beam/erl_port_task.c
index c10724b951..1b07024ca1 100644
--- a/erts/emulator/beam/erl_port_task.c
+++ b/erts/emulator/beam/erl_port_task.c
@@ -129,7 +129,7 @@ reset_handle(ErtsPortTask *ptp)
{
if (ptp->handle) {
ASSERT(ptp == handle2task(ptp->handle));
- erts_smp_atomic_set(ptp->handle, (long) NULL);
+ erts_smp_atomic_set(ptp->handle, (erts_aint_t) NULL);
}
}
@@ -138,7 +138,7 @@ set_handle(ErtsPortTask *ptp, ErtsPortTaskHandle *pthp)
{
ptp->handle = pthp;
if (pthp) {
- erts_smp_atomic_set(pthp, (long) ptp);
+ erts_smp_atomic_set(pthp, (erts_aint_t) ptp);
ASSERT(ptp == handle2task(ptp->handle));
}
}
@@ -568,7 +568,7 @@ erts_port_task_schedule(Eterm id,
ErtsRunQueue *xrunq = erts_check_emigration_need(runq, ERTS_PORT_PRIO_LEVEL);
if (xrunq) {
/* Port emigrated ... */
- erts_smp_atomic_set(&pp->run_queue, (long) xrunq);
+ erts_smp_atomic_set(&pp->run_queue, (erts_aint_t) xrunq);
erts_smp_runq_unlock(runq);
runq = xrunq;
}
@@ -727,7 +727,8 @@ resume_after_block(void *vd)
ErtsPortTaskExeBlockData *d = (ErtsPortTaskExeBlockData *) vd;
erts_smp_runq_lock(d->runq);
if (d->resp)
- *d->resp = erts_smp_atomic_read(&erts_port_task_outstanding_io_tasks) != (long) 0;
+ *d->resp = (erts_smp_atomic_read(&erts_port_task_outstanding_io_tasks)
+ != (erts_aint_t) 0);
}
/*
@@ -748,7 +749,7 @@ erts_port_task_execute(ErtsRunQueue *runq, Port **curr_port_pp)
ErtsPortTask *ptp;
int res = 0;
int reds = ERTS_PORT_REDS_EXECUTE;
- long io_tasks_executed = 0;
+ erts_aint_t io_tasks_executed = 0;
int fpe_was_unmasked;
ErtsPortTaskExeBlockData blk_data = {runq, NULL};
@@ -942,7 +943,7 @@ erts_port_task_execute(ErtsRunQueue *runq, Port **curr_port_pp)
}
else {
/* Port emigrated ... */
- erts_smp_atomic_set(&pp->run_queue, (long) xrunq);
+ erts_smp_atomic_set(&pp->run_queue, (erts_aint_t) xrunq);
enqueue_port(xrunq, pp);
ASSERT(pp->sched.exe_taskq);
pp->sched.exe_taskq = NULL;
@@ -953,7 +954,8 @@ erts_port_task_execute(ErtsRunQueue *runq, Port **curr_port_pp)
port_was_enqueued = 1;
}
- res = erts_smp_atomic_read(&erts_port_task_outstanding_io_tasks) != (long) 0;
+ res = (erts_smp_atomic_read(&erts_port_task_outstanding_io_tasks)
+ != (erts_aint_t) 0);
ERTS_PT_CHK_PRES_PORTQ(runq, pp);
@@ -971,7 +973,7 @@ erts_port_task_execute(ErtsRunQueue *runq, Port **curr_port_pp)
erts_port_release(pp);
#else
{
- long refc;
+ erts_aint_t refc;
erts_smp_mtx_unlock(pp->lock);
refc = erts_smp_atomic_dectest(&pp->refc);
ASSERT(refc >= 0);
@@ -979,7 +981,8 @@ erts_port_task_execute(ErtsRunQueue *runq, Port **curr_port_pp)
erts_smp_runq_unlock(runq);
erts_port_cleanup(pp); /* Might aquire runq lock */
erts_smp_runq_lock(runq);
- res = erts_smp_atomic_read(&erts_port_task_outstanding_io_tasks) != (long) 0;
+ res = (erts_smp_atomic_read(&erts_port_task_outstanding_io_tasks)
+ != (erts_aint_t) 0);
}
}
#endif
@@ -1112,7 +1115,7 @@ erts_port_migrate(Port *prt, int *prt_locked,
if (!ERTS_PORT_IS_IN_RUNQ(from_rq, prt))
return ERTS_MIGRATE_FAILED_NOT_IN_RUNQ;
dequeue_port(from_rq, prt);
- erts_smp_atomic_set(&prt->run_queue, (long) to_rq);
+ erts_smp_atomic_set(&prt->run_queue, (erts_aint_t) to_rq);
enqueue_port(to_rq, prt);
return ERTS_MIGRATE_SUCCESS;
}
@@ -1125,7 +1128,7 @@ erts_port_migrate(Port *prt, int *prt_locked,
void
erts_port_task_init(void)
{
- erts_smp_atomic_init(&erts_port_task_outstanding_io_tasks, (long) 0);
+ erts_smp_atomic_init(&erts_port_task_outstanding_io_tasks, (erts_aint_t) 0);
init_port_task_alloc();
init_port_taskq_alloc();
}
diff --git a/erts/emulator/beam/erl_port_task.h b/erts/emulator/beam/erl_port_task.h
index f12d02da0c..3e2c5f07ab 100644
--- a/erts/emulator/beam/erl_port_task.h
+++ b/erts/emulator/beam/erl_port_task.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2006-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2006-2011. 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
@@ -79,7 +79,7 @@ ERTS_GLB_INLINE int erts_port_task_have_outstanding_io_tasks(void);
ERTS_GLB_INLINE void
erts_port_task_handle_init(ErtsPortTaskHandle *pthp)
{
- erts_smp_atomic_init(pthp, (long) NULL);
+ erts_smp_atomic_init(pthp, (erts_aint_t) NULL);
}
ERTS_GLB_INLINE int
@@ -102,6 +102,7 @@ erts_port_task_init_sched(ErtsPortTaskSched *ptsp)
ERTS_GLB_INLINE int
erts_port_task_have_outstanding_io_tasks(void)
{
+ ERTS_THR_MEMORY_BARRIER;
return erts_smp_atomic_read(&erts_port_task_outstanding_io_tasks) != 0;
}
diff --git a/erts/emulator/beam/erl_printf_term.c b/erts/emulator/beam/erl_printf_term.c
index d9f132f067..b71404fd27 100644
--- a/erts/emulator/beam/erl_printf_term.c
+++ b/erts/emulator/beam/erl_printf_term.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2005-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2005-2011. 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
@@ -216,233 +216,289 @@ static int print_atom_name(fmtfn_t fn, void* arg, Eterm atom, long *dcount)
}
+#define PRT_BAR ((Eterm) 0)
+#define PRT_COMMA ((Eterm) 1)
+#define PRT_CLOSE_LIST ((Eterm) 2)
+#define PRT_CLOSE_TUPLE ((Eterm) 3)
+#define PRT_TERM ((Eterm) 4)
+#define PRT_ONE_CONS ((Eterm) 5)
+#define PRT_PATCH_FUN_SIZE ((Eterm) 6)
+#define PRT_LAST_ARRAY_ELEMENT ((Eterm) 7) /* Note! Must be last... */
static int
print_term(fmtfn_t fn, void* arg, Eterm obj, long *dcount)
{
+ DECLARE_WSTACK(s);
int res;
int i;
+ Eterm val;
Uint32 *ref_num;
Eterm* nobj;
+#if HALFWORD_HEAP
+ UWord wobj;
+#endif
res = 0;
- if ((*dcount)-- <= 0)
- return res;
-
-#ifdef HYBRID___NOT_ACTIVE
- /* Color coded output based on memory location */
- if(ptr_val(obj) >= global_heap && ptr_val(obj) < global_hend)
- PRINT_STRING(res, fn, arg, "\033[32m");
-#ifdef INCREMENTAL
- else if(ptr_val(obj) >= inc_fromspc && ptr_val(obj) < inc_fromend)
- PRINT_STRING(res, fn, arg, "\033[33m");
+ goto L_jump_start;
+
+ L_outer_loop:
+ while (!WSTACK_ISEMPTY(s)) {
+ switch (val = WSTACK_POP(s)) {
+ case PRT_COMMA:
+ PRINT_CHAR(res, fn, arg, ',');
+ goto L_outer_loop;
+ case PRT_BAR:
+ PRINT_CHAR(res, fn, arg, '|');
+ goto L_outer_loop;
+ case PRT_CLOSE_LIST:
+ PRINT_CHAR(res, fn, arg, ']');
+ goto L_outer_loop;
+ case PRT_CLOSE_TUPLE:
+ PRINT_CHAR(res, fn, arg, '}');
+ goto L_outer_loop;
+ default:
+#if HALFWORD_HEAP
+ obj = (Eterm) (wobj = WSTACK_POP(s));
+#else
+ obj = WSTACK_POP(s);
#endif
- else if(IS_CONST(obj))
- PRINT_STRING(res, fn, arg, "\033[34m");
- else
- PRINT_STRING(res, fn, arg, "\033[31m");
+ switch (val) {
+ case PRT_TERM:
+ break;
+ case PRT_ONE_CONS:
+ L_print_one_cons:
+ {
+ Eterm* cons = list_val(obj);
+ Eterm tl;
+
+ obj = CAR(cons);
+ tl = CDR(cons);
+ if (is_not_nil(tl)) {
+ if (is_list(tl)) {
+ WSTACK_PUSH(s, tl);
+ WSTACK_PUSH(s, PRT_ONE_CONS);
+ WSTACK_PUSH(s, PRT_COMMA);
+ } else {
+ WSTACK_PUSH(s, tl);
+ WSTACK_PUSH(s, PRT_TERM);
+ WSTACK_PUSH(s, PRT_BAR);
+ }
+ }
+ }
+ break;
+ case PRT_LAST_ARRAY_ELEMENT:
+ {
+#if HALFWORD_HEAP
+ Eterm* ptr = (Eterm *) wobj;
+#else
+ Eterm* ptr = (Eterm *) obj;
#endif
+ obj = *ptr;
+ }
+ break;
+ default: /* PRT_LAST_ARRAY_ELEMENT+1 and upwards */
+ {
+#if HALFWORD_HEAP
+ Eterm* ptr = (Eterm *) wobj;
+#else
+ Eterm* ptr = (Eterm *) obj;
+#endif
+ obj = *ptr++;
+ WSTACK_PUSH(s, (UWord) ptr);
+ WSTACK_PUSH(s, val-1);
+ WSTACK_PUSH(s, PRT_COMMA);
+ }
+ break;
+ }
+ break;
+ }
- if (is_CP(obj)) {
- PRINT_STRING(res, fn, arg, "<cp/header:");
- PRINT_POINTER(res, fn, arg, cp_val(obj));
- PRINT_CHAR(res, fn, arg, '>');
- return res;
- }
+ L_jump_start:
- switch (tag_val_def(obj)) {
- case NIL_DEF:
- PRINT_STRING(res, fn, arg, "[]");
- break;
- case ATOM_DEF: {
- int tres = print_atom_name(fn, arg, obj, dcount);
- if (tres < 0)
- return tres;
- res += tres;
- if (*dcount <= 0)
- return res;
- break;
- }
- case SMALL_DEF:
- PRINT_SLONG(res, fn, arg, 'd', 0, 1, (signed long) signed_val(obj));
- break;
- case BIG_DEF: {
- int print_res;
- char def_buf[64];
- char *buf, *big_str;
- Uint sz = (Uint) big_decimal_estimate(obj);
- sz++;
- if (sz <= 64)
- buf = &def_buf[0];
- else
- buf = erts_alloc(ERTS_ALC_T_TMP, sz);
- big_str = erts_big_to_string(obj, buf, sz);
- print_res = erts_printf_string(fn, arg, big_str);
- if (buf != &def_buf[0])
- erts_free(ERTS_ALC_T_TMP, (void *) buf);
- if (print_res < 0)
- return print_res;
- res += print_res;
- break;
- }
- case REF_DEF:
- case EXTERNAL_REF_DEF:
- PRINT_STRING(res, fn, arg, "#Ref<");
- PRINT_ULONG(res, fn, arg, 'u', 0, 1,
- (unsigned long) ref_channel_no(obj));
- ref_num = ref_numbers(obj);
- for (i = ref_no_of_numbers(obj)-1; i >= 0; i--) {
- PRINT_CHAR(res, fn, arg, '.');
- PRINT_ULONG(res, fn, arg, 'u', 0, 1, (unsigned long) ref_num[i]);
+ if ((*dcount)-- <= 0)
+ goto L_done;
+
+ if (is_CP(obj)) {
+ PRINT_STRING(res, fn, arg, "<cp/header:");
+ PRINT_POINTER(res, fn, arg, cp_val(obj));
+ PRINT_CHAR(res, fn, arg, '>');
+ goto L_done;
}
- PRINT_CHAR(res, fn, arg, '>');
- break;
- case PID_DEF:
- case EXTERNAL_PID_DEF:
- PRINT_CHAR(res, fn, arg, '<');
- PRINT_ULONG(res, fn, arg, 'u', 0, 1,
- (unsigned long) pid_channel_no(obj));
- PRINT_CHAR(res, fn, arg, '.');
- PRINT_ULONG(res, fn, arg, 'u', 0, 1,
- (unsigned long) pid_number(obj));
- PRINT_CHAR(res, fn, arg, '.');
- PRINT_ULONG(res, fn, arg, 'u', 0, 1,
- (unsigned long) pid_serial(obj));
- PRINT_CHAR(res, fn, arg, '>');
- break;
- case PORT_DEF:
- case EXTERNAL_PORT_DEF:
- PRINT_STRING(res, fn, arg, "#Port<");
- PRINT_ULONG(res, fn, arg, 'u', 0, 1,
- (unsigned long) port_channel_no(obj));
- PRINT_CHAR(res, fn, arg, '.');
- PRINT_ULONG(res, fn, arg, 'u', 0, 1,
- (unsigned long) port_number(obj));
- PRINT_CHAR(res, fn, arg, '>');
- break;
- case LIST_DEF:
- if (is_printable_string(obj)) {
- int c;
- PRINT_CHAR(res, fn, arg, '"');
- nobj = list_val(obj);
- while (1) {
- if ((*dcount)-- <= 0)
- return res;
- c = signed_val(*nobj++);
- if (c == '\n')
- PRINT_STRING(res, fn, arg, "\\n");
- else {
- if (c == '"')
- PRINT_CHAR(res, fn, arg, '\\');
- PRINT_CHAR(res, fn, arg, (char) c);
- }
- if (is_not_list(*nobj))
- break;
- nobj = list_val(*nobj);
- }
- PRINT_CHAR(res, fn, arg, '"');
- } else {
- PRINT_CHAR(res, fn, arg, '[');
- nobj = list_val(obj);
- while (1) {
- int tres = print_term(fn, arg, *nobj++, dcount);
- if (tres < 0)
- return tres;
- res += tres;
- if (*dcount <= 0)
- return res;
- if (is_not_list(*nobj))
- break;
- PRINT_CHAR(res, fn, arg, ',');
- nobj = list_val(*nobj);
- }
- if (is_not_nil(*nobj)) {
- int tres;
- PRINT_CHAR(res, fn, arg, '|');
- tres = print_term(fn, arg, *nobj, dcount);
- if (tres < 0)
- return tres;
- res += tres;
- if (*dcount <= 0)
- return res;
+
+ switch (tag_val_def(obj)) {
+ case NIL_DEF:
+ PRINT_STRING(res, fn, arg, "[]");
+ break;
+ case ATOM_DEF: {
+ int tres = print_atom_name(fn, arg, obj, dcount);
+ if (tres < 0) {
+ res = tres;
+ goto L_done;
}
- PRINT_CHAR(res, fn, arg, ']');
- }
- break;
- case TUPLE_DEF:
- nobj = tuple_val(obj); /* pointer to arity */
- i = arityval(*nobj); /* arity */
- PRINT_CHAR(res, fn, arg, '{');
- while (i--) {
- int tres = print_term(fn, arg, *++nobj, dcount);
- if (tres < 0)
- return tres;
res += tres;
if (*dcount <= 0)
- return res;
- if (i >= 1)
- PRINT_CHAR(res, fn, arg, ',');
- }
- PRINT_CHAR(res, fn, arg, '}');
- break;
- case FLOAT_DEF: {
- FloatDef ff;
- GET_DOUBLE(obj, ff);
- PRINT_DOUBLE(res, fn, arg, 'e', 6, 0, ff.fd);
+ goto L_done;
+ break;
}
- break;
- case BINARY_DEF:
- {
- ProcBin* pb = (ProcBin *) binary_val(obj);
- if (pb->size == 1)
- PRINT_STRING(res, fn, arg, "<<1 byte>>");
- else {
- PRINT_STRING(res, fn, arg, "<<");
- PRINT_ULONG(res, fn, arg, 'u', 0, 1, (unsigned long) pb->size);
- PRINT_STRING(res, fn, arg, " bytes>>");
+ case SMALL_DEF:
+ PRINT_SLONG(res, fn, arg, 'd', 0, 1, (signed long) signed_val(obj));
+ break;
+ case BIG_DEF: {
+ int print_res;
+ char def_buf[64];
+ char *buf, *big_str;
+ Uint sz = (Uint) big_decimal_estimate(obj);
+ sz++;
+ if (sz <= 64)
+ buf = &def_buf[0];
+ else
+ buf = erts_alloc(ERTS_ALC_T_TMP, sz);
+ big_str = erts_big_to_string(obj, buf, sz);
+ print_res = erts_printf_string(fn, arg, big_str);
+ if (buf != &def_buf[0])
+ erts_free(ERTS_ALC_T_TMP, (void *) buf);
+ if (print_res < 0) {
+ res = print_res;
+ goto L_done;
}
+ res += print_res;
+ break;
}
- break;
- case EXPORT_DEF:
- {
- Export* ep = *((Export **) (export_val(obj) + 1));
- Atom* module = atom_tab(atom_val(ep->code[0]));
- Atom* name = atom_tab(atom_val(ep->code[1]));
-
- PRINT_STRING(res, fn, arg, "#Fun<");
- PRINT_BUF(res, fn, arg, module->name, module->len);
+ case REF_DEF:
+ case EXTERNAL_REF_DEF:
+ PRINT_STRING(res, fn, arg, "#Ref<");
+ PRINT_ULONG(res, fn, arg, 'u', 0, 1,
+ (unsigned long) ref_channel_no(obj));
+ ref_num = ref_numbers(obj);
+ for (i = ref_no_of_numbers(obj)-1; i >= 0; i--) {
+ PRINT_CHAR(res, fn, arg, '.');
+ PRINT_ULONG(res, fn, arg, 'u', 0, 1, (unsigned long) ref_num[i]);
+ }
+ PRINT_CHAR(res, fn, arg, '>');
+ break;
+ case PID_DEF:
+ case EXTERNAL_PID_DEF:
+ PRINT_CHAR(res, fn, arg, '<');
+ PRINT_ULONG(res, fn, arg, 'u', 0, 1,
+ (unsigned long) pid_channel_no(obj));
PRINT_CHAR(res, fn, arg, '.');
- PRINT_BUF(res, fn, arg, name->name, name->len);
+ PRINT_ULONG(res, fn, arg, 'u', 0, 1,
+ (unsigned long) pid_number(obj));
PRINT_CHAR(res, fn, arg, '.');
- PRINT_SLONG(res, fn, arg, 'd', 0, 1,
- (signed long) ep->code[2]);
+ PRINT_ULONG(res, fn, arg, 'u', 0, 1,
+ (unsigned long) pid_serial(obj));
PRINT_CHAR(res, fn, arg, '>');
- }
- break;
- case FUN_DEF:
- {
- ErlFunThing *funp = (ErlFunThing *) fun_val(obj);
- Atom *ap = atom_tab(atom_val(funp->fe->module));
-
- PRINT_STRING(res, fn, arg, "#Fun<");
- PRINT_BUF(res, fn, arg, ap->name, ap->len);
- PRINT_CHAR(res, fn, arg, '.');
- PRINT_SLONG(res, fn, arg, 'd', 0, 1,
- (signed long) funp->fe->old_index);
+ break;
+ case PORT_DEF:
+ case EXTERNAL_PORT_DEF:
+ PRINT_STRING(res, fn, arg, "#Port<");
+ PRINT_ULONG(res, fn, arg, 'u', 0, 1,
+ (unsigned long) port_channel_no(obj));
PRINT_CHAR(res, fn, arg, '.');
- PRINT_SLONG(res, fn, arg, 'd', 0, 1,
- (signed long) funp->fe->old_uniq);
+ PRINT_ULONG(res, fn, arg, 'u', 0, 1,
+ (unsigned long) port_number(obj));
PRINT_CHAR(res, fn, arg, '>');
+ break;
+ case LIST_DEF:
+ if (is_printable_string(obj)) {
+ int c;
+ PRINT_CHAR(res, fn, arg, '"');
+ nobj = list_val(obj);
+ while (1) {
+ if ((*dcount)-- <= 0)
+ goto L_done;
+ c = signed_val(*nobj++);
+ if (c == '\n')
+ PRINT_STRING(res, fn, arg, "\\n");
+ else {
+ if (c == '"')
+ PRINT_CHAR(res, fn, arg, '\\');
+ PRINT_CHAR(res, fn, arg, (char) c);
+ }
+ if (is_not_list(*nobj))
+ break;
+ nobj = list_val(*nobj);
+ }
+ PRINT_CHAR(res, fn, arg, '"');
+ } else {
+ PRINT_CHAR(res, fn, arg, '[');
+ WSTACK_PUSH(s,PRT_CLOSE_LIST);
+ goto L_print_one_cons;
+ }
+ break;
+ case TUPLE_DEF:
+ nobj = tuple_val(obj); /* pointer to arity */
+ i = arityval(*nobj); /* arity */
+ PRINT_CHAR(res, fn, arg, '{');
+ WSTACK_PUSH(s,PRT_CLOSE_TUPLE);
+ ++nobj;
+ if (i > 0) {
+ WSTACK_PUSH(s, (UWord) nobj);
+ WSTACK_PUSH(s, PRT_LAST_ARRAY_ELEMENT+i-1);
+ }
+ break;
+ case FLOAT_DEF: {
+ FloatDef ff;
+ GET_DOUBLE(obj, ff);
+ PRINT_DOUBLE(res, fn, arg, 'e', 6, 0, ff.fd);
+ }
+ break;
+ case BINARY_DEF:
+ {
+ ProcBin* pb = (ProcBin *) binary_val(obj);
+ if (pb->size == 1)
+ PRINT_STRING(res, fn, arg, "<<1 byte>>");
+ else {
+ PRINT_STRING(res, fn, arg, "<<");
+ PRINT_ULONG(res, fn, arg, 'u', 0, 1, (unsigned long) pb->size);
+ PRINT_STRING(res, fn, arg, " bytes>>");
+ }
+ }
+ break;
+ case EXPORT_DEF:
+ {
+ Export* ep = *((Export **) (export_val(obj) + 1));
+ Atom* module = atom_tab(atom_val(ep->code[0]));
+ Atom* name = atom_tab(atom_val(ep->code[1]));
+
+ PRINT_STRING(res, fn, arg, "#Fun<");
+ PRINT_BUF(res, fn, arg, module->name, module->len);
+ PRINT_CHAR(res, fn, arg, '.');
+ PRINT_BUF(res, fn, arg, name->name, name->len);
+ PRINT_CHAR(res, fn, arg, '.');
+ PRINT_SLONG(res, fn, arg, 'd', 0, 1,
+ (signed long) ep->code[2]);
+ PRINT_CHAR(res, fn, arg, '>');
+ }
+ break;
+ case FUN_DEF:
+ {
+ ErlFunThing *funp = (ErlFunThing *) fun_val(obj);
+ Atom *ap = atom_tab(atom_val(funp->fe->module));
+
+ PRINT_STRING(res, fn, arg, "#Fun<");
+ PRINT_BUF(res, fn, arg, ap->name, ap->len);
+ PRINT_CHAR(res, fn, arg, '.');
+ PRINT_SLONG(res, fn, arg, 'd', 0, 1,
+ (signed long) funp->fe->old_index);
+ PRINT_CHAR(res, fn, arg, '.');
+ PRINT_SLONG(res, fn, arg, 'd', 0, 1,
+ (signed long) funp->fe->old_uniq);
+ PRINT_CHAR(res, fn, arg, '>');
+ }
+ break;
+ default:
+ PRINT_STRING(res, fn, arg, "<unknown:");
+ PRINT_POINTER(res, fn, arg, (UWord) obj);
+ PRINT_CHAR(res, fn, arg, '>');
+ break;
}
- break;
- default:
- PRINT_STRING(res, fn, arg, "<unknown:");
- PRINT_POINTER(res, fn, arg, (UWord) obj);
- PRINT_CHAR(res, fn, arg, '>');
- break;
}
+ L_done:
+
+ DESTROY_WSTACK(s);
return res;
}
diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c
index fc950af8ce..8a56976905 100644
--- a/erts/emulator/beam/erl_process.c
+++ b/erts/emulator/beam/erl_process.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -127,21 +127,22 @@ ErtsLcPSDLocks erts_psd_required_locks[ERTS_PSD_SIZE];
int erts_disable_proc_not_running_opt;
-#define ERTS_SCHDLR_SSPND_CHNG_WAITER (((long) 1) << 0)
-#define ERTS_SCHDLR_SSPND_CHNG_MSB (((long) 1) << 1)
-#define ERTS_SCHDLR_SSPND_CHNG_ONLN (((long) 1) << 2)
+#define ERTS_SCHDLR_SSPND_CHNG_WAITER (((erts_aint32_t) 1) << 0)
+#define ERTS_SCHDLR_SSPND_CHNG_MSB (((erts_aint32_t) 1) << 1)
+#define ERTS_SCHDLR_SSPND_CHNG_ONLN (((erts_aint32_t) 1) << 2)
#ifndef DEBUG
#define ERTS_SCHDLR_SSPND_CHNG_SET(VAL, OLD_VAL) \
- erts_smp_atomic_set(&schdlr_sspnd.changing, (VAL))
+ erts_smp_atomic32_set(&schdlr_sspnd.changing, (VAL))
#else
#define ERTS_SCHDLR_SSPND_CHNG_SET(VAL, OLD_VAL) \
do { \
- long old_val__ = erts_smp_atomic_xchg(&schdlr_sspnd.changing, \
- (VAL)); \
+ erts_aint32_t old_val__; \
+ old_val__ = erts_smp_atomic32_xchg(&schdlr_sspnd.changing, \
+ (VAL)); \
ASSERT(old_val__ == (OLD_VAL)); \
} while (0)
@@ -154,10 +155,10 @@ static struct {
int online;
int curr_online;
int wait_curr_online;
- erts_smp_atomic_t changing;
- erts_smp_atomic_t active;
+ erts_smp_atomic32_t changing;
+ erts_smp_atomic32_t active;
struct {
- erts_smp_atomic_t ongoing;
+ erts_smp_atomic32_t ongoing;
long wait_active;
ErtsProcList *procs;
} msb; /* Multi Scheduling Block */
@@ -165,11 +166,11 @@ static struct {
static struct {
erts_smp_mtx_t update_mtx;
- erts_smp_atomic_t active_runqs;
+ erts_smp_atomic32_t active_runqs;
int last_active_runqs;
- erts_smp_atomic_t used_runqs;
+ erts_smp_atomic32_t used_runqs;
int forced_check_balance;
- erts_smp_atomic_t checking_balance;
+ erts_smp_atomic32_t checking_balance;
int halftime;
int full_reds_history_index;
struct {
@@ -199,11 +200,11 @@ static erts_tsd_key_t sched_data_key;
static erts_smp_mtx_t proc_tab_mtx;
-static erts_smp_atomic_t function_calls;
+static erts_smp_atomic32_t function_calls;
#ifdef ERTS_SMP
-static erts_smp_atomic_t doing_sys_schedule;
-static erts_smp_atomic_t no_empty_run_queues;
+static erts_smp_atomic32_t doing_sys_schedule;
+static erts_smp_atomic32_t no_empty_run_queues;
#else /* !ERTS_SMP */
ErtsSchedulerData *erts_scheduler_data;
#endif
@@ -247,7 +248,10 @@ Uint erts_num_active_procs;
Process** erts_active_procs;
#endif
-static erts_smp_atomic_t process_count;
+#if ERTS_MAX_PROCESSES > 0x7fffffff
+#error "Need to store process_count in another type"
+#endif
+static erts_smp_atomic32_t process_count;
typedef struct ErtsTermProcElement_ ErtsTermProcElement;
struct ErtsTermProcElement_ {
@@ -407,7 +411,7 @@ erts_init_process(int ncpu)
init_proclist_alloc();
- erts_smp_atomic_init(&process_count, 0);
+ erts_smp_atomic32_init(&process_count, 0);
if (erts_use_r9_pids_ports) {
proc_bits = ERTS_R9_PROC_BITS;
@@ -568,7 +572,7 @@ erts_psd_set_init(Process *p, ErtsProcLocks plocks, int ix, void *data)
#ifdef ERTS_SMP
void
-erts_sched_finish_poke(ErtsSchedulerSleepInfo *ssi, long flags)
+erts_sched_finish_poke(ErtsSchedulerSleepInfo *ssi, erts_aint32_t flags)
{
switch (flags & ERTS_SSI_FLGS_SLEEP_TYPE) {
case ERTS_SSI_FLG_POLL_SLEEPING:
@@ -586,6 +590,118 @@ erts_sched_finish_poke(ErtsSchedulerSleepInfo *ssi, long flags)
}
}
+typedef struct erts_misc_aux_work_t_ erts_misc_aux_work_t;
+struct erts_misc_aux_work_t_ {
+ erts_misc_aux_work_t *next;
+ void (*func)(void *);
+ void *arg;
+};
+
+typedef struct {
+ erts_smp_mtx_t mtx;
+ erts_misc_aux_work_t *first;
+ erts_misc_aux_work_t *last;
+} erts_misc_aux_work_q_t;
+
+typedef union {
+ erts_misc_aux_work_q_t data;
+ char align[ERTS_ALC_CACHE_LINE_ALIGN_SIZE(sizeof(erts_misc_aux_work_q_t))];
+} erts_algnd_misc_aux_work_q_t;
+
+static erts_algnd_misc_aux_work_q_t *misc_aux_work_queues;
+
+ERTS_SCHED_PREF_QUICK_ALLOC_IMPL(misc_aux_work,
+ erts_misc_aux_work_t,
+ 200,
+ ERTS_ALC_T_MISC_AUX_WORK)
+
+static void
+init_misc_aux_work(void)
+{
+ int ix;
+
+ init_misc_aux_work_alloc();
+
+ misc_aux_work_queues =
+ erts_alloc_permanent_cache_aligned(ERTS_ALC_T_MISC_AUX_WORK_Q,
+ erts_no_schedulers *
+ sizeof(erts_algnd_misc_aux_work_q_t));
+
+ for (ix = 0; ix < erts_no_schedulers; ix++) {
+ erts_smp_mtx_init_x(&misc_aux_work_queues[ix].data.mtx,
+ "misc_aux_work_queue",
+ make_small(ix + 1));
+ misc_aux_work_queues[ix].data.first = NULL;
+ misc_aux_work_queues[ix].data.last = NULL;
+ }
+}
+
+static void
+handle_misc_aux_work(ErtsSchedulerData *esdp)
+{
+ int ix = (int) esdp->no - 1;
+ erts_misc_aux_work_t *mawp;
+
+ erts_smp_mtx_lock(&misc_aux_work_queues[ix].data.mtx);
+ mawp = misc_aux_work_queues[ix].data.first;
+ misc_aux_work_queues[ix].data.first = NULL;
+ misc_aux_work_queues[ix].data.last = NULL;
+ erts_smp_mtx_unlock(&misc_aux_work_queues[ix].data.mtx);
+
+ while (mawp) {
+ erts_misc_aux_work_t *free_mawp;
+ mawp->func(mawp->arg);
+ free_mawp = mawp;
+ mawp = mawp->next;
+ misc_aux_work_free(free_mawp);
+ }
+}
+
+void
+erts_smp_schedule_misc_aux_work(int ignore_self,
+ int max_sched,
+ void (*func)(void *),
+ void *arg)
+{
+ int ix, ignore_ix = -1;
+
+ if (ignore_self) {
+ ErtsSchedulerData *esdp = erts_get_scheduler_data();
+ if (esdp)
+ ignore_ix = (int) esdp->no - 1;
+ }
+
+ ASSERT(0 <= max_sched && max_sched <= erts_no_schedulers);
+
+ for (ix = 0; ix < max_sched; ix++) {
+ erts_aint32_t aux_work;
+ erts_misc_aux_work_t *mawp;
+ ErtsSchedulerSleepInfo *ssi;
+ if (ix == ignore_ix)
+ continue;
+
+ mawp = misc_aux_work_alloc();
+
+ mawp->func = func;
+ mawp->arg = arg;
+ mawp->next = NULL;
+
+ erts_smp_mtx_lock(&misc_aux_work_queues[ix].data.mtx);
+ if (!misc_aux_work_queues[ix].data.last)
+ misc_aux_work_queues[ix].data.first = mawp;
+ else
+ misc_aux_work_queues[ix].data.last->next = mawp;
+ misc_aux_work_queues[ix].data.last = mawp;
+ erts_smp_mtx_unlock(&misc_aux_work_queues[ix].data.mtx);
+
+ ssi = ERTS_SCHED_SLEEP_INFO_IX(ix);
+ aux_work = erts_smp_atomic32_bor(&ssi->aux_work,
+ ERTS_SSI_AUX_WORK_MISC);
+ if ((aux_work & ERTS_SSI_AUX_WORK_MISC) == 0)
+ erts_sched_poke(ssi);
+ }
+}
+
#ifdef ERTS_SMP_SCHEDULERS_NEED_TO_CHECK_CHILDREN
void
erts_smp_notify_check_children_needed(void)
@@ -593,11 +709,11 @@ erts_smp_notify_check_children_needed(void)
int i;
for (i = 0; i < erts_no_schedulers; i++) {
- long aux_work;
+ erts_aint32_t aux_work;
ErtsSchedulerSleepInfo *ssi;
ssi = ERTS_SCHED_SLEEP_INFO_IX(i);
- aux_work = erts_smp_atomic_bor(&ssi->aux_work,
- ERTS_SSI_AUX_WORK_CHECK_CHILDREN);
+ aux_work = erts_smp_atomic32_bor(&ssi->aux_work,
+ ERTS_SSI_AUX_WORK_CHECK_CHILDREN);
if (!(aux_work & ERTS_SSI_AUX_WORK_CHECK_CHILDREN))
erts_sched_poke(ssi);
}
@@ -605,16 +721,22 @@ erts_smp_notify_check_children_needed(void)
#endif
#ifdef ERTS_SCHED_NEED_BLOCKABLE_AUX_WORK
-static ERTS_INLINE long
+static ERTS_INLINE erts_aint32_t
blockable_aux_work(ErtsSchedulerData *esdp,
ErtsSchedulerSleepInfo *ssi,
- long aux_work)
+ erts_aint32_t aux_work)
{
if (aux_work & ERTS_SSI_BLOCKABLE_AUX_WORK_MASK) {
+ if (aux_work & ERTS_SSI_AUX_WORK_MISC) {
+ aux_work = erts_smp_atomic32_band(&ssi->aux_work,
+ ~ERTS_SSI_AUX_WORK_MISC);
+ aux_work &= ~ERTS_SSI_AUX_WORK_MISC;
+ handle_misc_aux_work(esdp);
+ }
#ifdef ERTS_SMP_SCHEDULERS_NEED_TO_CHECK_CHILDREN
if (aux_work & ERTS_SSI_AUX_WORK_CHECK_CHILDREN) {
- aux_work = erts_smp_atomic_band(&ssi->aux_work,
- ~ERTS_SSI_AUX_WORK_CHECK_CHILDREN);
+ aux_work = erts_smp_atomic32_band(&ssi->aux_work,
+ ~ERTS_SSI_AUX_WORK_CHECK_CHILDREN);
aux_work &= ~ERTS_SSI_AUX_WORK_CHECK_CHILDREN;
erts_check_children();
}
@@ -626,10 +748,10 @@ blockable_aux_work(ErtsSchedulerData *esdp,
#endif
#ifdef ERTS_SCHED_NEED_NONBLOCKABLE_AUX_WORK
-static ERTS_INLINE long
+static ERTS_INLINE erts_aint32_t
nonblockable_aux_work(ErtsSchedulerData *esdp,
ErtsSchedulerSleepInfo *ssi,
- long aux_work)
+ erts_aint32_t aux_work)
{
if (aux_work & ERTS_SSI_NONBLOCKABLE_AUX_WORK_MASK) {
@@ -689,15 +811,31 @@ erts_active_schedulers(void)
return as;
}
+#ifdef ERTS_SMP
+
+static ERTS_INLINE void
+clear_sys_scheduling(void)
+{
+ erts_smp_atomic32_set_relb(&doing_sys_schedule, 0);
+}
+
+static ERTS_INLINE int
+try_set_sys_scheduling(void)
+{
+ return 0 == erts_smp_atomic32_cmpxchg_acqb(&doing_sys_schedule, 1, 0);
+}
+
+#endif
+
static ERTS_INLINE int
prepare_for_sys_schedule(void)
{
#ifdef ERTS_SMP
while (!erts_port_task_have_outstanding_io_tasks()
- && !erts_smp_atomic_xchg(&doing_sys_schedule, 1)) {
+ && try_set_sys_scheduling()) {
if (!erts_port_task_have_outstanding_io_tasks())
return 1;
- erts_smp_atomic_set(&doing_sys_schedule, 0);
+ clear_sys_scheduling();
}
return 0;
#else
@@ -745,53 +883,55 @@ sched_active(Uint no, ErtsRunQueue *rq)
static int ERTS_INLINE
ongoing_multi_scheduling_block(void)
{
- return erts_smp_atomic_read(&schdlr_sspnd.msb.ongoing) != 0;
+ return erts_smp_atomic32_read(&schdlr_sspnd.msb.ongoing) != 0;
}
static ERTS_INLINE void
empty_runq(ErtsRunQueue *rq)
{
- long oifls = erts_smp_atomic_band(&rq->info_flags, ~ERTS_RUNQ_IFLG_NONEMPTY);
+ erts_aint32_t oifls = erts_smp_atomic32_band(&rq->info_flags,
+ ~ERTS_RUNQ_IFLG_NONEMPTY);
if (oifls & ERTS_RUNQ_IFLG_NONEMPTY) {
#ifdef DEBUG
- long empty = erts_smp_atomic_read(&no_empty_run_queues);
+ erts_aint32_t empty = erts_smp_atomic32_read(&no_empty_run_queues);
/*
* For a short period of time no_empty_run_queues may have
* been increased twice for a specific run queue.
*/
ASSERT(0 <= empty && empty < 2*erts_no_run_queues);
#endif
- erts_smp_atomic_inc(&no_empty_run_queues);
+ erts_smp_atomic32_inc(&no_empty_run_queues);
}
}
static ERTS_INLINE void
non_empty_runq(ErtsRunQueue *rq)
{
- long oifls = erts_smp_atomic_bor(&rq->info_flags, ERTS_RUNQ_IFLG_NONEMPTY);
+ erts_aint32_t oifls = erts_smp_atomic32_bor(&rq->info_flags,
+ ERTS_RUNQ_IFLG_NONEMPTY);
if (!(oifls & ERTS_RUNQ_IFLG_NONEMPTY)) {
#ifdef DEBUG
- long empty = erts_smp_atomic_read(&no_empty_run_queues);
+ erts_aint32_t empty = erts_smp_atomic32_read(&no_empty_run_queues);
/*
* For a short period of time no_empty_run_queues may have
* been increased twice for a specific run queue.
*/
ASSERT(0 < empty && empty <= 2*erts_no_run_queues);
#endif
- erts_smp_atomic_dec(&no_empty_run_queues);
+ erts_smp_atomic32_dec(&no_empty_run_queues);
}
}
-static long
+static erts_aint32_t
sched_prep_spin_wait(ErtsSchedulerSleepInfo *ssi)
{
- long oflgs;
- long nflgs = (ERTS_SSI_FLG_SLEEPING
- | ERTS_SSI_FLG_WAITING);
- long xflgs = 0;
+ erts_aint32_t oflgs;
+ erts_aint32_t nflgs = (ERTS_SSI_FLG_SLEEPING
+ | ERTS_SSI_FLG_WAITING);
+ erts_aint32_t xflgs = 0;
do {
- oflgs = erts_smp_atomic_cmpxchg(&ssi->flags, nflgs, xflgs);
+ oflgs = erts_smp_atomic32_cmpxchg(&ssi->flags, nflgs, xflgs);
if (oflgs == xflgs)
return nflgs;
xflgs = oflgs;
@@ -799,16 +939,16 @@ sched_prep_spin_wait(ErtsSchedulerSleepInfo *ssi)
return oflgs;
}
-static long
+static erts_aint32_t
sched_prep_cont_spin_wait(ErtsSchedulerSleepInfo *ssi)
{
- long oflgs;
- long nflgs = (ERTS_SSI_FLG_SLEEPING
- | ERTS_SSI_FLG_WAITING);
- long xflgs = ERTS_SSI_FLG_WAITING;
+ erts_aint32_t oflgs;
+ erts_aint32_t nflgs = (ERTS_SSI_FLG_SLEEPING
+ | ERTS_SSI_FLG_WAITING);
+ erts_aint32_t xflgs = ERTS_SSI_FLG_WAITING;
do {
- oflgs = erts_smp_atomic_cmpxchg(&ssi->flags, nflgs, xflgs);
+ oflgs = erts_smp_atomic32_cmpxchg(&ssi->flags, nflgs, xflgs);
if (oflgs == xflgs)
return nflgs;
xflgs = oflgs;
@@ -817,15 +957,15 @@ sched_prep_cont_spin_wait(ErtsSchedulerSleepInfo *ssi)
return oflgs;
}
-static long
+static erts_aint32_t
sched_spin_wait(ErtsSchedulerSleepInfo *ssi, int spincount)
{
- long until_yield = ERTS_SCHED_SPIN_UNTIL_YIELD;
+ int until_yield = ERTS_SCHED_SPIN_UNTIL_YIELD;
int sc = spincount;
- long flgs;
+ erts_aint32_t flgs;
do {
- flgs = erts_smp_atomic_read(&ssi->flags);
+ flgs = erts_smp_atomic32_read(&ssi->flags);
if ((flgs & (ERTS_SSI_FLG_SLEEPING|ERTS_SSI_FLG_WAITING))
!= (ERTS_SSI_FLG_SLEEPING|ERTS_SSI_FLG_WAITING)) {
break;
@@ -839,18 +979,18 @@ sched_spin_wait(ErtsSchedulerSleepInfo *ssi, int spincount)
return flgs;
}
-static long
-sched_set_sleeptype(ErtsSchedulerSleepInfo *ssi, long sleep_type)
+static erts_aint32_t
+sched_set_sleeptype(ErtsSchedulerSleepInfo *ssi, erts_aint32_t sleep_type)
{
- long oflgs;
- long nflgs = ERTS_SSI_FLG_SLEEPING|ERTS_SSI_FLG_WAITING|sleep_type;
- long xflgs = ERTS_SSI_FLG_SLEEPING|ERTS_SSI_FLG_WAITING;
+ erts_aint32_t oflgs;
+ erts_aint32_t nflgs = ERTS_SSI_FLG_SLEEPING|ERTS_SSI_FLG_WAITING|sleep_type;
+ erts_aint32_t xflgs = ERTS_SSI_FLG_SLEEPING|ERTS_SSI_FLG_WAITING;
if (sleep_type == ERTS_SSI_FLG_TSE_SLEEPING)
erts_tse_reset(ssi->event);
while (1) {
- oflgs = erts_smp_atomic_cmpxchg(&ssi->flags, nflgs, xflgs);
+ oflgs = erts_smp_atomic32_cmpxchg(&ssi->flags, nflgs, xflgs);
if (oflgs == xflgs)
return nflgs;
if ((oflgs & (ERTS_SSI_FLG_SLEEPING|ERTS_SSI_FLG_WAITING))
@@ -867,14 +1007,14 @@ sched_set_sleeptype(ErtsSchedulerSleepInfo *ssi, long sleep_type)
!= ERTS_SSI_FLG_WAITING)
static void
-scheduler_wait(long *fcalls, ErtsSchedulerData *esdp, ErtsRunQueue *rq)
+scheduler_wait(int *fcalls, ErtsSchedulerData *esdp, ErtsRunQueue *rq)
{
ErtsSchedulerSleepInfo *ssi = esdp->ssi;
int spincount;
- long flgs;
+ erts_aint32_t flgs;
#if defined(ERTS_SCHED_NEED_NONBLOCKABLE_AUX_WORK) \
|| defined(ERTS_SCHED_NEED_BLOCKABLE_AUX_WORK)
- long aux_work;
+ erts_aint32_t aux_work;
#endif
ERTS_SMP_LC_ASSERT(erts_smp_lc_runq_is_locked(rq));
@@ -910,7 +1050,7 @@ scheduler_wait(long *fcalls, ErtsSchedulerData *esdp, ErtsRunQueue *rq)
tse_wait:
#ifdef ERTS_SCHED_NEED_BLOCKABLE_AUX_WORK
- aux_work = erts_smp_atomic_read(&ssi->aux_work);
+ aux_work = erts_smp_atomic32_read(&ssi->aux_work);
tse_blockable_aux_work:
aux_work = blockable_aux_work(esdp, ssi, aux_work);
#endif
@@ -920,7 +1060,7 @@ scheduler_wait(long *fcalls, ErtsSchedulerData *esdp, ErtsRunQueue *rq)
#ifdef ERTS_SCHED_NEED_NONBLOCKABLE_AUX_WORK
#ifndef ERTS_SCHED_NEED_BLOCKABLE_AUX_WORK
- aux_work = erts_smp_atomic_read(&ssi->aux_work);
+ aux_work = erts_smp_atomic32_read(&ssi->aux_work);
#endif
nonblockable_aux_work(esdp, ssi, aux_work);
#endif
@@ -953,7 +1093,7 @@ scheduler_wait(long *fcalls, ErtsSchedulerData *esdp, ErtsRunQueue *rq)
}
#ifdef ERTS_SCHED_NEED_BLOCKABLE_AUX_WORK
- aux_work = erts_smp_atomic_read(&ssi->aux_work);
+ aux_work = erts_smp_atomic32_read(&ssi->aux_work);
if (aux_work & ERTS_SSI_BLOCKABLE_AUX_WORK_MASK) {
erts_smp_activity_end(ERTS_ACTIVITY_WAIT, NULL, NULL, NULL);
goto tse_blockable_aux_work;
@@ -965,16 +1105,16 @@ scheduler_wait(long *fcalls, ErtsSchedulerData *esdp, ErtsRunQueue *rq)
erts_smp_activity_end(ERTS_ACTIVITY_WAIT, NULL, NULL, NULL);
if (flgs & ~ERTS_SSI_FLG_SUSPENDED)
- erts_smp_atomic_band(&ssi->flags, ERTS_SSI_FLG_SUSPENDED);
+ erts_smp_atomic32_band(&ssi->flags, ERTS_SSI_FLG_SUSPENDED);
erts_smp_runq_lock(rq);
sched_active(esdp->no, rq);
}
else {
- long dt;
+ erts_aint_t dt;
- erts_smp_atomic_set(&function_calls, 0);
+ erts_smp_atomic32_set(&function_calls, 0);
*fcalls = 0;
sched_waiting_sys(esdp->no, rq);
@@ -991,23 +1131,23 @@ scheduler_wait(long *fcalls, ErtsSchedulerData *esdp, ErtsRunQueue *rq)
erl_sys_schedule(1); /* Might give us something to do */
- dt = do_time_read_and_reset();
- if (dt) bump_timer(dt);
+ dt = erts_do_time_read_and_reset();
+ if (dt) erts_bump_timer(dt);
sys_aux_work:
#ifdef ERTS_SCHED_NEED_BLOCKABLE_AUX_WORK
- aux_work = erts_smp_atomic_read(&ssi->aux_work);
+ aux_work = erts_smp_atomic32_read(&ssi->aux_work);
aux_work = blockable_aux_work(esdp, ssi, aux_work);
#endif
#ifdef ERTS_SCHED_NEED_NONBLOCKABLE_AUX_WORK
#ifndef ERTS_SCHED_NEED_BLOCKABLE_AUX_WORK
- aux_work = erts_smp_atomic_read(&ssi->aux_work);
+ aux_work = erts_smp_atomic32_read(&ssi->aux_work);
#endif
nonblockable_aux_work(esdp, ssi, aux_work);
#endif
- flgs = erts_smp_atomic_read(&ssi->flags);
+ flgs = erts_smp_atomic32_read(&ssi->flags);
if (!(flgs & ERTS_SSI_FLG_WAITING)) {
ASSERT(!(flgs & ERTS_SSI_FLG_SLEEPING));
goto sys_woken;
@@ -1025,7 +1165,7 @@ scheduler_wait(long *fcalls, ErtsSchedulerData *esdp, ErtsRunQueue *rq)
* call erl_sys_schedule() until it is handled.
*/
if (erts_port_task_have_outstanding_io_tasks()) {
- erts_smp_atomic_set(&doing_sys_schedule, 0);
+ clear_sys_scheduling();
/*
* Got to check that we still got I/O tasks; otherwise
* we have to continue checking for I/O...
@@ -1044,7 +1184,7 @@ scheduler_wait(long *fcalls, ErtsSchedulerData *esdp, ErtsRunQueue *rq)
* sleep in erl_sys_schedule().
*/
if (erts_port_task_have_outstanding_io_tasks()) {
- erts_smp_atomic_set(&doing_sys_schedule, 0);
+ clear_sys_scheduling();
/*
* Got to check that we still got I/O tasks; otherwise
@@ -1088,8 +1228,8 @@ scheduler_wait(long *fcalls, ErtsSchedulerData *esdp, ErtsRunQueue *rq)
erl_sys_schedule(0);
- dt = do_time_read_and_reset();
- if (dt) bump_timer(dt);
+ dt = erts_do_time_read_and_reset();
+ if (dt) erts_bump_timer(dt);
flgs = sched_prep_cont_spin_wait(ssi);
if (flgs & ERTS_SSI_FLG_WAITING)
@@ -1098,9 +1238,9 @@ scheduler_wait(long *fcalls, ErtsSchedulerData *esdp, ErtsRunQueue *rq)
sys_woken:
erts_smp_runq_lock(rq);
sys_locked_woken:
- erts_smp_atomic_set(&doing_sys_schedule, 0);
+ clear_sys_scheduling();
if (flgs & ~ERTS_SSI_FLG_SUSPENDED)
- erts_smp_atomic_band(&ssi->flags, ERTS_SSI_FLG_SUSPENDED);
+ erts_smp_atomic32_band(&ssi->flags, ERTS_SSI_FLG_SUSPENDED);
sched_active_sys(esdp->no, rq);
}
}
@@ -1108,15 +1248,15 @@ scheduler_wait(long *fcalls, ErtsSchedulerData *esdp, ErtsRunQueue *rq)
ERTS_SMP_LC_ASSERT(erts_smp_lc_runq_is_locked(rq));
}
-static ERTS_INLINE long
+static ERTS_INLINE erts_aint32_t
ssi_flags_set_wake(ErtsSchedulerSleepInfo *ssi)
{
/* reset all flags but suspended */
- long oflgs;
- long nflgs = 0;
- long xflgs = ERTS_SSI_FLG_SLEEPING|ERTS_SSI_FLG_WAITING;
+ erts_aint32_t oflgs;
+ erts_aint32_t nflgs = 0;
+ erts_aint32_t xflgs = ERTS_SSI_FLG_SLEEPING|ERTS_SSI_FLG_WAITING;
while (1) {
- oflgs = erts_smp_atomic_cmpxchg(&ssi->flags, nflgs, xflgs);
+ oflgs = erts_smp_atomic32_cmpxchg(&ssi->flags, nflgs, xflgs);
if (oflgs == xflgs)
return oflgs;
nflgs = oflgs & ERTS_SSI_FLG_SUSPENDED;
@@ -1127,7 +1267,6 @@ ssi_flags_set_wake(ErtsSchedulerSleepInfo *ssi)
static void
wake_scheduler(ErtsRunQueue *rq, int incq, int one)
{
- int res;
ErtsSchedulerSleepInfo *ssi;
ErtsSchedulerSleepList *sl;
@@ -1148,7 +1287,7 @@ wake_scheduler(ErtsRunQueue *rq, int incq, int one)
if (!ssi)
erts_smp_spin_unlock(&sl->lock);
else if (one) {
- long flgs;
+ erts_aint32_t flgs;
if (ssi->prev)
ssi->prev->next = ssi->next;
else {
@@ -1158,9 +1297,9 @@ wake_scheduler(ErtsRunQueue *rq, int incq, int one)
if (ssi->next)
ssi->next->prev = ssi->prev;
- res = sl->list != NULL;
erts_smp_spin_unlock(&sl->lock);
+ ERTS_THR_MEMORY_BARRIER;
flgs = ssi_flags_set_wake(ssi);
erts_sched_finish_poke(ssi, flgs);
@@ -1170,6 +1309,8 @@ wake_scheduler(ErtsRunQueue *rq, int incq, int one)
else {
sl->list = NULL;
erts_smp_spin_unlock(&sl->lock);
+
+ ERTS_THR_MEMORY_BARRIER;
do {
ErtsSchedulerSleepInfo *wake_ssi = ssi;
ssi = ssi->next;
@@ -1195,15 +1336,17 @@ wake_all_schedulers(void)
static ERTS_INLINE int
chk_wake_sched(ErtsRunQueue *crq, int ix, int activate)
{
- long iflgs;
+ erts_aint32_t iflgs;
ErtsRunQueue *wrq;
if (crq->ix == ix)
return 0;
wrq = ERTS_RUNQ_IX(ix);
- iflgs = erts_smp_atomic_read(&wrq->info_flags);
+ iflgs = erts_smp_atomic32_read(&wrq->info_flags);
if (!(iflgs & (ERTS_RUNQ_IFLG_SUSPENDED|ERTS_RUNQ_IFLG_NONEMPTY))) {
if (activate) {
- if (ix == erts_smp_atomic_cmpxchg(&balance_info.active_runqs, ix+1, ix)) {
+ if (ix == erts_smp_atomic32_cmpxchg(&balance_info.active_runqs,
+ ix+1,
+ ix)) {
erts_smp_xrunq_lock(crq, wrq);
wrq->flags &= ~ERTS_RUNQ_FLG_INACTIVE;
erts_smp_xrunq_unlock(crq, wrq);
@@ -1220,8 +1363,8 @@ wake_scheduler_on_empty_runq(ErtsRunQueue *crq)
{
int ix = crq->ix;
int stop_ix = ix;
- int active_ix = erts_smp_atomic_read(&balance_info.active_runqs);
- int balance_ix = erts_smp_atomic_read(&balance_info.used_runqs);
+ int active_ix = erts_smp_atomic32_read(&balance_info.active_runqs);
+ int balance_ix = erts_smp_atomic32_read(&balance_info.used_runqs);
if (active_ix > balance_ix)
active_ix = balance_ix;
@@ -1273,7 +1416,7 @@ erts_sched_notify_check_cpu_bind(void)
int ix;
if (erts_common_run_queue) {
for (ix = 0; ix < erts_no_schedulers; ix++)
- erts_smp_atomic_set(&ERTS_SCHEDULER_IX(ix)->chk_cpu_bind, 1);
+ erts_smp_atomic32_set(&ERTS_SCHEDULER_IX(ix)->chk_cpu_bind, 1);
wake_all_schedulers();
}
else {
@@ -1441,14 +1584,15 @@ evacuate_run_queue(ErtsRunQueue *evac_rq, ErtsRunQueue *rq)
erts_smp_runq_lock(evac_rq);
- erts_smp_atomic_bor(&evac_rq->scheduler->ssi->flags, ERTS_SSI_FLG_SUSPENDED);
+ erts_smp_atomic32_bor(&evac_rq->scheduler->ssi->flags,
+ ERTS_SSI_FLG_SUSPENDED);
evac_rq->flags &= ~ERTS_RUNQ_FLGS_IMMIGRATE_QMASK;
evac_rq->flags |= (ERTS_RUNQ_FLGS_EMIGRATE_QMASK
| ERTS_RUNQ_FLGS_EVACUATE_QMASK
| ERTS_RUNQ_FLG_SUSPENDED);
- erts_smp_atomic_bor(&evac_rq->info_flags, ERTS_RUNQ_IFLG_SUSPENDED);
+ erts_smp_atomic32_bor(&evac_rq->info_flags, ERTS_RUNQ_IFLG_SUSPENDED);
/*
* Need to set up evacuation paths first since we
* may release the run queue lock on evac_rq
@@ -1697,7 +1841,7 @@ static ERTS_INLINE int
check_possible_steal_victim(ErtsRunQueue *rq, int *rq_lockedp, int vix)
{
ErtsRunQueue *vrq = ERTS_RUNQ_IX(vix);
- long iflgs = erts_smp_atomic_read(&vrq->info_flags);
+ erts_aint32_t iflgs = erts_smp_atomic32_read(&vrq->info_flags);
if (iflgs & ERTS_RUNQ_IFLG_NONEMPTY)
return try_steal_task_from_victim(rq, rq_lockedp, vrq);
else
@@ -1727,8 +1871,8 @@ try_steal_task(ErtsRunQueue *rq)
ERTS_SMP_LC_CHK_RUNQ_LOCK(rq, rq_locked);
- active_rqs = erts_smp_atomic_read(&balance_info.active_runqs);
- blnc_rqs = erts_smp_atomic_read(&balance_info.used_runqs);
+ active_rqs = erts_smp_atomic32_read(&balance_info.active_runqs);
+ blnc_rqs = erts_smp_atomic32_read(&balance_info.used_runqs);
if (active_rqs > blnc_rqs)
active_rqs = blnc_rqs;
@@ -1739,7 +1883,7 @@ try_steal_task(ErtsRunQueue *rq)
if (active_rqs < blnc_rqs) {
int no = blnc_rqs - active_rqs;
int stop_ix = vix = active_rqs + rq->ix % no;
- while (erts_smp_atomic_read(&no_empty_run_queues) < blnc_rqs) {
+ while (erts_smp_atomic32_read(&no_empty_run_queues) < blnc_rqs) {
res = check_possible_steal_victim(rq, &rq_locked, vix);
if (res)
goto done;
@@ -1754,7 +1898,7 @@ try_steal_task(ErtsRunQueue *rq)
vix = rq->ix;
/* ... then try to steal a job from another active queue... */
- while (erts_smp_atomic_read(&no_empty_run_queues) < blnc_rqs) {
+ while (erts_smp_atomic32_read(&no_empty_run_queues) < blnc_rqs) {
vix++;
if (vix >= active_rqs)
vix = 0;
@@ -1850,15 +1994,15 @@ check_balance(ErtsRunQueue *c_rq)
int forced, active, current_active, oowc, half_full_scheds, full_scheds,
mmax_len, blnc_no_rqs, qix, pix, freds_hist_ix;
- if (erts_smp_atomic_xchg(&balance_info.checking_balance, 1)) {
+ if (erts_smp_atomic32_xchg(&balance_info.checking_balance, 1)) {
c_rq->check_balance_reds = INT_MAX;
return;
}
- blnc_no_rqs = (int) erts_smp_atomic_read(&balance_info.used_runqs);
+ blnc_no_rqs = (int) erts_smp_atomic32_read(&balance_info.used_runqs);
if (blnc_no_rqs == 1) {
c_rq->check_balance_reds = INT_MAX;
- erts_smp_atomic_set(&balance_info.checking_balance, 0);
+ erts_smp_atomic32_set(&balance_info.checking_balance, 0);
return;
}
@@ -1866,7 +2010,7 @@ check_balance(ErtsRunQueue *c_rq)
if (balance_info.halftime) {
balance_info.halftime = 0;
- erts_smp_atomic_set(&balance_info.checking_balance, 0);
+ erts_smp_atomic32_set(&balance_info.checking_balance, 0);
ERTS_FOREACH_RUNQ(rq,
{
if (rq->waiting)
@@ -1894,12 +2038,12 @@ check_balance(ErtsRunQueue *c_rq)
forced = balance_info.forced_check_balance;
balance_info.forced_check_balance = 0;
- blnc_no_rqs = (int) erts_smp_atomic_read(&balance_info.used_runqs);
+ blnc_no_rqs = (int) erts_smp_atomic32_read(&balance_info.used_runqs);
if (blnc_no_rqs == 1) {
erts_smp_mtx_unlock(&balance_info.update_mtx);
erts_smp_runq_lock(c_rq);
c_rq->check_balance_reds = INT_MAX;
- erts_smp_atomic_set(&balance_info.checking_balance, 0);
+ erts_smp_atomic32_set(&balance_info.checking_balance, 0);
return;
}
@@ -1908,7 +2052,7 @@ check_balance(ErtsRunQueue *c_rq)
if (balance_info.full_reds_history_index >= ERTS_FULL_REDS_HISTORY_SIZE)
balance_info.full_reds_history_index = 0;
- current_active = erts_smp_atomic_read(&balance_info.active_runqs);
+ current_active = erts_smp_atomic32_read(&balance_info.active_runqs);
/* Read balance information for all run queues */
for (qix = 0; qix < blnc_no_rqs; qix++) {
@@ -2243,10 +2387,10 @@ erts_fprintf(stderr, "--------------------------------\n");
}
balance_info.last_active_runqs = active;
- erts_smp_atomic_set(&balance_info.active_runqs, active);
+ erts_smp_atomic32_set(&balance_info.active_runqs, active);
balance_info.halftime = 1;
- erts_smp_atomic_set(&balance_info.checking_balance, 0);
+ erts_smp_atomic32_set(&balance_info.checking_balance, 0);
/* Write migration paths and reset balance statistics in all queues */
for (qix = 0; qix < blnc_no_rqs; qix++) {
@@ -2384,18 +2528,11 @@ erts_init_scheduling(int mrq, int no_schedulers, int no_schedulers_online)
n = (int) (mrq ? no_schedulers : 1);
- erts_aligned_run_queues = erts_alloc(ERTS_ALC_T_RUNQS,
- (sizeof(ErtsAlignedRunQueue)*(n+1)));
- if ((((UWord) erts_aligned_run_queues) & ERTS_CACHE_LINE_MASK) != 0)
- erts_aligned_run_queues = ((ErtsAlignedRunQueue *)
- ((((UWord) erts_aligned_run_queues)
- & ~ERTS_CACHE_LINE_MASK)
- + ERTS_CACHE_LINE_SIZE));
-
- ASSERT((((UWord) erts_aligned_run_queues) & ERTS_CACHE_LINE_MASK) == 0);
-
+ erts_aligned_run_queues =
+ erts_alloc_permanent_cache_aligned(ERTS_ALC_T_RUNQS,
+ sizeof(ErtsAlignedRunQueue) * n);
#ifdef ERTS_SMP
- erts_smp_atomic_init(&no_empty_run_queues, 0);
+ erts_smp_atomic32_init(&no_empty_run_queues, 0);
#endif
erts_no_run_queues = n;
@@ -2405,7 +2542,7 @@ erts_init_scheduling(int mrq, int no_schedulers, int no_schedulers_online)
ErtsRunQueue *rq = ERTS_RUNQ_IX(ix);
rq->ix = ix;
- erts_smp_atomic_init(&rq->info_flags, ERTS_RUNQ_IFLG_NONEMPTY);
+ erts_smp_atomic32_init(&rq->info_flags, ERTS_RUNQ_IFLG_NONEMPTY);
/* make sure that the "extra" id correponds to the schedulers
* id if the esdp->no <-> ix+1 mapping change.
@@ -2488,38 +2625,27 @@ erts_init_scheduling(int mrq, int no_schedulers, int no_schedulers_online)
#ifdef ERTS_SMP
/* Create and initialize scheduler sleep info */
- aligned_sched_sleep_info = erts_alloc(ERTS_ALC_T_SCHDLR_SLP_INFO,
- (sizeof(ErtsAlignedSchedulerSleepInfo)
- *(n+1)));
- if ((((UWord) aligned_sched_sleep_info) & ERTS_CACHE_LINE_MASK) == 0)
- aligned_sched_sleep_info = ((ErtsAlignedSchedulerSleepInfo *)
- ((((UWord) aligned_sched_sleep_info)
- & ~ERTS_CACHE_LINE_MASK)
- + ERTS_CACHE_LINE_SIZE));
+ aligned_sched_sleep_info =
+ erts_alloc_permanent_cache_aligned(ERTS_ALC_T_SCHDLR_SLP_INFO,
+ n * sizeof(ErtsAlignedSchedulerSleepInfo));
+
for (ix = 0; ix < n; ix++) {
ErtsSchedulerSleepInfo *ssi = ERTS_SCHED_SLEEP_INFO_IX(ix);
#if 0 /* no need to initialize these... */
ssi->next = NULL;
ssi->prev = NULL;
#endif
- erts_smp_atomic_init(&ssi->flags, 0);
+ erts_smp_atomic32_init(&ssi->flags, 0);
ssi->event = NULL; /* initialized in sched_thread_func */
- erts_smp_atomic_init(&ssi->aux_work, 0);
+ erts_smp_atomic32_init(&ssi->aux_work, 0);
}
#endif
/* Create and initialize scheduler specific data */
- erts_aligned_scheduler_data = erts_alloc(ERTS_ALC_T_SCHDLR_DATA,
- (sizeof(ErtsAlignedSchedulerData)
- *(n+1)));
- if ((((UWord) erts_aligned_scheduler_data) & ERTS_CACHE_LINE_MASK) != 0)
- erts_aligned_scheduler_data = ((ErtsAlignedSchedulerData *)
- ((((UWord) erts_aligned_scheduler_data)
- & ~ERTS_CACHE_LINE_MASK)
- + ERTS_CACHE_LINE_SIZE));
-
- ASSERT((((UWord) erts_aligned_scheduler_data) & ERTS_CACHE_LINE_MASK) == 0);
+ erts_aligned_scheduler_data =
+ erts_alloc_permanent_cache_aligned(ERTS_ALC_T_SCHDLR_DATA,
+ n*sizeof(ErtsAlignedSchedulerData));
for (ix = 0; ix < n; ix++) {
ErtsSchedulerData *esdp = ERTS_SCHEDULER_IX(ix);
@@ -2555,7 +2681,7 @@ erts_init_scheduling(int mrq, int no_schedulers, int no_schedulers_online)
}
#ifdef ERTS_SMP
- erts_smp_atomic_init(&esdp->chk_cpu_bind, 0);
+ erts_smp_atomic32_init(&esdp->chk_cpu_bind, 0);
#endif
}
@@ -2563,21 +2689,21 @@ erts_init_scheduling(int mrq, int no_schedulers, int no_schedulers_online)
erts_smp_mtx_init(&schdlr_sspnd.mtx, "schdlr_sspnd");
erts_smp_cnd_init(&schdlr_sspnd.cnd);
- erts_smp_atomic_init(&schdlr_sspnd.changing, 0);
+ erts_smp_atomic32_init(&schdlr_sspnd.changing, 0);
schdlr_sspnd.online = no_schedulers_online;
schdlr_sspnd.curr_online = no_schedulers;
- erts_smp_atomic_init(&schdlr_sspnd.msb.ongoing, 0);
- erts_smp_atomic_init(&schdlr_sspnd.active, no_schedulers);
+ erts_smp_atomic32_init(&schdlr_sspnd.msb.ongoing, 0);
+ erts_smp_atomic32_init(&schdlr_sspnd.active, no_schedulers);
schdlr_sspnd.msb.procs = NULL;
- erts_smp_atomic_set(&balance_info.used_runqs,
- erts_common_run_queue ? 1 : no_schedulers_online);
- erts_smp_atomic_init(&balance_info.active_runqs, no_schedulers);
+ erts_smp_atomic32_set(&balance_info.used_runqs,
+ erts_common_run_queue ? 1 : no_schedulers_online);
+ erts_smp_atomic32_init(&balance_info.active_runqs, no_schedulers);
balance_info.last_active_runqs = no_schedulers;
erts_smp_mtx_init(&balance_info.update_mtx, "migration_info_update");
balance_info.forced_check_balance = 0;
balance_info.halftime = 1;
balance_info.full_reds_history_index = 0;
- erts_smp_atomic_init(&balance_info.checking_balance, 0);
+ erts_smp_atomic32_init(&balance_info.checking_balance, 0);
balance_info.prev_rise.active_runqs = 0;
balance_info.prev_rise.max_len = 0;
balance_info.prev_rise.reds = 0;
@@ -2586,8 +2712,8 @@ erts_init_scheduling(int mrq, int no_schedulers, int no_schedulers_online)
if (no_schedulers_online < no_schedulers) {
if (erts_common_run_queue) {
for (ix = no_schedulers_online; ix < no_schedulers; ix++)
- erts_smp_atomic_bor(&ERTS_SCHED_SLEEP_INFO_IX(ix)->flags,
- ERTS_SSI_FLG_SUSPENDED);
+ erts_smp_atomic32_bor(&ERTS_SCHED_SLEEP_INFO_IX(ix)->flags,
+ ERTS_SSI_FLG_SUSPENDED);
}
else {
for (ix = no_schedulers_online; ix < erts_no_run_queues; ix++)
@@ -2601,7 +2727,9 @@ erts_init_scheduling(int mrq, int no_schedulers, int no_schedulers_online)
ERTS_SCHDLR_SSPND_CHNG_SET((ERTS_SCHDLR_SSPND_CHNG_ONLN
| ERTS_SCHDLR_SSPND_CHNG_WAITER), 0);
- erts_smp_atomic_init(&doing_sys_schedule, 0);
+ erts_smp_atomic32_init(&doing_sys_schedule, 0);
+
+ init_misc_aux_work();
#else /* !ERTS_SMP */
{
@@ -2615,10 +2743,19 @@ erts_init_scheduling(int mrq, int no_schedulers, int no_schedulers_online)
erts_no_schedulers = 1;
#endif
- erts_smp_atomic_init(&function_calls, 0);
+ erts_smp_atomic32_init(&function_calls, 0);
/* init port tasks */
erts_port_task_init();
+
+#ifndef ERTS_SMP
+#ifdef ERTS_DO_VERIFY_UNUSED_TEMP_ALLOC
+ erts_scheduler_data->verify_unused_temp_alloc
+ = erts_alloc_get_verify_unused_temp_alloc(
+ &erts_scheduler_data->verify_unused_temp_alloc_data);
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(NULL);
+#endif
+#endif
}
ErtsRunQueue *
@@ -2718,7 +2855,6 @@ resume_process(Process *p)
return;
switch(p->rstatus) {
case P_RUNABLE:
- *statusp = P_WAITING; /* make erts_add_to_runq work */
erts_add_to_runq(p);
break;
case P_WAITING:
@@ -2730,6 +2866,19 @@ resume_process(Process *p)
p->rstatus = P_FREE;
}
+int
+erts_get_max_no_executing_schedulers(void)
+{
+#ifdef ERTS_SMP
+ if (erts_smp_atomic32_read(&schdlr_sspnd.changing))
+ return (int) erts_no_schedulers;
+ ERTS_THR_MEMORY_BARRIER;
+ return (int) erts_smp_atomic32_read(&schdlr_sspnd.active);
+#else
+ return 1;
+#endif
+}
+
#ifdef ERTS_SMP
static void
@@ -2748,13 +2897,13 @@ static void
scheduler_ix_resume_wake(Uint ix)
{
ErtsSchedulerSleepInfo *ssi = ERTS_SCHED_SLEEP_INFO_IX(ix);
- long xflgs = (ERTS_SSI_FLG_SLEEPING
- | ERTS_SSI_FLG_TSE_SLEEPING
- | ERTS_SSI_FLG_WAITING
- | ERTS_SSI_FLG_SUSPENDED);
- long oflgs;
+ erts_aint32_t xflgs = (ERTS_SSI_FLG_SLEEPING
+ | ERTS_SSI_FLG_TSE_SLEEPING
+ | ERTS_SSI_FLG_WAITING
+ | ERTS_SSI_FLG_SUSPENDED);
+ erts_aint32_t oflgs;
do {
- oflgs = erts_smp_atomic_cmpxchg(&ssi->flags, 0, xflgs);
+ oflgs = erts_smp_atomic32_cmpxchg(&ssi->flags, 0, xflgs);
if (oflgs == xflgs) {
erts_sched_finish_poke(ssi, oflgs);
break;
@@ -2763,17 +2912,17 @@ scheduler_ix_resume_wake(Uint ix)
} while (oflgs & ERTS_SSI_FLG_SUSPENDED);
}
-static long
-sched_prep_spin_suspended(ErtsSchedulerSleepInfo *ssi, long xpct)
+static erts_aint32_t
+sched_prep_spin_suspended(ErtsSchedulerSleepInfo *ssi, erts_aint32_t xpct)
{
- long oflgs;
- long nflgs = (ERTS_SSI_FLG_SLEEPING
- | ERTS_SSI_FLG_WAITING
- | ERTS_SSI_FLG_SUSPENDED);
- long xflgs = xpct;
+ erts_aint32_t oflgs;
+ erts_aint32_t nflgs = (ERTS_SSI_FLG_SLEEPING
+ | ERTS_SSI_FLG_WAITING
+ | ERTS_SSI_FLG_SUSPENDED);
+ erts_aint32_t xflgs = xpct;
do {
- oflgs = erts_smp_atomic_cmpxchg(&ssi->flags, nflgs, xflgs);
+ oflgs = erts_smp_atomic32_cmpxchg(&ssi->flags, nflgs, xflgs);
if (oflgs == xflgs)
return nflgs;
xflgs = oflgs;
@@ -2782,15 +2931,15 @@ sched_prep_spin_suspended(ErtsSchedulerSleepInfo *ssi, long xpct)
return oflgs;
}
-static long
+static erts_aint32_t
sched_spin_suspended(ErtsSchedulerSleepInfo *ssi, int spincount)
{
int until_yield = ERTS_SCHED_SPIN_UNTIL_YIELD;
int sc = spincount;
- long flgs;
+ erts_aint32_t flgs;
do {
- flgs = erts_smp_atomic_read(&ssi->flags);
+ flgs = erts_smp_atomic32_read(&ssi->flags);
if ((flgs & (ERTS_SSI_FLG_SLEEPING
| ERTS_SSI_FLG_WAITING
| ERTS_SSI_FLG_SUSPENDED))
@@ -2808,22 +2957,22 @@ sched_spin_suspended(ErtsSchedulerSleepInfo *ssi, int spincount)
return flgs;
}
-static long
+static erts_aint32_t
sched_set_suspended_sleeptype(ErtsSchedulerSleepInfo *ssi)
{
- long oflgs;
- long nflgs = (ERTS_SSI_FLG_SLEEPING
- | ERTS_SSI_FLG_TSE_SLEEPING
- | ERTS_SSI_FLG_WAITING
- | ERTS_SSI_FLG_SUSPENDED);
- long xflgs = (ERTS_SSI_FLG_SLEEPING
- | ERTS_SSI_FLG_WAITING
- | ERTS_SSI_FLG_SUSPENDED);
+ erts_aint32_t oflgs;
+ erts_aint32_t nflgs = (ERTS_SSI_FLG_SLEEPING
+ | ERTS_SSI_FLG_TSE_SLEEPING
+ | ERTS_SSI_FLG_WAITING
+ | ERTS_SSI_FLG_SUSPENDED);
+ erts_aint32_t xflgs = (ERTS_SSI_FLG_SLEEPING
+ | ERTS_SSI_FLG_WAITING
+ | ERTS_SSI_FLG_SUSPENDED);
erts_tse_reset(ssi->event);
while (1) {
- oflgs = erts_smp_atomic_cmpxchg(&ssi->flags, nflgs, xflgs);
+ oflgs = erts_smp_atomic32_cmpxchg(&ssi->flags, nflgs, xflgs);
if (oflgs == xflgs)
return nflgs;
if ((oflgs & (ERTS_SSI_FLG_SLEEPING
@@ -2841,8 +2990,8 @@ sched_set_suspended_sleeptype(ErtsSchedulerSleepInfo *ssi)
static void
suspend_scheduler(ErtsSchedulerData *esdp)
{
- long flgs;
- int changing;
+ erts_aint32_t flgs;
+ erts_aint32_t changing;
long no = (long) esdp->no;
ErtsSchedulerSleepInfo *ssi = esdp->ssi;
long active_schedulers;
@@ -2850,7 +2999,7 @@ suspend_scheduler(ErtsSchedulerData *esdp)
int wake = 0;
#if defined(ERTS_SCHED_NEED_NONBLOCKABLE_AUX_WORK) \
|| defined(ERTS_SCHED_NEED_BLOCKABLE_AUX_WORK)
- long aux_work;
+ erts_aint32_t aux_work;
#endif
/*
@@ -2878,15 +3027,15 @@ suspend_scheduler(ErtsSchedulerData *esdp)
flgs = sched_prep_spin_suspended(ssi, ERTS_SSI_FLG_SUSPENDED);
if (flgs & ERTS_SSI_FLG_SUSPENDED) {
- active_schedulers = erts_smp_atomic_dectest(&schdlr_sspnd.active);
+ active_schedulers = erts_smp_atomic32_dectest(&schdlr_sspnd.active);
ASSERT(active_schedulers >= 1);
- changing = erts_smp_atomic_read(&schdlr_sspnd.changing);
+ changing = erts_smp_atomic32_read(&schdlr_sspnd.changing);
if (changing & ERTS_SCHDLR_SSPND_CHNG_MSB) {
if (active_schedulers == schdlr_sspnd.msb.wait_active)
wake = 1;
if (active_schedulers == 1) {
- changing = erts_smp_atomic_band(&schdlr_sspnd.changing,
- ~ERTS_SCHDLR_SSPND_CHNG_MSB);
+ changing = erts_smp_atomic32_band(&schdlr_sspnd.changing,
+ ~ERTS_SCHDLR_SSPND_CHNG_MSB);
changing &= ~ERTS_SCHDLR_SSPND_CHNG_MSB;
}
}
@@ -2908,8 +3057,8 @@ suspend_scheduler(ErtsSchedulerData *esdp)
&& schdlr_sspnd.curr_online == schdlr_sspnd.wait_curr_online)
wake = 1;
if (schdlr_sspnd.online == schdlr_sspnd.curr_online) {
- changing = erts_smp_atomic_band(&schdlr_sspnd.changing,
- ~ERTS_SCHDLR_SSPND_CHNG_ONLN);
+ changing = erts_smp_atomic32_band(&schdlr_sspnd.changing,
+ ~ERTS_SCHDLR_SSPND_CHNG_ONLN);
changing &= ~ERTS_SCHDLR_SSPND_CHNG_ONLN;
}
}
@@ -2919,29 +3068,30 @@ suspend_scheduler(ErtsSchedulerData *esdp)
wake = 0;
}
- flgs = erts_smp_atomic_read(&ssi->flags);
+ flgs = erts_smp_atomic32_read(&ssi->flags);
if (!(flgs & ERTS_SSI_FLG_SUSPENDED))
break;
erts_smp_mtx_unlock(&schdlr_sspnd.mtx);
#ifdef ERTS_SCHED_NEED_BLOCKABLE_AUX_WORK
- aux_work = erts_smp_atomic_read(&ssi->aux_work);
+ aux_work = erts_smp_atomic32_read(&ssi->aux_work);
blockable_aux_work:
blockable_aux_work(esdp, ssi, aux_work);
#endif
erts_smp_activity_begin(ERTS_ACTIVITY_WAIT, NULL, NULL, NULL);
while (1) {
- long flgs;
+ erts_aint32_t flgs;
#ifdef ERTS_SCHED_NEED_NONBLOCKABLE_AUX_WORK
#ifndef ERTS_SCHED_NEED_BLOCKABLE_AUX_WORK
- aux_work = erts_smp_atomic_read(&ssi->aux_work);
+ aux_work = erts_smp_atomic32_read(&ssi->aux_work);
#endif
nonblockable_aux_work(esdp, ssi, aux_work);
#endif
- flgs = sched_spin_suspended(ssi, ERTS_SCHED_SUSPEND_SLEEP_SPINCOUNT);
+ flgs = sched_spin_suspended(ssi,
+ ERTS_SCHED_SUSPEND_SLEEP_SPINCOUNT);
if (flgs == (ERTS_SSI_FLG_SLEEPING
| ERTS_SSI_FLG_WAITING
| ERTS_SSI_FLG_SUSPENDED)) {
@@ -2961,13 +3111,13 @@ suspend_scheduler(ErtsSchedulerData *esdp)
| ERTS_SSI_FLG_SUSPENDED));
if (!(flgs & ERTS_SSI_FLG_SUSPENDED))
break;
- changing = erts_smp_atomic_read(&schdlr_sspnd.changing);
+ changing = erts_smp_atomic32_read(&schdlr_sspnd.changing);
if (changing & ~ERTS_SCHDLR_SSPND_CHNG_WAITER)
break;
#ifdef ERTS_SCHED_NEED_BLOCKABLE_AUX_WORK
- aux_work = erts_smp_atomic_read(&ssi->aux_work);
+ aux_work = erts_smp_atomic32_read(&ssi->aux_work);
if (aux_work & ERTS_SSI_BLOCKABLE_AUX_WORK_MASK) {
erts_smp_activity_end(ERTS_ACTIVITY_WAIT, NULL, NULL, NULL);
goto blockable_aux_work;
@@ -2979,19 +3129,19 @@ suspend_scheduler(ErtsSchedulerData *esdp)
erts_smp_activity_end(ERTS_ACTIVITY_WAIT, NULL, NULL, NULL);
erts_smp_mtx_lock(&schdlr_sspnd.mtx);
- changing = erts_smp_atomic_read(&schdlr_sspnd.changing);
+ changing = erts_smp_atomic32_read(&schdlr_sspnd.changing);
}
- active_schedulers = erts_smp_atomic_inctest(&schdlr_sspnd.active);
- changing = erts_smp_atomic_read(&schdlr_sspnd.changing);
+ active_schedulers = erts_smp_atomic32_inctest(&schdlr_sspnd.active);
+ changing = erts_smp_atomic32_read(&schdlr_sspnd.changing);
if ((changing & ERTS_SCHDLR_SSPND_CHNG_MSB)
&& schdlr_sspnd.online == active_schedulers) {
- erts_smp_atomic_band(&schdlr_sspnd.changing,
- ~ERTS_SCHDLR_SSPND_CHNG_MSB);
+ erts_smp_atomic32_band(&schdlr_sspnd.changing,
+ ~ERTS_SCHDLR_SSPND_CHNG_MSB);
}
ASSERT(no <= schdlr_sspnd.online);
- ASSERT(!erts_smp_atomic_read(&schdlr_sspnd.msb.ongoing));
+ ASSERT(!erts_smp_atomic32_read(&schdlr_sspnd.msb.ongoing));
}
@@ -3020,7 +3170,7 @@ do { \
(RQ)->flags |= (ERTS_RUNQ_FLG_OUT_OF_WORK \
| ERTS_RUNQ_FLG_HALFTIME_OUT_OF_WORK); \
(RQ)->check_balance_reds = ERTS_RUNQ_CALL_CHECK_BALANCE_REDS; \
- erts_smp_atomic_band(&(RQ)->info_flags, ~ERTS_RUNQ_IFLG_SUSPENDED); \
+ erts_smp_atomic32_band(&(RQ)->info_flags, ~ERTS_RUNQ_IFLG_SUSPENDED);\
for (pix__ = 0; pix__ < ERTS_NO_PROC_PRIO_LEVELS; pix__++) { \
(RQ)->procs.prio_info[pix__].max_len = 0; \
(RQ)->procs.prio_info[pix__].reds = 0; \
@@ -3062,9 +3212,9 @@ erts_schedulers_state(Uint *total,
int yield_allowed)
{
int res;
- long changing;
+ erts_aint32_t changing;
erts_smp_mtx_lock(&schdlr_sspnd.mtx);
- changing = erts_smp_atomic_read(&schdlr_sspnd.changing);
+ changing = erts_smp_atomic32_read(&schdlr_sspnd.changing);
if (yield_allowed && (changing & ~ERTS_SCHDLR_SSPND_CHNG_WAITER))
res = ERTS_SCHDLR_SSPND_YIELD_RESTART;
else {
@@ -3085,7 +3235,7 @@ erts_set_schedulers_online(Process *p,
Sint *old_no)
{
int ix, res, no, have_unlocked_plocks;
- long changing;
+ erts_aint32_t changing;
if (new_no < 1 || erts_no_schedulers < new_no)
return ERTS_SCHDLR_SSPND_EINVAL;
@@ -3095,7 +3245,7 @@ erts_set_schedulers_online(Process *p,
have_unlocked_plocks = 0;
no = (int) new_no;
- changing = erts_smp_atomic_read(&schdlr_sspnd.changing);
+ changing = erts_smp_atomic32_read(&schdlr_sspnd.changing);
if (changing) {
res = ERTS_SCHDLR_SSPND_YIELD_RESTART;
}
@@ -3142,7 +3292,7 @@ erts_set_schedulers_online(Process *p,
ErtsRunQueue *to_rq = ERTS_RUNQ_IX(ix % no);
evacuate_run_queue(from_rq, to_rq);
}
- erts_smp_atomic_set(&balance_info.used_runqs, no);
+ erts_smp_atomic32_set(&balance_info.used_runqs, no);
erts_smp_mtx_unlock(&balance_info.update_mtx);
erts_smp_mtx_lock(&schdlr_sspnd.mtx);
}
@@ -3170,8 +3320,8 @@ erts_set_schedulers_online(Process *p,
for (ix = no; ix < online; ix++) {
ErtsSchedulerSleepInfo *ssi;
ssi = ERTS_SCHED_SLEEP_INFO_IX(ix);
- erts_smp_atomic_bor(&ssi->flags,
- ERTS_SSI_FLG_SUSPENDED);
+ erts_smp_atomic32_bor(&ssi->flags,
+ ERTS_SSI_FLG_SUSPENDED);
}
wake_all_schedulers();
}
@@ -3196,7 +3346,7 @@ erts_set_schedulers_online(Process *p,
for (ix = erts_no_run_queues-1; ix >= no; ix--)
evacuate_run_queue(ERTS_RUNQ_IX(ix),
ERTS_RUNQ_IX(ix % no));
- erts_smp_atomic_set(&balance_info.used_runqs, no);
+ erts_smp_atomic32_set(&balance_info.used_runqs, no);
erts_smp_mtx_unlock(&balance_info.update_mtx);
erts_smp_mtx_lock(&schdlr_sspnd.mtx);
for (ix = no; ix < online; ix++) {
@@ -3218,10 +3368,11 @@ erts_set_schedulers_online(Process *p,
NULL);
ASSERT(res != ERTS_SCHDLR_SSPND_DONE
? (ERTS_SCHDLR_SSPND_CHNG_WAITER
- & erts_smp_atomic_read(&schdlr_sspnd.changing))
+ & erts_smp_atomic32_read(&schdlr_sspnd.changing))
: (ERTS_SCHDLR_SSPND_CHNG_WAITER
- == erts_smp_atomic_read(&schdlr_sspnd.changing)));
- erts_smp_atomic_band(&schdlr_sspnd.changing, ~ERTS_SCHDLR_SSPND_CHNG_WAITER);
+ == erts_smp_atomic32_read(&schdlr_sspnd.changing)));
+ erts_smp_atomic32_band(&schdlr_sspnd.changing,
+ ~ERTS_SCHDLR_SSPND_CHNG_WAITER);
}
}
@@ -3236,11 +3387,11 @@ ErtsSchedSuspendResult
erts_block_multi_scheduling(Process *p, ErtsProcLocks plocks, int on, int all)
{
int ix, res, have_unlocked_plocks = 0;
- long changing;
+ erts_aint32_t changing;
ErtsProcList *plp;
erts_smp_mtx_lock(&schdlr_sspnd.mtx);
- changing = erts_smp_atomic_read(&schdlr_sspnd.changing);
+ changing = erts_smp_atomic32_read(&schdlr_sspnd.changing);
if (changing) {
res = ERTS_SCHDLR_SSPND_YIELD_RESTART; /* Yield */
}
@@ -3250,7 +3401,7 @@ erts_block_multi_scheduling(Process *p, ErtsProcLocks plocks, int on, int all)
plp->next = schdlr_sspnd.msb.procs;
schdlr_sspnd.msb.procs = plp;
p->flags |= F_HAVE_BLCKD_MSCHED;
- ASSERT(erts_smp_atomic_read(&schdlr_sspnd.active) == 1);
+ ASSERT(erts_smp_atomic32_read(&schdlr_sspnd.active) == 1);
ASSERT(p->scheduler_data->no == 1);
res = ERTS_SCHDLR_SSPND_DONE_MSCHED_BLOCKED;
}
@@ -3261,11 +3412,11 @@ erts_block_multi_scheduling(Process *p, ErtsProcLocks plocks, int on, int all)
have_unlocked_plocks = 1;
erts_smp_proc_unlock(p, plocks);
}
- ASSERT(0 == erts_smp_atomic_read(&schdlr_sspnd.msb.ongoing));
- erts_smp_atomic_set(&schdlr_sspnd.msb.ongoing, 1);
+ ASSERT(0 == erts_smp_atomic32_read(&schdlr_sspnd.msb.ongoing));
+ erts_smp_atomic32_set(&schdlr_sspnd.msb.ongoing, 1);
if (online == 1) {
res = ERTS_SCHDLR_SSPND_DONE_MSCHED_BLOCKED;
- ASSERT(erts_smp_atomic_read(&schdlr_sspnd.active) == 1);
+ ASSERT(erts_smp_atomic32_read(&schdlr_sspnd.active) == 1);
ASSERT(p->scheduler_data->no == 1);
}
else {
@@ -3285,14 +3436,14 @@ erts_block_multi_scheduling(Process *p, ErtsProcLocks plocks, int on, int all)
}
if (erts_common_run_queue) {
for (ix = 1; ix < online; ix++)
- erts_smp_atomic_bor(&ERTS_SCHED_SLEEP_INFO_IX(ix)->flags,
- ERTS_SSI_FLG_SUSPENDED);
+ erts_smp_atomic32_bor(&ERTS_SCHED_SLEEP_INFO_IX(ix)->flags,
+ ERTS_SSI_FLG_SUSPENDED);
wake_all_schedulers();
}
else {
erts_smp_mtx_unlock(&schdlr_sspnd.mtx);
erts_smp_mtx_lock(&balance_info.update_mtx);
- erts_smp_atomic_set(&balance_info.used_runqs, 1);
+ erts_smp_atomic32_set(&balance_info.used_runqs, 1);
for (ix = 0; ix < online; ix++) {
ErtsRunQueue *rq = ERTS_RUNQ_IX(ix);
erts_smp_runq_lock(rq);
@@ -3314,7 +3465,7 @@ erts_block_multi_scheduling(Process *p, ErtsProcLocks plocks, int on, int all)
susp_sched_prep_block,
susp_sched_resume_block,
NULL);
- while (erts_smp_atomic_read(&schdlr_sspnd.active)
+ while (erts_smp_atomic32_read(&schdlr_sspnd.active)
!= schdlr_sspnd.msb.wait_active)
erts_smp_cnd_wait(&schdlr_sspnd.cnd, &schdlr_sspnd.mtx);
erts_smp_activity_end(ERTS_ACTIVITY_WAIT,
@@ -3323,11 +3474,11 @@ erts_block_multi_scheduling(Process *p, ErtsProcLocks plocks, int on, int all)
NULL);
ASSERT(res != ERTS_SCHDLR_SSPND_DONE_MSCHED_BLOCKED
? (ERTS_SCHDLR_SSPND_CHNG_WAITER
- & erts_smp_atomic_read(&schdlr_sspnd.changing))
+ & erts_smp_atomic32_read(&schdlr_sspnd.changing))
: (ERTS_SCHDLR_SSPND_CHNG_WAITER
- == erts_smp_atomic_read(&schdlr_sspnd.changing)));
- erts_smp_atomic_band(&schdlr_sspnd.changing,
- ~ERTS_SCHDLR_SSPND_CHNG_WAITER);
+ == erts_smp_atomic32_read(&schdlr_sspnd.changing)));
+ erts_smp_atomic32_band(&schdlr_sspnd.changing,
+ ~ERTS_SCHDLR_SSPND_CHNG_WAITER);
}
plp = proclist_create(p);
plp->next = schdlr_sspnd.msb.procs;
@@ -3394,16 +3545,16 @@ erts_block_multi_scheduling(Process *p, ErtsProcLocks plocks, int on, int all)
});
#endif
p->flags &= ~F_HAVE_BLCKD_MSCHED;
- erts_smp_atomic_set(&schdlr_sspnd.msb.ongoing, 0);
+ erts_smp_atomic32_set(&schdlr_sspnd.msb.ongoing, 0);
if (schdlr_sspnd.online == 1) {
/* No schedulers to resume */
- ASSERT(erts_smp_atomic_read(&schdlr_sspnd.active) == 1);
+ ASSERT(erts_smp_atomic32_read(&schdlr_sspnd.active) == 1);
ERTS_SCHDLR_SSPND_CHNG_SET(0, ERTS_SCHDLR_SSPND_CHNG_MSB);
}
else if (erts_common_run_queue) {
for (ix = 1; ix < schdlr_sspnd.online; ix++)
- erts_smp_atomic_band(&ERTS_SCHED_SLEEP_INFO_IX(ix)->flags,
- ~ERTS_SSI_FLG_SUSPENDED);
+ erts_smp_atomic32_band(&ERTS_SCHED_SLEEP_INFO_IX(ix)->flags,
+ ~ERTS_SSI_FLG_SUSPENDED);
wake_all_schedulers();
}
else {
@@ -3429,7 +3580,7 @@ erts_block_multi_scheduling(Process *p, ErtsProcLocks plocks, int on, int all)
evacuate_run_queue(ERTS_RUNQ_IX(ix),
ERTS_RUNQ_IX(ix % online));
- erts_smp_atomic_set(&balance_info.used_runqs, online);
+ erts_smp_atomic32_set(&balance_info.used_runqs, online);
/* Make sure that we balance soon... */
balance_info.forced_check_balance = 1;
erts_smp_runq_lock(ERTS_RUNQ_IX(0));
@@ -3453,7 +3604,7 @@ void
erts_dbg_multi_scheduling_return_trap(Process *p, Eterm return_value)
{
if (return_value == am_blocked) {
- long active = erts_smp_atomic_read(&schdlr_sspnd.active);
+ erts_aint32_t active = erts_smp_atomic32_read(&schdlr_sspnd.active);
ASSERT(1 <= active && active <= 2);
ASSERT(ERTS_PROC_GET_SCHDATA(p)->no == 1);
}
@@ -3514,7 +3665,7 @@ sched_thread_func(void *vesdp)
#ifdef ERTS_ENABLE_LOCK_CHECK
{
char buf[31];
- erts_snprintf(&buf[0], 31, "scheduler %bpu", no);
+ erts_snprintf(&buf[0], 31, "scheduler %beu", no);
erts_lc_set_thread_name(&buf[0]);
}
#endif
@@ -3536,12 +3687,12 @@ sched_thread_func(void *vesdp)
erts_thread_init_float();
erts_smp_mtx_lock(&schdlr_sspnd.mtx);
- ASSERT(erts_smp_atomic_read(&schdlr_sspnd.changing)
+ ASSERT(erts_smp_atomic32_read(&schdlr_sspnd.changing)
& ERTS_SCHDLR_SSPND_CHNG_ONLN);
if (--schdlr_sspnd.curr_online == schdlr_sspnd.wait_curr_online) {
- erts_smp_atomic_band(&schdlr_sspnd.changing,
- ~ERTS_SCHDLR_SSPND_CHNG_ONLN);
+ erts_smp_atomic32_band(&schdlr_sspnd.changing,
+ ~ERTS_SCHDLR_SSPND_CHNG_ONLN);
if (((ErtsSchedulerData *) vesdp)->no != 1)
erts_smp_cnd_signal(&schdlr_sspnd.cnd);
}
@@ -3563,9 +3714,16 @@ sched_thread_func(void *vesdp)
}
erts_smp_mtx_unlock(&schdlr_sspnd.mtx);
+#ifdef ERTS_DO_VERIFY_UNUSED_TEMP_ALLOC
+ ((ErtsSchedulerData *) vesdp)->verify_unused_temp_alloc
+ = erts_alloc_get_verify_unused_temp_alloc(
+ &((ErtsSchedulerData *) vesdp)->verify_unused_temp_alloc_data);
+ ERTS_VERIFY_UNUSED_TEMP_ALLOC(NULL);
+#endif
+
process_main();
/* No schedulers should *ever* terminate */
- erl_exit(ERTS_ABORT_EXIT, "Scheduler thread number %bpu terminated\n",
+ erl_exit(ERTS_ABORT_EXIT, "Scheduler thread number %beu terminated\n",
((ErtsSchedulerData *) vesdp)->no);
return NULL;
}
@@ -3614,8 +3772,8 @@ erts_start_schedulers(void)
erts_dsprintf_buf_t *dsbufp = erts_create_logger_dsbuf();
ASSERT(actual != wanted_no_schedulers);
erts_dsprintf(dsbufp,
- "Failed to create %bpu scheduler-threads (%s:%d); "
- "only %bpu scheduler-thread%s created.\n",
+ "Failed to create %beu scheduler-threads (%s:%d); "
+ "only %beu scheduler-thread%s created.\n",
wanted_no_schedulers, erl_errno_id(res), res,
actual, actual == 1 ? " was" : "s were");
erts_send_error_to_logger_nogl(dsbufp);
@@ -3729,21 +3887,9 @@ handle_pend_sync_suspend(Process *suspendee,
}
}
-/*
- * Like erts_pid2proc() but:
- *
- * * At least ERTS_PROC_LOCK_MAIN have to be held on c_p.
- * * At least ERTS_PROC_LOCK_MAIN have to be taken on pid.
- * * It also waits for proc to be in a state != running and garbing.
- * * If ERTS_PROC_LOCK_BUSY is returned, the calling process has to
- * yield (ERTS_BIF_YIELD[0-3]()). c_p might in this case have been
- * suspended.
- */
-
-
-Process *
-erts_pid2proc_not_running(Process *c_p, ErtsProcLocks c_p_locks,
- Eterm pid, ErtsProcLocks pid_locks)
+static Process *
+pid2proc_not_running(Process *c_p, ErtsProcLocks c_p_locks,
+ Eterm pid, ErtsProcLocks pid_locks, int suspend)
{
Process *rp;
int unlock_c_p_status;
@@ -3770,7 +3916,7 @@ erts_pid2proc_not_running(Process *c_p, ErtsProcLocks c_p_locks,
c_p->suspendee = NIL;
ASSERT(c_p->flags & F_P2PNR_RESCHED);
c_p->flags &= ~F_P2PNR_RESCHED;
- if (rp)
+ if (!suspend && rp)
resume_process(rp);
}
else {
@@ -3834,6 +3980,8 @@ erts_pid2proc_not_running(Process *c_p, ErtsProcLocks c_p_locks,
}
/* rp is not running and we got the locks we want... */
+ if (suspend)
+ suspend_process(rp_rq, rp);
}
erts_smp_runqs_unlock(cp_rq, rp_rq);
}
@@ -3846,6 +3994,35 @@ erts_pid2proc_not_running(Process *c_p, ErtsProcLocks c_p_locks,
return rp;
}
+
+/*
+ * Like erts_pid2proc() but:
+ *
+ * * At least ERTS_PROC_LOCK_MAIN have to be held on c_p.
+ * * At least ERTS_PROC_LOCK_MAIN have to be taken on pid.
+ * * It also waits for proc to be in a state != running and garbing.
+ * * If ERTS_PROC_LOCK_BUSY is returned, the calling process has to
+ * yield (ERTS_BIF_YIELD[0-3]()). c_p might in this case have been
+ * suspended.
+ */
+Process *
+erts_pid2proc_not_running(Process *c_p, ErtsProcLocks c_p_locks,
+ Eterm pid, ErtsProcLocks pid_locks)
+{
+ return pid2proc_not_running(c_p, c_p_locks, pid, pid_locks, 0);
+}
+
+/*
+ * Like erts_pid2proc_not_running(), but hands over the process
+ * in a suspended state unless (c_p is looked up).
+ */
+Process *
+erts_pid2proc_suspend(Process *c_p, ErtsProcLocks c_p_locks,
+ Eterm pid, ErtsProcLocks pid_locks)
+{
+ return pid2proc_not_running(c_p, c_p_locks, pid, pid_locks, 1);
+}
+
/*
* erts_pid2proc_nropt() is normally the same as
* erts_pid2proc_not_running(). However it is only
@@ -3959,6 +4136,21 @@ handle_pend_bif_async_suspend(Process *suspendee,
}
}
+#else
+
+/*
+ * Non-smp version of erts_pid2proc_suspend().
+ */
+Process *
+erts_pid2proc_suspend(Process *c_p, ErtsProcLocks c_p_locks,
+ Eterm pid, ErtsProcLocks pid_locks)
+{
+ Process *rp = erts_pid2proc(c_p, c_p_locks, pid, pid_locks);
+ if (rp)
+ erts_suspend(rp, pid_locks, NULL);
+ return rp;
+}
+
#endif /* ERTS_SMP */
/*
@@ -4492,7 +4684,7 @@ internal_add_to_runq(ErtsRunQueue *runq, Process *p)
if (p->status_flags & ERTS_PROC_SFLG_INRUNQ)
return NULL;
else if (p->runq_flags & ERTS_PROC_RUNQ_FLG_RUNNING) {
- ASSERT(p->status != P_SUSPENDED);
+ ASSERT(ERTS_PROC_IS_EXITING(p) || p->rcount == 0);
ERTS_DBG_CHK_PROCS_RUNQ_NOPROC(runq, p);
p->status_flags |= ERTS_PROC_SFLG_PENDADD2SCHEDQ;
return NULL;
@@ -4503,9 +4695,8 @@ internal_add_to_runq(ErtsRunQueue *runq, Process *p)
ERTS_DBG_CHK_PROCS_RUNQ_NOPROC(runq, p);
#ifndef ERTS_SMP
/* Never schedule a suspended process (ok in smp case) */
- ASSERT(p->status != P_SUSPENDED);
+ ASSERT(ERTS_PROC_IS_EXITING(p) || p->rcount == 0);
add_runq = runq;
-
#else
ASSERT(!p->bound_runq || p->bound_runq == p->run_queue);
if (p->bound_runq) {
@@ -4914,10 +5105,10 @@ Process *schedule(Process *p, int calls)
{
ErtsRunQueue *rq;
ErtsRunPrioQueue *rpq;
- long dt;
+ erts_aint_t dt;
ErtsSchedulerData *esdp;
int context_reds;
- long fcalls;
+ int fcalls;
int input_reductions;
int actual_reds;
int reds;
@@ -4940,7 +5131,7 @@ Process *schedule(Process *p, int calls)
esdp = erts_get_scheduler_data();
rq = erts_get_runq_current(esdp);
ASSERT(esdp);
- fcalls = erts_smp_atomic_read(&function_calls);
+ fcalls = (int) erts_smp_atomic32_read(&function_calls);
actual_reds = reds = 0;
erts_smp_runq_lock(rq);
} else {
@@ -4958,7 +5149,7 @@ Process *schedule(Process *p, int calls)
reds = ERTS_PROC_MIN_CONTEXT_SWITCH_REDS_COST;
esdp->virtual_reds = 0;
- fcalls = erts_smp_atomic_addtest(&function_calls, reds);
+ fcalls = (int) erts_smp_atomic32_addtest(&function_calls, reds);
ASSERT(esdp && esdp == erts_get_scheduler_data());
rq = erts_get_runq_current(esdp);
@@ -5005,7 +5196,7 @@ Process *schedule(Process *p, int calls)
handle_pending_suspend(p,
ERTS_PROC_LOCK_MAIN|ERTS_PROC_LOCK_STATUS);
ASSERT(!(p->status_flags & ERTS_PROC_SFLG_PENDADD2SCHEDQ)
- || p->status != P_SUSPENDED);
+ || p->rcount == 0);
}
#endif
erts_smp_runq_lock(rq);
@@ -5059,10 +5250,10 @@ Process *schedule(Process *p, int calls)
ERTS_SMP_CHK_NO_PROC_LOCKS;
- dt = do_time_read_and_reset();
+ dt = erts_do_time_read_and_reset();
if (dt) {
erts_smp_runq_unlock(rq);
- bump_timer(dt);
+ erts_bump_timer(dt);
erts_smp_runq_lock(rq);
}
BM_STOP_TIMER(system);
@@ -5091,14 +5282,14 @@ Process *schedule(Process *p, int calls)
| ERTS_RUNQ_FLG_CHK_CPU_BIND
| ERTS_RUNQ_FLG_SUSPENDED)) {
if ((rq->flags & ERTS_RUNQ_FLG_SUSPENDED)
- || (erts_smp_atomic_read(&esdp->ssi->flags)
+ || (erts_smp_atomic32_read(&esdp->ssi->flags)
& ERTS_SSI_FLG_SUSPENDED)) {
- ASSERT(erts_smp_atomic_read(&esdp->ssi->flags)
+ ASSERT(erts_smp_atomic32_read(&esdp->ssi->flags)
& ERTS_SSI_FLG_SUSPENDED);
suspend_scheduler(esdp);
}
if ((rq->flags & ERTS_RUNQ_FLG_CHK_CPU_BIND)
- || erts_smp_atomic_read(&esdp->chk_cpu_bind)) {
+ || erts_smp_atomic32_read(&esdp->chk_cpu_bind)) {
erts_sched_check_cpu_bind(esdp);
}
}
@@ -5107,7 +5298,7 @@ Process *schedule(Process *p, int calls)
|| defined(ERTS_SCHED_NEED_NONBLOCKABLE_AUX_WORK)
{
ErtsSchedulerSleepInfo *ssi = esdp->ssi;
- long aux_work = erts_smp_atomic_read(&ssi->aux_work);
+ erts_aint32_t aux_work = erts_smp_atomic32_read(&ssi->aux_work);
if (aux_work) {
erts_smp_runq_unlock(rq);
#ifdef ERTS_SCHED_NEED_BLOCKABLE_AUX_WORK
@@ -5149,9 +5340,9 @@ Process *schedule(Process *p, int calls)
if (rq->flags & (ERTS_RUNQ_FLG_SHARED_RUNQ
| ERTS_RUNQ_FLG_SUSPENDED)) {
if ((rq->flags & ERTS_RUNQ_FLG_SUSPENDED)
- || (erts_smp_atomic_read(&esdp->ssi->flags)
+ || (erts_smp_atomic32_read(&esdp->ssi->flags)
& ERTS_SSI_FLG_SUSPENDED)) {
- ASSERT(erts_smp_atomic_read(&esdp->ssi->flags)
+ ASSERT(erts_smp_atomic32_read(&esdp->ssi->flags)
& ERTS_SSI_FLG_SUSPENDED);
non_empty_runq(rq);
goto continue_check_activities_to_run;
@@ -5193,7 +5384,7 @@ Process *schedule(Process *p, int calls)
* Schedule system-level activities.
*/
- erts_smp_atomic_set(&function_calls, 0);
+ erts_smp_atomic32_set(&function_calls, 0);
fcalls = 0;
ASSERT(!erts_port_task_have_outstanding_io_tasks());
@@ -5203,11 +5394,11 @@ Process *schedule(Process *p, int calls)
#endif
erts_smp_runq_unlock(rq);
erl_sys_schedule(runnable);
- dt = do_time_read_and_reset();
- if (dt) bump_timer(dt);
+ dt = erts_do_time_read_and_reset();
+ if (dt) erts_bump_timer(dt);
#ifdef ERTS_SMP
erts_smp_runq_lock(rq);
- erts_smp_atomic_set(&doing_sys_schedule, 0);
+ clear_sys_scheduling();
goto continue_check_activities_to_run;
#else
if (!runnable)
@@ -5235,7 +5426,7 @@ Process *schedule(Process *p, int calls)
if (erts_common_run_queue->waiting)
wake_scheduler(erts_common_run_queue, 0, 1);
}
- else if (erts_smp_atomic_read(&no_empty_run_queues) != 0) {
+ else if (erts_smp_atomic32_read(&no_empty_run_queues) != 0) {
wake_scheduler_on_empty_runq(rq);
rq->wakeup_other = 0;
}
@@ -5692,7 +5883,7 @@ erts_test_next_pid(int set, Uint next)
Uint erts_process_count(void)
{
- long res = erts_smp_atomic_read(&process_count);
+ erts_aint32_t res = erts_smp_atomic32_read(&process_count);
ASSERT(res >= 0);
return (Uint) res;
}
@@ -5741,7 +5932,7 @@ alloc_process(void)
ASSERT(!process_tab[p_next]);
process_tab[p_next] = p;
- erts_smp_atomic_inc(&process_count);
+ erts_smp_atomic32_inc(&process_count);
p->id = make_internal_pid(p_serial << p_serial_shift | p_next);
if (p->id == ERTS_INVALID_PID) {
/* Do not use the invalid pid; change serial */
@@ -5867,7 +6058,7 @@ erl_create_process(Process* parent, /* Parent of process (default group leader).
p->min_heap_size = H_MIN_SIZE;
p->min_vheap_size = BIN_VH_MIN_SIZE;
p->prio = PRIORITY_NORMAL;
- p->max_gen_gcs = (Uint16) erts_smp_atomic_read(&erts_max_gen_gcs);
+ p->max_gen_gcs = (Uint16) erts_smp_atomic32_read(&erts_max_gen_gcs);
}
p->skipped = 0;
ASSERT(p->min_heap_size == erts_next_heap_size(p->min_heap_size, 0));
@@ -6920,11 +7111,11 @@ static void doit_exit_monitor(ErtsMonitor *mon, void *vpcontext)
DeclareTmpHeapNoproc(lhp,3);
ErtsProcLocks rp_locks = (ERTS_PROC_LOCK_LINK
| ERTS_PROC_LOCKS_MSG_SEND);
- UseTmpHeapNoproc(3);
rp = erts_pid2proc(NULL, 0, mon->pid, rp_locks);
if (rp == NULL) {
goto done;
}
+ UseTmpHeapNoproc(3);
rmon = erts_remove_monitor(&(rp->monitors),mon->ref);
if (rmon) {
erts_destroy_monitor(rmon);
@@ -7324,8 +7515,8 @@ continue_exit_process(Process *p
p->status_flags = 0;
#endif
process_tab[pix] = NULL; /* Time of death! */
- ASSERT(erts_smp_atomic_read(&process_count) > 0);
- erts_smp_atomic_dec(&process_count);
+ ASSERT(erts_smp_atomic32_read(&process_count) > 0);
+ erts_smp_atomic32_dec(&process_count);
#ifdef ERTS_SMP
erts_pix_unlock(pix_lock);
@@ -7450,10 +7641,28 @@ timeout_proc(Process* p)
p->flags |= F_TIMO;
p->flags &= ~F_INSLPQUEUE;
- if (p->status == P_WAITING)
- erts_add_to_runq(p);
- if (p->status == P_SUSPENDED)
+ switch (p->status) {
+ case P_GARBING:
+ switch (p->gcstatus) {
+ case P_SUSPENDED:
+ goto suspended;
+ case P_WAITING:
+ goto waiting;
+ default:
+ break;
+ }
+ break;
+ case P_WAITING:
+ waiting:
+ erts_add_to_runq(p);
+ break;
+ case P_SUSPENDED:
+ suspended:
p->rstatus = P_RUNABLE; /* MUST set resume status to runnable */
+ break;
+ default:
+ break;
+ }
}
@@ -7465,7 +7674,7 @@ cancel_timer(Process* p)
#ifdef ERTS_SMP
erts_cancel_smp_ptimer(p->u.ptimer);
#else
- erl_cancel_timer(&p->u.tm);
+ erts_cancel_timer(&p->u.tm);
#endif
}
@@ -7491,7 +7700,7 @@ set_timer(Process* p, Uint timeout)
(ErlTimeoutProc) timeout_proc,
timeout);
#else
- erl_set_timer(&p->u.tm,
+ erts_set_timer(&p->u.tm,
(ErlTimeoutProc) timeout_proc,
NULL,
(void*) p,
@@ -7539,7 +7748,7 @@ erts_program_counter_info(int to, void *to_arg, Process *p)
* only cause problems.
*/
for (i = 0; i < p->arity; i++)
- erts_print(to, to_arg, " %T\n", p->arg_reg[i]);
+ erts_print(to, to_arg, " %.*T\n", INT_MAX, p->arg_reg[i]);
}
}
}
diff --git a/erts/emulator/beam/erl_process.h b/erts/emulator/beam/erl_process.h
index c038e57b65..296acc7367 100644
--- a/erts/emulator/beam/erl_process.h
+++ b/erts/emulator/beam/erl_process.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -28,6 +28,12 @@
#define ERTS_INCLUDE_SCHEDULER_INTERNALS
#endif
+/* #define ERTS_DO_VERIFY_UNUSED_TEMP_ALLOC */
+
+#if !defined(ERTS_DO_VERIFY_UNUSED_TEMP_ALLOC) && defined(DEBUG)
+# define ERTS_DO_VERIFY_UNUSED_TEMP_ALLOC
+#endif
+
typedef struct process Process;
#include "sys.h"
@@ -174,8 +180,8 @@ extern int erts_sched_thread_suggested_stack_size;
#define ERTS_UNSET_RUNQ_FLG_EVACUATE(FLGS, PRIO) \
((FLGS) &= ~ERTS_RUNQ_FLG_EVACUATE((PRIO)))
-#define ERTS_RUNQ_IFLG_SUSPENDED (((long) 1) << 0)
-#define ERTS_RUNQ_IFLG_NONEMPTY (((long) 1) << 1)
+#define ERTS_RUNQ_IFLG_SUSPENDED (((erts_aint32_t) 1) << 0)
+#define ERTS_RUNQ_IFLG_NONEMPTY (((erts_aint32_t) 1) << 1)
#ifdef DEBUG
@@ -219,11 +225,11 @@ typedef enum {
ERTS_MIGRATE_FAILED_RUNQ_SUSPENDED
} ErtsMigrateResult;
-#define ERTS_SSI_FLG_SLEEPING (((long) 1) << 0)
-#define ERTS_SSI_FLG_POLL_SLEEPING (((long) 1) << 1)
-#define ERTS_SSI_FLG_TSE_SLEEPING (((long) 1) << 2)
-#define ERTS_SSI_FLG_WAITING (((long) 1) << 3)
-#define ERTS_SSI_FLG_SUSPENDED (((long) 1) << 4)
+#define ERTS_SSI_FLG_SLEEPING (((erts_aint32_t) 1) << 0)
+#define ERTS_SSI_FLG_POLL_SLEEPING (((erts_aint32_t) 1) << 1)
+#define ERTS_SSI_FLG_TSE_SLEEPING (((erts_aint32_t) 1) << 2)
+#define ERTS_SSI_FLG_WAITING (((erts_aint32_t) 1) << 3)
+#define ERTS_SSI_FLG_SUSPENDED (((erts_aint32_t) 1) << 4)
#define ERTS_SSI_FLGS_SLEEP_TYPE \
(ERTS_SSI_FLG_TSE_SLEEPING|ERTS_SSI_FLG_POLL_SLEEPING)
@@ -236,16 +242,14 @@ typedef enum {
| ERTS_SSI_FLG_WAITING \
| ERTS_SSI_FLG_SUSPENDED)
-
-#if !defined(ERTS_SCHED_NEED_BLOCKABLE_AUX_WORK) \
- && defined(ERTS_SMP_SCHEDULERS_NEED_TO_CHECK_CHILDREN)
#define ERTS_SCHED_NEED_BLOCKABLE_AUX_WORK
-#endif
-#define ERTS_SSI_AUX_WORK_CHECK_CHILDREN (((long) 1) << 0)
+#define ERTS_SSI_AUX_WORK_CHECK_CHILDREN (((erts_aint32_t) 1) << 0)
+#define ERTS_SSI_AUX_WORK_MISC (((erts_aint32_t) 1) << 1)
#define ERTS_SSI_BLOCKABLE_AUX_WORK_MASK \
- (ERTS_SSI_AUX_WORK_CHECK_CHILDREN)
+ (ERTS_SSI_AUX_WORK_CHECK_CHILDREN \
+ | ERTS_SSI_AUX_WORK_MISC)
#define ERTS_SSI_NONBLOCKABLE_AUX_WORK_MASK \
(0)
@@ -259,9 +263,9 @@ typedef struct {
struct ErtsSchedulerSleepInfo_ {
ErtsSchedulerSleepInfo *next;
ErtsSchedulerSleepInfo *prev;
- erts_smp_atomic_t flags;
+ erts_smp_atomic32_t flags;
erts_tse_t *event;
- erts_smp_atomic_t aux_work;
+ erts_smp_atomic32_t aux_work;
};
/* times to reschedule low prio process before running */
@@ -311,7 +315,7 @@ typedef struct {
struct ErtsRunQueue_ {
int ix;
- erts_smp_atomic_t info_flags;
+ erts_smp_atomic32_t info_flags;
erts_smp_mtx_t mtx;
erts_smp_cnd_t cnd;
@@ -421,7 +425,12 @@ struct ErtsSchedulerData_ {
#ifdef ERTS_SMP
/* NOTE: These fields are modified under held mutexes by other threads */
- erts_smp_atomic_t chk_cpu_bind; /* Only used when common run queue */
+ erts_smp_atomic32_t chk_cpu_bind; /* Only used when common run queue */
+#endif
+
+#ifdef ERTS_DO_VERIFY_UNUSED_TEMP_ALLOC
+ erts_alloc_verify_func_t verify_unused_temp_alloc;
+ Allctr_t *verify_unused_temp_alloc_data;
#endif
};
@@ -826,7 +835,7 @@ ERTS_GLB_INLINE void erts_heap_frag_shrink(Process* p, Eterm* hp)
}
#endif /* inline */
-Eterm* erts_heap_alloc(Process* p, Uint need);
+Eterm* erts_heap_alloc(Process* p, Uint need, Uint xtra);
#ifdef CHECK_FOR_HOLES
Eterm* erts_set_hole_marker(Eterm* ptr, Uint sz);
#endif
@@ -886,6 +895,7 @@ extern struct erts_system_profile_flags_t erts_system_profile_flags;
#define F_HAVE_BLCKD_MSCHED (1 << 8) /* Process has blocked multi-scheduling */
#define F_P2PNR_RESCHED (1 << 9) /* Process has been rescheduled via erts_pid2proc_not_running() */
#define F_FORCE_GC (1 << 10) /* Force gc at process in-scheduling */
+#define F_HIBERNATE_SCHED (1 << 11) /* Schedule out after hibernate op */
/* process trace_flags */
#define F_SENSITIVE (1 << 0)
@@ -1034,6 +1044,7 @@ int erts_sched_set_wakeup_limit(char *str);
#ifdef DEBUG
void erts_dbg_multi_scheduling_return_trap(Process *, Eterm);
#endif
+int erts_get_max_no_executing_schedulers(void);
#ifdef ERTS_SMP
ErtsSchedSuspendResult
erts_schedulers_state(Uint *, Uint *, Uint *, int);
@@ -1048,6 +1059,11 @@ int erts_is_multi_scheduling_blocked(void);
Eterm erts_multi_scheduling_blockers(Process *);
void erts_start_schedulers(void);
void erts_smp_notify_check_children_needed(void);
+void
+erts_smp_schedule_misc_aux_work(int ignore_self,
+ int max_sched,
+ void (*func)(void *),
+ void *arg);
#endif
void erts_sched_notify_check_cpu_bind(void);
Uint erts_active_schedulers(void);
@@ -1141,6 +1157,20 @@ Uint erts_debug_nbalance(void);
# define ERTS_PROC_GET_SCHDATA(PROC) (erts_scheduler_data)
#endif
+#ifdef ERTS_DO_VERIFY_UNUSED_TEMP_ALLOC
+# define ERTS_VERIFY_UNUSED_TEMP_ALLOC(P) \
+do { \
+ ErtsSchedulerData *esdp__ = ((P) \
+ ? ERTS_PROC_GET_SCHDATA((Process *) (P)) \
+ : erts_get_scheduler_data()); \
+ if (esdp__) \
+ esdp__->verify_unused_temp_alloc( \
+ esdp__->verify_unused_temp_alloc_data); \
+} while (0)
+#else
+# define ERTS_VERIFY_UNUSED_TEMP_ALLOC(ESDP)
+#endif
+
#if defined(ERTS_SMP) || defined(USE_THREADS)
ErtsSchedulerData *erts_get_scheduler_data(void);
#else
@@ -1505,6 +1535,10 @@ erts_get_atom_cache_map(Process *c_p)
}
#endif
+Process *erts_pid2proc_suspend(Process *,
+ ErtsProcLocks,
+ Eterm,
+ ErtsProcLocks);
#ifdef ERTS_SMP
Process *erts_pid2proc_not_running(Process *,
@@ -1555,7 +1589,7 @@ extern int erts_disable_proc_not_running_opt;
void erts_smp_notify_inc_runq(ErtsRunQueue *runq);
#ifdef ERTS_SMP
-void erts_sched_finish_poke(ErtsSchedulerSleepInfo *, long);
+void erts_sched_finish_poke(ErtsSchedulerSleepInfo *, erts_aint32_t);
ERTS_GLB_INLINE void erts_sched_poke(ErtsSchedulerSleepInfo *ssi);
#if ERTS_GLB_INLINE_INCL_FUNC_DEF
@@ -1563,11 +1597,13 @@ ERTS_GLB_INLINE void erts_sched_poke(ErtsSchedulerSleepInfo *ssi);
ERTS_GLB_INLINE void
erts_sched_poke(ErtsSchedulerSleepInfo *ssi)
{
- long flags = erts_smp_atomic_read(&ssi->flags);
+ erts_aint32_t flags;
+ ERTS_THR_MEMORY_BARRIER;
+ flags = erts_smp_atomic32_read(&ssi->flags);
ASSERT(!(flags & ERTS_SSI_FLG_SLEEPING)
|| (flags & ERTS_SSI_FLG_WAITING));
if (flags & ERTS_SSI_FLG_SLEEPING) {
- flags = erts_smp_atomic_band(&ssi->flags, ~ERTS_SSI_FLGS_SLEEP);
+ flags = erts_smp_atomic32_band(&ssi->flags, ~ERTS_SSI_FLGS_SLEEP);
erts_sched_finish_poke(ssi, flags);
}
}
diff --git a/erts/emulator/beam/erl_process_dump.c b/erts/emulator/beam/erl_process_dump.c
index 7a7042abe4..5410bcd495 100644
--- a/erts/emulator/beam/erl_process_dump.c
+++ b/erts/emulator/beam/erl_process_dump.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2003-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2003-2011. 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
@@ -194,7 +194,7 @@ dump_element(int to, void *to_arg, Eterm x)
} else if (is_pid(x)) {
erts_print(to, to_arg, "P%T", x);
} else if (is_port(x)) {
- erts_print(to, to_arg, "p<%bpu.%bpu>",
+ erts_print(to, to_arg, "p<%beu.%beu>",
port_channel_no(x), port_number(x));
} else if (is_nil(x)) {
erts_putc(to, to_arg, 'N');
@@ -261,139 +261,139 @@ print_function_from_pc(int to, void *to_arg, BeamInstr* x)
static void
heap_dump(int to, void *to_arg, Eterm x)
{
+ DeclareTmpHeapNoproc(last,1);
+ Eterm* next = last;
Eterm* ptr;
- Eterm last = OUR_NIL;
- Eterm* next = &last;
if (is_immed(x) || is_CP(x)) {
return;
}
-
- again:
- if (x == OUR_NIL) { /* We are done. */
- return;
- } if (is_CP(x)) {
- next = (Eterm *) EXPAND_POINTER(x);
- } else if (is_list(x)) {
- ptr = list_val(x);
- if (ptr[0] != OUR_NIL) {
- erts_print(to, to_arg, ADDR_FMT ":l", ptr);
- dump_element(to, to_arg, ptr[0]);
- erts_putc(to, to_arg, '|');
- dump_element(to, to_arg, ptr[1]);
- erts_putc(to, to_arg, '\n');
- if (is_immed(ptr[1])) {
- ptr[1] = make_small(0);
- }
- x = ptr[0];
- ptr[0] = (Eterm) COMPRESS_POINTER(next);
- next = ptr + 1;
- goto again;
- }
- } else if (is_boxed(x)) {
- Eterm hdr;
-
- ptr = boxed_val(x);
- hdr = *ptr;
- if (hdr != OUR_NIL) { /* If not visited */
- erts_print(to, to_arg, ADDR_FMT ":", ptr);
- if (is_arity_value(hdr)) {
- Uint i;
- Uint arity = arityval(hdr);
-
- erts_print(to, to_arg, "t" WORD_FMT ":", arity);
- for (i = 1; i <= arity; i++) {
- dump_element(to, to_arg, ptr[i]);
- if (is_immed(ptr[i])) {
- ptr[i] = make_small(0);
- }
- if (i < arity) {
- erts_putc(to, to_arg, ',');
- }
- }
+ UseTmpHeapNoproc(1);
+ *last = OUR_NIL;
+
+ while (x != OUR_NIL) {
+ if (is_CP(x)) {
+ next = (Eterm *) EXPAND_POINTER(x);
+ } else if (is_list(x)) {
+ ptr = list_val(x);
+ if (ptr[0] != OUR_NIL) {
+ erts_print(to, to_arg, ADDR_FMT ":l", ptr);
+ dump_element(to, to_arg, ptr[0]);
+ erts_putc(to, to_arg, '|');
+ dump_element(to, to_arg, ptr[1]);
erts_putc(to, to_arg, '\n');
- if (arity == 0) {
- ptr[0] = OUR_NIL;
- } else {
- x = ptr[arity];
- ptr[0] = (Eterm) COMPRESS_POINTER(next);
- next = ptr + arity - 1;
- goto again;
+ if (is_immed(ptr[1])) {
+ ptr[1] = make_small(0);
}
- } else if (hdr == HEADER_FLONUM) {
- FloatDef f;
- char sbuf[31];
- int i;
-
- GET_DOUBLE_DATA((ptr+1), f);
- i = sys_double_to_chars(f.fd, (char*) sbuf);
- sys_memset(sbuf+i, 0, 31-i);
- erts_print(to, to_arg, "F%X:%s\n", i, sbuf);
- *ptr = OUR_NIL;
- } else if (_is_bignum_header(hdr)) {
- erts_print(to, to_arg, "B%T\n", x);
- *ptr = OUR_NIL;
- } else if (is_binary_header(hdr)) {
- Uint tag = thing_subtag(hdr);
- Uint size = binary_size(x);
- Uint i;
-
- if (tag == HEAP_BINARY_SUBTAG) {
- byte* p;
-
- erts_print(to, to_arg, "Yh%X:", size);
- p = binary_bytes(x);
- for (i = 0; i < size; i++) {
- erts_print(to, to_arg, "%02X", p[i]);
+ x = ptr[0];
+ ptr[0] = (Eterm) COMPRESS_POINTER(next);
+ next = ptr + 1;
+ continue;
+ }
+ } else if (is_boxed(x)) {
+ Eterm hdr;
+
+ ptr = boxed_val(x);
+ hdr = *ptr;
+ if (hdr != OUR_NIL) { /* If not visited */
+ erts_print(to, to_arg, ADDR_FMT ":", ptr);
+ if (is_arity_value(hdr)) {
+ Uint i;
+ Uint arity = arityval(hdr);
+
+ erts_print(to, to_arg, "t" WORD_FMT ":", arity);
+ for (i = 1; i <= arity; i++) {
+ dump_element(to, to_arg, ptr[i]);
+ if (is_immed(ptr[i])) {
+ ptr[i] = make_small(0);
+ }
+ if (i < arity) {
+ erts_putc(to, to_arg, ',');
+ }
}
- } else if (tag == REFC_BINARY_SUBTAG) {
- ProcBin* pb = (ProcBin *) binary_val(x);
- Binary* val = pb->val;
-
- if (erts_smp_atomic_xchg(&val->refc, 0) != 0) {
- val->flags = (UWord) all_binaries;
- all_binaries = val;
+ erts_putc(to, to_arg, '\n');
+ if (arity == 0) {
+ ptr[0] = OUR_NIL;
+ } else {
+ x = ptr[arity];
+ ptr[0] = (Eterm) COMPRESS_POINTER(next);
+ next = ptr + arity - 1;
+ continue;
}
- erts_print(to, to_arg, "Yc%X:%X:%X", val,
- pb->bytes - (byte *)val->orig_bytes,
- size);
- } else if (tag == SUB_BINARY_SUBTAG) {
- ErlSubBin* Sb = (ErlSubBin *) binary_val(x);
- Eterm* real_bin = binary_val(Sb->orig);
- void* val;
-
- if (thing_subtag(*real_bin) == REFC_BINARY_SUBTAG) {
- ProcBin* pb = (ProcBin *) real_bin;
- val = pb->val;
- } else { /* Heap binary */
- val = real_bin;
+ } else if (hdr == HEADER_FLONUM) {
+ FloatDef f;
+ char sbuf[31];
+ int i;
+
+ GET_DOUBLE_DATA((ptr+1), f);
+ i = sys_double_to_chars(f.fd, (char*) sbuf);
+ sys_memset(sbuf+i, 0, 31-i);
+ erts_print(to, to_arg, "F%X:%s\n", i, sbuf);
+ *ptr = OUR_NIL;
+ } else if (_is_bignum_header(hdr)) {
+ erts_print(to, to_arg, "B%T\n", x);
+ *ptr = OUR_NIL;
+ } else if (is_binary_header(hdr)) {
+ Uint tag = thing_subtag(hdr);
+ Uint size = binary_size(x);
+ Uint i;
+
+ if (tag == HEAP_BINARY_SUBTAG) {
+ byte* p;
+
+ erts_print(to, to_arg, "Yh%X:", size);
+ p = binary_bytes(x);
+ for (i = 0; i < size; i++) {
+ erts_print(to, to_arg, "%02X", p[i]);
+ }
+ } else if (tag == REFC_BINARY_SUBTAG) {
+ ProcBin* pb = (ProcBin *) binary_val(x);
+ Binary* val = pb->val;
+
+ if (erts_smp_atomic_xchg(&val->refc, 0) != 0) {
+ val->flags = (UWord) all_binaries;
+ all_binaries = val;
+ }
+ erts_print(to, to_arg, "Yc%X:%X:%X", val,
+ pb->bytes - (byte *)val->orig_bytes,
+ size);
+ } else if (tag == SUB_BINARY_SUBTAG) {
+ ErlSubBin* Sb = (ErlSubBin *) binary_val(x);
+ Eterm* real_bin = binary_val(Sb->orig);
+ void* val;
+
+ if (thing_subtag(*real_bin) == REFC_BINARY_SUBTAG) {
+ ProcBin* pb = (ProcBin *) real_bin;
+ val = pb->val;
+ } else { /* Heap binary */
+ val = real_bin;
+ }
+ erts_print(to, to_arg, "Ys%X:%X:%X", val, Sb->offs, size);
}
- erts_print(to, to_arg, "Ys%X:%X:%X", val, Sb->offs, size);
+ erts_putc(to, to_arg, '\n');
+ *ptr = OUR_NIL;
+ } else if (is_external_pid_header(hdr)) {
+ erts_print(to, to_arg, "P%T\n", x);
+ *ptr = OUR_NIL;
+ } else if (is_external_port_header(hdr)) {
+ erts_print(to, to_arg, "p<%beu.%beu>\n",
+ port_channel_no(x), port_number(x));
+ *ptr = OUR_NIL;
+ } else {
+ /*
+ * All other we dump in the external term format.
+ */
+ dump_externally(to, to_arg, x);
+ erts_putc(to, to_arg, '\n');
+ *ptr = OUR_NIL;
}
- erts_putc(to, to_arg, '\n');
- *ptr = OUR_NIL;
- } else if (is_external_pid_header(hdr)) {
- erts_print(to, to_arg, "P%T\n", x);
- *ptr = OUR_NIL;
- } else if (is_external_port_header(hdr)) {
- erts_print(to, to_arg, "p<%bpu.%bpu>\n",
- port_channel_no(x), port_number(x));
- *ptr = OUR_NIL;
- } else {
- /*
- * All other we dump in the external term format.
- */
- dump_externally(to, to_arg, x);
- erts_putc(to, to_arg, '\n');
- *ptr = OUR_NIL;
}
}
+ x = *next;
+ *next = OUR_NIL;
+ next--;
}
-
- x = *next;
- *next = OUR_NIL;
- next--;
- goto again;
+ UnUseTmpHeapNoproc(1);
}
static void
diff --git a/erts/emulator/beam/erl_process_lock.c b/erts/emulator/beam/erl_process_lock.c
index 1bebcdb911..72560aa124 100644
--- a/erts/emulator/beam/erl_process_lock.c
+++ b/erts/emulator/beam/erl_process_lock.c
@@ -124,7 +124,7 @@ erts_init_proc_lock(int cpus)
for (i = 0; i < ERTS_NO_OF_PIX_LOCKS; i++) {
#ifdef ERTS_ENABLE_LOCK_COUNT
erts_smp_spinlock_init_x(&erts_pix_locks[i].u.spnlck,
- "pix_lock", make_small(i));
+ "pix_lock", make_small(i));
#else
erts_smp_spinlock_init(&erts_pix_locks[i].u.spnlck, "pix_lock");
#endif
@@ -413,7 +413,7 @@ transfer_locks(Process *p,
do {
erts_tse_t *tmp = wake;
wake = wake->next;
- erts_atomic_set(&tmp->uaflgs, 0);
+ erts_atomic32_set(&tmp->uaflgs, 0);
erts_tse_set(tmp);
} while (wake);
@@ -509,14 +509,14 @@ wait_for_locks(Process *p,
ASSERT((wtr->uflgs & ~ERTS_PROC_LOCKS_ALL) == 0);
- erts_atomic_set(&wtr->uaflgs, 1);
+ erts_atomic32_set(&wtr->uaflgs, 1);
erts_pix_unlock(pix_lock);
while (1) {
int res;
erts_tse_reset(wtr);
- if (erts_atomic_read(&wtr->uaflgs) == 0)
+ if (erts_atomic32_read(&wtr->uaflgs) == 0)
break;
/*
@@ -955,7 +955,7 @@ erts_proc_lock_init(Process *p)
{
/* We always start with all locks locked */
#if ERTS_PROC_LOCK_ATOMIC_IMPL
- erts_smp_atomic_init(&p->lock.flags, (long) ERTS_PROC_LOCKS_ALL);
+ erts_smp_atomic32_init(&p->lock.flags, (erts_aint32_t) ERTS_PROC_LOCKS_ALL);
#else
p->lock.flags = ERTS_PROC_LOCKS_ALL;
#endif
@@ -974,7 +974,7 @@ erts_proc_lock_init(Process *p)
{
int i;
for (i = 0; i <= ERTS_PROC_LOCK_MAX_BIT; i++)
- erts_smp_atomic_init(&p->lock.locked[i], (long) 1);
+ erts_smp_atomic32_init(&p->lock.locked[i], (erts_aint32_t) 1);
}
#endif
}
diff --git a/erts/emulator/beam/erl_process_lock.h b/erts/emulator/beam/erl_process_lock.h
index 4fe30c7209..355179f084 100644
--- a/erts/emulator/beam/erl_process_lock.h
+++ b/erts/emulator/beam/erl_process_lock.h
@@ -54,20 +54,20 @@
#define ERTS_PROC_LOCK_MAX_BIT 3
-typedef Uint32 ErtsProcLocks;
+typedef erts_aint32_t ErtsProcLocks;
typedef struct erts_proc_lock_queues_t_ erts_proc_lock_queues_t;
typedef struct erts_proc_lock_t_ {
#if ERTS_PROC_LOCK_ATOMIC_IMPL
- erts_smp_atomic_t flags;
+ erts_smp_atomic32_t flags;
#else
ErtsProcLocks flags;
#endif
erts_proc_lock_queues_t *queues;
- long refc;
+ Sint32 refc;
#ifdef ERTS_PROC_LOCK_DEBUG
- erts_smp_atomic_t locked[ERTS_PROC_LOCK_MAX_BIT+1];
+ erts_smp_atomic32_t locked[ERTS_PROC_LOCK_MAX_BIT+1];
#endif
#ifdef ERTS_ENABLE_LOCK_COUNT
erts_lcnt_lock_t lcnt_main;
@@ -270,17 +270,19 @@ typedef struct {
#if ERTS_PROC_LOCK_ATOMIC_IMPL
#define ERTS_PROC_LOCK_FLGS_BAND_(L, MSK) \
- ((ErtsProcLocks) erts_smp_atomic_band(&(L)->flags, (long) (MSK)))
+ ((ErtsProcLocks) erts_smp_atomic32_band(&(L)->flags, (erts_aint32_t) (MSK)))
#define ERTS_PROC_LOCK_FLGS_BOR_(L, MSK) \
- ((ErtsProcLocks) erts_smp_atomic_bor(&(L)->flags, (long) (MSK)))
+ ((ErtsProcLocks) erts_smp_atomic32_bor(&(L)->flags, (erts_aint32_t) (MSK)))
#define ERTS_PROC_LOCK_FLGS_CMPXCHG_ACQB_(L, NEW, EXPECTED) \
- ((ErtsProcLocks) erts_smp_atomic_cmpxchg_acqb(&(L)->flags, \
- (long) (NEW), (long) (EXPECTED)))
+ ((ErtsProcLocks) erts_smp_atomic32_cmpxchg_acqb(&(L)->flags, \
+ (erts_aint32_t) (NEW), \
+ (erts_aint32_t) (EXPECTED)))
#define ERTS_PROC_LOCK_FLGS_CMPXCHG_RELB_(L, NEW, EXPECTED) \
- ((ErtsProcLocks) erts_smp_atomic_cmpxchg_relb(&(L)->flags, \
- (long) (NEW), (long) (EXPECTED)))
+ ((ErtsProcLocks) erts_smp_atomic32_cmpxchg_relb(&(L)->flags, \
+ (erts_aint32_t) (NEW), \
+ (erts_aint32_t) (EXPECTED)))
#define ERTS_PROC_LOCK_FLGS_READ_(L) \
- ((ErtsProcLocks) erts_smp_atomic_read(&(L)->flags))
+ ((ErtsProcLocks) erts_smp_atomic32_read(&(L)->flags))
#else /* no opt atomic ops */
@@ -619,13 +621,13 @@ erts_proc_lock_op_debug(Process *p, ErtsProcLocks locks, int locked)
for (i = 0; i <= ERTS_PROC_LOCK_MAX_BIT; i++) {
ErtsProcLocks lock = ((ErtsProcLocks) 1) << i;
if (locks & lock) {
- long lock_count;
+ erts_aint32_t lock_count;
if (locked) {
- lock_count = erts_smp_atomic_inctest(&p->lock.locked[i]);
+ lock_count = erts_smp_atomic32_inctest(&p->lock.locked[i]);
ERTS_LC_ASSERT(lock_count == 1);
}
else {
- lock_count = erts_smp_atomic_dectest(&p->lock.locked[i]);
+ lock_count = erts_smp_atomic32_dectest(&p->lock.locked[i]);
ERTS_LC_ASSERT(lock_count == 0);
}
}
diff --git a/erts/emulator/beam/erl_smp.h b/erts/emulator/beam/erl_smp.h
index b41fa70476..287327bfe1 100644
--- a/erts/emulator/beam/erl_smp.h
+++ b/erts/emulator/beam/erl_smp.h
@@ -54,10 +54,10 @@ typedef erts_cnd_t erts_smp_cnd_t;
typedef erts_rwmtx_opt_t erts_smp_rwmtx_opt_t;
typedef erts_rwmtx_t erts_smp_rwmtx_t;
typedef erts_tsd_key_t erts_smp_tsd_key_t;
-typedef ethr_atomic_t erts_smp_atomic_t;
+typedef erts_atomic_t erts_smp_atomic_t;
+typedef erts_atomic32_t erts_smp_atomic32_t;
typedef erts_spinlock_t erts_smp_spinlock_t;
typedef erts_rwlock_t erts_smp_rwlock_t;
-typedef erts_thr_timeval_t erts_smp_thr_timeval_t;
void erts_thr_fatal_error(int, char *); /* implemented in erl_init.c */
#else /* #ifdef ERTS_SMP */
@@ -83,7 +83,8 @@ typedef struct {
} erts_smp_rwmtx_opt_t;
typedef int erts_smp_rwmtx_t;
typedef int erts_smp_tsd_key_t;
-typedef long erts_smp_atomic_t;
+typedef SWord erts_smp_atomic_t;
+typedef Uint32 erts_smp_atomic32_t;
#if __GNUC__ > 2
typedef struct { } erts_smp_spinlock_t;
typedef struct { } erts_smp_rwlock_t;
@@ -92,11 +93,6 @@ typedef struct { int gcc_is_buggy; } erts_smp_spinlock_t;
typedef struct { int gcc_is_buggy; } erts_smp_rwlock_t;
#endif
-typedef struct {
- long tv_sec;
- long tv_nsec;
-} erts_smp_thr_timeval_t;
-
#endif /* #ifdef ERTS_SMP */
ERTS_GLB_INLINE void erts_smp_thr_init(erts_smp_thr_init_data_t *id);
@@ -164,33 +160,82 @@ ERTS_GLB_INLINE int erts_smp_rwmtx_tryrwlock(erts_smp_rwmtx_t *rwmtx);
ERTS_GLB_INLINE void erts_smp_rwmtx_rwunlock(erts_smp_rwmtx_t *rwmtx);
ERTS_GLB_INLINE int erts_smp_lc_rwmtx_is_rlocked(erts_smp_rwmtx_t *mtx);
ERTS_GLB_INLINE int erts_smp_lc_rwmtx_is_rwlocked(erts_smp_rwmtx_t *mtx);
-ERTS_GLB_INLINE void erts_smp_atomic_init(erts_smp_atomic_t *var, long i);
-ERTS_GLB_INLINE void erts_smp_atomic_set(erts_smp_atomic_t *var, long i);
-ERTS_GLB_INLINE long erts_smp_atomic_read(erts_smp_atomic_t *var);
-ERTS_GLB_INLINE long erts_smp_atomic_inctest(erts_smp_atomic_t *incp);
-ERTS_GLB_INLINE long erts_smp_atomic_dectest(erts_smp_atomic_t *decp);
+ERTS_GLB_INLINE void erts_smp_atomic_init(erts_smp_atomic_t *var,
+ erts_aint_t i);
+ERTS_GLB_INLINE void erts_smp_atomic_set(erts_smp_atomic_t *var, erts_aint_t i);
+ERTS_GLB_INLINE erts_aint_t erts_smp_atomic_read(erts_smp_atomic_t *var);
+ERTS_GLB_INLINE erts_aint_t erts_smp_atomic_inctest(erts_smp_atomic_t *incp);
+ERTS_GLB_INLINE erts_aint_t erts_smp_atomic_dectest(erts_smp_atomic_t *decp);
ERTS_GLB_INLINE void erts_smp_atomic_inc(erts_smp_atomic_t *incp);
ERTS_GLB_INLINE void erts_smp_atomic_dec(erts_smp_atomic_t *decp);
-ERTS_GLB_INLINE long erts_smp_atomic_addtest(erts_smp_atomic_t *addp,
- long i);
-ERTS_GLB_INLINE void erts_smp_atomic_add(erts_smp_atomic_t *addp, long i);
-ERTS_GLB_INLINE long erts_smp_atomic_xchg(erts_smp_atomic_t *xchgp,
- long new);
-ERTS_GLB_INLINE long erts_smp_atomic_cmpxchg(erts_smp_atomic_t *xchgp,
- long new,
- long expected);
-ERTS_GLB_INLINE long erts_smp_atomic_bor(erts_smp_atomic_t *var, long mask);
-ERTS_GLB_INLINE long erts_smp_atomic_band(erts_smp_atomic_t *var, long mask);
-ERTS_GLB_INLINE long erts_smp_atomic_read_acqb(erts_smp_atomic_t *var);
-ERTS_GLB_INLINE void erts_smp_atomic_set_relb(erts_smp_atomic_t *var, long i);
+ERTS_GLB_INLINE erts_aint_t erts_smp_atomic_addtest(erts_smp_atomic_t *addp,
+ erts_aint_t i);
+ERTS_GLB_INLINE void erts_smp_atomic_add(erts_smp_atomic_t *addp,
+ erts_aint_t i);
+ERTS_GLB_INLINE erts_aint_t erts_smp_atomic_xchg(erts_smp_atomic_t *xchgp,
+ erts_aint_t new);
+ERTS_GLB_INLINE erts_aint_t erts_smp_atomic_cmpxchg(erts_smp_atomic_t *xchgp,
+ erts_aint_t new,
+ erts_aint_t expected);
+ERTS_GLB_INLINE erts_aint_t erts_smp_atomic_bor(erts_smp_atomic_t *var,
+ erts_aint_t mask);
+ERTS_GLB_INLINE erts_aint_t erts_smp_atomic_band(erts_smp_atomic_t *var,
+ erts_aint_t mask);
+ERTS_GLB_INLINE erts_aint_t erts_smp_atomic_read_acqb(erts_smp_atomic_t *var);
+ERTS_GLB_INLINE void erts_smp_atomic_set_relb(erts_smp_atomic_t *var,
+ erts_aint_t i);
ERTS_GLB_INLINE void erts_smp_atomic_dec_relb(erts_smp_atomic_t *decp);
-ERTS_GLB_INLINE long erts_smp_atomic_dectest_relb(erts_smp_atomic_t *decp);
-ERTS_GLB_INLINE long erts_smp_atomic_cmpxchg_acqb(erts_smp_atomic_t *xchgp,
- long new,
- long exp);
-ERTS_GLB_INLINE long erts_smp_atomic_cmpxchg_relb(erts_smp_atomic_t *xchgp,
- long new,
- long exp);
+ERTS_GLB_INLINE erts_aint_t erts_smp_atomic_dectest_relb(erts_smp_atomic_t *decp);
+ERTS_GLB_INLINE erts_aint_t erts_smp_atomic_cmpxchg_acqb(erts_smp_atomic_t *xchgp,
+ erts_aint_t new,
+ erts_aint_t exp);
+ERTS_GLB_INLINE erts_aint_t erts_smp_atomic_cmpxchg_relb(erts_smp_atomic_t *xchgp,
+ erts_aint_t new,
+ erts_aint_t exp);
+ERTS_GLB_INLINE void
+erts_smp_atomic32_init(erts_smp_atomic32_t *var, erts_aint32_t i);
+ERTS_GLB_INLINE void
+erts_smp_atomic32_set(erts_smp_atomic32_t *var, erts_aint32_t i);
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_read(erts_smp_atomic32_t *var);
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_inctest(erts_smp_atomic32_t *incp);
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_dectest(erts_smp_atomic32_t *decp);
+ERTS_GLB_INLINE void
+erts_smp_atomic32_inc(erts_smp_atomic32_t *incp);
+ERTS_GLB_INLINE void
+erts_smp_atomic32_dec(erts_smp_atomic32_t *decp);
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_addtest(erts_smp_atomic32_t *addp, erts_aint32_t i);
+ERTS_GLB_INLINE void
+erts_smp_atomic32_add(erts_smp_atomic32_t *addp, erts_aint32_t i);
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_xchg(erts_smp_atomic32_t *xchgp, erts_aint32_t new);
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_cmpxchg(erts_smp_atomic32_t *xchgp,
+ erts_aint32_t new,
+ erts_aint32_t expected);
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_bor(erts_smp_atomic32_t *var, erts_aint32_t mask);
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_band(erts_smp_atomic32_t *var, erts_aint32_t mask);
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_read_acqb(erts_smp_atomic32_t *var);
+ERTS_GLB_INLINE void
+erts_smp_atomic32_set_relb(erts_smp_atomic32_t *var, erts_aint32_t i);
+ERTS_GLB_INLINE void
+erts_smp_atomic32_dec_relb(erts_smp_atomic32_t *decp);
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_dectest_relb(erts_smp_atomic32_t *decp);
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_cmpxchg_acqb(erts_smp_atomic32_t *xchgp,
+ erts_aint32_t new,
+ erts_aint32_t exp);
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_cmpxchg_relb(erts_smp_atomic32_t *xchgp,
+ erts_aint32_t new,
+ erts_aint32_t exp);
ERTS_GLB_INLINE void erts_smp_spinlock_init_x(erts_smp_spinlock_t *lock,
char *name,
Eterm extra);
@@ -221,7 +266,6 @@ ERTS_GLB_INLINE void erts_smp_write_lock(erts_smp_rwlock_t *lock);
ERTS_GLB_INLINE void erts_smp_write_unlock(erts_smp_rwlock_t *lock);
ERTS_GLB_INLINE int erts_smp_lc_rwlock_is_rlocked(erts_smp_rwlock_t *lock);
ERTS_GLB_INLINE int erts_smp_lc_rwlock_is_rwlocked(erts_smp_rwlock_t *lock);
-ERTS_GLB_INLINE void erts_smp_thr_time_now(erts_smp_thr_timeval_t *time);
ERTS_GLB_INLINE void erts_smp_tsd_key_create(erts_smp_tsd_key_t *keyp);
ERTS_GLB_INLINE void erts_smp_tsd_key_delete(erts_smp_tsd_key_t key);
ERTS_GLB_INLINE void erts_smp_tsd_set(erts_smp_tsd_key_t key, void *value);
@@ -611,7 +655,7 @@ erts_smp_lc_rwmtx_is_rwlocked(erts_smp_rwmtx_t *mtx)
}
ERTS_GLB_INLINE void
-erts_smp_atomic_init(erts_smp_atomic_t *var, long i)
+erts_smp_atomic_init(erts_smp_atomic_t *var, erts_aint_t i)
{
#ifdef ERTS_SMP
erts_atomic_init(var, i);
@@ -621,7 +665,7 @@ erts_smp_atomic_init(erts_smp_atomic_t *var, long i)
}
ERTS_GLB_INLINE void
-erts_smp_atomic_set(erts_smp_atomic_t *var, long i)
+erts_smp_atomic_set(erts_smp_atomic_t *var, erts_aint_t i)
{
#ifdef ERTS_SMP
erts_atomic_set(var, i);
@@ -630,7 +674,7 @@ erts_smp_atomic_set(erts_smp_atomic_t *var, long i)
#endif
}
-ERTS_GLB_INLINE long
+ERTS_GLB_INLINE erts_aint_t
erts_smp_atomic_read(erts_smp_atomic_t *var)
{
#ifdef ERTS_SMP
@@ -640,7 +684,7 @@ erts_smp_atomic_read(erts_smp_atomic_t *var)
#endif
}
-ERTS_GLB_INLINE long
+ERTS_GLB_INLINE erts_aint_t
erts_smp_atomic_inctest(erts_smp_atomic_t *incp)
{
#ifdef ERTS_SMP
@@ -650,7 +694,7 @@ erts_smp_atomic_inctest(erts_smp_atomic_t *incp)
#endif
}
-ERTS_GLB_INLINE long
+ERTS_GLB_INLINE erts_aint_t
erts_smp_atomic_dectest(erts_smp_atomic_t *decp)
{
#ifdef ERTS_SMP
@@ -680,8 +724,8 @@ erts_smp_atomic_dec(erts_smp_atomic_t *decp)
#endif
}
-ERTS_GLB_INLINE long
-erts_smp_atomic_addtest(erts_smp_atomic_t *addp, long i)
+ERTS_GLB_INLINE erts_aint_t
+erts_smp_atomic_addtest(erts_smp_atomic_t *addp, erts_aint_t i)
{
#ifdef ERTS_SMP
return erts_atomic_addtest(addp, i);
@@ -691,7 +735,7 @@ erts_smp_atomic_addtest(erts_smp_atomic_t *addp, long i)
}
ERTS_GLB_INLINE void
-erts_smp_atomic_add(erts_smp_atomic_t *addp, long i)
+erts_smp_atomic_add(erts_smp_atomic_t *addp, erts_aint_t i)
{
#ifdef ERTS_SMP
erts_atomic_add(addp, i);
@@ -700,59 +744,61 @@ erts_smp_atomic_add(erts_smp_atomic_t *addp, long i)
#endif
}
-ERTS_GLB_INLINE long
-erts_smp_atomic_xchg(erts_smp_atomic_t *xchgp, long new)
+ERTS_GLB_INLINE erts_aint_t
+erts_smp_atomic_xchg(erts_smp_atomic_t *xchgp, erts_aint_t new)
{
#ifdef ERTS_SMP
return erts_atomic_xchg(xchgp, new);
#else
- long old;
+ erts_aint_t old;
old = *xchgp;
*xchgp = new;
return old;
#endif
}
-ERTS_GLB_INLINE long
-erts_smp_atomic_cmpxchg(erts_smp_atomic_t *xchgp, long new, long expected)
+ERTS_GLB_INLINE erts_aint_t
+erts_smp_atomic_cmpxchg(erts_smp_atomic_t *xchgp,
+ erts_aint_t new,
+ erts_aint_t expected)
{
#ifdef ERTS_SMP
return erts_atomic_cmpxchg(xchgp, new, expected);
#else
- long old = *xchgp;
+ erts_aint_t old = *xchgp;
if (old == expected)
*xchgp = new;
return old;
#endif
}
-ERTS_GLB_INLINE long
-erts_smp_atomic_bor(erts_smp_atomic_t *var, long mask)
+ERTS_GLB_INLINE erts_aint_t
+erts_smp_atomic_bor(erts_smp_atomic_t *var, erts_aint_t mask)
{
#ifdef ERTS_SMP
return erts_atomic_bor(var, mask);
#else
- long old;
+ erts_aint_t old;
old = *var;
*var |= mask;
return old;
#endif
}
-ERTS_GLB_INLINE long
-erts_smp_atomic_band(erts_smp_atomic_t *var, long mask)
+ERTS_GLB_INLINE erts_aint_t
+erts_smp_atomic_band(erts_smp_atomic_t *var, erts_aint_t mask)
{
#ifdef ERTS_SMP
return erts_atomic_band(var, mask);
#else
- long old;
+ erts_aint_t old;
old = *var;
*var &= mask;
return old;
#endif
}
-ERTS_GLB_INLINE long
+ERTS_GLB_INLINE erts_aint_t
erts_smp_atomic_read_acqb(erts_smp_atomic_t *var)
{
#ifdef ERTS_SMP
@@ -763,7 +809,7 @@ erts_smp_atomic_read_acqb(erts_smp_atomic_t *var)
}
ERTS_GLB_INLINE void
-erts_smp_atomic_set_relb(erts_smp_atomic_t *var, long i)
+erts_smp_atomic_set_relb(erts_smp_atomic_t *var, erts_aint_t i)
{
#ifdef ERTS_SMP
erts_atomic_set_relb(var, i);
@@ -772,7 +818,8 @@ erts_smp_atomic_set_relb(erts_smp_atomic_t *var, long i)
#endif
}
-ERTS_GLB_INLINE void erts_smp_atomic_dec_relb(erts_smp_atomic_t *decp)
+ERTS_GLB_INLINE void
+erts_smp_atomic_dec_relb(erts_smp_atomic_t *decp)
{
#ifdef ERTS_SMP
erts_atomic_dec_relb(decp);
@@ -781,7 +828,7 @@ ERTS_GLB_INLINE void erts_smp_atomic_dec_relb(erts_smp_atomic_t *decp)
#endif
}
-ERTS_GLB_INLINE long
+ERTS_GLB_INLINE erts_aint_t
erts_smp_atomic_dectest_relb(erts_smp_atomic_t *decp)
{
#ifdef ERTS_SMP
@@ -791,28 +838,244 @@ erts_smp_atomic_dectest_relb(erts_smp_atomic_t *decp)
#endif
}
-ERTS_GLB_INLINE long erts_smp_atomic_cmpxchg_acqb(erts_smp_atomic_t *xchgp,
- long new,
- long exp)
+ERTS_GLB_INLINE erts_aint_t
+erts_smp_atomic_cmpxchg_acqb(erts_smp_atomic_t *xchgp,
+ erts_aint_t new,
+ erts_aint_t exp)
{
#ifdef ERTS_SMP
return erts_atomic_cmpxchg_acqb(xchgp, new, exp);
#else
- long old = *xchgp;
+ erts_aint_t old = *xchgp;
if (old == exp)
*xchgp = new;
return old;
#endif
}
-ERTS_GLB_INLINE long erts_smp_atomic_cmpxchg_relb(erts_smp_atomic_t *xchgp,
- long new,
- long exp)
+ERTS_GLB_INLINE erts_aint_t
+erts_smp_atomic_cmpxchg_relb(erts_smp_atomic_t *xchgp,
+ erts_aint_t new,
+ erts_aint_t exp)
{
#ifdef ERTS_SMP
return erts_atomic_cmpxchg_relb(xchgp, new, exp);
#else
- long old = *xchgp;
+ erts_aint_t old = *xchgp;
+ if (old == exp)
+ *xchgp = new;
+ return old;
+#endif
+}
+
+ERTS_GLB_INLINE void
+erts_smp_atomic32_init(erts_smp_atomic32_t *var, erts_aint32_t i)
+{
+#ifdef ERTS_SMP
+ erts_atomic32_init(var, i);
+#else
+ *var = i;
+#endif
+}
+
+ERTS_GLB_INLINE void
+erts_smp_atomic32_set(erts_smp_atomic32_t *var, erts_aint32_t i)
+{
+#ifdef ERTS_SMP
+ erts_atomic32_set(var, i);
+#else
+ *var = i;
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_read(erts_smp_atomic32_t *var)
+{
+#ifdef ERTS_SMP
+ return erts_atomic32_read(var);
+#else
+ return *var;
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_inctest(erts_smp_atomic32_t *incp)
+{
+#ifdef ERTS_SMP
+ return erts_atomic32_inctest(incp);
+#else
+ return ++(*incp);
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_dectest(erts_smp_atomic32_t *decp)
+{
+#ifdef ERTS_SMP
+ return erts_atomic32_dectest(decp);
+#else
+ return --(*decp);
+#endif
+}
+
+ERTS_GLB_INLINE void
+erts_smp_atomic32_inc(erts_smp_atomic32_t *incp)
+{
+#ifdef ERTS_SMP
+ erts_atomic32_inc(incp);
+#else
+ ++(*incp);
+#endif
+}
+
+ERTS_GLB_INLINE void
+erts_smp_atomic32_dec(erts_smp_atomic32_t *decp)
+{
+#ifdef ERTS_SMP
+ erts_atomic32_dec(decp);
+#else
+ --(*decp);
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_addtest(erts_smp_atomic32_t *addp, erts_aint32_t i)
+{
+#ifdef ERTS_SMP
+ return erts_atomic32_addtest(addp, i);
+#else
+ return *addp += i;
+#endif
+}
+
+ERTS_GLB_INLINE void
+erts_smp_atomic32_add(erts_smp_atomic32_t *addp, erts_aint32_t i)
+{
+#ifdef ERTS_SMP
+ erts_atomic32_add(addp, i);
+#else
+ *addp += i;
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_xchg(erts_smp_atomic32_t *xchgp, erts_aint32_t new)
+{
+#ifdef ERTS_SMP
+ return erts_atomic32_xchg(xchgp, new);
+#else
+ erts_aint32_t old;
+ old = *xchgp;
+ *xchgp = new;
+ return old;
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_cmpxchg(erts_smp_atomic32_t *xchgp,
+ erts_aint32_t new,
+ erts_aint32_t expected)
+{
+#ifdef ERTS_SMP
+ return erts_atomic32_cmpxchg(xchgp, new, expected);
+#else
+ erts_aint32_t old = *xchgp;
+ if (old == expected)
+ *xchgp = new;
+ return old;
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_bor(erts_smp_atomic32_t *var, erts_aint32_t mask)
+{
+#ifdef ERTS_SMP
+ return erts_atomic32_bor(var, mask);
+#else
+ erts_aint32_t old;
+ old = *var;
+ *var |= mask;
+ return old;
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_band(erts_smp_atomic32_t *var, erts_aint32_t mask)
+{
+#ifdef ERTS_SMP
+ return erts_atomic32_band(var, mask);
+#else
+ erts_aint32_t old;
+ old = *var;
+ *var &= mask;
+ return old;
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_read_acqb(erts_smp_atomic32_t *var)
+{
+#ifdef ERTS_SMP
+ return erts_atomic32_read_acqb(var);
+#else
+ return *var;
+#endif
+}
+
+ERTS_GLB_INLINE void
+erts_smp_atomic32_set_relb(erts_smp_atomic32_t *var, erts_aint32_t i)
+{
+#ifdef ERTS_SMP
+ erts_atomic32_set_relb(var, i);
+#else
+ *var = i;
+#endif
+}
+
+ERTS_GLB_INLINE void
+erts_smp_atomic32_dec_relb(erts_smp_atomic32_t *decp)
+{
+#ifdef ERTS_SMP
+ erts_atomic32_dec_relb(decp);
+#else
+ --(*decp);
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_dectest_relb(erts_smp_atomic32_t *decp)
+{
+#ifdef ERTS_SMP
+ return erts_atomic32_dectest_relb(decp);
+#else
+ return --(*decp);
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_cmpxchg_acqb(erts_smp_atomic32_t *xchgp,
+ erts_aint32_t new,
+ erts_aint32_t exp)
+{
+#ifdef ERTS_SMP
+ return erts_atomic32_cmpxchg_acqb(xchgp, new, exp);
+#else
+ erts_aint32_t old = *xchgp;
+ if (old == exp)
+ *xchgp = new;
+ return old;
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_smp_atomic32_cmpxchg_relb(erts_smp_atomic32_t *xchgp,
+ erts_aint32_t new,
+ erts_aint32_t exp)
+{
+#ifdef ERTS_SMP
+ return erts_atomic32_cmpxchg_relb(xchgp, new, exp);
+#else
+ erts_aint32_t old = *xchgp;
if (old == exp)
*xchgp = new;
return old;
@@ -988,14 +1251,6 @@ erts_smp_lc_rwlock_is_rwlocked(erts_smp_rwlock_t *lock)
}
ERTS_GLB_INLINE void
-erts_smp_thr_time_now(erts_smp_thr_timeval_t *time)
-{
-#ifdef ERTS_SMP
- erts_thr_time_now(time);
-#endif
-}
-
-ERTS_GLB_INLINE void
erts_smp_tsd_key_create(erts_smp_tsd_key_t *keyp)
{
#ifdef ERTS_SMP
diff --git a/erts/emulator/beam/erl_term.c b/erts/emulator/beam/erl_term.c
index c6458a0e45..f77e8b798f 100644
--- a/erts/emulator/beam/erl_term.c
+++ b/erts/emulator/beam/erl_term.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2000-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2000-2011. 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
@@ -58,9 +58,9 @@ do { \
#endif
#if ET_DEBUG
-unsigned tag_val_def_debug(Eterm x, const char *file, unsigned line)
+unsigned tag_val_def_debug(Wterm x, const char *file, unsigned line)
#else
-unsigned tag_val_def(Eterm x)
+unsigned tag_val_def(Wterm x)
#define file __FILE__
#define line __LINE__
#endif
@@ -125,10 +125,10 @@ FUNTY checked_##FUN(ARGTY x, const char *file, unsigned line) \
ET_DEFINE_CHECKED(Eterm,make_boxed,Eterm*,_is_taggable_pointer);
ET_DEFINE_CHECKED(int,is_boxed,Eterm,!is_header);
-ET_DEFINE_CHECKED(Eterm*,boxed_val,Eterm,_boxed_precond);
+ET_DEFINE_CHECKED(Eterm*,boxed_val,Wterm,_boxed_precond);
ET_DEFINE_CHECKED(Eterm,make_list,Eterm*,_is_taggable_pointer);
ET_DEFINE_CHECKED(int,is_not_list,Eterm,!is_header);
-ET_DEFINE_CHECKED(Eterm*,list_val,Eterm,_list_precond);
+ET_DEFINE_CHECKED(Eterm*,list_val,Wterm,_list_precond);
ET_DEFINE_CHECKED(Uint,unsigned_val,Eterm,is_small);
ET_DEFINE_CHECKED(Sint,signed_val,Eterm,is_small);
ET_DEFINE_CHECKED(Uint,atom_val,Eterm,is_atom);
@@ -136,34 +136,35 @@ ET_DEFINE_CHECKED(Uint,header_arity,Eterm,is_header);
ET_DEFINE_CHECKED(Uint,arityval,Eterm,is_arity_value);
ET_DEFINE_CHECKED(Uint,thing_arityval,Eterm,is_thing);
ET_DEFINE_CHECKED(Uint,thing_subtag,Eterm,is_thing);
-ET_DEFINE_CHECKED(Eterm*,binary_val,Eterm,is_binary);
-ET_DEFINE_CHECKED(Eterm*,fun_val,Eterm,is_fun);
+ET_DEFINE_CHECKED(Eterm*,binary_val,Wterm,is_binary);
+ET_DEFINE_CHECKED(Eterm*,fun_val,Wterm,is_fun);
ET_DEFINE_CHECKED(int,bignum_header_is_neg,Eterm,_is_bignum_header);
ET_DEFINE_CHECKED(Eterm,bignum_header_neg,Eterm,_is_bignum_header);
ET_DEFINE_CHECKED(Uint,bignum_header_arity,Eterm,_is_bignum_header);
-ET_DEFINE_CHECKED(Eterm*,big_val,Eterm,is_big);
-ET_DEFINE_CHECKED(Eterm*,float_val,Eterm,is_float);
-ET_DEFINE_CHECKED(Eterm*,tuple_val,Eterm,is_tuple);
+ET_DEFINE_CHECKED(Eterm*,big_val,Wterm,is_big);
+ET_DEFINE_CHECKED(Eterm*,float_val,Wterm,is_float);
+ET_DEFINE_CHECKED(Eterm*,tuple_val,Wterm,is_tuple);
ET_DEFINE_CHECKED(Uint,internal_pid_data,Eterm,is_internal_pid);
ET_DEFINE_CHECKED(struct erl_node_*,internal_pid_node,Eterm,is_internal_pid);
ET_DEFINE_CHECKED(Uint,internal_port_data,Eterm,is_internal_port);
ET_DEFINE_CHECKED(struct erl_node_*,internal_port_node,Eterm,is_internal_port);
-ET_DEFINE_CHECKED(Eterm*,internal_ref_val,Eterm,is_internal_ref);
-ET_DEFINE_CHECKED(Uint,internal_ref_data_words,Eterm,is_internal_ref);
-ET_DEFINE_CHECKED(Uint32*,internal_ref_data,Eterm,is_internal_ref);
+ET_DEFINE_CHECKED(Eterm*,internal_ref_val,Wterm,is_internal_ref);
+ET_DEFINE_CHECKED(Uint,internal_ref_data_words,Wterm,is_internal_ref);
+ET_DEFINE_CHECKED(Uint32*,internal_ref_data,Wterm,is_internal_ref);
ET_DEFINE_CHECKED(struct erl_node_*,internal_ref_node,Eterm,is_internal_ref);
-ET_DEFINE_CHECKED(Eterm*,external_val,Eterm,is_external);
-ET_DEFINE_CHECKED(Uint,external_data_words,Eterm,is_external);
-ET_DEFINE_CHECKED(Uint,external_pid_data_words,Eterm,is_external_pid);
-ET_DEFINE_CHECKED(Uint,external_pid_data,Eterm,is_external_pid);
-ET_DEFINE_CHECKED(struct erl_node_*,external_pid_node,Eterm,is_external_pid);
-ET_DEFINE_CHECKED(Uint,external_port_data_words,Eterm,is_external_port);
-ET_DEFINE_CHECKED(Uint,external_port_data,Eterm,is_external_port);
-ET_DEFINE_CHECKED(struct erl_node_*,external_port_node,Eterm,is_external_port);
-ET_DEFINE_CHECKED(Uint,external_ref_data_words,Eterm,is_external_ref);
-ET_DEFINE_CHECKED(Uint32*,external_ref_data,Eterm,is_external_ref);
+ET_DEFINE_CHECKED(Eterm*,external_val,Wterm,is_external);
+ET_DEFINE_CHECKED(Uint,external_data_words,Wterm,is_external);
+ET_DEFINE_CHECKED(Uint,external_pid_data_words,Wterm,is_external_pid);
+ET_DEFINE_CHECKED(Uint,external_pid_data,Wterm,is_external_pid);
+ET_DEFINE_CHECKED(struct erl_node_*,external_pid_node,Wterm,is_external_pid);
+ET_DEFINE_CHECKED(Uint,external_port_data_words,Wterm,is_external_port);
+ET_DEFINE_CHECKED(Uint,external_port_data,Wterm,is_external_port);
+ET_DEFINE_CHECKED(struct erl_node_*,external_port_node,Wterm,is_external_port);
+ET_DEFINE_CHECKED(Uint,external_ref_data_words,Wterm,is_external_ref);
+ET_DEFINE_CHECKED(Uint32*,external_ref_data,Wterm,is_external_ref);
ET_DEFINE_CHECKED(struct erl_node_*,external_ref_node,Eterm,is_external_ref);
-ET_DEFINE_CHECKED(Eterm*,export_val,Eterm,is_export);
+ET_DEFINE_CHECKED(Eterm*,export_val,Wterm,is_export);
+ET_DEFINE_CHECKED(Uint,external_thing_data_words,ExternalThing*,is_thing_ptr);
ET_DEFINE_CHECKED(Eterm,make_cp,UWord *,_is_taggable_pointer);
ET_DEFINE_CHECKED(UWord *,cp_val,Eterm,is_CP);
diff --git a/erts/emulator/beam/erl_term.h b/erts/emulator/beam/erl_term.h
index b8e4473141..1d75fa313c 100644
--- a/erts/emulator/beam/erl_term.h
+++ b/erts/emulator/beam/erl_term.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2000-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2000-2011. 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
@@ -22,6 +22,8 @@
#include "sys.h" /* defines HALFWORD_HEAP */
+typedef UWord Wterm; /* Full word terms */
+
#if HALFWORD_HEAP
# define HEAP_ON_C_STACK 0
# if HALFWORD_ASSERT
@@ -193,7 +195,7 @@ struct erl_node_; /* Declared in erl_node_tables.h */
#endif
#define _is_aligned(x) (((Uint)(x) & 0x3) == 0)
#define _unchecked_make_boxed(x) ((Uint) COMPRESS_POINTER(x) + TAG_PRIMARY_BOXED)
-_ET_DECLARE_CHECKED(Eterm,make_boxed,Eterm*);
+_ET_DECLARE_CHECKED(Eterm,make_boxed,Eterm*)
#define make_boxed(x) _ET_APPLY(make_boxed,(x))
#if 1
#define _is_not_boxed(x) ((x) & (_TAG_PRIMARY_MASK-TAG_PRIMARY_BOXED))
@@ -204,12 +206,12 @@ _ET_DECLARE_CHECKED(int,is_boxed,Eterm)
#define is_boxed(x) (((x) & _TAG_PRIMARY_MASK) == TAG_PRIMARY_BOXED)
#endif
#define _unchecked_boxed_val(x) ((Eterm*) EXPAND_POINTER(((x) - TAG_PRIMARY_BOXED)))
-_ET_DECLARE_CHECKED(Eterm*,boxed_val,Eterm);
+_ET_DECLARE_CHECKED(Eterm*,boxed_val,Wterm)
#define boxed_val(x) _ET_APPLY(boxed_val,(x))
/* cons cell ("list") access methods */
#define _unchecked_make_list(x) ((Uint) COMPRESS_POINTER(x) + TAG_PRIMARY_LIST)
-_ET_DECLARE_CHECKED(Eterm,make_list,Eterm*);
+_ET_DECLARE_CHECKED(Eterm,make_list,Eterm*)
#define make_list(x) _ET_APPLY(make_list,(x))
#if 1
#define _unchecked_is_not_list(x) ((x) & (_TAG_PRIMARY_MASK-TAG_PRIMARY_LIST))
@@ -226,7 +228,7 @@ _ET_DECLARE_CHECKED(int,is_not_list,Eterm)
#define _list_precond(x) (is_list(x))
#endif
#define _unchecked_list_val(x) ((Eterm*) EXPAND_POINTER((x) - TAG_PRIMARY_LIST))
-_ET_DECLARE_CHECKED(Eterm*,list_val,Eterm);
+_ET_DECLARE_CHECKED(Eterm*,list_val,Wterm)
#define list_val(x) _ET_APPLY(list_val,(x))
#define CONS(hp, car, cdr) \
@@ -240,6 +242,8 @@ _ET_DECLARE_CHECKED(Eterm*,list_val,Eterm);
#define ptr_val(x) _unchecked_ptr_val((x)) /*XXX*/
#define _unchecked_offset_ptr(x,offs) ((x)+((offs)*sizeof(Eterm)))
#define offset_ptr(x,offs) _unchecked_offset_ptr(x,offs) /*XXX*/
+#define _unchecked_byte_offset_ptr(x,byte_offs) ((x)+(offs))
+#define byte_offset_ptr(x,offs) _unchecked_byte_offset_ptr(x,offs) /*XXX*/
/* fixnum ("small") access methods */
#if defined(ARCH_64) && !HALFWORD_HEAP
@@ -305,6 +309,7 @@ _ET_DECLARE_CHECKED(Uint,arityval,Eterm)
/* thing access methods */
#define is_thing(x) (is_header((x)) && header_is_thing((x)))
+#define is_thing_ptr(t) (is_thing((t)->header))
#define _unchecked_thing_arityval(x) _unchecked_header_arity((x))
_ET_DECLARE_CHECKED(Uint,thing_arityval,Eterm)
#define thing_arityval(x) _ET_APPLY(thing_arityval,(x))
@@ -339,7 +344,7 @@ _ET_DECLARE_CHECKED(Uint,thing_subtag,Eterm)
#define is_binary(x) (is_boxed((x)) && is_binary_header(*boxed_val((x))))
#define is_not_binary(x) (!is_binary((x)))
#define _unchecked_binary_val(x) _unchecked_boxed_val((x))
-_ET_DECLARE_CHECKED(Eterm*,binary_val,Eterm)
+_ET_DECLARE_CHECKED(Eterm*,binary_val,Wterm)
#define binary_val(x) _ET_APPLY(binary_val,(x))
/* process binaries stuff (special case of binaries) */
@@ -356,7 +361,7 @@ _ET_DECLARE_CHECKED(Eterm*,binary_val,Eterm)
#define is_fun(x) (is_boxed((x)) && is_fun_header(*boxed_val((x))))
#define is_not_fun(x) (!is_fun((x)))
#define _unchecked_fun_val(x) _unchecked_boxed_val((x))
-_ET_DECLARE_CHECKED(Eterm*,fun_val,Eterm)
+_ET_DECLARE_CHECKED(Eterm*,fun_val,Wterm)
#define fun_val(x) _ET_APPLY(fun_val,(x))
/* export access methods */
@@ -364,7 +369,7 @@ _ET_DECLARE_CHECKED(Eterm*,fun_val,Eterm)
#define is_export(x) (is_boxed((x)) && is_export_header(*boxed_val((x))))
#define is_not_export(x) (!is_export((x)))
#define _unchecked_export_val(x) _unchecked_boxed_val(x)
-_ET_DECLARE_CHECKED(Eterm*,export_val,Eterm)
+_ET_DECLARE_CHECKED(Eterm*,export_val,Wterm)
#define export_val(x) _ET_APPLY(export_val,(x))
#define is_export_header(x) ((x) == HEADER_EXPORT)
#if HALFWORD_HEAP
@@ -391,7 +396,7 @@ _ET_DECLARE_CHECKED(Uint,bignum_header_arity,Eterm)
#define is_big(x) (is_boxed((x)) && _is_bignum_header(*boxed_val((x))))
#define is_not_big(x) (!is_big((x)))
#define _unchecked_big_val(x) _unchecked_boxed_val((x))
-_ET_DECLARE_CHECKED(Eterm*,big_val,Eterm)
+_ET_DECLARE_CHECKED(Eterm*,big_val,Wterm)
#define big_val(x) _ET_APPLY(big_val,(x))
/* flonum ("float") access methods */
@@ -404,7 +409,7 @@ _ET_DECLARE_CHECKED(Eterm*,big_val,Eterm)
#define is_float(x) (is_boxed((x)) && *boxed_val((x)) == HEADER_FLONUM)
#define is_not_float(x) (!is_float(x))
#define _unchecked_float_val(x) _unchecked_boxed_val((x))
-_ET_DECLARE_CHECKED(Eterm*,float_val,Eterm)
+_ET_DECLARE_CHECKED(Eterm*,float_val,Wterm)
#define float_val(x) _ET_APPLY(float_val,(x))
/* Float definition for byte and word access */
@@ -422,15 +427,16 @@ typedef union float_def
} FloatDef;
#if defined(ARCH_64) && !HALFWORD_HEAP
-#define GET_DOUBLE(x, f) (f).fdw = *(float_val(x)+1)
+
+#define FLOAT_VAL_GET_DOUBLE(fval, f) (f).fdw = *((fval)+1)
#define PUT_DOUBLE(f, x) *(x) = HEADER_FLONUM, \
*((x)+1) = (f).fdw
#define GET_DOUBLE_DATA(p, f) (f).fdw = *((Uint *) (p))
#define PUT_DOUBLE_DATA(f,p) *((Uint *) (p)) = (f).fdw
#else
-#define GET_DOUBLE(x, f) (f).fw[0] = *(float_val(x)+1), \
- (f).fw[1] = *(float_val(x)+2)
+#define FLOAT_VAL_GET_DOUBLE(fval, f) (f).fw[0] = *((fval)+1), \
+ (f).fw[1] = *((fval)+2)
#define PUT_DOUBLE(f, x) *(x) = HEADER_FLONUM, \
*((x)+1) = (f).fw[0], \
@@ -440,6 +446,9 @@ typedef union float_def
#define PUT_DOUBLE_DATA(f,p) *((Uint *) (p)) = (f).fw[0],\
*(((Uint *) (p))+1) = (f).fw[1]
#endif
+
+#define GET_DOUBLE(x, f) FLOAT_VAL_GET_DOUBLE(float_val(x), f)
+
#define DOUBLE_DATA_WORDS (sizeof(ieee754_8)/sizeof(Eterm))
#define FLOAT_SIZE_OBJECT (DOUBLE_DATA_WORDS+1)
@@ -451,7 +460,7 @@ typedef union float_def
(is_boxed((x)) && *boxed_val((x)) == make_arityval((a)))
#define is_not_tuple_arity(x, a) (!is_tuple_arity((x),(a)))
#define _unchecked_tuple_val(x) _unchecked_boxed_val(x)
-_ET_DECLARE_CHECKED(Eterm*,tuple_val,Eterm)
+_ET_DECLARE_CHECKED(Eterm*,tuple_val,Wterm)
#define tuple_val(x) _ET_APPLY(tuple_val,(x))
#define TUPLE0(t) \
@@ -790,21 +799,24 @@ do { \
((RefThing*) internal_ref_val(x))
#define is_internal_ref(x) \
- (_unchecked_is_boxed((x)) && is_ref_thing_header(*boxed_val((x))))
+ (_unchecked_is_boxed((x)) && is_ref_thing_header(*boxed_val((x))))
+
#define is_not_internal_ref(x) \
(!is_internal_ref((x)))
#define _unchecked_internal_ref_val(x) _unchecked_boxed_val((x))
-_ET_DECLARE_CHECKED(Eterm*,internal_ref_val,Eterm)
+_ET_DECLARE_CHECKED(Eterm*,internal_ref_val,Wterm)
#define internal_ref_val(x) _ET_APPLY(internal_ref_val,(x))
+#define internal_thing_ref_data_words(t) (thing_arityval(*(Eterm*)(t)))
#define _unchecked_internal_ref_data_words(x) \
(_unchecked_thing_arityval(*_unchecked_internal_ref_val(x)))
-_ET_DECLARE_CHECKED(Uint,internal_ref_data_words,Eterm)
+_ET_DECLARE_CHECKED(Uint,internal_ref_data_words,Wterm)
#define internal_ref_data_words(x) _ET_APPLY(internal_ref_data_words,(x))
-#define _unchecked_internal_ref_data(x) (_unchecked_ref_thing_ptr(x)->data.ui32)
-_ET_DECLARE_CHECKED(Uint32*,internal_ref_data,Eterm)
+#define internal_thing_ref_data(thing) ((thing)->data.ui32)
+#define _unchecked_internal_ref_data(x) (internal_thing_ref_data(_unchecked_ref_thing_ptr(x)))
+_ET_DECLARE_CHECKED(Uint32*,internal_ref_data,Wterm)
#define internal_ref_data(x) _ET_APPLY(internal_ref_data,(x))
#define _unchecked_internal_ref_node(x) erts_this_node
@@ -889,14 +901,14 @@ typedef struct external_thing_ {
#define is_external_header(x) \
(((x) & (_TAG_HEADER_MASK-_BINARY_XXX_MASK)) == _TAG_HEADER_EXTERNAL_PID)
-#define is_external(x) \
- (is_boxed((x)) && is_external_header(*boxed_val((x))))
+#define is_external(x) (is_boxed((x)) && is_external_header(*boxed_val((x))))
+
#define is_external_pid(x) \
(is_boxed((x)) && is_external_pid_header(*boxed_val((x))))
#define is_external_port(x) \
- (is_boxed((x)) && is_external_port_header(*boxed_val((x))))
-#define is_external_ref(x) \
- (_unchecked_is_boxed((x)) && is_external_ref_header(*boxed_val((x))))
+ (is_boxed((x)) && is_external_port_header(*boxed_val((x))))
+
+#define is_external_ref(x) (_unchecked_is_boxed((x)) && is_external_ref_header(*boxed_val((x))))
#define _unchecked_is_external(x) \
(_unchecked_is_boxed((x)) && is_external_header(*_unchecked_boxed_val((x))))
@@ -914,17 +926,21 @@ typedef struct external_thing_ {
#define make_external_ref make_external
#define _unchecked_external_val(x) _unchecked_boxed_val((x))
-_ET_DECLARE_CHECKED(Eterm*,external_val,Eterm)
+_ET_DECLARE_CHECKED(Eterm*,external_val,Wterm)
#define external_val(x) _ET_APPLY(external_val,(x))
#define external_thing_ptr(x) ((ExternalThing *) external_val((x)))
#define _unchecked_external_thing_ptr(x) \
((ExternalThing *) _unchecked_external_val((x)))
+#define _unchecked_external_thing_data_words(thing) \
+ (_unchecked_thing_arityval((thing)->header) + (1 - EXTERNAL_THING_HEAD_SIZE))
+_ET_DECLARE_CHECKED(Uint,external_thing_data_words,ExternalThing*)
+#define external_thing_data_words(thing) _ET_APPLY(external_thing_data_words,(thing))
+
#define _unchecked_external_data_words(x) \
- (_unchecked_thing_arityval(_unchecked_external_thing_ptr((x))->header) \
- + (1 - EXTERNAL_THING_HEAD_SIZE))
-_ET_DECLARE_CHECKED(Uint,external_data_words,Eterm)
+ _unchecked_external_thing_data_words(_unchecked_external_thing_ptr((x)))
+_ET_DECLARE_CHECKED(Uint,external_data_words,Wterm)
#define external_data_words(x) _ET_APPLY(external_data_words,(x))
#define _unchecked_external_data(x) (_unchecked_external_thing_ptr((x))->data.ui)
@@ -935,15 +951,15 @@ _ET_DECLARE_CHECKED(Uint,external_data_words,Eterm)
#define _unchecked_external_pid_data_words(x) \
_unchecked_external_data_words((x))
-_ET_DECLARE_CHECKED(Uint,external_pid_data_words,Eterm)
+_ET_DECLARE_CHECKED(Uint,external_pid_data_words,Wterm)
#define external_pid_data_words(x) _ET_APPLY(external_pid_data_words,(x))
#define _unchecked_external_pid_data(x) _unchecked_external_data((x))[0]
-_ET_DECLARE_CHECKED(Uint,external_pid_data,Eterm)
+_ET_DECLARE_CHECKED(Uint,external_pid_data,Wterm)
#define external_pid_data(x) _ET_APPLY(external_pid_data,(x))
#define _unchecked_external_pid_node(x) _unchecked_external_node((x))
-_ET_DECLARE_CHECKED(struct erl_node_*,external_pid_node,Eterm)
+_ET_DECLARE_CHECKED(struct erl_node_*,external_pid_node,Wterm)
#define external_pid_node(x) _ET_APPLY(external_pid_node,(x))
#define external_pid_number(x) _GET_PID_NUM(external_pid_data((x)))
@@ -951,27 +967,29 @@ _ET_DECLARE_CHECKED(struct erl_node_*,external_pid_node,Eterm)
#define _unchecked_external_port_data_words(x) \
_unchecked_external_data_words((x))
-_ET_DECLARE_CHECKED(Uint,external_port_data_words,Eterm)
+_ET_DECLARE_CHECKED(Uint,external_port_data_words,Wterm)
#define external_port_data_words(x) _ET_APPLY(external_port_data_words,(x))
#define _unchecked_external_port_data(x) _unchecked_external_data((x))[0]
-_ET_DECLARE_CHECKED(Uint,external_port_data,Eterm)
+_ET_DECLARE_CHECKED(Uint,external_port_data,Wterm)
#define external_port_data(x) _ET_APPLY(external_port_data,(x))
#define _unchecked_external_port_node(x) _unchecked_external_node((x))
-_ET_DECLARE_CHECKED(struct erl_node_*,external_port_node,Eterm)
+_ET_DECLARE_CHECKED(struct erl_node_*,external_port_node,Wterm)
#define external_port_node(x) _ET_APPLY(external_port_node,(x))
#define external_port_number(x) _GET_PORT_NUM(external_port_data((x)))
#define _unchecked_external_ref_data_words(x) \
_unchecked_external_data_words((x))
-_ET_DECLARE_CHECKED(Uint,external_ref_data_words,Eterm)
+_ET_DECLARE_CHECKED(Uint,external_ref_data_words,Wterm)
#define external_ref_data_words(x) _ET_APPLY(external_ref_data_words,(x))
+#define external_thing_ref_data_words(thing) external_thing_data_words(thing)
#define _unchecked_external_ref_data(x) (_unchecked_external_thing_ptr((x))->data.ui32)
-_ET_DECLARE_CHECKED(Uint32*,external_ref_data,Eterm)
+_ET_DECLARE_CHECKED(Uint32*,external_ref_data,Wterm)
#define external_ref_data(x) _ET_APPLY(external_ref_data,(x))
+#define external_thing_ref_data(thing) ((thing)->data.ui32)
#define _unchecked_external_ref_node(x) _unchecked_external_node((x))
_ET_DECLARE_CHECKED(struct erl_node_*,external_ref_node,Eterm)
@@ -995,14 +1013,14 @@ _ET_DECLARE_CHECKED(struct erl_node_*,external_ref_node,Eterm)
#endif
#define _unchecked_make_cp(x) ((Eterm) COMPRESS_POINTER(x))
-_ET_DECLARE_CHECKED(Eterm,make_cp,BeamInstr*);
+_ET_DECLARE_CHECKED(Eterm,make_cp,BeamInstr*)
#define make_cp(x) _ET_APPLY(make_cp,(x))
#define is_not_CP(x) ((x) & _CPMASK)
#define is_CP(x) (!is_not_CP(x))
#define _unchecked_cp_val(x) ((BeamInstr*) EXPAND_POINTER(x))
-_ET_DECLARE_CHECKED(BeamInstr*,cp_val,Eterm);
+_ET_DECLARE_CHECKED(BeamInstr*,cp_val,Eterm)
#define cp_val(x) _ET_APPLY(cp_val,(x))
#define make_catch(x) (((x) << _TAG_IMMED2_SIZE) | _TAG_IMMED2_CATCH)
@@ -1083,10 +1101,10 @@ _ET_DECLARE_CHECKED(Uint,y_reg_index,Uint)
#define SMALL_DEF 0xf
#if ET_DEBUG
-extern unsigned tag_val_def_debug(Eterm, const char*, unsigned);
+extern unsigned tag_val_def_debug(Wterm, const char*, unsigned);
#define tag_val_def(x) tag_val_def_debug((x),__FILE__,__LINE__)
#else
-extern unsigned tag_val_def(Eterm);
+extern unsigned tag_val_def(Wterm);
#endif
#define not_eq_tags(X,Y) (tag_val_def((X)) ^ tag_val_def((Y)))
@@ -1102,5 +1120,81 @@ extern unsigned tag_val_def(Eterm);
#define FLOAT_BIG _NUMBER_CODE(FLOAT_DEF,BIG_DEF)
#define FLOAT_FLOAT _NUMBER_CODE(FLOAT_DEF,FLOAT_DEF)
+#if HALFWORD_HEAP
+#define ptr2rel(PTR,BASE) ((Eterm*)((char*)(PTR) - (char*)(BASE)))
+#define rterm2wterm(REL,BASE) ((Wterm)(REL) + (Wterm)(BASE))
+
+#else /* HALFWORD_HEAP */
+
+#define ptr2rel(PTR,BASE) (PTR)
+#define rterm2wterm(REL,BASE) (REL)
+
+#endif /* !HALFWORD_HEAP */
+
+#define make_list_rel(PTR, BASE) make_list(ptr2rel(PTR,BASE))
+#define make_boxed_rel(PTR, BASE) make_boxed(ptr2rel(PTR,BASE))
+#define make_fun_rel make_boxed_rel
+#define make_binary_rel make_boxed_rel
+#define make_tuple_rel make_boxed_rel
+#define make_external_rel make_boxed_rel
+#define make_internal_ref_rel make_boxed_rel
+
+#define binary_val_rel(RTERM, BASE) binary_val(rterm2wterm(RTERM, BASE))
+#define list_val_rel(RTERM, BASE) list_val(rterm2wterm(RTERM, BASE))
+#define boxed_val_rel(RTERM, BASE) boxed_val(rterm2wterm(RTERM, BASE))
+#define tuple_val_rel(RTERM, BASE) tuple_val(rterm2wterm(RTERM, BASE))
+#define export_val_rel(RTERM, BASE) export_val(rterm2wterm(RTERM, BASE))
+#define fun_val_rel(RTERM, BASE) fun_val(rterm2wterm(RTERM, BASE))
+#define big_val_rel(RTERM,BASE) big_val(rterm2wterm(RTERM,BASE))
+#define float_val_rel(RTERM,BASE) float_val(rterm2wterm(RTERM,BASE))
+#define internal_ref_val_rel(RTERM,BASE) internal_ref_val(rterm2wterm(RTERM,BASE))
+
+#define external_thing_ptr_rel(RTERM, BASE) external_thing_ptr(rterm2wterm(RTERM, BASE))
+#define external_data_words_rel(RTERM,BASE) external_data_words(rterm2wterm(RTERM,BASE))
+
+#define external_port_node_rel(RTERM,BASE) external_port_node(rterm2wterm(RTERM,BASE))
+#define external_port_data_rel(RTERM,BASE) external_port_data(rterm2wterm(RTERM,BASE))
+
+#define is_external_pid_rel(RTERM,BASE) is_external_pid(rterm2wterm(RTERM,BASE))
+#define external_pid_node_rel(RTERM,BASE) external_pid_node(rterm2wterm(RTERM,BASE))
+#define external_pid_data_rel(RTERM,BASE) external_pid_data(rterm2wterm(RTERM,BASE))
+
+#define is_binary_rel(RTERM,BASE) is_binary(rterm2wterm(RTERM,BASE))
+#define is_float_rel(RTERM,BASE) is_float(rterm2wterm(RTERM,BASE))
+#define is_fun_rel(RTERM,BASE) is_fun(rterm2wterm(RTERM,BASE))
+#define is_big_rel(RTERM,BASE) is_big(rterm2wterm(RTERM,BASE))
+#define is_export_rel(RTERM,BASE) is_export(rterm2wterm(RTERM,BASE))
+#define is_tuple_rel(RTERM,BASE) is_tuple(rterm2wterm(RTERM,BASE))
+
+#define GET_DOUBLE_REL(RTERM, f, BASE) GET_DOUBLE(rterm2wterm(RTERM,BASE), f)
+
+#define ref_thing_ptr_rel(RTERM,BASE) ref_thing_ptr(rterm2wterm(RTERM,BASE))
+#define is_internal_ref_rel(RTERM,BASE) is_internal_ref(rterm2wterm(RTERM,BASE))
+#define is_external_rel(RTERM,BASE) is_external(rterm2wterm(RTERM,BASE))
+#define is_external_port_rel(RTERM,BASE) is_external_port(rterm2wterm(RTERM,BASE))
+#define is_external_ref_rel(RTERM,BASE) is_external_ref(rterm2wterm(RTERM,BASE))
+
+#define external_node_rel(RTERM,BASE) external_node(rterm2wterm(RTERM,BASE))
+
+
+#if HALFWORD_HEAP
+ERTS_GLB_INLINE int is_same(Eterm a, Eterm* a_base, Eterm b, Eterm* b_base);
+
+#if ERTS_GLB_INLINE_INCL_FUNC_DEF
+ERTS_GLB_INLINE int is_same(Eterm a, Eterm* a_base, Eterm b, Eterm* b_base)
+{
+ /* If bases differ, assume a and b are on different "heaps",
+ ie can only be same if immed */
+ ASSERT(a_base == b_base || is_immed(a) || is_immed(b)
+ || rterm2wterm(a,a_base) != rterm2wterm(b,b_base));
+
+ return a == b && (a_base == b_base || is_immed(a));
+}
+#endif
+
+#else /* !HALFWORD_HEAP */
+#define is_same(A,A_BASE,B,B_BASE) ((A)==(B))
+#endif
+
#endif /* __ERL_TERM_H */
diff --git a/erts/emulator/beam/erl_threads.h b/erts/emulator/beam/erl_threads.h
index a74cf79b8c..8c9cace0c5 100644
--- a/erts/emulator/beam/erl_threads.h
+++ b/erts/emulator/beam/erl_threads.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2001-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2001-2011. 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
@@ -36,6 +36,16 @@
#include "erl_lock_count.h"
#include "erl_term.h"
+#if defined(__GLIBC__) && (__GLIBC__ << 16) + __GLIBC_MINOR__ < (2 << 16) + 4
+/*
+ * pthread_mutex_destroy() may return EBUSY when it shouldn't :( We have
+ * only seen this bug in glibc versions before 2.4. Note that condition
+ * variables, rwmutexes, spinlocks, and rwspinlocks also may be effected by
+ * this bug since these implementations may use mutexes internally.
+ */
+# define ERTS_THR_HAVE_BUSY_DESTROY_BUG
+#endif
+
#define ERTS_THR_MEMORY_BARRIER ETHR_MEMORY_BARRIER
#ifdef ERTS_ENABLE_LOCK_COUNT
@@ -89,7 +99,10 @@ typedef ethr_rwmutex_opt erts_rwmtx_opt_t;
typedef ethr_tsd_key erts_tsd_key_t;
typedef ethr_ts_event erts_tse_t;
+typedef ethr_sint_t erts_aint_t;
typedef ethr_atomic_t erts_atomic_t;
+typedef ethr_sint32_t erts_aint32_t;
+typedef ethr_atomic32_t erts_atomic32_t;
/* spinlock */
typedef struct {
@@ -113,7 +126,6 @@ typedef struct {
#endif
} erts_rwlock_t;
-typedef ethr_timeval erts_thr_timeval_t;
__decl_noreturn void __noreturn erts_thr_fatal_error(int, char *);
/* implemented in erl_init.c */
@@ -152,7 +164,10 @@ typedef struct {
typedef int erts_rwmtx_t;
typedef int erts_tsd_key_t;
typedef int erts_tse_t;
-typedef long erts_atomic_t;
+typedef SWord erts_aint_t;
+typedef SWord erts_atomic_t;
+typedef SWord erts_aint32_t;
+typedef SWord erts_atomic32_t;
#if __GNUC__ > 2
typedef struct { } erts_spinlock_t;
typedef struct { } erts_rwlock_t;
@@ -160,10 +175,6 @@ typedef struct { } erts_rwlock_t;
typedef struct { int gcc_is_buggy; } erts_spinlock_t;
typedef struct { int gcc_is_buggy; } erts_rwlock_t;
#endif
-typedef struct {
- long tv_sec;
- long tv_nsec;
-} erts_thr_timeval_t;
#define ERTS_MTX_INITER 0
#define ERTS_CND_INITER 0
@@ -173,6 +184,11 @@ typedef struct {
#endif /* #ifdef USE_THREADS */
+#define ERTS_AINT_T_MAX (~(((erts_aint_t) 1) << (sizeof(erts_aint_t)*8-1)))
+#define ERTS_AINT_T_MIN ((((erts_aint_t) 1) << (sizeof(erts_aint_t)*8-1)))
+#define ERTS_AINT32_T_MAX (~(((erts_aint32_t) 1) << (sizeof(erts_aint32_t)*8-1)))
+#define ERTS_AINT32_T_MIN ((((erts_aint32_t) 1) << (sizeof(erts_aint32_t)*8-1)))
+
ERTS_GLB_INLINE void erts_thr_init(erts_thr_init_data_t *id);
ERTS_GLB_INLINE void erts_thr_late_init(erts_thr_late_init_data_t *id);
ERTS_GLB_INLINE void erts_thr_create(erts_tid_t *tid, void * (*func)(void *),
@@ -231,33 +247,65 @@ ERTS_GLB_INLINE int erts_rwmtx_tryrwlock(erts_rwmtx_t *rwmtx);
ERTS_GLB_INLINE void erts_rwmtx_rwunlock(erts_rwmtx_t *rwmtx);
ERTS_GLB_INLINE int erts_lc_rwmtx_is_rlocked(erts_rwmtx_t *mtx);
ERTS_GLB_INLINE int erts_lc_rwmtx_is_rwlocked(erts_rwmtx_t *mtx);
-ERTS_GLB_INLINE void erts_atomic_init(erts_atomic_t *var, long i);
-ERTS_GLB_INLINE void erts_atomic_set(erts_atomic_t *var, long i);
-ERTS_GLB_INLINE long erts_atomic_read(erts_atomic_t *var);
-ERTS_GLB_INLINE long erts_atomic_inctest(erts_atomic_t *incp);
-ERTS_GLB_INLINE long erts_atomic_dectest(erts_atomic_t *decp);
+ERTS_GLB_INLINE void erts_atomic_init(erts_atomic_t *var, erts_aint_t i);
+ERTS_GLB_INLINE void erts_atomic_set(erts_atomic_t *var, erts_aint_t i);
+ERTS_GLB_INLINE erts_aint_t erts_atomic_read(erts_atomic_t *var);
+ERTS_GLB_INLINE erts_aint_t erts_atomic_inctest(erts_atomic_t *incp);
+ERTS_GLB_INLINE erts_aint_t erts_atomic_dectest(erts_atomic_t *decp);
ERTS_GLB_INLINE void erts_atomic_inc(erts_atomic_t *incp);
ERTS_GLB_INLINE void erts_atomic_dec(erts_atomic_t *decp);
-ERTS_GLB_INLINE long erts_atomic_addtest(erts_atomic_t *addp,
- long i);
-ERTS_GLB_INLINE void erts_atomic_add(erts_atomic_t *addp, long i);
-ERTS_GLB_INLINE long erts_atomic_xchg(erts_atomic_t *xchgp,
- long new);
-ERTS_GLB_INLINE long erts_atomic_cmpxchg(erts_atomic_t *xchgp,
- long new,
- long expected);
-ERTS_GLB_INLINE long erts_atomic_bor(erts_atomic_t *var, long mask);
-ERTS_GLB_INLINE long erts_atomic_band(erts_atomic_t *var, long mask);
-ERTS_GLB_INLINE long erts_atomic_read_acqb(erts_atomic_t *var);
-ERTS_GLB_INLINE void erts_atomic_set_relb(erts_atomic_t *var, long i);
+ERTS_GLB_INLINE erts_aint_t erts_atomic_addtest(erts_atomic_t *addp,
+ erts_aint_t i);
+ERTS_GLB_INLINE void erts_atomic_add(erts_atomic_t *addp, erts_aint_t i);
+ERTS_GLB_INLINE erts_aint_t erts_atomic_xchg(erts_atomic_t *xchgp,
+ erts_aint_t new);
+ERTS_GLB_INLINE erts_aint_t erts_atomic_cmpxchg(erts_atomic_t *xchgp,
+ erts_aint_t new,
+ erts_aint_t expected);
+ERTS_GLB_INLINE erts_aint_t erts_atomic_bor(erts_atomic_t *var,
+ erts_aint_t mask);
+ERTS_GLB_INLINE erts_aint_t erts_atomic_band(erts_atomic_t *var,
+ erts_aint_t mask);
+ERTS_GLB_INLINE erts_aint_t erts_atomic_read_acqb(erts_atomic_t *var);
+ERTS_GLB_INLINE void erts_atomic_set_relb(erts_atomic_t *var, erts_aint_t i);
ERTS_GLB_INLINE void erts_atomic_dec_relb(erts_atomic_t *decp);
-ERTS_GLB_INLINE long erts_atomic_dectest_relb(erts_atomic_t *decp);
-ERTS_GLB_INLINE long erts_atomic_cmpxchg_acqb(erts_atomic_t *xchgp,
- long new,
- long exp);
-ERTS_GLB_INLINE long erts_atomic_cmpxchg_relb(erts_atomic_t *xchgp,
- long new,
- long exp);
+ERTS_GLB_INLINE erts_aint_t erts_atomic_dectest_relb(erts_atomic_t *decp);
+ERTS_GLB_INLINE erts_aint_t erts_atomic_cmpxchg_acqb(erts_atomic_t *xchgp,
+ erts_aint_t new,
+ erts_aint_t exp);
+ERTS_GLB_INLINE erts_aint_t erts_atomic_cmpxchg_relb(erts_atomic_t *xchgp,
+ erts_aint_t new,
+ erts_aint_t exp);
+ERTS_GLB_INLINE void erts_atomic32_init(erts_atomic32_t *var, erts_aint32_t i);
+ERTS_GLB_INLINE void erts_atomic32_set(erts_atomic32_t *var, erts_aint32_t i);
+ERTS_GLB_INLINE erts_aint32_t erts_atomic32_read(erts_atomic32_t *var);
+ERTS_GLB_INLINE erts_aint32_t erts_atomic32_inctest(erts_atomic32_t *incp);
+ERTS_GLB_INLINE erts_aint32_t erts_atomic32_dectest(erts_atomic32_t *decp);
+ERTS_GLB_INLINE void erts_atomic32_inc(erts_atomic32_t *incp);
+ERTS_GLB_INLINE void erts_atomic32_dec(erts_atomic32_t *decp);
+ERTS_GLB_INLINE erts_aint32_t erts_atomic32_addtest(erts_atomic32_t *addp,
+ erts_aint32_t i);
+ERTS_GLB_INLINE void erts_atomic32_add(erts_atomic32_t *addp, erts_aint32_t i);
+ERTS_GLB_INLINE erts_aint32_t erts_atomic32_xchg(erts_atomic32_t *xchgp,
+ erts_aint32_t new);
+ERTS_GLB_INLINE erts_aint32_t erts_atomic32_cmpxchg(erts_atomic32_t *xchgp,
+ erts_aint32_t new,
+ erts_aint32_t expected);
+ERTS_GLB_INLINE erts_aint32_t erts_atomic32_bor(erts_atomic32_t *var,
+ erts_aint32_t mask);
+ERTS_GLB_INLINE erts_aint32_t erts_atomic32_band(erts_atomic32_t *var,
+ erts_aint32_t mask);
+ERTS_GLB_INLINE erts_aint32_t erts_atomic32_read_acqb(erts_atomic32_t *var);
+ERTS_GLB_INLINE void erts_atomic32_set_relb(erts_atomic32_t *var,
+ erts_aint32_t i);
+ERTS_GLB_INLINE void erts_atomic32_dec_relb(erts_atomic32_t *decp);
+ERTS_GLB_INLINE erts_aint32_t erts_atomic32_dectest_relb(erts_atomic32_t *decp);
+ERTS_GLB_INLINE erts_aint32_t erts_atomic32_cmpxchg_acqb(erts_atomic32_t *xchgp,
+ erts_aint32_t new,
+ erts_aint32_t exp);
+ERTS_GLB_INLINE erts_aint32_t erts_atomic32_cmpxchg_relb(erts_atomic32_t *xchgp,
+ erts_aint32_t new,
+ erts_aint32_t exp);
ERTS_GLB_INLINE void erts_spinlock_init_x_opt(erts_spinlock_t *lock,
char *name,
Eterm extra,
@@ -292,7 +340,6 @@ ERTS_GLB_INLINE void erts_write_lock(erts_rwlock_t *lock);
ERTS_GLB_INLINE void erts_write_unlock(erts_rwlock_t *lock);
ERTS_GLB_INLINE int erts_lc_rwlock_is_rlocked(erts_rwlock_t *lock);
ERTS_GLB_INLINE int erts_lc_rwlock_is_rwlocked(erts_rwlock_t *lock);
-ERTS_GLB_INLINE void erts_thr_time_now(erts_thr_timeval_t *time);
ERTS_GLB_INLINE void erts_tsd_key_create(erts_tsd_key_t *keyp);
ERTS_GLB_INLINE void erts_tsd_key_delete(erts_tsd_key_t key);
ERTS_GLB_INLINE void erts_tsd_set(erts_tsd_key_t key, void *value);
@@ -517,8 +564,16 @@ erts_mtx_destroy(erts_mtx_t *mtx)
erts_lcnt_destroy_lock(&mtx->lcnt);
#endif
res = ethr_mutex_destroy(&mtx->mtx);
- if (res)
+ if (res != 0) {
+#ifdef ERTS_THR_HAVE_BUSY_DESTROY_BUG
+ if (res == EBUSY) {
+ char *warn = "Ignoring busy mutex destroy. "
+ "Most likely a bug in pthread implementation.";
+ erts_send_warning_to_logger_str_nogl(warn);
+ }
+#endif
erts_thr_fatal_error(res, "destroy mutex");
+ }
#endif
}
@@ -613,8 +668,16 @@ erts_cnd_destroy(erts_cnd_t *cnd)
{
#ifdef USE_THREADS
int res = ethr_cond_destroy(cnd);
- if (res)
+ if (res != 0) {
+#ifdef ERTS_THR_HAVE_BUSY_DESTROY_BUG
+ if (res == EBUSY) {
+ char *warn = "Ignoring busy cond destroy. "
+ "Most likely a bug in pthread implementation.";
+ erts_send_warning_to_logger_str_nogl(warn);
+ }
+#endif
erts_thr_fatal_error(res, "destroy condition variable");
+ }
#endif
}
@@ -740,8 +803,16 @@ erts_rwmtx_destroy(erts_rwmtx_t *rwmtx)
erts_lcnt_destroy_lock(&rwmtx->lcnt);
#endif
res = ethr_rwmutex_destroy(&rwmtx->rwmtx);
- if (res != 0)
+ if (res != 0) {
+#ifdef ERTS_THR_HAVE_BUSY_DESTROY_BUG
+ if (res == EBUSY) {
+ char *warn = "Ignoring busy rwmutex destroy. "
+ "Most likely a bug in pthread implementation.";
+ erts_send_warning_to_logger_str_nogl(warn);
+ }
+#endif
erts_thr_fatal_error(res, "destroy rwmutex");
+ }
#endif
}
@@ -925,7 +996,7 @@ erts_lc_rwmtx_is_rwlocked(erts_rwmtx_t *mtx)
}
ERTS_GLB_INLINE void
-erts_atomic_init(erts_atomic_t *var, long i)
+erts_atomic_init(erts_atomic_t *var, erts_aint_t i)
{
#ifdef USE_THREADS
ethr_atomic_init(var, i);
@@ -935,7 +1006,7 @@ erts_atomic_init(erts_atomic_t *var, long i)
}
ERTS_GLB_INLINE void
-erts_atomic_set(erts_atomic_t *var, long i)
+erts_atomic_set(erts_atomic_t *var, erts_aint_t i)
{
#ifdef USE_THREADS
ethr_atomic_set(var, i);
@@ -944,7 +1015,7 @@ erts_atomic_set(erts_atomic_t *var, long i)
#endif
}
-ERTS_GLB_INLINE long
+ERTS_GLB_INLINE erts_aint_t
erts_atomic_read(erts_atomic_t *var)
{
#ifdef USE_THREADS
@@ -954,7 +1025,7 @@ erts_atomic_read(erts_atomic_t *var)
#endif
}
-ERTS_GLB_INLINE long
+ERTS_GLB_INLINE erts_aint_t
erts_atomic_inctest(erts_atomic_t *incp)
{
#ifdef USE_THREADS
@@ -964,7 +1035,7 @@ erts_atomic_inctest(erts_atomic_t *incp)
#endif
}
-ERTS_GLB_INLINE long
+ERTS_GLB_INLINE erts_aint_t
erts_atomic_dectest(erts_atomic_t *decp)
{
#ifdef USE_THREADS
@@ -994,8 +1065,8 @@ erts_atomic_dec(erts_atomic_t *decp)
#endif
}
-ERTS_GLB_INLINE long
-erts_atomic_addtest(erts_atomic_t *addp, long i)
+ERTS_GLB_INLINE erts_aint_t
+erts_atomic_addtest(erts_atomic_t *addp, erts_aint_t i)
{
#ifdef USE_THREADS
return ethr_atomic_add_read(addp, i);
@@ -1005,7 +1076,7 @@ erts_atomic_addtest(erts_atomic_t *addp, long i)
}
ERTS_GLB_INLINE void
-erts_atomic_add(erts_atomic_t *addp, long i)
+erts_atomic_add(erts_atomic_t *addp, erts_aint_t i)
{
#ifdef USE_THREADS
ethr_atomic_add(addp, i);
@@ -1014,59 +1085,58 @@ erts_atomic_add(erts_atomic_t *addp, long i)
#endif
}
-ERTS_GLB_INLINE long
-erts_atomic_xchg(erts_atomic_t *xchgp, long new)
+ERTS_GLB_INLINE erts_aint_t
+erts_atomic_xchg(erts_atomic_t *xchgp, erts_aint_t new)
{
- long old;
#ifdef USE_THREADS
return ethr_atomic_xchg(xchgp, new);
#else
- old = *xchgp;
+ erts_aint_t old = *xchgp;
*xchgp = new;
-#endif
return old;
+#endif
}
-ERTS_GLB_INLINE long
-erts_atomic_cmpxchg(erts_atomic_t *xchgp, long new, long expected)
+ERTS_GLB_INLINE erts_aint_t
+erts_atomic_cmpxchg(erts_atomic_t *xchgp, erts_aint_t new, erts_aint_t expected)
{
#ifdef USE_THREADS
return ethr_atomic_cmpxchg(xchgp, new, expected);
#else
- long old = *xchgp;
+ erts_aint_t old = *xchgp;
if (old == expected)
*xchgp = new;
return old;
#endif
}
-ERTS_GLB_INLINE long
-erts_atomic_bor(erts_atomic_t *var, long mask)
+ERTS_GLB_INLINE erts_aint_t
+erts_atomic_bor(erts_atomic_t *var, erts_aint_t mask)
{
#ifdef USE_THREADS
return ethr_atomic_read_bor(var, mask);
#else
- long old;
+ erts_aint_t old;
old = *var;
*var |= mask;
return old;
#endif
}
-ERTS_GLB_INLINE long
-erts_atomic_band(erts_atomic_t *var, long mask)
+ERTS_GLB_INLINE erts_aint_t
+erts_atomic_band(erts_atomic_t *var, erts_aint_t mask)
{
#ifdef USE_THREADS
return ethr_atomic_read_band(var, mask);
#else
- long old;
+ erts_aint_t old;
old = *var;
*var &= mask;
return old;
#endif
}
-ERTS_GLB_INLINE long
+ERTS_GLB_INLINE erts_aint_t
erts_atomic_read_acqb(erts_atomic_t *var)
{
#ifdef USE_THREADS
@@ -1077,7 +1147,7 @@ erts_atomic_read_acqb(erts_atomic_t *var)
}
ERTS_GLB_INLINE void
-erts_atomic_set_relb(erts_atomic_t *var, long i)
+erts_atomic_set_relb(erts_atomic_t *var, erts_aint_t i)
{
#ifdef USE_THREADS
ethr_atomic_set_relb(var, i);
@@ -1096,7 +1166,7 @@ erts_atomic_dec_relb(erts_atomic_t *decp)
#endif
}
-ERTS_GLB_INLINE long
+ERTS_GLB_INLINE erts_aint_t
erts_atomic_dectest_relb(erts_atomic_t *decp)
{
#ifdef USE_THREADS
@@ -1106,28 +1176,243 @@ erts_atomic_dectest_relb(erts_atomic_t *decp)
#endif
}
-ERTS_GLB_INLINE long erts_atomic_cmpxchg_acqb(erts_atomic_t *xchgp,
- long new,
- long exp)
+ERTS_GLB_INLINE erts_aint_t erts_atomic_cmpxchg_acqb(erts_atomic_t *xchgp,
+ erts_aint_t new,
+ erts_aint_t exp)
{
#ifdef USE_THREADS
return ethr_atomic_cmpxchg_acqb(xchgp, new, exp);
#else
- long old = *xchgp;
+ erts_aint_t old = *xchgp;
if (old == exp)
*xchgp = new;
return old;
#endif
}
-ERTS_GLB_INLINE long erts_atomic_cmpxchg_relb(erts_atomic_t *xchgp,
- long new,
- long exp)
+ERTS_GLB_INLINE erts_aint_t erts_atomic_cmpxchg_relb(erts_atomic_t *xchgp,
+ erts_aint_t new,
+ erts_aint_t exp)
{
#ifdef USE_THREADS
return ethr_atomic_cmpxchg_relb(xchgp, new, exp);
#else
- long old = *xchgp;
+ erts_aint_t old = *xchgp;
+ if (old == exp)
+ *xchgp = new;
+ return old;
+#endif
+}
+
+/* atomic32 */
+
+ERTS_GLB_INLINE void
+erts_atomic32_init(erts_atomic32_t *var, erts_aint32_t i)
+{
+#ifdef USE_THREADS
+ ethr_atomic32_init(var, i);
+#else
+ *var = i;
+#endif
+}
+
+ERTS_GLB_INLINE void
+erts_atomic32_set(erts_atomic32_t *var, erts_aint32_t i)
+{
+#ifdef USE_THREADS
+ ethr_atomic32_set(var, i);
+#else
+ *var = i;
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_atomic32_read(erts_atomic32_t *var)
+{
+#ifdef USE_THREADS
+ return ethr_atomic32_read(var);
+#else
+ return *var;
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_atomic32_inctest(erts_atomic32_t *incp)
+{
+#ifdef USE_THREADS
+ return ethr_atomic32_inc_read(incp);
+#else
+ return ++(*incp);
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_atomic32_dectest(erts_atomic32_t *decp)
+{
+#ifdef USE_THREADS
+ return ethr_atomic32_dec_read(decp);
+#else
+ return --(*decp);
+#endif
+}
+
+ERTS_GLB_INLINE void
+erts_atomic32_inc(erts_atomic32_t *incp)
+{
+#ifdef USE_THREADS
+ ethr_atomic32_inc(incp);
+#else
+ ++(*incp);
+#endif
+}
+
+ERTS_GLB_INLINE void
+erts_atomic32_dec(erts_atomic32_t *decp)
+{
+#ifdef USE_THREADS
+ ethr_atomic32_dec(decp);
+#else
+ --(*decp);
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_atomic32_addtest(erts_atomic32_t *addp, erts_aint32_t i)
+{
+#ifdef USE_THREADS
+ return ethr_atomic32_add_read(addp, i);
+#else
+ return *addp += i;
+#endif
+}
+
+ERTS_GLB_INLINE void
+erts_atomic32_add(erts_atomic32_t *addp, erts_aint32_t i)
+{
+#ifdef USE_THREADS
+ ethr_atomic32_add(addp, i);
+#else
+ *addp += i;
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_atomic32_xchg(erts_atomic32_t *xchgp, erts_aint32_t new)
+{
+#ifdef USE_THREADS
+ return ethr_atomic32_xchg(xchgp, new);
+#else
+ erts_aint32_t old = *xchgp;
+ *xchgp = new;
+ return old;
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_atomic32_cmpxchg(erts_atomic32_t *xchgp,
+ erts_aint32_t new,
+ erts_aint32_t expected)
+{
+#ifdef USE_THREADS
+ return ethr_atomic32_cmpxchg(xchgp, new, expected);
+#else
+ erts_aint32_t old = *xchgp;
+ if (old == expected)
+ *xchgp = new;
+ return old;
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_atomic32_bor(erts_atomic32_t *var, erts_aint32_t mask)
+{
+#ifdef USE_THREADS
+ return ethr_atomic32_read_bor(var, mask);
+#else
+ erts_aint32_t old;
+ old = *var;
+ *var |= mask;
+ return old;
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_atomic32_band(erts_atomic32_t *var, erts_aint32_t mask)
+{
+#ifdef USE_THREADS
+ return ethr_atomic32_read_band(var, mask);
+#else
+ erts_aint32_t old;
+ old = *var;
+ *var &= mask;
+ return old;
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_atomic32_read_acqb(erts_atomic32_t *var)
+{
+#ifdef USE_THREADS
+ return ethr_atomic32_read_acqb(var);
+#else
+ return *var;
+#endif
+}
+
+ERTS_GLB_INLINE void
+erts_atomic32_set_relb(erts_atomic32_t *var, erts_aint32_t i)
+{
+#ifdef USE_THREADS
+ ethr_atomic32_set_relb(var, i);
+#else
+ *var = i;
+#endif
+}
+
+ERTS_GLB_INLINE void
+erts_atomic32_dec_relb(erts_atomic32_t *decp)
+{
+#ifdef USE_THREADS
+ ethr_atomic32_dec_relb(decp);
+#else
+ --(*decp);
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_atomic32_dectest_relb(erts_atomic32_t *decp)
+{
+#ifdef USE_THREADS
+ return ethr_atomic32_dec_read_relb(decp);
+#else
+ return --(*decp);
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_atomic32_cmpxchg_acqb(erts_atomic32_t *xchgp,
+ erts_aint32_t new,
+ erts_aint32_t exp)
+{
+#ifdef USE_THREADS
+ return ethr_atomic32_cmpxchg_acqb(xchgp, new, exp);
+#else
+ erts_aint32_t old = *xchgp;
+ if (old == exp)
+ *xchgp = new;
+ return old;
+#endif
+}
+
+ERTS_GLB_INLINE erts_aint32_t
+erts_atomic32_cmpxchg_relb(erts_atomic32_t *xchgp,
+ erts_aint32_t new,
+ erts_aint32_t exp)
+{
+#ifdef USE_THREADS
+ return ethr_atomic32_cmpxchg_relb(xchgp, new, exp);
+#else
+ erts_aint32_t old = *xchgp;
if (old == exp)
*xchgp = new;
return old;
@@ -1204,8 +1489,16 @@ erts_spinlock_destroy(erts_spinlock_t *lock)
erts_lcnt_destroy_lock(&lock->lcnt);
#endif
res = ethr_spinlock_destroy(&lock->slck);
- if (res)
- erts_thr_fatal_error(res, "destroy spinlock");
+ if (res != 0) {
+#ifdef ERTS_THR_HAVE_BUSY_DESTROY_BUG
+ if (res == EBUSY) {
+ char *warn = "Ignoring busy spinlock destroy. "
+ "Most likely a bug in pthread implementation.";
+ erts_send_warning_to_logger_str_nogl(warn);
+ }
+#endif
+ erts_thr_fatal_error(res, "destroy rwlock");
+ }
#else
(void)lock;
#endif
@@ -1314,8 +1607,16 @@ erts_rwlock_destroy(erts_rwlock_t *lock)
erts_lcnt_destroy_lock(&lock->lcnt);
#endif
res = ethr_rwlock_destroy(&lock->rwlck);
- if (res)
+ if (res != 0) {
+#ifdef ERTS_THR_HAVE_BUSY_DESTROY_BUG
+ if (res == EBUSY) {
+ char *warn = "Ignoring busy rwlock destroy. "
+ "Most likely a bug in pthread implementation.";
+ erts_send_warning_to_logger_str_nogl(warn);
+ }
+#endif
erts_thr_fatal_error(res, "destroy rwlock");
+ }
#else
(void)lock;
#endif
@@ -1428,16 +1729,6 @@ erts_lc_rwlock_is_rwlocked(erts_rwlock_t *lock)
}
ERTS_GLB_INLINE void
-erts_thr_time_now(erts_thr_timeval_t *time)
-{
-#ifdef USE_THREADS
- int res = ethr_time_now(time);
- if (res)
- erts_thr_fatal_error(res, "get current time");
-#endif
-}
-
-ERTS_GLB_INLINE void
erts_tsd_key_create(erts_tsd_key_t *keyp)
{
#ifdef USE_THREADS
diff --git a/erts/emulator/beam/erl_time.h b/erts/emulator/beam/erl_time.h
index 6f6b971d34..d0ad73cd81 100644
--- a/erts/emulator/beam/erl_time.h
+++ b/erts/emulator/beam/erl_time.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2006-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2006-2011. 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
@@ -20,11 +20,15 @@
#ifndef ERL_TIME_H__
#define ERL_TIME_H__
+extern erts_smp_atomic_t do_time; /* set at clock interrupt */
+extern SysTimeval erts_first_emu_time;
+
/*
** Timer entry:
*/
typedef struct erl_timer {
struct erl_timer* next; /* next entry tiw slot or chain */
+ struct erl_timer* prev; /* prev entry tiw slot or chain */
Uint slot; /* slot in timer wheel */
Uint count; /* number of loops remaining */
int active; /* 1=activated, 0=deactivated */
@@ -39,7 +43,6 @@ typedef void (*ErlTimeoutProc)(void*);
typedef void (*ErlCancelProc)(void*);
#ifdef ERTS_SMP
-
/*
* Process and port timer
*/
@@ -61,7 +64,66 @@ void erts_create_smp_ptimer(ErtsSmpPTimer **timer_ref,
ErlTimeoutProc timeout_func,
Uint timeout);
void erts_cancel_smp_ptimer(ErtsSmpPTimer *ptimer);
+#endif
+
+/* timer-wheel api */
+void erts_init_time(void);
+void erts_set_timer(ErlTimer*, ErlTimeoutProc, ErlCancelProc, void*, Uint);
+void erts_cancel_timer(ErlTimer*);
+void erts_bump_timer(erts_aint_t);
+Uint erts_timer_wheel_memory_size(void);
+Uint erts_time_left(ErlTimer *);
+erts_aint_t erts_next_time(void);
+
+#ifdef DEBUG
+void erts_p_slpq(void);
#endif
+ERTS_GLB_INLINE erts_aint_t erts_do_time_read_and_reset(void);
+ERTS_GLB_INLINE void erts_do_time_add(long);
+
+#if ERTS_GLB_INLINE_INCL_FUNC_DEF
+
+ERTS_GLB_INLINE erts_aint_t erts_do_time_read_and_reset(void) { return erts_smp_atomic_xchg(&do_time, 0L); }
+ERTS_GLB_INLINE void erts_do_time_add(long elapsed) { erts_smp_atomic_add(&do_time, elapsed); }
+
+#endif /* #if ERTS_GLB_INLINE_INCL_FUNC_DEF */
+
+
+/* time_sup */
+
+#if (defined(HAVE_GETHRVTIME) || defined(HAVE_CLOCK_GETTIME))
+# ifndef HAVE_ERTS_NOW_CPU
+# define HAVE_ERTS_NOW_CPU
+# ifdef HAVE_GETHRVTIME
+# define erts_start_now_cpu() sys_start_hrvtime()
+# define erts_stop_now_cpu() sys_stop_hrvtime()
+# endif
+# endif
+void erts_get_now_cpu(Uint* megasec, Uint* sec, Uint* microsec);
#endif
+
+void erts_get_timeval(SysTimeval *tv);
+long erts_get_time(void);
+void erts_get_emu_time(SysTimeval *);
+
+ERTS_GLB_INLINE int erts_cmp_timeval(SysTimeval *t1p, SysTimeval *t2p);
+
+#if ERTS_GLB_INLINE_INCL_FUNC_DEF
+
+ERTS_GLB_INLINE int
+erts_cmp_timeval(SysTimeval *t1p, SysTimeval *t2p)
+{
+ if (t1p->tv_sec == t2p->tv_sec) {
+ if (t1p->tv_usec < t2p->tv_usec)
+ return -1;
+ else if (t1p->tv_usec > t2p->tv_usec)
+ return 1;
+ return 0;
+ }
+ return t1p->tv_sec < t2p->tv_sec ? -1 : 1;
+}
+
+#endif /* #if ERTS_GLB_INLINE_INCL_FUNC_DEF */
+#endif /* ERL_TIME_H__ */
diff --git a/erts/emulator/beam/erl_time_sup.c b/erts/emulator/beam/erl_time_sup.c
index 7b8706ea13..ca4b54188e 100644
--- a/erts/emulator/beam/erl_time_sup.c
+++ b/erts/emulator/beam/erl_time_sup.c
@@ -358,10 +358,6 @@ static int clock_resolution;
** instead of something like select.
*/
-#if defined(ERTS_TIMER_THREAD)
-static ERTS_INLINE void init_erts_deliver_time(const SysTimeval *inittv) { }
-static ERTS_INLINE void do_erts_deliver_time(const SysTimeval *current) { }
-#else
static SysTimeval last_delivered;
static void init_erts_deliver_time(const SysTimeval *inittv)
@@ -389,11 +385,10 @@ static void do_erts_deliver_time(const SysTimeval *current)
this by simply pretend as if the time stood still. :) */
if (elapsed > 0) {
- do_time_add(elapsed);
+ erts_do_time_add(elapsed);
last_delivered = cur_time;
}
}
-#endif
int
erts_init_time_sup(void)
@@ -786,7 +781,6 @@ get_sys_now(Uint* megasec, Uint* sec, Uint* microsec)
to a struct timeval representing current time (to save
a gettimeofday() where possible) or NULL */
-#if !defined(ERTS_TIMER_THREAD)
void erts_deliver_time(void) {
SysTimeval now;
@@ -797,7 +791,6 @@ void erts_deliver_time(void) {
erts_smp_mtx_unlock(&erts_timeofday_mtx);
}
-#endif
/* get *real* time (not ticks) remaining until next timeout - if there
isn't one, give a "long" time, that is guaranteed
@@ -806,14 +799,12 @@ void erts_deliver_time(void) {
void erts_time_remaining(SysTimeval *rem_time)
{
int ticks;
-#if !defined(ERTS_TIMER_THREAD)
SysTimeval cur_time;
-#endif
long elapsed;
- /* next_time() returns no of ticks to next timeout or -1 if none */
+ /* erts_next_time() returns no of ticks to next timeout or -1 if none */
- if ((ticks = next_time()) == -1) {
+ if ((ticks = erts_next_time()) == -1) {
/* timer queue empty */
/* this will cause at most 100000000 ticks */
rem_time->tv_sec = 100000;
@@ -822,9 +813,6 @@ void erts_time_remaining(SysTimeval *rem_time)
/* next timeout after ticks ticks */
ticks *= CLOCK_RESOLUTION;
-#if defined(ERTS_TIMER_THREAD)
- elapsed = 0;
-#else
erts_smp_mtx_lock(&erts_timeofday_mtx);
get_tolerant_timeofday(&cur_time);
@@ -839,7 +827,6 @@ void erts_time_remaining(SysTimeval *rem_time)
rem_time->tv_sec = rem_time->tv_usec = 0;
return;
}
-#endif
rem_time->tv_sec = (ticks - elapsed) / 1000;
rem_time->tv_usec = 1000 * ((ticks - elapsed) % 1000);
}
diff --git a/erts/emulator/beam/erl_trace.c b/erts/emulator/beam/erl_trace.c
index 3043bb1e8c..c0397ca6c3 100644
--- a/erts/emulator/beam/erl_trace.c
+++ b/erts/emulator/beam/erl_trace.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1999-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1999-2011. 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
@@ -1668,7 +1668,7 @@ erts_call_trace(Process* p, BeamInstr mfa[3], Binary *match_spec,
return_flags = 0;
if (match_spec) {
pam_result = erts_match_set_run(p, match_spec, args, arity,
- &return_flags);
+ ERTS_PAM_TMP_RESULT, &return_flags);
if (is_non_value(pam_result)) {
erts_match_set_release_result(p);
#if !HEAP_ON_C_STACK
@@ -1815,7 +1815,7 @@ erts_call_trace(Process* p, BeamInstr mfa[3], Binary *match_spec,
return_flags = 0;
if (match_spec) {
pam_result = erts_match_set_run(p, match_spec, args, arity,
- &return_flags);
+ ERTS_PAM_TMP_RESULT, &return_flags);
if (is_non_value(pam_result)) {
erts_match_set_release_result(p);
UnUseTmpHeap(ERL_SUB_BIN_SIZE,p);
diff --git a/erts/emulator/beam/erl_unicode.c b/erts/emulator/beam/erl_unicode.c
index 72207df621..dacf228e92 100644
--- a/erts/emulator/beam/erl_unicode.c
+++ b/erts/emulator/beam/erl_unicode.c
@@ -902,7 +902,6 @@ static BIF_RETTYPE build_utf8_return(Process *p,Eterm bin,int pos,
static BIF_RETTYPE characters_to_utf8_trap(BIF_ALIST_3)
{
Eterm *real_bin;
- Sint need;
byte* bytes;
Eterm rest_term;
int left, sleft;
@@ -918,7 +917,6 @@ static BIF_RETTYPE characters_to_utf8_trap(BIF_ALIST_3)
ASSERT(is_binary(BIF_ARG_1));
real_bin = binary_val(BIF_ARG_1);
ASSERT(*real_bin == HEADER_PROC_BIN);
- need = ((ProcBin *) real_bin)->val->orig_size;
pos = (int) binary_size(BIF_ARG_1);
bytes = binary_bytes(BIF_ARG_1);
sleft = left = allowed_iterations(BIF_P);
@@ -2420,7 +2418,7 @@ void erts_copy_utf8_to_utf16_little(byte *target, byte *bytes, int num_chars)
/*
* This internal bif converts a filename to whatever format is suitable for the file driver
- * It also adds zero termination so that prim_file neednt bother with the character encoding
+ * It also adds zero termination so that prim_file needn't bother with the character encoding
* of the file driver
*/
BIF_RETTYPE prim_file_internal_name2native_1(BIF_ALIST_1)
diff --git a/erts/emulator/beam/erl_vm.h b/erts/emulator/beam/erl_vm.h
index 48fa99934e..e7fd144ec3 100644
--- a/erts/emulator/beam/erl_vm.h
+++ b/erts/emulator/beam/erl_vm.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -47,7 +47,7 @@
#define SEQ_TRACE 1
#define CONTEXT_REDS 2000 /* Swap process out after this number */
-#define MAX_ARG 256 /* Max number of arguments allowed */
+#define MAX_ARG 255 /* Max number of arguments allowed */
#define MAX_REG 1024 /* Max number of x(N) registers used */
/* Scheduler stores data for temporary heaps if
@@ -120,14 +120,15 @@
* Allocate heap memory, first on the ordinary heap;
* failing that, in a heap fragment.
*/
-#define HAlloc(p, sz) \
+#define HAllocX(p, sz, xtra) \
(ASSERT_EXPR((sz) >= 0), \
ErtsHAllocLockCheck(p), \
(IS_FORCE_HEAP_FRAGS || (((HEAP_LIMIT(p) - HEAP_TOP(p)) < (sz))) \
- ? erts_heap_alloc((p),(sz)) \
+ ? erts_heap_alloc((p),(sz),(xtra)) \
: (INIT_HEAP_MEM(p,sz), \
HEAP_TOP(p) = HEAP_TOP(p) + (sz), HEAP_TOP(p) - (sz))))
+#define HAlloc(P, SZ) HAllocX(P,SZ,0)
#define HRelease(p, endp, ptr) \
if ((ptr) == (endp)) { \
diff --git a/erts/emulator/beam/external.c b/erts/emulator/beam/external.c
index 328aa2be6a..1a102f7187 100644
--- a/erts/emulator/beam/external.c
+++ b/erts/emulator/beam/external.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -1264,7 +1264,7 @@ external_size_1(Process* p, Eterm Term)
Eterm
erts_term_to_binary(Process* p, Eterm Term, int level, Uint flags)
{
- int size;
+ Uint size;
Eterm bin;
size_t real_size;
byte* endp;
diff --git a/erts/emulator/beam/global.h b/erts/emulator/beam/global.h
index 524db2a2eb..96da894d90 100644
--- a/erts/emulator/beam/global.h
+++ b/erts/emulator/beam/global.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -544,7 +544,7 @@ ERTS_GLB_INLINE void erts_may_save_closed_port(Port *prt)
if (prt->snapshot != erts_smp_atomic_read(&erts_ports_snapshot)) {
/* Dead ports are added from the end of the snapshot buffer */
Eterm* tombstone = (Eterm*) erts_smp_atomic_addtest(&erts_dead_ports_ptr,
- -(long)sizeof(Eterm));
+ -(erts_aint_t)sizeof(Eterm));
ASSERT(tombstone+1 != NULL);
ASSERT(prt->snapshot == (Uint32) erts_smp_atomic_read(&erts_ports_snapshot) - 1);
*tombstone = prt->id;
@@ -563,7 +563,7 @@ extern Uint display_items; /* no of items to display in traces etc */
extern Uint display_loads; /* print info about loaded modules */
extern int erts_backtrace_depth;
-extern erts_smp_atomic_t erts_max_gen_gcs;
+extern erts_smp_atomic32_t erts_max_gen_gcs;
extern int erts_disable_tolerant_timeofday;
@@ -834,7 +834,7 @@ do { \
void erts_emasculate_writable_binary(ProcBin* pb);
Eterm erts_new_heap_binary(Process *p, byte *buf, int len, byte** datap);
Eterm erts_new_mso_binary(Process*, byte*, int);
-Eterm new_binary(Process*, byte*, int);
+Eterm new_binary(Process*, byte*, Uint);
Eterm erts_realloc_binary(Eterm bin, size_t size);
/* erl_bif_info.c */
@@ -890,9 +890,31 @@ void erl_error(char*, va_list);
/* copy.c */
void init_copy(void);
Eterm copy_object(Eterm, Process*);
+
+#if HALFWORD_HEAP
+Uint size_object_rel(Eterm, Eterm*);
+# define size_object(A) size_object_rel(A,NULL)
+
+Eterm copy_struct_rel(Eterm, Uint, Eterm**, ErlOffHeap*, Eterm* src_base, Eterm* dst_base);
+# define copy_struct(OBJ,SZ,HPP,OH) copy_struct_rel(OBJ,SZ,HPP,OH, NULL,NULL)
+
+Eterm copy_shallow_rel(Eterm*, Uint, Eterm**, ErlOffHeap*, Eterm* src_base);
+# define copy_shallow(A,B,C,D) copy_shallow_rel(A,B,C,D,NULL)
+
+#else /* !HALFWORD_HEAP */
+
Uint size_object(Eterm);
+# define size_object_rel(A,B) size_object(A)
+
Eterm copy_struct(Eterm, Uint, Eterm**, ErlOffHeap*);
+# define copy_struct_rel(OBJ,SZ,HPP,OH, SB,DB) copy_struct(OBJ,SZ,HPP,OH)
+
Eterm copy_shallow(Eterm*, Uint, Eterm**, ErlOffHeap*);
+# define copy_shallow_rel(A,B,C,D, BASE) copy_shallow(A,B,C,D)
+
+#endif
+
+
void move_multi_frags(Eterm** hpp, ErlOffHeap*, ErlHeapFragment* first,
Eterm* refs, unsigned nrefs);
@@ -1206,7 +1228,7 @@ ERTS_GLB_INLINE void
erts_smp_port_unlock(Port *prt)
{
#ifdef ERTS_SMP
- long refc;
+ erts_aint_t refc;
erts_smp_mtx_unlock(prt->lock);
refc = erts_smp_atomic_dectest(&prt->refc);
ASSERT(refc >= 0);
@@ -1425,84 +1447,6 @@ void erl_drv_thr_init(void);
/* time.c */
-ERTS_GLB_INLINE long do_time_read_and_reset(void);
-#ifdef ERTS_TIMER_THREAD
-ERTS_GLB_INLINE int next_time(void);
-ERTS_GLB_INLINE void bump_timer(long);
-#else
-int next_time(void);
-void bump_timer(long);
-extern erts_smp_atomic_t do_time; /* set at clock interrupt */
-ERTS_GLB_INLINE void do_time_add(long);
-#endif
-
-#if ERTS_GLB_INLINE_INCL_FUNC_DEF
-
-#ifdef ERTS_TIMER_THREAD
-ERTS_GLB_INLINE long do_time_read_and_reset(void) { return 0; }
-ERTS_GLB_INLINE int next_time(void) { return -1; }
-ERTS_GLB_INLINE void bump_timer(long ignore) { }
-#else
-ERTS_GLB_INLINE long do_time_read_and_reset(void)
-{
- return erts_smp_atomic_xchg(&do_time, 0L);
-}
-ERTS_GLB_INLINE void do_time_add(long elapsed)
-{
- erts_smp_atomic_add(&do_time, elapsed);
-}
-#endif
-
-#endif /* #if ERTS_GLB_INLINE_INCL_FUNC_DEF */
-
-void init_time(void);
-void erl_set_timer(ErlTimer*, ErlTimeoutProc, ErlCancelProc, void*, Uint);
-void erl_cancel_timer(ErlTimer*);
-Uint time_left(ErlTimer *);
-
-Uint erts_timer_wheel_memory_size(void);
-
-#if (defined(HAVE_GETHRVTIME) || defined(HAVE_CLOCK_GETTIME))
-# ifndef HAVE_ERTS_NOW_CPU
-# define HAVE_ERTS_NOW_CPU
-# ifdef HAVE_GETHRVTIME
-# define erts_start_now_cpu() sys_start_hrvtime()
-# define erts_stop_now_cpu() sys_stop_hrvtime()
-# endif
-# endif
-void erts_get_now_cpu(Uint* megasec, Uint* sec, Uint* microsec);
-#endif
-
-void erts_get_timeval(SysTimeval *tv);
-long erts_get_time(void);
-
-extern SysTimeval erts_first_emu_time;
-
-void erts_get_emu_time(SysTimeval *);
-
-ERTS_GLB_INLINE int erts_cmp_timeval(SysTimeval *t1p, SysTimeval *t2p);
-
-#if ERTS_GLB_INLINE_INCL_FUNC_DEF
-
-ERTS_GLB_INLINE int
-erts_cmp_timeval(SysTimeval *t1p, SysTimeval *t2p)
-{
- if (t1p->tv_sec == t2p->tv_sec) {
- if (t1p->tv_usec < t2p->tv_usec)
- return -1;
- else if (t1p->tv_usec > t2p->tv_usec)
- return 1;
- return 0;
- }
- return t1p->tv_sec < t2p->tv_sec ? -1 : 1;
-}
-
-#endif
-
-#ifdef DEBUG
-void p_slpq(void);
-#endif
-
/* utils.c */
/*
@@ -1561,16 +1505,30 @@ void erts_init_utils_mem(void);
erts_dsprintf_buf_t *erts_create_tmp_dsbuf(Uint);
void erts_destroy_tmp_dsbuf(erts_dsprintf_buf_t *);
+#if HALFWORD_HEAP
+int eq_rel(Eterm a, Eterm* a_base, Eterm b, Eterm* b_base);
+# define eq(A,B) eq_rel(A,NULL,B,NULL)
+#else
int eq(Eterm, Eterm);
+# define eq_rel(A,A_BASE,B,B_BASE) eq(A,B)
+#endif
+
#define EQ(x,y) (((x) == (y)) || (is_not_both_immed((x),(y)) && eq((x),(y))))
+#if HALFWORD_HEAP
+Sint cmp_rel(Eterm, Eterm*, Eterm, Eterm*);
+#define CMP(A,B) cmp_rel(A,NULL,B,NULL)
+#else
Sint cmp(Eterm, Eterm);
-#define cmp_lt(a,b) (cmp((a),(b)) < 0)
-#define cmp_le(a,b) (cmp((a),(b)) <= 0)
-#define cmp_eq(a,b) (cmp((a),(b)) == 0)
-#define cmp_ne(a,b) (cmp((a),(b)) != 0)
-#define cmp_ge(a,b) (cmp((a),(b)) >= 0)
-#define cmp_gt(a,b) (cmp((a),(b)) > 0)
+#define cmp_rel(A,A_BASE,B,B_BASE) cmp(A,B)
+#define CMP(A,B) cmp(A,B)
+#endif
+#define cmp_lt(a,b) (CMP((a),(b)) < 0)
+#define cmp_le(a,b) (CMP((a),(b)) <= 0)
+#define cmp_eq(a,b) (CMP((a),(b)) == 0)
+#define cmp_ne(a,b) (CMP((a),(b)) != 0)
+#define cmp_ge(a,b) (CMP((a),(b)) >= 0)
+#define cmp_gt(a,b) (CMP((a),(b)) > 0)
#define CMP_LT(a,b) ((a) != (b) && cmp_lt((a),(b)))
#define CMP_GE(a,b) ((a) == (b) || cmp_ge((a),(b)))
@@ -1742,6 +1700,7 @@ Uint erts_current_reductions(Process* current, Process *p);
int erts_print_system_version(int to, void *arg, Process *c_p);
+int erts_hibernate(Process* c_p, Eterm module, Eterm function, Eterm args, Eterm* reg);
#define seq_trace_output(token, msg, type, receiver, process) \
seq_trace_output_generic((token), (msg), (type), (receiver), (process), NIL)
#define seq_trace_output_exit(token, msg, type, receiver, exitfrom) \
@@ -1799,8 +1758,15 @@ do { \
extern Binary *erts_match_set_compile(Process *p, Eterm matchexpr);
Eterm erts_match_set_lint(Process *p, Eterm matchexpr);
extern void erts_match_set_release_result(Process* p);
+
+enum erts_pam_run_flags {
+ ERTS_PAM_TMP_RESULT=0,
+ ERTS_PAM_COPY_RESULT=1,
+ ERTS_PAM_CONTIGUOUS_TUPLE=2
+};
extern Eterm erts_match_set_run(Process *p, Binary *mpsp,
Eterm *args, int num_args,
+ enum erts_pam_run_flags in_flags,
Uint32 *return_flags);
extern Eterm erts_match_set_get_source(Binary *mpsp);
extern void erts_match_prog_foreach_offheap(Binary *b,
@@ -1862,7 +1828,7 @@ erts_alloc_message_heap(Uint size,
#endif
if (size > (Uint) INT_MAX)
- erl_exit(ERTS_ABORT_EXIT, "HUGE size (%bpu)\n", size);
+ erl_exit(ERTS_ABORT_EXIT, "HUGE size (%beu)\n", size);
if (
#if defined(ERTS_SMP)
diff --git a/erts/emulator/beam/io.c b/erts/emulator/beam/io.c
index 9ed92bbe03..f619c6f88b 100644
--- a/erts/emulator/beam/io.c
+++ b/erts/emulator/beam/io.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -428,7 +428,7 @@ setup_port(Port* prt, Eterm pid, erts_driver_t *driver,
old_name = prt->name;
prt->name = new_name;
#ifdef ERTS_SMP
- erts_smp_atomic_set(&prt->run_queue, (long) runq);
+ erts_smp_atomic_set(&prt->run_queue, (erts_aint_t) runq);
#endif
ASSERT(!prt->drv_ptr);
prt->drv_ptr = driver;
@@ -670,7 +670,7 @@ erts_open_driver(erts_driver_t* driver, /* Pointer to driver. */
#ifdef ERTS_SMP
erts_cancel_smp_ptimer(port->ptimer);
#else
- erl_cancel_timer(&(port->tm));
+ erts_cancel_timer(&(port->tm));
#endif
stopq(port);
kill_port(port);
@@ -1226,7 +1226,6 @@ void init_io(void)
{
int i;
ErlDrvEntry** dp;
- ErlDrvEntry* drv;
char maxports[21]; /* enough for any 64-bit integer */
size_t maxportssize = sizeof(maxports);
Uint ports_bits = ERTS_PORTS_BITS;
@@ -1297,7 +1296,7 @@ void init_io(void)
erts_port[i].port_data_lock = NULL;
}
- erts_smp_atomic_init(&erts_ports_snapshot, (long) 0);
+ erts_smp_atomic_init(&erts_ports_snapshot, (erts_aint_t) 0);
last_port_num = 0;
erts_smp_spinlock_init(&get_free_port_lck, "get_free_port");
@@ -1309,10 +1308,8 @@ void init_io(void)
init_driver(&fd_driver, &fd_driver_entry, NULL);
init_driver(&vanilla_driver, &vanilla_driver_entry, NULL);
init_driver(&spawn_driver, &spawn_driver_entry, NULL);
- for (dp = driver_tab; *dp != NULL; dp++) {
- drv = *dp;
+ for (dp = driver_tab; *dp != NULL; dp++)
erts_add_driver_entry(*dp, NULL, 1);
- }
erts_smp_tsd_set(driver_list_lock_status_key, NULL);
erts_smp_mtx_unlock(&erts_driver_list_lock);
@@ -1839,7 +1836,7 @@ terminate_port(Port *prt)
#ifdef ERTS_SMP
erts_cancel_smp_ptimer(prt->ptimer);
#else
- erl_cancel_timer(&prt->tm);
+ erts_cancel_timer(&prt->tm);
#endif
drv = prt->drv_ptr;
@@ -2420,7 +2417,7 @@ void erts_raw_port_command(Port* p, byte* buf, Uint len)
if (len > (Uint) INT_MAX)
erl_exit(ERTS_ABORT_EXIT,
- "Absurdly large data buffer (%bpu bytes) passed to"
+ "Absurdly large data buffer (%beu bytes) passed to"
"output callback of %s driver.\n",
len,
p->drv_ptr->name ? p->drv_ptr->name : "unknown");
@@ -3252,7 +3249,7 @@ int driver_output_binary(ErlDrvPort ix, char* hbuf, int hlen,
return 0;
prt->bytes_in += (hlen + len);
- erts_smp_atomic_add(&erts_bytes_in, (long) (hlen + len));
+ erts_smp_atomic_add(&erts_bytes_in, (erts_aint_t) (hlen + len));
if (prt->status & ERTS_PORT_SFLG_DISTRIBUTION) {
return erts_net_message(prt,
prt->dist_entry,
@@ -3287,7 +3284,7 @@ int driver_output2(ErlDrvPort ix, char* hbuf, int hlen, char* buf, int len)
return 0;
prt->bytes_in += (hlen + len);
- erts_smp_atomic_add(&erts_bytes_in, (long) (hlen + len));
+ erts_smp_atomic_add(&erts_bytes_in, (erts_aint_t) (hlen + len));
if (prt->status & ERTS_PORT_SFLG_DISTRIBUTION) {
if (len == 0)
return erts_net_message(prt,
@@ -3364,7 +3361,7 @@ int driver_outputv(ErlDrvPort ix, char* hbuf, int hlen, ErlIOVec* vec, int skip)
/* XXX handle distribution !!! */
prt->bytes_in += (hlen + size);
- erts_smp_atomic_add(&erts_bytes_in, (long) (hlen + size));
+ erts_smp_atomic_add(&erts_bytes_in, (erts_aint_t) (hlen + size));
deliver_vec_message(prt, prt->connected, hbuf, hlen, binv, iov, n, size);
return 0;
}
@@ -3408,25 +3405,25 @@ int len;
* reference count on driver binaries...
*/
-long
+ErlDrvSInt
driver_binary_get_refc(ErlDrvBinary *dbp)
{
Binary* bp = ErlDrvBinary2Binary(dbp);
- return erts_refc_read(&bp->refc, 1);
+ return (ErlDrvSInt) erts_refc_read(&bp->refc, 1);
}
-long
+ErlDrvSInt
driver_binary_inc_refc(ErlDrvBinary *dbp)
{
Binary* bp = ErlDrvBinary2Binary(dbp);
- return erts_refc_inctest(&bp->refc, 2);
+ return (ErlDrvSInt) erts_refc_inctest(&bp->refc, 2);
}
-long
+ErlDrvSInt
driver_binary_dec_refc(ErlDrvBinary *dbp)
{
Binary* bp = ErlDrvBinary2Binary(dbp);
- return erts_refc_dectest(&bp->refc, 1);
+ return (ErlDrvSInt) erts_refc_dectest(&bp->refc, 1);
}
@@ -3541,12 +3538,12 @@ pdl_init_refc(ErlDrvPDL pdl)
erts_atomic_init(&pdl->refc, 1);
}
-static ERTS_INLINE long
+static ERTS_INLINE ErlDrvSInt
pdl_read_refc(ErlDrvPDL pdl)
{
- long refc = erts_atomic_read(&pdl->refc);
+ erts_aint_t refc = erts_atomic_read(&pdl->refc);
ERTS_LC_ASSERT(refc >= 0);
- return refc;
+ return (ErlDrvSInt) refc;
}
static ERTS_INLINE void
@@ -3556,12 +3553,12 @@ pdl_inc_refc(ErlDrvPDL pdl)
ERTS_LC_ASSERT(driver_pdl_get_refc(pdl) > 1);
}
-static ERTS_INLINE long
+static ERTS_INLINE ErlDrvSInt
pdl_inctest_refc(ErlDrvPDL pdl)
{
- long refc = erts_atomic_inctest(&pdl->refc);
+ erts_aint_t refc = erts_atomic_inctest(&pdl->refc);
ERTS_LC_ASSERT(refc > 1);
- return refc;
+ return (ErlDrvSInt) refc;
}
#if 0 /* unused */
@@ -3573,12 +3570,12 @@ pdl_dec_refc(ErlDrvPDL pdl)
}
#endif
-static ERTS_INLINE long
+static ERTS_INLINE ErlDrvSInt
pdl_dectest_refc(ErlDrvPDL pdl)
{
- long refc = erts_atomic_dectest(&pdl->refc);
+ erts_aint_t refc = erts_atomic_dectest(&pdl->refc);
ERTS_LC_ASSERT(refc >= 0);
- return refc;
+ return (ErlDrvSInt) refc;
}
static ERTS_INLINE void pdl_destroy(ErlDrvPDL pdl)
@@ -3649,7 +3646,7 @@ driver_pdl_lock(ErlDrvPDL pdl)
void
driver_pdl_unlock(ErlDrvPDL pdl)
{
- long refc;
+ ErlDrvSInt refc;
#ifdef HARDDEBUG
erts_fprintf(stderr, "driver_pdl_unlock(0x%08X)\r\n",(unsigned) pdl);
#endif
@@ -3659,28 +3656,30 @@ driver_pdl_unlock(ErlDrvPDL pdl)
pdl_destroy(pdl);
}
-long
+ErlDrvSInt
driver_pdl_get_refc(ErlDrvPDL pdl)
{
return pdl_read_refc(pdl);
}
-long
+ErlDrvSInt
driver_pdl_inc_refc(ErlDrvPDL pdl)
{
- long refc = pdl_inctest_refc(pdl);
+ ErlDrvSInt refc = pdl_inctest_refc(pdl);
#ifdef HARDDEBUG
- erts_fprintf(stderr, "driver_pdl_inc_refc(0x%08X) -> %ld\r\n",(unsigned) pdl, refc);
+ erts_fprintf(stderr, "driver_pdl_inc_refc(%p) -> %bed\r\n",
+ pdl, refc);
#endif
return refc;
}
-long
+ErlDrvSInt
driver_pdl_dec_refc(ErlDrvPDL pdl)
{
- long refc = pdl_dectest_refc(pdl);
+ ErlDrvSInt refc = pdl_dectest_refc(pdl);
#ifdef HARDDEBUG
- erts_fprintf(stderr, "driver_pdl_dec_refc(0x%08X) -> %ld\r\n",(unsigned) pdl, refc);
+ erts_fprintf(stderr, "driver_pdl_dec_refc(%p) -> %bpd\r\n",
+ pdl, refc);
#endif
if (!refc)
pdl_destroy(pdl);
@@ -4066,7 +4065,7 @@ drv_cancel_timer(Port *prt)
#ifdef ERTS_SMP
erts_cancel_smp_ptimer(prt->ptimer);
#else
- erl_cancel_timer(&prt->tm);
+ erts_cancel_timer(&prt->tm);
#endif
if (erts_port_task_is_scheduled(&prt->timeout_task))
erts_port_task_abort(prt->id, &prt->timeout_task);
@@ -4090,7 +4089,7 @@ int driver_set_timer(ErlDrvPort ix, UWord t)
(ErlTimeoutProc) schedule_port_timeout,
t);
#else
- erl_set_timer(&prt->tm,
+ erts_set_timer(&prt->tm,
(ErlTimeoutProc) schedule_port_timeout,
NULL,
prt,
@@ -4121,9 +4120,9 @@ driver_read_timer(ErlDrvPort ix, unsigned long* t)
return -1;
ERTS_SMP_LC_ASSERT(erts_lc_is_port_locked(prt));
#ifdef ERTS_SMP
- *t = prt->ptimer ? time_left(&prt->ptimer->timer.tm) : 0;
+ *t = prt->ptimer ? erts_time_left(&prt->ptimer->timer.tm) : 0;
#else
- *t = time_left(&prt->tm);
+ *t = erts_time_left(&prt->tm);
#endif
return 0;
}
diff --git a/erts/emulator/beam/ops.tab b/erts/emulator/beam/ops.tab
index a2439d5582..6caa1e0b2d 100644
--- a/erts/emulator/beam/ops.tab
+++ b/erts/emulator/beam/ops.tab
@@ -101,16 +101,16 @@ return
%macro: test_heap TestHeap -pack
allocate t t
-allocate_heap I I I
+allocate_heap t I t
deallocate I
init y
allocate_zero t t
-allocate_heap_zero I I I
+allocate_heap_zero t I t
trim N Remaining => i_trim N
i_trim I
-test_heap I I
+test_heap I t
allocate_heap S u==0 R => allocate S R
allocate_heap_zero S u==0 R => allocate_zero S R
@@ -124,7 +124,7 @@ init Y1 | init Y2 => init2 Y1 Y2
# Selecting values
-select_val S=q Fail=f Size=u Rest=* => const_select_val(S, Fail, Size, Rest)
+select_val S=aiq Fail=f Size=u Rest=* => const_select_val(S, Fail, Size, Rest)
select_val S=s Fail=f Size=u Rest=* | use_jump_tab(Size, Rest) => \
gen_jump_tab(S, Fail, Size, Rest)
@@ -132,34 +132,59 @@ select_val S=s Fail=f Size=u Rest=* | use_jump_tab(Size, Rest) => \
is_integer Fail=f S | select_val S=s Fail=f Size=u Rest=* | use_jump_tab(Size, Rest) => \
gen_jump_tab(S, Fail, Size, Rest)
+is_integer TypeFail=f S | select_val S=s Fail=f Size=u Rest=* | \
+ mixed_types(Size, Rest) => \
+ gen_split_values(S, TypeFail, Fail, Size, Rest)
+
select_val S=s Fail=f Size=u Rest=* | mixed_types(Size, Rest) => \
- gen_split_values(S, Fail, Size, Rest)
+ gen_split_values(S, Fail, Fail, Size, Rest)
-is_integer Fail=f S | select_val S=s Fail=f Size=u Rest=* | \
+is_integer Fail=f S | select_val S=d Fail=f Size=u Rest=* | \
fixed_size_values(Size, Rest) => gen_select_val(S, Fail, Size, Rest)
-is_atom Fail=f S | select_val S=s Fail=f Size=u Rest=* | \
+is_atom Fail=f S | select_val S=d Fail=f Size=u Rest=* | \
fixed_size_values(Size, Rest) => gen_select_val(S, Fail, Size, Rest)
-select_val S=s Fail=f Size=u Rest=* | fixed_size_values(Size, Rest) => \
- gen_select_val(S, Fail, Size, Rest)
+select_val S=s Fail=f Size=u Rest=* | floats_or_bignums(Size, Rest) => \
+ gen_select_literals(S, Fail, Size, Rest)
-select_val S=s Fail=f Size=u Rest=* | all_values_are_big(Size, Rest) => \
- gen_select_big(S, Fail, Size, Rest)
+select_val S=d Fail=f Size=u Rest=* | fixed_size_values(Size, Rest) => \
+ gen_select_val(S, Fail, Size, Rest)
-is_tuple Fail=f S | select_tuple_arity S=s Fail=f Size=u Rest=* => \
+is_tuple Fail=f S | select_tuple_arity S=d Fail=f Size=u Rest=* => \
gen_select_tuple_arity(S, Fail, Size, Rest)
-select_tuple_arity S=s Fail=f Size=u Rest=* => \
+select_tuple_arity S=d Fail=f Size=u Rest=* => \
gen_select_tuple_arity(S, Fail, Size, Rest)
-i_select_val s f I
-i_select_tuple_arity s f I
-i_select_big s f
-i_select_float s f I
+i_select_val r f I
+i_select_val x f I
+i_select_val y f I
+
+i_select_val2 r f c f c f
+i_select_val2 x f c f c f
+i_select_val2 y f c f c f
+
+i_select_tuple_arity2 r f A f A f
+i_select_tuple_arity2 x f A f A f
+i_select_tuple_arity2 y f A f A f
+
+i_select_tuple_arity r f I
+i_select_tuple_arity x f I
+i_select_tuple_arity y f I
+
+i_jump_on_val_zero r f I
+i_jump_on_val_zero x f I
+i_jump_on_val_zero y f I
+
+i_jump_on_val r f I I
+i_jump_on_val x f I I
+i_jump_on_val y f I I
-i_jump_on_val_zero s f I
-i_jump_on_val s f I I
+jump Target | label Lbl | same_label(Target, Lbl) => label Lbl
+
+is_ne_exact L1 S1 S2 | jump Fail | label L2 | same_label(L1, L2) => \
+ is_eq_exact Fail S1 S2 | label L2
%macro: get_list GetList -pack
get_list x x x
@@ -234,11 +259,17 @@ is_number Fail Literal=q => move Literal x | is_number Fail x
jump f
-case_end Literal=q => move Literal x | case_end x
-badmatch Literal=q => move Literal x | badmatch x
+case_end Literal=cq => move Literal x | case_end x
+badmatch Literal=cq => move Literal x | badmatch x
+
+case_end r
+case_end x
+case_end y
+
+badmatch r
+badmatch x
+badmatch y
-case_end s
-badmatch s
if_end
raise s s
@@ -248,12 +279,33 @@ system_limit j
move R R =>
+move C=cxy r | jump Lbl => move_jump Lbl C
+
+%macro: move_jump MoveJump -nonext
+move_jump f n
+move_jump f c
+move_jump f x
+move_jump f y
+
move X1=x Y1=y | move X2=x Y2=y => move2 X1 Y1 X2 Y2
move Y1=y X1=x | move Y2=y X2=x => move2 Y1 X1 Y2 X2
+move X1=x X2=x | move X3=x X4=x => move2 X1 X2 X3 X4
+
+move C=aiq X=x==1 => move_x1 C
+move C=aiq X=x==2 => move_x2 C
+
+move_x1 c
+move_x2 c
%macro: move2 Move2 -pack
move2 x y x y
move2 y x y x
+move2 x x x x
+
+# The compiler almost never generates a "move Literal y(Y)" instruction,
+# so let's cheat if we encounter one.
+move S=n D=y => init D
+move S=c D=y => move S x | move x D
%macro:move Move -pack -gen_dest
move x x
@@ -265,15 +317,10 @@ move r x
move r y
move c r
move c x
-move c y
move n x
move n r
move y y
-%cold
-move s d
-%hot
-
# Receive operations.
loop_rec Fail Src | smp_mark_target_label(Fail) => i_loop_rec Fail Src
@@ -306,55 +353,78 @@ i_wait_error_locked
send
#
-# Comparisions.
+# Optimized comparisons with one immediate/literal operand.
+#
+
+is_eq_exact Lbl R=rxy C=ian => i_is_eq_exact_immed Lbl R C
+is_eq_exact Lbl R=rxy C=q => i_is_eq_exact_literal R Lbl C
+
+is_ne_exact Lbl R=rxy C=ian => i_is_ne_exact_immed Lbl R C
+is_ne_exact Lbl R=rxy C=q => i_is_ne_exact_literal R Lbl C
+
+%macro: i_is_eq_exact_immed EqualImmed -fail_action
+i_is_eq_exact_immed f r c
+i_is_eq_exact_immed f x c
+i_is_eq_exact_immed f y c
+
+i_is_eq_exact_literal r f c
+i_is_eq_exact_literal x f c
+i_is_eq_exact_literal y f c
+
+%macro: i_is_ne_exact_immed NotEqualImmed -fail_action
+i_is_ne_exact_immed f r c
+i_is_ne_exact_immed f x c
+i_is_ne_exact_immed f y c
+
+i_is_ne_exact_literal r f c
+i_is_ne_exact_literal x f c
+i_is_ne_exact_literal y f c
+
+#
+# All other comparisons.
#
-is_eq_exact Lbl=f R=rxy C=ian => i_is_eq_immed Lbl R C
-is_eq Lbl=f R=rxy C=an => i_is_eq_immed Lbl R C
+is_eq_exact Lbl S1 S2 => i_fetch S1 S2 | i_is_eq_exact Lbl
+is_ne_exact Lbl S1 S2 => i_fetch S1 S2 | i_is_ne_exact Lbl
is_ge Lbl S1 S2 => i_fetch S1 S2 | i_is_ge Lbl
is_lt Lbl S1 S2 => i_fetch S1 S2 | i_is_lt Lbl
is_eq Lbl S1 S2 => i_fetch S1 S2 | i_is_eq Lbl
is_ne Lbl S1 S2 => i_fetch S1 S2 | i_is_ne Lbl
-is_eq_exact Lbl=f S1 S2 => i_fetch S1 S2 | i_is_eq_exact Lbl
-is_ne_exact Lbl S1 S2 => i_fetch S1 S2 | i_is_ne_exact Lbl
-
+i_is_eq_exact f
+i_is_ne_exact f
i_is_lt f
i_is_ge f
i_is_eq f
i_is_ne f
-i_is_eq_exact f
-i_is_ne_exact f
-
-%macro: i_is_eq_immed EqualImmed -fail_action
-i_is_eq_immed f r c
-i_is_eq_immed f x c
-i_is_eq_immed f y c
#
# Putting things.
#
-put_tuple Arity Dst | put V => i_put_tuple Arity V Dst
+put_tuple Arity Dst => i_put_tuple Dst u
-%macro: i_put_tuple PutTuple -pack
-i_put_tuple A x x
-i_put_tuple A y x
-i_put_tuple A r x
-i_put_tuple A n x
-i_put_tuple A c x
-i_put_tuple A x y
-i_put_tuple A x r
-i_put_tuple A y r
-i_put_tuple A n r
-i_put_tuple A c r
+i_put_tuple Dst Arity Puts=* | put S1 | put S2 | \
+ put S3 | put S4 | put S5 => \
+ tuple_append_put5(Arity, Dst, Puts, S1, S2, S3, S4, S5)
-%cold
-i_put_tuple A r y
-i_put_tuple A y y
-i_put_tuple A c y
-%hot
+i_put_tuple Dst Arity Puts=* | put S => \
+ tuple_append_put(Arity, Dst, Puts, S)
+
+i_put_tuple/2
+
+%macro:i_put_tuple PutTuple -pack -goto:do_put_tuple
+i_put_tuple r I
+i_put_tuple x I
+i_put_tuple y I
+
+#
+# The instruction "put_list Const [] Dst" will not be generated by
+# the current BEAM compiler. But until R15A, play it safe by handling
+# that instruction with the following transformation.
+#
+put_list Const=c n Dst => move Const x | put_list x n Dst
%macro:put_list PutList -pack -gen_dest
@@ -362,10 +432,8 @@ put_list x n x
put_list y n x
put_list x x x
put_list y x x
-put_list c n x
put_list x x r
put_list y r r
-put_list c n r
put_list y y x
put_list x y x
@@ -376,6 +444,13 @@ put_list y y r
put_list y r x
put_list r n x
+put_list x r x
+put_list x y r
+put_list y x r
+put_list y x x
+
+put_list x r r
+
# put_list SrcReg Constant Dst
put_list r c r
put_list r c x
@@ -403,17 +478,9 @@ put_list c y x
put_list c y y
%cold
-put_list x r r
put_list s s d
%hot
-%macro: put Put
-put x
-put r
-put y
-put c
-put n
-
%macro: i_fetch FetchArgs -pack
i_fetch c c
i_fetch c r
@@ -464,19 +531,20 @@ move_return n r
move S r | deallocate D | return => move_deallocate_return S r D
-%macro: move_deallocate_return MoveDeallocateReturn -nonext
-move_deallocate_return x r P
-move_deallocate_return y r P
-move_deallocate_return c r P
-move_deallocate_return n r P
+%macro: move_deallocate_return MoveDeallocateReturn -pack -nonext
+move_deallocate_return x r Q
+move_deallocate_return y r Q
+move_deallocate_return c r Q
+move_deallocate_return n r Q
deallocate D | return => deallocate_return D
%macro: deallocate_return DeallocateReturn -nonext
-deallocate_return P
+deallocate_return Q
test_heap Need u==1 | put_list Y=y r r => test_heap_1_put_list Need Y
+%macro: test_heap_1_put_list TestHeapPutList -pack
test_heap_1_put_list I y
# Test tuple & arity (head)
@@ -576,14 +644,14 @@ is_list f y
is_nonempty_list Fail=f S=rx | allocate Need Rs => is_nonempty_list_allocate Fail S Need Rs
-%macro:is_nonempty_list_allocate IsNonemptyListAllocate -fail_action
-is_nonempty_list_allocate f x I I
-is_nonempty_list_allocate f r I I
+%macro:is_nonempty_list_allocate IsNonemptyListAllocate -fail_action -pack
+is_nonempty_list_allocate f x I t
+is_nonempty_list_allocate f r I t
is_nonempty_list F=f r | test_heap I1 I2 => is_non_empty_list_test_heap F r I1 I2
-%macro: is_non_empty_list_test_heap IsNonemptyListTestHeap -fail_action
-is_non_empty_list_test_heap f r I I
+%macro: is_non_empty_list_test_heap IsNonemptyListTestHeap -fail_action -pack
+is_non_empty_list_test_heap f r I t
%macro: is_nonempty_list IsNonemptyList -fail_action
is_nonempty_list f x
@@ -912,8 +980,13 @@ node x
node y
%hot
-i_fast_element j I s d
-i_element j s s d
+i_fast_element r j I d
+i_fast_element x j I d
+i_fast_element y j I d
+
+i_element r j s d
+i_element x j s d
+i_element y j s d
bif1 f b s d
bif1_body b s d
@@ -940,11 +1013,11 @@ move S r | call_last Ar P=f D => move_call_last S r P D
i_move_call_last f P c r
-%macro:move_call_last MoveCallLast -arg_f -nonext
+%macro:move_call_last MoveCallLast -arg_f -nonext -pack
move_call_last/4
-move_call_last x r f P
-move_call_last y r f P
+move_call_last x r f Q
+move_call_last y r f Q
move S=c r | call_only Ar P=f => i_move_call_only P S r
move S=x r | call_only Ar P=f => move_call_only S r P
@@ -993,7 +1066,7 @@ is_function f y
is_function f r
is_function Fail=f c => jump Fail
-func_info M=a F=a A=u | label L => gen_func_info(M, F, A, L)
+func_info M F A => i_func_info u M F A
# ================================================================
# New bit syntax matching (R11B).
@@ -1307,6 +1380,8 @@ fconv Arg=iqan Dst=l => move Arg x | fconv x Dst
fmove q l
fmove d l
+fmove l d
+
fconv d l
i_fadd l l l
@@ -1322,12 +1397,6 @@ fcheckerror p => i_fcheckerror
i_fcheckerror
fclearerror
-fmove FR=l Dst=d | new_float_allocation() => fmove_new FR Dst
-
-# The new instruction for moving a float out of a floating point register.
-# (No allocation.)
-fmove_new l d
-
#
# New apply instructions in R10B.
#
@@ -1336,7 +1405,21 @@ apply I
apply_last I P
#
-# New GCing arithmetic instructions.
+# Optimize addition and subtraction of small literals using
+# the i_increment/4 instruction (in bodies, not in guards).
+#
+
+gc_bif2 p Live u$bif:erlang:splus/2 Int=i Reg=d Dst => \
+ gen_increment(Reg, Int, Live, Dst)
+gc_bif2 p Live u$bif:erlang:splus/2 Reg=d Int=i Dst => \
+ gen_increment(Reg, Int, Live, Dst)
+
+gc_bif2 p Live u$bif:erlang:sminus/2 Reg=d Int=i Dst | \
+ negation_is_small(Int) => \
+ gen_increment_from_minus(Reg, Int, Live, Dst)
+
+#
+# GCing arithmetic instructions.
#
gc_bif2 Fail I u$bif:erlang:splus/2 S1 S2 Dst=d => i_fetch S1 S2 | i_plus Fail I Dst
@@ -1359,6 +1442,10 @@ gc_bif1 Fail I u$bif:erlang:bnot/1 Src Dst=d => i_int_bnot Fail Src I Dst
gc_bif1 Fail I u$bif:erlang:sminus/1 Src Dst=d => i_fetch i Src | i_minus Fail I Dst
gc_bif1 Fail I u$bif:erlang:splus/1 Src Dst=d => i_fetch i Src | i_plus Fail I Dst
+i_increment r I I d
+i_increment x I I d
+i_increment y I I d
+
i_plus j I d
i_minus j I d
i_times j I d
diff --git a/erts/emulator/beam/sys.h b/erts/emulator/beam/sys.h
index 27c5f99320..e64c43de6e 100644
--- a/erts/emulator/beam/sys.h
+++ b/erts/emulator/beam/sys.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -39,13 +39,6 @@
#define ENABLE_CHILD_WAITER_THREAD 1
#endif
-/* The ERTS_TIMER_TREAD #define must be visible to the
- erl_${OS}_sys.h #include files: it controls whether
- certain optional facilities should be defined or not. */
-#if defined(ERTS_SMP) && 0
-#define ERTS_TIMER_THREAD
-#endif
-
#if defined (__WIN32__)
# include "erl_win_sys.h"
#elif defined (VXWORKS)
@@ -232,14 +225,14 @@ int real_printf(const char *fmt, ...);
#else
#error Neither 32 nor 64 bit architecture
#endif
-#ifdef ARCH_64
-# ifdef HALFWORD_HEAP_EMULATOR
+#if defined(ARCH_64) && defined(HALFWORD_HEAP_EMULATOR)
# define HALFWORD_HEAP 1
# define HALFWORD_ASSERT 0
-# else
+# define ASSERT_HALFWORD(COND) ASSERT(COND)
+#else
# define HALFWORD_HEAP 0
# define HALFWORD_ASSERT 0
-# endif
+# define ASSERT_HALFWORD(COND)
#endif
#if SIZEOF_VOID_P != SIZEOF_SIZE_T
@@ -338,12 +331,16 @@ typedef unsigned char byte;
(((size_t) 8) - (((size_t) (X)) & ((size_t) 7)))
#include "erl_lock_check.h"
+
+/* needed by erl_smp.h */
+int erts_send_warning_to_logger_str_nogl(char *);
+
#include "erl_smp.h"
#ifdef ERTS_WANT_BREAK_HANDLING
# ifdef ERTS_SMP
-extern erts_smp_atomic_t erts_break_requested;
-# define ERTS_BREAK_REQUESTED ((int) erts_smp_atomic_read(&erts_break_requested))
+extern erts_smp_atomic32_t erts_break_requested;
+# define ERTS_BREAK_REQUESTED ((int) erts_smp_atomic32_read(&erts_break_requested))
# else
extern volatile int erts_break_requested;
# define ERTS_BREAK_REQUESTED erts_break_requested
@@ -356,8 +353,8 @@ void erts_do_break_handling(void);
# define ERTS_GOT_SIGUSR1 0
# else
# ifdef ERTS_SMP
-extern erts_smp_atomic_t erts_got_sigusr1;
-# define ERTS_GOT_SIGUSR1 ((int) erts_smp_atomic_read(&erts_got_sigusr1))
+extern erts_smp_atomic32_t erts_got_sigusr1;
+# define ERTS_GOT_SIGUSR1 ((int) erts_smp_atomic32_read(&erts_got_sigusr1))
# else
extern volatile int erts_got_sigusr1;
# define ERTS_GOT_SIGUSR1 erts_got_sigusr1
@@ -524,7 +521,8 @@ int erts_send_info_to_logger_nogl(erts_dsprintf_buf_t *);
int erts_send_warning_to_logger_nogl(erts_dsprintf_buf_t *);
int erts_send_error_to_logger_nogl(erts_dsprintf_buf_t *);
int erts_send_info_to_logger_str_nogl(char *);
-int erts_send_warning_to_logger_str_nogl(char *);
+/* needed by erl_smp.h (declared above)
+ int erts_send_warning_to_logger_str_nogl(char *); */
int erts_send_error_to_logger_str_nogl(char *);
typedef struct preload {
@@ -540,8 +538,8 @@ typedef struct preload {
*/
typedef struct _SysDriverOpts {
- int ifd; /* Input file descriptor (fd driver). */
- int ofd; /* Outputfile descriptor (fd driver). */
+ Uint ifd; /* Input file descriptor (fd driver). */
+ Uint ofd; /* Outputfile descriptor (fd driver). */
int packet_bytes; /* Number of bytes in packet header. */
int read_write; /* Read and write bits. */
int use_stdio; /* Use standard I/O: TRUE or FALSE. */
@@ -562,11 +560,7 @@ extern char *erts_default_arg0;
extern char os_type[];
extern int sys_init_time(void);
-#if defined(ERTS_TIMER_THREAD)
-#define erts_deliver_time()
-#else
extern void erts_deliver_time(void);
-#endif
extern void erts_time_remaining(SysTimeval *);
extern int erts_init_time_sup(void);
extern void erts_sys_init_float(void);
@@ -728,11 +722,11 @@ typedef enum {
} erts_activity_error_t;
typedef struct {
- erts_smp_atomic_t do_block;
+ erts_smp_atomic32_t do_block;
struct {
- erts_smp_atomic_t wait;
- erts_smp_atomic_t gc;
- erts_smp_atomic_t io;
+ erts_smp_atomic32_t wait;
+ erts_smp_atomic32_t gc;
+ erts_smp_atomic32_t io;
} in_activity;
} erts_system_block_state_t;
@@ -883,7 +877,7 @@ ERTS_GLB_INLINE int
erts_smp_pending_system_block(void)
{
#ifdef ERTS_SMP
- return erts_smp_atomic_read(&erts_system_block_state.do_block);
+ return (int) erts_smp_atomic32_read(&erts_system_block_state.do_block);
#else
return 0;
#endif
@@ -919,7 +913,7 @@ erts_smp_set_activity(erts_activity_t old_activity,
case ERTS_ACTIVITY_UNDEFINED:
break;
case ERTS_ACTIVITY_WAIT:
- erts_smp_atomic_dec(&erts_system_block_state.in_activity.wait);
+ erts_smp_atomic32_dec(&erts_system_block_state.in_activity.wait);
if (locked) {
/* You are not allowed to leave activity waiting
* without supplying the possibility to block
@@ -930,10 +924,10 @@ erts_smp_set_activity(erts_activity_t old_activity,
}
break;
case ERTS_ACTIVITY_GC:
- erts_smp_atomic_dec(&erts_system_block_state.in_activity.gc);
+ erts_smp_atomic32_dec(&erts_system_block_state.in_activity.gc);
break;
case ERTS_ACTIVITY_IO:
- erts_smp_atomic_dec(&erts_system_block_state.in_activity.io);
+ erts_smp_atomic32_dec(&erts_system_block_state.in_activity.io);
break;
default:
erts_set_activity_error(ERTS_ACT_ERR_LEAVE_UNKNOWN_ACTIVITY,
@@ -949,13 +943,13 @@ erts_smp_set_activity(erts_activity_t old_activity,
case ERTS_ACTIVITY_UNDEFINED:
break;
case ERTS_ACTIVITY_WAIT:
- erts_smp_atomic_inc(&erts_system_block_state.in_activity.wait);
+ erts_smp_atomic32_inc(&erts_system_block_state.in_activity.wait);
break;
case ERTS_ACTIVITY_GC:
- erts_smp_atomic_inc(&erts_system_block_state.in_activity.gc);
+ erts_smp_atomic32_inc(&erts_system_block_state.in_activity.gc);
break;
case ERTS_ACTIVITY_IO:
- erts_smp_atomic_inc(&erts_system_block_state.in_activity.io);
+ erts_smp_atomic32_inc(&erts_system_block_state.in_activity.io);
break;
default:
erts_set_activity_error(ERTS_ACT_ERR_ENTER_UNKNOWN_ACTIVITY,
@@ -990,27 +984,31 @@ erts_smp_set_activity(erts_activity_t old_activity,
typedef erts_smp_atomic_t erts_refc_t;
-ERTS_GLB_INLINE void erts_refc_init(erts_refc_t *refcp, long val);
-ERTS_GLB_INLINE void erts_refc_inc(erts_refc_t *refcp, long min_val);
-ERTS_GLB_INLINE long erts_refc_inctest(erts_refc_t *refcp, long min_val);
-ERTS_GLB_INLINE void erts_refc_dec(erts_refc_t *refcp, long min_val);
-ERTS_GLB_INLINE long erts_refc_dectest(erts_refc_t *refcp, long min_val);
-ERTS_GLB_INLINE void erts_refc_add(erts_refc_t *refcp, long diff, long min_val);
-ERTS_GLB_INLINE long erts_refc_read(erts_refc_t *refcp, long min_val);
+ERTS_GLB_INLINE void erts_refc_init(erts_refc_t *refcp, erts_aint_t val);
+ERTS_GLB_INLINE void erts_refc_inc(erts_refc_t *refcp, erts_aint_t min_val);
+ERTS_GLB_INLINE erts_aint_t erts_refc_inctest(erts_refc_t *refcp,
+ erts_aint_t min_val);
+ERTS_GLB_INLINE void erts_refc_dec(erts_refc_t *refcp, erts_aint_t min_val);
+ERTS_GLB_INLINE erts_aint_t erts_refc_dectest(erts_refc_t *refcp,
+ erts_aint_t min_val);
+ERTS_GLB_INLINE void erts_refc_add(erts_refc_t *refcp, erts_aint_t diff,
+ erts_aint_t min_val);
+ERTS_GLB_INLINE erts_aint_t erts_refc_read(erts_refc_t *refcp,
+ erts_aint_t min_val);
#if ERTS_GLB_INLINE_INCL_FUNC_DEF
ERTS_GLB_INLINE void
-erts_refc_init(erts_refc_t *refcp, long val)
+erts_refc_init(erts_refc_t *refcp, erts_aint_t val)
{
erts_smp_atomic_init((erts_smp_atomic_t *) refcp, val);
}
ERTS_GLB_INLINE void
-erts_refc_inc(erts_refc_t *refcp, long min_val)
+erts_refc_inc(erts_refc_t *refcp, erts_aint_t min_val)
{
#ifdef ERTS_REFC_DEBUG
- long val = erts_smp_atomic_inctest((erts_smp_atomic_t *) refcp);
+ erts_aint_t val = erts_smp_atomic_inctest((erts_smp_atomic_t *) refcp);
if (val < min_val)
erl_exit(ERTS_ABORT_EXIT,
"erts_refc_inc(): Bad refc found (refc=%ld < %ld)!\n",
@@ -1020,10 +1018,10 @@ erts_refc_inc(erts_refc_t *refcp, long min_val)
#endif
}
-ERTS_GLB_INLINE long
-erts_refc_inctest(erts_refc_t *refcp, long min_val)
+ERTS_GLB_INLINE erts_aint_t
+erts_refc_inctest(erts_refc_t *refcp, erts_aint_t min_val)
{
- long val = erts_smp_atomic_inctest((erts_smp_atomic_t *) refcp);
+ erts_aint_t val = erts_smp_atomic_inctest((erts_smp_atomic_t *) refcp);
#ifdef ERTS_REFC_DEBUG
if (val < min_val)
erl_exit(ERTS_ABORT_EXIT,
@@ -1034,10 +1032,10 @@ erts_refc_inctest(erts_refc_t *refcp, long min_val)
}
ERTS_GLB_INLINE void
-erts_refc_dec(erts_refc_t *refcp, long min_val)
+erts_refc_dec(erts_refc_t *refcp, erts_aint_t min_val)
{
#ifdef ERTS_REFC_DEBUG
- long val = erts_smp_atomic_dectest((erts_smp_atomic_t *) refcp);
+ erts_aint_t val = erts_smp_atomic_dectest((erts_smp_atomic_t *) refcp);
if (val < min_val)
erl_exit(ERTS_ABORT_EXIT,
"erts_refc_dec(): Bad refc found (refc=%ld < %ld)!\n",
@@ -1047,10 +1045,10 @@ erts_refc_dec(erts_refc_t *refcp, long min_val)
#endif
}
-ERTS_GLB_INLINE long
-erts_refc_dectest(erts_refc_t *refcp, long min_val)
+ERTS_GLB_INLINE erts_aint_t
+erts_refc_dectest(erts_refc_t *refcp, erts_aint_t min_val)
{
- long val = erts_smp_atomic_dectest((erts_smp_atomic_t *) refcp);
+ erts_aint_t val = erts_smp_atomic_dectest((erts_smp_atomic_t *) refcp);
#ifdef ERTS_REFC_DEBUG
if (val < min_val)
erl_exit(ERTS_ABORT_EXIT,
@@ -1061,10 +1059,10 @@ erts_refc_dectest(erts_refc_t *refcp, long min_val)
}
ERTS_GLB_INLINE void
-erts_refc_add(erts_refc_t *refcp, long diff, long min_val)
+erts_refc_add(erts_refc_t *refcp, erts_aint_t diff, erts_aint_t min_val)
{
#ifdef ERTS_REFC_DEBUG
- long val = erts_smp_atomic_addtest((erts_smp_atomic_t *) refcp, diff);
+ erts_aint_t val = erts_smp_atomic_addtest((erts_smp_atomic_t *) refcp, diff);
if (val < min_val)
erl_exit(ERTS_ABORT_EXIT,
"erts_refc_add(%ld): Bad refc found (refc=%ld < %ld)!\n",
@@ -1074,10 +1072,10 @@ erts_refc_add(erts_refc_t *refcp, long diff, long min_val)
#endif
}
-ERTS_GLB_INLINE long
-erts_refc_read(erts_refc_t *refcp, long min_val)
+ERTS_GLB_INLINE erts_aint_t
+erts_refc_read(erts_refc_t *refcp, erts_aint_t min_val)
{
- long val = erts_smp_atomic_read((erts_smp_atomic_t *) refcp);
+ erts_aint_t val = erts_smp_atomic_read((erts_smp_atomic_t *) refcp);
#ifdef ERTS_REFC_DEBUG
if (val < min_val)
erl_exit(ERTS_ABORT_EXIT,
diff --git a/erts/emulator/beam/time.c b/erts/emulator/beam/time.c
index 53d39aef0e..a00faff912 100644
--- a/erts/emulator/beam/time.c
+++ b/erts/emulator/beam/time.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -99,80 +99,37 @@ static erts_smp_mtx_t tiw_lock;
static ErlTimer** tiw; /* the timing wheel, allocated in init_time() */
static Uint tiw_pos; /* current position in wheel */
static Uint tiw_nto; /* number of timeouts in wheel */
+static Uint tiw_min;
+static ErlTimer *tiw_min_ptr;
/* END tiw_lock protected variables */
/* Actual interval time chosen by sys_init_time() */
static int itime; /* Constant after init */
-#if defined(ERTS_TIMER_THREAD)
-static SysTimeval time_start; /* start of current time interval */
-static long ticks_end; /* time_start+ticks_end == time_wakeup */
-static long ticks_latest; /* delta from time_start at latest time update*/
-
-static ERTS_INLINE long time_gettimeofday(SysTimeval *now)
-{
- long elapsed;
-
- erts_get_timeval(now);
- now->tv_usec = 1000 * (now->tv_usec / 1000); /* ms resolution */
- elapsed = (1000 * (now->tv_sec - time_start.tv_sec) +
- (now->tv_usec - time_start.tv_usec) / 1000);
- // elapsed /= CLOCK_RESOLUTION;
- return elapsed;
-}
-
-static long do_time_update(void)
-{
- SysTimeval now;
- long elapsed;
-
- elapsed = time_gettimeofday(&now);
- ticks_latest = elapsed;
- return elapsed;
-}
-
-static ERTS_INLINE long do_time_read(void)
-{
- return ticks_latest;
-}
-
-static long do_time_reset(void)
-{
- SysTimeval now;
- long elapsed;
-
- elapsed = time_gettimeofday(&now);
- time_start = now;
- ticks_end = LONG_MAX;
- ticks_latest = 0;
- return elapsed;
-}
-
-static ERTS_INLINE void do_time_init(void)
-{
- (void)do_time_reset();
-}
-
-#else
erts_smp_atomic_t do_time; /* set at clock interrupt */
-static ERTS_INLINE long do_time_read(void) { return erts_smp_atomic_read(&do_time); }
-static ERTS_INLINE long do_time_update(void) { return do_time_read(); }
+static ERTS_INLINE erts_aint_t do_time_read(void) { return erts_smp_atomic_read(&do_time); }
+static ERTS_INLINE erts_aint_t do_time_update(void) { return do_time_read(); }
static ERTS_INLINE void do_time_init(void) { erts_smp_atomic_init(&do_time, 0L); }
-#endif
/* get the time (in units of itime) to the next timeout,
or -1 if there are no timeouts */
-static int next_time_internal(void) /* PRE: tiw_lock taken by caller */
+static erts_aint_t next_time_internal(void) /* PRE: tiw_lock taken by caller */
{
int i, tm, nto;
unsigned int min;
ErlTimer* p;
- long dt;
+ erts_aint_t dt;
if (tiw_nto == 0)
return -1; /* no timeouts in wheel */
+
+ if (tiw_min_ptr) {
+ min = tiw_min;
+ dt = do_time_read();
+ return ((min >= dt) ? (min - dt) : 0);
+ }
/* start going through wheel to find next timeout */
tm = nto = 0;
@@ -185,11 +142,17 @@ static int next_time_internal(void) /* PRE: tiw_lock taken by caller */
if (p->count == 0) {
/* found next timeout */
dt = do_time_read();
+ /* p->count is zero */
+ tiw_min_ptr = p;
+ tiw_min = tm;
return ((tm >= dt) ? (tm - dt) : 0);
} else {
/* keep shortest time in 'min' */
- if (tm + p->count*TIW_SIZE < min)
+ if (tm + p->count*TIW_SIZE < min) {
min = tm + p->count*TIW_SIZE;
+ tiw_min_ptr = p;
+ tiw_min = min;
+ }
}
p = p->next;
}
@@ -202,11 +165,35 @@ static int next_time_internal(void) /* PRE: tiw_lock taken by caller */
return ((min >= dt) ? (min - dt) : 0);
}
-#if !defined(ERTS_TIMER_THREAD)
+static void remove_timer(ErlTimer *p) {
+ /* first */
+ if (!p->prev) {
+ tiw[p->slot] = p->next;
+ if(p->next)
+ p->next->prev = NULL;
+ } else {
+ p->prev->next = p->next;
+ }
+
+ /* last */
+ if (!p->next) {
+ if (p->prev)
+ p->prev->next = NULL;
+ } else {
+ p->next->prev = p->prev;
+ }
+
+ p->next = NULL;
+ p->prev = NULL;
+ /* Make sure cancel callback isn't called */
+ p->active = 0;
+ tiw_nto--;
+}
+
/* Private export to erl_time_sup.c */
-int next_time(void)
+erts_aint_t erts_next_time(void)
{
- int ret;
+ erts_aint_t ret;
erts_smp_mtx_lock(&tiw_lock);
(void)do_time_update();
@@ -214,14 +201,13 @@ int next_time(void)
erts_smp_mtx_unlock(&tiw_lock);
return ret;
}
-#endif
-static ERTS_INLINE void bump_timer_internal(long dt) /* PRE: tiw_lock is write-locked */
+static ERTS_INLINE void bump_timer_internal(erts_aint_t dt) /* PRE: tiw_lock is write-locked */
{
Uint keep_pos;
Uint count;
ErlTimer *p, **prev, *timeout_head, **timeout_tail;
- Uint dtime = (unsigned long)dt;
+ Uint dtime = (Uint) dt;
/* no need to bump the position if there aren't any timeouts */
if (tiw_nto == 0) {
@@ -242,12 +228,16 @@ static ERTS_INLINE void bump_timer_internal(long dt) /* PRE: tiw_lock is write-l
if (tiw_pos == keep_pos) count--;
prev = &tiw[tiw_pos];
while ((p = *prev) != NULL) {
+ ASSERT( p != p->next);
if (p->count < count) { /* we have a timeout */
- *prev = p->next; /* Remove from list */
- tiw_nto--;
- p->next = NULL;
- p->active = 0; /* Make sure cancel callback
- isn't called */
+ /* remove min time */
+ if (tiw_min_ptr == p) {
+ tiw_min_ptr = NULL;
+ tiw_min = 0;
+ }
+
+ /* Remove from list */
+ remove_timer(p);
*timeout_tail = p; /* Insert in timeout queue */
timeout_tail = &p->next;
}
@@ -261,6 +251,8 @@ static ERTS_INLINE void bump_timer_internal(long dt) /* PRE: tiw_lock is write-l
dtime--;
}
tiw_pos = keep_pos;
+ if (tiw_min_ptr)
+ tiw_min -= dt;
erts_smp_mtx_unlock(&tiw_lock);
@@ -275,24 +267,17 @@ static ERTS_INLINE void bump_timer_internal(long dt) /* PRE: tiw_lock is write-l
* callback is called.
*/
p->next = NULL;
+ p->prev = NULL;
p->slot = 0;
(*p->timeout)(p->arg);
}
}
-#if defined(ERTS_TIMER_THREAD)
-static void timer_thread_bump_timer(void)
-{
- erts_smp_mtx_lock(&tiw_lock);
- bump_timer_internal(do_time_reset());
-}
-#else
-void bump_timer(long dt) /* dt is value from do_time */
+void erts_bump_timer(erts_aint_t dt) /* dt is value from do_time */
{
erts_smp_mtx_lock(&tiw_lock);
bump_timer_internal(dt);
}
-#endif
Uint
erts_timer_wheel_memory_size(void)
@@ -300,82 +285,10 @@ erts_timer_wheel_memory_size(void)
return (Uint) TIW_SIZE * sizeof(ErlTimer*);
}
-#if defined(ERTS_TIMER_THREAD)
-static struct erts_iwait *timer_thread_iwait;
-
-static int timer_thread_setup_delay(SysTimeval *rem_time)
-{
- long elapsed;
- int ticks;
-
- erts_smp_mtx_lock(&tiw_lock);
- elapsed = do_time_update();
- ticks = next_time_internal();
- if (ticks == -1) /* timer queue empty */
- ticks = 100*1000*1000;
- if (elapsed > ticks)
- elapsed = ticks;
- ticks -= elapsed;
- //ticks *= CLOCK_RESOLUTION;
- rem_time->tv_sec = ticks / 1000;
- rem_time->tv_usec = 1000 * (ticks % 1000);
- ticks_end = ticks;
- erts_smp_mtx_unlock(&tiw_lock);
- return ticks;
-}
-
-static void *timer_thread_start(void *ignore)
-{
- SysTimeval delay;
-
-#ifdef ERTS_ENABLE_LOCK_CHECK
- erts_lc_set_thread_name("timer");
-#endif
- erts_register_blockable_thread();
-
- for(;;) {
- if (timer_thread_setup_delay(&delay)) {
- erts_smp_activity_begin(ERTS_ACTIVITY_WAIT, NULL, NULL, NULL);
- ASSERT_NO_LOCKED_LOCKS;
- erts_iwait_wait(timer_thread_iwait, &delay);
- ASSERT_NO_LOCKED_LOCKS;
- erts_smp_activity_end(ERTS_ACTIVITY_WAIT, NULL, NULL, NULL);
- }
- else
- erts_smp_chk_system_block(NULL, NULL, NULL);
- timer_thread_bump_timer();
- ASSERT_NO_LOCKED_LOCKS;
- }
- /*NOTREACHED*/
- return NULL;
-}
-
-static ERTS_INLINE void timer_thread_post_insert(Uint ticks)
-{
- if ((Sint)ticks < ticks_end)
- erts_iwait_interrupt(timer_thread_iwait);
-}
-
-static void timer_thread_init(void)
-{
- erts_thr_opts_t opts = ERTS_THR_OPTS_DEFAULT_INITER;
- erts_tid_t tid;
-
- opts->detached = 1;
-
- timer_thread_iwait = erts_iwait_init();
- erts_thr_create(&tid, timer_thread_start, NULL, &opts);
-}
-
-#else
-static ERTS_INLINE void timer_thread_post_insert(Uint ticks) { }
-static ERTS_INLINE void timer_thread_init(void) { }
-#endif
-
/* this routine links the time cells into a free list at the start
and sets the time queue as empty */
void
-init_time(void)
+erts_init_time(void)
{
int i;
@@ -391,10 +304,13 @@ init_time(void)
tiw[i] = NULL;
do_time_init();
tiw_pos = tiw_nto = 0;
-
- timer_thread_init();
+ tiw_min_ptr = NULL;
+ tiw_min = 0;
}
+
+
+
/*
** Insert a process into the time queue, with a timeout 't'
*/
@@ -424,16 +340,31 @@ insert_timer(ErlTimer* p, Uint t)
/* insert at head of list at slot */
p->next = tiw[tm];
+ p->prev = NULL;
+ if (p->next != NULL)
+ p->next->prev = p;
tiw[tm] = p;
- tiw_nto++;
- timer_thread_post_insert(ticks);
+
+ /* insert min time */
+ if ((tiw_nto == 0) || ((tiw_min_ptr != NULL) && (ticks < tiw_min))) {
+ tiw_min = ticks;
+ tiw_min_ptr = p;
+ }
+ if ((tiw_min_ptr == p) && (ticks > tiw_min)) {
+ /* some other timer might be 'min' now */
+ tiw_min = 0;
+ tiw_min_ptr = NULL;
+ }
+
+ tiw_nto++;
}
void
-erl_set_timer(ErlTimer* p, ErlTimeoutProc timeout, ErlCancelProc cancel,
+erts_set_timer(ErlTimer* p, ErlTimeoutProc timeout, ErlCancelProc cancel,
void* arg, Uint t)
{
+
erts_deliver_time();
erts_smp_mtx_lock(&tiw_lock);
if (p->active) { /* XXX assert ? */
@@ -446,42 +377,34 @@ erl_set_timer(ErlTimer* p, ErlTimeoutProc timeout, ErlCancelProc cancel,
p->active = 1;
insert_timer(p, t);
erts_smp_mtx_unlock(&tiw_lock);
-#if defined(ERTS_SMP) && !defined(ERTS_TIMER_THREAD)
+#if defined(ERTS_SMP)
if (t <= (Uint) LONG_MAX)
erts_sys_schedule_interrupt_timed(1, (long) t);
#endif
}
void
-erl_cancel_timer(ErlTimer* p)
+erts_cancel_timer(ErlTimer* p)
{
- ErlTimer *tp;
- ErlTimer **prev;
-
erts_smp_mtx_lock(&tiw_lock);
if (!p->active) { /* allow repeated cancel (drivers) */
erts_smp_mtx_unlock(&tiw_lock);
return;
}
- /* find p in linked list at slot p->slot and remove it */
- prev = &tiw[p->slot];
- while ((tp = *prev) != NULL) {
- if (tp == p) {
- *prev = p->next; /* Remove from list */
- tiw_nto--;
- p->next = NULL;
- p->slot = p->count = 0;
- p->active = 0;
- if (p->cancel != NULL) {
- erts_smp_mtx_unlock(&tiw_lock);
- (*p->cancel)(p->arg);
- } else {
- erts_smp_mtx_unlock(&tiw_lock);
- }
- return;
- } else {
- prev = &tp->next;
- }
+
+ /* is it the 'min' timer, remove min */
+ if (p == tiw_min_ptr) {
+ tiw_min_ptr = NULL;
+ tiw_min = 0;
+ }
+
+ remove_timer(p);
+ p->slot = p->count = 0;
+
+ if (p->cancel != NULL) {
+ erts_smp_mtx_unlock(&tiw_lock);
+ (*p->cancel)(p->arg);
+ return;
}
erts_smp_mtx_unlock(&tiw_lock);
}
@@ -493,10 +416,10 @@ erl_cancel_timer(ErlTimer* p)
immediately if it hadn't been cancelled).
*/
Uint
-time_left(ErlTimer *p)
+erts_time_left(ErlTimer *p)
{
Uint left;
- long dt;
+ erts_aint_t dt;
erts_smp_mtx_lock(&tiw_lock);
@@ -517,12 +440,11 @@ time_left(ErlTimer *p)
erts_smp_mtx_unlock(&tiw_lock);
- return left * itime;
+ return (Uint) left * itime;
}
#ifdef DEBUG
-
-void p_slpq()
+void erts_p_slpq()
{
int i;
ErlTimer* p;
@@ -551,5 +473,4 @@ void p_slpq()
erts_smp_mtx_unlock(&tiw_lock);
}
-
#endif /* DEBUG */
diff --git a/erts/emulator/beam/utils.c b/erts/emulator/beam/utils.c
index ab5e8b5d4a..6b4f3b3b36 100644
--- a/erts/emulator/beam/utils.c
+++ b/erts/emulator/beam/utils.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -59,13 +59,6 @@
/* profile_scheduler mini message queue */
-#ifdef ERTS_TIMER_THREAD
-/* A timer thread is not welcomed with this lock violation work around.
- * - Bj�rn-Egil
- */
-#error Timer thread may not be enabled due to lock violation.
-#endif
-
typedef struct {
Uint scheduler_id;
Uint no_schedulers;
@@ -98,7 +91,7 @@ dispatch_profile_msg_q(profile_sched_msg_q *psmq)
Eterm*
-erts_heap_alloc(Process* p, Uint need)
+erts_heap_alloc(Process* p, Uint need, Uint xtra)
{
ErlHeapFragment* bp;
Eterm* htop;
@@ -124,7 +117,7 @@ erts_heap_alloc(Process* p, Uint need)
p->space_verified_from = NULL;
#endif /* FORCE_HEAP_FRAGS */
- n = need;
+ n = need + xtra;
bp = MBUF(p);
if (bp != NULL && need <= (bp->alloc_size - bp->used_size)) {
Eterm* ret = bp->mem + bp->used_size;
@@ -160,7 +153,7 @@ erts_heap_alloc(Process* p, Uint need)
bp->next = MBUF(p);
MBUF(p) = bp;
bp->alloc_size = n;
- bp->used_size = n;
+ bp->used_size = need;
MBUF_SIZE(p) += n;
bp->off_heap.first = NULL;
bp->off_heap.overhead = 0;
@@ -1901,34 +1894,36 @@ erts_destroy_tmp_dsbuf(erts_dsprintf_buf_t *dsbufp)
erts_free(ERTS_ALC_T_TMP_DSBUF, (void *) dsbufp);
}
-
/* eq and cmp are written as separate functions a eq is a little faster */
/*
* Test for equality of two terms.
* Returns 0 if not equal, or a non-zero value otherwise.
*/
-
+#if HALFWORD_HEAP
+int eq_rel(Eterm a, Eterm* a_base, Eterm b, Eterm* b_base)
+#else
int eq(Eterm a, Eterm b)
+#endif
{
DECLARE_WSTACK(stack);
Sint sz;
Eterm* aa;
- Eterm* bb;
+ Eterm* bb;
tailrecur:
- if (a == b) goto pop_next;
+ if (is_same(a, a_base, b, b_base)) goto pop_next;
tailrecur_ne:
switch (primary_tag(a)) {
case TAG_PRIMARY_LIST:
if (is_list(b)) {
- Eterm* aval = list_val(a);
- Eterm* bval = list_val(b);
+ Eterm* aval = list_val_rel(a, a_base);
+ Eterm* bval = list_val_rel(b, b_base);
while (1) {
Eterm atmp = CAR(aval);
Eterm btmp = CAR(bval);
- if (atmp != btmp) {
+ if (!is_same(atmp,a_base,btmp,b_base)) {
WSTACK_PUSH2(stack,(UWord) CDR(bval),(UWord) CDR(aval));
a = atmp;
b = btmp;
@@ -1936,7 +1931,7 @@ tailrecur_ne:
}
atmp = CDR(aval);
btmp = CDR(bval);
- if (atmp == btmp) {
+ if (is_same(atmp,a_base,btmp,b_base)) {
goto pop_next;
}
if (is_not_list(atmp) || is_not_list(btmp)) {
@@ -1944,22 +1939,22 @@ tailrecur_ne:
b = btmp;
goto tailrecur_ne;
}
- aval = list_val(atmp);
- bval = list_val(btmp);
+ aval = list_val_rel(atmp, a_base);
+ bval = list_val_rel(btmp, b_base);
}
}
break; /* not equal */
case TAG_PRIMARY_BOXED:
{
- Eterm hdr = *boxed_val(a);
+ Eterm hdr = *boxed_val_rel(a,a_base);
switch (hdr & _TAG_HEADER_MASK) {
case ARITYVAL_SUBTAG:
{
- aa = tuple_val(a);
- if (!is_boxed(b) || *boxed_val(b) != *aa)
+ aa = tuple_val_rel(a, a_base);
+ if (!is_boxed(b) || *boxed_val_rel(b,b_base) != *aa)
goto not_equal;
- bb = tuple_val(b);
+ bb = tuple_val_rel(b,b_base);
if ((sz = arityval(*aa)) == 0) goto pop_next;
++aa;
++bb;
@@ -1978,16 +1973,16 @@ tailrecur_ne:
Uint a_bitoffs;
Uint b_bitoffs;
- if (is_not_binary(b)) {
+ if (!is_binary_rel(b,b_base)) {
goto not_equal;
}
- a_size = binary_size(a);
- b_size = binary_size(b);
+ a_size = binary_size_rel(a,a_base);
+ b_size = binary_size_rel(b,b_base);
if (a_size != b_size) {
goto not_equal;
}
- ERTS_GET_BINARY_BYTES(a, a_ptr, a_bitoffs, a_bitsize);
- ERTS_GET_BINARY_BYTES(b, b_ptr, b_bitoffs, b_bitsize);
+ ERTS_GET_BINARY_BYTES_REL(a, a_ptr, a_bitoffs, a_bitsize, a_base);
+ ERTS_GET_BINARY_BYTES_REL(b, b_ptr, b_bitoffs, b_bitsize, b_base);
if ((a_bitsize | b_bitsize | a_bitoffs | b_bitoffs) == 0) {
if (sys_memcmp(a_ptr, b_ptr, a_size) == 0) goto pop_next;
} else if (a_bitsize == b_bitsize) {
@@ -1998,9 +1993,9 @@ tailrecur_ne:
}
case EXPORT_SUBTAG:
{
- if (is_export(b)) {
- Export* a_exp = *((Export **) (export_val(a) + 1));
- Export* b_exp = *((Export **) (export_val(b) + 1));
+ if (is_export_rel(b,b_base)) {
+ Export* a_exp = *((Export **) (export_val_rel(a,a_base) + 1));
+ Export* b_exp = *((Export **) (export_val_rel(b,b_base) + 1));
if (a_exp == b_exp) goto pop_next;
}
break; /* not equal */
@@ -2010,10 +2005,10 @@ tailrecur_ne:
ErlFunThing* f1;
ErlFunThing* f2;
- if (is_not_fun(b))
+ if (!is_fun_rel(b,b_base))
goto not_equal;
- f1 = (ErlFunThing *) fun_val(a);
- f2 = (ErlFunThing *) fun_val(b);
+ f1 = (ErlFunThing *) fun_val_rel(a,a_base);
+ f2 = (ErlFunThing *) fun_val_rel(b,b_base);
if (f1->fe->module != f2->fe->module ||
f1->fe->old_index != f2->fe->old_index ||
f1->fe->old_uniq != f2->fe->old_uniq ||
@@ -2031,15 +2026,15 @@ tailrecur_ne:
ExternalThing *ap;
ExternalThing *bp;
- if(is_not_external(b))
+ if(!is_external_rel(b,b_base))
goto not_equal;
- ap = external_thing_ptr(a);
- bp = external_thing_ptr(b);
+ ap = external_thing_ptr_rel(a,a_base);
+ bp = external_thing_ptr_rel(b,b_base);
if(ap->header == bp->header && ap->node == bp->node) {
- ASSERT(1 == external_data_words(a));
- ASSERT(1 == external_data_words(b));
+ ASSERT(1 == external_data_words_rel(a,a_base));
+ ASSERT(1 == external_data_words_rel(b,b_base));
if (ap->data.ui[0] == bp->data.ui[0]) goto pop_next;
}
@@ -2057,27 +2052,36 @@ tailrecur_ne:
Uint alen;
Uint blen;
Uint i;
+ ExternalThing* athing;
+ ExternalThing* bthing;
- if(is_not_external_ref(b))
+ if(!is_external_ref_rel(b,b_base))
goto not_equal;
- if(external_node(a) != external_node(b))
+ athing = external_thing_ptr_rel(a,a_base);
+ bthing = external_thing_ptr_rel(b,b_base);
+
+ if(athing->node != bthing->node)
goto not_equal;
- anum = external_ref_numbers(a);
- bnum = external_ref_numbers(b);
- alen = external_ref_no_of_numbers(a);
- blen = external_ref_no_of_numbers(b);
+ anum = external_thing_ref_numbers(athing);
+ bnum = external_thing_ref_numbers(bthing);
+ alen = external_thing_ref_no_of_numbers(athing);
+ blen = external_thing_ref_no_of_numbers(bthing);
goto ref_common;
case REF_SUBTAG:
-
- if (is_not_internal_ref(b))
+ if (!is_internal_ref_rel(b,b_base))
goto not_equal;
- alen = internal_ref_no_of_numbers(a);
- blen = internal_ref_no_of_numbers(b);
- anum = internal_ref_numbers(a);
- bnum = internal_ref_numbers(b);
+
+ {
+ RefThing* athing = ref_thing_ptr_rel(a,a_base);
+ RefThing* bthing = ref_thing_ptr_rel(b,b_base);
+ alen = internal_thing_ref_no_of_numbers(athing);
+ blen = internal_thing_ref_no_of_numbers(bthing);
+ anum = internal_thing_ref_numbers(athing);
+ bnum = internal_thing_ref_numbers(bthing);
+ }
ref_common:
ASSERT(alen > 0 && blen > 0);
@@ -2122,10 +2126,10 @@ tailrecur_ne:
{
int i;
- if (is_not_big(b))
+ if (!is_big_rel(b,b_base))
goto not_equal;
- aa = big_val(a); /* get pointer to thing */
- bb = big_val(b);
+ aa = big_val_rel(a,a_base);
+ bb = big_val_rel(b,b_base);
if (*aa != *bb)
goto not_equal;
i = BIG_ARITY(aa);
@@ -2140,9 +2144,9 @@ tailrecur_ne:
FloatDef af;
FloatDef bf;
- if (is_float(b)) {
- GET_DOUBLE(a, af);
- GET_DOUBLE(b, bf);
+ if (is_float_rel(b,b_base)) {
+ GET_DOUBLE_REL(a, af, a_base);
+ GET_DOUBLE_REL(b, bf, b_base);
if (af.fd == bf.fd) goto pop_next;
}
break; /* not equal */
@@ -2161,7 +2165,7 @@ term_array: /* arrays in 'aa' and 'bb', length in 'sz' */
Eterm* bp = bb;
Sint i = sz;
for (;;) {
- if (*ap != *bp) break;
+ if (!is_same(*ap,a_base,*bp,b_base)) break;
if (--i == 0) goto pop_next;
++ap;
++bp;
@@ -2250,7 +2254,11 @@ static int cmp_atoms(Eterm a, Eterm b)
bb->name+3, bb->len-3);
}
+#if HALFWORD_HEAP
+Sint cmp_rel(Eterm a, Eterm* a_base, Eterm b, Eterm* b_base)
+#else
Sint cmp(Eterm a, Eterm b)
+#endif
{
DECLARE_WSTACK(stack);
Eterm* aa;
@@ -2284,7 +2292,7 @@ Sint cmp(Eterm a, Eterm b)
tailrecur:
- if (a == b) { /* Equal values or pointers. */
+ if (is_same(a,a_base,b,b_base)) { /* Equal values or pointers. */
goto pop_next;
}
tailrecur_ne:
@@ -2310,9 +2318,9 @@ tailrecur_ne:
if (is_internal_port(b)) {
bnode = erts_this_node;
bdata = internal_port_data(b);
- } else if (is_external_port(b)) {
- bnode = external_port_node(b);
- bdata = external_port_data(b);
+ } else if (is_external_port_rel(b,b_base)) {
+ bnode = external_port_node_rel(b,b_base);
+ bdata = external_port_data_rel(b,b_base);
} else {
a_tag = PORT_DEF;
goto mixed_types;
@@ -2328,9 +2336,9 @@ tailrecur_ne:
if (is_internal_pid(b)) {
bnode = erts_this_node;
bdata = internal_pid_data(b);
- } else if (is_external_pid(b)) {
- bnode = external_pid_node(b);
- bdata = external_pid_data(b);
+ } else if (is_external_pid_rel(b,b_base)) {
+ bnode = external_pid_node_rel(b,b_base);
+ bdata = external_pid_data_rel(b,b_base);
} else {
a_tag = PID_DEF;
goto mixed_types;
@@ -2363,12 +2371,12 @@ tailrecur_ne:
a_tag = LIST_DEF;
goto mixed_types;
}
- aa = list_val(a);
- bb = list_val(b);
+ aa = list_val_rel(a,a_base);
+ bb = list_val_rel(b,b_base);
while (1) {
Eterm atmp = CAR(aa);
Eterm btmp = CAR(bb);
- if (atmp != btmp) {
+ if (!is_same(atmp,a_base,btmp,b_base)) {
WSTACK_PUSH2(stack,(UWord) CDR(bb),(UWord) CDR(aa));
a = atmp;
b = btmp;
@@ -2376,7 +2384,7 @@ tailrecur_ne:
}
atmp = CDR(aa);
btmp = CDR(bb);
- if (atmp == btmp) {
+ if (is_same(atmp,a_base,btmp,b_base)) {
goto pop_next;
}
if (is_not_list(atmp) || is_not_list(btmp)) {
@@ -2384,20 +2392,20 @@ tailrecur_ne:
b = btmp;
goto tailrecur_ne;
}
- aa = list_val(atmp);
- bb = list_val(btmp);
+ aa = list_val_rel(atmp,a_base);
+ bb = list_val_rel(btmp,b_base);
}
case TAG_PRIMARY_BOXED:
{
- Eterm ahdr = *boxed_val(a);
+ Eterm ahdr = *boxed_val_rel(a,a_base);
switch ((ahdr & _TAG_HEADER_MASK) >> _TAG_PRIMARY_SIZE) {
case (_TAG_HEADER_ARITYVAL >> _TAG_PRIMARY_SIZE):
- if (is_not_tuple(b)) {
+ if (!is_tuple_rel(b,b_base)) {
a_tag = TUPLE_DEF;
goto mixed_types;
}
- aa = tuple_val(a);
- bb = tuple_val(b);
+ aa = tuple_val_rel(a,a_base);
+ bb = tuple_val_rel(b,b_base);
/* compare the arities */
i = arityval(ahdr); /* get the arity*/
if (i != arityval(*bb)) {
@@ -2411,31 +2419,31 @@ tailrecur_ne:
goto term_array;
case (_TAG_HEADER_FLOAT >> _TAG_PRIMARY_SIZE):
- if (is_not_float(b)) {
+ if (!is_float_rel(b,b_base)) {
a_tag = FLOAT_DEF;
goto mixed_types;
} else {
FloatDef af;
FloatDef bf;
- GET_DOUBLE(a, af);
- GET_DOUBLE(b, bf);
+ GET_DOUBLE_REL(a, af, a_base);
+ GET_DOUBLE_REL(b, bf, b_base);
ON_CMP_GOTO(float_comp(af.fd, bf.fd));
}
case (_TAG_HEADER_POS_BIG >> _TAG_PRIMARY_SIZE):
case (_TAG_HEADER_NEG_BIG >> _TAG_PRIMARY_SIZE):
- if (is_not_big(b)) {
+ if (!is_big_rel(b,b_base)) {
a_tag = BIG_DEF;
goto mixed_types;
}
- ON_CMP_GOTO(big_comp(a, b));
+ ON_CMP_GOTO(big_comp(rterm2wterm(a,a_base), rterm2wterm(b,b_base)));
case (_TAG_HEADER_EXPORT >> _TAG_PRIMARY_SIZE):
- if (is_not_export(b)) {
+ if (!is_export_rel(b,b_base)) {
a_tag = EXPORT_DEF;
goto mixed_types;
} else {
- Export* a_exp = *((Export **) (export_val(a) + 1));
- Export* b_exp = *((Export **) (export_val(b) + 1));
+ Export* a_exp = *((Export **) (export_val_rel(a,a_base) + 1));
+ Export* b_exp = *((Export **) (export_val_rel(b,b_base) + 1));
if ((j = cmp_atoms(a_exp->code[0], b_exp->code[0])) != 0) {
RETURN_NEQ(j);
@@ -2447,12 +2455,12 @@ tailrecur_ne:
}
break;
case (_TAG_HEADER_FUN >> _TAG_PRIMARY_SIZE):
- if (is_not_fun(b)) {
+ if (!is_fun_rel(b,b_base)) {
a_tag = FUN_DEF;
goto mixed_types;
} else {
- ErlFunThing* f1 = (ErlFunThing *) fun_val(a);
- ErlFunThing* f2 = (ErlFunThing *) fun_val(b);
+ ErlFunThing* f1 = (ErlFunThing *) fun_val_rel(a,a_base);
+ ErlFunThing* f2 = (ErlFunThing *) fun_val_rel(b,b_base);
Sint diff;
diff = cmpbytes(atom_tab(atom_val(f1->fe->module))->name,
@@ -2484,51 +2492,57 @@ tailrecur_ne:
if (is_internal_pid(b)) {
bnode = erts_this_node;
bdata = internal_pid_data(b);
- } else if (is_external_pid(b)) {
- bnode = external_pid_node(b);
- bdata = external_pid_data(b);
+ } else if (is_external_pid_rel(b,b_base)) {
+ bnode = external_pid_node_rel(b,b_base);
+ bdata = external_pid_data_rel(b,b_base);
} else {
a_tag = EXTERNAL_PID_DEF;
goto mixed_types;
}
- anode = external_pid_node(a);
- adata = external_pid_data(a);
+ anode = external_pid_node_rel(a,a_base);
+ adata = external_pid_data_rel(a,a_base);
goto pid_common;
case (_TAG_HEADER_EXTERNAL_PORT >> _TAG_PRIMARY_SIZE):
if (is_internal_port(b)) {
bnode = erts_this_node;
bdata = internal_port_data(b);
- } else if (is_external_port(b)) {
- bnode = external_port_node(b);
- bdata = external_port_data(b);
+ } else if (is_external_port_rel(b,b_base)) {
+ bnode = external_port_node_rel(b,b_base);
+ bdata = external_port_data_rel(b,b_base);
} else {
a_tag = EXTERNAL_PORT_DEF;
goto mixed_types;
}
- anode = external_port_node(a);
- adata = external_port_data(a);
+ anode = external_port_node_rel(a,a_base);
+ adata = external_port_data_rel(a,a_base);
goto port_common;
case (_TAG_HEADER_REF >> _TAG_PRIMARY_SIZE):
/*
* Note! When comparing refs we need to compare ref numbers
* (32-bit words), *not* ref data words.
*/
+
- if (is_internal_ref(b)) {
+ if (is_internal_ref_rel(b,b_base)) {
+ RefThing* bthing = ref_thing_ptr_rel(b,b_base);
bnode = erts_this_node;
- bnum = internal_ref_numbers(b);
- blen = internal_ref_no_of_numbers(b);
- } else if(is_external_ref(b)) {
- bnode = external_ref_node(b);
- bnum = external_ref_numbers(b);
- blen = external_ref_no_of_numbers(b);
+ bnum = internal_thing_ref_numbers(bthing);
+ blen = internal_thing_ref_no_of_numbers(bthing);
+ } else if(is_external_ref_rel(b,b_base)) {
+ ExternalThing* bthing = external_thing_ptr_rel(b,b_base);
+ bnode = bthing->node;
+ bnum = external_thing_ref_numbers(bthing);
+ blen = external_thing_ref_no_of_numbers(bthing);
} else {
a_tag = REF_DEF;
goto mixed_types;
}
- anode = erts_this_node;
- anum = internal_ref_numbers(a);
- alen = internal_ref_no_of_numbers(a);
+ {
+ RefThing* athing = ref_thing_ptr_rel(a,a_base);
+ anode = erts_this_node;
+ anum = internal_thing_ref_numbers(athing);
+ alen = internal_thing_ref_no_of_numbers(athing);
+ }
ref_common:
CMP_NODES(anode, bnode);
@@ -2557,31 +2571,36 @@ tailrecur_ne:
RETURN_NEQ((Sint32) (anum[i] - bnum[i]));
goto pop_next;
case (_TAG_HEADER_EXTERNAL_REF >> _TAG_PRIMARY_SIZE):
- if (is_internal_ref(b)) {
+ if (is_internal_ref_rel(b,b_base)) {
+ RefThing* bthing = ref_thing_ptr_rel(b,b_base);
bnode = erts_this_node;
- bnum = internal_ref_numbers(b);
- blen = internal_ref_no_of_numbers(b);
- } else if (is_external_ref(b)) {
- bnode = external_ref_node(b);
- bnum = external_ref_numbers(b);
- blen = external_ref_no_of_numbers(b);
+ bnum = internal_thing_ref_numbers(bthing);
+ blen = internal_thing_ref_no_of_numbers(bthing);
+ } else if (is_external_ref_rel(b,b_base)) {
+ ExternalThing* bthing = external_thing_ptr_rel(b,b_base);
+ bnode = bthing->node;
+ bnum = external_thing_ref_numbers(bthing);
+ blen = external_thing_ref_no_of_numbers(bthing);
} else {
a_tag = EXTERNAL_REF_DEF;
goto mixed_types;
}
- anode = external_ref_node(a);
- anum = external_ref_numbers(a);
- alen = external_ref_no_of_numbers(a);
+ {
+ ExternalThing* athing = external_thing_ptr_rel(a,a_base);
+ anode = athing->node;
+ anum = external_thing_ref_numbers(athing);
+ alen = external_thing_ref_no_of_numbers(athing);
+ }
goto ref_common;
default:
/* Must be a binary */
- ASSERT(is_binary(a));
- if (is_not_binary(b)) {
+ ASSERT(is_binary_rel(a,a_base));
+ if (!is_binary_rel(b,b_base)) {
a_tag = BINARY_DEF;
goto mixed_types;
} else {
- Uint a_size = binary_size(a);
- Uint b_size = binary_size(b);
+ Uint a_size = binary_size_rel(a,a_base);
+ Uint b_size = binary_size_rel(b,b_base);
Uint a_bitsize;
Uint b_bitsize;
Uint a_bitoffs;
@@ -2590,8 +2609,8 @@ tailrecur_ne:
int cmp;
byte* a_ptr;
byte* b_ptr;
- ERTS_GET_BINARY_BYTES(a, a_ptr, a_bitoffs, a_bitsize);
- ERTS_GET_BINARY_BYTES(b, b_ptr, b_bitoffs, b_bitsize);
+ ERTS_GET_BINARY_BYTES_REL(a, a_ptr, a_bitoffs, a_bitsize, a_base);
+ ERTS_GET_BINARY_BYTES_REL(b, b_ptr, b_bitoffs, b_bitsize, b_base);
if ((a_bitsize | b_bitsize | a_bitoffs | b_bitoffs) == 0) {
min_size = (a_size < b_size) ? a_size : b_size;
if ((cmp = sys_memcmp(a_ptr, b_ptr, min_size)) != 0) {
@@ -2618,7 +2637,6 @@ tailrecur_ne:
*/
mixed_types:
- b_tag = tag_val_def(b);
{
FloatDef f1, f2;
@@ -2628,39 +2646,47 @@ tailrecur_ne:
#else
Eterm *big_buf = erts_get_scheduler_data()->cmp_tmp_heap;
#endif
+#if HALFWORD_HEAP
+ Wterm aw = is_immed(a) ? a : rterm2wterm(a,a_base);
+ Wterm bw = is_immed(b) ? b : rterm2wterm(b,b_base);
+#else
+ Eterm aw = a;
+ Eterm bw = b;
+#endif
+ b_tag = tag_val_def(bw);
switch(_NUMBER_CODE(a_tag, b_tag)) {
case SMALL_BIG:
big = small_to_big(signed_val(a), big_buf);
- j = big_comp(big, b);
+ j = big_comp(big, bw);
break;
case SMALL_FLOAT:
f1.fd = signed_val(a);
- GET_DOUBLE(b, f2);
+ GET_DOUBLE(bw, f2);
j = float_comp(f1.fd, f2.fd);
break;
case BIG_SMALL:
big = small_to_big(signed_val(b), big_buf);
- j = big_comp(a, big);
+ j = big_comp(aw, big);
break;
case BIG_FLOAT:
- if (big_to_double(a, &f1.fd) < 0) {
+ if (big_to_double(aw, &f1.fd) < 0) {
j = big_sign(a) ? -1 : 1;
} else {
- GET_DOUBLE(b, f2);
+ GET_DOUBLE(bw, f2);
j = float_comp(f1.fd, f2.fd);
}
break;
case FLOAT_SMALL:
- GET_DOUBLE(a, f1);
+ GET_DOUBLE(aw, f1);
f2.fd = signed_val(b);
j = float_comp(f1.fd, f2.fd);
break;
case FLOAT_BIG:
- if (big_to_double(b, &f2.fd) < 0) {
+ if (big_to_double(bw, &f2.fd) < 0) {
j = big_sign(b) ? 1 : -1;
} else {
- GET_DOUBLE(a, f1);
+ GET_DOUBLE(aw, f1);
j = float_comp(f1.fd, f2.fd);
}
break;
@@ -2679,7 +2705,7 @@ term_array: /* arrays in 'aa' and 'bb', length in 'i' */
while (--i) {
a = *aa++;
b = *bb++;
- if (a != b) {
+ if (!is_same(a,a_base, b,b_base)) {
if (is_atom(a) && is_atom(b)) {
if ((j = cmp_atoms(a, b)) != 0) {
goto not_equal;
@@ -3183,7 +3209,7 @@ erts_create_smp_ptimer(ErtsSmpPTimer **timer_ref,
*timer_ref = res;
- erl_set_timer(&res->timer.tm,
+ erts_set_timer(&res->timer.tm,
(ErlTimeoutProc) ptimer_timeout,
(ErlCancelProc) ptimer_cancelled,
(void*) res,
@@ -3197,7 +3223,7 @@ erts_cancel_smp_ptimer(ErtsSmpPTimer *ptimer)
ASSERT(*ptimer->timer.timer_ref == ptimer);
*ptimer->timer.timer_ref = NULL;
ptimer->timer.flags |= ERTS_PTMR_FLG_CANCELLED;
- erl_cancel_timer(&ptimer->timer.tm);
+ erts_cancel_timer(&ptimer->timer.tm);
}
}
@@ -3637,19 +3663,19 @@ erts_set_activity_error(erts_activity_error_t error, char *file, int line)
}
-static ERTS_INLINE int
+static ERTS_INLINE erts_aint32_t
threads_not_under_control(void)
{
- int res = system_block_state.threads_to_block;
+ erts_aint32_t res = system_block_state.threads_to_block;
/* Waiting is always an allowed activity... */
- res -= erts_smp_atomic_read(&erts_system_block_state.in_activity.wait);
+ res -= erts_smp_atomic32_read(&erts_system_block_state.in_activity.wait);
if (system_block_state.allowed_activities & ERTS_BS_FLG_ALLOW_GC)
- res -= erts_smp_atomic_read(&erts_system_block_state.in_activity.gc);
+ res -= erts_smp_atomic32_read(&erts_system_block_state.in_activity.gc);
if (system_block_state.allowed_activities & ERTS_BS_FLG_ALLOW_IO)
- res -= erts_smp_atomic_read(&erts_system_block_state.in_activity.io);
+ res -= erts_smp_atomic32_read(&erts_system_block_state.in_activity.io);
if (res < 0) {
ASSERT(0);
@@ -3709,7 +3735,7 @@ erts_block_system(Uint32 allowed_activities)
}
else {
- erts_smp_atomic_inc(&erts_system_block_state.do_block);
+ erts_smp_atomic32_inc(&erts_system_block_state.do_block);
/* Someone else might be waiting for us to block... */
if (do_block) {
@@ -3761,11 +3787,11 @@ erts_emergency_block_system(long timeout, Uint32 allowed_activities)
another_blocker = erts_smp_pending_system_block();
system_block_state.emergency = 1;
- erts_smp_atomic_inc(&erts_system_block_state.do_block);
+ erts_smp_atomic32_inc(&erts_system_block_state.do_block);
if (another_blocker) {
if (is_blocker()) {
- erts_smp_atomic_dec(&erts_system_block_state.do_block);
+ erts_smp_atomic32_dec(&erts_system_block_state.do_block);
res = 0;
goto done;
}
@@ -3822,7 +3848,7 @@ erts_release_system(void)
if (system_block_state.recursive_block)
system_block_state.recursive_block--;
else {
- do_block = erts_smp_atomic_dectest(&erts_system_block_state.do_block);
+ do_block = erts_smp_atomic32_dectest(&erts_system_block_state.do_block);
system_block_state.have_blocker = 0;
if (is_blockable_thread())
system_block_state.threads_to_block++;
@@ -3957,10 +3983,10 @@ erts_system_block_init(void)
/* Global state... */
- erts_smp_atomic_init(&erts_system_block_state.do_block, 0L);
- erts_smp_atomic_init(&erts_system_block_state.in_activity.wait, 0L);
- erts_smp_atomic_init(&erts_system_block_state.in_activity.gc, 0L);
- erts_smp_atomic_init(&erts_system_block_state.in_activity.io, 0L);
+ erts_smp_atomic32_init(&erts_system_block_state.do_block, 0);
+ erts_smp_atomic32_init(&erts_system_block_state.in_activity.wait, 0);
+ erts_smp_atomic32_init(&erts_system_block_state.in_activity.gc, 0);
+ erts_smp_atomic32_init(&erts_system_block_state.in_activity.io, 0);
/* Make sure blockable threads unregister when exiting... */
erts_smp_install_exit_handler(erts_unregister_blockable_thread);
diff --git a/erts/emulator/drivers/common/efile_drv.c b/erts/emulator/drivers/common/efile_drv.c
index 786fa7da77..f0ff3f54c5 100644
--- a/erts/emulator/drivers/common/efile_drv.c
+++ b/erts/emulator/drivers/common/efile_drv.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -385,7 +385,6 @@ struct t_data
ErlDrvBinary *binp;
int size;
int offset;
- char name[1];
} read_file;
struct {
struct t_readdir_buf *first_buf;
@@ -411,7 +410,7 @@ struct t_data
static void *ef_safe_alloc(Uint s)
{
void *p = EF_ALLOC(s);
- if (!p) erl_exit(1, "efile drv: Can't allocate %d bytes of memory\n", s);
+ if (!p) erl_exit(1, "efile drv: Can't allocate %lu bytes of memory\n", (unsigned long)s);
return p;
}
@@ -1117,7 +1116,7 @@ static void invoke_read_file(void *data)
Sint64 size;
if (! (d->result_ok =
- efile_openfile(&d->errInfo, d->c.read_file.name,
+ efile_openfile(&d->errInfo, d->b,
EFILE_MODE_READ, &fd, &size))) {
goto done;
}
@@ -3071,7 +3070,7 @@ file_outputv(ErlDrvData e, ErlIOVec *ev) {
d->command = command;
d->reply = !0;
/* Copy name */
- FILENAME_COPY(d->c.read_file.name, filename);
+ FILENAME_COPY(d->b, filename);
d->c.read_file.binp = NULL;
d->invoke = invoke_read_file;
d->free = free_read_file;
diff --git a/erts/emulator/drivers/common/gzio.c b/erts/emulator/drivers/common/gzio.c
index 5531a275ea..741cb6ae20 100644
--- a/erts/emulator/drivers/common/gzio.c
+++ b/erts/emulator/drivers/common/gzio.c
@@ -632,6 +632,7 @@ erts_gzseek(gzFile file, int offset, int whence)
while (s->position < pos) {
char buf[512];
int n;
+ int save_pos = s->position;
n = pos - s->position;
if (n > sizeof(buf))
@@ -643,6 +644,7 @@ erts_gzseek(gzFile file, int offset, int whence)
memset(buf, '\0', n);
erts_gzwrite(file, buf, n);
}
+ if (save_pos == s->position) break;
}
return s->position;
diff --git a/erts/emulator/drivers/common/inet_drv.c b/erts/emulator/drivers/common/inet_drv.c
index 1382d1dfe4..aec456151c 100644
--- a/erts/emulator/drivers/common/inet_drv.c
+++ b/erts/emulator/drivers/common/inet_drv.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1997-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1997-2011. 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
@@ -490,7 +490,6 @@ static int my_strncasecmp(const char *s1, const char *s2, size_t n)
#define TCP_REQ_RECV 42
#define TCP_REQ_UNRECV 43
#define TCP_REQ_SHUTDOWN 44
-#define TCP_REQ_MULTI_OP 45
/* UDP and SCTP requests */
#define PACKET_REQ_RECV 60 /* Common for UDP and SCTP */
#define SCTP_REQ_LISTEN 61 /* Different from TCP; not for UDP */
@@ -1763,7 +1762,6 @@ send_async_error(ErlDrvPort port, ErlDrvTermData Port, int Ref,
LOAD_INT_CNT + 2*LOAD_TUPLE_CNT];
int i = 0;
- i = 0;
i = LOAD_ATOM(spec, i, am_inet_async);
i = LOAD_PORT(spec, i, Port);
i = LOAD_INT(spec, i, Ref);
@@ -4945,39 +4943,45 @@ static int inet_ctl_getifaddrs(inet_descriptor* desc_p,
*buf_p++ = '\0';
*buf_p++ = INET_IFOPT_FLAGS;
put_int32(IFGET_FLAGS(ifa_p->ifa_flags), buf_p); buf_p += 4;
- if (ifa_p->ifa_addr->sa_family == AF_INET
+ if (ifa_p->ifa_addr) {
+ if (ifa_p->ifa_addr->sa_family == AF_INET
#if defined(AF_INET6)
- || ifa_p->ifa_addr->sa_family == AF_INET6
+ || ifa_p->ifa_addr->sa_family == AF_INET6
#endif
- ) {
- SOCKADDR_TO_BUF(INET_IFOPT_ADDR, ifa_p->ifa_addr);
- BUF_ENSURE(1);
- SOCKADDR_TO_BUF(INET_IFOPT_NETMASK, ifa_p->ifa_netmask);
- if (ifa_p->ifa_flags & IFF_POINTOPOINT) {
- BUF_ENSURE(1);
- SOCKADDR_TO_BUF(INET_IFOPT_DSTADDR, ifa_p->ifa_dstaddr);
- } else if (ifa_p->ifa_flags & IFF_BROADCAST) {
- BUF_ENSURE(1);
- SOCKADDR_TO_BUF(INET_IFOPT_BROADADDR, ifa_p->ifa_broadaddr);
+ ) {
+ SOCKADDR_TO_BUF(INET_IFOPT_ADDR, ifa_p->ifa_addr);
+ if (ifa_p->ifa_netmask) {
+ BUF_ENSURE(1);
+ SOCKADDR_TO_BUF(INET_IFOPT_NETMASK, ifa_p->ifa_netmask);
+ }
+ if (ifa_p->ifa_dstaddr &&
+ (ifa_p->ifa_flags & IFF_POINTOPOINT)) {
+ BUF_ENSURE(1);
+ SOCKADDR_TO_BUF(INET_IFOPT_DSTADDR, ifa_p->ifa_dstaddr);
+ } else if (ifa_p->ifa_broadaddr &&
+ (ifa_p->ifa_flags & IFF_BROADCAST)) {
+ BUF_ENSURE(1);
+ SOCKADDR_TO_BUF(INET_IFOPT_BROADADDR, ifa_p->ifa_broadaddr);
+ }
}
- }
#if defined(AF_LINK) || defined(AF_PACKET)
- else if (
+ else if (
#if defined(AF_LINK)
- ifa_p->ifa_addr->sa_family == AF_LINK
+ ifa_p->ifa_addr->sa_family == AF_LINK
#else
- 0
+ 0
#endif
#if defined(AF_PACKET)
- || ifa_p->ifa_addr->sa_family == AF_PACKET
+ || ifa_p->ifa_addr->sa_family == AF_PACKET
#endif
- ) {
- char *bp = buf_p;
- BUF_ENSURE(1);
- SOCKADDR_TO_BUF(INET_IFOPT_HWADDR, ifa_p->ifa_addr);
- if (buf_p - bp < 4) buf_p = bp; /* Empty hwaddr */
- }
+ ) {
+ char *bp = buf_p;
+ BUF_ENSURE(1);
+ SOCKADDR_TO_BUF(INET_IFOPT_HWADDR, ifa_p->ifa_addr);
+ if (buf_p - bp < 4) buf_p = bp; /* Empty hwaddr */
+ }
#endif
+ }
BUF_ENSURE(1);
*buf_p++ = '\0';
}
@@ -5044,9 +5048,17 @@ static STATUS wrap_sockopt(STATUS (*function)() /* Yep, no parameter
}
#endif
+/* Per H @ Tail-f: The original code here had problems that possibly
+ only occur if you abuse it for non-INET sockets, but anyway:
+ a) If the getsockopt for SO_PRIORITY or IP_TOS failed, the actual
+ requested setsockopt was never even attempted.
+ b) If {get,set}sockopt for one of IP_TOS and SO_PRIORITY failed,
+ but ditto for the other worked and that was actually the requested
+ option, failure was still reported to erlang. */
+
#if defined(IP_TOS) && defined(SOL_IP) && defined(SO_PRIORITY)
static int setopt_prio_tos_trick
- (int fd, int proto, int type, char* arg_ptr, int arg_sz)
+ (int fd, int proto, int type, char* arg_ptr, int arg_sz, int propagate)
{
/* The relations between SO_PRIORITY, TOS and other options
is not what you (or at least I) would expect...:
@@ -5059,6 +5071,8 @@ static int setopt_prio_tos_trick
int tmp_ival_prio;
int tmp_ival_tos;
int res;
+ int res_prio;
+ int res_tos;
#ifdef HAVE_SOCKLEN_T
socklen_t
#else
@@ -5067,28 +5081,35 @@ static int setopt_prio_tos_trick
tmp_arg_sz_prio = sizeof(tmp_ival_prio),
tmp_arg_sz_tos = sizeof(tmp_ival_tos);
- res = sock_getopt(fd, SOL_SOCKET, SO_PRIORITY,
+ res_prio = sock_getopt(fd, SOL_SOCKET, SO_PRIORITY,
(char *) &tmp_ival_prio, &tmp_arg_sz_prio);
- if (res == 0) {
- res = sock_getopt(fd, SOL_IP, IP_TOS,
+ res_tos = sock_getopt(fd, SOL_IP, IP_TOS,
(char *) &tmp_ival_tos, &tmp_arg_sz_tos);
- if (res == 0) {
res = sock_setopt(fd, proto, type, arg_ptr, arg_sz);
if (res == 0) {
if (type != SO_PRIORITY) {
- if (type != IP_TOS) {
- res = sock_setopt(fd,
+ if (type != IP_TOS && res_tos == 0) {
+ res_tos = sock_setopt(fd,
SOL_IP,
IP_TOS,
(char *) &tmp_ival_tos,
tmp_arg_sz_tos);
+ if (propagate)
+ res = res_tos;
}
- if (res == 0) {
- res = sock_setopt(fd,
+ if (res == 0 && res_prio == 0) {
+ res_prio = sock_setopt(fd,
SOL_SOCKET,
SO_PRIORITY,
(char *) &tmp_ival_prio,
tmp_arg_sz_prio);
+ if (propagate) {
+ /* Some kernels set a SO_PRIORITY by default that you are not permitted to reset,
+ silently ignore this error condition */
+ if (res_prio != 0 && sock_errno() == EPERM) {
+ res = 0;
+ } else {
+ res = res_prio;
}
}
}
@@ -5434,7 +5455,7 @@ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len)
return -1;
}
#if defined(IP_TOS) && defined(SOL_IP) && defined(SO_PRIORITY)
- res = setopt_prio_tos_trick (desc->s, proto, type, arg_ptr, arg_sz);
+ res = setopt_prio_tos_trick (desc->s, proto, type, arg_ptr, arg_sz, propagate);
#else
res = sock_setopt (desc->s, proto, type, arg_ptr, arg_sz);
#endif
@@ -5964,7 +5985,7 @@ static int sctp_set_opts(inet_descriptor* desc, char* ptr, int len)
return -1;
}
#if defined(IP_TOS) && defined(SOL_IP) && defined(SO_PRIORITY)
- res = setopt_prio_tos_trick (desc->s, proto, type, arg_ptr, arg_sz);
+ res = setopt_prio_tos_trick (desc->s, proto, type, arg_ptr, arg_sz, 1);
#else
res = sock_setopt (desc->s, proto, type, arg_ptr, arg_sz);
#endif
@@ -8527,7 +8548,9 @@ static int tcp_deliver(tcp_descriptor* desc, int len)
len = 0;
if (!desc->inet.active) {
- driver_cancel_timer(desc->inet.port);
+ if (!desc->busy_on_send) {
+ driver_cancel_timer(desc->inet.port);
+ }
sock_select(INETP(desc),(FD_READ|FD_CLOSE),0);
if (desc->i_buf != NULL)
tcp_restart_input(desc);
diff --git a/erts/emulator/drivers/unix/unix_efile.c b/erts/emulator/drivers/unix/unix_efile.c
index 6297ccb8bc..4b3934657c 100644
--- a/erts/emulator/drivers/unix/unix_efile.c
+++ b/erts/emulator/drivers/unix/unix_efile.c
@@ -620,7 +620,7 @@ efile_readdir(Efile_error* errInfo, /* Where to return error codes. */
if (IS_DOT_OR_DOTDOT(dirp->d_name))
continue;
buffer[0] = '\0';
- strncat(buffer, dirp->d_name, size-1);
+ strncat(buffer, dirp->d_name, (*size)-1);
*size = strlen(dirp->d_name);
return 1;
}
diff --git a/erts/emulator/drivers/win32/win_con.c b/erts/emulator/drivers/win32/win_con.c
index 2202ca655f..c788ad409d 100644
--- a/erts/emulator/drivers/win32/win_con.c
+++ b/erts/emulator/drivers/win32/win_con.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1997-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1997-2011. 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
@@ -704,6 +704,18 @@ FrameWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
}
write_inbuf(&c, 1);
return 0;
+ case WM_MOUSEWHEEL:
+ {
+ int delta = GET_WHEEL_DELTA_WPARAM(wParam);
+ if (delta < 0) {
+ PostMessage(hClientWnd, WM_VSCROLL, MAKELONG(SB_THUMBTRACK,
+ (iVscrollPos + 5)),0);
+ } else {
+ WORD pos = ((iVscrollPos - 5) < 0) ? 0 : (iVscrollPos - 5);
+ PostMessage(hClientWnd, WM_VSCROLL, MAKELONG(SB_THUMBTRACK,pos),0);
+ }
+ return 0;
+ }
case WM_CHAR:
c = (TCHAR)wParam;
write_inbuf(&c,1);
diff --git a/erts/emulator/drivers/win32/win_efile.c b/erts/emulator/drivers/win32/win_efile.c
index 4ec9579529..3d59564f7b 100755
--- a/erts/emulator/drivers/win32/win_efile.c
+++ b/erts/emulator/drivers/win32/win_efile.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1997-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1997-2011. 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
@@ -1016,8 +1016,8 @@ efile_write_info(Efile_error* errInfo,
} \
}
- MKTIME(ModifyFileTime, pInfo->accessTime, mtime);
- MKTIME(AccessFileTime, pInfo->modifyTime, atime);
+ MKTIME(ModifyFileTime, pInfo->modifyTime, mtime);
+ MKTIME(AccessFileTime, pInfo->accessTime, atime);
MKTIME(CreationFileTime, pInfo->cTime, ctime);
#undef MKTIME
diff --git a/erts/emulator/hipe/hipe_abi.txt b/erts/emulator/hipe/hipe_abi.txt
index aea30d262d..d0ec162342 100644
--- a/erts/emulator/hipe/hipe_abi.txt
+++ b/erts/emulator/hipe/hipe_abi.txt
@@ -2,7 +2,7 @@
%CopyrightBegin%
%CopyrightEnd%
-$Id$
+
HiPE ABI
========
diff --git a/erts/emulator/hipe/hipe_amd64.c b/erts/emulator/hipe/hipe_amd64.c
index ff87492f4d..b5dff06987 100644
--- a/erts/emulator/hipe/hipe_amd64.c
+++ b/erts/emulator/hipe/hipe_amd64.c
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2004-2011. 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%
*/
-/* $Id$
- */
+
+
#include <stddef.h> /* offsetof() */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -334,43 +334,3 @@ void hipe_arch_print_pcb(struct hipe_process_state *p)
U("narity ", narity);
#undef U
}
-
-/*
- * XXX: The following should really be moved to a generic hipe_bifs_64 file.
- */
-
-#if 0 /* unused */
-static int term_to_Sint64(Eterm term, Sint64 *sp)
-{
- return term_to_Sint(term, sp);
-}
-
-BIF_RETTYPE hipe_bifs_write_s64_2(BIF_ALIST_2)
-{
- Sint64 *address;
- Sint64 value;
-
- address = term_to_address(BIF_ARG_1);
- if (!address || !hipe_word64_address_ok(address))
- BIF_ERROR(BIF_P, BADARG);
- if (!term_to_Sint64(BIF_ARG_2, &value))
- BIF_ERROR(BIF_P, BADARG);
- *address = value;
- BIF_RET(NIL);
-}
-#endif
-
-BIF_RETTYPE hipe_bifs_write_u64_2(BIF_ALIST_2)
-{
- Uint64 *address;
- Uint64 value;
-
- address = term_to_address(BIF_ARG_1);
- if (!address || !hipe_word64_address_ok(address))
- BIF_ERROR(BIF_P, BADARG);
- if (!term_to_Uint(BIF_ARG_2, &value))
- BIF_ERROR(BIF_P, BADARG);
- *address = value;
- hipe_flush_icache_word(address);
- BIF_RET(NIL);
-}
diff --git a/erts/emulator/hipe/hipe_amd64.h b/erts/emulator/hipe/hipe_amd64.h
index 532d47c092..bf41d238dd 100644
--- a/erts/emulator/hipe/hipe_amd64.h
+++ b/erts/emulator/hipe/hipe_amd64.h
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2004-2011. 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%
*/
-/* $Id$
- */
+
+
#ifndef HIPE_AMD64_H
#define HIPE_AMD64_H
diff --git a/erts/emulator/hipe/hipe_amd64.tab b/erts/emulator/hipe/hipe_amd64.tab
index 3787bbf23b..e039d74525 100644
--- a/erts/emulator/hipe/hipe_amd64.tab
+++ b/erts/emulator/hipe/hipe_amd64.tab
@@ -1,28 +1,24 @@
#
# %CopyrightBegin%
-#
-# Copyright Ericsson AB 2004-2009. All Rights Reserved.
-#
+#
+# Copyright Ericsson AB 2004-2011. 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%
#
-# $Id$
# AMD64-specific atoms and bifs
atom amd64
atom handle_fp_exception
atom inc_stack_0
atom sse2_fnegate_mask
-
-# bif hipe_bifs:write_s64/2
-bif hipe_bifs:write_u64/2
diff --git a/erts/emulator/hipe/hipe_amd64_abi.txt b/erts/emulator/hipe/hipe_amd64_abi.txt
index 27beff4ea2..8a34bfa67f 100644
--- a/erts/emulator/hipe/hipe_amd64_abi.txt
+++ b/erts/emulator/hipe/hipe_amd64_abi.txt
@@ -2,7 +2,7 @@
%CopyrightBegin%
%CopyrightEnd%
-$Id$
+
HiPE AMD64 ABI
==============
diff --git a/erts/emulator/hipe/hipe_amd64_asm.m4 b/erts/emulator/hipe/hipe_amd64_asm.m4
index 7f563c35d8..7c81040b8b 100644
--- a/erts/emulator/hipe/hipe_amd64_asm.m4
+++ b/erts/emulator/hipe/hipe_amd64_asm.m4
@@ -2,7 +2,7 @@ changecom(`/*', `*/')dnl
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2004-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2004-2011. 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
@@ -17,9 +17,8 @@ changecom(`/*', `*/')dnl
*
* %CopyrightEnd%
*/
-/*
- * $Id$
- */
+
+
`#ifndef HIPE_AMD64_ASM_H
#define HIPE_AMD64_ASM_H'
diff --git a/erts/emulator/hipe/hipe_amd64_bifs.m4 b/erts/emulator/hipe/hipe_amd64_bifs.m4
index f7c9604e2b..0ba763cbea 100644
--- a/erts/emulator/hipe/hipe_amd64_bifs.m4
+++ b/erts/emulator/hipe/hipe_amd64_bifs.m4
@@ -2,7 +2,7 @@ changecom(`/*', `*/')dnl
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2004-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2004-2011. 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
@@ -17,9 +17,7 @@ changecom(`/*', `*/')dnl
*
* %CopyrightEnd%
*/
-/*
- * $Id$
- */
+
include(`hipe/hipe_amd64_asm.m4')
#`include' "hipe_literals.h"
diff --git a/erts/emulator/hipe/hipe_amd64_gc.h b/erts/emulator/hipe/hipe_amd64_gc.h
index 56650901d6..c5a6fee6fe 100644
--- a/erts/emulator/hipe/hipe_amd64_gc.h
+++ b/erts/emulator/hipe/hipe_amd64_gc.h
@@ -1,22 +1,22 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2004-2011. 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%
*/
-/* $Id$
+/*
* Stack walking helpers for native stack GC procedures.
*/
#ifndef HIPE_AMD64_GC_H
diff --git a/erts/emulator/hipe/hipe_amd64_glue.S b/erts/emulator/hipe/hipe_amd64_glue.S
index 3376487292..8816906870 100644
--- a/erts/emulator/hipe/hipe_amd64_glue.S
+++ b/erts/emulator/hipe/hipe_amd64_glue.S
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2004-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2004-2011. 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
@@ -16,9 +16,7 @@
*
* %CopyrightEnd%
*/
-/*
- * $Id$
- */
+
#include "hipe_amd64_asm.h"
#include "hipe_literals.h"
diff --git a/erts/emulator/hipe/hipe_amd64_glue.h b/erts/emulator/hipe/hipe_amd64_glue.h
index c92eb842cb..36508467fa 100644
--- a/erts/emulator/hipe/hipe_amd64_glue.h
+++ b/erts/emulator/hipe/hipe_amd64_glue.h
@@ -1,24 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2004-2011. 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%
*/
-/*
- * $Id$
- */
+
+
#ifndef HIPE_AMD64_GLUE_H
#define HIPE_AMD64_GLUE_H
diff --git a/erts/emulator/hipe/hipe_amd64_primops.h b/erts/emulator/hipe/hipe_amd64_primops.h
index dcfa8be92a..e3c7111997 100644
--- a/erts/emulator/hipe/hipe_amd64_primops.h
+++ b/erts/emulator/hipe/hipe_amd64_primops.h
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2005-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2005-2011. 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%
*/
-/* $Id$
- */
+
+
PRIMOP_LIST(am_inc_stack_0, &nbif_inc_stack_0)
PRIMOP_LIST(am_handle_fp_exception, &nbif_handle_fp_exception)
PRIMOP_LIST(am_sse2_fnegate_mask, &sse2_fnegate_mask)
diff --git a/erts/emulator/hipe/hipe_arch.h b/erts/emulator/hipe/hipe_arch.h
index 7803543ef1..04ed980126 100644
--- a/erts/emulator/hipe/hipe_arch.h
+++ b/erts/emulator/hipe/hipe_arch.h
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2003-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2003-2011. 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%
*/
-/* $Id$
- */
+
+
#ifndef HIPE_ARCH_H
#define HIPE_ARCH_H
diff --git a/erts/emulator/hipe/hipe_arm.c b/erts/emulator/hipe/hipe_arm.c
index b70b32947b..d52f429a9b 100644
--- a/erts/emulator/hipe/hipe_arm.c
+++ b/erts/emulator/hipe/hipe_arm.c
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2005-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2005-2011. 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%
*/
-/* $Id$
- */
+
+
#include <stddef.h> /* offsetof() */
#ifdef HAVE_CONFIG_H
#include "config.h"
diff --git a/erts/emulator/hipe/hipe_arm.h b/erts/emulator/hipe/hipe_arm.h
index 84f58a681f..19f2a986cf 100644
--- a/erts/emulator/hipe/hipe_arm.h
+++ b/erts/emulator/hipe/hipe_arm.h
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2005-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2005-2011. 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%
*/
-/* $Id$
- */
+
+
#ifndef HIPE_ARM_H
#define HIPE_ARM_H
diff --git a/erts/emulator/hipe/hipe_arm.tab b/erts/emulator/hipe/hipe_arm.tab
index 81626796a7..49b89d6748 100644
--- a/erts/emulator/hipe/hipe_arm.tab
+++ b/erts/emulator/hipe/hipe_arm.tab
@@ -1,22 +1,22 @@
#
# %CopyrightBegin%
-#
-# Copyright Ericsson AB 2005-2009. All Rights Reserved.
-#
+#
+# Copyright Ericsson AB 2005-2011. 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%
#
-# $Id$
+
# ARM-specific atoms and bifs
atom arm
diff --git a/erts/emulator/hipe/hipe_arm_abi.txt b/erts/emulator/hipe/hipe_arm_abi.txt
index 6868704d62..6778ff6663 100644
--- a/erts/emulator/hipe/hipe_arm_abi.txt
+++ b/erts/emulator/hipe/hipe_arm_abi.txt
@@ -2,7 +2,7 @@
%CopyrightBegin%
%CopyrightEnd%
-$Id$
+
HiPE ARM ABI
================
diff --git a/erts/emulator/hipe/hipe_arm_asm.m4 b/erts/emulator/hipe/hipe_arm_asm.m4
index b9a696ffff..85dc84973d 100644
--- a/erts/emulator/hipe/hipe_arm_asm.m4
+++ b/erts/emulator/hipe/hipe_arm_asm.m4
@@ -1,25 +1,24 @@
changecom(`/*', `*/')dnl
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2005-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2005-2011. 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%
*/
-/*
- * $Id$
- */
+
+
`#ifndef HIPE_ARM_ASM_H
#define HIPE_ARM_ASM_H'
diff --git a/erts/emulator/hipe/hipe_arm_bifs.m4 b/erts/emulator/hipe/hipe_arm_bifs.m4
index 4d8636e711..3664fb6502 100644
--- a/erts/emulator/hipe/hipe_arm_bifs.m4
+++ b/erts/emulator/hipe/hipe_arm_bifs.m4
@@ -1,25 +1,23 @@
changecom(`/*', `*/')dnl
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2005-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2005-2011. 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%
*/
-/*
- * $Id$
- */
+
include(`hipe/hipe_arm_asm.m4')
#`include' "hipe_literals.h"
diff --git a/erts/emulator/hipe/hipe_arm_gc.h b/erts/emulator/hipe/hipe_arm_gc.h
index a2a919e3d7..787c6fef3e 100644
--- a/erts/emulator/hipe/hipe_arm_gc.h
+++ b/erts/emulator/hipe/hipe_arm_gc.h
@@ -1,22 +1,22 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2005-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2005-2011. 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%
*/
-/* $Id$
+/*
* Stack walking helpers for native stack GC procedures.
* ARM version.
*/
diff --git a/erts/emulator/hipe/hipe_arm_glue.S b/erts/emulator/hipe/hipe_arm_glue.S
index 2bce01954e..2e2b8604a6 100644
--- a/erts/emulator/hipe/hipe_arm_glue.S
+++ b/erts/emulator/hipe/hipe_arm_glue.S
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2005-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2005-2011. 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%
*/
-/* $Id$
- */
+
+
#include "hipe_arm_asm.h"
#include "hipe_literals.h"
#define ASM
diff --git a/erts/emulator/hipe/hipe_arm_glue.h b/erts/emulator/hipe/hipe_arm_glue.h
index e840c3dc0f..165f73320d 100644
--- a/erts/emulator/hipe/hipe_arm_glue.h
+++ b/erts/emulator/hipe/hipe_arm_glue.h
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2005-2009. All Rights Reserved.
- *
+ * Copyright Ericsson AB 2005-2011. 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%
*/
-/* $Id$
- */
+
+
#ifndef HIPE_ARM_GLUE_H
#define HIPE_ARM_GLUE_H
diff --git a/erts/emulator/hipe/hipe_arm_primops.h b/erts/emulator/hipe/hipe_arm_primops.h
index a28b509eee..2a1a87b862 100644
--- a/erts/emulator/hipe/hipe_arm_primops.h
+++ b/erts/emulator/hipe/hipe_arm_primops.h
@@ -1,21 +1,21 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2005-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2005-2011. 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%
*/
-/* $Id$
- */
+
+
PRIMOP_LIST(am_inc_stack_0, &hipe_arm_inc_stack)
diff --git a/erts/emulator/hipe/hipe_bif0.c b/erts/emulator/hipe/hipe_bif0.c
index 2a877d8ace..e7fb850530 100644
--- a/erts/emulator/hipe/hipe_bif0.c
+++ b/erts/emulator/hipe/hipe_bif0.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2001-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2001-2011. 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
@@ -450,52 +450,13 @@ BIF_RETTYPE hipe_bifs_alloc_data_2(BIF_ALIST_2)
}
/*
- * Memory area for constant Erlang terms.
- *
- * These constants must not be forwarded by the gc.
- * Therefore, the gc needs to be able to distinguish between
- * collectible objects and constants. Unfortunately, an Erlang
- * process' collectible objects are scattered around in two
- * heaps and a list of message buffers, so testing "is X a
- * collectible object?" can be expensive.
- *
- * Instead, constants are placed in a single contiguous area,
- * which allows for an inexpensive "is X a constant?" test.
- *
- * XXX: Allow this area to be grown.
+ * Statistics on hipe constants: size of HiPE constants, in words.
*/
-
-/* not static, needed by garbage collector */
-Eterm *hipe_constants_start = NULL;
-Eterm *hipe_constants_next = NULL;
-static unsigned constants_avail_words = 0;
-#define CONSTANTS_BYTES (1536*1024*sizeof(Eterm)) /* 1.5 M words */
-
-static Eterm *constants_alloc(unsigned nwords)
-{
- Eterm *next;
-
- /* initialise at the first call */
- if ((next = hipe_constants_next) == NULL) {
- next = (Eterm*)erts_alloc(ERTS_ALC_T_HIPE, CONSTANTS_BYTES);
- hipe_constants_start = next;
- hipe_constants_next = next;
- constants_avail_words = CONSTANTS_BYTES / sizeof(Eterm);
- }
- if (nwords > constants_avail_words) {
- fprintf(stderr, "Native code constants pool depleted!\r\n");
- /* Must terminate immediately. erl_exit() seems to
- continue running some code which then SIGSEGVs. */
- exit(1);
- }
- constants_avail_words -= nwords;
- hipe_constants_next = next + nwords;
- return next;
-}
+unsigned int hipe_constants_size = 0;
BIF_RETTYPE hipe_bifs_constants_size_0(BIF_ALIST_0)
{
- BIF_RET(make_small(hipe_constants_next - hipe_constants_start));
+ BIF_RET(make_small(hipe_constants_size));
}
/*
@@ -526,14 +487,17 @@ static void *const_term_alloc(void *tmpl)
{
Eterm obj;
Uint size;
+ Uint alloc_size;
Eterm *hp;
struct const_term *p;
obj = (Eterm)tmpl;
ASSERT(is_not_immed(obj));
size = size_object(obj);
+ alloc_size = size + (offsetof(struct const_term, mem)/sizeof(Eterm));
+ hipe_constants_size += alloc_size;
- p = (struct const_term*)constants_alloc(size + (offsetof(struct const_term, mem)/sizeof(Eterm)));
+ p = (struct const_term*)erts_alloc(ERTS_ALC_T_HIPE, alloc_size * sizeof(Eterm));
/* I have absolutely no idea if having a private 'off_heap'
works or not. _Some_ off_heap object is required for
diff --git a/erts/emulator/hipe/hipe_bif0.h b/erts/emulator/hipe/hipe_bif0.h
index ed27d5616a..f02e8862dc 100644
--- a/erts/emulator/hipe/hipe_bif0.h
+++ b/erts/emulator/hipe/hipe_bif0.h
@@ -1,22 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
- *
+
+ *
+ * Copyright Ericsson AB 2001-2011. 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%
*/
-/* $Id$
+/*
* hipe_bif0.h
*
* Compiler and linker support.
@@ -26,10 +27,6 @@
extern Uint *hipe_bifs_find_pc_from_mfa(Eterm mfa);
-/* shared with ggc.c -- NOT an official API */
-extern Eterm *hipe_constants_start;
-extern Eterm *hipe_constants_next;
-
extern void hipe_mfa_info_table_init(void);
extern void *hipe_get_remote_na(Eterm m, Eterm f, unsigned int a);
extern Eterm hipe_find_na_or_make_stub(Process*, Eterm, Eterm, Eterm);
diff --git a/erts/emulator/hipe/hipe_bif0.tab b/erts/emulator/hipe/hipe_bif0.tab
index 46c0a3d67d..b6c6bede23 100644
--- a/erts/emulator/hipe/hipe_bif0.tab
+++ b/erts/emulator/hipe/hipe_bif0.tab
@@ -1,22 +1,22 @@
#
# %CopyrightBegin%
-#
-# Copyright Ericsson AB 2001-2009. All Rights Reserved.
-#
+#
+# Copyright Ericsson AB 2001-2011. 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%
#
-# $Id$
+#
# HiPE level 0 bifs: compiler and linker support
#
# bif hipe_bifs:name/arity
diff --git a/erts/emulator/hipe/hipe_bif1.c b/erts/emulator/hipe/hipe_bif1.c
index 8f43811537..87cdfb8c7a 100644
--- a/erts/emulator/hipe/hipe_bif1.c
+++ b/erts/emulator/hipe/hipe_bif1.c
@@ -1,22 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
- *
+
+ *
+ * Copyright Ericsson AB 2001-2011. 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%
*/
-/* $Id$
+/*
* hipe_bif1.c
*
* Performance analysis support.
diff --git a/erts/emulator/hipe/hipe_bif1.h b/erts/emulator/hipe/hipe_bif1.h
index c3b607565d..89241fb835 100644
--- a/erts/emulator/hipe/hipe_bif1.h
+++ b/erts/emulator/hipe/hipe_bif1.h
@@ -1,22 +1,22 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2001-2011. 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%
*/
-/* $Id$
+/*
* hipe_bif1.h
*
* Performance analysis support.
diff --git a/erts/emulator/hipe/hipe_bif2.c b/erts/emulator/hipe/hipe_bif2.c
index f992b758be..19cd32c68f 100644
--- a/erts/emulator/hipe/hipe_bif2.c
+++ b/erts/emulator/hipe/hipe_bif2.c
@@ -1,22 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
- *
+
+ *
+ * Copyright Ericsson AB 2001-2011. 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%
*/
-/* $Id$
+/*
* hipe_bif2.c
*
* Miscellaneous add-ons.
@@ -33,7 +34,6 @@
#include "big.h"
#include "hipe_debug.h"
#include "hipe_mode_switch.h"
-#include "hipe_bif0.h" /* hipe_constants_{start,next} */
#include "hipe_arch.h"
#include "hipe_stack.h"
@@ -124,18 +124,6 @@ BIF_RETTYPE hipe_bifs_show_term_1(BIF_ALIST_1)
BIF_RET(am_true);
}
-BIF_RETTYPE hipe_bifs_show_literals_0(BIF_ALIST_0)
-{
- Eterm *p;
-
- p = hipe_constants_start;
- for (; p < hipe_constants_next; ++p)
- printf("0x%0*lx: 0x%0*lx\r\n",
- 2*(int)sizeof(long), (unsigned long)p,
- 2*(int)sizeof(long), *p);
- BIF_RET(am_true);
-}
-
BIF_RETTYPE hipe_bifs_in_native_0(BIF_ALIST_0)
{
BIF_RET(am_false);
diff --git a/erts/emulator/hipe/hipe_bif2.tab b/erts/emulator/hipe/hipe_bif2.tab
index d8d627e370..51323ce7af 100644
--- a/erts/emulator/hipe/hipe_bif2.tab
+++ b/erts/emulator/hipe/hipe_bif2.tab
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2001-2009. All Rights Reserved.
+# Copyright Ericsson AB 2001-2011. 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
@@ -26,7 +26,6 @@ bif hipe_bifs:show_nstack/1
bif hipe_bifs:nstack_used_size/0
bif hipe_bifs:show_pcb/1
bif hipe_bifs:show_term/1
-bif hipe_bifs:show_literals/0
bif hipe_bifs:in_native/0
bif hipe_bifs:modeswitch_debug_on/0
bif hipe_bifs:modeswitch_debug_off/0
diff --git a/erts/emulator/hipe/hipe_bif64.c b/erts/emulator/hipe/hipe_bif64.c
new file mode 100644
index 0000000000..73784fc1e8
--- /dev/null
+++ b/erts/emulator/hipe/hipe_bif64.c
@@ -0,0 +1,68 @@
+/*
+ * %CopyrightBegin%
+ *
+ * Copyright Ericsson AB 2001-2010. 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%
+ */
+/* hipe_bif_64.c
+ *
+ * Compiler and linker support. 64-bit specific.
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "global.h"
+#include "error.h"
+#include "bif.h"
+#include "big.h" /* term_to_Sint() */
+#include "hipe_arch.h"
+#include "hipe_bif0.h"
+#include "hipe_bif64.h"
+
+#if 0 /* unused */
+static int term_to_Sint64(Eterm term, Sint64 *sp)
+{
+ return term_to_Sint(term, sp);
+}
+
+BIF_RETTYPE hipe_bifs_write_s64_2(BIF_ALIST_2)
+{
+ Sint64 *address;
+ Sint64 value;
+
+ address = term_to_address(BIF_ARG_1);
+ if (!address || !hipe_word64_address_ok(address))
+ BIF_ERROR(BIF_P, BADARG);
+ if (!term_to_Sint64(BIF_ARG_2, &value))
+ BIF_ERROR(BIF_P, BADARG);
+ *address = value;
+ BIF_RET(NIL);
+}
+#endif
+
+BIF_RETTYPE hipe_bifs_write_u64_2(BIF_ALIST_2)
+{
+ Uint64 *address;
+ Uint64 value;
+
+ address = term_to_address(BIF_ARG_1);
+ if (!address || !hipe_word64_address_ok(address))
+ BIF_ERROR(BIF_P, BADARG);
+ if (!term_to_Uint(BIF_ARG_2, &value))
+ BIF_ERROR(BIF_P, BADARG);
+ *address = value;
+ hipe_flush_icache_word(address);
+ BIF_RET(NIL);
+}
diff --git a/erts/emulator/hipe/hipe_bif64.h b/erts/emulator/hipe/hipe_bif64.h
new file mode 100644
index 0000000000..9fd6b79605
--- /dev/null
+++ b/erts/emulator/hipe/hipe_bif64.h
@@ -0,0 +1,26 @@
+/*
+ * %CopyrightBegin%
+ *
+ * Copyright Ericsson AB 2001-2009. 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%
+ */
+/* hipe_bif64.c
+ *
+ * Compiler and linker support. 64-bit specific.
+ */
+#ifndef HIPE_BIF64_H
+#define HIPE_BIF64_H
+
+#endif /* HIPE_BIF64_H */
diff --git a/erts/emulator/hipe/hipe_bif64.tab b/erts/emulator/hipe/hipe_bif64.tab
new file mode 100644
index 0000000000..6e663cfd35
--- /dev/null
+++ b/erts/emulator/hipe/hipe_bif64.tab
@@ -0,0 +1,22 @@
+#
+# %CopyrightBegin%
+#
+# Copyright Ericsson AB 2004-2009. 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%
+#
+# HiPE 64-bit specific bifs
+
+# bif hipe_bifs:write_s64/2
+bif hipe_bifs:write_u64/2
diff --git a/erts/emulator/hipe/hipe_bif_list.m4 b/erts/emulator/hipe/hipe_bif_list.m4
index c92d94ed9d..083788997b 100644
--- a/erts/emulator/hipe/hipe_bif_list.m4
+++ b/erts/emulator/hipe/hipe_bif_list.m4
@@ -1,22 +1,22 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2004-2011. 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%
*/
-/* $Id$
+/*
*
* List all non architecture-specific BIFs and primops, and
* classify each as belonging to one of the classes below.
diff --git a/erts/emulator/hipe/hipe_debug.c b/erts/emulator/hipe/hipe_debug.c
index 548998b7b7..7ca11f8c6c 100644
--- a/erts/emulator/hipe/hipe_debug.c
+++ b/erts/emulator/hipe/hipe_debug.c
@@ -1,22 +1,22 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2001-2011. 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%
*/
-/* $Id$
+/*
* hipe_debug.c
*
* TODO:
@@ -51,7 +51,7 @@ static const char stars[2*sizeof(long)+5] = {
extern Uint beam_apply[];
-static void print_beam_pc(Uint *pc)
+static void print_beam_pc(BeamInstr *pc)
{
if (pc == hipe_beam_pc_return) {
printf("return-to-native");
@@ -60,7 +60,7 @@ static void print_beam_pc(Uint *pc)
} else if (pc == &beam_apply[1]) {
printf("normal-process-exit");
} else {
- Eterm *mfa = find_function_from_pc(pc);
+ BeamInstr *mfa = find_function_from_pc(pc);
if (mfa)
erts_printf("%T:%T/%bpu + 0x%bpx",
mfa[0], mfa[1], mfa[2], pc - &mfa[3]);
@@ -71,7 +71,7 @@ static void print_beam_pc(Uint *pc)
static void catch_slot(Eterm *pos, Eterm val)
{
- Uint *pc = catch_pc(val);
+ BeamInstr *pc = catch_pc(val);
printf(" | 0x%0*lx | 0x%0*lx | CATCH 0x%0*lx (BEAM ",
2*(int)sizeof(long), (unsigned long)pos,
2*(int)sizeof(long), (unsigned long)val,
diff --git a/erts/emulator/hipe/hipe_debug.h b/erts/emulator/hipe/hipe_debug.h
index 3980bc8230..a28597000a 100644
--- a/erts/emulator/hipe/hipe_debug.h
+++ b/erts/emulator/hipe/hipe_debug.h
@@ -1,22 +1,22 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2001-2011. 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%
*/
-/* $Id$
+/*
* hipe_debug.h
*/
#ifndef HIPE_DEBUG_H
diff --git a/erts/emulator/hipe/hipe_gbif_list.h b/erts/emulator/hipe/hipe_gbif_list.h
index 659f74b5e5..69dbab7ab9 100644
--- a/erts/emulator/hipe/hipe_gbif_list.h
+++ b/erts/emulator/hipe/hipe_gbif_list.h
@@ -1,22 +1,22 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2001-2011. 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%
*/
-/* $Id$
+/*
* GBIF_LIST(FunctionAtom,Arity,CFun)
* manually maintained for now -- expand when necessary
*/
diff --git a/erts/emulator/hipe/hipe_gc.c b/erts/emulator/hipe/hipe_gc.c
index 6c9e1d9ba7..0199dea99e 100644
--- a/erts/emulator/hipe/hipe_gc.c
+++ b/erts/emulator/hipe/hipe_gc.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2004-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2004-2011. 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
@@ -16,7 +16,7 @@
*
* %CopyrightEnd%
*/
-/* $Id$
+/*
* GC support procedures
*/
#ifdef HAVE_CONFIG_H
@@ -28,7 +28,6 @@
#include "hipe_stack.h"
#include "hipe_gc.h"
-#include "hipe_bif0.h" /* for hipe_constants_{start,next} */
Eterm *fullsweep_nstack(Process *p, Eterm *n_htop)
{
diff --git a/erts/emulator/hipe/hipe_gc.h b/erts/emulator/hipe/hipe_gc.h
index 712d0ffa78..0d5614c9cf 100644
--- a/erts/emulator/hipe/hipe_gc.h
+++ b/erts/emulator/hipe/hipe_gc.h
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2004-2011. 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%
*/
-/* $Id$
- */
+
+
#ifndef HIPE_GC_H
#define HIPE_GC_H
diff --git a/erts/emulator/hipe/hipe_mkliterals.c b/erts/emulator/hipe/hipe_mkliterals.c
index 900dfc5a8a..650861b54b 100644
--- a/erts/emulator/hipe/hipe_mkliterals.c
+++ b/erts/emulator/hipe/hipe_mkliterals.c
@@ -1,24 +1,24 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
- *
+
+ *
+ * Copyright Ericsson AB 2001-2011. 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%
*/
-/*
- * $Id$
- */
+
+
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
diff --git a/erts/emulator/hipe/hipe_mode_switch.c b/erts/emulator/hipe/hipe_mode_switch.c
index e5de244d25..16f8fb1347 100644
--- a/erts/emulator/hipe/hipe_mode_switch.c
+++ b/erts/emulator/hipe/hipe_mode_switch.c
@@ -1,22 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
- *
+
+ *
+ * Copyright Ericsson AB 2001-2011. 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%
*/
-/* $Id$
+/*
* hipe_mode_switch.c
*/
#ifdef HAVE_CONFIG_H
@@ -208,6 +209,8 @@ Process *hipe_mode_switch(Process *p, unsigned cmd, Eterm reg[])
#endif
p->i = NULL;
+ /* Set current_function to undefined. stdlib hibernate tests rely on it. */
+ p->current = NULL;
DPRINTF("cmd == %#x (%s)", cmd, code_str(cmd));
HIPE_CHECK_PCB(p);
@@ -322,20 +325,31 @@ Process *hipe_mode_switch(Process *p, unsigned cmd, Eterm reg[])
* We need to remove the BIF's parameters from the native
* stack: to this end hipe_${ARCH}_glue.S stores the BIF's
* arity in p->hipe.narity.
+ *
+ * If the BIF emptied the stack (typically hibernate), p->hipe.nsp is
+ * NULL and there is no need to get rid of stacked parameters.
*/
- unsigned int i, is_recursive, callee_arity;
+ unsigned int i, is_recursive = 0;
/* Save p->arity, then update it with the original BIF's arity.
Get rid of any stacked parameters in that call. */
/* XXX: hipe_call_from_native_is_recursive() copies data to
reg[], which is useless in the TRAP case. Maybe write a
specialised hipe_trap_from_native_is_recursive() later. */
- callee_arity = p->arity;
- p->arity = p->hipe.narity; /* caller's arity */
- is_recursive = hipe_call_from_native_is_recursive(p, reg);
-
- p->i = (Eterm *)(p->def_arg_reg[3]);
- p->arity = callee_arity;
+ if (p->hipe.nsp != NULL) {
+ unsigned int callee_arity;
+ callee_arity = p->arity;
+ p->arity = p->hipe.narity; /* caller's arity */
+ is_recursive = hipe_call_from_native_is_recursive(p, reg);
+
+ p->i = (Eterm *)(p->def_arg_reg[3]);
+ p->arity = callee_arity;
+ }
+
+ /* If process is in P_WAITING state, we schedule the next process */
+ if (p->status == P_WAITING) {
+ goto do_schedule;
+ }
for (i = 0; i < p->arity; ++i)
reg[i] = p->def_arg_reg[i];
@@ -592,6 +606,17 @@ void hipe_inc_nstack(Process *p)
}
#endif
+void hipe_empty_nstack(Process *p)
+{
+ if (p->hipe.nstack) {
+ erts_free(ERTS_ALC_T_HIPE, p->hipe.nstack);
+ }
+ p->hipe.nstgraylim = NULL;
+ p->hipe.nsp = NULL;
+ p->hipe.nstack = NULL;
+ p->hipe.nstend = NULL;
+}
+
static void hipe_check_nstack(Process *p, unsigned nwords)
{
while (hipe_nstack_avail(p) < nwords)
diff --git a/erts/emulator/hipe/hipe_mode_switch.h b/erts/emulator/hipe/hipe_mode_switch.h
index 187b9145e2..dbc2386e14 100644
--- a/erts/emulator/hipe/hipe_mode_switch.h
+++ b/erts/emulator/hipe/hipe_mode_switch.h
@@ -1,22 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
- *
+
+ *
+ * Copyright Ericsson AB 2001-2011. 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%
*/
-/* $Id$
+/*
* hipe_mode_switch.h
*/
#ifndef HIPE_MODE_SWITCH_H
@@ -54,6 +55,7 @@ void hipe_mode_switch_init(void);
void hipe_set_call_trap(Uint *bfun, void *nfun, int is_closure);
Process *hipe_mode_switch(Process*, unsigned, Eterm*);
void hipe_inc_nstack(Process *p);
+void hipe_empty_nstack(Process *p);
void hipe_set_closure_stub(ErlFunEntry *fe, unsigned num_free);
Eterm hipe_build_stacktrace(Process *p, struct StackTrace *s);
diff --git a/erts/emulator/hipe/hipe_native_bif.c b/erts/emulator/hipe/hipe_native_bif.c
index f8c2502522..8d31348496 100644
--- a/erts/emulator/hipe/hipe_native_bif.c
+++ b/erts/emulator/hipe/hipe_native_bif.c
@@ -1,22 +1,22 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2001-2011. 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%
*/
-/* $Id$
+/*
* hipe_native_bif.c
*/
#ifdef HAVE_CONFIG_H
diff --git a/erts/emulator/hipe/hipe_native_bif.h b/erts/emulator/hipe/hipe_native_bif.h
index 3b55b64a41..13a02b84a2 100644
--- a/erts/emulator/hipe/hipe_native_bif.h
+++ b/erts/emulator/hipe/hipe_native_bif.h
@@ -1,22 +1,22 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2001-2011. 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%
*/
-/* $Id$
+/*
* hipe_native_bif.h
*/
diff --git a/erts/emulator/hipe/hipe_ops.tab b/erts/emulator/hipe/hipe_ops.tab
index eb6f824d1c..50c3a4ae2f 100644
--- a/erts/emulator/hipe/hipe_ops.tab
+++ b/erts/emulator/hipe/hipe_ops.tab
@@ -1,19 +1,19 @@
#
# %CopyrightBegin%
-#
-# Copyright Ericsson AB 2001-2009. All Rights Reserved.
-#
+#
+# Copyright Ericsson AB 2001-2011. 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%
#
diff --git a/erts/emulator/hipe/hipe_perfctr.c b/erts/emulator/hipe/hipe_perfctr.c
index 69bb648854..371b3fb097 100644
--- a/erts/emulator/hipe/hipe_perfctr.c
+++ b/erts/emulator/hipe/hipe_perfctr.c
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2004-2011. 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%
*/
-/* $Id$
- */
+
+
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
diff --git a/erts/emulator/hipe/hipe_perfctr.h b/erts/emulator/hipe/hipe_perfctr.h
index 7b20c68cac..8fbf9ecf35 100644
--- a/erts/emulator/hipe/hipe_perfctr.h
+++ b/erts/emulator/hipe/hipe_perfctr.h
@@ -1,23 +1,22 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2004-2011. 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%
*/
-/* $Id$
- */
+
extern int hipe_perfctr_hrvtime_open(void);
extern void hipe_perfctr_hrvtime_close(void);
diff --git a/erts/emulator/hipe/hipe_perfctr.tab b/erts/emulator/hipe/hipe_perfctr.tab
index 663522f85e..eaecea4651 100644
--- a/erts/emulator/hipe/hipe_perfctr.tab
+++ b/erts/emulator/hipe/hipe_perfctr.tab
@@ -1,22 +1,21 @@
#
# %CopyrightBegin%
-#
-# Copyright Ericsson AB 2004-2009. All Rights Reserved.
-#
+#
+# Copyright Ericsson AB 2004-2011. 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%
#
-# $Id$
bif hipe_bifs:vperfctr_open/0
bif hipe_bifs:vperfctr_close/0
diff --git a/erts/emulator/hipe/hipe_ppc.c b/erts/emulator/hipe/hipe_ppc.c
index 3a0beedb68..bc25061a16 100644
--- a/erts/emulator/hipe/hipe_ppc.c
+++ b/erts/emulator/hipe/hipe_ppc.c
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2004-2011. 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%
*/
-/* $Id$
- */
+
+
#include <stddef.h> /* offsetof() */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -87,48 +87,6 @@ static struct segment {
#define MAP_ANONYMOUS MAP_ANON
#endif
-#if defined(__powerpc64__)
-static void *new_code_mapping(void)
-{
- char *map_hint, *map_start;
-
- /*
- * Allocate a new 32MB code segment in the low 2GB of the address space.
- *
- * This is problematic for several reasons:
- * - Linux/ppc64 lacks the MAP_32BIT flag that Linux/x86-64 has.
- * - The address space hint to mmap is only respected if that
- * area is available. If it isn't, then mmap falls back to its
- * defaults, which (according to testing) results in very high
- * (and thus useless for us) addresses being returned.
- * - Another mapping, presumably the brk, also occupies low addresses.
- *
- * As initial implementation, simply start allocating at the 0.5GB
- * boundary. This leaves plenty of space for the brk before malloc
- * needs to switch to mmap, while allowing for 1.5GB of code.
- *
- * A more robust implementation would be to parse /proc/self/maps,
- * reserve all available space between (say) 0.5GB and 2GB with
- * PROT_NONE MAP_NORESERVE mappings, and then allocate by releasing
- * 32MB segments and re-mapping them properly. This would work on
- * Linux/ppc64, I have no idea how things should be done on Darwin64.
- */
- if (curseg.base)
- map_hint = (char*)curseg.base + SEGMENT_NRBYTES;
- else
- map_hint = (char*)(512*1024*1024); /* 0.5GB */
- map_start = mmap(map_hint, SEGMENT_NRBYTES,
- PROT_EXEC|PROT_READ|PROT_WRITE,
- MAP_PRIVATE|MAP_ANONYMOUS,
- -1, 0);
- if (map_start != MAP_FAILED &&
- (((unsigned long)map_start + (SEGMENT_NRBYTES-1)) & ~0x7FFFFFFFUL)) {
- fprintf(stderr, "mmap with hint %p returned code memory %p\r\n", map_hint, map_start);
- abort();
- }
- return map_start;
-}
-#else
static void *new_code_mapping(void)
{
return mmap(0, SEGMENT_NRBYTES,
@@ -136,7 +94,6 @@ static void *new_code_mapping(void)
MAP_PRIVATE|MAP_ANONYMOUS,
-1, 0);
}
-#endif
static int check_callees(Eterm callees)
{
@@ -182,20 +139,30 @@ static unsigned int *try_alloc(Uint nrwords, int nrcallees, Eterm callees, unsig
unsigned int a = unsigned_val(tuple_val(mfa)[3]);
unsigned int *trampoline = hipe_mfa_get_trampoline(m, f, a);
if (!in_area(trampoline, base, SEGMENT_NRBYTES)) {
+#if defined(__powerpc64__)
+ if (nrfreewords < 7)
+ return NULL;
+ nrfreewords -= 7;
+ tramp_pos = trampoline = tramp_pos - 7;
+ trampoline[0] = 0x3D600000; /* addis r11,r0,0 */
+ trampoline[1] = 0x616B0000; /* ori r11,r11,0 */
+ trampoline[2] = 0x796B07C6; /* rldicr r11,r11,32,31 */
+ trampoline[3] = 0x656B0000; /* oris r11,r11,0 */
+ trampoline[4] = 0x616B0000; /* ori r11,r11,0 */
+ trampoline[5] = 0x7D6903A6; /* mtctr r11 */
+ trampoline[6] = 0x4E800420; /* bctr */
+ hipe_flush_icache_range(trampoline, 7*sizeof(int));
+#else
if (nrfreewords < 4)
return NULL;
nrfreewords -= 4;
tramp_pos = trampoline = tramp_pos - 4;
-#if defined(__powerpc64__)
- trampoline[0] = 0x3D600000; /* addis r11,0,0 */
- trampoline[1] = 0x616B0000; /* ori r11,r11,0 */
-#else
trampoline[0] = 0x39600000; /* addi r11,r0,0 */
trampoline[1] = 0x3D6B0000; /* addis r11,r11,0 */
-#endif
trampoline[2] = 0x7D6903A6; /* mtctr r11 */
trampoline[3] = 0x4E800420; /* bctr */
hipe_flush_icache_range(trampoline, 4*sizeof(int));
+#endif
hipe_mfa_set_trampoline(m, f, a, trampoline);
}
trampvec[trampnr-1] = trampoline;
@@ -281,21 +248,22 @@ static void patch_imm16(Uint32 *address, unsigned int imm16)
}
#if defined(__powerpc64__)
+/*
+ * To load a 64-bit immediate value 'val' into Rd (Rd != R0):
+ *
+ * addis Rd, 0, val@highest // (val >> 48) & 0xFFFF
+ * ori Rd, Rd, val@higher // (val >> 32) & 0xFFFF
+ * rldicr Rd, Rd, 32, 31
+ * oris Rd, Rd, val@h // (val >> 16) & 0xFFFF
+ * ori Rd, Rd, val@l // val & 0xFFFF
+ */
static void patch_li64(Uint32 *address, Uint64 value)
{
- patch_imm16(address+0, value >> 48);/* addis r,0,value@highest */
- patch_imm16(address+1, value >> 32);/* ori r,r,value@higher */
- /* sldi r,r,32 */
- patch_imm16(address+3, value >> 16);/* oris r,r,value@h */
- patch_imm16(address+4, value); /* ori r,r,value@l */
-}
-
-static int patch_li31(Uint32 *address, Uint32 value)
-{
- if ((value >> 31) != 0)
- return -1;
- patch_imm16(address, value >> 16); /* addis r,0,value@h */
- patch_imm16(address+1, value); /* ori r,r,value@l */
+ patch_imm16(address+0, value >> 48);
+ patch_imm16(address+1, value >> 32);
+ /* rldicr Rd, Rd, 32, 31 */
+ patch_imm16(address+3, value >> 16);
+ patch_imm16(address+4, value);
}
void hipe_patch_load_fe(Uint *address, Uint value)
@@ -308,11 +276,10 @@ int hipe_patch_insn(void *address, Uint64 value, Eterm type)
switch (type) {
case am_closure:
case am_constant:
- patch_li64((Uint32*)address, value);
- return 0;
case am_atom:
case am_c_const:
- return patch_li31((Uint32*)address, value);
+ patch_li64((Uint32*)address, value);
+ return 0;
default:
return -1;
}
@@ -442,34 +409,33 @@ static void patch_b(Uint32 *address, Sint32 offset, Uint32 AA)
int hipe_patch_call(void *callAddress, void *destAddress, void *trampoline)
{
- if ((Uint32)destAddress == ((Uint32)destAddress & 0x01FFFFFC)) {
+ if ((UWord)destAddress == ((UWord)destAddress & 0x01FFFFFC)) {
/* The destination is in the [0,32MB[ range.
We can reach it with a ba/bla instruction.
This is the typical case for BIFs and primops.
It's also common for trap-to-BEAM stubs (on ppc32). */
- patch_b((Uint32*)callAddress, (Uint32)destAddress >> 2, 2);
+ patch_b((Uint32*)callAddress, (Sint32)destAddress >> 2, 2);
} else {
- Sint32 destOffset = ((Sint32)destAddress - (Sint32)callAddress) >> 2;
+ SWord destOffset = ((SWord)destAddress - (SWord)callAddress) >> 2;
if (destOffset >= -0x800000 && destOffset <= 0x7FFFFF) {
/* The destination is within a [-32MB,+32MB[ range from us.
We can reach it with a b/bl instruction.
This is typical for nearby Erlang code. */
- patch_b((Uint32*)callAddress, destOffset, 0);
+ patch_b((Uint32*)callAddress, (Sint32)destOffset, 0);
} else {
/* The destination is too distant for b/bl/ba/bla.
Must do a b/bl to the trampoline. */
- Sint32 trampOffset = ((Sint32)trampoline - (Sint32)callAddress) >> 2;
+ SWord trampOffset = ((SWord)trampoline - (SWord)callAddress) >> 2;
if (trampOffset >= -0x800000 && trampOffset <= 0x7FFFFF) {
/* Update the trampoline's address computation.
(May be redundant, but we can't tell.) */
#if defined(__powerpc64__)
- /* This relies on the fact that we allocate code below 2GB. */
- patch_li31((Uint32*)trampoline, (Uint32)destAddress);
+ patch_li64((Uint32*)trampoline, (Uint64)destAddress);
#else
patch_li((Uint32*)trampoline, (Uint32)destAddress);
#endif
/* Update this call site. */
- patch_b((Uint32*)callAddress, trampOffset, 0);
+ patch_b((Uint32*)callAddress, (Sint32)trampOffset, 0);
} else
return -1;
}
diff --git a/erts/emulator/hipe/hipe_ppc.h b/erts/emulator/hipe/hipe_ppc.h
index e30ce30ed2..66000c1846 100644
--- a/erts/emulator/hipe/hipe_ppc.h
+++ b/erts/emulator/hipe/hipe_ppc.h
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2004-2011. 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%
*/
-/* $Id$
- */
+
+
#ifndef HIPE_PPC_H
#define HIPE_PPC_H
@@ -44,12 +44,20 @@ static __inline__ int hipe_word32_address_ok(void *address)
return ((unsigned long)address & 0x3) == 0;
}
+#if defined(__powerpc64__)
+/* for hipe_bifs_{read,write}_{s,u}64 */
+static __inline__ int hipe_word64_address_ok(void *address)
+{
+ return ((unsigned long)address & 0x7) == 0;
+}
+#endif
+
/* Native stack growth direction. */
#define HIPE_NSTACK_GROWS_DOWN
#if defined(__powerpc64__)
#define hipe_arch_name am_ppc64
-#define AEXTERN(RET,NAME,PROTO) extern const int NAME
+#define AEXTERN(RET,NAME,PROTO) extern const int NAME[]
AEXTERN(void,hipe_ppc_inc_stack,(void));
#else
#define hipe_arch_name am_powerpc
diff --git a/erts/emulator/hipe/hipe_ppc.tab b/erts/emulator/hipe/hipe_ppc.tab
index a32dd820e7..38b7f46d3a 100644
--- a/erts/emulator/hipe/hipe_ppc.tab
+++ b/erts/emulator/hipe/hipe_ppc.tab
@@ -1,22 +1,22 @@
#
# %CopyrightBegin%
-#
-# Copyright Ericsson AB 2004-2009. All Rights Reserved.
-#
+#
+# Copyright Ericsson AB 2004-2011. 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%
#
-# $Id$
+
# PowerPC-specific atoms
atom fconv_constant
diff --git a/erts/emulator/hipe/hipe_ppc64.tab b/erts/emulator/hipe/hipe_ppc64.tab
index 513182721c..0a390a3bb8 100644
--- a/erts/emulator/hipe/hipe_ppc64.tab
+++ b/erts/emulator/hipe/hipe_ppc64.tab
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2005-2009. All Rights Reserved.
+# Copyright Ericsson AB 2005-2011. 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
@@ -16,7 +16,7 @@
#
# %CopyrightEnd%
#
-# $Id$
+
# PPC64-specific atoms
atom inc_stack_0
diff --git a/erts/emulator/hipe/hipe_ppc_abi.txt b/erts/emulator/hipe/hipe_ppc_abi.txt
index 4bf41e02b2..be0ef98b0d 100644
--- a/erts/emulator/hipe/hipe_ppc_abi.txt
+++ b/erts/emulator/hipe/hipe_ppc_abi.txt
@@ -2,7 +2,7 @@
%CopyrightBegin%
%CopyrightEnd%
-$Id$
+
HiPE PowerPC ABI
================
diff --git a/erts/emulator/hipe/hipe_ppc_asm.m4 b/erts/emulator/hipe/hipe_ppc_asm.m4
index a0f8b78679..0eb5c441e6 100644
--- a/erts/emulator/hipe/hipe_ppc_asm.m4
+++ b/erts/emulator/hipe/hipe_ppc_asm.m4
@@ -1,25 +1,24 @@
changecom(`/*', `*/')dnl
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2004-2011. 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%
*/
-/*
- * $Id$
- */
+
+
`#ifndef HIPE_PPC_ASM_H
#define HIPE_PPC_ASM_H'
@@ -63,15 +62,31 @@ ifelse(OPSYS,darwin,``
#define SEMI @
#define SET_SIZE(NAME) /*empty*/
#define TYPE_FUNCTION(NAME) /*empty*/
+#define OPD(NAME) /*empty*/
'',``
/* Not Darwin */''
`ifelse(ARCH,ppc64,``
/* 64-bit */
+/*
+ * The 64-bit PowerPC ABI requires us to setup Official Procedure Descriptors
+ * for functions called from C. These are exported as "func", while the entry
+ * point should is exported as ".func". A function pointer in C points to the
+ * function descriptor in the opd rather than to the function entry point.
+ */
#define JOIN(X,Y) X##Y
#define CSYM(NAME) JOIN(.,NAME)
+#define OPD(NAME) \
+ .pushsection .opd, "aw"; \
+ .align 3; \
+ .global NAME; \
+NAME: \
+ .quad CSYM(NAME), .TOC.@tocbase, 0; \
+ .type NAME, @function; \
+ .popsection
'',``
/* 32-bit */
#define CSYM(NAME) NAME
+#define OPD(NAME) /*empty*/
'')'
``#define ASYM(NAME) NAME
#define GLOBAL(NAME) .global NAME
diff --git a/erts/emulator/hipe/hipe_ppc_bifs.m4 b/erts/emulator/hipe/hipe_ppc_bifs.m4
index 3849d9113a..203fefe1a1 100644
--- a/erts/emulator/hipe/hipe_ppc_bifs.m4
+++ b/erts/emulator/hipe/hipe_ppc_bifs.m4
@@ -1,25 +1,23 @@
changecom(`/*', `*/')dnl
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2004-2011. 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%
*/
-/*
- * $Id$
- */
+
include(`hipe/hipe_ppc_asm.m4')
#`include' "hipe_literals.h"
diff --git a/erts/emulator/hipe/hipe_ppc_gc.h b/erts/emulator/hipe/hipe_ppc_gc.h
index 796ebeb20a..823ba0ad06 100644
--- a/erts/emulator/hipe/hipe_ppc_gc.h
+++ b/erts/emulator/hipe/hipe_ppc_gc.h
@@ -1,22 +1,22 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2004-2011. 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%
*/
-/* $Id$
+/*
* Stack walking helpers for native stack GC procedures.
* PowerPC version.
*/
diff --git a/erts/emulator/hipe/hipe_ppc_glue.S b/erts/emulator/hipe/hipe_ppc_glue.S
index c010f4f047..6f0217c738 100644
--- a/erts/emulator/hipe/hipe_ppc_glue.S
+++ b/erts/emulator/hipe/hipe_ppc_glue.S
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2004-2011. 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%
*/
-/* $Id$
- */
+
+
#include "hipe_ppc_asm.h"
#include "hipe_literals.h"
#define ASM
@@ -198,6 +198,7 @@
* int hipe_ppc_call_to_native(Process *p);
* Emulated code recursively calls native code.
*/
+ OPD(hipe_ppc_call_to_native)
GLOBAL(CSYM(hipe_ppc_call_to_native))
CSYM(hipe_ppc_call_to_native):
/* save C context */
@@ -229,6 +230,7 @@ ASYM(nbif_return):
* int hipe_ppc_return_to_native(Process *p);
* Emulated code returns to its native code caller.
*/
+ OPD(hipe_ppc_return_to_native)
GLOBAL(CSYM(hipe_ppc_return_to_native))
CSYM(hipe_ppc_return_to_native):
/* save C context */
@@ -252,6 +254,7 @@ CSYM(hipe_ppc_return_to_native):
* int hipe_ppc_tailcall_to_native(Process *p);
* Emulated code tailcalls native code.
*/
+ OPD(hipe_ppc_tailcall_to_native)
GLOBAL(CSYM(hipe_ppc_tailcall_to_native))
CSYM(hipe_ppc_tailcall_to_native):
/* save C context */
@@ -274,6 +277,7 @@ CSYM(hipe_ppc_tailcall_to_native):
* int hipe_ppc_throw_to_native(Process *p);
* Emulated code throws an exception to its native code caller.
*/
+ OPD(hipe_ppc_throw_to_native)
GLOBAL(CSYM(hipe_ppc_throw_to_native))
CSYM(hipe_ppc_throw_to_native):
/* save C context */
@@ -455,6 +459,10 @@ ASYM(nbif_fail):
li r3, HIPE_MODE_SWITCH_RES_THROW
b .flush_exit /* no need to save RA */
+ OPD(nbif_0_gc_after_bif)
+ OPD(nbif_1_gc_after_bif)
+ OPD(nbif_2_gc_after_bif)
+ OPD(nbif_3_gc_after_bif)
GLOBAL(CSYM(nbif_0_gc_after_bif))
GLOBAL(CSYM(nbif_1_gc_after_bif))
GLOBAL(CSYM(nbif_2_gc_after_bif))
@@ -493,18 +501,22 @@ CSYM(nbif_3_gc_after_bif):
* The heap pointer was just read from P.
* TEMP_LR contains a copy of LR
*/
+ OPD(nbif_0_simple_exception)
GLOBAL(CSYM(nbif_0_simple_exception))
CSYM(nbif_0_simple_exception):
li r4, 0
b .nbif_simple_exception
+ OPD(nbif_1_simple_exception)
GLOBAL(CSYM(nbif_1_simple_exception))
CSYM(nbif_1_simple_exception):
li r4, 1
b .nbif_simple_exception
+ OPD(nbif_2_simple_exception)
GLOBAL(CSYM(nbif_2_simple_exception))
CSYM(nbif_2_simple_exception):
li r4, 2
b .nbif_simple_exception
+ OPD(nbif_3_simple_exception)
GLOBAL(CSYM(nbif_3_simple_exception))
CSYM(nbif_3_simple_exception):
li r4, 3
diff --git a/erts/emulator/hipe/hipe_ppc_glue.h b/erts/emulator/hipe/hipe_ppc_glue.h
index dcf5ec7644..f9c4460e60 100644
--- a/erts/emulator/hipe/hipe_ppc_glue.h
+++ b/erts/emulator/hipe/hipe_ppc_glue.h
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2004-2011. 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%
*/
-/* $Id$
- */
+
+
#ifndef HIPE_PPC_GLUE_H
#define HIPE_PPC_GLUE_H
diff --git a/erts/emulator/hipe/hipe_ppc_primops.h b/erts/emulator/hipe/hipe_ppc_primops.h
index 67205fe1d1..7dba0afc88 100644
--- a/erts/emulator/hipe/hipe_ppc_primops.h
+++ b/erts/emulator/hipe/hipe_ppc_primops.h
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2005-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2005-2011. 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%
*/
-/* $Id$
- */
+
+
#if !defined(__powerpc64__)
PRIMOP_LIST(am_fconv_constant, &fconv_constant)
#endif
diff --git a/erts/emulator/hipe/hipe_primops.h b/erts/emulator/hipe/hipe_primops.h
index cc2fc425d5..94113ffcd8 100644
--- a/erts/emulator/hipe/hipe_primops.h
+++ b/erts/emulator/hipe/hipe_primops.h
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2005-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2005-2011. 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%
*/
-/* $Id$
- */
+
+
#ifndef HIPE_PRIMOPS_H
#define HIPE_PRIMOPS_H
diff --git a/erts/emulator/hipe/hipe_process.h b/erts/emulator/hipe/hipe_process.h
index 5528e68826..5effacb398 100644
--- a/erts/emulator/hipe/hipe_process.h
+++ b/erts/emulator/hipe/hipe_process.h
@@ -1,22 +1,22 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2001-2011. 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%
*/
-/* $Id$
+/*
* HiPE-specific process fields
*/
#ifndef HIPE_PROCESS_H
diff --git a/erts/emulator/hipe/hipe_risc_gc.h b/erts/emulator/hipe/hipe_risc_gc.h
index 4a9a7878f0..947eb5956b 100644
--- a/erts/emulator/hipe/hipe_risc_gc.h
+++ b/erts/emulator/hipe/hipe_risc_gc.h
@@ -1,22 +1,22 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2008-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2008-2011. 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%
*/
-/* $Id$
+/*
* Stack walking helpers for native stack GC procedures.
* Generic RISC version.
*/
diff --git a/erts/emulator/hipe/hipe_risc_glue.h b/erts/emulator/hipe/hipe_risc_glue.h
index 3b2d6498d3..e74023e3e9 100644
--- a/erts/emulator/hipe/hipe_risc_glue.h
+++ b/erts/emulator/hipe/hipe_risc_glue.h
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2008-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2008-2011. 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%
*/
-/* $Id$
- */
+
+
#ifndef HIPE_RISC_GLUE_H
#define HIPE_RISC_GLUE_H
diff --git a/erts/emulator/hipe/hipe_risc_stack.c b/erts/emulator/hipe/hipe_risc_stack.c
index 976ca0b85d..1183856c7e 100644
--- a/erts/emulator/hipe/hipe_risc_stack.c
+++ b/erts/emulator/hipe/hipe_risc_stack.c
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2008-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2008-2011. 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%
*/
-/* $Id$
- */
+
+
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
diff --git a/erts/emulator/hipe/hipe_signal.h b/erts/emulator/hipe/hipe_signal.h
index 3c3c844d52..4eacf52b5d 100644
--- a/erts/emulator/hipe/hipe_signal.h
+++ b/erts/emulator/hipe/hipe_signal.h
@@ -1,22 +1,22 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2002-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2002-2011. 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%
*/
-/* $Id$
+/*
* hipe_signal.h
*
* Architecture-specific initialisation of Unix signals.
diff --git a/erts/emulator/hipe/hipe_sparc.c b/erts/emulator/hipe/hipe_sparc.c
index 661b42130a..49d4da7bab 100644
--- a/erts/emulator/hipe/hipe_sparc.c
+++ b/erts/emulator/hipe/hipe_sparc.c
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2003-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2003-2011. 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%
*/
-/* $Id$
- */
+
+
#include <stddef.h> /* offsetof() */
#ifdef HAVE_CONFIG_H
#include "config.h"
diff --git a/erts/emulator/hipe/hipe_sparc.h b/erts/emulator/hipe/hipe_sparc.h
index 53cb18ee45..1134b86004 100644
--- a/erts/emulator/hipe/hipe_sparc.h
+++ b/erts/emulator/hipe/hipe_sparc.h
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2003-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2003-2011. 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%
*/
-/* $Id$
- */
+
+
#ifndef HIPE_SPARC_H
#define HIPE_SPARC_H
diff --git a/erts/emulator/hipe/hipe_sparc.tab b/erts/emulator/hipe/hipe_sparc.tab
index f192e1f81c..c620c73c67 100644
--- a/erts/emulator/hipe/hipe_sparc.tab
+++ b/erts/emulator/hipe/hipe_sparc.tab
@@ -1,22 +1,22 @@
#
# %CopyrightBegin%
-#
-# Copyright Ericsson AB 2004-2009. All Rights Reserved.
-#
+#
+# Copyright Ericsson AB 2004-2011. 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%
#
-# $Id$
+
# SPARC-specific atoms
atom inc_stack_0
diff --git a/erts/emulator/hipe/hipe_sparc_abi.txt b/erts/emulator/hipe/hipe_sparc_abi.txt
index d016a96c1c..cb5cda310b 100644
--- a/erts/emulator/hipe/hipe_sparc_abi.txt
+++ b/erts/emulator/hipe/hipe_sparc_abi.txt
@@ -2,7 +2,7 @@
%CopyrightBegin%
%CopyrightEnd%
-$Id$
+
HiPE SPARC ABI
==============
diff --git a/erts/emulator/hipe/hipe_sparc_asm.m4 b/erts/emulator/hipe/hipe_sparc_asm.m4
index 7a4403ac09..227d10ed80 100644
--- a/erts/emulator/hipe/hipe_sparc_asm.m4
+++ b/erts/emulator/hipe/hipe_sparc_asm.m4
@@ -1,25 +1,24 @@
changecom(`/*', `*/')dnl
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2007-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2007-2011. 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%
*/
-/*
- * $Id$
- */
+
+
`#ifndef HIPE_SPARC_ASM_H
#define HIPE_SPARC_ASM_H'
diff --git a/erts/emulator/hipe/hipe_sparc_bifs.m4 b/erts/emulator/hipe/hipe_sparc_bifs.m4
index f3753b3847..03db7f3413 100644
--- a/erts/emulator/hipe/hipe_sparc_bifs.m4
+++ b/erts/emulator/hipe/hipe_sparc_bifs.m4
@@ -1,25 +1,23 @@
changecom(`/*', `*/')dnl
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2001-2011. 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%
*/
-/*
- * $Id$
- */
+
include(`hipe/hipe_sparc_asm.m4')
#`include' "hipe_literals.h"
diff --git a/erts/emulator/hipe/hipe_sparc_gc.h b/erts/emulator/hipe/hipe_sparc_gc.h
index 9035f5baee..b870ddd59e 100644
--- a/erts/emulator/hipe/hipe_sparc_gc.h
+++ b/erts/emulator/hipe/hipe_sparc_gc.h
@@ -1,22 +1,22 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2004-2011. 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%
*/
-/* $Id$
+/*
* Stack walking helpers for native stack GC procedures.
* SPARC version.
*/
diff --git a/erts/emulator/hipe/hipe_sparc_glue.S b/erts/emulator/hipe/hipe_sparc_glue.S
index 73cefd4896..44bdf1bc7e 100644
--- a/erts/emulator/hipe/hipe_sparc_glue.S
+++ b/erts/emulator/hipe/hipe_sparc_glue.S
@@ -1,23 +1,24 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
- *
+
+ *
+ * Copyright Ericsson AB 2001-2011. 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%
*/
-/* $Id$
- */
+
+
#include "hipe_sparc_asm.h"
#include "hipe_literals.h"
#define ASM
diff --git a/erts/emulator/hipe/hipe_sparc_glue.h b/erts/emulator/hipe/hipe_sparc_glue.h
index 3f881d2140..1404c0d4c0 100644
--- a/erts/emulator/hipe/hipe_sparc_glue.h
+++ b/erts/emulator/hipe/hipe_sparc_glue.h
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2001-2011. 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%
*/
-/* $Id$
- */
+
+
#ifndef HIPE_SPARC_GLUE_H
#define HIPE_SPARC_GLUE_H
diff --git a/erts/emulator/hipe/hipe_sparc_primops.h b/erts/emulator/hipe/hipe_sparc_primops.h
index 1fbb261c67..413371e5f0 100644
--- a/erts/emulator/hipe/hipe_sparc_primops.h
+++ b/erts/emulator/hipe/hipe_sparc_primops.h
@@ -1,21 +1,21 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2005-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2005-2011. 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%
*/
-/* $Id$
- */
+
+
PRIMOP_LIST(am_inc_stack_0, &hipe_sparc_inc_stack)
diff --git a/erts/emulator/hipe/hipe_stack.c b/erts/emulator/hipe/hipe_stack.c
index 82f7f022b6..da462a64e1 100644
--- a/erts/emulator/hipe/hipe_stack.c
+++ b/erts/emulator/hipe/hipe_stack.c
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2003-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2003-2011. 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%
*/
-/* $Id$
- */
+
+
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
diff --git a/erts/emulator/hipe/hipe_stack.h b/erts/emulator/hipe/hipe_stack.h
index 354ac81b4c..4c14b4a519 100644
--- a/erts/emulator/hipe/hipe_stack.h
+++ b/erts/emulator/hipe/hipe_stack.h
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2001-2011. 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%
*/
-/* $Id$
- */
+
+
#ifndef HIPE_STACK_H
#define HIPE_STACK_H
diff --git a/erts/emulator/hipe/hipe_x86.c b/erts/emulator/hipe/hipe_x86.c
index f79a2d53f4..24d232c968 100644
--- a/erts/emulator/hipe/hipe_x86.c
+++ b/erts/emulator/hipe/hipe_x86.c
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2003-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2003-2011. 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%
*/
-/* $Id$
- */
+
+
#include <stddef.h> /* offsetof() */
#ifdef HAVE_CONFIG_H
#include "config.h"
diff --git a/erts/emulator/hipe/hipe_x86.h b/erts/emulator/hipe/hipe_x86.h
index 94ca39fc4f..f0f3c158af 100644
--- a/erts/emulator/hipe/hipe_x86.h
+++ b/erts/emulator/hipe/hipe_x86.h
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2003-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2003-2011. 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%
*/
-/* $Id$
- */
+
+
#ifndef HIPE_X86_H
#define HIPE_X86_H
diff --git a/erts/emulator/hipe/hipe_x86.tab b/erts/emulator/hipe/hipe_x86.tab
index a38fe49156..fb33d0a6b9 100644
--- a/erts/emulator/hipe/hipe_x86.tab
+++ b/erts/emulator/hipe/hipe_x86.tab
@@ -1,22 +1,22 @@
#
# %CopyrightBegin%
-#
-# Copyright Ericsson AB 2004-2009. All Rights Reserved.
-#
+#
+# Copyright Ericsson AB 2004-2011. 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%
#
-# $Id$
+
# x86-specific atoms
atom handle_fp_exception
diff --git a/erts/emulator/hipe/hipe_x86_abi.txt b/erts/emulator/hipe/hipe_x86_abi.txt
index 62a704eef3..aa04a12611 100644
--- a/erts/emulator/hipe/hipe_x86_abi.txt
+++ b/erts/emulator/hipe/hipe_x86_abi.txt
@@ -1,7 +1,7 @@
%CopyrightBegin%
- Copyright Ericsson AB 2001-2009. All Rights Reserved.
+ Copyright Ericsson AB 2001-2011. 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
@@ -16,7 +16,7 @@
%CopyrightEnd%
-$Id$
+
HiPE x86 ABI
============
diff --git a/erts/emulator/hipe/hipe_x86_asm.m4 b/erts/emulator/hipe/hipe_x86_asm.m4
index 4c1d612ccd..020ccf8d4b 100644
--- a/erts/emulator/hipe/hipe_x86_asm.m4
+++ b/erts/emulator/hipe/hipe_x86_asm.m4
@@ -1,25 +1,24 @@
changecom(`/*', `*/')dnl
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2002-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2002-2011. 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%
*/
-/*
- * $Id$
- */
+
+
`#ifndef HIPE_X86_ASM_H
#define HIPE_X86_ASM_H'
diff --git a/erts/emulator/hipe/hipe_x86_bifs.m4 b/erts/emulator/hipe/hipe_x86_bifs.m4
index 80be74f7b2..1bb6488b00 100644
--- a/erts/emulator/hipe/hipe_x86_bifs.m4
+++ b/erts/emulator/hipe/hipe_x86_bifs.m4
@@ -1,25 +1,23 @@
changecom(`/*', `*/')dnl
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2001-2011. 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%
*/
-/*
- * $Id$
- */
+
include(`hipe/hipe_x86_asm.m4')
#`include' "hipe_literals.h"
diff --git a/erts/emulator/hipe/hipe_x86_gc.h b/erts/emulator/hipe/hipe_x86_gc.h
index 4f17f767df..e4607ad27d 100644
--- a/erts/emulator/hipe/hipe_x86_gc.h
+++ b/erts/emulator/hipe/hipe_x86_gc.h
@@ -1,22 +1,22 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2004-2011. 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%
*/
-/* $Id$
+/*
* Stack walking helpers for native stack GC procedures.
*/
#ifndef HIPE_X86_GC_H
diff --git a/erts/emulator/hipe/hipe_x86_glue.S b/erts/emulator/hipe/hipe_x86_glue.S
index 43392111fe..88b86f4de7 100644
--- a/erts/emulator/hipe/hipe_x86_glue.S
+++ b/erts/emulator/hipe/hipe_x86_glue.S
@@ -1,24 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
- *
+
+ *
+ * Copyright Ericsson AB 2001-2011. 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%
*/
-/*
- * $Id$
- */
+
#include "hipe_x86_asm.h"
#include "hipe_literals.h"
diff --git a/erts/emulator/hipe/hipe_x86_glue.h b/erts/emulator/hipe/hipe_x86_glue.h
index 4c9c92c52f..a7b0f164be 100644
--- a/erts/emulator/hipe/hipe_x86_glue.h
+++ b/erts/emulator/hipe/hipe_x86_glue.h
@@ -1,24 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2001-2011. 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%
*/
-/*
- * $Id$
- */
+
+
#ifndef HIPE_X86_GLUE_H
#define HIPE_X86_GLUE_H
diff --git a/erts/emulator/hipe/hipe_x86_primops.h b/erts/emulator/hipe/hipe_x86_primops.h
index 757da484ad..96d2336bc5 100644
--- a/erts/emulator/hipe/hipe_x86_primops.h
+++ b/erts/emulator/hipe/hipe_x86_primops.h
@@ -1,22 +1,22 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2005-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2005-2011. 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%
*/
-/* $Id$
- */
+
+
PRIMOP_LIST(am_inc_stack_0, &nbif_inc_stack_0)
PRIMOP_LIST(am_handle_fp_exception, &nbif_handle_fp_exception)
diff --git a/erts/emulator/hipe/hipe_x86_signal.c b/erts/emulator/hipe/hipe_x86_signal.c
index 0c61e7bf96..64c0e0da3e 100644
--- a/erts/emulator/hipe/hipe_x86_signal.c
+++ b/erts/emulator/hipe/hipe_x86_signal.c
@@ -1,22 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
- *
+
+ *
+ * Copyright Ericsson AB 2001-2011. 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%
*/
-/* $Id$
+/*
* hipe_x86_signal.c
*
* Erlang code compiled to x86 native code uses the x86 %esp as its
diff --git a/erts/emulator/hipe/hipe_x86_stack.c b/erts/emulator/hipe/hipe_x86_stack.c
index b459593883..9ad3fa9d31 100644
--- a/erts/emulator/hipe/hipe_x86_stack.c
+++ b/erts/emulator/hipe/hipe_x86_stack.c
@@ -1,23 +1,23 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2001-2011. 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%
*/
-/* $Id$
- */
+
+
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
diff --git a/erts/emulator/sys/common/erl_mseg.c b/erts/emulator/sys/common/erl_mseg.c
index b1ee165489..ffa3a6328c 100644
--- a/erts/emulator/sys/common/erl_mseg.c
+++ b/erts/emulator/sys/common/erl_mseg.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2002-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2002-2011. 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
@@ -35,6 +35,7 @@
#include "global.h"
#include "erl_threads.h"
#include "erl_mtrace.h"
+#include "erl_time.h"
#include "big.h"
#if HAVE_ERTS_MSEG
@@ -76,8 +77,10 @@ static int atoms_initialized;
static Uint cache_check_interval;
+typedef struct mem_kind_t MemKind;
+
static void check_cache(void *unused);
-static void mseg_clear_cache(void);
+static void mseg_clear_cache(MemKind*);
static int is_cache_check_scheduled;
#ifdef ERTS_THREADS_NO_SMP
static int is_cache_check_requested;
@@ -122,6 +125,9 @@ static int mmap_fd;
#error "Not supported"
#endif /* #if HAVE_MMAP */
+#if defined(ERTS_MSEG_FAKE_SEGMENTS) && HALFWORD_HEAP
+# warning "ERTS_MSEG_FAKE_SEGMENTS will only be used for high memory segments"
+#endif
#if defined(ERTS_MSEG_FAKE_SEGMENTS)
#undef CAN_PARTLY_DESTROY
@@ -159,14 +165,43 @@ static struct {
CallCounter check_cache;
} calls;
-static cache_desc_t cache_descs[MAX_CACHE_SIZE];
-static cache_desc_t *free_cache_descs;
-static cache_desc_t *cache;
-static cache_desc_t *cache_end;
-static Uint cache_hits;
-static Uint cache_size;
-static Uint min_cached_seg_size;
-static Uint max_cached_seg_size;
+struct mem_kind_t {
+ cache_desc_t cache_descs[MAX_CACHE_SIZE];
+ cache_desc_t *free_cache_descs;
+ cache_desc_t *cache;
+ cache_desc_t *cache_end;
+
+ Uint cache_size;
+ Uint min_cached_seg_size;
+ Uint max_cached_seg_size;
+ Uint cache_hits;
+
+ struct {
+ struct {
+ Uint watermark;
+ Uint no;
+ Uint sz;
+ } current;
+ struct {
+ Uint no;
+ Uint sz;
+ } max;
+ struct {
+ Uint no;
+ Uint sz;
+ } max_ever;
+ } segments;
+
+ const char* name;
+ MemKind* next;
+};/*MemKind*/
+
+#if HALFWORD_HEAP
+static MemKind low_mem, hi_mem;
+#else
+static MemKind the_mem;
+#endif
+static MemKind* mk_list = NULL;
static Uint max_cache_size;
static Uint abs_max_cache_bad_fit;
@@ -176,47 +211,32 @@ static Uint rel_max_cache_bad_fit;
static Uint min_seg_size;
#endif
-struct {
- struct {
- Uint watermark;
- Uint no;
- Uint sz;
- } current;
- struct {
- Uint no;
- Uint sz;
- } max;
- struct {
- Uint no;
- Uint sz;
- } max_ever;
-} segments;
-#define ERTS_MSEG_ALLOC_STAT(SZ) \
+#define ERTS_MSEG_ALLOC_STAT(C,SZ) \
do { \
- segments.current.no++; \
- if (segments.max.no < segments.current.no) \
- segments.max.no = segments.current.no; \
- if (segments.current.watermark < segments.current.no) \
- segments.current.watermark = segments.current.no; \
- segments.current.sz += (SZ); \
- if (segments.max.sz < segments.current.sz) \
- segments.max.sz = segments.current.sz; \
+ C->segments.current.no++; \
+ if (C->segments.max.no < C->segments.current.no) \
+ C->segments.max.no = C->segments.current.no; \
+ if (C->segments.current.watermark < C->segments.current.no) \
+ C->segments.current.watermark = C->segments.current.no; \
+ C->segments.current.sz += (SZ); \
+ if (C->segments.max.sz < C->segments.current.sz) \
+ C->segments.max.sz = C->segments.current.sz; \
} while (0)
-#define ERTS_MSEG_DEALLOC_STAT(SZ) \
+#define ERTS_MSEG_DEALLOC_STAT(C,SZ) \
do { \
- ASSERT(segments.current.no > 0); \
- segments.current.no--; \
- ASSERT(segments.current.sz >= (SZ)); \
- segments.current.sz -= (SZ); \
+ ASSERT(C->segments.current.no > 0); \
+ C->segments.current.no--; \
+ ASSERT(C->segments.current.sz >= (SZ)); \
+ C->segments.current.sz -= (SZ); \
} while (0)
-#define ERTS_MSEG_REALLOC_STAT(OSZ, NSZ) \
+#define ERTS_MSEG_REALLOC_STAT(C,OSZ, NSZ) \
do { \
- ASSERT(segments.current.sz >= (OSZ)); \
- segments.current.sz -= (OSZ); \
- segments.current.sz += (NSZ); \
+ ASSERT(C->segments.current.sz >= (OSZ)); \
+ C->segments.current.sz -= (OSZ); \
+ C->segments.current.sz += (NSZ); \
} while (0)
#define ONE_GIGA (1000000000)
@@ -271,7 +291,7 @@ schedule_cache_check(void)
#endif
{
cache_check_timer.active = 0;
- erl_set_timer(&cache_check_timer,
+ erts_set_timer(&cache_check_timer,
check_cache,
NULL,
NULL,
@@ -302,38 +322,45 @@ check_schedule_cache_check(void)
static void
mseg_shutdown(void)
{
+ MemKind* mk;
erts_mtx_lock(&mseg_mutex);
- mseg_clear_cache();
+ for (mk=mk_list; mk; mk=mk->next) {
+ mseg_clear_cache(mk);
+ }
erts_mtx_unlock(&mseg_mutex);
}
static ERTS_INLINE void *
-mseg_create(Uint size)
+mseg_create(MemKind* mk, Uint size)
{
void *seg;
ASSERT(size % page_size == 0);
-#if defined(ERTS_MSEG_FAKE_SEGMENTS)
- seg = erts_sys_alloc(ERTS_ALC_N_INVALID, NULL, size);
-#elif HAVE_MMAP
#if HALFWORD_HEAP
- seg = pmmap(size);
-#else
- seg = (void *) mmap((void *) 0, (size_t) size,
- MMAP_PROT, MMAP_FLAGS, MMAP_FD, 0);
- if (seg == (void *) MAP_FAILED)
- seg = NULL;
-#endif
-#if HALFWORD_HEAP
- if ((unsigned long) seg & CHECK_POINTER_MASK) {
- erts_fprintf(stderr,"Pointer mask failure (0x%08lx)\n",(unsigned long) seg);
- return NULL;
+ if (mk == &low_mem) {
+ seg = pmmap(size);
+ if ((unsigned long) seg & CHECK_POINTER_MASK) {
+ erts_fprintf(stderr,"Pointer mask failure (0x%08lx)\n",(unsigned long) seg);
+ return NULL;
+ }
}
+ else
#endif
+ {
+#if defined(ERTS_MSEG_FAKE_SEGMENTS)
+ seg = erts_sys_alloc(ERTS_ALC_N_INVALID, NULL, size);
+#elif HAVE_MMAP
+ {
+ seg = (void *) mmap((void *) 0, (size_t) size,
+ MMAP_PROT, MMAP_FLAGS, MMAP_FD, 0);
+ if (seg == (void *) MAP_FAILED)
+ seg = NULL;
+ }
#else
-#error "Missing mseg_create() implementation"
+# error "Missing mseg_create() implementation"
#endif
+ }
INC_CC(create);
@@ -341,25 +368,29 @@ mseg_create(Uint size)
}
static ERTS_INLINE void
-mseg_destroy(void *seg, Uint size)
+mseg_destroy(MemKind* mk, void *seg, Uint size)
{
-#if defined(ERTS_MSEG_FAKE_SEGMENTS)
- erts_sys_free(ERTS_ALC_N_INVALID, NULL, seg);
-#elif HAVE_MMAP
+ int res;
-#ifdef DEBUG
- int res =
-#endif
#if HALFWORD_HEAP
- pmunmap((void *) seg, size);
+ if (mk == &low_mem) {
+ res = pmunmap((void *) seg, size);
+ }
+ else
+#endif
+ {
+#ifdef ERTS_MSEG_FAKE_SEGMENTS
+ erts_sys_free(ERTS_ALC_N_INVALID, NULL, seg);
+ res = 0;
+#elif HAVE_MMAP
+ res = munmap((void *) seg, size);
#else
- munmap((void *) seg, size);
+# error "Missing mseg_destroy() implementation"
#endif
+ }
+
ASSERT(size % page_size == 0);
ASSERT(res == 0);
-#else
-#error "Missing mseg_destroy() implementation"
-#endif
INC_CC(destroy);
@@ -368,39 +399,44 @@ mseg_destroy(void *seg, Uint size)
#if HAVE_MSEG_RECREATE
static ERTS_INLINE void *
-mseg_recreate(void *old_seg, Uint old_size, Uint new_size)
+mseg_recreate(MemKind* mk, void *old_seg, Uint old_size, Uint new_size)
{
void *new_seg;
ASSERT(old_size % page_size == 0);
ASSERT(new_size % page_size == 0);
-#if defined(ERTS_MSEG_FAKE_SEGMENTS)
- new_seg = erts_sys_realloc(ERTS_ALC_N_INVALID, NULL, old_seg, new_size);
-#elif HAVE_MREMAP
#if HALFWORD_HEAP
- new_seg = (void *) pmremap((void *) old_seg,
- (size_t) old_size,
- (size_t) new_size);
-#elif defined(__NetBSD__)
- new_seg = (void *) mremap((void *) old_seg,
- (size_t) old_size,
- NULL,
- (size_t) new_size,
- 0);
- if (new_seg == (void *) MAP_FAILED)
- new_seg = NULL;
-#else
- new_seg = (void *) mremap((void *) old_seg,
- (size_t) old_size,
- (size_t) new_size,
- MREMAP_MAYMOVE);
- if (new_seg == (void *) MAP_FAILED)
- new_seg = NULL;
+ if (mk == &low_mem) {
+ new_seg = (void *) pmremap((void *) old_seg,
+ (size_t) old_size,
+ (size_t) new_size);
+ }
+ else
#endif
+ {
+#if defined(ERTS_MSEG_FAKE_SEGMENTS)
+ new_seg = erts_sys_realloc(ERTS_ALC_N_INVALID, NULL, old_seg, new_size);
+#elif HAVE_MREMAP
+
+ #if defined(__NetBSD__)
+ new_seg = (void *) mremap((void *) old_seg,
+ (size_t) old_size,
+ NULL,
+ (size_t) new_size,
+ 0);
+ #else
+ new_seg = (void *) mremap((void *) old_seg,
+ (size_t) old_size,
+ (size_t) new_size,
+ MREMAP_MAYMOVE);
+ #endif
+ if (new_seg == (void *) MAP_FAILED)
+ new_seg = NULL;
#else
#error "Missing mseg_recreate() implementation"
#endif
+ }
INC_CC(recreate);
@@ -411,134 +447,142 @@ mseg_recreate(void *old_seg, Uint old_size, Uint new_size)
static ERTS_INLINE cache_desc_t *
-alloc_cd(void)
+alloc_cd(MemKind* mk)
{
- cache_desc_t *cd = free_cache_descs;
+ cache_desc_t *cd = mk->free_cache_descs;
ERTS_LC_ASSERT(erts_lc_mtx_is_locked(&mseg_mutex));
if (cd)
- free_cache_descs = cd->next;
+ mk->free_cache_descs = cd->next;
return cd;
}
static ERTS_INLINE void
-free_cd(cache_desc_t *cd)
+free_cd(MemKind* mk, cache_desc_t *cd)
{
ERTS_LC_ASSERT(erts_lc_mtx_is_locked(&mseg_mutex));
- cd->next = free_cache_descs;
- free_cache_descs = cd;
+ cd->next = mk->free_cache_descs;
+ mk->free_cache_descs = cd;
}
static ERTS_INLINE void
-link_cd(cache_desc_t *cd)
+link_cd(MemKind* mk, cache_desc_t *cd)
{
ERTS_LC_ASSERT(erts_lc_mtx_is_locked(&mseg_mutex));
- if (cache)
- cache->prev = cd;
- cd->next = cache;
+ if (mk->cache)
+ mk->cache->prev = cd;
+ cd->next = mk->cache;
cd->prev = NULL;
- cache = cd;
+ mk->cache = cd;
- if (!cache_end) {
+ if (!mk->cache_end) {
ASSERT(!cd->next);
- cache_end = cd;
+ mk->cache_end = cd;
}
- cache_size++;
+ mk->cache_size++;
}
+#if CAN_PARTLY_DESTROY
static ERTS_INLINE void
-end_link_cd(cache_desc_t *cd)
+end_link_cd(MemKind* mk, cache_desc_t *cd)
{
ERTS_LC_ASSERT(erts_lc_mtx_is_locked(&mseg_mutex));
- if (cache_end)
- cache_end->next = cd;
+ if (mk->cache_end)
+ mk->cache_end->next = cd;
cd->next = NULL;
- cd->prev = cache_end;
- cache_end = cd;
+ cd->prev = mk->cache_end;
+ mk->cache_end = cd;
- if (!cache) {
+ if (!mk->cache) {
ASSERT(!cd->prev);
- cache = cd;
+ mk->cache = cd;
}
- cache_size++;
+ mk->cache_size++;
}
+#endif
static ERTS_INLINE void
-unlink_cd(cache_desc_t *cd)
+unlink_cd(MemKind* mk, cache_desc_t *cd)
{
ERTS_LC_ASSERT(erts_lc_mtx_is_locked(&mseg_mutex));
if (cd->next)
cd->next->prev = cd->prev;
else
- cache_end = cd->prev;
+ mk->cache_end = cd->prev;
if (cd->prev)
cd->prev->next = cd->next;
else
- cache = cd->next;
- ASSERT(cache_size > 0);
- cache_size--;
+ mk->cache = cd->next;
+ ASSERT(mk->cache_size > 0);
+ mk->cache_size--;
}
static ERTS_INLINE void
-check_cache_limits(void)
+check_cache_limits(MemKind* mk)
{
cache_desc_t *cd;
ERTS_LC_ASSERT(erts_lc_mtx_is_locked(&mseg_mutex));
- max_cached_seg_size = 0;
- min_cached_seg_size = ~((Uint) 0);
- for (cd = cache; cd; cd = cd->next) {
- if (cd->size < min_cached_seg_size)
- min_cached_seg_size = cd->size;
- if (cd->size > max_cached_seg_size)
- max_cached_seg_size = cd->size;
+ mk->max_cached_seg_size = 0;
+ mk->min_cached_seg_size = ~((Uint) 0);
+ for (cd = mk->cache; cd; cd = cd->next) {
+ if (cd->size < mk->min_cached_seg_size)
+ mk->min_cached_seg_size = cd->size;
+ if (cd->size > mk->max_cached_seg_size)
+ mk->max_cached_seg_size = cd->size;
}
-
}
static ERTS_INLINE void
-adjust_cache_size(int force_check_limits)
+adjust_cache_size(MemKind* mk, int force_check_limits)
{
cache_desc_t *cd;
int check_limits = force_check_limits;
- Sint max_cached = ((Sint) segments.current.watermark
- - (Sint) segments.current.no);
+ Sint max_cached = ((Sint) mk->segments.current.watermark
+ - (Sint) mk->segments.current.no);
ERTS_LC_ASSERT(erts_lc_mtx_is_locked(&mseg_mutex));
- while (((Sint) cache_size) > max_cached && ((Sint) cache_size) > 0) {
- ASSERT(cache_end);
- cd = cache_end;
+ while (((Sint) mk->cache_size) > max_cached && ((Sint) mk->cache_size) > 0) {
+ ASSERT(mk->cache_end);
+ cd = mk->cache_end;
if (!check_limits &&
- !(min_cached_seg_size < cd->size
- && cd->size < max_cached_seg_size)) {
+ !(mk->min_cached_seg_size < cd->size
+ && cd->size < mk->max_cached_seg_size)) {
check_limits = 1;
}
if (erts_mtrace_enabled)
erts_mtrace_crr_free(SEGTYPE, SEGTYPE, cd->seg);
- mseg_destroy(cd->seg, cd->size);
- unlink_cd(cd);
- free_cd(cd);
+ mseg_destroy(mk, cd->seg, cd->size);
+ unlink_cd(mk,cd);
+ free_cd(mk,cd);
}
if (check_limits)
- check_cache_limits();
-
+ check_cache_limits(mk);
}
static void
-check_cache(void *unused)
+check_one_cache(MemKind* mk)
{
+ if (mk->segments.current.watermark > mk->segments.current.no)
+ mk->segments.current.watermark--;
+ adjust_cache_size(mk, 0);
+
+ if (mk->cache_size)
+ schedule_cache_check();
+}
+
+static void check_cache(void* unused)
+{
+ MemKind* mk;
erts_mtx_lock(&mseg_mutex);
is_cache_check_scheduled = 0;
- if (segments.current.watermark > segments.current.no)
- segments.current.watermark--;
- adjust_cache_size(0);
-
- if (cache_size)
- schedule_cache_check();
+ for (mk=mk_list; mk; mk=mk->next) {
+ check_one_cache(mk);
+ }
INC_CC(check_cache);
@@ -546,28 +590,45 @@ check_cache(void *unused)
}
static void
-mseg_clear_cache(void)
+mseg_clear_cache(MemKind* mk)
{
- segments.current.watermark = 0;
+ mk->segments.current.watermark = 0;
- adjust_cache_size(1);
+ adjust_cache_size(mk, 1);
- ASSERT(!cache);
- ASSERT(!cache_end);
- ASSERT(!cache_size);
+ ASSERT(!mk->cache);
+ ASSERT(!mk->cache_end);
+ ASSERT(!mk->cache_size);
- segments.current.watermark = segments.current.no;
+ mk->segments.current.watermark = mk->segments.current.no;
INC_CC(clear_cache);
}
+static ERTS_INLINE MemKind* type2mk(ErtsAlcType_t atype)
+{
+#if HALFWORD_HEAP
+ switch (atype) {
+ case ERTS_ALC_A_ETS:
+ case ERTS_ALC_A_BINARY:
+ case ERTS_ALC_A_FIXED_SIZE:
+ case ERTS_ALC_A_DRIVER:
+ return &hi_mem;
+ default:
+ return &low_mem;
+ }
+#else
+ return &the_mem;
+#endif
+}
+
static void *
mseg_alloc(ErtsAlcType_t atype, Uint *size_p, const ErtsMsegOpt_t *opt)
{
-
Uint max, min, diff_size, size;
cache_desc_t *cd, *cand_cd;
void *seg;
+ MemKind* mk = type2mk(atype);
INC_CC(alloc);
@@ -580,11 +641,11 @@ mseg_alloc(ErtsAlcType_t atype, Uint *size_p, const ErtsMsegOpt_t *opt)
if (!opt->cache) {
create_seg:
- adjust_cache_size(0);
- seg = mseg_create(size);
+ adjust_cache_size(mk,0);
+ seg = mseg_create(mk, size);
if (!seg) {
- mseg_clear_cache();
- seg = mseg_create(size);
+ mseg_clear_cache(mk);
+ seg = mseg_create(mk, size);
if (!seg)
size = 0;
}
@@ -593,17 +654,17 @@ mseg_alloc(ErtsAlcType_t atype, Uint *size_p, const ErtsMsegOpt_t *opt)
if (seg) {
if (erts_mtrace_enabled)
erts_mtrace_crr_alloc(seg, atype, ERTS_MTRACE_SEGMENT_ID, size);
- ERTS_MSEG_ALLOC_STAT(size);
+ ERTS_MSEG_ALLOC_STAT(mk,size);
}
return seg;
}
- if (size > max_cached_seg_size)
+ if (size > mk->max_cached_seg_size)
goto create_seg;
- if (size < min_cached_seg_size) {
+ if (size < mk->min_cached_seg_size) {
- diff_size = min_cached_seg_size - size;
+ diff_size = mk->min_cached_seg_size - size;
if (diff_size > abs_max_cache_bad_fit)
goto create_seg;
@@ -617,7 +678,7 @@ mseg_alloc(ErtsAlcType_t atype, Uint *size_p, const ErtsMsegOpt_t *opt)
min = ~((Uint) 0);
cand_cd = NULL;
- for (cd = cache; cd; cd = cd->next) {
+ for (cd = mk->cache; cd; cd = cd->next) {
if (cd->size >= size) {
if (!cand_cd) {
cand_cd = cd;
@@ -638,8 +699,8 @@ mseg_alloc(ErtsAlcType_t atype, Uint *size_p, const ErtsMsegOpt_t *opt)
min = cd->size;
}
- min_cached_seg_size = min;
- max_cached_seg_size = max;
+ mk->min_cached_seg_size = min;
+ mk->max_cached_seg_size = max;
if (!cand_cd)
goto create_seg;
@@ -648,20 +709,20 @@ mseg_alloc(ErtsAlcType_t atype, Uint *size_p, const ErtsMsegOpt_t *opt)
if (diff_size > abs_max_cache_bad_fit
|| 100*PAGES(diff_size) > rel_max_cache_bad_fit*PAGES(size)) {
- if (max_cached_seg_size < cand_cd->size)
- max_cached_seg_size = cand_cd->size;
- if (min_cached_seg_size > cand_cd->size)
- min_cached_seg_size = cand_cd->size;
+ if (mk->max_cached_seg_size < cand_cd->size)
+ mk->max_cached_seg_size = cand_cd->size;
+ if (mk->min_cached_seg_size > cand_cd->size)
+ mk->min_cached_seg_size = cand_cd->size;
goto create_seg;
}
- cache_hits++;
+ mk->cache_hits++;
size = cand_cd->size;
seg = cand_cd->seg;
- unlink_cd(cand_cd);
- free_cd(cand_cd);
+ unlink_cd(mk,cand_cd);
+ free_cd(mk,cand_cd);
*size_p = size;
@@ -671,7 +732,8 @@ mseg_alloc(ErtsAlcType_t atype, Uint *size_p, const ErtsMsegOpt_t *opt)
}
if (seg)
- ERTS_MSEG_ALLOC_STAT(size);
+ ERTS_MSEG_ALLOC_STAT(mk,size);
+
return seg;
}
@@ -680,41 +742,42 @@ static void
mseg_dealloc(ErtsAlcType_t atype, void *seg, Uint size,
const ErtsMsegOpt_t *opt)
{
+ MemKind* mk = type2mk(atype);
cache_desc_t *cd;
- ERTS_MSEG_DEALLOC_STAT(size);
+ ERTS_MSEG_DEALLOC_STAT(mk,size);
if (!opt->cache || max_cache_size == 0) {
if (erts_mtrace_enabled)
erts_mtrace_crr_free(atype, SEGTYPE, seg);
- mseg_destroy(seg, size);
+ mseg_destroy(mk, seg, size);
}
else {
int check_limits = 0;
- if (size < min_cached_seg_size)
- min_cached_seg_size = size;
- if (size > max_cached_seg_size)
- max_cached_seg_size = size;
-
- if (!free_cache_descs) {
- cd = cache_end;
- if (!(min_cached_seg_size < cd->size
- && cd->size < max_cached_seg_size)) {
+ if (size < mk->min_cached_seg_size)
+ mk->min_cached_seg_size = size;
+ if (size > mk->max_cached_seg_size)
+ mk->max_cached_seg_size = size;
+
+ if (!mk->free_cache_descs) {
+ cd = mk->cache_end;
+ if (!(mk->min_cached_seg_size < cd->size
+ && cd->size < mk->max_cached_seg_size)) {
check_limits = 1;
}
if (erts_mtrace_enabled)
erts_mtrace_crr_free(SEGTYPE, SEGTYPE, cd->seg);
- mseg_destroy(cd->seg, cd->size);
- unlink_cd(cd);
- free_cd(cd);
+ mseg_destroy(mk, cd->seg, cd->size);
+ unlink_cd(mk,cd);
+ free_cd(mk,cd);
}
- cd = alloc_cd();
+ cd = alloc_cd(mk);
ASSERT(cd);
cd->seg = seg;
cd->size = size;
- link_cd(cd);
+ link_cd(mk,cd);
if (erts_mtrace_enabled) {
erts_mtrace_crr_free(atype, SEGTYPE, seg);
@@ -724,7 +787,7 @@ mseg_dealloc(ErtsAlcType_t atype, void *seg, Uint size,
/* ASSERT(segments.current.watermark >= segments.current.no + cache_size); */
if (check_limits)
- check_cache_limits();
+ check_cache_limits(mk);
schedule_cache_check();
@@ -737,6 +800,7 @@ static void *
mseg_realloc(ErtsAlcType_t atype, void *seg, Uint old_size, Uint *new_size_p,
const ErtsMsegOpt_t *opt)
{
+ MemKind* mk = type2mk(atype);
void *new_seg;
Uint new_size;
@@ -774,15 +838,15 @@ mseg_realloc(ErtsAlcType_t atype, void *seg, Uint old_size, Uint *new_size_p,
#if CAN_PARTLY_DESTROY
if (shrink_sz > min_seg_size
- && free_cache_descs
+ && mk->free_cache_descs
&& opt->cache) {
cache_desc_t *cd;
- cd = alloc_cd();
+ cd = alloc_cd(mk);
ASSERT(cd);
cd->seg = ((char *) seg) + new_size;
cd->size = shrink_sz;
- end_link_cd(cd);
+ end_link_cd(mk,cd);
if (erts_mtrace_enabled) {
erts_mtrace_crr_realloc(new_seg,
@@ -801,7 +865,7 @@ mseg_realloc(ErtsAlcType_t atype, void *seg, Uint old_size, Uint *new_size_p,
SEGTYPE,
seg,
new_size);
- mseg_destroy(((char *) seg) + new_size, shrink_sz);
+ mseg_destroy(mk, ((char *) seg) + new_size, shrink_sz);
}
#elif HAVE_MSEG_RECREATE
@@ -835,7 +899,7 @@ mseg_realloc(ErtsAlcType_t atype, void *seg, Uint old_size, Uint *new_size_p,
#if !CAN_PARTLY_DESTROY
do_recreate:
#endif
- new_seg = mseg_recreate((void *) seg, old_size, new_size);
+ new_seg = mseg_recreate(mk, (void *) seg, old_size, new_size);
if (erts_mtrace_enabled)
erts_mtrace_crr_realloc(new_seg, atype, SEGTYPE, seg, new_size);
if (!new_seg)
@@ -858,7 +922,7 @@ mseg_realloc(ErtsAlcType_t atype, void *seg, Uint old_size, Uint *new_size_p,
*new_size_p = new_size;
- ERTS_MSEG_REALLOC_STAT(old_size, new_size);
+ ERTS_MSEG_REALLOC_STAT(mk, old_size, new_size);
return new_seg;
}
@@ -874,6 +938,8 @@ static struct {
Eterm mcs;
Eterm cci;
+ Eterm memkind;
+ Eterm name;
Eterm status;
Eterm cached_segments;
Eterm cache_hits;
@@ -923,6 +989,8 @@ init_atoms(void)
#endif
AM_INIT(version);
+ AM_INIT(memkind);
+ AM_INIT(name);
AM_INIT(options);
AM_INIT(amcbf);
@@ -1024,10 +1092,10 @@ info_options(char *prefix,
if (print_to_p) {
int to = *print_to_p;
void *arg = print_to_arg;
- erts_print(to, arg, "%samcbf: %bpu\n", prefix, abs_max_cache_bad_fit);
- erts_print(to, arg, "%srmcbf: %bpu\n", prefix, rel_max_cache_bad_fit);
- erts_print(to, arg, "%smcs: %bpu\n", prefix, max_cache_size);
- erts_print(to, arg, "%scci: %bpu\n", prefix, cache_check_interval);
+ erts_print(to, arg, "%samcbf: %beu\n", prefix, abs_max_cache_bad_fit);
+ erts_print(to, arg, "%srmcbf: %beu\n", prefix, rel_max_cache_bad_fit);
+ erts_print(to, arg, "%smcs: %beu\n", prefix, max_cache_size);
+ erts_print(to, arg, "%scci: %beu\n", prefix, cache_check_interval);
}
if (hpp || szp) {
@@ -1063,9 +1131,9 @@ info_calls(int *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp)
#define PRINT_CC(TO, TOA, CC) \
if (calls.CC.giga_no == 0) \
- erts_print(TO, TOA, "mseg_%s calls: %bpu\n", #CC, calls.CC.no); \
+ erts_print(TO, TOA, "mseg_%s calls: %b32u\n", #CC, calls.CC.no); \
else \
- erts_print(TO, TOA, "mseg_%s calls: %bpu%09bpu\n", #CC, \
+ erts_print(TO, TOA, "mseg_%s calls: %b32u%09b32u\n", #CC, \
calls.CC.giga_no, calls.CC.no)
int to = *print_to_p;
@@ -1133,65 +1201,88 @@ info_calls(int *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp)
}
static Eterm
-info_status(int *print_to_p,
- void *print_to_arg,
- int begin_new_max_period,
- Uint **hpp,
- Uint *szp)
+info_status(MemKind* mk, int *print_to_p, void *print_to_arg,
+ int begin_new_max_period, Uint **hpp, Uint *szp)
{
Eterm res = THE_NON_VALUE;
- if (segments.max_ever.no < segments.max.no)
- segments.max_ever.no = segments.max.no;
- if (segments.max_ever.sz < segments.max.sz)
- segments.max_ever.sz = segments.max.sz;
+ if (mk->segments.max_ever.no < mk->segments.max.no)
+ mk->segments.max_ever.no = mk->segments.max.no;
+ if (mk->segments.max_ever.sz < mk->segments.max.sz)
+ mk->segments.max_ever.sz = mk->segments.max.sz;
if (print_to_p) {
int to = *print_to_p;
void *arg = print_to_arg;
- erts_print(to, arg, "cached_segments: %bpu\n", cache_size);
- erts_print(to, arg, "cache_hits: %bpu\n", cache_hits);
- erts_print(to, arg, "segments: %bpu %bpu %bpu\n",
- segments.current.no, segments.max.no, segments.max_ever.no);
- erts_print(to, arg, "segments_size: %bpu %bpu %bpu\n",
- segments.current.sz, segments.max.sz, segments.max_ever.sz);
- erts_print(to, arg, "segments_watermark: %bpu\n",
- segments.current.watermark);
+ erts_print(to, arg, "cached_segments: %beu\n", mk->cache_size);
+ erts_print(to, arg, "cache_hits: %beu\n", mk->cache_hits);
+ erts_print(to, arg, "segments: %beu %beu %beu\n",
+ mk->segments.current.no, mk->segments.max.no, mk->segments.max_ever.no);
+ erts_print(to, arg, "segments_size: %beu %beu %beu\n",
+ mk->segments.current.sz, mk->segments.max.sz, mk->segments.max_ever.sz);
+ erts_print(to, arg, "segments_watermark: %beu\n",
+ mk->segments.current.watermark);
}
if (hpp || szp) {
res = NIL;
add_2tup(hpp, szp, &res,
am.segments_watermark,
- bld_unstable_uint(hpp, szp, segments.current.watermark));
+ bld_unstable_uint(hpp, szp, mk->segments.current.watermark));
add_4tup(hpp, szp, &res,
am.segments_size,
- bld_unstable_uint(hpp, szp, segments.current.sz),
- bld_unstable_uint(hpp, szp, segments.max.sz),
- bld_unstable_uint(hpp, szp, segments.max_ever.sz));
+ bld_unstable_uint(hpp, szp, mk->segments.current.sz),
+ bld_unstable_uint(hpp, szp, mk->segments.max.sz),
+ bld_unstable_uint(hpp, szp, mk->segments.max_ever.sz));
add_4tup(hpp, szp, &res,
am.segments,
- bld_unstable_uint(hpp, szp, segments.current.no),
- bld_unstable_uint(hpp, szp, segments.max.no),
- bld_unstable_uint(hpp, szp, segments.max_ever.no));
+ bld_unstable_uint(hpp, szp, mk->segments.current.no),
+ bld_unstable_uint(hpp, szp, mk->segments.max.no),
+ bld_unstable_uint(hpp, szp, mk->segments.max_ever.no));
add_2tup(hpp, szp, &res,
am.cache_hits,
- bld_unstable_uint(hpp, szp, cache_hits));
+ bld_unstable_uint(hpp, szp, mk->cache_hits));
add_2tup(hpp, szp, &res,
am.cached_segments,
- bld_unstable_uint(hpp, szp, cache_size));
+ bld_unstable_uint(hpp, szp, mk->cache_size));
}
if (begin_new_max_period) {
- segments.max.no = segments.current.no;
- segments.max.sz = segments.current.sz;
+ mk->segments.max.no = mk->segments.current.no;
+ mk->segments.max.sz = mk->segments.current.sz;
}
return res;
}
+static Eterm info_memkind(MemKind* mk, int *print_to_p, void *print_to_arg,
+ int begin_max_per, Uint **hpp, Uint *szp)
+{
+ Eterm res = THE_NON_VALUE;
+ Eterm atoms[3];
+ Eterm values[3];
+
+ if (print_to_p) {
+ erts_print(*print_to_p, print_to_arg, "memory kind: %s\n", mk->name);
+ }
+ if (hpp || szp) {
+ atoms[0] = am.name;
+ atoms[1] = am.status;
+ atoms[2] = am.calls;
+ values[0] = erts_bld_string(hpp, szp, mk->name);
+ }
+ values[1] = info_status(mk, print_to_p, print_to_arg, begin_max_per, hpp, szp);
+ values[2] = info_calls(print_to_p, print_to_arg, hpp, szp);
+
+ if (hpp || szp)
+ res = bld_2tup_list(hpp, szp, 3, atoms, values);
+
+ return res;
+}
+
+
static Eterm
info_version(int *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp)
{
@@ -1238,6 +1329,7 @@ erts_mseg_info(int *print_to_p,
Eterm res = THE_NON_VALUE;
Eterm atoms[4];
Eterm values[4];
+ Uint n = 0;
erts_mtx_lock(&mseg_mutex);
@@ -1248,17 +1340,19 @@ erts_mseg_info(int *print_to_p,
atoms[0] = am.version;
atoms[1] = am.options;
- atoms[2] = am.status;
- atoms[3] = am.calls;
+ atoms[2] = am.memkind;
+ atoms[3] = am.memkind;
}
-
- values[0] = info_version(print_to_p, print_to_arg, hpp, szp);
- values[1] = info_options("option ", print_to_p, print_to_arg, hpp, szp);
- values[2] = info_status(print_to_p, print_to_arg, begin_max_per, hpp, szp);
- values[3] = info_calls(print_to_p, print_to_arg, hpp, szp);
-
+ values[n++] = info_version(print_to_p, print_to_arg, hpp, szp);
+ values[n++] = info_options("option ", print_to_p, print_to_arg, hpp, szp);
+#if HALFWORD_HEAP
+ values[n++] = info_memkind(&low_mem, print_to_p, print_to_arg, begin_max_per, hpp, szp);
+ values[n++] = info_memkind(&hi_mem, print_to_p, print_to_arg, begin_max_per, hpp, szp);
+#else
+ values[n++] = info_memkind(&the_mem, print_to_p, print_to_arg, begin_max_per, hpp, szp);
+#endif
if (hpp || szp)
- res = bld_2tup_list(hpp, szp, 4, atoms, values);
+ res = bld_2tup_list(hpp, szp, n, atoms, values);
erts_mtx_unlock(&mseg_mutex);
@@ -1317,17 +1411,23 @@ erts_mseg_realloc(ErtsAlcType_t atype, void *seg, Uint old_size,
void
erts_mseg_clear_cache(void)
{
+ MemKind* mk;
erts_mtx_lock(&mseg_mutex);
- mseg_clear_cache();
+ for (mk=mk_list; mk; mk=mk->next) {
+ mseg_clear_cache(mk);
+ }
erts_mtx_unlock(&mseg_mutex);
}
Uint
erts_mseg_no(void)
{
- Uint n;
+ MemKind* mk;
+ Uint n = 0;
erts_mtx_lock(&mseg_mutex);
- n = segments.current.no;
+ for (mk=mk_list; mk; mk=mk->next) {
+ n += mk->segments.current.no;
+ }
erts_mtx_unlock(&mseg_mutex);
return n;
}
@@ -1338,11 +1438,43 @@ erts_mseg_unit_size(void)
return page_size;
}
-void
-erts_mseg_init(ErtsMsegInit_t *init)
+static void mem_kind_init(MemKind* mk, const char* name)
{
unsigned i;
+ mk->cache = NULL;
+ mk->cache_end = NULL;
+ mk->max_cached_seg_size = 0;
+ mk->min_cached_seg_size = ~((Uint) 0);
+ mk->cache_size = 0;
+ mk->cache_hits = 0;
+
+ if (max_cache_size > 0) {
+ for (i = 0; i < max_cache_size - 1; i++)
+ mk->cache_descs[i].next = &mk->cache_descs[i + 1];
+ mk->cache_descs[max_cache_size - 1].next = NULL;
+ mk->free_cache_descs = &mk->cache_descs[0];
+ }
+ else
+ mk->free_cache_descs = NULL;
+
+ mk->segments.current.watermark = 0;
+ mk->segments.current.no = 0;
+ mk->segments.current.sz = 0;
+ mk->segments.max.no = 0;
+ mk->segments.max.sz = 0;
+ mk->segments.max_ever.no = 0;
+ mk->segments.max_ever.sz = 0;
+
+ mk->name = name;
+ mk->next = mk_list;
+ mk_list = mk;
+}
+
+
+void
+erts_mseg_init(ErtsMsegInit_t *init)
+{
atoms_initialized = 0;
is_init_done = 0;
@@ -1375,7 +1507,7 @@ erts_mseg_init(ErtsMsegInit_t *init)
while ((page_size >> page_shift) != 1) {
if ((page_size & (1 << (page_shift - 1))) != 0)
erl_exit(ERTS_ABORT_EXIT,
- "erts_mseg: Unexpected page_size %bpu\n", page_size);
+ "erts_mseg: Unexpected page_size %beu\n", page_size);
page_shift++;
}
@@ -1385,40 +1517,33 @@ erts_mseg_init(ErtsMsegInit_t *init)
min_seg_size = ~((Uint) 0);
#endif
- cache = NULL;
- cache_end = NULL;
- cache_hits = 0;
- max_cached_seg_size = 0;
- min_cached_seg_size = ~((Uint) 0);
- cache_size = 0;
+ if (max_cache_size > MAX_CACHE_SIZE)
+ max_cache_size = MAX_CACHE_SIZE;
+
+#if HALFWORD_HEAP
+ mem_kind_init(&low_mem, "low memory");
+ mem_kind_init(&hi_mem, "high memory");
+#else
+ mem_kind_init(&the_mem, "all memory");
+#endif
is_cache_check_scheduled = 0;
#ifdef ERTS_THREADS_NO_SMP
is_cache_check_requested = 0;
#endif
+}
- if (max_cache_size > MAX_CACHE_SIZE)
- max_cache_size = MAX_CACHE_SIZE;
- if (max_cache_size > 0) {
- for (i = 0; i < max_cache_size - 1; i++)
- cache_descs[i].next = &cache_descs[i + 1];
- cache_descs[max_cache_size - 1].next = NULL;
- free_cache_descs = &cache_descs[0];
+static ERTS_INLINE Uint tot_cache_size(void)
+{
+ MemKind* mk;
+ Uint sz = 0;
+ for (mk=mk_list; mk; mk=mk->next) {
+ sz += mk->cache_size;
}
- else
- free_cache_descs = NULL;
-
- segments.current.watermark = 0;
- segments.current.no = 0;
- segments.current.sz = 0;
- segments.max.no = 0;
- segments.max.sz = 0;
- segments.max_ever.no = 0;
- segments.max_ever.sz = 0;
+ return sz;
}
-
/*
* erts_mseg_late_init() have to be called after all allocators,
* threads and timers have been initialized.
@@ -1436,7 +1561,7 @@ erts_mseg_late_init(void)
#ifdef ERTS_THREADS_NO_SMP
async_handle = handle;
#endif
- if (cache_size)
+ if (tot_cache_size())
schedule_cache_check();
erts_mtx_unlock(&mseg_mutex);
}
@@ -1477,7 +1602,7 @@ erts_mseg_test(unsigned long op,
case 0x406: {
unsigned long res;
erts_mtx_lock(&mseg_mutex);
- res = (unsigned long) cache_size;
+ res = (unsigned long) tot_cache_size();
erts_mtx_unlock(&mseg_mutex);
return res;
}
@@ -1568,11 +1693,14 @@ static void *do_map(void *ptr, size_t sz)
return NULL;
}
-
+#if HAVE_MMAP
res = mmap(ptr, sz,
PROT_READ | PROT_WRITE, MAP_PRIVATE |
MAP_ANONYMOUS | MAP_FIXED,
-1 , 0);
+#else
+# error "Missing mmap support"
+#endif
if (res == MAP_FAILED) {
#ifdef HARDDEBUG
@@ -1672,10 +1800,19 @@ static int initialize_pmmap(void)
MAP_NORESERVE | EXTRA_MAP_FLAGS,
-1 , 0);
#ifdef HARDDEBUG
- printf("rsz = %ld, pages = %ld, rptr = %p\r\n",
- (unsigned long) rsz, (unsigned long) (rsz / pagsz),
- (void *) rptr);
+ printf("p=%p, rsz = %ld, pages = %ld, got range = %p -> %p\r\n",
+ p, (unsigned long) rsz, (unsigned long) (rsz / pagsz),
+ (void *) rptr, (void*)(rptr + rsz));
#endif
+ if ((UWord)(rptr + rsz) > RANGE_MAX) {
+ size_t rsz_trunc = RANGE_MAX - (UWord)rptr;
+#ifdef HARDDEBUG
+ printf("Reducing mmap'ed memory from %lu to %lu Mb, reduced range = %p -> %p\r\n",
+ rsz/(1024*1024), rsz_trunc/(1024*1024), rptr, rptr+rsz_trunc);
+#endif
+ munmap((void*)RANGE_MAX, rsz - rsz_trunc);
+ rsz = rsz_trunc;
+ }
if (!do_map(rptr,pagsz)) {
erl_exit(1,"Could not actually mmap first page for halfword emulator...\n");
}
@@ -1756,6 +1893,7 @@ static int pmunmap(void *p, size_t size)
FreeBlock *last;
FreeBlock *nb = (FreeBlock *) p;
+ ASSERT(((unsigned long)p & CHECK_POINTER_MASK)==0);
if (real_size > pagsz) {
if (do_unmap(((char *) p) + pagsz,real_size - pagsz)) {
return 1;
diff --git a/erts/emulator/sys/common/erl_poll.c b/erts/emulator/sys/common/erl_poll.c
index c17806d96c..3ae5b8d747 100644
--- a/erts/emulator/sys/common/erl_poll.c
+++ b/erts/emulator/sys/common/erl_poll.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2006-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2006-2011. 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
@@ -124,25 +124,11 @@
erts_smp_mtx_unlock(&(PS)->mtx)
#define ERTS_POLLSET_SET_POLLED_CHK(PS) \
- ((int) erts_smp_atomic_xchg(&(PS)->polled, (long) 1))
+ ((int) erts_atomic32_xchg(&(PS)->polled, (erts_aint32_t) 1))
#define ERTS_POLLSET_UNSET_POLLED(PS) \
- erts_smp_atomic_set(&(PS)->polled, (long) 0)
+ erts_atomic32_set(&(PS)->polled, (erts_aint32_t) 0)
#define ERTS_POLLSET_IS_POLLED(PS) \
- ((int) erts_smp_atomic_read(&(PS)->polled))
-
-#define ERTS_POLLSET_SET_POLLER_WOKEN_CHK(PS) set_poller_woken_chk((PS))
-#define ERTS_POLLSET_SET_POLLER_WOKEN(PS) \
-do { \
- ERTS_THR_MEMORY_BARRIER; \
- erts_smp_atomic_set(&(PS)->woken, (long) 1); \
-} while (0)
-#define ERTS_POLLSET_UNSET_POLLER_WOKEN(PS) \
-do { \
- erts_smp_atomic_set(&(PS)->woken, (long) 0); \
- ERTS_THR_MEMORY_BARRIER; \
-} while (0)
-#define ERTS_POLLSET_IS_POLLER_WOKEN(PS) \
- ((int) erts_smp_atomic_read(&(PS)->woken))
+ ((int) erts_atomic32_read(&(PS)->polled))
#else
@@ -152,69 +138,21 @@ do { \
#define ERTS_POLLSET_UNSET_POLLED(PS)
#define ERTS_POLLSET_IS_POLLED(PS) 0
-#if ERTS_POLL_ASYNC_INTERRUPT_SUPPORT
-
-/*
- * Ideally, the ERTS_POLLSET_SET_POLLER_WOKEN_CHK(PS) operation would
- * be atomic. This operation isn't, but we will do okay anyway. The
- * "woken check" is only an optimization. The only requirement we have:
- * If (PS)->woken is set to a value != 0 when interrupting, we have to
- * write on the the wakeup pipe at least once. Multiple writes are okay.
- */
-#define ERTS_POLLSET_SET_POLLER_WOKEN_CHK(PS) ((PS)->woken++)
-#define ERTS_POLLSET_SET_POLLER_WOKEN(PS) ((PS)->woken = 1, (void) 0)
-#define ERTS_POLLSET_UNSET_POLLER_WOKEN(PS) ((PS)->woken = 0, (void) 0)
-#define ERTS_POLLSET_IS_POLLER_WOKEN(PS) ((PS)->woken)
-
-#else
-
-#define ERTS_POLLSET_SET_POLLER_WOKEN_CHK(PS) 1
-#define ERTS_POLLSET_SET_POLLER_WOKEN(PS)
-#define ERTS_POLLSET_UNSET_POLLER_WOKEN(PS)
-#define ERTS_POLLSET_IS_POLLER_WOKEN(PS) 1
-
-#endif
-
#endif
#if ERTS_POLL_USE_UPDATE_REQUESTS_QUEUE
#define ERTS_POLLSET_SET_HAVE_UPDATE_REQUESTS(PS) \
- erts_smp_atomic_set(&(PS)->have_update_requests, (long) 1)
+ erts_smp_atomic32_set(&(PS)->have_update_requests, (erts_aint32_t) 1)
#define ERTS_POLLSET_UNSET_HAVE_UPDATE_REQUESTS(PS) \
- erts_smp_atomic_set(&(PS)->have_update_requests, (long) 0)
+ erts_smp_atomic32_set(&(PS)->have_update_requests, (erts_aint32_t) 0)
#define ERTS_POLLSET_HAVE_UPDATE_REQUESTS(PS) \
- ((int) erts_smp_atomic_read(&(PS)->have_update_requests))
+ ((int) erts_smp_atomic32_read(&(PS)->have_update_requests))
#else
#define ERTS_POLLSET_SET_HAVE_UPDATE_REQUESTS(PS)
#define ERTS_POLLSET_UNSET_HAVE_UPDATE_REQUESTS(PS)
#define ERTS_POLLSET_HAVE_UPDATE_REQUESTS(PS) 0
#endif
-#if ERTS_POLL_ASYNC_INTERRUPT_SUPPORT && !defined(ERTS_SMP)
-
-#define ERTS_POLLSET_UNSET_INTERRUPTED_CHK(PS) unset_interrupted_chk((PS))
-#define ERTS_POLLSET_UNSET_INTERRUPTED(PS) ((PS)->interrupt = 0, (void) 0)
-#define ERTS_POLLSET_SET_INTERRUPTED(PS) ((PS)->interrupt = 1, (void) 0)
-#define ERTS_POLLSET_IS_INTERRUPTED(PS) ((PS)->interrupt)
-
-#else
-
-#define ERTS_POLLSET_UNSET_INTERRUPTED_CHK(PS) unset_interrupted_chk((PS))
-#define ERTS_POLLSET_UNSET_INTERRUPTED(PS) \
-do { \
- erts_smp_atomic_set(&(PS)->interrupt, (long) 0); \
- ERTS_THR_MEMORY_BARRIER; \
-} while (0)
-#define ERTS_POLLSET_SET_INTERRUPTED(PS) \
-do { \
- ERTS_THR_MEMORY_BARRIER; \
- erts_smp_atomic_set(&(PS)->interrupt, (long) 1); \
-} while (0)
-#define ERTS_POLLSET_IS_INTERRUPTED(PS) \
- ((int) erts_smp_atomic_read(&(PS)->interrupt))
-
-#endif
-
#if ERTS_POLL_USE_FALLBACK
# if ERTS_POLL_USE_POLL
# define ERTS_POLL_NEED_FALLBACK(PS) ((PS)->no_poll_fds > 1)
@@ -318,14 +256,12 @@ struct ErtsPollSet_ {
#if ERTS_POLL_USE_UPDATE_REQUESTS_QUEUE
ErtsPollSetUpdateRequestsBlock update_requests;
ErtsPollSetUpdateRequestsBlock *curr_upd_req_block;
- erts_smp_atomic_t have_update_requests;
+ erts_smp_atomic32_t have_update_requests;
#endif
#ifdef ERTS_SMP
- erts_smp_atomic_t polled;
- erts_smp_atomic_t woken;
+ erts_atomic32_t polled;
erts_smp_mtx_t mtx;
#elif ERTS_POLL_ASYNC_INTERRUPT_SUPPORT
- volatile int woken;
#endif
#if ERTS_POLL_USE_WAKEUP_PIPE
int wake_fds[2];
@@ -333,12 +269,12 @@ struct ErtsPollSet_ {
#if ERTS_POLL_USE_FALLBACK
int fallback_used;
#endif
-#if ERTS_POLL_ASYNC_INTERRUPT_SUPPORT && !defined(ERTS_SMP)
- volatile int interrupt;
-#else
- erts_smp_atomic_t interrupt;
+#ifdef ERTS_SMP
+ erts_atomic32_t wakeup_state;
+#elif ERTS_POLL_ASYNC_INTERRUPT_SUPPORT
+ volatile int wakeup_state;
#endif
- erts_smp_atomic_t timeout;
+ erts_smp_atomic32_t timeout;
#ifdef ERTS_POLL_COUNT_AVOIDED_WAKEUPS
erts_smp_atomic_t no_avoided_wakeups;
erts_smp_atomic_t no_avoided_interrupts;
@@ -346,34 +282,6 @@ struct ErtsPollSet_ {
#endif
};
-static ERTS_INLINE int
-unset_interrupted_chk(ErtsPollSet ps)
-{
- int res;
-#if ERTS_POLL_ASYNC_INTERRUPT_SUPPORT && !defined(ERTS_SMP)
- /* This operation isn't atomic, but we have no need at all for an
- atomic operation here... */
- res = ps->interrupt;
- ps->interrupt = 0;
-#else
- res = (int) erts_smp_atomic_xchg(&ps->interrupt, (long) 0);
- ERTS_THR_MEMORY_BARRIER;
-#endif
- return res;
-
-}
-
-#ifdef ERTS_SMP
-
-static ERTS_INLINE int
-set_poller_woken_chk(ErtsPollSet ps)
-{
- ERTS_THR_MEMORY_BARRIER;
- return (int) erts_smp_atomic_xchg(&ps->woken, (long) 1);
-}
-
-#endif
-
void erts_silence_warn_unused_result(long unused);
static void fatal_error(char *format, ...);
static void fatal_error_async_signal_safe(char *error_str);
@@ -430,6 +338,64 @@ static void check_poll_status(ErtsPollSet ps);
static void print_misc_debug_info(void);
#endif
+#define ERTS_POLL_NOT_WOKEN 0
+#define ERTS_POLL_WOKEN -1
+#define ERTS_POLL_WOKEN_INTR 1
+
+static ERTS_INLINE void
+reset_wakeup_state(ErtsPollSet ps)
+{
+#ifdef ERTS_SMP
+ erts_atomic32_set(&ps->wakeup_state, ERTS_POLL_NOT_WOKEN);
+ ERTS_THR_MEMORY_BARRIER;
+#elif ERTS_POLL_ASYNC_INTERRUPT_SUPPORT
+ ps->wakeup_state = 0;
+#endif
+}
+
+static ERTS_INLINE int
+is_woken(ErtsPollSet ps)
+{
+#ifdef ERTS_SMP
+ return erts_atomic32_read_acqb(&ps->wakeup_state) != ERTS_POLL_NOT_WOKEN;
+#elif ERTS_POLL_ASYNC_INTERRUPT_SUPPORT
+ return ps->wakeup_state != ERTS_POLL_NOT_WOKEN;
+#else
+ return 0;
+#endif
+}
+
+static ERTS_INLINE int
+is_interrupted_reset(ErtsPollSet ps)
+{
+#ifdef ERTS_SMP
+ return (erts_atomic32_xchg(&ps->wakeup_state, ERTS_POLL_NOT_WOKEN)
+ == ERTS_POLL_WOKEN_INTR);
+#elif ERTS_POLL_ASYNC_INTERRUPT_SUPPORT
+ int res = ps->wakeup_state == ERTS_POLL_WOKEN_INTR;
+ ps->wakeup_state = ERTS_POLL_NOT_WOKEN;
+ return res;
+#else
+ return 0;
+#endif
+}
+
+static ERTS_INLINE void
+woke_up(ErtsPollSet ps)
+{
+#ifdef ERTS_SMP
+ erts_aint32_t wakeup_state = erts_atomic32_read(&ps->wakeup_state);
+ if (wakeup_state == ERTS_POLL_NOT_WOKEN)
+ (void) erts_atomic32_cmpxchg(&ps->wakeup_state,
+ ERTS_POLL_WOKEN,
+ ERTS_POLL_NOT_WOKEN);
+ ASSERT(erts_atomic32_read(&ps->wakeup_state) != ERTS_POLL_NOT_WOKEN);
+#elif ERTS_POLL_ASYNC_INTERRUPT_SUPPORT
+ if (ps->wakeup_state == ERTS_POLL_NOT_WOKEN)
+ ps->wakeup_state = ERTS_POLL_WOKEN;
+#endif
+}
+
/*
* --- Wakeup pipe -----------------------------------------------------------
*/
@@ -437,14 +403,34 @@ static void print_misc_debug_info(void);
#if ERTS_POLL_USE_WAKEUP_PIPE
static ERTS_INLINE void
-wake_poller(ErtsPollSet ps)
+wake_poller(ErtsPollSet ps, int interrupted)
{
+ int wake;
+#ifdef ERTS_SMP
+ erts_aint32_t wakeup_state;
+ if (!interrupted)
+ wakeup_state = erts_atomic32_cmpxchg_relb(&ps->wakeup_state,
+ ERTS_POLL_WOKEN,
+ ERTS_POLL_NOT_WOKEN);
+ else {
+ /*
+ * We might unnecessarily write to the pipe, however,
+ * that isn't problematic.
+ */
+ wakeup_state = erts_atomic32_read(&ps->wakeup_state);
+ erts_atomic32_set_relb(&ps->wakeup_state, ERTS_POLL_WOKEN_INTR);
+ }
+ wake = wakeup_state == ERTS_POLL_NOT_WOKEN;
+#elif ERTS_POLL_ASYNC_INTERRUPT_SUPPORT
+ wake = ps->wakeup_state == ERTS_POLL_NOT_WOKEN;
+ ps->wakeup_state = interrupted ? ERTS_POLL_WOKEN_INTR : ERTS_POLL_NOT_WOKEN;
+#endif
/*
* NOTE: This function might be called from signal handlers in the
* non-smp case; therefore, it has to be async-signal safe in
* the non-smp case.
*/
- if (!ERTS_POLLSET_SET_POLLER_WOKEN_CHK(ps)) {
+ if (wake) {
ssize_t res;
if (ps->wake_fds[1] < 0)
return; /* Not initialized yet */
@@ -1387,9 +1373,7 @@ handle_update_requests(ErtsPollSet ps)
#endif /* ERTS_POLL_USE_UPDATE_REQUESTS_QUEUE */
static ERTS_INLINE ErtsPollEvents
-poll_control(ErtsPollSet ps, int fd, ErtsPollEvents events, int on,
- int *have_set_have_update_requests,
- int *do_wake)
+poll_control(ErtsPollSet ps, int fd, ErtsPollEvents events, int on, int *do_wake)
{
ErtsPollEvents new_events;
@@ -1493,7 +1477,6 @@ ERTS_POLL_EXPORT(erts_poll_controlv)(ErtsPollSet ps,
int len)
{
int i;
- int hshur = 0;
int do_wake;
int final_do_wake = 0;
@@ -1505,17 +1488,17 @@ ERTS_POLL_EXPORT(erts_poll_controlv)(ErtsPollSet ps,
pcev[i].fd,
pcev[i].events,
pcev[i].on,
- &hshur,
&do_wake);
final_do_wake |= do_wake;
}
+ ERTS_POLLSET_UNLOCK(ps);
+
#ifdef ERTS_SMP
if (final_do_wake)
- wake_poller(ps);
+ wake_poller(ps, 0);
#endif /* ERTS_SMP */
- ERTS_POLLSET_UNLOCK(ps);
}
ErtsPollEvents
@@ -1526,20 +1509,20 @@ ERTS_POLL_EXPORT(erts_poll_control)(ErtsPollSet ps,
int* do_wake) /* In: Wake up polling thread */
/* Out: Poller is woken */
{
- int hshur = 0;
ErtsPollEvents res;
ERTS_POLLSET_LOCK(ps);
- res = poll_control(ps, fd, events, on, &hshur, do_wake);
+ res = poll_control(ps, fd, events, on, do_wake);
+
+ ERTS_POLLSET_UNLOCK(ps);
#ifdef ERTS_SMP
if (*do_wake) {
- wake_poller(ps);
+ wake_poller(ps, 0);
}
#endif /* ERTS_SMP */
- ERTS_POLLSET_UNLOCK(ps);
return res;
}
@@ -1919,8 +1902,10 @@ check_fd_events(ErtsPollSet ps, SysTimeval *tv, int max_res, int *ps_locked)
}
else {
long timeout = tv->tv_sec*1000 + tv->tv_usec/1000;
+ if (timeout > ERTS_AINT32_T_MAX)
+ timeout = ERTS_AINT32_T_MAX;
ASSERT(timeout >= 0);
- erts_smp_atomic_set(&ps->timeout, timeout);
+ erts_smp_atomic32_set_relb(&ps->timeout, (erts_aint32_t) timeout);
#if ERTS_POLL_USE_FALLBACK
if (!(ps->fallback_used = ERTS_POLL_NEED_FALLBACK(ps))) {
@@ -2042,15 +2027,14 @@ ERTS_POLL_EXPORT(erts_poll_wait)(ErtsPollSet ps,
(int) tv->tv_sec*1000 + tv->tv_usec/1000);
#endif
- ERTS_POLLSET_UNSET_POLLER_WOKEN(ps);
if (ERTS_POLLSET_SET_POLLED_CHK(ps)) {
res = EINVAL; /* Another thread is in erts_poll_wait()
on this pollset... */
goto done;
}
- if (ERTS_POLLSET_IS_INTERRUPTED(ps)) {
- /* Interrupt use zero timeout */
+ if (is_woken(ps)) {
+ /* Use zero timeout */
itv.tv_sec = 0;
itv.tv_usec = 0;
tvp = &itv;
@@ -2067,7 +2051,7 @@ ERTS_POLL_EXPORT(erts_poll_wait)(ErtsPollSet ps,
ps_locked = 0;
res = check_fd_events(ps, tvp, no_fds, &ps_locked);
- ERTS_POLLSET_SET_POLLER_WOKEN(ps);
+ woke_up(ps);
if (res == 0) {
res = ETIMEDOUT;
@@ -2099,9 +2083,7 @@ ERTS_POLL_EXPORT(erts_poll_wait)(ErtsPollSet ps,
check_poll_result(pr, no_fds);
#endif
- res = (no_fds == 0
- ? (ERTS_POLLSET_UNSET_INTERRUPTED_CHK(ps) ? EINTR : EAGAIN)
- : 0);
+ res = (no_fds == 0 ? (is_interrupted_reset(ps) ? EINTR : EAGAIN) : 0);
*len = no_fds;
}
@@ -2112,7 +2094,7 @@ ERTS_POLL_EXPORT(erts_poll_wait)(ErtsPollSet ps,
#endif
done:
- erts_smp_atomic_set(&ps->timeout, LONG_MAX);
+ erts_smp_atomic32_set_relb(&ps->timeout, ERTS_AINT32_T_MAX);
#ifdef ERTS_POLL_DEBUG_PRINT
erts_printf("Leaving %s = erts_poll_wait()\n",
res == 0 ? "0" : erl_errno_id(res));
@@ -2128,20 +2110,17 @@ ERTS_POLL_EXPORT(erts_poll_wait)(ErtsPollSet ps,
void
ERTS_POLL_EXPORT(erts_poll_interrupt)(ErtsPollSet ps, int set)
{
+#if ERTS_POLL_ASYNC_INTERRUPT_SUPPORT || defined(ERTS_SMP)
/*
* NOTE: This function might be called from signal handlers in the
* non-smp case; therefore, it has to be async-signal safe in
* the non-smp case.
*/
- if (set) {
- ERTS_POLLSET_SET_INTERRUPTED(ps);
-#if ERTS_POLL_ASYNC_INTERRUPT_SUPPORT || defined(ERTS_SMP)
- wake_poller(ps);
+ if (!set)
+ reset_wakeup_state(ps);
+ else
+ wake_poller(ps, 1);
#endif
- }
- else {
- ERTS_POLLSET_UNSET_INTERRUPTED(ps);
- }
}
/*
@@ -2150,15 +2129,16 @@ ERTS_POLL_EXPORT(erts_poll_interrupt)(ErtsPollSet ps, int set)
* is not guaranteed that it will timeout before 'msec' milli seconds.
*/
void
-ERTS_POLL_EXPORT(erts_poll_interrupt_timed)(ErtsPollSet ps, int set, long msec)
+ERTS_POLL_EXPORT(erts_poll_interrupt_timed)(ErtsPollSet ps,
+ int set,
+ long msec)
{
- if (set) {
- if (erts_smp_atomic_read(&ps->timeout) > msec) {
- ERTS_POLLSET_SET_INTERRUPTED(ps);
#if ERTS_POLL_ASYNC_INTERRUPT_SUPPORT || defined(ERTS_SMP)
- wake_poller(ps);
-#endif
- }
+ if (!set)
+ reset_wakeup_state(ps);
+ else {
+ if (erts_smp_atomic32_read_acqb(&ps->timeout) > (erts_aint32_t) msec)
+ wake_poller(ps, 1);
#ifdef ERTS_POLL_COUNT_AVOIDED_WAKEUPS
else {
if (ERTS_POLLSET_IS_POLLED(ps))
@@ -2168,9 +2148,7 @@ ERTS_POLL_EXPORT(erts_poll_interrupt_timed)(ErtsPollSet ps, int set, long msec)
erts_smp_atomic_inc(&ps->no_interrupt_timed);
#endif
}
- else {
- ERTS_POLLSET_UNSET_INTERRUPTED(ps);
- }
+#endif
}
int
@@ -2281,14 +2259,16 @@ ERTS_POLL_EXPORT(erts_poll_create_pollset)(void)
ps->update_requests.next = NULL;
ps->update_requests.len = 0;
ps->curr_upd_req_block = &ps->update_requests;
- erts_smp_atomic_init(&ps->have_update_requests, 0);
+ erts_smp_atomic32_init(&ps->have_update_requests, 0);
#endif
#ifdef ERTS_SMP
- erts_smp_atomic_init(&ps->polled, 0);
- erts_smp_atomic_init(&ps->woken, 0);
+ erts_atomic32_init(&ps->polled, 0);
erts_smp_mtx_init(&ps->mtx, "pollset");
+#endif
+#ifdef ERTS_SMP
+ erts_atomic32_init(&ps->wakeup_state, (erts_aint32_t) 0);
#elif ERTS_POLL_ASYNC_INTERRUPT_SUPPORT
- ps->woken = 0;
+ ps->wakeup_state = 0;
#endif
#if ERTS_POLL_USE_WAKEUP_PIPE
create_wakeup_pipe(ps);
@@ -2310,12 +2290,7 @@ ERTS_POLL_EXPORT(erts_poll_create_pollset)(void)
ps->internal_fd_limit = kp_fd + 1;
ps->kp_fd = kp_fd;
#endif
-#if ERTS_POLL_ASYNC_INTERRUPT_SUPPORT && !defined(ERTS_SMP)
- ps->interrupt = 0;
-#else
- erts_smp_atomic_init(&ps->interrupt, 0);
-#endif
- erts_smp_atomic_init(&ps->timeout, LONG_MAX);
+ erts_smp_atomic32_init(&ps->timeout, ERTS_AINT32_T_MAX);
#ifdef ERTS_POLL_COUNT_AVOIDED_WAKEUPS
erts_smp_atomic_init(&ps->no_avoided_wakeups, 0);
erts_smp_atomic_init(&ps->no_avoided_interrupts, 0);
diff --git a/erts/emulator/sys/unix/erl_unix_sys.h b/erts/emulator/sys/unix/erl_unix_sys.h
index 2d5ef882f6..d8d51b192c 100644
--- a/erts/emulator/sys/unix/erl_unix_sys.h
+++ b/erts/emulator/sys/unix/erl_unix_sys.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1997-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1997-2011. 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
@@ -329,11 +329,4 @@ extern int exit_async(void);
#define ERTS_EXIT_AFTER_DUMP _exit
-#ifdef ERTS_TIMER_THREAD
-struct erts_iwait; /* opaque for clients */
-extern struct erts_iwait *erts_iwait_init(void);
-extern void erts_iwait_wait(struct erts_iwait *iwait, struct timeval *delay);
-extern void erts_iwait_interrupt(struct erts_iwait *iwait);
-#endif /* ERTS_TIMER_THREAD */
-
#endif /* #ifndef _ERL_UNIX_SYS_H */
diff --git a/erts/emulator/sys/unix/sys.c b/erts/emulator/sys/unix/sys.c
index 01ba773688..bafbbb0f6c 100644
--- a/erts/emulator/sys/unix/sys.c
+++ b/erts/emulator/sys/unix/sys.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -53,6 +53,11 @@
#define WANT_NONBLOCKING /* must define this to pull in defs from sys.h */
#include "sys.h"
+#if defined(__APPLE__) && defined(__MACH__) && !defined(__DARWIN__)
+#define __DARWIN__ 1
+#endif
+
+
#ifdef USE_THREADS
#include "erl_threads.h"
#endif
@@ -160,14 +165,14 @@ static int debug_log = 0;
#endif
#ifdef ERTS_SMP
-erts_smp_atomic_t erts_got_sigusr1;
+erts_smp_atomic32_t erts_got_sigusr1;
#define ERTS_SET_GOT_SIGUSR1 \
- erts_smp_atomic_set(&erts_got_sigusr1, 1)
+ erts_smp_atomic32_set(&erts_got_sigusr1, 1)
#define ERTS_UNSET_GOT_SIGUSR1 \
- erts_smp_atomic_set(&erts_got_sigusr1, 0)
-static erts_smp_atomic_t have_prepared_crash_dump;
+ erts_smp_atomic32_set(&erts_got_sigusr1, 0)
+static erts_smp_atomic32_t have_prepared_crash_dump;
#define ERTS_PREPARED_CRASH_DUMP \
- ((int) erts_smp_atomic_xchg(&have_prepared_crash_dump, 1))
+ ((int) erts_smp_atomic32_xchg(&have_prepared_crash_dump, 1))
#else
volatile int erts_got_sigusr1;
#define ERTS_SET_GOT_SIGUSR1 (erts_got_sigusr1 = 1)
@@ -235,11 +240,11 @@ static int max_files = -1;
* a few variables used by the break handler
*/
#ifdef ERTS_SMP
-erts_smp_atomic_t erts_break_requested;
+erts_smp_atomic32_t erts_break_requested;
#define ERTS_SET_BREAK_REQUESTED \
- erts_smp_atomic_set(&erts_break_requested, (long) 1)
+ erts_smp_atomic32_set(&erts_break_requested, (erts_aint32_t) 1)
#define ERTS_UNSET_BREAK_REQUESTED \
- erts_smp_atomic_set(&erts_break_requested, (long) 0)
+ erts_smp_atomic32_set(&erts_break_requested, (erts_aint32_t) 0)
#else
volatile int erts_break_requested = 0;
#define ERTS_SET_BREAK_REQUESTED (erts_break_requested = 1)
@@ -504,9 +509,9 @@ erts_sys_pre_init(void)
#endif
}
#ifdef ERTS_SMP
- erts_smp_atomic_init(&erts_break_requested, 0);
- erts_smp_atomic_init(&erts_got_sigusr1, 0);
- erts_smp_atomic_init(&have_prepared_crash_dump, 0);
+ erts_smp_atomic32_init(&erts_break_requested, 0);
+ erts_smp_atomic32_init(&erts_got_sigusr1, 0);
+ erts_smp_atomic32_init(&have_prepared_crash_dump, 0);
#else
erts_break_requested = 0;
erts_got_sigusr1 = 0;
@@ -2989,11 +2994,27 @@ init_smp_sig_notify(void)
NULL,
&thr_opts);
}
+#ifdef __DARWIN__
+
+int erts_darwin_main_thread_pipe[2];
+int erts_darwin_main_thread_result_pipe[2];
+static void initialize_darwin_main_thread_pipes(void)
+{
+ if (pipe(erts_darwin_main_thread_pipe) < 0 ||
+ pipe(erts_darwin_main_thread_result_pipe) < 0) {
+ erl_exit(1,"Fatal error initializing Darwin main thread stealing");
+ }
+}
+
+#endif
void
erts_sys_main_thread(void)
{
erts_thread_disable_fpe();
+#ifdef __DARWIN__
+ initialize_darwin_main_thread_pipes();
+#endif
/* Become signal receiver thread... */
#ifdef ERTS_ENABLE_LOCK_CHECK
erts_lc_set_thread_name("signal_receiver");
@@ -3002,6 +3023,27 @@ erts_sys_main_thread(void)
smp_sig_notify(0); /* Notify initialized */
while (1) {
/* Wait for a signal to arrive... */
+#ifdef __DARWIN__
+ /*
+ * The wx driver needs to be able to steal the main thread for Cocoa to
+ * work properly.
+ */
+ fd_set readfds;
+ int res;
+
+ FD_ZERO(&readfds);
+ FD_SET(erts_darwin_main_thread_pipe[0], &readfds);
+ res = select(erts_darwin_main_thread_pipe[0] + 1, &readfds, NULL, NULL, NULL);
+ if (res > 0 && FD_ISSET(erts_darwin_main_thread_pipe[0],&readfds)) {
+ void* (*func)(void*);
+ void* arg;
+ void *resp;
+ read(erts_darwin_main_thread_pipe[0],&func,sizeof(void* (*)(void*)));
+ read(erts_darwin_main_thread_pipe[0],&arg, sizeof(void*));
+ resp = (*func)(arg);
+ write(erts_darwin_main_thread_result_pipe[1],&resp,sizeof(void *));
+ }
+#else
#ifdef DEBUG
int res =
#else
@@ -3010,6 +3052,7 @@ erts_sys_main_thread(void)
select(0, NULL, NULL, NULL, NULL);
ASSERT(res < 0);
ASSERT(errno == EINTR);
+#endif
}
}
@@ -3109,226 +3152,3 @@ erl_sys_args(int* argc, char** argv)
}
*argc = j;
}
-
-#ifdef ERTS_TIMER_THREAD
-
-/*
- * Interruptible-wait facility: low-level synchronisation state
- * and methods that are implementation dependent.
- *
- * Constraint: Every implementation must define 'struct erts_iwait'
- * with a field 'erts_smp_atomic_t state;'.
- */
-
-/* values for struct erts_iwait's state field */
-#define IWAIT_WAITING 0
-#define IWAIT_AWAKE 1
-#define IWAIT_INTERRUPT 2
-
-#if 0 /* XXX: needs feature test in erts/configure.in */
-
-/*
- * This is an implementation of the interruptible wait facility on
- * top of Linux-specific futexes.
- */
-#include <asm/unistd.h>
-#define FUTEX_WAIT 0
-#define FUTEX_WAKE 1
-static int sys_futex(void *futex, int op, int val, const struct timespec *timeout)
-{
- return syscall(__NR_futex, futex, op, val, timeout);
-}
-
-struct erts_iwait {
- erts_smp_atomic_t state; /* &state.counter is our futex */
-};
-
-static void iwait_lowlevel_init(struct erts_iwait *iwait) { /* empty */ }
-
-static void iwait_lowlevel_wait(struct erts_iwait *iwait, struct timeval *delay)
-{
- struct timespec timeout;
- int res;
-
- timeout.tv_sec = delay->tv_sec;
- timeout.tv_nsec = delay->tv_usec * 1000;
- res = sys_futex((void*)&iwait->state.counter, FUTEX_WAIT, IWAIT_WAITING, &timeout);
- if (res < 0 && errno != ETIMEDOUT && errno != EWOULDBLOCK && errno != EINTR)
- perror("FUTEX_WAIT");
-}
-
-static void iwait_lowlevel_interrupt(struct erts_iwait *iwait)
-{
- int res = sys_futex((void*)&iwait->state.counter, FUTEX_WAKE, 1, NULL);
- if (res < 0)
- perror("FUTEX_WAKE");
-}
-
-#else /* using poll() or select() */
-
-/*
- * This is an implementation of the interruptible wait facility on
- * top of pipe(), poll() or select(), read(), and write().
- */
-struct erts_iwait {
- erts_smp_atomic_t state;
- int read_fd; /* wait polls and reads this fd */
- int write_fd; /* interrupt writes this fd */
-};
-
-static void iwait_lowlevel_init(struct erts_iwait *iwait)
-{
- int fds[2];
-
- if (pipe(fds) < 0) {
- perror("pipe()");
- exit(1);
- }
- iwait->read_fd = fds[0];
- iwait->write_fd = fds[1];
-}
-
-#if defined(ERTS_USE_POLL)
-
-#include <sys/poll.h>
-#define PERROR_POLL "poll()"
-
-static int iwait_lowlevel_poll(int read_fd, struct timeval *delay)
-{
- struct pollfd pollfd;
- int timeout;
-
- pollfd.fd = read_fd;
- pollfd.events = POLLIN;
- pollfd.revents = 0;
- timeout = delay->tv_sec * 1000 + delay->tv_usec / 1000;
- return poll(&pollfd, 1, timeout);
-}
-
-#else /* !ERTS_USE_POLL */
-
-#include <sys/select.h>
-#define PERROR_POLL "select()"
-
-static int iwait_lowlevel_poll(int read_fd, struct timeval *delay)
-{
- fd_set readfds;
-
- FD_ZERO(&readfds);
- FD_SET(read_fd, &readfds);
- return select(read_fd + 1, &readfds, NULL, NULL, delay);
-}
-
-#endif /* !ERTS_USE_POLL */
-
-static void iwait_lowlevel_wait(struct erts_iwait *iwait, struct timeval *delay)
-{
- int res;
- char buf[64];
-
- res = iwait_lowlevel_poll(iwait->read_fd, delay);
- if (res > 0)
- (void)read(iwait->read_fd, buf, sizeof buf);
- else if (res < 0 && errno != EINTR)
- perror(PERROR_POLL);
-}
-
-static void iwait_lowlevel_interrupt(struct erts_iwait *iwait)
-{
- int res = write(iwait->write_fd, "!", 1);
- if (res < 0)
- perror("write()");
-}
-
-#endif /* using poll() or select() */
-
-#if 0 /* not using poll() or select() */
-/*
- * This is an implementation of the interruptible wait facility on
- * top of pthread_cond_timedwait(). This has two problems:
- * 1. pthread_cond_timedwait() requires an absolute time point,
- * so the relative delay must be converted to absolute time.
- * Worse, this breaks if the machine's time is adjusted while
- * we're preparing to wait.
- * 2. Each cond operation requires additional mutex lock/unlock operations.
- *
- * Problem 2 is probably not too bad on Linux (they'll just become
- * relatively cheap futex operations), but problem 1 is the real killer.
- * Only use this implementation if no better alternatives are available!
- */
-struct erts_iwait {
- erts_smp_atomic_t state;
- pthread_cond_t cond;
- pthread_mutex_t mutex;
-};
-
-static void iwait_lowlevel_init(struct erts_iwait *iwait)
-{
- iwait->cond = (pthread_cond_t) PTHREAD_COND_INITIALIZER;
- iwait->mutex = (pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER;
-}
-
-static void iwait_lowlevel_wait(struct erts_iwait *iwait, struct timeval *delay)
-{
- struct timeval tmp;
- struct timespec timeout;
-
- /* Due to pthread_cond_timedwait()'s use of absolute
- time, this must be the real gettimeofday(), _not_
- the "smoothed" one beam/erl_time_sup.c implements. */
- gettimeofday(&tmp, NULL);
-
- tmp.tv_sec += delay->tv_sec;
- tmp.tv_usec += delay->tv_usec;
- if (tmp.tv_usec >= 1000*1000) {
- tmp.tv_usec -= 1000*1000;
- tmp.tv_sec += 1;
- }
- timeout.tv_sec = tmp.tv_sec;
- timeout.tv_nsec = tmp.tv_usec * 1000;
- pthread_mutex_lock(&iwait->mutex);
- pthread_cond_timedwait(&iwait->cond, &iwait->mutex, &timeout);
- pthread_mutex_unlock(&iwait->mutex);
-}
-
-static void iwait_lowlevel_interrupt(struct erts_iwait *iwait)
-{
- pthread_mutex_lock(&iwait->mutex);
- pthread_cond_signal(&iwait->cond);
- pthread_mutex_unlock(&iwait->mutex);
-}
-
-#endif /* not using POLL */
-
-/*
- * Interruptible-wait facility. This is just a wrapper around the
- * low-level synchronisation code, where we maintain our logical
- * state in order to suppress some state transitions.
- */
-
-struct erts_iwait *erts_iwait_init(void)
-{
- struct erts_iwait *iwait = malloc(sizeof *iwait);
- if (!iwait) {
- perror("malloc");
- exit(1);
- }
- iwait_lowlevel_init(iwait);
- erts_smp_atomic_init(&iwait->state, IWAIT_AWAKE);
- return iwait;
-}
-
-void erts_iwait_wait(struct erts_iwait *iwait, struct timeval *delay)
-{
- if (erts_smp_atomic_xchg(&iwait->state, IWAIT_WAITING) != IWAIT_INTERRUPT)
- iwait_lowlevel_wait(iwait, delay);
- erts_smp_atomic_set(&iwait->state, IWAIT_AWAKE);
-}
-
-void erts_iwait_interrupt(struct erts_iwait *iwait)
-{
- if (erts_smp_atomic_xchg(&iwait->state, IWAIT_INTERRUPT) == IWAIT_WAITING)
- iwait_lowlevel_interrupt(iwait);
-}
-
-#endif /* ERTS_TIMER_THREAD */
diff --git a/erts/emulator/sys/unix/sys_float.c b/erts/emulator/sys/unix/sys_float.c
index 6e9376b0f3..8ec7b31ce0 100644
--- a/erts/emulator/sys/unix/sys_float.c
+++ b/erts/emulator/sys/unix/sys_float.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2001-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2001-2011. 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
@@ -36,11 +36,6 @@ erts_sys_init_float(void)
# endif
}
-static ERTS_INLINE void set_current_fp_exception(unsigned long pc)
-{
- /* nothing to do */
-}
-
#else /* !NO_FPE_SIGNALS */
#ifdef ERTS_SMP
diff --git a/erts/emulator/sys/vxworks/sys.c b/erts/emulator/sys/vxworks/sys.c
index 411b4b37cf..c6e7b65f32 100644
--- a/erts/emulator/sys/vxworks/sys.c
+++ b/erts/emulator/sys/vxworks/sys.c
@@ -85,7 +85,7 @@ EXTERN_FUNCTION(void, erl_exit, (int n, char*, _DOTS_));
EXTERN_FUNCTION(void, erl_error, (char*, va_list));
EXTERN_FUNCTION(int, driver_interrupt, (int, int));
EXTERN_FUNCTION(void, increment_time, (int));
-EXTERN_FUNCTION(int, next_time, (_VOID_));
+EXTERN_FUNCTION(int, erts_next_time, (_VOID_));
EXTERN_FUNCTION(void, set_reclaim_free_function, (FreeFunction));
EXTERN_FUNCTION(int, erl_mem_info_get, (MEM_PART_STATS *));
EXTERN_FUNCTION(void, erl_crash_dump, (char* file, int line, char* fmt, ...));
diff --git a/erts/emulator/sys/win32/erl_poll.c b/erts/emulator/sys/win32/erl_poll.c
index a766fe9575..7662f190ef 100644
--- a/erts/emulator/sys/win32/erl_poll.c
+++ b/erts/emulator/sys/win32/erl_poll.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2007-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2007-2011. 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
@@ -274,7 +274,6 @@ struct ErtsPollSet_ {
Waiter** waiter;
int allocated_waiters; /* Size ow waiter array */
int num_waiters; /* Number of waiter threads. */
- erts_atomic_t sys_io_ready; /* Tells us there is I/O ready (already). */
int restore_events; /* Tells us to restore waiters events
next time around */
HANDLE event_io_ready; /* To be used when waiting for io */
@@ -282,12 +281,11 @@ struct ErtsPollSet_ {
volatile int standby_wait_counter; /* Number of threads to wait for */
CRITICAL_SECTION standby_crit; /* CS to guard the counter */
HANDLE standby_wait_event; /* Event signalled when counte == 0 */
+ erts_atomic32_t wakeup_state;
#ifdef ERTS_SMP
- erts_smp_atomic_t woken;
erts_smp_mtx_t mtx;
- erts_smp_atomic_t interrupt;
#endif
- erts_smp_atomic_t timeout;
+ erts_smp_atomic32_t timeout;
};
#ifdef ERTS_SMP
@@ -296,126 +294,24 @@ struct ErtsPollSet_ {
erts_smp_mtx_lock(&(PS)->mtx)
#define ERTS_POLLSET_UNLOCK(PS) \
erts_smp_mtx_unlock(&(PS)->mtx)
-#define ERTS_POLLSET_SET_POLLED_CHK(PS) \
- ((int) erts_smp_atomic_xchg(&(PS)->polled, (long) 1))
-#define ERTS_POLLSET_SET_POLLED(PS) \
- erts_smp_atomic_set(&(PS)->polled, (long) 1)
-#define ERTS_POLLSET_UNSET_POLLED(PS) \
- erts_smp_atomic_set(&(PS)->polled, (long) 0)
-#define ERTS_POLLSET_IS_POLLED(PS) \
- ((int) erts_smp_atomic_read(&(PS)->polled))
-
-#define ERTS_POLLSET_SET_POLLER_WOKEN_CHK(PS) set_poller_woken_chk((PS))
-#define ERTS_POLLSET_SET_POLLER_WOKEN(PS) \
-do { \
- ERTS_THR_MEMORY_BARRIER; \
- erts_smp_atomic_set(&(PS)->woken, (long) 1); \
-} while (0)
-#define ERTS_POLLSET_UNSET_POLLER_WOKEN(PS) \
-do { \
- erts_smp_atomic_set(&(PS)->woken, (long) 0); \
- ERTS_THR_MEMORY_BARRIER; \
-} while (0)
-#define ERTS_POLLSET_IS_POLLER_WOKEN(PS) \
- ((int) erts_smp_atomic_read(&(PS)->woken))
-
-#define ERTS_POLLSET_UNSET_INTERRUPTED_CHK(PS) unset_interrupted_chk((PS))
-#define ERTS_POLLSET_UNSET_INTERRUPTED(PS) \
-do { \
- erts_smp_atomic_set(&(PS)->interrupt, (long) 0); \
- ERTS_THR_MEMORY_BARRIER; \
-} while (0)
-#define ERTS_POLLSET_SET_INTERRUPTED(PS) \
-do { \
- ERTS_THR_MEMORY_BARRIER; \
- erts_smp_atomic_set(&(PS)->interrupt, (long) 1); \
-} while (0)
-#define ERTS_POLLSET_IS_INTERRUPTED(PS) \
- ((int) erts_smp_atomic_read(&(PS)->interrupt))
-
-static ERTS_INLINE int
-unset_interrupted_chk(ErtsPollSet ps)
-{
- int res = (int) erts_smp_atomic_xchg(&ps->interrupt, (long) 0);
- ERTS_THR_MEMORY_BARRIER;
- return res;
-
-}
-
-static ERTS_INLINE int
-set_poller_woken_chk(ErtsPollSet ps)
-{
- ERTS_THR_MEMORY_BARRIER;
- return (int) erts_smp_atomic_xchg(&ps->woken, (long) 1);
-}
#else
#define ERTS_POLLSET_LOCK(PS)
#define ERTS_POLLSET_UNLOCK(PS)
-#define ERTS_POLLSET_SET_POLLED_CHK(PS) 0
-#define ERTS_POLLSET_UNSET_POLLED(PS)
-#define ERTS_POLLSET_IS_POLLED(PS) 0
-#define ERTS_POLLSET_SET_POLLER_WOKEN_CHK(PS) 1
-#define ERTS_POLLSET_SET_POLLER_WOKEN(PS)
-#define ERTS_POLLSET_UNSET_POLLER_WOKEN(PS)
-#define ERTS_POLLSET_IS_POLLER_WOKEN(PS) 1
-
#endif
/*
- * While atomics are not yet implemented for windows in the common library...
- *
- * MSDN doc states that SMP machines and old compilers require
- * InterLockedExchange to properly read and write interlocked
- * variables, otherwise the processors might reschedule
- * the access and order of atomics access is destroyed...
- * While they only mention it in white-papers, the problem
- * in VS2003 is due to the IA64 arch, so we can still count
- * on the CPU not rescheduling the access to volatile in X86 arch using
- * even the slightly older compiler...
- *
- * So here's (hopefully) a subset of the generally working atomic
- * variable access...
- */
-
-#if defined(__GNUC__)
-# if defined(__i386__) || defined(__x86_64__)
-# define VOLATILE_IN_SEQUENCE 1
-# else
-# define VOLATILE_IN_SEQUENCE 0
-# endif
-#elif defined(_MSC_VER)
-# if _MSC_VER < 1300
-# define VOLATILE_IN_SEQUENCE 0 /* Dont trust really old compilers */
-# else
-# if defined(_M_IX86)
-# define VOLATILE_IN_SEQUENCE 1
-# else /* I.e. IA64 */
-# if _MSC_VER >= 1400
-# define VOLATILE_IN_SEQUENCE 1
-# else
-# define VOLATILE_IN_SEQUENCE 0
-# endif
-# endif
-# endif
-#else
-# define VOLATILE_IN_SEQUENCE 0
-#endif
-
-
-
-/*
* Communication with sys_interrupt
*/
#ifdef ERTS_SMP
-extern erts_smp_atomic_t erts_break_requested;
+extern erts_smp_atomic32_t erts_break_requested;
#define ERTS_SET_BREAK_REQUESTED \
- erts_smp_atomic_set(&erts_break_requested, (long) 1)
+ erts_smp_atomic32_set(&erts_break_requested, (erts_aint32_t) 1)
#define ERTS_UNSET_BREAK_REQUESTED \
- erts_smp_atomic_set(&erts_break_requested, (long) 0)
+ erts_smp_atomic32_set(&erts_break_requested, (erts_aint32_t) 0)
#else
extern volatile int erts_break_requested;
#define ERTS_SET_BREAK_REQUESTED (erts_break_requested = 1)
@@ -424,7 +320,7 @@ extern volatile int erts_break_requested;
static erts_mtx_t break_waiter_lock;
static HANDLE break_happened_event;
-static erts_atomic_t break_waiter_state;
+static erts_atomic32_t break_waiter_state;
#define BREAK_WAITER_GOT_BREAK 1
#define BREAK_WAITER_GOT_HALT 2
@@ -467,29 +363,172 @@ do { \
wait_standby(PS); \
} while(0)
-#if ERTS_POLL_ASYNC_INTERRUPT_SUPPORT && !defined(ERTS_SMP)
+#define ERTS_POLL_NOT_WOKEN ((erts_aint32_t) 0)
+#define ERTS_POLL_WOKEN_IO_READY ((erts_aint32_t) 1)
+#define ERTS_POLL_WOKEN_INTR ((erts_aint32_t) 2)
+#define ERTS_POLL_WOKEN_TIMEDOUT ((erts_aint32_t) 3)
static ERTS_INLINE int
-unset_interrupted_chk(ErtsPollSet ps)
+is_io_ready(ErtsPollSet ps)
{
- /* This operation isn't atomic, but we have no need at all for an
- atomic operation here... */
- int res = ps->interrupt;
- ps->interrupt = 0;
- return res;
+ return erts_atomic32_read(&ps->wakeup_state) == ERTS_POLL_WOKEN_IO_READY;
}
+static ERTS_INLINE void
+woke_up(ErtsPollSet ps)
+{
+ if (erts_atomic32_read(&ps->wakeup_state) == ERTS_POLL_NOT_WOKEN)
+ erts_atomic32_cmpxchg(&ps->wakeup_state,
+ ERTS_POLL_WOKEN_TIMEDOUT,
+ ERTS_POLL_NOT_WOKEN);
+#ifdef DEBUG
+ {
+ erts_aint32_t wakeup_state = erts_atomic32_read(&ps->wakeup_state);
+ switch (wakeup_state) {
+ case ERTS_POLL_WOKEN_IO_READY:
+ case ERTS_POLL_WOKEN_INTR:
+ case ERTS_POLL_WOKEN_TIMEDOUT:
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+ }
#endif
+}
+
+static ERTS_INLINE int
+wakeup_cause(ErtsPollSet ps)
+{
+ int res;
+ erts_aint32_t wakeup_state = erts_atomic32_read(&ps->wakeup_state);
+ switch (wakeup_state) {
+ case ERTS_POLL_WOKEN_IO_READY:
+ res = 0;
+ break;
+ case ERTS_POLL_WOKEN_INTR:
+ res = EINTR;
+ break;
+ case ERTS_POLL_WOKEN_TIMEDOUT:
+ res = ETIMEDOUT;
+ break;
+ default:
+ res = 0;
+ erl_exit(ERTS_ABORT_EXIT,
+ "%s:%d: Internal error: Invalid wakeup_state=%d\n",
+ __FILE__, __LINE__, (int) wakeup_state);
+ }
+ return res;
+}
+
+static ERTS_INLINE DWORD
+poll_wait_timeout(ErtsPollSet ps, SysTimeval *tvp)
+{
+ time_t timeout = tvp->tv_sec * 1000 + tvp->tv_usec / 1000;
+
+ if (timeout <= 0) {
+ woke_up(ps);
+ return (DWORD) 0;
+ }
+
+ ResetEvent(ps->event_io_ready);
+ /*
+ * Since we don't know the internals of ResetEvent() we issue
+ * a memory barrier as a safety precaution ensuring that
+ * the load of wakeup_state wont be reordered with stores made
+ * by ResetEvent().
+ */
+ ERTS_THR_MEMORY_BARRIER;
+ if (erts_atomic32_read(&ps->wakeup_state) != ERTS_POLL_NOT_WOKEN)
+ return (DWORD) 0;
+
+ if (timeout > ERTS_AINT32_T_MAX) /* Also prevents DWORD overflow */
+ timeout = ERTS_AINT32_T_MAX;
+
+ erts_smp_atomic32_set_relb(&ps->timeout, (erts_aint32_t) timeout);
+ return (DWORD) timeout;
+}
-#ifdef ERTS_SMP
static ERTS_INLINE void
-wake_poller(ErtsPollSet ps)
+wake_poller(ErtsPollSet ps, int io_ready)
{
- if (!ERTS_POLLSET_SET_POLLER_WOKEN_CHK(ps)) {
+ erts_aint32_t wakeup_state;
+ if (io_ready) {
+ /* We may set the event multiple times. This is, however, harmless. */
+ wakeup_state = erts_atomic32_read(&ps->wakeup_state);
+ erts_atomic32_set_relb(&ps->wakeup_state, ERTS_POLL_WOKEN_IO_READY);
+ }
+ else {
+ ERTS_THR_MEMORY_BARRIER;
+ wakeup_state = erts_atomic32_read(&ps->wakeup_state);
+ while (wakeup_state != ERTS_POLL_WOKEN_IO_READY
+ && wakeup_state != ERTS_POLL_WOKEN_INTR) {
+ erts_aint32_t act = erts_atomic32_cmpxchg(&ps->wakeup_state,
+ ERTS_POLL_WOKEN_INTR,
+ wakeup_state);
+ if (act == wakeup_state) {
+ wakeup_state = act;
+ break;
+ }
+ wakeup_state = act;
+ }
+ }
+ if (wakeup_state == ERTS_POLL_NOT_WOKEN) {
+ /*
+ * Since we don't know the internals of SetEvent() we issue
+ * a memory barrier as a safety precaution ensuring that
+ * the store we just made to wakeup_state wont be reordered
+ * with loads in SetEvent().
+ */
+ ERTS_THR_MEMORY_BARRIER;
SetEvent(ps->event_io_ready);
}
}
-#endif
+
+static ERTS_INLINE void
+reset_io_ready(ErtsPollSet ps)
+{
+ erts_atomic32_set(&ps->wakeup_state, ERTS_POLL_NOT_WOKEN);
+}
+
+static ERTS_INLINE void
+restore_io_ready(ErtsPollSet ps)
+{
+ erts_atomic32_set(&ps->wakeup_state, ERTS_POLL_WOKEN_IO_READY);
+}
+
+/*
+ * notify_io_ready() is used by threads waiting for events, when
+ * notifying a poller thread about I/O ready.
+ */
+static ERTS_INLINE void
+notify_io_ready(ErtsPollSet ps)
+{
+ wake_poller(ps, 1);
+}
+
+static ERTS_INLINE void
+reset_interrupt(ErtsPollSet ps)
+{
+ /* We need to keep io-ready if set */
+ erts_aint32_t wakeup_state = erts_atomic32_read(&ps->wakeup_state);
+ while (wakeup_state != ERTS_POLL_WOKEN_IO_READY
+ && wakeup_state != ERTS_POLL_NOT_WOKEN) {
+ erts_aint32_t act = erts_atomic32_cmpxchg(&ps->wakeup_state,
+ ERTS_POLL_NOT_WOKEN,
+ wakeup_state);
+ if (wakeup_state == act)
+ break;
+ wakeup_state = act;
+ }
+ ERTS_THR_MEMORY_BARRIER;
+}
+
+static ERTS_INLINE void
+set_interrupt(ErtsPollSet ps)
+{
+ wake_poller(ps, 0);
+}
static void setup_standby_wait(ErtsPollSet ps, int num_threads)
{
@@ -653,14 +692,14 @@ static void *break_waiter(void *param)
case WAIT_OBJECT_0:
ResetEvent(harr[0]);
erts_mtx_lock(&break_waiter_lock);
- erts_atomic_set(&break_waiter_state,BREAK_WAITER_GOT_BREAK);
+ erts_atomic32_set(&break_waiter_state,BREAK_WAITER_GOT_BREAK);
SetEvent(break_happened_event);
erts_mtx_unlock(&break_waiter_lock);
break;
case (WAIT_OBJECT_0+1):
ResetEvent(harr[1]);
erts_mtx_lock(&break_waiter_lock);
- erts_atomic_set(&break_waiter_state,BREAK_WAITER_GOT_HALT);
+ erts_atomic32_set(&break_waiter_state,BREAK_WAITER_GOT_HALT);
SetEvent(break_happened_event);
erts_mtx_unlock(&break_waiter_lock);
break;
@@ -767,12 +806,7 @@ event_happened:
consistency_check(w);
#endif
ASSERT(WAIT_OBJECT_0 < i && i < WAIT_OBJECT_0+w->active_events);
- if (!erts_atomic_xchg(&ps->sys_io_ready,1)) {
- HARDDEBUGF(("SET EventIoReady (%d)",erts_atomic_read(&ps->sys_io_ready)));
- SetEvent(ps->event_io_ready);
- } else {
- HARDDEBUGF(("DONT SET EventIoReady"));
- }
+ notify_io_ready(ps);
/*
* The main thread wont start working on our arrays untill we're
@@ -967,15 +1001,10 @@ static int cancel_driver_select(ErtsPollSet ps, HANDLE event)
void erts_poll_interrupt(ErtsPollSet ps, int set /* bool */)
{
HARDTRACEF(("In erts_poll_interrupt(%d)",set));
-#ifdef ERTS_SMP
- if (set) {
- ERTS_POLLSET_SET_INTERRUPTED(ps);
- wake_poller(ps);
- }
- else {
- ERTS_POLLSET_UNSET_INTERRUPTED(ps);
- }
-#endif
+ if (!set)
+ reset_interrupt(ps);
+ else
+ set_interrupt(ps);
HARDTRACEF(("Out erts_poll_interrupt(%d)",set));
}
@@ -984,17 +1013,10 @@ void erts_poll_interrupt_timed(ErtsPollSet ps,
long msec)
{
HARDTRACEF(("In erts_poll_interrupt_timed(%d,%ld)",set,msec));
-#ifdef ERTS_SMP
- if (set) {
- if (erts_smp_atomic_read(&ps->timeout) > msec) {
- ERTS_POLLSET_SET_INTERRUPTED(ps);
- wake_poller(ps);
- }
- }
- else {
- ERTS_POLLSET_UNSET_INTERRUPTED(ps);
- }
-#endif
+ if (!set)
+ reset_interrupt(ps);
+ else if (erts_smp_atomic32_read_acqb(&ps->timeout) > (erts_aint32_t) msec)
+ set_interrupt(ps);
HARDTRACEF(("Out erts_poll_interrupt_timed"));
}
@@ -1068,10 +1090,8 @@ void erts_poll_controlv(ErtsPollSet ps,
int erts_poll_wait(ErtsPollSet ps,
ErtsPollResFd pr[],
int *len,
- SysTimeval *utvp)
+ SysTimeval *tvp)
{
- SysTimeval *tvp = utvp;
- SysTimeval itv;
int no_fds;
DWORD timeout;
EventData* ev;
@@ -1084,7 +1104,7 @@ int erts_poll_wait(ErtsPollSet ps,
HARDTRACEF(("In erts_poll_wait"));
ERTS_POLLSET_LOCK(ps);
- if (!erts_atomic_read(&ps->sys_io_ready) && ps->restore_events) {
+ if (!is_io_ready(ps) && ps->restore_events) {
HARDDEBUGF(("Restore events: %d",ps->num_waiters));
ps->restore_events = 0;
for (i = 0; i < ps->num_waiters; ++i) {
@@ -1102,7 +1122,7 @@ int erts_poll_wait(ErtsPollSet ps,
if (w->highwater != w->active_events) {
HARDDEBUGF(("Oups!"));
/* Oups, got signalled before we took the lock, can't reset */
- if(erts_atomic_read(&ps->sys_io_ready) == 0) {
+ if(!is_io_ready(ps)) {
erl_exit(1,"Internal error: "
"Inconsistent io structures in erl_poll.\n");
}
@@ -1127,39 +1147,27 @@ int erts_poll_wait(ErtsPollSet ps,
no_fds = ERTS_POLL_MAX_RES;
#endif
+ timeout = poll_wait_timeout(ps, tvp);
- ResetEvent(ps->event_io_ready);
- ERTS_POLLSET_UNSET_POLLER_WOKEN(ps);
-
-#ifdef ERTS_SMP
- if (ERTS_POLLSET_IS_INTERRUPTED(ps)) {
- /* Interrupt use zero timeout */
- itv.tv_sec = 0;
- itv.tv_usec = 0;
- tvp = &itv;
- }
-#endif
-
- timeout = tvp->tv_sec * 1000 + tvp->tv_usec / 1000;
/*HARDDEBUGF(("timeout = %ld",(long) timeout));*/
- erts_smp_atomic_set(&ps->timeout, timeout);
- if (timeout > 0 && ! erts_atomic_read(&ps->sys_io_ready) && ! erts_atomic_read(&break_waiter_state)) {
+ if (timeout > 0 && !erts_atomic32_read(&break_waiter_state)) {
HANDLE harr[2] = {ps->event_io_ready, break_happened_event};
int num_h = 2;
- HARDDEBUGF(("Start waiting %d [%d]",num_h, (long) timeout));
+ HARDDEBUGF(("Start waiting %d [%d]",num_h, (int) timeout));
ERTS_POLLSET_UNLOCK(ps);
WaitForMultipleObjects(num_h, harr, FALSE, timeout);
ERTS_POLLSET_LOCK(ps);
- HARDDEBUGF(("Stop waiting %d [%d]",num_h, (long) timeout));
+ HARDDEBUGF(("Stop waiting %d [%d]",num_h, (int) timeout));
+ woke_up(ps);
}
ERTS_UNSET_BREAK_REQUESTED;
- if(erts_atomic_read(&break_waiter_state)) {
+ if(erts_atomic32_read(&break_waiter_state)) {
erts_mtx_lock(&break_waiter_lock);
- break_state = erts_atomic_read(&break_waiter_state);
- erts_atomic_set(&break_waiter_state,0);
+ break_state = erts_atomic32_read(&break_waiter_state);
+ erts_atomic32_set(&break_waiter_state,0);
ResetEvent(break_happened_event);
erts_mtx_unlock(&break_waiter_lock);
switch (break_state) {
@@ -1174,15 +1182,13 @@ int erts_poll_wait(ErtsPollSet ps,
}
}
- ERTS_POLLSET_SET_POLLER_WOKEN(ps);
-
- if (!erts_atomic_read(&ps->sys_io_ready)) {
- res = EINTR;
- HARDDEBUGF(("EINTR!"));
- goto done;
+ res = wakeup_cause(ps);
+ if (res != 0) {
+ HARDDEBUGF(("%s!", res == EINTR ? "EINTR" : "ETIMEDOUT"));
+ goto done;
}
- erts_atomic_set(&ps->sys_io_ready,0);
+ reset_io_ready(ps);
n = ps->num_waiters;
@@ -1204,9 +1210,9 @@ int erts_poll_wait(ErtsPollSet ps,
if (num >= no_fds) {
w->highwater=j+1;
erts_mtx_unlock(&w->mtx);
- /* This might mean we still have data to report, set
- back the global flag! */
- erts_atomic_set(&ps->sys_io_ready,1);
+ /* This might mean we still have data to report,
+ restore flag indicating I/O ready! */
+ restore_io_ready(ps);
HARDDEBUGF(("To many FD's to report!"));
goto done;
}
@@ -1228,7 +1234,7 @@ int erts_poll_wait(ErtsPollSet ps,
erts_mtx_unlock(&w->mtx);
}
done:
- erts_smp_atomic_set(&ps->timeout, LONG_MAX);
+ erts_smp_atomic32_set(&ps->timeout, ERTS_AINT32_T_MAX);
*len = num;
ERTS_POLLSET_UNLOCK(ps);
HARDTRACEF(("Out erts_poll_wait"));
@@ -1306,15 +1312,13 @@ ErtsPollSet erts_poll_create_pollset(void)
ps->standby_wait_counter = 0;
ps->event_io_ready = CreateManualEvent(FALSE);
ps->standby_wait_event = CreateManualEvent(FALSE);
- erts_atomic_init(&ps->sys_io_ready,0);
ps->restore_events = 0;
+ erts_atomic32_init(&ps->wakeup_state, ERTS_POLL_NOT_WOKEN);
#ifdef ERTS_SMP
- erts_smp_atomic_init(&ps->woken, 0);
erts_smp_mtx_init(&ps->mtx, "pollset");
- erts_smp_atomic_init(&ps->interrupt, 0);
#endif
- erts_smp_atomic_init(&ps->timeout, LONG_MAX);
+ erts_smp_atomic32_init(&ps->timeout, ERTS_AINT32_T_MAX);
HARDTRACEF(("Out erts_poll_create_pollset"));
return ps;
@@ -1366,7 +1370,7 @@ void erts_poll_init(void)
erts_mtx_init(&break_waiter_lock,"break_waiter_lock");
break_happened_event = CreateManualEvent(FALSE);
- erts_atomic_init(&break_waiter_state, 0);
+ erts_atomic32_init(&break_waiter_state, 0);
erts_thr_create(&thread, &break_waiter, NULL, NULL);
ERTS_UNSET_BREAK_REQUESTED;
diff --git a/erts/emulator/sys/win32/erl_win_dyn_driver.h b/erts/emulator/sys/win32/erl_win_dyn_driver.h
index 4949998abc..ecb06868d5 100644
--- a/erts/emulator/sys/win32/erl_win_dyn_driver.h
+++ b/erts/emulator/sys/win32/erl_win_dyn_driver.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2003-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2003-2011. 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
@@ -87,15 +87,15 @@ WDD_TYPEDEF(unsigned long, erts_alc_test, (unsigned long,
unsigned long,
unsigned long,
unsigned long));
-WDD_TYPEDEF(long, driver_binary_get_refc, (ErlDrvBinary *dbp));
-WDD_TYPEDEF(long, driver_binary_inc_refc, (ErlDrvBinary *dbp));
-WDD_TYPEDEF(long, driver_binary_dec_refc, (ErlDrvBinary *dbp));
+WDD_TYPEDEF(ErlDrvSInt, driver_binary_get_refc, (ErlDrvBinary *dbp));
+WDD_TYPEDEF(ErlDrvSInt, driver_binary_inc_refc, (ErlDrvBinary *dbp));
+WDD_TYPEDEF(ErlDrvSInt, driver_binary_dec_refc, (ErlDrvBinary *dbp));
WDD_TYPEDEF(ErlDrvPDL, driver_pdl_create, (ErlDrvPort));
WDD_TYPEDEF(void, driver_pdl_lock, (ErlDrvPDL));
WDD_TYPEDEF(void, driver_pdl_unlock, (ErlDrvPDL));
-WDD_TYPEDEF(long, driver_pdl_get_refc, (ErlDrvPDL));
-WDD_TYPEDEF(long, driver_pdl_inc_refc, (ErlDrvPDL));
-WDD_TYPEDEF(long, driver_pdl_dec_refc, (ErlDrvPDL));
+WDD_TYPEDEF(ErlDrvSInt, driver_pdl_get_refc, (ErlDrvPDL));
+WDD_TYPEDEF(ErlDrvSInt, driver_pdl_inc_refc, (ErlDrvPDL));
+WDD_TYPEDEF(ErlDrvSInt, driver_pdl_dec_refc, (ErlDrvPDL));
WDD_TYPEDEF(void, driver_system_info, (ErlDrvSysInfo *, size_t));
WDD_TYPEDEF(int, driver_get_now, (ErlDrvNowData *));
WDD_TYPEDEF(int, driver_monitor_process, (ErlDrvPort port,
diff --git a/erts/emulator/sys/win32/sys.c b/erts/emulator/sys/win32/sys.c
index 37041ed987..a2159d063c 100644
--- a/erts/emulator/sys/win32/sys.c
+++ b/erts/emulator/sys/win32/sys.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -75,7 +75,7 @@ static int create_pipe(LPHANDLE, LPHANDLE, BOOL, BOOL);
static int application_type(const char* originalName, char fullPath[MAX_PATH],
BOOL search_in_path, BOOL handle_quotes,
int *error_return);
-static int application_type_w(const char* originalName, WCHAR fullPath[MAX_PATH],
+static int application_type_w(const WCHAR *originalName, WCHAR fullPath[MAX_PATH],
BOOL search_in_path, BOOL handle_quotes,
int *error_return);
@@ -260,7 +260,7 @@ erts_sys_prepare_crash_dump(void)
}
static void
-init_console()
+init_console(void)
{
char* mode = erts_read_env("ERL_CONSOLE_MODE");
@@ -280,7 +280,7 @@ init_console()
erts_free_read_env(mode);
}
-int sys_max_files()
+int sys_max_files(void)
{
return max_files;
}
@@ -296,10 +296,7 @@ int sys_max_files()
*/
static int
-get_and_remove_option(argc, argv, option)
- int* argc; /* Number of arguments. */
- char* argv[]; /* The argument vector. */
- const char* option; /* Option to search for and remove. */
+get_and_remove_option(int* argc, char* argv[], const char *option)
{
int i;
@@ -349,9 +346,7 @@ static char *get_and_remove_option2(int *argc, char **argv,
char os_type[] = "win32";
void
-os_flavor(namebuf, size)
-char* namebuf; /* Where to return the name. */
-unsigned size; /* Size of name buffer. */
+os_flavor(char *namebuf, unsigned size)
{
switch (int_os_version.dwPlatformId) {
case VER_PLATFORM_WIN32_WINDOWS:
@@ -624,12 +619,7 @@ struct erl_drv_entry async_driver_entry = {
*/
static DriverData*
-new_driver_data(port_num, packet_bytes, wait_objs_required, use_threads)
- int port_num; /* The port number. */
- int packet_bytes; /* Number of bytes in header. */
- int wait_objs_required; /* The number objects this port is going
- /* wait for (typically 1 or 2). */
- int use_threads; /* TRUE if threads are intended to be used. */
+new_driver_data(int port_num, int packet_bytes, int wait_objs_required, int use_threads)
{
DriverData* dp;
@@ -867,12 +857,7 @@ threaded_handle_closer(LPVOID param)
*/
static ErlDrvData
-set_driver_data(dp, ifd, ofd, read_write, report_exit)
- DriverData* dp;
- HANDLE ifd;
- HANDLE ofd;
- int read_write;
- int report_exit;
+set_driver_data(DriverData* dp, HANDLE ifd, HANDLE ofd, int read_write, int report_exit)
{
int index = dp - driver_data;
int result;
@@ -896,6 +881,31 @@ set_driver_data(dp, ifd, ofd, read_write, report_exit)
return (ErlDrvData)index;
}
+static ErlDrvData
+reuse_driver_data(DriverData *dp, HANDLE ifd, HANDLE ofd, int read_write, ErlDrvPort port_num)
+{
+ int index = dp - driver_data;
+ int result;
+
+ dp->port_num = port_num;
+ dp->in.fd = ifd;
+ dp->out.fd = ofd;
+ dp->report_exit = 0;
+
+ if (read_write & DO_READ) {
+ result = driver_select(dp->port_num, (ErlDrvEvent)dp->in.ov.hEvent,
+ ERL_DRV_READ|ERL_DRV_USE, 1);
+ ASSERT(result != -1);
+ }
+
+ if (read_write & DO_WRITE) {
+ result = driver_select(dp->port_num, (ErlDrvEvent)dp->out.ov.hEvent,
+ ERL_DRV_WRITE|ERL_DRV_USE, 1);
+ ASSERT(result != -1);
+ }
+ return (ErlDrvData)index;
+}
+
/*
* Initialises an AsyncIo structure.
*/
@@ -969,10 +979,7 @@ release_async_io(AsyncIo* aio, ErlDrvPort port_num)
*/
static void
-async_read_file(aio, buf, numToRead)
- AsyncIo* aio; /* Pointer to driver data. */
- LPVOID buf; /* Pointer to buffer to receive data. */
- DWORD numToRead; /* Number of bytes to read. */
+async_read_file(AsyncIo* aio, LPVOID buf, DWORD numToRead)
{
aio->pendingError = NO_ERROR;
#ifdef HARD_POLL_DEBUG
@@ -1023,10 +1030,9 @@ async_read_file(aio, buf, numToRead)
* ----------------------------------------------------------------------
*/
static int
-async_write_file(aio, buf, numToWrite)
- AsyncIo* aio; /* Pointer to async control block. */
- LPVOID buf; /* Pointer to buffer with data to write. */
- DWORD numToWrite; /* Number of bytes to write. */
+async_write_file(AsyncIo* aio, /* Pointer to async control block. */
+ LPVOID buf, /* Pointer to buffer with data to write. */
+ DWORD numToWrite) /* Number of bytes to write. */
{
aio->pendingError = NO_ERROR;
if (aio->thread != (HANDLE) -1) {
@@ -1070,12 +1076,12 @@ async_write_file(aio, buf, numToWrite)
* ----------------------------------------------------------------------
*/
static int
-get_overlapped_result(aio, pBytesRead, wait)
- AsyncIo* aio; /* Pointer to async control block. */
- LPDWORD pBytesRead; /* Where to place the number of bytes
- * transferred.
- */
- BOOL wait; /* If true, wait until result is ready. */
+get_overlapped_result(AsyncIo* aio, /* Pointer to async control block. */
+ LPDWORD pBytesRead, /* Where to place the number of bytes
+ * transferred.
+ */
+ BOOL wait /* If true, wait until result is ready. */
+ )
{
DWORD error = NO_ERROR; /* Error status from last function. */
@@ -1145,7 +1151,7 @@ fd_init(void)
return 0;
}
static int
-spawn_init()
+spawn_init(void)
{
int i;
#if defined(ERTS_SMP) && defined(USE_CANCELIOEX)
@@ -1532,7 +1538,7 @@ create_child_process
siStartInfo.hStdOutput = hStdout;
siStartInfo.hStdError = hStderr;
- applType = application_type_w(origcmd, (char *) execPath, FALSE, FALSE,
+ applType = application_type_w((WCHAR *) origcmd, execPath, FALSE, FALSE,
errno_return);
if (applType == APPL_NONE) {
return FALSE;
@@ -1555,7 +1561,7 @@ create_child_process
if (run_cmd) {
WCHAR cmdPath[MAX_PATH];
int cmdType;
- cmdType = application_type_w((char *) L"cmd.exe", (char *) cmdPath, TRUE, FALSE, errno_return);
+ cmdType = application_type_w(L"cmd.exe", cmdPath, TRUE, FALSE, errno_return);
if (cmdType == APPL_NONE || cmdType == APPL_DOS) {
return FALSE;
}
@@ -1921,7 +1927,7 @@ static int application_type
return applType;
}
-static int application_type_w (const char *originalName, /* Name of the application to find. */
+static int application_type_w (const WCHAR *originalName, /* Name of the application to find. */
WCHAR wfullpath[MAX_PATH],/* Filled with complete path to
* application. */
BOOL search_in_path, /* If we should search the system wide path */
@@ -1937,25 +1943,24 @@ static int application_type_w (const char *originalName, /* Name of the applicat
static WCHAR extensions[][5] = {L"", L".com", L".exe", L".bat"};
int is_quoted;
int len;
- WCHAR *wname = (WCHAR *) originalName;
WCHAR xfullpath[MAX_PATH];
- len = wcslen(wname);
- is_quoted = handle_quotes && len > 0 && wname[0] == L'"' &&
- wname[len-1] == L'"';
+ len = wcslen(originalName);
+ is_quoted = handle_quotes && len > 0 && originalName[0] == L'"' &&
+ originalName[len-1] == L'"';
applType = APPL_NONE;
*error_return = ENOENT;
for (i = 0; i < (int) (sizeof(extensions) / sizeof(extensions[0])); i++) {
if(is_quoted) {
- lstrcpynW(xfullpath, wname+1, MAX_PATH - 7); /* Cannot start using StringCchCopy yet, we support
+ lstrcpynW(xfullpath, originalName+1, MAX_PATH - 7); /* Cannot start using StringCchCopy yet, we support
older platforms */
len = wcslen(xfullpath);
if(len > 0) {
xfullpath[len-1] = L'\0';
}
} else {
- lstrcpynW(xfullpath, wname, MAX_PATH - 5);
+ lstrcpynW(xfullpath, originalName, MAX_PATH - 5);
}
wcscat(xfullpath, extensions[i]);
/* It seems that the Unicode version does not allow in and out parameter to overlap. */
@@ -2080,9 +2085,10 @@ threaded_reader(LPVOID param)
buf = OV_BUFFER_PTR(aio);
numToRead = OV_NUM_TO_READ(aio);
aio->pendingError = 0;
- if (!ReadFile(aio->fd, buf, numToRead, &aio->bytesTransferred, NULL))
- aio->pendingError = GetLastError();
- else if (aio->flags & DF_XLAT_CR) {
+ if (!ReadFile(aio->fd, buf, numToRead, &aio->bytesTransferred, NULL)) {
+ int error = GetLastError();
+ aio->pendingError = error;
+ } else if (aio->flags & DF_XLAT_CR) {
char *s;
int n;
@@ -2209,56 +2215,79 @@ translate_fd(int fd)
return handle;
}
+/* Driver level locking, start function is serialized */
+static DriverData *save_01_port = NULL;
+static DriverData *save_22_port = NULL;
+
static ErlDrvData
fd_start(ErlDrvPort port_num, char* name, SysDriverOpts* opts)
{
DriverData* dp;
int is_std_error = (opts->ofd == 2);
-
- opts->ifd = (int) translate_fd(opts->ifd);
- opts->ofd = (int) translate_fd(opts->ofd);
- if ((dp = new_driver_data(port_num, opts->packet_bytes, 2, TRUE)) == NULL)
- return ERL_DRV_ERROR_GENERAL;
-
- if (!create_file_thread(&dp->in, DO_READ)) {
- dp->port_num = PORT_FREE;
- return ERL_DRV_ERROR_GENERAL;
- }
-
- if (!create_file_thread(&dp->out, DO_WRITE)) {
- dp->port_num = PORT_FREE;
- return ERL_DRV_ERROR_GENERAL;
- }
-
- fd_driver_input = &(dp->in);
- dp->in.flags = DF_XLAT_CR;
- if (is_std_error) {
- dp->out.flags |= DF_DROP_IF_INVH; /* Just drop messages if stderror
- is an invalid handle */
+ int in = opts->ifd, out = opts->ofd;
+
+ opts->ifd = (Uint) translate_fd(in);
+ opts->ofd = (Uint) translate_fd(out);
+ if ( in == 0 && out == 1 && save_01_port != NULL) {
+ dp = save_01_port;
+ return reuse_driver_data(dp, (HANDLE) opts->ifd, (HANDLE) opts->ofd, opts->read_write, port_num);
+ } else if (in == 2 && out == 2 && save_22_port != NULL) {
+ dp = save_22_port;
+ return reuse_driver_data(dp, (HANDLE) opts->ifd, (HANDLE) opts->ofd, opts->read_write, port_num);
+ } else {
+ if ((dp = new_driver_data(port_num, opts->packet_bytes, 2, TRUE)) == NULL)
+ return ERL_DRV_ERROR_GENERAL;
+
+ if (!create_file_thread(&dp->in, DO_READ)) {
+ dp->port_num = PORT_FREE;
+ return ERL_DRV_ERROR_GENERAL;
+ }
+
+ if (!create_file_thread(&dp->out, DO_WRITE)) {
+ dp->port_num = PORT_FREE;
+ return ERL_DRV_ERROR_GENERAL;
+ }
+
+ fd_driver_input = &(dp->in);
+ dp->in.flags = DF_XLAT_CR;
+ if (is_std_error) {
+ dp->out.flags |= DF_DROP_IF_INVH; /* Just drop messages if stderror
+ is an invalid handle */
+ }
+
+ if ( in == 0 && out == 1) {
+ save_01_port = dp;
+ } else if (in == 2 && out == 2) {
+ save_22_port = dp;
+ }
+ return set_driver_data(dp, (HANDLE) opts->ifd, (HANDLE) opts->ofd, opts->read_write, 0);
}
- return set_driver_data(dp, opts->ifd, opts->ofd, opts->read_write, 0);
}
static void fd_stop(ErlDrvData d)
{
int fd = (int)d;
+ DriverData* dp = driver_data+fd;
/*
- * I don't know a clean way to terminate the threads
- * (TerminateThread() doesn't release the stack),
- * so will we'll let the threads live. Normally, the fd
- * driver is only used to support the -oldshell option,
- * so this shouldn't be a problem in practice.
- *
- * Since we will not attempt to terminate the threads,
- * better not close the input or output files either.
+ * There's no way we can terminate an fd port in a consistent way.
+ * Instead we let it live until it's opened again (which it is,
+ * as the only FD-drivers are for 0,1 and 2 adn the only time they
+ * get closed is by init:reboot).
+ * So - just deselect them and let everything be as is.
+ * They get woken up in fd_start again, where the DriverData is
+ * remembered. /PaN
*/
+ if (dp->in.ov.hEvent != NULL) {
+ (void) driver_select(dp->port_num,
+ (ErlDrvEvent)dp->in.ov.hEvent,
+ ERL_DRV_READ, 0);
+ }
+ if (dp->out.ov.hEvent != NULL) {
+ (void) driver_select(dp->port_num,
+ (ErlDrvEvent)dp->out.ov.hEvent,
+ ERL_DRV_WRITE, 0);
+ }
- driver_data[fd].in.thread = (HANDLE) -1;
- driver_data[fd].out.thread = (HANDLE) -1;
- driver_data[fd].in.fd = INVALID_HANDLE_VALUE;
- driver_data[fd].out.fd = INVALID_HANDLE_VALUE;
-
- /*return */ common_stop(fd);
}
static ErlDrvData
@@ -2350,7 +2379,6 @@ threaded_exiter(LPVOID param)
* because it is an auto reset event. Therefore, always set the
* exit flag and signal the event.
*/
-
i = 0;
if (dp->out.thread != (HANDLE) -1) {
dp->out.flags = DF_EXIT_THREAD;
@@ -2718,6 +2746,7 @@ ready_input(ErlDrvData drv_data, ErlDrvEvent ready_event)
driver_failure_eof(dp->port_num);
} else { /* Report real errors. */
int error = GetLastError();
+
(void) driver_select(dp->port_num, ready_event, ERL_DRV_READ, 0);
_dosmaperr(error);
driver_failure_posix(dp->port_num, errno);
diff --git a/erts/emulator/sys/win32/sys_interrupt.c b/erts/emulator/sys/win32/sys_interrupt.c
index d2449a1bdb..943c338794 100644
--- a/erts/emulator/sys/win32/sys_interrupt.c
+++ b/erts/emulator/sys/win32/sys_interrupt.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1997-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1997-2011. 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
@@ -31,11 +31,11 @@
#endif
#ifdef ERTS_SMP
-erts_smp_atomic_t erts_break_requested;
+erts_smp_atomic32_t erts_break_requested;
#define ERTS_SET_BREAK_REQUESTED \
- erts_smp_atomic_set(&erts_break_requested, (long) 1)
+ erts_smp_atomic32_set(&erts_break_requested, (erts_aint32_t) 1)
#define ERTS_UNSET_BREAK_REQUESTED \
- erts_smp_atomic_set(&erts_break_requested, (long) 0)
+ erts_smp_atomic32_set(&erts_break_requested, (erts_aint32_t) 0)
#else
volatile int erts_break_requested = 0;
#define ERTS_SET_BREAK_REQUESTED (erts_break_requested = 1)
diff --git a/erts/emulator/test/Makefile b/erts/emulator/test/Makefile
index 7259e1b84d..4d0c87bf12 100644
--- a/erts/emulator/test/Makefile
+++ b/erts/emulator/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2010. All Rights Reserved.
+# Copyright Ericsson AB 1997-2011. 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
@@ -122,10 +122,14 @@ NO_OPT= bs_bincomp \
bs_utf \
guard
+NATIVE= hibernate
NO_OPT_MODULES= $(NO_OPT:%=%_no_opt_SUITE)
NO_OPT_ERL_FILES= $(NO_OPT_MODULES:%=%.erl)
+NATIVE_MODULES= $(NATIVE:%=%_native_SUITE)
+NATIVE_ERL_FILES= $(NATIVE_MODULES:%=%.erl)
+
ERL_FILES= $(MODULES:%=%.erl)
TARGET_FILES = $(MODULES:%=$(EBIN)/%.$(EMULATOR))
@@ -151,7 +155,7 @@ ERL_COMPILE_FLAGS += -I$(ERL_TOP)/lib/test_server/include
# Targets
# ----------------------------------------------------
-make_emakefile: $(NO_OPT_ERL_FILES)
+make_emakefile: $(NO_OPT_ERL_FILES) $(NATIVE_ERL_FILES)
# This special rule can be removed when communication with R7B nodes
# is no longer supported.
$(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) +compressed -o$(EBIN) \
@@ -160,6 +164,8 @@ make_emakefile: $(NO_OPT_ERL_FILES)
$(MODULES) >> $(EMAKEFILE)
$(ERL_TOP)/make/make_emakefile +no_copt +no_postopt $(ERL_COMPILE_FLAGS) \
-o$(EBIN) $(NO_OPT_MODULES) >> $(EMAKEFILE)
+ $(ERL_TOP)/make/make_emakefile +native $(ERL_COMPILE_FLAGS) \
+ -o$(EBIN) $(NATIVE_MODULES) >> $(EMAKEFILE)
tests debug opt: make_emakefile
erl $(ERL_MAKE_FLAGS) -make
@@ -178,6 +184,9 @@ docs:
%_no_opt_SUITE.erl: %_SUITE.erl
sed -e 's;-module($(basename $<));-module($(basename $@));' $< > $@
+%_native_SUITE.erl: %_SUITE.erl
+ sed -e 's;-module($(basename $<));-module($(basename $@));' $< > $@
+
# ----------------------------------------------------
# Release Target
# ----------------------------------------------------
@@ -190,7 +199,8 @@ release_tests_spec: make_emakefile
$(INSTALL_DATA) $(EMAKEFILE) $(TEST_SPEC_FILES) \
$(ERL_FILES) $(RELSYSDIR)
$(INSTALL_DATA) $(NO_OPT_ERL_FILES) $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ $(INSTALL_DATA) $(NATIVE_ERL_FILES) $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
release_docs_spec:
diff --git a/erts/emulator/test/a_SUITE.erl b/erts/emulator/test/a_SUITE.erl
index e9d653a7c4..b541be3df6 100644
--- a/erts/emulator/test/a_SUITE.erl
+++ b/erts/emulator/test/a_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -26,15 +26,32 @@
%%%-------------------------------------------------------------------
-module(a_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1, long_timers/1, pollset_size/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, long_timers/1, pollset_size/1]).
-all(doc) ->
- [];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[long_timers, pollset_size].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
long_timers(doc) ->
[];
long_timers(suite) ->
diff --git a/erts/emulator/test/after_SUITE.erl b/erts/emulator/test/after_SUITE.erl
index 3e1a871408..7cc329cc69 100644
--- a/erts/emulator/test/after_SUITE.erl
+++ b/erts/emulator/test/after_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -21,27 +21,48 @@
%% Tests receive after.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1, t_after/1, receive_after/1, receive_after_big/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ t_after/1, receive_after/1, receive_after_big/1,
receive_after_errors/1, receive_var_zero/1, receive_zero/1,
multi_timeout/1, receive_after_32bit/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
%% Internal exports.
-export([timeout_g/0]).
-all(suite) ->
- [t_after, receive_after, receive_after_big, receive_after_errors,
- receive_var_zero, receive_zero, multi_timeout, receive_after_32bit].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [t_after, receive_after, receive_after_big,
+ receive_after_errors, receive_var_zero, receive_zero,
+ multi_timeout, receive_after_32bit].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog=?t:timetrap(?t:minutes(3)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog).
diff --git a/erts/emulator/test/alloc_SUITE.erl b/erts/emulator/test/alloc_SUITE.erl
index 94766dc6e9..22b5d93983 100644
--- a/erts/emulator/test/alloc_SUITE.erl
+++ b/erts/emulator/test/alloc_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -18,7 +18,8 @@
-module(alloc_SUITE).
-author('[email protected]').
--export([all/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([basic/1,
coalesce/1,
@@ -29,28 +30,40 @@
rbtree/1,
mseg_clear_cache/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(DEFAULT_TIMETRAP_SECS, 240).
-all(doc) -> [];
-all(suite) -> [basic,
- coalesce,
- threads,
- realloc_copy,
- bucket_index,
- bucket_mask,
- rbtree,
- mseg_clear_cache].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [basic, coalesce, threads, realloc_copy, bucket_index,
+ bucket_mask, rbtree, mseg_clear_cache].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(Case, Config) when is_list(Config) ->
Dog = ?t:timetrap(?t:seconds(?DEFAULT_TIMETRAP_SECS)),
[{watchdog, Dog},{testcase, Case}|Config].
-fin_per_testcase(_Case, Config) when is_list(Config) ->
+end_per_testcase(_Case, Config) when is_list(Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
diff --git a/erts/emulator/test/beam_SUITE.erl b/erts/emulator/test/beam_SUITE.erl
index 228ff15341..02c6e19686 100644
--- a/erts/emulator/test/beam_SUITE.erl
+++ b/erts/emulator/test/beam_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -19,16 +19,37 @@
-module(beam_SUITE).
--export([all/1, packed_registers/1, apply_last/1, apply_last_bif/1,
- buildo_mucho/1, heap_sizes/1, big_lists/1, fconv/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ packed_registers/1, apply_last/1, apply_last_bif/1,
+ buildo_mucho/1, heap_sizes/1, big_lists/1, fconv/1,
+ select_val/1]).
-export([applied/2]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [packed_registers, apply_last, apply_last_bif,
+ buildo_mucho, heap_sizes, big_lists, select_val].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [packed_registers, apply_last, apply_last_bif, buildo_mucho,
- heap_sizes, big_lists].
%% Verify that apply(M, F, A) is really tail recursive.
@@ -302,3 +323,19 @@ do_fconv(nil, Float) when is_float(Float) ->
Float + [];
do_fconv(tuple_literal, Float) when is_float(Float) ->
Float + {a,b}.
+
+select_val(Config) when is_list(Config) ->
+ ?line zero = do_select_val(0),
+ ?line big = do_select_val(1 bsl 64),
+ ?line integer = do_select_val(42),
+ ok.
+
+do_select_val(X) ->
+ case X of
+ 0 ->
+ zero;
+ 1 bsl 64 ->
+ big;
+ Int when is_integer(Int) ->
+ integer
+ end.
diff --git a/erts/emulator/test/beam_literals_SUITE.erl b/erts/emulator/test/beam_literals_SUITE.erl
index 75841adbfc..85236e4203 100644
--- a/erts/emulator/test/beam_literals_SUITE.erl
+++ b/erts/emulator/test/beam_literals_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -18,21 +18,41 @@
%%
-module(beam_literals_SUITE).
--export([all/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([putting/1, matching_smalls/1, matching_smalls_jt/1,
matching_bigs/1, matching_more_bigs/1,
matching_bigs_and_smalls/1, badmatch/1, case_clause/1,
receiving/1, literal_type_tests/1,
- put_list/1, fconv/1, literal_case_expression/1]).
+ put_list/1, fconv/1, literal_case_expression/1,
+ increment/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[putting, matching_smalls, matching_smalls_jt,
matching_bigs, matching_more_bigs,
matching_bigs_and_smalls, badmatch, case_clause,
- receiving, literal_type_tests,
- put_list, fconv, literal_case_expression].
+ receiving, literal_type_tests, put_list, fconv,
+ literal_case_expression, increment].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
putting(doc) -> "Test creating lists and tuples containing big number literals.";
putting(Config) when is_list(Config) ->
@@ -48,6 +68,7 @@ matching_bigs(doc) -> "Test matching of a few big number literals (in Beam,"
matching_bigs(Config) when is_list(Config) ->
a = matching1(3972907842873739),
b = matching1(-389789298378939783333333333333333333784),
+ other = matching1(3141699999999999999999999999999999999),
other = matching1(42).
matching_smalls(doc) -> "Test matching small numbers (both positive and negative).";
@@ -236,14 +257,14 @@ make_test([{T,L}|Ts]) ->
make_test([]) -> [].
test(T, L) ->
- S = lists:flatten(io_lib:format("begin io:format(\"~~p~~n\", [{~p,~p}]), if ~w(~w) -> true; true -> false end end. ", [T, L, T, L])),
+ S = lists:flatten(io_lib:format("begin io:format(\"~~p~n\", [{~p,~p}]), if ~w(~w) -> true; true -> false end end. ", [T, L, T, L])),
{ok,Toks,_Line} = erl_scan:string(S),
{ok,E} = erl_parse:parse_exprs(Toks),
{value,Val,_Bs} = erl_eval:exprs(E, []),
{match,0,{atom,0,Val},hd(E)}.
test(T, A, L) ->
- S = lists:flatten(io_lib:format("begin io:format(\"~~p~~n\", [{~p,~p,~p}]), if ~w(~w, ~w) -> true; true -> false end end. ",
+ S = lists:flatten(io_lib:format("begin io:format(\"~~p~n\", [{~p,~p,~p}]), if ~w(~w, ~w) -> true; true -> false end end. ",
[T,L,A,T,L,A])),
{ok,Toks,_Line} = erl_scan:string(S),
{ok,E} = erl_parse:parse_exprs(Toks),
@@ -405,14 +426,51 @@ fconv_2(F) when is_float(F) ->
literal_case_expression(Config) when is_list(Config) ->
?line DataDir = ?config(data_dir, Config),
?line Src = filename:join(DataDir, "literal_case_expression"),
- ?line {ok,literal_case_expression=Mod,Code} = compile:file(Src, [from_asm,binary]),
+ ?line {ok,literal_case_expression=Mod,Code} =
+ compile:file(Src, [from_asm,binary]),
?line {module,Mod} = code:load_binary(Mod, Src, Code),
?line ok = Mod:x(),
?line ok = Mod:y(),
+ ?line ok = Mod:zi1(),
+ ?line ok = Mod:zi2(),
+ ?line ok = Mod:za1(),
+ ?line ok = Mod:za2(),
?line true = code:delete(Mod),
?line code:purge(Mod),
ok.
+%% Test the i_increment instruction.
+increment(Config) when is_list(Config) ->
+ %% In the 32-bit emulator, Neg32 can be represented as a small,
+ %% but -Neg32 cannot. Therefore the i_increment instruction must
+ %% not be used in the subtraction that follows (since i_increment
+ %% cannot handle a bignum literal).
+ Neg32 = -(1 bsl 27),
+ Big32 = id(1 bsl 32),
+ Result32 = (1 bsl 32) + (1 bsl 27),
+ ?line Result32 = Big32 + (1 bsl 27),
+ ?line Result32 = Big32 - Neg32,
+
+ %% Same thing, but for the 64-bit emulator.
+ Neg64 = -(1 bsl 59),
+ Big64 = id(1 bsl 64),
+ Result64 = (1 bsl 64) + (1 bsl 59),
+ ?line Result64 = Big64 + (1 bsl 59),
+ ?line Result64 = Big64 - Neg64,
+
+ %% Test error handling for the i_increment instruction.
+ Bad = id(bad),
+ ?line {'EXIT',{badarith,_}} = (catch Bad + 42),
+
+ %% Small operands, but a big result.
+ Res32 = 1 bsl 27,
+ Small32 = id(Res32-1),
+ ?line Res32 = Small32 + 1,
+ Res64 = 1 bsl 59,
+ Small64 = id(Res64-1),
+ ?line Res64 = Small64 + 1,
+ ok.
+
%% Help functions.
chksum(Term) ->
diff --git a/erts/emulator/test/beam_literals_SUITE_data/literal_case_expression.S b/erts/emulator/test/beam_literals_SUITE_data/literal_case_expression.S
index c0ffe9ab53..bfdfc079dc 100644
--- a/erts/emulator/test/beam_literals_SUITE_data/literal_case_expression.S
+++ b/erts/emulator/test/beam_literals_SUITE_data/literal_case_expression.S
@@ -1,10 +1,11 @@
{module, literal_case_expression}. %% version = 0
-{exports, [{module_info,0},{module_info,1},{x,0},{y,0}]}.
+{exports, [{module_info,0},{module_info,1},{x,0},{y,0},
+ {zi1,0},{zi2,0},{za1,0},{za2,0}]}.
{attributes, []}.
-{labels, 15}.
+{labels, 32}.
{function, x, 0, 2}.
@@ -52,6 +53,81 @@
{label,10}.
{case_end,{float,34.0000}}.
+{function, zi1, 0, 16}.
+ {label,15}.
+ {func_info,{atom,literal_case_expression},{atom,zi1},0}.
+ {label,16}.
+ {test,is_integer,{f,19},[{integer,42}]}.
+ {select_val,{integer,42},
+ {f,18},
+ {list,[{integer,42},
+ {f,17},
+ {integer,1000},
+ {f,18}]}}.
+ {label,17}.
+ {move,{atom,ok},{x,0}}.
+ return.
+ {label,18}.
+ {move,{atom,error},{x,0}}.
+ return.
+ {label,19}.
+ {case_end,{integer,42}}.
+
+{function, zi2, 0, 16}.
+ {label,20}.
+ {func_info,{atom,literal_case_expression},{atom,zi2},0}.
+ {label,21}.
+ {test,is_integer,{f,23},[{integer,42}]}.
+ {select_val,{integer,42},
+ {f,23},
+ {list,[{integer,42},
+ {f,22},
+ {integer,1000},
+ {f,23}]}}.
+ {label,22}.
+ {move,{atom,ok},{x,0}}.
+ return.
+ {label,23}.
+ {move,{atom,error},{x,0}}.
+ return.
+
+{function, za1, 0, 25}.
+ {label,24}.
+ {func_info,{atom,literal_case_expression},{atom,za1},0}.
+ {label,25}.
+ {test,is_atom,{f,28},[{atom,x}]}.
+ {select_val,{atom,x},
+ {f,27},
+ {list,[{atom,a},
+ {f,27},
+ {atom,x},
+ {f,26}]}}.
+ {label,26}.
+ {move,{atom,ok},{x,0}}.
+ return.
+ {label,27}.
+ {move,{atom,error},{x,0}}.
+ return.
+ {label,28}.
+ {case_end,{atom,x}}.
+
+{function, za2, 0, 30}.
+ {label,29}.
+ {func_info,{atom,literal_case_expression},{atom,za2},0}.
+ {label,30}.
+ {test,is_atom,{f,32},[{atom,x}]}.
+ {select_val,{atom,x},
+ {f,32},
+ {list,[{atom,a},
+ {f,32},
+ {atom,x},
+ {f,31}]}}.
+ {label,31}.
+ {move,{atom,ok},{x,0}}.
+ return.
+ {label,32}.
+ {move,{atom,error},{x,0}}.
+ return.
{function, module_info, 0, 12}.
{label,11}.
diff --git a/erts/emulator/test/bif_SUITE.erl b/erts/emulator/test/bif_SUITE.erl
index b4ef0e6d5a..c7617d3b90 100644
--- a/erts/emulator/test/bif_SUITE.erl
+++ b/erts/emulator/test/bif_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -19,27 +19,74 @@
-module(bif_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
+ display/1, display_huge/0,
types/1,
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]).
-all(suite) ->
- [types,t_list_to_existing_atom,os_env,otp_7526,
- atom_to_binary,binary_to_atom,binary_to_existing_atom,
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [types, t_list_to_existing_atom, os_env, otp_7526,
+ display,
+ atom_to_binary, binary_to_atom, binary_to_existing_atom,
min_max].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog=?t:timetrap(?t:minutes(1)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog).
+
+display(suite) ->
+ [];
+display(doc) ->
+ ["Uses erlang:display to test that erts_printf does not do deep recursion"];
+display(Config) when is_list(Config) ->
+ Pa = filename:dirname(code:which(?MODULE)),
+ {ok, Node} = test_server:start_node(display_huge_term,peer,
+ [{args, "-pa "++Pa}]),
+ true = rpc:call(Node,?MODULE,display_huge,[]),
+ test_server:stop_node(Node),
+ ok.
+
+display_huge() ->
+ erlang:display(deeep(100000)).
+
+deeep(0,Acc) ->
+ Acc;
+deeep(N,Acc) ->
+ deeep(N-1,[Acc|[]]).
+
+deeep(N) ->
+ deeep(N,[hello]).
+
+
types(Config) when is_list(Config) ->
c:l(erl_bif_types),
case erlang:function_exported(erl_bif_types, module_info, 0) of
diff --git a/erts/emulator/test/big_SUITE.erl b/erts/emulator/test/big_SUITE.erl
index 6cedd39009..3487917677 100644
--- a/erts/emulator/test/big_SUITE.erl
+++ b/erts/emulator/test/big_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -19,9 +19,10 @@
-module(big_SUITE).
--export([all/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([t_div/1, eq_28/1, eq_32/1, eq_big/1, eq_math/1, big_literals/1,
- borders/1, negative/1, big_float/1, big_float_1/1, big_float_2/1,
+ borders/1, negative/1, big_float_1/1, big_float_2/1,
shift_limit_1/1, powmod/1, system_limit/1, otp_6692/1]).
%% Internal exports.
@@ -30,19 +31,38 @@
-export([fac/1, fib/1, pow/2, gcd/2, lcm/2]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [t_div, eq_28, eq_32, eq_big, eq_math, big_literals,
+ borders, negative, {group, big_float}, shift_limit_1,
+ powmod, system_limit, otp_6692].
+
+groups() ->
+ [{big_float, [], [big_float_1, big_float_2]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [t_div, eq_28, eq_32, eq_big, eq_math, big_literals, borders,
- negative, big_float, shift_limit_1, powmod, system_limit, otp_6692].
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog=?t:timetrap(?t:minutes(3)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog).
@@ -260,10 +280,6 @@ big_literals(Config) when is_list(Config) ->
?line ok = Mod:t(),
ok.
-big_float(doc) ->
- ["Test cases for mixing bignums and floats"];
-big_float(suite) ->
- [big_float_1, big_float_2].
big_float_1(doc) ->
["OTP-2436, part 1"];
diff --git a/erts/emulator/test/binary_SUITE.erl b/erts/emulator/test/binary_SUITE.erl
index 77d2579848..7e409f053e 100644
--- a/erts/emulator/test/binary_SUITE.erl
+++ b/erts/emulator/test/binary_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -40,9 +40,11 @@
%% phash2(Binary, N)
%%
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1, init_per_testcase/2, fin_per_testcase/2,
+-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,
copy_terms/1, conversions/1, deep_lists/1, deep_bitstr_lists/1,
bad_list_to_binary/1, bad_binary_to_list/1,
t_split_binary/1, bad_split/1, t_concat_binary/1,
@@ -61,24 +63,42 @@
%% Internal exports.
-export([sleeper/0]).
-all(suite) ->
- [copy_terms,conversions,deep_lists,deep_bitstr_lists,
+suite() -> [{ct_hooks,[ts_install_cth]},
+ {timetrap,{minutes,2}}].
+
+all() ->
+ [copy_terms, conversions, deep_lists, deep_bitstr_lists,
t_split_binary, bad_split, t_concat_binary,
- bad_list_to_binary, bad_binary_to_list, terms, terms_float,
- external_size, t_iolist_size,
- bad_binary_to_term_2,safe_binary_to_term2,
- bad_binary_to_term, bad_terms, t_hash, bad_size, bad_term_to_binary,
- more_bad_terms, otp_5484, otp_5933, ordering, unaligned_order,
- gc_test, bit_sized_binary_sizes, otp_6817, otp_8117,
- deep,obsolete_funs,robustness,otp_8180].
+ bad_list_to_binary, bad_binary_to_list, terms,
+ terms_float, external_size, t_iolist_size,
+ bad_binary_to_term_2, safe_binary_to_term2,
+ bad_binary_to_term, bad_terms, t_hash, bad_size,
+ bad_term_to_binary, more_bad_terms, otp_5484, otp_5933,
+ ordering, unaligned_order, gc_test,
+ bit_sized_binary_sizes, otp_6817, otp_8117, deep,
+ obsolete_funs, robustness, otp_8180].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
- Dog=?t:timetrap(?t:minutes(2)),
- [{watchdog, Dog}|Config].
+ Config.
-fin_per_testcase(_Func, Config) ->
- Dog=?config(watchdog, Config),
- ?t:timetrap_cancel(Dog).
+end_per_testcase(_Func, _Config) ->
+ ok.
-define(heap_binary_size, 64).
@@ -1041,7 +1061,7 @@ test_terms(Test_Func) ->
?line Test_Func(F = fun(A) -> 42*A end),
?line Test_Func(lists:duplicate(32, F)),
- ?line Test_Func(FF = fun binary_SUITE:all/1),
+ ?line Test_Func(FF = fun binary_SUITE:all/0),
?line Test_Func(lists:duplicate(32, FF)),
ok.
@@ -1301,11 +1321,4 @@ unaligned_sub_bin(Bin0, Offs) ->
<<_:Offs,Bin:Sz/binary,_:Roffs>> = id(Bin1),
Bin.
-hostname() ->
- from($@, atom_to_list(node())).
-
-from(H, [H | T]) -> T;
-from(H, [_ | T]) -> from(H, T);
-from(_, []) -> [].
-
id(I) -> I.
diff --git a/erts/emulator/test/bs_bincomp_SUITE.erl b/erts/emulator/test/bs_bincomp_SUITE.erl
index 4e83d97689..f1c2dff560 100644
--- a/erts/emulator/test/bs_bincomp_SUITE.erl
+++ b/erts/emulator/test/bs_bincomp_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -22,15 +22,34 @@
-module(bs_bincomp_SUITE).
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
byte_aligned/1,bit_aligned/1,extended_byte_aligned/1,
extended_bit_aligned/1,mixed/1,tracing/1]).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [byte_aligned, bit_aligned, extended_byte_aligned,
+ extended_bit_aligned, mixed, tracing].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [byte_aligned,bit_aligned,extended_byte_aligned,
- extended_bit_aligned,mixed,tracing].
byte_aligned(Config) when is_list(Config) ->
diff --git a/erts/emulator/test/bs_bit_binaries_SUITE.erl b/erts/emulator/test/bs_bit_binaries_SUITE.erl
index 52bb925385..ff1088118d 100644
--- a/erts/emulator/test/bs_bit_binaries_SUITE.erl
+++ b/erts/emulator/test/bs_bit_binaries_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -22,18 +22,38 @@
-module(bs_bit_binaries_SUITE).
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
misc/1,horrid_match/1,test_bitstr/1,test_bit_size/1,asymmetric_tests/1,
big_asymmetric_tests/1,binary_to_and_from_list/1,
big_binary_to_and_from_list/1,send_and_receive/1,
send_and_receive_alot/1,append/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [misc, horrid_match, test_bitstr, test_bit_size,
+ asymmetric_tests, big_asymmetric_tests,
+ binary_to_and_from_list, big_binary_to_and_from_list,
+ send_and_receive, send_and_receive_alot, append].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [misc,horrid_match,test_bitstr,test_bit_size,asymmetric_tests,
- big_asymmetric_tests,binary_to_and_from_list,big_binary_to_and_from_list,
- send_and_receive,send_and_receive_alot,append].
misc(Config) when is_list(Config) ->
?line <<1:100>> = id(<<1:100>>),
diff --git a/erts/emulator/test/bs_construct_SUITE.erl b/erts/emulator/test/bs_construct_SUITE.erl
index 3d9b51d278..1959803385 100644
--- a/erts/emulator/test/bs_construct_SUITE.erl
+++ b/erts/emulator/test/bs_construct_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -21,22 +21,39 @@
-module(bs_construct_SUITE).
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
test1/1, test2/1, test3/1, test4/1, test5/1, testf/1,
not_used/1, in_guard/1,
mem_leak/1, coerce_to_float/1, bjorn/1,
huge_float_field/1, huge_binary/1, system_limit/1, badarg/1,
copy_writable_binary/1, kostis/1, dynamic/1, bs_add/1,
- otp_7422/1]).
+ otp_7422/1, zero_width/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
- [test1, test2, test3, test4, test5, testf,
- not_used, in_guard, mem_leak, coerce_to_float, bjorn,
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [test1, test2, test3, test4, test5, testf, not_used,
+ in_guard, mem_leak, coerce_to_float, bjorn,
huge_float_field, huge_binary, system_limit, badarg,
- copy_writable_binary, kostis, dynamic, bs_add,
- otp_7422].
+ copy_writable_binary, kostis, dynamic, bs_add, otp_7422, zero_width].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
big(1) ->
57285702734876389752897683.
@@ -786,5 +803,20 @@ otp_7422_bin(N) when N < 512 ->
end),
otp_7422_bin(N+1);
otp_7422_bin(_) -> ok.
+
+zero_width(Config) when is_list(Config) ->
+ ?line Z = id(0),
+ Small = id(42),
+ Big = id(1 bsl 128),
+ ?line <<>> = <<Small:Z>>,
+ ?line <<>> = <<Small:0>>,
+ ?line <<>> = <<Big:Z>>,
+ ?line <<>> = <<Big:0>>,
+
+ ?line {'EXIT',{badarg,_}} = (catch <<not_a_number:0>>),
+ ?line {'EXIT',{badarg,_}} = (catch <<(id(not_a_number)):Z>>),
+ ?line {'EXIT',{badarg,_}} = (catch <<(id(not_a_number)):0>>),
+
+ ok.
id(I) -> I.
diff --git a/erts/emulator/test/bs_match_bin_SUITE.erl b/erts/emulator/test/bs_match_bin_SUITE.erl
index 3d054a279f..96e69dbc0b 100644
--- a/erts/emulator/test/bs_match_bin_SUITE.erl
+++ b/erts/emulator/test/bs_match_bin_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -19,12 +19,32 @@
-module(bs_match_bin_SUITE).
--export([all/1,byte_split_binary/1,bit_split_binary/1,match_huge_bin/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ byte_split_binary/1,bit_split_binary/1,match_huge_bin/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [byte_split_binary, bit_split_binary, match_huge_bin].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [byte_split_binary,bit_split_binary,match_huge_bin].
byte_split_binary(doc) -> "Tries to split a binary at all byte-aligned positions.";
byte_split_binary(Config) when is_list(Config) ->
diff --git a/erts/emulator/test/bs_match_int_SUITE.erl b/erts/emulator/test/bs_match_int_SUITE.erl
index 99dee7c7bc..ce03ecb548 100644
--- a/erts/emulator/test/bs_match_int_SUITE.erl
+++ b/erts/emulator/test/bs_match_int_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -18,16 +18,36 @@
-module(bs_match_int_SUITE).
--export([all/1,integer/1,signed_integer/1,dynamic/1,more_dynamic/1,mml/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ integer/1,signed_integer/1,dynamic/1,more_dynamic/1,mml/1,
match_huge_int/1,bignum/1,unaligned_32_bit/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-import(lists, [seq/2]).
-all(suite) ->
- [integer,signed_integer,dynamic,more_dynamic,mml,match_huge_int,bignum,
- unaligned_32_bit].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [integer, signed_integer, dynamic, more_dynamic, mml,
+ match_huge_int, bignum, unaligned_32_bit].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
integer(Config) when is_list(Config) ->
?line 0 = get_int(mkbin([])),
diff --git a/erts/emulator/test/bs_match_misc_SUITE.erl b/erts/emulator/test/bs_match_misc_SUITE.erl
index 6de2ef67e5..b022f96740 100644
--- a/erts/emulator/test/bs_match_misc_SUITE.erl
+++ b/erts/emulator/test/bs_match_misc_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -18,18 +18,38 @@
%%
-module(bs_match_misc_SUITE).
--export([all/1,bound_var/1,bound_tail/1,t_float/1,little_float/1,sean/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ bound_var/1,bound_tail/1,t_float/1,little_float/1,sean/1,
kenneth/1,encode_binary/1,native/1,happi/1,
size_var/1,wiger/1,x0_context/1,huge_float_field/1,
writable_binary_matched/1,otp_7198/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [bound_var, bound_tail, t_float, little_float, sean,
+ kenneth, encode_binary, native, happi, size_var, wiger,
+ x0_context, huge_float_field, writable_binary_matched,
+ otp_7198].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [bound_var,bound_tail,t_float,little_float,sean,
- kenneth,encode_binary,native,happi,
- size_var,wiger,x0_context,huge_float_field,
- writable_binary_matched,otp_7198].
bound_var(doc) -> "Test matching of bound variables.";
bound_var(Config) when is_list(Config) ->
diff --git a/erts/emulator/test/bs_match_tail_SUITE.erl b/erts/emulator/test/bs_match_tail_SUITE.erl
index b0b0779b65..1397f2069c 100644
--- a/erts/emulator/test/bs_match_tail_SUITE.erl
+++ b/erts/emulator/test/bs_match_tail_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -20,11 +20,31 @@
-module(bs_match_tail_SUITE).
-author('[email protected]').
--export([all/1,aligned/1,unaligned/1,zero_tail/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,aligned/1,unaligned/1,zero_tail/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [aligned, unaligned, zero_tail].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) -> [aligned,unaligned,zero_tail].
aligned(doc) -> "Test aligned tails.";
aligned(Config) when is_list(Config) ->
diff --git a/erts/emulator/test/bs_utf_SUITE.erl b/erts/emulator/test/bs_utf_SUITE.erl
index 87adc5197b..72c656c400 100644
--- a/erts/emulator/test/bs_utf_SUITE.erl
+++ b/erts/emulator/test/bs_utf_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -19,13 +19,15 @@
-module(bs_utf_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
utf8_roundtrip/1,utf16_roundtrip/1,utf32_roundtrip/1,
utf8_illegal_sequences/1,utf16_illegal_sequences/1,
utf32_illegal_sequences/1,
bad_construction/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(FAIL(Expr), ?line fail_check(catch Expr, ??Expr, [])).
@@ -33,14 +35,32 @@ init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog = ?t:timetrap(?t:minutes(6)),
[{watchdog,Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog).
-all(suite) ->
- [utf8_roundtrip,utf16_roundtrip,utf32_roundtrip,
- utf8_illegal_sequences,utf16_illegal_sequences,
- utf32_illegal_sequences,bad_construction].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [utf8_roundtrip, utf16_roundtrip, utf32_roundtrip,
+ utf8_illegal_sequences, utf16_illegal_sequences,
+ utf32_illegal_sequences, bad_construction].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
utf8_roundtrip(Config) when is_list(Config) ->
?line utf8_roundtrip(0, 16#D7FF),
diff --git a/erts/emulator/test/busy_port_SUITE.erl b/erts/emulator/test/busy_port_SUITE.erl
index 7350aef4ec..8365e1c540 100644
--- a/erts/emulator/test/busy_port_SUITE.erl
+++ b/erts/emulator/test/busy_port_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -19,21 +19,40 @@
-module(busy_port_SUITE).
--export([all/1, io_to_busy/1, message_order/1, send_3/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ io_to_busy/1, message_order/1, send_3/1,
system_monitor/1, no_trap_exit/1,
no_trap_exit_unlinked/1, trap_exit/1, multiple_writers/1,
hard_busy_driver/1, soft_busy_driver/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% Internal exports.
-export([init/2]).
-all(suite) -> {req, [dynamic_loading],
- [io_to_busy, message_order, send_3,
- system_monitor, no_trap_exit,
- no_trap_exit_unlinked, trap_exit, multiple_writers,
- hard_busy_driver, soft_busy_driver]}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [io_to_busy, message_order, send_3, system_monitor,
+ no_trap_exit, no_trap_exit_unlinked, trap_exit,
+ multiple_writers, hard_busy_driver, soft_busy_driver].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% Tests I/O operations to a busy port, to make sure a suspended send
%% operation is correctly restarted. This used to crash Beam.
diff --git a/erts/emulator/test/call_trace_SUITE.erl b/erts/emulator/test/call_trace_SUITE.erl
index e0528955b0..93fdc157f7 100644
--- a/erts/emulator/test/call_trace_SUITE.erl
+++ b/erts/emulator/test/call_trace_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -20,7 +20,9 @@
-module(call_trace_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
hipe/1,process_specs/1,basic/1,flags/1,errors/1,pam/1,change_pam/1,
return_trace/1,exception_trace/1,on_load/1,deep_exception/1,
exception_nocatch/1,bit_syntax/1]).
@@ -35,25 +37,44 @@
-export([abbr/1,abbr/2]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(P, 20).
-all(suite) ->
- Common = [errors,on_load],
- NotHipe = [process_specs,basic,flags,pam,change_pam,return_trace,
- exception_trace,deep_exception,exception_nocatch,bit_syntax],
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ Common = [errors, on_load],
+ NotHipe = [process_specs, basic, flags, pam, change_pam,
+ return_trace, exception_trace, deep_exception,
+ exception_nocatch, bit_syntax],
Hipe = [hipe],
- case test_server:is_native(?MODULE) of
+ case test_server:is_native(call_trace_SUITE) of
true -> Hipe ++ Common;
false -> NotHipe ++ Common
end.
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog = ?t:timetrap(?t:seconds(30)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog).
diff --git a/erts/emulator/test/code_SUITE.erl b/erts/emulator/test/code_SUITE.erl
index 33351a3cc9..c1a048be75 100644
--- a/erts/emulator/test/code_SUITE.erl
+++ b/erts/emulator/test/code_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -18,18 +18,38 @@
%%
-module(code_SUITE).
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
new_binary_types/1,t_check_process_code/1,t_check_process_code_ets/1,
external_fun/1,get_chunk/1,module_md5/1,make_stub/1,
make_stub_many_funs/1,constant_pools/1,
false_dependency/1,coverage/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [new_binary_types, t_check_process_code,
+ t_check_process_code_ets, external_fun, get_chunk,
+ module_md5, make_stub, make_stub_many_funs,
+ constant_pools, false_dependency, coverage].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [new_binary_types,t_check_process_code,t_check_process_code_ets,
- external_fun,get_chunk,module_md5,make_stub,make_stub_many_funs,
- constant_pools,false_dependency,coverage].
new_binary_types(Config) when is_list(Config) ->
?line Data = ?config(data_dir, Config),
@@ -320,6 +340,9 @@ make_stub(Config) when is_list(Config) ->
(catch code:make_stub_module(my_code_test,
bit_sized_binary(Code),
{[],[]})),
+ ?line {'EXIT',{badarg,_}} =
+ (catch code:make_stub_module(my_code_test_with_wrong_name,
+ Code, {[],[]})),
ok.
make_stub_many_funs(Config) when is_list(Config) ->
@@ -460,7 +483,7 @@ do_false_dependency(Init, Code) ->
%% Spawn process. Make sure it has the appropriate init function
%% and returned. CP should not contain garbage after the return.
Parent = self(),
- ?line Pid = spawn_link(fun() -> false_dependency_loop(Parent, Init) end),
+ ?line Pid = spawn_link(fun() -> false_dependency_loop(Parent, Init, true) end),
?line receive initialized -> ok end,
%% Reload the module. Make sure the process is still alive.
@@ -478,11 +501,18 @@ do_false_dependency(Init, Code) ->
?line true = erlang:purge_module(cpbugx),
ok.
-false_dependency_loop(Parent, Init) ->
+false_dependency_loop(Parent, Init, SendInitAck) ->
Init(),
- Parent ! initialized,
+ case SendInitAck of
+ true -> Parent ! initialized;
+ false -> void
+ %% Just send one init-ack. I guess the point of this test
+ %% wasn't to fill parents msg-queue (?). Seen to cause
+ %% out-of-mem (on halfword-vm for some reason) by
+ %% 91 million msg in queue. /sverker
+ end,
receive
- _ -> false_dependency_loop(Parent, Init)
+ _ -> false_dependency_loop(Parent, Init, false)
end.
coverage(Config) when is_list(Config) ->
diff --git a/erts/emulator/test/crypto_SUITE.erl b/erts/emulator/test/crypto_SUITE.erl
index e3d34b923d..a82bd4fe38 100644
--- a/erts/emulator/test/crypto_SUITE.erl
+++ b/erts/emulator/test/crypto_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -19,14 +19,34 @@
-module(crypto_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
t_md5/1,t_md5_update/1,error/1,unaligned_context/1,random_lists/1,
misc_errors/1]).
-all(suite) ->
- [t_md5,t_md5_update,error,unaligned_context,random_lists,misc_errors].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [t_md5, t_md5_update, error, unaligned_context,
+ random_lists, misc_errors].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
misc_errors(doc) ->
diff --git a/erts/emulator/test/crypto_reference.erl b/erts/emulator/test/crypto_reference.erl
index 99107e3b57..b91535a50e 100644
--- a/erts/emulator/test/crypto_reference.erl
+++ b/erts/emulator/test/crypto_reference.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2010. 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
diff --git a/erts/emulator/test/ddll_SUITE.erl b/erts/emulator/test/ddll_SUITE.erl
index 79047d7de5..6e15c228cd 100644
--- a/erts/emulator/test/ddll_SUITE.erl
+++ b/erts/emulator/test/ddll_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -30,7 +30,8 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--export([all/1, ddll_test/1, errors/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, ddll_test/1, errors/1,
reference_count/1,
kill_port/1, dont_kill_port/1]).
-export([unload_on_process_exit/1, delayed_unload_with_ports/1,
@@ -50,35 +51,39 @@
-import(ordsets, [subtract/2]).
--include("test_server.hrl").
-
-all(suite) ->
- [ddll_test, errors,
- reference_count,
- kill_port,
- dont_kill_port,
- properties,
- load_and_unload,
- unload_on_process_exit,
- delayed_unload_with_ports,
+-include_lib("test_server/include/test_server.hrl").
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [ddll_test, errors, reference_count, kill_port,
+ dont_kill_port, properties, load_and_unload,
+ unload_on_process_exit, delayed_unload_with_ports,
unload_due_to_process_exit,
- no_unload_due_to_process_exit,
- no_unload_due_to_process_exit_2,
- unload_reload_thingie,
- unload_reload_thingie_2,
- unload_reload_thingie_3,
- reload_pending,
- load_fail_init,
- reload_pending_fail_init,
- reload_pending_kill,
- more_error_codes,
- forced_port_killing,
- no_trap_exit_and_kill_ports,
- monitor_demonitor,
- monitor_demonitor_load,
- new_interface,
- lock_driver
- ].
+ no_unload_due_to_process_exit,
+ no_unload_due_to_process_exit_2, unload_reload_thingie,
+ unload_reload_thingie_2, unload_reload_thingie_3,
+ reload_pending, load_fail_init,
+ reload_pending_fail_init, reload_pending_kill,
+ more_error_codes, forced_port_killing,
+ no_trap_exit_and_kill_ports, monitor_demonitor,
+ monitor_demonitor_load, new_interface, lock_driver].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
unload_on_process_exit(suite) ->
[];
diff --git a/erts/emulator/test/decode_packet_SUITE.erl b/erts/emulator/test/decode_packet_SUITE.erl
index d9e961be2f..c0499554eb 100644
--- a/erts/emulator/test/decode_packet_SUITE.erl
+++ b/erts/emulator/test/decode_packet_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -21,14 +21,34 @@
-module(decode_packet_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
basic/1, packet_size/1, neg/1, http/1, line/1, ssl/1, otp_8536/1]).
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[basic, packet_size, neg, http, line, ssl, otp_8536].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Seed = {S1,S2,S3} = now(),
random:seed(S1,S2,S3),
@@ -36,7 +56,7 @@ init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog=?t:timetrap(?t:minutes(1)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog).
diff --git a/erts/emulator/test/dgawd_handler.erl b/erts/emulator/test/dgawd_handler.erl
index 881354b9da..27085b7b7e 100644
--- a/erts/emulator/test/dgawd_handler.erl
+++ b/erts/emulator/test/dgawd_handler.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2010. 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
diff --git a/erts/emulator/test/distribution_SUITE.erl b/erts/emulator/test/distribution_SUITE.erl
index 79252d0593..4bebae51cc 100644
--- a/erts/emulator/test/distribution_SUITE.erl
+++ b/erts/emulator/test/distribution_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -22,30 +22,30 @@
%% Tests distribution and the tcp driver.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,
- ping/1, bulk_send/1, bulk_send_small/1,
- bulk_send_big/1,
- bulk_send_bigbig/1,
- local_send/1, local_send_small/1, local_send_big/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ ping/1, bulk_send_small/1,
+ bulk_send_big/1, bulk_send_bigbig/1,
+ local_send_small/1, local_send_big/1,
local_send_legal/1, link_to_busy/1, exit_to_busy/1,
lost_exit/1, link_to_dead/1, link_to_dead_new_node/1,
applied_monitor_node/1, ref_port_roundtrip/1, nil_roundtrip/1,
- trap_bif/1, trap_bif_1/1, trap_bif_2/1, trap_bif_3/1,
- stop_dist/1, dist_auto_connect/1,
+ trap_bif_1/1, trap_bif_2/1, trap_bif_3/1,
+ stop_dist/1,
dist_auto_connect_never/1, dist_auto_connect_once/1,
dist_parallel_send/1,
atom_roundtrip/1,
atom_roundtrip_r12b/1,
contended_atom_cache_entry/1,
- bad_dist_ext/1,
+ bad_dist_structure/1,
bad_dist_ext_receive/1,
bad_dist_ext_process_info/1,
bad_dist_ext_control/1,
bad_dist_ext_connection_id/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
%% Internal exports.
-export([sender/3, receiver2/2, dummy_waiter/0, dead_process/0,
@@ -54,15 +54,39 @@
dist_evil_parallel_receiver/0,
sendersender/4, sendersender2/4]).
-all(suite) -> [
- ping, bulk_send, local_send, link_to_busy, exit_to_busy,
- lost_exit, link_to_dead, link_to_dead_new_node,
- applied_monitor_node, ref_port_roundtrip, nil_roundtrip,
- stop_dist, trap_bif, dist_auto_connect, dist_parallel_send,
- atom_roundtrip, atom_roundtrip_r12b,
- contended_atom_cache_entry,
- bad_dist_ext
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [ping, {group, bulk_send}, {group, local_send},
+ link_to_busy, exit_to_busy, lost_exit, link_to_dead,
+ link_to_dead_new_node, applied_monitor_node,
+ ref_port_roundtrip, nil_roundtrip, stop_dist,
+ {group, trap_bif}, {group, dist_auto_connect},
+ dist_parallel_send, atom_roundtrip, atom_roundtrip_r12b,
+ contended_atom_cache_entry, bad_dist_structure, {group, bad_dist_ext}].
+
+groups() ->
+ [{bulk_send, [], [bulk_send_small, bulk_send_big, bulk_send_bigbig]},
+ {local_send, [],
+ [local_send_small, local_send_big, local_send_legal]},
+ {trap_bif, [], [trap_bif_1, trap_bif_2, trap_bif_3]},
+ {dist_auto_connect, [],
+ [dist_auto_connect_never, dist_auto_connect_once]},
+ {bad_dist_ext, [],
+ [bad_dist_ext_receive, bad_dist_ext_process_info,
+ bad_dist_ext_control, bad_dist_ext_connection_id]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-define(DEFAULT_TIMETRAP, 4*60*1000).
@@ -70,7 +94,7 @@ init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog=?t:timetrap(?DEFAULT_TIMETRAP),
[{watchdog, Dog},{testcase, Func}|Config].
-fin_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
+end_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog).
@@ -118,13 +142,6 @@ ping(Config) when is_list(Config) ->
ok.
-bulk_send(doc) ->
- ["Tests sending large amount of data to another node and measure",
- "the time. This tests that a process that is suspended on a ",
- "busy port will eventually be resumed."];
-bulk_send(suite) ->
- [bulk_send_small, bulk_send_big, bulk_send_bigbig].
-
bulk_send_small(Config) when is_list(Config) ->
?line bulk_send(64, 32).
@@ -174,7 +191,7 @@ bulk_sendsend2(Terms, BinSize, BusyBufSize) ->
?line {ok, NodeRecv} = start_node(bulk_receiver),
?line Recv = spawn(NodeRecv, erlang, apply, [fun receiver/2, [0, 0]]),
?line Bin = list_to_binary(lists:duplicate(BinSize*1024, 253)),
- ?line Size = Terms*size(Bin),
+ %%?line Size = Terms*size(Bin),
%% SLF LEFT OFF HERE.
%% When the caller uses small hunks, like 4k via
@@ -187,7 +204,7 @@ bulk_sendsend2(Terms, BinSize, BusyBufSize) ->
?line {ok, NodeSend} = start_node(bulk_sender, "+zdbbl " ++ integer_to_list(BusyBufSize)),
?line _Send = spawn(NodeSend, erlang, apply, [fun sendersender/4, [self(), Recv, Bin, Terms]]),
- ?line {Elapsed, {TermsN, SizeN}, MonitorCount} =
+ ?line {Elapsed, {_TermsN, SizeN}, MonitorCount} =
receive {sendersender, BigRes} ->
BigRes
end,
@@ -227,7 +244,7 @@ sendersender3(To, _Bin, 0, SendDone, MonitorCount) ->
ok
end,
receive
- {monitor, _Pid, _Type, _Info} = M ->
+ {monitor, _Pid, _Type, _Info} ->
sendersender3(To, _Bin, 0, SendDone, MonitorCount + 1)
after 0 ->
if SendDone ->
@@ -255,17 +272,14 @@ receiver(Terms, Size) ->
end.
-local_send(suite) ->
- [local_send_small, local_send_big, local_send_legal];
-local_send(doc) ->
- ["Tests sending small and big messages to a non-existing ",
- "local registered process."].
local_send_big(doc) ->
["Sends several big message to an non-registered process on ",
"the local node."];
local_send_big(Config) when is_list(Config) ->
- Data0=local_send_big(doc)++local_send(doc),
+ Data0=local_send_big(doc)++
+ ["Tests sending small and big messages to a non-existing ",
+ "local registered process."],
Data1=[Data0,[Data0, Data0, [Data0], Data0],Data0],
Data2=Data0++lists:flatten(Data1)++
list_to_binary(lists:flatten(Data1)),
@@ -522,7 +536,7 @@ sink1() ->
lost_exit(doc) ->
"Test that EXIT and DOWN messages send to another node are not lost if "
- "if the distribution port is busy.";
+ "the distribution port is busy.";
lost_exit(Config) when is_list(Config) ->
?line {ok, Node} = start_node(lost_exit),
@@ -751,9 +765,6 @@ stop_dist(Config) when is_list(Config) ->
ok.
-trap_bif(doc) ->
- ["Verifies that BIFs which are traps to Erlang work (OTP-2680)."];
-trap_bif(suite) -> [trap_bif_1, trap_bif_2, trap_bif_3].
trap_bif_1(doc) ->
[""];
@@ -790,10 +801,6 @@ tr3() ->
-dist_auto_connect(doc) ->
- ["Tests the kernel parameter 'dist_auto_connect'."];
-dist_auto_connect(suite) ->
- [dist_auto_connect_never, dist_auto_connect_once].
% This has to be done by nodes with differrent cookies, otherwise global
% will connect nodes, which is correct, but makes it hard to test.
@@ -1143,8 +1150,7 @@ contended_atom_cache_entry(Config) when is_list(Config) ->
?line {ok, SNode} = start_node(Config),
?line {ok, RNode} = start_node(Config),
?line Success = make_ref(),
- ?line Mstr
- = spawn_link(
+ ?line spawn_link(
SNode,
fun () ->
erts_debug:set_internal_state(available_internal_state,
@@ -1201,13 +1207,13 @@ contended_atom_cache_entry(Config) when is_list(Config) ->
?line stop_node(RNode),
?line ok.
-send_ref_atom(To, Ref, Atom, 0) ->
+send_ref_atom(_To, _Ref, _Atom, 0) ->
ok;
send_ref_atom(To, Ref, Atom, N) ->
To ! {Ref, Atom},
send_ref_atom(To, Ref, Atom, N-1).
-receive_ref_atom(Ref, Atom, 0) ->
+receive_ref_atom(_Ref, _Atom, 0) ->
ok;
receive_ref_atom(Ref, Atom, N) ->
receive
@@ -1242,7 +1248,7 @@ unwanted_cixs() ->
nodes()).
-get_conflicting_atoms(CIX, 0) ->
+get_conflicting_atoms(_CIX, 0) ->
[];
get_conflicting_atoms(CIX, N) ->
{A, B, C} = now(),
@@ -1256,13 +1262,187 @@ get_conflicting_atoms(CIX, N) ->
get_conflicting_atoms(CIX, N)
end.
+-define(COOKIE, '').
+-define(DOP_LINK, 1).
+-define(DOP_SEND, 2).
+-define(DOP_EXIT, 3).
+-define(DOP_UNLINK, 4).
+-define(DOP_REG_SEND, 6).
+-define(DOP_GROUP_LEADER, 7).
+-define(DOP_EXIT2, 8).
+
+-define(DOP_SEND_TT, 12).
+-define(DOP_EXIT_TT, 13).
+-define(DOP_REG_SEND_TT, 16).
+-define(DOP_EXIT2_TT, 18).
+
+-define(DOP_MONITOR_P, 19).
+-define(DOP_DEMONITOR_P, 20).
+-define(DOP_MONITOR_P_EXIT, 21).
+
+start_monitor(Offender,P) ->
+ ?line Parent = self(),
+ ?line Q = spawn(Offender,
+ fun () ->
+ Ref = erlang:monitor(process,P),
+ Parent ! {self(),ref,Ref},
+ receive
+ just_stay_alive -> ok
+ end
+ end),
+ ?line Ref = receive
+ {Q,ref,R} ->
+ R
+ after 5000 ->
+ error
+ end,
+ io:format("Ref is ~p~n",[Ref]),
+ ok.
+start_link(Offender,P) ->
+ ?line Parent = self(),
+ ?line Q = spawn(Offender,
+ fun () ->
+ process_flag(trap_exit,true),
+ link(P),
+ Parent ! {self(),ref,P},
+ receive
+ just_stay_alive -> ok
+ end
+ end),
+ ?line Ref = receive
+ {Q,ref,R} ->
+ R
+ after 5000 ->
+ error
+ end,
+ io:format("Ref is ~p~n",[Ref]),
+ ok.
+
+bad_dist_structure(suite) ->
+ [];
+bad_dist_structure(doc) ->
+ ["Test dist messages with valid structure (binary to term ok) but malformed"
+ "control content"];
+bad_dist_structure(Config) when is_list(Config) ->
+ %process_flag(trap_exit,true),
+ ODog = ?config(watchdog, Config),
+ ?t:timetrap_cancel(ODog),
+ Dog = ?t:timetrap(?t:seconds(15)),
+
+ ?line {ok, Offender} = start_node(bad_dist_structure_offender),
+ ?line {ok, Victim} = start_node(bad_dist_structure_victim),
+ ?line start_node_monitors([Offender,Victim]),
+ ?line Parent = self(),
+ ?line P = spawn(Victim,
+ fun () ->
+ process_flag(trap_exit,true),
+ Parent ! {self(), started},
+ receive check_msgs -> ok end,
+ bad_dist_struct_check_msgs([one,
+ two]),
+ Parent ! {self(), messages_checked},
+ receive done -> ok end
+ end),
+ ?line receive {P, started} -> ok end,
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line verify_up(Offender, Victim),
+ ?line true = lists:member(Offender, rpc:call(Victim, erlang, nodes, [])),
+ ?line start_monitor(Offender,P),
+ ?line P ! one,
+ ?line send_bad_structure(Offender, P,{?DOP_MONITOR_P_EXIT,'replace',P,normal},2),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line start_monitor(Offender,P),
+ ?line send_bad_structure(Offender, P,{?DOP_MONITOR_P_EXIT,'replace',P,normal,normal},2),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line start_link(Offender,P),
+ ?line send_bad_structure(Offender, P,{?DOP_LINK},0),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line start_link(Offender,P),
+ ?line send_bad_structure(Offender, P,{?DOP_UNLINK,'replace'},2),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line start_link(Offender,P),
+ ?line send_bad_structure(Offender, P,{?DOP_UNLINK,'replace',make_ref()},2),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line start_link(Offender,P),
+ ?line send_bad_structure(Offender, P,{?DOP_UNLINK,make_ref(),P},0),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line start_link(Offender,P),
+ ?line send_bad_structure(Offender, P,{?DOP_UNLINK,normal,normal},0),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line start_monitor(Offender,P),
+ ?line send_bad_structure(Offender, P,{?DOP_MONITOR_P,'replace',P},2),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line start_monitor(Offender,P),
+ ?line send_bad_structure(Offender, P,{?DOP_MONITOR_P,'replace',P,normal},2),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line start_monitor(Offender,P),
+ ?line send_bad_structure(Offender, P,{?DOP_DEMONITOR_P,'replace',P},2),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line start_monitor(Offender,P),
+ ?line send_bad_structure(Offender, P,{?DOP_DEMONITOR_P,'replace',P,normal},2),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line send_bad_structure(Offender, P,{?DOP_EXIT,'replace',P},2),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line send_bad_structure(Offender, P,{?DOP_EXIT,make_ref(),normal,normal},0),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line send_bad_structure(Offender, P,{?DOP_EXIT_TT,'replace',token,P},2),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line send_bad_structure(Offender, P,{?DOP_EXIT_TT,make_ref(),token,normal,normal},0),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line send_bad_structure(Offender, P,{?DOP_EXIT2,'replace',P},2),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line send_bad_structure(Offender, P,{?DOP_EXIT2,make_ref(),normal,normal},0),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line send_bad_structure(Offender, P,{?DOP_EXIT2_TT,'replace',token,P},2),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line send_bad_structure(Offender, P,{?DOP_EXIT2_TT,make_ref(),token,normal,normal},0),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line send_bad_structure(Offender, P,{?DOP_GROUP_LEADER,'replace'},2),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line send_bad_structure(Offender, P,{?DOP_GROUP_LEADER,'replace','atomic'},2),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line send_bad_structure(Offender, P,{?DOP_GROUP_LEADER,'replace',P},0),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line send_bad_structure(Offender, P,{?DOP_REG_SEND_TT,'replace','',name},2,{message}),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line send_bad_structure(Offender, P,{?DOP_REG_SEND_TT,'replace','',name,token},0,{message}),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line send_bad_structure(Offender, P,{?DOP_REG_SEND,'replace',''},2,{message}),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line send_bad_structure(Offender, P,{?DOP_REG_SEND,'replace','',P},0,{message}),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line send_bad_structure(Offender, P,{?DOP_REG_SEND,'replace','',name},0,{message}),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line send_bad_structure(Offender, P,{?DOP_REG_SEND,'replace','',name,{token}},2,{message}),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line send_bad_structure(Offender, P,{?DOP_SEND_TT,'',P},0,{message}),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line send_bad_structure(Offender, P,{?DOP_SEND_TT,'',name,token},0,{message}),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line send_bad_structure(Offender, P,{?DOP_SEND,''},0,{message}),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line send_bad_structure(Offender, P,{?DOP_SEND,'',name},0,{message}),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line send_bad_structure(Offender, P,{?DOP_SEND,'',P,{token}},0,{message}),
+ ?line pong = rpc:call(Victim, net_adm, ping, [Offender]),
+ ?line P ! two,
+ ?line P ! check_msgs,
+ ?line receive
+ {P, messages_checked} -> ok
+ after 5000 ->
+ exit(victim_is_dead)
+ end,
+
+ ?line {message_queue_len, 0}
+ = rpc:call(Victim, erlang, process_info, [P, message_queue_len]),
+
+ ?line unlink(P),
+ ?line P ! done,
+ ?line stop_node(Offender),
+ ?line stop_node(Victim),
+ ?t:timetrap_cancel(Dog),
+ ok.
-bad_dist_ext(doc) -> [];
-bad_dist_ext(suite) ->
- [bad_dist_ext_receive,
- bad_dist_ext_process_info,
- bad_dist_ext_control,
- bad_dist_ext_connection_id].
bad_dist_ext_receive(Config) when is_list(Config) ->
@@ -1483,6 +1663,22 @@ bad_dist_ext_connection_id(Config) when is_list(Config) ->
?line stop_node(Victim).
+bad_dist_struct_check_msgs([]) ->
+ receive
+ Msg ->
+ exit({unexpected_message, Msg})
+ after 0 ->
+ ok
+ end;
+bad_dist_struct_check_msgs([M|Ms]) ->
+ receive
+ {'EXIT',_,_} = EM ->
+ io:format("Ignoring exit message: ~p~n",[EM]),
+ bad_dist_struct_check_msgs([M|Ms]);
+ Msg ->
+ M = Msg,
+ bad_dist_struct_check_msgs(Ms)
+ end.
bad_dist_ext_check_msgs([]) ->
receive
Msg ->
@@ -1497,24 +1693,6 @@ bad_dist_ext_check_msgs([M|Ms]) ->
bad_dist_ext_check_msgs(Ms)
end.
--define(COOKIE, '').
--define(DOP_LINK, 1).
--define(DOP_SEND, 2).
--define(DOP_EXIT, 3).
--define(DOP_UNLINK, 4).
--define(DOP_NODE_LINK, 5).
--define(DOP_REG_SEND, 6).
--define(DOP_GROUP_LEADER, 7).
--define(DOP_EXIT2, 8).
-
--define(DOP_SEND_TT, 12).
--define(DOP_EXIT_TT, 13).
--define(DOP_REG_SEND_TT, 16).
--define(DOP_EXIT2_TT, 18).
-
--define(DOP_MONITOR_P, 19).
--define(DOP_DEMONITOR_P, 20).
--define(DOP_MONITOR_P_EXIT, 21).
dport_reg_send(Node, Name, Msg) ->
DPrt = case dport(Node) of
@@ -1546,6 +1724,39 @@ dport_send(To, Msg) ->
?COOKIE,
To}),
dmsg_ext(Msg)]).
+send_bad_structure(Offender,Victim,Bad,WhereToPutSelf) ->
+ send_bad_structure(Offender,Victim,Bad,WhereToPutSelf,[]).
+send_bad_structure(Offender,Victim,Bad,WhereToPutSelf,PayLoad) ->
+ Parent = self(),
+ Done = make_ref(),
+ spawn(Offender,
+ fun () ->
+ Node = node(Victim),
+ pong = net_adm:ping(Node),
+ DPrt = dport(Node),
+ Bad1 = case WhereToPutSelf of
+ 0 ->
+ Bad;
+ N when N > 0 ->
+ setelement(N,Bad,self())
+ end,
+ DData = [dmsg_hdr(),
+ dmsg_ext(Bad1)] ++
+ case PayLoad of
+ [] -> [];
+ _Other -> [dmsg_ext(PayLoad)]
+ end,
+ port_command(DPrt, DData),
+ Parent ! {DData,Done}
+ end),
+ receive
+ {WhatSent,Done} ->
+ io:format("Offender sent ~p~n",[WhatSent]),
+ ok
+ after 5000 ->
+ exit(unable_to_send)
+ end.
+
%% send_bad_msgs():
%% Send a valid distribution header and control message
@@ -1629,10 +1840,10 @@ dmsg_bad_hdr() ->
255]. % 255 atom references
-dmsg_fake_hdr1() ->
- A = <<"fake header atom 1">>,
- [131, % Version Magic
- $D, 1, 16#8, 0, size(A), A]. % Fake header
+%% dmsg_fake_hdr1() ->
+%% A = <<"fake header atom 1">>,
+%% [131, % Version Magic
+%% $D, 1, 16#8, 0, size(A), A]. % Fake header
dmsg_fake_hdr2() ->
A1 = <<"fake header atom 1">>,
@@ -1817,7 +2028,7 @@ flush_node_changes() ->
node_monitor_loop(Master) ->
receive
- {nodeup, Node, InfoList} = Msg ->
+ {nodeup, Node, _InfoList} = Msg ->
Master ! {nodeup, node(), Node},
?t:format("~p ~p: ~p~n", [node(), erlang:now(), Msg]),
node_monitor_loop(Master);
@@ -1854,9 +2065,9 @@ verify_no_down(A, B) ->
ok
end.
-verify_down(A, B) ->
- receive {nodedown, A, B, _} -> ok end,
- receive {nodedown, B, A, _} -> ok end.
+%% verify_down(A, B) ->
+%% receive {nodedown, A, B, _} -> ok end,
+%% receive {nodedown, B, A, _} -> ok end.
verify_down(A, ReasonA, B, ReasonB) ->
receive
@@ -1876,11 +2087,11 @@ from(H, [H | T]) -> T;
from(H, [_ | T]) -> from(H, T);
from(_, []) -> [].
-fun_spawn(Fun) ->
- fun_spawn(Fun, []).
+%% fun_spawn(Fun) ->
+%% fun_spawn(Fun, []).
-fun_spawn(Fun, Args) ->
- spawn_link(erlang, apply, [Fun, Args]).
+%% fun_spawn(Fun, Args) ->
+%% spawn_link(erlang, apply, [Fun, Args]).
long_or_short() ->
diff --git a/erts/emulator/test/driver_SUITE.erl b/erts/emulator/test/driver_SUITE.erl
index 39b2ed395f..7600a44988 100644
--- a/erts/emulator/test/driver_SUITE.erl
+++ b/erts/emulator/test/driver_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -27,12 +27,12 @@
%%% - queueing
-module(driver_SUITE).
--export([all/1,
+-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,
- fin_per_testcase/2,
- end_per_suite/1,
+ end_per_testcase/2,
outputv_echo/1,
- timer/1,
+
timer_measure/1,
timer_cancel/1,
timer_change/1,
@@ -51,7 +51,7 @@
'driver_system_info_ver1.1'/1,
driver_system_info_current_ver/1,
driver_monitor/1,
- ioq_exit/1,
+
ioq_exit_ready_input/1,
ioq_exit_ready_output/1,
ioq_exit_timeout/1,
@@ -78,7 +78,7 @@
-export([bin_prefix/2]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
% First byte in communication with the timer driver
@@ -120,49 +120,51 @@ init_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
?line 0 = erts_debug:get_internal_state(check_io_debug),
[{watchdog, Dog},{testcase, Case}|Config].
-fin_per_testcase(Case, Config) ->
+end_per_testcase(Case, Config) ->
Dog = ?config(watchdog, Config),
- erlang:display({fin_per_testcase, Case}),
+ erlang:display({end_per_testcase, Case}),
?line 0 = erts_debug:get_internal_state(check_io_debug),
?t:timetrap_cancel(Dog).
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [fun_to_port, outputv_echo, queue_echo, {group, timer},
+ driver_unloaded, io_ready_exit, use_fallback_pollset,
+ bad_fd_in_pollset, driver_event, fd_change,
+ steal_control, otp_6602, 'driver_system_info_ver1.0',
+ 'driver_system_info_ver1.1',
+ driver_system_info_current_ver, driver_monitor,
+ {group, ioq_exit}, zero_extended_marker_garb_drv,
+ invalid_extended_marker_drv, larger_major_vsn_drv,
+ larger_minor_vsn_drv, smaller_major_vsn_drv,
+ smaller_minor_vsn_drv, peek_non_existing_queue,
+ otp_6879, caller, many_events, missing_callbacks,
+ smp_select, driver_select_use,
+ thread_mseg_alloc_cache_clean].
+
+groups() ->
+ [{timer, [],
+ [timer_measure, timer_cancel, timer_delay,
+ timer_change]},
+ {ioq_exit, [],
+ [ioq_exit_ready_input, ioq_exit_ready_output,
+ ioq_exit_timeout, ioq_exit_ready_async, ioq_exit_event,
+ ioq_exit_ready_input_async, ioq_exit_ready_output_async,
+ ioq_exit_timeout_async, ioq_exit_event_async]}].
+
+init_per_suite(Config) ->
+ Config.
+
end_per_suite(_Config) ->
catch erts_debug:set_internal_state(available_internal_state, false).
-all(suite) ->
- [
- fun_to_port,
- outputv_echo,
- queue_echo,
- timer,
- driver_unloaded,
- io_ready_exit,
- use_fallback_pollset,
- bad_fd_in_pollset,
- driver_event,
- fd_change,
- steal_control,
- otp_6602,
- 'driver_system_info_ver1.0',
- 'driver_system_info_ver1.1',
- driver_system_info_current_ver,
- driver_monitor,
- ioq_exit,
- zero_extended_marker_garb_drv,
- invalid_extended_marker_drv,
- larger_major_vsn_drv,
- larger_minor_vsn_drv,
- smaller_major_vsn_drv,
- smaller_minor_vsn_drv,
- peek_non_existing_queue,
- otp_6879,
- caller,
- many_events,
- missing_callbacks,
- smp_select,
- driver_select_use,
- thread_mseg_alloc_cache_clean
- ].
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
fun_to_port(doc) -> "Test sending a fun to port with an outputv-capable driver.";
fun_to_port(Config) when is_list(Config) ->
@@ -308,7 +310,6 @@ compare(Got, Expected) ->
%% Driver timer test suites
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-timer(suite) -> [timer_measure,timer_cancel,timer_delay,timer_change].
timer_measure(doc) -> ["Check that timers time out in good time."];
timer_measure(Config) when is_list(Config) ->
@@ -1299,17 +1300,6 @@ driver_monitor(Config) when is_list(Config) ->
?line stop_driver(Port, Name),
?line ok.
-ioq_exit(doc) -> [];
-ioq_exit(suite) ->
- [ioq_exit_ready_input,
- ioq_exit_ready_output,
- ioq_exit_timeout,
- ioq_exit_ready_async,
- ioq_exit_event,
- ioq_exit_ready_input_async,
- ioq_exit_ready_output_async,
- ioq_exit_timeout_async,
- ioq_exit_event_async].
-define(IOQ_EXIT_READY_INPUT, 1).
-define(IOQ_EXIT_READY_OUTPUT, 2).
@@ -1682,7 +1672,7 @@ smp_select0(Config) ->
ProcFun = fun()-> io:format("Worker ~p starting\n",[self()]),
?line Port = open_port({spawn, DrvName}, []),
smp_select_loop(Port, 100000),
- sleep(500), % wait for driver to handle pending events
+ sleep(1000), % wait for driver to handle pending events
?line true = erlang:port_close(Port),
Master ! {ok,self()},
io:format("Worker ~p finished\n",[self()])
@@ -1790,8 +1780,8 @@ mseg_alloc_ccc() ->
mseg_alloc_ccc(erlang:system_info({allocator,mseg_alloc})).
mseg_alloc_ccc(MsegAllocInfo) ->
- ?line {value,{calls, CL}}
- = lists:keysearch(calls, 1, MsegAllocInfo),
+ ?line {value,{memkind, MKL}} = lists:keysearch(memkind,1,MsegAllocInfo),
+ ?line {value,{calls, CL}} = lists:keysearch(calls, 1, MKL),
?line {value,{mseg_check_cache, GigaCCC, CCC}}
= lists:keysearch(mseg_check_cache, 1, CL),
?line GigaCCC*1000000000 + CCC.
@@ -1800,12 +1790,28 @@ mseg_alloc_cached_segments() ->
mseg_alloc_cached_segments(erlang:system_info({allocator,mseg_alloc})).
mseg_alloc_cached_segments(MsegAllocInfo) ->
+ MemName = case is_halfword_vm() of
+ true -> "high memory";
+ false -> "all memory"
+ end,
+ ?line [{memkind,DrvMem}]
+ = lists:filter(fun(E) -> case E of
+ {memkind, [{name, MemName} | _]} -> true;
+ _ -> false
+ end end, MsegAllocInfo),
?line {value,{status, SL}}
- = lists:keysearch(status, 1, MsegAllocInfo),
+ = lists:keysearch(status, 1, DrvMem),
?line {value,{cached_segments, CS}}
= lists:keysearch(cached_segments, 1, SL),
?line CS.
+is_halfword_vm() ->
+ case {erlang:system_info({wordsize, internal}),
+ erlang:system_info({wordsize, external})} of
+ {4, 8} -> true;
+ {WS, WS} -> false
+ end.
+
driver_alloc_sbct() ->
{_, _, _, As} = erlang:system_info(allocator),
case lists:keysearch(driver_alloc, 1, As) of
diff --git a/erts/emulator/test/driver_SUITE_data/chkio_drv.c b/erts/emulator/test/driver_SUITE_data/chkio_drv.c
index b571cb30e6..bbdb09cfcb 100644
--- a/erts/emulator/test/driver_SUITE_data/chkio_drv.c
+++ b/erts/emulator/test/driver_SUITE_data/chkio_drv.c
@@ -102,6 +102,7 @@ typedef struct chkio_smp_select {
int write_fd;
int next_read;
int next_write;
+ int first_write;
enum {Closed, Opened, Selected, Waiting} state;
int wasSelected;
unsigned rand_state;
@@ -577,9 +578,16 @@ chkio_drv_ready_input(ErlDrvData drv_data, ErlDrvEvent event)
inPipe = (pip->next_write - pip->next_read);
if (inPipe == 0) {
bytes = read(pip->read_fd, &word, sizeof(word));
- printf("Unexpected empty pipe, expected %u -> %u, bytes=%d, word=%d\n",
- pip->next_read, pip->next_write-1, bytes, word);
- abort();
+ printf("Unexpected empty pipe, expected %u -> %u, bytes=%d, word=%d, written=%d\n",
+ pip->next_read, pip->next_write-1, bytes, word,
+ (pip->next_write - pip->first_write));
+ /*abort();
+ Allow unexpected events as it's been seen to be triggered by epoll
+ on Linux. Most of the time the unwanted events are filtered by
+ the erl_check_io layer. But when fd's are reused the events may
+ slip up to the driver.
+ */
+ break;
}
n = rand_r(&pip->rand_state) % (inPipe*4);
@@ -1252,6 +1260,7 @@ chkio_drv_control(ErlDrvData drv_data,
pip->state = Opened;
pip->wasSelected = 0;
pip->next_write = pip->next_read = rand_r(&pip->rand_state) % 1024;
+ pip->first_write = pip->next_write;
if (op & 1) break;
op >>= 1;
}/*fall through*/
diff --git a/erts/emulator/test/efile_SUITE.erl b/erts/emulator/test/efile_SUITE.erl
index 1d66b6ef70..9ac004200e 100644
--- a/erts/emulator/test/efile_SUITE.erl
+++ b/erts/emulator/test/efile_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -17,12 +17,32 @@
%% %CopyrightEnd%
-module(efile_SUITE).
--export([all/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([iter_max_files/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [iter_max_files].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) -> [iter_max_files].
%%
%% Open as many files as possible. Do this several times and check
diff --git a/erts/emulator/test/emulator.spec b/erts/emulator/test/emulator.spec
index ed5bd48e84..1ea751cc3b 100644
--- a/erts/emulator/test/emulator.spec
+++ b/erts/emulator/test/emulator.spec
@@ -1 +1 @@
-{topcase, {dir, "../emulator_test"}}.
+{suites,"../emulator_test",all}.
diff --git a/erts/emulator/test/erl_drv_thread_SUITE.erl b/erts/emulator/test/erl_drv_thread_SUITE.erl
index ea618e9feb..84a82cced0 100644
--- a/erts/emulator/test/erl_drv_thread_SUITE.erl
+++ b/erts/emulator/test/erl_drv_thread_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -19,18 +19,36 @@
-module(erl_drv_thread_SUITE).
-author('[email protected]').
--export([all/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([basic/1, rwlock/1, tsd/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(DEFAULT_TIMETRAP_SECS, 240).
-all(doc) -> [];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[basic, rwlock, tsd].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% %%
%% Testcases %%
diff --git a/erts/emulator/test/erl_link_SUITE.erl b/erts/emulator/test/erl_link_SUITE.erl
index 542c8dffbe..435c0872e6 100644
--- a/erts/emulator/test/erl_link_SUITE.erl
+++ b/erts/emulator/test/erl_link_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -28,9 +28,10 @@
-author('[email protected]').
%-define(line_trace, 1).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
% Test cases
-export([links/1,
@@ -46,7 +47,7 @@
otp_5772_dist_monitor/1,
otp_7946/1]).
--export([init_per_testcase/2, fin_per_testcase/2, end_per_suite/1]).
+-export([init_per_testcase/2, end_per_testcase/2]).
% Internal exports
-export([test_proc/0]).
@@ -77,11 +78,29 @@
-all(suite) -> [links, dist_links, monitor_nodes, process_monitors,
- dist_process_monitors, busy_dist_port_monitor,
- busy_dist_port_link, otp_5772_link, otp_5772_dist_link,
- otp_5772_monitor, otp_5772_dist_monitor,
- otp_7946].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [links, dist_links, monitor_nodes, process_monitors,
+ dist_process_monitors, busy_dist_port_monitor,
+ busy_dist_port_link, otp_5772_link, otp_5772_dist_link,
+ otp_5772_monitor, otp_5772_dist_monitor, otp_7946].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ catch erts_debug:set_internal_state(available_internal_state, false).
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
links(doc) -> ["Tests node local links"];
links(suite) -> [];
@@ -678,13 +697,10 @@ init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
end,
?line [{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
?line Dog = ?config(watchdog, Config),
?line ?t:timetrap_cancel(Dog).
-end_per_suite(_Config) ->
- catch erts_debug:set_internal_state(available_internal_state, false).
-
tp_call(Tp, Fun) ->
?line R = make_ref(),
?line Tp ! {call, self(), R, Fun},
@@ -1050,7 +1066,6 @@ stop_node(Node) ->
-define(DOP_SEND, 2).
-define(DOP_EXIT, 3).
-define(DOP_UNLINK, 4).
--define(DOP_NODE_LINK, 5).
-define(DOP_REG_SEND, 6).
-define(DOP_GROUP_LEADER, 7).
-define(DOP_EXIT2, 8).
diff --git a/erts/emulator/test/erts_debug_SUITE.erl b/erts/emulator/test/erts_debug_SUITE.erl
index e60a999df1..4dc2fbaae2 100644
--- a/erts/emulator/test/erts_debug_SUITE.erl
+++ b/erts/emulator/test/erts_debug_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -18,19 +18,40 @@
%%
-module(erts_debug_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
- flat_size/1,flat_size_big/1,df/1]).
+-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,
+ flat_size/1,flat_size_big/1,df/1,
+ instructions/1]).
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [flat_size, flat_size_big, df, instructions].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [flat_size,flat_size_big,df].
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog=?t:timetrap(?t:minutes(2)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog).
@@ -70,3 +91,8 @@ df(Config) when is_list(Config) ->
pps() ->
{erlang:ports()}.
+
+instructions(Config) when is_list(Config) ->
+ ?line Is = erts_debug:instructions(),
+ ?line _ = [list_to_atom(I) || I <- Is],
+ ok.
diff --git a/erts/emulator/test/estone_SUITE.erl b/erts/emulator/test/estone_SUITE.erl
index 7fb92faf0d..2417d4bcfe 100644
--- a/erts/emulator/test/estone_SUITE.erl
+++ b/erts/emulator/test/estone_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
@@ -18,8 +18,9 @@
-module(estone_SUITE).
%% Test functions
--export([all/1,estone/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,estone/1]).
+-export([init_per_testcase/2, end_per_testcase/2]).
%% Internal exports for EStone tests
-export([lists/1,
@@ -30,7 +31,7 @@
trav/1,
port_io/1,
large_dataset_work/1,
- large_local_dataset_work/1,mk_big_procs/1,big_proc/0,
+ large_local_dataset_work/1,mk_big_procs/1,big_proc/0, very_big/1,
alloc/1,
bif_dispatch/1,
binary_h/1,echo/1,
@@ -44,7 +45,7 @@
run_micro/3,p1/1,ppp/3,macro/2,micros/0]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% Test suite defines
-define(default_timeout, ?t:minutes(10)).
@@ -68,12 +69,31 @@
init_per_testcase(_Case, Config) ->
?line Dog=test_server:timetrap(?default_timeout),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-all(suite) -> [estone].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [estone].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
estone(suite) ->
[];
diff --git a/erts/emulator/test/evil_SUITE.erl b/erts/emulator/test/evil_SUITE.erl
index a8288584f4..f982b9d4ff 100644
--- a/erts/emulator/test/evil_SUITE.erl
+++ b/erts/emulator/test/evil_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
@@ -18,7 +18,9 @@
-module(evil_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
heap_frag/1,
encode_decode_ext/1,
decode_integer_ext/1,
@@ -30,26 +32,37 @@
decode_pos_neg_zero/1
]).
--include("test_server.hrl").
-
-all(suite) ->
- [
- heap_frag,
- encode_decode_ext,
- decode_integer_ext,
- decode_small_big_ext,
- decode_large_big_ext,
- decode_small_big_ext_neg,
- decode_large_big_ext_neg,
- decode_too_small,
- decode_pos_neg_zero
- ].
+-include_lib("test_server/include/test_server.hrl").
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [heap_frag, encode_decode_ext, decode_integer_ext,
+ decode_small_big_ext, decode_large_big_ext,
+ decode_small_big_ext_neg, decode_large_big_ext_neg,
+ decode_too_small, decode_pos_neg_zero].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Case, Config) ->
?line Dog = test_server:timetrap(?t:minutes(0.5)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/erts/emulator/test/exception_SUITE.erl b/erts/emulator/test/exception_SUITE.erl
index f1e6e004ad..9d6fc9521d 100644
--- a/erts/emulator/test/exception_SUITE.erl
+++ b/erts/emulator/test/exception_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -19,20 +19,40 @@
-module(exception_SUITE).
--export([all/1, badmatch/1, pending_errors/1, nil_arith/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ badmatch/1, pending_errors/1, nil_arith/1,
stacktrace/1, nested_stacktrace/1, raise/1, gunilla/1, per/1,
exception_with_heap_frag/1]).
-export([bad_guy/2]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-import(lists, [foreach/2]).
-all(suite) ->
- [badmatch, pending_errors, nil_arith,
- stacktrace, nested_stacktrace, raise, gunilla, per,
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [badmatch, pending_errors, nil_arith, stacktrace,
+ nested_stacktrace, raise, gunilla, per,
exception_with_heap_frag].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
-define(try_match(E),
catch ?MODULE:bar(),
{'EXIT', {{badmatch, nomatch}, _}} = (catch E = id(nomatch))).
@@ -255,7 +275,16 @@ stacktrace(Conf) when is_list(Conf) ->
?line [{?MODULE,stacktrace_1,3}|_] = erase(stacktrace1),
?line St4 = erase(stacktrace2),
?line St4 = erlang:get_stacktrace(),
- ok.
+
+ try
+ ?line stacktrace_2()
+ catch
+ error:{badmatch,_} ->
+ [{?MODULE,stacktrace_2,0},
+ {?MODULE,stacktrace,1}|_] =
+ erlang:get_stacktrace(),
+ ok
+ end.
stacktrace_1(X, C1, Y) ->
erase(stacktrace1),
@@ -275,6 +304,9 @@ stacktrace_1(X, C1, Y) ->
put(stacktrace2, erlang:get_stacktrace())
end.
+stacktrace_2() ->
+ ok = erlang:process_info(self(), current_function),
+ ok.
nested_stacktrace(Conf) when is_list(Conf) ->
diff --git a/erts/emulator/test/float_SUITE.erl b/erts/emulator/test/float_SUITE.erl
index 99e9457985..736510339f 100644
--- a/erts/emulator/test/float_SUITE.erl
+++ b/erts/emulator/test/float_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -19,9 +19,11 @@
-module(float_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
fpe/1,fp_drv/1,fp_drv_thread/1,denormalized/1,match/1,
bad_float_unpack/1]).
-export([otp_7178/1]).
@@ -31,18 +33,31 @@ init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog = ?t:timetrap(?t:minutes(3)),
[{watchdog, Dog},{testcase,Func}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog).
-all(suite) ->
- [fpe,
- fp_drv,
- fp_drv_thread,
- otp_7178,
- denormalized,
- match,
- bad_float_unpack].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [fpe, fp_drv, fp_drv_thread, otp_7178, denormalized,
+ match, bad_float_unpack].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%
%% OTP-7178, list_to_float on very small numbers should give 0.0
diff --git a/erts/emulator/test/fun_SUITE.erl b/erts/emulator/test/fun_SUITE.erl
index a7889dfe90..7795efe57e 100644
--- a/erts/emulator/test/fun_SUITE.erl
+++ b/erts/emulator/test/fun_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -22,7 +22,9 @@
-define(default_timeout, ?t:minutes(1)).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
bad_apply/1,bad_fun_call/1,badarity/1,ext_badarity/1,
equality/1,ordering/1,
fun_to_port/1,t_hash/1,t_phash/1,t_phash2/1,md5/1,
@@ -32,19 +34,37 @@
-export([nothing/0]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [bad_apply, bad_fun_call, badarity, ext_badarity,
+ equality, ordering, fun_to_port, t_hash, t_phash,
+ t_phash2, md5, refc, refc_ets, refc_dist,
+ const_propagation, t_arity, t_is_function2, t_fun_info].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [bad_apply,bad_fun_call,badarity,ext_badarity,equality,ordering,
- fun_to_port,t_hash,t_phash,t_phash2,md5,
- refc,refc_ets,refc_dist,const_propagation,
- t_arity,t_is_function2,t_fun_info].
init_per_testcase(_Case, Config) ->
?line Dog = test_server:timetrap(?default_timeout),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/erts/emulator/test/fun_r12_SUITE.erl b/erts/emulator/test/fun_r12_SUITE.erl
index 9262731dcb..3b1dfc9825 100644
--- a/erts/emulator/test/fun_r12_SUITE.erl
+++ b/erts/emulator/test/fun_r12_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -20,18 +20,39 @@
-module(fun_r12_SUITE).
-compile(r12).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,dist_old_release/1]).
+-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,dist_old_release/1]).
-define(default_timeout, ?t:minutes(1)).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [dist_old_release].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) -> [dist_old_release].
init_per_testcase(_Case, Config) ->
?line Dog = test_server:timetrap(?default_timeout),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/erts/emulator/test/gc_SUITE.erl b/erts/emulator/test/gc_SUITE.erl
index 066aa215b2..771d2c9a7a 100644
--- a/erts/emulator/test/gc_SUITE.erl
+++ b/erts/emulator/test/gc_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -21,15 +21,34 @@
-module(gc_SUITE).
--include("test_server.hrl").
--export([all/1]).
+-include_lib("test_server/include/test_server.hrl").
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
-define(default_timeout, ?t:minutes(10)).
-export([grow_heap/1, grow_stack/1, grow_stack_heap/1]).
-all(suite) ->
- [grow_heap,grow_stack, grow_stack_heap].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [grow_heap, grow_stack, grow_stack_heap].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
grow_heap(doc) -> ["Produce a growing list of elements, ",
"for X calls, then drop one item per call",
diff --git a/erts/emulator/test/guard_SUITE.erl b/erts/emulator/test/guard_SUITE.erl
index 8fef36dfaf..f41324c2cc 100644
--- a/erts/emulator/test/guard_SUITE.erl
+++ b/erts/emulator/test/guard_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -19,16 +19,37 @@
-module(guard_SUITE).
--export([all/1, bad_arith/1, bad_tuple/1, test_heap_guards/1, guard_bifs/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, bad_arith/1, bad_tuple/1,
+ test_heap_guards/1, guard_bifs/1,
type_tests/1,guard_bif_binary_part/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-export([init/3]).
-import(lists, [member/2]).
-all(suite) -> [bad_arith, bad_tuple, test_heap_guards, guard_bifs,
- type_tests, guard_bif_binary_part].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [bad_arith, bad_tuple, test_heap_guards, guard_bifs,
+ type_tests, guard_bif_binary_part].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
bad_arith(doc) -> "Test that a bad arithmetic operation in a guard works correctly.";
bad_arith(Config) when is_list(Config) ->
diff --git a/erts/emulator/test/hash_SUITE.erl b/erts/emulator/test/hash_SUITE.erl
index f5d1871bfb..830ed91da9 100644
--- a/erts/emulator/test/hash_SUITE.erl
+++ b/erts/emulator/test/hash_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -49,7 +49,7 @@
-define(config(A,B),config(A,B)).
-export([config/2]).
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-endif.
-ifdef(debug).
@@ -69,22 +69,40 @@ config(priv_dir,_) ->
".".
-else.
%% When run in test server.
--export([all/1,test_basic/1,test_cmp/1,test_range/1,test_spread/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ test_basic/1,test_cmp/1,test_range/1,test_spread/1,
test_phash2/1,otp_5292/1,bit_level_binaries/1,otp_7127/1,
- fin_per_testcase/2,init_per_testcase/2]).
+ end_per_testcase/2,init_per_testcase/2]).
init_per_testcase(_Case, Config) ->
?line Dog=test_server:timetrap(test_server:minutes(10)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-all(doc) ->
- ["Test erlang:phash"];
-all(suite) ->
- [test_basic, test_cmp, test_range, test_spread, test_phash2, otp_5292,
- bit_level_binaries, otp_7127].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [test_basic, test_cmp, test_range, test_spread,
+ test_phash2, otp_5292, bit_level_binaries, otp_7127].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
test_basic(suite) ->
[];
diff --git a/erts/emulator/test/hibernate_SUITE.erl b/erts/emulator/test/hibernate_SUITE.erl
index 4d36076d12..203fa6b48e 100644
--- a/erts/emulator/test/hibernate_SUITE.erl
+++ b/erts/emulator/test/hibernate_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -19,23 +19,44 @@
-module(hibernate_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
- basic/1,min_heap_size/1,bad_args/1,
+-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,
+ basic/1,dynamic_call/1,min_heap_size/1,bad_args/1,
messages_in_queue/1,undefined_mfa/1, no_heap/1]).
%% Used by test cases.
--export([basic_hibernator/1,messages_in_queue_restart/2, no_heap_loop/0]).
+-export([basic_hibernator/1,dynamic_call_hibernator/2,messages_in_queue_restart/2, no_heap_loop/0]).
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [basic, dynamic_call, min_heap_size, bad_args, messages_in_queue,
+ undefined_mfa, no_heap].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [basic,min_heap_size,bad_args,messages_in_queue,undefined_mfa,no_heap].
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog = ?t:timetrap(?t:minutes(3)),
[{watchdog,Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog).
@@ -138,10 +159,47 @@ whats_up_calc(A1, A2, A3, A4, A5, A6, A7, A8, A9, Acc) ->
whats_up_calc(A1-1, A2+1, A3+2, A4+3, A5+4, A6+5, A7+6, A8+7, A9+8, [A1,A2|Acc]).
%%%
+%%% Testing a call to erlang:hibernate/3 that the compiler and loader do not
+%%% translate to an instruction.
+%%%
+
+dynamic_call(Config) when is_list(Config) ->
+ Ref = make_ref(),
+ Info = {self(),Ref},
+ ExpectedHeapSz = case erlang:system_info(heap_type) of
+ private -> erts_debug:size([Info]);
+ hybrid -> erts_debug:size([a|b])
+ end,
+ ?line Child = spawn_link(fun() -> ?MODULE:dynamic_call_hibernator(Info, hibernate) end),
+ ?line hibernate_wake_up(100, ExpectedHeapSz, Child),
+ ?line Child ! please_quit_now,
+ ok.
+
+dynamic_call_hibernator(Info, Function) ->
+ {catchlevel,0} = process_info(self(), catchlevel),
+ receive
+ Any ->
+ dynamic_call_hibernator_msg(Any, Function, Info),
+ dynamic_call_hibernator(Info, Function)
+ end.
+
+dynamic_call_hibernator_msg({hibernate,_}, Function, Info) ->
+ catch apply(erlang, Function, [?MODULE, basic_hibernator, [Info]]),
+ exit(hibernate_returned);
+dynamic_call_hibernator_msg(Msg, _Function, Info) ->
+ basic_hibernator_msg(Msg, Info).
+
+%%%
%%% Testing setting the minimum heap size.
%%%
min_heap_size(Config) when is_list(Config) ->
+ case test_server:is_native(?MODULE) of
+ true -> {skip, "Test case relies on trace which is not available in HiPE"};
+ false -> min_heap_size_1(Config)
+ end.
+
+min_heap_size_1(Config) when is_list(Config) ->
?line erlang:trace(new, true, [call]),
MFA = {?MODULE,min_hibernator,1},
?line 1 = erlang:trace_pattern(MFA, true, [local]),
diff --git a/erts/emulator/test/ignore_cores.erl b/erts/emulator/test/ignore_cores.erl
index 1d738cbafd..8b1ac0fe6c 120000..100644
--- a/erts/emulator/test/ignore_cores.erl
+++ b/erts/emulator/test/ignore_cores.erl
@@ -1 +1,158 @@
-../../test/ignore_cores.erl \ No newline at end of file
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2008-2010. 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%
+%%
+
+%%%-------------------------------------------------------------------
+%%% File : ignore_cores.erl
+%%% Author : Rickard Green <[email protected]>
+%%% Description :
+%%%
+%%% Created : 11 Feb 2008 by Rickard Green <[email protected]>
+%%%-------------------------------------------------------------------
+
+-module(ignore_cores).
+
+-include_lib("test_server/include/test_server.hrl").
+
+-export([init/1, fini/1, setup/3, setup/4, restore/1, dir/1]).
+
+-record(ignore_cores, {org_cwd,
+ org_path,
+ org_pwd_env,
+ ign_dir = false,
+ cores_dir = false}).
+
+%%
+%% Takes a testcase config
+%%
+
+init(Config) ->
+ {ok, OrgCWD} = file:get_cwd(),
+ [{ignore_cores,
+ #ignore_cores{org_cwd = OrgCWD,
+ org_path = code:get_path(),
+ org_pwd_env = os:getenv("PWD")}}
+ | lists:keydelete(ignore_cores, 1, Config)].
+
+fini(Config) ->
+ #ignore_cores{org_cwd = OrgCWD,
+ org_path = OrgPath,
+ org_pwd_env = OrgPWD} = ?config(ignore_cores, Config),
+ ok = file:set_cwd(OrgCWD),
+ true = code:set_path(OrgPath),
+ case OrgPWD of
+ false -> ok;
+ _ -> true = os:putenv("PWD", OrgPWD)
+ end,
+ lists:keydelete(ignore_cores, 1, Config).
+
+setup(Suite, Testcase, Config) ->
+ setup(Suite, Testcase, Config, false).
+
+setup(Suite, Testcase, Config, SetCwd) when is_atom(Suite),
+ is_atom(Testcase),
+ is_list(Config) ->
+ #ignore_cores{org_cwd = OrgCWD,
+ org_path = OrgPath,
+ org_pwd_env = OrgPWD} = ?config(ignore_cores, Config),
+ Path = lists:map(fun (".") -> OrgCWD; (Dir) -> Dir end, OrgPath),
+ true = code:set_path(Path),
+ PrivDir = ?config(priv_dir, Config),
+ IgnDir = filename:join([PrivDir,
+ atom_to_list(Suite)
+ ++ "_"
+ ++ atom_to_list(Testcase)
+ ++ "_wd"]),
+ ok = file:make_dir(IgnDir),
+ case SetCwd of
+ false ->
+ ok;
+ _ ->
+ ok = file:set_cwd(IgnDir),
+ OrgPWD = case os:getenv("PWD") of
+ false -> false;
+ PWD ->
+ os:putenv("PWD", IgnDir),
+ PWD
+ end
+ end,
+ ok = file:write_file(filename:join([IgnDir, "ignore_core_files"]), <<>>),
+ %% cores are dumped in /cores on MacOS X
+ CoresDir = case {?t:os_type(), filelib:is_dir("/cores")} of
+ {{unix,darwin}, true} ->
+ filelib:fold_files("/cores",
+ "^core.*$",
+ false,
+ fun (C,Cs) -> [C|Cs] end,
+ []);
+ _ ->
+ false
+ end,
+ lists:keyreplace(ignore_cores,
+ 1,
+ Config,
+ {ignore_cores,
+ #ignore_cores{org_cwd = OrgCWD,
+ org_path = OrgPath,
+ org_pwd_env = OrgPWD,
+ ign_dir = IgnDir,
+ cores_dir = CoresDir}}).
+
+restore(Config) ->
+ #ignore_cores{org_cwd = OrgCWD,
+ org_path = OrgPath,
+ org_pwd_env = OrgPWD,
+ ign_dir = IgnDir,
+ cores_dir = CoresDir} = ?config(ignore_cores, Config),
+ try
+ case CoresDir of
+ false ->
+ ok;
+ _ ->
+ %% Move cores dumped by these testcases in /cores
+ %% to cwd.
+ lists:foreach(fun (C) ->
+ case lists:member(C, CoresDir) of
+ true -> ok;
+ _ ->
+ Dst = filename:join(
+ [IgnDir,
+ filename:basename(C)]),
+ {ok, _} = file:copy(C, Dst),
+ file:delete(C)
+ end
+ end,
+ filelib:fold_files("/cores",
+ "^core.*$",
+ false,
+ fun (C,Cs) -> [C|Cs] end,
+ []))
+ end
+ after
+ catch file:set_cwd(OrgCWD),
+ catch code:set_path(OrgPath),
+ case OrgPWD of
+ false -> ok;
+ _ -> catch os:putenv("PWD", OrgPWD)
+ end
+ end.
+
+
+dir(Config) ->
+ #ignore_cores{ign_dir = Dir} = ?config(ignore_cores, Config),
+ Dir.
diff --git a/erts/emulator/test/list_bif_SUITE.erl b/erts/emulator/test/list_bif_SUITE.erl
index 65ea88eb2f..45a44d8b43 100644
--- a/erts/emulator/test/list_bif_SUITE.erl
+++ b/erts/emulator/test/list_bif_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -18,21 +18,42 @@
%%
-module(list_bif_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,init_per_testcase/2,fin_per_testcase/2]).
+-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([hd_test/1,tl_test/1,t_length/1,t_list_to_pid/1,
t_list_to_float/1,t_list_to_integer/1]).
-all(suite) ->
- [hd_test,tl_test,t_length,t_list_to_pid,t_list_to_float,t_list_to_integer].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [hd_test, tl_test, t_length, t_list_to_pid,
+ t_list_to_float, t_list_to_integer].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Case, Config) ->
?line Dog = test_server:timetrap(test_server:seconds(60)),
[{watchdog,Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/erts/emulator/test/long_timers_test.erl b/erts/emulator/test/long_timers_test.erl
index 28626d26fb..28a4fba9f6 100644
--- a/erts/emulator/test/long_timers_test.erl
+++ b/erts/emulator/test/long_timers_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2010. 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
diff --git a/erts/emulator/test/match_spec_SUITE.erl b/erts/emulator/test/match_spec_SUITE.erl
index 69c89f5d2d..2b21fa58f4 100644
--- a/erts/emulator/test/match_spec_SUITE.erl
+++ b/erts/emulator/test/match_spec_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -19,7 +19,8 @@
-module(match_spec_SUITE).
--export([all/1, not_run/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, not_run/1]).
-export([test_1/1, test_2/1, test_3/1, bad_match_spec_bin/1,
trace_control_word/1, silent/1, silent_no_ms/1,
ms_trace2/1, ms_trace3/1, boxed_and_small/1,
@@ -34,29 +35,48 @@
% This test suite assumes that tracing in general works. What we test is
% the match spec functionality.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog=?t:timetrap(?t:seconds(10)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog).
-all(suite) ->
- case test_server:is_native(?MODULE) of
- false -> [test_1, test_2, test_3, bad_match_spec_bin,
- trace_control_word, silent, silent_no_ms,
- ms_trace2, ms_trace3, boxed_and_small,
- destructive_in_test_bif, guard_exceptions,
- unary_plus, unary_minus, fpe, moving_labels];
- true -> [not_run]
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ case test_server:is_native(match_spec_SUITE) of
+ false ->
+ [test_1, test_2, test_3, bad_match_spec_bin,
+ trace_control_word, silent, silent_no_ms, ms_trace2,
+ ms_trace3, boxed_and_small, destructive_in_test_bif,
+ guard_exceptions, unary_plus, unary_minus, fpe,
+ moving_labels];
+ true -> [not_run]
end.
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
not_run(Config) when is_list(Config) ->
{skipped, "Native Code"}.
@@ -345,15 +365,15 @@ silent_no_ms(Config) when is_list(Config) ->
fun () ->
?MODULE:f1(a),
?MODULE:f2(b, c),
- erlang:integer_to_list(id(1)),
+ _ = erlang:integer_to_list(id(1)),
?MODULE:f3(d, e),
?MODULE:f1(start),
?MODULE:f2(f, g),
- erlang:integer_to_list(id(2)),
+ _ = erlang:integer_to_list(id(2)),
?MODULE:f3(h, i),
?MODULE:f1(stop),
?MODULE:f2(j, k),
- erlang:integer_to_list(id(3)),
+ _ = erlang:integer_to_list(id(3)),
?MODULE:f3(l, m)
end,
fun (Tracee) ->
@@ -393,15 +413,15 @@ silent_no_ms(Config) when is_list(Config) ->
fun () ->
?MODULE:f1(a),
?MODULE:f2(b, c),
- erlang:integer_to_list(id(1)),
+ _ = erlang:integer_to_list(id(1)),
?MODULE:f3(d, e),
?MODULE:f1(start),
?MODULE:f2(f, g),
- erlang:integer_to_list(id(2)),
+ _ = erlang:integer_to_list(id(2)),
?MODULE:f3(h, i),
?MODULE:f1(stop),
?MODULE:f2(j, k),
- erlang:integer_to_list(id(3)),
+ _ = erlang:integer_to_list(id(3)),
?MODULE:f3(l, m)
end,
fun (Tracee) ->
@@ -455,18 +475,18 @@ ms_trace2(Config) when is_list(Config) ->
fun () ->
?MODULE:f1(a),
?MODULE:f2(b, c),
- erlang:integer_to_list(id(1)),
+ _ = erlang:integer_to_list(id(1)),
?MODULE:f3(d, e),
fn([all], [call,return_to,{tracer,Tracer}]),
?MODULE:f1(f),
f2(g, h),
f1(i),
- erlang:integer_to_list(id(2)),
+ _ = erlang:integer_to_list(id(2)),
?MODULE:f3(j, k),
fn([call,return_to], []),
?MODULE:f1(l),
?MODULE:f2(m, n),
- erlang:integer_to_list(id(3)),
+ _ = erlang:integer_to_list(id(3)),
?MODULE:f3(o, p)
end,
fun (Tracee) ->
@@ -551,26 +571,26 @@ ms_trace3(Config) when is_list(Config) ->
register(TraceeName, self()),
?MODULE:f1(a),
?MODULE:f2(b, c),
- erlang:integer_to_list(id(1)),
+ _ = erlang:integer_to_list(id(1)),
?MODULE:f3(d, e),
Controller ! {self(),Tag,start},
receive {Controller,Tag,started} -> ok end,
?MODULE:f1(f),
f2(g, h),
f1(i),
- erlang:integer_to_list(id(2)),
+ _ = erlang:integer_to_list(id(2)),
?MODULE:f3(j, k),
Controller ! {self(),Tag,stop_1},
receive {Controller,Tag,stopped_1} -> ok end,
?MODULE:f1(l),
?MODULE:f2(m, n),
- erlang:integer_to_list(id(3)),
+ _ = erlang:integer_to_list(id(3)),
?MODULE:f3(o, p),
Controller ! {self(),Tag,stop_2},
receive {Controller,Tag,stopped_2} -> ok end,
?MODULE:f1(q),
?MODULE:f2(r, s),
- erlang:integer_to_list(id(4)),
+ _ = erlang:integer_to_list(id(4)),
?MODULE:f3(t, u)
end,
diff --git a/erts/emulator/test/module_info_SUITE.erl b/erts/emulator/test/module_info_SUITE.erl
index f34a2b496c..8a63d9fe3e 100644
--- a/erts/emulator/test/module_info_SUITE.erl
+++ b/erts/emulator/test/module_info_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -19,9 +19,11 @@
-module(module_info_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,init_per_testcase/2,end_per_testcase/2,
+-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,
exports/1,functions/1,native/1]).
%%-compile(native).
@@ -29,8 +31,29 @@
%% Helper.
-export([native_proj/1,native_filter/1]).
-all(suite) ->
- [exports,functions,native].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ modules().
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+modules() ->
+ [exports, functions, native].
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog = ?t:timetrap(?t:minutes(3)),
@@ -42,14 +65,18 @@ end_per_testcase(_Func, Config) ->
%% Should return all functions exported from this module. (local)
all_exported() ->
- All = add_arity(all(suite)),
- lists:sort([{all,1},{init_per_testcase,2},{end_per_testcase,2},
+ All = add_arity(modules()),
+ lists:sort([{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},
{module_info,0},{module_info,1},{native_proj,1},
{native_filter,1}|All]).
%% Should return all functions in this module. (local)
all_functions() ->
- Locals = [{add_arity,1},{add_arity,2},{all_exported,0},{all_functions,0}],
+ Locals = [{add_arity,1},{add_arity,2},{all_exported,0},{all_functions,0},
+ {modules,0}],
lists:sort(Locals++all_exported()).
%% Test that the list of exported functions from this module is correct.
diff --git a/erts/emulator/test/monitor_SUITE.erl b/erts/emulator/test/monitor_SUITE.erl
index 68e378dfec..aec59867d8 100644
--- a/erts/emulator/test/monitor_SUITE.erl
+++ b/erts/emulator/test/monitor_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -19,29 +19,49 @@
-module(monitor_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
case_1/1, case_1a/1, case_2/1, case_2a/1, mon_e_1/1, demon_e_1/1, demon_1/1,
- demon_2/1, demon_3/1, demonitor_flush/1, remove_monitor/1,
+ demon_2/1, demon_3/1, demonitor_flush/1,
local_remove_monitor/1, remote_remove_monitor/1, mon_1/1, mon_2/1,
large_exit/1, list_cleanup/1, mixer/1, named_down/1, otp_5827/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
-export([y2/1, g/1, g0/0, g1/0, large_exit_sub/1]).
-all(suite) ->
- [case_1, case_1a, case_2, case_2a, mon_e_1, demon_e_1, demon_1, mon_1,
- mon_2, demon_2, demon_3, demonitor_flush, remove_monitor,
- large_exit, list_cleanup, mixer, named_down,
- otp_5827].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [case_1, case_1a, case_2, case_2a, mon_e_1, demon_e_1,
+ demon_1, mon_1, mon_2, demon_2, demon_3,
+ demonitor_flush, {group, remove_monitor}, large_exit,
+ list_cleanup, mixer, named_down, otp_5827].
+
+groups() ->
+ [{remove_monitor, [],
+ [local_remove_monitor, remote_remove_monitor]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog=?t:timetrap(?t:minutes(15)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog).
@@ -315,8 +335,6 @@ demonitor_flush_test(Node) ->
-define(RM_MON_GROUPS, 100).
-define(RM_MON_GPROCS, 100).
-remove_monitor(suite) ->
- [local_remove_monitor, remote_remove_monitor].
local_remove_monitor(Config) when is_list(Config) ->
Gs = generate(fun () -> start_remove_monitor_group(node()) end,
diff --git a/erts/emulator/test/mtx_SUITE.erl b/erts/emulator/test/mtx_SUITE.erl
index ae77fe4d89..e0a7878bd8 100644
--- a/erts/emulator/test/mtx_SUITE.erl
+++ b/erts/emulator/test/mtx_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2011. 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
@@ -26,9 +26,11 @@
%%-define(line_trace,true).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
--export([all/1, init_per_suite/1, end_per_suite/1, init_per_testcase/2, fin_per_testcase/2]).
+-export([all/0,suite/0,groups/0,
+ init_per_group/2,end_per_group/2, init_per_suite/1,
+ end_per_suite/1, init_per_testcase/2, end_per_testcase/2]).
-export([long_rwlock/1,
hammer_ets_rwlock/1,
@@ -66,19 +68,16 @@ init_per_testcase(_Case, Config) ->
Dog = ?t:timetrap(?t:minutes(15)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog).
-all(suite) ->
- [
- long_rwlock,
- hammer_rwlock_check,
- hammer_rwlock,
- hammer_tryrwlock_check,
- hammer_tryrwlock,
- hammer_ets_rwlock,
- hammer_sched_long_rwlock_check,
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [long_rwlock, hammer_rwlock_check, hammer_rwlock,
+ hammer_tryrwlock_check, hammer_tryrwlock,
+ hammer_ets_rwlock, hammer_sched_long_rwlock_check,
hammer_sched_long_rwlock,
hammer_sched_long_freqread_rwlock_check,
hammer_sched_long_freqread_rwlock,
@@ -86,15 +85,22 @@ all(suite) ->
hammer_sched_long_tryrwlock,
hammer_sched_long_freqread_tryrwlock_check,
hammer_sched_long_freqread_tryrwlock,
- hammer_sched_rwlock_check,
- hammer_sched_rwlock,
+ hammer_sched_rwlock_check, hammer_sched_rwlock,
hammer_sched_freqread_rwlock_check,
hammer_sched_freqread_rwlock,
- hammer_sched_tryrwlock_check,
- hammer_sched_tryrwlock,
+ hammer_sched_tryrwlock_check, hammer_sched_tryrwlock,
hammer_sched_freqread_tryrwlock_check,
- hammer_sched_freqread_tryrwlock
- ].
+ hammer_sched_freqread_tryrwlock].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
long_rwlock(Config) when is_list(Config) ->
statistics(runtime),
diff --git a/erts/emulator/test/nested_SUITE.erl b/erts/emulator/test/nested_SUITE.erl
index 310892424e..2cd67ebaae 100644
--- a/erts/emulator/test/nested_SUITE.erl
+++ b/erts/emulator/test/nested_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -19,11 +19,33 @@
-module(nested_SUITE).
--export([all/1, case_in_case/1, case_in_after/1, catch_in_catch/1, bif_in_bif/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ case_in_case/1, case_in_after/1, catch_in_catch/1, bif_in_bif/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [case_in_case, case_in_after, catch_in_catch,
+ bif_in_bif].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) -> [case_in_case, case_in_after, catch_in_catch, bif_in_bif].
case_in_case(suite) -> [];
case_in_case(Config) when is_list(Config) ->
diff --git a/erts/emulator/test/nif_SUITE.erl b/erts/emulator/test/nif_SUITE.erl
index 42947aa6be..91d695d979 100644
--- a/erts/emulator/test/nif_SUITE.erl
+++ b/erts/emulator/test/nif_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2011. 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
@@ -23,14 +23,18 @@
-define(CHECK(Exp,Got), check(Exp,Got,?LINE)).
%%-define(CHECK(Exp,Got), ?line Exp = Got).
--include("test_server.hrl").
-
--export([all/1,
- %%init_per_testcase/2,
- fin_per_testcase/2, basic/1, reload/1, upgrade/1, heap_frag/1,
- types/1, many_args/1, binaries/1, get_string/1, get_atom/1, api_macros/1,
- from_array/1, iolist_as_binary/1, resource/1, resource_binary/1, resource_takeover/1,
- threading/1, send/1, send2/1, send3/1, send_threaded/1, neg/1, is_checks/1,
+-include_lib("test_server/include/test_server.hrl").
+
+-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, basic/1, reload/1, upgrade/1, heap_frag/1,
+ types/1, many_args/1, binaries/1, get_string/1, get_atom/1,
+ api_macros/1,
+ from_array/1, iolist_as_binary/1, resource/1, resource_binary/1,
+ resource_takeover/1,
+ threading/1, send/1, send2/1, send3/1, send_threaded/1, neg/1,
+ is_checks/1,
get_length/1, make_atom/1, make_string/1]).
-export([many_args_100/100]).
@@ -40,7 +44,7 @@
%% list_seq/1,type_test/0,tuple_2_list/1,is_identical/2,compare/2,
%% clone_bin/1,make_sub_bin/3,string_to_bin/2,atom_to_bin/2,macros/1,
%% tuple_2_list_and_tuple/1,iolist_2_bin/1,get_resource_type/1,alloc_resource/2,
-%% make_resource/1,get_resource/2,release_resource/1,last_resource_dtor_call/0,
+%% make_resource/1,get_resource/2,release_resource/1,last_resource_dtor_call/0, suite/0,
%% make_new_resource/2,make_new_resource_binary/1,send_list_seq/2,send_new_blob/2,
%% alloc_msgenv/0,clear_msgenv/1,grow_blob/2,send_blob/2,send_blob_thread/3,
%% join_send_thread/1]).
@@ -48,17 +52,37 @@
-define(nif_stub,nif_stub_error(?LINE)).
-all(suite) ->
- [basic, reload, upgrade, heap_frag, types, many_args, binaries, get_string,
- get_atom, api_macros, from_array, iolist_as_binary, resource, resource_binary,
- resource_takeover, threading, send, send2, send3, send_threaded, neg, is_checks,
- get_length, make_atom, make_string].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [basic, reload, upgrade, heap_frag, types, many_args,
+ binaries, get_string, get_atom, api_macros, from_array,
+ iolist_as_binary, resource, resource_binary,
+ resource_takeover, threading, send, send2, send3,
+ send_threaded, neg, is_checks, get_length, make_atom,
+ make_string].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-%%init_per_testcase(_Case, Config) ->
-%% ?line Dog = ?t:timetrap(?t:seconds(60*60*24)),
-%% [{watchdog, Dog}|Config].
-fin_per_testcase(_Func, _Config) ->
+init_per_testcase(_Case, Config) ->
+% ?line Dog = ?t:timetrap(?t:seconds(60*60*24)),
+ Config.
+
+end_per_testcase(_Func, _Config) ->
%%Dog = ?config(watchdog, Config),
%%?t:timetrap_cancel(Dog),
P1 = code:purge(nif_mod),
@@ -1097,7 +1121,14 @@ is_checks(Config) when is_list(Config) ->
?line ensure_lib_loaded(Config, 1),
?line ok = check_is(hejsan, <<19,98>>, make_ref(), ok, fun() -> ok end,
self(), hd(erlang:ports()), [], [1,9,9,8],
- {hejsan, "hejsan", [$h,"ejs",<<"an">>]}).
+ {hejsan, "hejsan", [$h,"ejs",<<"an">>]}),
+ try
+ ?line error = check_is_exception(),
+ ?line throw(expected_badarg)
+ catch
+ error:badarg ->
+ ?line ok
+ end.
get_length(doc) -> ["Test all enif_get_length functions"];
get_length(Config) when is_list(Config) ->
@@ -1221,6 +1252,7 @@ release_resource(_) -> ?nif_stub.
last_resource_dtor_call() -> ?nif_stub.
make_new_resource(_,_) -> ?nif_stub.
check_is(_,_,_,_,_,_,_,_,_,_) -> ?nif_stub.
+check_is_exception() -> ?nif_stub.
length_test(_,_,_,_,_) -> ?nif_stub.
make_atoms() -> ?nif_stub.
make_strings() -> ?nif_stub.
diff --git a/erts/emulator/test/nif_SUITE_data/nif_SUITE.c b/erts/emulator/test/nif_SUITE_data/nif_SUITE.c
index 8489124966..dc047394b5 100644
--- a/erts/emulator/test/nif_SUITE_data/nif_SUITE.c
+++ b/erts/emulator/test/nif_SUITE_data/nif_SUITE.c
@@ -802,6 +802,23 @@ static ERL_NIF_TERM check_is(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]
}
/*
+ * no arguments
+ *
+ * This function is separate from check_is because it calls enif_make_badarg
+ * and so it must return the badarg exception as its return value. Thus, the
+ * badarg exception indicates success. Failure is indicated by returning an
+ * error atom.
+ */
+static ERL_NIF_TERM check_is_exception(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+ ERL_NIF_TERM error_atom = enif_make_atom(env, "error");
+ ERL_NIF_TERM badarg = enif_make_badarg(env);
+ if (enif_is_exception(env, error_atom)) return error_atom;
+ if (!enif_is_exception(env, badarg)) return error_atom;
+ return badarg;
+}
+
+/*
* argv[0] atom with length of 6
* argv[1] list with length of 6
* argv[2] empty list
@@ -1383,6 +1400,7 @@ static ErlNifFunc nif_funcs[] =
{"last_resource_dtor_call", 0, last_resource_dtor_call},
{"make_new_resource", 2, make_new_resource},
{"check_is", 10, check_is},
+ {"check_is_exception", 0, check_is_exception},
{"length_test", 5, length_test},
{"make_atoms", 0, make_atoms},
{"make_strings", 0, make_strings},
diff --git a/erts/emulator/test/nif_SUITE_data/nif_mod.erl b/erts/emulator/test/nif_SUITE_data/nif_mod.erl
index 7888a589e7..6634624698 100644
--- a/erts/emulator/test/nif_SUITE_data/nif_mod.erl
+++ b/erts/emulator/test/nif_SUITE_data/nif_mod.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -19,7 +19,7 @@
-module(nif_mod).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-export([load_nif_lib/2, load_nif_lib/3, start/0, lib_version/0, call_history/0,
get_priv_data_ptr/0, make_new_resource/2, get_resource/2]).
diff --git a/erts/emulator/test/nif_SUITE_data/tester.erl b/erts/emulator/test/nif_SUITE_data/tester.erl
index 9df2158200..b393e29b82 100644
--- a/erts/emulator/test/nif_SUITE_data/tester.erl
+++ b/erts/emulator/test/nif_SUITE_data/tester.erl
@@ -1,6 +1,6 @@
-module(tester).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-export([load_nif_lib/2, run/0]).
diff --git a/erts/emulator/test/node_container_SUITE.erl b/erts/emulator/test/node_container_SUITE.erl
index f3d9eb783b..aa83459ef8 100644
--- a/erts/emulator/test/node_container_SUITE.erl
+++ b/erts/emulator/test/node_container_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
@@ -29,10 +29,12 @@
%-define(line_trace, 1).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%-compile(export_all).
--export([all/1, init_per_testcase/2, fin_per_testcase/2, 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, init_per_testcase/2,
+ end_per_testcase/2,
node_container_refc_check/1]).
-export([term_to_binary_to_term_eq/1,
@@ -55,25 +57,30 @@
-define(DEFAULT_TIMEOUT, ?t:minutes(10)).
-all(doc) -> [];
-all(suite) ->
- [term_to_binary_to_term_eq,
- round_trip_eq,
- cmp,
- ref_eq,
- node_table_gc,
- dist_link_refc,
- dist_monitor_refc,
- node_controller_refc,
- ets_refc,
- match_spec_refc,
- timer_refc,
- otp_4715,
- pid_wrap,
- port_wrap,
- bad_nc,
- unique_pid,
- iter_max_procs].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [term_to_binary_to_term_eq, round_trip_eq, cmp, ref_eq,
+ node_table_gc, dist_link_refc, dist_monitor_refc,
+ node_controller_refc, ets_refc, match_spec_refc,
+ timer_refc, otp_4715, pid_wrap, port_wrap, bad_nc,
+ unique_pid, iter_max_procs].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ available_internal_state(false).
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
available_internal_state(Bool) when Bool == true; Bool == false ->
case {Bool,
@@ -95,14 +102,11 @@ init_per_testcase(_Case, Config) when is_list(Config) ->
available_internal_state(true),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) when is_list(Config) ->
+end_per_testcase(_Case, Config) when is_list(Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-end_per_suite(_Config) ->
- available_internal_state(false).
-
%%%
%%% The test cases -------------------------------------------------------------
%%%
diff --git a/erts/emulator/test/nofrag_SUITE.erl b/erts/emulator/test/nofrag_SUITE.erl
index ece55f433c..6b6ac28e2e 100644
--- a/erts/emulator/test/nofrag_SUITE.erl
+++ b/erts/emulator/test/nofrag_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -19,9 +19,11 @@
-module(nofrag_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,init_per_testcase/2,end_per_testcase/2,
+-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,
error_handler/1,error_handler_apply/1,
error_handler_fixed_apply/1,error_handler_fun/1,
error_handler_tuple_fun/1,
@@ -30,9 +32,28 @@
%% Exported functions for an error_handler module.
-export([undefined_function/3,undefined_lambda/3,breakpoint/3]).
-all(suite) ->
- [error_handler,error_handler_apply,error_handler_fixed_apply,
- error_handler_fun,error_handler_tuple_fun,debug_breakpoint].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [error_handler, error_handler_apply,
+ error_handler_fixed_apply, error_handler_fun,
+ error_handler_tuple_fun, debug_breakpoint].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog = ?t:timetrap(?t:minutes(3)),
diff --git a/erts/emulator/test/num_bif_SUITE.erl b/erts/emulator/test/num_bif_SUITE.erl
index d009994e2d..4459732257 100644
--- a/erts/emulator/test/num_bif_SUITE.erl
+++ b/erts/emulator/test/num_bif_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -19,7 +19,7 @@
-module(num_bif_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% Tests the BIFs:
%% abs/1
@@ -31,15 +31,36 @@
%% round/1
%% trunc/1
--export([all/1, t_abs/1, t_float/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, t_abs/1, t_float/1,
t_float_to_list/1, t_integer_to_list/1,
t_list_to_integer/1,
- t_list_to_float/1, t_list_to_float_safe/1, t_list_to_float_risky/1,
+ t_list_to_float_safe/1, t_list_to_float_risky/1,
t_round/1, t_trunc/1]).
-all(suite) -> [t_abs, t_float, t_float_to_list, t_integer_to_list,
- t_list_to_float, t_list_to_integer,
- t_round, t_trunc].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [t_abs, t_float, t_float_to_list, t_integer_to_list,
+ {group, t_list_to_float}, t_list_to_integer, t_round,
+ t_trunc].
+
+groups() ->
+ [{t_list_to_float, [],
+ [t_list_to_float_safe, t_list_to_float_risky]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
t_abs(Config) when is_list(Config) ->
%% Floats.
@@ -140,7 +161,6 @@ t_integer_to_list(Config) when is_list(Config) ->
%% Tests list_to_float/1.
-t_list_to_float(suite) -> [t_list_to_float_safe, t_list_to_float_risky].
t_list_to_float_safe(Config) when is_list(Config) ->
?line 0.0 = list_to_float(id("0.0")),
diff --git a/erts/emulator/test/old_mod.erl b/erts/emulator/test/old_mod.erl
index 6c47ba6f8f..124842390a 100644
--- a/erts/emulator/test/old_mod.erl
+++ b/erts/emulator/test/old_mod.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2010. 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
diff --git a/erts/emulator/test/old_scheduler_SUITE.erl b/erts/emulator/test/old_scheduler_SUITE.erl
index 70348f64db..262536a068 100644
--- a/erts/emulator/test/old_scheduler_SUITE.erl
+++ b/erts/emulator/test/old_scheduler_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -19,24 +19,44 @@
-module(old_scheduler_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1, init_per_testcase/2, fin_per_testcase/2]).
+-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([equal/1, many_low/1, few_low/1, max/1, high/1]).
-define(default_timeout, ?t:minutes(11)).
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
case catch erlang:system_info(modified_timing_level) of
Level when is_integer(Level) ->
{skipped,
- "Modified timing (level " ++ integer_to_list(Level)
- ++ ") is enabled. Testcases gets messed up by modfied "
- "timing."};
- _ ->
- [equal, many_low, few_low, max, high]
+ "Modified timing (level " ++
+ integer_to_list(Level) ++
+ ") is enabled. Testcases gets messed "
+ "up by modfied timing."};
+ _ -> [equal, many_low, few_low, max, high]
end.
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%-----------------------------------------------------------------------------------
%% TEST SUITE DESCRIPTION
%%
@@ -63,7 +83,7 @@ init_per_testcase(_Case, Config) ->
?line MS = erlang:system_flag(multi_scheduling, block),
[{prio,Prio},{watchdog,Dog},{multi_scheduling, MS}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
erlang:system_flag(multi_scheduling, unblock),
Dog=?config(watchdog, Config),
Prio=?config(prio, Config),
diff --git a/erts/emulator/test/op_SUITE.erl b/erts/emulator/test/op_SUITE.erl
index 55d8d9ab0f..ef4689b850 100644
--- a/erts/emulator/test/op_SUITE.erl
+++ b/erts/emulator/test/op_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -19,22 +19,43 @@
-module(op_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
bsl_bsr/1,logical/1,t_not/1,relop_simple/1,relop/1,complex_relop/1]).
-export([]).
-import(lists, [foldl/3,flatmap/2]).
-all(suite) ->
- [bsl_bsr,logical,t_not,relop_simple,relop,complex_relop].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [bsl_bsr, logical, t_not, relop_simple, relop,
+ complex_relop].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
Dog=?t:timetrap(?t:minutes(3)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog).
diff --git a/erts/emulator/test/port_SUITE.erl b/erts/emulator/test/port_SUITE.erl
index 7fe532abd0..eac56a867d 100644
--- a/erts/emulator/test/port_SUITE.erl
+++ b/erts/emulator/test/port_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -73,18 +73,19 @@
%%
--export([all/1, init_per_testcase/2, fin_per_testcase/2,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_testcase/2, end_per_testcase/2,
init_per_suite/1, end_per_suite/1,
- stream/1, stream_small/1, stream_big/1,
+ stream_small/1, stream_big/1,
basic_ping/1, slow_writes/1, bad_packet/1, bad_port_messages/1,
- multiple_packets/1, mul_basic/1, mul_slow_writes/1,
+ mul_basic/1, mul_slow_writes/1,
dying_port/1, port_program_with_path/1,
open_input_file_port/1, open_output_file_port/1,
iter_max_ports/1, eof/1, input_only/1, output_only/1,
name1/1,
- t_binary/1, options/1, parallell/1, t_exit/1,
+ t_binary/1, parallell/1, t_exit/1,
env/1, bad_env/1, cd/1, exit_status/1,
- tps/1, tps_16_bytes/1, tps_1K/1, line/1, stderr_to_stdout/1,
+ tps_16_bytes/1, tps_1K/1, line/1, stderr_to_stdout/1,
otp_3906/1, otp_4389/1, win_massive/1, win_massive_client/1,
mix_up_ports/1, otp_5112/1, otp_5119/1, otp_6224/1,
exit_status_multi_scheduling_block/1, ports/1,
@@ -98,31 +99,42 @@
-export([otp_3906_forker/5, otp_3906_start_forker_starter/4]).
-export([env_slave_main/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("kernel/include/file.hrl").
-all(suite) ->
- [
- otp_6224, stream, basic_ping, slow_writes, bad_packet,
- bad_port_messages, options, multiple_packets, parallell,
- dying_port, port_program_with_path,
- open_input_file_port, open_output_file_port,
- name1,
- env, bad_env, cd, exit_status,
- iter_max_ports, t_exit, tps, line, stderr_to_stdout,
- otp_3906, otp_4389, win_massive, mix_up_ports,
- otp_5112, otp_5119,
- exit_status_multi_scheduling_block,
- ports, spawn_driver, spawn_executable, close_deaf_port,
- unregister_name
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [otp_6224, {group, stream}, basic_ping, slow_writes,
+ bad_packet, bad_port_messages, {group, options},
+ {group, multiple_packets}, parallell, dying_port,
+ port_program_with_path, open_input_file_port,
+ open_output_file_port, name1, env, bad_env, cd,
+ exit_status, iter_max_ports, t_exit, {group, tps}, line,
+ stderr_to_stdout, otp_3906, otp_4389, win_massive,
+ mix_up_ports, otp_5112, otp_5119,
+ exit_status_multi_scheduling_block, ports, spawn_driver,
+ spawn_executable, close_deaf_port, unregister_name].
+
+groups() ->
+ [{stream, [], [stream_small, stream_big]},
+ {options, [], [t_binary, eof, input_only, output_only]},
+ {multiple_packets, [], [mul_basic, mul_slow_writes]},
+ {tps, [], [tps_16_bytes, tps_1K]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
-define(DEFAULT_TIMEOUT, ?t:minutes(5)).
init_per_testcase(Case, Config) ->
[{testcase, Case} |Config].
-fin_per_testcase(_Case, _Config) ->
+end_per_testcase(_Case, _Config) ->
ok.
init_per_suite(Config) when is_list(Config) ->
@@ -191,7 +203,6 @@ win_massive_loop(P,N) ->
-stream(suite) -> [stream_small, stream_big].
%% Test that we can send a stream of bytes and get it back.
%% We will send only a small amount of data, to avoid deadlock.
@@ -304,7 +315,6 @@ bad_message(PortTest, Message) ->
%% Tests various options (stream and {packet, Number} are implicitly
%% tested in other test cases).
-options(suite) -> [t_binary, eof, input_only, output_only].
%% Tests the 'binary' option for a port.
@@ -416,7 +426,6 @@ output_and_verify(Config, Filename, Options, Data) ->
%% Test that receiving several packages written in the same
%% write operation works.
-multiple_packets(suite) -> [mul_basic, mul_slow_writes].
%% Basic test of receiving multiple packages, written in
%% one operation by the other end.
@@ -740,7 +749,6 @@ suicide_port(Config) when is_list(Config) ->
?line exit(Port, die),
?line receive after infinity -> ok end.
-tps(suite) -> [tps_16_bytes, tps_1K].
tps_16_bytes(doc) -> "";
tps_16_bytes(suite) -> [];
@@ -1049,8 +1057,10 @@ otp_3906(Config) when is_list(Config) ->
-define(OTP_3906_MAX_CONC_OSP, 50).
otp_3906(Config, OSName) ->
- ?line TSDir = filename:dirname(code:which(test_server)),
- ?line {ok, Variables} = file:consult(filename:join(TSDir, "variables")),
+ ?line DataDir = filename:dirname(proplists:get_value(data_dir,Config)),
+ ?line {ok, Variables} = file:consult(
+ filename:join([DataDir,"..","..",
+ "test_server","variables"])),
case lists:keysearch('CC', 1, Variables) of
{value,{'CC', CC}} ->
SuiteDir = filename:dirname(code:which(?MODULE)),
diff --git a/erts/emulator/test/port_bif_SUITE.erl b/erts/emulator/test/port_bif_SUITE.erl
index f4e0bb9fa8..d9c82aba0e 100644
--- a/erts/emulator/test/port_bif_SUITE.erl
+++ b/erts/emulator/test/port_bif_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -20,25 +20,47 @@
-module(port_bif_SUITE).
--export([all/1, command/1, command_e/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, command/1,
command_e_1/1, command_e_2/1, command_e_3/1, command_e_4/1,
- port_info/1, port_info1/1, port_info2/1,
+ port_info1/1, port_info2/1,
connect/1, control/1, echo_to_busy/1]).
-export([do_command_e_1/1, do_command_e_2/1, do_command_e_4/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [command, {group, port_info}, connect, control,
+ echo_to_busy].
+
+groups() ->
+ [{command_e, [],
+ [command_e_1, command_e_2, command_e_3, command_e_4]},
+ {port_info, [], [port_info1, port_info2]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [command, port_info, connect, control, echo_to_busy].
init_per_testcase(_Func, Config) when is_list(Config) ->
Dog=test_server:timetrap(test_server:minutes(10)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) when is_list(Config) ->
+end_per_testcase(_Func, Config) when is_list(Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog).
@@ -69,11 +91,6 @@ do_command(P, Data) ->
end.
-command_e(suite) -> [command_e_1,
- command_e_2,
- command_e_3,
- command_e_4];
-command_e(doc) -> "Tests port_command/2 with errors".
%% port_command/2: badarg 1st arg
command_e_1(Config) when is_list(Config) ->
@@ -161,7 +178,6 @@ do_command_e_4(Program) ->
?line erlang:port_command(P, Data),
exit(survived).
-port_info(suite) -> [port_info1, port_info2].
%% Tests the port_info/1 BIF
port_info1(Config) when is_list(Config) ->
diff --git a/erts/emulator/test/process_SUITE.erl b/erts/emulator/test/process_SUITE.erl
index 77f850d0fb..f68e712268 100644
--- a/erts/emulator/test/process_SUITE.erl
+++ b/erts/emulator/test/process_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -25,12 +25,13 @@
%% process_info/1,2
%% register/2 (partially)
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(heap_binary_size, 64).
--export([all/1, spawn_with_binaries/1,
- t_exit_1/1, t_exit_2/1, t_exit_2_other/1, t_exit_2_other_normal/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, spawn_with_binaries/1,
+ t_exit_1/1, t_exit_2_other/1, t_exit_2_other_normal/1,
self_exit/1, normal_suicide_exit/1, abnormal_suicide_exit/1,
t_exit_2_catch/1, trap_exit_badarg/1, trap_exit_badarg_in_bif/1,
exit_and_timeout/1, exit_twice/1,
@@ -38,6 +39,7 @@
process_info_other_dist_msg/1,
process_info_2_list/1, process_info_lock_reschedule/1,
process_info_lock_reschedule2/1,
+ process_info_lock_reschedule3/1,
bump_reductions/1, low_prio/1, binary_owner/1, yield/1, yield2/1,
process_status_exiting/1,
otp_4725/1, bad_register/1, garbage_collect/1, otp_6237/1,
@@ -46,39 +48,69 @@
processes_large_tab/1, processes_default_tab/1, processes_small_tab/1,
processes_this_tab/1, processes_apply_trap/1,
processes_last_call_trap/1, processes_gc_trap/1,
- processes_term_proc_list/1, processes_bif/1,
- otp_7738/1, otp_7738_waiting/1, otp_7738_suspended/1,
- otp_7738_resume/1]).
+ processes_term_proc_list/1,
+ otp_7738_waiting/1, otp_7738_suspended/1,
+ otp_7738_resume/1,
+ garb_other_running/1]).
-export([prio_server/2, prio_client/2]).
--export([init_per_testcase/2, fin_per_testcase/2, end_per_suite/1]).
+-export([init_per_testcase/2, end_per_testcase/2]).
-export([hangaround/2, processes_bif_test/0, do_processes/1,
processes_term_proc_list_test/1]).
-all(suite) ->
- [spawn_with_binaries, t_exit_1, t_exit_2,
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [spawn_with_binaries, t_exit_1, {group, t_exit_2},
trap_exit_badarg, trap_exit_badarg_in_bif,
- t_process_info, process_info_other_msg, process_info_other_dist_msg,
- process_info_2_list,
- process_info_lock_reschedule, process_info_lock_reschedule2,
- process_status_exiting,
- bump_reductions, low_prio, yield, yield2, otp_4725, bad_register,
- garbage_collect, process_info_messages, process_flag_badarg, process_flag_heap_size,
- spawn_opt_heap_size, otp_6237, processes_bif, otp_7738].
+ t_process_info, process_info_other_msg,
+ process_info_other_dist_msg, process_info_2_list,
+ process_info_lock_reschedule,
+ process_info_lock_reschedule2,
+ process_info_lock_reschedule3, process_status_exiting,
+ bump_reductions, low_prio, yield, yield2, otp_4725,
+ bad_register, garbage_collect, process_info_messages,
+ process_flag_badarg, process_flag_heap_size,
+ spawn_opt_heap_size, otp_6237, {group, processes_bif},
+ {group, otp_7738}, garb_other_running].
+
+groups() ->
+ [{t_exit_2, [],
+ [t_exit_2_other, t_exit_2_other_normal, self_exit,
+ normal_suicide_exit, abnormal_suicide_exit,
+ t_exit_2_catch, exit_and_timeout, exit_twice]},
+ {processes_bif, [],
+ [processes_large_tab, processes_default_tab,
+ processes_small_tab, processes_this_tab,
+ processes_last_call_trap, processes_apply_trap,
+ processes_gc_trap, processes_term_proc_list]},
+ {otp_7738, [],
+ [otp_7738_waiting, otp_7738_suspended,
+ otp_7738_resume]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(Config) ->
+ catch erts_debug:set_internal_state(available_internal_state, false),
+ Config.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog=?t:timetrap(?t:minutes(10)),
[{watchdog, Dog},{testcase, Func}|Config].
-fin_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
+end_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog).
-end_per_suite(Config) ->
- catch erts_debug:set_internal_state(available_internal_state, false),
- Config.
-
fun_spawn(Fun) ->
spawn_link(erlang, apply, [Fun, []]).
@@ -117,10 +149,6 @@ t_exit_1() ->
{'EXIT', Pid, Garbage} -> ok
end.
-t_exit_2(suite) -> [t_exit_2_other, t_exit_2_other_normal,
- self_exit, normal_suicide_exit,
- abnormal_suicide_exit, t_exit_2_catch,
- exit_and_timeout, exit_twice].
%% Tests exit/2 with a lot of data in the exit message.
t_exit_2_other(Config) when is_list(Config) ->
@@ -677,6 +705,52 @@ process_info_lock_reschedule2(Config) when is_list(Config) ->
?line unlink(P6), exit(P6, bang),
?line ok.
+many_args(0,_B,_C,_D,_E,_F,_G,_H,_I,_J) ->
+ ok;
+many_args(A,B,C,D,E,F,G,H,I,J) ->
+ many_args(A-1,B,C,D,E,F,G,H,I,J).
+
+do_pi_msg_len(PT, AT) ->
+ lists:map(fun (_) -> ok end, [a,b,c,d]),
+ {message_queue_len, _} = process_info(element(2,PT), element(2,AT)).
+
+process_info_lock_reschedule3(doc) ->
+ [];
+process_info_lock_reschedule3(suite) ->
+ [];
+process_info_lock_reschedule3(Config) when is_list(Config) ->
+ %% We need a process that is running and an item that requires
+ %% process_info to take the main process lock.
+ ?line Target1 = spawn_link(fun tok_loop/0),
+ ?line Name1 = process_info_lock_reschedule_running,
+ ?line register(Name1, Target1),
+ ?line Target2 = spawn_link(fun () -> receive after infinity -> ok end end),
+ ?line Name2 = process_info_lock_reschedule_waiting,
+ ?line register(Name2, Target2),
+ ?line PI = fun(N) ->
+ case N rem 10 of
+ 0 -> erlang:yield();
+ _ -> ok
+ end,
+ ?line do_pi_msg_len({proc, Target1},
+ {arg, message_queue_len})
+ end,
+ ?line many_args(100000,1,2,3,4,5,6,7,8,9),
+ ?line lists:foreach(PI, lists:seq(1,1000000)),
+ %% Make sure Target1 still is willing to "tok loop"
+ ?line case process_info(Target1, status) of
+ {status, OkStatus} when OkStatus == runnable;
+ OkStatus == running;
+ OkStatus == garbage_collecting ->
+ ?line unlink(Target1),
+ ?line unlink(Target2),
+ ?line exit(Target1, bang),
+ ?line exit(Target2, bang),
+ ?line OkStatus;
+ {status, BadStatus} ->
+ ?line ?t:fail(BadStatus)
+ end.
+
process_status_exiting(Config) when is_list(Config) ->
%% Make sure that erts_debug:get_internal_state({process_status,P})
%% returns exiting if it is in status P_EXITING.
@@ -1227,17 +1301,6 @@ otp_6237_select_loop() ->
otp_6237_select_loop().
-processes_bif(doc) ->
- [];
-processes_bif(suite) ->
- [processes_large_tab,
- processes_default_tab,
- processes_small_tab,
- processes_this_tab,
- processes_last_call_trap,
- processes_apply_trap,
- processes_gc_trap,
- processes_term_proc_list].
-define(NoTestProcs, 10000).
-record(processes_bif_info, {min_start_reds,
@@ -1965,10 +2028,6 @@ processes_term_proc_list_test(MustChk) ->
?line erlang:system_flag(multi_scheduling, unblock),
?line as_expected.
-otp_7738(doc) ->
- [];
-otp_7738(suite) ->
- [otp_7738_waiting, otp_7738_suspended, otp_7738_resume].
otp_7738_waiting(doc) ->
[];
@@ -2058,6 +2117,41 @@ otp_7738_test(Type) ->
end,
?line ok.
+gor(Reds, Stop) ->
+ receive
+ {From, reds} ->
+ From ! {reds, Reds, self()},
+ gor(Reds+1, Stop);
+ {From, Stop} ->
+ From ! {stopped, Stop, Reds, self()}
+ after 0 ->
+ gor(Reds+1, Stop)
+ end.
+
+garb_other_running(Config) when is_list(Config) ->
+ ?line Stop = make_ref(),
+ ?line {Pid, Mon} = spawn_monitor(fun () -> gor(0, Stop) end),
+ ?line Reds = lists:foldl(fun (_, OldReds) ->
+ ?line erlang:garbage_collect(Pid),
+ ?line receive after 1 -> ok end,
+ ?line Pid ! {self(), reds},
+ ?line receive
+ {reds, NewReds, Pid} ->
+ ?line true = (NewReds > OldReds),
+ ?line NewReds
+ end
+ end,
+ 0,
+ lists:seq(1, 10000)),
+ ?line receive after 1 -> ok end,
+ ?line Pid ! {self(), Stop},
+ ?line receive
+ {stopped, Stop, StopReds, Pid} ->
+ ?line true = (StopReds > Reds)
+ end,
+ ?line receive {'DOWN', Mon, process, Pid, normal} -> ok end,
+ ?line ok.
+
%% Internal functions
wait_until(Fun) ->
diff --git a/erts/emulator/test/pseudoknot_SUITE.erl b/erts/emulator/test/pseudoknot_SUITE.erl
index 907204cf93..5a7cdcecd5 100644
--- a/erts/emulator/test/pseudoknot_SUITE.erl
+++ b/erts/emulator/test/pseudoknot_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -19,9 +19,29 @@
-module(pseudoknot_SUITE).
--export([all/1,test/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,test/1]).
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [test].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) -> [test].
test(Config) when is_list(Config) ->
statistics(runtime),
@@ -3274,13 +3294,13 @@ most_distant_atom(Sols) ->
maximum(map(sol_most_distant_atom, Sols)).
maximum([H|T]) ->
- max(T,H).
+ max1(T,H).
-max([H|T],M) when is_float(H), is_float(M), H > M ->
- max(T,H);
-max([_|T],M) ->
- max(T,M);
-max([],M) -> M.
+max1([H|T],M) when is_float(H), is_float(M), H > M ->
+ max1(T,H);
+max1([_|T],M) ->
+ max1(T,M);
+max1([],M) -> M.
map(_Func,[]) -> [];
map(Func,[H|T]) ->
diff --git a/erts/emulator/test/random_iolist.erl b/erts/emulator/test/random_iolist.erl
index 4bce347d9a..8f21b5a3b3 100644
--- a/erts/emulator/test/random_iolist.erl
+++ b/erts/emulator/test/random_iolist.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2010. 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
diff --git a/erts/emulator/test/receive_SUITE.erl b/erts/emulator/test/receive_SUITE.erl
index 40ebf2bd21..b070e2b986 100644
--- a/erts/emulator/test/receive_SUITE.erl
+++ b/erts/emulator/test/receive_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2011. 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
@@ -21,21 +21,40 @@
%% Tests receive after.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
call_with_huge_message_queue/1,receive_in_between/1]).
--export([init_per_testcase/2,fin_per_testcase/2]).
+-export([init_per_testcase/2,end_per_testcase/2]).
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [call_with_huge_message_queue, receive_in_between].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [call_with_huge_message_queue,receive_in_between].
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog=?t:timetrap(?t:minutes(3)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog).
diff --git a/erts/emulator/test/ref_SUITE.erl b/erts/emulator/test/ref_SUITE.erl
index fa77095efd..e13dfa1575 100644
--- a/erts/emulator/test/ref_SUITE.erl
+++ b/erts/emulator/test/ref_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -19,23 +19,44 @@
-module(ref_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2]).
+-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([wrap_1/1]).
-export([loop_ref/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
init_per_testcase(_, Config) ->
?line Dog=test_server:timetrap(test_server:minutes(2)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_, Config) ->
+end_per_testcase(_, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-all(suite) -> [wrap_1].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [wrap_1].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
wrap_1(doc) -> "Check that refs don't wrap around easily.";
wrap_1(Config) when is_list(Config) ->
diff --git a/erts/emulator/test/register_SUITE.erl b/erts/emulator/test/register_SUITE.erl
index c03ee23b2e..9953df3458 100644
--- a/erts/emulator/test/register_SUITE.erl
+++ b/erts/emulator/test/register_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2011. 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
@@ -22,24 +22,43 @@
%-define(line_trace, 1).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%-compile(export_all).
--export([all/1, init_per_testcase/2, fin_per_testcase/2]).
+-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([otp_8099/1]).
-define(DEFAULT_TIMEOUT, ?t:minutes(2)).
-all(doc) -> [];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[otp_8099].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
init_per_testcase(Case, Config) when is_list(Config) ->
Dog = ?t:timetrap(?DEFAULT_TIMEOUT),
[{watchdog, Dog}, {testcase, Case} | Config].
-fin_per_testcase(_Case, Config) when is_list(Config) ->
+end_per_testcase(_Case, Config) when is_list(Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
diff --git a/erts/emulator/test/save_calls_SUITE.erl b/erts/emulator/test/save_calls_SUITE.erl
index b56c4ad0b0..390b49b604 100644
--- a/erts/emulator/test/save_calls_SUITE.erl
+++ b/erts/emulator/test/save_calls_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -19,17 +19,36 @@
-module(save_calls_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/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([save_calls_1/1,dont_break_reductions/1]).
-export([do_bopp/1, do_bipp/0, do_bepp/0]).
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[save_calls_1, dont_break_reductions].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
dont_break_reductions(suite) ->
[];
dont_break_reductions(doc) ->
diff --git a/erts/emulator/test/scheduler_SUITE.erl b/erts/emulator/test/scheduler_SUITE.erl
index 06442bfad6..f16d0ea429 100644
--- a/erts/emulator/test/scheduler_SUITE.erl
+++ b/erts/emulator/test/scheduler_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -30,10 +30,12 @@
%-define(line_trace, 1).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%-compile(export_all).
--export([all/1, init_per_testcase/2, fin_per_testcase/2, end_per_suite/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ init_per_testcase/2, end_per_testcase/2, end_per_suite/1]).
-export([equal/1,
few_low/1,
@@ -44,7 +46,7 @@
equal_with_high/1,
equal_with_high_max/1,
bound_process/1,
- scheduler_bind/1,
+
scheduler_bind_types/1,
cpu_topology/1,
update_cpu_info/1,
@@ -57,21 +59,35 @@
-define(MIN_SCHEDULER_TEST_TIMEOUT, ?t:minutes(1)).
-all(doc) -> [];
-all(suite) ->
- [equal,
- few_low,
- many_low,
- equal_with_part_time_high,
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [equal, few_low, many_low, equal_with_part_time_high,
equal_with_part_time_max,
- equal_and_high_with_part_time_max,
- equal_with_high,
- equal_with_high_max,
- bound_process,
- scheduler_bind,
- scheduler_suspend,
+ equal_and_high_with_part_time_max, equal_with_high,
+ equal_with_high_max, bound_process,
+ {group, scheduler_bind}, scheduler_suspend,
reader_groups].
+groups() ->
+ [{scheduler_bind, [],
+ [scheduler_bind_types, cpu_topology, update_cpu_info,
+ sct_cmd, sbt_cmd]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(Config) ->
+ catch erts_debug:set_internal_state(available_internal_state, false),
+ Config.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
init_per_testcase(Case, Config) when is_list(Config) ->
Dog = ?t:timetrap(?DEFAULT_TIMEOUT),
process_flag(priority, max),
@@ -79,15 +95,11 @@ init_per_testcase(Case, Config) when is_list(Config) ->
OkRes = ok,
[{watchdog, Dog}, {testcase, Case}, {ok_res, OkRes} |Config].
-fin_per_testcase(_Case, Config) when is_list(Config) ->
+end_per_testcase(_Case, Config) when is_list(Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-end_per_suite(Config) ->
- catch erts_debug:set_internal_state(available_internal_state, false),
- Config.
-
-define(ERTS_RUNQ_CHECK_BALANCE_REDS_PER_SCHED, (2000*2000)).
-define(DEFAULT_TEST_REDS_PER_SCHED, 200000000).
@@ -247,12 +259,6 @@ bound_loop(NS, N, M, Sched) ->
Sched = erlang:system_info(scheduler_id),
bound_loop(NS, N-1, M, Sched).
-scheduler_bind(suite) ->
- [scheduler_bind_types,
- cpu_topology,
- update_cpu_info,
- sct_cmd,
- sbt_cmd].
-define(TOPOLOGY_A_CMD,
"+sct"
@@ -856,9 +862,9 @@ get_affinity_mask(Port, Status, Affinity) when Status == unknown;
{Port,{exit_status,S}} ->
get_affinity_mask(Port, S, Affinity)
end;
-get_affinity_mask(Port, Status, bad) ->
+get_affinity_mask(_Port, _Status, bad) ->
unknown;
-get_affinity_mask(Port, Status, Affinity) ->
+get_affinity_mask(_Port, _Status, Affinity) ->
Affinity.
get_affinity_mask() ->
@@ -1383,67 +1389,6 @@ reader_groups_map(CPUT, Groups) ->
%% Utils
%%
-tilera_cpu_topology() ->
- [{processor,[{node,[{core,{logical,0}},
- {core,{logical,1}},
- {core,{logical,2}},
- {core,{logical,8}},
- {core,{logical,9}},
- {core,{logical,10}},
- {core,{logical,11}},
- {core,{logical,16}},
- {core,{logical,17}},
- {core,{logical,18}},
- {core,{logical,19}},
- {core,{logical,24}},
- {core,{logical,25}},
- {core,{logical,27}},
- {core,{logical,29}}]},
- {node,[{core,{logical,3}},
- {core,{logical,4}},
- {core,{logical,5}},
- {core,{logical,6}},
- {core,{logical,7}},
- {core,{logical,12}},
- {core,{logical,13}},
- {core,{logical,14}},
- {core,{logical,15}},
- {core,{logical,20}},
- {core,{logical,21}},
- {core,{logical,22}},
- {core,{logical,23}},
- {core,{logical,28}},
- {core,{logical,30}}]},
- {node,[{core,{logical,31}},
- {core,{logical,36}},
- {core,{logical,37}},
- {core,{logical,38}},
- {core,{logical,44}},
- {core,{logical,45}},
- {core,{logical,46}},
- {core,{logical,47}},
- {core,{logical,51}},
- {core,{logical,52}},
- {core,{logical,53}},
- {core,{logical,54}},
- {core,{logical,55}},
- {core,{logical,60}},
- {core,{logical,61}}]},
- {node,[{core,{logical,26}},
- {core,{logical,32}},
- {core,{logical,33}},
- {core,{logical,34}},
- {core,{logical,35}},
- {core,{logical,39}},
- {core,{logical,40}},
- {core,{logical,41}},
- {core,{logical,42}},
- {core,{logical,43}},
- {core,{logical,48}},
- {core,{logical,49}},
- {core,{logical,50}},
- {core,{logical,58}}]}]}].
-
l(Id) ->
{logical, Id}.
diff --git a/erts/emulator/test/send_term_SUITE.erl b/erts/emulator/test/send_term_SUITE.erl
index 819aa34886..6615873392 100644
--- a/erts/emulator/test/send_term_SUITE.erl
+++ b/erts/emulator/test/send_term_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -19,24 +19,43 @@
-module(send_term_SUITE).
--export([all/1,basic/1]).
--export([init_per_testcase/2,fin_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,basic/1]).
+-export([init_per_testcase/2,end_per_testcase/2]).
-export([generate_external_terms_files/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog=?t:timetrap(?t:minutes(3)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog).
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[basic].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
basic(Config) when is_list(Config) ->
Drv = "send_term_drv",
?line P = start_driver(Config, Drv),
diff --git a/erts/emulator/test/sensitive_SUITE.erl b/erts/emulator/test/sensitive_SUITE.erl
index 458275af81..634df367ca 100644
--- a/erts/emulator/test/sensitive_SUITE.erl
+++ b/erts/emulator/test/sensitive_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -19,9 +19,11 @@
-module(sensitive_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
stickiness/1,send_trace/1,recv_trace/1,proc_trace/1,call_trace/1,
meta_trace/1,running_trace/1,gc_trace/1,seq_trace/1,
t_process_info/1,t_process_display/1,save_calls/1]).
@@ -34,14 +36,33 @@ init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog = ?t:timetrap(?t:minutes(5)),
[{watchdog,Dog}|Config].
-fin_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
+end_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog).
-all(suite) ->
- [stickiness,send_trace,recv_trace,proc_trace,call_trace,
- meta_trace,running_trace,gc_trace,seq_trace,
- t_process_info,t_process_display,save_calls].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [stickiness, send_trace, recv_trace, proc_trace,
+ call_trace, meta_trace, running_trace, gc_trace,
+ seq_trace, t_process_info, t_process_display,
+ save_calls].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
stickiness(Config) when is_list(Config) ->
?line {Tracer,Mref} = spawn_monitor(fun() ->
diff --git a/erts/emulator/test/signal_SUITE.erl b/erts/emulator/test/signal_SUITE.erl
index e9103ca3c1..736dfe5b56 100644
--- a/erts/emulator/test/signal_SUITE.erl
+++ b/erts/emulator/test/signal_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -30,8 +30,9 @@
-define(DEFAULT_TIMEOUT_SECONDS, 120).
%-define(line_trace, 1).
--include("test_server.hrl").
--export([all/1]).
+-include_lib("test_server/include/test_server.hrl").
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
% Test cases
-export([xm_sig_order/1,
@@ -49,38 +50,48 @@
pending_exit_group_leader/1,
exit_before_pending_exit/1]).
--export([init_per_testcase/2, fin_per_testcase/2, end_per_suite/1]).
+-export([init_per_testcase/2, end_per_testcase/2]).
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
?line Dog = ?t:timetrap(?t:seconds(?DEFAULT_TIMEOUT_SECONDS)),
available_internal_state(true),
?line [{testcase, Func},{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
?line Dog = ?config(watchdog, Config),
?line ?t:timetrap_cancel(Dog).
+init_per_suite(Config) ->
+ Config.
+
end_per_suite(_Config) ->
available_internal_state(true),
- erts_debug:set_internal_state(not_running_optimization, true),
+ catch erts_debug:set_internal_state(not_running_optimization, true),
available_internal_state(false).
-all(suite) ->
- [xm_sig_order,
- pending_exit_unlink_process,
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [xm_sig_order, pending_exit_unlink_process,
pending_exit_unlink_dist_process,
- pending_exit_unlink_port,
- pending_exit_trap_exit,
- pending_exit_receive,
- pending_exit_trap_exit,
- pending_exit_gc,
- pending_exit_is_process_alive,
+ pending_exit_unlink_port, pending_exit_trap_exit,
+ pending_exit_receive, pending_exit_trap_exit,
+ pending_exit_gc, pending_exit_is_process_alive,
pending_exit_process_display,
pending_exit_process_info_1,
- pending_exit_process_info_2,
- pending_exit_group_leader,
+ pending_exit_process_info_2, pending_exit_group_leader,
exit_before_pending_exit].
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
xm_sig_order(doc) -> ["Test that exit signals and messages are received "
"in correct order"];
xm_sig_order(suite) -> [];
diff --git a/erts/emulator/test/statistics_SUITE.erl b/erts/emulator/test/statistics_SUITE.erl
index 898908c40f..0392312a6f 100644
--- a/erts/emulator/test/statistics_SUITE.erl
+++ b/erts/emulator/test/statistics_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -21,13 +21,14 @@
%% Tests the statistics/1 bif.
--export([all/1,
+-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,
- fin_per_testcase/2,
- wall_clock/1, wall_clock_zero_diff/1, wall_clock_update/1,
- runtime/1, runtime_zero_diff/1,
+ end_per_testcase/2,
+ wall_clock_zero_diff/1, wall_clock_update/1,
+ runtime_zero_diff/1,
runtime_update/1, runtime_diff/1,
- run_queue/1, run_queue_one/1,
+ run_queue_one/1,
reductions/1, reductions_big/1, garbage_collection/1, io/1,
badarg/1]).
@@ -35,24 +36,47 @@
-export([hog/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
init_per_testcase(_, Config) ->
?line Dog = test_server:timetrap(test_server:seconds(300)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_, Config) ->
+end_per_testcase(_, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-all(suite) -> [wall_clock, runtime, reductions, reductions_big, run_queue,
- garbage_collection, io, badarg].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, wall_clock}, {group, runtime}, reductions,
+ reductions_big, {group, run_queue}, garbage_collection,
+ io, badarg].
+
+groups() ->
+ [{wall_clock, [],
+ [wall_clock_zero_diff, wall_clock_update]},
+ {runtime, [],
+ [runtime_zero_diff, runtime_update, runtime_diff]},
+ {run_queue, [], [run_queue_one]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%% Testing statistics(wall_clock).
-wall_clock(suite) -> [wall_clock_zero_diff, wall_clock_update].
wall_clock_zero_diff(doc) ->
@@ -99,7 +123,6 @@ wall_clock_update1(0) ->
%%% Test statistics(runtime).
-runtime(suite) -> [runtime_zero_diff, runtime_update, runtime_diff].
runtime_zero_diff(doc) ->
"Tests that the difference between the times returned from two consectuitive "
@@ -225,7 +248,6 @@ reductions_big_loop() ->
%%% Tests of statistics(run_queue).
-run_queue(suite) -> [run_queue_one].
run_queue_one(doc) ->
"Tests that statistics(run_queue) returns 1 if we start a "
diff --git a/erts/emulator/test/system_info_SUITE.erl b/erts/emulator/test/system_info_SUITE.erl
index cd940f3ddf..9b782b35a2 100644
--- a/erts/emulator/test/system_info_SUITE.erl
+++ b/erts/emulator/test/system_info_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -30,23 +30,44 @@
%-define(line_trace, 1).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%-compile(export_all).
--export([all/1, init_per_testcase/2, fin_per_testcase/2]).
+-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([process_count/1, system_version/1, misc_smoke_tests/1, heap_size/1, wordsize/1]).
-define(DEFAULT_TIMEOUT, ?t:minutes(2)).
-all(doc) -> [];
-all(suite) -> [process_count, system_version, misc_smoke_tests, heap_size, wordsize].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [process_count, system_version, misc_smoke_tests,
+ heap_size, wordsize].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Case, Config) when is_list(Config) ->
Dog = ?t:timetrap(?DEFAULT_TIMEOUT),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) when is_list(Config) ->
+end_per_testcase(_Case, Config) when is_list(Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
diff --git a/erts/emulator/test/system_profile_SUITE.erl b/erts/emulator/test/system_profile_SUITE.erl
index 7b0d6d19fe..32089e8872 100644
--- a/erts/emulator/test/system_profile_SUITE.erl
+++ b/erts/emulator/test/system_profile_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -22,35 +22,52 @@
-module(system_profile_SUITE).
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
system_profile_on_and_off/1,
runnable_procs/1,
runnable_ports/1,
scheduler/1
]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
--export([profiler_process/1, ring_loop/1, port_echo_start/0, list_load/0, run_load/2]).
+-export([profiler_process/1, ring_loop/1, port_echo_start/0,
+ list_load/0, run_load/2]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(default_timeout, ?t:minutes(1)).
init_per_testcase(_Case, Config) ->
?line Dog=?t:timetrap(?default_timeout),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-all(suite) ->
- %% Test specification on test suite level
- [system_profile_on_and_off,
- runnable_procs,
- runnable_ports,
- scheduler].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [system_profile_on_and_off, runnable_procs,
+ runnable_ports, scheduler].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% No specification clause needed for an init function in a conf case!!!
diff --git a/erts/emulator/test/time_SUITE.erl b/erts/emulator/test/time_SUITE.erl
index 095e9dd1af..bd48a0a7db 100644
--- a/erts/emulator/test/time_SUITE.erl
+++ b/erts/emulator/test/time_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -29,14 +29,15 @@
%% now/0
%%
--export([all/1, univ_to_local/1, local_to_univ/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, univ_to_local/1, local_to_univ/1,
bad_univ_to_local/1, bad_local_to_univ/1,
consistency/1,
- now/1, now_unique/1, now_update/1, timestamp/1]).
+ now_unique/1, now_update/1, timestamp/1]).
-export([local_to_univ_utc/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-export([linear_time/1]).
@@ -54,10 +55,28 @@
-define(dst_timezone, 2).
-all(suite) -> [univ_to_local, local_to_univ,
- local_to_univ_utc,
- bad_univ_to_local, bad_local_to_univ,
- consistency, now, timestamp].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [univ_to_local, local_to_univ, local_to_univ_utc,
+ bad_univ_to_local, bad_local_to_univ, consistency,
+ {group, now}, timestamp].
+
+groups() ->
+ [{now, [], [now_unique, now_update]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
local_to_univ_utc(suite) ->
[];
@@ -283,7 +302,6 @@ repeating_timestamp_check(N) ->
%% Test now/0.
-now(suite) -> [now_unique, now_update].
%% Tests that successive calls to now/0 returns different values.
%% Also returns a comment string with the median difference between
diff --git a/erts/emulator/test/timer_bif_SUITE.erl b/erts/emulator/test/timer_bif_SUITE.erl
index 9ac5afcc45..7ff7449ff5 100644
--- a/erts/emulator/test/timer_bif_SUITE.erl
+++ b/erts/emulator/test/timer_bif_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -19,7 +19,9 @@
-module(timer_bif_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,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,
+ init_per_testcase/2,end_per_testcase/2]).
-export([start_timer_1/1, send_after_1/1, send_after_2/1, send_after_3/1,
cancel_timer_1/1,
start_timer_big/1, send_after_big/1,
@@ -27,7 +29,7 @@
read_timer_trivial/1, read_timer/1,
cleanup/1, evil_timers/1, registered_process/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
init_per_testcase(_Case, Config) ->
?line Dog=test_server:timetrap(test_server:seconds(30)),
@@ -37,19 +39,35 @@ init_per_testcase(_Case, Config) ->
end,
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
+init_per_suite(Config) ->
+ Config.
+
end_per_suite(_Config) ->
catch erts_debug:set_internal_state(available_internal_state, false).
-all(suite) ->
- [start_timer_1, send_after_1, send_after_2, cancel_timer_1,
- start_timer_e, send_after_e, cancel_timer_e,
- start_timer_big, send_after_big, read_timer_trivial, read_timer,
- cleanup, evil_timers, registered_process].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [start_timer_1, send_after_1, send_after_2,
+ cancel_timer_1, start_timer_e, send_after_e,
+ cancel_timer_e, start_timer_big, send_after_big,
+ read_timer_trivial, read_timer, cleanup, evil_timers,
+ registered_process].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
start_timer_1(doc) -> ["Basic start_timer/3 functionality"];
start_timer_1(Config) when is_list(Config) ->
diff --git a/erts/emulator/test/trace_SUITE.erl b/erts/emulator/test/trace_SUITE.erl
index e9713fcf0f..221b65309a 100644
--- a/erts/emulator/test/trace_SUITE.erl
+++ b/erts/emulator/test/trace_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -23,7 +23,8 @@
%%% Tests the trace BIF.
%%%
--export([all/1, receive_trace/1, self_send/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, receive_trace/1, self_send/1,
timeout_trace/1, send_trace/1,
procs_trace/1, dist_procs_trace/1,
suspend/1, mutual_suspend/1, suspend_exit/1, suspender_exit/1,
@@ -35,22 +36,39 @@
system_monitor_large_heap_1/1, system_monitor_large_heap_2/1,
bad_flag/1, trace_delivered/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%%% Internal exports
-export([process/1]).
-all(suite) ->
- [cpu_timestamp, receive_trace, self_send, timeout_trace, send_trace,
- procs_trace, dist_procs_trace,
- suspend, mutual_suspend, suspend_exit, suspender_exit,
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [cpu_timestamp, receive_trace, self_send, timeout_trace,
+ 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, set_on_first_spawn,
- system_monitor_args, more_system_monitor_args,
- system_monitor_long_gc_1, system_monitor_long_gc_2,
- system_monitor_large_heap_1, system_monitor_large_heap_2,
- bad_flag, trace_delivered].
+ new_clear, existing_clear, set_on_spawn,
+ set_on_first_spawn, system_monitor_args,
+ more_system_monitor_args, system_monitor_long_gc_1,
+ system_monitor_long_gc_2, system_monitor_large_heap_1,
+ system_monitor_large_heap_2, bad_flag, trace_delivered].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% No longer testing anything, just reporting whether cpu_timestamp
diff --git a/erts/emulator/test/trace_bif_SUITE.erl b/erts/emulator/test/trace_bif_SUITE.erl
index 3f91f8dc08..2c78aa394f 100644
--- a/erts/emulator/test/trace_bif_SUITE.erl
+++ b/erts/emulator/test/trace_bif_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -19,24 +19,44 @@
-module(trace_bif_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1]).
--export([trace_bif/1, trace_bif_timestamp/1, trace_on_and_off/1, trace_bif_local/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([trace_bif/1, trace_bif_timestamp/1, trace_on_and_off/1,
+ trace_bif_local/1,
trace_bif_timestamp_local/1, trace_bif_return/1, not_run/1,
trace_info_old_code/1]).
-export([bif_process/0]).
-all(suite) ->
- case test_server:is_native(?MODULE) of
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ case test_server:is_native(trace_bif_SUITE) of
true -> [not_run];
false ->
[trace_bif, trace_bif_timestamp, trace_on_and_off,
- trace_bif_local, trace_bif_timestamp_local,
+ trace_bif_local, trace_bif_timestamp_local,
trace_bif_return, trace_info_old_code]
end.
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
not_run(Config) when is_list(Config) ->
{skipped,"Native code"}.
diff --git a/erts/emulator/test/trace_call_count_SUITE.erl b/erts/emulator/test/trace_call_count_SUITE.erl
index 07aa7c8d8d..2ac58493ff 100644
--- a/erts/emulator/test/trace_call_count_SUITE.erl
+++ b/erts/emulator/test/trace_call_count_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
@@ -42,7 +42,7 @@
-define(config(A,B),config(A,B)).
-export([config/2]).
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-endif.
-ifdef(debug).
@@ -62,7 +62,9 @@ config(priv_dir,_) ->
".".
-else.
%% When run in test server.
--export([all/1, init_per_testcase/2, fin_per_testcase/2, not_run/1]).
+-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, not_run/1]).
-export([basic/1, on_and_off/1, info/1,
pause_and_restart/1, combo/1]).
@@ -70,7 +72,7 @@ init_per_testcase(_Case, Config) ->
?line Dog=test_server:timetrap(test_server:seconds(30)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
erlang:trace_pattern({'_','_','_'}, false, [local,meta,call_count]),
erlang:trace_pattern(on_load, false, [local,meta,call_count]),
erlang:trace(all, false, [all]),
@@ -78,15 +80,31 @@ fin_per_testcase(_Case, Config) ->
test_server:timetrap_cancel(Dog),
ok.
-all(doc) ->
- ["Test call count tracing of local function calls."];
-all(suite) ->
- case test_server:is_native(?MODULE) of
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ case test_server:is_native(trace_call_count_SUITE) of
true -> [not_run];
- false -> [basic, on_and_off, info,
- pause_and_restart, combo]
+ false ->
+ [basic, on_and_off, info, pause_and_restart, combo]
end.
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
not_run(Config) when is_list(Config) ->
{skipped,"Native code"}.
diff --git a/erts/emulator/test/trace_call_time_SUITE.erl b/erts/emulator/test/trace_call_time_SUITE.erl
index 7bc91addde..5dfa87bbee 100644
--- a/erts/emulator/test/trace_call_time_SUITE.erl
+++ b/erts/emulator/test/trace_call_time_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010. All Rights Reserved.
+%% Copyright Ericsson AB 2011. 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
@@ -57,12 +57,15 @@
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% When run in test server.
--export([all/1, init_per_testcase/2, fin_per_testcase/2, not_run/1]).
+-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, not_run/1]).
-export([basic/1, on_and_off/1, info/1,
- pause_and_restart/1, scheduling/1, called_function/1, combo/1, bif/1, nif/1]).
+ pause_and_restart/1, scheduling/1, called_function/1, combo/1,
+ bif/1, nif/1]).
init_per_testcase(_Case, Config) ->
?line Dog=test_server:timetrap(test_server:seconds(400)),
@@ -71,7 +74,7 @@ init_per_testcase(_Case, Config) ->
timer:now_diff(now(),now()),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
erlang:trace_pattern({'_','_','_'}, false, [local,meta,call_time,call_count]),
erlang:trace_pattern(on_load, false, [local,meta,call_time,call_count]),
erlang:trace(all, false, [all]),
@@ -79,15 +82,32 @@ fin_per_testcase(_Case, Config) ->
test_server:timetrap_cancel(Dog),
ok.
-all(doc) ->
- ["Test call count tracing of local function calls."];
-all(suite) ->
- case test_server:is_native(?MODULE) of
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ case test_server:is_native(trace_call_time_SUITE) of
true -> [not_run];
- false -> [basic, on_and_off, info,
- pause_and_restart, scheduling, combo, bif, nif, called_function]
+ false ->
+ [basic, on_and_off, info, pause_and_restart, scheduling,
+ combo, bif, nif, called_function]
end.
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
not_run(Config) when is_list(Config) ->
{skipped,"Native code"}.
@@ -407,7 +427,7 @@ nif(Config) when is_list(Config) ->
?line 1 = erlang:trace_pattern({?MODULE, nif_dec, '_'}, true, [call_time]),
?line 1 = erlang:trace_pattern({?MODULE, with_nif, '_'}, true, [call_time]),
?line Pid = setup(),
- ?line {L, T1} = execute(Pid, fun() -> with_nif(M) end),
+ ?line {_, T1} = execute(Pid, fun() -> with_nif(M) end),
% the nif is called M - 1 times, the last time the function with 'with_nif'
% returns ok and does not call the nif.
@@ -486,7 +506,7 @@ with_nif(N) ->
with_nif(?MODULE:nif_dec(N)).
-nif_dec(N) -> 0.
+nif_dec(_) -> 0.
dec(N) ->
loaded(10000),
diff --git a/erts/emulator/test/trace_local_SUITE.erl b/erts/emulator/test/trace_local_SUITE.erl
index 24005774ba..091e960610 100644
--- a/erts/emulator/test/trace_local_SUITE.erl
+++ b/erts/emulator/test/trace_local_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -45,7 +45,7 @@
-export([config/2]).
-define(DEFAULT_RECEIVE_TIMEOUT, 1000).
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(DEFAULT_RECEIVE_TIMEOUT, infinity).
-endif.
@@ -68,7 +68,8 @@ config(priv_dir,_) ->
%%% When run in test server %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--export([all/1, basic/1, bit_syntax/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, basic/1, bit_syntax/1,
return/1, on_and_off/1, stack_grow/1,info/1, delete/1,
exception/1, exception_apply/1,
exception_function/1, exception_apply_function/1,
@@ -79,34 +80,51 @@ config(priv_dir,_) ->
exception_meta_nocatch/1, exception_meta_nocatch_apply/1,
exception_meta_nocatch_function/1,
exception_meta_nocatch_apply_function/1,
- init_per_testcase/2, fin_per_testcase/2]).
+ init_per_testcase/2, end_per_testcase/2]).
init_per_testcase(_Case, Config) ->
?line Dog=test_server:timetrap(test_server:minutes(2)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
shutdown(),
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-all(doc) ->
- ["Test tracing of local function calls and return traces."];
-all(suite) ->
- case test_server:is_native(?MODULE) of
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ case test_server:is_native(trace_local_SUITE) of
true -> [not_run];
- false -> [basic, bit_syntax, return, on_and_off, stack_grow, info, delete,
- exception, exception_apply,
- exception_function, exception_apply_function,
- exception_nocatch, exception_nocatch_apply,
- exception_nocatch_function,
- exception_nocatch_apply_function,
- exception_meta, exception_meta_apply,
- exception_meta_function, exception_meta_apply_function,
- exception_meta_nocatch, exception_meta_nocatch_apply,
- exception_meta_nocatch_function,
- exception_meta_nocatch_apply_function]
+ false ->
+ [basic, bit_syntax, return, on_and_off, stack_grow,
+ info, delete, exception, exception_apply,
+ exception_function, exception_apply_function,
+ exception_nocatch, exception_nocatch_apply,
+ exception_nocatch_function,
+ exception_nocatch_apply_function, exception_meta,
+ exception_meta_apply, exception_meta_function,
+ exception_meta_apply_function, exception_meta_nocatch,
+ exception_meta_nocatch_apply,
+ exception_meta_nocatch_function,
+ exception_meta_nocatch_apply_function]
end.
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
not_run(Config) when is_list(Config) ->
{skipped,"Native code"}.
@@ -796,9 +814,6 @@ loop(D1,D2,D3,0) ->
loop(D1,D2,D3,N) ->
max(N,loop(D1,D2,D3,N-1)).
-max(A, B) when A > B -> A;
-max(_, B) -> B.
-
exported_wrap(Val) ->
exported(Val).
diff --git a/erts/emulator/test/trace_meta_SUITE.erl b/erts/emulator/test/trace_meta_SUITE.erl
index d84cb3cdf2..45987cc319 100644
--- a/erts/emulator/test/trace_meta_SUITE.erl
+++ b/erts/emulator/test/trace_meta_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
@@ -45,7 +45,7 @@
-define(config(A,B),config(A,B)).
-export([config/2]).
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-endif.
-ifdef(debug).
@@ -65,7 +65,9 @@ config(priv_dir,_) ->
".".
-else.
%% When run in test server.
--export([all/1, init_per_testcase/2, fin_per_testcase/2, not_run/1]).
+-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, not_run/1]).
-export([basic/1, return/1, on_and_off/1, stack_grow/1,
info/1, tracer/1, combo/1, nosilent/1]).
@@ -73,19 +75,36 @@ init_per_testcase(_Case, Config) ->
?line Dog=test_server:timetrap(test_server:minutes(5)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
shutdown(),
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-all(doc) ->
- ["Test meta tracing of local function calls and return trace."];
-all(suite) ->
- case test_server:is_native(?MODULE) of
- true -> [not_run];
- false -> [basic, return, on_and_off, stack_grow,
- info, tracer, combo, nosilent]
- end.
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+case test_server:is_native(trace_meta_SUITE) of
+ true -> [not_run];
+ false ->
+ [basic, return, on_and_off, stack_grow, info, tracer,
+ combo, nosilent]
+end.
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
not_run(Config) when is_list(Config) ->
{skipped,"Native code"}.
@@ -594,11 +613,6 @@ loop(D1,D2,D3,0) ->
loop(D1,D2,D3,N) ->
max(N,loop(D1,D2,D3,N-1)).
-max(A,B) when A > B ->
- A;
-max(_A,B) ->
- B.
-
id(X) ->
X.
diff --git a/erts/emulator/test/trace_nif_SUITE.erl b/erts/emulator/test/trace_nif_SUITE.erl
index 587cc08979..a7484a22fd 100644
--- a/erts/emulator/test/trace_nif_SUITE.erl
+++ b/erts/emulator/test/trace_nif_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2011. 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
@@ -19,9 +19,10 @@
-module(trace_nif_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/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([trace_nif/1,
trace_nif_timestamp/1,
trace_nif_local/1,
@@ -32,19 +33,33 @@
-export([nif_process/0, nif/0, nif/1]).
-all(suite) ->
- case test_server:is_native(?MODULE) of
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ case test_server:is_native(trace_nif_SUITE) of
true -> [not_run];
false ->
- [trace_nif,
- trace_nif_timestamp,
- trace_nif_local,
- trace_nif_meta,
- trace_nif_timestamp_local,
- trace_nif_return
- ]
+ [trace_nif, trace_nif_timestamp, trace_nif_local,
+ trace_nif_meta, trace_nif_timestamp_local,
+ trace_nif_return]
end.
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
not_run(Config) when is_list(Config) ->
{skipped,"Native code"}.
diff --git a/erts/emulator/test/trace_port_SUITE.erl b/erts/emulator/test/trace_port_SUITE.erl
index 5febe177f9..0026da4979 100644
--- a/erts/emulator/test/trace_port_SUITE.erl
+++ b/erts/emulator/test/trace_port_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -20,7 +20,9 @@
-module(trace_port_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
call_trace/1,
return_trace/1,
send/1,
@@ -34,29 +36,42 @@
gc/1,
default_tracer/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-test_cases() ->
- [call_trace,
- return_trace,
- send,
- receive_trace,
- process_events,
- schedule,
- fake_schedule,
+test_cases() ->
+ [call_trace, return_trace, send, receive_trace,
+ process_events, schedule, fake_schedule,
fake_schedule_after_register,
fake_schedule_after_getting_linked,
- fake_schedule_after_getting_unlinked,
- gc,
+ fake_schedule_after_getting_unlinked, gc,
default_tracer].
-all(suite) -> test_cases().
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ test_cases().
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog = ?t:timetrap(?t:seconds(30)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog).
diff --git a/erts/emulator/test/tuple_SUITE.erl b/erts/emulator/test/tuple_SUITE.erl
index c4edb16d68..bfc3910742 100644
--- a/erts/emulator/test/tuple_SUITE.erl
+++ b/erts/emulator/test/tuple_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -17,11 +17,13 @@
%% %CopyrightEnd%
%%
-module(tuple_SUITE).
--export([all/1, t_size/1, t_tuple_size/1, t_element/1, t_setelement/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ t_size/1, t_tuple_size/1, t_element/1, t_setelement/1,
t_list_to_tuple/1, t_tuple_to_list/1,
t_make_tuple_2/1, t_make_tuple_3/1, t_append_element/1,
build_and_match/1, tuple_with_case/1, tuple_in_guard/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% Tests tuples and the BIFs:
%%
@@ -33,13 +35,30 @@
%% make_tuple/2
%%
-all(suite) ->
- [build_and_match, t_size, t_tuple_size,
- t_list_to_tuple, t_tuple_to_list,
- t_element, t_setelement, t_make_tuple_2,
- t_make_tuple_3, t_append_element,
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [build_and_match, t_size, t_tuple_size, t_list_to_tuple,
+ t_tuple_to_list, t_element, t_setelement,
+ t_make_tuple_2, t_make_tuple_3, t_append_element,
tuple_with_case, tuple_in_guard].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
build_and_match(Config) when is_list(Config) ->
?line {} = id({}),
?line {1} = id({1}),
@@ -80,7 +99,7 @@ t_tuple_size(Config) when is_list(Config) ->
ludicrous_tuple_size(T)
when tuple_size(T) =:= 16#7777777777777777777777777777777777 -> ok;
-ludicrous_tuple_size(T) -> error.
+ludicrous_tuple_size(_) -> error.
%% Tests element/2.
diff --git a/erts/emulator/test/z_SUITE.erl b/erts/emulator/test/z_SUITE.erl
index 67d2b288a2..4b3075a164 100644
--- a/erts/emulator/test/z_SUITE.erl
+++ b/erts/emulator/test/z_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -29,10 +29,12 @@
%-define(line_trace, 1).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%-compile(export_all).
--export([all/1, init_per_testcase/2, fin_per_testcase/2]).
+-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([schedulers_alive/1, node_container_refc_check/1,
long_timers/1, pollset_size/1,
@@ -40,19 +42,33 @@
-define(DEFAULT_TIMEOUT, ?t:minutes(5)).
-all(doc) -> [];
-all(suite) ->
- [schedulers_alive,
- node_container_refc_check,
- long_timers,
- pollset_size,
- check_io_debug].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [schedulers_alive, node_container_refc_check,
+ long_timers, pollset_size, check_io_debug].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Case, Config) when is_list(Config) ->
Dog = ?t:timetrap(?DEFAULT_TIMEOUT),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) when is_list(Config) ->
+end_per_testcase(_Case, Config) when is_list(Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
diff --git a/erts/emulator/utils/beam_makeops b/erts/emulator/utils/beam_makeops
index de19a2e35b..e7c57142c0 100755
--- a/erts/emulator/utils/beam_makeops
+++ b/erts/emulator/utils/beam_makeops
@@ -27,6 +27,7 @@ my $outdir = "."; # Directory for output files.
my $verbose = 0;
my $hot = 1;
my $num_file_opcodes = 0;
+my $wordsize = 32;
# This is shift counts and mask for the packer.
my $WHOLE_WORD = '';
@@ -36,12 +37,20 @@ my @pack_mask;
$pack_instr[2] = ['6', 'i'];
$pack_instr[3] = ['0', '0', 'i'];
+$pack_instr[4] = ['6', '6', '6', 'i']; # Only for 64 bit wordsize
$pack_shift[2] = ['0', 'BEAM_LOOSE_SHIFT'];
$pack_shift[3] = ['0', 'BEAM_TIGHT_SHIFT', '(2*BEAM_TIGHT_SHIFT)'];
+$pack_shift[4] = ['0', 'BEAM_LOOSE_SHIFT', # Only for 64 bit wordsize
+ '(2*BEAM_LOOSE_SHIFT)',
+ '(3*BEAM_LOOSE_SHIFT)'];
$pack_mask[2] = ['BEAM_LOOSE_MASK', $WHOLE_WORD];
$pack_mask[3] = ['BEAM_TIGHT_MASK', 'BEAM_TIGHT_MASK', 'BEAM_TIGHT_MASK'];
+$pack_mask[4] = ['BEAM_LOOSE_MASK', # Only for 64 bit wordsize
+ 'BEAM_LOOSE_MASK',
+ 'BEAM_LOOSE_MASK',
+ $WHOLE_WORD];
# There are two types of instructions: generic and specific.
# The generic instructions are those generated by the Beam compiler.
@@ -80,6 +89,8 @@ my %cold_code;
my @unnumbered_generic;
my %unnumbered;
+my %is_transformed;
+
#
# Code transformations.
#
@@ -118,7 +129,8 @@ my %arg_size = ('r' => 0, # x(0) - x register zero
't' => 1, # untagged integer -- can be packed
'b' => 1, # pointer to bif
'A' => 1, # arity value
- 'P' => 1, # byte offset into tuple
+ 'P' => 1, # byte offset into tuple or stack
+ 'Q' => 1, # like 'P', but packable
'h' => 1, # character
'l' => 1, # float reg
'q' => 1, # literal term
@@ -157,6 +169,7 @@ my @tag_type;
$type_bit{'U'} = $type_bit{'u'};
$type_bit{'e'} = $type_bit{'u'};
$type_bit{'P'} = $type_bit{'u'};
+ $type_bit{'Q'} = $type_bit{'u'};
}
#
@@ -169,6 +182,7 @@ while (@ARGV && $ARGV[0] =~ /^-(.*)/) {
($target = \&emulator_output), next if /^emulator/;
($target = \&compiler_output), next if /^compiler/;
($outdir = shift), next if /^outdir/;
+ ($wordsize = shift), next if /^wordsize/;
($verbose = 1), next if /^v/;
die "$0: Bad option: -$_\n";
}
@@ -474,8 +488,9 @@ sub emulator_output {
$gen_transform_offset{$key} : -1;
my($spec_op) = $gen_to_spec{$key};
my($num_specific) = $num_specific{$key};
- defined $spec_op or $tr != -1 or
+ defined $spec_op or
$obsolete[$gen_opnum{$name,$arity}] or
+ $is_transformed{$name,$arity} or
error("instruction $key has no specific instruction");
$spec_op = -1 unless defined $spec_op;
&init_item($name, $arity, $spec_op, $num_specific, $tr, $min_window{$key});
@@ -498,12 +513,14 @@ sub emulator_output {
print "#define NUM_SPECIFIC_OPS ", scalar(@op_to_name), "\n";
print "\n";
print "#ifdef ARCH_64\n";
+ print "# define BEAM_WIDE_MASK 0xFFFFUL\n";
print "# define BEAM_LOOSE_MASK 0x1FFFUL\n";
print "#if HALFWORD_HEAP\n";
print "# define BEAM_TIGHT_MASK 0x1FFCUL\n";
print "#else\n";
print "# define BEAM_TIGHT_MASK 0x1FF8UL\n";
print "#endif\n";
+ print "# define BEAM_WIDE_SHIFT 32\n";
print "# define BEAM_LOOSE_SHIFT 16\n";
print "# define BEAM_TIGHT_SHIFT 16\n";
print "#else\n";
@@ -796,6 +813,7 @@ sub basic_generator {
'I' => 1,
't' => 1,
'P' => 1,
+ 'Q' => 1,
);
# Pick up the macro to use and its flags (if any).
@@ -916,7 +934,18 @@ sub basic_generator {
$var_decls .= "BeamInstr tmp_packed2;"
if $macro_code =~ /tmp_packed2/;
if ($flags =~ /-nonext/) {
- $code = "$macro_code\n";
+ $code = join("\n",
+ "{ $var_decls",
+ $macro_code,
+ "}");
+ } elsif ($flags =~ /-goto:(\S*)/) {
+ my $goto = $1;
+ $code = join("\n",
+ "{ $var_decls",
+ $macro_code,
+ "I += $size + 1;",
+ "goto $goto;",
+ "}");
} else {
$code = join("\n",
"{ $var_decls",
@@ -935,18 +964,31 @@ sub basic_generator {
sub do_pack {
my(@args) = @_;
- my($i);
my($packable_args) = 0;
+ my @is_packable; # Packability (boolean) for each argument.
+ my $wide_packing = 0;
#
# Count the number of packable arguments. If we encounter any 's' or 'd'
# arguments, packing is not possible.
#
- for ($i = 0; $i < @args; $i++) {
- if ($args[$i] =~ /[xyt]/) {
+ my $packable_types = "xytQ";
+ foreach my $arg (@args) {
+ if ($arg =~ /^[$packable_types]/) {
$packable_args++;
- } elsif ($args[$i] =~ /[sd]/) {
+ push @is_packable, 1;
+ } elsif ($arg =~ /^I/ and $wordsize == 64 and $packable_args < 2) {
+ $wide_packing = 1;
+ push @is_packable, 1;
+ if (++$packable_args == 2) {
+ # We can only pack two arguments. Turn off packing
+ # for the rest of the arguments.
+ $packable_types = "\xFF";
+ }
+ } elsif ($arg =~ /^[sd]/) {
return ('', '', @args);
+ } else {
+ push @is_packable, 0;
}
}
@@ -962,10 +1004,27 @@ sub do_pack {
# beginning).
my($up) = ''; # Pack commands (storing back while
# moving forward).
- my($args_per_word) = $packable_args < 4 ? $packable_args : 2;
- my(@shift) = @{$pack_shift[$args_per_word]};
- my(@mask) = @{$pack_mask[$args_per_word]};
- my(@pack_instr) = @{$pack_instr[$args_per_word]};
+ my $args_per_word;
+ if ($packable_args < 4 or $wordsize == 64) {
+ $args_per_word = $packable_args;
+ } else {
+ # 4 packable argument, 32 bit wordsize. Need 2 words.
+ $args_per_word = 2;
+ }
+
+ my @shift;
+ my @mask;
+ my @instr;
+
+ if ($wide_packing) {
+ @shift = ('0', 'BEAM_WIDE_SHIFT');
+ @mask = ('BEAM_WIDE_MASK', $WHOLE_WORD);
+ @instr = ('w', 'i');
+ } else {
+ @shift = @{$pack_shift[$args_per_word]};
+ @mask = @{$pack_mask[$args_per_word]};
+ @instr = @{$pack_instr[$args_per_word]};
+ }
#
# Now generate the packing instructions. One complication is that
@@ -979,10 +1038,10 @@ sub do_pack {
my($ap) = 0; # Argument number within word.
my($tmpnum) = 1; # Number of temporary variable.
my($expr) = '';
- for ($i = 0; $i < @args; $i++) {
+ for (my $i = 0; $i < @args; $i++) {
my($reg) = $args[$i];
my($this_size) = $arg_size{$reg};
- if ($reg =~ /[xyt]/) {
+ if ($is_packable[$i]) {
$this_size = 0;
$did_some_packing = 1;
@@ -993,7 +1052,7 @@ sub do_pack {
$this_size = 1;
}
- $down = "$pack_instr[$ap]$down";
+ $down = "$instr[$ap]$down";
my($unpack) = &make_unpack($tmpnum, $shift[$ap], $mask[$ap]);
$args[$i] = "pack:$this_size:$reg" . "b($unpack)";
@@ -1103,6 +1162,10 @@ sub compile_transform {
if ($obsolete[$gen_opnum{$name,$arity}]) {
error("obsolete function must not be used in transformations");
}
+
+ if ($src) {
+ $is_transformed{$name,$arity} = 1;
+ }
[$name,$arity,@ops];
}
@@ -1291,13 +1354,28 @@ sub tr_gen_from {
my($var, $type, $type_val, $cond, $val) = @$op;
if ($type ne '' && $type ne '*') {
- my($types) = '';
- my($type_mask) = 0;
- foreach (split('', $type)) {
- $types .= "$_ ";
- $type_mask |= $type_bit{$_};
+ #
+ # The is_bif, is_not_bif, and is_func instructions have
+ # their own built-in type test and don't need to
+ # be guarded with a type test instruction.
+ #
+ unless ($cond eq 'is_bif' or
+ $cond eq 'is_not_bif' or
+ $cond eq 'is_func') {
+ my($types) = '';
+ my($type_mask) = 0;
+ foreach (split('', $type)) {
+ $types .= "$_ ";
+ $type_mask |= $type_bit{$_};
+ }
+ if ($cond ne 'is_eq') {
+ push(@code, &make_op($types, 'is_type', $type_mask));
+ } else {
+ $cond = '';
+ push(@code, &make_op($types, 'is_type_eq',
+ $type_mask, $val));
+ }
}
- push(@code, &make_op($types, 'is_type', $type_mask));
}
if ($cond eq 'is_func') {
diff --git a/erts/emulator/utils/count b/erts/emulator/utils/count
new file mode 100755
index 0000000000..617f5c25e8
--- /dev/null
+++ b/erts/emulator/utils/count
@@ -0,0 +1,127 @@
+%% -*- erlang -*-
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1998-2010. 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%
+%%
+
+-mode(compile).
+
+main(_) ->
+ DisDir = "./dis",
+ ok = filelib:ensure_dir(filename:join(DisDir, "dummy")),
+ io:format("Dissambling to ~s\n", [DisDir]),
+ ok = file:set_cwd(DisDir),
+ Path = code:get_path() -- ["."],
+ Beams0 = [filelib:wildcard(filename:join(Dir, "*.beam")) ||
+ Dir <- Path],
+ Beams = lists:append(Beams0),
+ Mods0 = [list_to_atom(filename:rootname(filename:basename(F))) ||
+ F <- Beams],
+ Mods = lists:usort(Mods0),
+ start_sem(),
+ Ps = [begin
+ {_,Ref} = spawn_monitor(fun() -> count(M) end),
+ Ref
+ end || M <- Mods],
+ [put(list_to_atom(I), 0) || I <- erts_debug:instructions()],
+ Res = wait_for_all(Ps, 1),
+ OutFile = "count",
+ {ok,Out} = file:open(OutFile, [write]),
+ [io:format(Out, "~s ~p\n", [I,C]) || {I,C} <- Res],
+ ok = file:close(Out),
+ io:format("\nResult written to ~s\n",
+ [filename:join(DisDir, OutFile)]),
+ ok.
+
+wait_for_all([], _) ->
+ lists:reverse(lists:keysort(2, get()));
+wait_for_all([_|_]=Ps, I) ->
+ receive
+ {'DOWN',Ref,process,_,Result} ->
+ io:format("\r~p", [I]),
+ [increment(Key, Count) || {Key,Count} <- Result],
+ wait_for_all(Ps -- [Ref], I+1)
+ end.
+
+count(M) ->
+ down(),
+ erts_debug:df(M),
+ {ok,Fd} = file:open(atom_to_list(M) ++ ".dis", [read,raw]),
+ count_is(Fd),
+ ok = file:close(Fd),
+ exit(get()).
+
+count_is(Fd) ->
+ case file:read_line(Fd) of
+ {ok,Line} ->
+ count_instr(Line),
+ count_is(Fd);
+ eof ->
+ ok
+ end.
+
+count_instr([$\s|T]) ->
+ count_instr_1(T, []);
+count_instr([_|T]) ->
+ count_instr(T);
+count_instr([]) ->
+ %% Empty line.
+ ok.
+
+count_instr_1([$\s|_], Acc) ->
+ Instr = list_to_atom(lists:reverse(Acc)),
+ increment(Instr, 1);
+count_instr_1([H|T], Acc) ->
+ count_instr_1(T, [H|Acc]).
+
+increment(Key, Inc) ->
+ case get(Key) of
+ undefined ->
+ put(Key, Inc);
+ Count ->
+ put(Key, Count+Inc)
+ end.
+
+%%%
+%%% Counting sempahore to limit the number of processes that
+%%% can run concurrently.
+%%%
+
+down() ->
+ sem ! {down,self()},
+ receive
+ sem_taken -> ok
+ end.
+
+start_sem() ->
+ spawn(fun() ->
+ register(sem, self()),
+ process_flag(trap_exit, true),
+ do_sem(erlang:system_info(schedulers)+1) end).
+
+do_sem(0) ->
+ receive
+ {'EXIT',_,_} ->
+ do_sem(1)
+ end;
+do_sem(C) ->
+ receive
+ {down,Pid} ->
+ link(Pid),
+ Pid ! sem_taken,
+ do_sem(C-1)
+ end.
diff --git a/erts/emulator/utils/loaded b/erts/emulator/utils/loaded
new file mode 100644
index 0000000000..d124a64a78
--- /dev/null
+++ b/erts/emulator/utils/loaded
@@ -0,0 +1,44 @@
+%% -*- erlang -*-
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1998-2011. 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%
+%%
+
+%% Run like:
+%% $ERL_TOP/bin/escript erts/emulator/utils/loaded
+
+-mode(compile).
+
+main(_) ->
+ LibDir = code:lib_dir(),
+ io:format("Library root is ~s\n", [LibDir]),
+ Wc = filename:join(LibDir, "*/ebin/*.beam"),
+ Beams = filelib:wildcard(Wc),
+ BeamFileSize = lists:sum([filelib:file_size(Beam) || Beam <- Beams]),
+ io:format("~w BEAM files containing ~w bytes\n",
+ [length(Beams),BeamFileSize]),
+ Ms = [list_to_atom(filename:rootname(filename:basename(Beam))) ||
+ Beam <- Beams],
+ [{module,_} = code:ensure_loaded(M) || M <- Ms],
+ <<"Current code: ",T/binary>> = erlang:system_info(loaded),
+ Digits = grab_digits(T),
+ io:format("~w modules comprising ~s words when loaded\n",
+ [length(Ms),Digits]).
+
+grab_digits(<<H,T/binary>>) when $0 =< H, H =< $9 ->
+ [H|grab_digits(T)];
+grab_digits(<<$\n,_/binary>>) -> [].
diff --git a/erts/epmd/src/epmd.c b/erts/epmd/src/epmd.c
index 65ff0cd6b2..a1f202251c 100644
--- a/erts/epmd/src/epmd.c
+++ b/erts/epmd/src/epmd.c
@@ -33,6 +33,7 @@
static void usage(EpmdVars *);
static void run_daemon(EpmdVars*);
+static char* get_addresses(void);
static int get_port_no(void);
static int check_relaxed(void);
#ifdef __WIN32__
@@ -133,6 +134,7 @@ int main(int argc, char** argv)
{
EpmdVars g_empd_vars;
EpmdVars *g = &g_empd_vars;
+ int i;
#ifdef __WIN32__
WORD wVersionRequested;
WSADATA wsaData;
@@ -158,8 +160,9 @@ int main(int argc, char** argv)
g->argv = NULL;
#endif
- g->port = get_port_no();
- g->debug = 0;
+ g->addresses = get_addresses();
+ g->port = get_port_no();
+ g->debug = 0;
g->silent = 0;
g->is_daemon = 0;
@@ -168,12 +171,14 @@ int main(int argc, char** argv)
g->delay_accept = 0;
g->delay_write = 0;
g->progname = argv[0];
- g->listenfd = -1;
g->conn = NULL;
g->nodes.reg = g->nodes.unreg = g->nodes.unreg_tail = NULL;
g->nodes.unreg_count = 0;
g->active_conn = 0;
+ for (i = 0; i < MAX_LISTEN_SOCKETS; i++)
+ g->listenfd[i] = -1;
+
argc--;
argv++;
while (argc > 0) {
@@ -208,6 +213,11 @@ int main(int argc, char** argv)
else
usage(g);
epmd_cleanup_exit(g,0);
+ } else if (strcmp(argv[0], "-address") == 0) {
+ if (argc == 1)
+ usage(g);
+ g->addresses = argv[1];
+ argv += 2; argc -= 2;
} else if (strcmp(argv[0], "-port") == 0) {
if ((argc == 1) ||
((g->port = atoi(argv[1])) == 0))
@@ -252,13 +262,10 @@ int main(int argc, char** argv)
/*
* max_conn must not be greater than FD_SETSIZE.
* (at least QNX crashes)
- *
- * More correctly, it must be FD_SETSIZE - 1, beacuse the
- * listen FD is stored outside the connection array.
*/
if (g->max_conn > FD_SETSIZE) {
- g->max_conn = FD_SETSIZE - 1;
+ g->max_conn = FD_SETSIZE;
}
if (g->is_daemon) {
@@ -393,11 +400,14 @@ static void run_daemon(EpmdVars *g)
static void usage(EpmdVars *g)
{
- fprintf(stderr, "usage: epmd [-d|-debug] [DbgExtra...] [-port No] [-daemon]\n");
- fprintf(stderr, " [-relaxed_command_check]\n");
+ fprintf(stderr, "usage: epmd [-d|-debug] [DbgExtra...] [-address List]\n");
+ fprintf(stderr, " [-port No] [-daemon] [-relaxed_command_check]\n");
fprintf(stderr, " epmd [-d|-debug] [-port No] [-names|-kill|-stop name]\n\n");
fprintf(stderr, "See the Erlang epmd manual page for info about the usage.\n\n");
fprintf(stderr, "Regular options\n");
+ fprintf(stderr, " -address List\n");
+ fprintf(stderr, " Let epmd listen only on the comma-separated list of IP\n");
+ fprintf(stderr, " addresses (and on the loopback interface).\n");
fprintf(stderr, " -port No\n");
fprintf(stderr, " Let epmd listen to another port than default %d\n",
EPMD_PORT_NO);
@@ -433,7 +443,7 @@ static void usage(EpmdVars *g)
fprintf(stderr, " List names registered with the currently "
"running epmd\n");
fprintf(stderr, " -kill\n");
- fprintf(stderr, " Kill the currently runniing epmd\n");
+ fprintf(stderr, " Kill the currently running epmd\n");
fprintf(stderr, " (only allowed if -names show empty database or\n");
fprintf(stderr, " -relaxed_command_check was given when epmd was started).\n");
fprintf(stderr, " -stop Name\n");
@@ -487,8 +497,8 @@ static void dbg_gen_printf(int onsyslog,int perr,int from_level,
(int) strlen(timestr)-1, timestr);
len = strlen(buf);
erts_vsnprintf(buf + len, DEBUG_BUFFER_SIZE - len, format, args);
- if (perr == 1)
- perror(buf);
+ if (perr != 0)
+ fprintf(stderr,"%s: %s\r\n",buf,strerror(perr));
else
fprintf(stderr,"%s\r\n",buf);
}
@@ -499,7 +509,7 @@ void dbg_perror(EpmdVars *g,const char *format,...)
{
va_list args;
va_start(args, format);
- dbg_gen_printf(1,1,0,g,format,args);
+ dbg_gen_printf(1,errno,0,g,format,args);
va_end(args);
}
@@ -555,8 +565,9 @@ void epmd_cleanup_exit(EpmdVars *g, int exitval)
epmd_conn_close(g,&g->conn[i]);
free(g->conn);
}
- if(g->listenfd >= 0)
- close(g->listenfd);
+ for(i=0; i < MAX_LISTEN_SOCKETS; i++)
+ if(g->listenfd[i] >= 0)
+ close(g->listenfd[i]);
free_all_nodes(g);
if(g->argv){
for(i=0; g->argv[i] != NULL; ++i)
@@ -568,6 +579,10 @@ void epmd_cleanup_exit(EpmdVars *g, int exitval)
exit(exitval);
}
+static char* get_addresses(void)
+{
+ return getenv("ERL_EPMD_ADDRESS");
+}
static int get_port_no(void)
{
char* port_str = getenv("ERL_EPMD_PORT");
diff --git a/erts/epmd/src/epmd_cli.c b/erts/epmd/src/epmd_cli.c
index 7c60ba0420..ac55ba6bb6 100644
--- a/erts/epmd/src/epmd_cli.c
+++ b/erts/epmd/src/epmd_cli.c
@@ -137,7 +137,7 @@ static int conn_to_epmd(EpmdVars *g)
{ /* store port number in unsigned short */
unsigned short sport = g->port;
- SET_ADDR_LOOPBACK(address, FAMILY, sport);
+ SET_ADDR(address, EPMD_ADDR_LOOPBACK, sport);
}
if (connect(connect_sock, (struct sockaddr*)&address, sizeof address) < 0)
diff --git a/erts/epmd/src/epmd_int.h b/erts/epmd/src/epmd_int.h
index c2558d52a1..2a0de4df9c 100644
--- a/erts/epmd/src/epmd_int.h
+++ b/erts/epmd/src/epmd_int.h
@@ -168,42 +168,40 @@
#if defined(HAVE_IN6) && defined(AF_INET6) && defined(EPMD6)
#define EPMD_SOCKADDR_IN sockaddr_in6
-#define FAMILY AF_INET6
-
-#define SET_ADDR_LOOPBACK(addr, af, port) do { \
- memset((char*)&(addr), 0, sizeof(addr)); \
- (addr).sin6_family = (af); \
- (addr).sin6_flowinfo = 0; \
- (addr).sin6_addr = in6addr_loopback; \
- (addr).sin6_port = htons(port); \
+#define EPMD_IN_ADDR in6_addr
+#define EPMD_S_ADDR s6_addr
+#define EPMD_ADDR_LOOPBACK in6addr_loopback.s6_addr
+#define EPMD_ADDR_ANY in6addr_any.s6_addr
+#define FAMILY AF_INET6
+
+#define SET_ADDR(dst, addr, port) do { \
+ memset((char*)&(dst), 0, sizeof(dst)); \
+ memcpy((char*)&(dst).sin6_addr.s6_addr, (char*)&(addr), 16); \
+ (dst).sin6_family = AF_INET6; \
+ (dst).sin6_flowinfo = 0; \
+ (dst).sin6_port = htons(port); \
} while(0)
-#define SET_ADDR_ANY(addr, af, port) do { \
- memset((char*)&(addr), 0, sizeof(addr)); \
- (addr).sin6_family = (af); \
- (addr).sin6_flowinfo = 0; \
- (addr).sin6_addr = in6addr_any; \
- (addr).sin6_port = htons(port); \
- } while(0)
+#define IS_ADDR_LOOPBACK(addr) \
+ (memcmp((addr).s6_addr, in6addr_loopback.s6_addr, 16) == 0)
#else /* Not IP v6 */
#define EPMD_SOCKADDR_IN sockaddr_in
-#define FAMILY AF_INET
-
-#define SET_ADDR_LOOPBACK(addr, af, port) do { \
- memset((char*)&(addr), 0, sizeof(addr)); \
- (addr).sin_family = (af); \
- (addr).sin_addr.s_addr = htonl(INADDR_LOOPBACK); \
- (addr).sin_port = htons(port); \
+#define EPMD_IN_ADDR in_addr
+#define EPMD_S_ADDR s_addr
+#define EPMD_ADDR_LOOPBACK htonl(INADDR_LOOPBACK)
+#define EPMD_ADDR_ANY htonl(INADDR_ANY)
+#define FAMILY AF_INET
+
+#define SET_ADDR(dst, addr, port) do { \
+ memset((char*)&(dst), 0, sizeof(dst)); \
+ (dst).sin_family = AF_INET; \
+ (dst).sin_addr.s_addr = (addr); \
+ (dst).sin_port = htons(port); \
} while(0)
-#define SET_ADDR_ANY(addr, af, port) do { \
- memset((char*)&(addr), 0, sizeof(addr)); \
- (addr).sin_family = (af); \
- (addr).sin_addr.s_addr = htonl(INADDR_ANY); \
- (addr).sin_port = htons(port); \
- } while(0)
+#define IS_ADDR_LOOPBACK(addr) ((addr).s_addr == htonl(INADDR_LOOPBACK))
#endif /* Not IP v6 */
@@ -231,6 +229,8 @@
/* Maximum length of a node name == atom name */
#define MAXSYMLEN 255
+#define MAX_LISTEN_SOCKETS 16
+
#define INBUF_SIZE 1024
#define OUTBUF_SIZE 1024
@@ -299,7 +299,8 @@ typedef struct {
Connection *conn;
Nodes nodes;
fd_set orig_read_mask;
- int listenfd;
+ int listenfd[MAX_LISTEN_SOCKETS];
+ char *addresses;
char **argv;
} EpmdVars;
diff --git a/erts/epmd/src/epmd_srv.c b/erts/epmd/src/epmd_srv.c
index ef471a473a..4d9b454f97 100644
--- a/erts/epmd/src/epmd_srv.c
+++ b/erts/epmd/src/epmd_srv.c
@@ -2,7 +2,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2011. 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
@@ -24,6 +24,10 @@
#include "epmd.h" /* Renamed from 'epmd_r4.h' */
#include "epmd_int.h"
+#ifndef INADDR_NONE
+# define INADDR_NONE 0xffffffff
+#endif
+
/*
*
* This server is a local name server for Erlang nodes. Erlang nodes can
@@ -79,89 +83,157 @@ static void print_names(EpmdVars*);
void run(EpmdVars *g)
{
- int listensock;
+ struct EPMD_SOCKADDR_IN iserv_addr[MAX_LISTEN_SOCKETS];
+ int listensock[MAX_LISTEN_SOCKETS];
+ int num_sockets;
int i;
int opt;
- struct EPMD_SOCKADDR_IN iserv_addr;
+ unsigned short sport = g->port;
node_init(g);
g->conn = conn_init(g);
dbg_printf(g,2,"try to initiate listening port %d", g->port);
-
- if ((listensock = socket(FAMILY,SOCK_STREAM,0)) < 0) {
- dbg_perror(g,"error opening stream socket");
- epmd_cleanup_exit(g,1);
- }
- g->listenfd = listensock;
+
+ if (g->addresses != NULL)
+ {
+ char *tmp;
+ char *token;
+ int loopback_ok = 0;
+
+ if ((tmp = (char *)malloc(strlen(g->addresses) + 1)) == NULL)
+ {
+ dbg_perror(g,"cannot allocate memory");
+ epmd_cleanup_exit(g,1);
+ }
+ strcpy(tmp,g->addresses);
+
+ for(token = strtok(tmp,", "), num_sockets = 0;
+ token != NULL;
+ token = strtok(NULL,", "), num_sockets++)
+ {
+ struct EPMD_IN_ADDR addr;
+#ifdef HAVE_INET_PTON
+ int ret;
+
+ if ((ret = inet_pton(FAMILY,token,&addr)) == -1)
+ {
+ dbg_perror(g,"cannot convert IP address to network format");
+ epmd_cleanup_exit(g,1);
+ }
+ else if (ret == 0)
+#elif !defined(EPMD6)
+ if ((addr.EPMD_S_ADDR = inet_addr(token)) == INADDR_NONE)
+#endif
+ {
+ dbg_tty_printf(g,0,"cannot parse IP address \"%s\"",token);
+ epmd_cleanup_exit(g,1);
+ }
+
+ if (IS_ADDR_LOOPBACK(addr))
+ loopback_ok = 1;
+
+ if (num_sockets - loopback_ok == MAX_LISTEN_SOCKETS - 1)
+ {
+ dbg_tty_printf(g,0,"cannot listen on more than %d IP addresses",
+ MAX_LISTEN_SOCKETS);
+ epmd_cleanup_exit(g,1);
+ }
+
+ SET_ADDR(iserv_addr[num_sockets],addr.EPMD_S_ADDR,sport);
+ }
+
+ free(tmp);
+
+ if (!loopback_ok)
+ {
+ SET_ADDR(iserv_addr[num_sockets],EPMD_ADDR_LOOPBACK,sport);
+ num_sockets++;
+ }
+ }
+ else
+ {
+ SET_ADDR(iserv_addr[0],EPMD_ADDR_ANY,sport);
+ num_sockets = 1;
+ }
+
+#if !defined(__WIN32__)
+ /* We ignore the SIGPIPE signal that is raised when we call write
+ twice on a socket closed by the other end. */
+ signal(SIGPIPE, SIG_IGN);
+#endif
/*
* Initialize number of active file descriptors.
* Stdin, stdout, and stderr are still open.
- * One for the listen socket.
*/
- g->active_conn = 3+1;
+ g->active_conn = 3 + num_sockets;
+ g->max_conn -= num_sockets;
+
+ FD_ZERO(&g->orig_read_mask);
+
+ for (i = 0; i < num_sockets; i++)
+ {
+ if ((listensock[i] = socket(FAMILY,SOCK_STREAM,0)) < 0)
+ {
+ dbg_perror(g,"error opening stream socket");
+ epmd_cleanup_exit(g,1);
+ }
+ g->listenfd[i] = listensock[i];
- /*
- * Note that we must not enable the SO_REUSEADDR on Windows,
- * because addresses will be reused even if they are still in use.
- */
+ /*
+ * Note that we must not enable the SO_REUSEADDR on Windows,
+ * because addresses will be reused even if they are still in use.
+ */
#if !defined(__WIN32__)
- /* We ignore the SIGPIPE signal that is raised when we call write
- twice on a socket closed by the other end. */
- signal(SIGPIPE, SIG_IGN);
-
- opt = 1; /* Set this option */
- if (setsockopt(listensock,SOL_SOCKET,SO_REUSEADDR,(char* ) &opt,
- sizeof(opt)) <0) {
- dbg_perror(g,"can't set sockopt");
- epmd_cleanup_exit(g,1);
- }
+ opt = 1;
+ if (setsockopt(listensock[i],SOL_SOCKET,SO_REUSEADDR,(char* ) &opt,
+ sizeof(opt)) <0)
+ {
+ dbg_perror(g,"can't set sockopt");
+ epmd_cleanup_exit(g,1);
+ }
#endif
- /* In rare cases select returns because there is someone
- to accept but the request is withdrawn before the
- accept function is called. We set the listen socket
- to be non blocking to prevent us from being hanging
- in accept() waiting for the next request. */
+ /* In rare cases select returns because there is someone
+ to accept but the request is withdrawn before the
+ accept function is called. We set the listen socket
+ to be non blocking to prevent us from being hanging
+ in accept() waiting for the next request. */
#if (defined(__WIN32__) || defined(NO_FCNTL))
- opt = 1;
- if (ioctl(listensock, FIONBIO, &opt) != 0) /* Gives warning in VxWorks */
+ opt = 1;
+ /* Gives warning in VxWorks */
+ if (ioctl(listensock[i], FIONBIO, &opt) != 0)
#else
- opt = fcntl(listensock, F_GETFL, 0);
- if (fcntl(listensock, F_SETFL, opt | O_NONBLOCK) == -1)
+ opt = fcntl(listensock[i], F_GETFL, 0);
+ if (fcntl(listensock[i], F_SETFL, opt | O_NONBLOCK) == -1)
#endif /* __WIN32__ || VXWORKS */
- dbg_perror(g,"failed to set non-blocking mode of listening socket %d",
- listensock);
+ dbg_perror(g,"failed to set non-blocking mode of listening socket %d",
+ listensock[i]);
- { /* store port number in unsigned short */
- unsigned short sport = g->port;
- SET_ADDR_ANY(iserv_addr, FAMILY, sport);
- }
-
- if(bind(listensock,(struct sockaddr*) &iserv_addr, sizeof(iserv_addr)) < 0 )
- {
- if (errno == EADDRINUSE)
+ if (bind(listensock[i], (struct sockaddr*) &iserv_addr[i],
+ sizeof(iserv_addr[i])) < 0)
{
- dbg_tty_printf(g,1,"there is already a epmd running at port %d",
- g->port);
- epmd_cleanup_exit(g,0);
- }
- else
- {
- dbg_perror(g,"failed to bind socket");
- epmd_cleanup_exit(g,1);
+ if (errno == EADDRINUSE)
+ {
+ dbg_tty_printf(g,1,"there is already a epmd running at port %d",
+ g->port);
+ epmd_cleanup_exit(g,0);
+ }
+ else
+ {
+ dbg_perror(g,"failed to bind socket");
+ epmd_cleanup_exit(g,1);
+ }
}
- }
-
- dbg_printf(g,2,"starting");
-
- listen(listensock, SOMAXCONN);
-
- FD_ZERO(&g->orig_read_mask);
- FD_SET(listensock,&g->orig_read_mask);
+ if(listen(listensock[i], SOMAXCONN) < 0) {
+ dbg_perror(g,"failed to listen on socket");
+ epmd_cleanup_exit(g,1);
+ }
+ FD_SET(listensock[i],&g->orig_read_mask);
+ }
dbg_tty_printf(g,2,"entering the main select() loop");
@@ -198,17 +270,18 @@ void run(EpmdVars *g)
sleep(g->delay_accept);
}
- if (FD_ISSET(listensock,&read_mask)) {
- if (do_accept(g, listensock) && g->active_conn < g->max_conn) {
- /*
- * The accept() succeeded, and we have at least one file
- * descriptor still free, which means that another accept()
- * could succeed. Go do do another select(), in case there
- * are more incoming connections waiting to be accepted.
- */
- goto select_again;
+ for (i = 0; i < num_sockets; i++)
+ if (FD_ISSET(listensock[i],&read_mask)) {
+ if (do_accept(g, listensock[i]) && g->active_conn < g->max_conn) {
+ /*
+ * The accept() succeeded, and we have at least one file
+ * descriptor still free, which means that another accept()
+ * could succeed. Go do do another select(), in case there
+ * are more incoming connections waiting to be accepted.
+ */
+ goto select_again;
+ }
}
- }
/* Check all open streams marked by select for data or a
close. We also close all open sockets except ALIVE
@@ -736,6 +809,7 @@ static int conn_open(EpmdVars *g,int fd)
for (i = 0; i < g->max_conn; i++) {
if (g->conn[i].open == EPMD_FALSE) {
struct sockaddr_in si;
+ struct sockaddr_in di;
#ifdef HAVE_SOCKLEN_T
socklen_t st;
#else
@@ -756,12 +830,16 @@ static int conn_open(EpmdVars *g,int fd)
/* Determine if connection is from localhost */
if (getpeername(s->fd,(struct sockaddr*) &si,&st) ||
st < sizeof(si)) {
- /* Failure to get peername is regarder as non local host */
+ /* Failure to get peername is regarded as non local host */
s->local_peer = EPMD_FALSE;
} else {
+ /* Only 127.x.x.x and connections from the host's IP address
+ allowed, no false positives */
s->local_peer =
- ((((unsigned) ntohl(si.sin_addr.s_addr)) & 0xFF000000U) ==
- 0x7F000000U); /* Only 127.x.x.x allowed, no false positives */
+ (((((unsigned) ntohl(si.sin_addr.s_addr)) & 0xFF000000U) ==
+ 0x7F000000U) ||
+ (getsockname(s->fd,(struct sockaddr*) &di,&st) ?
+ EPMD_FALSE : si.sin_addr.s_addr == di.sin_addr.s_addr));
}
dbg_tty_printf(g,2,(s->local_peer) ? "Local peer connected" :
"Non-local peer connected");
diff --git a/erts/epmd/test/Makefile b/erts/epmd/test/Makefile
index 13dad09ae3..54688fd90b 100644
--- a/erts/epmd/test/Makefile
+++ b/erts/epmd/test/Makefile
@@ -74,7 +74,7 @@ release_tests_spec: opt
$(INSTALL_DIR) $(RELEPMDDIR)
$(INSTALL_DATA) epmd.spec epmd.spec.vxworks $(ERL_FILES) \
$(EMAKEFILE) $(RELEPMDDIR)
- chmod -f -R u+w $(RELEPMDDIR)
+ chmod -R u+w $(RELEPMDDIR)
release_docs_spec:
diff --git a/erts/epmd/test/epmd.spec b/erts/epmd/test/epmd.spec
index 0e2496bc72..e72272cf94 100644
--- a/erts/epmd/test/epmd.spec
+++ b/erts/epmd/test/epmd.spec
@@ -1 +1 @@
-{topcase, {dir, "../epmd_test"}}.
+{suites,"../epmd_test",all}.
diff --git a/erts/epmd/test/epmd_SUITE.erl b/erts/epmd/test/epmd_SUITE.erl
index da69412e12..72c890503d 100644
--- a/erts/epmd/test/epmd_SUITE.erl
+++ b/erts/epmd/test/epmd_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -17,7 +17,7 @@
%% %CopyrightEnd%
%%
-module(epmd_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("kernel/include/file.hrl").
@@ -35,7 +35,9 @@
-record(node_info, {port, node_type, prot, lvsn, hvsn, node_name, extra}).
% Test server specific exports
--export([all/1, init_per_testcase/2, fin_per_testcase/2]).
+-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(
[
@@ -64,7 +66,7 @@
returns_valid_empty_extra/1,
returns_valid_populated_extra_with_nulls/1,
- buffer_overrun/1,
+
buffer_overrun_1/1,
buffer_overrun_2/1,
no_nonlocal_register/1,
@@ -101,42 +103,37 @@
%% all/1
%%
-all(suite) ->
- [
- register_name,
- register_names_1,
- register_names_2,
- register_duplicate_name,
- get_port_nr,
- slow_get_port_nr,
- unregister_others_name_1,
- unregister_others_name_2,
- register_overflow,
- name_with_null_inside,
- name_null_terminated,
- stupid_names_req,
-
- no_data,
- one_byte,
- two_bytes,
- partial_packet,
- zero_length,
- too_large,
- alive_req_too_small_1,
- alive_req_too_small_2,
- alive_req_too_large,
-
- returns_valid_empty_extra,
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [register_name, register_names_1, register_names_2,
+ register_duplicate_name, get_port_nr, slow_get_port_nr,
+ unregister_others_name_1, unregister_others_name_2,
+ register_overflow, name_with_null_inside,
+ name_null_terminated, stupid_names_req, no_data,
+ one_byte, two_bytes, partial_packet, zero_length,
+ too_large, alive_req_too_small_1, alive_req_too_small_2,
+ alive_req_too_large, returns_valid_empty_extra,
returns_valid_populated_extra_with_nulls,
+ {group, buffer_overrun}, no_nonlocal_register,
+ no_nonlocal_kill, no_live_killing].
+
+groups() ->
+ [{buffer_overrun, [],
+ [buffer_overrun_1, buffer_overrun_2]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
- buffer_overrun,
- %buffer_overrun_1,
- %buffer_overrun_2,
+end_per_group(_GroupName, Config) ->
+ Config.
- no_nonlocal_register,
- no_nonlocal_kill,
- no_live_killing
- ].
%%
%% Run before and after each test case
@@ -147,7 +144,7 @@ init_per_testcase(_Func, Config) ->
cleanup(),
[{watchdog, Dog} | Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
cleanup(),
Dog = ?config(watchdog, Config),
catch test_server:timetrap_cancel(Dog), % We may have canceled already
@@ -725,8 +722,6 @@ returns_valid_populated_extra_with_nulls(Config) when is_list(Config) ->
ok.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-buffer_overrun(suite) ->
- [buffer_overrun_1,buffer_overrun_2].
buffer_overrun_1(suite) ->
[];
diff --git a/erts/etc/common/dialyzer.c b/erts/etc/common/dialyzer.c
index 4453e63f1c..04e9199ef3 100644
--- a/erts/etc/common/dialyzer.c
+++ b/erts/etc/common/dialyzer.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2006-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2006-2011. 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
diff --git a/erts/etc/common/erlc.c b/erts/etc/common/erlc.c
index cd137435d1..35c360a99d 100644
--- a/erts/etc/common/erlc.c
+++ b/erts/etc/common/erlc.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1997-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1997-2011. 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
@@ -28,6 +28,7 @@
#include <winbase.h>
/* FIXE ME config_win32.h? */
#define HAVE_STRERROR 1
+#define snprintf _snprintf
#endif
#include <ctype.h>
@@ -260,6 +261,95 @@ main(int argc, char** argv)
case 'I':
PUSH2("@i", process_opt(&argc, &argv, 0));
break;
+ case 'M':
+ {
+ char *buf, *key, *val;
+ size_t buf_len;
+
+ if (argv[1][2] == '\0') { /* -M */
+ /* Push the following options:
+ * o 'makedep'
+ * o {makedep_output, standard_io}
+ */
+ buf = strsave("makedep");
+ PUSH2("@option", buf);
+
+ key = "makedep_output";
+ val = "standard_io";
+ buf_len = 1 + strlen(key) + 1 + strlen(val) + 1 + 1;
+ buf = emalloc(buf_len);
+ snprintf(buf, buf_len, "{%s,%s}", key, val);
+ PUSH2("@option", buf);
+ } else if (argv[1][3] == '\0') {
+ switch(argv[1][2]) {
+ case 'D': /* -MD */
+ /* Push the following options:
+ * o 'makedep'
+ */
+ buf = strsave("makedep");
+ PUSH2("@option", buf);
+ break;
+ case 'F': /* -MF <file> */
+ /* Push the following options:
+ * o 'makedep'
+ * o {makedep_output, <file>}
+ */
+ buf = strsave("makedep");
+ PUSH2("@option", buf);
+
+ key = "makedep_output";
+ val = process_opt(&argc, &argv, 1);
+ buf_len = 1 + strlen(key) + 2 + strlen(val) + 2 + 1;
+ buf = emalloc(buf_len);
+ snprintf(buf, buf_len, "{%s,\"%s\"}", key, val);
+ PUSH2("@option", buf);
+ break;
+ case 'T': /* -MT <target> */
+ /* Push the following options:
+ * o {makedep_target, <target>}
+ */
+ key = "makedep_target";
+ val = process_opt(&argc, &argv, 1);
+ buf_len = 1 + strlen(key) + 2 + strlen(val) + 2 + 1;
+ buf = emalloc(buf_len);
+ snprintf(buf, buf_len, "{%s,\"%s\"}", key, val);
+ PUSH2("@option", buf);
+ break;
+ case 'Q': /* -MQ <target> */
+ /* Push the following options:
+ * o {makedep_target, <target>}
+ * o makedep_quote_target
+ */
+ key = "makedep_target";
+ val = process_opt(&argc, &argv, 1);
+ buf_len = 1 + strlen(key) + 2 + strlen(val) + 2 + 1;
+ buf = emalloc(buf_len);
+ snprintf(buf, buf_len, "{%s,\"%s\"}", key, val);
+ PUSH2("@option", buf);
+
+ buf = strsave("makedep_quote_target");
+ PUSH2("@option", buf);
+ break;
+ case 'G': /* -MG */
+ /* Push the following options:
+ * o makedep_add_missing
+ */
+ buf = strsave("makedep_add_missing");
+ PUSH2("@option", buf);
+ break;
+ case 'P': /* -MP */
+ /* Push the following options:
+ * o makedep_phony
+ */
+ buf = strsave("makedep_add_missing");
+ PUSH2("@option", buf);
+ break;
+ default:
+ goto error;
+ }
+ }
+ }
+ break;
case 'o':
PUSH2("@outdir", process_opt(&argc, &argv, 0));
break;
@@ -561,6 +651,15 @@ usage(void)
{"-hybrid", "compile using hybrid-heap emulator"},
{"-help", "shows this help text"},
{"-I path", "where to search for include files"},
+ {"-M", "generate a rule for make(1) describing the dependencies"},
+ {"-MF file", "write the dependencies to 'file'"},
+ {"-MT target", "change the target of the rule emitted by dependency "
+ "generation"},
+ {"-MQ target", "same as -MT but quote characters special to make(1)"},
+ {"-MG", "consider missing headers as generated files and add them to "
+ "the dependencies"},
+ {"-MP", "add a phony target for each dependency"},
+ {"-MD", "same as -M -MT file (with default 'file')"},
{"-o name", "name output directory or file"},
{"-pa path", "add path to the front of Erlang's code path"},
{"-pz path", "add path to the end of Erlang's code path"},
diff --git a/erts/etc/common/heart.c b/erts/etc/common/heart.c
index 3e19e5f386..7a5746e630 100644
--- a/erts/etc/common/heart.c
+++ b/erts/etc/common/heart.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -727,16 +727,16 @@ static int
heart_cmd_reply(int fd, char *s)
{
struct msg m;
- int len = strlen(s) + 1; /* Include \0 */
+ int len = strlen(s);
/* if s >= MSG_BODY_SIZE, return a write
* failure immediately.
*/
- if (len > sizeof(m.fill))
+ if (len >= sizeof(m.fill))
return -1;
m.op = HEART_CMD;
- m.len = htons(len + 2); /* Include Op */
+ m.len = htons(len + 1); /* Include Op */
strcpy((char*)m.fill, s);
return write_message(fd, &m);
diff --git a/erts/etc/common/inet_gethost.c b/erts/etc/common/inet_gethost.c
index 8bd9368aa1..18ccf974aa 100644
--- a/erts/etc/common/inet_gethost.c
+++ b/erts/etc/common/inet_gethost.c
@@ -1297,7 +1297,7 @@ static int read_request(AddrByte **buff, size_t *buff_size)
}
if (siz > *buff_size) {
- if (buff_size == 0) {
+ if (*buff_size == 0) {
*buff = ALLOC((*buff_size = siz));
} else {
*buff = REALLOC(*buff, (*buff_size = siz));
diff --git a/erts/etc/common/typer.c b/erts/etc/common/typer.c
index de48daf002..c95959d52d 100644
--- a/erts/etc/common/typer.c
+++ b/erts/etc/common/typer.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2006-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2006-2011. 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
diff --git a/erts/etc/unix/cerl.src b/erts/etc/unix/cerl.src
index 73b1bafbe0..0355f2629f 100644
--- a/erts/etc/unix/cerl.src
+++ b/erts/etc/unix/cerl.src
@@ -2,7 +2,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2003-2010. All Rights Reserved.
+# Copyright Ericsson AB 2003-2011. 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
@@ -228,17 +228,30 @@ if [ $run_valgrind != yes ]; then
fi
if [ "x$GDB" = "x" ]; then
if [ $run_valgrind = yes ]; then
+ valversion=`valgrind --version`
+ valmajor=`echo $valversion | sed 's,[a-z]*\-\([0-9]*\).*,\1,'`
+ valminor=`echo $valversion | sed 's,[a-z]*\-[0-9]*.\([0-9]*\).*,\1,'`
emu_xargs=`echo $xargs | sed "s|+|-|g"`
- if [ "x$VALGRIND_LOG_DIR" = "x" ]; then
- valgrind_log=
- else
- valgrind_log="--log-file=$VALGRIND_LOG_DIR/$VALGRIND_LOGFILE_PREFIX$VALGRIND_LOGFILE_INFIX$EMU.log"
- fi
if [ "x$VALGRIND_LOG_XML" = "x" ]; then
valgrind_xml=
+ log_file_prefix="--log-file="
else
export VALGRIND_LOG_XML
valgrind_xml="--xml=yes"
+ if [ $valmajor -gt 2 -a $valminor -gt 4 ]; then
+ log_file_prefix="--xml-file="
+ else
+ log_file_prefix="--log-file="
+ fi
+ fi
+ if [ "x$VALGRIND_LOG_DIR" = "x" ]; then
+ valgrind_log=
+ else
+ if [ $valmajor -gt 2 -a $valminor -gt 4 ]; then
+ valgrind_log="$log_file_prefix$VALGRIND_LOG_DIR/$VALGRIND_LOGFILE_PREFIX$VALGRIND_LOGFILE_INFIX$EMU.log.$$"
+ else
+ valgrind_log="$log_file_prefix$VALGRIND_LOG_DIR/$VALGRIND_LOGFILE_PREFIX$VALGRIND_LOGFILE_INFIX$EMU.log"
+ fi
fi
if [ "x$VALGRIND_MISC_FLAGS" = "x" ]; then
valgrind_misc_flags=
diff --git a/erts/etc/unix/run_erl.c b/erts/etc/unix/run_erl.c
index cadff12c6f..8db8e09bee 100644
--- a/erts/etc/unix/run_erl.c
+++ b/erts/etc/unix/run_erl.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -221,6 +221,8 @@ int main(int argc, char **argv)
char *p, *ptyslave=NULL;
int i = 1;
int off_argv;
+ int calculated_pipename = 0;
+ int highest_pipe_num = 0;
program_name = argv[0];
@@ -298,10 +300,10 @@ int main(int argc, char **argv)
if(*pipename && pipename[strlen(pipename)-1] == '/') {
/* The user wishes us to find a unique pipe name in the specified */
/* directory */
- int highest_pipe_num = 0;
DIR *dirp;
struct dirent *direntp;
+ calculated_pipename = 1;
dirp = opendir(pipename);
if(!dirp) {
ERRNO_ERR1(LOG_ERR,"Can't access pipe directory '%s'.", pipename);
@@ -322,28 +324,37 @@ int main(int argc, char **argv)
PIPE_STUBNAME, highest_pipe_num+1);
} /* if */
- /* write FIFO - is read FIFO for `to_erl' program */
- strn_cpy(fifo1, sizeof(fifo1), pipename);
- strn_cat(fifo1, sizeof(fifo1), ".r");
- if (create_fifo(fifo1, PERM) < 0) {
- ERRNO_ERR1(LOG_ERR,"Cannot create FIFO %s for writing.", fifo1);
- exit(1);
- }
-
- /* read FIFO - is write FIFO for `to_erl' program */
- strn_cpy(fifo2, sizeof(fifo2), pipename);
- strn_cat(fifo2, sizeof(fifo2), ".w");
-
- /* Check that nobody is running run_erl already */
- if ((fd = open (fifo2, O_WRONLY|DONT_BLOCK_PLEASE, 0)) >= 0) {
- /* Open as client succeeded -- run_erl is already running! */
- fprintf(stderr, "Erlang already running on pipe %s.\n", pipename);
- close(fd);
- exit(1);
- }
- if (create_fifo(fifo2, PERM) < 0) {
- ERRNO_ERR1(LOG_ERR,"Cannot create FIFO %s for reading.", fifo2);
- exit(1);
+ for(;;) {
+ /* write FIFO - is read FIFO for `to_erl' program */
+ strn_cpy(fifo1, sizeof(fifo1), pipename);
+ strn_cat(fifo1, sizeof(fifo1), ".r");
+ if (create_fifo(fifo1, PERM) < 0) {
+ ERRNO_ERR1(LOG_ERR,"Cannot create FIFO %s for writing.", fifo1);
+ exit(1);
+ }
+
+ /* read FIFO - is write FIFO for `to_erl' program */
+ strn_cpy(fifo2, sizeof(fifo2), pipename);
+ strn_cat(fifo2, sizeof(fifo2), ".w");
+
+ /* Check that nobody is running run_erl already */
+ if ((fd = open (fifo2, O_WRONLY|DONT_BLOCK_PLEASE, 0)) >= 0) {
+ /* Open as client succeeded -- run_erl is already running! */
+ close(fd);
+ if (calculated_pipename) {
+ ++highest_pipe_num;
+ strn_catf(pipename, sizeof(pipename), "%s.%d",
+ PIPE_STUBNAME, highest_pipe_num+1);
+ continue;
+ }
+ fprintf(stderr, "Erlang already running on pipe %s.\n", pipename);
+ exit(1);
+ }
+ if (create_fifo(fifo2, PERM) < 0) {
+ ERRNO_ERR1(LOG_ERR,"Cannot create FIFO %s for reading.", fifo2);
+ exit(1);
+ }
+ break;
}
/*
@@ -980,9 +991,7 @@ static int open_pty_master(char **ptyslave)
static int open_pty_slave(char *name)
{
int sfd;
-#ifdef DEBUG
struct termios tty_rmode;
-#endif
if ((sfd = open(name, O_RDWR, 0)) < 0) {
return -1;
@@ -1008,6 +1017,25 @@ static int open_pty_slave(char *name)
}
#endif
+ if (getenv("RUN_ERL_DISABLE_FLOWCNTRL")) {
+ if (tcgetattr(sfd, &tty_rmode) < 0) {
+ fprintf(stderr, "Cannot get terminal's current mode\n");
+ exit(-1);
+ }
+
+ tty_rmode.c_iflag &= ~IXOFF;
+ if (tcsetattr(sfd, TCSANOW, &tty_rmode) < 0) {
+ fprintf(stderr, "Cannot disable terminal's flow control on input\n");
+ exit(-1);
+ }
+
+ tty_rmode.c_iflag &= ~IXON;
+ if (tcsetattr(sfd, TCSANOW, &tty_rmode) < 0) {
+ fprintf(stderr, "Cannot disable terminal's flow control on output\n");
+ exit(-1);
+ }
+ }
+
#ifdef DEBUG
if (tcgetattr(sfd, &tty_rmode) < 0) {
fprintf(stderr, "Cannot get terminals current mode\n");
diff --git a/erts/etc/unix/to_erl.c b/erts/etc/unix/to_erl.c
index 886b301997..b7c3c956c6 100644
--- a/erts/etc/unix/to_erl.c
+++ b/erts/etc/unix/to_erl.c
@@ -125,7 +125,7 @@ static void usage(char *pname)
int main(int argc, char **argv)
{
char FIFO1[FILENAME_MAX], FIFO2[FILENAME_MAX];
- int i, len, wfd, rfd, result = 0;
+ int i, len, wfd, rfd;
fd_set readfds;
char buf[BUFSIZ];
char pipename[FILENAME_MAX];
@@ -367,7 +367,6 @@ int main(int argc, char **argv)
}
else {
fprintf(stderr, "Error in select.\n");
- result = -1;
break;
}
}
@@ -398,7 +397,6 @@ int main(int argc, char **argv)
close(wfd);
if (len < 0) {
fprintf(stderr, "Error in reading from stdin.\n");
- result = -1;
} else {
fprintf(stderr, "[EOF]\n\r");
}
@@ -420,7 +418,6 @@ int main(int argc, char **argv)
fprintf(stderr, "Error in writing to FIFO.\n");
close(rfd);
close(wfd);
- result = -1;
break;
}
STATUS("\" OK\r\n");
@@ -447,7 +444,6 @@ int main(int argc, char **argv)
close(wfd);
if (len < 0) {
fprintf(stderr, "Error in reading from FIFO.\n");
- result = -1;
} else
fprintf(stderr, "[End]\n\r");
break;
@@ -456,7 +452,6 @@ int main(int argc, char **argv)
if ((len=version_handshake(buf,len,wfd)) < 0) {
close(rfd);
close(wfd);
- result = -1;
break;
}
if (protocol_ver >= 1) {
@@ -475,7 +470,6 @@ int main(int argc, char **argv)
fprintf(stderr, "Error in writing to terminal.\n");
close(rfd);
close(wfd);
- result = -1;
break;
}
STATUS("\" OK\r\n");
diff --git a/erts/etc/win32/erlsrv/erlsrv_service.c b/erts/etc/win32/erlsrv/erlsrv_service.c
index a58ee862c5..8891379643 100644
--- a/erts/etc/win32/erlsrv/erlsrv_service.c
+++ b/erts/etc/win32/erlsrv/erlsrv_service.c
@@ -523,7 +523,7 @@ static BOOL start_a_service(ServerInfo *srvi){
srvi->keys[WorkDir].data.bytes : NULL,
&start,
&(srvi->info))){
- sprintf(errbuff,"Could not start erlang service"
+ sprintf(errbuff,"Could not start erlang service "
"with commandline \"%s\".",
service_name,
execbuff
@@ -924,7 +924,7 @@ static VOID WINAPI service_main_loop(DWORD argc, char **argv){
} else {
DWORD ecode = NO_ERROR;
if(success_wait == NO_SUCCESS_WAIT){
- log_warning("Erlang machine volountarily stopped. "
+ log_warning("Erlang machine voluntarily stopped. "
"The service is not restarted as OnFail "
"is set to ignore.");
} else {
diff --git a/erts/etc/win32/nsis/Makefile b/erts/etc/win32/nsis/Makefile
index 981a232c69..ae2343b420 100644
--- a/erts/etc/win32/nsis/Makefile
+++ b/erts/etc/win32/nsis/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2003-2009. All Rights Reserved.
+# Copyright Ericsson AB 2003-2011. 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
diff --git a/erts/etc/win32/nsis/dll_version_helper.sh b/erts/etc/win32/nsis/dll_version_helper.sh
index 571ee3e39e..eecd4a72b5 100755
--- a/erts/etc/win32/nsis/dll_version_helper.sh
+++ b/erts/etc/win32/nsis/dll_version_helper.sh
@@ -2,7 +2,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2007-2010. All Rights Reserved.
+# Copyright Ericsson AB 2007-2011. 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
@@ -26,6 +26,7 @@
# exit 0
cat > hello.c <<EOF
+#include <windows.h>
#include <stdio.h>
int main(void)
@@ -35,14 +36,74 @@ int main(void)
}
EOF
-cl /MD hello.c > /dev/null 2>&1
+cl /MD hello.c > /dev/null 2>&1
if [ '!' -f hello.exe.manifest ]; then
- echo "This compiler does not generate manifest files - OK if using mingw" >&2
- exit 0
+ # Gah - VC 2010 changes the way it handles DLL's and manifests... Again...
+ # need another way of getting the version
+ DLLNAME=`dumpbin.exe /imports hello.exe | egrep MSVCR.*dll`
+ DLLNAME=`echo $DLLNAME`
+ cat > helper.c <<EOF
+#include <windows.h>
+#include <stdio.h>
+
+#define REQ_MODULE "$DLLNAME"
+
+int main(void)
+{
+ DWORD dummy;
+ DWORD versize;
+ int i,n;
+ unsigned char *versinfo;
+ char buff[100];
+
+ char *vs_verinfo;
+ unsigned int vs_ver_size;
+
+ struct LANGANDCODEPAGE {
+ WORD language;
+ WORD codepage;
+ } *translate;
+
+ unsigned int tr_size;
+
+ if (!(versize = GetFileVersionInfoSize(REQ_MODULE,&dummy))) {
+ fprintf(stderr,"No version info size in %s!\n",REQ_MODULE);
+ exit(1);
+ }
+ versinfo=malloc(versize);
+ if (!GetFileVersionInfo(REQ_MODULE,dummy,versize,versinfo)) {
+ fprintf(stderr,"No version info in %s!\n",REQ_MODULE);
+ exit(2);
+ }
+ if (!VerQueryValue(versinfo,"\\\\VarFileInfo\\\\Translation",&translate,&tr_size)) {
+ fprintf(stderr,"No translation info in %s!\n",REQ_MODULE);
+ exit(3);
+ }
+ n = tr_size/sizeof(translate);
+ for(i=0; i < n; ++i) {
+ sprintf(buff,"\\\\StringFileInfo\\\\%04x%04x\\\\FileVersion",
+ translate[i].language,translate[i].codepage);
+ if (VerQueryValue(versinfo,buff,&vs_verinfo,&vs_ver_size)) {
+ printf("%s\n",(char *) vs_verinfo);
+ return 0;
+ }
+ }
+ fprintf(stderr,"Failed to find file version of %s\n",REQ_MODULE);
+ return 0;
+}
+EOF
+ cl /MD helper.c version.lib > /dev/null 2>&1
+ if [ '!' -f helper.exe ]; then
+ echo "Failed to build helper program." >&2
+ exit 1
+ fi
+ NAME=$DLLNAME
+ VERSION=`./helper`
+else
+ VERSION=`grep '<assemblyIdentity' hello.exe.manifest | sed 's,.*version=.\([0-9\.]*\).*,\1,g' | grep -v '<'`
+ NAME=`grep '<assemblyIdentity' hello.exe.manifest | sed 's,.*name=.[A-Za-z\.]*\([0-9]*\).*,msvcr\1.dll,g' | grep -v '<'`
fi
-VERSION=`grep '<assemblyIdentity' hello.exe.manifest | sed 's,.*version=.\([0-9\.]*\).*,\1,g' | grep -v '<'`
-NAME=`grep '<assemblyIdentity' hello.exe.manifest | sed 's,.*name=.[A-Za-z\.]*\([0-9]*\).*,msvcr\1.dll,g' | grep -v '<'`
-rm -f hello.c hello.obj hello.exe hello.exe.manifest
+#rm -f hello.c hello.obj hello.exe hello.exe.manifest helper.c helper.obj helper.exe helper.exe.manifest
if [ "$1" = "-n" ]; then
ASKEDFOR=$NAME
else
diff --git a/erts/etc/win32/nsis/find_redist.sh b/erts/etc/win32/nsis/find_redist.sh
index 153977ded5..328811a0d7 100755
--- a/erts/etc/win32/nsis/find_redist.sh
+++ b/erts/etc/win32/nsis/find_redist.sh
@@ -2,7 +2,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2007-2010. All Rights Reserved.
+# Copyright Ericsson AB 2007-2011. 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
@@ -114,13 +114,18 @@ RCPATH=`lookup_prog_in_path rc`
fail=false
if [ '!' -z "$RCPATH" ]; then
BPATH=$RCPATH
- for x in rc bin v6.0A ; do
- NBPATH=`remove_path_element $x "$BPATH"`
- if [ "$NBPATH" = "$BPATH" ]; then
- fail=true
- break;
+ allow_fail=false
+ for x in rc bin @ANY v6.0A v7.0A v7.1; do
+ if [ $x = @ANY ]; then
+ allow_fail=true
+ else
+ NBPATH=`remove_path_element $x "$BPATH"`
+ if [ $allow_fail = false -a "$NBPATH" = "$BPATH" ]; then
+ fail=true
+ break;
+ fi
+ BPATH="$NBPATH"
fi
- BPATH="$NBPATH"
done
if [ $fail = false ]; then
BPATH_LIST="$BPATH_LIST $BPATH"
@@ -129,23 +134,32 @@ fi
# Frantic search through two roots with different
# version directories. We want to be very specific about the
-# directory structures as we woildnt want to find the wrong
+# directory structures as we wouldnt want to find the wrong
# redistributables...
-#echo $BPATH
+#echo $BPATH_LIST
for BP in $BPATH_LIST; do
- for verdir in "sdk v2.0" "sdk v3.5" "v6.0A"; do
+ #echo "BP=$BP"
+ for verdir in "sdk v2.0" "sdk v3.5" "v6.0A" "v7.0A" "v7.1"; do
BPATH=$BP
fail=false
- for x in $verdir bootstrapper packages vcredist_x86 vcredist_x86.exe; do
+ allow_fail=false
+ for x in $verdir @ANY bootstrapper packages vcredist_x86 Redist VC @ALL vcredist_x86.exe; do
#echo "x=$x"
#echo "BPATH=$BPATH"
- NBPATH=`add_path_element $x "$BPATH"`
- if [ "$NBPATH" = "$BPATH" ]; then
- fail=true
- break;
+ #echo "allow_fail=$allow_fail"
+ if [ $x = @ANY ]; then
+ allow_fail=true
+ elif [ $x = @ALL ]; then
+ allow_fail=false
+ else
+ NBPATH=`add_path_element $x "$BPATH"`
+ if [ $allow_fail = false -a "$NBPATH" = "$BPATH" ]; then
+ fail=true
+ break;
+ fi
+ BPATH="$NBPATH"
fi
- BPATH="$NBPATH"
done
if [ $fail = false ]; then
break;
diff --git a/erts/example/next_perm.cc b/erts/example/next_perm.cc
index ee81cb0404..1427cd3979 100644
--- a/erts/example/next_perm.cc
+++ b/erts/example/next_perm.cc
@@ -120,7 +120,7 @@ static void ready_async(ErlDrvData drv_data, ErlDrvThreadData async_data)
ErlDrvPort port = reinterpret_cast<ErlDrvPort>(drv_data);
our_async_data* d = reinterpret_cast<our_async_data*>(async_data);
int n = d->data.size(), result_n = n*2 + 5;
- ErlDrvTermData* result = new ErlDrvTermData[result_n], * rp = result;
+ ErlDrvTermData *result = new ErlDrvTermData[result_n], *rp = result;
*rp++ = ERL_DRV_PORT;
*rp++ = driver_mk_port(port);
for (vector<int>::iterator i = d->data.begin();
diff --git a/erts/include/internal/ethr_atomics.h b/erts/include/internal/ethr_atomics.h
new file mode 100644
index 0000000000..1caf4d0567
--- /dev/null
+++ b/erts/include/internal/ethr_atomics.h
@@ -0,0 +1,726 @@
+/*
+ * %CopyrightBegin%
+ *
+ * Copyright Ericsson AB 2010. 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%
+ */
+
+/*
+ * Description: The ethread atomic API
+ * Author: Rickard Green
+ */
+
+#ifndef ETHR_ATOMIC_H__
+#define ETHR_ATOMIC_H__
+
+#if !defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_ATOMIC_IMPL__)
+# define ETHR_NEED_ATOMIC_PROTOTYPES__
+#endif
+
+#ifndef ETHR_HAVE_NATIVE_ATOMICS
+/*
+ * No native atomic implementation available. :(
+ * Use fallback...
+ */
+typedef ethr_sint32_t ethr_atomic32_t;
+typedef ethr_sint_t ethr_atomic_t;
+#else
+/*
+ * Map ethread native atomics to ethread API atomics.
+ *
+ * We do at least have a native atomic implementation that
+ * can handle integers of a size larger than or equal to
+ * the size of pointers.
+ */
+
+/* -- Pointer size atomics -- */
+
+#undef ETHR_NAINT_T__
+#undef ETHR_NATMC_FUNC__
+#undef ETHR_NATMC_ADDR_FUNC__
+#if ETHR_SIZEOF_PTR == 8
+# if defined(ETHR_HAVE_NATIVE_ATOMIC64)
+# define ETHR_NATMC_ADDR_FUNC__ ethr_native_atomic64_addr
+typedef ethr_native_atomic64_t ethr_atomic_t;
+# define ETHR_NAINT_T__ ethr_sint64_t
+# define ETHR_NATMC_FUNC__(X) ethr_native_atomic64_ ## X
+# else
+# error "Missing native atomic implementation"
+# endif
+#elif ETHR_SIZEOF_PTR == 4
+# define ETHR_NATMC_ADDR_FUNC__ ethr_native_atomic32_addr
+# ifdef ETHR_HAVE_NATIVE_ATOMIC32
+typedef ethr_native_atomic32_t ethr_atomic_t;
+# define ETHR_NAINT_T__ ethr_sint32_t
+# define ETHR_NATMC_FUNC__(X) ethr_native_atomic32_ ## X
+# elif defined(ETHR_HAVE_NATIVE_ATOMIC64)
+typedef ethr_native_atomic64_t ethr_atomic_t;
+# define ETHR_NATMC_T__ ethr_native_atomic64_t
+# define ETHR_NAINT_T__ ethr_sint64_t
+# define ETHR_NATMC_FUNC__(X) ethr_native_atomic64_ ## X
+# else
+# error "Missing native atomic implementation"
+# endif
+#endif
+
+/* -- 32-bit atomics -- */
+
+#undef ETHR_NAINT32_T__
+#undef ETHR_NATMC32_FUNC__
+#if defined(ETHR_HAVE_NATIVE_ATOMIC32)
+typedef ethr_native_atomic32_t ethr_atomic32_t;
+# define ETHR_NAINT32_T__ ethr_sint32_t
+# define ETHR_NATMC32_FUNC__(X) ethr_native_atomic32_ ## X
+#elif defined(ETHR_HAVE_NATIVE_ATOMIC64)
+typedef ethr_native_atomic64_t ethr_atomic32_t;
+# define ETHR_NAINT32_T__ ethr_sint64_t
+# define ETHR_NATMC32_FUNC__(X) ethr_native_atomic64_ ## X
+#else
+# error "Missing native atomic implementation"
+#endif
+
+#endif
+
+#ifdef ETHR_NEED_ATOMIC_PROTOTYPES__
+ethr_sint_t *ethr_atomic_addr(ethr_atomic_t *);
+void ethr_atomic_init(ethr_atomic_t *, ethr_sint_t);
+void ethr_atomic_set(ethr_atomic_t *, ethr_sint_t);
+ethr_sint_t ethr_atomic_read(ethr_atomic_t *);
+ethr_sint_t ethr_atomic_inc_read(ethr_atomic_t *);
+ethr_sint_t ethr_atomic_dec_read(ethr_atomic_t *);
+void ethr_atomic_inc(ethr_atomic_t *);
+void ethr_atomic_dec(ethr_atomic_t *);
+ethr_sint_t ethr_atomic_add_read(ethr_atomic_t *, ethr_sint_t);
+void ethr_atomic_add(ethr_atomic_t *, ethr_sint_t);
+ethr_sint_t ethr_atomic_read_band(ethr_atomic_t *, ethr_sint_t);
+ethr_sint_t ethr_atomic_read_bor(ethr_atomic_t *, ethr_sint_t);
+ethr_sint_t ethr_atomic_xchg(ethr_atomic_t *, ethr_sint_t);
+ethr_sint_t ethr_atomic_cmpxchg(ethr_atomic_t *, ethr_sint_t, ethr_sint_t);
+ethr_sint_t ethr_atomic_read_acqb(ethr_atomic_t *);
+ethr_sint_t ethr_atomic_inc_read_acqb(ethr_atomic_t *);
+void ethr_atomic_set_relb(ethr_atomic_t *, ethr_sint_t);
+void ethr_atomic_dec_relb(ethr_atomic_t *);
+ethr_sint_t ethr_atomic_dec_read_relb(ethr_atomic_t *);
+ethr_sint_t ethr_atomic_cmpxchg_acqb(ethr_atomic_t *, ethr_sint_t, ethr_sint_t);
+ethr_sint_t ethr_atomic_cmpxchg_relb(ethr_atomic_t *, ethr_sint_t, ethr_sint_t);
+
+ethr_sint32_t *ethr_atomic32_addr(ethr_atomic32_t *);
+void ethr_atomic32_init(ethr_atomic32_t *, ethr_sint32_t);
+void ethr_atomic32_set(ethr_atomic32_t *, ethr_sint32_t);
+ethr_sint32_t ethr_atomic32_read(ethr_atomic32_t *);
+ethr_sint32_t ethr_atomic32_inc_read(ethr_atomic32_t *);
+ethr_sint32_t ethr_atomic32_dec_read(ethr_atomic32_t *);
+void ethr_atomic32_inc(ethr_atomic32_t *);
+void ethr_atomic32_dec(ethr_atomic32_t *);
+ethr_sint32_t ethr_atomic32_add_read(ethr_atomic32_t *, ethr_sint32_t);
+void ethr_atomic32_add(ethr_atomic32_t *, ethr_sint32_t);
+ethr_sint32_t ethr_atomic32_read_band(ethr_atomic32_t *, ethr_sint32_t);
+ethr_sint32_t ethr_atomic32_read_bor(ethr_atomic32_t *, ethr_sint32_t);
+ethr_sint32_t ethr_atomic32_xchg(ethr_atomic32_t *, ethr_sint32_t);
+ethr_sint32_t ethr_atomic32_cmpxchg(ethr_atomic32_t *,
+ ethr_sint32_t,
+ ethr_sint32_t);
+ethr_sint32_t ethr_atomic32_read_acqb(ethr_atomic32_t *);
+ethr_sint32_t ethr_atomic32_inc_read_acqb(ethr_atomic32_t *);
+void ethr_atomic32_set_relb(ethr_atomic32_t *, ethr_sint32_t);
+void ethr_atomic32_dec_relb(ethr_atomic32_t *);
+ethr_sint32_t ethr_atomic32_dec_read_relb(ethr_atomic32_t *);
+ethr_sint32_t ethr_atomic32_cmpxchg_acqb(ethr_atomic32_t *,
+ ethr_sint32_t,
+ ethr_sint32_t);
+ethr_sint32_t ethr_atomic32_cmpxchg_relb(ethr_atomic32_t *,
+ ethr_sint32_t,
+ ethr_sint32_t);
+#endif
+
+int ethr_init_atomics(void);
+
+#if defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_ATOMIC_IMPL__)
+
+#ifndef ETHR_HAVE_NATIVE_ATOMICS
+/*
+ * Fallbacks for atomics used in absence of a native implementation.
+ */
+
+#define ETHR_ATOMIC_ADDR_BITS 10
+#define ETHR_ATOMIC_ADDR_SHIFT 6
+
+typedef struct {
+ union {
+ ethr_spinlock_t lck;
+ char buf[ETHR_CACHE_LINE_SIZE];
+ } u;
+} ethr_atomic_protection_t;
+
+extern ethr_atomic_protection_t ethr_atomic_protection__[1 << ETHR_ATOMIC_ADDR_BITS];
+
+#define ETHR_ATOMIC_PTR2LCK__(PTR) \
+(&ethr_atomic_protection__[((((ethr_uint_t) (PTR)) >> ETHR_ATOMIC_ADDR_SHIFT) \
+ & ((1 << ETHR_ATOMIC_ADDR_BITS) - 1))].u.lck)
+
+
+#define ETHR_ATOMIC_OP_FALLBACK_IMPL__(AP, EXPS) \
+do { \
+ ethr_spinlock_t *slp__ = ETHR_ATOMIC_PTR2LCK__((AP)); \
+ ethr_spin_lock(slp__); \
+ { EXPS; } \
+ ethr_spin_unlock(slp__); \
+} while (0)
+
+#endif
+
+/*
+ * --- Pointer size atomics ---------------------------------------------------
+ */
+
+static ETHR_INLINE ethr_sint_t *
+ETHR_INLINE_FUNC_NAME_(ethr_atomic_addr)(ethr_atomic_t *var)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint_t *) ETHR_NATMC_ADDR_FUNC__(var);
+#else
+ return (ethr_sint_t *) var;
+#endif
+}
+
+static ETHR_INLINE void
+ETHR_INLINE_FUNC_NAME_(ethr_atomic_init)(ethr_atomic_t *var, ethr_sint_t i)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ ETHR_NATMC_FUNC__(init)(var, (ETHR_NAINT_T__) i);
+#else
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, *var = i);
+#endif
+}
+
+static ETHR_INLINE void
+ETHR_INLINE_FUNC_NAME_(ethr_atomic_set)(ethr_atomic_t *var, ethr_sint_t i)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ ETHR_NATMC_FUNC__(set)(var, (ETHR_NAINT_T__) i);
+#else
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, *var = i);
+#endif
+}
+
+static ETHR_INLINE ethr_sint_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic_read)(ethr_atomic_t *var)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint_t) ETHR_NATMC_FUNC__(read)(var);
+#else
+ ethr_sint_t res;
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, res = *var);
+ return res;
+#endif
+}
+
+static ETHR_INLINE void
+ETHR_INLINE_FUNC_NAME_(ethr_atomic_add)(ethr_atomic_t *var, ethr_sint_t incr)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ ETHR_NATMC_FUNC__(add)(var, (ETHR_NAINT_T__) incr);
+#else
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, *var += incr);
+#endif
+}
+
+static ETHR_INLINE ethr_sint_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic_add_read)(ethr_atomic_t *var, ethr_sint_t i)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint_t) ETHR_NATMC_FUNC__(add_return)(var, (ETHR_NAINT_T__) i);
+#else
+ ethr_sint_t res;
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, *var += i; res = *var);
+ return res;
+#endif
+}
+
+static ETHR_INLINE void
+ETHR_INLINE_FUNC_NAME_(ethr_atomic_inc)(ethr_atomic_t *var)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ ETHR_NATMC_FUNC__(inc)(var);
+#else
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, ++(*var));
+#endif
+}
+
+static ETHR_INLINE void
+ETHR_INLINE_FUNC_NAME_(ethr_atomic_dec)(ethr_atomic_t *var)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ ETHR_NATMC_FUNC__(dec)(var);
+#else
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, --(*var));
+#endif
+}
+
+static ETHR_INLINE ethr_sint_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic_inc_read)(ethr_atomic_t *var)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint_t) ETHR_NATMC_FUNC__(inc_return)(var);
+#else
+ ethr_sint_t res;
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, res = ++(*var));
+ return res;
+#endif
+}
+
+static ETHR_INLINE ethr_sint_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic_dec_read)(ethr_atomic_t *var)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint_t) ETHR_NATMC_FUNC__(dec_return)(var);
+#else
+ ethr_sint_t res;
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, res = --(*var));
+ return res;
+#endif
+}
+
+static ETHR_INLINE ethr_sint_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic_read_band)(ethr_atomic_t *var,
+ ethr_sint_t mask)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint_t) ETHR_NATMC_FUNC__(and_retold)(var,
+ (ETHR_NAINT_T__) mask);
+#else
+ ethr_sint_t res;
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, res = *var; *var &= mask);
+ return res;
+#endif
+}
+
+static ETHR_INLINE ethr_sint_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic_read_bor)(ethr_atomic_t *var,
+ ethr_sint_t mask)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint_t) ETHR_NATMC_FUNC__(or_retold)(var,
+ (ETHR_NAINT_T__) mask);
+#else
+ ethr_sint_t res;
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, res = *var; *var |= mask);
+ return res;
+#endif
+}
+
+static ETHR_INLINE ethr_sint_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic_xchg)(ethr_atomic_t *var, ethr_sint_t new)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint_t) ETHR_NATMC_FUNC__(xchg)(var,
+ (ETHR_NAINT_T__) new);
+#else
+ ethr_sint_t res;
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, res = *var; *var = new);
+ return res;
+#endif
+}
+
+static ETHR_INLINE ethr_sint_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic_cmpxchg)(ethr_atomic_t *var,
+ ethr_sint_t new,
+ ethr_sint_t exp)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint_t) ETHR_NATMC_FUNC__(cmpxchg)(var,
+ (ETHR_NAINT_T__) new,
+ (ETHR_NAINT_T__) exp);
+#else
+ ethr_sint_t res;
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var,
+ {
+ res = *var;
+ if (__builtin_expect(res == exp, 1))
+ *var = new;
+ });
+ return res;
+#endif
+}
+
+/*
+ * Important memory barrier requirements.
+ *
+ * The following atomic operations *must* supply a memory barrier of
+ * at least the type specified by its suffix:
+ * _acqb = acquire barrier
+ * _relb = release barrier
+ */
+
+static ETHR_INLINE ethr_sint_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic_read_acqb)(ethr_atomic_t *var)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint_t) ETHR_NATMC_FUNC__(read_acqb)(var);
+#else
+ return ETHR_INLINE_FUNC_NAME_(ethr_atomic_read)(var);
+#endif
+}
+
+static ETHR_INLINE ethr_sint_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic_inc_read_acqb)(ethr_atomic_t *var)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint_t) ETHR_NATMC_FUNC__(inc_return_acqb)(var);
+#else
+ return ETHR_INLINE_FUNC_NAME_(ethr_atomic_inc_read)(var);
+#endif
+}
+
+static ETHR_INLINE void
+ETHR_INLINE_FUNC_NAME_(ethr_atomic_set_relb)(ethr_atomic_t *var,
+ ethr_sint_t val)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ ETHR_NATMC_FUNC__(set_relb)(var, (ETHR_NAINT_T__) val);
+#else
+ ETHR_INLINE_FUNC_NAME_(ethr_atomic_set)(var, val);
+#endif
+}
+
+static ETHR_INLINE void
+ETHR_INLINE_FUNC_NAME_(ethr_atomic_dec_relb)(ethr_atomic_t *var)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ ETHR_NATMC_FUNC__(dec_relb)(var);
+#else
+ ETHR_INLINE_FUNC_NAME_(ethr_atomic_dec)(var);
+#endif
+}
+
+static ETHR_INLINE ethr_sint_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic_dec_read_relb)(ethr_atomic_t *var)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint_t) ETHR_NATMC_FUNC__(dec_return_relb)(var);
+#else
+ return ETHR_INLINE_FUNC_NAME_(ethr_atomic_dec_read)(var);
+#endif
+}
+
+static ETHR_INLINE ethr_sint_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic_cmpxchg_acqb)(ethr_atomic_t *var,
+ ethr_sint_t new,
+ ethr_sint_t exp)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint_t) ETHR_NATMC_FUNC__(cmpxchg_acqb)(var,
+ (ETHR_NAINT_T__) new,
+ (ETHR_NAINT_T__) exp);
+#else
+ return ETHR_INLINE_FUNC_NAME_(ethr_atomic_cmpxchg)(var, new, exp);
+#endif
+}
+
+static ETHR_INLINE ethr_sint_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic_cmpxchg_relb)(ethr_atomic_t *var,
+ ethr_sint_t new,
+ ethr_sint_t exp)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint_t) ETHR_NATMC_FUNC__(cmpxchg_relb)(var,
+ (ETHR_NAINT_T__) new,
+ (ETHR_NAINT_T__) exp);
+#else
+ return ETHR_INLINE_FUNC_NAME_(ethr_atomic_cmpxchg)(var, new, exp);
+#endif
+}
+
+/*
+ * --- 32-bit atomics ---------------------------------------------------------
+ */
+
+static ETHR_INLINE ethr_sint32_t *
+ETHR_INLINE_FUNC_NAME_(ethr_atomic32_addr)(ethr_atomic32_t *var)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return ethr_native_atomic32_addr(var);
+#else
+ return (ethr_sint32_t *) var;
+#endif
+}
+
+static ETHR_INLINE void
+ETHR_INLINE_FUNC_NAME_(ethr_atomic32_init)(ethr_atomic32_t *var,
+ ethr_sint32_t i)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ ETHR_NATMC32_FUNC__(init)(var, (ETHR_NAINT32_T__) i);
+#else
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, *var = i);
+#endif
+}
+
+static ETHR_INLINE void
+ETHR_INLINE_FUNC_NAME_(ethr_atomic32_set)(ethr_atomic32_t *var, ethr_sint32_t i)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ ETHR_NATMC32_FUNC__(set)(var, (ETHR_NAINT32_T__) i);
+#else
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, *var = i);
+#endif
+}
+
+static ETHR_INLINE ethr_sint32_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic32_read)(ethr_atomic32_t *var)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint32_t) ETHR_NATMC32_FUNC__(read)(var);
+#else
+ ethr_sint32_t res;
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, res = *var);
+ return res;
+#endif
+}
+
+static ETHR_INLINE void
+ETHR_INLINE_FUNC_NAME_(ethr_atomic32_add)(ethr_atomic32_t *var,
+ ethr_sint32_t incr)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ ETHR_NATMC32_FUNC__(add)(var, (ETHR_NAINT32_T__) incr);
+#else
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, *var += incr);
+#endif
+}
+
+static ETHR_INLINE ethr_sint32_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic32_add_read)(ethr_atomic32_t *var,
+ ethr_sint32_t i)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint32_t)
+ ETHR_NATMC32_FUNC__(add_return)(var, (ETHR_NAINT32_T__) i);
+#else
+ ethr_sint32_t res;
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, *var += i; res = *var);
+ return res;
+#endif
+}
+
+static ETHR_INLINE void
+ETHR_INLINE_FUNC_NAME_(ethr_atomic32_inc)(ethr_atomic32_t *var)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ ETHR_NATMC32_FUNC__(inc)(var);
+#else
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, ++(*var));
+#endif
+}
+
+static ETHR_INLINE void
+ETHR_INLINE_FUNC_NAME_(ethr_atomic32_dec)(ethr_atomic32_t *var)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ ETHR_NATMC32_FUNC__(dec)(var);
+#else
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, --(*var));
+#endif
+}
+
+static ETHR_INLINE ethr_sint32_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic32_inc_read)(ethr_atomic32_t *var)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint32_t) ETHR_NATMC32_FUNC__(inc_return)(var);
+#else
+ ethr_sint32_t res;
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, res = ++(*var));
+ return res;
+#endif
+}
+
+static ETHR_INLINE ethr_sint32_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic32_dec_read)(ethr_atomic32_t *var)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint32_t) ETHR_NATMC32_FUNC__(dec_return)(var);
+#else
+ ethr_sint32_t res;
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, res = --(*var));
+ return res;
+#endif
+}
+
+static ETHR_INLINE ethr_sint32_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic32_read_band)(ethr_atomic32_t *var,
+ ethr_sint32_t mask)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint32_t)
+ ETHR_NATMC32_FUNC__(and_retold)(var, (ETHR_NAINT32_T__) mask);
+#else
+ ethr_sint32_t res;
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, res = *var; *var &= mask);
+ return res;
+#endif
+}
+
+static ETHR_INLINE ethr_sint32_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic32_read_bor)(ethr_atomic32_t *var,
+ ethr_sint32_t mask)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return
+ (ethr_sint32_t) ETHR_NATMC32_FUNC__(or_retold)(var,
+ (ETHR_NAINT32_T__) mask);
+#else
+ ethr_sint32_t res;
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, res = *var; *var |= mask);
+ return res;
+#endif
+}
+
+static ETHR_INLINE ethr_sint32_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic32_xchg)(ethr_atomic32_t *var,
+ ethr_sint32_t new)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint32_t) ETHR_NATMC32_FUNC__(xchg)(var,
+ (ETHR_NAINT32_T__) new);
+#else
+ ethr_sint32_t res;
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, res = *var; *var = new);
+ return res;
+#endif
+}
+
+static ETHR_INLINE ethr_sint32_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic32_cmpxchg)(ethr_atomic32_t *var,
+ ethr_sint32_t new,
+ ethr_sint32_t exp)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint32_t) ETHR_NATMC32_FUNC__(cmpxchg)(var,
+ (ETHR_NAINT32_T__) new,
+ (ETHR_NAINT32_T__) exp);
+#else
+ ethr_sint32_t res;
+ ETHR_ATOMIC_OP_FALLBACK_IMPL__(var,
+ {
+ res = *var;
+ if (__builtin_expect(res == exp, 1))
+ *var = new;
+ });
+ return res;
+#endif
+}
+
+/*
+ * Important memory barrier requirements.
+ *
+ * The following atomic operations *must* supply a memory barrier of
+ * at least the type specified by its suffix:
+ * _acqb = acquire barrier
+ * _relb = release barrier
+ */
+
+static ETHR_INLINE ethr_sint32_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic32_read_acqb)(ethr_atomic32_t *var)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint32_t) ETHR_NATMC32_FUNC__(read_acqb)(var);
+#else
+ return ETHR_INLINE_FUNC_NAME_(ethr_atomic32_read)(var);
+#endif
+}
+
+static ETHR_INLINE ethr_sint32_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic32_inc_read_acqb)(ethr_atomic32_t *var)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint32_t) ETHR_NATMC32_FUNC__(inc_return_acqb)(var);
+#else
+ return ETHR_INLINE_FUNC_NAME_(ethr_atomic32_inc_read)(var);
+#endif
+}
+
+static ETHR_INLINE void
+ETHR_INLINE_FUNC_NAME_(ethr_atomic32_set_relb)(ethr_atomic32_t *var,
+ ethr_sint32_t val)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ ETHR_NATMC32_FUNC__(set_relb)(var, (ETHR_NAINT32_T__) val);
+#else
+ ETHR_INLINE_FUNC_NAME_(ethr_atomic32_set)(var, val);
+#endif
+}
+
+static ETHR_INLINE void
+ETHR_INLINE_FUNC_NAME_(ethr_atomic32_dec_relb)(ethr_atomic32_t *var)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ ETHR_NATMC32_FUNC__(dec_relb)(var);
+#else
+ ETHR_INLINE_FUNC_NAME_(ethr_atomic32_dec)(var);
+#endif
+}
+
+static ETHR_INLINE ethr_sint32_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic32_dec_read_relb)(ethr_atomic32_t *var)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint32_t) ETHR_NATMC32_FUNC__(dec_return_relb)(var);
+#else
+ return ETHR_INLINE_FUNC_NAME_(ethr_atomic32_dec_read)(var);
+#endif
+}
+
+static ETHR_INLINE ethr_sint32_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic32_cmpxchg_acqb)(ethr_atomic32_t *var,
+ ethr_sint32_t new,
+ ethr_sint32_t exp)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint32_t)
+ ETHR_NATMC32_FUNC__(cmpxchg_acqb)(var,
+ (ETHR_NAINT32_T__) new,
+ (ETHR_NAINT32_T__) exp);
+#else
+ return ETHR_INLINE_FUNC_NAME_(ethr_atomic32_cmpxchg)(var, new, exp);
+#endif
+}
+
+static ETHR_INLINE ethr_sint32_t
+ETHR_INLINE_FUNC_NAME_(ethr_atomic32_cmpxchg_relb)(ethr_atomic32_t *var,
+ ethr_sint32_t new,
+ ethr_sint32_t exp)
+{
+#ifdef ETHR_HAVE_NATIVE_ATOMICS
+ return (ethr_sint32_t)
+ ETHR_NATMC32_FUNC__(cmpxchg_relb)(var,
+ (ETHR_NAINT32_T__) new,
+ (ETHR_NAINT32_T__) exp);
+#else
+ return ETHR_INLINE_FUNC_NAME_(ethr_atomic32_cmpxchg)(var, new, exp);
+#endif
+}
+
+
+#endif /* ETHR_TRY_INLINE_FUNCS */
+
+#undef ETHR_NAINT_T__
+#undef ETHR_NATMC_FUNC__
+#undef ETHR_NATMC_ADDR_FUNC__
+
+#undef ETHR_NAINT32_T__
+#undef ETHR_NATMC32_FUNC__
+
+#endif
diff --git a/erts/include/internal/ethr_mutex.h b/erts/include/internal/ethr_mutex.h
index 01855864e3..fadaf1e2a4 100644
--- a/erts/include/internal/ethr_mutex.h
+++ b/erts/include/internal/ethr_mutex.h
@@ -78,13 +78,13 @@
# error Need a qlock implementation
#endif
-#define ETHR_RWMTX_W_FLG__ (((long) 1) << 31)
-#define ETHR_RWMTX_W_WAIT_FLG__ (((long) 1) << 30)
-#define ETHR_RWMTX_R_WAIT_FLG__ (((long) 1) << 29)
+#define ETHR_RWMTX_W_FLG__ (((ethr_sint32_t) 1) << 31)
+#define ETHR_RWMTX_W_WAIT_FLG__ (((ethr_sint32_t) 1) << 30)
+#define ETHR_RWMTX_R_WAIT_FLG__ (((ethr_sint32_t) 1) << 29)
/* frequent read kind */
-#define ETHR_RWMTX_R_FLG__ (((long) 1) << 28)
-#define ETHR_RWMTX_R_ABRT_UNLCK_FLG__ (((long) 1) << 27)
+#define ETHR_RWMTX_R_FLG__ (((ethr_sint32_t) 1) << 28)
+#define ETHR_RWMTX_R_ABRT_UNLCK_FLG__ (((ethr_sint32_t) 1) << 27)
#define ETHR_RWMTX_R_PEND_UNLCK_MASK__ (ETHR_RWMTX_R_ABRT_UNLCK_FLG__ - 1)
/* normal kind */
@@ -106,28 +106,28 @@
#endif
#define ETHR_MTX_DBG_CHK_UNUSED_FLG_BITS(MTX) \
- ETHR_DBG_CHK_UNUSED_FLG_BITS(ethr_atomic_read(&(MTX)->mtxb.flgs))
+ ETHR_DBG_CHK_UNUSED_FLG_BITS(ethr_atomic32_read(&(MTX)->mtxb.flgs))
struct ethr_mutex_base_ {
#ifdef ETHR_MTX_HARD_DEBUG_FENCE
long pre_fence;
#endif
- ethr_atomic_t flgs;
- ETHR_MTX_QLOCK_TYPE__ qlck;
- ethr_ts_event *q;
+ ethr_atomic32_t flgs;
short aux_scnt;
short main_scnt;
+ ETHR_MTX_QLOCK_TYPE__ qlck;
+ ethr_ts_event *q;
#ifdef ETHR_MTX_HARD_DEBUG_WSQ
int ws;
#endif
#ifdef ETHR_MTX_CHK_EXCL
- ethr_atomic_t exclusive;
+ ethr_atomic32_t exclusive;
#endif
#ifdef ETHR_MTX_CHK_NON_EXCL
- ethr_atomic_t non_exclusive;
+ ethr_atomic32_t non_exclusive;
#endif
#ifdef ETHR_MTX_HARD_DEBUG_LFS
- ethr_atomic_t hdbg_lfs;
+ ethr_atomic32_t hdbg_lfs;
#endif
};
@@ -236,7 +236,7 @@ typedef struct {
typedef union {
struct {
- ethr_atomic_t readers;
+ ethr_atomic32_t readers;
int waiting_readers;
int byte_offset;
ethr_rwmutex_lived lived;
@@ -298,13 +298,13 @@ void ethr_rwmutex_rwunlock(ethr_rwmutex *);
#ifdef ETHR_MTX_HARD_DEBUG_LFS
# define ETHR_MTX_HARD_DEBUG_LFS_INIT(MTXB) \
do { \
- ethr_atomic_init(&(MTXB)->hdbg_lfs, 0); \
+ ethr_atomic32_init(&(MTXB)->hdbg_lfs, 0); \
} while (0)
# define ETHR_MTX_HARD_DEBUG_LFS_RLOCK(MTXB) \
do { \
- long val__; \
+ ethr_sint32_t val__; \
ETHR_COMPILER_BARRIER; \
- val__ = ethr_atomic_inc_read(&(MTXB)->hdbg_lfs); \
+ val__ = ethr_atomic32_inc_read(&(MTXB)->hdbg_lfs); \
ETHR_MTX_HARD_ASSERT(val__ > 0); \
} while (0)
# define ETHR_MTX_HARD_DEBUG_LFS_TRYRLOCK(MTXB, RES) \
@@ -317,15 +317,15 @@ do { \
} while (0)
# define ETHR_MTX_HARD_DEBUG_LFS_RUNLOCK(MTXB) \
do { \
- long val__ = ethr_atomic_dec_read(&(MTXB)->hdbg_lfs); \
+ ethr_sint32_t val__ = ethr_atomic32_dec_read(&(MTXB)->hdbg_lfs); \
ETHR_MTX_HARD_ASSERT(val__ >= 0); \
ETHR_COMPILER_BARRIER; \
} while (0)
# define ETHR_MTX_HARD_DEBUG_LFS_RWLOCK(MTXB) \
do { \
- long val__; \
+ ethr_sint32_t val__; \
ETHR_COMPILER_BARRIER; \
- val__ = ethr_atomic_dec_read(&(MTXB)->hdbg_lfs); \
+ val__ = ethr_atomic32_dec_read(&(MTXB)->hdbg_lfs); \
ETHR_MTX_HARD_ASSERT(val__ == -1); \
} while (0)
# define ETHR_MTX_HARD_DEBUG_LFS_TRYRWLOCK(MTXB, RES) \
@@ -338,7 +338,7 @@ do { \
} while (0)
# define ETHR_MTX_HARD_DEBUG_LFS_RWUNLOCK(MTXB) \
do { \
- long val__ = ethr_atomic_inctest(&(MTXB)->hdbg_lfs); \
+ ethr_sint32_t val__ = ethr_atomic32_inctest(&(MTXB)->hdbg_lfs); \
ETHR_MTX_HARD_ASSERT(val__ == 0); \
ETHR_COMPILER_BARRIER; \
} while (0)
@@ -386,12 +386,12 @@ do { \
#endif
# define ETHR_MTX_CHK_EXCL_INIT__(MTXB) \
- ethr_atomic_init(&(MTXB)->exclusive, 0)
+ ethr_atomic32_init(&(MTXB)->exclusive, 0)
# define ETHR_MTX_CHK_EXCL_IS_EXCL(MTXB) \
do { \
ETHR_COMPILER_BARRIER; \
- if (!ethr_atomic_read(&(MTXB)->exclusive)) \
+ if (!ethr_atomic32_read(&(MTXB)->exclusive)) \
ethr_assert_failed(__FILE__, __LINE__, __func__,\
"is exclusive"); \
ETHR_COMPILER_BARRIER; \
@@ -399,7 +399,7 @@ do { \
# define ETHR_MTX_CHK_EXCL_IS_NOT_EXCL(MTXB) \
do { \
ETHR_COMPILER_BARRIER; \
- if (ethr_atomic_read(&(MTXB)->exclusive)) \
+ if (ethr_atomic32_read(&(MTXB)->exclusive)) \
ethr_assert_failed(__FILE__, __LINE__, __func__,\
"is not exclusive"); \
ETHR_COMPILER_BARRIER; \
@@ -407,13 +407,13 @@ do { \
# define ETHR_MTX_CHK_EXCL_SET_EXCL(MTXB) \
do { \
ETHR_MTX_CHK_EXCL_IS_NOT_EXCL((MTXB)); \
- ethr_atomic_set(&(MTXB)->exclusive, 1); \
+ ethr_atomic32_set(&(MTXB)->exclusive, 1); \
ETHR_COMPILER_BARRIER; \
} while (0)
# define ETHR_MTX_CHK_EXCL_UNSET_EXCL(MTXB) \
do { \
ETHR_MTX_CHK_EXCL_IS_EXCL((MTXB)); \
- ethr_atomic_set(&(MTXB)->exclusive, 0); \
+ ethr_atomic32_set(&(MTXB)->exclusive, 0); \
ETHR_COMPILER_BARRIER; \
} while (0)
@@ -424,11 +424,11 @@ do { \
#endif
# define ETHR_MTX_CHK_NON_EXCL_INIT__(MTXB) \
- ethr_atomic_init(&(MTXB)->non_exclusive, 0)
+ ethr_atomic32_init(&(MTXB)->non_exclusive, 0)
# define ETHR_MTX_CHK_EXCL_IS_NON_EXCL(MTXB) \
do { \
ETHR_COMPILER_BARRIER; \
- if (!ethr_atomic_read(&(MTXB)->non_exclusive)) \
+ if (!ethr_atomic32_read(&(MTXB)->non_exclusive)) \
ethr_assert_failed(__FILE__, __LINE__, __func__,\
"is non-exclusive"); \
ETHR_COMPILER_BARRIER; \
@@ -436,7 +436,7 @@ do { \
# define ETHR_MTX_CHK_EXCL_IS_NOT_NON_EXCL(MTXB) \
do { \
ETHR_COMPILER_BARRIER; \
- if (ethr_atomic_read(&(MTXB)->non_exclusive)) \
+ if (ethr_atomic32_read(&(MTXB)->non_exclusive)) \
ethr_assert_failed(__FILE__, __LINE__, __func__,\
"is not non-exclusive"); \
ETHR_COMPILER_BARRIER; \
@@ -444,19 +444,19 @@ do { \
# define ETHR_MTX_CHK_EXCL_SET_NON_EXCL(MTXB) \
do { \
ETHR_COMPILER_BARRIER; \
- ethr_atomic_inc(&(MTXB)->non_exclusive); \
+ ethr_atomic32_inc(&(MTXB)->non_exclusive); \
ETHR_COMPILER_BARRIER; \
} while (0)
# define ETHR_MTX_CHK_EXCL_SET_NON_EXCL_NO(MTXB, NO) \
do { \
ETHR_COMPILER_BARRIER; \
- ethr_atomic_add(&(MTXB)->non_exclusive, (NO)); \
+ ethr_atomic32_add(&(MTXB)->non_exclusive, (NO)); \
ETHR_COMPILER_BARRIER; \
} while (0)
# define ETHR_MTX_CHK_EXCL_UNSET_NON_EXCL(MTXB) \
do { \
ETHR_COMPILER_BARRIER; \
- ethr_atomic_dec(&(MTXB)->non_exclusive); \
+ ethr_atomic32_dec(&(MTXB)->non_exclusive); \
ETHR_COMPILER_BARRIER; \
} while (0)
#else
@@ -501,18 +501,18 @@ do { \
#if defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_MUTEX_IMPL__)
-void ethr_mutex_lock_wait__(ethr_mutex *, long);
-void ethr_mutex_unlock_wake__(ethr_mutex *, long);
+void ethr_mutex_lock_wait__(ethr_mutex *, ethr_sint32_t);
+void ethr_mutex_unlock_wake__(ethr_mutex *, ethr_sint32_t);
static ETHR_INLINE int
ETHR_INLINE_FUNC_NAME_(ethr_mutex_trylock)(ethr_mutex *mtx)
{
- long act;
+ ethr_sint32_t act;
int res;
ETHR_MTX_HARD_DEBUG_FENCE_CHK(mtx);
ETHR_MTX_DBG_CHK_UNUSED_FLG_BITS(mtx);
- act = ethr_atomic_cmpxchg_acqb(&mtx->mtxb.flgs, ETHR_RWMTX_W_FLG__, 0);
+ act = ethr_atomic32_cmpxchg_acqb(&mtx->mtxb.flgs, ETHR_RWMTX_W_FLG__, 0);
res = (act == 0) ? 0 : EBUSY;
#ifdef ETHR_MTX_CHK_EXCL
@@ -531,11 +531,11 @@ ETHR_INLINE_FUNC_NAME_(ethr_mutex_trylock)(ethr_mutex *mtx)
static ETHR_INLINE void
ETHR_INLINE_FUNC_NAME_(ethr_mutex_lock)(ethr_mutex *mtx)
{
- long act;
+ ethr_sint32_t act;
ETHR_MTX_HARD_DEBUG_FENCE_CHK(mtx);
ETHR_MTX_DBG_CHK_UNUSED_FLG_BITS(mtx);
- act = ethr_atomic_cmpxchg_acqb(&mtx->mtxb.flgs, ETHR_RWMTX_W_FLG__, 0);
+ act = ethr_atomic32_cmpxchg_acqb(&mtx->mtxb.flgs, ETHR_RWMTX_W_FLG__, 0);
if (act != 0)
ethr_mutex_lock_wait__(mtx, act);
@@ -551,7 +551,7 @@ ETHR_INLINE_FUNC_NAME_(ethr_mutex_lock)(ethr_mutex *mtx)
static ETHR_INLINE void
ETHR_INLINE_FUNC_NAME_(ethr_mutex_unlock)(ethr_mutex *mtx)
{
- long act;
+ ethr_sint32_t act;
ETHR_COMPILER_BARRIER;
ETHR_MTX_HARD_DEBUG_FENCE_CHK(mtx);
ETHR_MTX_HARD_DEBUG_LFS_RWUNLOCK(&mtx->mtxb);
@@ -559,7 +559,7 @@ ETHR_INLINE_FUNC_NAME_(ethr_mutex_unlock)(ethr_mutex *mtx)
ETHR_MTX_CHK_EXCL_UNSET_EXCL(&mtx->mtxb);
- act = ethr_atomic_cmpxchg_relb(&mtx->mtxb.flgs, 0, ETHR_RWMTX_W_FLG__);
+ act = ethr_atomic32_cmpxchg_relb(&mtx->mtxb.flgs, 0, ETHR_RWMTX_W_FLG__);
if (act != ETHR_RWMTX_W_FLG__)
ethr_mutex_unlock_wake__(mtx, act);
diff --git a/erts/include/internal/ethr_optimized_fallbacks.h b/erts/include/internal/ethr_optimized_fallbacks.h
index 2f9f987d0b..8e04692856 100644
--- a/erts/include/internal/ethr_optimized_fallbacks.h
+++ b/erts/include/internal/ethr_optimized_fallbacks.h
@@ -71,36 +71,46 @@ ethr_opt_spin_lock(ethr_opt_spinlock_t *lock)
#define ETHR_HAVE_NATIVE_SPINLOCKS 1
#define ETHR_HAVE_OPTIMIZED_SPINLOCKS 1
-typedef ethr_native_atomic_t ethr_native_spinlock_t;
+#if defined(ETHR_HAVE_NATIVE_ATOMIC32)
+typedef ethr_native_atomic32_t ethr_native_spinlock_t;
+# define ETHR_NATMC_FUNC__(X) ethr_native_atomic32_ ## X
+#elif defined(ETHR_HAVE_NATIVE_ATOMIC64)
+typedef ethr_native_atomic64_t ethr_native_spinlock_t;
+# define ETHR_NATMC_FUNC__(X) ethr_native_atomic64_ ## X
+#else
+# error "Missing native atomic implementation"
+#endif
#if defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_AUX_IMPL__)
static ETHR_INLINE void
ethr_native_spinlock_init(ethr_native_spinlock_t *lock)
{
- ethr_native_atomic_init((ethr_native_atomic_t *) lock, 0);
+ ETHR_NATMC_FUNC__(init)(lock, 0);
}
static ETHR_INLINE void
ethr_native_spin_unlock(ethr_native_spinlock_t *lock)
{
ETHR_COMPILER_BARRIER;
- ETHR_ASSERT(ethr_native_atomic_read((ethr_native_atomic_t *) lock) == 1);
- ethr_native_atomic_set_relb((ethr_native_atomic_t *) lock, 0);
+ ETHR_ASSERT(ETHR_NATMC_FUNC__(read)(lock) == 1);
+ ETHR_NATMC_FUNC__(set_relb)(lock, 0);
}
static ETHR_INLINE void
ethr_native_spin_lock(ethr_native_spinlock_t *lock)
{
- while (ethr_native_atomic_cmpxchg_acqb((ethr_native_atomic_t *) lock,
- (long) 1, (long) 0) != 0) {
- ETHR_SPIN_BODY;
+ while (ETHR_NATMC_FUNC__(cmpxchg_acqb)(lock, 1, 0) != 0) {
+ while (ETHR_NATMC_FUNC__(read)(lock) != 0)
+ ETHR_SPIN_BODY;
}
ETHR_COMPILER_BARRIER;
}
#endif
+#undef ETHR_NATMC_FUNC__
+
#endif
@@ -111,16 +121,26 @@ ethr_native_spin_lock(ethr_native_spinlock_t *lock)
#define ETHR_HAVE_NATIVE_RWSPINLOCKS 1
#define ETHR_HAVE_OPTIMIZED_RWSPINLOCKS 1
-typedef ethr_native_atomic_t ethr_native_rwlock_t;
+#if defined(ETHR_HAVE_NATIVE_ATOMIC32)
+typedef ethr_native_atomic32_t ethr_native_rwlock_t;
+# define ETHR_NAINT_T__ ethr_sint32_t
+# define ETHR_WLOCK_FLAG__ (((ethr_sint32_t) 1) << 30)
+# define ETHR_NATMC_FUNC__(X) ethr_native_atomic32_ ## X
+#elif defined(ETHR_HAVE_NATIVE_ATOMIC64)
+typedef ethr_native_atomic64_t ethr_native_rwlock_t;
+# define ETHR_NAINT_T__ ethr_sint64_t
+# define ETHR_WLOCK_FLAG__ (((ethr_sint64_t) 1) << 62)
+# define ETHR_NATMC_FUNC__(X) ethr_native_atomic64_ ## X
+#else
+# error "Missing native atomic implementation"
+#endif
#if defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_AUX_IMPL__)
-#define ETHR_WLOCK_FLAG__ (((long) 1) << 30)
-
static ETHR_INLINE void
ethr_native_rwlock_init(ethr_native_rwlock_t *lock)
{
- ethr_native_atomic_init((ethr_native_atomic_t *) lock, 0);
+ ETHR_NATMC_FUNC__(init)(lock, 0);
}
static ETHR_INLINE void
@@ -128,22 +148,24 @@ ethr_native_read_unlock(ethr_native_rwlock_t *lock)
{
ETHR_COMPILER_BARRIER;
#ifdef DEBUG
- ETHR_ASSERT(ethr_native_atomic_read((ethr_native_atomic_t *) lock) >= 0);
+ ETHR_ASSERT(ETHR_NATMC_FUNC__(read)(lock) >= 0);
#endif
- ethr_native_atomic_dec_relb((ethr_native_atomic_t *) lock);
+ ETHR_NATMC_FUNC__(dec_relb)(lock);
}
static ETHR_INLINE void
ethr_native_read_lock(ethr_native_rwlock_t *lock)
{
- long act, exp = 0;
+ ETHR_NAINT_T__ act, exp = 0;
while (1) {
- act = ethr_native_atomic_cmpxchg_acqb((ethr_native_atomic_t *) lock,
- exp+1, exp);
+ act = ETHR_NATMC_FUNC__(cmpxchg_acqb)(lock, exp+1, exp);
if (act == exp)
break;
- ETHR_SPIN_BODY;
- exp = (act & ETHR_WLOCK_FLAG__) ? 0 : act;
+ while (act & ETHR_WLOCK_FLAG__) {
+ ETHR_SPIN_BODY;
+ act = ETHR_NATMC_FUNC__(read)(lock);
+ }
+ exp = act;
}
ETHR_COMPILER_BARRIER;
}
@@ -152,18 +174,16 @@ static ETHR_INLINE void
ethr_native_write_unlock(ethr_native_rwlock_t *lock)
{
ETHR_COMPILER_BARRIER;
- ETHR_ASSERT(ethr_native_atomic_read((ethr_native_atomic_t *) lock)
- == ETHR_WLOCK_FLAG__);
- ethr_native_atomic_set_relb((ethr_native_atomic_t *) lock, 0);
+ ETHR_ASSERT(ETHR_NATMC_FUNC__(read)(lock) == ETHR_WLOCK_FLAG__);
+ ETHR_NATMC_FUNC__(set_relb)(lock, 0);
}
static ETHR_INLINE void
ethr_native_write_lock(ethr_native_rwlock_t *lock)
{
- long act, exp = 0;
+ ETHR_NAINT_T__ act, exp = 0;
while (1) {
- act = ethr_native_atomic_cmpxchg_acqb((ethr_native_atomic_t *) lock,
- exp|ETHR_WLOCK_FLAG__, exp);
+ act = ETHR_NATMC_FUNC__(cmpxchg_acqb)(lock, exp|ETHR_WLOCK_FLAG__, exp);
if (act == exp)
break;
ETHR_SPIN_BODY;
@@ -173,13 +193,17 @@ ethr_native_write_lock(ethr_native_rwlock_t *lock)
/* Wait for readers to leave */
while (act != ETHR_WLOCK_FLAG__) {
ETHR_SPIN_BODY;
- act = ethr_native_atomic_read_acqb((ethr_native_atomic_t *) lock);
+ act = ETHR_NATMC_FUNC__(read_acqb)(lock);
}
ETHR_COMPILER_BARRIER;
}
#endif
+#undef ETHR_NAINT_T__
+#undef ETHR_NATMC_FUNC__
+#undef ETHR_WLOCK_FLAG__
+
#endif
#endif
diff --git a/erts/include/internal/ethread.h b/erts/include/internal/ethread.h
index 53fa1acdc2..4cd95faf6a 100644
--- a/erts/include/internal/ethread.h
+++ b/erts/include/internal/ethread.h
@@ -37,11 +37,6 @@
#undef ETHR_HAVE_OPTIMIZED_SPINLOCK
#undef ETHR_HAVE_OPTIMIZED_RWSPINLOCK
-typedef struct {
- long tv_sec;
- long tv_nsec;
-} ethr_timeval;
-
#if defined(DEBUG)
# define ETHR_DEBUG
#endif
@@ -73,7 +68,7 @@ typedef struct {
#endif
/* Assume 64-byte cache line size */
-#define ETHR_CACHE_LINE_SIZE 64L
+#define ETHR_CACHE_LINE_SIZE ((ethr_uint_t) 64)
#define ETHR_CACHE_LINE_MASK (ETHR_CACHE_LINE_SIZE - 1)
#define ETHR_CACHE_LINE_ALIGN_SIZE(SZ) \
@@ -171,6 +166,22 @@ typedef pthread_key_t ethr_tsd_key;
# undef WIN32_LEAN_AND_MEAN
#endif
+#if defined(_MSC_VER)
+
+#if ETHR_SIZEOF_LONG == 4
+#define ETHR_HAVE_INT32_T 1
+typedef long ethr_sint32_t;
+typedef unsigned long ethr_uint32_t;
+#endif
+
+#if ETHR_SIZEOF___INT64 == 8
+#define ETHR_HAVE_INT64_T 1
+typedef __int64 ethr_sint64_t;
+typedef unsigned __int64 ethr_uint64_t;
+#endif
+
+#endif
+
struct ethr_join_data_;
/* Types */
@@ -198,12 +209,48 @@ typedef DWORD ethr_tsd_key;
#endif
-#ifdef SIZEOF_LONG
-#if SIZEOF_LONG < ETHR_SIZEOF_PTR
-#error size of long currently needs to be at least the same as size of void *
+#ifndef ETHR_HAVE_INT32_T
+#if ETHR_SIZEOF_INT == 4
+#define ETHR_HAVE_INT32_T 1
+typedef int ethr_sint32_t;
+typedef unsigned int ethr_uint32_t;
+#elif ETHR_SIZEOF_LONG == 4
+#define ETHR_HAVE_INT32_T 1
+typedef long ethr_sint32_t;
+typedef unsigned long ethr_uint32_t;
#endif
#endif
+#ifndef ETHR_HAVE_INT64_T
+#if ETHR_SIZEOF_INT == 8
+#define ETHR_HAVE_INT64_T 1
+typedef int ethr_sint64_t;
+typedef unsigned int ethr_uint64_t;
+#elif ETHR_SIZEOF_LONG == 8
+#define ETHR_HAVE_INT64_T 1
+typedef long ethr_sint64_t;
+typedef unsigned long ethr_uint64_t;
+#elif ETHR_SIZEOF_LONG_LONG == 8
+#define ETHR_HAVE_INT64_T 1
+typedef long long ethr_sint64_t;
+typedef unsigned long long ethr_uint64_t;
+#endif
+#endif
+
+#if ETHR_SIZEOF_PTR == 4
+#ifndef ETHR_HAVE_INT32_T
+#error "No 32-bit integer type found"
+#endif
+typedef ethr_sint32_t ethr_sint_t;
+typedef ethr_uint32_t ethr_uint_t;
+#elif ETHR_SIZEOF_PTR == 8
+#ifndef ETHR_HAVE_INT64_T
+#error "No 64-bit integer type found"
+#endif
+typedef ethr_sint64_t ethr_sint_t;
+typedef ethr_uint64_t ethr_uint_t;
+#endif
+
/* __builtin_expect() is needed by both native atomics code
* and the fallback code */
#if !defined(__GNUC__) || (__GNUC__ < 2) || (__GNUC__ == 2 && __GNUC_MINOR__ < 96)
@@ -386,7 +433,6 @@ typedef struct {
#if !defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_AUX_IMPL__)
# define ETHR_NEED_SPINLOCK_PROTOTYPES__
# define ETHR_NEED_RWSPINLOCK_PROTOTYPES__
-# define ETHR_NEED_ATOMIC_PROTOTYPES__
#endif
int ethr_init(ethr_init_data *);
@@ -399,7 +445,6 @@ void ethr_thr_exit(void *);
ethr_tid ethr_self(void);
int ethr_equal_tids(ethr_tid, ethr_tid);
-int ethr_time_now(ethr_timeval *);
int ethr_tsd_key_create(ethr_tsd_key *);
int ethr_tsd_key_delete(ethr_tsd_key);
int ethr_tsd_set(ethr_tsd_key, void *);
@@ -502,312 +547,7 @@ ETHR_INLINE_FUNC_NAME_(ethr_spin_lock)(ethr_spinlock_t *lock)
#endif /* ETHR_TRY_INLINE_FUNCS */
-#ifdef ETHR_HAVE_NATIVE_ATOMICS
-/*
- * Map ethread native atomics to ethread API atomics.
- */
-typedef ethr_native_atomic_t ethr_atomic_t;
-#else
-typedef long ethr_atomic_t;
-#endif
-
-#ifdef ETHR_NEED_ATOMIC_PROTOTYPES__
-void ethr_atomic_init(ethr_atomic_t *, long);
-void ethr_atomic_set(ethr_atomic_t *, long);
-long ethr_atomic_read(ethr_atomic_t *);
-long ethr_atomic_inc_read(ethr_atomic_t *);
-long ethr_atomic_dec_read(ethr_atomic_t *);
-void ethr_atomic_inc(ethr_atomic_t *);
-void ethr_atomic_dec(ethr_atomic_t *);
-long ethr_atomic_add_read(ethr_atomic_t *, long);
-void ethr_atomic_add(ethr_atomic_t *, long);
-long ethr_atomic_read_band(ethr_atomic_t *, long);
-long ethr_atomic_read_bor(ethr_atomic_t *, long);
-long ethr_atomic_xchg(ethr_atomic_t *, long);
-long ethr_atomic_cmpxchg(ethr_atomic_t *, long, long);
-long ethr_atomic_read_acqb(ethr_atomic_t *);
-long ethr_atomic_inc_read_acqb(ethr_atomic_t *);
-void ethr_atomic_set_relb(ethr_atomic_t *, long);
-void ethr_atomic_dec_relb(ethr_atomic_t *);
-long ethr_atomic_dec_read_relb(ethr_atomic_t *);
-long ethr_atomic_cmpxchg_acqb(ethr_atomic_t *, long, long);
-long ethr_atomic_cmpxchg_relb(ethr_atomic_t *, long, long);
-#endif
-
-#if defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_AUX_IMPL__)
-
-#ifndef ETHR_HAVE_NATIVE_ATOMICS
-/*
- * Fallbacks for atomics used in absence of a native implementation.
- */
-
-#define ETHR_ATOMIC_ADDR_BITS 10
-#define ETHR_ATOMIC_ADDR_SHIFT 6
-
-typedef struct {
- union {
- ethr_spinlock_t lck;
- char buf[ETHR_CACHE_LINE_SIZE];
- } u;
-} ethr_atomic_protection_t;
-
-extern ethr_atomic_protection_t ethr_atomic_protection__[1 << ETHR_ATOMIC_ADDR_BITS];
-
-#define ETHR_ATOMIC_PTR2LCK__(PTR) \
-(&ethr_atomic_protection__[((((unsigned long) (PTR)) >> ETHR_ATOMIC_ADDR_SHIFT) \
- & ((1 << ETHR_ATOMIC_ADDR_BITS) - 1))].u.lck)
-
-
-#define ETHR_ATOMIC_OP_FALLBACK_IMPL__(AP, EXPS) \
-do { \
- ethr_spinlock_t *slp__ = ETHR_ATOMIC_PTR2LCK__((AP)); \
- ethr_spin_lock(slp__); \
- { EXPS; } \
- ethr_spin_unlock(slp__); \
-} while (0)
-
-#endif
-
-static ETHR_INLINE void
-ETHR_INLINE_FUNC_NAME_(ethr_atomic_init)(ethr_atomic_t *var, long i)
-{
-#ifdef ETHR_HAVE_NATIVE_ATOMICS
- ethr_native_atomic_init(var, i);
-#else
- ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, *var = i);
-#endif
-}
-
-static ETHR_INLINE void
-ETHR_INLINE_FUNC_NAME_(ethr_atomic_set)(ethr_atomic_t *var, long i)
-{
-#ifdef ETHR_HAVE_NATIVE_ATOMICS
- ethr_native_atomic_set(var, i);
-#else
- ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, *var = i);
-#endif
-}
-
-static ETHR_INLINE long
-ETHR_INLINE_FUNC_NAME_(ethr_atomic_read)(ethr_atomic_t *var)
-{
-#ifdef ETHR_HAVE_NATIVE_ATOMICS
- return ethr_native_atomic_read(var);
-#else
- long res;
- ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, res = (long) *var);
- return res;
-#endif
-}
-
-static ETHR_INLINE void
-ETHR_INLINE_FUNC_NAME_(ethr_atomic_add)(ethr_atomic_t *var, long incr)
-{
-#ifdef ETHR_HAVE_NATIVE_ATOMICS
- ethr_native_atomic_add(var, incr);
-#else
- ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, *var += incr);
-#endif
-}
-
-static ETHR_INLINE long
-ETHR_INLINE_FUNC_NAME_(ethr_atomic_add_read)(ethr_atomic_t *var, long i)
-{
-#ifdef ETHR_HAVE_NATIVE_ATOMICS
- return ethr_native_atomic_add_return(var, i);
-#else
- long res;
- ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, *var += i; res = *var);
- return res;
-#endif
-}
-
-static ETHR_INLINE void
-ETHR_INLINE_FUNC_NAME_(ethr_atomic_inc)(ethr_atomic_t *var)
-{
-#ifdef ETHR_HAVE_NATIVE_ATOMICS
- ethr_native_atomic_inc(var);
-#else
- ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, ++(*var));
-#endif
-}
-
-static ETHR_INLINE void
-ETHR_INLINE_FUNC_NAME_(ethr_atomic_dec)(ethr_atomic_t *var)
-{
-#ifdef ETHR_HAVE_NATIVE_ATOMICS
- ethr_native_atomic_dec(var);
-#else
- ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, --(*var));
-#endif
-}
-
-static ETHR_INLINE long
-ETHR_INLINE_FUNC_NAME_(ethr_atomic_inc_read)(ethr_atomic_t *var)
-{
-#ifdef ETHR_HAVE_NATIVE_ATOMICS
- return ethr_native_atomic_inc_return(var);
-#else
- long res;
- ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, res = (long) ++(*var));
- return res;
-#endif
-}
-
-static ETHR_INLINE long
-ETHR_INLINE_FUNC_NAME_(ethr_atomic_dec_read)(ethr_atomic_t *var)
-{
-#ifdef ETHR_HAVE_NATIVE_ATOMICS
- return ethr_native_atomic_dec_return(var);
-#else
- long res;
- ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, res = (long) --(*var));
- return res;
-#endif
-}
-
-static ETHR_INLINE long
-ETHR_INLINE_FUNC_NAME_(ethr_atomic_read_band)(ethr_atomic_t *var,
- long mask)
-{
-#ifdef ETHR_HAVE_NATIVE_ATOMICS
- return ethr_native_atomic_and_retold(var, mask);
-#else
- long res;
- ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, res = *var; *var &= mask);
- return res;
-#endif
-}
-
-static ETHR_INLINE long
-ETHR_INLINE_FUNC_NAME_(ethr_atomic_read_bor)(ethr_atomic_t *var,
- long mask)
-{
-#ifdef ETHR_HAVE_NATIVE_ATOMICS
- return ethr_native_atomic_or_retold(var, mask);
-#else
- long res;
- ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, res = *var; *var |= mask);
- return res;
-#endif
-}
-
-static ETHR_INLINE long
-ETHR_INLINE_FUNC_NAME_(ethr_atomic_xchg)(ethr_atomic_t *var,
- long new)
-{
-#ifdef ETHR_HAVE_NATIVE_ATOMICS
- return ethr_native_atomic_xchg(var, new);
-#else
- long res;
- ETHR_ATOMIC_OP_FALLBACK_IMPL__(var, res = *var; *var = new);
- return res;
-#endif
-}
-
-static ETHR_INLINE long
-ETHR_INLINE_FUNC_NAME_(ethr_atomic_cmpxchg)(ethr_atomic_t *var,
- long new,
- long exp)
-{
-#ifdef ETHR_HAVE_NATIVE_ATOMICS
- return ethr_native_atomic_cmpxchg(var, new, exp);
-#else
- long res;
- ETHR_ATOMIC_OP_FALLBACK_IMPL__(var,
- {
- res = *var;
- if (__builtin_expect(res == exp, 1))
- *var = new;
- });
- return res;
-#endif
-}
-
-/*
- * Important memory barrier requirements.
- *
- * The following atomic operations *must* supply a memory barrier of
- * at least the type specified by its suffix:
- * _acqb = acquire barrier
- * _relb = release barrier
- */
-
-static ETHR_INLINE long
-ETHR_INLINE_FUNC_NAME_(ethr_atomic_read_acqb)(ethr_atomic_t *var)
-{
-#ifdef ETHR_HAVE_NATIVE_ATOMICS
- return ethr_native_atomic_read_acqb(var);
-#else
- return ETHR_INLINE_FUNC_NAME_(ethr_atomic_read)(var);
-#endif
-}
-
-static ETHR_INLINE long
-ETHR_INLINE_FUNC_NAME_(ethr_atomic_inc_read_acqb)(ethr_atomic_t *var)
-{
-#ifdef ETHR_HAVE_NATIVE_ATOMICS
- return ethr_native_atomic_inc_return_acqb(var);
-#else
- return ETHR_INLINE_FUNC_NAME_(ethr_atomic_inc_read)(var);
-#endif
-}
-
-static ETHR_INLINE void
-ETHR_INLINE_FUNC_NAME_(ethr_atomic_set_relb)(ethr_atomic_t *var, long val)
-{
-#ifdef ETHR_HAVE_NATIVE_ATOMICS
- ethr_native_atomic_set_relb(var, val);
-#else
- ETHR_INLINE_FUNC_NAME_(ethr_atomic_set)(var, val);
-#endif
-}
-
-static ETHR_INLINE void
-ETHR_INLINE_FUNC_NAME_(ethr_atomic_dec_relb)(ethr_atomic_t *var)
-{
-#ifdef ETHR_HAVE_NATIVE_ATOMICS
- ethr_native_atomic_dec_relb(var);
-#else
- ETHR_INLINE_FUNC_NAME_(ethr_atomic_dec)(var);
-#endif
-}
-
-static ETHR_INLINE long
-ETHR_INLINE_FUNC_NAME_(ethr_atomic_dec_read_relb)(ethr_atomic_t *var)
-{
-#ifdef ETHR_HAVE_NATIVE_ATOMICS
- return ethr_native_atomic_dec_return_relb(var);
-#else
- return ETHR_INLINE_FUNC_NAME_(ethr_atomic_dec_read)(var);
-#endif
-}
-
-static ETHR_INLINE long
-ETHR_INLINE_FUNC_NAME_(ethr_atomic_cmpxchg_acqb)(ethr_atomic_t *var,
- long new,
- long exp)
-{
-#ifdef ETHR_HAVE_NATIVE_ATOMICS
- return ethr_native_atomic_cmpxchg_acqb(var, new, exp);
-#else
- return ETHR_INLINE_FUNC_NAME_(ethr_atomic_cmpxchg)(var, new, exp);
-#endif
-}
-
-static ETHR_INLINE long
-ETHR_INLINE_FUNC_NAME_(ethr_atomic_cmpxchg_relb)(ethr_atomic_t *var,
- long new,
- long exp)
-{
-#ifdef ETHR_HAVE_NATIVE_ATOMICS
- return ethr_native_atomic_cmpxchg_relb(var, new, exp);
-#else
- return ETHR_INLINE_FUNC_NAME_(ethr_atomic_cmpxchg)(var, new, exp);
-#endif
-}
-
-#endif /* ETHR_TRY_INLINE_FUNCS */
+#include "ethr_atomics.h"
typedef struct ethr_ts_event_ ethr_ts_event; /* Needed by ethr_mutex.h */
@@ -825,7 +565,7 @@ struct ethr_ts_event_ {
ethr_ts_event *prev;
ethr_event event;
void *udata;
- ethr_atomic_t uaflgs;
+ ethr_atomic32_t uaflgs;
unsigned uflgs;
unsigned iflgs; /* for ethr lib only */
short rgix; /* for ethr lib only */
diff --git a/erts/include/internal/ethread_header_config.h.in b/erts/include/internal/ethread_header_config.h.in
index 5debb44756..f394d790d2 100644
--- a/erts/include/internal/ethread_header_config.h.in
+++ b/erts/include/internal/ethread_header_config.h.in
@@ -20,6 +20,21 @@
/* Define to the size of pointers */
#undef ETHR_SIZEOF_PTR
+/* Define to the size of int */
+#undef ETHR_SIZEOF_INT
+
+/* Define to the size of long */
+#undef ETHR_SIZEOF_LONG
+
+/* Define to the size of long long */
+#undef ETHR_SIZEOF_LONG_LONG
+
+/* Define to the size of __int64 */
+#undef ETHR_SIZEOF___INT64
+
+/* Define if bigendian */
+#undef ETHR_BIGENDIAN
+
/* Define if you want to disable native ethread implementations */
#undef ETHR_DISABLE_NATIVE_IMPLS
@@ -100,6 +115,27 @@
/* Define to the size of AO_t if libatomic_ops is used */
#undef ETHR_SIZEOF_AO_T
+/* Define if you have _InterlockedCompareExchange64() */
+#undef ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64
+
+/* Define if you have _InterlockedDecrement64() */
+#undef ETHR_HAVE__INTERLOCKEDDECREMENT64
+
+/* Define if you have _InterlockedIncrement64() */
+#undef ETHR_HAVE__INTERLOCKEDINCREMENT64
+
+/* Define if you have _InterlockedExchangeAdd64() */
+#undef ETHR_HAVE__INTERLOCKEDEXCHANGEADD64
+
+/* Define if you have _InterlockedExchange64() */
+#undef ETHR_HAVE__INTERLOCKEDEXCHANGE64
+
+/* Define if you have _InterlockedAnd64() */
+#undef ETHR_HAVE__INTERLOCKEDAND64
+
+/* Define if you have _InterlockedOr64() */
+#undef ETHR_HAVE__INTERLOCKEDOR64
+
/* Define if you want to turn on extra sanity checking in the ethread library */
#undef ETHR_XCHK
diff --git a/erts/include/internal/gcc/ethr_atomic.h b/erts/include/internal/gcc/ethr_atomic.h
index e8e529dd48..16935084b1 100644
--- a/erts/include/internal/gcc/ethr_atomic.h
+++ b/erts/include/internal/gcc/ethr_atomic.h
@@ -22,24 +22,35 @@
* Author: Rickard Green
*/
-#ifndef ETHR_GCC_ATOMIC_H__
-#define ETHR_GCC_ATOMIC_H__
+#undef ETHR_INCLUDE_ATOMIC_IMPL__
+#if !defined(ETHR_GCC_ATOMIC32_H__) && defined(ETHR_ATOMIC_WANT_32BIT_IMPL__)
+#define ETHR_GCC_ATOMIC32_H__
+#define ETHR_INCLUDE_ATOMIC_IMPL__ 4
+#undef ETHR_ATOMIC_WANT_32BIT_IMPL__
+#elif !defined(ETHR_GCC_ATOMIC64_H__) && defined(ETHR_ATOMIC_WANT_64BIT_IMPL__)
+#define ETHR_GCC_ATOMIC64_H__
+#define ETHR_INCLUDE_ATOMIC_IMPL__ 8
+#undef ETHR_ATOMIC_WANT_64BIT_IMPL__
+#endif
+
+#ifdef ETHR_INCLUDE_ATOMIC_IMPL__
-#if !defined(ETHR_HAVE_NATIVE_ATOMICS) && defined(ETHR_HAVE_GCC_ATOMIC_OPS)
-#define ETHR_HAVE_NATIVE_ATOMICS 1
+#ifndef ETHR_GCC_ATOMIC_COMMON__
+#define ETHR_GCC_ATOMIC_COMMON__
-#define ETHR_IMMED_ATOMIC_SET_GET_SAFE__ 0
-/* Enable immediate read/write on platforms where we know it is safe */
+#define ETHR_READ_AND_SET_WITHOUT_SYNC_OP__ 0
#if defined(__i386__) || defined(__x86_64__) || defined(__sparc__) \
|| defined(__powerpc__) || defined(__ppc__) || defined(__mips__)
-# undef ETHR_IMMED_ATOMIC_SET_GET_SAFE__
-# define ETHR_IMMED_ATOMIC_SET_GET_SAFE__ 1
+# undef ETHR_READ_AND_SET_WITHOUT_SYNC_OP__
+# define ETHR_READ_AND_SET_WITHOUT_SYNC_OP__ 1
#endif
-typedef struct {
- volatile long counter;
-} ethr_native_atomic_t;
-
+#if defined(__x86_64__) || (defined(__i386__) \
+ && !defined(ETHR_PRE_PENTIUM4_COMPAT))
+# define ETHR_READ_ACQB_AND_SET_RELB_COMPILER_BARRIER_ONLY__ 1
+#else
+# define ETHR_READ_ACQB_AND_SET_RELB_COMPILER_BARRIER_ONLY__ 0
+#endif
/*
* According to the documentation this is what we want:
@@ -47,34 +58,73 @@ typedef struct {
* However, __sync_synchronize() is known to erroneously be
* a noop on at least some platforms with some gcc versions.
* This has suposedly been fixed in some gcc version, but we
- * don't know from which version. Therefore, we use the
- * workaround implemented below on all gcc versions except
- * for gcc 4.2 or above for MIPS, where it's been verified.
+ * don't know from which version. Therefore, we only use
+ * it when it has been verified to work. Otherwise
+ * we use a workaround.
*/
#if defined(__mips__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
+/* __sync_synchronize() has been verified to work here */
#define ETHR_MEMORY_BARRIER __sync_synchronize()
+#define ETHR_READ_DEPEND_MEMORY_BARRIER __sync_synchronize()
+#elif defined(__x86_64__) || (defined(__i386__) \
+ && !defined(ETHR_PRE_PENTIUM4_COMPAT))
+/* Use fence instructions directly instead of workaround */
+#define ETHR_MEMORY_BARRIER __asm__ __volatile__("mfence" : : : "memory")
+#define ETHR_WRITE_MEMORY_BARRIER __asm__ __volatile__("sfence" : : : "memory")
+#define ETHR_READ_MEMORY_BARRIER __asm__ __volatile__("lfence" : : : "memory")
+#define ETHR_READ_DEPEND_MEMORY_BARRIER __asm__ __volatile__("" : : : "memory")
#else
+/* Workaround */
#define ETHR_MEMORY_BARRIER \
do { \
- volatile long x___ = 0; \
- (void) __sync_val_compare_and_swap(&x___, (long) 0, (long) 1); \
+ volatile ethr_sint32_t x___ = 0; \
+ (void) __sync_val_compare_and_swap(&x___, (ethr_sint32_t) 0, (ethr_sint32_t) 1); \
} while (0)
-#endif
#define ETHR_READ_DEPEND_MEMORY_BARRIER ETHR_MEMORY_BARRIER
+#endif
+
+#define ETHR_COMPILER_BARRIER __asm__ __volatile__("" : : : "memory")
-#if defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_AUX_IMPL__)
+#endif /* ETHR_GCC_ATOMIC_COMMON__ */
+
+#if ETHR_INCLUDE_ATOMIC_IMPL__ == 4
+#define ETHR_HAVE_NATIVE_ATOMIC32 1
+#define ETHR_NATMC_FUNC__(X) ethr_native_atomic32_ ## X
+#define ETHR_ATMC_T__ ethr_native_atomic32_t
+#define ETHR_AINT_T__ ethr_sint32_t
+#elif ETHR_INCLUDE_ATOMIC_IMPL__ == 8
+#define ETHR_HAVE_NATIVE_ATOMIC64 1
+#define ETHR_NATMC_FUNC__(X) ethr_native_atomic64_ ## X
+#define ETHR_ATMC_T__ ethr_native_atomic64_t
+#define ETHR_AINT_T__ ethr_sint64_t
+#else
+#error "Unsupported integer size"
+#endif
+
+typedef struct {
+ volatile ETHR_AINT_T__ counter;
+} ETHR_ATMC_T__;
+
+
+#if defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_ATOMIC_IMPL__)
+
+static ETHR_INLINE ETHR_AINT_T__ *
+ETHR_NATMC_FUNC__(addr)(ETHR_ATMC_T__ *var)
+{
+ return (ETHR_AINT_T__ *) &var->counter;
+}
static ETHR_INLINE void
-ethr_native_atomic_set(ethr_native_atomic_t *var, long value)
+ETHR_NATMC_FUNC__(set)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ value)
{
-#if ETHR_IMMED_ATOMIC_SET_GET_SAFE__
+#if ETHR_READ_AND_SET_WITHOUT_SYNC_OP__
var->counter = value;
#else
/*
* Unfortunately no __sync_store() or similar exist in the gcc atomic
* op interface. We therefore have to simulate it this way...
*/
- long act = 0, exp;
+ ETHR_AINT_T__ act = 0, exp;
do {
exp = act;
act = __sync_val_compare_and_swap(&var->counter, exp, value);
@@ -82,80 +132,86 @@ ethr_native_atomic_set(ethr_native_atomic_t *var, long value)
#endif
}
-#define ethr_native_atomic_init ethr_native_atomic_set
+static ETHR_INLINE void
+ETHR_NATMC_FUNC__(init)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ value)
+{
+ ETHR_NATMC_FUNC__(set)(var, value);
+}
-static ETHR_INLINE long
-ethr_native_atomic_read(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(read)(ETHR_ATMC_T__ *var)
{
-#if ETHR_IMMED_ATOMIC_SET_GET_SAFE__
+#if ETHR_READ_AND_SET_WITHOUT_SYNC_OP__
return var->counter;
#else
/*
* Unfortunately no __sync_fetch() or similar exist in the gcc atomic
* op interface. We therefore have to simulate it this way...
*/
- return __sync_add_and_fetch(&var->counter, (long) 0);
+ return __sync_add_and_fetch(&var->counter, (ETHR_AINT_T__) 0);
#endif
}
static ETHR_INLINE void
-ethr_native_atomic_add(ethr_native_atomic_t *var, long incr)
+ETHR_NATMC_FUNC__(add)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ incr)
{
(void) __sync_add_and_fetch(&var->counter, incr);
}
-static ETHR_INLINE long
-ethr_native_atomic_add_return(ethr_native_atomic_t *var, long incr)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(add_return)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ incr)
{
return __sync_add_and_fetch(&var->counter, incr);
}
static ETHR_INLINE void
-ethr_native_atomic_inc(ethr_native_atomic_t *var)
+ETHR_NATMC_FUNC__(inc)(ETHR_ATMC_T__ *var)
{
- (void) __sync_add_and_fetch(&var->counter, (long) 1);
+ (void) __sync_add_and_fetch(&var->counter, (ETHR_AINT_T__) 1);
}
static ETHR_INLINE void
-ethr_native_atomic_dec(ethr_native_atomic_t *var)
+ETHR_NATMC_FUNC__(dec)(ETHR_ATMC_T__ *var)
{
- (void) __sync_sub_and_fetch(&var->counter, (long) 1);
+ (void) __sync_sub_and_fetch(&var->counter, (ETHR_AINT_T__) 1);
}
-static ETHR_INLINE long
-ethr_native_atomic_inc_return(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(inc_return)(ETHR_ATMC_T__ *var)
{
- return __sync_add_and_fetch(&var->counter, (long) 1);
+ return __sync_add_and_fetch(&var->counter, (ETHR_AINT_T__) 1);
}
-static ETHR_INLINE long
-ethr_native_atomic_dec_return(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(dec_return)(ETHR_ATMC_T__ *var)
{
- return __sync_sub_and_fetch(&var->counter, (long) 1);
+ return __sync_sub_and_fetch(&var->counter, (ETHR_AINT_T__) 1);
}
-static ETHR_INLINE long
-ethr_native_atomic_and_retold(ethr_native_atomic_t *var, long mask)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(and_retold)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ mask)
{
return __sync_fetch_and_and(&var->counter, mask);
}
-static ETHR_INLINE long
-ethr_native_atomic_or_retold(ethr_native_atomic_t *var, long mask)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(or_retold)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ mask)
{
- return (long) __sync_fetch_and_or(&var->counter, mask);
+ return (ETHR_AINT_T__) __sync_fetch_and_or(&var->counter, mask);
}
-static ETHR_INLINE long
-ethr_native_atomic_cmpxchg(ethr_native_atomic_t *var, long new, long old)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(cmpxchg)(ETHR_ATMC_T__ *var,
+ ETHR_AINT_T__ new,
+ ETHR_AINT_T__ old)
{
return __sync_val_compare_and_swap(&var->counter, old, new);
}
-static ETHR_INLINE long
-ethr_native_atomic_xchg(ethr_native_atomic_t *var, long new)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(xchg)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ new)
{
- long exp, act = 0;
+ ETHR_AINT_T__ exp, act = 0;
do {
exp = act;
act = __sync_val_compare_and_swap(&var->counter, exp, new);
@@ -167,22 +223,68 @@ ethr_native_atomic_xchg(ethr_native_atomic_t *var, long new)
* Atomic ops with at least specified barriers.
*/
-static ETHR_INLINE long
-ethr_native_atomic_read_acqb(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(read_acqb)(ETHR_ATMC_T__ *var)
{
- return __sync_add_and_fetch(&var->counter, (long) 0);
+#if ETHR_READ_ACQB_AND_SET_RELB_COMPILER_BARRIER_ONLY__
+ ETHR_AINT_T__ val = var->counter;
+ ETHR_COMPILER_BARRIER;
+ return val;
+#else
+ return __sync_add_and_fetch(&var->counter, (ETHR_AINT_T__) 0);
+#endif
}
-#define ethr_native_atomic_inc_return_acqb ethr_native_atomic_inc_return
-#define ethr_native_atomic_set_relb ethr_native_atomic_xchg
-#define ethr_native_atomic_dec_relb ethr_native_atomic_dec_return
-#define ethr_native_atomic_dec_return_relb ethr_native_atomic_dec_return
+static ETHR_INLINE void
+ETHR_NATMC_FUNC__(set_relb)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ i)
+{
+#if ETHR_READ_ACQB_AND_SET_RELB_COMPILER_BARRIER_ONLY__
+ ETHR_COMPILER_BARRIER;
+ var->counter = i;
+#else
+ (void) ETHR_NATMC_FUNC__(xchg)(var, i);
+#endif
+}
-#define ethr_native_atomic_cmpxchg_acqb ethr_native_atomic_cmpxchg
-#define ethr_native_atomic_cmpxchg_relb ethr_native_atomic_cmpxchg
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(inc_return_acqb)(ETHR_ATMC_T__ *var)
+{
+ return ETHR_NATMC_FUNC__(inc_return)(var);
+}
-#endif
+static ETHR_INLINE void
+ETHR_NATMC_FUNC__(dec_relb)(ETHR_ATMC_T__ *var)
+{
+ ETHR_NATMC_FUNC__(dec)(var);
+}
+
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(dec_return_relb)(ETHR_ATMC_T__ *var)
+{
+ return ETHR_NATMC_FUNC__(dec_return)(var);
+}
+
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(cmpxchg_acqb)(ETHR_ATMC_T__ *var,
+ ETHR_AINT_T__ new,
+ ETHR_AINT_T__ old)
+{
+ return ETHR_NATMC_FUNC__(cmpxchg)(var, new, old);
+}
+
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(cmpxchg_relb)(ETHR_ATMC_T__ *var,
+ ETHR_AINT_T__ new,
+ ETHR_AINT_T__ old)
+{
+ return ETHR_NATMC_FUNC__(cmpxchg)(var, new, old);
+}
#endif
+#undef ETHR_NATMC_FUNC__
+#undef ETHR_ATMC_T__
+#undef ETHR_AINT_T__
+#undef ETHR_AINT_SUFFIX__
+
#endif
diff --git a/erts/include/internal/gcc/ethread.h b/erts/include/internal/gcc/ethread.h
index bb378e31e0..392a1aa2b2 100644
--- a/erts/include/internal/gcc/ethread.h
+++ b/erts/include/internal/gcc/ethread.h
@@ -25,6 +25,16 @@
#ifndef ETHREAD_GCC_H__
#define ETHREAD_GCC_H__
+#if !defined(ETHR_HAVE_NATIVE_ATOMICS) && defined(ETHR_HAVE_GCC_ATOMIC_OPS)
+#define ETHR_HAVE_NATIVE_ATOMICS 1
+
+#define ETHR_ATOMIC_WANT_32BIT_IMPL__
#include "ethr_atomic.h"
+#if ETHR_SIZEOF_PTR == 8
+# define ETHR_ATOMIC_WANT_64BIT_IMPL__
+# include "ethr_atomic.h"
+#endif
+
+#endif
#endif
diff --git a/erts/include/internal/i386/atomic.h b/erts/include/internal/i386/atomic.h
index 52d01aab32..4e402f261a 100644
--- a/erts/include/internal/i386/atomic.h
+++ b/erts/include/internal/i386/atomic.h
@@ -23,14 +23,24 @@
*
* This code requires a 486 or newer processor.
*/
-#ifndef ETHREAD_I386_ATOMIC_H
-#define ETHREAD_I386_ATOMIC_H
-/* An atomic is an aligned long accessed via locked operations.
- */
-typedef struct {
- volatile long counter;
-} ethr_native_atomic_t;
+#undef ETHR_INCLUDE_ATOMIC_IMPL__
+#if !defined(ETHR_X86_ATOMIC32_H__) && defined(ETHR_ATOMIC_WANT_32BIT_IMPL__)
+#define ETHR_X86_ATOMIC32_H__
+#define ETHR_INCLUDE_ATOMIC_IMPL__ 4
+#undef ETHR_ATOMIC_WANT_32BIT_IMPL__
+#elif !defined(ETHR_X86_ATOMIC64_H__) && defined(ETHR_ATOMIC_WANT_64BIT_IMPL__)
+#define ETHR_X86_ATOMIC64_H__
+#define ETHR_INCLUDE_ATOMIC_IMPL__ 8
+#undef ETHR_ATOMIC_WANT_64BIT_IMPL__
+#endif
+
+#ifdef ETHR_INCLUDE_ATOMIC_IMPL__
+
+#ifndef ETHR_X86_ATOMIC_COMMON__
+#define ETHR_X86_ATOMIC_COMMON__
+
+#define ETHR_ATOMIC_HAVE_INC_DEC_INSTRUCTIONS 1
#if defined(__x86_64__) || !defined(ETHR_PRE_PENTIUM4_COMPAT)
#define ETHR_MEMORY_BARRIER __asm__ __volatile__("mfence" : : : "memory")
@@ -40,123 +50,161 @@ typedef struct {
#else
#define ETHR_MEMORY_BARRIER \
do { \
- volatile long x___ = 0; \
+ volatile ethr_sint32_t x___ = 0; \
__asm__ __volatile__("lock; incl %0" : "=m"(x___) : "m"(x___) : "memory"); \
} while (0)
#endif
-#define ETHR_ATOMIC_HAVE_INC_DEC_INSTRUCTIONS 1
-
-#if defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_AUX_IMPL__)
+#endif /* ETHR_X86_ATOMIC_COMMON__ */
-#ifdef __x86_64__
-#define LONG_SUFFIX "q"
+#if ETHR_INCLUDE_ATOMIC_IMPL__ == 4
+#define ETHR_HAVE_NATIVE_ATOMIC32 1
+#define ETHR_NATMC_FUNC__(X) ethr_native_atomic32_ ## X
+#define ETHR_ATMC_T__ ethr_native_atomic32_t
+#define ETHR_AINT_T__ ethr_sint32_t
+#define ETHR_AINT_SUFFIX__ "l"
+#elif ETHR_INCLUDE_ATOMIC_IMPL__ == 8
+#define ETHR_HAVE_NATIVE_ATOMIC64 1
+#define ETHR_NATMC_FUNC__(X) ethr_native_atomic64_ ## X
+#define ETHR_ATMC_T__ ethr_native_atomic64_t
+#define ETHR_AINT_T__ ethr_sint64_t
+#define ETHR_AINT_SUFFIX__ "q"
#else
-#define LONG_SUFFIX "l"
+#error "Unsupported integer size"
#endif
+/* An atomic is an aligned ETHR_AINT_T__ accessed via locked operations.
+ */
+typedef struct {
+ volatile ETHR_AINT_T__ counter;
+} ETHR_ATMC_T__;
+
+#if defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_ATOMIC_IMPL__)
+
+static ETHR_INLINE ETHR_AINT_T__ *
+ETHR_NATMC_FUNC__(addr)(ETHR_ATMC_T__ *var)
+{
+ return (ETHR_AINT_T__ *) &var->counter;
+}
+
static ETHR_INLINE void
-ethr_native_atomic_init(ethr_native_atomic_t *var, long i)
+ETHR_NATMC_FUNC__(init)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ i)
{
var->counter = i;
}
-#define ethr_native_atomic_set(v, i) ethr_native_atomic_init((v), (i))
-static ETHR_INLINE long
-ethr_native_atomic_read(ethr_native_atomic_t *var)
+static ETHR_INLINE void
+ETHR_NATMC_FUNC__(set)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ i)
+{
+ var->counter = i;
+}
+
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(read)(ETHR_ATMC_T__ *var)
{
return var->counter;
}
static ETHR_INLINE void
-ethr_native_atomic_add(ethr_native_atomic_t *var, long incr)
+ETHR_NATMC_FUNC__(add)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ incr)
{
__asm__ __volatile__(
- "lock; add" LONG_SUFFIX " %1, %0"
+ "lock; add" ETHR_AINT_SUFFIX__ " %1, %0"
: "=m"(var->counter)
: "ir"(incr), "m"(var->counter));
}
static ETHR_INLINE void
-ethr_native_atomic_inc(ethr_native_atomic_t *var)
+ETHR_NATMC_FUNC__(inc)(ETHR_ATMC_T__ *var)
{
__asm__ __volatile__(
- "lock; inc" LONG_SUFFIX " %0"
+ "lock; inc" ETHR_AINT_SUFFIX__ " %0"
: "=m"(var->counter)
: "m"(var->counter));
}
static ETHR_INLINE void
-ethr_native_atomic_dec(ethr_native_atomic_t *var)
+ETHR_NATMC_FUNC__(dec)(ETHR_ATMC_T__ *var)
{
__asm__ __volatile__(
- "lock; dec" LONG_SUFFIX " %0"
+ "lock; dec" ETHR_AINT_SUFFIX__ " %0"
: "=m"(var->counter)
: "m"(var->counter));
}
-static ETHR_INLINE long
-ethr_native_atomic_add_return(ethr_native_atomic_t *var, long incr)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(add_return)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ incr)
{
- long tmp;
+ ETHR_AINT_T__ tmp;
tmp = incr;
__asm__ __volatile__(
- "lock; xadd" LONG_SUFFIX " %0, %1" /* xadd didn't exist prior to the 486 */
+ "lock; xadd" ETHR_AINT_SUFFIX__ " %0, %1" /* xadd didn't exist prior to the 486 */
: "=r"(tmp)
: "m"(var->counter), "0"(tmp));
/* now tmp is the atomic's previous value */
return tmp + incr;
}
-#define ethr_native_atomic_inc_return(var) ethr_native_atomic_add_return((var), 1)
-#define ethr_native_atomic_dec_return(var) ethr_native_atomic_add_return((var), -1)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(inc_return)(ETHR_ATMC_T__ *var)
+{
+ return ETHR_NATMC_FUNC__(add_return)(var, (ETHR_AINT_T__) 1);
+}
-static ETHR_INLINE long
-ethr_native_atomic_cmpxchg(ethr_native_atomic_t *var, long new, long old)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(dec_return)(ETHR_ATMC_T__ *var)
+{
+ return ETHR_NATMC_FUNC__(add_return)(var, (ETHR_AINT_T__) -1);
+}
+
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(cmpxchg)(ETHR_ATMC_T__ *var,
+ ETHR_AINT_T__ new,
+ ETHR_AINT_T__ old)
{
__asm__ __volatile__(
- "lock; cmpxchg" LONG_SUFFIX " %2, %3"
+ "lock; cmpxchg" ETHR_AINT_SUFFIX__ " %2, %3"
: "=a"(old), "=m"(var->counter)
: "r"(new), "m"(var->counter), "0"(old)
: "cc", "memory"); /* full memory clobber to make this a compiler barrier */
return old;
}
-static ETHR_INLINE long
-ethr_native_atomic_and_retold(ethr_native_atomic_t *var, long mask)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(and_retold)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ mask)
{
- long tmp, old;
+ ETHR_AINT_T__ tmp, old;
tmp = var->counter;
do {
old = tmp;
- tmp = ethr_native_atomic_cmpxchg(var, tmp & mask, tmp);
+ tmp = ETHR_NATMC_FUNC__(cmpxchg)(var, tmp & mask, tmp);
} while (__builtin_expect(tmp != old, 0));
/* now tmp is the atomic's previous value */
return tmp;
}
-static ETHR_INLINE long
-ethr_native_atomic_or_retold(ethr_native_atomic_t *var, long mask)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(or_retold)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ mask)
{
- long tmp, old;
+ ETHR_AINT_T__ tmp, old;
tmp = var->counter;
do {
old = tmp;
- tmp = ethr_native_atomic_cmpxchg(var, tmp | mask, tmp);
+ tmp = ETHR_NATMC_FUNC__(cmpxchg)(var, tmp | mask, tmp);
} while (__builtin_expect(tmp != old, 0));
/* now tmp is the atomic's previous value */
return tmp;
}
-static ETHR_INLINE long
-ethr_native_atomic_xchg(ethr_native_atomic_t *var, long val)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(xchg)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ val)
{
- long tmp = val;
+ ETHR_AINT_T__ tmp = val;
__asm__ __volatile__(
- "xchg" LONG_SUFFIX " %0, %1"
+ "xchg" ETHR_AINT_SUFFIX__ " %0, %1"
: "=r"(tmp)
: "m"(var->counter), "0"(tmp));
/* now tmp is the atomic's previous value */
@@ -167,57 +215,73 @@ ethr_native_atomic_xchg(ethr_native_atomic_t *var, long val)
* Atomic ops with at least specified barriers.
*/
-static ETHR_INLINE long
-ethr_native_atomic_read_acqb(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(read_acqb)(ETHR_ATMC_T__ *var)
{
- long val;
+ ETHR_AINT_T__ val;
#if defined(__x86_64__) || !defined(ETHR_PRE_PENTIUM4_COMPAT)
val = var->counter;
#else
- val = ethr_native_atomic_add_return(var, 0);
+ val = ETHR_NATMC_FUNC__(add_return)(var, 0);
#endif
__asm__ __volatile__("" : : : "memory");
return val;
}
static ETHR_INLINE void
-ethr_native_atomic_set_relb(ethr_native_atomic_t *var, long i)
+ETHR_NATMC_FUNC__(set_relb)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ i)
{
__asm__ __volatile__("" : : : "memory");
#if defined(__x86_64__) || !defined(ETHR_PRE_PENTIUM4_COMPAT)
var->counter = i;
#else
- (void) ethr_native_atomic_xchg(var, i);
+ (void) ETHR_NATMC_FUNC__(xchg)(var, i);
#endif
}
-static ETHR_INLINE long
-ethr_native_atomic_inc_return_acqb(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(inc_return_acqb)(ETHR_ATMC_T__ *var)
{
- long res = ethr_native_atomic_inc_return(var);
+ ETHR_AINT_T__ res = ETHR_NATMC_FUNC__(inc_return)(var);
__asm__ __volatile__("" : : : "memory");
return res;
}
static ETHR_INLINE void
-ethr_native_atomic_dec_relb(ethr_native_atomic_t *var)
+ETHR_NATMC_FUNC__(dec_relb)(ETHR_ATMC_T__ *var)
{
__asm__ __volatile__("" : : : "memory");
- ethr_native_atomic_dec(var);
+ ETHR_NATMC_FUNC__(dec)(var);
}
-static ETHR_INLINE long
-ethr_native_atomic_dec_return_relb(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(dec_return_relb)(ETHR_ATMC_T__ *var)
{
__asm__ __volatile__("" : : : "memory");
- return ethr_native_atomic_dec_return(var);
+ return ETHR_NATMC_FUNC__(dec_return)(var);
}
-#define ethr_native_atomic_cmpxchg_acqb ethr_native_atomic_cmpxchg
-#define ethr_native_atomic_cmpxchg_relb ethr_native_atomic_cmpxchg
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(cmpxchg_acqb)(ETHR_ATMC_T__ *var,
+ ETHR_AINT_T__ new,
+ ETHR_AINT_T__ old)
+{
+ return ETHR_NATMC_FUNC__(cmpxchg)(var, new, old);
+}
-#undef LONG_SUFFIX
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(cmpxchg_relb)(ETHR_ATMC_T__ *var,
+ ETHR_AINT_T__ new,
+ ETHR_AINT_T__ old)
+{
+ return ETHR_NATMC_FUNC__(cmpxchg)(var, new, old);
+}
#endif /* ETHR_TRY_INLINE_FUNCS */
-#endif /* ETHREAD_I386_ATOMIC_H */
+#undef ETHR_NATMC_FUNC__
+#undef ETHR_ATMC_T__
+#undef ETHR_AINT_T__
+#undef ETHR_AINT_SUFFIX__
+
+#endif /* ETHR_INCLUDE_ATOMIC_IMPL__ */
diff --git a/erts/include/internal/i386/ethread.h b/erts/include/internal/i386/ethread.h
index ed43e77279..b5a17caefb 100644
--- a/erts/include/internal/i386/ethread.h
+++ b/erts/include/internal/i386/ethread.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2005-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2005-2010. 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
@@ -24,7 +24,12 @@
#ifndef ETHREAD_I386_ETHREAD_H
#define ETHREAD_I386_ETHREAD_H
+#define ETHR_ATOMIC_WANT_32BIT_IMPL__
#include "atomic.h"
+#if ETHR_SIZEOF_PTR == 8
+# define ETHR_ATOMIC_WANT_64BIT_IMPL__
+# include "atomic.h"
+#endif
#include "spinlock.h"
#include "rwlock.h"
diff --git a/erts/include/internal/libatomic_ops/ethr_atomic.h b/erts/include/internal/libatomic_ops/ethr_atomic.h
index a6eb43a0bd..d56693dbf8 100644
--- a/erts/include/internal/libatomic_ops/ethr_atomic.h
+++ b/erts/include/internal/libatomic_ops/ethr_atomic.h
@@ -46,17 +46,39 @@
* - AO_store()
* - AO_compare_and_swap()
*
- * The `AO_t' type also have to be at least as large as
- * `void *' and `long' types.
+ * The `AO_t' type also have to be at least as large as the `void *' type.
*/
#if ETHR_SIZEOF_AO_T < ETHR_SIZEOF_PTR
#error The AO_t type is too small
#endif
+#if ETHR_SIZEOF_AO_T == 4
+#define ETHR_HAVE_NATIVE_ATOMIC32 1
+#define ETHR_NATMC_FUNC__(X) ethr_native_atomic32_ ## X
+#define ETHR_ATMC_T__ ethr_native_atomic32_t
+#define ETHR_AINT_T__ ethr_sint32_t
+#define ETHR_AINT_SUFFIX__ "l"
+#elif ETHR_SIZEOF_AO_T == 8
+#define ETHR_HAVE_NATIVE_ATOMIC64 1
+#define ETHR_NATMC_FUNC__(X) ethr_native_atomic64_ ## X
+#define ETHR_ATMC_T__ ethr_native_atomic64_t
+#define ETHR_AINT_T__ ethr_sint64_t
+#define ETHR_AINT_SUFFIX__ "q"
+#else
+#error "Unsupported integer size"
+#endif
+
+#if ETHR_SIZEOF_AO_T == 8
+typedef union {
+ volatile AO_t counter;
+ ethr_sint32_t sint32[2];
+} ETHR_ATMC_T__;
+#else
typedef struct {
volatile AO_t counter;
-} ethr_native_atomic_t;
+} ETHR_ATMC_T__;
+#endif
#define ETHR_MEMORY_BARRIER AO_nop_full()
#ifdef AO_HAVE_nop_write
@@ -72,123 +94,151 @@ typedef struct {
#ifdef AO_NO_DD_ORDERING
# define ETHR_READ_DEPEND_MEMORY_BARRIER ETHR_READ_MEMORY_BARRIER
#else
-# define ETHR_READ_DEPEND_MEMORY_BARRIER __asm__ __volatile__("":::"memory")
+# define ETHR_READ_DEPEND_MEMORY_BARRIER AO_compiler_barrier()
+#endif
+
+#if defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_ATOMIC_IMPL__)
+
+static ETHR_INLINE ETHR_AINT_T__ *
+ETHR_NATMC_FUNC__(addr)(ETHR_ATMC_T__ *var)
+{
+ return (ETHR_AINT_T__ *) &var->counter;
+}
+
+#if ETHR_SIZEOF_AO_T == 8
+/*
+ * We also need to provide an ethr_native_atomic32_addr(), since
+ * this 64-bit implementation will be used implementing 32-bit
+ * native atomics.
+ */
+
+static ETHR_INLINE ethr_sint32_t *
+ethr_native_atomic32_addr(ETHR_ATMC_T__ *var)
+{
+ ETHR_ASSERT(((void *) &var->sint32[0]) == ((void *) &var->counter));
+#ifdef ETHR_BIGENDIAN
+ return &var->sint32[1];
+#else
+ return &var->sint32[0];
#endif
+}
-#if defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_AUX_IMPL__)
+#endif /* ETHR_SIZEOF_AO_T == 8 */
static ETHR_INLINE void
-ethr_native_atomic_set(ethr_native_atomic_t *var, long value)
+ETHR_NATMC_FUNC__(set)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ value)
{
AO_store(&var->counter, (AO_t) value);
}
static ETHR_INLINE void
-ethr_native_atomic_init(ethr_native_atomic_t *var, long value)
+ETHR_NATMC_FUNC__(init)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ value)
{
- ethr_native_atomic_set(var, value);
+ ETHR_NATMC_FUNC__(set)(var, value);
}
-static ETHR_INLINE long
-ethr_native_atomic_read(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(read)(ETHR_ATMC_T__ *var)
{
- return (long) AO_load(&var->counter);
+ return (ETHR_AINT_T__) AO_load(&var->counter);
}
-static ETHR_INLINE long
-ethr_native_atomic_add_return(ethr_native_atomic_t *var, long incr)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(add_return)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ incr)
{
#ifdef AO_HAVE_fetch_and_add
- return ((long) AO_fetch_and_add(&var->counter, (AO_t) incr)) + incr;
+ return ((ETHR_AINT_T__) AO_fetch_and_add(&var->counter, (AO_t) incr)) + incr;
#else
while (1) {
AO_t exp = AO_load(&var->counter);
AO_t new = exp + (AO_t) incr;
if (AO_compare_and_swap(&var->counter, exp, new))
- return (long) new;
+ return (ETHR_AINT_T__) new;
}
#endif
}
static ETHR_INLINE void
-ethr_native_atomic_add(ethr_native_atomic_t *var, long incr)
+ETHR_NATMC_FUNC__(add)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ incr)
{
- (void) ethr_native_atomic_add_return(var, incr);
+ (void) ETHR_NATMC_FUNC__(add_return)(var, incr);
}
-static ETHR_INLINE long
-ethr_native_atomic_inc_return(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(inc_return)(ETHR_ATMC_T__ *var)
{
#ifdef AO_HAVE_fetch_and_add1
- return ((long) AO_fetch_and_add1(&var->counter)) + 1;
+ return ((ETHR_AINT_T__) AO_fetch_and_add1(&var->counter)) + 1;
#else
- return ethr_native_atomic_add_return(var, 1);
+ return ETHR_NATMC_FUNC__(add_return)(var, 1);
#endif
}
static ETHR_INLINE void
-ethr_native_atomic_inc(ethr_native_atomic_t *var)
+ETHR_NATMC_FUNC__(inc)(ETHR_ATMC_T__ *var)
{
- (void) ethr_native_atomic_inc_return(var);
+ (void) ETHR_NATMC_FUNC__(inc_return)(var);
}
-static ETHR_INLINE long
-ethr_native_atomic_dec_return(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(dec_return)(ETHR_ATMC_T__ *var)
{
#ifdef AO_HAVE_fetch_and_sub1
- return ((long) AO_fetch_and_sub1(&var->counter)) - 1;
+ return ((ETHR_AINT_T__) AO_fetch_and_sub1(&var->counter)) - 1;
#else
- return ethr_native_atomic_add_return(var, -1);
+ return ETHR_NATMC_FUNC__(add_return)(var, -1);
#endif
}
static ETHR_INLINE void
-ethr_native_atomic_dec(ethr_native_atomic_t *var)
+ETHR_NATMC_FUNC__(dec)(ETHR_ATMC_T__ *var)
{
- (void) ethr_native_atomic_dec_return(var);
+ (void) ETHR_NATMC_FUNC__(dec_return)(var);
}
-static ETHR_INLINE long
-ethr_native_atomic_and_retold(ethr_native_atomic_t *var, long mask)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(and_retold)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ mask)
{
while (1) {
AO_t exp = AO_load(&var->counter);
AO_t new = exp & ((AO_t) mask);
if (AO_compare_and_swap(&var->counter, exp, new))
- return (long) exp;
+ return (ETHR_AINT_T__) exp;
}
}
-static ETHR_INLINE long
-ethr_native_atomic_or_retold(ethr_native_atomic_t *var, long mask)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(or_retold)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ mask)
{
while (1) {
AO_t exp = AO_load(&var->counter);
AO_t new = exp | ((AO_t) mask);
if (AO_compare_and_swap(&var->counter, exp, new))
- return (long) exp;
+ return (ETHR_AINT_T__) exp;
}
}
-static ETHR_INLINE long
-ethr_native_atomic_cmpxchg(ethr_native_atomic_t *var, long new, long exp)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(cmpxchg)(ETHR_ATMC_T__ *var,
+ ETHR_AINT_T__ new,
+ ETHR_AINT_T__ exp)
{
- long act;
+ ETHR_AINT_T__ act;
do {
if (AO_compare_and_swap(&var->counter, (AO_t) exp, (AO_t) new))
return exp;
- act = (long) AO_load(&var->counter);
+ act = (ETHR_AINT_T__) AO_load(&var->counter);
} while (act == exp);
return act;
}
-static ETHR_INLINE long
-ethr_native_atomic_xchg(ethr_native_atomic_t *var, long new)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(xchg)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ new)
{
while (1) {
AO_t exp = AO_load(&var->counter);
if (AO_compare_and_swap(&var->counter, exp, (AO_t) new))
- return (long) exp;
+ return (ETHR_AINT_T__) exp;
}
}
@@ -196,97 +246,105 @@ ethr_native_atomic_xchg(ethr_native_atomic_t *var, long new)
* Atomic ops with at least specified barriers.
*/
-static ETHR_INLINE long
-ethr_native_atomic_read_acqb(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(read_acqb)(ETHR_ATMC_T__ *var)
{
#ifdef AO_HAVE_load_acquire
- return (long) AO_load_acquire(&var->counter);
+ return (ETHR_AINT_T__) AO_load_acquire(&var->counter);
#else
- long res = ethr_native_atomic_read(var);
+ ETHR_AINT_T__ res = ETHR_NATMC_FUNC__(read)(var);
ETHR_MEMORY_BARRIER;
return res;
#endif
}
-static ETHR_INLINE long
-ethr_native_atomic_inc_return_acqb(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(inc_return_acqb)(ETHR_ATMC_T__ *var)
{
#ifdef AO_HAVE_fetch_and_add1_acquire
- return ((long) AO_fetch_and_add1_acquire(&var->counter)) + 1;
+ return ((ETHR_AINT_T__) AO_fetch_and_add1_acquire(&var->counter)) + 1;
#else
- long res = ethr_native_atomic_add_return(var, 1);
+ ETHR_AINT_T__ res = ETHR_NATMC_FUNC__(add_return)(var, 1);
ETHR_MEMORY_BARRIER;
return res;
#endif
}
static ETHR_INLINE void
-ethr_native_atomic_set_relb(ethr_native_atomic_t *var, long value)
+ETHR_NATMC_FUNC__(set_relb)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ value)
{
#ifdef AO_HAVE_store_release
AO_store_release(&var->counter, (AO_t) value);
#else
ETHR_MEMORY_BARRIER;
- ethr_native_atomic_set(var, value);
+ ETHR_NATMC_FUNC__(set)(var, value);
#endif
}
-static ETHR_INLINE long
-ethr_native_atomic_dec_return_relb(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(dec_return_relb)(ETHR_ATMC_T__ *var)
{
#ifdef AO_HAVE_fetch_and_sub1_release
- return ((long) AO_fetch_and_sub1_release(&var->counter)) - 1;
+ return ((ETHR_AINT_T__) AO_fetch_and_sub1_release(&var->counter)) - 1;
#else
ETHR_MEMORY_BARRIER;
- return ethr_native_atomic_dec_return(var);
+ return ETHR_NATMC_FUNC__(dec_return)(var);
#endif
}
static ETHR_INLINE void
-ethr_native_atomic_dec_relb(ethr_native_atomic_t *var)
+ETHR_NATMC_FUNC__(dec_relb)(ETHR_ATMC_T__ *var)
{
- (void) ethr_native_atomic_dec_return_relb(var);
+ (void) ETHR_NATMC_FUNC__(dec_return_relb)(var);
}
-static ETHR_INLINE long
-ethr_native_atomic_cmpxchg_acqb(ethr_native_atomic_t *var, long new, long exp)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(cmpxchg_acqb)(ETHR_ATMC_T__ *var,
+ ETHR_AINT_T__ new,
+ ETHR_AINT_T__ exp)
{
#ifdef AO_HAVE_compare_and_swap_acquire
- long act;
+ ETHR_AINT_T__ act;
do {
if (AO_compare_and_swap_acquire(&var->counter, (AO_t) exp, (AO_t) new))
return exp;
- act = (long) AO_load(&var->counter);
+ act = (ETHR_AINT_T__) AO_load(&var->counter);
} while (act == exp);
AO_nop_full();
return act;
#else
- long act = ethr_native_atomic_cmpxchg(var, new, exp);
+ ETHR_AINT_T__ act = ETHR_NATMC_FUNC__(cmpxchg)(var, new, exp);
ETHR_MEMORY_BARRIER;
return act;
#endif
}
-static ETHR_INLINE long
-ethr_native_atomic_cmpxchg_relb(ethr_native_atomic_t *var, long new, long exp)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(cmpxchg_relb)(ETHR_ATMC_T__ *var,
+ ETHR_AINT_T__ new,
+ ETHR_AINT_T__ exp)
{
#ifdef AO_HAVE_compare_and_swap_release
- long act;
+ ETHR_AINT_T__ act;
do {
if (AO_compare_and_swap_release(&var->counter, (AO_t) exp, (AO_t) new))
return exp;
- act = (long) AO_load(&var->counter);
+ act = (ETHR_AINT_T__) AO_load(&var->counter);
} while (act == exp);
return act;
#else
ETHR_MEMORY_BARRIER;
- return ethr_native_atomic_cmpxchg(var, new, exp);
+ return ETHR_NATMC_FUNC__(cmpxchg)(var, new, exp);
#endif
}
-#endif
+#endif /* ETHR_TRY_INLINE_FUNCS */
-#endif
+#undef ETHR_NATMC_FUNC__
+#undef ETHR_ATMC_T__
+#undef ETHR_AINT_T__
-#endif
+#endif /* !defined(ETHR_HAVE_NATIVE_ATOMICS) && defined(ETHR_HAVE_LIBATOMIC_OPS) */
+
+#endif /* ETHR_LIBATOMIC_OPS_ATOMIC_H__ */
diff --git a/erts/include/internal/ppc32/atomic.h b/erts/include/internal/ppc32/atomic.h
index f21f7c9588..522f433649 100644
--- a/erts/include/internal/ppc32/atomic.h
+++ b/erts/include/internal/ppc32/atomic.h
@@ -28,31 +28,39 @@
#ifndef ETHREAD_PPC_ATOMIC_H
#define ETHREAD_PPC_ATOMIC_H
+#define ETHR_HAVE_NATIVE_ATOMIC32 1
+
typedef struct {
- volatile int counter;
-} ethr_native_atomic_t;
+ volatile ethr_sint32_t counter;
+} ethr_native_atomic32_t;
#define ETHR_MEMORY_BARRIER __asm__ __volatile__("sync" : : : "memory")
-#if defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_AUX_IMPL__)
+#if defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_ATOMIC_IMPL__)
+
+static ETHR_INLINE ethr_sint32_t *
+ethr_native_atomic32_addr(ethr_native_atomic32_t *var)
+{
+ return (ethr_sint32_t *) &var->counter;
+}
static ETHR_INLINE void
-ethr_native_atomic_init(ethr_native_atomic_t *var, int i)
+ethr_native_atomic32_init(ethr_native_atomic32_t *var, ethr_sint32_t i)
{
var->counter = i;
}
-#define ethr_native_atomic_set(v, i) ethr_native_atomic_init((v), (i))
+#define ethr_native_atomic32_set(v, i) ethr_native_atomic32_init((v), (i))
-static ETHR_INLINE int
-ethr_native_atomic_read(ethr_native_atomic_t *var)
+static ETHR_INLINE ethr_sint32_t
+ethr_native_atomic32_read(ethr_native_atomic32_t *var)
{
return var->counter;
}
-static ETHR_INLINE int
-ethr_native_atomic_add_return(ethr_native_atomic_t *var, int incr)
+static ETHR_INLINE ethr_sint32_t
+ethr_native_atomic32_add_return(ethr_native_atomic32_t *var, ethr_sint32_t incr)
{
- int tmp;
+ ethr_sint32_t tmp;
__asm__ __volatile__(
"eieio\n\t"
@@ -69,16 +77,16 @@ ethr_native_atomic_add_return(ethr_native_atomic_t *var, int incr)
}
static ETHR_INLINE void
-ethr_native_atomic_add(ethr_native_atomic_t *var, int incr)
+ethr_native_atomic32_add(ethr_native_atomic32_t *var, ethr_sint32_t incr)
{
/* XXX: could use weaker version here w/o eieio+isync */
- (void)ethr_native_atomic_add_return(var, incr);
+ (void)ethr_native_atomic32_add_return(var, incr);
}
-static ETHR_INLINE int
-ethr_native_atomic_inc_return(ethr_native_atomic_t *var)
+static ETHR_INLINE ethr_sint32_t
+ethr_native_atomic32_inc_return(ethr_native_atomic32_t *var)
{
- int tmp;
+ ethr_sint32_t tmp;
__asm__ __volatile__(
"eieio\n\t"
@@ -95,16 +103,16 @@ ethr_native_atomic_inc_return(ethr_native_atomic_t *var)
}
static ETHR_INLINE void
-ethr_native_atomic_inc(ethr_native_atomic_t *var)
+ethr_native_atomic32_inc(ethr_native_atomic32_t *var)
{
/* XXX: could use weaker version here w/o eieio+isync */
- (void)ethr_native_atomic_inc_return(var);
+ (void)ethr_native_atomic32_inc_return(var);
}
-static ETHR_INLINE int
-ethr_native_atomic_dec_return(ethr_native_atomic_t *var)
+static ETHR_INLINE ethr_sint32_t
+ethr_native_atomic32_dec_return(ethr_native_atomic32_t *var)
{
- int tmp;
+ ethr_sint32_t tmp;
__asm__ __volatile__(
"eieio\n\t"
@@ -121,16 +129,16 @@ ethr_native_atomic_dec_return(ethr_native_atomic_t *var)
}
static ETHR_INLINE void
-ethr_native_atomic_dec(ethr_native_atomic_t *var)
+ethr_native_atomic32_dec(ethr_native_atomic32_t *var)
{
/* XXX: could use weaker version here w/o eieio+isync */
- (void)ethr_native_atomic_dec_return(var);
+ (void)ethr_native_atomic32_dec_return(var);
}
-static ETHR_INLINE int
-ethr_native_atomic_and_retold(ethr_native_atomic_t *var, int mask)
+static ETHR_INLINE ethr_sint32_t
+ethr_native_atomic32_and_retold(ethr_native_atomic32_t *var, ethr_sint32_t mask)
{
- int old, new;
+ ethr_sint32_t old, new;
__asm__ __volatile__(
"eieio\n\t"
@@ -146,10 +154,10 @@ ethr_native_atomic_and_retold(ethr_native_atomic_t *var, int mask)
return old;
}
-static ETHR_INLINE int
-ethr_native_atomic_or_retold(ethr_native_atomic_t *var, int mask)
+static ETHR_INLINE ethr_sint32_t
+ethr_native_atomic32_or_retold(ethr_native_atomic32_t *var, ethr_sint32_t mask)
{
- int old, new;
+ ethr_sint32_t old, new;
__asm__ __volatile__(
"eieio\n\t"
@@ -165,10 +173,10 @@ ethr_native_atomic_or_retold(ethr_native_atomic_t *var, int mask)
return old;
}
-static ETHR_INLINE int
-ethr_native_atomic_xchg(ethr_native_atomic_t *var, int val)
+static ETHR_INLINE ethr_sint32_t
+ethr_native_atomic32_xchg(ethr_native_atomic32_t *var, ethr_sint32_t val)
{
- int tmp;
+ ethr_sint32_t tmp;
__asm__ __volatile__(
"eieio\n\t"
@@ -183,10 +191,12 @@ ethr_native_atomic_xchg(ethr_native_atomic_t *var, int val)
return tmp;
}
-static ETHR_INLINE int
-ethr_native_atomic_cmpxchg(ethr_native_atomic_t *var, int new, int expected)
+static ETHR_INLINE ethr_sint32_t
+ethr_native_atomic32_cmpxchg(ethr_native_atomic32_t *var,
+ ethr_sint32_t new,
+ ethr_sint32_t expected)
{
- int old;
+ ethr_sint32_t old;
__asm__ __volatile__(
"eieio\n\t"
@@ -210,20 +220,20 @@ ethr_native_atomic_cmpxchg(ethr_native_atomic_t *var, int new, int expected)
*/
static ETHR_INLINE long
-ethr_native_atomic_read_acqb(ethr_native_atomic_t *var)
+ethr_native_atomic32_read_acqb(ethr_native_atomic32_t *var)
{
- long res = ethr_native_atomic_read(var);
+ long res = ethr_native_atomic32_read(var);
ETHR_MEMORY_BARRIER;
return res;
}
-#define ethr_native_atomic_set_relb ethr_native_atomic_xchg
-#define ethr_native_atomic_inc_return_acqb ethr_native_atomic_inc_return
-#define ethr_native_atomic_dec_relb ethr_native_atomic_dec_return
-#define ethr_native_atomic_dec_return_relb ethr_native_atomic_dec_return
+#define ethr_native_atomic32_set_relb ethr_native_atomic32_xchg
+#define ethr_native_atomic32_inc_return_acqb ethr_native_atomic32_inc_return
+#define ethr_native_atomic32_dec_relb ethr_native_atomic32_dec_return
+#define ethr_native_atomic32_dec_return_relb ethr_native_atomic32_dec_return
-#define ethr_native_atomic_cmpxchg_acqb ethr_native_atomic_cmpxchg
-#define ethr_native_atomic_cmpxchg_relb ethr_native_atomic_cmpxchg
+#define ethr_native_atomic32_cmpxchg_acqb ethr_native_atomic32_cmpxchg
+#define ethr_native_atomic32_cmpxchg_relb ethr_native_atomic32_cmpxchg
#endif /* ETHR_TRY_INLINE_FUNCS */
diff --git a/erts/include/internal/ppc32/ethread.h b/erts/include/internal/ppc32/ethread.h
index 12efc1b653..3b619e9d01 100644
--- a/erts/include/internal/ppc32/ethread.h
+++ b/erts/include/internal/ppc32/ethread.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2005-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2005-2011. 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
diff --git a/erts/include/internal/pthread/ethr_event.h b/erts/include/internal/pthread/ethr_event.h
index 104ec287e0..4c29b28536 100644
--- a/erts/include/internal/pthread/ethr_event.h
+++ b/erts/include/internal/pthread/ethr_event.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2009-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2009-2011. 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
@@ -30,31 +30,9 @@
#include <linux/futex.h>
#include <sys/time.h>
-/*
- * Note: Linux futexes operate on 32-bit integers, but
- * ethr_native_atomic_t are 64-bits on 64-bit
- * platforms. This has to be taken into account.
- * Therefore, in each individual value used each
- * byte look the same.
- */
-
-#if ETHR_SIZEOF_PTR == 8
-
-#define ETHR_EVENT_OFF_WAITER__ 0xffffffffffffffffL
-#define ETHR_EVENT_OFF__ 0x7777777777777777L
-#define ETHR_EVENT_ON__ 0L
-
-#elif ETHR_SIZEOF_PTR == 4
-
-#define ETHR_EVENT_OFF_WAITER__ 0xffffffffL
-#define ETHR_EVENT_OFF__ 0x77777777L
-#define ETHR_EVENT_ON__ 0L
-
-#else
-
-#error ehrm...
-
-#endif
+#define ETHR_EVENT_OFF_WAITER__ ((ethr_sint32_t) -1)
+#define ETHR_EVENT_OFF__ ((ethr_sint32_t) 1)
+#define ETHR_EVENT_ON__ ((ethr_sint32_t) 0)
#if defined(FUTEX_WAIT_PRIVATE) && defined(FUTEX_WAKE_PRIVATE)
# define ETHR_FUTEX_WAIT__ FUTEX_WAIT_PRIVATE
@@ -65,11 +43,17 @@
#endif
typedef struct {
- ethr_atomic_t futex;
+ ethr_atomic32_t futex;
} ethr_event;
-#define ETHR_FUTEX__(FTX, OP, VAL) \
- (-1 == syscall(__NR_futex, (void *) (FTX), (OP), (int) (VAL), NULL, NULL, 0)\
+#define ETHR_FUTEX__(FTX, OP, VAL) \
+ (-1 == syscall(__NR_futex, \
+ (void *) ethr_atomic32_addr((FTX)), \
+ (OP), \
+ (int) (VAL), \
+ NULL, \
+ NULL, \
+ 0) \
? errno : 0)
#if defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_EVENT_IMPL__)
@@ -77,9 +61,9 @@ typedef struct {
static void ETHR_INLINE
ETHR_INLINE_FUNC_NAME_(ethr_event_set)(ethr_event *e)
{
- long val;
- ETHR_WRITE_MEMORY_BARRIER;
- val = ethr_atomic_xchg(&e->futex, ETHR_EVENT_ON__);
+ ethr_sint32_t val;
+ ETHR_MEMORY_BARRIER;
+ val = ethr_atomic32_xchg(&e->futex, ETHR_EVENT_ON__);
if (val == ETHR_EVENT_OFF_WAITER__) {
int res = ETHR_FUTEX__(&e->futex, ETHR_FUTEX_WAKE__, 1);
if (res != 0)
@@ -90,7 +74,7 @@ ETHR_INLINE_FUNC_NAME_(ethr_event_set)(ethr_event *e)
static void ETHR_INLINE
ETHR_INLINE_FUNC_NAME_(ethr_event_reset)(ethr_event *e)
{
- ethr_atomic_set(&e->futex, ETHR_EVENT_OFF__);
+ ethr_atomic32_set(&e->futex, ETHR_EVENT_OFF__);
ETHR_MEMORY_BARRIER;
}
@@ -100,7 +84,7 @@ ETHR_INLINE_FUNC_NAME_(ethr_event_reset)(ethr_event *e)
/* --- Posix mutex/cond implementation of events ---------------------------- */
typedef struct {
- ethr_atomic_t state;
+ ethr_atomic32_t state;
pthread_mutex_t mtx;
pthread_cond_t cnd;
} ethr_event;
@@ -114,9 +98,9 @@ typedef struct {
static void ETHR_INLINE
ETHR_INLINE_FUNC_NAME_(ethr_event_set)(ethr_event *e)
{
- long val;
- ETHR_WRITE_MEMORY_BARRIER;
- val = ethr_atomic_xchg(&e->state, ETHR_EVENT_ON__);
+ ethr_sint32_t val;
+ ETHR_MEMORY_BARRIER;
+ val = ethr_atomic32_xchg(&e->state, ETHR_EVENT_ON__);
if (val == ETHR_EVENT_OFF_WAITER__) {
int res = pthread_mutex_lock(&e->mtx);
if (res != 0)
@@ -133,7 +117,7 @@ ETHR_INLINE_FUNC_NAME_(ethr_event_set)(ethr_event *e)
static void ETHR_INLINE
ETHR_INLINE_FUNC_NAME_(ethr_event_reset)(ethr_event *e)
{
- ethr_atomic_set(&e->state, ETHR_EVENT_OFF__);
+ ethr_atomic32_set(&e->state, ETHR_EVENT_OFF__);
ETHR_MEMORY_BARRIER;
}
diff --git a/erts/include/internal/sparc32/atomic.h b/erts/include/internal/sparc32/atomic.h
index 2da6472393..00380dbf07 100644
--- a/erts/include/internal/sparc32/atomic.h
+++ b/erts/include/internal/sparc32/atomic.h
@@ -21,49 +21,86 @@
* Native ethread atomics on SPARC V9.
* Author: Mikael Pettersson.
*/
-#ifndef ETHR_SPARC32_ATOMIC_H
-#define ETHR_SPARC32_ATOMIC_H
-typedef struct {
- volatile long counter;
-} ethr_native_atomic_t;
+#undef ETHR_INCLUDE_ATOMIC_IMPL__
+#if !defined(ETHR_SPARC_V9_ATOMIC32_H__) && defined(ETHR_ATOMIC_WANT_32BIT_IMPL__)
+#define ETHR_SPARC_V9_ATOMIC32_H__
+#define ETHR_INCLUDE_ATOMIC_IMPL__ 4
+#undef ETHR_ATOMIC_WANT_32BIT_IMPL__
+#elif !defined(ETHR_SPARC_V9_ATOMIC64_H__) && defined(ETHR_ATOMIC_WANT_64BIT_IMPL__)
+#define ETHR_SPARC_V9_ATOMIC64_H__
+#define ETHR_INCLUDE_ATOMIC_IMPL__ 8
+#undef ETHR_ATOMIC_WANT_64BIT_IMPL__
+#endif
+
+#ifdef ETHR_INCLUDE_ATOMIC_IMPL__
+
+#ifndef ETHR_SPARC_V9_ATOMIC_COMMON__
+#define ETHR_SPARC_V9_ATOMIC_COMMON__
#define ETHR_MEMORY_BARRIER \
__asm__ __volatile__("membar #LoadLoad|#LoadStore|#StoreLoad|#StoreStore\n" \
: : : "memory")
-#if defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_AUX_IMPL__)
-
-#if defined(__arch64__)
-#define CASX "casx"
+#endif /* ETHR_SPARC_V9_ATOMIC_COMMON__ */
+
+#if ETHR_INCLUDE_ATOMIC_IMPL__ == 4
+#define ETHR_HAVE_NATIVE_ATOMIC32 1
+#define ETHR_NATMC_FUNC__(X) ethr_native_atomic32_ ## X
+#define ETHR_ATMC_T__ ethr_native_atomic32_t
+#define ETHR_AINT_T__ ethr_sint32_t
+#define ETHR_CAS__ "cas"
+#elif ETHR_INCLUDE_ATOMIC_IMPL__ == 8
+#define ETHR_HAVE_NATIVE_ATOMIC64 1
+#define ETHR_NATMC_FUNC__(X) ethr_native_atomic64_ ## X
+#define ETHR_ATMC_T__ ethr_native_atomic64_t
+#define ETHR_AINT_T__ ethr_sint64_t
+#define ETHR_CAS__ "casx"
#else
-#define CASX "cas"
+#error "Unsupported integer size"
#endif
+typedef struct {
+ volatile ETHR_AINT_T__ counter;
+} ETHR_ATMC_T__;
+
+#if defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_ATOMIC_IMPL__)
+
+static ETHR_INLINE ETHR_AINT_T__ *
+ETHR_NATMC_FUNC__(addr)(ETHR_ATMC_T__ *var)
+{
+ return (ETHR_AINT_T__ *) &var->counter;
+}
+
+static ETHR_INLINE void
+ETHR_NATMC_FUNC__(init)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ i)
+{
+ var->counter = i;
+}
+
static ETHR_INLINE void
-ethr_native_atomic_init(ethr_native_atomic_t *var, long i)
+ETHR_NATMC_FUNC__(set)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ i)
{
var->counter = i;
}
-#define ethr_native_atomic_set(v, i) ethr_native_atomic_init((v), (i))
-static ETHR_INLINE long
-ethr_native_atomic_read(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(read)(ETHR_ATMC_T__ *var)
{
return var->counter;
}
-static ETHR_INLINE long
-ethr_native_atomic_add_return(ethr_native_atomic_t *var, long incr)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(add_return)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ incr)
{
- long old, tmp;
+ ETHR_AINT_T__ old, tmp;
__asm__ __volatile__("membar #LoadLoad|#StoreLoad\n");
do {
old = var->counter;
tmp = old+incr;
__asm__ __volatile__(
- CASX " [%2], %1, %0"
+ ETHR_CAS__ " [%2], %1, %0"
: "=&r"(tmp)
: "r"(old), "r"(&var->counter), "0"(tmp)
: "memory");
@@ -73,46 +110,46 @@ ethr_native_atomic_add_return(ethr_native_atomic_t *var, long incr)
}
static ETHR_INLINE void
-ethr_native_atomic_add(ethr_native_atomic_t *var, long incr)
+ETHR_NATMC_FUNC__(add)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ incr)
{
- (void)ethr_native_atomic_add_return(var, incr);
+ (void)ETHR_NATMC_FUNC__(add_return)(var, incr);
}
-static ETHR_INLINE long
-ethr_native_atomic_inc_return(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(inc_return)(ETHR_ATMC_T__ *var)
{
- return ethr_native_atomic_add_return(var, 1);
+ return ETHR_NATMC_FUNC__(add_return)(var, 1);
}
static ETHR_INLINE void
-ethr_native_atomic_inc(ethr_native_atomic_t *var)
+ETHR_NATMC_FUNC__(inc)(ETHR_ATMC_T__ *var)
{
- (void)ethr_native_atomic_add_return(var, 1);
+ (void)ETHR_NATMC_FUNC__(add_return)(var, 1);
}
-static ETHR_INLINE long
-ethr_native_atomic_dec_return(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(dec_return)(ETHR_ATMC_T__ *var)
{
- return ethr_native_atomic_add_return(var, -1);
+ return ETHR_NATMC_FUNC__(add_return)(var, -1);
}
static ETHR_INLINE void
-ethr_native_atomic_dec(ethr_native_atomic_t *var)
+ETHR_NATMC_FUNC__(dec)(ETHR_ATMC_T__ *var)
{
- (void)ethr_native_atomic_add_return(var, -1);
+ (void)ETHR_NATMC_FUNC__(add_return)(var, -1);
}
-static ETHR_INLINE long
-ethr_native_atomic_and_retold(ethr_native_atomic_t *var, long mask)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(and_retold)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ mask)
{
- long old, tmp;
+ ETHR_AINT_T__ old, tmp;
__asm__ __volatile__("membar #LoadLoad|#StoreLoad\n");
do {
old = var->counter;
tmp = old & mask;
__asm__ __volatile__(
- CASX " [%2], %1, %0"
+ ETHR_CAS__ " [%2], %1, %0"
: "=&r"(tmp)
: "r"(old), "r"(&var->counter), "0"(tmp)
: "memory");
@@ -121,17 +158,17 @@ ethr_native_atomic_and_retold(ethr_native_atomic_t *var, long mask)
return old;
}
-static ETHR_INLINE long
-ethr_native_atomic_or_retold(ethr_native_atomic_t *var, long mask)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(or_retold)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ mask)
{
- long old, tmp;
+ ETHR_AINT_T__ old, tmp;
__asm__ __volatile__("membar #LoadLoad|#StoreLoad\n");
do {
old = var->counter;
tmp = old | mask;
__asm__ __volatile__(
- CASX " [%2], %1, %0"
+ ETHR_CAS__ " [%2], %1, %0"
: "=&r"(tmp)
: "r"(old), "r"(&var->counter), "0"(tmp)
: "memory");
@@ -140,17 +177,17 @@ ethr_native_atomic_or_retold(ethr_native_atomic_t *var, long mask)
return old;
}
-static ETHR_INLINE long
-ethr_native_atomic_xchg(ethr_native_atomic_t *var, long val)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(xchg)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ val)
{
- long old, new;
+ ETHR_AINT_T__ old, new;
__asm__ __volatile__("membar #LoadLoad|#StoreLoad");
do {
old = var->counter;
new = val;
__asm__ __volatile__(
- CASX " [%2], %1, %0"
+ ETHR_CAS__ " [%2], %1, %0"
: "=&r"(new)
: "r"(old), "r"(&var->counter), "0"(new)
: "memory");
@@ -159,12 +196,12 @@ ethr_native_atomic_xchg(ethr_native_atomic_t *var, long val)
return old;
}
-static ETHR_INLINE long
-ethr_native_atomic_cmpxchg(ethr_native_atomic_t *var, long new, long old)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(cmpxchg)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ new, ETHR_AINT_T__ old)
{
__asm__ __volatile__("membar #LoadLoad|#StoreLoad\n");
__asm__ __volatile__(
- CASX " [%2], %1, %0"
+ ETHR_CAS__ " [%2], %1, %0"
: "=&r"(new)
: "r"(old), "r"(&var->counter), "0"(new)
: "memory");
@@ -178,58 +215,63 @@ ethr_native_atomic_cmpxchg(ethr_native_atomic_t *var, long new, long old)
/* TODO: relax acquire barriers */
-static ETHR_INLINE long
-ethr_native_atomic_read_acqb(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(read_acqb)(ETHR_ATMC_T__ *var)
{
- long res = ethr_native_atomic_read(var);
+ ETHR_AINT_T__ res = ETHR_NATMC_FUNC__(read)(var);
__asm__ __volatile__("membar #LoadLoad|#LoadStore|#StoreLoad|#StoreStore" : : : "memory");
return res;
}
static ETHR_INLINE void
-ethr_native_atomic_set_relb(ethr_native_atomic_t *var, long i)
+ETHR_NATMC_FUNC__(set_relb)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ i)
{
__asm__ __volatile__("membar #LoadStore|#StoreStore" : : : "memory");
- ethr_native_atomic_set(var, i);
+ ETHR_NATMC_FUNC__(set)(var, i);
}
-static ETHR_INLINE long
-ethr_native_atomic_inc_return_acqb(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(inc_return_acqb)(ETHR_ATMC_T__ *var)
{
- long res = ethr_native_atomic_inc_return(var);
+ ETHR_AINT_T__ res = ETHR_NATMC_FUNC__(inc_return)(var);
__asm__ __volatile__("membar #LoadLoad|#LoadStore" : : : "memory");
return res;
}
static ETHR_INLINE void
-ethr_native_atomic_dec_relb(ethr_native_atomic_t *var)
+ETHR_NATMC_FUNC__(dec_relb)(ETHR_ATMC_T__ *var)
{
__asm__ __volatile__("membar #LoadStore|#StoreStore" : : : "memory");
- ethr_native_atomic_dec(var);
+ ETHR_NATMC_FUNC__(dec)(var);
}
-static ETHR_INLINE long
-ethr_native_atomic_dec_return_relb(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(dec_return_relb)(ETHR_ATMC_T__ *var)
{
__asm__ __volatile__("membar #LoadStore|#StoreStore" : : : "memory");
- return ethr_native_atomic_dec_return(var);
+ return ETHR_NATMC_FUNC__(dec_return)(var);
}
-static ETHR_INLINE long
-ethr_native_atomic_cmpxchg_acqb(ethr_native_atomic_t *var, long new, long old)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(cmpxchg_acqb)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ new, ETHR_AINT_T__ old)
{
- long res = ethr_native_atomic_cmpxchg(var, new, old);
+ ETHR_AINT_T__ res = ETHR_NATMC_FUNC__(cmpxchg)(var, new, old);
__asm__ __volatile__("membar #LoadLoad|#LoadStore" : : : "memory");
return res;
}
-static ETHR_INLINE long
-ethr_native_atomic_cmpxchg_relb(ethr_native_atomic_t *var, long new, long old)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(cmpxchg_relb)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ new, ETHR_AINT_T__ old)
{
__asm__ __volatile__("membar #LoadStore|#StoreStore" : : : "memory");
- return ethr_native_atomic_cmpxchg(var, new, old);
+ return ETHR_NATMC_FUNC__(cmpxchg)(var, new, old);
}
#endif /* ETHR_TRY_INLINE_FUNCS */
-#endif /* ETHR_SPARC32_ATOMIC_H */
+#undef ETHR_NATMC_FUNC__
+#undef ETHR_ATMC_T__
+#undef ETHR_AINT_T__
+#undef ETHR_CAS__
+
+#endif /* ETHR_INCLUDE_ATOMIC_IMPL__ */
diff --git a/erts/include/internal/sparc32/ethread.h b/erts/include/internal/sparc32/ethread.h
index dca113b4d6..aea9794390 100644
--- a/erts/include/internal/sparc32/ethread.h
+++ b/erts/include/internal/sparc32/ethread.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2005-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2005-2010. 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
@@ -24,7 +24,12 @@
#ifndef ETHREAD_SPARC32_ETHREAD_H
#define ETHREAD_SPARC32_ETHREAD_H
+#define ETHR_ATOMIC_WANT_32BIT_IMPL__
#include "atomic.h"
+#if ETHR_SIZEOF_PTR == 8
+# define ETHR_ATOMIC_WANT_64BIT_IMPL__
+# include "atomic.h"
+#endif
#include "spinlock.h"
#include "rwlock.h"
diff --git a/erts/include/internal/tile/atomic.h b/erts/include/internal/tile/atomic.h
index 69569d82d1..48e4c0c6c8 100644
--- a/erts/include/internal/tile/atomic.h
+++ b/erts/include/internal/tile/atomic.h
@@ -24,92 +24,102 @@
#ifndef ETHREAD_TILE_ATOMIC_H
#define ETHREAD_TILE_ATOMIC_H
+#define ETHR_HAVE_NATIVE_ATOMIC32 1
+
#include <atomic.h>
/* An atomic is an aligned int accessed via locked operations.
*/
typedef struct {
- volatile long counter;
-} ethr_native_atomic_t;
+ volatile ethr_sint32_t counter;
+} ethr_native_atomic32_t;
#define ETHR_MEMORY_BARRIER __insn_mf()
-#if defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_AUX_IMPL__)
+#if defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_ATOMIC_IMPL__)
+
+static ETHR_INLINE ethr_sint32_t *
+ethr_native_atomic32_addr(ethr_native_atomic32_t *var)
+{
+ return (ethr_sint32_t *) &var->counter;
+}
static ETHR_INLINE void
-ethr_native_atomic_init(ethr_native_atomic_t *var, long i)
+ethr_native_atomic32_init(ethr_native_atomic32_t *var, ethr_sint32_t i)
{
var->counter = i;
}
static ETHR_INLINE void
-ethr_native_atomic_set(ethr_native_atomic_t *var, long i)
+ethr_native_atomic32_set(ethr_native_atomic32_t *var, ethr_sint32_t i)
{
atomic_exchange_acq(&var->counter, i);
}
-static ETHR_INLINE long
-ethr_native_atomic_read(ethr_native_atomic_t *var)
+static ETHR_INLINE ethr_sint32_t
+ethr_native_atomic32_read(ethr_native_atomic32_t *var)
{
return var->counter;
}
static ETHR_INLINE void
-ethr_native_atomic_add(ethr_native_atomic_t *var, long incr)
+ethr_native_atomic32_add(ethr_native_atomic32_t *var, ethr_sint32_t incr)
{
atomic_add(&var->counter, incr);
}
static ETHR_INLINE void
-ethr_native_atomic_inc(ethr_native_atomic_t *var)
+ethr_native_atomic32_inc(ethr_native_atomic32_t *var)
{
atomic_increment(&var->counter);
}
static ETHR_INLINE void
-ethr_native_atomic_dec(ethr_native_atomic_t *var)
+ethr_native_atomic32_dec(ethr_native_atomic32_t *var)
{
atomic_decrement(&var->counter);
}
-static ETHR_INLINE long
-ethr_native_atomic_add_return(ethr_native_atomic_t *var, long incr)
+static ETHR_INLINE ethr_sint32_t
+ethr_native_atomic32_add_return(ethr_native_atomic32_t *var, ethr_sint32_t incr)
{
return atomic_exchange_and_add(&var->counter, incr) + incr;
}
-static ETHR_INLINE long
-ethr_native_atomic_inc_return(ethr_native_atomic_t *var)
+static ETHR_INLINE ethr_sint32_t
+ethr_native_atomic32_inc_return(ethr_native_atomic32_t *var)
{
- return ethr_native_atomic_add_return(var, 1);
+ return ethr_native_atomic32_add_return(var, 1);
}
-static ETHR_INLINE long
-ethr_native_atomic_dec_return(ethr_native_atomic_t *var)
+static ETHR_INLINE ethr_sint32_t
+ethr_native_atomic32_dec_return(ethr_native_atomic32_t *var)
{
- return ethr_native_atomic_add_return(var, -1);
+ return ethr_native_atomic32_add_return(var, -1);
}
-static ETHR_INLINE long
-ethr_native_atomic_and_retold(ethr_native_atomic_t *var, long mask)
+static ETHR_INLINE ethr_sint32_t
+ethr_native_atomic32_and_retold(ethr_native_atomic32_t *var, ethr_sint32_t mask)
{
return atomic_and_val(&var->counter, mask);
}
-static ETHR_INLINE long
-ethr_native_atomic_or_retold(ethr_native_atomic_t *var, long mask)
+static ETHR_INLINE ethr_sint32_t
+ethr_native_atomic32_or_retold(ethr_native_atomic32_t *var, ethr_sint32_t mask)
{
return atomic_or_val(&var->counter, mask);
}
-static ETHR_INLINE long
-ethr_native_atomic_xchg(ethr_native_atomic_t *var, long val)
+static ETHR_INLINE ethr_sint32_t
+ethr_native_atomic32_xchg(ethr_native_atomic32_t *var, ethr_sint32_t val)
{
return atomic_exchange_acq(&var->counter, val);
}
-static ETHR_INLINE long
-ethr_native_atomic_cmpxchg(ethr_native_atomic_t *var, long new, long expected)
+static ETHR_INLINE ethr_sint32_t
+ethr_native_atomic32_cmpxchg(ethr_native_atomic32_t *var,
+ ethr_sint32_t new,
+ ethr_sint32_t expected)
{
return atomic_compare_and_exchange_val_acq(&var->counter, new, expected);
}
@@ -118,54 +128,58 @@ ethr_native_atomic_cmpxchg(ethr_native_atomic_t *var, long new, long expected)
* Atomic ops with at least specified barriers.
*/
-static ETHR_INLINE long
-ethr_native_atomic_read_acqb(ethr_native_atomic_t *var)
+static ETHR_INLINE ethr_sint32_t
+ethr_native_atomic32_read_acqb(ethr_native_atomic32_t *var)
{
- long res = ethr_native_atomic_read(var);
+ ethr_sint32_t res = ethr_native_atomic32_read(var);
ETHR_MEMORY_BARRIER;
return res;
}
-static ETHR_INLINE long
-ethr_native_atomic_inc_return_acqb(ethr_native_atomic_t *var)
+static ETHR_INLINE ethr_sint32_t
+ethr_native_atomic32_inc_return_acqb(ethr_native_atomic32_t *var)
{
- long res = ethr_native_atomic_inc_return(var);
+ ethr_sint32_t res = ethr_native_atomic32_inc_return(var);
ETHR_MEMORY_BARRIER;
return res;
}
static ETHR_INLINE void
-ethr_native_atomic_set_relb(ethr_native_atomic_t *var, long val)
+ethr_native_atomic32_set_relb(ethr_native_atomic32_t *var, ethr_sint32_t val)
{
ETHR_MEMORY_BARRIER;
- ethr_native_atomic_set(var, val);
+ ethr_native_atomic32_set(var, val);
}
static ETHR_INLINE void
-ethr_native_atomic_dec_relb(ethr_native_atomic_t *var)
+ethr_native_atomic32_dec_relb(ethr_native_atomic32_t *var)
{
ETHR_MEMORY_BARRIER;
- ethr_native_atomic_dec(var);
+ ethr_native_atomic32_dec(var);
}
-static ETHR_INLINE long
-ethr_native_atomic_dec_return_relb(ethr_native_atomic_t *var)
+static ETHR_INLINE ethr_sint32_t
+ethr_native_atomic32_dec_return_relb(ethr_native_atomic32_t *var)
{
ETHR_MEMORY_BARRIER;
- return ethr_native_atomic_dec_return(var);
+ return ethr_native_atomic32_dec_return(var);
}
-static ETHR_INLINE long
-ethr_native_atomic_cmpxchg_acqb(ethr_native_atomic_t *var, long new, long exp)
+static ETHR_INLINE ethr_sint32_t
+ethr_native_atomic32_cmpxchg_acqb(ethr_native_atomic32_t *var,
+ ethr_sint32_t new,
+ ethr_sint32_t exp)
{
- return ethr_native_atomic_cmpxchg(var, new, exp);
+ return ethr_native_atomic32_cmpxchg(var, new, exp);
}
-static ETHR_INLINE long
-ethr_native_atomic_cmpxchg_relb(ethr_native_atomic_t *var, long new, long exp)
+static ETHR_INLINE ethr_sint32_t
+ethr_native_atomic32_cmpxchg_relb(ethr_native_atomic32_t *var,
+ ethr_sint32_t new,
+ ethr_sint32_t exp)
{
ETHR_MEMORY_BARRIER;
- return ethr_native_atomic_cmpxchg(var, new, exp);
+ return ethr_native_atomic32_cmpxchg(var, new, exp);
}
#endif /* ETHR_TRY_INLINE_FUNCS */
diff --git a/erts/include/internal/win/ethr_atomic.h b/erts/include/internal/win/ethr_atomic.h
index 500459dd6c..60def01a7e 100644
--- a/erts/include/internal/win/ethr_atomic.h
+++ b/erts/include/internal/win/ethr_atomic.h
@@ -22,223 +22,394 @@
* Author: Rickard Green
*/
-#ifndef ETHR_WIN_ATOMIC_H__
-#define ETHR_WIN_ATOMIC_H__
-
-#ifdef _MSC_VER
-# if _MSC_VER < 1300
-# define ETHR_IMMED_ATOMIC_SET_GET_SAFE__ 0 /* Dont trust really old compilers */
-# else
-# if defined(_M_IX86)
-# define ETHR_IMMED_ATOMIC_SET_GET_SAFE__ 1
-# else /* I.e. IA64 */
-# if _MSC_VER >= 1400
-# define ETHR_IMMED_ATOMIC_SET_GET_SAFE__ 1
-# else
-# define ETHR_IMMED_ATOMIC_SET_GET_SAFE__ 0
-# endif
-# endif
-# endif
-# if _MSC_VER >= 1400
-# include <intrin.h>
-# undef ETHR_COMPILER_BARRIER
-# define ETHR_COMPILER_BARRIER _ReadWriteBarrier()
-# endif
-#pragma intrinsic(_ReadWriteBarrier)
-#pragma intrinsic(_InterlockedAnd)
-#pragma intrinsic(_InterlockedOr)
+#undef ETHR_INCLUDE_ATOMIC_IMPL__
+#if !defined(ETHR_WIN_ATOMIC32_H__) && defined(ETHR_ATOMIC_WANT_32BIT_IMPL__)
+#define ETHR_WIN_ATOMIC32_H__
+#define ETHR_INCLUDE_ATOMIC_IMPL__ 4
+#undef ETHR_ATOMIC_WANT_32BIT_IMPL__
+#elif !defined(ETHR_WIN_ATOMIC64_H__) && defined(ETHR_ATOMIC_WANT_64BIT_IMPL__)
+#define ETHR_WIN_ATOMIC64_H__
+#ifdef ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64
+/* _InterlockedCompareExchange64() required... */
+#define ETHR_INCLUDE_ATOMIC_IMPL__ 8
+#endif
+#undef ETHR_ATOMIC_WANT_64BIT_IMPL__
+#endif
+
+#ifdef ETHR_INCLUDE_ATOMIC_IMPL__
+
+#if defined(_MSC_VER) && _MSC_VER >= 1400
+
+#ifndef ETHR_WIN_ATOMIC_COMMON__
+#define ETHR_WIN_ATOMIC_COMMON__
+
+#define ETHR_HAVE_NATIVE_ATOMICS 1
+
+#if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)
+# define ETHR_READ_AND_SET_WITHOUT_INTERLOCKED_OP__ 1
#else
-# define ETHR_IMMED_ATOMIC_SET_GET_SAFE__ 0
+# define ETHR_READ_AND_SET_WITHOUT_INTERLOCKED_OP__ 0
#endif
+#if defined(_M_AMD64) || (defined(_M_IX86) \
+ && !defined(ETHR_PRE_PENTIUM4_COMPAT))
+# define ETHR_READ_ACQB_AND_SET_RELB_COMPILER_BARRIER_ONLY__ 1
+#else
+# define ETHR_READ_ACQB_AND_SET_RELB_COMPILER_BARRIER_ONLY__ 0
+#endif
/*
- * No configure test checking for _Interlocked*_{acq,rel} and
- * Interlocked*{Acquire,Release} have been written yet...
+ * No configure test checking for interlocked acquire/release
+ * versions have been written, yet. It should define
+ * ETHR_HAVE_INTERLOCKED_ACQUIRE_RELEASE_BARRIERS if, and
+ * only if, all used interlocked operations with barriers
+ * exists.
*
* Note, that these are pure optimizations for the itanium
* processor.
*/
-#ifdef ETHR_HAVE_INTERLOCKEDCOMPAREEXCHANGE_ACQ
-#pragma intrinsic(_InterlockedCompareExchange_acq)
+#include <intrin.h>
+#undef ETHR_COMPILER_BARRIER
+#define ETHR_COMPILER_BARRIER _ReadWriteBarrier()
+#pragma intrinsic(_ReadWriteBarrier)
+#pragma intrinsic(_InterlockedCompareExchange)
+
+#if defined(_M_AMD64) || (defined(_M_IX86) \
+ && !defined(ETHR_PRE_PENTIUM4_COMPAT))
+#include <emmintrin.h>
+#include <mmintrin.h>
+#pragma intrinsic(_mm_mfence)
+#define ETHR_MEMORY_BARRIER _mm_mfence()
+#pragma intrinsic(_mm_sfence)
+#define ETHR_WRITE_MEMORY_BARRIER _mm_sfence()
+#pragma intrinsic(_mm_lfence)
+#define ETHR_READ_MEMORY_BARRIER _mm_lfence()
+#define ETHR_READ_DEPEND_MEMORY_BARRIER ETHR_COMPILER_BARRIER
+
+#else
+
+#define ETHR_MEMORY_BARRIER \
+do { \
+ volatile long x___ = 0; \
+ _InterlockedCompareExchange(&x___, (long) 1, (long) 0); \
+} while (0)
+
#endif
-#ifdef ETHR_HAVE_INTERLOCKEDCOMPAREEXCHANGE_REL
+
+#endif /* ETHR_WIN_ATOMIC_COMMON__ */
+
+#if ETHR_INCLUDE_ATOMIC_IMPL__ == 4
+
+#define ETHR_HAVE_NATIVE_ATOMIC32 1
+
+/*
+ * All used operations available as 32-bit intrinsics
+ */
+
+#pragma intrinsic(_InterlockedDecrement)
+#pragma intrinsic(_InterlockedIncrement)
+#pragma intrinsic(_InterlockedExchangeAdd)
+#pragma intrinsic(_InterlockedExchange)
+#pragma intrinsic(_InterlockedAnd)
+#pragma intrinsic(_InterlockedOr)
+#ifdef ETHR_HAVE_INTERLOCKED_ACQUIRE_RELEASE_BARRIERS
+#pragma intrinsic(_InterlockedExchangeAdd_acq)
+#pragma intrinsic(_InterlockedIncrement_acq)
+#pragma intrinsic(_InterlockedDecrement_rel)
+#pragma intrinsic(_InterlockedCompareExchange_acq)
#pragma intrinsic(_InterlockedCompareExchange_rel)
#endif
+#define ETHR_ILCKD__(X) _Interlocked ## X
+#ifdef ETHR_HAVE_INTERLOCKED_ACQUIRE_RELEASE_BARRIERS
+#define ETHR_ILCKD_ACQ__(X) _Interlocked ## X ## _acq
+#define ETHR_ILCKD_REL__(X) _Interlocked ## X ## _rel
+#else
+#define ETHR_ILCKD_ACQ__(X) _Interlocked ## X
+#define ETHR_ILCKD_REL__(X) _Interlocked ## X
+#endif
+
+#define ETHR_NATMC_FUNC__(X) ethr_native_atomic32_ ## X
+#define ETHR_ATMC_T__ ethr_native_atomic32_t
+#define ETHR_AINT_T__ ethr_sint32_t
+
+#elif ETHR_INCLUDE_ATOMIC_IMPL__ == 8
+
+#define ETHR_HAVE_NATIVE_ATOMIC64 1
+
+/*
+ * _InterlockedCompareExchange64() is required. The other may not
+ * be available, but if so, we can generate them.
+ */
+#pragma intrinsic(_InterlockedCompareExchange64)
+
+#if ETHR_READ_AND_SET_WITHOUT_INTERLOCKED_OP__
+#define ETHR_OWN_ILCKD_INIT_VAL__(PTR) *(PTR)
+#else
+#define ETHR_OWN_ILCKD_INIT_VAL__(PTR) (__int64) 0
+#endif
+
+#define ETHR_OWN_ILCKD_BODY_IMPL__(FUNC, PTR, NEW, ACT, EXP, OPS, RET) \
+{ \
+ __int64 NEW, ACT, EXP; \
+ ACT = ETHR_OWN_ILCKD_INIT_VAL__(PTR); \
+ do { \
+ EXP = ACT; \
+ { OPS; } \
+ ACT = _InterlockedCompareExchange64(PTR, NEW, EXP); \
+ } while (ACT != EXP); \
+ return RET; \
+}
+
+#define ETHR_OWN_ILCKD_1_IMPL__(FUNC, NEW, ACT, EXP, OPS, RET) \
+static __forceinline __int64 \
+FUNC(__int64 volatile *ptr) \
+ETHR_OWN_ILCKD_BODY_IMPL__(FUNC, ptr, NEW, ACT, EXP, OPS, RET)
+
+#define ETHR_OWN_ILCKD_2_IMPL__(FUNC, NEW, ACT, EXP, OPS, ARG, RET) \
+static __forceinline __int64 \
+FUNC(__int64 volatile *ptr, __int64 ARG) \
+ETHR_OWN_ILCKD_BODY_IMPL__(FUNC, ptr, NEW, ACT, EXP, OPS, RET)
+
+
+#ifdef ETHR_HAVE__INTERLOCKEDDECREMENT64
+#pragma intrinsic(_InterlockedDecrement64)
+#else
+ETHR_OWN_ILCKD_1_IMPL__(_InterlockedDecrement64, new, act, exp,
+ new = act - 1, new)
+#endif
+#ifdef ETHR_HAVE__INTERLOCKEDINCREMENT64
+#pragma intrinsic(_InterlockedIncrement64)
+#else
+ETHR_OWN_ILCKD_1_IMPL__(_InterlockedIncrement64, new, act, exp,
+ new = act + 1, new)
+#endif
+#ifdef ETHR_HAVE__INTERLOCKEDEXCHANGEADD64
+#pragma intrinsic(_InterlockedExchangeAdd64)
+#else
+ETHR_OWN_ILCKD_2_IMPL__(_InterlockedExchangeAdd64, new, act, exp,
+ new = act + arg, arg, act)
+#endif
+#ifdef ETHR_HAVE__INTERLOCKEDEXCHANGE64
+#pragma intrinsic(_InterlockedExchange64)
+#else
+ETHR_OWN_ILCKD_2_IMPL__(_InterlockedExchange64, new, act, exp,
+ new = arg, arg, act)
+#endif
+#ifdef ETHR_HAVE__INTERLOCKEDAND64
+#pragma intrinsic(_InterlockedAnd64)
+#else
+ETHR_OWN_ILCKD_2_IMPL__(_InterlockedAnd64, new, act, exp,
+ new = act & arg, arg, act)
+#endif
+#ifdef ETHR_HAVE__INTERLOCKEDOR64
+#pragma intrinsic(_InterlockedOr64)
+#else
+ETHR_OWN_ILCKD_2_IMPL__(_InterlockedOr64, new, act, exp,
+ new = act | arg, arg, act)
+#endif
+#ifdef ETHR_HAVE_INTERLOCKED_ACQUIRE_RELEASE_BARRIERS
+#pragma intrinsic(_InterlockedExchangeAdd64_acq)
+#pragma intrinsic(_InterlockedIncrement64_acq)
+#pragma intrinsic(_InterlockedDecrement64_rel)
+#pragma intrinsic(_InterlockedCompareExchange64_acq)
+#pragma intrinsic(_InterlockedCompareExchange64_rel)
+#endif
+
+#define ETHR_ILCKD__(X) _Interlocked ## X ## 64
+#ifdef ETHR_HAVE_INTERLOCKED_ACQUIRE_RELEASE_BARRIERS
+#define ETHR_ILCKD_ACQ__(X) _Interlocked ## X ## 64_acq
+#define ETHR_ILCKD_REL__(X) _Interlocked ## X ## 64_rel
+#else
+#define ETHR_ILCKD_ACQ__(X) _Interlocked ## X ## 64
+#define ETHR_ILCKD_REL__(X) _Interlocked ## X ## 64
+#endif
+
+#define ETHR_NATMC_FUNC__(X) ethr_native_atomic64_ ## X
+#define ETHR_ATMC_T__ ethr_native_atomic64_t
+#define ETHR_AINT_T__ ethr_sint64_t
+
+#else
+#error "Unsupported integer size"
+#endif
typedef struct {
- volatile LONG value;
-} ethr_native_atomic_t;
+ volatile ETHR_AINT_T__ value;
+} ETHR_ATMC_T__;
-#define ETHR_MEMORY_BARRIER \
-do { \
- volatile LONG x___ = 0; \
- _InterlockedCompareExchange(&x___, (LONG) 1, (LONG) 0); \
-} while (0)
+#if defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_ATOMIC_IMPL__)
-#if defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_AUX_IMPL__)
+static ETHR_INLINE ETHR_AINT_T__ *
+ETHR_NATMC_FUNC__(addr)(ETHR_ATMC_T__ *var)
+{
+ return (ETHR_AINT_T__ *) &var->value;
+}
static ETHR_INLINE void
-ethr_native_atomic_init(ethr_native_atomic_t *var, long i)
+ETHR_NATMC_FUNC__(init)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ i)
{
- var->value = (LONG) i;
+#if ETHR_READ_AND_SET_WITHOUT_INTERLOCKED_OP__
+ var->value = i;
+#else
+ (void) ETHR_ILCKD__(Exchange)(&var->value, i);
+#endif
}
static ETHR_INLINE void
-ethr_native_atomic_set(ethr_native_atomic_t *var, long i)
+ETHR_NATMC_FUNC__(set)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ i)
{
-#if ETHR_IMMED_ATOMIC_SET_GET_SAFE__
- var->value = (LONG) i;
+#if ETHR_READ_AND_SET_WITHOUT_INTERLOCKED_OP__
+ var->value = i;
#else
- (void) InterlockedExchange(&var->value, (LONG) i);
+ (void) ETHR_ILCKD__(Exchange)(&var->value, i);
#endif
}
-static ETHR_INLINE long
-ethr_native_atomic_read(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(read)(ETHR_ATMC_T__ *var)
{
-#if ETHR_IMMED_ATOMIC_SET_GET_SAFE__
+#if ETHR_READ_AND_SET_WITHOUT_INTERLOCKED_OP__
return var->value;
#else
- return InterlockedExchangeAdd(&var->value, (LONG) 0);
+ return ETHR_ILCKD__(ExchangeAdd)(&var->value, (ETHR_AINT_T__) 0);
#endif
}
static ETHR_INLINE void
-ethr_native_atomic_add(ethr_native_atomic_t *var, long incr)
+ETHR_NATMC_FUNC__(add)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ incr)
{
- (void) InterlockedExchangeAdd(&var->value, (LONG) incr);
+ (void) ETHR_ILCKD__(ExchangeAdd)(&var->value, incr);
}
-static ETHR_INLINE long
-ethr_native_atomic_add_return(ethr_native_atomic_t *var, long i)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(add_return)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ i)
{
- LONG tmp = InterlockedExchangeAdd(&var->value, (LONG) i);
- return tmp + i;
+ return ETHR_ILCKD__(ExchangeAdd)(&var->value, i) + i;
}
static ETHR_INLINE void
-ethr_native_atomic_inc(ethr_native_atomic_t *var)
+ETHR_NATMC_FUNC__(inc)(ETHR_ATMC_T__ *var)
{
- (void) InterlockedIncrement(&var->value);
+ (void) ETHR_ILCKD__(Increment)(&var->value);
}
static ETHR_INLINE void
-ethr_native_atomic_dec(ethr_native_atomic_t *var)
+ETHR_NATMC_FUNC__(dec)(ETHR_ATMC_T__ *var)
{
- (void) InterlockedDecrement(&var->value);
+ (void) ETHR_ILCKD__(Decrement)(&var->value);
}
-static ETHR_INLINE long
-ethr_native_atomic_inc_return(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(inc_return)(ETHR_ATMC_T__ *var)
{
- return (long) InterlockedIncrement(&var->value);
+ return ETHR_ILCKD__(Increment)(&var->value);
}
-static ETHR_INLINE long
-ethr_native_atomic_dec_return(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(dec_return)(ETHR_ATMC_T__ *var)
{
- return (long) InterlockedDecrement(&var->value);
+ return ETHR_ILCKD__(Decrement)(&var->value);
}
-static ETHR_INLINE long
-ethr_native_atomic_and_retold(ethr_native_atomic_t *var, long mask)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(and_retold)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ mask)
{
- return (long) _InterlockedAnd(&var->value, mask);
+ return ETHR_ILCKD__(And)(&var->value, mask);
}
-static ETHR_INLINE long
-ethr_native_atomic_or_retold(ethr_native_atomic_t *var, long mask)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(or_retold)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ mask)
{
- return (long) _InterlockedOr(&var->value, mask);
+ return ETHR_ILCKD__(Or)(&var->value, mask);
}
-
-static ETHR_INLINE long
-ethr_native_atomic_cmpxchg(ethr_native_atomic_t *var, long new, long old)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(cmpxchg)(ETHR_ATMC_T__ *var,
+ ETHR_AINT_T__ new,
+ ETHR_AINT_T__ old)
{
- return (long) _InterlockedCompareExchange(&var->value, (LONG) new, (LONG) old);
+ return ETHR_ILCKD__(CompareExchange)(&var->value, new, old);
}
-static ETHR_INLINE long
-ethr_native_atomic_xchg(ethr_native_atomic_t *var, long new)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(xchg)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ new)
{
- return (long) InterlockedExchange(&var->value, (LONG) new);
+ return ETHR_ILCKD__(Exchange)(&var->value, new);
}
/*
* Atomic ops with at least specified barriers.
*/
-static ETHR_INLINE long
-ethr_native_atomic_read_acqb(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(read_acqb)(ETHR_ATMC_T__ *var)
{
-#ifdef ETHR_HAVE_INTERLOCKEDEXCHANGEADDACQUIRE
- return (long) InterlockedExchangeAddAcquire(&var->value, (LONG) 0);
+#if ETHR_READ_ACQB_AND_SET_RELB_COMPILER_BARRIER_ONLY__
+ ETHR_AINT_T__ val = var->value;
+ ETHR_COMPILER_BARRIER;
+ return val;
#else
- return (long) InterlockedExchangeAdd(&var->value, (LONG) 0);
+ return ETHR_ILCKD_ACQ__(ExchangeAdd)(&var->value, (ETHR_AINT_T__) 0);
#endif
}
-static ETHR_INLINE long
-ethr_native_atomic_inc_return_acqb(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(inc_return_acqb)(ETHR_ATMC_T__ *var)
{
-#ifdef ETHR_HAVE_INTERLOCKEDINCREMENTACQUIRE
- return (long) InterlockedIncrementAcquire(&var->value);
-#else
- return (long) InterlockedIncrement(&var->value);
-#endif
+ return ETHR_ILCKD_ACQ__(Increment)(&var->value);
}
static ETHR_INLINE void
-ethr_native_atomic_set_relb(ethr_native_atomic_t *var, long i)
+ETHR_NATMC_FUNC__(set_relb)(ETHR_ATMC_T__ *var, ETHR_AINT_T__ i)
{
- (void) InterlockedExchange(&var->value, (LONG) i);
+#if ETHR_READ_ACQB_AND_SET_RELB_COMPILER_BARRIER_ONLY__
+ ETHR_COMPILER_BARRIER;
+ var->value = i;
+#else
+ (void) ETHR_ILCKD_REL__(Exchange)(&var->value, i);
+#endif
}
static ETHR_INLINE void
-ethr_native_atomic_dec_relb(ethr_native_atomic_t *var)
+ETHR_NATMC_FUNC__(dec_relb)(ETHR_ATMC_T__ *var)
{
-#ifdef ETHR_HAVE_INTERLOCKEDDECREMENTRELEASE
- (void) InterlockedDecrementRelease(&var->value);
-#else
- (void) InterlockedDecrement(&var->value);
-#endif
+ (void) ETHR_ILCKD_REL__(Decrement)(&var->value);
}
-static ETHR_INLINE long
-ethr_native_atomic_dec_return_relb(ethr_native_atomic_t *var)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(dec_return_relb)(ETHR_ATMC_T__ *var)
{
-#ifdef ETHR_HAVE_INTERLOCKEDDECREMENTRELEASE
- return (long) InterlockedDecrementRelease(&var->value);
-#else
- return (long) InterlockedDecrement(&var->value);
-#endif
+ return ETHR_ILCKD_REL__(Decrement)(&var->value);
}
-static ETHR_INLINE long
-ethr_native_atomic_cmpxchg_acqb(ethr_native_atomic_t *var, long new, long old)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(cmpxchg_acqb)(ETHR_ATMC_T__ *var,
+ ETHR_AINT_T__ new,
+ ETHR_AINT_T__ old)
{
-#ifdef ETHR_HAVE_INTERLOCKEDCOMPAREEXCHANGE_ACQ
- return (long) _InterlockedCompareExchange_acq(&var->value, (LONG) new, (LONG) old);
-#else
- return (long) _InterlockedCompareExchange(&var->value, (LONG) new, (LONG) old);
-#endif
+ return ETHR_ILCKD_ACQ__(CompareExchange)(&var->value, new, old);
}
-static ETHR_INLINE long
-ethr_native_atomic_cmpxchg_relb(ethr_native_atomic_t *var, long new, long old)
+static ETHR_INLINE ETHR_AINT_T__
+ETHR_NATMC_FUNC__(cmpxchg_relb)(ETHR_ATMC_T__ *var,
+ ETHR_AINT_T__ new,
+ ETHR_AINT_T__ old)
{
-
-#ifdef ETHR_HAVE_INTERLOCKEDCOMPAREEXCHANGE_REL
- return (long) _InterlockedCompareExchange_rel(&var->value, (LONG) new, (LONG) old);
-#else
- return (long) _InterlockedCompareExchange(&var->value, (LONG) new, (LONG) old);
-#endif
+ return ETHR_ILCKD_REL__(CompareExchange)(&var->value, new, old);
}
-#endif
+#endif /* ETHR_TRY_INLINE_FUNCS */
-#endif
+#undef ETHR_ILCKD__
+#undef ETHR_ILCKD_ACQ__
+#undef ETHR_ILCKD_REL__
+#undef ETHR_NATMC_FUNC__
+#undef ETHR_ATMC_T__
+#undef ETHR_AINT_T__
+#undef ETHR_READ_AND_SET_WITHOUT_INTERLOCKED_OP__
+#undef ETHR_READ_ACQB_AND_SET_RELB_COMPILER_BARRIER_ONLY__
+
+#endif /* _MSC_VER */
+
+#endif /* ETHR_INCLUDE_ATOMIC_IMPL__ */
diff --git a/erts/include/internal/win/ethr_event.h b/erts/include/internal/win/ethr_event.h
index af57c20f91..598816b2c6 100644
--- a/erts/include/internal/win/ethr_event.h
+++ b/erts/include/internal/win/ethr_event.h
@@ -21,22 +21,24 @@
* Author: Rickard Green
*/
-#define ETHR_EVENT_OFF_WAITER__ ((LONG) -1)
-#define ETHR_EVENT_OFF__ ((LONG) 1)
-#define ETHR_EVENT_ON__ ((LONG) 0)
+#define ETHR_EVENT_OFF_WAITER__ ((long) -1)
+#define ETHR_EVENT_OFF__ ((long) 1)
+#define ETHR_EVENT_ON__ ((long) 0)
typedef struct {
- volatile LONG state;
+ volatile long state;
HANDLE handle;
} ethr_event;
#if defined(ETHR_TRY_INLINE_FUNCS) || defined(ETHR_EVENT_IMPL__)
+#pragma intrinsic(_InterlockedExchange)
+
static ETHR_INLINE void
ETHR_INLINE_FUNC_NAME_(ethr_event_set)(ethr_event *e)
{
- /* InterlockedExchange() imply a full memory barrier which is important */
- LONG state = InterlockedExchange(&e->state, ETHR_EVENT_ON__);
+ /* _InterlockedExchange() imply a full memory barrier which is important */
+ long state = _InterlockedExchange(&e->state, ETHR_EVENT_ON__);
if (state == ETHR_EVENT_OFF_WAITER__) {
if (!SetEvent(e->handle))
ETHR_FATAL_ERROR__(ethr_win_get_errno__());
@@ -46,7 +48,7 @@ ETHR_INLINE_FUNC_NAME_(ethr_event_set)(ethr_event *e)
static ETHR_INLINE void
ETHR_INLINE_FUNC_NAME_(ethr_event_reset)(ethr_event *e)
{
- /* InterlockedExchange() imply a full memory barrier which is important */
+ /* _InterlockedExchange() imply a full memory barrier which is important */
InterlockedExchange(&e->state, ETHR_EVENT_OFF__);
}
diff --git a/erts/include/internal/win/ethread.h b/erts/include/internal/win/ethread.h
index b52710f6a3..c01b17cf14 100644
--- a/erts/include/internal/win/ethread.h
+++ b/erts/include/internal/win/ethread.h
@@ -25,7 +25,11 @@
#ifndef ETHREAD_WIN_H__
#define ETHREAD_WIN_H__
+#define ETHR_ATOMIC_WANT_32BIT_IMPL__
#include "ethr_atomic.h"
-#define ETHR_HAVE_NATIVE_ATOMICS 1
+#if ETHR_SIZEOF_PTR == 8
+# define ETHR_ATOMIC_WANT_64BIT_IMPL__
+# include "ethr_atomic.h"
+#endif
#endif
diff --git a/erts/lib_src/Makefile.in b/erts/lib_src/Makefile.in
index 0d3181cace..757b3b24e2 100644
--- a/erts/lib_src/Makefile.in
+++ b/erts/lib_src/Makefile.in
@@ -283,6 +283,7 @@ endif
ETHR_THR_LIB_BASE_DIR=@ETHR_THR_LIB_BASE_DIR@
ifneq ($(strip $(ETHR_LIB_NAME)),)
ETHREAD_LIB_SRC=common/ethr_aux.c \
+ common/ethr_atomics.c \
common/ethr_mutex.c \
common/ethr_cbf.c \
$(ETHR_THR_LIB_BASE_DIR)/ethread.c \
@@ -381,6 +382,11 @@ $(ERTS_LIB): $(ERTS_LIB_OBJS)
# Object files
#
+ifeq ($(TYPE)-@GCC@,debug-yes)
+$(r_OBJ_DIR)/ethr_aux.o: common/ethr_aux.c
+ $(CC) $(THR_DEFS) $(CFLAGS) -Wno-unused-function $(INCLUDES) -c $< -o $@
+endif
+
$(r_OBJ_DIR)/%.o: common/%.c
$(CC) $(THR_DEFS) $(CFLAGS) $(INCLUDES) -c $< -o $@
@@ -445,6 +451,7 @@ INTERNAL_RELEASE_INCLUDES= \
$(ERTS_INCL_INT)/ethread.h \
$(ERTS_INCL_INT)/ethr_mutex.h \
$(ERTS_INCL_INT)/ethr_optimized_fallbacks.h \
+ $(ERTS_INCL_INT)/ethr_atomics.h \
$(ERTS_INCL_INT)/$(TARGET)/ethread.mk \
$(ERTS_INCL_INT)/$(TARGET)/erts_internal.mk \
$(ERTS_INCL_INT)/$(TARGET)/ethread_header_config.h \
diff --git a/erts/lib_src/common/erl_misc_utils.c b/erts/lib_src/common/erl_misc_utils.c
index 4c881993a5..ec729407bb 100644
--- a/erts/lib_src/common/erl_misc_utils.c
+++ b/erts/lib_src/common/erl_misc_utils.c
@@ -813,7 +813,7 @@ read_topology(erts_cpu_info_t *cpuinfo)
cpuinfo->topology = malloc(sizeof(erts_cpu_topology_t)
* cpuinfo->configured);
- if (!cpuinfo)
+ if (!cpuinfo->topology)
goto error;
for (ix = 0; ix < cpuinfo->configured; ix++) {
@@ -1023,7 +1023,7 @@ read_topology(erts_cpu_info_t *cpuinfo)
cpuinfo->topology = malloc(sizeof(erts_cpu_topology_t)
* cpuinfo->configured);
- if (!cpuinfo)
+ if (!cpuinfo->topology)
goto error;
for (ix = 0; ix < cpuinfo->configured; ix++) {
diff --git a/erts/lib_src/common/erl_printf_format.c b/erts/lib_src/common/erl_printf_format.c
index bd3d38e649..968d563325 100644
--- a/erts/lib_src/common/erl_printf_format.c
+++ b/erts/lib_src/common/erl_printf_format.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2005-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2005-2011. 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
@@ -27,7 +27,7 @@
* length: hh | h | l | ll | L | j | t | b<sz>
* conversion: d,i | o,u,x,X | e,E | f,F | g,G | a,A | c | s | T |
* p | n | %
- * sz: 8 | 16 | 32 | 64 | p
+ * sz: 8 | 16 | 32 | 64 | p | e
*/
/* Without this, variable argument lists break on VxWorks */
@@ -76,6 +76,18 @@
#endif
#endif
+#ifndef ERTS_SIZEOF_ETERM
+# ifdef HALFWORD_HEAP_EMULATOR
+# if SIZEOF_VOID_P == 8
+# define ERTS_SIZEOF_ETERM 4
+# else
+# error "HALFWORD_HEAP_EMULATOR only allowed on 64-bit architecture"
+# endif
+# else
+# define ERTS_SIZEOF_ETERM SIZEOF_VOID_P
+# endif
+#endif
+
#if defined(__GNUC__)
# undef inline
# define inline __inline__
@@ -520,6 +532,17 @@ int erts_printf_format(fmtfn_t fn, void* arg, char* fmt, va_list ap)
#error No integer datatype with the same size as 'void *' found
#endif
}
+ else if (*ptr == 'e') {
+ ptr++;
+#if SIZEOF_INT == ERTS_SIZEOF_ETERM
+#elif SIZEOF_LONG == ERTS_SIZEOF_ETERM
+ fmt |= FMTL_l;
+#elif SIZEOF_LONG_LONG == ERTS_SIZEOF_ETERM
+ fmt |= FMTL_ll;
+#else
+#error No integer datatype with the same size as Eterm found
+#endif
+ }
else {
int bits = 0;
while(isdigit((int) *ptr))
diff --git a/erts/lib_src/common/ethr_atomics.c b/erts/lib_src/common/ethr_atomics.c
new file mode 100644
index 0000000000..94557d904a
--- /dev/null
+++ b/erts/lib_src/common/ethr_atomics.c
@@ -0,0 +1,402 @@
+/*
+ * %CopyrightBegin%
+ *
+ * Copyright Ericsson AB 2010. 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%
+ */
+
+/*
+ * Description: The ethread atomic API
+ * Author: Rickard Green
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define ETHR_INLINE_FUNC_NAME_(X) X ## __
+#define ETHR_ATOMIC_IMPL__
+
+#include "ethread.h"
+#include "ethr_internal.h"
+
+#ifndef ETHR_HAVE_NATIVE_ATOMICS
+ethr_atomic_protection_t ethr_atomic_protection__[1 << ETHR_ATOMIC_ADDR_BITS];
+#endif
+
+int
+ethr_init_atomics(void)
+{
+#ifndef ETHR_HAVE_NATIVE_ATOMICS
+ {
+ int i;
+ for (i = 0; i < (1 << ETHR_ATOMIC_ADDR_BITS); i++) {
+ int res = ethr_spinlock_init(&ethr_atomic_protection__[i].u.lck);
+ if (res != 0)
+ return res;
+ }
+ }
+#endif
+ return 0;
+}
+
+/*
+ * --- Pointer size atomics ---------------------------------------------------
+ */
+
+ethr_sint_t *
+ethr_atomic_addr(ethr_atomic_t *var)
+{
+ ETHR_ASSERT(var);
+ return ethr_atomic_addr__(var);
+}
+
+void
+ethr_atomic_init(ethr_atomic_t *var, ethr_sint_t i)
+{
+ ETHR_ASSERT(var);
+ ethr_atomic_init__(var, i);
+}
+
+void
+ethr_atomic_set(ethr_atomic_t *var, ethr_sint_t i)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ ethr_atomic_set__(var, i);
+}
+
+ethr_sint_t
+ethr_atomic_read(ethr_atomic_t *var)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic_read__(var);
+}
+
+ethr_sint_t
+ethr_atomic_add_read(ethr_atomic_t *var, ethr_sint_t incr)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic_add_read__(var, incr);
+}
+
+ethr_sint_t
+ethr_atomic_inc_read(ethr_atomic_t *var)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic_inc_read__(var);
+}
+
+ethr_sint_t
+ethr_atomic_dec_read(ethr_atomic_t *var)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic_dec_read__(var);
+}
+
+void
+ethr_atomic_add(ethr_atomic_t *var, ethr_sint_t incr)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ ethr_atomic_add__(var, incr);
+}
+
+void
+ethr_atomic_inc(ethr_atomic_t *var)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ ethr_atomic_inc__(var);
+}
+
+void
+ethr_atomic_dec(ethr_atomic_t *var)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ ethr_atomic_dec__(var);
+}
+
+ethr_sint_t
+ethr_atomic_read_band(ethr_atomic_t *var, ethr_sint_t mask)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic_read_band__(var, mask);
+}
+
+ethr_sint_t
+ethr_atomic_read_bor(ethr_atomic_t *var, ethr_sint_t mask)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic_read_bor__(var, mask);
+}
+
+ethr_sint_t
+ethr_atomic_xchg(ethr_atomic_t *var, ethr_sint_t new)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic_xchg__(var, new);
+}
+
+ethr_sint_t
+ethr_atomic_cmpxchg(ethr_atomic_t *var, ethr_sint_t new, ethr_sint_t expected)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic_cmpxchg__(var, new, expected);
+}
+
+ethr_sint_t
+ethr_atomic_read_acqb(ethr_atomic_t *var)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic_read_acqb__(var);
+}
+
+ethr_sint_t
+ethr_atomic_inc_read_acqb(ethr_atomic_t *var)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic_inc_read_acqb__(var);
+}
+
+void
+ethr_atomic_set_relb(ethr_atomic_t *var, ethr_sint_t i)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ ethr_atomic_set_relb__(var, i);
+}
+
+void
+ethr_atomic_dec_relb(ethr_atomic_t *var)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ ethr_atomic_dec_relb__(var);
+}
+
+ethr_sint_t
+ethr_atomic_dec_read_relb(ethr_atomic_t *var)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic_dec_read_relb__(var);
+}
+
+ethr_sint_t
+ethr_atomic_cmpxchg_acqb(ethr_atomic_t *var, ethr_sint_t new, ethr_sint_t exp)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic_cmpxchg_acqb__(var, new, exp);
+}
+
+ethr_sint_t
+ethr_atomic_cmpxchg_relb(ethr_atomic_t *var, ethr_sint_t new, ethr_sint_t exp)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic_cmpxchg_relb__(var, new, exp);
+}
+
+
+/*
+ * --- 32-bit atomics ---------------------------------------------------------
+ */
+
+ethr_sint32_t *
+ethr_atomic32_addr(ethr_atomic32_t *var)
+{
+ ETHR_ASSERT(var);
+ return ethr_atomic32_addr__(var);
+}
+
+void
+ethr_atomic32_init(ethr_atomic32_t *var, ethr_sint32_t i)
+{
+ ETHR_ASSERT(var);
+ ethr_atomic32_init__(var, i);
+}
+
+void
+ethr_atomic32_set(ethr_atomic32_t *var, ethr_sint32_t i)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ ethr_atomic32_set__(var, i);
+}
+
+ethr_sint32_t
+ethr_atomic32_read(ethr_atomic32_t *var)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic32_read__(var);
+}
+
+
+ethr_sint32_t
+ethr_atomic32_add_read(ethr_atomic32_t *var, ethr_sint32_t incr)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic32_add_read__(var, incr);
+}
+
+ethr_sint32_t
+ethr_atomic32_inc_read(ethr_atomic32_t *var)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic32_inc_read__(var);
+}
+
+ethr_sint32_t
+ethr_atomic32_dec_read(ethr_atomic32_t *var)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic32_dec_read__(var);
+}
+
+void
+ethr_atomic32_add(ethr_atomic32_t *var, ethr_sint32_t incr)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ ethr_atomic32_add__(var, incr);
+}
+
+void
+ethr_atomic32_inc(ethr_atomic32_t *var)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ ethr_atomic32_inc__(var);
+}
+
+void
+ethr_atomic32_dec(ethr_atomic32_t *var)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ ethr_atomic32_dec__(var);
+}
+
+ethr_sint32_t
+ethr_atomic32_read_band(ethr_atomic32_t *var, ethr_sint32_t mask)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic32_read_band__(var, mask);
+}
+
+ethr_sint32_t
+ethr_atomic32_read_bor(ethr_atomic32_t *var, ethr_sint32_t mask)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic32_read_bor__(var, mask);
+}
+
+ethr_sint32_t
+ethr_atomic32_xchg(ethr_atomic32_t *var, ethr_sint32_t new)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic32_xchg__(var, new);
+}
+
+ethr_sint32_t
+ethr_atomic32_cmpxchg(ethr_atomic32_t *var,
+ ethr_sint32_t new,
+ ethr_sint32_t expected)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic32_cmpxchg__(var, new, expected);
+}
+
+ethr_sint32_t
+ethr_atomic32_read_acqb(ethr_atomic32_t *var)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic32_read_acqb__(var);
+}
+
+ethr_sint32_t
+ethr_atomic32_inc_read_acqb(ethr_atomic32_t *var)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic32_inc_read_acqb__(var);
+}
+
+void
+ethr_atomic32_set_relb(ethr_atomic32_t *var, ethr_sint32_t i)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ ethr_atomic32_set_relb__(var, i);
+}
+
+void
+ethr_atomic32_dec_relb(ethr_atomic32_t *var)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ ethr_atomic32_dec_relb__(var);
+}
+
+ethr_sint32_t
+ethr_atomic32_dec_read_relb(ethr_atomic32_t *var)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic32_dec_read_relb__(var);
+}
+
+ethr_sint32_t
+ethr_atomic32_cmpxchg_acqb(ethr_atomic32_t *var,
+ ethr_sint32_t new,
+ ethr_sint32_t exp)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic32_cmpxchg_acqb__(var, new, exp);
+}
+
+ethr_sint32_t
+ethr_atomic32_cmpxchg_relb(ethr_atomic32_t *var,
+ ethr_sint32_t new,
+ ethr_sint32_t exp)
+{
+ ETHR_ASSERT(!ethr_not_inited__);
+ ETHR_ASSERT(var);
+ return ethr_atomic32_cmpxchg_relb__(var, new, exp);
+}
+
diff --git a/erts/lib_src/common/ethr_aux.c b/erts/lib_src/common/ethr_aux.c
index 4db4cffd3a..2c3e25a805 100644
--- a/erts/lib_src/common/ethr_aux.c
+++ b/erts/lib_src/common/ethr_aux.c
@@ -31,7 +31,10 @@
#define ETHR_INLINE_FUNC_NAME_(X) X ## __
#define ETHR_AUX_IMPL__
-
+#define ETHR_ATOMIC_IMPL__ /* Needed in order to pull in
+ native atomic implementations
+ for optimized fallbacks of
+ spinlocks and rwspinlocks */
#include "ethread.h"
#include "ethr_internal.h"
#include <string.h>
@@ -51,10 +54,6 @@ int ethr_not_inited__ = 1;
ethr_memory_allocators ethr_mem__ = ETHR_MEM_ALLOCS_DEF_INITER__;
-#ifndef ETHR_HAVE_OPTIMIZED_ATOMIC_OPS
-ethr_atomic_protection_t ethr_atomic_protection__[1 << ETHR_ATOMIC_ADDR_BITS];
-#endif
-
void *(*ethr_thr_prepare_func__)(void) = NULL;
void (*ethr_thr_parent_func__)(void *) = NULL;
void (*ethr_thr_child_func__)(void *) = NULL;
@@ -138,16 +137,9 @@ ethr_init_common__(ethr_init_data *id)
#endif
ethr_max_stack_size__ = ETHR_B2KW(ethr_max_stack_size__);
-#ifndef ETHR_HAVE_OPTIMIZED_ATOMIC_OPS
- {
- int i;
- for (i = 0; i < (1 << ETHR_ATOMIC_ADDR_BITS); i++) {
- res = ethr_spinlock_init(&ethr_atomic_protection__[i].u.lck);
- if (res != 0)
- return res;
- }
- }
-#endif
+ res = ethr_init_atomics();
+ if (res != 0)
+ return res;
res = ethr_mutex_lib_init(erts_get_cpu_configured(ethr_cpu_info__));
if (res != 0)
@@ -279,14 +271,6 @@ typedef union {
static ethr_spinlock_t ts_ev_alloc_lock;
static ethr_ts_event *free_ts_ev;
-#if SIZEOF_VOID_P == SIZEOF_INT
-typedef unsigned int EthrPtrSzUInt;
-#elif SIZEOF_VOID_P == SIZEOF_LONG
-typedef unsigned long EthrPtrSzUInt;
-#else
-#error No pointer sized integer type
-#endif
-
static ethr_ts_event *ts_event_pool(int size, ethr_ts_event **endpp)
{
int i;
@@ -295,16 +279,16 @@ static ethr_ts_event *ts_event_pool(int size, ethr_ts_event **endpp)
+ ETHR_CACHE_LINE_SIZE);
if (!atsev)
return NULL;
- if ((((EthrPtrSzUInt) atsev) & ETHR_CACHE_LINE_MASK) == 0)
+ if ((((ethr_uint_t) atsev) & ETHR_CACHE_LINE_MASK) == 0)
atsev = ((ethr_aligned_ts_event *)
- ((((EthrPtrSzUInt) atsev) & ~ETHR_CACHE_LINE_MASK)
+ ((((ethr_uint_t) atsev) & ~ETHR_CACHE_LINE_MASK)
+ ETHR_CACHE_LINE_SIZE));
for (i = 1; i < size; i++) {
atsev[i-1].ts_ev.next = &atsev[i].ts_ev;
- ethr_atomic_init(&atsev[i-1].ts_ev.uaflgs, 0);
+ ethr_atomic32_init(&atsev[i-1].ts_ev.uaflgs, 0);
atsev[i-1].ts_ev.iflgs = 0;
}
- ethr_atomic_init(&atsev[size-1].ts_ev.uaflgs, 0);
+ ethr_atomic32_init(&atsev[size-1].ts_ev.uaflgs, 0);
atsev[size-1].ts_ev.iflgs = 0;
atsev[size-1].ts_ev.next = NULL;
if (endpp)
@@ -466,170 +450,6 @@ int ethr_get_main_thr_status(int *on)
return 0;
}
-
-/* Atomics */
-
-void
-ethr_atomic_init(ethr_atomic_t *var, long i)
-{
- ETHR_ASSERT(var);
- ethr_atomic_init__(var, i);
-}
-
-void
-ethr_atomic_set(ethr_atomic_t *var, long i)
-{
- ETHR_ASSERT(!ethr_not_inited__);
- ETHR_ASSERT(var);
- ethr_atomic_set__(var, i);
-}
-
-long
-ethr_atomic_read(ethr_atomic_t *var)
-{
- ETHR_ASSERT(!ethr_not_inited__);
- ETHR_ASSERT(var);
- return ethr_atomic_read__(var);
-}
-
-
-long
-ethr_atomic_add_read(ethr_atomic_t *var, long incr)
-{
- ETHR_ASSERT(!ethr_not_inited__);
- ETHR_ASSERT(var);
- return ethr_atomic_add_read__(var, incr);
-}
-
-long
-ethr_atomic_inc_read(ethr_atomic_t *var)
-{
- ETHR_ASSERT(!ethr_not_inited__);
- ETHR_ASSERT(var);
- return ethr_atomic_inc_read__(var);
-}
-
-long
-ethr_atomic_dec_read(ethr_atomic_t *var)
-{
- ETHR_ASSERT(!ethr_not_inited__);
- ETHR_ASSERT(var);
- return ethr_atomic_dec_read__(var);
-}
-
-void
-ethr_atomic_add(ethr_atomic_t *var, long incr)
-{
- ETHR_ASSERT(!ethr_not_inited__);
- ETHR_ASSERT(var);
- ethr_atomic_add__(var, incr);
-}
-
-void
-ethr_atomic_inc(ethr_atomic_t *var)
-{
- ETHR_ASSERT(!ethr_not_inited__);
- ETHR_ASSERT(var);
- ethr_atomic_inc__(var);
-}
-
-void
-ethr_atomic_dec(ethr_atomic_t *var)
-{
- ETHR_ASSERT(!ethr_not_inited__);
- ETHR_ASSERT(var);
- ethr_atomic_dec__(var);
-}
-
-long
-ethr_atomic_read_band(ethr_atomic_t *var, long mask)
-{
- ETHR_ASSERT(!ethr_not_inited__);
- ETHR_ASSERT(var);
- return ethr_atomic_read_band__(var, mask);
-}
-
-long
-ethr_atomic_read_bor(ethr_atomic_t *var, long mask)
-{
- ETHR_ASSERT(!ethr_not_inited__);
- ETHR_ASSERT(var);
- return ethr_atomic_read_bor__(var, mask);
-}
-
-long
-ethr_atomic_xchg(ethr_atomic_t *var, long new)
-{
- ETHR_ASSERT(!ethr_not_inited__);
- ETHR_ASSERT(var);
- return ethr_atomic_xchg__(var, new);
-}
-
-long
-ethr_atomic_cmpxchg(ethr_atomic_t *var, long new, long expected)
-{
- ETHR_ASSERT(!ethr_not_inited__);
- ETHR_ASSERT(var);
- return ethr_atomic_cmpxchg__(var, new, expected);
-}
-
-long
-ethr_atomic_read_acqb(ethr_atomic_t *var)
-{
- ETHR_ASSERT(!ethr_not_inited__);
- ETHR_ASSERT(var);
- return ethr_atomic_read_acqb__(var);
-}
-
-long
-ethr_atomic_inc_read_acqb(ethr_atomic_t *var)
-{
- ETHR_ASSERT(!ethr_not_inited__);
- ETHR_ASSERT(var);
- return ethr_atomic_inc_read_acqb__(var);
-}
-
-void
-ethr_atomic_set_relb(ethr_atomic_t *var, long i)
-{
- ETHR_ASSERT(!ethr_not_inited__);
- ETHR_ASSERT(var);
- ethr_atomic_set_relb__(var, i);
-}
-
-void
-ethr_atomic_dec_relb(ethr_atomic_t *var)
-{
- ETHR_ASSERT(!ethr_not_inited__);
- ETHR_ASSERT(var);
- ethr_atomic_dec_relb__(var);
-}
-
-long
-ethr_atomic_dec_read_relb(ethr_atomic_t *var)
-{
- ETHR_ASSERT(!ethr_not_inited__);
- ETHR_ASSERT(var);
- return ethr_atomic_dec_read_relb__(var);
-}
-
-long
-ethr_atomic_cmpxchg_acqb(ethr_atomic_t *var, long new, long exp)
-{
- ETHR_ASSERT(!ethr_not_inited__);
- ETHR_ASSERT(var);
- return ethr_atomic_cmpxchg_acqb__(var, new, exp);
-}
-
-long
-ethr_atomic_cmpxchg_relb(ethr_atomic_t *var, long new, long exp)
-{
- ETHR_ASSERT(!ethr_not_inited__);
- ETHR_ASSERT(var);
- return ethr_atomic_cmpxchg_relb__(var, new, exp);
-}
-
-
/* Spinlocks and rwspinlocks */
int
diff --git a/erts/lib_src/common/ethr_mutex.c b/erts/lib_src/common/ethr_mutex.c
index a2fbf3a454..2ddef32dfc 100644
--- a/erts/lib_src/common/ethr_mutex.c
+++ b/erts/lib_src/common/ethr_mutex.c
@@ -206,16 +206,16 @@ static void hard_debug_chk_q__(struct ethr_mutex_base_ *, int);
#ifdef ETHR_USE_OWN_RWMTX_IMPL__
static void
rwmutex_transfer_read_lock(ethr_rwmutex *rwmtx,
- long initial,
+ ethr_sint32_t initial,
int q_locked);
static void
rwmutex_unlock_wake(ethr_rwmutex *rwmtx,
int have_w,
- long initial,
+ ethr_sint32_t initial,
int transfer_read_lock);
static int
rwmutex_try_complete_runlock(ethr_rwmutex *rwmtx,
- long initial,
+ ethr_sint32_t initial,
ethr_ts_event *tse,
int start_next_ix,
int check_before_try,
@@ -242,12 +242,12 @@ rwmutex_freqread_rdrs_add(ethr_rwmutex *rwmtx,
int inc)
{
if (type == ETHR_RWMUTEX_TYPE_FREQUENT_READ || ix == 0)
- ethr_atomic_add(&rwmtx->tdata.ra[ix].data.readers, inc);
+ ethr_atomic32_add(&rwmtx->tdata.ra[ix].data.readers, inc);
else {
ETHR_ASSERT(type == ETHR_RWMUTEX_TYPE_EXTREMELY_FREQUENT_READ);
- ETHR_ASSERT(ethr_atomic_read(&rwmtx->tdata.ra[ix].data.readers) == 0);
+ ETHR_ASSERT(ethr_atomic32_read(&rwmtx->tdata.ra[ix].data.readers) == 0);
ETHR_ASSERT(inc == 1);
- ethr_atomic_set(&rwmtx->tdata.ra[ix].data.readers, (long) 1);
+ ethr_atomic32_set(&rwmtx->tdata.ra[ix].data.readers, (ethr_sint32_t) 1);
}
}
@@ -258,15 +258,15 @@ rwmutex_freqread_rdrs_inc(ethr_rwmutex *rwmtx, ethr_ts_event *tse)
if (rwmtx->type == ETHR_RWMUTEX_TYPE_FREQUENT_READ) {
ix = tse->rgix;
atomic_inc:
- ethr_atomic_inc(&rwmtx->tdata.ra[ix].data.readers);
+ ethr_atomic32_inc(&rwmtx->tdata.ra[ix].data.readers);
}
else {
ix = tse->mtix;
if (ix == 0)
goto atomic_inc;
ETHR_ASSERT(rwmtx->type == ETHR_RWMUTEX_TYPE_EXTREMELY_FREQUENT_READ);
- ETHR_ASSERT(ethr_atomic_read(&rwmtx->tdata.ra[ix].data.readers) == 0);
- ethr_atomic_set(&rwmtx->tdata.ra[ix].data.readers, (long) 1);
+ ETHR_ASSERT(ethr_atomic32_read(&rwmtx->tdata.ra[ix].data.readers) == 0);
+ ethr_atomic32_set(&rwmtx->tdata.ra[ix].data.readers, (ethr_sint32_t) 1);
}
}
@@ -279,64 +279,65 @@ rwmutex_freqread_rdrs_dec(ethr_rwmutex *rwmtx, ethr_ts_event *tse)
if (rwmtx->type == ETHR_RWMUTEX_TYPE_FREQUENT_READ) {
ix = tse->rgix;
atomic_dec:
- ethr_atomic_dec(&rwmtx->tdata.ra[ix].data.readers);
+ ethr_atomic32_dec(&rwmtx->tdata.ra[ix].data.readers);
}
else {
ix = tse->mtix;
if (ix == 0)
goto atomic_dec;
ETHR_ASSERT(rwmtx->type == ETHR_RWMUTEX_TYPE_EXTREMELY_FREQUENT_READ);
- ETHR_ASSERT(ethr_atomic_read(&rwmtx->tdata.ra[ix].data.readers) == 1);
- ethr_atomic_set(&rwmtx->tdata.ra[ix].data.readers, (long) 0);
+ ETHR_ASSERT(ethr_atomic32_read(&rwmtx->tdata.ra[ix].data.readers) == 1);
+ ethr_atomic32_set(&rwmtx->tdata.ra[ix].data.readers, (ethr_sint32_t) 0);
}
}
#endif
-static ETHR_INLINE long
+static ETHR_INLINE ethr_sint32_t
rwmutex_freqread_rdrs_dec_read(ethr_rwmutex *rwmtx, ethr_ts_event *tse)
{
int ix;
if (rwmtx->type == ETHR_RWMUTEX_TYPE_FREQUENT_READ) {
ix = tse->rgix;
atomic_dec_read:
- return ethr_atomic_dec_read(&rwmtx->tdata.ra[ix].data.readers);
+ return ethr_atomic32_dec_read(&rwmtx->tdata.ra[ix].data.readers);
}
else {
ix = tse->mtix;
if (ix == 0)
goto atomic_dec_read;
ETHR_ASSERT(rwmtx->type == ETHR_RWMUTEX_TYPE_EXTREMELY_FREQUENT_READ);
- ETHR_ASSERT(ethr_atomic_read(&rwmtx->tdata.ra[ix].data.readers) == 1);
- ethr_atomic_set(&rwmtx->tdata.ra[ix].data.readers, (long) 0);
- return (long) 0;
+ ETHR_ASSERT(ethr_atomic32_read(&rwmtx->tdata.ra[ix].data.readers) == 1);
+ ethr_atomic32_set(&rwmtx->tdata.ra[ix].data.readers, (ethr_sint32_t) 0);
+ return (ethr_sint32_t) 0;
}
}
-static ETHR_INLINE long
+static ETHR_INLINE ethr_sint32_t
rwmutex_freqread_rdrs_dec_read_relb(ethr_rwmutex *rwmtx, ethr_ts_event *tse)
{
int ix;
if (rwmtx->type == ETHR_RWMUTEX_TYPE_FREQUENT_READ) {
ix = tse->rgix;
atomic_dec_read:
- return ethr_atomic_dec_read_relb(&rwmtx->tdata.ra[ix].data.readers);
+ return ethr_atomic32_dec_read_relb(&rwmtx->tdata.ra[ix].data.readers);
}
else {
ix = tse->mtix;
if (ix == 0)
goto atomic_dec_read;
ETHR_ASSERT(rwmtx->type == ETHR_RWMUTEX_TYPE_EXTREMELY_FREQUENT_READ);
- ETHR_ASSERT(ethr_atomic_read(&rwmtx->tdata.ra[ix].data.readers) == 1);
- ethr_atomic_set_relb(&rwmtx->tdata.ra[ix].data.readers, (long) 0);
- return (long) 0;
+ ETHR_ASSERT(ethr_atomic32_read(&rwmtx->tdata.ra[ix].data.readers) == 1);
+ ethr_atomic32_set_relb(&rwmtx->tdata.ra[ix].data.readers,
+ (ethr_sint32_t) 0);
+ return (ethr_sint32_t) 0;
}
}
-static ETHR_INLINE long
+static ETHR_INLINE ethr_sint32_t
rwmutex_freqread_rdrs_read(ethr_rwmutex *rwmtx, int ix)
{
- long res = ethr_atomic_read(&rwmtx->tdata.ra[ix].data.readers);
+ ethr_sint32_t res = ethr_atomic32_read(&rwmtx->tdata.ra[ix].data.readers);
#ifdef ETHR_DEBUG
switch (rwmtx->type) {
case ETHR_RWMUTEX_TYPE_FREQUENT_READ:
@@ -402,19 +403,19 @@ static void
event_wait(struct ethr_mutex_base_ *mtxb,
ethr_ts_event *tse,
int spincount,
- long type,
+ ethr_sint32_t type,
int is_rwmtx,
int is_freq_read)
{
int locked = 0;
- long act;
+ ethr_sint32_t act;
int need_try_complete_runlock = 0;
int transfer_read_lock = 0;
/* Need to enqueue and wait... */
tse->uflgs = type;
- ethr_atomic_set(&tse->uaflgs, type);
+ ethr_atomic32_set(&tse->uaflgs, type);
ETHR_MTX_Q_LOCK(&mtxb->qlck);
locked = 1;
@@ -423,7 +424,7 @@ event_wait(struct ethr_mutex_base_ *mtxb,
hard_debug_chk_q__(mtxb, is_rwmtx);
#endif
- act = ethr_atomic_read(&mtxb->flgs);
+ act = ethr_atomic32_read(&mtxb->flgs);
if (act & type) {
@@ -453,7 +454,7 @@ event_wait(struct ethr_mutex_base_ *mtxb,
/* Set wait bit */
while (1) {
- long new, exp = act;
+ ethr_sint32_t new, exp = act;
need_try_complete_runlock = 0;
transfer_read_lock = 0;
@@ -484,7 +485,7 @@ event_wait(struct ethr_mutex_base_ *mtxb,
}
}
- act = ethr_atomic_cmpxchg_acqb(&mtxb->flgs, new, exp);
+ act = ethr_atomic32_cmpxchg_acqb(&mtxb->flgs, new, exp);
if (exp == act) {
if (new & type) {
act = new;
@@ -559,7 +560,7 @@ event_wait(struct ethr_mutex_base_ *mtxb,
while (1) {
ethr_event_reset(&tse->event);
- act = ethr_atomic_read_acqb(&tse->uaflgs);
+ act = ethr_atomic32_read_acqb(&tse->uaflgs);
if (!act)
goto done; /* Got it */
@@ -567,7 +568,7 @@ event_wait(struct ethr_mutex_base_ *mtxb,
ethr_event_swait(&tse->event, spincount);
/* swait result: 0 || EINTR */
- act = ethr_atomic_read_acqb(&tse->uaflgs);
+ act = ethr_atomic32_read_acqb(&tse->uaflgs);
if (!act)
goto done; /* Got it */
}
@@ -587,7 +588,7 @@ wake_writer(struct ethr_mutex_base_ *mtxb, int is_rwmtx)
dequeue(&mtxb->q, tse, tse);
ETHR_ASSERT(tse->uflgs == ETHR_RWMTX_W_WAIT_FLG__);
- ETHR_ASSERT(ethr_atomic_read(&tse->uaflgs) == ETHR_RWMTX_W_WAIT_FLG__);
+ ETHR_ASSERT(ethr_atomic32_read(&tse->uaflgs) == ETHR_RWMTX_W_WAIT_FLG__);
#ifdef ETHR_MTX_HARD_DEBUG_WSQ
mtxb->ws--;
#endif
@@ -597,7 +598,7 @@ wake_writer(struct ethr_mutex_base_ *mtxb, int is_rwmtx)
ETHR_MTX_Q_UNLOCK(&mtxb->qlck);
- ethr_atomic_set(&tse->uaflgs, 0);
+ ethr_atomic32_set(&tse->uaflgs, 0);
ethr_event_set(&tse->event);
}
@@ -649,11 +650,11 @@ int check_readers_array(ethr_rwmutex *rwmtx,
static ETHR_INLINE void
write_lock_wait(struct ethr_mutex_base_ *mtxb,
- long initial,
+ ethr_sint32_t initial,
int is_rwmtx,
int is_freq_read)
{
- long act = initial;
+ ethr_sint32_t act = initial;
int scnt, start_scnt;
ethr_ts_event *tse = NULL;
int until_yield = ETHR_YIELD_AFTER_BUSY_LOOPS;
@@ -706,13 +707,13 @@ write_lock_wait(struct ethr_mutex_base_ *mtxb,
until_yield = ETHR_YIELD_AFTER_BUSY_LOOPS;
ETHR_YIELD();
}
- act = ethr_atomic_read(&mtxb->flgs);
+ act = ethr_atomic32_read(&mtxb->flgs);
scnt--;
}
- act = ethr_atomic_cmpxchg_acqb(&mtxb->flgs,
- ETHR_RWMTX_W_FLG__,
- 0);
+ act = ethr_atomic32_cmpxchg_acqb(&mtxb->flgs,
+ ETHR_RWMTX_W_FLG__,
+ 0);
if (act == 0)
goto done; /* Got it */
}
@@ -756,16 +757,16 @@ mtxb_init(struct ethr_mutex_base_ *mtxb,
}
mtxb->q = NULL;
- ethr_atomic_init(&mtxb->flgs, 0);
+ ethr_atomic32_init(&mtxb->flgs, 0);
return ETHR_MTX_QLOCK_INIT(&mtxb->qlck);
}
static int
mtxb_destroy(struct ethr_mutex_base_ *mtxb)
{
- long act;
+ ethr_sint32_t act;
ETHR_MTX_Q_LOCK(&mtxb->qlck);
- act = ethr_atomic_read(&mtxb->flgs);
+ act = ethr_atomic32_read(&mtxb->flgs);
ETHR_MTX_Q_UNLOCK(&mtxb->qlck);
if (act != 0)
return EINVAL;
@@ -831,13 +832,13 @@ ethr_mutex_destroy(ethr_mutex *mtx)
}
void
-ethr_mutex_lock_wait__(ethr_mutex *mtx, long initial)
+ethr_mutex_lock_wait__(ethr_mutex *mtx, ethr_sint32_t initial)
{
write_lock_wait(&mtx->mtxb, initial, 0, 0);
}
void
-ethr_mutex_unlock_wake__(ethr_mutex *mtx, long initial)
+ethr_mutex_unlock_wake__(ethr_mutex *mtx, ethr_sint32_t initial)
{
ethr_ts_event *tse;
@@ -845,7 +846,7 @@ ethr_mutex_unlock_wake__(ethr_mutex *mtx, long initial)
tse = mtx->mtxb.q;
ETHR_ASSERT(tse);
- ETHR_ASSERT(ethr_atomic_read(&mtx->mtxb.flgs)
+ ETHR_ASSERT(ethr_atomic32_read(&mtx->mtxb.flgs)
== (ETHR_RWMTX_W_FLG__|ETHR_RWMTX_W_WAIT_FLG__));
ETHR_ASSERT(initial & ETHR_RWMTX_W_WAIT_FLG__);
ETHR_MTX_HARD_DEBUG_CHK_Q(mtx);
@@ -855,7 +856,7 @@ ethr_mutex_unlock_wake__(ethr_mutex *mtx, long initial)
* mtxb->flgs; otherwise, we need to clear the write wait bit...
*/
if (tse->next == mtx->mtxb.q)
- ethr_atomic_set(&mtx->mtxb.flgs, ETHR_RWMTX_W_FLG__);
+ ethr_atomic32_set(&mtx->mtxb.flgs, ETHR_RWMTX_W_FLG__);
wake_writer(&mtx->mtxb, 0);
}
@@ -865,7 +866,7 @@ ethr_mutex_unlock_wake__(ethr_mutex *mtx, long initial)
static void
enqueue_mtx(ethr_mutex *mtx, ethr_ts_event *tse_start, ethr_ts_event *tse_end)
{
- long act;
+ ethr_sint32_t act;
/*
* `ethr_cond_signal()' and `ethr_cond_broadcast()' end up here. If `mtx'
@@ -894,7 +895,7 @@ enqueue_mtx(ethr_mutex *mtx, ethr_ts_event *tse_start, ethr_ts_event *tse_end)
}
#endif
- act = ethr_atomic_read(&mtx->mtxb.flgs);
+ act = ethr_atomic32_read(&mtx->mtxb.flgs);
ETHR_ASSERT(act == 0
|| act == ETHR_RWMTX_W_FLG__
|| act == (ETHR_RWMTX_W_FLG__|ETHR_RWMTX_W_WAIT_FLG__));
@@ -902,10 +903,10 @@ enqueue_mtx(ethr_mutex *mtx, ethr_ts_event *tse_start, ethr_ts_event *tse_end)
/* The normal sane case */
if (!(act & ETHR_RWMTX_W_WAIT_FLG__)) {
ETHR_ASSERT(!mtx->mtxb.q);
- act = ethr_atomic_cmpxchg(&mtx->mtxb.flgs,
- (ETHR_RWMTX_W_FLG__
- | ETHR_RWMTX_W_WAIT_FLG__),
- ETHR_RWMTX_W_FLG__);
+ act = ethr_atomic32_cmpxchg(&mtx->mtxb.flgs,
+ (ETHR_RWMTX_W_FLG__
+ | ETHR_RWMTX_W_WAIT_FLG__),
+ ETHR_RWMTX_W_FLG__);
if (act != ETHR_RWMTX_W_FLG__) {
/*
* Sigh... this wasn't so sane after all since, the mutex was
@@ -937,14 +938,14 @@ enqueue_mtx(ethr_mutex *mtx, ethr_ts_event *tse_start, ethr_ts_event *tse_end)
multi = tse_start != tse_end;
while (1) {
- long new, exp = act;
+ ethr_sint32_t new, exp = act;
if (multi || (act & ETHR_RWMTX_W_FLG__))
new = ETHR_RWMTX_W_FLG__|ETHR_RWMTX_W_WAIT_FLG__;
else
new = ETHR_RWMTX_W_FLG__;
- act = ethr_atomic_cmpxchg(&mtx->mtxb.flgs, new, exp);
+ act = ethr_atomic32_cmpxchg(&mtx->mtxb.flgs, new, exp);
if (exp == act) {
ETHR_ASSERT(!mtx->mtxb.q);
if (act & ETHR_RWMTX_W_FLG__) {
@@ -972,7 +973,7 @@ enqueue_mtx(ethr_mutex *mtx, ethr_ts_event *tse_start, ethr_ts_event *tse_end)
ETHR_MTX_HARD_DEBUG_CHK_Q(mtx);
ETHR_MTX_Q_UNLOCK(&mtx->mtxb.qlck);
- ethr_atomic_set(&tse_start->uaflgs, 0);
+ ethr_atomic32_set(&tse_start->uaflgs, 0);
ethr_event_set(&tse_start->event);
}
break;
@@ -1063,9 +1064,9 @@ ethr_cond_signal(ethr_cond *cnd)
ETHR_MTX_HARD_DEBUG_FENCE_CHK(mtx);
ETHR_ASSERT(tse->uflgs == ETHR_RWMTX_W_WAIT_FLG__);
- ETHR_ASSERT(ethr_atomic_read(&tse->uaflgs) == ETHR_CND_WAIT_FLG__);
+ ETHR_ASSERT(ethr_atomic32_read(&tse->uaflgs) == ETHR_CND_WAIT_FLG__);
- ethr_atomic_set(&tse->uaflgs, ETHR_RWMTX_W_WAIT_FLG__);
+ ethr_atomic32_set(&tse->uaflgs, ETHR_RWMTX_W_WAIT_FLG__);
dequeue(&cnd->q, tse, tse);
@@ -1116,10 +1117,11 @@ ethr_cond_broadcast(ethr_cond *cnd)
/* The normal case */
ETHR_ASSERT(tse_tmp->uflgs == ETHR_RWMTX_W_WAIT_FLG__);
- ETHR_ASSERT(ethr_atomic_read(&tse_tmp->uaflgs)
+ ETHR_ASSERT(ethr_atomic32_read(&tse_tmp->uaflgs)
== ETHR_CND_WAIT_FLG__);
- ethr_atomic_set(&tse_tmp->uaflgs, ETHR_RWMTX_W_WAIT_FLG__);
+ ethr_atomic32_set(&tse_tmp->uaflgs,
+ ETHR_RWMTX_W_WAIT_FLG__);
}
else {
/* Should be very unusual */
@@ -1172,7 +1174,7 @@ ethr_cond_wait(ethr_cond *cnd, ethr_mutex *mtx)
tse->udata = (void *) mtx;
tse->uflgs = ETHR_RWMTX_W_WAIT_FLG__; /* Prep for mutex lock op */
- ethr_atomic_set(&tse->uaflgs, ETHR_CND_WAIT_FLG__);
+ ethr_atomic32_set(&tse->uaflgs, ETHR_CND_WAIT_FLG__);
ETHR_MTX_Q_LOCK(&cnd->qlck);
@@ -1185,11 +1187,11 @@ ethr_cond_wait(ethr_cond *cnd, ethr_mutex *mtx)
/* Wait */
woken = 0;
while (1) {
- long act;
+ ethr_sint32_t act;
ethr_event_reset(&tse->event);
- act = ethr_atomic_read_acqb(&tse->uaflgs);
+ act = ethr_atomic32_read_acqb(&tse->uaflgs);
if (!act)
break; /* Mtx locked */
@@ -1205,7 +1207,7 @@ ethr_cond_wait(ethr_cond *cnd, ethr_mutex *mtx)
*/
if (act == ETHR_CND_WAIT_FLG__) {
ETHR_MTX_Q_LOCK(&cnd->qlck);
- act = ethr_atomic_read(&tse->uaflgs);
+ act = ethr_atomic32_read(&tse->uaflgs);
ETHR_ASSERT(act == ETHR_CND_WAIT_FLG__
|| act == ETHR_RWMTX_W_WAIT_FLG__);
/*
@@ -1407,7 +1409,7 @@ wake_readers(ethr_rwmutex *rwmtx, int rs)
rwmtx->rq_end = NULL;
ETHR_ASSERT(!rwmtx->mtxb.q
- || (ethr_atomic_read(&rwmtx->mtxb.q->uaflgs)
+ || (ethr_atomic32_read(&rwmtx->mtxb.q->uaflgs)
== ETHR_RWMTX_W_WAIT_FLG__));
ETHR_RWMTX_HARD_DEBUG_CHK_Q(rwmtx);
@@ -1418,7 +1420,7 @@ wake_readers(ethr_rwmutex *rwmtx, int rs)
#ifdef ETHR_DEBUG
ETHR_ASSERT(tse->uflgs == ETHR_RWMTX_R_WAIT_FLG__);
- ETHR_ASSERT(ethr_atomic_read(&tse->uaflgs)
+ ETHR_ASSERT(ethr_atomic32_read(&tse->uaflgs)
== ETHR_RWMTX_R_WAIT_FLG__);
drs++;
#endif
@@ -1426,7 +1428,7 @@ wake_readers(ethr_rwmutex *rwmtx, int rs)
tse_next = tse->next; /* we aren't allowed to read tse->next
after we have reset uaflgs */
- ethr_atomic_set(&tse->uaflgs, 0);
+ ethr_atomic32_set(&tse->uaflgs, 0);
ethr_event_set(&tse->event);
tse = tse_next;
}
@@ -1469,7 +1471,7 @@ int check_readers_array(ethr_rwmutex *rwmtx,
ETHR_MEMORY_BARRIER;
do {
- long act = rwmutex_freqread_rdrs_read(rwmtx, ix);
+ ethr_sint32_t act = rwmutex_freqread_rdrs_read(rwmtx, ix);
if (act != 0)
return EBUSY;
ix++;
@@ -1483,9 +1485,9 @@ int check_readers_array(ethr_rwmutex *rwmtx,
static void
rwmutex_freqread_rdrs_dec_chk_wakeup(ethr_rwmutex *rwmtx,
ethr_ts_event *tse,
- long initial)
+ ethr_sint32_t initial)
{
- long act = initial;
+ ethr_sint32_t act = initial;
if ((act & (ETHR_RWMTX_W_FLG__|
ETHR_RWMTX_R_ABRT_UNLCK_FLG__)) == 0) {
@@ -1515,7 +1517,7 @@ rwmutex_freqread_rdrs_dec_chk_wakeup(ethr_rwmutex *rwmtx,
if (!rwmtx->mtxb.q)
ETHR_MTX_Q_UNLOCK(&rwmtx->mtxb.qlck);
else if (is_w_waiter(rwmtx->mtxb.q)) {
- act = ethr_atomic_read(&rwmtx->mtxb.flgs);
+ act = ethr_atomic32_read(&rwmtx->mtxb.flgs);
ETHR_MTX_Q_UNLOCK(&rwmtx->mtxb.qlck);
if ((act & ETHR_RWMTX_W_FLG__) == 0)
rwmutex_try_complete_runlock(rwmtx, act, tse, 1, 0, 0);
@@ -1525,7 +1527,7 @@ rwmutex_freqread_rdrs_dec_chk_wakeup(ethr_rwmutex *rwmtx,
* rwmutex_transfer_read_lock() will
* unlock Q lock.
*/
- act = ethr_atomic_read(&rwmtx->mtxb.flgs);
+ act = ethr_atomic32_read(&rwmtx->mtxb.flgs);
if (act & ETHR_RWMTX_W_FLG__)
ETHR_MTX_Q_UNLOCK(&rwmtx->mtxb.qlck);
else
@@ -1539,7 +1541,7 @@ static void
rwmutex_freqread_restore_failed_tryrlock(ethr_rwmutex *rwmtx,
ethr_ts_event *tse)
{
- long act;
+ ethr_sint32_t act;
/*
* Restore failed increment
*/
@@ -1548,21 +1550,21 @@ rwmutex_freqread_restore_failed_tryrlock(ethr_rwmutex *rwmtx,
ETHR_MEMORY_BARRIER;
if (act == 0) {
- act = ethr_atomic_read(&rwmtx->mtxb.flgs);
+ act = ethr_atomic32_read(&rwmtx->mtxb.flgs);
rwmutex_freqread_rdrs_dec_chk_wakeup(rwmtx, tse, act);
}
}
static int
rwmutex_try_complete_runlock(ethr_rwmutex *rwmtx,
- long initial,
+ ethr_sint32_t initial,
ethr_ts_event *tse,
int start_next_ix,
int check_before_try,
int try_write_lock)
{
ethr_ts_event *tse_tmp;
- long act = initial;
+ ethr_sint32_t act = initial;
int six, res, length;
ETHR_ASSERT((act & ETHR_RWMTX_W_FLG__) == 0);
@@ -1606,15 +1608,15 @@ rwmutex_try_complete_runlock(ethr_rwmutex *rwmtx,
restart:
while (1) {
- long exp = act;
- long new = act+1;
+ ethr_sint32_t exp = act;
+ ethr_sint32_t new = act+1;
ETHR_ASSERT((act & ETHR_RWMTX_R_ABRT_UNLCK_FLG__) == 0);
ETHR_ASSERT((act & ETHR_RWMTX_R_PEND_UNLCK_MASK__)
< ETHR_RWMTX_R_PEND_UNLCK_MASK__);
- act = ethr_atomic_cmpxchg(&rwmtx->mtxb.flgs, new, exp);
+ act = ethr_atomic32_cmpxchg(&rwmtx->mtxb.flgs, new, exp);
if (exp == act) {
act = new;
break;
@@ -1651,8 +1653,8 @@ rwmutex_try_complete_runlock(ethr_rwmutex *rwmtx,
while (1) {
int finished_abort = 0;
- long exp = act;
- long new = act;
+ ethr_sint32_t exp = act;
+ ethr_sint32_t new = act;
new--;
if (act & ETHR_RWMTX_R_ABRT_UNLCK_FLG__) {
@@ -1668,7 +1670,7 @@ rwmutex_try_complete_runlock(ethr_rwmutex *rwmtx,
ETHR_ASSERT(act & ETHR_RWMTX_R_PEND_UNLCK_MASK__);
- act = ethr_atomic_cmpxchg(&rwmtx->mtxb.flgs, new, exp);
+ act = ethr_atomic32_cmpxchg(&rwmtx->mtxb.flgs, new, exp);
if (exp == act) {
act = new;
if (act & ETHR_RWMTX_W_FLG__)
@@ -1702,9 +1704,9 @@ rwmutex_try_complete_runlock(ethr_rwmutex *rwmtx,
tryrwlock:
/* Try to write lock it */
- act = ethr_atomic_cmpxchg_acqb(&rwmtx->mtxb.flgs,
- ETHR_RWMTX_W_FLG__,
- 0);
+ act = ethr_atomic32_cmpxchg_acqb(&rwmtx->mtxb.flgs,
+ ETHR_RWMTX_W_FLG__,
+ 0);
return act == 0 ? 0 : EBUSY;
}
@@ -1713,11 +1715,11 @@ rwmutex_try_complete_runlock(ethr_rwmutex *rwmtx,
static ETHR_INLINE void
rwmutex_incdec_restore_failed_tryrlock(ethr_rwmutex *rwmtx)
{
- long act;
+ ethr_sint32_t act;
/*
* Restore failed increment
*/
- act = ethr_atomic_dec_read(&rwmtx->mtxb.flgs);
+ act = ethr_atomic32_dec_read(&rwmtx->mtxb.flgs);
if ((act & ETHR_RWMTX_WAIT_FLGS__)
&& (act & ~ETHR_RWMTX_WAIT_FLGS__) == 0) {
rwmutex_unlock_wake(rwmtx, 0, act, 0);
@@ -1727,10 +1729,9 @@ rwmutex_incdec_restore_failed_tryrlock(ethr_rwmutex *rwmtx)
#endif
static void
-rwmutex_normal_rlock_wait(ethr_rwmutex *rwmtx,
- long initial)
+rwmutex_normal_rlock_wait(ethr_rwmutex *rwmtx, ethr_sint32_t initial)
{
- long act = initial, exp;
+ ethr_sint32_t act = initial, exp;
int scnt, start_scnt;
ethr_ts_event *tse = NULL;
int until_yield = ETHR_YIELD_AFTER_BUSY_LOOPS;
@@ -1746,7 +1747,7 @@ rwmutex_normal_rlock_wait(ethr_rwmutex *rwmtx,
#ifdef ETHR_RLOCK_WITH_INC_DEC
rwmutex_incdec_restore_failed_tryrlock(rwmtx);
- act = ethr_atomic_read(&rwmtx->mtxb.flgs);
+ act = ethr_atomic32_read(&rwmtx->mtxb.flgs);
#endif
while (act & (ETHR_RWMTX_W_FLG__|ETHR_RWMTX_W_WAIT_FLG__)) {
@@ -1763,17 +1764,17 @@ rwmutex_normal_rlock_wait(ethr_rwmutex *rwmtx,
until_yield = ETHR_YIELD_AFTER_BUSY_LOOPS;
ETHR_YIELD();
}
- act = ethr_atomic_read(&rwmtx->mtxb.flgs);
+ act = ethr_atomic32_read(&rwmtx->mtxb.flgs);
scnt--;
}
exp = act;
#ifdef ETHR_RLOCK_WITH_INC_DEC
- act = ethr_atomic_inc_read(&rwmtx->mtxb.flgs);
+ act = ethr_atomic32_inc_read(&rwmtx->mtxb.flgs);
if ((act & (ETHR_RWMTX_W_FLG__|ETHR_RWMTX_W_WAIT_FLG__)) == 0)
goto done; /* Got it */
#else
- act = ethr_atomic_cmpxchg_acqb(&rwmtx->mtxb.flgs, exp+1, exp);
+ act = ethr_atomic32_cmpxchg_acqb(&rwmtx->mtxb.flgs, exp+1, exp);
if (act == exp)
goto done; /* Got it */
#endif
@@ -1792,19 +1793,19 @@ static int
rwmutex_freqread_rlock(ethr_rwmutex *rwmtx, ethr_ts_event *tse, int trylock)
{
int res = 0;
- long act;
+ ethr_sint32_t act;
rwmutex_freqread_rdrs_inc(rwmtx, tse);
ETHR_MEMORY_BARRIER;
- act = ethr_atomic_read_acqb(&rwmtx->mtxb.flgs);
+ act = ethr_atomic32_read_acqb(&rwmtx->mtxb.flgs);
if (act != ETHR_RWMTX_R_FLG__) {
int wake_other_readers;
while (1) {
- long exp, new;
+ ethr_sint32_t exp, new;
wake_other_readers = 0;
@@ -1846,7 +1847,7 @@ rwmutex_freqread_rlock(ethr_rwmutex *rwmtx, ethr_ts_event *tse, int trylock)
}
exp = act;
- act = ethr_atomic_cmpxchg_acqb(&rwmtx->mtxb.flgs, new, exp);
+ act = ethr_atomic32_cmpxchg_acqb(&rwmtx->mtxb.flgs, new, exp);
if (act == exp)
break;
}
@@ -1862,7 +1863,7 @@ static void
rwmutex_freqread_rlock_wait(ethr_rwmutex *rwmtx,
ethr_ts_event *tse)
{
- long act;
+ ethr_sint32_t act;
int scnt, start_scnt;
int until_yield = ETHR_YIELD_AFTER_BUSY_LOOPS;
@@ -1875,7 +1876,7 @@ rwmutex_freqread_rlock_wait(ethr_rwmutex *rwmtx,
while (1) {
- act = ethr_atomic_read(&rwmtx->mtxb.flgs);
+ act = ethr_atomic32_read(&rwmtx->mtxb.flgs);
while (act & (ETHR_RWMTX_W_FLG__|ETHR_RWMTX_W_WAIT_FLG__)) {
if (scnt <= 0) {
@@ -1890,7 +1891,7 @@ rwmutex_freqread_rlock_wait(ethr_rwmutex *rwmtx,
until_yield = ETHR_YIELD_AFTER_BUSY_LOOPS;
ETHR_YIELD();
}
- act = ethr_atomic_read(&rwmtx->mtxb.flgs);
+ act = ethr_atomic32_read(&rwmtx->mtxb.flgs);
scnt--;
}
@@ -1900,21 +1901,23 @@ rwmutex_freqread_rlock_wait(ethr_rwmutex *rwmtx,
}
static void
-rwmutex_normal_rwlock_wait(ethr_rwmutex *rwmtx, long initial)
+rwmutex_normal_rwlock_wait(ethr_rwmutex *rwmtx, ethr_sint32_t initial)
{
write_lock_wait(&rwmtx->mtxb, initial, 1, 0);
}
static void
-rwmutex_freqread_rwlock_wait(ethr_rwmutex *rwmtx, long initial)
+rwmutex_freqread_rwlock_wait(ethr_rwmutex *rwmtx, ethr_sint32_t initial)
{
write_lock_wait(&rwmtx->mtxb, initial, 1, 1);
}
static ETHR_INLINE void
-rwlock_wake_set_flags(ethr_rwmutex *rwmtx, long new_initial, long act_initial)
+rwlock_wake_set_flags(ethr_rwmutex *rwmtx,
+ ethr_sint32_t new_initial,
+ ethr_sint32_t act_initial)
{
- long act, act_mask;
+ ethr_sint32_t act, act_mask;
int chk_abrt_flg;
ETHR_MEMORY_BARRIER;
@@ -1935,18 +1938,18 @@ rwlock_wake_set_flags(ethr_rwmutex *rwmtx, long new_initial, long act_initial)
#else
/* rs mask always zero */
ETHR_ASSERT((act_initial & ETHR_RWMTX_RS_MASK__) == 0);
- ethr_atomic_set(&rwmtx->mtxb.flgs, new_initial);
+ ethr_atomic32_set(&rwmtx->mtxb.flgs, new_initial);
return;
#endif
}
act = act_initial;
while (1) {
- long exp = act;
- long new = new_initial + (act & act_mask);
+ ethr_sint32_t exp = act;
+ ethr_sint32_t new = new_initial + (act & act_mask);
if (chk_abrt_flg && (act & act_mask))
new |= ETHR_RWMTX_R_ABRT_UNLCK_FLG__;
- act = ethr_atomic_cmpxchg(&rwmtx->mtxb.flgs, new, exp);
+ act = ethr_atomic32_cmpxchg(&rwmtx->mtxb.flgs, new, exp);
if (act == exp)
break;
exp = act;
@@ -1960,7 +1963,7 @@ dbg_unlock_wake(ethr_rwmutex *rwmtx,
int have_w,
ethr_ts_event *tse)
{
- long exp, act, imask;
+ ethr_sint32_t exp, act, imask;
exp = have_w ? ETHR_RWMTX_W_FLG__ : 0;
@@ -1982,7 +1985,7 @@ dbg_unlock_wake(ethr_rwmutex *rwmtx,
if (rwmtx->rq_end) {
exp |= ETHR_RWMTX_R_WAIT_FLG__;
}
- act = ethr_atomic_read(&rwmtx->mtxb.flgs);
+ act = ethr_atomic32_read(&rwmtx->mtxb.flgs);
ETHR_ASSERT((exp & ~imask) == (act & ~imask));
ETHR_RWMTX_HARD_DEBUG_CHK_Q(rwmtx);
@@ -2001,7 +2004,7 @@ dbg_unlock_wake(ethr_rwmutex *rwmtx,
imask |= ETHR_RWMTX_RS_MASK__;
}
}
- act = ethr_atomic_read(&rwmtx->mtxb.flgs);
+ act = ethr_atomic32_read(&rwmtx->mtxb.flgs);
ETHR_ASSERT((exp & ~imask) == (act & ~imask));
ETHR_RWMTX_HARD_DEBUG_CHK_Q(rwmtx);
@@ -2012,9 +2015,11 @@ dbg_unlock_wake(ethr_rwmutex *rwmtx,
#endif
static void
-rwmutex_transfer_read_lock(ethr_rwmutex *rwmtx, long initial, int q_locked)
+rwmutex_transfer_read_lock(ethr_rwmutex *rwmtx,
+ ethr_sint32_t initial,
+ int q_locked)
{
- long act = initial;
+ ethr_sint32_t act = initial;
if (!q_locked) {
ethr_ts_event *tse;
@@ -2022,7 +2027,7 @@ rwmutex_transfer_read_lock(ethr_rwmutex *rwmtx, long initial, int q_locked)
ETHR_ASSERT((initial & ETHR_RWMTX_W_FLG__) == 0);
ETHR_MTX_Q_LOCK(&rwmtx->mtxb.qlck);
- act = ethr_atomic_read(&rwmtx->mtxb.flgs);
+ act = ethr_atomic32_read(&rwmtx->mtxb.flgs);
tse = rwmtx->mtxb.q;
if ((act & ETHR_RWMTX_W_FLG__) || !tse || is_w_waiter(tse)) {
/* Someone else woke the readers up... */
@@ -2035,10 +2040,10 @@ rwmutex_transfer_read_lock(ethr_rwmutex *rwmtx, long initial, int q_locked)
}
static void
-rwmutex_unlock_wake(ethr_rwmutex *rwmtx, int have_w, long initial,
+rwmutex_unlock_wake(ethr_rwmutex *rwmtx, int have_w, ethr_sint32_t initial,
int transfer_read_lock)
{
- long new, act = initial;
+ ethr_sint32_t new, act = initial;
ethr_ts_event *tse;
if (transfer_read_lock) {
@@ -2060,9 +2065,9 @@ rwmutex_unlock_wake(ethr_rwmutex *rwmtx, int have_w, long initial,
return;
else {
while ((act & ETHR_RWMTX_WAIT_FLGS__) == 0) {
- long exp = act;
+ ethr_sint32_t exp = act;
new = exp & ~ETHR_RWMTX_W_FLG__;
- act = ethr_atomic_cmpxchg(&rwmtx->mtxb.flgs, new, exp);
+ act = ethr_atomic32_cmpxchg(&rwmtx->mtxb.flgs, new, exp);
if (act == exp)
return;
}
@@ -2075,12 +2080,12 @@ rwmutex_unlock_wake(ethr_rwmutex *rwmtx, int have_w, long initial,
if (!have_w) {
if (!tse) {
#ifdef ETHR_DEBUG
- act = ethr_atomic_read(&rwmtx->mtxb.flgs);
+ act = ethr_atomic32_read(&rwmtx->mtxb.flgs);
ETHR_ASSERT((act & ETHR_RWMTX_WAIT_FLGS__) == 0);
#endif
goto already_served;
}
- act = ethr_atomic_read(&rwmtx->mtxb.flgs);
+ act = ethr_atomic32_read(&rwmtx->mtxb.flgs);
if (act == (ETHR_RWMTX_R_WAIT_FLG__|ETHR_RWMTX_R_FLG__)) {
ETHR_ASSERT(tse && !is_w_waiter(tse));
}
@@ -2099,7 +2104,7 @@ rwmutex_unlock_wake(ethr_rwmutex *rwmtx, int have_w, long initial,
if (is_w_waiter(tse)) {
if (!have_w) {
- act = ethr_atomic_read_bor(&rwmtx->mtxb.flgs,
+ act = ethr_atomic32_read_bor(&rwmtx->mtxb.flgs,
ETHR_RWMTX_W_FLG__);
ETHR_ASSERT((act & ~(ETHR_RWMTX_WAIT_FLGS__
| (rwmtx->type == ETHR_RWMUTEX_TYPE_NORMAL
@@ -2131,7 +2136,7 @@ rwmutex_unlock_wake(ethr_rwmutex *rwmtx, int have_w, long initial,
if (rwmtx->type == ETHR_RWMUTEX_TYPE_NORMAL) {
rs = rwmtx->tdata.rs;
- new = (long) rs;
+ new = (ethr_sint32_t) rs;
rwmtx->tdata.rs = 0;
}
else {
@@ -2187,16 +2192,16 @@ alloc_readers_array(int length, ethr_rwmutex_lived lived)
if (!mem)
return NULL;
- if ((((unsigned long) mem) & ETHR_CACHE_LINE_MASK) == 0) {
+ if ((((ethr_uint_t) mem) & ETHR_CACHE_LINE_MASK) == 0) {
ra = (ethr_rwmtx_readers_array__ *) mem;
ra->data.byte_offset = 0;
}
else {
ra = ((ethr_rwmtx_readers_array__ *)
- ((((unsigned long) mem) & ~ETHR_CACHE_LINE_MASK)
+ ((((ethr_uint_t) mem) & ~ETHR_CACHE_LINE_MASK)
+ ETHR_CACHE_LINE_SIZE));
- ra->data.byte_offset = (int) ((unsigned long) ra
- - (unsigned long) mem);
+ ra->data.byte_offset = (int) ((ethr_uint_t) ra
+ - (ethr_uint_t) mem);
}
ra->data.lived = lived;
return ra;
@@ -2270,7 +2275,7 @@ ethr_rwmutex_init_opt(ethr_rwmutex *rwmtx, ethr_rwmutex_opt *opt)
rwmtx->tdata.ra = ra;
for (ix = 0; ix < length; ix++) {
- ethr_atomic_init(&rwmtx->tdata.ra[ix].data.readers, 0);
+ ethr_atomic32_init(&rwmtx->tdata.ra[ix].data.readers, 0);
rwmtx->tdata.ra[ix].data.waiting_readers = 0;
}
break;
@@ -2324,7 +2329,7 @@ ethr_rwmutex_destroy(ethr_rwmutex *rwmtx)
#endif
ETHR_MTX_DBG_CHK_UNUSED_FLG_BITS(rwmtx);
if (rwmtx->type != ETHR_RWMUTEX_TYPE_NORMAL) {
- long act = ethr_atomic_read(&rwmtx->mtxb.flgs);
+ ethr_sint32_t act = ethr_atomic32_read(&rwmtx->mtxb.flgs);
if (act == ETHR_RWMTX_R_FLG__)
rwmutex_try_complete_runlock(rwmtx, act, NULL, 0, 0, 0);
}
@@ -2345,7 +2350,7 @@ int
ethr_rwmutex_tryrlock(ethr_rwmutex *rwmtx)
{
int res = 0;
- long act;
+ ethr_sint32_t act;
ETHR_ASSERT(!ethr_not_inited__);
ETHR_ASSERT(rwmtx);
@@ -2358,22 +2363,22 @@ ethr_rwmutex_tryrlock(ethr_rwmutex *rwmtx)
switch (rwmtx->type) {
case ETHR_RWMUTEX_TYPE_NORMAL: {
#ifdef ETHR_RLOCK_WITH_INC_DEC
- act = ethr_atomic_read(&rwmtx->mtxb.flgs);
+ act = ethr_atomic32_read(&rwmtx->mtxb.flgs);
if (act & (ETHR_RWMTX_W_FLG__|ETHR_RWMTX_W_WAIT_FLG__))
res = EBUSY;
else {
- act = ethr_atomic_inc_read_acqb(&rwmtx->mtxb.flgs);
+ act = ethr_atomic32_inc_read_acqb(&rwmtx->mtxb.flgs);
if (act & (ETHR_RWMTX_W_FLG__|ETHR_RWMTX_W_WAIT_FLG__)) {
rwmutex_incdec_restore_failed_tryrlock(rwmtx);
res = EBUSY;
}
}
#else
- long exp = 0;
+ ethr_sint32_t exp = 0;
int tries = 0;
while (1) {
- act = ethr_atomic_cmpxchg_acqb(&rwmtx->mtxb.flgs, exp+1, exp);
+ act = ethr_atomic32_cmpxchg_acqb(&rwmtx->mtxb.flgs, exp+1, exp);
if (act == exp) {
res = 0;
break;
@@ -2416,7 +2421,7 @@ ethr_rwmutex_tryrlock(ethr_rwmutex *rwmtx)
void
ethr_rwmutex_rlock(ethr_rwmutex *rwmtx)
{
- long act;
+ ethr_sint32_t act;
ETHR_ASSERT(!ethr_not_inited__);
ETHR_ASSERT(rwmtx);
@@ -2429,14 +2434,14 @@ ethr_rwmutex_rlock(ethr_rwmutex *rwmtx)
switch (rwmtx->type) {
case ETHR_RWMUTEX_TYPE_NORMAL: {
#ifdef ETHR_RLOCK_WITH_INC_DEC
- act = ethr_atomic_inc_read_acqb(&rwmtx->mtxb.flgs);
+ act = ethr_atomic32_inc_read_acqb(&rwmtx->mtxb.flgs);
if (act & (ETHR_RWMTX_W_FLG__|ETHR_RWMTX_W_WAIT_FLG__))
rwmutex_normal_rlock_wait(rwmtx, act);
#else
- long exp = 0;
+ ethr_sint32_t exp = 0;
while (1) {
- act = ethr_atomic_cmpxchg_acqb(&rwmtx->mtxb.flgs, exp+1, exp);
+ act = ethr_atomic32_cmpxchg_acqb(&rwmtx->mtxb.flgs, exp+1, exp);
if (act == exp)
break;
@@ -2469,7 +2474,7 @@ ethr_rwmutex_rlock(ethr_rwmutex *rwmtx)
void
ethr_rwmutex_runlock(ethr_rwmutex *rwmtx)
{
- long act;
+ ethr_sint32_t act;
ETHR_MTX_CHK_EXCL_IS_NOT_EXCL(&rwmtx->mtxb);
ETHR_MTX_CHK_EXCL_UNSET_NON_EXCL(&rwmtx->mtxb);
@@ -2484,7 +2489,7 @@ ethr_rwmutex_runlock(ethr_rwmutex *rwmtx)
switch (rwmtx->type) {
case ETHR_RWMUTEX_TYPE_NORMAL:
- act = ethr_atomic_dec_read_relb(&rwmtx->mtxb.flgs);
+ act = ethr_atomic32_dec_read_relb(&rwmtx->mtxb.flgs);
if ((act & ETHR_RWMTX_WAIT_FLGS__)
&& (act & ~ETHR_RWMTX_WAIT_FLGS__) == 0) {
ETHR_ASSERT((act & ETHR_RWMTX_W_FLG__) == 0);
@@ -2503,7 +2508,7 @@ ethr_rwmutex_runlock(ethr_rwmutex *rwmtx)
ETHR_MEMORY_BARRIER;
if (act == 0) {
- act = ethr_atomic_read(&rwmtx->mtxb.flgs);
+ act = ethr_atomic32_read(&rwmtx->mtxb.flgs);
if (act != ETHR_RWMTX_R_FLG__)
rwmutex_freqread_rdrs_dec_chk_wakeup(rwmtx, tse, act);
}
@@ -2521,7 +2526,7 @@ int
ethr_rwmutex_tryrwlock(ethr_rwmutex *rwmtx)
{
int res = 0;
- long act;
+ ethr_sint32_t act;
ETHR_ASSERT(!ethr_not_inited__);
ETHR_ASSERT(rwmtx);
@@ -2533,8 +2538,8 @@ ethr_rwmutex_tryrwlock(ethr_rwmutex *rwmtx)
switch (rwmtx->type) {
case ETHR_RWMUTEX_TYPE_NORMAL:
- act = ethr_atomic_cmpxchg_acqb(&rwmtx->mtxb.flgs,
- ETHR_RWMTX_W_FLG__, 0);
+ act = ethr_atomic32_cmpxchg_acqb(&rwmtx->mtxb.flgs,
+ ETHR_RWMTX_W_FLG__, 0);
if (act != 0)
res = EBUSY;
break;
@@ -2543,13 +2548,13 @@ ethr_rwmutex_tryrwlock(ethr_rwmutex *rwmtx)
case ETHR_RWMUTEX_TYPE_EXTREMELY_FREQUENT_READ:
res = 0;
- act = ethr_atomic_read(&rwmtx->mtxb.flgs);
+ act = ethr_atomic32_read(&rwmtx->mtxb.flgs);
do {
if (act == 0)
- act = ethr_atomic_cmpxchg_acqb(&rwmtx->mtxb.flgs,
- ETHR_RWMTX_W_FLG__, 0);
+ act = ethr_atomic32_cmpxchg_acqb(&rwmtx->mtxb.flgs,
+ ETHR_RWMTX_W_FLG__, 0);
else if (act == ETHR_RWMTX_R_FLG__) {
res = rwmutex_try_complete_runlock(rwmtx, act, NULL,
0, 1, 1);
@@ -2582,7 +2587,7 @@ ethr_rwmutex_tryrwlock(ethr_rwmutex *rwmtx)
void
ethr_rwmutex_rwlock(ethr_rwmutex *rwmtx)
{
- long act;
+ ethr_sint32_t act;
ETHR_ASSERT(!ethr_not_inited__);
ETHR_ASSERT(rwmtx);
ETHR_ASSERT(rwmtx->initialized == ETHR_RWMUTEX_INITIALIZED);
@@ -2593,8 +2598,8 @@ ethr_rwmutex_rwlock(ethr_rwmutex *rwmtx)
switch (rwmtx->type) {
case ETHR_RWMUTEX_TYPE_NORMAL:
- act = ethr_atomic_cmpxchg_acqb(&rwmtx->mtxb.flgs,
- ETHR_RWMTX_W_FLG__, 0);
+ act = ethr_atomic32_cmpxchg_acqb(&rwmtx->mtxb.flgs,
+ ETHR_RWMTX_W_FLG__, 0);
if (act != 0)
rwmutex_normal_rwlock_wait(rwmtx, act);
break;
@@ -2602,7 +2607,7 @@ ethr_rwmutex_rwlock(ethr_rwmutex *rwmtx)
case ETHR_RWMUTEX_TYPE_FREQUENT_READ:
case ETHR_RWMUTEX_TYPE_EXTREMELY_FREQUENT_READ:
- act = ethr_atomic_read(&rwmtx->mtxb.flgs);
+ act = ethr_atomic32_read(&rwmtx->mtxb.flgs);
do {
@@ -2611,8 +2616,8 @@ ethr_rwmutex_rwlock(ethr_rwmutex *rwmtx)
break;
}
- act = ethr_atomic_cmpxchg_acqb(&rwmtx->mtxb.flgs,
- ETHR_RWMTX_W_FLG__, 0);
+ act = ethr_atomic32_cmpxchg_acqb(&rwmtx->mtxb.flgs,
+ ETHR_RWMTX_W_FLG__, 0);
} while (act != 0);
@@ -2630,7 +2635,7 @@ ethr_rwmutex_rwlock(ethr_rwmutex *rwmtx)
void
ethr_rwmutex_rwunlock(ethr_rwmutex *rwmtx)
{
- long act;
+ ethr_sint32_t act;
ETHR_ASSERT(!ethr_not_inited__);
ETHR_ASSERT(rwmtx);
ETHR_ASSERT(rwmtx->initialized == ETHR_RWMUTEX_INITIALIZED);
@@ -2645,16 +2650,16 @@ ethr_rwmutex_rwunlock(ethr_rwmutex *rwmtx)
switch (rwmtx->type) {
case ETHR_RWMUTEX_TYPE_NORMAL:
- act = ethr_atomic_cmpxchg_relb(&rwmtx->mtxb.flgs,
- 0, ETHR_RWMTX_W_FLG__);
+ act = ethr_atomic32_cmpxchg_relb(&rwmtx->mtxb.flgs,
+ 0, ETHR_RWMTX_W_FLG__);
if (act != ETHR_RWMTX_W_FLG__)
rwmutex_unlock_wake(rwmtx, 1, act, 0);
break;
case ETHR_RWMUTEX_TYPE_FREQUENT_READ:
case ETHR_RWMUTEX_TYPE_EXTREMELY_FREQUENT_READ:
- act = ethr_atomic_cmpxchg_relb(&rwmtx->mtxb.flgs, 0,
- ETHR_RWMTX_W_FLG__);
+ act = ethr_atomic32_cmpxchg_relb(&rwmtx->mtxb.flgs, 0,
+ ETHR_RWMTX_W_FLG__);
if (act != ETHR_RWMTX_W_FLG__)
rwmutex_unlock_wake(rwmtx, 1, act, 0);
break;
@@ -2779,7 +2784,7 @@ static void
hard_debug_chk_q__(struct ethr_mutex_base_ *mtxb, int is_rwmtx)
{
int res;
- long flgs = ethr_atomic_read(&mtxb->flgs);
+ ethr_sint32_t flgs = ethr_atomic32_read(&mtxb->flgs);
ETHR_MTX_HARD_ASSERT(res == 0);
@@ -2802,12 +2807,12 @@ hard_debug_chk_q__(struct ethr_mutex_base_ *mtxb, int is_rwmtx)
tse = mtxb->q;
do {
- long type;
+ ethr_sint32_t type;
ETHR_MTX_HARD_ASSERT(tse->next->prev == tse);
ETHR_MTX_HARD_ASSERT(tse->prev->next == tse);
- type = ethr_atomic_read(&tse->uaflgs);
+ type = ethr_atomic32_read(&tse->uaflgs);
ETHR_MTX_HARD_ASSERT(type == tse->uflgs);
switch (type) {
case ETHR_RWMTX_W_WAIT_FLG__:
diff --git a/erts/lib_src/pthread/ethr_event.c b/erts/lib_src/pthread/ethr_event.c
index 6731c0eb46..9434d60d0a 100644
--- a/erts/lib_src/pthread/ethr_event.c
+++ b/erts/lib_src/pthread/ethr_event.c
@@ -24,6 +24,10 @@
#define ETHR_INLINE_FUNC_NAME_(X) X ## __
#define ETHR_EVENT_IMPL__
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
#include "ethread.h"
#if defined(ETHR_LINUX_FUTEX_IMPL__)
@@ -37,7 +41,7 @@
int
ethr_event_init(ethr_event *e)
{
- ethr_atomic_init(&e->futex, ETHR_EVENT_OFF__);
+ ethr_atomic32_init(&e->futex, ETHR_EVENT_OFF__);
return 0;
}
@@ -52,7 +56,7 @@ wait__(ethr_event *e, int spincount)
{
unsigned sc = spincount;
int res;
- long val;
+ ethr_sint32_t val;
int until_yield = ETHR_YIELD_AFTER_BUSY_LOOPS;
if (spincount < 0)
@@ -60,7 +64,7 @@ wait__(ethr_event *e, int spincount)
while (1) {
while (1) {
- val = ethr_atomic_read(&e->futex);
+ val = ethr_atomic32_read(&e->futex);
if (val == ETHR_EVENT_ON__)
return 0;
if (sc == 0)
@@ -76,16 +80,18 @@ wait__(ethr_event *e, int spincount)
}
if (val != ETHR_EVENT_OFF_WAITER__) {
- val = ethr_atomic_cmpxchg(&e->futex,
- ETHR_EVENT_OFF_WAITER__,
- ETHR_EVENT_OFF__);
+ val = ethr_atomic32_cmpxchg(&e->futex,
+ ETHR_EVENT_OFF_WAITER__,
+ ETHR_EVENT_OFF__);
if (val == ETHR_EVENT_ON__)
return 0;
ETHR_ASSERT(val == ETHR_EVENT_OFF__);
}
- res = ETHR_FUTEX__(&e->futex, ETHR_FUTEX_WAIT__, ETHR_EVENT_OFF_WAITER__);
+ res = ETHR_FUTEX__(&e->futex,
+ ETHR_FUTEX_WAIT__,
+ ETHR_EVENT_OFF_WAITER__);
if (res == EINTR)
break;
if (res != 0 && res != EWOULDBLOCK)
@@ -102,7 +108,7 @@ int
ethr_event_init(ethr_event *e)
{
int res;
- ethr_atomic_init(&e->state, ETHR_EVENT_OFF__);
+ ethr_atomic32_init(&e->state, ETHR_EVENT_OFF__);
res = pthread_mutex_init(&e->mtx, NULL);
if (res != 0)
return res;
@@ -131,7 +137,7 @@ static ETHR_INLINE int
wait__(ethr_event *e, int spincount)
{
int sc = spincount;
- long val;
+ ethr_sint32_t val;
int res, ulres;
int until_yield = ETHR_YIELD_AFTER_BUSY_LOOPS;
@@ -139,7 +145,7 @@ wait__(ethr_event *e, int spincount)
ETHR_FATAL_ERROR__(EINVAL);
while (1) {
- val = ethr_atomic_read(&e->state);
+ val = ethr_atomic32_read(&e->state);
if (val == ETHR_EVENT_ON__)
return 0;
if (sc == 0)
@@ -155,9 +161,9 @@ wait__(ethr_event *e, int spincount)
}
if (val != ETHR_EVENT_OFF_WAITER__) {
- val = ethr_atomic_cmpxchg(&e->state,
- ETHR_EVENT_OFF_WAITER__,
- ETHR_EVENT_OFF__);
+ val = ethr_atomic32_cmpxchg(&e->state,
+ ETHR_EVENT_OFF_WAITER__,
+ ETHR_EVENT_OFF__);
if (val == ETHR_EVENT_ON__)
return 0;
ETHR_ASSERT(val == ETHR_EVENT_OFF__);
@@ -172,7 +178,7 @@ wait__(ethr_event *e, int spincount)
while (1) {
- val = ethr_atomic_read(&e->state);
+ val = ethr_atomic32_read(&e->state);
if (val == ETHR_EVENT_ON__)
break;
diff --git a/erts/lib_src/pthread/ethread.c b/erts/lib_src/pthread/ethread.c
index ea1d9d43f0..f047104103 100644
--- a/erts/lib_src/pthread/ethread.c
+++ b/erts/lib_src/pthread/ethread.c
@@ -72,7 +72,7 @@ static void thr_exit_cleanup(void)
/* Argument passed to thr_wrapper() */
typedef struct {
- ethr_atomic_t result;
+ ethr_atomic32_t result;
ethr_ts_event *tse;
void *(*thr_func)(void *);
void *arg;
@@ -81,14 +81,14 @@ typedef struct {
static void *thr_wrapper(void *vtwd)
{
- long result;
+ ethr_sint32_t result;
void *res;
ethr_thr_wrap_data__ *twd = (ethr_thr_wrap_data__ *) vtwd;
void *(*thr_func)(void *) = twd->thr_func;
void *arg = twd->arg;
ethr_ts_event *tsep = NULL;
- result = (long) ethr_make_ts_event__(&tsep);
+ result = (ethr_sint32_t) ethr_make_ts_event__(&tsep);
if (result == 0) {
tsep->iflgs |= ETHR_TS_EV_ETHREAD;
@@ -99,7 +99,7 @@ static void *thr_wrapper(void *vtwd)
tsep = twd->tse; /* We aren't allowed to follow twd after
result has been set! */
- ethr_atomic_set(&twd->result, result);
+ ethr_atomic32_set(&twd->result, result);
ethr_event_set(&tsep->event);
@@ -191,7 +191,7 @@ ethr_thr_create(ethr_tid *tid, void * (*func)(void *), void *arg,
}
#endif
- ethr_atomic_init(&twd.result, -1);
+ ethr_atomic32_init(&twd.result, (ethr_sint32_t) -1);
twd.tse = ethr_get_ts_event();
twd.thr_func = func;
twd.arg = arg;
@@ -252,10 +252,10 @@ ethr_thr_create(ethr_tid *tid, void * (*func)(void *), void *arg,
/* Wait for child to initialize... */
while (1) {
- long result;
+ ethr_sint32_t result;
ethr_event_reset(&twd.tse->event);
- result = ethr_atomic_read(&twd.result);
+ result = ethr_atomic32_read(&twd.result);
if (result == 0)
break;
@@ -349,32 +349,6 @@ ethr_leave_ts_event(ethr_ts_event *tsep)
}
/*
- * Current time
- */
-
-int
-ethr_time_now(ethr_timeval *time)
-{
- int res;
- struct timeval tv;
-#if ETHR_XCHK
- if (ethr_not_inited__) {
- ETHR_ASSERT(0);
- return EACCES;
- }
- if (!time) {
- ETHR_ASSERT(0);
- return EINVAL;
- }
-#endif
-
- res = gettimeofday(&tv, NULL);
- time->tv_sec = (long) tv.tv_sec;
- time->tv_nsec = ((long) tv.tv_usec)*1000;
- return res;
-}
-
-/*
* Thread specific data
*/
diff --git a/erts/lib_src/win/ethr_event.c b/erts/lib_src/win/ethr_event.c
index ddb4780ff1..68f093f49c 100644
--- a/erts/lib_src/win/ethr_event.c
+++ b/erts/lib_src/win/ethr_event.c
@@ -28,6 +28,9 @@
/* --- Windows implementation of thread events ------------------------------ */
+#pragma intrinsic(_InterlockedExchangeAdd)
+#pragma intrinsic(_InterlockedCompareExchange)
+
int
ethr_event_init(ethr_event *e)
{
@@ -72,10 +75,10 @@ wait(ethr_event *e, int spincount)
while (1) {
long on;
while (1) {
-#if ETHR_IMMED_ATOMIC_SET_GET_SAFE__
+#if ETHR_READ_AND_SET_WITHOUT_INTERLOCKED_OP__
state = e->state;
#else
- state = InterlockedExchangeAdd(&e->state, (LONG) 0);
+ state = _InterlockedExchangeAdd(&e->state, (LONG) 0);
#endif
if (state == ETHR_EVENT_ON__)
return 0;
diff --git a/erts/lib_src/win/ethread.c b/erts/lib_src/win/ethread.c
index 69523edf94..789a360b11 100644
--- a/erts/lib_src/win/ethread.c
+++ b/erts/lib_src/win/ethread.c
@@ -49,7 +49,7 @@
/* Argument passed to thr_wrapper() */
typedef struct {
ethr_tid *tid;
- ethr_atomic_t result;
+ ethr_atomic32_t result;
ethr_ts_event *tse;
void *(*thr_func)(void *);
void *arg;
@@ -93,20 +93,20 @@ static void thr_exit_cleanup(ethr_tid *tid, void *res)
static unsigned __stdcall thr_wrapper(LPVOID vtwd)
{
ethr_tid my_tid;
- long result;
+ ethr_sint32_t result;
void *res;
ethr_thr_wrap_data__ *twd = (ethr_thr_wrap_data__ *) vtwd;
void *(*thr_func)(void *) = twd->thr_func;
void *arg = twd->arg;
ethr_ts_event *tsep = NULL;
- result = (long) ethr_make_ts_event__(&tsep);
+ result = (ethr_sint32_t) ethr_make_ts_event__(&tsep);
if (result == 0) {
tsep->iflgs |= ETHR_TS_EV_ETHREAD;
my_tid = *twd->tid;
if (!TlsSetValue(own_tid_key, (LPVOID) &my_tid)) {
- result = (long) ethr_win_get_errno__();
+ result = (ethr_sint32_t) ethr_win_get_errno__();
ethr_free_ts_event__(tsep);
}
else {
@@ -118,7 +118,7 @@ static unsigned __stdcall thr_wrapper(LPVOID vtwd)
tsep = twd->tse; /* We aren't allowed to follow twd after
result has been set! */
- ethr_atomic_set(&twd->result, result);
+ ethr_atomic32_set(&twd->result, result);
ethr_event_set(&tsep->event);
@@ -128,28 +128,6 @@ static unsigned __stdcall thr_wrapper(LPVOID vtwd)
return 0;
}
-#ifdef __GNUC__
-#define LL_LITERAL(X) X##LL
-#else
-#define LL_LITERAL(X) X##i64
-#endif
-
-#define EPOCH_JULIAN_DIFF LL_LITERAL(11644473600)
-
-static ETHR_INLINE void
-get_curr_time(long *sec, long *nsec)
-{
- SYSTEMTIME t;
- FILETIME ft;
- LONGLONG lft;
-
- GetSystemTime(&t);
- SystemTimeToFileTime(&t, &ft);
- memcpy(&lft, &ft, sizeof(lft));
- *nsec = ((long) (lft % LL_LITERAL(10000000)))*100;
- *sec = (long) ((lft / LL_LITERAL(10000000)) - EPOCH_JULIAN_DIFF);
-}
-
/* internal exports */
int
@@ -320,7 +298,7 @@ ethr_thr_create(ethr_tid *tid, void * (*func)(void *), void *arg,
ETHR_PAGE_ALIGN(ETHR_KW2B(suggested_stack_size));
}
- ethr_atomic_init(&twd.result, -1);
+ ethr_atomic32_init(&twd.result, -1);
twd.tid = tid;
twd.thr_func = func;
@@ -352,11 +330,11 @@ ethr_thr_create(ethr_tid *tid, void * (*func)(void *), void *arg,
/* Wait for child to initialize... */
while (1) {
- long result;
+ ethr_sint32_t result;
int err;
ethr_event_reset(&twd.tse->event);
- result = ethr_atomic_read(&twd.result);
+ result = ethr_atomic32_read(&twd.result);
if (result == 0)
break;
@@ -517,23 +495,6 @@ ethr_equal_tids(ethr_tid tid1, ethr_tid tid2)
return tid1.id == tid2.id && tid1.id != ETHR_INVALID_TID_ID;
}
-int
-ethr_time_now(ethr_timeval *time)
-{
-#if ETHR_XCHK
- if (ethr_not_inited__) {
- ETHR_ASSERT(0);
- return EACCES;
- }
- if (!time) {
- ETHR_ASSERT(0);
- return EINVAL;
- }
-#endif
- get_curr_time(&time->tv_sec, &time->tv_nsec);
- return 0;
-}
-
/*
* Thread specific data
*/
diff --git a/erts/preloaded/ebin/erl_prim_loader.beam b/erts/preloaded/ebin/erl_prim_loader.beam
index 87ff5119fd..bff3f7f9de 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 6b0d96ff8e..5d2f187435 100644
--- a/erts/preloaded/ebin/erlang.beam
+++ b/erts/preloaded/ebin/erlang.beam
Binary files differ
diff --git a/erts/preloaded/ebin/init.beam b/erts/preloaded/ebin/init.beam
index 8a7a9a1314..7e492057da 100644
--- a/erts/preloaded/ebin/init.beam
+++ b/erts/preloaded/ebin/init.beam
Binary files differ
diff --git a/erts/preloaded/ebin/otp_ring0.beam b/erts/preloaded/ebin/otp_ring0.beam
index 5d544ff4aa..c443866671 100644
--- a/erts/preloaded/ebin/otp_ring0.beam
+++ b/erts/preloaded/ebin/otp_ring0.beam
Binary files differ
diff --git a/erts/preloaded/ebin/prim_file.beam b/erts/preloaded/ebin/prim_file.beam
index 3ed02ecd44..bfb1e48365 100644
--- a/erts/preloaded/ebin/prim_file.beam
+++ b/erts/preloaded/ebin/prim_file.beam
Binary files differ
diff --git a/erts/preloaded/ebin/prim_inet.beam b/erts/preloaded/ebin/prim_inet.beam
index 79a8d22366..30bbfb0943 100644
--- a/erts/preloaded/ebin/prim_inet.beam
+++ b/erts/preloaded/ebin/prim_inet.beam
Binary files differ
diff --git a/erts/preloaded/ebin/prim_zip.beam b/erts/preloaded/ebin/prim_zip.beam
index 3cc8c6b8be..6681466767 100644
--- a/erts/preloaded/ebin/prim_zip.beam
+++ b/erts/preloaded/ebin/prim_zip.beam
Binary files differ
diff --git a/erts/preloaded/ebin/zlib.beam b/erts/preloaded/ebin/zlib.beam
index 3f9e867542..593bb8dbed 100644
--- a/erts/preloaded/ebin/zlib.beam
+++ b/erts/preloaded/ebin/zlib.beam
Binary files differ
diff --git a/erts/preloaded/src/erlang.erl b/erts/preloaded/src/erlang.erl
index 935c2de253..4679a916c7 100644
--- a/erts/preloaded/src/erlang.erl
+++ b/erts/preloaded/src/erlang.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -427,17 +427,11 @@ delay_trap(Result, Timeout) -> receive after Timeout -> Result end.
%% have to reflect that, which we cannot forsee.
%%
set_cookie(Node, C) when Node =/= nonode@nohost, is_atom(Node) ->
- Res = case C of
- _ when is_atom(C) ->
- auth:set_cookie(Node, C);
- {CI,CO} when is_atom(CI), is_atom(CO) ->
- auth:set_cookie(Node, {CI, CO});
- _ ->
- error
- end,
- case Res of
- error -> exit(badarg);
- Other -> Other
+ case is_atom(C) of
+ true ->
+ auth:set_cookie(Node, C);
+ false ->
+ error(badarg)
end.
-spec get_cookie() -> atom().
diff --git a/erts/preloaded/src/prim_file.erl b/erts/preloaded/src/prim_file.erl
index 10be852e92..13e8e8fb5b 100644
--- a/erts/preloaded/src/prim_file.erl
+++ b/erts/preloaded/src/prim_file.erl
@@ -64,7 +64,7 @@
-include("file.hrl").
-define(DRV, efile).
--define(FD_DRV, efile).
+-define(FD_DRV, "efile").
-define(LARGEFILESIZE, (1 bsl 63)).
@@ -506,7 +506,7 @@ read_file(_) ->
%% Takes a Port opened with open/1.
read_file(Port, File) when is_port(Port),
- (is_list(File) orelse is_binary(File))->
+ (is_list(File) orelse is_binary(File)) ->
Cmd = [?FILE_READ_FILE | pathname(File)],
case drv_command(Port, Cmd) of
{error, enomem} ->
@@ -832,7 +832,7 @@ drv_open(Driver, Portopts) ->
{ok, Port}
catch
error:Reason ->
- {error,Reason}
+ {error, Reason}
end.
@@ -864,9 +864,9 @@ drv_command(Port, Command) ->
drv_command(Port, Command, R) when is_binary(Command) ->
drv_command(Port, Command, true, R);
drv_command(Port, Command, R) ->
- try erlang:iolist_to_binary(Command) of
- Bin ->
- drv_command(Port, Bin, true, R)
+ try erlang:iolist_size(Command) of
+ _ ->
+ drv_command(Port, Command, true, R)
catch
error:Reason ->
{error, Reason}
@@ -1041,8 +1041,8 @@ translate_response(?FILE_RESP_NUMBER, List) ->
{N, []} = get_uint64(List),
{ok, N};
translate_response(?FILE_RESP_DATA, List) ->
- {N, Data} = get_uint64(List),
- {ok, {N, Data}};
+ {_N, _Data} = ND = get_uint64(List),
+ {ok, ND};
translate_response(?FILE_RESP_INFO, List) when is_list(List) ->
{ok, transform_info_ints(get_uint32s(List))};
translate_response(?FILE_RESP_NUMERR, L0) ->
@@ -1087,10 +1087,8 @@ translate_response(?FILE_RESP_FNAME, Data) when is_binary(Data) ->
{ok, prim_file:internal_native2name(Data)};
translate_response(?FILE_RESP_FNAME, Data) ->
{ok, Data};
-
translate_response(?FILE_RESP_ALL_DATA, Data) ->
{ok, Data};
-
translate_response(X, Data) ->
{error, {bad_response_from_port, [X | Data]}}.
@@ -1137,14 +1135,14 @@ date_to_bytes(undefined) ->
date_to_bytes({{Y, Mon, D}, {H, Min, S}}) ->
<<Y:32, Mon:32, D:32, H:32, Min:32, S:32>>.
-% uint64([[X1, X2, X3, X4] = Y1 | [X5, X6, X7, X8] = Y2]) ->
-% (uint32(Y1) bsl 32) bor uint32(Y2).
+%% uint64([[X1, X2, X3, X4] = Y1 | [X5, X6, X7, X8] = Y2]) ->
+%% (uint32(Y1) bsl 32) bor uint32(Y2).
-% uint64(X1, X2, X3, X4, X5, X6, X7, X8) ->
-% (uint32(X1, X2, X3, X4) bsl 32) bor uint32(X5, X6, X7, X8).
+%% uint64(X1, X2, X3, X4, X5, X6, X7, X8) ->
+%% (uint32(X1, X2, X3, X4) bsl 32) bor uint32(X5, X6, X7, X8).
-% uint32([X1,X2,X3,X4]) ->
-% (X1 bsl 24) bor (X2 bsl 16) bor (X3 bsl 8) bor X4.
+%% uint32([X1,X2,X3,X4]) ->
+%% (X1 bsl 24) bor (X2 bsl 16) bor (X3 bsl 8) bor X4.
uint32(X1,X2,X3,X4) ->
(X1 bsl 24) bor (X2 bsl 16) bor (X3 bsl 8) bor X4.
diff --git a/erts/preloaded/src/prim_inet.erl b/erts/preloaded/src/prim_inet.erl
index 446656e45f..8f2e845b4f 100644
--- a/erts/preloaded/src/prim_inet.erl
+++ b/erts/preloaded/src/prim_inet.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -1518,7 +1518,7 @@ enc_value_2(addr, {IP,Port}) when tuple_size(IP) =:= 4 ->
[?INET_AF_INET,?int16(Port)|ip4_to_bytes(IP)];
enc_value_2(addr, {IP,Port}) when tuple_size(IP) =:= 8 ->
[?INET_AF_INET6,?int16(Port)|ip6_to_bytes(IP)];
-enc_value_2(ether, [X1,X2,X3,X4,X5,X6]) -> [X1,X2,X3,X4,X5,X6];
+enc_value_2(ether, [_,_,_,_,_,_]=Xs) -> Xs;
enc_value_2(sockaddr, any) ->
[?INET_AF_ANY];
enc_value_2(sockaddr, loopback) ->
@@ -1572,7 +1572,7 @@ dec_value(time, [X3,X2,X1,X0|T]) ->
Val -> {Val, T}
end;
dec_value(ip, [A,B,C,D|T]) -> {{A,B,C,D}, T};
-dec_value(ether,[X1,X2,X3,X4,X5,X6|T]) -> {[X1,X2,X3,X4,X5,X6],T};
+%% dec_value(ether, [X1,X2,X3,X4,X5,X6|T]) -> {[X1,X2,X3,X4,X5,X6],T};
dec_value(sockaddr, [X|T]) ->
get_ip(X, T);
dec_value(linkaddr, [X1,X0|T]) ->
diff --git a/erts/test/Makefile b/erts/test/Makefile
index 94458da019..68be3f2178 100644
--- a/erts/test/Makefile
+++ b/erts/test/Makefile
@@ -89,7 +89,7 @@ release_tests_spec: opt
$(INSTALL_DIR) $(RELSYSDIR)
$(INSTALL_DATA) system.spec system.dynspec system.spec.vxworks \
$(ERL_FILES) $(TARGET_FILES) $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
tar cf - *_SUITE_data utils | (cd $(RELSYSDIR); tar xf -)
release_docs_spec:
diff --git a/erts/test/autoimport_SUITE.erl b/erts/test/autoimport_SUITE.erl
index 2430dac78d..0e4708e046 100644
--- a/erts/test/autoimport_SUITE.erl
+++ b/erts/test/autoimport_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -20,16 +20,38 @@
-module(autoimport_SUITE).
-include_lib("test_server/include/test_server.hrl").
--export([all/1,init_per_testcase/2,fin_per_testcase/2,autoimports/1]).
+-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,
+ autoimports/1]).
-define(TEST_TIMEOUT, ?t:seconds(180)).
-all(suite) -> [autoimports].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [autoimports].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Func, Config) ->
Dog = test_server:timetrap(?TEST_TIMEOUT),
[{watchdog, Dog} | Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog = ?config(watchdog, Config),
catch test_server:timetrap_cancel(Dog),
ok.
diff --git a/erts/test/erl_print_SUITE.erl b/erts/test/erl_print_SUITE.erl
index 3bb7d4d016..ee1a200530 100644
--- a/erts/test/erl_print_SUITE.erl
+++ b/erts/test/erl_print_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -32,14 +32,35 @@
-define(DEFAULT_TIMEOUT, ?t:minutes(10)).
--export([all/1, init_per_testcase/2, fin_per_testcase/2]).
+-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, fin_per_testcase/2]).
--export([erlang_display/1, integer/1, float/1, string/1, character/1, snprintf/1, quote/1]).
+-export([erlang_display/1, integer/1, float/1,
+ string/1, character/1, snprintf/1, quote/1]).
-include_lib("test_server/include/test_server.hrl").
-
-all(doc) -> [];
-all(suite) -> test_cases().
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ test_cases().
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%
%%
@@ -47,14 +68,9 @@ all(suite) -> test_cases().
%%
%%
-test_cases() ->
- [erlang_display,
- integer,
- float,
- string,
- character,
- snprintf,
- quote].
+test_cases() ->
+ [erlang_display, integer, float, string, character,
+ snprintf, quote].
erlang_display(doc) -> [];
erlang_display(suite) -> [];
diff --git a/erts/test/erlc_SUITE.erl b/erts/test/erlc_SUITE.erl
index 4797f78be2..62e0e6813d 100644
--- a/erts/test/erlc_SUITE.erl
+++ b/erts/test/erlc_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -20,15 +20,34 @@
%% Tests the erlc command by compiling various types of files.
--export([all/1, compile_erl/1, compile_yecc/1, compile_script/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, compile_erl/1,
+ compile_yecc/1, compile_script/1,
compile_mib/1, good_citizen/1, deep_cwd/1, arg_overflow/1]).
-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[compile_erl, compile_yecc, compile_script, compile_mib,
good_citizen, deep_cwd, arg_overflow].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% Copy from erlc_SUITE_data/include/erl_test.hrl.
-record(person, {name, shoe_size}).
diff --git a/erts/test/erlexec_SUITE.erl b/erts/test/erlexec_SUITE.erl
index 6adb865f6d..0dfe6c2e5f 100644
--- a/erts/test/erlexec_SUITE.erl
+++ b/erts/test/erlexec_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -31,7 +31,9 @@
-define(DEFAULT_TIMEOUT, ?t:minutes(1)).
--export([all/1, init_per_testcase/2, fin_per_testcase/2]).
+-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([args_file/1, evil_args_file/1, env/1, args_file_env/1, otp_7461/1, otp_7461_remote/1, otp_8209/1, zdbbl_dist_buf_busy_limit/1]).
@@ -43,7 +45,7 @@ init_per_testcase(Case, Config) ->
SavedEnv = save_env(),
[{testcase, Case}, {watchdog, Dog}, {erl_flags_env, SavedEnv} |Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
SavedEnv = ?config(erl_flags_env, Config),
restore_env(SavedEnv),
@@ -51,11 +53,26 @@ fin_per_testcase(_Case, Config) ->
?t:timetrap_cancel(Dog),
ok.
-all(doc) -> [];
-all(suite) ->
- [args_file, evil_args_file, env, args_file_env, otp_7461, otp_8209,
- zdbbl_dist_buf_busy_limit].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+all() ->
+ [args_file, evil_args_file, env, args_file_env,
+ otp_7461, otp_8209, zdbbl_dist_buf_busy_limit].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
otp_8209(doc) ->
["Test that plain first argument does not "
diff --git a/erts/test/ethread_SUITE.erl b/erts/test/ethread_SUITE.erl
index 93e27fa8d3..71d8c1c679 100644
--- a/erts/test/ethread_SUITE.erl
+++ b/erts/test/ethread_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -31,13 +31,14 @@
-define(DEFAULT_TIMEOUT, ?t:minutes(10)).
--export([all/1, init_per_testcase/2, fin_per_testcase/2]).
+-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, fin_per_testcase/2]).
-export([create_join_thread/1,
equal_tids/1,
mutex/1,
try_lock_mutex/1,
- time_now/1,
cond_wait/1,
broadcast/1,
detached_thread/1,
@@ -50,25 +51,30 @@
-include_lib("test_server/include/test_server.hrl").
-tests() ->
- [create_join_thread,
- equal_tids,
- mutex,
- try_lock_mutex,
- time_now,
- cond_wait,
- broadcast,
- detached_thread,
- max_threads,
- tsd,
- spinlock,
- rwspinlock,
- rwmutex,
- atomic].
-
-all(doc) -> [];
-all(suite) -> tests().
+tests() ->
+ [create_join_thread, equal_tids, mutex, try_lock_mutex,
+ cond_wait, broadcast, detached_thread,
+ max_threads, tsd, spinlock, rwspinlock, rwmutex, atomic].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ tests().
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
%%
%%
@@ -104,17 +110,6 @@ try_lock_mutex(suite) ->
try_lock_mutex(Config) ->
run_case(Config, "try_lock_mutex", "").
-time_now(doc) ->
- ["Tests ethr_time_now by comparing time values with Erlang."];
-time_now(suite) ->
- [];
-time_now(Config) ->
- run_case(Config, "time_now", "", fun (P) ->
- spawn_link(fun () ->
- watchdog(P)
- end)
- end).
-
wd_dispatch(P) ->
receive
bye ->
diff --git a/erts/test/ethread_SUITE_data/ethread_tests.c b/erts/test/ethread_SUITE_data/ethread_tests.c
index 7fc71d8047..0b59ff5aa6 100644
--- a/erts/test/ethread_SUITE_data/ethread_tests.c
+++ b/erts/test/ethread_SUITE_data/ethread_tests.c
@@ -514,69 +514,6 @@ try_lock_mutex_test(void)
}
/*
- * The time now test.
- *
- * Tests ethr_time_now by comparing time values with Erlang.
- */
-#define TNT_MAX_TIME_DIFF 200000
-#define TNT_MAX_TIME_VALUES 52
-
-static void
-time_now_test(void)
-{
- int scanf_res, time_now_res, i, no_values, max_abs_diff;
- static ethr_timeval tv[TNT_MAX_TIME_VALUES];
- static int ms[TNT_MAX_TIME_VALUES];
-
- i = 0;
- do {
- ASSERT(i < TNT_MAX_TIME_VALUES);
- scanf_res = scanf("%d", &ms[i]);
- time_now_res = ethr_time_now(&tv[i]);
- ASSERT(scanf_res == 1);
- ASSERT(time_now_res == 0);
-#if 0
- print_line("Got %d; %ld:%ld", ms[i], tv[i].tv_sec, tv[i].tv_nsec);
-#endif
- i++;
- } while (ms[i-1] >= 0);
-
- no_values = i-1;
-
- ASSERT(ms[0] == 0);
-
- print_line("TNT_MAX_TIME_DIFF = %d (us)", TNT_MAX_TIME_DIFF);
-
- max_abs_diff = 0;
-
- for (i = 1; i < no_values; i++) {
- long diff;
- long tn_us;
- long e_us;
-
- tn_us = (tv[i].tv_sec - tv[0].tv_sec) * 1000000;
- tn_us += (tv[i].tv_nsec - tv[0].tv_nsec)/1000;
-
- e_us = ms[i]*1000;
-
- diff = e_us - tn_us;
-
- print_line("Erlang time = %ld us; ethr_time_now = %ld us; diff %ld us",
- e_us, tn_us, diff);
-
- if (max_abs_diff < abs((int) diff)) {
- max_abs_diff = abs((int) diff);
- }
-
- ASSERT(e_us - TNT_MAX_TIME_DIFF <= tn_us);
- ASSERT(tn_us <= e_us + TNT_MAX_TIME_DIFF);
- }
-
- print_line("Max absolute diff = %d us", max_abs_diff);
- succeed("Max absolute diff = %d us", max_abs_diff);
-}
-
-/*
* The cond wait test case.
*
* Tests ethr_cond_wait with ethr_cond_signal and ethr_cond_broadcast.
@@ -1538,8 +1475,6 @@ main(int argc, char *argv[])
mutex_test();
else if (strcmp(testcase, "try_lock_mutex") == 0)
try_lock_mutex_test();
- else if (strcmp(testcase, "time_now") == 0)
- time_now_test();
else if (strcmp(testcase, "cond_wait") == 0)
cond_wait_test();
else if (strcmp(testcase, "broadcast") == 0)
diff --git a/erts/test/install_SUITE.erl b/erts/test/install_SUITE.erl
index e14790bc1b..214031a6fe 100644
--- a/erts/test/install_SUITE.erl
+++ b/erts/test/install_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2011. 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
@@ -29,8 +29,9 @@
%-define(line_trace, 1).
--export([all/1, init_per_suite/1, end_per_suite/1,
- init_per_testcase/2, fin_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_suite/1, end_per_suite/1,
+ init_per_testcase/2, end_per_testcase/2]).
-export([bin_default/1,
bin_default_dirty/1,
@@ -64,27 +65,32 @@
erlang_bindir = "",
bindir_symlinks = ""}).
-need_symlink_cases() ->
- [bin_unreachable_absolute,
- bin_unreachable_relative,
- bin_same_dir,
- bin_ok_symlink,
- bin_dirname_fail,
+need_symlink_cases() ->
+ [bin_unreachable_absolute, bin_unreachable_relative,
+ bin_same_dir, bin_ok_symlink, bin_dirname_fail,
bin_no_use_dirname_fail].
-dont_need_symlink_cases() ->
- [bin_default,
- bin_default_dirty,
- bin_outside_eprfx,
- bin_outside_eprfx_dirty,
- bin_not_abs,
- bin_unreasonable_path,
- 'bin white space',
+dont_need_symlink_cases() ->
+ [bin_default, bin_default_dirty, bin_outside_eprfx,
+ bin_outside_eprfx_dirty, bin_not_abs,
+ bin_unreasonable_path, 'bin white space',
bin_no_srcfile].
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
dont_need_symlink_cases() ++ need_symlink_cases().
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%
%% The test cases
%%
@@ -585,7 +591,7 @@ init_per_testcase_aux(true, _OsType, Case, Config) ->
{test_dir, make_dirs(?config(priv_dir, Config), atom_to_list(Case))}
| Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
diff --git a/erts/test/nt_SUITE.erl b/erts/test/nt_SUITE.erl
index 530fb55270..7d6da28ad6 100644
--- a/erts/test/nt_SUITE.erl
+++ b/erts/test/nt_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -22,7 +22,9 @@
-include_lib("test_server/include/test_server.hrl").
-include_lib("kernel/include/file.hrl").
--export([all/1,init_per_testcase/2,fin_per_testcase/2,nt/1,handle_eventlog/2,
+-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,nt/1,handle_eventlog/2,
middleman/1,service_basic/1, service_env/1, user_env/1, synced/1,
service_prio/1,
logout/1, debug/1, restart/1, restart_always/1,stopaction/1,
@@ -31,20 +33,38 @@
-define(TEST_SERVICES, [1,2,3,4,5,6,7,8,9,10,11]).
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
case os:type() of
- {win32,nt} ->
- [nt, service_basic, service_env, user_env, synced, service_prio,
- logout, debug,
- restart, restart_always, stopaction];
- _ -> [nt] %%% Just to give a little hint why they are skipped...
+ {win32, nt} ->
+ [nt, service_basic, service_env, user_env, synced,
+ service_prio, logout, debug, restart, restart_always,
+ stopaction];
+ _ -> [nt]
end.
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
init_per_testcase(_Func, Config) ->
Dog = test_server:timetrap(?TEST_TIMEOUT),
[{watchdog, Dog} | Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
lists:foreach(fun(X) ->
catch remove_service("test_service_" ++
integer_to_list(X)) end,
diff --git a/erts/test/otp_SUITE.erl b/erts/test/otp_SUITE.erl
index 425ad31782..d61fbbddcf 100644
--- a/erts/test/otp_SUITE.erl
+++ b/erts/test/otp_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -19,7 +19,8 @@
-module(otp_SUITE).
--export([all/1,init_per_suite/1,end_per_suite/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_suite/1,end_per_suite/1]).
-export([undefined_functions/1,deprecated_not_in_obsolete/1,
obsolete_but_not_deprecated/1,call_to_deprecated/1,
call_to_size_1/1,strong_components/1]).
@@ -28,10 +29,22 @@
-import(lists, [filter/2,foldl/3,foreach/2]).
-all(suite) ->
- [undefined_functions,deprecated_not_in_obsolete,
- obsolete_but_not_deprecated,call_to_deprecated,
- call_to_size_1,strong_components].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [undefined_functions, deprecated_not_in_obsolete,
+ obsolete_but_not_deprecated, call_to_deprecated,
+ call_to_size_1, strong_components].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_suite(Config) ->
Dog = test_server:timetrap(?t:minutes(10)),
diff --git a/erts/test/run_erl_SUITE.erl b/erts/test/run_erl_SUITE.erl
index efeafbad8c..6350dc47dd 100644
--- a/erts/test/run_erl_SUITE.erl
+++ b/erts/test/run_erl_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -19,7 +19,9 @@
-module(run_erl_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
basic/1,heavy/1,heavier/1,defunct/1]).
-export([ping_me_back/1]).
@@ -29,13 +31,31 @@ init_per_testcase(_Case, Config) ->
Dog = ?t:timetrap(?t:minutes(2)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-all(suite) ->
- [basic,heavy,heavier,defunct].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [basic, heavy, heavier, defunct].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
basic(Config) when is_list(Config) ->
case os:type() of
diff --git a/erts/test/system.spec b/erts/test/system.spec
index 9bfe2dbcf8..e0561ba0b2 100644
--- a/erts/test/system.spec
+++ b/erts/test/system.spec
@@ -1 +1 @@
-{topcase, {dir, "../system_test"}}.
+{suites,"../system_test",all}.
diff --git a/erts/test/z_SUITE.erl b/erts/test/z_SUITE.erl
index 9f13a7083d..8fceab32a6 100644
--- a/erts/test/z_SUITE.erl
+++ b/erts/test/z_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -35,26 +35,45 @@
-define(DEFAULT_TIMEOUT, ?t:minutes(5)).
--export([all/1, init_per_testcase/2, fin_per_testcase/2]).
+-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([search_for_core_files/1, core_files/1]).
--include_lib("test_server/include/test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
init_per_testcase(Case, Config) ->
Dog = ?t:timetrap(?DEFAULT_TIMEOUT),
[{testcase, Case}, {watchdog, Dog} |Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-all(doc) -> [];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[core_files].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
core_files(doc) ->
[];
diff --git a/erts/vsn.mk b/erts/vsn.mk
index 8a1590e74c..193a914a70 100644
--- a/erts/vsn.mk
+++ b/erts/vsn.mk
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2010. All Rights Reserved.
+# Copyright Ericsson AB 1997-2011. 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
@@ -17,8 +17,8 @@
# %CopyrightEnd%
#
-VSN = 5.8.3
-SYSTEM_VSN = R14B02
+VSN = 5.8.4
+SYSTEM_VSN = R14B03
# Port number 4365 in 4.2
# Port number 4366 in 4.3
diff --git a/lib/.gitignore b/lib/.gitignore
index 340baf5269..56b1ed2b84 100644
--- a/lib/.gitignore
+++ b/lib/.gitignore
@@ -531,6 +531,10 @@
/percept/doc/src/percept_profile.xml
/percept/doc/src/percept_ug.xml
+# snmp
+
+snmp/doc/intex.html
+
# syntax_tools
/syntax_tools/doc/src/chapter.xml
diff --git a/lib/Makefile b/lib/Makefile
index f5ffc6f166..5faf0c8714 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2010. All Rights Reserved.
+# Copyright Ericsson AB 1996-2011. 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
@@ -51,7 +51,7 @@ else
# --------------
#
ERTS_SUB_DIRECTORIES = stdlib sasl kernel compiler
- OTHER_SUB_DIRECTORIES = tools test_server
+ OTHER_SUB_DIRECTORIES = tools test_server common_test runtime_tools
ifdef BUILD_ALL
ifeq ($(findstring win32,$(TARGET)),win32) # BUILD_ALL on win32
OTHER_SUB_DIRECTORIES += \
diff --git a/lib/appmon/doc/src/appmon.xml b/lib/appmon/doc/src/appmon.xml
index 1acb1eb6fa..ae6147a387 100644
--- a/lib/appmon/doc/src/appmon.xml
+++ b/lib/appmon/doc/src/appmon.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1996</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/asn1/doc/src/notes.xml b/lib/asn1/doc/src/notes.xml
index c93adeffe2..77769afcd4 100644
--- a/lib/asn1/doc/src/notes.xml
+++ b/lib/asn1/doc/src/notes.xml
@@ -31,6 +31,44 @@
<p>This document describes the changes made to the asn1 application.</p>
+<section><title>Asn1 1.6.16</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ asn1ct: Make formatting of errors and warnings consistent</p>
+ <p>
+ Consistently format warning and error reports. Warning
+ and error options from erlc now also work in asnc1ct.
+ (thanks to Tuncer Ayaz)</p>
+ <p>
+ Own Id: OTP-9062</p>
+ </item>
+ <item>
+ <p>
+ Shut off some dialyzer warnings</p>
+ <p>
+ Own Id: OTP-9063</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Crash in asn1ct_check, componentrelation_leadingattr
+ fixed. (Thanks to Stephane Pamelard for finding the bug)</p>
+ <p>
+ Own Id: OTP-9092</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Asn1 1.6.15</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/asn1/src/asn1ct.erl b/lib/asn1/src/asn1ct.erl
index 968468cb7f..a167d27f82 100644
--- a/lib/asn1/src/asn1ct.erl
+++ b/lib/asn1/src/asn1ct.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -39,7 +39,7 @@
add_tobe_refed_func/1,add_generated_refed_func/1,
maybe_rename_function/3,latest_sindex/0,current_sindex/0,
set_current_sindex/1,next_sindex/0,maybe_saved_sindex/2,
- parse_and_save/2,report_verbose/3]).
+ parse_and_save/2,verbose/3,warning/3,error/3]).
-include("asn1_records.hrl").
-include_lib("stdlib/include/erl_compile.hrl").
@@ -103,8 +103,8 @@ compile(File,Options) when is_list(Options) ->
compile1(File,Options) when is_list(Options) ->
- report_verbose("Erlang ASN.1 version ~p compiling ~p ~n",[?vsn,File],Options),
- report_verbose("Compiler Options: ~p~n",[Options],Options),
+ verbose("Erlang ASN.1 version ~p compiling ~p ~n",[?vsn,File],Options),
+ verbose("Compiler Options: ~p~n",[Options],Options),
Ext = filename:extension(File),
Base = filename:basename(File,Ext),
OutFile = outfile(Base,"",Options),
@@ -149,17 +149,17 @@ compile1(File,Options) when is_list(Options) ->
inline(true,Name,Module,Options) ->
RTmodule = get_runtime_mod(Options),
IgorOptions = igorify_options(remove_asn_flags(Options)),
- IgorName = filename:rootname(filename:basename(Name)),
+ IgorName = list_to_atom(filename:rootname(filename:basename(Name))),
% io:format("*****~nName: ~p~nModules: ~p~nIgorOptions: ~p~n*****~n",
% [IgorName,Modules++RTmodule,IgorOptions]),
- report_verbose("Inlining modules: ~p in ~p~n",[[Module]++RTmodule,IgorName],Options),
+ verbose("Inlining modules: ~p in ~p~n",[[Module]++RTmodule,IgorName],Options),
case catch igor:merge(IgorName,[Module]++RTmodule,[{preprocess,true},{stubs,false},{backups,false}]++IgorOptions) of
{'EXIT',{undef,Reason}} -> %% module igor first in R10B
- io:format("Module igor in syntax_tools must be available:~n~p~n",
- [Reason]),
+ error("Module igor in syntax_tools must be available:~n~p~n",
+ [Reason],Options),
{error,'no_compilation'};
{'EXIT',Reason} ->
- io:format("Merge by igor module failed due to ~p~n",[Reason]),
+ error("Merge by igor module failed due to ~p~n",[Reason],Options),
{error,'no_compilation'};
_ ->
%% io:format("compiling output module: ~p~n",[generated_file(Name,IgorOptions)]),
@@ -173,8 +173,8 @@ inline(_,_,_,_) ->
compile_set(SetBase,Files,Options)
when is_list(hd(Files)),is_list(Options) ->
%% case when there are several input files in a list
- report_verbose("Erlang ASN.1 version ~p compiling ~p ~n",[?vsn,Files],Options),
- report_verbose("Compiler Options: ~p~n",[Options],Options),
+ verbose("Erlang ASN.1 version ~p compiling ~p ~n",[?vsn,Files],Options),
+ verbose("Compiler Options: ~p~n",[Options],Options),
OutFile = outfile(SetBase,"",Options),
DbFile = outfile(SetBase,"asn1db",Options),
Includes = [I || {i,I} <- Options],
@@ -728,7 +728,7 @@ parse_set(ScanRes,Options) ->
scan(File,Options) ->
case asn1ct_tok:file(File) of
{error,Reason} ->
- io:format("~p~n",[Reason]),
+ error("~p~n",[Reason],Options),
{false,{error,Reason}};
Tokens ->
case lists:member(ss,Options) of
@@ -753,16 +753,17 @@ parse({true,Tokens},File,Options) ->
if
is_integer(Line) ->
BaseName = filename:basename(File),
- io:format("syntax error at line ~p in module ~s:~n",
- [Line,BaseName]);
+ error("syntax error at line ~p in module ~s:~n",
+ [Line,BaseName],Options);
true ->
- io:format("syntax error in module ~p:~n",[File])
+ error("syntax error in module ~p:~n",
+ [File],Options)
end,
print_error_message(Message),
{false,{error,Message}};
{error,{Line,_Mod,[Message,Token]}} ->
- io:format("syntax error: ~p ~p at line ~p~n",
- [Message,Token,Line]),
+ error("syntax error: ~p ~p at line ~p~n",
+ [Message,Token,Line],Options),
{false,{error,{Line,[Message,Token]}}};
{ok,M} ->
case lists:member(sp,Options) of
@@ -772,7 +773,7 @@ parse({true,Tokens},File,Options) ->
{true,M}
end;
OtherError ->
- io:format("~p~n",[OtherError])
+ error("~p~n",[OtherError],Options)
end;
parse({false,Tokens},_,_) ->
{false,Tokens}.
@@ -802,7 +803,7 @@ check({true,M},File,OutFile,Includes,EncodingRule,DbFile,Options,InputMods) ->
NewM = Module#module{typeorval=NewTypeOrVal},
asn1_db:dbput(NewM#module.name,'MODULE',NewM),
asn1_db:dbsave(DbFile,M#module.name),
- report_verbose("--~p--~n",[{generated,DbFile}],Options),
+ verbose("--~p--~n",[{generated,DbFile}],Options),
{true,{M,NewM,GenTypeOrVal}}
end
end;
@@ -823,11 +824,11 @@ generate({true,{M,_Module,GenTOrV}},OutFile,EncodingRule,Options) ->
% io:format("Options: ~p~n",[Options]),
case catch specialized_decode_prepare(EncodingRule,M,GenTOrV,Options) of
{error, enoent} -> ok;
- {error, Reason} -> io:format("WARNING: Error in configuration"
- "file: ~n~p~n",[Reason]);
- {'EXIT',Reason} -> io:format("WARNING: Internal error when "
- "analyzing configuration"
- "file: ~n~p~n",[Reason]);
+ {error, Reason} -> warning("Error in configuration "
+ "file: ~n~p~n",[Reason],Options);
+ {'EXIT',Reason} -> warning("Internal error when "
+ "analyzing configuration "
+ "file: ~n~p~n",[Reason],Options);
_ -> ok
end,
@@ -835,7 +836,7 @@ generate({true,{M,_Module,GenTOrV}},OutFile,EncodingRule,Options) ->
case (catch asn1ct_gen:pgen(OutFile,EncodingRule,
M#module.name,GenTOrV,Options)) of
{'EXIT',Reason2} ->
- io:format("ERROR: ~p~n",[Reason2]),
+ error("~p~n",[Reason2],Options),
{error,Reason2};
_ ->
ok
@@ -878,7 +879,8 @@ parse_and_save(Module,S) ->
_ -> ok
end;
Err ->
- io:format("Warning: could not do a consistency check of the ~p file: no asn1 source file was found.~n",[lists:concat([Module,".asn1db"])]),
+ warning("could not do a consistency check of the ~p file: no asn1 source file was found.~n",
+ [lists:concat([Module,".asn1db"])],Options),
{error,{asn1,input_file_error,Err}}
end.
parse_and_save1(S,File,Options,Includes) ->
@@ -1183,6 +1185,7 @@ is_inline(Options) ->
_ ->
lists:keymember(inline,1,Options)
end.
+
inline_output(Options,Default) ->
case [X||{inline,X}<-Options] of
[OutputName] ->
@@ -1207,7 +1210,7 @@ compile_py(File,OutFile,Options) ->
compile(File, _OutFile, Options) ->
case catch compile(File, make_erl_options(Options)) of
Exit = {'EXIT',_Reason} ->
- io:format("~p~n~s~n",[Exit,"error"]),
+ error("~p~n~s~n",[Exit,"error"],Options),
error;
{error,_Reason} ->
%% case occurs due to error in asn1ct_parser2,asn1ct_check
@@ -1223,7 +1226,7 @@ compile(File, _OutFile, Options) ->
io:format("~p~n",[ScanRes]),
ok;
Unknown ->
- io:format("~p~n~s~n",[Unknown,"error"]),
+ error("~p~n~s~n",[Unknown,"error"],Options),
error
end.
@@ -1237,7 +1240,7 @@ make_erl_options(Opts) ->
Includes = Opts#options.includes,
Defines = Opts#options.defines,
Outdir = Opts#options.outdir,
-%% Warning = Opts#options.warning,
+ Warning = Opts#options.warning,
Verbose = Opts#options.verbose,
Specific = Opts#options.specific,
Optimize = Opts#options.optimize,
@@ -1249,10 +1252,10 @@ make_erl_options(Opts) ->
true -> [verbose];
false -> []
end ++
-%%% case Warning of
-%%% 0 -> [];
-%%% _ -> [report_warnings]
-%%% end ++
+ case Warning of
+ 0 -> [];
+ _ -> [warnings]
+ end ++
[] ++
case Optimize of
1 -> [optimize];
@@ -1276,7 +1279,7 @@ make_erl_options(Opts) ->
uper_bin -> [uper_bin]
end,
- Options++[report_errors, {cwd, Cwd}, {outdir, Outdir}|
+ Options++[errors, {cwd, Cwd}, {outdir, Outdir}|
lists:map(fun(Dir) -> {i, Dir} end, Includes)]++Specific.
pretty2(Module,AbsFile) ->
@@ -2518,13 +2521,48 @@ type_check(#'Externaltypereference'{}) ->
make_suffix(_) ->
"".
-report_verbose(Format, Args, S) ->
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Report functions.
+%%
+%% Errors messages are controlled with the 'errors' compiler option
+%% Warning messages are controlled with the 'warnings' compiler option
+%% Verbose messages are controlled with the 'verbose' compiler option
+
+error(Format, Args, S) ->
+ case is_error(S) of
+ true ->
+ io:format("Error: " ++ Format, Args);
+ false ->
+ ok
+ end.
+
+warning(Format, Args, S) ->
+ case is_warning(S) of
+ true ->
+ io:format("Warning: " ++ Format, Args);
+ false ->
+ ok
+ end.
+
+verbose(Format, Args, S) ->
case is_verbose(S) of
- true ->
- io:format(Format, Args);
- false ->
- ok
+ true ->
+ io:format(Format, Args);
+ false ->
+ ok
end.
-is_verbose(S) ->
- lists:member(verbose, S).
+is_error(S) when is_record(S, state) ->
+ is_error(S#state.options);
+is_error(O) ->
+ lists:member(errors, O) orelse is_verbose(O).
+
+is_warning(S) when is_record(S, state) ->
+ is_warning(S#state.options);
+is_warning(O) ->
+ lists:member(warnings, O) orelse is_verbose(O).
+
+is_verbose(S) when is_record(S, state) ->
+ is_verbose(S#state.options);
+is_verbose(O) ->
+ lists:member(verbose, O).
diff --git a/lib/asn1/src/asn1ct_check.erl b/lib/asn1/src/asn1ct_check.erl
index c6f3b60786..efd731f052 100644
--- a/lib/asn1/src/asn1ct_check.erl
+++ b/lib/asn1/src/asn1ct_check.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -2029,8 +2029,9 @@ get_objectset_def2(_S,Set,CField) when is_list(Set) ->
set=Set}};
get_objectset_def2(_S,T = #typedef{typespec=#'ObjectSet'{}},_CField) ->
T;
-get_objectset_def2(_S,T,_CField) ->
- io:format("Warning get_objectset_def2: uncontrolled object set structure:~n~p~n",[T]).
+get_objectset_def2(S,T,_CField) ->
+ asn1ct:warning("get_objectset_def2: uncontrolled object set structure:~n~p~n",
+ [T],S).
type_name(S,#type{def=Def}) ->
CurrMod = S#state.mname,
@@ -2687,7 +2688,7 @@ normalize_value(S,Type,{'DEFAULT',Value},NameList) ->
{'REAL',_,_} ->
normalize_real(Value);
{'ENUMERATED',CType,_} ->
- normalize_enumerated(Value,CType);
+ normalize_enumerated(S,Value,CType);
{'CHOICE',CType,NewNameList} ->
normalize_choice(S,Value,CType,NewNameList);
{'SEQUENCE',CType,NewNameList} ->
@@ -2703,7 +2704,8 @@ normalize_value(S,Type,{'DEFAULT',Value},NameList) ->
{'ASN1_OPEN_TYPE',{typefield,_TF},NL} -> %an open type
normalize_objectclassfieldvalue(S,Value,NL);
Err ->
- io:format("WARNING: could not check default value ~p~nType:~n~p~nNameList:~n~p~n",[Value,Type,Err]),
+ asn1ct:warning("could not check default value ~p~nType:~n~p~nNameList:~n~p~n",
+ [Value,Type,Err],S),
Value
end;
normalize_value(S,Type,Val,NameList) ->
@@ -2788,23 +2790,23 @@ normalize_bitstring(S,Value,Type)->
end,
case catch lists:map(F,RecList) of
{error,Reason} ->
- io:format("WARNING: default value not "
+ asn1ct:warning("default value not "
"compatible with type definition ~p~n",
- [Reason]),
+ [Reason],S),
Value;
NewList ->
NewList
end;
_ ->
- io:format("WARNING: default value not "
+ asn1ct:warning("default value not "
"compatible with type definition ~p~n",
- [RecList]),
+ [RecList],S),
Value
end;
{Name,String} when is_atom(Name) ->
normalize_bitstring(S,String,Type);
Other ->
- io:format("WARNING: illegal default value ~p~n",[Other]),
+ asn1ct:warning("illegal default value ~p~n",[Other],S),
Value
end.
@@ -2843,12 +2845,13 @@ normalize_octetstring(S,Value,CType) ->
%% check if list elements are valid octet values
lists:map(fun([])-> ok;
(H)when H > 255->
- io:format("WARNING: not legal octet value ~p in OCTET STRING, ~p~n",[H,List]);
+ asn1ct:warning("not legal octet value ~p in OCTET STRING, ~p~n",
+ [H,List],S);
(_)-> ok
end, List),
List;
Other ->
- io:format("WARNING: unknown default value ~p~n",[Other]),
+ asn1ct:warning("unknown default value ~p~n",[Other],S),
Value
end.
@@ -2895,23 +2898,23 @@ normalize_objectdescriptor(Value) ->
normalize_real(Value) ->
Value.
-normalize_enumerated(#'Externalvaluereference'{value=V},CType)
+normalize_enumerated(S,#'Externalvaluereference'{value=V},CType)
when is_list(CType) ->
- normalize_enumerated2(V,CType);
-normalize_enumerated(Value,CType) when is_atom(Value),is_list(CType) ->
- normalize_enumerated2(Value,CType);
-normalize_enumerated({Name,EnumV},CType) when is_atom(Name) ->
- normalize_enumerated(EnumV,CType);
-normalize_enumerated(Value,{CType1,CType2}) when is_list(CType1), is_list(CType2)->
- normalize_enumerated(Value,CType1++CType2);
-normalize_enumerated(V,CType) ->
- io:format("WARNING: Enumerated unknown type ~p~n",[CType]),
+ normalize_enumerated2(S,V,CType);
+normalize_enumerated(S,Value,CType) when is_atom(Value),is_list(CType) ->
+ normalize_enumerated2(S,Value,CType);
+normalize_enumerated(S,{Name,EnumV},CType) when is_atom(Name) ->
+ normalize_enumerated(S,EnumV,CType);
+normalize_enumerated(S,Value,{CType1,CType2}) when is_list(CType1), is_list(CType2)->
+ normalize_enumerated(S,Value,CType1++CType2);
+normalize_enumerated(S,V,CType) ->
+ asn1ct:warning("Enumerated unknown type ~p~n",[CType],S),
V.
-normalize_enumerated2(V,Enum) ->
+normalize_enumerated2(S,V,Enum) ->
case lists:keysearch(V,1,Enum) of
{value,{Val,_}} -> Val;
_ ->
- io:format("WARNING: Enumerated value is not correct ~p~n",[V]),
+ asn1ct:warning("Enumerated value is not correct ~p~n",[V],S),
V
end.
@@ -2922,8 +2925,7 @@ normalize_choice(S,{'CHOICE',{C,V}},CType,NameList) when is_atom(C) ->
{C,normalize_value(S,CT,{'DEFAULT',V},
[Name|NameList])};
Other ->
- io:format("WARNING: Wrong format of type/value ~p/~p~n",
- [Other,V]),
+ asn1ct:warning("Wrong format of type/value ~p/~p~n",[Other,V],S),
{C,V}
end;
normalize_choice(S,{'DEFAULT',ValueList},CType,NameList) when is_list(ValueList) ->
@@ -3099,8 +3101,7 @@ normalize_s_of(SorS,S,Value,Type,NameList) when is_list(Value) ->
List when is_list(List) ->
List;
_ ->
- io:format("WARNING: ~p could not handle value ~p~n",
- [SorS,Value]),
+ asn1ct:warning("~p could not handle value ~p~n",[SorS,Value],S),
Value
end;
normalize_s_of(SorS,S,Value,Type,NameList)
@@ -3152,15 +3153,13 @@ get_normalized_value(S,Val,Type,Func,AddArg) ->
V2 = sort_val_if_set(AddArg,V,Type),
call_Func(update_state(S,ExtM),V2,Type,Func,AddArg);
{error,_} ->
- io:format("WARNING: default value not "
- "comparable ~p~n",[Val]),
+ asn1ct:warning("default value not comparable ~p~n",[Val],S),
Val;
{ExtM,NewVal} ->
V2 = sort_val_if_set(AddArg,NewVal,Type),
call_Func(update_state(S,ExtM),V2,Type,Func,AddArg);
_ ->
- io:format("WARNING: default value not "
- "comparable ~p~n",[Val]),
+ asn1ct:warning("default value not comparable ~p~n",[Val],S),
Val
end.
@@ -4109,7 +4108,7 @@ resolve_namednumber(S,#typedef{typespec=Type},Name) ->
case Type#type.def of
{'ENUMERATED',NameList} ->
NamedNumberList=check_enumerated(S,NameList,Type#type.constraint),
- N = normalize_enumerated(Name,NamedNumberList),
+ N = normalize_enumerated(S,Name,NamedNumberList),
{value,{_,V}} = lists:keysearch(N,1,NamedNumberList),
V;
{'INTEGER',NameList} ->
@@ -5710,9 +5709,9 @@ sort_components(der,S=#state{tname=TypeName},Components) ->
end,
case {untagged_choice(S,CompsList),Ext} of
{false,noext} ->
- {true,sort_components1(TypeName,CompsList,[],[],[],[])};
+ {true,sort_components1(S,TypeName,CompsList,[],[],[],[])};
{false,_} ->
- {true,{sort_components1(TypeName,CompsList,[],[],[],[]), []}};
+ {true,{sort_components1(S,TypeName,CompsList,[],[],[],[]), []}};
{true,noext} ->
%% sort in run-time
{dynamic,R1};
@@ -5724,57 +5723,57 @@ sort_components(per,S=#state{tname=TypeName},Components) ->
Root = tag_untagged_choice(S,R1++R2),
case Ext of
noext ->
- {true,sort_components1(TypeName,Root,[],[],[],[])};
+ {true,sort_components1(S,TypeName,Root,[],[],[],[])};
_ ->
- {true,{sort_components1(TypeName,Root,[],[],[],[]),
+ {true,{sort_components1(S,TypeName,Root,[],[],[],[]),
Ext}}
end.
-sort_components1(TypeName,[C=#'ComponentType'{tags=[{'UNIVERSAL',_}|_R]}|Cs],
+sort_components1(S,TypeName,[C=#'ComponentType'{tags=[{'UNIVERSAL',_}|_R]}|Cs],
UnivAcc,ApplAcc,ContAcc,PrivAcc) ->
- sort_components1(TypeName,Cs,[C|UnivAcc],ApplAcc,ContAcc,PrivAcc);
-sort_components1(TypeName,[C=#'ComponentType'{tags=[{'APPLICATION',_}|_R]}|Cs],
+ sort_components1(S,TypeName,Cs,[C|UnivAcc],ApplAcc,ContAcc,PrivAcc);
+sort_components1(S,TypeName,[C=#'ComponentType'{tags=[{'APPLICATION',_}|_R]}|Cs],
UnivAcc,ApplAcc,ContAcc,PrivAcc) ->
- sort_components1(TypeName,Cs,UnivAcc,[C|ApplAcc],ContAcc,PrivAcc);
-sort_components1(TypeName,[C=#'ComponentType'{tags=[{'CONTEXT',_}|_R]}|Cs],
+ sort_components1(S,TypeName,Cs,UnivAcc,[C|ApplAcc],ContAcc,PrivAcc);
+sort_components1(S,TypeName,[C=#'ComponentType'{tags=[{'CONTEXT',_}|_R]}|Cs],
UnivAcc,ApplAcc,ContAcc,PrivAcc) ->
- sort_components1(TypeName,Cs,UnivAcc,ApplAcc,[C|ContAcc],PrivAcc);
-sort_components1(TypeName,[C=#'ComponentType'{tags=[{'PRIVATE',_}|_R]}|Cs],
+ sort_components1(S,TypeName,Cs,UnivAcc,ApplAcc,[C|ContAcc],PrivAcc);
+sort_components1(S,TypeName,[C=#'ComponentType'{tags=[{'PRIVATE',_}|_R]}|Cs],
UnivAcc,ApplAcc,ContAcc,PrivAcc) ->
- sort_components1(TypeName,Cs,UnivAcc,ApplAcc,ContAcc,[C|PrivAcc]);
-sort_components1(TypeName,[],UnivAcc,ApplAcc,ContAcc,PrivAcc) ->
+ sort_components1(S,TypeName,Cs,UnivAcc,ApplAcc,ContAcc,[C|PrivAcc]);
+sort_components1(S,TypeName,[],UnivAcc,ApplAcc,ContAcc,PrivAcc) ->
I = #'ComponentType'.tags,
- ascending_order_check(TypeName,sort_universal_type(UnivAcc)) ++
- ascending_order_check(TypeName,lists:keysort(I,ApplAcc)) ++
- ascending_order_check(TypeName,lists:keysort(I,ContAcc)) ++
- ascending_order_check(TypeName,lists:keysort(I,PrivAcc)).
+ ascending_order_check(S,TypeName,sort_universal_type(UnivAcc)) ++
+ ascending_order_check(S,TypeName,lists:keysort(I,ApplAcc)) ++
+ ascending_order_check(S,TypeName,lists:keysort(I,ContAcc)) ++
+ ascending_order_check(S,TypeName,lists:keysort(I,PrivAcc)).
-ascending_order_check(TypeName,Components) ->
- ascending_order_check1(TypeName,Components),
+ascending_order_check(S,TypeName,Components) ->
+ ascending_order_check1(S,TypeName,Components),
Components.
-ascending_order_check1(TypeName,
+ascending_order_check1(S,TypeName,
[C1 = #'ComponentType'{tags=[{_,T}|_]},
C2 = #'ComponentType'{tags=[{_,T}|_]}|Rest]) ->
- io:format("WARNING: Indistinct tag ~p in SET ~p, components ~p and ~p~n",
- [T,TypeName,C1#'ComponentType'.name,C2#'ComponentType'.name]),
- ascending_order_check1(TypeName,[C2|Rest]);
-ascending_order_check1(TypeName,
+ asn1ct:warning("Indistinct tag ~p in SET ~p, components ~p and ~p~n",
+ [T,TypeName,C1#'ComponentType'.name,C2#'ComponentType'.name],S),
+ ascending_order_check1(S,TypeName,[C2|Rest]);
+ascending_order_check1(S,TypeName,
[C1 = #'ComponentType'{tags=[{'UNIVERSAL',T1}|_]},
C2 = #'ComponentType'{tags=[{'UNIVERSAL',T2}|_]}|Rest]) ->
case (decode_type(T1) == decode_type(T2)) of
true ->
- io:format("WARNING: Indistinct tags ~p and ~p in"
+ asn1ct:warning("Indistinct tags ~p and ~p in"
" SET ~p, components ~p and ~p~n",
[T1,T2,TypeName,C1#'ComponentType'.name,
- C2#'ComponentType'.name]),
- ascending_order_check1(TypeName,[C2|Rest]);
+ C2#'ComponentType'.name],S),
+ ascending_order_check1(S,TypeName,[C2|Rest]);
_ ->
- ascending_order_check1(TypeName,[C2|Rest])
+ ascending_order_check1(S,TypeName,[C2|Rest])
end;
-ascending_order_check1(N,[_|Rest]) ->
- ascending_order_check1(N,Rest);
-ascending_order_check1(_,[]) ->
+ascending_order_check1(S,N,[_|Rest]) ->
+ ascending_order_check1(S,N,Rest);
+ascending_order_check1(_,_,[]) ->
ok.
sort_universal_type(Components) ->
@@ -6177,7 +6176,6 @@ componentrelation_leadingattr(_,[],_CompList,[],NewCompList) ->
{false,lists:reverse(NewCompList)};
componentrelation_leadingattr(_,[],_CompList,LeadingAttr,NewCompList) ->
{lists:last(LeadingAttr),lists:reverse(NewCompList)}; %send all info in Ts later
-
componentrelation_leadingattr(S,[C= #'ComponentType'{}|Cs],CompList,Acc,CompAcc) ->
{LAAcc,NewC} =
case catch componentrelation1(S,C#'ComponentType'.typespec,
@@ -6230,7 +6228,10 @@ componentrelation_leadingattr(S,[C= #'ComponentType'{}|Cs],CompList,Acc,CompAcc)
{[],C}
end,
componentrelation_leadingattr(S,Cs,CompList,LAAcc++Acc,
- [NewC|CompAcc]).
+ [NewC|CompAcc]);
+componentrelation_leadingattr(S,[NotComponentType|Cs],CompList,LeadingAttr,NewCompList) ->
+ componentrelation_leadingattr(S,Cs,CompList,LeadingAttr,[NotComponentType|NewCompList]).
+
object_set_mod_name(_S,ObjSet) when is_atom(ObjSet) ->
ObjSet;
diff --git a/lib/asn1/src/asn1ct_constructed_per.erl b/lib/asn1/src/asn1ct_constructed_per.erl
index cce6eb9831..d6f23aca06 100644
--- a/lib/asn1/src/asn1ct_constructed_per.erl
+++ b/lib/asn1/src/asn1ct_constructed_per.erl
@@ -326,16 +326,14 @@ gen_decode_constructed(Erules,Typename,D) when is_record(D,type) ->
textual_order([#'ComponentType'{textual_order=undefined}|_],TermList) ->
TermList;
textual_order(CompList,TermList) when is_list(CompList) ->
- OrderList = [Ix||#'ComponentType'{textual_order=Ix} <- CompList],
+ OrderList = [Ix||#'ComponentType'{textual_order=Ix} <- CompList],
[Term||{_,Term}<-
lists:sort(lists:zip(OrderList,
lists:sublist(TermList,length(OrderList))))];
%% sublist is just because Termlist can sometimes be longer than
%% OrderList, which it really shouldn't
textual_order({Root,Ext},TermList) ->
- textual_order(Root ++ Ext,TermList);
-textual_order({Root1,Ext,Root2},TermList) ->
- textual_order(Root1 ++ Ext ++ Root2, TermList).
+ textual_order(Root ++ Ext,TermList).
to_textual_order({Root,Ext}) ->
{to_textual_order(Root),Ext};
diff --git a/lib/asn1/src/asn1ct_gen.erl b/lib/asn1/src/asn1ct_gen.erl
index 0bb0b65e5d..e49829d82f 100644
--- a/lib/asn1/src/asn1ct_gen.erl
+++ b/lib/asn1/src/asn1ct_gen.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -87,7 +87,7 @@ pgen_module(OutFile,Erules,Module,
% gen_vars(asn1_db:mod_to_vars(Module)),
% gen_tag_table(AllTypes),
file:close(Fid),
- asn1ct:report_verbose("--~p--~n",[{generated,ErlFile}],Options).
+ asn1ct:verbose("--~p--~n",[{generated,ErlFile}],Options).
pgen_typeorval(Erules,Module,N2nConvEnums,{Types,Values,_Ptypes,_Classes,Objects,ObjectSets}) ->
@@ -1340,9 +1340,9 @@ pgen_hrl(Erules,Module,TypeOrVal,Options,_Indent) ->
Y ->
Fid = get(gen_file_out),
file:close(Fid),
- asn1ct:report_verbose("--~p--~n",
- [{generated,lists:concat([get(outfile),".hrl"])}],
- Options),
+ asn1ct:verbose("--~p--~n",
+ [{generated,lists:concat([get(outfile),".hrl"])}],
+ Options),
Y
end.
diff --git a/lib/asn1/src/asn1rt_ber_bin.erl b/lib/asn1/src/asn1rt_ber_bin.erl
index ab04d981b0..22f9f2ecfd 100644
--- a/lib/asn1/src/asn1rt_ber_bin.erl
+++ b/lib/asn1/src/asn1rt_ber_bin.erl
@@ -2192,12 +2192,12 @@ decode_tag_and_length(Buffer) ->
%% Check if valid tag
%%
%% check_if_valid_tag(Tag, List_of_valid_tags, OptOrMand) -> name of the tag
-%%===============================================================================
+%%============================================================================
check_if_valid_tag(<<0,0,_/binary>>,_,_) ->
asn1_EOC;
check_if_valid_tag(<<>>, _, OptOrMand) ->
- check_if_valid_tag2(false,[],[],OptOrMand);
+ check_if_valid_tag2_error([], OptOrMand);
check_if_valid_tag(Bytes, ListOfTags, OptOrMand) when is_binary(Bytes) ->
{Tag, _, _} = decode_tag(Bytes),
check_if_valid_tag(Tag, ListOfTags, OptOrMand);
@@ -2217,7 +2217,6 @@ check_if_valid_tag(Tag, ListOfTags, OptOrMand) ->
check_if_valid_tag2(_Class_TagNo, [], Tag, MandOrOpt) ->
check_if_valid_tag2_error(Tag,MandOrOpt);
-
check_if_valid_tag2(Class_TagNo, [{TagName,TagList}|T], Tag, OptOrMand) ->
case check_if_valid_tag_loop(Class_TagNo, TagList) of
true ->
@@ -2226,7 +2225,7 @@ check_if_valid_tag2(Class_TagNo, [{TagName,TagList}|T], Tag, OptOrMand) ->
check_if_valid_tag2(Class_TagNo, T, Tag, OptOrMand)
end.
--spec(check_if_valid_tag2_error/2 :: (term(),atom()) -> no_return()).
+-spec check_if_valid_tag2_error(term(), atom()) -> no_return().
check_if_valid_tag2_error(Tag,mandatory) ->
exit({error,{asn1,{invalid_tag,Tag}}});
diff --git a/lib/asn1/src/asn1rt_driver_handler.erl b/lib/asn1/src/asn1rt_driver_handler.erl
index cc2b501e16..146d0043f9 100644
--- a/lib/asn1/src/asn1rt_driver_handler.erl
+++ b/lib/asn1/src/asn1rt_driver_handler.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
diff --git a/lib/asn1/test/External.hrl b/lib/asn1/test/External.hrl
index 8818fac488..14a3a059e6 100644
--- a/lib/asn1/test/External.hrl
+++ b/lib/asn1/test/External.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
diff --git a/lib/asn1/test/Makefile b/lib/asn1/test/Makefile
index e8f65ec70b..7ecd544d4b 100644
--- a/lib/asn1/test/Makefile
+++ b/lib/asn1/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2010. All Rights Reserved.
+# Copyright Ericsson AB 1997-2011. 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
@@ -193,8 +193,8 @@ release_tests_spec: opt
$(INSTALL_DIR) $(RELSYSDIR)/asn1_bin_SUITE_data
$(INSTALL_DIR) $(RELSYSDIR)/asn1_bin_v2_SUITE_data
$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(RELSYSDIR)
- $(INSTALL_DATA) asn1.spec $(INSTALL_PROGS) $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ $(INSTALL_DATA) asn1.spec asn1.cover $(INSTALL_PROGS) $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
cd asn1_SUITE_data; tar cfh $(RELSYSDIR)/asn1_SUITE_data.tar *
cd $(RELSYSDIR)/asn1_SUITE_data; tar xf $(RELSYSDIR)/asn1_SUITE_data.tar
cd $(RELSYSDIR)/asn1_bin_SUITE_data; tar xf $(RELSYSDIR)/asn1_SUITE_data.tar
diff --git a/lib/asn1/test/asn1.cover b/lib/asn1/test/asn1.cover
new file mode 100644
index 0000000000..589a8b7e3d
--- /dev/null
+++ b/lib/asn1/test/asn1.cover
@@ -0,0 +1,2 @@
+{incl_app,asn1,details}.
+
diff --git a/lib/asn1/test/asn1.spec b/lib/asn1/test/asn1.spec
index 6d9ae924fa..ae96de3a58 100644
--- a/lib/asn1/test/asn1.spec
+++ b/lib/asn1/test/asn1.spec
@@ -1,3 +1 @@
-{topcase, {dir, "../asn1_test"}}.
-
-
+{suites,"../asn1_test",all}.
diff --git a/lib/asn1/test/asn1_SUITE.erl b/lib/asn1/test/asn1_SUITE.erl
new file mode 100644
index 0000000000..d050d8c84b
--- /dev/null
+++ b/lib/asn1/test/asn1_SUITE.erl
@@ -0,0 +1,2489 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2001-2011. 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%
+%%
+%%
+%%% Purpose : Test suite for the ASN.1 application
+
+-module(asn1_SUITE).
+-define(PER,'per').
+-define(BER,'ber').
+-define(ber_driver(Erule,Func),
+ case Erule of
+ ber_bin_v2 ->
+ Func;
+ _ -> ok
+ end).
+-define(per_optimize(Erule),
+ case Erule of
+ ber_bin_v2 ->[optimize];
+ _ -> []
+ end).
+-define(per_bit_opt(FuncCall),
+ case ?BER of
+ ber_bin_v2 -> FuncCall;
+% _ -> {skip,"only for bit optimized per_bin"}
+ _ -> ok
+ end).
+-define(uper_bin(FuncCall),
+ case ?PER of
+ per -> FuncCall;
+ _ -> ok
+ end).
+
+-compile(export_all).
+%%-export([Function/Arity, ...]).
+
+-include_lib("test_server/include/test_server.hrl").
+
+%% records used by test-case default
+-record('Def1',{ bool0,
+ bool1 = asn1_DEFAULT,
+ bool2 = asn1_DEFAULT,
+ bool3 = asn1_DEFAULT}).
+
+%-record('Def2',{
+%bool10, bool11 = asn1_DEFAULT, bool12 = asn1_DEFAULT, bool13}).
+
+%-record('Def3',{
+%bool30 = asn1_DEFAULT, bool31 = asn1_DEFAULT, bool32 = asn1_DEFAULT, bool33 = asn1_DEFAULT}).
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, compile}, parse, default_per, default_ber,
+ default_per_opt, per, {group, ber}, testPrim,
+ testPrimStrings, testPrimExternal, testChoPrim,
+ testChoExtension, testChoExternal, testChoOptional,
+ testChoOptionalImplicitTag, testChoRecursive,
+ testChoTypeRefCho, testChoTypeRefPrim,
+ testChoTypeRefSeq, testChoTypeRefSet, testDef, testOpt,
+ testSeqDefault, testSeqExtension, testSeqExternal,
+ testSeqOptional, testSeqPrim, testSeqTag,
+ testSeqTypeRefCho, testSeqTypeRefPrim,
+ testSeqTypeRefSeq, testSeqTypeRefSet, testSeqOf,
+ testSeqOfIndefinite, testSeqOfCho, testSeqOfExternal,
+ testSetDefault, testSetExtension,
+ testExtensionAdditionGroup, testSetExternal,
+ testSeqOfTag, testSetOptional, testSetPrim, testSetTag,
+ testSetTypeRefCho, testSetTypeRefPrim,
+ testSetTypeRefSeq, testSetTypeRefSet, testSetOf,
+ testSetOfCho, testSetOfExternal, testSetOfTag,
+ testEnumExt, value_test, testSeq2738, constructed,
+ ber_decode_error, h323test, testSeqIndefinite,
+ testSetIndefinite, testChoiceIndefinite,
+ per_GeneralString, per_open_type, testInfObjectClass,
+ testParameterizedInfObj, testMergeCompile, testobj,
+ testDeepTConstr, testConstraints, testInvokeMod,
+ testExport, testImport, testCompactBitString,
+ testMegaco, testParamBasic, testMvrasn6,
+ testContextSwitchingTypes, testTypeValueNotation,
+ testOpenTypeImplicitTag, duplicate_tags, rtUI, testROSE,
+ testINSTANCE_OF, testTCAP, testDER, specialized_decodes,
+ special_decode_performance, test_driver_load,
+ test_ParamTypeInfObj, test_WS_ParamClass,
+ test_Defed_ObjectIdentifier, testSelectionType,
+ testSSLspecs, testNortel, test_undecoded_rest,
+ test_inline, testTcapsystem, testNBAPsystem,
+ test_compile_options, testDoubleEllipses,
+ test_modified_x420, testX420, test_x691, ticket_6143,
+ testExtensionAdditionGroup] ++ common() ++ particular().
+
+groups() ->
+ [{option_tests, [],
+ [test_compile_options, ticket_6143]},
+ {infobj, [],
+ [testInfObjectClass, testParameterizedInfObj,
+ testMergeCompile, testobj, testDeepTConstr]},
+ {performance, [],
+ [testTimer_ber, testTimer_ber_opt_driver, testTimer_per,
+ testTimer_per_opt, testTimer_uper_bin]},
+ {bugs, [],
+ [test_ParamTypeInfObj, test_WS_ParamClass,
+ test_Defed_ObjectIdentifier]},
+ {compile, [],
+ [c_syntax, c_string_per, c_string_ber,
+ c_implicit_before_choice]},
+ {ber, [],
+ [ber_choiceinseq, ber_optional, ber_optional_keyed_list,
+ ber_other]},
+ {app_test, [], [{asn1_app_test, all}]},
+ {appup_test, [], [{asn1_appup_test, all}]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+%all(suite) -> [test_inline,testNBAPsystem,test_compile_options,ticket_6143].
+
+
+init_per_testcase(Func,Config) ->
+ %%?line test_server:format("Func: ~p~n",[Func]),
+ ?line {ok, _} = file:read_file_info(filename:join([?config(priv_dir,Config)])),
+ ?line code:add_patha(?config(priv_dir,Config)),
+ Dog=
+ case Func of
+ testX420 ->
+ test_server:timetrap({minutes,60}); % 60 minutes
+ _ ->
+ test_server:timetrap({minutes,30}) % 60 minutes
+ end,
+%% Dog=test_server:timetrap(1800000), % 30 minutes
+ [{watchdog, Dog}|Config].
+
+end_per_testcase(_Func,Config) ->
+ Dog=?config(watchdog, Config),
+ test_server:timetrap_cancel(Dog).
+
+
+testPrim(suite) -> [];
+testPrim(Config) ->
+ ?line testPrim:compile(Config,?BER,[]),
+ ?line testPrim_cases(?BER),
+ ?line ?ber_driver(?BER,testPrim:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testPrim_cases(?BER)),
+ ?line testPrim:compile(Config,?PER,[]),
+ ?line testPrim_cases(?PER),
+ ?line ?per_bit_opt(testPrim:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testPrim_cases(?PER)),
+ ?line ?uper_bin(testPrim:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testPrim_cases(uper_bin)),
+ ?line testPrim:compile(Config,?PER,[optimize]),
+ ?line testPrim_cases(?PER).
+
+testPrim_cases(Rules) ->
+ ?line testPrim:bool(Rules),
+ ?line testPrim:int(Rules),
+ ?line testPrim:enum(Rules),
+ ?line testPrim:obj_id(Rules),
+ ?line testPrim:rel_oid(Rules),
+ ?line testPrim:null(Rules),
+ ?line testPrim:real(Rules).
+
+
+testCompactBitString(suite) -> [];
+testCompactBitString(Config) ->
+
+ ?line testCompactBitString:compile(Config,?BER,[compact_bit_string]),
+ ?line testCompactBitString:compact_bit_string(?BER),
+
+ ?line ?ber_driver(?BER,testCompactBitString:compile(Config,?BER,[compact_bit_string,driver])),
+ ?line ?ber_driver(?BER,testCompactBitString:compact_bit_string(?BER)),
+
+ ?line testCompactBitString:compile(Config,?PER,[compact_bit_string]),
+ ?line testCompactBitString:compact_bit_string(?PER),
+ ?line testCompactBitString:bit_string_unnamed(?PER),
+
+ ?line ?per_bit_opt(testCompactBitString:compile(Config,?PER,
+ [compact_bit_string,optimize])),
+ ?line ?per_bit_opt(testCompactBitString:compact_bit_string(?PER)),
+ ?line ?per_bit_opt(testCompactBitString:bit_string_unnamed(?PER)),
+ ?line ?per_bit_opt(testCompactBitString:ticket_7734(?PER)),
+
+ ?line ?uper_bin(testCompactBitString:compile(Config,uper_bin,
+ [compact_bit_string])),
+ ?line ?uper_bin(testCompactBitString:compact_bit_string(uper_bin)),
+ ?line ?uper_bin(testCompactBitString:bit_string_unnamed(uper_bin)),
+
+ ?line testCompactBitString:compile(Config,?PER,[optimize,compact_bit_string]),
+ ?line testCompactBitString:compact_bit_string(?PER),
+ ?line testCompactBitString:bit_string_unnamed(?PER),
+
+ ?line testCompactBitString:otp_4869(?PER).
+
+
+testPrimStrings(suite) -> [];
+testPrimStrings(Config) ->
+
+ ?line testPrimStrings:compile(Config,?BER,[]),
+ ?line testPrimStrings_cases(?BER),
+ ?line testPrimStrings:more_strings(?BER), %% these are not implemented in per yet
+ ?line ?ber_driver(?BER,testPrimStrings:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testPrimStrings_cases(?BER)),
+ ?line ?ber_driver(?BER,testPrimStrings:more_strings(?BER)),
+
+ ?line testPrimStrings:compile(Config,?PER,[]),
+ ?line testPrimStrings_cases(?PER),
+
+ ?line ?per_bit_opt(testPrimStrings:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testPrimStrings_cases(?PER)),
+
+ ?line ?uper_bin(testPrimStrings:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testPrimStrings_cases(uper_bin)),
+
+ ?line testPrimStrings:compile(Config,?PER,[optimize]),
+ ?line testPrimStrings_cases(?PER).
+
+testPrimStrings_cases(Rules) ->
+ ?line testPrimStrings:bit_string(Rules),
+ ?line testPrimStrings:bit_string_unnamed(Rules),
+ ?line testPrimStrings:octet_string(Rules),
+ ?line testPrimStrings:numeric_string(Rules),
+ ?line testPrimStrings:other_strings(Rules),
+ ?line testPrimStrings:universal_string(Rules),
+ ?line testPrimStrings:bmp_string(Rules),
+ ?line testPrimStrings:times(Rules),
+ ?line testPrimStrings:utf8_string(Rules).
+
+
+
+testPrimExternal(suite) -> [];
+testPrimExternal(Config) ->
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testPrimExternal:compile(Config,?BER,[]),
+ ?line testPrimExternal_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testPrimExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testPrimExternal_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testPrimExternal:compile(Config,?PER,[]),
+ ?line testPrimExternal_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testPrimExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testPrimExternal_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testPrimExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testPrimExternal_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testPrimExternal:compile(Config,?PER,[optimize]),
+ ?line testPrimExternal_cases(?PER).
+
+testPrimExternal_cases(Rules) ->
+ ?line testPrimExternal:external(Rules).
+
+
+
+
+testChoPrim(suite) -> [];
+testChoPrim(Config) ->
+
+ ?line testChoPrim:compile(Config,?BER,[]),
+ ?line testChoPrim_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoPrim:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoPrim_cases(?BER)),
+
+ ?line testChoPrim:compile(Config,?PER,[]),
+ ?line testChoPrim_cases(?PER),
+
+ ?line ?per_bit_opt(testChoPrim:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoPrim_cases(?PER)),
+
+ ?line ?uper_bin(testChoPrim:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoPrim_cases(uper_bin)),
+
+ ?line testChoPrim:compile(Config,?PER,[optimize]),
+ ?line testChoPrim_cases(?PER).
+
+testChoPrim_cases(Rules) ->
+ ?line testChoPrim:bool(Rules),
+ ?line testChoPrim:int(Rules).
+
+
+
+testChoExtension(suite) -> [];
+testChoExtension(Config) ->
+
+ ?line testChoExtension:compile(Config,?BER,[]),
+ ?line testChoExtension_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoExtension:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoExtension_cases(?BER)),
+
+ ?line testChoExtension:compile(Config,?PER,[]),
+ ?line testChoExtension_cases(?PER),
+
+ ?line ?per_bit_opt(testChoExtension:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoExtension_cases(?PER)),
+
+ ?line ?uper_bin(testChoExtension:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoExtension_cases(uper_bin)),
+
+ ?line testChoExtension:compile(Config,?PER,[optimize]),
+ ?line testChoExtension_cases(?PER).
+
+testChoExtension_cases(Rules) ->
+ ?line testChoExtension:extension(Rules).
+
+
+
+testChoExternal(suite) -> [];
+testChoExternal(Config) ->
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testChoExternal:compile(Config,?BER,[]),
+ ?line testChoExternal_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoExternal_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testChoExternal:compile(Config,?PER,[]),
+ ?line testChoExternal_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoExternal_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoExternal_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testChoExternal:compile(Config,?PER,[optimize]),
+ ?line testChoExternal_cases(?PER).
+
+
+testChoExternal_cases(Rules) ->
+ ?line testChoExternal:external(Rules).
+
+
+
+testChoOptional(suite) -> [];
+testChoOptional(Config) ->
+
+ ?line testChoOptional:compile(Config,?BER,[]),
+ ?line testChoOptional_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoOptional:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoOptional_cases(?BER)),
+
+ ?line testChoOptional:compile(Config,?PER,[]),
+ ?line testChoOptional_cases(?PER),
+
+ ?line ?per_bit_opt(testChoOptional:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoOptional_cases(?PER)),
+
+ ?line ?uper_bin(testChoOptional:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoOptional_cases(uper_bin)),
+
+ ?line testChoOptional:compile(Config,?PER,[optimize]),
+ ?line testChoOptional_cases(?PER).
+
+testChoOptional_cases(Rules) ->
+ ?line testChoOptional:optional(Rules).
+
+testChoOptionalImplicitTag(suite) -> [];
+testChoOptionalImplicitTag(Config) ->
+ %% Only meaningful for ?BER
+ ?line testChoOptionalImplicitTag:compile(Config,?BER),
+ ?line testChoOptionalImplicitTag:optional(?BER).
+
+
+testChoRecursive(suite) -> [];
+testChoRecursive(Config) ->
+
+ ?line testChoRecursive:compile(Config,?BER,[]),
+ ?line testChoRecursive_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoRecursive:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoRecursive_cases(?BER)),
+
+ ?line testChoRecursive:compile(Config,?PER,[]),
+ ?line testChoRecursive_cases(?PER),
+
+ ?line ?per_bit_opt(testChoRecursive:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoRecursive_cases(?PER)),
+
+ ?line ?uper_bin(testChoRecursive:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoRecursive_cases(uper_bin)),
+
+ ?line testChoRecursive:compile(Config,?PER,[optimize]),
+ ?line testChoRecursive_cases(?PER).
+
+testChoRecursive_cases(Rules) ->
+ ?line testChoRecursive:recursive(Rules).
+
+
+
+testChoTypeRefCho(suite) -> [];
+testChoTypeRefCho(Config) ->
+
+ ?line testChoTypeRefCho:compile(Config,?BER,[]),
+ ?line testChoTypeRefCho_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoTypeRefCho:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoTypeRefCho_cases(?BER)),
+
+ ?line testChoTypeRefCho:compile(Config,?PER,[]),
+ ?line testChoTypeRefCho_cases(?PER),
+
+ ?line ?per_bit_opt(testChoTypeRefCho:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoTypeRefCho_cases(?PER)),
+
+ ?line ?uper_bin(testChoTypeRefCho:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoTypeRefCho_cases(uper_bin)),
+
+ ?line testChoTypeRefCho:compile(Config,?PER,[optimize]),
+ ?line testChoTypeRefCho_cases(?PER).
+
+testChoTypeRefCho_cases(Rules) ->
+ ?line testChoTypeRefCho:choice(Rules).
+
+
+
+testChoTypeRefPrim(suite) -> [];
+testChoTypeRefPrim(Config) ->
+
+ ?line testChoTypeRefPrim:compile(Config,?BER,[]),
+ ?line testChoTypeRefPrim_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoTypeRefPrim:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoTypeRefPrim_cases(?BER)),
+
+ ?line testChoTypeRefPrim:compile(Config,?PER,[]),
+ ?line testChoTypeRefPrim_cases(?PER),
+
+ ?line ?per_bit_opt(testChoTypeRefPrim:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoTypeRefPrim_cases(?PER)),
+
+ ?line ?uper_bin(testChoTypeRefPrim:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoTypeRefPrim_cases(uper_bin)),
+
+ ?line testChoTypeRefPrim:compile(Config,?PER,[optimize]),
+ ?line testChoTypeRefPrim_cases(?PER).
+
+testChoTypeRefPrim_cases(Rules) ->
+ ?line testChoTypeRefPrim:prim(Rules).
+
+
+
+testChoTypeRefSeq(suite) -> [];
+testChoTypeRefSeq(Config) ->
+
+ ?line testChoTypeRefSeq:compile(Config,?BER,[]),
+ ?line testChoTypeRefSeq_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoTypeRefSeq:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoTypeRefSeq_cases(?BER)),
+
+ ?line testChoTypeRefSeq:compile(Config,?PER,[]),
+ ?line testChoTypeRefSeq_cases(?PER),
+
+ ?line ?per_bit_opt(testChoTypeRefSeq:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoTypeRefSeq_cases(?PER)),
+
+ ?line ?uper_bin(testChoTypeRefSeq:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoTypeRefSeq_cases(uper_bin)),
+
+ ?line testChoTypeRefSeq:compile(Config,?PER,[optimize]),
+ ?line testChoTypeRefSeq_cases(?PER).
+
+testChoTypeRefSeq_cases(Rules) ->
+ ?line testChoTypeRefSeq:seq(Rules).
+
+
+
+testChoTypeRefSet(suite) -> [];
+testChoTypeRefSet(Config) ->
+
+ ?line testChoTypeRefSet:compile(Config,?BER,[]),
+ ?line testChoTypeRefSet_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoTypeRefSet:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoTypeRefSet_cases(?BER)),
+
+ ?line testChoTypeRefSet:compile(Config,?PER,[]),
+ ?line testChoTypeRefSet_cases(?PER),
+
+ ?line ?per_bit_opt(testChoTypeRefSet:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoTypeRefSet_cases(?PER)),
+
+ ?line ?uper_bin(testChoTypeRefSet:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoTypeRefSet_cases(uper_bin)),
+
+ ?line testChoTypeRefSet:compile(Config,?PER,[optimize]),
+ ?line testChoTypeRefSet_cases(?PER).
+
+testChoTypeRefSet_cases(Rules) ->
+ ?line testChoTypeRefSet:set(Rules).
+
+
+
+testDef(suite) -> [];
+testDef(Config) ->
+
+ ?line testDef:compile(Config,?BER,[]),
+ ?line testDef_cases(?BER),
+
+ ?line ?ber_driver(?BER,testDef:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testDef_cases(?BER)),
+
+ ?line testDef:compile(Config,?PER,[]),
+ ?line testDef_cases(?PER),
+
+ ?line ?per_bit_opt(testDef:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testDef_cases(?PER)),
+
+ ?line ?uper_bin(testDef:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testDef_cases(uper_bin)),
+
+ ?line testDef:compile(Config,?PER,[optimize]),
+ ?line testDef_cases(?PER).
+
+testDef_cases(Rules) ->
+ ?line testDef:main(Rules).
+
+
+
+testOpt(suite) -> [];
+testOpt(Config) ->
+
+ ?line testOpt:compile(Config,?BER),
+ ?line testOpt_cases(?BER),
+
+ ?line testOpt:compile(Config,?PER),
+ ?line testOpt_cases(?PER).
+
+testOpt_cases(Rules) ->
+ ?line testOpt:main(Rules).
+
+
+testEnumExt(suite) -> [];
+testEnumExt(Config) ->
+
+ ?line testEnumExt:compile(Config,?BER,[]),
+ ?line testEnumExt:main(?BER),
+
+ ?line ?ber_driver(?BER,testEnumExt:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testEnumExt:main(?BER)),
+
+ ?line testEnumExt:compile(Config,?PER,[]),
+ ?line testEnumExt:main(?PER),
+
+ ?line ?per_bit_opt(testEnumExt:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testEnumExt:main(?PER)),
+
+ ?line ?uper_bin(testEnumExt:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testEnumExt:main(uper_bin)),
+
+ ?line testEnumExt:compile(Config,?PER,[optimize]),
+ ?line testEnumExt:main(?PER).
+
+testSeqDefault(doc) -> ["Test of OTP-2523 ENUMERATED with extensionmark."];
+testSeqDefault(suite) -> [];
+testSeqDefault(Config) ->
+
+ ?line testSeqDefault:compile(Config,?BER,[]),
+ ?line testSeqDefault_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqDefault:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqDefault_cases(?BER)),
+
+ ?line testSeqDefault:compile(Config,?PER,[]),
+ ?line testSeqDefault_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqDefault:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqDefault_cases(?PER)),
+
+ ?line ?uper_bin(testSeqDefault:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqDefault_cases(uper_bin)),
+
+ ?line testSeqDefault:compile(Config,?PER,[optimize]),
+ ?line testSeqDefault_cases(?PER).
+
+testSeqDefault_cases(Rules) ->
+ ?line testSeqDefault:main(Rules).
+
+
+
+testSeqExtension(suite) -> [];
+testSeqExtension(Config) ->
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSeqExtension:compile(Config,?BER,[]),
+ ?line testSeqExtension_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqExtension:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqExtension_cases(?BER)).
+
+testSeqExtension_cases(Rules) ->
+ ?line testSeqExtension:main(Rules).
+
+
+
+testSeqExternal(suite) -> [];
+testSeqExternal(Config) ->
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSeqExternal:compile(Config,?BER,[]),
+ ?line testSeqExternal_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqExternal_cases(?BER)).
+
+testSeqExternal_cases(Rules) ->
+ ?line testSeqExternal:main(Rules).
+
+
+testSeqOptional(suite) -> [];
+testSeqOptional(Config) ->
+
+ ?line testSeqOptional:compile(Config,?BER,[]),
+ ?line testSeqOptional_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqOptional:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOptional_cases(?BER)),
+
+ ?line testSeqOptional:compile(Config,?PER,[]),
+ ?line testSeqOptional_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqOptional:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqOptional_cases(?PER)),
+
+ ?line ?uper_bin(testSeqOptional:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqOptional_cases(uper_bin)),
+
+ ?line testSeqOptional:compile(Config,?PER,[optimize]),
+ ?line testSeqOptional_cases(?PER).
+
+testSeqOptional_cases(Rules) ->
+ ?line testSeqOptional:main(Rules).
+
+
+
+testSeqPrim(suite) -> [];
+testSeqPrim(Config) ->
+
+ ?line testSeqPrim:compile(Config,?BER,[]),
+ ?line testSeqPrim_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqPrim:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqPrim_cases(?BER)),
+
+ ?line testSeqPrim:compile(Config,?PER,[]),
+ ?line testSeqPrim_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqPrim:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqPrim_cases(?PER)),
+
+ ?line ?uper_bin(testSeqPrim:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqPrim_cases(uper_bin)),
+
+ ?line testSeqPrim:compile(Config,?PER,[optimize]),
+ ?line testSeqPrim_cases(?PER).
+
+testSeqPrim_cases(Rules) ->
+ ?line testSeqPrim:main(Rules).
+
+
+testSeq2738(doc) -> ["Test of OTP-2738 Detect corrupt optional component."];
+testSeq2738(suite) -> [];
+testSeq2738(Config) ->
+
+ ?line testSeq2738:compile(Config,?BER,[]),
+ ?line testSeq2738_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeq2738:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeq2738_cases(?BER)),
+
+ ?line testSeq2738:compile(Config,?PER,[]),
+ ?line testSeq2738_cases(?PER),
+
+ ?line ?per_bit_opt(testSeq2738:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeq2738_cases(?PER)),
+
+ ?line ?uper_bin(testSeq2738:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeq2738_cases(uper_bin)),
+
+ ?line testSeq2738:compile(Config,?PER,[optimize]),
+ ?line testSeq2738_cases(?PER).
+
+testSeq2738_cases(Rules) ->
+ ?line testSeq2738:main(Rules).
+
+
+testSeqTag(suite) -> [];
+testSeqTag(Config) ->
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSeqTag:compile(Config,?BER,[]),
+ ?line testSeqTag_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqTag:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqTag_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testSeqTag:compile(Config,?PER,[]),
+ ?line testSeqTag_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqTag:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqTag_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqTag:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqTag_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testSeqTag:compile(Config,?PER,[optimize]),
+ ?line testSeqTag_cases(?PER).
+
+testSeqTag_cases(Rules) ->
+ ?line testSeqTag:main(Rules).
+
+
+
+
+testSeqTypeRefCho(suite) -> [];
+testSeqTypeRefCho(Config) ->
+
+ ?line testSeqTypeRefCho:compile(Config,?BER,[]),
+ ?line testSeqTypeRefCho_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqTypeRefCho:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqTypeRefCho_cases(?BER)),
+
+ ?line testSeqTypeRefCho:compile(Config,?PER,[]),
+ ?line testSeqTypeRefCho_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqTypeRefCho:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqTypeRefCho_cases(?PER)),
+
+ ?line ?uper_bin(testSeqTypeRefCho:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqTypeRefCho_cases(uper_bin)),
+
+ ?line testSeqTypeRefCho:compile(Config,?PER,[optimize]),
+ ?line testSeqTypeRefCho_cases(?PER).
+
+testSeqTypeRefCho_cases(Rules) ->
+ ?line testSeqTypeRefCho:main(Rules).
+
+
+
+testSeqTypeRefPrim(suite) -> [];
+testSeqTypeRefPrim(Config) ->
+
+ ?line testSeqTypeRefPrim:compile(Config,?BER,[]),
+ ?line testSeqTypeRefPrim_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqTypeRefPrim:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqTypeRefPrim_cases(?BER)),
+
+ ?line testSeqTypeRefPrim:compile(Config,?PER,[]),
+ ?line testSeqTypeRefPrim_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqTypeRefPrim:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqTypeRefPrim_cases(?PER)),
+
+ ?line ?uper_bin(testSeqTypeRefPrim:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqTypeRefPrim_cases(uper_bin)),
+
+ ?line testSeqTypeRefPrim:compile(Config,?PER,[optimize]),
+ ?line testSeqTypeRefPrim_cases(?PER).
+
+testSeqTypeRefPrim_cases(Rules) ->
+ ?line testSeqTypeRefPrim:main(Rules).
+
+
+
+testSeqTypeRefSeq(suite) -> [];
+testSeqTypeRefSeq(Config) ->
+
+ ?line testSeqTypeRefSeq:compile(Config,?BER,[]),
+ ?line testSeqTypeRefSeq_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqTypeRefSeq:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqTypeRefSeq_cases(?BER)),
+
+ ?line testSeqTypeRefSeq:compile(Config,?PER,[]),
+ ?line testSeqTypeRefSeq_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqTypeRefSeq:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqTypeRefSeq_cases(?PER)),
+
+ ?line ?uper_bin(testSeqTypeRefSeq:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqTypeRefSeq_cases(uper_bin)),
+
+ ?line testSeqTypeRefSeq:compile(Config,?PER,[optimize]),
+ ?line testSeqTypeRefSeq_cases(?PER).
+
+testSeqTypeRefSeq_cases(Rules) ->
+ ?line testSeqTypeRefSeq:main(Rules).
+
+
+
+testSeqTypeRefSet(suite) -> [];
+testSeqTypeRefSet(Config) ->
+
+ ?line testSeqTypeRefSet:compile(Config,?BER,[]),
+ ?line testSeqTypeRefSet_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqTypeRefSet:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqTypeRefSet_cases(?BER)),
+
+ ?line testSeqTypeRefSet:compile(Config,?PER,[]),
+ ?line testSeqTypeRefSet_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqTypeRefSet:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqTypeRefSet_cases(?PER)),
+
+ ?line ?uper_bin(testSeqTypeRefSet:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqTypeRefSet_cases(uper_bin)),
+
+ ?line testSeqTypeRefSet:compile(Config,?PER,[optimize]),
+ ?line testSeqTypeRefSet_cases(?PER).
+
+testSeqTypeRefSet_cases(Rules) ->
+ ?line testSeqTypeRefSet:main(Rules).
+
+
+
+
+testSeqOf(suite) -> [];
+testSeqOf(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSeqOf:compile(Config,?BER,[]),
+ ?line testSeqOf_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqOf:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOf_cases(?BER)),
+
+ ?line testSeqOf:compile(Config,?PER,[]),
+ ?line testSeqOf_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqOf:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqOf_cases(?PER)),
+
+ ?line ?uper_bin(testSeqOf:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqOf_cases(uper_bin)),
+
+ ?line testSeqOf:compile(Config,?PER,[optimize]),
+ ?line testSeqOf_cases(?PER).
+
+testSeqOf_cases(Rules) ->
+ ?line testSeqOf:main(Rules).
+
+
+
+
+testSeqOfCho(suite) -> [];
+testSeqOfCho(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSeqOfCho:compile(Config,?BER,[]),
+ ?line testSeqOfCho_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqOfCho:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOfCho_cases(?BER)),
+
+ ?line testSeqOfCho:compile(Config,?PER,[]),
+ ?line testSeqOfCho_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqOfCho:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqOfCho_cases(?PER)),
+
+ ?line ?uper_bin(testSeqOfCho:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqOfCho_cases(uper_bin)),
+
+ ?line testSeqOfCho:compile(Config,?PER,[optimize]),
+ ?line testSeqOfCho_cases(?PER).
+
+testSeqOfIndefinite(suite) -> [];
+testSeqOfIndefinite(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSeqOfIndefinite:compile(Config,?BER,[]),
+ ?line testSeqOfIndefinite:main(),
+
+ ?line ?ber_driver(?BER,testSeqOfIndefinite:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOfIndefinite:main()).
+
+testSeqOfCho_cases(Rules) ->
+ ?line testSeqOfCho:main(Rules).
+
+
+testSeqOfExternal(suite) -> [];
+testSeqOfExternal(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSeqOfExternal:compile(Config,?BER,[]),
+ ?line testSeqOfExternal_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOfExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOfExternal_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testSeqOfExternal:compile(Config,?PER,[]),
+ ?line testSeqOfExternal_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqOfExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqOfExternal_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqOfExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqOfExternal_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testSeqOfExternal:compile(Config,?PER,[optimize]),
+ ?line testSeqOfExternal_cases(?PER).
+
+testSeqOfExternal_cases(Rules) ->
+ ?line testSeqOfExternal:main(Rules).
+
+
+
+testSeqOfTag(suite) -> [];
+testSeqOfTag(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSeqOfTag:compile(Config,?BER,[]),
+ ?line testSeqOfTag_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOfTag:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOfTag_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testSeqOfTag:compile(Config,?PER,[]),
+ ?line testSeqOfTag_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqOfTag:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqOfTag_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqOfTag:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqOfTag_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testSeqOfTag:compile(Config,?PER,[optimize]),
+ ?line testSeqOfTag_cases(?PER).
+
+testSeqOfTag_cases(Rules) ->
+ ?line testSeqOfTag:main(Rules).
+
+
+
+
+testSetDefault(suite) -> [];
+testSetDefault(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetDefault:compile(Config,?BER,[]),
+ ?line testSetDefault_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetDefault:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetDefault_cases(?BER)),
+
+ ?line testSetDefault:compile(Config,?PER,[]),
+ ?line testSetDefault_cases(?PER),
+
+ ?line ?per_bit_opt(testSetDefault:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetDefault_cases(?PER)),
+
+ ?line ?uper_bin(testSetDefault:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetDefault_cases(uper_bin)),
+
+ ?line testSetDefault:compile(Config,?PER,[optimize]),
+ ?line testSetDefault_cases(?PER).
+
+testSetDefault_cases(Rules) ->
+ ?line testSetDefault:main(Rules).
+
+
+testParamBasic(suite) -> [];
+testParamBasic(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testParamBasic:compile(Config,?BER,[]),
+ ?line testParamBasic_cases(?BER),
+
+ ?line ?ber_driver(?BER,testParamBasic:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testParamBasic_cases(?BER)),
+
+ ?line testParamBasic:compile(Config,?PER,[]),
+ ?line testParamBasic_cases(?PER),
+
+ ?line ?per_bit_opt(testParamBasic:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testParamBasic_cases(?PER)),
+
+ ?line ?uper_bin(testParamBasic:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testParamBasic_cases(uper_bin)),
+
+ ?line testParamBasic:compile(Config,?PER,[optimize]),
+ ?line testParamBasic_cases(?PER).
+
+
+testParamBasic_cases(Rules) ->
+ ?line testParamBasic:main(Rules).
+
+testSetExtension(suite) -> [];
+testSetExtension(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSetExtension:compile(Config,?BER,[]),
+ ?line testSetExtension_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetExtension:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetExtension_cases(?BER)).
+
+testSetExtension_cases(Rules) ->
+ ?line testSetExtension:main(Rules).
+
+
+testSetExternal(suite) -> [];
+testSetExternal(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSetExternal:compile(Config,?BER,[]),
+ ?line testSetExternal_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetExternal_cases(?BER)).
+
+testSetExternal_cases(Rules) ->
+ ?line testSetExternal:main(Rules).
+
+
+testSetOptional(suite) -> [];
+testSetOptional(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetOptional:compile(Config,?BER,[]),
+ ?line testSetOptional_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetOptional:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetOptional_cases(?BER)),
+
+ ?line testSetOptional:compile(Config,?PER,[]),
+ ?line testSetOptional_cases(?PER),
+
+ ?line ?per_bit_opt(testSetOptional:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetOptional_cases(?PER)),
+
+ ?line ?uper_bin(testSetOptional:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetOptional_cases(uper_bin)),
+
+ ?line testSetOptional:compile(Config,?PER,[optimize]),
+ ?line testSetOptional_cases(?PER).
+
+testSetOptional_cases(Rules) ->
+ ?line ok = testSetOptional:ticket_7533(Rules),
+ ?line ok = testSetOptional:main(Rules).
+
+
+
+
+testSetPrim(suite) -> [];
+testSetPrim(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetPrim:compile(Config,?BER,[]),
+ ?line testSetPrim_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetPrim:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetPrim_cases(?BER)),
+
+ ?line testSetPrim:compile(Config,?PER,[]),
+ ?line testSetPrim_cases(?PER),
+
+ ?line ?per_bit_opt(testSetPrim:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetPrim_cases(?PER)),
+
+ ?line ?uper_bin(testSetPrim:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetPrim_cases(uper_bin)),
+
+ ?line testSetPrim:compile(Config,?PER,[optimize]),
+ ?line testSetPrim_cases(?PER).
+
+testSetPrim_cases(Rules) ->
+ ?line testSetPrim:main(Rules).
+
+
+
+testSetTag(suite) -> [];
+testSetTag(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSetTag:compile(Config,?BER,[]),
+ ?line testSetTag_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetTag:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetTag_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testSetTag:compile(Config,?PER,[]),
+ ?line testSetTag_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetTag:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetTag_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetTag:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetTag_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testSetTag:compile(Config,?PER,[optimize]),
+ ?line testSetTag_cases(?PER).
+
+testSetTag_cases(Rules) ->
+ ?line testSetTag:main(Rules).
+
+
+
+testSetTypeRefCho(suite) -> [];
+testSetTypeRefCho(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetTypeRefCho:compile(Config,?BER,[]),
+ ?line testSetTypeRefCho_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetTypeRefCho:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetTypeRefCho_cases(?BER)),
+
+ ?line testSetTypeRefCho:compile(Config,?PER,[]),
+ ?line testSetTypeRefCho_cases(?PER),
+
+ ?line ?per_bit_opt(testSetTypeRefCho:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetTypeRefCho_cases(?PER)),
+
+ ?line ?uper_bin(testSetTypeRefCho:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetTypeRefCho_cases(uper_bin)),
+
+ ?line testSetTypeRefCho:compile(Config,?PER,[optimize]),
+ ?line testSetTypeRefCho_cases(?PER).
+
+testSetTypeRefCho_cases(Rules) ->
+ ?line testSetTypeRefCho:main(Rules).
+
+
+
+testSetTypeRefPrim(suite) -> [];
+testSetTypeRefPrim(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetTypeRefPrim:compile(Config,?BER,[]),
+ ?line testSetTypeRefPrim_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetTypeRefPrim:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetTypeRefPrim_cases(?BER)),
+
+ ?line testSetTypeRefPrim:compile(Config,?PER,[]),
+ ?line testSetTypeRefPrim_cases(?PER),
+
+ ?line ?per_bit_opt(testSetTypeRefPrim:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetTypeRefPrim_cases(?PER)),
+
+ ?line ?uper_bin(testSetTypeRefPrim:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetTypeRefPrim_cases(uper_bin)),
+
+ ?line testSetTypeRefPrim:compile(Config,?PER,[optimize]),
+ ?line testSetTypeRefPrim_cases(?PER).
+
+testSetTypeRefPrim_cases(Rules) ->
+ ?line testSetTypeRefPrim:main(Rules).
+
+
+
+testSetTypeRefSeq(suite) -> [];
+testSetTypeRefSeq(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetTypeRefSeq:compile(Config,?BER,[]),
+ ?line testSetTypeRefSeq_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetTypeRefSeq:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetTypeRefSeq_cases(?BER)),
+
+ ?line testSetTypeRefSeq:compile(Config,?PER,[]),
+ ?line testSetTypeRefSeq_cases(?PER),
+
+ ?line ?per_bit_opt(testSetTypeRefSeq:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetTypeRefSeq_cases(?PER)),
+
+ ?line ?uper_bin(testSetTypeRefSeq:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetTypeRefSeq_cases(uper_bin)),
+
+ ?line testSetTypeRefSeq:compile(Config,?PER,[optimize]),
+ ?line testSetTypeRefSeq_cases(?PER).
+
+testSetTypeRefSeq_cases(Rules) ->
+ ?line testSetTypeRefSeq:main(Rules).
+
+
+
+testSetTypeRefSet(suite) -> [];
+testSetTypeRefSet(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetTypeRefSet:compile(Config,?BER,[]),
+ ?line testSetTypeRefSet_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetTypeRefSet:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetTypeRefSet_cases(?BER)),
+
+ ?line testSetTypeRefSet:compile(Config,?PER,[]),
+ ?line testSetTypeRefSet_cases(?PER),
+
+ ?line ?per_bit_opt(testSetTypeRefSet:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetTypeRefSet_cases(?PER)),
+
+ ?line ?uper_bin(testSetTypeRefSet:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetTypeRefSet_cases(uper_bin)),
+
+ ?line testSetTypeRefSet:compile(Config,?PER,[optimize]),
+ ?line testSetTypeRefSet_cases(?PER).
+
+testSetTypeRefSet_cases(Rules) ->
+ ?line testSetTypeRefSet:main(Rules).
+
+
+
+testSetOf(suite) -> [];
+testSetOf(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetOf:compile(Config,?BER,[]),
+ ?line testSetOf_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetOf:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetOf_cases(?BER)),
+
+ ?line testSetOf:compile(Config,?PER,[]),
+ ?line testSetOf_cases(?PER),
+
+ ?line ?per_bit_opt(testSetOf:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetOf_cases(?PER)),
+
+ ?line ?uper_bin(testSetOf:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetOf_cases(uper_bin)),
+
+ ?line testSetOf:compile(Config,?PER,[optimize]),
+ ?line testSetOf_cases(?PER).
+
+testSetOf_cases(Rules) ->
+ ?line testSetOf:main(Rules).
+
+
+
+testSetOfCho(suite) -> [];
+testSetOfCho(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetOfCho:compile(Config,?BER,[]),
+ ?line testSetOfCho_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetOfCho:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetOfCho_cases(?BER)),
+
+ ?line testSetOfCho:compile(Config,?PER,[]),
+ ?line testSetOfCho_cases(?PER),
+
+ ?line ?per_bit_opt(testSetOfCho:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetOfCho_cases(?PER)),
+
+ ?line ?uper_bin(testSetOfCho:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetOfCho_cases(uper_bin)),
+
+ ?line testSetOfCho:compile(Config,?PER,[optimize]),
+ ?line testSetOfCho_cases(?PER).
+
+testSetOfCho_cases(Rules) ->
+ ?line testSetOfCho:main(Rules).
+
+
+testSetOfExternal(suite) -> [];
+testSetOfExternal(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSetOfExternal:compile(Config,?BER,[]),
+ ?line testSetOfExternal_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetOfExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetOfExternal_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testSetOfExternal:compile(Config,?PER,[]),
+ ?line testSetOfExternal_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetOfExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetOfExternal_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetOfExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetOfExternal_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testSetOfExternal:compile(Config,?PER,[optimize]),
+ ?line testSetOfExternal_cases(?PER).
+
+testSetOfExternal_cases(Rules) ->
+ ?line testSetOfExternal:main(Rules).
+
+
+
+
+testSetOfTag(suite) -> [];
+testSetOfTag(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSetOfTag:compile(Config,?BER,[]),
+ ?line testSetOfTag_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetOfTag:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetOfTag_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testSetOfTag:compile(Config,?PER,[]),
+ ?line testSetOfTag_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetOfTag:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetOfTag_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetOfTag:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetOfTag_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testSetOfTag:compile(Config,?PER,[optimize]),
+ ?line testSetOfTag_cases(?PER).
+
+testSetOfTag_cases(Rules) ->
+ ?line testSetOfTag:main(Rules).
+
+
+c_syntax(suite) -> [];
+c_syntax(Config) ->
+ ?line DataDir% ?line testExternal:compile(Config,?PER),
+% ?line testPrimExternal:compile(Config,?PER),
+% ?line testPrimExternal_cases(?PER).
+ = ?config(data_dir,Config),
+ ?line _TempDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line {error,_R1} = asn1ct:compile(filename:join(DataDir,"Syntax")),
+ ?line {error,_R2} = asn1ct:compile(filename:join(DataDir,"BadTypeEnding")),
+ ?line {error,_R3} = asn1ct:compile(filename:join(DataDir,
+ "BadValueAssignment1")),
+ ?line {error,_R4} = asn1ct:compile(filename:join(DataDir,
+ "BadValueAssignment2")),
+ ?line {error,_R5} = asn1ct:compile(filename:join(DataDir,
+ "BadValueSet")),
+ ?line {error,_R6} = asn1ct:compile(filename:join(DataDir,
+ "ChoiceBadExtension")),
+ ?line {error,_R7} = asn1ct:compile(filename:join(DataDir,
+ "EnumerationBadExtension")),
+ ?line {error,_R8} = asn1ct:compile(filename:join(DataDir,
+ "Example")),
+ ?line {error,_R9} = asn1ct:compile(filename:join(DataDir,
+ "Export1")),
+ ?line {error,_R10} = asn1ct:compile(filename:join(DataDir,
+ "MissingEnd")),
+ ?line {error,_R11} = asn1ct:compile(filename:join(DataDir,
+ "SequenceBadComma")),
+ ?line {error,_R12} = asn1ct:compile(filename:join(DataDir,
+ "SequenceBadComponentName")),
+ ?line {error,_R13} = asn1ct:compile(filename:join(DataDir,
+ "SequenceBadComponentType")),
+ ?line {error,_R14} = asn1ct:compile(filename:join(DataDir,
+ "SeqBadComma")).
+
+
+c_string_per(suite) -> [];
+c_string_per(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line TempDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"String"),[?PER,{outdir,TempDir}]).
+
+c_string_ber(suite) -> [];
+c_string_ber(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line TempDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"String"),[?BER,{outdir,TempDir}]).
+
+
+c_implicit_before_choice(suite) -> [];
+c_implicit_before_choice(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line TempDir = ?config(priv_dir,Config),
+ ?line {error,_R2} = asn1ct:compile(filename:join(DataDir,"CCSNARG3"),[?BER,{outdir,TempDir}]).
+
+parse(suite) -> [];
+parse(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ M1 = test_modules(),
+% M2 = parse_modules(),
+ ?line ok = parse1(M1,DataDir,OutDir).
+
+parse1([M|T],DataDir,OutDir) ->
+ ?line ok = asn1ct:compile(DataDir ++ M,[abs,{outdir,OutDir}]),
+ parse1(T,DataDir,OutDir);
+parse1([],_,_) ->
+ ok.
+
+per(suite) -> [];
+per(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = per1(per_modules(),DataDir,OutDir),
+ ?line ?per_bit_opt(per1_bit_opt(per_modules(),DataDir,OutDir)),
+ ?line ok = per1_opt(per_modules(),DataDir,OutDir).
+
+
+per1([M|T],DataDir,OutDir) ->
+ ?line ok = asn1ct:compile(DataDir ++ M,[?PER,{outdir,OutDir}]),
+ ?line ok = asn1ct:test(list_to_atom(M)),
+ per1(T,DataDir,OutDir);
+per1([],_,_) ->
+ ok.
+
+per1_bit_opt([M|T],DataDir,OutDir) ->
+ ?line ok = asn1ct:compile(DataDir ++ M,[?PER,optimize,{outdir,OutDir}]),
+ ?line ok = asn1ct:test(list_to_atom(M)),
+ per1_bit_opt(T,DataDir,OutDir);
+per1_bit_opt([],_,_) ->
+ ok.
+
+per1_opt([M|T],DataDir,OutDir) ->
+ ?line ok = asn1ct:compile(DataDir ++ M,[?PER,optimized,{outdir,OutDir}]),
+ ?line ok = asn1ct:test(list_to_atom(M)),
+ per1_opt(T,DataDir,OutDir);
+per1_opt([],_,_) ->
+ ok.
+
+
+ber_choiceinseq(suite) ->[];
+ber_choiceinseq(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"ChoiceInSeq"),[?BER,{outdir,OutDir}]).
+
+ber_optional(suite) ->[];
+ber_optional(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"SOpttest"),[?BER,{outdir,OutDir}]),
+ ?line V = {'S',{'A',10,asn1_NOVALUE,asn1_NOVALUE},
+ {'B',asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE},
+ {'C',asn1_NOVALUE,111,asn1_NOVALUE}},
+ ?line {ok,B} = asn1_wrapper:encode('SOpttest','S',V),
+ ?line Bytes = lists:flatten(B),
+ ?line V2 = asn1_wrapper:decode('SOpttest','S',Bytes),
+ ?line ok = eq(V,element(2,V2)).
+
+ber_optional_keyed_list(suite) ->[];
+ber_optional_keyed_list(Config) ->
+ case ?BER of
+ ber_bin_v2 -> ok;
+ _ ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"SOpttest"),
+ [?BER,keyed_list,{outdir,OutDir}]),
+ ?line Vrecord = {'S',{'A',10,asn1_NOVALUE,asn1_NOVALUE},
+ {'B',asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE},
+ {'C',asn1_NOVALUE,111,asn1_NOVALUE}},
+ ?line V = [ {a,[{scriptKey,10}]},
+ {b,[]},
+ {c,[{callingPartysCategory,111}]} ],
+ ?line {ok,B} = asn1_wrapper:encode('SOpttest','S',V),
+ ?line Bytes = lists:flatten(B),
+ ?line V2 = asn1_wrapper:decode('SOpttest','S',Bytes),
+ ?line ok = eq(Vrecord,element(2,V2))
+ end.
+
+
+eq(V,V) ->
+ ok.
+
+
+ber_other(suite) ->[];
+ber_other(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = ber1(ber_modules(),DataDir,OutDir).
+
+
+ber1([M|T],DataDir,OutDir) ->
+ ?line ok = asn1ct:compile(DataDir ++ M,[?BER,{outdir,OutDir}]),
+ ?line ok = asn1ct:test(list_to_atom(M)),
+ ber1(T,DataDir,OutDir);
+ber1([],_,_) ->
+ ok.
+
+default_per(suite) ->[];
+default_per(Config) ->
+ default1(?PER,Config,[]).
+
+default_per_opt(suite) -> [];
+default_per_opt(Config) ->
+ ?per_bit_opt(default1(?PER,Config,[optimize])),
+ default1(?PER,Config,[optimize]).
+
+default_ber(suite) ->[];
+default_ber(Config) ->
+ default1(?BER,Config,[]).
+
+default1(Rule,Config,Options) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(DataDir ++ "Def",[Rule,{outdir,OutDir}]++Options),
+ ?line {ok,Bytes1} = asn1_wrapper:encode('Def','Def1',#'Def1'{bool0 = true,
+ bool1 = true,
+ bool2 = true,
+ bool3 = true}),
+ ?line {ok,{'Def1',true,true,true,true}} = asn1_wrapper:decode('Def','Def1',lists:flatten(Bytes1)),
+
+ ?line {ok,Bytes2} = asn1_wrapper:encode('Def','Def1',#'Def1'{bool0 = true}),
+ ?line {ok,{'Def1',true,false,false,false}} = asn1_wrapper:decode('Def','Def1',lists:flatten(Bytes2)),
+
+ ?line {ok,Bytes3} = asn1_wrapper:encode('Def','Def1',#'Def1'{bool0 = true,bool2=false}),
+ ?line {ok,{'Def1',true,false,false,false}} = asn1_wrapper:decode('Def','Def1',lists:flatten(Bytes3)).
+
+
+value_test(suite) ->[];
+value_test(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(DataDir ++ "ObjIdValues",[?BER,{outdir,OutDir}]),
+ ?line {ok,_} = asn1_wrapper:encode('ObjIdValues','ObjIdType','ObjIdValues':'mobileDomainId'()),
+ ?line ok = asn1ct:compile(DataDir ++ "ObjIdValues",[?PER,{outdir,OutDir}]),
+ ?line {ok,_} = asn1_wrapper:encode('ObjIdValues','ObjIdType','ObjIdValues':'mobileDomainId'()),
+ ?line ok = test_bad_values:tests(Config),
+ ok.
+
+
+constructed(suite) ->
+ [];
+constructed(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(DataDir ++ "Constructed",[?BER,{outdir,OutDir}]),
+ ?line {ok,B} = asn1_wrapper:encode('Constructed','S',{'S',false}),
+ ?line [40,3,1,1,0] = lists:flatten(B),
+ ?line {ok,B1} = asn1_wrapper:encode('Constructed','S2',{'S2',false}),
+ ?line [40,5,48,3,1,1,0] = lists:flatten(B1),
+ ?line {ok,B2} = asn1_wrapper:encode('Constructed','I',10),
+ ?line [136,1,10] = lists:flatten(B2),
+ ok.
+
+ber_decode_error(suite) -> [];
+ber_decode_error(Config) ->
+ ?line ok = ber_decode_error:compile(Config,?BER,[]),
+ ?line ok = ber_decode_error:run([]),
+
+ ?line ok = ?ber_driver(?BER,ber_decode_error:compile(Config,?BER,[driver])),
+ ?line ok = ?ber_driver(?BER,ber_decode_error:run([driver])),
+ ok.
+
+h323test(suite) ->
+ [];
+h323test(Config) ->
+ ?line ok = h323test:compile(Config,?PER,[]),
+ ?line ok = h323test:run(?PER),
+ ?line ?per_bit_opt(h323test:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(h323test:run(?PER)),
+ ?line ?uper_bin(h323test:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(h323test:run(uper_bin)),
+ ?line ok = h323test:compile(Config,?PER,[optimize]),
+ ?line ok = h323test:run(?PER),
+ ok.
+
+per_GeneralString(suite) ->
+ [];
+per_GeneralString(Config) ->
+ case erlang:module_loaded('MULTIMEDIA-SYSTEM-CONTROL') of
+ true ->
+ ok;
+ false ->
+ h323test:compile(Config,?PER,[])
+ end,
+ UI = [109,64,1,57],
+ ?line {ok,_V} = asn1_wrapper:decode('MULTIMEDIA-SYSTEM-CONTROL',
+ 'MultimediaSystemControlMessage',UI).
+
+per_open_type(suite) ->
+ [];
+per_open_type(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line ok = asn1ct:compile(DataDir ++ "OpenType",[?PER,{outdir,OutDir}]),
+ Stype = {'Stype',10,true},
+ ?line {ok,Bytes} = asn1_wrapper:encode('OpenType','Ot',Stype),
+ ?line {ok,Stype} = asn1_wrapper:decode('OpenType','Ot',Bytes),
+
+ ?line ?per_bit_opt(ok = asn1ct:compile(DataDir ++ "OpenType",
+ [?PER,optimize,{outdir,OutDir}])),
+ ?line ?per_bit_opt({ok,Bytes}=asn1_wrapper:encode('OpenType','Ot',Stype)),
+ ?line ?per_bit_opt({ok,Stype}=asn1_wrapper:decode('OpenType','Ot',Bytes)),
+
+ ?line ?uper_bin(ok = asn1ct:compile(DataDir ++ "OpenType",
+ [uper_bin,{outdir,OutDir}])),
+ ?line ?uper_bin({ok,Bytes}=asn1_wrapper:encode('OpenType','Ot',Stype)),
+ ?line ?uper_bin({ok,Stype}=asn1_wrapper:decode('OpenType','Ot',Bytes)),
+
+ ?line ok = asn1ct:compile(DataDir ++ "OpenType",
+ [?PER,optimize,{outdir,OutDir}]),
+ ?line {ok,Bytes} = asn1_wrapper:encode('OpenType','Ot',Stype),
+ ?line {ok,Stype} = asn1_wrapper:decode('OpenType','Ot',Bytes).
+
+testConstraints(suite) ->
+ [];
+testConstraints(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testConstraints:compile(Config,?BER,[]),
+ ?line testConstraints:int_constraints(?BER),
+
+ ?line ?ber_driver(?BER,testConstraints:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testConstraints:int_constraints(?BER)),
+
+ ?line testConstraints:compile(Config,?PER,[]),
+ ?line testConstraints:int_constraints(?PER),
+ ?line testConstraints:refed_NNL_name(?PER),
+
+ ?line ?per_bit_opt(testConstraints:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testConstraints:int_constraints(?PER)),
+ ?line ?per_bit_opt(testConstraints:refed_NNL_name(?PER)),
+
+ ?line ?uper_bin(testConstraints:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testConstraints:int_constraints(uper_bin)),
+ ?line ?uper_bin(testConstraints:refed_NNL_name(uper_bin)),
+
+ ?line testConstraints:compile(Config,?PER,[optimize]),
+ ?line testConstraints:int_constraints(?PER),
+ ?line testConstraints:refed_NNL_name(?PER).
+
+testSeqIndefinite(suite) -> [];
+testSeqIndefinite(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSeqIndefinite:compile(Config,?BER,[]),
+ ?line testSeqIndefinite:main(?BER),
+
+ ?line ?ber_driver(?BER,testSeqIndefinite:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqIndefinite:main(?BER)).
+
+testSetIndefinite(suite) -> [];
+testSetIndefinite(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetIndefinite:compile(Config,?BER,[]),
+ ?line testSetIndefinite:main(?BER),
+
+ ?line ?ber_driver(?BER,testSetIndefinite:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetIndefinite:main(?BER)).
+
+testChoiceIndefinite(suite) -> [];
+testChoiceIndefinite(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testChoiceIndefinite:compile(Config,?BER,[]),
+ ?line testChoiceIndefinite:main(?BER),
+
+ ?line ?ber_driver(?BER,testChoiceIndefinite:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoiceIndefinite:main(?BER)).
+
+testInfObjectClass(suite) ->
+ [];
+testInfObjectClass(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testInfObjectClass:compile(Config,?PER,[]),
+ ?line testInfObjectClass:main(?PER),
+ ?line testInfObj:compile(Config,?PER,[]),
+ ?line testInfObj:main(?PER),
+
+ ?line ?per_bit_opt(testInfObjectClass:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testInfObjectClass:main(?PER)),
+ ?line ?per_bit_opt(testInfObj:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testInfObj:main(?PER)),
+
+ ?line ?uper_bin(testInfObjectClass:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testInfObjectClass:main(uper_bin)),
+ ?line ?uper_bin(testInfObj:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testInfObj:main(uper_bin)),
+
+ ?line testInfObjectClass:compile(Config,?PER,[optimize]),
+ ?line testInfObjectClass:main(?PER),
+ ?line testInfObj:compile(Config,?PER,[optimize]),
+ ?line testInfObj:main(?PER),
+
+ ?line testInfObjectClass:compile(Config,?BER,[]),
+ ?line testInfObjectClass:main(?BER),
+ ?line testInfObj:compile(Config,?BER,[]),
+ ?line testInfObj:main(?BER),
+
+ ?line ?ber_driver(?BER,testInfObjectClass:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testInfObjectClass:main(?BER)),
+ ?line ?ber_driver(?BER,testInfObj:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testInfObj:main(?BER)),
+
+ ?line testInfObj:compile_RANAPfiles(Config,?PER,[]),
+
+ ?line ?per_bit_opt(testInfObj:compile_RANAPfiles(Config,?PER,[optimize])),
+
+ ?line ?uper_bin(testInfObj:compile_RANAPfiles(Config,uper_bin,[])),
+
+ ?line testInfObj:compile_RANAPfiles(Config,?PER,[optimize]),
+
+ ?line testInfObj:compile_RANAPfiles(Config,?BER,[]).
+
+testParameterizedInfObj(suite) ->
+ [];
+testParameterizedInfObj(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testParameterizedInfObj:compile(Config,?PER,[]),
+ ?line testParameterizedInfObj:main(?PER),
+
+ ?line ?per_bit_opt(testParameterizedInfObj:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testParameterizedInfObj:main(?PER)),
+
+ ?line ?uper_bin(testParameterizedInfObj:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testParameterizedInfObj:main(uper_bin)),
+
+ ?line testParameterizedInfObj:compile(Config,?PER,[optimize]),
+ ?line testParameterizedInfObj:main(?PER),
+
+ ?line testParameterizedInfObj:compile(Config,?BER,[]),
+ ?line testParameterizedInfObj:main(?BER),
+
+ ?line ?ber_driver(?BER,testParameterizedInfObj:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testParameterizedInfObj:main(?BER)).
+
+testMergeCompile(suite) ->
+ [];
+testMergeCompile(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testMergeCompile:compile(Config,?PER,[]),
+ ?line testMergeCompile:main(?PER),
+ ?line testMergeCompile:mvrasn(?PER),
+
+ ?line ?per_bit_opt(testMergeCompile:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testMergeCompile:main(?PER)),
+ ?line ?per_bit_opt(testMergeCompile:mvrasn(?PER)),
+
+ ?line ?uper_bin(testMergeCompile:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testMergeCompile:main(uper_bin)),
+ ?line ?uper_bin(testMergeCompile:mvrasn(uper_bin)),
+
+ ?line testMergeCompile:compile(Config,?BER,[]),
+ ?line testMergeCompile:main(?BER),
+ ?line testMergeCompile:mvrasn(?BER),
+
+ ?line ?ber_driver(?BER,testMergeCompile:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testMergeCompile:main(?BER)),
+ ?line ?ber_driver(?BER,testMergeCompile:mvrasn(?BER)).
+
+testobj(suite) ->
+ [];
+testobj(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line ok = testRANAP:compile(Config,?PER,[]),
+ ?line ok = testRANAP:testobj(?PER),
+ ?line ok = testParameterizedInfObj:ranap(?PER),
+
+ ?line ?per_bit_opt(ok = testRANAP:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(ok = testRANAP:testobj(?PER)),
+ ?line ?per_bit_opt(ok = testParameterizedInfObj:ranap(?PER)),
+
+ ?line ?uper_bin(ok = testRANAP:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(ok = testRANAP:testobj(uper_bin)),
+ ?line ?uper_bin(ok = testParameterizedInfObj:ranap(uper_bin)),
+
+ ?line ok = testRANAP:compile(Config,?PER,[optimize]),
+ ?line ok = testRANAP:testobj(?PER),
+ ?line ok = testParameterizedInfObj:ranap(?PER),
+
+ ?line ok = testRANAP:compile(Config,?BER,[]),
+ ?line ok = testRANAP:testobj(?BER),
+ ?line ok = testParameterizedInfObj:ranap(?BER),
+
+ ?line ?ber_driver(?BER,testRANAP:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testRANAP:testobj(?BER)),
+ ?line ?ber_driver(?BER,testParameterizedInfObj:ranap(?BER)).
+
+
+testDeepTConstr(suite) ->
+ [];
+testDeepTConstr(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testDeepTConstr:compile(Config,?PER,[]),
+ ?line testDeepTConstr:main(?PER),
+
+ ?line ?per_bit_opt(testDeepTConstr:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testDeepTConstr:main(?PER)),
+
+ ?line ?uper_bin(testDeepTConstr:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testDeepTConstr:main(uper_bin)),
+
+ ?line testDeepTConstr:compile(Config,?PER,[optimize]),
+ ?line testDeepTConstr:main(?PER),
+
+ ?line testDeepTConstr:compile(Config,?BER,[]),
+ ?line testDeepTConstr:main(?BER),
+
+ ?line ?ber_driver(?BER,testDeepTConstr:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testDeepTConstr:main(?BER)).
+
+testInvokeMod(suite) ->
+ [];
+testInvokeMod(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line ok = asn1ct:compile(filename:join(DataDir,"PrimStrings"),[{outdir,OutDir}]),
+ ?line {ok,_Result1} = 'PrimStrings':encode('Bs1',[1,0,1,0]),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"PrimStrings"),[?PER,{outdir,OutDir}]),
+ ?line {ok,_Result2} = 'PrimStrings':encode('Bs1',[1,0,1,0]).
+
+testExport(suite) ->
+ [];
+testExport(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line {error,{asn1,_Reason}} = asn1ct:compile(filename:join(DataDir,"IllegalExport"),[{outdir,OutDir}]).
+
+testImport(suite) ->
+ [];
+testImport(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line _OutDir = ?config(priv_dir,Config),
+ ?line {error,_} = asn1ct:compile(filename:join(DataDir,"ImportsFrom"),[?BER]),
+ ok.
+
+testMegaco(suite) ->
+ [];
+testMegaco(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ io:format("Config: ~p~n",[Config]),
+ ?line {ok,ModuleName1,ModuleName2} = testMegaco:compile(Config,?BER,[]),
+ ?line ok = testMegaco:main(ModuleName1,Config),
+ ?line ok = testMegaco:main(ModuleName2,Config),
+
+ case ?BER of
+ ber_bin_v2 ->
+ ?line {ok,ModuleName3,ModuleName4} = testMegaco:compile(Config,?BER,[driver]),
+ ?line ok = testMegaco:main(ModuleName3,Config),
+ ?line ok = testMegaco:main(ModuleName4,Config);
+ _-> ok
+ end,
+
+ ?line {ok,ModuleName5,ModuleName6} = testMegaco:compile(Config,?PER,[]),
+ ?line ok = testMegaco:main(ModuleName5,Config),
+ ?line ok = testMegaco:main(ModuleName6,Config),
+
+ ?line ?per_bit_opt({ok,ModuleName5,ModuleName6} = testMegaco:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(ok = testMegaco:main(ModuleName5,Config)),
+ ?line ?per_bit_opt(ok = testMegaco:main(ModuleName6,Config)),
+
+ ?line ?uper_bin({ok,ModuleName5,ModuleName6} = testMegaco:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(ok = testMegaco:main(ModuleName5,Config)),
+ ?line ?uper_bin(ok = testMegaco:main(ModuleName6,Config)),
+
+ ?line {ok,ModuleName7,ModuleName8} = testMegaco:compile(Config,?PER,[optimize]),
+ ?line ok = testMegaco:main(ModuleName7,Config),
+ ?line ok = testMegaco:main(ModuleName8,Config).
+
+
+testMvrasn6(suite) -> [];
+testMvrasn6(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testMvrasn6:compile(Config,?BER),
+ ?line testMvrasn6:main().
+
+testContextSwitchingTypes(suite) -> [];
+testContextSwitchingTypes(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testContextSwitchingTypes:compile(Config,?BER,[]),
+ ?line testContextSwitchingTypes:test(),
+
+ ?line ?ber_driver(?BER,testContextSwitchingTypes:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testContextSwitchingTypes:test()),
+
+ ?line testContextSwitchingTypes:compile(Config,?PER,[]),
+ ?line testContextSwitchingTypes:test(),
+
+ ?line ?per_bit_opt(testContextSwitchingTypes:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testContextSwitchingTypes:test()),
+
+ ?line ?uper_bin(testContextSwitchingTypes:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testContextSwitchingTypes:test()),
+
+ ?line testContextSwitchingTypes:compile(Config,?PER,[optimize]),
+ ?line testContextSwitchingTypes:test().
+
+testTypeValueNotation(suite) -> [];
+testTypeValueNotation(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ case ?BER of
+ Ber when Ber == ber; Ber == ber_bin ->
+ ?line testTypeValueNotation:compile(Config,?BER,[]),
+ ?line testTypeValueNotation:main(?BER,dummy);
+ _ ->
+ ok
+ end,
+
+ ?line ?ber_driver(?BER,testTypeValueNotation:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testTypeValueNotation:main(?BER,optimize)),
+
+ case ?BER of
+ Ber2 when Ber2 == ber; Ber2 == ber_bin ->
+ ?line testTypeValueNotation:compile(Config,?PER,[]),
+ ?line testTypeValueNotation:main(?PER,dummy);
+ _ ->
+ ok
+ end,
+
+ ?line ?per_bit_opt(testTypeValueNotation:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testTypeValueNotation:main(?PER,optimize)),
+
+ ?line ?uper_bin(testTypeValueNotation:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testTypeValueNotation:main(uper_bin,optimize)),
+ case ?BER of
+ Ber3 when Ber3 == ber; Ber3 == ber_bin ->
+ ?line testTypeValueNotation:compile(Config,?PER,[optimize]),
+ ?line testTypeValueNotation:main(?PER,optimize);
+ _ ->
+ ok
+ end.
+
+testOpenTypeImplicitTag(suite) -> [];
+testOpenTypeImplicitTag(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testOpenTypeImplicitTag:compile(Config,?BER,[]),
+ ?line testOpenTypeImplicitTag:main(?BER),
+
+ ?line ?ber_driver(?BER,testOpenTypeImplicitTag:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testOpenTypeImplicitTag:main(?BER)),
+
+ ?line testOpenTypeImplicitTag:compile(Config,?PER,[]),
+ ?line testOpenTypeImplicitTag:main(?PER),
+
+ ?line ?per_bit_opt(testOpenTypeImplicitTag:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testOpenTypeImplicitTag:main(?PER)),
+
+ ?line ?uper_bin(testOpenTypeImplicitTag:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testOpenTypeImplicitTag:main(uper_bin)),
+
+ ?line testOpenTypeImplicitTag:compile(Config,?PER,[optimize]),
+ ?line testOpenTypeImplicitTag:main(?PER).
+
+duplicate_tags(suite) -> [];
+duplicate_tags(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ {error,{asn1,[{error,{type,_,_,'SeqOpt1Imp',{asn1,{duplicates_of_the_tags,_}}}}]}} =
+ asn1ct:compile(filename:join(DataDir,"SeqOptional2"),[abs]),
+ ok.
+
+rtUI(suite) -> [];
+rtUI(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Prim"),[?BER]),
+ ?line {ok,_} = asn1rt:info('Prim'),
+
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Prim"),[?PER]),
+ ?line {ok,_} = asn1rt:info('Prim'),
+
+ ?line ok = asn1rt:load_driver(),
+ ?line ok = asn1rt:load_driver(),
+ ?line ok = asn1rt:unload_driver().
+
+testROSE(suite) -> [];
+testROSE(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testROSE:compile(Config,?BER,[]),
+
+ ?line testROSE:compile(Config,?PER,[]),
+ ?line ?per_bit_opt(testROSE:compile(Config,?PER,[optimize])),
+ ?line ?uper_bin(testROSE:compile(Config,uper_bin,[])),
+ ?line testROSE:compile(Config,?PER,[optimize]).
+
+testINSTANCE_OF(suite) -> [];
+testINSTANCE_OF(Config) ->
+ ?line testINSTANCE_OF:compile(Config,?BER,[]),
+ ?line testINSTANCE_OF:main(?BER),
+
+ ?line ?ber_driver(?BER,testINSTANCE_OF:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testINSTANCE_OF:main(?BER)),
+
+ ?line testINSTANCE_OF:compile(Config,?PER,[]),
+ ?line testINSTANCE_OF:main(?PER),
+
+ ?line ?per_bit_opt(testINSTANCE_OF:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testINSTANCE_OF:main(?PER)),
+
+ ?line ?uper_bin(testINSTANCE_OF:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testINSTANCE_OF:main(uper_bin)),
+
+ ?line testINSTANCE_OF:compile(Config,?PER,[optimize]),
+ ?line testINSTANCE_OF:main(?PER).
+
+testTCAP(suite) -> [];
+testTCAP(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testTCAP:compile(Config,?BER,[]),
+ ?line testTCAP:test(?BER,Config),
+
+ ?line ?ber_driver(?BER,testTCAP:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testTCAP:test(?BER,Config)),
+
+ ?line ?ber_driver(?BER,testTCAP:compile_asn1config(Config,?BER,[asn1config])),
+ ?line ?ber_driver(?BER,testTCAP:test_asn1config()).
+
+testDER(suite) ->[];
+testDER(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testDER:compile(Config,?BER,[]),
+ ?line testDER:test(),
+
+ ?line ?ber_driver(?BER,testDER:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testDER:test()),
+
+ ?line testParamBasic:compile_der(Config,?BER),
+ ?line testParamBasic_cases(der),
+
+
+ ?line testSeqSetDefaultVal:compile(Config,?BER),
+ ?line testSeqSetDefaultVal_cases(?BER).
+
+testSeqSetDefaultVal_cases(?BER) ->
+ ?line testSeqSetDefaultVal:main(?BER).
+
+
+specialized_decodes(suite) -> [];
+specialized_decodes(Config) ->
+ ?line test_partial_incomplete_decode:compile(Config,?BER,[optimize]),
+ ?line test_partial_incomplete_decode:test(?BER,Config),
+ ?line test_selective_decode:test(?BER,Config).
+
+special_decode_performance(suite) ->[];
+special_decode_performance(Config) ->
+ ?line ?ber_driver(?BER,test_special_decode_performance:compile(Config,?BER)),
+ ?line ?ber_driver(?BER,test_special_decode_performance:go(all)).
+
+
+test_driver_load(suite) -> [];
+test_driver_load(Config) ->
+ ?line test_driver_load:compile(Config,?PER),
+ ?line test_driver_load:test(?PER,5).
+
+test_ParamTypeInfObj(suite) -> [];
+test_ParamTypeInfObj(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"IN-CS-1-Datatypes"),[ber_bin]).
+
+test_WS_ParamClass(suite) -> [];
+test_WS_ParamClass(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"InformationFramework"),
+ [ber_bin]).
+
+test_Defed_ObjectIdentifier(suite) -> [];
+test_Defed_ObjectIdentifier(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"UsefulDefinitions"),
+ [ber_bin]).
+
+testSelectionType(suite) -> [];
+testSelectionType(Config) ->
+
+ ?line ok = testSelectionTypes:compile(Config,?BER,[]),
+ ?line {ok,_} = testSelectionTypes:test(),
+
+ ?line ok = testSelectionTypes:compile(Config,?PER,[]),
+ ?line {ok,_} = testSelectionTypes:test().
+
+testSSLspecs(suite) -> [];
+testSSLspecs(Config) ->
+
+ ?line ok = testSSLspecs:compile(Config,?BER,
+ [optimize,compact_bit_string,der]),
+ ?line testSSLspecs:run(?BER),
+
+ case code:which(asn1ct) of
+ cover_compiled ->
+ ok;
+ _ ->
+ ?line ok = testSSLspecs:compile_inline(Config,?BER),
+ ?line ok = testSSLspecs:run_inline(?BER)
+ end.
+
+testNortel(suite) -> [];
+testNortel(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Nortel"),[?BER]),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Nortel"),
+ [?BER,optimize]),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Nortel"),
+ [?BER,optimize,driver]),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Nortel"),[?PER]),
+ ?line ?per_bit_opt(ok = asn1ct:compile(filename:join(DataDir,"Nortel"),
+ [?PER,optimize])),
+ ?line ?uper_bin(ok = asn1ct:compile(filename:join(DataDir,"Nortel"),[uper_bin])),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Nortel"),
+ [?PER,optimize]).
+test_undecoded_rest(suite) -> [];
+test_undecoded_rest(Config) ->
+
+ ?line ok = test_undecoded_rest:compile(Config,?BER,[]),
+ ?line ok = test_undecoded_rest:test([]),
+
+ ?line ok = test_undecoded_rest:compile(Config,?BER,[undec_rest]),
+ ?line ok = test_undecoded_rest:test(undec_rest),
+
+ ?line ok = test_undecoded_rest:compile(Config,?PER,[]),
+ ?line ok = test_undecoded_rest:test([]),
+
+ ?line ?per_bit_opt(ok = test_undecoded_rest:compile(Config,?PER,[optimize,undec_rest])),
+ ?line ?per_bit_opt(ok = test_undecoded_rest:test(undec_rest)),
+
+ ?line ?uper_bin(ok = test_undecoded_rest:compile(Config,uper_bin,[undec_rest])),
+ ?line ?uper_bin(ok = test_undecoded_rest:test(undec_rest)),
+
+ ?line ok = test_undecoded_rest:compile(Config,?PER,[undec_rest]),
+ ?line ok = test_undecoded_rest:test(undec_rest).
+
+test_inline(suite) -> [];
+test_inline(Config) ->
+ case code:which(asn1ct) of
+ cover_compiled ->
+ {skip,"Not runnable when cover compiled"};
+ _ ->
+ ?line ok=test_inline:compile(Config,?BER,[]),
+ ?line test_inline:main(?BER),
+ ?line test_inline:inline1(Config,?BER,[]),
+ ?line test_inline:performance2()
+ end.
+
+%test_inline_prf(suite) -> [];
+%test_inline_prf(Config) ->
+% ?line test_inline:performance(Config).
+
+testTcapsystem(suite) -> [];
+testTcapsystem(Config) ->
+ ?line ok=testTcapsystem:compile(Config,?BER,[]).
+
+testNBAPsystem(suite) -> [];
+testNBAPsystem(Config) ->
+ ?line ok=testNBAPsystem:compile(Config,?PER,?per_optimize(?BER)),
+ ?line ok=testNBAPsystem:test(?PER,Config).
+
+test_compile_options(suite) -> [];
+test_compile_options(Config) ->
+ case code:which(asn1ct) of
+ cover_compiled ->
+ {skip,"Not runnable when cover compiled"};
+ _ ->
+ ?line ok = test_compile_options:wrong_path(Config),
+ ?line ok = test_compile_options:path(Config),
+ ?line ok = test_compile_options:noobj(Config),
+ ?line ok = test_compile_options:record_name_prefix(Config),
+ ?line ok = test_compile_options:verbose(Config)
+ end.
+testDoubleEllipses(suite) -> [];
+testDoubleEllipses(Config) ->
+ ?line testDoubleEllipses:compile(Config,?BER,[]),
+ ?line testDoubleEllipses:main(?BER),
+ ?line ?ber_driver(?BER,testDoubleEllipses:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testDoubleEllipses:main(?BER)),
+ ?line ?per_bit_opt(testDoubleEllipses:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testDoubleEllipses:main(?PER)),
+ ?line ?uper_bin(testDoubleEllipses:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testDoubleEllipses:main(uper_bin)),
+ ?line testDoubleEllipses:compile(Config,?PER,?per_optimize(?BER)),
+ ?line testDoubleEllipses:main(?PER).
+
+test_modified_x420(suite) -> [];
+test_modified_x420(Config) ->
+ ?line test_modified_x420:compile(Config),
+ ?line test_modified_x420:test_io(Config).
+
+testX420(suite) -> [];
+testX420(Config) ->
+ ?line testX420:compile(?BER,[der],Config),
+ ?line ok = testX420:ticket7759(?BER,Config),
+ ?line testX420:compile(?PER,[],Config).
+
+test_x691(suite) -> [];
+test_x691(Config) ->
+ case ?PER of
+ per ->
+ ?line ok = test_x691:compile(Config,uper_bin,[]),
+ ?line true = test_x691:cases(uper_bin,unaligned),
+ ?line ok = test_x691:compile(Config,?PER,[]),
+ ?line true = test_x691:cases(?PER,aligned),
+%% ?line ok = asn1_test_lib:ticket_7678(Config,[]),
+ ?line ok = asn1_test_lib:ticket_7708(Config,[]),
+ ?line ok = asn1_test_lib:ticket_7763(Config);
+ _ ->
+ ?line ok = test_x691:compile(Config,?PER,?per_optimize(?BER)),
+ ?line true = test_x691:cases(?PER,aligned)
+ end.
+%% ?line ok = asn1_test_lib:ticket_7876(Config,?PER,[]),
+%% ?line ok = asn1_test_lib:ticket_7876(Config,?PER,[compact_bit_string]),
+%% ?line ok = asn1_test_lib:ticket_7876(Config,?PER,[optimize]),
+%% ?line ok = asn1_test_lib:ticket_7876(Config,?PER,[optimize,compact_bit_string]).
+
+
+ticket_6143(suite) -> [];
+ticket_6143(Config) ->
+ ?line ok = test_compile_options:ticket_6143(Config).
+
+testExtensionAdditionGroup(suite) -> [];
+testExtensionAdditionGroup(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line PrivDir = ?config(priv_dir,Config),
+ ?line Path = code:get_path(),
+ ?line code:add_patha(PrivDir),
+ DoIt = fun(Erule) ->
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Extension-Addition-Group"),[Erule,{outdir,PrivDir}]),
+ ?line {ok,_M} = compile:file(filename:join(DataDir,"extensionAdditionGroup"),[{i,PrivDir},{outdir,PrivDir},debug_info]),
+ ?line ok = extensionAdditionGroup:run(Erule)
+ end,
+ ?line [DoIt(Rule)|| Rule <- [per_bin,uper_bin,ber_bin]],
+ ?line code:set_path(Path).
+
+
+
+% parse_modules() ->
+% ["ImportsFrom"].
+
+per_modules() ->
+ [X || X <- test_modules()].
+ber_modules() ->
+ [X || X <- test_modules(),
+ X =/= "CommonDataTypes",
+ X =/= "DS-EquipmentUser-CommonFunctionOrig-TransmissionPath",
+ X =/= "H323-MESSAGES",
+ X =/= "H235-SECURITY-MESSAGES",
+ X =/= "MULTIMEDIA-SYSTEM-CONTROL"].
+test_modules() ->
+ _Modules = [
+ "BitStr",
+ "CommonDataTypes",
+ "Constraints",
+ "ContextSwitchingTypes",
+ "DS-EquipmentUser-CommonFunctionOrig-TransmissionPath",
+ "Enum",
+ "From",
+ "H235-SECURITY-MESSAGES",
+ "H323-MESSAGES",
+ %%"MULTIMEDIA-SYSTEM-CONTROL", recursive type , problem for asn1ct:value
+ "Import",
+ "Int",
+ "MAP-commonDataTypes",
+% ambigous tags "MAP-insertSubscriberData-def",
+ "Null",
+ "Octetstr",
+ "One",
+ "P-Record",
+ "P",
+% "PDUs",
+ "Person",
+ "PrimStrings",
+ "Real",
+ "XSeq",
+ "XSeqOf",
+ "XSet",
+ "XSetOf",
+ "String",
+ "SwCDR",
+% "Syntax",
+ "Time"
+% ANY "Tst",
+% "Two",
+% errors that should be detected "UndefType"
+] ++
+ [
+ "SeqSetLib", % must be compiled before Seq and Set
+ "Seq",
+ "Set",
+ "SetOf",
+ "SeqOf",
+ "Prim",
+ "Cho",
+ "Def",
+ "Opt",
+ "ELDAPv3",
+ "LDAP"
+ ].
+
+
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2005-2010. 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%
+%%
+%%
+
+common() ->
+[{group, app_test}, {group, appup_test}, testTimer_ber,
+ testTimer_ber_bin, testTimer_ber_bin_opt,
+ testTimer_ber_bin_opt_driver, testTimer_per,
+ testTimer_per_bin, testTimer_per_bin_opt,
+ testTimer_uper_bin, testComment, testName2Number].
+
+
+
+testTimer_ber(suite) -> [];
+testTimer_ber(Config) ->
+ ?line testTimer:compile(Config,ber,[]),
+ ?line testTimer:go(Config,ber).
+
+testTimer_ber_bin(suite) -> [];
+testTimer_ber_bin(Config) ->
+ ?line testTimer:compile(Config,ber_bin,[]),
+ ?line testTimer:go(Config,ber_bin).
+
+testTimer_ber_bin_opt(suite) -> [];
+testTimer_ber_bin_opt(Config) ->
+ ?line testTimer:compile(Config,ber_bin,[optimize]),
+ ?line testTimer:go(Config,ber_bin).
+
+testTimer_ber_bin_opt_driver(suite) -> [];
+testTimer_ber_bin_opt_driver(Config) ->
+ ?line testTimer:compile(Config,ber_bin,[optimize,driver]),
+ ?line testTimer:go(Config,ber_bin).
+
+testTimer_per(suite) -> [];
+testTimer_per(Config) ->
+ ?line testTimer:compile(Config,per,[]),
+ ?line testTimer:go(Config,per).
+
+testTimer_per_bin(suite) -> [];
+testTimer_per_bin(Config) ->
+ ?line testTimer:compile(Config,per_bin,[]),
+ ?line testTimer:go(Config,per_bin).
+
+testTimer_per_bin_opt(suite) -> [];
+testTimer_per_bin_opt(Config) ->
+ ?line testTimer:compile(Config,per_bin,[optimize]),
+ ?line testTimer:go(Config,per_bin).
+
+
+testTimer_uper_bin(suite) -> [];
+testTimer_uper_bin(Config) ->
+ ?line ok=testTimer:compile(Config,uper_bin,[]),
+ ?line {comment,_} = testTimer:go(Config,uper_bin).
+
+%% Test of multiple-line comment, OTP-8043
+testComment(suite) -> [];
+testComment(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+
+ ?line ok = asn1ct:compile(DataDir ++ "Comment",[{outdir,OutDir}]),
+
+ ?line {ok,Enc} = asn1_wrapper:encode('Comment','Seq',{'Seq',12,true}),
+ ?line {ok,{'Seq',12,true}} = asn1_wrapper:decode('Comment','Seq',Enc),
+ ok.
+
+testName2Number(suite) -> [];
+testName2Number(Config) ->
+ DataDir = ?config(data_dir,Config),
+ OutDir = ?config(priv_dir,Config),
+ N2NOptions = [{n2n,Type}|| Type <-
+ ['CauseMisc','CauseProtocol',
+ %% 'CauseNetwork',
+ 'CauseRadioNetwork',
+ 'CauseTransport','CauseNas']],
+ ?line ok = asn1ct:compile(DataDir ++ "S1AP-IEs",[{outdir,OutDir}]++N2NOptions),
+ ?line true = code:add_patha(OutDir),
+
+ ?line 0 = 'S1AP-IEs':name2num_CauseMisc('control-processing-overload'),
+ ?line 'unknown-PLMN' = 'S1AP-IEs':num2name_CauseMisc(5),
+ ok.
+
+
+particular() ->
+ [ticket_7407].
+
+ticket_7407(suite) -> [];
+ticket_7407(Config) ->
+ ?line ok = asn1_test_lib:ticket_7407_compile(Config,[]),
+ ?line ok = asn1_test_lib:ticket_7407_code(true),
+
+ ?line ok = asn1_test_lib:ticket_7407_compile(Config,[no_final_padding]),
+ ?line ok = asn1_test_lib:ticket_7407_code(false).
diff --git a/lib/asn1/test/asn1_SUITE.erl.src b/lib/asn1/test/asn1_SUITE.erl.src
index e1a09adc82..7201365ea3 100644
--- a/lib/asn1/test/asn1_SUITE.erl.src
+++ b/lib/asn1/test/asn1_SUITE.erl.src
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -2327,6 +2327,7 @@ ber_modules() ->
test_modules() ->
_Modules = [
"BitStr",
+ "CAP",
"CommonDataTypes",
"Constraints",
"ContextSwitchingTypes",
diff --git a/lib/asn1/test/asn1_SUITE_data/CAP.asn1 b/lib/asn1/test/asn1_SUITE_data/CAP.asn1
new file mode 100644
index 0000000000..69d8486d3b
--- /dev/null
+++ b/lib/asn1/test/asn1_SUITE_data/CAP.asn1
@@ -0,0 +1,41 @@
+CAP {ccitt(0) identified-organization(4) etsi(0) mobileDomain(0) umts-network(1) modules(3) cap-datatypes(52) version3(2)}
+
+DEFINITIONS IMPLICIT TAGS ::=
+
+BEGIN
+
+EXTENSION ::= CLASS {
+ &ExtensionType,
+ &criticality CriticalityType DEFAULT ignore,
+ &id Code
+ }
+WITH SYNTAX {
+ EXTENSION-SYNTAX &ExtensionType
+ CRITICALITY &criticality
+ IDENTIFIED BY &id
+ }
+
+ExtensionField ::= SEQUENCE {
+ type EXTENSION.&id ({SupportedExtensions }),
+ criticality CriticalityType DEFAULT ignore,
+ value [1] EXTENSION.&ExtensionType ({SupportedExtensions }{@type}),
+ ...}
+
+SupportedExtensions EXTENSION ::= {firstExtension, ...}
+
+firstExtension EXTENSION ::= {
+ EXTENSION-SYNTAX NULL
+ CRITICALITY ignore
+ IDENTIFIED BY global : {itu-t(0) identified-organization(4) organisation(0) gsm(1)
+ capextension(2)}}
+
+CriticalityType ::= ENUMERATED {
+ ignore (0),
+ abort (1)
+ }
+
+Code ::= CHOICE {local INTEGER,
+ global OBJECT IDENTIFIER}
+
+
+END
diff --git a/lib/asn1/test/asn1_SUITE_data/TCAPPackage_msg.erl b/lib/asn1/test/asn1_SUITE_data/TCAPPackage_msg.erl
index cc9a483f49..06eba8b6eb 100644
--- a/lib/asn1/test/asn1_SUITE_data/TCAPPackage_msg.erl
+++ b/lib/asn1/test/asn1_SUITE_data/TCAPPackage_msg.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
diff --git a/lib/asn1/test/asn1_SUITE_data/a_SeqIn.erl b/lib/asn1/test/asn1_SUITE_data/a_SeqIn.erl
index a447524358..c6db3fd016 100644
--- a/lib/asn1/test/asn1_SUITE_data/a_SeqIn.erl
+++ b/lib/asn1/test/asn1_SUITE_data/a_SeqIn.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
diff --git a/lib/asn1/test/asn1_SUITE_data/b_SeqIn.erl b/lib/asn1/test/asn1_SUITE_data/b_SeqIn.erl
index a416322b8c..3fa124c278 100644
--- a/lib/asn1/test/asn1_SUITE_data/b_SeqIn.erl
+++ b/lib/asn1/test/asn1_SUITE_data/b_SeqIn.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
diff --git a/lib/asn1/test/asn1_SUITE_data/test_records.erl b/lib/asn1/test/asn1_SUITE_data/test_records.erl
index b2c9797fdc..1fdfbb40df 100644
--- a/lib/asn1/test/asn1_SUITE_data/test_records.erl
+++ b/lib/asn1/test/asn1_SUITE_data/test_records.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
diff --git a/lib/asn1/test/asn1_app_test.erl b/lib/asn1/test/asn1_app_test.erl
index 23a7e691e7..c3797f08b2 100644
--- a/lib/asn1/test/asn1_app_test.erl
+++ b/lib/asn1/test/asn1_app_test.erl
@@ -26,21 +26,24 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) ->
- Cases =
- [
- fields,
- modules,
- exportall,
- app_depend
- ],
- {req, [], {conf, app_init, Cases, app_fin}}.
+all() ->
+ [fields, modules, exportall, app_depend].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-app_init(suite) -> [];
-app_init(doc) -> [];
-app_init(Config) when is_list(Config) ->
+init_per_suite(suite) -> [];
+init_per_suite(doc) -> [];
+init_per_suite(Config) when is_list(Config) ->
case is_app(asn1) of
{ok, AppFile} ->
io:format("AppFile: ~n~p~n", [AppFile]),
@@ -60,9 +63,9 @@ is_app(App) ->
end.
-app_fin(suite) -> [];
-app_fin(doc) -> [];
-app_fin(Config) when is_list(Config) ->
+end_per_suite(suite) -> [];
+end_per_suite(doc) -> [];
+end_per_suite(Config) when is_list(Config) ->
Config.
diff --git a/lib/asn1/test/asn1_appup_test.erl b/lib/asn1/test/asn1_appup_test.erl
index 4a60c814e8..a2c1423eda 100644
--- a/lib/asn1/test/asn1_appup_test.erl
+++ b/lib/asn1/test/asn1_appup_test.erl
@@ -26,18 +26,24 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) ->
- Cases =
- [
- appup
- ],
- {req, [], {conf, appup_init, Cases, appup_fin}}.
+all() ->
+ [appup].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-appup_init(suite) -> [];
-appup_init(doc) -> [];
-appup_init(Config) when is_list(Config) ->
+init_per_suite(suite) -> [];
+init_per_suite(doc) -> [];
+init_per_suite(Config) when is_list(Config) ->
AppFile = file_name(asn1, ".app"),
AppupFile = file_name(asn1, ".appup"),
[{app_file, AppFile}, {appup_file, AppupFile}|Config].
@@ -48,9 +54,9 @@ file_name(App, Ext) ->
filename:join([LibDir, "ebin", atom_to_list(App) ++ Ext]).
-appup_fin(suite) -> [];
-appup_fin(doc) -> [];
-appup_fin(Config) when is_list(Config) ->
+end_per_suite(suite) -> [];
+end_per_suite(doc) -> [];
+end_per_suite(Config) when is_list(Config) ->
Config.
diff --git a/lib/asn1/test/asn1_bin_SUITE.erl b/lib/asn1/test/asn1_bin_SUITE.erl
new file mode 100644
index 0000000000..a924aee0db
--- /dev/null
+++ b/lib/asn1/test/asn1_bin_SUITE.erl
@@ -0,0 +1,2382 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2001-2011. 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%
+%%
+%%
+%%% Purpose : Test suite for the ASN.1 application
+
+-module(asn1_bin_SUITE).
+-define(PER,'per_bin').
+-define(BER,'ber_bin').
+-define(ber_driver(Erule,Func),
+ case Erule of
+ ber_bin_v2 ->
+ Func;
+ _ -> ok
+ end).
+-define(per_optimize(Erule),
+ case Erule of
+ ber_bin_v2 ->[optimize];
+ _ -> []
+ end).
+-define(per_bit_opt(FuncCall),
+ case ?BER of
+ ber_bin_v2 -> FuncCall;
+% _ -> {skip,"only for bit optimized per_bin"}
+ _ -> ok
+ end).
+-define(uper_bin(FuncCall),
+ case ?PER of
+ per -> FuncCall;
+ _ -> ok
+ end).
+
+-compile(export_all).
+%%-export([Function/Arity, ...]).
+
+-include_lib("test_server/include/test_server.hrl").
+
+%% records used by test-case default
+-record('Def1',{bool0, bool1 = asn1_DEFAULT,
+ bool2 = asn1_DEFAULT,
+ bool3 = asn1_DEFAULT}).
+
+%-record('Def2',{
+%bool10, bool11 = asn1_DEFAULT, bool12 = asn1_DEFAULT, bool13}).
+
+%-record('Def3',{
+%bool30 = asn1_DEFAULT, bool31 = asn1_DEFAULT, bool32 = asn1_DEFAULT, bool33 = asn1_DEFAULT}).
+
+
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, compile}, parse, default_per, default_ber,
+ default_per_opt, per, {group, ber}, testPrim,
+ testPrimStrings, testPrimExternal, testChoPrim,
+ testChoExtension, testChoExternal, testChoOptional,
+ testChoOptionalImplicitTag, testChoRecursive,
+ testChoTypeRefCho, testChoTypeRefPrim,
+ testChoTypeRefSeq, testChoTypeRefSet, testDef, testOpt,
+ testSeqDefault, testSeqExtension, testSeqExternal,
+ testSeqOptional, testSeqPrim, testSeqTag,
+ testSeqTypeRefCho, testSeqTypeRefPrim,
+ testSeqTypeRefSeq, testSeqTypeRefSet, testSeqOf,
+ testSeqOfIndefinite, testSeqOfCho, testSeqOfExternal,
+ testSetDefault, testSetExtension,
+ testExtensionAdditionGroup, testSetExternal,
+ testSeqOfTag, testSetOptional, testSetPrim, testSetTag,
+ testSetTypeRefCho, testSetTypeRefPrim,
+ testSetTypeRefSeq, testSetTypeRefSet, testSetOf,
+ testSetOfCho, testSetOfExternal, testSetOfTag,
+ testEnumExt, value_test, testSeq2738, constructed,
+ ber_decode_error, h323test, testSeqIndefinite,
+ testSetIndefinite, testChoiceIndefinite,
+ per_GeneralString, per_open_type, testInfObjectClass,
+ testParameterizedInfObj, testMergeCompile, testobj,
+ testDeepTConstr, testConstraints, testInvokeMod,
+ testExport, testImport, testCompactBitString,
+ testMegaco, testParamBasic, testMvrasn6,
+ testContextSwitchingTypes, testTypeValueNotation,
+ testOpenTypeImplicitTag, duplicate_tags, rtUI, testROSE,
+ testINSTANCE_OF, testTCAP, testDER, specialized_decodes,
+ special_decode_performance, test_driver_load,
+ test_ParamTypeInfObj, test_WS_ParamClass,
+ test_Defed_ObjectIdentifier, testSelectionType,
+ testSSLspecs, testNortel, test_undecoded_rest,
+ test_inline, testTcapsystem, testNBAPsystem,
+ test_compile_options, testDoubleEllipses,
+ test_modified_x420, testX420, test_x691, ticket_6143,
+ testExtensionAdditionGroup] ++ common() ++ particular().
+
+groups() ->
+ [{option_tests, [],
+ [test_compile_options, ticket_6143]},
+ {infobj, [],
+ [testInfObjectClass, testParameterizedInfObj,
+ testMergeCompile, testobj, testDeepTConstr]},
+ {performance, [],
+ [testTimer_ber, testTimer_ber_opt_driver, testTimer_per,
+ testTimer_per_opt, testTimer_uper_bin]},
+ {bugs, [],
+ [test_ParamTypeInfObj, test_WS_ParamClass,
+ test_Defed_ObjectIdentifier]},
+ {compile, [],
+ [c_syntax, c_string_per, c_string_ber,
+ c_implicit_before_choice]},
+ {ber, [],
+ [ber_choiceinseq, ber_optional, ber_optional_keyed_list,
+ ber_other]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+%all(suite) -> [test_inline,testNBAPsystem,test_compile_options,ticket_6143].
+
+init_per_testcase(Func,Config) ->
+ %%?line test_server:format("Func: ~p~n",[Func]),
+ ?line {ok, _} = file:read_file_info(filename:join([?config(priv_dir,Config)])),
+ ?line code:add_patha(?config(priv_dir,Config)),
+ Dog=
+ case Func of
+ testX420 ->
+ test_server:timetrap({minutes,60}); % 60 minutes
+ _ ->
+ test_server:timetrap({minutes,30}) % 60 minutes
+ end,
+%% Dog=test_server:timetrap(1800000), % 30 minutes
+ [{watchdog, Dog}|Config].
+
+end_per_testcase(_Func,Config) ->
+ Dog=?config(watchdog, Config),
+ test_server:timetrap_cancel(Dog).
+
+
+testPrim(suite) -> [];
+testPrim(Config) ->
+ ?line testPrim:compile(Config,?BER,[]),
+ ?line testPrim_cases(?BER),
+ ?line ?ber_driver(?BER,testPrim:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testPrim_cases(?BER)),
+ ?line testPrim:compile(Config,?PER,[]),
+ ?line testPrim_cases(?PER),
+ ?line ?per_bit_opt(testPrim:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testPrim_cases(?PER)),
+ ?line ?uper_bin(testPrim:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testPrim_cases(uper_bin)),
+ ?line testPrim:compile(Config,?PER,[optimize]),
+ ?line testPrim_cases(?PER).
+
+testPrim_cases(Rules) ->
+ ?line testPrim:bool(Rules),
+ ?line testPrim:int(Rules),
+ ?line testPrim:enum(Rules),
+ ?line testPrim:obj_id(Rules),
+ ?line testPrim:rel_oid(Rules),
+ ?line testPrim:null(Rules),
+ ?line testPrim:real(Rules).
+
+
+testCompactBitString(suite) -> [];
+testCompactBitString(Config) ->
+
+ ?line testCompactBitString:compile(Config,?BER,[compact_bit_string]),
+ ?line testCompactBitString:compact_bit_string(?BER),
+
+ ?line ?ber_driver(?BER,testCompactBitString:compile(Config,?BER,[compact_bit_string,driver])),
+ ?line ?ber_driver(?BER,testCompactBitString:compact_bit_string(?BER)),
+
+ ?line testCompactBitString:compile(Config,?PER,[compact_bit_string]),
+ ?line testCompactBitString:compact_bit_string(?PER),
+ ?line testCompactBitString:bit_string_unnamed(?PER),
+
+ ?line ?per_bit_opt(testCompactBitString:compile(Config,?PER,
+ [compact_bit_string,optimize])),
+ ?line ?per_bit_opt(testCompactBitString:compact_bit_string(?PER)),
+ ?line ?per_bit_opt(testCompactBitString:bit_string_unnamed(?PER)),
+ ?line ?per_bit_opt(testCompactBitString:ticket_7734(?PER)),
+
+ ?line ?uper_bin(testCompactBitString:compile(Config,uper_bin,
+ [compact_bit_string])),
+ ?line ?uper_bin(testCompactBitString:compact_bit_string(uper_bin)),
+ ?line ?uper_bin(testCompactBitString:bit_string_unnamed(uper_bin)),
+
+ ?line testCompactBitString:compile(Config,?PER,[optimize,compact_bit_string]),
+ ?line testCompactBitString:compact_bit_string(?PER),
+ ?line testCompactBitString:bit_string_unnamed(?PER),
+
+ ?line testCompactBitString:otp_4869(?PER).
+
+
+testPrimStrings(suite) -> [];
+testPrimStrings(Config) ->
+
+ ?line testPrimStrings:compile(Config,?BER,[]),
+ ?line testPrimStrings_cases(?BER),
+ ?line testPrimStrings:more_strings(?BER), %% these are not implemented in per yet
+ ?line ?ber_driver(?BER,testPrimStrings:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testPrimStrings_cases(?BER)),
+ ?line ?ber_driver(?BER,testPrimStrings:more_strings(?BER)),
+
+ ?line testPrimStrings:compile(Config,?PER,[]),
+ ?line testPrimStrings_cases(?PER),
+
+ ?line ?per_bit_opt(testPrimStrings:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testPrimStrings_cases(?PER)),
+
+ ?line ?uper_bin(testPrimStrings:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testPrimStrings_cases(uper_bin)),
+
+ ?line testPrimStrings:compile(Config,?PER,[optimize]),
+ ?line testPrimStrings_cases(?PER).
+
+testPrimStrings_cases(Rules) ->
+ ?line testPrimStrings:bit_string(Rules),
+ ?line testPrimStrings:bit_string_unnamed(Rules),
+ ?line testPrimStrings:octet_string(Rules),
+ ?line testPrimStrings:numeric_string(Rules),
+ ?line testPrimStrings:other_strings(Rules),
+ ?line testPrimStrings:universal_string(Rules),
+ ?line testPrimStrings:bmp_string(Rules),
+ ?line testPrimStrings:times(Rules),
+ ?line testPrimStrings:utf8_string(Rules).
+
+
+
+testPrimExternal(suite) -> [];
+testPrimExternal(Config) ->
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testPrimExternal:compile(Config,?BER,[]),
+ ?line testPrimExternal_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testPrimExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testPrimExternal_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testPrimExternal:compile(Config,?PER,[]),
+ ?line testPrimExternal_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testPrimExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testPrimExternal_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testPrimExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testPrimExternal_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testPrimExternal:compile(Config,?PER,[optimize]),
+ ?line testPrimExternal_cases(?PER).
+
+testPrimExternal_cases(Rules) ->
+ ?line testPrimExternal:external(Rules).
+
+
+
+
+testChoPrim(suite) -> [];
+testChoPrim(Config) ->
+
+ ?line testChoPrim:compile(Config,?BER,[]),
+ ?line testChoPrim_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoPrim:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoPrim_cases(?BER)),
+
+ ?line testChoPrim:compile(Config,?PER,[]),
+ ?line testChoPrim_cases(?PER),
+
+ ?line ?per_bit_opt(testChoPrim:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoPrim_cases(?PER)),
+
+ ?line ?uper_bin(testChoPrim:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoPrim_cases(uper_bin)),
+
+ ?line testChoPrim:compile(Config,?PER,[optimize]),
+ ?line testChoPrim_cases(?PER).
+
+testChoPrim_cases(Rules) ->
+ ?line testChoPrim:bool(Rules),
+ ?line testChoPrim:int(Rules).
+
+
+
+testChoExtension(suite) -> [];
+testChoExtension(Config) ->
+
+ ?line testChoExtension:compile(Config,?BER,[]),
+ ?line testChoExtension_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoExtension:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoExtension_cases(?BER)),
+
+ ?line testChoExtension:compile(Config,?PER,[]),
+ ?line testChoExtension_cases(?PER),
+
+ ?line ?per_bit_opt(testChoExtension:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoExtension_cases(?PER)),
+
+ ?line ?uper_bin(testChoExtension:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoExtension_cases(uper_bin)),
+
+ ?line testChoExtension:compile(Config,?PER,[optimize]),
+ ?line testChoExtension_cases(?PER).
+
+testChoExtension_cases(Rules) ->
+ ?line testChoExtension:extension(Rules).
+
+
+
+testChoExternal(suite) -> [];
+testChoExternal(Config) ->
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testChoExternal:compile(Config,?BER,[]),
+ ?line testChoExternal_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoExternal_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testChoExternal:compile(Config,?PER,[]),
+ ?line testChoExternal_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoExternal_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoExternal_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testChoExternal:compile(Config,?PER,[optimize]),
+ ?line testChoExternal_cases(?PER).
+
+
+testChoExternal_cases(Rules) ->
+ ?line testChoExternal:external(Rules).
+
+
+
+testChoOptional(suite) -> [];
+testChoOptional(Config) ->
+
+ ?line testChoOptional:compile(Config,?BER,[]),
+ ?line testChoOptional_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoOptional:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoOptional_cases(?BER)),
+
+ ?line testChoOptional:compile(Config,?PER,[]),
+ ?line testChoOptional_cases(?PER),
+
+ ?line ?per_bit_opt(testChoOptional:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoOptional_cases(?PER)),
+
+ ?line ?uper_bin(testChoOptional:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoOptional_cases(uper_bin)),
+
+ ?line testChoOptional:compile(Config,?PER,[optimize]),
+ ?line testChoOptional_cases(?PER).
+
+testChoOptional_cases(Rules) ->
+ ?line testChoOptional:optional(Rules).
+
+testChoOptionalImplicitTag(suite) -> [];
+testChoOptionalImplicitTag(Config) ->
+ %% Only meaningful for ?BER
+ ?line testChoOptionalImplicitTag:compile(Config,?BER),
+ ?line testChoOptionalImplicitTag:optional(?BER).
+
+
+testChoRecursive(suite) -> [];
+testChoRecursive(Config) ->
+
+ ?line testChoRecursive:compile(Config,?BER,[]),
+ ?line testChoRecursive_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoRecursive:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoRecursive_cases(?BER)),
+
+ ?line testChoRecursive:compile(Config,?PER,[]),
+ ?line testChoRecursive_cases(?PER),
+
+ ?line ?per_bit_opt(testChoRecursive:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoRecursive_cases(?PER)),
+
+ ?line ?uper_bin(testChoRecursive:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoRecursive_cases(uper_bin)),
+
+ ?line testChoRecursive:compile(Config,?PER,[optimize]),
+ ?line testChoRecursive_cases(?PER).
+
+testChoRecursive_cases(Rules) ->
+ ?line testChoRecursive:recursive(Rules).
+
+
+
+testChoTypeRefCho(suite) -> [];
+testChoTypeRefCho(Config) ->
+
+ ?line testChoTypeRefCho:compile(Config,?BER,[]),
+ ?line testChoTypeRefCho_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoTypeRefCho:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoTypeRefCho_cases(?BER)),
+
+ ?line testChoTypeRefCho:compile(Config,?PER,[]),
+ ?line testChoTypeRefCho_cases(?PER),
+
+ ?line ?per_bit_opt(testChoTypeRefCho:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoTypeRefCho_cases(?PER)),
+
+ ?line ?uper_bin(testChoTypeRefCho:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoTypeRefCho_cases(uper_bin)),
+
+ ?line testChoTypeRefCho:compile(Config,?PER,[optimize]),
+ ?line testChoTypeRefCho_cases(?PER).
+
+testChoTypeRefCho_cases(Rules) ->
+ ?line testChoTypeRefCho:choice(Rules).
+
+
+
+testChoTypeRefPrim(suite) -> [];
+testChoTypeRefPrim(Config) ->
+
+ ?line testChoTypeRefPrim:compile(Config,?BER,[]),
+ ?line testChoTypeRefPrim_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoTypeRefPrim:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoTypeRefPrim_cases(?BER)),
+
+ ?line testChoTypeRefPrim:compile(Config,?PER,[]),
+ ?line testChoTypeRefPrim_cases(?PER),
+
+ ?line ?per_bit_opt(testChoTypeRefPrim:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoTypeRefPrim_cases(?PER)),
+
+ ?line ?uper_bin(testChoTypeRefPrim:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoTypeRefPrim_cases(uper_bin)),
+
+ ?line testChoTypeRefPrim:compile(Config,?PER,[optimize]),
+ ?line testChoTypeRefPrim_cases(?PER).
+
+testChoTypeRefPrim_cases(Rules) ->
+ ?line testChoTypeRefPrim:prim(Rules).
+
+
+
+testChoTypeRefSeq(suite) -> [];
+testChoTypeRefSeq(Config) ->
+
+ ?line testChoTypeRefSeq:compile(Config,?BER,[]),
+ ?line testChoTypeRefSeq_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoTypeRefSeq:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoTypeRefSeq_cases(?BER)),
+
+ ?line testChoTypeRefSeq:compile(Config,?PER,[]),
+ ?line testChoTypeRefSeq_cases(?PER),
+
+ ?line ?per_bit_opt(testChoTypeRefSeq:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoTypeRefSeq_cases(?PER)),
+
+ ?line ?uper_bin(testChoTypeRefSeq:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoTypeRefSeq_cases(uper_bin)),
+
+ ?line testChoTypeRefSeq:compile(Config,?PER,[optimize]),
+ ?line testChoTypeRefSeq_cases(?PER).
+
+testChoTypeRefSeq_cases(Rules) ->
+ ?line testChoTypeRefSeq:seq(Rules).
+
+
+
+testChoTypeRefSet(suite) -> [];
+testChoTypeRefSet(Config) ->
+
+ ?line testChoTypeRefSet:compile(Config,?BER,[]),
+ ?line testChoTypeRefSet_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoTypeRefSet:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoTypeRefSet_cases(?BER)),
+
+ ?line testChoTypeRefSet:compile(Config,?PER,[]),
+ ?line testChoTypeRefSet_cases(?PER),
+
+ ?line ?per_bit_opt(testChoTypeRefSet:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoTypeRefSet_cases(?PER)),
+
+ ?line ?uper_bin(testChoTypeRefSet:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoTypeRefSet_cases(uper_bin)),
+
+ ?line testChoTypeRefSet:compile(Config,?PER,[optimize]),
+ ?line testChoTypeRefSet_cases(?PER).
+
+testChoTypeRefSet_cases(Rules) ->
+ ?line testChoTypeRefSet:set(Rules).
+
+
+
+testDef(suite) -> [];
+testDef(Config) ->
+
+ ?line testDef:compile(Config,?BER,[]),
+ ?line testDef_cases(?BER),
+
+ ?line ?ber_driver(?BER,testDef:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testDef_cases(?BER)),
+
+ ?line testDef:compile(Config,?PER,[]),
+ ?line testDef_cases(?PER),
+
+ ?line ?per_bit_opt(testDef:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testDef_cases(?PER)),
+
+ ?line ?uper_bin(testDef:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testDef_cases(uper_bin)),
+
+ ?line testDef:compile(Config,?PER,[optimize]),
+ ?line testDef_cases(?PER).
+
+testDef_cases(Rules) ->
+ ?line testDef:main(Rules).
+
+
+
+testOpt(suite) -> [];
+testOpt(Config) ->
+
+ ?line testOpt:compile(Config,?BER),
+ ?line testOpt_cases(?BER),
+
+ ?line testOpt:compile(Config,?PER),
+ ?line testOpt_cases(?PER).
+
+testOpt_cases(Rules) ->
+ ?line testOpt:main(Rules).
+
+
+testEnumExt(suite) -> [];
+testEnumExt(Config) ->
+
+ ?line testEnumExt:compile(Config,?BER,[]),
+ ?line testEnumExt:main(?BER),
+
+ ?line ?ber_driver(?BER,testEnumExt:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testEnumExt:main(?BER)),
+
+ ?line testEnumExt:compile(Config,?PER,[]),
+ ?line testEnumExt:main(?PER),
+
+ ?line ?per_bit_opt(testEnumExt:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testEnumExt:main(?PER)),
+
+ ?line ?uper_bin(testEnumExt:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testEnumExt:main(uper_bin)),
+
+ ?line testEnumExt:compile(Config,?PER,[optimize]),
+ ?line testEnumExt:main(?PER).
+
+testSeqDefault(doc) -> ["Test of OTP-2523 ENUMERATED with extensionmark."];
+testSeqDefault(suite) -> [];
+testSeqDefault(Config) ->
+
+ ?line testSeqDefault:compile(Config,?BER,[]),
+ ?line testSeqDefault_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqDefault:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqDefault_cases(?BER)),
+
+ ?line testSeqDefault:compile(Config,?PER,[]),
+ ?line testSeqDefault_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqDefault:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqDefault_cases(?PER)),
+
+ ?line ?uper_bin(testSeqDefault:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqDefault_cases(uper_bin)),
+
+ ?line testSeqDefault:compile(Config,?PER,[optimize]),
+ ?line testSeqDefault_cases(?PER).
+
+testSeqDefault_cases(Rules) ->
+ ?line testSeqDefault:main(Rules).
+
+
+
+testSeqExtension(suite) -> [];
+testSeqExtension(Config) ->
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSeqExtension:compile(Config,?BER,[]),
+ ?line testSeqExtension_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqExtension:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqExtension_cases(?BER)).
+
+testSeqExtension_cases(Rules) ->
+ ?line testSeqExtension:main(Rules).
+
+
+
+testSeqExternal(suite) -> [];
+testSeqExternal(Config) ->
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSeqExternal:compile(Config,?BER,[]),
+ ?line testSeqExternal_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqExternal_cases(?BER)).
+
+testSeqExternal_cases(Rules) ->
+ ?line testSeqExternal:main(Rules).
+
+
+testSeqOptional(suite) -> [];
+testSeqOptional(Config) ->
+
+ ?line testSeqOptional:compile(Config,?BER,[]),
+ ?line testSeqOptional_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqOptional:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOptional_cases(?BER)),
+
+ ?line testSeqOptional:compile(Config,?PER,[]),
+ ?line testSeqOptional_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqOptional:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqOptional_cases(?PER)),
+
+ ?line ?uper_bin(testSeqOptional:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqOptional_cases(uper_bin)),
+
+ ?line testSeqOptional:compile(Config,?PER,[optimize]),
+ ?line testSeqOptional_cases(?PER).
+
+testSeqOptional_cases(Rules) ->
+ ?line testSeqOptional:main(Rules).
+
+
+
+testSeqPrim(suite) -> [];
+testSeqPrim(Config) ->
+
+ ?line testSeqPrim:compile(Config,?BER,[]),
+ ?line testSeqPrim_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqPrim:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqPrim_cases(?BER)),
+
+ ?line testSeqPrim:compile(Config,?PER,[]),
+ ?line testSeqPrim_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqPrim:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqPrim_cases(?PER)),
+
+ ?line ?uper_bin(testSeqPrim:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqPrim_cases(uper_bin)),
+
+ ?line testSeqPrim:compile(Config,?PER,[optimize]),
+ ?line testSeqPrim_cases(?PER).
+
+testSeqPrim_cases(Rules) ->
+ ?line testSeqPrim:main(Rules).
+
+
+testSeq2738(doc) -> ["Test of OTP-2738 Detect corrupt optional component."];
+testSeq2738(suite) -> [];
+testSeq2738(Config) ->
+
+ ?line testSeq2738:compile(Config,?BER,[]),
+ ?line testSeq2738_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeq2738:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeq2738_cases(?BER)),
+
+ ?line testSeq2738:compile(Config,?PER,[]),
+ ?line testSeq2738_cases(?PER),
+
+ ?line ?per_bit_opt(testSeq2738:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeq2738_cases(?PER)),
+
+ ?line ?uper_bin(testSeq2738:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeq2738_cases(uper_bin)),
+
+ ?line testSeq2738:compile(Config,?PER,[optimize]),
+ ?line testSeq2738_cases(?PER).
+
+testSeq2738_cases(Rules) ->
+ ?line testSeq2738:main(Rules).
+
+
+testSeqTag(suite) -> [];
+testSeqTag(Config) ->
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSeqTag:compile(Config,?BER,[]),
+ ?line testSeqTag_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqTag:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqTag_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testSeqTag:compile(Config,?PER,[]),
+ ?line testSeqTag_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqTag:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqTag_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqTag:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqTag_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testSeqTag:compile(Config,?PER,[optimize]),
+ ?line testSeqTag_cases(?PER).
+
+testSeqTag_cases(Rules) ->
+ ?line testSeqTag:main(Rules).
+
+
+
+
+testSeqTypeRefCho(suite) -> [];
+testSeqTypeRefCho(Config) ->
+
+ ?line testSeqTypeRefCho:compile(Config,?BER,[]),
+ ?line testSeqTypeRefCho_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqTypeRefCho:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqTypeRefCho_cases(?BER)),
+
+ ?line testSeqTypeRefCho:compile(Config,?PER,[]),
+ ?line testSeqTypeRefCho_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqTypeRefCho:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqTypeRefCho_cases(?PER)),
+
+ ?line ?uper_bin(testSeqTypeRefCho:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqTypeRefCho_cases(uper_bin)),
+
+ ?line testSeqTypeRefCho:compile(Config,?PER,[optimize]),
+ ?line testSeqTypeRefCho_cases(?PER).
+
+testSeqTypeRefCho_cases(Rules) ->
+ ?line testSeqTypeRefCho:main(Rules).
+
+
+
+testSeqTypeRefPrim(suite) -> [];
+testSeqTypeRefPrim(Config) ->
+
+ ?line testSeqTypeRefPrim:compile(Config,?BER,[]),
+ ?line testSeqTypeRefPrim_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqTypeRefPrim:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqTypeRefPrim_cases(?BER)),
+
+ ?line testSeqTypeRefPrim:compile(Config,?PER,[]),
+ ?line testSeqTypeRefPrim_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqTypeRefPrim:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqTypeRefPrim_cases(?PER)),
+
+ ?line ?uper_bin(testSeqTypeRefPrim:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqTypeRefPrim_cases(uper_bin)),
+
+ ?line testSeqTypeRefPrim:compile(Config,?PER,[optimize]),
+ ?line testSeqTypeRefPrim_cases(?PER).
+
+testSeqTypeRefPrim_cases(Rules) ->
+ ?line testSeqTypeRefPrim:main(Rules).
+
+
+
+testSeqTypeRefSeq(suite) -> [];
+testSeqTypeRefSeq(Config) ->
+
+ ?line testSeqTypeRefSeq:compile(Config,?BER,[]),
+ ?line testSeqTypeRefSeq_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqTypeRefSeq:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqTypeRefSeq_cases(?BER)),
+
+ ?line testSeqTypeRefSeq:compile(Config,?PER,[]),
+ ?line testSeqTypeRefSeq_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqTypeRefSeq:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqTypeRefSeq_cases(?PER)),
+
+ ?line ?uper_bin(testSeqTypeRefSeq:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqTypeRefSeq_cases(uper_bin)),
+
+ ?line testSeqTypeRefSeq:compile(Config,?PER,[optimize]),
+ ?line testSeqTypeRefSeq_cases(?PER).
+
+testSeqTypeRefSeq_cases(Rules) ->
+ ?line testSeqTypeRefSeq:main(Rules).
+
+
+
+testSeqTypeRefSet(suite) -> [];
+testSeqTypeRefSet(Config) ->
+
+ ?line testSeqTypeRefSet:compile(Config,?BER,[]),
+ ?line testSeqTypeRefSet_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqTypeRefSet:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqTypeRefSet_cases(?BER)),
+
+ ?line testSeqTypeRefSet:compile(Config,?PER,[]),
+ ?line testSeqTypeRefSet_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqTypeRefSet:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqTypeRefSet_cases(?PER)),
+
+ ?line ?uper_bin(testSeqTypeRefSet:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqTypeRefSet_cases(uper_bin)),
+
+ ?line testSeqTypeRefSet:compile(Config,?PER,[optimize]),
+ ?line testSeqTypeRefSet_cases(?PER).
+
+testSeqTypeRefSet_cases(Rules) ->
+ ?line testSeqTypeRefSet:main(Rules).
+
+
+
+
+testSeqOf(suite) -> [];
+testSeqOf(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSeqOf:compile(Config,?BER,[]),
+ ?line testSeqOf_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqOf:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOf_cases(?BER)),
+
+ ?line testSeqOf:compile(Config,?PER,[]),
+ ?line testSeqOf_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqOf:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqOf_cases(?PER)),
+
+ ?line ?uper_bin(testSeqOf:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqOf_cases(uper_bin)),
+
+ ?line testSeqOf:compile(Config,?PER,[optimize]),
+ ?line testSeqOf_cases(?PER).
+
+testSeqOf_cases(Rules) ->
+ ?line testSeqOf:main(Rules).
+
+
+
+
+testSeqOfCho(suite) -> [];
+testSeqOfCho(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSeqOfCho:compile(Config,?BER,[]),
+ ?line testSeqOfCho_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqOfCho:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOfCho_cases(?BER)),
+
+ ?line testSeqOfCho:compile(Config,?PER,[]),
+ ?line testSeqOfCho_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqOfCho:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqOfCho_cases(?PER)),
+
+ ?line ?uper_bin(testSeqOfCho:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqOfCho_cases(uper_bin)),
+
+ ?line testSeqOfCho:compile(Config,?PER,[optimize]),
+ ?line testSeqOfCho_cases(?PER).
+
+testSeqOfIndefinite(suite) -> [];
+testSeqOfIndefinite(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSeqOfIndefinite:compile(Config,?BER,[]),
+ ?line testSeqOfIndefinite:main(),
+
+ ?line ?ber_driver(?BER,testSeqOfIndefinite:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOfIndefinite:main()).
+
+testSeqOfCho_cases(Rules) ->
+ ?line testSeqOfCho:main(Rules).
+
+
+testSeqOfExternal(suite) -> [];
+testSeqOfExternal(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSeqOfExternal:compile(Config,?BER,[]),
+ ?line testSeqOfExternal_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOfExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOfExternal_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testSeqOfExternal:compile(Config,?PER,[]),
+ ?line testSeqOfExternal_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqOfExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqOfExternal_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqOfExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqOfExternal_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testSeqOfExternal:compile(Config,?PER,[optimize]),
+ ?line testSeqOfExternal_cases(?PER).
+
+testSeqOfExternal_cases(Rules) ->
+ ?line testSeqOfExternal:main(Rules).
+
+
+
+testSeqOfTag(suite) -> [];
+testSeqOfTag(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSeqOfTag:compile(Config,?BER,[]),
+ ?line testSeqOfTag_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOfTag:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOfTag_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testSeqOfTag:compile(Config,?PER,[]),
+ ?line testSeqOfTag_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqOfTag:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqOfTag_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqOfTag:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqOfTag_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testSeqOfTag:compile(Config,?PER,[optimize]),
+ ?line testSeqOfTag_cases(?PER).
+
+testSeqOfTag_cases(Rules) ->
+ ?line testSeqOfTag:main(Rules).
+
+
+
+
+testSetDefault(suite) -> [];
+testSetDefault(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetDefault:compile(Config,?BER,[]),
+ ?line testSetDefault_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetDefault:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetDefault_cases(?BER)),
+
+ ?line testSetDefault:compile(Config,?PER,[]),
+ ?line testSetDefault_cases(?PER),
+
+ ?line ?per_bit_opt(testSetDefault:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetDefault_cases(?PER)),
+
+ ?line ?uper_bin(testSetDefault:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetDefault_cases(uper_bin)),
+
+ ?line testSetDefault:compile(Config,?PER,[optimize]),
+ ?line testSetDefault_cases(?PER).
+
+testSetDefault_cases(Rules) ->
+ ?line testSetDefault:main(Rules).
+
+
+testParamBasic(suite) -> [];
+testParamBasic(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testParamBasic:compile(Config,?BER,[]),
+ ?line testParamBasic_cases(?BER),
+
+ ?line ?ber_driver(?BER,testParamBasic:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testParamBasic_cases(?BER)),
+
+ ?line testParamBasic:compile(Config,?PER,[]),
+ ?line testParamBasic_cases(?PER),
+
+ ?line ?per_bit_opt(testParamBasic:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testParamBasic_cases(?PER)),
+
+ ?line ?uper_bin(testParamBasic:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testParamBasic_cases(uper_bin)),
+
+ ?line testParamBasic:compile(Config,?PER,[optimize]),
+ ?line testParamBasic_cases(?PER).
+
+
+testParamBasic_cases(Rules) ->
+ ?line testParamBasic:main(Rules).
+
+testSetExtension(suite) -> [];
+testSetExtension(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSetExtension:compile(Config,?BER,[]),
+ ?line testSetExtension_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetExtension:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetExtension_cases(?BER)).
+
+testSetExtension_cases(Rules) ->
+ ?line testSetExtension:main(Rules).
+
+
+testSetExternal(suite) -> [];
+testSetExternal(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSetExternal:compile(Config,?BER,[]),
+ ?line testSetExternal_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetExternal_cases(?BER)).
+
+testSetExternal_cases(Rules) ->
+ ?line testSetExternal:main(Rules).
+
+
+testSetOptional(suite) -> [];
+testSetOptional(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetOptional:compile(Config,?BER,[]),
+ ?line testSetOptional_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetOptional:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetOptional_cases(?BER)),
+
+ ?line testSetOptional:compile(Config,?PER,[]),
+ ?line testSetOptional_cases(?PER),
+
+ ?line ?per_bit_opt(testSetOptional:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetOptional_cases(?PER)),
+
+ ?line ?uper_bin(testSetOptional:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetOptional_cases(uper_bin)),
+
+ ?line testSetOptional:compile(Config,?PER,[optimize]),
+ ?line testSetOptional_cases(?PER).
+
+testSetOptional_cases(Rules) ->
+ ?line ok = testSetOptional:ticket_7533(Rules),
+ ?line ok = testSetOptional:main(Rules).
+
+
+
+
+testSetPrim(suite) -> [];
+testSetPrim(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetPrim:compile(Config,?BER,[]),
+ ?line testSetPrim_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetPrim:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetPrim_cases(?BER)),
+
+ ?line testSetPrim:compile(Config,?PER,[]),
+ ?line testSetPrim_cases(?PER),
+
+ ?line ?per_bit_opt(testSetPrim:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetPrim_cases(?PER)),
+
+ ?line ?uper_bin(testSetPrim:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetPrim_cases(uper_bin)),
+
+ ?line testSetPrim:compile(Config,?PER,[optimize]),
+ ?line testSetPrim_cases(?PER).
+
+testSetPrim_cases(Rules) ->
+ ?line testSetPrim:main(Rules).
+
+
+
+testSetTag(suite) -> [];
+testSetTag(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSetTag:compile(Config,?BER,[]),
+ ?line testSetTag_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetTag:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetTag_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testSetTag:compile(Config,?PER,[]),
+ ?line testSetTag_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetTag:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetTag_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetTag:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetTag_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testSetTag:compile(Config,?PER,[optimize]),
+ ?line testSetTag_cases(?PER).
+
+testSetTag_cases(Rules) ->
+ ?line testSetTag:main(Rules).
+
+
+
+testSetTypeRefCho(suite) -> [];
+testSetTypeRefCho(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetTypeRefCho:compile(Config,?BER,[]),
+ ?line testSetTypeRefCho_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetTypeRefCho:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetTypeRefCho_cases(?BER)),
+
+ ?line testSetTypeRefCho:compile(Config,?PER,[]),
+ ?line testSetTypeRefCho_cases(?PER),
+
+ ?line ?per_bit_opt(testSetTypeRefCho:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetTypeRefCho_cases(?PER)),
+
+ ?line ?uper_bin(testSetTypeRefCho:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetTypeRefCho_cases(uper_bin)),
+
+ ?line testSetTypeRefCho:compile(Config,?PER,[optimize]),
+ ?line testSetTypeRefCho_cases(?PER).
+
+testSetTypeRefCho_cases(Rules) ->
+ ?line testSetTypeRefCho:main(Rules).
+
+
+
+testSetTypeRefPrim(suite) -> [];
+testSetTypeRefPrim(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetTypeRefPrim:compile(Config,?BER,[]),
+ ?line testSetTypeRefPrim_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetTypeRefPrim:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetTypeRefPrim_cases(?BER)),
+
+ ?line testSetTypeRefPrim:compile(Config,?PER,[]),
+ ?line testSetTypeRefPrim_cases(?PER),
+
+ ?line ?per_bit_opt(testSetTypeRefPrim:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetTypeRefPrim_cases(?PER)),
+
+ ?line ?uper_bin(testSetTypeRefPrim:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetTypeRefPrim_cases(uper_bin)),
+
+ ?line testSetTypeRefPrim:compile(Config,?PER,[optimize]),
+ ?line testSetTypeRefPrim_cases(?PER).
+
+testSetTypeRefPrim_cases(Rules) ->
+ ?line testSetTypeRefPrim:main(Rules).
+
+
+
+testSetTypeRefSeq(suite) -> [];
+testSetTypeRefSeq(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetTypeRefSeq:compile(Config,?BER,[]),
+ ?line testSetTypeRefSeq_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetTypeRefSeq:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetTypeRefSeq_cases(?BER)),
+
+ ?line testSetTypeRefSeq:compile(Config,?PER,[]),
+ ?line testSetTypeRefSeq_cases(?PER),
+
+ ?line ?per_bit_opt(testSetTypeRefSeq:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetTypeRefSeq_cases(?PER)),
+
+ ?line ?uper_bin(testSetTypeRefSeq:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetTypeRefSeq_cases(uper_bin)),
+
+ ?line testSetTypeRefSeq:compile(Config,?PER,[optimize]),
+ ?line testSetTypeRefSeq_cases(?PER).
+
+testSetTypeRefSeq_cases(Rules) ->
+ ?line testSetTypeRefSeq:main(Rules).
+
+
+
+testSetTypeRefSet(suite) -> [];
+testSetTypeRefSet(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetTypeRefSet:compile(Config,?BER,[]),
+ ?line testSetTypeRefSet_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetTypeRefSet:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetTypeRefSet_cases(?BER)),
+
+ ?line testSetTypeRefSet:compile(Config,?PER,[]),
+ ?line testSetTypeRefSet_cases(?PER),
+
+ ?line ?per_bit_opt(testSetTypeRefSet:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetTypeRefSet_cases(?PER)),
+
+ ?line ?uper_bin(testSetTypeRefSet:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetTypeRefSet_cases(uper_bin)),
+
+ ?line testSetTypeRefSet:compile(Config,?PER,[optimize]),
+ ?line testSetTypeRefSet_cases(?PER).
+
+testSetTypeRefSet_cases(Rules) ->
+ ?line testSetTypeRefSet:main(Rules).
+
+
+
+testSetOf(suite) -> [];
+testSetOf(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetOf:compile(Config,?BER,[]),
+ ?line testSetOf_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetOf:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetOf_cases(?BER)),
+
+ ?line testSetOf:compile(Config,?PER,[]),
+ ?line testSetOf_cases(?PER),
+
+ ?line ?per_bit_opt(testSetOf:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetOf_cases(?PER)),
+
+ ?line ?uper_bin(testSetOf:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetOf_cases(uper_bin)),
+
+ ?line testSetOf:compile(Config,?PER,[optimize]),
+ ?line testSetOf_cases(?PER).
+
+testSetOf_cases(Rules) ->
+ ?line testSetOf:main(Rules).
+
+
+
+testSetOfCho(suite) -> [];
+testSetOfCho(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetOfCho:compile(Config,?BER,[]),
+ ?line testSetOfCho_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetOfCho:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetOfCho_cases(?BER)),
+
+ ?line testSetOfCho:compile(Config,?PER,[]),
+ ?line testSetOfCho_cases(?PER),
+
+ ?line ?per_bit_opt(testSetOfCho:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetOfCho_cases(?PER)),
+
+ ?line ?uper_bin(testSetOfCho:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetOfCho_cases(uper_bin)),
+
+ ?line testSetOfCho:compile(Config,?PER,[optimize]),
+ ?line testSetOfCho_cases(?PER).
+
+testSetOfCho_cases(Rules) ->
+ ?line testSetOfCho:main(Rules).
+
+
+testSetOfExternal(suite) -> [];
+testSetOfExternal(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSetOfExternal:compile(Config,?BER,[]),
+ ?line testSetOfExternal_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetOfExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetOfExternal_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testSetOfExternal:compile(Config,?PER,[]),
+ ?line testSetOfExternal_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetOfExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetOfExternal_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetOfExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetOfExternal_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testSetOfExternal:compile(Config,?PER,[optimize]),
+ ?line testSetOfExternal_cases(?PER).
+
+testSetOfExternal_cases(Rules) ->
+ ?line testSetOfExternal:main(Rules).
+
+
+
+
+testSetOfTag(suite) -> [];
+testSetOfTag(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSetOfTag:compile(Config,?BER,[]),
+ ?line testSetOfTag_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetOfTag:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetOfTag_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testSetOfTag:compile(Config,?PER,[]),
+ ?line testSetOfTag_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetOfTag:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetOfTag_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetOfTag:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetOfTag_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testSetOfTag:compile(Config,?PER,[optimize]),
+ ?line testSetOfTag_cases(?PER).
+
+testSetOfTag_cases(Rules) ->
+ ?line testSetOfTag:main(Rules).
+
+
+c_syntax(suite) -> [];
+c_syntax(Config) ->
+ ?line DataDir% ?line testExternal:compile(Config,?PER),
+% ?line testPrimExternal:compile(Config,?PER),
+% ?line testPrimExternal_cases(?PER).
+ = ?config(data_dir,Config),
+ ?line _TempDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line {error,_R1} = asn1ct:compile(filename:join(DataDir,"Syntax")),
+ ?line {error,_R2} = asn1ct:compile(filename:join(DataDir,"BadTypeEnding")),
+ ?line {error,_R3} = asn1ct:compile(filename:join(DataDir,
+ "BadValueAssignment1")),
+ ?line {error,_R4} = asn1ct:compile(filename:join(DataDir,
+ "BadValueAssignment2")),
+ ?line {error,_R5} = asn1ct:compile(filename:join(DataDir,
+ "BadValueSet")),
+ ?line {error,_R6} = asn1ct:compile(filename:join(DataDir,
+ "ChoiceBadExtension")),
+ ?line {error,_R7} = asn1ct:compile(filename:join(DataDir,
+ "EnumerationBadExtension")),
+ ?line {error,_R8} = asn1ct:compile(filename:join(DataDir,
+ "Example")),
+ ?line {error,_R9} = asn1ct:compile(filename:join(DataDir,
+ "Export1")),
+ ?line {error,_R10} = asn1ct:compile(filename:join(DataDir,
+ "MissingEnd")),
+ ?line {error,_R11} = asn1ct:compile(filename:join(DataDir,
+ "SequenceBadComma")),
+ ?line {error,_R12} = asn1ct:compile(filename:join(DataDir,
+ "SequenceBadComponentName")),
+ ?line {error,_R13} = asn1ct:compile(filename:join(DataDir,
+ "SequenceBadComponentType")),
+ ?line {error,_R14} = asn1ct:compile(filename:join(DataDir,
+ "SeqBadComma")).
+
+
+c_string_per(suite) -> [];
+c_string_per(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line TempDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"String"),[?PER,{outdir,TempDir}]).
+
+c_string_ber(suite) -> [];
+c_string_ber(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line TempDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"String"),[?BER,{outdir,TempDir}]).
+
+
+c_implicit_before_choice(suite) -> [];
+c_implicit_before_choice(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line TempDir = ?config(priv_dir,Config),
+ ?line {error,_R2} = asn1ct:compile(filename:join(DataDir,"CCSNARG3"),[?BER,{outdir,TempDir}]).
+
+parse(suite) -> [];
+parse(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ M1 = test_modules(),
+% M2 = parse_modules(),
+ ?line ok = parse1(M1,DataDir,OutDir).
+
+parse1([M|T],DataDir,OutDir) ->
+ ?line ok = asn1ct:compile(DataDir ++ M,[abs,{outdir,OutDir}]),
+ parse1(T,DataDir,OutDir);
+parse1([],_,_) ->
+ ok.
+
+per(suite) -> [];
+per(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = per1(per_modules(),DataDir,OutDir),
+ ?line ?per_bit_opt(per1_bit_opt(per_modules(),DataDir,OutDir)),
+ ?line ok = per1_opt(per_modules(),DataDir,OutDir).
+
+
+per1([M|T],DataDir,OutDir) ->
+ ?line ok = asn1ct:compile(DataDir ++ M,[?PER,{outdir,OutDir}]),
+ ?line ok = asn1ct:test(list_to_atom(M)),
+ per1(T,DataDir,OutDir);
+per1([],_,_) ->
+ ok.
+
+per1_bit_opt([M|T],DataDir,OutDir) ->
+ ?line ok = asn1ct:compile(DataDir ++ M,[?PER,optimize,{outdir,OutDir}]),
+ ?line ok = asn1ct:test(list_to_atom(M)),
+ per1_bit_opt(T,DataDir,OutDir);
+per1_bit_opt([],_,_) ->
+ ok.
+
+per1_opt([M|T],DataDir,OutDir) ->
+ ?line ok = asn1ct:compile(DataDir ++ M,[?PER,optimized,{outdir,OutDir}]),
+ ?line ok = asn1ct:test(list_to_atom(M)),
+ per1_opt(T,DataDir,OutDir);
+per1_opt([],_,_) ->
+ ok.
+
+
+ber_choiceinseq(suite) ->[];
+ber_choiceinseq(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"ChoiceInSeq"),[?BER,{outdir,OutDir}]).
+
+ber_optional(suite) ->[];
+ber_optional(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"SOpttest"),[?BER,{outdir,OutDir}]),
+ ?line V = {'S',{'A',10,asn1_NOVALUE,asn1_NOVALUE},
+ {'B',asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE},
+ {'C',asn1_NOVALUE,111,asn1_NOVALUE}},
+ ?line {ok,B} = asn1_wrapper:encode('SOpttest','S',V),
+ ?line Bytes = lists:flatten(B),
+ ?line V2 = asn1_wrapper:decode('SOpttest','S',Bytes),
+ ?line ok = eq(V,element(2,V2)).
+
+ber_optional_keyed_list(suite) ->[];
+ber_optional_keyed_list(Config) ->
+ case ?BER of
+ ber_bin_v2 -> ok;
+ _ ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"SOpttest"),
+ [?BER,keyed_list,{outdir,OutDir}]),
+ ?line Vrecord = {'S',{'A',10,asn1_NOVALUE,asn1_NOVALUE},
+ {'B',asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE},
+ {'C',asn1_NOVALUE,111,asn1_NOVALUE}},
+ ?line V = [ {a,[{scriptKey,10}]},
+ {b,[]},
+ {c,[{callingPartysCategory,111}]} ],
+ ?line {ok,B} = asn1_wrapper:encode('SOpttest','S',V),
+ ?line Bytes = lists:flatten(B),
+ ?line V2 = asn1_wrapper:decode('SOpttest','S',Bytes),
+ ?line ok = eq(Vrecord,element(2,V2))
+ end.
+
+
+eq(V,V) ->
+ ok.
+
+
+ber_other(suite) ->[];
+ber_other(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = ber1(ber_modules(),DataDir,OutDir).
+
+
+ber1([M|T],DataDir,OutDir) ->
+ ?line ok = asn1ct:compile(DataDir ++ M,[?BER,{outdir,OutDir}]),
+ ?line ok = asn1ct:test(list_to_atom(M)),
+ ber1(T,DataDir,OutDir);
+ber1([],_,_) ->
+ ok.
+
+default_per(suite) ->[];
+default_per(Config) ->
+ default1(?PER,Config,[]).
+
+default_per_opt(suite) -> [];
+default_per_opt(Config) ->
+ ?per_bit_opt(default1(?PER,Config,[optimize])),
+ default1(?PER,Config,[optimize]).
+
+default_ber(suite) ->[];
+default_ber(Config) ->
+ default1(?BER,Config,[]).
+
+default1(Rule,Config,Options) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(DataDir ++ "Def",[Rule,{outdir,OutDir}]++Options),
+ ?line {ok,Bytes1} = asn1_wrapper:encode('Def','Def1',#'Def1'{bool0 = true,
+ bool1 = true,
+ bool2 = true,
+ bool3 = true}),
+ ?line {ok,{'Def1',true,true,true,true}} = asn1_wrapper:decode('Def','Def1',lists:flatten(Bytes1)),
+
+ ?line {ok,Bytes2} = asn1_wrapper:encode('Def','Def1',#'Def1'{bool0 = true}),
+ ?line {ok,{'Def1',true,false,false,false}} = asn1_wrapper:decode('Def','Def1',lists:flatten(Bytes2)),
+
+ ?line {ok,Bytes3} = asn1_wrapper:encode('Def','Def1',#'Def1'{bool0 = true,bool2=false}),
+ ?line {ok,{'Def1',true,false,false,false}} = asn1_wrapper:decode('Def','Def1',lists:flatten(Bytes3)).
+
+
+value_test(suite) ->[];
+value_test(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(DataDir ++ "ObjIdValues",[?BER,{outdir,OutDir}]),
+ ?line {ok,_} = asn1_wrapper:encode('ObjIdValues','ObjIdType','ObjIdValues':'mobileDomainId'()),
+ ?line ok = asn1ct:compile(DataDir ++ "ObjIdValues",[?PER,{outdir,OutDir}]),
+ ?line {ok,_} = asn1_wrapper:encode('ObjIdValues','ObjIdType','ObjIdValues':'mobileDomainId'()),
+ ?line ok = test_bad_values:tests(Config),
+ ok.
+
+
+constructed(suite) ->
+ [];
+constructed(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(DataDir ++ "Constructed",[?BER,{outdir,OutDir}]),
+ ?line {ok,B} = asn1_wrapper:encode('Constructed','S',{'S',false}),
+ ?line [40,3,1,1,0] = lists:flatten(B),
+ ?line {ok,B1} = asn1_wrapper:encode('Constructed','S2',{'S2',false}),
+ ?line [40,5,48,3,1,1,0] = lists:flatten(B1),
+ ?line {ok,B2} = asn1_wrapper:encode('Constructed','I',10),
+ ?line [136,1,10] = lists:flatten(B2),
+ ok.
+
+ber_decode_error(suite) -> [];
+ber_decode_error(Config) ->
+ ?line ok = ber_decode_error:compile(Config,?BER,[]),
+ ?line ok = ber_decode_error:run([]),
+
+ ?line ok = ?ber_driver(?BER,ber_decode_error:compile(Config,?BER,[driver])),
+ ?line ok = ?ber_driver(?BER,ber_decode_error:run([driver])),
+ ok.
+
+h323test(suite) ->
+ [];
+h323test(Config) ->
+ ?line ok = h323test:compile(Config,?PER,[]),
+ ?line ok = h323test:run(?PER),
+ ?line ?per_bit_opt(h323test:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(h323test:run(?PER)),
+ ?line ?uper_bin(h323test:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(h323test:run(uper_bin)),
+ ?line ok = h323test:compile(Config,?PER,[optimize]),
+ ?line ok = h323test:run(?PER),
+ ok.
+
+per_GeneralString(suite) ->
+ [];
+per_GeneralString(Config) ->
+ case erlang:module_loaded('MULTIMEDIA-SYSTEM-CONTROL') of
+ true ->
+ ok;
+ false ->
+ h323test:compile(Config,?PER,[])
+ end,
+ UI = [109,64,1,57],
+ ?line {ok,_V} = asn1_wrapper:decode('MULTIMEDIA-SYSTEM-CONTROL',
+ 'MultimediaSystemControlMessage',UI).
+
+per_open_type(suite) ->
+ [];
+per_open_type(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line ok = asn1ct:compile(DataDir ++ "OpenType",[?PER,{outdir,OutDir}]),
+ Stype = {'Stype',10,true},
+ ?line {ok,Bytes} = asn1_wrapper:encode('OpenType','Ot',Stype),
+ ?line {ok,Stype} = asn1_wrapper:decode('OpenType','Ot',Bytes),
+
+ ?line ?per_bit_opt(ok = asn1ct:compile(DataDir ++ "OpenType",
+ [?PER,optimize,{outdir,OutDir}])),
+ ?line ?per_bit_opt({ok,Bytes}=asn1_wrapper:encode('OpenType','Ot',Stype)),
+ ?line ?per_bit_opt({ok,Stype}=asn1_wrapper:decode('OpenType','Ot',Bytes)),
+
+ ?line ?uper_bin(ok = asn1ct:compile(DataDir ++ "OpenType",
+ [uper_bin,{outdir,OutDir}])),
+ ?line ?uper_bin({ok,Bytes}=asn1_wrapper:encode('OpenType','Ot',Stype)),
+ ?line ?uper_bin({ok,Stype}=asn1_wrapper:decode('OpenType','Ot',Bytes)),
+
+ ?line ok = asn1ct:compile(DataDir ++ "OpenType",
+ [?PER,optimize,{outdir,OutDir}]),
+ ?line {ok,Bytes} = asn1_wrapper:encode('OpenType','Ot',Stype),
+ ?line {ok,Stype} = asn1_wrapper:decode('OpenType','Ot',Bytes).
+
+testConstraints(suite) ->
+ [];
+testConstraints(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testConstraints:compile(Config,?BER,[]),
+ ?line testConstraints:int_constraints(?BER),
+
+ ?line ?ber_driver(?BER,testConstraints:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testConstraints:int_constraints(?BER)),
+
+ ?line testConstraints:compile(Config,?PER,[]),
+ ?line testConstraints:int_constraints(?PER),
+ ?line testConstraints:refed_NNL_name(?PER),
+
+ ?line ?per_bit_opt(testConstraints:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testConstraints:int_constraints(?PER)),
+ ?line ?per_bit_opt(testConstraints:refed_NNL_name(?PER)),
+
+ ?line ?uper_bin(testConstraints:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testConstraints:int_constraints(uper_bin)),
+ ?line ?uper_bin(testConstraints:refed_NNL_name(uper_bin)),
+
+ ?line testConstraints:compile(Config,?PER,[optimize]),
+ ?line testConstraints:int_constraints(?PER),
+ ?line testConstraints:refed_NNL_name(?PER).
+
+testSeqIndefinite(suite) -> [];
+testSeqIndefinite(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSeqIndefinite:compile(Config,?BER,[]),
+ ?line testSeqIndefinite:main(?BER),
+
+ ?line ?ber_driver(?BER,testSeqIndefinite:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqIndefinite:main(?BER)).
+
+testSetIndefinite(suite) -> [];
+testSetIndefinite(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetIndefinite:compile(Config,?BER,[]),
+ ?line testSetIndefinite:main(?BER),
+
+ ?line ?ber_driver(?BER,testSetIndefinite:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetIndefinite:main(?BER)).
+
+testChoiceIndefinite(suite) -> [];
+testChoiceIndefinite(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testChoiceIndefinite:compile(Config,?BER,[]),
+ ?line testChoiceIndefinite:main(?BER),
+
+ ?line ?ber_driver(?BER,testChoiceIndefinite:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoiceIndefinite:main(?BER)).
+
+testInfObjectClass(suite) ->
+ [];
+testInfObjectClass(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testInfObjectClass:compile(Config,?PER,[]),
+ ?line testInfObjectClass:main(?PER),
+ ?line testInfObj:compile(Config,?PER,[]),
+ ?line testInfObj:main(?PER),
+
+ ?line ?per_bit_opt(testInfObjectClass:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testInfObjectClass:main(?PER)),
+ ?line ?per_bit_opt(testInfObj:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testInfObj:main(?PER)),
+
+ ?line ?uper_bin(testInfObjectClass:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testInfObjectClass:main(uper_bin)),
+ ?line ?uper_bin(testInfObj:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testInfObj:main(uper_bin)),
+
+ ?line testInfObjectClass:compile(Config,?PER,[optimize]),
+ ?line testInfObjectClass:main(?PER),
+ ?line testInfObj:compile(Config,?PER,[optimize]),
+ ?line testInfObj:main(?PER),
+
+ ?line testInfObjectClass:compile(Config,?BER,[]),
+ ?line testInfObjectClass:main(?BER),
+ ?line testInfObj:compile(Config,?BER,[]),
+ ?line testInfObj:main(?BER),
+
+ ?line ?ber_driver(?BER,testInfObjectClass:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testInfObjectClass:main(?BER)),
+ ?line ?ber_driver(?BER,testInfObj:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testInfObj:main(?BER)),
+
+ ?line testInfObj:compile_RANAPfiles(Config,?PER,[]),
+
+ ?line ?per_bit_opt(testInfObj:compile_RANAPfiles(Config,?PER,[optimize])),
+
+ ?line ?uper_bin(testInfObj:compile_RANAPfiles(Config,uper_bin,[])),
+
+ ?line testInfObj:compile_RANAPfiles(Config,?PER,[optimize]),
+
+ ?line testInfObj:compile_RANAPfiles(Config,?BER,[]).
+
+testParameterizedInfObj(suite) ->
+ [];
+testParameterizedInfObj(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testParameterizedInfObj:compile(Config,?PER,[]),
+ ?line testParameterizedInfObj:main(?PER),
+
+ ?line ?per_bit_opt(testParameterizedInfObj:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testParameterizedInfObj:main(?PER)),
+
+ ?line ?uper_bin(testParameterizedInfObj:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testParameterizedInfObj:main(uper_bin)),
+
+ ?line testParameterizedInfObj:compile(Config,?PER,[optimize]),
+ ?line testParameterizedInfObj:main(?PER),
+
+ ?line testParameterizedInfObj:compile(Config,?BER,[]),
+ ?line testParameterizedInfObj:main(?BER),
+
+ ?line ?ber_driver(?BER,testParameterizedInfObj:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testParameterizedInfObj:main(?BER)).
+
+testMergeCompile(suite) ->
+ [];
+testMergeCompile(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testMergeCompile:compile(Config,?PER,[]),
+ ?line testMergeCompile:main(?PER),
+ ?line testMergeCompile:mvrasn(?PER),
+
+ ?line ?per_bit_opt(testMergeCompile:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testMergeCompile:main(?PER)),
+ ?line ?per_bit_opt(testMergeCompile:mvrasn(?PER)),
+
+ ?line ?uper_bin(testMergeCompile:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testMergeCompile:main(uper_bin)),
+ ?line ?uper_bin(testMergeCompile:mvrasn(uper_bin)),
+
+ ?line testMergeCompile:compile(Config,?BER,[]),
+ ?line testMergeCompile:main(?BER),
+ ?line testMergeCompile:mvrasn(?BER),
+
+ ?line ?ber_driver(?BER,testMergeCompile:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testMergeCompile:main(?BER)),
+ ?line ?ber_driver(?BER,testMergeCompile:mvrasn(?BER)).
+
+testobj(suite) ->
+ [];
+testobj(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line ok = testRANAP:compile(Config,?PER,[]),
+ ?line ok = testRANAP:testobj(?PER),
+ ?line ok = testParameterizedInfObj:ranap(?PER),
+
+ ?line ?per_bit_opt(ok = testRANAP:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(ok = testRANAP:testobj(?PER)),
+ ?line ?per_bit_opt(ok = testParameterizedInfObj:ranap(?PER)),
+
+ ?line ?uper_bin(ok = testRANAP:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(ok = testRANAP:testobj(uper_bin)),
+ ?line ?uper_bin(ok = testParameterizedInfObj:ranap(uper_bin)),
+
+ ?line ok = testRANAP:compile(Config,?PER,[optimize]),
+ ?line ok = testRANAP:testobj(?PER),
+ ?line ok = testParameterizedInfObj:ranap(?PER),
+
+ ?line ok = testRANAP:compile(Config,?BER,[]),
+ ?line ok = testRANAP:testobj(?BER),
+ ?line ok = testParameterizedInfObj:ranap(?BER),
+
+ ?line ?ber_driver(?BER,testRANAP:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testRANAP:testobj(?BER)),
+ ?line ?ber_driver(?BER,testParameterizedInfObj:ranap(?BER)).
+
+
+testDeepTConstr(suite) ->
+ [];
+testDeepTConstr(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testDeepTConstr:compile(Config,?PER,[]),
+ ?line testDeepTConstr:main(?PER),
+
+ ?line ?per_bit_opt(testDeepTConstr:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testDeepTConstr:main(?PER)),
+
+ ?line ?uper_bin(testDeepTConstr:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testDeepTConstr:main(uper_bin)),
+
+ ?line testDeepTConstr:compile(Config,?PER,[optimize]),
+ ?line testDeepTConstr:main(?PER),
+
+ ?line testDeepTConstr:compile(Config,?BER,[]),
+ ?line testDeepTConstr:main(?BER),
+
+ ?line ?ber_driver(?BER,testDeepTConstr:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testDeepTConstr:main(?BER)).
+
+testInvokeMod(suite) ->
+ [];
+testInvokeMod(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line ok = asn1ct:compile(filename:join(DataDir,"PrimStrings"),[{outdir,OutDir}]),
+ ?line {ok,_Result1} = 'PrimStrings':encode('Bs1',[1,0,1,0]),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"PrimStrings"),[?PER,{outdir,OutDir}]),
+ ?line {ok,_Result2} = 'PrimStrings':encode('Bs1',[1,0,1,0]).
+
+testExport(suite) ->
+ [];
+testExport(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line {error,{asn1,_Reason}} = asn1ct:compile(filename:join(DataDir,"IllegalExport"),[{outdir,OutDir}]).
+
+testImport(suite) ->
+ [];
+testImport(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line _OutDir = ?config(priv_dir,Config),
+ ?line {error,_} = asn1ct:compile(filename:join(DataDir,"ImportsFrom"),[?BER]),
+ ok.
+
+testMegaco(suite) ->
+ [];
+testMegaco(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ io:format("Config: ~p~n",[Config]),
+ ?line {ok,ModuleName1,ModuleName2} = testMegaco:compile(Config,?BER,[]),
+ ?line ok = testMegaco:main(ModuleName1,Config),
+ ?line ok = testMegaco:main(ModuleName2,Config),
+
+ case ?BER of
+ ber_bin_v2 ->
+ ?line {ok,ModuleName3,ModuleName4} = testMegaco:compile(Config,?BER,[driver]),
+ ?line ok = testMegaco:main(ModuleName3,Config),
+ ?line ok = testMegaco:main(ModuleName4,Config);
+ _-> ok
+ end,
+
+ ?line {ok,ModuleName5,ModuleName6} = testMegaco:compile(Config,?PER,[]),
+ ?line ok = testMegaco:main(ModuleName5,Config),
+ ?line ok = testMegaco:main(ModuleName6,Config),
+
+ ?line ?per_bit_opt({ok,ModuleName5,ModuleName6} = testMegaco:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(ok = testMegaco:main(ModuleName5,Config)),
+ ?line ?per_bit_opt(ok = testMegaco:main(ModuleName6,Config)),
+
+ ?line ?uper_bin({ok,ModuleName5,ModuleName6} = testMegaco:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(ok = testMegaco:main(ModuleName5,Config)),
+ ?line ?uper_bin(ok = testMegaco:main(ModuleName6,Config)),
+
+ ?line {ok,ModuleName7,ModuleName8} = testMegaco:compile(Config,?PER,[optimize]),
+ ?line ok = testMegaco:main(ModuleName7,Config),
+ ?line ok = testMegaco:main(ModuleName8,Config).
+
+
+testMvrasn6(suite) -> [];
+testMvrasn6(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testMvrasn6:compile(Config,?BER),
+ ?line testMvrasn6:main().
+
+testContextSwitchingTypes(suite) -> [];
+testContextSwitchingTypes(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testContextSwitchingTypes:compile(Config,?BER,[]),
+ ?line testContextSwitchingTypes:test(),
+
+ ?line ?ber_driver(?BER,testContextSwitchingTypes:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testContextSwitchingTypes:test()),
+
+ ?line testContextSwitchingTypes:compile(Config,?PER,[]),
+ ?line testContextSwitchingTypes:test(),
+
+ ?line ?per_bit_opt(testContextSwitchingTypes:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testContextSwitchingTypes:test()),
+
+ ?line ?uper_bin(testContextSwitchingTypes:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testContextSwitchingTypes:test()),
+
+ ?line testContextSwitchingTypes:compile(Config,?PER,[optimize]),
+ ?line testContextSwitchingTypes:test().
+
+testTypeValueNotation(suite) -> [];
+testTypeValueNotation(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ case ?BER of
+ Ber when Ber == ber; Ber == ber_bin ->
+ ?line testTypeValueNotation:compile(Config,?BER,[]),
+ ?line testTypeValueNotation:main(?BER,dummy);
+ _ ->
+ ok
+ end,
+
+ ?line ?ber_driver(?BER,testTypeValueNotation:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testTypeValueNotation:main(?BER,optimize)),
+
+ case ?BER of
+ Ber2 when Ber2 == ber; Ber2 == ber_bin ->
+ ?line testTypeValueNotation:compile(Config,?PER,[]),
+ ?line testTypeValueNotation:main(?PER,dummy);
+ _ ->
+ ok
+ end,
+
+ ?line ?per_bit_opt(testTypeValueNotation:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testTypeValueNotation:main(?PER,optimize)),
+
+ ?line ?uper_bin(testTypeValueNotation:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testTypeValueNotation:main(uper_bin,optimize)),
+ case ?BER of
+ Ber3 when Ber3 == ber; Ber3 == ber_bin ->
+ ?line testTypeValueNotation:compile(Config,?PER,[optimize]),
+ ?line testTypeValueNotation:main(?PER,optimize);
+ _ ->
+ ok
+ end.
+
+testOpenTypeImplicitTag(suite) -> [];
+testOpenTypeImplicitTag(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testOpenTypeImplicitTag:compile(Config,?BER,[]),
+ ?line testOpenTypeImplicitTag:main(?BER),
+
+ ?line ?ber_driver(?BER,testOpenTypeImplicitTag:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testOpenTypeImplicitTag:main(?BER)),
+
+ ?line testOpenTypeImplicitTag:compile(Config,?PER,[]),
+ ?line testOpenTypeImplicitTag:main(?PER),
+
+ ?line ?per_bit_opt(testOpenTypeImplicitTag:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testOpenTypeImplicitTag:main(?PER)),
+
+ ?line ?uper_bin(testOpenTypeImplicitTag:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testOpenTypeImplicitTag:main(uper_bin)),
+
+ ?line testOpenTypeImplicitTag:compile(Config,?PER,[optimize]),
+ ?line testOpenTypeImplicitTag:main(?PER).
+
+duplicate_tags(suite) -> [];
+duplicate_tags(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ {error,{asn1,[{error,{type,_,_,'SeqOpt1Imp',{asn1,{duplicates_of_the_tags,_}}}}]}} =
+ asn1ct:compile(filename:join(DataDir,"SeqOptional2"),[abs]),
+ ok.
+
+rtUI(suite) -> [];
+rtUI(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Prim"),[?BER]),
+ ?line {ok,_} = asn1rt:info('Prim'),
+
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Prim"),[?PER]),
+ ?line {ok,_} = asn1rt:info('Prim'),
+
+ ?line ok = asn1rt:load_driver(),
+ ?line ok = asn1rt:load_driver(),
+ ?line ok = asn1rt:unload_driver().
+
+testROSE(suite) -> [];
+testROSE(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testROSE:compile(Config,?BER,[]),
+
+ ?line testROSE:compile(Config,?PER,[]),
+ ?line ?per_bit_opt(testROSE:compile(Config,?PER,[optimize])),
+ ?line ?uper_bin(testROSE:compile(Config,uper_bin,[])),
+ ?line testROSE:compile(Config,?PER,[optimize]).
+
+testINSTANCE_OF(suite) -> [];
+testINSTANCE_OF(Config) ->
+ ?line testINSTANCE_OF:compile(Config,?BER,[]),
+ ?line testINSTANCE_OF:main(?BER),
+
+ ?line ?ber_driver(?BER,testINSTANCE_OF:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testINSTANCE_OF:main(?BER)),
+
+ ?line testINSTANCE_OF:compile(Config,?PER,[]),
+ ?line testINSTANCE_OF:main(?PER),
+
+ ?line ?per_bit_opt(testINSTANCE_OF:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testINSTANCE_OF:main(?PER)),
+
+ ?line ?uper_bin(testINSTANCE_OF:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testINSTANCE_OF:main(uper_bin)),
+
+ ?line testINSTANCE_OF:compile(Config,?PER,[optimize]),
+ ?line testINSTANCE_OF:main(?PER).
+
+testTCAP(suite) -> [];
+testTCAP(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testTCAP:compile(Config,?BER,[]),
+ ?line testTCAP:test(?BER,Config),
+
+ ?line ?ber_driver(?BER,testTCAP:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testTCAP:test(?BER,Config)),
+
+ ?line ?ber_driver(?BER,testTCAP:compile_asn1config(Config,?BER,[asn1config])),
+ ?line ?ber_driver(?BER,testTCAP:test_asn1config()).
+
+testDER(suite) ->[];
+testDER(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testDER:compile(Config,?BER,[]),
+ ?line testDER:test(),
+
+ ?line ?ber_driver(?BER,testDER:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testDER:test()),
+
+ ?line testParamBasic:compile_der(Config,?BER),
+ ?line testParamBasic_cases(der),
+
+
+ ?line testSeqSetDefaultVal:compile(Config,?BER),
+ ?line testSeqSetDefaultVal_cases(?BER).
+
+testSeqSetDefaultVal_cases(?BER) ->
+ ?line testSeqSetDefaultVal:main(?BER).
+
+
+specialized_decodes(suite) -> [];
+specialized_decodes(Config) ->
+ ?line test_partial_incomplete_decode:compile(Config,?BER,[optimize]),
+ ?line test_partial_incomplete_decode:test(?BER,Config),
+ ?line test_selective_decode:test(?BER,Config).
+
+special_decode_performance(suite) ->[];
+special_decode_performance(Config) ->
+ ?line ?ber_driver(?BER,test_special_decode_performance:compile(Config,?BER)),
+ ?line ?ber_driver(?BER,test_special_decode_performance:go(all)).
+
+
+test_driver_load(suite) -> [];
+test_driver_load(Config) ->
+ ?line test_driver_load:compile(Config,?PER),
+ ?line test_driver_load:test(?PER,5).
+
+test_ParamTypeInfObj(suite) -> [];
+test_ParamTypeInfObj(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"IN-CS-1-Datatypes"),[ber_bin]).
+
+test_WS_ParamClass(suite) -> [];
+test_WS_ParamClass(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"InformationFramework"),
+ [ber_bin]).
+
+test_Defed_ObjectIdentifier(suite) -> [];
+test_Defed_ObjectIdentifier(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"UsefulDefinitions"),
+ [ber_bin]).
+
+testSelectionType(suite) -> [];
+testSelectionType(Config) ->
+
+ ?line ok = testSelectionTypes:compile(Config,?BER,[]),
+ ?line {ok,_} = testSelectionTypes:test(),
+
+ ?line ok = testSelectionTypes:compile(Config,?PER,[]),
+ ?line {ok,_} = testSelectionTypes:test().
+
+testSSLspecs(suite) -> [];
+testSSLspecs(Config) ->
+
+ ?line ok = testSSLspecs:compile(Config,?BER,
+ [optimize,compact_bit_string,der]),
+ ?line testSSLspecs:run(?BER),
+
+ case code:which(asn1ct) of
+ cover_compiled ->
+ ok;
+ _ ->
+ ?line ok = testSSLspecs:compile_inline(Config,?BER),
+ ?line ok = testSSLspecs:run_inline(?BER)
+ end.
+
+testNortel(suite) -> [];
+testNortel(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Nortel"),[?BER]),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Nortel"),
+ [?BER,optimize]),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Nortel"),
+ [?BER,optimize,driver]),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Nortel"),[?PER]),
+ ?line ?per_bit_opt(ok = asn1ct:compile(filename:join(DataDir,"Nortel"),
+ [?PER,optimize])),
+ ?line ?uper_bin(ok = asn1ct:compile(filename:join(DataDir,"Nortel"),[uper_bin])),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Nortel"),
+ [?PER,optimize]).
+test_undecoded_rest(suite) -> [];
+test_undecoded_rest(Config) ->
+
+ ?line ok = test_undecoded_rest:compile(Config,?BER,[]),
+ ?line ok = test_undecoded_rest:test([]),
+
+ ?line ok = test_undecoded_rest:compile(Config,?BER,[undec_rest]),
+ ?line ok = test_undecoded_rest:test(undec_rest),
+
+ ?line ok = test_undecoded_rest:compile(Config,?PER,[]),
+ ?line ok = test_undecoded_rest:test([]),
+
+ ?line ?per_bit_opt(ok = test_undecoded_rest:compile(Config,?PER,[optimize,undec_rest])),
+ ?line ?per_bit_opt(ok = test_undecoded_rest:test(undec_rest)),
+
+ ?line ?uper_bin(ok = test_undecoded_rest:compile(Config,uper_bin,[undec_rest])),
+ ?line ?uper_bin(ok = test_undecoded_rest:test(undec_rest)),
+
+ ?line ok = test_undecoded_rest:compile(Config,?PER,[undec_rest]),
+ ?line ok = test_undecoded_rest:test(undec_rest).
+
+test_inline(suite) -> [];
+test_inline(Config) ->
+ case code:which(asn1ct) of
+ cover_compiled ->
+ {skip,"Not runnable when cover compiled"};
+ _ ->
+ ?line ok=test_inline:compile(Config,?BER,[]),
+ ?line test_inline:main(?BER),
+ ?line test_inline:inline1(Config,?BER,[]),
+ ?line test_inline:performance2()
+ end.
+
+%test_inline_prf(suite) -> [];
+%test_inline_prf(Config) ->
+% ?line test_inline:performance(Config).
+
+testTcapsystem(suite) -> [];
+testTcapsystem(Config) ->
+ ?line ok=testTcapsystem:compile(Config,?BER,[]).
+
+testNBAPsystem(suite) -> [];
+testNBAPsystem(Config) ->
+ ?line ok=testNBAPsystem:compile(Config,?PER,?per_optimize(?BER)),
+ ?line ok=testNBAPsystem:test(?PER,Config).
+
+test_compile_options(suite) -> [];
+test_compile_options(Config) ->
+ case code:which(asn1ct) of
+ cover_compiled ->
+ {skip,"Not runnable when cover compiled"};
+ _ ->
+ ?line ok = test_compile_options:wrong_path(Config),
+ ?line ok = test_compile_options:path(Config),
+ ?line ok = test_compile_options:noobj(Config),
+ ?line ok = test_compile_options:record_name_prefix(Config),
+ ?line ok = test_compile_options:verbose(Config)
+ end.
+testDoubleEllipses(suite) -> [];
+testDoubleEllipses(Config) ->
+ ?line testDoubleEllipses:compile(Config,?BER,[]),
+ ?line testDoubleEllipses:main(?BER),
+ ?line ?ber_driver(?BER,testDoubleEllipses:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testDoubleEllipses:main(?BER)),
+ ?line ?per_bit_opt(testDoubleEllipses:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testDoubleEllipses:main(?PER)),
+ ?line ?uper_bin(testDoubleEllipses:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testDoubleEllipses:main(uper_bin)),
+ ?line testDoubleEllipses:compile(Config,?PER,?per_optimize(?BER)),
+ ?line testDoubleEllipses:main(?PER).
+
+test_modified_x420(suite) -> [];
+test_modified_x420(Config) ->
+ ?line test_modified_x420:compile(Config),
+ ?line test_modified_x420:test_io(Config).
+
+testX420(suite) -> [];
+testX420(Config) ->
+ ?line testX420:compile(?BER,[der],Config),
+ ?line ok = testX420:ticket7759(?BER,Config),
+ ?line testX420:compile(?PER,[],Config).
+
+test_x691(suite) -> [];
+test_x691(Config) ->
+ case ?PER of
+ per ->
+ ?line ok = test_x691:compile(Config,uper_bin,[]),
+ ?line true = test_x691:cases(uper_bin,unaligned),
+ ?line ok = test_x691:compile(Config,?PER,[]),
+ ?line true = test_x691:cases(?PER,aligned),
+%% ?line ok = asn1_test_lib:ticket_7678(Config,[]),
+ ?line ok = asn1_test_lib:ticket_7708(Config,[]),
+ ?line ok = asn1_test_lib:ticket_7763(Config);
+ _ ->
+ ?line ok = test_x691:compile(Config,?PER,?per_optimize(?BER)),
+ ?line true = test_x691:cases(?PER,aligned)
+ end.
+%% ?line ok = asn1_test_lib:ticket_7876(Config,?PER,[]),
+%% ?line ok = asn1_test_lib:ticket_7876(Config,?PER,[compact_bit_string]),
+%% ?line ok = asn1_test_lib:ticket_7876(Config,?PER,[optimize]),
+%% ?line ok = asn1_test_lib:ticket_7876(Config,?PER,[optimize,compact_bit_string]).
+
+
+ticket_6143(suite) -> [];
+ticket_6143(Config) ->
+ ?line ok = test_compile_options:ticket_6143(Config).
+
+testExtensionAdditionGroup(suite) -> [];
+testExtensionAdditionGroup(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line PrivDir = ?config(priv_dir,Config),
+ ?line Path = code:get_path(),
+ ?line code:add_patha(PrivDir),
+ DoIt = fun(Erule) ->
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Extension-Addition-Group"),[Erule,{outdir,PrivDir}]),
+ ?line {ok,_M} = compile:file(filename:join(DataDir,"extensionAdditionGroup"),[{i,PrivDir},{outdir,PrivDir},debug_info]),
+ ?line ok = extensionAdditionGroup:run(Erule)
+ end,
+ ?line [DoIt(Rule)|| Rule <- [per_bin,uper_bin,ber_bin]],
+ ?line code:set_path(Path).
+
+
+
+% parse_modules() ->
+% ["ImportsFrom"].
+
+per_modules() ->
+ [X || X <- test_modules()].
+ber_modules() ->
+ [X || X <- test_modules(),
+ X =/= "CommonDataTypes",
+ X =/= "DS-EquipmentUser-CommonFunctionOrig-TransmissionPath",
+ X =/= "H323-MESSAGES",
+ X =/= "H235-SECURITY-MESSAGES",
+ X =/= "MULTIMEDIA-SYSTEM-CONTROL"].
+test_modules() ->
+ _Modules = [
+ "BitStr",
+ "CommonDataTypes",
+ "Constraints",
+ "ContextSwitchingTypes",
+ "DS-EquipmentUser-CommonFunctionOrig-TransmissionPath",
+ "Enum",
+ "From",
+ "H235-SECURITY-MESSAGES",
+ "H323-MESSAGES",
+ %%"MULTIMEDIA-SYSTEM-CONTROL", recursive type , problem for asn1ct:value
+ "Import",
+ "Int",
+ "MAP-commonDataTypes",
+% ambigous tags "MAP-insertSubscriberData-def",
+ "Null",
+ "Octetstr",
+ "One",
+ "P-Record",
+ "P",
+% "PDUs",
+ "Person",
+ "PrimStrings",
+ "Real",
+ "XSeq",
+ "XSeqOf",
+ "XSet",
+ "XSetOf",
+ "String",
+ "SwCDR",
+% "Syntax",
+ "Time"
+% ANY "Tst",
+% "Two",
+% errors that should be detected "UndefType"
+] ++
+ [
+ "SeqSetLib", % must be compiled before Seq and Set
+ "Seq",
+ "Set",
+ "SetOf",
+ "SeqOf",
+ "Prim",
+ "Cho",
+ "Def",
+ "Opt",
+ "ELDAPv3",
+ "LDAP"
+ ].
+
+
+common() ->
+[].
+
+particular() ->
+[].
diff --git a/lib/asn1/test/asn1_bin_v2_SUITE.erl b/lib/asn1/test/asn1_bin_v2_SUITE.erl
new file mode 100644
index 0000000000..2273ca9918
--- /dev/null
+++ b/lib/asn1/test/asn1_bin_v2_SUITE.erl
@@ -0,0 +1,2474 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2001-2011. 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%
+%%
+%%
+%%% Purpose : Test suite for the ASN.1 application
+
+-module(asn1_bin_v2_SUITE).
+-define(PER,'per_bin').
+-define(BER,'ber_bin_v2').
+-define(ber_driver(Erule,Func),
+ case Erule of
+ ber_bin_v2 ->
+ Func;
+ _ -> ok
+ end).
+-define(per_optimize(Erule),
+ case Erule of
+ ber_bin_v2 ->[optimize];
+ _ -> []
+ end).
+-define(per_bit_opt(FuncCall),
+ case ?BER of
+ ber_bin_v2 -> FuncCall;
+% _ -> {skip,"only for bit optimized per_bin"}
+ _ -> ok
+ end).
+-define(uper_bin(FuncCall),
+ case ?PER of
+ per -> FuncCall;
+ _ -> ok
+ end).
+
+-compile(export_all).
+%%-export([Function/Arity, ...]).
+
+-include_lib("test_server/include/test_server.hrl").
+
+%% records used by test-case default
+-record('Def1',{
+bool0, bool1 = asn1_DEFAULT, bool2 = asn1_DEFAULT, bool3 = asn1_DEFAULT}).
+
+%-record('Def2',{
+%bool10, bool11 = asn1_DEFAULT, bool12 = asn1_DEFAULT, bool13}).
+
+%-record('Def3',{
+%bool30 = asn1_DEFAULT, bool31 = asn1_DEFAULT, bool32 = asn1_DEFAULT, bool33 = asn1_DEFAULT}).
+
+
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, compile}, parse, default_per, default_ber,
+ default_per_opt, per, {group, ber}, testPrim,
+ testPrimStrings, testPrimExternal, testChoPrim,
+ testChoExtension, testChoExternal, testChoOptional,
+ testChoOptionalImplicitTag, testChoRecursive,
+ testChoTypeRefCho, testChoTypeRefPrim,
+ testChoTypeRefSeq, testChoTypeRefSet, testDef, testOpt,
+ testSeqDefault, testSeqExtension, testSeqExternal,
+ testSeqOptional, testSeqPrim, testSeqTag,
+ testSeqTypeRefCho, testSeqTypeRefPrim,
+ testSeqTypeRefSeq, testSeqTypeRefSet, testSeqOf,
+ testSeqOfIndefinite, testSeqOfCho, testSeqOfExternal,
+ testSetDefault, testSetExtension,
+ testExtensionAdditionGroup, testSetExternal,
+ testSeqOfTag, testSetOptional, testSetPrim, testSetTag,
+ testSetTypeRefCho, testSetTypeRefPrim,
+ testSetTypeRefSeq, testSetTypeRefSet, testSetOf,
+ testSetOfCho, testSetOfExternal, testSetOfTag,
+ testEnumExt, value_test, testSeq2738, constructed,
+ ber_decode_error, h323test, testSeqIndefinite,
+ testSetIndefinite, testChoiceIndefinite,
+ per_GeneralString, per_open_type, testInfObjectClass,
+ testParameterizedInfObj, testMergeCompile, testobj,
+ testDeepTConstr, testConstraints, testInvokeMod,
+ testExport, testImport, testCompactBitString,
+ testMegaco, testParamBasic, testMvrasn6,
+ testContextSwitchingTypes, testTypeValueNotation,
+ testOpenTypeImplicitTag, duplicate_tags, rtUI, testROSE,
+ testINSTANCE_OF, testTCAP, testDER, specialized_decodes,
+ special_decode_performance, test_driver_load,
+ test_ParamTypeInfObj, test_WS_ParamClass,
+ test_Defed_ObjectIdentifier, testSelectionType,
+ testSSLspecs, testNortel, test_undecoded_rest,
+ test_inline, testTcapsystem, testNBAPsystem,
+ test_compile_options, testDoubleEllipses,
+ test_modified_x420, testX420, test_x691, ticket_6143,
+ testExtensionAdditionGroup] ++ common() ++ particular().
+
+groups() ->
+ [{option_tests, [],
+ [test_compile_options, ticket_6143]},
+ {infobj, [],
+ [testInfObjectClass, testParameterizedInfObj,
+ testMergeCompile, testobj, testDeepTConstr]},
+ {performance, [],
+ [testTimer_ber, testTimer_ber_opt_driver, testTimer_per,
+ testTimer_per_opt, testTimer_uper_bin]},
+ {bugs, [],
+ [test_ParamTypeInfObj, test_WS_ParamClass,
+ test_Defed_ObjectIdentifier]},
+ {compile, [],
+ [c_syntax, c_string_per, c_string_ber,
+ c_implicit_before_choice]},
+ {ber, [],
+ [ber_choiceinseq, ber_optional, ber_optional_keyed_list,
+ ber_other]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+%all(suite) -> [test_inline,testNBAPsystem,test_compile_options,ticket_6143].
+
+init_per_testcase(Func,Config) ->
+ %%?line test_server:format("Func: ~p~n",[Func]),
+ ?line {ok, _} = file:read_file_info(filename:join([?config(priv_dir,Config)])),
+ ?line code:add_patha(?config(priv_dir,Config)),
+ Dog=
+ case Func of
+ testX420 ->
+ test_server:timetrap({minutes,60}); % 60 minutes
+ _ ->
+ test_server:timetrap({minutes,30}) % 60 minutes
+ end,
+ %% Dog=test_server:timetrap(1800000), % 30 minutes
+ [{watchdog, Dog}|Config].
+
+end_per_testcase(_Func,Config) ->
+ Dog=?config(watchdog, Config),
+ test_server:timetrap_cancel(Dog).
+
+
+testPrim(suite) -> [];
+testPrim(Config) ->
+ ?line testPrim:compile(Config,?BER,[]),
+ ?line testPrim_cases(?BER),
+ ?line ?ber_driver(?BER,testPrim:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testPrim_cases(?BER)),
+ ?line testPrim:compile(Config,?PER,[]),
+ ?line testPrim_cases(?PER),
+ ?line ?per_bit_opt(testPrim:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testPrim_cases(?PER)),
+ ?line ?uper_bin(testPrim:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testPrim_cases(uper_bin)),
+ ?line testPrim:compile(Config,?PER,[optimize]),
+ ?line testPrim_cases(?PER).
+
+testPrim_cases(Rules) ->
+ ?line testPrim:bool(Rules),
+ ?line testPrim:int(Rules),
+ ?line testPrim:enum(Rules),
+ ?line testPrim:obj_id(Rules),
+ ?line testPrim:rel_oid(Rules),
+ ?line testPrim:null(Rules),
+ ?line testPrim:real(Rules).
+
+
+testCompactBitString(suite) -> [];
+testCompactBitString(Config) ->
+
+ ?line testCompactBitString:compile(Config,?BER,[compact_bit_string]),
+ ?line testCompactBitString:compact_bit_string(?BER),
+
+ ?line ?ber_driver(?BER,testCompactBitString:compile(Config,?BER,[compact_bit_string,driver])),
+ ?line ?ber_driver(?BER,testCompactBitString:compact_bit_string(?BER)),
+
+ ?line testCompactBitString:compile(Config,?PER,[compact_bit_string]),
+ ?line testCompactBitString:compact_bit_string(?PER),
+ ?line testCompactBitString:bit_string_unnamed(?PER),
+
+ ?line ?per_bit_opt(testCompactBitString:compile(Config,?PER,
+ [compact_bit_string,optimize])),
+ ?line ?per_bit_opt(testCompactBitString:compact_bit_string(?PER)),
+ ?line ?per_bit_opt(testCompactBitString:bit_string_unnamed(?PER)),
+ ?line ?per_bit_opt(testCompactBitString:ticket_7734(?PER)),
+
+ ?line ?uper_bin(testCompactBitString:compile(Config,uper_bin,
+ [compact_bit_string])),
+ ?line ?uper_bin(testCompactBitString:compact_bit_string(uper_bin)),
+ ?line ?uper_bin(testCompactBitString:bit_string_unnamed(uper_bin)),
+
+ ?line testCompactBitString:compile(Config,?PER,[optimize,compact_bit_string]),
+ ?line testCompactBitString:compact_bit_string(?PER),
+ ?line testCompactBitString:bit_string_unnamed(?PER),
+
+ ?line testCompactBitString:otp_4869(?PER).
+
+
+testPrimStrings(suite) -> [];
+testPrimStrings(Config) ->
+
+ ?line testPrimStrings:compile(Config,?BER,[]),
+ ?line testPrimStrings_cases(?BER),
+ ?line testPrimStrings:more_strings(?BER), %% these are not implemented in per yet
+ ?line ?ber_driver(?BER,testPrimStrings:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testPrimStrings_cases(?BER)),
+ ?line ?ber_driver(?BER,testPrimStrings:more_strings(?BER)),
+
+ ?line testPrimStrings:compile(Config,?PER,[]),
+ ?line testPrimStrings_cases(?PER),
+
+ ?line ?per_bit_opt(testPrimStrings:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testPrimStrings_cases(?PER)),
+
+ ?line ?uper_bin(testPrimStrings:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testPrimStrings_cases(uper_bin)),
+
+ ?line testPrimStrings:compile(Config,?PER,[optimize]),
+ ?line testPrimStrings_cases(?PER).
+
+testPrimStrings_cases(Rules) ->
+ ?line testPrimStrings:bit_string(Rules),
+ ?line testPrimStrings:bit_string_unnamed(Rules),
+ ?line testPrimStrings:octet_string(Rules),
+ ?line testPrimStrings:numeric_string(Rules),
+ ?line testPrimStrings:other_strings(Rules),
+ ?line testPrimStrings:universal_string(Rules),
+ ?line testPrimStrings:bmp_string(Rules),
+ ?line testPrimStrings:times(Rules),
+ ?line testPrimStrings:utf8_string(Rules).
+
+
+
+testPrimExternal(suite) -> [];
+testPrimExternal(Config) ->
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testPrimExternal:compile(Config,?BER,[]),
+ ?line testPrimExternal_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testPrimExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testPrimExternal_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testPrimExternal:compile(Config,?PER,[]),
+ ?line testPrimExternal_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testPrimExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testPrimExternal_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testPrimExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testPrimExternal_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testPrimExternal:compile(Config,?PER,[optimize]),
+ ?line testPrimExternal_cases(?PER).
+
+testPrimExternal_cases(Rules) ->
+ ?line testPrimExternal:external(Rules).
+
+
+
+
+testChoPrim(suite) -> [];
+testChoPrim(Config) ->
+
+ ?line testChoPrim:compile(Config,?BER,[]),
+ ?line testChoPrim_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoPrim:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoPrim_cases(?BER)),
+
+ ?line testChoPrim:compile(Config,?PER,[]),
+ ?line testChoPrim_cases(?PER),
+
+ ?line ?per_bit_opt(testChoPrim:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoPrim_cases(?PER)),
+
+ ?line ?uper_bin(testChoPrim:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoPrim_cases(uper_bin)),
+
+ ?line testChoPrim:compile(Config,?PER,[optimize]),
+ ?line testChoPrim_cases(?PER).
+
+testChoPrim_cases(Rules) ->
+ ?line testChoPrim:bool(Rules),
+ ?line testChoPrim:int(Rules).
+
+
+
+testChoExtension(suite) -> [];
+testChoExtension(Config) ->
+
+ ?line testChoExtension:compile(Config,?BER,[]),
+ ?line testChoExtension_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoExtension:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoExtension_cases(?BER)),
+
+ ?line testChoExtension:compile(Config,?PER,[]),
+ ?line testChoExtension_cases(?PER),
+
+ ?line ?per_bit_opt(testChoExtension:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoExtension_cases(?PER)),
+
+ ?line ?uper_bin(testChoExtension:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoExtension_cases(uper_bin)),
+
+ ?line testChoExtension:compile(Config,?PER,[optimize]),
+ ?line testChoExtension_cases(?PER).
+
+testChoExtension_cases(Rules) ->
+ ?line testChoExtension:extension(Rules).
+
+
+
+testChoExternal(suite) -> [];
+testChoExternal(Config) ->
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testChoExternal:compile(Config,?BER,[]),
+ ?line testChoExternal_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoExternal_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testChoExternal:compile(Config,?PER,[]),
+ ?line testChoExternal_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoExternal_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoExternal_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testChoExternal:compile(Config,?PER,[optimize]),
+ ?line testChoExternal_cases(?PER).
+
+
+testChoExternal_cases(Rules) ->
+ ?line testChoExternal:external(Rules).
+
+
+
+testChoOptional(suite) -> [];
+testChoOptional(Config) ->
+
+ ?line testChoOptional:compile(Config,?BER,[]),
+ ?line testChoOptional_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoOptional:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoOptional_cases(?BER)),
+
+ ?line testChoOptional:compile(Config,?PER,[]),
+ ?line testChoOptional_cases(?PER),
+
+ ?line ?per_bit_opt(testChoOptional:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoOptional_cases(?PER)),
+
+ ?line ?uper_bin(testChoOptional:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoOptional_cases(uper_bin)),
+
+ ?line testChoOptional:compile(Config,?PER,[optimize]),
+ ?line testChoOptional_cases(?PER).
+
+testChoOptional_cases(Rules) ->
+ ?line testChoOptional:optional(Rules).
+
+testChoOptionalImplicitTag(suite) -> [];
+testChoOptionalImplicitTag(Config) ->
+ %% Only meaningful for ?BER
+ ?line testChoOptionalImplicitTag:compile(Config,?BER),
+ ?line testChoOptionalImplicitTag:optional(?BER).
+
+
+testChoRecursive(suite) -> [];
+testChoRecursive(Config) ->
+
+ ?line testChoRecursive:compile(Config,?BER,[]),
+ ?line testChoRecursive_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoRecursive:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoRecursive_cases(?BER)),
+
+ ?line testChoRecursive:compile(Config,?PER,[]),
+ ?line testChoRecursive_cases(?PER),
+
+ ?line ?per_bit_opt(testChoRecursive:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoRecursive_cases(?PER)),
+
+ ?line ?uper_bin(testChoRecursive:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoRecursive_cases(uper_bin)),
+
+ ?line testChoRecursive:compile(Config,?PER,[optimize]),
+ ?line testChoRecursive_cases(?PER).
+
+testChoRecursive_cases(Rules) ->
+ ?line testChoRecursive:recursive(Rules).
+
+
+
+testChoTypeRefCho(suite) -> [];
+testChoTypeRefCho(Config) ->
+
+ ?line testChoTypeRefCho:compile(Config,?BER,[]),
+ ?line testChoTypeRefCho_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoTypeRefCho:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoTypeRefCho_cases(?BER)),
+
+ ?line testChoTypeRefCho:compile(Config,?PER,[]),
+ ?line testChoTypeRefCho_cases(?PER),
+
+ ?line ?per_bit_opt(testChoTypeRefCho:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoTypeRefCho_cases(?PER)),
+
+ ?line ?uper_bin(testChoTypeRefCho:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoTypeRefCho_cases(uper_bin)),
+
+ ?line testChoTypeRefCho:compile(Config,?PER,[optimize]),
+ ?line testChoTypeRefCho_cases(?PER).
+
+testChoTypeRefCho_cases(Rules) ->
+ ?line testChoTypeRefCho:choice(Rules).
+
+
+
+testChoTypeRefPrim(suite) -> [];
+testChoTypeRefPrim(Config) ->
+
+ ?line testChoTypeRefPrim:compile(Config,?BER,[]),
+ ?line testChoTypeRefPrim_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoTypeRefPrim:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoTypeRefPrim_cases(?BER)),
+
+ ?line testChoTypeRefPrim:compile(Config,?PER,[]),
+ ?line testChoTypeRefPrim_cases(?PER),
+
+ ?line ?per_bit_opt(testChoTypeRefPrim:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoTypeRefPrim_cases(?PER)),
+
+ ?line ?uper_bin(testChoTypeRefPrim:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoTypeRefPrim_cases(uper_bin)),
+
+ ?line testChoTypeRefPrim:compile(Config,?PER,[optimize]),
+ ?line testChoTypeRefPrim_cases(?PER).
+
+testChoTypeRefPrim_cases(Rules) ->
+ ?line testChoTypeRefPrim:prim(Rules).
+
+
+
+testChoTypeRefSeq(suite) -> [];
+testChoTypeRefSeq(Config) ->
+
+ ?line testChoTypeRefSeq:compile(Config,?BER,[]),
+ ?line testChoTypeRefSeq_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoTypeRefSeq:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoTypeRefSeq_cases(?BER)),
+
+ ?line testChoTypeRefSeq:compile(Config,?PER,[]),
+ ?line testChoTypeRefSeq_cases(?PER),
+
+ ?line ?per_bit_opt(testChoTypeRefSeq:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoTypeRefSeq_cases(?PER)),
+
+ ?line ?uper_bin(testChoTypeRefSeq:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoTypeRefSeq_cases(uper_bin)),
+
+ ?line testChoTypeRefSeq:compile(Config,?PER,[optimize]),
+ ?line testChoTypeRefSeq_cases(?PER).
+
+testChoTypeRefSeq_cases(Rules) ->
+ ?line testChoTypeRefSeq:seq(Rules).
+
+
+
+testChoTypeRefSet(suite) -> [];
+testChoTypeRefSet(Config) ->
+
+ ?line testChoTypeRefSet:compile(Config,?BER,[]),
+ ?line testChoTypeRefSet_cases(?BER),
+
+ ?line ?ber_driver(?BER,testChoTypeRefSet:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoTypeRefSet_cases(?BER)),
+
+ ?line testChoTypeRefSet:compile(Config,?PER,[]),
+ ?line testChoTypeRefSet_cases(?PER),
+
+ ?line ?per_bit_opt(testChoTypeRefSet:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testChoTypeRefSet_cases(?PER)),
+
+ ?line ?uper_bin(testChoTypeRefSet:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testChoTypeRefSet_cases(uper_bin)),
+
+ ?line testChoTypeRefSet:compile(Config,?PER,[optimize]),
+ ?line testChoTypeRefSet_cases(?PER).
+
+testChoTypeRefSet_cases(Rules) ->
+ ?line testChoTypeRefSet:set(Rules).
+
+
+
+testDef(suite) -> [];
+testDef(Config) ->
+
+ ?line testDef:compile(Config,?BER,[]),
+ ?line testDef_cases(?BER),
+
+ ?line ?ber_driver(?BER,testDef:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testDef_cases(?BER)),
+
+ ?line testDef:compile(Config,?PER,[]),
+ ?line testDef_cases(?PER),
+
+ ?line ?per_bit_opt(testDef:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testDef_cases(?PER)),
+
+ ?line ?uper_bin(testDef:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testDef_cases(uper_bin)),
+
+ ?line testDef:compile(Config,?PER,[optimize]),
+ ?line testDef_cases(?PER).
+
+testDef_cases(Rules) ->
+ ?line testDef:main(Rules).
+
+
+
+testOpt(suite) -> [];
+testOpt(Config) ->
+
+ ?line testOpt:compile(Config,?BER),
+ ?line testOpt_cases(?BER),
+
+ ?line testOpt:compile(Config,?PER),
+ ?line testOpt_cases(?PER).
+
+testOpt_cases(Rules) ->
+ ?line testOpt:main(Rules).
+
+
+testEnumExt(suite) -> [];
+testEnumExt(Config) ->
+
+ ?line testEnumExt:compile(Config,?BER,[]),
+ ?line testEnumExt:main(?BER),
+
+ ?line ?ber_driver(?BER,testEnumExt:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testEnumExt:main(?BER)),
+
+ ?line testEnumExt:compile(Config,?PER,[]),
+ ?line testEnumExt:main(?PER),
+
+ ?line ?per_bit_opt(testEnumExt:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testEnumExt:main(?PER)),
+
+ ?line ?uper_bin(testEnumExt:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testEnumExt:main(uper_bin)),
+
+ ?line testEnumExt:compile(Config,?PER,[optimize]),
+ ?line testEnumExt:main(?PER).
+
+testSeqDefault(doc) -> ["Test of OTP-2523 ENUMERATED with extensionmark."];
+testSeqDefault(suite) -> [];
+testSeqDefault(Config) ->
+
+ ?line testSeqDefault:compile(Config,?BER,[]),
+ ?line testSeqDefault_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqDefault:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqDefault_cases(?BER)),
+
+ ?line testSeqDefault:compile(Config,?PER,[]),
+ ?line testSeqDefault_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqDefault:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqDefault_cases(?PER)),
+
+ ?line ?uper_bin(testSeqDefault:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqDefault_cases(uper_bin)),
+
+ ?line testSeqDefault:compile(Config,?PER,[optimize]),
+ ?line testSeqDefault_cases(?PER).
+
+testSeqDefault_cases(Rules) ->
+ ?line testSeqDefault:main(Rules).
+
+
+
+testSeqExtension(suite) -> [];
+testSeqExtension(Config) ->
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSeqExtension:compile(Config,?BER,[]),
+ ?line testSeqExtension_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqExtension:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqExtension_cases(?BER)).
+
+testSeqExtension_cases(Rules) ->
+ ?line testSeqExtension:main(Rules).
+
+
+
+testSeqExternal(suite) -> [];
+testSeqExternal(Config) ->
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSeqExternal:compile(Config,?BER,[]),
+ ?line testSeqExternal_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqExternal_cases(?BER)).
+
+testSeqExternal_cases(Rules) ->
+ ?line testSeqExternal:main(Rules).
+
+
+testSeqOptional(suite) -> [];
+testSeqOptional(Config) ->
+
+ ?line testSeqOptional:compile(Config,?BER,[]),
+ ?line testSeqOptional_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqOptional:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOptional_cases(?BER)),
+
+ ?line testSeqOptional:compile(Config,?PER,[]),
+ ?line testSeqOptional_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqOptional:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqOptional_cases(?PER)),
+
+ ?line ?uper_bin(testSeqOptional:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqOptional_cases(uper_bin)),
+
+ ?line testSeqOptional:compile(Config,?PER,[optimize]),
+ ?line testSeqOptional_cases(?PER).
+
+testSeqOptional_cases(Rules) ->
+ ?line testSeqOptional:main(Rules).
+
+
+
+testSeqPrim(suite) -> [];
+testSeqPrim(Config) ->
+
+ ?line testSeqPrim:compile(Config,?BER,[]),
+ ?line testSeqPrim_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqPrim:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqPrim_cases(?BER)),
+
+ ?line testSeqPrim:compile(Config,?PER,[]),
+ ?line testSeqPrim_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqPrim:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqPrim_cases(?PER)),
+
+ ?line ?uper_bin(testSeqPrim:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqPrim_cases(uper_bin)),
+
+ ?line testSeqPrim:compile(Config,?PER,[optimize]),
+ ?line testSeqPrim_cases(?PER).
+
+testSeqPrim_cases(Rules) ->
+ ?line testSeqPrim:main(Rules).
+
+
+testSeq2738(doc) -> ["Test of OTP-2738 Detect corrupt optional component."];
+testSeq2738(suite) -> [];
+testSeq2738(Config) ->
+
+ ?line testSeq2738:compile(Config,?BER,[]),
+ ?line testSeq2738_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeq2738:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeq2738_cases(?BER)),
+
+ ?line testSeq2738:compile(Config,?PER,[]),
+ ?line testSeq2738_cases(?PER),
+
+ ?line ?per_bit_opt(testSeq2738:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeq2738_cases(?PER)),
+
+ ?line ?uper_bin(testSeq2738:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeq2738_cases(uper_bin)),
+
+ ?line testSeq2738:compile(Config,?PER,[optimize]),
+ ?line testSeq2738_cases(?PER).
+
+testSeq2738_cases(Rules) ->
+ ?line testSeq2738:main(Rules).
+
+
+testSeqTag(suite) -> [];
+testSeqTag(Config) ->
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSeqTag:compile(Config,?BER,[]),
+ ?line testSeqTag_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqTag:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqTag_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testSeqTag:compile(Config,?PER,[]),
+ ?line testSeqTag_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqTag:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqTag_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqTag:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqTag_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testSeqTag:compile(Config,?PER,[optimize]),
+ ?line testSeqTag_cases(?PER).
+
+testSeqTag_cases(Rules) ->
+ ?line testSeqTag:main(Rules).
+
+
+
+
+testSeqTypeRefCho(suite) -> [];
+testSeqTypeRefCho(Config) ->
+
+ ?line testSeqTypeRefCho:compile(Config,?BER,[]),
+ ?line testSeqTypeRefCho_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqTypeRefCho:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqTypeRefCho_cases(?BER)),
+
+ ?line testSeqTypeRefCho:compile(Config,?PER,[]),
+ ?line testSeqTypeRefCho_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqTypeRefCho:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqTypeRefCho_cases(?PER)),
+
+ ?line ?uper_bin(testSeqTypeRefCho:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqTypeRefCho_cases(uper_bin)),
+
+ ?line testSeqTypeRefCho:compile(Config,?PER,[optimize]),
+ ?line testSeqTypeRefCho_cases(?PER).
+
+testSeqTypeRefCho_cases(Rules) ->
+ ?line testSeqTypeRefCho:main(Rules).
+
+
+
+testSeqTypeRefPrim(suite) -> [];
+testSeqTypeRefPrim(Config) ->
+
+ ?line testSeqTypeRefPrim:compile(Config,?BER,[]),
+ ?line testSeqTypeRefPrim_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqTypeRefPrim:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqTypeRefPrim_cases(?BER)),
+
+ ?line testSeqTypeRefPrim:compile(Config,?PER,[]),
+ ?line testSeqTypeRefPrim_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqTypeRefPrim:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqTypeRefPrim_cases(?PER)),
+
+ ?line ?uper_bin(testSeqTypeRefPrim:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqTypeRefPrim_cases(uper_bin)),
+
+ ?line testSeqTypeRefPrim:compile(Config,?PER,[optimize]),
+ ?line testSeqTypeRefPrim_cases(?PER).
+
+testSeqTypeRefPrim_cases(Rules) ->
+ ?line testSeqTypeRefPrim:main(Rules).
+
+
+
+testSeqTypeRefSeq(suite) -> [];
+testSeqTypeRefSeq(Config) ->
+
+ ?line testSeqTypeRefSeq:compile(Config,?BER,[]),
+ ?line testSeqTypeRefSeq_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqTypeRefSeq:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqTypeRefSeq_cases(?BER)),
+
+ ?line testSeqTypeRefSeq:compile(Config,?PER,[]),
+ ?line testSeqTypeRefSeq_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqTypeRefSeq:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqTypeRefSeq_cases(?PER)),
+
+ ?line ?uper_bin(testSeqTypeRefSeq:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqTypeRefSeq_cases(uper_bin)),
+
+ ?line testSeqTypeRefSeq:compile(Config,?PER,[optimize]),
+ ?line testSeqTypeRefSeq_cases(?PER).
+
+testSeqTypeRefSeq_cases(Rules) ->
+ ?line testSeqTypeRefSeq:main(Rules).
+
+
+
+testSeqTypeRefSet(suite) -> [];
+testSeqTypeRefSet(Config) ->
+
+ ?line testSeqTypeRefSet:compile(Config,?BER,[]),
+ ?line testSeqTypeRefSet_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqTypeRefSet:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqTypeRefSet_cases(?BER)),
+
+ ?line testSeqTypeRefSet:compile(Config,?PER,[]),
+ ?line testSeqTypeRefSet_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqTypeRefSet:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqTypeRefSet_cases(?PER)),
+
+ ?line ?uper_bin(testSeqTypeRefSet:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqTypeRefSet_cases(uper_bin)),
+
+ ?line testSeqTypeRefSet:compile(Config,?PER,[optimize]),
+ ?line testSeqTypeRefSet_cases(?PER).
+
+testSeqTypeRefSet_cases(Rules) ->
+ ?line testSeqTypeRefSet:main(Rules).
+
+
+
+
+testSeqOf(suite) -> [];
+testSeqOf(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSeqOf:compile(Config,?BER,[]),
+ ?line testSeqOf_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqOf:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOf_cases(?BER)),
+
+ ?line testSeqOf:compile(Config,?PER,[]),
+ ?line testSeqOf_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqOf:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqOf_cases(?PER)),
+
+ ?line ?uper_bin(testSeqOf:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqOf_cases(uper_bin)),
+
+ ?line testSeqOf:compile(Config,?PER,[optimize]),
+ ?line testSeqOf_cases(?PER).
+
+testSeqOf_cases(Rules) ->
+ ?line testSeqOf:main(Rules).
+
+
+
+
+testSeqOfCho(suite) -> [];
+testSeqOfCho(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSeqOfCho:compile(Config,?BER,[]),
+ ?line testSeqOfCho_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSeqOfCho:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOfCho_cases(?BER)),
+
+ ?line testSeqOfCho:compile(Config,?PER,[]),
+ ?line testSeqOfCho_cases(?PER),
+
+ ?line ?per_bit_opt(testSeqOfCho:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqOfCho_cases(?PER)),
+
+ ?line ?uper_bin(testSeqOfCho:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqOfCho_cases(uper_bin)),
+
+ ?line testSeqOfCho:compile(Config,?PER,[optimize]),
+ ?line testSeqOfCho_cases(?PER).
+
+testSeqOfIndefinite(suite) -> [];
+testSeqOfIndefinite(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSeqOfIndefinite:compile(Config,?BER,[]),
+ ?line testSeqOfIndefinite:main(),
+
+ ?line ?ber_driver(?BER,testSeqOfIndefinite:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOfIndefinite:main()).
+
+testSeqOfCho_cases(Rules) ->
+ ?line testSeqOfCho:main(Rules).
+
+
+testSeqOfExternal(suite) -> [];
+testSeqOfExternal(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSeqOfExternal:compile(Config,?BER,[]),
+ ?line testSeqOfExternal_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOfExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOfExternal_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testSeqOfExternal:compile(Config,?PER,[]),
+ ?line testSeqOfExternal_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqOfExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqOfExternal_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqOfExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqOfExternal_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testSeqOfExternal:compile(Config,?PER,[optimize]),
+ ?line testSeqOfExternal_cases(?PER).
+
+testSeqOfExternal_cases(Rules) ->
+ ?line testSeqOfExternal:main(Rules).
+
+
+
+testSeqOfTag(suite) -> [];
+testSeqOfTag(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSeqOfTag:compile(Config,?BER,[]),
+ ?line testSeqOfTag_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOfTag:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqOfTag_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testSeqOfTag:compile(Config,?PER,[]),
+ ?line testSeqOfTag_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqOfTag:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSeqOfTag_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqOfTag:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSeqOfTag_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testSeqOfTag:compile(Config,?PER,[optimize]),
+ ?line testSeqOfTag_cases(?PER).
+
+testSeqOfTag_cases(Rules) ->
+ ?line testSeqOfTag:main(Rules).
+
+
+
+
+testSetDefault(suite) -> [];
+testSetDefault(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetDefault:compile(Config,?BER,[]),
+ ?line testSetDefault_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetDefault:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetDefault_cases(?BER)),
+
+ ?line testSetDefault:compile(Config,?PER,[]),
+ ?line testSetDefault_cases(?PER),
+
+ ?line ?per_bit_opt(testSetDefault:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetDefault_cases(?PER)),
+
+ ?line ?uper_bin(testSetDefault:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetDefault_cases(uper_bin)),
+
+ ?line testSetDefault:compile(Config,?PER,[optimize]),
+ ?line testSetDefault_cases(?PER).
+
+testSetDefault_cases(Rules) ->
+ ?line testSetDefault:main(Rules).
+
+
+testParamBasic(suite) -> [];
+testParamBasic(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testParamBasic:compile(Config,?BER,[]),
+ ?line testParamBasic_cases(?BER),
+
+ ?line ?ber_driver(?BER,testParamBasic:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testParamBasic_cases(?BER)),
+
+ ?line testParamBasic:compile(Config,?PER,[]),
+ ?line testParamBasic_cases(?PER),
+
+ ?line ?per_bit_opt(testParamBasic:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testParamBasic_cases(?PER)),
+
+ ?line ?uper_bin(testParamBasic:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testParamBasic_cases(uper_bin)),
+
+ ?line testParamBasic:compile(Config,?PER,[optimize]),
+ ?line testParamBasic_cases(?PER).
+
+
+testParamBasic_cases(Rules) ->
+ ?line testParamBasic:main(Rules).
+
+testSetExtension(suite) -> [];
+testSetExtension(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSetExtension:compile(Config,?BER,[]),
+ ?line testSetExtension_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetExtension:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetExtension_cases(?BER)).
+
+testSetExtension_cases(Rules) ->
+ ?line testSetExtension:main(Rules).
+
+
+testSetExternal(suite) -> [];
+testSetExternal(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSetExternal:compile(Config,?BER,[]),
+ ?line testSetExternal_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetExternal_cases(?BER)).
+
+testSetExternal_cases(Rules) ->
+ ?line testSetExternal:main(Rules).
+
+
+testSetOptional(suite) -> [];
+testSetOptional(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetOptional:compile(Config,?BER,[]),
+ ?line testSetOptional_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetOptional:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetOptional_cases(?BER)),
+
+ ?line testSetOptional:compile(Config,?PER,[]),
+ ?line testSetOptional_cases(?PER),
+
+ ?line ?per_bit_opt(testSetOptional:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetOptional_cases(?PER)),
+
+ ?line ?uper_bin(testSetOptional:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetOptional_cases(uper_bin)),
+
+ ?line testSetOptional:compile(Config,?PER,[optimize]),
+ ?line testSetOptional_cases(?PER).
+
+testSetOptional_cases(Rules) ->
+ ?line ok = testSetOptional:ticket_7533(Rules),
+ ?line ok = testSetOptional:main(Rules).
+
+
+
+
+testSetPrim(suite) -> [];
+testSetPrim(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetPrim:compile(Config,?BER,[]),
+ ?line testSetPrim_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetPrim:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetPrim_cases(?BER)),
+
+ ?line testSetPrim:compile(Config,?PER,[]),
+ ?line testSetPrim_cases(?PER),
+
+ ?line ?per_bit_opt(testSetPrim:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetPrim_cases(?PER)),
+
+ ?line ?uper_bin(testSetPrim:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetPrim_cases(uper_bin)),
+
+ ?line testSetPrim:compile(Config,?PER,[optimize]),
+ ?line testSetPrim_cases(?PER).
+
+testSetPrim_cases(Rules) ->
+ ?line testSetPrim:main(Rules).
+
+
+
+testSetTag(suite) -> [];
+testSetTag(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSetTag:compile(Config,?BER,[]),
+ ?line testSetTag_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetTag:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetTag_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testSetTag:compile(Config,?PER,[]),
+ ?line testSetTag_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetTag:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetTag_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetTag:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetTag_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testSetTag:compile(Config,?PER,[optimize]),
+ ?line testSetTag_cases(?PER).
+
+testSetTag_cases(Rules) ->
+ ?line testSetTag:main(Rules).
+
+
+
+testSetTypeRefCho(suite) -> [];
+testSetTypeRefCho(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetTypeRefCho:compile(Config,?BER,[]),
+ ?line testSetTypeRefCho_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetTypeRefCho:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetTypeRefCho_cases(?BER)),
+
+ ?line testSetTypeRefCho:compile(Config,?PER,[]),
+ ?line testSetTypeRefCho_cases(?PER),
+
+ ?line ?per_bit_opt(testSetTypeRefCho:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetTypeRefCho_cases(?PER)),
+
+ ?line ?uper_bin(testSetTypeRefCho:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetTypeRefCho_cases(uper_bin)),
+
+ ?line testSetTypeRefCho:compile(Config,?PER,[optimize]),
+ ?line testSetTypeRefCho_cases(?PER).
+
+testSetTypeRefCho_cases(Rules) ->
+ ?line testSetTypeRefCho:main(Rules).
+
+
+
+testSetTypeRefPrim(suite) -> [];
+testSetTypeRefPrim(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetTypeRefPrim:compile(Config,?BER,[]),
+ ?line testSetTypeRefPrim_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetTypeRefPrim:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetTypeRefPrim_cases(?BER)),
+
+ ?line testSetTypeRefPrim:compile(Config,?PER,[]),
+ ?line testSetTypeRefPrim_cases(?PER),
+
+ ?line ?per_bit_opt(testSetTypeRefPrim:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetTypeRefPrim_cases(?PER)),
+
+ ?line ?uper_bin(testSetTypeRefPrim:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetTypeRefPrim_cases(uper_bin)),
+
+ ?line testSetTypeRefPrim:compile(Config,?PER,[optimize]),
+ ?line testSetTypeRefPrim_cases(?PER).
+
+testSetTypeRefPrim_cases(Rules) ->
+ ?line testSetTypeRefPrim:main(Rules).
+
+
+
+testSetTypeRefSeq(suite) -> [];
+testSetTypeRefSeq(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetTypeRefSeq:compile(Config,?BER,[]),
+ ?line testSetTypeRefSeq_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetTypeRefSeq:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetTypeRefSeq_cases(?BER)),
+
+ ?line testSetTypeRefSeq:compile(Config,?PER,[]),
+ ?line testSetTypeRefSeq_cases(?PER),
+
+ ?line ?per_bit_opt(testSetTypeRefSeq:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetTypeRefSeq_cases(?PER)),
+
+ ?line ?uper_bin(testSetTypeRefSeq:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetTypeRefSeq_cases(uper_bin)),
+
+ ?line testSetTypeRefSeq:compile(Config,?PER,[optimize]),
+ ?line testSetTypeRefSeq_cases(?PER).
+
+testSetTypeRefSeq_cases(Rules) ->
+ ?line testSetTypeRefSeq:main(Rules).
+
+
+
+testSetTypeRefSet(suite) -> [];
+testSetTypeRefSet(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetTypeRefSet:compile(Config,?BER,[]),
+ ?line testSetTypeRefSet_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetTypeRefSet:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetTypeRefSet_cases(?BER)),
+
+ ?line testSetTypeRefSet:compile(Config,?PER,[]),
+ ?line testSetTypeRefSet_cases(?PER),
+
+ ?line ?per_bit_opt(testSetTypeRefSet:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetTypeRefSet_cases(?PER)),
+
+ ?line ?uper_bin(testSetTypeRefSet:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetTypeRefSet_cases(uper_bin)),
+
+ ?line testSetTypeRefSet:compile(Config,?PER,[optimize]),
+ ?line testSetTypeRefSet_cases(?PER).
+
+testSetTypeRefSet_cases(Rules) ->
+ ?line testSetTypeRefSet:main(Rules).
+
+
+
+testSetOf(suite) -> [];
+testSetOf(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetOf:compile(Config,?BER,[]),
+ ?line testSetOf_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetOf:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetOf_cases(?BER)),
+
+ ?line testSetOf:compile(Config,?PER,[]),
+ ?line testSetOf_cases(?PER),
+
+ ?line ?per_bit_opt(testSetOf:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetOf_cases(?PER)),
+
+ ?line ?uper_bin(testSetOf:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetOf_cases(uper_bin)),
+
+ ?line testSetOf:compile(Config,?PER,[optimize]),
+ ?line testSetOf_cases(?PER).
+
+testSetOf_cases(Rules) ->
+ ?line testSetOf:main(Rules).
+
+
+
+testSetOfCho(suite) -> [];
+testSetOfCho(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetOfCho:compile(Config,?BER,[]),
+ ?line testSetOfCho_cases(?BER),
+
+ ?line ?ber_driver(?BER,testSetOfCho:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetOfCho_cases(?BER)),
+
+ ?line testSetOfCho:compile(Config,?PER,[]),
+ ?line testSetOfCho_cases(?PER),
+
+ ?line ?per_bit_opt(testSetOfCho:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetOfCho_cases(?PER)),
+
+ ?line ?uper_bin(testSetOfCho:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetOfCho_cases(uper_bin)),
+
+ ?line testSetOfCho:compile(Config,?PER,[optimize]),
+ ?line testSetOfCho_cases(?PER).
+
+testSetOfCho_cases(Rules) ->
+ ?line testSetOfCho:main(Rules).
+
+
+testSetOfExternal(suite) -> [];
+testSetOfExternal(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSetOfExternal:compile(Config,?BER,[]),
+ ?line testSetOfExternal_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetOfExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetOfExternal_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testSetOfExternal:compile(Config,?PER,[]),
+ ?line testSetOfExternal_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetOfExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetOfExternal_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetOfExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetOfExternal_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testSetOfExternal:compile(Config,?PER,[optimize]),
+ ?line testSetOfExternal_cases(?PER).
+
+testSetOfExternal_cases(Rules) ->
+ ?line testSetOfExternal:main(Rules).
+
+
+
+
+testSetOfTag(suite) -> [];
+testSetOfTag(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testExternal:compile(Config,?BER,[]),
+ ?line testSetOfTag:compile(Config,?BER,[]),
+ ?line testSetOfTag_cases(?BER),
+
+ ?line ?ber_driver(?BER,testExternal:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetOfTag:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetOfTag_cases(?BER)),
+
+ ?line testExternal:compile(Config,?PER,[]),
+ ?line testSetOfTag:compile(Config,?PER,[]),
+ ?line testSetOfTag_cases(?PER),
+
+ ?line ?per_bit_opt(testExternal:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetOfTag:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testSetOfTag_cases(?PER)),
+
+ ?line ?uper_bin(testExternal:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetOfTag:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testSetOfTag_cases(uper_bin)),
+
+ ?line testExternal:compile(Config,?PER,[optimize]),
+ ?line testSetOfTag:compile(Config,?PER,[optimize]),
+ ?line testSetOfTag_cases(?PER).
+
+testSetOfTag_cases(Rules) ->
+ ?line testSetOfTag:main(Rules).
+
+
+c_syntax(suite) -> [];
+c_syntax(Config) ->
+ ?line DataDir% ?line testExternal:compile(Config,?PER),
+% ?line testPrimExternal:compile(Config,?PER),
+% ?line testPrimExternal_cases(?PER).
+ = ?config(data_dir,Config),
+ ?line _TempDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line {error,_R1} = asn1ct:compile(filename:join(DataDir,"Syntax")),
+ ?line {error,_R2} = asn1ct:compile(filename:join(DataDir,"BadTypeEnding")),
+ ?line {error,_R3} = asn1ct:compile(filename:join(DataDir,
+ "BadValueAssignment1")),
+ ?line {error,_R4} = asn1ct:compile(filename:join(DataDir,
+ "BadValueAssignment2")),
+ ?line {error,_R5} = asn1ct:compile(filename:join(DataDir,
+ "BadValueSet")),
+ ?line {error,_R6} = asn1ct:compile(filename:join(DataDir,
+ "ChoiceBadExtension")),
+ ?line {error,_R7} = asn1ct:compile(filename:join(DataDir,
+ "EnumerationBadExtension")),
+ ?line {error,_R8} = asn1ct:compile(filename:join(DataDir,
+ "Example")),
+ ?line {error,_R9} = asn1ct:compile(filename:join(DataDir,
+ "Export1")),
+ ?line {error,_R10} = asn1ct:compile(filename:join(DataDir,
+ "MissingEnd")),
+ ?line {error,_R11} = asn1ct:compile(filename:join(DataDir,
+ "SequenceBadComma")),
+ ?line {error,_R12} = asn1ct:compile(filename:join(DataDir,
+ "SequenceBadComponentName")),
+ ?line {error,_R13} = asn1ct:compile(filename:join(DataDir,
+ "SequenceBadComponentType")),
+ ?line {error,_R14} = asn1ct:compile(filename:join(DataDir,
+ "SeqBadComma")).
+
+
+c_string_per(suite) -> [];
+c_string_per(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line TempDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"String"),[?PER,{outdir,TempDir}]).
+
+c_string_ber(suite) -> [];
+c_string_ber(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line TempDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"String"),[?BER,{outdir,TempDir}]).
+
+
+c_implicit_before_choice(suite) -> [];
+c_implicit_before_choice(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line TempDir = ?config(priv_dir,Config),
+ ?line {error,_R2} = asn1ct:compile(filename:join(DataDir,"CCSNARG3"),[?BER,{outdir,TempDir}]).
+
+parse(suite) -> [];
+parse(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ M1 = test_modules(),
+% M2 = parse_modules(),
+ ?line ok = parse1(M1,DataDir,OutDir).
+
+parse1([M|T],DataDir,OutDir) ->
+ ?line ok = asn1ct:compile(DataDir ++ M,[abs,{outdir,OutDir}]),
+ parse1(T,DataDir,OutDir);
+parse1([],_,_) ->
+ ok.
+
+per(suite) -> [];
+per(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = per1(per_modules(),DataDir,OutDir),
+ ?line ?per_bit_opt(per1_bit_opt(per_modules(),DataDir,OutDir)),
+ ?line ok = per1_opt(per_modules(),DataDir,OutDir).
+
+
+per1([M|T],DataDir,OutDir) ->
+ ?line ok = asn1ct:compile(DataDir ++ M,[?PER,{outdir,OutDir}]),
+ ?line ok = asn1ct:test(list_to_atom(M)),
+ per1(T,DataDir,OutDir);
+per1([],_,_) ->
+ ok.
+
+per1_bit_opt([M|T],DataDir,OutDir) ->
+ ?line ok = asn1ct:compile(DataDir ++ M,[?PER,optimize,{outdir,OutDir}]),
+ ?line ok = asn1ct:test(list_to_atom(M)),
+ per1_bit_opt(T,DataDir,OutDir);
+per1_bit_opt([],_,_) ->
+ ok.
+
+per1_opt([M|T],DataDir,OutDir) ->
+ ?line ok = asn1ct:compile(DataDir ++ M,[?PER,optimized,{outdir,OutDir}]),
+ ?line ok = asn1ct:test(list_to_atom(M)),
+ per1_opt(T,DataDir,OutDir);
+per1_opt([],_,_) ->
+ ok.
+
+
+ber_choiceinseq(suite) ->[];
+ber_choiceinseq(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"ChoiceInSeq"),[?BER,{outdir,OutDir}]).
+
+ber_optional(suite) ->[];
+ber_optional(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"SOpttest"),[?BER,{outdir,OutDir}]),
+ ?line V = {'S',{'A',10,asn1_NOVALUE,asn1_NOVALUE},
+ {'B',asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE},
+ {'C',asn1_NOVALUE,111,asn1_NOVALUE}},
+ ?line {ok,B} = asn1_wrapper:encode('SOpttest','S',V),
+ ?line Bytes = lists:flatten(B),
+ ?line V2 = asn1_wrapper:decode('SOpttest','S',Bytes),
+ ?line ok = eq(V,element(2,V2)).
+
+ber_optional_keyed_list(suite) ->[];
+ber_optional_keyed_list(Config) ->
+ case ?BER of
+ ber_bin_v2 -> ok;
+ _ ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"SOpttest"),
+ [?BER,keyed_list,{outdir,OutDir}]),
+ ?line Vrecord = {'S',{'A',10,asn1_NOVALUE,asn1_NOVALUE},
+ {'B',asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE},
+ {'C',asn1_NOVALUE,111,asn1_NOVALUE}},
+ ?line V = [ {a,[{scriptKey,10}]},
+ {b,[]},
+ {c,[{callingPartysCategory,111}]} ],
+ ?line {ok,B} = asn1_wrapper:encode('SOpttest','S',V),
+ ?line Bytes = lists:flatten(B),
+ ?line V2 = asn1_wrapper:decode('SOpttest','S',Bytes),
+ ?line ok = eq(Vrecord,element(2,V2))
+ end.
+
+
+eq(V,V) ->
+ ok.
+
+
+ber_other(suite) ->[];
+ber_other(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = ber1(ber_modules(),DataDir,OutDir).
+
+
+ber1([M|T],DataDir,OutDir) ->
+ ?line ok = asn1ct:compile(DataDir ++ M,[?BER,{outdir,OutDir}]),
+ ?line ok = asn1ct:test(list_to_atom(M)),
+ ber1(T,DataDir,OutDir);
+ber1([],_,_) ->
+ ok.
+
+default_per(suite) ->[];
+default_per(Config) ->
+ default1(?PER,Config,[]).
+
+default_per_opt(suite) -> [];
+default_per_opt(Config) ->
+ ?per_bit_opt(default1(?PER,Config,[optimize])),
+ default1(?PER,Config,[optimize]).
+
+default_ber(suite) ->[];
+default_ber(Config) ->
+ default1(?BER,Config,[]).
+
+default1(Rule,Config,Options) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(DataDir ++ "Def",[Rule,{outdir,OutDir}]++Options),
+ ?line {ok,Bytes1} = asn1_wrapper:encode('Def','Def1',#'Def1'{bool0 = true,
+ bool1 = true,
+ bool2 = true,
+ bool3 = true}),
+ ?line {ok,{'Def1',true,true,true,true}} = asn1_wrapper:decode('Def','Def1',lists:flatten(Bytes1)),
+
+ ?line {ok,Bytes2} = asn1_wrapper:encode('Def','Def1',#'Def1'{bool0 = true}),
+ ?line {ok,{'Def1',true,false,false,false}} = asn1_wrapper:decode('Def','Def1',lists:flatten(Bytes2)),
+
+ ?line {ok,Bytes3} = asn1_wrapper:encode('Def','Def1',#'Def1'{bool0 = true,bool2=false}),
+ ?line {ok,{'Def1',true,false,false,false}} = asn1_wrapper:decode('Def','Def1',lists:flatten(Bytes3)).
+
+
+value_test(suite) ->[];
+value_test(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(DataDir ++ "ObjIdValues",[?BER,{outdir,OutDir}]),
+ ?line {ok,_} = asn1_wrapper:encode('ObjIdValues','ObjIdType','ObjIdValues':'mobileDomainId'()),
+ ?line ok = asn1ct:compile(DataDir ++ "ObjIdValues",[?PER,{outdir,OutDir}]),
+ ?line {ok,_} = asn1_wrapper:encode('ObjIdValues','ObjIdType','ObjIdValues':'mobileDomainId'()),
+ ?line ok = test_bad_values:tests(Config),
+ ok.
+
+
+constructed(suite) ->
+ [];
+constructed(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line ok = asn1ct:compile(DataDir ++ "Constructed",[?BER,{outdir,OutDir}]),
+ ?line {ok,B} = asn1_wrapper:encode('Constructed','S',{'S',false}),
+ ?line [40,3,1,1,0] = lists:flatten(B),
+ ?line {ok,B1} = asn1_wrapper:encode('Constructed','S2',{'S2',false}),
+ ?line [40,5,48,3,1,1,0] = lists:flatten(B1),
+ ?line {ok,B2} = asn1_wrapper:encode('Constructed','I',10),
+ ?line [136,1,10] = lists:flatten(B2),
+ ok.
+
+ber_decode_error(suite) -> [];
+ber_decode_error(Config) ->
+ ?line ok = ber_decode_error:compile(Config,?BER,[]),
+ ?line ok = ber_decode_error:run([]),
+
+ ?line ok = ?ber_driver(?BER,ber_decode_error:compile(Config,?BER,[driver])),
+ ?line ok = ?ber_driver(?BER,ber_decode_error:run([driver])),
+ ok.
+
+h323test(suite) ->
+ [];
+h323test(Config) ->
+ ?line ok = h323test:compile(Config,?PER,[]),
+ ?line ok = h323test:run(?PER),
+ ?line ?per_bit_opt(h323test:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(h323test:run(?PER)),
+ ?line ?uper_bin(h323test:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(h323test:run(uper_bin)),
+ ?line ok = h323test:compile(Config,?PER,[optimize]),
+ ?line ok = h323test:run(?PER),
+ ok.
+
+per_GeneralString(suite) ->
+ [];
+per_GeneralString(Config) ->
+ case erlang:module_loaded('MULTIMEDIA-SYSTEM-CONTROL') of
+ true ->
+ ok;
+ false ->
+ h323test:compile(Config,?PER,[])
+ end,
+ UI = [109,64,1,57],
+ ?line {ok,_V} = asn1_wrapper:decode('MULTIMEDIA-SYSTEM-CONTROL',
+ 'MultimediaSystemControlMessage',UI).
+
+per_open_type(suite) ->
+ [];
+per_open_type(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line ok = asn1ct:compile(DataDir ++ "OpenType",[?PER,{outdir,OutDir}]),
+ Stype = {'Stype',10,true},
+ ?line {ok,Bytes} = asn1_wrapper:encode('OpenType','Ot',Stype),
+ ?line {ok,Stype} = asn1_wrapper:decode('OpenType','Ot',Bytes),
+
+ ?line ?per_bit_opt(ok = asn1ct:compile(DataDir ++ "OpenType",
+ [?PER,optimize,{outdir,OutDir}])),
+ ?line ?per_bit_opt({ok,Bytes}=asn1_wrapper:encode('OpenType','Ot',Stype)),
+ ?line ?per_bit_opt({ok,Stype}=asn1_wrapper:decode('OpenType','Ot',Bytes)),
+
+ ?line ?uper_bin(ok = asn1ct:compile(DataDir ++ "OpenType",
+ [uper_bin,{outdir,OutDir}])),
+ ?line ?uper_bin({ok,Bytes}=asn1_wrapper:encode('OpenType','Ot',Stype)),
+ ?line ?uper_bin({ok,Stype}=asn1_wrapper:decode('OpenType','Ot',Bytes)),
+
+ ?line ok = asn1ct:compile(DataDir ++ "OpenType",
+ [?PER,optimize,{outdir,OutDir}]),
+ ?line {ok,Bytes} = asn1_wrapper:encode('OpenType','Ot',Stype),
+ ?line {ok,Stype} = asn1_wrapper:decode('OpenType','Ot',Bytes).
+
+testConstraints(suite) ->
+ [];
+testConstraints(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testConstraints:compile(Config,?BER,[]),
+ ?line testConstraints:int_constraints(?BER),
+
+ ?line ?ber_driver(?BER,testConstraints:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testConstraints:int_constraints(?BER)),
+
+ ?line testConstraints:compile(Config,?PER,[]),
+ ?line testConstraints:int_constraints(?PER),
+ ?line testConstraints:refed_NNL_name(?PER),
+
+ ?line ?per_bit_opt(testConstraints:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testConstraints:int_constraints(?PER)),
+ ?line ?per_bit_opt(testConstraints:refed_NNL_name(?PER)),
+
+ ?line ?uper_bin(testConstraints:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testConstraints:int_constraints(uper_bin)),
+ ?line ?uper_bin(testConstraints:refed_NNL_name(uper_bin)),
+
+ ?line testConstraints:compile(Config,?PER,[optimize]),
+ ?line testConstraints:int_constraints(?PER),
+ ?line testConstraints:refed_NNL_name(?PER).
+
+testSeqIndefinite(suite) -> [];
+testSeqIndefinite(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSeqIndefinite:compile(Config,?BER,[]),
+ ?line testSeqIndefinite:main(?BER),
+
+ ?line ?ber_driver(?BER,testSeqIndefinite:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSeqIndefinite:main(?BER)).
+
+testSetIndefinite(suite) -> [];
+testSetIndefinite(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testSetIndefinite:compile(Config,?BER,[]),
+ ?line testSetIndefinite:main(?BER),
+
+ ?line ?ber_driver(?BER,testSetIndefinite:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testSetIndefinite:main(?BER)).
+
+testChoiceIndefinite(suite) -> [];
+testChoiceIndefinite(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testChoiceIndefinite:compile(Config,?BER,[]),
+ ?line testChoiceIndefinite:main(?BER),
+
+ ?line ?ber_driver(?BER,testChoiceIndefinite:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testChoiceIndefinite:main(?BER)).
+
+testInfObjectClass(suite) ->
+ [];
+testInfObjectClass(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testInfObjectClass:compile(Config,?PER,[]),
+ ?line testInfObjectClass:main(?PER),
+ ?line testInfObj:compile(Config,?PER,[]),
+ ?line testInfObj:main(?PER),
+
+ ?line ?per_bit_opt(testInfObjectClass:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testInfObjectClass:main(?PER)),
+ ?line ?per_bit_opt(testInfObj:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testInfObj:main(?PER)),
+
+ ?line ?uper_bin(testInfObjectClass:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testInfObjectClass:main(uper_bin)),
+ ?line ?uper_bin(testInfObj:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testInfObj:main(uper_bin)),
+
+ ?line testInfObjectClass:compile(Config,?PER,[optimize]),
+ ?line testInfObjectClass:main(?PER),
+ ?line testInfObj:compile(Config,?PER,[optimize]),
+ ?line testInfObj:main(?PER),
+
+ ?line testInfObjectClass:compile(Config,?BER,[]),
+ ?line testInfObjectClass:main(?BER),
+ ?line testInfObj:compile(Config,?BER,[]),
+ ?line testInfObj:main(?BER),
+
+ ?line ?ber_driver(?BER,testInfObjectClass:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testInfObjectClass:main(?BER)),
+ ?line ?ber_driver(?BER,testInfObj:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testInfObj:main(?BER)),
+
+ ?line testInfObj:compile_RANAPfiles(Config,?PER,[]),
+
+ ?line ?per_bit_opt(testInfObj:compile_RANAPfiles(Config,?PER,[optimize])),
+
+ ?line ?uper_bin(testInfObj:compile_RANAPfiles(Config,uper_bin,[])),
+
+ ?line testInfObj:compile_RANAPfiles(Config,?PER,[optimize]),
+
+ ?line testInfObj:compile_RANAPfiles(Config,?BER,[]).
+
+testParameterizedInfObj(suite) ->
+ [];
+testParameterizedInfObj(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testParameterizedInfObj:compile(Config,?PER,[]),
+ ?line testParameterizedInfObj:main(?PER),
+
+ ?line ?per_bit_opt(testParameterizedInfObj:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testParameterizedInfObj:main(?PER)),
+
+ ?line ?uper_bin(testParameterizedInfObj:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testParameterizedInfObj:main(uper_bin)),
+
+ ?line testParameterizedInfObj:compile(Config,?PER,[optimize]),
+ ?line testParameterizedInfObj:main(?PER),
+
+ ?line testParameterizedInfObj:compile(Config,?BER,[]),
+ ?line testParameterizedInfObj:main(?BER),
+
+ ?line ?ber_driver(?BER,testParameterizedInfObj:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testParameterizedInfObj:main(?BER)).
+
+testMergeCompile(suite) ->
+ [];
+testMergeCompile(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testMergeCompile:compile(Config,?PER,[]),
+ ?line testMergeCompile:main(?PER),
+ ?line testMergeCompile:mvrasn(?PER),
+
+ ?line ?per_bit_opt(testMergeCompile:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testMergeCompile:main(?PER)),
+ ?line ?per_bit_opt(testMergeCompile:mvrasn(?PER)),
+
+ ?line ?uper_bin(testMergeCompile:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testMergeCompile:main(uper_bin)),
+ ?line ?uper_bin(testMergeCompile:mvrasn(uper_bin)),
+
+ ?line testMergeCompile:compile(Config,?BER,[]),
+ ?line testMergeCompile:main(?BER),
+ ?line testMergeCompile:mvrasn(?BER),
+
+ ?line ?ber_driver(?BER,testMergeCompile:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testMergeCompile:main(?BER)),
+ ?line ?ber_driver(?BER,testMergeCompile:mvrasn(?BER)).
+
+testobj(suite) ->
+ [];
+testobj(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line ok = testRANAP:compile(Config,?PER,[]),
+ ?line ok = testRANAP:testobj(?PER),
+ ?line ok = testParameterizedInfObj:ranap(?PER),
+
+ ?line ?per_bit_opt(ok = testRANAP:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(ok = testRANAP:testobj(?PER)),
+ ?line ?per_bit_opt(ok = testParameterizedInfObj:ranap(?PER)),
+
+ ?line ?uper_bin(ok = testRANAP:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(ok = testRANAP:testobj(uper_bin)),
+ ?line ?uper_bin(ok = testParameterizedInfObj:ranap(uper_bin)),
+
+ ?line ok = testRANAP:compile(Config,?PER,[optimize]),
+ ?line ok = testRANAP:testobj(?PER),
+ ?line ok = testParameterizedInfObj:ranap(?PER),
+
+ ?line ok = testRANAP:compile(Config,?BER,[]),
+ ?line ok = testRANAP:testobj(?BER),
+ ?line ok = testParameterizedInfObj:ranap(?BER),
+
+ ?line ?ber_driver(?BER,testRANAP:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testRANAP:testobj(?BER)),
+ ?line ?ber_driver(?BER,testParameterizedInfObj:ranap(?BER)).
+
+
+testDeepTConstr(suite) ->
+ [];
+testDeepTConstr(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testDeepTConstr:compile(Config,?PER,[]),
+ ?line testDeepTConstr:main(?PER),
+
+ ?line ?per_bit_opt(testDeepTConstr:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testDeepTConstr:main(?PER)),
+
+ ?line ?uper_bin(testDeepTConstr:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testDeepTConstr:main(uper_bin)),
+
+ ?line testDeepTConstr:compile(Config,?PER,[optimize]),
+ ?line testDeepTConstr:main(?PER),
+
+ ?line testDeepTConstr:compile(Config,?BER,[]),
+ ?line testDeepTConstr:main(?BER),
+
+ ?line ?ber_driver(?BER,testDeepTConstr:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testDeepTConstr:main(?BER)).
+
+testInvokeMod(suite) ->
+ [];
+testInvokeMod(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line ok = asn1ct:compile(filename:join(DataDir,"PrimStrings"),[{outdir,OutDir}]),
+ ?line {ok,_Result1} = 'PrimStrings':encode('Bs1',[1,0,1,0]),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"PrimStrings"),[?PER,{outdir,OutDir}]),
+ ?line {ok,_Result2} = 'PrimStrings':encode('Bs1',[1,0,1,0]).
+
+testExport(suite) ->
+ [];
+testExport(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line {error,{asn1,_Reason}} = asn1ct:compile(filename:join(DataDir,"IllegalExport"),[{outdir,OutDir}]).
+
+testImport(suite) ->
+ [];
+testImport(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line _OutDir = ?config(priv_dir,Config),
+ ?line {error,_} = asn1ct:compile(filename:join(DataDir,"ImportsFrom"),[?BER]),
+ ok.
+
+testMegaco(suite) ->
+ [];
+testMegaco(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ io:format("Config: ~p~n",[Config]),
+ ?line {ok,ModuleName1,ModuleName2} = testMegaco:compile(Config,?BER,[]),
+ ?line ok = testMegaco:main(ModuleName1,Config),
+ ?line ok = testMegaco:main(ModuleName2,Config),
+
+ case ?BER of
+ ber_bin_v2 ->
+ ?line {ok,ModuleName3,ModuleName4} = testMegaco:compile(Config,?BER,[driver]),
+ ?line ok = testMegaco:main(ModuleName3,Config),
+ ?line ok = testMegaco:main(ModuleName4,Config);
+ _-> ok
+ end,
+
+ ?line {ok,ModuleName5,ModuleName6} = testMegaco:compile(Config,?PER,[]),
+ ?line ok = testMegaco:main(ModuleName5,Config),
+ ?line ok = testMegaco:main(ModuleName6,Config),
+
+ ?line ?per_bit_opt({ok,ModuleName5,ModuleName6} = testMegaco:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(ok = testMegaco:main(ModuleName5,Config)),
+ ?line ?per_bit_opt(ok = testMegaco:main(ModuleName6,Config)),
+
+ ?line ?uper_bin({ok,ModuleName5,ModuleName6} = testMegaco:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(ok = testMegaco:main(ModuleName5,Config)),
+ ?line ?uper_bin(ok = testMegaco:main(ModuleName6,Config)),
+
+ ?line {ok,ModuleName7,ModuleName8} = testMegaco:compile(Config,?PER,[optimize]),
+ ?line ok = testMegaco:main(ModuleName7,Config),
+ ?line ok = testMegaco:main(ModuleName8,Config).
+
+
+testMvrasn6(suite) -> [];
+testMvrasn6(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testMvrasn6:compile(Config,?BER),
+ ?line testMvrasn6:main().
+
+testContextSwitchingTypes(suite) -> [];
+testContextSwitchingTypes(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testContextSwitchingTypes:compile(Config,?BER,[]),
+ ?line testContextSwitchingTypes:test(),
+
+ ?line ?ber_driver(?BER,testContextSwitchingTypes:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testContextSwitchingTypes:test()),
+
+ ?line testContextSwitchingTypes:compile(Config,?PER,[]),
+ ?line testContextSwitchingTypes:test(),
+
+ ?line ?per_bit_opt(testContextSwitchingTypes:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testContextSwitchingTypes:test()),
+
+ ?line ?uper_bin(testContextSwitchingTypes:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testContextSwitchingTypes:test()),
+
+ ?line testContextSwitchingTypes:compile(Config,?PER,[optimize]),
+ ?line testContextSwitchingTypes:test().
+
+testTypeValueNotation(suite) -> [];
+testTypeValueNotation(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ case ?BER of
+ Ber when Ber == ber; Ber == ber_bin ->
+ ?line testTypeValueNotation:compile(Config,?BER,[]),
+ ?line testTypeValueNotation:main(?BER,dummy);
+ _ ->
+ ok
+ end,
+
+ ?line ?ber_driver(?BER,testTypeValueNotation:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testTypeValueNotation:main(?BER,optimize)),
+
+ case ?BER of
+ Ber2 when Ber2 == ber; Ber2 == ber_bin ->
+ ?line testTypeValueNotation:compile(Config,?PER,[]),
+ ?line testTypeValueNotation:main(?PER,dummy);
+ _ ->
+ ok
+ end,
+
+ ?line ?per_bit_opt(testTypeValueNotation:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testTypeValueNotation:main(?PER,optimize)),
+
+ ?line ?uper_bin(testTypeValueNotation:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testTypeValueNotation:main(uper_bin,optimize)),
+ case ?BER of
+ Ber3 when Ber3 == ber; Ber3 == ber_bin ->
+ ?line testTypeValueNotation:compile(Config,?PER,[optimize]),
+ ?line testTypeValueNotation:main(?PER,optimize);
+ _ ->
+ ok
+ end.
+
+testOpenTypeImplicitTag(suite) -> [];
+testOpenTypeImplicitTag(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testOpenTypeImplicitTag:compile(Config,?BER,[]),
+ ?line testOpenTypeImplicitTag:main(?BER),
+
+ ?line ?ber_driver(?BER,testOpenTypeImplicitTag:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testOpenTypeImplicitTag:main(?BER)),
+
+ ?line testOpenTypeImplicitTag:compile(Config,?PER,[]),
+ ?line testOpenTypeImplicitTag:main(?PER),
+
+ ?line ?per_bit_opt(testOpenTypeImplicitTag:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testOpenTypeImplicitTag:main(?PER)),
+
+ ?line ?uper_bin(testOpenTypeImplicitTag:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testOpenTypeImplicitTag:main(uper_bin)),
+
+ ?line testOpenTypeImplicitTag:compile(Config,?PER,[optimize]),
+ ?line testOpenTypeImplicitTag:main(?PER).
+
+duplicate_tags(suite) -> [];
+duplicate_tags(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ {error,{asn1,[{error,{type,_,_,'SeqOpt1Imp',{asn1,{duplicates_of_the_tags,_}}}}]}} =
+ asn1ct:compile(filename:join(DataDir,"SeqOptional2"),[abs]),
+ ok.
+
+rtUI(suite) -> [];
+rtUI(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Prim"),[?BER]),
+ ?line {ok,_} = asn1rt:info('Prim'),
+
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Prim"),[?PER]),
+ ?line {ok,_} = asn1rt:info('Prim'),
+
+ ?line ok = asn1rt:load_driver(),
+ ?line ok = asn1rt:load_driver(),
+ ?line ok = asn1rt:unload_driver().
+
+testROSE(suite) -> [];
+testROSE(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testROSE:compile(Config,?BER,[]),
+
+ ?line testROSE:compile(Config,?PER,[]),
+ ?line ?per_bit_opt(testROSE:compile(Config,?PER,[optimize])),
+ ?line ?uper_bin(testROSE:compile(Config,uper_bin,[])),
+ ?line testROSE:compile(Config,?PER,[optimize]).
+
+testINSTANCE_OF(suite) -> [];
+testINSTANCE_OF(Config) ->
+ ?line testINSTANCE_OF:compile(Config,?BER,[]),
+ ?line testINSTANCE_OF:main(?BER),
+
+ ?line ?ber_driver(?BER,testINSTANCE_OF:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testINSTANCE_OF:main(?BER)),
+
+ ?line testINSTANCE_OF:compile(Config,?PER,[]),
+ ?line testINSTANCE_OF:main(?PER),
+
+ ?line ?per_bit_opt(testINSTANCE_OF:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testINSTANCE_OF:main(?PER)),
+
+ ?line ?uper_bin(testINSTANCE_OF:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testINSTANCE_OF:main(uper_bin)),
+
+ ?line testINSTANCE_OF:compile(Config,?PER,[optimize]),
+ ?line testINSTANCE_OF:main(?PER).
+
+testTCAP(suite) -> [];
+testTCAP(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testTCAP:compile(Config,?BER,[]),
+ ?line testTCAP:test(?BER,Config),
+
+ ?line ?ber_driver(?BER,testTCAP:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testTCAP:test(?BER,Config)),
+
+ ?line ?ber_driver(?BER,testTCAP:compile_asn1config(Config,?BER,[asn1config])),
+ ?line ?ber_driver(?BER,testTCAP:test_asn1config()).
+
+testDER(suite) ->[];
+testDER(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+
+ ?line testDER:compile(Config,?BER,[]),
+ ?line testDER:test(),
+
+ ?line ?ber_driver(?BER,testDER:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testDER:test()),
+
+ ?line testParamBasic:compile_der(Config,?BER),
+ ?line testParamBasic_cases(der),
+
+
+ ?line testSeqSetDefaultVal:compile(Config,?BER),
+ ?line testSeqSetDefaultVal_cases(?BER).
+
+testSeqSetDefaultVal_cases(?BER) ->
+ ?line testSeqSetDefaultVal:main(?BER).
+
+
+specialized_decodes(suite) -> [];
+specialized_decodes(Config) ->
+ ?line test_partial_incomplete_decode:compile(Config,?BER,[optimize]),
+ ?line test_partial_incomplete_decode:test(?BER,Config),
+ ?line test_selective_decode:test(?BER,Config).
+
+special_decode_performance(suite) ->[];
+special_decode_performance(Config) ->
+ ?line ?ber_driver(?BER,test_special_decode_performance:compile(Config,?BER)),
+ ?line ?ber_driver(?BER,test_special_decode_performance:go(all)).
+
+
+test_driver_load(suite) -> [];
+test_driver_load(Config) ->
+ ?line test_driver_load:compile(Config,?PER),
+ ?line test_driver_load:test(?PER,5).
+
+test_ParamTypeInfObj(suite) -> [];
+test_ParamTypeInfObj(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"IN-CS-1-Datatypes"),[ber_bin]).
+
+test_WS_ParamClass(suite) -> [];
+test_WS_ParamClass(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"InformationFramework"),
+ [ber_bin]).
+
+test_Defed_ObjectIdentifier(suite) -> [];
+test_Defed_ObjectIdentifier(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"UsefulDefinitions"),
+ [ber_bin]).
+
+testSelectionType(suite) -> [];
+testSelectionType(Config) ->
+
+ ?line ok = testSelectionTypes:compile(Config,?BER,[]),
+ ?line {ok,_} = testSelectionTypes:test(),
+
+ ?line ok = testSelectionTypes:compile(Config,?PER,[]),
+ ?line {ok,_} = testSelectionTypes:test().
+
+testSSLspecs(suite) -> [];
+testSSLspecs(Config) ->
+
+ ?line ok = testSSLspecs:compile(Config,?BER,
+ [optimize,compact_bit_string,der]),
+ ?line testSSLspecs:run(?BER),
+
+ case code:which(asn1ct) of
+ cover_compiled ->
+ ok;
+ _ ->
+ ?line ok = testSSLspecs:compile_inline(Config,?BER),
+ ?line ok = testSSLspecs:run_inline(?BER)
+ end.
+
+testNortel(suite) -> [];
+testNortel(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Nortel"),[?BER]),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Nortel"),
+ [?BER,optimize]),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Nortel"),
+ [?BER,optimize,driver]),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Nortel"),[?PER]),
+ ?line ?per_bit_opt(ok = asn1ct:compile(filename:join(DataDir,"Nortel"),
+ [?PER,optimize])),
+ ?line ?uper_bin(ok = asn1ct:compile(filename:join(DataDir,"Nortel"),[uper_bin])),
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Nortel"),
+ [?PER,optimize]).
+test_undecoded_rest(suite) -> [];
+test_undecoded_rest(Config) ->
+
+ ?line ok = test_undecoded_rest:compile(Config,?BER,[]),
+ ?line ok = test_undecoded_rest:test([]),
+
+ ?line ok = test_undecoded_rest:compile(Config,?BER,[undec_rest]),
+ ?line ok = test_undecoded_rest:test(undec_rest),
+
+ ?line ok = test_undecoded_rest:compile(Config,?PER,[]),
+ ?line ok = test_undecoded_rest:test([]),
+
+ ?line ?per_bit_opt(ok = test_undecoded_rest:compile(Config,?PER,[optimize,undec_rest])),
+ ?line ?per_bit_opt(ok = test_undecoded_rest:test(undec_rest)),
+
+ ?line ?uper_bin(ok = test_undecoded_rest:compile(Config,uper_bin,[undec_rest])),
+ ?line ?uper_bin(ok = test_undecoded_rest:test(undec_rest)),
+
+ ?line ok = test_undecoded_rest:compile(Config,?PER,[undec_rest]),
+ ?line ok = test_undecoded_rest:test(undec_rest).
+
+test_inline(suite) -> [];
+test_inline(Config) ->
+ case code:which(asn1ct) of
+ cover_compiled ->
+ {skip,"Not runnable when cover compiled"};
+ _ ->
+ ?line ok=test_inline:compile(Config,?BER,[]),
+ ?line test_inline:main(?BER),
+ ?line test_inline:inline1(Config,?BER,[]),
+ ?line test_inline:performance2()
+ end.
+
+%test_inline_prf(suite) -> [];
+%test_inline_prf(Config) ->
+% ?line test_inline:performance(Config).
+
+testTcapsystem(suite) -> [];
+testTcapsystem(Config) ->
+ ?line ok=testTcapsystem:compile(Config,?BER,[]).
+
+testNBAPsystem(suite) -> [];
+testNBAPsystem(Config) ->
+ ?line ok=testNBAPsystem:compile(Config,?PER,?per_optimize(?BER)),
+ ?line ok=testNBAPsystem:test(?PER,Config).
+
+test_compile_options(suite) -> [];
+test_compile_options(Config) ->
+ case code:which(asn1ct) of
+ cover_compiled ->
+ {skip,"Not runnable when cover compiled"};
+ _ ->
+ ?line ok = test_compile_options:wrong_path(Config),
+ ?line ok = test_compile_options:path(Config),
+ ?line ok = test_compile_options:noobj(Config),
+ ?line ok = test_compile_options:record_name_prefix(Config),
+ ?line ok = test_compile_options:verbose(Config)
+ end.
+testDoubleEllipses(suite) -> [];
+testDoubleEllipses(Config) ->
+ ?line testDoubleEllipses:compile(Config,?BER,[]),
+ ?line testDoubleEllipses:main(?BER),
+ ?line ?ber_driver(?BER,testDoubleEllipses:compile(Config,?BER,[driver])),
+ ?line ?ber_driver(?BER,testDoubleEllipses:main(?BER)),
+ ?line ?per_bit_opt(testDoubleEllipses:compile(Config,?PER,[optimize])),
+ ?line ?per_bit_opt(testDoubleEllipses:main(?PER)),
+ ?line ?uper_bin(testDoubleEllipses:compile(Config,uper_bin,[])),
+ ?line ?uper_bin(testDoubleEllipses:main(uper_bin)),
+ ?line testDoubleEllipses:compile(Config,?PER,?per_optimize(?BER)),
+ ?line testDoubleEllipses:main(?PER).
+
+test_modified_x420(suite) -> [];
+test_modified_x420(Config) ->
+ ?line test_modified_x420:compile(Config),
+ ?line test_modified_x420:test_io(Config).
+
+testX420(suite) -> [];
+testX420(Config) ->
+ ?line testX420:compile(?BER,[der],Config),
+ ?line ok = testX420:ticket7759(?BER,Config),
+ ?line testX420:compile(?PER,[],Config).
+
+test_x691(suite) -> [];
+test_x691(Config) ->
+ case ?PER of
+ per ->
+ ?line ok = test_x691:compile(Config,uper_bin,[]),
+ ?line true = test_x691:cases(uper_bin,unaligned),
+ ?line ok = test_x691:compile(Config,?PER,[]),
+ ?line true = test_x691:cases(?PER,aligned),
+%% ?line ok = asn1_test_lib:ticket_7678(Config,[]),
+ ?line ok = asn1_test_lib:ticket_7708(Config,[]),
+ ?line ok = asn1_test_lib:ticket_7763(Config);
+ _ ->
+ ?line ok = test_x691:compile(Config,?PER,?per_optimize(?BER)),
+ ?line true = test_x691:cases(?PER,aligned)
+ end.
+%% ?line ok = asn1_test_lib:ticket_7876(Config,?PER,[]),
+%% ?line ok = asn1_test_lib:ticket_7876(Config,?PER,[compact_bit_string]),
+%% ?line ok = asn1_test_lib:ticket_7876(Config,?PER,[optimize]),
+%% ?line ok = asn1_test_lib:ticket_7876(Config,?PER,[optimize,compact_bit_string]).
+
+
+ticket_6143(suite) -> [];
+ticket_6143(Config) ->
+ ?line ok = test_compile_options:ticket_6143(Config).
+
+testExtensionAdditionGroup(suite) -> [];
+testExtensionAdditionGroup(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line PrivDir = ?config(priv_dir,Config),
+ ?line Path = code:get_path(),
+ ?line code:add_patha(PrivDir),
+ DoIt = fun(Erule) ->
+ ?line ok = asn1ct:compile(filename:join(DataDir,"Extension-Addition-Group"),[Erule,{outdir,PrivDir}]),
+ ?line {ok,_M} = compile:file(filename:join(DataDir,"extensionAdditionGroup"),[{i,PrivDir},{outdir,PrivDir},debug_info]),
+ ?line ok = extensionAdditionGroup:run(Erule)
+ end,
+ ?line [DoIt(Rule)|| Rule <- [per_bin,uper_bin,ber_bin]],
+ ?line code:set_path(Path).
+
+
+
+% parse_modules() ->
+% ["ImportsFrom"].
+
+per_modules() ->
+ [X || X <- test_modules()].
+ber_modules() ->
+ [X || X <- test_modules(),
+ X =/= "CommonDataTypes",
+ X =/= "DS-EquipmentUser-CommonFunctionOrig-TransmissionPath",
+ X =/= "H323-MESSAGES",
+ X =/= "H235-SECURITY-MESSAGES",
+ X =/= "MULTIMEDIA-SYSTEM-CONTROL"].
+test_modules() ->
+ _Modules = [
+ "BitStr",
+ "CommonDataTypes",
+ "Constraints",
+ "ContextSwitchingTypes",
+ "DS-EquipmentUser-CommonFunctionOrig-TransmissionPath",
+ "Enum",
+ "From",
+ "H235-SECURITY-MESSAGES",
+ "H323-MESSAGES",
+ %%"MULTIMEDIA-SYSTEM-CONTROL", recursive type , problem for asn1ct:value
+ "Import",
+ "Int",
+ "MAP-commonDataTypes",
+% ambigous tags "MAP-insertSubscriberData-def",
+ "Null",
+ "Octetstr",
+ "One",
+ "P-Record",
+ "P",
+% "PDUs",
+ "Person",
+ "PrimStrings",
+ "Real",
+ "XSeq",
+ "XSeqOf",
+ "XSet",
+ "XSetOf",
+ "String",
+ "SwCDR",
+% "Syntax",
+ "Time"
+% ANY "Tst",
+% "Two",
+% errors that should be detected "UndefType"
+] ++
+ [
+ "SeqSetLib", % must be compiled before Seq and Set
+ "Seq",
+ "Set",
+ "SetOf",
+ "SeqOf",
+ "Prim",
+ "Cho",
+ "Def",
+ "Opt",
+ "ELDAPv3",
+ "LDAP"
+ ].
+
+
+common() ->
+[].
+
+particular() ->
+[smp, ticket7904].
+
+
+smp(suite) -> [];
+smp(Config) ->
+ case erlang:system_info(smp_support) of
+ true ->
+ NumOfProcs = erlang:system_info(schedulers),
+ io:format("smp starting ~p workers\n",[NumOfProcs]),
+
+ ?line Msg = {initiatingMessage, testNBAPsystem:cell_setup_req_msg()},
+ ?line ok = testNBAPsystem:compile(Config,per_bin,[optimize]),
+
+ Parent = self(),
+
+ ?line ok = asn1rt:load_driver(),
+
+ smp2(Parent,NumOfProcs,Msg,2),
+
+ N = 10000,
+
+ ?line {Time1,ok} = timer:tc(?MODULE,smp2,[Parent,NumOfProcs,Msg, N]),
+ ?line {Time1S,ok} = timer:tc(?MODULE,sequential,[NumOfProcs * N,Msg]),
+
+ ?line ok = testNBAPsystem:compile(Config,ber_bin,[optimize,driver]),
+ ?line {Time2,ok} = timer:tc(?MODULE,smp2,[Parent,NumOfProcs,Msg, N]),
+
+ ?line {Time2S,ok} = timer:tc(?MODULE,sequential,[NumOfProcs * N,Msg]),
+
+ {comment,lists:flatten(io_lib:format("Encode/decode time parallell with ~p cores: ~p [microsecs]~nEncode/decode time sequential: ~p [microsecs]",[NumOfProcs,Time1+Time2,Time1S+Time2S]))};
+ false ->
+ {skipped,"No smp support"}
+ end.
+
+smp2(Parent,NumOfProcs,Msg, N) ->
+ Pids = [spawn_link(fun() -> worker(Msg,Parent, N) end)
+ || _ <- lists:seq(1,NumOfProcs)],
+ ?line ok = wait_pids(Pids).
+
+worker(Msg, Parent, N) ->
+ %% io:format("smp worker ~p with ~p worker loops.~n",[self(), N]),
+ worker_loop(N, Msg),
+ Parent ! self().
+
+worker_loop(0, _Msg) ->
+ ok;
+worker_loop(N, Msg) ->
+ ?line {ok,B}=asn1_wrapper:encode('NBAP-PDU-Discriptions',
+ 'NBAP-PDU',
+ Msg),
+ ?line {ok,_Msg}=asn1_wrapper:decode('NBAP-PDU-Discriptions',
+ 'NBAP-PDU',
+ B),
+ worker_loop(N - 1, Msg).
+
+
+wait_pids([]) ->
+ ok;
+wait_pids(Pids) ->
+ receive
+ Pid when is_pid(Pid) ->
+ ?line true = lists:member(Pid,Pids),
+ Others = lists:delete(Pid,Pids),
+ io:format("wait_pid got ~p, still waiting for ~p\n",[Pid,Others]),
+ wait_pids(Others);
+ Err ->
+ io:format("Err: ~p~n",[Err]),
+ ?line exit(Err)
+ end.
+
+sequential(N,Msg) ->
+ %%io:format("sequential encode/decode with N = ~p~n",[N]),
+ worker_loop(N,Msg).
+
+-record('InitiatingMessage',{procedureCode,criticality,value}).
+-record('Iu-ReleaseCommand',{first,second}).
+
+ticket7904(suite) -> [];
+ticket7904(Config) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+
+ ?line ok = asn1ct:compile(DataDir ++
+ "RANAPextract1",[per_bin,optimize,{outdir,OutDir}]),
+
+ Val1 = #'InitiatingMessage'{procedureCode=1,
+ criticality=ignore,
+ value=#'Iu-ReleaseCommand'{
+ first=13,
+ second=true}},
+
+ ?line {ok,_} = 'RANAPextract1':encode('InitiatingMessage', Val1),
+ asn1rt:unload_driver(),
+ ?line {ok,_} = 'RANAPextract1':encode('InitiatingMessage', Val1).
diff --git a/lib/asn1/test/asn1_common_SUITE.erl.src b/lib/asn1/test/asn1_common_SUITE.erl.src
index 99a4f90738..2fa2a09f1f 100644
--- a/lib/asn1/test/asn1_common_SUITE.erl.src
+++ b/lib/asn1/test/asn1_common_SUITE.erl.src
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
diff --git a/lib/asn1/test/test_inline.erl b/lib/asn1/test/test_inline.erl
index dfa3c134ae..b7ec0d8921 100644
--- a/lib/asn1/test/test_inline.erl
+++ b/lib/asn1/test/test_inline.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -173,8 +173,8 @@ mi_encdec(N,Val) ->
m_encdec(0,_) ->
ok;
m_encdec(N,Val) ->
- {ok,B}='Mod1':encode('L',Val),
- {ok,_R}='Mod1':decode('L',B),
+ {ok,B}='Mod':encode('L',Val),
+ {ok,_R}='Mod':decode('L',B),
m_encdec(N-1,Val).
diff --git a/lib/asn1/vsn.mk b/lib/asn1/vsn.mk
index e900a52286..7b52e18805 100644
--- a/lib/asn1/vsn.mk
+++ b/lib/asn1/vsn.mk
@@ -1,2 +1,2 @@
#next version number to use is 1.6.15 | 1.7 | 2.0
-ASN1_VSN = 1.6.15
+ASN1_VSN = 1.6.16
diff --git a/lib/common_test/doc/src/Makefile b/lib/common_test/doc/src/Makefile
index 1a767a8197..3ea6ae65d5 100644
--- a/lib/common_test/doc/src/Makefile
+++ b/lib/common_test/doc/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2003-2010. All Rights Reserved.
+# Copyright Ericsson AB 2003-2011. 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
@@ -52,7 +52,7 @@ CT_XML_FILES = $(CT_MODULES:=.xml)
XML_APPLICATION_FILES = ref_man.xml
XML_REF1_FILES = ct_run.xml
-XML_REF3_FILES = $(CT_XML_FILES)
+XML_REF3_FILES = $(CT_XML_FILES) ct_hooks.xml
XML_REF6_FILES = common_test_app.xml
XML_PART_FILES = part.xml
@@ -71,6 +71,7 @@ XML_CHAPTER_FILES = \
cover_chapter.xml \
ct_master_chapter.xml \
event_handler_chapter.xml \
+ ct_hooks_chapter.xml \
dependencies_chapter.xml \
notes.xml \
notes_history.xml
diff --git a/lib/common_test/doc/src/common_test_app.xml b/lib/common_test/doc/src/common_test_app.xml
index e30eef2488..c92566de37 100644
--- a/lib/common_test/doc/src/common_test_app.xml
+++ b/lib/common_test/doc/src/common_test_app.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2003</year><year>2010</year>
+ <year>2003</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -131,7 +131,8 @@
<type>
<v> Info = {timetrap,Time} | {require,Required} |
{require,Name,Required} | {userdata,UserData} |
- {silent_connections,Conns} | {stylesheet,CSSFile}</v>
+ {silent_connections,Conns} | {stylesheet,CSSFile} |
+ {ct_hooks, CTHs}</v>
<v> Time = MilliSec | {seconds,integer()} | {minutes,integer()}
| {hours,integer()}</v>
<v> MilliSec = integer()</v>
@@ -143,6 +144,9 @@
<v> UserData = term()</v>
<v> Conns = [atom()]</v>
<v> CSSFile = string()</v>
+ <v> CTHs = [CTHModule | {CTHModule, CTHInitArgs}]</v>
+ <v> CTHModule = atom()</v>
+ <v> CTHInitArgs = term()</v>
</type>
<desc>
@@ -170,6 +174,10 @@
<p>With <c>userdata</c>, it is possible for the user to
specify arbitrary test suite related information which can be
read by calling <c>ct:userdata/2</c>.</p>
+
+ <p>The <c>ct_hooks</c> tag specifies which
+ <seealso marker="ct_hooks_chapter">Common Test Hooks</seealso>
+ are to be run together with this suite.</p>
<p>Other tuples than the ones defined will simply be ignored.</p>
@@ -288,7 +296,7 @@
</func>
<func>
- <name>Module:init_per_testcase(TestCase, Config) -> NewConfig | {skip,Reason}</name>
+ <name>Module:init_per_testcase(TestCase, Config) -> NewConfig | {fail,Reason} | {skip,Reason}</name>
<fsummary>Test case initialization.</fsummary>
<type>
<v> TestCase = atom()</v>
@@ -303,10 +311,12 @@
<p>This function is called before each test case. The
<c>TestCase</c> argument is the name of the test case, and
- <c>Config</c> is the configuration which can be modified
- here. Whatever is returned from this function is given as
- <c>Config</c> to the test case. If <c>{skip,Reason}</c> is returned,
- the test case will be skipped and <c>Reason</c> printed
+ <c>Config</c> (list of key-value tuples) is the configuration
+ data that can be modified here. The <c>NewConfig</c> list returned
+ from this function is given as <c>Config</c> to the test case.
+ If <c>{fail,Reason}</c> is returned, the test case is
+ marked as failed without being executed. If <c>{skip,Reason}</c> is
+ returned, the test case will be skipped and <c>Reason</c> printed
in the overview log for the suite.</p>
</desc>
</func>
diff --git a/lib/common_test/doc/src/cover_chapter.xml b/lib/common_test/doc/src/cover_chapter.xml
index 377409ed7b..b7162cb542 100644
--- a/lib/common_test/doc/src/cover_chapter.xml
+++ b/lib/common_test/doc/src/cover_chapter.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2006</year><year>2009</year>
+ <year>2006</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
diff --git a/lib/common_test/doc/src/ct_hooks.xml b/lib/common_test/doc/src/ct_hooks.xml
new file mode 100644
index 0000000000..7d5c9f4750
--- /dev/null
+++ b/lib/common_test/doc/src/ct_hooks.xml
@@ -0,0 +1,556 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2010</year><year>2011</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>Common Test Hooks</title>
+ <prepared>Lukas Larsson</prepared>
+ <responsible>Lukas Larsson</responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date>2010-12-02</date>
+ <rev>PA1</rev>
+ <file>ct_hooks.sgml</file>
+ </header>
+ <module>ct_hooks</module>
+ <modulesummary>A callback interface on top of Common Test</modulesummary>
+
+ <description>
+
+ <warning><p>This feature is in alpha release right now. This means that the
+ interface may change in the future and that there may be bugs. We
+ encourage you to use this feature, but be prepared
+ that there might be bugs and that the interface might change
+ inbetween releases.</p></warning>
+
+ <p>The <em>Common Test Hook</em> (henceforth called CTH) framework allows
+ extensions of the default behaviour of Common Test by means of callbacks
+ before and after all test suite calls. It is meant for advanced users of
+ Common Test which want to abstract out behaviour which is common to
+ multiple test suites. </p>
+
+ <p>In brief, Common Test Hooks allows you to:</p>
+
+ <list>
+ <item>Manipulate the runtime config before each suite
+ configuration call</item>
+ <item>Manipulate the return of all suite configuration calls and in
+ extension the result of the test themselves.</item>
+ </list>
+
+ <p>The following sections describe the mandatory and optional CTH
+ functions Common Test will call during test execution. For more details
+ see <seealso marker="ct_hooks_chapter">Common Test Hooks</seealso> in
+ the User's Guide.</p>
+
+ <p>For information about how to add a CTH to your suite see
+ <seealso marker="ct_hooks_chapter#installing">Installing a CTH
+ </seealso> in the User's Guide.</p>
+
+ <note><p>See the
+ <seealso marker="ct_hooks_chapter#example">Example CTH</seealso>
+ in the User's Guide for a minimal example of a CTH. </p></note>
+
+ </description>
+
+ <section>
+ <title>CALLBACK FUNCTIONS</title>
+ <p>The following functions define the callback interface
+ for a Common Test Hook.</p>
+ </section>
+
+ <funcs>
+ <func>
+ <name>Module:init(Id, Opts) -&gt; State</name>
+ <fsummary>Initiates the Common Test Hook</fsummary>
+ <type>
+ <v>Id = reference() | term()</v>
+ <v>Opts = term()</v>
+ <v>State = term()</v>
+ </type>
+
+ <desc>
+ <p> MANDATORY </p>
+
+ <p>Always called before any other callback function.
+ Use this to initiate any common state.
+ It should return a state for this CTH.</p>
+
+ <p><c>Id</c> is the return value of
+ <seealso marker="#Module:id-1">id/1</seealso>, or a <c>reference</c>
+ (created using
+ <seealso marker="erts:erlang#make_ref-0">make_ref/0</seealso>)
+ if <seealso marker="#Module:id-1">id/1</seealso> is not implemented.
+ </p>
+
+ <p>For details about when init is called see
+ <seealso marker="ct_hooks_chapter#scope">scope</seealso>
+ in the User's Guide.</p>
+
+ </desc>
+ </func>
+
+ <func>
+ <name>Module:pre_init_per_suite(SuiteName, Config, CTHState) -&gt;
+ Result</name>
+ <fsummary>Called before init_per_suite</fsummary>
+ <type>
+ <v>SuiteName = atom()</v>
+ <v>Config = NewConfig = [{Key,Value}]</v>
+ <v>CTHState = NewCTHState = term()</v>
+ <v>Result = {Return, NewCTHState}</v>
+ <v>Return = NewConfig | SkipOrFail</v>
+ <v>SkipOrFail = {fail, Reason} | {skip, Reason}</v>
+ <v>Key = atom()</v>
+ <v>Value = term()</v>
+ <v>Reason = term()</v>
+ </type>
+
+ <desc>
+ <p> OPTIONAL </p>
+
+ <p>This function is called before
+ <seealso marker="common_test#Module:init_per_suite-1">
+ init_per_suite</seealso> if it exists.
+ It typically contains initialization/logging which needs to be done
+ before init_per_suite is called.
+ If <c>{skip,Reason}</c> or <c>{fail,Reason}</c> is returned,
+ init_per_suite and all test cases of the suite will be skipped and
+ Reason printed in the overview log of the suite.</p>
+
+ <p><c>SuiteName</c> is the name of the suite to be run.</p>
+
+ <p><c>Config</c> is the original config list of the test suite.</p>
+
+ <p><c>CTHState</c> is the current internal state of the CTH.</p>
+
+ <p><c>Return</c> is the result of the init_per_suite function.
+ If it is <c>{skip,Reason}</c> or <c>{fail,Reason}</c>
+ <seealso marker="common_test#Module:init_per_suite-1">init_per_suite
+ </seealso> will never be called, instead the initiation is considered
+ to be skipped/failed respectively. If a <c>NewConfig</c> list
+ is returned, <seealso marker="common_test#Module:init_per_suite-1">
+ init_per_suite</seealso> will be called with that <c>NewConfig</c> list.
+ See <seealso marker="ct_hooks_chapter#pre">
+ Pre Hooks</seealso> in the User's Guide for more details.</p>
+
+
+ <p>Note that this function is only called if the CTH has been added
+ before init_per_suite is run, see
+ <seealso marker="ct_hooks_chapter#scope">CTH Scoping</seealso>
+ in the User's Guide for details.</p>
+ </desc>
+ </func>
+
+ <func>
+ <name>Module:post_init_per_suite(SuiteName, Config, Return, CTHState) -&gt;
+ Result</name>
+ <fsummary>Called after init_per_suite</fsummary>
+ <type>
+ <v>SuiteName = atom()</v>
+ <v>Config = [{Key,Value}]</v>
+ <v>Return = NewReturn = Config | SkipOrFail | term()</v>
+ <v>SkipOrFail = {fail, Reason} | {skip, Reason} | term()</v>
+ <v>CTHState = NewCTHState = term()</v>
+ <v>Result = {NewReturn, NewCTHState}</v>
+ <v>Key = atom()</v>
+ <v>Value = term()</v>
+ <v>Reason = term()</v>
+ </type>
+
+ <desc>
+ <p> OPTIONAL </p>
+
+ <p>This function is called after
+ <seealso marker="common_test#Module:init_per_suite-1">
+ init_per_suite</seealso> if it exists. It typically contains extra
+ checks to make sure that all the correct dependencies have
+ been started correctly.</p>
+
+ <p><c>Return</c> is what
+ <seealso marker="common_test#Module:init_per_suite-1">init_per_suite
+ </seealso> returned, i.e. {fail,Reason}, {skip,Reason}, a <c>Config</c>
+ list or a term describing how
+ <seealso marker="common_test#Module:init_per_suite-1">init_per_suite
+ </seealso> failed.</p>
+
+ <p><c>NewReturn</c> is the possibly modified return value of
+ <seealso marker="common_test#Module:init_per_suite-1">init_per_suite
+ </seealso>. It is here possible to recover from a failure in
+ <seealso marker="common_test#Module:init_per_suite-1">init_per_suite
+ </seealso> by returning the <c>ConfigList</c> with the <c>tc_status</c>
+ element removed. See <seealso marker="ct_hooks_chapter#post">
+ Post Hooks</seealso> in the User's Guide for more details.</p>
+
+ <p><c>CTHState</c> is the current internal state of the CTH.</p>
+
+ <p>Note that this function is only called if the CTH has been added
+ before or in init_per_suite, see
+ <seealso marker="ct_hooks_chapter#scope">CTH Scoping</seealso>
+ in the User's Guide for details.</p>
+ </desc>
+ </func>
+
+ <func>
+ <name>Module:pre_init_per_group(GroupName, Config, CTHState) -&gt;
+ Result</name>
+ <fsummary>Called before init_per_group</fsummary>
+ <type>
+ <v>GroupName = atom()</v>
+ <v>Config = NewConfig = [{Key,Value}]</v>
+ <v>CTHState = NewCTHState = term()</v>
+ <v>Result = {NewConfig | SkipOrFail, NewCTHState}</v>
+ <v>SkipOrFail = {fail,Reason} | {skip, Reason}</v>
+ <v>Key = atom()</v>
+ <v>Value = term()</v>
+ <v>Reason = term()</v>
+ </type>
+
+ <desc>
+ <p> OPTIONAL </p>
+
+ <p>This function is called before
+ <seealso marker="common_test#Module:init_per_group-2">
+ init_per_group</seealso> if it exists. It behaves the same way as
+ <seealso marker="ct_hooks#Module:pre_init_per_suite-3">
+ pre_init_per_suite</seealso>, but for the
+ <seealso marker="common_test#Module:init_per_group-2">
+ init_per_group</seealso> instead.</p>
+ </desc>
+ </func>
+
+ <func>
+ <name>Module:post_init_per_group(GroupName, Config, Return, CTHState) -&gt;
+ Result</name>
+ <fsummary>Called after init_per_group</fsummary>
+ <type>
+ <v>GroupName = atom()</v>
+ <v>Config = [{Key,Value}]</v>
+ <v>Return = NewReturn = Config | SkipOrFail | term()</v>
+ <v>SkipOrFail = {fail,Reason} | {skip, Reason}</v>
+ <v>CTHState = NewCTHState = term()</v>
+ <v>Result = {NewReturn, NewCTHState}</v>
+ <v>Key = atom()</v>
+ <v>Value = term()</v>
+ <v>Reason = term()</v>
+ </type>
+
+ <desc>
+ <p> OPTIONAL </p>
+
+ <p>This function is called after
+ <seealso marker="common_test#Module:init_per_group-2">
+ init_per_group</seealso> if it exists. It behaves the same way as
+ <seealso marker="ct_hooks#Module:post_init_per_suite-4">
+ post_init_per_suite</seealso>, but for the
+ <seealso marker="common_test#Module:init_per_group-2">
+ init_per_group</seealso> instead.</p>
+ </desc>
+ </func>
+
+ <func>
+ <name>Module:pre_init_per_testcase(TestcaseName, Config, CTHState) -&gt;
+ Result</name>
+ <fsummary>Called before init_per_testcase</fsummary>
+ <type>
+ <v>TestcaseName = atom()</v>
+ <v>Config = NewConfig = [{Key,Value}]</v>
+ <v>CTHState = NewCTHState = term()</v>
+ <v>Result = {NewConfig | SkipOrFail, NewCTHState}</v>
+ <v>SkipOrFail = {fail,Reason} | {skip, Reason}</v>
+ <v>Key = atom()</v>
+ <v>Value = term()</v>
+ <v>Reason = term()</v>
+ </type>
+
+ <desc>
+ <p> OPTIONAL </p>
+
+ <p>This function is called before
+ <seealso marker="common_test#Module:init_per_testcase-2">
+ init_per_testcase</seealso> if it exists. It behaves the same way as
+ <seealso marker="ct_hooks#Module:pre_init_per_suite-3">
+ pre_init_per_suite</seealso>, but for the
+ <seealso marker="common_test#Module:init_per_testcase-2">
+ init_per_testcase</seealso> function instead.</p>
+
+ <p>Note that it is not possible to add CTH's here right now,
+ that feature might be added later,
+ but it would right now break backwards compatability.</p>
+ </desc>
+ </func>
+
+ <func>
+ <name>Module:post_end_per_testcase(TestcaseName, Config, Return, CTHState)
+ -&gt; Result</name>
+ <fsummary>Called after end_per_testcase</fsummary>
+ <type>
+ <v>TestcaseName = atom()</v>
+ <v>Config = [{Key,Value}]</v>
+ <v>Return = NewReturn = Config | SkipOrFail | term()</v>
+ <v>SkipOrFail = {fail,Reason} | {skip, Reason}</v>
+ <v>CTHState = NewCTHState = term()</v>
+ <v>Result = {NewReturn, NewCTHState}</v>
+ <v>Key = atom()</v>
+ <v>Value = term()</v>
+ <v>Reason = term()</v>
+ </type>
+
+ <desc>
+ <p> OPTIONAL </p>
+
+ <p>This function is called after
+ <seealso marker="common_test#Module:end_per_testcase-2">
+ end_per_testcase</seealso> if it exists. It behaves the same way as
+ <seealso marker="ct_hooks#Module:post_init_per_suite-4">
+ post_init_per_suite</seealso>, but for the
+ <seealso marker="common_test#Module:end_per_testcase-2">
+ end_per_testcase</seealso> function instead.</p>
+ </desc>
+ </func>
+
+ <func>
+ <name>Module:pre_end_per_group(GroupName, Config, CTHState) -&gt;
+ Result</name>
+ <fsummary>Called before end_per_group</fsummary>
+ <type>
+ <v>GroupName = atom()</v>
+ <v>Config = NewConfig = [{Key,Value}]</v>
+ <v>CTHState = NewCTHState = term()</v>
+ <v>Result = {NewConfig | SkipOrFail, NewCTHState}</v>
+ <v>SkipOrFail = {fail,Reason} | {skip, Reason}</v>
+ <v>Key = atom()</v>
+ <v>Value = term()</v>
+ <v>Reason = term()</v>
+ </type>
+
+ <desc>
+ <p> OPTIONAL </p>
+
+ <p>This function is called before
+ <seealso marker="common_test#Module:end_per_group-2">
+ end_per_group</seealso> if it exists. It behaves the same way as
+ <seealso marker="ct_hooks#Module:pre_init_per_suite-3">
+ pre_init_per_suite</seealso>, but for the
+ <seealso marker="common_test#Module:end_per_group-2">
+ end_per_group</seealso> function instead.</p>
+ </desc>
+ </func>
+
+ <func>
+ <name>Module:post_end_per_group(GroupName, Config, Return, CTHState) -&gt;
+ Result</name>
+ <fsummary>Called after end_per_group</fsummary>
+ <type>
+ <v>GroupName = atom()</v>
+ <v>Config = [{Key,Value}]</v>
+ <v>Return = NewReturn = Config | SkipOrFail | term()</v>
+ <v>SkipOrFail = {fail,Reason} | {skip, Reason}</v>
+ <v>CTHState = NewCTHState = term()</v>
+ <v>Result = {NewReturn, NewCTHState}</v>
+ <v>Key = atom()</v>
+ <v>Value = term()</v>
+ <v>Reason = term()</v>
+ </type>
+
+ <desc>
+ <p> OPTIONAL </p>
+
+ <p>This function is called after
+ <seealso marker="common_test#Module:end_per_group-2">
+ end_per_group</seealso> if it exists. It behaves the same way as
+ <seealso marker="ct_hooks#Module:post_init_per_suite-4">
+ post_init_per_suite</seealso>, but for the
+ <seealso marker="common_test#Module:end_per_group-2">
+ end_per_group</seealso> function instead.</p>
+ </desc>
+ </func>
+
+ <func>
+ <name>Module:pre_end_per_suite(SuiteName, Config, CTHState) -&gt;
+ Result</name>
+ <fsummary>Called before end_per_suite</fsummary>
+ <type>
+ <v>SuiteName = atom()</v>
+ <v>Config = NewConfig = [{Key,Value}]</v>
+ <v>CTHState = NewCTHState = term()</v>
+ <v>Result = {NewConfig | SkipOrFail, NewCTHState}</v>
+ <v>SkipOrFail = {fail,Reason} | {skip, Reason}</v>
+ <v>Key = atom()</v>
+ <v>Value = term()</v>
+ <v>Reason = term()</v>
+ </type>
+
+ <desc>
+ <p> OPTIONAL </p>
+
+ <p>This function is called before
+ <seealso marker="common_test#Module:end_per_suite-1">
+ end_per_suite</seealso> if it exists. It behaves the same way as
+ <seealso marker="ct_hooks#Module:pre_init_per_suite-3">
+ pre_init_per_suite</seealso>, but for the
+ <seealso marker="common_test#Module:end_per_suite-1">
+ end_per_suite</seealso> function instead.</p>
+ </desc>
+ </func>
+
+ <func>
+ <name>Module:post_end_per_suite(SuiteName, Config, Return, CTHState) -&gt;
+ Result</name>
+ <fsummary>Called after end_per_suite</fsummary>
+ <type>
+ <v>SuiteName = atom()</v>
+ <v>Config = [{Key,Value}]</v>
+ <v>Return = NewReturn = Config | SkipOrFail | term()</v>
+ <v>SkipOrFail = {fail,Reason} | {skip, Reason}</v>
+ <v>CTHState = NewCTHState = term()</v>
+ <v>Result = {NewReturn, NewCTHState}</v>
+ <v>Key = atom()</v>
+ <v>Value = term()</v>
+ <v>Reason = term()</v>
+ </type>
+
+ <desc>
+ <p> OPTIONAL </p>
+
+ <p>This function is called after
+ <seealso marker="common_test#Module:end_per_suite-1">
+ end_per_suite</seealso> if it exists. It behaves the same way as
+ <seealso marker="ct_hooks#Module:post_init_per_suite-4">
+ post_init_per_suite</seealso>, but for the
+ <seealso marker="common_test#Module:end_per_suite-1">
+ end_per_suite</seealso> function instead.</p>
+ </desc>
+ </func>
+
+ <func>
+ <name>Module:on_tc_fail(TestcaseName, Reason, CTHState) -&gt;
+ NewCTHState</name>
+ <fsummary>Called after the CTH scope ends</fsummary>
+ <type>
+ <v>TestcaseName = init_per_suite | end_per_suite |
+ init_per_group | end_per_group | atom()</v>
+ <v>Reason = term()</v>
+ <v>CTHState = NewCTHState = term()</v>
+ </type>
+
+ <desc>
+ <p> OPTIONAL </p>
+
+ <p>This function is called whenever a testcase fails.
+ It is called after the post function has been called for
+ the testcase which failed. i.e.
+ if init_per_suite fails this function is called after
+ <seealso marker="#Module:post_init_per_suite-4">
+ post_init_per_suite</seealso>, and if a testcase fails it is called
+ after <seealso marker="#Module:post_end_per_testcase-4">
+ post_end_per_testcase</seealso>.</p>
+
+ <p>The data which comes with the Reason follows the same format as the
+ <seealso marker="event_handler_chapter#failreason">FailReason
+ </seealso> in the <seealso marker="event_handler_chapter#tc_done">tc_done</seealso> event.
+ See <seealso marker="event_handler_chapter#events">Event Handling
+ </seealso> in the User's Guide for details.</p>
+ </desc>
+ </func>
+
+ <func>
+ <name>Module:on_tc_skip(TestcaseName, Reason, CTHState) -&gt;
+ NewCTHState</name>
+ <fsummary>Called after the CTH scope ends</fsummary>
+ <type>
+ <v>TestcaseName = end_per_suite | init_per_group |
+ end_per_group | atom()</v>
+ <v>Reason = {tc_auto_skip | tc_user_skip, term()}</v>
+ <v>CTHState = NewCTHState = term()</v>
+ </type>
+
+ <desc>
+ <p> OPTIONAL </p>
+
+ <p>This function is called whenever a testcase is skipped.
+ It is called after the post function has been called for the
+ testcase which was skipped.
+ i.e. if init_per_group is skipped this function is called after
+ <seealso marker="#Module:post_init_per_suite-4">post_init_per_group
+ </seealso>, and if a testcase is skipped it is called after
+ <seealso marker="#Module:post_end_per_testcase-4">post_end_per_testcase
+ </seealso>.</p>
+
+ <p>The data which comes with the Reason follows the same format as
+ <seealso marker="event_handler_chapter#tc_auto_skip">tc_auto_skip
+ </seealso> and <seealso marker="event_handler_chapter#tc_user_skip">
+ tc_user_skip</seealso> events.
+ See <seealso marker="event_handler_chapter#events">Event Handling
+ </seealso> in the User's Guide for details.</p>
+ </desc>
+ </func>
+
+ <func>
+ <name>Module:terminate(CTHState)</name>
+ <fsummary>Called after the CTH scope ends</fsummary>
+ <type>
+ <v>CTHState = term()</v>
+ </type>
+
+ <desc>
+ <p> OPTIONAL </p>
+
+ <p>This function is called at the end of a CTH's
+ <seealso marker="ct_hooks_chapter#scope">scope</seealso>.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name>Module:id(Opts) -&gt; Id</name>
+ <fsummary>Called before the init function of a CTH</fsummary>
+ <type>
+ <v>Opts = term()</v>
+ <v>Id = term()</v>
+ </type>
+
+ <desc>
+ <p> OPTIONAL </p>
+
+ <p>The <c>Id</c> is used to uniquely identify a CTH instance,
+ if two CTH's return the same <c>Id</c> the second CTH is ignored
+ and subsequent calls to the CTH will only be made to the first
+ instance. For more information see
+ <seealso marker="ct_hooks_chapter#installing">Installing a CTH
+ </seealso> in the User's Guide.
+ </p>
+
+ <p>This function should NOT have any side effects as it might
+ be called multiple times by Common Test.</p>
+
+ <p>If not implemented the CTH will act as if this function returned a
+ call to <c>make_ref/0</c>.</p>
+ </desc>
+ </func>
+
+ </funcs>
+
+</erlref>
+
+
diff --git a/lib/common_test/doc/src/ct_hooks_chapter.xml b/lib/common_test/doc/src/ct_hooks_chapter.xml
new file mode 100644
index 0000000000..fc5ab48e1b
--- /dev/null
+++ b/lib/common_test/doc/src/ct_hooks_chapter.xml
@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>2011</year><year>2011</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>Common Test Hooks</title>
+ <prepared>Lukas Larsson</prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ <file>ct_hooks_chapter.xml</file>
+ </header>
+
+ <marker id="general"></marker>
+ <section>
+ <title>General</title>
+ <warning><p>This feature is in alpha release right now. This means that the
+ interface may change in the future and that there may be bugs. We
+ encourage you to use this feature, but be prepared
+ that there might be bugs and that the interface might change
+ inbetween releases.</p></warning>
+ <p>
+ The <em>Common Test Hook</em> (henceforth called CTH) framework allows
+ extensions of the default behaviour of Common Test by means of hooks
+ before and after all test suite calls. CTHs allow advanced Common Test
+ users to abstract out behaviour which is common to multiple test suites
+ without littering all test suites with library calls. Some example
+ usages are: logging, starting and monitoring external systems,
+ building C files needed by the tests and much more!</p>
+
+ <p>In brief, Common Test Hooks allows you to:</p>
+
+ <list>
+ <item>Manipulate the runtime config before each suite
+ configuration call</item>
+ <item>Manipulate the return of all suite configuration calls and in
+ extension the result of the test themselves.</item>
+ </list>
+
+ <p>The following sections describe how to use CTHs, when they are run
+ and how to manipulate your test results in a CTH</p>
+
+ <warning><p>When executing within a CTH all timetraps are shutoff. So
+ if your CTH never returns, the entire test run will be stalled!</p>
+ </warning>
+
+ </section>
+
+ <marker id="installing"></marker>
+ <section>
+ <title>Installing a CTH</title>
+ <p>There are multiple ways to install a CTH in your test run. You can do it
+ for all tests in a run, for specific test suites and for specific groups
+ within a test suite. If you want a CTH to be present in all test suites
+ within your test run there are three different ways to accomplish that.
+ </p>
+
+ <list>
+ <item>Add <c>-ct_hooks</c> as an argument to
+ <seealso marker="run_test_chapter#ct_run">ct_run</seealso>.
+ To add multiple CTHs using this method append them to each other
+ using the keyword <c>and</c>, i.e.
+ <c>ct_run -ct_hooks cth1 [{debug,true}] and cth2 ...</c>.</item>
+ <item>Add the <c>ct_hooks</c> tag to your
+ <seealso marker="run_test_chapter#test_specifications">
+ Test Specification</seealso></item>
+ <item>Add the <c>ct_hooks</c> tag to your call to
+ <seealso marker="ct#run_test-1">ct:run_test/1</seealso></item>
+ </list>
+
+ <p>You can also add CTHs within a test suite. This is done by returning
+ <c>{ct_hooks,[CTH]}</c> in the config list from
+ <seealso marker="common_test#Module:suite-0">suite/0</seealso>,
+ <seealso marker="common_test#Module:init_per_suite-1">
+ init_per_suite/1</seealso> or
+ <seealso marker="common_test#Module:init_per_group-2">
+ init_per_group/2</seealso>. <c>CTH</c> in this case can be either
+ only the module name of the CTH or a tuple with the module name and the
+ initial arguments to the CTH. Eg:
+ <c>{ct_hooks,[my_cth_module]}</c> or
+ <c>{ct_hooks,[{my_cth_module,[{debug,true}]}]}</c></p>
+
+ <section>
+ <title>Overriding CTHs</title>
+ <p>By default each installation of a CTH will cause a new instance of it
+ to be activated. This can cause problems if you want to be able to
+ override CTHs in test specifications while still having them in the
+ suite info function. The
+ <seealso marker="ct_hooks#Module:id-1">id/1</seealso>
+ callback exists to address this problem. By returning the same
+ <c>id</c> in both places, Common Test knows that this CTH
+ has already been installed and will not try to install it again.</p>
+ </section>
+
+ </section>
+
+ <marker id="scope"/>
+ <section>
+ <title>CTH Scope</title>
+ <p>Once the CTH is installed into a certain test run it will be there until
+ its scope is expired. The scope of a CTH depends on when it is
+ installed.
+ The <seealso marker="ct_hooks#Module:init-2">init/2</seealso> is
+ called at the beginning of the scope and the
+ <seealso marker="ct_hooks#Module:terminate-1">terminate/1
+ </seealso> function is called when the scope ends.</p>
+ <table>
+ <row>
+ <cell><em>CTH Installed in</em></cell>
+ <cell><em>CTH scope begins before</em></cell>
+ <cell><em>CTH scope ends after</em></cell>
+ </row>
+ <row>
+ <cell><seealso marker="run_test_chapter#ct_run">ct_run</seealso></cell>
+ <cell>the first test suite is to be run.</cell>
+ <cell>the last test suite has been run.</cell>
+ </row>
+ <row>
+ <cell><seealso marker="ct#run_test-1">ct:run_test</seealso></cell>
+ <cell>the first test suite is to be run.</cell>
+ <cell>the last test suite has been run.</cell>
+ </row>
+ <row>
+ <cell><seealso marker="run_test_chapter#test_specifications">
+ Test Specification</seealso></cell>
+ <cell>the first test suite is to be run.</cell>
+ <cell>the last test suite has been run.</cell>
+ </row>
+ <row>
+ <cell><seealso marker="common_test#Module:suite-0">suite/0
+ </seealso></cell>
+ <cell><seealso marker="ct_hooks#Module:pre_init_per_suite-3">
+ pre_init_per_suite/3</seealso> is called.</cell>
+ <cell><seealso marker="ct_hooks#Module:post_end_per_suite-4">
+ post_end_per_suite/4</seealso> has been called for that test suite.</cell>
+ </row>
+ <row>
+ <cell><seealso marker="common_test#Module:init_per_suite-1">
+ init_per_suite/1</seealso></cell>
+ <cell><seealso marker="ct_hooks#Module:post_init_per_suite-4">
+ post_init_per_suite/4</seealso> is called.</cell>
+ <cell><seealso marker="ct_hooks#Module:post_end_per_suite-4">
+ post_end_per_suite/4</seealso> has been called for that test suite.</cell>
+ </row>
+ <row>
+ <cell><seealso marker="common_test#Module:init_per_group-2">
+ init_per_group/2</seealso></cell>
+ <cell><seealso marker="ct_hooks#Module:post_init_per_group-4">
+ post_init_per_group/4</seealso> is called.</cell>
+ <cell><seealso marker="ct_hooks#Module:post_end_per_suite-4">
+ post_end_per_group/4</seealso> has been called for that group.</cell>
+ </row>
+ <tcaption>Scope of a CTH</tcaption>
+ </table>
+
+ <section>
+ <title>CTH Processes and Tables</title>
+ <p>CTHs are run with the same process scoping as normal test suites
+ i.e. a different process will execute the init_per_suite hooks then the
+ init_per_group or per_testcase hooks. So if you want to spawn a
+ process in the CTH you cannot link with the CTH process as it will exit
+ after the post hook ends. Also if you for some reason need an ETS
+ table with your CTH, you will have to spawn a process which handles
+ it.</p>
+ </section>
+
+ </section>
+
+ <marker id="manipulating"/>
+ <section>
+ <title>Manipulating tests</title>
+ <p>It is through CTHs possible to manipulate the results of tests and
+ configuration functions. The main purpose of doing this with CTHs is to
+ allow common patterns to be abstracted out from test test suites and applied to
+ multiple test suites without duplicating any code. All of the callback
+ functions for a CTH follow a common interface, this interface is
+ described below.</p>
+
+ <p>It is only possible to hook into test function which exists in the test
+ suite. So in order for a CTH to hook in before
+ <seealso marker="common_test#Module:init_per_suite-1">init_per_suite</seealso>,
+ the <seealso marker="common_test#Module:init_per_suite-1">init_per_suite</seealso>
+ function must exist in the test suite.</p>
+
+ <marker id="pre"/>
+ <section>
+ <title>Pre Hooks</title>
+ <p>
+ It is possible in a CTH to hook in behaviour before
+ <seealso marker="common_test#Module:init_per_suite-1">init_per_suite</seealso>,
+ <seealso marker="common_test#Module:init_per_suite-1">init_per_group</seealso>,
+ <seealso marker="common_test#Module:init_per_suite-1">init_per_testcase</seealso>,
+ <seealso marker="common_test#Module:init_per_suite-1">end_per_group</seealso> and
+ <seealso marker="common_test#Module:init_per_suite-1">end_per_suite</seealso>.
+ This is done in the CTH functions called pre_&lt;name of function&gt;.
+ All of these functions take the same three arguments: <c>Name</c>,
+ <c>Config</c> and <c>CTHState</c>. The return value of the CTH function
+ is always a combination of an result for the suite/group/test and an
+ updated <c>CTHState</c>. If you want the test suite to continue on
+ executing you should return the config list which you want the test to
+ use as the result. If you for some reason want to skip/fail the test,
+ return a tuple with <c>skip</c> or <c>fail</c> and a reason as the
+ result. Example:
+ </p>
+ <code>pre_init_per_suite(SuiteName, Config, CTHState) -&gt;
+ case db:connect() of
+ {error,_Reason} -&gt;
+ {{fail, "Could not connect to DB"}, CTHState};
+ {ok, Handle} -&gt;
+ {[{db_handle, Handle} | Config], CTHState#state{ handle = Handle }}
+ end.</code>
+
+ </section>
+
+ <marker id="post"/>
+ <section>
+ <title>Post Hooks</title>
+ <p>It is also possible in a CTH to hook in behaviour after
+ <seealso marker="common_test#Module:init_per_suite-1">init_per_suite</seealso>,
+ <seealso marker="common_test#Module:init_per_suite-1">init_per_group</seealso>,
+ <seealso marker="common_test#Module:init_per_suite-1">end_per_testcase</seealso>,
+ <seealso marker="common_test#Module:init_per_suite-1">end_per_group</seealso> and
+ <seealso marker="common_test#Module:init_per_suite-1">end_per_suite</seealso>.
+ This is done in the CTH functions called post_&lt;name of function&gt;.
+ All of these function take the same four arguments: <c>Name</c>,
+ <c>Config</c>, <c>Return</c> and <c>CTHState</c>. <c>Config</c> in this
+ case is the same <c>Config</c> as the testcase is called with.
+ <c>Return</c> is the value returned by the testcase. If the testcase
+ failed by crashing, <c>Return</c> will be
+ <c>{'EXIT',{{Error,Reason},Stacktrace}}</c>.</p>
+
+ <p>The return value of the CTH function is always a combination of an
+ result for the suite/group/test and an updated <c>CTHState</c>. If
+ you want the callback to not affect the outcome of the test you should
+ return the <c>Return</c> data as it is given to the CTH. You can also
+ modify the result of the test. By returning the <c>Config</c> list
+ with the <c>tc_status</c> element removed you can recover from a test
+ failure. As in all the pre hooks, it is also possible to fail/skip
+ the test case in the post hook. Example: </p>
+
+ <code>post_end_per_testcase(_TC, Config, {'EXIT',{_,_}}, CTHState) -&gt;
+ case db:check_consistency() of
+ true ->
+ %% DB is good, pass the test.
+ {proplists:delete(tc_status, Config), CTHState};
+ false ->
+ %% DB is not good, mark as skipped instead of failing
+ {{skip, "DB is inconsisten!"}, CTHState}
+ end;
+post_end_per_testcase(_TC, Config, Return, CTHState) -&gt;
+ %% Do nothing if tc does not crash.
+ {Return, CTHState}.</code>
+
+ <note>Recovering from a testcase failure using CTHs should only be done as
+ a last resort. If used wrongly it could become very difficult to
+ determine which tests pass or fail in a test run</note>
+
+ </section>
+
+ <marker id="skip_n_fail"/>
+ <section>
+ <title>Skip and Fail hooks</title>
+ <p>
+ After any post hook has been executed for all installed CTHs,
+ <seealso marker="ct_hooks#Module:on_tc_fail-3">on_tc_fail</seealso>
+ or <seealso marker="ct_hooks#Module:on_tc_fail-3">on_tc_skip</seealso>
+ might be called if the testcase failed or was skipped
+ respectively. You cannot affect the outcome of the tests any further at
+ this point.
+ </p>
+ </section>
+
+ </section>
+
+ <marker id="example"/>
+ <section>
+ <title>Example CTH</title>
+ <p>The CTH below will log information about a test run into a format
+ parseable by <seealso marker="kernel:file#consult-1">file:consult/1</seealso>.
+ </p>
+ <code>%%% @doc Common Test Example Common Test Hook module.
+-module(example_cth).
+
+%% Callbacks
+-export([id/1]).
+-export([init/2]).
+
+-export([pre_init_per_suite/3]).
+-export([post_init_per_suite/4]).
+-export([pre_end_per_suite/3]).
+-export([post_end_per_suite/4]).
+
+-export([pre_init_per_group/3]).
+-export([post_init_per_group/4]).
+-export([pre_end_per_group/3]).
+-export([post_end_per_group/4]).
+
+-export([pre_init_per_testcase/3]).
+-export([post_end_per_testcase/4]).
+
+-export([on_tc_fail/3]).
+-export([on_tc_skip/3]).
+
+-export([terminate/1]).
+
+-record(state, { file_handle, total, suite_total, ts, tcs, data }).
+
+%% @doc Return a unique id for this CTH.
+id(Opts) ->
+ proplists:get_value(filename, Opts, "/tmp/file.log").
+
+%% @doc Always called before any other callback function. Use this to initiate
+%% any common state.
+init(Id, Opts) ->
+ {ok,D} = file:open(Id,[write]),
+ #state{ file_handle = D, total = 0, data = [] }.
+
+%% @doc Called before init_per_suite is called.
+pre_init_per_suite(Suite,Config,State) ->
+ {Config, State#state{ suite_total = 0, tcs = [] }}.
+
+%% @doc Called after init_per_suite.
+post_init_per_suite(Suite,Config,Return,State) ->
+ {Return, State}.
+
+%% @doc Called before end_per_suite.
+pre_end_per_suite(Suite,Config,State) ->
+ {Config, State}.
+
+%% @doc Called after end_per_suite.
+post_end_per_suite(Suite,Config,Return,State) ->
+ Data = {suites, Suite, State#state.suite_total, lists:reverse(State#state.tcs)},
+ {Return, State#state{ data = [Data | State#state.data] ,
+ total = State#state.total + State#state.suite_total } }.
+
+%% @doc Called before each init_per_group.
+pre_init_per_group(Group,Config,State) ->
+ {Config, State}.
+
+%% @doc Called after each init_per_group.
+post_init_per_group(Group,Config,Return,State) ->
+ {Return, State}.
+
+%% @doc Called after each end_per_group.
+pre_end_per_group(Group,Config,State) ->
+ {Config, State}.
+
+%% @doc Called after each end_per_group.
+post_end_per_group(Group,Config,Return,State) ->
+ {Return, State}.
+
+%% @doc Called before each test case.
+pre_init_per_testcase(TC,Config,State) ->
+ {Config, State#state{ ts = now(), total = State#state.suite_total + 1 } }.
+
+%% @doc Called after each test case.
+post_end_per_testcase(TC,Config,Return,State) ->
+ TCInfo = {testcase, TC, Return, timer:now_diff(now(), State#state.ts)},
+ {Return, State#state{ ts = undefined, tcs = [TCInfo | State#state.tcs] } }.
+
+%% @doc Called after post_init_per_suite, post_end_per_suite, post_init_per_group,
+%% post_end_per_group and post_end_per_testcase if the suite, group or test case failed.
+on_tc_fail(TC, Reason, State) ->
+ State.
+
+%% @doc Called when a test case is skipped by either user action
+%% or due to an init function failing.
+on_tc_skip(TC, Reason, State) ->
+ State.
+
+%% @doc Called when the scope of the CTH is done
+terminate(State) ->
+ io:format(State#state.file_handle, "~p.~n",
+ [{test_run, State#state.total, State#state.data}]),
+ file:close(State#state.file_handle),
+ ok.</code>
+ </section>
+
+</chapter>
+
+
+
+
diff --git a/lib/common_test/doc/src/ct_junit_report.xml b/lib/common_test/doc/src/ct_junit_report.xml
deleted file mode 100644
index 49a40cc1de..0000000000
--- a/lib/common_test/doc/src/ct_junit_report.xml
+++ /dev/null
@@ -1,109 +0,0 @@
-<?xml version="1.0" encoding="latin1" ?>
-<!DOCTYPE erlref SYSTEM "erlref.dtd">
-<erlref>
-<header>
-<title>ct_junit_report</title>
-<prepared></prepared>
-<responsible></responsible>
-<docno>1</docno>
-<approved></approved>
-<checked></checked>
-<date></date>
-<rev>A</rev>
-<file>ct_junit_report.xml</file></header>
-<module>ct_junit_report</module>
-<modulesummary>Common Test Framework functions handling test specifications.</modulesummary>
-<description>
-<p>Common Test Framework functions handling test specifications.</p>
-
- <p>This module creates a junit report of the test run if plugged in
- as a suite_callback.</p></description>
-<funcs>
-<func>
-<name>init(Opts) -&gt; term()
-</name>
-<fsummary> </fsummary>
-
-<desc><marker id="init-1"/>
- </desc></func>
-<func>
-<name>post_end_group(Group, Config, State) -&gt; term()
-</name>
-<fsummary> </fsummary>
-
-<desc><marker id="post_end_group-3"/>
- </desc></func>
-<func>
-<name>post_end_suite(Suite, Config, State) -&gt; term()
-</name>
-<fsummary> </fsummary>
-
-<desc><marker id="post_end_suite-3"/>
- </desc></func>
-<func>
-<name>post_end_tc(TC, Config, State) -&gt; term()
-</name>
-<fsummary> </fsummary>
-
-<desc><marker id="post_end_tc-3"/>
- </desc></func>
-<func>
-<name>post_init_group(Group, Config, State) -&gt; term()
-</name>
-<fsummary> </fsummary>
-
-<desc><marker id="post_init_group-3"/>
- </desc></func>
-<func>
-<name>post_init_suite(Suite, Config, State) -&gt; term()
-</name>
-<fsummary> </fsummary>
-
-<desc><marker id="post_init_suite-3"/>
- </desc></func>
-<func>
-<name>pre_end_group(Group, Config, State) -&gt; term()
-</name>
-<fsummary> </fsummary>
-
-<desc><marker id="pre_end_group-3"/>
- </desc></func>
-<func>
-<name>pre_end_suite(Suite, Config, State) -&gt; term()
-</name>
-<fsummary> </fsummary>
-
-<desc><marker id="pre_end_suite-3"/>
- </desc></func>
-<func>
-<name>pre_init_group(Group, Config, State) -&gt; term()
-</name>
-<fsummary> </fsummary>
-
-<desc><marker id="pre_init_group-3"/>
- </desc></func>
-<func>
-<name>pre_init_suite(Suite, Config, State) -&gt; term()
-</name>
-<fsummary> </fsummary>
-
-<desc><marker id="pre_init_suite-3"/>
- </desc></func>
-<func>
-<name>pre_init_tc(TC, Config, State) -&gt; term()
-</name>
-<fsummary> </fsummary>
-
-<desc><marker id="pre_init_tc-3"/>
- </desc></func>
-<func>
-<name>terminate(Config, State) -&gt; term()
-</name>
-<fsummary> </fsummary>
-
-<desc><marker id="terminate-2"/>
- </desc></func></funcs>
-
-<authors>
-<aname> </aname>
-<email> </email></authors></erlref> \ No newline at end of file
diff --git a/lib/common_test/doc/src/event_handler_chapter.xml b/lib/common_test/doc/src/event_handler_chapter.xml
index 904876ac46..b41b233ce6 100644
--- a/lib/common_test/doc/src/event_handler_chapter.xml
+++ b/lib/common_test/doc/src/event_handler_chapter.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2006</year><year>2010</year>
+ <year>2006</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -61,6 +61,7 @@
itself.</p>
</section>
<section>
+ <marker id="usage"></marker>
<title>Usage</title>
<p>Event handlers may be installed by means of an <c>event_handler</c>
start flag (<c>ct_run</c>) or option (<c>ct:run_test/1</c>), where the
@@ -120,6 +121,7 @@
node the event has originated from (only relevant for CT Master event handlers).
<c>data</c> is specific for the particular event.</p>
+ <marker id="events"></marker>
<p><em>General events:</em></p>
<list>
@@ -172,6 +174,7 @@
are also given.
</p></item>
+ <marker id="tc_done"/>
<item><c>#event{name = tc_done, data = {Suite,FuncOrGroup,Result}}</c>
<p><c>Suite = atom()</c>, name of the suite.</p>
<p><c>FuncOrGroup = Func | {Conf,GroupName,GroupProperties}</c></p>
@@ -181,12 +184,14 @@
(unknown if init- or end function times out).</p>
<p><c>GroupProperties = list()</c>, list of execution properties for the group.</p>
<p><c>Result = ok | {skipped,SkipReason} | {failed,FailReason}</c>, the result.</p>
+ <marker id="skipreason"/>
<p><c>SkipReason = {require_failed,RequireInfo} |
{require_failed_in_suite0,RequireInfo} |
{failed,{Suite,init_per_testcase,FailInfo}} |
UserTerm</c>,
the reason why the case has been skipped.</p>
- <p><c>FailReason = {error,FailInfo} |
+ <marker id="failreason"/>
+ <p><c>FailReason = {error,FailInfo} |
{error,{RunTimeError,StackTrace}} |
{timetrap_timeout,integer()} |
{failed,{Suite,end_per_testcase,FailInfo}}</c>, reason for failure.</p>
@@ -209,6 +214,7 @@
<c>end_per_testcase</c> for the case failed.
</p></item>
+ <marker id="tc_auto_skip"></marker>
<item><c>#event{name = tc_auto_skip, data = {Suite,Func,Reason}}</c>
<p><c>Suite = atom()</c>, the name of the suite.</p>
<p><c>Func = atom()</c>, the name of the test case or configuration function.</p>
@@ -234,7 +240,8 @@
skipped because of <c>init_per_testcase</c> failing, since that information is carried with
the <c>tc_done</c> event.
</p></item>
-
+
+ <marker id="tc_user_skip"></marker>
<item><c>#event{name = tc_user_skip, data = {Suite,TestCase,Comment}}</c>
<p><c>Suite = atom()</c>, name of the suite.</p>
<p><c>TestCase = atom()</c>, name of the test case.</p>
diff --git a/lib/common_test/doc/src/notes.xml b/lib/common_test/doc/src/notes.xml
index 2fd5dcf4f1..fef1222fcb 100644
--- a/lib/common_test/doc/src/notes.xml
+++ b/lib/common_test/doc/src/notes.xml
@@ -32,6 +32,44 @@
<file>notes.xml</file>
</header>
+<section><title>Common_Test 1.5.3</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Added an option to test specs which allow the execution
+ of tests as is, instead of doing merging of tests on the
+ same "level". See the merge_tests directive the test
+ specification documentation.</p>
+ <p>
+ Own Id: OTP-9026 Aux Id: seq11768 </p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Alpha release of Common Test Hooks (CTH). CTHs allow the
+ users of common test to abtract out common behaviours
+ from test suites in a much more elegant and flexible way
+ than was possible before. Note that the addition of this
+ feature may introduce minor changes in the undocumented
+ behaviour of the interface inbetween common_test and
+ test_server.</p>
+ <p>
+ *** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>
+ Own Id: OTP-8851</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Common_Test 1.5.2</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/common_test/doc/src/part.xml b/lib/common_test/doc/src/part.xml
index 53a4cb1bbf..3284bcadaa 100644
--- a/lib/common_test/doc/src/part.xml
+++ b/lib/common_test/doc/src/part.xml
@@ -4,7 +4,7 @@
<part xmlns:xi="http://www.w3.org/2001/XInclude">
<header>
<copyright>
- <year>2003</year><year>2009</year>
+ <year>2003</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -75,6 +75,7 @@
<xi:include href="ct_master_chapter.xml"/>
<xi:include href="event_handler_chapter.xml"/>
<xi:include href="dependencies_chapter.xml"/>
+ <xi:include href="ct_hooks_chapter.xml"/>
<xi:include href="why_test_chapter.xml"/>
</part>
diff --git a/lib/common_test/doc/src/ref_man.xml b/lib/common_test/doc/src/ref_man.xml
index d5985bb021..a9fdef7359 100644
--- a/lib/common_test/doc/src/ref_man.xml
+++ b/lib/common_test/doc/src/ref_man.xml
@@ -4,7 +4,7 @@
<application xmlns:xi="http://www.w3.org/2001/XInclude">
<header>
<copyright>
- <year>2003</year><year>2010</year>
+ <year>2003</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -76,6 +76,7 @@
<xi:include href="ct_telnet.xml"/>
<xi:include href="unix_telnet.xml"/>
<xi:include href="ct_slave.xml"/>
+ <xi:include href="ct_hooks.xml"/>
</application>
diff --git a/lib/common_test/doc/src/run_test_chapter.xml b/lib/common_test/doc/src/run_test_chapter.xml
index 94fcf6bf01..e6fb85634f 100644
--- a/lib/common_test/doc/src/run_test_chapter.xml
+++ b/lib/common_test/doc/src/run_test_chapter.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2003</year><year>2010</year>
+ <year>2003</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -105,6 +105,7 @@
RPC from a remote node.</p>
</section>
+ <marker id="ct_run"></marker>
<section>
<title>Running tests from the OS command line</title>
@@ -147,6 +148,8 @@
<seealso marker="event_handler_chapter#event_handling">event handlers</seealso>.</item>
<item><c><![CDATA[-event_handler_init <event_handlers>]]></c>, to install
<seealso marker="event_handler_chapter#event_handling">event handlers</seealso> including start arguments.</item>
+ <item><c><![CDATA[-ct_hooks <ct_hooks>]]></c>, to install
+ <seealso marker="ct_hooks_chapter#installing">Common Test Hooks</seealso> including start arguments.</item>
<item><c><![CDATA[-include]]></c>, specifies include directories (see above).</item>
<item><c><![CDATA[-no_auto_compile]]></c>, disables the automatic test suite compilation feature (see above).</item>
<item><c><![CDATA[-multiply_timetraps <n>]]></c>, extends <seealso marker="write_test_chapter#timetraps">timetrap
@@ -333,8 +336,8 @@
with <c>dir</c>.</p>
</section>
+ <marker id="test_specifications"></marker>
<section>
- <marker id="test_specifications"></marker>
<title>Using test specifications</title>
<p>The most flexible way to specify what to test, is to use a so
@@ -365,15 +368,17 @@
either one or more suites, one or more test case groups, or one
or more test cases in a group or suite.</p>
<p>An arbitrary number of test terms may be declared in sequence.
- Common Test will compile the terms into one or more tests to be
- performed in one resulting test run. Note that a term that
+ Common Test will by default compile the terms into one or more tests
+ to be performed in one resulting test run. Note that a term that
specifies a set of test cases will "swallow" one that only
specifies a subset of these cases. E.g. the result of merging
one term that specifies that all cases in suite S should be
executed, with another term specifying only test case X and Y in
S, is a test of all cases in S. However, if a term specifying
test case X and Y in S is merged with a term specifying case Z
- in S, the result is a test of X, Y and Z in S.</p>
+ in S, the result is a test of X, Y and Z in S. To disable this
+ behaviour, it is possible in test specification to set the
+ <c>merge_tests</c> term to <c>false</c>.</p>
<p>A test term can also specify one or more test suites, groups,
or test cases to be skipped. Skipped suites, groups and cases
are not executed and show up in the HTML test log files as
@@ -432,6 +437,8 @@
{userconfig, NodeRefs, {CallbackModule, ConfigStrings}}.
{alias, DirAlias, Dir}.
+
+ {merge_tests, Bool}.
{logdir, LogDir}.
{logdir, NodeRefs, LogDir}.
@@ -440,6 +447,9 @@
{event_handler, NodeRefs, EventHandlers}.
{event_handler, EventHandlers, InitArgs}.
{event_handler, NodeRefs, EventHandlers, InitArgs}.
+
+ {ct_hooks, CTHModules}.
+ {ct_hooks, NodeRefs, CTHModules}.
</pre>
<p>Test terms:</p>
<pre>
@@ -478,6 +488,9 @@
LogDir = string()
EventHandlers = atom() | [atom()]
InitArgs = [term()]
+ CTHModules = [CTHModule | {CTHModule, CTHInitArgs}]
+ CTHModule = atom()
+ CTHInitArgs = term()
DirRef = DirAlias | Dir
Suites = atom() | [atom()] | all
Suite = atom()
diff --git a/lib/common_test/doc/src/write_test_chapter.xml b/lib/common_test/doc/src/write_test_chapter.xml
index 5afec6de6a..3f9fdb7121 100644
--- a/lib/common_test/doc/src/write_test_chapter.xml
+++ b/lib/common_test/doc/src/write_test_chapter.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2003</year><year>2010</year>
+ <year>2003</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -115,6 +115,7 @@
</p>
</section>
+ <marker id="per_testcase"/>
<section>
<title>Init and end per test case</title>
@@ -166,12 +167,16 @@
returning <c>{fail,Reason}</c>, nor will it be able to save data with
<c>{save_config,Data}</c>.</p>
- <p>If <c>init_per_testcase</c> crashes, the test case itself is skipped
+ <p>If <c>init_per_testcase</c> crashes, the test case itself gets skipped
automatically (so called <em>auto skipped</em>). If <c>init_per_testcase</c>
- returns a <c>skip</c> tuple, also then will the test case be skipped (so
- called <em>user skipped</em>). In either event, the <c>end_per_testcase</c> is
- never called.
+ returns a tuple <c>{skip,Reason}</c>, also then the test case gets skipped
+ (so called <em>user skipped</em>). It is also possible, by returning a tuple
+ <c>{fail,Reason}</c> from <c>init_per_testcase</c>, to mark the test case
+ as failed without actually executing it.
</p>
+ <note><p>If <c>init_per_testcase</c> crashes, or returns <c>{skip,Reason}</c>
+ or <c>{fail,Reason}</c>, the <c>end_per_testcase</c> function is not called.
+ </p></note>
<p>If it is determined during execution of <c>end_per_testcase</c> that
the status of a successful test case should be changed to failed,
diff --git a/lib/common_test/priv/Makefile.in b/lib/common_test/priv/Makefile.in
index a6ac0f1a02..f4a0c181f9 100644
--- a/lib/common_test/priv/Makefile.in
+++ b/lib/common_test/priv/Makefile.in
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2003-2009. All Rights Reserved.
+# Copyright Ericsson AB 2003-2011. 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
diff --git a/lib/common_test/src/Makefile b/lib/common_test/src/Makefile
index 027667e6b0..84b122b5e4 100644
--- a/lib/common_test/src/Makefile
+++ b/lib/common_test/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2003-2010. All Rights Reserved.
+# Copyright Ericsson AB 2003-2011. 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
@@ -67,7 +67,9 @@ MODULES= \
ct_config \
ct_config_plain \
ct_config_xml \
- ct_slave
+ ct_slave \
+ ct_hooks\
+ ct_hooks_lock
TARGET_MODULES= $(MODULES:%=$(EBIN)/%)
diff --git a/lib/common_test/src/ct.erl b/lib/common_test/src/ct.erl
index 405dc40c8b..66da3ef742 100644
--- a/lib/common_test/src/ct.erl
+++ b/lib/common_test/src/ct.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -148,7 +148,8 @@ run(TestDirs) ->
%%% {auto_compile,Bool} | {multiply_timetraps,M} | {scale_timetraps,Bool} |
%%% {repeat,N} | {duration,DurTime} | {until,StopTime} |
%%% {force_stop,Bool} | {decrypt,DecryptKeyOrFile} |
-%%% {refresh_logs,LogDir} | {basic_html,Bool}
+%%% {refresh_logs,LogDir} | {basic_html,Bool} |
+%%% {ct_hooks, CTHs}
%%% TestDirs = [string()] | string()
%%% Suites = [string()] | string()
%%% Cases = [atom()] | atom()
@@ -176,6 +177,9 @@ run(TestDirs) ->
%%% DecryptKeyOrFile = {key,DecryptKey} | {file,DecryptFile}
%%% DecryptKey = string()
%%% DecryptFile = string()
+%%% CTHs = [CTHModule | {CTHModule, CTHInitArgs}]
+%%% CTHModule = atom()
+%%% CTHInitArgs = term()
%%% Result = [TestResult] | {error,Reason}
%%% @doc Run tests as specified by the combination of options in <code>Opts</code>.
%%% The options are the same as those used with the
@@ -857,6 +861,7 @@ remove_config(Callback, Config) ->
%%%
%%% @doc <p>Use this function to set a new timetrap for the running test case.</p>
timetrap(Time) ->
+ test_server:timetrap_cancel(),
test_server:timetrap(Time).
%%%-----------------------------------------------------------------
diff --git a/lib/common_test/src/ct_framework.erl b/lib/common_test/src/ct_framework.erl
index f2ca023cff..809616d8e3 100644
--- a/lib/common_test/src/ct_framework.erl
+++ b/lib/common_test/src/ct_framework.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -24,7 +24,7 @@
-module(ct_framework).
--export([init_tc/3, end_tc/3, get_suite/2, report/2, warn/1]).
+-export([init_tc/3, end_tc/3, end_tc/4, get_suite/2, report/2, warn/1]).
-export([error_notification/4]).
-export([overview_html_header/1]).
@@ -207,7 +207,7 @@ init_tc2(Mod,Func,SuiteInfo,MergeResult,Config,DoInit) ->
{skip,{require_failed_in_suite0,Reason}};
{error,Reason} ->
{auto_skip,{require_failed,Reason}};
- FinalConfig ->
+ {ok, FinalConfig} ->
case MergeResult of
{error,Reason} ->
%% suite0 configure finished now, report that
@@ -216,13 +216,25 @@ init_tc2(Mod,Func,SuiteInfo,MergeResult,Config,DoInit) ->
_ ->
case get('$test_server_framework_test') of
undefined ->
- FinalConfig;
+ ct_suite_init(Mod, FuncSpec, FinalConfig);
Fun ->
- Fun(init_tc, FinalConfig)
+ case Fun(init_tc, FinalConfig) of
+ NewConfig when is_list(NewConfig) ->
+ {ok,NewConfig};
+ Else ->
+ Else
+ end
end
end
end.
-
+
+ct_suite_init(Mod, Func, [Config]) when is_list(Config) ->
+ case ct_hooks:init_tc( Mod, Func, Config) of
+ NewConfig when is_list(NewConfig) ->
+ {ok, [NewConfig]};
+ Else ->
+ Else
+ end.
add_defaults(Mod,Func,FuncInfo,DoInit) ->
case (catch Mod:suite()) of
@@ -239,7 +251,9 @@ add_defaults(Mod,Func,FuncInfo,DoInit) ->
(_) -> false
end, SuiteInfo) of
true ->
- SuiteInfo1 = merge_with_suite_defaults(Mod,SuiteInfo),
+ SuiteInfoNoCTH =
+ lists:keydelete(ct_hooks,1,SuiteInfo),
+ SuiteInfo1 = merge_with_suite_defaults(Mod,SuiteInfoNoCTH),
case add_defaults1(Mod,Func,FuncInfo,SuiteInfo1,DoInit) of
Error = {error,_} -> {SuiteInfo1,Error};
MergedInfo -> {SuiteInfo1,MergedInfo}
@@ -362,6 +376,8 @@ configure([{timetrap,off}|Rest],Info,SuiteInfo,Scope,Config) ->
configure([{timetrap,Time}|Rest],Info,SuiteInfo,Scope,Config) ->
Dog = test_server:timetrap(Time),
configure(Rest,Info,SuiteInfo,Scope,[{watchdog,Dog}|Config]);
+configure([{ct_hooks, Hook} | Rest], Info, SuiteInfo, Scope, Config) ->
+ configure(Rest, Info, SuiteInfo, Scope, [{ct_hooks, Hook} | Config]);
configure([_|Rest],Info,SuiteInfo,Scope,Config) ->
configure(Rest,Info,SuiteInfo,Scope,Config);
configure([],_,_,_,Config) ->
@@ -418,14 +434,17 @@ try_set_default(Name,Key,Info,Where) ->
%%%
%%% @doc Test server framework callback, called by the test_server
%%% when a test case is finished.
-end_tc(?MODULE,error_in_suite,_) -> % bad start!
+end_tc(Mod, Fun, Args) ->
+ %% Have to keep end_tc/3 for backwards compatabilty issues
+ end_tc(Mod, Fun, Args, '$end_tc_dummy').
+end_tc(?MODULE,error_in_suite,_, _) -> % bad start!
ok;
-end_tc(Mod,Func,{TCPid,Result,[Args]}) when is_pid(TCPid) ->
- end_tc(Mod,Func,TCPid,Result,Args);
-end_tc(Mod,Func,{Result,[Args]}) ->
- end_tc(Mod,Func,self(),Result,Args).
+end_tc(Mod,Func,{TCPid,Result,[Args]}, Return) when is_pid(TCPid) ->
+ end_tc(Mod,Func,TCPid,Result,Args,Return);
+end_tc(Mod,Func,{Result,[Args]}, Return) ->
+ end_tc(Mod,Func,self(),Result,Args,Return).
-end_tc(Mod,Func,TCPid,Result,Args) ->
+end_tc(Mod,Func,TCPid,Result,Args,Return) ->
case lists:keysearch(watchdog,1,Args) of
{value,{watchdog,Dog}} -> test_server:timetrap_cancel(Dog);
false -> ok
@@ -448,8 +467,10 @@ end_tc(Mod,Func,TCPid,Result,Args) ->
{_,GroupName,_Props} = Group ->
case lists:keysearch(save_config,1,Args) of
{value,{save_config,SaveConfig}} ->
- ct_util:save_suite_data(last_saved_config,
- {Mod,{group,GroupName}},SaveConfig),
+ ct_util:save_suite_data(
+ last_saved_config,
+ {Mod,{group,GroupName}},
+ SaveConfig),
Group;
false ->
Group
@@ -466,12 +487,33 @@ end_tc(Mod,Func,TCPid,Result,Args) ->
end,
ct_util:reset_silent_connections(),
- %% send sync notification so that event handlers may print
- %% in the log file before it gets closed
- ct_event:sync_notify(#event{name=tc_done,
- node=node(),
- data={Mod,FuncSpec,tag(Result)}}),
- case Result of
+ case get('$test_server_framework_test') of
+ undefined ->
+ {FinalResult,FinalNotify} =
+ case ct_hooks:end_tc(
+ Mod, FuncSpec, Args, Result, Return) of
+ '$ct_no_change' ->
+ {ok,Result};
+ FinalResult1 ->
+ {FinalResult1,FinalResult1}
+ end,
+ % send sync notification so that event handlers may print
+ % in the log file before it gets closed
+ ct_event:sync_notify(#event{name=tc_done,
+ node=node(),
+ data={Mod,FuncSpec,
+ tag_cth(FinalNotify)}});
+ Fun ->
+ % send sync notification so that event handlers may print
+ % in the log file before it gets closed
+ ct_event:sync_notify(#event{name=tc_done,
+ node=node(),
+ data={Mod,FuncSpec,tag(Result)}}),
+ FinalResult = Fun(end_tc, Return)
+ end,
+
+
+ case FinalResult of
{skip,{sequence_failed,_,_}} ->
%% ct_logs:init_tc is never called for a skipped test case
%% in a failing sequence, so neither should end_tc
@@ -490,12 +532,7 @@ end_tc(Mod,Func,TCPid,Result,Args) ->
_ ->
ok
end,
- case get('$test_server_framework_test') of
- undefined ->
- ok;
- Fun ->
- Fun(end_tc, ok)
- end.
+ FinalResult.
%% {error,Reason} | {skip,Reason} | {timetrap_timeout,TVal} |
%% {testcase_aborted,Reason} | testcase_aborted_or_killed |
@@ -511,6 +548,21 @@ tag(E = testcase_aborted_or_killed) ->
tag(Other) ->
Other.
+tag_cth({STag,Reason}) when STag == skip; STag == skipped ->
+ {skipped,Reason};
+tag_cth({fail, Reason}) ->
+ {failed, {error,Reason}};
+tag_cth(E = {ETag,_}) when ETag == error; ETag == 'EXIT';
+ ETag == timetrap_timeout;
+ ETag == testcase_aborted ->
+ {failed,E};
+tag_cth(E = testcase_aborted_or_killed) ->
+ {failed,E};
+tag_cth(List) when is_list(List) ->
+ ok;
+tag_cth(Other) ->
+ Other.
+
%%%-----------------------------------------------------------------
%%% @spec error_notification(Mod,Func,Args,Error) -> ok
%%% Mod = atom()
@@ -584,7 +636,7 @@ error_notification(Mod,Func,_Args,{Error,Loc}) ->
[{?MODULE,error_in_suite}] ->
io:format(user, "Error in suite detected: ~s", [ErrStr]);
- unknown ->
+ R when R == unknown; R == undefined ->
io:format(user, "Error detected: ~s", [ErrStr]);
%% if a function specified by all/0 does not exist, we
@@ -685,7 +737,7 @@ get_suite(Mod, Group={conf,Props,_Init,TCs,_End}) ->
%% (and only) test case so we can report Error properly
[{?MODULE,error_in_suite,[[Error]]}];
[] ->
- {error,{invalid_group_spec,Name}};
+ [];
ConfTests ->
case lists:member(skipped, Props) of
true ->
@@ -694,12 +746,12 @@ get_suite(Mod, Group={conf,Props,_Init,TCs,_End}) ->
%% init/end functions for top groups will be executed
case catch proplists:get_value(name, element(2, hd(ConfTests))) of
Name -> % top group
- ConfTests;
+ delete_subs(ConfTests, ConfTests);
_ ->
[]
end;
false ->
- ConfTests
+ delete_subs(ConfTests, ConfTests)
end
end;
_ ->
@@ -715,10 +767,10 @@ get_suite(Mod, Name) ->
find_groups(Mod, Name, TCs, GroupDefs) ->
Found = find(Mod, Name, TCs, GroupDefs, [], GroupDefs, false),
- Trimmed = trim(Found),
- delete_subs(Trimmed, Trimmed).
+ trim(Found).
-find(Mod, all, _TCs, [{Name,Props,Tests} | Gs], Known, Defs, _) ->
+find(Mod, all, _TCs, [{Name,Props,Tests} | Gs], Known, Defs, _)
+ when is_atom(Name), is_list(Props), is_list(Tests) ->
cyclic_test(Mod, Name, Known),
[make_conf(Mod, Name, Props,
find(Mod, all, all, Tests, [Name | Known], Defs, true)) |
@@ -740,8 +792,8 @@ find(Mod, Name, TCs, [{Name,Props,Tests} | _Gs], Known, Defs, false)
find(Mod, Name, TCs, [{Name1,Props,Tests} | Gs], Known, Defs, false)
when is_atom(Name1), is_list(Props), is_list(Tests) ->
cyclic_test(Mod, Name1, Known),
- [make_conf(Mod, Name1, Props,
- find(Mod, Name, TCs, Tests, [Name1 | Known], Defs, false)) |
+ [make_conf(Mod,Name1,Props,
+ find(Mod, Name, TCs, Tests, [Name1 | Known], Defs, false)) |
find(Mod, Name, TCs, Gs, [], Defs, false)];
find(Mod, Name, _TCs, [{Name,_Props,_Tests} | _Gs], _Known, _Defs, true)
@@ -757,17 +809,31 @@ find(Mod, Name, all, [{Name1,Props,Tests} | Gs], Known, Defs, true)
find(Mod, Name, all, Tests, [Name1 | Known], Defs, true)) |
find(Mod, Name, all, Gs, [], Defs, true)];
-find(Mod, Name, TCs, [{group,Name1} | Gs], Known, Defs, Found) when is_atom(Name1) ->
+find(Mod, Name, TCs, [{group,Name1} | Gs], Known, Defs, Found)
+ when is_atom(Name1) ->
find(Mod, Name, TCs, [expand(Mod, Name1, Defs) | Gs], Known, Defs, Found);
+%% Undocumented remote group feature, use with caution
+find(Mod, Name, TCs, [{group, ExtMod, ExtGrp} | Gs], Known, Defs, true)
+ when is_atom(ExtMod), is_atom(ExtGrp) ->
+ ExternalDefs = ExtMod:groups(),
+ ExternalTCs = find(ExtMod, ExtGrp, TCs, [{group, ExtGrp}],
+ [], ExternalDefs, false),
+ ExternalTCs ++ find(Mod, Name, TCs, Gs, Known, Defs, true);
+
find(Mod, Name, TCs, [{Name1,Tests} | Gs], Known, Defs, Found)
when is_atom(Name1), is_list(Tests) ->
find(Mod, Name, TCs, [{Name1,[],Tests} | Gs], Known, Defs, Found);
-find(Mod, Name, TCs, [TC | Gs], Known, Defs, false) when is_atom(TC) ->
+find(Mod, Name, TCs, [_TC | Gs], Known, Defs, false) ->
find(Mod, Name, TCs, Gs, Known, Defs, false);
find(Mod, Name, TCs, [TC | Gs], Known, Defs, true) when is_atom(TC) ->
+ [{Mod, TC} | find(Mod, Name, TCs, Gs, Known, Defs, true)];
+
+find(Mod, Name, TCs, [{ExternalTC, Case} = TC | Gs], Known, Defs, true)
+ when is_atom(ExternalTC),
+ is_atom(Case) ->
[TC | find(Mod, Name, TCs, Gs, Known, Defs, true)];
find(Mod, _Name, _TCs, [BadTerm | _Gs], Known, _Defs, _Found) ->
@@ -787,7 +853,7 @@ find(_Mod, _Name, _TCs, [], _Known, _Defs, false) ->
find(_Mod, _Name, _TCs, [], _Known, _Defs, _Found) ->
[].
-delete_subs([Conf | Confs], All) ->
+delete_subs([{conf, _,_,_,_} = Conf | Confs], All) ->
All1 = delete_conf(Conf, All),
case is_sub(Conf, All1) of
true ->
@@ -795,7 +861,8 @@ delete_subs([Conf | Confs], All) ->
false ->
delete_subs(Confs, All)
end;
-
+delete_subs([_Else | Confs], All) ->
+ delete_subs(Confs, All);
delete_subs([], All) ->
All.
@@ -887,7 +954,9 @@ make_all_conf(Mod) ->
[] ->
{error,{invalid_group_spec,Mod}};
ConfTests ->
- [{conf,Props,Init,all,End} || {conf,Props,Init,_,End} <- ConfTests]
+ [{conf,Props,Init,all,End} ||
+ {conf,Props,Init,_,End}
+ <- delete_subs(ConfTests, ConfTests)]
end
end.
@@ -933,31 +1002,11 @@ get_all(Mod, ConfTests) ->
[{?MODULE,error_in_suite,[[{error,What}]]}];
SeqsAndTCs ->
%% expand group references in all() using ConfTests
- Expand =
- fun({group,Name}) ->
- FindConf =
- fun({conf,Props,_,_,_}) ->
- case proplists:get_value(name, Props) of
- Name -> true;
- _ -> false
- end
- end,
- case lists:filter(FindConf, ConfTests) of
- [ConfTest|_] ->
- ConfTest;
- [] ->
- E = "Invalid reference to group "++
- atom_to_list(Name)++" in "++
- atom_to_list(Mod)++":all/0",
- throw({error,list_to_atom(E)})
- end;
- (SeqOrTC) -> SeqOrTC
- end,
- case catch lists:map(Expand, SeqsAndTCs) of
+ case catch expand_groups(SeqsAndTCs, ConfTests, Mod) of
{error,_} = Error ->
[{?MODULE,error_in_suite,[[Error]]}];
Tests ->
- Tests
+ delete_subs(Tests, Tests)
end
end;
Skip = {skip,_Reason} ->
@@ -968,6 +1017,30 @@ get_all(Mod, ConfTests) ->
[{?MODULE,error_in_suite,[[{error,Reason}]]}]
end.
+expand_groups([H | T], ConfTests, Mod) ->
+ [expand_groups(H, ConfTests, Mod) | expand_groups(T, ConfTests, Mod)];
+expand_groups([], _ConfTests, _Mod) ->
+ [];
+expand_groups({group,Name}, ConfTests, Mod) ->
+ FindConf =
+ fun({conf,Props,_,_,_}) ->
+ case proplists:get_value(name, Props) of
+ Name -> true;
+ _ -> false
+ end
+ end,
+ case lists:filter(FindConf, ConfTests) of
+ [ConfTest|_] ->
+ expand_groups(ConfTest, ConfTests, Mod);
+ [] ->
+ E = "Invalid reference to group "++
+ atom_to_list(Name)++" in "++
+ atom_to_list(Mod)++":all/0",
+ throw({error,list_to_atom(E)})
+ end;
+expand_groups(SeqOrTC, _ConfTests, _Mod) ->
+ SeqOrTC.
+
%%!============================================================
%%! The support for sequences by means of using sequences/0
@@ -1084,12 +1157,14 @@ error_in_suite(Config) ->
%% if the group config functions are missing in the suite,
%% use these instead
ct_init_per_group(GroupName, Config) ->
- ct_logs:log("WARNING", "init_per_group/2 for ~w missing in suite, using default.",
+ ct_logs:log("WARNING", "init_per_group/2 for ~w missing "
+ "in suite, using default.",
[GroupName]),
Config.
ct_end_per_group(GroupName, _) ->
- ct_logs:log("WARNING", "end_per_group/2 for ~w missing in suite, using default.",
+ ct_logs:log("WARNING", "end_per_group/2 for ~w missing "
+ "in suite, using default.",
[GroupName]),
ok.
@@ -1098,6 +1173,13 @@ ct_end_per_group(GroupName, _) ->
%%% @spec report(What,Data) -> ok
report(What,Data) ->
case What of
+ loginfo ->
+ %% logfiles and direcories have been created for a test and the
+ %% top level test index page needs to be refreshed
+ TestName = filename:basename(proplists:get_value(topdir, Data), ".logs"),
+ RunDir = proplists:get_value(rundir, Data),
+ ct_logs:make_all_suites_index({TestName,RunDir}),
+ ok;
tests_start ->
case ct_util:get_testdata(cover) of
undefined ->
@@ -1137,6 +1219,18 @@ report(What,Data) ->
ok;
tc_done ->
{_Suite,Case,Result} = Data,
+ case Result of
+ {failed, _} ->
+ ct_hooks:on_tc_fail(What, Data);
+ {skipped,{failed,{_,init_per_testcase,_}}} ->
+ ct_hooks:on_tc_skip(tc_auto_skip, Data);
+ {skipped,{require_failed,_}} ->
+ ct_hooks:on_tc_skip(tc_auto_skip, Data);
+ {skipped,_} ->
+ ct_hooks:on_tc_skip(tc_user_skip, Data);
+ _Else ->
+ ok
+ end,
case {Case,Result} of
{init_per_suite,_} ->
ok;
@@ -1154,8 +1248,8 @@ report(What,Data) ->
add_to_stats(auto_skipped);
{_,{skipped,_}} ->
add_to_stats(user_skipped);
- {_,{FailOrSkip,_Reason}} ->
- add_to_stats(FailOrSkip)
+ {_,{SkipOrFail,_Reason}} ->
+ add_to_stats(SkipOrFail)
end;
tc_user_skip ->
%% test case specified as skipped in testspec
@@ -1163,6 +1257,7 @@ report(What,Data) ->
ct_event:sync_notify(#event{name=tc_user_skip,
node=node(),
data=Data}),
+ ct_hooks:on_tc_skip(What, Data),
add_to_stats(user_skipped);
tc_auto_skip ->
%% test case skipped because of error in init_per_suite
@@ -1175,6 +1270,7 @@ report(What,Data) ->
ct_event:sync_notify(#event{name=tc_auto_skip,
node=node(),
data=Data}),
+ ct_hooks:on_tc_skip(What, Data),
if Case /= end_per_suite, Case /= end_per_group ->
add_to_stats(auto_skipped);
true ->
diff --git a/lib/common_test/src/ct_hooks.erl b/lib/common_test/src/ct_hooks.erl
new file mode 100644
index 0000000000..984e04b90f
--- /dev/null
+++ b/lib/common_test/src/ct_hooks.erl
@@ -0,0 +1,312 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2004-2011. 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%
+%%
+
+%%% @doc Common Test Framework test execution control module.
+%%%
+%%% <p>This module is a proxy for calling and handling common test hooks.</p>
+
+-module(ct_hooks).
+
+%% API Exports
+-export([init/1]).
+-export([init_tc/3]).
+-export([end_tc/5]).
+-export([terminate/1]).
+-export([on_tc_skip/2]).
+-export([on_tc_fail/2]).
+
+-type proplist() :: [{atom(),term()}].
+
+%% If you change this, remember to update ct_util:look -> stop clause as well.
+-define(config_name, ct_hooks).
+
+%% -------------------------------------------------------------------------
+%% API Functions
+%% -------------------------------------------------------------------------
+
+%% @doc Called before any suites are started
+-spec init(State :: term()) -> ok |
+ {error, Reason :: term()}.
+init(Opts) ->
+ call([{Hook, call_id, undefined} || Hook <- get_new_hooks(Opts)],
+ ok, init, []).
+
+
+%% @doc Called after all suites are done.
+-spec terminate(Hooks :: term()) ->
+ ok.
+terminate(Hooks) ->
+ call([{HookId, fun call_terminate/3} || {HookId,_,_} <- Hooks],
+ ct_hooks_terminate_dummy, terminate, Hooks),
+ ok.
+
+%% @doc Called as each test case is started. This includes all configuration
+%% tests.
+-spec init_tc(Mod :: atom(), Func :: atom(), Args :: list()) ->
+ NewConfig :: proplist() |
+ {skip, Reason :: term()} |
+ {auto_skip, Reason :: term()} |
+ {fail, Reason :: term()}.
+init_tc(ct_framework, _Func, Args) ->
+ Args;
+init_tc(Mod, init_per_suite, Config) ->
+ Info = try proplists:get_value(ct_hooks, Mod:suite(),[]) of
+ List when is_list(List) ->
+ [{ct_hooks,List}];
+ CTHook when is_atom(CTHook) ->
+ [{ct_hooks,[CTHook]}]
+ catch error:undef ->
+ [{ct_hooks,[]}]
+ end,
+ call(fun call_generic/3, Config ++ Info, [pre_init_per_suite, Mod]);
+init_tc(Mod, end_per_suite, Config) ->
+ call(fun call_generic/3, Config, [pre_end_per_suite, Mod]);
+init_tc(Mod, {init_per_group, GroupName, Opts}, Config) ->
+ maybe_start_locker(Mod, GroupName, Opts),
+ call(fun call_generic/3, Config, [pre_init_per_group, GroupName]);
+init_tc(_Mod, {end_per_group, GroupName, _}, Config) ->
+ call(fun call_generic/3, Config, [pre_end_per_group, GroupName]);
+init_tc(_Mod, TC, Config) ->
+ call(fun call_generic/3, Config, [pre_init_per_testcase, TC]).
+
+%% @doc Called as each test case is completed. This includes all configuration
+%% tests.
+-spec end_tc(Mod :: atom(),
+ Func :: atom(),
+ Args :: list(),
+ Result :: term(),
+ Resturn :: term()) ->
+ NewConfig :: proplist() |
+ {skip, Reason :: term()} |
+ {auto_skip, Reason :: term()} |
+ {fail, Reason :: term()} |
+ ok | '$ct_no_change'.
+end_tc(ct_framework, _Func, _Args, Result, _Return) ->
+ Result;
+
+end_tc(Mod, init_per_suite, Config, _Result, Return) ->
+ call(fun call_generic/3, Return, [post_init_per_suite, Mod, Config],
+ '$ct_no_change');
+
+end_tc(Mod, end_per_suite, Config, Result, _Return) ->
+ call(fun call_generic/3, Result, [post_end_per_suite, Mod, Config],
+ '$ct_no_change');
+
+end_tc(_Mod, {init_per_group, GroupName, _}, Config, _Result, Return) ->
+ call(fun call_generic/3, Return, [post_init_per_group, GroupName, Config],
+ '$ct_no_change');
+
+end_tc(Mod, {end_per_group, GroupName, Opts}, Config, Result, _Return) ->
+ Res = call(fun call_generic/3, Result,
+ [post_end_per_group, GroupName, Config], '$ct_no_change'),
+ maybe_stop_locker(Mod, GroupName,Opts),
+ Res;
+
+end_tc(_Mod, TC, Config, Result, _Return) ->
+ call(fun call_generic/3, Result, [post_end_per_testcase, TC, Config],
+ '$ct_no_change').
+
+on_tc_skip(How, {Suite, Case, Reason}) ->
+ call(fun call_cleanup/3, {How, Reason}, [on_tc_skip, Suite, Case]).
+
+on_tc_fail(_How, {Suite, Case, Reason}) ->
+ call(fun call_cleanup/3, Reason, [on_tc_fail, Suite, Case]).
+
+%% -------------------------------------------------------------------------
+%% Internal Functions
+%% -------------------------------------------------------------------------
+call_id(Mod, Config, Meta) when is_atom(Mod) ->
+ call_id({Mod, []}, Config, Meta);
+call_id({Mod, Opts}, Config, Scope) ->
+ Id = catch_apply(Mod,id,[Opts], make_ref()),
+ {Config, {Id, scope(Scope), {Mod, {Id,Opts}}}}.
+
+call_init({Mod,{Id,Opts}},Config,_Meta) ->
+ NewState = Mod:init(Id, Opts),
+ {Config, {Mod, NewState}}.
+
+call_terminate({Mod, State}, _, _) ->
+ catch_apply(Mod,terminate,[State], ok),
+ {[],{Mod,State}}.
+
+call_cleanup({Mod, State}, Reason, [Function, _Suite | Args]) ->
+ NewState = catch_apply(Mod,Function, Args ++ [Reason, State],
+ State),
+ {Reason, {Mod, NewState}}.
+
+call_generic({Mod, State}, Value, [Function | Args]) ->
+ {NewValue, NewState} = catch_apply(Mod, Function, Args ++ [Value, State],
+ {Value,State}),
+ {NewValue, {Mod, NewState}}.
+
+%% Generic call function
+call(Fun, Config, Meta) ->
+ maybe_lock(),
+ Hooks = get_hooks(),
+ Res = call([{HookId,Fun} || {HookId,_, _} <- Hooks] ++
+ get_new_hooks(Config, Fun),
+ remove(?config_name,Config), Meta, Hooks),
+ maybe_unlock(),
+ Res.
+
+call(Fun, Config, Meta, NoChangeRet) when is_function(Fun) ->
+ case call(Fun,Config,Meta) of
+ Config -> NoChangeRet;
+ NewReturn -> NewReturn
+ end;
+
+call([{Hook, call_id, NextFun} | Rest], Config, Meta, Hooks) ->
+ try
+ {Config, {NewId, _, _} = NewHook} = call_id(Hook, Config, Meta),
+ {NewHooks, NewRest} =
+ case lists:keyfind(NewId, 1, Hooks) of
+ false when NextFun =:= undefined ->
+ {Hooks ++ [NewHook],
+ [{NewId, fun call_init/3} | Rest]};
+ ExistingHook when is_tuple(ExistingHook) ->
+ {Hooks, Rest};
+ _ ->
+ {Hooks ++ [NewHook],
+ [{NewId, fun call_init/3},{NewId,NextFun} | Rest]}
+ end,
+ call(NewRest, Config, Meta, NewHooks)
+ catch Error:Reason ->
+ Trace = erlang:get_stacktrace(),
+ ct_logs:log("Suite Hook","Failed to start a CTH: ~p:~p",
+ [Error,{Reason,Trace}]),
+ call([], {fail,"Failed to start CTH"
+ ", see the CT Log for details"}, Meta, Hooks)
+ end;
+call([{HookId, Fun} | Rest], Config, Meta, Hooks) ->
+ try
+ {_,Scope,ModState} = lists:keyfind(HookId, 1, Hooks),
+ {NewConf, NewHookInfo} = Fun(ModState, Config, Meta),
+ NewCalls = get_new_hooks(NewConf, Fun),
+ NewHooks = lists:keyreplace(HookId, 1, Hooks, {HookId, Scope, NewHookInfo}),
+ call(NewCalls ++ Rest, remove(?config_name, NewConf), Meta,
+ terminate_if_scope_ends(HookId, Meta, NewHooks))
+ catch throw:{error_in_cth_call,Reason} ->
+ call(Rest, {fail, Reason}, Meta,
+ terminate_if_scope_ends(HookId, Meta, Hooks))
+ end;
+call([], Config, _Meta, Hooks) ->
+ save_suite_data_async(Hooks),
+ Config.
+
+remove(Key,List) when is_list(List) ->
+ [Conf || Conf <- List, is_tuple(Conf) =:= false
+ orelse element(1, Conf) =/= Key];
+remove(_, Else) ->
+ Else.
+
+%% Translate scopes, i.e. init_per_group,group1 -> end_per_group,group1 etc
+scope([pre_init_per_testcase, TC|_]) ->
+ [post_end_per_testcase, TC];
+scope([pre_init_per_group, GroupName|_]) ->
+ [post_end_per_group, GroupName];
+scope([post_init_per_group, GroupName|_]) ->
+ [post_end_per_group, GroupName];
+scope([pre_init_per_suite, SuiteName|_]) ->
+ [post_end_per_suite, SuiteName];
+scope([post_init_per_suite, SuiteName|_]) ->
+ [post_end_per_suite, SuiteName];
+scope(init) ->
+ none.
+
+terminate_if_scope_ends(HookId, [on_tc_skip,_Suite,{end_per_group,Name}],
+ Hooks) ->
+ terminate_if_scope_ends(HookId, [post_end_per_group, Name], Hooks);
+terminate_if_scope_ends(HookId, [on_tc_skip,Suite,end_per_suite], Hooks) ->
+ terminate_if_scope_ends(HookId, [post_end_per_suite, Suite], Hooks);
+terminate_if_scope_ends(HookId, [Function,Tag|T], Hooks) when T =/= [] ->
+ terminate_if_scope_ends(HookId,[Function,Tag],Hooks);
+terminate_if_scope_ends(HookId, Function, Hooks) ->
+ case lists:keyfind(HookId, 1, Hooks) of
+ {HookId, Function, _ModState} = Hook ->
+ terminate([Hook]),
+ lists:keydelete(HookId, 1, Hooks);
+ _ ->
+ Hooks
+ end.
+
+%% Fetch hook functions
+get_new_hooks(Config, Fun) ->
+ lists:foldl(fun(NewHook, Acc) ->
+ [{NewHook, call_id, Fun} | Acc]
+ end, [], get_new_hooks(Config)).
+
+get_new_hooks(Config) when is_list(Config) ->
+ lists:flatmap(fun({?config_name, HookConfigs}) ->
+ HookConfigs;
+ (_) ->
+ []
+ end, Config);
+get_new_hooks(_Config) ->
+ [].
+
+save_suite_data_async(Hooks) ->
+ ct_util:save_suite_data_async(?config_name, Hooks).
+
+get_hooks() ->
+ ct_util:read_suite_data(?config_name).
+
+catch_apply(M,F,A, Default) ->
+ try
+ apply(M,F,A)
+ catch error:Reason ->
+ case erlang:get_stacktrace() of
+ %% Return the default if it was the CTH module which did not have the function.
+ [{M,F,A}|_] when Reason == undef ->
+ Default;
+ Trace ->
+ ct_logs:log("Suite Hook","Call to CTH failed: ~p:~p",
+ [error,{Reason,Trace}]),
+ throw({error_in_cth_call,
+ lists:flatten(
+ io_lib:format("~p:~p/~p CTH call failed",
+ [M,F,length(A)]))})
+ end
+ end.
+
+
+%% We need to lock around the state for parallel groups only. This is because
+%% we will get several processes reading and writing the state for a single
+%% cth at the same time.
+maybe_start_locker(Mod,GroupName,Opts) ->
+ case lists:member(parallel,Opts) of
+ true ->
+ {ok, _Pid} = ct_hooks_lock:start({Mod,GroupName});
+ false ->
+ ok
+ end.
+
+maybe_stop_locker(Mod,GroupName,Opts) ->
+ case lists:member(parallel,Opts) of
+ true ->
+ stopped = ct_hooks_lock:stop({Mod,GroupName});
+ false ->
+ ok
+ end.
+
+
+maybe_lock() ->
+ locked = ct_hooks_lock:request().
+
+maybe_unlock() ->
+ unlocked = ct_hooks_lock:release().
diff --git a/lib/common_test/src/ct_hooks_lock.erl b/lib/common_test/src/ct_hooks_lock.erl
new file mode 100644
index 0000000000..e33fa278dc
--- /dev/null
+++ b/lib/common_test/src/ct_hooks_lock.erl
@@ -0,0 +1,132 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2004-2011. 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%
+%%
+
+%%% @doc Common Test Framework test execution control module.
+%%%
+%%% <p>This module is a proxy for calling and handling locks in
+%%% common test hooks.</p>
+
+-module(ct_hooks_lock).
+
+-behaviour(gen_server).
+
+%% API
+-export([start/1, stop/1, request/0, release/0]).
+
+%% gen_server callbacks
+-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
+ terminate/2, code_change/3]).
+
+-define(SERVER, ?MODULE).
+
+-record(state, { id, locked = false, requests = [] }).
+
+%%%===================================================================
+%%% API
+%%%===================================================================
+
+%% @doc Starts the server
+start(Id) ->
+ case gen_server:start({local, ?SERVER}, ?MODULE, Id, []) of
+ {error,{already_started, Pid}} ->
+ {ok,Pid};
+ Else ->
+ Else
+ end.
+
+stop(Id) ->
+ try
+ gen_server:call(?SERVER, {stop,Id})
+ catch exit:{noproc,_} ->
+ stopped
+ end.
+
+request() ->
+ try
+ gen_server:call(?SERVER,{request,self()},infinity)
+ catch exit:{noproc,_} ->
+ locked
+ end.
+
+release() ->
+ try
+ gen_server:call(?SERVER,{release,self()})
+ catch exit:{noproc,_} ->
+ unlocked
+ end.
+
+%%%===================================================================
+%%% gen_server callbacks
+%%%===================================================================
+
+%% @doc Initiates the server
+init(Id) ->
+ {ok, #state{ id = Id }}.
+
+%% @doc Handling call messages
+handle_call({stop,Id}, _From, #state{ id = Id, requests = Reqs } = State) ->
+ [gen_server:reply(Req, locker_stopped) || {Req,_ReqId} <- Reqs],
+ {stop, normal, stopped, State};
+handle_call({stop,_Id}, _From, State) ->
+ {reply, stopped, State};
+handle_call({request, Pid}, _From, #state{ locked = false,
+ requests = [] } = State) ->
+ Ref = monitor(process, Pid),
+ {reply, locked, State#state{ locked = {true, Pid, Ref}} };
+handle_call({request, Pid}, From, #state{ requests = Reqs } = State) ->
+ {noreply, State#state{ requests = Reqs ++ [{From,Pid}] }};
+handle_call({release, Pid}, _From, #state{ locked = {true, Pid, Ref},
+ requests = []} = State) ->
+ demonitor(Ref,[flush]),
+ {reply, unlocked, State#state{ locked = false }};
+handle_call({release, Pid}, _From,
+ #state{ locked = {true, Pid, Ref},
+ requests = [{NextFrom,NextPid}|Rest]} = State) ->
+ demonitor(Ref,[flush]),
+ gen_server:reply(NextFrom,locked),
+ NextRef = monitor(process, NextPid),
+ {reply,unlocked,State#state{ locked = {true, NextPid, NextRef},
+ requests = Rest } };
+handle_call({release, _Pid}, _From, State) ->
+ {reply, not_locked, State}.
+
+%% @doc Handling cast messages
+handle_cast(_Msg, State) ->
+ {noreply, State}.
+
+%% @doc Handling all non call/cast messages
+handle_info({'DOWN',Ref,process,Pid,_},
+ #state{ locked = {true, Pid, Ref},
+ requests = [{NextFrom,NextPid}|Rest] } = State) ->
+ gen_server:reply(NextFrom, locked),
+ NextRef = monitor(process, NextPid),
+ {noreply,State#state{ locked = {true, NextPid, NextRef},
+ requests = Rest } }.
+
+%% @doc This function is called by a gen_server when it is about to terminate.
+terminate(_Reason, _State) ->
+ ok.
+
+%% @doc Convert process state when code is changed
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
+
+%% -------------------------------------------------------------------------
+%% Internal Functions
+%% -------------------------------------------------------------------------
diff --git a/lib/common_test/src/ct_logs.erl b/lib/common_test/src/ct_logs.erl
index f8ace73cbf..ba4adb8683 100644
--- a/lib/common_test/src/ct_logs.erl
+++ b/lib/common_test/src/ct_logs.erl
@@ -97,11 +97,11 @@ logdir_node_prefix() ->
logdir_prefix()++"."++atom_to_list(node()).
%%%-----------------------------------------------------------------
-%%% @spec close(How) -> ok
+%%% @spec close(Info) -> ok
%%%
%%% @doc Create index pages with test results and close the CT Log
%%% (tool-internal use only).
-close(How) ->
+close(Info) ->
make_last_run_index(),
ct_event:notify(#event{name=stop_logging,node=node(),data=[]}),
@@ -118,7 +118,7 @@ close(How) ->
ok
end,
- if How == clean ->
+ if Info == clean ->
case cleanup() of
ok ->
ok;
@@ -427,8 +427,8 @@ logger(Parent,Mode) ->
file:make_dir(Dir),
ct_event:notify(#event{name=start_logging,node=node(),
data=?abs(Dir)}),
- make_all_suites_index(start),
make_all_runs_index(start),
+ make_all_suites_index(start),
case Mode of
interactive -> interactive_link();
_ -> ok
@@ -796,24 +796,29 @@ make_one_index_entry(SuiteName, LogDir, Label, All, Missing) ->
{Succ,Fail,UserSkip,AutoSkip} ->
NotBuilt = not_built(SuiteName, LogDir, All, Missing),
NewResult = make_one_index_entry1(SuiteName, LogDir, Label, Succ, Fail,
- UserSkip, AutoSkip, NotBuilt, All),
+ UserSkip, AutoSkip, NotBuilt, All,
+ normal),
{NewResult,Succ,Fail,UserSkip,AutoSkip,NotBuilt};
error ->
error
end.
make_one_index_entry1(SuiteName, Link, Label, Success, Fail, UserSkip, AutoSkip,
- NotBuilt, All) ->
+ NotBuilt, All, Mode) ->
LogFile = filename:join(Link, ?suitelog_name ++ ".html"),
- CrashDumpName = SuiteName ++ "_erl_crash.dump",
- CrashDumpLink =
- case filelib:is_file(CrashDumpName) of
- true ->
- ["&nbsp;<A HREF=\"", CrashDumpName,
- "\">(CrashDump)</A>"];
- false ->
- ""
- end,
+ CrashDumpLink = case Mode of
+ cached ->
+ "";
+ normal ->
+ CrashDumpName = SuiteName ++ "_erl_crash.dump",
+ case filelib:is_file(CrashDumpName) of
+ true ->
+ ["&nbsp;<A HREF=\"", CrashDumpName,
+ "\">(CrashDump)</A>"];
+ false ->
+ ""
+ end
+ end,
{Lbl,Timestamp,Node,AllInfo} =
case All of
{true,OldRuns} ->
@@ -975,9 +980,13 @@ index_header(Label, StartTime) ->
"<th>Missing<br>Suites</th>\n"
"\n"]].
+
all_suites_index_header() ->
{ok,Cwd} = file:get_cwd(),
- LogDir = filename:basename(Cwd),
+ all_suites_index_header(Cwd).
+
+all_suites_index_header(IndexDir) ->
+ LogDir = filename:basename(IndexDir),
AllRuns = "All test runs in \"" ++ LogDir ++ "\"",
[header("Test Results") |
["<CENTER>\n",
@@ -1414,15 +1423,72 @@ timestamp(Dir) ->
[S,Min,H,D,M,Y] = [list_to_integer(N) || N <- lists:sublist(TsR,6)],
format_time({{Y,M,D},{H,Min,S}}).
-make_all_suites_index(When) ->
+%% ----------------------------- NOTE --------------------------------------
+%% The top level index file is generated based on the file contents under
+%% logdir. This takes place initially when the test run starts (When = start)
+%% and an update takes place at the end of the test run, or when the user
+%% requests an explicit refresh (When = refresh).
+%% The index file needs to be updated also at the start of each individual
+%% test (in order for the user to be able to track test progress by refreshing
+%% the browser). Since it would be too expensive to generate a new file from
+%% scratch every time (by reading the data from disk), a copy of the dir tree
+%% is cached as a result of the first index file creation. This copy is then
+%% used for all top level index page updates that occur during the test run.
+%% This means that any changes to the dir tree under logdir during the test
+%% run will not show until after the final refresh.
+%% -------------------------------------------------------------------------
+
+%% Creates the top level index file. When == start | refresh.
+%% A copy of the dir tree under logdir is cached as a result.
+make_all_suites_index(When) when is_atom(When) ->
AbsIndexName = ?abs(?index_name),
notify_and_lock_file(AbsIndexName),
LogDirs = filelib:wildcard(logdir_prefix()++".*/*"++?logdir_ext),
- Sorted = sort_logdirs(LogDirs,[]),
- Result = make_all_suites_index1(When,Sorted),
+ Sorted = sort_logdirs(LogDirs, []),
+ Result = make_all_suites_index1(When, AbsIndexName, Sorted),
notify_and_unlock_file(AbsIndexName),
- Result.
-
+ Result;
+
+%% This updates the top level index file using cached data from
+%% the initial index file creation.
+make_all_suites_index(NewTestData = {_TestName,DirName}) ->
+ %% AllLogDirs = [{TestName,Label,Missing,{LastLogDir,Summary},OldDirs}|...]
+ {AbsIndexName,LogDirData} = ct_util:get_testdata(test_index),
+
+ CtRunDirPos = length(filename:split(AbsIndexName)),
+ CtRunDir = filename:join(lists:sublist(filename:split(DirName),
+ CtRunDirPos)),
+
+ Label = case read_totals_file(filename:join(CtRunDir, ?totals_name)) of
+ {_,"-",_,_} -> "...";
+ {_,Lbl,_,_} -> Lbl;
+ _ -> "..."
+ end,
+ notify_and_lock_file(AbsIndexName),
+ Result =
+ case catch make_all_suites_ix_cached(AbsIndexName,
+ NewTestData,
+ Label,
+ LogDirData) of
+ {'EXIT',Reason} ->
+ io:put_chars("CRASHED while updating " ++ AbsIndexName ++ "!\n"),
+ io:format("~p~n", [Reason]),
+ {error,Reason};
+ {error,Reason} ->
+ io:put_chars("FAILED while updating " ++ AbsIndexName ++ "\n"),
+ io:format("~p~n", [Reason]),
+ {error,Reason};
+ ok ->
+ ok;
+ Err ->
+ io:format("Unknown internal error while updating ~s. "
+ "Please report.\n(Err: ~p, ID: 1)",
+ [AbsIndexName,Err]),
+ {error, Err}
+ end,
+ notify_and_unlock_file(AbsIndexName),
+ Result.
+
sort_logdirs([Dir|Dirs],Groups) ->
TestName = filename:rootname(filename:basename(Dir)),
case filelib:wildcard(filename:join(Dir,"run.*")) of
@@ -1448,13 +1514,12 @@ sort_each_group([{Test,IxDirs}|Groups]) ->
sort_each_group([]) ->
[].
-make_all_suites_index1(When,AllSuitesLogDirs) ->
+make_all_suites_index1(When, AbsIndexName, AllLogDirs) ->
IndexName = ?index_name,
- AbsIndexName = ?abs(IndexName),
if When == start -> ok;
true -> io:put_chars("Updating " ++ AbsIndexName ++ "... ")
end,
- case catch make_all_suites_index2(IndexName,AllSuitesLogDirs) of
+ case catch make_all_suites_index2(IndexName, AllLogDirs) of
{'EXIT', Reason} ->
io:put_chars("CRASHED while updating " ++ AbsIndexName ++ "!\n"),
io:format("~p~n", [Reason]),
@@ -1463,11 +1528,16 @@ make_all_suites_index1(When,AllSuitesLogDirs) ->
io:put_chars("FAILED while updating " ++ AbsIndexName ++ "\n"),
io:format("~p~n", [Reason]),
{error, Reason};
- ok ->
- if When == start -> ok;
- true -> io:put_chars("done\n")
- end,
- ok;
+ {ok,CacheData} ->
+ case When of
+ start ->
+ ct_util:set_testdata_async({test_index,{AbsIndexName,
+ CacheData}}),
+ ok;
+ _ ->
+ io:put_chars("done\n"),
+ ok
+ end;
Err ->
io:format("Unknown internal error while updating ~s. "
"Please report.\n(Err: ~p, ID: 1)",
@@ -1475,56 +1545,124 @@ make_all_suites_index1(When,AllSuitesLogDirs) ->
{error, Err}
end.
-make_all_suites_index2(IndexName,AllSuitesLogDirs) ->
- {ok,Index0,_Totals} = make_all_suites_index3(AllSuitesLogDirs,
- all_suites_index_header(),
- 0, 0, 0, 0, 0, []),
+make_all_suites_index2(IndexName, AllTestLogDirs) ->
+ {ok,Index0,_Totals,CacheData} =
+ make_all_suites_index3(AllTestLogDirs,
+ all_suites_index_header(),
+ 0, 0, 0, 0, 0, [], []),
Index = [Index0|index_footer()],
case force_write_file(IndexName, Index) of
ok ->
- ok;
+ {ok,CacheData};
{error, Reason} ->
{error,{index_write_error, Reason}}
end.
-make_all_suites_index3([{SuiteName,[LastLogDir|OldDirs]}|Rest],
+make_all_suites_index3([{TestName,[LastLogDir|OldDirs]}|Rest],
Result, TotSucc, TotFail, UserSkip, AutoSkip, TotNotBuilt,
- Labels) ->
+ Labels, CacheData) ->
[EntryDir|_] = filename:split(LastLogDir),
Missing =
- case file:read_file(filename:join(EntryDir,?missing_suites_info)) of
+ case file:read_file(filename:join(EntryDir, ?missing_suites_info)) of
{ok,Bin} -> binary_to_term(Bin);
_ -> []
end,
{Label,Labels1} =
case proplists:get_value(EntryDir, Labels) of
undefined ->
- case read_totals_file(filename:join(EntryDir,?totals_name)) of
+ case read_totals_file(filename:join(EntryDir, ?totals_name)) of
{_,Lbl,_,_} -> {Lbl,[{EntryDir,Lbl}|Labels]};
_ -> {"-",[{EntryDir,"-"}|Labels]}
end;
Lbl ->
{Lbl,Labels}
end,
- case make_one_index_entry(SuiteName, LastLogDir, Label, {true,OldDirs}, Missing) of
+ case make_one_index_entry(TestName, LastLogDir, Label, {true,OldDirs}, Missing) of
{Result1,Succ,Fail,USkip,ASkip,NotBuilt} ->
%% for backwards compatibility
AutoSkip1 = case catch AutoSkip+ASkip of
{'EXIT',_} -> undefined;
Res -> Res
end,
+ IxEntry = {TestName,Label,Missing,
+ {LastLogDir,{Succ,Fail,USkip,ASkip}},OldDirs},
make_all_suites_index3(Rest, [Result|Result1], TotSucc+Succ,
TotFail+Fail, UserSkip+USkip, AutoSkip1,
- TotNotBuilt+NotBuilt,Labels1);
+ TotNotBuilt+NotBuilt, Labels1,
+ [IxEntry|CacheData]);
error ->
+ IxEntry = {TestName,Label,Missing,{LastLogDir,error},OldDirs},
make_all_suites_index3(Rest, Result, TotSucc, TotFail,
- UserSkip, AutoSkip, TotNotBuilt,Labels1)
+ UserSkip, AutoSkip, TotNotBuilt, Labels1,
+ [IxEntry|CacheData])
end;
make_all_suites_index3([], Result, TotSucc, TotFail, UserSkip, AutoSkip,
- TotNotBuilt,_) ->
+ TotNotBuilt, _, CacheData) ->
{ok, [Result|total_row(TotSucc, TotFail, UserSkip, AutoSkip, TotNotBuilt,true)],
- {TotSucc,TotFail,UserSkip,AutoSkip,TotNotBuilt}}.
+ {TotSucc,TotFail,UserSkip,AutoSkip,TotNotBuilt}, lists:reverse(CacheData)}.
+
+
+make_all_suites_ix_cached(AbsIndexName, NewTestData, Label, AllTestLogDirs) ->
+ AllTestLogDirs1 = insert_new_test_data(NewTestData, Label, AllTestLogDirs),
+ IndexDir = filename:dirname(AbsIndexName),
+ Index0 = make_all_suites_ix_cached1(AllTestLogDirs1,
+ all_suites_index_header(IndexDir),
+ 0, 0, 0, 0, 0),
+ Index = [Index0|index_footer()],
+ case force_write_file(AbsIndexName, Index) of
+ ok ->
+ ok;
+ {error, Reason} ->
+ {error,{index_write_error, Reason}}
+ end.
+
+insert_new_test_data({NewTestName,NewTestDir}, NewLabel, AllTestLogDirs) ->
+ AllTestLogDirs1 =
+ case lists:keysearch(NewTestName, 1, AllTestLogDirs) of
+ {value,{_,_,_,{LastLogDir,_},OldDirs}} ->
+ [{NewTestName,NewLabel,[],{NewTestDir,{0,0,0,0}},
+ [LastLogDir|OldDirs]} |
+ lists:keydelete(NewTestName, 1, AllTestLogDirs)];
+ false ->
+ [{NewTestName,NewLabel,[],{NewTestDir,{0,0,0,0}},[]} |
+ AllTestLogDirs]
+ end,
+ lists:keysort(1, AllTestLogDirs1).
+
+make_all_suites_ix_cached1([{TestName,Label,Missing,LastLogDirData,OldDirs}|Rest],
+ Result, TotSucc, TotFail, UserSkip, AutoSkip,
+ TotNotBuilt) ->
+ case make_one_ix_entry_cached(TestName, LastLogDirData,
+ Label, {true,OldDirs}, Missing) of
+ {Result1,Succ,Fail,USkip,ASkip,NotBuilt} ->
+ %% for backwards compatibility
+ AutoSkip1 = case catch AutoSkip+ASkip of
+ {'EXIT',_} -> undefined;
+ Res -> Res
+ end,
+ make_all_suites_ix_cached1(Rest, [Result|Result1], TotSucc+Succ,
+ TotFail+Fail, UserSkip+USkip, AutoSkip1,
+ TotNotBuilt+NotBuilt);
+ error ->
+ make_all_suites_ix_cached1(Rest, Result, TotSucc, TotFail,
+ UserSkip, AutoSkip, TotNotBuilt)
+ end;
+make_all_suites_ix_cached1([], Result, TotSucc, TotFail, UserSkip, AutoSkip,
+ TotNotBuilt) ->
+ [Result|total_row(TotSucc, TotFail, UserSkip, AutoSkip, TotNotBuilt, true)].
+
+make_one_ix_entry_cached(TestName, {LogDir,Summary}, Label, All, Missing) ->
+ case Summary of
+ {Succ,Fail,UserSkip,AutoSkip} ->
+ NotBuilt = not_built(TestName, LogDir, All, Missing),
+ NewResult = make_one_index_entry1(TestName, LogDir, Label,
+ Succ, Fail, UserSkip, AutoSkip,
+ NotBuilt, All, cached),
+ {NewResult,Succ,Fail,UserSkip,AutoSkip,NotBuilt};
+ error ->
+ error
+ end.
%%-----------------------------------------------------------------
%% Remove log files.
diff --git a/lib/common_test/src/ct_run.erl b/lib/common_test/src/ct_run.erl
index d0e6ba5fa6..c01e97b358 100644
--- a/lib/common_test/src/ct_run.erl
+++ b/lib/common_test/src/ct_run.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -54,6 +54,7 @@
logdir,
config = [],
event_handlers = [],
+ ct_hooks = [],
include = [],
silent_connections,
stylesheet,
@@ -171,6 +172,7 @@ script_start1(Parent, Args) ->
([]) -> true
end, false, Args),
EvHandlers = event_handler_args2opts(Args),
+ CTHooks = ct_hooks_args2opts(Args),
%% check flags and set corresponding application env variables
@@ -234,6 +236,7 @@ script_start1(Parent, Args) ->
StartOpts = #opts{label = Label, vts = Vts, shell = Shell, cover = Cover,
logdir = LogDir, event_handlers = EvHandlers,
+ ct_hooks = CTHooks,
include = IncludeDirs,
silent_connections = SilentConns,
stylesheet = Stylesheet,
@@ -259,15 +262,15 @@ run_or_refresh(StartOpts = #opts{logdir = LogDir}, Args) ->
%% give the shell time to print version etc
timer:sleep(500),
io:nl(),
- case catch ct_logs:make_all_suites_index(refresh) of
- {'EXIT',ASReason} ->
+ case catch ct_logs:make_all_runs_index(refresh) of
+ {'EXIT',ARReason} ->
file:set_cwd(Cwd),
- {error,{all_suites_index,ASReason}};
+ {error,{all_runs_index,ARReason}};
_ ->
- case catch ct_logs:make_all_runs_index(refresh) of
- {'EXIT',ARReason} ->
+ case catch ct_logs:make_all_suites_index(refresh) of
+ {'EXIT',ASReason} ->
file:set_cwd(Cwd),
- {error,{all_runs_index,ARReason}};
+ {error,{all_suites_index,ASReason}};
_ ->
file:set_cwd(Cwd),
io:format("Logs in ~s refreshed!~n~n", [LogDir1]),
@@ -305,6 +308,10 @@ script_start2(StartOpts = #opts{vts = undefined,
SpecStartOpts#opts.scale_timetraps),
AllEvHs = merge_vals([StartOpts#opts.event_handlers,
SpecStartOpts#opts.event_handlers]),
+ AllCTHooks = merge_vals(
+ [StartOpts#opts.ct_hooks,
+ SpecStartOpts#opts.ct_hooks]),
+
AllInclude = merge_vals([StartOpts#opts.include,
SpecStartOpts#opts.include]),
application:set_env(common_test, include, AllInclude),
@@ -315,6 +322,7 @@ script_start2(StartOpts = #opts{vts = undefined,
logdir = LogDir,
config = SpecStartOpts#opts.config,
event_handlers = AllEvHs,
+ ct_hooks = AllCTHooks,
include = AllInclude,
multiply_timetraps = MultTT,
scale_timetraps = ScaleTT}}
@@ -332,7 +340,8 @@ script_start2(StartOpts = #opts{vts = undefined,
{error,no_testspec_specified};
{undefined,_} -> % no testspec used
case check_and_install_configfiles(InitConfig, TheLogDir,
- Opts#opts.event_handlers) of
+ Opts#opts.event_handlers,
+ Opts#opts.ct_hooks) of
ok -> % go on read tests from start flags
script_start3(Opts#opts{config=InitConfig,
logdir=TheLogDir}, Args);
@@ -343,7 +352,8 @@ script_start2(StartOpts = #opts{vts = undefined,
%% merge config from start flags with config from testspec
AllConfig = merge_vals([InitConfig, Opts#opts.config]),
case check_and_install_configfiles(AllConfig, TheLogDir,
- Opts#opts.event_handlers) of
+ Opts#opts.event_handlers,
+ Opts#opts.ct_hooks) of
ok -> % read tests from spec
{Run,Skip} = ct_testspec:prepare_tests(Terms, node()),
do_run(Run, Skip, Opts#opts{config=AllConfig,
@@ -358,7 +368,8 @@ script_start2(StartOpts, Args) ->
InitConfig = ct_config:prepare_config_list(Args),
LogDir = which(logdir, StartOpts#opts.logdir),
case check_and_install_configfiles(InitConfig, LogDir,
- StartOpts#opts.event_handlers) of
+ StartOpts#opts.event_handlers,
+ StartOpts#opts.ct_hooks) of
ok -> % go on read tests from start flags
script_start3(StartOpts#opts{config=InitConfig,
logdir=LogDir}, Args);
@@ -366,11 +377,12 @@ script_start2(StartOpts, Args) ->
Error
end.
-check_and_install_configfiles(Configs, LogDir, EvHandlers) ->
+check_and_install_configfiles(Configs, LogDir, EvHandlers, CTHooks) ->
case ct_config:check_config_files(Configs) of
false ->
install([{config,Configs},
- {event_handler,EvHandlers}], LogDir);
+ {event_handler,EvHandlers},
+ {ct_hooks,CTHooks}], LogDir);
{value,{error,{nofile,File}}} ->
{error,{cant_read_config_file,File}};
{value,{error,{wrong_config,Message}}}->
@@ -438,11 +450,13 @@ script_start4(#opts{vts = true, config = Config, event_handlers = EvHandlers,
script_start4(#opts{label = Label, shell = true, config = Config,
event_handlers = EvHandlers,
+ ct_hooks = CTHooks,
logdir = LogDir, testspecs = Specs}, _Args) ->
%% label - used by ct_logs
application:set_env(common_test, test_label, Label),
- InstallOpts = [{config,Config},{event_handler,EvHandlers}],
+ InstallOpts = [{config,Config},{event_handler,EvHandlers},
+ {ct_hooks, CTHooks}],
if Config == [] ->
ok;
true ->
@@ -508,6 +522,7 @@ script_usage() ->
"\n\t[-stylesheet CSSFile]"
"\n\t[-cover CoverCfgFile]"
"\n\t[-event_handler EvHandler1 EvHandler2 .. EvHandlerN]"
+ "\n\t[-ct_hooks CTHook1 CTHook2 .. CTHookN]"
"\n\t[-include InclDir1 InclDir2 .. InclDirN]"
"\n\t[-no_auto_compile]"
"\n\t[-multiply_timetraps N]"
@@ -526,6 +541,7 @@ script_usage() ->
"\n\t[-stylesheet CSSFile]"
"\n\t[-cover CoverCfgFile]"
"\n\t[-event_handler EvHandler1 EvHandler2 .. EvHandlerN]"
+ "\n\t[-ct_hooks CTHook1 CTHook2 .. CTHookN]"
"\n\t[-include InclDir1 InclDir2 .. InclDirN]"
"\n\t[-no_auto_compile]"
"\n\t[-multiply_timetraps N]"
@@ -664,6 +680,9 @@ run_test1(StartOpts) ->
end, Hs))
end,
+ %% CT Hooks
+ CTHooks = get_start_opt(ct_hooks, value, [], StartOpts),
+
%% silent connections
SilentConns = get_start_opt(silent_connections,
fun(all) -> [];
@@ -733,7 +752,9 @@ run_test1(StartOpts) ->
Opts = #opts{label = Label,
cover = Cover, step = Step, logdir = LogDir, config = CfgFiles,
- event_handlers = EvHandlers, include = Include,
+ event_handlers = EvHandlers,
+ ct_hooks = CTHooks,
+ include = Include,
silent_connections = SilentConns,
stylesheet = Stylesheet,
multiply_timetraps = MultiplyTT,
@@ -784,11 +805,16 @@ run_spec_file(Relaxed,
SpecOpts#opts.event_handlers]),
AllInclude = merge_vals([Opts#opts.include,
SpecOpts#opts.include]),
+
+ AllCTHooks = merge_vals([Opts#opts.ct_hooks,
+ SpecOpts#opts.ct_hooks]),
+
application:set_env(common_test, include, AllInclude),
case check_and_install_configfiles(AllConfig,
which(logdir,LogDir),
- AllEvHs) of
+ AllEvHs,
+ AllCTHooks) of
ok ->
Opts1 = Opts#opts{label = Label,
cover = Cover,
@@ -798,7 +824,8 @@ run_spec_file(Relaxed,
include = AllInclude,
testspecs = AbsSpecs,
multiply_timetraps = MultTT,
- scale_timetraps = ScaleTT},
+ scale_timetraps = ScaleTT,
+ ct_hooks = AllCTHooks},
{Run,Skip} = ct_testspec:prepare_tests(TS, node()),
reformat_result(catch do_run(Run, Skip, Opts1, StartOpts));
{error,GCFReason} ->
@@ -808,10 +835,12 @@ run_spec_file(Relaxed,
run_prepared(Run, Skip, Opts = #opts{logdir = LogDir,
config = CfgFiles,
- event_handlers = EvHandlers},
+ event_handlers = EvHandlers,
+ ct_hooks = CTHooks},
StartOpts) ->
LogDir1 = which(logdir, LogDir),
- case check_and_install_configfiles(CfgFiles, LogDir1, EvHandlers) of
+ case check_and_install_configfiles(CfgFiles, LogDir1,
+ EvHandlers, CTHooks) of
ok ->
reformat_result(catch do_run(Run, Skip, Opts#opts{logdir = LogDir1},
StartOpts));
@@ -842,7 +871,8 @@ check_config_file(Callback, File)->
run_dir(Opts = #opts{logdir = LogDir,
config = CfgFiles,
- event_handlers = EvHandlers}, StartOpts) ->
+ event_handlers = EvHandlers,
+ ct_hooks = CTHook }, StartOpts) ->
LogDir1 = which(logdir, LogDir),
Opts1 = Opts#opts{logdir = LogDir1},
AbsCfgFiles =
@@ -863,7 +893,9 @@ run_dir(Opts = #opts{logdir = LogDir,
check_config_file(Callback, File)
end, FileList)}
end, CfgFiles),
- case install([{config,AbsCfgFiles},{event_handler,EvHandlers}], LogDir1) of
+ case install([{config,AbsCfgFiles},
+ {event_handler,EvHandlers},
+ {ct_hooks, CTHook}], LogDir1) of
ok -> ok;
{error,IReason} -> exit(IReason)
end,
@@ -968,7 +1000,8 @@ run_testspec1(TestSpec) ->
application:set_env(common_test, include, AllInclude),
LogDir1 = which(logdir,Opts#opts.logdir),
case check_and_install_configfiles(Opts#opts.config, LogDir1,
- Opts#opts.event_handlers) of
+ Opts#opts.event_handlers,
+ Opts#opts.ct_hooks) of
ok ->
Opts1 = Opts#opts{testspecs = [],
logdir = LogDir1,
@@ -986,6 +1019,7 @@ get_data_for_node(#testspec{label = Labels,
config = Cfgs,
userconfig = UsrCfgs,
event_handler = EvHs,
+ ct_hooks = CTHooks,
include = Incl,
multiply_timetraps = MTs,
scale_timetraps = STs}, Node) ->
@@ -1000,12 +1034,14 @@ get_data_for_node(#testspec{label = Labels,
ConfigFiles = [{?ct_config_txt,F} || {N,F} <- Cfgs, N==Node] ++
[CBF || {N,CBF} <- UsrCfgs, N==Node],
EvHandlers = [{H,A} || {N,H,A} <- EvHs, N==Node],
+ FiltCTHooks = [Hook || {N,Hook} <- CTHooks, N==Node],
Include = [I || {N,I} <- Incl, N==Node],
#opts{label = Label,
logdir = LogDir,
cover = Cover,
config = ConfigFiles,
event_handlers = EvHandlers,
+ ct_hooks = FiltCTHooks,
include = Include,
multiply_timetraps = MT,
scale_timetraps = ST}.
@@ -1036,15 +1072,7 @@ refresh_logs(LogDir) ->
which(logdir, undefined) ->
".";
which(logdir, Dir) ->
- Dir;
-which(multiply_timetraps, undefined) ->
- 1;
-which(multiply_timetraps, MT) ->
- MT;
-which(scale_timetraps, undefined) ->
- false;
-which(scale_timetraps, ST) ->
- ST.
+ Dir.
choose_val(undefined, V1) ->
V1;
@@ -1083,6 +1111,8 @@ run(TestDirs) ->
install([]),
reformat_result(catch do_run(tests(TestDirs), [])).
+reformat_result({'EXIT',{user_error,Reason}}) ->
+ {error,Reason};
reformat_result({user_error,Reason}) ->
{error,Reason};
reformat_result(Result) ->
@@ -2032,12 +2062,37 @@ get_start_opt(Key, IfExists, IfNotExists, Args) ->
Val;
{value,{Key,_Val}} ->
IfExists;
- _ when is_function(IfNotExists) ->
- IfNotExists();
_ ->
IfNotExists
end.
+ct_hooks_args2opts(Args) ->
+ ct_hooks_args2opts(
+ proplists:get_value(ct_hooks, Args, []),[]).
+
+ct_hooks_args2opts([CTH,Arg,"and"| Rest],Acc) ->
+ ct_hooks_args2opts(Rest,[{list_to_atom(CTH),
+ parse_cth_args(Arg)}|Acc]);
+ct_hooks_args2opts([CTH], Acc) ->
+ ct_hooks_args2opts([CTH,"and"],Acc);
+ct_hooks_args2opts([CTH, "and" | Rest], Acc) ->
+ ct_hooks_args2opts(Rest,[list_to_atom(CTH)|Acc]);
+ct_hooks_args2opts([CTH, Args], Acc) ->
+ ct_hooks_args2opts([CTH, Args, "and"],Acc);
+ct_hooks_args2opts([],Acc) ->
+ lists:reverse(Acc).
+
+parse_cth_args(String) ->
+ try
+ true = io_lib:printable_list(String),
+ {ok,Toks,_} = erl_scan:string(String++"."),
+ {ok, Args} = erl_parse:parse_term(Toks),
+ Args
+ catch _:_ ->
+ String
+ end.
+
+
event_handler_args2opts(Args) ->
case proplists:get_value(event_handler, Args) of
undefined ->
@@ -2165,6 +2220,22 @@ opts2args(EnvStartOpts) ->
end, EHs),
[_LastAnd|StrsR] = lists:reverse(lists:flatten(Strs)),
[{event_handler_init,lists:reverse(StrsR)}];
+ ({ct_hooks,[]}) ->
+ [];
+ ({ct_hooks,CTHs}) when is_list(CTHs) ->
+ io:format(user,"ct_hooks: ~p",[CTHs]),
+ Strs = lists:flatmap(
+ fun({CTH,Arg}) ->
+ [atom_to_list(CTH),
+ lists:flatten(
+ io_lib:format("~p",[Arg])),
+ "and"];
+ (CTH) when is_atom(CTH) ->
+ [atom_to_list(CTH),"and"]
+ end,CTHs),
+ [_LastAnd|StrsR] = lists:reverse(Strs),
+ io:format(user,"return: ~p",[lists:reverse(StrsR)]),
+ [{ct_hooks,lists:reverse(StrsR)}];
({Opt,As=[A|_]}) when is_atom(A) ->
[{Opt,[atom_to_list(Atom) || Atom <- As]}];
({Opt,Strs=[S|_]}) when is_list(S) ->
@@ -2263,12 +2334,19 @@ do_trace(Terms) ->
dbg:tracer(),
dbg:p(self(), [sos,call]),
lists:foreach(fun({m,M}) ->
- case dbg:tpl(M,[{'_',[],[{return_trace}]}]) of
+ case dbg:tpl(M,x) of
+ {error,What} -> exit({error,{tracing_failed,What}});
+ _ -> ok
+ end;
+ ({me,M}) ->
+ case dbg:tp(M,[{'_',[],[{exception_trace},
+ {message,{caller}}]}]) of
{error,What} -> exit({error,{tracing_failed,What}});
_ -> ok
end;
({f,M,F}) ->
- case dbg:tpl(M,F,[{'_',[],[{return_trace}]}]) of
+ case dbg:tpl(M,F,[{'_',[],[{exception_trace},
+ {message,{caller}}]}]) of
{error,What} -> exit({error,{tracing_failed,What}});
_ -> ok
end;
diff --git a/lib/common_test/src/ct_testspec.erl b/lib/common_test/src/ct_testspec.erl
index f5069427a2..d845358bb2 100644
--- a/lib/common_test/src/ct_testspec.erl
+++ b/lib/common_test/src/ct_testspec.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -68,7 +68,8 @@ prepare_tests(TestSpec) when is_record(TestSpec,testspec) ->
%% Create initial list of {Node,{Run,Skip}} tuples
NodeList = lists:map(fun(N) -> {N,{[],[]}} end, list_nodes(TestSpec)),
%% Get all Run tests sorted per node basis.
- NodeList1 = run_per_node(Run,NodeList),
+ NodeList1 = run_per_node(Run,NodeList,
+ TestSpec#testspec.merge_tests),
%% Get all Skip entries sorted per node basis.
NodeList2 = skip_per_node(Skip,NodeList1),
%% Change representation.
@@ -89,11 +90,17 @@ prepare_tests(TestSpec) when is_record(TestSpec,testspec) ->
%% run_per_node/2 takes the Run list as input and returns a list
%% of {Node,RunPerNode,[]} tuples where the tests have been sorted
%% on a per node basis.
-run_per_node([{{Node,Dir},Test}|Ts],Result) ->
+run_per_node([{{Node,Dir},Test}|Ts],Result, MergeTests) ->
{value,{Node,{Run,Skip}}} = lists:keysearch(Node,1,Result),
- Run1 = merge_tests(Dir,Test,Run),
- run_per_node(Ts,insert_in_order({Node,{Run1,Skip}},Result));
-run_per_node([],Result) ->
+ Run1 = case MergeTests of
+ false ->
+ append({Dir, Test}, Run);
+ true ->
+ merge_tests(Dir,Test,Run)
+ end,
+ run_per_node(Ts,insert_in_order({Node,{Run1,Skip}},Result),
+ MergeTests);
+run_per_node([],Result,_) ->
Result.
merge_tests(Dir,Test={all,_},TestDirs) ->
@@ -281,6 +288,8 @@ collect_tests(Terms,TestSpec,Relaxed) ->
{Terms2, TestSpec3} = filter_init_terms(Terms, [], TestSpec2),
add_tests(Terms2,TestSpec3).
+get_global([{merge_tests, Bool} | Ts], Spec) ->
+ get_global(Ts,Spec#testspec{ merge_tests = Bool });
get_global([{alias,Ref,Dir}|Ts],Spec=#testspec{alias=Refs}) ->
get_global(Ts,Spec#testspec{alias=[{Ref,get_absdir(Dir,Spec)}|Refs]});
get_global([{node,Ref,Node}|Ts],Spec=#testspec{nodes=Refs}) ->
@@ -394,8 +403,6 @@ filter_init_terms([Term|Ts], NewTerms, Spec)->
filter_init_terms([], NewTerms, Spec)->
{lists:reverse(NewTerms), Spec}.
-add_option([], _, List, _)->
- List;
add_option({Key, Value}, Node, List, WarnIfExists) when is_list(Value)->
OldOptions = case lists:keyfind(Node, 1, List) of
{Node, Options}->
@@ -625,6 +632,20 @@ add_tests([{event_handler,Node,H,Args}|Ts],Spec) when is_atom(H) ->
Node1 = ref2node(Node,Spec#testspec.nodes),
add_tests(Ts,Spec#testspec{event_handler=[{Node1,H,Args}|EvHs]});
+%% --- ct_hooks --
+add_tests([{ct_hooks, all_nodes, Hooks} | Ts], Spec) ->
+ Tests = [{ct_hooks,N,Hooks} || N <- list_nodes(Spec)],
+ add_tests(Tests ++ Ts, Spec);
+add_tests([{ct_hooks, Node, [Hook|Hooks]}|Ts], Spec) ->
+ SuiteCbs = Spec#testspec.ct_hooks,
+ Node1 = ref2node(Node,Spec#testspec.nodes),
+ add_tests([{ct_hooks, Node, Hooks} | Ts],
+ Spec#testspec{ct_hooks = [{Node1,Hook} | SuiteCbs]});
+add_tests([{ct_hooks, _Node, []}|Ts], Spec) ->
+ add_tests(Ts, Spec);
+add_tests([{ct_hooks, Hooks}|Ts], Spec) ->
+ add_tests([{ct_hooks, all_nodes, Hooks}|Ts], Spec);
+
%% --- include ---
add_tests([{include,all_nodes,InclDirs}|Ts],Spec) ->
Tests = lists:map(fun(N) -> {include,N,InclDirs} end, list_nodes(Spec)),
@@ -656,7 +677,7 @@ add_tests([{suites,Node,Dir,Ss}|Ts],Spec) ->
Tests = Spec#testspec.tests,
Tests1 = insert_suites(ref2node(Node,Spec#testspec.nodes),
ref2dir(Dir,Spec#testspec.alias),
- Ss,Tests),
+ Ss,Tests, Spec#testspec.merge_tests),
add_tests(Ts,Spec#testspec{tests=Tests1});
%% --- groups ---
@@ -682,13 +703,15 @@ add_tests([{groups,Node,Dir,Suite,Gs}|Ts],Spec) ->
Tests = Spec#testspec.tests,
Tests1 = insert_groups(ref2node(Node,Spec#testspec.nodes),
ref2dir(Dir,Spec#testspec.alias),
- Suite,Gs,all,Tests),
+ Suite,Gs,all,Tests,
+ Spec#testspec.merge_tests),
add_tests(Ts,Spec#testspec{tests=Tests1});
add_tests([{groups,Node,Dir,Suite,Gs,{cases,TCs}}|Ts],Spec) ->
Tests = Spec#testspec.tests,
Tests1 = insert_groups(ref2node(Node,Spec#testspec.nodes),
ref2dir(Dir,Spec#testspec.alias),
- Suite,Gs,TCs,Tests),
+ Suite,Gs,TCs,Tests,
+ Spec#testspec.merge_tests),
add_tests(Ts,Spec#testspec{tests=Tests1});
%% --- cases ---
@@ -703,7 +726,7 @@ add_tests([{cases,Node,Dir,Suite,Cs}|Ts],Spec) ->
Tests = Spec#testspec.tests,
Tests1 = insert_cases(ref2node(Node,Spec#testspec.nodes),
ref2dir(Dir,Spec#testspec.alias),
- Suite,Cs,Tests),
+ Suite,Cs,Tests, Spec#testspec.merge_tests),
add_tests(Ts,Spec#testspec{tests=Tests1});
%% --- skip_suites ---
@@ -718,7 +741,8 @@ add_tests([{skip_suites,Node,Dir,Ss,Cmt}|Ts],Spec) ->
Tests = Spec#testspec.tests,
Tests1 = skip_suites(ref2node(Node,Spec#testspec.nodes),
ref2dir(Dir,Spec#testspec.alias),
- Ss,Cmt,Tests),
+ Ss,Cmt,Tests,
+ Spec#testspec.merge_tests),
add_tests(Ts,Spec#testspec{tests=Tests1});
%% --- skip_groups ---
@@ -740,13 +764,15 @@ add_tests([{skip_groups,Node,Dir,Suite,Gs,Cmt}|Ts],Spec) ->
Tests = Spec#testspec.tests,
Tests1 = skip_groups(ref2node(Node,Spec#testspec.nodes),
ref2dir(Dir,Spec#testspec.alias),
- Suite,Gs,all,Cmt,Tests),
+ Suite,Gs,all,Cmt,Tests,
+ Spec#testspec.merge_tests),
add_tests(Ts,Spec#testspec{tests=Tests1});
add_tests([{skip_groups,Node,Dir,Suite,Gs,{cases,TCs},Cmt}|Ts],Spec) ->
Tests = Spec#testspec.tests,
Tests1 = skip_groups(ref2node(Node,Spec#testspec.nodes),
ref2dir(Dir,Spec#testspec.alias),
- Suite,Gs,TCs,Cmt,Tests),
+ Suite,Gs,TCs,Cmt,Tests,
+ Spec#testspec.merge_tests),
add_tests(Ts,Spec#testspec{tests=Tests1});
%% --- skip_cases ---
@@ -761,7 +787,7 @@ add_tests([{skip_cases,Node,Dir,Suite,Cs,Cmt}|Ts],Spec) ->
Tests = Spec#testspec.tests,
Tests1 = skip_cases(ref2node(Node,Spec#testspec.nodes),
ref2dir(Dir,Spec#testspec.alias),
- Suite,Cs,Cmt,Tests),
+ Suite,Cs,Cmt,Tests,Spec#testspec.merge_tests),
add_tests(Ts,Spec#testspec{tests=Tests1});
%% --- handled/errors ---
@@ -771,6 +797,9 @@ add_tests([{alias,_,_}|Ts],Spec) -> % handled
add_tests([{node,_,_}|Ts],Spec) -> % handled
add_tests(Ts,Spec);
+add_tests([{merge_tests, _} | Ts], Spec) -> % handled
+ add_tests(Ts,Spec);
+
%% check if it's a CT term that has bad format or if the user seems to
%% have added something of his/her own, which we'll let pass if relaxed
%% mode is enabled.
@@ -823,17 +852,22 @@ separate([],_,_,_) ->
%% {Suite2,[{GrOrCase21,{skip,Cmt}},GrOrCase22,...]},...]}
%% GrOrCase = {GroupName,[Case1,Case2,...]} | Case
-insert_suites(Node,Dir,[S|Ss],Tests) ->
- Tests1 = insert_cases(Node,Dir,S,all,Tests),
- insert_suites(Node,Dir,Ss,Tests1);
-insert_suites(_Node,_Dir,[],Tests) ->
+insert_suites(Node,Dir,[S|Ss],Tests, MergeTests) ->
+ Tests1 = insert_cases(Node,Dir,S,all,Tests,MergeTests),
+ insert_suites(Node,Dir,Ss,Tests1,MergeTests);
+insert_suites(_Node,_Dir,[],Tests,_MergeTests) ->
Tests;
-insert_suites(Node,Dir,S,Tests) ->
- insert_suites(Node,Dir,[S],Tests).
+insert_suites(Node,Dir,S,Tests,MergeTests) ->
+ insert_suites(Node,Dir,[S],Tests,MergeTests).
-insert_groups(Node,Dir,Suite,Group,Cases,Tests) when is_atom(Group) ->
- insert_groups(Node,Dir,Suite,[Group],Cases,Tests);
-insert_groups(Node,Dir,Suite,Groups,Cases,Tests) when
+insert_groups(Node,Dir,Suite,Group,Cases,Tests,MergeTests)
+ when is_atom(Group) ->
+ insert_groups(Node,Dir,Suite,[Group],Cases,Tests,MergeTests);
+insert_groups(Node,Dir,Suite,Groups,Cases,Tests,false) when
+ ((Cases == all) or is_list(Cases)) and is_list(Groups) ->
+ Groups1 = [{Gr,Cases} || Gr <- Groups],
+ append({{Node,Dir},[{Suite,Groups1}]},Tests);
+insert_groups(Node,Dir,Suite,Groups,Cases,Tests,true) when
((Cases == all) or is_list(Cases)) and is_list(Groups) ->
case lists:keysearch({Node,Dir},1,Tests) of
{value,{{Node,Dir},[{all,_}]}} ->
@@ -847,9 +881,10 @@ insert_groups(Node,Dir,Suite,Groups,Cases,Tests) when
Groups1 = [{Gr,Cases} || Gr <- Groups],
insert_in_order({{Node,Dir},[{Suite,Groups1}]},Tests)
end;
-insert_groups(Node,Dir,Suite,Groups,Case,Tests) when is_atom(Case) ->
+insert_groups(Node,Dir,Suite,Groups,Case,Tests, MergeTests)
+ when is_atom(Case) ->
Cases = if Case == all -> all; true -> [Case] end,
- insert_groups(Node,Dir,Suite,Groups,Cases,Tests).
+ insert_groups(Node,Dir,Suite,Groups,Cases,Tests, MergeTests).
insert_groups1(_Suite,_Groups,all) ->
all;
@@ -879,7 +914,9 @@ insert_groups2([Group={GrName,Cases}|Groups],GrAndCases) ->
insert_groups2([],GrAndCases) ->
GrAndCases.
-insert_cases(Node,Dir,Suite,Cases,Tests) when is_list(Cases) ->
+insert_cases(Node,Dir,Suite,Cases,Tests,false) when is_list(Cases) ->
+ append({{Node,Dir},[{Suite,Cases}]},Tests);
+insert_cases(Node,Dir,Suite,Cases,Tests,true) when is_list(Cases) ->
case lists:keysearch({Node,Dir},1,Tests) of
{value,{{Node,Dir},[{all,_}]}} ->
Tests;
@@ -889,8 +926,8 @@ insert_cases(Node,Dir,Suite,Cases,Tests) when is_list(Cases) ->
false ->
insert_in_order({{Node,Dir},[{Suite,Cases}]},Tests)
end;
-insert_cases(Node,Dir,Suite,Case,Tests) when is_atom(Case) ->
- insert_cases(Node,Dir,Suite,[Case],Tests).
+insert_cases(Node,Dir,Suite,Case,Tests,MergeTests) when is_atom(Case) ->
+ insert_cases(Node,Dir,Suite,[Case],Tests,MergeTests).
insert_cases1(_Suite,_Cases,all) ->
all;
@@ -905,22 +942,28 @@ insert_cases1(Suite,Cases,Suites0) ->
insert_in_order({Suite,Cases},Suites0)
end.
-skip_suites(Node,Dir,[S|Ss],Cmt,Tests) ->
- Tests1 = skip_cases(Node,Dir,S,all,Cmt,Tests),
- skip_suites(Node,Dir,Ss,Cmt,Tests1);
-skip_suites(_Node,_Dir,[],_Cmt,Tests) ->
+skip_suites(Node,Dir,[S|Ss],Cmt,Tests,MergeTests) ->
+ Tests1 = skip_cases(Node,Dir,S,all,Cmt,Tests,MergeTests),
+ skip_suites(Node,Dir,Ss,Cmt,Tests1,MergeTests);
+skip_suites(_Node,_Dir,[],_Cmt,Tests,_MergeTests) ->
Tests;
-skip_suites(Node,Dir,S,Cmt,Tests) ->
- skip_suites(Node,Dir,[S],Cmt,Tests).
-
-skip_groups(Node,Dir,Suite,Group,all,Cmt,Tests) when is_atom(Group) ->
- skip_groups(Node,Dir,Suite,[Group],all,Cmt,Tests);
-skip_groups(Node,Dir,Suite,Group,Cases,Cmt,Tests) when is_atom(Group) ->
- skip_groups(Node,Dir,Suite,[Group],Cases,Cmt,Tests);
-skip_groups(Node,Dir,Suite,Groups,Case,Cmt,Tests) when is_atom(Case),
- Case =/= all ->
- skip_groups(Node,Dir,Suite,Groups,[Case],Cmt,Tests);
-skip_groups(Node,Dir,Suite,Groups,Cases,Cmt,Tests) when
+skip_suites(Node,Dir,S,Cmt,Tests,MergeTests) ->
+ skip_suites(Node,Dir,[S],Cmt,Tests,MergeTests).
+
+skip_groups(Node,Dir,Suite,Group,all,Cmt,Tests,MergeTests)
+ when is_atom(Group) ->
+ skip_groups(Node,Dir,Suite,[Group],all,Cmt,Tests,MergeTests);
+skip_groups(Node,Dir,Suite,Group,Cases,Cmt,Tests,MergeTests)
+ when is_atom(Group) ->
+ skip_groups(Node,Dir,Suite,[Group],Cases,Cmt,Tests,MergeTests);
+skip_groups(Node,Dir,Suite,Groups,Case,Cmt,Tests,MergeTests)
+ when is_atom(Case),Case =/= all ->
+ skip_groups(Node,Dir,Suite,Groups,[Case],Cmt,Tests,MergeTests);
+skip_groups(Node,Dir,Suite,Groups,Cases,Cmt,Tests,false) when
+ ((Cases == all) or is_list(Cases)) and is_list(Groups) ->
+ Suites1 = skip_groups1(Suite,[{Gr,Cases} || Gr <- Groups],Cmt,[]),
+ append({{Node,Dir},Suites1},Tests);
+skip_groups(Node,Dir,Suite,Groups,Cases,Cmt,Tests,true) when
((Cases == all) or is_list(Cases)) and is_list(Groups) ->
Suites =
case lists:keysearch({Node,Dir},1,Tests) of
@@ -931,9 +974,10 @@ skip_groups(Node,Dir,Suite,Groups,Cases,Cmt,Tests) when
end,
Suites1 = skip_groups1(Suite,[{Gr,Cases} || Gr <- Groups],Cmt,Suites),
insert_in_order({{Node,Dir},Suites1},Tests);
-skip_groups(Node,Dir,Suite,Groups,Case,Cmt,Tests) when is_atom(Case) ->
+skip_groups(Node,Dir,Suite,Groups,Case,Cmt,Tests,MergeTests)
+ when is_atom(Case) ->
Cases = if Case == all -> all; true -> [Case] end,
- skip_groups(Node,Dir,Suite,Groups,Cases,Cmt,Tests).
+ skip_groups(Node,Dir,Suite,Groups,Cases,Cmt,Tests,MergeTests).
skip_groups1(Suite,Groups,Cmt,Suites0) ->
SkipGroups = lists:map(fun(Group) ->
@@ -947,7 +991,10 @@ skip_groups1(Suite,Groups,Cmt,Suites0) ->
insert_in_order({Suite,SkipGroups},Suites0)
end.
-skip_cases(Node,Dir,Suite,Cases,Cmt,Tests) when is_list(Cases) ->
+skip_cases(Node,Dir,Suite,Cases,Cmt,Tests,false) when is_list(Cases) ->
+ Suites1 = skip_cases1(Suite,Cases,Cmt,[]),
+ append({{Node,Dir},Suites1},Tests);
+skip_cases(Node,Dir,Suite,Cases,Cmt,Tests,true) when is_list(Cases) ->
Suites =
case lists:keysearch({Node,Dir},1,Tests) of
{value,{{Node,Dir},Suites0}} ->
@@ -957,8 +1004,8 @@ skip_cases(Node,Dir,Suite,Cases,Cmt,Tests) when is_list(Cases) ->
end,
Suites1 = skip_cases1(Suite,Cases,Cmt,Suites),
insert_in_order({{Node,Dir},Suites1},Tests);
-skip_cases(Node,Dir,Suite,Case,Cmt,Tests) when is_atom(Case) ->
- skip_cases(Node,Dir,Suite,[Case],Cmt,Tests).
+skip_cases(Node,Dir,Suite,Case,Cmt,Tests,MergeTests) when is_atom(Case) ->
+ skip_cases(Node,Dir,Suite,[Case],Cmt,Tests,MergeTests).
skip_cases1(Suite,Cases,Cmt,Suites0) ->
SkipCases = lists:map(fun(C) ->
@@ -972,6 +1019,9 @@ skip_cases1(Suite,Cases,Cmt,Suites0) ->
insert_in_order({Suite,SkipCases},Suites0)
end.
+append(Elem, List) ->
+ List ++ [Elem].
+
insert_in_order([E|Es],List) ->
List1 = insert_elem(E,List,[]),
insert_in_order(Es,List1);
@@ -1044,6 +1094,7 @@ valid_terms() ->
{userconfig,2},
{userconfig,3},
{alias,3},
+ {merge_tests,1},
{logdir,2},
{logdir,3},
{label,2},
@@ -1051,6 +1102,8 @@ valid_terms() ->
{event_handler,2},
{event_handler,3},
{event_handler,4},
+ {ct_hooks,2},
+ {ct_hooks,3},
{multiply_timetraps,2},
{multiply_timetraps,3},
{scale_timetraps,2},
diff --git a/lib/common_test/src/ct_util.erl b/lib/common_test/src/ct_util.erl
index b5ab4cbb6e..b3e345b4e5 100644
--- a/lib/common_test/src/ct_util.erl
+++ b/lib/common_test/src/ct_util.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -32,10 +32,12 @@
-export([close_connections/0]).
--export([save_suite_data/3, save_suite_data/2, read_suite_data/1,
+-export([save_suite_data/3, save_suite_data/2,
+ save_suite_data_async/3, save_suite_data_async/2,
+ read_suite_data/1,
delete_suite_data/0, delete_suite_data/1, match_delete_suite_data/1,
delete_testdata/0, delete_testdata/1, set_testdata/1, get_testdata/1,
- update_testdata/2]).
+ set_testdata_async/1, update_testdata/2]).
-export([override_silence_all_connections/0, override_silence_connections/1,
get_overridden_silenced_connections/0,
@@ -94,7 +96,8 @@ start(Mode,LogDir) ->
Pid = spawn_link(fun() -> do_start(S,Mode,LogDir) end),
receive
{Pid,started} -> Pid;
- {Pid,Error} -> exit(Error)
+ {Pid,Error} -> exit(Error);
+ {_Ref,{Pid,Error}} -> exit(Error)
end;
Pid ->
case get_mode() of
@@ -159,11 +162,20 @@ do_start(Parent,Mode,LogDir) ->
ok
end,
{StartTime,TestLogDir} = ct_logs:init(Mode),
+
ct_event:notify(#event{name=test_start,
node=node(),
data={StartTime,
lists:flatten(TestLogDir)}}),
- Parent ! {self(),started},
+ %% Initialize ct_hooks
+ case catch ct_hooks:init(Opts) of
+ ok ->
+ Parent ! {self(),started};
+ {_,CTHReason} ->
+ ct_logs:tc_print('Suite Callback',CTHReason,[]),
+ self() ! {{stop,{self(),{user_error,CTHReason}}},
+ {Parent,make_ref()}}
+ end,
loop(Mode,[],StartDir).
create_table(TableName,KeyPos) ->
@@ -182,12 +194,19 @@ read_opts() ->
{error,{bad_installation,Error}}
end.
+
save_suite_data(Key, Value) ->
call({save_suite_data, {Key, undefined, Value}}).
save_suite_data(Key, Name, Value) ->
call({save_suite_data, {Key, Name, Value}}).
+save_suite_data_async(Key, Value) ->
+ save_suite_data_async(Key, undefined, Value).
+
+save_suite_data_async(Key, Name, Value) ->
+ cast({save_suite_data, {Key, Name, Value}}).
+
read_suite_data(Key) ->
call({read_suite_data, Key}).
@@ -212,6 +231,9 @@ update_testdata(Key, Fun) ->
set_testdata(TestData) ->
call({set_testdata, TestData}).
+set_testdata_async(TestData) ->
+ cast({set_testdata, TestData}).
+
get_testdata(Key) ->
call({get_testdata, Key}).
@@ -268,6 +290,9 @@ loop(Mode,TestData,StartDir) ->
TestData1 = lists:keydelete(Key,1,TestData),
return(From,ok),
loop(Mode,[New|TestData1],StartDir);
+ {{get_testdata, all}, From} ->
+ return(From, TestData),
+ loop(From, TestData, StartDir);
{{get_testdata,Key},From} ->
case lists:keysearch(Key,1,TestData) of
{value,{Key,Val}} ->
@@ -294,20 +319,27 @@ loop(Mode,TestData,StartDir) ->
{reset_cwd,From} ->
return(From,file:set_cwd(StartDir)),
loop(From,TestData,StartDir);
- {{stop,How},From} ->
+ {{stop,Info},From} ->
Time = calendar:local_time(),
ct_event:sync_notify(#event{name=test_done,
node=node(),
data=Time}),
+ Callbacks = ets:lookup_element(?suite_table,
+ ct_hooks,
+ #suite_data.value),
+ ct_hooks:terminate(Callbacks),
close_connections(ets:tab2list(?conn_table)),
ets:delete(?conn_table),
ets:delete(?board_table),
ets:delete(?suite_table),
- ct_logs:close(How),
+ ct_logs:close(Info),
ct_event:stop(),
ct_config:stop(),
file:set_cwd(StartDir),
- return(From,ok);
+ return(From, Info);
+ {Ref, _Msg} when is_reference(Ref) ->
+ %% This clause is used when doing cast operations.
+ loop(Mode,TestData,StartDir);
{get_mode,From} ->
return(From,Mode),
loop(Mode,TestData,StartDir);
@@ -507,16 +539,16 @@ reset_silent_connections() ->
%%%-----------------------------------------------------------------
-%%% @spec stop(How) -> ok
+%%% @spec stop(Info) -> ok
%%%
%%% @doc Stop the ct_util_server and close all existing connections
%%% (tool-internal use only).
%%%
%%% @see ct
-stop(How) ->
+stop(Info) ->
case whereis(ct_util_server) of
undefined -> ok;
- _ -> call({stop,How})
+ _ -> call({stop,Info})
end.
%%%-----------------------------------------------------------------
@@ -713,6 +745,9 @@ call(Msg) ->
return({To,Ref},Result) ->
To ! {Ref, Result}.
+cast(Msg) ->
+ ct_util_server ! {Msg, {ct_util_server, make_ref()}}.
+
seconds(T) ->
test_server:seconds(T).
diff --git a/lib/common_test/src/ct_util.hrl b/lib/common_test/src/ct_util.hrl
index ee973f6220..556f88c84d 100644
--- a/lib/common_test/src/ct_util.hrl
+++ b/lib/common_test/src/ct_util.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -36,11 +36,13 @@
config=[],
userconfig=[],
event_handler=[],
+ ct_hooks=[],
include=[],
multiply_timetraps=[],
scale_timetraps=[],
alias=[],
- tests=[]}).
+ tests=[],
+ merge_tests = true }).
-record(cover, {app=none,
level=details,
diff --git a/lib/common_test/src/vts.erl b/lib/common_test/src/vts.erl
index 2ee982d726..081f98e889 100644
--- a/lib/common_test/src/vts.erl
+++ b/lib/common_test/src/vts.erl
@@ -281,9 +281,7 @@ run_test1(State=#state{tests=Tests,current_log_dir=LogDir}) ->
end,
unlink(Self)
end,
-
Pid = spawn_link(RunTest),
-
Total =
receive
{{test_info,start_info,{_,_,Cases}},From} ->
@@ -480,7 +478,7 @@ create_testdir_entries([],_N) ->
[].
testdir_entry(Dir,Suite,Case,N) ->
- NStr = integer_to_list(N),
+ NStr = vts_integer_to_list(N),
tr([td(delete_button(NStr)),
td(Dir),
td(suite_select(Dir,Suite,NStr)),
@@ -691,11 +689,11 @@ result_summary_frame1(State) ->
result_summary_body(State) ->
N = State#state.ok + State#state.fail + State#state.skip,
[h2("Result Summary"),
- p([b(integer_to_list(N))," cases executed (of ",
- b(integer_to_list(State#state.total)),")"]),
- p([green([b(integer_to_list(State#state.ok))," successful"]),br(),
- red([b(integer_to_list(State#state.fail))," failed"]),br(),
- orange([b(integer_to_list(State#state.skip))," skipped"])]),
+ p([b(vts_integer_to_list(N))," cases executed (of ",
+ b(vts_integer_to_list(State#state.total)),")"]),
+ p([green([b(vts_integer_to_list(State#state.ok))," successful"]),br(),
+ red([b(vts_integer_to_list(State#state.fail))," failed"]),br(),
+ orange([b(vts_integer_to_list(State#state.skip))," skipped"])]),
executed_test_list(State)].
executed_test_list(#state{testruns=[]}) ->
@@ -735,6 +733,14 @@ report1(tc_done,{_Suite,init_per_suite,_},State) ->
State;
report1(tc_done,{_Suite,end_per_suite,_},State) ->
State;
+report1(tc_done,{_Suite,init_per_group,_},State) ->
+ State;
+report1(tc_done,{_Suite,end_per_group,_},State) ->
+ State;
+report1(tc_done,{_Suite,ct_init_per_group,_},State) ->
+ State;
+report1(tc_done,{_Suite,ct_end_per_group,_},State) ->
+ State;
report1(tc_done,{_Suite,_Case,ok},State) ->
State#state{ok=State#state.ok+1};
report1(tc_done,{_Suite,_Case,{failed,_Reason}},State) ->
@@ -742,7 +748,9 @@ report1(tc_done,{_Suite,_Case,{failed,_Reason}},State) ->
report1(tc_done,{_Suite,_Case,{skipped,_Reason}},State) ->
State#state{skip=State#state.skip+1};
report1(tc_user_skip,{_Suite,_Case,_Reason},State) ->
- State#state{skip=State#state.skip+1}.
+ State#state{skip=State#state.skip+1};
+report1(loginfo,_,State) ->
+ State.
get_test_log(TestName,LogDir) ->
[Log] =
@@ -882,3 +890,7 @@ get_input_data(Input,Key)->
parse(Input) ->
httpd:parse_query(Input).
+vts_integer_to_list(X) when is_atom(X) ->
+ atom_to_list(X);
+vts_integer_to_list(X) when is_integer(X) ->
+ integer_to_list(X).
diff --git a/lib/common_test/test/Makefile b/lib/common_test/test/Makefile
index f2fe3390cf..b7b099069c 100644
--- a/lib/common_test/test/Makefile
+++ b/lib/common_test/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2008-2010. All Rights Reserved.
+# Copyright Ericsson AB 2008-2011. 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
@@ -40,7 +40,8 @@ MODULES= \
ct_test_server_if_1_SUITE \
ct_config_SUITE \
ct_master_SUITE \
- ct_misc_1_SUITE
+ ct_misc_1_SUITE \
+ ct_hooks_SUITE
ERL_FILES= $(MODULES:%=%.erl)
@@ -95,7 +96,7 @@ release_tests_spec:
$(INSTALL_DIR) $(RELSYSDIR)
$(INSTALL_DATA) $(ERL_FILES) $(COVERFILE) $(RELSYSDIR)
$(INSTALL_DATA) common_test.spec $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
@tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
release_docs_spec:
diff --git a/lib/common_test/test/common_test.spec b/lib/common_test/test/common_test.spec
index 7619a75b31..8755b08117 100644
--- a/lib/common_test/test/common_test.spec
+++ b/lib/common_test/test/common_test.spec
@@ -1 +1 @@
-{topcase, {dir, "../common_test"}}.
+{suites,"../common_test_test",all}. \ No newline at end of file
diff --git a/lib/common_test/test/ct_config_SUITE.erl b/lib/common_test/test/ct_config_SUITE.erl
index fc15abc5bc..8ce75f582a 100644
--- a/lib/common_test/test/ct_config_SUITE.erl
+++ b/lib/common_test/test/ct_config_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2011. 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
@@ -29,7 +29,7 @@
-compile(export_all).
--include_lib("test_server/include/test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include_lib("common_test/include/ct_event.hrl").
-define(eh, ct_test_support_eh).
@@ -64,19 +64,22 @@ end_per_testcase(install_config = TestCase, Config) ->
end_per_testcase(TestCase, Config) ->
ct_test_support:end_per_testcase(TestCase, Config).
-all(doc) ->
- [""];
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [require, install_config, userconfig_static,
+ userconfig_dynamic, testspec_legacy, testspec_static,
+ testspec_dynamic].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [
- require,
- install_config,
- userconfig_static,
- userconfig_dynamic,
- testspec_legacy,
- testspec_static,
- testspec_dynamic
- ].
%%--------------------------------------------------------------------
%% TEST CASES
@@ -171,7 +174,8 @@ run_test(Name, Config, CTConfig, SuiteNames)->
TestEvents = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(Name,
reformat_events(TestEvents, ?eh),
- ?config(config_dir, Config)),
+ ?config(config_dir, Config),
+ Opts),
ExpEvents = events_to_check(Name),
ok = ct_test_support:verify_events(ExpEvents, TestEvents, Config).
@@ -199,74 +203,74 @@ events_to_check(Test, N) ->
expected_events(Test) ++ events_to_check(Test, N-1).
expected_events(config_static_SUITE)->
-[
- {?eh,start_logging,{'DEF','RUNDIR'}},
- {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
- {?eh,start_info,{1,1,8}},
- {?eh,tc_start,{config_static_SUITE,init_per_suite}},
- {?eh,tc_done,{config_static_SUITE,init_per_suite,ok}},
- {?eh,tc_start,{config_static_SUITE,test_get_config_simple}},
- {?eh,tc_done,{config_static_SUITE,test_get_config_simple,ok}},
- {?eh,test_stats,{1,0,{0,0}}},
- {?eh,tc_start,{config_static_SUITE,test_get_config_nested}},
- {?eh,tc_done,{config_static_SUITE,test_get_config_nested,ok}},
- {?eh,test_stats,{2,0,{0,0}}},
- {?eh,tc_start,{config_static_SUITE,test_default_suitewide}},
- {?eh,tc_done,{config_static_SUITE,test_default_suitewide,ok}},
- {?eh,test_stats,{3,0,{0,0}}},
- {?eh,tc_start,{config_static_SUITE,test_config_name_already_in_use1}},
- {?eh,tc_done,
- {config_static_SUITE,test_config_name_already_in_use1,{skipped,{config_name_already_in_use,[x1]}}}},
- {?eh,test_stats,{3,0,{1,0}}},
- {?eh,tc_start,{config_static_SUITE,test_default_tclocal}},
- {?eh,tc_done,{config_static_SUITE,test_default_tclocal,ok}},
- {?eh,test_stats,{4,0,{1,0}}},
- {?eh,tc_start,{config_static_SUITE,test_config_name_already_in_use2}},
- {?eh,tc_done,
- {config_static_SUITE,test_config_name_already_in_use2,
- {skipped,{config_name_already_in_use,[x1,alias]}}}},
- {?eh,test_stats,{4,0,{2,0}}},
- {?eh,tc_start,{config_static_SUITE,test_alias_tclocal}},
- {?eh,tc_done,{config_static_SUITE,test_alias_tclocal,ok}},
- {?eh,test_stats,{5,0,{2,0}}},
- {?eh,tc_start,{config_static_SUITE,test_get_config_undefined}},
- {?eh,tc_done,{config_static_SUITE,test_get_config_undefined,ok}},
- {?eh,test_stats,{6,0,{2,0}}},
- {?eh,tc_start,{config_static_SUITE,end_per_suite}},
- {?eh,tc_done,{config_static_SUITE,end_per_suite,ok}},
- {?eh,test_done,{'DEF','STOP_TIME'}},
- {?eh,stop_logging,[]}
-];
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,start_info,{1,1,8}},
+ {?eh,tc_start,{config_static_SUITE,init_per_suite}},
+ {?eh,tc_done,{config_static_SUITE,init_per_suite,ok}},
+ {?eh,tc_start,{config_static_SUITE,test_get_config_simple}},
+ {?eh,tc_done,{config_static_SUITE,test_get_config_simple,ok}},
+ {?eh,test_stats,{1,0,{0,0}}},
+ {?eh,tc_start,{config_static_SUITE,test_get_config_nested}},
+ {?eh,tc_done,{config_static_SUITE,test_get_config_nested,ok}},
+ {?eh,test_stats,{2,0,{0,0}}},
+ {?eh,tc_start,{config_static_SUITE,test_default_suitewide}},
+ {?eh,tc_done,{config_static_SUITE,test_default_suitewide,ok}},
+ {?eh,test_stats,{3,0,{0,0}}},
+ {?eh,tc_start,{config_static_SUITE,test_config_name_already_in_use1}},
+ {?eh,tc_done,
+ {config_static_SUITE,test_config_name_already_in_use1,{skipped,{config_name_already_in_use,[x1]}}}},
+ {?eh,test_stats,{3,0,{1,0}}},
+ {?eh,tc_start,{config_static_SUITE,test_default_tclocal}},
+ {?eh,tc_done,{config_static_SUITE,test_default_tclocal,ok}},
+ {?eh,test_stats,{4,0,{1,0}}},
+ {?eh,tc_start,{config_static_SUITE,test_config_name_already_in_use2}},
+ {?eh,tc_done,
+ {config_static_SUITE,test_config_name_already_in_use2,
+ {skipped,{config_name_already_in_use,[x1,alias]}}}},
+ {?eh,test_stats,{4,0,{2,0}}},
+ {?eh,tc_start,{config_static_SUITE,test_alias_tclocal}},
+ {?eh,tc_done,{config_static_SUITE,test_alias_tclocal,ok}},
+ {?eh,test_stats,{5,0,{2,0}}},
+ {?eh,tc_start,{config_static_SUITE,test_get_config_undefined}},
+ {?eh,tc_done,{config_static_SUITE,test_get_config_undefined,ok}},
+ {?eh,test_stats,{6,0,{2,0}}},
+ {?eh,tc_start,{config_static_SUITE,end_per_suite}},
+ {?eh,tc_done,{config_static_SUITE,end_per_suite,ok}},
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,stop_logging,[]}
+ ];
expected_events(config_dynamic_SUITE)->
-[
- {?eh,start_logging,{'DEF','RUNDIR'}},
- {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
- {?eh,start_info,{1,1,5}},
- {?eh,tc_start,{config_dynamic_SUITE,init_per_suite}},
- {?eh,tc_done,{config_dynamic_SUITE,init_per_suite,ok}},
- {?eh,tc_start,{config_dynamic_SUITE,test_get_known_variable}},
- {?eh,tc_done,
- {config_dynamic_SUITE,test_get_known_variable,ok}},
- {?eh,test_stats,{1,0,{0,0}}},
- {?eh,tc_start,{config_dynamic_SUITE,test_localtime_update}},
- {?eh,tc_done,{config_dynamic_SUITE,test_localtime_update,ok}},
- {?eh,test_stats,{2,0,{0,0}}},
- {?eh,tc_start,{config_dynamic_SUITE,test_server_pid}},
- {?eh,tc_done,{config_dynamic_SUITE,test_server_pid,ok}},
- {?eh,test_stats,{3,0,{0,0}}},
- {?eh,tc_start,
- {config_dynamic_SUITE,test_disappearable_variable}},
- {?eh,tc_done,
- {config_dynamic_SUITE,test_disappearable_variable,ok}},
- {?eh,test_stats,{4,0,{0,0}}},
- {?eh,tc_start,
- {config_dynamic_SUITE,test_disappearable_variable_alias}},
- {?eh,tc_done,
- {config_dynamic_SUITE,test_disappearable_variable_alias,ok}},
- {?eh,test_stats,{5,0,{0,0}}},
- {?eh,tc_start,{config_dynamic_SUITE,end_per_suite}},
- {?eh,tc_done,{config_dynamic_SUITE,end_per_suite,ok}},
- {?eh,test_done,{'DEF','STOP_TIME'}},
- {?eh,stop_logging,[]}
-].
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,start_info,{1,1,5}},
+ {?eh,tc_start,{config_dynamic_SUITE,init_per_suite}},
+ {?eh,tc_done,{config_dynamic_SUITE,init_per_suite,ok}},
+ {?eh,tc_start,{config_dynamic_SUITE,test_get_known_variable}},
+ {?eh,tc_done,
+ {config_dynamic_SUITE,test_get_known_variable,ok}},
+ {?eh,test_stats,{1,0,{0,0}}},
+ {?eh,tc_start,{config_dynamic_SUITE,test_localtime_update}},
+ {?eh,tc_done,{config_dynamic_SUITE,test_localtime_update,ok}},
+ {?eh,test_stats,{2,0,{0,0}}},
+ {?eh,tc_start,{config_dynamic_SUITE,test_server_pid}},
+ {?eh,tc_done,{config_dynamic_SUITE,test_server_pid,ok}},
+ {?eh,test_stats,{3,0,{0,0}}},
+ {?eh,tc_start,
+ {config_dynamic_SUITE,test_disappearable_variable}},
+ {?eh,tc_done,
+ {config_dynamic_SUITE,test_disappearable_variable,ok}},
+ {?eh,test_stats,{4,0,{0,0}}},
+ {?eh,tc_start,
+ {config_dynamic_SUITE,test_disappearable_variable_alias}},
+ {?eh,tc_done,
+ {config_dynamic_SUITE,test_disappearable_variable_alias,ok}},
+ {?eh,test_stats,{5,0,{0,0}}},
+ {?eh,tc_start,{config_dynamic_SUITE,end_per_suite}},
+ {?eh,tc_done,{config_dynamic_SUITE,end_per_suite,ok}},
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,stop_logging,[]}
+ ].
diff --git a/lib/common_test/test/ct_error_SUITE.erl b/lib/common_test/test/ct_error_SUITE.erl
index 2fa031b884..6867e59b60 100644
--- a/lib/common_test/test/ct_error_SUITE.erl
+++ b/lib/common_test/test/ct_error_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
@@ -29,7 +29,7 @@
-compile(export_all).
--include_lib("test_server/include/test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include_lib("common_test/include/ct_event.hrl").
-define(eh, ct_test_support_eh).
@@ -56,19 +56,22 @@ init_per_testcase(TestCase, Config) ->
end_per_testcase(TestCase, Config) ->
ct_test_support:end_per_testcase(TestCase, Config).
-all(doc) ->
- [""];
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [cfg_error, lib_error, no_compile, timetrap_end_conf,
+ timetrap_normal, timetrap_extended].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
-all(suite) ->
- [
- cfg_error,
- lib_error,
- no_compile,
- timetrap_end_conf,
- timetrap_normal,
- timetrap_extended
- ].
-
%%--------------------------------------------------------------------
%% TEST CASES
@@ -99,8 +102,9 @@ cfg_error(Config) when is_list(Config) ->
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(cfg_error,
- reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ reformat(Events, ?eh),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents = events_to_check(cfg_error),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
@@ -117,12 +121,13 @@ lib_error(Config) when is_list(Config) ->
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(lib_error,
- reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ reformat(Events, ?eh),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents = events_to_check(lib_error),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
-
+
%%%-----------------------------------------------------------------
%%%
@@ -135,12 +140,13 @@ no_compile(Config) when is_list(Config) ->
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(no_compile,
- reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ reformat(Events, ?eh),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents = events_to_check(no_compile),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
-
+
%%%-----------------------------------------------------------------
%%%
timetrap_end_conf(Config) when is_list(Config) ->
@@ -153,7 +159,8 @@ timetrap_end_conf(Config) when is_list(Config) ->
ct_test_support:log_events(timetrap_end_conf,
reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents = events_to_check(timetrap_end_conf),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
@@ -173,7 +180,8 @@ timetrap_normal(Config) when is_list(Config) ->
ct_test_support:log_events(timetrap_normal,
reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents = events_to_check(timetrap_normal),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
@@ -195,12 +203,31 @@ timetrap_extended(Config) when is_list(Config) ->
ct_test_support:log_events(timetrap_extended,
reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents = events_to_check(timetrap_extended),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
%%%-----------------------------------------------------------------
+%%%
+timetrap_parallel(Config) when is_list(Config) ->
+ DataDir = ?config(data_dir, Config),
+ Join = fun(D, S) -> filename:join(D, "error/test/"++S) end,
+ Suite = Join(DataDir, "timetrap_3_SUITE"),
+ {Opts,ERPid} = setup([{suite,Suite}], Config),
+ ok = ct_test_support:run(Opts, Config),
+ Events = ct_test_support:get_events(ERPid, Config),
+
+ ct_test_support:log_events(timetrap_parallel,
+ reformat(Events, ?eh),
+ ?config(priv_dir, Config),
+ Opts),
+
+ TestEvents = events_to_check(timetrap_parallel),
+ ok = ct_test_support:verify_events(TestEvents, Events, Config).
+
+%%%-----------------------------------------------------------------
%%% HELP FUNCTIONS
%%%-----------------------------------------------------------------
@@ -214,8 +241,8 @@ setup(Test, Config) ->
reformat(Events, EH) ->
ct_test_support:reformat(Events, EH).
-%reformat(Events, _EH) ->
-% Events.
+ %reformat(Events, _EH) ->
+ % Events.
%%%-----------------------------------------------------------------
%%% TEST EVENTS
@@ -233,7 +260,7 @@ test_events(cfg_error) ->
[
{?eh,start_logging,{'DEF','RUNDIR'}},
{?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
- {?eh,start_info,{14,14,42}},
+ {?eh,start_info,{14,14,43}},
{?eh,tc_start,{cfg_error_1_SUITE,init_per_suite}},
{?eh,tc_done,
@@ -248,7 +275,7 @@ test_events(cfg_error) ->
{?eh,test_stats,{0,0,{0,2}}},
{?eh,tc_auto_skip,
{cfg_error_1_SUITE,end_per_suite,{failed,{cfg_error_1_SUITE,init_per_suite,
- {'EXIT',init_per_suite_fails}}}}},
+ {'EXIT',init_per_suite_fails}}}}},
{?eh,tc_start,{cfg_error_2_SUITE,init_per_suite}},
{?eh,tc_done,
@@ -378,12 +405,12 @@ test_events(cfg_error) ->
{?eh,tc_auto_skip,
{cfg_error_8_SUITE,tc1,
{failed,{cfg_error_8_SUITE,init_per_group,
- {'EXIT',{init_per_group_fails,g1}}}}}},
+ {'EXIT',{init_per_group_fails,g1}}}}}},
{?eh,test_stats,{4,0,{0,11}}},
{?eh,tc_auto_skip,
{cfg_error_8_SUITE,end_per_group,
{failed,{cfg_error_8_SUITE,init_per_group,
- {'EXIT',{init_per_group_fails,g1}}}}}}],
+ {'EXIT',{init_per_group_fails,g1}}}}}}],
[{?eh,tc_start,{cfg_error_8_SUITE,{init_per_group,g2,[]}}},
{?eh,tc_done,{cfg_error_8_SUITE,
@@ -396,13 +423,12 @@ test_events(cfg_error) ->
{?eh,tc_auto_skip,{cfg_error_8_SUITE,end_per_group,
{failed,{cfg_error_8_SUITE,init_per_group,
{timetrap_timeout,2000}}}}}],
-
+
[{?eh,tc_start,{cfg_error_8_SUITE,{init_per_group,g3,[]}}},
{?eh,tc_done,
{cfg_error_8_SUITE,{init_per_group,g3,[]},
{failed,{error,{{badmatch,42},
[{cfg_error_8_SUITE,init_per_group,2},
- {cfg_error_8_SUITE,init_per_group,2},
{test_server,my_apply,3},
{test_server,ts_tc,3},
{test_server,run_test_case_eval1,6},
@@ -412,7 +438,6 @@ test_events(cfg_error) ->
{failed,{cfg_error_8_SUITE,init_per_group,
{'EXIT',{{badmatch,42},
[{cfg_error_8_SUITE,init_per_group,2},
- {cfg_error_8_SUITE,init_per_group,2},
{test_server,my_apply,3},
{test_server,ts_tc,3},
{test_server,run_test_case_eval1,6},
@@ -423,7 +448,6 @@ test_events(cfg_error) ->
{failed,{cfg_error_8_SUITE,init_per_group,
{'EXIT',{{badmatch,42},
[{cfg_error_8_SUITE,init_per_group,2},
- {cfg_error_8_SUITE,init_per_group,2},
{test_server,my_apply,3},
{test_server,ts_tc,3},
{test_server,run_test_case_eval1,6},
@@ -436,7 +460,7 @@ test_events(cfg_error) ->
{?eh,test_stats,{5,0,{0,13}}},
{?eh,tc_start,{cfg_error_8_SUITE,{end_per_group,g4,[]}}},
{?eh,tc_done,{cfg_error_8_SUITE,{end_per_group,g4,[]},ok}}],
-
+
[{?eh,tc_start,{cfg_error_8_SUITE,{init_per_group,g5,[]}}},
{?eh,tc_done,{cfg_error_8_SUITE,{init_per_group,g5,[]},ok}},
{?eh,tc_start,{cfg_error_8_SUITE,tc1}},
@@ -517,16 +541,19 @@ test_events(cfg_error) ->
%%! end_tc failes the testcase
{?eh,tc_done,{cfg_error_9_SUITE,tc6,ok}},
{?eh,test_stats,{9,2,{0,18}}},
+ {?eh,tc_start,{cfg_error_9_SUITE,tc7}},
+ {?eh,tc_done,{cfg_error_9_SUITE,tc7,{failed,{error,tc7_should_be_failed}}}},
+ {ct_test_support_eh,test_stats,{9,3,{0,18}}},
{?eh,tc_start,{cfg_error_9_SUITE,tc11}},
{?eh,tc_done,{cfg_error_9_SUITE,tc11,
{failed,{cfg_error_9_SUITE,end_per_testcase,
{'EXIT',warning_should_be_printed}}}}},
- {?eh,test_stats,{10,2,{0,18}}},
+ {?eh,test_stats,{10,3,{0,18}}},
{?eh,tc_start,{cfg_error_9_SUITE,tc12}},
{?eh,tc_done,{cfg_error_9_SUITE,tc12,
{failed,{cfg_error_9_SUITE,end_per_testcase,
{timetrap_timeout,2000}}}}},
- {?eh,test_stats,{11,2,{0,18}}},
+ {?eh,test_stats,{11,3,{0,18}}},
{?eh,tc_start,{cfg_error_9_SUITE,tc13}},
{?eh,tc_done,{cfg_error_9_SUITE,tc13,
{failed,{cfg_error_9_SUITE,end_per_testcase,
@@ -536,11 +563,11 @@ test_events(cfg_error) ->
{test_server,do_end_per_testcase,4},
{test_server,run_test_case_eval1,6},
{test_server,run_test_case_eval,8}]}}}}}},
- {?eh,test_stats,{12,2,{0,18}}},
+ {?eh,test_stats,{12,3,{0,18}}},
{?eh,tc_start,{cfg_error_9_SUITE,tc14}},
{?eh,tc_done,
{cfg_error_9_SUITE,tc14,{failed,{error,tc14_should_be_failed}}}},
- {?eh,test_stats,{12,3,{0,18}}},
+ {?eh,test_stats,{12,4,{0,18}}},
{?eh,tc_start,{cfg_error_9_SUITE,end_per_suite}},
{?eh,tc_done,{cfg_error_9_SUITE,end_per_suite,ok}},
@@ -551,7 +578,7 @@ test_events(cfg_error) ->
{?eh,tc_auto_skip,{cfg_error_10_SUITE,tc1,
{failed,{cfg_error_10_SUITE,init_per_suite,
{failed,fail_init_per_suite}}}}},
- {?eh,test_stats,{12,3,{0,19}}},
+ {?eh,test_stats,{12,4,{0,19}}},
{?eh,tc_auto_skip,{cfg_error_10_SUITE,end_per_suite,
{failed,{cfg_error_10_SUITE,init_per_suite,
{failed,fail_init_per_suite}}}}},
@@ -560,40 +587,40 @@ test_events(cfg_error) ->
{?eh,tc_start,{cfg_error_11_SUITE,tc1}},
{?eh,tc_done,{cfg_error_11_SUITE,tc1,
{skipped,{config_name_already_in_use,[dummy0]}}}},
- {?eh,test_stats,{12,3,{1,19}}},
+ {?eh,test_stats,{12,4,{1,19}}},
{?eh,tc_start,{cfg_error_11_SUITE,tc2}},
{?eh,tc_done,{cfg_error_11_SUITE,tc2,ok}},
- {?eh,test_stats,{13,3,{1,19}}},
+ {?eh,test_stats,{13,4,{1,19}}},
{?eh,tc_start,{cfg_error_11_SUITE,end_per_suite}},
{?eh,tc_done,{cfg_error_11_SUITE,end_per_suite,ok}},
{?eh,tc_start,{cfg_error_12_SUITE,tc1}},
{?eh,tc_done,{cfg_error_12_SUITE,tc1,{failed,{timetrap_timeout,500}}}},
- {?eh,test_stats,{13,4,{1,19}}},
+ {?eh,test_stats,{13,5,{1,19}}},
{?eh,tc_start,{cfg_error_12_SUITE,tc2}},
{?eh,tc_done,{cfg_error_12_SUITE,tc2,{failed,
{cfg_error_12_SUITE,end_per_testcase,
{timetrap_timeout,500}}}}},
- {?eh,test_stats,{14,4,{1,19}}},
+ {?eh,test_stats,{14,5,{1,19}}},
{?eh,tc_start,{cfg_error_12_SUITE,tc3}},
{?eh,tc_done,{cfg_error_12_SUITE,tc3,ok}},
- {?eh,test_stats,{15,4,{1,19}}},
+ {?eh,test_stats,{15,5,{1,19}}},
{?eh,tc_start,{cfg_error_12_SUITE,tc4}},
{?eh,tc_done,{cfg_error_12_SUITE,tc4,{failed,
{cfg_error_12_SUITE,end_per_testcase,
{timetrap_timeout,500}}}}},
- {?eh,test_stats,{16,4,{1,19}}},
+ {?eh,test_stats,{16,5,{1,19}}},
{?eh,tc_start,{cfg_error_13_SUITE,init_per_suite}},
{?eh,tc_done,{cfg_error_13_SUITE,init_per_suite,ok}},
{?eh,tc_start,{cfg_error_13_SUITE,tc1}},
{?eh,tc_done,{cfg_error_13_SUITE,tc1,ok}},
- {?eh,test_stats,{17,4,{1,19}}},
+ {?eh,test_stats,{17,5,{1,19}}},
{?eh,tc_start,{cfg_error_13_SUITE,end_per_suite}},
{?eh,tc_done,{cfg_error_13_SUITE,end_per_suite,ok}},
{?eh,tc_start,{cfg_error_14_SUITE,init_per_suite}},
{?eh,tc_done,{cfg_error_14_SUITE,init_per_suite,ok}},
{?eh,tc_start,{cfg_error_14_SUITE,tc1}},
{?eh,tc_done,{cfg_error_14_SUITE,tc1,ok}},
- {?eh,test_stats,{18,4,{1,19}}},
+ {?eh,test_stats,{18,5,{1,19}}},
{?eh,tc_start,{cfg_error_14_SUITE,end_per_suite}},
{?eh,tc_done,{cfg_error_14_SUITE,end_per_suite,
{comment,
@@ -726,7 +753,7 @@ test_events(timetrap_normal) ->
[
{?eh,start_logging,{'DEF','RUNDIR'}},
{?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
- {?eh,start_info,{1,1,3}},
+ {?eh,start_info,{1,1,4}},
{?eh,tc_start,{timetrap_2_SUITE,init_per_suite}},
{?eh,tc_done,{timetrap_2_SUITE,init_per_suite,ok}},
{?eh,tc_start,{timetrap_2_SUITE,tc0}},
@@ -741,6 +768,9 @@ test_events(timetrap_normal) ->
{?eh,tc_done,
{timetrap_2_SUITE,tc2,{failed,{timetrap_timeout,500}}}},
{?eh,test_stats,{0,3,{0,0}}},
+ {?eh,tc_start,{timetrap_2_SUITE,tc3}},
+ {?eh,tc_done,{timetrap_2_SUITE,tc3,ok}},
+ {?eh,test_stats,{1,3,{0,0}}},
{?eh,tc_start,{timetrap_2_SUITE,end_per_suite}},
{?eh,tc_done,{timetrap_2_SUITE,end_per_suite,ok}},
{?eh,test_done,{'DEF','STOP_TIME'}},
@@ -751,7 +781,7 @@ test_events(timetrap_extended) ->
[
{?eh,start_logging,{'DEF','RUNDIR'}},
{?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
- {?eh,start_info,{1,1,3}},
+ {?eh,start_info,{1,1,4}},
{?eh,tc_start,{timetrap_2_SUITE,init_per_suite}},
{?eh,tc_done,{timetrap_2_SUITE,init_per_suite,ok}},
{?eh,tc_start,{timetrap_2_SUITE,tc0}},
@@ -766,8 +796,52 @@ test_events(timetrap_extended) ->
{?eh,tc_done,
{timetrap_2_SUITE,tc2,{failed,{timetrap_timeout,1000}}}},
{?eh,test_stats,{0,3,{0,0}}},
+ {?eh,tc_start,{timetrap_2_SUITE,tc3}},
+ {?eh,tc_done,{timetrap_2_SUITE,tc3,ok}},
+ {?eh,test_stats,{1,3,{0,0}}},
{?eh,tc_start,{timetrap_2_SUITE,end_per_suite}},
{?eh,tc_done,{timetrap_2_SUITE,end_per_suite,ok}},
{?eh,test_done,{'DEF','STOP_TIME'}},
{?eh,stop_logging,[]}
- ].
+ ];
+
+test_events(timetrap_parallel) ->
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,start_info,{1,1,7}},
+ {?eh,tc_done,{timetrap_3_SUITE,init_per_suite,ok}},
+ {parallel,
+ [{?eh,tc_start,
+ {timetrap_3_SUITE,{init_per_group,g1,[parallel]}}},
+ {?eh,tc_done,
+ {timetrap_3_SUITE,{init_per_group,g1,[parallel]},ok}},
+ {?eh,tc_start,{timetrap_3_SUITE,tc0}},
+ {?eh,tc_start,{timetrap_3_SUITE,tc1}},
+ {?eh,tc_start,{timetrap_3_SUITE,tc2}},
+ {?eh,tc_start,{timetrap_3_SUITE,tc3}},
+ {?eh,tc_start,{timetrap_3_SUITE,tc4}},
+ {?eh,tc_start,{timetrap_3_SUITE,tc6}},
+ {?eh,tc_start,{timetrap_3_SUITE,tc7}},
+ {?eh,tc_done,
+ {timetrap_3_SUITE,tc1,{failed,{timetrap_timeout,500}}}},
+ {?eh,tc_done,
+ {timetrap_3_SUITE,tc2,{failed,{timetrap_timeout,1000}}}},
+ {?eh,tc_done,
+ {timetrap_3_SUITE,tc6,{failed,{timetrap_timeout,1000}}}},
+ {?eh,tc_done,
+ {timetrap_3_SUITE,tc7,{failed,{timetrap_timeout,1500}}}},
+ {?eh,tc_done,
+ {timetrap_3_SUITE,tc0,{failed,{timetrap_timeout,2000}}}},
+ {?eh,tc_done,
+ {timetrap_3_SUITE,tc4,{failed,{timetrap_timeout,2000}}}},
+ {?eh,tc_done,
+ {timetrap_3_SUITE,tc3,{failed,{timetrap_timeout,3000}}}},
+ {?eh,test_stats,{0,7,{0,0}}},
+ {?eh,tc_start,
+ {timetrap_3_SUITE,{end_per_group,g1,[parallel]}}},
+ {?eh,tc_done,
+ {timetrap_3_SUITE,{end_per_group,g1,[parallel]},ok}}]},
+ {?eh,tc_done,{timetrap_3_SUITE,end_per_suite,ok}},
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,stop_logging,[]}].
diff --git a/lib/common_test/test/ct_error_SUITE_data/error/test/cfg_error_9_SUITE.erl b/lib/common_test/test/ct_error_SUITE_data/error/test/cfg_error_9_SUITE.erl
index d73287ad62..40b7d2da47 100644
--- a/lib/common_test/test/ct_error_SUITE_data/error/test/cfg_error_9_SUITE.erl
+++ b/lib/common_test/test/ct_error_SUITE_data/error/test/cfg_error_9_SUITE.erl
@@ -83,6 +83,8 @@ init_per_testcase(tc3, Config) ->
Config;
init_per_testcase(tc4, _) ->
ok;
+init_per_testcase(tc7, _) ->
+ {fail,tc7_should_be_failed};
init_per_testcase(_, Config) ->
Config.
@@ -136,7 +138,7 @@ groups() ->
%% Reason = term()
%%--------------------------------------------------------------------
all() ->
- [tc1,tc2,tc3,tc4,tc5,tc6,
+ [tc1,tc2,tc3,tc4,tc5,tc6,tc7,
tc11,tc12,tc13,tc14].
tc1(_) ->
@@ -171,6 +173,11 @@ tc6(_) ->
ct:comment("This one should succeed but then get failed by end_tc!"),
fini.
+tc7(_) ->
+ ct:comment("This one should get failed by iptc!"),
+ fini.
+
+
tc11(_) ->
fini.
tc12(_) ->
diff --git a/lib/common_test/test/ct_error_SUITE_data/error/test/timetrap_2_SUITE.erl b/lib/common_test/test/ct_error_SUITE_data/error/test/timetrap_2_SUITE.erl
index 99bb400137..7fcb631d06 100644
--- a/lib/common_test/test/ct_error_SUITE_data/error/test/timetrap_2_SUITE.erl
+++ b/lib/common_test/test/ct_error_SUITE_data/error/test/timetrap_2_SUITE.erl
@@ -77,8 +77,8 @@ init_per_testcase(tc1, Config) ->
ct:timetrap({seconds,1}),
Config;
-init_per_testcase(tc3, Config) ->
- ct:timetrap({seconds,1}),
+init_per_testcase(tc2, Config) ->
+ ct:timetrap(250),
Config;
init_per_testcase(_TestCase, Config) ->
@@ -90,7 +90,7 @@ init_per_testcase(_TestCase, Config) ->
%% TestCase = atom()
%% Config0 = Config1 = [tuple()]
%%--------------------------------------------------------------------
-end_per_testcase(_, Config) ->
+end_per_testcase(_, _Config) ->
ok.
%%--------------------------------------------------------------------
@@ -116,7 +116,7 @@ groups() ->
%% Reason = term()
%%--------------------------------------------------------------------
all() ->
- [tc0,tc1,tc2].
+ [tc0,tc1,tc2,tc3].
tc0(_) ->
N = list_to_integer(ct:get_config(multiply)),
@@ -131,8 +131,24 @@ tc1(_) ->
ok.
tc2(_) ->
+ ct:timetrap(500),
N = list_to_integer(ct:get_config(multiply)),
ct:comment(io_lib:format("TO after ~w sec", [0.5*N])),
- ct:timetrap(500),
ct:sleep(2000),
ok.
+
+tc3() ->
+ [{timetrap,{seconds,2}}].
+
+tc3(_) ->
+ T0 = now(),
+ ct:timetrap(infinity),
+ N = list_to_integer(ct:get_config(multiply)),
+ ct:comment(io_lib:format("Sleeping for ~w sec...", [4*N])),
+ ct:sleep(4000),
+ Diff = timer:now_diff(now(), T0),
+ if ((Diff < (N*4000000)) or (Diff > (N*4500000))) ->
+ exit(not_expected);
+ true ->
+ ok
+ end.
diff --git a/lib/common_test/test/ct_event_handler_SUITE.erl b/lib/common_test/test/ct_event_handler_SUITE.erl
index 00a4c4ded3..b534a7141d 100644
--- a/lib/common_test/test/ct_event_handler_SUITE.erl
+++ b/lib/common_test/test/ct_event_handler_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -28,7 +28,7 @@
-compile(export_all).
--include_lib("test_server/include/test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
%-include_lib("common_test/include/ct_event.hrl").
@@ -56,12 +56,21 @@ init_per_testcase(TestCase, Config) ->
end_per_testcase(TestCase, Config) ->
ct_test_support:end_per_testcase(TestCase, Config).
-all(doc) ->
- [];
+suite() -> [{ct_hooks,[ts_install_cth]}].
-all(suite) ->
+all() ->
[start_stop, results].
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%--------------------------------------------------------------------
%% TEST CASES
@@ -93,8 +102,9 @@ start_stop(Config) when is_list(Config) ->
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(start_stop,
- ct_test_support:reformat(Events, eh_A),
- ?config(priv_dir, Config)),
+ ct_test_support:reformat(Events, eh_A),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents =
[{eh_A,start_logging,{'DEF','RUNDIR'}},
@@ -139,8 +149,9 @@ results(Config) when is_list(Config) ->
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(results,
- ct_test_support:reformat(Events, eh_A),
- ?config(priv_dir, Config)),
+ ct_test_support:reformat(Events, eh_A),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents =
[{eh_A,start_logging,{'DEF','RUNDIR'}},
diff --git a/lib/common_test/test/ct_groups_test_1_SUITE.erl b/lib/common_test/test/ct_groups_test_1_SUITE.erl
index 64d61fc104..e520a72227 100644
--- a/lib/common_test/test/ct_groups_test_1_SUITE.erl
+++ b/lib/common_test/test/ct_groups_test_1_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
@@ -29,7 +29,7 @@
-compile(export_all).
--include_lib("test_server/include/test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include_lib("common_test/include/ct_event.hrl").
-define(eh, ct_test_support_eh).
@@ -56,12 +56,21 @@ init_per_testcase(TestCase, Config) ->
end_per_testcase(TestCase, Config) ->
ct_test_support:end_per_testcase(TestCase, Config).
-all(doc) ->
- ["Run smoke tests of Common Test."];
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [groups_suite_1, groups_suite_2, groups_suites_1,
+ groups_dir_1, groups_dirs_1].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [groups_suite_1, groups_suite_2,
- groups_suites_1, groups_dir_1, groups_dirs_1].
%%--------------------------------------------------------------------
%% TEST CASES
@@ -80,8 +89,9 @@ groups_suite_1(Config) when is_list(Config) ->
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(groups_suite_1,
- reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ reformat(Events, ?eh),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents = events_to_check(groups_suite_1),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
@@ -100,8 +110,9 @@ groups_suite_2(Config) when is_list(Config) ->
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(groups_suite_2,
- reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ reformat(Events, ?eh),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents = events_to_check(groups_suite_2),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
@@ -121,8 +132,9 @@ groups_suites_1(Config) when is_list(Config) ->
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(groups_suites_1,
- reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ reformat(Events, ?eh),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents = events_to_check(groups_suites_1),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
@@ -141,8 +153,9 @@ groups_dir_1(Config) when is_list(Config) ->
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(groups_dir_1,
- reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ reformat(Events, ?eh),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents = events_to_check(groups_dir_1),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
@@ -161,8 +174,9 @@ groups_dirs_1(Config) when is_list(Config) ->
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(groups_dirs_1,
- reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ reformat(Events, ?eh),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents = events_to_check(groups_dirs_1),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
diff --git a/lib/common_test/test/ct_groups_test_2_SUITE.erl b/lib/common_test/test/ct_groups_test_2_SUITE.erl
index c4371501b3..f33be8a9d4 100644
--- a/lib/common_test/test/ct_groups_test_2_SUITE.erl
+++ b/lib/common_test/test/ct_groups_test_2_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
@@ -29,7 +29,7 @@
-compile(export_all).
--include_lib("test_server/include/test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include_lib("common_test/include/ct_event.hrl").
-define(eh, ct_test_support_eh).
@@ -56,11 +56,20 @@ init_per_testcase(TestCase, Config) ->
end_per_testcase(TestCase, Config) ->
ct_test_support:end_per_testcase(TestCase, Config).
-all(doc) ->
- ["Run smoke tests of Common Test."];
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [missing_conf, repeat_1, empty_group].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [missing_conf, repeat_1].
%%--------------------------------------------------------------------
%% TEST CASES
@@ -74,13 +83,14 @@ missing_conf(Config) when is_list(Config) ->
Suite = filename:join(DataDir, "groups_1/missing_conf_SUITE"),
- {Opts,ERPid} = setup({suite,Suite}, Config),
+ {Opts,ERPid} = setup([{suite,Suite}], Config),
ok = ct_test_support:run(Opts, Config),
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(missing_conf_SUITE,
- reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ reformat(Events, ?eh),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents = events_to_check(missing_conf),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
@@ -93,18 +103,41 @@ repeat_1(Config) when is_list(Config) ->
Suite = filename:join(DataDir, "groups_1/repeat_1_SUITE"),
- {Opts,ERPid} = setup({suite,Suite}, Config),
+ {Opts,ERPid} = setup([{suite,Suite}], Config),
ok = ct_test_support:run(Opts, Config),
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(repeat_1,
reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents = events_to_check(repeat_1),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
%%%-----------------------------------------------------------------
+%%%
+
+empty_group(Config) when is_list(Config) ->
+ DataDir = ?config(data_dir, Config),
+
+ Suite = filename:join(DataDir, "groups_2/groups_22_SUITE"),
+
+ {Opts,ERPid} = setup([{suite,Suite},
+ {group,[test_group_8,test_group_9,test_group_10]}],
+ Config),
+ ok = ct_test_support:run(Opts, Config),
+ Events = ct_test_support:get_events(ERPid, Config),
+
+ ct_test_support:log_events(empty_group,
+ reformat(Events, ?eh),
+ ?config(priv_dir, Config),
+ Opts),
+
+ TestEvents = events_to_check(empty_group),
+ ok = ct_test_support:verify_events(TestEvents, Events, Config).
+
+%%%-----------------------------------------------------------------
%%% HELP FUNCTIONS
%%%-----------------------------------------------------------------
@@ -112,7 +145,7 @@ setup(Test, Config) ->
Opts0 = ct_test_support:get_opts(Config),
Level = ?config(trace_level, Config),
EvHArgs = [{cbm,ct_test_support},{trace_level,Level}],
- Opts = Opts0 ++ [Test,{event_handler,{?eh,EvHArgs}}],
+ Opts = Opts0 ++ [{event_handler,{?eh,EvHArgs}} | Test],
ERPid = ct_test_support:start_event_receiver(Config),
{Opts,ERPid}.
@@ -247,4 +280,27 @@ test_events(repeat_1) ->
{?eh,tc_done,{repeat_1_SUITE,end_per_suite,ok}},
{?eh,test_done,{'DEF','STOP_TIME'}},
{?eh,stop_logging,[]}
+ ];
+
+test_events(empty_group) ->
+ [{?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,start_info,{1,1,1}},
+ {?eh,tc_start,{groups_22_SUITE,init_per_suite}},
+ {?eh,tc_done,{groups_22_SUITE,init_per_suite,ok}},
+ [{?eh,tc_start,
+ {groups_22_SUITE,{init_per_group,test_group_8,[]}}},
+ {?eh,tc_done,
+ {groups_22_SUITE,{init_per_group,test_group_8,[]},ok}},
+ {?eh,tc_start,{groups_22_SUITE,testcase_8}},
+ {?eh,tc_done,{groups_22_SUITE,testcase_8,ok}},
+ {?eh,test_stats,{1,0,{0,0}}},
+ {?eh,tc_start,
+ {groups_22_SUITE,{end_per_group,test_group_8,[]}}},
+ {?eh,tc_done,
+ {groups_22_SUITE,{end_per_group,test_group_8,[]},ok}}],
+ {?eh,tc_start,{groups_22_SUITE,end_per_suite}},
+ {?eh,tc_done,{groups_22_SUITE,end_per_suite,init}},
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,stop_logging,[]}
].
diff --git a/lib/common_test/test/ct_groups_test_2_SUITE_data/groups_2/groups_22_SUITE.erl b/lib/common_test/test/ct_groups_test_2_SUITE_data/groups_2/groups_22_SUITE.erl
index cd517876df..14eb8769ad 100644
--- a/lib/common_test/test/ct_groups_test_2_SUITE_data/groups_2/groups_22_SUITE.erl
+++ b/lib/common_test/test/ct_groups_test_2_SUITE_data/groups_2/groups_22_SUITE.erl
@@ -31,27 +31,33 @@ suite() ->
groups() ->
[
- {test_group_1a, [shuffle], [testcase_1a,testcase_1b,testcase_1c]},
+ {test_group_1a, [shuffle], [testcase_1a,testcase_1b,testcase_1c]},
- {test_group_1b, [parallel], [testcase_1a,testcase_1b]},
+ {test_group_1b, [parallel], [testcase_1a,testcase_1b]},
- {test_group_2, [parallel], [testcase_2a,
+ {test_group_2, [parallel], [testcase_2a,
- {test_group_3, [{repeat,1}],
- [testcase_3a, testcase_3b]},
+ {test_group_3, [{repeat,1}],
+ [testcase_3a, testcase_3b]},
- testcase_2b]},
+ testcase_2b]},
- {test_group_4, [{test_group_5, [parallel], [testcase_5a,
+ {test_group_4, [{test_group_5, [parallel], [testcase_5a,
- {group, test_group_6},
+ {group, test_group_6},
- testcase_5b]}]},
+ testcase_5b]}]},
- {test_group_6, [parallel], [{group, test_group_7}]},
+ {test_group_6, [parallel], [{group, test_group_7}]},
- {test_group_7, [sequence], [testcase_7a,testcase_7b]}
- ].
+ {test_group_7, [sequence], [testcase_7a,testcase_7b]},
+
+ {test_group_8, [], [{group, test_group_9}, testcase_8]},
+
+ {test_group_9, [], []},
+
+ {test_group_10, [], [{group, test_group_9}]}
+ ].
all() ->
[{group, test_group_1a},
@@ -60,7 +66,10 @@ all() ->
testcase_2,
{group, test_group_2},
testcase_3,
- {group, test_group_4}].
+ {group, test_group_4},
+ {group, test_group_8},
+ {group, test_group_9},
+ {group, test_group_10}].
%% this func only for internal test purposes
grs_and_tcs() ->
@@ -68,7 +77,9 @@ grs_and_tcs() ->
test_group_1a, test_group_1b,
test_group_2, test_group_3,
test_group_4, test_group_5,
- test_group_6, test_group_7
+ test_group_6, test_group_7,
+ test_group_8, test_group_9,
+ test_group_10
],
[
testcase_1a, testcase_1b, testcase_1c,
@@ -78,7 +89,8 @@ grs_and_tcs() ->
testcase_3a, testcase_3b,
testcase_3,
testcase_5a, testcase_5b,
- testcase_7a, testcase_7b
+ testcase_7a, testcase_7b,
+ testcase_8
]}.
%%--------------------------------------------------------------------
@@ -107,7 +119,10 @@ init_per_group(Group, Config) ->
{test_group_4,[{name,test_group_4}]} -> ok;
{test_group_5,[{name,test_group_5},parallel]} -> "parallel";
{test_group_6,[{name,test_group_6},parallel]} -> "parallel";
- {test_group_7,[{name,test_group_7},sequence]} -> "sequence"
+ {test_group_7,[{name,test_group_7},sequence]} -> "sequence";
+ {test_group_8,[{name,test_group_8}]} -> ok;
+ {test_group_9,[{name,test_group_9}]} -> ok;
+ {test_group_10,[{name,test_group_10}]} -> ok
end,
{Grs,_} = grs_and_tcs(),
case lists:member(Group, Grs) of
@@ -312,3 +327,7 @@ testcase_7b(Config) ->
undefined = ?config(testcase_7a,Config),
testcase_7b = ?config(testcase_7b,Config),
ok.
+testcase_8() ->
+ [].
+testcase_8(_Config) ->
+ ok.
diff --git a/lib/common_test/test/ct_hooks_SUITE.erl b/lib/common_test/test/ct_hooks_SUITE.erl
new file mode 100644
index 0000000000..8574d7aabc
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE.erl
@@ -0,0 +1,1044 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2009-2011. 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%
+%%
+
+%%%-------------------------------------------------------------------
+%%% File: ct_error_SUITE
+%%%
+%%% Description:
+%%% Test various errors in Common Test suites.
+%%%
+%%% The suites used for the test are located in the data directory.
+%%%-------------------------------------------------------------------
+-module(ct_hooks_SUITE).
+
+-compile(export_all).
+
+-include_lib("test_server/include/test_server.hrl").
+-include_lib("common_test/include/ct_event.hrl").
+
+-define(eh, ct_test_support_eh).
+
+%%--------------------------------------------------------------------
+%% TEST SERVER CALLBACK FUNCTIONS
+%%--------------------------------------------------------------------
+
+%%--------------------------------------------------------------------
+%% Description: Since Common Test starts another Test Server
+%% instance, the tests need to be performed on a separate node (or
+%% there will be clashes with logging processes etc).
+%%--------------------------------------------------------------------
+init_per_suite(Config) ->
+ DataDir = ?config(data_dir, Config),
+ TestDir = filename:join(DataDir,"cth/tests/"),
+ CTHs = filelib:wildcard(filename:join(TestDir,"*_cth.erl")),
+ io:format("CTHs: ~p",[CTHs]),
+ [io:format("Compiling ~p: ~p",
+ [FileName,compile:file(FileName,[{outdir,TestDir},debug_info])]) ||
+ FileName <- CTHs],
+ ct_test_support:init_per_suite([{path_dirs,[TestDir]} | Config]).
+
+end_per_suite(Config) ->
+ ct_test_support:end_per_suite(Config).
+
+init_per_testcase(TestCase, Config) ->
+ ct_test_support:init_per_testcase(TestCase, Config).
+
+end_per_testcase(TestCase, Config) ->
+ ct_test_support:end_per_testcase(TestCase, Config).
+
+
+suite() ->
+ [{timetrap,{seconds,20}}].
+
+all() ->
+ all(suite).
+
+all(suite) ->
+ lists:reverse(
+ [
+ one_cth, two_cth, faulty_cth_no_init, faulty_cth_id_no_init,
+ faulty_cth_exit_in_init, faulty_cth_exit_in_id,
+ faulty_cth_exit_in_init_scope_suite, minimal_cth,
+ minimal_and_maximal_cth, faulty_cth_undef,
+ scope_per_suite_cth, scope_per_group_cth, scope_suite_cth,
+ scope_per_suite_state_cth, scope_per_group_state_cth,
+ scope_suite_state_cth,
+ fail_pre_suite_cth, double_fail_pre_suite_cth,
+ fail_post_suite_cth, skip_pre_suite_cth,
+ skip_post_suite_cth, recover_post_suite_cth, update_config_cth,
+ state_update_cth, options_cth, same_id_cth,
+ fail_n_skip_with_minimal_cth
+ ]
+ )
+ .
+
+
+%%--------------------------------------------------------------------
+%% TEST CASES
+%%--------------------------------------------------------------------
+
+%%%-----------------------------------------------------------------
+%%%
+one_cth(Config) when is_list(Config) ->
+ do_test(one_empty_cth, "ct_cth_empty_SUITE.erl",[empty_cth], Config).
+
+two_cth(Config) when is_list(Config) ->
+ do_test(two_empty_cth, "ct_cth_empty_SUITE.erl",[empty_cth,empty_cth],
+ Config).
+
+faulty_cth_no_init(Config) when is_list(Config) ->
+ do_test(faulty_cth_no_init, "ct_cth_empty_SUITE.erl",[askjhdkljashdkaj],
+ Config,{error,"Failed to start CTH, see the "
+ "CT Log for details"}).
+
+faulty_cth_id_no_init(Config) when is_list(Config) ->
+ do_test(faulty_cth_id_no_init, "ct_cth_empty_SUITE.erl",[id_no_init_cth],
+ Config,{error,"Failed to start CTH, see the "
+ "CT Log for details"}).
+
+minimal_cth(Config) when is_list(Config) ->
+ do_test(minimal_cth, "ct_cth_empty_SUITE.erl",[minimal_cth],Config).
+
+minimal_and_maximal_cth(Config) when is_list(Config) ->
+ do_test(minimal_and_maximal_cth, "ct_cth_empty_SUITE.erl",
+ [minimal_cth, empty_cth],Config).
+
+faulty_cth_undef(Config) when is_list(Config) ->
+ do_test(faulty_cth_undef, "ct_cth_empty_SUITE.erl",
+ [undef_cth],Config).
+
+faulty_cth_exit_in_init_scope_suite(Config) when is_list(Config) ->
+ do_test(faulty_cth_exit_in_init_scope_suite,
+ "ct_exit_in_init_scope_suite_cth_SUITE.erl",
+ [],Config).
+
+faulty_cth_exit_in_init(Config) when is_list(Config) ->
+ do_test(faulty_cth_exit_in_init, "ct_cth_empty_SUITE.erl",
+ [crash_init_cth], Config,
+ {error,"Failed to start CTH, see the "
+ "CT Log for details"}).
+
+faulty_cth_exit_in_id(Config) when is_list(Config) ->
+ do_test(faulty_cth_exit_in_id, "ct_cth_empty_SUITE.erl",
+ [crash_id_cth], Config,
+ {error,"Failed to start CTH, see the "
+ "CT Log for details"}).
+
+scope_per_suite_cth(Config) when is_list(Config) ->
+ do_test(scope_per_suite_cth, "ct_scope_per_suite_cth_SUITE.erl",
+ [],Config).
+
+scope_suite_cth(Config) when is_list(Config) ->
+ do_test(scope_suite_cth, "ct_scope_suite_cth_SUITE.erl",
+ [],Config).
+
+scope_per_group_cth(Config) when is_list(Config) ->
+ do_test(scope_per_group_cth, "ct_scope_per_group_cth_SUITE.erl",
+ [],Config).
+
+scope_per_suite_state_cth(Config) when is_list(Config) ->
+ do_test(scope_per_suite_state_cth, "ct_scope_per_suite_state_cth_SUITE.erl",
+ [],Config).
+
+scope_suite_state_cth(Config) when is_list(Config) ->
+ do_test(scope_suite_state_cth, "ct_scope_suite_state_cth_SUITE.erl",
+ [],Config).
+
+scope_per_group_state_cth(Config) when is_list(Config) ->
+ do_test(scope_per_group_state_cth, "ct_scope_per_group_state_cth_SUITE.erl",
+ [],Config).
+
+fail_pre_suite_cth(Config) when is_list(Config) ->
+ do_test(fail_pre_suite_cth, "ct_cth_empty_SUITE.erl",
+ [fail_pre_suite_cth],Config).
+
+double_fail_pre_suite_cth(Config) when is_list(Config) ->
+ do_test(double_fail_pre_suite_cth, "{ct_scope_suite_crash_in_cth_SUITE.erl,"
+ "ct_scope_suite_cth_SUITE.erl}",
+ [],Config).
+
+fail_post_suite_cth(Config) when is_list(Config) ->
+ do_test(fail_post_suite_cth, "ct_cth_empty_SUITE.erl",
+ [fail_post_suite_cth],Config).
+
+skip_pre_suite_cth(Config) when is_list(Config) ->
+ do_test(skip_pre_suite_cth, "ct_cth_empty_SUITE.erl",
+ [skip_pre_suite_cth],Config).
+
+skip_post_suite_cth(Config) when is_list(Config) ->
+ do_test(skip_post_suite_cth, "ct_cth_empty_SUITE.erl",
+ [skip_post_suite_cth],Config).
+
+recover_post_suite_cth(Config) when is_list(Config) ->
+ do_test(recover_post_suite_cth, "ct_cth_fail_per_suite_SUITE.erl",
+ [recover_post_suite_cth],Config).
+
+update_config_cth(Config) when is_list(Config) ->
+ do_test(update_config_cth, "ct_update_config_SUITE.erl",
+ [update_config_cth],Config).
+
+state_update_cth(Config) when is_list(Config) ->
+ do_test(state_update_cth, "ct_cth_fail_one_skip_one_SUITE.erl",
+ [state_update_cth,state_update_cth],Config).
+
+options_cth(Config) when is_list(Config) ->
+ do_test(options_cth, "ct_cth_empty_SUITE.erl",
+ [{empty_cth,[test]}],Config).
+
+same_id_cth(Config) when is_list(Config) ->
+ do_test(same_id_cth, "ct_cth_empty_SUITE.erl",
+ [same_id_cth,same_id_cth],Config).
+
+fail_n_skip_with_minimal_cth(Config) when is_list(Config) ->
+ do_test(fail_n_skip_with_minimal_cth, "ct_cth_fail_one_skip_one_SUITE.erl",
+ [minimal_terminate_cth],Config).
+
+%%%-----------------------------------------------------------------
+%%% HELP FUNCTIONS
+%%%-----------------------------------------------------------------
+
+do_test(Tag, SWC, CTHs, Config) ->
+ do_test(Tag, SWC, CTHs, Config, ok).
+do_test(Tag, SWC, CTHs, Config, {error,_} = Res) ->
+ do_test(Tag, SWC, CTHs, Config, Res, 1);
+do_test(Tag, SWC, CTHs, Config, Res) ->
+ do_test(Tag, SWC, CTHs, Config, Res, 2).
+
+do_test(Tag, SuiteWildCard, CTHs, Config, Res, EC) ->
+
+ DataDir = ?config(data_dir, Config),
+ Suites = filelib:wildcard(
+ filename:join([DataDir,"cth/tests",SuiteWildCard])),
+ {Opts,ERPid} = setup([{suite,Suites},
+ {ct_hooks,CTHs},{label,Tag}], Config),
+ Res = ct_test_support:run(Opts, Config),
+ Events = ct_test_support:get_events(ERPid, Config),
+
+ ct_test_support:log_events(Tag,
+ reformat(Events, ?eh),
+ ?config(priv_dir, Config),
+ Opts),
+
+ TestEvents = events_to_check(Tag, EC),
+ ok = ct_test_support:verify_events(TestEvents, Events, Config).
+
+setup(Test, Config) ->
+ Opts0 = ct_test_support:get_opts(Config),
+ Level = ?config(trace_level, Config),
+ EvHArgs = [{cbm,ct_test_support},{trace_level,Level}],
+ Opts = Opts0 ++ [{event_handler,{?eh,EvHArgs}}|Test],
+ ERPid = ct_test_support:start_event_receiver(Config),
+ {Opts,ERPid}.
+
+reformat(Events, EH) ->
+ ct_test_support:reformat(Events, EH).
+%reformat(Events, _EH) ->
+% Events.
+
+%%%-----------------------------------------------------------------
+%%% TEST EVENTS
+%%%-----------------------------------------------------------------
+events_to_check(Test) ->
+ %% 2 tests (ct:run_test + script_start) is default
+ events_to_check(Test, 2).
+
+events_to_check(_, 0) ->
+ [];
+events_to_check(Test, N) ->
+ test_events(Test) ++ events_to_check(Test, N-1).
+
+test_events(one_empty_cth) ->
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,cth,{empty_cth,id,[[]]}},
+ {?eh,cth,{empty_cth,init,[{'_','_','_'},[]]}},
+ {?eh,tc_start,{ct_cth_empty_SUITE,init_per_suite}},
+ {?eh,cth,{empty_cth,pre_init_per_suite,
+ [ct_cth_empty_SUITE,'$proplist',[]]}},
+ {?eh,cth,{empty_cth,post_init_per_suite,
+ [ct_cth_empty_SUITE,'$proplist','$proplist',[]]}},
+ {?eh,tc_done,{ct_cth_empty_SUITE,init_per_suite,ok}},
+
+ {?eh,tc_start,{ct_cth_empty_SUITE,test_case}},
+ {?eh,cth,{empty_cth,pre_init_per_testcase,[test_case,'$proplist',[]]}},
+ {?eh,cth,{empty_cth,post_end_per_testcase,[test_case,'$proplist','_',[]]}},
+ {?eh,tc_done,{ct_cth_empty_SUITE,test_case,ok}},
+
+ {?eh,tc_start,{ct_cth_empty_SUITE,end_per_suite}},
+ {?eh,cth,{empty_cth,pre_end_per_suite,
+ [ct_cth_empty_SUITE,'$proplist',[]]}},
+ {?eh,cth,{empty_cth,post_end_per_suite,[ct_cth_empty_SUITE,'$proplist','_',[]]}},
+ {?eh,tc_done,{ct_cth_empty_SUITE,end_per_suite,ok}},
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,cth,{empty_cth,terminate,[[]]}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(two_empty_cth) ->
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,cth,{'_',id,[[]]}},
+ {?eh,cth,{'_',init,['_',[]]}},
+ {?eh,cth,{'_',id,[[]]}},
+ {?eh,cth,{'_',init,['_',[]]}},
+ {?eh,tc_start,{ct_cth_empty_SUITE,init_per_suite}},
+ {?eh,cth,{'_',pre_init_per_suite,[ct_cth_empty_SUITE,'$proplist',[]]}},
+ {?eh,cth,{'_',pre_init_per_suite,[ct_cth_empty_SUITE,'$proplist',[]]}},
+ {?eh,cth,{'_',post_init_per_suite,[ct_cth_empty_SUITE,'$proplist','$proplist',[]]}},
+ {?eh,cth,{'_',post_init_per_suite,[ct_cth_empty_SUITE,'$proplist','$proplist',[]]}},
+ {?eh,tc_done,{ct_cth_empty_SUITE,init_per_suite,ok}},
+
+ {?eh,tc_start,{ct_cth_empty_SUITE,test_case}},
+ {?eh,cth,{'_',pre_init_per_testcase,[test_case,'$proplist',[]]}},
+ {?eh,cth,{'_',pre_init_per_testcase,[test_case,'$proplist',[]]}},
+ {?eh,cth,{'_',post_end_per_testcase,[test_case,'$proplist',ok,[]]}},
+ {?eh,cth,{'_',post_end_per_testcase,[test_case,'$proplist',ok,[]]}},
+ {?eh,tc_done,{ct_cth_empty_SUITE,test_case,ok}},
+
+ {?eh,tc_start,{ct_cth_empty_SUITE,end_per_suite}},
+ {?eh,cth,{'_',pre_end_per_suite,[ct_cth_empty_SUITE,'$proplist',[]]}},
+ {?eh,cth,{'_',pre_end_per_suite,[ct_cth_empty_SUITE,'$proplist',[]]}},
+ {?eh,cth,{'_',post_end_per_suite,[ct_cth_empty_SUITE,'$proplist','_',[]]}},
+ {?eh,cth,{'_',post_end_per_suite,[ct_cth_empty_SUITE,'$proplist','_',[]]}},
+ {?eh,tc_done,{ct_cth_empty_SUITE,end_per_suite,ok}},
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,cth,{'_',terminate,[[]]}},
+ {?eh,cth,{'_',terminate,[[]]}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(faulty_cth_no_init) ->
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(faulty_cth_id_no_init) ->
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,cth,{'_',id,[[]]}},
+ {negative,{?eh,tc_start,'_'},
+ {?eh,test_done,{'DEF','STOP_TIME'}}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(minimal_cth) ->
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {negative,{?eh,cth,{'_',id,['_',[]]}},
+ {?eh,cth,{'_',init,['_',[]]}}},
+ {?eh,tc_start,{ct_cth_empty_SUITE,init_per_suite}},
+ {?eh,tc_done,{ct_cth_empty_SUITE,init_per_suite,ok}},
+
+ {?eh,tc_start,{ct_cth_empty_SUITE,test_case}},
+ {?eh,tc_done,{ct_cth_empty_SUITE,test_case,ok}},
+
+ {?eh,tc_start,{ct_cth_empty_SUITE,end_per_suite}},
+ {?eh,tc_done,{ct_cth_empty_SUITE,end_per_suite,ok}},
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(minimal_and_maximal_cth) ->
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {negative,{?eh,cth,{'_',id,['_',[]]}},
+ {?eh,cth,{'_',init,['_',[]]}}},
+ {?eh,cth,{'_',id,[[]]}},
+ {?eh,cth,{'_',init,['_',[]]}},
+ {?eh,tc_start,{ct_cth_empty_SUITE,init_per_suite}},
+ {?eh,cth,{'_',pre_init_per_suite,[ct_cth_empty_SUITE,'$proplist',[]]}},
+ {?eh,cth,{'_',post_init_per_suite,[ct_cth_empty_SUITE,'$proplist','$proplist',[]]}},
+ {?eh,tc_done,{ct_cth_empty_SUITE,init_per_suite,ok}},
+
+ {?eh,tc_start,{ct_cth_empty_SUITE,test_case}},
+ {?eh,cth,{'_',pre_init_per_testcase,[test_case,'$proplist',[]]}},
+ {?eh,cth,{'_',post_end_per_testcase,[test_case,'$proplist',ok,[]]}},
+ {?eh,tc_done,{ct_cth_empty_SUITE,test_case,ok}},
+
+ {?eh,tc_start,{ct_cth_empty_SUITE,end_per_suite}},
+ {?eh,cth,{'_',pre_end_per_suite,[ct_cth_empty_SUITE,'$proplist',[]]}},
+ {?eh,cth,{'_',post_end_per_suite,[ct_cth_empty_SUITE,'$proplist','_',[]]}},
+ {?eh,tc_done,{ct_cth_empty_SUITE,end_per_suite,ok}},
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,cth,{'_',terminate,[[]]}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(faulty_cth_undef) ->
+ FailReasonStr = "undef_cth:pre_init_per_suite/3 CTH call failed",
+ FailReason = {ct_cth_empty_SUITE,init_per_suite,
+ {failed,FailReasonStr}},
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,cth,{'_',init,['_',[]]}},
+ {?eh,tc_start,{ct_cth_empty_SUITE,init_per_suite}},
+ {?eh,tc_done,{ct_cth_empty_SUITE,init_per_suite,
+ {failed, {error,FailReasonStr}}}},
+ {?eh,cth,{'_',on_tc_fail,'_'}},
+
+ {?eh,tc_auto_skip,{ct_cth_empty_SUITE,test_case,
+ {failed, FailReason}}},
+ {?eh,cth,{'_',on_tc_skip,'_'}},
+
+ {?eh,tc_auto_skip,{ct_cth_empty_SUITE,end_per_suite,
+ {failed, FailReason}}},
+ {?eh,cth,{'_',on_tc_skip,'_'}},
+
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(faulty_cth_exit_in_init_scope_suite) ->
+ [{?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,tc_start,{'_',init_per_suite}},
+ {?eh,cth,{empty_cth,init,['_',[]]}},
+ {?eh,tc_done,
+ {ct_exit_in_init_scope_suite_cth_SUITE,init_per_suite,
+ {failed,
+ {error,
+ "Failed to start CTH, see the CT Log for details"}}}},
+ {?eh,tc_auto_skip,
+ {ct_exit_in_init_scope_suite_cth_SUITE,test_case,
+ {failed,
+ {ct_exit_in_init_scope_suite_cth_SUITE,init_per_suite,
+ {failed,
+ "Failed to start CTH, see the CT Log for details"}}}}},
+ {?eh,tc_auto_skip,
+ {ct_exit_in_init_scope_suite_cth_SUITE,end_per_suite,
+ {failed,
+ {ct_exit_in_init_scope_suite_cth_SUITE,init_per_suite,
+ {failed,
+ "Failed to start CTH, see the CT Log for details"}}}}},
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,stop_logging,[]}];
+
+test_events(faulty_cth_exit_in_init) ->
+ [{?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,cth,{empty_cth,init,['_',[]]}},
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,stop_logging,[]}];
+
+test_events(faulty_cth_exit_in_id) ->
+ [{?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,cth,{empty_cth,id,[[]]}},
+ {negative, {?eh,tc_start,'_'},
+ {?eh,test_done,{'DEF','STOP_TIME'}}},
+ {?eh,stop_logging,[]}];
+
+test_events(scope_per_suite_cth) ->
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,tc_start,{ct_scope_per_suite_cth_SUITE,init_per_suite}},
+ {?eh,cth,{'_',id,[[]]}},
+ {?eh,cth,{'_',init,['_',[]]}},
+ {?eh,cth,{'_',post_init_per_suite,[ct_scope_per_suite_cth_SUITE,'$proplist','$proplist',[]]}},
+ {?eh,tc_done,{ct_scope_per_suite_cth_SUITE,init_per_suite,ok}},
+
+ {?eh,tc_start,{ct_scope_per_suite_cth_SUITE,test_case}},
+ {?eh,cth,{'_',pre_init_per_testcase,[test_case,'$proplist',[]]}},
+ {?eh,cth,{'_',post_end_per_testcase,[test_case,'$proplist',ok,[]]}},
+ {?eh,tc_done,{ct_scope_per_suite_cth_SUITE,test_case,ok}},
+
+ {?eh,tc_start,{ct_scope_per_suite_cth_SUITE,end_per_suite}},
+ {?eh,cth,{'_',pre_end_per_suite,
+ [ct_scope_per_suite_cth_SUITE,'$proplist',[]]}},
+ {?eh,cth,{'_',post_end_per_suite,[ct_scope_per_suite_cth_SUITE,'$proplist','_',[]]}},
+ {?eh,cth,{'_',terminate,[[]]}},
+ {?eh,tc_done,{ct_scope_per_suite_cth_SUITE,end_per_suite,ok}},
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(scope_suite_cth) ->
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,tc_start,{ct_scope_suite_cth_SUITE,init_per_suite}},
+ {?eh,cth,{'_',id,[[]]}},
+ {?eh,cth,{'_',init,['_',[]]}},
+ {?eh,cth,{'_',pre_init_per_suite,[ct_scope_suite_cth_SUITE,'$proplist',[]]}},
+ {?eh,cth,{'_',post_init_per_suite,[ct_scope_suite_cth_SUITE,'$proplist','$proplist',[]]}},
+ {?eh,tc_done,{ct_scope_suite_cth_SUITE,init_per_suite,ok}},
+
+ {?eh,tc_start,{ct_scope_suite_cth_SUITE,test_case}},
+ {?eh,cth,{'_',pre_init_per_testcase,[test_case,'$proplist',[]]}},
+ {?eh,cth,{'_',post_end_per_testcase,[test_case,'$proplist',ok,[]]}},
+ {?eh,tc_done,{ct_scope_suite_cth_SUITE,test_case,ok}},
+
+ {?eh,tc_start,{ct_scope_suite_cth_SUITE,end_per_suite}},
+ {?eh,cth,{'_',pre_end_per_suite,[ct_scope_suite_cth_SUITE,'$proplist',[]]}},
+ {?eh,cth,{'_',post_end_per_suite,[ct_scope_suite_cth_SUITE,'$proplist','_',[]]}},
+ {?eh,cth,{'_',terminate,[[]]}},
+ {?eh,tc_done,{ct_scope_suite_cth_SUITE,end_per_suite,ok}},
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(scope_per_group_cth) ->
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,tc_start,{ct_scope_per_group_cth_SUITE,init_per_suite}},
+ {?eh,tc_done,{ct_scope_per_group_cth_SUITE,init_per_suite,ok}},
+
+ [{?eh,tc_start,{ct_scope_per_group_cth_SUITE,{init_per_group,group1,[]}}},
+ {?eh,cth,{'_',id,[[]]}},
+ {?eh,cth,{'_',init,['_',[]]}},
+ {?eh,cth,{'_',post_init_per_group,[group1,'$proplist','$proplist',[]]}},
+ {?eh,tc_done,{ct_scope_per_group_cth_SUITE,{init_per_group,group1,[]},ok}},
+
+ {?eh,tc_start,{ct_scope_per_group_cth_SUITE,test_case}},
+ {?eh,cth,{'_',pre_init_per_testcase,[test_case,'$proplist',[]]}},
+ {?eh,cth,{'_',post_end_per_testcase,[test_case,'$proplist',ok,[]]}},
+ {?eh,tc_done,{ct_scope_per_group_cth_SUITE,test_case,ok}},
+
+ {?eh,tc_start,{ct_scope_per_group_cth_SUITE,{end_per_group,group1,[]}}},
+ {?eh,cth,{'_',pre_end_per_group,[group1,'$proplist',[]]}},
+ {?eh,cth,{'_',post_end_per_group,[group1,'$proplist','_',[]]}},
+ {?eh,cth,{'_',terminate,[[]]}},
+ {?eh,tc_done,{ct_scope_per_group_cth_SUITE,{end_per_group,group1,[]},ok}}],
+
+ {?eh,tc_start,{ct_scope_per_group_cth_SUITE,end_per_suite}},
+ {?eh,tc_done,{ct_scope_per_group_cth_SUITE,end_per_suite,ok}},
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(scope_per_suite_state_cth) ->
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,tc_start,{ct_scope_per_suite_state_cth_SUITE,init_per_suite}},
+ {?eh,cth,{'_',id,[[test]]}},
+ {?eh,cth,{'_',init,['_',[test]]}},
+ {?eh,cth,{'_',post_init_per_suite,[ct_scope_per_suite_state_cth_SUITE,'$proplist','$proplist',[test]]}},
+ {?eh,tc_done,{ct_scope_per_suite_state_cth_SUITE,init_per_suite,ok}},
+
+ {?eh,tc_start,{ct_scope_per_suite_state_cth_SUITE,test_case}},
+ {?eh,cth,{'_',pre_init_per_testcase,[test_case,'$proplist',[test]]}},
+ {?eh,cth,{'_',post_end_per_testcase,[test_case,'$proplist',ok,[test]]}},
+ {?eh,tc_done,{ct_scope_per_suite_state_cth_SUITE,test_case,ok}},
+
+ {?eh,tc_start,{ct_scope_per_suite_state_cth_SUITE,end_per_suite}},
+ {?eh,cth,{'_',pre_end_per_suite,
+ [ct_scope_per_suite_state_cth_SUITE,'$proplist',[test]]}},
+ {?eh,cth,{'_',post_end_per_suite,[ct_scope_per_suite_state_cth_SUITE,'$proplist','_',[test]]}},
+ {?eh,cth,{'_',terminate,[[test]]}},
+ {?eh,tc_done,{ct_scope_per_suite_state_cth_SUITE,end_per_suite,ok}},
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(scope_suite_state_cth) ->
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,tc_start,{ct_scope_suite_state_cth_SUITE,init_per_suite}},
+ {?eh,cth,{'_',id,[[test]]}},
+ {?eh,cth,{'_',init,['_',[test]]}},
+ {?eh,cth,{'_',pre_init_per_suite,[ct_scope_suite_state_cth_SUITE,'$proplist',[test]]}},
+ {?eh,cth,{'_',post_init_per_suite,[ct_scope_suite_state_cth_SUITE,'$proplist','$proplist',[test]]}},
+ {?eh,tc_done,{ct_scope_suite_state_cth_SUITE,init_per_suite,ok}},
+
+ {?eh,tc_start,{ct_scope_suite_state_cth_SUITE,test_case}},
+ {?eh,cth,{'_',pre_init_per_testcase,[test_case,'$proplist',[test]]}},
+ {?eh,cth,{'_',post_end_per_testcase,[test_case,'$proplist',ok,[test]]}},
+ {?eh,tc_done,{ct_scope_suite_state_cth_SUITE,test_case,ok}},
+
+ {?eh,tc_start,{ct_scope_suite_state_cth_SUITE,end_per_suite}},
+ {?eh,cth,{'_',pre_end_per_suite,[ct_scope_suite_state_cth_SUITE,'$proplist',[test]]}},
+ {?eh,cth,{'_',post_end_per_suite,[ct_scope_suite_state_cth_SUITE,'$proplist','_',[test]]}},
+ {?eh,cth,{'_',terminate,[[test]]}},
+ {?eh,tc_done,{ct_scope_suite_state_cth_SUITE,end_per_suite,ok}},
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(scope_per_group_state_cth) ->
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,tc_start,{ct_scope_per_group_state_cth_SUITE,init_per_suite}},
+ {?eh,tc_done,{ct_scope_per_group_state_cth_SUITE,init_per_suite,ok}},
+
+ [{?eh,tc_start,{ct_scope_per_group_state_cth_SUITE,{init_per_group,group1,[]}}},
+ {?eh,cth,{'_',id,[[test]]}},
+ {?eh,cth,{'_',init,['_',[test]]}},
+ {?eh,cth,{'_',post_init_per_group,[group1,'$proplist','$proplist',[test]]}},
+ {?eh,tc_done,{ct_scope_per_group_state_cth_SUITE,{init_per_group,group1,[]},ok}},
+
+ {?eh,tc_start,{ct_scope_per_group_state_cth_SUITE,test_case}},
+ {?eh,cth,{'_',pre_init_per_testcase,[test_case,'$proplist',[test]]}},
+ {?eh,cth,{'_',post_end_per_testcase,[test_case,'$proplist',ok,[test]]}},
+ {?eh,tc_done,{ct_scope_per_group_state_cth_SUITE,test_case,ok}},
+
+ {?eh,tc_start,{ct_scope_per_group_state_cth_SUITE,{end_per_group,group1,[]}}},
+ {?eh,cth,{'_',pre_end_per_group,[group1,'$proplist',[test]]}},
+ {?eh,cth,{'_',post_end_per_group,[group1,'$proplist','_',[test]]}},
+ {?eh,cth,{'_',terminate,[[test]]}},
+ {?eh,tc_done,{ct_scope_per_group_state_cth_SUITE,{end_per_group,group1,[]},ok}}],
+
+ {?eh,tc_start,{ct_scope_per_group_state_cth_SUITE,end_per_suite}},
+ {?eh,tc_done,{ct_scope_per_group_state_cth_SUITE,end_per_suite,ok}},
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(fail_pre_suite_cth) ->
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,cth,{'_',init,['_',[]]}},
+
+ {?eh,tc_start,{ct_cth_empty_SUITE,init_per_suite}},
+ {?eh,cth,{'_',pre_init_per_suite,[ct_cth_empty_SUITE,'$proplist',[]]}},
+ {?eh,cth,{'_',post_init_per_suite,[ct_cth_empty_SUITE,'$proplist',
+ {fail,"Test failure"},[]]}},
+ {?eh,tc_done,{ct_cth_empty_SUITE,init_per_suite,
+ {failed, {error,"Test failure"}}}},
+ {?eh,cth,{'_',on_tc_fail,
+ [init_per_suite,{failed,"Test failure"},[]]}},
+
+
+ {?eh,tc_auto_skip,{ct_cth_empty_SUITE,test_case,
+ {failed,{ct_cth_empty_SUITE,init_per_suite,
+ {failed,"Test failure"}}}}},
+ {?eh,cth,{'_',on_tc_skip,
+ [test_case, {tc_auto_skip,
+ {failed, {ct_cth_empty_SUITE, init_per_suite,
+ {failed, "Test failure"}}}},[]]}},
+
+
+ {?eh,tc_auto_skip, {ct_cth_empty_SUITE, end_per_suite,
+ {failed, {ct_cth_empty_SUITE, init_per_suite,
+ {failed, "Test failure"}}}}},
+ {?eh,cth,{'_',on_tc_skip,
+ [end_per_suite, {tc_auto_skip,
+ {failed, {ct_cth_empty_SUITE, init_per_suite,
+ {failed, "Test failure"}}}},[]]}},
+
+
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,cth, {'_',terminate,[[]]}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(double_fail_pre_suite_cth) ->
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,tc_start,{'_',init_per_suite}},
+ {?eh,cth,{'_',init,['_',[]]}},
+ {?eh,cth,{'_',pre_init_per_suite,['_','$proplist',[]]}},
+ {?eh,cth,{'_',post_init_per_suite,['_','$proplist',
+ {fail,"Test failure"},[]]}},
+ {?eh,cth, {empty_cth,terminate,[[]]}},
+
+ {?eh,tc_start,{'_',init_per_suite}},
+ {?eh,cth,{'_',init,['_',[]]}},
+ {?eh,cth, {empty_cth,terminate,[[]]}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(fail_post_suite_cth) ->
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,cth,{'_',init,['_',[]]}},
+ {?eh,tc_start,{ct_cth_empty_SUITE,init_per_suite}},
+ {?eh,cth,{'_',pre_init_per_suite,[ct_cth_empty_SUITE,'$proplist',[]]}},
+ {?eh,cth,{'_',post_init_per_suite,[ct_cth_empty_SUITE,'$proplist','$proplist',[]]}},
+ {?eh,tc_done,{ct_cth_empty_SUITE,init_per_suite,
+ {failed,{error,"Test failure"}}}},
+ {?eh,cth,{'_',on_tc_fail,[init_per_suite, {failed,"Test failure"}, []]}},
+
+ {?eh,tc_auto_skip,{ct_cth_empty_SUITE,test_case,
+ {failed,{ct_cth_empty_SUITE,init_per_suite,
+ {failed,"Test failure"}}}}},
+ {?eh,cth,{'_',on_tc_skip,[test_case,{tc_auto_skip,'_'},[]]}},
+
+ {?eh,tc_auto_skip, {ct_cth_empty_SUITE, end_per_suite,
+ {failed, {ct_cth_empty_SUITE, init_per_suite,
+ {failed, "Test failure"}}}}},
+ {?eh,cth,{'_',on_tc_skip,[end_per_suite,{tc_auto_skip,'_'},[]]}},
+
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,cth, {'_',terminate,[[]]}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(skip_pre_suite_cth) ->
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,cth,{'_',init,['_',[]]}},
+ {?eh,tc_start,{ct_cth_empty_SUITE,init_per_suite}},
+ {?eh,cth,{'_',pre_init_per_suite,[ct_cth_empty_SUITE,'$proplist',[]]}},
+ {?eh,cth,{'_',post_init_per_suite,[ct_cth_empty_SUITE,'$proplist',{skip,"Test skip"},[]]}},
+ {?eh,tc_done,{ct_cth_empty_SUITE,init_per_suite,{skipped,"Test skip"}}},
+ {?eh,cth,{'_',on_tc_skip,
+ [init_per_suite,{tc_user_skip,{skipped,"Test skip"}},[]]}},
+
+ {?eh,tc_auto_skip,{ct_cth_empty_SUITE,test_case,"Test skip"}},
+ {?eh,cth,{'_',on_tc_skip,[test_case,{tc_auto_skip,"Test skip"},[]]}},
+
+ {?eh,tc_auto_skip, {ct_cth_empty_SUITE, end_per_suite,"Test skip"}},
+ {?eh,cth,{'_',on_tc_skip,[end_per_suite,{tc_auto_skip,"Test skip"},[]]}},
+
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,cth, {'_',terminate,[[]]}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(skip_post_suite_cth) ->
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,cth,{'_',init,['_',[]]}},
+
+ {?eh,tc_start,{ct_cth_empty_SUITE,init_per_suite}},
+ {?eh,cth,{'_',pre_init_per_suite,[ct_cth_empty_SUITE,'$proplist',[]]}},
+ {?eh,cth,{'_',post_init_per_suite,[ct_cth_empty_SUITE,'$proplist','$proplist',[]]}},
+ {?eh,tc_done,{ct_cth_empty_SUITE,init_per_suite,{skipped,"Test skip"}}},
+ {?eh,cth,{'_',on_tc_skip,
+ [init_per_suite,{tc_user_skip,{skipped,"Test skip"}},[]]}},
+
+ {?eh,tc_auto_skip,{ct_cth_empty_SUITE,test_case,"Test skip"}},
+ {?eh,cth,{'_',on_tc_skip,[test_case,{tc_auto_skip,"Test skip"},[]]}},
+
+ {?eh,tc_auto_skip, {ct_cth_empty_SUITE, end_per_suite,"Test skip"}},
+ {?eh,cth,{'_',on_tc_skip,[end_per_suite,{tc_auto_skip,"Test skip"},[]]}},
+
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,cth,{'_',terminate,[[]]}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(recover_post_suite_cth) ->
+ Suite = ct_cth_fail_per_suite_SUITE,
+ [
+ {?eh,start_logging,'_'},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,cth,{'_',init,['_',[]]}},
+ {?eh,tc_start,{Suite,init_per_suite}},
+ {?eh,cth,{'_',pre_init_per_suite,[Suite,'$proplist','$proplist']}},
+ {?eh,cth,{'_',post_init_per_suite,[Suite,contains([tc_status]),
+ {'EXIT',{'_','_'}},[]]}},
+ {?eh,tc_done,{Suite,init_per_suite,ok}},
+
+ {?eh,tc_start,{Suite,test_case}},
+ {?eh,cth,{'_',pre_init_per_testcase,
+ [test_case, not_contains([tc_status]),[]]}},
+ {?eh,cth,{'_',post_end_per_testcase,
+ [test_case, contains([tc_status]),'_',[]]}},
+ {?eh,tc_done,{Suite,test_case,ok}},
+
+ {?eh,tc_start,{Suite,end_per_suite}},
+ {?eh,cth,{'_',pre_end_per_suite,
+ [Suite,not_contains([tc_status]),[]]}},
+ {?eh,cth,{'_',post_end_per_suite,
+ [Suite,not_contains([tc_status]),'_',[]]}},
+ {?eh,tc_done,{Suite,end_per_suite,ok}},
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,cth,{'_',terminate,[[]]}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(update_config_cth) ->
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,cth,{'_',init,['_',[]]}},
+
+ {?eh,tc_start,{ct_update_config_SUITE,init_per_suite}},
+ {?eh,cth,{'_',pre_init_per_suite,
+ [ct_update_config_SUITE,contains([]),[]]}},
+ {?eh,cth,{'_',post_init_per_suite,
+ [ct_update_config_SUITE,
+ '$proplist',
+ contains(
+ [init_per_suite,
+ pre_init_per_suite]),
+ []]}},
+ {?eh,tc_done,{ct_update_config_SUITE,init_per_suite,ok}},
+
+ {?eh,tc_start,{ct_update_config_SUITE, {init_per_group,group1,[]}}},
+ {?eh,cth,{'_',pre_init_per_group,
+ [group1,contains(
+ [post_init_per_suite,
+ init_per_suite,
+ pre_init_per_suite]),
+ []]}},
+ {?eh,cth,{'_',post_init_per_group,
+ [group1,
+ contains(
+ [post_init_per_suite,
+ init_per_suite,
+ pre_init_per_suite]),
+ contains(
+ [init_per_group,
+ pre_init_per_group,
+ post_init_per_suite,
+ init_per_suite,
+ pre_init_per_suite]),
+ []]}},
+ {?eh,tc_done,{ct_update_config_SUITE,{init_per_group,group1,[]},ok}},
+
+ {?eh,tc_start,{ct_update_config_SUITE,test_case}},
+ {?eh,cth,{'_',pre_init_per_testcase,
+ [test_case,contains(
+ [post_init_per_group,
+ init_per_group,
+ pre_init_per_group,
+ post_init_per_suite,
+ init_per_suite,
+ pre_init_per_suite]),
+ []]}},
+ {?eh,cth,{'_',post_end_per_testcase,
+ [test_case,contains(
+ [init_per_testcase,
+ pre_init_per_testcase,
+ post_init_per_group,
+ init_per_group,
+ pre_init_per_group,
+ post_init_per_suite,
+ init_per_suite,
+ pre_init_per_suite]),
+ ok,[]]}},
+ {?eh,tc_done,{ct_update_config_SUITE,test_case,ok}},
+
+ {?eh,tc_start,{ct_update_config_SUITE, {end_per_group,group1,[]}}},
+ {?eh,cth,{'_',pre_end_per_group,
+ [group1,contains(
+ [post_init_per_group,
+ init_per_group,
+ pre_init_per_group,
+ post_init_per_suite,
+ init_per_suite,
+ pre_init_per_suite]),
+ []]}},
+ {?eh,cth,{'_',post_end_per_group,
+ [group1,
+ contains(
+ [pre_end_per_group,
+ post_init_per_group,
+ init_per_group,
+ pre_init_per_group,
+ post_init_per_suite,
+ init_per_suite,
+ pre_init_per_suite]),
+ ok,[]]}},
+ {?eh,tc_done,{ct_update_config_SUITE,{end_per_group,group1,[]},ok}},
+
+ {?eh,tc_start,{ct_update_config_SUITE,end_per_suite}},
+ {?eh,cth,{'_',pre_end_per_suite,
+ [ct_update_config_SUITE,contains(
+ [post_init_per_suite,
+ init_per_suite,
+ pre_init_per_suite]),
+ []]}},
+ {?eh,cth,{'_',post_end_per_suite,
+ [ct_update_config_SUITE,contains(
+ [pre_end_per_suite,
+ post_init_per_suite,
+ init_per_suite,
+ pre_init_per_suite]),
+ '_',[]]}},
+ {?eh,tc_done,{ct_update_config_SUITE,end_per_suite,ok}},
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,cth,{'_',terminate,[contains(
+ [post_end_per_suite,
+ pre_end_per_suite,
+ post_init_per_suite,
+ init_per_suite,
+ pre_init_per_suite])]}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(state_update_cth) ->
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,cth,{'_',init,['_',[]]}},
+ {?eh,cth,{'_',init,['_',[]]}},
+ {?eh,tc_start,{'_',init_per_suite}},
+
+ {?eh,tc_done,{'_',end_per_suite,ok}},
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,cth,{'_',terminate,[contains(
+ [post_end_per_suite,pre_end_per_suite,
+ post_end_per_group,pre_end_per_group,
+ {not_in_order,
+ [post_end_per_testcase,pre_init_per_testcase,
+ on_tc_skip,post_end_per_testcase,
+ pre_init_per_testcase,on_tc_fail,
+ post_end_per_testcase,pre_init_per_testcase]
+ },
+ post_init_per_group,pre_init_per_group,
+ post_init_per_suite,pre_init_per_suite,
+ init])]}},
+ {?eh,cth,{'_',terminate,[contains(
+ [post_end_per_suite,pre_end_per_suite,
+ post_end_per_group,pre_end_per_group,
+ {not_in_order,
+ [post_end_per_testcase,pre_init_per_testcase,
+ on_tc_skip,post_end_per_testcase,
+ pre_init_per_testcase,on_tc_fail,
+ post_end_per_testcase,pre_init_per_testcase]
+ },
+ post_init_per_group,pre_init_per_group,
+ post_init_per_suite,pre_init_per_suite,
+ init]
+ )]}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(options_cth) ->
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,cth,{empty_cth,init,['_',[test]]}},
+ {?eh,tc_start,{ct_cth_empty_SUITE,init_per_suite}},
+ {?eh,cth,{empty_cth,pre_init_per_suite,
+ [ct_cth_empty_SUITE,'$proplist',[test]]}},
+ {?eh,cth,{empty_cth,post_init_per_suite,
+ [ct_cth_empty_SUITE,'$proplist','$proplist',[test]]}},
+ {?eh,tc_done,{ct_cth_empty_SUITE,init_per_suite,ok}},
+
+ {?eh,tc_start,{ct_cth_empty_SUITE,test_case}},
+ {?eh,cth,{empty_cth,pre_init_per_testcase,[test_case,'$proplist',[test]]}},
+ {?eh,cth,{empty_cth,post_end_per_testcase,[test_case,'$proplist','_',[test]]}},
+ {?eh,tc_done,{ct_cth_empty_SUITE,test_case,ok}},
+
+ {?eh,tc_start,{ct_cth_empty_SUITE,end_per_suite}},
+ {?eh,cth,{empty_cth,pre_end_per_suite,
+ [ct_cth_empty_SUITE,'$proplist',[test]]}},
+ {?eh,cth,{empty_cth,post_end_per_suite,[ct_cth_empty_SUITE,'$proplist','_',[test]]}},
+ {?eh,tc_done,{ct_cth_empty_SUITE,end_per_suite,ok}},
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,cth,{empty_cth,terminate,[[test]]}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(same_id_cth) ->
+ [
+ {?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,cth,{'_',id,[[]]}},
+ {?eh,cth,{'_',init,[same_id_cth,[]]}},
+ {?eh,cth,{'_',id,[[]]}},
+ {?eh,tc_start,{ct_cth_empty_SUITE,init_per_suite}},
+ {?eh,cth,{'_',pre_init_per_suite,[ct_cth_empty_SUITE,'$proplist',[]]}},
+ {negative,
+ {?eh,cth,{'_',pre_init_per_suite,[ct_cth_empty_SUITE,'$proplist',[]]}},
+ {?eh,cth,{'_',post_init_per_suite,
+ [ct_cth_empty_SUITE,'$proplist','$proplist',[]]}}},
+ {negative,
+ {?eh,cth,{'_',post_init_per_suite,
+ [ct_cth_empty_SUITE,'$proplist','$proplist',[]]}},
+ {?eh,tc_done,{ct_cth_empty_SUITE,init_per_suite,ok}}},
+
+ {?eh,tc_start,{ct_cth_empty_SUITE,test_case}},
+ {?eh,cth,{'_',pre_init_per_testcase,[test_case,'$proplist',[]]}},
+ {negative,
+ {?eh,cth,{'_',pre_init_per_testcase,[test_case,'$proplist',[]]}},
+ {?eh,cth,{'_',post_end_per_testcase,[test_case,'$proplist',ok,[]]}}},
+ {negative,
+ {?eh,cth,{'_',post_end_per_testcase,[test_case,'$proplist',ok,[]]}},
+ {?eh,tc_done,{ct_cth_empty_SUITE,test_case,ok}}},
+
+ {?eh,tc_start,{ct_cth_empty_SUITE,end_per_suite}},
+ {?eh,cth,{'_',pre_end_per_suite,[ct_cth_empty_SUITE,'$proplist',[]]}},
+ {negative,
+ {?eh,cth,{'_',pre_end_per_suite,[ct_cth_empty_SUITE,'$proplist',[]]}},
+ {?eh,cth,{'_',post_end_per_suite,[ct_cth_empty_SUITE,'$proplist','_',[]]}}},
+ {negative,
+ {?eh,cth,{'_',post_end_per_suite,
+ [ct_cth_empty_SUITE,'$proplist','_',[]]}},
+ {?eh,tc_done,{ct_cth_empty_SUITE,end_per_suite,ok}}},
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,cth,{'_',terminate,[[]]}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(fail_n_skip_with_minimal_cth) ->
+ [{?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
+ {?eh,cth,{'_',init,['_',[]]}},
+ {?eh,tc_start,{'_',init_per_suite}},
+
+ {?eh,tc_done,{'_',end_per_suite,ok}},
+ {?eh,cth,{'_',terminate,[[]]}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(ok) ->
+ ok.
+
+
+%% test events help functions
+contains(List) ->
+ fun(Proplist) when is_list(Proplist) ->
+ contains(List,Proplist)
+ end.
+
+contains([{not_in_order,List}|T],Rest) ->
+ contains_parallel(List,Rest),
+ contains(T,Rest);
+contains([{Ele,Pos}|T] = L,[H|T2]) ->
+ case element(Pos,H) of
+ Ele ->
+ contains(T,T2);
+ _ ->
+ contains(L,T2)
+ end;
+contains([Ele|T],[{Ele,_}|T2])->
+ contains(T,T2);
+contains([Ele|T],[Ele|T2])->
+ contains(T,T2);
+contains(List,[_|T]) ->
+ contains(List,T);
+contains([],_) ->
+ match.
+
+contains_parallel([Key | T], Elems) ->
+ contains([Key],Elems),
+ contains_parallel(T,Elems);
+contains_parallel([],_Elems) ->
+ match.
+
+not_contains(List) ->
+ fun(Proplist) when is_list(Proplist) ->
+ [] = [Ele || {Ele,_} <- Proplist,
+ Test <- List,
+ Test =:= Ele]
+ end.
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/crash_id_cth.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/crash_id_cth.erl
new file mode 100644
index 0000000000..b5541f2053
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/crash_id_cth.erl
@@ -0,0 +1,34 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(crash_id_cth).
+
+
+-include_lib("common_test/src/ct_util.hrl").
+-include_lib("common_test/include/ct_event.hrl").
+
+
+%% CT Hooks
+-export([id/1]).
+
+id(Opts) ->
+ empty_cth:id(Opts),
+ exit(diediedie).
+
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/crash_init_cth.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/crash_init_cth.erl
new file mode 100644
index 0000000000..596b4fade0
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/crash_init_cth.erl
@@ -0,0 +1,34 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(crash_init_cth).
+
+
+-include_lib("common_test/src/ct_util.hrl").
+-include_lib("common_test/include/ct_event.hrl").
+
+
+%% CT Hooks
+-export([init/2]).
+
+init(Id, Opts) ->
+ empty_cth:init(Id, Opts),
+ exit(diediedie).
+
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_cth_empty_SUITE.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_cth_empty_SUITE.erl
new file mode 100644
index 0000000000..dcba113eab
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_cth_empty_SUITE.erl
@@ -0,0 +1,47 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(ct_cth_empty_SUITE).
+
+-suite_defaults([{timetrap, {minutes, 10}}]).
+
+%% Note: This directive should only be used in test suites.
+-compile(export_all).
+
+-include("ct.hrl").
+
+%% Test server callback functions
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_testcase(_TestCase, Config) ->
+ Config.
+
+end_per_testcase(_TestCase, _Config) ->
+ ok.
+
+all() ->
+ [test_case].
+
+%% Test cases starts here.
+test_case(Config) when is_list(Config) ->
+ ok.
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_cth_fail_one_skip_one_SUITE.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_cth_fail_one_skip_one_SUITE.erl
new file mode 100644
index 0000000000..b2f22d8257
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_cth_fail_one_skip_one_SUITE.erl
@@ -0,0 +1,64 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(ct_cth_fail_one_skip_one_SUITE).
+
+-suite_defaults([{timetrap, {minutes, 10}}]).
+
+%% Note: This directive should only be used in test suites.
+-compile(export_all).
+
+-include("ct.hrl").
+
+%% Test server callback functions
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_Group,Config) ->
+ Config.
+
+end_per_group(_Group,_Config) ->
+ ok.
+
+init_per_testcase(test_case2, Config) ->
+ {skip,"skip it"};
+init_per_testcase(_TestCase, Config) ->
+ Config.
+
+end_per_testcase(_TestCase, _Config) ->
+ ok.
+
+groups() ->
+ [{group1,[parallel],[{group2,[parallel],[test_case1,test_case2,test_case3]}]}].
+
+all() ->
+ [{group,group1}].
+
+%% Test cases starts here.
+test_case1(Config) ->
+ ok = nok.
+
+test_case2(Config) ->
+ ok.
+
+test_case3(Config) ->
+ ok.
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_cth_fail_per_suite_SUITE.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_cth_fail_per_suite_SUITE.erl
new file mode 100644
index 0000000000..48816523c7
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_cth_fail_per_suite_SUITE.erl
@@ -0,0 +1,47 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(ct_cth_fail_per_suite_SUITE).
+
+-suite_defaults([{timetrap, {minutes, 10}}]).
+
+%% Note: This directive should only be used in test suites.
+-compile(export_all).
+
+-include("ct.hrl").
+
+%% Test server callback functions
+init_per_suite(Config) ->
+ ok = nok.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_testcase(_TestCase, Config) ->
+ Config.
+
+end_per_testcase(_TestCase, _Config) ->
+ ok.
+
+all() ->
+ [test_case].
+
+%% Test cases starts here.
+test_case(Config) when is_list(Config) ->
+ ok.
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_exit_in_init_scope_suite_cth_SUITE.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_exit_in_init_scope_suite_cth_SUITE.erl
new file mode 100644
index 0000000000..6fa77128ab
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_exit_in_init_scope_suite_cth_SUITE.erl
@@ -0,0 +1,50 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(ct_exit_in_init_scope_suite_cth_SUITE).
+
+-suite_defaults([{timetrap, {minutes, 10}}]).
+
+%% Note: This directive should only be used in test suites.
+-compile(export_all).
+
+-include_lib("common_test/include/ct.hrl").
+
+%% Test server callback functions
+suite() ->
+ [{ct_hooks,[crash_init_cth]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_testcase(_TestCase, Config) ->
+ Config.
+
+end_per_testcase(_TestCase, _Config) ->
+ ok.
+
+all() ->
+ [test_case].
+
+%% Test cases starts here.
+test_case(Config) when is_list(Config) ->
+ ok.
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_per_group_cth_SUITE.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_per_group_cth_SUITE.erl
new file mode 100644
index 0000000000..18af37096a
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_per_group_cth_SUITE.erl
@@ -0,0 +1,56 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(ct_scope_per_group_cth_SUITE).
+
+-suite_defaults([{timetrap, {minutes, 10}}]).
+
+%% Note: This directive should only be used in test suites.
+-compile(export_all).
+
+-include("ct.hrl").
+
+%% Test server callback functions
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_testcase(_TestCase, Config) ->
+ Config.
+
+end_per_testcase(_TestCase, _Config) ->
+ ok.
+
+init_per_group(GroupName, Config) ->
+ [{ct_hooks,[empty_cth]}|Config].
+
+end_per_group(GroupName, Config) ->
+ ok.
+
+all() ->
+ [{group,group1}].
+
+groups() ->
+ [{group1,[],[test_case]}].
+
+%% Test cases starts here.
+test_case(Config) when is_list(Config) ->
+ ok.
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_per_group_state_cth_SUITE.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_per_group_state_cth_SUITE.erl
new file mode 100644
index 0000000000..a34474ebfd
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_per_group_state_cth_SUITE.erl
@@ -0,0 +1,56 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(ct_scope_per_group_state_cth_SUITE).
+
+-suite_defaults([{timetrap, {minutes, 10}}]).
+
+%% Note: This directive should only be used in test suites.
+-compile(export_all).
+
+-include("ct.hrl").
+
+%% Test server callback functions
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_testcase(_TestCase, Config) ->
+ Config.
+
+end_per_testcase(_TestCase, _Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ [{ct_hooks,[{empty_cth,[test]}]}|Config].
+
+end_per_group(_GroupName, _Config) ->
+ ok.
+
+all() ->
+ [{group,group1}].
+
+groups() ->
+ [{group1,[],[test_case]}].
+
+%% Test cases starts here.
+test_case(Config) when is_list(Config) ->
+ ok.
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_per_suite_cth_SUITE.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_per_suite_cth_SUITE.erl
new file mode 100644
index 0000000000..a3a8f2602f
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_per_suite_cth_SUITE.erl
@@ -0,0 +1,47 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(ct_scope_per_suite_cth_SUITE).
+
+-suite_defaults([{timetrap, {minutes, 10}}]).
+
+%% Note: This directive should only be used in test suites.
+-compile(export_all).
+
+-include("ct.hrl").
+
+%% Test server callback functions
+init_per_suite(Config) ->
+ [{ct_hooks,[empty_cth]}|Config].
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_testcase(_TestCase, Config) ->
+ Config.
+
+end_per_testcase(_TestCase, _Config) ->
+ ok.
+
+all() ->
+ [test_case].
+
+%% Test cases starts here.
+test_case(Config) when is_list(Config) ->
+ ok.
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_per_suite_state_cth_SUITE.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_per_suite_state_cth_SUITE.erl
new file mode 100644
index 0000000000..3f643d6709
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_per_suite_state_cth_SUITE.erl
@@ -0,0 +1,47 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(ct_scope_per_suite_state_cth_SUITE).
+
+-suite_defaults([{timetrap, {minutes, 10}}]).
+
+%% Note: This directive should only be used in test suites.
+-compile(export_all).
+
+-include("ct.hrl").
+
+%% Test server callback functions
+init_per_suite(Config) ->
+ [{ct_hooks,[{empty_cth,[test]}]}|Config].
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_testcase(_TestCase, Config) ->
+ Config.
+
+end_per_testcase(_TestCase, _Config) ->
+ ok.
+
+all() ->
+ [test_case].
+
+%% Test cases starts here.
+test_case(Config) when is_list(Config) ->
+ ok.
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_per_tc_cth_SUITE.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_per_tc_cth_SUITE.erl
new file mode 100644
index 0000000000..1c942937eb
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_per_tc_cth_SUITE.erl
@@ -0,0 +1,110 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(ct_scope_per_tc_cth_SUITE).
+
+-suite_defaults([{timetrap, {minutes, 10}}]).
+
+%% Note: This directive should only be used in test suites.
+-compile(export_all).
+
+-include("ct.hrl").
+
+%% Test server callback functions
+%%--------------------------------------------------------------------
+%% @doc
+%% Config - [tuple()]
+%% A list of key/value pairs, holding the test case configuration.
+%%
+%% Initiation before the whole suite
+%%
+%% Note: This function is free to add any key/value pairs to the Config
+%% variable, but should NOT alter/remove any existing entries.
+%%
+%% @spec init_per_suite(Config) -> Config
+%% @end
+%%--------------------------------------------------------------------
+init_per_suite(Config) ->
+ Config.
+
+%%--------------------------------------------------------------------
+%% @doc
+%% Config - [tuple()]
+%% A list of key/value pairs, holding the test case configuration.
+%%
+%% Cleanup after the whole suite
+%%
+%% @spec end_per_suite(Config) -> _
+%% @end
+%%--------------------------------------------------------------------
+end_per_suite(_Config) ->
+ ok.
+
+%%--------------------------------------------------------------------
+%% @doc
+%% Case - atom()
+%% Name of the test case that is about to be run.
+%% Config - [tuple()]
+%% A list of key/value pairs, holding the test case configuration.
+%%
+%% Initiation before each test case
+%%
+%% Note: This function is free to add any key/value pairs to the Config
+%% variable, but should NOT alter/remove any existing entries.
+%% Initiation before each test case
+%%
+%% @spec init_per_testcase(TestCase, Config) -> Config
+%% @end
+%%--------------------------------------------------------------------
+init_per_testcase(_TestCase, Config) ->
+ [{ct_hooks,[empty_cth]}|Config].
+
+%%--------------------------------------------------------------------
+%% @doc
+%% Case - atom()
+%% Name of the test case that is about to be run.
+%% Config - [tuple()]
+%% A list of key/value pairs, holding the test case configuration.
+%%
+%% Cleanup after each test case
+%%
+%% @spec end_per_testcase(TestCase, Config) -> _
+%% @end
+%%--------------------------------------------------------------------
+end_per_testcase(_TestCase, _Config) ->
+ ok.
+
+%%--------------------------------------------------------------------
+%% @doc
+%% TestCases - [Case]
+%% Case - atom()
+%% Name of a test case.
+%%
+%% Returns a list of all test cases in this test suite
+%%
+%% @spec all() -> TestCases
+%% @end
+%%--------------------------------------------------------------------
+all() ->
+ [test_case].
+
+%% Test cases starts here.
+%%--------------------------------------------------------------------
+test_case(Config) when is_list(Config) ->
+ ok.
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_suite_crash_in_cth_SUITE.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_suite_crash_in_cth_SUITE.erl
new file mode 100644
index 0000000000..5aa6b0132d
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_suite_crash_in_cth_SUITE.erl
@@ -0,0 +1,50 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(ct_scope_suite_crash_in_cth_SUITE).
+
+-suite_defaults([{timetrap, {minutes, 10}}]).
+
+%% Note: This directive should only be used in test suites.
+-compile(export_all).
+
+-include("ct.hrl").
+
+%% Test server callback functions
+suite() ->
+ [{ct_hooks,[fail_pre_suite_cth]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_testcase(_TestCase, Config) ->
+ Config.
+
+end_per_testcase(_TestCase, _Config) ->
+ ok.
+
+all() ->
+ [test_case].
+
+%% Test cases starts here.
+test_case(Config) when is_list(Config) ->
+ ok.
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_suite_cth_SUITE.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_suite_cth_SUITE.erl
new file mode 100644
index 0000000000..482e87a54f
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_suite_cth_SUITE.erl
@@ -0,0 +1,50 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(ct_scope_suite_cth_SUITE).
+
+-suite_defaults([{timetrap, {minutes, 10}}]).
+
+%% Note: This directive should only be used in test suites.
+-compile(export_all).
+
+-include("ct.hrl").
+
+%% Test server callback functions
+suite() ->
+ [{ct_hooks,[empty_cth]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_testcase(_TestCase, Config) ->
+ Config.
+
+end_per_testcase(_TestCase, _Config) ->
+ ok.
+
+all() ->
+ [test_case].
+
+%% Test cases starts here.
+test_case(Config) when is_list(Config) ->
+ ok.
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_suite_state_cth_SUITE.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_suite_state_cth_SUITE.erl
new file mode 100644
index 0000000000..7b4c9b3fab
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_scope_suite_state_cth_SUITE.erl
@@ -0,0 +1,50 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(ct_scope_suite_state_cth_SUITE).
+
+-suite_defaults([{timetrap, {minutes, 10}}]).
+
+%% Note: This directive should only be used in test suites.
+-compile(export_all).
+
+-include("ct.hrl").
+
+%% Test server callback functions
+suite() ->
+ [{ct_hooks,[{empty_cth,[test]}]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_testcase(_TestCase, Config) ->
+ Config.
+
+end_per_testcase(_TestCase, _Config) ->
+ ok.
+
+all() ->
+ [test_case].
+
+%% Test cases starts here.
+test_case(Config) when is_list(Config) ->
+ ok.
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_update_config_SUITE.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_update_config_SUITE.erl
new file mode 100644
index 0000000000..3c1f5669e8
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/ct_update_config_SUITE.erl
@@ -0,0 +1,56 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(ct_update_config_SUITE).
+
+-suite_defaults([{timetrap, {minutes, 10}}]).
+
+%% Note: This directive should only be used in test suites.
+-compile(export_all).
+
+-include("ct.hrl").
+
+%% Test server callback functions
+init_per_suite(Config) ->
+ [{init_per_suite,now()}|Config].
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_testcase(_TestCase, Config) ->
+ [{init_per_testcase,now()}|Config].
+
+end_per_testcase(_TestCase, _Config) ->
+ ok.
+
+init_per_group(GroupName, Config) ->
+ [{init_per_group,now()}|Config].
+
+end_per_group(GroupName, Config) ->
+ ok.
+
+all() ->
+ [{group,group1}].
+
+groups() ->
+ [{group1,[],[test_case]}].
+
+%% Test cases starts here.
+test_case(Config) when is_list(Config) ->
+ ok.
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/empty_cth.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/empty_cth.erl
new file mode 100644
index 0000000000..ebebfd18a9
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/empty_cth.erl
@@ -0,0 +1,278 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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%
+%%
+
+%%% @doc Common Test Example Suite Callback module.
+%%%
+%%% <p>This module gives an example of a common test CTH (Common Test Hook).
+%%% There are many ways to add a CTH to a test run, you can do it either in
+%%% the command line using -ct_hook, in a test spec using
+%%% {ct_hook,M} or in the suite it self by returning ct_hook
+%%% from either suite/0, init_per_suite/1, init_per_group/2 and
+%%% init_per_testcase/2. The scope of the CTH is determined by where is it
+%%% started. If it is started in the command line or test spec then it will
+%%% be stopped at the end of all tests. If it is started in init_per_suite,
+%%% it will be stopped after end_per_suite and so on. See terminate
+%%% documentation for a table describing the scoping machanics.
+%%%
+%%% All of callbacks except init/1 in a CTH are optional.</p>
+
+-module(empty_cth).
+
+%% CT Hooks
+-export([id/1]).
+-export([init/2]).
+
+-export([pre_init_per_suite/3]).
+-export([post_init_per_suite/4]).
+-export([pre_end_per_suite/3]).
+-export([post_end_per_suite/4]).
+
+-export([pre_init_per_group/3]).
+-export([post_init_per_group/4]).
+-export([pre_end_per_group/3]).
+-export([post_end_per_group/4]).
+
+-export([pre_init_per_testcase/3]).
+-export([post_end_per_testcase/4]).
+
+-export([on_tc_fail/3]).
+-export([on_tc_skip/3]).
+
+-export([terminate/1]).
+
+-include_lib("common_test/src/ct_util.hrl").
+-include_lib("common_test/include/ct_event.hrl").
+
+-type proplist() :: list({atom(),term()}).
+-type config() :: proplist().
+-type reason() :: term().
+-type skip_or_fail() :: {skip, reason()} |
+ {auto_skip, reason()} |
+ {fail, reason()} |
+ {'EXIT',reason()}.
+
+-record(state, { id = ?MODULE :: term()}).
+
+%% @doc Always called before any other callback function. Use this to initiate
+%% any common state. It should return an state for this CTH.
+-spec init(Id :: term(), Opts :: proplist()) ->
+ State :: #state{}.
+init(Id, Opts) ->
+ gen_event:notify(?CT_EVMGR_REF, #event{ name = cth, node = node(),
+ data = {?MODULE, init, [Id, Opts]}}),
+ Opts.
+
+%% @doc The ID is used to uniquly identify an CTH instance, if two CTH's
+%% return the same ID the seconds CTH is ignored. This function should NOT
+%% have any side effects as it might be called multiple times by common test.
+-spec id(Opts :: proplist()) ->
+ Id :: term().
+id(Opts) ->
+ gen_event:notify(?CT_EVMGR_REF, #event{ name = cth, node = node(),
+ data = {?MODULE, id, [Opts]}}),
+ now().
+
+%% @doc Called before init_per_suite is called. Note that this callback is
+%% only called if the CTH is added before init_per_suite is run (eg. in a test
+%% specification, suite/0 function etc).
+%% You can change the config in the this function.
+-spec pre_init_per_suite(Suite :: atom(),
+ Config :: config(),
+ State :: #state{}) ->
+ {config() | skip_or_fail(), NewState :: #state{}}.
+pre_init_per_suite(Suite,Config,State) ->
+ gen_event:notify(
+ ?CT_EVMGR_REF, #event{ name = cth, node = node(),
+ data = {?MODULE, pre_init_per_suite,
+ [Suite,Config,State]}}),
+ {Config, State}.
+
+%% @doc Called after init_per_suite.
+%% you can change the return value in this function.
+-spec post_init_per_suite(Suite :: atom(),
+ Config :: config(),
+ Return :: config() | skip_or_fail(),
+ State :: #state{}) ->
+ {config() | skip_or_fail(), NewState :: #state{}}.
+post_init_per_suite(Suite,Config,Return,State) ->
+ gen_event:notify(
+ ?CT_EVMGR_REF, #event{ name = cth, node = node(),
+ data = {?MODULE, post_init_per_suite,
+ [Suite,Config,Return,State]}}),
+ {Return, State}.
+
+%% @doc Called before end_per_suite. The config/state can be changed here,
+%% though it will only affect the *end_per_suite function.
+-spec pre_end_per_suite(Suite :: atom(),
+ Config :: config() | skip_or_fail(),
+ State :: #state{}) ->
+ {ok | skip_or_fail(), NewState :: #state{}}.
+pre_end_per_suite(Suite,Config,State) ->
+ gen_event:notify(
+ ?CT_EVMGR_REF, #event{ name = cth, node = node(),
+ data = {?MODULE, pre_end_per_suite,
+ [Suite,Config,State]}}),
+ {Config, State}.
+
+%% @doc Called after end_per_suite. Note that the config cannot be
+%% changed here, only the status of the suite.
+-spec post_end_per_suite(Suite :: atom(),
+ Config :: config(),
+ Return :: term(),
+ State :: #state{}) ->
+ {ok | skip_or_fail(), NewState :: #state{}}.
+post_end_per_suite(Suite,Config,Return,State) ->
+ gen_event:notify(
+ ?CT_EVMGR_REF, #event{ name = cth, node = node(),
+ data = {?MODULE, post_end_per_suite,
+ [Suite,Config,Return,State]}}),
+ {Return, State}.
+
+%% @doc Called before each init_per_group.
+%% You can change the config in this function.
+-spec pre_init_per_group(Group :: atom(),
+ Config :: config(),
+ State :: #state{}) ->
+ {config() | skip_or_fail(), NewState :: #state{}}.
+pre_init_per_group(Group,Config,State) ->
+ gen_event:notify(
+ ?CT_EVMGR_REF, #event{ name = cth, node = node(),
+ data = {?MODULE, pre_init_per_group,
+ [Group,Config,State]}}),
+ {Config, State}.
+
+%% @doc Called after each init_per_group.
+%% You can change the return value in this function.
+-spec post_init_per_group(Group :: atom(),
+ Config :: config(),
+ Return :: config() | skip_or_fail(),
+ State :: #state{}) ->
+ {config() | skip_or_fail(), NewState :: #state{}}.
+post_init_per_group(Group,Config,Return,State) ->
+ gen_event:notify(
+ ?CT_EVMGR_REF, #event{ name = cth, node = node(),
+ data = {?MODULE, post_init_per_group,
+ [Group,Config,Return,State]}}),
+ {Return, State}.
+
+%% @doc Called after each end_per_group. The config/state can be changed here,
+%% though it will only affect the *end_per_group functions.
+-spec pre_end_per_group(Group :: atom(),
+ Config :: config() | skip_or_fail(),
+ State :: #state{}) ->
+ {ok | skip_or_fail(), NewState :: #state{}}.
+pre_end_per_group(Group,Config,State) ->
+ gen_event:notify(
+ ?CT_EVMGR_REF, #event{ name = cth, node = node(),
+ data = {?MODULE, pre_end_per_group,
+ [Group,Config,State]}}),
+ {Config, State}.
+
+%% @doc Called after each end_per_group. Note that the config cannot be
+%% changed here, only the status of the group.
+-spec post_end_per_group(Group :: atom(),
+ Config :: config(),
+ Return :: term(),
+ State :: #state{}) ->
+ {ok | skip_or_fail(), NewState :: #state{}}.
+post_end_per_group(Group,Config,Return,State) ->
+ gen_event:notify(
+ ?CT_EVMGR_REF, #event{ name = cth, node = node(),
+ data = {?MODULE, post_end_per_group,
+ [Group,Config,Return,State]}}),
+ {Return, State}.
+
+%% @doc Called before each test case.
+%% You can change the config in this function.
+-spec pre_init_per_testcase(TC :: atom(),
+ Config :: config(),
+ State :: #state{}) ->
+ {config() | skip_or_fail(), NewState :: #state{}}.
+pre_init_per_testcase(TC,Config,State) ->
+ gen_event:notify(
+ ?CT_EVMGR_REF, #event{ name = cth, node = node(),
+ data = {?MODULE, pre_init_per_testcase,
+ [TC,Config,State]}}),
+ {Config, State}.
+
+%% @doc Called after each test case. Note that the config cannot be
+%% changed here, only the status of the test case.
+-spec post_end_per_testcase(TC :: atom(),
+ Config :: config(),
+ Return :: term(),
+ State :: #state{}) ->
+ {ok | skip_or_fail(), NewState :: #state{}}.
+post_end_per_testcase(TC,Config,Return,State) ->
+ gen_event:notify(
+ ?CT_EVMGR_REF, #event{ name = cth, node = node(),
+ data = {?MODULE, post_end_per_testcase,
+ [TC,Config,Return,State]}}),
+ {Return, State}.
+
+%% @doc Called after post_init_per_suite, post_end_per_suite, post_init_per_group,
+%% post_end_per_group and post_end_per_tc if the suite, group or test case failed.
+%% This function should be used for extra cleanup which might be needed.
+%% It is not possible to modify the config or the status of the test run.
+-spec on_tc_fail(TC :: init_per_suite | end_per_suite |
+ init_per_group | end_per_group | atom(),
+ Reason :: term(), State :: #state{}) ->
+ NewState :: #state{}.
+on_tc_fail(TC, Reason, State) ->
+ gen_event:notify(
+ ?CT_EVMGR_REF, #event{ name = cth, node = node(),
+ data = {?MODULE, on_tc_fail,
+ [TC,Reason,State]}}),
+ State.
+
+%% @doc Called when a test case is skipped by either user action
+%% or due to an init function failing. Test case can be
+%% end_per_suite, init_per_group, end_per_group and the actual test cases.
+-spec on_tc_skip(TC :: end_per_suite |
+ init_per_group | end_per_group | atom(),
+ {tc_auto_skip, {failed, {Mod :: atom(), Function :: atom(), Reason :: term()}}} |
+ {tc_user_skip, {skipped, Reason :: term()}},
+ State :: #state{}) ->
+ NewState :: #state{}.
+on_tc_skip(TC, Reason, State) ->
+ gen_event:notify(
+ ?CT_EVMGR_REF, #event{ name = cth, node = node(),
+ data = {?MODULE, on_tc_skip,
+ [TC,Reason,State]}}),
+ State.
+
+%% @doc Called when the scope of the CTH is done, this depends on
+%% when the CTH was specified. This translation table describes when this
+%% function is called.
+%%
+%% | Started in | terminate called |
+%% |---------------------|-------------------------|
+%% | command_line | after all tests are run |
+%% | test spec | after all tests are run |
+%% | suite/0 | after SUITE is done |
+%% | init_per_suite/1 | after SUITE is done |
+%% | init_per_group/2 | after group is done |
+%% |-----------------------------------------------|
+%%
+-spec terminate(State :: #state{}) ->
+ term().
+terminate(State) ->
+ gen_event:notify(
+ ?CT_EVMGR_REF, #event{ name = cth, node = node(),
+ data = {?MODULE, terminate, [State]}}),
+ ok.
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/fail_post_suite_cth.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/fail_post_suite_cth.erl
new file mode 100644
index 0000000000..5af9906df0
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/fail_post_suite_cth.erl
@@ -0,0 +1,72 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(fail_post_suite_cth).
+
+
+-include_lib("common_test/src/ct_util.hrl").
+-include_lib("common_test/include/ct_event.hrl").
+
+
+%% CT Hooks
+-compile(export_all).
+
+init(Id, Opts) ->
+ empty_cth:init(Id, Opts).
+
+pre_init_per_suite(Suite, Config, State) ->
+ empty_cth:pre_init_per_suite(Suite,Config,State).
+
+post_init_per_suite(Suite,Config,Return,State) ->
+ empty_cth:post_init_per_suite(Suite,Config,Return,State),
+ {{fail, "Test failure"}, State}.
+
+pre_end_per_suite(Suite,Config,State) ->
+ empty_cth:pre_end_per_suite(Suite,Config,State).
+
+post_end_per_suite(Suite,Config,Return,State) ->
+ empty_cth:post_end_per_suite(Suite,Config,Return,State).
+
+pre_init_per_group(Group,Config,State) ->
+ empty_cth:pre_init_per_group(Group,Config,State).
+
+post_init_per_group(Group,Config,Return,State) ->
+ empty_cth:post_init_per_group(Group,Config,Return,State).
+
+pre_end_per_group(Group,Config,State) ->
+ empty_cth:pre_end_per_group(Group,Config,State).
+
+post_end_per_group(Group,Config,Return,State) ->
+ empty_cth:post_end_per_group(Group,Config,Return,State).
+
+pre_init_per_testcase(TC,Config,State) ->
+ empty_cth:pre_init_per_testcase(TC,Config,State).
+
+post_end_per_testcase(TC,Config,Return,State) ->
+ empty_cth:post_end_per_testcase(TC,Config,Return,State).
+
+on_tc_fail(TC, Reason, State) ->
+ empty_cth:on_tc_fail(TC,Reason,State).
+
+on_tc_skip(TC, Reason, State) ->
+ empty_cth:on_tc_skip(TC,Reason,State).
+
+terminate(State) ->
+ empty_cth:terminate(State).
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/fail_pre_suite_cth.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/fail_pre_suite_cth.erl
new file mode 100644
index 0000000000..8227b408cd
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/fail_pre_suite_cth.erl
@@ -0,0 +1,72 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(fail_pre_suite_cth).
+
+
+-include_lib("common_test/src/ct_util.hrl").
+-include_lib("common_test/include/ct_event.hrl").
+
+
+%% CT Hooks
+-compile(export_all).
+
+init(Id, Opts) ->
+ empty_cth:init(Id, Opts).
+
+pre_init_per_suite(Suite, Config, State) ->
+ empty_cth:pre_init_per_suite(Suite,Config,State),
+ {{fail, "Test failure"}, State}.
+
+post_init_per_suite(Suite,Config,Return,State) ->
+ empty_cth:post_init_per_suite(Suite,Config,Return,State).
+
+pre_end_per_suite(Suite,Config,State) ->
+ empty_cth:pre_end_per_suite(Suite,Config,State).
+
+post_end_per_suite(Suite,Config,Return,State) ->
+ empty_cth:post_end_per_suite(Suite,Config,Return,State).
+
+pre_init_per_group(Group,Config,State) ->
+ empty_cth:pre_init_per_group(Group,Config,State).
+
+post_init_per_group(Group,Config,Return,State) ->
+ empty_cth:post_init_per_group(Group,Config,Return,State).
+
+pre_end_per_group(Group,Config,State) ->
+ empty_cth:pre_end_per_group(Group,Config,State).
+
+post_end_per_group(Group,Config,Return,State) ->
+ empty_cth:post_end_per_group(Group,Config,Return,State).
+
+pre_init_per_testcase(TC,Config,State) ->
+ empty_cth:pre_init_per_testcase(TC,Config,State).
+
+post_end_per_testcase(TC,Config,Return,State) ->
+ empty_cth:post_end_per_testcase(TC,Config,Return,State).
+
+on_tc_fail(TC, Reason, State) ->
+ empty_cth:on_tc_fail(TC,Reason,State).
+
+on_tc_skip(TC, Reason, State) ->
+ empty_cth:on_tc_skip(TC,Reason,State).
+
+terminate(State) ->
+ empty_cth:terminate(State).
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/id_no_init_cth.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/id_no_init_cth.erl
new file mode 100644
index 0000000000..1e222c1dbf
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/id_no_init_cth.erl
@@ -0,0 +1,32 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(id_no_init_cth).
+
+
+-include_lib("common_test/src/ct_util.hrl").
+-include_lib("common_test/include/ct_event.hrl").
+
+
+%% CT Hooks
+-export([id/1]).
+
+id(Opts) ->
+ empty_cth:id(Opts).
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/minimal_cth.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/minimal_cth.erl
new file mode 100644
index 0000000000..b87da4e330
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/minimal_cth.erl
@@ -0,0 +1,33 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(minimal_cth).
+
+
+-include_lib("common_test/src/ct_util.hrl").
+-include_lib("common_test/include/ct_event.hrl").
+
+
+%% CT Hooks
+-export([init/2]).
+
+init(Id, Opts) ->
+ empty_cth:init(Id, Opts).
+
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/minimal_terminate_cth.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/minimal_terminate_cth.erl
new file mode 100644
index 0000000000..30721a6b3a
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/minimal_terminate_cth.erl
@@ -0,0 +1,38 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(minimal_terminate_cth).
+
+
+-include_lib("common_test/src/ct_util.hrl").
+-include_lib("common_test/include/ct_event.hrl").
+
+
+%% CT Hooks
+-export([init/2]).
+-export([terminate/1]).
+
+init(Id, Opts) ->
+ empty_cth:init(Id, Opts).
+
+terminate(State) ->
+ empty_cth:terminate(State).
+
+
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/recover_post_suite_cth.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/recover_post_suite_cth.erl
new file mode 100644
index 0000000000..2629448943
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/recover_post_suite_cth.erl
@@ -0,0 +1,74 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(recover_post_suite_cth).
+
+
+-include_lib("common_test/src/ct_util.hrl").
+-include_lib("common_test/include/ct_event.hrl").
+
+
+%% CT Hooks
+-compile(export_all).
+
+init(Id, Opts) ->
+ empty_cth:init(Id, Opts).
+
+pre_init_per_suite(Suite, Config, State) ->
+ empty_cth:pre_init_per_suite(Suite,Config,State).
+
+post_init_per_suite(Suite,Config,{'EXIT',Reason} = Return,State) ->
+ empty_cth:post_init_per_suite(Suite,Config,Return,State),
+ {lists:keydelete(tc_status,1,Config),State};
+post_init_per_suite(Suite,Config,Return,State) ->
+ empty_cth:post_init_per_suite(Suite,Config,Return,State).
+
+pre_end_per_suite(Suite,Config,State) ->
+ empty_cth:pre_end_per_suite(Suite,Config,State).
+
+post_end_per_suite(Suite,Config,Return,State) ->
+ empty_cth:post_end_per_suite(Suite,Config,Return,State).
+
+pre_init_per_group(Group,Config,State) ->
+ empty_cth:pre_init_per_group(Group,Config,State).
+
+post_init_per_group(Group,Config,Return,State) ->
+ empty_cth:post_init_per_group(Group,Config,Return,State).
+
+pre_end_per_group(Group,Config,State) ->
+ empty_cth:pre_end_per_group(Group,Config,State).
+
+post_end_per_group(Group,Config,Return,State) ->
+ empty_cth:post_end_per_group(Group,Config,Return,State).
+
+pre_init_per_testcase(TC,Config,State) ->
+ empty_cth:pre_init_per_testcase(TC,Config,State).
+
+post_end_per_testcase(TC,Config,Return,State) ->
+ empty_cth:post_end_per_testcase(TC,Config,Return,State).
+
+on_tc_fail(TC, Reason, State) ->
+ empty_cth:on_tc_fail(TC,Reason,State).
+
+on_tc_skip(TC, Reason, State) ->
+ empty_cth:on_tc_skip(TC,Reason,State).
+
+terminate(State) ->
+ empty_cth:terminate(State).
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/same_id_cth.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/same_id_cth.erl
new file mode 100644
index 0000000000..49b1b9cada
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/same_id_cth.erl
@@ -0,0 +1,75 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(same_id_cth).
+
+
+-include_lib("common_test/src/ct_util.hrl").
+-include_lib("common_test/include/ct_event.hrl").
+
+
+%% CT Hooks
+-compile(export_all).
+
+id(Opts) ->
+ empty_cth:id(Opts),
+ ?MODULE.
+
+init(Id, Opts) ->
+ empty_cth:init(Id, Opts).
+
+pre_init_per_suite(Suite, Config, State) ->
+ empty_cth:pre_init_per_suite(Suite,Config,State).
+
+post_init_per_suite(Suite,Config,Return,State) ->
+ empty_cth:post_init_per_suite(Suite,Config,Return,State).
+
+pre_end_per_suite(Suite,Config,State) ->
+ empty_cth:pre_end_per_suite(Suite,Config,State).
+
+post_end_per_suite(Suite,Config,Return,State) ->
+ empty_cth:post_end_per_suite(Suite,Config,Return,State).
+
+pre_init_per_group(Group,Config,State) ->
+ empty_cth:pre_init_per_group(Group,Config,State).
+
+post_init_per_group(Group,Config,Return,State) ->
+ empty_cth:post_init_per_group(Group,Config,Return,State).
+
+pre_end_per_group(Group,Config,State) ->
+ empty_cth:pre_end_per_group(Group,Config,State).
+
+post_end_per_group(Group,Config,Return,State) ->
+ empty_cth:post_end_per_group(Group,Config,Return,State).
+
+pre_init_per_testcase(TC,Config,State) ->
+ empty_cth:pre_init_per_testcase(TC,Config,State).
+
+post_end_per_testcase(TC,Config,Return,State) ->
+ empty_cth:post_end_per_testcase(TC,Config,Return,State).
+
+on_tc_fail(TC, Reason, State) ->
+ empty_cth:on_tc_fail(TC,Reason,State).
+
+on_tc_skip(TC, Reason, State) ->
+ empty_cth:on_tc_skip(TC,Reason,State).
+
+terminate(State) ->
+ empty_cth:terminate(State).
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/skip_post_suite_cth.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/skip_post_suite_cth.erl
new file mode 100644
index 0000000000..770fec0a51
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/skip_post_suite_cth.erl
@@ -0,0 +1,72 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(skip_post_suite_cth).
+
+
+-include_lib("common_test/src/ct_util.hrl").
+-include_lib("common_test/include/ct_event.hrl").
+
+
+%% CT Hooks
+-compile(export_all).
+
+init(Id, Opts) ->
+ empty_cth:init(Id, Opts).
+
+pre_init_per_suite(Suite, Config, State) ->
+ empty_cth:pre_init_per_suite(Suite,Config,State).
+
+post_init_per_suite(Suite,Config,Return,State) ->
+ empty_cth:post_init_per_suite(Suite,Config,Return,State),
+ {{skip, "Test skip"}, State}.
+
+pre_end_per_suite(Suite,Config,State) ->
+ empty_cth:pre_end_per_suite(Suite,Config,State).
+
+post_end_per_suite(Suite,Config,Return,State) ->
+ empty_cth:post_end_per_suite(Suite,Config,Return,State).
+
+pre_init_per_group(Group,Config,State) ->
+ empty_cth:pre_init_per_group(Group,Config,State).
+
+post_init_per_group(Group,Config,Return,State) ->
+ empty_cth:post_init_per_group(Group,Config,Return,State).
+
+pre_end_per_group(Group,Config,State) ->
+ empty_cth:pre_end_per_group(Group,Config,State).
+
+post_end_per_group(Group,Config,Return,State) ->
+ empty_cth:post_end_per_group(Group,Config,Return,State).
+
+pre_init_per_testcase(TC,Config,State) ->
+ empty_cth:pre_init_per_testcase(TC,Config,State).
+
+post_end_per_testcase(TC,Config,Return,State) ->
+ empty_cth:post_end_per_testcase(TC,Config,Return,State).
+
+on_tc_fail(TC, Reason, State) ->
+ empty_cth:on_tc_fail(TC,Reason,State).
+
+on_tc_skip(TC, Reason, State) ->
+ empty_cth:on_tc_skip(TC,Reason,State).
+
+terminate(State) ->
+ empty_cth:terminate(State).
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/skip_pre_suite_cth.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/skip_pre_suite_cth.erl
new file mode 100644
index 0000000000..60b1a558ae
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/skip_pre_suite_cth.erl
@@ -0,0 +1,73 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(skip_pre_suite_cth).
+
+
+-include_lib("common_test/src/ct_util.hrl").
+-include_lib("common_test/include/ct_event.hrl").
+
+
+%% CT Hooks
+-compile(export_all).
+
+init(Id, Opts) ->
+ empty_cth:init(Id, Opts).
+
+
+pre_init_per_suite(Suite, Config, State) ->
+ empty_cth:pre_init_per_suite(Suite,Config,State),
+ {{skip, "Test skip"}, State}.
+
+post_init_per_suite(Suite,Config,Return,State) ->
+ empty_cth:post_init_per_suite(Suite,Config,Return,State).
+
+pre_end_per_suite(Suite,Config,State) ->
+ empty_cth:pre_end_per_suite(Suite,Config,State).
+
+post_end_per_suite(Suite,Config,Return,State) ->
+ empty_cth:post_end_per_suite(Suite,Config,Return,State).
+
+pre_init_per_group(Group,Config,State) ->
+ empty_cth:pre_init_per_group(Group,Config,State).
+
+post_init_per_group(Group,Config,Return,State) ->
+ empty_cth:post_init_per_group(Group,Config,Return,State).
+
+pre_end_per_group(Group,Config,State) ->
+ empty_cth:pre_end_per_group(Group,Config,State).
+
+post_end_per_group(Group,Config,Return,State) ->
+ empty_cth:post_end_per_group(Group,Config,Return,State).
+
+pre_init_per_testcase(TC,Config,State) ->
+ empty_cth:pre_init_per_testcase(TC,Config,State).
+
+post_end_per_testcase(TC,Config,Return,State) ->
+ empty_cth:post_end_per_testcase(TC,Config,Return,State).
+
+on_tc_fail(TC, Reason, State) ->
+ empty_cth:on_tc_fail(TC,Reason,State).
+
+on_tc_skip(TC, Reason, State) ->
+ empty_cth:on_tc_skip(TC,Reason,State).
+
+terminate(State) ->
+ empty_cth:terminate(State).
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/state_update_cth.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/state_update_cth.erl
new file mode 100644
index 0000000000..35c990c0be
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/state_update_cth.erl
@@ -0,0 +1,83 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(state_update_cth).
+
+
+-include_lib("common_test/src/ct_util.hrl").
+-include_lib("common_test/include/ct_event.hrl").
+
+%% CT Hooks
+-compile(export_all).
+
+init(Id, Opts) ->
+ State = empty_cth:init(Id, Opts),
+ [init|State].
+
+pre_init_per_suite(Suite, Config, State) ->
+ empty_cth:pre_init_per_suite(Suite,Config,State),
+ {Config, [pre_init_per_suite|State]}.
+
+post_init_per_suite(Suite,Config,Return,State) ->
+ empty_cth:post_init_per_suite(Suite,Config,Return,State),
+ {Config, [post_init_per_suite|State]}.
+
+pre_end_per_suite(Suite,Config,State) ->
+ empty_cth:pre_end_per_suite(Suite,Config,State),
+ {Config, [pre_end_per_suite|State]}.
+
+post_end_per_suite(Suite,Config,Return,State) ->
+ empty_cth:post_end_per_suite(Suite,Config,Return,State),
+ {Return, [post_end_per_suite|State]}.
+
+pre_init_per_group(Group,Config,State) ->
+ empty_cth:pre_init_per_group(Group,Config,State),
+ {Config, [pre_init_per_group|State]}.
+
+post_init_per_group(Group,Config,Return,State) ->
+ empty_cth:post_init_per_group(Group,Config,Return,State),
+ {Return, [post_init_per_group|State]}.
+
+pre_end_per_group(Group,Config,State) ->
+ empty_cth:pre_end_per_group(Group,Config,State),
+ {Config, [pre_end_per_group|State]}.
+
+post_end_per_group(Group,Config,Return,State) ->
+ empty_cth:post_end_per_group(Group,Config,Return,State),
+ {Return, [post_end_per_group|State]}.
+
+pre_init_per_testcase(TC,Config,State) ->
+ empty_cth:pre_init_per_testcase(TC,Config,State),
+ {Config, [pre_init_per_testcase|State]}.
+
+post_end_per_testcase(TC,Config,Return,State) ->
+ empty_cth:post_end_per_testcase(TC,Config,Return,State),
+ {Return, [post_end_per_testcase|State]}.
+
+on_tc_fail(TC, Reason, State) ->
+ empty_cth:on_tc_fail(TC,Reason,State),
+ [on_tc_fail|State].
+
+on_tc_skip(TC, Reason, State) ->
+ empty_cth:on_tc_skip(TC,Reason,State),
+ [on_tc_skip|State].
+
+terminate(State) ->
+ empty_cth:terminate(State).
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/undef_cth.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/undef_cth.erl
new file mode 100644
index 0000000000..cd561771d5
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/undef_cth.erl
@@ -0,0 +1,71 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(undef_cth).
+
+
+-include_lib("common_test/src/ct_util.hrl").
+-include_lib("common_test/include/ct_event.hrl").
+
+
+%% CT Hooks
+-compile(export_all).
+
+init(Id, Opts) ->
+ empty_cth:init(Id, Opts).
+
+pre_init_per_suite(_Suite, _Config, _State) ->
+ lists:flaten([1,2,[3,4]]).
+
+post_init_per_suite(Suite,Config,Return,State) ->
+ empty_cth:post_init_per_suite(Suite,Config,Return,State).
+
+pre_end_per_suite(Suite,Config,State) ->
+ empty_cth:pre_end_per_suite(Suite,Config,State).
+
+post_end_per_suite(Suite,Config,Return,State) ->
+ empty_cth:post_end_per_suite(Suite,Config,Return,State).
+
+pre_init_per_group(Group,Config,State) ->
+ empty_cth:pre_init_per_group(Group,Config,State).
+
+post_init_per_group(Group,Config,Return,State) ->
+ empty_cth:post_init_per_group(Group,Config,Return,State).
+
+pre_end_per_group(Group,Config,State) ->
+ empty_cth:pre_end_per_group(Group,Config,State).
+
+post_end_per_group(Group,Config,Return,State) ->
+ empty_cth:post_end_per_group(Group,Config,Return,State).
+
+pre_init_per_testcase(TC,Config,State) ->
+ empty_cth:pre_init_per_testcase(TC,Config,State).
+
+post_end_per_testcase(TC,Config,Return,State) ->
+ empty_cth:post_end_per_testcase(TC,Config,Return,State).
+
+on_tc_fail(TC, Reason, State) ->
+ empty_cth:on_tc_fail(TC,Reason,State).
+
+on_tc_skip(TC, Reason, State) ->
+ empty_cth:on_tc_skip(TC,Reason,State).
+
+terminate(State) ->
+ empty_cth:terminate(State).
diff --git a/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/update_config_cth.erl b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/update_config_cth.erl
new file mode 100644
index 0000000000..2ee0d7da9c
--- /dev/null
+++ b/lib/common_test/test/ct_hooks_SUITE_data/cth/tests/update_config_cth.erl
@@ -0,0 +1,82 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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(update_config_cth).
+
+
+-include_lib("common_test/src/ct_util.hrl").
+-include_lib("common_test/include/ct_event.hrl").
+
+
+%% CT Hooks
+-compile(export_all).
+
+init(Id, Opts) ->
+ empty_cth:init(Id, Opts).
+
+pre_init_per_suite(Suite, Config, State) ->
+ empty_cth:pre_init_per_suite(Suite,Config,State),
+ {[{pre_init_per_suite,now()}|Config],State}.
+
+post_init_per_suite(Suite,Config,Return,State) ->
+ empty_cth:post_init_per_suite(Suite,Config,Return,State),
+ {[{post_init_per_suite,now()}|Return],State}.
+
+pre_end_per_suite(Suite,Config,State) ->
+ empty_cth:pre_end_per_suite(Suite,Config,State),
+ {[{pre_end_per_suite,now()}|Config],State}.
+
+post_end_per_suite(Suite,Config,Return,State) ->
+ empty_cth:post_end_per_suite(Suite,Config,Return,State),
+ NewConfig = [{post_end_per_suite,now()}|Config],
+ {NewConfig,NewConfig}.
+
+pre_init_per_group(Group,Config,State) ->
+ empty_cth:pre_init_per_group(Group,Config,State),
+ {[{pre_init_per_group,now()}|Config],State}.
+
+post_init_per_group(Group,Config,Return,State) ->
+ empty_cth:post_init_per_group(Group,Config,Return,State),
+ {[{post_init_per_group,now()}|Return],State}.
+
+pre_end_per_group(Group,Config,State) ->
+ empty_cth:pre_end_per_group(Group,Config,State),
+ {[{pre_end_per_group,now()}|Config],State}.
+
+post_end_per_group(Group,Config,Return,State) ->
+ empty_cth:post_end_per_group(Group,Config,Return,State),
+ {[{post_end_per_group,now()}|Config],State}.
+
+pre_init_per_testcase(TC,Config,State) ->
+ empty_cth:pre_init_per_testcase(TC,Config,State),
+ {[{pre_init_per_testcase,now()}|Config],State}.
+
+post_end_per_testcase(TC,Config,Return,State) ->
+ empty_cth:post_end_per_testcase(TC,Config,Return,State),
+ {[{post_end_per_testcase,now()}|Config],State}.
+
+on_tc_fail(TC, Reason, State) ->
+ empty_cth:on_tc_fail(TC,Reason,State).
+
+on_tc_skip(TC, Reason, State) ->
+ empty_cth:on_tc_skip(TC,Reason,State).
+
+terminate(State) ->
+ empty_cth:terminate(State).
diff --git a/lib/common_test/test/ct_master_SUITE.erl b/lib/common_test/test/ct_master_SUITE.erl
index 5ac2866227..1471cc1e0c 100644
--- a/lib/common_test/test/ct_master_SUITE.erl
+++ b/lib/common_test/test/ct_master_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2011. 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
@@ -28,7 +28,7 @@
-module(ct_master_SUITE).
-compile(export_all).
--include_lib("test_server/include/test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include_lib("common_test/include/ct_event.hrl").
-define(eh, ct_test_support_eh).
@@ -81,15 +81,19 @@ end_per_testcase(TestCase, Config) ->
ct_test_support:end_per_testcase(TestCase, Config).
-all() ->
- all(suite).
-all(doc) ->
- [""];
+suite() -> [{ct_hooks,[ts_install_cth]}].
-all(suite) ->
- [
- ct_master_test
- ].
+all() ->
+ [ct_master_test].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
%%--------------------------------------------------------------------
%% TEST CASES
@@ -115,8 +119,9 @@ ct_master_test(Config) when is_list(Config)->
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(groups_suite_1,
- reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ reformat(Events, ?eh),
+ PrivDir, []),
+
find_events(NodeNames, [{tc_start,{master_SUITE,init_per_suite}},
{tc_start,{master_SUITE,first_testcase}},
{tc_start,{master_SUITE,second_testcase}},
@@ -170,7 +175,7 @@ make_spec(DataDir, FileName, NodeNames, Suites, Config)->
ct_test_support:write_testspec(N++Include++EH++C++S++LD++NS, FileName).
-get_log_dir({win32,_},PrivDir, NodeName)->
+get_log_dir({win32,_}, _PrivDir, NodeName)->
case filelib:is_dir(?TEMP_DIR) of
false ->
file:make_dir(?TEMP_DIR);
diff --git a/lib/common_test/test/ct_misc_1_SUITE.erl b/lib/common_test/test/ct_misc_1_SUITE.erl
index 8c8b2d0d41..cb17af9ab5 100644
--- a/lib/common_test/test/ct_misc_1_SUITE.erl
+++ b/lib/common_test/test/ct_misc_1_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2011. 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
@@ -29,7 +29,7 @@
-compile(export_all).
--include_lib("test_server/include/test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include_lib("test_server/include/test_server_line.hrl").
-include_lib("common_test/include/ct_event.hrl").
@@ -57,13 +57,23 @@ init_per_testcase(TestCase, Config) ->
end_per_testcase(TestCase, Config) ->
ct_test_support:end_per_testcase(TestCase, Config).
-all(doc) ->
- [""];
+suite() -> [{ct_hooks,[ts_install_cth]}].
-all(suite) ->
- [
- beam_me_up, parse_table
- ].
+all() ->
+ [beam_me_up, {group,parse_table}].
+
+groups() ->
+ [{parse_table,[parallel],
+ [parse_table_empty, parse_table_single,
+ parse_table_multiline_row,
+ parse_table_one_column_multiline,
+ parse_table_one_column_simple]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
%%--------------------------------------------------------------------
%% TEST CASES
@@ -101,18 +111,12 @@ beam_me_up(Config) when is_list(Config) ->
ct_test_support:log_events(beam_me_up,
reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents = events_to_check(beam_me_up, 1),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
-
-parse_table(suite) ->
- [parse_table_empty, parse_table_single,
- parse_table_multiline_row,
- parse_table_one_column_multiline,
- parse_table_one_column_simple].
-
parse_table_empty(Config) when is_list(Config) ->
String = ["+----+-------+---------+---------+----------+------+--------+",
diff --git a/lib/common_test/test/ct_repeat_1_SUITE.erl b/lib/common_test/test/ct_repeat_1_SUITE.erl
index 1b4cafc9d3..4e842bd6d6 100644
--- a/lib/common_test/test/ct_repeat_1_SUITE.erl
+++ b/lib/common_test/test/ct_repeat_1_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
@@ -29,7 +29,7 @@
-compile(export_all).
--include_lib("test_server/include/test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include_lib("common_test/include/ct_event.hrl").
-define(eh, ct_test_support_eh).
@@ -56,24 +56,26 @@ init_per_testcase(TestCase, Config) ->
end_per_testcase(TestCase, Config) ->
ct_test_support:end_per_testcase(TestCase, Config).
-all(doc) ->
- [];
+suite() -> [{ct_hooks,[ts_install_cth]}].
-all(suite) ->
- [repeat_cs,
- repeat_cs_and_grs,
- repeat_seq,
- repeat_cs_until_any_ok,
- repeat_gr_until_any_ok,
- repeat_cs_until_any_fail,
- repeat_gr_until_any_fail,
- repeat_cs_until_all_ok,
- repeat_gr_until_all_ok,
- repeat_cs_until_all_fail,
- repeat_gr_until_all_fail,
+all() ->
+ [repeat_cs, repeat_cs_and_grs, repeat_seq,
+ repeat_cs_until_any_ok, repeat_gr_until_any_ok,
+ repeat_cs_until_any_fail, repeat_gr_until_any_fail,
+ repeat_cs_until_all_ok, repeat_gr_until_all_ok,
+ repeat_cs_until_all_fail, repeat_gr_until_all_fail,
repeat_seq_until_any_fail,
- repeat_shuffled_seq_until_any_fail
- ].
+ repeat_shuffled_seq_until_any_fail].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%--------------------------------------------------------------------
%% TEST CASES
@@ -157,7 +159,8 @@ execute(TestCase, SuiteName, Group, Config) ->
ct_test_support:log_events(TestCase,
reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents = events_to_check(TestCase),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
@@ -559,7 +562,6 @@ test_events(repeat_cs_until_any_fail) ->
{error,
{{badmatch,2},
[{repeat_1_SUITE,tc_fail_1,1},
- {repeat_1_SUITE,tc_fail_1,1},
{test_server,my_apply,3},
{test_server,ts_tc,3},
{test_server,run_test_case_eval1,6},
diff --git a/lib/common_test/test/ct_sequence_1_SUITE.erl b/lib/common_test/test/ct_sequence_1_SUITE.erl
index 0cf40f106a..5facf90656 100644
--- a/lib/common_test/test/ct_sequence_1_SUITE.erl
+++ b/lib/common_test/test/ct_sequence_1_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
@@ -29,7 +29,7 @@
-compile(export_all).
--include_lib("test_server/include/test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include_lib("common_test/include/ct_event.hrl").
-define(eh, ct_test_support_eh).
@@ -56,13 +56,24 @@ init_per_testcase(TestCase, Config) ->
end_per_testcase(TestCase, Config) ->
ct_test_support:end_per_testcase(TestCase, Config).
-all(suite) ->
- [subgroup_return_fail,
- subgroup_init_fail,
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [subgroup_return_fail, subgroup_init_fail,
subgroup_after_failed_case,
case_after_subgroup_return_fail,
case_after_subgroup_fail_init].
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%--------------------------------------------------------------------
%% TEST CASES
%%--------------------------------------------------------------------
@@ -121,7 +132,8 @@ execute(TestCase, SuiteName, Group, Config) ->
ct_test_support:log_events(TestCase,
reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents = events_to_check(TestCase),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
diff --git a/lib/common_test/test/ct_skip_SUITE.erl b/lib/common_test/test/ct_skip_SUITE.erl
index 2e02061dec..4ba4479208 100644
--- a/lib/common_test/test/ct_skip_SUITE.erl
+++ b/lib/common_test/test/ct_skip_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
@@ -29,7 +29,7 @@
-compile(export_all).
--include_lib("test_server/include/test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include_lib("common_test/include/ct_event.hrl").
-define(eh, ct_test_support_eh).
@@ -56,14 +56,20 @@ init_per_testcase(TestCase, Config) ->
end_per_testcase(TestCase, Config) ->
ct_test_support:end_per_testcase(TestCase, Config).
-all(doc) ->
- [""];
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [auto_skip, user_skip].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [
- auto_skip,
- user_skip
- ].
%%--------------------------------------------------------------------
@@ -93,8 +99,9 @@ auto_skip(Config) when is_list(Config) ->
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(auto_skip,
- reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ reformat(Events, ?eh),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents = events_to_check(auto_skip),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
@@ -116,8 +123,9 @@ user_skip(Config) when is_list(Config) ->
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(user_skip,
- reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ reformat(Events, ?eh),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents = events_to_check(user_skip),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
diff --git a/lib/common_test/test/ct_smoke_test_SUITE.erl b/lib/common_test/test/ct_smoke_test_SUITE.erl
index 05a2c20695..49b38361e2 100644
--- a/lib/common_test/test/ct_smoke_test_SUITE.erl
+++ b/lib/common_test/test/ct_smoke_test_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -29,7 +29,7 @@
-compile(export_all).
--include_lib("test_server/include/test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include_lib("common_test/include/ct_event.hrl").
-define(eh, ct_test_support_eh).
@@ -112,14 +112,22 @@ end_per_testcase(TestCase, Config) ->
%% Description: Returns a description of the test suite (doc) and a
%% list of all test cases in the suite (suite).
%%--------------------------------------------------------------------
-all(doc) ->
- ["Run smoke tests of Common Test."];
+suite() -> [{ct_hooks,[ts_install_cth]}].
-all(suite) ->
- [dir1, dir2, dir1_2,
- suite11, suite21, suite11_21,
+all() ->
+ [dir1, dir2, dir1_2, suite11, suite21, suite11_21,
tc111, tc211, tc111_112].
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%--------------------------------------------------------------------
%% TEST CASES
@@ -167,8 +175,9 @@ dir1(Config) when is_list(Config) ->
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(dir1,
- ct_test_support:reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ ct_test_support:reformat(Events, ?eh),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents = events_to_check(dir1),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
@@ -196,8 +205,9 @@ dir2(Config) when is_list(Config) ->
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(dir2,
- ct_test_support:reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ ct_test_support:reformat(Events, ?eh),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents = events_to_check(dir2),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
@@ -226,8 +236,9 @@ dir1_2(Config) when is_list(Config) ->
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(dir1_2,
- ct_test_support:reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ ct_test_support:reformat(Events, ?eh),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents = events_to_check(dir1_2),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
@@ -256,8 +267,8 @@ suite11(Config) when is_list(Config) ->
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(suite11,
- ct_test_support:reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ ct_test_support:reformat(Events, ?eh),
+ ?config(priv_dir, Config), Opts),
TestEvents = events_to_check(suite11),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
@@ -285,8 +296,8 @@ suite21(Config) when is_list(Config) ->
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(suite21,
- ct_test_support:reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ ct_test_support:reformat(Events, ?eh),
+ ?config(priv_dir, Config), Opts),
TestEvents = events_to_check(suite21),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
@@ -316,8 +327,8 @@ suite11_21(Config) when is_list(Config) ->
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(suite11_21,
- ct_test_support:reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ ct_test_support:reformat(Events, ?eh),
+ ?config(priv_dir, Config), Opts),
TestEvents = events_to_check(suite11_21),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
@@ -347,8 +358,8 @@ tc111(Config) when is_list(Config) ->
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(tc111,
- ct_test_support:reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ ct_test_support:reformat(Events, ?eh),
+ ?config(priv_dir, Config), Opts),
TestEvents = events_to_check(tc111),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
@@ -377,8 +388,8 @@ tc211(Config) when is_list(Config) ->
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(tc211,
- ct_test_support:reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ ct_test_support:reformat(Events, ?eh),
+ ?config(priv_dir, Config), Opts),
TestEvents = events_to_check(tc211),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
@@ -408,8 +419,8 @@ tc111_112(Config) when is_list(Config) ->
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(tc111_112,
- ct_test_support:reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ ct_test_support:reformat(Events, ?eh),
+ ?config(priv_dir, Config), Opts),
TestEvents = events_to_check(tc111_112),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
diff --git a/lib/common_test/test/ct_test_server_if_1_SUITE.erl b/lib/common_test/test/ct_test_server_if_1_SUITE.erl
index eb85409073..4471915e69 100644
--- a/lib/common_test/test/ct_test_server_if_1_SUITE.erl
+++ b/lib/common_test/test/ct_test_server_if_1_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
@@ -29,7 +29,7 @@
-compile(export_all).
--include_lib("test_server/include/test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include_lib("common_test/include/ct_event.hrl").
-define(eh, ct_test_support_eh).
@@ -56,13 +56,20 @@ init_per_testcase(TestCase, Config) ->
end_per_testcase(TestCase, Config) ->
ct_test_support:end_per_testcase(TestCase, Config).
-all(doc) ->
- [""];
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [ts_if_1].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [
- ts_if_1
- ].
%%--------------------------------------------------------------------
@@ -91,8 +98,9 @@ ts_if_1(Config) when is_list(Config) ->
Events = ct_test_support:get_events(ERPid, Config),
ct_test_support:log_events(ts_if_1,
- reformat(Events, ?eh),
- PrivDir),
+ reformat(Events, ?eh),
+ PrivDir,
+ Opts),
TestEvents = events_to_check(ts_if_1),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
diff --git a/lib/common_test/test/ct_test_support.erl b/lib/common_test/test/ct_test_support.erl
index 5e9792f02c..601d5315ce 100644
--- a/lib/common_test/test/ct_test_support.erl
+++ b/lib/common_test/test/ct_test_support.erl
@@ -32,7 +32,8 @@
run/2, run/4, get_opts/1, wait_for_ct_stop/1]).
-export([handle_event/2, start_event_receiver/1, get_events/2,
- verify_events/3, reformat/2, log_events/3]).
+ verify_events/3, reformat/2, log_events/4,
+ join_abs_dirs/2]).
-include_lib("kernel/include/file.hrl").
@@ -58,8 +59,11 @@ init_per_suite(Config, Level) ->
_ ->
ok
end,
- [_,Host] = string:tokens(atom_to_list(node()), "@"),
+ start_slave(Config, Level).
+
+start_slave(Config,Level) ->
+ [_,Host] = string:tokens(atom_to_list(node()), "@"),
test_server:format(0, "Trying to start ~s~n", ["ct@"++Host]),
case slave:start(Host, ct, []) of
{error,Reason} ->
@@ -68,18 +72,19 @@ init_per_suite(Config, Level) ->
test_server:format(0, "Node ~p started~n", [CTNode]),
IsCover = test_server:is_cover(),
if IsCover ->
- cover:start(CTNode);
- true->
- ok
+ cover:start(CTNode);
+ true->
+ ok
end,
- DataDir = ?config(data_dir, Config),
- PrivDir = ?config(priv_dir, Config),
+
+ DataDir = proplists:get_value(data_dir, Config),
+ PrivDir = proplists:get_value(priv_dir, Config),
%% PrivDir as well as directory of Test Server suites
%% have to be in code path on Common Test node.
[_ | Parts] = lists:reverse(filename:split(DataDir)),
TSDir = filename:join(lists:reverse(Parts)),
- AddPathDirs = case ?config(path_dirs, Config) of
+ AddPathDirs = case proplists:get_value(path_dirs, Config) of
undefined -> [];
Ds -> Ds
end,
@@ -106,8 +111,8 @@ init_per_suite(Config, Level) ->
%%% end_per_suite/1
end_per_suite(Config) ->
- CTNode = ?config(ct_node, Config),
- PrivDir = ?config(priv_dir, Config),
+ CTNode = proplists:get_value(ct_node, Config),
+ PrivDir = proplists:get_value(priv_dir, Config),
true = rpc:call(CTNode, code, del_path, [filename:join(PrivDir,"")]),
cover:stop(CTNode),
slave:stop(CTNode),
@@ -117,7 +122,9 @@ end_per_suite(Config) ->
%%% init_per_testcase/2
init_per_testcase(_TestCase, Config) ->
- {_,{_,LogDir}} = lists:keysearch(logdir, 1, get_opts(Config)),
+ Opts = get_opts(Config),
+ NetDir = proplists:get_value(net_dir, Opts),
+ LogDir = join_abs_dirs(NetDir, proplists:get_value(logdir, Opts)),
case lists:keysearch(master, 1, Config) of
false->
test_server:format("See Common Test logs here:\n\n"
@@ -135,10 +142,17 @@ init_per_testcase(_TestCase, Config) ->
%%% end_per_testcase/2
end_per_testcase(_TestCase, Config) ->
- CTNode = ?config(ct_node, Config),
- wait_for_ct_stop(CTNode),
- ok.
-
+ CTNode = proplists:get_value(ct_node, Config),
+ case wait_for_ct_stop(CTNode) of
+ %% Common test was not stopped to we restart node.
+ false ->
+ cover:stop(CTNode),
+ slave:stop(CTNode),
+ start_slave(Config,proplists:get_value(trace_level,Config)),
+ {fail, "Could not stop common_test"};
+ true ->
+ ok
+ end.
%%%-----------------------------------------------------------------
%%%
@@ -158,7 +172,7 @@ write_testspec(TestSpec, TSFile) ->
%%%
get_opts(Config) ->
- PrivDir = ?config(priv_dir, Config),
+ PrivDir = proplists:get_value(priv_dir, Config),
TempDir = case os:getenv("TMP") of
false ->
case os:getenv("TEMP") of
@@ -184,20 +198,48 @@ get_opts(Config) ->
_ ->
TempDir
end,
- InitOpts = ?config(ct_opts, Config),
- [{logdir,LogDir} | InitOpts].
+
+ %% Copy test variables to app environment on new node
+ CtTestVars =
+ case init:get_argument(ct_test_vars) of
+ {ok,[Vars]} ->
+ [begin {ok,Ts,_} = erl_scan:string(Str++"."),
+ {ok,Expr} = erl_parse:parse_term(Ts),
+ Expr
+ end || Str <- Vars];
+ _ ->
+ []
+ end,
+ %% test_server:format("Test variables added to Config: ~p\n\n",
+ %% [CtTestVars]),
+ InitOpts =
+ case proplists:get_value(ct_opts, Config) of
+ undefined -> [];
+ CtOpts -> CtOpts
+ end,
+ [{logdir,LogDir} | InitOpts ++ CtTestVars].
%%%-----------------------------------------------------------------
%%%
run(Opts, Config) ->
- CTNode = ?config(ct_node, Config),
- Level = ?config(trace_level, Config),
+ CTNode = proplists:get_value(ct_node, Config),
+ Level = proplists:get_value(trace_level, Config),
%% use ct interface
test_server:format(Level, "~n[RUN #1] Calling ct:run_test(~p) on ~p~n",
[Opts, CTNode]),
Result1 = rpc:call(CTNode, ct, run_test, [Opts]),
+ case rpc:call(CTNode, erlang, whereis, [ct_util_server]) of
+ undefined ->
+ ok;
+ _ ->
+ test_server:format(Level,
+ "ct_util_server not stopped on ~p yet, waiting 5 s...~n",
+ [CTNode]),
+ timer:sleep(5000),
+ undefined = rpc:call(CTNode, erlang, whereis, [ct_util_server])
+ end,
%% use run_test interface (simulated)
test_server:format(Level, "Saving start opts on ~p: ~p~n", [CTNode,Opts]),
rpc:call(CTNode, application, set_env, [common_test, run_test_start_opts, Opts]),
@@ -213,8 +255,8 @@ run(Opts, Config) ->
end.
run(M, F, A, Config) ->
- CTNode = ?config(ct_node, Config),
- Level = ?config(trace_level, Config),
+ CTNode = proplists:get_value(ct_node, Config),
+ Level = proplists:get_value(trace_level, Config),
test_server:format(Level, "~nCalling ~w:~w(~p) on ~p~n",
[M, F, A, CTNode]),
rpc:call(CTNode, M, F, A).
@@ -229,11 +271,11 @@ wait_for_ct_stop(CTNode) ->
wait_for_ct_stop(0, CTNode) ->
test_server:format(0, "Giving up! Stopping ~p.", [CTNode]),
- ok;
+ false;
wait_for_ct_stop(Retries, CTNode) ->
case rpc:call(CTNode, erlang, whereis, [ct_util_server]) of
undefined ->
- ok;
+ true;
Pid ->
test_server:format(0, "Waiting for CT (~p) to finish (~p)...",
[Pid,Retries]),
@@ -250,11 +292,11 @@ handle_event(EH, Event) ->
ok.
start_event_receiver(Config) ->
- CTNode = ?config(ct_node, Config),
+ CTNode = proplists:get_value(ct_node, Config),
spawn_link(CTNode, fun() -> er() end).
get_events(_, Config) ->
- CTNode = ?config(ct_node, Config),
+ CTNode = proplists:get_value(ct_node, Config),
{event_receiver,CTNode} ! {self(),get_events},
Events = receive {event_receiver,Evs} -> Evs end,
{event_receiver,CTNode} ! stop,
@@ -277,7 +319,7 @@ er_loop(Evs) ->
end.
verify_events(TEvs, Evs, Config) ->
- Node = ?config(ct_node, Config),
+ Node = proplists:get_value(ct_node, Config),
case catch verify_events1(TEvs, Evs, Node, Config) of
{'EXIT',Reason} ->
Reason;
@@ -338,10 +380,15 @@ locate(TEvs, Node, Evs, Config) when is_list(TEvs) ->
data={M,{init_per_group,GroupName,Props}}}},
{TEH,#event{name=tc_done,
node=Node,
- data={M,{init_per_group,GroupName,Props},R}}} | Evs1] ->
- test_server:format("Found ~p!", [InitStart]),
- test_server:format("Found ~p!", [InitDone]),
- verify_events1(TEvs1, Evs1, Node, Config);
+ data={M,{init_per_group,GroupName,Props},Res}}} | Evs1] ->
+ case result_match(R, Res) of
+ false ->
+ nomatch;
+ true ->
+ test_server:format("Found ~p!", [InitStart]),
+ test_server:format("Found ~p!", [InitDone]),
+ verify_events1(TEvs1, Evs1, Node, Config)
+ end;
_ ->
nomatch
end;
@@ -373,9 +420,11 @@ locate({parallel,TEvs}, Node, Evs, Config) ->
EvProps},EvR}}})
when TEH == EH, EvNode == Node, EvM == M,
EvGroupName == GroupName,
- EvProps == Props,
- EvR == R ->
- false;
+ EvProps == Props ->
+ case result_match(R, EvR) of
+ true -> false;
+ false -> true
+ end;
({EH,#event{name=stop_logging,
node=EvNode,data=_}})
when EH == TEH, EvNode == Node ->
@@ -455,7 +504,7 @@ locate({parallel,TEvs}, Node, Evs, Config) ->
node=EvNode,
data={Mod,Func,Result}}} <- Done,
EH == TEH, EvNode == Node, Mod == M,
- Func == F, Result == R] of
+ Func == F, result_match(R, Result)] of
[TcDone|_] ->
test_server:format("Found ~p!", [TEv]),
{lists:delete(TcDone, Done),RemEvs,RemSize};
@@ -498,8 +547,13 @@ locate({parallel,TEvs}, Node, Evs, Config) ->
data={Mod,{end_per_group,
EvGName,EvProps},Res}}}) when
EH == TEH, EvNode == Node, Mod == M,
- EvGName == GroupName, EvProps == Props, Res == R ->
- false;
+ EvGName == GroupName, EvProps == Props ->
+ case result_match(R, Res) of
+ true ->
+ false;
+ false ->
+ true
+ end;
({EH,#event{name=stop_logging,
node=EvNode,data=_}}) when
EH == TEH, EvNode == Node ->
@@ -592,23 +646,29 @@ locate({shuffle,TEvs}, Node, Evs, Config) ->
data={M,{init_per_group,GroupName,EvProps}}}},
{TEH,#event{name=tc_done,
node=Node,
- data={M,{init_per_group,GroupName,EvProps},R}}} | Es] ->
- case proplists:get_value(shuffle, Props) of
- '_' ->
- case proplists:get_value(shuffle, EvProps) of
- false ->
- exit({no_shuffle_prop_found,{M,init_per_group,
- GroupName,EvProps}});
+ data={M,{init_per_group,GroupName,EvProps},Res}}} | Es] ->
+ case result_match(R, Res) of
+ true ->
+ case proplists:get_value(shuffle, Props) of
+ '_' ->
+ case proplists:get_value(shuffle, EvProps) of
+ false ->
+ exit({no_shuffle_prop_found,
+ {M,init_per_group,
+ GroupName,EvProps}});
+ _ ->
+ PropsCmp = proplists:delete(shuffle, EvProps),
+ PropsCmp = proplists:delete(shuffle, Props)
+ end;
_ ->
- PropsCmp = proplists:delete(shuffle, EvProps),
- PropsCmp = proplists:delete(shuffle, Props)
- end;
- _ ->
- Props = EvProps
- end,
- test_server:format("Found ~p!", [InitStart]),
- test_server:format("Found ~p!", [InitDone]),
- {TEs,Es};
+ Props = EvProps
+ end,
+ test_server:format("Found ~p!", [InitStart]),
+ test_server:format("Found ~p!", [InitDone]),
+ {TEs,Es};
+ false ->
+ nomatch
+ end;
_ ->
nomatch
end;
@@ -659,7 +719,7 @@ locate({shuffle,TEvs}, Node, Evs, Config) ->
node=EvNode,
data={Mod,Func,Result}}} <- Done,
EH == TEH, EvNode == Node, Mod == M,
- Func == F, Result == R] of
+ Func == F, result_match(R, Result)] of
[TcDone|_] ->
test_server:format("Found ~p!", [TEv]),
{lists:delete(TcDone, Done),RemEvs,RemSize};
@@ -715,8 +775,13 @@ locate({shuffle,TEvs}, Node, Evs, Config) ->
data={Mod,{end_per_group,
EvGName,_},Res}}}) when
EH == TEH, EvNode == Node, Mod == M,
- EvGName == GroupName, Res == R ->
- false;
+ EvGName == GroupName ->
+ case result_match(R, Res) of
+ true ->
+ false;
+ false ->
+ true
+ end;
({EH,#event{name=stop_logging,
node=EvNode,data=_}}) when
EH == TEH, EvNode == Node ->
@@ -853,54 +918,103 @@ locate({TEH,Name,{'DEF','STOP_TIME'}}, Node, [Ev|Evs], Config) ->
nomatch
end;
-%% to match variable data as a result of a failed test case
-locate({TEH,tc_done,{Mod,Func,{failed,{error,{Slogan,'_'}}}}}, Node, [Ev|Evs], Config) ->
- case Ev of
- {TEH,#event{name=tc_done, node=Node,
- data={Mod,Func,{failed,{error,{Slogan,_}}}}}} ->
- {Config,Evs};
- _ ->
- nomatch
- end;
-
%% to match variable data as a result of an aborted test case
locate({TEH,tc_done,{undefined,undefined,{testcase_aborted,
- {abort_current_testcase,Func},'_'}}},
+ {abort_current_testcase,Func},'_'}}},
Node, [Ev|Evs], Config) ->
case Ev of
- {TEH,#event{name=tc_done, node=Node,
+ {TEH,#event{name=tc_done, node=Node,
data={undefined,undefined,
- {testcase_aborted,{abort_current_testcase,Func},_}}}} ->
+ {testcase_aborted,{abort_current_testcase,Func},_}}}} ->
{Config,Evs};
_ ->
nomatch
end;
-%% matches any event of type Name
-locate({TEH,Name,Data}, Node, [Ev|Evs], Config) when Data == '_' ->
+%% to match variable data as a result of a failed test case
+locate({TEH,tc_done,{Mod,Func,R={SkipOrFail,{_ErrInd,ErrInfo}}}},
+ Node, [Ev|Evs], Config) when ((SkipOrFail == skipped) or
+ (SkipOrFail == failed)) and
+ ((size(ErrInfo) == 2) or
+ (size(ErrInfo) == 3)) ->
case Ev of
- {TEH,#event{name=Name, node=Node}} ->
- {Config,Evs};
+ {TEH,#event{name=tc_done, node=Node,
+ data={Mod,Func,Result}}} ->
+ case result_match(R, Result) of
+ true ->
+ {Config,Evs};
+ false ->
+ nomatch
+ end;
_ ->
nomatch
end;
-locate({TEH,Name,Data}, Node, [Ev|Evs], Config) ->
- case Ev of
- {TEH,#event{name=Name, node=Node, data=Data}} ->
- {Config,Evs};
+%% Negative matching: Given two events, the first should not be present before
+%% the other is matched.
+locate({negative,NotMatch, Match} = Neg, Node, Evs, Config) ->
+ case locate(NotMatch, Node, Evs, Config) of
+ nomatch ->
+ locate(Match, Node, Evs, Config);
_ ->
+ exit({found_negative_event,Neg})
+ end;
+
+%% matches any event of type Name
+locate({TEH,Name,Data}, Node, [{TEH,#event{name=Name,
+ data = EvData,
+ node = Node}}|Evs],
+ Config) ->
+ try match_data(Data, EvData) of
+ match ->
+ {Config,Evs}
+ catch _:_ ->
nomatch
- end.
+ end;
+
+locate({_TEH,_Name,_Data}, _Node, [_|_Evs], _Config) ->
+ nomatch.
+
+match_data(D,D) ->
+ match;
+match_data('_',_) ->
+ match;
+match_data(Fun,Data) when is_function(Fun) ->
+ Fun(Data);
+match_data('$proplist',Proplist) ->
+ match_data(
+ fun(List) ->
+ lists:foreach(fun({_,_}) -> ok end,List)
+ end,Proplist);
+match_data([H1|MatchT],[H2|ValT]) ->
+ match_data(H1,H2),
+ match_data(MatchT,ValT);
+match_data(Tuple1,Tuple2) when is_tuple(Tuple1),is_tuple(Tuple2) ->
+ match_data(tuple_to_list(Tuple1),tuple_to_list(Tuple2));
+match_data([],[]) ->
+ match.
+
+result_match({SkipOrFail,{ErrorInd,{Why,'_'}}},
+ {SkipOrFail,{ErrorInd,{Why,_Stack}}}) ->
+ true;
+result_match({SkipOrFail,{ErrorInd,{EMod,EFunc,{Why,'_'}}}},
+ {SkipOrFail,{ErrorInd,{EMod,EFunc,{Why,_Stack}}}}) ->
+ true;
+result_match(Result, Result) ->
+ true;
+result_match(_, _) ->
+ false.
-log_events(TC, Events, PrivDir) ->
- LogFile = filename:join(PrivDir, atom_to_list(TC)++".events"),
+log_events(TC, Events, EvLogDir, Opts) ->
+ LogFile = filename:join(EvLogDir, atom_to_list(TC)++".events"),
{ok,Dev} = file:open(LogFile, [write]),
io:format(Dev, "[~n", []),
log_events1(Events, Dev, " "),
file:close(Dev),
+ FullLogFile = join_abs_dirs(proplists:get_value(net_dir, Opts),
+ LogFile),
io:format("Events written to logfile: <a href=\"file://~s\">~s</a>~n",
- [LogFile,LogFile]),
+ [FullLogFile,FullLogFile]),
io:format(user, "Events written to logfile: ~p~n", [LogFile]).
log_events1(Evs, Dev, "") ->
@@ -986,13 +1100,25 @@ reformat([], _EH) ->
%%%-----------------------------------------------------------------
%%% MISC HELP FUNCTIONS
+join_abs_dirs(undefined, Dir2) ->
+ Dir2;
+join_abs_dirs(Dir1, Dir2) ->
+ case filename:pathtype(Dir2) of
+ relative ->
+ filename:join(Dir1, Dir2);
+ _ ->
+ [_Abs|Parts] = filename:split(Dir2),
+ filename:join(Dir1, filename:join(Parts))
+ end.
+
create_tmp_logdir(Tmp) ->
LogDir = filename:join(Tmp,"ct"),
file:make_dir(LogDir),
LogDir.
delete_old_logs({win32,_}, Config) ->
- case {?config(priv_dir, Config),?config(logdir, get_opts(Config))} of
+ case {proplists:get_value(priv_dir, Config),
+ proplists:get_value(logdir, get_opts(Config))} of
{LogDir,LogDir} ->
ignore;
{_,LogDir} -> % using tmp for logs
@@ -1004,7 +1130,8 @@ delete_old_logs(_, Config) ->
false ->
ignore;
_ ->
- catch delete_dirs(?config(logdir, get_opts(Config)))
+ catch delete_dirs(proplists:get_value(logdir,
+ get_opts(Config)))
end.
delete_dirs(LogDir) ->
diff --git a/lib/common_test/test/ct_testspec_1_SUITE.erl b/lib/common_test/test/ct_testspec_1_SUITE.erl
index dc399bfb4c..b6dcf63fdf 100644
--- a/lib/common_test/test/ct_testspec_1_SUITE.erl
+++ b/lib/common_test/test/ct_testspec_1_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
@@ -29,7 +29,7 @@
-compile(export_all).
--include_lib("test_server/include/test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include_lib("common_test/include/ct_event.hrl").
-define(eh, ct_test_support_eh).
@@ -56,24 +56,41 @@ init_per_testcase(TestCase, Config) ->
end_per_testcase(TestCase, Config) ->
ct_test_support:end_per_testcase(TestCase, Config).
-all(doc) ->
- ["Run smoke tests of Common Test."];
-
-all(suite) ->
- [all_suites, skip_all_suites,
- suite, skip_suite,
- all_testcases, skip_all_testcases,
- testcase, skip_testcase,
- all_groups, skip_all_groups,
- group, skip_group,
- group_all_testcases, skip_group_all_testcases,
- group_testcase, skip_group_testcase,
- topgroup,
- subgroup, skip_subgroup,
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [all_suites, skip_all_suites, suite, skip_suite,
+ all_testcases, skip_all_testcases, testcase,
+ skip_testcase, all_groups, skip_all_groups, group,
+ skip_group, group_all_testcases,
+ skip_group_all_testcases, group_testcase,
+ skip_group_testcase, topgroup, subgroup, skip_subgroup,
subgroup_all_testcases, skip_subgroup_all_testcases,
subgroup_testcase, skip_subgroup_testcase,
- sub_skipped_by_top,
- testcase_in_multiple_groups].
+ sub_skipped_by_top, testcase_in_multiple_groups,
+ order_of_tests_in_multiple_dirs_no_merge_tests,
+ order_of_tests_in_multiple_suites_no_merge_tests,
+ order_of_suites_in_multiple_dirs_no_merge_tests,
+ order_of_groups_in_multiple_dirs_no_merge_tests,
+ order_of_groups_in_multiple_suites_no_merge_tests,
+ order_of_tests_in_multiple_dirs,
+ order_of_tests_in_multiple_suites,
+ order_of_suites_in_multiple_dirs,
+ order_of_groups_in_multiple_dirs,
+ order_of_groups_in_multiple_suites,
+ order_of_tests_in_multiple_suites_with_skip_no_merge_tests,
+ order_of_tests_in_multiple_suites_with_skip,
+ all_plus_one_tc_no_merge_tests,
+ all_plus_one_tc].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
%%--------------------------------------------------------------------
%% TEST CASES
@@ -366,6 +383,223 @@ testcase_in_multiple_groups(Config) when is_list(Config) ->
setup_and_execute(testcase_in_multiple_groups, TestSpec, Config).
%%%-----------------------------------------------------------------
+%%%
+
+order_of_tests_in_multiple_dirs_no_merge_tests(Config) when is_list(Config) ->
+ DataDir = ?config(data_dir, Config),
+
+ TestDir1 = filename:join(DataDir, "groups_1"),
+ TestDir2 = filename:join(DataDir, "groups_2"),
+ TestSpec = [{merge_tests, false},
+ {cases,TestDir1,groups_12_SUITE,[testcase_1a]},
+ {cases,TestDir2,groups_22_SUITE,[testcase_1]},
+ {cases,TestDir1,groups_12_SUITE,[testcase_1b]}],
+
+ setup_and_execute(order_of_tests_in_multiple_dirs_no_merge_tests,
+ TestSpec, Config).
+
+%%%-----------------------------------------------------------------
+%%%
+
+order_of_tests_in_multiple_suites_no_merge_tests(Config) when is_list(Config) ->
+ DataDir = ?config(data_dir, Config),
+
+ TestDir1 = filename:join(DataDir, "groups_1"),
+ TestSpec = [{merge_tests, false},
+ {cases,TestDir1,groups_12_SUITE,[testcase_1a]},
+ {cases,TestDir1,groups_11_SUITE,[testcase_1]},
+ {cases,TestDir1,groups_12_SUITE,[testcase_1b]}],
+
+ setup_and_execute(order_of_tests_in_multiple_suites_no_merge_tests,
+ TestSpec, Config).
+
+%%%-----------------------------------------------------------------
+%%%
+
+order_of_suites_in_multiple_dirs_no_merge_tests(Config) when is_list(Config) ->
+ DataDir = ?config(data_dir, Config),
+
+ TestDir1 = filename:join(DataDir, "groups_1"),
+ TestDir2 = filename:join(DataDir, "groups_2"),
+ TestSpec = [{merge_tests, false},
+ {suites,TestDir1,groups_12_SUITE},
+ {suites,TestDir2,groups_22_SUITE},
+ {suites,TestDir1,groups_11_SUITE}],
+
+ setup_and_execute(order_of_suites_in_multiple_dirs_no_merge_tests,
+ TestSpec, Config).
+
+%%%-----------------------------------------------------------------
+%%%
+
+order_of_groups_in_multiple_dirs_no_merge_tests(Config) when is_list(Config) ->
+ DataDir = ?config(data_dir, Config),
+
+ TestDir1 = filename:join(DataDir, "groups_1"),
+ TestDir2 = filename:join(DataDir, "groups_2"),
+ TestSpec = [{merge_tests, false},
+ {groups,TestDir1,groups_12_SUITE,test_group_1a},
+ {groups,TestDir2,groups_22_SUITE,test_group_1a},
+ {groups,TestDir1,groups_12_SUITE,test_group_1b}],
+
+ setup_and_execute(order_of_groups_in_multiple_dirs_no_merge_tests,
+ TestSpec, Config).
+
+%%%-----------------------------------------------------------------
+%%%
+
+order_of_groups_in_multiple_suites_no_merge_tests(Config)
+ when is_list(Config) ->
+ DataDir = ?config(data_dir, Config),
+
+ TestDir1 = filename:join(DataDir, "groups_1"),
+ TestSpec = [{merge_tests, false},
+ {groups,TestDir1,groups_12_SUITE,test_group_1a},
+ {groups,TestDir1,groups_11_SUITE,test_group_1a},
+ {groups,TestDir1,groups_12_SUITE,test_group_1b}],
+
+ setup_and_execute(order_of_groups_in_multiple_suites_no_merge_tests,
+ TestSpec, Config).
+
+%%%-----------------------------------------------------------------
+%%%
+
+order_of_tests_in_multiple_suites_with_skip_no_merge_tests(Config)
+ when is_list(Config) ->
+ DataDir = ?config(data_dir, Config),
+
+ TestDir1 = filename:join(DataDir, "groups_1"),
+ TestSpec = [{merge_tests, false},
+ {cases,TestDir1,groups_12_SUITE,[testcase_1a]},
+ {cases,TestDir1,groups_11_SUITE,[testcase_1]},
+ {cases,TestDir1,groups_12_SUITE,[testcase_1b]},
+ {cases,TestDir1,groups_11_SUITE,[testcase_2]},
+ {skip_cases,TestDir1,groups_12_SUITE,[testcase_1b],"Skip it"}],
+
+ setup_and_execute(
+ order_of_tests_in_multiple_suites_with_skip_no_merge_tests,
+ TestSpec, Config).
+
+
+%%%-----------------------------------------------------------------
+%%%
+
+order_of_tests_in_multiple_dirs(Config) when is_list(Config) ->
+ DataDir = ?config(data_dir, Config),
+
+ TestDir1 = filename:join(DataDir, "groups_1"),
+ TestDir2 = filename:join(DataDir, "groups_2"),
+ TestSpec = [{cases,TestDir1,groups_12_SUITE,[testcase_1a]},
+ {cases,TestDir2,groups_22_SUITE,[testcase_1]},
+ {cases,TestDir1,groups_12_SUITE,[testcase_1b]}],
+
+ setup_and_execute(order_of_tests_in_multiple_dirs,
+ TestSpec, Config).
+
+%%%-----------------------------------------------------------------
+%%%
+
+order_of_tests_in_multiple_suites(Config) when is_list(Config) ->
+ DataDir = ?config(data_dir, Config),
+
+ TestDir1 = filename:join(DataDir, "groups_1"),
+ TestSpec = [{cases,TestDir1,groups_12_SUITE,[testcase_1a]},
+ {cases,TestDir1,groups_11_SUITE,[testcase_1]},
+ {cases,TestDir1,groups_12_SUITE,[testcase_1b]}],
+
+ setup_and_execute(order_of_tests_in_multiple_suites,
+ TestSpec, Config).
+
+%%%-----------------------------------------------------------------
+%%%
+
+order_of_suites_in_multiple_dirs(Config) when is_list(Config) ->
+ DataDir = ?config(data_dir, Config),
+
+ TestDir1 = filename:join(DataDir, "groups_1"),
+ TestDir2 = filename:join(DataDir, "groups_2"),
+ TestSpec = [{suites,TestDir1,groups_12_SUITE},
+ {suites,TestDir2,groups_22_SUITE},
+ {suites,TestDir1,groups_11_SUITE}],
+
+ setup_and_execute(order_of_suites_in_multiple_dirs,
+ TestSpec, Config).
+
+%%%-----------------------------------------------------------------
+%%%
+
+order_of_groups_in_multiple_dirs(Config) when is_list(Config) ->
+ DataDir = ?config(data_dir, Config),
+
+ TestDir1 = filename:join(DataDir, "groups_1"),
+ TestDir2 = filename:join(DataDir, "groups_2"),
+ TestSpec = [{groups,TestDir1,groups_12_SUITE,test_group_1a},
+ {groups,TestDir2,groups_22_SUITE,test_group_1a},
+ {groups,TestDir1,groups_12_SUITE,test_group_1b}],
+
+ setup_and_execute(order_of_groups_in_multiple_dirs,
+ TestSpec, Config).
+
+%%%-----------------------------------------------------------------
+%%%
+
+order_of_groups_in_multiple_suites(Config) when is_list(Config) ->
+ DataDir = ?config(data_dir, Config),
+
+ TestDir1 = filename:join(DataDir, "groups_1"),
+ TestSpec = [{groups,TestDir1,groups_12_SUITE,test_group_1a},
+ {groups,TestDir1,groups_11_SUITE,test_group_1a},
+ {groups,TestDir1,groups_12_SUITE,test_group_1b}],
+
+ setup_and_execute(order_of_groups_in_multiple_suites,
+ TestSpec, Config).
+
+%%%-----------------------------------------------------------------
+%%%
+
+order_of_tests_in_multiple_suites_with_skip(Config) when is_list(Config) ->
+ DataDir = ?config(data_dir, Config),
+
+ TestDir1 = filename:join(DataDir, "groups_1"),
+ TestSpec = [{cases,TestDir1,groups_12_SUITE,[testcase_1a]},
+ {cases,TestDir1,groups_11_SUITE,[testcase_1]},
+ {cases,TestDir1,groups_12_SUITE,[testcase_1b]},
+ {cases,TestDir1,groups_11_SUITE,[testcase_2]},
+ {skip_cases,TestDir1,groups_12_SUITE,[testcase_1b],"Skip it!"}],
+
+ setup_and_execute(order_of_tests_in_multiple_suites_with_skip,
+ TestSpec, Config).
+
+%%%-----------------------------------------------------------------
+%%%
+
+all_plus_one_tc_no_merge_tests(Config) when is_list(Config) ->
+
+ DataDir = ?config(data_dir, Config),
+
+ TestDir1 = filename:join(DataDir, "groups_1"),
+ TestSpec = [{merge_tests,false},
+ {suites,TestDir1,groups_12_SUITE},
+ {cases,TestDir1,groups_12_SUITE,[testcase_1a]}],
+
+ setup_and_execute(all_plus_one_tc_no_merge_tests,
+ TestSpec, Config).
+
+%%%-----------------------------------------------------------------
+%%%
+
+all_plus_one_tc(Config) when is_list(Config) ->
+
+ DataDir = ?config(data_dir, Config),
+
+ TestDir1 = filename:join(DataDir, "groups_1"),
+ TestSpec = [{suites,TestDir1,groups_12_SUITE},
+ {cases,TestDir1,groups_12_SUITE,[testcase_1a]}],
+
+ setup_and_execute(all_plus_one_tc,
+ TestSpec, Config).
+
+%%%-----------------------------------------------------------------
%%% HELP FUNCTIONS
%%%-----------------------------------------------------------------
@@ -378,6 +612,12 @@ setup_and_execute(TCName, TestSpec, Config) ->
false -> [{spec,SpecFile},{label,TCName}]
end,
{Opts,ERPid} = setup(TestTerms, Config),
+
+ FullSpecFile = ct_test_support:join_abs_dirs(?config(net_dir, Opts),
+ SpecFile),
+ io:format("~nTest spec created here~n~n<a href=\"file://~s\">~s</a>~n",
+ [FullSpecFile,FullSpecFile]),
+
ok = ct_test_support:run(Opts, Config),
TestSpec1 = [{logdir,proplists:get_value(logdir,Opts)},
{label,proplists:get_value(label,TestTerms)} | TestSpec],
@@ -386,7 +626,8 @@ setup_and_execute(TCName, TestSpec, Config) ->
ct_test_support:log_events(TCName,
reformat(Events, ?eh),
- ?config(priv_dir, Config)),
+ ?config(priv_dir, Config),
+ Opts),
TestEvents = events_to_check(TCName),
ok = ct_test_support:verify_events(TestEvents, Events, Config).
@@ -397,8 +638,6 @@ create_spec_file(SpecDir, TCName, TestSpec) ->
{ok,Dev} = file:open(FileName, [write]),
[io:format(Dev, "~p.~n", [Term]) || Term <- TestSpec],
file:close(Dev),
- io:format("~nTest spec created here~n~n<a href=\"file://~s\">~s</a>~n",
- [FileName,FileName]),
FileName.
setup(Test, Config) when is_tuple(Test) ->
@@ -428,6 +667,720 @@ events_to_check(_, 0) ->
events_to_check(Test, N) ->
test_events(Test) ++ events_to_check(Test, N-1).
+test_events(all_suites) ->
+ [
+ {?eh,start_logging,'_'},
+ {?eh,tc_start,{simple_1_SUITE,init_per_suite}},
+ {?eh,tc_done,{simple_1_SUITE,end_per_suite,'_'}},
+ {?eh,tc_start,{simple_2_SUITE,init_per_suite}},
+ {?eh,test_stats,{4,0,{0,0}}},
+ {?eh,tc_done,{simple_2_SUITE,end_per_suite,'_'}},
+ {negative,{?eh,tc_start,'_'},{?eh,stop_logging,'_'}}
+ ];
+
+test_events(skip_all_suites) ->
+ [
+ {?eh,start_logging,'_'},
+ {?eh,tc_user_skip,{simple_1_SUITE,all,"SKIPPED!"}},
+ {?eh,tc_user_skip,{simple_2_SUITE,all,"SKIPPED!"}},
+ {negative,{?eh,tc_start,'_'},{?eh,stop_logging,'_'}}
+ ];
+
+test_events(suite) ->
+ [
+ {?eh,start_logging,'_'},
+ {?eh,tc_start,{simple_1_SUITE,init_per_suite}},
+ {?eh,test_stats,{2,0,{0,0}}},
+ {?eh,tc_done,{simple_1_SUITE,end_per_suite,'_'}},
+ {negative,{?eh,tc_start,'_'},{?eh,stop_logging,'_'}}
+ ];
+
+test_events(skip_suite) ->
+ [
+ {?eh,start_logging,'_'},
+ {?eh,tc_user_skip,{simple_1_SUITE,all,"SKIPPED!"}},
+ {?eh,tc_done,{simple_2_SUITE,end_per_suite,'_'}},
+ {negative,{?eh,tc_start,'_'},{?eh,stop_logging,'_'}}
+ ];
+
+test_events(all_testcases) ->
+ [
+ {?eh,start_logging,'_'},
+ {?eh,tc_start,{simple_1_SUITE,init_per_suite}},
+ {?eh,test_stats,{2,0,{0,0}}},
+ {?eh,tc_done,{simple_1_SUITE,end_per_suite,'_'}},
+ {negative,{?eh,tc_start,'_'},{?eh,stop_logging,'_'}}
+ ];
+
+test_events(skip_all_testcases) ->
+ [
+ {?eh,start_logging,'_'},
+ {?eh,tc_user_skip,{simple_1_SUITE,all,"SKIPPED!"}},
+ {negative,{?eh,tc_start,'_'},{?eh,stop_logging,'_'}}
+ ];
+
+test_events(testcase) ->
+ [
+ {?eh,start_logging,'_'},
+ {?eh,tc_start,{simple_1_SUITE,init_per_suite}},
+ {?eh,test_stats,{1,0,{0,0}}},
+ {negative,{?eh,test_stats,{2,0,{0,0}}},
+ {?eh,tc_done,{simple_1_SUITE,end_per_suite,'_'}}},
+ {negative,{?eh,tc_start,'_'},{?eh,stop_logging,'_'}}
+ ];
+
+test_events(skip_testcase) ->
+ [
+ {?eh,start_logging,'_'},
+ {?eh,tc_start,{simple_1_SUITE,init_per_suite}},
+ {?eh,tc_user_skip,{simple_1_SUITE,tc1,"SKIPPED!"}},
+ {?eh,tc_start,{simple_1_SUITE,tc2}},
+ {?eh,tc_start,{simple_1_SUITE,end_per_suite}},
+
+ {?eh,tc_start,{simple_2_SUITE,init_per_suite}},
+ {?eh,tc_user_skip,{simple_2_SUITE,tc2,"SKIPPED!"}},
+ {?eh,tc_start,{simple_2_SUITE,tc1}},
+ {?eh,test_stats,{2,0,{2,0}}},
+ {?eh,tc_start,{simple_2_SUITE,end_per_suite}},
+
+ {negative,{?eh,tc_start,'_'},{?eh,stop_logging,'_'}}
+ ];
+
+test_events(all_groups) ->
+ [
+ {?eh,start_logging,'_'},
+ {?eh,tc_start,{groups_11_SUITE,init_per_suite}},
+ {?eh,test_stats,{12,0,{0,0}}},
+ {?eh,tc_done,{groups_11_SUITE,end_per_suite,'_'}},
+ {negative,{?eh,tc_start,'_'},{?eh,stop_logging,'_'}}
+ ];
+
+test_events(skip_all_groups) ->
+ [
+ {?eh,start_logging,'_'},
+ {?eh,tc_start,{groups_11_SUITE,init_per_suite}},
+ {?eh,tc_user_skip, {groups_11_SUITE,{group,test_group_1a},"SKIPPED!"}},
+ {?eh,test_stats,{0,0,{1,0}}},
+ {?eh,tc_user_skip, {groups_11_SUITE,{group,test_group_1b},"SKIPPED!"}},
+ {?eh,test_stats,{0,0,{2,0}}},
+ {?eh,tc_user_skip, {groups_11_SUITE,{group,test_group_2},"SKIPPED!"}},
+ {?eh,test_stats,{0,0,{3,0}}},
+ {?eh,tc_user_skip, {groups_11_SUITE,{group,test_group_4},"SKIPPED!"}},
+ {?eh,test_stats,{0,0,{4,0}}},
+ {?eh,tc_done,{groups_11_SUITE,end_per_suite,'_'}},
+ {negative,{?eh,tc_start,'_'},{?eh,stop_logging,'_'}}
+ ];
+
+test_events(group) ->
+ [
+ {?eh,start_logging,'_'},
+ {?eh,tc_start,{groups_11_SUITE,init_per_suite}},
+ {?eh,tc_start,{groups_11_SUITE,{init_per_group,test_group_1a,[]}}},
+ {?eh,tc_start,{groups_11_SUITE,testcase_1a}},
+ {?eh,tc_start,{groups_11_SUITE,testcase_1b}},
+ {?eh,test_stats,{2,0,{0,0}}},
+ {?eh,tc_done,{groups_11_SUITE,{end_per_group,test_group_1a,[]},'_'}},
+ {?eh,tc_done,{groups_11_SUITE,end_per_suite,'_'}},
+ {negative,{?eh,tc_start,'_'},{?eh,stop_logging,'_'}}
+ ];
+
+test_events(skip_group) ->
+ [
+ {?eh,start_logging,'_'},
+ {?eh,tc_start,{groups_11_SUITE,init_per_suite}},
+
+ {?eh,tc_start,{groups_11_SUITE,{init_per_group,test_group_1a,[]}}},
+ {?eh,tc_start,{groups_11_SUITE,testcase_1a}},
+ {?eh,tc_start,{groups_11_SUITE,testcase_1b}},
+ {?eh,test_stats,{2,0,{0,0}}},
+ {?eh,tc_done,{groups_11_SUITE,{end_per_group,test_group_1a,[]},'_'}},
+
+ {?eh,tc_user_skip, {groups_11_SUITE,{group,test_group_1b},"SKIPPED!"}},
+ {?eh,tc_user_skip, {groups_11_SUITE,{group,test_group_2},"SKIPPED!"}},
+ %%! But not test_group_7 since it's a sub-group!
+ {?eh,test_stats,{2,0,{2,0}}},
+ {negative,{?eh,tc_user_skip,'_'},{?eh,stop_logging,'_'}}
+ ];
+
+test_events(group_all_testcases) ->
+ [
+ {?eh,start_logging,'_'},
+ {?eh,tc_start,{groups_11_SUITE,init_per_suite}},
+ {?eh,tc_start,{groups_11_SUITE,{init_per_group,test_group_1a,[]}}},
+ {?eh,tc_start,{groups_11_SUITE,testcase_1a}},
+ {?eh,tc_start,{groups_11_SUITE,testcase_1b}},
+ {?eh,test_stats,{2,0,{0,0}}},
+ {?eh,tc_done,{groups_11_SUITE,{end_per_group,test_group_1a,[]},'_'}},
+ {?eh,tc_done,{groups_11_SUITE,end_per_suite,'_'}},
+ {negative,{?eh,tc_start,'_'},{?eh,stop_logging,'_'}}
+ ];
+
+test_events(skip_group_all_testcases) ->
+ [
+ {?eh,start_logging,'_'},
+ {?eh,tc_start,{groups_11_SUITE,init_per_suite}},
+ {?eh,tc_user_skip, {groups_11_SUITE,{group,test_group_1a},"SKIPPED!"}},
+ {?eh,tc_user_skip, {groups_11_SUITE,{group,test_group_1b},"SKIPPED!"}},
+ {?eh,test_stats,{0,0,{2,0}}},
+ {?eh,tc_start,{groups_11_SUITE,end_per_suite}},
+ {negative,{?eh,tc_start,'_'},{?eh,stop_logging,'_'}}
+ ];
+
+test_events(group_testcase) ->
+ [
+ {?eh,start_logging,'_'},
+ {?eh,tc_start,{groups_11_SUITE,init_per_suite}},
+ {?eh,tc_start,{groups_11_SUITE,{init_per_group,test_group_1a,[]}}},
+ {?eh,tc_start,{groups_11_SUITE,testcase_1a}},
+ {?eh,test_stats,{1,0,{0,0}}},
+ {negative,{?eh,test_stats,{2,0,{0,0}}},
+ {?eh,tc_done,{groups_11_SUITE,{end_per_group,test_group_1a,[]},'_'}}},
+
+ {?eh,tc_done,{groups_11_SUITE,end_per_suite,'_'}},
+ {negative,{?eh,tc_start,'_'},{?eh,stop_logging,'_'}}
+ ];
+
+test_events(skip_group_testcase) ->
+ [
+ {?eh,start_logging,'_'},
+ {?eh,tc_start,{groups_11_SUITE,init_per_suite}},
+
+ {?eh,tc_start,{groups_11_SUITE,{init_per_group,test_group_1a,[]}}},
+ {?eh,tc_start,{groups_11_SUITE,testcase_1a}},
+ {?eh,tc_user_skip,{groups_11_SUITE,testcase_1b,"SKIPPED!"}},
+ {?eh,test_stats,{1,0,{1,0}}},
+ {?eh,tc_done,{groups_11_SUITE,{end_per_group,test_group_1a,[]},'_'}},
+
+ {?eh,tc_start,{groups_11_SUITE,{init_per_group,test_group_1b,[]}}},
+ {?eh,tc_start,{groups_11_SUITE,testcase_1b}},
+ {?eh,tc_user_skip,{groups_11_SUITE,testcase_1a,"SKIPPED!"}},
+ {?eh,test_stats,{2,0,{2,0}}},
+ {?eh,tc_done,{groups_11_SUITE,{end_per_group,test_group_1b,[]},'_'}},
+
+ {negative,{?eh,tc_user_skip,'_'},{?eh,stop_logging,'_'}}
+ ];
+
+test_events(topgroup) ->
+ [
+ {?eh,start_logging,'_'},
+ {?eh,tc_start,{groups_12_SUITE,init_per_suite}},
+
+ {parallel,
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_2,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{init_per_group,test_group_2,[parallel]},ok}},
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_3,[{repeat,2}]}}},
+ {?eh,tc_start,
+ {groups_12_SUITE,{end_per_group,test_group_3,[{repeat,2}]}}}
+ ],
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_3,[]}}},
+ {?eh,tc_start,
+ {groups_12_SUITE,{end_per_group,test_group_3,[]}}}
+ ],
+ {?eh,test_stats,{6,0,{0,0}}},
+ {?eh,tc_start,
+ {groups_12_SUITE,{end_per_group,test_group_2,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{end_per_group,test_group_2,[parallel]},ok}}]},
+
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_4,[]}}},
+ {parallel,
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_5,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{init_per_group,test_group_5,[parallel]},ok}},
+ {parallel,
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_6,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{init_per_group,test_group_6,[parallel]},ok}},
+ [{?eh,tc_start,{groups_12_SUITE,{init_per_group,test_group_7,'_'}}},
+ {?eh,tc_start,{groups_12_SUITE,{end_per_group,test_group_7,'_'}}}],
+ {shuffle,
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_8,
+ [{shuffle,'_'},sequence]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{init_per_group,test_group_8,
+ [{shuffle,'_'},sequence]},ok}},
+ {?eh,tc_start,{groups_12_SUITE,{end_per_group,test_group_8,
+ [shuffle,sequence]}}},
+ {?eh,tc_done,{groups_12_SUITE,{end_per_group,test_group_8,
+ [shuffle,sequence]},ok}}
+ ]},
+ {?eh,tc_start,
+ {groups_12_SUITE,{end_per_group,test_group_6,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{end_per_group,test_group_6,[parallel]},ok}}
+ ]},
+ {?eh,test_stats,{12,0,{0,0}}},
+ {?eh,tc_start,
+ {groups_12_SUITE,{end_per_group,test_group_5,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{end_per_group,test_group_5,[parallel]},ok}}]},
+ {?eh,tc_start,{groups_12_SUITE,{end_per_group,test_group_4,[]}}}],
+
+ {?eh,tc_done,{groups_12_SUITE,end_per_suite,'_'}},
+ {negative,{?eh,tc_start,'_'},{?eh,stop_logging,'_'}}
+ ];
+
+test_events(subgroup) ->
+ [
+ {?eh,start_logging,'_'},
+ {?eh,tc_start,{groups_12_SUITE,init_per_suite}},
+
+ {parallel,
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_2,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{init_per_group,test_group_2,[parallel]},ok}},
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_3,[{repeat,2}]}}},
+ {?eh,tc_start,
+ {groups_12_SUITE,{end_per_group,test_group_3,[{repeat,2}]}}}
+ ],
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_3,[]}}},
+ {?eh,tc_start,
+ {groups_12_SUITE,{end_per_group,test_group_3,[]}}}
+ ],
+ {?eh,test_stats,{4,0,{0,0}}},
+ {?eh,tc_start,
+ {groups_12_SUITE,{end_per_group,test_group_2,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{end_per_group,test_group_2,[parallel]},ok}}]},
+ {?eh,tc_done,{groups_12_SUITE,end_per_suite,'_'}},
+ {negative,{?eh,tc_start,'_'},{?eh,stop_logging,'_'}}
+ ];
+
+test_events(skip_subgroup) ->
+ [
+ {?eh,start_logging,'_'},
+ {?eh,tc_start,{groups_12_SUITE,init_per_suite}},
+
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_4,[]}}},
+ {parallel,
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_5,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{init_per_group,test_group_5,[parallel]},ok}},
+ {parallel,
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_6,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{init_per_group,test_group_6,[parallel]},ok}},
+ [{?eh,tc_start,{groups_12_SUITE,{init_per_group,test_group_7,'_'}}},
+ {?eh,tc_start,{groups_12_SUITE,{end_per_group,test_group_7,'_'}}}],
+ {?eh,tc_user_skip,
+ {groups_12_SUITE,{group,test_group_8},"SKIPPED!"}},
+ {?eh,tc_start,
+ {groups_12_SUITE,{end_per_group,test_group_6,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{end_per_group,test_group_6,[parallel]},ok}}
+ ]},
+ {?eh,tc_start,
+ {groups_12_SUITE,{end_per_group,test_group_5,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{end_per_group,test_group_5,[parallel]},ok}}]},
+ {?eh,tc_start,{groups_12_SUITE,{end_per_group,test_group_4,[]}}}],
+
+ {?eh,tc_done,{groups_12_SUITE,end_per_suite,'_'}},
+ {negative,{?eh,tc_start,'_'},{?eh,stop_logging,'_'}}
+ ];
+
+test_events(subgroup_all_testcases) ->
+ [
+ {?eh,start_logging,'_'},
+ {?eh,tc_start,{groups_12_SUITE,init_per_suite}},
+
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_4,[]}}},
+ {parallel,
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_5,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{init_per_group,test_group_5,[parallel]},ok}},
+ {parallel,
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_6,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{init_per_group,test_group_6,[parallel]},ok}},
+ [{?eh,tc_start,{groups_12_SUITE,{init_per_group,test_group_7,'_'}}},
+ {?eh,tc_start,{groups_12_SUITE,{end_per_group,test_group_7,'_'}}}],
+ {shuffle,
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_8,
+ [{shuffle,'_'},sequence]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{init_per_group,test_group_8,
+ [{shuffle,'_'},sequence]},ok}},
+ {?eh,tc_start,{groups_12_SUITE,{end_per_group,test_group_8,
+ [shuffle,sequence]}}},
+ {?eh,tc_done,{groups_12_SUITE,{end_per_group,test_group_8,
+ [shuffle,sequence]},ok}}
+ ]},
+ {?eh,tc_start,
+ {groups_12_SUITE,{end_per_group,test_group_6,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{end_per_group,test_group_6,[parallel]},ok}}
+ ]},
+ {?eh,test_stats,{6,0,{0,0}}},
+ {?eh,tc_start,
+ {groups_12_SUITE,{end_per_group,test_group_5,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{end_per_group,test_group_5,[parallel]},ok}}]},
+ {?eh,tc_start,{groups_12_SUITE,{end_per_group,test_group_4,[]}}}],
+
+ {parallel,
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_2,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{init_per_group,test_group_2,[parallel]},ok}},
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_3,[{repeat,2}]}}},
+ {?eh,tc_start,
+ {groups_12_SUITE,{end_per_group,test_group_3,[{repeat,2}]}}}
+ ],
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_3,[]}}},
+ {?eh,test_stats,{10,0,{0,0}}},
+ {?eh,tc_start,
+ {groups_12_SUITE,{end_per_group,test_group_3,[]}}}
+ ],
+ {?eh,tc_start,
+ {groups_12_SUITE,{end_per_group,test_group_2,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{end_per_group,test_group_2,[parallel]},ok}}]},
+
+ {?eh,tc_done,{groups_12_SUITE,end_per_suite,'_'}},
+ {negative,{?eh,tc_start,'_'},{?eh,stop_logging,'_'}}
+ ];
+
+test_events(skip_subgroup_all_testcases) ->
+ [
+ {?eh,start_logging,'_'},
+ {?eh,tc_start,{groups_12_SUITE,init_per_suite}},
+
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_4,[]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{init_per_group,test_group_4,[]},ok}},
+ {?eh,tc_user_skip,{groups_12_SUITE,{group,test_group_5},"SKIPPED!"}},
+ {?eh,tc_start,{groups_12_SUITE,{end_per_group,test_group_4,[]}}},
+ {?eh,tc_done,{groups_12_SUITE,{end_per_group,test_group_4,[]},ok}}
+ ],
+
+ {?eh,tc_done,{groups_12_SUITE,end_per_suite,'_'}},
+ {negative,{?eh,tc_start,'_'},{?eh,stop_logging,'_'}}
+ ];
+
+test_events(subgroup_testcase) ->
+ [
+ {?eh,start_logging,'_'},
+ {?eh,tc_start,{groups_12_SUITE,init_per_suite}},
+
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_4,[]}}},
+ {parallel,
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_5,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{init_per_group,test_group_5,[parallel]},ok}},
+ {parallel,
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_6,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{init_per_group,test_group_6,[parallel]},ok}},
+ [{?eh,tc_start,{groups_12_SUITE,{init_per_group,test_group_7,'_'}}},
+ {?eh,test_stats,{1,0,{0,0}}},
+ {?eh,tc_start,{groups_12_SUITE,{end_per_group,test_group_7,'_'}}}],
+ {?eh,tc_start,
+ {groups_12_SUITE,{end_per_group,test_group_6,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{end_per_group,test_group_6,[parallel]},ok}}
+ ]},
+ {?eh,tc_start,
+ {groups_12_SUITE,{end_per_group,test_group_5,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{end_per_group,test_group_5,[parallel]},ok}}]},
+ {?eh,tc_start,{groups_12_SUITE,{end_per_group,test_group_4,[]}}}],
+
+ {parallel,
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_2,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{init_per_group,test_group_2,[parallel]},ok}},
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_3,[{repeat,2}]}}},
+ {?eh,test_stats,{2,0,{0,0}}},
+ {?eh,tc_start,
+ {groups_12_SUITE,{end_per_group,test_group_3,[{repeat,2}]}}}
+ ],
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_3,[]}}},
+ {?eh,test_stats,{3,0,{0,0}}},
+ {?eh,tc_start,
+ {groups_12_SUITE,{end_per_group,test_group_3,[]}}}
+ ],
+ {?eh,tc_start,
+ {groups_12_SUITE,{end_per_group,test_group_2,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{end_per_group,test_group_2,[parallel]},ok}}]},
+
+ {?eh,tc_done,{groups_12_SUITE,end_per_suite,'_'}},
+ {negative,{?eh,tc_start,'_'},{?eh,stop_logging,'_'}}
+ ];
+
+test_events(skip_subgroup_testcase) ->
+ [
+
+ {?eh,start_logging,'_'},
+ {?eh,tc_start,{groups_12_SUITE,init_per_suite}},
+
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_4,[]}}},
+ {parallel,
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_5,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{init_per_group,test_group_5,[parallel]},ok}},
+ {parallel,
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_6,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{init_per_group,test_group_6,[parallel]},ok}},
+ [{?eh,tc_start,{groups_12_SUITE,{init_per_group,test_group_7,'_'}}},
+ {?eh,tc_user_skip, {groups_12_SUITE,testcase_7a,"SKIPPED!"}},
+ {?eh,test_stats,{1,0,{1,0}}},
+ {?eh,tc_user_skip, {groups_12_SUITE,testcase_7b,"SKIPPED!"}},
+ {?eh,test_stats,{1,0,{2,0}}},
+ {?eh,tc_start,{groups_12_SUITE,{end_per_group,test_group_7,'_'}}}],
+ {shuffle,
+ [{?eh,tc_start,
+ {groups_12_SUITE,{init_per_group,test_group_8,
+ [{shuffle,'_'},sequence]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{init_per_group,test_group_8,
+ [{shuffle,'_'},sequence]},ok}},
+ {?eh,tc_start,{groups_12_SUITE,{end_per_group,test_group_8,
+ [shuffle,sequence]}}},
+ {?eh,tc_done,{groups_12_SUITE,{end_per_group,test_group_8,
+ [shuffle,sequence]},ok}}
+ ]},
+ {?eh,tc_start,
+ {groups_12_SUITE,{end_per_group,test_group_6,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{end_per_group,test_group_6,[parallel]},ok}}
+ ]},
+ {?eh,test_stats,{4,0,{2,0}}},
+ {?eh,tc_start,
+ {groups_12_SUITE,{end_per_group,test_group_5,[parallel]}}},
+ {?eh,tc_done,
+ {groups_12_SUITE,{end_per_group,test_group_5,[parallel]},ok}}]},
+ {?eh,tc_start,{groups_12_SUITE,{end_per_group,test_group_4,[]}}}],
+
+ {?eh,tc_done,{groups_12_SUITE,end_per_suite,'_'}},
+ {negative,{?eh,tc_start,'_'},{?eh,stop_logging,'_'}}
+
+ ];
+
+test_events(sub_skipped_by_top) ->
+ [
+ {?eh,start_logging,'_'},
+ {?eh,tc_start,{groups_12_SUITE,init_per_suite}},
+
+ {?eh,tc_user_skip,{groups_12_SUITE,{group,test_group_4},"SKIPPED!"}},
+ {?eh,tc_user_skip,{groups_12_SUITE,{group,test_group_4},"SKIPPED!"}},
+
+ {?eh,tc_done,{groups_12_SUITE,end_per_suite,'_'}},
+
+ {negative,{?eh,tc_start,'_'},{?eh,stop_logging,'_'}}
+ ];
+
+test_events(testcase_in_multiple_groups) ->
+ [];
+
+test_events(order_of_tests_in_multiple_dirs_no_merge_tests) ->
+ [{?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,tc_start,{groups_12_SUITE,testcase_1a}},
+ {?eh,tc_done, {groups_12_SUITE,testcase_1a,
+ {failed,{error,{test_case_failed,no_group_data}}}}},
+ {?eh,tc_start,{groups_22_SUITE,testcase_1}},
+ {?eh,tc_done,{groups_22_SUITE,testcase_1,ok}},
+ {?eh,tc_start,{groups_12_SUITE,testcase_1b}},
+ {?eh,tc_done, {groups_12_SUITE,testcase_1b,
+ {failed,{error,{test_case_failed,no_group_data}}}}},
+ {?eh,stop_logging,[]}
+ ];
+test_events(order_of_tests_in_multiple_suites_no_merge_tests) ->
+ [{?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,tc_start,{groups_12_SUITE,testcase_1a}},
+ {?eh,tc_done,{groups_12_SUITE,testcase_1a,'_'}},
+ {?eh,tc_start,{groups_11_SUITE,testcase_1}},
+ {?eh,tc_done,{groups_11_SUITE,testcase_1,ok}},
+ {?eh,tc_start,{groups_12_SUITE,testcase_1b}},
+ {?eh,tc_done,{groups_12_SUITE,testcase_1b,'_'}},
+ {?eh,stop_logging,[]}
+ ];
+test_events(order_of_suites_in_multiple_dirs_no_merge_tests) ->
+ [{?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,tc_start,{groups_12_SUITE,init_per_suite}},
+ {?eh,tc_done,{groups_12_SUITE,init_per_suite,'_'}},
+ {?eh,tc_start,{groups_12_SUITE,end_per_suite}},
+ {?eh,tc_done,{groups_12_SUITE,end_per_suite,'_'}},
+ {?eh,tc_start,{groups_22_SUITE,init_per_suite}},
+ {?eh,tc_done,{groups_22_SUITE,init_per_suite,'_'}},
+ {?eh,tc_start,{groups_22_SUITE,end_per_suite}},
+ {?eh,tc_done,{groups_22_SUITE,end_per_suite,'_'}},
+ {?eh,tc_start,{groups_11_SUITE,init_per_suite}},
+ {?eh,tc_done,{groups_11_SUITE,init_per_suite,'_'}},
+ {?eh,tc_start,{groups_11_SUITE,end_per_suite}},
+ {?eh,tc_done,{groups_11_SUITE,end_per_suite,'_'}},
+ {?eh,stop_logging,[]}];
+test_events(order_of_groups_in_multiple_dirs_no_merge_tests) ->
+ [{?eh,start_logging,{'DEF','RUNDIR'}},
+
+ {?eh,tc_start, {groups_12_SUITE,{init_per_group,test_group_1a,'_'}}},
+ {?eh,tc_done, {groups_12_SUITE,{end_per_group,test_group_1a,'_'},'_'}},
+
+ {?eh,tc_start, {groups_22_SUITE,{init_per_group,test_group_1a,'_'}}},
+ {?eh,tc_done, {groups_22_SUITE,{end_per_group,test_group_1a,'_'},'_'}},
+
+ {?eh,tc_start, {groups_12_SUITE,{init_per_group,test_group_1b,'_'}}},
+ {?eh,tc_done, {groups_12_SUITE,{end_per_group,test_group_1b,'_'},'_'}},
+
+ {?eh,stop_logging,[]}];
+test_events(order_of_groups_in_multiple_suites_no_merge_tests) ->
+ [{?eh,start_logging,{'DEF','RUNDIR'}},
+
+ {?eh,tc_start, {groups_12_SUITE,{init_per_group,test_group_1a,'_'}}},
+ {?eh,tc_done, {groups_12_SUITE,{end_per_group,test_group_1a,'_'},'_'}},
+
+ {?eh,tc_start, {groups_11_SUITE,{init_per_group,test_group_1a,'_'}}},
+ {?eh,tc_done, {groups_11_SUITE,{end_per_group,test_group_1a,'_'},'_'}},
+
+ {?eh,tc_start, {groups_12_SUITE,{init_per_group,test_group_1b,'_'}}},
+ {?eh,tc_done, {groups_12_SUITE,{end_per_group,test_group_1b,'_'},'_'}},
+
+ {?eh,stop_logging,[]}];
+test_events(order_of_tests_in_multiple_suites_with_skip_no_merge_tests) ->
+ [{?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,tc_start,{groups_12_SUITE,testcase_1a}},
+ {?eh,tc_done,{groups_12_SUITE,testcase_1a,'_'}},
+ {?eh,tc_start,{groups_11_SUITE,testcase_1}},
+ {?eh,tc_done,{groups_11_SUITE,testcase_1,ok}},
+ {?eh,tc_user_skip,{groups_12_SUITE,testcase_1b,'_'}},
+ {?eh,tc_start,{groups_11_SUITE,testcase_2}},
+ {?eh,tc_done,{groups_11_SUITE,testcase_2,ok}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(order_of_tests_in_multiple_dirs) ->
+ [{?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,tc_start,{groups_12_SUITE,testcase_1a}},
+ {?eh,tc_done,
+ {groups_12_SUITE,testcase_1a,
+ {failed,{error,{test_case_failed,no_group_data}}}}},
+ {?eh,tc_start,{groups_12_SUITE,testcase_1b}},
+ {?eh,tc_done,
+ {groups_12_SUITE,testcase_1b,
+ {failed,{error,{test_case_failed,no_group_data}}}}},
+ {?eh,tc_start,{groups_22_SUITE,testcase_1}},
+ {?eh,tc_done,{groups_22_SUITE,testcase_1,ok}},
+ {?eh,stop_logging,[]}
+ ];
+test_events(order_of_tests_in_multiple_suites) ->
+ [{?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,tc_start,{groups_12_SUITE,testcase_1a}},
+ {?eh,tc_done,{groups_12_SUITE,testcase_1a,'_'}},
+
+ {?eh,tc_start,{groups_12_SUITE,testcase_1b}},
+ {?eh,tc_done,{groups_12_SUITE,testcase_1b,'_'}},
+
+ {?eh,tc_start,{groups_11_SUITE,testcase_1}},
+ {?eh,tc_done,{groups_11_SUITE,testcase_1,ok}},
+ {?eh,stop_logging,[]}
+ ];
+test_events(order_of_suites_in_multiple_dirs) ->
+ [{?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,tc_start,{groups_12_SUITE,init_per_suite}},
+ {?eh,tc_done,{groups_12_SUITE,init_per_suite,'_'}},
+ {?eh,tc_start,{groups_12_SUITE,end_per_suite}},
+ {?eh,tc_done,{groups_12_SUITE,end_per_suite,'_'}},
+
+ {?eh,tc_start,{groups_11_SUITE,init_per_suite}},
+ {?eh,tc_done,{groups_11_SUITE,init_per_suite,'_'}},
+ {?eh,tc_start,{groups_11_SUITE,end_per_suite}},
+ {?eh,tc_done,{groups_11_SUITE,end_per_suite,'_'}},
+
+ {?eh,tc_start,{groups_22_SUITE,init_per_suite}},
+ {?eh,tc_done,{groups_22_SUITE,init_per_suite,'_'}},
+ {?eh,tc_start,{groups_22_SUITE,end_per_suite}},
+ {?eh,tc_done,{groups_22_SUITE,end_per_suite,'_'}},
+ {?eh,stop_logging,[]}];
+test_events(order_of_groups_in_multiple_dirs) ->
+ [{?eh,start_logging,{'DEF','RUNDIR'}},
+
+ {?eh,tc_start, {groups_12_SUITE,{init_per_group,test_group_1a,'_'}}},
+ {?eh,tc_done, {groups_12_SUITE,{end_per_group,test_group_1a,'_'},'_'}},
+
+ {?eh,tc_start, {groups_12_SUITE,{init_per_group,test_group_1b,'_'}}},
+ {?eh,tc_done, {groups_12_SUITE,{end_per_group,test_group_1b,'_'},'_'}},
+
+ {?eh,tc_start, {groups_22_SUITE,{init_per_group,test_group_1a,'_'}}},
+ {?eh,tc_done, {groups_22_SUITE,{end_per_group,test_group_1a,'_'},'_'}},
+
+ {?eh,stop_logging,[]}];
+test_events(order_of_groups_in_multiple_suites) ->
+ [{?eh,start_logging,{'DEF','RUNDIR'}},
+
+ {?eh,tc_start, {groups_12_SUITE,{init_per_group,test_group_1a,'_'}}},
+ {?eh,tc_done, {groups_12_SUITE,{end_per_group,test_group_1a,'_'},'_'}},
+
+ {?eh,tc_start, {groups_12_SUITE,{init_per_group,test_group_1b,'_'}}},
+ {?eh,tc_done, {groups_12_SUITE,{end_per_group,test_group_1b,'_'},'_'}},
+
+ {?eh,tc_start, {groups_11_SUITE,{init_per_group,test_group_1a,'_'}}},
+ {?eh,tc_done, {groups_11_SUITE,{end_per_group,test_group_1a,'_'},'_'}},
+
+ {?eh,stop_logging,[]}];
+
+test_events(order_of_tests_in_multiple_suites_with_skip) ->
+ [{?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,tc_start,{groups_12_SUITE,testcase_1a}},
+ {?eh,tc_done,{groups_12_SUITE,testcase_1a,'_'}},
+ {?eh,tc_user_skip,{groups_12_SUITE,testcase_1b,'_'}},
+ {?eh,tc_start,{groups_11_SUITE,testcase_1}},
+ {?eh,tc_done,{groups_11_SUITE,testcase_1,ok}},
+ {?eh,tc_start,{groups_11_SUITE,testcase_2}},
+ {?eh,tc_done,{groups_11_SUITE,testcase_2,ok}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(all_plus_one_tc_no_merge_tests) ->
+
+ [{?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,tc_start,{groups_12_SUITE,init_per_suite}},
+ {?eh,tc_done,{groups_12_SUITE,end_per_suite,'_'}},
+ {?eh,tc_start,{groups_12_SUITE,init_per_suite}},
+ {?eh,tc_done,{groups_12_SUITE,end_per_suite,'_'}},
+ {?eh,stop_logging,[]}
+ ];
+
+test_events(all_plus_one_tc) ->
+
+ [{?eh,start_logging,{'DEF','RUNDIR'}},
+ {?eh,tc_start,{groups_12_SUITE,init_per_suite}},
+ {?eh,tc_done,{groups_12_SUITE,end_per_suite,'_'}},
+ {negative,{?eh,tc_start,{groups_12_SUITE,init_per_suite}},
+ {?eh,stop_logging,[]}}
+ ];
+
test_events(_) ->
[
].
diff --git a/lib/common_test/vsn.mk b/lib/common_test/vsn.mk
index 1a820848b5..8a4853e070 100644
--- a/lib/common_test/vsn.mk
+++ b/lib/common_test/vsn.mk
@@ -1,3 +1,3 @@
-COMMON_TEST_VSN = 1.5.2
+COMMON_TEST_VSN = 1.5.3
diff --git a/lib/compiler/doc/src/compile.xml b/lib/compiler/doc/src/compile.xml
index c3d65b4cb5..f2af932aef 100644
--- a/lib/compiler/doc/src/compile.xml
+++ b/lib/compiler/doc/src/compile.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1996</year><year>2010</year>
+ <year>1996</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -164,6 +164,70 @@
for details.</p>
</item>
+ <tag><c>makedep</c></tag>
+ <item>
+ <p>Produce a Makefile rule to track headers dependencies.
+ No object file is produced.
+ </p>
+ <p>By default, this rule is written to
+ <c><![CDATA[<File>.Pbeam]]></c>. However, if the option
+ <c>binary</c> is set, nothing is written and the rule is
+ returned in <c>Binary</c>.
+ </p>
+ <p>For instance, if one has the following module:
+ </p>
+ <code>
+-module(module).
+
+-include_lib("eunit/include/eunit.hrl").
+-include("header.hrl").
+ </code>
+ <p>Here is the Makefile rule generated by this option:
+ </p>
+ <code>
+module.beam: module.erl \
+ /usr/local/lib/erlang/lib/eunit/include/eunit.hrl \
+ header.hrl
+ </code>
+ </item>
+
+ <tag><c>{makedep_output, Output}</c></tag>
+ <item>
+ <p>Write generated rule(s) to <c>Output</c> instead of the
+ default <c><![CDATA[<File>.Pbeam]]></c>. <c>Output</c>
+ can be a filename or an <c>io_device()</c>. To write to
+ stdout, use <c>standard_io</c>. However if <c>binary</c>
+ is set, nothing is written to <c>Output</c> and the
+ result is returned to the caller with
+ <c>{ok, ModuleName, Binary}</c>.
+ </p>
+ </item>
+
+ <tag><c>{makedep_target, Target}</c></tag>
+ <item>
+ <p>Change the name of the rule emitted to <c>Target</c>.
+ </p>
+ </item>
+
+ <tag><c>makedep_quote_target</c></tag>
+ <item>
+ <p>Characters in <c>Target</c> special to make(1) are quoted.
+ </p>
+ </item>
+
+ <tag><c>makedep_add_missing</c></tag>
+ <item>
+ <p>Consider missing headers as generated files and add them to the
+ dependencies.
+ </p>
+ </item>
+
+ <tag><c>makedep_phony</c></tag>
+ <item>
+ <p>Add a phony target for each dependency.
+ </p>
+ </item>
+
<tag><c>'P'</c></tag>
<item>
<p>Produces a listing of the parsed code after preprocessing
diff --git a/lib/compiler/doc/src/notes.xml b/lib/compiler/doc/src/notes.xml
index 9d89b17afb..25a6db4ce0 100644
--- a/lib/compiler/doc/src/notes.xml
+++ b/lib/compiler/doc/src/notes.xml
@@ -31,6 +31,45 @@
<p>This document describes the changes made to the Compiler
application.</p>
+<section><title>Compiler 4.7.3</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ The <c>-export_type()</c> directive is no longer included
+ among the attributes.</p>
+ <p>
+ Own Id: OTP-8998</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ The maximum number of allowed arguments for an Erlang
+ function has been lowered from 256 to 255, so that the
+ number of arguments can now fit in a byte.</p>
+ <p>
+ Own Id: OTP-9049</p>
+ </item>
+ <item>
+ <p>
+ Dependency generation for Makefiles has been added to the
+ compiler and erlc. See the manual pages for
+ <c>compile</c> and <c>erlc</c>. (Thanks to Jean-Sebastien
+ Pedron.)</p>
+ <p>
+ Own Id: OTP-9065</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Compiler 4.7.2</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/compiler/doc/src/part_notes_history.xml b/lib/compiler/doc/src/part_notes_history.xml
index cd17c4285e..12366f0006 100644
--- a/lib/compiler/doc/src/part_notes_history.xml
+++ b/lib/compiler/doc/src/part_notes_history.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2006</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/compiler/src/Makefile b/lib/compiler/src/Makefile
index 0f6d2f6193..1238d113e1 100644
--- a/lib/compiler/src/Makefile
+++ b/lib/compiler/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2010. All Rights Reserved.
+# Copyright Ericsson AB 1996-2011. 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
@@ -118,7 +118,9 @@ APPUP_TARGET= $(EBIN)/$(APPUP_FILE)
ifeq ($(NATIVE_LIBS_ENABLED),yes)
ERL_COMPILE_FLAGS += +native
endif
-ERL_COMPILE_FLAGS += +inline +warn_unused_import -I../../stdlib/include -I$(EGEN) -W
+ERL_COMPILE_FLAGS += +inline +warn_unused_import \
+ +warnings_as_errors \
+ -I../../stdlib/include -I$(EGEN) -W
# ----------------------------------------------------
# Targets
diff --git a/lib/compiler/src/beam_bsm.erl b/lib/compiler/src/beam_bsm.erl
index 2a36fda1ea..5cc8252b99 100644
--- a/lib/compiler/src/beam_bsm.erl
+++ b/lib/compiler/src/beam_bsm.erl
@@ -651,10 +651,8 @@ add_warning(Term, Anno, Ws) ->
warning_translate_label(Term, D) when is_tuple(Term) ->
case element(1, Term) of
{label,F} ->
- case gb_trees:lookup(F, D) of
- none -> Term;
- {value,FA} -> setelement(1, Term, FA)
- end;
+ FA = gb_trees:get(F, D),
+ setelement(1, Term, FA);
_ -> Term
end;
warning_translate_label(Term, _) -> Term.
diff --git a/lib/compiler/src/beam_dead.erl b/lib/compiler/src/beam_dead.erl
index bb93110176..8e96569414 100644
--- a/lib/compiler/src/beam_dead.erl
+++ b/lib/compiler/src/beam_dead.erl
@@ -162,14 +162,11 @@ function({function,Name,Arity,CLabel,Is0}, Lc0) ->
%% We must split the basic block when we encounter instructions with labels,
%% such as catches and BIFs. All labels must be visible outside the blocks.
-%% Also remove empty blocks.
split_blocks({function,Name,Arity,CLabel,Is0}) ->
Is = split_blocks(Is0, []),
{function,Name,Arity,CLabel,Is}.
-split_blocks([{block,[]}|Is], Acc) ->
- split_blocks(Is, Acc);
split_blocks([{block,Bl}|Is], Acc0) ->
Acc = split_block(Bl, [], Acc0),
split_blocks(Is, Acc);
@@ -246,30 +243,24 @@ forward([{select_val,Reg,_,{list,List}}=I|Is], D0, Lc, Acc) ->
D = update_value_dict(List, Reg, D0),
forward(Is, D, Lc, [I|Acc]);
forward([{label,Lbl}=LblI,{block,[{set,[Dst],[Lit],move}|BlkIs]}=Blk|Is], D, Lc, Acc) ->
+ %% Assumption: The target labels in a select_val/3 instruction
+ %% cannot be reached in any other way than through the select_val/3
+ %% instruction (i.e. there can be no fallthrough to such label and
+ %% it cannot be referenced by, for example, a jump/1 instruction).
Block = case gb_trees:lookup({Lbl,Dst}, D) of
- {value,Lit} ->
- %% The move instruction seems to be redundant, but also make
- %% sure that the instruction preceeding the label
- %% cannot fall through to the move instruction.
- case is_unreachable_after(Acc) of
- false -> Blk; %Must keep move instruction.
- true -> {block,BlkIs} %Safe to remove move instruction.
- end;
- _ -> Blk %Keep move instruction.
+ {value,Lit} -> {block,BlkIs}; %Safe to remove move instruction.
+ _ -> Blk %Must keep move instruction.
end,
forward([Block|Is], D, Lc, [LblI|Acc]);
forward([{label,Lbl}=LblI|[{move,Lit,Dst}|Is1]=Is0], D, Lc, Acc) ->
+ %% Assumption: The target labels in a select_val/3 instruction
+ %% cannot be reached in any other way than through the select_val/3
+ %% instruction (i.e. there can be no fallthrough to such label and
+ %% it cannot be referenced by, for example, a jump/1 instruction).
Is = case gb_trees:lookup({Lbl,Dst}, D) of
- {value,Lit} ->
- %% The move instruction seems to be redundant, but also make
- %% sure that the instruction preceeding the label
- %% cannot fall through to the move instruction.
- case is_unreachable_after(Acc) of
- false -> Is0; %Must keep move instruction.
- true -> Is1 %Safe to remove move instruction.
- end;
- _ -> Is0 %Keep move instruction.
- end,
+ {value,Lit} -> Is1; %Safe to remove move instruction.
+ _ -> Is0 %Keep move instruction.
+ end,
forward(Is, D, Lc, [LblI|Acc]);
forward([{test,is_eq_exact,_,[Dst,Src]}=I,
{block,[{set,[Dst],[Src],move}|Bl]}|Is], D, Lc, Acc) ->
@@ -299,16 +290,12 @@ update_value_dict([Lit,{f,Lbl}|T], Reg, D0) ->
Key = {Lbl,Reg},
D = case gb_trees:lookup(Key, D0) of
none -> gb_trees:insert(Key, Lit, D0); %New.
- {value,Lit} -> D0; %Already correct.
{value,inconsistent} -> D0; %Inconsistent.
{value,_} -> gb_trees:update(Key, inconsistent, D0)
end,
update_value_dict(T, Reg, D);
update_value_dict([], _, D) -> D.
-is_unreachable_after([I|_]) ->
- beam_jump:is_unreachable_after(I).
-
%%%
%%% Scan instructions in reverse execution order and remove dead code.
%%%
@@ -602,16 +589,11 @@ count_bits_matched([{test,_,_,_}|Is], SavePoint, Bits) ->
count_bits_matched([{bs_save2,Reg,SavePoint}|_], {Reg,SavePoint}, Bits) ->
%% The save point we are looking for - we are done.
Bits;
-count_bits_matched([{bs_save2,_,_}|Is], SavePoint, Bits) ->
- %% Another save point - keep counting.
- count_bits_matched(Is, SavePoint, Bits);
count_bits_matched([_|_], _, Bits) -> Bits.
shortcut_bs_pos_used(To, Reg, D) ->
shortcut_bs_pos_used_1(beam_utils:code_at(To, D), Reg, D).
-shortcut_bs_pos_used_1([{bs_restore2,Reg,_}|_], Reg, _) ->
- false;
shortcut_bs_pos_used_1([{bs_context_to_binary,Reg}|_], Reg, _) ->
false;
shortcut_bs_pos_used_1(Is, Reg, D) ->
diff --git a/lib/compiler/src/beam_dict.erl b/lib/compiler/src/beam_dict.erl
index a1f994dfbd..c50ed28aa9 100644
--- a/lib/compiler/src/beam_dict.erl
+++ b/lib/compiler/src/beam_dict.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -36,7 +36,6 @@
strings = <<>> :: binary(), %String pool
lambdas = [], %[{...}]
literals = dict:new() :: dict(), %Format: {Literal,Number}
- next_atom = 1 :: pos_integer(),
next_import = 0 :: non_neg_integer(),
string_offset = 0 :: non_neg_integer(),
next_literal = 0 :: non_neg_integer(),
@@ -66,13 +65,14 @@ highest_opcode(#asm{highest_opcode=Op}) -> Op.
%% atom(Atom, Dict) -> {Index,Dict'}
-spec atom(atom(), bdict()) -> {pos_integer(), bdict()}.
-atom(Atom, #asm{atoms=Atoms0,next_atom=NextIndex}=Dict) when is_atom(Atom) ->
+atom(Atom, #asm{atoms=Atoms0}=Dict) when is_atom(Atom) ->
case gb_trees:lookup(Atom, Atoms0) of
{value,Index} ->
{Index,Dict};
none ->
+ NextIndex = gb_trees:size(Atoms0) + 1,
Atoms = gb_trees:insert(Atom, NextIndex, Atoms0),
- {NextIndex,Dict#asm{atoms=Atoms,next_atom=NextIndex+1}}
+ {NextIndex,Dict#asm{atoms=Atoms}}
end.
%% Remembers an exported function.
@@ -139,7 +139,7 @@ lambda(Lbl, Index, OldUniq, NumFree, #asm{lambdas=Lambdas0}=Dict) ->
Lambdas = [{Lbl,{OldIndex,Lbl,Index,NumFree,OldUniq}}|Lambdas0],
{OldIndex,Dict#asm{lambdas=Lambdas}}.
-%% Returns the index for a literal (adding it to the atom table if necessary).
+%% Returns the index for a literal (adding it to the literal table if necessary).
%% literal(Literal, Dict) -> {Index,Dict'}
-spec literal(term(), bdict()) -> {non_neg_integer(), bdict()}.
@@ -156,14 +156,15 @@ literal(Lit, #asm{literals=Tab0,next_literal=NextIndex}=Dict) ->
%% atom_table(Dict) -> {LastIndex,[Length,AtomString...]}
-spec atom_table(bdict()) -> {non_neg_integer(), [[non_neg_integer(),...]]}.
-atom_table(#asm{atoms=Atoms,next_atom=NumAtoms}) ->
+atom_table(#asm{atoms=Atoms}) ->
+ NumAtoms = gb_trees:size(Atoms),
Sorted = lists:keysort(2, gb_trees:to_list(Atoms)),
Fun = fun({A,_}) ->
L = atom_to_list(A),
[length(L)|L]
end,
AtomTab = lists:map(Fun, Sorted),
- {NumAtoms-1,AtomTab}.
+ {NumAtoms,AtomTab}.
%% Returns the table of local functions.
%% local_table(Dict) -> {NumLocals, [{Function, Arity, Label}...]}
diff --git a/lib/compiler/src/compile.erl b/lib/compiler/src/compile.erl
index 26da3ecad2..ce8a5bf864 100644
--- a/lib/compiler/src/compile.erl
+++ b/lib/compiler/src/compile.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -112,9 +112,10 @@ noenv_forms(Forms, Opt) when is_atom(Opt) ->
-spec noenv_output_generated([option()]) -> boolean().
noenv_output_generated(Opts) ->
+ {_,Passes} = passes(file, expand_opts(Opts)),
any(fun ({save_binary,_F}) -> true;
(_Other) -> false
- end, passes(file, expand_opts(Opts))).
+ end, Passes).
%%
%% Local functions
@@ -205,6 +206,9 @@ format_error(write_error) ->
format_error({rename,From,To,Error}) ->
io_lib:format("failed to rename ~s to ~s: ~s",
[From,To,file:format_error(Error)]);
+format_error({delete,File,Error}) ->
+ io_lib:format("failed to delete file ~s: ~s",
+ [File,file:format_error(Error)]);
format_error({delete_temp,File,Error}) ->
io_lib:format("failed to delete temporary file ~s: ~s",
[File,file:format_error(Error)]);
@@ -240,26 +244,12 @@ internal(Master, Input, Opts) ->
end}.
internal({forms,Forms}, Opts) ->
- Ps = passes(forms, Opts),
+ {_,Ps} = passes(forms, Opts),
internal_comp(Ps, "", "", #compile{code=Forms,options=Opts});
internal({file,File}, Opts) ->
- Ps = passes(file, Opts),
+ {Ext,Ps} = passes(file, Opts),
Compile = #compile{options=Opts},
- case member(from_core, Opts) of
- true -> internal_comp(Ps, File, ".core", Compile);
- false ->
- case member(from_beam, Opts) of
- true ->
- internal_comp(Ps, File, ".beam", Compile);
- false ->
- case member(from_asm, Opts) orelse member(asm, Opts) of
- true ->
- internal_comp(Ps, File, ".S", Compile);
- false ->
- internal_comp(Ps, File, ".erl", Compile)
- end
- end
- end.
+ internal_comp(Ps, File, Ext, Compile).
internal_comp(Passes, File, Suffix, St0) ->
Dir = filename:dirname(File),
@@ -367,42 +357,52 @@ mpf(Ms) ->
[{File,[M || {F,M} <- Ms, F =:= File]} ||
File <- lists:usort([F || {F,_} <- Ms])].
-%% passes(forms|file, [Option]) -> [{Name,PassFun}]
-%% Figure out which passes that need to be run.
-
-passes(forms, Opts) ->
- case member(from_core, Opts) of
- true ->
- select_passes(core_passes(), Opts);
- false ->
- select_passes(standard_passes(), Opts)
+%% passes(forms|file, [Option]) -> {Extension,[{Name,PassFun}]}
+%% Figure out the extension of the input file and which passes
+%% that need to be run.
+
+passes(Type, Opts) ->
+ {Ext,Passes0} = passes_1(Opts),
+ Passes1 = case Type of
+ file -> Passes0;
+ forms -> tl(Passes0)
+ end,
+ Passes = select_passes(Passes1, Opts),
+
+ %% If the last pass saves the resulting binary to a file,
+ %% insert a first pass to remove the file (unless the
+ %% source file is a BEAM file).
+ {Ext,case last(Passes) of
+ {save_binary,_Fun} ->
+ case Passes of
+ [{read_beam_file,_}|_] ->
+ %% The BEAM is both input and output.
+ %% Don't remove it.
+ Passes;
+ _ ->
+ [?pass(remove_file)|Passes]
+ end;
+ _ ->
+ Passes
+ end}.
+
+passes_1([Opt|Opts]) ->
+ case pass(Opt) of
+ {_,_}=Res -> Res;
+ none -> passes_1(Opts)
end;
-passes(file, Opts) ->
- case member(from_beam, Opts) of
- true ->
- Ps = [?pass(read_beam_file)|binary_passes()],
- select_passes(Ps, Opts);
- false ->
- Ps = case member(from_asm, Opts) orelse member(asm, Opts) of
- true ->
- [?pass(beam_consult_asm)|asm_passes()];
- false ->
- case member(from_core, Opts) of
- true ->
- [?pass(parse_core)|core_passes()];
- false ->
- [?pass(parse_module)|standard_passes()]
- end
- end,
- Fs = select_passes(Ps, Opts),
-
- %% If the last pass saves the resulting binary to a file,
- %% insert a first pass to remove the file.
- case last(Fs) of
- {save_binary,_Fun} -> [?pass(remove_file)|Fs];
- _Other -> Fs
- end
- end.
+passes_1([]) ->
+ {".erl",[?pass(parse_module)|standard_passes()]}.
+
+pass(from_core) ->
+ {".core",[?pass(parse_core)|core_passes()]};
+pass(from_asm) ->
+ {".S",[?pass(beam_consult_asm)|asm_passes()]};
+pass(asm) ->
+ pass(from_asm);
+pass(from_beam) ->
+ {".beam",[?pass(read_beam_file)|binary_passes()]};
+pass(_) -> none.
%% select_passes([Command], Opts) -> [{Name,Function}]
%% Interpret the lists of commands to return a pure list of passes.
@@ -435,6 +435,8 @@ passes(file, Opts) ->
%% file will be Ext. (Ext should not contain
%% a period.) No more passes will be run.
%%
+%% done End compilation at this point.
+%%
%% {done,Ext} End compilation at this point. Produce a listing
%% as with {listing,Ext}, unless 'binary' is
%% specified, in which case the current
@@ -468,6 +470,8 @@ select_passes([{src_listing,Ext}|_], _Opts) ->
[{listing,fun (St) -> src_listing(Ext, St) end}];
select_passes([{listing,Ext}|_], _Opts) ->
[{listing,fun (St) -> listing(Ext, St) end}];
+select_passes([done|_], _Opts) ->
+ [];
select_passes([{done,Ext}|_], Opts) ->
select_passes([{unless,binary,{listing,Ext}}], Opts);
select_passes([{iff,Flag,Pass}|Ps], Opts) ->
@@ -550,6 +554,13 @@ select_list_passes_1([], _, Acc) ->
standard_passes() ->
[?pass(transform_module),
+
+ {iff,makedep,[
+ ?pass(makedep),
+ {unless,binary,?pass(makedep_output)}
+ ]},
+ {iff,makedep,done},
+
{iff,'dpp',{listing,"pp"}},
?pass(lint_module),
{iff,'P',{src_listing,"P"}},
@@ -901,6 +912,184 @@ core_lint_module(St) ->
errors=St#compile.errors ++ Es}}
end.
+makedep(#compile{code=Code,options=Opts}=St) ->
+ Ifile = St#compile.ifile,
+ Ofile = St#compile.ofile,
+
+ %% Get the target of the Makefile rule.
+ Target0 =
+ case proplists:get_value(makedep_target, Opts) of
+ undefined ->
+ %% The target is derived from the output filename: possibly
+ %% remove the current working directory to obtain a relative
+ %% path.
+ shorten_filename(Ofile);
+ T ->
+ %% The caller specified one.
+ T
+ end,
+
+ %% Quote the target is the called asked for this.
+ Target1 = case proplists:get_value(makedep_quote_target, Opts) of
+ true ->
+ %% For now, only "$" is replaced by "$$".
+ Fun = fun
+ ($$) -> "$$";
+ (C) -> C
+ end,
+ map(Fun, Target0);
+ _ ->
+ Target0
+ end,
+ Target = Target1 ++ ":",
+
+ %% List the dependencies (includes) for this target.
+ {MainRule,PhonyRules} = makedep_add_headers(
+ Ifile, % The input file name.
+ Code, % The parsed source.
+ [], % The list of dependencies already added.
+ length(Target), % The current line length.
+ Target, % The target.
+ "", % Phony targets.
+ Opts),
+
+ %% Prepare the content of the Makefile. For instance:
+ %% hello.erl: hello.hrl common.hrl
+ %%
+ %% Or if phony targets are enabled:
+ %% hello.erl: hello.hrl common.hrl
+ %%
+ %% hello.hrl:
+ %%
+ %% common.hrl:
+ Makefile = case proplists:get_value(makedep_phony, Opts) of
+ true -> MainRule ++ PhonyRules;
+ _ -> MainRule
+ end,
+ {ok,St#compile{code=iolist_to_binary([Makefile,"\n"])}}.
+
+makedep_add_headers(Ifile, [{attribute,_,file,{File,_}}|Rest],
+ Included, LineLen, MainTarget, Phony, Opts) ->
+ %% The header "File" exists, add it to the dependencies.
+ {Included1,LineLen1,MainTarget1,Phony1} =
+ makedep_add_header(Ifile, Included, LineLen, MainTarget, Phony, File),
+ makedep_add_headers(Ifile, Rest, Included1, LineLen1,
+ MainTarget1, Phony1, Opts);
+makedep_add_headers(Ifile, [{error,{_,epp,{include,file,File}}}|Rest],
+ Included, LineLen, MainTarget, Phony, Opts) ->
+ %% The header "File" doesn't exist, do we add it to the dependencies?
+ case proplists:get_value(makedep_add_missing, Opts) of
+ true ->
+ {Included1,LineLen1,MainTarget1,Phony1} =
+ makedep_add_header(Ifile, Included, LineLen, MainTarget,
+ Phony, File),
+ makedep_add_headers(Ifile, Rest, Included1, LineLen1,
+ MainTarget1, Phony1, Opts);
+ _ ->
+ makedep_add_headers(Ifile, Rest, Included, LineLen,
+ MainTarget, Phony, Opts)
+ end;
+makedep_add_headers(Ifile, [_|Rest], Included, LineLen,
+ MainTarget, Phony, Opts) ->
+ makedep_add_headers(Ifile, Rest, Included,
+ LineLen, MainTarget, Phony, Opts);
+makedep_add_headers(_Ifile, [], _Included, _LineLen,
+ MainTarget, Phony, _Opts) ->
+ {MainTarget,Phony}.
+
+makedep_add_header(Ifile, Included, LineLen, MainTarget, Phony, File) ->
+ case member(File, Included) of
+ true ->
+ %% This file was already listed in the dependencies, skip it.
+ {Included,LineLen,MainTarget,Phony};
+ false ->
+ Included1 = [File|Included],
+
+ %% Remove "./" in front of the dependency filename.
+ File1 = case File of
+ "./" ++ File0 -> File0;
+ _ -> File
+ end,
+
+ %% Prepare the phony target name.
+ Phony1 = case File of
+ Ifile -> Phony;
+ _ -> Phony ++ "\n\n" ++ File1 ++ ":"
+ end,
+
+ %% Add the file to the dependencies. Lines longer than 76 columns
+ %% are splitted.
+ if
+ LineLen + 1 + length(File1) > 76 ->
+ LineLen1 = 2 + length(File1),
+ MainTarget1 = MainTarget ++ " \\\n " ++ File1,
+ {Included1,LineLen1,MainTarget1,Phony1};
+ true ->
+ LineLen1 = LineLen + 1 + length(File1),
+ MainTarget1 = MainTarget ++ " " ++ File1,
+ {Included1,LineLen1,MainTarget1,Phony1}
+ end
+ end.
+
+makedep_output(#compile{code=Code,options=Opts,ofile=Ofile}=St) ->
+ %% Write this Makefile (Code) to the selected output.
+ %% If no output is specified, the default is to write to a file named after
+ %% the output file.
+ Output0 = case proplists:get_value(makedep_output, Opts) of
+ undefined ->
+ %% Prepare the default filename.
+ outfile(filename:basename(Ofile, ".beam"), "Pbeam", Opts);
+ O ->
+ O
+ end,
+
+ %% If the caller specified an io_device(), there's nothing to do. If he
+ %% specified a filename, we must create it. Furthermore, this created file
+ %% must be closed before returning.
+ Ret = case Output0 of
+ _ when is_list(Output0) ->
+ case file:delete(Output0) of
+ Ret2 when Ret2 =:= ok; Ret2 =:= {error,enoent} ->
+ case file:open(Output0, [write]) of
+ {ok,IODev} ->
+ {ok,IODev,true};
+ {error,Reason2} ->
+ {error,open,Reason2}
+ end;
+ {error,Reason1} ->
+ {error,delete,Reason1}
+ end;
+ _ ->
+ {ok,Output0,false}
+ end,
+
+ case Ret of
+ {ok,Output1,CloseOutput} ->
+ try
+ %% Write the Makefile.
+ io:fwrite(Output1, "~s", [Code]),
+ %% Close the file if relevant.
+ if
+ CloseOutput -> file:close(Output1);
+ true -> ok
+ end,
+ {ok,St}
+ catch
+ exit:_ ->
+ %% Couldn't write to output Makefile.
+ Err = {St#compile.ifile,[{none,?MODULE,write_error}]},
+ {error,St#compile{errors=St#compile.errors++[Err]}}
+ end;
+ {error,open,Reason} ->
+ %% Couldn't open output Makefile.
+ Err = {St#compile.ifile,[{none,?MODULE,{open,Reason}}]},
+ {error,St#compile{errors=St#compile.errors++[Err]}};
+ {error,delete,Reason} ->
+ %% Couldn't open output Makefile.
+ Err = {St#compile.ifile,[{none,?MODULE,{delete,Output0,Reason}}]},
+ {error,St#compile{errors=St#compile.errors++[Err]}}
+ end.
+
%% expand_module(State) -> State'
%% Do the common preprocessing of the input forms.
diff --git a/lib/compiler/src/sys_core_fold.erl b/lib/compiler/src/sys_core_fold.erl
index 96015fbe58..9360556e00 100644
--- a/lib/compiler/src/sys_core_fold.erl
+++ b/lib/compiler/src/sys_core_fold.erl
@@ -460,7 +460,8 @@ eval_binary(#c_binary{anno=Anno,segments=Ss}=Bin) ->
Bin;
throw:{badarg,Warning} ->
add_warning(Bin, Warning),
- #c_call{module=#c_literal{val=erlang},
+ #c_call{anno=Anno,
+ module=#c_literal{val=erlang},
name=#c_literal{val=error},
args=[#c_literal{val=badarg}]}
end.
@@ -658,36 +659,34 @@ call_0(Call, M, N, As0, Sub) ->
%% We inline some very common higher order list operations.
%% We use the same evaluation order as the library function.
-call_1(_Call, lists, all, [Arg1,Arg2], Sub) ->
+call_1(#c_call{anno=Anno}, lists, all, [Arg1,Arg2], Sub) ->
Loop = #c_var{name={'lists^all',1}},
F = #c_var{name='F'},
Xs = #c_var{name='Xs'},
X = #c_var{name='X'},
Err1 = #c_tuple{es=[#c_literal{val='case_clause'}, X]},
CC1 = #c_clause{pats=[#c_literal{val=true}], guard=#c_literal{val=true},
- body=#c_apply{op=Loop, args=[Xs]}},
+ body=#c_apply{anno=Anno, op=Loop, args=[Xs]}},
CC2 = #c_clause{pats=[#c_literal{val=false}], guard=#c_literal{val=true},
body=#c_literal{val=false}},
CC3 = #c_clause{pats=[X], guard=#c_literal{val=true},
- body=#c_primop{name=#c_literal{val='match_fail'},
- args=[Err1]}},
+ body=match_fail(Anno, Err1)},
C1 = #c_clause{pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
- body=#c_case{arg=#c_apply{op=F, args=[X]},
+ body=#c_case{arg=#c_apply{anno=Anno, op=F, args=[X]},
clauses = [CC1, CC2, CC3]}},
C2 = #c_clause{pats=[#c_literal{val=[]}], guard=#c_literal{val=true},
body=#c_literal{val=true}},
Err2 = #c_tuple{es=[#c_literal{val='function_clause'}, Xs]},
C3 = #c_clause{pats=[Xs], guard=#c_literal{val=true},
- body=#c_primop{name=#c_literal{val='match_fail'},
- args=[Err2]}},
+ body=match_fail(Anno, Err2)},
Fun = #c_fun{vars=[Xs],
body=#c_case{arg=Xs, clauses=[C1, C2, C3]}},
L = #c_var{name='L'},
expr(#c_let{vars=[F, L], arg=#c_values{es=[Arg1, Arg2]},
body=#c_letrec{defs=[{Loop,Fun}],
- body=#c_apply{op=Loop, args=[L]}}},
+ body=#c_apply{anno=Anno, op=Loop, args=[L]}}},
Sub);
-call_1(_Call, lists, any, [Arg1,Arg2], Sub) ->
+call_1(#c_call{anno=Anno}, lists, any, [Arg1,Arg2], Sub) ->
Loop = #c_var{name={'lists^any',1}},
F = #c_var{name='F'},
Xs = #c_var{name='Xs'},
@@ -696,72 +695,71 @@ call_1(_Call, lists, any, [Arg1,Arg2], Sub) ->
CC1 = #c_clause{pats=[#c_literal{val=true}], guard=#c_literal{val=true},
body=#c_literal{val=true}},
CC2 = #c_clause{pats=[#c_literal{val=false}], guard=#c_literal{val=true},
- body=#c_apply{op=Loop, args=[Xs]}},
+ body=#c_apply{anno=Anno, op=Loop, args=[Xs]}},
CC3 = #c_clause{pats=[X], guard=#c_literal{val=true},
- body=#c_primop{name=#c_literal{val='match_fail'},
- args=[Err1]}},
+ body=match_fail(Anno, Err1)},
C1 = #c_clause{pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
- body=#c_case{arg=#c_apply{op=F, args=[X]},
+ body=#c_case{arg=#c_apply{anno=Anno, op=F, args=[X]},
clauses = [CC1, CC2, CC3]}},
C2 = #c_clause{pats=[#c_literal{val=[]}], guard=#c_literal{val=true},
body=#c_literal{val=false}},
Err2 = #c_tuple{es=[#c_literal{val='function_clause'}, Xs]},
C3 = #c_clause{pats=[Xs], guard=#c_literal{val=true},
- body=#c_primop{name=#c_literal{val='match_fail'},
- args=[Err2]}},
+ body=match_fail(Anno, Err2)},
Fun = #c_fun{vars=[Xs],
body=#c_case{arg=Xs, clauses=[C1, C2, C3]}},
L = #c_var{name='L'},
expr(#c_let{vars=[F, L], arg=#c_values{es=[Arg1, Arg2]},
body=#c_letrec{defs=[{Loop,Fun}],
- body=#c_apply{op=Loop, args=[L]}}},
+ body=#c_apply{anno=Anno, op=Loop, args=[L]}}},
Sub);
-call_1(_Call, lists, foreach, [Arg1,Arg2], Sub) ->
+call_1(#c_call{anno=Anno}, lists, foreach, [Arg1,Arg2], Sub) ->
Loop = #c_var{name={'lists^foreach',1}},
F = #c_var{name='F'},
Xs = #c_var{name='Xs'},
X = #c_var{name='X'},
C1 = #c_clause{pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
- body=#c_seq{arg=#c_apply{op=F, args=[X]},
- body=#c_apply{op=Loop, args=[Xs]}}},
+ body=#c_seq{arg=#c_apply{anno=Anno, op=F, args=[X]},
+ body=#c_apply{anno=Anno, op=Loop, args=[Xs]}}},
C2 = #c_clause{pats=[#c_literal{val=[]}], guard=#c_literal{val=true},
body=#c_literal{val=ok}},
Err = #c_tuple{es=[#c_literal{val='function_clause'}, Xs]},
C3 = #c_clause{pats=[Xs], guard=#c_literal{val=true},
- body=#c_primop{name=#c_literal{val='match_fail'},
- args=[Err]}},
+ body=match_fail(Anno, Err)},
Fun = #c_fun{vars=[Xs],
body=#c_case{arg=Xs, clauses=[C1, C2, C3]}},
L = #c_var{name='L'},
expr(#c_let{vars=[F, L], arg=#c_values{es=[Arg1, Arg2]},
body=#c_letrec{defs=[{Loop,Fun}],
- body=#c_apply{op=Loop, args=[L]}}},
+ body=#c_apply{anno=Anno, op=Loop, args=[L]}}},
Sub);
-call_1(_Call, lists, map, [Arg1,Arg2], Sub) ->
+call_1(#c_call{anno=Anno}, lists, map, [Arg1,Arg2], Sub) ->
Loop = #c_var{name={'lists^map',1}},
F = #c_var{name='F'},
Xs = #c_var{name='Xs'},
X = #c_var{name='X'},
H = #c_var{name='H'},
C1 = #c_clause{pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
- body=#c_let{vars=[H], arg=#c_apply{op=F, args=[X]},
+ body=#c_let{vars=[H], arg=#c_apply{anno=Anno,
+ op=F,
+ args=[X]},
body=#c_cons{hd=H,
- tl=#c_apply{op=Loop,
+ tl=#c_apply{anno=Anno,
+ op=Loop,
args=[Xs]}}}},
C2 = #c_clause{pats=[#c_literal{val=[]}], guard=#c_literal{val=true},
body=#c_literal{val=[]}},
Err = #c_tuple{es=[#c_literal{val='function_clause'}, Xs]},
C3 = #c_clause{pats=[Xs], guard=#c_literal{val=true},
- body=#c_primop{name=#c_literal{val='match_fail'},
- args=[Err]}},
+ body=match_fail(Anno, Err)},
Fun = #c_fun{vars=[Xs],
body=#c_case{arg=Xs, clauses=[C1, C2, C3]}},
L = #c_var{name='L'},
expr(#c_let{vars=[F, L], arg=#c_values{es=[Arg1, Arg2]},
body=#c_letrec{defs=[{Loop,Fun}],
- body=#c_apply{op=Loop, args=[L]}}},
+ body=#c_apply{anno=Anno, op=Loop, args=[L]}}},
Sub);
-call_1(_Call, lists, flatmap, [Arg1,Arg2], Sub) ->
+call_1(#c_call{anno=Anno}, lists, flatmap, [Arg1,Arg2], Sub) ->
Loop = #c_var{name={'lists^flatmap',1}},
F = #c_var{name='F'},
Xs = #c_var{name='Xs'},
@@ -769,26 +767,27 @@ call_1(_Call, lists, flatmap, [Arg1,Arg2], Sub) ->
H = #c_var{name='H'},
C1 = #c_clause{pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
body=#c_let{vars=[H],
- arg=#c_apply{op=F, args=[X]},
- body=#c_call{module=#c_literal{val=erlang},
+ arg=#c_apply{anno=Anno, op=F, args=[X]},
+ body=#c_call{anno=Anno,
+ module=#c_literal{val=erlang},
name=#c_literal{val='++'},
args=[H,
- #c_apply{op=Loop,
+ #c_apply{anno=Anno,
+ op=Loop,
args=[Xs]}]}}},
C2 = #c_clause{pats=[#c_literal{val=[]}], guard=#c_literal{val=true},
body=#c_literal{val=[]}},
Err = #c_tuple{es=[#c_literal{val='function_clause'}, Xs]},
C3 = #c_clause{pats=[Xs], guard=#c_literal{val=true},
- body=#c_primop{name=#c_literal{val='match_fail'},
- args=[Err]}},
+ body=match_fail(Anno, Err)},
Fun = #c_fun{vars=[Xs],
body=#c_case{arg=Xs, clauses=[C1, C2, C3]}},
L = #c_var{name='L'},
expr(#c_let{vars=[F, L], arg=#c_values{es=[Arg1, Arg2]},
body=#c_letrec{defs=[{Loop,Fun}],
- body=#c_apply{op=Loop, args=[L]}}},
+ body=#c_apply{anno=Anno, op=Loop, args=[L]}}},
Sub);
-call_1(_Call, lists, filter, [Arg1,Arg2], Sub) ->
+call_1(#c_call{anno=Anno}, lists, filter, [Arg1,Arg2], Sub) ->
Loop = #c_var{name={'lists^filter',1}},
F = #c_var{name='F'},
Xs = #c_var{name='Xs'},
@@ -800,72 +799,75 @@ call_1(_Call, lists, filter, [Arg1,Arg2], Sub) ->
CC2 = #c_clause{pats=[#c_literal{val=false}], guard=#c_literal{val=true},
body=Xs},
CC3 = #c_clause{pats=[X], guard=#c_literal{val=true},
- body=#c_primop{name=#c_literal{val='match_fail'},
- args=[Err1]}},
+ body=match_fail(Anno, Err1)},
Case = #c_case{arg=B, clauses = [CC1, CC2, CC3]},
C1 = #c_clause{pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
body=#c_let{vars=[B],
- arg=#c_apply{op=F, args=[X]},
+ arg=#c_apply{anno=Anno, op=F, args=[X]},
body=#c_let{vars=[Xs],
- arg=#c_apply{op=Loop,
+ arg=#c_apply{anno=Anno,
+ op=Loop,
args=[Xs]},
body=Case}}},
C2 = #c_clause{pats=[#c_literal{val=[]}], guard=#c_literal{val=true},
body=#c_literal{val=[]}},
Err2 = #c_tuple{es=[#c_literal{val='function_clause'}, Xs]},
C3 = #c_clause{pats=[Xs], guard=#c_literal{val=true},
- body=#c_primop{name=#c_literal{val='match_fail'},
- args=[Err2]}},
+ body=match_fail(Anno, Err2)},
Fun = #c_fun{vars=[Xs],
body=#c_case{arg=Xs, clauses=[C1, C2, C3]}},
L = #c_var{name='L'},
expr(#c_let{vars=[F, L], arg=#c_values{es=[Arg1, Arg2]},
body=#c_letrec{defs=[{Loop,Fun}],
- body=#c_apply{op=Loop, args=[L]}}},
+ body=#c_apply{anno=Anno, op=Loop, args=[L]}}},
Sub);
-call_1(_Call, lists, foldl, [Arg1,Arg2,Arg3], Sub) ->
+call_1(#c_call{anno=Anno}, lists, foldl, [Arg1,Arg2,Arg3], Sub) ->
Loop = #c_var{name={'lists^foldl',2}},
F = #c_var{name='F'},
Xs = #c_var{name='Xs'},
X = #c_var{name='X'},
A = #c_var{name='A'},
C1 = #c_clause{pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
- body=#c_apply{op=Loop,
- args=[Xs, #c_apply{op=F, args=[X, A]}]}},
+ body=#c_apply{anno=Anno,
+ op=Loop,
+ args=[Xs, #c_apply{anno=Anno,
+ op=F,
+ args=[X, A]}]}},
C2 = #c_clause{pats=[#c_literal{val=[]}], guard=#c_literal{val=true}, body=A},
Err = #c_tuple{es=[#c_literal{val='function_clause'}, Xs]},
C3 = #c_clause{pats=[Xs], guard=#c_literal{val=true},
- body=#c_primop{name=#c_literal{val='match_fail'},
- args=[Err]}},
+ body=match_fail(Anno, Err)},
Fun = #c_fun{vars=[Xs, A],
body=#c_case{arg=Xs, clauses=[C1, C2, C3]}},
L = #c_var{name='L'},
expr(#c_let{vars=[F, A, L], arg=#c_values{es=[Arg1, Arg2, Arg3]},
body=#c_letrec{defs=[{Loop,Fun}],
- body=#c_apply{op=Loop, args=[L, A]}}},
+ body=#c_apply{anno=Anno, op=Loop, args=[L, A]}}},
Sub);
-call_1(_Call, lists, foldr, [Arg1,Arg2,Arg3], Sub) ->
+call_1(#c_call{anno=Anno}, lists, foldr, [Arg1,Arg2,Arg3], Sub) ->
Loop = #c_var{name={'lists^foldr',2}},
F = #c_var{name='F'},
Xs = #c_var{name='Xs'},
X = #c_var{name='X'},
A = #c_var{name='A'},
C1 = #c_clause{pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
- body=#c_apply{op=F, args=[X, #c_apply{op=Loop,
- args=[Xs, A]}]}},
+ body=#c_apply{anno=Anno,
+ op=F,
+ args=[X, #c_apply{anno=Anno,
+ op=Loop,
+ args=[Xs, A]}]}},
C2 = #c_clause{pats=[#c_literal{val=[]}], guard=#c_literal{val=true}, body=A},
Err = #c_tuple{es=[#c_literal{val='function_clause'}, Xs]},
C3 = #c_clause{pats=[Xs], guard=#c_literal{val=true},
- body=#c_primop{name=#c_literal{val='match_fail'},
- args=[Err]}},
+ body=match_fail(Anno, Err)},
Fun = #c_fun{vars=[Xs, A],
body=#c_case{arg=Xs, clauses=[C1, C2, C3]}},
L = #c_var{name='L'},
expr(#c_let{vars=[F, A, L], arg=#c_values{es=[Arg1, Arg2, Arg3]},
body=#c_letrec{defs=[{Loop,Fun}],
- body=#c_apply{op=Loop, args=[L, A]}}},
+ body=#c_apply{anno=Anno, op=Loop, args=[L, A]}}},
Sub);
-call_1(_Call, lists, mapfoldl, [Arg1,Arg2,Arg3], Sub) ->
+call_1(#c_call{anno=Anno}, lists, mapfoldl, [Arg1,Arg2,Arg3], Sub) ->
Loop = #c_var{name={'lists^mapfoldl',2}},
F = #c_var{name='F'},
Xs = #c_var{name='Xs'},
@@ -876,15 +878,16 @@ call_1(_Call, lists, mapfoldl, [Arg1,Arg2,Arg3], Sub) ->
C1 = #c_clause{pats=[P], guard=#c_literal{val=true}, body=E},
Err = #c_tuple{es=[#c_literal{val='badmatch'}, X]},
C2 = #c_clause{pats=[X], guard=#c_literal{val=true},
- body=#c_primop{name=#c_literal{val='match_fail'},
- args=[Err]}},
+ body=match_fail(Anno, Err)},
#c_case{arg=A, clauses=[C1, C2]}
end,
C1 = #c_clause{pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
- body=Match(#c_apply{op=F, args=[X, Avar]},
+ body=Match(#c_apply{anno=Anno, op=F, args=[X, Avar]},
#c_tuple{es=[X, Avar]},
%%% Tuple passing version
- Match(#c_apply{op=Loop, args=[Xs, Avar]},
+ Match(#c_apply{anno=Anno,
+ op=Loop,
+ args=[Xs, Avar]},
#c_tuple{es=[Xs, Avar]},
#c_tuple{es=[#c_cons{hd=X, tl=Xs}, Avar]})
%%% Multiple-value version
@@ -902,22 +905,23 @@ call_1(_Call, lists, mapfoldl, [Arg1,Arg2,Arg3], Sub) ->
%%% body=#c_values{es=[#c_literal{val=[]}, A]}},
Err = #c_tuple{es=[#c_literal{val='function_clause'}, Xs]},
C3 = #c_clause{pats=[Xs], guard=#c_literal{val=true},
- body=#c_primop{name=#c_literal{val='match_fail'},
- args=[Err]}},
+ body=match_fail(Anno, Err)},
Fun = #c_fun{vars=[Xs, Avar],
body=#c_case{arg=Xs, clauses=[C1, C2, C3]}},
L = #c_var{name='L'},
expr(#c_let{vars=[F, Avar, L], arg=#c_values{es=[Arg1, Arg2, Arg3]},
body=#c_letrec{defs=[{Loop,Fun}],
%%% Tuple passing version
- body=#c_apply{op=Loop, args=[L, Avar]}}},
+ body=#c_apply{anno=Anno,
+ op=Loop,
+ args=[L, Avar]}}},
%%% Multiple-value version
%%% body=#c_let{vars=[Xs, A],
%%% arg=#c_apply{op=Loop,
%%% args=[L, A]},
%%% body=#c_tuple{es=[Xs, A]}}}},
Sub);
-call_1(_Call, lists, mapfoldr, [Arg1,Arg2,Arg3], Sub) ->
+call_1(#c_call{anno=Anno}, lists, mapfoldr, [Arg1,Arg2,Arg3], Sub) ->
Loop = #c_var{name={'lists^mapfoldr',2}},
F = #c_var{name='F'},
Xs = #c_var{name='Xs'},
@@ -928,15 +932,16 @@ call_1(_Call, lists, mapfoldr, [Arg1,Arg2,Arg3], Sub) ->
C1 = #c_clause{pats=[P], guard=#c_literal{val=true}, body=E},
Err = #c_tuple{es=[#c_literal{val='badmatch'}, X]},
C2 = #c_clause{pats=[X], guard=#c_literal{val=true},
- body=#c_primop{name=#c_literal{val='match_fail'},
- args=[Err]}},
+ body=match_fail(Anno, Err)},
#c_case{arg=A, clauses=[C1, C2]}
end,
C1 = #c_clause{pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
%%% Tuple passing version
- body=Match(#c_apply{op=Loop, args=[Xs, Avar]},
+ body=Match(#c_apply{anno=Anno,
+ op=Loop,
+ args=[Xs, Avar]},
#c_tuple{es=[Xs, Avar]},
- Match(#c_apply{op=F, args=[X, Avar]},
+ Match(#c_apply{anno=Anno, op=F, args=[X, Avar]},
#c_tuple{es=[X, Avar]},
#c_tuple{es=[#c_cons{hd=X, tl=Xs}, Avar]}))
%%% Multiple-value version
@@ -955,15 +960,16 @@ call_1(_Call, lists, mapfoldr, [Arg1,Arg2,Arg3], Sub) ->
%%% body=#c_values{es=[#c_literal{val=[]}, A]}},
Err = #c_tuple{es=[#c_literal{val='function_clause'}, Xs]},
C3 = #c_clause{pats=[Xs], guard=#c_literal{val=true},
- body=#c_primop{name=#c_literal{val='match_fail'},
- args=[Err]}},
+ body=match_fail(Anno, Err)},
Fun = #c_fun{vars=[Xs, Avar],
body=#c_case{arg=Xs, clauses=[C1, C2, C3]}},
L = #c_var{name='L'},
expr(#c_let{vars=[F, Avar, L], arg=#c_values{es=[Arg1, Arg2, Arg3]},
body=#c_letrec{defs=[{Loop,Fun}],
%%% Tuple passing version
- body=#c_apply{op=Loop, args=[L, Avar]}}},
+ body=#c_apply{anno=Anno,
+ op=Loop,
+ args=[L, Avar]}}},
%%% Multiple-value version
%%% body=#c_let{vars=[Xs, A],
%%% arg=#c_apply{op=Loop,
@@ -973,6 +979,11 @@ call_1(_Call, lists, mapfoldr, [Arg1,Arg2,Arg3], Sub) ->
call_1(#c_call{module=M, name=N}=Call, _, _, As, Sub) ->
call_0(Call, M, N, As, Sub).
+match_fail(Anno, Arg) ->
+ #c_primop{anno=Anno,
+ name=#c_literal{val='match_fail'},
+ args=[Arg]}.
+
%% fold_call(Call, Mod, Name, Args, Sub) -> Expr.
%% Try to safely evaluate the call. Just try to evaluate arguments,
%% do the call and convert return values to literals. If this
@@ -1280,9 +1291,9 @@ eval_setelement_2(Pos, [H|T], NewVal) when Pos > 1 ->
%%
eval_failure(Call, Reason) ->
add_warning(Call, {eval_failure,Reason}),
- #c_call{module=#c_literal{val=erlang},
- name=#c_literal{val=error},
- args=[#c_literal{val=Reason}]}.
+ Call#c_call{module=#c_literal{val=erlang},
+ name=#c_literal{val=error},
+ args=[#c_literal{val=Reason}]}.
%% simplify_apply(Call0, Mod, Func, Args) -> Call
%% Simplify an apply/3 to a call if the number of arguments
@@ -1742,23 +1753,24 @@ opt_bool_clauses([_|_], _, _) ->
opt_bool_not(#c_case{arg=Arg,clauses=Cs0}=Case0) ->
case Arg of
- #c_call{module=#c_literal{val=erlang},
+ #c_call{anno=Anno,module=#c_literal{val=erlang},
name=#c_literal{val='not'},
args=[Expr]} ->
- Cs = opt_bool_not(Expr, Cs0),
+ Cs = opt_bool_not(Anno, Expr, Cs0),
Case = Case0#c_case{arg=Expr,clauses=Cs},
opt_bool_not(Case);
_ ->
opt_bool_case_redundant(Case0)
end.
-opt_bool_not(Expr, Cs) ->
+opt_bool_not(Anno, Expr, Cs) ->
Tail = case is_bool_expr(Expr) of
false ->
[#c_clause{anno=[compiler_generated],
pats=[#c_var{name=cor_variable}],
guard=#c_literal{val=true},
- body=#c_call{module=#c_literal{val=erlang},
+ body=#c_call{anno=Anno,
+ module=#c_literal{val=erlang},
name=#c_literal{val=error},
args=[#c_literal{val=badarg}]}}];
true -> []
@@ -1957,13 +1969,25 @@ case_tuple_pat([#c_tuple{es=Ps}], Arity) when length(Ps) =:= Arity ->
case_tuple_pat([#c_literal{val=T}], Arity) when tuple_size(T) =:= Arity ->
Ps = [#c_literal{val=E} || E <- tuple_to_list(T)],
{ok,Ps,[]};
-case_tuple_pat([#c_var{anno=A}=V], Arity) ->
- Vars = make_vars(A, 1, Arity),
- {ok,Vars,[{V,#c_tuple{es=Vars}}]};
+case_tuple_pat([#c_var{anno=Anno0}=V], Arity) ->
+ Vars = make_vars(Anno0, 1, Arity),
+
+ %% If the entire case statement is evaluated in an effect
+ %% context (e.g. "case {A,B} of ... end, ok"), there will
+ %% be a warning that a term is constructed but never used.
+ %% To avoid that warning, we must annotate the tuple as
+ %% compiler generated.
+
+ Anno = [compiler_generated|Anno0],
+ {ok,Vars,[{V,#c_tuple{anno=Anno,es=Vars}}]};
case_tuple_pat([#c_alias{var=V,pat=P}], Arity) ->
case case_tuple_pat([P], Arity) of
- {ok,Ps,Avs} -> {ok,Ps,[{V,#c_tuple{es=unalias_pat_list(Ps)}}|Avs]};
- error -> error
+ {ok,Ps,Avs} ->
+ Anno0 = core_lib:get_anno(P),
+ Anno = [compiler_generated|Anno0],
+ {ok,Ps,[{V,#c_tuple{anno=Anno,es=unalias_pat_list(Ps)}}|Avs]};
+ error ->
+ error
end;
case_tuple_pat(_, _) -> error.
diff --git a/lib/compiler/src/v3_codegen.erl b/lib/compiler/src/v3_codegen.erl
index 77da6c8d00..55e3c58d2a 100644
--- a/lib/compiler/src/v3_codegen.erl
+++ b/lib/compiler/src/v3_codegen.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -235,7 +235,7 @@ match_cg(M, Rs, Le, Vdb, Bef, St0) ->
I = Le#l.i,
{Sis,Int0} = adjust_stack(Bef, I, I+1, Vdb),
{B,St1} = new_label(St0),
- {Mis,Int1,St2} = match_cg(M, St0#cg.ultimate_failure,
+ {Mis,Int1,St2} = match_cg(M, St1#cg.ultimate_failure,
Int0, St1#cg{break=B}),
%% Put return values in registers.
Reg = load_vars(Rs, Int1#sr.reg),
diff --git a/lib/compiler/src/v3_core.erl b/lib/compiler/src/v3_core.erl
index 2da24b2908..e1a593fffa 100644
--- a/lib/compiler/src/v3_core.erl
+++ b/lib/compiler/src/v3_core.erl
@@ -1820,7 +1820,21 @@ upattern_list([], _, St) -> {[],[],[],[],St}.
%% upat_bin([Pat], [KnownVar], State) ->
%% {[Pat],[GuardTest],[NewVar],[UsedVar],State}.
upat_bin(Es0, Ks, St0) ->
- upat_bin(Es0, Ks, [], St0).
+ {Es1,Pg,Pv,Pu0,St1} = upat_bin(Es0, Ks, [], St0),
+
+ %% In a clause such as <<Sz:8,V:Sz>> in a function head, Sz will both
+ %% be new and used; a situation that is not handled properly by
+ %% uclause/4. (Basically, since Sz occurs in two sets that are
+ %% subtracted from each other, Sz will not be added to the list of
+ %% known variables and will seem to be new the next time it is
+ %% used in a match.)
+ %% Since the variable Sz really is new (it does not use a
+ %% value bound prior to the binary matching), Sz should only be
+ %% included in the set of new variables. Thus we should take it
+ %% out of the set of used variables.
+
+ Pu1 = subtract(Pu0, intersection(Pv, Pu0)),
+ {Es1,Pg,Pv,Pu1,St1}.
%% upat_bin([Pat], [KnownVar], [LocalVar], State) ->
%% {[Pat],[GuardTest],[NewVar],[UsedVar],State}.
@@ -1832,35 +1846,36 @@ upat_bin([], _, _, St) -> {[],[],[],[],St}.
%% upat_element(Segment, [KnownVar], [LocalVar], State) ->
-%% {Segment,[GuardTest],[NewVar],[UsedVar],[LocalVar],State}
-upat_element(#c_bitstr{val=H0,size=Sz}=Seg, Ks, Bs, St0) ->
- {H1,Hg,Hv,[],St1} = upattern(H0, Ks, St0),
- Bs1 = case H0 of
- #c_var{name=Hname} ->
- case H1 of
+%% {Segment,[GuardTest],[NewVar],[UsedVar],[LocalVar],State}
+upat_element(#c_bitstr{val=H0,size=Sz0}=Seg, Ks, Bs0, St0) ->
+ {H1,Hg,Hv,[],St1} = upattern(H0, Ks, St0),
+ Bs1 = case H0 of
#c_var{name=Hname} ->
- Bs;
- #c_var{name=Other} ->
- [{Hname, Other}|Bs]
- end;
- _ ->
- Bs
- end,
- {Sz1, Us} = case Sz of
- #c_var{name=Vname} ->
- rename_bitstr_size(Vname, Bs);
- _Other -> {Sz, []}
- end,
- {Seg#c_bitstr{val=H1, size=Sz1},Hg,Hv,Us,Bs1,St1}.
-
-rename_bitstr_size(V, [{V, N}|_]) ->
- New = #c_var{name=N},
- {New, [N]};
+ case H1 of
+ #c_var{name=Hname} ->
+ Bs0;
+ #c_var{name=Other} ->
+ [{Hname,Other}|Bs0]
+ end;
+ _ ->
+ Bs0
+ end,
+ {Sz1,Us} = case Sz0 of
+ #c_var{name=Vname} ->
+ rename_bitstr_size(Vname, Bs0);
+ _Other ->
+ {Sz0,[]}
+ end,
+ {Seg#c_bitstr{val=H1,size=Sz1},Hg,Hv,Us,Bs1,St1}.
+
+rename_bitstr_size(V, [{V,N}|_]) ->
+ New = #c_var{name=N},
+ {New,[N]};
rename_bitstr_size(V, [_|Rest]) ->
- rename_bitstr_size(V, Rest);
+ rename_bitstr_size(V, Rest);
rename_bitstr_size(V, []) ->
- Old = #c_var{name=V},
- {Old, [V]}.
+ Old = #c_var{name=V},
+ {Old,[V]}.
used_in_any(Les) ->
foldl(fun (Le, Ns) -> union((get_anno(Le))#a.us, Ns) end,
diff --git a/lib/compiler/src/v3_kernel.erl b/lib/compiler/src/v3_kernel.erl
index fbe4d8617e..3b33a08cf7 100644
--- a/lib/compiler/src/v3_kernel.erl
+++ b/lib/compiler/src/v3_kernel.erl
@@ -147,6 +147,7 @@ attributes([]) -> [].
include_attribute(type) -> false;
include_attribute(spec) -> false;
include_attribute(opaque) -> false;
+include_attribute(export_type) -> false;
include_attribute(_) -> true.
function({#c_var{name={F,Arity}=FA},Body}, St0) ->
diff --git a/lib/compiler/src/v3_kernel_pp.erl b/lib/compiler/src/v3_kernel_pp.erl
index a300dd283f..e363a5387a 100644
--- a/lib/compiler/src/v3_kernel_pp.erl
+++ b/lib/compiler/src/v3_kernel_pp.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -20,10 +20,12 @@
-module(v3_kernel_pp).
--include("v3_kernel.hrl").
-
-export([format/1]).
+%%-define(INCLUDE_ANNOTATIONS, 1).
+
+-include("v3_kernel.hrl").
+
%% These are "internal" structures in sys_kernel which are here for
%% debugging purposes.
-record(iset, {anno=[],vars,arg,body}).
@@ -50,28 +52,33 @@ format(Node) -> format(Node, #ctxt{}).
format(Node, Ctxt) ->
case canno(Node) of
-%% [] ->
-%% format_1(Node, Ctxt);
-%% [L,{file,_}] when is_integer(L) ->
-%% format_1(Node, Ctxt);
-%% #k{a=Anno}=K when Anno =/= [] ->
-%% format(setelement(2, Node, K#k{a=[]}), Ctxt);
-%% List ->
-%% format_anno(List, Ctxt, fun (Ctxt1) ->
-%% format_1(Node, Ctxt1)
-%% end);
- _ ->
- format_1(Node, Ctxt)
+ [] ->
+ format_1(Node, Ctxt);
+ [L,{file,_}] when is_integer(L) ->
+ format_1(Node, Ctxt);
+ #k{a=Anno}=K when Anno =/= [] ->
+ format(setelement(2, Node, K#k{a=[]}), Ctxt);
+ List ->
+ format_anno(List, Ctxt, fun (Ctxt1) ->
+ format_1(Node, Ctxt1)
+ end)
end.
-%% format_anno(Anno, Ctxt0, ObjFun) ->
-%% Ctxt1 = ctxt_bump_indent(Ctxt0, 1),
-%% ["( ",
-%% ObjFun(Ctxt0),
-%% nl_indent(Ctxt1),
-%% "-| ",io_lib:write(Anno),
-%% " )"].
-
+
+-ifndef(INCLUDE_ANNOTATIONS).
+%% Don't include annotations (for readability).
+format_anno(_Anno, Ctxt, ObjFun) ->
+ ObjFun(Ctxt).
+-else.
+%% Include annotations (for debugging of annotations).
+format_anno(Anno, Ctxt0, ObjFun) ->
+ Ctxt1 = ctxt_bump_indent(Ctxt0, 1),
+ ["( ",
+ ObjFun(Ctxt0),
+ nl_indent(Ctxt1),
+ "-| ",io_lib:write(Anno),
+ " )"].
+-endif.
%% format_1(Kexpr, Context) -> string().
@@ -107,6 +114,8 @@ format_1(#k_bin_int{size=Sz,unit=U,flags=Fs,val=Val,next=Next}, Ctxt) ->
[format_bin_seg_1(S, Ctxt),
format_bin_seg(Next, ctxt_bump_indent(Ctxt, 2))];
format_1(#k_bin_end{}, _Ctxt) -> "#<>#";
+format_1(#k_literal{val=Term}, _Ctxt) ->
+ io_lib:format("~p", [Term]);
format_1(#k_local{name=N,arity=A}, Ctxt) ->
"local " ++ format_fa_pair({N,A}, Ctxt);
format_1(#k_remote{mod=M,name=N,arity=A}, _Ctxt) ->
diff --git a/lib/compiler/test/Makefile b/lib/compiler/test/Makefile
index 2d08e71e09..fe713fd019 100644
--- a/lib/compiler/test/Makefile
+++ b/lib/compiler/test/Makefile
@@ -153,11 +153,11 @@ release_spec: opt
release_tests_spec: make_emakefile
$(INSTALL_DIR) $(RELSYSDIR)
- $(INSTALL_DATA) compiler.dynspec compiler.cover \
+ $(INSTALL_DATA) compiler.spec compiler.cover \
$(EMAKEFILE) $(ERL_FILES) $(CORE_FILES) $(RELSYSDIR)
$(INSTALL_DATA) $(NO_OPT_ERL_FILES) $(POST_OPT_ERL_FILES) \
$(INLINE_ERL_FILES) $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
@tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
release_docs_spec:
diff --git a/lib/compiler/test/andor_SUITE.erl b/lib/compiler/test/andor_SUITE.erl
index 84cfd16e60..f7388f1614 100644
--- a/lib/compiler/test/andor_SUITE.erl
+++ b/lib/compiler/test/andor_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -18,16 +18,35 @@
%%
-module(andor_SUITE).
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
t_case/1,t_and_or/1,t_andalso/1,t_orelse/1,inside/1,overlap/1,
combined/1,in_case/1,before_and_inside_if/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
- [t_case,t_and_or,t_andalso,t_orelse,inside,overlap,combined,in_case,
- before_and_inside_if].
+ [t_case, t_and_or, t_andalso, t_orelse, inside, overlap,
+ combined, in_case, before_and_inside_if].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
t_case(Config) when is_list(Config) ->
%% We test boolean cases almost but not quite like cases
diff --git a/lib/compiler/test/apply_SUITE.erl b/lib/compiler/test/apply_SUITE.erl
index f23dd6c2db..25f8a8dfb5 100644
--- a/lib/compiler/test/apply_SUITE.erl
+++ b/lib/compiler/test/apply_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -18,15 +18,34 @@
%%
-module(apply_SUITE).
--export([all/1,mfa/1,fun_apply/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,mfa/1,fun_apply/1]).
-export([foo/0,bar/1,baz/2]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
- [mfa,fun_apply].
+ [mfa, fun_apply].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
-define(APPLY0(M, F), (fun(Res) -> Res = M:F() end)(apply(M, F, []))).
-define(APPLY1(M, F, A1), (fun(Res) -> Res = M:F(A1) end)(apply(M, F, [A1]))).
diff --git a/lib/compiler/test/beam_validator_SUITE.erl b/lib/compiler/test/beam_validator_SUITE.erl
index 74b5d7c7eb..556dc54a8f 100644
--- a/lib/compiler/test/beam_validator_SUITE.erl
+++ b/lib/compiler/test/beam_validator_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -18,7 +18,9 @@
%%
-module(beam_validator_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
beam_files/1,compiler_bug/1,stupid_but_valid/1,
xrange/1,yrange/1,stack/1,call_last/1,merge_undefined/1,
uninit/1,unsafe_catch/1,
@@ -30,34 +32,49 @@
state_after_fault_in_catch/1,no_exception_in_catch/1,
undef_label/1,illegal_instruction/1,failing_gc_guard_bif/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
init_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
Dog = test_server:timetrap(?t:minutes(10)),
[{watchdog,Dog}|Config].
-fin_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
+end_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
- [beam_files,compiler_bug,stupid_but_valid,
- xrange,yrange,stack,call_last,merge_undefined,
- uninit,unsafe_catch,
- dead_code,mult_labels,
- overwrite_catchtag,overwrite_trytag,accessing_tags,bad_catch_try,
- cons_guard,
- freg_range,freg_uninit,freg_state,
- bin_match,bin_aligned,
- bad_dsetel,state_after_fault_in_catch,no_exception_in_catch,
- undef_label,illegal_instruction,failing_gc_guard_bif].
+ [beam_files, compiler_bug, stupid_but_valid, xrange,
+ yrange, stack, call_last, merge_undefined, uninit,
+ unsafe_catch, dead_code, mult_labels,
+ overwrite_catchtag, overwrite_trytag, accessing_tags,
+ bad_catch_try, cons_guard, freg_range, freg_uninit,
+ freg_state, bin_match, bin_aligned, bad_dsetel,
+ state_after_fault_in_catch, no_exception_in_catch,
+ undef_label, illegal_instruction, failing_gc_guard_bif].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
beam_files(Config) when is_list(Config) ->
- ?line {ok,Cwd} = file:get_cwd(),
- ?line Parent = filename:dirname(Cwd),
- ?line Wc = filename:join([Parent,"*","*.beam"]),
+ ?line DataDir = proplists:get_value(data_dir, Config),
+ ?line Wc = filename:join([DataDir,"..","..","*","*.beam"]),
%% Must have at least two files here, or there will be
%% a grammatical error in the output of the io:format/2 call below. ;-)
?line [_,_|_] = Fs = filelib:wildcard(Wc),
diff --git a/lib/compiler/test/bs_bincomp_SUITE.erl b/lib/compiler/test/bs_bincomp_SUITE.erl
index 74f69893af..d39e340429 100644
--- a/lib/compiler/test/bs_bincomp_SUITE.erl
+++ b/lib/compiler/test/bs_bincomp_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -21,19 +21,36 @@
-module(bs_bincomp_SUITE).
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
byte_aligned/1,bit_aligned/1,extended_byte_aligned/1,
extended_bit_aligned/1,mixed/1,filters/1,trim_coverage/1,
nomatch/1,sizes/1,tail/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
- [byte_aligned,bit_aligned,extended_byte_aligned,
- extended_bit_aligned,mixed,filters,trim_coverage,
- nomatch,sizes,tail].
+ [byte_aligned, bit_aligned, extended_byte_aligned,
+ extended_bit_aligned, mixed, filters, trim_coverage,
+ nomatch, sizes, tail].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+end_per_group(_GroupName, Config) ->
+ Config.
byte_aligned(Config) when is_list(Config) ->
cs_init(),
diff --git a/lib/compiler/test/bs_bit_binaries_SUITE.erl b/lib/compiler/test/bs_bit_binaries_SUITE.erl
index 6337460b13..30276f1259 100644
--- a/lib/compiler/test/bs_bit_binaries_SUITE.erl
+++ b/lib/compiler/test/bs_bit_binaries_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -21,19 +21,39 @@
-module(bs_bit_binaries_SUITE).
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
misc/1,horrid_match/1,test_bitstr/1,test_bit_size/1,asymmetric_tests/1,
big_asymmetric_tests/1,binary_to_and_from_list/1,
big_binary_to_and_from_list/1,send_and_receive/1,
send_and_receive_alot/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
- [misc,horrid_match,test_bitstr,test_bit_size,asymmetric_tests,
- big_asymmetric_tests,binary_to_and_from_list,big_binary_to_and_from_list,
- send_and_receive,send_and_receive_alot].
+ [misc, horrid_match, test_bitstr, test_bit_size,
+ asymmetric_tests, big_asymmetric_tests,
+ binary_to_and_from_list, big_binary_to_and_from_list,
+ send_and_receive, send_and_receive_alot].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
misc(Config) when is_list(Config) ->
?line <<1:100>> = <<1:100>>,
diff --git a/lib/compiler/test/bs_construct_SUITE.erl b/lib/compiler/test/bs_construct_SUITE.erl
index dfe4301791..31c7890f26 100644
--- a/lib/compiler/test/bs_construct_SUITE.erl
+++ b/lib/compiler/test/bs_construct_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -23,23 +23,44 @@
-module(bs_construct_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
two/1,test1/1,fail/1,float_bin/1,in_guard/1,in_catch/1,
nasty_literals/1,coerce_to_float/1,side_effect/1,
opt/1,otp_7556/1,float_arith/1,otp_8054/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
- [two,test1,fail,float_bin,in_guard,in_catch,nasty_literals,
- side_effect,opt,otp_7556,float_arith,otp_8054].
+ [two, test1, fail, float_bin, in_guard, in_catch,
+ nasty_literals, side_effect, opt, otp_7556, float_arith,
+ otp_8054].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
Dog = test_server:timetrap(?t:minutes(1)),
[{watchdog,Dog}|Config].
-fin_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
+end_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
@@ -210,7 +231,7 @@ one_test({C_bin, E_bin, Str, Result}) ->
ok;
%% For situations where the final bits may not matter, like
%% for floats:
- N when integer(N) ->
+ N when is_integer(N) ->
io:format("Info: compiled and interpreted differ in the"
" last bytes:~n ~p, ~p.~n",
[bitstring_to_list(C_bin), bitstring_to_list(E_bin)]),
diff --git a/lib/compiler/test/bs_match_SUITE.erl b/lib/compiler/test/bs_match_SUITE.erl
index caaa587006..6a795f6634 100644
--- a/lib/compiler/test/bs_match_SUITE.erl
+++ b/lib/compiler/test/bs_match_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -20,7 +20,9 @@
-module(bs_match_SUITE).
-compile(nowarn_shadow_vars).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
fun_shadow/1,int_float/1,otp_5269/1,null_fields/1,wiger/1,
bin_tail/1,save_restore/1,shadowed_size_var/1,
partitioned_bs_match/1,function_clause/1,
@@ -33,26 +35,47 @@
match_string/1,zero_width/1,bad_size/1,haystack/1,
cover_beam_bool/1]).
--export([coverage_id/1]).
+-export([coverage_id/1,coverage_external_ignore/2]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
- [fun_shadow,int_float,otp_5269,null_fields,wiger,bin_tail,save_restore,
- shadowed_size_var,partitioned_bs_match,function_clause,unit,
- shared_sub_bins,bin_and_float,dec_subidentifiers,skip_optional_tag,
- wfbm,degenerated_match,bs_sum,coverage,multiple_uses,zero_label,
- followed_by_catch,matching_meets_construction,simon,matching_and_andalso,
- otp_7188,otp_7233,otp_7240,otp_7498,match_string,zero_width,bad_size,
- haystack,cover_beam_bool].
+ [fun_shadow, int_float, otp_5269, null_fields, wiger,
+ bin_tail, save_restore, shadowed_size_var,
+ partitioned_bs_match, function_clause, unit,
+ shared_sub_bins, bin_and_float, dec_subidentifiers,
+ skip_optional_tag, wfbm, degenerated_match, bs_sum,
+ coverage, multiple_uses, zero_label, followed_by_catch,
+ matching_meets_construction, simon,
+ matching_and_andalso, otp_7188, otp_7233, otp_7240,
+ otp_7498, match_string, zero_width, bad_size, haystack,
+ cover_beam_bool].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
Dog = test_server:timetrap(?t:minutes(1)),
[{watchdog,Dog}|Config].
-fin_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
+end_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
@@ -119,7 +142,14 @@ otp_5269(Config) when is_list(Config) ->
[X || <<X:X>> <- [<<1:32>>,<<2:32>>,<<3:8>>]] end,
%% "binsize variable" ^
[1,2]),
-
+ ?line check(fun() ->
+ (fun (<<A:1/binary, B:8/integer, _C:B/binary>>) ->
+ case A of
+ B -> wrong;
+ _ -> ok
+ end
+ end)(<<1,2,3,4>>) end,
+ ok),
ok.
null_fields(Config) when is_list(Config) ->
@@ -555,13 +585,17 @@ coverage(Config) when is_list(Config) ->
A+B
end, 0, [a,b,c])),
+ ?line {<<42.0:64/float>>,float} = coverage_build(<<>>, <<42>>, float),
?line {<<>>,not_a_tuple} = coverage_build(<<>>, <<>>, not_a_tuple),
?line {<<16#76,"abc",16#A9,"abc">>,{x,42,43}} =
coverage_build(<<>>, <<16#7,16#A>>, {x,y,z}),
+ ?line [<<2>>,<<1>>] = coverage_bc(<<1,2>>, []),
+
?line {x,<<"abc">>,z} = coverage_setelement(<<2,"abc">>, {x,y,z}),
?line [42] = coverage_apply(<<42>>, [coverage_id]),
+ ?line 42 = coverage_external(<<42>>),
?line do_coverage_bin_to_term_list([]),
?line do_coverage_bin_to_term_list([lists:seq(0, 10),{a,b,c},<<23:42>>]),
@@ -578,6 +612,10 @@ coverage_fold(Fun, Acc, <<H,T/binary>>) ->
coverage_fold(Fun, Fun(IdFun(H), IdFun(Acc)), T);
coverage_fold(Fun, Acc, <<>>) when is_function(Fun, 2) -> Acc.
+coverage_build(Acc0, <<H,T/binary>>, float) ->
+ Float = id(<<H:64/float>>),
+ Acc = <<Acc0/binary,Float/binary>>,
+ coverage_build(Acc, T, float);
coverage_build(Acc0, <<H,T/binary>>, Tuple0) ->
Str = id(<<H:(id(4)),(H-1):4,"abc">>),
Acc = id(<<Acc0/bitstring,Str/bitstring>>),
@@ -588,6 +626,11 @@ coverage_build(Acc0, <<H,T/binary>>, Tuple0) ->
end;
coverage_build(Acc, <<>>, Tuple) -> {Acc,Tuple}.
+coverage_bc(<<H,T/binary>>, Acc) ->
+ B = << <<C:8>> || C <- [H] >>,
+ coverage_bc(T, [B|Acc]);
+coverage_bc(<<>>, Acc) -> Acc.
+
coverage_setelement(<<H,T1/binary>>, Tuple) when element(1, Tuple) =:= x ->
setelement(H, Tuple, T1).
@@ -595,6 +638,13 @@ coverage_apply(<<H,T/binary>>, [F|Fs]) ->
[?MODULE:F(H)|coverage_apply(T, Fs)];
coverage_apply(<<>>, []) -> [].
+coverage_external(<<H,T/binary>>) ->
+ ?MODULE:coverage_external_ignore(T, T),
+ H.
+
+coverage_external_ignore(_, _) ->
+ ok.
+
coverage_id(I) -> id(I).
do_coverage_bin_to_term_list(L) ->
diff --git a/lib/compiler/test/bs_utf_SUITE.erl b/lib/compiler/test/bs_utf_SUITE.erl
index 4281874a24..f30a4d3fef 100644
--- a/lib/compiler/test/bs_utf_SUITE.erl
+++ b/lib/compiler/test/bs_utf_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -19,18 +19,37 @@
-module(bs_utf_SUITE).
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
utf8_roundtrip/1,unused_utf_char/1,utf16_roundtrip/1,
utf32_roundtrip/1,guard/1,extreme_tripping/1,
literals/1,coverage/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
- [utf8_roundtrip,unused_utf_char,utf16_roundtrip,
- utf32_roundtrip,guard,extreme_tripping,
- literals,coverage].
+ [utf8_roundtrip, unused_utf_char, utf16_roundtrip,
+ utf32_roundtrip, guard, extreme_tripping, literals,
+ coverage].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
utf8_roundtrip(Config) when is_list(Config) ->
?line [utf8_roundtrip_1(P) || P <- utf_data()],
diff --git a/lib/compiler/test/compilation_SUITE.erl b/lib/compiler/test/compilation_SUITE.erl
index 935e384d2d..1343fbd1c9 100644
--- a/lib/compiler/test/compilation_SUITE.erl
+++ b/lib/compiler/test/compilation_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -20,34 +20,46 @@
-module(compilation_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-compile(export_all).
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
- [self_compile_old_inliner,self_compile,
- compiler_1,compiler_3,compiler_5,
- beam_compiler_1, beam_compiler_2, beam_compiler_3,
- beam_compiler_4, beam_compiler_5, beam_compiler_6,
- beam_compiler_7, beam_compiler_8, beam_compiler_9,
- beam_compiler_10, beam_compiler_11, beam_compiler_12,
- nested_tuples_in_case_expr,
- otp_2330, guards, vsn,
- otp_2380, otp_2141, otp_2173, otp_4790,
- const_list_256,
- bin_syntax_1, bin_syntax_2, bin_syntax_3,
- bin_syntax_4, bin_syntax_5, bin_syntax_6,
- live_var, convopts,
- bad_functional_value,
- catch_in_catch, redundant_case, long_string,
- otp_5076, complex_guard, otp_5092, otp_5151,
- otp_5235,otp_5244,
- trycatch_4, opt_crash,
- otp_5404,otp_5436,otp_5481,otp_5553,otp_5632,
- otp_5714,otp_5872,otp_6121,otp_6121a,otp_6121b,
- otp_7202,otp_7345,on_load,string_table,otp_8949_a,otp_8949_a
- ].
+ [self_compile_old_inliner, self_compile, compiler_1,
+ compiler_3, compiler_5, beam_compiler_1,
+ beam_compiler_2, beam_compiler_3, beam_compiler_4,
+ beam_compiler_5, beam_compiler_6, beam_compiler_7,
+ beam_compiler_8, beam_compiler_9, beam_compiler_10,
+ beam_compiler_11, beam_compiler_12,
+ nested_tuples_in_case_expr, otp_2330, guards,
+ {group, vsn}, otp_2380, otp_2141, otp_2173, otp_4790,
+ const_list_256, bin_syntax_1, bin_syntax_2,
+ bin_syntax_3, bin_syntax_4, bin_syntax_5, bin_syntax_6,
+ live_var, convopts, bad_functional_value,
+ catch_in_catch, redundant_case, long_string, otp_5076,
+ complex_guard, otp_5092, otp_5151, otp_5235, otp_5244,
+ trycatch_4, opt_crash, otp_5404, otp_5436, otp_5481,
+ otp_5553, otp_5632, otp_5714, otp_5872, otp_6121,
+ otp_6121a, otp_6121b, otp_7202, otp_7345, on_load,
+ string_table,otp_8949_a,otp_8949_a].
+
+groups() ->
+ [{vsn, [], [vsn_1, vsn_2, vsn_3]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-define(comp(N),
N(Config) when is_list(Config) -> try_it(N, Config)).
@@ -151,7 +163,7 @@ split({int, N}, <<N:16,B:N/binary,T/binary>>) ->
beam_compiler_7(doc) ->
"Code snippet submitted from Ulf Wiger which fails in R3 Beam.";
beam_compiler_7(suite) -> [];
-beam_compiler_7(Config) when list(Config) ->
+beam_compiler_7(Config) when is_list(Config) ->
?line done = empty(2, false).
empty(N, Toggle) when N > 0 ->
@@ -311,12 +323,11 @@ from(H, [H | T]) -> T;
from(H, [_ | T]) -> from(H, T);
from(_, []) -> [].
-vsn(suite) -> [vsn_1, vsn_2, vsn_3].
vsn_1(doc) ->
"Test generation of 'vsn' attribute";
vsn_1(suite) -> [];
-vsn_1(Conf) when list(Conf) ->
+vsn_1(Conf) when is_list(Conf) ->
?line M = vsn_1,
?line compile_load(M, ?config(data_dir, Conf), Conf),
@@ -340,7 +351,7 @@ vsn_1(Conf) when list(Conf) ->
vsn_2(doc) ->
"Test overriding of generation of 'vsn' attribute";
vsn_2(suite) -> [];
-vsn_2(Conf) when list(Conf) ->
+vsn_2(Conf) when is_list(Conf) ->
?line M = vsn_2,
?line compile_load(M, ?config(data_dir, Conf), Conf),
@@ -356,7 +367,7 @@ vsn_2(Conf) when list(Conf) ->
vsn_3(doc) ->
"Test that different code yields different generated 'vsn'";
vsn_3(suite) -> [];
-vsn_3(Conf) when list(Conf) ->
+vsn_3(Conf) when is_list(Conf) ->
?line M = vsn_3,
?line compile_load(M, ?config(data_dir, Conf), Conf),
diff --git a/lib/compiler/test/compile_SUITE.erl b/lib/compiler/test/compile_SUITE.erl
index e1cc5dafb5..b3e5376ffd 100644
--- a/lib/compiler/test/compile_SUITE.erl
+++ b/lib/compiler/test/compile_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -20,33 +20,50 @@
%% Tests compile:file/1 and compile:file/2 with various options.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
app_test/1,
file_1/1, module_mismatch/1, big_file/1, outdir/1,
- binary/1, cond_and_ifdef/1, listings/1, listings_big/1,
+ binary/1, makedep/1, cond_and_ifdef/1, listings/1, listings_big/1,
other_output/1, package_forms/1, encrypted_abstr/1,
- bad_record_use/1, bad_record_use1/1, bad_record_use2/1, strict_record/1,
+ bad_record_use1/1, bad_record_use2/1, strict_record/1,
missing_testheap/1, cover/1, env/1, core/1, asm/1]).
-export([init/3]).
+suite() -> [{ct_hooks,[ts_install_cth]}].
%% To cover the stripping of 'type' and 'spec' in beam_asm.
-type all_return_type() :: [atom()].
--spec all('suite' | [_]) -> all_return_type().
+-spec all() -> all_return_type().
-all(suite) ->
+all() ->
test_lib:recompile(?MODULE),
- [app_test,
- file_1, module_mismatch, big_file, outdir, binary,
- cond_and_ifdef, listings, listings_big,
- other_output, package_forms,
- encrypted_abstr,
- bad_record_use, strict_record,
+ [app_test, file_1, module_mismatch, big_file, outdir,
+ binary, makedep, cond_and_ifdef, listings, listings_big,
+ other_output, package_forms, encrypted_abstr,
+ {group, bad_record_use}, strict_record,
missing_testheap, cover, env, core, asm].
+groups() ->
+ [{bad_record_use, [],
+ [bad_record_use1, bad_record_use2]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%% Test that the Application file has no `basic' errors.";
app_test(Config) when is_list(Config) ->
@@ -132,6 +149,76 @@ binary(Config) when is_list(Config) ->
?line test_server:timetrap_cancel(Dog),
ok.
+%% Tests that the dependencies-Makefile-related options work.
+
+makedep(Config) when is_list(Config) ->
+ ?line Dog = test_server:timetrap(test_server:seconds(60)),
+ ?line {Simple,Target} = files(Config, "makedep"),
+ ?line DataDir = ?config(data_dir, Config),
+ ?line SimpleRootname = filename:rootname(Simple),
+ ?line IncludeDir = filename:join(filename:dirname(Simple), "include"),
+ ?line IncludeOptions = [
+ {d,need_foo},
+ {d,foo_value,42},
+ {d,include_generated},
+ {i,IncludeDir}
+ ],
+ %% Basic rule.
+ ?line BasicMf1Name = SimpleRootname ++ "-basic1.mk",
+ ?line {ok,BasicMf1} = file:read_file(BasicMf1Name),
+ ?line {ok,_,Mf1} = compile:file(Simple, [binary,makedep]),
+ ?line BasicMf1 = makedep_canonicalize_result(Mf1, DataDir),
+ %% Basic rule with one existing header.
+ ?line BasicMf2Name = SimpleRootname ++ "-basic2.mk",
+ ?line {ok,BasicMf2} = file:read_file(BasicMf2Name),
+ ?line {ok,_,Mf2} = compile:file(Simple, [binary,makedep|IncludeOptions]),
+ ?line BasicMf2 = makedep_canonicalize_result(Mf2, DataDir),
+ %% Rule with one existing header and one missing header.
+ ?line MissingMfName = SimpleRootname ++ "-missing.mk",
+ ?line {ok,MissingMf} = file:read_file(MissingMfName),
+ ?line {ok,_,Mf3} = compile:file(Simple,
+ [binary,makedep,makedep_add_missing|IncludeOptions]),
+ ?line MissingMf = makedep_canonicalize_result(Mf3, DataDir),
+ %% Rule with modified target.
+ ?line TargetMf1Name = SimpleRootname ++ "-target1.mk",
+ ?line {ok,TargetMf1} = file:read_file(TargetMf1Name),
+ ?line {ok,_,Mf4} = compile:file(Simple,
+ [binary,makedep,{makedep_target,"$target"}|IncludeOptions]),
+ ?line TargetMf1 = makedep_modify_target(
+ makedep_canonicalize_result(Mf4, DataDir), "$$target"),
+ %% Rule with quoted modified target.
+ ?line TargetMf2Name = SimpleRootname ++ "-target2.mk",
+ ?line {ok,TargetMf2} = file:read_file(TargetMf2Name),
+ ?line {ok,_,Mf5} = compile:file(Simple,
+ [binary,makedep,{makedep_target,"$target"},makedep_quote_target|
+ IncludeOptions]),
+ ?line TargetMf2 = makedep_modify_target(
+ makedep_canonicalize_result(Mf5, DataDir), "$$target"),
+ %% Basic rule written to some file.
+ ?line {ok,_} = compile:file(Simple,
+ [makedep,{makedep_output,Target}|IncludeOptions]),
+ ?line {ok,Mf6} = file:read_file(Target),
+ ?line BasicMf2 = makedep_canonicalize_result(Mf6, DataDir),
+
+ ?line ok = file:delete(Target),
+ ?line ok = file:del_dir(filename:dirname(Target)),
+ ?line test_server:timetrap_cancel(Dog),
+ ok.
+
+makedep_canonicalize_result(Mf, DataDir) ->
+ Mf0 = binary_to_list(Mf),
+ %% Replace the Datadir by "$(srcdir)".
+ Mf1 = re:replace(Mf0, DataDir, "$(srcdir)/",
+ [global,multiline,{return,list}]),
+ %% Long lines are splitted, put back everything on one line.
+ Mf2 = re:replace(Mf1, "\\\\\n ", "", [global,multiline,{return,list}]),
+ list_to_binary(Mf2).
+
+makedep_modify_target(Mf, Target) ->
+ Mf0 = binary_to_list(Mf),
+ Mf1 = re:replace(Mf0, Target, "$target", [{return,list}]),
+ list_to_binary(Mf1).
+
%% Tests that conditional compilation, defining values, including files work.
cond_and_ifdef(Config) when is_list(Config) ->
@@ -465,7 +552,6 @@ exists(Name) ->
{error, _} -> false
end.
-bad_record_use(suite) -> [bad_record_use1, bad_record_use2].
%% Tests that the compiler does not accept
%% bad use of records.
diff --git a/lib/compiler/test/compile_SUITE_data/simple-basic1.mk b/lib/compiler/test/compile_SUITE_data/simple-basic1.mk
new file mode 100644
index 0000000000..4073fa82d0
--- /dev/null
+++ b/lib/compiler/test/compile_SUITE_data/simple-basic1.mk
@@ -0,0 +1 @@
+simple.beam: $(srcdir)/simple.erl
diff --git a/lib/compiler/test/compile_SUITE_data/simple-basic2.mk b/lib/compiler/test/compile_SUITE_data/simple-basic2.mk
new file mode 100644
index 0000000000..761d1d9582
--- /dev/null
+++ b/lib/compiler/test/compile_SUITE_data/simple-basic2.mk
@@ -0,0 +1 @@
+simple.beam: $(srcdir)/simple.erl $(srcdir)/include/simple.hrl
diff --git a/lib/compiler/test/compile_SUITE_data/simple-missing.mk b/lib/compiler/test/compile_SUITE_data/simple-missing.mk
new file mode 100644
index 0000000000..b13d44ec36
--- /dev/null
+++ b/lib/compiler/test/compile_SUITE_data/simple-missing.mk
@@ -0,0 +1 @@
+simple.beam: $(srcdir)/simple.erl $(srcdir)/include/simple.hrl generated.hrl
diff --git a/lib/compiler/test/compile_SUITE_data/simple-target1.mk b/lib/compiler/test/compile_SUITE_data/simple-target1.mk
new file mode 100644
index 0000000000..dd9fa0d6e5
--- /dev/null
+++ b/lib/compiler/test/compile_SUITE_data/simple-target1.mk
@@ -0,0 +1 @@
+$target: $(srcdir)/simple.erl $(srcdir)/include/simple.hrl
diff --git a/lib/compiler/test/compile_SUITE_data/simple-target2.mk b/lib/compiler/test/compile_SUITE_data/simple-target2.mk
new file mode 100644
index 0000000000..a5fc6f461d
--- /dev/null
+++ b/lib/compiler/test/compile_SUITE_data/simple-target2.mk
@@ -0,0 +1 @@
+$$target: $(srcdir)/simple.erl $(srcdir)/include/simple.hrl
diff --git a/lib/compiler/test/compile_SUITE_data/simple.erl b/lib/compiler/test/compile_SUITE_data/simple.erl
index 2021056388..0c1c70a778 100644
--- a/lib/compiler/test/compile_SUITE_data/simple.erl
+++ b/lib/compiler/test/compile_SUITE_data/simple.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -37,3 +37,7 @@ foo() ->
{?included_value, ?foo_value}.
-endif.
+
+-ifdef(include_generated).
+-include("generated.hrl").
+-endif.
diff --git a/lib/compiler/test/compiler.cover b/lib/compiler/test/compiler.cover
index 69d284ea6c..9fc4c7dd43 100644
--- a/lib/compiler/test/compiler.cover
+++ b/lib/compiler/test/compiler.cover
@@ -1,3 +1,5 @@
+{incl_app,compiler,details}.
+
%% -*- erlang -*-
-{exclude,[sys_pre_attributes,core_scan,core_parse]}.
+{excl_mods,[sys_pre_attributes,core_scan,core_parse]}.
diff --git a/lib/compiler/test/compiler.dynspec b/lib/compiler/test/compiler.dynspec
deleted file mode 100644
index 7e452cef6c..0000000000
--- a/lib/compiler/test/compiler.dynspec
+++ /dev/null
@@ -1,10 +0,0 @@
-%% -*- erlang -*-
-%% You can test this file using this command.
-%% file:script("compiler.dynspec", [{'Os',"Unix"}]).
-
-case Os of
- "VxWorks" ->
- [{skip,{compile_SUITE,listings,"VxWorks filesystem too slow"}}];
- _ ->
- []
-end.
diff --git a/lib/compiler/test/compiler.spec b/lib/compiler/test/compiler.spec
new file mode 100644
index 0000000000..f2546c3ced
--- /dev/null
+++ b/lib/compiler/test/compiler.spec
@@ -0,0 +1,2 @@
+%% -*- erlang -*-
+{suites,"../compiler_test",all}.
diff --git a/lib/compiler/test/core_SUITE.erl b/lib/compiler/test/core_SUITE.erl
index 54cf799057..26173c62b8 100644
--- a/lib/compiler/test/core_SUITE.erl
+++ b/lib/compiler/test/core_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -18,10 +18,12 @@
%%
-module(core_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
dehydrated_itracer/1,nested_tries/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(comp(N),
N(Config) when is_list(Config) -> try_it(N, Config)).
@@ -30,14 +32,32 @@ init_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
Dog = test_server:timetrap(?t:minutes(5)),
[{watchdog,Dog}|Config].
-fin_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
+end_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
- [dehydrated_itracer,nested_tries].
+ [dehydrated_itracer, nested_tries].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
?comp(dehydrated_itracer).
?comp(nested_tries).
diff --git a/lib/compiler/test/core_fold_SUITE.erl b/lib/compiler/test/core_fold_SUITE.erl
index 5f2c905d4a..ac14d36e82 100644
--- a/lib/compiler/test/core_fold_SUITE.erl
+++ b/lib/compiler/test/core_fold_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -18,18 +18,37 @@
%%
-module(core_fold_SUITE).
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
t_element/1,setelement/1,t_length/1,append/1,t_apply/1,bifs/1,
eq/1,nested_call_in_case/1,coverage/1]).
-export([foo/0,foo/1,foo/2,foo/3]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
- [t_element,setelement,t_length,append,t_apply,bifs,
- eq,nested_call_in_case,coverage].
+ [t_element, setelement, t_length, append, t_apply, bifs,
+ eq, nested_call_in_case, coverage].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
t_element(Config) when is_list(Config) ->
X = make_ref(),
diff --git a/lib/compiler/test/error_SUITE.erl b/lib/compiler/test/error_SUITE.erl
index ec58a0761e..6e0aadf007 100644
--- a/lib/compiler/test/error_SUITE.erl
+++ b/lib/compiler/test/error_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -18,14 +18,32 @@
%%
-module(error_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
head_mismatch_line/1,warnings_as_errors/1, bif_clashes/1]).
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
- [head_mismatch_line,warnings_as_errors,bif_clashes].
+ [head_mismatch_line, warnings_as_errors, bif_clashes].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
bif_clashes(Config) when is_list(Config) ->
diff --git a/lib/compiler/test/float_SUITE.erl b/lib/compiler/test/float_SUITE.erl
index b48b1daa32..afc04fd440 100644
--- a/lib/compiler/test/float_SUITE.erl
+++ b/lib/compiler/test/float_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
@@ -17,13 +17,34 @@
%% %CopyrightEnd%
%%
-module(float_SUITE).
--export([all/1,pending/1,bif_calls/1,math_functions/1,mixed_float_and_int/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ pending/1,bif_calls/1,math_functions/1,mixed_float_and_int/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
- [pending,bif_calls,math_functions,mixed_float_and_int].
+ [pending, bif_calls, math_functions,
+ mixed_float_and_int].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% Thanks to Tobias Lindahl <[email protected]>
%% Shows the effect of pending exceptions on the x86.
diff --git a/lib/compiler/test/fun_SUITE.erl b/lib/compiler/test/fun_SUITE.erl
index fb2667245a..368a5815bf 100644
--- a/lib/compiler/test/fun_SUITE.erl
+++ b/lib/compiler/test/fun_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -18,14 +18,33 @@
%%
-module(fun_SUITE).
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
test1/1,overwritten_fun/1,otp_7202/1,bif_fun/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
- [test1,overwritten_fun,otp_7202,bif_fun].
+ [test1, overwritten_fun, otp_7202, bif_fun].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%% The help functions below are copied from emulator:bs_construct_SUITE.
diff --git a/lib/compiler/test/guard_SUITE.erl b/lib/compiler/test/guard_SUITE.erl
index 8f23bd2e5a..0e69efba6b 100644
--- a/lib/compiler/test/guard_SUITE.erl
+++ b/lib/compiler/test/guard_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -18,9 +18,10 @@
%%
-module(guard_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
misc/1,const_cond/1,basic_not/1,complex_not/1,nested_nots/1,
semicolon/1,complex_semicolon/1,comma/1,
or_guard/1,more_or_guards/1,
@@ -33,17 +34,33 @@
basic_andalso_orelse/1,traverse_dcd/1,
check_qlc_hrl/1,andalso_semi/1,t_tuple_size/1,binary_part/1]).
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
- [misc,const_cond,basic_not,complex_not,nested_nots,
- semicolon,complex_semicolon,
- comma,or_guard,more_or_guards,
- complex_or_guards,and_guard,
- xor_guard,more_xor_guards,
- build_in_guard,old_guard_tests,gbif,
- t_is_boolean,is_function_2,tricky,rel_ops,literal_type_tests,
- basic_andalso_orelse,traverse_dcd,check_qlc_hrl,andalso_semi,
- t_tuple_size,binary_part].
+ [misc, const_cond, basic_not, complex_not, nested_nots,
+ semicolon, complex_semicolon, comma, or_guard,
+ more_or_guards, complex_or_guards, and_guard, xor_guard,
+ more_xor_guards, build_in_guard, old_guard_tests, gbif,
+ t_is_boolean, is_function_2, tricky, rel_ops,
+ literal_type_tests, basic_andalso_orelse, traverse_dcd,
+ check_qlc_hrl, andalso_semi, t_tuple_size, binary_part].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
misc(Config) when is_list(Config) ->
?line 42 = case id(42) of
@@ -94,8 +111,8 @@ const_cond(Config) when is_list(Config) ->
const_cond(T, Sz) ->
case T of
_X when false -> never;
- _X when tuple(T), eq == eq, tuple_size(T) == Sz -> ok;
- _X when tuple(T), eq == leq, tuple_size(T) =< Sz -> ok;
+ _X when is_tuple(T), eq == eq, tuple_size(T) == Sz -> ok;
+ _X when is_tuple(T), eq == leq, tuple_size(T) =< Sz -> ok;
_X -> error
end.
@@ -1137,7 +1154,7 @@ make_test([{T,L}|Ts]) ->
make_test([]) -> [].
test(T, L) ->
- S0 = io_lib:format("begin io:format(\"~~p~~n\", [{~p,~p}]), if ~w(~w) -> true; true -> false end end. ", [T,L,T,L]),
+ S0 = io_lib:format("begin io:format(\"~~p~n\", [{~p,~p}]), if ~w(~w) -> true; true -> false end end. ", [T,L,T,L]),
S = lists:flatten(S0),
{ok,Toks,_Line} = erl_scan:string(S),
{ok,E} = erl_parse:parse_exprs(Toks),
@@ -1145,7 +1162,7 @@ test(T, L) ->
{match,0,{atom,0,Val},hd(E)}.
test(T, L1, L2) ->
- S0 = io_lib:format("begin io:format(\"~~p~~n\", [{~p,~p,~p}]), if ~w(~w, ~w) -> true; true -> false end end. ", [T,L1,L2,T,L1,L2]),
+ S0 = io_lib:format("begin io:format(\"~~p~n\", [{~p,~p,~p}]), if ~w(~w, ~w) -> true; true -> false end end. ", [T,L1,L2,T,L1,L2]),
S = lists:flatten(S0),
{ok,Toks,_Line} = erl_scan:string(S),
{ok,E} = erl_parse:parse_exprs(Toks),
diff --git a/lib/compiler/test/inline_SUITE.erl b/lib/compiler/test/inline_SUITE.erl
index 396fb450b7..af2b8ec92a 100644
--- a/lib/compiler/test/inline_SUITE.erl
+++ b/lib/compiler/test/inline_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -20,7 +20,7 @@
-module(inline_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-compile(export_all).
-compile({inline,[badarg/2]}).
@@ -28,10 +28,29 @@
%% Needed by test case `lists'.
-compile(inline_list_funcs).
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
- [attribute,bsdecode,bsdes,barnes2,decode1,smith,itracer,pseudoknot,lists,
- really_inlined,otp_7223,coverage].
+ [attribute, bsdecode, bsdes, barnes2, decode1, smith,
+ itracer, pseudoknot, lists, really_inlined, otp_7223,
+ coverage].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
attribute(Config) when is_list(Config) ->
Name = "attribute",
@@ -49,7 +68,7 @@ attribute(Config) when is_list(Config) ->
ok.
-define(comp(Name),
- Name(Config) when list(Config) ->
+ Name(Config) when is_list(Config) ->
try_inline(Name, Config)).
?comp(bsdecode).
diff --git a/lib/compiler/test/lc_SUITE.erl b/lib/compiler/test/lc_SUITE.erl
index 40bf67e1fa..c8908858ba 100644
--- a/lib/compiler/test/lc_SUITE.erl
+++ b/lib/compiler/test/lc_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -19,21 +19,41 @@
-module(lc_SUITE).
-author('[email protected]').
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
basic/1,deeply_nested/1,no_generator/1,
empty_generator/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
- [basic,deeply_nested,no_generator,empty_generator].
+ [basic, deeply_nested, no_generator, empty_generator].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
Dog = test_server:timetrap(?t:minutes(1)),
[{watchdog,Dog}|Config].
-fin_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
+end_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
@@ -160,7 +180,7 @@ empty_generator(Config) when is_list(Config) ->
id(I) -> I.
fc(Args, {'EXIT',{function_clause,[{?MODULE,_,Args}|_]}}) -> ok;
-fc(Args, {'EXIT',{function_clause,[{?MODULE,Name,Arity}|_]}})
+fc(Args, {'EXIT',{function_clause,[{?MODULE,_,Arity}|_]}})
when length(Args) =:= Arity ->
true = test_server:is_native(?MODULE);
fc(Args, {'EXIT',{{case_clause,ActualArgs},_}})
diff --git a/lib/compiler/test/match_SUITE.erl b/lib/compiler/test/match_SUITE.erl
index fd51b777ac..9406d7de8f 100644
--- a/lib/compiler/test/match_SUITE.erl
+++ b/lib/compiler/test/match_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -18,17 +18,36 @@
%%
-module(match_SUITE).
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
pmatch/1,mixed/1,aliases/1,match_in_call/1,
untuplify/1,shortcut_boolean/1,letify_guard/1,
- selectify/1,underscore/1]).
+ selectify/1,underscore/1,coverage/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
- [pmatch,mixed,aliases,match_in_call,untuplify,shortcut_boolean,
- letify_guard,selectify,underscore].
+ [pmatch, mixed, aliases, match_in_call, untuplify,
+ shortcut_boolean, letify_guard, selectify, underscore, coverage].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
pmatch(Config) when is_list(Config) ->
?line ok = doit(1),
@@ -379,4 +398,18 @@ underscore(Config) when is_list(Config) ->
_ = is_list(Config),
ok.
+coverage(Config) when is_list(Config) ->
+ %% Cover beam_dead.
+ ok = coverage_1(x, a),
+ ok = coverage_1(x, b).
+
+coverage_1(B, Tag) ->
+ case Tag of
+ a -> coverage_2(1, a, B);
+ b -> coverage_2(2, b, B)
+ end.
+
+coverage_2(1, a, x) -> ok;
+coverage_2(2, b, x) -> ok.
+
id(I) -> I.
diff --git a/lib/compiler/test/misc_SUITE.erl b/lib/compiler/test/misc_SUITE.erl
index 450a4e279d..c941a80e61 100644
--- a/lib/compiler/test/misc_SUITE.erl
+++ b/lib/compiler/test/misc_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -18,11 +18,13 @@
%%
-module(misc_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
tobias/1,empty_string/1,md5/1,silly_coverage/1,
confused_literals/1,integer_encoding/1,override_bif/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% For the override_bif testcase.
%% NB, no other testcases in this testsuite can use these without erlang:prefix!
@@ -45,17 +47,34 @@ init_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
Dog = test_server:timetrap(?t:minutes(10)),
[{watchdog,Dog}|Config].
-fin_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
+end_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
--spec all(any()) -> misc_SUITE_test_cases().
+suite() -> [{ct_hooks,[ts_install_cth]}].
-all(suite) ->
+-spec all() -> misc_SUITE_test_cases().
+all() ->
test_lib:recompile(?MODULE),
- [tobias,empty_string,md5,silly_coverage,confused_literals,
- integer_encoding, override_bif].
+ [tobias, empty_string, md5, silly_coverage,
+ confused_literals, integer_encoding, override_bif].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%
diff --git a/lib/compiler/test/num_bif_SUITE.erl b/lib/compiler/test/num_bif_SUITE.erl
index 912f7366dd..3479cf5425 100644
--- a/lib/compiler/test/num_bif_SUITE.erl
+++ b/lib/compiler/test/num_bif_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -18,7 +18,7 @@
%%
-module(num_bif_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% Tests optimization of the BIFs:
%% abs/1
@@ -30,17 +30,37 @@
%% round/1
%% trunc/1
--export([all/1, t_abs/1, t_float/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, t_abs/1, t_float/1,
t_float_to_list/1, t_integer_to_list/1,
t_list_to_integer/1,
- t_list_to_float/1, t_list_to_float_safe/1, t_list_to_float_risky/1,
+ t_list_to_float_safe/1, t_list_to_float_risky/1,
t_round/1, t_trunc/1]).
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
[t_abs, t_float, t_float_to_list, t_integer_to_list,
- t_list_to_float, t_list_to_integer,
- t_round, t_trunc].
+ {group, t_list_to_float}, t_list_to_integer, t_round,
+ t_trunc].
+
+groups() ->
+ [{t_list_to_float, [],
+ [t_list_to_float_safe, t_list_to_float_risky]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
t_abs(Config) when is_list(Config) ->
%% Floats.
@@ -142,7 +162,6 @@ t_integer_to_list(Config) when is_list(Config) ->
%% Tests list_to_float/1.
-t_list_to_float(suite) -> [t_list_to_float_safe, t_list_to_float_risky].
t_list_to_float_safe(Config) when is_list(Config) ->
?line 0.0 = list_to_float("0.0"),
diff --git a/lib/compiler/test/parteval_SUITE.erl b/lib/compiler/test/parteval_SUITE.erl
index 3ef84571b9..6b1ae38c1b 100644
--- a/lib/compiler/test/parteval_SUITE.erl
+++ b/lib/compiler/test/parteval_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -18,11 +18,31 @@
%%
-module(parteval_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1, pe2/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, pe2/1]).
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [pe2].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) -> [pe2].
%% (This is more general than needed, since we once compiled the same
%% source code with and without a certain option.)
diff --git a/lib/compiler/test/pmod_SUITE.erl b/lib/compiler/test/pmod_SUITE.erl
index 13503ce905..9a317b5762 100644
--- a/lib/compiler/test/pmod_SUITE.erl
+++ b/lib/compiler/test/pmod_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -18,20 +18,40 @@
%%
-module(pmod_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
basic/1, otp_8447/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
[basic, otp_8447].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
init_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
Dog = test_server:timetrap(?t:minutes(1)),
[{watchdog,Dog}|Config].
-fin_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
+end_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
diff --git a/lib/compiler/test/receive_SUITE.erl b/lib/compiler/test/receive_SUITE.erl
index 2a592dd669..2a67615e5e 100644
--- a/lib/compiler/test/receive_SUITE.erl
+++ b/lib/compiler/test/receive_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -20,23 +20,42 @@
-module(receive_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
- recv/1,coverage/1,otp_7980/1,ref_opt/1,export/1]).
+-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/1,recv/1,coverage/1,otp_7980/1,ref_opt/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
init_per_testcase(_Case, Config) ->
?line Dog = test_server:timetrap(test_server:minutes(2)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
- [recv,coverage,otp_7980,ref_opt,export].
+ [recv, coverage, otp_7980, ref_opt, export].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-record(state, {ena = true}).
diff --git a/lib/compiler/test/record_SUITE.erl b/lib/compiler/test/record_SUITE.erl
index f26ff769c7..363422ec7e 100644
--- a/lib/compiler/test/record_SUITE.erl
+++ b/lib/compiler/test/record_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -20,25 +20,47 @@
-module(record_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
errors/1,record_test_2/1,record_test_3/1,record_access_in_guards/1,
- guard_opt/1,eval_once/1,foobar/1,missing_test_heap/1, nested_access/1]).
+ guard_opt/1,eval_once/1,foobar/1,missing_test_heap/1,
+ nested_access/1,coverage/1]).
init_per_testcase(_Case, Config) ->
?line Dog = test_server:timetrap(test_server:minutes(2)),
[{watchdog,Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
- [errors,record_test_2,record_test_3,record_access_in_guards,
- guard_opt,eval_once,foobar,missing_test_heap,nested_access].
+ [errors, record_test_2, record_test_3,
+ record_access_in_guards, guard_opt, eval_once, foobar,
+ missing_test_heap, nested_access, coverage].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
-record(foo, {a,b,c,d}).
-record(bar, {a,b,c,d}).
@@ -547,4 +569,18 @@ nested_access(Config) when is_list(Config) ->
?line N2a = N2b,
ok.
+-record(rr, {a,b,c}).
+
+coverage(Config) when is_list(Config) ->
+ %% There should only remain one record test in the code below.
+ R0 = id(#rr{a=1,b=2,c=3}),
+ B = R0#rr.b, %Test the record here.
+ R = R0#rr{c=42}, %No need to test here.
+ if
+ B > R#rr.a -> %No need to test here.
+ ok
+ end,
+ #rr{a=1,b=2,c=42} = id(R), %Test for correctness.
+ ok.
+
id(I) -> I.
diff --git a/lib/compiler/test/test_lib.erl b/lib/compiler/test/test_lib.erl
index d8799952a9..53d8c04169 100644
--- a/lib/compiler/test/test_lib.erl
+++ b/lib/compiler/test/test_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -41,7 +41,7 @@ smoke_disasm(Mod) when is_atom(Mod) ->
smoke_disasm(code:which(Mod));
smoke_disasm(File) when is_list(File) ->
Res = beam_disasm:file(File),
- {beam_file,Mod} = {element(1, Res),element(2, Res)}.
+ {beam_file,_Mod} = {element(1, Res),element(2, Res)}.
%% Retrieve the "interesting" compiler options (options for optimization
%% and compatibility) for the given module.
@@ -62,16 +62,16 @@ opt_opts(Mod) ->
(_) -> false
end, Opts).
-%% Some test suites gets cloned (e.g. to "record_SUITE" to "record_no_opt_SUITE"),
-%% but the data directory is not cloned. This function retrieves the path to
-%% the original data directory.
+%% Some test suites gets cloned (e.g. to "record_SUITE" to
+%% "record_no_opt_SUITE"), but the data directory is not cloned.
+%% This function retrieves the path to the original data directory.
get_data_dir(Config) ->
Data0 = ?config(data_dir, Config),
- {ok,Data1,_} = regexp:sub(Data0, "_no_opt_SUITE", "_SUITE"),
- {ok,Data2,_} = regexp:sub(Data1, "_post_opt_SUITE", "_SUITE"),
- {ok,Data,_} = regexp:sub(Data2, "_inline_SUITE", "_SUITE"),
- Data.
+ Opts = [{return,list}],
+ Data1 = re:replace(Data0, "_no_opt_SUITE", "_SUITE", Opts),
+ Data = re:replace(Data1, "_post_opt_SUITE", "_SUITE", Opts),
+ re:replace(Data, "_inline_SUITE", "_SUITE", Opts).
%% p_run(fun(Data) -> ok|error, List) -> ok
%% Will fail the test case if there were any errors.
diff --git a/lib/compiler/test/trycatch_SUITE.erl b/lib/compiler/test/trycatch_SUITE.erl
index c2f6dc24be..c6e0f8d85d 100644
--- a/lib/compiler/test/trycatch_SUITE.erl
+++ b/lib/compiler/test/trycatch_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -18,21 +18,40 @@
%%
-module(trycatch_SUITE).
--export([all/1,basic/1,lean_throw/1,try_of/1,try_after/1,%after_bind/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,basic/1,lean_throw/1,
+ try_of/1,try_after/1,%after_bind/1,
catch_oops/1,after_oops/1,eclectic/1,rethrow/1,
nested_of/1,nested_catch/1,nested_after/1,
nested_horrid/1,last_call_optimization/1,bool/1,
plain_catch_coverage/1,andalso_orelse/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
- [basic,lean_throw,try_of,try_after,%after_bind,
- catch_oops,after_oops,eclectic,rethrow,
- nested_of,nested_catch,nested_after,
- nested_horrid,last_call_optimization,
- bool,plain_catch_coverage,andalso_orelse].
+ [basic, lean_throw, try_of, try_after, catch_oops,
+ after_oops, eclectic, rethrow, nested_of, nested_catch,
+ nested_after, nested_horrid, last_call_optimization,
+ bool, plain_catch_coverage, andalso_orelse].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
basic(Conf) when is_list(Conf) ->
diff --git a/lib/compiler/test/warnings_SUITE.erl b/lib/compiler/test/warnings_SUITE.erl
index 5ed8836c70..f6a572abfa 100644
--- a/lib/compiler/test/warnings_SUITE.erl
+++ b/lib/compiler/test/warnings_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -26,12 +26,14 @@
-define(privdir, "warnings_SUITE_priv").
-define(t, test_server).
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(datadir, ?config(data_dir, Conf)).
-define(privdir, ?config(priv_dir, Conf)).
-endif.
--export([all/1,init_per_testcase/2,fin_per_testcase/2]).
+-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([pattern/1,pattern2/1,pattern3/1,pattern4/1,
guard/1,bad_arith/1,bool_cases/1,bad_apply/1,
@@ -44,16 +46,34 @@ init_per_testcase(_Case, Config) ->
?line Dog = ?t:timetrap(?default_timeout),
[{watchdog, Dog} | Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
test_lib:recompile(?MODULE),
- [pattern,pattern2,pattern3,pattern4,
- guard,bad_arith,bool_cases,bad_apply,files,effect,
- bin_opt_info,bin_construction].
+ [pattern, pattern2, pattern3, pattern4, guard,
+ bad_arith, bool_cases, bad_apply, files, effect,
+ bin_opt_info, bin_construction].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
pattern(Config) when is_list(Config) ->
%% Test warnings generated by v3_core.
@@ -433,6 +453,16 @@ effect(Config) when is_list(Config) ->
true -> ok
end,
ok.
+
+ m8(A, B) ->
+ case {A,B} of
+ V -> V
+ end,
+ ok.
+
+ m9(Bs) ->
+ [{B,ok} = {B,foo:bar(B)} || B <- Bs],
+ ok.
">>,
[],
{warnings,[{5,sys_core_fold,{no_effect,{erlang,is_integer,1}}},
diff --git a/lib/compiler/vsn.mk b/lib/compiler/vsn.mk
index d180ecd4e2..e46096a6df 100644
--- a/lib/compiler/vsn.mk
+++ b/lib/compiler/vsn.mk
@@ -1 +1 @@
-COMPILER_VSN = 4.7.2
+COMPILER_VSN = 4.7.3
diff --git a/lib/cosEvent/doc/src/CosEventChannelAdmin_ConsumerAdmin.xml b/lib/cosEvent/doc/src/CosEventChannelAdmin_ConsumerAdmin.xml
index e579d6f6f4..95941fefdd 100644
--- a/lib/cosEvent/doc/src/CosEventChannelAdmin_ConsumerAdmin.xml
+++ b/lib/cosEvent/doc/src/CosEventChannelAdmin_ConsumerAdmin.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1997</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosEvent/doc/src/CosEventChannelAdmin_EventChannel.xml b/lib/cosEvent/doc/src/CosEventChannelAdmin_EventChannel.xml
index 809bf89762..51f9f11613 100644
--- a/lib/cosEvent/doc/src/CosEventChannelAdmin_EventChannel.xml
+++ b/lib/cosEvent/doc/src/CosEventChannelAdmin_EventChannel.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1997</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPullConsumer.xml b/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPullConsumer.xml
index 811c8615b9..9690c9406d 100644
--- a/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPullConsumer.xml
+++ b/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPullConsumer.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1997</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPullSupplier.xml b/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPullSupplier.xml
index 6c22c5ed39..fb17c450f4 100644
--- a/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPullSupplier.xml
+++ b/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPullSupplier.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1997</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPushConsumer.xml b/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPushConsumer.xml
index 2b50f8858a..21e6cfce6f 100644
--- a/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPushConsumer.xml
+++ b/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPushConsumer.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1997</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPushSupplier.xml b/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPushSupplier.xml
index cda162f4cd..be2dfcafbe 100644
--- a/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPushSupplier.xml
+++ b/lib/cosEvent/doc/src/CosEventChannelAdmin_ProxyPushSupplier.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1997</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosEvent/doc/src/CosEventChannelAdmin_SupplierAdmin.xml b/lib/cosEvent/doc/src/CosEventChannelAdmin_SupplierAdmin.xml
index abcd7b6c1f..ca301bb860 100644
--- a/lib/cosEvent/doc/src/CosEventChannelAdmin_SupplierAdmin.xml
+++ b/lib/cosEvent/doc/src/CosEventChannelAdmin_SupplierAdmin.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1997</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosEvent/doc/src/ch_contents.xml b/lib/cosEvent/doc/src/ch_contents.xml
index bc2838b36d..943e00b967 100644
--- a/lib/cosEvent/doc/src/ch_contents.xml
+++ b/lib/cosEvent/doc/src/ch_contents.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1999</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosEvent/doc/src/ch_introduction.xml b/lib/cosEvent/doc/src/ch_introduction.xml
index 8f948a5530..101c3e1212 100644
--- a/lib/cosEvent/doc/src/ch_introduction.xml
+++ b/lib/cosEvent/doc/src/ch_introduction.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1999</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosEvent/doc/src/cosEventApp.xml b/lib/cosEvent/doc/src/cosEventApp.xml
index d83f44acb1..55ea790203 100644
--- a/lib/cosEvent/doc/src/cosEventApp.xml
+++ b/lib/cosEvent/doc/src/cosEventApp.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2001</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosEvent/doc/src/notes.xml b/lib/cosEvent/doc/src/notes.xml
index b6c4531901..1a5c8afa17 100644
--- a/lib/cosEvent/doc/src/notes.xml
+++ b/lib/cosEvent/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>1999</year><year>2010</year>
+ <year>1999</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -33,42 +33,48 @@
</header>
<section>
- <title>cosEvent 2.1.9</title>
+ <title>cosEvent 2.1.10</title>
<section>
<title>Improvements and New Features</title>
<list type="bulleted">
<item>
<p>
- Test suites published.</p>
+ Eliminated Dialyzer warnings when using exit or throw.</p>
<p>
- Own Id: OTP-8543 Aux Id:</p>
+ Own Id: OTP-9050 Aux Id:</p>
</item>
</list>
</section>
</section>
<section>
- <title>cosEvent 2.1.8</title>
+ <title>cosEvent 2.1.9</title>
<section>
<title>Improvements and New Features</title>
<list type="bulleted">
<item>
<p>
- Removed the usage of the codeinclude tag in the documentation.</p>
+ Test suites published.</p>
<p>
- Own Id: OTP-8409 Aux Id:</p>
+ Own Id: OTP-8543 Aux Id:</p>
</item>
</list>
</section>
+ </section>
+
+ <section>
+ <title>cosEvent 2.1.8</title>
<section>
- <title>Fixed Bugs and Malfunctions</title>
+ <title>Improvements and New Features</title>
<list type="bulleted">
<item>
- <p>The documentation EIX file was not generated.</p>
- <p>Own id: OTP-8355 Aux Id:</p>
+ <p>
+ Removed the usage of the codeinclude tag in the documentation.</p>
+ <p>
+ Own Id: OTP-8409 Aux Id:</p>
</item>
</list>
</section>
diff --git a/lib/cosEvent/src/cosEventApp.erl b/lib/cosEvent/src/cosEventApp.erl
index 084490f845..143c241448 100644
--- a/lib/cosEvent/src/cosEventApp.erl
+++ b/lib/cosEvent/src/cosEventApp.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -66,26 +66,31 @@
%% Effect : Install necessary data in the IFR DB
%%------------------------------------------------------------
install() ->
- install_loop(?IDL_MODULES, []).
+ case install_loop(?IDL_MODULES, []) of
+ ok ->
+ ok;
+ {error, Reason} ->
+ exit(Reason)
+ end.
install_loop([], _) ->
ok;
install_loop([H|T], Accum) ->
case catch H:'oe_register'() of
{'EXIT',{unregistered,App}} ->
- ?write_ErrorMsg("Unable to register '~p'; application ~p not registered.
-Trying to unregister ~p~n", [H,App,Accum]),
+ ?write_ErrorMsg("Unable to register '~p'; application ~p not registered.\n"
+ "Trying to unregister ~p~n", [H,App,Accum]),
uninstall_loop(Accum, {exit, register});
{'EXCEPTION',_} ->
- ?write_ErrorMsg("Unable to register '~p'; propably already registered.
-You are adviced to confirm this.
-Trying to unregister ~p~n", [H,Accum]),
+ ?write_ErrorMsg("Unable to register '~p'; propably already registered.\n"
+ "You are adviced to confirm this.\n"
+ "Trying to unregister ~p~n", [H,Accum]),
uninstall_loop(Accum, {exit, register});
ok ->
install_loop(T, [H|Accum]);
_ ->
- ?write_ErrorMsg("Unable to register '~p'; reason unknown.
-Trying to unregister ~p~n", [H,Accum]),
+ ?write_ErrorMsg("Unable to register '~p'; reason unknown.\n"
+ "Trying to unregister ~p~n", [H,Accum]),
uninstall_loop(Accum, {exit, register})
end.
@@ -96,27 +101,32 @@ Trying to unregister ~p~n", [H,Accum]),
%% Effect : Remove data related to cosEvent from the IFR DB
%%------------------------------------------------------------
uninstall() ->
- uninstall_loop(lists:reverse(?IDL_MODULES), ok).
+ case uninstall_loop(lists:reverse(?IDL_MODULES), ok) of
+ ok ->
+ ok;
+ {error, Reason} ->
+ exit(Reason)
+ end.
uninstall_loop([],ok) ->
ok;
uninstall_loop([],{exit, register}) ->
- exit({?MODULE, "oe_register failed"});
+ {error, {?MODULE, "oe_register failed"}};
uninstall_loop([],{exit, unregister}) ->
- exit({?MODULE, "oe_unregister failed"});
+ {error, {?MODULE, "oe_unregister failed"}};
uninstall_loop([],{exit, both}) ->
- exit({?MODULE, "oe_register and, for some of those already registered, oe_unregister failed"});
+ {error, {?MODULE, "oe_register and, for some of those already registered, oe_unregister failed"}};
uninstall_loop([H|T], Status) ->
case catch H:'oe_unregister'() of
ok ->
uninstall_loop(T, Status);
_ when Status == ok ->
- ?write_ErrorMsg("Unable to unregister '~p'; propably already unregistered.
-You are adviced to confirm this.~n",[H]),
+ ?write_ErrorMsg("Unable to unregister '~p'; propably already unregistered.\n"
+ "You are adviced to confirm this.\n",[H]),
uninstall_loop(T, {exit, unregister});
_ ->
- ?write_ErrorMsg("Unable to unregister '~p'; propably already unregistered.
-You are adviced to confirm this.~n",[H]),
+ ?write_ErrorMsg("Unable to unregister '~p'; propably already unregistered.\n"
+ "You are adviced to confirm this.\n",[H]),
uninstall_loop(T, {exit, both})
end.
diff --git a/lib/cosEvent/test/Makefile b/lib/cosEvent/test/Makefile
index 3d95075ee1..c59c7ee315 100644
--- a/lib/cosEvent/test/Makefile
+++ b/lib/cosEvent/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1999-2009. All Rights Reserved.
+# Copyright Ericsson AB 1999-2011. 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
@@ -34,6 +34,7 @@ RELSYSDIR = $(RELEASE_PATH)/cosEvent_test
# Target Specs
# ----------------------------------------------------
TEST_SPEC_FILE = cosEvent.spec
+COVER_FILE = cosEvent.cover
IDL_FILES = \
@@ -146,7 +147,7 @@ release_docs_spec:
release_tests_spec: tests
$(INSTALL_DIR) $(RELSYSDIR)
$(INSTALL_DATA) $(IDL_FILES) $(TEST_SPEC_FILE) \
- $(ERL_FILES) $(RELSYSDIR)
+ $(COVER_FILE) $(ERL_FILES) $(RELSYSDIR)
$(INSTALL_DATA) $(SUITE_TARGET_FILES) $(RELSYSDIR)
$(INSTALL_DIR) $(RELSYSDIR)/$(IDLOUTDIR)
$(INSTALL_DATA) $(GEN_TARGET_FILES) $(GEN_FILES) \
diff --git a/lib/cosEvent/test/cosEvent.cover b/lib/cosEvent/test/cosEvent.cover
new file mode 100644
index 0000000000..df12ea3ca9
--- /dev/null
+++ b/lib/cosEvent/test/cosEvent.cover
@@ -0,0 +1,2 @@
+{incl_app,cosEvent,details}.
+
diff --git a/lib/cosEvent/test/cosEvent.spec b/lib/cosEvent/test/cosEvent.spec
index 910f7a7c28..f793693779 100644
--- a/lib/cosEvent/test/cosEvent.spec
+++ b/lib/cosEvent/test/cosEvent.spec
@@ -1,19 +1 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1999-2010. 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%
-%%
-{topcase, {dir, "../cosEvent_test"}}.
+{suites,"../cosEvent_test",all}.
diff --git a/lib/cosEvent/test/event_channel_SUITE.erl b/lib/cosEvent/test/event_channel_SUITE.erl
index 2b0cf1fe30..9017f489bf 100644
--- a/lib/cosEvent/test/event_channel_SUITE.erl
+++ b/lib/cosEvent/test/event_channel_SUITE.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -22,7 +22,7 @@
-module(event_channel_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
-include_lib("orber/COSS/CosNaming/CosNaming.hrl").
-include_lib("orber/src/orber_iiop.hrl").
@@ -53,21 +53,33 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1, event_objects_api/1, events_api/1, events_sync_api/1,
- cases/0, init_all/1, finish_all/1,
- init_per_testcase/2, fin_per_testcase/2, app_test/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ event_objects_api/1, events_api/1, events_sync_api/1,
+ cases/0, init_per_suite/1, end_per_suite/1,
+ init_per_testcase/2, end_per_testcase/2, app_test/1]).
%%-----------------------------------------------------------------
%% Internal exports
%%-----------------------------------------------------------------
-all(doc) -> ["API tests for the cosEvent interfaces", ""];
-all(suite) -> {req,
- [mnesia, orber],
- {conf, init_all, cases(), finish_all}}.
-
-cases() ->
- [events_api, events_sync_api, event_objects_api, app_test].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
+ [events_api, events_sync_api, event_objects_api,
+ app_test].
%%-----------------------------------------------------------------
%% Init and cleanup functions.
@@ -78,12 +90,12 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-init_all(Config) when is_list(Config) ->
+init_per_suite(Config) when is_list(Config) ->
Path = code:which(?MODULE),
code:add_pathz(filename:join(filename:dirname(Path), "idl_output")),
mnesia:delete_schema([node()]),
@@ -96,7 +108,7 @@ init_all(Config) when is_list(Config) ->
oe_event_test_server:oe_register(),
Config.
-finish_all(Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
oe_event_test_server:oe_unregister(),
cosEventApp:stop(),
cosEventApp:uninstall(),
diff --git a/lib/cosEvent/test/event_test_PullC_impl.erl b/lib/cosEvent/test/event_test_PullC_impl.erl
index 186d1cbd51..4b81572cad 100644
--- a/lib/cosEvent/test/event_test_PullC_impl.erl
+++ b/lib/cosEvent/test/event_test_PullC_impl.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2010. 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
diff --git a/lib/cosEvent/test/event_test_PullS_impl.erl b/lib/cosEvent/test/event_test_PullS_impl.erl
index b7fa0c34f0..81685980fb 100644
--- a/lib/cosEvent/test/event_test_PullS_impl.erl
+++ b/lib/cosEvent/test/event_test_PullS_impl.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2010. 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
diff --git a/lib/cosEvent/test/event_test_PushC_impl.erl b/lib/cosEvent/test/event_test_PushC_impl.erl
index 6eadf74a31..c2be1d4c08 100644
--- a/lib/cosEvent/test/event_test_PushC_impl.erl
+++ b/lib/cosEvent/test/event_test_PushC_impl.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2010. 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
diff --git a/lib/cosEvent/test/event_test_PushS_impl.erl b/lib/cosEvent/test/event_test_PushS_impl.erl
index da82e97211..35cfc66e6b 100644
--- a/lib/cosEvent/test/event_test_PushS_impl.erl
+++ b/lib/cosEvent/test/event_test_PushS_impl.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2010. 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
diff --git a/lib/cosEvent/test/generated_SUITE.erl b/lib/cosEvent/test/generated_SUITE.erl
index 2d75b18451..e1e4e719b0 100644
--- a/lib/cosEvent/test/generated_SUITE.erl
+++ b/lib/cosEvent/test/generated_SUITE.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -25,7 +25,7 @@
-module(generated_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
-define(default_timeout, ?t:minutes(3)).
@@ -71,12 +71,12 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
%%-----------------------------------------------------------------
%% Internal exports
%%-----------------------------------------------------------------
--export([]).
-compile(export_all).
%%-----------------------------------------------------------------
@@ -84,19 +84,42 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["This suite is for testing IC generated files"];
-all(suite) ->
- ['CosEventChannelAdmin_AlreadyConnected', 'CosEventChannelAdmin_TypeError',
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ ['CosEventChannelAdmin_AlreadyConnected',
+ 'CosEventChannelAdmin_TypeError',
'CosEventComm_Disconnected',
- 'CosEventChannelAdmin_ConsumerAdmin', 'CosEventChannelAdmin_EventChannel',
- 'CosEventChannelAdmin_ProxyPullConsumer', 'CosEventChannelAdmin_ProxyPullSupplier',
- 'CosEventChannelAdmin_ProxyPushConsumer', 'CosEventChannelAdmin_ProxyPushSupplier',
- 'CosEventChannelAdmin_SupplierAdmin', oe_CosEventComm_CAdmin,
- oe_CosEventComm_Channel, oe_CosEventComm_Event, oe_CosEventComm_PullerS,
- oe_CosEventComm_PusherS, 'CosEventComm_PullConsumer',
- 'CosEventComm_PullSupplier', 'CosEventComm_PushConsumer',
+ 'CosEventChannelAdmin_ConsumerAdmin',
+ 'CosEventChannelAdmin_EventChannel',
+ 'CosEventChannelAdmin_ProxyPullConsumer',
+ 'CosEventChannelAdmin_ProxyPullSupplier',
+ 'CosEventChannelAdmin_ProxyPushConsumer',
+ 'CosEventChannelAdmin_ProxyPushSupplier',
+ 'CosEventChannelAdmin_SupplierAdmin',
+ oe_CosEventComm_CAdmin, oe_CosEventComm_Channel,
+ oe_CosEventComm_Event, oe_CosEventComm_PullerS,
+ oe_CosEventComm_PusherS, 'CosEventComm_PullConsumer',
+ 'CosEventComm_PullSupplier',
+ 'CosEventComm_PushConsumer',
'CosEventComm_PushSupplier'].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%-----------------------------------------------------------------
%% Init and cleanup functions.
%%-----------------------------------------------------------------
@@ -105,7 +128,7 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/cosEvent/vsn.mk b/lib/cosEvent/vsn.mk
index 9c00a17100..38999db5fa 100644
--- a/lib/cosEvent/vsn.mk
+++ b/lib/cosEvent/vsn.mk
@@ -1 +1,3 @@
-COSEVENT_VSN = 2.1.9
+
+COSEVENT_VSN = 2.1.10
+
diff --git a/lib/cosEventDomain/doc/src/CosEventDomainAdmin.xml b/lib/cosEventDomain/doc/src/CosEventDomainAdmin.xml
index d0aac961d7..60f26dda96 100644
--- a/lib/cosEventDomain/doc/src/CosEventDomainAdmin.xml
+++ b/lib/cosEventDomain/doc/src/CosEventDomainAdmin.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2002</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosEventDomain/doc/src/CosEventDomainAdmin_EventDomainFactory.xml b/lib/cosEventDomain/doc/src/CosEventDomainAdmin_EventDomainFactory.xml
index 0720a4b930..ea605f23a0 100644
--- a/lib/cosEventDomain/doc/src/CosEventDomainAdmin_EventDomainFactory.xml
+++ b/lib/cosEventDomain/doc/src/CosEventDomainAdmin_EventDomainFactory.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2001</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosEventDomain/doc/src/cosEventDomainApp.xml b/lib/cosEventDomain/doc/src/cosEventDomainApp.xml
index fe8df55929..e7704b90b5 100644
--- a/lib/cosEventDomain/doc/src/cosEventDomainApp.xml
+++ b/lib/cosEventDomain/doc/src/cosEventDomainApp.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2001</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosEventDomain/doc/src/notes.xml b/lib/cosEventDomain/doc/src/notes.xml
index deb1985c86..522dcea829 100644
--- a/lib/cosEventDomain/doc/src/notes.xml
+++ b/lib/cosEventDomain/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2001</year><year>2010</year>
+ <year>2001</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -32,7 +32,24 @@
</header>
<section>
+ <title>cosEventDomain 1.1.10</title>
+
+ <section>
+ <title>Improvements and New Features</title>
+ <list type="bulleted">
+ <item>
+ <p>
+ Eliminated Dialyzer warnings when using exit or throw.</p>
+ <p>
+ Own Id: OTP-9050 Aux Id:</p>
+ </item>
+ </list>
+ </section>
+ </section>
+
+ <section>
<title>cosEventDomain 1.1.9</title>
+
<section>
<title>Improvements and New Features</title>
<list type="bulleted">
@@ -44,7 +61,6 @@
</item>
</list>
</section>
-
</section>
<section>
diff --git a/lib/cosEventDomain/src/CosEventDomainAdmin_EventDomain_impl.erl b/lib/cosEventDomain/src/CosEventDomainAdmin_EventDomain_impl.erl
index 0b73100540..f5dd6d5c14 100644
--- a/lib/cosEventDomain/src/CosEventDomainAdmin_EventDomain_impl.erl
+++ b/lib/cosEventDomain/src/CosEventDomainAdmin_EventDomain_impl.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -778,12 +778,17 @@ get_qos(_OE_This, #state{cyclic = Cyclic, diamonds = Diamonds} = State) ->
%%----------------------------------------------------------------------
set_qos(_OE_This, State, NewQoS) ->
QoS = cosEventDomainApp:get_qos(NewQoS),
- set_qos_helper(QoS, State, []).
+ case set_qos_helper(QoS, State, []) of
+ {ok, NewState} ->
+ {reply, ok, NewState};
+ {error, Errors} ->
+ corba:raise(#'CosNotification_UnsupportedQoS'{qos_err = Errors})
+ end.
set_qos_helper([], State, []) ->
- {reply, ok, State};
+ {ok, State}; %{reply, ok, State};
set_qos_helper([], _, Errors) ->
- corba:raise(#'CosNotification_UnsupportedQoS'{qos_err = Errors});
+ {error, Errors};
set_qos_helper([{?DiamondDetection, Diamonds}|T], #state{diamonds = Diamonds} = State,
Errors) ->
set_qos_helper(T, State, Errors);
@@ -828,12 +833,17 @@ set_qos_helper([{?CycleDetection, _}|T], #state{cyclic = Cyclic} = State, Errors
%%----------------------------------------------------------------------
validate_qos(_OE_This, State, WantedQoS) ->
QoS = cosEventDomainApp:get_qos(WantedQoS),
- {reply, {ok, validate_qos_helper(QoS, State, [], [])}, State}.
+ case validate_qos_helper(QoS, State, [], []) of
+ {ok, Properties} ->
+ {reply, {ok, Properties}, State};
+ {error, Errors} ->
+ corba:raise(#'CosNotification_UnsupportedQoS'{qos_err = Errors})
+ end.
validate_qos_helper([], _, Properties, []) ->
- Properties;
+ {ok, Properties};
validate_qos_helper([], _, _, Errors) ->
- corba:raise(#'CosNotification_UnsupportedQoS'{qos_err = Errors});
+ {error, Errors};
validate_qos_helper([{?DiamondDetection, ?ForbidDiamonds}|T], State, Properties,
Errors) ->
case get_diamonds_helper(State, false) of
diff --git a/lib/cosEventDomain/src/cosEventDomainApp.erl b/lib/cosEventDomain/src/cosEventDomainApp.erl
index d57f51443c..734e4deccb 100644
--- a/lib/cosEventDomain/src/cosEventDomainApp.erl
+++ b/lib/cosEventDomain/src/cosEventDomainApp.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -270,12 +270,17 @@ create_id() ->
get_qos([]) ->
[];
get_qos(Properties) ->
- get_qos(Properties, [], []).
+ case get_qos(Properties, [], []) of
+ {ok, Supported} ->
+ Supported;
+ {error, Unsupported} ->
+ corba:raise(#'CosNotification_UnsupportedQoS'{qos_err = Unsupported})
+ end.
get_qos([], Supported, []) ->
- Supported;
+ {ok, Supported};
get_qos([], _, Unsupported) ->
- corba:raise(#'CosNotification_UnsupportedQoS'{qos_err = Unsupported});
+ {error, Unsupported};
get_qos([#'CosNotification_Property'{name = ?CycleDetection,
value= #any{value = ?AuthorizeCycles}}|T],
Supported, Unsupported) ->
diff --git a/lib/cosEventDomain/test/Makefile b/lib/cosEventDomain/test/Makefile
index 9893b05b8c..160c8565e8 100644
--- a/lib/cosEventDomain/test/Makefile
+++ b/lib/cosEventDomain/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2001-2009. All Rights Reserved.
+# Copyright Ericsson AB 2001-2011. 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
@@ -34,6 +34,7 @@ RELSYSDIR = $(RELEASE_PATH)/cosEventDomain_test
# Target Specs
# ----------------------------------------------------
TEST_SPEC_FILE = cosEventDomain.spec
+COVER_FILE = cosEventDomain.cover
MODULES = \
@@ -99,6 +100,6 @@ release_docs_spec:
release_tests_spec: tests
$(INSTALL_DIR) $(RELSYSDIR)
$(INSTALL_DATA) $(TEST_SPEC_FILE) \
- $(ERL_FILES) $(RELSYSDIR)
+ $(COVER_FILE) $(ERL_FILES) $(RELSYSDIR)
$(INSTALL_DATA) $(SUITE_TARGET_FILES) $(RELSYSDIR)
diff --git a/lib/cosEventDomain/test/cosEventDomain.cover b/lib/cosEventDomain/test/cosEventDomain.cover
new file mode 100644
index 0000000000..f87f6d97bf
--- /dev/null
+++ b/lib/cosEventDomain/test/cosEventDomain.cover
@@ -0,0 +1,2 @@
+{incl_app,cosEventDomain,details}.
+
diff --git a/lib/cosEventDomain/test/cosEventDomain.spec b/lib/cosEventDomain/test/cosEventDomain.spec
index 0d3e307071..bcee74c5f1 100644
--- a/lib/cosEventDomain/test/cosEventDomain.spec
+++ b/lib/cosEventDomain/test/cosEventDomain.spec
@@ -1,19 +1 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2001-2010. 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%
-%%
-{topcase, {dir, "../cosEventDomain_test"}}.
+{suites,"../cosEventDomain_test",all}.
diff --git a/lib/cosEventDomain/test/event_domain_SUITE.erl b/lib/cosEventDomain/test/event_domain_SUITE.erl
index ddf0af3489..d568708429 100644
--- a/lib/cosEventDomain/test/event_domain_SUITE.erl
+++ b/lib/cosEventDomain/test/event_domain_SUITE.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -22,7 +22,7 @@
-module(event_domain_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
-include_lib("cosNotification/include/CosNotifyChannelAdmin.hrl").
-include_lib("cosNotification/include/CosNotification.hrl").
@@ -56,20 +56,31 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1, event_domain_api/1, event_domain_factory_api/1,
- cases/0, init_all/1, finish_all/1,
- init_per_testcase/2, fin_per_testcase/2, app_test/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ event_domain_api/1, event_domain_factory_api/1,
+ cases/0, init_per_suite/1, end_per_suite/1,
+ init_per_testcase/2, end_per_testcase/2, app_test/1]).
%%-----------------------------------------------------------------
%% Internal exports
%%-----------------------------------------------------------------
-all(doc) -> ["API tests for the cosEventDomain interfaces", ""];
-all(suite) -> {req,
- [mnesia, orber, cosNotification],
- {conf, init_all, cases(), finish_all}}.
-
-cases() ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
[event_domain_api, event_domain_factory_api, app_test].
%%-----------------------------------------------------------------
@@ -81,12 +92,12 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-init_all(Config) when is_list(Config) ->
+init_per_suite(Config) when is_list(Config) ->
mnesia:delete_schema([node()]),
mnesia:create_schema([node()]),
ok = corba:orb_init([{flags, 16#02},
@@ -102,7 +113,7 @@ init_all(Config) when is_list(Config) ->
cosEventDomainApp:start(),
Config.
-finish_all(Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
cosEventDomainApp:stop(),
cosEventDomainApp:uninstall(),
cosNotificationApp:stop(),
diff --git a/lib/cosEventDomain/test/generated_SUITE.erl b/lib/cosEventDomain/test/generated_SUITE.erl
index 6c6996ca79..e8dbafbe75 100644
--- a/lib/cosEventDomain/test/generated_SUITE.erl
+++ b/lib/cosEventDomain/test/generated_SUITE.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -25,7 +25,7 @@
-module(generated_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
-define(default_timeout, ?t:minutes(3)).
@@ -71,12 +71,11 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, init_per_group/2,end_per_group/2]).
%%-----------------------------------------------------------------
%% Internal exports
%%-----------------------------------------------------------------
--export([]).
-compile(export_all).
%%-----------------------------------------------------------------
@@ -84,17 +83,41 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["This suite is for testing IC generated files"];
-all(suite) ->
- ['CosEventDomainAdmin', 'CosEventDomainAdmin_DiamondSeq',
- 'CosEventDomainAdmin_AlreadyExists', 'CosEventDomainAdmin_DomainIDSeq',
- 'CosEventDomainAdmin_Connection', 'CosEventDomainAdmin_ConnectionIDSeq',
- 'CosEventDomainAdmin_ConnectionNotFound', 'CosEventDomainAdmin_CycleCreationForbidden',
- 'CosEventDomainAdmin_CycleSeq', 'CosEventDomainAdmin_DiamondCreationForbidden',
- 'CosEventDomainAdmin_DomainNotFound', 'CosEventDomainAdmin_MemberIDSeq',
- 'CosEventDomainAdmin_RouteSeq', 'CosEventDomainAdmin_EventDomainFactory',
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ ['CosEventDomainAdmin',
+ 'CosEventDomainAdmin_DiamondSeq',
+ 'CosEventDomainAdmin_AlreadyExists',
+ 'CosEventDomainAdmin_DomainIDSeq',
+ 'CosEventDomainAdmin_Connection',
+ 'CosEventDomainAdmin_ConnectionIDSeq',
+ 'CosEventDomainAdmin_ConnectionNotFound',
+ 'CosEventDomainAdmin_CycleCreationForbidden',
+ 'CosEventDomainAdmin_CycleSeq',
+ 'CosEventDomainAdmin_DiamondCreationForbidden',
+ 'CosEventDomainAdmin_DomainNotFound',
+ 'CosEventDomainAdmin_MemberIDSeq',
+ 'CosEventDomainAdmin_RouteSeq',
+ 'CosEventDomainAdmin_EventDomainFactory',
'CosEventDomainAdmin_EventDomain'].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%-----------------------------------------------------------------
%% Init and cleanup functions.
%%-----------------------------------------------------------------
@@ -103,7 +126,7 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/cosEventDomain/vsn.mk b/lib/cosEventDomain/vsn.mk
index bd21133fe5..f4a77ab7a8 100644
--- a/lib/cosEventDomain/vsn.mk
+++ b/lib/cosEventDomain/vsn.mk
@@ -1 +1,3 @@
-COSEVENTDOMAIN_VSN = 1.1.9
+
+COSEVENTDOMAIN_VSN = 1.1.10
+
diff --git a/lib/cosFileTransfer/doc/src/CosFileTransfer_Directory.xml b/lib/cosFileTransfer/doc/src/CosFileTransfer_Directory.xml
index 9499f7019e..af9141b205 100644
--- a/lib/cosFileTransfer/doc/src/CosFileTransfer_Directory.xml
+++ b/lib/cosFileTransfer/doc/src/CosFileTransfer_Directory.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosFileTransfer/doc/src/CosFileTransfer_File.xml b/lib/cosFileTransfer/doc/src/CosFileTransfer_File.xml
index e5050eaffb..bef7cb882f 100644
--- a/lib/cosFileTransfer/doc/src/CosFileTransfer_File.xml
+++ b/lib/cosFileTransfer/doc/src/CosFileTransfer_File.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosFileTransfer/doc/src/CosFileTransfer_VirtualFileSystem.xml b/lib/cosFileTransfer/doc/src/CosFileTransfer_VirtualFileSystem.xml
index a43482eccf..8aa02b2153 100644
--- a/lib/cosFileTransfer/doc/src/CosFileTransfer_VirtualFileSystem.xml
+++ b/lib/cosFileTransfer/doc/src/CosFileTransfer_VirtualFileSystem.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosFileTransfer/test/Makefile b/lib/cosFileTransfer/test/Makefile
index 60f72644bd..b46fb35356 100644
--- a/lib/cosFileTransfer/test/Makefile
+++ b/lib/cosFileTransfer/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2000-2010. All Rights Reserved.
+# Copyright Ericsson AB 2000-2011. 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
@@ -34,6 +34,7 @@ RELSYSDIR = $(RELEASE_PATH)/cosFileTransfer_test
# Target Specs
# ----------------------------------------------------
TEST_SPEC_FILE = cosFileTransfer.spec
+COVER_FILE = cosFileTransfer.cover
IDL_FILES =
@@ -127,6 +128,6 @@ release_docs_spec:
release_tests_spec: tests
$(INSTALL_DIR) $(RELSYSDIR)
$(INSTALL_DATA) $(IDL_FILES) $(TEST_SPEC_FILE) \
- $(ERL_FILES) $(RELSYSDIR)
+ $(COVER_FILE) $(ERL_FILES) $(RELSYSDIR)
$(INSTALL_DATA) $(SUITE_TARGET_FILES) $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
diff --git a/lib/cosFileTransfer/test/cosFileTransfer.cover b/lib/cosFileTransfer/test/cosFileTransfer.cover
new file mode 100644
index 0000000000..063dd66990
--- /dev/null
+++ b/lib/cosFileTransfer/test/cosFileTransfer.cover
@@ -0,0 +1,2 @@
+{incl_app,cosFileTransfer,details}.
+
diff --git a/lib/cosFileTransfer/test/cosFileTransfer.spec b/lib/cosFileTransfer/test/cosFileTransfer.spec
index 80fe919f2a..290b27d048 100644
--- a/lib/cosFileTransfer/test/cosFileTransfer.spec
+++ b/lib/cosFileTransfer/test/cosFileTransfer.spec
@@ -1 +1 @@
-{topcase, {dir, "../cosFileTransfer_test"}}.
+{suites,"../cosFileTransfer_test", all}.
diff --git a/lib/cosFileTransfer/test/fileTransfer_SUITE.erl b/lib/cosFileTransfer/test/fileTransfer_SUITE.erl
index f877e3ceda..e94c307ef8 100644
--- a/lib/cosFileTransfer/test/fileTransfer_SUITE.erl
+++ b/lib/cosFileTransfer/test/fileTransfer_SUITE.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -25,12 +25,10 @@
-module(fileTransfer_SUITE).
-
-
%%--------------- INCLUDES -----------------------------------
-include_lib("cosFileTransfer/src/cosFileTransferApp.hrl").
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%%--------------- DEFINES ------------------------------------
-define(default_timeout, ?t:minutes(20)).
@@ -70,10 +68,11 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1,
+-export([all/0,suite/0,groups/0,
+ init_per_group/2,end_per_group/2,
cases/0,
- init_all/1,
- finish_all/1,
+ init_per_suite/1,
+ end_per_suite/1,
fileIterator_api/1,
fts_ftp_file_api/1,
fts_ftp_file_ssl_api/1,
@@ -82,7 +81,7 @@
fts_native_file_ssl_api/1,
fts_native_dir_api/1,
init_per_testcase/2,
- fin_per_testcase/2,
+ end_per_testcase/2,
install_data/2,
uninstall_data/1,
slave_sup/0,
@@ -93,16 +92,30 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["API tests for the cosFileTransfer interfaces", ""];
-all(suite) -> {req,
- [mnesia, orber],
- {conf, init_all, cases(), finish_all}}.
-
-cases() ->
- [fts_ftp_dir_api, fts_ftp_file_api, fts_ftp_file_ssl_api,
- fts_native_dir_api, fts_native_file_api, fts_native_file_ssl_api,
+suite() ->
+ [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
+ [fts_ftp_dir_api, fts_ftp_file_api,
+ fts_ftp_file_ssl_api, fts_native_dir_api,
+ fts_native_file_api, fts_native_file_ssl_api,
fileIterator_api, app_test].
-
+
%%-----------------------------------------------------------------
%% Init and cleanup functions.
%%-----------------------------------------------------------------
@@ -112,42 +125,47 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-init_all(Config) ->
- orber:jump_start(),
- cosProperty:install(),
- cosProperty:start(),
- Dir = filename:join([code:lib_dir(ssl), "examples", "certs", "etc"]),
- %% Client
- cosFileTransferApp:configure(ssl_client_certfile,
- filename:join([Dir, "client", "cert.pem"])),
- cosFileTransferApp:configure(ssl_client_cacertfile,
- filename:join([Dir, "client", "cacerts.pem"])),
- cosFileTransferApp:configure(ssl_client_verify, 1),
- cosFileTransferApp:configure(ssl_client_depth, 0),
- %% Server
- cosFileTransferApp:configure(ssl_server_certfile,
- filename:join([Dir, "server", "cert.pem"])),
- cosFileTransferApp:configure(ssl_server_cacertfile,
- filename:join([Dir, "server", "cacerts.pem"])),
- cosFileTransferApp:configure(ssl_server_verify, 1),
- cosFileTransferApp:configure(ssl_server_depth, 0),
- crypto:start(),
- ssl:start(),
- cosFileTransferApp:install(),
- cosFileTransferApp:start(),
- if
- is_list(Config) ->
- Config;
- true ->
- exit("Config not a list")
+init_per_suite(Config) ->
+ case code:which(crypto) of
+ Res when is_atom(Res) ->
+ {skip,"Could not start crypto!"};
+ _Else ->
+ orber:jump_start(),
+ cosProperty:install(),
+ cosProperty:start(),
+ Dir = filename:join([code:lib_dir(ssl), "examples", "certs", "etc"]),
+ %% Client
+ cosFileTransferApp:configure(ssl_client_certfile,
+ filename:join([Dir, "client", "cert.pem"])),
+ cosFileTransferApp:configure(ssl_client_cacertfile,
+ filename:join([Dir, "client", "cacerts.pem"])),
+ cosFileTransferApp:configure(ssl_client_verify, 1),
+ cosFileTransferApp:configure(ssl_client_depth, 0),
+ %% Server
+ cosFileTransferApp:configure(ssl_server_certfile,
+ filename:join([Dir, "server", "cert.pem"])),
+ cosFileTransferApp:configure(ssl_server_cacertfile,
+ filename:join([Dir, "server", "cacerts.pem"])),
+ cosFileTransferApp:configure(ssl_server_verify, 1),
+ cosFileTransferApp:configure(ssl_server_depth, 0),
+ crypto:start(),
+ ssl:start(),
+ cosFileTransferApp:install(),
+ cosFileTransferApp:start(),
+ if
+ is_list(Config) ->
+ Config;
+ true ->
+ exit("Config not a list")
+ end
end.
-finish_all(Config) ->
+end_per_suite(Config) ->
ssl:stop(),
crypto:stop(),
cosFileTransferApp:stop(),
diff --git a/lib/cosNotification/doc/src/CosNotification.xml b/lib/cosNotification/doc/src/CosNotification.xml
index 22e9bcb27c..cd965bc46b 100644
--- a/lib/cosNotification/doc/src/CosNotification.xml
+++ b/lib/cosNotification/doc/src/CosNotification.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2002</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosNotification/doc/src/CosNotification_AdminPropertiesAdmin.xml b/lib/cosNotification/doc/src/CosNotification_AdminPropertiesAdmin.xml
index 6e2a102051..57015b3621 100644
--- a/lib/cosNotification/doc/src/CosNotification_AdminPropertiesAdmin.xml
+++ b/lib/cosNotification/doc/src/CosNotification_AdminPropertiesAdmin.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ConsumerAdmin.xml b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ConsumerAdmin.xml
index 2cdb2d54a8..671f68d482 100644
--- a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ConsumerAdmin.xml
+++ b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ConsumerAdmin.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyConsumer.xml b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyConsumer.xml
index 69b1e78b82..8bc182a50c 100644
--- a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyConsumer.xml
+++ b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyConsumer.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyPullConsumer.xml b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyPullConsumer.xml
index 29dc59871d..43818e5238 100644
--- a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyPullConsumer.xml
+++ b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyPullConsumer.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyPullSupplier.xml b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyPullSupplier.xml
index daa0f3cc49..4c0aac7ae6 100644
--- a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyPullSupplier.xml
+++ b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyPullSupplier.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyPushConsumer.xml b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyPushConsumer.xml
index 63d3f53101..697d00ea51 100644
--- a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyPushConsumer.xml
+++ b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyPushConsumer.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyPushSupplier.xml b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyPushSupplier.xml
index 54d100c353..f6fc3a0f7b 100644
--- a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyPushSupplier.xml
+++ b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxyPushSupplier.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxySupplier.xml b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxySupplier.xml
index daf2aab388..81d4de929a 100644
--- a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxySupplier.xml
+++ b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_ProxySupplier.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_SequenceProxyPullConsumer.xml b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_SequenceProxyPullConsumer.xml
index aa9fae47df..4084fd443b 100644
--- a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_SequenceProxyPullConsumer.xml
+++ b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_SequenceProxyPullConsumer.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_SequenceProxyPullSupplier.xml b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_SequenceProxyPullSupplier.xml
index a46c53c9c1..16b093b9aa 100644
--- a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_SequenceProxyPullSupplier.xml
+++ b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_SequenceProxyPullSupplier.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_SequenceProxyPushSupplier.xml b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_SequenceProxyPushSupplier.xml
index 60dfa2c230..f8ce2072e1 100644
--- a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_SequenceProxyPushSupplier.xml
+++ b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_SequenceProxyPushSupplier.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_StructuredProxyPullConsumer.xml b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_StructuredProxyPullConsumer.xml
index 070f9a3b92..0623d2891b 100644
--- a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_StructuredProxyPullConsumer.xml
+++ b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_StructuredProxyPullConsumer.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_StructuredProxyPullSupplier.xml b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_StructuredProxyPullSupplier.xml
index 4a454b224a..0f0bb5d985 100644
--- a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_StructuredProxyPullSupplier.xml
+++ b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_StructuredProxyPullSupplier.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_StructuredProxyPushConsumer.xml b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_StructuredProxyPushConsumer.xml
index db7f1ddb44..7b7a60723e 100644
--- a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_StructuredProxyPushConsumer.xml
+++ b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_StructuredProxyPushConsumer.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_StructuredProxyPushSupplier.xml b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_StructuredProxyPushSupplier.xml
index b2dab10998..ab0a260a4b 100644
--- a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_StructuredProxyPushSupplier.xml
+++ b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_StructuredProxyPushSupplier.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_SupplierAdmin.xml b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_SupplierAdmin.xml
index 0f262accb8..a567463f7d 100644
--- a/lib/cosNotification/doc/src/CosNotifyChannelAdmin_SupplierAdmin.xml
+++ b/lib/cosNotification/doc/src/CosNotifyChannelAdmin_SupplierAdmin.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosNotification/doc/src/CosNotifyComm_NotifyPublish.xml b/lib/cosNotification/doc/src/CosNotifyComm_NotifyPublish.xml
index 427ca87810..2ea19a2dfb 100644
--- a/lib/cosNotification/doc/src/CosNotifyComm_NotifyPublish.xml
+++ b/lib/cosNotification/doc/src/CosNotifyComm_NotifyPublish.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosNotification/doc/src/CosNotifyComm_NotifySubscribe.xml b/lib/cosNotification/doc/src/CosNotifyComm_NotifySubscribe.xml
index 1ed7f860c0..dd8ef713e8 100644
--- a/lib/cosNotification/doc/src/CosNotifyComm_NotifySubscribe.xml
+++ b/lib/cosNotification/doc/src/CosNotifyComm_NotifySubscribe.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosNotification/doc/src/CosNotifyFilter_FilterAdmin.xml b/lib/cosNotification/doc/src/CosNotifyFilter_FilterAdmin.xml
index ebbba8763d..9e0fe693d4 100644
--- a/lib/cosNotification/doc/src/CosNotifyFilter_FilterAdmin.xml
+++ b/lib/cosNotification/doc/src/CosNotifyFilter_FilterAdmin.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosNotification/doc/src/CosNotifyFilter_FilterFactory.xml b/lib/cosNotification/doc/src/CosNotifyFilter_FilterFactory.xml
index c4712e481f..886b5b4729 100644
--- a/lib/cosNotification/doc/src/CosNotifyFilter_FilterFactory.xml
+++ b/lib/cosNotification/doc/src/CosNotifyFilter_FilterFactory.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosNotification/doc/src/notes.xml b/lib/cosNotification/doc/src/notes.xml
index 04c0c2accd..125e25e67e 100644
--- a/lib/cosNotification/doc/src/notes.xml
+++ b/lib/cosNotification/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2000</year><year>2010</year>
+ <year>2000</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -31,6 +31,20 @@
<file>notes.xml</file>
</header>
+ <section><title>cosNotification 1.1.16</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Eliminated Dialyzer warnings when using exit or throw.</p>
+ <p>
+ Own Id: OTP-9050</p>
+ </item>
+ </list>
+ </section>
+</section>
+
<section><title>cosNotification 1.1.15</title>
<section><title>Improvements and New Features</title>
diff --git a/lib/cosNotification/src/CosNotification_Common.erl b/lib/cosNotification/src/CosNotification_Common.erl
index 0e0f1da0d5..af9b2d4368 100644
--- a/lib/cosNotification/src/CosNotification_Common.erl
+++ b/lib/cosNotification/src/CosNotification_Common.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -28,7 +28,6 @@
%%--------------- INCLUDES -----------------------------------
-include_lib("orber/include/corba.hrl").
--include_lib("orber/include/ifr_types.hrl").
%% Application files
-include("CosNotification.hrl").
-include("CosNotifyChannelAdmin.hrl").
@@ -945,14 +944,19 @@ check_limits(LQS, NPR) ->
%% supported.
%%------------------------------------------------------------
validate_event_qos(Wanted, Curr) ->
- v_e_q_helper(Wanted, Curr, []),
- [].
+ case v_e_q_helper(Wanted, Curr, []) of
+ ok ->
+ [];
+ {error, Unsupp} ->
+ corba:raise(#'CosNotification_UnsupportedQoS'{qos_err = Unsupp})
+ end.
+
v_e_q_helper([], _Curr, []) ->
- %% Parsed all and foynd no conflicts.
+ %% Parsed all and found no conflicts.
ok;
v_e_q_helper([], _Curr, Unsupp) ->
%% Not possible to use these requested QoS.
- corba:raise(#'CosNotification_UnsupportedQoS'{qos_err = Unsupp});
+ {error, Unsupp};
%%--- EventReliability ---%%
v_e_q_helper([#'CosNotification_Property'{name=?not_EventReliability,
@@ -1071,30 +1075,38 @@ v_e_q_helper(What, _, _) ->
%% LQS - local representation of QoS.
%% Returns : {NewOMGStyleQoS, NewLocalQoS} | #'CosNotification_UnsupportedQoS'{}
%%------------------------------------------------------------
-set_properties([], Curr, channelAdm, _, [], NewQoS,_,_,LAS) ->
+set_properties(Wanted, Current, Type, Supported, Unsupp, NewQoS, Parent, Childs, LQS) ->
+ case do_set_properties(Wanted, Current, Type, Supported, Unsupp, NewQoS, Parent, Childs, LQS) of
+ {error, Exc} ->
+ corba:raise(Exc);
+ Result ->
+ Result
+ end.
+
+do_set_properties([], Curr, channelAdm, _, [], NewQoS,_,_,LAS) ->
merge_properties(NewQoS, Curr, LAS);
-set_properties([], Curr, _, _, [], NewQoS,_,_,LQS) ->
+do_set_properties([], Curr, _, _, [], NewQoS,_,_,LQS) ->
%% set_local_qos and merge_properties are help functions found at the end of QoS
%% functions.
NewLQS = set_local_qos(NewQoS, LQS),
merge_properties(NewQoS, Curr, NewLQS);
-set_properties([], _, channelAdm, _, Unsupp, _,_,_,_) ->
- corba:raise(#'CosNotification_UnsupportedAdmin'{admin_err = Unsupp});
-set_properties([], _, _, _, Unsupp, _,_,_,_) ->
- corba:raise(#'CosNotification_UnsupportedQoS'{qos_err = Unsupp});
+do_set_properties([], _, channelAdm, _, Unsupp, _,_,_,_) ->
+ {error, #'CosNotification_UnsupportedAdmin'{admin_err = Unsupp}};
+do_set_properties([], _, _, _, Unsupp, _,_,_,_) ->
+ {error, #'CosNotification_UnsupportedQoS'{qos_err = Unsupp}};
-set_properties([Req|Tail], Curr, Type, Supported, Unsupp, NewQoS, Parent, Childs,LQS) ->
+do_set_properties([Req|Tail], Curr, Type, Supported, Unsupp, NewQoS, Parent, Childs,LQS) ->
%% set_values and is_supported are help functions found at the end of QoS
%% functions.
case set_values(is_supported(Supported, Req), Req, Type, Curr, Parent, Childs,LQS) of
{unsupported, U} ->
- set_properties(Tail, Curr, Type, Supported, [U|Unsupp], NewQoS, Parent, Childs,LQS);
+ do_set_properties(Tail, Curr, Type, Supported, [U|Unsupp], NewQoS, Parent, Childs,LQS);
{ok, S, NewLQS} ->
- set_properties(Tail, Curr, Type, Supported, Unsupp, [S|NewQoS], Parent, Childs,NewLQS);
+ do_set_properties(Tail, Curr, Type, Supported, Unsupp, [S|NewQoS], Parent, Childs,NewLQS);
{ok, S} ->
- set_properties(Tail, Curr, Type, Supported, Unsupp, [S|NewQoS], Parent, Childs,LQS);
+ do_set_properties(Tail, Curr, Type, Supported, Unsupp, [S|NewQoS], Parent, Childs,LQS);
ok ->
- set_properties(Tail, Curr, Type, Supported, Unsupp, NewQoS, Parent, Childs,LQS)
+ do_set_properties(Tail, Curr, Type, Supported, Unsupp, NewQoS, Parent, Childs,LQS)
end.
diff --git a/lib/cosNotification/test/Makefile b/lib/cosNotification/test/Makefile
index df8f9e919b..43f73addae 100644
--- a/lib/cosNotification/test/Makefile
+++ b/lib/cosNotification/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1999-2009. All Rights Reserved.
+# Copyright Ericsson AB 1999-2011. 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
@@ -34,6 +34,7 @@ RELSYSDIR = $(RELEASE_PATH)/cosNotification_test
# Target Specs
# ----------------------------------------------------
TEST_SPEC_FILE = cosNotification.spec
+COVER_FILE = cosNotification.cover
IDL_FILES =
@@ -182,7 +183,7 @@ release_docs_spec:
release_tests_spec: tests
$(INSTALL_DIR) $(RELSYSDIR)
$(INSTALL_DATA) $(IDL_FILES) $(TEST_SPEC_FILE) \
- $(ERL_FILES) $(RELSYSDIR)
+ $(COVER_FILE) $(ERL_FILES) $(RELSYSDIR)
$(INSTALL_DIR) $(RELSYSDIR)/$(IDLOUTDIR)
$(INSTALL_DATA) $(GEN_TARGET_FILES) $(GEN_FILES) \
$(RELSYSDIR)/$(IDLOUTDIR)
diff --git a/lib/cosNotification/test/cosNotification.cover b/lib/cosNotification/test/cosNotification.cover
new file mode 100644
index 0000000000..604f313521
--- /dev/null
+++ b/lib/cosNotification/test/cosNotification.cover
@@ -0,0 +1,2 @@
+{incl_app,cosNotification,details}.
+
diff --git a/lib/cosNotification/test/cosNotification.spec b/lib/cosNotification/test/cosNotification.spec
index 8df89e7908..8ec1baca33 100644
--- a/lib/cosNotification/test/cosNotification.spec
+++ b/lib/cosNotification/test/cosNotification.spec
@@ -1,19 +1 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1999-2010. 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%
-%%
-{topcase, {dir, "../cosNotification_test"}}.
+{suites,"../cosNotification_test",all}.
diff --git a/lib/cosNotification/test/eventDB_SUITE.erl b/lib/cosNotification/test/eventDB_SUITE.erl
index 9ddfb3d902..64b8b712a9 100644
--- a/lib/cosNotification/test/eventDB_SUITE.erl
+++ b/lib/cosNotification/test/eventDB_SUITE.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -41,7 +41,7 @@
-include("idl_output/notify_test.hrl").
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%%--------------- DEFINES ------------------------------------
-define(default_timeout, ?t:minutes(20)).
@@ -259,25 +259,37 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1, cases/0, init_all/1, finish_all/1, reorder_api/1, lookup_api/1,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ cases/0, init_per_suite/1, end_per_suite/1, reorder_api/1,
+ lookup_api/1,
discard_api/1, max_events_api/1, gc_api/1, auto_gc_api/1,
start_stop_time_api/1, mapping_filter_api/1, persisten_event_api/1,
- init_per_testcase/2, fin_per_testcase/2]).
+ init_per_testcase/2, end_per_testcase/2]).
%%-----------------------------------------------------------------
%% Func: all/1
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["API tests for the cosNotification interfaces", ""];
-all(suite) -> {req,
- [mnesia, orber],
- {conf, init_all, cases(), finish_all}}.
-
-cases() ->
- [persisten_event_api, start_stop_time_api, mapping_filter_api,
- max_events_api, discard_api, reorder_api, lookup_api, gc_api,
- auto_gc_api].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
+ [persisten_event_api, start_stop_time_api,
+ mapping_filter_api, max_events_api, discard_api,
+ reorder_api, lookup_api, gc_api, auto_gc_api].
@@ -290,12 +302,12 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-init_all(Config) ->
+init_per_suite(Config) ->
Path = code:which(?MODULE),
code:add_pathz(filename:join(filename:dirname(Path), "idl_output")),
orber:jump_start(),
@@ -308,7 +320,7 @@ init_all(Config) ->
exit("Config not a list")
end.
-finish_all(Config) ->
+end_per_suite(Config) ->
Path = code:which(?MODULE),
code:del_path(filename:join(filename:dirname(Path), "idl_output")),
cosTime:stop(),
diff --git a/lib/cosNotification/test/generated_SUITE.erl b/lib/cosNotification/test/generated_SUITE.erl
index 34b84041f0..fcf0d3967a 100644
--- a/lib/cosNotification/test/generated_SUITE.erl
+++ b/lib/cosNotification/test/generated_SUITE.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -25,7 +25,7 @@
-module(generated_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
-define(default_timeout, ?t:minutes(3)).
@@ -71,12 +71,12 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
%%-----------------------------------------------------------------
%% Internal exports
%%-----------------------------------------------------------------
--export([]).
-compile(export_all).
%%-----------------------------------------------------------------
@@ -84,52 +84,110 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["This suite is for testing IC generated files"];
-all(suite) ->
- ['CosNotification', 'CosNotification_AdminPropertiesAdmin',
- 'CosNotification_EventHeader', 'CosNotification_EventType',
- 'CosNotification_FixedEventHeader', 'CosNotification_NamedPropertyRange',
- 'CosNotification_Property', 'CosNotification_PropertyError',
- 'CosNotification_PropertyRange', 'CosNotification_QoSAdmin',
- 'CosNotification_StructuredEvent', 'CosNotification_UnsupportedAdmin',
- 'CosNotification_UnsupportedQoS', 'CosNotification_EventBatch',
- 'CosNotification_EventTypeSeq', 'CosNotification_NamedPropertyRangeSeq',
- 'CosNotification_PropertyErrorSeq', 'CosNotifyChannelAdmin_AdminLimit',
- 'CosNotifyChannelAdmin_AdminNotFound', 'CosNotifyChannelAdmin_ChannelNotFound',
- 'CosNotifyChannelAdmin_ConnectionAlreadyActive', 'CosNotifyChannelAdmin_ConnectionAlreadyInactive',
- 'CosNotifyChannelAdmin_NotConnected', 'CosNotifyChannelAdmin_AdminIDSeq',
- 'CosNotifyChannelAdmin_ChannelIDSeq', 'CosNotifyChannelAdmin_ProxyIDSeq',
- 'CosNotifyFilter_CallbackNotFound', 'CosNotifyFilter_ConstraintExp',
- 'CosNotifyFilter_ConstraintInfo', 'CosNotifyFilter_ConstraintNotFound',
- 'CosNotifyFilter_DuplicateConstraintID', 'CosNotifyFilter_FilterNotFound',
- 'CosNotifyFilter_InvalidConstraint', 'CosNotifyFilter_InvalidGrammar',
- 'CosNotifyFilter_InvalidValue', 'CosNotifyFilter_MappingConstraintInfo',
- 'CosNotifyFilter_MappingConstraintPair', 'CosNotifyFilter_UnsupportedFilterableData',
- 'CosNotifyFilter_CallbackIDSeq', 'CosNotifyFilter_ConstraintExpSeq',
- 'CosNotifyFilter_ConstraintIDSeq', 'CosNotifyFilter_ConstraintInfoSeq',
- 'CosNotifyFilter_FilterIDSeq', 'CosNotifyFilter_MappingConstraintInfoSeq',
- 'CosNotifyFilter_MappingConstraintPairSeq', 'CosNotifyComm_InvalidEventType',
- 'CosNotifyChannelAdmin_ConsumerAdmin', 'CosNotifyChannelAdmin_EventChannel',
- 'CosNotifyChannelAdmin_EventChannelFactory', 'CosNotifyChannelAdmin_ProxyConsumer',
- 'CosNotifyChannelAdmin_ProxyNotFound', 'CosNotifyChannelAdmin_ProxyPullConsumer',
- 'CosNotifyChannelAdmin_ProxyPullSupplier', 'CosNotifyChannelAdmin_ProxyPushConsumer',
- 'CosNotifyChannelAdmin_ProxyPushSupplier', 'CosNotifyChannelAdmin_ProxySupplier',
- 'CosNotifyChannelAdmin_SequenceProxyPullConsumer', 'CosNotifyChannelAdmin_SequenceProxyPullSupplier',
- 'CosNotifyChannelAdmin_SequenceProxyPushConsumer', 'CosNotifyChannelAdmin_SequenceProxyPushSupplier',
- 'CosNotifyChannelAdmin_StructuredProxyPullConsumer', 'CosNotifyChannelAdmin_StructuredProxyPullSupplier',
- 'CosNotifyChannelAdmin_StructuredProxyPushConsumer', 'CosNotifyChannelAdmin_StructuredProxyPushSupplier',
- 'CosNotifyChannelAdmin_SupplierAdmin', 'CosNotifyFilter_Filter',
- 'CosNotifyFilter_FilterAdmin', 'CosNotifyFilter_FilterFactory',
- 'CosNotifyFilter_MappingFilter', 'CosNotifyComm_NotifyPublish',
- 'CosNotifyComm_NotifySubscribe', 'CosNotifyComm_PullConsumer',
- 'CosNotifyComm_PullSupplier', 'CosNotifyComm_PushConsumer',
- 'CosNotifyComm_PushSupplier', 'CosNotifyComm_SequencePullConsumer',
- 'CosNotifyComm_SequencePullSupplier', 'CosNotifyComm_SequencePushConsumer',
- 'CosNotifyComm_SequencePushSupplier', 'CosNotifyComm_StructuredPullConsumer',
- 'CosNotifyComm_StructuredPullSupplier', 'CosNotifyComm_StructuredPushConsumer',
- 'CosNotifyComm_StructuredPushSupplier', 'oe_CosNotificationComm_Event',
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ ['CosNotification',
+ 'CosNotification_AdminPropertiesAdmin',
+ 'CosNotification_EventHeader',
+ 'CosNotification_EventType',
+ 'CosNotification_FixedEventHeader',
+ 'CosNotification_NamedPropertyRange',
+ 'CosNotification_Property',
+ 'CosNotification_PropertyError',
+ 'CosNotification_PropertyRange',
+ 'CosNotification_QoSAdmin',
+ 'CosNotification_StructuredEvent',
+ 'CosNotification_UnsupportedAdmin',
+ 'CosNotification_UnsupportedQoS',
+ 'CosNotification_EventBatch',
+ 'CosNotification_EventTypeSeq',
+ 'CosNotification_NamedPropertyRangeSeq',
+ 'CosNotification_PropertyErrorSeq',
+ 'CosNotifyChannelAdmin_AdminLimit',
+ 'CosNotifyChannelAdmin_AdminNotFound',
+ 'CosNotifyChannelAdmin_ChannelNotFound',
+ 'CosNotifyChannelAdmin_ConnectionAlreadyActive',
+ 'CosNotifyChannelAdmin_ConnectionAlreadyInactive',
+ 'CosNotifyChannelAdmin_NotConnected',
+ 'CosNotifyChannelAdmin_AdminIDSeq',
+ 'CosNotifyChannelAdmin_ChannelIDSeq',
+ 'CosNotifyChannelAdmin_ProxyIDSeq',
+ 'CosNotifyFilter_CallbackNotFound',
+ 'CosNotifyFilter_ConstraintExp',
+ 'CosNotifyFilter_ConstraintInfo',
+ 'CosNotifyFilter_ConstraintNotFound',
+ 'CosNotifyFilter_DuplicateConstraintID',
+ 'CosNotifyFilter_FilterNotFound',
+ 'CosNotifyFilter_InvalidConstraint',
+ 'CosNotifyFilter_InvalidGrammar',
+ 'CosNotifyFilter_InvalidValue',
+ 'CosNotifyFilter_MappingConstraintInfo',
+ 'CosNotifyFilter_MappingConstraintPair',
+ 'CosNotifyFilter_UnsupportedFilterableData',
+ 'CosNotifyFilter_CallbackIDSeq',
+ 'CosNotifyFilter_ConstraintExpSeq',
+ 'CosNotifyFilter_ConstraintIDSeq',
+ 'CosNotifyFilter_ConstraintInfoSeq',
+ 'CosNotifyFilter_FilterIDSeq',
+ 'CosNotifyFilter_MappingConstraintInfoSeq',
+ 'CosNotifyFilter_MappingConstraintPairSeq',
+ 'CosNotifyComm_InvalidEventType',
+ 'CosNotifyChannelAdmin_ConsumerAdmin',
+ 'CosNotifyChannelAdmin_EventChannel',
+ 'CosNotifyChannelAdmin_EventChannelFactory',
+ 'CosNotifyChannelAdmin_ProxyConsumer',
+ 'CosNotifyChannelAdmin_ProxyNotFound',
+ 'CosNotifyChannelAdmin_ProxyPullConsumer',
+ 'CosNotifyChannelAdmin_ProxyPullSupplier',
+ 'CosNotifyChannelAdmin_ProxyPushConsumer',
+ 'CosNotifyChannelAdmin_ProxyPushSupplier',
+ 'CosNotifyChannelAdmin_ProxySupplier',
+ 'CosNotifyChannelAdmin_SequenceProxyPullConsumer',
+ 'CosNotifyChannelAdmin_SequenceProxyPullSupplier',
+ 'CosNotifyChannelAdmin_SequenceProxyPushConsumer',
+ 'CosNotifyChannelAdmin_SequenceProxyPushSupplier',
+ 'CosNotifyChannelAdmin_StructuredProxyPullConsumer',
+ 'CosNotifyChannelAdmin_StructuredProxyPullSupplier',
+ 'CosNotifyChannelAdmin_StructuredProxyPushConsumer',
+ 'CosNotifyChannelAdmin_StructuredProxyPushSupplier',
+ 'CosNotifyChannelAdmin_SupplierAdmin',
+ 'CosNotifyFilter_Filter', 'CosNotifyFilter_FilterAdmin',
+ 'CosNotifyFilter_FilterFactory',
+ 'CosNotifyFilter_MappingFilter',
+ 'CosNotifyComm_NotifyPublish',
+ 'CosNotifyComm_NotifySubscribe',
+ 'CosNotifyComm_PullConsumer',
+ 'CosNotifyComm_PullSupplier',
+ 'CosNotifyComm_PushConsumer',
+ 'CosNotifyComm_PushSupplier',
+ 'CosNotifyComm_SequencePullConsumer',
+ 'CosNotifyComm_SequencePullSupplier',
+ 'CosNotifyComm_SequencePushConsumer',
+ 'CosNotifyComm_SequencePushSupplier',
+ 'CosNotifyComm_StructuredPullConsumer',
+ 'CosNotifyComm_StructuredPullSupplier',
+ 'CosNotifyComm_StructuredPushConsumer',
+ 'CosNotifyComm_StructuredPushSupplier',
+ oe_CosNotificationComm_Event,
'CosNotification_PropertySeq'].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%-----------------------------------------------------------------
%% Init and cleanup functions.
%%-----------------------------------------------------------------
@@ -138,7 +196,7 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/cosNotification/test/grammar_SUITE.erl b/lib/cosNotification/test/grammar_SUITE.erl
index 30aec89e5f..2e63924b93 100644
--- a/lib/cosNotification/test/grammar_SUITE.erl
+++ b/lib/cosNotification/test/grammar_SUITE.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -42,7 +42,7 @@
-include("idl_output/notify_test.hrl").
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%%--------------- DEFINES ------------------------------------
-define(default_timeout, ?t:minutes(20)).
@@ -64,10 +64,11 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1, cases/0, init_all/1, finish_all/1,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ cases/0, init_per_suite/1, end_per_suite/1,
union_api/1, enum_api/1, simple_types_api/1,
components_api/1, positional_api/1, variable_api/1,
- init_per_testcase/2, fin_per_testcase/2]).
+ init_per_testcase/2, end_per_testcase/2]).
-import(cosNotification_Filter, [create_filter/1, eval/2]).
@@ -76,15 +77,25 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["API tests for the cosNotification interfaces", ""];
-all(suite) -> {req,
- [],
- {conf, init_all, cases(), finish_all}}.
-
-cases() ->
- [variable_api, union_api, enum_api, simple_types_api, components_api,
- positional_api].
-
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
+ [variable_api, union_api, enum_api, simple_types_api,
+ components_api, positional_api].
+
%%-----------------------------------------------------------------
%% Init and cleanup functions.
%%-----------------------------------------------------------------
@@ -96,14 +107,14 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Path = code:which(?MODULE),
code:del_path(filename:join(filename:dirname(Path), "idl_output")),
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-init_all(Config) ->
+init_per_suite(Config) ->
Path = code:which(?MODULE),
code:add_pathz(filename:join(filename:dirname(Path), "idl_output")),
if
@@ -113,7 +124,7 @@ init_all(Config) ->
exit("Config not a list")
end.
-finish_all(Config) ->
+end_per_suite(Config) ->
Path = code:which(?MODULE),
code:del_path(filename:join(filename:dirname(Path), "idl_output")),
Config.
diff --git a/lib/cosNotification/test/notification_SUITE.erl b/lib/cosNotification/test/notification_SUITE.erl
index e2c560e4de..876a82d4a5 100644
--- a/lib/cosNotification/test/notification_SUITE.erl
+++ b/lib/cosNotification/test/notification_SUITE.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -40,7 +40,7 @@
-include("idl_output/notify_test.hrl").
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%%--------------- DEFINES ------------------------------------
-define(default_timeout, ?t:minutes(20)).
@@ -123,10 +123,11 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1, cases/0, init_all/1, finish_all/1, qos_api/1, adm_api/1,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2, cases/0,
+ init_per_suite/1, end_per_suite/1, qos_api/1, adm_api/1,
cosevent_api/1, filter_adm_api/1, events_api/1, events2_api/1,
event_qos_api/1, filter_api/1, mapping_filter_api/1, subscription_api/1,
- init_per_testcase/2, fin_per_testcase/2, persistent_max_events_api/1,
+ init_per_testcase/2, end_per_testcase/2, persistent_max_events_api/1,
persistent_timeout_events_api/1, persistent_recover_events_api/1,
app_test/1]).
@@ -137,19 +138,28 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["API tests for the cosNotification interfaces", ""];
-all(suite) -> {req,
- [mnesia, orber],
- {conf, init_all, cases(), finish_all}}.
-
-cases() ->
- [persistent_max_events_api, persistent_timeout_events_api,
- persistent_recover_events_api, mapping_filter_api, filter_api, filter_adm_api,
- event_qos_api, qos_api, adm_api, cosevent_api, subscription_api,
- events_api, events2_api, app_test].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+cases() ->
+ [persistent_max_events_api,
+ persistent_timeout_events_api,
+ persistent_recover_events_api, mapping_filter_api,
+ filter_api, filter_adm_api, event_qos_api, qos_api,
+ adm_api, cosevent_api, subscription_api, events_api,
+ events2_api, app_test].
-
%%-----------------------------------------------------------------
%% Init and cleanup functions.
%%-----------------------------------------------------------------
@@ -161,14 +171,14 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Path = code:which(?MODULE),
code:del_path(filename:join(filename:dirname(Path), "idl_output")),
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-init_all(Config) ->
+init_per_suite(Config) ->
Path = code:which(?MODULE),
code:add_pathz(filename:join(filename:dirname(Path), "idl_output")),
ok = corba:orb_init([{flags, 16#02}, {orber_debug_level, 10}]),
@@ -184,7 +194,7 @@ init_all(Config) ->
exit("Config not a list")
end.
-finish_all(Config) ->
+end_per_suite(Config) ->
cosNotificationApp:stop(),
Path = code:which(?MODULE),
code:del_path(filename:join(filename:dirname(Path), "idl_output")),
diff --git a/lib/cosNotification/test/notify_test_impl.erl b/lib/cosNotification/test/notify_test_impl.erl
index 483610befd..dae7777089 100644
--- a/lib/cosNotification/test/notify_test_impl.erl
+++ b/lib/cosNotification/test/notify_test_impl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2010. 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
diff --git a/lib/cosNotification/vsn.mk b/lib/cosNotification/vsn.mk
index cfd5948dfc..6613385579 100644
--- a/lib/cosNotification/vsn.mk
+++ b/lib/cosNotification/vsn.mk
@@ -1 +1,2 @@
-COSNOTIFICATION_VSN = 1.1.15
+COSNOTIFICATION_VSN = 1.1.16
+
diff --git a/lib/cosProperty/doc/src/CosPropertyService_PropertyNamesIterator.xml b/lib/cosProperty/doc/src/CosPropertyService_PropertyNamesIterator.xml
index 54e29a5c01..1710769661 100644
--- a/lib/cosProperty/doc/src/CosPropertyService_PropertyNamesIterator.xml
+++ b/lib/cosProperty/doc/src/CosPropertyService_PropertyNamesIterator.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosProperty/doc/src/CosPropertyService_PropertySet.xml b/lib/cosProperty/doc/src/CosPropertyService_PropertySet.xml
index 4a2073d88d..2c1671bf77 100644
--- a/lib/cosProperty/doc/src/CosPropertyService_PropertySet.xml
+++ b/lib/cosProperty/doc/src/CosPropertyService_PropertySet.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosProperty/doc/src/CosPropertyService_PropertySetDefFactory.xml b/lib/cosProperty/doc/src/CosPropertyService_PropertySetDefFactory.xml
index 82c04e5573..67aa579e6a 100644
--- a/lib/cosProperty/doc/src/CosPropertyService_PropertySetDefFactory.xml
+++ b/lib/cosProperty/doc/src/CosPropertyService_PropertySetDefFactory.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosProperty/doc/src/CosPropertyService_PropertySetFactory.xml b/lib/cosProperty/doc/src/CosPropertyService_PropertySetFactory.xml
index 06b3d2b26d..3fb4822948 100644
--- a/lib/cosProperty/doc/src/CosPropertyService_PropertySetFactory.xml
+++ b/lib/cosProperty/doc/src/CosPropertyService_PropertySetFactory.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosProperty/doc/src/notes.xml b/lib/cosProperty/doc/src/notes.xml
index 11e6205ee9..540fdce762 100644
--- a/lib/cosProperty/doc/src/notes.xml
+++ b/lib/cosProperty/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2000</year><year>2010</year>
+ <year>2000</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -32,16 +32,28 @@
</header>
<section>
- <title>cosProperty 1.1.12</title>
+ <title>cosProperty 1.1.13</title>
<section>
<title>Improvements and New Features</title>
<list type="bulleted">
<item>
- <p>
- Test suites published.</p>
- <p>
- Own Id: OTP-8543 Aux Id:</p>
+ <p>Eliminated Dialyzer warnings when using exit or throw.</p>
+ <p>Own id: OTP-9050 Aux Id:</p>
+ </item>
+ </list>
+ </section>
+ </section>
+
+ <section>
+ <title>cosProperty 1.1.12</title>
+
+ <section>
+ <title>Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>Test suites published.</p>
+ <p>Own id: OTP-8543 Aux Id:</p>
</item>
</list>
</section>
diff --git a/lib/cosProperty/src/CosPropertyService_PropertySetDefFactory_impl.erl b/lib/cosProperty/src/CosPropertyService_PropertySetDefFactory_impl.erl
index b099026b88..202df42b61 100644
--- a/lib/cosProperty/src/CosPropertyService_PropertySetDefFactory_impl.erl
+++ b/lib/cosProperty/src/CosPropertyService_PropertySetDefFactory_impl.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -152,12 +152,18 @@ create_initial_propertysetdef(_OE_This, State, PropDefs) ->
%% Internal functions
%%======================================================================
evaluate_propertysetdef(SetDefs) ->
- evaluate_propertysetdef(SetDefs, [], []).
+ case evaluate_propertysetdef(SetDefs, [], []) of
+ {ok, NewProperties} ->
+ NewProperties;
+ {error, Exc} ->
+ corba:raise(#'CosPropertyService_MultipleExceptions'{exceptions = Exc})
+ end.
+
evaluate_propertysetdef([], NewProperties, []) ->
%% No exceptions found.
- NewProperties;
+ {ok, NewProperties};
evaluate_propertysetdef([], _, Exc) ->
- corba:raise(#'CosPropertyService_MultipleExceptions'{exceptions = Exc});
+ {error, Exc};
evaluate_propertysetdef([#'CosPropertyService_PropertyDef'
{property_name = Name,
property_value = Value,
diff --git a/lib/cosProperty/src/CosPropertyService_PropertySetFactory_impl.erl b/lib/cosProperty/src/CosPropertyService_PropertySetFactory_impl.erl
index ad3cdb62d4..4bc29b99ac 100644
--- a/lib/cosProperty/src/CosPropertyService_PropertySetFactory_impl.erl
+++ b/lib/cosProperty/src/CosPropertyService_PropertySetFactory_impl.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -153,12 +153,18 @@ create_initial_propertyset(_OE_This, State, Properties) ->
%% Internal functions
%%======================================================================
evaluate_propertyset(Sets) ->
- evaluate_propertyset(Sets, [], []).
+ case evaluate_propertyset(Sets, [], []) of
+ {ok, NewProperties} ->
+ NewProperties;
+ {error, Exc} ->
+ corba:raise(#'CosPropertyService_MultipleExceptions'{exceptions = Exc})
+ end.
+
evaluate_propertyset([], NewProperties, []) ->
%% No exceptions found.
- NewProperties;
+ {ok, NewProperties};
evaluate_propertyset([], _, Exc) ->
- corba:raise(#'CosPropertyService_MultipleExceptions'{exceptions = Exc});
+ {error, Exc};
evaluate_propertyset([#'CosPropertyService_Property'
{property_name = Name,
property_value = Value}|T], X, Exc) ->
diff --git a/lib/cosProperty/test/Makefile b/lib/cosProperty/test/Makefile
index ac0f4e298d..f6e0d0dbba 100644
--- a/lib/cosProperty/test/Makefile
+++ b/lib/cosProperty/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2000-2009. All Rights Reserved.
+# Copyright Ericsson AB 2000-2011. 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
@@ -34,6 +34,7 @@ RELSYSDIR = $(RELEASE_PATH)/cosProperty_test
# Target Specs
# ----------------------------------------------------
TEST_SPEC_FILE = cosProperty.spec
+COVER_FILE = cosProperty.cover
IDL_FILES =
@@ -121,7 +122,7 @@ release_docs_spec:
release_tests_spec: tests
$(INSTALL_DIR) $(RELSYSDIR)
$(INSTALL_DATA) $(IDL_FILES) $(TEST_SPEC_FILE) \
- $(ERL_FILES) $(RELSYSDIR)
+ $(COVER_FILE) $(ERL_FILES) $(RELSYSDIR)
$(INSTALL_DATA) $(SUITE_TARGET_FILES) $(RELSYSDIR)
# $(INSTALL_DIR) $(RELSYSDIR)/$(IDLOUTDIR)
# $(INSTALL_DATA) $(GEN_TARGET_FILES) $(GEN_FILES) \
diff --git a/lib/cosProperty/test/cosProperty.cover b/lib/cosProperty/test/cosProperty.cover
new file mode 100644
index 0000000000..a0f5f17671
--- /dev/null
+++ b/lib/cosProperty/test/cosProperty.cover
@@ -0,0 +1,2 @@
+{incl_app,cosProperty,details}.
+
diff --git a/lib/cosProperty/test/cosProperty.spec b/lib/cosProperty/test/cosProperty.spec
index d3e0001eef..d3d44321c8 100644
--- a/lib/cosProperty/test/cosProperty.spec
+++ b/lib/cosProperty/test/cosProperty.spec
@@ -1,20 +1 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2000-2010. 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%
-%%
-{topcase, {dir, "../cosProperty_test"}}.
-
+{suites,"../cosProperty_test",all}.
diff --git a/lib/cosProperty/test/generated_SUITE.erl b/lib/cosProperty/test/generated_SUITE.erl
index 80a7953949..1007ee2180 100644
--- a/lib/cosProperty/test/generated_SUITE.erl
+++ b/lib/cosProperty/test/generated_SUITE.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -25,7 +25,7 @@
-module(generated_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
-define(default_timeout, ?t:minutes(3)).
@@ -71,12 +71,12 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
%%-----------------------------------------------------------------
%% Internal exports
%%-----------------------------------------------------------------
--export([]).
-compile(export_all).
%%-----------------------------------------------------------------
@@ -84,21 +84,51 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["This suite is for testing IC generated files"];
-all(suite) ->
- ['CosPropertyService_ConflictingProperty', 'CosPropertyService_ConstraintNotSupported',
- 'CosPropertyService_FixedProperty', 'CosPropertyService_InvalidPropertyName',
- 'CosPropertyService_MultipleExceptions', 'CosPropertyService_Properties',
- 'CosPropertyService_Property', 'CosPropertyService_PropertyDef',
- 'CosPropertyService_PropertyDefs', 'CosPropertyService_PropertyException',
- 'CosPropertyService_PropertyExceptions', 'CosPropertyService_PropertyMode',
- 'CosPropertyService_PropertyModes', 'CosPropertyService_PropertyNames',
- 'CosPropertyService_PropertyNotFound', 'CosPropertyService_PropertyTypes',
- 'CosPropertyService_ReadOnlyProperty', 'CosPropertyService_UnsupportedMode',
- 'CosPropertyService_UnsupportedProperty', 'CosPropertyService_UnsupportedTypeCode',
- 'CosPropertyService_PropertyNamesIterator', 'CosPropertyService_PropertiesIterator',
- 'CosPropertyService_PropertySet', 'CosPropertyService_PropertySetDef',
- 'CosPropertyService_PropertySetDefFactory', 'CosPropertyService_PropertySetFactory'].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ ['CosPropertyService_ConflictingProperty',
+ 'CosPropertyService_ConstraintNotSupported',
+ 'CosPropertyService_FixedProperty',
+ 'CosPropertyService_InvalidPropertyName',
+ 'CosPropertyService_MultipleExceptions',
+ 'CosPropertyService_Properties',
+ 'CosPropertyService_Property',
+ 'CosPropertyService_PropertyDef',
+ 'CosPropertyService_PropertyDefs',
+ 'CosPropertyService_PropertyException',
+ 'CosPropertyService_PropertyExceptions',
+ 'CosPropertyService_PropertyMode',
+ 'CosPropertyService_PropertyModes',
+ 'CosPropertyService_PropertyNames',
+ 'CosPropertyService_PropertyNotFound',
+ 'CosPropertyService_PropertyTypes',
+ 'CosPropertyService_ReadOnlyProperty',
+ 'CosPropertyService_UnsupportedMode',
+ 'CosPropertyService_UnsupportedProperty',
+ 'CosPropertyService_UnsupportedTypeCode',
+ 'CosPropertyService_PropertyNamesIterator',
+ 'CosPropertyService_PropertiesIterator',
+ 'CosPropertyService_PropertySet',
+ 'CosPropertyService_PropertySetDef',
+ 'CosPropertyService_PropertySetDefFactory',
+ 'CosPropertyService_PropertySetFactory'].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%-----------------------------------------------------------------
@@ -109,7 +139,7 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/cosProperty/test/property_SUITE.erl b/lib/cosProperty/test/property_SUITE.erl
index 8fed3128ef..f440ffc2a1 100644
--- a/lib/cosProperty/test/property_SUITE.erl
+++ b/lib/cosProperty/test/property_SUITE.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -32,7 +32,7 @@
-include_lib("cosProperty/src/cosProperty.hrl").
-include_lib("cosProperty/include/CosPropertyService.hrl").
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%%--------------- DEFINES ------------------------------------
-define(default_timeout, ?t:minutes(20)).
@@ -86,8 +86,9 @@
%% External exports
%%-----------------------------------------------------------------
%% Fixed exports
--export([all/1, cases/0, init_all/1, finish_all/1,
- init_per_testcase/2, fin_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2, cases/0,
+ init_per_suite/1, end_per_suite/1,
+ init_per_testcase/2, end_per_testcase/2]).
%% Test cases
-export([create_setdef_api/1, create_set_api/1, define_with_mode_api/1,
define_api/1, names_iterator_api/1, properties_iterator_api/1,
@@ -98,16 +99,24 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["API tests for the cosProperty interfaces", ""];
-all(suite) -> {req,
- [mnesia, orber],
- {conf, init_all, cases(), finish_all}}.
-
-cases() ->
- [create_setdef_api, create_set_api, define_with_mode_api, define_api,
- names_iterator_api, properties_iterator_api, app_test].
-
-
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+cases() ->
+ [create_setdef_api, create_set_api,
+ define_with_mode_api, define_api, names_iterator_api,
+ properties_iterator_api, app_test].
%%-----------------------------------------------------------------
%% Init and cleanup functions.
@@ -120,14 +129,14 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Path = code:which(?MODULE),
code:del_path(filename:join(filename:dirname(Path), "idl_output")),
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-init_all(Config) ->
+init_per_suite(Config) ->
Path = code:which(?MODULE),
code:add_pathz(filename:join(filename:dirname(Path), "idl_output")),
orber:jump_start(),
@@ -141,7 +150,7 @@ init_all(Config) ->
exit("Config not a list")
end.
-finish_all(Config) ->
+end_per_suite(Config) ->
Path = code:which(?MODULE),
code:del_path(filename:join(filename:dirname(Path), "idl_output")),
application:stop(cosProperty),
diff --git a/lib/cosProperty/vsn.mk b/lib/cosProperty/vsn.mk
index ca9a7ca77e..deb1eb0450 100644
--- a/lib/cosProperty/vsn.mk
+++ b/lib/cosProperty/vsn.mk
@@ -1 +1,2 @@
-COSPROPERTY_VSN = 1.1.12
+COSPROPERTY_VSN = 1.1.13
+
diff --git a/lib/cosTime/doc/src/CosTime_TIO.xml b/lib/cosTime/doc/src/CosTime_TIO.xml
index 91aa34d8c8..7b955c64e3 100644
--- a/lib/cosTime/doc/src/CosTime_TIO.xml
+++ b/lib/cosTime/doc/src/CosTime_TIO.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosTime/doc/src/CosTime_TimeService.xml b/lib/cosTime/doc/src/CosTime_TimeService.xml
index 9b20f24794..66cfb694e6 100644
--- a/lib/cosTime/doc/src/CosTime_TimeService.xml
+++ b/lib/cosTime/doc/src/CosTime_TimeService.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosTime/doc/src/CosTime_UTO.xml b/lib/cosTime/doc/src/CosTime_UTO.xml
index 73784e50f6..26e6eef978 100644
--- a/lib/cosTime/doc/src/CosTime_UTO.xml
+++ b/lib/cosTime/doc/src/CosTime_UTO.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosTime/doc/src/CosTimerEvent_TimerEventHandler.xml b/lib/cosTime/doc/src/CosTimerEvent_TimerEventHandler.xml
index bc1ef39132..4b2e57642a 100644
--- a/lib/cosTime/doc/src/CosTimerEvent_TimerEventHandler.xml
+++ b/lib/cosTime/doc/src/CosTimerEvent_TimerEventHandler.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosTime/doc/src/CosTimerEvent_TimerEventService.xml b/lib/cosTime/doc/src/CosTimerEvent_TimerEventService.xml
index 90eeb5b2c5..fb3fe747e5 100644
--- a/lib/cosTime/doc/src/CosTimerEvent_TimerEventService.xml
+++ b/lib/cosTime/doc/src/CosTimerEvent_TimerEventService.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosTime/doc/src/cosTime.xml b/lib/cosTime/doc/src/cosTime.xml
index 8bc80f2322..978e048d48 100644
--- a/lib/cosTime/doc/src/cosTime.xml
+++ b/lib/cosTime/doc/src/cosTime.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosTime/doc/src/notes.xml b/lib/cosTime/doc/src/notes.xml
index 40ebf42753..718ca23bc5 100644
--- a/lib/cosTime/doc/src/notes.xml
+++ b/lib/cosTime/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2000</year><year>2010</year>
+ <year>2000</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -33,6 +33,22 @@
</header>
<section>
+ <title>cosTime 1.1.10</title>
+
+ <section>
+ <title>Improvements and New Features</title>
+ <list type="bulleted">
+ <item>
+ <p>
+ Eliminated Dialyzer warnings when using exit or throw.</p>
+ <p>
+ Own Id: OTP-9050 Aux Id:</p>
+ </item>
+ </list>
+ </section>
+ </section>
+
+ <section>
<title>cosTime 1.1.9</title>
<section>
diff --git a/lib/cosTime/src/cosTime.erl b/lib/cosTime/src/cosTime.erl
index f4e67570ad..f7d03650af 100644
--- a/lib/cosTime/src/cosTime.erl
+++ b/lib/cosTime/src/cosTime.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -71,29 +71,39 @@
%%------------------------------------------------------------
install_time() ->
- install_loop(?IDL_TIME_MODULES,[]).
+ case install_loop(?IDL_TIME_MODULES,[]) of
+ ok ->
+ ok;
+ {error, Reason} ->
+ exit(Reason)
+ end.
install_timerevent() ->
- install_loop(?IDL_TIMEREVENT_MODULES,[]).
+ case install_loop(?IDL_TIMEREVENT_MODULES,[]) of
+ ok ->
+ ok;
+ {error, Reason} ->
+ exit(Reason)
+ end.
install_loop([], _) ->
ok;
install_loop([H|T], Accum) ->
case catch H:'oe_register'() of
{'EXIT',{unregistered,App}} ->
- ?write_ErrorMsg("Unable to register '~p'; application ~p not registered.
-Trying to unregister ~p~n", [H,App,Accum]),
+ ?write_ErrorMsg("Unable to register '~p'; application ~p not registered.\n"
+ "Trying to unregister ~p\n", [H,App,Accum]),
uninstall_loop(Accum, {exit, register});
{'EXCEPTION',_} ->
- ?write_ErrorMsg("Unable to register '~p'; propably already registered.
-You are adviced to confirm this.
-Trying to unregister ~p~n", [H,Accum]),
+ ?write_ErrorMsg("Unable to register '~p'; propably already registered.\n"
+ "You are adviced to confirm this.\n"
+ "Trying to unregister ~p\n", [H,Accum]),
uninstall_loop(Accum, {exit, register});
ok ->
install_loop(T, [H|Accum]);
_ ->
- ?write_ErrorMsg("Unable to register '~p'; reason unknown.
-Trying to unregister ~p~n", [H,Accum]),
+ ?write_ErrorMsg("Unable to register '~p'; reason unknown.\n"
+ "Trying to unregister ~p\n", [H,Accum]),
uninstall_loop(Accum, {exit, register})
end.
@@ -105,33 +115,43 @@ Trying to unregister ~p~n", [H,Accum]),
%%------------------------------------------------------------
uninstall_time() ->
- uninstall_loop(lists:reverse(?IDL_TIME_MODULES),ok).
+ case uninstall_loop(lists:reverse(?IDL_TIME_MODULES),ok) of
+ ok ->
+ ok;
+ {error, Reason} ->
+ exit(Reason)
+ end.
uninstall_timerevent() ->
- uninstall_loop(lists:reverse(?IDL_TIMEREVENT_MODULES),ok).
+ case uninstall_loop(lists:reverse(?IDL_TIMEREVENT_MODULES),ok) of
+ ok ->
+ ok;
+ {error, Reason} ->
+ exit(Reason)
+ end.
uninstall_loop([],ok) ->
ok;
uninstall_loop([],{exit, register}) ->
- exit({?MODULE, "oe_register failed"});
+ {error, {?MODULE, "oe_register failed"}};
uninstall_loop([],{exit, unregister}) ->
- exit({?MODULE, "oe_unregister failed"});
+ {error, {?MODULE, "oe_unregister failed"}};
uninstall_loop([],{exit, both}) ->
- exit({?MODULE, "oe_register and, for some of those already registered, oe_unregister failed"});
+ {error, {?MODULE, "oe_register and, for some of those already registered, oe_unregister failed"}};
uninstall_loop([H|T], Status) ->
case catch H:'oe_unregister'() of
ok ->
uninstall_loop(T, Status);
_ when Status == ok ->
- ?write_ErrorMsg("Unable to unregister '~p'; propably already unregistered.
-You are adviced to confirm this.~n",[H]),
+ ?write_ErrorMsg("Unable to unregister '~p'; propably already unregistered.\n"
+ "You are adviced to confirm this.~n",[H]),
uninstall_loop(T, {exit, unregister});
_ ->
- ?write_ErrorMsg("Unable to unregister '~p'; propably already unregistered.
-You are adviced to confirm this.~n",[H]),
+ ?write_ErrorMsg("Unable to unregister '~p'; propably already unregistered.\n"
+ "You are adviced to confirm this.~n",[H]),
uninstall_loop(T, {exit, both})
end.
-
+
%%------------------------------------------------------------
%% function : start/stop
%% Arguments:
diff --git a/lib/cosTime/test/Makefile b/lib/cosTime/test/Makefile
index fde5c4facc..a07b27eecb 100644
--- a/lib/cosTime/test/Makefile
+++ b/lib/cosTime/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2000-2009. All Rights Reserved.
+# Copyright Ericsson AB 2000-2011. 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
@@ -34,6 +34,7 @@ RELSYSDIR = $(RELEASE_PATH)/cosTime_test
# Target Specs
# ----------------------------------------------------
TEST_SPEC_FILE = cosTime.spec
+COVER_FILE = cosTime.cover
IDL_FILES =
@@ -127,7 +128,7 @@ release_docs_spec:
release_tests_spec: tests
$(INSTALL_DIR) $(RELSYSDIR)
$(INSTALL_DATA) $(IDL_FILES) $(TEST_SPEC_FILE) \
- $(ERL_FILES) $(RELSYSDIR)
+ $(COVER_FILE) $(ERL_FILES) $(RELSYSDIR)
$(INSTALL_DATA) $(SUITE_TARGET_FILES) $(RELSYSDIR)
# $(INSTALL_DIR) $(RELSYSDIR)/$(IDLOUTDIR)
# $(INSTALL_DATA) $(GEN_TARGET_FILES) $(GEN_FILES) \
diff --git a/lib/cosTime/test/cosTime.cover b/lib/cosTime/test/cosTime.cover
new file mode 100644
index 0000000000..81a05b8cfd
--- /dev/null
+++ b/lib/cosTime/test/cosTime.cover
@@ -0,0 +1,2 @@
+{incl_app,cosTime,details}.
+
diff --git a/lib/cosTime/test/cosTime.spec b/lib/cosTime/test/cosTime.spec
index 3f50946043..8bf6f740fe 100644
--- a/lib/cosTime/test/cosTime.spec
+++ b/lib/cosTime/test/cosTime.spec
@@ -1,19 +1 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2000-2010. 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%
-%%
-{topcase, {dir, "../cosTime_test"}}.
+{suites,"../cosTime_test",all}.
diff --git a/lib/cosTime/test/generated_SUITE.erl b/lib/cosTime/test/generated_SUITE.erl
index 3a2153528f..119a5e322c 100644
--- a/lib/cosTime/test/generated_SUITE.erl
+++ b/lib/cosTime/test/generated_SUITE.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -25,7 +25,7 @@
-module(generated_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
-define(default_timeout, ?t:minutes(3)).
@@ -71,12 +71,12 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
%%-----------------------------------------------------------------
%% Internal exports
%%-----------------------------------------------------------------
--export([]).
-compile(export_all).
%%-----------------------------------------------------------------
@@ -84,13 +84,31 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["This suite is for testing IC generated files"];
-all(suite) ->
- ['TimeBase_IntervalT', 'TimeBase_UtcT', 'CosTime_TimeUnavailable',
- 'CosTimerEvent_TimerEventT', 'CosTime_TIO', 'CosTime_TimeService',
- 'CosTime_UTO', 'CosTimerEvent_TimerEventHandler',
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ ['TimeBase_IntervalT', 'TimeBase_UtcT',
+ 'CosTime_TimeUnavailable', 'CosTimerEvent_TimerEventT',
+ 'CosTime_TIO', 'CosTime_TimeService', 'CosTime_UTO',
+ 'CosTimerEvent_TimerEventHandler',
'CosTimerEvent_TimerEventService'].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%-----------------------------------------------------------------
%% Init and cleanup functions.
%%-----------------------------------------------------------------
@@ -99,7 +117,7 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/cosTime/test/time_SUITE.erl b/lib/cosTime/test/time_SUITE.erl
index bb00395885..c92095eba5 100644
--- a/lib/cosTime/test/time_SUITE.erl
+++ b/lib/cosTime/test/time_SUITE.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -27,9 +27,9 @@
%%--------------- INCLUDES -----------------------------------
--include("../src/cosTimeApp.hrl").
+-include_lib("cosTime/src/cosTimeApp.hrl").
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%%--------------- DEFINES ------------------------------------
-define(default_timeout, ?t:minutes(20)).
@@ -67,8 +67,9 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1, cases/0, init_all/1, finish_all/1, time_api/1, timerevent_api/1,
- init_per_testcase/2, fin_per_testcase/2,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2, cases/0,
+ init_per_suite/1, end_per_suite/1, time_api/1, timerevent_api/1,
+ init_per_testcase/2, end_per_testcase/2,
app_test/1]).
%%-----------------------------------------------------------------
@@ -76,12 +77,22 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["API tests for the cosTime interfaces", ""];
-all(suite) -> {req,
- [mnesia, orber],
- {conf, init_all, cases(), finish_all}}.
-
-cases() ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
[time_api, timerevent_api, app_test].
@@ -97,14 +108,14 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Path = code:which(?MODULE),
code:del_path(filename:join(filename:dirname(Path), "idl_output")),
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-init_all(Config) ->
+init_per_suite(Config) ->
Path = code:which(?MODULE),
code:add_pathz(filename:join(filename:dirname(Path), "idl_output")),
mnesia:delete_schema([node()]),
@@ -123,7 +134,7 @@ init_all(Config) ->
exit("Config not a list")
end.
-finish_all(Config) ->
+end_per_suite(Config) ->
Path = code:which(?MODULE),
code:del_path(filename:join(filename:dirname(Path), "idl_output")),
cosTime:uninstall_time(),
diff --git a/lib/cosTime/vsn.mk b/lib/cosTime/vsn.mk
index 429613fb61..ebc5aff1cc 100644
--- a/lib/cosTime/vsn.mk
+++ b/lib/cosTime/vsn.mk
@@ -1 +1,2 @@
-COSTIME_VSN = 1.1.9
+COSTIME_VSN = 1.1.10
+
diff --git a/lib/cosTransactions/doc/src/CosTransactions_Control.xml b/lib/cosTransactions/doc/src/CosTransactions_Control.xml
index f4d9a38d13..39cffa1889 100644
--- a/lib/cosTransactions/doc/src/CosTransactions_Control.xml
+++ b/lib/cosTransactions/doc/src/CosTransactions_Control.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1999</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosTransactions/doc/src/CosTransactions_Synchronization.xml b/lib/cosTransactions/doc/src/CosTransactions_Synchronization.xml
index 62d19fe98f..cca0396e33 100644
--- a/lib/cosTransactions/doc/src/CosTransactions_Synchronization.xml
+++ b/lib/cosTransactions/doc/src/CosTransactions_Synchronization.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1999</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosTransactions/doc/src/CosTransactions_Terminator.xml b/lib/cosTransactions/doc/src/CosTransactions_Terminator.xml
index 0a8ebe6975..c4457bcaa7 100644
--- a/lib/cosTransactions/doc/src/CosTransactions_Terminator.xml
+++ b/lib/cosTransactions/doc/src/CosTransactions_Terminator.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1999</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosTransactions/doc/src/CosTransactions_TransactionFactory.xml b/lib/cosTransactions/doc/src/CosTransactions_TransactionFactory.xml
index 181801c574..162e6e8cd1 100644
--- a/lib/cosTransactions/doc/src/CosTransactions_TransactionFactory.xml
+++ b/lib/cosTransactions/doc/src/CosTransactions_TransactionFactory.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1999</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosTransactions/doc/src/cosTransactions.xml b/lib/cosTransactions/doc/src/cosTransactions.xml
index 836506974c..f93004641f 100644
--- a/lib/cosTransactions/doc/src/cosTransactions.xml
+++ b/lib/cosTransactions/doc/src/cosTransactions.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1999</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/cosTransactions/test/Makefile b/lib/cosTransactions/test/Makefile
index 8b1264d404..44c90e8f84 100644
--- a/lib/cosTransactions/test/Makefile
+++ b/lib/cosTransactions/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1999-2009. All Rights Reserved.
+# Copyright Ericsson AB 1999-2011. 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
@@ -38,6 +38,7 @@ RELSYSDIR = $(RELEASE_PATH)/cosTransactions_test
# Target Specs
# ----------------------------------------------------
TEST_SPEC_FILE = cosTransactions.spec
+COVER_FILE = cosTransactions.cover
IDL_FILES = \
@@ -142,7 +143,7 @@ release_docs_spec:
release_tests_spec: tests
$(INSTALL_DIR) $(RELSYSDIR)
$(INSTALL_DATA) $(IDL_FILES) $(TEST_SPEC_FILE) \
- $(ERL_FILES) $(HRL_FILES) $(RELSYSDIR)
+ $(COVER_FILE) $(ERL_FILES) $(HRL_FILES) $(RELSYSDIR)
$(INSTALL_DATA) $(SUITE_TARGET_FILES) $(RELSYSDIR)
$(INSTALL_DIR) $(RELSYSDIR)/$(IDLOUTDIR)
$(INSTALL_DATA) $(GEN_TARGET_FILES) $(GEN_FILES) \
diff --git a/lib/cosTransactions/test/cosTransactions.cover b/lib/cosTransactions/test/cosTransactions.cover
new file mode 100644
index 0000000000..b27bae999d
--- /dev/null
+++ b/lib/cosTransactions/test/cosTransactions.cover
@@ -0,0 +1,2 @@
+{incl_app,cosTransactions,details}.
+
diff --git a/lib/cosTransactions/test/cosTransactions.spec b/lib/cosTransactions/test/cosTransactions.spec
index 8ad9259964..9918c8ca16 100644
--- a/lib/cosTransactions/test/cosTransactions.spec
+++ b/lib/cosTransactions/test/cosTransactions.spec
@@ -1,19 +1 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1999-2010. 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%
-%%
-{topcase, {dir, "../cosTransactions_test"}}.
+{suites,"../cosTransactions_test",all}.
diff --git a/lib/cosTransactions/test/etrap_test_lib.erl b/lib/cosTransactions/test/etrap_test_lib.erl
index 913a94510f..18a1cda35b 100644
--- a/lib/cosTransactions/test/etrap_test_lib.erl
+++ b/lib/cosTransactions/test/etrap_test_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2010. 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
diff --git a/lib/cosTransactions/test/etrap_test_lib.hrl b/lib/cosTransactions/test/etrap_test_lib.hrl
index d488bf9d12..127d803515 100644
--- a/lib/cosTransactions/test/etrap_test_lib.hrl
+++ b/lib/cosTransactions/test/etrap_test_lib.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
diff --git a/lib/cosTransactions/test/generated_SUITE.erl b/lib/cosTransactions/test/generated_SUITE.erl
index cc54eb168e..23ba631b69 100644
--- a/lib/cosTransactions/test/generated_SUITE.erl
+++ b/lib/cosTransactions/test/generated_SUITE.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -26,7 +26,7 @@
-module(generated_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
-define(default_timeout, ?t:minutes(3)).
@@ -72,12 +72,12 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
%%-----------------------------------------------------------------
%% Internal exports
%%-----------------------------------------------------------------
--export([]).
-compile(export_all).
%%-----------------------------------------------------------------
@@ -85,21 +85,49 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["This suite is for testing IC generated files"];
-all(suite) ->
- ['CosTransactions_Control', 'CosTransactions_Coordinator',
- 'CosTransactions_HeuristicCommit', 'CosTransactions_HeuristicHazard',
- 'CosTransactions_HeuristicMixed', 'CosTransactions_HeuristicRollback',
- 'CosTransactions_Inactive', 'CosTransactions_InvalidControl',
- 'CosTransactions_NoTransaction', 'CosTransactions_NotPrepared',
- 'CosTransactions_NotSubtransaction', 'CosTransactions_RecoveryCoordinator',
- 'CosTransactions_Resource', 'CosTransactions_SubtransactionAwareResource',
- 'CosTransactions_SubtransactionsUnavailable', 'CosTransactions_Terminator',
- 'CosTransactions_TransactionFactory', 'CosTransactions_Unavailable',
- 'CosTransactions_SynchronizationUnavailable', 'CosTransactions_TransIdentity',
- 'CosTransactions_PropagationContext', 'CosTransactions_otid_t',
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ ['CosTransactions_Control',
+ 'CosTransactions_Coordinator',
+ 'CosTransactions_HeuristicCommit',
+ 'CosTransactions_HeuristicHazard',
+ 'CosTransactions_HeuristicMixed',
+ 'CosTransactions_HeuristicRollback',
+ 'CosTransactions_Inactive',
+ 'CosTransactions_InvalidControl',
+ 'CosTransactions_NoTransaction',
+ 'CosTransactions_NotPrepared',
+ 'CosTransactions_NotSubtransaction',
+ 'CosTransactions_RecoveryCoordinator',
+ 'CosTransactions_Resource',
+ 'CosTransactions_SubtransactionAwareResource',
+ 'CosTransactions_SubtransactionsUnavailable',
+ 'CosTransactions_Terminator',
+ 'CosTransactions_TransactionFactory',
+ 'CosTransactions_Unavailable',
+ 'CosTransactions_SynchronizationUnavailable',
+ 'CosTransactions_TransIdentity',
+ 'CosTransactions_PropagationContext',
+ 'CosTransactions_otid_t',
'CosTransactions_WrongTransaction', 'ETraP_Server'].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%-----------------------------------------------------------------
%% Init and cleanup functions.
%%-----------------------------------------------------------------
@@ -108,7 +136,7 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/cosTransactions/test/transactions_SUITE.erl b/lib/cosTransactions/test/transactions_SUITE.erl
index 8385d5a0fb..6480b956b3 100644
--- a/lib/cosTransactions/test/transactions_SUITE.erl
+++ b/lib/cosTransactions/test/transactions_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -28,7 +28,7 @@
-include_lib("cosTransactions/include/CosTransactions.hrl").
-include("etrap_test_lib.hrl").
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(default_timeout, ?t:minutes(20)).
@@ -36,20 +36,31 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1, cases/0, init_all/1, finish_all/1, resource_api/1, etrap_api/1,
- init_per_testcase/2, fin_per_testcase/2, app_test/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2, cases/0,
+ init_per_suite/1, end_per_suite/1, resource_api/1, etrap_api/1,
+ init_per_testcase/2, end_per_testcase/2, app_test/1]).
%%-----------------------------------------------------------------
%% Func: all/1
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["API tests for the cosTransactions interfaces", ""];
-all(suite) -> {req,
- [mnesia, orber],
- {conf, init_all, cases(), finish_all}}.
-
-cases() ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
[etrap_api, resource_api, app_test].
@@ -67,7 +78,7 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
'oe_etrap_test':'oe_unregister'(),
'oe_CosTransactions':'oe_unregister'(),
Path = code:which(?MODULE),
@@ -76,7 +87,7 @@ fin_per_testcase(_Case, Config) ->
test_server:timetrap_cancel(Dog),
ok.
-init_all(Config) ->
+init_per_suite(Config) ->
mnesia:delete_schema([node()]),
mnesia:create_schema([node()]),
orber:install([node()]),
@@ -89,7 +100,7 @@ init_all(Config) ->
exit("Config not a list")
end.
-finish_all(Config) ->
+end_per_suite(Config) ->
application:stop(orber),
application:stop(mnesia),
mnesia:delete_schema([node()]),
diff --git a/lib/crypto/c_src/crypto.c b/lib/crypto/c_src/crypto.c
index 92cc2b4dd9..3ebf62d87c 100644
--- a/lib/crypto/c_src/crypto.c
+++ b/lib/crypto/c_src/crypto.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2010. All Rights Reserved.
+ * Copyright Ericsson AB 2010-2011. 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
@@ -62,10 +62,16 @@
# define ERL_VALGRIND_MAKE_MEM_DEFINED(ptr,size) \
VALGRIND_MAKE_MEM_DEFINED(ptr,size)
- # define ERL_VALGRIND_ASSERT_MEM_DEFINED(ptr,size) \
- ((void) ((VALGRIND_CHECK_MEM_IS_DEFINED(ptr,size) == 0) ? 1 : \
- (fprintf(stderr,"\r\n####### VALGRIND_ASSSERT(%p,%ld) failed at %s:%d\r\n",\
- (ptr),(long)(size), __FILE__, __LINE__), abort(), 0)))
+ # define ERL_VALGRIND_ASSERT_MEM_DEFINED(Ptr,Size) \
+ do { \
+ int __erl_valgrind_mem_defined = VALGRIND_CHECK_MEM_IS_DEFINED((Ptr),(Size)); \
+ if (__erl_valgrind_mem_defined != 0) { \
+ fprintf(stderr,"\r\n####### VALGRIND_ASSSERT(%p,%ld) failed at %s:%d\r\n", \
+ (Ptr),(long)(Size), __FILE__, __LINE__); \
+ abort(); \
+ } \
+ } while (0)
+
#else
# define ERL_VALGRIND_MAKE_MEM_DEFINED(ptr,size)
# define ERL_VALGRIND_ASSERT_MEM_DEFINED(ptr,size)
@@ -128,7 +134,9 @@ static ERL_NIF_TERM des_ede3_cbc_crypt(ErlNifEnv* env, int argc, const ERL_NIF_T
static ERL_NIF_TERM aes_cfb_128_crypt(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
static ERL_NIF_TERM aes_ctr_encrypt(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
static ERL_NIF_TERM rand_bytes_1(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
+static ERL_NIF_TERM strong_rand_bytes_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
static ERL_NIF_TERM rand_bytes_3(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
+static ERL_NIF_TERM strong_rand_mpint_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
static ERL_NIF_TERM rand_uniform_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
static ERL_NIF_TERM mod_exp_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
static ERL_NIF_TERM dss_verify(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
@@ -198,7 +206,9 @@ static ErlNifFunc nif_funcs[] = {
{"aes_ctr_encrypt", 3, aes_ctr_encrypt},
{"aes_ctr_decrypt", 3, aes_ctr_encrypt},
{"rand_bytes", 1, rand_bytes_1},
+ {"strong_rand_bytes_nif", 1, strong_rand_bytes_nif},
{"rand_bytes", 3, rand_bytes_3},
+ {"strong_rand_mpint_nif", 3, strong_rand_mpint_nif},
{"rand_uniform_nif", 2, rand_uniform_nif},
{"mod_exp_nif", 3, mod_exp_nif},
{"dss_verify", 4, dss_verify},
@@ -698,6 +708,22 @@ static ERL_NIF_TERM rand_bytes_1(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
ERL_VALGRIND_MAKE_MEM_DEFINED(data, bytes);
return ret;
}
+static ERL_NIF_TERM strong_rand_bytes_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{/* (Bytes) */
+ unsigned bytes;
+ unsigned char* data;
+ ERL_NIF_TERM ret;
+ if (!enif_get_uint(env, argv[0], &bytes)) {
+ return enif_make_badarg(env);
+ }
+ data = enif_make_new_binary(env, bytes, &ret);
+ if ( RAND_bytes(data, bytes) != 1) {
+ return atom_false;
+ }
+ ERL_VALGRIND_MAKE_MEM_DEFINED(data, bytes);
+ return ret;
+}
+
static ERL_NIF_TERM rand_bytes_3(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{/* (Bytes, TopMask, BottomMask) */
unsigned bytes;
@@ -718,6 +744,47 @@ static ERL_NIF_TERM rand_bytes_3(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
}
return ret;
}
+static ERL_NIF_TERM strong_rand_mpint_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{/* (Bytes, TopMask, BottomMask) */
+ unsigned bits;
+ BIGNUM *bn_rand;
+ int top, bottom;
+ unsigned char* data;
+ unsigned dlen;
+ ERL_NIF_TERM ret;
+ if (!enif_get_uint(env, argv[0], &bits)
+ || !enif_get_int(env, argv[1], &top)
+ || !enif_get_int(env, argv[2], &bottom)) {
+ return enif_make_badarg(env);
+ }
+ if (! (top == -1 || top == 0 || top == 1) ) {
+ return enif_make_badarg(env);
+ }
+ if (! (bottom == 0 || bottom == 1) ) {
+ return enif_make_badarg(env);
+ }
+
+ bn_rand = BN_new();
+ if (! bn_rand ) {
+ return enif_make_badarg(env);
+ }
+
+ /* Get a (bits) bit random number */
+ if (!BN_rand(bn_rand, bits, top, bottom)) {
+ ret = atom_false;
+ }
+ else {
+ /* Copy the bignum into an erlang mpint binary. */
+ dlen = BN_num_bytes(bn_rand);
+ data = enif_make_new_binary(env, dlen+4, &ret);
+ put_int32(data, dlen);
+ BN_bn2bin(bn_rand, data+4);
+ ERL_VALGRIND_MAKE_MEM_DEFINED(data+4, dlen);
+ }
+ BN_free(bn_rand);
+
+ return ret;
+}
static int get_bn_from_mpint(ErlNifEnv* env, ERL_NIF_TERM term, BIGNUM** bnp)
{
diff --git a/lib/crypto/doc/src/crypto.xml b/lib/crypto/doc/src/crypto.xml
index c407350c47..1ccea6df79 100644
--- a/lib/crypto/doc/src/crypto.xml
+++ b/lib/crypto/doc/src/crypto.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1999</year><year>2010</year>
+ <year>1999</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -419,16 +419,18 @@ Mpint() = <![CDATA[<<ByteLen:32/integer-big, Bytes:ByteLen/binary>>]]>
<fsummary>Encrypt the first 64 bits of <c>Text</c> using Blowfish in ECB mode</fsummary>
<type>
<v>Key = Text = iolist() | binary()</v>
- <v>IVec = Cipher = binary()</v>
+ <v>Cipher = binary()</v>
</type>
<desc>
<p>Encrypts the first 64 bits of <c>Text</c> using Blowfish in ECB mode. <c>Key</c> is the Blowfish key. The length of <c>Text</c> must be at least 64 bits (8 bytes).</p>
</desc>
+ </func>
+ <func>
<name>blowfish_ecb_decrypt(Key, Text) -> Cipher</name>
<fsummary>Decrypt the first 64 bits of <c>Text</c> using Blowfish in ECB mode</fsummary>
<type>
<v>Key = Text = iolist() | binary()</v>
- <v>IVec = Cipher = binary()</v>
+ <v>Cipher = binary()</v>
</type>
<desc>
<p>Decrypts the first 64 bits of <c>Text</c> using Blowfish in ECB mode. <c>Key</c> is the Blowfish key. The length of <c>Text</c> must be at least 64 bits (8 bytes).</p>
@@ -436,7 +438,7 @@ Mpint() = <![CDATA[<<ByteLen:32/integer-big, Bytes:ByteLen/binary>>]]>
</func>
<func>
- <name>blowfish_cbc_encrypt(Key, Text) -> Cipher</name>
+ <name>blowfish_cbc_encrypt(Key, IVec, Text) -> Cipher</name>
<fsummary>Encrypt <c>Text</c> using Blowfish in CBC mode</fsummary>
<type>
<v>Key = Text = iolist() | binary()</v>
@@ -447,7 +449,9 @@ Mpint() = <![CDATA[<<ByteLen:32/integer-big, Bytes:ByteLen/binary>>]]>
arbitrary initializing vector. The length of <c>IVec</c>
must be 64 bits (8 bytes). The length of <c>Text</c> must be a multiple of 64 bits (8 bytes).</p>
</desc>
- <name>blowfish_cbc_decrypt(Key, Text) -> Cipher</name>
+ </func>
+ <func>
+ <name>blowfish_cbc_decrypt(Key, IVec, Text) -> Cipher</name>
<fsummary>Decrypt <c>Text</c> using Blowfish in CBC mode</fsummary>
<type>
<v>Key = Text = iolist() | binary()</v>
@@ -615,6 +619,21 @@ Mpint() = <![CDATA[<<ByteLen:32/integer-big, Bytes:ByteLen/binary>>]]>
</desc>
</func>
<func>
+ <name>strong_rand_bytes(N) -> binary()</name>
+ <fsummary>Generate a binary of random bytes</fsummary>
+ <type>
+ <v>N = integer()</v>
+ </type>
+ <desc>
+ <p>Generates N bytes randomly uniform 0..255, and returns the
+ result in a binary. Uses a cryptographically secure prng seeded and
+ periodically mixed with operating system provided entropy. By default
+ this is the <c>RAND_bytes</c> method from OpenSSL.</p>
+ <p>May throw exception <c>low_entropy</c> in case the random generator
+ failed due to lack of secure "randomness".</p>
+ </desc>
+ </func>
+ <func>
<name>rand_uniform(Lo, Hi) -> N</name>
<fsummary>Generate a random number</fsummary>
<type>
@@ -629,6 +648,31 @@ Mpint() = <![CDATA[<<ByteLen:32/integer-big, Bytes:ByteLen/binary>>]]>
</desc>
</func>
<func>
+ <name>strong_rand_mpint(N, Top, Bottom) -> Mpint</name>
+ <fsummary>Generate an N bit random number</fsummary>
+ <type>
+ <v>N = non_neg_integer()</v>
+ <v>Top = -1 | 0 | 1</v>
+ <v>Bottom = 0 | 1</v>
+ <v>Mpint = binary()</v>
+ </type>
+ <desc>
+ <p>Generate an N bit random number using OpenSSL's
+ cryptographically strong pseudo random number generator
+ <c>BN_rand</c>.</p>
+ <p>The parameter <c>Top</c> places constraints on the most
+ significant bits of the generated number. If <c>Top</c> is 1, then the
+ two most significant bits will be set to 1, if <c>Top</c> is 0, the
+ most significant bit will be 1, and if <c>Top</c> is -1 then no
+ constraints are applied and thus the generated number may be less than
+ N bits long.</p>
+ <p>If <c>Bottom</c> is 1, then the generated number is
+ constrained to be odd.</p>
+ <p>May throw exception <c>low_entropy</c> in case the random generator
+ failed due to lack of secure "randomness".</p>
+ </desc>
+ </func>
+ <func>
<name>mod_exp(N, P, M) -> Result</name>
<fsummary>Perform N ^ P mod M</fsummary>
<type>
diff --git a/lib/crypto/doc/src/crypto_app.xml b/lib/crypto/doc/src/crypto_app.xml
index bf1d1ae1f7..1c01e3f099 100644
--- a/lib/crypto/doc/src/crypto_app.xml
+++ b/lib/crypto/doc/src/crypto_app.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1999</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/crypto/doc/src/notes.xml b/lib/crypto/doc/src/notes.xml
index 54dd0cb01f..ab1ffa9e5c 100644
--- a/lib/crypto/doc/src/notes.xml
+++ b/lib/crypto/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>1999</year><year>2010</year>
+ <year>1999</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -30,6 +30,36 @@
</header>
<p>This document describes the changes made to the Crypto application.</p>
+<section><title>Crypto 2.0.2.2</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Strengthened random number generation. (Thanks to Geoff Cant)</p>
+ <p>
+ Own Id: OTP-9225</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>Crypto 2.0.2.1</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Misc. Updates.</p>
+ <p>
+ Own Id: OTP-9132</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Crypto 2.0.2</title>
<section><title>Improvements and New Features</title>
diff --git a/lib/crypto/doc/src/release_notes.xml b/lib/crypto/doc/src/release_notes.xml
index 0c2ee23e22..0a84ca1c15 100644
--- a/lib/crypto/doc/src/release_notes.xml
+++ b/lib/crypto/doc/src/release_notes.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1999</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/crypto/src/crypto.erl b/lib/crypto/src/crypto.erl
index d6e2e033c0..cc7b3acc9c 100644
--- a/lib/crypto/src/crypto.erl
+++ b/lib/crypto/src/crypto.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -46,6 +46,7 @@
-export([rsa_private_encrypt/3, rsa_public_decrypt/3]).
-export([dh_generate_key/1, dh_generate_key/2, dh_compute_key/3]).
-export([rand_bytes/1, rand_bytes/3, rand_uniform/2]).
+-export([strong_rand_bytes/1, strong_rand_mpint/3]).
-export([mod_exp/3, mpint/1, erlint/1]).
%% -export([idea_cbc_encrypt/3, idea_cbc_decrypt/3]).
-export([aes_cbc_128_encrypt/3, aes_cbc_128_decrypt/3]).
@@ -68,6 +69,8 @@
des_ede3_cbc_encrypt, des_ede3_cbc_decrypt,
aes_cfb_128_encrypt, aes_cfb_128_decrypt,
rand_bytes,
+ strong_rand_bytes,
+ strong_rand_mpint,
rand_uniform,
mod_exp,
dss_verify,dss_sign,
@@ -361,12 +364,32 @@ aes_cfb_128_crypt(_Key, _IVec, _Data, _IsEncrypt) -> ?nif_stub.
%% RAND - pseudo random numbers using RN_ functions in crypto lib
%%
-spec rand_bytes(non_neg_integer()) -> binary().
+-spec strong_rand_bytes(non_neg_integer()) -> binary().
-spec rand_uniform(crypto_integer(), crypto_integer()) ->
crypto_integer().
+-spec strong_rand_mpint(Bits::non_neg_integer(),
+ Top::-1..1,
+ Bottom::0..1) -> binary().
rand_bytes(_Bytes) -> ?nif_stub.
+
+strong_rand_bytes(Bytes) ->
+ case strong_rand_bytes_nif(Bytes) of
+ false -> erlang:error(low_entropy);
+ Bin -> Bin
+ end.
+strong_rand_bytes_nif(_Bytes) -> ?nif_stub.
+
rand_bytes(_Bytes, _Topmask, _Bottommask) -> ?nif_stub.
+strong_rand_mpint(Bits, Top, Bottom) ->
+ case strong_rand_mpint_nif(Bits,Top,Bottom) of
+ false -> erlang:error(low_entropy);
+ Bin -> Bin
+ end.
+strong_rand_mpint_nif(_Bits, _Top, _Bottom) -> ?nif_stub.
+
+
rand_uniform(From,To) when is_binary(From), is_binary(To) ->
case rand_uniform_nif(From,To) of
<<Len:32/integer, MSB, Rest/binary>> when MSB > 127 ->
diff --git a/lib/crypto/test/Makefile b/lib/crypto/test/Makefile
index e728875027..3150bd472d 100644
--- a/lib/crypto/test/Makefile
+++ b/lib/crypto/test/Makefile
@@ -76,8 +76,8 @@ release_spec:
release_tests_spec: $(TEST_TARGET)
$(INSTALL_DIR) $(RELSYSDIR)
- $(INSTALL_DATA) crypto.spec $(RELTEST_FILES) $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ $(INSTALL_DATA) crypto.spec crypto.cover $(RELTEST_FILES) $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
release_docs_spec:
diff --git a/lib/crypto/test/blowfish_SUITE.erl b/lib/crypto/test/blowfish_SUITE.erl
index d117e7cc3d..a7a2c25467 100644
--- a/lib/crypto/test/blowfish_SUITE.erl
+++ b/lib/crypto/test/blowfish_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
@@ -23,7 +23,7 @@
%% Note: This directive should only be used in test suites.
-compile(export_all).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("test_server_line.hrl").
-define(TIMEOUT, 120000). % 2 min
@@ -45,8 +45,12 @@
%% variable, but should NOT alter/remove any existing entries.
%%--------------------------------------------------------------------
init_per_suite(Config) ->
- crypto:start(),
- Config.
+ case catch crypto:start() of
+ ok ->
+ Config;
+ _Else ->
+ {skip,"Could not start crypto!"}
+ end.
%%--------------------------------------------------------------------
%% Function: end_per_suite(Config) -> _
@@ -100,15 +104,20 @@ end_per_testcase(_TestCase, Config) ->
%% Name of a test case.
%% Description: Returns a list of all test cases in this test suite
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test Blowfish functionality"];
-
-all(suite) ->
- [ecb,
- cbc,
- cfb64,
- ofb64
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+[ecb, cbc, cfb64, ofb64].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% Test cases start here.
%%--------------------------------------------------------------------
diff --git a/lib/crypto/test/crypto.cover b/lib/crypto/test/crypto.cover
new file mode 100644
index 0000000000..61ee372ec5
--- /dev/null
+++ b/lib/crypto/test/crypto.cover
@@ -0,0 +1,2 @@
+{incl_app,crypto,details}.
+
diff --git a/lib/crypto/test/crypto.spec b/lib/crypto/test/crypto.spec
index 7ba5696189..cc09970cb3 100644
--- a/lib/crypto/test/crypto.spec
+++ b/lib/crypto/test/crypto.spec
@@ -1,2 +1 @@
-{topcase, {dir, "../crypto_test"}}.
-
+{suites,"../crypto_test",all}.
diff --git a/lib/crypto/test/crypto_SUITE.erl b/lib/crypto/test/crypto_SUITE.erl
index 19e10081d8..854a8b4485 100644
--- a/lib/crypto/test/crypto_SUITE.erl
+++ b/lib/crypto/test/crypto_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -18,12 +18,11 @@
%%
-module(crypto_SUITE).
--include("test_server.hrl").
--include("test_server_line.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,
+-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,
- fin_per_testcase/2,
+ end_per_testcase/2,
info/1,
link_test/1,
md5/1,
@@ -44,9 +43,10 @@
aes_cfb/1,
aes_cbc/1,
aes_cbc_iter/1,
- aes_ctr/1,
+ aes_ctr/1,
mod_exp_test/1,
rand_uniform_test/1,
+ strong_rand_test/1,
rsa_verify_test/1,
dsa_verify_test/1,
rsa_sign_test/1,
@@ -62,49 +62,42 @@
-export([hexstr2bin/1]).
-all(suite) ->
- [link_test,
- {conf,info,[md5,
- md5_update,
- md4,
- md4_update,
- md5_mac,
- md5_mac_io,
- sha,
- sha_update,
-%% sha256,
-%% sha256_update,
-%% sha512,
-%% sha512_update,
- des_cbc,
- aes_cfb,
- aes_cbc,
- aes_cbc_iter,
- aes_ctr,
- des_cbc_iter,
- des_ecb,
- rand_uniform_test,
- rsa_verify_test,
- dsa_verify_test,
- rsa_sign_test,
- dsa_sign_test,
- rsa_encrypt_decrypt,
- dh,
- exor_test,
- rc4_test,
- rc4_stream_test,
- mod_exp_test,
- blowfish_cfb64,
- smp],
- cleanup}].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [link_test, md5, md5_update, md4, md4_update, md5_mac,
+ md5_mac_io, sha, sha_update,
+ %% sha256, sha256_update, sha512,sha512_update,
+ des_cbc, aes_cfb, aes_cbc,
+ aes_cbc_iter, aes_ctr, des_cbc_iter, des_ecb,
+ rand_uniform_test, strong_rand_test,
+ rsa_verify_test, dsa_verify_test, rsa_sign_test,
+ dsa_sign_test, rsa_encrypt_decrypt, dh, exor_test,
+ rc4_test, rc4_stream_test, mod_exp_test, blowfish_cfb64,
+ smp].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
init_per_testcase(_Name,Config) ->
io:format("init_per_testcase\n"),
?line crypto:start(),
Config.
-fin_per_testcase(_Name,Config) ->
- io:format("fin_per_testcase\n"),
+end_per_testcase(_Name,Config) ->
+ io:format("end_per_testcase\n"),
?line crypto:stop(),
Config.
@@ -719,6 +712,33 @@ rand_uniform_aux_test(N) ->
%%
%%
+strong_rand_test(doc) ->
+ "strong_rand_mpint and strong_random_bytes testing";
+strong_rand_test(suite) ->
+ [];
+strong_rand_test(Config) when is_list(Config) ->
+ strong_rand_aux_test(180),
+ ?line 10 = byte_size(crypto:strong_rand_bytes(10)).
+
+strong_rand_aux_test(0) ->
+ ?line t(crypto:strong_rand_mpint(0,0,0) =:= <<0,0,0,0>>),
+ ok;
+strong_rand_aux_test(1) ->
+ ?line t(crypto:erlint(crypto:strong_rand_mpint(1,0,1)) =:= 1),
+ ?line strong_rand_aux_test(0);
+strong_rand_aux_test(N) ->
+ ?line t(sru_length(crypto:strong_rand_mpint(N,-1,0)) =< N),
+ ?line t(sru_length(crypto:strong_rand_mpint(N,0,0)) =:= N),
+ ?line t(crypto:erlint(crypto:strong_rand_mpint(N,0,1)) band 1 =:= 1),
+ ?line t(crypto:erlint(crypto:strong_rand_mpint(N,1,0)) bsr (N - 2) =:= 2#11),
+ ?line strong_rand_aux_test(N-1).
+
+sru_length(Mpint) ->
+ I = crypto:erlint(Mpint),
+ length(erlang:integer_to_list(I, 2)).
+
+%%
+%%
%%
%%
rsa_verify_test(doc) ->
@@ -1106,7 +1126,7 @@ worker_loop(0, _) ->
ok;
worker_loop(N, Config) ->
Funcs = { md5, md5_update, md5_mac, md5_mac_io, sha, sha_update, des_cbc,
- aes_cfb, aes_cbc, des_cbc_iter, rand_uniform_test,
+ aes_cfb, aes_cbc, des_cbc_iter, rand_uniform_test, strong_rand_test,
rsa_verify_test, exor_test, rc4_test, rc4_stream_test, mod_exp_test },
F = element(random:uniform(size(Funcs)),Funcs),
diff --git a/lib/crypto/vsn.mk b/lib/crypto/vsn.mk
index 4b35c7c0b4..740c68d8fa 100644
--- a/lib/crypto/vsn.mk
+++ b/lib/crypto/vsn.mk
@@ -1 +1 @@
-CRYPTO_VSN = 2.0.2
+CRYPTO_VSN = 2.0.2.2
diff --git a/lib/debugger/doc/src/notes.xml b/lib/debugger/doc/src/notes.xml
index 2f8bdc36a1..3aa169a135 100644
--- a/lib/debugger/doc/src/notes.xml
+++ b/lib/debugger/doc/src/notes.xml
@@ -32,6 +32,21 @@
<p>This document describes the changes made to the Debugger
application.</p>
+<section><title>Debugger 3.2.6</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Fix issues reported by dialyzer.</p>
+ <p>
+ Own Id: OTP-9107</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Debugger 3.2.5</title>
<section><title>Improvements and New Features</title>
diff --git a/lib/debugger/src/dbg_icmd.erl b/lib/debugger/src/dbg_icmd.erl
index a26b16c82d..e9502eaa2b 100644
--- a/lib/debugger/src/dbg_icmd.erl
+++ b/lib/debugger/src/dbg_icmd.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
diff --git a/lib/debugger/src/dbg_ieval.erl b/lib/debugger/src/dbg_ieval.erl
index 476dfd8796..306323f8ea 100644
--- a/lib/debugger/src/dbg_ieval.erl
+++ b/lib/debugger/src/dbg_ieval.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
diff --git a/lib/debugger/src/dbg_iserver.erl b/lib/debugger/src/dbg_iserver.erl
index 59188d83a2..212bc2b8ab 100644
--- a/lib/debugger/src/dbg_iserver.erl
+++ b/lib/debugger/src/dbg_iserver.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
diff --git a/lib/debugger/src/dbg_ui_break_win.erl b/lib/debugger/src/dbg_ui_break_win.erl
index 0c1e25e703..4039bf785f 100644
--- a/lib/debugger/src/dbg_ui_break_win.erl
+++ b/lib/debugger/src/dbg_ui_break_win.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
diff --git a/lib/debugger/src/dbg_ui_filedialog_win.erl b/lib/debugger/src/dbg_ui_filedialog_win.erl
index 79ccf20946..3203991c1f 100644
--- a/lib/debugger/src/dbg_ui_filedialog_win.erl
+++ b/lib/debugger/src/dbg_ui_filedialog_win.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
diff --git a/lib/debugger/src/dbg_ui_mon_win.erl b/lib/debugger/src/dbg_ui_mon_win.erl
index 66e59a822a..52e8f433ba 100644
--- a/lib/debugger/src/dbg_ui_mon_win.erl
+++ b/lib/debugger/src/dbg_ui_mon_win.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
diff --git a/lib/debugger/src/dbg_ui_view.erl b/lib/debugger/src/dbg_ui_view.erl
index 7350a830a8..be998f22ff 100644
--- a/lib/debugger/src/dbg_ui_view.erl
+++ b/lib/debugger/src/dbg_ui_view.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -42,6 +42,9 @@ start(GS, Mod) ->
false -> spawn(fun () -> init(GS, Mod, Title) end)
end.
+-spec stop() -> no_return().
+stop() ->
+ exit(stop).
%%====================================================================
%% Main loop and message handling
@@ -90,7 +93,7 @@ loop(State) ->
dbg_ui_winman:update_windows_menu(Data),
loop(State);
{dbg_ui_winman, destroy} ->
- exit(stop);
+ stop();
%% Help window termination -- ignore
{'EXIT', _Pid, _Reason} ->
@@ -104,7 +107,7 @@ gui_cmd(ignore, State) ->
gui_cmd({win, Win}, State) ->
State#state{win=Win};
gui_cmd(stopped, _State) ->
- exit(stop);
+ stop();
gui_cmd({coords, Coords}, State) ->
State#state{coords=Coords};
@@ -115,8 +118,8 @@ gui_cmd({shortcut, Key}, State) ->
end;
%% File menu
-gui_cmd('Close', State) ->
- gui_cmd(stopped, State);
+gui_cmd('Close', _State) ->
+ stop();
%% Edit menu
gui_cmd('Go To Line...', State) ->
diff --git a/lib/debugger/src/dbg_ui_winman.erl b/lib/debugger/src/dbg_ui_winman.erl
index 398735a7ca..c7aac0df23 100644
--- a/lib/debugger/src/dbg_ui_winman.erl
+++ b/lib/debugger/src/dbg_ui_winman.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
diff --git a/lib/debugger/src/dbg_wx_break_win.erl b/lib/debugger/src/dbg_wx_break_win.erl
index 78733c98c8..7ac82c8fb4 100644
--- a/lib/debugger/src/dbg_wx_break_win.erl
+++ b/lib/debugger/src/dbg_wx_break_win.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
diff --git a/lib/debugger/src/dbg_wx_interpret.erl b/lib/debugger/src/dbg_wx_interpret.erl
index ffcfbcf36b..67bcbb1203 100644
--- a/lib/debugger/src/dbg_wx_interpret.erl
+++ b/lib/debugger/src/dbg_wx_interpret.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
diff --git a/lib/debugger/src/dbg_wx_trace.erl b/lib/debugger/src/dbg_wx_trace.erl
index 6675ea33e7..2fdf39ba5a 100644
--- a/lib/debugger/src/dbg_wx_trace.erl
+++ b/lib/debugger/src/dbg_wx_trace.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
diff --git a/lib/debugger/src/dbg_wx_view.erl b/lib/debugger/src/dbg_wx_view.erl
index 8ff89a4847..6242b9d0e0 100644
--- a/lib/debugger/src/dbg_wx_view.erl
+++ b/lib/debugger/src/dbg_wx_view.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -46,6 +46,9 @@ start(GS, Mod) ->
spawn_link(fun () -> init(GS, Env, Mod, Title) end)
end.
+-spec stop() -> no_return().
+stop() ->
+ exit(normal).
%%====================================================================
%% Main loop and message handling
@@ -113,13 +116,13 @@ loop(State) ->
end.
%%--Commands from the GUI---------------------------------------------
-
+
gui_cmd(ignore, State) ->
State;
gui_cmd({win, Win}, State) ->
State#state{win=Win};
gui_cmd(stopped, _State) ->
- exit(normal);
+ stop();
gui_cmd({coords, Coords}, State) ->
State#state{coords=Coords};
@@ -132,7 +135,7 @@ gui_cmd({shortcut, Key}, State) ->
%% File menu
gui_cmd('Close', State) ->
dbg_wx_trace_win:stop(State#state.win),
- gui_cmd(stopped, State);
+ stop();
%% Edit menu
gui_cmd('Go To Line', State) ->
diff --git a/lib/debugger/src/dbg_wx_winman.erl b/lib/debugger/src/dbg_wx_winman.erl
index d0ddfeb51a..79dcc47f6f 100755
--- a/lib/debugger/src/dbg_wx_winman.erl
+++ b/lib/debugger/src/dbg_wx_winman.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
diff --git a/lib/debugger/src/i.erl b/lib/debugger/src/i.erl
index 476a53482e..4d0b862196 100644
--- a/lib/debugger/src/i.erl
+++ b/lib/debugger/src/i.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
diff --git a/lib/debugger/src/int.erl b/lib/debugger/src/int.erl
index 9ee2102a19..b3a8a07f03 100644
--- a/lib/debugger/src/int.erl
+++ b/lib/debugger/src/int.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
diff --git a/lib/debugger/test/Makefile b/lib/debugger/test/Makefile
index ac929038f7..2296bd0ae6 100644
--- a/lib/debugger/test/Makefile
+++ b/lib/debugger/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1998-2010. All Rights Reserved.
+# Copyright Ericsson AB 1998-2011. 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
@@ -99,8 +99,8 @@ release_spec: opt
release_tests_spec: make_emakefile
$(INSTALL_DIR) $(RELSYSDIR)
$(INSTALL_DATA) $(EMAKEFILE) $(ERL_FILES) $(RELSYSDIR)
- $(INSTALL_DATA) debugger.spec $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ $(INSTALL_DATA) debugger.spec debugger.cover $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
@tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
release_docs_spec:
diff --git a/lib/debugger/test/andor_SUITE.erl b/lib/debugger/test/andor_SUITE.erl
index 3482a22a34..13a6e3da1e 100644
--- a/lib/debugger/test/andor_SUITE.erl
+++ b/lib/debugger/test/andor_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -20,35 +20,50 @@
%%
-module(andor_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,init_all/1,finish_all/1,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_testcase/2,end_per_testcase/2,
+ init_per_suite/1,end_per_suite/1,
t_andalso/1,t_orelse/1,inside/1,overlap/1,
combined/1,in_case/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [{conf,init_all,cases(),finish_all}].
init_per_testcase(_Case, Config) ->
test_lib:interpret(?MODULE),
?line Dog = test_server:timetrap(?t:minutes(1)),
[{watchdog,Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-init_all(Config) when is_list(Config) ->
+init_per_suite(Config) when is_list(Config) ->
?line test_lib:interpret(?MODULE),
?line true = lists:member(?MODULE, int:interpreted()),
- ok.
+ Config.
-finish_all(Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
ok.
-cases() ->
- [t_andalso,t_orelse,inside,overlap,combined,in_case].
+cases() ->
+ [t_andalso, t_orelse, inside, overlap, combined,
+ in_case].
t_andalso(Config) when is_list(Config) ->
Bs = [true,false],
diff --git a/lib/debugger/test/bs_bincomp_SUITE.erl b/lib/debugger/test/bs_bincomp_SUITE.erl
index 8ca2b36f1c..6c2fd255a1 100644
--- a/lib/debugger/test/bs_bincomp_SUITE.erl
+++ b/lib/debugger/test/bs_bincomp_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -23,25 +23,45 @@
-module(bs_bincomp_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
byte_aligned/1,bit_aligned/1,extended_byte_aligned/1,
extended_bit_aligned/1,mixed/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
init_per_testcase(_Case, Config) ->
test_lib:interpret(?MODULE),
Dog = test_server:timetrap(?t:minutes(1)),
[{watchdog,Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-all(suite) ->
- [byte_aligned,bit_aligned,extended_byte_aligned,
- extended_bit_aligned,mixed].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [byte_aligned, bit_aligned, extended_byte_aligned,
+ extended_bit_aligned, mixed].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
byte_aligned(Config) when is_list(Config) ->
diff --git a/lib/debugger/test/bs_construct_SUITE.erl b/lib/debugger/test/bs_construct_SUITE.erl
index efc125c582..5c7d49e951 100644
--- a/lib/debugger/test/bs_construct_SUITE.erl
+++ b/lib/debugger/test/bs_construct_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -19,35 +19,49 @@
-module(bs_construct_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,init_all/1,finish_all/1,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_testcase/2,end_per_testcase/2,
+ init_per_suite/1,end_per_suite/1,
test1/1, test2/1, test3/1, test4/1, test5/1, testf/1, not_used/1, in_guard/1,
coerce_to_float/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
- [{conf,init_all,cases(),finish_all}].
+suite() -> [{ct_hooks,[ts_install_cth]}].
-cases() ->
- [test1, test2, test3, test4, test5, testf,
- not_used, in_guard, coerce_to_float].
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
+ [test1, test2, test3, test4, test5, testf, not_used,
+ in_guard, coerce_to_float].
init_per_testcase(_Case, Config) ->
test_lib:interpret(?MODULE),
Dog = test_server:timetrap(?t:minutes(1)),
[{watchdog,Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-init_all(Config) when is_list(Config) ->
+init_per_suite(Config) when is_list(Config) ->
?line test_lib:interpret(?MODULE),
?line true = lists:member(?MODULE, int:interpreted()),
- ok.
+ Config.
-finish_all(Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
ok.
big(1) ->
diff --git a/lib/debugger/test/bs_match_bin_SUITE.erl b/lib/debugger/test/bs_match_bin_SUITE.erl
index 3966dc41ef..b42b84aef2 100644
--- a/lib/debugger/test/bs_match_bin_SUITE.erl
+++ b/lib/debugger/test/bs_match_bin_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -21,33 +21,47 @@
-module(bs_match_bin_SUITE).
-author('[email protected]').
--export([all/1,init_per_testcase/2,fin_per_testcase/2,init_all/1,finish_all/1,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_testcase/2,end_per_testcase/2,
+ init_per_suite/1,end_per_suite/1,
byte_split_binary/1,bit_split_binary/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
- [{conf,init_all,cases(),finish_all}].
+suite() -> [{ct_hooks,[ts_install_cth]}].
-cases() ->
- [byte_split_binary,bit_split_binary].
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
+ [byte_split_binary, bit_split_binary].
init_per_testcase(_Case, Config) ->
test_lib:interpret(?MODULE),
Dog = test_server:timetrap(?t:minutes(1)),
[{watchdog,Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-init_all(Config) when is_list(Config) ->
+init_per_suite(Config) when is_list(Config) ->
?line test_lib:interpret(?MODULE),
?line true = lists:member(?MODULE, int:interpreted()),
- ok.
+ Config.
-finish_all(Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
ok.
byte_split_binary(doc) -> "Tries to split a binary at all byte-aligned positions.";
diff --git a/lib/debugger/test/bs_match_int_SUITE.erl b/lib/debugger/test/bs_match_int_SUITE.erl
index 1159ac9ef8..745368fdfc 100644
--- a/lib/debugger/test/bs_match_int_SUITE.erl
+++ b/lib/debugger/test/bs_match_int_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -20,35 +20,49 @@
-module(bs_match_int_SUITE).
-author('[email protected]').
--export([all/1,init_per_testcase/2,fin_per_testcase/2,init_all/1,finish_all/1,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_testcase/2,end_per_testcase/2,
+ init_per_suite/1,end_per_suite/1,
integer/1,signed_integer/1,dynamic/1,more_dynamic/1,mml/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-import(lists, [seq/2]).
-all(suite) ->
- [{conf,init_all,cases(),finish_all}].
+suite() -> [{ct_hooks,[ts_install_cth]}].
-cases() ->
- [integer,signed_integer,dynamic,more_dynamic,mml].
+all() ->
+ [cases()].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
+ [integer, signed_integer, dynamic, more_dynamic, mml].
init_per_testcase(_Case, Config) ->
test_lib:interpret(?MODULE),
Dog = test_server:timetrap(?t:minutes(4)),
[{watchdog,Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-init_all(Config) when is_list(Config) ->
+init_per_suite(Config) when is_list(Config) ->
?line test_lib:interpret(?MODULE),
?line true = lists:member(?MODULE, int:interpreted()),
- ok.
+ Config.
-finish_all(Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
ok.
integer(suite) -> [];
diff --git a/lib/debugger/test/bs_match_misc_SUITE.erl b/lib/debugger/test/bs_match_misc_SUITE.erl
index 5e1160a8e9..53d11ba179 100644
--- a/lib/debugger/test/bs_match_misc_SUITE.erl
+++ b/lib/debugger/test/bs_match_misc_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -20,33 +20,47 @@
-module(bs_match_misc_SUITE).
-author('[email protected]').
--export([all/1,init_per_testcase/2,fin_per_testcase/2,init_all/1,finish_all/1,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_testcase/2,end_per_testcase/2,
+ init_per_suite/1,end_per_suite/1,
bound_var/1,bound_tail/1,t_float/1,little_float/1,sean/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
- [{conf,init_all,cases(),finish_all}].
+suite() -> [{ct_hooks,[ts_install_cth]}].
-cases() ->
- [bound_var,bound_tail,t_float,little_float,sean].
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
+ [bound_var, bound_tail, t_float, little_float, sean].
init_per_testcase(_Case, Config) ->
test_lib:interpret(?MODULE),
Dog = test_server:timetrap(?t:minutes(1)),
[{watchdog,Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-init_all(Config) when is_list(Config) ->
+init_per_suite(Config) when is_list(Config) ->
?line test_lib:interpret(?MODULE),
?line true = lists:member(?MODULE, int:interpreted()),
- ok.
+ Config.
-finish_all(Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
ok.
bound_var(doc) -> "Test matching of bound variables.";
diff --git a/lib/debugger/test/bs_match_tail_SUITE.erl b/lib/debugger/test/bs_match_tail_SUITE.erl
index 7fa16b3c6a..961ccbb599 100644
--- a/lib/debugger/test/bs_match_tail_SUITE.erl
+++ b/lib/debugger/test/bs_match_tail_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -20,33 +20,47 @@
-module(bs_match_tail_SUITE).
-author('[email protected]').
--export([all/1,init_per_testcase/2,fin_per_testcase/2,init_all/1,finish_all/1,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_testcase/2,end_per_testcase/2,
+ init_per_suite/1,end_per_suite/1,
aligned/1,unaligned/1,zero_tail/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
- [{conf,init_all,cases(),finish_all}].
+suite() -> [{ct_hooks,[ts_install_cth]}].
-cases() ->
- [aligned,unaligned,zero_tail].
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
+ [aligned, unaligned, zero_tail].
init_per_testcase(_Case, Config) ->
test_lib:interpret(?MODULE),
Dog = test_server:timetrap(?t:minutes(1)),
[{watchdog,Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-init_all(Config) when is_list(Config) ->
+init_per_suite(Config) when is_list(Config) ->
?line test_lib:interpret(?MODULE),
?line true = lists:member(?MODULE, int:interpreted()),
- ok.
+ Config.
-finish_all(Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
ok.
aligned(doc) -> "Test aligned tails.";
diff --git a/lib/debugger/test/bs_utf_SUITE.erl b/lib/debugger/test/bs_utf_SUITE.erl
index 3d69d2a101..7a1d3baaca 100644
--- a/lib/debugger/test/bs_utf_SUITE.erl
+++ b/lib/debugger/test/bs_utf_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -21,37 +21,50 @@
-module(bs_utf_SUITE).
--export([all/1,init_all/1,finish_all/1,
- init_per_testcase/2,fin_per_testcase/2,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_suite/1,end_per_suite/1,
+ init_per_testcase/2,end_per_testcase/2,
utf8_roundtrip/1,unused_utf_char/1,utf16_roundtrip/1,
utf32_roundtrip/1,guard/1,extreme_tripping/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-compile([no_jopt,time]).
-all(suite) ->
- [{conf,init_all,cases(),finish_all}].
+suite() -> [{ct_hooks,[ts_install_cth]}].
-cases() ->
- [utf8_roundtrip,unused_utf_char,utf16_roundtrip,
- utf32_roundtrip,guard,extreme_tripping].
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
+ [utf8_roundtrip, unused_utf_char, utf16_roundtrip,
+ utf32_roundtrip, guard, extreme_tripping].
init_per_testcase(_Case, Config) ->
test_lib:interpret(?MODULE),
Dog = test_server:timetrap(?t:minutes(1)),
[{watchdog,Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-init_all(Config) when is_list(Config) ->
+init_per_suite(Config) when is_list(Config) ->
?line test_lib:interpret(?MODULE),
?line true = lists:member(?MODULE, int:interpreted()),
- ok.
+ Config.
-finish_all(Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
ok.
utf8_roundtrip(Config) when is_list(Config) ->
diff --git a/lib/debugger/test/bug_SUITE.erl b/lib/debugger/test/bug_SUITE.erl
index cf732c8115..a831897dfb 100644
--- a/lib/debugger/test/bug_SUITE.erl
+++ b/lib/debugger/test/bug_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -20,18 +20,34 @@
%%
-module(bug_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1]).
-
--export([ticket_tests/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([otp2163/1, otp4845/1]).
-all(suite) -> [ticket_tests].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, ticket_tests}].
+
+groups() ->
+ [{ticket_tests, [], [otp2163, otp4845]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
-ticket_tests(doc) -> ["Tests tickets regarding bugs"];
-ticket_tests(suite) -> [otp2163, otp4845].
otp2163(doc) -> ["BIF exit reason"];
otp2163(suite) -> [];
diff --git a/lib/debugger/test/cleanup.erl b/lib/debugger/test/cleanup.erl
index 59b4c35ac7..5f1ea71d2e 100644
--- a/lib/debugger/test/cleanup.erl
+++ b/lib/debugger/test/cleanup.erl
@@ -20,11 +20,22 @@
%%
-module(cleanup).
--export([all/1, cleanup/1]).
+-export([all/0,groups/0,init_per_group/2,end_per_group/2, cleanup/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
+
+all() ->
+[cleanup].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) -> {req, [interpreter], [cleanup]}.
cleanup(suite) -> [];
cleanup(_) ->
diff --git a/lib/debugger/test/dbg_ui_SUITE.erl b/lib/debugger/test/dbg_ui_SUITE.erl
index 629aac9fd6..86156ebbf5 100644
--- a/lib/debugger/test/dbg_ui_SUITE.erl
+++ b/lib/debugger/test/dbg_ui_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -21,23 +21,17 @@
-module(dbg_ui_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
% Test server specific exports
--export([all/1]).
--export([function_tests/1]).
-
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
% Test cases must be exported.
-export ([dbg_ui/1]).
-
-
-
-
% Manual test suites/cases exports
--export([manual_tests/1]).
-export([start1/1, interpret1/1, quit1/1,
start2/1, interpret2/1, break2/1, options2/1, quit2/1,
interpret3/1, all_step3/1,all_next3/1,save3/1,restore3/1,finish3/1,
@@ -46,33 +40,42 @@
attach5/1, normal5/1, exit5/1, options5/1,
distsetup6/1, all_step6/1, all_next6/1]).
-
-
-
--export([init_per_testcase/2, fin_per_testcase/2]).
-
-
+-export([init_per_testcase/2, end_per_testcase/2]).
init_per_testcase(_Func, Config) ->
Dog=test_server:timetrap(60*1000),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog).
-all (suite)->
- {req, [debugger], [function_tests, manual_tests]}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [dbg_ui, {group, manual_tests}].
+groups() ->
+ [{manual_tests, [],
+ [start1, interpret1, quit1, start2, interpret2, break2,
+ options2, interpret3, all_step3, all_next3, save3,
+ restore3, finish3, killinit3, killone3, killall3,
+ deleteone3, deleteall3, viewbreak4, delete4, attach5,
+ normal5, exit5, options5, distsetup6, all_step6,
+ all_next6]}].
-function_tests (doc) ->
- ["Tests documented functions"];
+init_per_suite(Config) ->
+ Config.
-function_tests (suite) ->
- [dbg_ui].
+end_per_suite(_Config) ->
+ ok.
+init_per_group(_GroupName, Config) ->
+ Config.
+end_per_group(_GroupName, Config) ->
+ Config.
dbg_ui (doc) ->
["Debugger GUI"];
@@ -84,7 +87,7 @@ dbg_ui (_Config) ->
case os:getenv("DISPLAY") of
false ->
{skipped,"No display"};
- Other when list(Other) ->
+ Other when is_list(Other) ->
% ?line {ok, Pid} = debugger:start (),
% ?line ok = is_pid (Pid),
% ?line true = erlang:is_process_alive(Pid),
@@ -93,11 +96,6 @@ dbg_ui (_Config) ->
{skipped,"Gunilla: Workaround"}
end.
-
-
-
-
-
%% check/2 - returns the result for the specified testcase.
%% pass - means the user has run the case, and it passed
%% fail - means the user has run the case, and it failed
@@ -162,23 +160,6 @@ check(Case, Config) ->
).
-
-
-manual_tests(doc) -> ["Manual tests"];
-manual_tests(suite) -> [start1, interpret1, quit1,
- start2, interpret2, break2, options2,
- interpret3, all_step3,all_next3,save3,restore3,finish3,
- killinit3, killone3, killall3, deleteone3, deleteall3,
- viewbreak4, delete4,
- attach5, normal5, exit5, options5,
- distsetup6, all_step6, all_next6
- ].
-
-
-
-
-
-
%% SET 1
?MAN_CASE(start1, "Start the debugger from the toolbar",
"Before proceeding with the test cases, please move or remove
diff --git a/lib/debugger/test/debugger.cover b/lib/debugger/test/debugger.cover
new file mode 100644
index 0000000000..509ddc0ec1
--- /dev/null
+++ b/lib/debugger/test/debugger.cover
@@ -0,0 +1,2 @@
+{incl_app,debugger,details}.
+
diff --git a/lib/debugger/test/debugger.spec b/lib/debugger/test/debugger.spec
index cc8a5aff37..7aef026e77 100644
--- a/lib/debugger/test/debugger.spec
+++ b/lib/debugger/test/debugger.spec
@@ -1 +1 @@
-{topcase, {dir, "../debugger_test"}}.
+{suites,"../debugger_test",all}.
diff --git a/lib/debugger/test/debugger_SUITE.erl b/lib/debugger/test/debugger_SUITE.erl
index 4bd9057f98..6f5442e97d 100644
--- a/lib/debugger/test/debugger_SUITE.erl
+++ b/lib/debugger/test/debugger_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -22,19 +22,40 @@
%% Test break points.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
app_test/1,erts_debug/1,encrypted_debug_info/1,
no_abstract_code/1]).
-all(suite) ->
- [app_test,erts_debug,no_abstract_code,encrypted_debug_info].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [app_test, erts_debug, no_abstract_code,
+ encrypted_debug_info].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Case, Config) ->
Dog=test_server:timetrap(?t:minutes(0.5)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/debugger/test/erl_eval_SUITE.erl b/lib/debugger/test/erl_eval_SUITE.erl
index fd4d28b2c7..a92251e1af 100644
--- a/lib/debugger/test/erl_eval_SUITE.erl
+++ b/lib/debugger/test/erl_eval_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -17,7 +17,8 @@
%% %CopyrightEnd%
-module(erl_eval_SUITE).
--export([all/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([guard_1/1, guard_2/1,
match_pattern/1,
@@ -57,26 +58,43 @@
config(priv_dir,_) ->
".".
-else.
--include("test_server.hrl").
--export([init_per_testcase/2, fin_per_testcase/2]).
+-include_lib("test_server/include/test_server.hrl").
+-export([init_per_testcase/2, end_per_testcase/2]).
% Default timetrap timeout (set in init_per_testcase).
-define(default_timeout, ?t:minutes(1)).
init_per_testcase(_Case, Config) ->
?line Dog = ?t:timetrap(?default_timeout),
[{watchdog, Dog} | Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-endif.
-all(doc) ->
- ["Test cases for the 'erl_eval' module."];
-all(suite) ->
- [guard_1, guard_2, match_pattern, string_plusplus, pattern_expr,
- match_bin, guard_3, guard_4,
- lc, simple_cases, unary_plus, apply_atom, otp_5269, otp_6539, otp_6543,
- otp_6787, otp_6977, otp_7550, otp_8133, funs, try_catch, eval_expr_5].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [guard_1, guard_2, match_pattern, string_plusplus,
+ pattern_expr, match_bin, guard_3, guard_4, lc,
+ simple_cases, unary_plus, apply_atom, otp_5269,
+ otp_6539, otp_6543, otp_6787, otp_6977, otp_7550,
+ otp_8133, funs, try_catch, eval_expr_5].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
guard_1(doc) ->
["(OTP-2405)"];
diff --git a/lib/debugger/test/exception_SUITE.erl b/lib/debugger/test/exception_SUITE.erl
index a74a93fd22..8c864e4b5f 100644
--- a/lib/debugger/test/exception_SUITE.erl
+++ b/lib/debugger/test/exception_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -20,17 +20,31 @@
%%
-module(exception_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,init_all/1,finish_all/1,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_testcase/2,end_per_testcase/2,
+ init_per_suite/1,end_per_suite/1,
badmatch/1,pending_errors/1,nil_arith/1]).
-export([bad_guy/2]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
- [{conf,init_all,cases(),finish_all}].
+suite() -> [{ct_hooks,[ts_install_cth]}].
-cases() ->
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
[badmatch, pending_errors, nil_arith].
-define(try_match(E),
@@ -42,17 +56,17 @@ init_per_testcase(_Case, Config) ->
Dog = test_server:timetrap(?t:minutes(1)),
[{watchdog,Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-init_all(Config) when is_list(Config) ->
+init_per_suite(Config) when is_list(Config) ->
?line test_lib:interpret(?MODULE),
?line true = lists:member(?MODULE, int:interpreted()),
- ok.
+ Config.
-finish_all(Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
ok.
badmatch(doc) -> "Test that deliberately bad matches are reported correctly.";
diff --git a/lib/debugger/test/fun_SUITE.erl b/lib/debugger/test/fun_SUITE.erl
index 721048b6b6..8103d9c692 100644
--- a/lib/debugger/test/fun_SUITE.erl
+++ b/lib/debugger/test/fun_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -20,20 +20,33 @@
%%
-module(fun_SUITE).
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
init_per_testcase/2,end_per_testcase/2,
- init_all/1,finish_all/1,
+ init_per_suite/1,end_per_suite/1,
good_call/1,bad_apply/1,bad_fun_call/1,badarity/1,
ext_badarity/1,otp_6061/1]).
-export([nothing/0]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
- [{conf,init_all,cases(),finish_all}].
+suite() -> [{ct_hooks,[ts_install_cth]}].
-cases() ->
- [good_call,bad_apply,bad_fun_call,badarity,ext_badarity,otp_6061].
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
+ [good_call, bad_apply, bad_fun_call, badarity,
+ ext_badarity, otp_6061].
init_per_testcase(_Case, Config) ->
test_lib:interpret(?MODULE),
@@ -45,12 +58,12 @@ end_per_testcase(_Case, Config) ->
?t:timetrap_cancel(Dog),
ok.
-init_all(Config) when is_list(Config) ->
+init_per_suite(Config) when is_list(Config) ->
?line test_lib:interpret(?MODULE),
?line true = lists:member(?MODULE, int:interpreted()),
- ok.
+ Config.
-finish_all(Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
ok.
good_call(Config) when is_list(Config) ->
diff --git a/lib/debugger/test/guard_SUITE.erl b/lib/debugger/test/guard_SUITE.erl
index b5269989c8..611dcb4dff 100644
--- a/lib/debugger/test/guard_SUITE.erl
+++ b/lib/debugger/test/guard_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -20,7 +20,9 @@
%%
-module(guard_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,init_all/1,finish_all/1,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_testcase/2,end_per_testcase/2,
+ init_per_suite/1,end_per_suite/1,
bad_arith/1,bad_tuple/1,test_heap_guards/1,guard_bifs/1,
type_tests/1,const_guard/1,
const_cond/1,basic_not/1,complex_not/1,
@@ -35,41 +37,52 @@
basic_andalso_orelse/1,traverse_dcd/1,
check_qlc_hrl/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-export([init/4]).
-import(lists, [member/2]).
-all(suite) ->
- [{conf,init_all,cases(),finish_all}].
+suite() -> [{ct_hooks,[ts_install_cth]}].
-cases() ->
- [bad_arith,bad_tuple,test_heap_guards,guard_bifs,type_tests,const_guard,
- const_cond,basic_not,complex_not,
- semicolon,complex_semicolon,
- comma,or_guard,more_or_guards,
- complex_or_guards,and_guard,
- xor_guard,more_xor_guards,
- build_in_guard,old_guard_tests,gbif,
- t_is_boolean,is_function_2,tricky,rel_ops,
- basic_andalso_orelse,traverse_dcd,check_qlc_hrl].
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
+ [bad_arith, bad_tuple, test_heap_guards, guard_bifs,
+ type_tests, const_guard, const_cond, basic_not,
+ complex_not, semicolon, complex_semicolon, comma,
+ or_guard, more_or_guards, complex_or_guards, and_guard,
+ xor_guard, more_xor_guards, build_in_guard,
+ old_guard_tests, gbif, t_is_boolean, is_function_2,
+ tricky, rel_ops, basic_andalso_orelse, traverse_dcd,
+ check_qlc_hrl].
init_per_testcase(_Case, Config) ->
test_lib:interpret(?MODULE),
?line Dog = test_server:timetrap(?t:minutes(1)),
[{watchdog,Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-init_all(Config) when is_list(Config) ->
+init_per_suite(Config) when is_list(Config) ->
?line test_lib:interpret(?MODULE),
?line true = lists:member(?MODULE, int:interpreted()),
- ok.
+ Config.
-finish_all(Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
ok.
bad_arith(doc) -> "Test that a bad arithmetic operation in a guard works correctly.";
diff --git a/lib/debugger/test/int_SUITE.erl b/lib/debugger/test/int_SUITE.erl
index 0326325888..6e9e81bc52 100644
--- a/lib/debugger/test/int_SUITE.erl
+++ b/lib/debugger/test/int_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -19,15 +19,16 @@
%%
-module(int_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% Test server specific exports
--export([all/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([init_per_testcase/2, end_per_testcase/2]).
%% Test cases
--export([interpret/1, guards/1, list_suite/1, interpretable/1]).
--export([append/1, append_1/1, append_2/1, member/1, reverse/1]).
+-export([interpret/1, guards/1, interpretable/1]).
+-export([ append_1/1, append_2/1, member/1, reverse/1]).
%% Default timetrap timeout (set in init_per_testcase)
-define(default_timeout, ?t:minutes(1)).
@@ -59,8 +60,27 @@ end_per_testcase(_Case, Config) ->
?line test_server:timetrap_cancel(Dog),
?line ok.
-all(suite)->
- [interpret, guards, list_suite, interpretable].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [interpret, guards, {group, list_suite}, interpretable].
+
+groups() ->
+ [{list_suite, [], [{group, append}, reverse, member]},
+ {append, [], [append_1, append_2]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
interpret(suite) ->
[];
@@ -97,13 +117,7 @@ guards(Config) when is_list(Config) ->
ok = guards:guards().
-list_suite(suite) ->
- [append, reverse, member].
-append(doc) ->
- ["Tests lists1:append/1 & lists1:append/2"];
-append(suite) ->
- [append_1, append_2].
append_1(suite) ->
[];
diff --git a/lib/debugger/test/int_break_SUITE.erl b/lib/debugger/test/int_break_SUITE.erl
index b7b3c5598a..159678a1f9 100644
--- a/lib/debugger/test/int_break_SUITE.erl
+++ b/lib/debugger/test/int_break_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -22,15 +22,35 @@
%% Test break points.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
basic/1,cleanup/1]).
-export([auto_attach/1]).
-all(suite) ->
- [basic,cleanup].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [basic, cleanup].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Case, Config) ->
?line DataDir = ?config(data_dir, Config),
@@ -40,7 +60,7 @@ init_per_testcase(_Case, Config) ->
?line Dog = test_server:timetrap(?t:minutes(0.5)),
[{watchdog,Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
?line ok = io:format("Interpreted modules: ~p", [int:interpreted()]),
?line Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
diff --git a/lib/debugger/test/int_eval_SUITE.erl b/lib/debugger/test/int_eval_SUITE.erl
index 1628ca69b1..f36ed213d1 100644
--- a/lib/debugger/test/int_eval_SUITE.erl
+++ b/lib/debugger/test/int_eval_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -22,7 +22,9 @@
%% Purpose: Deeper test of the evaluator.
--export([all/1,init_per_testcase/2, fin_per_testcase/2,
+-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,
bifs_outside_erlang/1, spawning/1, applying/1,
catch_and_throw/1, external_call/1, test_module_info/1,
apply_interpreted_fun/1, apply_uninterpreted_fun/1,
@@ -33,26 +35,41 @@
-define(IM, my_int_eval_module).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
- [bifs_outside_erlang,spawning,applying,catch_and_throw,
- external_call,test_module_info,
- apply_interpreted_fun,apply_uninterpreted_fun,
+suite() -> [{ct_hooks,[ts_install_cth]},
+ {timetrap,{minutes,1}}].
+
+all() ->
+ [bifs_outside_erlang, spawning, applying,
+ catch_and_throw, external_call, test_module_info,
+ apply_interpreted_fun, apply_uninterpreted_fun,
interpreted_exit, otp_8310].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
init_per_testcase(_Case, Config) ->
?line DataDir = ?config(data_dir, Config),
?line {module,?IM} = int:i(filename:join(DataDir, ?IM)),
?line ok = io:format("Interpreted modules: ~p",[int:interpreted()]),
- {ok, Dog} = timer:apply_after(timer:minutes(1),
- erlang, exit, [self(), kill]),
- [{watchdog,Dog}|Config].
+ Config.
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, _Config) ->
ok = io:format("Interpreted modules: ~p", [int:interpreted()]),
- Dog = ?config(watchdog, Config),
- timer:cancel(Dog),
ok.
bifs_outside_erlang(doc) ->
diff --git a/lib/debugger/test/lc_SUITE.erl b/lib/debugger/test/lc_SUITE.erl
index a22a689ec8..92a03ef58e 100644
--- a/lib/debugger/test/lc_SUITE.erl
+++ b/lib/debugger/test/lc_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -21,15 +21,29 @@
-module(lc_SUITE).
-author('[email protected]').
--export([all/1,init_per_testcase/2,fin_per_testcase/2,init_all/1,finish_all/1,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_testcase/2,end_per_testcase/2,
+ init_per_suite/1,end_per_suite/1,
basic/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
- [{conf,init_all,cases(),finish_all}].
+suite() -> [{ct_hooks,[ts_install_cth]}].
-cases() ->
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
[basic].
init_per_testcase(_Case, Config) ->
@@ -37,17 +51,17 @@ init_per_testcase(_Case, Config) ->
Dog = test_server:timetrap(?t:minutes(1)),
[{watchdog,Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-init_all(Config) when is_list(Config) ->
+init_per_suite(Config) when is_list(Config) ->
?line test_lib:interpret(?MODULE),
?line true = lists:member(?MODULE, int:interpreted()),
- ok.
+ Config.
-finish_all(Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
ok.
basic(Config) when list(Config) ->
diff --git a/lib/debugger/test/record_SUITE.erl b/lib/debugger/test/record_SUITE.erl
index 06fd01555e..873bbdb4bc 100644
--- a/lib/debugger/test/record_SUITE.erl
+++ b/lib/debugger/test/record_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -22,33 +22,47 @@
-module(record_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,init_per_testcase/2,fin_per_testcase/2,init_all/1,finish_all/1,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_testcase/2,end_per_testcase/2,
+ init_per_suite/1,end_per_suite/1,
errors/1,record_test/1,eval_once/1]).
-all(suite) ->
- [{conf,init_all,cases(),finish_all}].
+suite() -> [{ct_hooks,[ts_install_cth]}].
-cases() ->
- [errors,record_test,eval_once].
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
+ [errors, record_test, eval_once].
init_per_testcase(_Case, Config) ->
test_lib:interpret(?MODULE),
Dog = test_server:timetrap(?t:minutes(1)),
[{watchdog,Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-init_all(Config) when is_list(Config) ->
+init_per_suite(Config) when is_list(Config) ->
?line test_lib:interpret(?MODULE),
?line true = lists:member(?MODULE, int:interpreted()),
- ok.
+ Config.
-finish_all(Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
ok.
-record(foo, {a,b,c,d}).
diff --git a/lib/debugger/test/trycatch_SUITE.erl b/lib/debugger/test/trycatch_SUITE.erl
index 5901cdc9e5..a87c5db138 100644
--- a/lib/debugger/test/trycatch_SUITE.erl
+++ b/lib/debugger/test/trycatch_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -20,37 +20,51 @@
%%
-module(trycatch_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,init_all/1,finish_all/1,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_testcase/2,end_per_testcase/2,
+ init_per_suite/1,end_per_suite/1,
basic/1,lean_throw/1,try_of/1,try_after/1,%after_bind/1,
catch_oops/1,after_oops/1,eclectic/1,rethrow/1,
nested_of/1,nested_catch/1,nested_after/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
- [{conf,init_all,cases(),finish_all}].
+suite() -> [{ct_hooks,[ts_install_cth]}].
-cases() ->
- [basic,lean_throw,try_of,try_after,%after_bind,
- catch_oops,after_oops,eclectic,rethrow,
- nested_of,nested_catch,nested_after].
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
+ [basic, lean_throw, try_of, try_after, catch_oops,
+ after_oops, eclectic, rethrow, nested_of, nested_catch,
+ nested_after].
init_per_testcase(_Case, Config) ->
test_lib:interpret(?MODULE),
Dog = test_server:timetrap(?t:minutes(1)),
[{watchdog,Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-init_all(Config) when is_list(Config) ->
+init_per_suite(Config) when is_list(Config) ->
?line test_lib:interpret(?MODULE),
?line true = lists:member(?MODULE, int:interpreted()),
- ok.
+ Config.
-finish_all(Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
ok.
basic(Conf) when is_list(Conf) ->
diff --git a/lib/debugger/vsn.mk b/lib/debugger/vsn.mk
index b9786b4a75..0f70dafc19 100644
--- a/lib/debugger/vsn.mk
+++ b/lib/debugger/vsn.mk
@@ -1 +1 @@
-DEBUGGER_VSN = 3.2.5
+DEBUGGER_VSN = 3.2.6
diff --git a/lib/dialyzer/RELEASE_NOTES b/lib/dialyzer/RELEASE_NOTES
index 3fd5e9cc7d..4e311bb543 100644
--- a/lib/dialyzer/RELEASE_NOTES
+++ b/lib/dialyzer/RELEASE_NOTES
@@ -3,6 +3,18 @@
(in reversed chronological order)
==============================================================================
+Version 2.4.2 (in Erlang/OTP R14B02)
+------------------------------------
+ - Added --fullpath option to display files with warnings with their full
+ file names (thanks to Magnus Henoch for the original patch).
+ - Better handling of 'and'/'or'/'not' guards that generate warnings
+ (thanks to Stavros Aronis).
+ - Better blame assignment for cases when a function's spec is erroneous
+ (thanks to Stavros Aronis).
+ - More descriptive warnings when a tuple/record pattern contains subterms
+ that violate the declared types of record fields (thanks to Matthias Lang
+ for the test case and for Stavros Aronis for the actual fix).
+
Version 2.4.0 (in Erlang/OTP R14B01)
------------------------------------
- Added ability to supply multiple PLTs for the analysis (option --plts).
diff --git a/lib/dialyzer/doc/manual.txt b/lib/dialyzer/doc/manual.txt
index cc6f9130c7..d519ac960b 100644
--- a/lib/dialyzer/doc/manual.txt
+++ b/lib/dialyzer/doc/manual.txt
@@ -37,7 +37,7 @@ The parameters are:
The analysis starts from .beam bytecode files.
The files must be compiled with +debug_info.
- Source code:
- The analysis starts from .erl files.
+ The analysis starts from .erl files.
Controlling the discrepancies reported by the Dialyzer
======================================================
@@ -129,9 +129,9 @@ Usage: dialyzer [--help] [--version] [--shell] [--quiet] [--verbose]
[--apps applications] [-o outfile]
[--build_plt] [--add_to_plt] [--remove_from_plt]
[--check_plt] [--no_check_plt] [--plt_info] [--get_warnings]
- [--no_native]
+ [--no_native] [--fullpath]
-Options:
+Options:
files_or_dirs (for backwards compatibility also as: -c files_or_dirs)
Use Dialyzer from the command line to detect defects in the
specified files or directories containing .erl or .beam files,
@@ -169,7 +169,7 @@ Options:
--output_plt file
Store the plt at the specified file after building it.
--plt plt
- Use the specified plt as the initial plt (if the plt was built
+ Use the specified plt as the initial plt (if the plt was built
during setup the files will be checked for consistency).
--plts plt*
Merge the specified plts to create the initial plt -- requires
@@ -204,8 +204,8 @@ Options:
--add_to_plt
The plt is extended to also include the files specified with -c and -r.
Use --plt to specify which plt to start from, and --output_plt to
- specify where to put the plt. Note that the analysis might include
- files from the plt if they depend on the new files.
+ specify where to put the plt. Note that the analysis might include
+ files from the plt if they depend on the new files.
This option only works with beam files.
--remove_from_plt
The information from the files specified with -c and -r is removed
@@ -231,6 +231,8 @@ Options:
Bypass the native code compilation of some key files that Dialyzer
heuristically performs when dialyzing many files; this avoids the
compilation time but it may result in (much) longer analysis time.
+ --fullpath
+ Display the full path names of files for which warnings are emitted.
--gui
Use the gs-based GUI.
--wx
@@ -267,13 +269,13 @@ Warning options:
Include warnings about behaviour callbacks which drift from the published
recommended interfaces.
-Wunderspecs ***
- Warn about underspecified functions
+ Warn about underspecified functions
(those whose -spec is strictly more allowing than the success typing).
The following options are also available but their use is not recommended:
(they are mostly for Dialyzer developers and internal debugging)
-Woverspecs ***
- Warn about overspecified functions
+ Warn about overspecified functions
(those whose -spec is strictly less allowing than the success typing).
-Wspecdiffs ***
Warn when the -spec is different than the success typing.
@@ -304,8 +306,8 @@ dialyzer:run(OptList) -> Warnings
Warnings :: [{tag(), id(), msg()}]
tag() :: 'warn_return_no_exit' | 'warn_return_only_exit' | 'warn_not_called'
| 'warn_non_proper_list' | 'warn_fun_app' | 'warn_matching'
- | 'warn_failing_call' | 'warn_contract_types'
- | 'warn_contract_syntax' | 'warn_contract_not_equal'
+ | 'warn_failing_call' | 'warn_contract_types'
+ | 'warn_contract_syntax' | 'warn_contract_not_equal'
| 'warn_contract_subtype' | 'warn_contract_supertype'
id() :: {File :: string(), Line :: integer()}
msg() :: Undefined
@@ -317,24 +319,31 @@ Option :: {files, [Filename :: string()]}
| {from, src_code | byte_code} %% Defaults to byte_code
| {init_plt, FileName :: string()} %% If changed from default
| {plts, [FileName :: string()]} %% If changed from default
- | {include_dirs, [DirName :: string()]}
+ | {include_dirs, [DirName :: string()]}
| {output_file, FileName :: string()}
| {output_plt, FileName :: string()}
| {analysis_type, 'succ_typings' | 'plt_add' |
'plt_build' | 'plt_check' | 'plt_remove'}
| {warnings, [WarnOpts]}
+ | {get_warnings, bool()}
WarnOpts :: no_return
| no_unused
| no_improper_lists
| no_fun_app
| no_match
+ | no_opaque
| no_fail_call
- | unmatched_returns
| error_handling
+ | race_conditions
+ | behaviours
+ | unmatched_returns
+ | overspecs
+ | underspecs
+ | specdiffs
dialyzer:format_warning({tag(), id(), msg()}) -> string()
-
+
Returns a string representation of the warnings as returned by dialyzer:run/1.
dialyzer:plt_info(string()) -> {'ok', [{atom(), any()}]} | {'error', atom()}
@@ -390,7 +399,7 @@ files that depend on these files. Note that this consistency check
will be performed automatically the next time you run Dialyzer with
this plt. The --check_plt option is merely for doing so without doing
any other analysis.
-
+
-----------------------------------------------
--
-- Feedback & bug reports
diff --git a/lib/dialyzer/doc/src/dialyzer.xml b/lib/dialyzer/doc/src/dialyzer.xml
index 01a7e478bc..4080dfdf77 100644
--- a/lib/dialyzer/doc/src/dialyzer.xml
+++ b/lib/dialyzer/doc/src/dialyzer.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2006</year><year>2010</year>
+ <year>2006</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -71,7 +71,7 @@
[--apps applications] [-o outfile]
[--build_plt] [--add_to_plt] [--remove_from_plt]
[--check_plt] [--no_check_plt] [--plt_info] [--get_warnings]
- [--no_native]
+ [--no_native] [--fullpath]
]]></code>
<p>Options:</p>
<taglist>
@@ -198,10 +198,12 @@
heuristically performs when dialyzing many files; this avoids the
compilation time but it may result in (much) longer analysis
time.</item>
+ <tag><c><![CDATA[--fullpath]]></c></tag>
+ <item>Display the full path names of files for which warnings are emitted.</item>
<tag><c><![CDATA[--gui]]></c></tag>
<item>Use the gs-based GUI.</item>
<tag><c><![CDATA[--wx]]></c></tag>
- <item>Use the wx-based GUI..</item>
+ <item>Use the wx-based GUI.</item>
</taglist>
<note>
<p>* denotes that multiple occurrences of these options are possible.</p>
@@ -239,7 +241,7 @@
<item>Include warnings about behaviour callbacks which drift from the
published recommended interfaces.</item>
<tag><c><![CDATA[-Wunderspecs]]></c>***</tag>
- <item>Warn about underspecified functions
+ <item>Warn about underspecified functions
(the -spec is strictly more allowing than the success typing).</item>
</taglist>
<p>The following options are also available but their use is not
@@ -247,7 +249,7 @@
debugging)</p>
<taglist>
<tag><c><![CDATA[-Woverspecs]]></c>***</tag>
- <item>Warn about overspecified functions
+ <item>Warn about overspecified functions
(the -spec is strictly less allowing than the success typing).</item>
<tag><c><![CDATA[-Wspecdiffs]]></c>***</tag>
<item>Warn when the -spec is different than the success typing.</item>
@@ -276,34 +278,34 @@
<desc>
<p>Dialyzer GUI version.</p>
<code type="none"><![CDATA[
-OptList : [Option]
-Option : {files, [Filename : string()]}
- | {files_rec, [DirName : string()]}
- | {defines, [{Macro: atom(), Value : term()}]}
- | {from, src_code | byte_code} %% Defaults to byte_code
- | {init_plt, FileName : string()} %% If changed from default
- | {plts, [FileName :: string()]} %% If changed from default
- | {include_dirs, [DirName : string()]}
- | {output_file, FileName : string()}
- | {output_plt, FileName :: string()}
- | {analysis_type, 'succ_typings' | 'plt_add' | 'plt_build' | 'plt_check' | 'plt_remove'}
- | {warnings, [WarnOpts]}
- | {get_warnings, bool()}
+OptList :: [Option]
+Option :: {files, [Filename :: string()]}
+ | {files_rec, [DirName :: string()]}
+ | {defines, [{Macro: atom(), Value : term()}]}
+ | {from, src_code | byte_code} %% Defaults to byte_code
+ | {init_plt, FileName :: string()} %% If changed from default
+ | {plts, [FileName :: string()]} %% If changed from default
+ | {include_dirs, [DirName :: string()]}
+ | {output_file, FileName :: string()}
+ | {output_plt, FileName :: string()}
+ | {analysis_type, 'succ_typings' | 'plt_add' | 'plt_build' | 'plt_check' | 'plt_remove'}
+ | {warnings, [WarnOpts]}
+ | {get_warnings, bool()}
-WarnOpts : no_return
- | no_unused
- | no_improper_lists
- | no_fun_app
- | no_match
- | no_opaque
- | no_fail_call
- | error_handling
- | race_conditions
- | behaviours
- | unmatched_returns
- | overspecs
- | underspecs
- | specdiffs
+WarnOpts :: no_return
+ | no_unused
+ | no_improper_lists
+ | no_fun_app
+ | no_match
+ | no_opaque
+ | no_fail_call
+ | error_handling
+ | race_conditions
+ | behaviours
+ | unmatched_returns
+ | overspecs
+ | underspecs
+ | specdiffs
]]></code>
</desc>
</func>
@@ -318,12 +320,12 @@ WarnOpts : no_return
<p>Dialyzer command line version.</p>
<code type="none"><![CDATA[
Warnings :: [{Tag, Id, Msg}]
-Tag : 'warn_return_no_exit' | 'warn_return_only_exit'
- | 'warn_not_called' | 'warn_non_proper_list'
- | 'warn_fun_app' | 'warn_matching'
- | 'warn_failing_call' | 'warn_contract_types'
- | 'warn_contract_syntax' | 'warn_contract_not_equal'
- | 'warn_contract_subtype' | 'warn_contract_supertype'
+Tag :: 'warn_return_no_exit' | 'warn_return_only_exit'
+ | 'warn_not_called' | 'warn_non_proper_list'
+ | 'warn_fun_app' | 'warn_matching'
+ | 'warn_failing_call' | 'warn_contract_types'
+ | 'warn_contract_syntax' | 'warn_contract_not_equal'
+ | 'warn_contract_subtype' | 'warn_contract_supertype'
Id = {File :: string(), Line :: integer()}
Msg = msg() -- Undefined
]]></code>
diff --git a/lib/dialyzer/doc/src/notes.xml b/lib/dialyzer/doc/src/notes.xml
index 3678291be7..f132a50e0d 100755
--- a/lib/dialyzer/doc/src/notes.xml
+++ b/lib/dialyzer/doc/src/notes.xml
@@ -31,6 +31,92 @@
<p>This document describes the changes made to the Dialyzer
application.</p>
+<section><title>Dialyzer 2.4.2</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Add a --fullpath option to Dialyzer</p>
+ <p>
+ This change adds a --fullpath option to Dialyzer, which
+ makes the warning messages contain the full path of the
+ corresponding file.</p>
+ <p>
+ Original patch submitted by Magnus Henoch (legoscia) on
+ 15/9/2010 and cooked to death in the 'pu' branch all this
+ time.</p>
+ <p>
+ The patch was essentially correct and most of it has been
+ used as is, but there have been some changes to make the
+ code slightly prettier, avoid some code duplication, and
+ add documentation to dialyzer's doc files and to its help
+ message.</p>
+ <p>
+ Own Id: OTP-9098</p>
+ </item>
+ <item>
+ <p>
+ Fix warnings about guards containing not</p>
+ <p>
+ The wording of warnings about unsatisfiable guards that
+ used 'not' was incorrect (the 'not' was not mentioned and
+ it appeared as "Guard test is_atom(atom()) can never
+ succeed") (thanks to Stavros Aronis).</p>
+ <p>
+ Own Id: OTP-9099</p>
+ </item>
+ <item>
+ <p>
+ Version 2.4.2 (in Erlang/OTP R14B02)
+ ------------------------------------ - Added --fullpath
+ option to display files with warnings with their full
+ file names (thanks to Magnus Henoch for the original
+ patch). - Better handling of 'and'/'or'/'not' guards that
+ generate warnings (thanks to Stavros Aronis). - Better
+ blame assignment for cases when a function's spec is
+ erroneous (thanks to Stavros Aronis). - More descriptive
+ warnings when a tuple/record pattern contains subterms
+ that violate the declared types of record fields (thanks
+ to Matthias Lang for the test case and for Stavros Aronis
+ for the actual fix).</p>
+ <p>
+ Own Id: OTP-9126</p>
+ </item>
+ <item>
+ <p>
+ Add spec to dialyzer_cl_parse:get_lib_dir/1</p>
+ <p>
+ Own Id: OTP-9129</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Test suites for Dialyzer</p>
+ <p>
+ This is a transcription of most of the
+ cvs.srv.it.uu.se:/hipe repository dialyzer_tests into
+ test suites that use the test server framework.</p>
+ <p>
+ See README for information on how to use the included
+ scripts for modifications and updates.</p>
+ <p>
+ When testing Dialyzer it's important that several OTP
+ modules are included in the plt. The suites takes care of
+ that too.</p>
+ <p>
+ Own Id: OTP-9116</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Dialyzer 2.4.0</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/dialyzer/src/dialyzer.erl b/lib/dialyzer/src/dialyzer.erl
index 471f9fccd2..5014a4244c 100644
--- a/lib/dialyzer/src/dialyzer.erl
+++ b/lib/dialyzer/src/dialyzer.erl
@@ -2,7 +2,7 @@
%%-----------------------------------------------------------------------
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -38,7 +38,8 @@
gui/0,
gui/1,
plt_info/1,
- format_warning/1]).
+ format_warning/1,
+ format_warning/2]).
-include("dialyzer.hrl").
@@ -48,6 +49,8 @@
%% - run/1: Erlang interface for a command line-like analysis
%% - gui/0/1: Erlang interface for the gui.
%% - format_warning/1: Get the string representation of a warning.
+%% - format_warning/1: Likewise, but with an option whether
+%% to display full path names or not
%% - plt_info/1: Get information of the specified plt.
%%--------------------------------------------------------------------
@@ -281,11 +284,19 @@ cl_check_log(Output) ->
-spec format_warning(dial_warning()) -> string().
-format_warning({_Tag, {File, Line}, Msg}) when is_list(File),
- is_integer(Line) ->
- BaseName = filename:basename(File),
+format_warning(W) ->
+ format_warning(W, basename).
+
+-spec format_warning(dial_warning(), fopt()) -> string().
+
+format_warning({_Tag, {File, Line}, Msg}, FOpt) when is_list(File),
+ is_integer(Line) ->
+ F = case FOpt of
+ fullpath -> File;
+ basename -> filename:basename(File)
+ end,
String = lists:flatten(message_to_string(Msg)),
- lists:flatten(io_lib:format("~s:~w: ~s", [BaseName, Line, String])).
+ lists:flatten(io_lib:format("~s:~w: ~s", [F, Line, String])).
%%-----------------------------------------------------------------------------
@@ -323,8 +334,13 @@ message_to_string({guard_fail, []}) ->
"Clause guard cannot succeed.\n";
message_to_string({guard_fail, [Arg1, Infix, Arg2]}) ->
io_lib:format("Guard test ~s ~s ~s can never succeed\n", [Arg1, Infix, Arg2]);
+message_to_string({neg_guard_fail, [Arg1, Infix, Arg2]}) ->
+ io_lib:format("Guard test not(~s ~s ~s) can never succeed\n",
+ [Arg1, Infix, Arg2]);
message_to_string({guard_fail, [Guard, Args]}) ->
io_lib:format("Guard test ~w~s can never succeed\n", [Guard, Args]);
+message_to_string({neg_guard_fail, [Guard, Args]}) ->
+ io_lib:format("Guard test not(~w~s) can never succeed\n", [Guard, Args]);
message_to_string({guard_fail_pat, [Pat, Type]}) ->
io_lib:format("Clause guard cannot succeed. The ~s was matched"
" against the type ~s\n", [Pat, Type]);
@@ -352,6 +368,9 @@ message_to_string({record_constr, [Name, Field, Type]}) ->
message_to_string({record_matching, [String, Name]}) ->
io_lib:format("The ~s violates the"
" declared type for #~w{}\n", [String, Name]);
+message_to_string({record_match, [Pat, Type]}) ->
+ io_lib:format("Matching of ~s tagged with a record name violates the declared"
+ " type of ~s\n", [Pat, Type]);
message_to_string({pattern_match, [Pat, Type]}) ->
io_lib:format("The ~s can never match the type ~s\n", [Pat, Type]);
message_to_string({pattern_match_cov, [Pat, Type]}) ->
@@ -378,6 +397,10 @@ message_to_string({contract_supertype, [M, F, _A, Contract, Sig]}) ->
io_lib:format("Type specification ~w:~w~s"
" is a supertype of the success typing: ~w:~w~s\n",
[M, F, Contract, M, F, Sig]);
+message_to_string({contract_range, [Contract, M, F, ArgStrings, Line, CRet]}) ->
+ io_lib:format("The contract ~w:~w~s cannot be right because the inferred"
+ " return for ~w~s on line ~w is ~s\n",
+ [M, F, Contract, 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]);
diff --git a/lib/dialyzer/src/dialyzer.hrl b/lib/dialyzer/src/dialyzer.hrl
index 1d98574585..9d2e554981 100644
--- a/lib/dialyzer/src/dialyzer.hrl
+++ b/lib/dialyzer/src/dialyzer.hrl
@@ -2,7 +2,7 @@
%%%
%%% %CopyrightBegin%
%%%
-%%% Copyright Ericsson AB 2006-2010. All Rights Reserved.
+%%% Copyright Ericsson AB 2006-2011. 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
@@ -31,7 +31,7 @@
-define(RET_DISCREPANCIES, 2).
-type dial_ret() :: ?RET_NOTHING_SUSPICIOUS
- | ?RET_INTERNAL_ERROR
+ | ?RET_INTERNAL_ERROR
| ?RET_DISCREPANCIES.
%%--------------------------------------------------------------------
@@ -52,10 +52,11 @@
-define(WARN_CONTRACT_NOT_EQUAL, warn_contract_not_equal).
-define(WARN_CONTRACT_SUBTYPE, warn_contract_subtype).
-define(WARN_CONTRACT_SUPERTYPE, warn_contract_supertype).
+-define(WARN_CONTRACT_RANGE, warn_contract_range).
-define(WARN_CALLGRAPH, warn_callgraph).
-define(WARN_UNMATCHED_RETURN, warn_umatched_return).
-define(WARN_RACE_CONDITION, warn_race_condition).
--define(WARN_BEHAVIOUR,warn_behaviour).
+-define(WARN_BEHAVIOUR, warn_behaviour).
%%
%% The following type has double role:
@@ -70,7 +71,7 @@
| ?WARN_CONTRACT_NOT_EQUAL | ?WARN_CONTRACT_SUBTYPE
| ?WARN_CONTRACT_SUPERTYPE | ?WARN_CALLGRAPH
| ?WARN_UNMATCHED_RETURN | ?WARN_RACE_CONDITION
- | ?WARN_BEHAVIOUR.
+ | ?WARN_BEHAVIOUR | ?WARN_CONTRACT_RANGE.
%%
%% This is the representation of each warning as they will be returned
@@ -87,7 +88,7 @@
%%--------------------------------------------------------------------
%% THIS TYPE SHOULD ONE DAY DISAPPEAR -- IT DOES NOT BELONG HERE
%%--------------------------------------------------------------------
-
+
-type ordset(T) :: [T] . %% XXX: temporarily
%%--------------------------------------------------------------------
@@ -102,6 +103,8 @@
-type dial_define() :: {atom(), term()}.
-type dial_option() :: {atom(), term()}.
-type dial_options() :: [dial_option()].
+-type fopt() :: 'basename' | 'fullpath'.
+-type format() :: 'formatted' | 'raw'.
-type label() :: non_neg_integer().
-type rep_mode() :: 'quiet' | 'normal' | 'verbose'.
-type start_from() :: 'byte_code' | 'src_code'.
@@ -137,10 +140,10 @@
erlang_mode = false :: boolean(),
use_contracts = true :: boolean(),
output_file = none :: 'none' | file:filename(),
- output_format = formatted :: 'raw' | 'formatted',
+ output_format = formatted :: format(),
+ filename_opt = basename :: fopt(),
callgraph_file = "" :: file:filename(),
- check_plt = true :: boolean()
- }).
+ check_plt = true :: boolean()}).
-record(contract, {contracts = [] :: [contract_pair()],
args = [] :: [erl_types:erl_type()],
diff --git a/lib/dialyzer/src/dialyzer_cl.erl b/lib/dialyzer/src/dialyzer_cl.erl
index 1987c1732c..8d61216b7a 100644
--- a/lib/dialyzer/src/dialyzer_cl.erl
+++ b/lib/dialyzer/src/dialyzer_cl.erl
@@ -2,7 +2,7 @@
%%-------------------------------------------------------------------
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -46,7 +46,8 @@
legal_warnings = ordsets:new() :: [dial_warn_tag()],
mod_deps = dict:new() :: dict(),
output = standard_io :: io:device(),
- output_format = formatted :: 'raw' | 'formatted',
+ output_format = formatted :: format(),
+ filename_opt = basename :: fopt(),
output_plt = none :: 'none' | file:filename(),
plt_info = none :: 'none' | dialyzer_plt:plt_info(),
report_mode = normal :: rep_mode(),
@@ -188,6 +189,12 @@ init_opts_for_remove(Opts) ->
plt_common(#options{init_plts = [InitPlt]} = Opts, RemoveFiles, AddFiles) ->
case check_plt(Opts, RemoveFiles, AddFiles) of
ok ->
+ case Opts#options.output_plt of
+ none -> ok;
+ OutPlt ->
+ {ok, Binary} = file:read_file(InitPlt),
+ file:write_file(OutPlt, Binary)
+ end,
case Opts#options.report_mode of
quiet -> ok;
_ -> io:put_chars(" yes\n")
@@ -532,8 +539,10 @@ hc(Mod) ->
new_state() ->
#cl_state{}.
-init_output(State0, #options{output_file = OutFile, output_format = OutFormat}) ->
- State = State0#cl_state{output_format = OutFormat},
+init_output(State0, #options{output_file = OutFile,
+ output_format = OutFormat,
+ filename_opt = FOpt}) ->
+ State = State0#cl_state{output_format = OutFormat, filename_opt = FOpt},
case OutFile =:= none of
true ->
State;
@@ -766,6 +775,7 @@ print_warnings(#cl_state{stored_warnings = []}) ->
ok;
print_warnings(#cl_state{output = Output,
output_format = Format,
+ filename_opt = FOpt,
stored_warnings = Warnings}) ->
PrWarnings = process_warnings(Warnings),
case PrWarnings of
@@ -773,7 +783,7 @@ print_warnings(#cl_state{output = Output,
[_|_] ->
S = case Format of
formatted ->
- [dialyzer:format_warning(W) || W <- PrWarnings];
+ [dialyzer:format_warning(W, FOpt) || W <- PrWarnings];
raw ->
[io_lib:format("~p. \n", [W]) || W <- PrWarnings]
end,
diff --git a/lib/dialyzer/src/dialyzer_cl_parse.erl b/lib/dialyzer/src/dialyzer_cl_parse.erl
index 5ca7599b35..f80eb81ac6 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-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -20,10 +20,8 @@
-module(dialyzer_cl_parse).
-%% Avoid warning for local function error/1 clashing with autoimported BIF.
--compile({no_auto_import,[error/1]}).
--export([start/0]).
--export([collect_args/1]). % used also by typer_options.erl
+-export([start/0, get_lib_dir/1]).
+-export([collect_args/1]). % used also by typer
-include("dialyzer.hrl").
@@ -32,9 +30,11 @@
-type dial_cl_parse_ret() :: {'check_init', #options{}}
| {'plt_info', #options{}}
| {'cl', #options{}}
- | {{'gui', 'gs' | 'wx'}, #options{}}
+ | {{'gui', 'gs' | 'wx'}, #options{}}
| {'error', string()}.
+-type deep_string() :: string() | [deep_string()].
+
%%-----------------------------------------------------------------------
-spec start() -> dial_cl_parse_ret().
@@ -55,7 +55,7 @@ cl(["--add_to_plt"|T]) ->
put(dialyzer_options_analysis_type, plt_add),
cl(T);
cl(["--apps"|T]) ->
- T1 = get_lib_dir(T, []),
+ T1 = get_lib_dir(T),
{Args, T2} = collect_args(T1),
append_var(dialyzer_options_files_rec, Args),
cl(T2);
@@ -82,7 +82,7 @@ cl(["--get_warnings"|T]) ->
put(dialyzer_options_get_warnings, true),
cl(T);
cl(["-D"|_]) ->
- error("No defines specified after -D");
+ cl_error("No defines specified after -D");
cl(["-D"++Define|T]) ->
Def = re:split(Define, "=", [{return, list}]),
append_defines(Def),
@@ -92,7 +92,7 @@ cl(["-h"|_]) ->
cl(["--help"|_]) ->
help_message();
cl(["-I"]) ->
- error("no include directory specified after -I");
+ cl_error("no include directory specified after -I");
cl(["-I", Dir|T]) ->
append_include(Dir),
cl(T);
@@ -113,14 +113,14 @@ cl(["--com"++_|T]) ->
NewTail = command_line(T),
cl(NewTail);
cl(["--output"]) ->
- error("No outfile specified");
+ cl_error("No outfile specified");
cl(["-o"]) ->
- error("No outfile specified");
+ cl_error("No outfile specified");
cl(["--output",Output|T]) ->
put(dialyzer_output, Output),
cl(T);
cl(["--output_plt"]) ->
- error("No outfile specified for --output_plt");
+ cl_error("No outfile specified for --output_plt");
cl(["--output_plt",Output|T]) ->
put(dialyzer_output_plt, Output),
cl(T);
@@ -133,10 +133,13 @@ cl(["-o"++Output|T]) ->
cl(["--raw"|T]) ->
put(dialyzer_output_format, raw),
cl(T);
+cl(["--fullpath"|T]) ->
+ put(dialyzer_filename_opt, fullpath),
+ cl(T);
cl(["-pa", Path|T]) ->
case code:add_patha(Path) of
true -> cl(T);
- {error, _} -> error("Bad directory for -pa: "++Path)
+ {error, _} -> cl_error("Bad directory for -pa: " ++ Path)
end;
cl(["--plt"]) ->
error("No plt specified for --plt");
@@ -171,14 +174,14 @@ cl(["--verbose"|T]) ->
put(dialyzer_options_report_mode, verbose),
cl(T);
cl(["-W"|_]) ->
- error("-W given without warning");
+ cl_error("-W given without warning");
cl(["-Whelp"|_]) ->
help_warnings();
cl(["-W"++Warn|T]) ->
append_var(dialyzer_warnings, [list_to_atom(Warn)]),
cl(T);
cl(["--dump_callgraph"]) ->
- error("No outfile specified for --dump_callgraph");
+ cl_error("No outfile specified for --dump_callgraph");
cl(["--dump_callgraph", File|T]) ->
put(dialyzer_callgraph_file, File),
cl(T);
@@ -194,7 +197,7 @@ cl([H|_] = L) ->
NewTail = command_line(L),
cl(NewTail);
false ->
- error("Unknown option: " ++ H)
+ cl_error("Unknown option: " ++ H)
end;
cl([]) ->
{RetTag, Opts} =
@@ -213,7 +216,7 @@ cl([]) ->
end
end,
case dialyzer_options:build(Opts) of
- {error, Msg} -> error(Msg);
+ {error, Msg} -> cl_error(Msg);
OptsRecord -> {RetTag, OptsRecord}
end.
@@ -229,7 +232,9 @@ command_line(T0) ->
end,
T.
-error(Str) ->
+-spec cl_error(deep_string()) -> no_return().
+
+cl_error(Str) ->
Msg = lists:flatten(Str),
throw({dialyzer_cl_parse_error, Msg}).
@@ -243,6 +248,7 @@ init() ->
put(dialyzer_options_defines, DefaultOpts#options.defines),
put(dialyzer_options_files, DefaultOpts#options.files),
put(dialyzer_output_format, formatted),
+ put(dialyzer_filename_opt, basename),
put(dialyzer_options_check_plt, DefaultOpts#options.check_plt),
ok.
@@ -281,6 +287,7 @@ cl_options() ->
{files_rec, get(dialyzer_options_files_rec)},
{output_file, get(dialyzer_output)},
{output_format, get(dialyzer_output_format)},
+ {filename_opt, get(dialyzer_filename_opt)},
{analysis_type, get(dialyzer_options_analysis_type)},
{get_warnings, get(dialyzer_options_get_warnings)},
{callgraph_file, get(dialyzer_callgraph_file)}
@@ -299,6 +306,11 @@ common_options() ->
%%-----------------------------------------------------------------------
+-spec get_lib_dir([string()]) -> [string()].
+
+get_lib_dir(Apps) ->
+ get_lib_dir(Apps, []).
+
get_lib_dir([H|T], Acc) ->
NewElem =
case code:lib_dir(list_to_atom(H)) of
@@ -322,11 +334,15 @@ get_plts([], Acc) -> {lists:reverse(Acc), []}.
%%-----------------------------------------------------------------------
+-spec help_warnings() -> no_return().
+
help_warnings() ->
S = warning_options_msg(),
io:put_chars(S),
erlang:halt(?RET_NOTHING_SUSPICIOUS).
+-spec help_message() -> no_return().
+
help_message() ->
S = "Usage: dialyzer [--help] [--version] [--shell] [--quiet] [--verbose]
[-pa dir]* [--plt plt] [--plts plt*] [-Ddefine]*
@@ -335,7 +351,7 @@ help_message() ->
[--apps applications] [-o outfile]
[--build_plt] [--add_to_plt] [--remove_from_plt]
[--check_plt] [--no_check_plt] [--plt_info] [--get_warnings]
- [--no_native]
+ [--no_native] [--fullpath]
Options:
files_or_dirs (for backwards compatibility also as: -c files_or_dirs)
Use Dialyzer from the command line to detect defects in the
@@ -437,6 +453,8 @@ Options:
Bypass the native code compilation of some key files that Dialyzer
heuristically performs when dialyzing many files; this avoids the
compilation time but it may result in (much) longer analysis time.
+ --fullpath
+ Display the full path names of files for which warnings are emitted.
--gui
Use the gs-based GUI.
--wx
@@ -484,13 +502,13 @@ warning_options_msg() ->
Include warnings about behaviour callbacks which drift from the published
recommended interfaces.
-Wunderspecs ***
- Warn about underspecified functions
+ Warn about underspecified functions
(those whose -spec is strictly more allowing than the success typing).
The following options are also available but their use is not recommended:
(they are mostly for Dialyzer developers and internal debugging)
-Woverspecs ***
- Warn about overspecified functions
+ Warn about overspecified functions
(those whose -spec is strictly less allowing than the success typing).
-Wspecdiffs ***
Warn when the -spec is different than the success typing.
diff --git a/lib/dialyzer/src/dialyzer_dataflow.erl b/lib/dialyzer/src/dialyzer_dataflow.erl
index b80c7efc1a..7137dbc036 100644
--- a/lib/dialyzer/src/dialyzer_dataflow.erl
+++ b/lib/dialyzer/src/dialyzer_dataflow.erl
@@ -2,7 +2,7 @@
%%--------------------------------------------------------------------
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -657,7 +657,8 @@ handle_apply_or_call([{TypeOfApply, {Fun, Sig, Contr, LocalRet}}|Left],
true -> opaque;
false -> structured
end,
- RetWithoutLocal = t_inf(t_inf(ContrRet, BifRet, RetMode), SigRange, RetMode),
+ RetWithoutContr = t_inf(SigRange, BifRet, RetMode),
+ RetWithoutLocal = t_inf(ContrRet, RetWithoutContr, RetMode),
?debug("--------------------------------------------------------\n", []),
?debug("Fun: ~p\n", [Fun]),
?debug("Args: ~s\n", [erl_types:t_to_string(t_product(ArgTypes))]),
@@ -666,6 +667,7 @@ handle_apply_or_call([{TypeOfApply, {Fun, Sig, Contr, LocalRet}}|Left],
[erl_types:t_to_string(t_product(NewArgsContract))]),
?debug("NewArgsBif: ~s\n", [erl_types:t_to_string(t_product(NewArgsBif))]),
?debug("NewArgTypes: ~s\n", [erl_types:t_to_string(t_product(NewArgTypes))]),
+ ?debug("RetWithoutContr: ~s\n",[erl_types:t_to_string(RetWithoutContr)]),
?debug("RetWithoutLocal: ~s\n", [erl_types:t_to_string(RetWithoutLocal)]),
?debug("BifRet: ~s\n", [erl_types:t_to_string(BifRange(NewArgTypes))]),
?debug("ContrRet: ~s\n", [erl_types:t_to_string(CRange(TmpArgTypes))]),
@@ -700,22 +702,39 @@ handle_apply_or_call([{TypeOfApply, {Fun, Sig, Contr, LocalRet}}|Left],
State2 =
case FailedConj andalso not (IsFailBif orelse IsFailSig) of
true ->
- FailedSig = any_none(NewArgsSig),
- FailedContract = any_none([CRange(TmpArgsContract)|NewArgsContract]),
- FailedBif = any_none([BifRange(NewArgsBif)|NewArgsBif]),
- InfSig = t_inf(t_fun(SigArgs, SigRange),
- t_fun(BifArgs, BifRange(BifArgs))),
- FailReason = apply_fail_reason(FailedSig, FailedBif, FailedContract),
- Msg = get_apply_fail_msg(Fun, Args, ArgTypes, NewArgTypes, InfSig,
- Contr, CArgs, State1, FailReason),
- WarnType = case Msg of
- {call, _} -> ?WARN_FAILING_CALL;
- {apply, _} -> ?WARN_FAILING_CALL;
- {call_with_opaque, _} -> ?WARN_OPAQUE;
- {call_without_opaque, _} -> ?WARN_OPAQUE;
- {opaque_type_test, _} -> ?WARN_OPAQUE
- end,
- state__add_warning(State1, WarnType, Tree, Msg);
+ case t_is_none(RetWithoutLocal) andalso
+ not t_is_none(RetWithoutContr) andalso
+ not any_none(NewArgTypes) of
+ true ->
+ {value, C1} = Contr,
+ Contract = dialyzer_contracts:contract_to_string(C1),
+ {M1, F1, A1} = state__lookup_name(Fun, State),
+ ArgStrings = format_args(Args, ArgTypes, State),
+ CRet = erl_types:t_to_string(RetWithoutContr),
+ %% This Msg will be post_processed by dialyzer_succ_typings
+ Msg =
+ {contract_range, [Contract, M1, F1, A1, ArgStrings, CRet]},
+ state__add_warning(State1, ?WARN_CONTRACT_RANGE, Tree, Msg);
+ false ->
+ FailedSig = any_none(NewArgsSig),
+ FailedContract =
+ any_none([CRange(TmpArgsContract)|NewArgsContract]),
+ FailedBif = any_none([BifRange(NewArgsBif)|NewArgsBif]),
+ InfSig = t_inf(t_fun(SigArgs, SigRange),
+ t_fun(BifArgs, BifRange(BifArgs))),
+ FailReason =
+ apply_fail_reason(FailedSig, FailedBif, FailedContract),
+ Msg = get_apply_fail_msg(Fun, Args, ArgTypes, NewArgTypes, InfSig,
+ Contr, CArgs, State1, FailReason),
+ WarnType = case Msg of
+ {call, _} -> ?WARN_FAILING_CALL;
+ {apply, _} -> ?WARN_FAILING_CALL;
+ {call_with_opaque, _} -> ?WARN_OPAQUE;
+ {call_without_opaque, _} -> ?WARN_OPAQUE;
+ {opaque_type_test, _} -> ?WARN_OPAQUE
+ end,
+ state__add_warning(State1, WarnType, Tree, Msg)
+ end;
false -> State1
end,
State3 =
@@ -1350,7 +1369,7 @@ do_clause(C, Arg, ArgType0, OrigArgType, Map,
bind_pat_vars(Pats, ArgTypes, [], Map1, State1)
end,
case BindRes of
- {error, BindOrOpaque, NewPats, Type, OpaqueTerm} ->
+ {error, ErrorType, NewPats, Type, OpaqueTerm} ->
?debug("Failed binding pattern: ~s\nto ~s\n",
[cerl_prettypr:format(C), format_type(ArgType0, State1)]),
case state__warning_mode(State1) of
@@ -1358,8 +1377,9 @@ do_clause(C, Arg, ArgType0, OrigArgType, Map,
{State1, Map, t_none(), ArgType0};
true ->
PatString =
- case BindOrOpaque of
+ case ErrorType of
bind -> format_patterns(Pats);
+ record -> format_patterns(Pats);
opaque -> format_patterns(NewPats)
end,
{Msg, Force} =
@@ -1399,13 +1419,15 @@ do_clause(C, Arg, ArgType0, OrigArgType, Map,
false ->
true
end,
- PatTypes = case BindOrOpaque of
+ PatTypes = case ErrorType of
bind -> [PatString, format_type(ArgType0, State1)];
+ record -> [PatString, format_type(Type, State1)];
opaque -> [PatString, format_type(Type, State1),
format_type(OpaqueTerm, State1)]
- end,
- FailedMsg = case BindOrOpaque of
+ end,
+ FailedMsg = case ErrorType of
bind -> {pattern_match, PatTypes};
+ record -> {record_match, PatTypes};
opaque -> {opaque_match, PatTypes}
end,
{FailedMsg, Force0}
@@ -1413,6 +1435,7 @@ do_clause(C, Arg, ArgType0, OrigArgType, Map,
WarnType = case Msg of
{opaque_match, _} -> ?WARN_OPAQUE;
{pattern_match, _} -> ?WARN_MATCHING;
+ {record_match, _} -> ?WARN_MATCHING;
{pattern_match_cov, _} -> ?WARN_MATCHING
end,
{state__add_warning(State1, WarnType, C, Msg, Force),
@@ -1457,6 +1480,7 @@ do_clause(C, Arg, ArgType0, OrigArgType, Map,
false ->
WarnType = case Msg of
{guard_fail, _} -> ?WARN_MATCHING;
+ {neg_guard_fail, _} -> ?WARN_MATCHING;
{opaque_guard, _} -> ?WARN_OPAQUE
end,
state__add_warning(State1, WarnType, FailGuard, Msg);
@@ -1505,14 +1529,18 @@ bind_pat_vars(Pats, Types, Acc, Map, State) ->
try
bind_pat_vars(Pats, Types, Acc, Map, State, false)
catch
- throw:Error -> Error % Error = {error, bind | opaque, ErrorPats, ErrorType}
+ throw:Error ->
+ %% Error = {error, bind | opaque | record, ErrorPats, ErrorType}
+ Error
end.
bind_pat_vars_reverse(Pats, Types, Acc, Map, State) ->
try
bind_pat_vars(Pats, Types, Acc, Map, State, true)
catch
- throw:Error -> Error % Error = {error, bind | opaque, ErrorPats, ErrorType}
+ throw:Error ->
+ %% Error = {error, bind | opaque | record, ErrorPats, ErrorType}
+ Error
end.
bind_pat_vars([Pat|PatLeft], [Type|TypeLeft], Acc, Map, State, Rev) ->
@@ -1567,18 +1595,21 @@ bind_pat_vars([Pat|PatLeft], [Type|TypeLeft], Acc, Map, State, Rev) ->
end;
tuple ->
Es = cerl:tuple_es(Pat),
- Prototype =
+ {TypedRecord, Prototype} =
case Es of
- [] -> t_tuple([]);
+ [] -> {false, t_tuple([])};
[Tag|Left] ->
case cerl:is_c_atom(Tag) of
true ->
TagAtom = cerl:atom_val(Tag),
case state__lookup_record(TagAtom, length(Left), State) of
- error -> t_tuple(length(Es));
- {ok, Record} -> Record
+ error -> {false, t_tuple(length(Es))};
+ {ok, Record} ->
+ [_Head|AnyTail] = [t_any() || _ <- Es],
+ UntypedRecord = t_tuple([t_atom(TagAtom)|AnyTail]),
+ {not erl_types:t_is_equal(Record, UntypedRecord), Record}
end;
- false -> t_tuple(length(Es))
+ false -> {false, t_tuple(length(Es))}
end
end,
Tuple = t_inf(Prototype, Type),
@@ -1603,7 +1634,11 @@ bind_pat_vars([Pat|PatLeft], [Type|TypeLeft], Acc, Map, State, Rev) ->
bind_error([Pat], Tuple, Opaque, opaque);
false ->
case [M || {M, _} <- Results, M =/= error] of
- [] -> bind_error([Pat], Tuple, t_none(), bind);
+ [] ->
+ case TypedRecord of
+ true -> bind_error([Pat], Tuple, Prototype, record);
+ false -> bind_error([Pat], Tuple, t_none(), bind)
+ end;
Maps ->
Map1 = join_maps(Maps, Map),
TupleType = t_sup([t_tuple(EsTypes)
@@ -1748,7 +1783,7 @@ bind_opaque_pats(GenType, Type, Pat, Map, State, Rev) ->
bind_guard(Guard, Map, State) ->
try bind_guard(Guard, Map, dict:new(), pos, State) of
- {Map1, _Type} -> Map1
+ {Map1, _Type} -> Map1
catch
throw:{fail, Warning} -> {error, Warning};
throw:{fatal_fail, Warning} -> {error, Warning}
@@ -1869,8 +1904,8 @@ handle_guard_gen_fun({M, F, A}, Guard, Map, Env, Eval, State) ->
true ->
%% Is this an error-bif?
case t_is_none(erl_bif_types:type(M, F, A)) of
- true -> signal_guard_fail(Guard, As, State);
- false -> signal_guard_fatal_fail(Guard, As, State)
+ true -> signal_guard_fail(Eval, Guard, As, State);
+ false -> signal_guard_fatal_fail(Eval, Guard, As, State)
end;
false ->
BifArgs = case erl_bif_types:arg_types(M, F, A) of
@@ -1887,7 +1922,7 @@ handle_guard_gen_fun({M, F, A}, Guard, Map, Env, Eval, State) ->
case t_is_none(Ret) of
true ->
case Eval =:= pos of
- true -> signal_guard_fail(Guard, As, State);
+ true -> signal_guard_fail(Eval, Guard, As, State);
false -> throw({fail, none})
end;
false -> {Map2, Ret}
@@ -1900,7 +1935,7 @@ handle_guard_type_test(Guard, F, Map, Env, Eval, State) ->
case bind_type_test(Eval, F, ArgType, State) of
error ->
?debug("Type test: ~w failed\n", [F]),
- signal_guard_fail(Guard, [ArgType], State);
+ signal_guard_fail(Eval, Guard, [ArgType], State);
{ok, NewArgType, Ret} ->
?debug("Type test: ~w succeeded, NewType: ~s, Ret: ~s\n",
[F, t_to_string(NewArgType), t_to_string(Ret)]),
@@ -1963,18 +1998,19 @@ handle_guard_comp(Guard, Comp, Map, Env, Eval, State) ->
true when Eval =:= pos -> {Map, t_atom(true)};
true when Eval =:= dont_know -> {Map, t_atom(true)};
true when Eval =:= neg -> {Map, t_atom(true)};
- false when Eval =:= pos -> signal_guard_fail(Guard, ArgTypes, State);
+ false when Eval =:= pos ->
+ signal_guard_fail(Eval, Guard, ArgTypes, State);
false when Eval =:= dont_know -> {Map, t_atom(false)};
false when Eval =:= neg -> {Map, t_atom(false)}
end;
{literal, var} when IsInt1 andalso IsInt2 andalso (Eval =:= pos) ->
case bind_comp_literal_var(Arg1, Arg2, Type2, Comp, Map1) of
- error -> signal_guard_fail(Guard, ArgTypes, State);
+ error -> signal_guard_fail(Eval, Guard, ArgTypes, State);
{ok, NewMap} -> {NewMap, t_atom(true)}
end;
{var, literal} when IsInt1 andalso IsInt2 andalso (Eval =:= pos) ->
case bind_comp_literal_var(Arg2, Arg1, Type1, invert_comp(Comp), Map1) of
- error -> signal_guard_fail(Guard, ArgTypes, State);
+ error -> signal_guard_fail(Eval, Guard, ArgTypes, State);
{ok, NewMap} -> {NewMap, t_atom(true)}
end;
{_, _} ->
@@ -2014,7 +2050,7 @@ handle_guard_is_function(Guard, Map, Env, Eval, State) ->
[FunType0, ArityType0] = ArgTypes0,
ArityType = t_inf(ArityType0, t_integer()),
case t_is_none(ArityType) of
- true -> signal_guard_fail(Guard, ArgTypes0, State);
+ true -> signal_guard_fail(Eval, Guard, ArgTypes0, State);
false ->
FunTypeConstr =
case t_number_vals(ArityType) of
@@ -2026,7 +2062,7 @@ handle_guard_is_function(Guard, Map, Env, Eval, State) ->
case t_is_none(FunType) of
true ->
case Eval of
- pos -> signal_guard_fail(Guard, ArgTypes0, State);
+ pos -> signal_guard_fail(Eval, Guard, ArgTypes0, State);
neg -> {Map1, t_atom(false)};
dont_know -> {Map1, t_atom(false)}
end;
@@ -2062,7 +2098,7 @@ handle_guard_is_record(Guard, Map, Env, Eval, State) ->
case t_is_none(Type) of
true ->
case Eval of
- pos -> signal_guard_fail(Guard,
+ pos -> signal_guard_fail(Eval, Guard,
[RecType, t_from_term(Tag),
t_from_term(Arity)],
State);
@@ -2085,7 +2121,10 @@ handle_guard_eq(Guard, Map, Env, Eval, State) ->
true ->
if
Eval =:= pos -> {Map, t_atom(true)};
- Eval =:= neg -> throw({fail, none});
+ Eval =:= neg ->
+ ArgTypes = [t_from_term(cerl:concrete(Arg1)),
+ t_from_term(cerl:concrete(Arg2))],
+ signal_guard_fail(Eval, Guard, ArgTypes, State);
Eval =:= dont_know -> {Map, t_atom(true)}
end;
false ->
@@ -2095,7 +2134,7 @@ handle_guard_eq(Guard, Map, Env, Eval, State) ->
Eval =:= pos ->
ArgTypes = [t_from_term(cerl:concrete(Arg1)),
t_from_term(cerl:concrete(Arg2))],
- signal_guard_fail(Guard, ArgTypes, State)
+ signal_guard_fail(Eval, Guard, ArgTypes, State)
end
end;
{literal, _} when Eval =:= pos ->
@@ -2140,7 +2179,10 @@ handle_guard_eqeq(Guard, Map, Env, Eval, State) ->
{literal, literal} ->
case cerl:concrete(Arg1) =:= cerl:concrete(Arg2) of
true ->
- if Eval =:= neg -> throw({fail, none});
+ if Eval =:= neg ->
+ ArgTypes = [t_from_term(cerl:concrete(Arg1)),
+ t_from_term(cerl:concrete(Arg2))],
+ signal_guard_fail(Eval, Guard, ArgTypes, State);
Eval =:= pos -> {Map, t_atom(true)};
Eval =:= dont_know -> {Map, t_atom(true)}
end;
@@ -2150,7 +2192,7 @@ handle_guard_eqeq(Guard, Map, Env, Eval, State) ->
Eval =:= pos ->
ArgTypes = [t_from_term(cerl:concrete(Arg1)),
t_from_term(cerl:concrete(Arg2))],
- signal_guard_fail(Guard, ArgTypes, State)
+ signal_guard_fail(Eval, Guard, ArgTypes, State)
end
end;
{literal, _} when Eval =:= pos ->
@@ -2172,7 +2214,7 @@ bind_eqeq_guard(Guard, Arg1, Arg2, Map, Env, Eval, State) ->
case Eval of
neg -> {Map2, t_atom(false)};
dont_know -> {Map2, t_atom(false)};
- pos -> signal_guard_fail(Guard, [Type1, Type2], State)
+ pos -> signal_guard_fail(Eval, Guard, [Type1, Type2], State)
end;
false ->
case Eval of
@@ -2199,29 +2241,29 @@ bind_eqeq_guard(Guard, Arg1, Arg2, Map, Env, Eval, State) ->
end.
bind_eqeq_guard_lit_other(Guard, Arg1, Arg2, Map, Env, State) ->
- %% Assumes positive evaluation
+ Eval = dont_know,
case cerl:concrete(Arg1) of
true ->
{_, Type} = MT = bind_guard(Arg2, Map, Env, pos, State),
case t_is_atom(true, Type) of
true -> MT;
false ->
- {_, Type0} = bind_guard(Arg2, Map, Env, dont_know, State),
- signal_guard_fail(Guard, [Type0, t_atom(true)], State)
+ {_, Type0} = bind_guard(Arg2, Map, Env, Eval, State),
+ signal_guard_fail(Eval, Guard, [Type0, t_atom(true)], State)
end;
false ->
{Map1, Type} = bind_guard(Arg2, Map, Env, neg, State),
case t_is_atom(false, Type) of
true -> {Map1, t_atom(true)};
false ->
- {_, Type0} = bind_guard(Arg2, Map, Env, dont_know, State),
- signal_guard_fail(Guard, [Type0, t_atom(true)], State)
+ {_, Type0} = bind_guard(Arg2, Map, Env, Eval, State),
+ signal_guard_fail(Eval, Guard, [Type0, t_atom(false)], State)
end;
Term ->
LitType = t_from_term(Term),
- {Map1, Type} = bind_guard(Arg2, Map, Env, dont_know, State),
+ {Map1, Type} = bind_guard(Arg2, Map, Env, Eval, State),
case t_is_subtype(LitType, Type) of
- false -> signal_guard_fail(Guard, [Type, LitType], State);
+ false -> signal_guard_fail(Eval, Guard, [Type, LitType], State);
true ->
case cerl:is_c_var(Arg2) of
true -> {enter_type(Arg2, LitType, Map1), t_atom(true)};
@@ -2236,11 +2278,11 @@ handle_guard_and(Guard, Map, Env, Eval, State) ->
pos ->
{Map1, Type1} = bind_guard(Arg1, Map, Env, Eval, State),
case t_is_atom(true, Type1) of
- false -> throw({fail, none});
+ false -> signal_guard_fail(Eval, Guard, [Type1, t_any()], State);
true ->
{Map2, Type2} = bind_guard(Arg2, Map1, Env, Eval, State),
case t_is_atom(true, Type2) of
- false -> throw({fail, none});
+ false -> signal_guard_fail(Eval, Guard, [Type1, Type2], State);
true -> {Map2, t_atom(true)}
end
end;
@@ -2250,31 +2292,37 @@ handle_guard_and(Guard, Map, Env, Eval, State) ->
catch throw:{fail, _} -> bind_guard(Arg2, Map, Env, pos, State)
end,
{Map2, Type2} =
- try bind_guard(Arg1, Map, Env, neg, State)
- catch throw:{fail, _} -> bind_guard(Arg2, Map, Env, pos, State)
+ try bind_guard(Arg2, Map, Env, neg, State)
+ catch throw:{fail, _} -> bind_guard(Arg1, Map, Env, pos, State)
end,
case t_is_atom(false, Type1) orelse t_is_atom(false, Type2) of
true -> {join_maps([Map1, Map2], Map), t_atom(false)};
- false -> throw({fail, none})
+ false -> signal_guard_fail(Eval, Guard, [Type1, Type2], State)
end;
dont_know ->
- True = t_atom(true),
{Map1, Type1} = bind_guard(Arg1, Map, Env, dont_know, State),
- case t_is_none(t_inf(Type1, t_boolean())) of
- true -> throw({fail, none});
+ {Map2, Type2} = bind_guard(Arg2, Map, Env, dont_know, State),
+ Bool1 = t_inf(Type1, t_boolean()),
+ Bool2 = t_inf(Type2, t_boolean()),
+ case t_is_none(Bool1) orelse t_is_none(Bool2) of
+ true -> throw({fatal_fail, none});
false ->
- {Map2, Type2} = bind_guard(Arg2, Map1, Env, Eval, State),
- case t_is_none(t_inf(Type2, t_boolean())) of
- true -> throw({fail, none});
- false -> {Map2, True}
- end
+ NewMap = join_maps([Map1, Map2], Map),
+ NewType =
+ case {t_atom_vals(Bool1), t_atom_vals(Bool2)} of
+ {['true'] , ['true'] } -> t_atom(true);
+ {['false'], _ } -> t_atom(false);
+ {_ , ['false']} -> t_atom(false);
+ {_ , _ } -> t_boolean()
+ end,
+ {NewMap, NewType}
end
end.
handle_guard_or(Guard, Map, Env, Eval, State) ->
[Arg1, Arg2] = cerl:call_args(Guard),
case Eval of
- pos ->
+ pos ->
{Map1, Bool1} =
try bind_guard(Arg1, Map, Env, pos, State)
catch
@@ -2289,25 +2337,36 @@ handle_guard_or(Guard, Map, Env, Eval, State) ->
orelse
(t_is_atom(true, Bool2) andalso t_is_boolean(Bool1))) of
true -> {join_maps([Map1, Map2], Map), t_atom(true)};
- false -> throw({fail, none})
+ false -> signal_guard_fail(Eval, Guard, [Bool1, Bool2], State)
end;
neg ->
{Map1, Type1} = bind_guard(Arg1, Map, Env, neg, State),
case t_is_atom(false, Type1) of
- false -> throw({fail, none});
+ false -> signal_guard_fail(Eval, Guard, [Type1, t_any()], State);
true ->
{Map2, Type2} = bind_guard(Arg2, Map1, Env, neg, State),
case t_is_atom(false, Type2) of
- false -> throw({fail, none});
+ false -> signal_guard_fail(Eval, Guard, [Type1, Type2], State);
true -> {Map2, t_atom(false)}
end
end;
dont_know ->
- {Map1, Bool1} = bind_guard(Arg1, Map, Env, dont_know, State),
- {Map2, Bool2} = bind_guard(Arg2, Map, Env, dont_know, State),
- case t_is_boolean(Bool1) andalso t_is_boolean(Bool2) of
- true -> {join_maps([Map1, Map2], Map), t_sup(Bool1, Bool2)};
- false -> throw({fail, none})
+ {Map1, Type1} = bind_guard(Arg1, Map, Env, dont_know, State),
+ {Map2, Type2} = bind_guard(Arg2, Map, Env, dont_know, State),
+ Bool1 = t_inf(Type1, t_boolean()),
+ Bool2 = t_inf(Type2, t_boolean()),
+ case t_is_none(Bool1) orelse t_is_none(Bool2) of
+ true -> throw({fatal_fail, none});
+ false ->
+ NewMap = join_maps([Map1, Map2], Map),
+ NewType =
+ case {t_atom_vals(Bool1), t_atom_vals(Bool2)} of
+ {['false'], ['false']} -> t_atom(false);
+ {['true'] , _ } -> t_atom(true);
+ {_ , ['true'] } -> t_atom(true);
+ {_ , _ } -> t_boolean()
+ end,
+ {NewMap, NewType}
end
end.
@@ -2318,13 +2377,17 @@ handle_guard_not(Guard, Map, Env, Eval, State) ->
{Map1, Type} = bind_guard(Arg, Map, Env, pos, State),
case t_is_atom(true, Type) of
true -> {Map1, t_atom(false)};
- false -> throw({fail, none})
+ false ->
+ {_, Type0} = bind_guard(Arg, Map, Env, Eval, State),
+ signal_guard_fail(Eval, Guard, [Type0], State)
end;
pos ->
{Map1, Type} = bind_guard(Arg, Map, Env, neg, State),
case t_is_atom(false, Type) of
true -> {Map1, t_atom(true)};
- false -> throw({fail, none})
+ false ->
+ {_, Type0} = bind_guard(Arg, Map, Env, Eval, State),
+ signal_guard_fail(Eval, Guard, [Type0], State)
end;
dont_know ->
{Map1, Type} = bind_guard(Arg, Map, Env, dont_know, State),
@@ -2349,10 +2412,12 @@ bind_guard_list([G|Gs], Map, Env, Eval, State, Acc) ->
bind_guard_list([], Map, _Env, _Eval, _State, Acc) ->
{Map, lists:reverse(Acc)}.
--spec signal_guard_fail(cerl:c_call(), [erl_types:erl_type()], state()) ->
- no_return().
+-type eval() :: 'pos' | 'neg' | 'dont_know'.
-signal_guard_fail(Guard, ArgTypes, State) ->
+-spec signal_guard_fail(eval(), cerl:c_call(), [erl_types:erl_type()],
+ state()) -> no_return().
+
+signal_guard_fail(Eval, Guard, ArgTypes, State) ->
Args = cerl:call_args(Guard),
F = cerl:atom_val(cerl:call_name(Guard)),
MFA = {cerl:atom_val(cerl:call_module(Guard)), F, length(Args)},
@@ -2361,11 +2426,17 @@ signal_guard_fail(Guard, ArgTypes, State) ->
true ->
[ArgType1, ArgType2] = ArgTypes,
[Arg1, Arg2] = Args,
- {guard_fail, [format_args_1([Arg1], [ArgType1], State),
- atom_to_list(F),
- format_args_1([Arg2], [ArgType2], State)]};
+ Kind =
+ case Eval of
+ neg -> neg_guard_fail;
+ pos -> guard_fail;
+ dont_know -> guard_fail
+ end,
+ {Kind, [format_args_1([Arg1], [ArgType1], State),
+ atom_to_list(F),
+ format_args_1([Arg2], [ArgType2], State)]};
false ->
- mk_guard_msg(F, Args, ArgTypes, State)
+ mk_guard_msg(Eval, F, Args, ArgTypes, State)
end,
throw({fail, {Guard, Msg}}).
@@ -2380,20 +2451,25 @@ is_infix_op({erlang, '>=', 2}) -> true;
is_infix_op({M, F, A}) when is_atom(M), is_atom(F),
is_integer(A), 0 =< A, A =< 255 -> false.
--spec signal_guard_fatal_fail(cerl:c_call(), [erl_types:erl_type()], state()) ->
- no_return().
+-spec signal_guard_fatal_fail(eval(), cerl:c_call(), [erl_types:erl_type()],
+ state()) -> no_return().
-signal_guard_fatal_fail(Guard, ArgTypes, State) ->
+signal_guard_fatal_fail(Eval, Guard, ArgTypes, State) ->
Args = cerl:call_args(Guard),
F = cerl:atom_val(cerl:call_name(Guard)),
- Msg = mk_guard_msg(F, Args, ArgTypes, State),
+ Msg = mk_guard_msg(Eval, F, Args, ArgTypes, State),
throw({fatal_fail, {Guard, Msg}}).
-mk_guard_msg(F, Args, ArgTypes, State) ->
+mk_guard_msg(Eval, F, Args, ArgTypes, State) ->
FArgs = [F, format_args(Args, ArgTypes, State)],
case any_has_opaque_subtype(ArgTypes) of
true -> {opaque_guard, FArgs};
- false -> {guard_fail, FArgs}
+ false ->
+ case Eval of
+ neg -> {neg_guard_fail, FArgs};
+ pos -> {guard_fail, FArgs};
+ dont_know -> {guard_fail, FArgs}
+ end
end.
bind_guard_case_clauses(Arg, Clauses, Map, Env, Eval, State) ->
@@ -2741,8 +2817,6 @@ state__new(Callgraph, Tree, Plt, Module, Records, BehaviourTranslations) ->
FunTab = init_fun_tab(Funs, dict:new(), TreeMap, Callgraph, Plt, Opaques),
Work = init_work([get_label(Tree)]),
Env = dict:store(top, map__new(), dict:new()),
- Opaques = erl_types:module_builtin_opaques(Module) ++
- erl_types:t_opaque_from_records(Records),
#state{callgraph = Callgraph, envs = Env, fun_tab = FunTab, opaques = Opaques,
plt = Plt, races = dialyzer_races:new(), records = Records,
warning_mode = false, warnings = [], work = Work, tree_map = TreeMap,
diff --git a/lib/dialyzer/src/dialyzer_gui.erl b/lib/dialyzer/src/dialyzer_gui.erl
index 4436330f7f..ccd80a4835 100644
--- a/lib/dialyzer/src/dialyzer_gui.erl
+++ b/lib/dialyzer/src/dialyzer_gui.erl
@@ -2,7 +2,7 @@
%%------------------------------------------------------------------------
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
diff --git a/lib/dialyzer/src/dialyzer_options.erl b/lib/dialyzer/src/dialyzer_options.erl
index 2c0afa6e2b..b2a67de8bd 100644
--- a/lib/dialyzer/src/dialyzer_options.erl
+++ b/lib/dialyzer/src/dialyzer_options.erl
@@ -2,7 +2,7 @@
%%-----------------------------------------------------------------------
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -47,6 +47,7 @@ build(Opts) ->
?WARN_FAILING_CALL,
?WARN_BIN_CONSTRUCTION,
?WARN_CALLGRAPH,
+ ?WARN_CONTRACT_RANGE,
?WARN_CONTRACT_TYPES,
?WARN_CONTRACT_SYNTAX],
DefaultWarns1 = ordsets:from_list(DefaultWarns),
@@ -120,12 +121,18 @@ build_options([{OptName, undefined}|Rest], Options) when is_atom(OptName) ->
build_options(Rest, Options);
build_options([{OptionName, Value} = Term|Rest], Options) ->
case OptionName of
+ apps ->
+ OldValues = Options#options.files_rec,
+ AppDirs = get_app_dirs(Value),
+ assert_filenames(Term, AppDirs),
+ build_options(Rest, Options#options{files_rec = AppDirs ++ OldValues});
files ->
assert_filenames(Term, Value),
build_options(Rest, Options#options{files = Value});
files_rec ->
+ OldValues = Options#options.files_rec,
assert_filenames(Term, Value),
- build_options(Rest, Options#options{files_rec = Value});
+ build_options(Rest, Options#options{files_rec = Value ++ OldValues});
analysis_type ->
NewOptions =
case Value of
@@ -169,6 +176,9 @@ build_options([{OptionName, Value} = Term|Rest], Options) ->
output_format ->
assert_output_format(Value),
build_options(Rest, Options#options{output_format = Value});
+ filename_opt ->
+ assert_filename_opt(Value),
+ build_options(Rest, Options#options{filename_opt = Value});
output_plt ->
assert_filename(Value),
build_options(Rest, Options#options{output_plt = Value});
@@ -188,6 +198,11 @@ build_options([{OptionName, Value} = Term|Rest], Options) ->
build_options([], Options) ->
Options.
+get_app_dirs(Apps) when is_list(Apps) ->
+ dialyzer_cl_parse:get_lib_dir([atom_to_list(A) || A <- Apps]);
+get_app_dirs(Apps) ->
+ bad_option("Use a list of otp applications", Apps).
+
assert_filenames(Term, [FileName|Left]) when length(FileName) >= 0 ->
case filelib:is_file(FileName) orelse filelib:is_dir(FileName) of
true -> ok;
@@ -218,6 +233,13 @@ assert_output_format(formatted) ->
assert_output_format(Term) ->
bad_option("Illegal value for output_format", Term).
+assert_filename_opt(basename) ->
+ ok;
+assert_filename_opt(fullpath) ->
+ ok;
+assert_filename_opt(Term) ->
+ bad_option("Illegal value for filename_opt", Term).
+
assert_plt_op(#options{analysis_type = OldVal},
#options{analysis_type = NewVal}) ->
case is_plt_mode(OldVal) andalso is_plt_mode(NewVal) of
diff --git a/lib/dialyzer/src/dialyzer_plt.erl b/lib/dialyzer/src/dialyzer_plt.erl
index a7ba270c41..6033d7f17c 100644
--- a/lib/dialyzer/src/dialyzer_plt.erl
+++ b/lib/dialyzer/src/dialyzer_plt.erl
@@ -2,7 +2,7 @@
%%----------------------------------------------------------------------
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -28,8 +28,6 @@
%%%-------------------------------------------------------------------
-module(dialyzer_plt).
-%% Avoid warning for local function error/1 clashing with autoimported BIF.
--compile({no_auto_import,[error/1]}).
-export([check_plt/3,
compute_md5_from_files/1,
contains_mfa/2,
@@ -56,8 +54,7 @@
plt_and_info_from_file/1,
get_specs/1,
get_specs/4,
- to_file/4
- ]).
+ to_file/4]).
%% Debug utilities
-export([pp_non_returning/0, pp_mod/1]).
@@ -68,6 +65,8 @@
-type mod_deps() :: dict().
+-type deep_string() :: string() | [deep_string()].
+
%% The following are used for searching the PLT when using the GUI
%% (e.g. in show or search PLT contents). The user might be searching
%% with a partial specification, in which case the missing items
@@ -203,8 +202,8 @@ get_default_plt() ->
false ->
case os:getenv("HOME") of
false ->
- error("The HOME environment variable needs to be set " ++
- "so that Dialyzer knows where to find the default PLT");
+ plt_error("The HOME environment variable needs to be set " ++
+ "so that Dialyzer knows where to find the default PLT");
HomeDir -> filename:join(HomeDir, ".dialyzer_plt")
end;
UserSpecPlt -> UserSpecPlt
@@ -226,7 +225,7 @@ from_file(FileName, ReturnInfo) ->
case check_version(Rec) of
error ->
Msg = io_lib:format("Old PLT file ~s\n", [FileName]),
- error(Msg);
+ plt_error(Msg);
ok ->
Plt = #plt{info = Rec#file_plt.info,
types = Rec#file_plt.types,
@@ -241,8 +240,9 @@ from_file(FileName, ReturnInfo) ->
end
end;
{error, Reason} ->
- error(io_lib:format("Could not read PLT file ~s: ~p\n",
- [FileName, Reason]))
+ Msg = io_lib:format("Could not read PLT file ~s: ~p\n",
+ [FileName, Reason]),
+ plt_error(Msg)
end.
-type err_rsn() :: 'not_valid' | 'no_such_file' | 'read_error'.
@@ -317,7 +317,7 @@ merge_plts_or_report_conflicts(PltFiles, Plts) ->
Msg = io_lib:format("Could not merge PLTs since they are not disjoint\n"
"The following files are included in more than one "
"PLTs:\n~p\n", [ConfFiles]),
- error(Msg)
+ plt_error(Msg)
end.
find_duplicates(List) ->
@@ -518,7 +518,9 @@ expand_args([ArgType|Left]) ->
end ++
","|expand_args(Left)].
-error(Msg) ->
+-spec plt_error(deep_string()) -> no_return().
+
+plt_error(Msg) ->
throw({dialyzer_error, lists:flatten(Msg)}).
%%---------------------------------------------------------------------------
diff --git a/lib/dialyzer/src/dialyzer_succ_typings.erl b/lib/dialyzer/src/dialyzer_succ_typings.erl
index 8bfc66fc39..b8da57d3f9 100644
--- a/lib/dialyzer/src/dialyzer_succ_typings.erl
+++ b/lib/dialyzer/src/dialyzer_succ_typings.erl
@@ -2,7 +2,7 @@
%%-----------------------------------------------------------------------
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -131,8 +131,9 @@ get_warnings_from_modules([M|Ms], State, DocPlt,
%% Check if there are contracts for functions that do not exist
Warnings1 =
dialyzer_contracts:contracts_without_fun(Contracts, AllFuns, Callgraph),
- {Warnings2, FunTypes, RaceCode, PublicTables, NamedTables} =
+ {RawWarnings2, FunTypes, RaceCode, PublicTables, NamedTables} =
dialyzer_dataflow:get_warnings(ModCode, Plt, Callgraph, Records, NoWarnUnused),
+ {NewAcc, Warnings2} = postprocess_dataflow_warns(RawWarnings2, State, Acc),
Attrs = cerl:module_attrs(ModCode),
Warnings3 = if BehavioursChk ->
dialyzer_behaviours:check_callbacks(M, Attrs,
@@ -145,10 +146,36 @@ get_warnings_from_modules([M|Ms], State, DocPlt,
NamedTables),
State1 = st__renew_state_calls(NewCallgraph, State),
get_warnings_from_modules(Ms, State1, NewDocPlt, BehavioursChk,
- [Warnings1, Warnings2, Warnings3|Acc]);
+ [Warnings1, Warnings2, Warnings3|NewAcc]);
get_warnings_from_modules([], #st{plt = Plt}, DocPlt, _, Acc) ->
{lists:flatten(Acc), Plt, DocPlt}.
+postprocess_dataflow_warns(RawWarnings, State, WarnAcc) ->
+ postprocess_dataflow_warns(RawWarnings, State, WarnAcc, []).
+
+postprocess_dataflow_warns([], _State, WAcc, Acc) ->
+ {WAcc, lists:reverse(Acc)};
+postprocess_dataflow_warns([{?WARN_CONTRACT_RANGE, {CallF, CallL}, Msg}|Rest],
+ #st{codeserver = Codeserver} = State, WAcc, Acc) ->
+ {contract_range, [Contract, M, F, A, ArgStrings, CRet]} = Msg,
+ {ok, {{ContrF, _ContrL} = FileLine, _C}} =
+ dialyzer_codeserver:lookup_mfa_contract({M,F,A}, Codeserver),
+ case CallF =:= ContrF of
+ true ->
+ NewMsg = {contract_range, [Contract, M, F, ArgStrings, CallL, CRet]},
+ W = {?WARN_CONTRACT_RANGE, FileLine, NewMsg},
+ Filter =
+ fun({?WARN_CONTRACT_TYPES, FL, _}) when FL =:= FileLine -> false;
+ (_) -> true
+ end,
+ FilterWAcc = lists:filter(Filter, WAcc),
+ postprocess_dataflow_warns(Rest, State, FilterWAcc, [W|Acc]);
+ false ->
+ postprocess_dataflow_warns(Rest, State, WAcc, Acc)
+ end;
+postprocess_dataflow_warns([W|Rest], State, Wacc, Acc) ->
+ postprocess_dataflow_warns(Rest, State, Wacc, [W|Acc]).
+
refine_succ_typings(ModulePostorder, State) ->
?debug("Module postorder: ~p\n", [ModulePostorder]),
refine_succ_typings(ModulePostorder, State, []).
diff --git a/lib/dialyzer/src/dialyzer_typesig.erl b/lib/dialyzer/src/dialyzer_typesig.erl
index f68472d2fc..c45615d670 100644
--- a/lib/dialyzer/src/dialyzer_typesig.erl
+++ b/lib/dialyzer/src/dialyzer_typesig.erl
@@ -1406,9 +1406,13 @@ get_bif_constr({erlang, 'or', 2}, Dst, [Arg1, Arg2] = Args, _State) ->
ArgV1 = mk_fun_var(ArgFun(Arg2), [Arg2, Dst]),
ArgV2 = mk_fun_var(ArgFun(Arg1), [Arg1, Dst]),
DstV = mk_fun_var(DstFun, Args),
- Disj = mk_disj_constraint_list([mk_constraint(Arg1, sub, True),
- mk_constraint(Arg2, sub, True),
- mk_constraint(Dst, sub, False)]),
+ F = fun(A) ->
+ try [mk_constraint(A, sub, True)]
+ catch throw:error -> []
+ end
+ end,
+ Constrs = F(Arg1) ++ F(Arg2),
+ Disj = mk_disj_constraint_list([mk_constraint(Dst, sub, False)|Constrs]),
mk_conj_constraint_list([mk_constraint(Dst, sub, DstV),
mk_constraint(Arg1, sub, ArgV1),
mk_constraint(Arg2, sub, ArgV2),
diff --git a/lib/dialyzer/src/dialyzer_utils.erl b/lib/dialyzer/src/dialyzer_utils.erl
index 248fdf6835..12f8dec67e 100644
--- a/lib/dialyzer/src/dialyzer_utils.erl
+++ b/lib/dialyzer/src/dialyzer_utils.erl
@@ -2,7 +2,7 @@
%%-----------------------------------------------------------------------
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -214,14 +214,13 @@ get_record_and_type_info([], _Module, Records, RecDict) ->
?debug(_NewRecDict),
Ok;
{error, Name, Error} ->
- {error, lists:flatten(io_lib:format(" Error while parsing #~w{}: ~s\n",
- [Name, Error]))}
+ {error, flat_format(" Error while parsing #~w{}: ~s\n", [Name, Error])}
end.
add_new_type(TypeOrOpaque, Name, TypeForm, ArgForms, Module, RecDict) ->
case erl_types:type_is_defined(TypeOrOpaque, Name, RecDict) of
true ->
- throw({error, io_lib:format("Type already defined: ~w\n", [Name])});
+ throw({error, flat_format("Type ~s already defined\n", [Name])});
false ->
ArgTypes = [erl_types:t_from_form(X) || X <- ArgForms],
case lists:all(fun erl_types:t_is_var/1, ArgTypes) of
@@ -229,8 +228,8 @@ add_new_type(TypeOrOpaque, Name, TypeForm, ArgForms, Module, RecDict) ->
ArgNames = [erl_types:t_var_name(X) || X <- ArgTypes],
dict:store({TypeOrOpaque, Name}, {Module, TypeForm, ArgNames}, RecDict);
false ->
- throw({error, io_lib:format("Type declaration for ~w does not "
- "have variables as parameters", [Name])})
+ throw({error, flat_format("Type declaration for ~w does not "
+ "have variables as parameters", [Name])})
end
end.
@@ -338,14 +337,14 @@ get_spec_info([{attribute, Ln, spec, {Id, TypeSpec}}|Left],
get_spec_info(Left, NewSpecDict, RecordsDict, ModName, File);
{ok, {{OtherFile, L},_C}} ->
{Mod, Fun, Arity} = MFA,
- Msg = io_lib:format(" Contract for function ~w:~w/~w "
- "already defined in ~s:~w\n",
- [Mod, Fun, Arity, OtherFile, L]),
+ Msg = flat_format(" Contract for function ~w:~w/~w "
+ "already defined in ~s:~w\n",
+ [Mod, Fun, Arity, OtherFile, L]),
throw({error, Msg})
catch
throw:{error, Error} ->
- {error, lists:flatten(io_lib:format(" Error while parsing contract "
- "in line ~w: ~s\n", [Ln, Error]))}
+ {error, flat_format(" Error while parsing contract in line ~w: ~s\n",
+ [Ln, Error])}
end;
get_spec_info([{attribute, _, file, {IncludeFile, _}}|Left],
SpecDict, RecordsDict, ModName, _File) ->
@@ -419,6 +418,9 @@ format_sig(Type, RecDict) ->
")" ++ RevSig = lists:reverse(Sig),
lists:reverse(RevSig).
+flat_format(Fmt, Lst) ->
+ lists:flatten(io_lib:format(Fmt, Lst)).
+
%%-------------------------------------------------------------------
%% Author : Per Gustafsson <[email protected]>
%% Description : Provides better printing of binaries.
diff --git a/lib/dialyzer/test/Makefile b/lib/dialyzer/test/Makefile
new file mode 100644
index 0000000000..69a8fd742e
--- /dev/null
+++ b/lib/dialyzer/test/Makefile
@@ -0,0 +1,34 @@
+include $(ERL_TOP)/make/target.mk
+include $(ERL_TOP)/make/$(TARGET)/otp.mk
+
+# ----------------------------------------------------
+# Files
+# ----------------------------------------------------
+
+AUXILIARY_FILES=\
+ dialyzer.spec\
+ dialyzer_test_constants.hrl\
+ dialyzer_common.erl\
+ file_utils.erl\
+ plt_SUITE.erl
+
+# ----------------------------------------------------
+# Release directory specification
+# ----------------------------------------------------
+
+RELSYSDIR = $(RELEASE_PATH)/dialyzer_test
+
+# ----------------------------------------------------
+# Release Target
+# ----------------------------------------------------
+
+include $(ERL_TOP)/make/otp_release_targets.mk
+
+release_tests_spec:
+ $(INSTALL_DIR) $(RELSYSDIR)
+ chmod -f -R u+w $(RELSYSDIR)
+ $(INSTALL_DATA) $(AUXILIARY_FILES) $(RELSYSDIR)
+ @tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
+ cd $(RELSYSDIR);\
+ erl -make;\
+ erl -noshell -run dialyzer_common create_all_suites -s erlang halt
diff --git a/lib/dialyzer/test/README b/lib/dialyzer/test/README
new file mode 100644
index 0000000000..41f282a131
--- /dev/null
+++ b/lib/dialyzer/test/README
@@ -0,0 +1,38 @@
+-------------------------------
+To add test cases in any suite:
+-------------------------------
+
+ 1) If the test requires Dialyzer to analyze a single file (TEST.erl) place it
+ in the suite's 'src' directory. If analysis of more files is needed place
+ them all in a new directory (TEST) in suite's 'src' directory.
+
+ 2) Create a file named TEST containing the expected result in suite's 'result'
+ directory.
+
+----------------------
+To create a new suite:
+----------------------
+
+ 1) Create a directory with the suffix '_SUITE_data'. The name should
+ describe the suite.
+
+ 2) In the suite's directory create subdirectories 'src' and 'results' as
+ well as a 'dialyzer_options' file with the following content:
+
+ {dialyzer_options, List}.
+ {time_limit, Limit}.
+
+ where:
+
+ List = a list of Dialyzer options. Common case will be something
+ like [{warnings, Warnings}], where Warnings is a list of valid
+ '-W' prefixed dialyzer options without the 'W' prefix (e.g.
+ '-Wfoo' would be declared as [{warnings, [foo]}].
+ Limit = the amount of time (in minutes) each test case is allowed to
+ run. Must be greater than the time required to complete the most
+ time-consuming test in the suite.
+
+ Any of these lines may be missing. Default options list is empty and
+ default time limit is 1 minute.
+
+ 3) Add tests as described in previous section.
diff --git a/lib/dialyzer/test/callgraph_SUITE_data/dialyzer_options b/lib/dialyzer/test/callgraph_SUITE_data/dialyzer_options
new file mode 100644
index 0000000000..50991c9bc5
--- /dev/null
+++ b/lib/dialyzer/test/callgraph_SUITE_data/dialyzer_options
@@ -0,0 +1 @@
+{dialyzer_options, []}.
diff --git a/lib/dialyzer/test/callgraph_SUITE_data/results/test_missing_functions b/lib/dialyzer/test/callgraph_SUITE_data/results/test_missing_functions
new file mode 100644
index 0000000000..4150bdb7c0
--- /dev/null
+++ b/lib/dialyzer/test/callgraph_SUITE_data/results/test_missing_functions
@@ -0,0 +1,3 @@
+
+t1.erl:16: Call to missing or unexported function t2:t2/1
+t2.erl:13: Call to missing or unexported function t1:t3/1
diff --git a/lib/dialyzer/test/callgraph_SUITE_data/src/test_missing_functions/t1.erl b/lib/dialyzer/test/callgraph_SUITE_data/src/test_missing_functions/t1.erl
new file mode 100644
index 0000000000..05ba9b0f93
--- /dev/null
+++ b/lib/dialyzer/test/callgraph_SUITE_data/src/test_missing_functions/t1.erl
@@ -0,0 +1,16 @@
+%%%-------------------------------------------------------------------
+%%% File : t1.erl
+%%% Author : Tobias Lindahl <[email protected]>
+%%% Description :
+%%%
+%%% Created : 26 Jul 2006 by Tobias Lindahl <[email protected]>
+%%%-------------------------------------------------------------------
+-module(t1).
+
+-export([t1/1, t2/1]).
+
+t1(X) ->
+ t2:t1(X).
+
+t2(X) ->
+ t2:t2(X).
diff --git a/lib/dialyzer/test/callgraph_SUITE_data/src/test_missing_functions/t2.erl b/lib/dialyzer/test/callgraph_SUITE_data/src/test_missing_functions/t2.erl
new file mode 100644
index 0000000000..bf940fd181
--- /dev/null
+++ b/lib/dialyzer/test/callgraph_SUITE_data/src/test_missing_functions/t2.erl
@@ -0,0 +1,16 @@
+%%%-------------------------------------------------------------------
+%%% File : t2.erl
+%%% Author : Tobias Lindahl <[email protected]>
+%%% Description :
+%%%
+%%% Created : 26 Jul 2006 by Tobias Lindahl <[email protected]>
+%%%-------------------------------------------------------------------
+-module(t2).
+
+-export([t1/1]).
+
+t1(X) ->
+ t1:t3(X) + t2(X).
+
+t2(X) ->
+ X + 1.
diff --git a/lib/dialyzer/test/dialyzer.spec b/lib/dialyzer/test/dialyzer.spec
new file mode 100644
index 0000000000..497a502bb8
--- /dev/null
+++ b/lib/dialyzer/test/dialyzer.spec
@@ -0,0 +1,5 @@
+{alias, tests, "../dialyzer_test"}.
+
+{suites, tests, all}.
+
+{skip_cases, tests, small_SUITE, cerl_hipeify, "Needs compiler in plt"}.
diff --git a/lib/dialyzer/test/dialyzer_common.erl b/lib/dialyzer/test/dialyzer_common.erl
new file mode 100644
index 0000000000..51766a4604
--- /dev/null
+++ b/lib/dialyzer/test/dialyzer_common.erl
@@ -0,0 +1,377 @@
+%%% File : dialyzer_common.erl
+%%% Author : Stavros Aronis <[email protected]>
+%%% Description : Generator and common infrastructure for simple dialyzer
+%%% test suites (some options, some input files or directories
+%%% and the relevant results).
+%%% Created : 11 Jun 2010 by Stavros Aronis <stavros@enjoy>
+
+-module(dialyzer_common).
+
+-export([check_plt/1, check/4, create_all_suites/0, new_tests/2]).
+
+-include_lib("kernel/include/file.hrl").
+
+-define(suite_suffix, "_SUITE").
+-define(data_folder, "_data").
+-define(suite_data, ?suite_suffix ++ ?data_folder).
+-define(erlang_extension, ".erl").
+-define(output_file_mode, write).
+-define(dialyzer_option_file, "dialyzer_options").
+-define(input_files_directory, "src").
+-define(result_files_directory, "results").
+-define(plt_filename,"dialyzer_plt").
+-define(home_plt_filename,".dialyzer_plt").
+-define(plt_lockfile,"plt_lock").
+-define(required_modules, [erts, kernel, stdlib]).
+
+-record(suite, {suitename :: string(),
+ outputfile :: file:io_device(),
+ options :: options(),
+ testcases :: [testcase()]}).
+
+-record(options, {time_limit = 1 :: integer(),
+ dialyzer_options = [] :: dialyzer:dial_options()}).
+
+-type options() :: #options{}.
+-type testcase() :: {atom(), 'file' | 'dir'}.
+
+-spec check_plt(string()) -> ok.
+
+check_plt(OutDir) ->
+ io:format("Checking plt:"),
+ PltFilename = filename:join(OutDir, ?plt_filename),
+ case file:read_file_info(PltFilename) of
+ {ok, _} -> dialyzer_check_plt(PltFilename);
+ {error, _ } ->
+ io:format("No plt found in test run directory!"),
+ PltLockFile = filename:join(OutDir, ?plt_lockfile),
+ case file:read_file_info(PltLockFile) of
+ {ok, _} ->
+ explain_fail_with_lock(),
+ fail;
+ {error, _} ->
+ io:format("Locking plt generation."),
+ case file:open(PltLockFile,[?output_file_mode]) of
+ {ok, OutFile} ->
+ io:format(OutFile,"Locking plt generation.",[]),
+ file:close(OutFile);
+ {error, Reason} ->
+ io:format("Couldn't write lock file ~p.",[Reason]),
+ fail
+ end,
+ obtain_plt(PltFilename)
+ end
+ end.
+
+dialyzer_check_plt(PltFilename) ->
+ try dialyzer:run([{analysis_type, plt_check},
+ {init_plt, PltFilename}]) of
+ [] -> ok
+ catch
+ Class:Info ->
+ io:format("Failed. The error was: ~w\n~p",[Class, Info]),
+ io:format("A previously run dialyzer suite failed to generate"
+ " a correct plt."),
+ fail
+ end.
+
+explain_fail_with_lock() ->
+ io:format("Some other suite started creating a plt. It might not have"
+ " finished (Dialyzer's suites shouldn't run in parallel), or"
+ " it reached timeout and was killed (in which case"
+ " plt_timeout, defined in dialyzer_test_constants.hrl"
+ " should be increased), or it failed.").
+
+obtain_plt(PltFilename) ->
+ io:format("Obtaining plt:"),
+ HomeDir = os:getenv("HOME"),
+ HomePlt = filename:join(HomeDir, ?home_plt_filename),
+ io:format("Will try to use ~s as a starting point and add otp apps ~w.",
+ [HomePlt, ?required_modules]),
+ try dialyzer:run([{analysis_type, plt_add},
+ {apps, ?required_modules},
+ {output_plt, PltFilename},
+ {init_plt, HomePlt}]) of
+ [] ->
+ io:format("Successfully added everything!"),
+ ok
+ catch
+ Class:Reason ->
+ io:format("Failed. The error was: ~w\n~p",[Class, Reason]),
+ build_plt(PltFilename)
+ end.
+
+build_plt(PltFilename) ->
+ io:format("Building plt from scratch:"),
+ try dialyzer:run([{analysis_type, plt_build},
+ {apps, ?required_modules},
+ {output_plt, PltFilename}]) of
+ [] ->
+ io:format("Successfully created plt!"),
+ ok
+ catch
+ Class:Reason ->
+ io:format("Failed. The error was: ~w\n~p",[Class, Reason]),
+ fail
+ end.
+
+-spec check(atom(), dialyzer:dial_options(), string(), string()) ->
+ 'same' | {differ, [term()]}.
+
+check(TestCase, Opts, Dir, OutDir) ->
+ PltFilename = filename:join(OutDir, ?plt_filename),
+ SrcDir = filename:join(Dir, ?input_files_directory),
+ ResDir = filename:join(Dir, ?result_files_directory),
+ Filename = filename:join(SrcDir, atom_to_list(TestCase)),
+ Files =
+ case file_utils:file_type(Filename) of
+ {ok, 'directory'} ->
+ {ok, ListFiles} = file_utils:list_dir(Filename, ".erl",
+ false),
+ ListFiles;
+ {error, _} ->
+ FilenameErl = Filename ++ ".erl",
+ case file_utils:file_type(FilenameErl) of
+ {ok, 'regular'} -> [FilenameErl]
+ end
+ end,
+ ResFile = atom_to_list(TestCase),
+ NewResFile = filename:join(OutDir, ResFile),
+ OldResFile = filename:join(ResDir, ResFile),
+ ProperOpts = fix_options(Opts, Dir),
+ try dialyzer:run([{files, Files},{from, src_code},{init_plt, PltFilename},
+ {check_plt, false}|ProperOpts]) of
+ RawWarns ->
+ Warns = lists:sort([dialyzer:format_warning(W) || W <- RawWarns]),
+ case Warns of
+ [] -> ok;
+ _ ->
+ case file:open(NewResFile,[?output_file_mode]) of
+ {ok, OutFile} ->
+ io:format(OutFile,"\n~s",[Warns]),
+ file:close(OutFile);
+ Other -> erlang:error(Other)
+ end
+ end,
+ case file_utils:diff(NewResFile, OldResFile) of
+ 'same' -> file:delete(NewResFile),
+ 'same';
+ Any -> escape_strings(Any)
+ end
+ catch
+ Kind:Error -> {'dialyzer crashed', Kind, Error}
+ end.
+
+fix_options(Opts, Dir) ->
+ fix_options(Opts, Dir, []).
+
+fix_options([], _Dir, Acc) ->
+ Acc;
+fix_options([{pa, Path} | Rest], Dir, Acc) ->
+ case code:add_patha(filename:join(Dir, Path)) of
+ true -> fix_options(Rest, Dir, Acc);
+ {error, _} -> erlang:error("Bad directory for pa: " ++ Path)
+ end;
+fix_options([{DirOption, RelativeDirs} | Rest], Dir, Acc)
+ when DirOption =:= include_dirs ;
+ DirOption =:= files_rec ;
+ DirOption =:= files ->
+ ProperRelativeDirs = [filename:join(Dir,RDir) || RDir <- RelativeDirs],
+ fix_options(Rest, Dir, [{include_dirs, ProperRelativeDirs} | Acc]);
+fix_options([Opt | Rest], Dir, Acc) ->
+ fix_options(Rest, Dir, [Opt | Acc]).
+
+-spec new_tests(string(), [atom()]) -> [atom()].
+
+new_tests(Dirname, DeclaredTestcases) ->
+ SrcDir = filename:join(Dirname, ?input_files_directory),
+ get_testcases(SrcDir) -- DeclaredTestcases.
+
+get_testcases(Dirname) ->
+ {ok, Files} = file_utils:list_dir(Dirname, ".erl", true),
+ [list_to_atom(filename:basename(F,".erl")) || F <-Files].
+
+-spec create_all_suites() -> 'ok'.
+
+create_all_suites() ->
+ {ok, Cwd} = file:get_cwd(),
+ Suites = get_suites(Cwd),
+ lists:foreach(fun create_suite/1, Suites).
+
+escape_strings({differ,List}) ->
+ Map = fun({T,L,S}) -> {T,L,xmerl_lib:export_text(S)} end,
+ {differ, lists:keysort(3, lists:map(Map, List))}.
+
+-spec get_suites(file:filename()) -> [string()].
+
+get_suites(Dir) ->
+ case file:list_dir(Dir) of
+ {error, _} -> [];
+ {ok, Filenames} ->
+ FullFilenames = [filename:join(Dir, F) || F <-Filenames ],
+ Dirs = [suffix(filename:basename(F), ?suite_data) ||
+ F <- FullFilenames,
+ file_utils:file_type(F) =:= {ok, 'directory'}],
+ [S || {yes, S} <- Dirs]
+ end.
+
+suffix(String, Suffix) ->
+ Index = string:rstr(String, Suffix),
+ case string:substr(String, Index) =:= Suffix of
+ true -> {yes, string:sub_string(String,1,Index-1)};
+ false -> no
+ end.
+
+-spec create_suite(string()) -> 'ok'.
+
+create_suite(SuiteName) ->
+ {ok, Cwd} = file:get_cwd(),
+ SuiteDirN = generate_suite_dir_from_name(Cwd, SuiteName),
+ OutputFile = generate_suite_file(Cwd, SuiteName),
+ {OptionsFileN, InputDirN} = check_neccessary_files(SuiteDirN),
+ generate_suite(SuiteName, OutputFile, OptionsFileN, InputDirN).
+
+generate_suite_dir_from_name(Cwd, SuiteName) ->
+ filename:join(Cwd, SuiteName ++ ?suite_data).
+
+generate_suite_file(Cwd, SuiteName) ->
+ OutputFilename =
+ filename:join(Cwd, SuiteName ++ ?suite_suffix ++ ?erlang_extension),
+ case file:open(OutputFilename, [?output_file_mode]) of
+ {ok, IoDevice} -> IoDevice;
+ {error, _} = E -> exit({E, OutputFilename})
+ end.
+
+check_neccessary_files(SuiteDirN) ->
+ InputDirN = filename:join(SuiteDirN, ?input_files_directory),
+ check_file_exists(InputDirN, directory),
+ OptionsFileN = filename:join(SuiteDirN, ?dialyzer_option_file),
+ check_file_exists(OptionsFileN, regular),
+ {OptionsFileN, InputDirN}.
+
+check_file_exists(Filename, Type) ->
+ case file:read_file_info(Filename) of
+ {ok, FileInfo} ->
+ case FileInfo#file_info.type of
+ Type -> ok;
+ Else -> exit({error, {wrong_input_file_type, Else}})
+ end;
+ {error, _} = E -> exit({E, Filename, Type})
+ end.
+
+generate_suite(SuiteName, OutputFile, OptionsFileN, InputDirN) ->
+ Options = read_options(OptionsFileN),
+ TestCases = list_testcases(InputDirN),
+ Suite = #suite{suitename = SuiteName, outputfile = OutputFile,
+ options = Options, testcases = TestCases},
+ write_suite(Suite),
+ file:close(OutputFile).
+
+read_options(OptionsFileN) ->
+ case file:consult(OptionsFileN) of
+ {ok, Opts} -> read_options(Opts, #options{});
+ _ = E -> exit({error, {incorrect_options_file, E}})
+ end.
+
+read_options([List], Options) when is_list(List) ->
+ read_options(List, Options);
+read_options([], Options) ->
+ Options;
+read_options([{time_limit, TimeLimit}|Opts], Options) ->
+ read_options(Opts, Options#options{time_limit = TimeLimit});
+read_options([{dialyzer_options, DialyzerOptions}|Opts], Options) ->
+ read_options(Opts, Options#options{dialyzer_options = DialyzerOptions}).
+
+list_testcases(Dirname) ->
+ {ok, Files} = file_utils:list_dir(Dirname, ".erl", true),
+ [list_to_atom(filename:basename(F,".erl")) || F <-Files].
+
+write_suite(Suite) ->
+ write_header(Suite),
+ write_consistency(Suite),
+ write_testcases(Suite).
+
+write_header(#suite{suitename = SuiteName, outputfile = OutputFile,
+ options = Options, testcases = TestCases}) ->
+ Test_Plus_Consistency =
+ [list_to_atom(SuiteName ++ ?suite_suffix ++ "_consistency")|TestCases],
+ Exports = format_export(Test_Plus_Consistency),
+ TimeLimit = Options#options.time_limit,
+ DialyzerOptions = Options#options.dialyzer_options,
+ io:format(OutputFile,
+ "%% ATTENTION!\n"
+ "%% This is an automatically generated file. Do not edit.\n"
+ "%% Use './remake' script to refresh it if needed.\n"
+ "%% All Dialyzer options should be defined in dialyzer_options\n"
+ "%% file.\n\n"
+ "-module(~s).\n\n"
+ "-include_lib(\"common_test/include/ct.hrl\").\n"
+ "-include(\"dialyzer_test_constants.hrl\").\n\n"
+ "-export([suite/0, init_per_suite/0, init_per_suite/1,\n"
+ " end_per_suite/1, all/0]).\n"
+ "~s\n\n"
+ "suite() ->\n"
+ " [{timetrap, {minutes, ~w}}].\n\n"
+ "init_per_suite() ->\n"
+ " [{timetrap, ?plt_timeout}].\n"
+ "init_per_suite(Config) ->\n"
+ " OutDir = ?config(priv_dir, Config),\n"
+ " case dialyzer_common:check_plt(OutDir) of\n"
+ " fail -> {skip, \"Plt creation/check failed.\"};\n"
+ " ok -> [{dialyzer_options, ~p}|Config]\n"
+ " end.\n\n"
+ "end_per_suite(_Config) ->\n"
+ " ok.\n\n"
+ "all() ->\n"
+ " ~p.\n\n"
+ "dialyze(Config, TestCase) ->\n"
+ " Opts = ?config(dialyzer_options, Config),\n"
+ " Dir = ?config(data_dir, Config),\n"
+ " OutDir = ?config(priv_dir, Config),\n"
+ " dialyzer_common:check(TestCase, Opts, Dir, OutDir)."
+ "\n\n"
+ ,[SuiteName ++ ?suite_suffix, Exports, TimeLimit,
+ DialyzerOptions, Test_Plus_Consistency]).
+
+format_export(TestCases) ->
+ TestCasesArity =
+ [list_to_atom(atom_to_list(N)++"/1") || N <- TestCases],
+ TestCaseString = io_lib:format("-export(~p).", [TestCasesArity]),
+ strip_quotes(lists:flatten(TestCaseString),[]).
+
+strip_quotes([], Result) ->
+ lists:reverse(Result);
+strip_quotes([$' |Rest], Result) ->
+ strip_quotes(Rest, Result);
+strip_quotes([$\, |Rest], Result) ->
+ strip_quotes(Rest, [$\ , $\, |Result]);
+strip_quotes([C|Rest], Result) ->
+ strip_quotes(Rest, [C|Result]).
+
+write_consistency(#suite{suitename = SuiteName, outputfile = OutputFile}) ->
+ write_consistency(SuiteName, OutputFile).
+
+write_consistency(SuiteName, OutputFile) ->
+ io:format(OutputFile,
+ "~s_consistency(Config) ->\n"
+ " Dir = ?config(data_dir, Config),\n"
+ " case dialyzer_common:new_tests(Dir, all()) of\n"
+ " [] -> ok;\n"
+ " New -> ct:fail({missing_tests,New})\n"
+ " end.\n\n",
+ [SuiteName ++ ?suite_suffix]).
+
+write_testcases(#suite{outputfile = OutputFile, testcases = TestCases}) ->
+ write_testcases(OutputFile, TestCases).
+
+write_testcases(OutputFile, [TestCase| Rest]) ->
+ io:format(OutputFile,
+ "~p(Config) ->\n"
+ " case dialyze(Config, ~p) of\n"
+ " 'same' -> 'same';\n"
+ " Error -> ct:fail(Error)\n"
+ " end.\n\n",
+ [TestCase, TestCase]),
+ write_testcases(OutputFile, Rest);
+write_testcases(_OutputFile, []) ->
+ ok.
diff --git a/lib/dialyzer/test/dialyzer_test_constants.hrl b/lib/dialyzer/test/dialyzer_test_constants.hrl
new file mode 100644
index 0000000000..5672327724
--- /dev/null
+++ b/lib/dialyzer/test/dialyzer_test_constants.hrl
@@ -0,0 +1 @@
+-define(plt_timeout, {hours, 2}).
diff --git a/lib/dialyzer/test/file_utils.erl b/lib/dialyzer/test/file_utils.erl
new file mode 100644
index 0000000000..36b368760c
--- /dev/null
+++ b/lib/dialyzer/test/file_utils.erl
@@ -0,0 +1,155 @@
+-module(file_utils).
+
+-export([list_dir/3, file_type/1, diff/2]).
+
+-include_lib("kernel/include/file.hrl").
+
+-type ext_posix()::posix()|'badarg'.
+-type posix()::atom().
+
+-spec list_dir(file:filename(), string(), boolean()) ->
+ {error, ext_posix()} | {ok, [file:filename()]}.
+
+list_dir(Dir, Extension, Dirs) ->
+ case file:list_dir(Dir) of
+ {error, _} = Error-> Error;
+ {ok, Filenames} ->
+ FullFilenames = [filename:join(Dir, F) || F <-Filenames ],
+ Matches1 = case Dirs of
+ true ->
+ [F || F <- FullFilenames,
+ file_type(F) =:= {ok, 'directory'}];
+ false -> []
+ end,
+ Matches2 = [F || F <- FullFilenames,
+ file_type(F) =:= {ok, 'regular'},
+ filename:extension(F) =:= Extension],
+ {ok, lists:sort(Matches1 ++ Matches2)}
+ end.
+
+-spec file_type(file:filename()) ->
+ {ok, 'device' | 'directory' | 'regular' | 'other'} |
+ {error, ext_posix()}.
+
+file_type(Filename) ->
+ case file:read_file_info(Filename) of
+ {ok, FI} -> {ok, FI#file_info.type};
+ Error -> Error
+ end.
+
+-type diff_result()::'same' | {'differ', diff_list()} |
+ {error, {file:filename(), term()}}.
+-type diff_list()::[{id(), line(), string()}].
+-type id()::'new'|'old'.
+-type line()::non_neg_integer().
+
+-spec diff(file:filename(), file:filename()) -> diff_result().
+
+diff(Filename1, Filename2) ->
+ File1 =
+ case file:open(Filename1, [read]) of
+ {ok, F1} -> {file, F1};
+ _ -> empty
+ end,
+ File2 =
+ case file:open(Filename2, [read]) of
+ {ok, F2} -> {file, F2};
+ _ -> empty
+ end,
+ case diff1(File1, File2) of
+ {error, {N, Error}} ->
+ case N of
+ 1 -> {error, {Filename1, Error}};
+ 2 -> {error, {Filename2, Error}}
+ end;
+ [] -> 'same';
+ DiffList -> {'differ', DiffList}
+ end.
+
+diff1(File1, File2) ->
+ case file_to_lines(File1) of
+ {error, Error} -> {error, {1, Error}};
+ Lines1 ->
+ case file_to_lines(File2) of
+ {error, Error} -> {error, {2, Error}};
+ Lines2 ->
+ Common = lcs_fast(Lines1, Lines2),
+ diff2(Lines1, 1, Lines2, 1, Common, [])
+ end
+ end.
+
+diff2([], _, [], _, [], Acc) -> lists:keysort(2,Acc);
+diff2([H1|T1], N1, [], N2, [], Acc) ->
+ diff2(T1, N1+1, [], N2, [], [{new, N1, H1}|Acc]);
+diff2([], N1, [H2|T2], N2, [], Acc) ->
+ diff2([], N1, T2, N2+1, [], [{old, N2, H2}|Acc]);
+diff2([H1|T1], N1, [H2|T2], N2, [], Acc) ->
+ diff2(T1, N1+1, T2, N2+1, [], [{new, N1, H1}, {old, N2, H2}|Acc]);
+diff2([H1|T1]=L1, N1, [H2|T2]=L2, N2, [HC|TC]=LC, Acc) ->
+ case H1 =:= H2 of
+ true -> diff2(T1, N1+1, T2, N2+1, TC, Acc);
+ false ->
+ case H1 =:= HC of
+ true -> diff2(L1, N1, T2, N2+1, LC, [{old, N2, H2}|Acc]);
+ false -> diff2(T1, N1+1, L2, N2, LC, [{new, N1, H1}|Acc])
+ end
+ end.
+
+-spec lcs_fast([string()], [string()]) -> [string()].
+
+lcs_fast(S1, S2) ->
+ M = length(S1),
+ N = length(S2),
+ Acc = array:new(M*N, {default, 0}),
+ {L, _} = lcs_fast(S1, S2, 1, 1, N, Acc),
+ L.
+
+-spec lcs_fast([string()], [string()],
+ pos_integer(), pos_integer(),
+ non_neg_integer(), array()) -> {[string()], array()}.
+
+lcs_fast([], _, _, _, _, Acc) ->
+ {[], Acc};
+lcs_fast(_, [], _, _, _, Acc) ->
+ {[], Acc};
+lcs_fast([H1|T1] = S1, [H2|T2] = S2, N1, N2, N, Acc) ->
+ I = (N1-1) * N + N2 - 1,
+ case array:get(I, Acc) of
+ 0 ->
+ case string:equal(H1, H2) of
+ true ->
+ {T, NAcc} = lcs_fast(T1, T2, N1+1, N2+1, N, Acc),
+ L = [H1|T],
+ {L, array:set(I, L, NAcc)};
+ false ->
+ {L1, NAcc1} = lcs_fast(S1, T2, N1, N2+1, N, Acc),
+ {L2, NAcc2} = lcs_fast(T1, S2, N1+1, N2, N, NAcc1),
+ L = longest(L1, L2),
+ {L, array:set(I, L, NAcc2)}
+ end;
+ L ->
+ {L, Acc}
+ end.
+
+-spec longest([string()], [string()]) -> [string()].
+
+longest(S1, S2) ->
+ case length(S1) > length(S2) of
+ true -> S1;
+ false -> S2
+ end.
+
+file_to_lines(empty) ->
+ [];
+file_to_lines({file, File}) ->
+ case file_to_lines(File, []) of
+ {error, _} = Error -> Error;
+ Lines -> lists:reverse(Lines)
+ end.
+
+file_to_lines(File, Acc) ->
+ case io:get_line(File, "") of
+ {error, _}=Error -> Error;
+ eof -> Acc;
+ A -> file_to_lines(File, [A|Acc])
+ end.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/dialyzer_options b/lib/dialyzer/test/opaque_SUITE_data/dialyzer_options
new file mode 100644
index 0000000000..3ff26b87db
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/dialyzer_options
@@ -0,0 +1 @@
+{dialyzer_options, [{warnings, [no_unused, no_return]}]}.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/array b/lib/dialyzer/test/opaque_SUITE_data/results/array
new file mode 100644
index 0000000000..b05d088a03
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/array
@@ -0,0 +1,3 @@
+
+array_use.erl:12: The type test is_tuple(array()) breaks the opaqueness of the term array()
+array_use.erl:9: The attempt to match a term of type array() against the pattern {'array', _, _, 'undefined', _} breaks the opaqueness of the term
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/crash b/lib/dialyzer/test/opaque_SUITE_data/results/crash
new file mode 100644
index 0000000000..6bdd934169
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/crash
@@ -0,0 +1,7 @@
+
+crash_1.erl:42: The specification for crash_1:empty/0 states that the function might also return crash_1:targetlist() but the inferred return is none()
+crash_1.erl:45: Record construction #targetlist{list::[]} violates the declared type of field list::'undefined' | crash_1:target()
+crash_1.erl:48: The call crash_1:get_using_branch2(Branch::maybe_improper_list(),L::'undefined' | crash_1:target()) contains an opaque term as 2nd argument when terms of different types are expected in these positions
+crash_1.erl:50: The pattern <_Branch, []> can never match the type <maybe_improper_list(),'undefined' | crash_1:target()>
+crash_1.erl:52: The pattern <Branch, [H = {'target', _, _} | _T]> can never match the type <maybe_improper_list(),'undefined' | crash_1:target()>
+crash_1.erl:54: The pattern <Branch, [{'target', _, _} | T]> can never match the type <maybe_improper_list(),'undefined' | crash_1:target()>
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/dict b/lib/dialyzer/test/opaque_SUITE_data/results/dict
new file mode 100644
index 0000000000..5c6bf6a927
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/dict
@@ -0,0 +1,15 @@
+
+dict_use.erl:41: The attempt to match a term of type dict() against the pattern 'gazonk' breaks the opaqueness of the term
+dict_use.erl:45: The attempt to match a term of type dict() against the pattern [] breaks the opaqueness of the term
+dict_use.erl:46: The attempt to match a term of type dict() against the pattern 42 breaks the opaqueness of the term
+dict_use.erl:51: The attempt to match a term of type dict() against the pattern [] breaks the opaqueness of the term
+dict_use.erl:52: The attempt to match a term of type dict() against the pattern 42 breaks the opaqueness 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_use.erl:60: Attempt to test for inequality between a term of type atom() and a term of opaque type dict()
+dict_use.erl:64: Guard test length(D::dict()) breaks the opaqueness of its argument
+dict_use.erl:65: Guard test is_atom(D::dict()) breaks the opaqueness of its argument
+dict_use.erl:66: Guard test is_list(D::dict()) breaks the opaqueness of its argument
+dict_use.erl:70: The type test is_list(dict()) breaks the opaqueness of the term dict()
+dict_use.erl:73: The call dict:fetch('foo',[1 | 2 | 3,...]) does not have an opaque term of type 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() as 3rd argument
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/ets b/lib/dialyzer/test/opaque_SUITE_data/results/ets
new file mode 100644
index 0000000000..5498ba1538
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/ets
@@ -0,0 +1,3 @@
+
+ets_use.erl:12: Guard test is_integer(T::atom() | tid()) breaks the opaqueness of its argument
+ets_use.erl:7: Guard test is_integer(T::tid()) breaks the opaqueness of its argument
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/ewgi b/lib/dialyzer/test/opaque_SUITE_data/results/ewgi
new file mode 100644
index 0000000000..3c8cfb59f8
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/ewgi
@@ -0,0 +1,4 @@
+
+ewgi_api.erl:55: The call gb_trees:to_list({non_neg_integer(),'nil' | {_,_,_,_}}) does not have an opaque term of type gb_tree() as 1st argument
+ewgi_testapp.erl:35: The call ewgi_testapp:htmlise_data("request_data",{non_neg_integer(),'nil' | {_,_,_,_}}) will never return since it differs in the 2nd argument from the success typing arguments: ([95 | 97 | 100 | 101 | 104 | 112 | 113 | 114 | 115 | 116 | 117,...],[{_,_}])
+ewgi_testapp.erl:43: The call gb_trees:to_list(T::{non_neg_integer(),'nil' | {_,_,_,_}}) does not have an opaque term of type gb_tree() as 1st argument
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/gb_sets b/lib/dialyzer/test/opaque_SUITE_data/results/gb_sets
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/gb_sets
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/inf_loop1 b/lib/dialyzer/test/opaque_SUITE_data/results/inf_loop1
new file mode 100644
index 0000000000..eb8f304905
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/inf_loop1
@@ -0,0 +1,5 @@
+
+inf_loop1.erl:119: The pattern [{_, LNorms}] can never match the type []
+inf_loop1.erl:121: The pattern [{LinksA, LNormA}, {LinksB, LNormB}] can never match the type []
+inf_loop1.erl:129: The pattern [{_, Norm} | _] can never match the type []
+inf_loop1.erl:71: The call gb_trees:get(Edge::any(),Etab::array()) contains an opaque term as 2nd argument when terms of different types are expected in these positions
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/int b/lib/dialyzer/test/opaque_SUITE_data/results/int
new file mode 100644
index 0000000000..3ee4def34b
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/int
@@ -0,0 +1,3 @@
+
+int_adt.erl:28: Invalid type specification for function int_adt:add_f/2. The success typing is (number(),float()) -> number()
+int_adt.erl:32: Invalid type specification for function int_adt:div_f/2. The success typing is (number(),number()) -> float()
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/mixed_opaque b/lib/dialyzer/test/opaque_SUITE_data/results/mixed_opaque
new file mode 100644
index 0000000000..ab850b613e
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/mixed_opaque
@@ -0,0 +1,2 @@
+
+mixed_opaque_use.erl:31: The call mixed_opaque_rec_adt:get_a(Q::mixed_opaque_queue_adt:my_queue()) contains an opaque term as 1st argument when an opaque term of type mixed_opaque_rec_adt:rec() is expected
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/my_digraph b/lib/dialyzer/test/opaque_SUITE_data/results/my_digraph
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/my_digraph
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/my_queue b/lib/dialyzer/test/opaque_SUITE_data/results/my_queue
new file mode 100644
index 0000000000..2860b91084
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/my_queue
@@ -0,0 +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: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_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
new file mode 100644
index 0000000000..ca76f57b54
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/opaque
@@ -0,0 +1,2 @@
+
+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
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/queue b/lib/dialyzer/test/opaque_SUITE_data/results/queue
new file mode 100644
index 0000000000..59ce33f098
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/queue
@@ -0,0 +1,11 @@
+
+queue_use.erl:18: The call queue:is_empty({[],[]}) does not have an opaque term of type queue() as 1st argument
+queue_use.erl:22: The call queue:in(42,Q0::{[],[]}) does not have an opaque term of type queue() as 2nd argument
+queue_use.erl:27: The attempt to match a term of type queue() against the pattern {"*", Q2} breaks the opaqueness 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_use.erl:36: The attempt to match a term of type queue() against the pattern {F, _R} breaks the opaqueness of the term
+queue_use.erl:40: The call queue:out({[42,...],[]}) does not have an opaque term of type queue() as 1st argument
+queue_use.erl:51: The call queue_use:is_in_queue(E::42,DB::#db{p::[],q::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()} against the pattern {'db', _, {L1, L2}} breaks the opaqueness of queue()
+queue_use.erl:62: The call queue_use:tuple_queue({42,'gazonk'}) does not have a term of type {_,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() as 2nd argument
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/rec b/lib/dialyzer/test/opaque_SUITE_data/results/rec
new file mode 100644
index 0000000000..72736b3b3c
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/rec
@@ -0,0 +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: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/timer b/lib/dialyzer/test/opaque_SUITE_data/results/timer
new file mode 100644
index 0000000000..e917b76b08
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/timer
@@ -0,0 +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 {'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()
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/union b/lib/dialyzer/test/opaque_SUITE_data/results/union
new file mode 100644
index 0000000000..98829b424a
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/union
@@ -0,0 +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
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/wings b/lib/dialyzer/test/opaque_SUITE_data/results/wings
new file mode 100644
index 0000000000..a9571441f8
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/wings
@@ -0,0 +1,11 @@
+
+wings_dissolve.erl:103: Guard test is_list(List::gb_set()) breaks the opaqueness of its argument
+wings_dissolve.erl:19: Guard test is_list(Faces::gb_set()) breaks the opaqueness of its argument
+wings_dissolve.erl:272: Guard test is_list(Faces::gb_set()) breaks the opaqueness of its argument
+wings_dissolve.erl:31: The call gb_sets:is_empty(Faces::[any(),...]) does not have an opaque term of type gb_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_set()) contains an opaque term as 1st argument when an opaque term of type gb_tree() is expected
+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()} against the pattern {'empty', {In, Out}} breaks the opaqueness of queue()
+wings_we.erl:155: The call wings_util:gb_trees_largest_key(Etab::gb_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/array/array_use.erl b/lib/dialyzer/test/opaque_SUITE_data/src/array/array_use.erl
new file mode 100644
index 0000000000..1702dc8f03
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/array/array_use.erl
@@ -0,0 +1,15 @@
+-module(array_use).
+
+-export([ok1/0, wrong1/0, wrong2/0]).
+
+ok1() ->
+ array:set(17, gazonk, array:new()).
+
+wrong1() ->
+ {array, _, _, undefined, _} = array:new(42).
+
+wrong2() ->
+ case is_tuple(array:new(42)) of
+ true -> structure_is_exposed;
+ false -> cannot_possibly_be
+ end.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/crash/crash_1.erl b/lib/dialyzer/test/opaque_SUITE_data/src/crash/crash_1.erl
new file mode 100644
index 0000000000..eebeed15af
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/crash/crash_1.erl
@@ -0,0 +1,55 @@
+%%%-------------------------------------------------------------------
+%%% From : Fredrik Thulin <[email protected]>
+%%%
+%%% A module with an erroneous record field declaration which mixes up
+%%% structured and opaque terms and causes a crash in dialyzer.
+%%%
+%%% In addition, it revealed that the compiler produced extraneous
+%%% warnings about unused record definitions when in fact they are
+%%% needed for type declarations. This is now fixed.
+%%%-------------------------------------------------------------------
+-module(crash_1).
+
+-export([add/3, empty/0]).
+
+%%--------------------------------------------------------------------
+
+-record(sipurl, {proto = "sip" :: string(), host :: string()}).
+-record(keylist, {list = [] :: [_]}).
+-type sip_headers() :: #keylist{}.
+-record(request, {uri :: #sipurl{}, header :: sip_headers()}).
+-type sip_request() :: #request{}.
+
+%%--------------------------------------------------------------------
+
+-record(target, {branch :: string(), request :: sip_request()}).
+-opaque target() :: #target{}.
+
+-record(targetlist, {list :: target()}). % XXX: THIS ONE SHOULD READ [target()]
+-opaque targetlist() :: #targetlist{}.
+
+%%====================================================================
+
+add(Branch, #request{} = Request, #targetlist{list = L} = TargetList) ->
+ case get_using_branch(Branch, TargetList) of
+ none ->
+ NewTarget = #target{branch = Branch, request = Request},
+ #targetlist{list = L ++ [NewTarget]};
+ #target{} ->
+ TargetList
+ end.
+
+-spec empty() -> targetlist().
+
+empty() ->
+ #targetlist{list = []}.
+
+get_using_branch(Branch, #targetlist{list = L}) when is_list(Branch) ->
+ get_using_branch2(Branch, L).
+
+get_using_branch2(_Branch, []) ->
+ none;
+get_using_branch2(Branch, [#target{branch=Branch}=H | _T]) ->
+ H;
+get_using_branch2(Branch, [#target{} | T]) ->
+ get_using_branch2(Branch, T).
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
new file mode 100644
index 0000000000..8a2cd86f43
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/dict/dict_use.erl
@@ -0,0 +1,82 @@
+-module(dict_use).
+
+-export([ok1/0, ok2/0, ok3/0, ok4/0, ok5/0, ok6/0]).
+-export([middle/0]).
+-export([w1/0, w2/0, w3/0, w4/1, w5/0, w6/0, w7/0, w8/1, w9/0]).
+
+-define(DICT, dict).
+
+%%---------------------------------------------------------------------
+%% Cases that are OK
+%%---------------------------------------------------------------------
+
+ok1() ->
+ dict:new().
+
+ok2() ->
+ case dict:new() of X -> X end.
+
+ok3() ->
+ Dict1 = dict:new(),
+ Dict2 = dict:new(),
+ Dict1 =:= Dict2.
+
+ok4() ->
+ dict:fetch(foo, dict:new()).
+
+ok5() -> % this is OK since some_mod:new/0 might be returning a dict()
+ dict:fetch(foo, some_mod:new()).
+
+ok6() ->
+ dict:store(42, elli, dict:new()).
+
+middle() ->
+ {w1(), w2()}.
+
+%%---------------------------------------------------------------------
+%% Cases that are problematic w.r.t. opaqueness of types
+%%---------------------------------------------------------------------
+
+w1() ->
+ gazonk = dict:new().
+
+w2() ->
+ case dict:new() of
+ [] -> nil;
+ 42 -> weird
+ end.
+
+w3() ->
+ try dict:new() of
+ [] -> nil;
+ 42 -> weird
+ catch
+ _:_ -> exception
+ end.
+
+w4(Dict) when is_list(Dict) ->
+ Dict =:= dict:new();
+w4(Dict) when is_atom(Dict) ->
+ Dict =/= dict:new().
+
+w5() ->
+ case dict:new() of
+ D when length(D) =/= 42 -> weird;
+ D when is_atom(D) -> weirder;
+ D when is_list(D) -> gazonk
+ end.
+
+w6() ->
+ is_list(dict:new()).
+
+w7() ->
+ dict:fetch(foo, [1,2,3]).
+
+w8(Fun) ->
+ dict:merge(Fun, 42, [1,2]).
+
+w9() ->
+ dict:store(42, elli,
+ {dict,0,16,16,8,80,48,
+ {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
+ {{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}}).
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/ets/ets_use.erl b/lib/dialyzer/test/opaque_SUITE_data/src/ets/ets_use.erl
new file mode 100644
index 0000000000..d65af0af4e
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/ets/ets_use.erl
@@ -0,0 +1,16 @@
+-module(ets_use).
+-export([t1/0, t2/0]).
+
+t1() ->
+ case n() of
+ T when is_atom(T) -> atm;
+ T when is_integer(T) -> int
+ end.
+
+t2() ->
+ case n() of
+ T when is_integer(T) -> int;
+ T when is_atom(T) -> atm
+ end.
+
+n() -> ets:new(n, [named_table]).
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/ewgi/ewgi.hrl b/lib/dialyzer/test/opaque_SUITE_data/src/ewgi/ewgi.hrl
new file mode 100644
index 0000000000..0b98f550f1
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/ewgi/ewgi.hrl
@@ -0,0 +1,240 @@
+-ifndef(_EWGI_HRL).
+-define(_EWGI_HRL, 1).
+
+% ``The contents of this file are subject to the Mozilla Public License
+% Version 1.1 (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.mozilla.org/MPL/
+%
+% 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.
+%
+% The Original Code is the EWGI reference implementation.
+%
+% The Initial Developer of the Original Code is S.G. Consulting
+% srl. Portions created by S.G. Consulting s.r.l. are Copyright (C)
+% 2007 S.G. Consulting srl. All Rights Reserved.
+%
+% Contributor(s): Filippo Pacini <[email protected]>
+% Hunter Morris <[email protected]>
+
+-define(DEFAULT_CHUNKSIZE, 4096).
+
+-type ewgi_propval() :: atom() | integer() | string() | binary().
+-type ewgi_prop() :: {ewgi_propval(), ewgi_propval()}.
+-type ewgi_proplist() :: [ewgi_prop()].
+
+%% @type bag() = gb_tree()
+-ifdef(HAS_GB_TREE_SPEC).
+-type bag() :: gb_tree().
+-else.
+-type bag() :: {non_neg_integer(), {any(), any(), any(), any()} | 'nil'}.
+-endif.
+
+%%% Note: Dialyzer currently doesn't support recursive types. When it does, this should change:
+%%%-type ewgi_ri_callback() :: fun(('eof' | {data, binary()}) -> iolist() | ewgi_ri_callback()).
+%% @type ewgi_ri_callback() = function()
+-type ewgi_ri_callback() :: fun(('eof' | {data, binary()}) -> iolist() | function()) | iolist().
+
+%% @type ewgi_read_input() = function()
+-type ewgi_read_input() :: fun((ewgi_ri_callback(), integer()) -> ewgi_ri_callback()).
+
+%% @type ewgi_write_error() = function()
+-type ewgi_write_error() :: fun((any()) -> 'ok').
+
+%% @type ewgi_version() = {integer(), integer()}
+-type ewgi_version() :: {integer(), integer()}.
+
+%% @type ewgi_spec() = {'ewgi_spec', function(), function(), string(),
+%% ewgi_version(), bag()}
+
+-type ewgi_spec() :: {'ewgi_spec', ewgi_read_input(),
+ ewgi_write_error(), string(), ewgi_version(),
+ bag()}.
+
+-define(IS_EWGI_SPEC(R), ((element(1, R) =:= 'ewgi_spec')
+ and (size(R) =:= 6))).
+-define(GET_EWGI_READ_INPUT(R), element(2, R)).
+-define(SET_EWGI_READ_INPUT(A, R), setelement(2, R, A)).
+-define(GET_EWGI_WRITE_ERROR(R), element(3, R)).
+-define(SET_EWGI_WRITE_ERROR(A, R), setelement(3, R, A)).
+-define(GET_EWGI_URL_SCHEME(R), element(4, R)).
+-define(SET_EWGI_URL_SCHEME(A, R), setelement(4, R, A)).
+-define(GET_EWGI_VERSION(R), element(5, R)).
+-define(SET_EWGI_VERSION(A, R), setelement(5, R, A)).
+-define(GET_EWGI_DATA(R), element(6, R)).
+-define(SET_EWGI_DATA(A, R), setelement(6, R, A)).
+
+%% @type ewgi_header_val() = string() | 'undefined'
+-type ewgi_header_val() :: string() | 'undefined'.
+
+%% @type ewgi_header_key() = string()
+-type ewgi_header_key() :: string().
+
+%% @type ewgi_http_headers() = {'ewgi_http_headers',
+%% ewgi_header_val(),
+%% ewgi_header_val(),
+%% ewgi_header_val(),
+%% ewgi_header_val(),
+%% ewgi_header_val(),
+%% ewgi_header_val(),
+%% bag()}
+
+-type ewgi_http_headers() :: {'ewgi_http_headers', ewgi_header_val(),
+ ewgi_header_val(), ewgi_header_val(),
+ ewgi_header_val(), ewgi_header_val(),
+ ewgi_header_val(), bag()}.
+
+-define(IS_HTTP_HEADERS(R), ((element(1, R) =:= 'ewgi_http_headers')
+ and (size(R) =:= 8))).
+-define(GET_HTTP_ACCEPT(R), element(2, R)).
+-define(SET_HTTP_ACCEPT(A, R), setelement(2, R, A)).
+-define(GET_HTTP_COOKIE(R), element(3, R)).
+-define(SET_HTTP_COOKIE(A, R), setelement(3, R, A)).
+-define(GET_HTTP_HOST(R), element(4, R)).
+-define(SET_HTTP_HOST(A, R), setelement(4, R, A)).
+-define(GET_HTTP_IF_MODIFIED_SINCE(R), element(5, R)).
+-define(SET_HTTP_IF_MODIFIED_SINCE(A, R), setelement(5, R, A)).
+-define(GET_HTTP_USER_AGENT(R), element(6, R)).
+-define(SET_HTTP_USER_AGENT(A, R), setelement(6, R, A)).
+-define(GET_HTTP_X_HTTP_METHOD_OVERRIDE(R), element(7, R)).
+-define(SET_HTTP_X_HTTP_METHOD_OVERRIDE(A, R), setelement(7, R, A)).
+-define(GET_HTTP_OTHER(R), element(8, R)).
+-define(SET_HTTP_OTHER(A, R), setelement(8, R, A)).
+
+%% @type ewgi_request_method() = 'OPTIONS' | 'GET' | 'HEAD' | 'POST' | 'PUT' |
+%% 'DELETE' | 'TRACE' | 'CONNECT' | string()
+-type ewgi_request_method() :: 'OPTIONS' | 'GET' | 'HEAD' | 'POST' | 'PUT' |
+ 'DELETE' | 'TRACE' | 'CONNECT' | string().
+
+%% @type ewgi_val() = string() | 'undefined'
+-type ewgi_val() :: string() | 'undefined'.
+
+%% @type ewgi_request() :: {'ewgi_request', ewgi_val(), integer(), ewgi_val(),
+%% ewgi_spec(), ewgi_val(), ewgi_http_headers(),
+%% ewgi_val(), ewgi_val(), ewgi_val(), ewgi_val(),
+%% ewgi_val(), ewgi_val(), ewgi_val(), ewgi_val(),
+%% ewgi_request_method(), ewgi_val(), ewgi_val(),
+%% ewgi_val(), ewgi_val(), ewgi_val()}
+
+-type ewgi_request() :: {'ewgi_request', ewgi_val(),
+ non_neg_integer(), ewgi_val(), ewgi_spec(),
+ ewgi_val(), ewgi_http_headers(), ewgi_val(),
+ ewgi_val(), ewgi_val(), ewgi_val(),
+ ewgi_val(), ewgi_val(), ewgi_val(),
+ ewgi_val(), ewgi_request_method(),
+ ewgi_val(), ewgi_val(), ewgi_val(),
+ ewgi_val(), ewgi_val()}.
+
+-define(IS_EWGI_REQUEST(R), ((element(1, R) =:= 'ewgi_request')
+ and (size(R) =:= 21))).
+-define(GET_AUTH_TYPE(R), element(2, R)).
+-define(SET_AUTH_TYPE(A, R), setelement(2, R, A)).
+-define(GET_CONTENT_LENGTH(R), element(3, R)).
+-define(SET_CONTENT_LENGTH(A, R), setelement(3, R, A)).
+-define(GET_CONTENT_TYPE(R), element(4, R)).
+-define(SET_CONTENT_TYPE(A, R), setelement(4, R, A)).
+-define(GET_EWGI(R), element(5, R)).
+-define(SET_EWGI(A, R), setelement(5, R, A)).
+-define(GET_GATEWAY_INTERFACE(R), element(6, R)).
+-define(SET_GATEWAY_INTERFACE(A, R), setelement(6, R, A)).
+-define(GET_HTTP_HEADERS(R), element(7, R)).
+-define(SET_HTTP_HEADERS(A, R), setelement(7, R, A)).
+-define(GET_PATH_INFO(R), element(8, R)).
+-define(SET_PATH_INFO(A, R), setelement(8, R, A)).
+-define(GET_PATH_TRANSLATED(R), element(9, R)).
+-define(SET_PATH_TRANSLATED(A, R), setelement(9, R, A)).
+-define(GET_QUERY_STRING(R), element(10, R)).
+-define(SET_QUERY_STRING(A, R), setelement(10, R, A)).
+-define(GET_REMOTE_ADDR(R), element(11, R)).
+-define(SET_REMOTE_ADDR(A, R), setelement(11, R, A)).
+-define(GET_REMOTE_HOST(R), element(12, R)).
+-define(SET_REMOTE_HOST(A, R), setelement(12, R, A)).
+-define(GET_REMOTE_IDENT(R), element(13, R)).
+-define(SET_REMOTE_IDENT(A, R), setelement(13, R, A)).
+-define(GET_REMOTE_USER(R), element(14, R)).
+-define(SET_REMOTE_USER(A, R), setelement(14, R, A)).
+-define(GET_REMOTE_USER_DATA(R), element(15, R)).
+-define(SET_REMOTE_USER_DATA(A, R), setelement(15, R, A)).
+-define(GET_REQUEST_METHOD(R), element(16, R)).
+-define(SET_REQUEST_METHOD(A, R), setelement(16, R, A)).
+-define(GET_SCRIPT_NAME(R), element(17, R)).
+-define(SET_SCRIPT_NAME(A, R), setelement(17, R, A)).
+-define(GET_SERVER_NAME(R), element(18, R)).
+-define(SET_SERVER_NAME(A, R), setelement(18, R, A)).
+-define(GET_SERVER_PORT(R), element(19, R)).
+-define(SET_SERVER_PORT(A, R), setelement(19, R, A)).
+-define(GET_SERVER_PROTOCOL(R), element(20, R)).
+-define(SET_SERVER_PROTOCOL(A, R), setelement(20, R, A)).
+-define(GET_SERVER_SOFTWARE(R), element(21, R)).
+-define(SET_SERVER_SOFTWARE(A, R), setelement(21, R, A)).
+
+%%% Note: Dialyzer currently doesn't support recursive types. When it does, this should change:
+%%%-type stream() :: fun(() -> {} | {any(), stream()}).
+%% @type stream() = function()
+-type stream() :: fun(() -> {} | {any(), function()}).
+
+%% @type ewgi_status() = {integer(), string()}
+-type ewgi_status() :: {integer(), string()}.
+
+%% @type ewgi_message_body() = binary() | iolist() | stream()
+-type ewgi_message_body() :: binary() | iolist() | stream().
+
+%% @type ewgi_header_list() = [{ewgi_header_key(), ewgi_header_val()}]
+-type ewgi_header_list() :: [{ewgi_header_key(), ewgi_header_val()}].
+
+%% @type ewgi_response() = {'ewgi_response', ewgi_status(),
+%% [{ewgi_header_key(), ewgi_header_val()}],
+%% ewgi_message_body(), any()}
+
+-type ewgi_response() :: {'ewgi_response', ewgi_status(), ewgi_header_list(), ewgi_message_body(), any()}.
+
+-define(IS_EWGI_RESPONSE(R), ((element(1, R) =:= 'ewgi_response')
+ and (size(R) =:= 5))).
+-define(GET_RESPONSE_STATUS(R), element(2, R)).
+-define(SET_RESPONSE_STATUS(A, R), setelement(2, R, A)).
+-define(GET_RESPONSE_HEADERS(R), element(3, R)).
+-define(SET_RESPONSE_HEADERS(A, R), setelement(3, R, A)).
+-define(GET_RESPONSE_MESSAGE_BODY(R), element(4, R)).
+-define(SET_RESPONSE_MESSAGE_BODY(A, R), setelement(4, R, A)).
+-define(GET_RESPONSE_ERROR(R), element(5, R)).
+-define(SET_RESPONSE_ERROR(A, R), setelement(5, R, A)).
+
+%% @type ewgi_context() = {'ewgi_context', ewgi_request(), ewgi_response()}
+
+-type ewgi_context() :: {'ewgi_context', ewgi_request(), ewgi_response()}.
+
+-define(IS_EWGI_CONTEXT(R), ((element(1, R) =:= 'ewgi_context')
+ and ?IS_EWGI_REQUEST(element(2, R))
+ and ?IS_EWGI_RESPONSE(element(3, R))
+ and (size(R) =:= 3))).
+-define(GET_EWGI_REQUEST(R), element(2, R)).
+-define(SET_EWGI_REQUEST(A, R), setelement(2, R, A)).
+-define(GET_EWGI_RESPONSE(R), element(3, R)).
+-define(SET_EWGI_RESPONSE(A, R), setelement(3, R, A)).
+
+%% @type ewgi_app() = function()
+-type ewgi_app() :: fun((ewgi_context()) -> ewgi_context()).
+
+-ifndef(debug).
+-define(INSPECT_EWGI_RESPONSE(Ctx), Ctx).
+-else.
+-define(INSPECT_EWGI_RESPONSE(Ctx),
+ begin
+ error_logger:info_msg("Inpecting the final ewgi_response()...~n"
+ "Requested Url: ~p~n"
+ "Status: ~p~n"
+ "Headers: ~p~n"
+ "Body: ~p~n",
+ [ewgi_api:path_info(Ctx),
+ ewgi_api:response_status(Ctx),
+ ewgi_api:response_headers(Ctx),
+ ewgi_api:response_message_body(Ctx)]),
+ Ctx
+ end
+ ).
+-endif.
+
+-endif.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/ewgi/ewgi_api.erl b/lib/dialyzer/test/opaque_SUITE_data/src/ewgi/ewgi_api.erl
new file mode 100644
index 0000000000..60da757d3b
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/ewgi/ewgi_api.erl
@@ -0,0 +1,65 @@
+%%%-------------------------------------------------------------------
+%%% File : ewgi_api.erl
+%%% Authors : Filippo Pacini <[email protected]>
+%%% Hunter Morris <[email protected]>
+%%% License :
+%%% The contents of this file are subject to the Mozilla Public
+%%% License Version 1.1 (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.mozilla.org/MPL/
+%%%
+%%% 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.
+%%% The Initial Developer of the Original Code is S.G. Consulting
+%%% srl. Portions created by S.G. Consulting s.r.l. are Copyright (C)
+%%% 2007 S.G. Consulting srl. All Rights Reserved.
+%%%
+%%% @doc
+%%% <p>ewgi API. Defines a low level CGI like API.</p>
+%%%
+%%% @end
+%%%
+%%% Created : 10 Oct 2007 by Filippo Pacini <[email protected]>
+%%%-------------------------------------------------------------------
+-module(ewgi_api).
+
+-include_lib("ewgi.hrl").
+
+-export([get_all_headers/1, get_all_data/1]).
+
+-spec request(ewgi_context()) -> ewgi_request().
+request(Ctx) when ?IS_EWGI_CONTEXT(Ctx) ->
+ ?GET_EWGI_REQUEST(Ctx).
+
+-spec headers(ewgi_context()) -> ewgi_http_headers().
+headers(Ctx) when ?IS_EWGI_CONTEXT(Ctx) ->
+ ?GET_HTTP_HEADERS(request(Ctx)).
+
+get_header_value(Hdr0, Ctx) when is_list(Hdr0), ?IS_EWGI_CONTEXT(Ctx) ->
+ Hdr = string:to_lower(Hdr0),
+ get_header1(Hdr, Ctx).
+
+get_header1("accept", Ctx) when ?IS_EWGI_CONTEXT(Ctx) ->
+ ?GET_HTTP_ACCEPT(headers(Ctx)).
+
+unzip_header_value([{_,_}|_]=V) ->
+ {_, V1} = lists:unzip(V),
+ string:join(V1, ", ");
+unzip_header_value(V) ->
+ V.
+
+get_all_headers(Ctx) when ?IS_EWGI_CONTEXT(Ctx) ->
+ H = headers(Ctx),
+ Other = gb_trees:to_list(?GET_HTTP_OTHER(H)),
+ Acc = [{K, unzip_header_value(V)} || {K, V} <- Other],
+ L = [{"accept", get_header_value("accept", Ctx)}|Acc],
+ lists:filter(fun({_, undefined}) -> false; (_) -> true end, L).
+
+-spec ewgi_spec(ewgi_context()) -> ewgi_spec().
+ewgi_spec(Ctx) when ?IS_EWGI_CONTEXT(Ctx) ->
+ ?GET_EWGI(request(Ctx)).
+
+get_all_data(Ctx) when ?IS_EWGI_CONTEXT(Ctx) ->
+ ?GET_EWGI_DATA(ewgi_spec(Ctx)).
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/ewgi/ewgi_testapp.erl b/lib/dialyzer/test/opaque_SUITE_data/src/ewgi/ewgi_testapp.erl
new file mode 100644
index 0000000000..59c1ae9206
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/ewgi/ewgi_testapp.erl
@@ -0,0 +1,46 @@
+%%%-------------------------------------------------------------------
+%%% File : ewgi_testapp.erl
+%%% Authors : Hunter Morris <[email protected]>
+%%% License :
+%%% The contents of this file are subject to the Mozilla Public
+%%% License Version 1.1 (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.mozilla.org/MPL/
+%%%
+%%% 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.
+%%% The Initial Developer of the Original Code is S.G. Consulting
+%%% srl. Portions created by S.G. Consulting s.r.l. are Copyright (C)
+%%% 2007 S.G. Consulting srl. All Rights Reserved.
+%%%
+%%% @doc
+%%% <p>ewgi test applications</p>
+%%%
+%%% @end
+%%%
+%%% Created : 05 July 2009 by Hunter Morris <[email protected]>
+%%%-------------------------------------------------------------------
+-module(ewgi_testapp).
+
+-export([htmlise/1]).
+
+-include_lib("ewgi.hrl").
+
+htmlise(C) ->
+ iolist_to_binary(
+ ["<dl class=\"request\">",
+ io_lib:format("<dt>other http headers</dt><dd>~s</dd>", [htmlise_data("http_headers", ewgi_api:get_all_headers(C))]),
+ io_lib:format("<dt>ewgi extra data</dt><dd>~s</dd>", [htmlise_data("request_data", ewgi_api:get_all_data(C))]),
+ "</dl>"]).
+
+htmlise_data(Name, L) when is_list(L) ->
+ ["<dl class=\"", Name, "\">",
+ [io_lib:format("<dt>~s</dt><dd><pre>~p</pre><dd>", [K, V]) || {K, V} <- L],
+ "</dl>"];
+htmlise_data(Name, T) ->
+ case gb_trees:to_list(T) of
+ [] -> [];
+ L -> htmlise_data(Name, L)
+ end.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/ewgi2/ewgi.hrl b/lib/dialyzer/test/opaque_SUITE_data/src/ewgi2/ewgi.hrl
new file mode 100644
index 0000000000..5da8ff0ecf
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/ewgi2/ewgi.hrl
@@ -0,0 +1,241 @@
+-ifndef(_EWGI_HRL).
+-define(_EWGI_HRL, 1).
+
+% ``The contents of this file are subject to the Mozilla Public License
+% Version 1.1 (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.mozilla.org/MPL/
+%
+% 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.
+%
+% The Original Code is the EWGI reference implementation.
+%
+% The Initial Developer of the Original Code is S.G. Consulting
+% srl. Portions created by S.G. Consulting s.r.l. are Copyright (C)
+% 2007 S.G. Consulting srl. All Rights Reserved.
+%
+% Contributor(s): Filippo Pacini <[email protected]>
+% Hunter Morris <[email protected]>
+
+-define(DEFAULT_CHUNKSIZE, 4096).
+-define(HAS_GB_TREE_SPEC, true).
+
+-type ewgi_propval() :: atom() | integer() | string() | binary().
+-type ewgi_prop() :: {ewgi_propval(), ewgi_propval()}.
+-type ewgi_proplist() :: [ewgi_prop()].
+
+%% @type bag() = gb_tree()
+-ifdef(HAS_GB_TREE_SPEC).
+-type bag() :: gb_tree().
+-else.
+-type bag() :: {non_neg_integer(), {any(), any(), any(), any()} | 'nil'}.
+-endif.
+
+%%% Note: Dialyzer currently doesn't support recursive types. When it does, this should change:
+%%%-type ewgi_ri_callback() :: fun(('eof' | {data, binary()}) -> iolist() | ewgi_ri_callback()).
+%% @type ewgi_ri_callback() = function()
+-type ewgi_ri_callback() :: fun(('eof' | {data, binary()}) -> iolist() | function()) | iolist().
+
+%% @type ewgi_read_input() = function()
+-type ewgi_read_input() :: fun((ewgi_ri_callback(), integer()) -> ewgi_ri_callback()).
+
+%% @type ewgi_write_error() = function()
+-type ewgi_write_error() :: fun((any()) -> 'ok').
+
+%% @type ewgi_version() = {integer(), integer()}
+-type ewgi_version() :: {integer(), integer()}.
+
+%% @type ewgi_spec() = {'ewgi_spec', function(), function(), string(),
+%% ewgi_version(), bag()}
+
+-type ewgi_spec() :: {'ewgi_spec', ewgi_read_input(),
+ ewgi_write_error(), string(), ewgi_version(),
+ bag()}.
+
+-define(IS_EWGI_SPEC(R), ((element(1, R) =:= 'ewgi_spec')
+ and (size(R) =:= 6))).
+-define(GET_EWGI_READ_INPUT(R), element(2, R)).
+-define(SET_EWGI_READ_INPUT(A, R), setelement(2, R, A)).
+-define(GET_EWGI_WRITE_ERROR(R), element(3, R)).
+-define(SET_EWGI_WRITE_ERROR(A, R), setelement(3, R, A)).
+-define(GET_EWGI_URL_SCHEME(R), element(4, R)).
+-define(SET_EWGI_URL_SCHEME(A, R), setelement(4, R, A)).
+-define(GET_EWGI_VERSION(R), element(5, R)).
+-define(SET_EWGI_VERSION(A, R), setelement(5, R, A)).
+-define(GET_EWGI_DATA(R), element(6, R)).
+-define(SET_EWGI_DATA(A, R), setelement(6, R, A)).
+
+%% @type ewgi_header_val() = string() | 'undefined'
+-type ewgi_header_val() :: string() | 'undefined'.
+
+%% @type ewgi_header_key() = string()
+-type ewgi_header_key() :: string().
+
+%% @type ewgi_http_headers() = {'ewgi_http_headers',
+%% ewgi_header_val(),
+%% ewgi_header_val(),
+%% ewgi_header_val(),
+%% ewgi_header_val(),
+%% ewgi_header_val(),
+%% ewgi_header_val(),
+%% bag()}
+
+-type ewgi_http_headers() :: {'ewgi_http_headers', ewgi_header_val(),
+ ewgi_header_val(), ewgi_header_val(),
+ ewgi_header_val(), ewgi_header_val(),
+ ewgi_header_val(), bag()}.
+
+-define(IS_HTTP_HEADERS(R), ((element(1, R) =:= 'ewgi_http_headers')
+ and (size(R) =:= 8))).
+-define(GET_HTTP_ACCEPT(R), element(2, R)).
+-define(SET_HTTP_ACCEPT(A, R), setelement(2, R, A)).
+-define(GET_HTTP_COOKIE(R), element(3, R)).
+-define(SET_HTTP_COOKIE(A, R), setelement(3, R, A)).
+-define(GET_HTTP_HOST(R), element(4, R)).
+-define(SET_HTTP_HOST(A, R), setelement(4, R, A)).
+-define(GET_HTTP_IF_MODIFIED_SINCE(R), element(5, R)).
+-define(SET_HTTP_IF_MODIFIED_SINCE(A, R), setelement(5, R, A)).
+-define(GET_HTTP_USER_AGENT(R), element(6, R)).
+-define(SET_HTTP_USER_AGENT(A, R), setelement(6, R, A)).
+-define(GET_HTTP_X_HTTP_METHOD_OVERRIDE(R), element(7, R)).
+-define(SET_HTTP_X_HTTP_METHOD_OVERRIDE(A, R), setelement(7, R, A)).
+-define(GET_HTTP_OTHER(R), element(8, R)).
+-define(SET_HTTP_OTHER(A, R), setelement(8, R, A)).
+
+%% @type ewgi_request_method() = 'OPTIONS' | 'GET' | 'HEAD' | 'POST' | 'PUT' |
+%% 'DELETE' | 'TRACE' | 'CONNECT' | string()
+-type ewgi_request_method() :: 'OPTIONS' | 'GET' | 'HEAD' | 'POST' | 'PUT' |
+ 'DELETE' | 'TRACE' | 'CONNECT' | string().
+
+%% @type ewgi_val() = string() | 'undefined'
+-type ewgi_val() :: string() | 'undefined'.
+
+%% @type ewgi_request() :: {'ewgi_request', ewgi_val(), integer(), ewgi_val(),
+%% ewgi_spec(), ewgi_val(), ewgi_http_headers(),
+%% ewgi_val(), ewgi_val(), ewgi_val(), ewgi_val(),
+%% ewgi_val(), ewgi_val(), ewgi_val(), ewgi_val(),
+%% ewgi_request_method(), ewgi_val(), ewgi_val(),
+%% ewgi_val(), ewgi_val(), ewgi_val()}
+
+-type ewgi_request() :: {'ewgi_request', ewgi_val(),
+ non_neg_integer(), ewgi_val(), ewgi_spec(),
+ ewgi_val(), ewgi_http_headers(), ewgi_val(),
+ ewgi_val(), ewgi_val(), ewgi_val(),
+ ewgi_val(), ewgi_val(), ewgi_val(),
+ ewgi_val(), ewgi_request_method(),
+ ewgi_val(), ewgi_val(), ewgi_val(),
+ ewgi_val(), ewgi_val()}.
+
+-define(IS_EWGI_REQUEST(R), ((element(1, R) =:= 'ewgi_request')
+ and (size(R) =:= 21))).
+-define(GET_AUTH_TYPE(R), element(2, R)).
+-define(SET_AUTH_TYPE(A, R), setelement(2, R, A)).
+-define(GET_CONTENT_LENGTH(R), element(3, R)).
+-define(SET_CONTENT_LENGTH(A, R), setelement(3, R, A)).
+-define(GET_CONTENT_TYPE(R), element(4, R)).
+-define(SET_CONTENT_TYPE(A, R), setelement(4, R, A)).
+-define(GET_EWGI(R), element(5, R)).
+-define(SET_EWGI(A, R), setelement(5, R, A)).
+-define(GET_GATEWAY_INTERFACE(R), element(6, R)).
+-define(SET_GATEWAY_INTERFACE(A, R), setelement(6, R, A)).
+-define(GET_HTTP_HEADERS(R), element(7, R)).
+-define(SET_HTTP_HEADERS(A, R), setelement(7, R, A)).
+-define(GET_PATH_INFO(R), element(8, R)).
+-define(SET_PATH_INFO(A, R), setelement(8, R, A)).
+-define(GET_PATH_TRANSLATED(R), element(9, R)).
+-define(SET_PATH_TRANSLATED(A, R), setelement(9, R, A)).
+-define(GET_QUERY_STRING(R), element(10, R)).
+-define(SET_QUERY_STRING(A, R), setelement(10, R, A)).
+-define(GET_REMOTE_ADDR(R), element(11, R)).
+-define(SET_REMOTE_ADDR(A, R), setelement(11, R, A)).
+-define(GET_REMOTE_HOST(R), element(12, R)).
+-define(SET_REMOTE_HOST(A, R), setelement(12, R, A)).
+-define(GET_REMOTE_IDENT(R), element(13, R)).
+-define(SET_REMOTE_IDENT(A, R), setelement(13, R, A)).
+-define(GET_REMOTE_USER(R), element(14, R)).
+-define(SET_REMOTE_USER(A, R), setelement(14, R, A)).
+-define(GET_REMOTE_USER_DATA(R), element(15, R)).
+-define(SET_REMOTE_USER_DATA(A, R), setelement(15, R, A)).
+-define(GET_REQUEST_METHOD(R), element(16, R)).
+-define(SET_REQUEST_METHOD(A, R), setelement(16, R, A)).
+-define(GET_SCRIPT_NAME(R), element(17, R)).
+-define(SET_SCRIPT_NAME(A, R), setelement(17, R, A)).
+-define(GET_SERVER_NAME(R), element(18, R)).
+-define(SET_SERVER_NAME(A, R), setelement(18, R, A)).
+-define(GET_SERVER_PORT(R), element(19, R)).
+-define(SET_SERVER_PORT(A, R), setelement(19, R, A)).
+-define(GET_SERVER_PROTOCOL(R), element(20, R)).
+-define(SET_SERVER_PROTOCOL(A, R), setelement(20, R, A)).
+-define(GET_SERVER_SOFTWARE(R), element(21, R)).
+-define(SET_SERVER_SOFTWARE(A, R), setelement(21, R, A)).
+
+%%% Note: Dialyzer currently doesn't support recursive types. When it does, this should change:
+%%%-type stream() :: fun(() -> {} | {any(), stream()}).
+%% @type stream() = function()
+-type stream() :: fun(() -> {} | {any(), function()}).
+
+%% @type ewgi_status() = {integer(), string()}
+-type ewgi_status() :: {integer(), string()}.
+
+%% @type ewgi_message_body() = binary() | iolist() | stream()
+-type ewgi_message_body() :: binary() | iolist() | stream().
+
+%% @type ewgi_header_list() = [{ewgi_header_key(), ewgi_header_val()}]
+-type ewgi_header_list() :: [{ewgi_header_key(), ewgi_header_val()}].
+
+%% @type ewgi_response() = {'ewgi_response', ewgi_status(),
+%% [{ewgi_header_key(), ewgi_header_val()}],
+%% ewgi_message_body(), any()}
+
+-type ewgi_response() :: {'ewgi_response', ewgi_status(), ewgi_header_list(), ewgi_message_body(), any()}.
+
+-define(IS_EWGI_RESPONSE(R), ((element(1, R) =:= 'ewgi_response')
+ and (size(R) =:= 5))).
+-define(GET_RESPONSE_STATUS(R), element(2, R)).
+-define(SET_RESPONSE_STATUS(A, R), setelement(2, R, A)).
+-define(GET_RESPONSE_HEADERS(R), element(3, R)).
+-define(SET_RESPONSE_HEADERS(A, R), setelement(3, R, A)).
+-define(GET_RESPONSE_MESSAGE_BODY(R), element(4, R)).
+-define(SET_RESPONSE_MESSAGE_BODY(A, R), setelement(4, R, A)).
+-define(GET_RESPONSE_ERROR(R), element(5, R)).
+-define(SET_RESPONSE_ERROR(A, R), setelement(5, R, A)).
+
+%% @type ewgi_context() = {'ewgi_context', ewgi_request(), ewgi_response()}
+
+-type ewgi_context() :: {'ewgi_context', ewgi_request(), ewgi_response()}.
+
+-define(IS_EWGI_CONTEXT(R), ((element(1, R) =:= 'ewgi_context')
+ and ?IS_EWGI_REQUEST(element(2, R))
+ and ?IS_EWGI_RESPONSE(element(3, R))
+ and (size(R) =:= 3))).
+-define(GET_EWGI_REQUEST(R), element(2, R)).
+-define(SET_EWGI_REQUEST(A, R), setelement(2, R, A)).
+-define(GET_EWGI_RESPONSE(R), element(3, R)).
+-define(SET_EWGI_RESPONSE(A, R), setelement(3, R, A)).
+
+%% @type ewgi_app() = function()
+-type ewgi_app() :: fun((ewgi_context()) -> ewgi_context()).
+
+-ifndef(debug).
+-define(INSPECT_EWGI_RESPONSE(Ctx), Ctx).
+-else.
+-define(INSPECT_EWGI_RESPONSE(Ctx),
+ begin
+ error_logger:info_msg("Inpecting the final ewgi_response()...~n"
+ "Requested Url: ~p~n"
+ "Status: ~p~n"
+ "Headers: ~p~n"
+ "Body: ~p~n",
+ [ewgi_api:path_info(Ctx),
+ ewgi_api:response_status(Ctx),
+ ewgi_api:response_headers(Ctx),
+ ewgi_api:response_message_body(Ctx)]),
+ Ctx
+ end
+ ).
+-endif.
+
+-endif.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/ewgi2/ewgi_api.erl b/lib/dialyzer/test/opaque_SUITE_data/src/ewgi2/ewgi_api.erl
new file mode 100644
index 0000000000..60da757d3b
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/ewgi2/ewgi_api.erl
@@ -0,0 +1,65 @@
+%%%-------------------------------------------------------------------
+%%% File : ewgi_api.erl
+%%% Authors : Filippo Pacini <[email protected]>
+%%% Hunter Morris <[email protected]>
+%%% License :
+%%% The contents of this file are subject to the Mozilla Public
+%%% License Version 1.1 (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.mozilla.org/MPL/
+%%%
+%%% 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.
+%%% The Initial Developer of the Original Code is S.G. Consulting
+%%% srl. Portions created by S.G. Consulting s.r.l. are Copyright (C)
+%%% 2007 S.G. Consulting srl. All Rights Reserved.
+%%%
+%%% @doc
+%%% <p>ewgi API. Defines a low level CGI like API.</p>
+%%%
+%%% @end
+%%%
+%%% Created : 10 Oct 2007 by Filippo Pacini <[email protected]>
+%%%-------------------------------------------------------------------
+-module(ewgi_api).
+
+-include_lib("ewgi.hrl").
+
+-export([get_all_headers/1, get_all_data/1]).
+
+-spec request(ewgi_context()) -> ewgi_request().
+request(Ctx) when ?IS_EWGI_CONTEXT(Ctx) ->
+ ?GET_EWGI_REQUEST(Ctx).
+
+-spec headers(ewgi_context()) -> ewgi_http_headers().
+headers(Ctx) when ?IS_EWGI_CONTEXT(Ctx) ->
+ ?GET_HTTP_HEADERS(request(Ctx)).
+
+get_header_value(Hdr0, Ctx) when is_list(Hdr0), ?IS_EWGI_CONTEXT(Ctx) ->
+ Hdr = string:to_lower(Hdr0),
+ get_header1(Hdr, Ctx).
+
+get_header1("accept", Ctx) when ?IS_EWGI_CONTEXT(Ctx) ->
+ ?GET_HTTP_ACCEPT(headers(Ctx)).
+
+unzip_header_value([{_,_}|_]=V) ->
+ {_, V1} = lists:unzip(V),
+ string:join(V1, ", ");
+unzip_header_value(V) ->
+ V.
+
+get_all_headers(Ctx) when ?IS_EWGI_CONTEXT(Ctx) ->
+ H = headers(Ctx),
+ Other = gb_trees:to_list(?GET_HTTP_OTHER(H)),
+ Acc = [{K, unzip_header_value(V)} || {K, V} <- Other],
+ L = [{"accept", get_header_value("accept", Ctx)}|Acc],
+ lists:filter(fun({_, undefined}) -> false; (_) -> true end, L).
+
+-spec ewgi_spec(ewgi_context()) -> ewgi_spec().
+ewgi_spec(Ctx) when ?IS_EWGI_CONTEXT(Ctx) ->
+ ?GET_EWGI(request(Ctx)).
+
+get_all_data(Ctx) when ?IS_EWGI_CONTEXT(Ctx) ->
+ ?GET_EWGI_DATA(ewgi_spec(Ctx)).
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/ewgi2/ewgi_testapp.erl b/lib/dialyzer/test/opaque_SUITE_data/src/ewgi2/ewgi_testapp.erl
new file mode 100644
index 0000000000..59c1ae9206
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/ewgi2/ewgi_testapp.erl
@@ -0,0 +1,46 @@
+%%%-------------------------------------------------------------------
+%%% File : ewgi_testapp.erl
+%%% Authors : Hunter Morris <[email protected]>
+%%% License :
+%%% The contents of this file are subject to the Mozilla Public
+%%% License Version 1.1 (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.mozilla.org/MPL/
+%%%
+%%% 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.
+%%% The Initial Developer of the Original Code is S.G. Consulting
+%%% srl. Portions created by S.G. Consulting s.r.l. are Copyright (C)
+%%% 2007 S.G. Consulting srl. All Rights Reserved.
+%%%
+%%% @doc
+%%% <p>ewgi test applications</p>
+%%%
+%%% @end
+%%%
+%%% Created : 05 July 2009 by Hunter Morris <[email protected]>
+%%%-------------------------------------------------------------------
+-module(ewgi_testapp).
+
+-export([htmlise/1]).
+
+-include_lib("ewgi.hrl").
+
+htmlise(C) ->
+ iolist_to_binary(
+ ["<dl class=\"request\">",
+ io_lib:format("<dt>other http headers</dt><dd>~s</dd>", [htmlise_data("http_headers", ewgi_api:get_all_headers(C))]),
+ io_lib:format("<dt>ewgi extra data</dt><dd>~s</dd>", [htmlise_data("request_data", ewgi_api:get_all_data(C))]),
+ "</dl>"]).
+
+htmlise_data(Name, L) when is_list(L) ->
+ ["<dl class=\"", Name, "\">",
+ [io_lib:format("<dt>~s</dt><dd><pre>~p</pre><dd>", [K, V]) || {K, V} <- L],
+ "</dl>"];
+htmlise_data(Name, T) ->
+ case gb_trees:to_list(T) of
+ [] -> [];
+ L -> htmlise_data(Name, L)
+ end.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/gb_sets/gb_sets_rec.erl b/lib/dialyzer/test/opaque_SUITE_data/src/gb_sets/gb_sets_rec.erl
new file mode 100644
index 0000000000..008b0a486a
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/gb_sets/gb_sets_rec.erl
@@ -0,0 +1,23 @@
+%%---------------------------------------------------------------------
+%% This module does not test gb_sets. Instead it tests that we can
+%% create records whose fields are declared with an opaque type and
+%% retrieve these fields without problems. Unitialized record fields
+%% used to cause trouble for the analysis due to the implicit
+%% 'undefined' value that record fields contain. The problem was the
+%% strange interaction of ?opaque() and ?union() in the definition of
+%% erl_types:t_inf/3. This was fixed 18/1/2009.
+%% --------------------------------------------------------------------
+
+-module(gb_sets_rec).
+
+-export([new/0, get_g/1]).
+
+-record(rec, {g :: gb_set()}).
+
+-spec new() -> #rec{}.
+new() ->
+ #rec{g = gb_sets:empty()}.
+
+-spec get_g(#rec{}) -> gb_set().
+get_g(R) ->
+ R#rec.g.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/inf_loop1.erl b/lib/dialyzer/test/opaque_SUITE_data/src/inf_loop1.erl
new file mode 100644
index 0000000000..0dff16cf14
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/inf_loop1.erl
@@ -0,0 +1,172 @@
+%% -*- erlang-indent-level: 2 -*-
+%%----------------------------------------------------------------------------
+%% Non-sensical (i.e., stripped-down) program that sends the analysis
+%% into an infinite loop. The #we.es field was originally a gb_tree()
+%% but the programmer declared it as an array in order to change it to
+%% that data type instead. In the file, there are two calls to function
+%% gb_trees:get/2 which seem to be the ones responsible for sending the
+%% analysis into an infinite loop. Currently, these calls are marked and
+%% have been changed to gbee_trees:get/2 in order to be able to see that
+%% the analysis works if these two calls are taken out of the picture.
+%%----------------------------------------------------------------------------
+-module(inf_loop1).
+
+-export([command/1]).
+
+-record(we, {id,
+ es = array:new() :: array(),
+ vp,
+ mirror = none}).
+-record(edge, {vs,ve,a = none,b = none,lf,rf,ltpr,ltsu,rtpr,rtsu}).
+
+command(St) ->
+ State = drag_mode(offset_region),
+ SetupSt = wings_sel_conv:more(St),
+ Tvs = wings_sel:fold(fun(Faces, #we{id = Id} = We, Acc) ->
+ FaceRegions = wings_sel:face_regions(Faces, We),
+ {AllVs0,VsData} =
+ collect_offset_regions_data(FaceRegions, We, [], []),
+ AllVs = ordsets:from_list(AllVs0),
+ [{Id,{AllVs,offset_regions_fun(VsData, State)}}|Acc]
+ end,
+ [],
+ SetupSt),
+ wings_drag:setup(Tvs, 42, [], St).
+
+drag_mode(Type) ->
+ {Mode,Norm} = wings_pref:get_value(Type, {average,loop}),
+ {Type,Mode,Norm}.
+
+collect_offset_regions_data([Faces|Regions], We, AllVs, VsData) ->
+ {FaceNormTab,OuterEdges,RegVs} =
+ some_fake_module:faces_data_0(Faces, We, [], [], []),
+ {LoopNorm,LoopVsData,LoopVs} =
+ offset_regions_loop_data(OuterEdges, Faces, We, FaceNormTab),
+ Vs = RegVs -- LoopVs,
+ RegVsData = vertex_normals(Vs, FaceNormTab, We, LoopVsData),
+ collect_offset_regions_data(Regions, We, RegVs ++ AllVs,
+ [{LoopNorm,RegVsData}|VsData]);
+collect_offset_regions_data([], _, AllVs, VsData) ->
+ {AllVs,VsData}.
+
+offset_regions_loop_data(Edges, Faces, We, FNtab) ->
+ EdgeSet = gb_sets:from_list(Edges),
+ offset_loop_data_0(EdgeSet, Faces, We, FNtab, [], [], []).
+
+offset_loop_data_0(EdgeSet0, Faces, We, FNtab, LNorms, VData0, Vs0) ->
+ case gb_sets:is_empty(EdgeSet0) of
+ false ->
+ {Edge,EdgeSet1} = gb_sets:take_smallest(EdgeSet0),
+ {EdgeSet,VData,Links,LoopNorm,Vs} =
+ offset_loop_data_1(Edge, EdgeSet1, Faces, We, FNtab, VData0, Vs0),
+ offset_loop_data_0(EdgeSet, Faces, We, FNtab,
+ [{Links,LoopNorm}|LNorms], VData, Vs);
+ true ->
+ AvgLoopNorm = average_loop_norm(LNorms),
+ {AvgLoopNorm,VData0,Vs0}
+ end.
+
+offset_loop_data_1(Edge, EdgeSet, _Faces,
+ #we{es = Etab, vp = Vtab} = We, FNtab, VData, Vs) ->
+ #edge{vs = Va, ve = Vb, lf = Lf, ltsu = NextLeft} = gb_trees:get(Edge, Etab),
+ VposA = gb_trees:get(Va, Vtab),
+ VposB = gb_trees:get(Vb, Vtab),
+ VDir = e3d_vec:sub(VposB, VposA),
+ FNorm = wings_face:normal(Lf, We),
+ EdgeData = gb_trees:get(NextLeft, Etab),
+ offset_loop_data_2(NextLeft, EdgeData, Va, VposA, Lf, Edge, We, FNtab,
+ EdgeSet, VDir, [], [FNorm], VData, [], Vs, 0).
+
+offset_loop_data_2(CurE, #edge{vs = Va, ve = Vb, lf = PrevFace,
+ rtsu = NextEdge, ltsu = IfCurIsMember},
+ Vb, VposB, PrevFace, LastE,
+ #we{mirror = M} = We,
+ FNtab, EdgeSet0, VDir, EDir0, VNorms0, VData0, VPs0, Vs0,
+ Links) ->
+ Mirror = M == PrevFace,
+ offset_loop_is_member(Mirror, Vb, Va, VposB, CurE, IfCurIsMember, VNorms0,
+ NextEdge, EdgeSet0, VDir, EDir0, FNtab, PrevFace,
+ LastE, We, VData0, VPs0, Vs0, Links).
+
+offset_loop_is_member(Mirror, V1, V2, Vpos1, CurE, NextE, VNorms0, NEdge,
+ EdgeSet0, VDir, EDir0, FNtab, PFace, LastE, We,
+ VData0, VPs0, Vs0, Links) ->
+ #we{es = Etab, vp = Vtab} = We,
+ Vpos2 = gb_trees:get(V2, Vtab),
+ Dir = e3d_vec:sub(Vpos2, Vpos1),
+ NextVDir = e3d_vec:neg(Dir),
+ EdgeSet = gb_sets:delete(CurE, EdgeSet0),
+ EdgeData = gbee_trees:get(NextE, Etab), %% HERE
+ [FNorm|_] = VNorms0,
+ VData = offset_loop_data_3(Mirror, V1, Vpos1, VNorms0, NEdge, VDir,
+ Dir, EDir0, FNtab, We, VData0),
+ VPs = [Vpos1|VPs0],
+ Vs = [V1|Vs0],
+ offset_loop_data_2(NextE, EdgeData, V2, Vpos2, PFace, LastE, We, FNtab,
+ EdgeSet, NextVDir, [], [FNorm], VData, VPs, Vs, Links + 1).
+
+offset_loop_data_3(false, V, Vpos, VNorms0, NextEdge,
+ VDir, Dir, EDir0, FNtab, We, VData0) ->
+ #we{es = Etab} = We,
+ VNorm = e3d_vec:norm(e3d_vec:add(VNorms0)),
+ NV = wings_vertex:other(V, gbee_trees:get(NextEdge, Etab)), %% HERE
+ ANorm = vertex_normal(NV, FNtab, We),
+ EDir = some_fake_module:average_edge_dir(VNorm, VDir, Dir, EDir0),
+ AvgDir = some_fake_module:evaluate_vdata(VDir, Dir, VNorm),
+ ScaledDir = some_fake_module:along_edge_scale_factor(VDir, Dir, EDir, ANorm),
+ [{V,{Vpos,AvgDir,EDir,ScaledDir}}|VData0].
+
+average_loop_norm([{_,LNorms}]) ->
+ e3d_vec:norm(LNorms);
+average_loop_norm([{LinksA,LNormA},{LinksB,LNormB}]) ->
+ case LinksA < LinksB of
+ true ->
+ e3d_vec:norm(e3d_vec:add(e3d_vec:neg(LNormA), LNormB));
+ false ->
+ e3d_vec:norm(e3d_vec:add(e3d_vec:neg(LNormB), LNormA))
+ end;
+average_loop_norm(LNorms) ->
+ LoopNorms = [Norm || {_,Norm} <- LNorms],
+ e3d_vec:norm(e3d_vec:neg(e3d_vec:add(LoopNorms))).
+
+vertex_normals([V|Vs], FaceNormTab, #we{vp = Vtab, mirror = M} = We, Acc) ->
+ FaceNorms =
+ wings_vertex:fold(fun(_, Face, _, A) when Face == M ->
+ [e3d_vec:neg(wings_face:normal(M, We))|A];
+ (_, Face, _, A) ->
+ [gb_trees:get(Face, FaceNormTab)|A]
+ end, [], V, We),
+ VNorm = e3d_vec:norm(e3d_vec:add(FaceNorms)),
+ Vpos = gb_trees:get(V, Vtab),
+ vertex_normals(Vs, FaceNormTab, We, [{V,{Vpos,VNorm}}|Acc]);
+vertex_normals([], _, _, Acc) ->
+ Acc.
+
+vertex_normal(V, FaceNormTab, #we{mirror = M} = We) ->
+ wings_vertex:fold(fun(_, Face, _, A) when Face == M ->
+ [e3d_vec:neg(wings_face:normal(Face, We))|A];
+ (_, Face, _, A) ->
+ N = gb_trees:get(Face, FaceNormTab),
+ case e3d_vec:is_zero(N) of
+ true -> A;
+ false -> [N|A]
+ end
+ end, [], V, We).
+
+offset_regions_fun(OffsetData, {_,Solution,_} = State) ->
+ fun(new_mode_data, {NewState,_}) ->
+ offset_regions_fun(OffsetData, NewState);
+ ([Dist,_,_,Bump|_], A) ->
+ lists:foldl(fun({LoopNormal,VsData}, VsAcc0) ->
+ lists:foldl(fun({V,{Vpos0,VNorm}}, VsAcc) ->
+ [{V,Vpos0}|VsAcc];
+ ({V,{Vpos0,Dir,EDir,ScaledEDir}}, VsAcc) ->
+ Vec = case Solution of
+ average -> Dir;
+ along_edges -> EDir;
+ scaled -> ScaledEDir
+ end,
+ [{V,Vpos0}|VsAcc]
+ end, VsAcc0, VsData)
+ end, A, OffsetData)
+ end.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/int/int_adt.erl b/lib/dialyzer/test/opaque_SUITE_data/src/int/int_adt.erl
new file mode 100644
index 0000000000..99f8cbdc4a
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/int/int_adt.erl
@@ -0,0 +1,33 @@
+%%----------------------------------------------------------------------------
+%% Module that tests consistency of spec declarations in the presence of
+%% opaque types. Contains both valid and invalid contracts with opaque types.
+%%----------------------------------------------------------------------------
+
+-module(int_adt).
+
+-export([new_i/0, add_i/2, div_i/2, add_f/2, div_f/2]).
+
+-export_type([int/0]).
+
+-opaque int() :: integer().
+
+%% the user has declared the return to be an opaque type, but the success
+%% typing inference is too strong and finds a subtype as a return: this is OK
+-spec new_i() -> int().
+new_i() -> 42.
+
+%% the success typing is more general than the contract: this is OK
+-spec add_i(int(), int()) -> int().
+add_i(X, Y) -> X + Y.
+
+%% the success typing coincides with the contract: this is OK, of course
+-spec div_i(int(), int()) -> int().
+div_i(X, Y) -> X div Y.
+
+%% the success typing has an incompatible domain element: this is invalid
+-spec add_f(int(), int()) -> int().
+add_f(X, Y) when is_float(Y) -> X + trunc(Y).
+
+%% the success typing has an incompatible range: this is invalid
+-spec div_f(int(), int()) -> int().
+div_f(X, Y) -> X / Y.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/int/int_use.erl b/lib/dialyzer/test/opaque_SUITE_data/src/int/int_use.erl
new file mode 100644
index 0000000000..b4471e1cee
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/int/int_use.erl
@@ -0,0 +1,11 @@
+%%---------------------------------------------------------------------------
+%% Module that uses the opaque types of int_adt.
+%% TODO: Should be extended with invalid contracts.
+%%---------------------------------------------------------------------------
+-module(int_use).
+
+-export([test/0]).
+
+-spec test() -> int_adt:int().
+test() ->
+ int_adt:new_i().
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/mixed_opaque/mixed_opaque_queue_adt.erl b/lib/dialyzer/test/opaque_SUITE_data/src/mixed_opaque/mixed_opaque_queue_adt.erl
new file mode 100644
index 0000000000..ac59f19cd3
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/mixed_opaque/mixed_opaque_queue_adt.erl
@@ -0,0 +1,26 @@
+%%---------------------------------------------------------------------------
+%% A clone of 'queue_adt' so as to test its combination with 'rec_adt'
+%%---------------------------------------------------------------------------
+-module(mixed_opaque_queue_adt).
+
+-export([new/0, add/2, dequeue/1, is_empty/1]).
+
+-opaque my_queue() :: list().
+
+-spec new() -> my_queue().
+new() ->
+ [].
+
+-spec add(term(), my_queue()) -> my_queue().
+add(E, Q) ->
+ Q ++ [E].
+
+-spec dequeue(my_queue()) -> {term(), my_queue()}.
+dequeue([H|T]) ->
+ {H, T}.
+
+-spec is_empty(my_queue()) -> boolean().
+is_empty([]) ->
+ true;
+is_empty([_|_]) ->
+ false.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/mixed_opaque/mixed_opaque_rec_adt.erl b/lib/dialyzer/test/opaque_SUITE_data/src/mixed_opaque/mixed_opaque_rec_adt.erl
new file mode 100644
index 0000000000..61bae5110d
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/mixed_opaque/mixed_opaque_rec_adt.erl
@@ -0,0 +1,25 @@
+%%---------------------------------------------------------------------------
+%% A clone of 'rec_adt' so as to test its combination with 'queue_adt'
+%%---------------------------------------------------------------------------
+-module(mixed_opaque_rec_adt).
+
+-export([new/0, get_a/1, get_b/1, set_a/2, set_b/2]).
+
+-record(rec, {a :: atom(), b = 0 :: integer()}).
+
+-opaque rec() :: #rec{}.
+
+-spec new() -> rec().
+new() -> #rec{a = gazonk, b = 42}.
+
+-spec get_a(rec()) -> atom().
+get_a(#rec{a = A}) -> A.
+
+-spec get_b(rec()) -> integer().
+get_b(#rec{b = B}) -> B.
+
+-spec set_a(rec(), atom()) -> rec().
+set_a(R, A) -> R#rec{a = A}.
+
+-spec set_b(rec(), integer()) -> rec().
+set_b(R, B) -> R#rec{b = B}.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/mixed_opaque/mixed_opaque_use.erl b/lib/dialyzer/test/opaque_SUITE_data/src/mixed_opaque/mixed_opaque_use.erl
new file mode 100644
index 0000000000..e82dcd5f38
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/mixed_opaque/mixed_opaque_use.erl
@@ -0,0 +1,31 @@
+%%---------------------------------------------------------------------------
+%% Test that tries some combinations of using more than one opaque data type
+%% in the same function(s).
+%%----------------------------------------------------------------------------
+-module(mixed_opaque_use).
+
+-export([ok1/1, ok2/0, wrong1/0]).
+
+-define(REC, mixed_opaque_rec_adt).
+-define(QUEUE, mixed_opaque_queue_adt).
+
+%% Currently returning unions of opaque types is considered OK
+ok1(Type) ->
+ case Type of
+ queue -> ?QUEUE:new();
+ rec -> ?REC:new()
+ end.
+
+%% Constructing a queue of records is OK
+ok2() ->
+ Q0 = ?QUEUE:new(),
+ R0 = ?REC:new(),
+ Q1 = ?QUEUE:add(R0, Q0),
+ {R1,_Q2} = ?QUEUE:dequeue(Q1),
+ ?REC:get_a(R1).
+
+%% But of course calling a function expecting some opaque type
+%% with some other opaque typs is not OK
+wrong1() ->
+ Q = ?QUEUE:new(),
+ ?REC:get_a(Q).
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/my_digraph/my_digraph_adt.erl b/lib/dialyzer/test/opaque_SUITE_data/src/my_digraph/my_digraph_adt.erl
new file mode 100644
index 0000000000..82159d6a8d
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/my_digraph/my_digraph_adt.erl
@@ -0,0 +1,51 @@
+-module(my_digraph_adt).
+
+-export([new/0, new/1]).
+
+-record(my_digraph, {vtab = notable,
+ etab = notable,
+ ntab = notable,
+ cyclic = true :: boolean()}).
+
+-opaque my_digraph() :: #my_digraph{}.
+
+-type d_protection() :: 'private' | 'protected'.
+-type d_cyclicity() :: 'acyclic' | 'cyclic'.
+-type d_type() :: d_cyclicity() | d_protection().
+
+-spec new() -> my_digraph().
+new() -> new([]).
+
+-spec new([atom()]) -> my_digraph().
+new(Type) ->
+ try check_type(Type, protected, []) of
+ {Access, Ts} ->
+ V = ets:new(vertices, [set, Access]),
+ E = ets:new(edges, [set, Access]),
+ N = ets:new(neighbours, [bag, Access]),
+ ets:insert(N, [{'$vid', 0}, {'$eid', 0}]),
+ set_type(Ts, #my_digraph{vtab=V, etab=E, ntab=N})
+ catch
+ throw:Error -> throw(Error)
+ end.
+
+-spec check_type([atom()], d_protection(), [{'cyclic', boolean()}]) ->
+ {d_protection(), [{'cyclic', boolean()}]}.
+
+check_type([acyclic|Ts], A, L) ->
+ check_type(Ts, A,[{cyclic,false} | L]);
+check_type([cyclic | Ts], A, L) ->
+ check_type(Ts, A, [{cyclic,true} | L]);
+check_type([protected | Ts], _, L) ->
+ check_type(Ts, protected, L);
+check_type([private | Ts], _, L) ->
+ check_type(Ts, private, L);
+check_type([T | _], _, _) ->
+ throw({error, {unknown_type, T}});
+check_type([], A, L) -> {A, L}.
+
+-spec set_type([{'cyclic', boolean()}], my_digraph()) -> my_digraph().
+
+set_type([{cyclic,V} | Ks], G) ->
+ set_type(Ks, G#my_digraph{cyclic = V});
+set_type([], G) -> G.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/my_queue/my_queue_adt.erl b/lib/dialyzer/test/opaque_SUITE_data/src/my_queue/my_queue_adt.erl
new file mode 100644
index 0000000000..52688062ce
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/my_queue/my_queue_adt.erl
@@ -0,0 +1,23 @@
+-module(my_queue_adt).
+
+-export([new/0, add/2, dequeue/1, is_empty/1]).
+
+-opaque my_queue() :: list().
+
+-spec new() -> my_queue().
+new() ->
+ [].
+
+-spec add(term(), my_queue()) -> my_queue().
+add(E, Q) ->
+ Q ++ [E].
+
+-spec dequeue(my_queue()) -> {term(), my_queue()}.
+dequeue([H|T]) ->
+ {H, T}.
+
+-spec is_empty(my_queue()) -> boolean().
+is_empty([]) ->
+ true;
+is_empty([_|_]) ->
+ false.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/my_queue/my_queue_use.erl b/lib/dialyzer/test/opaque_SUITE_data/src/my_queue/my_queue_use.erl
new file mode 100644
index 0000000000..98f9972c1e
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/my_queue/my_queue_use.erl
@@ -0,0 +1,35 @@
+-module(my_queue_use).
+
+-export([ok1/0, ok2/0, wrong1/0, wrong2/0, wrong3/0, wrong4/0, wrong5/0]).
+
+ok1() ->
+ my_queue_adt:is_empty(my_queue_adt:new()).
+
+ok2() ->
+ Q0 = my_queue_adt:new(),
+ Q1 = my_queue_adt:add(42, Q0),
+ {42, Q2} = my_queue_adt:dequeue(Q1),
+ my_queue_adt:is_empty(Q2).
+
+wrong1() ->
+ my_queue_adt:is_empty([]).
+
+wrong2() ->
+ Q0 = [],
+ my_queue_adt:add(42, Q0).
+
+wrong3() ->
+ Q0 = my_queue_adt:new(),
+ Q1 = my_queue_adt:add(42, Q0),
+ [42|Q2] = Q1,
+ Q2.
+
+wrong4() ->
+ Q0 = my_queue_adt:new(),
+ Q1 = my_queue_adt:add(42, Q0),
+ Q1 =:= [].
+
+wrong5() ->
+ Q0 = my_queue_adt:new(),
+ {42, Q2} = my_queue_adt:dequeue([42|Q0]),
+ Q2.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_adt.erl b/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_adt.erl
new file mode 100644
index 0000000000..3456f0e9c6
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_adt.erl
@@ -0,0 +1,9 @@
+-module(opaque_adt).
+-export([atom_or_list/1]).
+
+-opaque abc() :: 'a' | 'b' | 'c'.
+
+atom_or_list(1) -> a;
+atom_or_list(2) -> b;
+atom_or_list(3) -> c;
+atom_or_list(N) -> lists:duplicate(N, a).
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug1.erl b/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug1.erl
new file mode 100644
index 0000000000..5a03989853
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug1.erl
@@ -0,0 +1,16 @@
+%%---------------------------------------------------------------------
+%% A test for which the analysis went into an infinite loop due to
+%% specialization using structured type instead of the opaque one.
+%%---------------------------------------------------------------------
+
+-module(opaque_bug1).
+
+-export([test/1]).
+
+-record(c, {a::atom()}).
+
+-opaque erl_type() :: 'any' | #c{}.
+
+test(#c{a=foo} = T) -> local(T).
+
+local(#c{a=foo}) -> any.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug2.erl b/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug2.erl
new file mode 100644
index 0000000000..f193a58f59
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug2.erl
@@ -0,0 +1,13 @@
+%%---------------------------------------------------------------------
+%% A test for which the analysis gave a bogus warning due to
+%% considering the function call name to be of opaque type...
+%%---------------------------------------------------------------------
+
+-module(opaque_bug2).
+
+-export([test/0]).
+
+-opaque o() :: 'map'.
+
+test() ->
+ lists:map(fun(X) -> X+1 end, [1,2]).
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug3.erl b/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug3.erl
new file mode 100644
index 0000000000..71da82a1f6
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug3.erl
@@ -0,0 +1,19 @@
+%%---------------------------------------------------------------------
+%% A test for which the analysis gave wrong results because it did not
+%% handle the is_tuple/1 guard properly.
+%%---------------------------------------------------------------------
+
+-module(opaque_bug3).
+
+-export([test/1]).
+
+-record(c, {}).
+
+-opaque o() :: 'a' | #c{}.
+
+-spec test(o()) -> 42.
+
+test(#c{} = O) -> t(O).
+
+t(T) when is_tuple(T) -> 42;
+t(a) -> gazonk.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug4.erl b/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug4.erl
new file mode 100644
index 0000000000..a7ddc80fe8
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug4.erl
@@ -0,0 +1,21 @@
+%%---------------------------------------------------------------------
+%% A test for which the analysis gave wrong results due to erroneous
+%% specialization and incorrect handling of unions.
+%%---------------------------------------------------------------------
+
+-module(opaque_bug4).
+
+-export([ok/0, wrong/0]).
+
+%-spec ok() -> 'ok'.
+ok() ->
+ L = opaque_adt:atom_or_list(42),
+ foo(L).
+
+%-spec wrong() -> 'not_ok'.
+wrong() ->
+ A = opaque_adt:atom_or_list(1),
+ foo(A).
+
+foo(a) -> not_ok;
+foo([_|_]) -> ok.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/queue/queue_use.erl b/lib/dialyzer/test/opaque_SUITE_data/src/queue/queue_use.erl
new file mode 100644
index 0000000000..8d46bdb989
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/queue/queue_use.erl
@@ -0,0 +1,65 @@
+-module(queue_use).
+
+-export([ok1/0, ok2/0]).
+-export([wrong1/0, wrong2/0, wrong3/0, wrong4/0, wrong5/0, wrong6/0, wrong7/0, wrong8/0]).
+
+ok1() ->
+ queue:is_empty(queue:new()).
+
+ok2() ->
+ Q0 = queue:new(),
+ Q1 = queue:in(42, Q0),
+ {{value, 42}, Q2} = queue:out(Q1),
+ queue:is_empty(Q2).
+
+%%--------------------------------------------------
+
+wrong1() ->
+ queue:is_empty({[],[]}).
+
+wrong2() ->
+ Q0 = {[],[]},
+ queue:in(42, Q0).
+
+wrong3() ->
+ Q0 = queue:new(),
+ Q1 = queue:in(42, Q0),
+ {[42],Q2} = Q1,
+ Q2.
+
+wrong4() ->
+ Q0 = queue:new(),
+ Q1 = queue:in(42, Q0),
+ Q1 =:= {[42],[]}.
+
+wrong5() ->
+ {F, _R} = queue:new(),
+ F.
+
+wrong6() ->
+ {{value, 42}, Q2} = queue:out({[42],[]}),
+ Q2.
+
+%%--------------------------------------------------
+
+-record(db, {p, q}).
+
+wrong7() ->
+ add_unique(42, #db{p = [], q = queue:new()}).
+
+add_unique(E, DB) ->
+ case is_in_queue(E, DB) of
+ true -> DB;
+ false -> DB#db{q = queue:in(E, DB#db.q)}
+ end.
+
+is_in_queue(P, #db{q = {L1,L2}}) ->
+ lists:member(P, L1) orelse lists:member(P, L2).
+
+%%--------------------------------------------------
+
+wrong8() ->
+ tuple_queue({42, gazonk}).
+
+tuple_queue({F, Q}) ->
+ queue:in(F, Q).
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/rec/rec_adt.erl b/lib/dialyzer/test/opaque_SUITE_data/src/rec/rec_adt.erl
new file mode 100644
index 0000000000..f01cc5e519
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/rec/rec_adt.erl
@@ -0,0 +1,22 @@
+-module(rec_adt).
+
+-export([new/0, get_a/1, get_b/1, set_a/2, set_b/2]).
+
+-record(rec, {a :: atom(), b = 0 :: integer()}).
+
+-opaque rec() :: #rec{}.
+
+-spec new() -> rec().
+new() -> #rec{a = gazonk, b = 42}.
+
+-spec get_a(rec()) -> atom().
+get_a(#rec{a = A}) -> A.
+
+-spec get_b(rec()) -> integer().
+get_b(#rec{b = B}) -> B.
+
+-spec set_a(rec(), atom()) -> rec().
+set_a(R, A) -> R#rec{a = A}.
+
+-spec set_b(rec(), integer()) -> rec().
+set_b(R, B) -> R#rec{b = B}.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/rec/rec_use.erl b/lib/dialyzer/test/opaque_SUITE_data/src/rec/rec_use.erl
new file mode 100644
index 0000000000..358e9f918c
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/rec/rec_use.erl
@@ -0,0 +1,30 @@
+-module(rec_use).
+
+-export([ok1/0, ok2/0, wrong1/0, wrong2/0, wrong3/0, wrong4/0]).
+
+ok1() ->
+ rec_adt:set_a(rec_adt:new(), foo).
+
+ok2() ->
+ R1 = rec_adt:new(),
+ B1 = rec_adt:get_b(R1),
+ R2 = rec_adt:set_b(R1, 42),
+ B2 = rec_adt:get_b(R2),
+ B1 =:= B2.
+
+wrong1() ->
+ case rec_adt:new() of
+ {rec, _, 42} -> weird1;
+ R when tuple_size(R) =:= 3 -> weird2
+ end.
+
+wrong2() ->
+ R = list_to_tuple([rec, a, 42]),
+ rec_adt:get_a(R).
+
+wrong3() ->
+ R = rec_adt:new(),
+ R =:= {rec, gazonk, 42}.
+
+wrong4() ->
+ tuple_size(rec_adt:new()).
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/schuett_bug.erl b/lib/dialyzer/test/opaque_SUITE_data/src/schuett_bug.erl
new file mode 100644
index 0000000000..00c1aa57bf
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/schuett_bug.erl
@@ -0,0 +1,28 @@
+%%---------------------------------------------------------------------------
+%% From: Thorsten Schuett <[email protected]>
+%% Date: 7 July 2010
+%%
+%% When I run dialyzer of R14A on the attached code, it complains about
+%% the new_neighborhood/1 function:
+%% nodelist.erl:12: Invalid type specification for function
+%% nodelist:new_neighborhood/1. The success typing is (_) -> {[any(),...]}
+%%
+%% However, when I change the type nodelist() from opaque to non-opaque
+%% (see comment), dialyzer accepts the code. The types seem to be correct.
+%% The problem seems to be with nested opaque types.
+%%---------------------------------------------------------------------------
+
+-module(schuett_bug).
+
+-export([new_neighborhood/1]).
+
+-export_type([nodelist/0, neighborhood/0]).
+
+-type node_type() :: 'node_type'.
+
+-opaque nodelist() :: [node_type(),...]. % change to -type
+-opaque neighborhood() :: {nodelist()}.
+
+-spec new_neighborhood(Node::node_type()) -> neighborhood().
+new_neighborhood(Node) ->
+ {[Node]}.
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
new file mode 100644
index 0000000000..9c8ea0af1c
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/timer/timer_use.erl
@@ -0,0 +1,20 @@
+%%---------------------------------------------------------------------------
+%% 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
+%% The test is supposed to check that these cases are treated properly.
+%%---------------------------------------------------------------------------
+
+-module(timer_use).
+-export([wrong/0]).
+
+-spec wrong() -> error.
+
+wrong() ->
+ case timer:kill_after(42, self()) of
+ gazonk -> weird;
+ {ok, 42} -> weirder;
+ {Tag, gazonk} when Tag =/= error -> weirdest;
+ {error, _} -> error
+ end.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/union/union_adt.erl b/lib/dialyzer/test/opaque_SUITE_data/src/union/union_adt.erl
new file mode 100644
index 0000000000..5ca3202bba
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/union/union_adt.erl
@@ -0,0 +1,19 @@
+-module(union_adt).
+-export([new/1, new_a/1, new_rec/1]).
+
+-record(rec, {x = 42 :: integer()}).
+
+-opaque u() :: 'aaa' | 'bbb' | #rec{}.
+
+new(a) -> aaa;
+new(b) -> bbb;
+new(X) when is_integer(X) ->
+ #rec{x = X}.
+
+%% the following two functions (and their uses in union_use.erl) test
+%% that the return type is the opaque one and not just a subtype of it
+
+new_a(a) -> aaa.
+
+new_rec(X) when is_integer(X) ->
+ #rec{x = X}.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/union/union_use.erl b/lib/dialyzer/test/opaque_SUITE_data/src/union/union_use.erl
new file mode 100644
index 0000000000..6a103279cd
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/union/union_use.erl
@@ -0,0 +1,16 @@
+-module(union_use).
+
+-export([test/1, wrong_a/0, wrong_rec/0]).
+
+test(X) ->
+ case union_adt:new(X) of
+ A when is_atom(A) -> atom;
+ T when is_tuple(T) -> tuple
+ end.
+
+wrong_a() ->
+ aaa = union_adt:new_a(a),
+ ok.
+
+wrong_rec() ->
+ is_tuple(union_adt:new_rec(42)).
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings.hrl b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings.hrl
new file mode 100644
index 0000000000..b815be5e1d
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings.hrl
@@ -0,0 +1,204 @@
+%%
+%% wings.hrl --
+%%
+%% Global record definition and defines.
+%%
+%% Copyright (c) 2001-2005 Bjorn Gustavsson
+%%
+%% See the file "license.terms" for information on usage and redistribution
+%% of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+%%
+%% $Id: wings.hrl,v 1.1 2009/01/25 18:55:33 kostis Exp $
+%%
+
+-include("wings_intl.hrl").
+
+-ifdef(NEED_ESDL).
+-include_lib("esdl/include/sdl.hrl").
+-include_lib("esdl/include/sdl_events.hrl").
+-include_lib("esdl/include/sdl_video.hrl").
+-include_lib("esdl/include/sdl_keyboard.hrl").
+-include_lib("esdl/include/sdl_mouse.hrl").
+-include_lib("esdl/src/sdl_util.hrl").
+-define(CTRL_BITS, ?KMOD_CTRL).
+-define(ALT_BITS, ?KMOD_ALT).
+-define(SHIFT_BITS, ?KMOD_SHIFT).
+-define(META_BITS, ?KMOD_META).
+-endif.
+
+-define(WINGS_VERSION, ?wings_version).
+
+-define(CHAR_HEIGHT, wings_text:height()).
+-define(CHAR_WIDTH, wings_text:width()).
+
+-define(LINE_HEIGHT, (?CHAR_HEIGHT+2)).
+-define(GROUND_GRID_SIZE, 1).
+-define(CAMERA_DIST, (8.0*?GROUND_GRID_SIZE)).
+-define(NORMAL_LINEWIDTH, 1.0).
+-define(DEGREE, 176). %Degree character.
+
+-define(HIT_BUF_SIZE, (1024*1024)).
+
+-define(PANE_COLOR, {0.52,0.52,0.52}).
+-define(BEVEL_HIGHLIGHT, {0.9,0.9,0.9}).
+-define(BEVEL_LOWLIGHT, {0.3,0.3,0.3}).
+-define(BEVEL_HIGHLIGHT_MIX, 0.5).
+-define(BEVEL_LOWLIGHT_MIX, 0.5).
+
+-define(SLOW(Cmd), begin wings_io:hourglass(), Cmd end).
+-define(TC(Cmd), wings_util:tc(fun() -> Cmd end, ?MODULE, ?LINE)).
+
+-ifdef(DEBUG).
+-define(ASSERT(E), case E of
+ true -> ok;
+ _ ->
+ erlang:error({assertion_failed,?MODULE,?LINE})
+ end).
+-define(CHECK_ERROR(), wings_gl:check_error(?MODULE, ?LINE)).
+-else.
+-define(ASSERT(E),ok).
+-define(CHECK_ERROR(), ok).
+-endif.
+
+%% Display lists per object.
+%% Important: Plain integers and integers in lists will be assumed to
+%% be display lists. Arbitrary integers must be stored inside a tuple
+%% or record to not be interpreted as a display list.
+-record(dlo,
+ {work=none, %Workmode faces.
+ smooth=none, %Smooth-shaded faces.
+ edges=none, %Edges and wire-frame.
+ vs=none, %Unselected vertices.
+ hard=none, %Hard edges.
+ sel=none, %Selected items.
+ orig_sel=none, %Original selection.
+ normals=none, %Normals.
+ pick=none, %For picking.
+ proxy_faces=none, %Smooth proxy faces.
+ proxy_edges=none, %Smooth proxy edges.
+
+ %% Miscellanous.
+ hilite=none, %Hilite display list.
+ mirror=none, %Virtual mirror data.
+ ns=none, %Normals/positions per face.
+
+ %% Source for display lists.
+ src_we=none, %Source object.
+ src_sel=none, %Source selection.
+ orig_mode=none, %Original selection mode.
+ split=none, %Split data.
+ drag=none, %For dragging.
+ transparent=false, %Object includes transparancy.
+ proxy_data=none, %Data for smooth proxy.
+ open=false, %Open (has hole).
+
+ %% List of display lists known to be needed only based
+ %% on display modes, not whether the lists themselves exist.
+ %% Example: [work,edges]
+ needed=[]
+ }).
+
+%% Main state record containing all objects and other important state.
+-record(st,
+ {shapes, %All visible shapes
+ selmode, %Selection mode:
+ % vertex, edge, face, body
+ sh=false, %Smart highlight active: true|false
+ sel=[], %Current sel: [{Id,GbSet}]
+ ssels=[], %Saved selections:
+ % [{Name,Mode,GbSet}]
+ temp_sel=none, %Selection only temporary?
+
+ mat, %Defined materials (GbTree).
+ pal=[], %Palette
+ file, %Current filename.
+ saved, %True if model has been saved.
+ onext, %Next object id to use.
+ bb=none, %Saved bounding box.
+ edge_loop=none, %Previous edge loop.
+ views={0,{}}, %{Current,TupleOfViews}
+ pst=gb_trees:empty(), %Plugin State Info
+ % gb_tree where key is plugin module
+
+ %% Previous commands.
+ repeatable, %Last repeatable command.
+ ask_args, %Ask arguments.
+ drag_args, %Drag arguments for command.
+ def, %Default operations.
+
+ %% Undo information.
+ top, %Top of stack.
+ bottom, %Bottom of stack.
+ next_is_undo, %State of undo/redo toggle.
+ undone %States that were undone.
+ }).
+
+%% The Winged-Edge data structure.
+%% See http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/model/winged-e.html
+-record(we,
+ {id, %Shape id.
+ perm=0, %Permissions:
+ % 0 - Everything allowed.
+ % 1 - Visible, can't select.
+ % [] or {Mode,GbSet} -
+ % Invisible, can't select.
+ % The GbSet contains the
+ % object's selection.
+ name, %Name.
+ es, %gb_tree containing edges
+ fs, %gb_tree containing faces
+ he, %gb_sets containing hard edges
+ vc, %Connection info (=incident edge)
+ % for vertices.
+ vp, %Vertex positions.
+ pst=gb_trees:empty(), %Plugin State Info,
+ % gb_tree where key is plugin module
+ mat=default, %Materials.
+ next_id, %Next free ID for vertices,
+ % edges, and faces.
+ % (Needed because we never re-use
+ % IDs.)
+ mode, %'vertex'/'material'/'uv'
+ mirror=none, %Mirror: none|Face
+ light=none, %Light data: none|Light
+ has_shape=true %true|false
+ }).
+
+-define(IS_VISIBLE(Perm), (Perm =< 1)).
+-define(IS_NOT_VISIBLE(Perm), (Perm > 1)).
+-define(IS_SELECTABLE(Perm), (Perm == 0)).
+-define(IS_NOT_SELECTABLE(Perm), (Perm =/= 0)).
+
+-define(IS_LIGHT(We), ((We#we.light =/= none) and (not We#we.has_shape))).
+-define(IS_ANY_LIGHT(We), (We#we.light =/= none)).
+-define(HAS_SHAPE(We), (We#we.has_shape)).
+%-define(IS_LIGHT(We), (We#we.light =/= none)).
+%-define(IS_NOT_LIGHT(We), (We#we.light =:= none)).
+
+%% Edge in a winged-edge shape.
+-record(edge,
+ {vs, %Start vertex for edge
+ ve, %End vertex for edge
+ a=none, %Color or UV coordinate.
+ b=none, %Color or UV coordinate.
+ lf, %Left face
+ rf, %Right face
+ ltpr, %Left traversal predecessor
+ ltsu, %Left traversal successor
+ rtpr, %Right traversal predecessor
+ rtsu %Right traversal successor
+ }).
+
+%% The current view/camera.
+-record(view,
+ {origin,
+ distance, % From origo.
+ azimuth,
+ elevation,
+ pan_x, %Panning in X direction.
+ pan_y, %Panning in Y direction.
+ along_axis=none, %Which axis viewed along.
+ fov, %Field of view.
+ hither, %Near clipping plane.
+ yon %Far clipping plane.
+ }).
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_dissolve.erl b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_dissolve.erl
new file mode 100644
index 0000000000..c469f0a45d
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_dissolve.erl
@@ -0,0 +1,375 @@
+%%
+%% wings_dissolve.erl --
+%%
+%% This module implements dissolve of faces.
+%%
+
+-module(wings_dissolve).
+
+-export([faces/2, complement/2]).
+
+-include("wings.hrl").
+
+%% faces([Face], We) -> We'
+%% Dissolve the given faces.
+faces([], We) -> We;
+faces(Faces, #we{fs=Ftab0}=We) ->
+ case gb_sets:is_empty(Faces) of
+ true -> We;
+ false when is_list(Faces) ->
+ Complement = ordsets:subtract(gb_trees:keys(Ftab0),
+ ordsets:from_list(Faces)),
+ dissolve_1(Faces, Complement, We);
+ false ->
+ Complement = ordsets:subtract(gb_trees:keys(Ftab0),
+ gb_sets:to_list(Faces)),
+ dissolve_1(Faces, Complement, We)
+ end.
+
+faces([], _, We) -> We;
+faces(Faces,Complement,We) ->
+ case gb_sets:is_empty(Faces) of
+ true -> We;
+ false -> dissolve_1(Faces, Complement,We)
+ end.
+
+dissolve_1(Faces, Complement, We0) ->
+ We1 = optimistic_dissolve(Faces,Complement,We0#we{vc=undefined}),
+ NewFaces = wings_we:new_items_as_ordset(face, We0, We1),
+ We2 = wings_face:delete_bad_faces(NewFaces, We1),
+ We = wings_we:rebuild(We2),
+ case wings_we:is_consistent(We) of
+ true ->
+ We;
+ false ->
+ io:format("Dissolving would cause an inconsistent object structure.")
+ end.
+
+%% complement([Face], We) -> We'
+%% Dissolve all faces BUT the given faces. Also invalidate the
+%% mirror face if it existed and was dissolved.
+complement(Fs0, #we{fs=Ftab0}=We0) when is_list(Fs0) ->
+ Fs = ordsets:subtract(gb_trees:keys(Ftab0), ordsets:from_list(Fs0)),
+ case faces(Fs, Fs0, We0) of
+ #we{mirror=none}=We -> We;
+ #we{mirror=Face,fs=Ftab}=We ->
+ case gb_trees:is_defined(Face, Ftab) of
+ false -> We;
+ true -> We#we{mirror=none}
+ end
+ end;
+complement(Fs, We) -> complement(gb_sets:to_list(Fs), We).
+
+optimistic_dissolve(Faces0, Compl, We0) ->
+ %% Optimistically assume that we have a simple region without
+ %% any holes.
+ case outer_edge_loop(Faces0, We0) of
+ error ->
+ %% Assumption was wrong. We need to partition the selection
+ %% and dissolve each partition in turn.
+ Parts = wings_sel:face_regions(Faces0, We0),
+ complex_dissolve(Parts, We0);
+ [_|_]=Loop ->
+ %% Assumption was correct.
+ simple_dissolve(Faces0, Compl, Loop, We0)
+ end.
+
+%% simple_dissolve(Faces, Loop, We0) -> We
+%% Dissolve a region of faces with no holes and no
+%% repeated vertices in the outer edge loop.
+
+simple_dissolve(Faces0, Compl, Loop, We0) ->
+ Faces = to_gb_set(Faces0),
+ OldFace = gb_sets:smallest(Faces),
+ Mat = wings_facemat:face(OldFace, We0),
+ We1 = fix_materials(Faces, Compl, We0),
+ #we{es=Etab0,fs=Ftab0,he=Htab0} = We1,
+ {Ftab1,Etab1,Htab} = simple_del(Faces, Ftab0, Etab0, Htab0, We1),
+ {NewFace,We2} = wings_we:new_id(We1),
+ Ftab = gb_trees:insert(NewFace, hd(Loop), Ftab1),
+ Last = lists:last(Loop),
+ Etab = update_outer([Last|Loop], Loop, NewFace, Ftab, Etab1),
+ We = We2#we{es=Etab,fs=Ftab,he=Htab},
+ wings_facemat:assign(Mat, [NewFace], We).
+
+fix_materials(Del,Keep,We) ->
+ case gb_sets:size(Del) < length(Keep) of
+ true ->
+ wings_facemat:delete_faces(Del,We);
+ false ->
+ wings_facemat:keep_faces(Keep,We)
+ end.
+
+to_gb_set(List) when is_list(List) ->
+ gb_sets:from_list(List);
+to_gb_set(S) -> S.
+
+%% Delete faces and inner edges for a simple region.
+simple_del(Faces, Ftab0, Etab0, Htab0, We) ->
+ case {gb_trees:size(Ftab0),gb_sets:size(Faces)} of
+ {AllSz,FaceSz} when AllSz < 2*FaceSz ->
+ %% At least half of the faces are selected.
+ %% It is faster to find the edges for the
+ %% unselected faces.
+ UnselFaces = ordsets:subtract(gb_trees:keys(Ftab0),
+ gb_sets:to_list(Faces)),
+
+ UnselSet = sofs:from_external(UnselFaces, [face]),
+ Ftab1 = sofs:from_external(gb_trees:to_list(Ftab0),
+ [{face,edge}]),
+ Ftab2 = sofs:restriction(Ftab1, UnselSet),
+ Ftab = gb_trees:from_orddict(sofs:to_external(Ftab2)),
+
+ Keep0 = wings_face:to_edges(UnselFaces, We),
+ Keep = sofs:set(Keep0, [edge]),
+ Etab1 = sofs:from_external(gb_trees:to_list(Etab0),
+ [{edge,info}]),
+ Etab2 = sofs:restriction(Etab1, Keep),
+ Etab = gb_trees:from_orddict(sofs:to_external(Etab2)),
+
+ Htab = simple_del_hard(Htab0, sofs:to_external(Keep), undefined),
+ {Ftab,Etab,Htab};
+ {_,_} ->
+ Ftab = lists:foldl(fun(Face, Ft) ->
+ gb_trees:delete(Face, Ft)
+ end, Ftab0, gb_sets:to_list(Faces)),
+ Inner = wings_face:inner_edges(Faces, We),
+ Etab = lists:foldl(fun(Edge, Et) ->
+ gb_trees:delete(Edge, Et)
+ end, Etab0, Inner),
+ Htab = simple_del_hard(Htab0, undefined, Inner),
+ {Ftab,Etab,Htab}
+ end.
+
+simple_del_hard(Htab, Keep, Remove) ->
+ case gb_sets:is_empty(Htab) of
+ true -> Htab;
+ false -> simple_del_hard_1(Htab, Keep, Remove)
+ end.
+
+simple_del_hard_1(Htab, Keep, undefined) ->
+ gb_sets:intersection(Htab, gb_sets:from_ordset(Keep));
+simple_del_hard_1(Htab, undefined, Remove) ->
+ gb_sets:difference(Htab, gb_sets:from_ordset(Remove)).
+
+%% complex([Partition], We0) -> We0
+%% The general dissolve.
+
+complex_dissolve([Faces|T], We0) ->
+ Face = gb_sets:smallest(Faces),
+ Mat = wings_facemat:face(Face, We0),
+ We1 = wings_facemat:delete_faces(Faces, We0),
+ Parts = outer_edge_partition(Faces, We1),
+ We = do_dissolve(Faces, Parts, Mat, We0, We1),
+ complex_dissolve(T, We);
+complex_dissolve([], We) -> We.
+
+do_dissolve(Faces, Ess, Mat, WeOrig, We0) ->
+ We1 = do_dissolve_faces(Faces, We0),
+ Inner = wings_face:inner_edges(Faces, WeOrig),
+ We2 = delete_inner(Inner, We1),
+ #we{he=Htab0} = We = do_dissolve_1(Ess, Mat, We2),
+ Htab = gb_sets:difference(Htab0, gb_sets:from_list(Inner)),
+ We#we{he=Htab}.
+
+do_dissolve_1([EdgeList|Ess], Mat, #we{es=Etab0,fs=Ftab0}=We0) ->
+ {Face,We1} = wings_we:new_id(We0),
+ Ftab = gb_trees:insert(Face, hd(EdgeList), Ftab0),
+ Last = lists:last(EdgeList),
+ Etab = update_outer([Last|EdgeList], EdgeList, Face, Ftab, Etab0),
+ We2 = We1#we{es=Etab,fs=Ftab},
+ We = wings_facemat:assign(Mat, [Face], We2),
+ do_dissolve_1(Ess, Mat, We);
+do_dissolve_1([], _Mat, We) -> We.
+
+do_dissolve_faces(Faces, #we{fs=Ftab0}=We) ->
+ Ftab = lists:foldl(fun(Face, Ft) ->
+ gb_trees:delete(Face, Ft)
+ end, Ftab0, gb_sets:to_list(Faces)),
+ We#we{fs=Ftab}.
+
+delete_inner(Inner, #we{es=Etab0}=We) ->
+ Etab = lists:foldl(fun(Edge, Et) ->
+ gb_trees:delete(Edge, Et)
+ end, Etab0, Inner),
+ We#we{es=Etab}.
+
+update_outer([Pred|[Edge|Succ]=T], More, Face, Ftab, Etab0) ->
+ #edge{rf=Rf} = R0 = gb_trees:get(Edge, Etab0),
+ Rec = case gb_trees:is_defined(Rf, Ftab) of
+ true ->
+ ?ASSERT(false == gb_trees:is_defined(R0#edge.lf, Ftab)),
+ LS = succ(Succ, More),
+ R0#edge{lf=Face,ltpr=Pred,ltsu=LS};
+ false ->
+ ?ASSERT(true == gb_trees:is_defined(R0#edge.lf, Ftab)),
+ RS = succ(Succ, More),
+ R0#edge{rf=Face,rtpr=Pred,rtsu=RS}
+ end,
+ Etab = gb_trees:update(Edge, Rec, Etab0),
+ update_outer(T, More, Face, Ftab, Etab);
+update_outer([_], _More, _Face, _Ftab, Etab) -> Etab.
+
+succ([Succ|_], _More) -> Succ;
+succ([], [Succ|_]) -> Succ.
+
+%% outer_edge_loop(FaceSet,WingedEdge) -> [Edge] | error.
+%% Partition the outer edges of the FaceSet into a single closed loop.
+%% Return 'error' if the faces in FaceSet does not form a
+%% simple region without holes.
+%%
+%% Equvivalent to
+%% case outer_edge_partition(FaceSet,WingedEdge) of
+%% [Loop] -> Loop;
+%% [_|_] -> error
+%% end.
+%% but faster.
+
+outer_edge_loop(Faces, We) ->
+ case lists:sort(collect_outer_edges(Faces, We)) of
+ [] -> error;
+ [{Key,Val}|Es0] ->
+ case any_duplicates(Es0, Key) of
+ false ->
+ Es = gb_trees:from_orddict(Es0),
+ N = gb_trees:size(Es),
+ outer_edge_loop_1(Val, Es, Key, N, []);
+ true -> error
+ end
+ end.
+
+outer_edge_loop_1({Edge,V}, _, V, 0, Acc) ->
+ %% This edge completes the loop, and we have used all possible edges.
+ [Edge|Acc];
+outer_edge_loop_1({_,V}, _, V, _N, _) ->
+ %% Loop is complete, but we haven't used all edges.
+ error;
+outer_edge_loop_1({_,_}, _, _, 0, _) ->
+ %% We have used all possible edges, but somehow the loop
+ %% is not complete. I can't see how this is possible.
+ erlang:error(internal_error);
+outer_edge_loop_1({Edge,Vb}, Es, EndV, N, Acc0) ->
+ Acc = [Edge|Acc0],
+ outer_edge_loop_1(gb_trees:get(Vb, Es), Es, EndV, N-1, Acc).
+
+any_duplicates([{V,_}|_], V) -> true;
+any_duplicates([_], _) -> false;
+any_duplicates([{V,_}|Es], _) -> any_duplicates(Es, V).
+
+%% outer_edge_partition(FaceSet, WingedEdge) -> [[Edge]].
+%% Partition the outer edges of the FaceSet. Each partion
+%% of edges form a closed loop with no repeated vertices.
+%% Outer edges are edges that have one face in FaceSet
+%% and one outside.
+%% It is assumed that FaceSet consists of one region returned by
+%% wings_sel:face_regions/2.
+
+outer_edge_partition(Faces, We) ->
+ F0 = collect_outer_edges(Faces, We),
+ F = gb_trees:from_orddict(wings_util:rel2fam(F0)),
+ partition_edges(F, []).
+
+collect_outer_edges(Faces, We) when is_list(Faces) ->
+ collect_outer_edges_1(Faces, gb_sets:from_list(Faces), We);
+collect_outer_edges(Faces, We) ->
+ collect_outer_edges_1(gb_sets:to_list(Faces), Faces, We).
+
+collect_outer_edges_1(Fs0, Faces0, #we{fs=Ftab}=We) ->
+ case {gb_trees:size(Ftab),gb_sets:size(Faces0)} of
+ {AllSz,FaceSz} when AllSz < 2*FaceSz ->
+ Fs = ordsets:subtract(gb_trees:keys(Ftab), Fs0),
+ Faces = gb_sets:from_ordset(Fs),
+ Coll = collect_outer_edges_a(Faces),
+ wings_face:fold_faces(Coll, [], Fs, We);
+ {_,_} ->
+ Coll = collect_outer_edges_b(Faces0),
+ wings_face:fold_faces(Coll, [], Fs0, We)
+ end.
+
+collect_outer_edges_a(Faces) ->
+ fun(Face, _, Edge, #edge{ve=V,vs=OtherV,lf=Face,rf=Other}, Acc) ->
+ case gb_sets:is_member(Other, Faces) of
+ false -> [{V,{Edge,OtherV}}|Acc];
+ true -> Acc
+ end;
+ (Face, _, Edge, #edge{ve=OtherV,vs=V,rf=Face,lf=Other}, Acc) ->
+ case gb_sets:is_member(Other, Faces) of
+ false -> [{V,{Edge,OtherV}}|Acc];
+ true -> Acc
+ end
+ end.
+
+collect_outer_edges_b(Faces) ->
+ fun(Face, _, Edge, #edge{vs=V,ve=OtherV,lf=Face,rf=Other}, Acc) ->
+ case gb_sets:is_member(Other, Faces) of
+ false -> [{V,{Edge,OtherV}}|Acc];
+ true -> Acc
+ end;
+ (Face, _, Edge, #edge{vs=OtherV,ve=V,rf=Face,lf=Other}, Acc) ->
+ case gb_sets:is_member(Other, Faces) of
+ false -> [{V,{Edge,OtherV}}|Acc];
+ true -> Acc
+ end
+ end.
+
+partition_edges(Es0, Acc) ->
+ case gb_trees:is_empty(Es0) of
+ true -> Acc;
+ false ->
+ {Key,Val,Es1} = gb_trees:take_smallest(Es0),
+ {Cycle,Es} = part_collect_cycle(Key, Val, Es1, []),
+ partition_edges(Es, [Cycle|Acc])
+ end.
+
+%% part_collect_cycle(Vertex, VertexInfo, EdgeInfo, Acc0) ->
+%% none | {[Edge],EdgeInfo}
+%% Collect the cycle starting with Vertex.
+%%
+%% Note: This function can only return 'none' when called
+%% recursively.
+
+part_collect_cycle(_, repeated, _, _) ->
+ %% Repeated vertex - we are not allowed to go this way.
+ %% Can only happen if we were called recursively because
+ %% a fork was encountered.
+ none;
+part_collect_cycle(_Va, [{Edge,Vb}], Es0, Acc0) ->
+ %% Basic case. Only one way to go.
+ Acc = [Edge|Acc0],
+ case gb_trees:lookup(Vb, Es0) of
+ none ->
+ {Acc,Es0};
+ {value,Val} ->
+ Es = gb_trees:delete(Vb, Es0),
+ part_collect_cycle(Vb, Val, Es, Acc)
+ end;
+part_collect_cycle(Va, [Val|More], Es0, []) ->
+ %% No cycle started yet and we have multiple choice of
+ %% edges out from this vertex. It doesn't matter which
+ %% edge we follow, so we'll follow the first one.
+ {Cycle,Es} = part_collect_cycle(Va, [Val], Es0, []),
+ {Cycle,gb_trees:insert(Va, More, Es)};
+part_collect_cycle(Va, Edges, Es0, Acc) ->
+ %% We have a partially collected cycle and we have a
+ %% fork (multiple choice of edges). Here we must choose
+ %% an edge that closes the cycle without passing Va
+ %% again (because repeated vertices are not allowed).
+ Es = gb_trees:insert(Va, repeated, Es0),
+ part_fork(Va, Edges, Es, Acc, []).
+
+part_fork(Va, [Val|More], Es0, Acc, Tried) ->
+ %% Try to complete the cycle by following this edge.
+ case part_collect_cycle(Va, [Val], Es0, Acc) of
+ none ->
+ %% Failure - try the next edge.
+ part_fork(Va, More, Es0, Acc, [Val|Tried]);
+ {Cycle,Es} ->
+ %% Found a cycle. Update the vertex information
+ %% with all edges remaining.
+ {Cycle,gb_trees:update(Va, lists:reverse(Tried, More), Es)}
+ end;
+part_fork(_, [], _, _, _) ->
+ %% None of edges were possible. Can only happen if this function
+ %% was called recursively (i.e. if we hit another fork while
+ %% processing a fork).
+ none.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_edge.erl b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_edge.erl
new file mode 100644
index 0000000000..3483acb711
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_edge.erl
@@ -0,0 +1,243 @@
+%%
+%% wings_edge.erl --
+%%
+%% This module contains most edge command and edge utility functions.
+%%
+%% Copyright (c) 2001-2008 Bjorn Gustavsson.
+%%
+%% See the file "license.terms" for information on usage and redistribution
+%% of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+%%
+%% $Id: wings_edge.erl,v 1.1 2009/01/25 18:55:33 kostis Exp $
+%%
+
+-module(wings_edge).
+
+-export([dissolve_edges/2]).
+
+-include("wings.hrl").
+
+%%%
+%%% Dissolve.
+%%%
+
+dissolve_edges(Edges0, We0) when is_list(Edges0) ->
+ #we{es=Etab} = We1 = lists:foldl(fun internal_dissolve_edge/2, We0, Edges0),
+ case [E || E <- Edges0, gb_trees:is_defined(E, Etab)] of
+ Edges0 ->
+ %% No edge was deleted in the last pass. We are done.
+ We = wings_we:rebuild(We0#we{vc=undefined}),
+ wings_we:validate_mirror(We);
+ Edges ->
+ dissolve_edges(Edges, We1)
+ end;
+dissolve_edges(Edges, We) ->
+ dissolve_edges(gb_sets:to_list(Edges), We).
+
+internal_dissolve_edge(Edge, #we{es=Etab}=We0) ->
+ case gb_trees:lookup(Edge, Etab) of
+ none -> We0;
+ {value,#edge{ltpr=Same,ltsu=Same,rtpr=Same,rtsu=Same}} ->
+ Empty = gb_trees:empty(),
+ We0#we{vc=Empty,vp=Empty,es=Empty,fs=Empty,he=gb_sets:empty()};
+ {value,#edge{rtpr=Back,ltsu=Back}=Rec} ->
+ merge_edges(backward, Edge, Rec, We0);
+ {value,#edge{rtsu=Forward,ltpr=Forward}=Rec} ->
+ merge_edges(forward, Edge, Rec, We0);
+ {value,Rec} ->
+ try dissolve_edge_1(Edge, Rec, We0) of
+ We -> We
+ catch
+ throw:hole -> We0
+ end
+ end.
+
+%% dissolve_edge_1(Edge, EdgeRecord, We) -> We
+%% Remove an edge and a face. If one of the faces is degenerated
+%% (only consists of two edges), remove that one. Otherwise, it
+%% doesn't matter which face we remove.
+dissolve_edge_1(Edge, #edge{lf=Remove,rf=Keep,ltpr=Same,ltsu=Same}=Rec, We) ->
+ dissolve_edge_2(Edge, Remove, Keep, Rec, We);
+dissolve_edge_1(Edge, #edge{lf=Keep,rf=Remove}=Rec, We) ->
+ dissolve_edge_2(Edge, Remove, Keep, Rec, We).
+
+dissolve_edge_2(Edge, FaceRemove, FaceKeep,
+ #edge{ltpr=LP,ltsu=LS,rtpr=RP,rtsu=RS},
+ #we{fs=Ftab0,es=Etab0,he=Htab0}=We0) ->
+ %% First change face for all edges surrounding the face we will remove.
+ Etab1 = wings_face:fold(
+ fun (_, E, _, IntEtab) when E =:= Edge -> IntEtab;
+ (_, E, R, IntEtab) ->
+ case R of
+ #edge{lf=FaceRemove,rf=FaceKeep} ->
+ throw(hole);
+ #edge{rf=FaceRemove,lf=FaceKeep} ->
+ throw(hole);
+ #edge{lf=FaceRemove} ->
+ gb_trees:update(E, R#edge{lf=FaceKeep}, IntEtab);
+ #edge{rf=FaceRemove} ->
+ gb_trees:update(E, R#edge{rf=FaceKeep}, IntEtab)
+ end
+ end, Etab0, FaceRemove, We0),
+
+ %% Patch all predecessors and successor of the edge we will remove.
+ Etab2 = patch_edge(LP, RS, Edge, Etab1),
+ Etab3 = patch_edge(LS, RP, Edge, Etab2),
+ Etab4 = patch_edge(RP, LS, Edge, Etab3),
+ Etab5 = patch_edge(RS, LP, Edge, Etab4),
+
+ %% Remove the edge.
+ Etab = gb_trees:delete(Edge, Etab5),
+ Htab = hardness(Edge, soft, Htab0),
+
+ %% Remove the face. Patch the face entry for the remaining face.
+ Ftab1 = gb_trees:delete(FaceRemove, Ftab0),
+ We1 = wings_facemat:delete_face(FaceRemove, We0),
+ Ftab = gb_trees:update(FaceKeep, LP, Ftab1),
+
+ %% Return result.
+ We = We1#we{es=Etab,fs=Ftab,vc=undefined,he=Htab},
+ AnEdge = gb_trees:get(FaceKeep, Ftab),
+ case gb_trees:get(AnEdge, Etab) of
+ #edge{lf=FaceKeep,ltpr=Same,ltsu=Same} ->
+ internal_dissolve_edge(AnEdge, We);
+ #edge{rf=FaceKeep,rtpr=Same,rtsu=Same} ->
+ internal_dissolve_edge(AnEdge, We);
+ _Other ->
+ case wings_we:is_face_consistent(FaceKeep, We) of
+ true ->
+ We;
+ false ->
+ io:format("Dissolving would cause a badly formed face.")
+ end
+ end.
+
+%%
+%% We like winged edges, but not winged vertices (a vertex with
+%% only two edges connected to it). We will remove the winged vertex
+%% by joining the two edges connected to it.
+%%
+
+merge_edges(Dir, Edge, Rec, #we{es=Etab}=We) ->
+ {Va,Vb,_,_,_,_,To,To} = half_edge(Dir, Rec),
+ case gb_trees:get(To, Etab) of
+ #edge{vs=Va,ve=Vb} ->
+ del_2edge_face(Dir, Edge, Rec, To, We);
+ #edge{vs=Vb,ve=Va} ->
+ del_2edge_face(Dir, Edge, Rec, To, We);
+ _Other ->
+ merge_1(Dir, Edge, Rec, To, We)
+ end.
+
+merge_1(Dir, Edge, Rec, To, #we{es=Etab0,fs=Ftab0,he=Htab0}=We) ->
+ OtherDir = reverse_dir(Dir),
+ {Vkeep,Vdelete,Lf,Rf,A,B,L,R} = half_edge(OtherDir, Rec),
+ Etab1 = patch_edge(L, To, Edge, Etab0),
+ Etab2 = patch_edge(R, To, Edge, Etab1),
+ Etab3 = patch_half_edge(To, Vkeep, Lf, A, L, Rf, B, R, Vdelete, Etab2),
+ Htab = hardness(Edge, soft, Htab0),
+ Etab = gb_trees:delete(Edge, Etab3),
+ #edge{lf=Lf,rf=Rf} = Rec,
+ Ftab1 = update_face(Lf, To, Edge, Ftab0),
+ Ftab = update_face(Rf, To, Edge, Ftab1),
+ merge_2(To, We#we{es=Etab,fs=Ftab,he=Htab,vc=undefined}).
+
+merge_2(Edge, #we{es=Etab}=We) ->
+ %% If the merged edge is part of a two-edge face, we must
+ %% remove that edge too.
+ case gb_trees:get(Edge, Etab) of
+ #edge{ltpr=Same,ltsu=Same} ->
+ internal_dissolve_edge(Edge, We);
+ #edge{rtpr=Same,rtsu=Same} ->
+ internal_dissolve_edge(Edge, We);
+ _Other -> We
+ end.
+
+update_face(Face, Edge, OldEdge, Ftab) ->
+ case gb_trees:get(Face, Ftab) of
+ OldEdge -> gb_trees:update(Face, Edge, Ftab);
+ _Other -> Ftab
+ end.
+
+del_2edge_face(Dir, EdgeA, RecA, EdgeB,
+ #we{es=Etab0,fs=Ftab0,he=Htab0}=We) ->
+ {_,_,Lf,Rf,_,_,_,_} = half_edge(reverse_dir(Dir), RecA),
+ RecB = gb_trees:get(EdgeB, Etab0),
+ Del = gb_sets:from_list([EdgeA,EdgeB]),
+ EdgeANear = stabile_neighbor(RecA, Del),
+ EdgeBNear = stabile_neighbor(RecB, Del),
+ Etab1 = patch_edge(EdgeANear, EdgeBNear, EdgeA, Etab0),
+ Etab2 = patch_edge(EdgeBNear, EdgeANear, EdgeB, Etab1),
+ Etab3 = gb_trees:delete(EdgeA, Etab2),
+ Etab = gb_trees:delete(EdgeB, Etab3),
+
+ %% Patch hardness table.
+ Htab1 = hardness(EdgeA, soft, Htab0),
+ Htab = hardness(EdgeB, soft, Htab1),
+
+ %% Patch the face table.
+ #edge{lf=Klf,rf=Krf} = gb_trees:get(EdgeANear, Etab),
+ KeepFaces = ordsets:from_list([Klf,Krf]),
+ EdgeAFaces = ordsets:from_list([Lf,Rf]),
+ [DelFace] = ordsets:subtract(EdgeAFaces, KeepFaces),
+ Ftab1 = gb_trees:delete(DelFace, Ftab0),
+ [KeepFace] = ordsets:intersection(KeepFaces, EdgeAFaces),
+ Ftab2 = update_face(KeepFace, EdgeANear, EdgeA, Ftab1),
+ Ftab = update_face(KeepFace, EdgeBNear, EdgeB, Ftab2),
+
+ %% Return result.
+ We#we{vc=undefined,es=Etab,fs=Ftab,he=Htab}.
+
+stabile_neighbor(#edge{ltpr=Ea,ltsu=Eb,rtpr=Ec,rtsu=Ed}, Del) ->
+ [Edge] = lists:foldl(fun(E, A) ->
+ case gb_sets:is_member(E, Del) of
+ true -> A;
+ false -> [E|A]
+ end
+ end, [], [Ea,Eb,Ec,Ed]),
+ Edge.
+
+%%%
+%%% Setting hard/soft edges.
+%%%
+
+hardness(Edge, soft, Htab) -> gb_sets:delete_any(Edge, Htab);
+hardness(Edge, hard, Htab) -> gb_sets:add(Edge, Htab).
+
+%%%
+%%% Utilities.
+%%%
+
+reverse_dir(forward) -> backward;
+reverse_dir(backward) -> forward.
+
+half_edge(backward, #edge{vs=Va,ve=Vb,lf=Lf,rf=Rf,a=A,b=B,ltsu=L,rtpr=R}) ->
+ {Va,Vb,Lf,Rf,A,B,L,R};
+half_edge(forward, #edge{ve=Va,vs=Vb,lf=Lf,rf=Rf,a=A,b=B,ltpr=L,rtsu=R}) ->
+ {Va,Vb,Lf,Rf,A,B,L,R}.
+
+patch_half_edge(Edge, V, FaceA, A, Ea, FaceB, B, Eb, OrigV, Etab) ->
+ New = case gb_trees:get(Edge, Etab) of
+ #edge{vs=OrigV,lf=FaceA,rf=FaceB}=Rec ->
+ Rec#edge{a=A,vs=V,ltsu=Ea,rtpr=Eb};
+ #edge{vs=OrigV,lf=FaceB,rf=FaceA}=Rec ->
+ Rec#edge{a=B,vs=V,ltsu=Eb,rtpr=Ea};
+ #edge{ve=OrigV,lf=FaceA,rf=FaceB}=Rec ->
+ Rec#edge{b=B,ve=V,ltpr=Ea,rtsu=Eb};
+ #edge{ve=OrigV,lf=FaceB,rf=FaceA}=Rec ->
+ Rec#edge{b=A,ve=V,ltpr=Eb,rtsu=Ea}
+ end,
+ gb_trees:update(Edge, New, Etab).
+
+patch_edge(Edge, ToEdge, OrigEdge, Etab) ->
+ New = case gb_trees:get(Edge, Etab) of
+ #edge{ltsu=OrigEdge}=R ->
+ R#edge{ltsu=ToEdge};
+ #edge{ltpr=OrigEdge}=R ->
+ R#edge{ltpr=ToEdge};
+ #edge{rtsu=OrigEdge}=R ->
+ R#edge{rtsu=ToEdge};
+ #edge{rtpr=OrigEdge}=R ->
+ R#edge{rtpr=ToEdge}
+ end,
+ gb_trees:update(Edge, New, Etab).
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_edge_cmd.erl b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_edge_cmd.erl
new file mode 100644
index 0000000000..91fa5b2a39
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_edge_cmd.erl
@@ -0,0 +1,90 @@
+%%
+%% wings_edge.erl --
+%%
+%% This module contains most edge command and edge utility functions.
+%%
+
+-module(wings_edge_cmd).
+
+-export([loop_cut/1]).
+
+-include("wings.hrl").
+
+%%%
+%%% The Loop Cut command.
+%%%
+
+loop_cut(St0) ->
+ {Sel,St} = wings_sel:fold(fun loop_cut/3, {[],St0}, St0),
+ wings_sel:set(body, Sel, St).
+
+loop_cut(Edges, #we{name=Name,id=Id,fs=Ftab}=We0, {Sel,St0}) ->
+ AdjFaces = wings_face:from_edges(Edges, We0),
+ case loop_cut_partition(AdjFaces, Edges, We0, []) of
+ [_] ->
+ io:format("Edge loop doesn't divide ~p into two parts.", [Name]);
+ Parts0 ->
+ %% We arbitrarily decide that the largest part of the object
+ %% will be left unselected and will keep the name of the object.
+
+ Parts1 = [{gb_trees:size(P),P} || P <- Parts0],
+ Parts2 = lists:reverse(lists:sort(Parts1)),
+ [_|Parts] = [gb_sets:to_list(P) || {_,P} <- Parts2],
+
+ %% Also, this first part will also contain any sub-object
+ %% that was not reachable from any of the edges. Therefore,
+ %% we calculate the first part as the complement of the union
+ %% of all other parts.
+
+ FirstComplement = ordsets:union(Parts),
+ First = ordsets:subtract(gb_trees:keys(Ftab), FirstComplement),
+
+ We = wings_dissolve:complement(First, We0),
+ Shs = St0#st.shapes,
+ St = St0#st{shapes=gb_trees:update(Id, We, Shs)},
+ loop_cut_make_copies(Parts, We0, Sel, St)
+ end.
+
+loop_cut_make_copies([P|Parts], We0, Sel0, #st{onext=Id}=St0) ->
+ Sel = [{Id,gb_sets:singleton(0)}|Sel0],
+ We = wings_dissolve:complement(P, We0),
+ St = wings_shape:insert(We, cut, St0),
+ loop_cut_make_copies(Parts, We0, Sel, St);
+loop_cut_make_copies([], _, Sel, St) -> {Sel,St}.
+
+loop_cut_partition(Faces0, Edges, We, Acc) ->
+ case gb_sets:is_empty(Faces0) of
+ true -> Acc;
+ false ->
+ {AFace,Faces1} = gb_sets:take_smallest(Faces0),
+ Reachable = collect_faces(AFace, Edges, We),
+ Faces = gb_sets:difference(Faces1, Reachable),
+ loop_cut_partition(Faces, Edges, We, [Reachable|Acc])
+ end.
+
+collect_faces(Face, Edges, We) ->
+ collect_faces(gb_sets:singleton(Face), We, Edges, gb_sets:empty()).
+
+collect_faces(Work0, We, Edges, Acc0) ->
+ case gb_sets:is_empty(Work0) of
+ true -> Acc0;
+ false ->
+ {Face,Work1} = gb_sets:take_smallest(Work0),
+ Acc = gb_sets:insert(Face, Acc0),
+ Work = collect_maybe_add(Work1, Face, Edges, We, Acc),
+ collect_faces(Work, We, Edges, Acc)
+ end.
+
+collect_maybe_add(Work, Face, Edges, We, Res) ->
+ wings_face:fold(
+ fun(_, Edge, Rec, A) ->
+ case gb_sets:is_member(Edge, Edges) of
+ true -> A;
+ false ->
+ Of = wings_face:other(Face, Rec),
+ case gb_sets:is_member(Of, Res) of
+ true -> A;
+ false -> gb_sets:add(Of, A)
+ end
+ end
+ end, Work, Face, We).
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_face.erl b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_face.erl
new file mode 100644
index 0000000000..487c05aa58
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_face.erl
@@ -0,0 +1,127 @@
+%%
+%% wings_face.erl --
+%%
+%% This module contains help routines for faces, such as fold functions
+%% face iterators.
+%%
+
+-module(wings_face).
+
+-export([delete_bad_faces/2, fold/4, fold_faces/4, from_edges/2,
+ inner_edges/2, to_edges/2, other/2]).
+
+-include("wings.hrl").
+
+from_edges(Es, #we{es=Etab}) when is_list(Es) ->
+ from_edges_1(Es, Etab, []);
+from_edges(Es, We) ->
+ from_edges(gb_sets:to_list(Es), We).
+
+from_edges_1([E|Es], Etab, Acc) ->
+ #edge{lf=Lf,rf=Rf} = gb_trees:get(E, Etab),
+ from_edges_1(Es, Etab, [Lf,Rf|Acc]);
+from_edges_1([], _, Acc) -> gb_sets:from_list(Acc).
+
+%% other(Face, EdgeRecord) -> OtherFace
+%% Pick up the "other face" from an edge record.
+other(Face, #edge{lf=Face,rf=Other}) -> Other;
+other(Face, #edge{rf=Face,lf=Other}) -> Other.
+
+%% to_edges(Faces, We) -> [Edge]
+%% Convert a set or list of faces to a list of edges.
+to_edges(Fs, We) ->
+ ordsets:from_list(to_edges_raw(Fs, We)).
+
+%% inner_edges(Faces, We) -> [Edge]
+%% Given a set of faces, return all inner edges.
+inner_edges(Faces, We) ->
+ S = to_edges_raw(Faces, We),
+ inner_edges_1(lists:sort(S), []).
+
+inner_edges_1([E,E|T], In) ->
+ inner_edges_1(T, [E|In]);
+inner_edges_1([_|T], In) ->
+ inner_edges_1(T, In);
+inner_edges_1([], In) -> lists:reverse(In).
+
+%% Fold over all edges surrounding a face.
+
+fold(F, Acc, Face, #we{es=Etab,fs=Ftab}) ->
+ Edge = gb_trees:get(Face, Ftab),
+ fold(Edge, Etab, F, Acc, Face, Edge, not_done).
+
+fold(LastEdge, _, _, Acc, _, LastEdge, done) -> Acc;
+fold(Edge, Etab, F, Acc0, Face, LastEdge, _) ->
+ case gb_trees:get(Edge, Etab) of
+ #edge{ve=V,lf=Face,ltsu=NextEdge}=E ->
+ Acc = F(V, Edge, E, Acc0),
+ fold(NextEdge, Etab, F, Acc, Face, LastEdge, done);
+ #edge{vs=V,rf=Face,rtsu=NextEdge}=E ->
+ Acc = F(V, Edge, E, Acc0),
+ fold(NextEdge, Etab, F, Acc, Face, LastEdge, done)
+ end.
+
+%% Fold over a set of faces.
+
+fold_faces(F, Acc0, [Face|Faces], #we{es=Etab,fs=Ftab}=We) ->
+ Edge = gb_trees:get(Face, Ftab),
+ Acc = fold_faces_1(Edge, Etab, F, Acc0, Face, Edge, not_done),
+ fold_faces(F, Acc, Faces, We);
+fold_faces(_F, Acc, [], _We) -> Acc;
+fold_faces(F, Acc, Faces, We) ->
+ fold_faces(F, Acc, gb_sets:to_list(Faces), We).
+
+fold_faces_1(LastEdge, _, _, Acc, _, LastEdge, done) -> Acc;
+fold_faces_1(Edge, Etab, F, Acc0, Face, LastEdge, _) ->
+ case gb_trees:get(Edge, Etab) of
+ #edge{ve=V,lf=Face,ltsu=NextEdge}=E ->
+ Acc = F(Face, V, Edge, E, Acc0),
+ fold_faces_1(NextEdge, Etab, F, Acc, Face, LastEdge, done);
+ #edge{vs=V,rf=Face,rtsu=NextEdge}=E ->
+ Acc = F(Face, V, Edge, E, Acc0),
+ fold_faces_1(NextEdge, Etab, F, Acc, Face, LastEdge, done)
+ end.
+
+%% Return an unsorted list of edges for the faces (with duplicates).
+
+to_edges_raw(Faces, #we{es=Etab,fs=Ftab}) when is_list(Faces) ->
+ to_edges_raw(Faces, Ftab, Etab, []);
+to_edges_raw(Faces, We) ->
+ to_edges_raw(gb_sets:to_list(Faces), We).
+
+to_edges_raw([Face|Faces], Ftab, Etab, Acc0) ->
+ Edge = gb_trees:get(Face, Ftab),
+ Acc = to_edges_raw_1(Edge, Etab, Acc0, Face, Edge, not_done),
+ to_edges_raw(Faces, Ftab, Etab, Acc);
+to_edges_raw([], _, _, Acc) -> Acc.
+
+to_edges_raw_1(LastEdge, _, Acc, _, LastEdge, done) -> Acc;
+to_edges_raw_1(Edge, Etab, Acc, Face, LastEdge, _) ->
+ case gb_trees:get(Edge, Etab) of
+ #edge{lf=Face,ltsu=NextEdge} ->
+ to_edges_raw_1(NextEdge, Etab, [Edge|Acc], Face, LastEdge, done);
+ #edge{rf=Face,rtsu=NextEdge} ->
+ to_edges_raw_1(NextEdge, Etab, [Edge|Acc], Face, LastEdge, done)
+ end.
+
+delete_bad_faces(Fs, #we{fs=Ftab,es=Etab}=We) when is_list(Fs) ->
+ Es = bad_edges(Fs, Ftab, Etab, []),
+ wings_edge:dissolve_edges(Es, We);
+delete_bad_faces(Fs, We) ->
+ delete_bad_faces(gb_sets:to_list(Fs), We).
+
+bad_edges([F|Fs], Ftab, Etab, Acc) ->
+ case gb_trees:lookup(F, Ftab) of
+ {value,Edge} ->
+ case gb_trees:get(Edge, Etab) of
+ #edge{ltpr=Same,ltsu=Same,rtpr=Same,rtsu=Same} ->
+ erlang:error({internal_error,one_edged_face,F});
+ #edge{ltpr=Same,ltsu=Same} ->
+ bad_edges(Fs, Ftab, Etab, [Edge|Acc]);
+ #edge{rtpr=Same,rtsu=Same} ->
+ bad_edges(Fs, Ftab, Etab, [Edge|Acc]);
+ _ -> bad_edges(Fs, Ftab, Etab, Acc)
+ end;
+ none -> bad_edges(Fs, Ftab, Etab, Acc)
+ end;
+bad_edges([], _, _, Acc) -> Acc.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_facemat.erl b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_facemat.erl
new file mode 100644
index 0000000000..a3fa5e3508
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_facemat.erl
@@ -0,0 +1,299 @@
+%%
+%% wings_facemat.erl --
+%%
+%% This module keeps tracks of the mapping from a face number
+%% to its material name.
+%%
+%% Copyright (c) 2001-2005 Bjorn Gustavsson
+%%
+%% See the file "license.terms" for information on usage and redistribution
+%% of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+%%
+%% $Id: wings_facemat.erl,v 1.1 2009/01/25 18:55:33 kostis Exp $
+%%
+%%
+%%
+
+-module(wings_facemat).
+-export([all/1,face/2,used_materials/1,mat_faces/2,
+ assign/2,assign/3,
+ delete_face/2,delete_faces/2,keep_faces/2,
+ hide_faces/1,show_faces/1,
+ renumber/2,gc/1,merge/1]).
+
+-include("wings.hrl").
+-import(lists, [keysearch/3,reverse/1,reverse/2,sort/1]).
+
+%%%
+%%% API functions for retrieving information.
+%%%
+
+%% all(We) -> [{Face,MaterialName}]
+%% Return materials for all faces as an ordered list.
+all(#we{mat=M}=We) when is_atom(M) ->
+ Vis = visible_faces(We),
+ make_tab(Vis, M);
+all(#we{mat=L}) when is_list(L) ->
+ remove_invisible(L).
+
+%% face(Face, We) -> MaterialName
+%% Return the material for the face Face.
+face(_, #we{mat=M}) when is_atom(M) -> M;
+face(Face, #we{mat=Tab}) ->
+ {value,{_,Mat}} = keysearch(Face, 1, Tab),
+ Mat.
+
+%% used_materials(We) -> [MaterialName]
+%% Return an ordered list of all materials used in the We.
+used_materials(#we{mat=M}) when is_atom(M) -> [M];
+used_materials(#we{mat=L}) when is_list(L) ->
+ used_materials_1(L, []).
+
+%% mat_faces([{Face,Info}], We) -> [{Mat,[{Face,Info}]}]
+%% Group face tab into groups based on material.
+%% Used for displaying objects.
+mat_faces(Ftab, #we{mat=AtomMat}) when is_atom(AtomMat) ->
+ [{AtomMat,Ftab}];
+mat_faces(Ftab, #we{mat=MatTab}) ->
+ mat_faces_1(Ftab, remove_invisible(MatTab), []).
+
+%%%
+%%% API functions for updating material name mapping.
+%%%
+
+%% assign([{Face,MaterialName}], We) -> We'
+%% Assign materials.
+assign([], We) -> We;
+assign([{F,M}|_]=FaceMs, We) when is_atom(M), is_integer(F) ->
+ Tab = ordsets:from_list(FaceMs),
+ assign_face_ms(Tab, We).
+
+%% assign(MaterialName, Faces, We) -> We'
+%% Assign MaterialName to all faces Faces.
+assign(Mat, _, #we{mat=Mat}=We) when is_atom(Mat) -> We;
+assign(Mat, Fs, We) when is_atom(Mat), is_list(Fs) ->
+ assign_1(Mat, Fs, We);
+assign(Mat, Fs, We) when is_atom(Mat) ->
+ assign_1(Mat, gb_sets:to_list(Fs), We).
+
+%% delete_face(Face, We) -> We'
+%% Delete the material name mapping for the face Face.
+delete_face(_, #we{mat=AtomMat}=We) when is_atom(AtomMat) -> We;
+delete_face(Face, #we{mat=MatTab0}=We) ->
+ MatTab = orddict:erase(Face, MatTab0),
+ We#we{mat=MatTab}.
+
+%% delete_face(Faces, We) -> We'
+%% Delete the material name mapping for all faces Faces.
+delete_faces(_, #we{mat=AtomMat}=We) when is_atom(AtomMat) -> We;
+delete_faces(Faces0, #we{mat=MatTab0}=We) when is_list(Faces0) ->
+ Faces = sofs:from_external(Faces0, [face]),
+ MatTab1 = sofs:from_external(MatTab0, [{face,mat}]),
+ MatTab2 = sofs:drestriction(MatTab1, Faces),
+ MatTab = sofs:to_external(MatTab2),
+ We#we{mat=MatTab};
+delete_faces(Faces, We) ->
+ delete_faces(gb_sets:to_list(Faces), We).
+
+%% keep_faces(Faces, We) -> We'
+%% Delete all the other material names mapping for all faces other Faces.
+keep_faces(_, #we{mat=AtomMat}=We) when is_atom(AtomMat) -> We;
+keep_faces([Face], We) ->
+ Mat = face(Face,We),
+ We#we{mat=[{Face,Mat}]};
+keep_faces(Faces0, #we{mat=MatTab0}=We) when is_list(Faces0) ->
+ Faces = sofs:from_external(Faces0, [face]),
+ MatTab1 = sofs:from_external(MatTab0, [{face,mat}]),
+ MatTab2 = sofs:restriction(MatTab1, Faces),
+ MatTab = sofs:to_external(MatTab2),
+ We#we{mat=MatTab};
+keep_faces(Faces, We) ->
+ keep_faces(gb_sets:to_list(Faces), We).
+
+%% hide_faces(We) -> We'
+%% Update the material name mapping in the We to reflect
+%% the newly hidden faces in the face tab.
+hide_faces(#we{mat=M}=We) when is_atom(M) -> We;
+hide_faces(#we{mat=L0,fs=Ftab}=We) ->
+ L = hide_faces_1(L0, Ftab, []),
+ We#we{mat=L}.
+
+%% show_faces(We) -> We'
+%% Update the material name mapping in the We to reflect
+%% that all faces are again visible.
+show_faces(#we{mat=M}=We) when is_atom(M) -> We;
+show_faces(#we{mat=L0}=We) ->
+ L = show_faces_1(L0, []),
+ We#we{mat=L}.
+
+%% renumber(MaterialMapping, FaceOldToNew) -> MaterialMapping.
+%% Renumber face number in material name mapping.
+renumber(Mat, _) when is_atom(Mat) -> Mat;
+renumber(L, Fmap) when is_list(L) -> renumber_1(L, Fmap, []).
+
+%% gc(We) -> We'
+%% Garbage collect the material mapping information, removing
+%% the mapping for any face no longer present in the face table.
+gc(#we{mat=Mat}=We) when is_atom(Mat) -> We;
+gc(#we{mat=Tab0,fs=Ftab}=We) ->
+ Fs = sofs:from_external(gb_trees:keys(Ftab), [face]),
+ Tab1 = sofs:from_external(Tab0, [{face,material}]),
+ Tab2 = sofs:restriction(Tab1, Fs),
+ Tab = sofs:to_external(Tab2),
+ We#we{mat=compress(Tab)}.
+
+%% merge([We]) -> [{Face,MaterialName}] | MaterialName.
+%% Merge materials for several objects.
+merge([#we{mat=M}|Wes]=L) when is_atom(M) ->
+ case merge_all_same(Wes, M) of
+ true -> M;
+ false -> merge_1(L, [])
+ end;
+merge(L) -> merge_1(L, []).
+
+merge_1([#we{mat=M,es=Etab}|T], Acc) when is_atom(M) ->
+ FsM = merge_2(gb_trees:values(Etab), M, []),
+ merge_1(T, [FsM|Acc]);
+merge_1([#we{mat=FsMs}|T], Acc) ->
+ merge_1(T, [FsMs|Acc]);
+merge_1([], Acc) -> lists:merge(Acc).
+
+merge_2([#edge{lf=Lf,rf=Rf}|T], M, Acc) ->
+ merge_2(T, M, [{Lf,M},{Rf,M}|Acc]);
+merge_2([], _, Acc) -> ordsets:from_list(Acc).
+
+merge_all_same([#we{mat=M}|Wes], M) -> merge_all_same(Wes, M);
+merge_all_same([_|_], _) -> false;
+merge_all_same([], _) -> true.
+
+%%%
+%%% Local functions.
+%%%
+
+assign_1(Mat, Fs, #we{fs=Ftab}=We) ->
+ case length(Fs) =:= gb_trees:size(Ftab) of
+ true -> We#we{mat=Mat};
+ false -> assign_2(Mat, Fs, We)
+ end.
+
+assign_2(Mat, Fs0, #we{fs=Ftab,mat=Mat0}=We) when is_atom(Mat0) ->
+ Fs = ordsets:from_list(Fs0),
+ OtherFaces = ordsets:subtract(gb_trees:keys(Ftab), Fs),
+ Tab0 = make_tab(OtherFaces, Mat0),
+ Tab1 = make_tab(Fs, Mat),
+ Tab = lists:merge(Tab0, Tab1),
+ We#we{mat=Tab};
+assign_2(Mat, Fs0, #we{mat=Tab0}=We) when is_list(Tab0) ->
+ Fs = ordsets:from_list(Fs0),
+ Tab1 = make_tab(Fs, Mat),
+ Tab = mat_merge(Tab1, Tab0, []),
+ We#we{mat=Tab}.
+
+assign_face_ms(Tab, #we{fs=Ftab}=We) ->
+ case length(Tab) =:= gb_trees:size(Ftab) of
+ true -> We#we{mat=compress(Tab)};
+ false -> assign_face_ms_1(Tab, We)
+ end.
+
+assign_face_ms_1(Tab1, #we{fs=Ftab,mat=Mat0}=We) when is_atom(Mat0) ->
+ Tab0 = make_tab(gb_trees:keys(Ftab), Mat0),
+ Tab = mat_merge(Tab1, Tab0, []),
+ We#we{mat=Tab};
+assign_face_ms_1(Tab1, #we{mat=Tab0}=We) when is_list(Tab0) ->
+ Tab = mat_merge(Tab1, Tab0, []),
+ We#we{mat=Tab}.
+
+mat_merge([{Fn,_}|_]=Fns, [{Fo,_}=Fold|Fos], Acc) when Fo < Fn ->
+ mat_merge(Fns, Fos, [Fold|Acc]);
+mat_merge([{Fn,_}=Fnew|Fns], [{Fo,_}|_]=Fos, Acc) when Fo > Fn ->
+ mat_merge(Fns, Fos, [Fnew|Acc]);
+mat_merge([Fnew|Fns], [_|Fos], Acc) -> % Equality
+ mat_merge(Fns, Fos, [Fnew|Acc]);
+mat_merge([], Fos, Acc) ->
+ rev_compress(Acc, Fos);
+mat_merge(Fns, [], Acc) ->
+ rev_compress(Acc, Fns).
+
+make_tab(Fs, M) ->
+ make_tab_1(Fs, M, []).
+
+make_tab_1([F|Fs], M, Acc) ->
+ make_tab_1(Fs, M, [{F,M}|Acc]);
+make_tab_1([], _, Acc) -> reverse(Acc).
+
+
+visible_faces(#we{fs=Ftab}) ->
+ visible_faces_1(gb_trees:keys(Ftab)).
+
+visible_faces_1([F|Fs]) when F < 0 ->
+ visible_faces_1(Fs);
+visible_faces_1(Fs) -> Fs.
+
+remove_invisible([{F,_}|Fs]) when F < 0 ->
+ remove_invisible(Fs);
+remove_invisible(Fs) -> Fs.
+
+hide_faces_1([{F,_}=P|Fms], Ftab, Acc) when F < 0 ->
+ hide_faces_1(Fms, Ftab, [P|Acc]);
+hide_faces_1([{F,M}=P|Fms], Ftab, Acc) ->
+ case gb_trees:is_defined(F, Ftab) of
+ false -> hide_faces_1(Fms, Ftab, [{-F-1,M}|Acc]);
+ true -> hide_faces_1(Fms, Ftab, [P|Acc])
+ end;
+hide_faces_1([], _, Acc) -> sort(Acc).
+
+show_faces_1([{F,M}|Fms], Acc) when F < 0 ->
+ show_faces_1(Fms, [{-F-1,M}|Acc]);
+show_faces_1(Fs, Acc) -> sort(Acc++Fs).
+
+renumber_1([{F,M}|T], Fmap, Acc) ->
+ renumber_1(T, Fmap, [{gb_trees:get(F, Fmap),M}|Acc]);
+renumber_1([], _, Acc) -> sort(Acc).
+
+%% rev_compress([{Face,Mat}], [{Face,Mat}]) -> [{Face,Mat}] | Mat.
+%% Reverse just like lists:reverse/2, but if all materials
+%% turns out to be just the same, return that material.
+rev_compress(L, Acc) ->
+ case same_mat(Acc) of
+ [] -> reverse(L, Acc);
+ M -> rev_compress_1(L, M, Acc)
+ end.
+
+rev_compress_1([{_,M}=E|T], M, Acc) ->
+ %% Same material.
+ rev_compress_1(T, M, [E|Acc]);
+rev_compress_1([_|_]=L, _, Acc) ->
+ %% Another material. Finish by using reverse/2.
+ reverse(L, Acc);
+rev_compress_1([], M, _) ->
+ %% All materials turned out to be the same.
+ M.
+
+%% compress(MaterialTab) -> [{Face,Mat}] | Mat.
+%% Compress a face mapping if possible.
+compress(M) when is_atom(M) -> M;
+compress(L) when is_list(L) ->
+ case same_mat(L) of
+ [] -> L;
+ M -> M
+ end.
+
+same_mat([]) -> [];
+same_mat([{_,M}|T]) -> same_mat_1(T, M).
+
+same_mat_1([{_,M}|T], M) -> same_mat_1(T, M);
+same_mat_1([], M) -> M;
+same_mat_1(_, _) -> [].
+
+used_materials_1([{_,M}|T], [M|_]=Acc) ->
+ used_materials_1(T, Acc);
+used_materials_1([{_,M}|T], Acc) ->
+ used_materials_1(T, [M|Acc]);
+used_materials_1([], Acc) ->
+ ordsets:from_list(Acc).
+
+mat_faces_1([{F1,_}|_]=Fs, [{F2,_}|Ms], Acc) when F2 < F1 ->
+ mat_faces_1(Fs, Ms, Acc);
+mat_faces_1([{F,Info}|Fs], [{F,Mat}|Ms], Acc) ->
+ mat_faces_1(Fs, Ms, [{Mat,{F,Info}}|Acc]);
+mat_faces_1([], _, Acc) -> wings_util:rel2fam(Acc).
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_intl.hrl b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_intl.hrl
new file mode 100644
index 0000000000..ebcb560f27
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_intl.hrl
@@ -0,0 +1,15 @@
+%%
+%% wings_intl.hrl --
+%%
+%% Defines for translations
+%%
+%% Copyright (c) 2001-2005 Bjorn Gustavsson
+%%
+%% See the file "license.terms" for information on usage and redistribution
+%% of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+%%
+%% $Id: wings_intl.hrl,v 1.1 2009/01/25 18:55:33 kostis Exp $
+%%
+
+-define(STR(A,B,Str), wings_lang:str({?MODULE,A,B},Str)).
+-define(__(Key,Str), wings_lang:str({?MODULE,Key},Str)).
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_io.erl b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_io.erl
new file mode 100644
index 0000000000..39002c675d
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_io.erl
@@ -0,0 +1,37 @@
+%%
+%% wings_io.erl --
+%%
+%% This module contains most of the low-level GUI for Wings.
+%%
+
+-module(wings_io).
+
+-export([get_matching_events/1]).
+
+-define(EVENT_QUEUE, wings_io_event_queue).
+
+%%%
+%%% Input.
+%%%
+
+get_matching_events(Filter) ->
+ Eq = get(?EVENT_QUEUE),
+ get_matching_events_1(Filter, Eq, [], []).
+
+get_matching_events_1(Filter, Eq0, Match, NoMatch) ->
+ case queue:out(Eq0) of
+ {{value,Ev},Eq} ->
+ case Filter(Ev) of
+ false ->
+ get_matching_events_1(Filter, Eq, Match, [Ev|NoMatch]);
+ true ->
+ get_matching_events_1(Filter, Eq, [Ev|Match], NoMatch)
+ end;
+ {empty,{In,Out}} ->
+ case Match of
+ [] -> [];
+ _ ->
+ put(?EVENT_QUEUE, {In, lists:reverse(NoMatch, Out)}),
+ Match
+ end
+ end.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_sel.erl b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_sel.erl
new file mode 100644
index 0000000000..eef797027e
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_sel.erl
@@ -0,0 +1,68 @@
+%%
+%% wings_sel.erl --
+%%
+%% This module implements selection utilities.
+%%
+
+-module(wings_sel).
+
+-export([face_regions/2, fold/3, set/3]).
+
+-include("wings.hrl").
+
+set(Mode, Sel, St) ->
+ St#st{selmode=Mode, sel=lists:sort(Sel), sh=false}.
+
+%%%
+%%% Fold over the selection.
+%%%
+
+fold(F, Acc, #st{sel=Sel,shapes=Shapes}) ->
+ fold_1(F, Acc, Shapes, Sel).
+
+fold_1(F, Acc0, Shapes, [{Id,Items}|T]) ->
+ We = gb_trees:get(Id, Shapes),
+ ?ASSERT(We#we.id =:= Id),
+ fold_1(F, F(Items, We, Acc0), Shapes, T);
+fold_1(_F, Acc, _Shapes, []) -> Acc.
+
+%%%
+%%% Divide the face selection into regions where each face shares at least
+%%% one edge with another face in the same region. Two faces can share a
+%%% vertex without necessarily being in the same region.
+%%%
+
+face_regions(Faces, We) when is_list(Faces) ->
+ face_regions_1(gb_sets:from_list(Faces), We);
+face_regions(Faces, We) ->
+ face_regions_1(Faces, We).
+
+face_regions_1(Faces, We) ->
+ find_face_regions(Faces, We, fun collect_face_fun/5, []).
+
+find_face_regions(Faces0, We, Coll, Acc) ->
+ case gb_sets:is_empty(Faces0) of
+ true -> Acc;
+ false ->
+ {Face,Faces1} = gb_sets:take_smallest(Faces0),
+ Ws = [Face],
+ {Reg,Faces} = collect_face_region(Ws, We, Coll, [], Faces1),
+ find_face_regions(Faces, We, Coll, [Reg|Acc])
+ end.
+
+collect_face_region([_|_]=Ws0, We, Coll, Reg0, Faces0) ->
+ Reg = Ws0++Reg0,
+ {Ws,Faces} = wings_face:fold_faces(Coll, {[],Faces0}, Ws0, We),
+ collect_face_region(Ws, We, Coll, Reg, Faces);
+collect_face_region([], _, _, Reg, Faces) ->
+ {gb_sets:from_list(Reg),Faces}.
+
+collect_face_fun(Face, _, _, Rec, {Ws,Faces}=A) ->
+ Of = case Rec of
+ #edge{lf=Face,rf=Of0} -> Of0;
+ #edge{rf=Face,lf=Of0} -> Of0
+ end,
+ case gb_sets:is_member(Of, Faces) of
+ true -> {[Of|Ws],gb_sets:delete(Of, Faces)};
+ false -> A
+ end.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_shape.erl b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_shape.erl
new file mode 100644
index 0000000000..0df8ca68eb
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_shape.erl
@@ -0,0 +1,69 @@
+%%
+%% wings_shape.erl --
+%%
+%% Utilities for shape records.
+%%
+
+-module(wings_shape).
+
+-export([insert/3]).
+
+-include("wings.hrl").
+
+%%%
+%%% Exported functions.
+%%%
+
+%% new(We, Suffix, St0) -> St.
+%% Suffix = cut | clone | copy | extract | sep
+%%
+%% Create a new object based on an old object. The name
+%% will be created from the old name (with digits and known
+%% suffixes stripped) with the given Suffix and a number
+%% appended.
+insert(#we{name=OldName}=We0, Suffix, #st{shapes=Shapes0,onext=Oid}=St) ->
+ Name = new_name(OldName, Suffix, Oid),
+ We = We0#we{id=Oid,name=Name},
+ Shapes = gb_trees:insert(Oid, We, Shapes0),
+ St#st{shapes=Shapes,onext=Oid+1}.
+
+%%%
+%%% Local functions follow.
+%%%
+
+new_name(OldName, Suffix0, Id) ->
+ Suffix = suffix(Suffix0),
+ Base = base(lists:reverse(OldName)),
+ lists:reverse(Base, "_" ++ Suffix ++ integer_to_list(Id)).
+
+%% Note: Filename suffixes are intentionally not translated.
+%% If we are to translate them in the future, base/1 below
+%% must be updated to strip suffixes (both for the current language
+%% and for English).
+
+suffix(cut) -> "cut";
+suffix(clone) -> "clone";
+suffix(copy) -> "copy";
+suffix(extract) -> "extract";
+suffix(mirror) -> "mirror";
+suffix(sep) -> "sep".
+
+%% base_1(ReversedName) -> ReversedBaseName
+%% Given an object name, strip digits and known suffixes to
+%% create a base name. Returns the unchanged name if
+%% no known suffix could be stripped.
+
+base(OldName) ->
+ case base_1(OldName) of
+ error -> OldName;
+ Base -> Base
+ end.
+
+base_1([H|T]) when $0 =< H, H =< $9 -> base_1(T);
+base_1("tuc_"++Base) -> Base; %"_cut"
+base_1("enolc_"++Base) -> Base; %"_clone"
+base_1("ypoc_"++Base) -> Base; %"_copy"
+base_1("tcartxe_"++Base) -> Base; %"_extract"
+base_1("rorrim_"++Base) -> Base; %"_mirror"
+base_1("pes_"++Base) -> Base; %"_sep"
+base_1(_Base) -> error.
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
new file mode 100644
index 0000000000..8f0da1f5dc
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_util.erl
@@ -0,0 +1,38 @@
+%%
+%% wings_util.erl --
+%%
+%% Various utility functions that not obviously fit somewhere else.
+%%
+
+-module(wings_util).
+
+-export([gb_trees_smallest_key/1, gb_trees_largest_key/1,
+ gb_trees_map/2, rel2fam/1]).
+
+-include("wings.hrl").
+
+rel2fam(Rel) ->
+ sofs:to_external(sofs:relation_to_family(sofs:relation(Rel))).
+
+%% a definition that does not violate the opaqueness of gb_tree()
+gb_trees_smallest_key(Tree) ->
+ {Key, _V} = gb_trees:smallest(Tree),
+ Key.
+
+%% a definition that violates the opaqueness of gb_tree()
+gb_trees_largest_key({_, Tree}) ->
+ largest_key1(Tree).
+
+largest_key1({Key, _Value, _Smaller, nil}) ->
+ Key;
+largest_key1({_Key, _Value, _Smaller, Larger}) ->
+ largest_key1(Larger).
+
+gb_trees_map(F, {Size,Tree}) ->
+ {Size,gb_trees_map_1(F, Tree)}.
+
+gb_trees_map_1(_, nil) -> nil;
+gb_trees_map_1(F, {K,V,Smaller,Larger}) ->
+ {K,F(K, V),
+ gb_trees_map_1(F, Smaller),
+ gb_trees_map_1(F, Larger)}.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_we.erl b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_we.erl
new file mode 100644
index 0000000000..6a93363445
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_we.erl
@@ -0,0 +1,250 @@
+%%
+%% wings_we.erl --
+%%
+%% This module contains functions to build and manipulate
+%% we records (winged-edged records, the central data structure
+%% in Wings 3D).
+
+-module(wings_we).
+
+-export([rebuild/1, is_consistent/1, is_face_consistent/2, new_id/1,
+ new_items_as_ordset/3, validate_mirror/1, visible/1, visible_edges/1]).
+
+-include("wings.hrl").
+
+%%%
+%%% API.
+%%%
+
+validate_mirror(#we{mirror=none}=We) -> We;
+validate_mirror(#we{fs=Ftab,mirror=Face}=We) ->
+ case gb_trees:is_defined(Face, Ftab) of
+ false -> We#we{mirror=none};
+ true -> We
+ end.
+
+%% rebuild(We) -> We'
+%% Rebuild any missing 'vc' and 'fs' tables. If there are
+%% fewer elements in the 'vc' table than in the 'vp' table,
+%% remove redundant entries in the 'vp' table. Updated id
+%% bounds.
+rebuild(#we{vc=undefined,fs=undefined,es=Etab0}=We0) ->
+ Etab = gb_trees:to_list(Etab0),
+ Ftab = rebuild_ftab(Etab),
+ VctList = rebuild_vct(Etab),
+ We = We0#we{vc=gb_trees:from_orddict(VctList),fs=Ftab},
+ rebuild_1(VctList, We);
+rebuild(#we{vc=undefined,es=Etab}=We) ->
+ VctList = rebuild_vct(gb_trees:to_list(Etab), []),
+ rebuild_1(VctList, We#we{vc=gb_trees:from_orddict(VctList)});
+rebuild(#we{fs=undefined,es=Etab}=We) ->
+ Ftab = rebuild_ftab(gb_trees:to_list(Etab)),
+ rebuild(We#we{fs=Ftab});
+rebuild(We) -> update_id_bounds(We).
+
+%%% Utilities for allocating IDs.
+
+new_id(#we{next_id=Id}=We) ->
+ {Id,We#we{next_id=Id+1}}.
+
+%%% Returns sets of newly created items.
+
+new_items_as_ordset(vertex, #we{next_id=Wid}, #we{next_id=NewWid,vp=Tab}) ->
+ new_items_as_ordset_1(Tab, Wid, NewWid);
+new_items_as_ordset(edge, #we{next_id=Wid}, #we{next_id=NewWid,es=Tab}) ->
+ new_items_as_ordset_1(Tab, Wid, NewWid);
+new_items_as_ordset(face, #we{next_id=Wid}, #we{next_id=NewWid,fs=Tab}) ->
+ new_items_as_ordset_1(Tab, Wid, NewWid).
+
+any_hidden(#we{fs=Ftab}) ->
+ not gb_trees:is_empty(Ftab) andalso
+ wings_util:gb_trees_smallest_key(Ftab) < 0.
+
+%%%
+%%% Local functions.
+%%%
+
+rebuild_1(VctList, #we{vc=Vct,vp=Vtab0}=We) ->
+ case {gb_trees:size(Vct),gb_trees:size(Vtab0)} of
+ {Same,Same} -> rebuild(We);
+ {Sz1,Sz2} when Sz1 < Sz2 ->
+ Vtab = vertex_gc_1(VctList, gb_trees:to_list(Vtab0), []),
+ rebuild(We#we{vp=Vtab})
+ end.
+
+rebuild_vct(Es) ->
+ rebuild_vct(Es, []).
+
+rebuild_vct([{Edge,#edge{vs=Va,ve=Vb}}|Es], Acc0) ->
+ Acc = rebuild_maybe_add(Va, Vb, Edge, Acc0),
+ rebuild_vct(Es, Acc);
+rebuild_vct([], VtoE) ->
+ build_incident_tab(VtoE).
+
+rebuild_ftab(Es) ->
+ rebuild_ftab_1(Es, []).
+
+rebuild_ftab_1([{Edge,#edge{lf=Lf,rf=Rf}}|Es], Acc0) ->
+ Acc = rebuild_maybe_add(Lf, Rf, Edge, Acc0),
+ rebuild_ftab_1(Es, Acc);
+rebuild_ftab_1([], FtoE) ->
+ gb_trees:from_orddict(build_incident_tab(FtoE)).
+
+rebuild_maybe_add(Ka, Kb, E, [_,{Ka,_}|_]=Acc) ->
+ [{Kb,E}|Acc];
+rebuild_maybe_add(Ka, Kb, E, [_,{Kb,_}|_]=Acc) ->
+ [{Ka,E}|Acc];
+rebuild_maybe_add(Ka, Kb, E, [{Ka,_}|_]=Acc) ->
+ [{Kb,E}|Acc];
+rebuild_maybe_add(Ka, Kb, E, [{Kb,_}|_]=Acc) ->
+ [{Ka,E}|Acc];
+rebuild_maybe_add(Ka, Kb, E, Acc) ->
+ [{Ka,E},{Kb,E}|Acc].
+
+vertex_gc_1([{V,_}|Vct], [{V,_}=Vtx|Vpos], Acc) ->
+ vertex_gc_1(Vct, Vpos, [Vtx|Acc]);
+vertex_gc_1([_|_]=Vct, [_|Vpos], Acc) ->
+ vertex_gc_1(Vct, Vpos, Acc);
+vertex_gc_1([], _, Acc) ->
+ gb_trees:from_orddict(lists:reverse(Acc)).
+
+%%%
+%%% Handling of hidden faces.
+%%%
+
+visible(#we{mirror=none,fs=Ftab}) ->
+ visible_2(gb_trees:keys(Ftab));
+visible(#we{mirror=Face,fs=Ftab}) ->
+ visible_2(gb_trees:keys(gb_trees:delete(Face, Ftab))).
+
+visible_2([F|Fs]) when F < 0 -> visible_2(Fs);
+visible_2(Fs) -> Fs.
+
+visible_edges(#we{es=Etab,mirror=Face}=We) ->
+ case any_hidden(We) of
+ false -> gb_trees:keys(Etab);
+ true -> visible_es_1(gb_trees:to_list(Etab), Face, [])
+ end.
+
+visible_es_1([{E,#edge{lf=Lf,rf=Rf}}|Es], Face, Acc) ->
+ if
+ Lf < 0 ->
+ %% Left face hidden.
+ if
+ Rf < 0; Rf =:= Face ->
+ %% Both faces invisible (in some way).
+ visible_es_1(Es, Face, Acc);
+ true ->
+ %% Right face is visible.
+ visible_es_1(Es, Face, [E|Acc])
+ end;
+ Lf =:= Face, Rf < 0 ->
+ %% Left face mirror, right face hidden.
+ visible_es_1(Es, Face, Acc);
+ true ->
+ %% At least one face visible.
+ visible_es_1(Es, Face, [E|Acc])
+ end;
+visible_es_1([], _, Acc) -> ordsets:from_list(Acc).
+
+update_id_bounds(#we{vp=Vtab,es=Etab,fs=Ftab}=We) ->
+ case gb_trees:is_empty(Etab) of
+ true -> We#we{next_id=0};
+ false ->
+ LastId = lists:max([wings_util:gb_trees_largest_key(Vtab),
+ wings_util:gb_trees_largest_key(Etab),
+ wings_util:gb_trees_largest_key(Ftab)]),
+ We#we{next_id=LastId+1}
+ end.
+
+%% build_incident_tab([{Elem,Edge}]) -> [{Elem,Edge}]
+%% Elem = Face or Vertex
+%% Build the table of incident edges for either faces or vertices.
+%% Returns an ordered list where each Elem is unique.
+
+build_incident_tab(ElemToEdgeRel) ->
+ T = ets:new(?MODULE, [ordered_set]),
+ ets:insert(T, ElemToEdgeRel),
+ R = ets:tab2list(T),
+ ets:delete(T),
+ R.
+
+%%%
+%%% Calculate normals.
+%%%
+
+new_items_as_ordset_1(Tab, Wid, NewWid) when NewWid-Wid < 32 ->
+ new_items_as_ordset_2(Wid, NewWid, Tab, []);
+new_items_as_ordset_1(Tab, Wid, _NewWid) ->
+ [Item || Item <- gb_trees:keys(Tab), Item >= Wid].
+
+new_items_as_ordset_2(Wid, NewWid, Tab, Acc) when Wid < NewWid ->
+ case gb_trees:is_defined(Wid, Tab) of
+ true -> new_items_as_ordset_2(Wid+1, NewWid, Tab, [Wid|Acc]);
+ false -> new_items_as_ordset_2(Wid+1, NewWid, Tab, Acc)
+ end;
+new_items_as_ordset_2(_Wid, _NewWid, _Tab, Acc) -> lists:reverse(Acc).
+
+%%%
+%%% Test the consistency of a #we{}.
+%%%
+
+is_consistent(#we{}=We) ->
+ try
+ validate_vertex_tab(We),
+ validate_faces(We)
+ catch error:_ -> false
+ end.
+
+is_face_consistent(Face, #we{fs=Ftab,es=Etab}) ->
+ Edge = gb_trees:get(Face, Ftab),
+ try validate_face(Face, Edge, Etab)
+ catch error:_ -> false
+ end.
+
+validate_faces(#we{fs=Ftab,es=Etab}) ->
+ validate_faces_1(gb_trees:to_list(Ftab), Etab).
+
+validate_faces_1([{Face,Edge}|Fs], Etab) ->
+ validate_face(Face, Edge, Etab),
+ validate_faces_1(Fs, Etab);
+validate_faces_1([], _) -> true.
+
+validate_face(Face, Edge, Etab) ->
+ Ccw = walk_face_ccw(Edge, Etab, Face, Edge, []),
+ Edge = walk_face_cw(Edge, Etab, Face, Ccw),
+ [V|Vs] = lists:sort(Ccw),
+ validate_face_vertices(Vs, V).
+
+validate_face_vertices([V|_], V) ->
+ erlang:error(repeated_vertex);
+validate_face_vertices([_], _) ->
+ true;
+validate_face_vertices([V|Vs], _) ->
+ validate_face_vertices(Vs, V).
+
+walk_face_ccw(LastEdge, _, _, LastEdge, [_|_]=Acc) -> Acc;
+walk_face_ccw(Edge, Etab, Face, LastEdge, Acc) ->
+ case gb_trees:get(Edge, Etab) of
+ #edge{ve=V,lf=Face,ltpr=Next} ->
+ walk_face_ccw(Next, Etab, Face, LastEdge, [V|Acc]);
+ #edge{vs=V,rf=Face,rtpr=Next} ->
+ walk_face_ccw(Next, Etab, Face, LastEdge, [V|Acc])
+ end.
+
+walk_face_cw(Edge, _, _, []) -> Edge;
+walk_face_cw(Edge, Etab, Face, [V|Vs]) ->
+ case gb_trees:get(Edge, Etab) of
+ #edge{vs=V,lf=Face,ltsu=Next} ->
+ walk_face_cw(Next, Etab, Face, Vs);
+ #edge{ve=V,rf=Face,rtsu=Next} ->
+ walk_face_cw(Next, Etab, Face, Vs)
+ end.
+
+validate_vertex_tab(#we{es=Etab,vc=Vct}) ->
+ lists:foreach(fun({V,Edge}) ->
+ case gb_trees:get(Edge, Etab) of
+ #edge{vs=V} -> ok;
+ #edge{ve=V} -> ok
+ end
+ end, gb_trees:to_list(Vct)).
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis1.erl b/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis1.erl
new file mode 100644
index 0000000000..e09ccb80df
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis1.erl
@@ -0,0 +1,14 @@
+-module(zoltan_kis1).
+
+-export([f/0, gen/0]).
+
+-opaque id() :: string().
+
+-spec f() -> integer().
+
+%% BIF and Unification(t_unify) issue
+f() -> erlang:length(gen()).
+
+-spec gen() -> id().
+
+gen() -> "Dummy".
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis2.erl b/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis2.erl
new file mode 100644
index 0000000000..38c6051c58
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis2.erl
@@ -0,0 +1,14 @@
+-module(zoltan_kis2).
+
+-export([get/2]).
+
+-opaque data() :: gb_tree().
+
+-spec get(term(), data()) -> term().
+
+get(Key, Data) ->
+ %% Should unopaque data for remote calls
+ case gb_trees:lookup(Key, Data) of
+ 'none' -> 'undefined';
+ {'value', Val} -> Val
+ end.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis3.erl b/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis3.erl
new file mode 100644
index 0000000000..b62b9de576
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis3.erl
@@ -0,0 +1,14 @@
+-module(zoltan_kis3).
+
+-export([f/0, gen/0]).
+
+-opaque id() :: string().
+
+-spec f() -> char().
+
+%% List pattern matching issue
+f() -> [H|_T] = gen(), H.
+
+-spec gen() -> id().
+
+gen() -> "Dummy".
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis4.erl b/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis4.erl
new file mode 100644
index 0000000000..026d6f0c77
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis4.erl
@@ -0,0 +1,13 @@
+-module(zoltan_kis4).
+
+-export([f/0, gen/0]).
+
+-export_type([id/0]).
+
+-opaque id() :: string().
+
+-spec f() -> id().
+f() -> "Dummy" = gen(). %% Matching issue
+
+-spec gen() -> id().
+gen() -> "Dummy".
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis5.erl b/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis5.erl
new file mode 100644
index 0000000000..ecf14c91c1
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis5.erl
@@ -0,0 +1,14 @@
+-module(zoltan_kis5).
+
+-export([f/0, gen/0]).
+
+-opaque id() :: string().
+
+-spec f() -> boolean().
+
+%% Equality test issue
+f() -> "Dummy" == gen().
+
+-spec gen() -> id().
+
+gen() -> "Dummy".
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis6.erl b/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis6.erl
new file mode 100644
index 0000000000..6f0779d7d1
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis6.erl
@@ -0,0 +1,14 @@
+-module(zoltan_kis6).
+
+-export([f/0, gen/0]).
+
+-opaque id() :: {integer(),atom()}.
+
+%%-spec f() -> id().
+
+%% Tuple Unification (t_unify) issue
+f() -> {X,Y} = gen().
+
+-spec gen() -> id().
+
+gen() -> {34, leprecon}.
diff --git a/lib/dialyzer/test/options1_SUITE_data/dialyzer_options b/lib/dialyzer/test/options1_SUITE_data/dialyzer_options
new file mode 100644
index 0000000000..c612e77d3e
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/dialyzer_options
@@ -0,0 +1,2 @@
+{dialyzer_options, [{include_dirs, ["my_include"]}, {defines, [{'COMPILER_VSN', 42}]}, {warnings, [no_improper_lists]}]}.
+{time_limit, 30}.
diff --git a/lib/dialyzer/test/options1_SUITE_data/my_include/CVS/Entries b/lib/dialyzer/test/options1_SUITE_data/my_include/CVS/Entries
new file mode 100644
index 0000000000..513d4a315a
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/my_include/CVS/Entries
@@ -0,0 +1,3 @@
+/erl_bits.hrl/1.1/Wed Dec 17 09:53:40 2008//
+/erl_compile.hrl/1.1/Wed Dec 17 09:53:40 2008//
+D
diff --git a/lib/dialyzer/test/options1_SUITE_data/my_include/CVS/Repository b/lib/dialyzer/test/options1_SUITE_data/my_include/CVS/Repository
new file mode 100644
index 0000000000..1c6511fec3
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/my_include/CVS/Repository
@@ -0,0 +1 @@
+dialyzer_tests/option_tests/compiler/my_include
diff --git a/lib/dialyzer/test/options1_SUITE_data/my_include/CVS/Root b/lib/dialyzer/test/options1_SUITE_data/my_include/CVS/Root
new file mode 100644
index 0000000000..f6cdd6158b
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/my_include/CVS/Root
@@ -0,0 +1 @@
+:pserver:[email protected]:/hipe
diff --git a/lib/dialyzer/test/options1_SUITE_data/my_include/erl_bits.hrl b/lib/dialyzer/test/options1_SUITE_data/my_include/erl_bits.hrl
new file mode 100644
index 0000000000..45045ebb33
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/my_include/erl_bits.hrl
@@ -0,0 +1,43 @@
+%% ``The contents of this file are subject to the Erlang Public License,
+%% Version 1.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.erlang.org/EPL1_0.txt
+%%
+%% 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.
+%%
+%% The Original Code is Erlang-4.7.3, December, 1998.
+%%
+%% The Initial Developer of the Original Code is Ericsson Telecom
+%% AB. Portions created by Ericsson are Copyright (C), 1998, Ericsson
+%% Telecom AB. All Rights Reserved.
+%%
+%% Contributor(s): ______________________________________.''
+%%
+%% This is an -*- erlang -*- file.
+%% Generic compiler options, passed from the erl_compile module.
+
+-record(bittype, {
+ type, %% integer/float/binary
+ unit, %% element unit
+ sign, %% signed/unsigned
+ endian %% big/little
+ }).
+
+-record(bitdefault, {
+ integer, %% default type for integer
+ float, %% default type for float
+ binary %% default type for binary
+ }).
+
+%%% (From config.hrl in the bitsyntax branch.)
+-define(SYS_ENDIAN, big).
+-define(SIZEOF_CHAR, 1).
+-define(SIZEOF_DOUBLE, 8).
+-define(SIZEOF_FLOAT, 4).
+-define(SIZEOF_INT, 4).
+-define(SIZEOF_LONG, 4).
+-define(SIZEOF_LONG_LONG, 8).
+-define(SIZEOF_SHORT, 2).
diff --git a/lib/dialyzer/test/options1_SUITE_data/my_include/erl_compile.hrl b/lib/dialyzer/test/options1_SUITE_data/my_include/erl_compile.hrl
new file mode 100644
index 0000000000..c10ffa235c
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/my_include/erl_compile.hrl
@@ -0,0 +1,41 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: erl_compile.hrl,v 1.1 2008/12/17 09:53:40 mikpe Exp $
+%%
+
+%% Generic compiler options, passed from the erl_compile module.
+
+-record(options,
+ {includes=[], % Include paths (list of absolute
+ % directory names).
+ outdir=".", % Directory for result (absolute
+ % path).
+ output_type=undefined, % Type of output file (atom).
+ defines=[], % Preprocessor defines. Each
+ % element is an atom (the name to
+ % define), or a {Name, Value}
+ % tuple.
+ warning=1, % Warning level (0 - no
+ % warnings, 1 - standard level,
+ % 2, 3, ... - more warnings).
+ verbose=false, % Verbose (true/false).
+ optimize=999, % Optimize options.
+ specific=[], % Compiler specific options.
+ outfile="", % Name of output file (internal
+ % use in erl_compile.erl).
+ cwd % Current working directory
+ % for erlc.
+ }).
diff --git a/lib/dialyzer/test/options1_SUITE_data/results/compiler b/lib/dialyzer/test/options1_SUITE_data/results/compiler
new file mode 100644
index 0000000000..e82087ae86
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/results/compiler
@@ -0,0 +1,35 @@
+
+beam_asm.erl:32: The pattern {'error', Error} can never match the type <<_:64,_:_*8>>
+beam_bool.erl:193: The pattern {[], _} can never match the type {[{_,_,_,_},...],[any()]}
+beam_bool.erl:510: The pattern [{'set', [Dst], _, _}, {'%live', _}] can never match the type [{_,_,_,_}]
+beam_disasm.erl:537: The variable X can never match since previous clauses completely covered the type 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
+beam_type.erl:284: The pattern <'pi', 0> can never match the type <_,1 | 2>
+beam_validator.erl:396: The pattern <{'jump', {'f', _}}, Vst = {'vst', 'none', _}> can never match the type <_,#vst{current::#st{ct::[]}}>
+beam_validator.erl:690: The pattern <'term', OldT> can never match the type <{'tuple',[any(),...]},_>
+beam_validator.erl:693: Guard test 'or'('false','false') can never succeed
+beam_validator.erl:700: Guard test 'or'('false','false') can never succeed
+beam_validator.erl:702: The pattern <'number', OldT = {Type, _}> can never match the type <{'tuple',[any(),...]},_>
+beam_validator.erl:705: The pattern <'bool', {'atom', A}> can never match the type <{'tuple',[any(),...]},_>
+beam_validator.erl:707: The pattern <{'atom', A}, 'bool'> can never match the type <{'tuple',[any(),...]},_>
+beam_validator.erl:713: Guard test is_integer(Sz::[any(),...]) can never succeed
+beam_validator.erl:727: Function upgrade_bool/1 will never be called
+cerl_inline.erl:190: The pattern 'true' can never match the type 'false'
+cerl_inline.erl:219: The pattern 'true' can never match the type 'false'
+cerl_inline.erl:230: The pattern 'true' can never match the type 'false'
+cerl_inline.erl:2333: The pattern 'true' can never match the type 'false'
+cerl_inline.erl:2355: The pattern 'true' can never match the type 'false'
+cerl_inline.erl:238: The pattern 'true' can never match the type 'false'
+cerl_inline.erl:2436: Function filename/1 will never be called
+cerl_inline.erl:2700: The pattern 'true' can never match the type 'false'
+cerl_inline.erl:2730: The pattern <{F, L, D}, Vs> can never match the type <[1..255,...],[any()]>
+cerl_inline.erl:2738: The pattern <{F, L, D}, Vs> can never match the type <[1..255,...],[any()]>
+cerl_inline.erl:2750: The pattern <{[], L, D}, Vs> can never match the type <[1..255,...],[any()]>
+cerl_inline.erl:2752: The pattern <{[], _L, D}, Vs> can never match the type <[1..255,...],[any()]>
+cerl_inline.erl:2754: The pattern <{F, L, D}, Vs> can never match the type <[1..255,...],[any()]>
+cerl_inline.erl:2756: The pattern <{F, _L, D}, Vs> can never match the type <[1..255,...],[any()]>
+compile.erl:788: The pattern {'error', Es} can never match the type {'ok',<<_:64,_:_*8>>}
+core_lint.erl:473: The pattern <{'c_atom', _, 'all'}, 'binary', _Def, St> can never match the type <_,#c_nil{} | {'c_atom' | 'c_char' | 'c_float' | 'c_int' | 'c_string' | 'c_tuple',_,_} | #c_cons{hd::#c_nil{} | {'c_atom' | 'c_char' | 'c_float' | 'c_int' | 'c_string' | 'c_tuple',_,_} | #c_cons{hd::{_,_} | {_,_,_} | {_,_,_,_},tl::{_,_} | {_,_,_} | {_,_,_,_}},tl::#c_nil{} | {'c_atom' | 'c_char' | 'c_float' | 'c_int' | 'c_string' | 'c_tuple',_,_} | #c_cons{hd::{_,_} | {_,_,_} | {_,_,_,_},tl::{_,_} | {_,_,_} | {_,_,_,_}}},[any()],_>
+core_lint.erl:505: The pattern <_Req, 'unknown', St> can never match the type <non_neg_integer(),non_neg_integer(),_>
+v3_codegen.erl:1569: The call v3_codegen:load_reg_1(V::any(),I::0,Rs::any(),pos_integer()) will never return since it differs in the 4th argument from the success typing arguments: (any(),0,maybe_improper_list(),0)
+v3_codegen.erl:1571: The call v3_codegen:load_reg_1(V::any(),I::0,[],pos_integer()) will never return since it differs in the 4th argument from the success typing arguments: (any(),0,maybe_improper_list(),0)
+v3_core.erl:646: The pattern <Prim = {'iprimop', _, _, _}, St> can never match the type <#c_nil{anno::[any(),...]} | {'c_atom' | 'c_char' | 'c_float' | 'c_int' | 'c_string' | 'c_tuple' | 'c_var' | 'ibinary' | 'icatch' | 'ireceive1',[any(),...] | {_,_,_,_},_} | #c_cons{anno::[any(),...]} | #c_fname{anno::[any(),...]} | #iletrec{anno::{_,_,_,_},defs::[any(),...],body::[any(),...]} | #icase{anno::{_,_,_,_},args::[any()],clauses::[any()],fc::{_,_,_,_,_,_}} | #ireceive2{anno::{_,_,_,_},clauses::[any()],action::[any()]} | #ifun{anno::{_,_,_,_},id::[any(),...],vars::[any()],clauses::[any(),...],fc::{_,_,_,_,_,_}} | #imatch{anno::{_,_,_,_},guard::[],fc::{_,_,_,_,_,_}} | #itry{anno::{_,_,_,_},args::[any()],vars::[any(),...],body::[any(),...],evars::[any(),...],handler::[any(),...]},_>
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_asm.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_asm.erl
new file mode 100644
index 0000000000..e3746f3fb6
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_asm.erl
@@ -0,0 +1,358 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: beam_asm.erl,v 1.1 2008/12/17 09:53:40 mikpe Exp $
+%%
+%% Purpose : Assembler for threaded Beam.
+
+-module(beam_asm).
+
+-export([module/4,format_error/1]).
+-export([encode/2]).
+
+-import(lists, [map/2,member/2,keymember/3,duplicate/2]).
+-include("beam_opcodes.hrl").
+
+-define(bs_aligned, 1).
+
+module(Code, Abst, SourceFile, Opts) ->
+ case assemble(Code, Abst, SourceFile, Opts) of
+ {error, Error} ->
+ {error, [{none, ?MODULE, Error}]};
+ Bin when binary(Bin) ->
+ {ok, Bin}
+ end.
+
+format_error({crashed, Why}) ->
+ io_lib:format("beam_asm_int: EXIT: ~p", [Why]).
+
+assemble({Mod,Exp,Attr,Asm,NumLabels}, Abst, SourceFile, Opts) ->
+ {1,Dict0} = beam_dict:atom(Mod, beam_dict:new()),
+ NumFuncs = length(Asm),
+ {Code,Dict1} = assemble_1(Asm, Exp, Dict0, []),
+ build_file(Code, Attr, Dict1, NumLabels, NumFuncs, Abst, SourceFile, Opts).
+
+assemble_1([{function,Name,Arity,Entry,Asm}|T], Exp, Dict0, Acc) ->
+ Dict1 = case member({Name,Arity}, Exp) of
+ true ->
+ beam_dict:export(Name, Arity, Entry, Dict0);
+ false ->
+ beam_dict:local(Name, Arity, Entry, Dict0)
+ end,
+ {Code, Dict2} = assemble_function(Asm, Acc, Dict1),
+ assemble_1(T, Exp, Dict2, Code);
+assemble_1([], _Exp, Dict0, Acc) ->
+ {IntCodeEnd,Dict1} = make_op(int_code_end, Dict0),
+ {list_to_binary(lists:reverse(Acc, [IntCodeEnd])),Dict1}.
+
+assemble_function([H|T], Acc, Dict0) ->
+ {Code, Dict} = make_op(H, Dict0),
+ assemble_function(T, [Code| Acc], Dict);
+assemble_function([], Code, Dict) ->
+ {Code, Dict}.
+
+build_file(Code, Attr, Dict, NumLabels, NumFuncs, Abst, SourceFile, Opts) ->
+ %% Create the code chunk.
+
+ CodeChunk = chunk(<<"Code">>,
+ <<16:32,
+ (beam_opcodes:format_number()):32,
+ (beam_dict:highest_opcode(Dict)):32,
+ NumLabels:32,
+ NumFuncs:32>>,
+ Code),
+
+ %% Create the atom table chunk.
+
+ {NumAtoms, AtomTab} = beam_dict:atom_table(Dict),
+ AtomChunk = chunk(<<"Atom">>, <<NumAtoms:32>>, AtomTab),
+
+ %% Create the import table chunk.
+
+ {NumImps, ImpTab0} = beam_dict:import_table(Dict),
+ Imp = flatten_imports(ImpTab0),
+ ImportChunk = chunk(<<"ImpT">>, <<NumImps:32>>, Imp),
+
+ %% Create the export table chunk.
+
+ {NumExps, ExpTab0} = beam_dict:export_table(Dict),
+ Exp = flatten_exports(ExpTab0),
+ ExpChunk = chunk(<<"ExpT">>, <<NumExps:32>>, Exp),
+
+ %% Create the local function table chunk.
+
+ {NumLocals, Locals} = beam_dict:local_table(Dict),
+ Loc = flatten_exports(Locals),
+ LocChunk = chunk(<<"LocT">>, <<NumLocals:32>>, Loc),
+
+ %% Create the string table chunk.
+
+ {_,StringTab} = beam_dict:string_table(Dict),
+ StringChunk = chunk(<<"StrT">>, StringTab),
+
+ %% Create the fun table chunk. It is important not to build an empty chunk,
+ %% as that would change the MD5.
+
+ LambdaChunk = case beam_dict:lambda_table(Dict) of
+ {0,[]} -> [];
+ {NumLambdas,LambdaTab} ->
+ chunk(<<"FunT">>, <<NumLambdas:32>>, LambdaTab)
+ end,
+
+ %% Create the attributes and compile info chunks.
+
+ Essentials = [AtomChunk,CodeChunk,StringChunk,ImportChunk,ExpChunk,LambdaChunk],
+ {Attributes,Compile} = build_attributes(Opts, SourceFile, Attr, Essentials),
+ AttrChunk = chunk(<<"Attr">>, Attributes),
+ CompileChunk = chunk(<<"CInf">>, Compile),
+
+ %% Create the abstract code chunk.
+
+ AbstChunk = chunk(<<"Abst">>, Abst),
+
+ %% Create IFF chunk.
+
+ Chunks = case member(slim, Opts) of
+ true -> [Essentials,AttrChunk,CompileChunk,AbstChunk];
+ false -> [Essentials,LocChunk,AttrChunk,CompileChunk,AbstChunk]
+ end,
+ build_form(<<"BEAM">>, Chunks).
+
+%% Build an IFF form.
+
+build_form(Id, Chunks0) when size(Id) == 4, list(Chunks0) ->
+ Chunks = list_to_binary(Chunks0),
+ Size = size(Chunks),
+ 0 = Size rem 4, % Assertion: correct padding?
+ <<"FOR1",(Size+4):32,Id/binary,Chunks/binary>>.
+
+%% Build a correctly padded chunk (with no sub-header).
+
+chunk(Id, Contents) when size(Id) == 4, binary(Contents) ->
+ Size = size(Contents),
+ [<<Id/binary,Size:32>>,Contents|pad(Size)];
+chunk(Id, Contents) when list(Contents) ->
+ chunk(Id, list_to_binary(Contents)).
+
+%% Build a correctly padded chunk (with a sub-header).
+
+chunk(Id, Head, Contents) when size(Id) == 4, is_binary(Head), is_binary(Contents) ->
+ Size = size(Head)+size(Contents),
+ [<<Id/binary,Size:32,Head/binary>>,Contents|pad(Size)];
+chunk(Id, Head, Contents) when list(Contents) ->
+ chunk(Id, Head, list_to_binary(Contents)).
+
+pad(Size) ->
+ case Size rem 4 of
+ 0 -> [];
+ Rem -> duplicate(4 - Rem, 0)
+ end.
+
+flatten_exports(Exps) ->
+ list_to_binary(map(fun({F,A,L}) -> <<F:32,A:32,L:32>> end, Exps)).
+
+flatten_imports(Imps) ->
+ list_to_binary(map(fun({M,F,A}) -> <<M:32,F:32,A:32>> end, Imps)).
+
+build_attributes(Opts, SourceFile, Attr, Essentials) ->
+ Misc = case member(slim, Opts) of
+ false ->
+ {{Y,Mo,D},{H,Mi,S}} = erlang:universaltime(),
+ [{time,{Y,Mo,D,H,Mi,S}},{source,SourceFile}];
+ true -> []
+ end,
+ Compile = [{options,Opts},{version,?COMPILER_VSN}|Misc],
+ {term_to_binary(calc_vsn(Attr, Essentials)),term_to_binary(Compile)}.
+
+%%
+%% If the attributes contains no 'vsn' attribute, we'll insert one
+%% with an MD5 "checksum" calculated on the code as its value.
+%% We'll not change an existing 'vsn' attribute.
+%%
+
+calc_vsn(Attr, Essentials) ->
+ case keymember(vsn, 1, Attr) of
+ true -> Attr;
+ false ->
+ <<Number:128>> = erlang:md5(Essentials),
+ [{vsn,[Number]}|Attr]
+ end.
+
+bif_type('-', 1) -> negate;
+bif_type('+', 2) -> {op, m_plus};
+bif_type('-', 2) -> {op, m_minus};
+bif_type('*', 2) -> {op, m_times};
+bif_type('/', 2) -> {op, m_div};
+bif_type('div', 2) -> {op, int_div};
+bif_type('rem', 2) -> {op, int_rem};
+bif_type('band', 2) -> {op, int_band};
+bif_type('bor', 2) -> {op, int_bor};
+bif_type('bxor', 2) -> {op, int_bxor};
+bif_type('bsl', 2) -> {op, int_bsl};
+bif_type('bsr', 2) -> {op, int_bsr};
+bif_type('bnot', 1) -> {op, int_bnot};
+bif_type(fnegate, 1) -> {op, fnegate};
+bif_type(fadd, 2) -> {op, fadd};
+bif_type(fsub, 2) -> {op, fsub};
+bif_type(fmul, 2) -> {op, fmul};
+bif_type(fdiv, 2) -> {op, fdiv};
+bif_type(_, _) -> bif.
+
+make_op(Comment, Dict) when element(1, Comment) == '%' ->
+ {[],Dict};
+make_op({'%live',_R}, Dict) ->
+ {[],Dict};
+make_op({bif, Bif, nofail, [], Dest}, Dict) ->
+ encode_op(bif0, [{extfunc, erlang, Bif, 0}, Dest], Dict);
+make_op({bif, raise, _Fail, [A1,A2], _Dest}, Dict) ->
+ encode_op(raise, [A1,A2], Dict);
+make_op({bif, Bif, Fail, Args, Dest}, Dict) ->
+ Arity = length(Args),
+ case bif_type(Bif, Arity) of
+ {op, Op} ->
+ make_op(list_to_tuple([Op, Fail|Args++[Dest]]), Dict);
+ negate ->
+ %% Fake negation operator.
+ make_op({m_minus, Fail, {integer,0}, hd(Args), Dest}, Dict);
+ bif ->
+ BifOp = list_to_atom(lists:concat([bif, Arity])),
+ encode_op(BifOp, [Fail, {extfunc, erlang, Bif, Arity}|Args++[Dest]],
+ Dict)
+ end;
+make_op({bs_add=Op,Fail,[Src1,Src2,Unit],Dest}, Dict) ->
+ encode_op(Op, [Fail,Src1,Src2,Unit,Dest], Dict);
+make_op({test,Cond,Fail,Ops}, Dict) when list(Ops) ->
+ encode_op(Cond, [Fail|Ops], Dict);
+make_op({make_fun2,{f,Lbl},Index,OldUniq,NumFree}, Dict0) ->
+ {Fun,Dict} = beam_dict:lambda(Lbl, Index, OldUniq, NumFree, Dict0),
+ make_op({make_fun2,Fun}, Dict);
+make_op(Op, Dict) when atom(Op) ->
+ encode_op(Op, [], Dict);
+make_op({kill,Y}, Dict) ->
+ make_op({init,Y}, Dict);
+make_op({Name,Arg1}, Dict) ->
+ encode_op(Name, [Arg1], Dict);
+make_op({Name,Arg1,Arg2}, Dict) ->
+ encode_op(Name, [Arg1,Arg2], Dict);
+make_op({Name,Arg1,Arg2,Arg3}, Dict) ->
+ encode_op(Name, [Arg1,Arg2,Arg3], Dict);
+make_op({Name,Arg1,Arg2,Arg3,Arg4}, Dict) ->
+ encode_op(Name, [Arg1,Arg2,Arg3,Arg4], Dict);
+make_op({Name,Arg1,Arg2,Arg3,Arg4,Arg5}, Dict) ->
+ encode_op(Name, [Arg1,Arg2,Arg3,Arg4,Arg5], Dict);
+make_op({Name,Arg1,Arg2,Arg3,Arg4,Arg5,Arg6}, Dict) ->
+ encode_op(Name, [Arg1,Arg2,Arg3,Arg4,Arg5,Arg6], Dict).
+
+encode_op(Name, Args, Dict0) when atom(Name) ->
+ {EncArgs,Dict1} = encode_args(Args, Dict0),
+ Op = beam_opcodes:opcode(Name, length(Args)),
+ Dict2 = beam_dict:opcode(Op, Dict1),
+ {list_to_binary([Op|EncArgs]),Dict2}.
+
+encode_args([Arg| T], Dict0) ->
+ {EncArg, Dict1} = encode_arg(Arg, Dict0),
+ {EncTail, Dict2} = encode_args(T, Dict1),
+ {[EncArg| EncTail], Dict2};
+encode_args([], Dict) ->
+ {[], Dict}.
+
+encode_arg({x, X}, Dict) when X >= 0 ->
+ {encode(?tag_x, X), Dict};
+encode_arg({y, Y}, Dict) when Y >= 0 ->
+ {encode(?tag_y, Y), Dict};
+encode_arg({atom, Atom}, Dict0) when atom(Atom) ->
+ {Index, Dict} = beam_dict:atom(Atom, Dict0),
+ {encode(?tag_a, Index), Dict};
+encode_arg({integer, N}, Dict) ->
+ {encode(?tag_i, N), Dict};
+encode_arg(nil, Dict) ->
+ {encode(?tag_a, 0), Dict};
+encode_arg({f, W}, Dict) ->
+ {encode(?tag_f, W), Dict};
+encode_arg({'char', C}, Dict) ->
+ {encode(?tag_h, C), Dict};
+encode_arg({string, String}, Dict0) ->
+ {Offset, Dict} = beam_dict:string(String, Dict0),
+ {encode(?tag_u, Offset), Dict};
+encode_arg({extfunc, M, F, A}, Dict0) ->
+ {Index, Dict} = beam_dict:import(M, F, A, Dict0),
+ {encode(?tag_u, Index), Dict};
+encode_arg({list, List}, Dict0) ->
+ {L, Dict} = encode_list(List, Dict0, []),
+ {[encode(?tag_z, 1), encode(?tag_u, length(List))|L], Dict};
+encode_arg({float, Float}, Dict) when float(Float) ->
+ {[encode(?tag_z, 0)|<<Float:64/float>>], Dict};
+encode_arg({fr,Fr}, Dict) ->
+ {[encode(?tag_z, 2),encode(?tag_u,Fr)], Dict};
+encode_arg({field_flags,Flags0}, Dict) ->
+ Flags = lists:foldl(fun (F, S) -> S bor flag_to_bit(F) end, 0, Flags0),
+ {encode(?tag_u, Flags), Dict};
+encode_arg({alloc,List}, Dict) ->
+ {encode_alloc_list(List),Dict};
+encode_arg(Int, Dict) when is_integer(Int) ->
+ {encode(?tag_u, Int),Dict}.
+
+flag_to_bit(aligned) -> 16#01;
+flag_to_bit(little) -> 16#02;
+flag_to_bit(big) -> 16#00;
+flag_to_bit(signed) -> 16#04;
+flag_to_bit(unsigned)-> 16#00;
+flag_to_bit(exact) -> 16#08;
+flag_to_bit(native) -> 16#10.
+
+encode_list([H|T], _Dict, _Acc) when is_list(H) ->
+ exit({illegal_nested_list,encode_arg,[H|T]});
+encode_list([H|T], Dict0, Acc) ->
+ {Enc,Dict} = encode_arg(H, Dict0),
+ encode_list(T, Dict, [Enc|Acc]);
+encode_list([], Dict, Acc) ->
+ {lists:reverse(Acc), Dict}.
+
+encode_alloc_list(L0) ->
+ L = encode_alloc_list_1(L0),
+ [encode(?tag_z, 3),encode(?tag_u, length(L0))|L].
+
+encode_alloc_list_1([{words,Words}|T]) ->
+ [encode(?tag_u, 0),encode(?tag_u, Words)|encode_alloc_list_1(T)];
+encode_alloc_list_1([{floats,Floats}|T]) ->
+ [encode(?tag_u, 1),encode(?tag_u, Floats)|encode_alloc_list_1(T)];
+encode_alloc_list_1([]) -> [].
+
+encode(Tag, N) when N < 0 ->
+ encode1(Tag, negative_to_bytes(N, []));
+encode(Tag, N) when N < 16 ->
+ (N bsl 4) bor Tag;
+encode(Tag, N) when N < 16#800 ->
+ [((N bsr 3) band 2#11100000) bor Tag bor 2#00001000, N band 16#ff];
+encode(Tag, N) ->
+ encode1(Tag, to_bytes(N, [])).
+
+encode1(Tag, Bytes) ->
+ case length(Bytes) of
+ Num when 2 =< Num, Num =< 8 ->
+ [((Num-2) bsl 5) bor 2#00011000 bor Tag| Bytes];
+ Num when 8 < Num ->
+ [2#11111000 bor Tag, encode(?tag_u, Num-9)| Bytes]
+ end.
+
+to_bytes(0, [B|Acc]) when B < 128 ->
+ [B|Acc];
+to_bytes(N, Acc) ->
+ to_bytes(N bsr 8, [N band 16#ff| Acc]).
+
+negative_to_bytes(-1, [B1, B2|T]) when B1 > 127 ->
+ [B1, B2|T];
+negative_to_bytes(N, Acc) ->
+ negative_to_bytes(N bsr 8, [N band 16#ff|Acc]).
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_block.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_block.erl
new file mode 100644
index 0000000000..0e3589cdf5
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_block.erl
@@ -0,0 +1,601 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: beam_block.erl,v 1.1 2008/12/17 09:53:41 mikpe Exp $
+%%
+%% Purpose : Partitions assembly instructions into basic blocks and
+%% optimizes them.
+
+-module(beam_block).
+
+-export([module/2]).
+-export([live_at_entry/1]). %Used by beam_type, beam_bool.
+-export([is_killed/2]). %Used by beam_dead, beam_type, beam_bool.
+-export([is_not_used/2]). %Used by beam_bool.
+-export([merge_blocks/2]). %Used by beam_jump.
+-import(lists, [map/2,mapfoldr/3,reverse/1,reverse/2,foldl/3,
+ member/2,sort/1,all/2]).
+-define(MAXREG, 1024).
+
+module({Mod,Exp,Attr,Fs,Lc}, _Opt) ->
+ {ok,{Mod,Exp,Attr,map(fun function/1, Fs),Lc}}.
+
+function({function,Name,Arity,CLabel,Is0}) ->
+ %% Collect basic blocks and optimize them.
+ Is = blockify(Is0),
+
+ %% Done.
+ {function,Name,Arity,CLabel,Is}.
+
+%% blockify(Instructions0) -> Instructions
+%% Collect sequences of instructions to basic blocks and
+%% optimize the contents of the blocks. Also do some simple
+%% optimations on instructions outside the blocks.
+
+blockify(Is) ->
+ blockify(Is, []).
+
+blockify([{loop_rec,{f,Fail},{x,0}},{loop_rec_end,_Lbl},{label,Fail}|Is], Acc) ->
+ %% Useless instruction sequence.
+ blockify(Is, Acc);
+blockify([{test,bs_test_tail,F,[Bits]}|Is],
+ [{test,bs_skip_bits,F,[{integer,I},Unit,_Flags]}|Acc]) ->
+ blockify(Is, [{test,bs_test_tail,F,[Bits+I*Unit]}|Acc]);
+blockify([{test,bs_skip_bits,F,[{integer,I1},Unit1,_]}|Is],
+ [{test,bs_skip_bits,F,[{integer,I2},Unit2,Flags]}|Acc]) ->
+ blockify(Is, [{test,bs_skip_bits,F,
+ [{integer,I1*Unit1+I2*Unit2},1,Flags]}|Acc]);
+blockify([{test,is_atom,{f,Fail},[Reg]}=I|
+ [{select_val,Reg,{f,Fail},
+ {list,[{atom,false},{f,_}=BrFalse,
+ {atom,true}=AtomTrue,{f,_}=BrTrue]}}|Is]=Is0],
+ [{block,Bl}|_]=Acc) ->
+ case is_last_bool(Bl, Reg) of
+ false ->
+ blockify(Is0, [I|Acc]);
+ true ->
+ blockify(Is, [{jump,BrTrue},
+ {test,is_eq_exact,BrFalse,[Reg,AtomTrue]}|Acc])
+ end;
+blockify([{test,is_atom,{f,Fail},[Reg]}=I|
+ [{select_val,Reg,{f,Fail},
+ {list,[{atom,true}=AtomTrue,{f,_}=BrTrue,
+ {atom,false},{f,_}=BrFalse]}}|Is]=Is0],
+ [{block,Bl}|_]=Acc) ->
+ case is_last_bool(Bl, Reg) of
+ false ->
+ blockify(Is0, [I|Acc]);
+ true ->
+ blockify(Is, [{jump,BrTrue},
+ {test,is_eq_exact,BrFalse,[Reg,AtomTrue]}|Acc])
+ end;
+blockify([I|Is0]=IsAll, Acc) ->
+ case is_bs_put(I) of
+ true ->
+ {BsPuts0,Is} = collect_bs_puts(IsAll),
+ BsPuts = opt_bs_puts(BsPuts0),
+ blockify(Is, reverse(BsPuts, Acc));
+ false ->
+ case collect(I) of
+ error -> blockify(Is0, [I|Acc]);
+ Instr when is_tuple(Instr) ->
+ {Block0,Is} = collect_block(IsAll),
+ Block = opt_block(Block0),
+ blockify(Is, [{block,Block}|Acc])
+ end
+ end;
+blockify([], Acc) -> reverse(Acc).
+
+is_last_bool([I,{'%live',_}], Reg) ->
+ is_last_bool([I], Reg);
+is_last_bool([{set,[Reg],As,{bif,N,_}}], Reg) ->
+ Ar = length(As),
+ erl_internal:new_type_test(N, Ar) orelse erl_internal:comp_op(N, Ar)
+ orelse erl_internal:bool_op(N, Ar);
+is_last_bool([_|Is], Reg) -> is_last_bool(Is, Reg);
+is_last_bool([], _) -> false.
+
+collect_block(Is) ->
+ collect_block(Is, []).
+
+collect_block([{allocate_zero,Ns,R},{test_heap,Nh,R}|Is], Acc) ->
+ collect_block(Is, [{allocate,R,{no_opt,Ns,Nh,[]}}|Acc]);
+collect_block([I|Is]=Is0, Acc) ->
+ case collect(I) of
+ error -> {reverse(Acc),Is0};
+ Instr -> collect_block(Is, [Instr|Acc])
+ end;
+collect_block([], Acc) -> {reverse(Acc),[]}.
+
+collect({allocate_zero,N,R}) -> {allocate,R,{zero,N,0,[]}};
+collect({test_heap,N,R}) -> {allocate,R,{nozero,nostack,N,[]}};
+collect({bif,N,nofail,As,D}) -> {set,[D],As,{bif,N}};
+collect({bif,N,F,As,D}) -> {set,[D],As,{bif,N,F}};
+collect({move,S,D}) -> {set,[D],[S],move};
+collect({put_list,S1,S2,D}) -> {set,[D],[S1,S2],put_list};
+collect({put_tuple,A,D}) -> {set,[D],[],{put_tuple,A}};
+collect({put,S}) -> {set,[],[S],put};
+collect({put_string,L,S,D}) -> {set,[D],[],{put_string,L,S}};
+collect({get_tuple_element,S,I,D}) -> {set,[D],[S],{get_tuple_element,I}};
+collect({set_tuple_element,S,D,I}) -> {set,[],[S,D],{set_tuple_element,I}};
+collect({get_list,S,D1,D2}) -> {set,[D1,D2],[S],get_list};
+collect(remove_message) -> {set,[],[],remove_message};
+collect({'catch',R,L}) -> {set,[R],[],{'catch',L}};
+collect({'%live',_}=Live) -> Live;
+collect(_) -> error.
+
+opt_block(Is0) ->
+ %% We explicitly move any allocate instruction upwards before optimising
+ %% moves, to avoid any potential problems with the calculation of live
+ %% registers.
+ Is1 = find_fixpoint(fun move_allocates/1, Is0),
+ Is2 = find_fixpoint(fun opt/1, Is1),
+ Is = opt_alloc(Is2),
+ share_floats(Is).
+
+find_fixpoint(OptFun, Is0) ->
+ case OptFun(Is0) of
+ Is0 -> Is0;
+ Is1 -> find_fixpoint(OptFun, Is1)
+ end.
+
+move_allocates([{set,_Ds,_Ss,{set_tuple_element,_}}|_]=Is) -> Is;
+move_allocates([{set,Ds,Ss,_Op}=Set,{allocate,R,Alloc}|Is]) when is_integer(R) ->
+ [{allocate,live_regs(Ds, Ss, R),Alloc},Set|Is];
+move_allocates([{allocate,R1,Alloc1},{allocate,R2,Alloc2}|Is]) ->
+ R1 = R2, % Assertion.
+ move_allocates([{allocate,R1,combine_alloc(Alloc1, Alloc2)}|Is]);
+move_allocates([I|Is]) ->
+ [I|move_allocates(Is)];
+move_allocates([]) -> [].
+
+combine_alloc({_,Ns,Nh1,Init}, {_,nostack,Nh2,[]}) ->
+ {zero,Ns,Nh1+Nh2,Init}.
+
+merge_blocks([{allocate,R,{Attr,Ns,Nh1,Init}}|B1],
+ [{allocate,_,{_,nostack,Nh2,[]}}|B2]) ->
+ Alloc = {allocate,R,{Attr,Ns,Nh1+Nh2,Init}},
+ [Alloc|merge_blocks(B1, B2)];
+merge_blocks(B1, B2) -> merge_blocks_1(B1++[{set,[],[],stop_here}|B2]).
+
+merge_blocks_1([{set,[],_,stop_here}|Is]) -> Is;
+merge_blocks_1([{set,[D],_,move}=I|Is]) ->
+ case is_killed(D, Is) of
+ true -> merge_blocks_1(Is);
+ false -> [I|merge_blocks_1(Is)]
+ end;
+merge_blocks_1([I|Is]) -> [I|merge_blocks_1(Is)].
+
+opt([{set,[Dst],As,{bif,Bif,Fail}}=I1,
+ {set,[Dst],[Dst],{bif,'not',Fail}}=I2|Is]) ->
+ %% Get rid of the 'not' if the operation can be inverted.
+ case inverse_comp_op(Bif) of
+ none -> [I1,I2|opt(Is)];
+ RevBif -> [{set,[Dst],As,{bif,RevBif,Fail}}|opt(Is)]
+ end;
+opt([{set,[X],[X],move}|Is]) -> opt(Is);
+opt([{set,[D1],[{integer,Idx1},Reg],{bif,element,{f,0}}}=I1,
+ {set,[D2],[{integer,Idx2},Reg],{bif,element,{f,0}}}=I2|Is])
+ when Idx1 < Idx2, D1 =/= D2, D1 =/= Reg, D2 =/= Reg ->
+ opt([I2,I1|Is]);
+opt([{set,Ds0,Ss,Op}|Is0]) ->
+ {Ds,Is} = opt_moves(Ds0, Is0),
+ [{set,Ds,Ss,Op}|opt(Is)];
+opt([I|Is]) -> [I|opt(Is)];
+opt([]) -> [].
+
+opt_moves([], Is0) -> {[],Is0};
+opt_moves([D0], Is0) ->
+ {D1,Is1} = opt_move(D0, Is0),
+ {[D1],Is1};
+opt_moves([X0,Y0]=Ds, Is0) ->
+ {X1,Is1} = opt_move(X0, Is0),
+ case opt_move(Y0, Is1) of
+ {Y1,Is2} when X1 =/= Y1 -> {[X1,Y1],Is2};
+ _Other when X1 =/= Y0 -> {[X1,Y0],Is1};
+ _Other -> {Ds,Is0}
+ end.
+
+opt_move(R, [{set,[D],[R],move}|Is]=Is0) ->
+ case is_killed(R, Is) of
+ true -> {D,Is};
+ false -> {R,Is0}
+ end;
+opt_move(R, [I|Is0]) ->
+ case is_transparent(R, I) of
+ true ->
+ {D,Is1} = opt_move(R, Is0),
+ case is_transparent(D, I) of
+ true -> {D,[I|Is1]};
+ false -> {R,[I|Is0]}
+ end;
+ false -> {R,[I|Is0]}
+ end;
+opt_move(R, []) -> {R,[]}.
+
+is_transparent(R, {set,Ds,Ss,_Op}) ->
+ case member(R, Ds) of
+ true -> false;
+ false -> not member(R, Ss)
+ end;
+is_transparent(_, _) -> false.
+
+%% is_killed(Register, [Instruction]) -> true|false
+%% Determine whether a register is killed by the instruction sequence.
+%% If true is returned, it means that the register will not be
+%% referenced in ANY way (not even indirectly by an allocate instruction);
+%% i.e. it is OK to enter the instruction sequence with Register
+%% containing garbage.
+
+is_killed({x,N}=R, [{block,Blk}|Is]) ->
+ case is_killed(R, Blk) of
+ true -> true;
+ false ->
+ %% Before looking beyond the block, we must be
+ %% sure that the register is not referenced by
+ %% any allocate instruction in the block.
+ case all(fun({allocate,Live,_}) when N < Live -> false;
+ (_) -> true
+ end, Blk) of
+ true -> is_killed(R, Is);
+ false -> false
+ end
+ end;
+is_killed(R, [{block,Blk}|Is]) ->
+ case is_killed(R, Blk) of
+ true -> true;
+ false -> is_killed(R, Is)
+ end;
+is_killed(R, [{set,Ds,Ss,_Op}|Is]) ->
+ case member(R, Ss) of
+ true -> false;
+ false ->
+ case member(R, Ds) of
+ true -> true;
+ false -> is_killed(R, Is)
+ end
+ end;
+is_killed(R, [{case_end,Used}|_]) -> R =/= Used;
+is_killed(R, [{badmatch,Used}|_]) -> R =/= Used;
+is_killed(_, [if_end|_]) -> true;
+is_killed(R, [{func_info,_,_,Ar}|_]) ->
+ case R of
+ {x,X} when X < Ar -> false;
+ _ -> true
+ end;
+is_killed(R, [{kill,R}|_]) -> true;
+is_killed(R, [{kill,_}|Is]) -> is_killed(R, Is);
+is_killed(R, [{bs_init2,_,_,_,_,_,Dst}|Is]) ->
+ if
+ R =:= Dst -> true;
+ true -> is_killed(R, Is)
+ end;
+is_killed(R, [{bs_put_string,_,_}|Is]) -> is_killed(R, Is);
+is_killed({x,R}, [{'%live',Live}|_]) when R >= Live -> true;
+is_killed({x,R}, [{'%live',_}|Is]) -> is_killed(R, Is);
+is_killed({x,R}, [{allocate,Live,_}|_]) ->
+ %% Note: To be safe here, we must return either true or false,
+ %% not looking further at the instructions beyond the allocate
+ %% instruction.
+ R >= Live;
+is_killed({x,R}, [{call,Live,_}|_]) when R >= Live -> true;
+is_killed({x,R}, [{call_last,Live,_,_}|_]) when R >= Live -> true;
+is_killed({x,R}, [{call_only,Live,_}|_]) when R >= Live -> true;
+is_killed({x,R}, [{call_ext,Live,_}|_]) when R >= Live -> true;
+is_killed({x,R}, [{call_ext_last,Live,_,_}|_]) when R >= Live -> true;
+is_killed({x,R}, [{call_ext_only,Live,_}|_]) when R >= Live -> true;
+is_killed({x,R}, [return|_]) when R > 0 -> true;
+is_killed(_, _) -> false.
+
+%% is_not_used(Register, [Instruction]) -> true|false
+%% Determine whether a register is used by the instruction sequence.
+%% If true is returned, it means that the register will not be
+%% referenced directly, but it may be referenced by an allocate
+%% instruction (meaning that it is NOT allowed to contain garbage).
+
+is_not_used(R, [{block,Blk}|Is]) ->
+ case is_not_used(R, Blk) of
+ true -> true;
+ false -> is_not_used(R, Is)
+ end;
+is_not_used({x,R}=Reg, [{allocate,Live,_}|Is]) ->
+ if
+ R >= Live -> true;
+ true -> is_not_used(Reg, Is)
+ end;
+is_not_used(R, [{set,Ds,Ss,_Op}|Is]) ->
+ case member(R, Ss) of
+ true -> false;
+ false ->
+ case member(R, Ds) of
+ true -> true;
+ false -> is_not_used(R, Is)
+ end
+ end;
+is_not_used(R, Is) -> is_killed(R, Is).
+
+%% opt_alloc(Instructions) -> Instructions'
+%% Optimises all allocate instructions.
+
+opt_alloc([{allocate,R,{_,Ns,Nh,[]}}|Is]) ->
+ [opt_alloc(Is, Ns, Nh, R)|opt(Is)];
+opt_alloc([I|Is]) -> [I|opt_alloc(Is)];
+opt_alloc([]) -> [].
+
+%% opt_alloc(Instructions, FrameSize, HeapNeed, LivingRegs) -> [Instr]
+%% Generates the optimal sequence of instructions for
+%% allocating and initalizing the stack frame and needed heap.
+
+opt_alloc(_Is, nostack, Nh, LivingRegs) ->
+ {allocate,LivingRegs,{nozero,nostack,Nh,[]}};
+opt_alloc(Is, Ns, Nh, LivingRegs) ->
+ InitRegs = init_yreg(Is, 0),
+ case count_ones(InitRegs) of
+ N when N*2 > Ns ->
+ {allocate,LivingRegs,{nozero,Ns,Nh,gen_init(Ns, InitRegs)}};
+ _ ->
+ {allocate,LivingRegs,{zero,Ns,Nh,[]}}
+ end.
+
+gen_init(Fs, Regs) -> gen_init(Fs, Regs, 0, []).
+
+gen_init(SameFs, _Regs, SameFs, Acc) -> reverse(Acc);
+gen_init(Fs, Regs, Y, Acc) when Regs band 1 == 0 ->
+ gen_init(Fs, Regs bsr 1, Y+1, [{init, {y,Y}}|Acc]);
+gen_init(Fs, Regs, Y, Acc) ->
+ gen_init(Fs, Regs bsr 1, Y+1, Acc).
+
+%% init_yreg(Instructions, RegSet) -> RegSetInitialized
+%% Calculate the set of initialized y registers.
+
+init_yreg([{set,_,_,{bif,_,_}}|_], Reg) -> Reg;
+init_yreg([{set,Ds,_,_}|Is], Reg) -> init_yreg(Is, add_yregs(Ds, Reg));
+init_yreg(_Is, Reg) -> Reg.
+
+add_yregs(Ys, Reg) -> foldl(fun(Y, R0) -> add_yreg(Y, R0) end, Reg, Ys).
+
+add_yreg({y,Y}, Reg) -> Reg bor (1 bsl Y);
+add_yreg(_, Reg) -> Reg.
+
+count_ones(Bits) -> count_ones(Bits, 0).
+count_ones(0, Acc) -> Acc;
+count_ones(Bits, Acc) ->
+ count_ones(Bits bsr 1, Acc + (Bits band 1)).
+
+%% live_at_entry(Is) -> NumberOfRegisters
+%% Calculate the number of register live at the entry to the code
+%% sequence.
+
+live_at_entry([{block,[{allocate,R,_}|_]}|_]) ->
+ R;
+live_at_entry([{label,_}|Is]) ->
+ live_at_entry(Is);
+live_at_entry([{block,Bl}|_]) ->
+ live_at_entry(Bl);
+live_at_entry([{func_info,_,_,Ar}|_]) ->
+ Ar;
+live_at_entry(Is0) ->
+ case reverse(Is0) of
+ [{'%live',Regs}|Is] -> live_at_entry_1(Is, (1 bsl Regs)-1);
+ _ -> unknown
+ end.
+
+live_at_entry_1([{set,Ds,Ss,_}|Is], Rset0) ->
+ Rset = x_live(Ss, x_dead(Ds, Rset0)),
+ live_at_entry_1(Is, Rset);
+live_at_entry_1([{allocate,_,_}|Is], Rset) ->
+ live_at_entry_1(Is, Rset);
+live_at_entry_1([], Rset) -> live_regs_1(0, Rset).
+
+%% Calculate the new number of live registers when we move an allocate
+%% instruction upwards, passing a 'set' instruction.
+
+live_regs(Ds, Ss, Regs0) ->
+ Rset = x_live(Ss, x_dead(Ds, (1 bsl Regs0)-1)),
+ live_regs_1(0, Rset).
+
+live_regs_1(N, 0) -> N;
+live_regs_1(N, Regs) -> live_regs_1(N+1, Regs bsr 1).
+
+x_dead([{x,N}|Rs], Regs) -> x_dead(Rs, Regs band (bnot (1 bsl N)));
+x_dead([_|Rs], Regs) -> x_dead(Rs, Regs);
+x_dead([], Regs) -> Regs.
+
+x_live([{x,N}|Rs], Regs) -> x_live(Rs, Regs bor (1 bsl N));
+x_live([_|Rs], Regs) -> x_live(Rs, Regs);
+x_live([], Regs) -> Regs.
+
+%%
+%% If a floating point literal occurs more than once, move it into
+%% a free register and re-use it.
+%%
+
+share_floats([{allocate,_,_}=Alloc|Is]) ->
+ [Alloc|share_floats(Is)];
+share_floats(Is0) ->
+ All = get_floats(Is0, []),
+ MoreThanOnce0 = more_than_once(sort(All), gb_sets:empty()),
+ case gb_sets:is_empty(MoreThanOnce0) of
+ true -> Is0;
+ false ->
+ MoreThanOnce = gb_sets:to_list(MoreThanOnce0),
+ FreeX = highest_used(Is0, -1) + 1,
+ Regs0 = make_reg_map(MoreThanOnce, FreeX, []),
+ Regs = gb_trees:from_orddict(Regs0),
+ Is = map(fun({set,Ds,[{float,F}],Op}=I) ->
+ case gb_trees:lookup(F, Regs) of
+ none -> I;
+ {value,R} -> {set,Ds,[R],Op}
+ end;
+ (I) -> I
+ end, Is0),
+ [{set,[R],[{float,F}],move} || {F,R} <- Regs0] ++ Is
+ end.
+
+get_floats([{set,_,[{float,F}],_}|Is], Acc) ->
+ get_floats(Is, [F|Acc]);
+get_floats([_|Is], Acc) ->
+ get_floats(Is, Acc);
+get_floats([], Acc) -> Acc.
+
+more_than_once([F,F|Fs], Set) ->
+ more_than_once(Fs, gb_sets:add(F, Set));
+more_than_once([_|Fs], Set) ->
+ more_than_once(Fs, Set);
+more_than_once([], Set) -> Set.
+
+highest_used([{set,Ds,Ss,_}|Is], High) ->
+ highest_used(Is, highest(Ds, highest(Ss, High)));
+highest_used([{'%live',Live}|Is], High) when Live > High ->
+ highest_used(Is, Live);
+highest_used([_|Is], High) ->
+ highest_used(Is, High);
+highest_used([], High) -> High.
+
+highest([{x,R}|Rs], High) when R > High ->
+ highest(Rs, R);
+highest([_|Rs], High) ->
+ highest(Rs, High);
+highest([], High) -> High.
+
+make_reg_map([F|Fs], R, Acc) when R < ?MAXREG ->
+ make_reg_map(Fs, R+1, [{F,{x,R}}|Acc]);
+make_reg_map(_, _, Acc) -> sort(Acc).
+
+%% inverse_comp_op(Op) -> none|RevOp
+
+inverse_comp_op('=:=') -> '=/=';
+inverse_comp_op('=/=') -> '=:=';
+inverse_comp_op('==') -> '/=';
+inverse_comp_op('/=') -> '==';
+inverse_comp_op('>') -> '=<';
+inverse_comp_op('<') -> '>=';
+inverse_comp_op('>=') -> '<';
+inverse_comp_op('=<') -> '>';
+inverse_comp_op(_) -> none.
+
+%%%
+%%% Evaluation of constant bit fields.
+%%%
+
+is_bs_put({bs_put_integer,_,_,_,_,_}) -> true;
+is_bs_put({bs_put_float,_,_,_,_,_}) -> true;
+is_bs_put(_) -> false.
+
+collect_bs_puts(Is) ->
+ collect_bs_puts_1(Is, []).
+
+collect_bs_puts_1([I|Is]=Is0, Acc) ->
+ case is_bs_put(I) of
+ false -> {reverse(Acc),Is0};
+ true -> collect_bs_puts_1(Is, [I|Acc])
+ end;
+collect_bs_puts_1([], Acc) -> {reverse(Acc),[]}.
+
+opt_bs_puts(Is) ->
+ opt_bs_1(Is, []).
+
+opt_bs_1([{bs_put_float,Fail,{integer,Sz},1,Flags0,Src}=I0|Is], Acc) ->
+ case catch eval_put_float(Src, Sz, Flags0) of
+ {'EXIT',_} ->
+ opt_bs_1(Is, [I0|Acc]);
+ <<Int:Sz>> ->
+ Flags = force_big(Flags0),
+ I = {bs_put_integer,Fail,{integer,Sz},1,Flags,{integer,Int}},
+ opt_bs_1([I|Is], Acc)
+ end;
+opt_bs_1([{bs_put_integer,_,{integer,8},1,_,{integer,_}}|_]=IsAll, Acc0) ->
+ {Is,Acc} = bs_collect_string(IsAll, Acc0),
+ opt_bs_1(Is, Acc);
+opt_bs_1([{bs_put_integer,Fail,{integer,Sz},1,F,{integer,N}}=I|Is0], Acc) when Sz > 8 ->
+ case field_endian(F) of
+ big ->
+ case bs_split_int(N, Sz, Fail, Is0) of
+ no_split -> opt_bs_1(Is0, [I|Acc]);
+ Is -> opt_bs_1(Is, Acc)
+ end;
+ little ->
+ case catch <<N:Sz/little>> of
+ {'EXIT',_} ->
+ opt_bs_1(Is0, [I|Acc]);
+ <<Int:Sz>> ->
+ Flags = force_big(F),
+ Is = [{bs_put_integer,Fail,{integer,Sz},1,
+ Flags,{integer,Int}}|Is0],
+ opt_bs_1(Is, Acc)
+ end;
+ native -> opt_bs_1(Is0, [I|Acc])
+ end;
+opt_bs_1([{Op,Fail,{integer,Sz},U,F,Src}|Is], Acc) when U > 1 ->
+ opt_bs_1([{Op,Fail,{integer,U*Sz},1,F,Src}|Is], Acc);
+opt_bs_1([I|Is], Acc) ->
+ opt_bs_1(Is, [I|Acc]);
+opt_bs_1([], Acc) -> reverse(Acc).
+
+eval_put_float(Src, Sz, Flags) ->
+ Val = value(Src),
+ case field_endian(Flags) of
+ little -> <<Val:Sz/little-float-unit:1>>;
+ big -> <<Val:Sz/big-float-unit:1>>
+ %% native intentionally not handled here - we can't optimize it.
+ end.
+
+value({integer,I}) -> I;
+value({float,F}) -> F;
+value({atom,A}) -> A.
+
+bs_collect_string(Is, [{bs_put_string,Len,{string,Str}}|Acc]) ->
+ bs_coll_str_1(Is, Len, reverse(Str), Acc);
+bs_collect_string(Is, Acc) ->
+ bs_coll_str_1(Is, 0, [], Acc).
+
+bs_coll_str_1([{bs_put_integer,_,{integer,Sz},U,_,{integer,V}}|Is],
+ Len, StrAcc, IsAcc) when U*Sz =:= 8 ->
+ Byte = V band 16#FF,
+ bs_coll_str_1(Is, Len+1, [Byte|StrAcc], IsAcc);
+bs_coll_str_1(Is, Len, StrAcc, IsAcc) ->
+ {Is,[{bs_put_string,Len,{string,reverse(StrAcc)}}|IsAcc]}.
+
+field_endian({field_flags,F}) -> field_endian_1(F).
+
+field_endian_1([big=E|_]) -> E;
+field_endian_1([little=E|_]) -> E;
+field_endian_1([native=E|_]) -> E;
+field_endian_1([_|Fs]) -> field_endian_1(Fs).
+
+force_big({field_flags,F}) ->
+ {field_flags,force_big_1(F)}.
+
+force_big_1([big|_]=Fs) -> Fs;
+force_big_1([little|Fs]) -> [big|Fs];
+force_big_1([F|Fs]) -> [F|force_big_1(Fs)].
+
+bs_split_int(0, Sz, _, _) when Sz > 64 ->
+ %% We don't want to split in this case because the
+ %% string will consist of only zeroes.
+ no_split;
+bs_split_int(N, Sz, Fail, Acc) ->
+ FirstByteSz = case Sz rem 8 of
+ 0 -> 8;
+ Rem -> Rem
+ end,
+ bs_split_int_1(N, FirstByteSz, Sz, Fail, Acc).
+
+bs_split_int_1(N, ByteSz, Sz, Fail, Acc) when Sz > 0 ->
+ Mask = (1 bsl ByteSz) - 1,
+ I = {bs_put_integer,Fail,{integer,ByteSz},1,
+ {field_flags,[big]},{integer,N band Mask}},
+ bs_split_int_1(N bsr ByteSz, 8, Sz-ByteSz, Fail, [I|Acc]);
+bs_split_int_1(_, _, _, _, Acc) -> Acc.
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_bool.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_bool.erl
new file mode 100644
index 0000000000..b7b28a41a5
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_bool.erl
@@ -0,0 +1,617 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: beam_bool.erl,v 1.1 2008/12/17 09:53:41 mikpe Exp $
+%%
+%% Purpose: Optimizes booleans in guards.
+
+-module(beam_bool).
+
+-export([module/2]).
+
+-import(lists, [reverse/1,foldl/3,mapfoldl/3,sort/1,member/2]).
+-define(MAXREG, 1024).
+
+-record(st,
+ {next, %Next label number.
+ ll %Live regs at labels.
+ }).
+
+module({Mod,Exp,Attr,Fs0,Lc}, _Opts) ->
+ %%io:format("~p:\n", [Mod]),
+ {Fs,_} = mapfoldl(fun(Fn, Lbl) -> function(Fn, Lbl) end, 100000000, Fs0),
+ {ok,{Mod,Exp,Attr,Fs,Lc}}.
+
+function({function,Name,Arity,CLabel,Is0}, Lbl0) ->
+ %%io:format("~p/~p:\n", [Name,Arity]),
+ {Is,#st{next=Lbl}} = bool_opt(Is0, Lbl0),
+ {{function,Name,Arity,CLabel,Is},Lbl}.
+
+%%
+%% Optimize boolean expressions that use guard bifs. Rewrite to
+%% use test instructions if possible.
+%%
+
+bool_opt(Asm, Lbl) ->
+ LiveInfo = index_instructions(Asm),
+ bopt(Asm, [], #st{next=Lbl,ll=LiveInfo}).
+
+bopt([{block,Bl0}=Block|
+ [{jump,{f,Succ}},
+ {label,Fail},
+ {block,[{set,[Dst],[{atom,false}],move},{'%live',Live}]},
+ {label,Succ}|Is]=Is0], Acc0, St) ->
+ case split_block(Bl0, Dst, Fail) of
+ failed ->
+ bopt(Is0, [Block|Acc0], St);
+ {Bl,PreBlock} ->
+ Acc1 = case PreBlock of
+ [] -> Acc0;
+ _ -> [{block,PreBlock}|Acc0]
+ end,
+ Acc = [{protected,[Dst],Bl,{Fail,Succ,Live}}|Acc1],
+ bopt(Is, Acc, St)
+ end;
+bopt([{test,is_eq_exact,{f,Fail},[Reg,{atom,true}]}=I|Is], [{block,_}|_]=Acc0, St0) ->
+ case bopt_block(Reg, Fail, Is, Acc0, St0) of
+ failed -> bopt(Is, [I|Acc0], St0);
+ {Acc,St} -> bopt(Is, Acc, St)
+ end;
+bopt([I|Is], Acc, St) ->
+ bopt(Is, [I|Acc], St);
+bopt([], Acc, St) ->
+ {bopt_reverse(Acc, []),St}.
+
+bopt_reverse([{protected,[Dst],Block,{Fail,Succ,Live}}|Is], Acc0) ->
+ Acc = [{block,Block},{jump,{f,Succ}},
+ {label,Fail},
+ {block,[{set,[Dst],[{atom,false}],move},{'%live',Live}]},
+ {label,Succ}|Acc0],
+ bopt_reverse(Is, Acc);
+bopt_reverse([I|Is], Acc) ->
+ bopt_reverse(Is, [I|Acc]);
+bopt_reverse([], Acc) -> Acc.
+
+%% bopt_block(Reg, Fail, OldIs, Accumulator, St) -> failed | {NewAcc,St}
+%% Attempt to optimized a block of guard BIFs followed by a test
+%% instruction.
+bopt_block(Reg, Fail, OldIs, [{block,Bl0}|Acc0], St0) ->
+ case split_block(Bl0, Reg, Fail) of
+ failed ->
+ %% Reason for failure: The block either contained no
+ %% guard BIFs with the failure label Fail, or the final
+ %% instruction in the block did not assign the Reg register.
+
+ %%io:format("split ~p: ~P\n", [Reg,Bl0,20]),
+ failed;
+ {Bl1,BlPre} ->
+ %% The block has been splitted. Bl1 is a non-empty list
+ %% of guard BIF instructions having the failure label Fail.
+ %% BlPre is a (possibly empty list) of instructions preceeding
+ %% Bl1.
+ Acc1 = make_block(BlPre, Acc0),
+ {Bl,Acc} = extend_block(Bl1, Fail, Acc1),
+ case catch bopt_block_1(Bl, Fail, St0) of
+ {'EXIT',_Reason} ->
+ %% Optimization failed for one of the following reasons:
+ %%
+ %% 1. Not possible to rewrite because a boolean value is
+ %% passed to another guard bif, e.g. 'abs(A > B)'
+ %% (in this case, obviously nonsense code). Rare in
+ %% practice.
+ %%
+ %% 2. Not possible to rewrite because we have not seen
+ %% the complete boolan expression (it is spread out
+ %% over several blocks with jumps and labels).
+ %% The 'or' and 'and' instructions need to that fully
+ %% known operands in order to be eliminated.
+ %%
+ %% 3. Other bug or limitation.
+
+ %%io:format("~P\n", [_Reason,20]),
+ failed;
+ {NewCode,St} ->
+ case is_opt_safe(Bl, NewCode, OldIs, St) of
+ false ->
+ %% The optimization is not safe. (A register
+ %% used by the instructions following the
+ %% optimized code is either not assigned a
+ %% value at all or assigned a different value.)
+
+ %%io:format("\nNot safe:\n"),
+ %%io:format("~p\n", [Bl]),
+ %%io:format("~p\n", [reverse(NewCode)]),
+ failed;
+ true -> {NewCode++Acc,St}
+ end
+ end
+ end.
+
+bopt_block_1(Block, Fail, St) ->
+ {Pre0,[{_,Tree}]} = bopt_tree(Block),
+ Pre = update_fail_label(Pre0, Fail, []),
+ bopt_cg(Tree, Fail, make_block(Pre, []), St).
+
+%% is_opt_safe(OriginalCode, OptCode, FollowingCode, State) -> true|false
+%% Comparing the original code to the optimized code, determine
+%% whether the optimized code is guaranteed to work in the same
+%% way as the original code.
+
+is_opt_safe(Bl, NewCode, OldIs, St) ->
+ %% Here are the conditions that must be true for the
+ %% optimization to be safe.
+ %%
+ %% 1. Any register that was assigned a value in the original
+ %% code, but is not in the optimized code, must be guaranteed
+ %% to be KILLED in the following code. (NotSet below.)
+ %%
+ %% 2. Any register that is assigned a value in the optimized
+ %% code must be UNUSED in the following code. (NewDst, Set.)
+ %% (Possible future improvement: Registers that are known
+ %% to be assigned the SAME value in the original and optimized
+ %% code don't need to be unused in the following code.)
+
+ PrevDst = dst_regs(Bl),
+ NewDst = dst_regs(NewCode),
+ NotSet = ordsets:subtract(PrevDst, NewDst),
+
+ %% Note: The following line is an optimization. We don't need
+ %% to test whether variables in NotSet for being unused, because
+ %% they will all be tested for being killed (a stronger condition
+ %% than being unused).
+
+ Set = ordsets:subtract(NewDst, NotSet),
+
+ all_killed(NotSet, OldIs, St) andalso
+ none_used(Set, OldIs, St).
+
+% update_fail_label([{set,_,_,{bif,_,{f,0}}}=I|Is], Fail, Acc) ->
+% update_fail_label(Is, Fail, [I|Acc]);
+update_fail_label([{set,Ds,As,{bif,N,{f,_}}}|Is], Fail, Acc) ->
+ update_fail_label(Is, Fail, [{set,Ds,As,{bif,N,{f,Fail}}}|Acc]);
+update_fail_label([], _, Acc) -> Acc.
+
+make_block([], Acc) -> Acc;
+make_block(Bl, Acc) -> [{block,Bl}|Acc].
+
+extend_block(BlAcc, Fail, [{protected,_,_,_}=Prot|OldAcc]) ->
+ extend_block([Prot|BlAcc], Fail, OldAcc);
+extend_block(BlAcc0, Fail, [{block,Is0}|OldAcc]=OldAcc0) ->
+ case extend_block_1(reverse(Is0), Fail, BlAcc0) of
+ {[],_} -> {BlAcc0,OldAcc0};
+ {BlAcc,[]} -> extend_block(BlAcc, Fail, OldAcc);
+ {BlAcc,Is} -> {BlAcc,[{block,Is}|OldAcc]}
+ end;
+extend_block(BlAcc, _, OldAcc) -> {BlAcc,OldAcc}.
+
+extend_block_1([{set,[_],_,{bif,_,{f,Fail}}}=I|Is], Fail, Acc) ->
+ extend_block_1(Is, Fail, [I|Acc]);
+extend_block_1([{set,[_],As,{bif,Bif,_}}=I|Is]=Is0, Fail, Acc) ->
+ case safe_bool_op(Bif, length(As)) of
+ false -> {Acc,reverse(Is0)};
+ true -> extend_block_1(Is, Fail, [I|Acc])
+ end;
+extend_block_1([_|_]=Is, _, Acc) -> {Acc,reverse(Is)};
+extend_block_1([], _, Acc) -> {Acc,[]}.
+
+split_block(Is0, Dst, Fail) ->
+ case reverse(Is0) of
+ [{'%live',_}|[{set,[Dst],_,_}|_]=Is] ->
+ split_block_1(Is, Fail);
+ [{set,[Dst],_,_}|_]=Is ->
+ split_block_1(Is, Fail);
+ _ -> failed
+ end.
+
+split_block_1(Is, Fail) ->
+ case split_block_2(Is, Fail, []) of
+ {[],_} -> failed;
+ {_,_}=Res -> Res
+ end.
+
+% split_block_2([{set,[_],_,{bif,_,{f,0}}}=I|Is], Fail, Acc) ->
+% split_block_2(Is, Fail, [I|Acc]);
+split_block_2([{set,[_],_,{bif,_,{f,Fail}}}=I|Is], Fail, Acc) ->
+ split_block_2(Is, Fail, [I|Acc]);
+split_block_2([{'%live',_}|Is], Fail, Acc) ->
+ split_block_2(Is, Fail, Acc);
+split_block_2(Is, _, Acc) -> {Acc,reverse(Is)}.
+
+dst_regs(Is) ->
+ dst_regs(Is, []).
+
+dst_regs([{block,Bl}|Is], Acc) ->
+ dst_regs(Bl, dst_regs(Is, Acc));
+dst_regs([{set,[D],_,{bif,_,{f,_}}}|Is], Acc) ->
+ dst_regs(Is, [D|Acc]);
+dst_regs([_|Is], Acc) ->
+ dst_regs(Is, Acc);
+dst_regs([], Acc) -> ordsets:from_list(Acc).
+
+all_killed([R|Rs], OldIs, St) ->
+ case is_killed(R, OldIs, St) of
+ false -> false;
+ true -> all_killed(Rs, OldIs, St)
+ end;
+all_killed([], _, _) -> true.
+
+none_used([R|Rs], OldIs, St) ->
+ case is_not_used(R, OldIs, St) of
+ false -> false;
+ true -> none_used(Rs, OldIs, St)
+ end;
+none_used([], _, _) -> true.
+
+bopt_tree(Block0) ->
+ Block = ssa_block(Block0),
+ Reg = free_variables(Block),
+ %%io:format("~p\n", [Block]),
+ %%io:format("~p\n", [Reg]),
+ Res = bopt_tree_1(Block, Reg, []),
+ %%io:format("~p\n", [Res]),
+ Res.
+
+bopt_tree_1([{set,[Dst],As0,{bif,'not',_}}|Is], Forest0, Pre) ->
+ {[Arg],Forest1} = bopt_bool_args(As0, Forest0),
+ Forest = gb_trees:enter(Dst, {'not',Arg}, Forest1),
+ bopt_tree_1(Is, Forest, Pre);
+bopt_tree_1([{set,[Dst],As0,{bif,'and',_}}|Is], Forest0, Pre) ->
+ {As,Forest1} = bopt_bool_args(As0, Forest0),
+ AndList = make_and_list(As),
+ Forest = gb_trees:enter(Dst, {'and',AndList}, Forest1),
+ bopt_tree_1(Is, Forest, Pre);
+bopt_tree_1([{set,[Dst],[L0,R0],{bif,'or',_}}|Is], Forest0, Pre) ->
+ L = gb_trees:get(L0, Forest0),
+ R = gb_trees:get(R0, Forest0),
+ Forest1 = gb_trees:delete(L0, gb_trees:delete(R0, Forest0)),
+ OrList = make_or_list([L,R]),
+ Forest = gb_trees:enter(Dst, {'or',OrList}, Forest1),
+ bopt_tree_1(Is, Forest, Pre);
+bopt_tree_1([{protected,[Dst],_,_}=Prot|Is], Forest0, Pre) ->
+ Forest = gb_trees:enter(Dst, Prot, Forest0),
+ bopt_tree_1(Is, Forest, Pre);
+bopt_tree_1([{set,[Dst],As,{bif,N,_}}=Bif|Is], Forest0, Pre) ->
+ Ar = length(As),
+ case safe_bool_op(N, Ar) of
+ false ->
+ bopt_good_args(As, Forest0),
+ Forest = gb_trees:enter(Dst, any, Forest0),
+ bopt_tree_1(Is, Forest, [Bif|Pre]);
+ true ->
+ bopt_good_args(As, Forest0),
+ Test = bif_to_test(Dst, N, As),
+ Forest = gb_trees:enter(Dst, Test, Forest0),
+ bopt_tree_1(Is, Forest, Pre)
+ end;
+bopt_tree_1([], Forest, Pre) ->
+ {Pre,[R || {_,V}=R <- gb_trees:to_list(Forest), V =/= any]}.
+
+safe_bool_op(internal_is_record, 3) -> true;
+safe_bool_op(N, Ar) ->
+ erl_internal:new_type_test(N, Ar) orelse erl_internal:comp_op(N, Ar).
+
+bopt_bool_args(As, Forest) ->
+ mapfoldl(fun bopt_bool_arg/2, Forest, As).
+
+bopt_bool_arg({T,_}=R, Forest) when T == x; T == y ->
+ {gb_trees:get(R, Forest),gb_trees:delete(R, Forest)};
+bopt_bool_arg(Term, Forest) ->
+ {Term,Forest}.
+
+bopt_good_args([A|As], Regs) ->
+ bopt_good_arg(A, Regs),
+ bopt_good_args(As, Regs);
+bopt_good_args([], _) -> ok.
+
+bopt_good_arg({x,_}=X, Regs) ->
+ case gb_trees:get(X, Regs) of
+ any -> ok;
+ _Other ->
+ %%io:format("not any: ~p: ~p\n", [X,_Other]),
+ exit(bad_contents)
+ end;
+bopt_good_arg(_, _) -> ok.
+
+bif_to_test(_, N, As) ->
+ bif_to_test(N, As).
+
+bif_to_test(internal_is_record, [_,_,_]=As) ->
+ {test,internal_is_record,fail,As};
+bif_to_test('=:=', As) -> {test,is_eq_exact,fail,As};
+bif_to_test('=/=', As) -> {test,is_ne_exact,fail,As};
+bif_to_test('==', As) -> {test,is_eq,fail,As};
+bif_to_test('/=', As) -> {test,is_ne,fail,As};
+bif_to_test('=<', [L,R]) -> {test,is_ge,fail,[R,L]};
+bif_to_test('>=', As) -> {test,is_ge,fail,As};
+bif_to_test('>', [L,R]) -> {test,is_lt,fail,[R,L]};
+bif_to_test('<', As) -> {test,is_lt,fail,As};
+bif_to_test(Name, [_]=As) ->
+ case erl_internal:new_type_test(Name, 1) of
+ false -> exit({bif_to_test,Name,As,failed});
+ true -> {test,Name,fail,As}
+ end.
+
+make_and_list([{'and',As}|Is]) ->
+ make_and_list(As++Is);
+make_and_list([I|Is]) ->
+ [I|make_and_list(Is)];
+make_and_list([]) -> [].
+
+make_or_list([{'or',As}|Is]) ->
+ make_or_list(As++Is);
+make_or_list([I|Is]) ->
+ [I|make_or_list(Is)];
+make_or_list([]) -> [].
+
+%% Code generation for a boolean tree.
+
+bopt_cg({'not',Arg}, Fail, Acc, St) ->
+ I = bopt_cg_not(Arg),
+ bopt_cg(I, Fail, Acc, St);
+bopt_cg({'and',As}, Fail, Acc, St) ->
+ bopt_cg_and(As, Fail, Acc, St);
+bopt_cg({'or',As}, Fail, Acc, St0) ->
+ {Succ,St} = new_label(St0),
+ bopt_cg_or(As, Succ, Fail, Acc, St);
+bopt_cg({test,is_tuple_element,fail,[Tmp,Tuple,RecordTag]}, Fail, Acc, St) ->
+ {[{test,is_eq_exact,{f,Fail},[Tmp,RecordTag]},
+ {get_tuple_element,Tuple,0,Tmp}|Acc],St};
+bopt_cg({inverted_test,is_tuple_element,fail,[Tmp,Tuple,RecordTag]}, Fail, Acc, St) ->
+ {[{test,is_ne_exact,{f,Fail},[Tmp,RecordTag]},
+ {get_tuple_element,Tuple,0,Tmp}|Acc],St};
+bopt_cg({test,N,fail,As}, Fail, Acc, St) ->
+ Test = {test,N,{f,Fail},As},
+ {[Test|Acc],St};
+bopt_cg({inverted_test,N,fail,As}, Fail, Acc, St0) ->
+ {Lbl,St} = new_label(St0),
+ {[{label,Lbl},{jump,{f,Fail}},{test,N,{f,Lbl},As}|Acc],St};
+bopt_cg({protected,_,Bl0,{_,_,_}}, Fail, Acc, St0) ->
+ {Bl,St} = bopt_block_1(Bl0, Fail, St0),
+ {Bl++Acc,St};
+bopt_cg([_|_]=And, Fail, Acc, St) ->
+ bopt_cg_and(And, Fail, Acc, St).
+
+bopt_cg_not({'and',As0}) ->
+ As = [bopt_cg_not(A) || A <- As0],
+ {'or',As};
+bopt_cg_not({'or',As0}) ->
+ As = [bopt_cg_not(A) || A <- As0],
+ {'and',As};
+bopt_cg_not({test,Test,Fail,As}) ->
+ {inverted_test,Test,Fail,As}.
+
+bopt_cg_and([{atom,false}|_], Fail, _, St) ->
+ {[{jump,{f,Fail}}],St};
+bopt_cg_and([{atom,true}|Is], Fail, Acc, St) ->
+ bopt_cg_and(Is, Fail, Acc, St);
+bopt_cg_and([I|Is], Fail, Acc0, St0) ->
+ {Acc,St} = bopt_cg(I, Fail, Acc0, St0),
+ bopt_cg_and(Is, Fail, Acc, St);
+bopt_cg_and([], _, Acc, St) -> {Acc,St}.
+
+bopt_cg_or([I], Succ, Fail, Acc0, St0) ->
+ {Acc,St} = bopt_cg(I, Fail, Acc0, St0),
+ {[{label,Succ}|Acc],St};
+bopt_cg_or([I|Is], Succ, Fail, Acc0, St0) ->
+ {Lbl,St1} = new_label(St0),
+ {Acc,St} = bopt_cg(I, Lbl, Acc0, St1),
+ bopt_cg_or(Is, Succ, Fail, [{label,Lbl},{jump,{f,Succ}}|Acc], St).
+
+new_label(#st{next=LabelNum}=St) when is_integer(LabelNum) ->
+ {LabelNum,St#st{next=LabelNum+1}}.
+
+free_variables(Is) ->
+ E = gb_sets:empty(),
+ free_vars_1(Is, E, E).
+
+free_vars_1([{set,[Dst],As,{bif,_,_}}|Is], F0, N0) ->
+ F = gb_sets:union(F0, gb_sets:difference(var_list(As), N0)),
+ N = gb_sets:union(N0, var_list([Dst])),
+ free_vars_1(Is, F, N);
+free_vars_1([{protected,_,Pa,_}|Is], F, N) ->
+ free_vars_1(Pa++Is, F, N);
+free_vars_1([], F, _) ->
+ gb_trees:from_orddict([{K,any} || K <- gb_sets:to_list(F)]).
+
+var_list(Is) ->
+ var_list_1(Is, gb_sets:empty()).
+
+var_list_1([{x,_}=X|Is], D) ->
+ var_list_1(Is, gb_sets:add(X, D));
+var_list_1([_|Is], D) ->
+ var_list_1(Is, D);
+var_list_1([], D) -> D.
+
+%%%
+%%% Convert a block to Static Single Assignment (SSA) form.
+%%%
+
+-record(ssa,
+ {live,
+ sub}).
+
+ssa_block(Is0) ->
+ Next = ssa_first_free(Is0, 0),
+ {Is,_} = ssa_block_1(Is0, #ssa{live=Next,sub=gb_trees:empty()}, []),
+ Is.
+
+ssa_block_1([{protected,[_],Pa0,Pb}|Is], Sub0, Acc) ->
+ {Pa,Sub} = ssa_block_1(Pa0, Sub0, []),
+ Dst = ssa_last_target(Pa),
+ ssa_block_1(Is, Sub, [{protected,[Dst],Pa,Pb}|Acc]);
+ssa_block_1([{set,[Dst],As,Bif}|Is], Sub0, Acc0) ->
+ Sub1 = ssa_in_use_list(As, Sub0),
+ Sub = ssa_assign(Dst, Sub1),
+ Acc = [{set,[ssa_sub(Dst, Sub)],ssa_sub_list(As, Sub0),Bif}|Acc0],
+ ssa_block_1(Is, Sub, Acc);
+ssa_block_1([], Sub, Acc) -> {reverse(Acc),Sub}.
+
+ssa_in_use_list(As, Sub) ->
+ foldl(fun ssa_in_use/2, Sub, As).
+
+ssa_in_use({x,_}=R, #ssa{sub=Sub0}=Ssa) ->
+ case gb_trees:is_defined(R, Sub0) of
+ true -> Ssa;
+ false ->
+ Sub = gb_trees:insert(R, R, Sub0),
+ Ssa#ssa{sub=Sub}
+ end;
+ssa_in_use(_, Ssa) -> Ssa.
+
+ssa_assign({x,_}=R, #ssa{sub=Sub0}=Ssa0) ->
+ case gb_trees:is_defined(R, Sub0) of
+ false ->
+ Sub = gb_trees:insert(R, R, Sub0),
+ Ssa0#ssa{sub=Sub};
+ true ->
+ {NewReg,Ssa} = ssa_new_reg(Ssa0),
+ Sub1 = gb_trees:update(R, NewReg, Sub0),
+ Sub = gb_trees:insert(NewReg, NewReg, Sub1),
+ Ssa#ssa{sub=Sub}
+ end;
+ssa_assign(_, Ssa) -> Ssa.
+
+ssa_sub_list(List, Sub) ->
+ [ssa_sub(E, Sub) || E <- List].
+
+ssa_sub(R0, #ssa{sub=Sub}) ->
+ case gb_trees:lookup(R0, Sub) of
+ none -> R0;
+ {value,R} -> R
+ end.
+
+ssa_new_reg(#ssa{live=Reg}=Ssa) ->
+ {{x,Reg},Ssa#ssa{live=Reg+1}}.
+
+ssa_first_free([{protected,Ds,_,_}|Is], Next0) ->
+ Next = ssa_first_free_list(Ds, Next0),
+ ssa_first_free(Is, Next);
+ssa_first_free([{set,[Dst],As,_}|Is], Next0) ->
+ Next = ssa_first_free_list([Dst|As], Next0),
+ ssa_first_free(Is, Next);
+ssa_first_free([], Next) -> Next.
+
+ssa_first_free_list(Regs, Next) ->
+ foldl(fun({x,R}, N) when R >= N -> R+1;
+ (_, N) -> N end, Next, Regs).
+
+ssa_last_target([{set,[Dst],_,_},{'%live',_}]) -> Dst;
+ssa_last_target([{set,[Dst],_,_}]) -> Dst;
+ssa_last_target([_|Is]) -> ssa_last_target(Is).
+
+%% index_instructions(FunctionIs) -> GbTree([{Label,Is}])
+%% Index the instruction sequence so that we can quickly
+%% look up the instruction following a specific label.
+
+index_instructions(Is) ->
+ ii_1(Is, []).
+
+ii_1([{label,Lbl}|Is0], Acc) ->
+ Is = lists:dropwhile(fun({label,_}) -> true;
+ (_) -> false end, Is0),
+ ii_1(Is0, [{Lbl,Is}|Acc]);
+ii_1([_|Is], Acc) ->
+ ii_1(Is, Acc);
+ii_1([], Acc) -> gb_trees:from_orddict(sort(Acc)).
+
+%% is_killed(Register, [Instruction], State) -> true|false
+%% Determine whether a register is killed in the instruction sequence.
+%% The state is used to allow us to determine the kill state
+%% across branches.
+
+is_killed(R, Is, St) ->
+ case is_killed_1(R, Is, St) of
+ false ->
+ %%io:format("nk ~p: ~P\n", [R,Is,15]),
+ false;
+ true -> true
+ end.
+
+is_killed_1(R, [{block,Blk}|Is], St) ->
+ case is_killed_1(R, Blk, St) of
+ true -> true;
+ false -> is_killed_1(R, Is, St)
+ end;
+is_killed_1(R, [{test,_,{f,Fail},As}|Is], St) ->
+ case not member(R, As) andalso is_reg_killed_at(R, Fail, St) of
+ false -> false;
+ true -> is_killed_1(R, Is, St)
+ end;
+is_killed_1(R, [{select_val,R,_,_}|_], _) -> false;
+is_killed_1(R, [{select_val,_,Fail,{list,Branches}}|_], St) ->
+ is_killed_at_all(R, [Fail|Branches], St);
+is_killed_1(R, [{jump,{f,F}}|_], St) ->
+ is_reg_killed_at(R, F, St);
+is_killed_1(Reg, Is, _) ->
+ beam_block:is_killed(Reg, Is).
+
+is_reg_killed_at(R, Lbl, #st{ll=Ll}=St) ->
+ Is = gb_trees:get(Lbl, Ll),
+ is_killed_1(R, Is, St).
+
+is_killed_at_all(R, [{f,Lbl}|T], St) ->
+ case is_reg_killed_at(R, Lbl, St) of
+ false -> false;
+ true -> is_killed_at_all(R, T, St)
+ end;
+is_killed_at_all(R, [_|T], St) ->
+ is_killed_at_all(R, T, St);
+is_killed_at_all(_, [], _) -> true.
+
+%% is_not_used(Register, [Instruction], State) -> true|false
+%% Determine whether a register is never used in the instruction sequence
+%% (it could still referenced by an allocate instruction, meaning that
+%% it MUST be initialized).
+%% The state is used to allow us to determine the usage state
+%% across branches.
+
+is_not_used(R, Is, St) ->
+ case is_not_used_1(R, Is, St) of
+ false ->
+ %%io:format("used ~p: ~P\n", [R,Is,15]),
+ false;
+ true -> true
+ end.
+
+is_not_used_1(R, [{block,Blk}|Is], St) ->
+ case is_not_used_1(R, Blk, St) of
+ true -> true;
+ false -> is_not_used_1(R, Is, St)
+ end;
+is_not_used_1(R, [{test,_,{f,Fail},As}|Is], St) ->
+ case not member(R, As) andalso is_reg_not_used_at(R, Fail, St) of
+ false -> false;
+ true -> is_not_used_1(R, Is, St)
+ end;
+is_not_used_1(R, [{select_val,R,_,_}|_], _) -> false;
+is_not_used_1(R, [{select_val,_,Fail,{list,Branches}}|_], St) ->
+ is_used_at_none(R, [Fail|Branches], St);
+is_not_used_1(R, [{jump,{f,F}}|_], St) ->
+ is_reg_not_used_at(R, F, St);
+is_not_used_1(Reg, Is, _) ->
+ beam_block:is_not_used(Reg, Is).
+
+is_reg_not_used_at(R, Lbl, #st{ll=Ll}=St) ->
+ Is = gb_trees:get(Lbl, Ll),
+ is_not_used_1(R, Is, St).
+
+is_used_at_none(R, [{f,Lbl}|T], St) ->
+ case is_reg_not_used_at(R, Lbl, St) of
+ false -> false;
+ true -> is_used_at_none(R, T, St)
+ end;
+is_used_at_none(R, [_|T], St) ->
+ is_used_at_none(R, T, St);
+is_used_at_none(_, [], _) -> true.
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_clean.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_clean.erl
new file mode 100644
index 0000000000..04225e9bd0
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_clean.erl
@@ -0,0 +1,232 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: beam_clean.erl,v 1.1 2008/12/17 09:53:41 mikpe Exp $
+%%
+%% Purpose : Clean up, such as removing unused labels and unused functions.
+
+-module(beam_clean).
+
+-export([module/2]).
+-import(lists, [member/2,map/2,foldl/3,mapfoldl/3,reverse/1]).
+
+module({Mod,Exp,Attr,Fs0,_}, _Opt) ->
+ Order = [Lbl || {function,_,_,Lbl,_} <- Fs0],
+ All = foldl(fun({function,_,_,Lbl,_}=Func,D) -> dict:store(Lbl, Func, D) end,
+ dict:new(), Fs0),
+ {WorkList,Used0} = exp_to_labels(Fs0, Exp),
+ Used = find_all_used(WorkList, All, Used0),
+ Fs1 = remove_unused(Order, Used, All),
+ {Fs,Lc} = clean_labels(Fs1),
+ {ok,{Mod,Exp,Attr,Fs,Lc}}.
+
+%% Convert the export list ({Name,Arity} pairs) to a list of entry labels.
+
+exp_to_labels(Fs, Exp) -> exp_to_labels(Fs, Exp, [], sets:new()).
+
+exp_to_labels([{function,Name,Arity,Lbl,_}|Fs], Exp, Acc, Used) ->
+ case member({Name,Arity}, Exp) of
+ true -> exp_to_labels(Fs, Exp, [Lbl|Acc], sets:add_element(Lbl, Used));
+ false -> exp_to_labels(Fs, Exp, Acc, Used)
+ end;
+exp_to_labels([], _, Acc, Used) -> {Acc,Used}.
+
+%% Remove the unused functions.
+
+remove_unused([F|Fs], Used, All) ->
+ case sets:is_element(F, Used) of
+ false -> remove_unused(Fs, Used, All);
+ true -> [dict:fetch(F, All)|remove_unused(Fs, Used, All)]
+ end;
+remove_unused([], _, _) -> [].
+
+%% Find all used functions.
+
+find_all_used([F|Fs0], All, Used0) ->
+ {function,_,_,_,Code} = dict:fetch(F, All),
+ {Fs,Used} = update_work_list(Code, {Fs0,Used0}),
+ find_all_used(Fs, All, Used);
+find_all_used([], _All, Used) -> Used.
+
+update_work_list([{call,_,{f,L}}|Is], Sets) ->
+ update_work_list(Is, add_to_work_list(L, Sets));
+update_work_list([{call_last,_,{f,L},_}|Is], Sets) ->
+ update_work_list(Is, add_to_work_list(L, Sets));
+update_work_list([{call_only,_,{f,L}}|Is], Sets) ->
+ update_work_list(Is, add_to_work_list(L, Sets));
+update_work_list([{make_fun,{f,L},_,_}|Is], Sets) ->
+ update_work_list(Is, add_to_work_list(L, Sets));
+update_work_list([{make_fun2,{f,L},_,_,_}|Is], Sets) ->
+ update_work_list(Is, add_to_work_list(L, Sets));
+update_work_list([_|Is], Sets) ->
+ update_work_list(Is, Sets);
+update_work_list([], Sets) -> Sets.
+
+add_to_work_list(F, {Fs,Used}=Sets) ->
+ case sets:is_element(F, Used) of
+ true -> Sets;
+ false -> {[F|Fs],sets:add_element(F, Used)}
+ end.
+
+
+%%%
+%%% Coalesce adjacent labels. Renumber all labels to eliminate gaps.
+%%% This cleanup will slightly reduce file size and slightly speed up loading.
+%%%
+%%% We also expand internal_is_record/3 to a sequence of instructions. It is done
+%%% here merely because this module will always be called even if optimization
+%%% is turned off. We don't want to do the expansion in beam_asm because we
+%%% want to see the expanded code in a .S file.
+%%%
+
+-record(st, {lmap, %Translation tables for labels.
+ entry, %Number of entry label.
+ lc %Label counter
+ }).
+
+clean_labels(Fs0) ->
+ St0 = #st{lmap=dict:new(),lc=1},
+ {Fs1,#st{lmap=Lmap,lc=Lc}} = mapfoldl(fun function_renumber/2, St0, Fs0),
+ {map(fun(F) -> function_replace(F, Lmap) end, Fs1),Lc}.
+
+function_renumber({function,Name,Arity,_Entry,Asm0}, St0) ->
+ {Asm,St} = renumber_labels(Asm0, [], St0),
+ {{function,Name,Arity,St#st.entry,Asm},St}.
+
+renumber_labels([{bif,internal_is_record,{f,_},
+ [Term,Tag,{integer,Arity}],Dst}|Is], Acc, St) ->
+ ContLabel = 900000000+2*St#st.lc,
+ FailLabel = ContLabel+1,
+ Fail = {f,FailLabel},
+ Tmp = Dst,
+ renumber_labels([{test,is_tuple,Fail,[Term]},
+ {test,test_arity,Fail,[Term,Arity]},
+ {get_tuple_element,Term,0,Tmp},
+ {test,is_eq_exact,Fail,[Tmp,Tag]},
+ {move,{atom,true},Dst},
+ {jump,{f,ContLabel}},
+ {label,FailLabel},
+ {move,{atom,false},Dst},
+ {label,ContLabel}|Is], Acc, St);
+renumber_labels([{test,internal_is_record,{f,_}=Fail,
+ [Term,Tag,{integer,Arity}]}|Is], Acc, St) ->
+ Tmp = {x,1023},
+ case Term of
+ {Reg,_} when Reg == x; Reg == y ->
+ renumber_labels([{test,is_tuple,Fail,[Term]},
+ {test,test_arity,Fail,[Term,Arity]},
+ {get_tuple_element,Term,0,Tmp},
+ {test,is_eq_exact,Fail,[Tmp,Tag]}|Is], Acc, St);
+ _ ->
+ renumber_labels([{jump,Fail}|Is], Acc, St)
+ end;
+renumber_labels([{label,Old}|Is], [{label,New}|_]=Acc, #st{lmap=D0}=St) ->
+ D = dict:store(Old, New, D0),
+ renumber_labels(Is, Acc, St#st{lmap=D});
+renumber_labels([{label,Old}|Is], Acc, St0) ->
+ New = St0#st.lc,
+ D = dict:store(Old, New, St0#st.lmap),
+ renumber_labels(Is, [{label,New}|Acc], St0#st{lmap=D,lc=New+1});
+renumber_labels([{func_info,_,_,_}=Fi|Is], Acc, St0) ->
+ renumber_labels(Is, [Fi|Acc], St0#st{entry=St0#st.lc});
+renumber_labels([I|Is], Acc, St0) ->
+ renumber_labels(Is, [I|Acc], St0);
+renumber_labels([], Acc, St0) -> {Acc,St0}.
+
+function_replace({function,Name,Arity,Entry,Asm0}, Dict) ->
+ Asm = case catch replace(Asm0, [], Dict) of
+ {'EXIT',_}=Reason ->
+ exit(Reason);
+ {error,{undefined_label,Lbl}=Reason} ->
+ io:format("Function ~s/~w refers to undefined label ~w\n",
+ [Name,Arity,Lbl]),
+ exit(Reason);
+ Asm1 when list(Asm1) -> Asm1
+ end,
+ {function,Name,Arity,Entry,Asm}.
+
+replace([{test,Test,{f,Lbl},Ops}|Is], Acc, D) ->
+ replace(Is, [{test,Test,{f,label(Lbl, D)},Ops}|Acc], D);
+replace([{select_val,R,{f,Fail0},{list,Vls0}}|Is], Acc, D) ->
+ Vls1 = map(fun ({f,L}) -> {f,label(L, D)};
+ (Other) -> Other end, Vls0),
+ Fail = label(Fail0, D),
+ case redundant_values(Vls1, Fail, []) of
+ [] ->
+ %% Oops, no choices left. The loader will not accept that.
+ %% Convert to a plain jump.
+ replace(Is, [{jump,{f,Fail}}|Acc], D);
+ Vls ->
+ replace(Is, [{select_val,R,{f,Fail},{list,Vls}}|Acc], D)
+ end;
+replace([{select_tuple_arity,R,{f,Fail},{list,Vls0}}|Is], Acc, D) ->
+ Vls = map(fun ({f,L}) -> {f,label(L, D)};
+ (Other) -> Other end, Vls0),
+ replace(Is, [{select_tuple_arity,R,{f,label(Fail, D)},{list,Vls}}|Acc], D);
+replace([{'try',R,{f,Lbl}}|Is], Acc, D) ->
+ replace(Is, [{'try',R,{f,label(Lbl, D)}}|Acc], D);
+replace([{'catch',R,{f,Lbl}}|Is], Acc, D) ->
+ replace(Is, [{'catch',R,{f,label(Lbl, D)}}|Acc], D);
+replace([{jump,{f,Lbl}}|Is], Acc, D) ->
+ replace(Is, [{jump,{f,label(Lbl, D)}}|Acc], D);
+replace([{loop_rec,{f,Lbl},R}|Is], Acc, D) ->
+ replace(Is, [{loop_rec,{f,label(Lbl, D)},R}|Acc], D);
+replace([{loop_rec_end,{f,Lbl}}|Is], Acc, D) ->
+ replace(Is, [{loop_rec_end,{f,label(Lbl, D)}}|Acc], D);
+replace([{wait,{f,Lbl}}|Is], Acc, D) ->
+ replace(Is, [{wait,{f,label(Lbl, D)}}|Acc], D);
+replace([{wait_timeout,{f,Lbl},To}|Is], Acc, D) ->
+ replace(Is, [{wait_timeout,{f,label(Lbl, D)},To}|Acc], D);
+replace([{bif,Name,{f,Lbl},As,R}|Is], Acc, D) when Lbl =/= 0 ->
+ replace(Is, [{bif,Name,{f,label(Lbl, D)},As,R}|Acc], D);
+replace([{call,Ar,{f,Lbl}}|Is], Acc, D) ->
+ replace(Is, [{call,Ar,{f,label(Lbl,D)}}|Acc], D);
+replace([{call_last,Ar,{f,Lbl},N}|Is], Acc, D) ->
+ replace(Is, [{call_last,Ar,{f,label(Lbl,D)},N}|Acc], D);
+replace([{call_only,Ar,{f,Lbl}}|Is], Acc, D) ->
+ replace(Is, [{call_only,Ar,{f,label(Lbl, D)}}|Acc], D);
+replace([{make_fun,{f,Lbl},U1,U2}|Is], Acc, D) ->
+ replace(Is, [{make_fun,{f,label(Lbl, D)},U1,U2}|Acc], D);
+replace([{make_fun2,{f,Lbl},U1,U2,U3}|Is], Acc, D) ->
+ replace(Is, [{make_fun2,{f,label(Lbl, D)},U1,U2,U3}|Acc], D);
+replace([{bs_init2,{f,Lbl},Sz,Words,R,F,Dst}|Is], Acc, D) when Lbl =/= 0 ->
+ replace(Is, [{bs_init2,{f,label(Lbl, D)},Sz,Words,R,F,Dst}|Acc], D);
+replace([{bs_put_integer,{f,Lbl},Bits,Unit,Fl,Val}|Is], Acc, D) when Lbl =/= 0 ->
+ replace(Is, [{bs_put_integer,{f,label(Lbl, D)},Bits,Unit,Fl,Val}|Acc], D);
+replace([{bs_put_binary,{f,Lbl},Bits,Unit,Fl,Val}|Is], Acc, D) when Lbl =/= 0 ->
+ replace(Is, [{bs_put_binary,{f,label(Lbl, D)},Bits,Unit,Fl,Val}|Acc], D);
+replace([{bs_put_float,{f,Lbl},Bits,Unit,Fl,Val}|Is], Acc, D) when Lbl =/= 0 ->
+ replace(Is, [{bs_put_float,{f,label(Lbl, D)},Bits,Unit,Fl,Val}|Acc], D);
+replace([{bs_final,{f,Lbl},R}|Is], Acc, D) when Lbl =/= 0 ->
+ replace(Is, [{bs_final,{f,label(Lbl, D)},R}|Acc], D);
+replace([{bs_add,{f,Lbl},Src,Dst}|Is], Acc, D) when Lbl =/= 0 ->
+ replace(Is, [{bs_add,{f,label(Lbl, D)},Src,Dst}|Acc], D);
+replace([{bs_bits_to_bytes,{f,Lbl},Bits,Dst}|Is], Acc, D) when Lbl =/= 0 ->
+ replace(Is, [{bs_bits_to_bytes,{f,label(Lbl, D)},Bits,Dst}|Acc], D);
+replace([I|Is], Acc, D) ->
+ replace(Is, [I|Acc], D);
+replace([], Acc, _) -> Acc.
+
+label(Old, D) ->
+ case dict:find(Old, D) of
+ {ok,Val} -> Val;
+ error -> throw({error,{undefined_label,Old}})
+ end.
+
+redundant_values([_,{f,Fail}|Vls], Fail, Acc) ->
+ redundant_values(Vls, Fail, Acc);
+redundant_values([Val,Lbl|Vls], Fail, Acc) ->
+ redundant_values(Vls, Fail, [Lbl,Val|Acc]);
+redundant_values([], _, Acc) -> reverse(Acc).
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_dict.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_dict.erl
new file mode 100644
index 0000000000..08eca2fc00
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_dict.erl
@@ -0,0 +1,196 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: beam_dict.erl,v 1.1 2008/12/17 09:53:41 mikpe Exp $
+%%
+%% Purpose : Maintain atom, import, and export tables for assembler.
+
+-module(beam_dict).
+
+-export([new/0, opcode/2, highest_opcode/1,
+ atom/2, local/4, export/4, import/4, string/2, lambda/5,
+ atom_table/1, local_table/1, export_table/1, import_table/1,
+ string_table/1,lambda_table/1]).
+
+-record(asm_dict,
+ {atoms = [], % [{Index, Atom}]
+ exports = [], % [{F, A, Label}]
+ locals = [], % [{F, A, Label}]
+ imports = [], % [{Index, {M, F, A}]
+ strings = [], % Deep list of characters
+ lambdas = [], % [{...}]
+ next_atom = 1,
+ next_import = 0,
+ string_offset = 0,
+ highest_opcode = 0
+ }).
+
+new() ->
+ #asm_dict{}.
+
+%% Remembers highest opcode.
+
+opcode(Op, Dict) when Dict#asm_dict.highest_opcode > Op -> Dict;
+opcode(Op, Dict) -> Dict#asm_dict{highest_opcode=Op}.
+
+%% Returns the highest opcode encountered.
+
+highest_opcode(#asm_dict{highest_opcode=Op}) -> Op.
+
+%% Returns the index for an atom (adding it to the atom table if necessary).
+%% atom(Atom, Dict) -> {Index, Dict'}
+
+atom(Atom, Dict) when atom(Atom) ->
+ NextIndex = Dict#asm_dict.next_atom,
+ case lookup_store(Atom, Dict#asm_dict.atoms, NextIndex) of
+ {Index, _, NextIndex} ->
+ {Index, Dict};
+ {Index, Atoms, NewIndex} ->
+ {Index, Dict#asm_dict{atoms=Atoms, next_atom=NewIndex}}
+ end.
+
+%% Remembers an exported function.
+%% export(Func, Arity, Label, Dict) -> Dict'
+
+export(Func, Arity, Label, Dict0) when atom(Func), integer(Arity), integer(Label) ->
+ {Index, Dict1} = atom(Func, Dict0),
+ Dict1#asm_dict{exports = [{Index, Arity, Label}| Dict1#asm_dict.exports]}.
+
+%% Remembers a local function.
+%% local(Func, Arity, Label, Dict) -> Dict'
+
+local(Func, Arity, Label, Dict0) when atom(Func), integer(Arity), integer(Label) ->
+ {Index,Dict1} = atom(Func, Dict0),
+ Dict1#asm_dict{locals = [{Index,Arity,Label}| Dict1#asm_dict.locals]}.
+
+%% Returns the index for an import entry (adding it to the import table if necessary).
+%% import(Mod, Func, Arity, Dict) -> {Index, Dict'}
+
+import(Mod, Func, Arity, Dict) when atom(Mod), atom(Func), integer(Arity) ->
+ NextIndex = Dict#asm_dict.next_import,
+ case lookup_store({Mod, Func, Arity}, Dict#asm_dict.imports, NextIndex) of
+ {Index, _, NextIndex} ->
+ {Index, Dict};
+ {Index, Imports, NewIndex} ->
+ {_, D1} = atom(Mod, Dict#asm_dict{imports=Imports, next_import=NewIndex}),
+ {_, D2} = atom(Func, D1),
+ {Index, D2}
+ end.
+
+%% Returns the index for a string in the string table (adding the string to the
+%% table if necessary).
+%% string(String, Dict) -> {Offset, Dict'}
+
+string(Str, Dict) when list(Str) ->
+ #asm_dict{strings = Strings, string_offset = NextOffset} = Dict,
+ case old_string(Str, Strings) of
+ {true, Offset} ->
+ {Offset, Dict};
+ false ->
+ NewDict = Dict#asm_dict{strings = Strings++Str,
+ string_offset = NextOffset+length(Str)},
+ {NextOffset, NewDict}
+ end.
+
+%% Returns the index for a funentry (adding it to the table if necessary).
+%% lambda(Dict, Lbl, Index, Uniq, NumFree) -> {Index,Dict'}
+
+lambda(Lbl, Index, OldUniq, NumFree, #asm_dict{lambdas=Lambdas0}=Dict) ->
+ OldIndex = length(Lambdas0),
+ Lambdas = [{Lbl,{OldIndex,Lbl,Index,NumFree,OldUniq}}|Lambdas0],
+ {OldIndex,Dict#asm_dict{lambdas=Lambdas}}.
+
+%% Returns the atom table.
+%% atom_table(Dict) -> [Length,AtomString...]
+
+atom_table(#asm_dict{atoms=Atoms, next_atom=NumAtoms}) ->
+ Sorted = lists:sort(Atoms),
+ Fun = fun({_, A}) ->
+ L = atom_to_list(A),
+ [length(L)|L]
+ end,
+ {NumAtoms-1, lists:map(Fun, Sorted)}.
+
+%% Returns the table of local functions.
+%% local_table(Dict) -> {NumLocals, [{Function, Arity, Label}...]}
+
+local_table(#asm_dict{locals = Locals}) ->
+ {length(Locals),Locals}.
+
+%% Returns the export table.
+%% export_table(Dict) -> {NumExports, [{Function, Arity, Label}...]}
+
+export_table(#asm_dict{exports = Exports}) ->
+ {length(Exports), Exports}.
+
+%% Returns the import table.
+%% import_table(Dict) -> {NumImports, [{Module, Function, Arity}...]}
+
+import_table(Dict) ->
+ #asm_dict{imports = Imports, next_import = NumImports} = Dict,
+ Sorted = lists:sort(Imports),
+ Fun = fun({_, {Mod, Func, Arity}}) ->
+ {Atom0, _} = atom(Mod, Dict),
+ {Atom1, _} = atom(Func, Dict),
+ {Atom0, Atom1, Arity}
+ end,
+ {NumImports, lists:map(Fun, Sorted)}.
+
+string_table(#asm_dict{strings = Strings, string_offset = Size}) ->
+ {Size, Strings}.
+
+lambda_table(#asm_dict{locals=Loc0,lambdas=Lambdas0}) ->
+ Lambdas1 = sofs:relation(Lambdas0),
+ Loc = sofs:relation([{Lbl,{F,A}} || {F,A,Lbl} <- Loc0]),
+ Lambdas2 = sofs:relative_product1(Lambdas1, Loc),
+ Lambdas = [<<F:32,A:32,Lbl:32,Index:32,NumFree:32,OldUniq:32>> ||
+ {{_,Lbl,Index,NumFree,OldUniq},{F,A}} <- sofs:to_external(Lambdas2)],
+ {length(Lambdas),Lambdas}.
+
+%%% Local helper functions.
+
+lookup_store(Key, Dict, NextIndex) ->
+ case catch lookup_store1(Key, Dict, NextIndex) of
+ Index when integer(Index) ->
+ {Index, Dict, NextIndex};
+ {Index, NewDict} ->
+ {Index, NewDict, NextIndex+1}
+ end.
+
+lookup_store1(Key, [Pair|Dict], NextIndex) when Key > element(2, Pair) ->
+ {Index, NewDict} = lookup_store1(Key, Dict, NextIndex),
+ {Index, [Pair|NewDict]};
+lookup_store1(Key, [{Index, Key}|_Dict], _NextIndex) ->
+ throw(Index);
+lookup_store1(Key, Dict, NextIndex) ->
+ {NextIndex, [{NextIndex, Key}|Dict]}.
+
+%% Search for string Str in the string pool Pool.
+%% old_string(Str, Pool) -> false | {true, Offset}
+
+old_string(Str, Pool) ->
+ old_string(Str, Pool, 0).
+
+old_string([C|Str], [C|Pool], Index) ->
+ case lists:prefix(Str, Pool) of
+ true ->
+ {true, Index};
+ false ->
+ old_string([C|Str], Pool, Index+1)
+ end;
+old_string(Str, [_|Pool], Index) ->
+ old_string(Str, Pool, Index+1);
+old_string(_Str, [], _Index) ->
+ false.
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_disasm.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_disasm.erl
new file mode 100644
index 0000000000..0108f91b7f
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_disasm.erl
@@ -0,0 +1,964 @@
+%% -*- erlang-indent-level: 4 -*-
+%%=======================================================================
+%% File : beam_disasm.erl
+%% Author : Kostis Sagonas
+%% Description : Disassembles an R5-R10 .beam file into symbolic BEAM code
+%%=======================================================================
+%% $Id: beam_disasm.erl,v 1.1 2008/12/17 09:53:41 mikpe Exp $
+%%=======================================================================
+%% Notes:
+%% 1. It does NOT work for .beam files of previous BEAM versions.
+%% 2. If handling of new BEAM instructions is needed, this should be
+%% inserted at the end of function resolve_inst().
+%%=======================================================================
+
+-module(beam_disasm).
+
+-export([file/1, format_error/1]).
+
+-author("Kostis Sagonas").
+
+-include("beam_opcodes.hrl").
+
+%%-----------------------------------------------------------------------
+
+-define(NO_DEBUG(Str,Xs),ok).
+-define(DEBUG(Str,Xs),io:format(Str,Xs)).
+-define(exit(Reason),exit({?MODULE,?LINE,Reason})).
+
+%%-----------------------------------------------------------------------
+%% Error information
+
+format_error({error, Module, Error}) ->
+ Module:format_error(Error);
+format_error({internal, Error}) ->
+ io_lib:format("~p: disassembly failed with reason ~P.",
+ [?MODULE, Error, 25]).
+
+%%-----------------------------------------------------------------------
+%% The main exported function
+%% File is either a file name or a binary containing the code.
+%% Returns `{beam_file, [...]}' or `{error, Module, Reason}'.
+%% Call `format_error({error, Module, Reason})' for an error string.
+%%-----------------------------------------------------------------------
+
+file(File) ->
+ case beam_lib:info(File) of
+ Info when list(Info) ->
+ {value,{chunks,Chunks}} = lists:keysearch(chunks,1,Info),
+ case catch process_chunks(File, Chunks) of
+ {'EXIT', Error} ->
+ {error, ?MODULE, {internal, Error}};
+ Result ->
+ Result
+ end;
+ Error ->
+ Error
+ end.
+
+%%-----------------------------------------------------------------------
+%% Interface might need to be revised -- do not depend on it.
+%%-----------------------------------------------------------------------
+
+process_chunks(F,ChunkInfoList) ->
+ {ok,{_,Chunks}} = beam_lib:chunks(F, ["Atom","Code","StrT","ImpT","ExpT"]),
+ [{"Atom",AtomBin},{"Code",CodeBin},{"StrT",StrBin},
+ {"ImpT",ImpBin},{"ExpT",ExpBin}] = Chunks,
+ LambdaBin = optional_chunk(F, "FunT", ChunkInfoList),
+ LocBin = optional_chunk(F, "LocT", ChunkInfoList),
+ AttrBin = optional_chunk(F, "Attr", ChunkInfoList),
+ CompBin = optional_chunk(F, "CInf", ChunkInfoList),
+ Atoms = beam_disasm_atoms(AtomBin),
+ Exports = beam_disasm_exports(ExpBin, Atoms),
+ Imports = beam_disasm_imports(ImpBin, Atoms),
+ LocFuns = beam_disasm_exports(LocBin, Atoms),
+ Lambdas = beam_disasm_lambdas(LambdaBin, Atoms),
+ Str = beam_disasm_strings(StrBin),
+ Str1 = binary_to_list(Str), %% for debugging -- use Str as far as poss.
+ Sym_Code = beam_disasm_code(CodeBin,Atoms,Imports,Str,Lambdas),
+ Attributes = beam_disasm_attributes(AttrBin),
+ CompInfo = beam_disasm_compilation_info(CompBin),
+ All = [{exports,Exports},
+ {imports,Imports},
+ {code,Sym_Code},
+ {atoms,Atoms},
+ {local_funs,LocFuns},
+ {strings,Str1},
+ {attributes,Attributes},
+ {comp_info,CompInfo}],
+ {beam_file,[Item || {_Key,Data}=Item <- All, Data =/= none]}.
+
+%%-----------------------------------------------------------------------
+%% Retrieve an optional chunk or none if the chunk doesn't exist.
+%%-----------------------------------------------------------------------
+
+optional_chunk(F, ChunkTag, ChunkInfo) ->
+ case lists:keymember(ChunkTag, 1, ChunkInfo) of
+ true ->
+ {ok,{_,[{ChunkTag,Chunk}]}} = beam_lib:chunks(F, [ChunkTag]),
+ Chunk;
+ false -> none
+ end.
+
+%%-----------------------------------------------------------------------
+%% UTILITIES -- these actually exist in file "beam_lib"
+%% -- they should be moved into a common utils file.
+%%-----------------------------------------------------------------------
+
+i32([X1,X2,X3,X4]) ->
+ (X1 bsl 24) bor (X2 bsl 16) bor (X3 bsl 8) bor X4.
+
+get_int(B) ->
+ {I, B1} = split_binary(B, 4),
+ {i32(binary_to_list(I)), B1}.
+
+%%-----------------------------------------------------------------------
+%% Disassembles the atom table of a BEAM file.
+%% - atoms are stored in order 1 ... N (N = Num_atoms, in fact),
+%% - each atom name consists of a length byte, followed by that many
+%% bytes of name
+%% (nb: atom names max 255 chars?!)
+%%-----------------------------------------------------------------------
+
+beam_disasm_atoms(AtomTabBin) ->
+ {_NumAtoms,B} = get_int(AtomTabBin),
+ disasm_atoms(B).
+
+disasm_atoms(AtomBin) ->
+ disasm_atoms(binary_to_list(AtomBin),1).
+
+disasm_atoms([Len|Xs],N) ->
+ {AtomName,Rest} = get_atom_name(Len,Xs),
+ [{N,list_to_atom(AtomName)}|disasm_atoms(Rest,N+1)];
+disasm_atoms([],_) ->
+ [].
+
+get_atom_name(Len,Xs) ->
+ get_atom_name(Len,Xs,[]).
+
+get_atom_name(N,[X|Xs],RevName) when N > 0 ->
+ get_atom_name(N-1,Xs,[X|RevName]);
+get_atom_name(0,Xs,RevName) ->
+ { lists:reverse(RevName), Xs }.
+
+%%-----------------------------------------------------------------------
+%% Disassembles the export table of a BEAM file.
+%%-----------------------------------------------------------------------
+
+beam_disasm_exports(none, _) -> none;
+beam_disasm_exports(ExpTabBin, Atoms) ->
+ {_NumAtoms,B} = get_int(ExpTabBin),
+ disasm_exports(B,Atoms).
+
+disasm_exports(Bin,Atoms) ->
+ resolve_exports(collect_exports(binary_to_list(Bin)),Atoms).
+
+collect_exports([F3,F2,F1,F0,A3,A2,A1,A0,L3,L2,L1,L0|Exps]) ->
+ [{i32([F3,F2,F1,F0]), % F = function (atom ID)
+ i32([A3,A2,A1,A0]), % A = arity (int)
+ i32([L3,L2,L1,L0])} % L = label (int)
+ |collect_exports(Exps)];
+collect_exports([]) ->
+ [].
+
+resolve_exports(Exps,Atoms) ->
+ [ {lookup_key(F,Atoms), A, L} || {F,A,L} <- Exps ].
+
+%%-----------------------------------------------------------------------
+%% Disassembles the import table of a BEAM file.
+%%-----------------------------------------------------------------------
+
+beam_disasm_imports(ExpTabBin,Atoms) ->
+ {_NumAtoms,B} = get_int(ExpTabBin),
+ disasm_imports(B,Atoms).
+
+disasm_imports(Bin,Atoms) ->
+ resolve_imports(collect_imports(binary_to_list(Bin)),Atoms).
+
+collect_imports([M3,M2,M1,M0,F3,F2,F1,F0,A3,A2,A1,A0|Exps]) ->
+ [{i32([M3,M2,M1,M0]), % M = module (atom ID)
+ i32([F3,F2,F1,F0]), % F = function (atom ID)
+ i32([A3,A2,A1,A0])} % A = arity (int)
+ |collect_imports(Exps)];
+collect_imports([]) ->
+ [].
+
+resolve_imports(Exps,Atoms) ->
+ [{extfunc,lookup_key(M,Atoms),lookup_key(F,Atoms),A} || {M,F,A} <- Exps ].
+
+%%-----------------------------------------------------------------------
+%% Disassembles the lambda (fun) table of a BEAM file.
+%%-----------------------------------------------------------------------
+
+beam_disasm_lambdas(none, _) -> none;
+beam_disasm_lambdas(<<_:32,Tab/binary>>, Atoms) ->
+ disasm_lambdas(Tab, Atoms, 0).
+
+disasm_lambdas(<<F:32,A:32,Lbl:32,Index:32,NumFree:32,OldUniq:32,More/binary>>,
+ Atoms, OldIndex) ->
+ Info = {lookup_key(F, Atoms),A,Lbl,Index,NumFree,OldUniq},
+ [{OldIndex,Info}|disasm_lambdas(More, Atoms, OldIndex+1)];
+disasm_lambdas(<<>>, _, _) -> [].
+
+%%-----------------------------------------------------------------------
+%% Disassembles the code chunk of a BEAM file:
+%% - The code is first disassembled into a long list of instructions.
+%% - This list is then split into functions and all names are resolved.
+%%-----------------------------------------------------------------------
+
+beam_disasm_code(CodeBin,Atoms,Imports,Str,Lambdas) ->
+ [_SS3,_SS2,_SS1,_SS0, % Sub-Size (length of information before code)
+ _IS3,_IS2,_IS1,_IS0, % Instruction Set Identifier (always 0)
+ _OM3,_OM2,_OM1,_OM0, % Opcode Max
+ _L3,_L2,_L1,_L0,_F3,_F2,_F1,_F0|Code] = binary_to_list(CodeBin),
+ case catch disasm_code(Code, Atoms) of
+ {'EXIT',Rsn} ->
+ ?NO_DEBUG('code disasm failed: ~p~n',[Rsn]),
+ ?exit(Rsn);
+ DisasmCode ->
+ Functions = get_function_chunks(DisasmCode),
+ LocLabels = local_labels(Functions),
+ [resolve_names(F,Imports,Str,LocLabels,Lambdas) || F <- Functions]
+ end.
+
+%%-----------------------------------------------------------------------
+
+disasm_code([B|Bs], Atoms) ->
+ {Instr,RestBs} = disasm_instr(B, Bs, Atoms),
+ [Instr|disasm_code(RestBs, Atoms)];
+disasm_code([], _) -> [].
+
+%%-----------------------------------------------------------------------
+%% Splits the code stream into chunks representing the code of functions.
+%%
+%% NOTE: code actually looks like
+%% label L1: ... label Ln:
+%% func_info ...
+%% label entry:
+%% ...
+%% <on failure, use label Li to show where things died>
+%% ...
+%% So the labels before each func_info should be included as well.
+%% Ideally, only one such label is needed, but the BEAM compiler
+%% before R8 didn't care to remove the redundant ones.
+%%-----------------------------------------------------------------------
+
+get_function_chunks([I|Code]) ->
+ {LastI,RestCode,Labs} = split_head_labels(I,Code,[]),
+ get_funs(LastI,RestCode,Labs,[]);
+get_function_chunks([]) ->
+ ?exit(empty_code_segment).
+
+get_funs(PrevI,[I|Is],RevF,RevFs) ->
+ case I of
+ {func_info,_Info} ->
+ [H|T] = RevF,
+ {Last,Fun,TrailingLabels} = split_head_labels(H,T,[]),
+ get_funs(I, Is, [PrevI|TrailingLabels], add_funs([Last|Fun],RevFs));
+ _ ->
+ get_funs(I, Is, [PrevI|RevF], RevFs)
+ end;
+get_funs(PrevI,[],RevF,RevFs) ->
+ case PrevI of
+ {int_code_end,[]} ->
+ emit_funs(add_fun(RevF,RevFs));
+ _ ->
+ ?DEBUG('warning: code segment did not end with int_code_end~n',[]),
+ emit_funs(add_funs([PrevI|RevF],RevFs))
+ end.
+
+split_head_labels({label,L},[I|Code],Labs) ->
+ split_head_labels(I,Code,[{label,L}|Labs]);
+split_head_labels(I,Code,Labs) ->
+ {I,Code,Labs}.
+
+add_fun([],Fs) ->
+ Fs;
+add_fun(F,Fs) ->
+ add_funs(F,Fs).
+
+add_funs(F,Fs) ->
+ [ lists:reverse(F) | Fs ].
+
+emit_funs(Fs) ->
+ lists:reverse(Fs).
+
+%%-----------------------------------------------------------------------
+%% Collects local labels -- I am not sure this is 100% what is needed.
+%%-----------------------------------------------------------------------
+
+local_labels(Funs) ->
+ [local_label(Fun) || Fun <- Funs].
+
+%% The first clause below attempts to provide some (limited form of)
+%% backwards compatibility; it is not needed for .beam files generated
+%% by the R8 compiler. The clause should one fine day be taken out.
+local_label([{label,_},{label,L}|Code]) ->
+ local_label([{label,L}|Code]);
+local_label([{label,_},
+ {func_info,[M0,F0,{u,A}]},
+ {label,[{u,L1}]}|_]) ->
+ {atom,M} = resolve_arg(M0),
+ {atom,F} = resolve_arg(F0),
+ {L1, {M, F, A}};
+local_label(Code) ->
+ io:format('beam_disasm: no label in ~p~n', [Code]),
+ {-666,{none,none,0}}.
+
+%%-----------------------------------------------------------------------
+%% Disassembles a single BEAM instruction; most instructions are handled
+%% in a generic way; indexing instructions are handled separately.
+%%-----------------------------------------------------------------------
+
+disasm_instr(B, Bs, Atoms) ->
+ {SymOp,Arity} = beam_opcodes:opname(B),
+ case SymOp of
+ select_val ->
+ disasm_select_inst(select_val, Bs, Atoms);
+ select_tuple_arity ->
+ disasm_select_inst(select_tuple_arity, Bs, Atoms);
+ _ ->
+ case catch decode_n_args(Arity, Bs, Atoms) of
+ {'EXIT',Rsn} ->
+ ?NO_DEBUG("decode_n_args(~p,~p) failed~n",[Arity,Bs]),
+ {{'EXIT',{SymOp,Arity,Rsn}},[]};
+ {Args,RestBs} ->
+ ?NO_DEBUG("instr ~p~n",[{SymOp,Args}]),
+ {{SymOp,Args}, RestBs}
+ end
+ end.
+
+%%-----------------------------------------------------------------------
+%% Disassembles a BEAM select_* instruction used for indexing.
+%% Currently handles {select_val,3} and {select_tuple_arity,3} insts.
+%%
+%% The arruments of a "select"-type instruction look as follows:
+%% <reg>, {f,FailLabel}, {list, <num cases>, [<case1> ... <caseN>]}
+%% where each case is of the form [symbol,{f,Label}].
+%%-----------------------------------------------------------------------
+
+disasm_select_inst(Inst, Bs, Atoms) ->
+ {X, Bs1} = decode_arg(Bs, Atoms),
+ {F, Bs2} = decode_arg(Bs1, Atoms),
+ {Z, Bs3} = decode_arg(Bs2, Atoms),
+ {U, Bs4} = decode_arg(Bs3, Atoms),
+ {u,Len} = U,
+ {List, RestBs} = decode_n_args(Len, Bs4, Atoms),
+ {{Inst,[X,F,{Z,U,List}]},RestBs}.
+
+%%-----------------------------------------------------------------------
+%% decode_arg([Byte]) -> { Arg, [Byte] }
+%%
+%% - an arg can have variable length, so we must return arg + remaining bytes
+%% - decodes an argument into its 'raw' form: { Tag, Value }
+%% several types map to a single tag, so the byte code instr must then
+%% assign a type to it
+%%-----------------------------------------------------------------------
+
+decode_arg([B|Bs]) ->
+ Tag = decode_tag(B band 2#111),
+ ?NO_DEBUG('Tag = ~p, B = ~p, Bs = ~p~n',[Tag,B,Bs]),
+ case Tag of
+ z ->
+ decode_z_tagged(Tag, B, Bs);
+ _ ->
+ %% all other cases are handled as if they were integers
+ decode_int(Tag, B, Bs)
+ end.
+
+decode_arg([B|Bs0], Atoms) ->
+ Tag = decode_tag(B band 2#111),
+ ?NO_DEBUG('Tag = ~p, B = ~p, Bs = ~p~n',[Tag,B,Bs]),
+ case Tag of
+ z ->
+ decode_z_tagged(Tag, B, Bs0);
+ a ->
+ %% atom or nil
+ case decode_int(Tag, B, Bs0) of
+ {{a,0},Bs} -> {nil,Bs};
+ {{a,I},Bs} -> {{atom,lookup_key(I, Atoms)},Bs}
+ end;
+ _ ->
+ %% all other cases are handled as if they were integers
+ decode_int(Tag, B, Bs0)
+ end.
+
+%%-----------------------------------------------------------------------
+%% Decodes an integer value. Handles positives, negatives, and bignums.
+%%
+%% Tries to do the opposite of:
+%% beam_asm:encode(1, 5) = [81]
+%% beam_asm:encode(1, 1000) = [105,232]
+%% beam_asm:encode(1, 2047) = [233,255]
+%% beam_asm:encode(1, 2048) = [25,8,0]
+%% beam_asm:encode(1,-1) = [25,255,255]
+%% beam_asm:encode(1,-4294967295) = [121,255,0,0,0,1]
+%% beam_asm:encode(1, 4294967295) = [121,0,255,255,255,255]
+%% beam_asm:encode(1, 429496729501) = [121,99,255,255,255,157]
+%%-----------------------------------------------------------------------
+
+decode_int(Tag,B,Bs) when (B band 16#08) == 0 ->
+ %% N < 16 = 4 bits, NNNN:0:TTT
+ N = B bsr 4,
+ {{Tag,N},Bs};
+decode_int(Tag,B,Bs) when (B band 16#10) == 0 ->
+ %% N < 2048 = 11 bits = 3:8 bits, NNN:01:TTT, NNNNNNNN
+ [B1|Bs1] = Bs,
+ Val0 = B band 2#11100000,
+ N = (Val0 bsl 3) bor B1,
+ ?NO_DEBUG('NNN:01:TTT, NNNNNNNN = ~n~p:01:~p, ~p = ~p~n', [Val0,Tag,B,N]),
+ {{Tag,N},Bs1};
+decode_int(Tag,B,Bs) ->
+ {Len,Bs1} = decode_int_length(B,Bs),
+ {IntBs,RemBs} = take_bytes(Len,Bs1),
+ N = build_arg(IntBs),
+ [F|_] = IntBs,
+ Num = if F > 127, Tag == i -> decode_negative(N,Len);
+ true -> N
+ end,
+ ?NO_DEBUG('Len = ~p, IntBs = ~p, Num = ~p~n', [Len,IntBs,Num]),
+ {{Tag,Num},RemBs}.
+
+decode_int_length(B,Bs) ->
+ %% The following imitates get_erlang_integer() in beam_load.c
+ %% Len is the size of the integer value in bytes
+ case B bsr 5 of
+ 7 ->
+ {Arg,ArgBs} = decode_arg(Bs),
+ case Arg of
+ {u,L} ->
+ {L+9,ArgBs}; % 9 stands for 7+2
+ _ ->
+ ?exit({decode_int,weird_bignum_sublength,Arg})
+ end;
+ L ->
+ {L+2,Bs}
+ end.
+
+decode_negative(N,Len) ->
+ N - (1 bsl (Len*8)). % 8 is number of bits in a byte
+
+%%-----------------------------------------------------------------------
+%% Decodes lists and floating point numbers.
+%%-----------------------------------------------------------------------
+
+decode_z_tagged(Tag,B,Bs) when (B band 16#08) == 0 ->
+ N = B bsr 4,
+ case N of
+ 0 -> % float
+ decode_float(Bs);
+ 1 -> % list
+ {{Tag,N},Bs};
+ 2 -> % fr
+ decode_fr(Bs);
+ 3 -> % allocation list
+ decode_alloc_list(Bs);
+ _ ->
+ ?exit({decode_z_tagged,{invalid_extended_tag,N}})
+ end;
+decode_z_tagged(_,B,_) ->
+ ?exit({decode_z_tagged,{weird_value,B}}).
+
+decode_float(Bs) ->
+ {FL,RestBs} = take_bytes(8,Bs),
+ <<Float:64/float>> = list_to_binary(FL),
+ {{float,Float},RestBs}.
+
+decode_fr(Bs) ->
+ {{u,Fr},RestBs} = decode_arg(Bs),
+ {{fr,Fr},RestBs}.
+
+decode_alloc_list(Bs) ->
+ {{u,N},RestBs} = decode_arg(Bs),
+ decode_alloc_list_1(N, RestBs, []).
+
+decode_alloc_list_1(0, RestBs, Acc) ->
+ {{u,{alloc,lists:reverse(Acc)}},RestBs};
+decode_alloc_list_1(N, Bs0, Acc) ->
+ {{u,Type},Bs1} = decode_arg(Bs0),
+ {{u,Val},Bs} = decode_arg(Bs1),
+ case Type of
+ 0 ->
+ decode_alloc_list_1(N-1, Bs, [{words,Val}|Acc]);
+ 1 ->
+ decode_alloc_list_1(N-1, Bs, [{floats,Val}|Acc])
+ end.
+
+%%-----------------------------------------------------------------------
+%% take N bytes from a stream, return { Taken_bytes, Remaining_bytes }
+%%-----------------------------------------------------------------------
+
+take_bytes(N,Bs) ->
+ take_bytes(N,Bs,[]).
+
+take_bytes(N,[B|Bs],Acc) when N > 0 ->
+ take_bytes(N-1,Bs,[B|Acc]);
+take_bytes(0,Bs,Acc) ->
+ { lists:reverse(Acc), Bs }.
+
+%%-----------------------------------------------------------------------
+%% from a list of bytes Bn,Bn-1,...,B1,B0
+%% build (Bn << 8*n) bor ... bor B1 << 8 bor B0 << 0
+%%-----------------------------------------------------------------------
+
+build_arg(Bs) ->
+ build_arg(Bs,0).
+
+build_arg([B|Bs],N) ->
+ build_arg(Bs, (N bsl 8) bor B);
+build_arg([],N) ->
+ N.
+
+%%-----------------------------------------------------------------------
+%% Decodes a bunch of arguments and returns them in a list
+%%-----------------------------------------------------------------------
+
+decode_n_args(N, Bs, Atoms) when N >= 0 ->
+ decode_n_args(N, [], Bs, Atoms).
+
+decode_n_args(N, Acc, Bs0, Atoms) when N > 0 ->
+ {A1,Bs} = decode_arg(Bs0, Atoms),
+ decode_n_args(N-1, [A1|Acc], Bs, Atoms);
+decode_n_args(0, Acc, Bs, _) ->
+ {lists:reverse(Acc),Bs}.
+
+%%-----------------------------------------------------------------------
+%% Convert a numeric tag value into a symbolic one
+%%-----------------------------------------------------------------------
+
+decode_tag(?tag_u) -> u;
+decode_tag(?tag_i) -> i;
+decode_tag(?tag_a) -> a;
+decode_tag(?tag_x) -> x;
+decode_tag(?tag_y) -> y;
+decode_tag(?tag_f) -> f;
+decode_tag(?tag_h) -> h;
+decode_tag(?tag_z) -> z;
+decode_tag(X) -> ?exit({unknown_tag,X}).
+
+%%-----------------------------------------------------------------------
+%% - replace all references {a,I} with the atom with index I (or {atom,A})
+%% - replace all references to {i,K} in an external call position with
+%% the proper MFA (position in list, first elt = 0, yields MFA to use)
+%% - resolve strings, represented as <offset, length>, into their
+%% actual values by using string table
+%% (note: string table should be passed as a BINARY so that we can
+%% use binary_to_list/3!)
+%% - convert instruction to its readable form ...
+%%
+%% Currently, only the first three are done (systematically, at least).
+%%
+%% Note: It MAY be premature to remove the lists of args, since that
+%% representation means it is simpler to iterate over all args, etc.
+%%-----------------------------------------------------------------------
+
+resolve_names(Fun, Imports, Str, Lbls, Lambdas) ->
+ [resolve_inst(Instr, Imports, Str, Lbls, Lambdas) || Instr <- Fun].
+
+%%
+%% New make_fun2/4 instruction added in August 2001 (R8).
+%% We handle it specially here to avoid adding an argument to
+%% the clause for every instruction.
+%%
+
+resolve_inst({make_fun2,Args},_,_,Lbls,Lambdas) ->
+ [OldIndex] = resolve_args(Args),
+ {value,{OldIndex,{F,A,_Lbl,_Index,NumFree,OldUniq}}} =
+ lists:keysearch(OldIndex, 1, Lambdas),
+ [{_,{M,_,_}}|_] = Lbls, % Slighly kludgy.
+ {make_fun2,{M,F,A},OldIndex,OldUniq,NumFree};
+resolve_inst(Instr, Imports, Str, Lbls, _Lambdas) ->
+ resolve_inst(Instr, Imports, Str, Lbls).
+
+resolve_inst({label,[{u,L}]},_,_,_) ->
+ {label,L};
+resolve_inst({func_info,RawMFA},_,_,_) ->
+ {func_info,resolve_args(RawMFA)};
+% resolve_inst(int_code_end,_,_,_,_) -> % instruction already handled
+% int_code_end; % should not really be handled here
+resolve_inst({call,[{u,N},{f,L}]},_,_,Lbls) ->
+ {call,N,catch lookup_key(L,Lbls)};
+resolve_inst({call_last,[{u,N},{f,L},{u,U}]},_,_,Lbls) ->
+ {call_last,N,catch lookup_key(L,Lbls),U};
+resolve_inst({call_only,[{u,N},{f,L}]},_,_,Lbls) ->
+ {call_only,N,catch lookup_key(L,Lbls)};
+resolve_inst({call_ext,[{u,N},{u,MFAix}]},Imports,_,_) ->
+ {call_ext,N,catch lists:nth(MFAix+1,Imports)};
+resolve_inst({call_ext_last,[{u,N},{u,MFAix},{u,X}]},Imports,_,_) ->
+ {call_ext_last,N,catch lists:nth(MFAix+1,Imports),X};
+resolve_inst({bif0,Args},Imports,_,_) ->
+ [Bif,Reg] = resolve_args(Args),
+ {extfunc,_Mod,BifName,_Arity} = lists:nth(Bif+1,Imports),
+ %?NO_DEBUG('bif0(~p, ~p)~n',[BifName,Reg]),
+ {bif,BifName,nofail,[],Reg};
+resolve_inst({bif1,Args},Imports,_,_) ->
+ [F,Bif,A1,Reg] = resolve_args(Args),
+ {extfunc,_Mod,BifName,_Arity} = lists:nth(Bif+1,Imports),
+ %?NO_DEBUG('bif1(~p, ~p, ~p, ~p, ~p)~n',[Bif,BifName,F,[A1],Reg]),
+ {bif,BifName,F,[A1],Reg};
+resolve_inst({bif2,Args},Imports,_,_) ->
+ [F,Bif,A1,A2,Reg] = resolve_args(Args),
+ {extfunc,_Mod,BifName,_Arity} = lists:nth(Bif+1,Imports),
+ %?NO_DEBUG('bif2(~p, ~p, ~p, ~p, ~p)~n',[Bif,BifName,F,[A1,A2],Reg]),
+ {bif,BifName,F,[A1,A2],Reg};
+resolve_inst({allocate,[{u,X0},{u,X1}]},_,_,_) ->
+ {allocate,X0,X1};
+resolve_inst({allocate_heap,[{u,X0},{u,X1},{u,X2}]},_,_,_) ->
+ {allocate_heap,X0,X1,X2};
+resolve_inst({allocate_zero,[{u,X0},{u,X1}]},_,_,_) ->
+ {allocate_zero,X0,X1};
+resolve_inst({allocate_heap_zero,[{u,X0},{u,X1},{u,X2}]},_,_,_) ->
+ {allocate_heap_zero,X0,X1,X2};
+resolve_inst({test_heap,[{u,X0},{u,X1}]},_,_,_) ->
+ {test_heap,X0,X1};
+resolve_inst({init,[Dst]},_,_,_) ->
+ {init,Dst};
+resolve_inst({deallocate,[{u,L}]},_,_,_) ->
+ {deallocate,L};
+resolve_inst({return,[]},_,_,_) ->
+ return;
+resolve_inst({send,[]},_,_,_) ->
+ send;
+resolve_inst({remove_message,[]},_,_,_) ->
+ remove_message;
+resolve_inst({timeout,[]},_,_,_) ->
+ timeout;
+resolve_inst({loop_rec,[Lbl,Dst]},_,_,_) ->
+ {loop_rec,Lbl,Dst};
+resolve_inst({loop_rec_end,[Lbl]},_,_,_) ->
+ {loop_rec_end,Lbl};
+resolve_inst({wait,[Lbl]},_,_,_) ->
+ {wait,Lbl};
+resolve_inst({wait_timeout,[Lbl,Int]},_,_,_) ->
+ {wait_timeout,Lbl,resolve_arg(Int)};
+resolve_inst({m_plus,Args},_,_,_) ->
+ [W,SrcR1,SrcR2,DstR] = resolve_args(Args),
+ {arithbif,'+',W,[SrcR1,SrcR2],DstR};
+resolve_inst({m_minus,Args},_,_,_) ->
+ [W,SrcR1,SrcR2,DstR] = resolve_args(Args),
+ {arithbif,'-',W,[SrcR1,SrcR2],DstR};
+resolve_inst({m_times,Args},_,_,_) ->
+ [W,SrcR1,SrcR2,DstR] = resolve_args(Args),
+ {arithbif,'*',W,[SrcR1,SrcR2],DstR};
+resolve_inst({m_div,Args},_,_,_) ->
+ [W,SrcR1,SrcR2,DstR] = resolve_args(Args),
+ {arithbif,'/',W,[SrcR1,SrcR2],DstR};
+resolve_inst({int_div,Args},_,_,_) ->
+ [W,SrcR1,SrcR2,DstR] = resolve_args(Args),
+ {arithbif,'div',W,[SrcR1,SrcR2],DstR};
+resolve_inst({int_rem,Args},_,_,_) ->
+ [W,SrcR1,SrcR2,DstR] = resolve_args(Args),
+ {arithbif,'rem',W,[SrcR1,SrcR2],DstR};
+resolve_inst({int_band,Args},_,_,_) ->
+ [W,SrcR1,SrcR2,DstR] = resolve_args(Args),
+ {arithbif,'band',W,[SrcR1,SrcR2],DstR};
+resolve_inst({int_bor,Args},_,_,_) ->
+ [W,SrcR1,SrcR2,DstR] = resolve_args(Args),
+ {arithbif,'bor',W,[SrcR1,SrcR2],DstR};
+resolve_inst({int_bxor,Args},_,_,_) ->
+ [W,SrcR1,SrcR2,DstR] = resolve_args(Args),
+ {arithbif,'bxor',W,[SrcR1,SrcR2],DstR};
+resolve_inst({int_bsl,Args},_,_,_) ->
+ [W,SrcR1,SrcR2,DstR] = resolve_args(Args),
+ {arithbif,'bsl',W,[SrcR1,SrcR2],DstR};
+resolve_inst({int_bsr,Args},_,_,_) ->
+ [W,SrcR1,SrcR2,DstR] = resolve_args(Args),
+ {arithbif,'bsr',W,[SrcR1,SrcR2],DstR};
+resolve_inst({int_bnot,Args},_,_,_) ->
+ [W,SrcR,DstR] = resolve_args(Args),
+ {arithbif,'bnot',W,[SrcR],DstR};
+resolve_inst({is_lt=I,Args0},_,_,_) ->
+ [L|Args] = resolve_args(Args0),
+ {test,I,L,Args};
+resolve_inst({is_ge=I,Args0},_,_,_) ->
+ [L|Args] = resolve_args(Args0),
+ {test,I,L,Args};
+resolve_inst({is_eq=I,Args0},_,_,_) ->
+ [L|Args] = resolve_args(Args0),
+ {test,I,L,Args};
+resolve_inst({is_ne=I,Args0},_,_,_) ->
+ [L|Args] = resolve_args(Args0),
+ {test,I,L,Args};
+resolve_inst({is_eq_exact=I,Args0},_,_,_) ->
+ [L|Args] = resolve_args(Args0),
+ {test,I,L,Args};
+resolve_inst({is_ne_exact=I,Args0},_,_,_) ->
+ [L|Args] = resolve_args(Args0),
+ {test,I,L,Args};
+resolve_inst({is_integer=I,Args0},_,_,_) ->
+ [L|Args] = resolve_args(Args0),
+ {test,I,L,Args};
+resolve_inst({is_float=I,Args0},_,_,_) ->
+ [L|Args] = resolve_args(Args0),
+ {test,I,L,Args};
+resolve_inst({is_number=I,Args0},_,_,_) ->
+ [L|Args] = resolve_args(Args0),
+ {test,I,L,Args};
+resolve_inst({is_atom=I,Args0},_,_,_) ->
+ [L|Args] = resolve_args(Args0),
+ {test,I,L,Args};
+resolve_inst({is_pid=I,Args0},_,_,_) ->
+ [L|Args] = resolve_args(Args0),
+ {test,I,L,Args};
+resolve_inst({is_reference=I,Args0},_,_,_) ->
+ [L|Args] = resolve_args(Args0),
+ {test,I,L,Args};
+resolve_inst({is_port=I,Args0},_,_,_) ->
+ [L|Args] = resolve_args(Args0),
+ {test,I,L,Args};
+resolve_inst({is_nil=I,Args0},_,_,_) ->
+ [L|Args] = resolve_args(Args0),
+ {test,I,L,Args};
+resolve_inst({is_binary=I,Args0},_,_,_) ->
+ [L|Args] = resolve_args(Args0),
+ {test,I,L,Args};
+resolve_inst({is_constant=I,Args0},_,_,_) ->
+ [L|Args] = resolve_args(Args0),
+ {test,I,L,Args};
+resolve_inst({is_list=I,Args0},_,_,_) ->
+ [L|Args] = resolve_args(Args0),
+ {test,I,L,Args};
+resolve_inst({is_nonempty_list=I,Args0},_,_,_) ->
+ [L|Args] = resolve_args(Args0),
+ {test,I,L,Args};
+resolve_inst({is_tuple=I,Args0},_,_,_) ->
+ [L|Args] = resolve_args(Args0),
+ {test,I,L,Args};
+resolve_inst({test_arity=I,Args0},_,_,_) ->
+ [L|Args] = resolve_args(Args0),
+ {test,I,L,Args};
+resolve_inst({select_val,Args},_,_,_) ->
+ [Reg,FLbl,{{z,1},{u,_Len},List0}] = Args,
+ List = resolve_args(List0),
+ {select_val,Reg,FLbl,{list,List}};
+resolve_inst({select_tuple_arity,Args},_,_,_) ->
+ [Reg,FLbl,{{z,1},{u,_Len},List0}] = Args,
+ List = resolve_args(List0),
+ {select_tuple_arity,Reg,FLbl,{list,List}};
+resolve_inst({jump,[Lbl]},_,_,_) ->
+ {jump,Lbl};
+resolve_inst({'catch',[Dst,Lbl]},_,_,_) ->
+ {'catch',Dst,Lbl};
+resolve_inst({catch_end,[Dst]},_,_,_) ->
+ {catch_end,Dst};
+resolve_inst({move,[Src,Dst]},_,_,_) ->
+ {move,resolve_arg(Src),Dst};
+resolve_inst({get_list,[Src,Dst1,Dst2]},_,_,_) ->
+ {get_list,Src,Dst1,Dst2};
+resolve_inst({get_tuple_element,[Src,{u,Off},Dst]},_,_,_) ->
+ {get_tuple_element,resolve_arg(Src),Off,resolve_arg(Dst)};
+resolve_inst({set_tuple_element,[Src,Dst,{u,Off}]},_,_,_) ->
+ {set_tuple_element,resolve_arg(Src),resolve_arg(Dst),Off};
+resolve_inst({put_string,[{u,Len},{u,Off},Dst]},_,Strings,_) ->
+ String = if Len > 0 -> binary_to_list(Strings, Off+1, Off+Len);
+ true -> ""
+ end,
+?NO_DEBUG('put_string(~p, {string,~p}, ~p)~n',[Len,String,Dst]),
+ {put_string,Len,{string,String},Dst};
+resolve_inst({put_list,[Src1,Src2,Dst]},_,_,_) ->
+ {put_list,resolve_arg(Src1),resolve_arg(Src2),Dst};
+resolve_inst({put_tuple,[{u,Arity},Dst]},_,_,_) ->
+ {put_tuple,Arity,Dst};
+resolve_inst({put,[Src]},_,_,_) ->
+ {put,resolve_arg(Src)};
+resolve_inst({badmatch,[X]},_,_,_) ->
+ {badmatch,resolve_arg(X)};
+resolve_inst({if_end,[]},_,_,_) ->
+ if_end;
+resolve_inst({case_end,[X]},_,_,_) ->
+ {case_end,resolve_arg(X)};
+resolve_inst({call_fun,[{u,N}]},_,_,_) ->
+ {call_fun,N};
+resolve_inst({make_fun,Args},_,_,Lbls) ->
+ [{f,L},Magic,FreeVars] = resolve_args(Args),
+ {make_fun,catch lookup_key(L,Lbls),Magic,FreeVars};
+resolve_inst({is_function=I,Args0},_,_,_) ->
+ [L|Args] = resolve_args(Args0),
+ {test,I,L,Args};
+resolve_inst({call_ext_only,[{u,N},{u,MFAix}]},Imports,_,_) ->
+ {call_ext_only,N,catch lists:nth(MFAix+1,Imports)};
+%%
+%% Instructions for handling binaries added in R7A & R7B
+%%
+resolve_inst({bs_start_match,[F,Reg]},_,_,_) ->
+ {bs_start_match,F,Reg};
+resolve_inst({bs_get_integer=I,[Lbl,Arg2,{u,N},{u,U},Arg5]},_,_,_) ->
+ [A2,A5] = resolve_args([Arg2,Arg5]),
+ {test,I,Lbl,[A2,N,decode_field_flags(U),A5]};
+resolve_inst({bs_get_float=I,[Lbl,Arg2,{u,N},{u,U},Arg5]},_,_,_) ->
+ [A2,A5] = resolve_args([Arg2,Arg5]),
+ {test,I,Lbl,[A2,N,decode_field_flags(U),A5]};
+resolve_inst({bs_get_binary=I,[Lbl,Arg2,{u,N},{u,U},Arg5]},_,_,_) ->
+ [A2,A5] = resolve_args([Arg2,Arg5]),
+ {test,I,Lbl,[A2,N,decode_field_flags(U),A5]};
+resolve_inst({bs_skip_bits,[Lbl,Arg2,{u,N},{u,U}]},_,_,_) ->
+ [A2] = resolve_args([Arg2]),
+ {test,bs_skip_bits,Lbl,[A2,N,decode_field_flags(U)]};
+resolve_inst({bs_test_tail,[F,{u,N}]},_,_,_) ->
+ {test,bs_test_tail,F,[N]};
+resolve_inst({bs_save,[{u,N}]},_,_,_) ->
+ {bs_save,N};
+resolve_inst({bs_restore,[{u,N}]},_,_,_) ->
+ {bs_restore,N};
+resolve_inst({bs_init,[{u,N},{u,U}]},_,_,_) ->
+ {bs_init,N,decode_field_flags(U)};
+resolve_inst({bs_final,[F,X]},_,_,_) ->
+ {bs_final,F,X};
+resolve_inst({bs_put_integer,[Lbl,Arg2,{u,N},{u,U},Arg5]},_,_,_) ->
+ [A2,A5] = resolve_args([Arg2,Arg5]),
+ {bs_put_integer,Lbl,A2,N,decode_field_flags(U),A5};
+resolve_inst({bs_put_binary,[Lbl,Arg2,{u,N},{u,U},Arg5]},_,_,_) ->
+ [A2,A5] = resolve_args([Arg2,Arg5]),
+ ?NO_DEBUG('bs_put_binary(~p,~p,~p,~p,~p})~n',[Lbl,A2,N,U,A5]),
+ {bs_put_binary,Lbl,A2,N,decode_field_flags(U),A5};
+resolve_inst({bs_put_float,[Lbl,Arg2,{u,N},{u,U},Arg5]},_,_,_) ->
+ [A2,A5] = resolve_args([Arg2,Arg5]),
+ ?NO_DEBUG('bs_put_float(~p,~p,~p,~p,~p})~n',[Lbl,A2,N,U,A5]),
+ {bs_put_float,Lbl,A2,N,decode_field_flags(U),A5};
+resolve_inst({bs_put_string,[{u,Len},{u,Off}]},_,Strings,_) ->
+ String = if Len > 0 -> binary_to_list(Strings, Off+1, Off+Len);
+ true -> ""
+ end,
+ ?NO_DEBUG('bs_put_string(~p, {string,~p})~n',[Len,String]),
+ {bs_put_string,Len,{string,String}};
+resolve_inst({bs_need_buf,[{u,N}]},_,_,_) ->
+ {bs_need_buf,N};
+
+%%
+%% Instructions for handling floating point numbers added in June 2001 (R8).
+%%
+resolve_inst({fclearerror,[]},_,_,_) ->
+ fclearerror;
+resolve_inst({fcheckerror,Args},_,_,_) ->
+ [Fail] = resolve_args(Args),
+ {fcheckerror,Fail};
+resolve_inst({fmove,Args},_,_,_) ->
+ [FR,Reg] = resolve_args(Args),
+ {fmove,FR,Reg};
+resolve_inst({fconv,Args},_,_,_) ->
+ [Reg,FR] = resolve_args(Args),
+ {fconv,Reg,FR};
+resolve_inst({fadd=I,Args},_,_,_) ->
+ [F,A1,A2,Reg] = resolve_args(Args),
+ {arithfbif,I,F,[A1,A2],Reg};
+resolve_inst({fsub=I,Args},_,_,_) ->
+ [F,A1,A2,Reg] = resolve_args(Args),
+ {arithfbif,I,F,[A1,A2],Reg};
+resolve_inst({fmul=I,Args},_,_,_) ->
+ [F,A1,A2,Reg] = resolve_args(Args),
+ {arithfbif,I,F,[A1,A2],Reg};
+resolve_inst({fdiv=I,Args},_,_,_) ->
+ [F,A1,A2,Reg] = resolve_args(Args),
+ {arithfbif,I,F,[A1,A2],Reg};
+resolve_inst({fnegate,Args},_,_,_) ->
+ [F,Arg,Reg] = resolve_args(Args),
+ {arithfbif,fnegate,F,[Arg],Reg};
+
+%%
+%% Instructions for try expressions added in January 2003 (R10).
+%%
+
+resolve_inst({'try',[Reg,Lbl]},_,_,_) -> % analogous to 'catch'
+ {'try',Reg,Lbl};
+resolve_inst({try_end,[Reg]},_,_,_) -> % analogous to 'catch_end'
+ {try_end,Reg};
+resolve_inst({try_case,[Reg]},_,_,_) -> % analogous to 'catch_end'
+ {try_case,Reg};
+resolve_inst({try_case_end,[Reg]},_,_,_) ->
+ {try_case_end,Reg};
+resolve_inst({raise,[Reg1,Reg2]},_,_,_) ->
+ {bif,raise,{f,0},[Reg1,Reg2],{x,0}};
+
+%%
+%% New bit syntax instructions added in February 2004 (R10B).
+%%
+
+resolve_inst({bs_init2,[Lbl,Arg2,{u,W},{u,R},{u,F},Arg6]},_,_,_) ->
+ [A2,A6] = resolve_args([Arg2,Arg6]),
+ {bs_init2,Lbl,A2,W,R,decode_field_flags(F),A6};
+resolve_inst({bs_bits_to_bytes,[Lbl,Arg2,Arg3]},_,_,_) ->
+ [A2,A3] = resolve_args([Arg2,Arg3]),
+ {bs_bits_to_bytes,Lbl,A2,A3};
+resolve_inst({bs_add=I,[Lbl,Arg2,Arg3,Arg4,Arg5]},_,_,_) ->
+ [A2,A3,A4,A5] = resolve_args([Arg2,Arg3,Arg4,Arg5]),
+ {I,Lbl,[A2,A3,A4],A5};
+
+%%
+%% New apply instructions added in April 2004 (R10B).
+%%
+resolve_inst({apply,[{u,Arity}]},_,_,_) ->
+ {apply,Arity};
+resolve_inst({apply_last,[{u,Arity},{u,D}]},_,_,_) ->
+ {apply_last,Arity,D};
+
+%%
+%% New test instruction added in April 2004 (R10B).
+%%
+resolve_inst({is_boolean=I,Args0},_,_,_) ->
+ [L|Args] = resolve_args(Args0),
+ {test,I,L,Args};
+
+%%
+%% Catches instructions that are not yet handled.
+%%
+
+resolve_inst(X,_,_,_) -> ?exit({resolve_inst,X}).
+
+%%-----------------------------------------------------------------------
+%% Resolves arguments in a generic way.
+%%-----------------------------------------------------------------------
+
+resolve_args(Args) -> [resolve_arg(A) || A <- Args].
+
+resolve_arg({u,N}) -> N;
+resolve_arg({i,N}) -> {integer,N};
+resolve_arg({atom,Atom}=A) when is_atom(Atom) -> A;
+resolve_arg(nil) -> nil;
+resolve_arg(Arg) -> Arg.
+
+%%-----------------------------------------------------------------------
+%% The purpose of the following is just to add a hook for future changes.
+%% Currently, field flags are numbers 1-2-4-8 and only two of these
+%% numbers (BSF_LITTLE 2 -- BSF_SIGNED 4) have a semantic significance;
+%% others are just hints for speeding up the execution; see "erl_bits.h".
+%%-----------------------------------------------------------------------
+
+decode_field_flags(FF) ->
+ {field_flags,FF}.
+
+%%-----------------------------------------------------------------------
+%% Each string is denoted in the assembled code by its offset into this
+%% binary. This binary contains all strings concatenated together.
+%%-----------------------------------------------------------------------
+
+beam_disasm_strings(Bin) ->
+ Bin.
+
+%%-----------------------------------------------------------------------
+%% Disassembles the attributes of a BEAM file.
+%%-----------------------------------------------------------------------
+
+beam_disasm_attributes(none) -> none;
+beam_disasm_attributes(AttrBin) -> binary_to_term(AttrBin).
+
+%%-----------------------------------------------------------------------
+%% Disassembles the compilation information of a BEAM file.
+%%-----------------------------------------------------------------------
+
+beam_disasm_compilation_info(none) -> none;
+beam_disasm_compilation_info(Bin) -> binary_to_term(Bin).
+
+%%-----------------------------------------------------------------------
+%% Private Utilities
+%%-----------------------------------------------------------------------
+
+%%-----------------------------------------------------------------------
+
+lookup_key(Key,[{Key,Val}|_]) ->
+ Val;
+lookup_key(Key,[_|KVs]) ->
+ lookup_key(Key,KVs);
+lookup_key(Key,[]) ->
+ ?exit({lookup_key,{key_not_found,Key}}).
+
+%%-----------------------------------------------------------------------
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_flatten.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_flatten.erl
new file mode 100644
index 0000000000..5c08c6a797
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_flatten.erl
@@ -0,0 +1,137 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: beam_flatten.erl,v 1.1 2008/12/17 09:53:41 mikpe Exp $
+%%
+%% Purpose : Converts intermediate assembly code to final format.
+
+-module(beam_flatten).
+
+-export([module/2]).
+-import(lists, [reverse/1,reverse/2,map/2]).
+
+module({Mod,Exp,Attr,Fs,Lc}, _Opt) ->
+ {ok,{Mod,Exp,Attr,map(fun function/1, Fs),Lc}}.
+
+function({function,Name,Arity,CLabel,Is0}) ->
+ Is1 = block(Is0),
+ Is = opt(Is1),
+ {function,Name,Arity,CLabel,Is}.
+
+block(Is) ->
+ block(Is, []).
+
+block([{block,Is0}|Is1], Acc) -> block(Is1, norm_block(Is0, Acc));
+block([I|Is], Acc) -> block(Is, [I|Acc]);
+block([], Acc) -> reverse(Acc).
+
+norm_block([{allocate,R,Alloc}|Is], Acc0) ->
+ case insert_alloc_in_bs_init(Acc0, Alloc) of
+ not_possible ->
+ norm_block(Is, reverse(norm_allocate(Alloc, R), Acc0));
+ Acc ->
+ norm_block(Is, Acc)
+ end;
+norm_block([I|Is], Acc) -> norm_block(Is, [norm(I)|Acc]);
+norm_block([], Acc) -> Acc.
+
+norm({set,[D],As,{bif,N}}) -> {bif,N,nofail,As,D};
+norm({set,[D],As,{bif,N,F}}) -> {bif,N,F,As,D};
+norm({set,[D],[S],move}) -> {move,S,D};
+norm({set,[D],[S],fmove}) -> {fmove,S,D};
+norm({set,[D],[S],fconv}) -> {fconv,S,D};
+norm({set,[D],[S1,S2],put_list}) -> {put_list,S1,S2,D};
+norm({set,[D],[],{put_tuple,A}}) -> {put_tuple,A,D};
+norm({set,[],[S],put}) -> {put,S};
+norm({set,[D],[],{put_string,L,S}}) -> {put_string,L,S,D};
+norm({set,[D],[S],{get_tuple_element,I}}) -> {get_tuple_element,S,I,D};
+norm({set,[],[S,D],{set_tuple_element,I}}) -> {set_tuple_element,S,D,I};
+norm({set,[D1,D2],[S],get_list}) -> {get_list,S,D1,D2};
+norm({set,[],[],remove_message}) -> remove_message;
+norm({set,[],[],fclearerror}) -> fclearerror;
+norm({set,[],[],fcheckerror}) -> {fcheckerror,{f,0}};
+norm({'%',_}=Comment) -> Comment;
+norm({'%live',R}) -> {'%live',R}.
+
+norm_allocate({_Zero,nostack,Nh,[]}, Regs) ->
+ [{test_heap,Nh,Regs}];
+norm_allocate({_Zero,nostack,Nh,Nf,[]}, Regs) ->
+ [{test_heap,alloc_list(Nh, Nf),Regs}];
+norm_allocate({zero,0,Nh,[]}, Regs) ->
+ norm_allocate({nozero,0,Nh,[]}, Regs);
+norm_allocate({zero,0,Nh,Nf,[]}, Regs) ->
+ norm_allocate({nozero,0,Nh,Nf,[]}, Regs);
+norm_allocate({zero,Ns,0,[]}, Regs) ->
+ [{allocate_zero,Ns,Regs}];
+norm_allocate({zero,Ns,Nh,[]}, Regs) ->
+ [{allocate_heap_zero,Ns,Nh,Regs}];
+norm_allocate({nozero,Ns,0,Inits}, Regs) ->
+ [{allocate,Ns,Regs}|Inits];
+norm_allocate({nozero,Ns,Nh,Inits}, Regs) ->
+ [{allocate_heap,Ns,Nh,Regs}|Inits];
+norm_allocate({nozero,Ns,Nh,Floats,Inits}, Regs) ->
+ [{allocate_heap,Ns,alloc_list(Nh, Floats),Regs}|Inits];
+norm_allocate({zero,Ns,Nh,Floats,Inits}, Regs) ->
+ [{allocate_heap_zero,Ns,alloc_list(Nh, Floats),Regs}|Inits].
+
+insert_alloc_in_bs_init([I|_]=Is, Alloc) ->
+ case is_bs_put(I) of
+ false ->
+ not_possible;
+ true ->
+ insert_alloc_1(Is, Alloc, [])
+ end.
+
+insert_alloc_1([{bs_init2,Fail,Bs,Ws,Regs,F,Dst}|Is], {_,nostack,Nh,Nf,[]}, Acc) ->
+ Al = alloc_list(Ws+Nh, Nf),
+ I = {bs_init2,Fail,Bs,Al,Regs,F,Dst},
+ reverse(Acc, [I|Is]);
+insert_alloc_1([I|Is], Alloc, Acc) ->
+ insert_alloc_1(Is, Alloc, [I|Acc]).
+
+is_bs_put({bs_put_integer,_,_,_,_,_}) -> true;
+is_bs_put({bs_put_float,_,_,_,_,_}) -> true;
+is_bs_put({bs_put_binary,_,_,_,_,_}) -> true;
+is_bs_put({bs_put_string,_,_}) -> true;
+is_bs_put(_) -> false.
+
+alloc_list(Words, Floats) ->
+ {alloc,[{words,Words},{floats,Floats}]}.
+
+
+%% opt(Is0) -> Is
+%% Simple peep-hole optimization to move a {move,Any,{x,0}} past
+%% any kill up to the next call instruction.
+
+opt(Is) ->
+ opt_1(Is, []).
+
+opt_1([{move,_,{x,0}}=I|Is0], Acc0) ->
+ case move_past_kill(Is0, I, Acc0) of
+ impossible -> opt_1(Is0, [I|Acc0]);
+ {Is,Acc} -> opt_1(Is, Acc)
+ end;
+opt_1([I|Is], Acc) ->
+ opt_1(Is, [I|Acc]);
+opt_1([], Acc) -> reverse(Acc).
+
+move_past_kill([{'%live',_}|Is], Move, Acc) ->
+ move_past_kill(Is, Move, Acc);
+move_past_kill([{kill,Src}|_], {move,Src,_}, _) ->
+ impossible;
+move_past_kill([{kill,_}=I|Is], Move, Acc) ->
+ move_past_kill(Is, Move, [I|Acc]);
+move_past_kill(Is, Move, Acc) ->
+ {Is,[Move|Acc]}.
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_jump.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_jump.erl
new file mode 100644
index 0000000000..b3c234c7bb
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_jump.erl
@@ -0,0 +1,477 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: beam_jump.erl,v 1.1 2008/12/17 09:53:41 mikpe Exp $
+%%
+%%% Purpose : Optimise jumps and remove unreachable code.
+
+-module(beam_jump).
+
+-export([module/2,module_labels/1,
+ is_unreachable_after/1,remove_unused_labels/1]).
+
+%%% The following optimisations are done:
+%%%
+%%% (1) This code with two identical instruction sequences
+%%%
+%%% L1: <Instruction sequence>
+%%% L2:
+%%% . . .
+%%% L3: <Instruction sequence>
+%%% L4:
+%%%
+%%% can be replaced with
+%%%
+%%% L1: jump L3
+%%% L2:
+%%% . . .
+%%% L3: <Instruction sequence>
+%%% L4
+%%%
+%%% Note: The instruction sequence must end with an instruction
+%%% such as a jump that never transfers control to the instruction
+%%% following it.
+%%%
+%%% (2) case_end, if_end, and badmatch, and function calls that cause an
+%%% exit (such as calls to exit/1) are moved to the end of the function.
+%%% The purpose is to allow further optimizations at the place from
+%%% which the code was moved.
+%%%
+%%% (3) Any unreachable code is removed. Unreachable code is code after
+%%% jump, call_last and other instructions which never transfer control
+%%% to the following instruction. Code is unreachable up to the next
+%%% *referenced* label. Note that the optimisations below might
+%%% generate more possibilities for removing unreachable code.
+%%%
+%%% (4) This code:
+%%% L1: jump L2
+%%% . . .
+%%% L2: ...
+%%%
+%%% will be changed to
+%%%
+%%% jump L2
+%%% . . .
+%%% L1:
+%%% L2: ...
+%%%
+%%% If the jump is unreachable, it will be removed according to (1).
+%%%
+%%% (5) In
+%%%
+%%% jump L1
+%%% L1:
+%%%
+%%% the jump will be removed.
+%%%
+%%% (6) If test instructions are used to skip a single jump instruction,
+%%% the test is inverted and the jump is eliminated (provided that
+%%% the test can be inverted). Example:
+%%%
+%%% is_eq L1 {x,1} {x,2}
+%%% jump L2
+%%% L1:
+%%%
+%%% will be changed to
+%%%
+%%% is_ne L2 {x,1} {x,2}
+%%%
+%%% (The label L1 will be retained if there were previous references to it.)
+%%%
+%%% (7) Some redundant uses of is_boolean/1 is optimized away.
+%%%
+%%% Terminology note: The optimisation done here is called unreachable-code
+%%% elimination, NOT dead-code elimination. Dead code elimination
+%%% means the removal of instructions that are executed, but have no visible
+%%% effect on the program state.
+%%%
+
+-import(lists, [reverse/1,reverse/2,map/2,mapfoldl/3,foldl/3,
+ last/1,foreach/2,member/2]).
+
+module({Mod,Exp,Attr,Fs0,Lc}, _Opt) ->
+ Fs = map(fun function/1, Fs0),
+ {ok,{Mod,Exp,Attr,Fs,Lc}}.
+
+module_labels({Mod,Exp,Attr,Fs,Lc}) ->
+ {Mod,Exp,Attr,map(fun function_labels/1, Fs),Lc}.
+
+function_labels({function,Name,Arity,CLabel,Asm0}) ->
+ Asm = remove_unused_labels(Asm0),
+ {function,Name,Arity,CLabel,Asm}.
+
+function({function,Name,Arity,CLabel,Asm0}) ->
+ Asm1 = share(Asm0),
+ Asm2 = bopt(Asm1),
+ Asm3 = move(Asm2),
+ Asm4 = opt(Asm3, CLabel),
+ Asm = remove_unused_labels(Asm4),
+ {function,Name,Arity,CLabel,Asm}.
+
+%%%
+%%% (1) We try to share the code for identical code segments by replacing all
+%%% occurrences except the last with jumps to the last occurrence.
+%%%
+
+share(Is) ->
+ share_1(reverse(Is), gb_trees:empty(), [], []).
+
+share_1([{label,_}=Lbl|Is], Dict, [], Acc) ->
+ share_1(Is, Dict, [], [Lbl|Acc]);
+share_1([{label,L}=Lbl|Is], Dict0, Seq, Acc) ->
+ case is_unreachable_after(last(Seq)) of
+ false ->
+ share_1(Is, Dict0, [], [Lbl|Seq ++ Acc]);
+ true ->
+ case gb_trees:lookup(Seq, Dict0) of
+ none ->
+ Dict = gb_trees:insert(Seq, L, Dict0),
+ share_1(Is, Dict, [], [Lbl|Seq ++ Acc]);
+ {value,Label} ->
+ share_1(Is, Dict0, [], [Lbl,{jump,{f,Label}}|Acc])
+ end
+ end;
+share_1([{func_info,_,_,_}=I|Is], _, [], Acc) ->
+ Is++[I|Acc];
+share_1([I|Is], Dict, Seq, Acc) ->
+ case is_unreachable_after(I) of
+ false ->
+ share_1(Is, Dict, [I|Seq], Acc);
+ true ->
+ share_1(Is, Dict, [I], Acc)
+ end.
+
+%%%
+%%% (2) Move short code sequences ending in an instruction that causes an exit
+%%% to the end of the function.
+%%%
+
+move(Is) ->
+ move_1(Is, [], []).
+
+move_1([I|Is], End, Acc) ->
+ case is_exit_instruction(I) of
+ false -> move_1(Is, End, [I|Acc]);
+ true -> move_2(I, Is, End, Acc)
+ end;
+move_1([], End, Acc) ->
+ reverse(Acc, reverse(End)).
+
+move_2(Exit, Is, End, [{block,_},{label,_},{func_info,_,_,_}|_]=Acc) ->
+ move_1(Is, End, [Exit|Acc]);
+move_2(Exit, Is, End, [{kill,_Y}|Acc]) ->
+ move_2(Exit, Is, End, Acc);
+move_2(Exit, Is, End, [{block,_}=Blk,{label,_}=Lbl,Dead|More]=Acc) ->
+ case is_unreachable_after(Dead) of
+ false ->
+ move_1(Is, End, [Exit|Acc]);
+ true ->
+ move_1([Dead|Is], [Exit,Blk,Lbl|End], More)
+ end;
+move_2(Exit, Is, End, [{label,_}=Lbl,Dead|More]=Acc) ->
+ case is_unreachable_after(Dead) of
+ false ->
+ move_1(Is, End, [Exit|Acc]);
+ true ->
+ move_1([Dead|Is], [Exit,Lbl|End], More)
+ end;
+move_2(Exit, Is, End, Acc) ->
+ move_1(Is, End, [Exit|Acc]).
+
+%%%
+%%% (7) Remove redundant is_boolean tests.
+%%%
+
+bopt(Is) ->
+ bopt_1(Is, []).
+
+bopt_1([{test,is_boolean,_,_}=I|Is], Acc0) ->
+ case opt_is_bool(I, Acc0) of
+ no -> bopt_1(Is, [I|Acc0]);
+ yes -> bopt_1(Is, Acc0);
+ {yes,Acc} -> bopt_1(Is, Acc)
+ end;
+bopt_1([I|Is], Acc) -> bopt_1(Is, [I|Acc]);
+bopt_1([], Acc) -> reverse(Acc).
+
+opt_is_bool({test,is_boolean,{f,Lbl},[Reg]}, Acc) ->
+ opt_is_bool_1(Acc, Reg, Lbl).
+
+opt_is_bool_1([{test,is_eq_exact,{f,Lbl},[Reg,{atom,true}]}|_], Reg, Lbl) ->
+ %% Instruction not needed in this context.
+ yes;
+opt_is_bool_1([{test,is_ne_exact,{f,Lbl},[Reg,{atom,true}]}|Acc], Reg, Lbl) ->
+ %% Rewrite to shorter test.
+ {yes,[{test,is_eq_exact,{f,Lbl},[Reg,{atom,false}]}|Acc]};
+opt_is_bool_1([{test,_,{f,Lbl},_}=Test|Acc0], Reg, Lbl) ->
+ case opt_is_bool_1(Acc0, Reg, Lbl) of
+ {yes,Acc} -> {yes,[Test|Acc]};
+ Other -> Other
+ end;
+opt_is_bool_1(_, _, _) -> no.
+
+%%%
+%%% (3) (4) (5) (6) Jump and unreachable code optimizations.
+%%%
+
+-record(st, {fc, %Label for function class errors.
+ entry, %Entry label (must not be moved).
+ mlbl, %Moved labels.
+ labels %Set of referenced labels.
+ }).
+
+opt([{label,Fc}|_]=Is, CLabel) ->
+ Lbls = initial_labels(Is),
+ St = #st{fc=Fc,entry=CLabel,mlbl=dict:new(),labels=Lbls},
+ opt(Is, [], St).
+
+opt([{test,Test0,{f,Lnum}=Lbl,Ops}=I|Is0], Acc, St) ->
+ case Is0 of
+ [{jump,To}|[{label,Lnum}|Is2]=Is1] ->
+ case invert_test(Test0) of
+ not_possible ->
+ opt(Is0, [I|Acc], label_used(Lbl, St));
+ Test ->
+ Is = case is_label_used(Lnum, St) of
+ true -> Is1;
+ false -> Is2
+ end,
+ opt([{test,Test,To,Ops}|Is], Acc, label_used(To, St))
+ end;
+ _Other ->
+ opt(Is0, [I|Acc], label_used(Lbl, St))
+ end;
+opt([{select_val,_R,Fail,{list,Vls}}=I|Is], Acc, St) ->
+ skip_unreachable(Is, [I|Acc], label_used([Fail|Vls], St));
+opt([{select_tuple_arity,_R,Fail,{list,Vls}}=I|Is], Acc, St) ->
+ skip_unreachable(Is, [I|Acc], label_used([Fail|Vls], St));
+opt([{'try',_R,Lbl}=I|Is], Acc, St) ->
+ opt(Is, [I|Acc], label_used(Lbl, St));
+opt([{'catch',_R,Lbl}=I|Is], Acc, St) ->
+ opt(Is, [I|Acc], label_used(Lbl, St));
+opt([{label,L}=I|Is], Acc, #st{entry=L}=St) ->
+ %% NEVER move the entry label.
+ opt(Is, [I|Acc], St);
+opt([{label,L1},{jump,{f,L2}}=I|Is], [Prev|Acc], St0) ->
+ St = St0#st{mlbl=dict:append(L2, L1, St0#st.mlbl)},
+ opt([Prev,I|Is], Acc, label_used({f,L2}, St));
+opt([{label,Lbl}=I|Is], Acc, #st{mlbl=Mlbl}=St0) ->
+ case dict:find(Lbl, Mlbl) of
+ {ok,Lbls} ->
+ %% Essential to remove the list of labels from the dictionary,
+ %% since we will rescan the inserted labels. We MUST rescan.
+ St = St0#st{mlbl=dict:erase(Lbl, Mlbl)},
+ insert_labels([Lbl|Lbls], Is, Acc, St);
+ error -> opt(Is, [I|Acc], St0)
+ end;
+opt([{jump,{f,Lbl}},{label,Lbl}=I|Is], Acc, St) ->
+ opt([I|Is], Acc, St);
+opt([{jump,Lbl}=I|Is], Acc, St) ->
+ skip_unreachable(Is, [I|Acc], label_used(Lbl, St));
+opt([{loop_rec,Lbl,_R}=I|Is], Acc, St) ->
+ opt(Is, [I|Acc], label_used(Lbl, St));
+opt([{bif,_Name,Lbl,_As,_R}=I|Is], Acc, St) ->
+ opt(Is, [I|Acc], label_used(Lbl, St));
+opt([{bs_put_integer,Lbl,_Bits,_Unit,_Fl,_Val}=I|Is], Acc, St) ->
+ opt(Is, [I|Acc], label_used(Lbl, St));
+opt([{bs_put_binary,Lbl,_Bits,_Unit,_Fl,_Val}=I|Is], Acc, St) ->
+ opt(Is, [I|Acc], label_used(Lbl, St));
+opt([{bs_put_float,Lbl,_Bits,_Unit,_Fl,_Val}=I|Is], Acc, St) ->
+ opt(Is, [I|Acc], label_used(Lbl, St));
+opt([{bs_final,Lbl,_R}=I|Is], Acc, St) ->
+ opt(Is, [I|Acc], label_used(Lbl, St));
+opt([{bs_init2,Lbl,_,_,_,_,_}=I|Is], Acc, St) ->
+ opt(Is, [I|Acc], label_used(Lbl, St));
+opt([{bs_add,Lbl,_,_}=I|Is], Acc, St) ->
+ opt(Is, [I|Acc], label_used(Lbl, St));
+opt([{bs_bits_to_bytes,Lbl,_,_}=I|Is], Acc, St) ->
+ opt(Is, [I|Acc], label_used(Lbl, St));
+opt([I|Is], Acc, St) ->
+ case is_unreachable_after(I) of
+ true -> skip_unreachable(Is, [I|Acc], St);
+ false -> opt(Is, [I|Acc], St)
+ end;
+opt([], Acc, #st{fc=Fc,mlbl=Mlbl}) ->
+ Code = reverse(Acc),
+ case dict:find(Fc, Mlbl) of
+ {ok,Lbls} -> insert_fc_labels(Lbls, Mlbl, Code);
+ error -> Code
+ end.
+
+insert_fc_labels([L|Ls], Mlbl, Acc0) ->
+ Acc = [{label,L}|Acc0],
+ case dict:find(L, Mlbl) of
+ error ->
+ insert_fc_labels(Ls, Mlbl, Acc);
+ {ok,Lbls} ->
+ insert_fc_labels(Lbls++Ls, Mlbl, Acc)
+ end;
+insert_fc_labels([], _, Acc) -> Acc.
+
+%% invert_test(Test0) -> not_possible | Test
+
+invert_test(is_ge) -> is_lt;
+invert_test(is_lt) -> is_ge;
+invert_test(is_eq) -> is_ne;
+invert_test(is_ne) -> is_eq;
+invert_test(is_eq_exact) -> is_ne_exact;
+invert_test(is_ne_exact) -> is_eq_exact;
+invert_test(_) -> not_possible.
+
+insert_labels([L|Ls], Is, [{jump,{f,L}}|Acc], St) ->
+ insert_labels(Ls, [{label,L}|Is], Acc, St);
+insert_labels([L|Ls], Is, Acc, St) ->
+ insert_labels(Ls, [{label,L}|Is], Acc, St);
+insert_labels([], Is, Acc, St) ->
+ opt(Is, Acc, St).
+
+%% Skip unreachable code up to the next referenced label.
+
+skip_unreachable([{label,L}|Is], [{jump,{f,L}}|Acc], St) ->
+ opt([{label,L}|Is], Acc, St);
+skip_unreachable([{label,L}|Is], Acc, St) ->
+ case is_label_used(L, St) of
+ true -> opt([{label,L}|Is], Acc, St);
+ false -> skip_unreachable(Is, Acc, St)
+ end;
+skip_unreachable([_|Is], Acc, St) ->
+ skip_unreachable(Is, Acc, St);
+skip_unreachable([], Acc, St) ->
+ opt([], Acc, St).
+
+%% Add one or more label to the set of used labels.
+
+label_used({f,0}, St) -> St;
+label_used({f,L}, St) -> St#st{labels=gb_sets:add(L, St#st.labels)};
+label_used([H|T], St0) -> label_used(T, label_used(H, St0));
+label_used([], St) -> St;
+label_used(_Other, St) -> St.
+
+%% Test if label is used.
+
+is_label_used(L, St) ->
+ gb_sets:is_member(L, St#st.labels).
+
+%% is_unreachable_after(Instruction) -> true|false
+%% Test whether the code after Instruction is unreachable.
+
+is_unreachable_after({func_info,_M,_F,_A}) -> true;
+is_unreachable_after(return) -> true;
+is_unreachable_after({call_ext_last,_Ar,_ExtFunc,_D}) -> true;
+is_unreachable_after({call_ext_only,_Ar,_ExtFunc}) -> true;
+is_unreachable_after({call_last,_Ar,_Lbl,_D}) -> true;
+is_unreachable_after({call_only,_Ar,_Lbl}) -> true;
+is_unreachable_after({apply_last,_Ar,_N}) -> true;
+is_unreachable_after({jump,_Lbl}) -> true;
+is_unreachable_after({select_val,_R,_Lbl,_Cases}) -> true;
+is_unreachable_after({select_tuple_arity,_R,_Lbl,_Cases}) -> true;
+is_unreachable_after({loop_rec_end,_}) -> true;
+is_unreachable_after({wait,_}) -> true;
+is_unreachable_after(I) -> is_exit_instruction(I).
+
+%% is_exit_instruction(Instruction) -> true|false
+%% Test whether the instruction Instruction always
+%% causes an exit/failure.
+
+is_exit_instruction({call_ext,_,{extfunc,M,F,A}}) ->
+ is_exit_instruction_1(M, F, A);
+is_exit_instruction({call_ext_last,_,{extfunc,M,F,A},_}) ->
+ is_exit_instruction_1(M, F, A);
+is_exit_instruction({call_ext_only,_,{extfunc,M,F,A}}) ->
+ is_exit_instruction_1(M, F, A);
+is_exit_instruction(if_end) -> true;
+is_exit_instruction({case_end,_}) -> true;
+is_exit_instruction({try_case_end,_}) -> true;
+is_exit_instruction({badmatch,_}) -> true;
+is_exit_instruction(_) -> false.
+
+is_exit_instruction_1(erlang, exit, 1) -> true;
+is_exit_instruction_1(erlang, throw, 1) -> true;
+is_exit_instruction_1(erlang, error, 1) -> true;
+is_exit_instruction_1(erlang, error, 2) -> true;
+is_exit_instruction_1(erlang, fault, 1) -> true;
+is_exit_instruction_1(erlang, fault, 2) -> true;
+is_exit_instruction_1(_, _, _) -> false.
+
+%% remove_unused_labels(Instructions0) -> Instructions
+%% Remove all unused labels.
+
+remove_unused_labels(Is) ->
+ Used0 = initial_labels(Is),
+ Used = foldl(fun ulbl/2, Used0, Is),
+ rem_unused(Is, Used, []).
+
+rem_unused([{label,Lbl}=I|Is], Used, Acc) ->
+ case gb_sets:is_member(Lbl, Used) of
+ false -> rem_unused(Is, Used, Acc);
+ true -> rem_unused(Is, Used, [I|Acc])
+ end;
+rem_unused([I|Is], Used, Acc) ->
+ rem_unused(Is, Used, [I|Acc]);
+rem_unused([], _, Acc) -> reverse(Acc).
+
+initial_labels(Is) ->
+ initial_labels(Is, []).
+
+initial_labels([{label,Lbl}|Is], Acc) ->
+ initial_labels(Is, [Lbl|Acc]);
+initial_labels([{func_info,_,_,_},{label,Lbl}|_], Acc) ->
+ gb_sets:from_list([Lbl|Acc]).
+
+ulbl({test,_,Fail,_}, Used) ->
+ mark_used(Fail, Used);
+ulbl({select_val,_,Fail,{list,Vls}}, Used) ->
+ mark_used_list(Vls, mark_used(Fail, Used));
+ulbl({select_tuple_arity,_,Fail,{list,Vls}}, Used) ->
+ mark_used_list(Vls, mark_used(Fail, Used));
+ulbl({'try',_,Lbl}, Used) ->
+ mark_used(Lbl, Used);
+ulbl({'catch',_,Lbl}, Used) ->
+ mark_used(Lbl, Used);
+ulbl({jump,Lbl}, Used) ->
+ mark_used(Lbl, Used);
+ulbl({loop_rec,Lbl,_}, Used) ->
+ mark_used(Lbl, Used);
+ulbl({loop_rec_end,Lbl}, Used) ->
+ mark_used(Lbl, Used);
+ulbl({wait,Lbl}, Used) ->
+ mark_used(Lbl, Used);
+ulbl({wait_timeout,Lbl,_To}, Used) ->
+ mark_used(Lbl, Used);
+ulbl({bif,_Name,Lbl,_As,_R}, Used) ->
+ mark_used(Lbl, Used);
+ulbl({bs_init2,Lbl,_,_,_,_,_}, Used) ->
+ mark_used(Lbl, Used);
+ulbl({bs_put_integer,Lbl,_Bits,_Unit,_Fl,_Val}, Used) ->
+ mark_used(Lbl, Used);
+ulbl({bs_put_float,Lbl,_Bits,_Unit,_Fl,_Val}, Used) ->
+ mark_used(Lbl, Used);
+ulbl({bs_put_binary,Lbl,_Bits,_Unit,_Fl,_Val}, Used) ->
+ mark_used(Lbl, Used);
+ulbl({bs_final,Lbl,_}, Used) ->
+ mark_used(Lbl, Used);
+ulbl({bs_add,Lbl,_,_}, Used) ->
+ mark_used(Lbl, Used);
+ulbl({bs_bits_to_bytes,Lbl,_,_}, Used) ->
+ mark_used(Lbl, Used);
+ulbl(_, Used) -> Used.
+
+mark_used({f,0}, Used) -> Used;
+mark_used({f,L}, Used) -> gb_sets:add(L, Used);
+mark_used(_, Used) -> Used.
+
+mark_used_list([H|T], Used) ->
+ mark_used_list(T, mark_used(H, Used));
+mark_used_list([], Used) -> Used.
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_listing.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_listing.erl
new file mode 100644
index 0000000000..5def6816b2
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_listing.erl
@@ -0,0 +1,117 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: beam_listing.erl,v 1.1 2008/12/17 09:53:41 mikpe Exp $
+%%
+-module(beam_listing).
+
+-export([module/2]).
+
+-include("v3_life.hrl").
+
+-import(lists, [foreach/2]).
+
+module(File, Core) when element(1, Core) == c_module ->
+ %% This is a core module.
+ io:put_chars(File, core_pp:format(Core));
+module(File, Kern) when element(1, Kern) == k_mdef ->
+ %% This is a kernel module.
+ io:put_chars(File, v3_kernel_pp:format(Kern));
+ %%io:put_chars(File, io_lib:format("~p~n", [Kern]));
+module(File, {Mod,Exp,Attr,Kern}) ->
+ %% This is output from beam_life (v3).
+ io:fwrite(File, "~w.~n~p.~n~p.~n", [Mod,Exp,Attr]),
+ foreach(fun (F) -> function(File, F) end, Kern);
+module(Stream, {Mod,Exp,Attr,Code,NumLabels}) ->
+ %% This is output from beam_codegen.
+ io:format(Stream, "{module, ~s}. %% version = ~w\n",
+ [Mod, beam_opcodes:format_number()]),
+ io:format(Stream, "\n{exports, ~p}.\n", [Exp]),
+ io:format(Stream, "\n{attributes, ~p}.\n", [Attr]),
+ io:format(Stream, "\n{labels, ~p}.\n", [NumLabels]),
+ foreach(
+ fun ({function,Name,Arity,Entry,Asm}) ->
+ io:format(Stream, "\n\n{function, ~w, ~w, ~w}.\n",
+ [Name, Arity, Entry]),
+ foreach(fun(Op) -> print_op(Stream, Op) end, Asm) end,
+ Code);
+module(Stream, {Mod,Exp,Inter}) ->
+ %% Other kinds of intermediate formats.
+ io:fwrite(Stream, "~w.~n~p.~n", [Mod,Exp]),
+ foreach(fun (F) -> io:format(Stream, "~p.\n", [F]) end, Inter);
+module(Stream, [_|_]=Fs) ->
+ %% Form-based abstract format.
+ foreach(fun (F) -> io:format(Stream, "~p.\n", [F]) end, Fs).
+
+print_op(Stream, Label) when element(1, Label) == label ->
+ io:format(Stream, " ~p.\n", [Label]);
+print_op(Stream, Op) ->
+ io:format(Stream, " ~p.\n", [Op]).
+
+function(File, {function,Name,Arity,Args,Body,Vdb}) ->
+ io:nl(File),
+ io:format(File, "function ~p/~p.\n", [Name,Arity]),
+ io:format(File, " ~p.\n", [Args]),
+ print_vdb(File, Vdb),
+ put(beam_listing_nl, true),
+ foreach(fun(F) -> format(File, F, []) end, Body),
+ nl(File),
+ erase(beam_listing_nl).
+
+format(File, #l{ke=Ke,i=I,vdb=Vdb}, Ind) ->
+ nl(File),
+ ind_format(File, Ind, "~p ", [I]),
+ print_vdb(File, Vdb),
+ nl(File),
+ format(File, Ke, Ind);
+format(File, Tuple, Ind) when is_tuple(Tuple) ->
+ ind_format(File, Ind, "{", []),
+ format_list(File, tuple_to_list(Tuple), [$\s|Ind]),
+ ind_format(File, Ind, "}", []);
+format(File, List, Ind) when is_list(List) ->
+ ind_format(File, Ind, "[", []),
+ format_list(File, List, [$\s|Ind]),
+ ind_format(File, Ind, "]", []);
+format(File, F, Ind) ->
+ ind_format(File, Ind, "~p", [F]).
+
+format_list(File, [F], Ind) ->
+ format(File, F, Ind);
+format_list(File, [F|Fs], Ind) ->
+ format(File, F, Ind),
+ ind_format(File, Ind, ",", []),
+ format_list(File, Fs, Ind);
+format_list(_, [], _) -> ok.
+
+
+print_vdb(File, [{Var,F,E}|Vs]) ->
+ io:format(File, "~p:~p..~p ", [Var,F,E]),
+ print_vdb(File, Vs);
+print_vdb(_, []) -> ok.
+
+ind_format(File, Ind, Format, Args) ->
+ case get(beam_listing_nl) of
+ true ->
+ put(beam_listing_nl, false),
+ io:put_chars(File, Ind);
+ false -> ok
+ end,
+ io:format(File, Format, Args).
+
+nl(File) ->
+ case put(beam_listing_nl, true) of
+ true -> ok;
+ false -> io:nl(File)
+ end.
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_opcodes.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_opcodes.erl
new file mode 100644
index 0000000000..a4f5fd34d2
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_opcodes.erl
@@ -0,0 +1,240 @@
+-module(beam_opcodes).
+%% Warning: Do not edit this file. It was automatically
+%% generated by 'beam_makeops' on Wed Nov 24 17:52:43 2004.
+
+-export([format_number/0]).
+-export([opcode/2,opname/1]).
+
+format_number() -> 0.
+
+opcode(label, 1) -> 1;
+opcode(func_info, 3) -> 2;
+opcode(int_code_end, 0) -> 3;
+opcode(call, 2) -> 4;
+opcode(call_last, 3) -> 5;
+opcode(call_only, 2) -> 6;
+opcode(call_ext, 2) -> 7;
+opcode(call_ext_last, 3) -> 8;
+opcode(bif0, 2) -> 9;
+opcode(bif1, 4) -> 10;
+opcode(bif2, 5) -> 11;
+opcode(allocate, 2) -> 12;
+opcode(allocate_heap, 3) -> 13;
+opcode(allocate_zero, 2) -> 14;
+opcode(allocate_heap_zero, 3) -> 15;
+opcode(test_heap, 2) -> 16;
+opcode(init, 1) -> 17;
+opcode(deallocate, 1) -> 18;
+opcode(return, 0) -> 19;
+opcode(send, 0) -> 20;
+opcode(remove_message, 0) -> 21;
+opcode(timeout, 0) -> 22;
+opcode(loop_rec, 2) -> 23;
+opcode(loop_rec_end, 1) -> 24;
+opcode(wait, 1) -> 25;
+opcode(wait_timeout, 2) -> 26;
+opcode(m_plus, 4) -> 27;
+opcode(m_minus, 4) -> 28;
+opcode(m_times, 4) -> 29;
+opcode(m_div, 4) -> 30;
+opcode(int_div, 4) -> 31;
+opcode(int_rem, 4) -> 32;
+opcode(int_band, 4) -> 33;
+opcode(int_bor, 4) -> 34;
+opcode(int_bxor, 4) -> 35;
+opcode(int_bsl, 4) -> 36;
+opcode(int_bsr, 4) -> 37;
+opcode(int_bnot, 3) -> 38;
+opcode(is_lt, 3) -> 39;
+opcode(is_ge, 3) -> 40;
+opcode(is_eq, 3) -> 41;
+opcode(is_ne, 3) -> 42;
+opcode(is_eq_exact, 3) -> 43;
+opcode(is_ne_exact, 3) -> 44;
+opcode(is_integer, 2) -> 45;
+opcode(is_float, 2) -> 46;
+opcode(is_number, 2) -> 47;
+opcode(is_atom, 2) -> 48;
+opcode(is_pid, 2) -> 49;
+opcode(is_reference, 2) -> 50;
+opcode(is_port, 2) -> 51;
+opcode(is_nil, 2) -> 52;
+opcode(is_binary, 2) -> 53;
+opcode(is_constant, 2) -> 54;
+opcode(is_list, 2) -> 55;
+opcode(is_nonempty_list, 2) -> 56;
+opcode(is_tuple, 2) -> 57;
+opcode(test_arity, 3) -> 58;
+opcode(select_val, 3) -> 59;
+opcode(select_tuple_arity, 3) -> 60;
+opcode(jump, 1) -> 61;
+opcode('catch', 2) -> 62;
+opcode(catch_end, 1) -> 63;
+opcode(move, 2) -> 64;
+opcode(get_list, 3) -> 65;
+opcode(get_tuple_element, 3) -> 66;
+opcode(set_tuple_element, 3) -> 67;
+opcode(put_string, 3) -> 68;
+opcode(put_list, 3) -> 69;
+opcode(put_tuple, 2) -> 70;
+opcode(put, 1) -> 71;
+opcode(badmatch, 1) -> 72;
+opcode(if_end, 0) -> 73;
+opcode(case_end, 1) -> 74;
+opcode(call_fun, 1) -> 75;
+opcode(make_fun, 3) -> 76;
+opcode(is_function, 2) -> 77;
+opcode(call_ext_only, 2) -> 78;
+opcode(bs_start_match, 2) -> 79;
+opcode(bs_get_integer, 5) -> 80;
+opcode(bs_get_float, 5) -> 81;
+opcode(bs_get_binary, 5) -> 82;
+opcode(bs_skip_bits, 4) -> 83;
+opcode(bs_test_tail, 2) -> 84;
+opcode(bs_save, 1) -> 85;
+opcode(bs_restore, 1) -> 86;
+opcode(bs_init, 2) -> 87;
+opcode(bs_final, 2) -> 88;
+opcode(bs_put_integer, 5) -> 89;
+opcode(bs_put_binary, 5) -> 90;
+opcode(bs_put_float, 5) -> 91;
+opcode(bs_put_string, 2) -> 92;
+opcode(bs_need_buf, 1) -> 93;
+opcode(fclearerror, 0) -> 94;
+opcode(fcheckerror, 1) -> 95;
+opcode(fmove, 2) -> 96;
+opcode(fconv, 2) -> 97;
+opcode(fadd, 4) -> 98;
+opcode(fsub, 4) -> 99;
+opcode(fmul, 4) -> 100;
+opcode(fdiv, 4) -> 101;
+opcode(fnegate, 3) -> 102;
+opcode(make_fun2, 1) -> 103;
+opcode('try', 2) -> 104;
+opcode(try_end, 1) -> 105;
+opcode(try_case, 1) -> 106;
+opcode(try_case_end, 1) -> 107;
+opcode(raise, 2) -> 108;
+opcode(bs_init2, 6) -> 109;
+opcode(bs_bits_to_bytes, 3) -> 110;
+opcode(bs_add, 5) -> 111;
+opcode(apply, 1) -> 112;
+opcode(apply_last, 2) -> 113;
+opcode(is_boolean, 2) -> 114;
+opcode(Name, Arity) -> erlang:error(badarg, [Name,Arity]).
+
+opname(1) -> {label,1};
+opname(2) -> {func_info,3};
+opname(3) -> {int_code_end,0};
+opname(4) -> {call,2};
+opname(5) -> {call_last,3};
+opname(6) -> {call_only,2};
+opname(7) -> {call_ext,2};
+opname(8) -> {call_ext_last,3};
+opname(9) -> {bif0,2};
+opname(10) -> {bif1,4};
+opname(11) -> {bif2,5};
+opname(12) -> {allocate,2};
+opname(13) -> {allocate_heap,3};
+opname(14) -> {allocate_zero,2};
+opname(15) -> {allocate_heap_zero,3};
+opname(16) -> {test_heap,2};
+opname(17) -> {init,1};
+opname(18) -> {deallocate,1};
+opname(19) -> {return,0};
+opname(20) -> {send,0};
+opname(21) -> {remove_message,0};
+opname(22) -> {timeout,0};
+opname(23) -> {loop_rec,2};
+opname(24) -> {loop_rec_end,1};
+opname(25) -> {wait,1};
+opname(26) -> {wait_timeout,2};
+opname(27) -> {m_plus,4};
+opname(28) -> {m_minus,4};
+opname(29) -> {m_times,4};
+opname(30) -> {m_div,4};
+opname(31) -> {int_div,4};
+opname(32) -> {int_rem,4};
+opname(33) -> {int_band,4};
+opname(34) -> {int_bor,4};
+opname(35) -> {int_bxor,4};
+opname(36) -> {int_bsl,4};
+opname(37) -> {int_bsr,4};
+opname(38) -> {int_bnot,3};
+opname(39) -> {is_lt,3};
+opname(40) -> {is_ge,3};
+opname(41) -> {is_eq,3};
+opname(42) -> {is_ne,3};
+opname(43) -> {is_eq_exact,3};
+opname(44) -> {is_ne_exact,3};
+opname(45) -> {is_integer,2};
+opname(46) -> {is_float,2};
+opname(47) -> {is_number,2};
+opname(48) -> {is_atom,2};
+opname(49) -> {is_pid,2};
+opname(50) -> {is_reference,2};
+opname(51) -> {is_port,2};
+opname(52) -> {is_nil,2};
+opname(53) -> {is_binary,2};
+opname(54) -> {is_constant,2};
+opname(55) -> {is_list,2};
+opname(56) -> {is_nonempty_list,2};
+opname(57) -> {is_tuple,2};
+opname(58) -> {test_arity,3};
+opname(59) -> {select_val,3};
+opname(60) -> {select_tuple_arity,3};
+opname(61) -> {jump,1};
+opname(62) -> {'catch',2};
+opname(63) -> {catch_end,1};
+opname(64) -> {move,2};
+opname(65) -> {get_list,3};
+opname(66) -> {get_tuple_element,3};
+opname(67) -> {set_tuple_element,3};
+opname(68) -> {put_string,3};
+opname(69) -> {put_list,3};
+opname(70) -> {put_tuple,2};
+opname(71) -> {put,1};
+opname(72) -> {badmatch,1};
+opname(73) -> {if_end,0};
+opname(74) -> {case_end,1};
+opname(75) -> {call_fun,1};
+opname(76) -> {make_fun,3};
+opname(77) -> {is_function,2};
+opname(78) -> {call_ext_only,2};
+opname(79) -> {bs_start_match,2};
+opname(80) -> {bs_get_integer,5};
+opname(81) -> {bs_get_float,5};
+opname(82) -> {bs_get_binary,5};
+opname(83) -> {bs_skip_bits,4};
+opname(84) -> {bs_test_tail,2};
+opname(85) -> {bs_save,1};
+opname(86) -> {bs_restore,1};
+opname(87) -> {bs_init,2};
+opname(88) -> {bs_final,2};
+opname(89) -> {bs_put_integer,5};
+opname(90) -> {bs_put_binary,5};
+opname(91) -> {bs_put_float,5};
+opname(92) -> {bs_put_string,2};
+opname(93) -> {bs_need_buf,1};
+opname(94) -> {fclearerror,0};
+opname(95) -> {fcheckerror,1};
+opname(96) -> {fmove,2};
+opname(97) -> {fconv,2};
+opname(98) -> {fadd,4};
+opname(99) -> {fsub,4};
+opname(100) -> {fmul,4};
+opname(101) -> {fdiv,4};
+opname(102) -> {fnegate,3};
+opname(103) -> {make_fun2,1};
+opname(104) -> {'try',2};
+opname(105) -> {try_end,1};
+opname(106) -> {try_case,1};
+opname(107) -> {try_case_end,1};
+opname(108) -> {raise,2};
+opname(109) -> {bs_init2,6};
+opname(110) -> {bs_bits_to_bytes,3};
+opname(111) -> {bs_add,5};
+opname(112) -> {apply,1};
+opname(113) -> {apply_last,2};
+opname(114) -> {is_boolean,2};
+opname(Number) -> erlang:error(badarg, [Number]).
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_opcodes.hrl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_opcodes.hrl
new file mode 100644
index 0000000000..a330a68f37
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_opcodes.hrl
@@ -0,0 +1,11 @@
+%% Warning: Do not edit this file. It was automatically
+%% generated by 'beam_makeops' on Wed Nov 24 17:52:43 2004.
+
+-define(tag_u, 0).
+-define(tag_i, 1).
+-define(tag_a, 2).
+-define(tag_x, 3).
+-define(tag_y, 4).
+-define(tag_f, 5).
+-define(tag_h, 6).
+-define(tag_z, 7).
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_type.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_type.erl
new file mode 100644
index 0000000000..d2ac3fcd99
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_type.erl
@@ -0,0 +1,551 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: beam_type.erl,v 1.1 2008/12/17 09:53:41 mikpe Exp $
+%%
+%% Purpose : Type-based optimisations.
+
+-module(beam_type).
+
+-export([module/2]).
+
+-import(lists, [map/2,foldl/3,reverse/1,reverse/2,filter/2,member/2]).
+
+module({Mod,Exp,Attr,Fs0,Lc}, Opt) ->
+ AllowFloatOpts = not member(no_float_opt, Opt),
+ Fs = map(fun(F) -> function(F, AllowFloatOpts) end, Fs0),
+ {ok,{Mod,Exp,Attr,Fs,Lc}}.
+
+function({function,Name,Arity,CLabel,Asm0}, AllowFloatOpts) ->
+ Asm = opt(Asm0, AllowFloatOpts, [], tdb_new()),
+ {function,Name,Arity,CLabel,Asm}.
+
+%% opt([Instruction], AllowFloatOpts, Accumulator, TypeDb) -> {[Instruction'],TypeDb'}
+%% Keep track of type information; try to simplify.
+
+opt([{block,Body1}|Is], AllowFloatOpts, [{block,Body0}|Acc], Ts0) ->
+ {Body2,Ts} = simplify(Body1, Ts0, AllowFloatOpts),
+ Body = beam_block:merge_blocks(Body0, Body2),
+ opt(Is, AllowFloatOpts, [{block,Body}|Acc], Ts);
+opt([{block,Body0}|Is], AllowFloatOpts, Acc, Ts0) ->
+ {Body,Ts} = simplify(Body0, Ts0, AllowFloatOpts),
+ opt(Is, AllowFloatOpts, [{block,Body}|Acc], Ts);
+opt([I0|Is], AllowFloatOpts, Acc, Ts0) ->
+ case simplify([I0], Ts0, AllowFloatOpts) of
+ {[],Ts} -> opt(Is, AllowFloatOpts, Acc, Ts);
+ {[I],Ts} -> opt(Is, AllowFloatOpts, [I|Acc], Ts)
+ end;
+opt([], _, Acc, _) -> reverse(Acc).
+
+%% simplify(Instruction, TypeDb, AllowFloatOpts) -> NewInstruction
+%% Simplify an instruction using type information (this is
+%% technically a "strength reduction").
+
+simplify(Is, TypeDb, false) ->
+ simplify(Is, TypeDb, no_float_opt, []);
+simplify(Is, TypeDb, true) ->
+ case are_live_regs_determinable(Is) of
+ false -> simplify(Is, TypeDb, no_float_opt, []);
+ true -> simplify(Is, TypeDb, [], [])
+ end.
+
+simplify([{set,[D],[{integer,Index},Reg],{bif,element,_}}=I0|Is]=Is0, Ts0, Rs0, Acc0) ->
+ I = case max_tuple_size(Reg, Ts0) of
+ Sz when 0 < Index, Index =< Sz ->
+ {set,[D],[Reg],{get_tuple_element,Index-1}};
+ _Other -> I0
+ end,
+ Ts = update(I, Ts0),
+ {Rs,Acc} = flush(Rs0, Is0, Acc0),
+ simplify(Is, Ts, Rs, [I|checkerror(Acc)]);
+simplify([{set,[D0],[A],{bif,'-',{f,0}}}=I|Is]=Is0, Ts0, Rs0, Acc0)
+ when Rs0 =/= no_float_opt ->
+ case tdb_find(A, Ts0) of
+ float ->
+ {Rs1,Acc1} = load_reg(A, Ts0, Rs0, Acc0),
+ {D,Rs} = find_dest(D0, Rs1),
+ Areg = fetch_reg(A, Rs),
+ Acc = [{set,[D],[Areg],{bif,fnegate,{f,0}}}|clearerror(Acc1)],
+ Ts = tdb_update([{D0,float}], Ts0),
+ simplify(Is, Ts, Rs, Acc);
+ _Other ->
+ Ts = update(I, Ts0),
+ {Rs,Acc} = flush(Rs0, Is0, Acc0),
+ simplify(Is, Ts, Rs, [I|checkerror(Acc)])
+ end;
+simplify([{set,[_],[_],{bif,_,{f,0}}}=I|Is]=Is0, Ts0, Rs0, Acc0) ->
+ Ts = update(I, Ts0),
+ {Rs,Acc} = flush(Rs0, Is0, Acc0),
+ simplify(Is, Ts, Rs, [I|checkerror(Acc)]);
+simplify([{set,[D0],[A,B],{bif,Op0,{f,0}}}=I|Is]=Is0, Ts0, Rs0, Acc0)
+ when Rs0 =/= no_float_opt ->
+ case float_op(Op0, A, B, Ts0) of
+ no ->
+ Ts = update(I, Ts0),
+ {Rs,Acc} = flush(Rs0, Is0, Acc0),
+ simplify(Is, Ts, Rs, [I|checkerror(Acc)]);
+ {yes,Op} ->
+ {Rs1,Acc1} = load_reg(A, Ts0, Rs0, Acc0),
+ {Rs2,Acc2} = load_reg(B, Ts0, Rs1, Acc1),
+ {D,Rs} = find_dest(D0, Rs2),
+ Areg = fetch_reg(A, Rs),
+ Breg = fetch_reg(B, Rs),
+ Acc = [{set,[D],[Areg,Breg],{bif,Op,{f,0}}}|clearerror(Acc2)],
+ Ts = tdb_update([{D0,float}], Ts0),
+ simplify(Is, Ts, Rs, Acc)
+ end;
+simplify([{set,[D],[TupleReg],{get_tuple_element,0}}=I|Is0], Ts0, Rs0, Acc0) ->
+ case tdb_find(TupleReg, Ts0) of
+ {tuple,_,[Contents]} ->
+ Ts = tdb_update([{D,Contents}], Ts0),
+ {Rs,Acc} = flush(Rs0, Is0, Acc0),
+ simplify(Is0, Ts, Rs, [{set,[D],[Contents],move}|Acc]);
+ _ ->
+ Ts = update(I, Ts0),
+ {Rs,Acc} = flush(Rs0, Is0, Acc0),
+ simplify(Is0, Ts, Rs, [I|checkerror(Acc)])
+ end;
+simplify([{set,_,_,{'catch',_}}=I|Is]=Is0, _Ts, Rs0, Acc0) ->
+ Acc = flush_all(Rs0, Is0, Acc0),
+ simplify(Is, tdb_new(), Rs0, [I|Acc]);
+simplify([{test,is_tuple,_,[R]}=I|Is], Ts, Rs, Acc) ->
+ case tdb_find(R, Ts) of
+ {tuple,_,_} -> simplify(Is, Ts, Rs, Acc);
+ _ ->
+ simplify(Is, Ts, Rs, [I|Acc])
+ end;
+simplify([{test,test_arity,_,[R,Arity]}=I|Is], Ts0, Rs, Acc) ->
+ case tdb_find(R, Ts0) of
+ {tuple,Arity,_} ->
+ simplify(Is, Ts0, Rs, Acc);
+ _Other ->
+ Ts = update(I, Ts0),
+ simplify(Is, Ts, Rs, [I|Acc])
+ end;
+simplify([{test,is_eq_exact,Fail,[R,{atom,_}=Atom]}=I|Is0], Ts0, Rs0, Acc0) ->
+ Acc1 = case tdb_find(R, Ts0) of
+ {atom,_}=Atom -> Acc0;
+ {atom,_} -> [{jump,Fail}|Acc0];
+ _ -> [I|Acc0]
+ end,
+ Ts = update(I, Ts0),
+ {Rs,Acc} = flush(Rs0, Is0, Acc1),
+ simplify(Is0, Ts, Rs, Acc);
+simplify([I|Is]=Is0, Ts0, Rs0, Acc0) ->
+ Ts = update(I, Ts0),
+ {Rs,Acc} = flush(Rs0, Is0, Acc0),
+ simplify(Is, Ts, Rs, [I|Acc]);
+simplify([], Ts, Rs, Acc) ->
+ Is0 = reverse(flush_all(Rs, [], Acc)),
+ Is1 = opt_fmoves(Is0, []),
+ Is = add_ftest_heap(Is1),
+ {Is,Ts}.
+
+opt_fmoves([{set,[{x,_}=R],[{fr,_}]=Src,fmove}=I1,
+ {set,[{y,_}]=Dst,[{x,_}=R],move}=I2|Is], Acc) ->
+ case beam_block:is_killed(R, Is) of
+ false -> opt_fmoves(Is, [I2,I1|Acc]);
+ true -> opt_fmoves(Is, [{set,Dst,Src,fmove}|Acc])
+ end;
+opt_fmoves([I|Is], Acc) ->
+ opt_fmoves(Is, [I|Acc]);
+opt_fmoves([], Acc) -> reverse(Acc).
+
+clearerror(Is) ->
+ clearerror(Is, Is).
+
+clearerror([{set,[],[],fclearerror}|_], OrigIs) -> OrigIs;
+clearerror([{set,[],[],fcheckerror}|_], OrigIs) -> [{set,[],[],fclearerror}|OrigIs];
+clearerror([_|Is], OrigIs) -> clearerror(Is, OrigIs);
+clearerror([], OrigIs) -> [{set,[],[],fclearerror}|OrigIs].
+
+%% update(Instruction, TypeDb) -> NewTypeDb
+%% Update the type database to account for executing an instruction.
+%%
+%% First the cases for instructions inside basic blocks.
+update({set,[D],[S],move}, Ts0) ->
+ Ops = case tdb_find(S, Ts0) of
+ error -> [{D,kill}];
+ Info -> [{D,Info}]
+ end,
+ tdb_update(Ops, Ts0);
+update({set,[D],[{integer,I},Reg],{bif,element,_}}, Ts0) ->
+ tdb_update([{Reg,{tuple,I,[]}},{D,kill}], Ts0);
+update({set,[D],[_Index,Reg],{bif,element,_}}, Ts0) ->
+ tdb_update([{Reg,{tuple,0,[]}},{D,kill}], Ts0);
+update({set,[D],[S],{get_tuple_element,0}}, Ts) ->
+ tdb_update([{D,{tuple_element,S,0}}], Ts);
+update({set,[D],[S],{bif,float,{f,0}}}, Ts0) ->
+ %% Make sure we reject non-numeric literal argument.
+ case possibly_numeric(S) of
+ true -> tdb_update([{D,float}], Ts0);
+ false -> Ts0
+ end;
+update({set,[D],[S1,S2],{bif,'/',{f,0}}}, Ts0) ->
+ %% Make sure we reject non-numeric literals.
+ case possibly_numeric(S1) andalso possibly_numeric(S2) of
+ true -> tdb_update([{D,float}], Ts0);
+ false -> Ts0
+ end;
+update({set,[D],[S1,S2],{bif,Op,{f,0}}}, Ts0) ->
+ case arith_op(Op) of
+ no ->
+ tdb_update([{D,kill}], Ts0);
+ {yes,_} ->
+ case {tdb_find(S1, Ts0),tdb_find(S2, Ts0)} of
+ {float,_} -> tdb_update([{D,float}], Ts0);
+ {_,float} -> tdb_update([{D,float}], Ts0);
+ {_,_} -> tdb_update([{D,kill}], Ts0)
+ end
+ end;
+update({set,[],_Src,_Op}, Ts0) -> Ts0;
+update({set,[D],_Src,_Op}, Ts0) ->
+ tdb_update([{D,kill}], Ts0);
+update({set,[D1,D2],_Src,_Op}, Ts0) ->
+ tdb_update([{D1,kill},{D2,kill}], Ts0);
+update({allocate,_,_}, Ts) -> Ts;
+update({init,D}, Ts) ->
+ tdb_update([{D,kill}], Ts);
+update({kill,D}, Ts) ->
+ tdb_update([{D,kill}], Ts);
+update({'%live',_}, Ts) -> Ts;
+
+%% Instructions outside of blocks.
+update({test,is_float,_Fail,[Src]}, Ts0) ->
+ tdb_update([{Src,float}], Ts0);
+update({test,test_arity,_Fail,[Src,Arity]}, Ts0) ->
+ tdb_update([{Src,{tuple,Arity,[]}}], Ts0);
+update({test,is_eq_exact,_,[Reg,{atom,_}=Atom]}, Ts) ->
+ case tdb_find(Reg, Ts) of
+ error ->
+ Ts;
+ {tuple_element,TupleReg,0} ->
+ tdb_update([{TupleReg,{tuple,1,[Atom]}}], Ts);
+ _ ->
+ Ts
+ end;
+update({test,_Test,_Fail,_Other}, Ts) -> Ts;
+update({call_ext,1,{extfunc,math,Math,1}}, Ts) ->
+ case is_math_bif(Math, 1) of
+ true -> tdb_update([{{x,0},float}], Ts);
+ false -> tdb_kill_xregs(Ts)
+ end;
+update({call_ext,2,{extfunc,math,Math,2}}, Ts) ->
+ case is_math_bif(Math, 2) of
+ true -> tdb_update([{{x,0},float}], Ts);
+ false -> tdb_kill_xregs(Ts)
+ end;
+update({call_ext,3,{extfunc,erlang,setelement,3}}, Ts0) ->
+ Op = case tdb_find({x,1}, Ts0) of
+ error -> kill;
+ Info -> Info
+ end,
+ Ts1 = tdb_kill_xregs(Ts0),
+ tdb_update([{{x,0},Op}], Ts1);
+update({call,_Arity,_Func}, Ts) -> tdb_kill_xregs(Ts);
+update({call_ext,_Arity,_Func}, Ts) -> tdb_kill_xregs(Ts);
+update({make_fun2,_,_,_,_}, Ts) -> tdb_kill_xregs(Ts);
+
+%% The instruction is unknown. Kill all information.
+update(_I, _Ts) -> tdb_new().
+
+is_math_bif(cos, 1) -> true;
+is_math_bif(cosh, 1) -> true;
+is_math_bif(sin, 1) -> true;
+is_math_bif(sinh, 1) -> true;
+is_math_bif(tan, 1) -> true;
+is_math_bif(tanh, 1) -> true;
+is_math_bif(acos, 1) -> true;
+is_math_bif(acosh, 1) -> true;
+is_math_bif(asin, 1) -> true;
+is_math_bif(asinh, 1) -> true;
+is_math_bif(atan, 1) -> true;
+is_math_bif(atanh, 1) -> true;
+is_math_bif(erf, 1) -> true;
+is_math_bif(erfc, 1) -> true;
+is_math_bif(exp, 1) -> true;
+is_math_bif(log, 1) -> true;
+is_math_bif(log10, 1) -> true;
+is_math_bif(sqrt, 1) -> true;
+is_math_bif(atan2, 2) -> true;
+is_math_bif(pow, 2) -> true;
+is_math_bif(pi, 0) -> true;
+is_math_bif(_, _) -> false.
+
+%% Reject non-numeric literals.
+possibly_numeric({x,_}) -> true;
+possibly_numeric({y,_}) -> true;
+possibly_numeric({integer,_}) -> true;
+possibly_numeric({float,_}) -> true;
+possibly_numeric(_) -> false.
+
+max_tuple_size(Reg, Ts) ->
+ case tdb_find(Reg, Ts) of
+ {tuple,Sz,_} -> Sz;
+ _Other -> 0
+ end.
+
+float_op('/', A, B, _) ->
+ case possibly_numeric(A) andalso possibly_numeric(B) of
+ true -> {yes,fdiv};
+ false -> no
+ end;
+float_op(Op, {float,_}, B, _) ->
+ case possibly_numeric(B) of
+ true -> arith_op(Op);
+ false -> no
+ end;
+float_op(Op, A, {float,_}, _) ->
+ case possibly_numeric(A) of
+ true -> arith_op(Op);
+ false -> no
+ end;
+float_op(Op, A, B, Ts) ->
+ case {tdb_find(A, Ts),tdb_find(B, Ts)} of
+ {float,_} -> arith_op(Op);
+ {_,float} -> arith_op(Op);
+ {_,_} -> no
+ end.
+
+find_dest(V, Rs0) ->
+ case find_reg(V, Rs0) of
+ {ok,FR} ->
+ {FR,mark(V, Rs0, dirty)};
+ error ->
+ Rs = put_reg(V, Rs0, dirty),
+ {ok,FR} = find_reg(V, Rs),
+ {FR,Rs}
+ end.
+
+load_reg({float,_}=F, _, Rs0, Is0) ->
+ Rs = put_reg(F, Rs0, clean),
+ {ok,FR} = find_reg(F, Rs),
+ Is = [{set,[FR],[F],fmove}|Is0],
+ {Rs,Is};
+load_reg(V, Ts, Rs0, Is0) ->
+ case find_reg(V, Rs0) of
+ {ok,_FR} -> {Rs0,Is0};
+ error ->
+ Rs = put_reg(V, Rs0, clean),
+ {ok,FR} = find_reg(V, Rs),
+ Op = case tdb_find(V, Ts) of
+ float -> fmove;
+ _ -> fconv
+ end,
+ Is = [{set,[FR],[V],Op}|Is0],
+ {Rs,Is}
+ end.
+
+arith_op('+') -> {yes,fadd};
+arith_op('-') -> {yes,fsub};
+arith_op('*') -> {yes,fmul};
+arith_op('/') -> {yes,fdiv};
+arith_op(_) -> no.
+
+flush(no_float_opt, _, Acc) -> {no_float_opt,Acc};
+flush(Rs, [{set,[_],[],{put_tuple,_}}|_]=Is0, Acc0) ->
+ Acc = flush_all(Rs, Is0, Acc0),
+ {[],Acc};
+flush(Rs0, [{set,Ds,Ss,_Op}|_], Acc0) ->
+ Save = gb_sets:from_list(Ss),
+ Acc = save_regs(Rs0, Save, Acc0),
+ Rs1 = foldl(fun(S, A) -> mark(S, A, clean) end, Rs0, Ss),
+ Kill = gb_sets:from_list(Ds),
+ Rs = kill_regs(Rs1, Kill),
+ {Rs,Acc};
+flush(Rs0, Is, Acc0) ->
+ Acc = flush_all(Rs0, Is, Acc0),
+ {[],Acc}.
+
+flush_all(no_float_opt, _, Acc) -> Acc;
+flush_all([{_,{float,_},_}|Rs], Is, Acc) ->
+ flush_all(Rs, Is, Acc);
+flush_all([{I,V,dirty}|Rs], Is, Acc0) ->
+ Acc = checkerror(Acc0),
+ case beam_block:is_killed(V, Is) of
+ true -> flush_all(Rs, Is, Acc);
+ false -> flush_all(Rs, Is, [{set,[V],[{fr,I}],fmove}|Acc])
+ end;
+flush_all([{_,_,clean}|Rs], Is, Acc) -> flush_all(Rs, Is, Acc);
+flush_all([free|Rs], Is, Acc) -> flush_all(Rs, Is, Acc);
+flush_all([], _, Acc) -> Acc.
+
+save_regs(Rs, Save, Acc) ->
+ foldl(fun(R, A) -> save_reg(R, Save, A) end, Acc, Rs).
+
+save_reg({I,V,dirty}, Save, Acc) ->
+ case gb_sets:is_member(V, Save) of
+ true -> [{set,[V],[{fr,I}],fmove}|checkerror(Acc)];
+ false -> Acc
+ end;
+save_reg(_, _, Acc) -> Acc.
+
+kill_regs(Rs, Kill) ->
+ map(fun(R) -> kill_reg(R, Kill) end, Rs).
+
+kill_reg({_,V,_}=R, Kill) ->
+ case gb_sets:is_member(V, Kill) of
+ true -> free;
+ false -> R
+ end;
+kill_reg(R, _) -> R.
+
+mark(V, [{I,V,_}|Rs], Mark) -> [{I,V,Mark}|Rs];
+mark(V, [R|Rs], Mark) -> [R|mark(V, Rs, Mark)];
+mark(_, [], _) -> [].
+
+fetch_reg(V, [{I,V,_}|_]) -> {fr,I};
+fetch_reg(V, [_|SRs]) -> fetch_reg(V, SRs).
+
+find_reg(V, [{I,V,_}|_]) -> {ok,{fr,I}};
+find_reg(V, [_|SRs]) -> find_reg(V, SRs);
+find_reg(_, []) -> error.
+
+put_reg(V, Rs, Dirty) -> put_reg_1(V, Rs, Dirty, 0).
+
+put_reg_1(V, [free|Rs], Dirty, I) -> [{I,V,Dirty}|Rs];
+put_reg_1(V, [R|Rs], Dirty, I) -> [R|put_reg_1(V, Rs, Dirty, I+1)];
+put_reg_1(V, [], Dirty, I) -> [{I,V,Dirty}].
+
+checkerror(Is) ->
+ checkerror_1(Is, Is).
+
+checkerror_1([{set,[],[],fcheckerror}|_], OrigIs) -> OrigIs;
+checkerror_1([{set,[],[],fclearerror}|_], OrigIs) -> OrigIs;
+checkerror_1([{set,_,_,{bif,fadd,_}}|_], OrigIs) -> checkerror_2(OrigIs);
+checkerror_1([{set,_,_,{bif,fsub,_}}|_], OrigIs) -> checkerror_2(OrigIs);
+checkerror_1([{set,_,_,{bif,fmul,_}}|_], OrigIs) -> checkerror_2(OrigIs);
+checkerror_1([{set,_,_,{bif,fdiv,_}}|_], OrigIs) -> checkerror_2(OrigIs);
+checkerror_1([{set,_,_,{bif,fnegate,_}}|_], OrigIs) -> checkerror_2(OrigIs);
+checkerror_1([_|Is], OrigIs) -> checkerror_1(Is, OrigIs);
+checkerror_1([], OrigIs) -> OrigIs.
+
+checkerror_2(OrigIs) -> [{set,[],[],fcheckerror}|OrigIs].
+
+add_ftest_heap(Is) ->
+ add_ftest_heap_1(reverse(Is), 0, []).
+
+add_ftest_heap_1([{set,_,[{fr,_}],fmove}=I|Is], Floats, Acc) ->
+ add_ftest_heap_1(Is, Floats+1, [I|Acc]);
+add_ftest_heap_1([{allocate,_,_}=I|Is], 0, Acc) ->
+ reverse(Is, [I|Acc]);
+add_ftest_heap_1([{allocate,Regs,{Z,Stk,Heap,Inits}}|Is], Floats, Acc) ->
+ reverse(Is, [{allocate,Regs,{Z,Stk,Heap,Floats,Inits}}|Acc]);
+add_ftest_heap_1([I|Is], Floats, Acc) ->
+ add_ftest_heap_1(Is, Floats, [I|Acc]);
+add_ftest_heap_1([], 0, Acc) ->
+ Acc;
+add_ftest_heap_1([], Floats, Is) ->
+ Regs = beam_block:live_at_entry(Is),
+ [{allocate,Regs,{nozero,nostack,0,Floats,[]}}|Is].
+
+are_live_regs_determinable([{allocate,_,_}|_]) -> true;
+are_live_regs_determinable([{'%live',_}|_]) -> true;
+are_live_regs_determinable([_|Is]) -> are_live_regs_determinable(Is);
+are_live_regs_determinable([]) -> false.
+
+
+%%% Routines for maintaining a type database. The type database
+%%% associates type information with registers.
+%%%
+%%% {tuple,Size,First} means that the corresponding register contains a
+%%% tuple with *at least* Size elements. An tuple with unknown
+%%% size is represented as {tuple,0}. First is either [] (meaning that
+%%% the tuple's first element is unknown) or [FirstElement] (the contents
+%%% of the first element).
+%%%
+%%% 'float' means that the register contains a float.
+
+%% tdb_new() -> EmptyDataBase
+%% Creates a new, empty type database.
+
+tdb_new() -> [].
+
+%% tdb_find(Register, Db) -> Information|error
+%% Returns type information or the atom error if there are no type
+%% information available for Register.
+
+tdb_find(Key, [{K,_}|_]) when Key < K -> error;
+tdb_find(Key, [{Key,Info}|_]) -> Info;
+tdb_find(Key, [_|Db]) -> tdb_find(Key, Db);
+tdb_find(_, []) -> error.
+
+%% tdb_update([UpdateOp], Db) -> NewDb
+%% UpdateOp = {Register,kill}|{Register,NewInfo}
+%% Updates a type database. If a 'kill' operation is given, the type
+%% information for that register will be removed from the database.
+%% A kill operation takes precende over other operations for the same
+%% register (i.e. [{{x,0},kill},{{x,0},{tuple,5}}] means that the
+%% the existing type information, if any, will be discarded, and the
+%% the '{tuple,5}' information ignored.
+%%
+%% If NewInfo information is given and there exists information about
+%% the register, the old and new type information will be merged.
+%% For instance, {tuple,5} and {tuple,10} will be merged to produce
+%% {tuple,10}.
+
+tdb_update(Uis0, Ts0) ->
+ Uis1 = filter(fun ({{x,_},_Op}) -> true;
+ ({{y,_},_Op}) -> true;
+ (_) -> false
+ end, Uis0),
+ tdb_update1(lists:sort(Uis1), Ts0).
+
+tdb_update1([{Key,kill}|Ops], [{K,_Old}|_]=Db) when Key < K ->
+ tdb_update1(remove_key(Key, Ops), Db);
+tdb_update1([{Key,_New}=New|Ops], [{K,_Old}|_]=Db) when Key < K ->
+ [New|tdb_update1(Ops, Db)];
+tdb_update1([{Key,kill}|Ops], [{Key,_}|Db]) ->
+ tdb_update1(remove_key(Key, Ops), Db);
+tdb_update1([{Key,NewInfo}|Ops], [{Key,OldInfo}|Db]) ->
+ [{Key,merge_type_info(NewInfo, OldInfo)}|tdb_update1(Ops, Db)];
+tdb_update1([{_,_}|_]=Ops, [Old|Db]) ->
+ [Old|tdb_update1(Ops, Db)];
+tdb_update1([{Key,kill}|Ops], []) ->
+ tdb_update1(remove_key(Key, Ops), []);
+tdb_update1([{_,_}=New|Ops], []) ->
+ [New|tdb_update1(Ops, [])];
+tdb_update1([], Db) -> Db.
+
+%% tdb_kill_xregs(Db) -> NewDb
+%% Kill all information about x registers. Also kill all tuple_element
+%% dependencies from y registers to x registers.
+
+tdb_kill_xregs([{{x,_},_Type}|Db]) -> tdb_kill_xregs(Db);
+tdb_kill_xregs([{{y,_},{tuple_element,{x,_},_}}|Db]) -> tdb_kill_xregs(Db);
+tdb_kill_xregs([Any|Db]) -> [Any|tdb_kill_xregs(Db)];
+tdb_kill_xregs([]) -> [].
+
+remove_key(Key, [{Key,_Op}|Ops]) -> remove_key(Key, Ops);
+remove_key(_, Ops) -> Ops.
+
+merge_type_info(I, I) -> I;
+merge_type_info({tuple,Sz1,Same}, {tuple,Sz2,Same}=Max) when Sz1 < Sz2 ->
+ Max;
+merge_type_info({tuple,Sz1,Same}=Max, {tuple,Sz2,Same}) when Sz1 > Sz2 ->
+ Max;
+merge_type_info({tuple,Sz1,[]}, {tuple,Sz2,First}) ->
+ merge_type_info({tuple,Sz1,First}, {tuple,Sz2,First});
+merge_type_info({tuple,Sz1,First}, {tuple,Sz2,_}) ->
+ merge_type_info({tuple,Sz1,First}, {tuple,Sz2,First});
+merge_type_info(NewType, _) ->
+ verify_type(NewType),
+ NewType.
+
+verify_type({tuple,Sz,[]}) when is_integer(Sz) -> ok;
+verify_type({tuple,Sz,[_]}) when is_integer(Sz) -> ok;
+verify_type({tuple_element,_,_}) -> ok;
+verify_type(float) -> ok;
+verify_type({atom,_}) -> ok.
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_validator.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_validator.erl
new file mode 100644
index 0000000000..87c1c54d0f
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/beam_validator.erl
@@ -0,0 +1,1022 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: beam_validator.erl,v 1.1 2008/12/17 09:53:41 mikpe Exp $
+
+-module(beam_validator).
+
+-export([file/1,files/1]).
+
+%% Interface for compiler.
+-export([module/2,format_error/1]).
+
+-import(lists, [reverse/1,foldl/3]).
+
+-define(MAXREG, 1024).
+
+-define(DEBUG, 1).
+-undef(DEBUG).
+-ifdef(DEBUG).
+-define(DBG_FORMAT(F, D), (io:format((F), (D)))).
+-else.
+-define(DBG_FORMAT(F, D), ok).
+-endif.
+
+%%%
+%%% API functions.
+%%%
+
+files([F|Fs]) ->
+ ?DBG_FORMAT("# Verifying: ~p~n", [F]),
+ case file(F) of
+ ok -> ok;
+ {error,Es} ->
+ io:format("~p:~n~s~n", [F,format_error(Es)])
+ end,
+ files(Fs);
+files([]) -> ok.
+
+file(Name) when is_list(Name) ->
+ case case filename:extension(Name) of
+ ".S" -> s_file(Name);
+ ".beam" -> beam_file(Name)
+ end of
+ [] -> ok;
+ Es -> {error,Es}
+ end.
+
+%% To be called by the compiler.
+module({Mod,Exp,Attr,Fs,Lc}=Code, _Opts)
+ when is_atom(Mod), is_list(Exp), is_list(Attr), is_integer(Lc) ->
+ case validate(Fs) of
+ [] -> {ok,Code};
+ Es0 ->
+ Es = [{?MODULE,E} || E <- Es0],
+ {error,[{atom_to_list(Mod),Es}]}
+ end.
+
+format_error([]) -> [];
+format_error([{{M,F,A},{I,Off,Desc}}|Es]) ->
+ [io_lib:format(" ~p:~p/~p+~p:~n ~p - ~p~n",
+ [M,F,A,Off,I,Desc])|format_error(Es)];
+format_error({{_M,F,A},{I,Off,Desc}}) ->
+ io_lib:format(
+ "function ~p/~p+~p:~n"
+ " Internal consistency check failed - please report this bug.~n"
+ " Instruction: ~p~n"
+ " Error: ~p:~n", [F,A,Off,I,Desc]).
+
+%%%
+%%% Local functions follow.
+%%%
+
+s_file(Name) ->
+ {ok,Is} = file:consult(Name),
+ Fs = find_functions(Is),
+ validate(Fs).
+
+find_functions(Fs) ->
+ find_functions_1(Fs, none, [], []).
+
+find_functions_1([{function,Name,Arity,Entry}|Is], Func, FuncAcc, Acc0) ->
+ Acc = add_func(Func, FuncAcc, Acc0),
+ find_functions_1(Is, {Name,Arity,Entry}, [], Acc);
+find_functions_1([I|Is], Func, FuncAcc, Acc) ->
+ find_functions_1(Is, Func, [I|FuncAcc], Acc);
+find_functions_1([], Func, FuncAcc, Acc) ->
+ reverse(add_func(Func, FuncAcc, Acc)).
+
+add_func(none, _, Acc) -> Acc;
+add_func({Name,Arity,Entry}, Is, Acc) ->
+ [{function,Name,Arity,Entry,reverse(Is)}|Acc].
+
+beam_file(Name) ->
+ try beam_disasm:file(Name) of
+ {error,beam_lib,Reason} -> [{beam_lib,Reason}];
+ {beam_file,L} ->
+ {value,{code,Code0}} = lists:keysearch(code, 1, L),
+ Code = beam_file_1(Code0, []),
+ validate(Code)
+ catch _:_ -> [disassembly_failed]
+ end.
+
+beam_file_1([F0|Fs], Acc) ->
+ F = conv_func(F0),
+ beam_file_1(Fs, [F|Acc]);
+beam_file_1([], Acc) -> reverse(Acc).
+
+%% Convert from the disassembly format to the internal format
+%% used by the compiler (as passed to the assembler).
+
+conv_func(Is) ->
+ conv_func_1(labels(Is)).
+
+conv_func_1({Ls,[{func_info,[{atom,M},{atom,F},Ar]},
+ {label,Entry}=Le|Is]}) ->
+ %% The entry label gets maybe not correct here
+ {function,F,Ar,Entry,
+ [{label,L}||L<-Ls]++[{func_info,{atom,M},{atom,F},Ar},Le|Is]}.
+
+%%%
+%%% The validator follows.
+%%%
+%%% The purpose of the validator is find errors in the generated code
+%%% that may cause the emulator to crash or behave strangely.
+%%% We don't care about type errors in the user's code that will
+%%% cause a proper exception at run-time.
+%%%
+
+%%% Things currently not checked. XXX
+%%%
+%%% - That floating point registers are initialized before used.
+%%% - That fclearerror and fcheckerror are used properly.
+%%% - Heap allocation for floating point numbers.
+%%% - Heap allocation for binaries.
+%%% - That a catchtag or trytag is not overwritten by the wrong
+%%% type of instruction (such as move/2).
+%%% - Make sure that all catchtags and trytags have been removed
+%%% from the stack at return/tail call.
+%%% - Verify get_list instructions.
+%%%
+
+%% validate([Function]) -> [] | [Error]
+%% A list of functions with their code. The code is in the same
+%% format as used in the compiler and in .S files.
+validate([]) -> [];
+validate([{function,Name,Ar,Entry,Code}|Fs]) ->
+ try validate_1(Code, Name, Ar, Entry) of
+ _ -> validate(Fs)
+ catch
+ Error ->
+ [Error|validate(Fs)];
+ error:Error ->
+ [validate_error(Error, Name, Ar)|validate(Fs)]
+ end.
+
+-ifdef(DEBUG).
+validate_error(Error, Name, Ar) ->
+ exit(validate_error_1(Error, Name, Ar)).
+-else.
+validate_error(Error, Name, Ar) ->
+ validate_error_1(Error, Name, Ar).
+-endif.
+validate_error_1(Error, Name, Ar) ->
+ {{'_',Name,Ar},
+ {internal_error,'_',{Error,erlang:get_stacktrace()}}}.
+
+-record(st, %Emulation state
+ {x=init_regs(0, term), %x register info.
+ y=init_regs(0, initialized), %y register info.
+ numy=none, %Number of y registers.
+ h=0, %Available heap size.
+ ct=[] %List of hot catch/try labels
+ }).
+
+-record(vst, %Validator state
+ {current=none, %Current state
+ branched=gb_trees:empty() %States at jumps
+ }).
+
+-ifdef(DEBUG).
+print_st(#st{x=Xs,y=Ys,numy=NumY,h=H,ct=Ct}) ->
+ io:format(" #st{x=~p~n"
+ " y=~p~n"
+ " numy=~p,h=~p,ct=~w~n",
+ [gb_trees:to_list(Xs),gb_trees:to_list(Ys),NumY,H,Ct]).
+-endif.
+
+validate_1(Is, Name, Arity, Entry) ->
+ validate_2(labels(Is), Name, Arity, Entry).
+
+validate_2({Ls1,[{func_info,{atom,Mod},{atom,Name},Arity}=_F|Is]},
+ Name, Arity, Entry) ->
+ lists:foreach(fun (_L) -> ?DBG_FORMAT(" ~p.~n", [_L]) end, Ls1),
+ ?DBG_FORMAT(" ~p.~n", [_F]),
+ validate_3(labels(Is), Name, Arity, Entry, Mod, Ls1);
+validate_2({Ls1,Is}, Name, Arity, _Entry) ->
+ error({{'_',Name,Arity},{first(Is),length(Ls1),illegal_instruction}}).
+
+validate_3({Ls2,Is}, Name, Arity, Entry, Mod, Ls1) ->
+ lists:foreach(fun (_L) -> ?DBG_FORMAT(" ~p.~n", [_L]) end, Ls2),
+ Offset = 1 + length(Ls2),
+ case lists:member(Entry, Ls2) of
+ true ->
+ St = init_state(Arity),
+ Vst = #vst{current=St,
+ branched=gb_trees_from_list([{L,St} || L <- Ls1])},
+ valfun(Is, {Mod,Name,Arity}, Offset, Vst);
+ false ->
+ error({{Mod,Name,Arity},{first(Is),Offset,no_entry_label}})
+ end.
+
+first([X|_]) -> X;
+first([]) -> [].
+
+labels(Is) ->
+ labels_1(Is, []).
+
+labels_1([{label,L}|Is], R) ->
+ labels_1(Is, [L|R]);
+labels_1(Is, R) ->
+ {lists:reverse(R),Is}.
+
+init_state(Arity) ->
+ Xs = init_regs(Arity, term),
+ Ys = init_regs(0, initialized),
+ #st{x=Xs,y=Ys,numy=none,h=0,ct=[]}.
+
+init_regs(0, _) ->
+ gb_trees:empty();
+init_regs(N, Type) ->
+ gb_trees_from_list([{R,Type} || R <- lists:seq(0, N-1)]).
+
+valfun([], _MFA, _Offset, Vst) -> Vst;
+valfun([I|Is], MFA, Offset, Vst) ->
+ ?DBG_FORMAT(" ~p.\n", [I]),
+ valfun(Is, MFA, Offset+1,
+ try valfun_1(I, Vst)
+ catch Error ->
+ error({MFA,{I,Offset,Error}})
+ end).
+
+%% Instructions that are allowed in dead code or when failing,
+%% that is while the state is undecided in some way.
+valfun_1({label,Lbl}, #vst{current=St0,branched=B}=Vst) ->
+ St = merge_states(Lbl, St0, B),
+ Vst#vst{current=St,branched=gb_trees:enter(Lbl, St, B)};
+valfun_1(_I, #vst{current=none}=Vst) ->
+ %% Ignore instructions after erlang:error/1,2, which
+ %% the original R10B compiler thought would return.
+ ?DBG_FORMAT("Ignoring ~p\n", [_I]),
+ Vst;
+valfun_1({badmatch,Src}, Vst) ->
+ assert_term(Src, Vst),
+ kill_state(Vst);
+valfun_1({case_end,Src}, Vst) ->
+ assert_term(Src, Vst),
+ kill_state(Vst);
+valfun_1(if_end, Vst) ->
+ kill_state(Vst);
+valfun_1({try_case_end,Src}, Vst) ->
+ assert_term(Src, Vst),
+ kill_state(Vst);
+%% Instructions that can not cause exceptions
+valfun_1({move,Src,Dst}, Vst) ->
+ Type = get_term_type(Src, Vst),
+ set_type_reg(Type, Dst, Vst);
+valfun_1({fmove,Src,{fr,_}}, Vst) ->
+ assert_type(float, Src, Vst);
+valfun_1({fmove,{fr,_},Dst}, Vst) ->
+ set_type_reg({float,[]}, Dst, Vst);
+valfun_1({kill,{y,_}=Reg}, Vst) ->
+ set_type_y(initialized, Reg, Vst);
+valfun_1({test_heap,Heap,Live}, Vst) ->
+ test_heap(Heap, Live, Vst);
+valfun_1({bif,_Op,nofail,Src,Dst}, Vst) ->
+ validate_src(Src, Vst),
+ set_type_reg(term, Dst, Vst);
+%% Put instructions.
+valfun_1({put_list,A,B,Dst}, Vst0) ->
+ assert_term(A, Vst0),
+ assert_term(B, Vst0),
+ Vst = eat_heap(2, Vst0),
+ set_type_reg(cons, Dst, Vst);
+valfun_1({put_tuple,Sz,Dst}, Vst0) when is_integer(Sz) ->
+ Vst = eat_heap(1, Vst0),
+ set_type_reg({tuple,Sz}, Dst, Vst);
+valfun_1({put,Src}, Vst) ->
+ assert_term(Src, Vst),
+ eat_heap(1, Vst);
+valfun_1({put_string,Sz,_,Dst}, Vst0) when is_integer(Sz) ->
+ Vst = eat_heap(2*Sz, Vst0),
+ set_type_reg(cons, Dst, Vst);
+%% Allocate and deallocate, et.al
+valfun_1({allocate,Stk,Live}, Vst) ->
+ allocate(false, Stk, 0, Live, Vst);
+valfun_1({allocate_heap,Stk,Heap,Live}, Vst) ->
+ allocate(false, Stk, Heap, Live, Vst);
+valfun_1({allocate_zero,Stk,Live}, Vst) ->
+ allocate(true, Stk, 0, Live, Vst);
+valfun_1({allocate_heap_zero,Stk,Heap,Live}, Vst) ->
+ allocate(true, Stk, Heap, Live, Vst);
+valfun_1({init,{y,_}=Reg}, Vst) ->
+ set_type_y(initialized, Reg, Vst);
+valfun_1({deallocate,StkSize}, #vst{current=#st{numy=StkSize,ct=[]}}=Vst) ->
+ deallocate(Vst);
+valfun_1({deallocate,_}, #vst{current=#st{numy=NumY,ct=[]}}) ->
+ error({allocated,NumY});
+valfun_1({deallocate,_}, #vst{current=#st{ct=Fails}}) ->
+ error({catch_try_stack,Fails});
+%% Catch & try.
+valfun_1({'catch',Dst,{f,Fail}}, Vst0) when Fail /= none ->
+ Vst = #vst{current=#st{ct=Fails}=St} =
+ set_type_y({catchtag,Fail}, Dst, Vst0),
+ Vst#vst{current=St#st{ct=[Fail|Fails]}};
+valfun_1({'try',Dst,{f,Fail}}, Vst0) ->
+ Vst = #vst{current=#st{ct=Fails}=St} =
+ set_type_y({trytag,Fail}, Dst, Vst0),
+ Vst#vst{current=St#st{ct=[Fail|Fails]}};
+%% Do a postponed state branch if necessary and try next set of instructions
+valfun_1(I, #vst{current=#st{ct=[]}}=Vst) ->
+ valfun_2(I, Vst);
+valfun_1(I, #vst{current=#st{ct=Fails}}=Vst0) ->
+ %% Perform a postponed state branch
+ Vst = #vst{current=St} = lists:foldl(fun branch_state/2, Vst0, Fails),
+ valfun_2(I, Vst#vst{current=St#st{ct=[]}}).
+
+%% Instructions that can cause exceptions.
+valfun_2({apply,Live}, Vst) ->
+ call(Live+2, Vst);
+valfun_2({apply_last,Live,_}, Vst) ->
+ tail_call(Live+2, Vst);
+valfun_2({call_fun,Live}, Vst) ->
+ call(Live, Vst);
+valfun_2({call,Live,_}, Vst) ->
+ call(Live, Vst);
+valfun_2({call_ext,Live,Func}, Vst) ->
+ call(Func, Live, Vst);
+valfun_2({call_only,Live,_}, Vst) ->
+ tail_call(Live, Vst);
+valfun_2({call_ext_only,Live,_}, Vst) ->
+ tail_call(Live, Vst);
+valfun_2({call_last,Live,_,_}, Vst) ->
+ tail_call(Live, Vst);
+valfun_2({call_ext_last,Live,_,_}, Vst) ->
+ tail_call(Live, Vst);
+valfun_2({make_fun,_,_,Live}, Vst) ->
+ call(Live, Vst);
+valfun_2({make_fun2,_,_,_,Live}, Vst) ->
+ call(Live, Vst);
+%% Floating point.
+valfun_2({fconv,Src,{fr,_}}, Vst) ->
+ assert_term(Src, Vst);
+valfun_2({bif,fadd,_,[{fr,_},{fr,_}],{fr,_}}, Vst) ->
+ Vst;
+valfun_2({bif,fdiv,_,[{fr,_},{fr,_}],{fr,_}}, Vst) ->
+ Vst;
+valfun_2({bif,fmul,_,[{fr,_},{fr,_}],{fr,_}}, Vst) ->
+ Vst;
+valfun_2({bif,fnegate,_,[{fr,_}],{fr,_}}, Vst) ->
+ Vst;
+valfun_2({bif,fsub,_,[{fr,_},{fr,_}],{fr,_}}, Vst) ->
+ Vst;
+valfun_2(fclearerror, Vst) ->
+ Vst;
+valfun_2({fcheckerror,_}, Vst) ->
+ Vst;
+%% Other BIFs
+valfun_2({bif,element,{f,Fail},[Pos,Tuple],Dst}, Vst0) ->
+ TupleType0 = get_term_type(Tuple, Vst0),
+ PosType = get_term_type(Pos, Vst0),
+ Vst1 = branch_state(Fail, Vst0),
+ TupleType = upgrade_type({tuple,[get_tuple_size(PosType)]}, TupleType0),
+ Vst = set_type(TupleType, Tuple, Vst1),
+ set_type_reg(term, Dst, Vst);
+valfun_2({bif,Op,{f,Fail},Src,Dst}, Vst0) ->
+ validate_src(Src, Vst0),
+ Vst = branch_state(Fail, Vst0),
+ Type = bif_type(Op, Src, Vst),
+ set_type_reg(Type, Dst, Vst);
+valfun_2(return, #vst{current=#st{numy=none}}=Vst) ->
+ kill_state(Vst);
+valfun_2(return, #vst{current=#st{numy=NumY}}) ->
+ error({stack_frame,NumY});
+valfun_2({jump,{f,_}}, #vst{current=none}=Vst) ->
+ %% Must be an unreachable jump which was not optimized away.
+ %% Do nothing.
+ Vst;
+valfun_2({jump,{f,Lbl}}, Vst) ->
+ kill_state(branch_state(Lbl, Vst));
+valfun_2({loop_rec,{f,Fail},Dst}, Vst0) ->
+ Vst = branch_state(Fail, Vst0),
+ set_type_reg(term, Dst, Vst);
+valfun_2(remove_message, Vst) ->
+ Vst;
+valfun_2({wait,_}, Vst) ->
+ kill_state(Vst);
+valfun_2({wait_timeout,_,Src}, Vst) ->
+ assert_term(Src, Vst);
+valfun_2({loop_rec_end,_}, Vst) ->
+ kill_state(Vst);
+valfun_2(timeout, #vst{current=St}=Vst) ->
+ Vst#vst{current=St#st{x=init_regs(0, term)}};
+valfun_2(send, Vst) ->
+ call(2, Vst);
+%% Catch & try.
+valfun_2({catch_end,Reg}, Vst0) ->
+ case get_type(Reg, Vst0) of
+ {catchtag,_} ->
+ Vst = #vst{current=St} = set_type_reg(initialized, Reg, Vst0),
+ Xs = gb_trees_from_list([{0,term}]),
+ Vst#vst{current=St#st{x=Xs}};
+ Type ->
+ error({bad_type,Type})
+ end;
+valfun_2({try_end,Reg}, Vst) ->
+ case get_type(Reg, Vst) of
+ {trytag,_} ->
+ set_type_reg(initialized, Reg, Vst);
+ Type ->
+ error({bad_type,Type})
+ end;
+valfun_2({try_case,Reg}, Vst0) ->
+ case get_type(Reg, Vst0) of
+ {trytag,_} ->
+ Vst = #vst{current=St} = set_type_reg(initialized, Reg, Vst0),
+ Xs = gb_trees_from_list([{0,{atom,[]}},{1,term},{2,term}]),
+ Vst#vst{current=St#st{x=Xs}};
+ Type ->
+ error({bad_type,Type})
+ end;
+valfun_2({set_tuple_element,Src,Tuple,I}, Vst) ->
+ assert_term(Src, Vst),
+ assert_type({tuple_element,I+1}, Tuple, Vst);
+%% Match instructions.
+valfun_2({select_val,Src,{f,Fail},{list,Choices}}, Vst) ->
+ assert_term(Src, Vst),
+ Lbls = [L || {f,L} <- Choices]++[Fail],
+ kill_state(foldl(fun(L, S) -> branch_state(L, S) end, Vst, Lbls));
+valfun_2({select_tuple_arity,Tuple,{f,Fail},{list,Choices}}, Vst) ->
+ assert_type(tuple, Tuple, Vst),
+ kill_state(branch_arities(Choices, Tuple, branch_state(Fail, Vst)));
+valfun_2({get_list,Src,D1,D2}, Vst0) ->
+ assert_term(Src, Vst0),
+ Vst = set_type_reg(term, D1, Vst0),
+ set_type_reg(term, D2, Vst);
+valfun_2({get_tuple_element,Src,I,Dst}, Vst) ->
+ assert_type({tuple_element,I+1}, Src, Vst),
+ set_type_reg(term, Dst, Vst);
+valfun_2({bs_restore,_}, Vst) ->
+ Vst;
+valfun_2({bs_save,_}, Vst) ->
+ Vst;
+valfun_2({bs_start_match,{f,Fail},Src}, Vst) ->
+ assert_term(Src, Vst),
+ branch_state(Fail, Vst);
+valfun_2({test,bs_skip_bits,{f,Fail},[Src,_,_]}, Vst) ->
+ assert_term(Src, Vst),
+ branch_state(Fail, Vst);
+valfun_2({test,_,{f,Fail},[_,_,_,Dst]}, Vst0) ->
+ Vst = branch_state(Fail, Vst0),
+ set_type_reg({integer,[]}, Dst, Vst);
+valfun_2({test,bs_test_tail,{f,Fail},_}, Vst) ->
+ branch_state(Fail, Vst);
+%% Other test instructions.
+valfun_2({test,is_float,{f,Lbl},[Float]}, Vst0) ->
+ assert_term(Float, Vst0),
+ Vst = branch_state(Lbl, Vst0),
+ set_type({float,[]}, Float, Vst);
+valfun_2({test,is_tuple,{f,Lbl},[Tuple]}, Vst0) ->
+ assert_term(Tuple, Vst0),
+ Vst = branch_state(Lbl, Vst0),
+ set_type({tuple,[0]}, Tuple, Vst);
+valfun_2({test,test_arity,{f,Lbl},[Tuple,Sz]}, Vst0) when is_integer(Sz) ->
+ assert_type(tuple, Tuple, Vst0),
+ Vst = branch_state(Lbl, Vst0),
+ set_type_reg({tuple,Sz}, Tuple, Vst);
+valfun_2({test,_Op,{f,Lbl},Src}, Vst) ->
+ validate_src(Src, Vst),
+ branch_state(Lbl, Vst);
+valfun_2({bs_add,{f,Fail},[A,B,_],Dst}, Vst0) ->
+ assert_term(A, Vst0),
+ assert_term(B, Vst0),
+ Vst = branch_state(Fail, Vst0),
+ set_type_reg({integer,[]}, Dst, Vst);
+valfun_2({bs_bits_to_bytes,{f,Fail},Src,Dst}, Vst0) ->
+ assert_term(Src, Vst0),
+ Vst = branch_state(Fail, Vst0),
+ set_type_reg({integer,[]}, Dst, Vst);
+valfun_2({bs_init2,{f,Fail},_,Heap,_,_,Dst}, Vst0) ->
+ Vst1 = heap_alloc(Heap, Vst0),
+ Vst = branch_state(Fail, Vst1),
+ set_type_reg(binary, Dst, Vst);
+valfun_2({bs_put_string,Sz,_}, Vst) when is_integer(Sz) ->
+ Vst;
+valfun_2({bs_put_binary,{f,Fail},_,_,_,Src}, Vst0) ->
+ assert_term(Src, Vst0),
+ branch_state(Fail, Vst0);
+valfun_2({bs_put_float,{f,Fail},_,_,_,Src}, Vst0) ->
+ assert_term(Src, Vst0),
+ branch_state(Fail, Vst0);
+valfun_2({bs_put_integer,{f,Fail},_,_,_,Src}, Vst0) ->
+ assert_term(Src, Vst0),
+ branch_state(Fail, Vst0);
+%% Old bit syntax construction (before R10B).
+valfun_2({bs_init,_,_}, Vst) -> Vst;
+valfun_2({bs_need_buf,_}, Vst) -> Vst;
+valfun_2({bs_final,{f,Fail},Dst}, Vst0) ->
+ Vst = branch_state(Fail, Vst0),
+ set_type_reg(binary, Dst, Vst);
+%% Misc.
+valfun_2({'%live',Live}, Vst) ->
+ verify_live(Live, Vst),
+ Vst;
+valfun_2(_, _) ->
+ error(unknown_instruction).
+
+kill_state(#vst{current=#st{ct=[]}}=Vst) ->
+ Vst#vst{current=none};
+kill_state(#vst{current=#st{ct=Fails}}=Vst0) ->
+ Vst = lists:foldl(fun branch_state/2, Vst0, Fails),
+ Vst#vst{current=none}.
+
+%% A "plain" call.
+%% The stackframe must have a known size and be initialized.
+%% The instruction will return to the instruction following the call.
+call(Live, #vst{current=St}=Vst) ->
+ verify_live(Live, Vst),
+ verify_y_init(Vst),
+ Xs = gb_trees_from_list([{0,term}]),
+ Vst#vst{current=St#st{x=Xs}}.
+
+%% A "plain" call.
+%% The stackframe must have a known size and be initialized.
+%% The instruction will return to the instruction following the call.
+call(Name, Live, #vst{current=St}=Vst) ->
+ verify_live(Live, Vst),
+ case return_type(Name, Vst) of
+ exception ->
+ kill_state(Vst);
+ Type ->
+ verify_y_init(Vst),
+ Xs = gb_trees_from_list([{0,Type}]),
+ Vst#vst{current=St#st{x=Xs}}
+ end.
+
+%% Tail call.
+%% The stackframe must have a known size and be initialized.
+%% Does not return to the instruction following the call.
+tail_call(Live, Vst) ->
+ kill_state(call(Live, Vst)).
+
+allocate(Zero, Stk, Heap, Live, #vst{current=#st{numy=none}=St}=Vst) ->
+ verify_live(Live, Vst),
+ Ys = init_regs(case Zero of
+ true -> Stk;
+ false -> 0
+ end, initialized),
+ Vst#vst{current=St#st{y=Ys,numy=Stk,h=heap_alloc_1(Heap)}};
+allocate(_, _, _, _, #vst{current=#st{numy=Numy}}) ->
+ error({existing_stack_frame,{size,Numy}}).
+
+deallocate(#vst{current=St}=Vst) ->
+ Vst#vst{current=St#st{y=init_regs(0, initialized),numy=none}}.
+
+test_heap(Heap, Live, Vst) ->
+ verify_live(Live, Vst),
+ heap_alloc(Heap, Vst).
+
+heap_alloc(Heap, #vst{current=St}=Vst) ->
+ Vst#vst{current=St#st{h=heap_alloc_1(Heap)}}.
+
+heap_alloc_1({alloc,Alloc}) ->
+ {value,{_,Heap}} = lists:keysearch(words, 1, Alloc),
+ Heap;
+heap_alloc_1(Heap) when is_integer(Heap) -> Heap.
+
+
+set_type(Type, {x,_}=Reg, Vst) -> set_type_reg(Type, Reg, Vst);
+set_type(Type, {y,_}=Reg, Vst) -> set_type_y(Type, Reg, Vst);
+set_type(_, _, #vst{}=Vst) -> Vst.
+
+set_type_reg(Type, {x,X}, #vst{current=#st{x=Xs}=St}=Vst)
+ when 0 =< X, X < ?MAXREG ->
+ Vst#vst{current=St#st{x=gb_trees:enter(X, Type, Xs)}};
+set_type_reg(Type, Reg, Vst) ->
+ set_type_y(Type, Reg, Vst).
+
+set_type_y(Type, {y,Y}=Reg, #vst{current=#st{y=Ys,numy=NumY}=St}=Vst)
+ when is_integer(Y), 0 =< Y, Y < ?MAXREG ->
+ case {Y,NumY} of
+ {_,none} ->
+ error({no_stack_frame,Reg});
+ {_,_} when Y > NumY ->
+ error({y_reg_out_of_range,Reg,NumY});
+ {_,_} ->
+ Vst#vst{current=St#st{y=gb_trees:enter(Y, Type, Ys)}}
+ end;
+set_type_y(Type, Reg, #vst{}) -> error({invalid_store,Reg,Type}).
+
+assert_term(Src, Vst) ->
+ get_term_type(Src, Vst),
+ Vst.
+
+%% The possible types.
+%%
+%% First non-term types:
+%%
+%% initialized Only for Y registers. Means that the Y register
+%% has been initialized with some valid term so that
+%% it is safe to pass to the garbage collector.
+%% NOT safe to use in any other way (will not crash the
+%% emulator, but clearly points to a bug in the compiler).
+%%
+%% {catchtag,Lbl} A special term used within a catch. Must only be used
+%% by the catch instructions; NOT safe to use in other
+%% instructions.
+%%
+%% {trytag,Lbl} A special term used within a try block. Must only be
+%% used by the catch instructions; NOT safe to use in other
+%% instructions.
+%%
+%% exception Can only be used as a type returned by return_type/2
+%% (which gives the type of the value returned by a BIF).
+%% Thus 'exception' is never stored as type descriptor
+%% for a register.
+%%
+%% Normal terms:
+%%
+%% term Any valid Erlang (but not of the special types above).
+%%
+%% bool The atom 'true' or the atom 'false'.
+%%
+%% cons Cons cell: [_|_]
+%%
+%% nil Empty list: []
+%%
+%% {tuple,[Sz]} Tuple. An element has been accessed using
+%% element/2 or setelement/3 so that it is known that
+%% the type is a tuple of size at least Sz.
+%%
+%% {tuple,Sz} Tuple. A test_arity instruction has been seen
+%% so that it is known that the size is exactly Sz.
+%%
+%% {atom,[]} Atom.
+%% {atom,Atom}
+%%
+%% {integer,[]} Integer.
+%% {integer,Integer}
+%%
+%% {float,[]} Float.
+%% {float,Float}
+%%
+%% number Integer or Float of unknown value
+%%
+
+assert_type(WantedType, Term, Vst) ->
+ assert_type(WantedType, get_type(Term, Vst)),
+ Vst.
+
+assert_type(float, {float,_}) -> ok;
+assert_type(tuple, {tuple,_}) -> ok;
+assert_type({tuple_element,I}, {tuple,[Sz]})
+ when 1 =< I, I =< Sz ->
+ ok;
+assert_type({tuple_element,I}, {tuple,Sz})
+ when is_integer(Sz), 1 =< I, I =< Sz ->
+ ok;
+assert_type(Needed, Actual) ->
+ error({bad_type,{needed,Needed},{actual,Actual}}).
+
+%% upgrade_type/2 is used when linear code finds out more and
+%% more information about a type, so the type gets "narrower"
+%% or perhaps inconsistent. In the case of inconsistency
+%% we mostly widen the type to 'term' to make subsequent
+%% code fail if it assumes anything about the type.
+
+upgrade_type(Same, Same) -> Same;
+upgrade_type(term, OldT) -> OldT;
+upgrade_type(NewT, term) -> NewT;
+upgrade_type({Type,New}=NewT, {Type,Old}=OldT)
+ when Type == atom; Type == integer; Type == float ->
+ if New =:= Old -> OldT;
+ New =:= [] -> OldT;
+ Old =:= [] -> NewT;
+ true -> term
+ end;
+upgrade_type({Type,_}=NewT, number)
+ when Type == integer; Type == float ->
+ NewT;
+upgrade_type(number, {Type,_}=OldT)
+ when Type == integer; Type == float ->
+ OldT;
+upgrade_type(bool, {atom,A}) ->
+ upgrade_bool(A);
+upgrade_type({atom,A}, bool) ->
+ upgrade_bool(A);
+upgrade_type({tuple,[Sz]}, {tuple,[OldSz]})
+ when is_integer(Sz) ->
+ {tuple,[max(Sz, OldSz)]};
+upgrade_type({tuple,Sz}=T, {tuple,[_]})
+ when is_integer(Sz) ->
+ %% This also takes care of the user error when a tuple element
+ %% is accesed outside the known exact tuple size; there is
+ %% no more type information, just a runtime error which is not
+ %% our problem.
+ T;
+upgrade_type({tuple,[Sz]}, {tuple,_}=T)
+ when is_integer(Sz) ->
+ %% Same as the previous clause but mirrored.
+ T;
+upgrade_type(_A, _B) ->
+ %%io:format("upgrade_type: ~p ~p\n", [_A,_B]),
+ term.
+
+upgrade_bool([]) -> bool;
+upgrade_bool(true) -> {atom,true};
+upgrade_bool(false) -> {atom,false};
+upgrade_bool(_) -> term.
+
+get_tuple_size({integer,[]}) -> 0;
+get_tuple_size({integer,Sz}) -> Sz;
+get_tuple_size(_) -> 0.
+
+validate_src(Ss, Vst) when is_list(Ss) ->
+ foldl(fun(S, _) -> get_type(S, Vst) end, ok, Ss).
+
+get_term_type(Src, Vst) ->
+ case get_type(Src, Vst) of
+ initialized -> error({not_assigned,Src});
+ exception -> error({exception,Src});
+ {catchtag,_} -> error({catchtag,Src});
+ {trytag,_} -> error({trytag,Src});
+ Type -> Type
+ end.
+
+get_type(nil=T, _) -> T;
+get_type({atom,A}=T, _) when is_atom(A) -> T;
+get_type({float,F}=T, _) when is_float(F) -> T;
+get_type({integer,I}=T, _) when is_integer(I) -> T;
+get_type({x,X}=Reg, #vst{current=#st{x=Xs}}) when is_integer(X) ->
+ case gb_trees:lookup(X, Xs) of
+ {value,Type} -> Type;
+ none -> error({uninitialized_reg,Reg})
+ end;
+get_type({y,Y}=Reg, #vst{current=#st{y=Ys}}) when is_integer(Y) ->
+ case gb_trees:lookup(Y, Ys) of
+ {value,initialized} -> error({unassigned_reg,Reg});
+ {value,Type} -> Type;
+ none -> error({uninitialized_reg,Reg})
+ end;
+get_type(Src, _) -> error({bad_source,Src}).
+
+branch_arities([], _, #vst{}=Vst) -> Vst;
+branch_arities([Sz,{f,L}|T], Tuple, #vst{current=St}=Vst0)
+ when is_integer(Sz) ->
+ Vst1 = set_type_reg({tuple,Sz}, Tuple, Vst0),
+ Vst = branch_state(L, Vst1),
+ branch_arities(T, Tuple, Vst#vst{current=St}).
+
+branch_state(0, #vst{}=Vst) -> Vst;
+branch_state(L, #vst{current=St,branched=B}=Vst) ->
+ Vst#vst{
+ branched=case gb_trees:is_defined(L, B) of
+ false ->
+ gb_trees:insert(L, St#st{ct=[]}, B);
+ true ->
+ MergedSt = merge_states(L, St, B),
+ gb_trees:update(L, MergedSt#st{ct=[]}, B)
+ end}.
+
+%% merge_states/3 is used when there are more than one way to arrive
+%% at this point, and the type states for the different paths has
+%% to be merged. The type states are downgraded to the least common
+%% subset for the subsequent code.
+
+merge_states(0, St, _Branched) -> St;
+merge_states(L, St, Branched) ->
+ case gb_trees:lookup(L, Branched) of
+ none -> St;
+ {value,OtherSt} when St == none -> OtherSt;
+ {value,OtherSt} ->
+ merge_states_1(St, OtherSt)
+ end.
+
+merge_states_1(#st{x=Xs0,y=Ys0,numy=NumY0,h=H0}=St,
+ #st{x=Xs1,y=Ys1,numy=NumY1,h=H1}) ->
+ NumY = merge_stk(NumY0, NumY1),
+ Xs = merge_regs(Xs0, Xs1),
+ Ys = merge_regs(Ys0, Ys1),
+ St#st{x=Xs,y=Ys,numy=NumY,h=min(H0, H1)}.
+
+merge_stk(S, S) -> S;
+merge_stk(_, _) -> undecided.
+
+merge_regs(Rs0, Rs1) ->
+ Rs = merge_regs_1(gb_trees:to_list(Rs0), gb_trees:to_list(Rs1)),
+ gb_trees_from_list(Rs).
+
+merge_regs_1([Same|Rs1], [Same|Rs2]) ->
+ [Same|merge_regs_1(Rs1, Rs2)];
+merge_regs_1([{R1,_}|Rs1], [{R2,_}|_]=Rs2) when R1 < R2 ->
+ merge_regs_1(Rs1, Rs2);
+merge_regs_1([{R1,_}|_]=Rs1, [{R2,_}|Rs2]) when R1 > R2 ->
+ merge_regs_1(Rs1, Rs2);
+merge_regs_1([{R,Type1}|Rs1], [{R,Type2}|Rs2]) ->
+ [{R,merge_types(Type1, Type2)}|merge_regs_1(Rs1, Rs2)];
+merge_regs_1([], []) -> [];
+merge_regs_1([], [_|_]) -> [];
+merge_regs_1([_|_], []) -> [].
+
+merge_types(T, T) -> T;
+merge_types(initialized=I, _) -> I;
+merge_types(_, initialized=I) -> I;
+merge_types({tuple,Same}=T, {tuple,Same}) -> T;
+merge_types({tuple,A}, {tuple,B}) ->
+ {tuple,[min(tuple_sz(A), tuple_sz(B))]};
+merge_types({Type,A}, {Type,B})
+ when Type == atom; Type == integer; Type == float ->
+ if A =:= B -> {Type,A};
+ true -> {Type,[]}
+ end;
+merge_types({Type,_}, number)
+ when Type == integer; Type == float ->
+ number;
+merge_types(number, {Type,_})
+ when Type == integer; Type == float ->
+ number;
+merge_types(bool, {atom,A}) ->
+ merge_bool(A);
+merge_types({atom,A}, bool) ->
+ merge_bool(A);
+merge_types(_, _) -> term.
+
+tuple_sz([Sz]) -> Sz;
+tuple_sz(Sz) -> Sz.
+
+merge_bool([]) -> {atom,[]};
+merge_bool(true) -> bool;
+merge_bool(false) -> bool;
+merge_bool(_) -> {atom,[]}.
+
+verify_y_init(#vst{current=#st{numy=none}}) -> ok;
+verify_y_init(#vst{current=#st{numy=undecided}}) ->
+ error(unknown_size_of_stackframe);
+verify_y_init(#vst{current=#st{y=Ys,numy=NumY}}) ->
+ verify_y_init_1(NumY, Ys).
+
+verify_y_init_1(0, _) -> ok;
+verify_y_init_1(N, Ys) ->
+ Y = N-1,
+ case gb_trees:is_defined(Y, Ys) of
+ false -> error({{y,Y},not_initialized});
+ true -> verify_y_init_1(Y, Ys)
+ end.
+
+verify_live(0, #vst{}) -> ok;
+verify_live(N, #vst{current=#st{x=Xs}}) ->
+ verify_live_1(N, Xs).
+
+verify_live_1(0, _) -> ok;
+verify_live_1(N, Xs) ->
+ X = N-1,
+ case gb_trees:is_defined(X, Xs) of
+ false -> error({{x,X},not_live});
+ true -> verify_live_1(X, Xs)
+ end.
+
+eat_heap(N, #vst{current=#st{h=Heap0}=St}=Vst) ->
+ case Heap0-N of
+ Neg when Neg < 0 ->
+ error({heap_overflow,{left,Heap0},{wanted,N}});
+ Heap ->
+ Vst#vst{current=St#st{h=Heap}}
+ end.
+
+bif_type('-', Src, Vst) ->
+ arith_type(Src, Vst);
+bif_type('+', Src, Vst) ->
+ arith_type(Src, Vst);
+bif_type('*', Src, Vst) ->
+ arith_type(Src, Vst);
+bif_type(abs, [Num], Vst) ->
+ case get_type(Num, Vst) of
+ {float,_}=T -> T;
+ {integer,_}=T -> T;
+ _ -> number
+ end;
+bif_type(float, _, _) -> {float,[]};
+bif_type('/', _, _) -> {float,[]};
+%% Integer operations.
+bif_type('div', [_,_], _) -> {integer,[]};
+bif_type('rem', [_,_], _) -> {integer,[]};
+bif_type(length, [_], _) -> {integer,[]};
+bif_type(size, [_], _) -> {integer,[]};
+bif_type(trunc, [_], _) -> {integer,[]};
+bif_type(round, [_], _) -> {integer,[]};
+bif_type('band', [_,_], _) -> {integer,[]};
+bif_type('bor', [_,_], _) -> {integer,[]};
+bif_type('bxor', [_,_], _) -> {integer,[]};
+bif_type('bnot', [_], _) -> {integer,[]};
+bif_type('bsl', [_,_], _) -> {integer,[]};
+bif_type('bsr', [_,_], _) -> {integer,[]};
+%% Booleans.
+bif_type('==', [_,_], _) -> bool;
+bif_type('/=', [_,_], _) -> bool;
+bif_type('=<', [_,_], _) -> bool;
+bif_type('<', [_,_], _) -> bool;
+bif_type('>=', [_,_], _) -> bool;
+bif_type('>', [_,_], _) -> bool;
+bif_type('=:=', [_,_], _) -> bool;
+bif_type('=/=', [_,_], _) -> bool;
+bif_type('not', [_], _) -> bool;
+bif_type('and', [_,_], _) -> bool;
+bif_type('or', [_,_], _) -> bool;
+bif_type('xor', [_,_], _) -> bool;
+bif_type(is_atom, [_], _) -> bool;
+bif_type(is_boolean, [_], _) -> bool;
+bif_type(is_binary, [_], _) -> bool;
+bif_type(is_constant, [_], _) -> bool;
+bif_type(is_float, [_], _) -> bool;
+bif_type(is_function, [_], _) -> bool;
+bif_type(is_integer, [_], _) -> bool;
+bif_type(is_list, [_], _) -> bool;
+bif_type(is_number, [_], _) -> bool;
+bif_type(is_pid, [_], _) -> bool;
+bif_type(is_port, [_], _) -> bool;
+bif_type(is_reference, [_], _) -> bool;
+bif_type(is_tuple, [_], _) -> bool;
+%% Misc.
+bif_type(node, [], _) -> {atom,[]};
+bif_type(node, [_], _) -> {atom,[]};
+bif_type(hd, [_], _) -> term;
+bif_type(tl, [_], _) -> term;
+bif_type(get, [_], _) -> term;
+bif_type(raise, [_,_], _) -> exception;
+bif_type(_, _, _) -> term.
+
+arith_type([A,B], Vst) ->
+ case {get_type(A, Vst),get_type(B, Vst)} of
+ {{float,_},_} -> {float,[]};
+ {_,{float,_}} -> {float,[]};
+ {_,_} -> number
+ end;
+arith_type(_, _) -> number.
+
+return_type({extfunc,M,F,A}, Vst) ->
+ return_type_1(M, F, A, Vst).
+
+return_type_1(erlang, setelement, 3, Vst) ->
+ Tuple = {x,1},
+ TupleType =
+ case get_type(Tuple, Vst) of
+ {tuple,_}=TT -> TT;
+ _ -> {tuple,[0]}
+ end,
+ case get_type({x,0}, Vst) of
+ {integer,[]} -> TupleType;
+ {integer,I} -> upgrade_type({tuple,[I]}, TupleType);
+ _ -> TupleType
+ end;
+return_type_1(erlang, F, A, _) ->
+ return_type_erl(F, A);
+return_type_1(math, F, A, _) ->
+ return_type_math(F, A);
+return_type_1(_, _, _, _) -> term.
+
+return_type_erl(exit, 1) -> exception;
+return_type_erl(throw, 1) -> exception;
+return_type_erl(fault, 1) -> exception;
+return_type_erl(fault, 2) -> exception;
+return_type_erl(error, 1) -> exception;
+return_type_erl(error, 2) -> exception;
+return_type_erl(_, _) -> term.
+
+return_type_math(cos, 1) -> {float,[]};
+return_type_math(cosh, 1) -> {float,[]};
+return_type_math(sin, 1) -> {float,[]};
+return_type_math(sinh, 1) -> {float,[]};
+return_type_math(tan, 1) -> {float,[]};
+return_type_math(tanh, 1) -> {float,[]};
+return_type_math(acos, 1) -> {float,[]};
+return_type_math(acosh, 1) -> {float,[]};
+return_type_math(asin, 1) -> {float,[]};
+return_type_math(asinh, 1) -> {float,[]};
+return_type_math(atan, 1) -> {float,[]};
+return_type_math(atanh, 1) -> {float,[]};
+return_type_math(erf, 1) -> {float,[]};
+return_type_math(erfc, 1) -> {float,[]};
+return_type_math(exp, 1) -> {float,[]};
+return_type_math(log, 1) -> {float,[]};
+return_type_math(log10, 1) -> {float,[]};
+return_type_math(sqrt, 1) -> {float,[]};
+return_type_math(atan2, 2) -> {float,[]};
+return_type_math(pow, 2) -> {float,[]};
+return_type_math(pi, 0) -> {float,[]};
+return_type_math(_, _) -> term.
+
+min(A, B) when is_integer(A), is_integer(B), A < B -> A;
+min(A, B) when is_integer(A), is_integer(B) -> B.
+
+max(A, B) when is_integer(A), is_integer(B), A > B -> A;
+max(A, B) when is_integer(A), is_integer(B) -> B.
+
+gb_trees_from_list(L) -> gb_trees:from_orddict(orddict:from_list(L)).
+
+-ifdef(DEBUG).
+error(Error) -> exit(Error).
+-else.
+error(Error) -> throw(Error).
+-endif.
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/cerl.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/cerl.erl
new file mode 100644
index 0000000000..e4bdfc7dbe
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/cerl.erl
@@ -0,0 +1,4169 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Richard Carlsson.
+%% Copyright (C) 1999-2002 Richard Carlsson.
+%% Portions created by Ericsson are Copyright 2001, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: cerl.erl,v 1.3 2010/03/04 13:54:20 maria Exp $
+
+%% =====================================================================
+%% @doc Core Erlang abstract syntax trees.
+%%
+%% <p> This module defines an abstract data type for representing Core
+%% Erlang source code as syntax trees.</p>
+%%
+%% <p>A recommended starting point for the first-time user is the
+%% documentation of the function <a
+%% href="#type-1"><code>type/1</code></a>.</p>
+%%
+%% <h3><b>NOTES:</b></h3>
+%%
+%% <p>This module deals with the composition and decomposition of
+%% <em>syntactic</em> entities (as opposed to semantic ones); its
+%% purpose is to hide all direct references to the data structures
+%% used to represent these entities. With few exceptions, the
+%% functions in this module perform no semantic interpretation of
+%% their inputs, and in general, the user is assumed to pass
+%% type-correct arguments - if this is not done, the effects are not
+%% defined.</p>
+%%
+%% <p>The internal representations of abstract syntax trees are
+%% subject to change without notice, and should not be documented
+%% outside this module. Furthermore, we do not give any guarantees on
+%% how an abstract syntax tree may or may not be represented, <em>with
+%% the following exceptions</em>: no syntax tree is represented by a
+%% single atom, such as <code>none</code>, by a list constructor
+%% <code>[X | Y]</code>, or by the empty list <code>[]</code>. This
+%% can be relied on when writing functions that operate on syntax
+%% trees.</p>
+%%
+%% @type cerl(). An abstract Core Erlang syntax tree.
+%%
+%% <p>Every abstract syntax tree has a <em>type</em>, given by the
+%% function <a href="#type-1"><code>type/1</code></a>. In addition,
+%% each syntax tree has a list of <em>user annotations</em> (cf. <a
+%% href="#get_ann-1"><code>get_ann/1</code></a>), which are included
+%% in the Core Erlang syntax.</p>
+
+-module(cerl).
+
+-export([abstract/1, add_ann/2, alias_pat/1, alias_var/1,
+ ann_abstract/2, ann_c_alias/3, ann_c_apply/3, ann_c_atom/2,
+ ann_c_call/4, ann_c_case/3, ann_c_catch/2, ann_c_char/2,
+ ann_c_clause/3, ann_c_clause/4, ann_c_cons/3, ann_c_float/2,
+ ann_c_fname/3, ann_c_fun/3, ann_c_int/2, ann_c_let/4,
+ ann_c_letrec/3, ann_c_module/4, ann_c_module/5, ann_c_nil/1,
+ ann_c_cons_skel/3, ann_c_tuple_skel/2, ann_c_primop/3,
+ ann_c_receive/2, ann_c_receive/4, ann_c_seq/3, ann_c_string/2,
+ ann_c_try/6, ann_c_tuple/2, ann_c_values/2, ann_c_var/2,
+ ann_make_data/3, ann_make_list/2, ann_make_list/3,
+ ann_make_data_skel/3, ann_make_tree/3, apply_args/1,
+ apply_arity/1, apply_op/1, atom_lit/1, atom_name/1, atom_val/1,
+ c_alias/2, c_apply/2, c_atom/1, c_call/3, c_case/2, c_catch/1,
+ c_char/1, c_clause/2, c_clause/3, c_cons/2, c_float/1,
+ c_fname/2, c_fun/2, c_int/1, c_let/3, c_letrec/2, c_module/3,
+ c_module/4, c_nil/0, c_cons_skel/2, c_tuple_skel/1, c_primop/2,
+ c_receive/1, c_receive/3, c_seq/2, c_string/1, c_try/5,
+ c_tuple/1, c_values/1, c_var/1, call_args/1, call_arity/1,
+ call_module/1, call_name/1, case_arg/1, case_arity/1,
+ case_clauses/1, catch_body/1, char_lit/1, char_val/1,
+ clause_arity/1, clause_body/1, clause_guard/1, clause_pats/1,
+ clause_vars/1, concrete/1, cons_hd/1, cons_tl/1, copy_ann/2,
+ data_arity/1, data_es/1, data_type/1, float_lit/1, float_val/1,
+ fname_arity/1, fname_id/1, fold_literal/1, from_records/1,
+ fun_arity/1, fun_body/1, fun_vars/1, get_ann/1, int_lit/1,
+ int_val/1, is_c_alias/1, is_c_apply/1, is_c_atom/1,
+ is_c_call/1, is_c_case/1, is_c_catch/1, is_c_char/1,
+ is_c_clause/1, is_c_cons/1, is_c_float/1, is_c_fname/1,
+ is_c_fun/1, is_c_int/1, is_c_let/1, is_c_letrec/1, is_c_list/1,
+ is_c_module/1, is_c_nil/1, is_c_primop/1, is_c_receive/1,
+ is_c_seq/1, is_c_string/1, is_c_try/1, is_c_tuple/1,
+ is_c_values/1, is_c_var/1, is_data/1, is_leaf/1, is_literal/1,
+ is_literal_term/1, is_print_char/1, is_print_string/1,
+ let_arg/1, let_arity/1, let_body/1, let_vars/1, letrec_body/1,
+ letrec_defs/1, letrec_vars/1, list_elements/1, list_length/1,
+ make_data/2, make_list/1, make_list/2, make_data_skel/2,
+ make_tree/2, meta/1, module_attrs/1, module_defs/1,
+ module_exports/1, module_name/1, module_vars/1,
+ pat_list_vars/1, pat_vars/1, primop_args/1, primop_arity/1,
+ primop_name/1, receive_action/1, receive_clauses/1,
+ receive_timeout/1, seq_arg/1, seq_body/1, set_ann/2,
+ string_lit/1, string_val/1, subtrees/1, to_records/1,
+ try_arg/1, try_body/1, try_vars/1, try_evars/1, try_handler/1,
+ tuple_arity/1, tuple_es/1, type/1, unfold_literal/1,
+ update_c_alias/3, update_c_apply/3, update_c_call/4,
+ update_c_case/3, update_c_catch/2, update_c_clause/4,
+ update_c_cons/3, update_c_cons_skel/3, update_c_fname/2,
+ update_c_fname/3, update_c_fun/3, update_c_let/4,
+ update_c_letrec/3, update_c_module/5, update_c_primop/3,
+ update_c_receive/4, update_c_seq/3, update_c_try/6,
+ update_c_tuple/2, update_c_tuple_skel/2, update_c_values/2,
+ update_c_var/2, update_data/3, update_list/2, update_list/3,
+ update_data_skel/3, update_tree/2, update_tree/3,
+ values_arity/1, values_es/1, var_name/1, c_binary/1,
+ update_c_binary/2, ann_c_binary/2, is_c_binary/1,
+ binary_segments/1, c_bitstr/3, c_bitstr/4, c_bitstr/5,
+ update_c_bitstr/5, update_c_bitstr/6, ann_c_bitstr/5,
+ ann_c_bitstr/6, is_c_bitstr/1, bitstr_val/1, bitstr_size/1,
+ bitstr_bitsize/1, bitstr_unit/1, bitstr_type/1,
+ bitstr_flags/1]).
+
+-include("core_parse.hrl").
+
+
+%% =====================================================================
+%% Representation (general)
+%%
+%% All nodes are represented by tuples of arity 2 or (generally)
+%% greater, whose first element is an atom which uniquely identifies the
+%% type of the node, and whose second element is a (proper) list of
+%% annotation terms associated with the node - this is by default empty.
+%%
+%% For most node constructor functions, there are analogous functions
+%% named 'ann_...', taking one extra argument 'As' (always the first
+%% argument), specifying an annotation list at node creation time.
+%% Similarly, there are also functions named 'update_...', taking one
+%% extra argument 'Old', specifying a node from which all fields not
+%% explicitly given as arguments should be copied (generally, this is
+%% the annotation field only).
+%% =====================================================================
+
+%% This defines the general representation of constant literals:
+
+-record(literal, {ann = [], val}).
+
+
+%% @spec type(Node::cerl()) -> atom()
+%%
+%% @doc Returns the type tag of <code>Node</code>. Current node types
+%% are:
+%%
+%% <p><center><table border="1">
+%% <tr>
+%% <td>alias</td>
+%% <td>apply</td>
+%% <td>binary</td>
+%% <td>bitstr</td>
+%% <td>call</td>
+%% <td>case</td>
+%% <td>catch</td>
+%% </tr><tr>
+%% <td>clause</td>
+%% <td>cons</td>
+%% <td>fun</td>
+%% <td>let</td>
+%% <td>letrec</td>
+%% <td>literal</td>
+%% <td>module</td>
+%% </tr><tr>
+%% <td>primop</td>
+%% <td>receive</td>
+%% <td>seq</td>
+%% <td>try</td>
+%% <td>tuple</td>
+%% <td>values</td>
+%% <td>var</td>
+%% </tr>
+%% </table></center></p>
+%%
+%% <p>Note: The name of the primary constructor function for a node
+%% type is always the name of the type itself, prefixed by
+%% "<code>c_</code>"; recognizer predicates are correspondingly
+%% prefixed by "<code>is_c_</code>". Furthermore, to simplify
+%% preservation of annotations (cf. <code>get_ann/1</code>), there are
+%% analogous constructor functions prefixed by "<code>ann_c_</code>"
+%% and "<code>update_c_</code>", for setting the annotation list of
+%% the new node to either a specific value or to the annotations of an
+%% existing node, respectively.</p>
+%%
+%% @see abstract/1
+%% @see c_alias/2
+%% @see c_apply/2
+%% @see c_binary/1
+%% @see c_bitstr/5
+%% @see c_call/3
+%% @see c_case/2
+%% @see c_catch/1
+%% @see c_clause/3
+%% @see c_cons/2
+%% @see c_fun/2
+%% @see c_let/3
+%% @see c_letrec/2
+%% @see c_module/3
+%% @see c_primop/2
+%% @see c_receive/1
+%% @see c_seq/2
+%% @see c_try/3
+%% @see c_tuple/1
+%% @see c_values/1
+%% @see c_var/1
+%% @see get_ann/1
+%% @see to_records/1
+%% @see from_records/1
+%% @see data_type/1
+%% @see subtrees/1
+%% @see meta/1
+
+type(Node) ->
+ element(1, Node).
+
+
+%% @spec is_leaf(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> is a leaf node,
+%% otherwise <code>false</code>. The current leaf node types are
+%% <code>literal</code> and <code>var</code>.
+%%
+%% <p>Note: all literals (cf. <code>is_literal/1</code>) are leaf
+%% nodes, even if they represent structured (constant) values such as
+%% <code>{foo, [bar, baz]}</code>. Also note that variables are leaf
+%% nodes but not literals.</p>
+%%
+%% @see type/1
+%% @see is_literal/1
+
+is_leaf(Node) ->
+ case type(Node) of
+ literal -> true;
+ var -> true;
+ _ -> false
+ end.
+
+
+%% @spec get_ann(cerl()) -> [term()]
+%%
+%% @doc Returns the list of user annotations associated with a syntax
+%% tree node. For a newly created node, this is the empty list. The
+%% annotations may be any terms.
+%%
+%% @see set_ann/2
+
+get_ann(Node) ->
+ element(2, Node).
+
+
+%% @spec set_ann(Node::cerl(), Annotations::[term()]) -> cerl()
+%%
+%% @doc Sets the list of user annotations of <code>Node</code> to
+%% <code>Annotations</code>.
+%%
+%% @see get_ann/1
+%% @see add_ann/2
+%% @see copy_ann/2
+
+set_ann(Node, List) ->
+ setelement(2, Node, List).
+
+
+%% @spec add_ann(Annotations::[term()], Node::cerl()) -> cerl()
+%%
+%% @doc Appends <code>Annotations</code> to the list of user
+%% annotations of <code>Node</code>.
+%%
+%% <p>Note: this is equivalent to <code>set_ann(Node, Annotations ++
+%% get_ann(Node))</code>, but potentially more efficient.</p>
+%%
+%% @see get_ann/1
+%% @see set_ann/2
+
+add_ann(Terms, Node) ->
+ set_ann(Node, Terms ++ get_ann(Node)).
+
+
+%% @spec copy_ann(Source::cerl(), Target::cerl()) -> cerl()
+%%
+%% @doc Copies the list of user annotations from <code>Source</code>
+%% to <code>Target</code>.
+%%
+%% <p>Note: this is equivalent to <code>set_ann(Target,
+%% get_ann(Source))</code>, but potentially more efficient.</p>
+%%
+%% @see get_ann/1
+%% @see set_ann/2
+
+copy_ann(Source, Target) ->
+ set_ann(Target, get_ann(Source)).
+
+
+%% @spec abstract(Term::term()) -> cerl()
+%%
+%% @doc Creates a syntax tree corresponding to an Erlang term.
+%% <code>Term</code> must be a literal term, i.e., one that can be
+%% represented as a source code literal. Thus, it may not contain a
+%% process identifier, port, reference, binary or function value as a
+%% subterm.
+%%
+%% <p>Note: This is a constant time operation.</p>
+%%
+%% @see ann_abstract/2
+%% @see concrete/1
+%% @see is_literal/1
+%% @see is_literal_term/1
+
+abstract(T) ->
+ #literal{val = T}.
+
+
+%% @spec ann_abstract(Annotations::[term()], Term::term()) -> cerl()
+%% @see abstract/1
+
+ann_abstract(As, T) ->
+ #literal{val = T, ann = As}.
+
+
+%% @spec is_literal_term(Term::term()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Term</code> can be
+%% represented as a literal, otherwise <code>false</code>. This
+%% function takes time proportional to the size of <code>Term</code>.
+%%
+%% @see abstract/1
+
+is_literal_term(T) when integer(T) -> true;
+is_literal_term(T) when float(T) -> true;
+is_literal_term(T) when atom(T) -> true;
+is_literal_term([]) -> true;
+is_literal_term([H | T]) ->
+ case is_literal_term(H) of
+ true ->
+ is_literal_term(T);
+ false ->
+ false
+ end;
+is_literal_term(T) when tuple(T) ->
+ is_literal_term_list(tuple_to_list(T));
+is_literal_term(_) ->
+ false.
+
+is_literal_term_list([T | Ts]) ->
+ case is_literal_term(T) of
+ true ->
+ is_literal_term_list(Ts);
+ false ->
+ false
+ end;
+is_literal_term_list([]) ->
+ true.
+
+
+%% @spec concrete(Node::cerl()) -> term()
+%%
+%% @doc Returns the Erlang term represented by a syntax tree. An
+%% exception is thrown if <code>Node</code> does not represent a
+%% literal term.
+%%
+%% <p>Note: This is a constant time operation.</p>
+%%
+%% @see abstract/1
+%% @see is_literal/1
+
+%% Because the normal tuple and list constructor operations always
+%% return a literal if the arguments are literals, 'concrete' and
+%% 'is_literal' never need to traverse the structure.
+
+concrete(#literal{val = V}) ->
+ V.
+
+
+%% @spec is_literal(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> represents a
+%% literal term, otherwise <code>false</code>. This function returns
+%% <code>true</code> if and only if the value of
+%% <code>concrete(Node)</code> is defined.
+%%
+%% <p>Note: This is a constant time operation.</p>
+%%
+%% @see abstract/1
+%% @see concrete/1
+%% @see fold_literal/1
+
+is_literal(#literal{}) ->
+ true;
+is_literal(_) ->
+ false.
+
+
+%% @spec fold_literal(Node::cerl()) -> cerl()
+%%
+%% @doc Assures that literals have a compact representation. This is
+%% occasionally useful if <code>c_cons_skel/2</code>,
+%% <code>c_tuple_skel/1</code> or <code>unfold_literal/1</code> were
+%% used in the construction of <code>Node</code>, and you want to revert
+%% to the normal "folded" representation of literals. If
+%% <code>Node</code> represents a tuple or list constructor, its
+%% elements are rewritten recursively, and the node is reconstructed
+%% using <code>c_cons/2</code> or <code>c_tuple/1</code>, respectively;
+%% otherwise, <code>Node</code> is not changed.
+%%
+%% @see is_literal/1
+%% @see c_cons_skel/2
+%% @see c_tuple_skel/1
+%% @see c_cons/2
+%% @see c_tuple/1
+%% @see unfold_literal/1
+
+fold_literal(Node) ->
+ case type(Node) of
+ tuple ->
+ update_c_tuple(Node, fold_literal_list(tuple_es(Node)));
+ cons ->
+ update_c_cons(Node, fold_literal(cons_hd(Node)),
+ fold_literal(cons_tl(Node)));
+ _ ->
+ Node
+ end.
+
+fold_literal_list([E | Es]) ->
+ [fold_literal(E) | fold_literal_list(Es)];
+fold_literal_list([]) ->
+ [].
+
+
+%% @spec unfold_literal(Node::cerl()) -> cerl()
+%%
+%% @doc Assures that literals have a fully expanded representation. If
+%% <code>Node</code> represents a literal tuple or list constructor, its
+%% elements are rewritten recursively, and the node is reconstructed
+%% using <code>c_cons_skel/2</code> or <code>c_tuple_skel/1</code>,
+%% respectively; otherwise, <code>Node</code> is not changed. The {@link
+%% fold_literal/1} can be used to revert to the normal compact
+%% representation.
+%%
+%% @see is_literal/1
+%% @see c_cons_skel/2
+%% @see c_tuple_skel/1
+%% @see c_cons/2
+%% @see c_tuple/1
+%% @see fold_literal/1
+
+unfold_literal(Node) ->
+ case type(Node) of
+ literal ->
+ copy_ann(Node, unfold_concrete(concrete(Node)));
+ _ ->
+ Node
+ end.
+
+unfold_concrete(Val) ->
+ case Val of
+ _ when tuple(Val) ->
+ c_tuple_skel(unfold_concrete_list(tuple_to_list(Val)));
+ [H|T] ->
+ c_cons_skel(unfold_concrete(H), unfold_concrete(T));
+ _ ->
+ abstract(Val)
+ end.
+
+unfold_concrete_list([E | Es]) ->
+ [unfold_concrete(E) | unfold_concrete_list(Es)];
+unfold_concrete_list([]) ->
+ [].
+
+
+%% ---------------------------------------------------------------------
+
+-record(module, {ann = [], name, exports, attrs, defs}).
+
+
+%% @spec c_module(Name::cerl(), Exports, Definitions) -> cerl()
+%%
+%% Exports = [cerl()]
+%% Definitions = [{cerl(), cerl()}]
+%%
+%% @equiv c_module(Name, Exports, [], Definitions)
+
+c_module(Name, Exports, Es) ->
+ #module{name = Name, exports = Exports, attrs = [], defs = Es}.
+
+
+%% @spec c_module(Name::cerl(), Exports, Attributes, Definitions) ->
+%% cerl()
+%%
+%% Exports = [cerl()]
+%% Attributes = [{cerl(), cerl()}]
+%% Definitions = [{cerl(), cerl()}]
+%%
+%% @doc Creates an abstract module definition. The result represents
+%% <pre>
+%% module <em>Name</em> [<em>E1</em>, ..., <em>Ek</em>]
+%% attributes [<em>K1</em> = <em>T1</em>, ...,
+%% <em>Km</em> = <em>Tm</em>]
+%% <em>V1</em> = <em>F1</em>
+%% ...
+%% <em>Vn</em> = <em>Fn</em>
+%% end</pre>
+%%
+%% if <code>Exports</code> = <code>[E1, ..., Ek]</code>,
+%% <code>Attributes</code> = <code>[{K1, T1}, ..., {Km, Tm}]</code>,
+%% and <code>Definitions</code> = <code>[{V1, F1}, ..., {Vn,
+%% Fn}]</code>.
+%%
+%% <p><code>Name</code> and all the <code>Ki</code> must be atom
+%% literals, and all the <code>Ti</code> must be constant literals. All
+%% the <code>Vi</code> and <code>Ei</code> must have type
+%% <code>var</code> and represent function names. All the
+%% <code>Fi</code> must have type <code>'fun'</code>.</p>
+%%
+%% @see c_module/3
+%% @see module_name/1
+%% @see module_exports/1
+%% @see module_attrs/1
+%% @see module_defs/1
+%% @see module_vars/1
+%% @see ann_c_module/4
+%% @see ann_c_module/5
+%% @see update_c_module/5
+%% @see c_atom/1
+%% @see c_var/1
+%% @see c_fun/2
+%% @see is_literal/1
+
+c_module(Name, Exports, Attrs, Es) ->
+ #module{name = Name, exports = Exports, attrs = Attrs, defs = Es}.
+
+
+%% @spec ann_c_module(As::[term()], Name::cerl(), Exports,
+%% Definitions) -> cerl()
+%%
+%% Exports = [cerl()]
+%% Definitions = [{cerl(), cerl()}]
+%%
+%% @see c_module/3
+%% @see ann_c_module/5
+
+ann_c_module(As, Name, Exports, Es) ->
+ #module{name = Name, exports = Exports, attrs = [], defs = Es,
+ ann = As}.
+
+
+%% @spec ann_c_module(As::[term()], Name::cerl(), Exports,
+%% Attributes, Definitions) -> cerl()
+%%
+%% Exports = [cerl()]
+%% Attributes = [{cerl(), cerl()}]
+%% Definitions = [{cerl(), cerl()}]
+%%
+%% @see c_module/4
+%% @see ann_c_module/4
+
+ann_c_module(As, Name, Exports, Attrs, Es) ->
+ #module{name = Name, exports = Exports, attrs = Attrs, defs = Es,
+ ann = As}.
+
+
+%% @spec update_c_module(Old::cerl(), Name::cerl(), Exports,
+%% Attributes, Definitions) -> cerl()
+%%
+%% Exports = [cerl()]
+%% Attributes = [{cerl(), cerl()}]
+%% Definitions = [{cerl(), cerl()}]
+%%
+%% @see c_module/4
+
+update_c_module(Node, Name, Exports, Attrs, Es) ->
+ #module{name = Name, exports = Exports, attrs = Attrs, defs = Es,
+ ann = get_ann(Node)}.
+
+
+%% @spec is_c_module(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> is an abstract
+%% module definition, otherwise <code>false</code>.
+%%
+%% @see type/1
+
+is_c_module(#module{}) ->
+ true;
+is_c_module(_) ->
+ false.
+
+
+%% @spec module_name(Node::cerl()) -> cerl()
+%%
+%% @doc Returns the name subtree of an abstract module definition.
+%%
+%% @see c_module/4
+
+module_name(Node) ->
+ Node#module.name.
+
+
+%% @spec module_exports(Node::cerl()) -> [cerl()]
+%%
+%% @doc Returns the list of exports subtrees of an abstract module
+%% definition.
+%%
+%% @see c_module/4
+
+module_exports(Node) ->
+ Node#module.exports.
+
+
+%% @spec module_attrs(Node::cerl()) -> [{cerl(), cerl()}]
+%%
+%% @doc Returns the list of pairs of attribute key/value subtrees of
+%% an abstract module definition.
+%%
+%% @see c_module/4
+
+module_attrs(Node) ->
+ Node#module.attrs.
+
+
+%% @spec module_defs(Node::cerl()) -> [{cerl(), cerl()}]
+%%
+%% @doc Returns the list of function definitions of an abstract module
+%% definition.
+%%
+%% @see c_module/4
+
+module_defs(Node) ->
+ Node#module.defs.
+
+
+%% @spec module_vars(Node::cerl()) -> [cerl()]
+%%
+%% @doc Returns the list of left-hand side function variable subtrees
+%% of an abstract module definition.
+%%
+%% @see c_module/4
+
+module_vars(Node) ->
+ [F || {F, _} <- module_defs(Node)].
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_int(Value::integer()) -> cerl()
+%%
+%%
+%% @doc Creates an abstract integer literal. The lexical
+%% representation is the canonical decimal numeral of
+%% <code>Value</code>.
+%%
+%% @see ann_c_int/2
+%% @see is_c_int/1
+%% @see int_val/1
+%% @see int_lit/1
+%% @see c_char/1
+
+c_int(Value) ->
+ #literal{val = Value}.
+
+
+%% @spec ann_c_int(As::[term()], Value::integer()) -> cerl()
+%% @see c_int/1
+
+ann_c_int(As, Value) ->
+ #literal{val = Value, ann = As}.
+
+
+%% @spec is_c_int(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> represents an
+%% integer literal, otherwise <code>false</code>.
+%% @see c_int/1
+
+is_c_int(#literal{val = V}) when integer(V) ->
+ true;
+is_c_int(_) ->
+ false.
+
+
+%% @spec int_val(cerl()) -> integer()
+%%
+%% @doc Returns the value represented by an integer literal node.
+%% @see c_int/1
+
+int_val(Node) ->
+ Node#literal.val.
+
+
+%% @spec int_lit(cerl()) -> string()
+%%
+%% @doc Returns the numeral string represented by an integer literal
+%% node.
+%% @see c_int/1
+
+int_lit(Node) ->
+ integer_to_list(int_val(Node)).
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_float(Value::float()) -> cerl()
+%%
+%% @doc Creates an abstract floating-point literal. The lexical
+%% representation is the decimal floating-point numeral of
+%% <code>Value</code>.
+%%
+%% @see ann_c_float/2
+%% @see is_c_float/1
+%% @see float_val/1
+%% @see float_lit/1
+
+%% Note that not all floating-point numerals can be represented with
+%% full precision.
+
+c_float(Value) ->
+ #literal{val = Value}.
+
+
+%% @spec ann_c_float(As::[term()], Value::float()) -> cerl()
+%% @see c_float/1
+
+ann_c_float(As, Value) ->
+ #literal{val = Value, ann = As}.
+
+
+%% @spec is_c_float(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> represents a
+%% floating-point literal, otherwise <code>false</code>.
+%% @see c_float/1
+
+is_c_float(#literal{val = V}) when float(V) ->
+ true;
+is_c_float(_) ->
+ false.
+
+
+%% @spec float_val(cerl()) -> float()
+%%
+%% @doc Returns the value represented by a floating-point literal
+%% node.
+%% @see c_float/1
+
+float_val(Node) ->
+ Node#literal.val.
+
+
+%% @spec float_lit(cerl()) -> string()
+%%
+%% @doc Returns the numeral string represented by a floating-point
+%% literal node.
+%% @see c_float/1
+
+float_lit(Node) ->
+ float_to_list(float_val(Node)).
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_atom(Name) -> cerl()
+%% Name = atom() | string()
+%%
+%% @doc Creates an abstract atom literal. The print name of the atom
+%% is the character sequence represented by <code>Name</code>.
+%%
+%% <p>Note: passing a string as argument to this function causes a
+%% corresponding atom to be created for the internal representation.</p>
+%%
+%% @see ann_c_atom/2
+%% @see is_c_atom/1
+%% @see atom_val/1
+%% @see atom_name/1
+%% @see atom_lit/1
+
+c_atom(Name) when atom(Name) ->
+ #literal{val = Name};
+c_atom(Name) ->
+ #literal{val = list_to_atom(Name)}.
+
+
+%% @spec ann_c_atom(As::[term()], Name) -> cerl()
+%% Name = atom() | string()
+%% @see c_atom/1
+
+ann_c_atom(As, Name) when atom(Name) ->
+ #literal{val = Name, ann = As};
+ann_c_atom(As, Name) ->
+ #literal{val = list_to_atom(Name), ann = As}.
+
+
+%% @spec is_c_atom(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> represents an
+%% atom literal, otherwise <code>false</code>.
+%%
+%% @see c_atom/1
+
+is_c_atom(#literal{val = V}) when atom(V) ->
+ true;
+is_c_atom(_) ->
+ false.
+
+%% @spec atom_val(cerl())-> atom()
+%%
+%% @doc Returns the value represented by an abstract atom.
+%%
+%% @see c_atom/1
+
+atom_val(Node) ->
+ Node#literal.val.
+
+
+%% @spec atom_name(cerl()) -> string()
+%%
+%% @doc Returns the printname of an abstract atom.
+%%
+%% @see c_atom/1
+
+atom_name(Node) ->
+ atom_to_list(atom_val(Node)).
+
+
+%% @spec atom_lit(cerl()) -> string()
+%%
+%% @doc Returns the literal string represented by an abstract
+%% atom. This always includes surrounding single-quote characters.
+%%
+%% <p>Note that an abstract atom may have several literal
+%% representations, and that the representation yielded by this
+%% function is not fixed; e.g.,
+%% <code>atom_lit(c_atom("a\012b"))</code> could yield the string
+%% <code>"\'a\\nb\'"</code>.</p>
+%%
+%% @see c_atom/1
+
+%% TODO: replace the use of the unofficial 'write_string/2'.
+
+atom_lit(Node) ->
+ io_lib:write_string(atom_name(Node), $'). %' stupid Emacs.
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_char(Value) -> cerl()
+%%
+%% Value = char() | integer()
+%%
+%% @doc Creates an abstract character literal. If the local
+%% implementation of Erlang defines <code>char()</code> as a subset of
+%% <code>integer()</code>, this function is equivalent to
+%% <code>c_int/1</code>. Otherwise, if the given value is an integer,
+%% it will be converted to the character with the corresponding
+%% code. The lexical representation of a character is
+%% "<code>$<em>Char</em></code>", where <code>Char</code> is a single
+%% printing character or an escape sequence.
+%%
+%% @see c_int/1
+%% @see c_string/1
+%% @see ann_c_char/2
+%% @see is_c_char/1
+%% @see char_val/1
+%% @see char_lit/1
+%% @see is_print_char/1
+
+c_char(Value) when integer(Value), Value >= 0 ->
+ #literal{val = Value}.
+
+
+%% @spec ann_c_char(As::[term()], Value::char()) -> cerl()
+%% @see c_char/1
+
+ann_c_char(As, Value) ->
+ #literal{val = Value, ann = As}.
+
+
+%% @spec is_c_char(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> may represent a
+%% character literal, otherwise <code>false</code>.
+%%
+%% <p>If the local implementation of Erlang defines
+%% <code>char()</code> as a subset of <code>integer()</code>, then
+%% <code>is_c_int(<em>Node</em>)</code> will also yield
+%% <code>true</code>.</p>
+%%
+%% @see c_char/1
+%% @see is_print_char/1
+
+is_c_char(#literal{val = V}) when integer(V), V >= 0 ->
+ is_char_value(V);
+is_c_char(_) ->
+ false.
+
+
+%% @spec is_print_char(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> may represent a
+%% "printing" character, otherwise <code>false</code>. (Cf.
+%% <code>is_c_char/1</code>.) A "printing" character has either a
+%% given graphical representation, or a "named" escape sequence such
+%% as "<code>\n</code>". Currently, only ISO 8859-1 (Latin-1)
+%% character values are recognized.
+%%
+%% @see c_char/1
+%% @see is_c_char/1
+
+is_print_char(#literal{val = V}) when integer(V), V >= 0 ->
+ is_print_char_value(V);
+is_print_char(_) ->
+ false.
+
+
+%% @spec char_val(cerl()) -> char()
+%%
+%% @doc Returns the value represented by an abstract character literal.
+%%
+%% @see c_char/1
+
+char_val(Node) ->
+ Node#literal.val.
+
+
+%% @spec char_lit(cerl()) -> string()
+%%
+%% @doc Returns the literal string represented by an abstract
+%% character. This includes a leading <code>$</code>
+%% character. Currently, all characters that are not in the set of ISO
+%% 8859-1 (Latin-1) "printing" characters will be escaped.
+%%
+%% @see c_char/1
+
+char_lit(Node) ->
+ io_lib:write_char(char_val(Node)).
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_string(Value::string()) -> cerl()
+%%
+%% @doc Creates an abstract string literal. Equivalent to creating an
+%% abstract list of the corresponding character literals
+%% (cf. <code>is_c_string/1</code>), but is typically more
+%% efficient. The lexical representation of a string is
+%% "<code>"<em>Chars</em>"</code>", where <code>Chars</code> is a
+%% sequence of printing characters or spaces.
+%%
+%% @see c_char/1
+%% @see ann_c_string/2
+%% @see is_c_string/1
+%% @see string_val/1
+%% @see string_lit/1
+%% @see is_print_string/1
+
+c_string(Value) ->
+ #literal{val = Value}.
+
+
+%% @spec ann_c_string(As::[term()], Value::string()) -> cerl()
+%% @see c_string/1
+
+ann_c_string(As, Value) ->
+ #literal{val = Value, ann = As}.
+
+
+%% @spec is_c_string(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> may represent a
+%% string literal, otherwise <code>false</code>. Strings are defined
+%% as lists of characters; see <code>is_c_char/1</code> for details.
+%%
+%% @see c_string/1
+%% @see is_c_char/1
+%% @see is_print_string/1
+
+is_c_string(#literal{val = V}) ->
+ is_char_list(V);
+is_c_string(_) ->
+ false.
+
+
+%% @spec is_print_string(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> may represent a
+%% string literal containing only "printing" characters, otherwise
+%% <code>false</code>. See <code>is_c_string/1</code> and
+%% <code>is_print_char/1</code> for details. Currently, only ISO
+%% 8859-1 (Latin-1) character values are recognized.
+%%
+%% @see c_string/1
+%% @see is_c_string/1
+%% @see is_print_char/1
+
+is_print_string(#literal{val = V}) ->
+ is_print_char_list(V);
+is_print_string(_) ->
+ false.
+
+
+%% @spec string_val(cerl()) -> string()
+%%
+%% @doc Returns the value represented by an abstract string literal.
+%%
+%% @see c_string/1
+
+string_val(Node) ->
+ Node#literal.val.
+
+
+%% @spec string_lit(cerl()) -> string()
+%%
+%% @doc Returns the literal string represented by an abstract string.
+%% This includes surrounding double-quote characters
+%% <code>"..."</code>. Currently, characters that are not in the set
+%% of ISO 8859-1 (Latin-1) "printing" characters will be escaped,
+%% except for spaces.
+%%
+%% @see c_string/1
+
+string_lit(Node) ->
+ io_lib:write_string(string_val(Node)).
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_nil() -> cerl()
+%%
+%% @doc Creates an abstract empty list. The result represents
+%% "<code>[]</code>". The empty list is traditionally called "nil".
+%%
+%% @see ann_c_nil/1
+%% @see is_c_list/1
+%% @see c_cons/2
+
+c_nil() ->
+ #literal{val = []}.
+
+
+%% @spec ann_c_nil(As::[term()]) -> cerl()
+%% @see c_nil/0
+
+ann_c_nil(As) ->
+ #literal{val = [], ann = As}.
+
+
+%% @spec is_c_nil(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> is an abstract
+%% empty list, otherwise <code>false</code>.
+
+is_c_nil(#literal{val = []}) ->
+ true;
+is_c_nil(_) ->
+ false.
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_cons(Head::cerl(), Tail::cerl()) -> cerl()
+%%
+%% @doc Creates an abstract list constructor. The result represents
+%% "<code>[<em>Head</em> | <em>Tail</em>]</code>". Note that if both
+%% <code>Head</code> and <code>Tail</code> have type
+%% <code>literal</code>, then the result will also have type
+%% <code>literal</code>, and annotations on <code>Head</code> and
+%% <code>Tail</code> are lost.
+%%
+%% <p>Recall that in Erlang, the tail element of a list constructor is
+%% not necessarily a list.</p>
+%%
+%% @see ann_c_cons/3
+%% @see update_c_cons/3
+%% @see c_cons_skel/2
+%% @see is_c_cons/1
+%% @see cons_hd/1
+%% @see cons_tl/1
+%% @see is_c_list/1
+%% @see c_nil/0
+%% @see list_elements/1
+%% @see list_length/1
+%% @see make_list/2
+
+-record(cons, {ann = [], hd, tl}).
+
+%% *Always* collapse literals.
+
+c_cons(#literal{val = Head}, #literal{val = Tail}) ->
+ #literal{val = [Head | Tail]};
+c_cons(Head, Tail) ->
+ #cons{hd = Head, tl = Tail}.
+
+
+%% @spec ann_c_cons(As::[term()], Head::cerl(), Tail::cerl()) -> cerl()
+%% @see c_cons/2
+
+ann_c_cons(As, #literal{val = Head}, #literal{val = Tail}) ->
+ #literal{val = [Head | Tail], ann = As};
+ann_c_cons(As, Head, Tail) ->
+ #cons{hd = Head, tl = Tail, ann = As}.
+
+
+%% @spec update_c_cons(Old::cerl(), Head::cerl(), Tail::cerl()) ->
+%% cerl()
+%% @see c_cons/2
+
+update_c_cons(Node, #literal{val = Head}, #literal{val = Tail}) ->
+ #literal{val = [Head | Tail], ann = get_ann(Node)};
+update_c_cons(Node, Head, Tail) ->
+ #cons{hd = Head, tl = Tail, ann = get_ann(Node)}.
+
+
+%% @spec c_cons_skel(Head::cerl(), Tail::cerl()) -> cerl()
+%%
+%% @doc Creates an abstract list constructor skeleton. Does not fold
+%% constant literals, i.e., the result always has type
+%% <code>cons</code>, representing "<code>[<em>Head</em> |
+%% <em>Tail</em>]</code>".
+%%
+%% <p>This function is occasionally useful when it is necessary to have
+%% annotations on the subnodes of a list constructor node, even when the
+%% subnodes are constant literals. Note however that
+%% <code>is_literal/1</code> will yield <code>false</code> and
+%% <code>concrete/1</code> will fail if passed the result from this
+%% function.</p>
+%%
+%% <p><code>fold_literal/1</code> can be used to revert a node to the
+%% normal-form representation.</p>
+%%
+%% @see ann_c_cons_skel/3
+%% @see update_c_cons_skel/3
+%% @see c_cons/2
+%% @see is_c_cons/1
+%% @see is_c_list/1
+%% @see c_nil/0
+%% @see is_literal/1
+%% @see fold_literal/1
+%% @see concrete/1
+
+%% *Never* collapse literals.
+
+c_cons_skel(Head, Tail) ->
+ #cons{hd = Head, tl = Tail}.
+
+
+%% @spec ann_c_cons_skel(As::[term()], Head::cerl(), Tail::cerl()) ->
+%% cerl()
+%% @see c_cons_skel/2
+
+ann_c_cons_skel(As, Head, Tail) ->
+ #cons{hd = Head, tl = Tail, ann = As}.
+
+
+%% @spec update_c_cons_skel(Old::cerl(), Head::cerl(), Tail::cerl()) ->
+%% cerl()
+%% @see c_cons_skel/2
+
+update_c_cons_skel(Node, Head, Tail) ->
+ #cons{hd = Head, tl = Tail, ann = get_ann(Node)}.
+
+
+%% @spec is_c_cons(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> is an abstract
+%% list constructor, otherwise <code>false</code>.
+
+is_c_cons(#cons{}) ->
+ true;
+is_c_cons(#literal{val = [_ | _]}) ->
+ true;
+is_c_cons(_) ->
+ false.
+
+
+%% @spec cons_hd(cerl()) -> cerl()
+%%
+%% @doc Returns the head subtree of an abstract list constructor.
+%%
+%% @see c_cons/2
+
+cons_hd(#cons{hd = Head}) ->
+ Head;
+cons_hd(#literal{val = [Head | _]}) ->
+ #literal{val = Head}.
+
+
+%% @spec cons_tl(cerl()) -> cerl()
+%%
+%% @doc Returns the tail subtree of an abstract list constructor.
+%%
+%% <p>Recall that the tail does not necessarily represent a proper
+%% list.</p>
+%%
+%% @see c_cons/2
+
+cons_tl(#cons{tl = Tail}) ->
+ Tail;
+cons_tl(#literal{val = [_ | Tail]}) ->
+ #literal{val = Tail}.
+
+
+%% @spec is_c_list(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> represents a
+%% proper list, otherwise <code>false</code>. A proper list is either
+%% the empty list <code>[]</code>, or a cons cell <code>[<em>Head</em> |
+%% <em>Tail</em>]</code>, where recursively <code>Tail</code> is a
+%% proper list.
+%%
+%% <p>Note: Because <code>Node</code> is a syntax tree, the actual
+%% run-time values corresponding to its subtrees may often be partially
+%% or completely unknown. Thus, if <code>Node</code> represents e.g.
+%% "<code>[... | Ns]</code>" (where <code>Ns</code> is a variable), then
+%% the function will return <code>false</code>, because it is not known
+%% whether <code>Ns</code> will be bound to a list at run-time. If
+%% <code>Node</code> instead represents e.g. "<code>[1, 2, 3]</code>" or
+%% "<code>[A | []]</code>", then the function will return
+%% <code>true</code>.</p>
+%%
+%% @see c_cons/2
+%% @see c_nil/0
+%% @see list_elements/1
+%% @see list_length/1
+
+is_c_list(#cons{tl = Tail}) ->
+ is_c_list(Tail);
+is_c_list(#literal{val = V}) ->
+ is_proper_list(V);
+is_c_list(_) ->
+ false.
+
+is_proper_list([_ | Tail]) ->
+ is_proper_list(Tail);
+is_proper_list([]) ->
+ true;
+is_proper_list(_) ->
+ false.
+
+%% @spec list_elements(cerl()) -> [cerl()]
+%%
+%% @doc Returns the list of element subtrees of an abstract list.
+%% <code>Node</code> must represent a proper list. E.g., if
+%% <code>Node</code> represents "<code>[<em>X1</em>, <em>X2</em> |
+%% [<em>X3</em>, <em>X4</em> | []]</code>", then
+%% <code>list_elements(Node)</code> yields the list <code>[X1, X2, X3,
+%% X4]</code>.
+%%
+%% @see c_cons/2
+%% @see c_nil/1
+%% @see is_c_list/1
+%% @see list_length/1
+%% @see make_list/2
+
+list_elements(#cons{hd = Head, tl = Tail}) ->
+ [Head | list_elements(Tail)];
+list_elements(#literal{val = V}) ->
+ abstract_list(V).
+
+abstract_list([X | Xs]) ->
+ [abstract(X) | abstract_list(Xs)];
+abstract_list([]) ->
+ [].
+
+
+%% @spec list_length(Node::cerl()) -> integer()
+%%
+%% @doc Returns the number of element subtrees of an abstract list.
+%% <code>Node</code> must represent a proper list. E.g., if
+%% <code>Node</code> represents "<code>[X1 | [X2, X3 | [X4, X5,
+%% X6]]]</code>", then <code>list_length(Node)</code> returns the
+%% integer 6.
+%%
+%% <p>Note: this is equivalent to
+%% <code>length(list_elements(Node))</code>, but potentially more
+%% efficient.</p>
+%%
+%% @see c_cons/2
+%% @see c_nil/1
+%% @see is_c_list/1
+%% @see list_elements/1
+
+list_length(L) ->
+ list_length(L, 0).
+
+list_length(#cons{tl = Tail}, A) ->
+ list_length(Tail, A + 1);
+list_length(#literal{val = V}, A) ->
+ A + length(V).
+
+
+%% @spec make_list(List) -> Node
+%% @equiv make_list(List, none)
+
+make_list(List) ->
+ ann_make_list([], List).
+
+
+%% @spec make_list(List::[cerl()], Tail) -> cerl()
+%%
+%% Tail = cerl() | none
+%%
+%% @doc Creates an abstract list from the elements in <code>List</code>
+%% and the optional <code>Tail</code>. If <code>Tail</code> is
+%% <code>none</code>, the result will represent a nil-terminated list,
+%% otherwise it represents "<code>[... | <em>Tail</em>]</code>".
+%%
+%% @see c_cons/2
+%% @see c_nil/0
+%% @see ann_make_list/3
+%% @see update_list/3
+%% @see list_elements/1
+
+make_list(List, Tail) ->
+ ann_make_list([], List, Tail).
+
+
+%% @spec update_list(Old::cerl(), List::[cerl()]) -> cerl()
+%% @equiv update_list(Old, List, none)
+
+update_list(Node, List) ->
+ ann_make_list(get_ann(Node), List).
+
+
+%% @spec update_list(Old::cerl(), List::[cerl()], Tail) -> cerl()
+%%
+%% Tail = cerl() | none
+%%
+%% @see make_list/2
+%% @see update_list/2
+
+update_list(Node, List, Tail) ->
+ ann_make_list(get_ann(Node), List, Tail).
+
+
+%% @spec ann_make_list(As::[term()], List::[cerl()]) -> cerl()
+%% @equiv ann_make_list(As, List, none)
+
+ann_make_list(As, List) ->
+ ann_make_list(As, List, none).
+
+
+%% @spec ann_make_list(As::[term()], List::[cerl()], Tail) -> cerl()
+%%
+%% Tail = cerl() | none
+%%
+%% @see make_list/2
+%% @see ann_make_list/2
+
+ann_make_list(As, [H | T], Tail) ->
+ ann_c_cons(As, H, make_list(T, Tail)); % `c_cons' folds literals
+ann_make_list(As, [], none) ->
+ ann_c_nil(As);
+ann_make_list(_, [], Node) ->
+ Node.
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_tuple(Elements::[cerl()]) -> cerl()
+%%
+%% @doc Creates an abstract tuple. If <code>Elements</code> is
+%% <code>[E1, ..., En]</code>, the result represents
+%% "<code>{<em>E1</em>, ..., <em>En</em>}</code>". Note that if all
+%% nodes in <code>Elements</code> have type <code>literal</code>, or if
+%% <code>Elements</code> is empty, then the result will also have type
+%% <code>literal</code> and annotations on nodes in
+%% <code>Elements</code> are lost.
+%%
+%% <p>Recall that Erlang has distinct 1-tuples, i.e., <code>{X}</code>
+%% is always distinct from <code>X</code> itself.</p>
+%%
+%% @see ann_c_tuple/2
+%% @see update_c_tuple/2
+%% @see is_c_tuple/1
+%% @see tuple_es/1
+%% @see tuple_arity/1
+%% @see c_tuple_skel/1
+
+-record(tuple, {ann = [], es}).
+
+%% *Always* collapse literals.
+
+c_tuple(Es) ->
+ case is_lit_list(Es) of
+ false ->
+ #tuple{es = Es};
+ true ->
+ #literal{val = list_to_tuple(lit_list_vals(Es))}
+ end.
+
+
+%% @spec ann_c_tuple(As::[term()], Elements::[cerl()]) -> cerl()
+%% @see c_tuple/1
+
+ann_c_tuple(As, Es) ->
+ case is_lit_list(Es) of
+ false ->
+ #tuple{es = Es, ann = As};
+ true ->
+ #literal{val = list_to_tuple(lit_list_vals(Es)), ann = As}
+ end.
+
+
+%% @spec update_c_tuple(Old::cerl(), Elements::[cerl()]) -> cerl()
+%% @see c_tuple/1
+
+update_c_tuple(Node, Es) ->
+ case is_lit_list(Es) of
+ false ->
+ #tuple{es = Es, ann = get_ann(Node)};
+ true ->
+ #literal{val = list_to_tuple(lit_list_vals(Es)),
+ ann = get_ann(Node)}
+ end.
+
+
+%% @spec c_tuple_skel(Elements::[cerl()]) -> cerl()
+%%
+%% @doc Creates an abstract tuple skeleton. Does not fold constant
+%% literals, i.e., the result always has type <code>tuple</code>,
+%% representing "<code>{<em>E1</em>, ..., <em>En</em>}</code>", if
+%% <code>Elements</code> is <code>[E1, ..., En]</code>.
+%%
+%% <p>This function is occasionally useful when it is necessary to have
+%% annotations on the subnodes of a tuple node, even when all the
+%% subnodes are constant literals. Note however that
+%% <code>is_literal/1</code> will yield <code>false</code> and
+%% <code>concrete/1</code> will fail if passed the result from this
+%% function.</p>
+%%
+%% <p><code>fold_literal/1</code> can be used to revert a node to the
+%% normal-form representation.</p>
+%%
+%% @see ann_c_tuple_skel/2
+%% @see update_c_tuple_skel/2
+%% @see c_tuple/1
+%% @see tuple_es/1
+%% @see is_c_tuple/1
+%% @see is_literal/1
+%% @see fold_literal/1
+%% @see concrete/1
+
+%% *Never* collapse literals.
+
+c_tuple_skel(Es) ->
+ #tuple{es = Es}.
+
+
+%% @spec ann_c_tuple_skel(As::[term()], Elements::[cerl()]) -> cerl()
+%% @see c_tuple_skel/1
+
+ann_c_tuple_skel(As, Es) ->
+ #tuple{es = Es, ann = As}.
+
+
+%% @spec update_c_tuple_skel(Old::cerl(), Elements::[cerl()]) -> cerl()
+%% @see c_tuple_skel/1
+
+update_c_tuple_skel(Old, Es) ->
+ #tuple{es = Es, ann = get_ann(Old)}.
+
+
+%% @spec is_c_tuple(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> is an abstract
+%% tuple, otherwise <code>false</code>.
+%%
+%% @see c_tuple/1
+
+is_c_tuple(#tuple{}) ->
+ true;
+is_c_tuple(#literal{val = V}) when tuple(V) ->
+ true;
+is_c_tuple(_) ->
+ false.
+
+
+%% @spec tuple_es(cerl()) -> [cerl()]
+%%
+%% @doc Returns the list of element subtrees of an abstract tuple.
+%%
+%% @see c_tuple/1
+
+tuple_es(#tuple{es = Es}) ->
+ Es;
+tuple_es(#literal{val = V}) ->
+ make_lit_list(tuple_to_list(V)).
+
+
+%% @spec tuple_arity(Node::cerl()) -> integer()
+%%
+%% @doc Returns the number of element subtrees of an abstract tuple.
+%%
+%% <p>Note: this is equivalent to <code>length(tuple_es(Node))</code>,
+%% but potentially more efficient.</p>
+%%
+%% @see tuple_es/1
+%% @see c_tuple/1
+
+tuple_arity(#tuple{es = Es}) ->
+ length(Es);
+tuple_arity(#literal{val = V}) when tuple(V) ->
+ size(V).
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_var(Name::var_name()) -> cerl()
+%%
+%% var_name() = integer() | atom() | {atom(), integer()}
+%%
+%% @doc Creates an abstract variable. A variable is identified by its
+%% name, given by the <code>Name</code> parameter.
+%%
+%% <p>If a name is given by a single atom, it should either be a
+%% "simple" atom which does not need to be single-quoted in Erlang, or
+%% otherwise its print name should correspond to a proper Erlang
+%% variable, i.e., begin with an uppercase character or an
+%% underscore. Names on the form <code>{A, N}</code> represent
+%% function name variables "<code><em>A</em>/<em>N</em></code>"; these
+%% are special variables which may be bound only in the function
+%% definitions of a module or a <code>letrec</code>. They may not be
+%% bound in <code>let</code> expressions and cannot occur in clause
+%% patterns. The atom <code>A</code> in a function name may be any
+%% atom; the integer <code>N</code> must be nonnegative. The functions
+%% <code>c_fname/2</code> etc. are utilities for handling function
+%% name variables.</p>
+%%
+%% <p>When printing variable names, they must have the form of proper
+%% Core Erlang variables and function names. E.g., a name represented
+%% by an integer such as <code>42</code> could be formatted as
+%% "<code>_42</code>", an atom <code>'Xxx'</code> simply as
+%% "<code>Xxx</code>", and an atom <code>foo</code> as
+%% "<code>_foo</code>". However, one must assure that any two valid
+%% distinct names are never mapped to the same strings. Tuples such
+%% as <code>{foo, 2}</code> representing function names can simply by
+%% formatted as "<code>'foo'/2</code>", with no risk of conflicts.</p>
+%%
+%% @see ann_c_var/2
+%% @see update_c_var/2
+%% @see is_c_var/1
+%% @see var_name/1
+%% @see c_fname/2
+%% @see c_module/4
+%% @see c_letrec/2
+
+-record(var, {ann = [], name}).
+
+c_var(Name) ->
+ #var{name = Name}.
+
+
+%% @spec ann_c_var(As::[term()], Name::var_name()) -> cerl()
+%%
+%% @see c_var/1
+
+ann_c_var(As, Name) ->
+ #var{name = Name, ann = As}.
+
+%% @spec update_c_var(Old::cerl(), Name::var_name()) -> cerl()
+%%
+%% @see c_var/1
+
+update_c_var(Node, Name) ->
+ #var{name = Name, ann = get_ann(Node)}.
+
+
+%% @spec is_c_var(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> is an abstract
+%% variable, otherwise <code>false</code>.
+%%
+%% @see c_var/1
+
+is_c_var(#var{}) ->
+ true;
+is_c_var(_) ->
+ false.
+
+
+%% @spec c_fname(Name::atom(), Arity::integer()) -> cerl()
+%% @equiv c_var({Name, Arity})
+%% @see fname_id/1
+%% @see fname_arity/1
+%% @see is_c_fname/1
+%% @see ann_c_fname/3
+%% @see update_c_fname/3
+
+c_fname(Atom, Arity) ->
+ c_var({Atom, Arity}).
+
+
+%% @spec ann_c_fname(As::[term()], Name::atom(), Arity::integer()) ->
+%% cerl()
+%% @equiv ann_c_var(As, {Atom, Arity})
+%% @see c_fname/2
+
+ann_c_fname(As, Atom, Arity) ->
+ ann_c_var(As, {Atom, Arity}).
+
+
+%% @spec update_c_fname(Old::cerl(), Name::atom()) -> cerl()
+%% @doc Like <code>update_c_fname/3</code>, but takes the arity from
+%% <code>Node</code>.
+%% @see update_c_fname/3
+%% @see c_fname/2
+
+update_c_fname(#var{name = {_, Arity}, ann = As}, Atom) ->
+ #var{name = {Atom, Arity}, ann = As}.
+
+
+%% @spec update_c_fname(Old::cerl(), Name::atom(), Arity::integer()) ->
+%% cerl()
+%% @equiv update_c_var(Old, {Atom, Arity})
+%% @see update_c_fname/2
+%% @see c_fname/2
+
+update_c_fname(Node, Atom, Arity) ->
+ update_c_var(Node, {Atom, Arity}).
+
+
+%% @spec is_c_fname(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> is an abstract
+%% function name variable, otherwise <code>false</code>.
+%%
+%% @see c_fname/2
+%% @see c_var/1
+%% @see c_var_name/1
+
+is_c_fname(#var{name = {A, N}}) when atom(A), integer(N), N >= 0 ->
+ true;
+is_c_fname(_) ->
+ false.
+
+
+%% @spec var_name(cerl()) -> var_name()
+%%
+%% @doc Returns the name of an abstract variable.
+%%
+%% @see c_var/1
+
+var_name(Node) ->
+ Node#var.name.
+
+
+%% @spec fname_id(cerl()) -> atom()
+%%
+%% @doc Returns the identifier part of an abstract function name
+%% variable.
+%%
+%% @see fname_arity/1
+%% @see c_fname/2
+
+fname_id(#var{name={A,_}}) ->
+ A.
+
+
+%% @spec fname_arity(cerl()) -> integer()
+%%
+%% @doc Returns the arity part of an abstract function name variable.
+%%
+%% @see fname_id/1
+%% @see c_fname/2
+
+fname_arity(#var{name={_,N}}) ->
+ N.
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_values(Elements::[cerl()]) -> cerl()
+%%
+%% @doc Creates an abstract value list. If <code>Elements</code> is
+%% <code>[E1, ..., En]</code>, the result represents
+%% "<code>&lt;<em>E1</em>, ..., <em>En</em>&gt;</code>".
+%%
+%% @see ann_c_values/2
+%% @see update_c_values/2
+%% @see is_c_values/1
+%% @see values_es/1
+%% @see values_arity/1
+
+-record(values, {ann = [], es}).
+
+c_values(Es) ->
+ #values{es = Es}.
+
+
+%% @spec ann_c_values(As::[term()], Elements::[cerl()]) -> cerl()
+%% @see c_values/1
+
+ann_c_values(As, Es) ->
+ #values{es = Es, ann = As}.
+
+
+%% @spec update_c_values(Old::cerl(), Elements::[cerl()]) -> cerl()
+%% @see c_values/1
+
+update_c_values(Node, Es) ->
+ #values{es = Es, ann = get_ann(Node)}.
+
+
+%% @spec is_c_values(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> is an abstract
+%% value list; otherwise <code>false</code>.
+%%
+%% @see c_values/1
+
+is_c_values(#values{}) ->
+ true;
+is_c_values(_) ->
+ false.
+
+
+%% @spec values_es(cerl()) -> [cerl()]
+%%
+%% @doc Returns the list of element subtrees of an abstract value
+%% list.
+%%
+%% @see c_values/1
+%% @see values_arity/1
+
+values_es(Node) ->
+ Node#values.es.
+
+
+%% @spec values_arity(Node::cerl()) -> integer()
+%%
+%% @doc Returns the number of element subtrees of an abstract value
+%% list.
+%%
+%% <p>Note: This is equivalent to
+%% <code>length(values_es(Node))</code>, but potentially more
+%% efficient.</p>
+%%
+%% @see c_values/1
+%% @see values_es/1
+
+values_arity(Node) ->
+ length(values_es(Node)).
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_binary(Segments::[cerl()]) -> cerl()
+%%
+%% @doc Creates an abstract binary-template. A binary object is a
+%% sequence of 8-bit bytes. It is specified by zero or more bit-string
+%% template <em>segments</em> of arbitrary lengths (in number of bits),
+%% such that the sum of the lengths is evenly divisible by 8. If
+%% <code>Segments</code> is <code>[S1, ..., Sn]</code>, the result
+%% represents "<code>#{<em>S1</em>, ..., <em>Sn</em>}#</code>". All the
+%% <code>Si</code> must have type <code>bitstr</code>.
+%%
+%% @see ann_c_binary/2
+%% @see update_c_binary/2
+%% @see is_c_binary/1
+%% @see binary_segments/1
+%% @see c_bitstr/5
+
+-record(binary, {ann = [], segments}).
+
+c_binary(Segments) ->
+ #binary{segments = Segments}.
+
+
+%% @spec ann_c_binary(As::[term()], Segments::[cerl()]) -> cerl()
+%% @see c_binary/1
+
+ann_c_binary(As, Segments) ->
+ #binary{segments = Segments, ann = As}.
+
+
+%% @spec update_c_binary(Old::cerl(), Segments::[cerl()]) -> cerl()
+%% @see c_binary/1
+
+update_c_binary(Node, Segments) ->
+ #binary{segments = Segments, ann = get_ann(Node)}.
+
+
+%% @spec is_c_binary(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> is an abstract
+%% binary-template; otherwise <code>false</code>.
+%%
+%% @see c_binary/1
+
+is_c_binary(#binary{}) ->
+ true;
+is_c_binary(_) ->
+ false.
+
+
+%% @spec binary_segments(cerl()) -> [cerl()]
+%%
+%% @doc Returns the list of segment subtrees of an abstract
+%% binary-template.
+%%
+%% @see c_binary/1
+%% @see c_bitstr/5
+
+binary_segments(Node) ->
+ Node#binary.segments.
+
+
+%% @spec c_bitstr(Value::cerl(), Size::cerl(), Unit::cerl(),
+%% Type::cerl(), Flags::cerl()) -> cerl()
+%%
+%% @doc Creates an abstract bit-string template. These can only occur as
+%% components of an abstract binary-template (see {@link c_binary/1}).
+%% The result represents "<code>#&lt;<em>Value</em>&gt;(<em>Size</em>,
+%% <em>Unit</em>, <em>Type</em>, <em>Flags</em>)</code>", where
+%% <code>Unit</code> must represent a positive integer constant,
+%% <code>Type</code> must represent a constant atom (one of
+%% <code>'integer'</code>, <code>'float'</code>, or
+%% <code>'binary'</code>), and <code>Flags</code> must represent a
+%% constant list <code>"[<em>F1</em>, ..., <em>Fn</em>]"</code> where
+%% all the <code>Fi</code> are atoms.
+%%
+%% @see c_binary/1
+%% @see ann_c_bitstr/6
+%% @see update_c_bitstr/6
+%% @see is_c_bitstr/1
+%% @see bitstr_val/1
+%% @see bitstr_size/1
+%% @see bitstr_unit/1
+%% @see bitstr_type/1
+%% @see bitstr_flags/1
+
+-record(bitstr, {ann = [], val, size, unit, type, flags}).
+
+c_bitstr(Val, Size, Unit, Type, Flags) ->
+ #bitstr{val = Val, size = Size, unit = Unit, type = Type,
+ flags = Flags}.
+
+
+%% @spec c_bitstr(Value::cerl(), Size::cerl(), Type::cerl(),
+%% Flags::cerl()) -> cerl()
+%% @equiv c_bitstr(Value, Size, abstract(1), Type, Flags)
+
+c_bitstr(Val, Size, Type, Flags) ->
+ c_bitstr(Val, Size, abstract(1), Type, Flags).
+
+
+%% @spec c_bitstr(Value::cerl(), Type::cerl(),
+%% Flags::cerl()) -> cerl()
+%% @equiv c_bitstr(Value, abstract(all), abstract(1), Type, Flags)
+
+c_bitstr(Val, Type, Flags) ->
+ c_bitstr(Val, abstract(all), abstract(1), Type, Flags).
+
+
+%% @spec ann_c_bitstr(As::[term()], Value::cerl(), Size::cerl(),
+%% Unit::cerl(), Type::cerl(), Flags::cerl()) -> cerl()
+%% @see c_bitstr/5
+%% @see ann_c_bitstr/5
+
+ann_c_bitstr(As, Val, Size, Unit, Type, Flags) ->
+ #bitstr{val = Val, size = Size, unit = Unit, type = Type,
+ flags = Flags, ann = As}.
+
+%% @spec ann_c_bitstr(As::[term()], Value::cerl(), Size::cerl(),
+%% Type::cerl(), Flags::cerl()) -> cerl()
+%% @equiv ann_c_bitstr(As, Value, Size, abstract(1), Type, Flags)
+
+ann_c_bitstr(As, Value, Size, Type, Flags) ->
+ ann_c_bitstr(As, Value, Size, abstract(1), Type, Flags).
+
+
+%% @spec update_c_bitstr(Old::cerl(), Value::cerl(), Size::cerl(),
+%% Unit::cerl(), Type::cerl(), Flags::cerl()) -> cerl()
+%% @see c_bitstr/5
+%% @see update_c_bitstr/5
+
+update_c_bitstr(Node, Val, Size, Unit, Type, Flags) ->
+ #bitstr{val = Val, size = Size, unit = Unit, type = Type,
+ flags = Flags, ann = get_ann(Node)}.
+
+
+%% @spec update_c_bitstr(Old::cerl(), Value::cerl(), Size::cerl(),
+%% Type::cerl(), Flags::cerl()) -> cerl()
+%% @equiv update_c_bitstr(Node, Value, Size, abstract(1), Type, Flags)
+
+update_c_bitstr(Node, Value, Size, Type, Flags) ->
+ update_c_bitstr(Node, Value, Size, abstract(1), Type, Flags).
+
+%% @spec is_c_bitstr(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> is an abstract
+%% bit-string template; otherwise <code>false</code>.
+%%
+%% @see c_bitstr/5
+
+is_c_bitstr(#bitstr{}) ->
+ true;
+is_c_bitstr(_) ->
+ false.
+
+
+%% @spec bitstr_val(cerl()) -> cerl()
+%%
+%% @doc Returns the value subtree of an abstract bit-string template.
+%%
+%% @see c_bitstr/5
+
+bitstr_val(Node) ->
+ Node#bitstr.val.
+
+
+%% @spec bitstr_size(cerl()) -> cerl()
+%%
+%% @doc Returns the size subtree of an abstract bit-string template.
+%%
+%% @see c_bitstr/5
+
+bitstr_size(Node) ->
+ Node#bitstr.size.
+
+
+%% @spec bitstr_bitsize(cerl()) -> integer() | any | all
+%%
+%% @doc Returns the total size in bits of an abstract bit-string
+%% template. If the size field is an integer literal, the result is the
+%% product of the size and unit values; if the size field is the atom
+%% literal <code>all</code>, the atom <code>all</code> is returned; in
+%% all other cases, the atom <code>any</code> is returned.
+%%
+%% @see c_bitstr/5
+
+bitstr_bitsize(Node) ->
+ Size = Node#bitstr.size,
+ case is_literal(Size) of
+ true ->
+ case concrete(Size) of
+ all ->
+ all;
+ S when integer(S) ->
+ S*concrete(Node#bitstr.unit);
+ true ->
+ any
+ end;
+ false ->
+ any
+ end.
+
+
+%% @spec bitstr_unit(cerl()) -> cerl()
+%%
+%% @doc Returns the unit subtree of an abstract bit-string template.
+%%
+%% @see c_bitstr/5
+
+bitstr_unit(Node) ->
+ Node#bitstr.unit.
+
+
+%% @spec bitstr_type(cerl()) -> cerl()
+%%
+%% @doc Returns the type subtree of an abstract bit-string template.
+%%
+%% @see c_bitstr/5
+
+bitstr_type(Node) ->
+ Node#bitstr.type.
+
+
+%% @spec bitstr_flags(cerl()) -> cerl()
+%%
+%% @doc Returns the flags subtree of an abstract bit-string template.
+%%
+%% @see c_bitstr/5
+
+bitstr_flags(Node) ->
+ Node#bitstr.flags.
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_fun(Variables::[cerl()], Body::cerl()) -> cerl()
+%%
+%% @doc Creates an abstract fun-expression. If <code>Variables</code>
+%% is <code>[V1, ..., Vn]</code>, the result represents "<code>fun
+%% (<em>V1</em>, ..., <em>Vn</em>) -> <em>Body</em></code>". All the
+%% <code>Vi</code> must have type <code>var</code>.
+%%
+%% @see ann_c_fun/3
+%% @see update_c_fun/3
+%% @see is_c_fun/1
+%% @see fun_vars/1
+%% @see fun_body/1
+%% @see fun_arity/1
+
+-record('fun', {ann = [], vars, body}).
+
+c_fun(Variables, Body) ->
+ #'fun'{vars = Variables, body = Body}.
+
+
+%% @spec ann_c_fun(As::[term()], Variables::[cerl()], Body::cerl()) ->
+%% cerl()
+%% @see c_fun/2
+
+ann_c_fun(As, Variables, Body) ->
+ #'fun'{vars = Variables, body = Body, ann = As}.
+
+
+%% @spec update_c_fun(Old::cerl(), Variables::[cerl()],
+%% Body::cerl()) -> cerl()
+%% @see c_fun/2
+
+update_c_fun(Node, Variables, Body) ->
+ #'fun'{vars = Variables, body = Body, ann = get_ann(Node)}.
+
+
+%% @spec is_c_fun(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> is an abstract
+%% fun-expression, otherwise <code>false</code>.
+%%
+%% @see c_fun/2
+
+is_c_fun(#'fun'{}) ->
+ true; % Now this is fun!
+is_c_fun(_) ->
+ false.
+
+
+%% @spec fun_vars(cerl()) -> [cerl()]
+%%
+%% @doc Returns the list of parameter subtrees of an abstract
+%% fun-expression.
+%%
+%% @see c_fun/2
+%% @see fun_arity/1
+
+fun_vars(Node) ->
+ Node#'fun'.vars.
+
+
+%% @spec fun_body(cerl()) -> cerl()
+%%
+%% @doc Returns the body subtree of an abstract fun-expression.
+%%
+%% @see c_fun/2
+
+fun_body(Node) ->
+ Node#'fun'.body.
+
+
+%% @spec fun_arity(Node::cerl()) -> integer()
+%%
+%% @doc Returns the number of parameter subtrees of an abstract
+%% fun-expression.
+%%
+%% <p>Note: this is equivalent to <code>length(fun_vars(Node))</code>,
+%% but potentially more efficient.</p>
+%%
+%% @see c_fun/2
+%% @see fun_vars/1
+
+fun_arity(Node) ->
+ length(fun_vars(Node)).
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_seq(Argument::cerl(), Body::cerl()) -> cerl()
+%%
+%% @doc Creates an abstract sequencing expression. The result
+%% represents "<code>do <em>Argument</em> <em>Body</em></code>".
+%%
+%% @see ann_c_seq/3
+%% @see update_c_seq/3
+%% @see is_c_seq/1
+%% @see seq_arg/1
+%% @see seq_body/1
+
+-record(seq, {ann = [], arg, body}).
+
+c_seq(Argument, Body) ->
+ #seq{arg = Argument, body = Body}.
+
+
+%% @spec ann_c_seq(As::[term()], Argument::cerl(), Body::cerl()) ->
+%% cerl()
+%% @see c_seq/2
+
+ann_c_seq(As, Argument, Body) ->
+ #seq{arg = Argument, body = Body, ann = As}.
+
+
+%% @spec update_c_seq(Old::cerl(), Argument::cerl(), Body::cerl()) ->
+%% cerl()
+%% @see c_seq/2
+
+update_c_seq(Node, Argument, Body) ->
+ #seq{arg = Argument, body = Body, ann = get_ann(Node)}.
+
+
+%% @spec is_c_seq(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> is an abstract
+%% sequencing expression, otherwise <code>false</code>.
+%%
+%% @see c_seq/2
+
+is_c_seq(#seq{}) ->
+ true;
+is_c_seq(_) ->
+ false.
+
+
+%% @spec seq_arg(cerl()) -> cerl()
+%%
+%% @doc Returns the argument subtree of an abstract sequencing
+%% expression.
+%%
+%% @see c_seq/2
+
+seq_arg(Node) ->
+ Node#seq.arg.
+
+
+%% @spec seq_body(cerl()) -> cerl()
+%%
+%% @doc Returns the body subtree of an abstract sequencing expression.
+%%
+%% @see c_seq/2
+
+seq_body(Node) ->
+ Node#seq.body.
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_let(Variables::[cerl()], Argument::cerl(), Body::cerl()) ->
+%% cerl()
+%%
+%% @doc Creates an abstract let-expression. If <code>Variables</code>
+%% is <code>[V1, ..., Vn]</code>, the result represents "<code>let
+%% &lt;<em>V1</em>, ..., <em>Vn</em>&gt; = <em>Argument</em> in
+%% <em>Body</em></code>". All the <code>Vi</code> must have type
+%% <code>var</code>.
+%%
+%% @see ann_c_let/4
+%% @see update_c_let/4
+%% @see is_c_let/1
+%% @see let_vars/1
+%% @see let_arg/1
+%% @see let_body/1
+%% @see let_arity/1
+
+-record('let', {ann = [], vars, arg, body}).
+
+c_let(Variables, Argument, Body) ->
+ #'let'{vars = Variables, arg = Argument, body = Body}.
+
+
+%% ann_c_let(As, Variables, Argument, Body) -> Node
+%% @see c_let/3
+
+ann_c_let(As, Variables, Argument, Body) ->
+ #'let'{vars = Variables, arg = Argument, body = Body, ann = As}.
+
+
+%% update_c_let(Old, Variables, Argument, Body) -> Node
+%% @see c_let/3
+
+update_c_let(Node, Variables, Argument, Body) ->
+ #'let'{vars = Variables, arg = Argument, body = Body,
+ ann = get_ann(Node)}.
+
+
+%% @spec is_c_let(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> is an abstract
+%% let-expression, otherwise <code>false</code>.
+%%
+%% @see c_let/3
+
+is_c_let(#'let'{}) ->
+ true;
+is_c_let(_) ->
+ false.
+
+
+%% @spec let_vars(cerl()) -> [cerl()]
+%%
+%% @doc Returns the list of left-hand side variables of an abstract
+%% let-expression.
+%%
+%% @see c_let/3
+%% @see let_arity/1
+
+let_vars(Node) ->
+ Node#'let'.vars.
+
+
+%% @spec let_arg(cerl()) -> cerl()
+%%
+%% @doc Returns the argument subtree of an abstract let-expression.
+%%
+%% @see c_let/3
+
+let_arg(Node) ->
+ Node#'let'.arg.
+
+
+%% @spec let_body(cerl()) -> cerl()
+%%
+%% @doc Returns the body subtree of an abstract let-expression.
+%%
+%% @see c_let/3
+
+let_body(Node) ->
+ Node#'let'.body.
+
+
+%% @spec let_arity(Node::cerl()) -> integer()
+%%
+%% @doc Returns the number of left-hand side variables of an abstract
+%% let-expression.
+%%
+%% <p>Note: this is equivalent to <code>length(let_vars(Node))</code>,
+%% but potentially more efficient.</p>
+%%
+%% @see c_let/3
+%% @see let_vars/1
+
+let_arity(Node) ->
+ length(let_vars(Node)).
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_letrec(Definitions::[{cerl(), cerl()}], Body::cerl()) ->
+%% cerl()
+%%
+%% @doc Creates an abstract letrec-expression. If
+%% <code>Definitions</code> is <code>[{V1, F1}, ..., {Vn, Fn}]</code>,
+%% the result represents "<code>letrec <em>V1</em> = <em>F1</em>
+%% ... <em>Vn</em> = <em>Fn</em> in <em>Body</em></code>. All the
+%% <code>Vi</code> must have type <code>var</code> and represent
+%% function names. All the <code>Fi</code> must have type
+%% <code>'fun'</code>.
+%%
+%% @see ann_c_letrec/3
+%% @see update_c_letrec/3
+%% @see is_c_letrec/1
+%% @see letrec_defs/1
+%% @see letrec_body/1
+%% @see letrec_vars/1
+
+-record(letrec, {ann = [], defs, body}).
+
+c_letrec(Defs, Body) ->
+ #letrec{defs = Defs, body = Body}.
+
+
+%% @spec ann_c_letrec(As::[term()], Definitions::[{cerl(), cerl()}],
+%% Body::cerl()) -> cerl()
+%% @see c_letrec/2
+
+ann_c_letrec(As, Defs, Body) ->
+ #letrec{defs = Defs, body = Body, ann = As}.
+
+
+%% @spec update_c_letrec(Old::cerl(),
+%% Definitions::[{cerl(), cerl()}],
+%% Body::cerl()) -> cerl()
+%% @see c_letrec/2
+
+update_c_letrec(Node, Defs, Body) ->
+ #letrec{defs = Defs, body = Body, ann = get_ann(Node)}.
+
+
+%% @spec is_c_letrec(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> is an abstract
+%% letrec-expression, otherwise <code>false</code>.
+%%
+%% @see c_letrec/2
+
+is_c_letrec(#letrec{}) ->
+ true;
+is_c_letrec(_) ->
+ false.
+
+
+%% @spec letrec_defs(Node::cerl()) -> [{cerl(), cerl()}]
+%%
+%% @doc Returns the list of definitions of an abstract
+%% letrec-expression. If <code>Node</code> represents "<code>letrec
+%% <em>V1</em> = <em>F1</em> ... <em>Vn</em> = <em>Fn</em> in
+%% <em>Body</em></code>", the returned value is <code>[{V1, F1}, ...,
+%% {Vn, Fn}]</code>.
+%%
+%% @see c_letrec/2
+
+letrec_defs(Node) ->
+ Node#letrec.defs.
+
+
+%% @spec letrec_body(cerl()) -> cerl()
+%%
+%% @doc Returns the body subtree of an abstract letrec-expression.
+%%
+%% @see c_letrec/2
+
+letrec_body(Node) ->
+ Node#letrec.body.
+
+
+%% @spec letrec_vars(cerl()) -> [cerl()]
+%%
+%% @doc Returns the list of left-hand side function variable subtrees
+%% of a letrec-expression. If <code>Node</code> represents
+%% "<code>letrec <em>V1</em> = <em>F1</em> ... <em>Vn</em> =
+%% <em>Fn</em> in <em>Body</em></code>", the returned value is
+%% <code>[V1, ..., Vn]</code>.
+%%
+%% @see c_letrec/2
+
+letrec_vars(Node) ->
+ [F || {F, _} <- letrec_defs(Node)].
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_case(Argument::cerl(), Clauses::[cerl()]) -> cerl()
+%%
+%% @doc Creates an abstract case-expression. If <code>Clauses</code>
+%% is <code>[C1, ..., Cn]</code>, the result represents "<code>case
+%% <em>Argument</em> of <em>C1</em> ... <em>Cn</em>
+%% end</code>". <code>Clauses</code> must not be empty.
+%%
+%% @see ann_c_case/3
+%% @see update_c_case/3
+%% @see is_c_case/1
+%% @see c_clause/3
+%% @see case_arg/1
+%% @see case_clauses/1
+%% @see case_arity/1
+
+-record('case', {ann = [], arg, clauses}).
+
+c_case(Expr, Clauses) ->
+ #'case'{arg = Expr, clauses = Clauses}.
+
+
+%% @spec ann_c_case(As::[term()], Argument::cerl(),
+%% Clauses::[cerl()]) -> cerl()
+%% @see c_case/2
+
+ann_c_case(As, Expr, Clauses) ->
+ #'case'{arg = Expr, clauses = Clauses, ann = As}.
+
+
+%% @spec update_c_case(Old::cerl(), Argument::cerl(),
+%% Clauses::[cerl()]) -> cerl()
+%% @see c_case/2
+
+update_c_case(Node, Expr, Clauses) ->
+ #'case'{arg = Expr, clauses = Clauses, ann = get_ann(Node)}.
+
+
+%% is_c_case(Node) -> boolean()
+%%
+%% Node = cerl()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> is an abstract
+%% case-expression; otherwise <code>false</code>.
+%%
+%% @see c_case/2
+
+is_c_case(#'case'{}) ->
+ true;
+is_c_case(_) ->
+ false.
+
+
+%% @spec case_arg(cerl()) -> cerl()
+%%
+%% @doc Returns the argument subtree of an abstract case-expression.
+%%
+%% @see c_case/2
+
+case_arg(Node) ->
+ Node#'case'.arg.
+
+
+%% @spec case_clauses(cerl()) -> [cerl()]
+%%
+%% @doc Returns the list of clause subtrees of an abstract
+%% case-expression.
+%%
+%% @see c_case/2
+%% @see case_arity/1
+
+case_clauses(Node) ->
+ Node#'case'.clauses.
+
+
+%% @spec case_arity(Node::cerl()) -> integer()
+%%
+%% @doc Equivalent to
+%% <code>clause_arity(hd(case_clauses(Node)))</code>, but potentially
+%% more efficient.
+%%
+%% @see c_case/2
+%% @see case_clauses/1
+%% @see clause_arity/1
+
+case_arity(Node) ->
+ clause_arity(hd(case_clauses(Node))).
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_clause(Patterns::[cerl()], Body::cerl()) -> cerl()
+%% @equiv c_clause(Patterns, c_atom(true), Body)
+%% @see c_atom/1
+
+c_clause(Patterns, Body) ->
+ c_clause(Patterns, c_atom(true), Body).
+
+
+%% @spec c_clause(Patterns::[cerl()], Guard::cerl(), Body::cerl()) ->
+%% cerl()
+%%
+%% @doc Creates an an abstract clause. If <code>Patterns</code> is
+%% <code>[P1, ..., Pn]</code>, the result represents
+%% "<code>&lt;<em>P1</em>, ..., <em>Pn</em>&gt; when <em>Guard</em> ->
+%% <em>Body</em></code>".
+%%
+%% @see c_clause/2
+%% @see ann_c_clause/4
+%% @see update_c_clause/4
+%% @see is_c_clause/1
+%% @see c_case/2
+%% @see c_receive/3
+%% @see clause_pats/1
+%% @see clause_guard/1
+%% @see clause_body/1
+%% @see clause_arity/1
+%% @see clause_vars/1
+
+-record(clause, {ann = [], pats, guard, body}).
+
+c_clause(Patterns, Guard, Body) ->
+ #clause{pats = Patterns, guard = Guard, body = Body}.
+
+
+%% @spec ann_c_clause(As::[term()], Patterns::[cerl()],
+%% Body::cerl()) -> cerl()
+%% @equiv ann_c_clause(As, Patterns, c_atom(true), Body)
+%% @see c_clause/3
+ann_c_clause(As, Patterns, Body) ->
+ ann_c_clause(As, Patterns, c_atom(true), Body).
+
+
+%% @spec ann_c_clause(As::[term()], Patterns::[cerl()], Guard::cerl(),
+%% Body::cerl()) -> cerl()
+%% @see ann_c_clause/3
+%% @see c_clause/3
+
+ann_c_clause(As, Patterns, Guard, Body) ->
+ #clause{pats = Patterns, guard = Guard, body = Body, ann = As}.
+
+
+%% @spec update_c_clause(Old::cerl(), Patterns::[cerl()],
+%% Guard::cerl(), Body::cerl()) -> cerl()
+%% @see c_clause/3
+
+update_c_clause(Node, Patterns, Guard, Body) ->
+ #clause{pats = Patterns, guard = Guard, body = Body,
+ ann = get_ann(Node)}.
+
+
+%% @spec is_c_clause(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> is an abstract
+%% clause, otherwise <code>false</code>.
+%%
+%% @see c_clause/3
+
+is_c_clause(#clause{}) ->
+ true;
+is_c_clause(_) ->
+ false.
+
+
+%% @spec clause_pats(cerl()) -> [cerl()]
+%%
+%% @doc Returns the list of pattern subtrees of an abstract clause.
+%%
+%% @see c_clause/3
+%% @see clause_arity/1
+
+clause_pats(Node) ->
+ Node#clause.pats.
+
+
+%% @spec clause_guard(cerl()) -> cerl()
+%%
+%% @doc Returns the guard subtree of an abstract clause.
+%%
+%% @see c_clause/3
+
+clause_guard(Node) ->
+ Node#clause.guard.
+
+
+%% @spec clause_body(cerl()) -> cerl()
+%%
+%% @doc Returns the body subtree of an abstract clause.
+%%
+%% @see c_clause/3
+
+clause_body(Node) ->
+ Node#clause.body.
+
+
+%% @spec clause_arity(Node::cerl()) -> integer()
+%%
+%% @doc Returns the number of pattern subtrees of an abstract clause.
+%%
+%% <p>Note: this is equivalent to
+%% <code>length(clause_pats(Node))</code>, but potentially more
+%% efficient.</p>
+%%
+%% @see c_clause/3
+%% @see clause_pats/1
+
+clause_arity(Node) ->
+ length(clause_pats(Node)).
+
+
+%% @spec clause_vars(cerl()) -> [cerl()]
+%%
+%% @doc Returns the list of all abstract variables in the patterns of
+%% an abstract clause. The order of listing is not defined.
+%%
+%% @see c_clause/3
+%% @see pat_list_vars/1
+
+clause_vars(Clause) ->
+ pat_list_vars(clause_pats(Clause)).
+
+
+%% @spec pat_vars(Pattern::cerl()) -> [cerl()]
+%%
+%% @doc Returns the list of all abstract variables in a pattern. An
+%% exception is thrown if <code>Node</code> does not represent a
+%% well-formed Core Erlang clause pattern. The order of listing is not
+%% defined.
+%%
+%% @see pat_list_vars/1
+%% @see clause_vars/1
+
+pat_vars(Node) ->
+ pat_vars(Node, []).
+
+pat_vars(Node, Vs) ->
+ case type(Node) of
+ var ->
+ [Node | Vs];
+ literal ->
+ Vs;
+ cons ->
+ pat_vars(cons_hd(Node), pat_vars(cons_tl(Node), Vs));
+ tuple ->
+ pat_list_vars(tuple_es(Node), Vs);
+ binary ->
+ pat_list_vars(binary_segments(Node), Vs);
+ bitstr ->
+ pat_vars(bitstr_val(Node), Vs);
+ alias ->
+ pat_vars(alias_pat(Node), [alias_var(Node) | Vs])
+ end.
+
+
+%% @spec pat_list_vars(Patterns::[cerl()]) -> [cerl()]
+%%
+%% @doc Returns the list of all abstract variables in the given
+%% patterns. An exception is thrown if some element in
+%% <code>Patterns</code> does not represent a well-formed Core Erlang
+%% clause pattern. The order of listing is not defined.
+%%
+%% @see pat_vars/1
+%% @see clause_vars/1
+
+pat_list_vars(Ps) ->
+ pat_list_vars(Ps, []).
+
+pat_list_vars([P | Ps], Vs) ->
+ pat_list_vars(Ps, pat_vars(P, Vs));
+pat_list_vars([], Vs) ->
+ Vs.
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_alias(Variable::cerl(), Pattern::cerl()) -> cerl()
+%%
+%% @doc Creates an abstract pattern alias. The result represents
+%% "<code><em>Variable</em> = <em>Pattern</em></code>".
+%%
+%% @see ann_c_alias/3
+%% @see update_c_alias/3
+%% @see is_c_alias/1
+%% @see alias_var/1
+%% @see alias_pat/1
+%% @see c_clause/3
+
+-record(alias, {ann = [], var, pat}).
+
+c_alias(Var, Pattern) ->
+ #alias{var = Var, pat = Pattern}.
+
+
+%% @spec ann_c_alias(As::[term()], Variable::cerl(),
+%% Pattern::cerl()) -> cerl()
+%% @see c_alias/2
+
+ann_c_alias(As, Var, Pattern) ->
+ #alias{var = Var, pat = Pattern, ann = As}.
+
+
+%% @spec update_c_alias(Old::cerl(), Variable::cerl(),
+%% Pattern::cerl()) -> cerl()
+%% @see c_alias/2
+
+update_c_alias(Node, Var, Pattern) ->
+ #alias{var = Var, pat = Pattern, ann = get_ann(Node)}.
+
+
+%% @spec is_c_alias(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> is an abstract
+%% pattern alias, otherwise <code>false</code>.
+%%
+%% @see c_alias/2
+
+is_c_alias(#alias{}) ->
+ true;
+is_c_alias(_) ->
+ false.
+
+
+%% @spec alias_var(cerl()) -> cerl()
+%%
+%% @doc Returns the variable subtree of an abstract pattern alias.
+%%
+%% @see c_alias/2
+
+alias_var(Node) ->
+ Node#alias.var.
+
+
+%% @spec alias_pat(cerl()) -> cerl()
+%%
+%% @doc Returns the pattern subtree of an abstract pattern alias.
+%%
+%% @see c_alias/2
+
+alias_pat(Node) ->
+ Node#alias.pat.
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_receive(Clauses::[cerl()]) -> cerl()
+%% @equiv c_receive(Clauses, c_atom(infinity), c_atom(true))
+%% @see c_atom/1
+
+c_receive(Clauses) ->
+ c_receive(Clauses, c_atom(infinity), c_atom(true)).
+
+
+%% @spec c_receive(Clauses::[cerl()], Timeout::cerl(),
+%% Action::cerl()) -> cerl()
+%%
+%% @doc Creates an abstract receive-expression. If
+%% <code>Clauses</code> is <code>[C1, ..., Cn]</code>, the result
+%% represents "<code>receive <em>C1</em> ... <em>Cn</em> after
+%% <em>Timeout</em> -> <em>Action</em> end</code>".
+%%
+%% @see c_receive/1
+%% @see ann_c_receive/4
+%% @see update_c_receive/4
+%% @see is_c_receive/1
+%% @see receive_clauses/1
+%% @see receive_timeout/1
+%% @see receive_action/1
+
+-record('receive', {ann = [], clauses, timeout, action}).
+
+c_receive(Clauses, Timeout, Action) ->
+ #'receive'{clauses = Clauses, timeout = Timeout, action = Action}.
+
+
+%% @spec ann_c_receive(As::[term()], Clauses::[cerl()]) -> cerl()
+%% @equiv ann_c_receive(As, Clauses, c_atom(infinity), c_atom(true))
+%% @see c_receive/3
+%% @see c_atom/1
+
+ann_c_receive(As, Clauses) ->
+ ann_c_receive(As, Clauses, c_atom(infinity), c_atom(true)).
+
+
+%% @spec ann_c_receive(As::[term()], Clauses::[cerl()],
+%% Timeout::cerl(), Action::cerl()) -> cerl()
+%% @see ann_c_receive/2
+%% @see c_receive/3
+
+ann_c_receive(As, Clauses, Timeout, Action) ->
+ #'receive'{clauses = Clauses, timeout = Timeout, action = Action,
+ ann = As}.
+
+
+%% @spec update_c_receive(Old::cerl(), Clauses::[cerl()],
+%% Timeout::cerl(), Action::cerl()) -> cerl()
+%% @see c_receive/3
+
+update_c_receive(Node, Clauses, Timeout, Action) ->
+ #'receive'{clauses = Clauses, timeout = Timeout, action = Action,
+ ann = get_ann(Node)}.
+
+
+%% @spec is_c_receive(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> is an abstract
+%% receive-expression, otherwise <code>false</code>.
+%%
+%% @see c_receive/3
+
+is_c_receive(#'receive'{}) ->
+ true;
+is_c_receive(_) ->
+ false.
+
+
+%% @spec receive_clauses(cerl()) -> [cerl()]
+%%
+%% @doc Returns the list of clause subtrees of an abstract
+%% receive-expression.
+%%
+%% @see c_receive/3
+
+receive_clauses(Node) ->
+ Node#'receive'.clauses.
+
+
+%% @spec receive_timeout(cerl()) -> cerl()
+%%
+%% @doc Returns the timeout subtree of an abstract receive-expression.
+%%
+%% @see c_receive/3
+
+receive_timeout(Node) ->
+ Node#'receive'.timeout.
+
+
+%% @spec receive_action(cerl()) -> cerl()
+%%
+%% @doc Returns the action subtree of an abstract receive-expression.
+%%
+%% @see c_receive/3
+
+receive_action(Node) ->
+ Node#'receive'.action.
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_apply(Operator::cerl(), Arguments::[cerl()]) -> cerl()
+%%
+%% @doc Creates an abstract function application. If
+%% <code>Arguments</code> is <code>[A1, ..., An]</code>, the result
+%% represents "<code>apply <em>Operator</em>(<em>A1</em>, ...,
+%% <em>An</em>)</code>".
+%%
+%% @see ann_c_apply/3
+%% @see update_c_apply/3
+%% @see is_c_apply/1
+%% @see apply_op/1
+%% @see apply_args/1
+%% @see apply_arity/1
+%% @see c_call/3
+%% @see c_primop/2
+
+-record(apply, {ann = [], op, args}).
+
+c_apply(Operator, Arguments) ->
+ #apply{op = Operator, args = Arguments}.
+
+
+%% @spec ann_c_apply(As::[term()], Operator::cerl(),
+%% Arguments::[cerl()]) -> cerl()
+%% @see c_apply/2
+
+ann_c_apply(As, Operator, Arguments) ->
+ #apply{op = Operator, args = Arguments, ann = As}.
+
+
+%% @spec update_c_apply(Old::cerl(), Operator::cerl(),
+%% Arguments::[cerl()]) -> cerl()
+%% @see c_apply/2
+
+update_c_apply(Node, Operator, Arguments) ->
+ #apply{op = Operator, args = Arguments, ann = get_ann(Node)}.
+
+
+%% @spec is_c_apply(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> is an abstract
+%% function application, otherwise <code>false</code>.
+%%
+%% @see c_apply/2
+
+is_c_apply(#apply{}) ->
+ true;
+is_c_apply(_) ->
+ false.
+
+
+%% @spec apply_op(cerl()) -> cerl()
+%%
+%% @doc Returns the operator subtree of an abstract function
+%% application.
+%%
+%% @see c_apply/2
+
+apply_op(Node) ->
+ Node#apply.op.
+
+
+%% @spec apply_args(cerl()) -> [cerl()]
+%%
+%% @doc Returns the list of argument subtrees of an abstract function
+%% application.
+%%
+%% @see c_apply/2
+%% @see apply_arity/1
+
+apply_args(Node) ->
+ Node#apply.args.
+
+
+%% @spec apply_arity(Node::cerl()) -> integer()
+%%
+%% @doc Returns the number of argument subtrees of an abstract
+%% function application.
+%%
+%% <p>Note: this is equivalent to
+%% <code>length(apply_args(Node))</code>, but potentially more
+%% efficient.</p>
+%%
+%% @see c_apply/2
+%% @see apply_args/1
+
+apply_arity(Node) ->
+ length(apply_args(Node)).
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_call(Module::cerl(), Name::cerl(), Arguments::[cerl()]) ->
+%% cerl()
+%%
+%% @doc Creates an abstract inter-module call. If
+%% <code>Arguments</code> is <code>[A1, ..., An]</code>, the result
+%% represents "<code>call <em>Module</em>:<em>Name</em>(<em>A1</em>,
+%% ..., <em>An</em>)</code>".
+%%
+%% @see ann_c_call/4
+%% @see update_c_call/4
+%% @see is_c_call/1
+%% @see call_module/1
+%% @see call_name/1
+%% @see call_args/1
+%% @see call_arity/1
+%% @see c_apply/2
+%% @see c_primop/2
+
+-record(call, {ann = [], module, name, args}).
+
+c_call(Module, Name, Arguments) ->
+ #call{module = Module, name = Name, args = Arguments}.
+
+
+%% @spec ann_c_call(As::[term()], Module::cerl(), Name::cerl(),
+%% Arguments::[cerl()]) -> cerl()
+%% @see c_call/3
+
+ann_c_call(As, Module, Name, Arguments) ->
+ #call{module = Module, name = Name, args = Arguments, ann = As}.
+
+
+%% @spec update_c_call(Old::cerl(), Module::cerl(), Name::cerl(),
+%% Arguments::[cerl()]) -> cerl()
+%% @see c_call/3
+
+update_c_call(Node, Module, Name, Arguments) ->
+ #call{module = Module, name = Name, args = Arguments,
+ ann = get_ann(Node)}.
+
+
+%% @spec is_c_call(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> is an abstract
+%% inter-module call expression; otherwise <code>false</code>.
+%%
+%% @see c_call/3
+
+is_c_call(#call{}) ->
+ true;
+is_c_call(_) ->
+ false.
+
+
+%% @spec call_module(cerl()) -> cerl()
+%%
+%% @doc Returns the module subtree of an abstract inter-module call.
+%%
+%% @see c_call/3
+
+call_module(Node) ->
+ Node#call.module.
+
+
+%% @spec call_name(cerl()) -> cerl()
+%%
+%% @doc Returns the name subtree of an abstract inter-module call.
+%%
+%% @see c_call/3
+
+call_name(Node) ->
+ Node#call.name.
+
+
+%% @spec call_args(cerl()) -> [cerl()]
+%%
+%% @doc Returns the list of argument subtrees of an abstract
+%% inter-module call.
+%%
+%% @see c_call/3
+%% @see call_arity/1
+
+call_args(Node) ->
+ Node#call.args.
+
+
+%% @spec call_arity(Node::cerl()) -> integer()
+%%
+%% @doc Returns the number of argument subtrees of an abstract
+%% inter-module call.
+%%
+%% <p>Note: this is equivalent to
+%% <code>length(call_args(Node))</code>, but potentially more
+%% efficient.</p>
+%%
+%% @see c_call/3
+%% @see call_args/1
+
+call_arity(Node) ->
+ length(call_args(Node)).
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_primop(Name::cerl(), Arguments::[cerl()]) -> cerl()
+%%
+%% @doc Creates an abstract primitive operation call. If
+%% <code>Arguments</code> is <code>[A1, ..., An]</code>, the result
+%% represents "<code>primop <em>Name</em>(<em>A1</em>, ...,
+%% <em>An</em>)</code>". <code>Name</code> must be an atom literal.
+%%
+%% @see ann_c_primop/3
+%% @see update_c_primop/3
+%% @see is_c_primop/1
+%% @see primop_name/1
+%% @see primop_args/1
+%% @see primop_arity/1
+%% @see c_apply/2
+%% @see c_call/3
+
+-record(primop, {ann = [], name, args}).
+
+c_primop(Name, Arguments) ->
+ #primop{name = Name, args = Arguments}.
+
+
+%% @spec ann_c_primop(As::[term()], Name::cerl(),
+%% Arguments::[cerl()]) -> cerl()
+%% @see c_primop/2
+
+ann_c_primop(As, Name, Arguments) ->
+ #primop{name = Name, args = Arguments, ann = As}.
+
+
+%% @spec update_c_primop(Old::cerl(), Name::cerl(),
+%% Arguments::[cerl()]) -> cerl()
+%% @see c_primop/2
+
+update_c_primop(Node, Name, Arguments) ->
+ #primop{name = Name, args = Arguments, ann = get_ann(Node)}.
+
+
+%% @spec is_c_primop(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> is an abstract
+%% primitive operation call, otherwise <code>false</code>.
+%%
+%% @see c_primop/2
+
+is_c_primop(#primop{}) ->
+ true;
+is_c_primop(_) ->
+ false.
+
+
+%% @spec primop_name(cerl()) -> cerl()
+%%
+%% @doc Returns the name subtree of an abstract primitive operation
+%% call.
+%%
+%% @see c_primop/2
+
+primop_name(Node) ->
+ Node#primop.name.
+
+
+%% @spec primop_args(cerl()) -> [cerl()]
+%%
+%% @doc Returns the list of argument subtrees of an abstract primitive
+%% operation call.
+%%
+%% @see c_primop/2
+%% @see primop_arity/1
+
+primop_args(Node) ->
+ Node#primop.args.
+
+
+%% @spec primop_arity(Node::cerl()) -> integer()
+%%
+%% @doc Returns the number of argument subtrees of an abstract
+%% primitive operation call.
+%%
+%% <p>Note: this is equivalent to
+%% <code>length(primop_args(Node))</code>, but potentially more
+%% efficient.</p>
+%%
+%% @see c_primop/2
+%% @see primop_args/1
+
+primop_arity(Node) ->
+ length(primop_args(Node)).
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_try(Argument::cerl(), Variables::[cerl()], Body::cerl(),
+%% ExceptionVars::[cerl()], Handler::cerl()) -> cerl()
+%%
+%% @doc Creates an abstract try-expression. If <code>Variables</code> is
+%% <code>[V1, ..., Vn]</code> and <code>ExceptionVars</code> is
+%% <code>[X1, ..., Xm]</code>, the result represents "<code>try
+%% <em>Argument</em> of &lt;<em>V1</em>, ..., <em>Vn</em>&gt; ->
+%% <em>Body</em> catch &lt;<em>X1</em>, ..., <em>Xm</em>&gt; ->
+%% <em>Handler</em></code>". All the <code>Vi</code> and <code>Xi</code>
+%% must have type <code>var</code>.
+%%
+%% @see ann_c_try/6
+%% @see update_c_try/6
+%% @see is_c_try/1
+%% @see try_arg/1
+%% @see try_vars/1
+%% @see try_body/1
+%% @see c_catch/1
+
+-record('try', {ann = [], arg, vars, body, evars, handler}).
+
+c_try(Expr, Vs, Body, Evs, Handler) ->
+ #'try'{arg = Expr, vars = Vs, body = Body,
+ evars = Evs, handler = Handler}.
+
+
+%% @spec ann_c_try(As::[term()], Expression::cerl(),
+%% Variables::[cerl()], Body::cerl(),
+%% EVars::[cerl()], EBody::[cerl()]) -> cerl()
+%% @see c_try/3
+
+ann_c_try(As, Expr, Vs, Body, Evs, Handler) ->
+ #'try'{arg = Expr, vars = Vs, body = Body,
+ evars = Evs, handler = Handler, ann = As}.
+
+
+%% @spec update_c_try(Old::cerl(), Expression::cerl(),
+%% Variables::[cerl()], Body::cerl(),
+%% EVars::[cerl()], EBody::[cerl()]) -> cerl()
+%% @see c_try/3
+
+update_c_try(Node, Expr, Vs, Body, Evs, Handler) ->
+ #'try'{arg = Expr, vars = Vs, body = Body,
+ evars = Evs, handler = Handler, ann = get_ann(Node)}.
+
+
+%% @spec is_c_try(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> is an abstract
+%% try-expression, otherwise <code>false</code>.
+%%
+%% @see c_try/3
+
+is_c_try(#'try'{}) ->
+ true;
+is_c_try(_) ->
+ false.
+
+
+%% @spec try_arg(cerl()) -> cerl()
+%%
+%% @doc Returns the expression subtree of an abstract try-expression.
+%%
+%% @see c_try/3
+
+try_arg(Node) ->
+ Node#'try'.arg.
+
+
+%% @spec try_vars(cerl()) -> [cerl()]
+%%
+%% @doc Returns the list of success variable subtrees of an abstract
+%% try-expression.
+%%
+%% @see c_try/3
+
+try_vars(Node) ->
+ Node#'try'.vars.
+
+
+%% @spec try_body(cerl()) -> cerl()
+%%
+%% @doc Returns the success body subtree of an abstract try-expression.
+%%
+%% @see c_try/3
+
+try_body(Node) ->
+ Node#'try'.body.
+
+
+%% @spec try_evars(cerl()) -> [cerl()]
+%%
+%% @doc Returns the list of exception variable subtrees of an abstract
+%% try-expression.
+%%
+%% @see c_try/3
+
+try_evars(Node) ->
+ Node#'try'.evars.
+
+
+%% @spec try_handler(cerl()) -> cerl()
+%%
+%% @doc Returns the exception body subtree of an abstract
+%% try-expression.
+%%
+%% @see c_try/3
+
+try_handler(Node) ->
+ Node#'try'.handler.
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec c_catch(Body::cerl()) -> cerl()
+%%
+%% @doc Creates an abstract catch-expression. The result represents
+%% "<code>catch <em>Body</em></code>".
+%%
+%% <p>Note: catch-expressions can be rewritten as try-expressions, and
+%% will eventually be removed from Core Erlang.</p>
+%%
+%% @see ann_c_catch/2
+%% @see update_c_catch/2
+%% @see is_c_catch/1
+%% @see catch_body/1
+%% @see c_try/3
+
+-record('catch', {ann = [], body}).
+
+c_catch(Body) ->
+ #'catch'{body = Body}.
+
+
+%% @spec ann_c_catch(As::[term()], Body::cerl()) -> cerl()
+%% @see c_catch/1
+
+ann_c_catch(As, Body) ->
+ #'catch'{body = Body, ann = As}.
+
+
+%% @spec update_c_catch(Old::cerl(), Body::cerl()) -> cerl()
+%% @see c_catch/1
+
+update_c_catch(Node, Body) ->
+ #'catch'{body = Body, ann = get_ann(Node)}.
+
+
+%% @spec is_c_catch(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> is an abstract
+%% catch-expression, otherwise <code>false</code>.
+%%
+%% @see c_catch/1
+
+is_c_catch(#'catch'{}) ->
+ true;
+is_c_catch(_) ->
+ false.
+
+
+%% @spec catch_body(Node::cerl()) -> cerl()
+%%
+%% @doc Returns the body subtree of an abstract catch-expression.
+%%
+%% @see c_catch/1
+
+catch_body(Node) ->
+ Node#'catch'.body.
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec to_records(Tree::cerl()) -> record(record_types())
+%%
+%% @doc Translates an abstract syntax tree to a corresponding explicit
+%% record representation. The records are defined in the file
+%% "<code>cerl.hrl</code>".
+%%
+%% <p>Note: Compound constant literals are always unfolded in the
+%% record representation.</p>
+%%
+%% @see type/1
+%% @see from_records/1
+
+to_records(Node) ->
+ A = get_ann(Node),
+ case type(Node) of
+ literal ->
+ lit_to_records(concrete(Node), A);
+ binary ->
+ #c_binary{anno = A,
+ segments =
+ list_to_records(binary_segments(Node))};
+ bitstr ->
+ #c_bitstr{anno = A,
+ val = to_records(bitstr_val(Node)),
+ size = to_records(bitstr_size(Node)),
+ unit = to_records(bitstr_unit(Node)),
+ type = to_records(bitstr_type(Node)),
+ flags = to_records(bitstr_flags(Node))};
+ cons ->
+ #c_cons{anno = A,
+ hd = to_records(cons_hd(Node)),
+ tl = to_records(cons_tl(Node))};
+ tuple ->
+ #c_tuple{anno = A,
+ es = list_to_records(tuple_es(Node))};
+ var ->
+ case is_c_fname(Node) of
+ true ->
+ #c_fname{anno = A,
+ id = fname_id(Node),
+ arity = fname_arity(Node)};
+ false ->
+ #c_var{anno = A, name = var_name(Node)}
+ end;
+ values ->
+ #c_values{anno = A,
+ es = list_to_records(values_es(Node))};
+ 'fun' ->
+ #c_fun{anno = A,
+ vars = list_to_records(fun_vars(Node)),
+ body = to_records(fun_body(Node))};
+ seq ->
+ #c_seq{anno = A,
+ arg = to_records(seq_arg(Node)),
+ body = to_records(seq_body(Node))};
+ 'let' ->
+ #c_let{anno = A,
+ vars = list_to_records(let_vars(Node)),
+ arg = to_records(let_arg(Node)),
+ body = to_records(let_body(Node))};
+ letrec ->
+ #c_letrec{anno = A,
+ defs = [#c_def{name = to_records(N),
+ val = to_records(F)}
+ || {N, F} <- letrec_defs(Node)],
+ body = to_records(letrec_body(Node))};
+ 'case' ->
+ #c_case{anno = A,
+ arg = to_records(case_arg(Node)),
+ clauses =
+ list_to_records(case_clauses(Node))};
+ clause ->
+ #c_clause{anno = A,
+ pats = list_to_records(clause_pats(Node)),
+ guard = to_records(clause_guard(Node)),
+ body = to_records(clause_body(Node))};
+ alias ->
+ #c_alias{anno = A,
+ var = to_records(alias_var(Node)),
+ pat = to_records(alias_pat(Node))};
+ 'receive' ->
+ #c_receive{anno = A,
+ clauses =
+ list_to_records(receive_clauses(Node)),
+ timeout =
+ to_records(receive_timeout(Node)),
+ action =
+ to_records(receive_action(Node))};
+ apply ->
+ #c_apply{anno = A,
+ op = to_records(apply_op(Node)),
+ args = list_to_records(apply_args(Node))};
+ call ->
+ #c_call{anno = A,
+ module = to_records(call_module(Node)),
+ name = to_records(call_name(Node)),
+ args = list_to_records(call_args(Node))};
+ primop ->
+ #c_primop{anno = A,
+ name = to_records(primop_name(Node)),
+ args = list_to_records(primop_args(Node))};
+ 'try' ->
+ #c_try{anno = A,
+ arg = to_records(try_arg(Node)),
+ vars = list_to_records(try_vars(Node)),
+ body = to_records(try_body(Node)),
+ evars = list_to_records(try_evars(Node)),
+ handler = to_records(try_handler(Node))};
+ 'catch' ->
+ #c_catch{anno = A,
+ body = to_records(catch_body(Node))};
+ module ->
+ #c_module{anno = A,
+ name = to_records(module_name(Node)),
+ exports = list_to_records(
+ module_exports(Node)),
+ attrs = [#c_def{name = to_records(K),
+ val = to_records(V)}
+ || {K, V} <- module_attrs(Node)],
+ defs = [#c_def{name = to_records(N),
+ val = to_records(F)}
+ || {N, F} <- module_defs(Node)]}
+ end.
+
+list_to_records([T | Ts]) ->
+ [to_records(T) | list_to_records(Ts)];
+list_to_records([]) ->
+ [].
+
+lit_to_records(V, A) when integer(V) ->
+ #c_int{anno = A, val = V};
+lit_to_records(V, A) when float(V) ->
+ #c_float{anno = A, val = V};
+lit_to_records(V, A) when atom(V) ->
+ #c_atom{anno = A, val = V};
+lit_to_records([H | T] = V, A) ->
+ case is_print_char_list(V) of
+ true ->
+ #c_string{anno = A, val = V};
+ false ->
+ #c_cons{anno = A,
+ hd = lit_to_records(H, []),
+ tl = lit_to_records(T, [])}
+ end;
+lit_to_records([], A) ->
+ #c_nil{anno = A};
+lit_to_records(V, A) when tuple(V) ->
+ #c_tuple{anno = A, es = lit_list_to_records(tuple_to_list(V))}.
+
+lit_list_to_records([T | Ts]) ->
+ [lit_to_records(T, []) | lit_list_to_records(Ts)];
+lit_list_to_records([]) ->
+ [].
+
+
+%% @spec from_records(Tree::record(record_types())) -> cerl()
+%%
+%% record_types() = c_alias | c_apply | c_call | c_case | c_catch |
+%% c_clause | c_cons | c_def| c_fun | c_let |
+%% c_letrec |c_lit | c_module | c_primop |
+%% c_receive | c_seq | c_try | c_tuple |
+%% c_values | c_var
+%%
+%% @doc Translates an explicit record representation to a
+%% corresponding abstract syntax tree. The records are defined in the
+%% file "<code>cerl.hrl</code>".
+%%
+%% <p>Note: Compound constant literals are folded, discarding
+%% annotations on subtrees. There are no <code>c_def</code> nodes in
+%% the abstract representation; annotations on <code>c_def</code>
+%% records are discarded.</p>
+%%
+%% @see type/1
+%% @see to_records/1
+
+from_records(#c_int{val = V, anno = As}) ->
+ ann_c_int(As, V);
+from_records(#c_float{val = V, anno = As}) ->
+ ann_c_float(As, V);
+from_records(#c_atom{val = V, anno = As}) ->
+ ann_c_atom(As, V);
+from_records(#c_char{val = V, anno = As}) ->
+ ann_c_char(As, V);
+from_records(#c_string{val = V, anno = As}) ->
+ ann_c_string(As, V);
+from_records(#c_nil{anno = As}) ->
+ ann_c_nil(As);
+from_records(#c_binary{segments = Ss, anno = As}) ->
+ ann_c_binary(As, from_records_list(Ss));
+from_records(#c_bitstr{val = V, size = S, unit = U, type = T,
+ flags = Fs, anno = As}) ->
+ ann_c_bitstr(As, from_records(V), from_records(S), from_records(U),
+ from_records(T), from_records(Fs));
+from_records(#c_cons{hd = H, tl = T, anno = As}) ->
+ ann_c_cons(As, from_records(H), from_records(T));
+from_records(#c_tuple{es = Es, anno = As}) ->
+ ann_c_tuple(As, from_records_list(Es));
+from_records(#c_var{name = Name, anno = As}) ->
+ ann_c_var(As, Name);
+from_records(#c_fname{id = Id, arity = Arity, anno = As}) ->
+ ann_c_fname(As, Id, Arity);
+from_records(#c_values{es = Es, anno = As}) ->
+ ann_c_values(As, from_records_list(Es));
+from_records(#c_fun{vars = Vs, body = B, anno = As}) ->
+ ann_c_fun(As, from_records_list(Vs), from_records(B));
+from_records(#c_seq{arg = A, body = B, anno = As}) ->
+ ann_c_seq(As, from_records(A), from_records(B));
+from_records(#c_let{vars = Vs, arg = A, body = B, anno = As}) ->
+ ann_c_let(As, from_records_list(Vs), from_records(A),
+ from_records(B));
+from_records(#c_letrec{defs = Fs, body = B, anno = As}) ->
+ ann_c_letrec(As, [{from_records(N), from_records(F)}
+ || #c_def{name = N, val = F} <- Fs],
+ from_records(B));
+from_records(#c_case{arg = A, clauses = Cs, anno = As}) ->
+ ann_c_case(As, from_records(A), from_records_list(Cs));
+from_records(#c_clause{pats = Ps, guard = G, body = B, anno = As}) ->
+ ann_c_clause(As, from_records_list(Ps), from_records(G),
+ from_records(B));
+from_records(#c_alias{var = V, pat = P, anno = As}) ->
+ ann_c_alias(As, from_records(V), from_records(P));
+from_records(#c_receive{clauses = Cs, timeout = T, action = A,
+ anno = As}) ->
+ ann_c_receive(As, from_records_list(Cs), from_records(T),
+ from_records(A));
+from_records(#c_apply{op = Op, args = Es, anno = As}) ->
+ ann_c_apply(As, from_records(Op), from_records_list(Es));
+from_records(#c_call{module = M, name = N, args = Es, anno = As}) ->
+ ann_c_call(As, from_records(M), from_records(N),
+ from_records_list(Es));
+from_records(#c_primop{name = N, args = Es, anno = As}) ->
+ ann_c_primop(As, from_records(N), from_records_list(Es));
+from_records(#c_try{arg = E, vars = Vs, body = B,
+ evars = Evs, handler = H, anno = As}) ->
+ ann_c_try(As, from_records(E), from_records_list(Vs),
+ from_records(B), from_records_list(Evs), from_records(H));
+from_records(#c_catch{body = B, anno = As}) ->
+ ann_c_catch(As, from_records(B));
+from_records(#c_module{name = N, exports = Es, attrs = Ds, defs = Fs,
+ anno = As}) ->
+ ann_c_module(As, from_records(N),
+ from_records_list(Es),
+ [{from_records(K), from_records(V)}
+ || #c_def{name = K, val = V} <- Ds],
+ [{from_records(V), from_records(F)}
+ || #c_def{name = V, val = F} <- Fs]).
+
+from_records_list([T | Ts]) ->
+ [from_records(T) | from_records_list(Ts)];
+from_records_list([]) ->
+ [].
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec is_data(Node::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if <code>Node</code> represents a
+%% data constructor, otherwise <code>false</code>. Data constructors
+%% are cons cells, tuples, and atomic literals.
+%%
+%% @see data_type/1
+%% @see data_es/1
+%% @see data_arity/1
+
+is_data(#literal{}) ->
+ true;
+is_data(#cons{}) ->
+ true;
+is_data(#tuple{}) ->
+ true;
+is_data(_) ->
+ false.
+
+
+%% @spec data_type(Node::cerl()) -> dtype()
+%%
+%% dtype() = cons | tuple | {'atomic', Value}
+%% Value = integer() | float() | atom() | []
+%%
+%% @doc Returns a type descriptor for a data constructor
+%% node. (Cf. <code>is_data/1</code>.) This is mainly useful for
+%% comparing types and for constructing new nodes of the same type
+%% (cf. <code>make_data/2</code>). If <code>Node</code> represents an
+%% integer, floating-point number, atom or empty list, the result is
+%% <code>{'atomic', Value}</code>, where <code>Value</code> is the value
+%% of <code>concrete(Node)</code>, otherwise the result is either
+%% <code>cons</code> or <code>tuple</code>.
+%%
+%% <p>Type descriptors can be compared for equality or order (in the
+%% Erlang term order), but remember that floating-point values should
+%% in general never be tested for equality.</p>
+%%
+%% @see is_data/1
+%% @see make_data/2
+%% @see type/1
+%% @see concrete/1
+
+data_type(#literal{val = V}) ->
+ case V of
+ [_ | _] ->
+ cons;
+ _ when tuple(V) ->
+ tuple;
+ _ ->
+ {'atomic', V}
+ end;
+data_type(#cons{}) ->
+ cons;
+data_type(#tuple{}) ->
+ tuple.
+
+
+%% @spec data_es(Node::cerl()) -> [cerl()]
+%%
+%% @doc Returns the list of subtrees of a data constructor node. If
+%% the arity of the constructor is zero, the result is the empty list.
+%%
+%% <p>Note: if <code>data_type(Node)</code> is <code>cons</code>, the
+%% number of subtrees is exactly two. If <code>data_type(Node)</code>
+%% is <code>{'atomic', Value}</code>, the number of subtrees is
+%% zero.</p>
+%%
+%% @see is_data/1
+%% @see data_type/1
+%% @see data_arity/1
+%% @see make_data/2
+
+data_es(#literal{val = V}) ->
+ case V of
+ [Head | Tail] ->
+ [#literal{val = Head}, #literal{val = Tail}];
+ _ when tuple(V) ->
+ make_lit_list(tuple_to_list(V));
+ _ ->
+ []
+ end;
+data_es(#cons{hd = H, tl = T}) ->
+ [H, T];
+data_es(#tuple{es = Es}) ->
+ Es.
+
+
+%% @spec data_arity(Node::cerl()) -> integer()
+%%
+%% @doc Returns the number of subtrees of a data constructor
+%% node. This is equivalent to <code>length(data_es(Node))</code>, but
+%% potentially more efficient.
+%%
+%% @see is_data/1
+%% @see data_es/1
+
+data_arity(#literal{val = V}) ->
+ case V of
+ [_ | _] ->
+ 2;
+ _ when tuple(V) ->
+ size(V);
+ _ ->
+ 0
+ end;
+data_arity(#cons{}) ->
+ 2;
+data_arity(#tuple{es = Es}) ->
+ length(Es).
+
+
+%% @spec make_data(Type::dtype(), Elements::[cerl()]) -> cerl()
+%%
+%% @doc Creates a data constructor node with the specified type and
+%% subtrees. (Cf. <code>data_type/1</code>.) An exception is thrown
+%% if the length of <code>Elements</code> is invalid for the given
+%% <code>Type</code>; see <code>data_es/1</code> for arity constraints
+%% on constructor types.
+%%
+%% @see data_type/1
+%% @see data_es/1
+%% @see ann_make_data/3
+%% @see update_data/3
+%% @see make_data_skel/2
+
+make_data(CType, Es) ->
+ ann_make_data([], CType, Es).
+
+
+%% @spec ann_make_data(As::[term()], Type::dtype(),
+%% Elements::[cerl()]) -> cerl()
+%% @see make_data/2
+
+ann_make_data(As, {'atomic', V}, []) -> #literal{val = V, ann = As};
+ann_make_data(As, cons, [H, T]) -> ann_c_cons(As, H, T);
+ann_make_data(As, tuple, Es) -> ann_c_tuple(As, Es).
+
+
+%% @spec update_data(Old::cerl(), Type::dtype(),
+%% Elements::[cerl()]) -> cerl()
+%% @see make_data/2
+
+update_data(Node, CType, Es) ->
+ ann_make_data(get_ann(Node), CType, Es).
+
+
+%% @spec make_data_skel(Type::dtype(), Elements::[cerl()]) -> cerl()
+%%
+%% @doc Like <code>make_data/2</code>, but analogous to
+%% <code>c_tuple_skel/1</code> and <code>c_cons_skel/2</code>.
+%%
+%% @see ann_make_data_skel/3
+%% @see update_data_skel/3
+%% @see make_data/2
+%% @see c_tuple_skel/1
+%% @see c_cons_skel/2
+
+make_data_skel(CType, Es) ->
+ ann_make_data_skel([], CType, Es).
+
+
+%% @spec ann_make_data_skel(As::[term()], Type::dtype(),
+%% Elements::[cerl()]) -> cerl()
+%% @see make_data_skel/2
+
+ann_make_data_skel(As, {'atomic', V}, []) -> #literal{val = V, ann = As};
+ann_make_data_skel(As, cons, [H, T]) -> ann_c_cons_skel(As, H, T);
+ann_make_data_skel(As, tuple, Es) -> ann_c_tuple_skel(As, Es).
+
+
+%% @spec update_data_skel(Old::cerl(), Type::dtype(),
+%% Elements::[cerl()]) -> cerl()
+%% @see make_data_skel/2
+
+update_data_skel(Node, CType, Es) ->
+ ann_make_data_skel(get_ann(Node), CType, Es).
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec subtrees(Node::cerl()) -> [[cerl()]]
+%%
+%% @doc Returns the grouped list of all subtrees of a node. If
+%% <code>Node</code> is a leaf node (cf. <code>is_leaf/1</code>), this
+%% is the empty list, otherwise the result is always a nonempty list,
+%% containing the lists of subtrees of <code>Node</code>, in
+%% left-to-right order as they occur in the printed program text, and
+%% grouped by category. Often, each group contains only a single
+%% subtree.
+%%
+%% <p>Depending on the type of <code>Node</code>, the size of some
+%% groups may be variable (e.g., the group consisting of all the
+%% elements of a tuple), while others always contain the same number
+%% of elements - usually exactly one (e.g., the group containing the
+%% argument expression of a case-expression). Note, however, that the
+%% exact structure of the returned list (for a given node type) should
+%% in general not be depended upon, since it might be subject to
+%% change without notice.</p>
+%%
+%% <p>The function <code>subtrees/1</code> and the constructor functions
+%% <code>make_tree/2</code> and <code>update_tree/2</code> can be a
+%% great help if one wants to traverse a syntax tree, visiting all its
+%% subtrees, but treat nodes of the tree in a uniform way in most or all
+%% cases. Using these functions makes this simple, and also assures that
+%% your code is not overly sensitive to extensions of the syntax tree
+%% data type, because any node types not explicitly handled by your code
+%% can be left to a default case.</p>
+%%
+%% <p>For example:
+%% <pre>
+%% postorder(F, Tree) ->
+%% F(case subtrees(Tree) of
+%% [] -> Tree;
+%% List -> update_tree(Tree,
+%% [[postorder(F, Subtree)
+%% || Subtree &lt;- Group]
+%% || Group &lt;- List])
+%% end).
+%% </pre>
+%% maps the function <code>F</code> on <code>Tree</code> and all its
+%% subtrees, doing a post-order traversal of the syntax tree. (Note
+%% the use of <code>update_tree/2</code> to preserve annotations.) For
+%% a simple function like:
+%% <pre>
+%% f(Node) ->
+%% case type(Node) of
+%% atom -> atom("a_" ++ atom_name(Node));
+%% _ -> Node
+%% end.
+%% </pre>
+%% the call <code>postorder(fun f/1, Tree)</code> will yield a new
+%% representation of <code>Tree</code> in which all atom names have
+%% been extended with the prefix "a_", but nothing else (including
+%% annotations) has been changed.</p>
+%%
+%% @see is_leaf/1
+%% @see make_tree/2
+%% @see update_tree/2
+
+subtrees(T) ->
+ case is_leaf(T) of
+ true ->
+ [];
+ false ->
+ case type(T) of
+ values ->
+ [values_es(T)];
+ binary ->
+ [binary_segments(T)];
+ bitstr ->
+ [[bitstr_val(T)], [bitstr_size(T)],
+ [bitstr_unit(T)], [bitstr_type(T)],
+ [bitstr_flags(T)]];
+ cons ->
+ [[cons_hd(T)], [cons_tl(T)]];
+ tuple ->
+ [tuple_es(T)];
+ 'let' ->
+ [let_vars(T), [let_arg(T)], [let_body(T)]];
+ seq ->
+ [[seq_arg(T)], [seq_body(T)]];
+ apply ->
+ [[apply_op(T)], apply_args(T)];
+ call ->
+ [[call_module(T)], [call_name(T)],
+ call_args(T)];
+ primop ->
+ [[primop_name(T)], primop_args(T)];
+ 'case' ->
+ [[case_arg(T)], case_clauses(T)];
+ clause ->
+ [clause_pats(T), [clause_guard(T)],
+ [clause_body(T)]];
+ alias ->
+ [[alias_var(T)], [alias_pat(T)]];
+ 'fun' ->
+ [fun_vars(T), [fun_body(T)]];
+ 'receive' ->
+ [receive_clauses(T), [receive_timeout(T)],
+ [receive_action(T)]];
+ 'try' ->
+ [[try_arg(T)], try_vars(T), [try_body(T)],
+ try_evars(T), [try_handler(T)]];
+ 'catch' ->
+ [[catch_body(T)]];
+ letrec ->
+ Es = unfold_tuples(letrec_defs(T)),
+ [Es, [letrec_body(T)]];
+ module ->
+ As = unfold_tuples(module_attrs(T)),
+ Es = unfold_tuples(module_defs(T)),
+ [[module_name(T)], module_exports(T), As, Es]
+ end
+ end.
+
+
+%% @spec update_tree(Old::cerl(), Groups::[[cerl()]]) -> cerl()
+%%
+%% @doc Creates a syntax tree with the given subtrees, and the same
+%% type and annotations as the <code>Old</code> node. This is
+%% equivalent to <code>ann_make_tree(get_ann(Node), type(Node),
+%% Groups)</code>, but potentially more efficient.
+%%
+%% @see update_tree/3
+%% @see ann_make_tree/3
+%% @see get_ann/1
+%% @see type/1
+
+update_tree(Node, Gs) ->
+ ann_make_tree(get_ann(Node), type(Node), Gs).
+
+
+%% @spec update_tree(Old::cerl(), Type::atom(), Groups::[[cerl()]]) ->
+%% cerl()
+%%
+%% @doc Creates a syntax tree with the given type and subtrees, and
+%% the same annotations as the <code>Old</code> node. This is
+%% equivalent to <code>ann_make_tree(get_ann(Node), Type,
+%% Groups)</code>, but potentially more efficient.
+%%
+%% @see update_tree/2
+%% @see ann_make_tree/3
+%% @see get_ann/1
+
+update_tree(Node, Type, Gs) ->
+ ann_make_tree(get_ann(Node), Type, Gs).
+
+
+%% @spec make_tree(Type::atom(), Groups::[[cerl()]]) -> cerl()
+%%
+%% @doc Creates a syntax tree with the given type and subtrees.
+%% <code>Type</code> must be a node type name
+%% (cf. <code>type/1</code>) that does not denote a leaf node type
+%% (cf. <code>is_leaf/1</code>). <code>Groups</code> must be a
+%% <em>nonempty</em> list of groups of syntax trees, representing the
+%% subtrees of a node of the given type, in left-to-right order as
+%% they would occur in the printed program text, grouped by category
+%% as done by <code>subtrees/1</code>.
+%%
+%% <p>The result of <code>ann_make_tree(get_ann(Node), type(Node),
+%% subtrees(Node))</code> (cf. <code>update_tree/2</code>) represents
+%% the same source code text as the original <code>Node</code>,
+%% assuming that <code>subtrees(Node)</code> yields a nonempty
+%% list. However, it does not necessarily have the exact same data
+%% representation as <code>Node</code>.</p>
+%%
+%% @see ann_make_tree/3
+%% @see type/1
+%% @see is_leaf/1
+%% @see subtrees/1
+%% @see update_tree/2
+
+make_tree(Type, Gs) ->
+ ann_make_tree([], Type, Gs).
+
+
+%% @spec ann_make_tree(As::[term()], Type::atom(),
+%% Groups::[[cerl()]]) -> cerl()
+%%
+%% @doc Creates a syntax tree with the given annotations, type and
+%% subtrees. See <code>make_tree/2</code> for details.
+%%
+%% @see make_tree/2
+
+ann_make_tree(As, values, [Es]) -> ann_c_values(As, Es);
+ann_make_tree(As, binary, [Ss]) -> ann_c_binary(As, Ss);
+ann_make_tree(As, bitstr, [[V],[S],[U],[T],[Fs]]) ->
+ ann_c_bitstr(As, V, S, U, T, Fs);
+ann_make_tree(As, cons, [[H], [T]]) -> ann_c_cons(As, H, T);
+ann_make_tree(As, tuple, [Es]) -> ann_c_tuple(As, Es);
+ann_make_tree(As, 'let', [Vs, [A], [B]]) -> ann_c_let(As, Vs, A, B);
+ann_make_tree(As, seq, [[A], [B]]) -> ann_c_seq(As, A, B);
+ann_make_tree(As, apply, [[Op], Es]) -> ann_c_apply(As, Op, Es);
+ann_make_tree(As, call, [[M], [N], Es]) -> ann_c_call(As, M, N, Es);
+ann_make_tree(As, primop, [[N], Es]) -> ann_c_primop(As, N, Es);
+ann_make_tree(As, 'case', [[A], Cs]) -> ann_c_case(As, A, Cs);
+ann_make_tree(As, clause, [Ps, [G], [B]]) -> ann_c_clause(As, Ps, G, B);
+ann_make_tree(As, alias, [[V], [P]]) -> ann_c_alias(As, V, P);
+ann_make_tree(As, 'fun', [Vs, [B]]) -> ann_c_fun(As, Vs, B);
+ann_make_tree(As, 'receive', [Cs, [T], [A]]) ->
+ ann_c_receive(As, Cs, T, A);
+ann_make_tree(As, 'try', [[E], Vs, [B], Evs, [H]]) ->
+ ann_c_try(As, E, Vs, B, Evs, H);
+ann_make_tree(As, 'catch', [[B]]) -> ann_c_catch(As, B);
+ann_make_tree(As, letrec, [Es, [B]]) ->
+ ann_c_letrec(As, fold_tuples(Es), B);
+ann_make_tree(As, module, [[N], Xs, Es, Ds]) ->
+ ann_c_module(As, N, Xs, fold_tuples(Es), fold_tuples(Ds)).
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec meta(Tree::cerl()) -> cerl()
+%%
+%% @doc Creates a meta-representation of a syntax tree. The result
+%% represents an Erlang expression "<code><em>MetaTree</em></code>"
+%% which, if evaluated, will yield a new syntax tree representing the
+%% same source code text as <code>Tree</code> (although the actual
+%% data representation may be different). The expression represented
+%% by <code>MetaTree</code> is <em>implementation independent</em>
+%% with regard to the data structures used by the abstract syntax tree
+%% implementation.
+%%
+%% <p>Any node in <code>Tree</code> whose node type is
+%% <code>var</code> (cf. <code>type/1</code>), and whose list of
+%% annotations (cf. <code>get_ann/1</code>) contains the atom
+%% <code>meta_var</code>, will remain unchanged in the resulting tree,
+%% except that exactly one occurrence of <code>meta_var</code> is
+%% removed from its annotation list.</p>
+%%
+%% <p>The main use of the function <code>meta/1</code> is to transform
+%% a data structure <code>Tree</code>, which represents a piece of
+%% program code, into a form that is <em>representation independent
+%% when printed</em>. E.g., suppose <code>Tree</code> represents a
+%% variable named "V". Then (assuming a function <code>print/1</code>
+%% for printing syntax trees), evaluating
+%% <code>print(abstract(Tree))</code> - simply using
+%% <code>abstract/1</code> to map the actual data structure onto a
+%% syntax tree representation - would output a string that might look
+%% something like "<code>{var, ..., 'V'}</code>", which is obviously
+%% dependent on the implementation of the abstract syntax trees. This
+%% could e.g. be useful for caching a syntax tree in a file. However,
+%% in some situations like in a program generator generator (with two
+%% "generator"), it may be unacceptable. Using
+%% <code>print(meta(Tree))</code> instead would output a
+%% <em>representation independent</em> syntax tree generating
+%% expression; in the above case, something like
+%% "<code>cerl:c_var('V')</code>".</p>
+%%
+%% <p>The implementation tries to generate compact code with respect
+%% to literals and lists.</p>
+%%
+%% @see abstract/1
+%% @see type/1
+%% @see get_ann/1
+
+meta(Node) ->
+ %% First of all we check for metavariables:
+ case type(Node) of
+ var ->
+ case lists:member(meta_var, get_ann(Node)) of
+ false ->
+ meta_0(var, Node);
+ true ->
+ %% A meta-variable: remove the first found
+ %% 'meta_var' annotation, but otherwise leave
+ %% the node unchanged.
+ set_ann(Node, lists:delete(meta_var, get_ann(Node)))
+ end;
+ Type ->
+ meta_0(Type, Node)
+ end.
+
+meta_0(Type, Node) ->
+ case get_ann(Node) of
+ [] ->
+ meta_1(Type, Node);
+ As ->
+ meta_call(set_ann, [meta_1(Type, Node), abstract(As)])
+ end.
+
+meta_1(literal, Node) ->
+ %% We handle atomic literals separately, to get a bit
+ %% more compact code. For the rest, we use 'abstract'.
+ case concrete(Node) of
+ V when atom(V) ->
+ meta_call(c_atom, [Node]);
+ V when integer(V) ->
+ meta_call(c_int, [Node]);
+ V when float(V) ->
+ meta_call(c_float, [Node]);
+ [] ->
+ meta_call(c_nil, []);
+ _ ->
+ meta_call(abstract, [Node])
+ end;
+meta_1(var, Node) ->
+ %% A normal variable or function name.
+ meta_call(c_var, [abstract(var_name(Node))]);
+meta_1(values, Node) ->
+ meta_call(c_values,
+ [make_list(meta_list(values_es(Node)))]);
+meta_1(binary, Node) ->
+ meta_call(c_binary,
+ [make_list(meta_list(binary_segments(Node)))]);
+meta_1(bitstr, Node) ->
+ meta_call(c_bitstr,
+ [meta(bitstr_val(Node)),
+ meta(bitstr_size(Node)),
+ meta(bitstr_unit(Node)),
+ meta(bitstr_type(Node)),
+ meta(bitstr_flags(Node))]);
+meta_1(cons, Node) ->
+ %% The list is split up if some sublist has annotatations. If
+ %% we get exactly one element, we generate a 'c_cons' call
+ %% instead of 'make_list' to reconstruct the node.
+ case split_list(Node) of
+ {[H], none} ->
+ meta_call(c_cons, [meta(H), meta(c_nil())]);
+ {[H], Node1} ->
+ meta_call(c_cons, [meta(H), meta(Node1)]);
+ {L, none} ->
+ meta_call(make_list, [make_list(meta_list(L))]);
+ {L, Node1} ->
+ meta_call(make_list,
+ [make_list(meta_list(L)), meta(Node1)])
+ end;
+meta_1(tuple, Node) ->
+ meta_call(c_tuple,
+ [make_list(meta_list(tuple_es(Node)))]);
+meta_1('let', Node) ->
+ meta_call(c_let,
+ [make_list(meta_list(let_vars(Node))),
+ meta(let_arg(Node)), meta(let_body(Node))]);
+meta_1(seq, Node) ->
+ meta_call(c_seq,
+ [meta(seq_arg(Node)), meta(seq_body(Node))]);
+meta_1(apply, Node) ->
+ meta_call(c_apply,
+ [meta(apply_op(Node)),
+ make_list(meta_list(apply_args(Node)))]);
+meta_1(call, Node) ->
+ meta_call(c_call,
+ [meta(call_module(Node)), meta(call_name(Node)),
+ make_list(meta_list(call_args(Node)))]);
+meta_1(primop, Node) ->
+ meta_call(c_primop,
+ [meta(primop_name(Node)),
+ make_list(meta_list(primop_args(Node)))]);
+meta_1('case', Node) ->
+ meta_call(c_case,
+ [meta(case_arg(Node)),
+ make_list(meta_list(case_clauses(Node)))]);
+meta_1(clause, Node) ->
+ meta_call(c_clause,
+ [make_list(meta_list(clause_pats(Node))),
+ meta(clause_guard(Node)),
+ meta(clause_body(Node))]);
+meta_1(alias, Node) ->
+ meta_call(c_alias,
+ [meta(alias_var(Node)), meta(alias_pat(Node))]);
+meta_1('fun', Node) ->
+ meta_call(c_fun,
+ [make_list(meta_list(fun_vars(Node))),
+ meta(fun_body(Node))]);
+meta_1('receive', Node) ->
+ meta_call(c_receive,
+ [make_list(meta_list(receive_clauses(Node))),
+ meta(receive_timeout(Node)),
+ meta(receive_action(Node))]);
+meta_1('try', Node) ->
+ meta_call(c_try,
+ [meta(try_arg(Node)),
+ make_list(meta_list(try_vars(Node))),
+ meta(try_body(Node)),
+ make_list(meta_list(try_evars(Node))),
+ meta(try_handler(Node))]);
+meta_1('catch', Node) ->
+ meta_call(c_catch, [meta(catch_body(Node))]);
+meta_1(letrec, Node) ->
+ meta_call(c_letrec,
+ [make_list([c_tuple([meta(N), meta(F)])
+ || {N, F} <- letrec_defs(Node)]),
+ meta(letrec_body(Node))]);
+meta_1(module, Node) ->
+ meta_call(c_module,
+ [meta(module_name(Node)),
+ make_list(meta_list(module_exports(Node))),
+ make_list([c_tuple([meta(A), meta(V)])
+ || {A, V} <- module_attrs(Node)]),
+ make_list([c_tuple([meta(N), meta(F)])
+ || {N, F} <- module_defs(Node)])]).
+
+meta_call(F, As) ->
+ c_call(c_atom(?MODULE), c_atom(F), As).
+
+meta_list([T | Ts]) ->
+ [meta(T) | meta_list(Ts)];
+meta_list([]) ->
+ [].
+
+split_list(Node) ->
+ split_list(set_ann(Node, []), []).
+
+split_list(Node, L) ->
+ A = get_ann(Node),
+ case type(Node) of
+ cons when A == [] ->
+ split_list(cons_tl(Node), [cons_hd(Node) | L]);
+ nil when A == [] ->
+ {lists:reverse(L), none};
+ _ ->
+ {lists:reverse(L), Node}
+ end.
+
+
+%% ---------------------------------------------------------------------
+
+%% General utilities
+
+is_lit_list([#literal{} | Es]) ->
+ is_lit_list(Es);
+is_lit_list([_ | _]) ->
+ false;
+is_lit_list([]) ->
+ true.
+
+lit_list_vals([#literal{val = V} | Es]) ->
+ [V | lit_list_vals(Es)];
+lit_list_vals([]) ->
+ [].
+
+make_lit_list([V | Vs]) ->
+ [#literal{val = V} | make_lit_list(Vs)];
+make_lit_list([]) ->
+ [].
+
+%% The following tests are the same as done by 'io_lib:char_list' and
+%% 'io_lib:printable_list', respectively, but for a single character.
+
+is_char_value(V) when V >= $\000, V =< $\377 -> true;
+is_char_value(_) -> false.
+
+is_print_char_value(V) when V >= $\040, V =< $\176 -> true;
+is_print_char_value(V) when V >= $\240, V =< $\377 -> true;
+is_print_char_value(V) when V =:= $\b -> true;
+is_print_char_value(V) when V =:= $\d -> true;
+is_print_char_value(V) when V =:= $\e -> true;
+is_print_char_value(V) when V =:= $\f -> true;
+is_print_char_value(V) when V =:= $\n -> true;
+is_print_char_value(V) when V =:= $\r -> true;
+is_print_char_value(V) when V =:= $\s -> true;
+is_print_char_value(V) when V =:= $\t -> true;
+is_print_char_value(V) when V =:= $\v -> true;
+is_print_char_value(V) when V =:= $\" -> true;
+is_print_char_value(V) when V =:= $\' -> true;
+is_print_char_value(V) when V =:= $\\ -> true;
+is_print_char_value(_) -> false.
+
+is_char_list([V | Vs]) when integer(V) ->
+ case is_char_value(V) of
+ true ->
+ is_char_list(Vs);
+ false ->
+ false
+ end;
+is_char_list([]) ->
+ true;
+is_char_list(_) ->
+ false.
+
+is_print_char_list([V | Vs]) when integer(V) ->
+ case is_print_char_value(V) of
+ true ->
+ is_print_char_list(Vs);
+ false ->
+ false
+ end;
+is_print_char_list([]) ->
+ true;
+is_print_char_list(_) ->
+ false.
+
+unfold_tuples([{X, Y} | Ps]) ->
+ [X, Y | unfold_tuples(Ps)];
+unfold_tuples([]) ->
+ [].
+
+fold_tuples([X, Y | Es]) ->
+ [{X, Y} | fold_tuples(Es)];
+fold_tuples([]) ->
+ [].
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/cerl_clauses.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/cerl_clauses.erl
new file mode 100644
index 0000000000..16e4b37a10
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/cerl_clauses.erl
@@ -0,0 +1,409 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Richard Carlsson.
+%% Copyright (C) 1999-2002 Richard Carlsson.
+%% Portions created by Ericsson are Copyright 2001, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: cerl_clauses.erl,v 1.2 2009/09/17 09:46:19 kostis Exp $
+
+%% @doc Utility functions for Core Erlang case/receive clauses.
+%%
+%% <p>Syntax trees are defined in the module <a
+%% href=""><code>cerl</code></a>.</p>
+%%
+%% @type cerl() = cerl:cerl()
+
+-module(cerl_clauses).
+
+-export([any_catchall/1, eval_guard/1, is_catchall/1, match/2,
+ match_list/2, reduce/1, reduce/2]).
+
+-import(cerl, [alias_pat/1, alias_var/1, data_arity/1, data_es/1,
+ data_type/1, clause_guard/1, clause_pats/1, concrete/1,
+ is_data/1, is_c_var/1, let_body/1, letrec_body/1,
+ seq_body/1, try_arg/1, type/1, values_es/1]).
+
+-import(lists, [reverse/1]).
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec is_catchall(Clause::cerl()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if an abstract clause is a
+%% catch-all, otherwise <code>false</code>. A clause is a catch-all if
+%% all its patterns are variables, and its guard expression always
+%% evaluates to <code>true</code>; cf. <code>eval_guard/1</code>.
+%%
+%% <p>Note: <code>Clause</code> must have type
+%% <code>clause</code>.</p>
+%%
+%% @see eval_guard/1
+%% @see any_catchall/1
+
+is_catchall(C) ->
+ case all_vars(clause_pats(C)) of
+ true ->
+ case eval_guard(clause_guard(C)) of
+ {value, true} ->
+ true;
+ _ ->
+ false
+ end;
+ false ->
+ false
+ end.
+
+all_vars([C | Cs]) ->
+ case is_c_var(C) of
+ true ->
+ all_vars(Cs);
+ false ->
+ false
+ end;
+all_vars([]) ->
+ true.
+
+
+%% @spec any_catchall(Clauses::[cerl()]) -> boolean()
+%%
+%% @doc Returns <code>true</code> if any of the abstract clauses in
+%% the list is a catch-all, otherwise <code>false</code>. See
+%% <code>is_catchall/1</code> for details.
+%%
+%% <p>Note: each node in <code>Clauses</code> must have type
+%% <code>clause</code>.</p>
+%%
+%% @see is_catchall/1
+
+any_catchall([C | Cs]) ->
+ case is_catchall(C) of
+ true ->
+ true;
+ false ->
+ any_catchall(Cs)
+ end;
+any_catchall([]) ->
+ false.
+
+
+%% @spec eval_guard(Expr::cerl()) -> none | {value, term()}
+%%
+%% @doc Tries to reduce a guard expression to a single constant value,
+%% if possible. The returned value is <code>{value, Term}</code> if the
+%% guard expression <code>Expr</code> always yields the constant value
+%% <code>Term</code>, and is otherwise <code>none</code>.
+%%
+%% <p>Note that although guard expressions should only yield boolean
+%% values, this function does not guarantee that <code>Term</code> is
+%% either <code>true</code> or <code>false</code>. Also note that only
+%% simple constructs like let-expressions are examined recursively;
+%% general constant folding is not performed.</p>
+%%
+%% @see is_catchall/1
+
+%% This function could possibly be improved further, but constant
+%% folding should in general be performed elsewhere.
+
+eval_guard(E) ->
+ case type(E) of
+ literal ->
+ {value, concrete(E)};
+ values ->
+ case values_es(E) of
+ [E1] ->
+ eval_guard(E1);
+ _ ->
+ none
+ end;
+ 'try' ->
+ eval_guard(try_arg(E));
+ seq ->
+ eval_guard(seq_body(E));
+ 'let' ->
+ eval_guard(let_body(E));
+ 'letrec' ->
+ eval_guard(letrec_body(E));
+ _ ->
+ none
+ end.
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec reduce(Clauses) -> {true, {Clauses, Bindings}}
+%% | {false, Clauses}
+%%
+%% @equiv reduce(Cs, [])
+
+reduce(Cs) ->
+ reduce(Cs, []).
+
+%% @spec reduce(Clauses::[Clause], Exprs::[Expr]) ->
+%% {true, {Clause, Bindings}}
+%% | {false, [Clause]}
+%%
+%% Clause = cerl()
+%% Expr = any | cerl()
+%% Bindings = [{cerl(), cerl()}]
+%%
+%% @doc Selects a single clause, if possible, or otherwise reduces the
+%% list of selectable clauses. The input is a list <code>Clauses</code>
+%% of abstract clauses (i.e., syntax trees of type <code>clause</code>),
+%% and a list of switch expressions <code>Exprs</code>. The function
+%% tries to uniquely select a single clause or discard unselectable
+%% clauses, with respect to the switch expressions. All abstract clauses
+%% in the list must have the same number of patterns. If
+%% <code>Exprs</code> is not the empty list, it must have the same
+%% length as the number of patterns in each clause; see
+%% <code>match_list/2</code> for details.
+%%
+%% <p>A clause can only be selected if its guard expression always
+%% yields the atom <code>true</code>, and a clause whose guard
+%% expression always yields the atom <code>false</code> can never be
+%% selected. Other guard expressions are considered to have unknown
+%% value; cf. <code>eval_guard/1</code>.</p>
+%%
+%% <p>If a particular clause can be selected, the function returns
+%% <code>{true, {Clause, Bindings}}</code>, where <code>Clause</code> is
+%% the selected clause and <code>Bindings</code> is a list of pairs
+%% <code>{Var, SubExpr}</code> associating the variables occurring in
+%% the patterns of <code>Clause</code> with the corresponding
+%% subexpressions in <code>Exprs</code>. The list of bindings is given
+%% in innermost-first order; see the <code>match/2</code> function for
+%% details.</p>
+%%
+%% <p>If no clause could be definitely selected, the function returns
+%% <code>{false, NewClauses}</code>, where <code>NewClauses</code> is
+%% the list of entries in <code>Clauses</code> that remain after
+%% eliminating unselectable clauses, preserving the relative order.</p>
+%%
+%% @see eval_guard/1
+%% @see match/2
+%% @see match_list/2
+
+reduce(Cs, Es) ->
+ reduce(Cs, Es, []).
+
+reduce([C | Cs], Es, Cs1) ->
+ Ps = clause_pats(C),
+ case match_list(Ps, Es) of
+ none ->
+ %% Here, we know that the current clause cannot possibly be
+ %% selected, so we drop it and visit the rest.
+ reduce(Cs, Es, Cs1);
+ {false, _} ->
+ %% We are not sure if this clause might be selected, so we
+ %% save it and visit the rest.
+ reduce(Cs, Es, [C | Cs1]);
+ {true, Bs} ->
+ case eval_guard(clause_guard(C)) of
+ {value, true} when Cs1 == [] ->
+ %% We have a definite match - we return the residual
+ %% expression and signal that a selection has been
+ %% made. All other clauses are dropped.
+ {true, {C, Bs}};
+ {value, true} ->
+ %% Unless one of the previous clauses is selected,
+ %% this clause will definitely be, so we can drop
+ %% the rest.
+ {false, reverse([C | Cs1])};
+ {value, false} ->
+ %% This clause can never be selected, since its
+ %% guard is never 'true', so we drop it.
+ reduce(Cs, Es, Cs1);
+ _ ->
+ %% We are not sure if this clause might be selected
+ %% (or might even cause a crash), so we save it and
+ %% visit the rest.
+ reduce(Cs, Es, [C | Cs1])
+ end
+ end;
+reduce([], _, Cs) ->
+ %% All clauses visited, without a complete match. Signal "not
+ %% reduced" and return the saved clauses, in the correct order.
+ {false, reverse(Cs)}.
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec match(Pattern::cerl(), Expr) ->
+%% none | {true, Bindings} | {false, Bindings}
+%%
+%% Expr = any | cerl()
+%% Bindings = [{cerl(), Expr}]
+%%
+%% @doc Matches a pattern against an expression. The returned value is
+%% <code>none</code> if a match is impossible, <code>{true,
+%% Bindings}</code> if <code>Pattern</code> definitely matches
+%% <code>Expr</code>, and <code>{false, Bindings}</code> if a match is
+%% not definite, but cannot be excluded. <code>Bindings</code> is then
+%% a list of pairs <code>{Var, SubExpr}</code>, associating each
+%% variable in the pattern with either the corresponding subexpression
+%% of <code>Expr</code>, or with the atom <code>any</code> if no
+%% matching subexpression exists. (Recall that variables may not be
+%% repeated in a Core Erlang pattern.) The list of bindings is given
+%% in innermost-first order; this should only be of interest if
+%% <code>Pattern</code> contains one or more alias patterns. If the
+%% returned value is <code>{true, []}</code>, it implies that the
+%% pattern and the expression are syntactically identical.
+%%
+%% <p>Instead of a syntax tree, the atom <code>any</code> can be
+%% passed for <code>Expr</code> (or, more generally, be used for any
+%% subtree of <code>Expr</code>, in as much the abstract syntax tree
+%% implementation allows it); this means that it cannot be decided
+%% whether the pattern will match or not, and the corresponding
+%% variable bindings will all map to <code>any</code>. The typical use
+%% is for producing bindings for <code>receive</code> clauses.</p>
+%%
+%% <p>Note: Binary-syntax patterns are never structurally matched
+%% against binary-syntax expressions by this function.</p>
+%%
+%% <p>Examples:
+%% <ul>
+%% <li>Matching a pattern "<code>{X, Y}</code>" against the
+%% expression "<code>{foo, f(Z)}</code>" yields <code>{true,
+%% Bindings}</code> where <code>Bindings</code> associates
+%% "<code>X</code>" with the subtree "<code>foo</code>" and
+%% "<code>Y</code>" with the subtree "<code>f(Z)</code>".</li>
+%%
+%% <li>Matching pattern "<code>{X, {bar, Y}}</code>" against
+%% expression "<code>{foo, f(Z)}</code>" yields <code>{false,
+%% Bindings}</code> where <code>Bindings</code> associates
+%% "<code>X</code>" with the subtree "<code>foo</code>" and
+%% "<code>Y</code>" with <code>any</code> (because it is not known
+%% if "<code>{foo, Y}</code>" might match the run-time value of
+%% "<code>f(Z)</code>" or not).</li>
+%%
+%% <li>Matching pattern "<code>{foo, bar}</code>" against expression
+%% "<code>{foo, f()}</code>" yields <code>{false, []}</code>,
+%% telling us that there might be a match, but we cannot deduce any
+%% bindings.</li>
+%%
+%% <li>Matching <code>{foo, X = {bar, Y}}</code> against expression
+%% "<code>{foo, {bar, baz}}</code>" yields <code>{true,
+%% Bindings}</code> where <code>Bindings</code> associates
+%% "<code>Y</code>" with "<code>baz</code>", and "<code>X</code>"
+%% with "<code>{bar, baz}</code>".</li>
+%%
+%% <li>Matching a pattern "<code>{X, Y}</code>" against
+%% <code>any</code> yields <code>{false, Bindings}</code> where
+%% <code>Bindings</code> associates both "<code>X</code>" and
+%% "<code>Y</code>" with <code>any</code>.</li>
+%% </ul></p>
+
+match(P, E) ->
+ match(P, E, []).
+
+match(P, E, Bs) ->
+ case type(P) of
+ var ->
+ %% Variables always match, since they cannot have repeated
+ %% occurrences in a pattern.
+ {true, [{P, E} | Bs]};
+ alias ->
+ %% All variables in P1 will be listed before the alias
+ %% variable in the result.
+ match(alias_pat(P), E, [{alias_var(P), E} | Bs]);
+ binary ->
+ %% The most we can do is to say "definitely no match" if a
+ %% binary pattern is matched against non-binary data.
+ if E == any ->
+ {false, Bs};
+ true ->
+ case is_data(E) of
+ true ->
+ none;
+ false ->
+ {false, Bs}
+ end
+ end;
+ _ ->
+ match_1(P, E, Bs)
+ end.
+
+match_1(P, E, Bs) ->
+ case is_data(P) of
+ true when E == any ->
+ %% If we don't know the structure of the value of E at this
+ %% point, we just match the subpatterns against 'any', and
+ %% make sure the result is a "maybe".
+ Ps = data_es(P),
+ Es = lists:duplicate(length(Ps), any),
+ case match_list(Ps, Es, Bs) of
+ {_, Bs1} ->
+ {false, Bs1};
+ none ->
+ none
+ end;
+ true ->
+ %% Test if the expression represents a constructor
+ case is_data(E) of
+ true ->
+ T1 = {data_type(E), data_arity(E)},
+ T2 = {data_type(P), data_arity(P)},
+ %% Note that we must test for exact equality.
+ if T1 =:= T2 ->
+ match_list(data_es(P), data_es(E), Bs);
+ true ->
+ none
+ end;
+ false ->
+ %% We don't know the run-time structure of E, and P
+ %% is not a variable or an alias pattern, so we
+ %% match against 'any' instead.
+ match_1(P, any, Bs)
+ end;
+ false ->
+ %% Strange pattern - give up, but don't say "no match".
+ {false, Bs}
+ end.
+
+
+%% @spec match_list(Patterns::[cerl()], Exprs::[Expr]) ->
+%% none | {true, Bindings} | {false, Bindings}
+%%
+%% Expr = any | cerl()
+%% Bindings = [{cerl(), cerl()}]
+%%
+%% @doc Like <code>match/2</code>, but matching a sequence of patterns
+%% against a sequence of expressions. Passing an empty list for
+%% <code>Exprs</code> is equivalent to passing a list of
+%% <code>any</code> atoms of the same length as <code>Patterns</code>.
+%%
+%% @see match/2
+
+match_list([], []) ->
+ {true, []}; % no patterns always match
+match_list(Ps, []) ->
+ match_list(Ps, lists:duplicate(length(Ps), any), []);
+match_list(Ps, Es) ->
+ match_list(Ps, Es, []).
+
+match_list([P | Ps], [E | Es], Bs) ->
+ case match(P, E, Bs) of
+ {true, Bs1} ->
+ match_list(Ps, Es, Bs1);
+ {false, Bs1} ->
+ %% Make sure "maybe" is preserved
+ case match_list(Ps, Es, Bs1) of
+ {_, Bs2} ->
+ {false, Bs2};
+ none ->
+ none
+ end;
+ none ->
+ none
+ end;
+match_list([], [], Bs) ->
+ {true, Bs}.
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/cerl_inline.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/cerl_inline.erl
new file mode 100644
index 0000000000..cd332279d1
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/cerl_inline.erl
@@ -0,0 +1,2762 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Richard Carlsson.
+%% Copyright (C) 1999-2002 Richard Carlsson.
+%% Portions created by Ericsson are Copyright 2001, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: cerl_inline.erl,v 1.1 2008/12/17 09:53:41 mikpe Exp $
+%%
+%% Core Erlang inliner.
+
+%% =====================================================================
+%%
+%% This is an implementation of the algorithm by Waddell and Dybvig
+%% ("Fast and Effective Procedure Inlining", International Static
+%% Analysis Symposium 1997), adapted to the Core Erlang language.
+%%
+%% Instead of always renaming variables and function variables, this
+%% implementation uses the "no-shadowing strategy" of Peyton Jones and
+%% Marlow ("Secrets of the Glasgow Haskell Compiler Inliner", 1999).
+%%
+%% =====================================================================
+
+%% TODO: inline single-source-reference operands without size limit.
+
+-module(cerl_inline).
+
+-export([core_transform/2, transform/1, transform/2]).
+
+-import(cerl, [abstract/1, alias_pat/1, alias_var/1, apply_args/1,
+ apply_op/1, atom_name/1, atom_val/1, bitstr_val/1,
+ bitstr_size/1, bitstr_unit/1, bitstr_type/1,
+ bitstr_flags/1, binary_segments/1, update_c_alias/3,
+ update_c_apply/3, update_c_binary/2, update_c_bitstr/6,
+ update_c_call/4, update_c_case/3, update_c_catch/2,
+ update_c_clause/4, c_fun/2, c_int/1, c_let/3,
+ update_c_let/4, update_c_letrec/3, update_c_module/5,
+ update_c_primop/3, update_c_receive/4, update_c_seq/3,
+ c_seq/2, update_c_try/6, c_tuple/1, update_c_values/2,
+ c_values/1, c_var/1, call_args/1, call_module/1,
+ call_name/1, case_arity/1, case_arg/1, case_clauses/1,
+ catch_body/1, clause_body/1, clause_guard/1,
+ clause_pats/1, clause_vars/1, concrete/1, cons_hd/1,
+ cons_tl/1, data_arity/1, data_es/1, data_type/1,
+ fun_body/1, fun_vars/1, get_ann/1, int_val/1,
+ is_c_atom/1, is_c_cons/1, is_c_fun/1, is_c_int/1,
+ is_c_list/1, is_c_seq/1, is_c_tuple/1, is_c_var/1,
+ is_data/1, is_literal/1, is_literal_term/1, let_arg/1,
+ let_body/1, let_vars/1, letrec_body/1, letrec_defs/1,
+ list_length/1, list_elements/1, update_data/3,
+ make_list/1, make_data_skel/2, module_attrs/1,
+ module_defs/1, module_exports/1, module_name/1,
+ primop_args/1, primop_name/1, receive_action/1,
+ receive_clauses/1, receive_timeout/1, seq_arg/1,
+ seq_body/1, set_ann/2, try_arg/1, try_body/1, try_vars/1,
+ try_evars/1, try_handler/1, tuple_es/1, tuple_arity/1,
+ type/1, values_es/1, var_name/1]).
+
+-import(lists, [foldl/3, foldr/3, mapfoldl/3, reverse/1]).
+
+%%
+%% Constants
+%%
+
+debug_runtime() -> false.
+debug_counters() -> false.
+
+%% Normal execution times for inlining are between 0.1 and 0.3 seconds
+%% (on the author's current equipment). The default effort limit of 150
+%% is high enough that most normal programs never hit the limit even
+%% once, and for difficult programs, it generally keeps the execution
+%% times below 2-5 seconds. Using an effort counter of 1000 will thus
+%% have no further effect on most programs, but some programs may take
+%% as much as 10 seconds or more. Effort counts larger than 2500 have
+%% never been observed even on very ill-conditioned programs.
+%%
+%% Size limits between 6 and 18 tend to actually shrink the code,
+%% because of the simplifications made possible by inlining. A limit of
+%% 16 seems to be optimal for this purpose, often shrinking the
+%% executable code by up to 10%. Size limits between 18 and 30 generally
+%% give the same code size as if no inlining was done (i.e., code
+%% duplication balances out the simplifications at these levels). A size
+%% limit between 1 and 5 tends to inline small functions and propagate
+%% constants, but does not cause much simplifications do be done, so the
+%% net effect will be a slight increase in code size. For size limits
+%% above 30, the executable code size tends to increase with about 10%
+%% per 100 units, with some variations depending on the sizes of
+%% functions in the source code.
+%%
+%% Typically, about 90% of the maximum speedup achievable is already
+%% reached using a size limit of 30, and 98% is reached at limits around
+%% 100-150; there is rarely any point in letting the code size increase
+%% by more than 10-15%. If too large functions are inlined, cache
+%% effects will slow the program down.
+
+default_effort() -> 150.
+default_size() -> 24.
+
+%% Base costs/weights for different kinds of expressions. If these are
+%% modified, the size limits above may have to be adjusted.
+
+weight(var) -> 0; % We count no cost for variable accesses.
+weight(values) -> 0; % Value aggregates have no cost in themselves.
+weight(literal) -> 1; % We assume efficient handling of constants.
+weight(data) -> 1; % Base cost; add 1 per element.
+weight(element) -> 1; % Cost of storing/fetching an element.
+weight(argument) -> 1; % Cost of passing a function argument.
+weight('fun') -> 6; % Base cost + average number of free vars.
+weight('let') -> 0; % Count no cost for let-bindings.
+weight(letrec) -> 0; % Like a let-binding.
+weight('case') -> 0; % Case switches have no base cost.
+weight(clause) -> 1; % Count one jump at the end of each clause body.
+weight('receive') -> 9; % Initialization/cleanup cost.
+weight('try') -> 1; % Assume efficient implementation.
+weight('catch') -> 1; % See `try'.
+weight(apply) -> 3; % Average base cost: call/return.
+weight(call) -> 3; % Assume remote-calls as efficient as `apply'.
+weight(primop) -> 2; % Assume more efficient than `apply'.
+weight(binary) -> 4; % Initialisation base cost.
+weight(bitstr) -> 3; % Coding/decoding a value; like a primop.
+weight(module) -> 1. % Like a letrec with a constant body
+
+%% These "reference" structures are used for variables and function
+%% variables. They keep track of the variable name, any bound operand,
+%% and the associated store location.
+
+-record(ref, {name, opnd, loc}).
+
+%% Operand structures contain the operand expression, the renaming and
+%% environment, the state location, and the effort counter at the call
+%% site (cf. `visit').
+
+-record(opnd, {expr, ren, env, loc, effort}).
+
+%% Since expressions are only visited in `effect' context when they are
+%% not bound to a referenced variable, only expressions visited in
+%% 'value' context are cached.
+
+-record(cache, {expr, size}).
+
+%% The context flags for an application structure are kept separate from
+%% the structure itself. Note that the original algorithm had exactly
+%% one operand in each application context structure, while we can have
+%% several, or none.
+
+-record(app, {opnds, ctxt, loc}).
+
+
+%%
+%% Interface functions
+%%
+
+%% Use compile option `{core_transform, inline}' to insert this as a
+%% compilation pass.
+
+core_transform(Code, Opts) ->
+ cerl:to_records(transform(cerl:from_records(Code), Opts)).
+
+transform(Tree) ->
+ transform(Tree, []).
+
+transform(Tree, Opts) ->
+ main(Tree, value, Opts).
+
+main(Tree, Ctxt, Opts) ->
+ %% We spawn a new process to do the work, so we don't have to worry
+ %% about cluttering the process dictionary with debugging info, or
+ %% proper deallocation of ets-tables.
+ Opts1 = Opts ++ [{inline_size, default_size()},
+ {inline_effort, default_effort()}],
+ Reply = self(),
+ Pid = spawn_link(fun () -> start(Reply, Tree, Ctxt, Opts1) end),
+ receive
+ {Pid1, Tree1} when Pid1 == Pid ->
+ Tree1
+ end.
+
+start(Reply, Tree, Ctxt, Opts) ->
+ init_debug(),
+ case debug_runtime() of
+ true ->
+ put(inline_start_time,
+ element(1, erlang:statistics(runtime)));
+ _ ->
+ ok
+ end,
+ Size = max(1, proplists:get_value(inline_size, Opts)),
+ Effort = max(1, proplists:get_value(inline_effort, Opts)),
+ case proplists:get_bool(verbose, Opts) of
+ true ->
+ io:fwrite("Inlining: inline_size=~w inline_effort=~w\n",
+ [Size, Effort]);
+ false ->
+ ok
+ end,
+
+ %% Note that the counters of the new state are passive.
+ S = st__new(Effort, Size),
+
+%%% Initialization is not needed at present. Note that the code in
+%%% `inline_init' is not up-to-date with this module.
+%%% {Tree1, S1} = inline_init:init(Tree, S),
+%%% {Tree2, _S2} = i(Tree1, Ctxt, S1),
+ {Tree2, _S2} = i(Tree, Ctxt, S),
+ report_debug(),
+ Reply ! {self(), Tree2}.
+
+init_debug() ->
+ case debug_counters() of
+ true ->
+ put(counter_effort_triggers, 0),
+ put(counter_effort_max, 0),
+ put(counter_size_triggers, 0),
+ put(counter_size_max, 0);
+ _ ->
+ ok
+ end.
+
+report_debug() ->
+ case debug_runtime() of
+ true ->
+ {Time, _} = erlang:statistics(runtime),
+ report("Total run time for inlining: ~.2.0f s.\n",
+ [(Time - get(inline_start_time))/1000]);
+ _ ->
+ ok
+ end,
+ case debug_counters() of
+ true ->
+ counter_stats();
+ _ ->
+ ok
+ end.
+
+counter_stats() ->
+ T1 = get(counter_effort_triggers),
+ T2 = get(counter_size_triggers),
+ E = get(counter_effort_max),
+ S = get(counter_size_max),
+ M1 = io_lib:fwrite("\tNumber of triggered "
+ "effort counters: ~p.\n", [T1]),
+ M2 = io_lib:fwrite("\tNumber of triggered "
+ "size counters: ~p.\n", [T2]),
+ M3 = io_lib:fwrite("\tLargest active effort counter: ~p.\n",
+ [E]),
+ M4 = io_lib:fwrite("\tLargest active size counter: ~p.\n",
+ [S]),
+ report("Counter statistics:\n~s", [[M1, M2, M3, M4]]).
+
+
+%% =====================================================================
+%% The main inlining function
+%%
+%% i(E :: coreErlang(),
+%% Ctxt :: value | effect | #app{}
+%% Ren :: renaming(),
+%% Env :: environment(),
+%% S :: state())
+%% -> {E', S'}
+%%
+%% Note: It is expected that the input source code ('E') does not
+%% contain free variables. If it does, there is a risk of accidental
+%% name capture, in case a generated "new" variable name happens to be
+%% the same as the name of a variable that is free further below in the
+%% tree; the algorithm only consults the current environment to check if
+%% a name already exists.
+%%
+%% The renaming maps names of source-code variable and function
+%% variables to new names as necessary to avoid clashes, according to
+%% the "no-shadowing" strategy. The environment maps *residual-code*
+%% variables and function variables to operands and global information.
+%% Separating the renaming from the environment, and using the
+%% residual-code variables instead of the source-code variables as its
+%% domain, improves the behaviour of the algorithm when code needs to be
+%% traversed more than once.
+%%
+%% Note that there is no such thing as a `test' context for expressions
+%% in (Core) Erlang (see `i_case' below for details).
+
+i(E, Ctxt, S) ->
+ i(E, Ctxt, ren__identity(), env__empty(), S).
+
+i(E, Ctxt, Ren, Env, S0) ->
+ %% Count one unit of effort on each pass.
+ S = count_effort(1, S0),
+ case is_data(E) of
+ true ->
+ i_data(E, Ctxt, Ren, Env, S);
+ false ->
+ case type(E) of
+ var ->
+ i_var(E, Ctxt, Ren, Env, S);
+ values ->
+ i_values(E, Ctxt, Ren, Env, S);
+ 'fun' ->
+ i_fun(E, Ctxt, Ren, Env, S);
+ seq ->
+ i_seq(E, Ctxt, Ren, Env, S);
+ 'let' ->
+ i_let(E, Ctxt, Ren, Env, S);
+ letrec ->
+ i_letrec(E, Ctxt, Ren, Env, S);
+ 'case' ->
+ i_case(E, Ctxt, Ren, Env, S);
+ 'receive' ->
+ i_receive(E, Ctxt, Ren, Env, S);
+ apply ->
+ i_apply(E, Ctxt, Ren, Env, S);
+ call ->
+ i_call(E, Ctxt, Ren, Env, S);
+ primop ->
+ i_primop(E, Ren, Env, S);
+ 'try' ->
+ i_try(E, Ctxt, Ren, Env, S);
+ 'catch' ->
+ i_catch(E, Ctxt, Ren, Env, S);
+ binary ->
+ i_binary(E, Ren, Env, S);
+ module ->
+ i_module(E, Ctxt, Ren, Env, S)
+ end
+ end.
+
+i_data(E, Ctxt, Ren, Env, S) ->
+ case is_literal(E) of
+ true ->
+ %% This is the `(const c)' case of the original algorithm:
+ %% literal terms which (regardless of size) do not need to
+ %% be constructed dynamically at runtime - boldly assuming
+ %% that the compiler/runtime system can handle this.
+ case Ctxt of
+ effect ->
+ %% Reduce useless constants to a simple value.
+ {void(), count_size(weight(literal), S)};
+ _ ->
+ %% (In Erlang, we cannot set all non-`false'
+ %% constants to `true' in a `test' context, like we
+ %% could do in Lisp or C, so the above is the only
+ %% special case to be handled here.)
+ {E, count_size(weight(literal), S)}
+ end;
+ false ->
+ %% Data constructors are like to calls to safe built-in
+ %% functions, for which we can "decide to inline"
+ %% immediately; there is no need to create operand
+ %% structures. In `effect' context, we can simply make a
+ %% sequence of the argument expressions, also visited in
+ %% `effect' context. In all other cases, the arguments are
+ %% visited for value.
+ case Ctxt of
+ effect ->
+ %% Note that this will count the sizes of the
+ %% subexpressions, even though some or all of them
+ %% might be discarded by the sequencing afterwards.
+ {Es1, S1} = mapfoldl(fun (E, S) ->
+ i(E, effect, Ren, Env,
+ S)
+ end,
+ S, data_es(E)),
+ E1 = foldl(fun (E1, E2) -> make_seq(E1, E2) end,
+ void(), Es1),
+ {E1, S1};
+ _ ->
+ {Es1, S1} = mapfoldl(fun (E, S) ->
+ i(E, value, Ren, Env,
+ S)
+ end,
+ S, data_es(E)),
+ %% The total size/cost is the base cost for a data
+ %% constructor plus the cost for storing each
+ %% element.
+ N = weight(data) + length(Es1) * weight(element),
+ S2 = count_size(N, S1),
+ {update_data(E, data_type(E), Es1), S2}
+ end
+ end.
+
+%% This is the `(ref x)' (variable use) case of the original algorithm.
+%% Note that binding occurrences are always handled in the respective
+%% cases of the binding constructs.
+
+i_var(E, Ctxt, Ren, Env, S) ->
+ case Ctxt of
+ effect ->
+ %% Reduce useless variable references to a simple constant.
+ %% This also avoids useless visiting of bound operands.
+ {void(), count_size(weight(literal), S)};
+ _ ->
+ Name = var_name(E),
+ case env__lookup(ren__map(Name, Ren), Env) of
+ {ok, R} ->
+ case R#ref.opnd of
+ undefined ->
+ %% The variable is not associated with an
+ %% argument expression; just residualize it.
+ residualize_var(R, S);
+ Opnd ->
+ i_var_1(R, Opnd, Ctxt, Env, S)
+ end;
+ error ->
+ %% The variable is unbound. (It has not been
+ %% accidentally captured, however, or it would have
+ %% been in the environment.) We leave it as it is,
+ %% without any warning.
+ {E, count_size(weight(var), S)}
+ end
+ end.
+
+%% This first visits the bound operand and then does copy propagation.
+%% Note that we must first set the "inner-pending" flag, and clear the
+%% flag afterwards.
+
+i_var_1(R, Opnd, Ctxt, Env, S) ->
+ %% If the operand is already "inner-pending", it is residualised.
+ %% (In Lisp/C, if the variable might be assigned to, it should also
+ %% be residualised.)
+ L = Opnd#opnd.loc,
+ case st__test_inner_pending(L, S) of
+ true ->
+ residualize_var(R, S);
+ false ->
+ S1 = st__mark_inner_pending(L, S),
+ case catch {ok, visit(Opnd, S1)} of
+ {ok, {E, S2}} ->
+ %% Note that we pass the current environment and
+ %% context to `copy', but not the current renaming.
+ S3 = st__clear_inner_pending(L, S2),
+ copy(R, Opnd, E, Ctxt, Env, S3);
+ {'EXIT', X} ->
+ exit(X);
+ X ->
+ %% If we use destructive update for the
+ %% `inner-pending' flag, we must make sure to clear
+ %% it also if we make a nonlocal return.
+ st__clear_inner_pending(Opnd#opnd.loc, S1),
+ throw(X)
+ end
+ end.
+
+%% A multiple-value aggregate `<e1, ..., en>'. This is very much like a
+%% tuple data constructor `{e1, ..., en}'; cf. `i_data' for details.
+
+i_values(E, Ctxt, Ren, Env, S) ->
+ case values_es(E) of
+ [E1] ->
+ %% Single-value aggregates can be dropped; they are simply
+ %% notation.
+ i(E1, Ctxt, Ren, Env, S);
+ Es ->
+ %% In `effect' context, we can simply make a sequence of the
+ %% argument expressions, also visited in `effect' context.
+ %% In all other cases, the arguments are visited for value.
+ case Ctxt of
+ effect ->
+ {Es1, S1} =
+ mapfoldl(fun (E, S) ->
+ i(E, effect, Ren, Env, S)
+ end,
+ S, Es),
+ E1 = foldl(fun (E1, E2) ->
+ make_seq(E1, E2)
+ end,
+ void(), Es1),
+ {E1, S1}; % drop annotations on E
+ _ ->
+ {Es1, S1} = mapfoldl(fun (E, S) ->
+ i(E, value, Ren, Env,
+ S)
+ end,
+ S, Es),
+ %% Aggregating values does not write them to memory,
+ %% so we count no extra cost per element.
+ S2 = count_size(weight(values), S1),
+ {update_c_values(E, Es1), S2}
+ end
+ end.
+
+%% A let-expression `let <v1,...,vn> = e0 in e1' is semantically
+%% equivalent to a case-expression `case e0 of <v1,...,vn> when 'true'
+%% -> e1 end'. As a special case, `let <v> = e0 in e1' is also
+%% equivalent to `apply fun (v) -> e0 (e1)'. However, for efficiency,
+%% and in order to allow the handling of `case' clauses to introduce new
+%% let-expressions without entering an infinite rewrite loop, we handle
+%% these directly.
+
+%%% %% Rewriting a `let' to an equivalent expression.
+%%% i_let(E, Ctxt, Ren, Env, S) ->
+%%% case let_vars(E) of
+%%% [V] ->
+%%% E1 = update_c_apply(E, c_fun([V], let_body(E)), [let_arg(E)]),
+%%% i(E1, Ctxt, Ren, Env, S);
+%%% Vs ->
+%%% C = c_clause(Vs, abstract(true), let_body(E)),
+%%% E1 = update_c_case(E, let_arg(E), [C]),
+%%% i(E1, Ctxt, Ren, Env, S)
+%%% end.
+
+i_let(E, Ctxt, Ren, Env, S) ->
+ case let_vars(E) of
+ [V] ->
+ i_let_1(V, E, Ctxt, Ren, Env, S);
+ Vs ->
+ %% Visit the argument expression in `value' context, to
+ %% simplify it as far as possible.
+ {A, S1} = i(let_arg(E), value, Ren, Env, S),
+ case get_components(length(Vs), result(A)) of
+ {true, As} ->
+ %% Note that only the components of the result of
+ %% `A' are passed on; any effects are hoisted.
+ {E1, S2} = i_let_2(Vs, As, E, Ctxt, Ren, Env, S1),
+ {hoist_effects(A, E1), S2};
+ false ->
+ %% We cannot do anything with this `let', since the
+ %% variables cannot be matched against the argument
+ %% components. Just visit the variables for renaming
+ %% and visit the body for value (cf. `i_fun').
+ {_, Ren1, Env1, S2} = bind_locals(Vs, Ren, Env, S1),
+ Vs1 = i_params(Vs, Ren1, Env1),
+ %% The body is always visited for value here.
+ {B, S3} = i(let_body(E), value, Ren1, Env1, S2),
+ S4 = count_size(weight('let'), S3),
+ {update_c_let(E, Vs1, A, B), S4}
+ end
+ end.
+
+%% Single-variable `let' binding.
+
+i_let_1(V, E, Ctxt, Ren, Env, S) ->
+ %% Make an operand structure for the argument expression, create a
+ %% local binding from the parameter to the operand structure, and
+ %% visit the body. Finally create necessary bindings and/or set
+ %% flags.
+ {Opnd, S1} = make_opnd(let_arg(E), Ren, Env, S),
+ {[R], Ren1, Env1, S2} = bind_locals([V], [Opnd], Ren, Env, S1),
+ {E1, S3} = i(let_body(E), Ctxt, Ren1, Env1, S2),
+ i_let_3([R], [Opnd], E1, S3).
+
+%% Multi-variable `let' binding.
+
+i_let_2(Vs, As, E, Ctxt, Ren, Env, S) ->
+ %% Make operand structures for the argument components. Note that
+ %% since the argument has already been visited at this point, we use
+ %% the identity renaming for the operands.
+ {Opnds, S1} = mapfoldl(fun (E, S) ->
+ make_opnd(E, ren__identity(), Env, S)
+ end,
+ S, As),
+ %% Create local bindings from the parameters to their respective
+ %% operand structures, and visit the body.
+ {Rs, Ren1, Env1, S2} = bind_locals(Vs, Opnds, Ren, Env, S1),
+ {E1, S3} = i(let_body(E), Ctxt, Ren1, Env1, S2),
+ i_let_3(Rs, Opnds, E1, S3).
+
+i_let_3(Rs, Opnds, E, S) ->
+ %% Create necessary bindings and/or set flags.
+ {E1, S1} = make_let_bindings(Rs, E, S),
+
+ %% We must also create evaluation for effect, for any unused
+ %% operands, as after an application expression.
+ residualize_operands(Opnds, E1, S1).
+
+%% A sequence `do e1 e2', written `(seq e1 e2)' in the original
+%% algorithm, where `e1' is evaluated for effect only (since its value
+%% is not used), and `e2' yields the final value. Note that we use
+%% `make_seq' to recompose the sequence after visiting the parts.
+
+i_seq(E, Ctxt, Ren, Env, S) ->
+ {E1, S1} = i(seq_arg(E), effect, Ren, Env, S),
+ {E2, S2} = i(seq_body(E), Ctxt, Ren, Env, S1),
+ %% A sequence has no cost in itself.
+ {make_seq(E1, E2), S2}.
+
+
+%% The `case' switch of Core Erlang is rather different from the boolean
+%% `(if e1 e2 e3)' case of the original algorithm, but the central idea
+%% is the same: if, given the simplified switch expression (which is
+%% visited in `value' context - a boolean `test' context would not be
+%% generally useful), there is a clause which could definitely be
+%% selected, such that no clause before it can possibly be selected,
+%% then we can eliminate all other clauses. (And even if this is not the
+%% case, some clauses can often be eliminated.) Furthermore, if a clause
+%% can be selected, we can replace the case-expression (including the
+%% switch expression) with the body of the clause and a set of zero or
+%% more let-bindings of subexpressions of the switch expression. (In the
+%% simplest case, the switch expression is evaluated only for effect.)
+
+i_case(E, Ctxt, Ren, Env, S) ->
+ %% First visit the switch expression in `value' context, to simplify
+ %% it as far as possible. Note that only the result part is passed
+ %% on to the clause matching below; any effects are hoisted.
+ {A, S1} = i(case_arg(E), value, Ren, Env, S),
+ A1 = result(A),
+
+ %% Propagating an application context into the branches could cause
+ %% the arguments of the application to be evaluated *after* the
+ %% switch expression, but *before* the body of the selected clause.
+ %% Such interleaving is not allowed in general, and it does not seem
+ %% worthwile to make a more powerful transformation here. Therefore,
+ %% the clause bodies are conservatively visited for value if the
+ %% context is `application'.
+ Ctxt1 = safe_context(Ctxt),
+ {E1, S2} = case get_components(case_arity(E), A1) of
+ {true, As} ->
+ i_case_1(As, E, Ctxt1, Ren, Env, S1);
+ false ->
+ i_case_1([], E, Ctxt1, Ren, Env, S1)
+ end,
+ {hoist_effects(A, E1), S2}.
+
+i_case_1(As, E, Ctxt, Ren, Env, S) ->
+ case i_clauses(As, case_clauses(E), Ctxt, Ren, Env, S) of
+ {false, {As1, Vs, Env1, Cs}, S1} ->
+ %% We still have a list of clauses. Sanity check:
+ if Cs == [] ->
+ report_warning("empty list of clauses "
+ "in residual program!.\n");
+ true ->
+ ok
+ end,
+ {A, S2} = i(c_values(As1), value, ren__identity(), Env1,
+ S1),
+ {E1, S3} = i_case_2(Cs, A, E, S2),
+ i_case_3(Vs, Env1, E1, S3);
+ {true, {_, Vs, Env1, [C]}, S1} ->
+ %% A single clause was selected; we just take the body.
+ i_case_3(Vs, Env1, clause_body(C), S1)
+ end.
+
+%% Check if all clause bodies are actually equivalent expressions that
+%% do not depent on pattern variables (this sometimes occurs as a
+%% consequence of inlining, e.g., all branches might yield 'true'), and
+%% if so, replace the `case' with a sequence, first evaluating the
+%% clause selection for effect, then evaluating one of the clause bodies
+%% for its value. (Unless the switch contains a catch-all clause, the
+%% clause selection must be evaluated for effect, since there is no
+%% guarantee that any of the clauses will actually match. Assuming that
+%% some clause always matches could make an undefined program produce a
+%% value.) This makes the final size less than what was accounted for
+%% when visiting the clauses, but currently we don't try to adjust for
+%% this.
+
+i_case_2(Cs, A, E, S) ->
+ case equivalent_clauses(Cs) of
+ false ->
+ %% Count the base sizes for the remaining clauses; pattern
+ %% and guard sizes are already counted.
+ N = weight('case') + weight(clause) * length(Cs),
+ S1 = count_size(N, S),
+ {update_c_case(E, A, Cs), S1};
+ true ->
+ case cerl_clauses:any_catchall(Cs) of
+ true ->
+ %% We know that some clause must be selected, so we
+ %% can drop all the testing as well.
+ E1 = make_seq(A, clause_body(hd(Cs))),
+ {E1, S};
+ false ->
+ %% The clause selection must be performed for
+ %% effect.
+ E1 = update_c_case(E, A,
+ set_clause_bodies(Cs, void())),
+ {make_seq(E1, clause_body(hd(Cs))), S}
+ end
+ end.
+
+i_case_3(Vs, Env, E, S) ->
+ %% For the variables bound to the switch expression subexpressions,
+ %% make let bindings or create evaluation for effect.
+ Rs = [env__get(var_name(V), Env) || V <- Vs],
+ {E1, S1} = make_let_bindings(Rs, E, S),
+ Opnds = [R#ref.opnd || R <- Rs],
+ residualize_operands(Opnds, E1, S1).
+
+%% This function takes a sequence of switch expressions `Es' (which can
+%% be the empty list if these are unknown) and a list `Cs' of clauses,
+%% and returns `{Match, {As, Vs, Env1, Cs1}, S1}' where `As' is a list
+%% of residual switch expressions, `Vs' the list of variables used in
+%% the templates, `Env1' the environment for the templates, and `Cs1'
+%% the list of residual clauses. `Match' is `true' if some clause could
+%% be shown to definitely match (in this case, `Cs1' contains exactly
+%% one element), and `false' otherwise. `S1' is the new state. The given
+%% `Ctxt' is the context to be used for visiting the body of clauses.
+%%
+%% Visiting a clause basically amounts to extending the environment for
+%% all variables in the pattern, as for a `fun' (cf. `i_fun'),
+%% propagating match information if possible, and visiting the guard and
+%% body in the new environment.
+%%
+%% To make it cheaper to do handle a set of clauses, and to avoid
+%% unnecessarily exceeding the size limit, we avoid visiting the bodies
+%% of clauses which are subsequently removed, by dividing the visiting
+%% of a clause into two stages: first construct the environment(s) and
+%% visit the pattern (for renaming) and the guard (for value), then
+%% reduce the switch as much as possible, and lastly visit the body.
+
+i_clauses(Cs, Ctxt, Ren, Env, S) ->
+ i_clauses([], Cs, Ctxt, Ren, Env, S).
+
+i_clauses(Es, Cs, Ctxt, Ren, Env, S) ->
+ %% Create templates for the switch expressions.
+ {Ts, {Vs, Env0}} = mapfoldl(fun (E, {Vs, Env}) ->
+ {T, Vs1, Env1} =
+ make_template(E, Env),
+ {T, {Vs1 ++ Vs, Env1}}
+ end,
+ {[], Env}, Es),
+
+ %% Make operand structures for the switch subexpression templates
+ %% (found in `Env0') and add proper ref-structure bindings to the
+ %% environment. Since the subexpressions in general can be
+ %% interdependent (Vs is in reverse-dependency order), the
+ %% environment (and renaming) must be created incrementally. Note
+ %% that since the switch expressions have been visited already, the
+ %% identity renaming is used for the operands.
+ Vs1 = lists:reverse(Vs),
+ {Ren1, Env1, S1} =
+ foldl(fun (V, {Ren, Env, S}) ->
+ E = env__get(var_name(V), Env0),
+ {Opnd, S_1} = make_opnd(E, ren__identity(), Env,
+ S),
+ {_, Ren1, Env1, S_2} = bind_locals([V], [Opnd],
+ Ren, Env, S_1),
+ {Ren1, Env1, S_2}
+ end,
+ {Ren, Env, S}, Vs1),
+
+ %% First we visit the head of each individual clause, renaming
+ %% pattern variables, inserting let-bindings in the guard and body,
+ %% and visiting the guard. The information used for visiting the
+ %% clause body will be prefixed to the clause annotations.
+ {Cs1, S2} = mapfoldl(fun (C, S) ->
+ i_clause_head(C, Ts, Ren1, Env1, S)
+ end,
+ S1, Cs),
+
+ %% Now that the clause guards have been reduced as far as possible,
+ %% we can attempt to reduce the clauses.
+ As = [hd(get_ann(T)) || T <- Ts],
+ case cerl_clauses:reduce(Cs1, Ts) of
+ {false, Cs2} ->
+ %% We still have one or more clauses (with associated
+ %% extended environments). Their bodies have not yet been
+ %% visited, so we do that (in the respective safe
+ %% environments, adding the sizes of the visited heads to
+ %% the current size counter) and return the final list of
+ %% clauses.
+ {Cs3, S3} = mapfoldl(
+ fun (C, S) ->
+ i_clause_body(C, Ctxt, S)
+ end,
+ S2, Cs2),
+ {false, {As, Vs1, Env1, Cs3}, S3};
+ {true, {C, _}} ->
+ %% A clause C could be selected (the bindings have already
+ %% been added to the guard/body). Note that since the clause
+ %% head will probably be discarded, its size is not counted.
+ {C1, Ren2, Env2, _} = get_clause_extras(C),
+ {B, S3} = i(clause_body(C), Ctxt, Ren2, Env2, S2),
+ C2 = update_c_clause(C1, clause_pats(C1), clause_guard(C1), B),
+ {true, {As, Vs1, Env1, [C2]}, S3}
+ end.
+
+%% This visits the head of a clause, renames pattern variables, inserts
+%% let-bindings in the guard and body, and does inlining on the guard
+%% expression. Returns a list of pairs `{NewClause, Data}', where `Data'
+%% is `{Renaming, Environment, Size}' used for visiting the body of the
+%% new clause.
+
+i_clause_head(C, Ts, Ren, Env, S) ->
+ %% Match the templates against the (non-renamed) patterns to get the
+ %% available information about matching subexpressions. We don't
+ %% care at this point whether an exact match/nomatch is detected.
+ Ps = clause_pats(C),
+ Bs = case cerl_clauses:match_list(Ps, Ts) of
+ {_, Bs1} -> Bs1;
+ none -> []
+ end,
+
+ %% The patterns must be visited for renaming; cf. `i_pattern'. We
+ %% use a passive size counter for visiting the patterns and the
+ %% guard (cf. `visit'), because we do not know at this stage whether
+ %% the clause will be kept or not; the final value of the counter is
+ %% included in the returned value below.
+ {_, Ren1, Env1, S1} = bind_locals(clause_vars(C), Ren, Env, S),
+ S2 = new_passive_size(get_size_limit(S1), S1),
+ {Ps1, S3} = mapfoldl(fun (P, S) ->
+ i_pattern(P, Ren1, Env1, Ren, Env, S)
+ end,
+ S2, Ps),
+
+ %% Rewrite guard and body and visit the guard for value. Discard the
+ %% latter size count if the guard turns out to be a constant.
+ G = add_match_bindings(Bs, clause_guard(C)),
+ B = add_match_bindings(Bs, clause_body(C)),
+ {G1, S4} = i(G, value, Ren1, Env1, S3),
+ S5 = case is_literal(G1) of
+ true ->
+ revert_size(S3, S4);
+ false ->
+ S4
+ end,
+
+ %% Revert to the size counter we had on entry to this function. The
+ %% environment and renaming, together with the size of the clause
+ %% head, are prefixed to the annotations for later use.
+ Size = get_size_value(S5),
+ C1 = update_c_clause(C, Ps1, G1, B),
+ {set_clause_extras(C1, Ren1, Env1, Size), revert_size(S, S5)}.
+
+add_match_bindings(Bs, E) ->
+ %% Don't waste time if the variables definitely cannot be used.
+ %% (Most guards are simply `true'.)
+ case is_literal(E) of
+ true ->
+ E;
+ false ->
+ Vs = [V || {V, E} <- Bs, E /= any],
+ Es = [hd(get_ann(E)) || {_V, E} <- Bs, E /= any],
+ c_let(Vs, c_values(Es), E)
+ end.
+
+i_clause_body(C0, Ctxt, S) ->
+ {C, Ren, Env, Size} = get_clause_extras(C0),
+ S1 = count_size(Size, S),
+ {B, S2} = i(clause_body(C), Ctxt, Ren, Env, S1),
+ C1 = update_c_clause(C, clause_pats(C), clause_guard(C), B),
+ {C1, S2}.
+
+get_clause_extras(C) ->
+ [{Ren, Env, Size} | As] = get_ann(C),
+ {set_ann(C, As), Ren, Env, Size}.
+
+set_clause_extras(C, Ren, Env, Size) ->
+ As = [{Ren, Env, Size} | get_ann(C)],
+ set_ann(C, As).
+
+%% This is the `(lambda x e)' case of the original algorithm. A
+%% `fun' is like a lambda expression, but with a varying number of
+%% parameters; possibly zero.
+
+i_fun(E, Ctxt, Ren, Env, S) ->
+ case Ctxt of
+ effect ->
+ %% Reduce useless `fun' expressions to a simple constant;
+ %% visiting the body would be a waste of time, and could
+ %% needlessly mark variables as referenced.
+ {void(), count_size(weight(literal), S)};
+ value ->
+ %% Note that the variables are visited as patterns.
+ Vs = fun_vars(E),
+ {_, Ren1, Env1, S1} = bind_locals(Vs, Ren, Env, S),
+ Vs1 = i_params(Vs, Ren1, Env1),
+
+ %% The body is always visited for value.
+ {B, S2} = i(fun_body(E), value, Ren1, Env1, S1),
+
+ %% We don't bother to include the exact number of free
+ %% variables in the cost for creating a fun-value.
+ S3 = count_size(weight('fun'), S2),
+
+ %% Inlining might have duplicated code, so we must remove
+ %% any 'id'-annotations from the original fun-expression.
+ %% (This forces a later stage to invent new id:s.) This is
+ %% necessary as long as fun:s may still need to be
+ %% identified the old way. Function variables that are not
+ %% in application context also have such annotations, but
+ %% the inlining will currently lose all annotations on
+ %% variable references (I think), so that's not a problem.
+ {set_ann(c_fun(Vs1, B), kill_id_anns(get_ann(E))), S3};
+ #app{} ->
+ %% An application of a fun-expression (in the source code)
+ %% is handled by going directly to `inline'; this is never
+ %% residualised, and we don't set up new counters here. Note
+ %% that inlining of copy-propagated fun-expressions is done
+ %% in `copy'; not here.
+ inline(E, Ctxt, Ren, Env, S)
+ end.
+
+%% A `letrec' requires a circular environment, but is otherwise like a
+%% `let', i.e. like a direct lambda application. Note that only
+%% fun-expressions (lambda abstractions) may occur in the right-hand
+%% side of each definition.
+
+i_letrec(E, Ctxt, Ren, Env, S) ->
+ %% Note that we pass an empty list for the auto-referenced
+ %% (exported) functions here.
+ {Es, B, _, S1} = i_letrec(letrec_defs(E), letrec_body(E), [], Ctxt,
+ Ren, Env, S),
+
+ %% If no bindings remain, only the body is returned.
+ case Es of
+ [] ->
+ {B, S1}; % drop annotations on E
+ _ ->
+ S2 = count_size(weight(letrec), S1),
+ {update_c_letrec(E, Es, B), S2}
+ end.
+
+%% The major part of this is shared by letrec-expressions and module
+%% definitions alike.
+
+i_letrec(Es, B, Xs, Ctxt, Ren, Env, S) ->
+ %% First, we create operands with dummy renamings and environments,
+ %% and with fresh store locations for cached expressions and operand
+ %% info.
+ {Opnds, S1} = mapfoldl(fun ({_, E}, S) ->
+ make_opnd(E, undefined, undefined, S)
+ end,
+ S, Es),
+
+ %% Then we make recursive bindings for the definitions.
+ {Rs, Ren1, Env1, S2} = bind_recursive([F || {F, _} <- Es],
+ Opnds, Ren, Env, S1),
+
+ %% For the function variables listed in Xs (none for a
+ %% letrec-expression), we must make sure that the corresponding
+ %% operand expressions are visited and that the definitions are
+ %% marked as referenced; we also need to return the possibly renamed
+ %% function variables.
+ {Xs1, S3} =
+ mapfoldl(
+ fun (X, S) ->
+ Name = ren__map(var_name(X), Ren1),
+ case env__lookup(Name, Env1) of
+ {ok, R} ->
+ S_1 = i_letrec_export(R, S),
+ {ref_to_var(R), S_1};
+ error ->
+ %% We just skip any exports that are not
+ %% actually defined here, and generate a
+ %% warning message.
+ {N, A} = var_name(X),
+ report_warning("export `~w'/~w "
+ "not defined.\n", [N, A]),
+ {X, S}
+ end
+ end,
+ S2, Xs),
+
+ %% At last, we can then visit the body.
+ {B1, S4} = i(B, Ctxt, Ren1, Env1, S3),
+
+ %% Finally, we create new letrec-bindings for any and all
+ %% residualised definitions. All referenced functions should have
+ %% been visited; the call to `visit' below is expected to retreive a
+ %% cached expression.
+ Rs1 = keep_referenced(Rs, S4),
+ {Es1, S5} = mapfoldl(fun (R, S) ->
+ {E_1, S_1} = visit(R#ref.opnd, S),
+ {{ref_to_var(R), E_1}, S_1}
+ end,
+ S4, Rs1),
+ {Es1, B1, Xs1, S5}.
+
+%% This visits the operand for a function definition exported by a
+%% `letrec' (which is really a `module' module definition, since normal
+%% letrecs have no export declarations). Only the updated state is
+%% returned. We must handle the "inner-pending" flag when doing this;
+%% cf. `i_var'.
+
+i_letrec_export(R, S) ->
+ Opnd = R#ref.opnd,
+ S1 = st__mark_inner_pending(Opnd#opnd.loc, S),
+ {_, S2} = visit(Opnd, S1),
+ {_, S3} = residualize_var(R, st__clear_inner_pending(Opnd#opnd.loc,
+ S2)),
+ S3.
+
+%% This is the `(call e1 e2)' case of the original algorithm. The only
+%% difference is that we must handle multiple (or no) operand
+%% expressions.
+
+i_apply(E, Ctxt, Ren, Env, S) ->
+ {Opnds, S1} = mapfoldl(fun (E, S) ->
+ make_opnd(E, Ren, Env, S)
+ end,
+ S, apply_args(E)),
+
+ %% Allocate a new app-context location and set up an application
+ %% context structure containing the surrounding context.
+ {L, S2} = st__new_app_loc(S1),
+ Ctxt1 = #app{opnds = Opnds, ctxt = Ctxt, loc = L},
+
+ %% Visit the operator expression in the new call context.
+ {E1, S3} = i(apply_op(E), Ctxt1, Ren, Env, S2),
+
+ %% Check the "inlined" flag to find out what to do next. (The store
+ %% location could be recycled after the flag has been tested, but
+ %% there is no real advantage to that, because in practice, only
+ %% 4-5% of all created store locations will ever be reused, while
+ %% there will be a noticable overhead for managing the free list.)
+ case st__get_app_inlined(L, S3) of
+ true ->
+ %% The application was inlined, so we have the final
+ %% expression in `E1'. We just have to handle any operands
+ %% that need to be residualized for effect only (i.e., those
+ %% the values of which are not used).
+ residualize_operands(Opnds, E1, S3);
+ false ->
+ %% Otherwise, `E1' is the residual operator expression. We
+ %% make sure all operands are visited, and rebuild the
+ %% application.
+ {Es, S4} = mapfoldl(fun (Opnd, S) ->
+ visit_and_count_size(Opnd, S)
+ end,
+ S3, Opnds),
+ N = apply_size(length(Es)),
+ {update_c_apply(E, E1, Es), count_size(N, S4)}
+ end.
+
+apply_size(A) ->
+ weight(apply) + weight(argument) * A.
+
+%% Since it is not the task of this transformation to handle
+%% cross-module inlining, all inter-module calls are handled by visiting
+%% the components (the module and function name, and the arguments of
+%% the call) for value. In `effect' context, if the function itself is
+%% known to be completely effect free, the call can be discarded and the
+%% arguments evaluated for effect. Otherwise, if all the visited
+%% arguments are to constants, and the function is known to be safe to
+%% execute at compile time, then we try to evaluate the call. If
+%% evaluation completes normally, the call is replaced by the result;
+%% otherwise the call is residualised.
+
+i_call(E, Ctxt, Ren, Env, S) ->
+ {M, S1} = i(call_module(E), value, Ren, Env, S),
+ {F, S2} = i(call_name(E), value, Ren, Env, S1),
+ As = call_args(E),
+ Arity = length(As),
+
+ %% Check if the name of the called function is static. If so,
+ %% discard the size counts performed above, since the values will
+ %% not cause any runtime cost.
+ Static = is_c_atom(M) and is_c_atom(F),
+ S3 = case Static of
+ true ->
+ revert_size(S, S2);
+ false ->
+ S2
+ end,
+ case Ctxt of
+ effect when Static == true ->
+ case is_safe_call(atom_val(M), atom_val(F), Arity) of
+ true ->
+ %% The result will not be used, and the call is
+ %% effect free, so we create a multiple-value
+ %% aggregate containing the (not yet visited)
+ %% arguments and process that instead.
+ i(c_values(As), effect, Ren, Env, S3);
+ false ->
+ %% We are not allowed to simply discard the call,
+ %% but we can try to evaluate it.
+ i_call_1(Static, M, F, Arity, As, E, Ctxt, Ren, Env,
+ S3)
+ end;
+ _ ->
+ i_call_1(Static, M, F, Arity, As, E, Ctxt, Ren, Env, S3)
+ end.
+
+i_call_1(Static, M, F, Arity, As, E, Ctxt, Ren, Env, S) ->
+ %% Visit the arguments for value.
+ {As1, S1} = mapfoldl(fun (X, A) -> i(X, value, Ren, Env, A) end,
+ S, As),
+ case Static of
+ true ->
+ case erl_bifs:is_pure(atom_val(M), atom_val(F), Arity) of
+ true ->
+ %% It is allowed to evaluate this at compile time.
+ case all_static(As1) of
+ true ->
+ i_call_3(M, F, As1, E, Ctxt, Env, S1);
+ false ->
+ %% See if the call can be rewritten instead.
+ i_call_4(M, F, As1, E, Ctxt, Env, S1)
+ end;
+ false ->
+ i_call_2(M, F, As1, E, S1)
+ end;
+ false ->
+ i_call_2(M, F, As1, E, S1)
+ end.
+
+%% Residualise the call.
+
+i_call_2(M, F, As, E, S) ->
+ N = weight(call) + weight(argument) * length(As),
+ {update_c_call(E, M, F, As), count_size(N, S)}.
+
+%% Attempt to evaluate the call to yield a literal; if that fails, try
+%% to rewrite the expression.
+
+i_call_3(M, F, As, E, Ctxt, Env, S) ->
+ %% Note that we extract the results of argument expessions here; the
+ %% expressions could still be sequences with side effects.
+ Vs = [concrete(result(A)) || A <- As],
+ case catch {ok, apply(atom_val(M), atom_val(F), Vs)} of
+ {ok, V} ->
+ %% Evaluation completed normally - try to turn the result
+ %% back into a syntax tree (representing a literal).
+ case is_literal_term(V) of
+ true ->
+ %% Make a sequence of the arguments (as a
+ %% multiple-value aggregate) and the final value.
+ S1 = count_size(weight(values), S),
+ S2 = count_size(weight(literal), S1),
+ {make_seq(c_values(As), abstract(V)), S2};
+ false ->
+ %% The result could not be represented as a literal.
+ i_call_4(M, F, As, E, Ctxt, Env, S)
+ end;
+ _ ->
+ %% The evaluation attempt did not complete normally.
+ i_call_4(M, F, As, E, Ctxt, Env, S)
+ end.
+
+%% Rewrite the expression, if possible, otherwise residualise it.
+
+i_call_4(M, F, As, E, Ctxt, Env, S) ->
+ case reduce_bif_call(atom_val(M), atom_val(F), As, Env) of
+ false ->
+ %% Nothing more to be done - residualise the call.
+ i_call_2(M, F, As, E, S);
+ {true, E1} ->
+ %% We revisit the result, because the rewriting might have
+ %% opened possibilities for further inlining. Since the
+ %% parts have already been visited once, we use the identity
+ %% renaming here.
+ i(E1, Ctxt, ren__identity(), Env, S)
+ end.
+
+%% For now, we assume that primops cannot be evaluated at compile time,
+%% probably being too special. Also, we have no knowledge about their
+%% side effects.
+
+i_primop(E, Ren, Env, S) ->
+ %% Visit the arguments for value.
+ {As, S1} = mapfoldl(fun (E, S) ->
+ i(E, value, Ren, Env, S)
+ end,
+ S, primop_args(E)),
+ N = weight(primop) + weight(argument) * length(As),
+ {update_c_primop(E, primop_name(E), As), count_size(N, S1)}.
+
+%% This is like having an expression with an extra fun-expression
+%% attached for "exceptional cases"; actually, there are exactly two
+%% parameter variables for the body, but they are easiest handled as if
+%% their number might vary, just as for a `fun'.
+
+i_try(E, Ctxt, Ren, Env, S) ->
+ %% The argument expression is evaluated in `value' context, and the
+ %% surrounding context is propagated into both branches. We do not
+ %% try to recognize cases when the protected expression will
+ %% actually raise an exception. Note that the variables are visited
+ %% as patterns.
+ {A, S1} = i(try_arg(E), value, Ren, Env, S),
+ Vs = try_vars(E),
+ {_, Ren1, Env1, S2} = bind_locals(Vs, Ren, Env, S1),
+ Vs1 = i_params(Vs, Ren1, Env1),
+ {B, S3} = i(try_body(E), Ctxt, Ren1, Env1, S2),
+ case is_safe(A) of
+ true ->
+ %% The `try' wrapper can be dropped in this case. Since the
+ %% expressions have been visited already, the identity
+ %% renaming is used when we revisit the new let-expression.
+ i(c_let(Vs1, A, B), Ctxt, ren__identity(), Env, S3);
+ false ->
+ Evs = try_evars(E),
+ {_, Ren2, Env2, S4} = bind_locals(Evs, Ren, Env, S3),
+ Evs1 = i_params(Evs, Ren2, Env2),
+ {H, S5} = i(try_handler(E), Ctxt, Ren2, Env2, S4),
+ S6 = count_size(weight('try'), S5),
+ {update_c_try(E, A, Vs1, B, Evs1, H), S6}
+ end.
+
+%% A special case of try-expressions:
+
+i_catch(E, Ctxt, Ren, Env, S) ->
+ %% We cannot propagate application contexts into the catch.
+ {E1, S1} = i(catch_body(E), safe_context(Ctxt), Ren, Env, S),
+ case is_safe(E1) of
+ true ->
+ %% The `catch' wrapper can be dropped in this case.
+ {E1, S1};
+ false ->
+ S2 = count_size(weight('catch'), S1),
+ {update_c_catch(E, E1), S2}
+ end.
+
+%% A receive-expression is very much like a case-expression, with the
+%% difference that we do not have access to a switch expression, since
+%% the value being switched on is taken from the mailbox. The fact that
+%% the receive-expression may iterate over an arbitrary number of
+%% messages is not of interest to us. All we can do here is to visit its
+%% subexpressions, and possibly eliminate definitely unselectable
+%% clauses.
+
+i_receive(E, Ctxt, Ren, Env, S) ->
+ %% We first visit the expiry expression (for value) and the expiry
+ %% body (in the surrounding context).
+ {T, S1} = i(receive_timeout(E), value, Ren, Env, S),
+ {B, S2} = i(receive_action(E), Ctxt, Ren, Env, S1),
+
+ %% Then we visit the clauses. Note that application contexts may not
+ %% in general be propagated into the branches (and the expiry body),
+ %% because the execution of the `receive' may remove a message from
+ %% the mailbox as a side effect; the situation is thus analogous to
+ %% that in a `case' expression.
+ Ctxt1 = safe_context(Ctxt),
+ case i_clauses(receive_clauses(E), Ctxt1, Ren, Env, S2) of
+ {false, {[], _, _, Cs}, S3} ->
+ %% We still have a list of clauses. If the list is empty,
+ %% and the expiry expression is the integer zero, the
+ %% expression reduces to the expiry body.
+ if Cs == [] ->
+ case is_c_int(T) andalso (int_val(T) == 0) of
+ true ->
+ {B, S3};
+ false ->
+ i_receive_1(E, Cs, T, B, S3)
+ end;
+ true ->
+ i_receive_1(E, Cs, T, B, S3)
+ end;
+ {true, {_, _, _, Cs}, S3} ->
+ %% Cs is a single clause that will always be matched (if a
+ %% message exists), but we must keep the `receive' statement
+ %% in order to fetch the message from the mailbox.
+ i_receive_1(E, Cs, T, B, S3)
+ end.
+
+i_receive_1(E, Cs, T, B, S) ->
+ %% Here, we just add the base sizes for the receive-expression
+ %% itself and for each remaining clause; cf. `case'.
+ N = weight('receive') + weight(clause) * length(Cs),
+ {update_c_receive(E, Cs, T, B), count_size(N, S)}.
+
+%% A module definition is like a `letrec', with some add-ons (export and
+%% attribute declarations) but without an explicit body. Actually, the
+%% exporting of function names has the same effect as if there was a
+%% body consisting of the list of references to the exported functions.
+%% Thus, the exported functions are exactly those which can be
+%% referenced from outside the module.
+
+i_module(E, Ctxt, Ren, Env, S) ->
+ %% Cf. `i_letrec'. Note that we pass a dummy constant value for the
+ %% "body" parameter.
+ {Es, _, Xs1, S1} = i_letrec(module_defs(E), void(),
+ module_exports(E), Ctxt, Ren, Env, S),
+ %% Sanity check:
+ case Es of
+ [] ->
+ report_warning("no function definitions remaining "
+ "in module `~s'.\n",
+ [atom_name(module_name(E))]);
+ _ ->
+ ok
+ end,
+ E1 = update_c_module(E, module_name(E), Xs1, module_attrs(E), Es),
+ {E1, count_size(weight(module), S1)}.
+
+%% Binary-syntax expressions are too complicated to do anything
+%% interesting with here - that is beyond the scope of this program;
+%% also, their construction could have side effects, so even in effect
+%% context we can't remove them. (We don't bother to identify cases of
+%% "safe" unused binaries which could be removed.)
+
+i_binary(E, Ren, Env, S) ->
+ %% Visit the segments for value.
+ {Es, S1} = mapfoldl(fun (E, S) ->
+ i_bitstr(E, Ren, Env, S)
+ end,
+ S, binary_segments(E)),
+ S2 = count_size(weight(binary), S1),
+ {update_c_binary(E, Es), S2}.
+
+i_bitstr(E, Ren, Env, S) ->
+ %% It is not necessary to visit the Unit, Type and Flags fields,
+ %% since these are always literals.
+ {Val, S1} = i(bitstr_val(E), value, Ren, Env, S),
+ {Size, S2} = i(bitstr_size(E), value, Ren, Env, S1),
+ Unit = bitstr_unit(E),
+ Type = bitstr_type(E),
+ Flags = bitstr_flags(E),
+ S3 = count_size(weight(bitstr), S2),
+ {update_c_bitstr(E, Val, Size, Unit, Type, Flags), S3}.
+
+%% This is a simplified version of `i_pattern', for lists of parameter
+%% variables only. It does not modify the state.
+
+i_params([V | Vs], Ren, Env) ->
+ Name = ren__map(var_name(V), Ren),
+ case env__lookup(Name, Env) of
+ {ok, R} ->
+ [ref_to_var(R) | i_params(Vs, Ren, Env)];
+ error ->
+ report_internal_error("variable `~w' not bound "
+ "in pattern.\n", [Name]),
+ exit(error)
+ end;
+i_params([], _, _) ->
+ [].
+
+%% For ordinary patterns, we just visit to rename variables and count
+%% the size/cost. All occurring binding instances of variables should
+%% already have been added to the renaming and environment; however, to
+%% handle the size expressions of binary-syntax patterns, we must pass
+%% the renaming and environment of the containing expression
+
+i_pattern(E, Ren, Env, Ren0, Env0, S) ->
+ case type(E) of
+ var ->
+ %% Count no size.
+ Name = ren__map(var_name(E), Ren),
+ case env__lookup(Name, Env) of
+ {ok, R} ->
+ {ref_to_var(R), S};
+ error ->
+ report_internal_error("variable `~w' not bound "
+ "in pattern.\n", [Name]),
+ exit(error)
+ end;
+ alias ->
+ %% Count no size.
+ V = alias_var(E),
+ Name = ren__map(var_name(V), Ren),
+ case env__lookup(Name, Env) of
+ {ok, R} ->
+ %% Visit the subpattern and recompose.
+ V1 = ref_to_var(R),
+ {P, S1} = i_pattern(alias_pat(E), Ren, Env, Ren0,
+ Env0, S),
+ {update_c_alias(E, V1, P), S1};
+ error ->
+ report_internal_error("variable `~w' not bound "
+ "in pattern.\n", [Name]),
+ exit(error)
+ end;
+ binary ->
+ {Es, S1} = mapfoldl(fun (E, S) ->
+ i_bitstr_pattern(E, Ren, Env,
+ Ren0, Env0, S)
+ end,
+ S, binary_segments(E)),
+ S2 = count_size(weight(binary), S1),
+ {update_c_binary(E, Es), S2};
+ _ ->
+ case is_literal(E) of
+ true ->
+ {E, count_size(weight(literal), S)};
+ false ->
+ {Es1, S1} = mapfoldl(fun (E, S) ->
+ i_pattern(E, Ren, Env,
+ Ren0, Env0,
+ S)
+ end,
+ S, data_es(E)),
+ %% We assume that in general, the elements of the
+ %% constructor will all be fetched.
+ N = weight(data) + length(Es1) * weight(element),
+ S2 = count_size(N, S1),
+ {update_data(E, data_type(E), Es1), S2}
+ end
+ end.
+
+i_bitstr_pattern(E, Ren, Env, Ren0, Env0, S) ->
+ %% It is not necessary to visit the Unit, Type and Flags fields,
+ %% since these are always literals. The Value field is a limited
+ %% pattern - either a literal or an unbound variable. The Size field
+ %% is a limited expression - either a literal or a variable bound in
+ %% the environment of the containing expression.
+ {Val, S1} = i_pattern(bitstr_val(E), Ren, Env, Ren0, Env0, S),
+ {Size, S2} = i(bitstr_size(E), value, Ren0, Env0, S1),
+ Unit = bitstr_unit(E),
+ Type = bitstr_type(E),
+ Flags = bitstr_flags(E),
+ S3 = count_size(weight(bitstr), S2),
+ {update_c_bitstr(E, Val, Size, Unit, Type, Flags), S3}.
+
+
+%% ---------------------------------------------------------------------
+%% Other central inlining functions
+
+%% It is assumed here that `E' is a fun-expression and the context is an
+%% app-structure. If the inlining might be aborted for some reason, a
+%% corresponding catch should have been set up before entering `inline'.
+%%
+%% Note: if the inlined body is a lambda abstraction, and the
+%% surrounding context of the app-context is also an app-context, the
+%% `inlined' flag of the outermost context will be set before that of
+%% the inner context is set. E.g.: `let F = fun (X) -> fun (Y) -> E in
+%% apply apply F(A)(B)' will propagate the body of F, which is a lambda
+%% abstraction, into the outer application context, which will be
+%% inlined to produce expression `E', and the flag of the outer context
+%% will be set. Upon return, the flag of the inner context will also be
+%% set. However, the flags are then tested in innermost-first order.
+%% Thus, if some inlining attempt is aborted, the `inlined' flags of any
+%% nested app-contexts must be cleared.
+%%
+%% This implementation does nothing to handle inlining of calls to
+%% recursive functions in a smart way. This means that as long as the
+%% size and effort counters do not prevent it, the function body will be
+%% inlined (i.e., the first iteration will be unrolled), and the
+%% recursive calls will be residualized.
+
+inline(E, #app{opnds = Opnds, ctxt = Ctxt, loc = L}, Ren, Env, S) ->
+ %% Check that the arities match:
+ Vs = fun_vars(E),
+ if length(Opnds) /= length(Vs) ->
+ report_error("function called with wrong number "
+ "of arguments!\n"),
+ %% TODO: should really just residualise the call...
+ exit(error);
+ true ->
+ ok
+ end,
+ %% Create local bindings for the parameters to their respective
+ %% operand structures from the app-structure, and visit the body in
+ %% the context saved in the structure.
+ {Rs, Ren1, Env1, S1} = bind_locals(Vs, Opnds, Ren, Env, S),
+ {E1, S2} = i(fun_body(E), Ctxt, Ren1, Env1, S1),
+
+ %% Create necessary bindings and/or set flags.
+ {E2, S3} = make_let_bindings(Rs, E1, S2),
+
+ %% Lastly, flag the application as inlined, since the inlining
+ %% attempt was not aborted before we reached this point.
+ {E2, st__set_app_inlined(L, S3)}.
+
+%% For the (possibly renamed) argument variables to an inlined call,
+%% either create `let' bindings for them, if they are still referenced
+%% in the residual expression (in C/Lisp, also if they are assigned to),
+%% or otherwise (if they are not referenced or assigned) mark them for
+%% evaluation for side effects.
+
+make_let_bindings([R | Rs], E, S) ->
+ {E1, S1} = make_let_bindings(Rs, E, S),
+ make_let_binding(R, E1, S1);
+make_let_bindings([], E, S) ->
+ {E, S}.
+
+make_let_binding(R, E, S) ->
+ %% The `referenced' flag is conservatively computed. We therefore
+ %% first check some simple cases where parameter R is definitely not
+ %% referenced in the resulting body E.
+ case is_literal(E) of
+ true ->
+ %% A constant contains no variable references.
+ make_let_binding_1(R, E, S);
+ false ->
+ case is_c_var(E) of
+ true ->
+ case var_name(E) =:= R#ref.name of
+ true ->
+ %% The body is simply the parameter variable
+ %% itself. Visit the operand for value and
+ %% substitute the result for the body.
+ visit_and_count_size(R#ref.opnd, S);
+ false ->
+ %% Not the same variable, so the parameter
+ %% is not referenced at all.
+ make_let_binding_1(R, E, S)
+ end;
+ false ->
+ %% Proceed to check the `referenced' flag.
+ case st__get_var_referenced(R#ref.loc, S) of
+ true ->
+ %% The parameter is probably referenced in
+ %% the residual code (although it might not
+ %% be). Visit the operand for value and
+ %% create a let-binding.
+ {E1, S1} = visit_and_count_size(R#ref.opnd,
+ S),
+ S2 = count_size(weight('let'), S1),
+ {c_let([ref_to_var(R)], E1, E), S2};
+ false ->
+ %% The parameter is definitely not
+ %% referenced.
+ make_let_binding_1(R, E, S)
+ end
+ end
+ end.
+
+%% This marks the operand for evaluation for effect.
+
+make_let_binding_1(R, E, S) ->
+ Opnd = R#ref.opnd,
+ {E, st__set_opnd_effect(Opnd#opnd.loc, S)}.
+
+%% Here, `R' is the ref-structure which is the target of the copy
+%% propagation, and `Opnd' is a visited operand structure, to be
+%% propagated through `R' if possible - if not, `R' is residualised.
+%% `Opnd' is normally the operand that `R' is bound to, and `E' is the
+%% result of visiting `Opnd' for value; we pass this as an argument so
+%% we don't have to fetch it multiple times (because we don't have
+%% constant time access).
+%%
+%% We also pass the environment of the site of the variable reference,
+%% for use when inlining a propagated fun-expression. In the original
+%% algorithm by Waddell, the environment used for inlining such cases is
+%% the identity mapping, because the fun-expression body has already
+%% been visited for value, and their algorithm combines renaming of
+%% source-code variables with the looking up of information about
+%% residual-code variables. We, however, need to check the environment
+%% of the call site when creating new non-shadowed variables, but we
+%% must avoid repeated renaming. We therefore separate the renaming and
+%% the environment (as in the renaming algorithm of Peyton-Jones and
+%% Marlow). This also makes our implementation more general, compared to
+%% the original algorithm, because we do not give up on propagating
+%% variables that were free in the fun-body.
+%%
+%% Example:
+%%
+%% let F = fun (X) -> {'foo', X} in
+%% let G = fun (H) -> apply H(F) % F is free in the fun G
+%% in apply G(fun (F) -> apply F(42))
+%% =>
+%% let F = fun (X) -> {'foo', X} in
+%% apply (fun (H) -> apply H(F))(fun (F) -> apply F(42))
+%% =>
+%% let F = fun (X) -> {'foo', X} in
+%% apply (fun (F) -> apply F(42))(F)
+%% =>
+%% let F = fun (X) -> {'foo', X} in
+%% apply F(42)
+%% =>
+%% apply (fun (X) -> {'foo', X})(2)
+%% =>
+%% {'foo', 42}
+%%
+%% The original algorithm would give up at stage 4, because F was free
+%% in the propagated fun-expression. Our version inlines this example
+%% completely.
+
+copy(R, Opnd, E, Ctxt, Env, S) ->
+ case is_c_var(E) of
+ true ->
+ %% The operand reduces to another variable - get its
+ %% ref-structure and attempt to propagate further.
+ copy_var(env__get(var_name(E), Opnd#opnd.env), Ctxt, Env,
+ S);
+ false ->
+ %% Apart from variables and functional values (the latter
+ %% are handled by `copy_1' below), only constant literals
+ %% are copyable in general; other things, including e.g.
+ %% tuples `{foo, X}', could cause duplication of work, and
+ %% are not copy propagated.
+ case is_literal(E) of
+ true ->
+ {E, count_size(weight(literal), S)};
+ false ->
+ copy_1(R, Opnd, E, Ctxt, Env, S)
+ end
+ end.
+
+copy_var(R, Ctxt, Env, S) ->
+ %% (In Lisp or C, if this other variable might be assigned to, we
+ %% should residualize the "parent" instead, so we don't bypass any
+ %% destructive updates.)
+ case R#ref.opnd of
+ undefined ->
+ %% This variable is not bound to an expression, so just
+ %% residualize it.
+ residualize_var(R, S);
+ Opnd ->
+ %% Note that because operands are always visited before
+ %% copied, all copyable operand expressions will be
+ %% propagated through any number of bindings. If `R' was
+ %% bound to a constant literal, we would never have reached
+ %% this point.
+ case st__lookup_opnd_cache(Opnd#opnd.loc, S) of
+ error ->
+ %% The result for this operand is not yet ready
+ %% (which should mean that it is a recursive
+ %% reference). Thus, we must residualise the
+ %% variable.
+ residualize_var(R, S);
+ {ok, #cache{expr = E1}} ->
+ %% The result for the operand is ready, so we can
+ %% proceed to propagate it.
+ copy_1(R, Opnd, E1, Ctxt, Env, S)
+ end
+ end.
+
+copy_1(R, Opnd, E, Ctxt, Env, S) ->
+ %% Fun-expression (lambdas) are a bit special; they are copyable,
+ %% but should preferably not be duplicated, so they should not be
+ %% copy propagated except into application contexts, where they can
+ %% be inlined.
+ case is_c_fun(E) of
+ true ->
+ case Ctxt of
+ #app{} ->
+ %% First test if the operand is "outer-pending"; if
+ %% so, don't inline.
+ case st__test_outer_pending(Opnd#opnd.loc, S) of
+ false ->
+ copy_inline(R, Opnd, E, Ctxt, Env, S);
+ true ->
+ %% Cyclic reference forced inlining to stop
+ %% (avoiding infinite unfolding).
+ residualize_var(R, S)
+ end;
+ _ ->
+ residualize_var(R, S)
+ end;
+ false ->
+ %% We have no other cases to handle here
+ residualize_var(R, S)
+ end.
+
+%% This inlines a function value that was propagated to an application
+%% context. The inlining is done with an identity renaming (since the
+%% expression is already visited) but in the environment of the call
+%% site (which is OK because of the no-shadowing strategy for renaming,
+%% and because the domain of our environments are the residual-program
+%% variables instead of the source-program variables). Note that we must
+%% first set the "outer-pending" flag, and clear it afterwards.
+
+copy_inline(R, Opnd, E, Ctxt, Env, S) ->
+ S1 = st__mark_outer_pending(Opnd#opnd.loc, S),
+ case catch {ok, copy_inline_1(R, E, Ctxt, Env, S1)} of
+ {ok, {E1, S2}} ->
+ {E1, st__clear_outer_pending(Opnd#opnd.loc, S2)};
+ {'EXIT', X} ->
+ exit(X);
+ X ->
+ %% If we use destructive update for the `outer-pending'
+ %% flag, we must make sure to clear it upon a nonlocal
+ %% return.
+ st__clear_outer_pending(Opnd#opnd.loc, S1),
+ throw(X)
+ end.
+
+%% If the current effort counter was passive, we use a new active effort
+%% counter with the inherited limit for this particular inlining.
+
+copy_inline_1(R, E, Ctxt, Env, S) ->
+ case effort_is_active(S) of
+ true ->
+ copy_inline_2(R, E, Ctxt, Env, S);
+ false ->
+ S1 = new_active_effort(get_effort_limit(S), S),
+ case catch {ok, copy_inline_2(R, E, Ctxt, Env, S1)} of
+ {ok, {E1, S2}} ->
+ %% Revert to the old effort counter.
+ {E1, revert_effort(S, S2)};
+ {counter_exceeded, effort, _} ->
+ %% Aborted this inlining attempt because too much
+ %% effort was spent. Residualize the variable and
+ %% revert to the previous state.
+ residualize_var(R, S);
+ {'EXIT', X} ->
+ exit(X);
+ X ->
+ throw(X)
+ end
+ end.
+
+%% Regardless of whether the current size counter is active or not, we
+%% use a new active size counter for each inlining. If the current
+%% counter was passive, the new counter gets the inherited size limit;
+%% if it was active, the size limit of the new counter will be equal to
+%% the remaining budget of the current counter (which itself is not
+%% affected by the inlining). This distributes the size budget more
+%% evenly over "inlinings within inlinings", so that the whole size
+%% budget is not spent on the first few call sites (in an inlined
+%% function body) forcing the remaining call sites to be residualised.
+
+copy_inline_2(R, E, Ctxt, Env, S) ->
+ Limit = case size_is_active(S) of
+ true ->
+ get_size_limit(S) - get_size_value(S);
+ false ->
+ get_size_limit(S)
+ end,
+ %% Add the cost of the application to the new size limit, so we
+ %% always inline functions that are small enough, even if `Limit' is
+ %% close to zero at this point. (This is an extension to the
+ %% original algorithm.)
+ S1 = new_active_size(Limit + apply_size(length(Ctxt#app.opnds)), S),
+ case catch {ok, inline(E, Ctxt, ren__identity(), Env, S1)} of
+ {ok, {E1, S2}} ->
+ %% Revert to the old size counter.
+ {E1, revert_size(S, S2)};
+ {counter_exceeded, size, S2} ->
+ %% Aborted this inlining attempt because it got too big.
+ %% Residualize the variable and revert to the old size
+ %% counter. (It is important that we do not also revert the
+ %% effort counter here. Because the effort and size counters
+ %% are always set up together, we know that the effort
+ %% counter returned in S2 is the same that was passed to
+ %% `inline'.)
+ S3 = revert_size(S, S2),
+ %% If we use destructive update for the `inlined' flag, we
+ %% must make sure to clear the flags of any nested
+ %% app-contexts upon aborting; see `inline' for details.
+ reset_nested_apps(Ctxt, S3), % for effect
+ residualize_var(R, S3);
+ {'EXIT', X} ->
+ exit(X);
+ X ->
+ throw(X)
+ end.
+
+reset_nested_apps(#app{ctxt = Ctxt, loc = L}, S) ->
+ reset_nested_apps(Ctxt, st__clear_app_inlined(L, S));
+reset_nested_apps(_, S) ->
+ S.
+
+
+%% ---------------------------------------------------------------------
+%% Support functions
+
+new_var(Env) ->
+ Name = env__new_vname(Env),
+ c_var(Name).
+
+residualize_var(R, S) ->
+ S1 = count_size(weight(var), S),
+ {ref_to_var(R), st__set_var_referenced(R#ref.loc, S1)}.
+
+%% This function returns the value-producing subexpression of any
+%% expression. (Except for sequencing expressions, this is the
+%% expression itself.)
+
+result(E) ->
+ case is_c_seq(E) of
+ true ->
+ %% Also see `make_seq', which is used in all places to build
+ %% sequences so that they are always nested in the first
+ %% position.
+ seq_body(E);
+ false ->
+ E
+ end.
+
+%% This function rewrites E to `do A1 E' if A is `do A1 A2', and
+%% otherwise returns E unchanged.
+
+hoist_effects(A, E) ->
+ case type(A) of
+ seq -> make_seq(seq_arg(A), E);
+ _ -> E
+ end.
+
+%% This "build sequencing expression" operation assures that sequences
+%% are always nested in the first position, which makes it easy to find
+%% the actual value-producing expression of a sequence (cf. `result').
+
+make_seq(E1, E2) ->
+ case is_safe(E1) of
+ true ->
+ %% The first expression can safely be dropped.
+ E2;
+ false ->
+ %% If `E1' is a sequence whose final expression has no side
+ %% effects, then we can lose *that* expression when we
+ %% compose the new sequence, since its value will not be
+ %% used.
+ E3 = case is_c_seq(E1) of
+ true ->
+ case is_safe(seq_body(E1)) of
+ true ->
+ %% Drop the final expression.
+ seq_arg(E1);
+ false ->
+ E1
+ end;
+ false ->
+ E1
+ end,
+ case is_c_seq(E2) of
+ true ->
+ %% `E2' is a sequence (E2' E2''), so we must
+ %% rearrange the nesting to ((E1, E2') E2''), to
+ %% preserve the invariant. Annotations on `E2' are
+ %% lost.
+ c_seq(c_seq(E3, seq_arg(E2)), seq_body(E2));
+ false ->
+ c_seq(E3, E2)
+ end
+ end.
+
+%% Currently, safe expressions include variables, lambda expressions,
+%% constructors with safe subexpressions (this includes atoms, integers,
+%% empty lists, etc.), seq-, let- and letrec-expressions with safe
+%% subexpressions, try- and catch-expressions with safe subexpressions
+%% and calls to safe functions with safe argument subexpressions.
+%% Binaries seem too tricky to be considered.
+
+is_safe(E) ->
+ case is_data(E) of
+ true ->
+ is_safe_list(data_es(E));
+ false ->
+ case type(E) of
+ var ->
+ true;
+ 'fun' ->
+ true;
+ values ->
+ is_safe_list(values_es(E));
+ 'seq' ->
+ case is_safe(seq_arg(E)) of
+ true ->
+ is_safe(seq_body(E));
+ false ->
+ false
+ end;
+ 'let' ->
+ case is_safe(let_arg(E)) of
+ true ->
+ is_safe(let_body(E));
+ false ->
+ false
+ end;
+ letrec ->
+ is_safe(letrec_body(E));
+ 'try' ->
+ %% If the argument expression is not safe, it could
+ %% be modifying the state; thus, even if the body is
+ %% safe, the try-expression as a whole would not be.
+ %% If the argument is safe, the handler is not used.
+ case is_safe(try_arg(E)) of
+ true ->
+ is_safe(try_body(E));
+ false ->
+ false
+ end;
+ 'catch' ->
+ is_safe(catch_body(E));
+ call ->
+ M = call_module(E),
+ F = call_name(E),
+ case is_c_atom(M) and is_c_atom(F) of
+ true ->
+ As = call_args(E),
+ case is_safe_list(As) of
+ true ->
+ is_safe_call(atom_val(M),
+ atom_val(F),
+ length(As));
+ false ->
+ false
+ end;
+ false ->
+ false
+ end;
+ _ ->
+ false
+ end
+ end.
+
+is_safe_list([E | Es]) ->
+ case is_safe(E) of
+ true ->
+ is_safe_list(Es);
+ false ->
+ false
+ end;
+is_safe_list([]) ->
+ true.
+
+is_safe_call(M, F, A) ->
+ erl_bifs:is_safe(M, F, A).
+
+%% When setting up local variables, we only create new names if we have
+%% to, according to the "no-shadowing" strategy.
+
+make_locals(Vs, Ren, Env) ->
+ make_locals(Vs, [], Ren, Env).
+
+make_locals([V | Vs], As, Ren, Env) ->
+ Name = var_name(V),
+ case env__is_defined(Name, Env) of
+ false ->
+ %% The variable need not be renamed. Just make sure that the
+ %% renaming will map it to itself.
+ Name1 = Name,
+ Ren1 = ren__add_identity(Name, Ren);
+ true ->
+ %% The variable must be renamed to maintain the no-shadowing
+ %% invariant. Do the right thing for function variables.
+ Name1 = case Name of
+ {A, N} ->
+ env__new_fname(A, N, Env);
+ _ ->
+ env__new_vname(Env)
+ end,
+ Ren1 = ren__add(Name, Name1, Ren)
+ end,
+ %% This temporary binding is added for correct new-key generation.
+ Env1 = env__bind(Name1, dummy, Env),
+ make_locals(Vs, [Name1 | As], Ren1, Env1);
+make_locals([], As, Ren, Env) ->
+ {reverse(As), Ren, Env}.
+
+%% This adds let-bindings for the source code variables in `Es' to the
+%% environment `Env'.
+%%
+%% Note that we always assign a new state location for the
+%% residual-program variable, since we cannot know when a location for a
+%% particular variable in the source code can be reused.
+
+bind_locals(Vs, Ren, Env, S) ->
+ Opnds = lists:duplicate(length(Vs), undefined),
+ bind_locals(Vs, Opnds, Ren, Env, S).
+
+bind_locals(Vs, Opnds, Ren, Env, S) ->
+ {Ns, Ren1, Env1} = make_locals(Vs, Ren, Env),
+ {Rs, Env2, S1} = bind_locals_1(Ns, Opnds, [], Env1, S),
+ {Rs, Ren1, Env2, S1}.
+
+%% Note that the `Vs' are currently not used for anything except the
+%% number of variables. If we were maintaining "source-referenced"
+%% flags, then the flag in the new variable should be initialized to the
+%% current value of the (residual-) referenced-flag of the "parent".
+
+bind_locals_1([N | Ns], [Opnd | Opnds], Rs, Env, S) ->
+ {R, S1} = new_ref(N, Opnd, S),
+ Env1 = env__bind(N, R, Env),
+ bind_locals_1(Ns, Opnds, [R | Rs], Env1, S1);
+bind_locals_1([], [], Rs, Env, S) ->
+ {lists:reverse(Rs), Env, S}.
+
+new_refs(Ns, Opnds, S) ->
+ new_refs(Ns, Opnds, [], S).
+
+new_refs([N | Ns], [Opnd | Opnds], Rs, S) ->
+ {R, S1} = new_ref(N, Opnd, S),
+ new_refs(Ns, Opnds, [R | Rs], S1);
+new_refs([], [], Rs, S) ->
+ {lists:reverse(Rs), S}.
+
+new_ref(N, Opnd, S) ->
+ {L, S1} = st__new_ref_loc(S),
+ {#ref{name = N, opnd = Opnd, loc = L}, S1}.
+
+%% This adds recursive bindings for the source code variables in `Es' to
+%% the environment `Env'. Note that recursive binding of a set of
+%% variables is an atomic operation on the environment - they cannot be
+%% added one at a time.
+
+bind_recursive(Vs, Opnds, Ren, Env, S) ->
+ {Ns, Ren1, Env1} = make_locals(Vs, Ren, Env),
+ {Rs, S1} = new_refs(Ns, Opnds, S),
+
+ %% When this fun-expression is evaluated, it updates the operand
+ %% structure in the ref-structure to contain the recursively defined
+ %% environment and the correct renaming.
+ Fun = fun (R, Env) ->
+ Opnd = R#ref.opnd,
+ R#ref{opnd = Opnd#opnd{ren = Ren1, env = Env}}
+ end,
+ {Rs, Ren1, env__bind_recursive(Ns, Rs, Fun, Env1), S1}.
+
+safe_context(Ctxt) ->
+ case Ctxt of
+ #app{} ->
+ value;
+ _ ->
+ Ctxt
+ end.
+
+%% Note that the name of a variable encodes its type: a "plain" variable
+%% or a function variable. The latter kind also contains an arity number
+%% which should be preserved upon renaming.
+
+ref_to_var(#ref{name = Name}) ->
+ %% If we were maintaining "source-referenced" flags, the annotation
+ %% `add_ann([#source_ref{loc = L}], E)' should also be done here, to
+ %% make the algorithm reapplicable. This is however not necessary
+ %% since there are no destructive variable assignments in Erlang.
+ c_var(Name).
+
+%% Including the effort counter of the call site assures that the cost
+%% of processing an operand via `visit' is charged to the correct
+%% counter. In particular, if the effort counter of the call site was
+%% passive, the operands will also be processed with a passive counter.
+
+make_opnd(E, Ren, Env, S) ->
+ {L, S1} = st__new_opnd_loc(S),
+ C = st__get_effort(S1),
+ Opnd = #opnd{expr = E, ren = Ren, env = Env, loc = L, effort = C},
+ {Opnd, S1}.
+
+keep_referenced(Rs, S) ->
+ [R || R <- Rs, st__get_var_referenced(R#ref.loc, S)].
+
+residualize_operands(Opnds, E, S) ->
+ foldr(fun (Opnd, {E, S}) -> residualize_operand(Opnd, E, S) end,
+ {E, S}, Opnds).
+
+%% This is the only case where an operand expression can be visited in
+%% `effect' context instead of `value' context.
+
+residualize_operand(Opnd, E, S) ->
+ case st__get_opnd_effect(Opnd#opnd.loc, S) of
+ true ->
+ %% The operand has not been visited, so we do that now, but
+ %% in `effect' context. (Waddell's algoritm does some stuff
+ %% here to account specially for the operand size, which
+ %% appears unnecessary.)
+ {E1, S1} = i(Opnd#opnd.expr, effect, Opnd#opnd.ren,
+ Opnd#opnd.env, S),
+ {make_seq(E1, E), S1};
+ false ->
+ {E, S}
+ end.
+
+%% The `visit' function always visits the operand expression in `value'
+%% context (`residualize_operand' visits an unreferenced operand
+%% expression in `effect' context when necessary). A new passive size
+%% counter is used for visiting the operand, the final value of which is
+%% then cached along with the resulting expression.
+%%
+%% Note that the effort counter of the call site, included in the
+%% operand structure, is not a shared object. Thus, the effort budget is
+%% actually reused over all occurrences of the operands of a single
+%% application. This does not appear to be a problem; just a
+%% modification of the algorithm.
+
+visit(Opnd, S) ->
+ {C, S1} = visit_1(Opnd, S),
+ {C#cache.expr, S1}.
+
+visit_and_count_size(Opnd, S) ->
+ {C, S1} = visit_1(Opnd, S),
+ {C#cache.expr, count_size(C#cache.size, S1)}.
+
+visit_1(Opnd, S) ->
+ case st__lookup_opnd_cache(Opnd#opnd.loc, S) of
+ error ->
+ %% Use a new, passive, size counter for visiting operands,
+ %% and use the effort counter of the context of the operand.
+ %% It turns out that if the latter is active, it must be the
+ %% same object as the one currently used, and if it is
+ %% passive, it does not matter if it is the same object as
+ %% any other counter.
+ Effort = Opnd#opnd.effort,
+ Active = counter__is_active(Effort),
+ S1 = case Active of
+ true ->
+ S; % don't change effort counter
+ false ->
+ st__set_effort(Effort, S)
+ end,
+ S2 = new_passive_size(get_size_limit(S1), S1),
+
+ %% Visit the expression and cache the result, along with the
+ %% final value of the size counter.
+ {E, S3} = i(Opnd#opnd.expr, value, Opnd#opnd.ren,
+ Opnd#opnd.env, S2),
+ Size = get_size_value(S3),
+ C = #cache{expr = E, size = Size},
+ S4 = revert_size(S, st__set_opnd_cache(Opnd#opnd.loc, C,
+ S3)),
+ case Active of
+ true ->
+ {C, S4}; % keep using the same effort counter
+ false ->
+ {C, revert_effort(S, S4)}
+ end;
+ {ok, C} ->
+ {C, S}
+ end.
+
+%% Create a pattern matching template for an expression. A template
+%% contains only data constructors (including atomic ones) and
+%% variables, and compound literals are not folded into a single node.
+%% Each node in the template is annotated with the variable which holds
+%% the corresponding subexpression; these are new, unique variables not
+%% existing in the given `Env'. Returns `{Template, Variables, NewEnv}',
+%% where `Variables' is the list of all variables corresponding to nodes
+%% in the template *listed in reverse dependency order*, and `NewEnv' is
+%% `Env' augmented with mappings from the variable names to
+%% subexpressions of `E' (not #ref{} structures!) rewritten so that no
+%% computations are duplicated. `Variables' is guaranteed to be nonempty
+%% - at least the root node will always be bound to a new variable.
+
+make_template(E, Env) ->
+ make_template(E, [], Env).
+
+make_template(E, Vs0, Env0) ->
+ case is_data(E) of
+ true ->
+ {Ts, {Vs1, Env1}} = mapfoldl(
+ fun (E, {Vs0, Env0}) ->
+ {T, Vs1, Env1} =
+ make_template(E, Vs0,
+ Env0),
+ {T, {Vs1, Env1}}
+ end,
+ {Vs0, Env0}, data_es(E)),
+ T = make_data_skel(data_type(E), Ts),
+ E1 = update_data(E, data_type(E),
+ [hd(get_ann(T)) || T <- Ts]),
+ V = new_var(Env1),
+ Env2 = env__bind(var_name(V), E1, Env1),
+ {set_ann(T, [V]), [V | Vs1], Env2};
+ false ->
+ case type(E) of
+ seq ->
+ %% For a sequencing, we can rebind the variable used
+ %% for the body, and pass on the template as it is.
+ {T, Vs1, Env1} = make_template(seq_body(E), Vs0,
+ Env0),
+ V = var_name(hd(get_ann(T))),
+ E1 = update_c_seq(E, seq_arg(E), env__get(V, Env1)),
+ Env2 = env__bind(V, E1, Env1),
+ {T, Vs1, Env2};
+ _ ->
+ V = new_var(Env0),
+ Env1 = env__bind(var_name(V), E, Env0),
+ {set_ann(V, [V]), [V | Vs0], Env1}
+ end
+ end.
+
+%% Two clauses are equivalent if their bodies are equivalent expressions
+%% given that the respective pattern variables are local.
+
+equivalent_clauses([]) ->
+ true;
+equivalent_clauses([C | Cs]) ->
+ Env = cerl_trees:variables(c_values(clause_pats(C))),
+ equivalent_clauses_1(clause_body(C), Cs, Env).
+
+equivalent_clauses_1(E, [C | Cs], Env) ->
+ Env1 = cerl_trees:variables(c_values(clause_pats(C))),
+ case equivalent(E, clause_body(C), ordsets:union(Env, Env1)) of
+ true ->
+ equivalent_clauses_1(E, Cs, Env);
+ false ->
+ false
+ end;
+equivalent_clauses_1(_, [], _Env) ->
+ true.
+
+%% Two expressions are equivalent if and only if they yield the same
+%% value and has the same side effects in the same order. Currently, we
+%% only accept equality between constructors (constants) and nonlocal
+%% variables, since this should cover most cases of interest. If a
+%% variable is locally bound in one expression, it cannot be equivalent
+%% to one with the same name in the other expression, so we need not
+%% keep track of two environments.
+
+equivalent(E1, E2, Env) ->
+ case is_data(E1) of
+ true ->
+ case is_data(E2) of
+ true ->
+ T1 = {data_type(E1), data_arity(E1)},
+ T2 = {data_type(E2), data_arity(E2)},
+ %% Note that we must test for exact equality.
+ if T1 =:= T2 ->
+ equivalent_lists(data_es(E1), data_es(E2),
+ Env);
+ true ->
+ false
+ end;
+ false ->
+ false
+ end;
+ false ->
+ case type(E1) of
+ var ->
+ case is_c_var(E2) of
+ true ->
+ N1 = var_name(E1),
+ N2 = var_name(E2),
+ if N1 =:= N2 ->
+ not ordsets:is_element(N1, Env);
+ true ->
+ false
+ end;
+ false ->
+ false
+ end;
+ _ ->
+ %% Other constructs are not being considered.
+ false
+ end
+ end.
+
+equivalent_lists([E1 | Es1], [E2 | Es2], Env) ->
+ equivalent(E1, E2, Env) and equivalent_lists(Es1, Es2, Env);
+equivalent_lists([], [], _) ->
+ true;
+equivalent_lists(_, _, _) ->
+ false.
+
+%% Return `false' or `{true, EffectExpr, ValueExpr}'. The environment is
+%% passed for new-variable generation.
+
+reduce_bif_call(M, F, As, Env) ->
+ reduce_bif_call_1(M, F, length(As), As, Env).
+
+reduce_bif_call_1(erlang, element, 2, [X, Y], _Env) ->
+ case is_c_int(X) and is_c_tuple(Y) of
+ true ->
+ %% We are free to change the relative evaluation order of
+ %% the elements, so lifting out a particular element is OK.
+ T = list_to_tuple(tuple_es(Y)),
+ N = int_val(X),
+ if integer(N), N > 0, N =< size(T) ->
+ E = element(N, T),
+ Es = tuple_to_list(setelement(N, T, void())),
+ {true, make_seq(c_tuple(Es), E)};
+ true ->
+ false
+ end;
+ false ->
+ false
+ end;
+reduce_bif_call_1(erlang, hd, 1, [X], _Env) ->
+ case is_c_cons(X) of
+ true ->
+ %% Cf. `element/2' above.
+ {true, make_seq(cons_tl(X), cons_hd(X))};
+ false ->
+ false
+ end;
+reduce_bif_call_1(erlang, length, 1, [X], _Env) ->
+ case is_c_list(X) of
+ true ->
+ %% Cf. `erlang:size/1' below.
+ {true, make_seq(X, c_int(list_length(X)))};
+ false ->
+ false
+ end;
+reduce_bif_call_1(erlang, list_to_tuple, 1, [X], _Env) ->
+ case is_c_list(X) of
+ true ->
+ %% This does not actually preserve all the evaluation order
+ %% constraints of the list, but I don't imagine that it will
+ %% be a problem.
+ {true, c_tuple(list_elements(X))};
+ false ->
+ false
+ end;
+reduce_bif_call_1(erlang, setelement, 3, [X, Y, Z], Env) ->
+ case is_c_int(X) and is_c_tuple(Y) of
+ true ->
+ %% Here, unless `Z' is a simple expression, we must bind it
+ %% to a new variable, because in that case, `Z' must be
+ %% evaluated before any part of `Y'.
+ T = list_to_tuple(tuple_es(Y)),
+ N = int_val(X),
+ if integer(N), N > 0, N =< size(T) ->
+ E = element(N, T),
+ case is_simple(Z) of
+ true ->
+ Es = tuple_to_list(setelement(N, T, Z)),
+ {true, make_seq(E, c_tuple(Es))};
+ false ->
+ V = new_var(Env),
+ Es = tuple_to_list(setelement(N, T, V)),
+ E1 = make_seq(E, c_tuple(Es)),
+ {true, c_let([V], Z, E1)}
+ end;
+ true ->
+ false
+ end;
+ false ->
+ false
+ end;
+reduce_bif_call_1(erlang, size, 1, [X], _Env) ->
+ case is_c_tuple(X) of
+ true ->
+ %% Just evaluate the tuple for effect and use the size (the
+ %% arity) as the result.
+ {true, make_seq(X, c_int(tuple_arity(X)))};
+ false ->
+ false
+ end;
+reduce_bif_call_1(erlang, tl, 1, [X], _Env) ->
+ case is_c_cons(X) of
+ true ->
+ %% Cf. `element/2' above.
+ {true, make_seq(cons_hd(X), cons_tl(X))};
+ false ->
+ false
+ end;
+reduce_bif_call_1(erlang, tuple_to_list, 1, [X], _Env) ->
+ case is_c_tuple(X) of
+ true ->
+ %% This actually introduces slightly stronger constraints on
+ %% the evaluation order of the subexpressions.
+ {true, make_list(tuple_es(X))};
+ false ->
+ false
+ end;
+reduce_bif_call_1(_M, _F, _A, _As, _Env) ->
+ false.
+
+effort_is_active(S) ->
+ counter__is_active(st__get_effort(S)).
+
+size_is_active(S) ->
+ counter__is_active(st__get_size(S)).
+
+get_effort_limit(S) ->
+ counter__limit(st__get_effort(S)).
+
+new_active_effort(Limit, S) ->
+ st__set_effort(counter__new_active(Limit), S).
+
+revert_effort(S1, S2) ->
+ st__set_effort(st__get_effort(S1), S2).
+
+new_active_size(Limit, S) ->
+ st__set_size(counter__new_active(Limit), S).
+
+new_passive_size(Limit, S) ->
+ st__set_size(counter__new_passive(Limit), S).
+
+revert_size(S1, S2) ->
+ st__set_size(st__get_size(S1), S2).
+
+count_effort(N, S) ->
+ C = st__get_effort(S),
+ C1 = counter__add(N, C, effort, S),
+ case debug_counters() of
+ true ->
+ case counter__is_active(C1) of
+ true ->
+ V = counter__value(C1),
+ case V > get(counter_effort_max) of
+ true ->
+ put(counter_effort_max, V);
+ false ->
+ ok
+ end;
+ false ->
+ ok
+ end;
+ _ ->
+ ok
+ end,
+ st__set_effort(C1, S).
+
+count_size(N, S) ->
+ C = st__get_size(S),
+ C1 = counter__add(N, C, size, S),
+ case debug_counters() of
+ true ->
+ case counter__is_active(C1) of
+ true ->
+ V = counter__value(C1),
+ case V > get(counter_size_max) of
+ true ->
+ put(counter_size_max, V);
+ false ->
+ ok
+ end;
+ false ->
+ ok
+ end;
+ _ ->
+ ok
+ end,
+ st__set_size(C1, S).
+
+get_size_value(S) ->
+ counter__value(st__get_size(S)).
+
+get_size_limit(S) ->
+ counter__limit(st__get_size(S)).
+
+kill_id_anns([{'id',_} | As]) ->
+ kill_id_anns(As);
+kill_id_anns([A | As]) ->
+ [A | kill_id_anns(As)];
+kill_id_anns([]) ->
+ [].
+
+
+%% =====================================================================
+%% General utilities
+
+max(X, Y) when X > Y -> X;
+max(_, Y) -> Y.
+
+%% The atom `ok', is widely used in Erlang for "void" values.
+
+void() -> abstract(ok).
+
+is_simple(E) ->
+ case type(E) of
+ literal -> true;
+ var -> true;
+ 'fun' -> true;
+ _ -> false
+ end.
+
+get_components(N, E) ->
+ case type(E) of
+ values ->
+ Es = values_es(E),
+ if length(Es) == N ->
+ {true, Es};
+ true ->
+ false
+ end;
+ _ when N == 1 ->
+ {true, [E]};
+ _ ->
+ false
+ end.
+
+all_static([E | Es]) ->
+ case is_literal(result(E)) of
+ true ->
+ all_static(Es);
+ false ->
+ false
+ end;
+all_static([]) ->
+ true.
+
+set_clause_bodies([C | Cs], B) ->
+ [update_c_clause(C, clause_pats(C), clause_guard(C), B)
+ | set_clause_bodies(Cs, B)];
+set_clause_bodies([], _) ->
+ [].
+
+filename([C | T]) when integer(C), C > 0, C =< 255 ->
+ [C | filename(T)];
+filename([H|T]) ->
+ filename(H) ++ filename(T);
+filename([]) ->
+ [];
+filename(N) when atom(N) ->
+ atom_to_list(N);
+filename(N) ->
+ report_error("bad filename: `~P'.", [N, 25]),
+ exit(error).
+
+
+%% =====================================================================
+%% Abstract datatype: renaming()
+
+ren__identity() ->
+ dict:new().
+
+ren__add(X, Y, Ren) ->
+ dict:store(X, Y, Ren).
+
+ren__map(X, Ren) ->
+ case dict:find(X, Ren) of
+ {ok, Y} ->
+ Y;
+ error ->
+ X
+ end.
+
+ren__add_identity(X, Ren) ->
+ dict:erase(X, Ren).
+
+
+%% =====================================================================
+%% Abstract datatype: environment()
+
+env__empty() ->
+ rec_env:empty().
+
+env__bind(Key, Val, Env) ->
+ rec_env:bind(Key, Val, Env).
+
+%% `Es' should have type `[{Key, Val}]', and `Fun' should have type
+%% `(Val, Env) -> T', mapping a value together with the recursive
+%% environment itself to some term `T' to be returned when the entry is
+%% looked up.
+
+env__bind_recursive(Ks, Vs, F, Env) ->
+ rec_env:bind_recursive(Ks, Vs, F, Env).
+
+env__lookup(Key, Env) ->
+ rec_env:lookup(Key, Env).
+
+env__get(Key, Env) ->
+ rec_env:get(Key, Env).
+
+env__is_defined(Key, Env) ->
+ rec_env:is_defined(Key, Env).
+
+env__new_vname(Env) ->
+ rec_env:new_key(Env).
+
+env__new_fname(A, N, Env) ->
+ rec_env:new_key(fun (X) ->
+ S = integer_to_list(X),
+ {list_to_atom(atom_to_list(A) ++ "_" ++ S),
+ N}
+ end, Env).
+
+
+%% =====================================================================
+%% Abstract datatype: state()
+
+-record(state, {free, % next free location
+ size, % size counter
+ effort, % effort counter
+ cache, % operand expression cache
+ var_flags, % flags for variables (#ref-structures)
+ opnd_flags, % flags for operands
+ app_flags}). % flags for #app-structures
+
+%% Note that we do not have a `var_assigned' flag, since there is no
+%% destructive assignment in Erlang. In the original algorithm, the
+%% "residual-referenced"-flags of the previous inlining pass (or
+%% initialization pass) are used as the "source-referenced"-flags for
+%% the subsequent pass. The latter may then be used as a safe
+%% approximation whenever we need to base a decision on whether or not a
+%% particular variable or function variable could be referenced in the
+%% program being generated, and computation of the new
+%% "residual-referenced" flag for that variable is not yet finished. In
+%% the present algorithm, this can only happen in the presence of
+%% variable assignments, which do not exist in Erlang. Therefore, we do
+%% not keep "source-referenced" flags for residual-code references in
+%% our implementation.
+%%
+%% The "inner-pending" flag tells us whether we are already in the
+%% process of visiting a particular operand, and the "outer-pending"
+%% flag whether we are in the process of inlining a propagated
+%% functional value. The "pending flags" are really counters limiting
+%% the number of times an operand may be inlined recursively, causing
+%% loop unrolling; however, unrolling more than one iteration does not
+%% work offhand in the present implementation. (TODO: find out why.)
+%% Note that the initial value must be greater than zero in order for
+%% any inlining at all to be done.
+
+%% Flags are stored in ETS-tables, one table for each class. The second
+%% element in each stored tuple is the key (the "label").
+
+-record(var_flags, {lab, referenced = false}).
+-record(opnd_flags, {lab, inner_pending = 1, outer_pending = 1,
+ effect = false}).
+-record(app_flags, {lab, inlined = false}).
+
+st__new(Effort, Size) ->
+ #state{free = 0,
+ size = counter__new_passive(Size),
+ effort = counter__new_passive(Effort),
+ cache = dict:new(),
+ var_flags = ets:new(var, [set, private, {keypos, 2}]),
+ opnd_flags = ets:new(opnd, [set, private, {keypos, 2}]),
+ app_flags = ets:new(app, [set, private, {keypos, 2}])}.
+
+st__new_loc(S) ->
+ N = S#state.free,
+ {N, S#state{free = N + 1}}.
+
+st__get_effort(S) ->
+ S#state.effort.
+
+st__set_effort(C, S) ->
+ S#state{effort = C}.
+
+st__get_size(S) ->
+ S#state.size.
+
+st__set_size(C, S) ->
+ S#state{size = C}.
+
+st__set_var_referenced(L, S) ->
+ T = S#state.var_flags,
+ [F] = ets:lookup(T, L),
+ ets:insert(T, F#var_flags{referenced = true}),
+ S.
+
+st__get_var_referenced(L, S) ->
+ ets:lookup_element(S#state.var_flags, L, #var_flags.referenced).
+
+st__lookup_opnd_cache(L, S) ->
+ dict:find(L, S#state.cache).
+
+%% Note that setting the cache should only be done once.
+
+st__set_opnd_cache(L, C, S) ->
+ S#state{cache = dict:store(L, C, S#state.cache)}.
+
+st__set_opnd_effect(L, S) ->
+ T = S#state.opnd_flags,
+ [F] = ets:lookup(T, L),
+ ets:insert(T, F#opnd_flags{effect = true}),
+ S.
+
+st__get_opnd_effect(L, S) ->
+ ets:lookup_element(S#state.opnd_flags, L, #opnd_flags.effect).
+
+st__set_app_inlined(L, S) ->
+ T = S#state.app_flags,
+ [F] = ets:lookup(T, L),
+ ets:insert(T, F#app_flags{inlined = true}),
+ S.
+
+st__clear_app_inlined(L, S) ->
+ T = S#state.app_flags,
+ [F] = ets:lookup(T, L),
+ ets:insert(T, F#app_flags{inlined = false}),
+ S.
+
+st__get_app_inlined(L, S) ->
+ ets:lookup_element(S#state.app_flags, L, #app_flags.inlined).
+
+%% The pending-flags are initialized by `st__new_opnd_loc' below.
+
+st__test_inner_pending(L, S) ->
+ T = S#state.opnd_flags,
+ P = ets:lookup_element(T, L, #opnd_flags.inner_pending),
+ P =< 0.
+
+st__mark_inner_pending(L, S) ->
+ ets:update_counter(S#state.opnd_flags, L,
+ {#opnd_flags.inner_pending, -1}),
+ S.
+
+st__clear_inner_pending(L, S) ->
+ ets:update_counter(S#state.opnd_flags, L,
+ {#opnd_flags.inner_pending, 1}),
+ S.
+
+st__test_outer_pending(L, S) ->
+ T = S#state.opnd_flags,
+ P = ets:lookup_element(T, L, #opnd_flags.outer_pending),
+ P =< 0.
+
+st__mark_outer_pending(L, S) ->
+ ets:update_counter(S#state.opnd_flags, L,
+ {#opnd_flags.outer_pending, -1}),
+ S.
+
+st__clear_outer_pending(L, S) ->
+ ets:update_counter(S#state.opnd_flags, L,
+ {#opnd_flags.outer_pending, 1}),
+ S.
+
+st__new_app_loc(S) ->
+ V = {L, _S1} = st__new_loc(S),
+ ets:insert(S#state.app_flags, #app_flags{lab = L}),
+ V.
+
+st__new_ref_loc(S) ->
+ V = {L, _S1} = st__new_loc(S),
+ ets:insert(S#state.var_flags, #var_flags{lab = L}),
+ V.
+
+st__new_opnd_loc(S) ->
+ V = {L, _S1} = st__new_loc(S),
+ ets:insert(S#state.opnd_flags, #opnd_flags{lab = L}),
+ V.
+
+
+%% =====================================================================
+%% Abstract datatype: counter()
+%%
+%% `counter__add' throws `{counter_exceeded, Type, Data}' if the
+%% resulting counter value would exceed the limit for the counter in
+%% question (`Type' and `Data' are given by the user).
+
+-record(counter, {active, value, limit}).
+
+counter__new_passive(Limit) when Limit > 0 ->
+ {0, Limit}.
+
+counter__new_active(Limit) when Limit > 0 ->
+ {Limit, Limit}.
+
+%% Active counters have values > 0 internally; passive counters start at
+%% zero. The 'limit' field is only accessed by the 'counter__limit'
+%% function.
+
+counter__is_active({C, _}) ->
+ C > 0.
+
+counter__limit({_, L}) ->
+ L.
+
+counter__value({N, L}) ->
+ if N > 0 ->
+ L - N;
+ true ->
+ -N
+ end.
+
+counter__add(N, {V, L}, Type, Data) ->
+ N1 = V - N,
+ if V > 0, N1 =< 0 ->
+ case debug_counters() of
+ true ->
+ case Type of
+ effort ->
+ put(counter_effort_triggers,
+ get(counter_effort_triggers) + 1);
+ size ->
+ put(counter_size_triggers,
+ get(counter_size_triggers) + 1)
+ end;
+ _ ->
+ ok
+ end,
+ throw({counter_exceeded, Type, Data});
+ true ->
+ {N1, L}
+ end.
+
+
+%% =====================================================================
+%% Reporting
+
+% report_internal_error(S) ->
+% report_internal_error(S, []).
+
+report_internal_error(S, Vs) ->
+ report_error("internal error: " ++ S, Vs).
+
+report_error(D) ->
+ report_error(D, []).
+
+report_error({F, L, D}, Vs) ->
+ report({F, L, {error, D}}, Vs);
+report_error(D, Vs) ->
+ report({error, D}, Vs).
+
+report_warning(D) ->
+ report_warning(D, []).
+
+report_warning({F, L, D}, Vs) ->
+ report({F, L, {warning, D}}, Vs);
+report_warning(D, Vs) ->
+ report({warning, D}, Vs).
+
+report(D, Vs) ->
+ io:put_chars(format(D, Vs)).
+
+format({error, D}, Vs) ->
+ ["error: ", format(D, Vs)];
+format({warning, D}, Vs) ->
+ ["warning: ", format(D, Vs)];
+format({"", L, D}, Vs) when integer(L), L > 0 ->
+ [io_lib:fwrite("~w: ", [L]), format(D, Vs)];
+format({"", _L, D}, Vs) ->
+ format(D, Vs);
+format({F, L, D}, Vs) when integer(L), L > 0 ->
+ [io_lib:fwrite("~s:~w: ", [filename(F), L]), format(D, Vs)];
+format({F, _L, D}, Vs) ->
+ [io_lib:fwrite("~s: ", [filename(F)]), format(D, Vs)];
+format(S, Vs) when list(S) ->
+ [io_lib:fwrite(S, Vs), $\n].
+
+
+%% =====================================================================
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/cerl_trees.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/cerl_trees.erl
new file mode 100644
index 0000000000..afe7c8708b
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/cerl_trees.erl
@@ -0,0 +1,801 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Richard Carlsson.
+%% Copyright (C) 1999-2002 Richard Carlsson.
+%% Portions created by Ericsson are Copyright 2001, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: cerl_trees.erl,v 1.2 2010/06/07 06:32:39 kostis Exp $
+
+%% @doc Basic functions on Core Erlang abstract syntax trees.
+%%
+%% <p>Syntax trees are defined in the module <a
+%% href=""><code>cerl</code></a>.</p>
+%%
+%% @type cerl() = cerl:cerl()
+
+-module(cerl_trees).
+
+-export([depth/1, fold/3, free_variables/1, label/1, label/2, map/2,
+ mapfold/3, size/1, variables/1]).
+
+-import(cerl, [alias_pat/1, alias_var/1, ann_c_alias/3, ann_c_apply/3,
+ ann_c_binary/2, ann_c_bitstr/6, ann_c_call/4,
+ ann_c_case/3, ann_c_catch/2, ann_c_clause/4,
+ ann_c_cons_skel/3, ann_c_fun/3, ann_c_let/4,
+ ann_c_letrec/3, ann_c_module/5, ann_c_primop/3,
+ ann_c_receive/4, ann_c_seq/3, ann_c_try/6,
+ ann_c_tuple_skel/2, ann_c_values/2, apply_args/1,
+ apply_op/1, binary_segments/1, bitstr_val/1,
+ bitstr_size/1, bitstr_unit/1, bitstr_type/1,
+ bitstr_flags/1, call_args/1, call_module/1, call_name/1,
+ case_arg/1, case_clauses/1, catch_body/1, clause_body/1,
+ clause_guard/1, clause_pats/1, clause_vars/1, concrete/1,
+ cons_hd/1, cons_tl/1, fun_body/1, fun_vars/1, get_ann/1,
+ let_arg/1, let_body/1, let_vars/1, letrec_body/1,
+ letrec_defs/1, letrec_vars/1, module_attrs/1,
+ module_defs/1, module_exports/1, module_name/1,
+ module_vars/1, primop_args/1, primop_name/1,
+ receive_action/1, receive_clauses/1, receive_timeout/1,
+ seq_arg/1, seq_body/1, set_ann/2, subtrees/1, try_arg/1,
+ try_body/1, try_vars/1, try_evars/1, try_handler/1,
+ tuple_es/1, type/1, update_c_alias/3, update_c_apply/3,
+ update_c_binary/2, update_c_bitstr/6, update_c_call/4,
+ update_c_case/3, update_c_catch/2, update_c_clause/4,
+ update_c_cons/3, update_c_cons_skel/3, update_c_fun/3,
+ update_c_let/4, update_c_letrec/3, update_c_module/5,
+ update_c_primop/3, update_c_receive/4, update_c_seq/3,
+ update_c_try/6, update_c_tuple/2, update_c_tuple_skel/2,
+ update_c_values/2, values_es/1, var_name/1]).
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec depth(Tree::cerl) -> integer()
+%%
+%% @doc Returns the length of the longest path in the tree. A leaf
+%% node has depth zero, the tree representing "<code>{foo,
+%% bar}</code>" has depth one, etc.
+
+depth(T) ->
+ case subtrees(T) of
+ [] ->
+ 0;
+ Gs ->
+ 1 + lists:foldl(fun (G, A) -> erlang:max(depth_1(G), A) end, 0, Gs)
+ end.
+
+depth_1(Ts) ->
+ lists:foldl(fun (T, A) -> erlang:max(depth(T), A) end, 0, Ts).
+
+%% max(X, Y) when X > Y -> X;
+%% max(_, Y) -> Y.
+
+
+%% @spec size(Tree::cerl()) -> integer()
+%%
+%% @doc Returns the number of nodes in <code>Tree</code>.
+
+size(T) ->
+ fold(fun (_, S) -> S + 1 end, 0, T).
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec map(Function, Tree::cerl()) -> cerl()
+%%
+%% Function = (cerl()) -> cerl()
+%%
+%% @doc Maps a function onto the nodes of a tree. This replaces each
+%% node in the tree by the result of applying the given function on
+%% the original node, bottom-up.
+%%
+%% @see mapfold/3
+
+map(F, T) ->
+ F(map_1(F, T)).
+
+map_1(F, T) ->
+ case type(T) of
+ literal ->
+ case concrete(T) of
+ [_ | _] ->
+ update_c_cons(T, map(F, cons_hd(T)),
+ map(F, cons_tl(T)));
+ V when tuple_size(V) > 0 ->
+ update_c_tuple(T, map_list(F, tuple_es(T)));
+ _ ->
+ T
+ end;
+ var ->
+ T;
+ values ->
+ update_c_values(T, map_list(F, values_es(T)));
+ cons ->
+ update_c_cons_skel(T, map(F, cons_hd(T)),
+ map(F, cons_tl(T)));
+ tuple ->
+ update_c_tuple_skel(T, map_list(F, tuple_es(T)));
+ 'let' ->
+ update_c_let(T, map_list(F, let_vars(T)),
+ map(F, let_arg(T)),
+ map(F, let_body(T)));
+ seq ->
+ update_c_seq(T, map(F, seq_arg(T)),
+ map(F, seq_body(T)));
+ apply ->
+ update_c_apply(T, map(F, apply_op(T)),
+ map_list(F, apply_args(T)));
+ call ->
+ update_c_call(T, map(F, call_module(T)),
+ map(F, call_name(T)),
+ map_list(F, call_args(T)));
+ primop ->
+ update_c_primop(T, map(F, primop_name(T)),
+ map_list(F, primop_args(T)));
+ 'case' ->
+ update_c_case(T, map(F, case_arg(T)),
+ map_list(F, case_clauses(T)));
+ clause ->
+ update_c_clause(T, map_list(F, clause_pats(T)),
+ map(F, clause_guard(T)),
+ map(F, clause_body(T)));
+ alias ->
+ update_c_alias(T, map(F, alias_var(T)),
+ map(F, alias_pat(T)));
+ 'fun' ->
+ update_c_fun(T, map_list(F, fun_vars(T)),
+ map(F, fun_body(T)));
+ 'receive' ->
+ update_c_receive(T, map_list(F, receive_clauses(T)),
+ map(F, receive_timeout(T)),
+ map(F, receive_action(T)));
+ 'try' ->
+ update_c_try(T, map(F, try_arg(T)),
+ map_list(F, try_vars(T)),
+ map(F, try_body(T)),
+ map_list(F, try_evars(T)),
+ map(F, try_handler(T)));
+ 'catch' ->
+ update_c_catch(T, map(F, catch_body(T)));
+ binary ->
+ update_c_binary(T, map_list(F, binary_segments(T)));
+ bitstr ->
+ update_c_bitstr(T, map(F, bitstr_val(T)),
+ map(F, bitstr_size(T)),
+ map(F, bitstr_unit(T)),
+ map(F, bitstr_type(T)),
+ map(F, bitstr_flags(T)));
+ letrec ->
+ update_c_letrec(T, map_pairs(F, letrec_defs(T)),
+ map(F, letrec_body(T)));
+ module ->
+ update_c_module(T, map(F, module_name(T)),
+ map_list(F, module_exports(T)),
+ map_pairs(F, module_attrs(T)),
+ map_pairs(F, module_defs(T)))
+ end.
+
+map_list(F, [T | Ts]) ->
+ [map(F, T) | map_list(F, Ts)];
+map_list(_, []) ->
+ [].
+
+map_pairs(F, [{T1, T2} | Ps]) ->
+ [{map(F, T1), map(F, T2)} | map_pairs(F, Ps)];
+map_pairs(_, []) ->
+ [].
+
+
+%% @spec fold(Function, Unit::term(), Tree::cerl()) -> term()
+%%
+%% Function = (cerl(), term()) -> term()
+%%
+%% @doc Does a fold operation over the nodes of the tree. The result
+%% is the value of <code>Function(X1, Function(X2, ... Function(Xn,
+%% Unit) ... ))</code>, where <code>X1, ..., Xn</code> are the nodes
+%% of <code>Tree</code> in a post-order traversal.
+%%
+%% @see mapfold/3
+
+fold(F, S, T) ->
+ F(T, fold_1(F, S, T)).
+
+fold_1(F, S, T) ->
+ case type(T) of
+ literal ->
+ case concrete(T) of
+ [_ | _] ->
+ fold(F, fold(F, S, cons_hd(T)), cons_tl(T));
+ V when tuple_size(V) > 0 ->
+ fold_list(F, S, tuple_es(T));
+ _ ->
+ S
+ end;
+ var ->
+ S;
+ values ->
+ fold_list(F, S, values_es(T));
+ cons ->
+ fold(F, fold(F, S, cons_hd(T)), cons_tl(T));
+ tuple ->
+ fold_list(F, S, tuple_es(T));
+ 'let' ->
+ fold(F, fold(F, fold_list(F, S, let_vars(T)),
+ let_arg(T)),
+ let_body(T));
+ seq ->
+ fold(F, fold(F, S, seq_arg(T)), seq_body(T));
+ apply ->
+ fold_list(F, fold(F, S, apply_op(T)), apply_args(T));
+ call ->
+ fold_list(F, fold(F, fold(F, S, call_module(T)),
+ call_name(T)),
+ call_args(T));
+ primop ->
+ fold_list(F, fold(F, S, primop_name(T)), primop_args(T));
+ 'case' ->
+ fold_list(F, fold(F, S, case_arg(T)), case_clauses(T));
+ clause ->
+ fold(F, fold(F, fold_list(F, S, clause_pats(T)),
+ clause_guard(T)),
+ clause_body(T));
+ alias ->
+ fold(F, fold(F, S, alias_var(T)), alias_pat(T));
+ 'fun' ->
+ fold(F, fold_list(F, S, fun_vars(T)), fun_body(T));
+ 'receive' ->
+ fold(F, fold(F, fold_list(F, S, receive_clauses(T)),
+ receive_timeout(T)),
+ receive_action(T));
+ 'try' ->
+ fold(F, fold_list(F, fold(F, fold_list(F, fold(F, S, try_arg(T)),
+ try_vars(T)),
+ try_body(T)),
+ try_evars(T)),
+ try_handler(T));
+ 'catch' ->
+ fold(F, S, catch_body(T));
+ binary ->
+ fold_list(F, S, binary_segments(T));
+ bitstr ->
+ fold(F,
+ fold(F,
+ fold(F,
+ fold(F,
+ fold(F, S, bitstr_val(T)),
+ bitstr_size(T)),
+ bitstr_unit(T)),
+ bitstr_type(T)),
+ bitstr_flags(T));
+ letrec ->
+ fold(F, fold_pairs(F, S, letrec_defs(T)), letrec_body(T));
+ module ->
+ fold_pairs(F,
+ fold_pairs(F,
+ fold_list(F,
+ fold(F, S, module_name(T)),
+ module_exports(T)),
+ module_attrs(T)),
+ module_defs(T))
+ end.
+
+fold_list(F, S, [T | Ts]) ->
+ fold_list(F, fold(F, S, T), Ts);
+fold_list(_, S, []) ->
+ S.
+
+fold_pairs(F, S, [{T1, T2} | Ps]) ->
+ fold_pairs(F, fold(F, fold(F, S, T1), T2), Ps);
+fold_pairs(_, S, []) ->
+ S.
+
+
+%% @spec mapfold(Function, Initial::term(), Tree::cerl()) ->
+%% {cerl(), term()}
+%%
+%% Function = (cerl(), term()) -> {cerl(), term()}
+%%
+%% @doc Does a combined map/fold operation on the nodes of the
+%% tree. This is similar to <code>map/2</code>, but also propagates a
+%% value from each application of <code>Function</code> to the next,
+%% starting with the given value <code>Initial</code>, while doing a
+%% post-order traversal of the tree, much like <code>fold/3</code>.
+%%
+%% @see map/2
+%% @see fold/3
+
+mapfold(F, S0, T) ->
+ case type(T) of
+ literal ->
+ case concrete(T) of
+ [_ | _] ->
+ {T1, S1} = mapfold(F, S0, cons_hd(T)),
+ {T2, S2} = mapfold(F, S1, cons_tl(T)),
+ F(update_c_cons(T, T1, T2), S2);
+ V when tuple_size(V) > 0 ->
+ {Ts, S1} = mapfold_list(F, S0, tuple_es(T)),
+ F(update_c_tuple(T, Ts), S1);
+ _ ->
+ F(T, S0)
+ end;
+ var ->
+ F(T, S0);
+ values ->
+ {Ts, S1} = mapfold_list(F, S0, values_es(T)),
+ F(update_c_values(T, Ts), S1);
+ cons ->
+ {T1, S1} = mapfold(F, S0, cons_hd(T)),
+ {T2, S2} = mapfold(F, S1, cons_tl(T)),
+ F(update_c_cons_skel(T, T1, T2), S2);
+ tuple ->
+ {Ts, S1} = mapfold_list(F, S0, tuple_es(T)),
+ F(update_c_tuple_skel(T, Ts), S1);
+ 'let' ->
+ {Vs, S1} = mapfold_list(F, S0, let_vars(T)),
+ {A, S2} = mapfold(F, S1, let_arg(T)),
+ {B, S3} = mapfold(F, S2, let_body(T)),
+ F(update_c_let(T, Vs, A, B), S3);
+ seq ->
+ {A, S1} = mapfold(F, S0, seq_arg(T)),
+ {B, S2} = mapfold(F, S1, seq_body(T)),
+ F(update_c_seq(T, A, B), S2);
+ apply ->
+ {E, S1} = mapfold(F, S0, apply_op(T)),
+ {As, S2} = mapfold_list(F, S1, apply_args(T)),
+ F(update_c_apply(T, E, As), S2);
+ call ->
+ {M, S1} = mapfold(F, S0, call_module(T)),
+ {N, S2} = mapfold(F, S1, call_name(T)),
+ {As, S3} = mapfold_list(F, S2, call_args(T)),
+ F(update_c_call(T, M, N, As), S3);
+ primop ->
+ {N, S1} = mapfold(F, S0, primop_name(T)),
+ {As, S2} = mapfold_list(F, S1, primop_args(T)),
+ F(update_c_primop(T, N, As), S2);
+ 'case' ->
+ {A, S1} = mapfold(F, S0, case_arg(T)),
+ {Cs, S2} = mapfold_list(F, S1, case_clauses(T)),
+ F(update_c_case(T, A, Cs), S2);
+ clause ->
+ {Ps, S1} = mapfold_list(F, S0, clause_pats(T)),
+ {G, S2} = mapfold(F, S1, clause_guard(T)),
+ {B, S3} = mapfold(F, S2, clause_body(T)),
+ F(update_c_clause(T, Ps, G, B), S3);
+ alias ->
+ {V, S1} = mapfold(F, S0, alias_var(T)),
+ {P, S2} = mapfold(F, S1, alias_pat(T)),
+ F(update_c_alias(T, V, P), S2);
+ 'fun' ->
+ {Vs, S1} = mapfold_list(F, S0, fun_vars(T)),
+ {B, S2} = mapfold(F, S1, fun_body(T)),
+ F(update_c_fun(T, Vs, B), S2);
+ 'receive' ->
+ {Cs, S1} = mapfold_list(F, S0, receive_clauses(T)),
+ {E, S2} = mapfold(F, S1, receive_timeout(T)),
+ {A, S3} = mapfold(F, S2, receive_action(T)),
+ F(update_c_receive(T, Cs, E, A), S3);
+ 'try' ->
+ {E, S1} = mapfold(F, S0, try_arg(T)),
+ {Vs, S2} = mapfold_list(F, S1, try_vars(T)),
+ {B, S3} = mapfold(F, S2, try_body(T)),
+ {Evs, S4} = mapfold_list(F, S3, try_evars(T)),
+ {H, S5} = mapfold(F, S4, try_handler(T)),
+ F(update_c_try(T, E, Vs, B, Evs, H), S5);
+ 'catch' ->
+ {B, S1} = mapfold(F, S0, catch_body(T)),
+ F(update_c_catch(T, B), S1);
+ binary ->
+ {Ds, S1} = mapfold_list(F, S0, binary_segments(T)),
+ F(update_c_binary(T, Ds), S1);
+ bitstr ->
+ {Val, S1} = mapfold(F, S0, bitstr_val(T)),
+ {Size, S2} = mapfold(F, S1, bitstr_size(T)),
+ {Unit, S3} = mapfold(F, S2, bitstr_unit(T)),
+ {Type, S4} = mapfold(F, S3, bitstr_type(T)),
+ {Flags, S5} = mapfold(F, S4, bitstr_flags(T)),
+ F(update_c_bitstr(T, Val, Size, Unit, Type, Flags), S5);
+ letrec ->
+ {Ds, S1} = mapfold_pairs(F, S0, letrec_defs(T)),
+ {B, S2} = mapfold(F, S1, letrec_body(T)),
+ F(update_c_letrec(T, Ds, B), S2);
+ module ->
+ {N, S1} = mapfold(F, S0, module_name(T)),
+ {Es, S2} = mapfold_list(F, S1, module_exports(T)),
+ {As, S3} = mapfold_pairs(F, S2, module_attrs(T)),
+ {Ds, S4} = mapfold_pairs(F, S3, module_defs(T)),
+ F(update_c_module(T, N, Es, As, Ds), S4)
+ end.
+
+mapfold_list(F, S0, [T | Ts]) ->
+ {T1, S1} = mapfold(F, S0, T),
+ {Ts1, S2} = mapfold_list(F, S1, Ts),
+ {[T1 | Ts1], S2};
+mapfold_list(_, S, []) ->
+ {[], S}.
+
+mapfold_pairs(F, S0, [{T1, T2} | Ps]) ->
+ {T3, S1} = mapfold(F, S0, T1),
+ {T4, S2} = mapfold(F, S1, T2),
+ {Ps1, S3} = mapfold_pairs(F, S2, Ps),
+ {[{T3, T4} | Ps1], S3};
+mapfold_pairs(_, S, []) ->
+ {[], S}.
+
+
+%% ---------------------------------------------------------------------
+
+%% @spec variables(Tree::cerl()) -> [var_name()]
+%%
+%% var_name() = integer() | atom() | {atom(), integer()}
+%%
+%% @doc Returns an ordered-set list of the names of all variables in
+%% the syntax tree. (This includes function name variables.) An
+%% exception is thrown if <code>Tree</code> does not represent a
+%% well-formed Core Erlang syntax tree.
+%%
+%% @see free_variables/1
+
+variables(T) ->
+ variables(T, false).
+
+
+%% @spec free_variables(Tree::cerl()) -> [var_name()]
+%%
+%% @doc Like <code>variables/1</code>, but only includes variables
+%% that are free in the tree.
+%%
+%% @see variables/1
+
+free_variables(T) ->
+ variables(T, true).
+
+
+%% This is not exported
+
+variables(T, S) ->
+ case type(T) of
+ literal ->
+ [];
+ var ->
+ [var_name(T)];
+ values ->
+ vars_in_list(values_es(T), S);
+ cons ->
+ ordsets:union(variables(cons_hd(T), S),
+ variables(cons_tl(T), S));
+ tuple ->
+ vars_in_list(tuple_es(T), S);
+ 'let' ->
+ Vs = variables(let_body(T), S),
+ Vs1 = var_list_names(let_vars(T)),
+ Vs2 = case S of
+ true ->
+ ordsets:subtract(Vs, Vs1);
+ false ->
+ ordsets:union(Vs, Vs1)
+ end,
+ ordsets:union(variables(let_arg(T), S), Vs2);
+ seq ->
+ ordsets:union(variables(seq_arg(T), S),
+ variables(seq_body(T), S));
+ apply ->
+ ordsets:union(
+ variables(apply_op(T), S),
+ vars_in_list(apply_args(T), S));
+ call ->
+ ordsets:union(variables(call_module(T), S),
+ ordsets:union(
+ variables(call_name(T), S),
+ vars_in_list(call_args(T), S)));
+ primop ->
+ vars_in_list(primop_args(T), S);
+ 'case' ->
+ ordsets:union(variables(case_arg(T), S),
+ vars_in_list(case_clauses(T), S));
+ clause ->
+ Vs = ordsets:union(variables(clause_guard(T), S),
+ variables(clause_body(T), S)),
+ Vs1 = vars_in_list(clause_pats(T), S),
+ case S of
+ true ->
+ ordsets:subtract(Vs, Vs1);
+ false ->
+ ordsets:union(Vs, Vs1)
+ end;
+ alias ->
+ ordsets:add_element(var_name(alias_var(T)),
+ variables(alias_pat(T)));
+ 'fun' ->
+ Vs = variables(fun_body(T), S),
+ Vs1 = var_list_names(fun_vars(T)),
+ case S of
+ true ->
+ ordsets:subtract(Vs, Vs1);
+ false ->
+ ordsets:union(Vs, Vs1)
+ end;
+ 'receive' ->
+ ordsets:union(
+ vars_in_list(receive_clauses(T), S),
+ ordsets:union(variables(receive_timeout(T), S),
+ variables(receive_action(T), S)));
+ 'try' ->
+ Vs = variables(try_body(T), S),
+ Vs1 = var_list_names(try_vars(T)),
+ Vs2 = case S of
+ true ->
+ ordsets:subtract(Vs, Vs1);
+ false ->
+ ordsets:union(Vs, Vs1)
+ end,
+ Vs3 = variables(try_handler(T), S),
+ Vs4 = var_list_names(try_evars(T)),
+ Vs5 = case S of
+ true ->
+ ordsets:subtract(Vs3, Vs4);
+ false ->
+ ordsets:union(Vs3, Vs4)
+ end,
+ ordsets:union(variables(try_arg(T), S),
+ ordsets:union(Vs2, Vs5));
+ 'catch' ->
+ variables(catch_body(T), S);
+ binary ->
+ vars_in_list(binary_segments(T), S);
+ bitstr ->
+ ordsets:union(variables(bitstr_val(T), S),
+ variables(bitstr_size(T), S));
+ letrec ->
+ Vs = vars_in_defs(letrec_defs(T), S),
+ Vs1 = ordsets:union(variables(letrec_body(T), S), Vs),
+ Vs2 = var_list_names(letrec_vars(T)),
+ case S of
+ true ->
+ ordsets:subtract(Vs1, Vs2);
+ false ->
+ ordsets:union(Vs1, Vs2)
+ end;
+ module ->
+ Vs = vars_in_defs(module_defs(T), S),
+ Vs1 = ordsets:union(vars_in_list(module_exports(T), S), Vs),
+ Vs2 = var_list_names(module_vars(T)),
+ case S of
+ true ->
+ ordsets:subtract(Vs1, Vs2);
+ false ->
+ ordsets:union(Vs1, Vs2)
+ end
+ end.
+
+vars_in_list(Ts, S) ->
+ vars_in_list(Ts, S, []).
+
+vars_in_list([T | Ts], S, A) ->
+ vars_in_list(Ts, S, ordsets:union(variables(T, S), A));
+vars_in_list([], _, A) ->
+ A.
+
+%% Note that this function only visits the right-hand side of function
+%% definitions.
+
+vars_in_defs(Ds, S) ->
+ vars_in_defs(Ds, S, []).
+
+vars_in_defs([{_, F} | Ds], S, A) ->
+ vars_in_defs(Ds, S, ordsets:union(variables(F, S), A));
+vars_in_defs([], _, A) ->
+ A.
+
+%% This amounts to insertion sort. Since the lists are generally short,
+%% it is hardly worthwhile to use an asymptotically better sort.
+
+var_list_names(Vs) ->
+ var_list_names(Vs, []).
+
+var_list_names([V | Vs], A) ->
+ var_list_names(Vs, ordsets:add_element(var_name(V), A));
+var_list_names([], A) ->
+ A.
+
+
+%% ---------------------------------------------------------------------
+
+%% label(Tree::cerl()) -> {cerl(), integer()}
+%%
+%% @equiv label(Tree, 0)
+
+label(T) ->
+ label(T, 0).
+
+%% @spec label(Tree::cerl(), N::integer()) -> {cerl(), integer()}
+%%
+%% @doc Labels each expression in the tree. A term <code>{label,
+%% L}</code> is prefixed to the annotation list of each expression node,
+%% where L is a unique number for every node, except for variables (and
+%% function name variables) which get the same label if they represent
+%% the same variable. Constant literal nodes are not labeled.
+%%
+%% <p>The returned value is a tuple <code>{NewTree, Max}</code>, where
+%% <code>NewTree</code> is the labeled tree and <code>Max</code> is 1
+%% plus the largest label value used. All previous annotation terms on
+%% the form <code>{label, X}</code> are deleted.</p>
+%%
+%% <p>The values of L used in the tree is a dense range from
+%% <code>N</code> to <code>Max - 1</code>, where <code>N =&lt; Max
+%% =&lt; N + size(Tree)</code>. Note that it is possible that no
+%% labels are used at all, i.e., <code>N = Max</code>.</p>
+%%
+%% <p>Note: All instances of free variables will be given distinct
+%% labels.</p>
+%%
+%% @see label/1
+%% @see size/1
+
+label(T, N) ->
+ label(T, N, dict:new()).
+
+label(T, N, Env) ->
+ case type(T) of
+ literal ->
+ %% Constant literals are not labeled.
+ {T, N};
+ var ->
+ case dict:find(var_name(T), Env) of
+ {ok, L} ->
+ {As, _} = label_ann(T, L),
+ N1 = N;
+ error ->
+ {As, N1} = label_ann(T, N)
+ end,
+ {set_ann(T, As), N1};
+ values ->
+ {Ts, N1} = label_list(values_es(T), N, Env),
+ {As, N2} = label_ann(T, N1),
+ {ann_c_values(As, Ts), N2};
+ cons ->
+ {T1, N1} = label(cons_hd(T), N, Env),
+ {T2, N2} = label(cons_tl(T), N1, Env),
+ {As, N3} = label_ann(T, N2),
+ {ann_c_cons_skel(As, T1, T2), N3};
+ tuple ->
+ {Ts, N1} = label_list(tuple_es(T), N, Env),
+ {As, N2} = label_ann(T, N1),
+ {ann_c_tuple_skel(As, Ts), N2};
+ 'let' ->
+ {A, N1} = label(let_arg(T), N, Env),
+ {Vs, N2, Env1} = label_vars(let_vars(T), N1, Env),
+ {B, N3} = label(let_body(T), N2, Env1),
+ {As, N4} = label_ann(T, N3),
+ {ann_c_let(As, Vs, A, B), N4};
+ seq ->
+ {A, N1} = label(seq_arg(T), N, Env),
+ {B, N2} = label(seq_body(T), N1, Env),
+ {As, N3} = label_ann(T, N2),
+ {ann_c_seq(As, A, B), N3};
+ apply ->
+ {E, N1} = label(apply_op(T), N, Env),
+ {Es, N2} = label_list(apply_args(T), N1, Env),
+ {As, N3} = label_ann(T, N2),
+ {ann_c_apply(As, E, Es), N3};
+ call ->
+ {M, N1} = label(call_module(T), N, Env),
+ {F, N2} = label(call_name(T), N1, Env),
+ {Es, N3} = label_list(call_args(T), N2, Env),
+ {As, N4} = label_ann(T, N3),
+ {ann_c_call(As, M, F, Es), N4};
+ primop ->
+ {F, N1} = label(primop_name(T), N, Env),
+ {Es, N2} = label_list(primop_args(T), N1, Env),
+ {As, N3} = label_ann(T, N2),
+ {ann_c_primop(As, F, Es), N3};
+ 'case' ->
+ {A, N1} = label(case_arg(T), N, Env),
+ {Cs, N2} = label_list(case_clauses(T), N1, Env),
+ {As, N3} = label_ann(T, N2),
+ {ann_c_case(As, A, Cs), N3};
+ clause ->
+ {_, N1, Env1} = label_vars(clause_vars(T), N, Env),
+ {Ps, N2} = label_list(clause_pats(T), N1, Env1),
+ {G, N3} = label(clause_guard(T), N2, Env1),
+ {B, N4} = label(clause_body(T), N3, Env1),
+ {As, N5} = label_ann(T, N4),
+ {ann_c_clause(As, Ps, G, B), N5};
+ alias ->
+ {V, N1} = label(alias_var(T), N, Env),
+ {P, N2} = label(alias_pat(T), N1, Env),
+ {As, N3} = label_ann(T, N2),
+ {ann_c_alias(As, V, P), N3};
+ 'fun' ->
+ {Vs, N1, Env1} = label_vars(fun_vars(T), N, Env),
+ {B, N2} = label(fun_body(T), N1, Env1),
+ {As, N3} = label_ann(T, N2),
+ {ann_c_fun(As, Vs, B), N3};
+ 'receive' ->
+ {Cs, N1} = label_list(receive_clauses(T), N, Env),
+ {E, N2} = label(receive_timeout(T), N1, Env),
+ {A, N3} = label(receive_action(T), N2, Env),
+ {As, N4} = label_ann(T, N3),
+ {ann_c_receive(As, Cs, E, A), N4};
+ 'try' ->
+ {E, N1} = label(try_arg(T), N, Env),
+ {Vs, N2, Env1} = label_vars(try_vars(T), N1, Env),
+ {B, N3} = label(try_body(T), N2, Env1),
+ {Evs, N4, Env2} = label_vars(try_evars(T), N3, Env),
+ {H, N5} = label(try_handler(T), N4, Env2),
+ {As, N6} = label_ann(T, N5),
+ {ann_c_try(As, E, Vs, B, Evs, H), N6};
+ 'catch' ->
+ {B, N1} = label(catch_body(T), N, Env),
+ {As, N2} = label_ann(T, N1),
+ {ann_c_catch(As, B), N2};
+ binary ->
+ {Ds, N1} = label_list(binary_segments(T), N, Env),
+ {As, N2} = label_ann(T, N1),
+ {ann_c_binary(As, Ds), N2};
+ bitstr ->
+ {Val, N1} = label(bitstr_val(T), N, Env),
+ {Size, N2} = label(bitstr_size(T), N1, Env),
+ {Unit, N3} = label(bitstr_unit(T), N2, Env),
+ {Type, N4} = label(bitstr_type(T), N3, Env),
+ {Flags, N5} = label(bitstr_flags(T), N4, Env),
+ {As, N6} = label_ann(T, N5),
+ {ann_c_bitstr(As, Val, Size, Unit, Type, Flags), N6};
+ letrec ->
+ {_, N1, Env1} = label_vars(letrec_vars(T), N, Env),
+ {Ds, N2} = label_defs(letrec_defs(T), N1, Env1),
+ {B, N3} = label(letrec_body(T), N2, Env1),
+ {As, N4} = label_ann(T, N3),
+ {ann_c_letrec(As, Ds, B), N4};
+ module ->
+ %% The module name is not labeled.
+ {_, N1, Env1} = label_vars(module_vars(T), N, Env),
+ {Ts, N2} = label_defs(module_attrs(T), N1, Env1),
+ {Ds, N3} = label_defs(module_defs(T), N2, Env1),
+ {Es, N4} = label_list(module_exports(T), N3, Env1),
+ {As, N5} = label_ann(T, N4),
+ {ann_c_module(As, module_name(T), Es, Ts, Ds), N5}
+ end.
+
+label_list([T | Ts], N, Env) ->
+ {T1, N1} = label(T, N, Env),
+ {Ts1, N2} = label_list(Ts, N1, Env),
+ {[T1 | Ts1], N2};
+label_list([], N, _Env) ->
+ {[], N}.
+
+label_vars([T | Ts], N, Env) ->
+ Env1 = dict:store(var_name(T), N, Env),
+ {As, N1} = label_ann(T, N),
+ T1 = set_ann(T, As),
+ {Ts1, N2, Env2} = label_vars(Ts, N1, Env1),
+ {[T1 | Ts1], N2, Env2};
+label_vars([], N, Env) ->
+ {[], N, Env}.
+
+label_defs([{F, T} | Ds], N, Env) ->
+ {F1, N1} = label(F, N, Env),
+ {T1, N2} = label(T, N1, Env),
+ {Ds1, N3} = label_defs(Ds, N2, Env),
+ {[{F1, T1} | Ds1], N3};
+label_defs([], N, _Env) ->
+ {[], N}.
+
+label_ann(T, N) ->
+ {[{label, N} | filter_labels(get_ann(T))], N + 1}.
+
+filter_labels([{label, _} | As]) ->
+ filter_labels(As);
+filter_labels([A | As]) ->
+ [A | filter_labels(As)];
+filter_labels([]) ->
+ [].
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/compile.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/compile.erl
new file mode 100644
index 0000000000..2b6d14e300
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/compile.erl
@@ -0,0 +1,1109 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: compile.erl,v 1.1 2008/12/17 09:53:42 mikpe Exp $
+%%
+%% Purpose: Run the Erlang compiler.
+
+-module(compile).
+-include("erl_compile.hrl").
+-include("core_parse.hrl").
+
+%% High-level interface.
+-export([file/1,file/2,format_error/1,iofile/1]).
+-export([forms/1,forms/2]).
+-export([output_generated/1]).
+-export([options/0]).
+
+%% Erlc interface.
+-export([compile/3,compile_beam/3,compile_asm/3,compile_core/3]).
+
+
+-import(lists, [member/2,reverse/1,keysearch/3,last/1,
+ map/2,flatmap/2,foreach/2,foldr/3,any/2,filter/2]).
+
+%% file(FileName)
+%% file(FileName, Options)
+%% Compile the module in file FileName.
+
+-define(DEFAULT_OPTIONS, [verbose,report_errors,report_warnings]).
+
+-define(pass(P), {P,fun P/1}).
+
+file(File) -> file(File, ?DEFAULT_OPTIONS).
+
+file(File, Opts) when list(Opts) ->
+ do_compile({file,File}, Opts++env_default_opts());
+file(File, Opt) ->
+ file(File, [Opt|?DEFAULT_OPTIONS]).
+
+forms(File) -> forms(File, ?DEFAULT_OPTIONS).
+
+forms(Forms, Opts) when list(Opts) ->
+ do_compile({forms,Forms}, [binary|Opts++env_default_opts()]);
+forms(Forms, Opts) when atom(Opts) ->
+ forms(Forms, [Opts|?DEFAULT_OPTIONS]).
+
+env_default_opts() ->
+ Key = "ERL_COMPILER_OPTIONS",
+ case os:getenv(Key) of
+ false -> [];
+ Str when list(Str) ->
+ case erl_scan:string(Str) of
+ {ok,Tokens,_} ->
+ case erl_parse:parse_term(Tokens ++ [{dot, 1}]) of
+ {ok,List} when list(List) -> List;
+ {ok,Term} -> [Term];
+ {error,_Reason} ->
+ io:format("Ignoring bad term in ~s\n", [Key]),
+ []
+ end;
+ {error, {_,_,_Reason}, _} ->
+ io:format("Ignoring bad term in ~s\n", [Key]),
+ []
+ end
+ end.
+
+do_compile(Input, Opts0) ->
+ Opts = expand_opts(Opts0),
+ Self = self(),
+ Serv = spawn_link(fun() -> internal(Self, Input, Opts) end),
+ receive
+ {Serv,Rep} -> Rep
+ end.
+
+%% Given a list of compilation options, returns true if compile:file/2
+%% would have generated a Beam file, false otherwise (if only a binary or a
+%% listing file would have been generated).
+
+output_generated(Opts) ->
+ any(fun ({save_binary,_F}) -> true;
+ (_Other) -> false
+ end, passes(file, expand_opts(Opts))).
+
+expand_opts(Opts) ->
+ foldr(fun expand_opt/2, [], Opts).
+
+expand_opt(basic_validation, Os) ->
+ [no_code_generation,to_pp,binary|Os];
+expand_opt(strong_validation, Os) ->
+ [no_code_generation,to_kernel,binary|Os];
+expand_opt(report, Os) ->
+ [report_errors,report_warnings|Os];
+expand_opt(return, Os) ->
+ [return_errors,return_warnings|Os];
+expand_opt(r7, Os) ->
+ [no_float_opt,no_new_funs,no_new_binaries,no_new_apply|Os];
+expand_opt(O, Os) -> [O|Os].
+
+filter_opts(Opts0) ->
+ %% Native code generation is not supported if no_new_funs is given.
+ case member(no_new_funs, Opts0) of
+ false -> Opts0;
+ true -> Opts0 -- [native]
+ end.
+
+%% format_error(ErrorDescriptor) -> string()
+
+format_error(no_native_support) ->
+ "this system is not configured for native-code compilation.";
+format_error({native, E}) ->
+ io_lib:fwrite("native-code compilation failed with reason: ~P.",
+ [E, 25]);
+format_error({native_crash, E}) ->
+ io_lib:fwrite("native-code compilation crashed with reason: ~P.",
+ [E, 25]);
+format_error({open,E}) ->
+ io_lib:format("open error '~s'", [file:format_error(E)]);
+format_error({epp,E}) ->
+ epp:format_error(E);
+format_error(write_error) ->
+ "error writing file";
+format_error({rename,S}) ->
+ io_lib:format("error renaming ~s", [S]);
+format_error({parse_transform,M,R}) ->
+ io_lib:format("error in parse transform '~s': ~p", [M, R]);
+format_error({core_transform,M,R}) ->
+ io_lib:format("error in core transform '~s': ~p", [M, R]);
+format_error({crash,Pass,Reason}) ->
+ io_lib:format("internal error in ~p;\ncrash reason: ~p", [Pass,Reason]);
+format_error({bad_return,Pass,Reason}) ->
+ io_lib:format("internal error in ~p;\nbad return value: ~p", [Pass,Reason]).
+
+%% The compile state record.
+-record(compile, {filename="",
+ dir="",
+ base="",
+ ifile="",
+ ofile="",
+ module=[],
+ code=[],
+ core_code=[],
+ abstract_code=[], %Abstract code for debugger.
+ options=[],
+ errors=[],
+ warnings=[]}).
+
+internal(Master, Input, Opts) ->
+ Master ! {self(),
+ case catch internal(Input, Opts) of
+ {'EXIT', Reason} ->
+ {error, Reason};
+ Other ->
+ Other
+ end}.
+
+internal({forms,Forms}, Opts) ->
+ Ps = passes(forms, Opts),
+ internal_comp(Ps, "", "", #compile{code=Forms,options=Opts});
+internal({file,File}, Opts) ->
+ Ps = passes(file, Opts),
+ Compile = #compile{options=Opts},
+ case member(from_core, Opts) of
+ true -> internal_comp(Ps, File, ".core", Compile);
+ false ->
+ case member(from_beam, Opts) of
+ true ->
+ internal_comp(Ps, File, ".beam", Compile);
+ false ->
+ case member(from_asm, Opts) orelse member(asm, Opts) of
+ true ->
+ internal_comp(Ps, File, ".S", Compile);
+ false ->
+ internal_comp(Ps, File, ".erl", Compile)
+ end
+ end
+ end.
+
+internal_comp(Passes, File, Suffix, St0) ->
+ Dir = filename:dirname(File),
+ Base = filename:basename(File, Suffix),
+ St1 = St0#compile{filename=File, dir=Dir, base=Base,
+ ifile=erlfile(Dir, Base, Suffix),
+ ofile=objfile(Base, St0)},
+ Run = case member(time, St1#compile.options) of
+ true ->
+ io:format("Compiling ~p\n", [File]),
+ fun run_tc/2;
+ false -> fun({_Name,Fun}, St) -> catch Fun(St) end
+ end,
+ case fold_comp(Passes, Run, St1) of
+ {ok,St2} -> comp_ret_ok(St2);
+ {error,St2} -> comp_ret_err(St2)
+ end.
+
+fold_comp([{Name,Test,Pass}|Ps], Run, St) ->
+ case Test(St) of
+ false -> %Pass is not needed.
+ fold_comp(Ps, Run, St);
+ true -> %Run pass in the usual way.
+ fold_comp([{Name,Pass}|Ps], Run, St)
+ end;
+fold_comp([{Name,Pass}|Ps], Run, St0) ->
+ case Run({Name,Pass}, St0) of
+ {ok,St1} -> fold_comp(Ps, Run, St1);
+ {error,St1} -> {error,St1};
+ {'EXIT',Reason} ->
+ Es = [{St0#compile.ifile,[{none,?MODULE,{crash,Name,Reason}}]}],
+ {error,St0#compile{errors=St0#compile.errors ++ Es}};
+ Other ->
+ Es = [{St0#compile.ifile,[{none,?MODULE,{bad_return,Name,Other}}]}],
+ {error,St0#compile{errors=St0#compile.errors ++ Es}}
+ end;
+fold_comp([], _Run, St) -> {ok,St}.
+
+os_process_size() ->
+ case os:type() of
+ {unix, sunos} ->
+ Size = os:cmd("ps -o vsz -p " ++ os:getpid() ++ " | tail -1"),
+ list_to_integer(lib:nonl(Size));
+ _ ->
+ 0
+ end.
+
+run_tc({Name,Fun}, St) ->
+ Before0 = statistics(runtime),
+ Val = (catch Fun(St)),
+ After0 = statistics(runtime),
+ {Before_c, _} = Before0,
+ {After_c, _} = After0,
+ io:format(" ~-30s: ~10.3f s (~w k)\n",
+ [Name, (After_c-Before_c) / 1000, os_process_size()]),
+ Val.
+
+comp_ret_ok(#compile{code=Code,warnings=Warn,module=Mod,options=Opts}=St) ->
+ report_warnings(St),
+ Ret1 = case member(binary, Opts) andalso not member(no_code_generation, Opts) of
+ true -> [Code];
+ false -> []
+ end,
+ Ret2 = case member(return_warnings, Opts) of
+ true -> Ret1 ++ [Warn];
+ false -> Ret1
+ end,
+ list_to_tuple([ok,Mod|Ret2]).
+
+comp_ret_err(St) ->
+ report_errors(St),
+ report_warnings(St),
+ case member(return_errors, St#compile.options) of
+ true -> {error,St#compile.errors,St#compile.warnings};
+ false -> error
+ end.
+
+%% passes(form|file, [Option]) -> [{Name,PassFun}]
+%% Figure out which passes that need to be run.
+
+passes(forms, Opts) ->
+ select_passes(standard_passes(), Opts);
+passes(file, Opts) ->
+ case member(from_beam, Opts) of
+ true ->
+ Ps = [?pass(read_beam_file)|binary_passes()],
+ select_passes(Ps, Opts);
+ false ->
+ Ps = case member(from_asm, Opts) orelse member(asm, Opts) of
+ true ->
+ [?pass(beam_consult_asm)|asm_passes()];
+ false ->
+ case member(from_core, Opts) of
+ true ->
+ [?pass(parse_core)|core_passes()];
+ false ->
+ [?pass(parse_module)|standard_passes()]
+ end
+ end,
+ Fs = select_passes(Ps, Opts),
+
+ %% If the last pass saves the resulting binary to a file,
+ %% insert a first pass to remove the file.
+ case last(Fs) of
+ {save_binary,_Fun} -> [?pass(remove_file)|Fs];
+ _Other -> Fs
+ end
+ end.
+
+%% select_passes([Command], Opts) -> [{Name,Function}]
+%% Interpret the lists of commands to return a pure list of passes.
+%%
+%% Command can be one of:
+%%
+%% {pass,Mod} Will be expanded to a call to the external
+%% function Mod:module(Code, Options). This
+%% function must transform the code and return
+%% {ok,NewCode} or {error,Term}.
+%% Example: {pass,beam_codegen}
+%%
+%% {Name,Fun} Name is an atom giving the name of the pass.
+%% Fun is an 'fun' taking one argument: a compile record.
+%% The fun should return {ok,NewCompileRecord} or
+%% {error,NewCompileRecord}.
+%% Note: ?pass(Name) is equvivalent to {Name,fun Name/1}.
+%% Example: ?pass(parse_module)
+%%
+%% {Name,Test,Fun} Like {Name,Fun} above, but the pass will be run
+%% (and listed by the `time' option) only if Test(St)
+%% returns true.
+%%
+%% {src_listing,Ext} Produces an Erlang source listing with the
+%% the file extension Ext. (Ext should not contain
+%% a period.) No more passes will be run.
+%%
+%% {listing,Ext} Produce an listing of the terms in the internal
+%% representation. The extension of the listing
+%% file will be Ext. (Ext should not contain
+%% a period.) No more passes will be run.
+%%
+%% {done,Ext} End compilation at this point. Produce a listing
+%% as with {listing,Ext}, unless 'binary' is
+%% specified, in which case the current
+%% representation of the code is returned without
+%% creating an output file.
+%%
+%% {iff,Flag,Cmd} If the given Flag is given in the option list,
+%% Cmd will be interpreted as a command.
+%% Otherwise, Cmd will be ignored.
+%% Example: {iff,dcg,{listing,"codegen}}
+%%
+%% {unless,Flag,Cmd} If the given Flag is NOT given in the option list,
+%% Cmd will be interpreted as a command.
+%% Otherwise, Cmd will be ignored.
+%% Example: {unless,no_kernopt,{pass,sys_kernopt}}
+%%
+
+select_passes([{pass,Mod}|Ps], Opts) ->
+ F = fun(St) ->
+ case catch Mod:module(St#compile.code, St#compile.options) of
+ {ok,Code} ->
+ {ok,St#compile{code=Code}};
+ {error,Es} ->
+ {error,St#compile{errors=St#compile.errors ++ Es}}
+ end
+ end,
+ [{Mod,F}|select_passes(Ps, Opts)];
+select_passes([{src_listing,Ext}|_], _Opts) ->
+ [{listing,fun (St) -> src_listing(Ext, St) end}];
+select_passes([{listing,Ext}|_], _Opts) ->
+ [{listing,fun (St) -> listing(Ext, St) end}];
+select_passes([{done,Ext}|_], Opts) ->
+ select_passes([{unless,binary,{listing,Ext}}], Opts);
+select_passes([{iff,Flag,Pass}|Ps], Opts) ->
+ select_cond(Flag, true, Pass, Ps, Opts);
+select_passes([{unless,Flag,Pass}|Ps], Opts) ->
+ select_cond(Flag, false, Pass, Ps, Opts);
+select_passes([{_,Fun}=P|Ps], Opts) when is_function(Fun) ->
+ [P|select_passes(Ps, Opts)];
+select_passes([{_,Test,Fun}=P|Ps], Opts) when is_function(Test),
+ is_function(Fun) ->
+ [P|select_passes(Ps, Opts)];
+select_passes([], _Opts) ->
+ [];
+select_passes([List|Ps], Opts) when is_list(List) ->
+ case select_passes(List, Opts) of
+ [] -> select_passes(Ps, Opts);
+ Nested ->
+ case last(Nested) of
+ {listing,_Fun} -> Nested;
+ _Other -> Nested ++ select_passes(Ps, Opts)
+ end
+ end.
+
+select_cond(Flag, ShouldBe, Pass, Ps, Opts) ->
+ ShouldNotBe = not ShouldBe,
+ case member(Flag, Opts) of
+ ShouldBe -> select_passes([Pass|Ps], Opts);
+ ShouldNotBe -> select_passes(Ps, Opts)
+ end.
+
+%% The standard passes (almost) always run.
+
+standard_passes() ->
+ [?pass(transform_module),
+ {iff,'dpp',{listing,"pp"}},
+ ?pass(lint_module),
+ {iff,'P',{src_listing,"P"}},
+ {iff,'to_pp',{done,"P"}},
+
+ {iff,'dabstr',{listing,"abstr"}},
+ {iff,debug_info,?pass(save_abstract_code)},
+
+ ?pass(expand_module),
+ {iff,'dexp',{listing,"expand"}},
+ {iff,'E',{src_listing,"E"}},
+ {iff,'to_exp',{done,"E"}},
+
+ %% Conversion to Core Erlang.
+ ?pass(core_module),
+ {iff,'dcore',{listing,"core"}},
+ {iff,'to_core0',{done,"core"}}
+ | core_passes()].
+
+core_passes() ->
+ %% Optimization and transforms of Core Erlang code.
+ [{unless,no_copt,
+ [{core_old_inliner,fun test_old_inliner/1,fun core_old_inliner/1},
+ ?pass(core_fold_module),
+ {core_inline_module,fun test_core_inliner/1,fun core_inline_module/1},
+ {core_fold_after_inline,fun test_core_inliner/1,fun core_fold_module/1},
+ ?pass(core_transforms)]},
+ {iff,dcopt,{listing,"copt"}},
+ {iff,'to_core',{done,"core"}}
+ | kernel_passes()].
+
+kernel_passes() ->
+ %% Destructive setelement/3 optimization and core lint.
+ [?pass(core_dsetel_module),
+ {iff,clint,?pass(core_lint_module)},
+ {iff,core,?pass(save_core_code)},
+
+ %% Kernel Erlang and code generation.
+ ?pass(kernel_module),
+ {iff,dkern,{listing,"kernel"}},
+ {iff,'to_kernel',{done,"kernel"}},
+ {pass,v3_life},
+ {iff,dlife,{listing,"life"}},
+ {pass,v3_codegen},
+ {iff,dcg,{listing,"codegen"}}
+ | asm_passes()].
+
+asm_passes() ->
+ %% Assembly level optimisations.
+ [{unless,no_postopt,
+ [{pass,beam_block},
+ {iff,dblk,{listing,"block"}},
+ {unless,no_bopt,{pass,beam_bool}},
+ {iff,dbool,{listing,"bool"}},
+ {unless,no_topt,{pass,beam_type}},
+ {iff,dtype,{listing,"type"}},
+ {pass,beam_dead}, %Must always run since it splits blocks.
+ {iff,ddead,{listing,"dead"}},
+ {unless,no_jopt,{pass,beam_jump}},
+ {iff,djmp,{listing,"jump"}},
+ {pass,beam_clean},
+ {iff,dclean,{listing,"clean"}},
+ {pass,beam_flatten}]},
+
+ %% If post optimizations are turned off, we still coalesce
+ %% adjacent labels and remove unused labels to keep the
+ %% HiPE compiler happy.
+ {iff,no_postopt,
+ [?pass(beam_unused_labels),
+ {pass,beam_clean}]},
+
+ {iff,dopt,{listing,"optimize"}},
+ {iff,'S',{listing,"S"}},
+ {iff,'to_asm',{done,"S"}},
+
+ {pass,beam_validator},
+ ?pass(beam_asm)
+ | binary_passes()].
+
+binary_passes() ->
+ [{native_compile,fun test_native/1,fun native_compile/1},
+ {unless,binary,?pass(save_binary)}].
+
+%%%
+%%% Compiler passes.
+%%%
+
+%% Remove the target file so we don't have an old one if the compilation fail.
+remove_file(St) ->
+ file:delete(St#compile.ofile),
+ {ok,St}.
+
+-record(asm_module, {module,
+ exports,
+ labels,
+ functions=[],
+ cfun,
+ code,
+ attributes=[]}).
+
+preprocess_asm_forms(Forms) ->
+ R = #asm_module{},
+ R1 = collect_asm(Forms, R),
+ {R1#asm_module.module,
+ {R1#asm_module.module,
+ R1#asm_module.exports,
+ R1#asm_module.attributes,
+ R1#asm_module.functions,
+ R1#asm_module.labels}}.
+
+collect_asm([], R) ->
+ case R#asm_module.cfun of
+ undefined ->
+ R;
+ {A,B,C} ->
+ R#asm_module{functions=R#asm_module.functions++
+ [{function,A,B,C,R#asm_module.code}]}
+ end;
+collect_asm([{module,M} | Rest], R) ->
+ collect_asm(Rest, R#asm_module{module=M});
+collect_asm([{exports,M} | Rest], R) ->
+ collect_asm(Rest, R#asm_module{exports=M});
+collect_asm([{labels,M} | Rest], R) ->
+ collect_asm(Rest, R#asm_module{labels=M});
+collect_asm([{function,A,B,C} | Rest], R) ->
+ R1 = case R#asm_module.cfun of
+ undefined ->
+ R;
+ {A0,B0,C0} ->
+ R#asm_module{functions=R#asm_module.functions++
+ [{function,A0,B0,C0,R#asm_module.code}]}
+ end,
+ collect_asm(Rest, R1#asm_module{cfun={A,B,C}, code=[]});
+collect_asm([{attributes, Attr} | Rest], R) ->
+ collect_asm(Rest, R#asm_module{attributes=Attr});
+collect_asm([X | Rest], R) ->
+ collect_asm(Rest, R#asm_module{code=R#asm_module.code++[X]}).
+
+beam_consult_asm(St) ->
+ case file:consult(St#compile.ifile) of
+ {ok, Forms0} ->
+ {Module, Forms} = preprocess_asm_forms(Forms0),
+ {ok,St#compile{module=Module, code=Forms}};
+ {error,E} ->
+ Es = [{St#compile.ifile,[{none,?MODULE,{open,E}}]}],
+ {error,St#compile{errors=St#compile.errors ++ Es}}
+ end.
+
+read_beam_file(St) ->
+ case file:read_file(St#compile.ifile) of
+ {ok,Beam} ->
+ Infile = St#compile.ifile,
+ case is_too_old(Infile) of
+ true ->
+ {ok,St#compile{module=none,code=none}};
+ false ->
+ Mod0 = filename:rootname(filename:basename(Infile)),
+ Mod = list_to_atom(Mod0),
+ {ok,St#compile{module=Mod,code=Beam,ofile=Infile}}
+ end;
+ {error,E} ->
+ Es = [{St#compile.ifile,[{none,?MODULE,{open,E}}]}],
+ {error,St#compile{errors=St#compile.errors ++ Es}}
+ end.
+
+is_too_old(BeamFile) ->
+ case beam_lib:chunks(BeamFile, ["CInf"]) of
+ {ok,{_,[{"CInf",Term0}]}} ->
+ Term = binary_to_term(Term0),
+ Opts = proplists:get_value(options, Term, []),
+ lists:member(no_new_funs, Opts);
+ _ -> false
+ end.
+
+parse_module(St) ->
+ Opts = St#compile.options,
+ Cwd = ".",
+ IncludePath = [Cwd, St#compile.dir|inc_paths(Opts)],
+ Tab = ets:new(compiler__tab, [protected,named_table]),
+ ets:insert(Tab, {compiler_options,Opts}),
+ R = epp:parse_file(St#compile.ifile, IncludePath, pre_defs(Opts)),
+ ets:delete(Tab),
+ case R of
+ {ok,Forms} ->
+ {ok,St#compile{code=Forms}};
+ {error,E} ->
+ Es = [{St#compile.ifile,[{none,?MODULE,{epp,E}}]}],
+ {error,St#compile{errors=St#compile.errors ++ Es}}
+ end.
+
+parse_core(St) ->
+ case file:read_file(St#compile.ifile) of
+ {ok,Bin} ->
+ case core_scan:string(binary_to_list(Bin)) of
+ {ok,Toks,_} ->
+ case core_parse:parse(Toks) of
+ {ok,Mod} ->
+ Name = (Mod#c_module.name)#c_atom.val,
+ {ok,St#compile{module=Name,code=Mod}};
+ {error,E} ->
+ Es = [{St#compile.ifile,[E]}],
+ {error,St#compile{errors=St#compile.errors ++ Es}}
+ end;
+ {error,E,_} ->
+ Es = [{St#compile.ifile,[E]}],
+ {error,St#compile{errors=St#compile.errors ++ Es}}
+ end;
+ {error,E} ->
+ Es = [{St#compile.ifile,[{none,compile,{open,E}}]}],
+ {error,St#compile{errors=St#compile.errors ++ Es}}
+ end.
+
+compile_options([{attribute,_L,compile,C}|Fs]) when is_list(C) ->
+ C ++ compile_options(Fs);
+compile_options([{attribute,_L,compile,C}|Fs]) ->
+ [C|compile_options(Fs)];
+compile_options([_F|Fs]) -> compile_options(Fs);
+compile_options([]) -> [].
+
+transforms(Os) -> [ M || {parse_transform,M} <- Os ].
+
+transform_module(St) ->
+ %% Extract compile options from code into options field.
+ Ts = transforms(St#compile.options ++ compile_options(St#compile.code)),
+ foldl_transform(St, Ts).
+
+foldl_transform(St, [T|Ts]) ->
+ Name = "transform " ++ atom_to_list(T),
+ Fun = fun(S) -> T:parse_transform(S#compile.code, S#compile.options) end,
+ Run = case member(time, St#compile.options) of
+ true -> fun run_tc/2;
+ false -> fun({_Name,F}, S) -> catch F(S) end
+ end,
+ case Run({Name, Fun}, St) of
+ {error,Es,Ws} ->
+ {error,St#compile{warnings=St#compile.warnings ++ Ws,
+ errors=St#compile.errors ++ Es}};
+ {'EXIT',R} ->
+ Es = [{St#compile.ifile,[{none,compile,{parse_transform,T,R}}]}],
+ {error,St#compile{errors=St#compile.errors ++ Es}};
+ Forms ->
+ foldl_transform(St#compile{code=Forms}, Ts)
+ end;
+foldl_transform(St, []) -> {ok,St}.
+
+get_core_transforms(Opts) -> [M || {core_transform,M} <- Opts].
+
+core_transforms(St) ->
+ %% The options field holds the complete list of options at this
+
+ Ts = get_core_transforms(St#compile.options),
+ foldl_core_transforms(St, Ts).
+
+foldl_core_transforms(St, [T|Ts]) ->
+ Name = "core transform " ++ atom_to_list(T),
+ Fun = fun(S) -> T:core_transform(S#compile.code, S#compile.options) end,
+ Run = case member(time, St#compile.options) of
+ true -> fun run_tc/2;
+ false -> fun({_Name,F}, S) -> catch F(S) end
+ end,
+ case Run({Name, Fun}, St) of
+ {'EXIT',R} ->
+ Es = [{St#compile.ifile,[{none,compile,{core_transform,T,R}}]}],
+ {error,St#compile{errors=St#compile.errors ++ Es}};
+ Forms ->
+ foldl_core_transforms(St#compile{code=Forms}, Ts)
+ end;
+foldl_core_transforms(St, []) -> {ok,St}.
+
+%%% Fetches the module name from a list of forms. The module attribute must
+%%% be present.
+get_module([{attribute,_,module,{M,_As}} | _]) -> M;
+get_module([{attribute,_,module,M} | _]) -> M;
+get_module([_ | Rest]) ->
+ get_module(Rest).
+
+%%% A #compile state is returned, where St.base has been filled in
+%%% with the module name from Forms, as a string, in case it wasn't
+%%% set in St (i.e., it was "").
+add_default_base(St, Forms) ->
+ F = St#compile.filename,
+ case F of
+ "" ->
+ M = get_module(Forms),
+ St#compile{base = atom_to_list(M)};
+ _ ->
+ St
+ end.
+
+lint_module(St) ->
+ case erl_lint:module(St#compile.code,
+ St#compile.ifile, St#compile.options) of
+ {ok,Ws} ->
+ %% Insert name of module as base name, if needed. This is
+ %% for compile:forms to work with listing files.
+ St1 = add_default_base(St, St#compile.code),
+ {ok,St1#compile{warnings=St1#compile.warnings ++ Ws}};
+ {error,Es,Ws} ->
+ {error,St#compile{warnings=St#compile.warnings ++ Ws,
+ errors=St#compile.errors ++ Es}}
+ end.
+
+core_lint_module(St) ->
+ case core_lint:module(St#compile.code, St#compile.options) of
+ {ok,Ws} ->
+ {ok,St#compile{warnings=St#compile.warnings ++ Ws}};
+ {error,Es,Ws} ->
+ {error,St#compile{warnings=St#compile.warnings ++ Ws,
+ errors=St#compile.errors ++ Es}}
+ end.
+
+%% expand_module(State) -> State'
+%% Do the common preprocessing of the input forms.
+
+expand_module(#compile{code=Code,options=Opts0}=St0) ->
+ {Mod,Exp,Forms,Opts1} = sys_pre_expand:module(Code, Opts0),
+ Opts2 = expand_opts(Opts1),
+ Opts = filter_opts(Opts2),
+ {ok,St0#compile{module=Mod,options=Opts,code={Mod,Exp,Forms}}}.
+
+core_module(#compile{code=Code0,options=Opts,ifile=File}=St) ->
+ {ok,Code,Ws} = v3_core:module(Code0, Opts),
+ {ok,St#compile{code=Code,warnings=St#compile.warnings ++ [{File,Ws}]}}.
+
+core_fold_module(#compile{code=Code0,options=Opts,ifile=File}=St) ->
+ {ok,Code,Ws} = sys_core_fold:module(Code0, Opts),
+ {ok,St#compile{code=Code,warnings=St#compile.warnings ++ [{File,Ws}]}}.
+
+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.
+ case any(fun(no_inline) -> true;
+ (_) -> false
+ end, Opts) of
+ true -> false;
+ false ->
+ any(fun({inline,_}) -> true;
+ (_) -> false
+ end, Opts)
+ end.
+
+test_core_inliner(#compile{options=Opts}) ->
+ case any(fun(no_inline) -> true;
+ (_) -> false
+ end, Opts) of
+ true -> false;
+ false ->
+ any(fun(inline) -> true;
+ (_) -> false
+ end, Opts)
+ end.
+
+core_old_inliner(#compile{code=Code0,options=Opts}=St) ->
+ case catch sys_core_inline:module(Code0, Opts) of
+ {ok,Code} ->
+ {ok,St#compile{code=Code}};
+ {error,Es} ->
+ {error,St#compile{errors=St#compile.errors ++ Es}}
+ end.
+
+core_inline_module(#compile{code=Code0,options=Opts}=St) ->
+ Code = cerl_inline:core_transform(Code0, Opts),
+ {ok,St#compile{code=Code}}.
+
+core_dsetel_module(#compile{code=Code0,options=Opts}=St) ->
+ {ok,Code} = sys_core_dsetel:module(Code0, Opts),
+ {ok,St#compile{code=Code}}.
+
+kernel_module(#compile{code=Code0,options=Opts,ifile=File}=St) ->
+ {ok,Code,Ws} = v3_kernel:module(Code0, Opts),
+ {ok,St#compile{code=Code,warnings=St#compile.warnings ++ [{File,Ws}]}}.
+
+save_abstract_code(St) ->
+ {ok,St#compile{abstract_code=abstract_code(St)}}.
+
+abstract_code(#compile{code=Code}) ->
+ Abstr = {raw_abstract_v1,Code},
+ case catch erlang:term_to_binary(Abstr, [compressed]) of
+ {'EXIT',_} -> term_to_binary(Abstr);
+ Other -> Other
+ end.
+
+save_core_code(St) ->
+ {ok,St#compile{core_code=cerl:from_records(St#compile.code)}}.
+
+beam_unused_labels(#compile{code=Code0}=St) ->
+ Code = beam_jump:module_labels(Code0),
+ {ok,St#compile{code=Code}}.
+
+beam_asm(#compile{ifile=File,code=Code0,abstract_code=Abst,options=Opts0}=St) ->
+ Source = filename:absname(File),
+ Opts = filter(fun is_informative_option/1, Opts0),
+ case beam_asm:module(Code0, Abst, Source, Opts) of
+ {ok,Code} -> {ok,St#compile{code=Code,abstract_code=[]}};
+ {error,Es} -> {error,St#compile{errors=St#compile.errors ++ Es}}
+ end.
+
+test_native(#compile{options=Opts}) ->
+ %% This test must be made late, because the r7 or no_new_funs options
+ %% will turn off the native option.
+ member(native, Opts).
+
+native_compile(#compile{code=none}=St) -> {ok,St};
+native_compile(St) ->
+ case erlang:system_info(hipe_architecture) of
+ undefined ->
+ Ws = [{St#compile.ifile,[{none,compile,no_native_support}]}],
+ {ok,St#compile{warnings=St#compile.warnings ++ Ws}};
+ _ ->
+ native_compile_1(St)
+ end.
+
+native_compile_1(St) ->
+ Opts0 = [no_new_binaries|St#compile.options],
+ IgnoreErrors = member(ignore_native_errors, Opts0),
+ Opts = case keysearch(hipe, 1, Opts0) of
+ {value,{hipe,L}} when list(L) -> L;
+ {value,{hipe,X}} -> [X];
+ _ -> []
+ end,
+ case catch hipe:compile(St#compile.module,
+ St#compile.core_code,
+ St#compile.code,
+ Opts) of
+ {ok, {Type,Bin}} when binary(Bin) ->
+ {ok, embed_native_code(St, {Type,Bin})};
+ {error, R} ->
+ case IgnoreErrors of
+ true ->
+ Ws = [{St#compile.ifile,[{none,?MODULE,{native,R}}]}],
+ {ok,St#compile{warnings=St#compile.warnings ++ Ws}};
+ false ->
+ Es = [{St#compile.ifile,[{none,?MODULE,{native,R}}]}],
+ {error,St#compile{errors=St#compile.errors ++ Es}}
+ end;
+ {'EXIT',R} ->
+ case IgnoreErrors of
+ true ->
+ Ws = [{St#compile.ifile,[{none,?MODULE,{native_crash,R}}]}],
+ {ok,St#compile{warnings=St#compile.warnings ++ Ws}};
+ false ->
+ exit(R)
+ end
+ end.
+
+embed_native_code(St, {Architecture,NativeCode}) ->
+ {ok, _, Chunks0} = beam_lib:all_chunks(St#compile.code),
+ ChunkName = hipe_unified_loader:chunk_name(Architecture),
+ Chunks1 = lists:keydelete(ChunkName, 1, Chunks0),
+ Chunks = Chunks1 ++ [{ChunkName,NativeCode}],
+ {ok, BeamPlusNative} = beam_lib:build_module(Chunks),
+ St#compile{code=BeamPlusNative}.
+
+%% Returns true if the option is informative and therefore should be included
+%% in the option list of the compiled module.
+
+is_informative_option(beam) -> false;
+is_informative_option(report_warnings) -> false;
+is_informative_option(report_errors) -> false;
+is_informative_option(binary) -> false;
+is_informative_option(verbose) -> false;
+is_informative_option(_) -> true.
+
+save_binary(#compile{code=none}=St) -> {ok,St};
+save_binary(St) ->
+ Tfile = tmpfile(St#compile.ofile), %Temp working file
+ case write_binary(Tfile, St#compile.code, St) of
+ ok ->
+ case file:rename(Tfile, St#compile.ofile) of
+ ok ->
+ {ok,St};
+ {error,_Error} ->
+ file:delete(Tfile),
+ Es = [{St#compile.ofile,[{none,?MODULE,{rename,Tfile}}]}],
+ {error,St#compile{errors=St#compile.errors ++ Es}}
+ end;
+ {error,_Error} ->
+ Es = [{Tfile,[{compile,write_error}]}],
+ {error,St#compile{errors=St#compile.errors ++ Es}}
+ end.
+
+write_binary(Name, Bin, St) ->
+ Opts = case member(compressed, St#compile.options) of
+ true -> [compressed];
+ false -> []
+ end,
+ case file:write_file(Name, Bin, Opts) of
+ ok -> ok;
+ {error,_}=Error -> Error
+ end.
+
+%% report_errors(State) -> ok
+%% report_warnings(State) -> ok
+
+report_errors(St) ->
+ case member(report_errors, St#compile.options) of
+ true ->
+ foreach(fun ({{F,_L},Eds}) -> list_errors(F, Eds);
+ ({F,Eds}) -> list_errors(F, Eds) end,
+ St#compile.errors);
+ false -> ok
+ end.
+
+report_warnings(#compile{options=Opts,warnings=Ws0}) ->
+ case member(report_warnings, Opts) of
+ true ->
+ Ws1 = flatmap(fun({{F,_L},Eds}) -> format_message(F, Eds);
+ ({F,Eds}) -> format_message(F, Eds) end,
+ Ws0),
+ Ws = ordsets:from_list(Ws1),
+ foreach(fun({_,Str}) -> io:put_chars(Str) end, Ws);
+ false -> ok
+ end.
+
+format_message(F, [{Line,Mod,E}|Es]) ->
+ M = {Line,io_lib:format("~s:~w: Warning: ~s\n", [F,Line,Mod:format_error(E)])},
+ [M|format_message(F, Es)];
+format_message(F, [{Mod,E}|Es]) ->
+ M = {none,io_lib:format("~s: Warning: ~s\n", [F,Mod:format_error(E)])},
+ [M|format_message(F, Es)];
+format_message(_, []) -> [].
+
+%% list_errors(File, ErrorDescriptors) -> ok
+
+list_errors(F, [{Line,Mod,E}|Es]) ->
+ io:fwrite("~s:~w: ~s\n", [F,Line,Mod:format_error(E)]),
+ list_errors(F, Es);
+list_errors(F, [{Mod,E}|Es]) ->
+ io:fwrite("~s: ~s\n", [F,Mod:format_error(E)]),
+ list_errors(F, Es);
+list_errors(_F, []) -> ok.
+
+%% erlfile(Dir, Base) -> ErlFile
+%% outfile(Base, Extension, Options) -> OutputFile
+%% objfile(Base, Target, Options) -> ObjFile
+%% tmpfile(ObjFile) -> TmpFile
+%% Work out the correct input and output file names.
+
+iofile(File) when atom(File) ->
+ iofile(atom_to_list(File));
+iofile(File) ->
+ {filename:dirname(File), filename:basename(File, ".erl")}.
+
+erlfile(Dir, Base, Suffix) ->
+ filename:join(Dir, Base++Suffix).
+
+outfile(Base, Ext, Opts) when atom(Ext) ->
+ outfile(Base, atom_to_list(Ext), Opts);
+outfile(Base, Ext, Opts) ->
+ Obase = case keysearch(outdir, 1, Opts) of
+ {value, {outdir, Odir}} -> filename:join(Odir, Base);
+ _Other -> Base % Not found or bad format
+ end,
+ Obase++"."++Ext.
+
+objfile(Base, St) ->
+ outfile(Base, "beam", St#compile.options).
+
+tmpfile(Ofile) ->
+ reverse([$#|tl(reverse(Ofile))]).
+
+%% pre_defs(Options)
+%% inc_paths(Options)
+%% Extract the predefined macros and include paths from the option list.
+
+pre_defs([{d,M,V}|Opts]) ->
+ [{M,V}|pre_defs(Opts)];
+pre_defs([{d,M}|Opts]) ->
+ [M|pre_defs(Opts)];
+pre_defs([_|Opts]) ->
+ pre_defs(Opts);
+pre_defs([]) -> [].
+
+inc_paths(Opts) ->
+ [ P || {i,P} <- Opts, list(P) ].
+
+src_listing(Ext, St) ->
+ listing(fun (Lf, {_Mod,_Exp,Fs}) -> do_src_listing(Lf, Fs);
+ (Lf, Fs) -> do_src_listing(Lf, Fs) end,
+ Ext, St).
+
+do_src_listing(Lf, Fs) ->
+ foreach(fun (F) -> io:put_chars(Lf, [erl_pp:form(F),"\n"]) end,
+ Fs).
+
+listing(Ext, St) ->
+ listing(fun(Lf, Fs) -> beam_listing:module(Lf, Fs) end, Ext, St).
+
+listing(LFun, Ext, St) ->
+ Lfile = outfile(St#compile.base, Ext, St#compile.options),
+ case file:open(Lfile, [write,delayed_write]) of
+ {ok,Lf} ->
+ LFun(Lf, St#compile.code),
+ ok = file:close(Lf),
+ {ok,St};
+ {error,_Error} ->
+ Es = [{Lfile,[{none,compile,write_error}]}],
+ {error,St#compile{errors=St#compile.errors ++ Es}}
+ end.
+
+options() ->
+ help(standard_passes()).
+
+help([{iff,Flag,{src_listing,Ext}}|T]) ->
+ io:fwrite("~p - Generate .~s source listing file\n", [Flag,Ext]),
+ help(T);
+help([{iff,Flag,{listing,Ext}}|T]) ->
+ io:fwrite("~p - Generate .~s file\n", [Flag,Ext]),
+ help(T);
+help([{iff,Flag,{Name,Fun}}|T]) when function(Fun) ->
+ io:fwrite("~p - Run ~s\n", [Flag,Name]),
+ help(T);
+help([{iff,_Flag,Action}|T]) ->
+ help(Action),
+ help(T);
+help([{unless,Flag,{pass,Pass}}|T]) ->
+ io:fwrite("~p - Skip the ~s pass\n", [Flag,Pass]),
+ help(T);
+help([{unless,no_postopt=Flag,List}|T]) when list(List) ->
+ %% Hard-coded knowledgde here.
+ io:fwrite("~p - Skip all post optimisation\n", [Flag]),
+ help(List),
+ help(T);
+help([{unless,_Flag,Action}|T]) ->
+ help(Action),
+ help(T);
+help([_|T]) ->
+ help(T);
+help(_) ->
+ ok.
+
+
+%% compile(AbsFileName, Outfilename, Options)
+%% Compile entry point for erl_compile.
+
+compile(File0, _OutFile, Options) ->
+ File = shorten_filename(File0),
+ case file(File, make_erl_options(Options)) of
+ {ok,_Mod} -> ok;
+ Other -> Other
+ end.
+
+compile_beam(File0, _OutFile, Opts) ->
+ File = shorten_filename(File0),
+ case file(File, [from_beam|make_erl_options(Opts)]) of
+ {ok,_Mod} -> ok;
+ Other -> Other
+ end.
+
+compile_asm(File0, _OutFile, Opts) ->
+ File = shorten_filename(File0),
+ case file(File, [asm|make_erl_options(Opts)]) of
+ {ok,_Mod} -> ok;
+ Other -> Other
+ end.
+
+compile_core(File0, _OutFile, Opts) ->
+ File = shorten_filename(File0),
+ case file(File, [from_core|make_erl_options(Opts)]) of
+ {ok,_Mod} -> ok;
+ Other -> Other
+ end.
+
+shorten_filename(Name0) ->
+ {ok,Cwd} = file:get_cwd(),
+ case lists:prefix(Cwd, Name0) of
+ false -> Name0;
+ true ->
+ Name = case lists:nthtail(length(Cwd), Name0) of
+ "/"++N -> N;
+ N -> N
+ end,
+ Name
+ end.
+
+%% Converts generic compiler options to specific options.
+
+make_erl_options(Opts) ->
+
+ %% This way of extracting will work even if the record passed
+ %% has more fields than known during compilation.
+
+ Includes = Opts#options.includes,
+ Defines = Opts#options.defines,
+ Outdir = Opts#options.outdir,
+ Warning = Opts#options.warning,
+ Verbose = Opts#options.verbose,
+ Specific = Opts#options.specific,
+ OutputType = Opts#options.output_type,
+ Cwd = Opts#options.cwd,
+
+ Options =
+ case Verbose of
+ true -> [verbose];
+ false -> []
+ end ++
+ case Warning of
+ 0 -> [];
+ _ -> [report_warnings]
+ end ++
+ map(
+ fun ({Name, Value}) ->
+ {d, Name, Value};
+ (Name) ->
+ {d, Name}
+ end,
+ Defines) ++
+ case OutputType of
+ undefined -> [];
+ jam -> [jam];
+ beam -> [beam];
+ native -> [native]
+ end,
+
+ Options++[report_errors, {cwd, Cwd}, {outdir, Outdir}|
+ map(fun(Dir) -> {i, Dir} end, Includes)]++Specific.
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/core_lib.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/core_lib.erl
new file mode 100644
index 0000000000..1fe45d5308
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/core_lib.erl
@@ -0,0 +1,509 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: core_lib.erl,v 1.1 2008/12/17 09:53:42 mikpe Exp $
+%%
+%% Purpose: Core Erlang abstract syntax functions.
+
+-module(core_lib).
+
+-export([get_anno/1,set_anno/2]).
+-export([is_atomic/1,is_literal/1,is_literal_list/1,
+ is_simple/1,is_simple_list/1,is_simple_top/1]).
+-export([literal_value/1,make_literal/1]).
+-export([make_values/1]).
+-export([map/2, fold/3, mapfold/3]).
+-export([is_var_used/2]).
+
+%% -compile([export_all]).
+
+-include("core_parse.hrl").
+
+%% get_anno(Core) -> Anno.
+%% set_anno(Core, Anno) -> Core.
+%% Generic get/set annotation.
+
+get_anno(C) -> element(2, C).
+set_anno(C, A) -> setelement(2, C, A).
+
+%% is_atomic(Expr) -> true | false.
+
+is_atomic(#c_char{}) -> true;
+is_atomic(#c_int{}) -> true;
+is_atomic(#c_float{}) -> true;
+is_atomic(#c_atom{}) -> true;
+is_atomic(#c_string{}) -> true;
+is_atomic(#c_nil{}) -> true;
+is_atomic(#c_fname{}) -> true;
+is_atomic(_) -> false.
+
+%% is_literal(Expr) -> true | false.
+
+is_literal(#c_cons{hd=H,tl=T}) ->
+ case is_literal(H) of
+ true -> is_literal(T);
+ false -> false
+ end;
+is_literal(#c_tuple{es=Es}) -> is_literal_list(Es);
+is_literal(#c_binary{segments=Es}) -> is_lit_bin(Es);
+is_literal(E) -> is_atomic(E).
+
+is_literal_list(Es) -> lists:all(fun is_literal/1, Es).
+
+is_lit_bin(Es) ->
+ lists:all(fun (#c_bitstr{val=E,size=S}) ->
+ is_literal(E) and is_literal(S)
+ end, Es).
+
+%% is_simple(Expr) -> true | false.
+
+is_simple(#c_var{}) -> true;
+is_simple(#c_cons{hd=H,tl=T}) ->
+ case is_simple(H) of
+ true -> is_simple(T);
+ false -> false
+ end;
+is_simple(#c_tuple{es=Es}) -> is_simple_list(Es);
+is_simple(#c_binary{segments=Es}) -> is_simp_bin(Es);
+is_simple(E) -> is_atomic(E).
+
+is_simple_list(Es) -> lists:all(fun is_simple/1, Es).
+
+is_simp_bin(Es) ->
+ lists:all(fun (#c_bitstr{val=E,size=S}) ->
+ is_simple(E) and is_simple(S)
+ end, Es).
+
+%% is_simple_top(Expr) -> true | false.
+%% Only check if the top-level is a simple.
+
+is_simple_top(#c_var{}) -> true;
+is_simple_top(#c_cons{}) -> true;
+is_simple_top(#c_tuple{}) -> true;
+is_simple_top(#c_binary{}) -> true;
+is_simple_top(E) -> is_atomic(E).
+
+%% literal_value(LitExpr) -> Value.
+%% Return the value of LitExpr.
+
+literal_value(#c_char{val=C}) -> C;
+literal_value(#c_int{val=I}) -> I;
+literal_value(#c_float{val=F}) -> F;
+literal_value(#c_atom{val=A}) -> A;
+literal_value(#c_string{val=S}) -> S;
+literal_value(#c_nil{}) -> [];
+literal_value(#c_cons{hd=H,tl=T}) ->
+ [literal_value(H)|literal_value(T)];
+literal_value(#c_tuple{es=Es}) ->
+ list_to_tuple(literal_value_list(Es)).
+
+literal_value_list(Vals) -> lists:map(fun literal_value/1, Vals).
+
+%% make_literal(Value) -> LitExpr.
+%% Make a literal expression from an Erlang value.
+
+make_literal(I) when integer(I) -> #c_int{val=I};
+make_literal(F) when float(F) -> #c_float{val=F};
+make_literal(A) when atom(A) -> #c_atom{val=A};
+make_literal([]) -> #c_nil{};
+make_literal([H|T]) ->
+ #c_cons{hd=make_literal(H),tl=make_literal(T)};
+make_literal(T) when tuple(T) ->
+ #c_tuple{es=make_literal_list(tuple_to_list(T))}.
+
+make_literal_list(Vals) -> lists:map(fun make_literal/1, Vals).
+
+%% make_values([CoreExpr] | CoreExpr) -> #c_values{} | CoreExpr.
+%% Make a suitable values structure, expr or values, depending on
+%% Expr.
+
+make_values([E]) -> E;
+make_values([H|_]=Es) -> #c_values{anno=get_anno(H),es=Es};
+make_values([]) -> #c_values{es=[]};
+make_values(E) -> E.
+
+%% map(MapFun, CoreExpr) -> CoreExpr.
+%% This function traverses the core parse format, at each level
+%% applying the submited argument function, assumed to do the real
+%% work.
+%%
+%% The "eager" style, where each component of a construct are
+%% descended to before the construct itself, admits that some
+%% companion functions (the F:s) may be made simpler, since it may be
+%% safely assumed that no lower illegal instanced will be
+%% created/uncovered by actions on the current level.
+
+map(F, #c_tuple{es=Es}=R) ->
+ F(R#c_tuple{es=map_list(F, Es)});
+map(F, #c_cons{hd=Hd, tl=Tl}=R) ->
+ F(R#c_cons{hd=map(F, Hd),
+ tl=map(F, Tl)});
+map(F, #c_values{es=Es}=R) ->
+ F(R#c_values{es=map_list(F, Es)});
+
+map(F, #c_alias{var=Var, pat=Pat}=R) ->
+ F(R#c_alias{var=map(F, Var),
+ pat=map(F, Pat)});
+
+map(F, #c_module{defs=Defs}=R) ->
+ F(R#c_module{defs=map_list(F, Defs)});
+map(F, #c_def{val=Val}=R) ->
+ F(R#c_def{val=map(F, Val)});
+
+map(F, #c_fun{vars=Vars, body=Body}=R) ->
+ F(R#c_fun{vars=map_list(F, Vars),
+ body=map(F, Body)});
+map(F, #c_let{vars=Vs, arg=Arg, body=Body}=R) ->
+ F(R#c_let{vars=map_list(F, Vs),
+ arg=map(F, Arg),
+ body=map(F, Body)});
+map(F, #c_letrec{defs=Fs,body=Body}=R) ->
+ F(R#c_letrec{defs=map_list(F, Fs),
+ body=map(F, Body)});
+map(F, #c_seq{arg=Arg, body=Body}=R) ->
+ F(R#c_seq{arg=map(F, Arg),
+ body=map(F, Body)});
+map(F, #c_case{arg=Arg, clauses=Clauses}=R) ->
+ F(R#c_case{arg=map(F, Arg),
+ clauses=map_list(F, Clauses)});
+map(F, #c_clause{pats=Ps, guard=Guard, body=Body}=R) ->
+ F(R#c_clause{pats=map_list(F, Ps),
+ guard=map(F, Guard),
+ body=map(F, Body)});
+map(F, #c_receive{clauses=Cls, timeout=Tout, action=Act}=R) ->
+ F(R#c_receive{clauses=map_list(F, Cls),
+ timeout=map(F, Tout),
+ action=map(F, Act)});
+map(F, #c_apply{op=Op,args=Args}=R) ->
+ F(R#c_apply{op=map(F, Op),
+ args=map_list(F, Args)});
+map(F, #c_call{module=M,name=N,args=Args}=R) ->
+ F(R#c_call{module=map(F, M),
+ name=map(F, N),
+ args=map_list(F, Args)});
+map(F, #c_primop{name=N,args=Args}=R) ->
+ F(R#c_primop{name=map(F, N),
+ args=map_list(F, Args)});
+map(F, #c_try{arg=Expr,vars=Vars,body=Body,evars=Evars,handler=Handler}=R) ->
+ F(R#c_try{arg=map(F, Expr),
+ vars=map(F, Vars),
+ body=map(F, Body),
+ evars=map(F, Evars),
+ handler=map(F, Handler)});
+map(F, #c_catch{body=Body}=R) ->
+ F(R#c_catch{body=map(F, Body)});
+map(F, T) -> F(T). %Atomic nodes.
+
+map_list(F, L) -> lists:map(fun (E) -> map(F, E) end, L).
+
+%% fold(FoldFun, Accumulator, CoreExpr) -> Accumulator.
+%% This function traverses the core parse format, at each level
+%% applying the submited argument function, assumed to do the real
+%% work, and keeping the accumulated result in the A (accumulator)
+%% argument.
+
+fold(F, Acc, #c_tuple{es=Es}=R) ->
+ F(R, fold_list(F, Acc, Es));
+fold(F, Acc, #c_cons{hd=Hd, tl=Tl}=R) ->
+ F(R, fold(F, fold(F, Acc, Hd), Tl));
+fold(F, Acc, #c_values{es=Es}=R) ->
+ F(R, fold_list(F, Acc, Es));
+
+fold(F, Acc, #c_alias{pat=P,var=V}=R) ->
+ F(R, fold(F, fold(F, Acc, P), V));
+
+fold(F, Acc, #c_module{defs=Defs}=R) ->
+ F(R, fold_list(F, Acc, Defs));
+fold(F, Acc, #c_def{val=Val}=R) ->
+ F(R, fold(F, Acc, Val));
+
+fold(F, Acc, #c_fun{vars=Vars, body=Body}=R) ->
+ F(R, fold(F, fold_list(F, Acc, Vars), Body));
+fold(F, Acc, #c_let{vars=Vs, arg=Arg, body=Body}=R) ->
+ F(R, fold(F, fold(F, fold_list(F, Acc, Vs), Arg), Body));
+fold(F, Acc, #c_letrec{defs=Fs,body=Body}=R) ->
+ F(R, fold(F, fold_list(F, Acc, Fs), Body));
+fold(F, Acc, #c_seq{arg=Arg, body=Body}=R) ->
+ F(R, fold(F, fold(F, Acc, Arg), Body));
+fold(F, Acc, #c_case{arg=Arg, clauses=Clauses}=R) ->
+ F(R, fold_list(F, fold(F, Acc, Arg), Clauses));
+fold(F, Acc, #c_clause{pats=Ps,guard=G,body=B}=R) ->
+ F(R, fold(F, fold(F, fold_list(F, Acc, Ps), G), B));
+fold(F, Acc, #c_receive{clauses=Cl, timeout=Ti, action=Ac}=R) ->
+ F(R, fold_list(F, fold(F, fold(F, Acc, Ac), Ti), Cl));
+fold(F, Acc, #c_apply{op=Op, args=Args}=R) ->
+ F(R, fold_list(F, fold(F, Acc, Op), Args));
+fold(F, Acc, #c_call{module=Mod,name=Name,args=Args}=R) ->
+ F(R, fold_list(F, fold(F, fold(F, Acc, Mod), Name), Args));
+fold(F, Acc, #c_primop{name=Name,args=Args}=R) ->
+ F(R, fold_list(F, fold(F, Acc, Name), Args));
+fold(F, Acc, #c_try{arg=E,vars=Vs,body=Body,evars=Evs,handler=H}=R) ->
+ NewB = fold(F, fold_list(F, fold(F, Acc, E), Vs), Body),
+ F(R, fold(F, fold_list(F, NewB, Evs), H));
+fold(F, Acc, #c_catch{body=Body}=R) ->
+ F(R, fold(F, Acc, Body));
+fold(F, Acc, T) -> %Atomic nodes
+ F(T, Acc).
+
+fold_list(F, Acc, L) ->
+ lists:foldl(fun (E, A) -> fold(F, A, E) end, Acc, L).
+
+%% mapfold(MapfoldFun, Accumulator, CoreExpr) -> {CoreExpr,Accumulator}.
+%% This function traverses the core parse format, at each level
+%% applying the submited argument function, assumed to do the real
+%% work, and keeping the accumulated result in the A (accumulator)
+%% argument.
+
+mapfold(F, Acc0, #c_tuple{es=Es0}=R) ->
+ {Es1,Acc1} = mapfold_list(F, Acc0, Es0),
+ F(R#c_tuple{es=Es1}, Acc1);
+mapfold(F, Acc0, #c_cons{hd=H0,tl=T0}=R) ->
+ {H1,Acc1} = mapfold(F, Acc0, H0),
+ {T1,Acc2} = mapfold(F, Acc1, T0),
+ F(R#c_cons{hd=H1,tl=T1}, Acc2);
+mapfold(F, Acc0, #c_values{es=Es0}=R) ->
+ {Es1,Acc1} = mapfold_list(F, Acc0, Es0),
+ F(R#c_values{es=Es1}, Acc1);
+
+mapfold(F, Acc0, #c_alias{pat=P0,var=V0}=R) ->
+ {P1,Acc1} = mapfold(F, Acc0, P0),
+ {V1,Acc2} = mapfold(F, Acc1, V0),
+ F(R#c_alias{pat=P1,var=V1}, Acc2);
+
+mapfold(F, Acc0, #c_module{defs=D0}=R) ->
+ {D1,Acc1} = mapfold_list(F, Acc0, D0),
+ F(R#c_module{defs=D1}, Acc1);
+mapfold(F, Acc0, #c_def{val=V0}=R) ->
+ {V1,Acc1} = mapfold(F, Acc0, V0),
+ F(R#c_def{val=V1}, Acc1);
+
+mapfold(F, Acc0, #c_fun{vars=Vs0, body=B0}=R) ->
+ {Vs1,Acc1} = mapfold_list(F, Acc0, Vs0),
+ {B1,Acc2} = mapfold(F, Acc1, B0),
+ F(R#c_fun{vars=Vs1,body=B1}, Acc2);
+mapfold(F, Acc0, #c_let{vars=Vs0, arg=A0, body=B0}=R) ->
+ {Vs1,Acc1} = mapfold_list(F, Acc0, Vs0),
+ {A1,Acc2} = mapfold(F, Acc1, A0),
+ {B1,Acc3} = mapfold(F, Acc2, B0),
+ F(R#c_let{vars=Vs1,arg=A1,body=B1}, Acc3);
+mapfold(F, Acc0, #c_letrec{defs=Fs0,body=B0}=R) ->
+ {Fs1,Acc1} = mapfold_list(F, Acc0, Fs0),
+ {B1,Acc2} = mapfold(F, Acc1, B0),
+ F(R#c_letrec{defs=Fs1,body=B1}, Acc2);
+mapfold(F, Acc0, #c_seq{arg=A0, body=B0}=R) ->
+ {A1,Acc1} = mapfold(F, Acc0, A0),
+ {B1,Acc2} = mapfold(F, Acc1, B0),
+ F(R#c_seq{arg=A1,body=B1}, Acc2);
+mapfold(F, Acc0, #c_case{arg=A0,clauses=Cs0}=R) ->
+ {A1,Acc1} = mapfold(F, Acc0, A0),
+ {Cs1,Acc2} = mapfold_list(F, Acc1, Cs0),
+ F(R#c_case{arg=A1,clauses=Cs1}, Acc2);
+mapfold(F, Acc0, #c_clause{pats=Ps0,guard=G0,body=B0}=R) ->
+ {Ps1,Acc1} = mapfold_list(F, Acc0, Ps0),
+ {G1,Acc2} = mapfold(F, Acc1, G0),
+ {B1,Acc3} = mapfold(F, Acc2, B0),
+ F(R#c_clause{pats=Ps1,guard=G1,body=B1}, Acc3);
+mapfold(F, Acc0, #c_receive{clauses=Cs0,timeout=T0,action=A0}=R) ->
+ {T1,Acc1} = mapfold(F, Acc0, T0),
+ {Cs1,Acc2} = mapfold_list(F, Acc1, Cs0),
+ {A1,Acc3} = mapfold(F, Acc2, A0),
+ F(R#c_receive{clauses=Cs1,timeout=T1,action=A1}, Acc3);
+mapfold(F, Acc0, #c_apply{op=Op0, args=As0}=R) ->
+ {Op1,Acc1} = mapfold(F, Acc0, Op0),
+ {As1,Acc2} = mapfold_list(F, Acc1, As0),
+ F(R#c_apply{op=Op1,args=As1}, Acc2);
+mapfold(F, Acc0, #c_call{module=M0,name=N0,args=As0}=R) ->
+ {M1,Acc1} = mapfold(F, Acc0, M0),
+ {N1,Acc2} = mapfold(F, Acc1, N0),
+ {As1,Acc3} = mapfold_list(F, Acc2, As0),
+ F(R#c_call{module=M1,name=N1,args=As1}, Acc3);
+mapfold(F, Acc0, #c_primop{name=N0, args=As0}=R) ->
+ {N1,Acc1} = mapfold(F, Acc0, N0),
+ {As1,Acc2} = mapfold_list(F, Acc1, As0),
+ F(R#c_primop{name=N1,args=As1}, Acc2);
+mapfold(F, Acc0, #c_try{arg=E0,vars=Vs0,body=B0,evars=Evs0,handler=H0}=R) ->
+ {E1,Acc1} = mapfold(F, Acc0, E0),
+ {Vs1,Acc2} = mapfold_list(F, Acc1, Vs0),
+ {B1,Acc3} = mapfold(F, Acc2, B0),
+ {Evs1,Acc4} = mapfold_list(F, Acc3, Evs0),
+ {H1,Acc5} = mapfold(F, Acc4, H0),
+ F(R#c_try{arg=E1,vars=Vs1,body=B1,evars=Evs1,handler=H1}, Acc5);
+mapfold(F, Acc0, #c_catch{body=B0}=R) ->
+ {B1,Acc1} = mapfold(F, Acc0, B0),
+ F(R#c_catch{body=B1}, Acc1);
+mapfold(F, Acc, T) -> %Atomic nodes
+ F(T, Acc).
+
+mapfold_list(F, Acc, L) ->
+ lists:mapfoldl(fun (E, A) -> mapfold(F, A, E) end, Acc, L).
+
+%% is_var_used(VarName, Expr) -> true | false.
+%% Test if the variable VarName is used in Expr.
+
+is_var_used(V, B) -> vu_body(V, B).
+
+vu_body(V, #c_values{es=Es}) ->
+ vu_expr_list(V, Es);
+vu_body(V, Body) ->
+ vu_expr(V, Body).
+
+vu_expr(V, #c_var{name=V2}) -> V =:= V2;
+vu_expr(V, #c_cons{hd=H,tl=T}) ->
+ case vu_expr(V, H) of
+ true -> true;
+ false -> vu_expr(V, T)
+ end;
+vu_expr(V, #c_tuple{es=Es}) ->
+ vu_expr_list(V, Es);
+vu_expr(V, #c_binary{segments=Ss}) ->
+ vu_seg_list(V, Ss);
+vu_expr(V, #c_fun{vars=Vs,body=B}) ->
+ %% Variables in fun shadow previous variables
+ case vu_var_list(V, Vs) of
+ true -> false;
+ false -> vu_body(V, B)
+ end;
+vu_expr(V, #c_let{vars=Vs,arg=Arg,body=B}) ->
+ case vu_body(V, Arg) of
+ true -> true;
+ false ->
+ %% Variables in let shadow previous variables.
+ case vu_var_list(V, Vs) of
+ true -> false;
+ false -> vu_body(V, B)
+ end
+ end;
+vu_expr(V, #c_letrec{defs=Fs,body=B}) ->
+ case lists:any(fun (#c_def{val=Fb}) -> vu_body(V, Fb) end, Fs) of
+ true -> true;
+ false -> vu_body(V, B)
+ end;
+vu_expr(V, #c_seq{arg=Arg,body=B}) ->
+ case vu_expr(V, Arg) of
+ true -> true;
+ false -> vu_body(V, B)
+ end;
+vu_expr(V, #c_case{arg=Arg,clauses=Cs}) ->
+ case vu_expr(V, Arg) of
+ true -> true;
+ false -> vu_clauses(V, Cs)
+ end;
+vu_expr(V, #c_receive{clauses=Cs,timeout=T,action=A}) ->
+ case vu_clauses(V, Cs) of
+ true -> true;
+ false ->
+ case vu_expr(V, T) of
+ true -> true;
+ false -> vu_body(V, A)
+ end
+ end;
+vu_expr(V, #c_apply{op=Op,args=As}) ->
+ vu_expr_list(V, [Op|As]);
+vu_expr(V, #c_call{module=M,name=N,args=As}) ->
+ vu_expr_list(V, [M,N|As]);
+vu_expr(V, #c_primop{args=As}) -> %Name is an atom
+ vu_expr_list(V, As);
+vu_expr(V, #c_catch{body=B}) ->
+ vu_body(V, B);
+vu_expr(V, #c_try{arg=E,vars=Vs,body=B,evars=Evs,handler=H}) ->
+ case vu_body(V, E) of
+ true -> true;
+ false ->
+ %% Variables shadow previous ones.
+ case case vu_var_list(V, Vs) of
+ true -> false;
+ false -> vu_body(V, B)
+ end of
+ true -> true;
+ false ->
+ case vu_var_list(V, Evs) of
+ true -> false;
+ false -> vu_body(V, H)
+ end
+ end
+ end;
+vu_expr(_, _) -> false. %Everything else
+
+vu_expr_list(V, Es) ->
+ lists:any(fun(E) -> vu_expr(V, E) end, Es).
+
+vu_seg_list(V, Ss) ->
+ lists:any(fun (#c_bitstr{val=Val,size=Size}) ->
+ case vu_expr(V, Val) of
+ true -> true;
+ false -> vu_expr(V, Size)
+ end
+ end, Ss).
+
+%% vu_clause(VarName, Clause) -> true | false.
+%% vu_clauses(VarName, [Clause]) -> true | false.
+%% Have to get the pattern results right.
+
+vu_clause(V, #c_clause{pats=Ps,guard=G,body=B}) ->
+ case vu_pattern_list(V, Ps) of
+ {true,_Shad} -> true; %It is used
+ {false,true} -> false; %Shadowed
+ {false,false} -> %Not affected
+ case vu_expr(V, G) of
+ true -> true;
+ false ->vu_body(V, B)
+ end
+ end.
+
+vu_clauses(V, Cs) ->
+ lists:any(fun(C) -> vu_clause(V, C) end, Cs).
+
+%% vu_pattern(VarName, Pattern) -> {Used,Shadow}.
+%% vu_pattern_list(VarName, [Pattern]) -> {Used,Shadow}.
+%% Binaries complicate patterns as a variable can both be properly
+%% used, in a bit segment size, and shadow. They can also do both.
+
+%%vu_pattern(V, Pat) -> vu_pattern(V, Pat, {false,false}).
+
+vu_pattern(V, #c_var{name=V2}, St) ->
+ setelement(2, St, V =:= V2);
+vu_pattern(V, #c_cons{hd=H,tl=T}, St0) ->
+ case vu_pattern(V, H, St0) of
+ {true,true}=St1 -> St1; %Nothing more to know
+ St1 -> vu_pattern(V, T, St1)
+ end;
+vu_pattern(V, #c_tuple{es=Es}, St) ->
+ vu_pattern_list(V, Es, St);
+vu_pattern(V, #c_binary{segments=Ss}, St) ->
+ vu_pat_seg_list(V, Ss, St);
+vu_pattern(V, #c_alias{var=Var,pat=P}, St0) ->
+ case vu_pattern(V, Var, St0) of
+ {true,true}=St1 -> St1;
+ St1 -> vu_pattern(V, P, St1)
+ end;
+vu_pattern(_, _, St) -> St.
+
+vu_pattern_list(V, Ps) -> vu_pattern_list(V, Ps, {false,false}).
+
+vu_pattern_list(V, Ps, St0) ->
+ lists:foldl(fun(P, St) -> vu_pattern(V, P, St) end, St0, Ps).
+
+vu_pat_seg_list(V, Ss, St) ->
+ lists:foldl(fun (#c_bitstr{val=Val,size=Size}, St0) ->
+ case vu_pattern(V, Val, St0) of
+ {true,true}=St1 -> St1;
+ {_Used,Shad} -> {vu_expr(V, Size),Shad}
+ end
+ end, St, Ss).
+
+%% vu_var_list(VarName, [Var]) -> true | false.
+
+vu_var_list(V, Vs) ->
+ lists:any(fun (#c_var{name=V2}) -> V =:= V2 end, Vs).
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/core_lint.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/core_lint.erl
new file mode 100644
index 0000000000..773d1e53c8
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/core_lint.erl
@@ -0,0 +1,515 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: core_lint.erl,v 1.1 2008/12/17 09:53:42 mikpe Exp $
+%%
+%% Purpose : Do necessary checking of Core Erlang code.
+
+%% Check Core module for errors. Seeing this module is used in the
+%% compiler after optimisations wedone more checking than would be
+%% necessary after just parsing. Don't check all constructs.
+%%
+%% We check the following:
+%%
+%% All referred functions, called and exported, are defined.
+%% Format of export list.
+%% Format of attributes
+%% Used variables are defined.
+%% Variables in let and funs.
+%% Patterns case clauses.
+%% Values only as multiple values/variables/patterns.
+%% Return same number of values as requested
+%% Correct number of arguments
+%%
+%% Checks to add:
+%%
+%% Consistency of values/variables
+%% Consistency of function return values/calls.
+%%
+%% We keep the names defined variables and functions in a ordered list
+%% of variable names and function name/arity pairs.
+
+-module(core_lint).
+
+
+-export([module/1,module/2,format_error/1]).
+
+-import(lists, [reverse/1,all/2,foldl/3]).
+-import(ordsets, [add_element/2,is_element/2,union/2]).
+%-import(ordsets, [subtract/2]).
+
+-include("core_parse.hrl").
+
+%% Define the lint state record.
+
+-record(lint, {module=[], %Current module
+ func=[], %Current function
+ errors=[], %Errors
+ warnings=[]}). %Warnings
+
+%% Keep track of defined
+-record(def, {vars=[],
+ funs=[]}).
+
+%%-deftype retcount() -> any | unknown | int().
+
+%% format_error(Error)
+%% Return a string describing the error.
+
+format_error(invalid_exports) -> "invalid exports";
+format_error(invalid_attributes) -> "invalid attributes";
+format_error({undefined_function,{F,A}}) ->
+ io_lib:format("function ~w/~w undefined", [F,A]);
+format_error({undefined_function,{F1,A1},{F2,A2}}) ->
+ io_lib:format("undefined function ~w/~w in ~w/~w", [F1,A1,F2,A2]);
+format_error({illegal_expr,{F,A}}) ->
+ io_lib:format("illegal expression in ~w/~w", [F,A]);
+format_error({illegal_guard,{F,A}}) ->
+ io_lib:format("illegal guard expression in ~w/~w", [F,A]);
+format_error({illegal_pattern,{F,A}}) ->
+ io_lib:format("illegal pattern in ~w/~w", [F,A]);
+format_error({illegal_try,{F,A}}) ->
+ io_lib:format("illegal try expression in ~w/~w", [F,A]);
+format_error({pattern_mismatch,{F,A}}) ->
+ io_lib:format("pattern count mismatch in ~w/~w", [F,A]);
+format_error({return_mismatch,{F,A}}) ->
+ io_lib:format("return count mismatch in ~w/~w", [F,A]);
+format_error({arg_mismatch,{F,A}}) ->
+ io_lib:format("argument count mismatch in ~w/~w", [F,A]);
+format_error({unbound_var,N,{F,A}}) ->
+ io_lib:format("unbound variable ~s in ~w/~w", [N,F,A]);
+format_error({duplicate_var,N,{F,A}}) ->
+ io_lib:format("duplicate variable ~s in ~w/~w", [N,F,A]);
+format_error({not_var,{F,A}}) ->
+ io_lib:format("expecting variable in ~w/~w", [F,A]);
+format_error({not_pattern,{F,A}}) ->
+ io_lib:format("expecting pattern in ~w/~w", [F,A]);
+format_error({not_bs_pattern,{F,A}}) ->
+ io_lib:format("expecting bit syntax pattern in ~w/~w", [F,A]).
+
+%% module(CoreMod) ->
+%% module(CoreMod, [CompileOption]) ->
+%% {ok,[Warning]} | {error,[Error],[Warning]}
+
+module(M) -> module(M, []).
+
+module(#c_module{name=M,exports=Es,attrs=As,defs=Ds}, _Opts) ->
+ Defined = defined_funcs(Ds),
+ St0 = #lint{module=M#c_atom.val},
+ St1 = check_exports(Es, St0),
+ St2 = check_attrs(As, St1),
+ St3 = module_defs(Ds, Defined, St2),
+ St4 = check_state(Es, Defined, St3),
+ return_status(St4).
+
+%% defined_funcs([FuncDef]) -> [Fname].
+
+defined_funcs(Fs) ->
+ foldl(fun (#c_def{name=#c_fname{id=I,arity=A}}, Def) ->
+ add_element({I,A}, Def)
+ end, [], Fs).
+
+%% return_status(State) ->
+%% {ok,[Warning]} | {error,[Error],[Warning]}
+%% Pack errors and warnings properly and return ok | error.
+
+return_status(St) ->
+ Ws = reverse(St#lint.warnings),
+ case reverse(St#lint.errors) of
+ [] -> {ok,[{St#lint.module,Ws}]};
+ Es -> {error,[{St#lint.module,Es}],[{St#lint.module,Ws}]}
+ end.
+
+%% add_error(ErrorDescriptor, State) -> State'
+%% add_warning(ErrorDescriptor, State) -> State'
+%% Note that we don't use line numbers here.
+
+add_error(E, St) -> St#lint{errors=[{none,core_lint,E}|St#lint.errors]}.
+
+%%add_warning(W, St) -> St#lint{warnings=[{none,core_lint,W}|St#lint.warnings]}.
+
+check_exports(Es, St) ->
+ case all(fun (#c_fname{id=Name,arity=Arity}) when
+ atom(Name), integer(Arity) -> true;
+ (_) -> false
+ end, Es) of
+ true -> St;
+ false -> add_error(invalid_exports, St)
+ end.
+
+check_attrs(As, St) ->
+ case all(fun (#c_def{name=#c_atom{},val=V}) -> core_lib:is_literal(V);
+ (_) -> false
+ end, As) of
+ true -> St;
+ false -> add_error(invalid_attributes, St)
+ end.
+
+check_state(Es, Defined, St) ->
+ foldl(fun (#c_fname{id=N,arity=A}, St1) ->
+ F = {N,A},
+ case is_element(F, Defined) of
+ true -> St1;
+ false -> add_error({undefined_function,F}, St)
+ end
+ end, St, Es).
+% Undef = subtract(Es, Defined),
+% St1 = foldl(fun (F, St) -> add_error({undefined_function,F}, St) end,
+% St0, Undef),
+% St1.
+
+%% module_defs(CoreBody, Defined, State) -> State.
+
+module_defs(B, Def, St) ->
+ %% Set top level function name.
+ foldl(fun (Func, St0) ->
+ #c_fname{id=F,arity=A} = Func#c_def.name,
+ St1 = St0#lint{func={F,A}},
+ function(Func, Def, St1)
+ end, St, B).
+
+%% functions([Fdef], Defined, State) -> State.
+
+functions(Fs, Def, St0) ->
+ foldl(fun (F, St) -> function(F, Def, St) end, St0, Fs).
+
+%% function(CoreFunc, Defined, State) -> State.
+
+function(#c_def{name=#c_fname{},val=B}, Def, St) ->
+ %% Body must be a fun!
+ case B of
+ #c_fun{} -> expr(B, Def, any, St);
+ _ -> add_error({illegal_expr,St#lint.func}, St)
+ end.
+
+%% body(Expr, Defined, RetCount, State) -> State.
+
+body(#c_values{es=Es}, Def, Rt, St) ->
+ return_match(Rt, length(Es), expr_list(Es, Def, St));
+body(E, Def, Rt, St0) ->
+ St1 = expr(E, Def, Rt, St0),
+ case core_lib:is_simple_top(E) of
+ true -> return_match(Rt, 1, St1);
+ false -> St1
+ end.
+
+%% guard(Expr, Defined, State) -> State.
+%% Guards are boolean expressions with test wrapped in a protected.
+
+guard(Expr, Def, St) -> gexpr(Expr, Def, 1, St).
+
+%% guard_list([Expr], Defined, State) -> State.
+
+%% guard_list(Es, Def, St0) ->
+%% foldl(fun (E, St) -> guard(E, Def, St) end, St0, Es).
+
+%% gbody(Expr, Defined, RetCount, State) -> State.
+
+gbody(#c_values{es=Es}, Def, Rt, St) ->
+ return_match(Rt, length(Es), gexpr_list(Es, Def, St));
+gbody(E, Def, Rt, St0) ->
+ St1 = gexpr(E, Def, Rt, St0),
+ case core_lib:is_simple_top(E) of
+ true -> return_match(Rt, 1, St1);
+ false -> St1
+ end.
+
+gexpr(#c_var{name=N}, Def, _Rt, St) -> expr_var(N, Def, St);
+gexpr(#c_int{}, _Def, _Rt, St) -> St;
+gexpr(#c_float{}, _Def, _Rt, St) -> St;
+gexpr(#c_atom{}, _Def, _Rt, St) -> St;
+gexpr(#c_char{}, _Def, _Rt, St) -> St;
+gexpr(#c_string{}, _Def, _Rt, St) -> St;
+gexpr(#c_nil{}, _Def, _Rt, St) -> St;
+gexpr(#c_cons{hd=H,tl=T}, Def, _Rt, St) ->
+ gexpr_list([H,T], Def, St);
+gexpr(#c_tuple{es=Es}, Def, _Rt, St) ->
+ gexpr_list(Es, Def, St);
+gexpr(#c_binary{segments=Ss}, Def, _Rt, St) ->
+ gbitstr_list(Ss, Def, St);
+gexpr(#c_seq{arg=Arg,body=B}, Def, Rt, St0) ->
+ St1 = gexpr(Arg, Def, any, St0), %Ignore values
+ gbody(B, Def, Rt, St1);
+gexpr(#c_let{vars=Vs,arg=Arg,body=B}, Def, Rt, St0) ->
+ St1 = gbody(Arg, Def, let_varcount(Vs), St0), %This is a guard body
+ {Lvs,St2} = variable_list(Vs, St1),
+ gbody(B, union(Lvs, Def), Rt, St2);
+gexpr(#c_call{module=#c_atom{val=erlang},
+ name=#c_atom{},
+ args=As}, Def, 1, St) ->
+ gexpr_list(As, Def, St);
+gexpr(#c_primop{name=N,args=As}, Def, _Rt, St0) when record(N, c_atom) ->
+ gexpr_list(As, Def, St0);
+gexpr(#c_try{arg=E,vars=[#c_var{name=X}],body=#c_var{name=X},
+ evars=[#c_var{},#c_var{},#c_var{}],handler=#c_atom{val=false}},
+ Def, Rt, St) ->
+ gbody(E, Def, Rt, St);
+gexpr(_, _, _, St) ->
+ add_error({illegal_guard,St#lint.func}, St).
+
+%% gexpr_list([Expr], Defined, State) -> State.
+
+gexpr_list(Es, Def, St0) ->
+ foldl(fun (E, St) -> gexpr(E, Def, 1, St) end, St0, Es).
+
+%% gbitstr_list([Elem], Defined, State) -> State.
+
+gbitstr_list(Es, Def, St0) ->
+ foldl(fun (E, St) -> gbitstr(E, Def, St) end, St0, Es).
+
+gbitstr(#c_bitstr{val=V,size=S,unit=U,type=T,flags=Fs}, Def, St0) ->
+ St1 = bit_type(U, T, Fs, St0),
+ gexpr_list([V,S], Def, St1).
+
+%% expr(Expr, Defined, RetCount, State) -> State.
+
+expr(#c_var{name=N}, Def, _Rt, St) -> expr_var(N, Def, St);
+expr(#c_int{}, _Def, _Rt, St) -> St;
+expr(#c_float{}, _Def, _Rt, St) -> St;
+expr(#c_atom{}, _Def, _Rt, St) -> St;
+expr(#c_char{}, _Def, _Rt, St) -> St;
+expr(#c_string{}, _Def, _Rt, St) -> St;
+expr(#c_nil{}, _Def, _Rt, St) -> St;
+expr(#c_cons{hd=H,tl=T}, Def, _Rt, St) ->
+ expr_list([H,T], Def, St);
+expr(#c_tuple{es=Es}, Def, _Rt, St) ->
+ expr_list(Es, Def, St);
+expr(#c_binary{segments=Ss}, Def, _Rt, St) ->
+ bitstr_list(Ss, Def, St);
+expr(#c_fname{id=I,arity=A}, Def, _Rt, St) ->
+ expr_fname({I,A}, Def, St);
+expr(#c_fun{vars=Vs,body=B}, Def, Rt, St0) ->
+ {Vvs,St1} = variable_list(Vs, St0),
+ return_match(Rt, 1, body(B, union(Vvs, Def), any, St1));
+expr(#c_seq{arg=Arg,body=B}, Def, Rt, St0) ->
+ St1 = expr(Arg, Def, any, St0), %Ignore values
+ body(B, Def, Rt, St1);
+expr(#c_let{vars=Vs,arg=Arg,body=B}, Def, Rt, St0) ->
+ St1 = body(Arg, Def, let_varcount(Vs), St0), %This is a body
+ {Lvs,St2} = variable_list(Vs, St1),
+ body(B, union(Lvs, Def), Rt, St2);
+expr(#c_letrec{defs=Fs,body=B}, Def0, Rt, St0) ->
+ Def1 = union(defined_funcs(Fs), Def0), %All defined stuff
+ St1 = functions(Fs, Def1, St0),
+ body(B, Def1, Rt, St1#lint{func=St0#lint.func});
+expr(#c_case{arg=Arg,clauses=Cs}, Def, Rt, St0) ->
+ Pc = case_patcount(Cs),
+ St1 = body(Arg, Def, Pc, St0),
+ clauses(Cs, Def, Pc, Rt, St1);
+expr(#c_receive{clauses=Cs,timeout=T,action=A}, Def, Rt, St0) ->
+ St1 = expr(T, Def, 1, St0),
+ St2 = body(A, Def, Rt, St1),
+ clauses(Cs, Def, 1, Rt, St2);
+expr(#c_apply{op=Op,args=As}, Def, _Rt, St0) ->
+ St1 = apply_op(Op, Def, length(As), St0),
+ expr_list(As, Def, St1);
+expr(#c_call{module=M,name=N,args=As}, Def, _Rt, St0) ->
+ St1 = expr(M, Def, 1, St0),
+ St2 = expr(N, Def, 1, St1),
+ expr_list(As, Def, St2);
+expr(#c_primop{name=N,args=As}, Def, _Rt, St0) when record(N, c_atom) ->
+ expr_list(As, Def, St0);
+expr(#c_catch{body=B}, Def, Rt, St) ->
+ return_match(Rt, 1, body(B, Def, 1, St));
+expr(#c_try{arg=A,vars=Vs,body=B,evars=Evs,handler=H}, Def, Rt, St0) ->
+ St1 = case length(Evs) of
+ 2 -> St0;
+ _ -> add_error({illegal_try,St0#lint.func}, St0)
+ end,
+ St2 = body(A, Def, let_varcount(Vs), St1),
+ {Ns,St3} = variable_list(Vs, St2),
+ St4 = body(B, union(Ns, Def), Rt, St3),
+ {Ens,St5} = variable_list(Evs, St4),
+ body(H, union(Ens, Def), Rt, St5);
+expr(_, _, _, St) ->
+ %%io:fwrite("clint: ~p~n", [Other]),
+ add_error({illegal_expr,St#lint.func}, St).
+
+%% expr_list([Expr], Defined, State) -> State.
+
+expr_list(Es, Def, St0) ->
+ foldl(fun (E, St) -> expr(E, Def, 1, St) end, St0, Es).
+
+%% bitstr_list([Elem], Defined, State) -> State.
+
+bitstr_list(Es, Def, St0) ->
+ foldl(fun (E, St) -> bitstr(E, Def, St) end, St0, Es).
+
+bitstr(#c_bitstr{val=V,size=S,unit=U,type=T,flags=Fs}, Def, St0) ->
+ St1 = bit_type(U, T, Fs, St0),
+ expr_list([V,S], Def, St1).
+
+%% apply_op(Op, Defined, ArgCount, State) -> State.
+%% A apply op is either an fname or an expression.
+
+apply_op(#c_fname{id=I,arity=A}, Def, Ac, St0) ->
+ St1 = expr_fname({I,A}, Def, St0),
+ arg_match(Ac, A, St1);
+apply_op(E, Def, _, St) -> expr(E, Def, 1, St). %Hard to check
+
+%% expr_var(VarName, Defined, State) -> State.
+
+expr_var(N, Def, St) ->
+ case is_element(N, Def) of
+ true -> St;
+ false -> add_error({unbound_var,N,St#lint.func}, St)
+ end.
+
+%% expr_fname(Fname, Defined, State) -> State.
+
+expr_fname(Fname, Def, St) ->
+ case is_element(Fname, Def) of
+ true -> St;
+ false -> add_error({undefined_function,Fname,St#lint.func}, St)
+ end.
+
+%% let_varcount([Var]) -> int().
+
+let_varcount([]) -> any; %Ignore values
+let_varcount(Es) -> length(Es).
+
+%% case_patcount([Clause]) -> int().
+
+case_patcount([#c_clause{pats=Ps}|_]) -> length(Ps).
+
+%% clauses([Clause], Defined, PatCount, RetCount, State) -> State.
+
+clauses(Cs, Def, Pc, Rt, St0) ->
+ foldl(fun (C, St) -> clause(C, Def, Pc, Rt, St) end, St0, Cs).
+
+%% clause(Clause, Defined, PatCount, RetCount, State) -> State.
+
+clause(#c_clause{pats=Ps,guard=G,body=B}, Def0, Pc, Rt, St0) ->
+ St1 = pattern_match(Pc, length(Ps), St0),
+ {Pvs,St2} = pattern_list(Ps, Def0, St1),
+ Def1 = union(Pvs, Def0),
+ St3 = guard(G, Def1, St2),
+ body(B, Def1, Rt, St3).
+
+%% variable(Var, [PatVar], State) -> {[VarName],State}.
+
+variable(#c_var{name=N}, Ps, St) ->
+ case is_element(N, Ps) of
+ true -> {[],add_error({duplicate_var,N,St#lint.func}, St)};
+ false -> {[N],St}
+ end;
+variable(_, Def, St) -> {Def,add_error({not_var,St#lint.func}, St)}.
+
+%% variable_list([Var], State) -> {[Var],State}.
+%% variable_list([Var], [PatVar], State) -> {[Var],State}.
+
+variable_list(Vs, St) -> variable_list(Vs, [], St).
+
+variable_list(Vs, Ps, St) ->
+ foldl(fun (V, {Ps0,St0}) ->
+ {Vvs,St1} = variable(V, Ps0, St0),
+ {union(Vvs, Ps0),St1}
+ end, {Ps,St}, Vs).
+
+%% pattern(Pattern, Defined, State) -> {[PatVar],State}.
+%% pattern(Pattern, Defined, [PatVar], State) -> {[PatVar],State}.
+%% Patterns are complicated by sizes in binaries. These are pure
+%% input variables which create no bindings. We, therefor, need to
+%% carry around the original defined variables to get the correct
+%% handling.
+
+%% pattern(P, Def, St) -> pattern(P, Def, [], St).
+
+pattern(#c_var{name=N}, Def, Ps, St) ->
+ pat_var(N, Def, Ps, St);
+pattern(#c_int{}, _Def, Ps, St) -> {Ps,St};
+pattern(#c_float{}, _Def, Ps, St) -> {Ps,St};
+pattern(#c_atom{}, _Def, Ps, St) -> {Ps,St};
+pattern(#c_char{}, _Def, Ps, St) -> {Ps,St};
+pattern(#c_string{}, _Def, Ps, St) -> {Ps,St};
+pattern(#c_nil{}, _Def, Ps, St) -> {Ps,St};
+pattern(#c_cons{hd=H,tl=T}, Def, Ps, St) ->
+ pattern_list([H,T], Def, Ps, St);
+pattern(#c_tuple{es=Es}, Def, Ps, St) ->
+ pattern_list(Es, Def, Ps, St);
+pattern(#c_binary{segments=Ss}, Def, Ps, St) ->
+ pat_bin(Ss, Def, Ps, St);
+pattern(#c_alias{var=V,pat=P}, Def, Ps, St0) ->
+ {Vvs,St1} = variable(V, Ps, St0),
+ pattern(P, Def, union(Vvs, Ps), St1);
+pattern(_, _, Ps, St) -> {Ps,add_error({not_pattern,St#lint.func}, St)}.
+
+pat_var(N, _Def, Ps, St) ->
+ case is_element(N, Ps) of
+ true -> {Ps,add_error({duplicate_var,N,St#lint.func}, St)};
+ false -> {add_element(N, Ps),St}
+ end.
+
+%% pat_bin_list([Elem], Defined, [PatVar], State) -> {[PatVar],State}.
+
+pat_bin(Es, Def, Ps0, St0) ->
+ foldl(fun (E, {Ps,St}) -> pat_segment(E, Def, Ps, St) end, {Ps0,St0}, Es).
+
+pat_segment(#c_bitstr{val=V,size=S,unit=U,type=T,flags=Fs}, Def, Ps, St0) ->
+ St1 = bit_type(U, T, Fs, St0),
+ St2 = pat_bit_expr(S, T, Def, St1),
+ pattern(V, Def, Ps, St2);
+pat_segment(_, _, Ps, St) ->
+ {Ps,add_error({not_bs_pattern,St#lint.func}, St)}.
+
+%% pat_bit_expr(SizePat, Type, Defined, State) -> State.
+%% Check the Size pattern, this is an input! Be a bit tough here.
+
+pat_bit_expr(#c_int{val=I}, _, _, St) when I >= 0 -> St;
+pat_bit_expr(#c_var{name=N}, _, Def, St) ->
+ expr_var(N, Def, St);
+pat_bit_expr(#c_atom{val=all}, binary, _Def, St) -> St;
+pat_bit_expr(_, _, _, St) ->
+ add_error({illegal_expr,St#lint.func}, St).
+
+bit_type(Unit, Type, Flags, St) ->
+ U = core_lib:literal_value(Unit),
+ T = core_lib:literal_value(Type),
+ Fs = core_lib:literal_value(Flags),
+ case erl_bits:set_bit_type(default, [T,{unit,U}|Fs]) of
+ {ok,_,_} -> St;
+ {error,E} -> add_error({E,St#lint.func}, St)
+ end.
+
+%% pattern_list([Var], Defined, State) -> {[PatVar],State}.
+%% pattern_list([Var], Defined, [PatVar], State) -> {[PatVar],State}.
+
+pattern_list(Pats, Def, St) -> pattern_list(Pats, Def, [], St).
+
+pattern_list(Pats, Def, Ps0, St0) ->
+ foldl(fun (P, {Ps,St}) -> pattern(P, Def, Ps, St) end, {Ps0,St0}, Pats).
+
+%% pattern_match(Required, Supplied, State) -> State.
+%% Check that the required number of patterns match the supplied.
+
+pattern_match(N, N, St) -> St;
+pattern_match(_Req, _Sup, St) ->
+ add_error({pattern_mismatch,St#lint.func}, St).
+
+%% return_match(Required, Supplied, State) -> State.
+%% Check that the required number of return values match the supplied.
+
+return_match(any, _Sup, St) -> St;
+return_match(_Req, unknown, St) -> St;
+return_match(N, N, St) -> St;
+return_match(_Req, _Sup, St) ->
+ add_error({return_mismatch,St#lint.func}, St).
+
+%% arg_match(Required, Supplied, State) -> State.
+
+arg_match(_Req, unknown, St) -> St;
+arg_match(N, N, St) -> St;
+arg_match(_Req, _Sup, St) ->
+ add_error({arg_mismatch,St#lint.func}, St).
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/core_parse.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/core_parse.erl
new file mode 100644
index 0000000000..77c33c561b
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/core_parse.erl
@@ -0,0 +1,4909 @@
+-module(core_parse).
+-define(THIS_MODULE, core_parse).
+-export([parse/1, parse_and_scan/1, format_error/1]).
+
+-export([abstract/1,abstract/2,normalise/1]).
+
+%% The following directive is needed for (significantly) faster compilation
+%% of the generated .erl file by the HiPE compiler. Please do not remove.
+-compile([{hipe,[{regalloc,linear_scan}]}]).
+
+-include("core_parse.hrl").
+
+tok_val(T) -> element(3, T).
+tok_line(T) -> element(2, T).
+
+abstract(T, _N) -> abstract(T).
+
+abstract(Term) -> core_lib:make_literal(Term).
+
+normalise(Core) -> core_lib:literal_value(Core).
+
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: core_parse.erl,v 1.1 2008/12/17 09:53:42 mikpe Exp $
+%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% The parser generator will insert appropriate declarations before this line.%
+
+parse(Tokens) ->
+ case catch yeccpars1(Tokens, false, 0, [], []) of
+ error ->
+ Errorline =
+ if Tokens == [] -> 0; true -> element(2, hd(Tokens)) end,
+ {error,
+ {Errorline, ?THIS_MODULE, "syntax error at or after this line."}};
+ Other ->
+ Other
+ end.
+
+parse_and_scan({Mod, Fun, Args}) ->
+ case apply(Mod, Fun, Args) of
+ {eof, _} ->
+ {ok, eof};
+ {error, Descriptor, _} ->
+ {error, Descriptor};
+ {ok, Tokens, _} ->
+ yeccpars1(Tokens, {Mod, Fun, Args}, 0, [], [])
+ end.
+
+format_error(Message) ->
+ case io_lib:deep_char_list(Message) of
+ true ->
+ Message;
+ _ ->
+ io_lib:write(Message)
+ end.
+
+% To be used in grammar files to throw an error message to the parser toplevel.
+% Doesn't have to be exported!
+return_error(Line, Message) ->
+ throw({error, {Line, ?THIS_MODULE, Message}}).
+
+
+% Don't change yeccpars1/6 too much, it is called recursively by yeccpars2/8!
+yeccpars1([Token | Tokens], Tokenizer, State, States, Vstack) ->
+ yeccpars2(State, element(1, Token), States, Vstack, Token, Tokens,
+ Tokenizer);
+yeccpars1([], {M, F, A}, State, States, Vstack) ->
+ case catch apply(M, F, A) of
+ {eof, Endline} ->
+ {error, {Endline, ?THIS_MODULE, "end_of_file"}};
+ {error, Descriptor, _Endline} ->
+ {error, Descriptor};
+ {'EXIT', Reason} ->
+ {error, {0, ?THIS_MODULE, Reason}};
+ {ok, Tokens, _Endline} ->
+ case catch yeccpars1(Tokens, {M, F, A}, State, States, Vstack) of
+ error ->
+ Errorline = element(2, hd(Tokens)),
+ {error, {Errorline, ?THIS_MODULE,
+ "syntax error at or after this line."}};
+ Other ->
+ Other
+ end
+ end;
+yeccpars1([], false, State, States, Vstack) ->
+ yeccpars2(State, '$end', States, Vstack, {'$end', 999999}, [], false).
+
+% For internal use only.
+yeccerror(Token) ->
+ {error,
+ {element(2, Token), ?THIS_MODULE,
+ ["syntax error before: ", yecctoken2string(Token)]}}.
+
+yecctoken2string({atom, _, A}) -> io_lib:write(A);
+yecctoken2string({integer,_,N}) -> io_lib:write(N);
+yecctoken2string({float,_,F}) -> io_lib:write(F);
+yecctoken2string({char,_,C}) -> io_lib:write_char(C);
+yecctoken2string({var,_,V}) -> io_lib:format('~s', [V]);
+yecctoken2string({string,_,S}) -> io_lib:write_string(S);
+yecctoken2string({reserved_symbol, _, A}) -> io_lib:format('~w', [A]);
+yecctoken2string({_Cat, _, Val}) -> io_lib:format('~w', [Val]);
+
+yecctoken2string({'dot', _}) -> io_lib:format('~w', ['.']);
+yecctoken2string({'$end', _}) ->
+ [];
+yecctoken2string({Other, _}) when atom(Other) ->
+ io_lib:format('~w', [Other]);
+yecctoken2string(Other) ->
+ io_lib:write(Other).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+yeccpars2(0, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 1, [0 | __Ss], [__T | __Stack]);
+yeccpars2(0, 'module', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 2, [0 | __Ss], [__T | __Stack]);
+yeccpars2(0, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(1, 'module', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 313, [1 | __Ss], [__T | __Stack]);
+yeccpars2(1, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(2, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 4, [2 | __Ss], [__T | __Stack]);
+yeccpars2(2, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(3, '$end', _, __Stack, _, _, _) ->
+ {ok, hd(__Stack)};
+yeccpars2(3, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(4, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 5, [4 | __Ss], [__T | __Stack]);
+yeccpars2(4, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(5, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 11, [5 | __Ss], [__T | __Stack]);
+yeccpars2(5, ']', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 306, [5 | __Ss], [__T | __Stack]);
+yeccpars2(5, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(6, 'attributes', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 7, [6 | __Ss], [__T | __Stack]);
+yeccpars2(6, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(7, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 276, [7 | __Ss], [__T | __Stack]);
+yeccpars2(7, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(8, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 9, [8 | __Ss], [__T | __Stack]);
+yeccpars2(8, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 11, [8 | __Ss], [__T | __Stack]);
+yeccpars2(8, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ __Val = [],
+ yeccpars2(13, __Cat, [8 | __Ss], [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(9, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 11, [9 | __Ss], [__T | __Stack]);
+yeccpars2(9, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(10, '=', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 20, [10 | __Ss], [__T | __Stack]);
+yeccpars2(10, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(11, '/', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 18, [11 | __Ss], [__T | __Stack]);
+yeccpars2(11, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(12, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 9, [12 | __Ss], [__T | __Stack]);
+yeccpars2(12, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 11, [12 | __Ss], [__T | __Stack]);
+yeccpars2(12, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ __Val = [],
+ yeccpars2(17, __Cat, [12 | __Ss], [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(13, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(module_defs, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(14, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(anno_function_name, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(15, 'end', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 16, [15 | __Ss], [__T | __Stack]);
+yeccpars2(15, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(16, __Cat, __Ss, [__6,__5,__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_module{name = #c_atom{val = tok_val(__2)}, exports = __3, attrs = __4, defs = __5},
+ __Nss = lists:nthtail(5, __Ss),
+ yeccpars2(yeccgoto(module_definition, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(17, __Cat, __Ss, [__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__1|__2],
+ __Nss = lists:nthtail(1, __Ss),
+ yeccpars2(yeccgoto(function_definitions, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(18, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 19, [18 | __Ss], [__T | __Stack]);
+yeccpars2(18, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(19, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_fname{id = tok_val(__1), arity = tok_val(__3)},
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(function_name, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(20, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [20 | __Ss], [__T | __Stack]);
+yeccpars2(20, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 21, [20 | __Ss], [__T | __Stack]);
+yeccpars2(20, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(21, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [21 | __Ss], [__T | __Stack]);
+yeccpars2(21, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(22, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_def{name = __1, val = __3},
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(function_definition, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(23, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 25, [23 | __Ss], [__T | __Stack]);
+yeccpars2(23, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(24, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(anno_fun, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(25, ')', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 27, [25 | __Ss], [__T | __Stack]);
+yeccpars2(25, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 26, [25 | __Ss], [__T | __Stack]);
+yeccpars2(25, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [25 | __Ss], [__T | __Stack]);
+yeccpars2(25, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(26, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [26 | __Ss], [__T | __Stack]);
+yeccpars2(26, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(27, '->', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 265, [27 | __Ss], [__T | __Stack]);
+yeccpars2(27, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(28, ',', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 263, [28 | __Ss], [__T | __Stack]);
+yeccpars2(28, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__1],
+ yeccpars2(yeccgoto(anno_variables, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(29, ')', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 32, [29 | __Ss], [__T | __Stack]);
+yeccpars2(29, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(30, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_var{name = tok_val(__1)},
+ yeccpars2(yeccgoto(variable, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(31, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(anno_variable, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(32, '->', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 33, [32 | __Ss], [__T | __Stack]);
+yeccpars2(32, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(33, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [33 | __Ss], [__T | __Stack]);
+yeccpars2(33, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [33 | __Ss], [__T | __Stack]);
+yeccpars2(33, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [33 | __Ss], [__T | __Stack]);
+yeccpars2(33, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [33 | __Ss], [__T | __Stack]);
+yeccpars2(33, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [33 | __Ss], [__T | __Stack]);
+yeccpars2(33, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [33 | __Ss], [__T | __Stack]);
+yeccpars2(33, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [33 | __Ss], [__T | __Stack]);
+yeccpars2(33, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [33 | __Ss], [__T | __Stack]);
+yeccpars2(33, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [33 | __Ss], [__T | __Stack]);
+yeccpars2(33, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [33 | __Ss], [__T | __Stack]);
+yeccpars2(33, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [33 | __Ss], [__T | __Stack]);
+yeccpars2(33, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [33 | __Ss], [__T | __Stack]);
+yeccpars2(33, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [33 | __Ss], [__T | __Stack]);
+yeccpars2(33, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [33 | __Ss], [__T | __Stack]);
+yeccpars2(33, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [33 | __Ss], [__T | __Stack]);
+yeccpars2(33, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [33 | __Ss], [__T | __Stack]);
+yeccpars2(33, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [33 | __Ss], [__T | __Stack]);
+yeccpars2(33, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [33 | __Ss], [__T | __Stack]);
+yeccpars2(33, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [33 | __Ss], [__T | __Stack]);
+yeccpars2(33, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [33 | __Ss], [__T | __Stack]);
+yeccpars2(33, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [33 | __Ss], [__T | __Stack]);
+yeccpars2(33, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [33 | __Ss], [__T | __Stack]);
+yeccpars2(33, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(34, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 247, [34 | __Ss], [__T | __Stack]);
+yeccpars2(34, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(35, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [35 | __Ss], [__T | __Stack]);
+yeccpars2(35, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [35 | __Ss], [__T | __Stack]);
+yeccpars2(35, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [35 | __Ss], [__T | __Stack]);
+yeccpars2(35, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [35 | __Ss], [__T | __Stack]);
+yeccpars2(35, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [35 | __Ss], [__T | __Stack]);
+yeccpars2(35, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [35 | __Ss], [__T | __Stack]);
+yeccpars2(35, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [35 | __Ss], [__T | __Stack]);
+yeccpars2(35, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [35 | __Ss], [__T | __Stack]);
+yeccpars2(35, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [35 | __Ss], [__T | __Stack]);
+yeccpars2(35, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [35 | __Ss], [__T | __Stack]);
+yeccpars2(35, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [35 | __Ss], [__T | __Stack]);
+yeccpars2(35, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [35 | __Ss], [__T | __Stack]);
+yeccpars2(35, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [35 | __Ss], [__T | __Stack]);
+yeccpars2(35, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [35 | __Ss], [__T | __Stack]);
+yeccpars2(35, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [35 | __Ss], [__T | __Stack]);
+yeccpars2(35, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [35 | __Ss], [__T | __Stack]);
+yeccpars2(35, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [35 | __Ss], [__T | __Stack]);
+yeccpars2(35, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [35 | __Ss], [__T | __Stack]);
+yeccpars2(35, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [35 | __Ss], [__T | __Stack]);
+yeccpars2(35, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [35 | __Ss], [__T | __Stack]);
+yeccpars2(35, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [35 | __Ss], [__T | __Stack]);
+yeccpars2(35, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(36, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [36 | __Ss], [__T | __Stack]);
+yeccpars2(36, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [36 | __Ss], [__T | __Stack]);
+yeccpars2(36, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [36 | __Ss], [__T | __Stack]);
+yeccpars2(36, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [36 | __Ss], [__T | __Stack]);
+yeccpars2(36, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [36 | __Ss], [__T | __Stack]);
+yeccpars2(36, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [36 | __Ss], [__T | __Stack]);
+yeccpars2(36, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [36 | __Ss], [__T | __Stack]);
+yeccpars2(36, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [36 | __Ss], [__T | __Stack]);
+yeccpars2(36, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [36 | __Ss], [__T | __Stack]);
+yeccpars2(36, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [36 | __Ss], [__T | __Stack]);
+yeccpars2(36, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [36 | __Ss], [__T | __Stack]);
+yeccpars2(36, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [36 | __Ss], [__T | __Stack]);
+yeccpars2(36, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [36 | __Ss], [__T | __Stack]);
+yeccpars2(36, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [36 | __Ss], [__T | __Stack]);
+yeccpars2(36, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [36 | __Ss], [__T | __Stack]);
+yeccpars2(36, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [36 | __Ss], [__T | __Stack]);
+yeccpars2(36, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [36 | __Ss], [__T | __Stack]);
+yeccpars2(36, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [36 | __Ss], [__T | __Stack]);
+yeccpars2(36, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [36 | __Ss], [__T | __Stack]);
+yeccpars2(36, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [36 | __Ss], [__T | __Stack]);
+yeccpars2(36, '>', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 240, [36 | __Ss], [__T | __Stack]);
+yeccpars2(36, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [36 | __Ss], [__T | __Stack]);
+yeccpars2(36, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [36 | __Ss], [__T | __Stack]);
+yeccpars2(36, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(37, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [37 | __Ss], [__T | __Stack]);
+yeccpars2(37, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [37 | __Ss], [__T | __Stack]);
+yeccpars2(37, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [37 | __Ss], [__T | __Stack]);
+yeccpars2(37, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [37 | __Ss], [__T | __Stack]);
+yeccpars2(37, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [37 | __Ss], [__T | __Stack]);
+yeccpars2(37, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [37 | __Ss], [__T | __Stack]);
+yeccpars2(37, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [37 | __Ss], [__T | __Stack]);
+yeccpars2(37, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [37 | __Ss], [__T | __Stack]);
+yeccpars2(37, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [37 | __Ss], [__T | __Stack]);
+yeccpars2(37, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [37 | __Ss], [__T | __Stack]);
+yeccpars2(37, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [37 | __Ss], [__T | __Stack]);
+yeccpars2(37, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [37 | __Ss], [__T | __Stack]);
+yeccpars2(37, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [37 | __Ss], [__T | __Stack]);
+yeccpars2(37, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [37 | __Ss], [__T | __Stack]);
+yeccpars2(37, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [37 | __Ss], [__T | __Stack]);
+yeccpars2(37, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [37 | __Ss], [__T | __Stack]);
+yeccpars2(37, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [37 | __Ss], [__T | __Stack]);
+yeccpars2(37, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [37 | __Ss], [__T | __Stack]);
+yeccpars2(37, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [37 | __Ss], [__T | __Stack]);
+yeccpars2(37, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [37 | __Ss], [__T | __Stack]);
+yeccpars2(37, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [37 | __Ss], [__T | __Stack]);
+yeccpars2(37, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [37 | __Ss], [__T | __Stack]);
+yeccpars2(37, ']', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 149, [37 | __Ss], [__T | __Stack]);
+yeccpars2(37, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(38, __Cat, __Ss, [__6,__5,__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_fun{vars = __3, body = __6},
+ __Nss = lists:nthtail(5, __Ss),
+ yeccpars2(yeccgoto(fun_expr, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(39, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(single_expression, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(40, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [40 | __Ss], [__T | __Stack]);
+yeccpars2(40, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [40 | __Ss], [__T | __Stack]);
+yeccpars2(40, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [40 | __Ss], [__T | __Stack]);
+yeccpars2(40, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [40 | __Ss], [__T | __Stack]);
+yeccpars2(40, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [40 | __Ss], [__T | __Stack]);
+yeccpars2(40, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [40 | __Ss], [__T | __Stack]);
+yeccpars2(40, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [40 | __Ss], [__T | __Stack]);
+yeccpars2(40, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [40 | __Ss], [__T | __Stack]);
+yeccpars2(40, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [40 | __Ss], [__T | __Stack]);
+yeccpars2(40, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [40 | __Ss], [__T | __Stack]);
+yeccpars2(40, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [40 | __Ss], [__T | __Stack]);
+yeccpars2(40, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [40 | __Ss], [__T | __Stack]);
+yeccpars2(40, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [40 | __Ss], [__T | __Stack]);
+yeccpars2(40, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [40 | __Ss], [__T | __Stack]);
+yeccpars2(40, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [40 | __Ss], [__T | __Stack]);
+yeccpars2(40, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [40 | __Ss], [__T | __Stack]);
+yeccpars2(40, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [40 | __Ss], [__T | __Stack]);
+yeccpars2(40, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [40 | __Ss], [__T | __Stack]);
+yeccpars2(40, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [40 | __Ss], [__T | __Stack]);
+yeccpars2(40, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [40 | __Ss], [__T | __Stack]);
+yeccpars2(40, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [40 | __Ss], [__T | __Stack]);
+yeccpars2(40, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [40 | __Ss], [__T | __Stack]);
+yeccpars2(40, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(41, '/', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 18, [41 | __Ss], [__T | __Stack]);
+yeccpars2(41, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_atom{val = tok_val(__1)},
+ yeccpars2(yeccgoto(atomic_literal, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(42, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(single_expression, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(43, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(single_expression, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(44, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [44 | __Ss], [__T | __Stack]);
+yeccpars2(44, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [44 | __Ss], [__T | __Stack]);
+yeccpars2(44, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [44 | __Ss], [__T | __Stack]);
+yeccpars2(44, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [44 | __Ss], [__T | __Stack]);
+yeccpars2(44, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [44 | __Ss], [__T | __Stack]);
+yeccpars2(44, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [44 | __Ss], [__T | __Stack]);
+yeccpars2(44, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [44 | __Ss], [__T | __Stack]);
+yeccpars2(44, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [44 | __Ss], [__T | __Stack]);
+yeccpars2(44, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [44 | __Ss], [__T | __Stack]);
+yeccpars2(44, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [44 | __Ss], [__T | __Stack]);
+yeccpars2(44, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [44 | __Ss], [__T | __Stack]);
+yeccpars2(44, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [44 | __Ss], [__T | __Stack]);
+yeccpars2(44, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [44 | __Ss], [__T | __Stack]);
+yeccpars2(44, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [44 | __Ss], [__T | __Stack]);
+yeccpars2(44, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [44 | __Ss], [__T | __Stack]);
+yeccpars2(44, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [44 | __Ss], [__T | __Stack]);
+yeccpars2(44, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [44 | __Ss], [__T | __Stack]);
+yeccpars2(44, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [44 | __Ss], [__T | __Stack]);
+yeccpars2(44, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [44 | __Ss], [__T | __Stack]);
+yeccpars2(44, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [44 | __Ss], [__T | __Stack]);
+yeccpars2(44, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [44 | __Ss], [__T | __Stack]);
+yeccpars2(44, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [44 | __Ss], [__T | __Stack]);
+yeccpars2(44, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(45, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(single_expression, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(46, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [46 | __Ss], [__T | __Stack]);
+yeccpars2(46, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [46 | __Ss], [__T | __Stack]);
+yeccpars2(46, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [46 | __Ss], [__T | __Stack]);
+yeccpars2(46, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [46 | __Ss], [__T | __Stack]);
+yeccpars2(46, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [46 | __Ss], [__T | __Stack]);
+yeccpars2(46, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [46 | __Ss], [__T | __Stack]);
+yeccpars2(46, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [46 | __Ss], [__T | __Stack]);
+yeccpars2(46, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [46 | __Ss], [__T | __Stack]);
+yeccpars2(46, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [46 | __Ss], [__T | __Stack]);
+yeccpars2(46, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [46 | __Ss], [__T | __Stack]);
+yeccpars2(46, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [46 | __Ss], [__T | __Stack]);
+yeccpars2(46, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [46 | __Ss], [__T | __Stack]);
+yeccpars2(46, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [46 | __Ss], [__T | __Stack]);
+yeccpars2(46, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [46 | __Ss], [__T | __Stack]);
+yeccpars2(46, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [46 | __Ss], [__T | __Stack]);
+yeccpars2(46, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [46 | __Ss], [__T | __Stack]);
+yeccpars2(46, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [46 | __Ss], [__T | __Stack]);
+yeccpars2(46, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [46 | __Ss], [__T | __Stack]);
+yeccpars2(46, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [46 | __Ss], [__T | __Stack]);
+yeccpars2(46, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [46 | __Ss], [__T | __Stack]);
+yeccpars2(46, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [46 | __Ss], [__T | __Stack]);
+yeccpars2(46, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [46 | __Ss], [__T | __Stack]);
+yeccpars2(46, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(47, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(single_expression, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(48, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [48 | __Ss], [__T | __Stack]);
+yeccpars2(48, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [48 | __Ss], [__T | __Stack]);
+yeccpars2(48, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [48 | __Ss], [__T | __Stack]);
+yeccpars2(48, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [48 | __Ss], [__T | __Stack]);
+yeccpars2(48, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [48 | __Ss], [__T | __Stack]);
+yeccpars2(48, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [48 | __Ss], [__T | __Stack]);
+yeccpars2(48, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [48 | __Ss], [__T | __Stack]);
+yeccpars2(48, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [48 | __Ss], [__T | __Stack]);
+yeccpars2(48, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [48 | __Ss], [__T | __Stack]);
+yeccpars2(48, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [48 | __Ss], [__T | __Stack]);
+yeccpars2(48, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [48 | __Ss], [__T | __Stack]);
+yeccpars2(48, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [48 | __Ss], [__T | __Stack]);
+yeccpars2(48, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [48 | __Ss], [__T | __Stack]);
+yeccpars2(48, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [48 | __Ss], [__T | __Stack]);
+yeccpars2(48, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [48 | __Ss], [__T | __Stack]);
+yeccpars2(48, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [48 | __Ss], [__T | __Stack]);
+yeccpars2(48, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [48 | __Ss], [__T | __Stack]);
+yeccpars2(48, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [48 | __Ss], [__T | __Stack]);
+yeccpars2(48, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [48 | __Ss], [__T | __Stack]);
+yeccpars2(48, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [48 | __Ss], [__T | __Stack]);
+yeccpars2(48, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [48 | __Ss], [__T | __Stack]);
+yeccpars2(48, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [48 | __Ss], [__T | __Stack]);
+yeccpars2(48, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(49, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(single_expression, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(50, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_char{val = tok_val(__1)},
+ yeccpars2(yeccgoto(atomic_literal, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(51, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(single_expression, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(52, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [52 | __Ss], [__T | __Stack]);
+yeccpars2(52, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [52 | __Ss], [__T | __Stack]);
+yeccpars2(52, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [52 | __Ss], [__T | __Stack]);
+yeccpars2(52, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [52 | __Ss], [__T | __Stack]);
+yeccpars2(52, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [52 | __Ss], [__T | __Stack]);
+yeccpars2(52, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [52 | __Ss], [__T | __Stack]);
+yeccpars2(52, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [52 | __Ss], [__T | __Stack]);
+yeccpars2(52, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [52 | __Ss], [__T | __Stack]);
+yeccpars2(52, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [52 | __Ss], [__T | __Stack]);
+yeccpars2(52, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [52 | __Ss], [__T | __Stack]);
+yeccpars2(52, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [52 | __Ss], [__T | __Stack]);
+yeccpars2(52, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [52 | __Ss], [__T | __Stack]);
+yeccpars2(52, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [52 | __Ss], [__T | __Stack]);
+yeccpars2(52, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [52 | __Ss], [__T | __Stack]);
+yeccpars2(52, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [52 | __Ss], [__T | __Stack]);
+yeccpars2(52, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [52 | __Ss], [__T | __Stack]);
+yeccpars2(52, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [52 | __Ss], [__T | __Stack]);
+yeccpars2(52, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [52 | __Ss], [__T | __Stack]);
+yeccpars2(52, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [52 | __Ss], [__T | __Stack]);
+yeccpars2(52, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [52 | __Ss], [__T | __Stack]);
+yeccpars2(52, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [52 | __Ss], [__T | __Stack]);
+yeccpars2(52, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [52 | __Ss], [__T | __Stack]);
+yeccpars2(52, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(53, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(anno_expression, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(54, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_float{val = tok_val(__1)},
+ yeccpars2(yeccgoto(atomic_literal, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(55, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(single_expression, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(56, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(single_expression, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(57, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_int{val = tok_val(__1)},
+ yeccpars2(yeccgoto(atomic_literal, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(58, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 83, [58 | __Ss], [__T | __Stack]);
+yeccpars2(58, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 26, [58 | __Ss], [__T | __Stack]);
+yeccpars2(58, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [58 | __Ss], [__T | __Stack]);
+yeccpars2(58, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(59, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(single_expression, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(60, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 9, [60 | __Ss], [__T | __Stack]);
+yeccpars2(60, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 11, [60 | __Ss], [__T | __Stack]);
+yeccpars2(60, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ __Val = [],
+ yeccpars2(210, __Cat, [60 | __Ss], [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(61, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(single_expression, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(62, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_nil{},
+ yeccpars2(yeccgoto(atomic_literal, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(63, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 208, [63 | __Ss], [__T | __Stack]);
+yeccpars2(63, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(64, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(single_expression, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(65, 'after', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 99, [65 | __Ss], [__T | __Stack]);
+yeccpars2(65, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 97, [65 | __Ss], [__T | __Stack]);
+yeccpars2(65, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 96, [65 | __Ss], [__T | __Stack]);
+yeccpars2(65, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [65 | __Ss], [__T | __Stack]);
+yeccpars2(65, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 104, [65 | __Ss], [__T | __Stack]);
+yeccpars2(65, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [65 | __Ss], [__T | __Stack]);
+yeccpars2(65, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [65 | __Ss], [__T | __Stack]);
+yeccpars2(65, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [65 | __Ss], [__T | __Stack]);
+yeccpars2(65, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [65 | __Ss], [__T | __Stack]);
+yeccpars2(65, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 95, [65 | __Ss], [__T | __Stack]);
+yeccpars2(65, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 98, [65 | __Ss], [__T | __Stack]);
+yeccpars2(65, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 114, [65 | __Ss], [__T | __Stack]);
+yeccpars2(65, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(66, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(single_expression, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(67, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(single_expression, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(68, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(expression, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(69, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_string{val = tok_val(__1)},
+ yeccpars2(yeccgoto(atomic_literal, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(70, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [70 | __Ss], [__T | __Stack]);
+yeccpars2(70, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [70 | __Ss], [__T | __Stack]);
+yeccpars2(70, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [70 | __Ss], [__T | __Stack]);
+yeccpars2(70, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [70 | __Ss], [__T | __Stack]);
+yeccpars2(70, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [70 | __Ss], [__T | __Stack]);
+yeccpars2(70, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [70 | __Ss], [__T | __Stack]);
+yeccpars2(70, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [70 | __Ss], [__T | __Stack]);
+yeccpars2(70, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [70 | __Ss], [__T | __Stack]);
+yeccpars2(70, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [70 | __Ss], [__T | __Stack]);
+yeccpars2(70, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [70 | __Ss], [__T | __Stack]);
+yeccpars2(70, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [70 | __Ss], [__T | __Stack]);
+yeccpars2(70, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [70 | __Ss], [__T | __Stack]);
+yeccpars2(70, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [70 | __Ss], [__T | __Stack]);
+yeccpars2(70, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [70 | __Ss], [__T | __Stack]);
+yeccpars2(70, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [70 | __Ss], [__T | __Stack]);
+yeccpars2(70, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [70 | __Ss], [__T | __Stack]);
+yeccpars2(70, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [70 | __Ss], [__T | __Stack]);
+yeccpars2(70, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [70 | __Ss], [__T | __Stack]);
+yeccpars2(70, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [70 | __Ss], [__T | __Stack]);
+yeccpars2(70, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [70 | __Ss], [__T | __Stack]);
+yeccpars2(70, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [70 | __Ss], [__T | __Stack]);
+yeccpars2(70, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [70 | __Ss], [__T | __Stack]);
+yeccpars2(70, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(71, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(single_expression, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(72, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(single_expression, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(73, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(single_expression, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(74, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [74 | __Ss], [__T | __Stack]);
+yeccpars2(74, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [74 | __Ss], [__T | __Stack]);
+yeccpars2(74, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [74 | __Ss], [__T | __Stack]);
+yeccpars2(74, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [74 | __Ss], [__T | __Stack]);
+yeccpars2(74, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [74 | __Ss], [__T | __Stack]);
+yeccpars2(74, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [74 | __Ss], [__T | __Stack]);
+yeccpars2(74, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [74 | __Ss], [__T | __Stack]);
+yeccpars2(74, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [74 | __Ss], [__T | __Stack]);
+yeccpars2(74, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [74 | __Ss], [__T | __Stack]);
+yeccpars2(74, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [74 | __Ss], [__T | __Stack]);
+yeccpars2(74, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [74 | __Ss], [__T | __Stack]);
+yeccpars2(74, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [74 | __Ss], [__T | __Stack]);
+yeccpars2(74, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [74 | __Ss], [__T | __Stack]);
+yeccpars2(74, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [74 | __Ss], [__T | __Stack]);
+yeccpars2(74, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [74 | __Ss], [__T | __Stack]);
+yeccpars2(74, '}', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 77, [74 | __Ss], [__T | __Stack]);
+yeccpars2(74, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [74 | __Ss], [__T | __Stack]);
+yeccpars2(74, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [74 | __Ss], [__T | __Stack]);
+yeccpars2(74, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [74 | __Ss], [__T | __Stack]);
+yeccpars2(74, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [74 | __Ss], [__T | __Stack]);
+yeccpars2(74, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [74 | __Ss], [__T | __Stack]);
+yeccpars2(74, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [74 | __Ss], [__T | __Stack]);
+yeccpars2(74, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [74 | __Ss], [__T | __Stack]);
+yeccpars2(74, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(75, ',', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 79, [75 | __Ss], [__T | __Stack]);
+yeccpars2(75, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__1],
+ yeccpars2(yeccgoto(anno_expressions, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(76, '}', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 78, [76 | __Ss], [__T | __Stack]);
+yeccpars2(76, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(77, __Cat, __Ss, [__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_tuple{es = []},
+ __Nss = lists:nthtail(1, __Ss),
+ yeccpars2(yeccgoto(tuple, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(78, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_tuple{es = __2},
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(tuple, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(79, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [79 | __Ss], [__T | __Stack]);
+yeccpars2(79, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [79 | __Ss], [__T | __Stack]);
+yeccpars2(79, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [79 | __Ss], [__T | __Stack]);
+yeccpars2(79, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [79 | __Ss], [__T | __Stack]);
+yeccpars2(79, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [79 | __Ss], [__T | __Stack]);
+yeccpars2(79, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [79 | __Ss], [__T | __Stack]);
+yeccpars2(79, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [79 | __Ss], [__T | __Stack]);
+yeccpars2(79, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [79 | __Ss], [__T | __Stack]);
+yeccpars2(79, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [79 | __Ss], [__T | __Stack]);
+yeccpars2(79, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [79 | __Ss], [__T | __Stack]);
+yeccpars2(79, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [79 | __Ss], [__T | __Stack]);
+yeccpars2(79, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [79 | __Ss], [__T | __Stack]);
+yeccpars2(79, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [79 | __Ss], [__T | __Stack]);
+yeccpars2(79, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [79 | __Ss], [__T | __Stack]);
+yeccpars2(79, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [79 | __Ss], [__T | __Stack]);
+yeccpars2(79, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [79 | __Ss], [__T | __Stack]);
+yeccpars2(79, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [79 | __Ss], [__T | __Stack]);
+yeccpars2(79, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [79 | __Ss], [__T | __Stack]);
+yeccpars2(79, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [79 | __Ss], [__T | __Stack]);
+yeccpars2(79, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [79 | __Ss], [__T | __Stack]);
+yeccpars2(79, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [79 | __Ss], [__T | __Stack]);
+yeccpars2(79, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [79 | __Ss], [__T | __Stack]);
+yeccpars2(79, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(80, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__1|__3],
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(anno_expressions, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(81, 'of', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 82, [81 | __Ss], [__T | __Stack]);
+yeccpars2(81, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(82, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 83, [82 | __Ss], [__T | __Stack]);
+yeccpars2(82, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 26, [82 | __Ss], [__T | __Stack]);
+yeccpars2(82, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [82 | __Ss], [__T | __Stack]);
+yeccpars2(82, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(83, '>', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 92, [83 | __Ss], [__T | __Stack]);
+yeccpars2(83, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 26, [83 | __Ss], [__T | __Stack]);
+yeccpars2(83, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [83 | __Ss], [__T | __Stack]);
+yeccpars2(83, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(84, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__1],
+ yeccpars2(yeccgoto(let_vars, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(85, '->', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 86, [85 | __Ss], [__T | __Stack]);
+yeccpars2(85, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(86, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [86 | __Ss], [__T | __Stack]);
+yeccpars2(86, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [86 | __Ss], [__T | __Stack]);
+yeccpars2(86, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [86 | __Ss], [__T | __Stack]);
+yeccpars2(86, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [86 | __Ss], [__T | __Stack]);
+yeccpars2(86, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [86 | __Ss], [__T | __Stack]);
+yeccpars2(86, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [86 | __Ss], [__T | __Stack]);
+yeccpars2(86, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [86 | __Ss], [__T | __Stack]);
+yeccpars2(86, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [86 | __Ss], [__T | __Stack]);
+yeccpars2(86, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [86 | __Ss], [__T | __Stack]);
+yeccpars2(86, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [86 | __Ss], [__T | __Stack]);
+yeccpars2(86, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [86 | __Ss], [__T | __Stack]);
+yeccpars2(86, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [86 | __Ss], [__T | __Stack]);
+yeccpars2(86, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [86 | __Ss], [__T | __Stack]);
+yeccpars2(86, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [86 | __Ss], [__T | __Stack]);
+yeccpars2(86, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [86 | __Ss], [__T | __Stack]);
+yeccpars2(86, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [86 | __Ss], [__T | __Stack]);
+yeccpars2(86, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [86 | __Ss], [__T | __Stack]);
+yeccpars2(86, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [86 | __Ss], [__T | __Stack]);
+yeccpars2(86, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [86 | __Ss], [__T | __Stack]);
+yeccpars2(86, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [86 | __Ss], [__T | __Stack]);
+yeccpars2(86, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [86 | __Ss], [__T | __Stack]);
+yeccpars2(86, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [86 | __Ss], [__T | __Stack]);
+yeccpars2(86, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(87, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 88, [87 | __Ss], [__T | __Stack]);
+yeccpars2(87, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(88, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 83, [88 | __Ss], [__T | __Stack]);
+yeccpars2(88, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 26, [88 | __Ss], [__T | __Stack]);
+yeccpars2(88, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [88 | __Ss], [__T | __Stack]);
+yeccpars2(88, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(89, '->', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 90, [89 | __Ss], [__T | __Stack]);
+yeccpars2(89, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(90, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [90 | __Ss], [__T | __Stack]);
+yeccpars2(90, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [90 | __Ss], [__T | __Stack]);
+yeccpars2(90, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [90 | __Ss], [__T | __Stack]);
+yeccpars2(90, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [90 | __Ss], [__T | __Stack]);
+yeccpars2(90, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [90 | __Ss], [__T | __Stack]);
+yeccpars2(90, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [90 | __Ss], [__T | __Stack]);
+yeccpars2(90, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [90 | __Ss], [__T | __Stack]);
+yeccpars2(90, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [90 | __Ss], [__T | __Stack]);
+yeccpars2(90, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [90 | __Ss], [__T | __Stack]);
+yeccpars2(90, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [90 | __Ss], [__T | __Stack]);
+yeccpars2(90, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [90 | __Ss], [__T | __Stack]);
+yeccpars2(90, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [90 | __Ss], [__T | __Stack]);
+yeccpars2(90, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [90 | __Ss], [__T | __Stack]);
+yeccpars2(90, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [90 | __Ss], [__T | __Stack]);
+yeccpars2(90, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [90 | __Ss], [__T | __Stack]);
+yeccpars2(90, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [90 | __Ss], [__T | __Stack]);
+yeccpars2(90, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [90 | __Ss], [__T | __Stack]);
+yeccpars2(90, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [90 | __Ss], [__T | __Stack]);
+yeccpars2(90, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [90 | __Ss], [__T | __Stack]);
+yeccpars2(90, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [90 | __Ss], [__T | __Stack]);
+yeccpars2(90, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [90 | __Ss], [__T | __Stack]);
+yeccpars2(90, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [90 | __Ss], [__T | __Stack]);
+yeccpars2(90, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(91, __Cat, __Ss, [__10,__9,__8,__7,__6,__5,__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = if length(__8) == 2 -> #c_try{arg = __2, vars = __4, body = __6, evars = __8, handler = __10}; true -> return_error(tok_line(__7),"expected 2 exception variables in 'try'") end,
+ __Nss = lists:nthtail(9, __Ss),
+ yeccpars2(yeccgoto(try_expr, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(92, __Cat, __Ss, [__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [],
+ __Nss = lists:nthtail(1, __Ss),
+ yeccpars2(yeccgoto(let_vars, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(93, '>', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 94, [93 | __Ss], [__T | __Stack]);
+yeccpars2(93, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(94, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __2,
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(let_vars, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(95, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 190, [95 | __Ss], [__T | __Stack]);
+yeccpars2(95, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(96, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 97, [96 | __Ss], [__T | __Stack]);
+yeccpars2(96, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [96 | __Ss], [__T | __Stack]);
+yeccpars2(96, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 104, [96 | __Ss], [__T | __Stack]);
+yeccpars2(96, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [96 | __Ss], [__T | __Stack]);
+yeccpars2(96, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [96 | __Ss], [__T | __Stack]);
+yeccpars2(96, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [96 | __Ss], [__T | __Stack]);
+yeccpars2(96, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 115, [96 | __Ss], [__T | __Stack]);
+yeccpars2(96, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [96 | __Ss], [__T | __Stack]);
+yeccpars2(96, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 95, [96 | __Ss], [__T | __Stack]);
+yeccpars2(96, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 98, [96 | __Ss], [__T | __Stack]);
+yeccpars2(96, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 114, [96 | __Ss], [__T | __Stack]);
+yeccpars2(96, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(97, '>', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 182, [97 | __Ss], [__T | __Stack]);
+yeccpars2(97, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [97 | __Ss], [__T | __Stack]);
+yeccpars2(97, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 104, [97 | __Ss], [__T | __Stack]);
+yeccpars2(97, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [97 | __Ss], [__T | __Stack]);
+yeccpars2(97, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [97 | __Ss], [__T | __Stack]);
+yeccpars2(97, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [97 | __Ss], [__T | __Stack]);
+yeccpars2(97, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 115, [97 | __Ss], [__T | __Stack]);
+yeccpars2(97, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [97 | __Ss], [__T | __Stack]);
+yeccpars2(97, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 95, [97 | __Ss], [__T | __Stack]);
+yeccpars2(97, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 98, [97 | __Ss], [__T | __Stack]);
+yeccpars2(97, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 114, [97 | __Ss], [__T | __Stack]);
+yeccpars2(97, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(98, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [98 | __Ss], [__T | __Stack]);
+yeccpars2(98, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 104, [98 | __Ss], [__T | __Stack]);
+yeccpars2(98, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [98 | __Ss], [__T | __Stack]);
+yeccpars2(98, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [98 | __Ss], [__T | __Stack]);
+yeccpars2(98, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [98 | __Ss], [__T | __Stack]);
+yeccpars2(98, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 115, [98 | __Ss], [__T | __Stack]);
+yeccpars2(98, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [98 | __Ss], [__T | __Stack]);
+yeccpars2(98, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 95, [98 | __Ss], [__T | __Stack]);
+yeccpars2(98, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 98, [98 | __Ss], [__T | __Stack]);
+yeccpars2(98, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 114, [98 | __Ss], [__T | __Stack]);
+yeccpars2(98, ']', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 149, [98 | __Ss], [__T | __Stack]);
+yeccpars2(98, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(99, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [99 | __Ss], [__T | __Stack]);
+yeccpars2(99, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [99 | __Ss], [__T | __Stack]);
+yeccpars2(99, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [99 | __Ss], [__T | __Stack]);
+yeccpars2(99, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [99 | __Ss], [__T | __Stack]);
+yeccpars2(99, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [99 | __Ss], [__T | __Stack]);
+yeccpars2(99, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [99 | __Ss], [__T | __Stack]);
+yeccpars2(99, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [99 | __Ss], [__T | __Stack]);
+yeccpars2(99, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [99 | __Ss], [__T | __Stack]);
+yeccpars2(99, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [99 | __Ss], [__T | __Stack]);
+yeccpars2(99, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [99 | __Ss], [__T | __Stack]);
+yeccpars2(99, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [99 | __Ss], [__T | __Stack]);
+yeccpars2(99, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [99 | __Ss], [__T | __Stack]);
+yeccpars2(99, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [99 | __Ss], [__T | __Stack]);
+yeccpars2(99, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [99 | __Ss], [__T | __Stack]);
+yeccpars2(99, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [99 | __Ss], [__T | __Stack]);
+yeccpars2(99, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [99 | __Ss], [__T | __Stack]);
+yeccpars2(99, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [99 | __Ss], [__T | __Stack]);
+yeccpars2(99, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [99 | __Ss], [__T | __Stack]);
+yeccpars2(99, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [99 | __Ss], [__T | __Stack]);
+yeccpars2(99, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [99 | __Ss], [__T | __Stack]);
+yeccpars2(99, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [99 | __Ss], [__T | __Stack]);
+yeccpars2(99, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [99 | __Ss], [__T | __Stack]);
+yeccpars2(99, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(100, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 97, [100 | __Ss], [__T | __Stack]);
+yeccpars2(100, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 96, [100 | __Ss], [__T | __Stack]);
+yeccpars2(100, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [100 | __Ss], [__T | __Stack]);
+yeccpars2(100, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 104, [100 | __Ss], [__T | __Stack]);
+yeccpars2(100, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [100 | __Ss], [__T | __Stack]);
+yeccpars2(100, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [100 | __Ss], [__T | __Stack]);
+yeccpars2(100, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [100 | __Ss], [__T | __Stack]);
+yeccpars2(100, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [100 | __Ss], [__T | __Stack]);
+yeccpars2(100, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 95, [100 | __Ss], [__T | __Stack]);
+yeccpars2(100, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 98, [100 | __Ss], [__T | __Stack]);
+yeccpars2(100, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 114, [100 | __Ss], [__T | __Stack]);
+yeccpars2(100, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__1],
+ yeccpars2(yeccgoto(anno_clauses, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(101, 'after', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 99, [101 | __Ss], [__T | __Stack]);
+yeccpars2(101, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(102, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__1],
+ yeccpars2(yeccgoto(clause_pattern, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(103, '=', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 162, [103 | __Ss], [__T | __Stack]);
+yeccpars2(103, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(anno_pattern, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(104, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_atom{val = tok_val(__1)},
+ yeccpars2(yeccgoto(atomic_literal, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(105, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(atomic_pattern, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(106, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(other_pattern, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(107, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(other_pattern, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(108, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(anno_clause, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(109, 'when', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 164, [109 | __Ss], [__T | __Stack]);
+yeccpars2(109, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(110, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(other_pattern, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(111, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(anno_pattern, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(112, __Cat, __Ss, [__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = begin
+ {T,A} = __2, #c_receive{clauses = [], timeout = T, action = A}
+ end,
+ __Nss = lists:nthtail(1, __Ss),
+ yeccpars2(yeccgoto(receive_expr, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(113, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(other_pattern, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(114, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [114 | __Ss], [__T | __Stack]);
+yeccpars2(114, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 104, [114 | __Ss], [__T | __Stack]);
+yeccpars2(114, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [114 | __Ss], [__T | __Stack]);
+yeccpars2(114, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [114 | __Ss], [__T | __Stack]);
+yeccpars2(114, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [114 | __Ss], [__T | __Stack]);
+yeccpars2(114, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 115, [114 | __Ss], [__T | __Stack]);
+yeccpars2(114, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [114 | __Ss], [__T | __Stack]);
+yeccpars2(114, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 95, [114 | __Ss], [__T | __Stack]);
+yeccpars2(114, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 98, [114 | __Ss], [__T | __Stack]);
+yeccpars2(114, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 114, [114 | __Ss], [__T | __Stack]);
+yeccpars2(114, '}', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 118, [114 | __Ss], [__T | __Stack]);
+yeccpars2(114, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(115, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [115 | __Ss], [__T | __Stack]);
+yeccpars2(115, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 104, [115 | __Ss], [__T | __Stack]);
+yeccpars2(115, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [115 | __Ss], [__T | __Stack]);
+yeccpars2(115, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [115 | __Ss], [__T | __Stack]);
+yeccpars2(115, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [115 | __Ss], [__T | __Stack]);
+yeccpars2(115, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 26, [115 | __Ss], [__T | __Stack]);
+yeccpars2(115, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [115 | __Ss], [__T | __Stack]);
+yeccpars2(115, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 95, [115 | __Ss], [__T | __Stack]);
+yeccpars2(115, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 98, [115 | __Ss], [__T | __Stack]);
+yeccpars2(115, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 114, [115 | __Ss], [__T | __Stack]);
+yeccpars2(115, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(116, ',', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 120, [116 | __Ss], [__T | __Stack]);
+yeccpars2(116, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__1],
+ yeccpars2(yeccgoto(anno_patterns, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(117, '}', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 119, [117 | __Ss], [__T | __Stack]);
+yeccpars2(117, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(118, __Cat, __Ss, [__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_tuple{es = []},
+ __Nss = lists:nthtail(1, __Ss),
+ yeccpars2(yeccgoto(tuple_pattern, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(119, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_tuple{es = __2},
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(tuple_pattern, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(120, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [120 | __Ss], [__T | __Stack]);
+yeccpars2(120, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 104, [120 | __Ss], [__T | __Stack]);
+yeccpars2(120, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [120 | __Ss], [__T | __Stack]);
+yeccpars2(120, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [120 | __Ss], [__T | __Stack]);
+yeccpars2(120, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [120 | __Ss], [__T | __Stack]);
+yeccpars2(120, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 115, [120 | __Ss], [__T | __Stack]);
+yeccpars2(120, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [120 | __Ss], [__T | __Stack]);
+yeccpars2(120, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 95, [120 | __Ss], [__T | __Stack]);
+yeccpars2(120, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 98, [120 | __Ss], [__T | __Stack]);
+yeccpars2(120, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 114, [120 | __Ss], [__T | __Stack]);
+yeccpars2(120, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(121, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__1|__3],
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(anno_patterns, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(122, '=', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 162, [122 | __Ss], [__T | __Stack]);
+yeccpars2(122, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(123, '-|', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 159, [123 | __Ss], [__T | __Stack]);
+yeccpars2(123, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(124, '-|', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 125, [124 | __Ss], [__T | __Stack]);
+yeccpars2(124, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(anno_variable, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(125, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 126, [125 | __Ss], [__T | __Stack]);
+yeccpars2(125, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(126, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 129, [126 | __Ss], [__T | __Stack]);
+yeccpars2(126, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 142, [126 | __Ss], [__T | __Stack]);
+yeccpars2(126, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 140, [126 | __Ss], [__T | __Stack]);
+yeccpars2(126, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 131, [126 | __Ss], [__T | __Stack]);
+yeccpars2(126, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 137, [126 | __Ss], [__T | __Stack]);
+yeccpars2(126, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 138, [126 | __Ss], [__T | __Stack]);
+yeccpars2(126, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 133, [126 | __Ss], [__T | __Stack]);
+yeccpars2(126, ']', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 130, [126 | __Ss], [__T | __Stack]);
+yeccpars2(126, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(127, ')', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 128, [127 | __Ss], [__T | __Stack]);
+yeccpars2(127, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(128, __Cat, __Ss, [__5,__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = core_lib:set_anno(__2,__4),
+ __Nss = lists:nthtail(4, __Ss),
+ yeccpars2(yeccgoto(anno_variable, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(129, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 129, [129 | __Ss], [__T | __Stack]);
+yeccpars2(129, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 142, [129 | __Ss], [__T | __Stack]);
+yeccpars2(129, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 140, [129 | __Ss], [__T | __Stack]);
+yeccpars2(129, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 131, [129 | __Ss], [__T | __Stack]);
+yeccpars2(129, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 137, [129 | __Ss], [__T | __Stack]);
+yeccpars2(129, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 138, [129 | __Ss], [__T | __Stack]);
+yeccpars2(129, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 133, [129 | __Ss], [__T | __Stack]);
+yeccpars2(129, ']', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 149, [129 | __Ss], [__T | __Stack]);
+yeccpars2(129, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(130, __Cat, __Ss, [__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [],
+ __Nss = lists:nthtail(1, __Ss),
+ yeccpars2(yeccgoto(annotation, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(131, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = tok_val(__1),
+ yeccpars2(yeccgoto(atomic_constant, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(132, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(constant, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(133, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = tok_val(__1),
+ yeccpars2(yeccgoto(atomic_constant, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(134, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(constant, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(135, ',', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 147, [135 | __Ss], [__T | __Stack]);
+yeccpars2(135, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__1],
+ yeccpars2(yeccgoto(constants, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(136, ']', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 146, [136 | __Ss], [__T | __Stack]);
+yeccpars2(136, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(137, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = tok_val(__1),
+ yeccpars2(yeccgoto(atomic_constant, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(138, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = tok_val(__1),
+ yeccpars2(yeccgoto(atomic_constant, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(139, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [],
+ yeccpars2(yeccgoto(atomic_constant, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(140, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = tok_val(__1),
+ yeccpars2(yeccgoto(atomic_constant, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(141, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(constant, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(142, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 129, [142 | __Ss], [__T | __Stack]);
+yeccpars2(142, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 142, [142 | __Ss], [__T | __Stack]);
+yeccpars2(142, '}', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 144, [142 | __Ss], [__T | __Stack]);
+yeccpars2(142, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 140, [142 | __Ss], [__T | __Stack]);
+yeccpars2(142, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 131, [142 | __Ss], [__T | __Stack]);
+yeccpars2(142, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 137, [142 | __Ss], [__T | __Stack]);
+yeccpars2(142, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 138, [142 | __Ss], [__T | __Stack]);
+yeccpars2(142, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 133, [142 | __Ss], [__T | __Stack]);
+yeccpars2(142, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(143, '}', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 145, [143 | __Ss], [__T | __Stack]);
+yeccpars2(143, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(144, __Cat, __Ss, [__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = {},
+ __Nss = lists:nthtail(1, __Ss),
+ yeccpars2(yeccgoto(tuple_constant, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(145, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = list_to_tuple(__2),
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(tuple_constant, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(146, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __2,
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(annotation, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(147, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 129, [147 | __Ss], [__T | __Stack]);
+yeccpars2(147, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 142, [147 | __Ss], [__T | __Stack]);
+yeccpars2(147, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 140, [147 | __Ss], [__T | __Stack]);
+yeccpars2(147, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 131, [147 | __Ss], [__T | __Stack]);
+yeccpars2(147, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 137, [147 | __Ss], [__T | __Stack]);
+yeccpars2(147, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 138, [147 | __Ss], [__T | __Stack]);
+yeccpars2(147, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 133, [147 | __Ss], [__T | __Stack]);
+yeccpars2(147, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(148, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__1|__3],
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(constants, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(149, __Cat, __Ss, [__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = {nil,tok_line(__1)},
+ __Nss = lists:nthtail(1, __Ss),
+ yeccpars2(yeccgoto(nil, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(150, ',', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 151, [150 | __Ss], [__T | __Stack]);
+yeccpars2(150, '|', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 154, [150 | __Ss], [__T | __Stack]);
+yeccpars2(150, ']', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 152, [150 | __Ss], [__T | __Stack]);
+yeccpars2(150, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(151, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 129, [151 | __Ss], [__T | __Stack]);
+yeccpars2(151, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 142, [151 | __Ss], [__T | __Stack]);
+yeccpars2(151, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 140, [151 | __Ss], [__T | __Stack]);
+yeccpars2(151, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 131, [151 | __Ss], [__T | __Stack]);
+yeccpars2(151, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 137, [151 | __Ss], [__T | __Stack]);
+yeccpars2(151, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 138, [151 | __Ss], [__T | __Stack]);
+yeccpars2(151, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 133, [151 | __Ss], [__T | __Stack]);
+yeccpars2(151, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(152, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [],
+ yeccpars2(yeccgoto(tail_constant, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(153, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__2|__3],
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(cons_constant, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(154, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 129, [154 | __Ss], [__T | __Stack]);
+yeccpars2(154, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 142, [154 | __Ss], [__T | __Stack]);
+yeccpars2(154, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 140, [154 | __Ss], [__T | __Stack]);
+yeccpars2(154, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 131, [154 | __Ss], [__T | __Stack]);
+yeccpars2(154, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 137, [154 | __Ss], [__T | __Stack]);
+yeccpars2(154, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 138, [154 | __Ss], [__T | __Stack]);
+yeccpars2(154, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 133, [154 | __Ss], [__T | __Stack]);
+yeccpars2(154, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(155, ']', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 156, [155 | __Ss], [__T | __Stack]);
+yeccpars2(155, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(156, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __2,
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(tail_constant, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(157, ',', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 151, [157 | __Ss], [__T | __Stack]);
+yeccpars2(157, '|', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 154, [157 | __Ss], [__T | __Stack]);
+yeccpars2(157, ']', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 152, [157 | __Ss], [__T | __Stack]);
+yeccpars2(157, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(158, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__2|__3],
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(tail_constant, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(159, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 126, [159 | __Ss], [__T | __Stack]);
+yeccpars2(159, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(160, ')', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 161, [160 | __Ss], [__T | __Stack]);
+yeccpars2(160, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(161, __Cat, __Ss, [__5,__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = core_lib:set_anno(__2,__4),
+ __Nss = lists:nthtail(4, __Ss),
+ yeccpars2(yeccgoto(anno_pattern, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(162, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [162 | __Ss], [__T | __Stack]);
+yeccpars2(162, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 104, [162 | __Ss], [__T | __Stack]);
+yeccpars2(162, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [162 | __Ss], [__T | __Stack]);
+yeccpars2(162, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [162 | __Ss], [__T | __Stack]);
+yeccpars2(162, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [162 | __Ss], [__T | __Stack]);
+yeccpars2(162, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 115, [162 | __Ss], [__T | __Stack]);
+yeccpars2(162, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [162 | __Ss], [__T | __Stack]);
+yeccpars2(162, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 95, [162 | __Ss], [__T | __Stack]);
+yeccpars2(162, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 98, [162 | __Ss], [__T | __Stack]);
+yeccpars2(162, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 114, [162 | __Ss], [__T | __Stack]);
+yeccpars2(162, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(163, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_alias{var = __1, pat = __3},
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(other_pattern, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(164, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [164 | __Ss], [__T | __Stack]);
+yeccpars2(164, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [164 | __Ss], [__T | __Stack]);
+yeccpars2(164, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [164 | __Ss], [__T | __Stack]);
+yeccpars2(164, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [164 | __Ss], [__T | __Stack]);
+yeccpars2(164, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [164 | __Ss], [__T | __Stack]);
+yeccpars2(164, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [164 | __Ss], [__T | __Stack]);
+yeccpars2(164, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [164 | __Ss], [__T | __Stack]);
+yeccpars2(164, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [164 | __Ss], [__T | __Stack]);
+yeccpars2(164, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [164 | __Ss], [__T | __Stack]);
+yeccpars2(164, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [164 | __Ss], [__T | __Stack]);
+yeccpars2(164, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [164 | __Ss], [__T | __Stack]);
+yeccpars2(164, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [164 | __Ss], [__T | __Stack]);
+yeccpars2(164, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [164 | __Ss], [__T | __Stack]);
+yeccpars2(164, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [164 | __Ss], [__T | __Stack]);
+yeccpars2(164, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [164 | __Ss], [__T | __Stack]);
+yeccpars2(164, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [164 | __Ss], [__T | __Stack]);
+yeccpars2(164, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [164 | __Ss], [__T | __Stack]);
+yeccpars2(164, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [164 | __Ss], [__T | __Stack]);
+yeccpars2(164, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [164 | __Ss], [__T | __Stack]);
+yeccpars2(164, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [164 | __Ss], [__T | __Stack]);
+yeccpars2(164, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [164 | __Ss], [__T | __Stack]);
+yeccpars2(164, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [164 | __Ss], [__T | __Stack]);
+yeccpars2(164, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(165, '->', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 166, [165 | __Ss], [__T | __Stack]);
+yeccpars2(165, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(166, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [166 | __Ss], [__T | __Stack]);
+yeccpars2(166, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [166 | __Ss], [__T | __Stack]);
+yeccpars2(166, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [166 | __Ss], [__T | __Stack]);
+yeccpars2(166, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [166 | __Ss], [__T | __Stack]);
+yeccpars2(166, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [166 | __Ss], [__T | __Stack]);
+yeccpars2(166, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [166 | __Ss], [__T | __Stack]);
+yeccpars2(166, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [166 | __Ss], [__T | __Stack]);
+yeccpars2(166, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [166 | __Ss], [__T | __Stack]);
+yeccpars2(166, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [166 | __Ss], [__T | __Stack]);
+yeccpars2(166, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [166 | __Ss], [__T | __Stack]);
+yeccpars2(166, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [166 | __Ss], [__T | __Stack]);
+yeccpars2(166, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [166 | __Ss], [__T | __Stack]);
+yeccpars2(166, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [166 | __Ss], [__T | __Stack]);
+yeccpars2(166, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [166 | __Ss], [__T | __Stack]);
+yeccpars2(166, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [166 | __Ss], [__T | __Stack]);
+yeccpars2(166, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [166 | __Ss], [__T | __Stack]);
+yeccpars2(166, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [166 | __Ss], [__T | __Stack]);
+yeccpars2(166, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [166 | __Ss], [__T | __Stack]);
+yeccpars2(166, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [166 | __Ss], [__T | __Stack]);
+yeccpars2(166, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [166 | __Ss], [__T | __Stack]);
+yeccpars2(166, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [166 | __Ss], [__T | __Stack]);
+yeccpars2(166, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [166 | __Ss], [__T | __Stack]);
+yeccpars2(166, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(167, __Cat, __Ss, [__5,__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_clause{pats = __1, guard = __3, body = __5},
+ __Nss = lists:nthtail(4, __Ss),
+ yeccpars2(yeccgoto(clause, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(168, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = begin
+ {T,A} = __3, #c_receive{clauses = __2, timeout = T, action = A}
+ end,
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(receive_expr, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(169, __Cat, __Ss, [__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__1|__2],
+ __Nss = lists:nthtail(1, __Ss),
+ yeccpars2(yeccgoto(anno_clauses, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(170, '->', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 171, [170 | __Ss], [__T | __Stack]);
+yeccpars2(170, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(171, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [171 | __Ss], [__T | __Stack]);
+yeccpars2(171, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [171 | __Ss], [__T | __Stack]);
+yeccpars2(171, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [171 | __Ss], [__T | __Stack]);
+yeccpars2(171, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [171 | __Ss], [__T | __Stack]);
+yeccpars2(171, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [171 | __Ss], [__T | __Stack]);
+yeccpars2(171, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [171 | __Ss], [__T | __Stack]);
+yeccpars2(171, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [171 | __Ss], [__T | __Stack]);
+yeccpars2(171, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [171 | __Ss], [__T | __Stack]);
+yeccpars2(171, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [171 | __Ss], [__T | __Stack]);
+yeccpars2(171, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [171 | __Ss], [__T | __Stack]);
+yeccpars2(171, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [171 | __Ss], [__T | __Stack]);
+yeccpars2(171, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [171 | __Ss], [__T | __Stack]);
+yeccpars2(171, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [171 | __Ss], [__T | __Stack]);
+yeccpars2(171, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [171 | __Ss], [__T | __Stack]);
+yeccpars2(171, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [171 | __Ss], [__T | __Stack]);
+yeccpars2(171, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [171 | __Ss], [__T | __Stack]);
+yeccpars2(171, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [171 | __Ss], [__T | __Stack]);
+yeccpars2(171, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [171 | __Ss], [__T | __Stack]);
+yeccpars2(171, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [171 | __Ss], [__T | __Stack]);
+yeccpars2(171, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [171 | __Ss], [__T | __Stack]);
+yeccpars2(171, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [171 | __Ss], [__T | __Stack]);
+yeccpars2(171, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [171 | __Ss], [__T | __Stack]);
+yeccpars2(171, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(172, __Cat, __Ss, [__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = {__2,__4},
+ __Nss = lists:nthtail(3, __Ss),
+ yeccpars2(yeccgoto(timeout, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(173, ',', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 174, [173 | __Ss], [__T | __Stack]);
+yeccpars2(173, '|', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 177, [173 | __Ss], [__T | __Stack]);
+yeccpars2(173, ']', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 175, [173 | __Ss], [__T | __Stack]);
+yeccpars2(173, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(174, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [174 | __Ss], [__T | __Stack]);
+yeccpars2(174, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 104, [174 | __Ss], [__T | __Stack]);
+yeccpars2(174, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [174 | __Ss], [__T | __Stack]);
+yeccpars2(174, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [174 | __Ss], [__T | __Stack]);
+yeccpars2(174, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [174 | __Ss], [__T | __Stack]);
+yeccpars2(174, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 115, [174 | __Ss], [__T | __Stack]);
+yeccpars2(174, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [174 | __Ss], [__T | __Stack]);
+yeccpars2(174, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 95, [174 | __Ss], [__T | __Stack]);
+yeccpars2(174, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 98, [174 | __Ss], [__T | __Stack]);
+yeccpars2(174, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 114, [174 | __Ss], [__T | __Stack]);
+yeccpars2(174, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(175, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_nil{},
+ yeccpars2(yeccgoto(tail_pattern, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(176, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_cons{hd = __2, tl = __3},
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(cons_pattern, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(177, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [177 | __Ss], [__T | __Stack]);
+yeccpars2(177, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 104, [177 | __Ss], [__T | __Stack]);
+yeccpars2(177, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [177 | __Ss], [__T | __Stack]);
+yeccpars2(177, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [177 | __Ss], [__T | __Stack]);
+yeccpars2(177, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [177 | __Ss], [__T | __Stack]);
+yeccpars2(177, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 115, [177 | __Ss], [__T | __Stack]);
+yeccpars2(177, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [177 | __Ss], [__T | __Stack]);
+yeccpars2(177, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 95, [177 | __Ss], [__T | __Stack]);
+yeccpars2(177, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 98, [177 | __Ss], [__T | __Stack]);
+yeccpars2(177, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 114, [177 | __Ss], [__T | __Stack]);
+yeccpars2(177, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(178, ']', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 179, [178 | __Ss], [__T | __Stack]);
+yeccpars2(178, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(179, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __2,
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(tail_pattern, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(180, ',', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 174, [180 | __Ss], [__T | __Stack]);
+yeccpars2(180, '|', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 177, [180 | __Ss], [__T | __Stack]);
+yeccpars2(180, ']', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 175, [180 | __Ss], [__T | __Stack]);
+yeccpars2(180, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(181, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_cons{hd = __2, tl = __3},
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(tail_pattern, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(182, __Cat, __Ss, [__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [],
+ __Nss = lists:nthtail(1, __Ss),
+ yeccpars2(yeccgoto(clause_pattern, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(183, '>', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 184, [183 | __Ss], [__T | __Stack]);
+yeccpars2(183, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(184, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __2,
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(clause_pattern, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(185, '-|', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 187, [185 | __Ss], [__T | __Stack]);
+yeccpars2(185, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(186, '-|', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 159, [186 | __Ss], [__T | __Stack]);
+yeccpars2(186, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(anno_pattern, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(187, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 126, [187 | __Ss], [__T | __Stack]);
+yeccpars2(187, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(188, ')', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 189, [188 | __Ss], [__T | __Stack]);
+yeccpars2(188, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(189, __Cat, __Ss, [__5,__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = core_lib:set_anno(__2,__4),
+ __Nss = lists:nthtail(4, __Ss),
+ yeccpars2(yeccgoto(anno_clause, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(190, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 191, [190 | __Ss], [__T | __Stack]);
+yeccpars2(190, '}', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 194, [190 | __Ss], [__T | __Stack]);
+yeccpars2(190, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(191, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 200, [191 | __Ss], [__T | __Stack]);
+yeccpars2(191, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(192, ',', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 198, [192 | __Ss], [__T | __Stack]);
+yeccpars2(192, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__1],
+ yeccpars2(yeccgoto(segment_patterns, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(193, '}', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 196, [193 | __Ss], [__T | __Stack]);
+yeccpars2(193, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(194, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 195, [194 | __Ss], [__T | __Stack]);
+yeccpars2(194, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(195, __Cat, __Ss, [__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_binary{segments = []},
+ __Nss = lists:nthtail(3, __Ss),
+ yeccpars2(yeccgoto(binary_pattern, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(196, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 197, [196 | __Ss], [__T | __Stack]);
+yeccpars2(196, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(197, __Cat, __Ss, [__5,__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_binary{segments = __3},
+ __Nss = lists:nthtail(4, __Ss),
+ yeccpars2(yeccgoto(binary_pattern, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(198, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 191, [198 | __Ss], [__T | __Stack]);
+yeccpars2(198, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(199, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__1|__3],
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(segment_patterns, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(200, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [200 | __Ss], [__T | __Stack]);
+yeccpars2(200, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 104, [200 | __Ss], [__T | __Stack]);
+yeccpars2(200, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [200 | __Ss], [__T | __Stack]);
+yeccpars2(200, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [200 | __Ss], [__T | __Stack]);
+yeccpars2(200, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [200 | __Ss], [__T | __Stack]);
+yeccpars2(200, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 115, [200 | __Ss], [__T | __Stack]);
+yeccpars2(200, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [200 | __Ss], [__T | __Stack]);
+yeccpars2(200, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 95, [200 | __Ss], [__T | __Stack]);
+yeccpars2(200, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 98, [200 | __Ss], [__T | __Stack]);
+yeccpars2(200, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 114, [200 | __Ss], [__T | __Stack]);
+yeccpars2(200, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(201, '>', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 202, [201 | __Ss], [__T | __Stack]);
+yeccpars2(201, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(202, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 203, [202 | __Ss], [__T | __Stack]);
+yeccpars2(202, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(203, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [203 | __Ss], [__T | __Stack]);
+yeccpars2(203, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [203 | __Ss], [__T | __Stack]);
+yeccpars2(203, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [203 | __Ss], [__T | __Stack]);
+yeccpars2(203, ')', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 205, [203 | __Ss], [__T | __Stack]);
+yeccpars2(203, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [203 | __Ss], [__T | __Stack]);
+yeccpars2(203, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [203 | __Ss], [__T | __Stack]);
+yeccpars2(203, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [203 | __Ss], [__T | __Stack]);
+yeccpars2(203, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [203 | __Ss], [__T | __Stack]);
+yeccpars2(203, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [203 | __Ss], [__T | __Stack]);
+yeccpars2(203, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [203 | __Ss], [__T | __Stack]);
+yeccpars2(203, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [203 | __Ss], [__T | __Stack]);
+yeccpars2(203, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [203 | __Ss], [__T | __Stack]);
+yeccpars2(203, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [203 | __Ss], [__T | __Stack]);
+yeccpars2(203, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [203 | __Ss], [__T | __Stack]);
+yeccpars2(203, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [203 | __Ss], [__T | __Stack]);
+yeccpars2(203, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [203 | __Ss], [__T | __Stack]);
+yeccpars2(203, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [203 | __Ss], [__T | __Stack]);
+yeccpars2(203, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [203 | __Ss], [__T | __Stack]);
+yeccpars2(203, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [203 | __Ss], [__T | __Stack]);
+yeccpars2(203, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [203 | __Ss], [__T | __Stack]);
+yeccpars2(203, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [203 | __Ss], [__T | __Stack]);
+yeccpars2(203, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [203 | __Ss], [__T | __Stack]);
+yeccpars2(203, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [203 | __Ss], [__T | __Stack]);
+yeccpars2(203, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(204, __Cat, __Ss, [__5,__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = case __5 of [S,U,T,Fs] -> #c_bitstr{val = __3, size = S, unit = U, type = T, flags = Fs}; true -> return_error(tok_line(__1),"expected 4 arguments in binary segment") end,
+ __Nss = lists:nthtail(4, __Ss),
+ yeccpars2(yeccgoto(segment_pattern, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(205, __Cat, __Ss, [__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [],
+ __Nss = lists:nthtail(1, __Ss),
+ yeccpars2(yeccgoto(arg_list, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(206, ')', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 207, [206 | __Ss], [__T | __Stack]);
+yeccpars2(206, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(207, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __2,
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(arg_list, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(208, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 203, [208 | __Ss], [__T | __Stack]);
+yeccpars2(208, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(209, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = begin
+ Name = #c_atom{val = tok_val(__2)}, #c_primop{name = Name, args = __3}
+ end,
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(primop_expr, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(210, 'in', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 211, [210 | __Ss], [__T | __Stack]);
+yeccpars2(210, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(211, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [211 | __Ss], [__T | __Stack]);
+yeccpars2(211, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [211 | __Ss], [__T | __Stack]);
+yeccpars2(211, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [211 | __Ss], [__T | __Stack]);
+yeccpars2(211, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [211 | __Ss], [__T | __Stack]);
+yeccpars2(211, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [211 | __Ss], [__T | __Stack]);
+yeccpars2(211, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [211 | __Ss], [__T | __Stack]);
+yeccpars2(211, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [211 | __Ss], [__T | __Stack]);
+yeccpars2(211, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [211 | __Ss], [__T | __Stack]);
+yeccpars2(211, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [211 | __Ss], [__T | __Stack]);
+yeccpars2(211, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [211 | __Ss], [__T | __Stack]);
+yeccpars2(211, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [211 | __Ss], [__T | __Stack]);
+yeccpars2(211, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [211 | __Ss], [__T | __Stack]);
+yeccpars2(211, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [211 | __Ss], [__T | __Stack]);
+yeccpars2(211, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [211 | __Ss], [__T | __Stack]);
+yeccpars2(211, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [211 | __Ss], [__T | __Stack]);
+yeccpars2(211, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [211 | __Ss], [__T | __Stack]);
+yeccpars2(211, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [211 | __Ss], [__T | __Stack]);
+yeccpars2(211, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [211 | __Ss], [__T | __Stack]);
+yeccpars2(211, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [211 | __Ss], [__T | __Stack]);
+yeccpars2(211, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [211 | __Ss], [__T | __Stack]);
+yeccpars2(211, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [211 | __Ss], [__T | __Stack]);
+yeccpars2(211, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [211 | __Ss], [__T | __Stack]);
+yeccpars2(211, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(212, __Cat, __Ss, [__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_letrec{defs = __2, body = __4},
+ __Nss = lists:nthtail(3, __Ss),
+ yeccpars2(yeccgoto(letrec_expr, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(213, '=', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 214, [213 | __Ss], [__T | __Stack]);
+yeccpars2(213, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(214, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [214 | __Ss], [__T | __Stack]);
+yeccpars2(214, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [214 | __Ss], [__T | __Stack]);
+yeccpars2(214, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [214 | __Ss], [__T | __Stack]);
+yeccpars2(214, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [214 | __Ss], [__T | __Stack]);
+yeccpars2(214, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [214 | __Ss], [__T | __Stack]);
+yeccpars2(214, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [214 | __Ss], [__T | __Stack]);
+yeccpars2(214, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [214 | __Ss], [__T | __Stack]);
+yeccpars2(214, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [214 | __Ss], [__T | __Stack]);
+yeccpars2(214, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [214 | __Ss], [__T | __Stack]);
+yeccpars2(214, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [214 | __Ss], [__T | __Stack]);
+yeccpars2(214, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [214 | __Ss], [__T | __Stack]);
+yeccpars2(214, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [214 | __Ss], [__T | __Stack]);
+yeccpars2(214, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [214 | __Ss], [__T | __Stack]);
+yeccpars2(214, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [214 | __Ss], [__T | __Stack]);
+yeccpars2(214, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [214 | __Ss], [__T | __Stack]);
+yeccpars2(214, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [214 | __Ss], [__T | __Stack]);
+yeccpars2(214, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [214 | __Ss], [__T | __Stack]);
+yeccpars2(214, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [214 | __Ss], [__T | __Stack]);
+yeccpars2(214, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [214 | __Ss], [__T | __Stack]);
+yeccpars2(214, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [214 | __Ss], [__T | __Stack]);
+yeccpars2(214, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [214 | __Ss], [__T | __Stack]);
+yeccpars2(214, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [214 | __Ss], [__T | __Stack]);
+yeccpars2(214, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(215, 'in', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 216, [215 | __Ss], [__T | __Stack]);
+yeccpars2(215, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(216, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [216 | __Ss], [__T | __Stack]);
+yeccpars2(216, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [216 | __Ss], [__T | __Stack]);
+yeccpars2(216, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [216 | __Ss], [__T | __Stack]);
+yeccpars2(216, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [216 | __Ss], [__T | __Stack]);
+yeccpars2(216, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [216 | __Ss], [__T | __Stack]);
+yeccpars2(216, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [216 | __Ss], [__T | __Stack]);
+yeccpars2(216, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [216 | __Ss], [__T | __Stack]);
+yeccpars2(216, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [216 | __Ss], [__T | __Stack]);
+yeccpars2(216, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [216 | __Ss], [__T | __Stack]);
+yeccpars2(216, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [216 | __Ss], [__T | __Stack]);
+yeccpars2(216, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [216 | __Ss], [__T | __Stack]);
+yeccpars2(216, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [216 | __Ss], [__T | __Stack]);
+yeccpars2(216, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [216 | __Ss], [__T | __Stack]);
+yeccpars2(216, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [216 | __Ss], [__T | __Stack]);
+yeccpars2(216, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [216 | __Ss], [__T | __Stack]);
+yeccpars2(216, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [216 | __Ss], [__T | __Stack]);
+yeccpars2(216, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [216 | __Ss], [__T | __Stack]);
+yeccpars2(216, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [216 | __Ss], [__T | __Stack]);
+yeccpars2(216, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [216 | __Ss], [__T | __Stack]);
+yeccpars2(216, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [216 | __Ss], [__T | __Stack]);
+yeccpars2(216, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [216 | __Ss], [__T | __Stack]);
+yeccpars2(216, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [216 | __Ss], [__T | __Stack]);
+yeccpars2(216, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(217, __Cat, __Ss, [__6,__5,__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_let{vars = __2, arg = __4, body = __6},
+ __Nss = lists:nthtail(5, __Ss),
+ yeccpars2(yeccgoto(let_expr, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(218, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [218 | __Ss], [__T | __Stack]);
+yeccpars2(218, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [218 | __Ss], [__T | __Stack]);
+yeccpars2(218, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [218 | __Ss], [__T | __Stack]);
+yeccpars2(218, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [218 | __Ss], [__T | __Stack]);
+yeccpars2(218, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [218 | __Ss], [__T | __Stack]);
+yeccpars2(218, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [218 | __Ss], [__T | __Stack]);
+yeccpars2(218, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [218 | __Ss], [__T | __Stack]);
+yeccpars2(218, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [218 | __Ss], [__T | __Stack]);
+yeccpars2(218, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [218 | __Ss], [__T | __Stack]);
+yeccpars2(218, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [218 | __Ss], [__T | __Stack]);
+yeccpars2(218, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [218 | __Ss], [__T | __Stack]);
+yeccpars2(218, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [218 | __Ss], [__T | __Stack]);
+yeccpars2(218, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [218 | __Ss], [__T | __Stack]);
+yeccpars2(218, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [218 | __Ss], [__T | __Stack]);
+yeccpars2(218, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [218 | __Ss], [__T | __Stack]);
+yeccpars2(218, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [218 | __Ss], [__T | __Stack]);
+yeccpars2(218, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [218 | __Ss], [__T | __Stack]);
+yeccpars2(218, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [218 | __Ss], [__T | __Stack]);
+yeccpars2(218, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [218 | __Ss], [__T | __Stack]);
+yeccpars2(218, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [218 | __Ss], [__T | __Stack]);
+yeccpars2(218, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [218 | __Ss], [__T | __Stack]);
+yeccpars2(218, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [218 | __Ss], [__T | __Stack]);
+yeccpars2(218, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(219, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_seq{arg = __2, body = __3},
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(sequence, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(220, __Cat, __Ss, [__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_catch{body = __2},
+ __Nss = lists:nthtail(1, __Ss),
+ yeccpars2(yeccgoto(catch_expr, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(221, 'of', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 222, [221 | __Ss], [__T | __Stack]);
+yeccpars2(221, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(222, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 97, [222 | __Ss], [__T | __Stack]);
+yeccpars2(222, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 96, [222 | __Ss], [__T | __Stack]);
+yeccpars2(222, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [222 | __Ss], [__T | __Stack]);
+yeccpars2(222, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 104, [222 | __Ss], [__T | __Stack]);
+yeccpars2(222, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [222 | __Ss], [__T | __Stack]);
+yeccpars2(222, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [222 | __Ss], [__T | __Stack]);
+yeccpars2(222, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [222 | __Ss], [__T | __Stack]);
+yeccpars2(222, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [222 | __Ss], [__T | __Stack]);
+yeccpars2(222, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 95, [222 | __Ss], [__T | __Stack]);
+yeccpars2(222, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 98, [222 | __Ss], [__T | __Stack]);
+yeccpars2(222, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 114, [222 | __Ss], [__T | __Stack]);
+yeccpars2(222, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(223, 'end', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 224, [223 | __Ss], [__T | __Stack]);
+yeccpars2(223, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(224, __Cat, __Ss, [__5,__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_case{arg = __2, clauses = __4},
+ __Nss = lists:nthtail(4, __Ss),
+ yeccpars2(yeccgoto(case_expr, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(225, ':', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 226, [225 | __Ss], [__T | __Stack]);
+yeccpars2(225, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(226, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [226 | __Ss], [__T | __Stack]);
+yeccpars2(226, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [226 | __Ss], [__T | __Stack]);
+yeccpars2(226, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [226 | __Ss], [__T | __Stack]);
+yeccpars2(226, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [226 | __Ss], [__T | __Stack]);
+yeccpars2(226, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [226 | __Ss], [__T | __Stack]);
+yeccpars2(226, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [226 | __Ss], [__T | __Stack]);
+yeccpars2(226, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [226 | __Ss], [__T | __Stack]);
+yeccpars2(226, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [226 | __Ss], [__T | __Stack]);
+yeccpars2(226, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [226 | __Ss], [__T | __Stack]);
+yeccpars2(226, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [226 | __Ss], [__T | __Stack]);
+yeccpars2(226, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [226 | __Ss], [__T | __Stack]);
+yeccpars2(226, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [226 | __Ss], [__T | __Stack]);
+yeccpars2(226, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [226 | __Ss], [__T | __Stack]);
+yeccpars2(226, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [226 | __Ss], [__T | __Stack]);
+yeccpars2(226, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [226 | __Ss], [__T | __Stack]);
+yeccpars2(226, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [226 | __Ss], [__T | __Stack]);
+yeccpars2(226, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [226 | __Ss], [__T | __Stack]);
+yeccpars2(226, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [226 | __Ss], [__T | __Stack]);
+yeccpars2(226, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [226 | __Ss], [__T | __Stack]);
+yeccpars2(226, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [226 | __Ss], [__T | __Stack]);
+yeccpars2(226, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [226 | __Ss], [__T | __Stack]);
+yeccpars2(226, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [226 | __Ss], [__T | __Stack]);
+yeccpars2(226, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(227, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 203, [227 | __Ss], [__T | __Stack]);
+yeccpars2(227, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(228, __Cat, __Ss, [__5,__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_call{module = __2, name = __4, args = __5},
+ __Nss = lists:nthtail(4, __Ss),
+ yeccpars2(yeccgoto(call_expr, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(229, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 203, [229 | __Ss], [__T | __Stack]);
+yeccpars2(229, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(230, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_apply{op = __2, args = __3},
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(application_expr, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(231, ',', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 232, [231 | __Ss], [__T | __Stack]);
+yeccpars2(231, '|', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 235, [231 | __Ss], [__T | __Stack]);
+yeccpars2(231, ']', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 233, [231 | __Ss], [__T | __Stack]);
+yeccpars2(231, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(232, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [232 | __Ss], [__T | __Stack]);
+yeccpars2(232, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [232 | __Ss], [__T | __Stack]);
+yeccpars2(232, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [232 | __Ss], [__T | __Stack]);
+yeccpars2(232, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [232 | __Ss], [__T | __Stack]);
+yeccpars2(232, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [232 | __Ss], [__T | __Stack]);
+yeccpars2(232, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [232 | __Ss], [__T | __Stack]);
+yeccpars2(232, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [232 | __Ss], [__T | __Stack]);
+yeccpars2(232, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [232 | __Ss], [__T | __Stack]);
+yeccpars2(232, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [232 | __Ss], [__T | __Stack]);
+yeccpars2(232, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [232 | __Ss], [__T | __Stack]);
+yeccpars2(232, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [232 | __Ss], [__T | __Stack]);
+yeccpars2(232, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [232 | __Ss], [__T | __Stack]);
+yeccpars2(232, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [232 | __Ss], [__T | __Stack]);
+yeccpars2(232, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [232 | __Ss], [__T | __Stack]);
+yeccpars2(232, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [232 | __Ss], [__T | __Stack]);
+yeccpars2(232, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [232 | __Ss], [__T | __Stack]);
+yeccpars2(232, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [232 | __Ss], [__T | __Stack]);
+yeccpars2(232, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [232 | __Ss], [__T | __Stack]);
+yeccpars2(232, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [232 | __Ss], [__T | __Stack]);
+yeccpars2(232, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [232 | __Ss], [__T | __Stack]);
+yeccpars2(232, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [232 | __Ss], [__T | __Stack]);
+yeccpars2(232, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [232 | __Ss], [__T | __Stack]);
+yeccpars2(232, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(233, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_nil{},
+ yeccpars2(yeccgoto(tail, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(234, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_cons{hd = __2, tl = __3},
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(cons, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(235, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [235 | __Ss], [__T | __Stack]);
+yeccpars2(235, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [235 | __Ss], [__T | __Stack]);
+yeccpars2(235, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [235 | __Ss], [__T | __Stack]);
+yeccpars2(235, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [235 | __Ss], [__T | __Stack]);
+yeccpars2(235, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [235 | __Ss], [__T | __Stack]);
+yeccpars2(235, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [235 | __Ss], [__T | __Stack]);
+yeccpars2(235, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [235 | __Ss], [__T | __Stack]);
+yeccpars2(235, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [235 | __Ss], [__T | __Stack]);
+yeccpars2(235, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [235 | __Ss], [__T | __Stack]);
+yeccpars2(235, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [235 | __Ss], [__T | __Stack]);
+yeccpars2(235, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [235 | __Ss], [__T | __Stack]);
+yeccpars2(235, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [235 | __Ss], [__T | __Stack]);
+yeccpars2(235, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [235 | __Ss], [__T | __Stack]);
+yeccpars2(235, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [235 | __Ss], [__T | __Stack]);
+yeccpars2(235, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [235 | __Ss], [__T | __Stack]);
+yeccpars2(235, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [235 | __Ss], [__T | __Stack]);
+yeccpars2(235, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [235 | __Ss], [__T | __Stack]);
+yeccpars2(235, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [235 | __Ss], [__T | __Stack]);
+yeccpars2(235, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [235 | __Ss], [__T | __Stack]);
+yeccpars2(235, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [235 | __Ss], [__T | __Stack]);
+yeccpars2(235, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [235 | __Ss], [__T | __Stack]);
+yeccpars2(235, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [235 | __Ss], [__T | __Stack]);
+yeccpars2(235, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(236, ']', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 237, [236 | __Ss], [__T | __Stack]);
+yeccpars2(236, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(237, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __2,
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(tail, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(238, ',', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 232, [238 | __Ss], [__T | __Stack]);
+yeccpars2(238, '|', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 235, [238 | __Ss], [__T | __Stack]);
+yeccpars2(238, ']', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 233, [238 | __Ss], [__T | __Stack]);
+yeccpars2(238, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(239, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_cons{hd = __2, tl = __3},
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(tail, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(240, __Cat, __Ss, [__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_values{es = []},
+ __Nss = lists:nthtail(1, __Ss),
+ yeccpars2(yeccgoto(expression, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(241, '>', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 242, [241 | __Ss], [__T | __Stack]);
+yeccpars2(241, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(242, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_values{es = __2},
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(expression, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(243, '-|', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 244, [243 | __Ss], [__T | __Stack]);
+yeccpars2(243, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(244, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 126, [244 | __Ss], [__T | __Stack]);
+yeccpars2(244, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(245, ')', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 246, [245 | __Ss], [__T | __Stack]);
+yeccpars2(245, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(246, __Cat, __Ss, [__5,__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = core_lib:set_anno(__2,__4),
+ __Nss = lists:nthtail(4, __Ss),
+ yeccpars2(yeccgoto(anno_expression, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(247, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 248, [247 | __Ss], [__T | __Stack]);
+yeccpars2(247, '}', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 251, [247 | __Ss], [__T | __Stack]);
+yeccpars2(247, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(248, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 257, [248 | __Ss], [__T | __Stack]);
+yeccpars2(248, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(249, ',', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 255, [249 | __Ss], [__T | __Stack]);
+yeccpars2(249, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__1],
+ yeccpars2(yeccgoto(segments, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(250, '}', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 253, [250 | __Ss], [__T | __Stack]);
+yeccpars2(250, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(251, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 252, [251 | __Ss], [__T | __Stack]);
+yeccpars2(251, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(252, __Cat, __Ss, [__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_binary{segments = []},
+ __Nss = lists:nthtail(3, __Ss),
+ yeccpars2(yeccgoto(binary, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(253, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 254, [253 | __Ss], [__T | __Stack]);
+yeccpars2(253, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(254, __Cat, __Ss, [__5,__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_binary{segments = __3},
+ __Nss = lists:nthtail(4, __Ss),
+ yeccpars2(yeccgoto(binary, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(255, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 248, [255 | __Ss], [__T | __Stack]);
+yeccpars2(255, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(256, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__1|__3],
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(segments, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(257, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [257 | __Ss], [__T | __Stack]);
+yeccpars2(257, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [257 | __Ss], [__T | __Stack]);
+yeccpars2(257, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [257 | __Ss], [__T | __Stack]);
+yeccpars2(257, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [257 | __Ss], [__T | __Stack]);
+yeccpars2(257, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [257 | __Ss], [__T | __Stack]);
+yeccpars2(257, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [257 | __Ss], [__T | __Stack]);
+yeccpars2(257, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [257 | __Ss], [__T | __Stack]);
+yeccpars2(257, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [257 | __Ss], [__T | __Stack]);
+yeccpars2(257, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [257 | __Ss], [__T | __Stack]);
+yeccpars2(257, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [257 | __Ss], [__T | __Stack]);
+yeccpars2(257, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [257 | __Ss], [__T | __Stack]);
+yeccpars2(257, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [257 | __Ss], [__T | __Stack]);
+yeccpars2(257, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [257 | __Ss], [__T | __Stack]);
+yeccpars2(257, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [257 | __Ss], [__T | __Stack]);
+yeccpars2(257, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [257 | __Ss], [__T | __Stack]);
+yeccpars2(257, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [257 | __Ss], [__T | __Stack]);
+yeccpars2(257, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [257 | __Ss], [__T | __Stack]);
+yeccpars2(257, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [257 | __Ss], [__T | __Stack]);
+yeccpars2(257, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [257 | __Ss], [__T | __Stack]);
+yeccpars2(257, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [257 | __Ss], [__T | __Stack]);
+yeccpars2(257, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [257 | __Ss], [__T | __Stack]);
+yeccpars2(257, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [257 | __Ss], [__T | __Stack]);
+yeccpars2(257, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(258, '>', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 259, [258 | __Ss], [__T | __Stack]);
+yeccpars2(258, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(259, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 260, [259 | __Ss], [__T | __Stack]);
+yeccpars2(259, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(260, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [260 | __Ss], [__T | __Stack]);
+yeccpars2(260, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [260 | __Ss], [__T | __Stack]);
+yeccpars2(260, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [260 | __Ss], [__T | __Stack]);
+yeccpars2(260, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [260 | __Ss], [__T | __Stack]);
+yeccpars2(260, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [260 | __Ss], [__T | __Stack]);
+yeccpars2(260, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [260 | __Ss], [__T | __Stack]);
+yeccpars2(260, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [260 | __Ss], [__T | __Stack]);
+yeccpars2(260, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [260 | __Ss], [__T | __Stack]);
+yeccpars2(260, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [260 | __Ss], [__T | __Stack]);
+yeccpars2(260, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [260 | __Ss], [__T | __Stack]);
+yeccpars2(260, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [260 | __Ss], [__T | __Stack]);
+yeccpars2(260, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [260 | __Ss], [__T | __Stack]);
+yeccpars2(260, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [260 | __Ss], [__T | __Stack]);
+yeccpars2(260, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [260 | __Ss], [__T | __Stack]);
+yeccpars2(260, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [260 | __Ss], [__T | __Stack]);
+yeccpars2(260, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [260 | __Ss], [__T | __Stack]);
+yeccpars2(260, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [260 | __Ss], [__T | __Stack]);
+yeccpars2(260, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [260 | __Ss], [__T | __Stack]);
+yeccpars2(260, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [260 | __Ss], [__T | __Stack]);
+yeccpars2(260, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [260 | __Ss], [__T | __Stack]);
+yeccpars2(260, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [260 | __Ss], [__T | __Stack]);
+yeccpars2(260, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [260 | __Ss], [__T | __Stack]);
+yeccpars2(260, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(261, ')', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 262, [261 | __Ss], [__T | __Stack]);
+yeccpars2(261, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(262, __Cat, __Ss, [__7,__6,__5,__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = case __6 of [S,U,T,Fs] -> #c_bitstr{val = __3, size = S, unit = U, type = T, flags = Fs}; true -> return_error(tok_line(__1),"expected 4 arguments in binary segment") end,
+ __Nss = lists:nthtail(6, __Ss),
+ yeccpars2(yeccgoto(segment, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(263, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 26, [263 | __Ss], [__T | __Stack]);
+yeccpars2(263, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [263 | __Ss], [__T | __Stack]);
+yeccpars2(263, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(264, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__1|__3],
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(anno_variables, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(265, 'receive', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 65, [265 | __Ss], [__T | __Stack]);
+yeccpars2(265, 'catch', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 48, [265 | __Ss], [__T | __Stack]);
+yeccpars2(265, 'try', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 70, [265 | __Ss], [__T | __Stack]);
+yeccpars2(265, 'primop', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 63, [265 | __Ss], [__T | __Stack]);
+yeccpars2(265, 'call', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 44, [265 | __Ss], [__T | __Stack]);
+yeccpars2(265, 'apply', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 40, [265 | __Ss], [__T | __Stack]);
+yeccpars2(265, 'case', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 46, [265 | __Ss], [__T | __Stack]);
+yeccpars2(265, 'letrec', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 60, [265 | __Ss], [__T | __Stack]);
+yeccpars2(265, 'let', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 58, [265 | __Ss], [__T | __Stack]);
+yeccpars2(265, 'fun', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 23, [265 | __Ss], [__T | __Stack]);
+yeccpars2(265, 'do', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 52, [265 | __Ss], [__T | __Stack]);
+yeccpars2(265, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 41, [265 | __Ss], [__T | __Stack]);
+yeccpars2(265, '#', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 34, [265 | __Ss], [__T | __Stack]);
+yeccpars2(265, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 37, [265 | __Ss], [__T | __Stack]);
+yeccpars2(265, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 74, [265 | __Ss], [__T | __Stack]);
+yeccpars2(265, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [265 | __Ss], [__T | __Stack]);
+yeccpars2(265, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [265 | __Ss], [__T | __Stack]);
+yeccpars2(265, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [265 | __Ss], [__T | __Stack]);
+yeccpars2(265, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [265 | __Ss], [__T | __Stack]);
+yeccpars2(265, '<', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 36, [265 | __Ss], [__T | __Stack]);
+yeccpars2(265, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 35, [265 | __Ss], [__T | __Stack]);
+yeccpars2(265, 'var', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 30, [265 | __Ss], [__T | __Stack]);
+yeccpars2(265, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(266, __Cat, __Ss, [__5,__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_fun{vars = [], body = __5},
+ __Nss = lists:nthtail(4, __Ss),
+ yeccpars2(yeccgoto(fun_expr, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(267, '-|', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 125, [267 | __Ss], [__T | __Stack]);
+yeccpars2(267, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(268, '-|', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 269, [268 | __Ss], [__T | __Stack]);
+yeccpars2(268, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(269, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 126, [269 | __Ss], [__T | __Stack]);
+yeccpars2(269, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(270, ')', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 271, [270 | __Ss], [__T | __Stack]);
+yeccpars2(270, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(271, __Cat, __Ss, [__5,__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = core_lib:set_anno(__2,__4),
+ __Nss = lists:nthtail(4, __Ss),
+ yeccpars2(yeccgoto(anno_fun, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(272, '-|', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 273, [272 | __Ss], [__T | __Stack]);
+yeccpars2(272, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(273, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 126, [273 | __Ss], [__T | __Stack]);
+yeccpars2(273, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(274, ')', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 275, [274 | __Ss], [__T | __Stack]);
+yeccpars2(274, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(275, __Cat, __Ss, [__5,__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = core_lib:set_anno(__2,__4),
+ __Nss = lists:nthtail(4, __Ss),
+ yeccpars2(yeccgoto(anno_function_name, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(276, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 278, [276 | __Ss], [__T | __Stack]);
+yeccpars2(276, ']', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 277, [276 | __Ss], [__T | __Stack]);
+yeccpars2(276, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(277, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [],
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(module_attribute, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(278, '=', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 284, [278 | __Ss], [__T | __Stack]);
+yeccpars2(278, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(279, ',', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 282, [279 | __Ss], [__T | __Stack]);
+yeccpars2(279, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__1],
+ yeccpars2(yeccgoto(attribute_list, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(280, ']', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 281, [280 | __Ss], [__T | __Stack]);
+yeccpars2(280, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(281, __Cat, __Ss, [__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __3,
+ __Nss = lists:nthtail(3, __Ss),
+ yeccpars2(yeccgoto(module_attribute, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(282, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 278, [282 | __Ss], [__T | __Stack]);
+yeccpars2(282, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(283, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__1|__3],
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(attribute_list, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(284, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 285, [284 | __Ss], [__T | __Stack]);
+yeccpars2(284, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 290, [284 | __Ss], [__T | __Stack]);
+yeccpars2(284, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [284 | __Ss], [__T | __Stack]);
+yeccpars2(284, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 104, [284 | __Ss], [__T | __Stack]);
+yeccpars2(284, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [284 | __Ss], [__T | __Stack]);
+yeccpars2(284, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [284 | __Ss], [__T | __Stack]);
+yeccpars2(284, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [284 | __Ss], [__T | __Stack]);
+yeccpars2(284, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(285, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 285, [285 | __Ss], [__T | __Stack]);
+yeccpars2(285, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 290, [285 | __Ss], [__T | __Stack]);
+yeccpars2(285, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [285 | __Ss], [__T | __Stack]);
+yeccpars2(285, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 104, [285 | __Ss], [__T | __Stack]);
+yeccpars2(285, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [285 | __Ss], [__T | __Stack]);
+yeccpars2(285, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [285 | __Ss], [__T | __Stack]);
+yeccpars2(285, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [285 | __Ss], [__T | __Stack]);
+yeccpars2(285, ']', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 149, [285 | __Ss], [__T | __Stack]);
+yeccpars2(285, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(286, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(literal, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(287, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(literal, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(288, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_def{name = #c_atom{val = tok_val(__1)}, val = __3},
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(attribute, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(289, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(literal, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(290, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 285, [290 | __Ss], [__T | __Stack]);
+yeccpars2(290, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 290, [290 | __Ss], [__T | __Stack]);
+yeccpars2(290, '}', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 293, [290 | __Ss], [__T | __Stack]);
+yeccpars2(290, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [290 | __Ss], [__T | __Stack]);
+yeccpars2(290, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 104, [290 | __Ss], [__T | __Stack]);
+yeccpars2(290, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [290 | __Ss], [__T | __Stack]);
+yeccpars2(290, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [290 | __Ss], [__T | __Stack]);
+yeccpars2(290, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [290 | __Ss], [__T | __Stack]);
+yeccpars2(290, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(291, ',', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 295, [291 | __Ss], [__T | __Stack]);
+yeccpars2(291, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__1],
+ yeccpars2(yeccgoto(literals, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(292, '}', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 294, [292 | __Ss], [__T | __Stack]);
+yeccpars2(292, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(293, __Cat, __Ss, [__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_tuple{es = []},
+ __Nss = lists:nthtail(1, __Ss),
+ yeccpars2(yeccgoto(tuple_literal, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(294, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_tuple{es = __2},
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(tuple_literal, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(295, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 285, [295 | __Ss], [__T | __Stack]);
+yeccpars2(295, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 290, [295 | __Ss], [__T | __Stack]);
+yeccpars2(295, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [295 | __Ss], [__T | __Stack]);
+yeccpars2(295, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 104, [295 | __Ss], [__T | __Stack]);
+yeccpars2(295, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [295 | __Ss], [__T | __Stack]);
+yeccpars2(295, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [295 | __Ss], [__T | __Stack]);
+yeccpars2(295, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [295 | __Ss], [__T | __Stack]);
+yeccpars2(295, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(296, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__1|__3],
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(literals, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(297, ',', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 298, [297 | __Ss], [__T | __Stack]);
+yeccpars2(297, '|', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 301, [297 | __Ss], [__T | __Stack]);
+yeccpars2(297, ']', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 299, [297 | __Ss], [__T | __Stack]);
+yeccpars2(297, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(298, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 285, [298 | __Ss], [__T | __Stack]);
+yeccpars2(298, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 290, [298 | __Ss], [__T | __Stack]);
+yeccpars2(298, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [298 | __Ss], [__T | __Stack]);
+yeccpars2(298, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 104, [298 | __Ss], [__T | __Stack]);
+yeccpars2(298, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [298 | __Ss], [__T | __Stack]);
+yeccpars2(298, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [298 | __Ss], [__T | __Stack]);
+yeccpars2(298, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [298 | __Ss], [__T | __Stack]);
+yeccpars2(298, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(299, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_nil{},
+ yeccpars2(yeccgoto(tail_literal, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(300, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_cons{hd = __2, tl = __3},
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(cons_literal, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(301, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 285, [301 | __Ss], [__T | __Stack]);
+yeccpars2(301, '{', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 290, [301 | __Ss], [__T | __Stack]);
+yeccpars2(301, 'string', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 69, [301 | __Ss], [__T | __Stack]);
+yeccpars2(301, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 104, [301 | __Ss], [__T | __Stack]);
+yeccpars2(301, 'float', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 54, [301 | __Ss], [__T | __Stack]);
+yeccpars2(301, 'integer', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 57, [301 | __Ss], [__T | __Stack]);
+yeccpars2(301, 'char', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 50, [301 | __Ss], [__T | __Stack]);
+yeccpars2(301, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(302, ']', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 303, [302 | __Ss], [__T | __Stack]);
+yeccpars2(302, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(303, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __2,
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(tail_literal, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(304, ',', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 298, [304 | __Ss], [__T | __Stack]);
+yeccpars2(304, '|', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 301, [304 | __Ss], [__T | __Stack]);
+yeccpars2(304, ']', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 299, [304 | __Ss], [__T | __Stack]);
+yeccpars2(304, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(305, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_cons{hd = __2, tl = __3},
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(tail_literal, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(306, __Cat, __Ss, [__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [],
+ __Nss = lists:nthtail(1, __Ss),
+ yeccpars2(yeccgoto(module_export, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(307, ',', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 311, [307 | __Ss], [__T | __Stack]);
+yeccpars2(307, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__1],
+ yeccpars2(yeccgoto(exported_names, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(308, ']', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 310, [308 | __Ss], [__T | __Stack]);
+yeccpars2(308, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(309, __Cat, __Ss, [__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __1,
+ yeccpars2(yeccgoto(exported_name, hd(__Ss)), __Cat, __Ss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(310, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = __2,
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(module_export, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(311, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 11, [311 | __Ss], [__T | __Stack]);
+yeccpars2(311, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(312, __Cat, __Ss, [__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = [__1|__3],
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto(exported_names, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(313, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 314, [313 | __Ss], [__T | __Stack]);
+yeccpars2(313, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(314, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 5, [314 | __Ss], [__T | __Stack]);
+yeccpars2(314, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(315, 'attributes', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 7, [315 | __Ss], [__T | __Stack]);
+yeccpars2(315, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(316, '(', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 9, [316 | __Ss], [__T | __Stack]);
+yeccpars2(316, 'atom', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 11, [316 | __Ss], [__T | __Stack]);
+yeccpars2(316, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ __Val = [],
+ yeccpars2(13, __Cat, [316 | __Ss], [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(317, 'end', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 318, [317 | __Ss], [__T | __Stack]);
+yeccpars2(317, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(318, '-|', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 319, [318 | __Ss], [__T | __Stack]);
+yeccpars2(318, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(319, '[', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 126, [319 | __Ss], [__T | __Stack]);
+yeccpars2(319, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(320, ')', __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 321, [320 | __Ss], [__T | __Stack]);
+yeccpars2(320, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(321, __Cat, __Ss, [__10,__9,__8,__7,__6,__5,__4,__3,__2,__1|__Stack], __T, __Ts, __Tzr) ->
+ __Val = #c_module{anno = __9, name = tok_val(__3), exports = __4, attrs = __5, defs = __6},
+ __Nss = lists:nthtail(9, __Ss),
+ yeccpars2(yeccgoto(module_definition, hd(__Nss)), __Cat, __Nss, [__Val | __Stack], __T, __Ts, __Tzr);
+yeccpars2(__Other, _, _, _, _, _, _) ->
+ exit({parser, __Other, missing_state_in_action_table}).
+
+yeccgoto(anno_clause, 65) ->
+ 100;
+yeccgoto(anno_clause, 100) ->
+ 100;
+yeccgoto(anno_clause, 222) ->
+ 100;
+yeccgoto(anno_clauses, 65) ->
+ 101;
+yeccgoto(anno_clauses, 100) ->
+ 169;
+yeccgoto(anno_clauses, 222) ->
+ 223;
+yeccgoto(anno_expression, 33) ->
+ 38;
+yeccgoto(anno_expression, 36) ->
+ 75;
+yeccgoto(anno_expression, 37) ->
+ 231;
+yeccgoto(anno_expression, 40) ->
+ 229;
+yeccgoto(anno_expression, 44) ->
+ 225;
+yeccgoto(anno_expression, 46) ->
+ 221;
+yeccgoto(anno_expression, 48) ->
+ 220;
+yeccgoto(anno_expression, 52) ->
+ 218;
+yeccgoto(anno_expression, 70) ->
+ 81;
+yeccgoto(anno_expression, 74) ->
+ 75;
+yeccgoto(anno_expression, 79) ->
+ 75;
+yeccgoto(anno_expression, 86) ->
+ 87;
+yeccgoto(anno_expression, 90) ->
+ 91;
+yeccgoto(anno_expression, 99) ->
+ 170;
+yeccgoto(anno_expression, 164) ->
+ 165;
+yeccgoto(anno_expression, 166) ->
+ 167;
+yeccgoto(anno_expression, 171) ->
+ 172;
+yeccgoto(anno_expression, 203) ->
+ 75;
+yeccgoto(anno_expression, 211) ->
+ 212;
+yeccgoto(anno_expression, 214) ->
+ 215;
+yeccgoto(anno_expression, 216) ->
+ 217;
+yeccgoto(anno_expression, 218) ->
+ 219;
+yeccgoto(anno_expression, 226) ->
+ 227;
+yeccgoto(anno_expression, 232) ->
+ 238;
+yeccgoto(anno_expression, 235) ->
+ 236;
+yeccgoto(anno_expression, 257) ->
+ 258;
+yeccgoto(anno_expression, 260) ->
+ 75;
+yeccgoto(anno_expression, 265) ->
+ 266;
+yeccgoto(anno_expressions, 36) ->
+ 241;
+yeccgoto(anno_expressions, 74) ->
+ 76;
+yeccgoto(anno_expressions, 79) ->
+ 80;
+yeccgoto(anno_expressions, 203) ->
+ 206;
+yeccgoto(anno_expressions, 260) ->
+ 261;
+yeccgoto(anno_fun, 20) ->
+ 22;
+yeccgoto(anno_function_name, 8) ->
+ 10;
+yeccgoto(anno_function_name, 12) ->
+ 10;
+yeccgoto(anno_function_name, 60) ->
+ 10;
+yeccgoto(anno_function_name, 316) ->
+ 10;
+yeccgoto(anno_pattern, 65) ->
+ 102;
+yeccgoto(anno_pattern, 96) ->
+ 102;
+yeccgoto(anno_pattern, 97) ->
+ 116;
+yeccgoto(anno_pattern, 98) ->
+ 173;
+yeccgoto(anno_pattern, 100) ->
+ 102;
+yeccgoto(anno_pattern, 114) ->
+ 116;
+yeccgoto(anno_pattern, 120) ->
+ 116;
+yeccgoto(anno_pattern, 162) ->
+ 163;
+yeccgoto(anno_pattern, 174) ->
+ 180;
+yeccgoto(anno_pattern, 177) ->
+ 178;
+yeccgoto(anno_pattern, 200) ->
+ 201;
+yeccgoto(anno_pattern, 222) ->
+ 102;
+yeccgoto(anno_patterns, 97) ->
+ 183;
+yeccgoto(anno_patterns, 114) ->
+ 117;
+yeccgoto(anno_patterns, 120) ->
+ 121;
+yeccgoto(anno_variable, 25) ->
+ 28;
+yeccgoto(anno_variable, 58) ->
+ 84;
+yeccgoto(anno_variable, 65) ->
+ 103;
+yeccgoto(anno_variable, 82) ->
+ 84;
+yeccgoto(anno_variable, 83) ->
+ 28;
+yeccgoto(anno_variable, 88) ->
+ 84;
+yeccgoto(anno_variable, 96) ->
+ 103;
+yeccgoto(anno_variable, 97) ->
+ 103;
+yeccgoto(anno_variable, 98) ->
+ 103;
+yeccgoto(anno_variable, 100) ->
+ 103;
+yeccgoto(anno_variable, 114) ->
+ 103;
+yeccgoto(anno_variable, 115) ->
+ 122;
+yeccgoto(anno_variable, 120) ->
+ 103;
+yeccgoto(anno_variable, 162) ->
+ 103;
+yeccgoto(anno_variable, 174) ->
+ 103;
+yeccgoto(anno_variable, 177) ->
+ 103;
+yeccgoto(anno_variable, 200) ->
+ 103;
+yeccgoto(anno_variable, 222) ->
+ 103;
+yeccgoto(anno_variable, 263) ->
+ 28;
+yeccgoto(anno_variables, 25) ->
+ 29;
+yeccgoto(anno_variables, 83) ->
+ 93;
+yeccgoto(anno_variables, 263) ->
+ 264;
+yeccgoto(annotation, 125) ->
+ 127;
+yeccgoto(annotation, 159) ->
+ 160;
+yeccgoto(annotation, 187) ->
+ 188;
+yeccgoto(annotation, 244) ->
+ 245;
+yeccgoto(annotation, 269) ->
+ 270;
+yeccgoto(annotation, 273) ->
+ 274;
+yeccgoto(annotation, 319) ->
+ 320;
+yeccgoto(application_expr, 33) ->
+ 39;
+yeccgoto(application_expr, 35) ->
+ 39;
+yeccgoto(application_expr, 36) ->
+ 39;
+yeccgoto(application_expr, 37) ->
+ 39;
+yeccgoto(application_expr, 40) ->
+ 39;
+yeccgoto(application_expr, 44) ->
+ 39;
+yeccgoto(application_expr, 46) ->
+ 39;
+yeccgoto(application_expr, 48) ->
+ 39;
+yeccgoto(application_expr, 52) ->
+ 39;
+yeccgoto(application_expr, 70) ->
+ 39;
+yeccgoto(application_expr, 74) ->
+ 39;
+yeccgoto(application_expr, 79) ->
+ 39;
+yeccgoto(application_expr, 86) ->
+ 39;
+yeccgoto(application_expr, 90) ->
+ 39;
+yeccgoto(application_expr, 99) ->
+ 39;
+yeccgoto(application_expr, 164) ->
+ 39;
+yeccgoto(application_expr, 166) ->
+ 39;
+yeccgoto(application_expr, 171) ->
+ 39;
+yeccgoto(application_expr, 203) ->
+ 39;
+yeccgoto(application_expr, 211) ->
+ 39;
+yeccgoto(application_expr, 214) ->
+ 39;
+yeccgoto(application_expr, 216) ->
+ 39;
+yeccgoto(application_expr, 218) ->
+ 39;
+yeccgoto(application_expr, 226) ->
+ 39;
+yeccgoto(application_expr, 232) ->
+ 39;
+yeccgoto(application_expr, 235) ->
+ 39;
+yeccgoto(application_expr, 257) ->
+ 39;
+yeccgoto(application_expr, 260) ->
+ 39;
+yeccgoto(application_expr, 265) ->
+ 39;
+yeccgoto(arg_list, 202) ->
+ 204;
+yeccgoto(arg_list, 208) ->
+ 209;
+yeccgoto(arg_list, 227) ->
+ 228;
+yeccgoto(arg_list, 229) ->
+ 230;
+yeccgoto(atomic_constant, 126) ->
+ 132;
+yeccgoto(atomic_constant, 129) ->
+ 132;
+yeccgoto(atomic_constant, 142) ->
+ 132;
+yeccgoto(atomic_constant, 147) ->
+ 132;
+yeccgoto(atomic_constant, 151) ->
+ 132;
+yeccgoto(atomic_constant, 154) ->
+ 132;
+yeccgoto(atomic_literal, 33) ->
+ 42;
+yeccgoto(atomic_literal, 35) ->
+ 42;
+yeccgoto(atomic_literal, 36) ->
+ 42;
+yeccgoto(atomic_literal, 37) ->
+ 42;
+yeccgoto(atomic_literal, 40) ->
+ 42;
+yeccgoto(atomic_literal, 44) ->
+ 42;
+yeccgoto(atomic_literal, 46) ->
+ 42;
+yeccgoto(atomic_literal, 48) ->
+ 42;
+yeccgoto(atomic_literal, 52) ->
+ 42;
+yeccgoto(atomic_literal, 65) ->
+ 105;
+yeccgoto(atomic_literal, 70) ->
+ 42;
+yeccgoto(atomic_literal, 74) ->
+ 42;
+yeccgoto(atomic_literal, 79) ->
+ 42;
+yeccgoto(atomic_literal, 86) ->
+ 42;
+yeccgoto(atomic_literal, 90) ->
+ 42;
+yeccgoto(atomic_literal, 96) ->
+ 105;
+yeccgoto(atomic_literal, 97) ->
+ 105;
+yeccgoto(atomic_literal, 98) ->
+ 105;
+yeccgoto(atomic_literal, 99) ->
+ 42;
+yeccgoto(atomic_literal, 100) ->
+ 105;
+yeccgoto(atomic_literal, 114) ->
+ 105;
+yeccgoto(atomic_literal, 115) ->
+ 105;
+yeccgoto(atomic_literal, 120) ->
+ 105;
+yeccgoto(atomic_literal, 162) ->
+ 105;
+yeccgoto(atomic_literal, 164) ->
+ 42;
+yeccgoto(atomic_literal, 166) ->
+ 42;
+yeccgoto(atomic_literal, 171) ->
+ 42;
+yeccgoto(atomic_literal, 174) ->
+ 105;
+yeccgoto(atomic_literal, 177) ->
+ 105;
+yeccgoto(atomic_literal, 200) ->
+ 105;
+yeccgoto(atomic_literal, 203) ->
+ 42;
+yeccgoto(atomic_literal, 211) ->
+ 42;
+yeccgoto(atomic_literal, 214) ->
+ 42;
+yeccgoto(atomic_literal, 216) ->
+ 42;
+yeccgoto(atomic_literal, 218) ->
+ 42;
+yeccgoto(atomic_literal, 222) ->
+ 105;
+yeccgoto(atomic_literal, 226) ->
+ 42;
+yeccgoto(atomic_literal, 232) ->
+ 42;
+yeccgoto(atomic_literal, 235) ->
+ 42;
+yeccgoto(atomic_literal, 257) ->
+ 42;
+yeccgoto(atomic_literal, 260) ->
+ 42;
+yeccgoto(atomic_literal, 265) ->
+ 42;
+yeccgoto(atomic_literal, 284) ->
+ 286;
+yeccgoto(atomic_literal, 285) ->
+ 286;
+yeccgoto(atomic_literal, 290) ->
+ 286;
+yeccgoto(atomic_literal, 295) ->
+ 286;
+yeccgoto(atomic_literal, 298) ->
+ 286;
+yeccgoto(atomic_literal, 301) ->
+ 286;
+yeccgoto(atomic_pattern, 65) ->
+ 106;
+yeccgoto(atomic_pattern, 96) ->
+ 106;
+yeccgoto(atomic_pattern, 97) ->
+ 106;
+yeccgoto(atomic_pattern, 98) ->
+ 106;
+yeccgoto(atomic_pattern, 100) ->
+ 106;
+yeccgoto(atomic_pattern, 114) ->
+ 106;
+yeccgoto(atomic_pattern, 115) ->
+ 106;
+yeccgoto(atomic_pattern, 120) ->
+ 106;
+yeccgoto(atomic_pattern, 162) ->
+ 106;
+yeccgoto(atomic_pattern, 174) ->
+ 106;
+yeccgoto(atomic_pattern, 177) ->
+ 106;
+yeccgoto(atomic_pattern, 200) ->
+ 106;
+yeccgoto(atomic_pattern, 222) ->
+ 106;
+yeccgoto(attribute, 276) ->
+ 279;
+yeccgoto(attribute, 282) ->
+ 279;
+yeccgoto(attribute_list, 276) ->
+ 280;
+yeccgoto(attribute_list, 282) ->
+ 283;
+yeccgoto(binary, 33) ->
+ 43;
+yeccgoto(binary, 35) ->
+ 43;
+yeccgoto(binary, 36) ->
+ 43;
+yeccgoto(binary, 37) ->
+ 43;
+yeccgoto(binary, 40) ->
+ 43;
+yeccgoto(binary, 44) ->
+ 43;
+yeccgoto(binary, 46) ->
+ 43;
+yeccgoto(binary, 48) ->
+ 43;
+yeccgoto(binary, 52) ->
+ 43;
+yeccgoto(binary, 70) ->
+ 43;
+yeccgoto(binary, 74) ->
+ 43;
+yeccgoto(binary, 79) ->
+ 43;
+yeccgoto(binary, 86) ->
+ 43;
+yeccgoto(binary, 90) ->
+ 43;
+yeccgoto(binary, 99) ->
+ 43;
+yeccgoto(binary, 164) ->
+ 43;
+yeccgoto(binary, 166) ->
+ 43;
+yeccgoto(binary, 171) ->
+ 43;
+yeccgoto(binary, 203) ->
+ 43;
+yeccgoto(binary, 211) ->
+ 43;
+yeccgoto(binary, 214) ->
+ 43;
+yeccgoto(binary, 216) ->
+ 43;
+yeccgoto(binary, 218) ->
+ 43;
+yeccgoto(binary, 226) ->
+ 43;
+yeccgoto(binary, 232) ->
+ 43;
+yeccgoto(binary, 235) ->
+ 43;
+yeccgoto(binary, 257) ->
+ 43;
+yeccgoto(binary, 260) ->
+ 43;
+yeccgoto(binary, 265) ->
+ 43;
+yeccgoto(binary_pattern, 65) ->
+ 107;
+yeccgoto(binary_pattern, 96) ->
+ 107;
+yeccgoto(binary_pattern, 97) ->
+ 107;
+yeccgoto(binary_pattern, 98) ->
+ 107;
+yeccgoto(binary_pattern, 100) ->
+ 107;
+yeccgoto(binary_pattern, 114) ->
+ 107;
+yeccgoto(binary_pattern, 115) ->
+ 107;
+yeccgoto(binary_pattern, 120) ->
+ 107;
+yeccgoto(binary_pattern, 162) ->
+ 107;
+yeccgoto(binary_pattern, 174) ->
+ 107;
+yeccgoto(binary_pattern, 177) ->
+ 107;
+yeccgoto(binary_pattern, 200) ->
+ 107;
+yeccgoto(binary_pattern, 222) ->
+ 107;
+yeccgoto(call_expr, 33) ->
+ 45;
+yeccgoto(call_expr, 35) ->
+ 45;
+yeccgoto(call_expr, 36) ->
+ 45;
+yeccgoto(call_expr, 37) ->
+ 45;
+yeccgoto(call_expr, 40) ->
+ 45;
+yeccgoto(call_expr, 44) ->
+ 45;
+yeccgoto(call_expr, 46) ->
+ 45;
+yeccgoto(call_expr, 48) ->
+ 45;
+yeccgoto(call_expr, 52) ->
+ 45;
+yeccgoto(call_expr, 70) ->
+ 45;
+yeccgoto(call_expr, 74) ->
+ 45;
+yeccgoto(call_expr, 79) ->
+ 45;
+yeccgoto(call_expr, 86) ->
+ 45;
+yeccgoto(call_expr, 90) ->
+ 45;
+yeccgoto(call_expr, 99) ->
+ 45;
+yeccgoto(call_expr, 164) ->
+ 45;
+yeccgoto(call_expr, 166) ->
+ 45;
+yeccgoto(call_expr, 171) ->
+ 45;
+yeccgoto(call_expr, 203) ->
+ 45;
+yeccgoto(call_expr, 211) ->
+ 45;
+yeccgoto(call_expr, 214) ->
+ 45;
+yeccgoto(call_expr, 216) ->
+ 45;
+yeccgoto(call_expr, 218) ->
+ 45;
+yeccgoto(call_expr, 226) ->
+ 45;
+yeccgoto(call_expr, 232) ->
+ 45;
+yeccgoto(call_expr, 235) ->
+ 45;
+yeccgoto(call_expr, 257) ->
+ 45;
+yeccgoto(call_expr, 260) ->
+ 45;
+yeccgoto(call_expr, 265) ->
+ 45;
+yeccgoto(case_expr, 33) ->
+ 47;
+yeccgoto(case_expr, 35) ->
+ 47;
+yeccgoto(case_expr, 36) ->
+ 47;
+yeccgoto(case_expr, 37) ->
+ 47;
+yeccgoto(case_expr, 40) ->
+ 47;
+yeccgoto(case_expr, 44) ->
+ 47;
+yeccgoto(case_expr, 46) ->
+ 47;
+yeccgoto(case_expr, 48) ->
+ 47;
+yeccgoto(case_expr, 52) ->
+ 47;
+yeccgoto(case_expr, 70) ->
+ 47;
+yeccgoto(case_expr, 74) ->
+ 47;
+yeccgoto(case_expr, 79) ->
+ 47;
+yeccgoto(case_expr, 86) ->
+ 47;
+yeccgoto(case_expr, 90) ->
+ 47;
+yeccgoto(case_expr, 99) ->
+ 47;
+yeccgoto(case_expr, 164) ->
+ 47;
+yeccgoto(case_expr, 166) ->
+ 47;
+yeccgoto(case_expr, 171) ->
+ 47;
+yeccgoto(case_expr, 203) ->
+ 47;
+yeccgoto(case_expr, 211) ->
+ 47;
+yeccgoto(case_expr, 214) ->
+ 47;
+yeccgoto(case_expr, 216) ->
+ 47;
+yeccgoto(case_expr, 218) ->
+ 47;
+yeccgoto(case_expr, 226) ->
+ 47;
+yeccgoto(case_expr, 232) ->
+ 47;
+yeccgoto(case_expr, 235) ->
+ 47;
+yeccgoto(case_expr, 257) ->
+ 47;
+yeccgoto(case_expr, 260) ->
+ 47;
+yeccgoto(case_expr, 265) ->
+ 47;
+yeccgoto(catch_expr, 33) ->
+ 49;
+yeccgoto(catch_expr, 35) ->
+ 49;
+yeccgoto(catch_expr, 36) ->
+ 49;
+yeccgoto(catch_expr, 37) ->
+ 49;
+yeccgoto(catch_expr, 40) ->
+ 49;
+yeccgoto(catch_expr, 44) ->
+ 49;
+yeccgoto(catch_expr, 46) ->
+ 49;
+yeccgoto(catch_expr, 48) ->
+ 49;
+yeccgoto(catch_expr, 52) ->
+ 49;
+yeccgoto(catch_expr, 70) ->
+ 49;
+yeccgoto(catch_expr, 74) ->
+ 49;
+yeccgoto(catch_expr, 79) ->
+ 49;
+yeccgoto(catch_expr, 86) ->
+ 49;
+yeccgoto(catch_expr, 90) ->
+ 49;
+yeccgoto(catch_expr, 99) ->
+ 49;
+yeccgoto(catch_expr, 164) ->
+ 49;
+yeccgoto(catch_expr, 166) ->
+ 49;
+yeccgoto(catch_expr, 171) ->
+ 49;
+yeccgoto(catch_expr, 203) ->
+ 49;
+yeccgoto(catch_expr, 211) ->
+ 49;
+yeccgoto(catch_expr, 214) ->
+ 49;
+yeccgoto(catch_expr, 216) ->
+ 49;
+yeccgoto(catch_expr, 218) ->
+ 49;
+yeccgoto(catch_expr, 226) ->
+ 49;
+yeccgoto(catch_expr, 232) ->
+ 49;
+yeccgoto(catch_expr, 235) ->
+ 49;
+yeccgoto(catch_expr, 257) ->
+ 49;
+yeccgoto(catch_expr, 260) ->
+ 49;
+yeccgoto(catch_expr, 265) ->
+ 49;
+yeccgoto(clause, 65) ->
+ 108;
+yeccgoto(clause, 96) ->
+ 185;
+yeccgoto(clause, 100) ->
+ 108;
+yeccgoto(clause, 222) ->
+ 108;
+yeccgoto(clause_pattern, 65) ->
+ 109;
+yeccgoto(clause_pattern, 96) ->
+ 109;
+yeccgoto(clause_pattern, 100) ->
+ 109;
+yeccgoto(clause_pattern, 222) ->
+ 109;
+yeccgoto(cons, 33) ->
+ 51;
+yeccgoto(cons, 35) ->
+ 51;
+yeccgoto(cons, 36) ->
+ 51;
+yeccgoto(cons, 37) ->
+ 51;
+yeccgoto(cons, 40) ->
+ 51;
+yeccgoto(cons, 44) ->
+ 51;
+yeccgoto(cons, 46) ->
+ 51;
+yeccgoto(cons, 48) ->
+ 51;
+yeccgoto(cons, 52) ->
+ 51;
+yeccgoto(cons, 70) ->
+ 51;
+yeccgoto(cons, 74) ->
+ 51;
+yeccgoto(cons, 79) ->
+ 51;
+yeccgoto(cons, 86) ->
+ 51;
+yeccgoto(cons, 90) ->
+ 51;
+yeccgoto(cons, 99) ->
+ 51;
+yeccgoto(cons, 164) ->
+ 51;
+yeccgoto(cons, 166) ->
+ 51;
+yeccgoto(cons, 171) ->
+ 51;
+yeccgoto(cons, 203) ->
+ 51;
+yeccgoto(cons, 211) ->
+ 51;
+yeccgoto(cons, 214) ->
+ 51;
+yeccgoto(cons, 216) ->
+ 51;
+yeccgoto(cons, 218) ->
+ 51;
+yeccgoto(cons, 226) ->
+ 51;
+yeccgoto(cons, 232) ->
+ 51;
+yeccgoto(cons, 235) ->
+ 51;
+yeccgoto(cons, 257) ->
+ 51;
+yeccgoto(cons, 260) ->
+ 51;
+yeccgoto(cons, 265) ->
+ 51;
+yeccgoto(cons_constant, 126) ->
+ 134;
+yeccgoto(cons_constant, 129) ->
+ 134;
+yeccgoto(cons_constant, 142) ->
+ 134;
+yeccgoto(cons_constant, 147) ->
+ 134;
+yeccgoto(cons_constant, 151) ->
+ 134;
+yeccgoto(cons_constant, 154) ->
+ 134;
+yeccgoto(cons_literal, 284) ->
+ 287;
+yeccgoto(cons_literal, 285) ->
+ 287;
+yeccgoto(cons_literal, 290) ->
+ 287;
+yeccgoto(cons_literal, 295) ->
+ 287;
+yeccgoto(cons_literal, 298) ->
+ 287;
+yeccgoto(cons_literal, 301) ->
+ 287;
+yeccgoto(cons_pattern, 65) ->
+ 110;
+yeccgoto(cons_pattern, 96) ->
+ 110;
+yeccgoto(cons_pattern, 97) ->
+ 110;
+yeccgoto(cons_pattern, 98) ->
+ 110;
+yeccgoto(cons_pattern, 100) ->
+ 110;
+yeccgoto(cons_pattern, 114) ->
+ 110;
+yeccgoto(cons_pattern, 115) ->
+ 110;
+yeccgoto(cons_pattern, 120) ->
+ 110;
+yeccgoto(cons_pattern, 162) ->
+ 110;
+yeccgoto(cons_pattern, 174) ->
+ 110;
+yeccgoto(cons_pattern, 177) ->
+ 110;
+yeccgoto(cons_pattern, 200) ->
+ 110;
+yeccgoto(cons_pattern, 222) ->
+ 110;
+yeccgoto(constant, 126) ->
+ 135;
+yeccgoto(constant, 129) ->
+ 150;
+yeccgoto(constant, 142) ->
+ 135;
+yeccgoto(constant, 147) ->
+ 135;
+yeccgoto(constant, 151) ->
+ 157;
+yeccgoto(constant, 154) ->
+ 155;
+yeccgoto(constants, 126) ->
+ 136;
+yeccgoto(constants, 142) ->
+ 143;
+yeccgoto(constants, 147) ->
+ 148;
+yeccgoto(exported_name, 5) ->
+ 307;
+yeccgoto(exported_name, 311) ->
+ 307;
+yeccgoto(exported_names, 5) ->
+ 308;
+yeccgoto(exported_names, 311) ->
+ 312;
+yeccgoto(expression, 33) ->
+ 53;
+yeccgoto(expression, 35) ->
+ 243;
+yeccgoto(expression, 36) ->
+ 53;
+yeccgoto(expression, 37) ->
+ 53;
+yeccgoto(expression, 40) ->
+ 53;
+yeccgoto(expression, 44) ->
+ 53;
+yeccgoto(expression, 46) ->
+ 53;
+yeccgoto(expression, 48) ->
+ 53;
+yeccgoto(expression, 52) ->
+ 53;
+yeccgoto(expression, 70) ->
+ 53;
+yeccgoto(expression, 74) ->
+ 53;
+yeccgoto(expression, 79) ->
+ 53;
+yeccgoto(expression, 86) ->
+ 53;
+yeccgoto(expression, 90) ->
+ 53;
+yeccgoto(expression, 99) ->
+ 53;
+yeccgoto(expression, 164) ->
+ 53;
+yeccgoto(expression, 166) ->
+ 53;
+yeccgoto(expression, 171) ->
+ 53;
+yeccgoto(expression, 203) ->
+ 53;
+yeccgoto(expression, 211) ->
+ 53;
+yeccgoto(expression, 214) ->
+ 53;
+yeccgoto(expression, 216) ->
+ 53;
+yeccgoto(expression, 218) ->
+ 53;
+yeccgoto(expression, 226) ->
+ 53;
+yeccgoto(expression, 232) ->
+ 53;
+yeccgoto(expression, 235) ->
+ 53;
+yeccgoto(expression, 257) ->
+ 53;
+yeccgoto(expression, 260) ->
+ 53;
+yeccgoto(expression, 265) ->
+ 53;
+yeccgoto(fun_expr, 20) ->
+ 24;
+yeccgoto(fun_expr, 21) ->
+ 268;
+yeccgoto(fun_expr, 33) ->
+ 55;
+yeccgoto(fun_expr, 35) ->
+ 55;
+yeccgoto(fun_expr, 36) ->
+ 55;
+yeccgoto(fun_expr, 37) ->
+ 55;
+yeccgoto(fun_expr, 40) ->
+ 55;
+yeccgoto(fun_expr, 44) ->
+ 55;
+yeccgoto(fun_expr, 46) ->
+ 55;
+yeccgoto(fun_expr, 48) ->
+ 55;
+yeccgoto(fun_expr, 52) ->
+ 55;
+yeccgoto(fun_expr, 70) ->
+ 55;
+yeccgoto(fun_expr, 74) ->
+ 55;
+yeccgoto(fun_expr, 79) ->
+ 55;
+yeccgoto(fun_expr, 86) ->
+ 55;
+yeccgoto(fun_expr, 90) ->
+ 55;
+yeccgoto(fun_expr, 99) ->
+ 55;
+yeccgoto(fun_expr, 164) ->
+ 55;
+yeccgoto(fun_expr, 166) ->
+ 55;
+yeccgoto(fun_expr, 171) ->
+ 55;
+yeccgoto(fun_expr, 203) ->
+ 55;
+yeccgoto(fun_expr, 211) ->
+ 55;
+yeccgoto(fun_expr, 214) ->
+ 55;
+yeccgoto(fun_expr, 216) ->
+ 55;
+yeccgoto(fun_expr, 218) ->
+ 55;
+yeccgoto(fun_expr, 226) ->
+ 55;
+yeccgoto(fun_expr, 232) ->
+ 55;
+yeccgoto(fun_expr, 235) ->
+ 55;
+yeccgoto(fun_expr, 257) ->
+ 55;
+yeccgoto(fun_expr, 260) ->
+ 55;
+yeccgoto(fun_expr, 265) ->
+ 55;
+yeccgoto(function_definition, 8) ->
+ 12;
+yeccgoto(function_definition, 12) ->
+ 12;
+yeccgoto(function_definition, 60) ->
+ 12;
+yeccgoto(function_definition, 316) ->
+ 12;
+yeccgoto(function_definitions, 8) ->
+ 13;
+yeccgoto(function_definitions, 12) ->
+ 17;
+yeccgoto(function_definitions, 60) ->
+ 210;
+yeccgoto(function_definitions, 316) ->
+ 13;
+yeccgoto(function_name, 5) ->
+ 309;
+yeccgoto(function_name, 8) ->
+ 14;
+yeccgoto(function_name, 9) ->
+ 272;
+yeccgoto(function_name, 12) ->
+ 14;
+yeccgoto(function_name, 33) ->
+ 56;
+yeccgoto(function_name, 35) ->
+ 56;
+yeccgoto(function_name, 36) ->
+ 56;
+yeccgoto(function_name, 37) ->
+ 56;
+yeccgoto(function_name, 40) ->
+ 56;
+yeccgoto(function_name, 44) ->
+ 56;
+yeccgoto(function_name, 46) ->
+ 56;
+yeccgoto(function_name, 48) ->
+ 56;
+yeccgoto(function_name, 52) ->
+ 56;
+yeccgoto(function_name, 60) ->
+ 14;
+yeccgoto(function_name, 70) ->
+ 56;
+yeccgoto(function_name, 74) ->
+ 56;
+yeccgoto(function_name, 79) ->
+ 56;
+yeccgoto(function_name, 86) ->
+ 56;
+yeccgoto(function_name, 90) ->
+ 56;
+yeccgoto(function_name, 99) ->
+ 56;
+yeccgoto(function_name, 164) ->
+ 56;
+yeccgoto(function_name, 166) ->
+ 56;
+yeccgoto(function_name, 171) ->
+ 56;
+yeccgoto(function_name, 203) ->
+ 56;
+yeccgoto(function_name, 211) ->
+ 56;
+yeccgoto(function_name, 214) ->
+ 56;
+yeccgoto(function_name, 216) ->
+ 56;
+yeccgoto(function_name, 218) ->
+ 56;
+yeccgoto(function_name, 226) ->
+ 56;
+yeccgoto(function_name, 232) ->
+ 56;
+yeccgoto(function_name, 235) ->
+ 56;
+yeccgoto(function_name, 257) ->
+ 56;
+yeccgoto(function_name, 260) ->
+ 56;
+yeccgoto(function_name, 265) ->
+ 56;
+yeccgoto(function_name, 311) ->
+ 309;
+yeccgoto(function_name, 316) ->
+ 14;
+yeccgoto(let_expr, 33) ->
+ 59;
+yeccgoto(let_expr, 35) ->
+ 59;
+yeccgoto(let_expr, 36) ->
+ 59;
+yeccgoto(let_expr, 37) ->
+ 59;
+yeccgoto(let_expr, 40) ->
+ 59;
+yeccgoto(let_expr, 44) ->
+ 59;
+yeccgoto(let_expr, 46) ->
+ 59;
+yeccgoto(let_expr, 48) ->
+ 59;
+yeccgoto(let_expr, 52) ->
+ 59;
+yeccgoto(let_expr, 70) ->
+ 59;
+yeccgoto(let_expr, 74) ->
+ 59;
+yeccgoto(let_expr, 79) ->
+ 59;
+yeccgoto(let_expr, 86) ->
+ 59;
+yeccgoto(let_expr, 90) ->
+ 59;
+yeccgoto(let_expr, 99) ->
+ 59;
+yeccgoto(let_expr, 164) ->
+ 59;
+yeccgoto(let_expr, 166) ->
+ 59;
+yeccgoto(let_expr, 171) ->
+ 59;
+yeccgoto(let_expr, 203) ->
+ 59;
+yeccgoto(let_expr, 211) ->
+ 59;
+yeccgoto(let_expr, 214) ->
+ 59;
+yeccgoto(let_expr, 216) ->
+ 59;
+yeccgoto(let_expr, 218) ->
+ 59;
+yeccgoto(let_expr, 226) ->
+ 59;
+yeccgoto(let_expr, 232) ->
+ 59;
+yeccgoto(let_expr, 235) ->
+ 59;
+yeccgoto(let_expr, 257) ->
+ 59;
+yeccgoto(let_expr, 260) ->
+ 59;
+yeccgoto(let_expr, 265) ->
+ 59;
+yeccgoto(let_vars, 58) ->
+ 213;
+yeccgoto(let_vars, 82) ->
+ 85;
+yeccgoto(let_vars, 88) ->
+ 89;
+yeccgoto(letrec_expr, 33) ->
+ 61;
+yeccgoto(letrec_expr, 35) ->
+ 61;
+yeccgoto(letrec_expr, 36) ->
+ 61;
+yeccgoto(letrec_expr, 37) ->
+ 61;
+yeccgoto(letrec_expr, 40) ->
+ 61;
+yeccgoto(letrec_expr, 44) ->
+ 61;
+yeccgoto(letrec_expr, 46) ->
+ 61;
+yeccgoto(letrec_expr, 48) ->
+ 61;
+yeccgoto(letrec_expr, 52) ->
+ 61;
+yeccgoto(letrec_expr, 70) ->
+ 61;
+yeccgoto(letrec_expr, 74) ->
+ 61;
+yeccgoto(letrec_expr, 79) ->
+ 61;
+yeccgoto(letrec_expr, 86) ->
+ 61;
+yeccgoto(letrec_expr, 90) ->
+ 61;
+yeccgoto(letrec_expr, 99) ->
+ 61;
+yeccgoto(letrec_expr, 164) ->
+ 61;
+yeccgoto(letrec_expr, 166) ->
+ 61;
+yeccgoto(letrec_expr, 171) ->
+ 61;
+yeccgoto(letrec_expr, 203) ->
+ 61;
+yeccgoto(letrec_expr, 211) ->
+ 61;
+yeccgoto(letrec_expr, 214) ->
+ 61;
+yeccgoto(letrec_expr, 216) ->
+ 61;
+yeccgoto(letrec_expr, 218) ->
+ 61;
+yeccgoto(letrec_expr, 226) ->
+ 61;
+yeccgoto(letrec_expr, 232) ->
+ 61;
+yeccgoto(letrec_expr, 235) ->
+ 61;
+yeccgoto(letrec_expr, 257) ->
+ 61;
+yeccgoto(letrec_expr, 260) ->
+ 61;
+yeccgoto(letrec_expr, 265) ->
+ 61;
+yeccgoto(literal, 284) ->
+ 288;
+yeccgoto(literal, 285) ->
+ 297;
+yeccgoto(literal, 290) ->
+ 291;
+yeccgoto(literal, 295) ->
+ 291;
+yeccgoto(literal, 298) ->
+ 304;
+yeccgoto(literal, 301) ->
+ 302;
+yeccgoto(literals, 290) ->
+ 292;
+yeccgoto(literals, 295) ->
+ 296;
+yeccgoto(module_attribute, 6) ->
+ 8;
+yeccgoto(module_attribute, 315) ->
+ 316;
+yeccgoto(module_definition, 0) ->
+ 3;
+yeccgoto(module_defs, 8) ->
+ 15;
+yeccgoto(module_defs, 316) ->
+ 317;
+yeccgoto(module_export, 4) ->
+ 6;
+yeccgoto(module_export, 314) ->
+ 315;
+yeccgoto(nil, 33) ->
+ 62;
+yeccgoto(nil, 35) ->
+ 62;
+yeccgoto(nil, 36) ->
+ 62;
+yeccgoto(nil, 37) ->
+ 62;
+yeccgoto(nil, 40) ->
+ 62;
+yeccgoto(nil, 44) ->
+ 62;
+yeccgoto(nil, 46) ->
+ 62;
+yeccgoto(nil, 48) ->
+ 62;
+yeccgoto(nil, 52) ->
+ 62;
+yeccgoto(nil, 65) ->
+ 62;
+yeccgoto(nil, 70) ->
+ 62;
+yeccgoto(nil, 74) ->
+ 62;
+yeccgoto(nil, 79) ->
+ 62;
+yeccgoto(nil, 86) ->
+ 62;
+yeccgoto(nil, 90) ->
+ 62;
+yeccgoto(nil, 96) ->
+ 62;
+yeccgoto(nil, 97) ->
+ 62;
+yeccgoto(nil, 98) ->
+ 62;
+yeccgoto(nil, 99) ->
+ 62;
+yeccgoto(nil, 100) ->
+ 62;
+yeccgoto(nil, 114) ->
+ 62;
+yeccgoto(nil, 115) ->
+ 62;
+yeccgoto(nil, 120) ->
+ 62;
+yeccgoto(nil, 126) ->
+ 139;
+yeccgoto(nil, 129) ->
+ 139;
+yeccgoto(nil, 142) ->
+ 139;
+yeccgoto(nil, 147) ->
+ 139;
+yeccgoto(nil, 151) ->
+ 139;
+yeccgoto(nil, 154) ->
+ 139;
+yeccgoto(nil, 162) ->
+ 62;
+yeccgoto(nil, 164) ->
+ 62;
+yeccgoto(nil, 166) ->
+ 62;
+yeccgoto(nil, 171) ->
+ 62;
+yeccgoto(nil, 174) ->
+ 62;
+yeccgoto(nil, 177) ->
+ 62;
+yeccgoto(nil, 200) ->
+ 62;
+yeccgoto(nil, 203) ->
+ 62;
+yeccgoto(nil, 211) ->
+ 62;
+yeccgoto(nil, 214) ->
+ 62;
+yeccgoto(nil, 216) ->
+ 62;
+yeccgoto(nil, 218) ->
+ 62;
+yeccgoto(nil, 222) ->
+ 62;
+yeccgoto(nil, 226) ->
+ 62;
+yeccgoto(nil, 232) ->
+ 62;
+yeccgoto(nil, 235) ->
+ 62;
+yeccgoto(nil, 257) ->
+ 62;
+yeccgoto(nil, 260) ->
+ 62;
+yeccgoto(nil, 265) ->
+ 62;
+yeccgoto(nil, 284) ->
+ 62;
+yeccgoto(nil, 285) ->
+ 62;
+yeccgoto(nil, 290) ->
+ 62;
+yeccgoto(nil, 295) ->
+ 62;
+yeccgoto(nil, 298) ->
+ 62;
+yeccgoto(nil, 301) ->
+ 62;
+yeccgoto(other_pattern, 65) ->
+ 111;
+yeccgoto(other_pattern, 96) ->
+ 186;
+yeccgoto(other_pattern, 97) ->
+ 111;
+yeccgoto(other_pattern, 98) ->
+ 111;
+yeccgoto(other_pattern, 100) ->
+ 111;
+yeccgoto(other_pattern, 114) ->
+ 111;
+yeccgoto(other_pattern, 115) ->
+ 123;
+yeccgoto(other_pattern, 120) ->
+ 111;
+yeccgoto(other_pattern, 162) ->
+ 111;
+yeccgoto(other_pattern, 174) ->
+ 111;
+yeccgoto(other_pattern, 177) ->
+ 111;
+yeccgoto(other_pattern, 200) ->
+ 111;
+yeccgoto(other_pattern, 222) ->
+ 111;
+yeccgoto(primop_expr, 33) ->
+ 64;
+yeccgoto(primop_expr, 35) ->
+ 64;
+yeccgoto(primop_expr, 36) ->
+ 64;
+yeccgoto(primop_expr, 37) ->
+ 64;
+yeccgoto(primop_expr, 40) ->
+ 64;
+yeccgoto(primop_expr, 44) ->
+ 64;
+yeccgoto(primop_expr, 46) ->
+ 64;
+yeccgoto(primop_expr, 48) ->
+ 64;
+yeccgoto(primop_expr, 52) ->
+ 64;
+yeccgoto(primop_expr, 70) ->
+ 64;
+yeccgoto(primop_expr, 74) ->
+ 64;
+yeccgoto(primop_expr, 79) ->
+ 64;
+yeccgoto(primop_expr, 86) ->
+ 64;
+yeccgoto(primop_expr, 90) ->
+ 64;
+yeccgoto(primop_expr, 99) ->
+ 64;
+yeccgoto(primop_expr, 164) ->
+ 64;
+yeccgoto(primop_expr, 166) ->
+ 64;
+yeccgoto(primop_expr, 171) ->
+ 64;
+yeccgoto(primop_expr, 203) ->
+ 64;
+yeccgoto(primop_expr, 211) ->
+ 64;
+yeccgoto(primop_expr, 214) ->
+ 64;
+yeccgoto(primop_expr, 216) ->
+ 64;
+yeccgoto(primop_expr, 218) ->
+ 64;
+yeccgoto(primop_expr, 226) ->
+ 64;
+yeccgoto(primop_expr, 232) ->
+ 64;
+yeccgoto(primop_expr, 235) ->
+ 64;
+yeccgoto(primop_expr, 257) ->
+ 64;
+yeccgoto(primop_expr, 260) ->
+ 64;
+yeccgoto(primop_expr, 265) ->
+ 64;
+yeccgoto(receive_expr, 33) ->
+ 66;
+yeccgoto(receive_expr, 35) ->
+ 66;
+yeccgoto(receive_expr, 36) ->
+ 66;
+yeccgoto(receive_expr, 37) ->
+ 66;
+yeccgoto(receive_expr, 40) ->
+ 66;
+yeccgoto(receive_expr, 44) ->
+ 66;
+yeccgoto(receive_expr, 46) ->
+ 66;
+yeccgoto(receive_expr, 48) ->
+ 66;
+yeccgoto(receive_expr, 52) ->
+ 66;
+yeccgoto(receive_expr, 70) ->
+ 66;
+yeccgoto(receive_expr, 74) ->
+ 66;
+yeccgoto(receive_expr, 79) ->
+ 66;
+yeccgoto(receive_expr, 86) ->
+ 66;
+yeccgoto(receive_expr, 90) ->
+ 66;
+yeccgoto(receive_expr, 99) ->
+ 66;
+yeccgoto(receive_expr, 164) ->
+ 66;
+yeccgoto(receive_expr, 166) ->
+ 66;
+yeccgoto(receive_expr, 171) ->
+ 66;
+yeccgoto(receive_expr, 203) ->
+ 66;
+yeccgoto(receive_expr, 211) ->
+ 66;
+yeccgoto(receive_expr, 214) ->
+ 66;
+yeccgoto(receive_expr, 216) ->
+ 66;
+yeccgoto(receive_expr, 218) ->
+ 66;
+yeccgoto(receive_expr, 226) ->
+ 66;
+yeccgoto(receive_expr, 232) ->
+ 66;
+yeccgoto(receive_expr, 235) ->
+ 66;
+yeccgoto(receive_expr, 257) ->
+ 66;
+yeccgoto(receive_expr, 260) ->
+ 66;
+yeccgoto(receive_expr, 265) ->
+ 66;
+yeccgoto(segment, 247) ->
+ 249;
+yeccgoto(segment, 255) ->
+ 249;
+yeccgoto(segment_pattern, 190) ->
+ 192;
+yeccgoto(segment_pattern, 198) ->
+ 192;
+yeccgoto(segment_patterns, 190) ->
+ 193;
+yeccgoto(segment_patterns, 198) ->
+ 199;
+yeccgoto(segments, 247) ->
+ 250;
+yeccgoto(segments, 255) ->
+ 256;
+yeccgoto(sequence, 33) ->
+ 67;
+yeccgoto(sequence, 35) ->
+ 67;
+yeccgoto(sequence, 36) ->
+ 67;
+yeccgoto(sequence, 37) ->
+ 67;
+yeccgoto(sequence, 40) ->
+ 67;
+yeccgoto(sequence, 44) ->
+ 67;
+yeccgoto(sequence, 46) ->
+ 67;
+yeccgoto(sequence, 48) ->
+ 67;
+yeccgoto(sequence, 52) ->
+ 67;
+yeccgoto(sequence, 70) ->
+ 67;
+yeccgoto(sequence, 74) ->
+ 67;
+yeccgoto(sequence, 79) ->
+ 67;
+yeccgoto(sequence, 86) ->
+ 67;
+yeccgoto(sequence, 90) ->
+ 67;
+yeccgoto(sequence, 99) ->
+ 67;
+yeccgoto(sequence, 164) ->
+ 67;
+yeccgoto(sequence, 166) ->
+ 67;
+yeccgoto(sequence, 171) ->
+ 67;
+yeccgoto(sequence, 203) ->
+ 67;
+yeccgoto(sequence, 211) ->
+ 67;
+yeccgoto(sequence, 214) ->
+ 67;
+yeccgoto(sequence, 216) ->
+ 67;
+yeccgoto(sequence, 218) ->
+ 67;
+yeccgoto(sequence, 226) ->
+ 67;
+yeccgoto(sequence, 232) ->
+ 67;
+yeccgoto(sequence, 235) ->
+ 67;
+yeccgoto(sequence, 257) ->
+ 67;
+yeccgoto(sequence, 260) ->
+ 67;
+yeccgoto(sequence, 265) ->
+ 67;
+yeccgoto(single_expression, 33) ->
+ 68;
+yeccgoto(single_expression, 35) ->
+ 68;
+yeccgoto(single_expression, 36) ->
+ 68;
+yeccgoto(single_expression, 37) ->
+ 68;
+yeccgoto(single_expression, 40) ->
+ 68;
+yeccgoto(single_expression, 44) ->
+ 68;
+yeccgoto(single_expression, 46) ->
+ 68;
+yeccgoto(single_expression, 48) ->
+ 68;
+yeccgoto(single_expression, 52) ->
+ 68;
+yeccgoto(single_expression, 70) ->
+ 68;
+yeccgoto(single_expression, 74) ->
+ 68;
+yeccgoto(single_expression, 79) ->
+ 68;
+yeccgoto(single_expression, 86) ->
+ 68;
+yeccgoto(single_expression, 90) ->
+ 68;
+yeccgoto(single_expression, 99) ->
+ 68;
+yeccgoto(single_expression, 164) ->
+ 68;
+yeccgoto(single_expression, 166) ->
+ 68;
+yeccgoto(single_expression, 171) ->
+ 68;
+yeccgoto(single_expression, 203) ->
+ 68;
+yeccgoto(single_expression, 211) ->
+ 68;
+yeccgoto(single_expression, 214) ->
+ 68;
+yeccgoto(single_expression, 216) ->
+ 68;
+yeccgoto(single_expression, 218) ->
+ 68;
+yeccgoto(single_expression, 226) ->
+ 68;
+yeccgoto(single_expression, 232) ->
+ 68;
+yeccgoto(single_expression, 235) ->
+ 68;
+yeccgoto(single_expression, 257) ->
+ 68;
+yeccgoto(single_expression, 260) ->
+ 68;
+yeccgoto(single_expression, 265) ->
+ 68;
+yeccgoto(tail, 231) ->
+ 234;
+yeccgoto(tail, 238) ->
+ 239;
+yeccgoto(tail_constant, 150) ->
+ 153;
+yeccgoto(tail_constant, 157) ->
+ 158;
+yeccgoto(tail_literal, 297) ->
+ 300;
+yeccgoto(tail_literal, 304) ->
+ 305;
+yeccgoto(tail_pattern, 173) ->
+ 176;
+yeccgoto(tail_pattern, 180) ->
+ 181;
+yeccgoto(timeout, 65) ->
+ 112;
+yeccgoto(timeout, 101) ->
+ 168;
+yeccgoto(try_expr, 33) ->
+ 71;
+yeccgoto(try_expr, 35) ->
+ 71;
+yeccgoto(try_expr, 36) ->
+ 71;
+yeccgoto(try_expr, 37) ->
+ 71;
+yeccgoto(try_expr, 40) ->
+ 71;
+yeccgoto(try_expr, 44) ->
+ 71;
+yeccgoto(try_expr, 46) ->
+ 71;
+yeccgoto(try_expr, 48) ->
+ 71;
+yeccgoto(try_expr, 52) ->
+ 71;
+yeccgoto(try_expr, 70) ->
+ 71;
+yeccgoto(try_expr, 74) ->
+ 71;
+yeccgoto(try_expr, 79) ->
+ 71;
+yeccgoto(try_expr, 86) ->
+ 71;
+yeccgoto(try_expr, 90) ->
+ 71;
+yeccgoto(try_expr, 99) ->
+ 71;
+yeccgoto(try_expr, 164) ->
+ 71;
+yeccgoto(try_expr, 166) ->
+ 71;
+yeccgoto(try_expr, 171) ->
+ 71;
+yeccgoto(try_expr, 203) ->
+ 71;
+yeccgoto(try_expr, 211) ->
+ 71;
+yeccgoto(try_expr, 214) ->
+ 71;
+yeccgoto(try_expr, 216) ->
+ 71;
+yeccgoto(try_expr, 218) ->
+ 71;
+yeccgoto(try_expr, 226) ->
+ 71;
+yeccgoto(try_expr, 232) ->
+ 71;
+yeccgoto(try_expr, 235) ->
+ 71;
+yeccgoto(try_expr, 257) ->
+ 71;
+yeccgoto(try_expr, 260) ->
+ 71;
+yeccgoto(try_expr, 265) ->
+ 71;
+yeccgoto(tuple, 33) ->
+ 72;
+yeccgoto(tuple, 35) ->
+ 72;
+yeccgoto(tuple, 36) ->
+ 72;
+yeccgoto(tuple, 37) ->
+ 72;
+yeccgoto(tuple, 40) ->
+ 72;
+yeccgoto(tuple, 44) ->
+ 72;
+yeccgoto(tuple, 46) ->
+ 72;
+yeccgoto(tuple, 48) ->
+ 72;
+yeccgoto(tuple, 52) ->
+ 72;
+yeccgoto(tuple, 70) ->
+ 72;
+yeccgoto(tuple, 74) ->
+ 72;
+yeccgoto(tuple, 79) ->
+ 72;
+yeccgoto(tuple, 86) ->
+ 72;
+yeccgoto(tuple, 90) ->
+ 72;
+yeccgoto(tuple, 99) ->
+ 72;
+yeccgoto(tuple, 164) ->
+ 72;
+yeccgoto(tuple, 166) ->
+ 72;
+yeccgoto(tuple, 171) ->
+ 72;
+yeccgoto(tuple, 203) ->
+ 72;
+yeccgoto(tuple, 211) ->
+ 72;
+yeccgoto(tuple, 214) ->
+ 72;
+yeccgoto(tuple, 216) ->
+ 72;
+yeccgoto(tuple, 218) ->
+ 72;
+yeccgoto(tuple, 226) ->
+ 72;
+yeccgoto(tuple, 232) ->
+ 72;
+yeccgoto(tuple, 235) ->
+ 72;
+yeccgoto(tuple, 257) ->
+ 72;
+yeccgoto(tuple, 260) ->
+ 72;
+yeccgoto(tuple, 265) ->
+ 72;
+yeccgoto(tuple_constant, 126) ->
+ 141;
+yeccgoto(tuple_constant, 129) ->
+ 141;
+yeccgoto(tuple_constant, 142) ->
+ 141;
+yeccgoto(tuple_constant, 147) ->
+ 141;
+yeccgoto(tuple_constant, 151) ->
+ 141;
+yeccgoto(tuple_constant, 154) ->
+ 141;
+yeccgoto(tuple_literal, 284) ->
+ 289;
+yeccgoto(tuple_literal, 285) ->
+ 289;
+yeccgoto(tuple_literal, 290) ->
+ 289;
+yeccgoto(tuple_literal, 295) ->
+ 289;
+yeccgoto(tuple_literal, 298) ->
+ 289;
+yeccgoto(tuple_literal, 301) ->
+ 289;
+yeccgoto(tuple_pattern, 65) ->
+ 113;
+yeccgoto(tuple_pattern, 96) ->
+ 113;
+yeccgoto(tuple_pattern, 97) ->
+ 113;
+yeccgoto(tuple_pattern, 98) ->
+ 113;
+yeccgoto(tuple_pattern, 100) ->
+ 113;
+yeccgoto(tuple_pattern, 114) ->
+ 113;
+yeccgoto(tuple_pattern, 115) ->
+ 113;
+yeccgoto(tuple_pattern, 120) ->
+ 113;
+yeccgoto(tuple_pattern, 162) ->
+ 113;
+yeccgoto(tuple_pattern, 174) ->
+ 113;
+yeccgoto(tuple_pattern, 177) ->
+ 113;
+yeccgoto(tuple_pattern, 200) ->
+ 113;
+yeccgoto(tuple_pattern, 222) ->
+ 113;
+yeccgoto(variable, 25) ->
+ 31;
+yeccgoto(variable, 26) ->
+ 267;
+yeccgoto(variable, 33) ->
+ 73;
+yeccgoto(variable, 35) ->
+ 73;
+yeccgoto(variable, 36) ->
+ 73;
+yeccgoto(variable, 37) ->
+ 73;
+yeccgoto(variable, 40) ->
+ 73;
+yeccgoto(variable, 44) ->
+ 73;
+yeccgoto(variable, 46) ->
+ 73;
+yeccgoto(variable, 48) ->
+ 73;
+yeccgoto(variable, 52) ->
+ 73;
+yeccgoto(variable, 58) ->
+ 31;
+yeccgoto(variable, 65) ->
+ 31;
+yeccgoto(variable, 70) ->
+ 73;
+yeccgoto(variable, 74) ->
+ 73;
+yeccgoto(variable, 79) ->
+ 73;
+yeccgoto(variable, 82) ->
+ 31;
+yeccgoto(variable, 83) ->
+ 31;
+yeccgoto(variable, 86) ->
+ 73;
+yeccgoto(variable, 88) ->
+ 31;
+yeccgoto(variable, 90) ->
+ 73;
+yeccgoto(variable, 96) ->
+ 124;
+yeccgoto(variable, 97) ->
+ 31;
+yeccgoto(variable, 98) ->
+ 31;
+yeccgoto(variable, 99) ->
+ 73;
+yeccgoto(variable, 100) ->
+ 31;
+yeccgoto(variable, 114) ->
+ 31;
+yeccgoto(variable, 115) ->
+ 124;
+yeccgoto(variable, 120) ->
+ 31;
+yeccgoto(variable, 162) ->
+ 31;
+yeccgoto(variable, 164) ->
+ 73;
+yeccgoto(variable, 166) ->
+ 73;
+yeccgoto(variable, 171) ->
+ 73;
+yeccgoto(variable, 174) ->
+ 31;
+yeccgoto(variable, 177) ->
+ 31;
+yeccgoto(variable, 200) ->
+ 31;
+yeccgoto(variable, 203) ->
+ 73;
+yeccgoto(variable, 211) ->
+ 73;
+yeccgoto(variable, 214) ->
+ 73;
+yeccgoto(variable, 216) ->
+ 73;
+yeccgoto(variable, 218) ->
+ 73;
+yeccgoto(variable, 222) ->
+ 31;
+yeccgoto(variable, 226) ->
+ 73;
+yeccgoto(variable, 232) ->
+ 73;
+yeccgoto(variable, 235) ->
+ 73;
+yeccgoto(variable, 257) ->
+ 73;
+yeccgoto(variable, 260) ->
+ 73;
+yeccgoto(variable, 263) ->
+ 31;
+yeccgoto(variable, 265) ->
+ 73;
+yeccgoto(__Symbol, __State) ->
+ exit({__Symbol, __State, missing_in_goto_table}).
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/core_parse.hrl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/core_parse.hrl
new file mode 100644
index 0000000000..3d60360f47
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/core_parse.hrl
@@ -0,0 +1,111 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: core_parse.hrl,v 1.1 2008/12/17 09:53:42 mikpe Exp $
+%%
+%% Purpose : Core Erlang syntax trees as records.
+
+%% It would be nice to incorporate some generic functions as well but
+%% this could make including this file difficult.
+
+%% Note: the annotation list is *always* the first record field.
+%% Thus it is possible to define the macros:
+%% -define(get_ann(X), element(2, X)).
+%% -define(set_ann(X, Y), setelement(2, X, Y)).
+
+-record(c_int, {anno=[], val}). % val :: integer()
+
+-record(c_float, {anno=[], val}). % val :: float()
+
+-record(c_atom, {anno=[], val}). % val :: atom()
+
+-record(c_char, {anno=[], val}). % val :: char()
+
+-record(c_string, {anno=[], val}). % val :: string()
+
+-record(c_nil, {anno=[]}).
+
+-record(c_binary, {anno=[], segments}). % segments :: [#ce_bitstr{}]
+
+-record(c_bitstr, {anno=[],val, % val :: Tree,
+ size, % size :: Tree,
+ unit, % unit :: integer(),
+ type, % type :: atom(),
+ flags}). % flags :: [atom()],
+
+-record(c_cons, {anno=[], hd, % hd :: Tree,
+ tl}). % tl :: Tree
+
+-record(c_tuple, {anno=[], es}). % es :: [Tree]
+
+-record(c_var, {anno=[], name}). % name :: integer() | atom()
+
+-record(c_fname, {anno=[], id, % id :: atom(),
+ arity}). % arity :: integer()
+
+-record(c_values, {anno=[], es}). % es :: [Tree]
+
+-record(c_fun, {anno=[], vars, % vars :: [Tree],
+ body}). % body :: Tree
+
+-record(c_seq, {anno=[], arg, % arg :: Tree,
+ body}). % body :: Tree
+
+-record(c_let, {anno=[], vars, % vars :: [Tree],
+ arg, % arg :: Tree,
+ body}). % body :: Tree
+
+-record(c_letrec, {anno=[], defs, % defs :: [#ce_def{}],
+ body}). % body :: Tree
+
+-record(c_def, {anno=[], name, % name :: Tree,
+ val}). % val :: Tree,
+
+-record(c_case, {anno=[], arg, % arg :: Tree,
+ clauses}). % clauses :: [Tree]
+
+-record(c_clause, {anno=[], pats, % pats :: [Tree],
+ guard, % guard :: Tree,
+ body}). % body :: Tree
+
+-record(c_alias, {anno=[], var, % var :: Tree,
+ pat}). % pat :: Tree
+
+-record(c_receive, {anno=[], clauses, % clauses :: [Tree],
+ timeout, % timeout :: Tree,
+ action}). % action :: Tree
+
+-record(c_apply, {anno=[], op, % op :: Tree,
+ args}). % args :: [Tree]
+
+-record(c_call, {anno=[], module, % module :: Tree,
+ name, % name :: Tree,
+ args}). % args :: [Tree]
+
+-record(c_primop, {anno=[], name, % name :: Tree,
+ args}). % args :: [Tree]
+
+-record(c_try, {anno=[], arg, % arg :: Tree,
+ vars, % vars :: [Tree],
+ body, % body :: Tree
+ evars, % evars :: [Tree],
+ handler}). % handler :: Tree
+
+-record(c_catch, {anno=[], body}). % body :: Tree
+
+-record(c_module, {anno=[], name, % name :: Tree,
+ exports, % exports :: [Tree],
+ attrs, % attrs :: [#ce_def{}],
+ defs}). % defs :: [#ce_def{}]
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/core_pp.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/core_pp.erl
new file mode 100644
index 0000000000..2bfbcb85e2
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/core_pp.erl
@@ -0,0 +1,430 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: core_pp.erl,v 1.1 2008/12/17 09:53:42 mikpe Exp $
+%%
+%% Purpose : Core Erlang (naive) prettyprinter
+
+-module(core_pp).
+
+-export([format/1]).
+
+-include("core_parse.hrl").
+
+%% ====================================================================== %%
+%% format(Node) -> Text
+%% Node = coreErlang()
+%% Text = string() | [Text]
+%%
+%% Prettyprint-formats (naively) an abstract Core Erlang syntax
+%% tree.
+
+-record(ctxt, {class = term,
+ indent = 0,
+ item_indent = 2,
+ body_indent = 4,
+ tab_width = 8,
+ line = 0}).
+
+format(Node) -> case catch format(Node, #ctxt{}) of
+ {'EXIT',_} -> io_lib:format("~p",[Node]);
+ Other -> Other
+ end.
+
+maybe_anno(Node, Fun, Ctxt) ->
+ As = core_lib:get_anno(Node),
+ case get_line(As) of
+ none ->
+ maybe_anno(Node, Fun, Ctxt, As);
+ Line ->
+ if Line > Ctxt#ctxt.line ->
+ [io_lib:format("%% Line ~w",[Line]),
+ nl_indent(Ctxt),
+ maybe_anno(Node, Fun, Ctxt#ctxt{line = Line}, As)
+ ];
+ true ->
+ maybe_anno(Node, Fun, Ctxt, As)
+ end
+ end.
+
+maybe_anno(Node, Fun, Ctxt, As) ->
+ case strip_line(As) of
+ [] ->
+ Fun(Node, Ctxt);
+ List ->
+ Ctxt1 = add_indent(Ctxt, 2),
+ Ctxt2 = add_indent(Ctxt1, 3),
+ ["( ",
+ Fun(Node, Ctxt1),
+ nl_indent(Ctxt1),
+ "-| ",format_1(core_lib:make_literal(List), Ctxt2)," )"
+ ]
+ end.
+
+strip_line([A | As]) when integer(A) ->
+ strip_line(As);
+strip_line([A | As]) ->
+ [A | strip_line(As)];
+strip_line([]) ->
+ [].
+
+get_line([L | _As]) when integer(L) ->
+ L;
+get_line([_ | As]) ->
+ get_line(As);
+get_line([]) ->
+ none.
+
+format(Node, Ctxt) ->
+ maybe_anno(Node, fun format_1/2, Ctxt).
+
+format_1(#c_char{val=C}, _) -> io_lib:write_char(C);
+format_1(#c_int{val=I}, _) -> integer_to_list(I);
+format_1(#c_float{val=F}, _) -> float_to_list(F);
+format_1(#c_atom{val=A}, _) -> core_atom(A);
+format_1(#c_nil{}, _) -> "[]";
+format_1(#c_string{val=S}, _) -> io_lib:write_string(S);
+format_1(#c_var{name=V}, _) ->
+ %% Internal variable names may be:
+ %% - atoms representing proper Erlang variable names, or
+ %% any atoms that may be printed without single-quoting
+ %% - nonnegative integers.
+ %% It is important that when printing variables, no two names
+ %% should ever map to the same string.
+ if atom(V) ->
+ S = atom_to_list(V),
+ case S of
+ [C | _] when C >= $A, C =< $Z ->
+ %% Ordinary uppercase-prefixed names are
+ %% printed just as they are.
+ S;
+ [$_ | _] ->
+ %% Already "_"-prefixed names are prefixed
+ %% with "_X", e.g. '_foo' => '_X_foo', to
+ %% avoid generating things like "____foo" upon
+ %% repeated writing and reading of code.
+ %% ("_X_X_X_foo" is better.)
+ [$_, $X | S];
+ _ ->
+ %% Plain atoms are prefixed with a single "_".
+ %% E.g. foo => "_foo".
+ [$_ | S]
+ end;
+ integer(V) ->
+ %% Integers are also simply prefixed with "_".
+ [$_ | integer_to_list(V)]
+ end;
+format_1(#c_binary{segments=Segs}, Ctxt) ->
+ ["#{",
+ format_vseq(Segs, "", ",", add_indent(Ctxt, 2),
+ fun format_bitstr/2),
+ "}#"
+ ];
+format_1(#c_tuple{es=Es}, Ctxt) ->
+ [${,
+ format_hseq(Es, ",", add_indent(Ctxt, 1), fun format/2),
+ $}
+ ];
+format_1(#c_cons{hd=H,tl=T}, Ctxt) ->
+ Txt = ["["|format(H, add_indent(Ctxt, 1))],
+ [Txt|format_list_tail(T, add_indent(Ctxt, width(Txt, Ctxt)))];
+format_1(#c_values{es=Es}, Ctxt) ->
+ format_values(Es, Ctxt);
+format_1(#c_alias{var=V,pat=P}, Ctxt) ->
+ Txt = [format(V, Ctxt)|" = "],
+ [Txt|format(P, add_indent(Ctxt, width(Txt, Ctxt)))];
+format_1(#c_let{vars=Vs,arg=A,body=B}, Ctxt) ->
+ Ctxt1 = add_indent(Ctxt, Ctxt#ctxt.body_indent),
+ ["let ",
+ format_values(Vs, add_indent(Ctxt, 4)),
+ " =",
+ nl_indent(Ctxt1),
+ format(A, Ctxt1),
+ nl_indent(Ctxt),
+ "in "
+ | format(B, add_indent(Ctxt, 4))
+ ];
+format_1(#c_letrec{defs=Fs,body=B}, Ctxt) ->
+ Ctxt1 = add_indent(Ctxt, Ctxt#ctxt.body_indent),
+ ["letrec",
+ nl_indent(Ctxt1),
+ format_funcs(Fs, Ctxt1),
+ nl_indent(Ctxt),
+ "in "
+ | format(B, add_indent(Ctxt, 4))
+ ];
+format_1(#c_seq{arg=A,body=B}, Ctxt) ->
+ Ctxt1 = add_indent(Ctxt, 4),
+ ["do ",
+ format(A, Ctxt1),
+ nl_indent(Ctxt1)
+ | format(B, Ctxt1)
+ ];
+format_1(#c_case{arg=A,clauses=Cs}, Ctxt) ->
+ Ctxt1 = add_indent(Ctxt, Ctxt#ctxt.item_indent),
+ ["case ",
+ format(A, add_indent(Ctxt, 5)),
+ " of",
+ nl_indent(Ctxt1),
+ format_clauses(Cs, Ctxt1),
+ nl_indent(Ctxt)
+ | "end"
+ ];
+format_1(#c_receive{clauses=Cs,timeout=T,action=A}, Ctxt) ->
+ Ctxt1 = add_indent(Ctxt, Ctxt#ctxt.item_indent),
+ ["receive",
+ nl_indent(Ctxt1),
+ format_clauses(Cs, Ctxt1),
+ nl_indent(Ctxt),
+ "after ",
+ format(T, add_indent(Ctxt, 6)),
+ " ->",
+ nl_indent(Ctxt1),
+ format(A, Ctxt1)
+ ];
+format_1(#c_fname{id=I,arity=A}, _) ->
+ [core_atom(I),$/,integer_to_list(A)];
+format_1(#c_fun{vars=Vs,body=B}, Ctxt) ->
+ Ctxt1 = add_indent(Ctxt, Ctxt#ctxt.body_indent),
+ ["fun (",
+ format_hseq(Vs, ",", add_indent(Ctxt, 5), fun format/2),
+ ") ->",
+ nl_indent(Ctxt1)
+ | format(B, Ctxt1)
+ ];
+format_1(#c_apply{op=O,args=As}, Ctxt0) ->
+ Ctxt1 = add_indent(Ctxt0, 6), %"apply "
+ Op = format(O, Ctxt1),
+ Ctxt2 = add_indent(Ctxt0, 4),
+ ["apply ",Op,
+ nl_indent(Ctxt2),
+ $(,format_hseq(As, ", ", add_indent(Ctxt2, 1), fun format/2),$)
+ ];
+format_1(#c_call{module=M,name=N,args=As}, Ctxt0) ->
+ Ctxt1 = add_indent(Ctxt0, 5), %"call "
+ Mod = format(M, Ctxt1),
+ Ctxt2 = add_indent(Ctxt1, width(Mod, Ctxt1)+1),
+ Name = format(N, Ctxt2),
+ Ctxt3 = add_indent(Ctxt0, 4),
+ ["call ",Mod,":",Name,
+ nl_indent(Ctxt3),
+ $(,format_hseq(As, ", ", add_indent(Ctxt3, 1), fun format/2),$)
+ ];
+format_1(#c_primop{name=N,args=As}, Ctxt0) ->
+ Ctxt1 = add_indent(Ctxt0, 7), %"primop "
+ Name = format(N, Ctxt1),
+ Ctxt2 = add_indent(Ctxt0, 4),
+ ["primop ",Name,
+ nl_indent(Ctxt2),
+ $(,format_hseq(As, ", ", add_indent(Ctxt2, 1), fun format/2),$)
+ ];
+format_1(#c_catch{body=B}, Ctxt) ->
+ Ctxt1 = add_indent(Ctxt, Ctxt#ctxt.body_indent),
+ ["catch",
+ nl_indent(Ctxt1),
+ format(B, Ctxt1)
+ ];
+format_1(#c_try{arg=E,vars=Vs,body=B,evars=Evs,handler=H}, Ctxt) ->
+ Ctxt1 = add_indent(Ctxt, Ctxt#ctxt.body_indent),
+ ["try",
+ nl_indent(Ctxt1),
+ format(E, Ctxt1),
+ nl_indent(Ctxt),
+ "of ",
+ format_values(Vs, add_indent(Ctxt, 3)),
+ " ->",
+ nl_indent(Ctxt1),
+ format(B, Ctxt1),
+ nl_indent(Ctxt),
+ "catch ",
+ format_values(Evs, add_indent(Ctxt, 6)),
+ " ->",
+ nl_indent(Ctxt1)
+ | format(H, Ctxt1)
+ ];
+format_1(#c_def{name=N,val=V}, Ctxt) ->
+ Ctxt1 = add_indent(set_class(Ctxt, expr), Ctxt#ctxt.body_indent),
+ [format(N, Ctxt),
+ " =",
+ nl_indent(Ctxt1)
+ | format(V, Ctxt1)
+ ];
+format_1(#c_module{name=N,exports=Es,attrs=As,defs=Ds}, Ctxt) ->
+ Mod = ["module ", format(N, Ctxt)],
+ [Mod," [",
+ format_vseq(Es,
+ "", ",",
+ add_indent(set_class(Ctxt, term), width(Mod, Ctxt)+2),
+ fun format/2),
+ "]",
+ nl_indent(Ctxt),
+ " attributes [",
+ format_vseq(As,
+ "", ",",
+ add_indent(set_class(Ctxt, def), 16),
+ fun format/2),
+ "]",
+ nl_indent(Ctxt),
+ format_funcs(Ds, Ctxt),
+ nl_indent(Ctxt)
+ | "end"
+ ];
+format_1(Type, _) ->
+ ["** Unsupported type: ",
+ io_lib:write(Type)
+ | " **"
+ ].
+
+format_funcs(Fs, Ctxt) ->
+ format_vseq(Fs,
+ "", "",
+ set_class(Ctxt, def),
+ fun format/2).
+
+format_values(Vs, Ctxt) ->
+ [$<,
+ format_hseq(Vs, ",", add_indent(Ctxt, 1), fun format/2),
+ $>].
+
+format_bitstr(#c_bitstr{val=V,size=S,unit=U,type=T,flags=Fs}, Ctxt0) ->
+ Vs = [S, U, T, Fs],
+ Ctxt1 = add_indent(Ctxt0, 2),
+ Val = format(V, Ctxt1),
+ Ctxt2 = add_indent(Ctxt1, width(Val, Ctxt1) + 2),
+ ["#<", Val, ">(", format_hseq(Vs,",", Ctxt2, fun format/2), $)].
+
+format_clauses(Cs, Ctxt) ->
+ format_vseq(Cs, "", "", set_class(Ctxt, clause),
+ fun format_clause/2).
+
+format_clause(Node, Ctxt) ->
+ maybe_anno(Node, fun format_clause_1/2, Ctxt).
+
+format_clause_1(#c_clause{pats=Ps,guard=G,body=B}, Ctxt) ->
+ Ptxt = format_values(Ps, Ctxt),
+ Ctxt2 = add_indent(Ctxt, Ctxt#ctxt.body_indent),
+ [Ptxt,
+ " when ",
+ format_guard(G, add_indent(set_class(Ctxt, expr),
+ width(Ptxt, Ctxt) + 6)),
+ " ->",
+ nl_indent(Ctxt2)
+ | format(B, set_class(Ctxt2, expr))
+ ].
+
+format_guard(Node, Ctxt) ->
+ maybe_anno(Node, fun format_guard_1/2, Ctxt).
+
+format_guard_1(#c_call{module=M,name=N,args=As}, Ctxt0) ->
+ Ctxt1 = add_indent(Ctxt0, 5), %"call "
+ Mod = format(M, Ctxt1),
+ Ctxt2 = add_indent(Ctxt1, width(Mod, Ctxt1)+1),
+ Name = format(N, Ctxt2),
+ Ctxt3 = add_indent(Ctxt0, 4),
+ ["call ",Mod,":",Name,
+ nl_indent(Ctxt3),
+ $(,format_vseq(As, "",",", add_indent(Ctxt3, 1), fun format_guard/2),$)
+ ];
+format_guard_1(E, Ctxt) -> format_1(E, Ctxt). %Anno already done
+
+%% format_hseq([Thing], Separator, Context, Fun) -> Txt.
+%% Format a sequence horizontally on the same line with Separator between.
+
+format_hseq([H], _, Ctxt, Fun) ->
+ Fun(H, Ctxt);
+format_hseq([H|T], Sep, Ctxt, Fun) ->
+ Txt = [Fun(H, Ctxt)|Sep],
+ Ctxt1 = add_indent(Ctxt, width(Txt, Ctxt)),
+ [Txt|format_hseq(T, Sep, Ctxt1, Fun)];
+format_hseq([], _, _, _) -> "".
+
+%% format_vseq([Thing], LinePrefix, LineSuffix, Context, Fun) -> Txt.
+%% Format a sequence vertically in indented lines adding LinePrefix
+%% to the beginning of each line and LineSuffix to the end of each
+%% line. No prefix on the first line or suffix on the last line.
+
+format_vseq([H], _Pre, _Suf, Ctxt, Fun) ->
+ Fun(H, Ctxt);
+format_vseq([H|T], Pre, Suf, Ctxt, Fun) ->
+ [Fun(H, Ctxt),Suf,nl_indent(Ctxt),Pre|
+ format_vseq(T, Pre, Suf, Ctxt, Fun)];
+format_vseq([], _, _, _, _) -> "".
+
+format_list_tail(#c_nil{anno=[]}, _) -> "]";
+format_list_tail(#c_cons{anno=[],hd=H,tl=T}, Ctxt) ->
+ Txt = [$,|format(H, Ctxt)],
+ Ctxt1 = add_indent(Ctxt, width(Txt, Ctxt)),
+ [Txt|format_list_tail(T, Ctxt1)];
+format_list_tail(Tail, Ctxt) ->
+ ["|",format(Tail, add_indent(Ctxt, 1)),"]"].
+
+indent(Ctxt) -> indent(Ctxt#ctxt.indent, Ctxt).
+
+indent(N, _) when N =< 0 -> "";
+indent(N, Ctxt) ->
+ T = Ctxt#ctxt.tab_width,
+ string:chars($\t, N div T, string:chars($\s, N rem T)).
+
+nl_indent(Ctxt) -> [$\n|indent(Ctxt)].
+
+
+unindent(T, Ctxt) ->
+ unindent(T, Ctxt#ctxt.indent, Ctxt, []).
+
+unindent(T, N, _, C) when N =< 0 ->
+ [T|C];
+unindent([$\s|T], N, Ctxt, C) ->
+ unindent(T, N - 1, Ctxt, C);
+unindent([$\t|T], N, Ctxt, C) ->
+ Tab = Ctxt#ctxt.tab_width,
+ if N >= Tab ->
+ unindent(T, N - Tab, Ctxt, C);
+ true ->
+ unindent([string:chars($\s, Tab - N)|T], 0, Ctxt, C)
+ end;
+unindent([L|T], N, Ctxt, C) when list(L) ->
+ unindent(L, N, Ctxt, [T|C]);
+unindent([H|T], _, _, C) ->
+ [H|[T|C]];
+unindent([], N, Ctxt, [H|T]) ->
+ unindent(H, N, Ctxt, T);
+unindent([], _, _, []) -> [].
+
+
+width(Txt, Ctxt) ->
+ case catch width(Txt, 0, Ctxt, []) of
+ {'EXIT',_} -> exit({bad_text,Txt});
+ Other -> Other
+ end.
+
+width([$\t|T], A, Ctxt, C) ->
+ width(T, A + Ctxt#ctxt.tab_width, Ctxt, C);
+width([$\n|T], _, Ctxt, C) ->
+ width(unindent([T|C], Ctxt), Ctxt);
+width([H|T], A, Ctxt, C) when list(H) ->
+ width(H, A, Ctxt, [T|C]);
+width([_|T], A, Ctxt, C) ->
+ width(T, A + 1, Ctxt, C);
+width([], A, Ctxt, [H|T]) ->
+ width(H, A, Ctxt, T);
+width([], A, _, []) -> A.
+
+add_indent(Ctxt, Dx) ->
+ Ctxt#ctxt{indent = Ctxt#ctxt.indent + Dx}.
+
+set_class(Ctxt, Class) ->
+ Ctxt#ctxt{class = Class}.
+
+core_atom(A) -> io_lib:write_string(atom_to_list(A), $').
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/core_scan.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/core_scan.erl
new file mode 100644
index 0000000000..a97270b9f3
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/core_scan.erl
@@ -0,0 +1,495 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: core_scan.erl,v 1.1 2008/12/17 09:53:42 mikpe Exp $
+%%
+%% Purpose: Scanner for Core Erlang.
+
+%% For handling ISO 8859-1 (Latin-1) we use the following type
+%% information:
+%%
+%% 000 - 037 NUL - US control
+%% 040 - 057 SPC - / punctuation
+%% 060 - 071 0 - 9 digit
+%% 072 - 100 : - @ punctuation
+%% 101 - 132 A - Z uppercase
+%% 133 - 140 [ - ` punctuation
+%% 141 - 172 a - z lowercase
+%% 173 - 176 { - ~ punctuation
+%% 177 DEL control
+%% 200 - 237 control
+%% 240 - 277 NBSP - � punctuation
+%% 300 - 326 � - � uppercase
+%% 327 � punctuation
+%% 330 - 336 � - � uppercase
+%% 337 - 366 � - � lowercase
+%% 367 � punctuation
+%% 370 - 377 � - � lowercase
+%%
+%% Many punctuation characters region have special meaning. Must
+%% watch using � \327, bvery close to x \170
+
+-module(core_scan).
+
+-export([string/1,string/2,tokens/3,format_error/1]).
+
+-import(lists, [reverse/1]).
+
+%% tokens(Continuation, CharList, StartPos) ->
+%% {done, {ok, [Tok], EndPos}, Rest} |
+%% {done, {error,{ErrorPos,core_scan,What}, EndPos}, Rest} |
+%% {more, Continuation'}
+%% This is the main function into the re-entrant scanner. It calls the
+%% re-entrant pre-scanner until this says done, then calls scan/1 on
+%% the result.
+%%
+%% The continuation has the form:
+%% {RestChars,CharsSoFar,CurrentPos,StartPos}
+
+tokens([], Chars, Pos) -> %First call
+ tokens({[],[],Pos,Pos}, Chars, Pos);
+tokens({Chars,SoFar0,Cp,Sp}, MoreChars, _) ->
+ In = Chars ++ MoreChars,
+ case pre_scan(In, SoFar0, Cp) of
+ {done,_,[],Ep} -> %Found nothing
+ {done,{eof,Ep},[]};
+ {done,_,SoFar1,Ep} -> %Got complete tokens
+ Res = case scan(reverse(SoFar1), Sp) of
+ {ok,Toks} -> {ok,Toks,Ep};
+ {error,E} -> {error,E,Ep}
+ end,
+ {done,Res,[]};
+ {more,Rest,SoFar1,Cp1} -> %Missing end token
+ {more,{Rest,SoFar1,Cp1,Sp}};
+ Other -> %An error has occurred
+ {done,Other,[]}
+ end.
+
+%% string([Char]) ->
+%% string([Char], StartPos) ->
+%% {ok, [Tok], EndPos} |
+%% {error,{Pos,core_scan,What}, EndPos}
+
+string(Cs) -> string(Cs, 1).
+
+string(Cs, Sp) ->
+ %% Add an 'eof' to always get correct handling.
+ case string_pre_scan(Cs, [], Sp) of
+ {done,_,SoFar,Ep} -> %Got tokens
+ case scan(reverse(SoFar), Sp) of
+ {ok,Toks} -> {ok,Toks,Ep};
+ {error,E} -> {error,E,Ep}
+ end;
+ Other -> Other %An error has occurred
+ end.
+
+%% string_pre_scan(Cs, SoFar0, StartPos) ->
+%% {done,Rest,SoFar,EndPos} | {error,E,EndPos}.
+
+string_pre_scan(Cs, SoFar0, Sp) ->
+ case pre_scan(Cs, SoFar0, Sp) of
+ {done,Rest,SoFar1,Ep} -> %Got complete tokens
+ {done,Rest,SoFar1,Ep};
+ {more,Rest,SoFar1,Ep} -> %Missing end token
+ string_pre_scan(Rest ++ eof, SoFar1, Ep);
+ Other -> Other %An error has occurred
+ end.
+
+%% format_error(Error)
+%% Return a string describing the error.
+
+format_error({string,Quote,Head}) ->
+ ["unterminated " ++ string_thing(Quote) ++
+ " starting with " ++ io_lib:write_string(Head,Quote)];
+format_error({illegal,Type}) -> io_lib:fwrite("illegal ~w", [Type]);
+format_error(char) -> "unterminated character";
+format_error(scan) -> "premature end";
+format_error({base,Base}) -> io_lib:fwrite("illegal base '~w'", [Base]);
+format_error(float) -> "bad float";
+format_error(Other) -> io_lib:write(Other).
+
+string_thing($') -> "atom";
+string_thing($") -> "string".
+
+%% Re-entrant pre-scanner.
+%%
+%% If the input list of characters is insufficient to build a term the
+%% scanner returns a request for more characters and a continuation to be
+%% used when trying to build a term with more characters. To indicate
+%% end-of-file the input character list should be replaced with 'eof'
+%% as an empty list has meaning.
+%%
+%% When more characters are need inside a comment, string or quoted
+%% atom, which can become rather long, instead of pushing the
+%% characters read so far back onto RestChars to be reread, a special
+%% reentry token is returned indicating the middle of a construct.
+%% The token is the start character as an atom, '%', '"' and '\''.
+
+%% pre_scan([Char], SoFar, StartPos) ->
+%% {done,RestChars,ScannedChars,NewPos} |
+%% {more,RestChars,ScannedChars,NewPos} |
+%% {error,{ErrorPos,core_scan,Description},NewPos}.
+%% Main pre-scan function. It has been split into 2 functions because of
+%% efficiency, with a good indexing compiler it would be unnecessary.
+
+pre_scan([C|Cs], SoFar, Pos) ->
+ pre_scan(C, Cs, SoFar, Pos);
+pre_scan([], SoFar, Pos) ->
+ {more,[],SoFar,Pos};
+pre_scan(eof, SoFar, Pos) ->
+ {done,eof,SoFar,Pos}.
+
+%% pre_scan(Char, [Char], SoFar, Pos)
+
+pre_scan($$, Cs0, SoFar0, Pos) ->
+ case pre_char(Cs0, [$$|SoFar0]) of
+ {Cs,SoFar} ->
+ pre_scan(Cs, SoFar, Pos);
+ more ->
+ {more,[$$|Cs0],SoFar0, Pos};
+ error ->
+ pre_error(char, Pos, Pos)
+ end;
+pre_scan($', Cs, SoFar, Pos) ->
+ pre_string(Cs, $', '\'', Pos, [$'|SoFar], Pos);
+pre_scan({'\'',Sp}, Cs, SoFar, Pos) -> %Re-entering quoted atom
+ pre_string(Cs, $', '\'', Sp, SoFar, Pos);
+pre_scan($", Cs, SoFar, Pos) ->
+ pre_string(Cs, $", '"', Pos, [$"|SoFar], Pos);
+pre_scan({'"',Sp}, Cs, SoFar, Pos) -> %Re-entering string
+ pre_string(Cs, $", '"', Sp, SoFar, Pos);
+pre_scan($%, Cs, SoFar, Pos) ->
+ pre_comment(Cs, SoFar, Pos);
+pre_scan('%', Cs, SoFar, Pos) -> %Re-entering comment
+ pre_comment(Cs, SoFar, Pos);
+pre_scan($\n, Cs, SoFar, Pos) ->
+ pre_scan(Cs, [$\n|SoFar], Pos+1);
+pre_scan(C, Cs, SoFar, Pos) ->
+ pre_scan(Cs, [C|SoFar], Pos).
+
+%% pre_string([Char], Quote, Reent, StartPos, SoFar, Pos)
+
+pre_string([Q|Cs], Q, _, _, SoFar, Pos) ->
+ pre_scan(Cs, [Q|SoFar], Pos);
+pre_string([$\n|Cs], Q, Reent, Sp, SoFar, Pos) ->
+ pre_string(Cs, Q, Reent, Sp, [$\n|SoFar], Pos+1);
+pre_string([$\\|Cs0], Q, Reent, Sp, SoFar0, Pos) ->
+ case pre_escape(Cs0, SoFar0) of
+ {Cs,SoFar} ->
+ pre_string(Cs, Q, Reent, Sp, SoFar, Pos);
+ more ->
+ {more,[{Reent,Sp},$\\|Cs0],SoFar0,Pos};
+ error ->
+ pre_string_error(Q, Sp, SoFar0, Pos)
+ end;
+pre_string([C|Cs], Q, Reent, Sp, SoFar, Pos) ->
+ pre_string(Cs, Q, Reent, Sp, [C|SoFar], Pos);
+pre_string([], _, Reent, Sp, SoFar, Pos) ->
+ {more,[{Reent,Sp}],SoFar,Pos};
+pre_string(eof, Q, _, Sp, SoFar, Pos) ->
+ pre_string_error(Q, Sp, SoFar, Pos).
+
+pre_string_error(Q, Sp, SoFar, Pos) ->
+ S = reverse(string:substr(SoFar, 1, string:chr(SoFar, Q)-1)),
+ pre_error({string,Q,string:substr(S, 1, 16)}, Sp, Pos).
+
+pre_char([C|Cs], SoFar) -> pre_char(C, Cs, SoFar);
+pre_char([], _) -> more;
+pre_char(eof, _) -> error.
+
+pre_char($\\, Cs, SoFar) ->
+ pre_escape(Cs, SoFar);
+pre_char(C, Cs, SoFar) ->
+ {Cs,[C|SoFar]}.
+
+pre_escape([$^|Cs0], SoFar) ->
+ case Cs0 of
+ [C3|Cs] ->
+ {Cs,[C3,$^,$\\|SoFar]};
+ [] -> more;
+ eof -> error
+ end;
+pre_escape([C|Cs], SoFar) ->
+ {Cs,[C,$\\|SoFar]};
+pre_escape([], _) -> more;
+pre_escape(eof, _) -> error.
+
+%% pre_comment([Char], SoFar, Pos)
+%% Comments are replaced by one SPACE.
+
+pre_comment([$\n|Cs], SoFar, Pos) ->
+ pre_scan(Cs, [$\n,$\s|SoFar], Pos+1); %Terminate comment
+pre_comment([_|Cs], SoFar, Pos) ->
+ pre_comment(Cs, SoFar, Pos);
+pre_comment([], SoFar, Pos) ->
+ {more,['%'],SoFar,Pos};
+pre_comment(eof, Sofar, Pos) ->
+ pre_scan(eof, [$\s|Sofar], Pos).
+
+pre_error(E, Epos, Pos) ->
+ {error,{Epos,core_scan,E}, Pos}.
+
+%% scan(CharList, StartPos)
+%% This takes a list of characters and tries to tokenise them.
+%%
+%% The token list is built in reverse order (in a stack) to save appending
+%% and then reversed when all the tokens have been collected. Most tokens
+%% are built in the same way.
+%%
+%% Returns:
+%% {ok,[Tok]}
+%% {error,{ErrorPos,core_scan,What}}
+
+scan(Cs, Pos) ->
+ scan1(Cs, [], Pos).
+
+%% scan1(Characters, TokenStack, Position)
+%% Scan a list of characters into tokens.
+
+scan1([$\n|Cs], Toks, Pos) -> %Skip newline
+ scan1(Cs, Toks, Pos+1);
+scan1([C|Cs], Toks, Pos) when C >= $\000, C =< $\s -> %Skip control chars
+ scan1(Cs, Toks, Pos);
+scan1([C|Cs], Toks, Pos) when C >= $\200, C =< $\240 ->
+ scan1(Cs, Toks, Pos);
+scan1([C|Cs], Toks, Pos) when C >= $a, C =< $z -> %Keywords
+ scan_key_word(C, Cs, Toks, Pos);
+scan1([C|Cs], Toks, Pos) when C >= $�, C =< $�, C /= $� ->
+ scan_key_word(C, Cs, Toks, Pos);
+scan1([C|Cs], Toks, Pos) when C >= $A, C =< $Z -> %Variables
+ scan_variable(C, Cs, Toks, Pos);
+scan1([C|Cs], Toks, Pos) when C >= $�, C =< $�, C /= $� ->
+ scan_variable(C, Cs, Toks, Pos);
+scan1([C|Cs], Toks, Pos) when C >= $0, C =< $9 -> %Numbers
+ scan_number(C, Cs, Toks, Pos);
+scan1([$-,C|Cs], Toks, Pos) when C >= $0, C =< $9 -> %Signed numbers
+ scan_signed_number($-, C, Cs, Toks, Pos);
+scan1([$+,C|Cs], Toks, Pos) when C >= $0, C =< $9 -> %Signed numbers
+ scan_signed_number($+, C, Cs, Toks, Pos);
+scan1([$_|Cs], Toks, Pos) -> %_ variables
+ scan_variable($_, Cs, Toks, Pos);
+scan1([$$|Cs0], Toks, Pos) -> %Character constant
+ {C,Cs,Pos1} = scan_char(Cs0, Pos),
+ scan1(Cs, [{char,Pos,C}|Toks], Pos1);
+scan1([$'|Cs0], Toks, Pos) -> %Atom (always quoted)
+ {S,Cs1,Pos1} = scan_string(Cs0, $', Pos),
+ case catch list_to_atom(S) of
+ A when atom(A) ->
+ scan1(Cs1, [{atom,Pos,A}|Toks], Pos1);
+ _Error -> scan_error({illegal,atom}, Pos)
+ end;
+scan1([$"|Cs0], Toks, Pos) -> %String
+ {S,Cs1,Pos1} = scan_string(Cs0, $", Pos),
+ scan1(Cs1, [{string,Pos,S}|Toks], Pos1);
+%% Punctuation characters and operators, first recognise multiples.
+scan1("->" ++ Cs, Toks, Pos) ->
+ scan1(Cs, [{'->',Pos}|Toks], Pos);
+scan1("-|" ++ Cs, Toks, Pos) ->
+ scan1(Cs, [{'-|',Pos}|Toks], Pos);
+scan1([C|Cs], Toks, Pos) -> %Punctuation character
+ P = list_to_atom([C]),
+ scan1(Cs, [{P,Pos}|Toks], Pos);
+scan1([], Toks0, _) ->
+ Toks = reverse(Toks0),
+ {ok,Toks}.
+
+%% scan_key_word(FirstChar, CharList, Tokens, Pos)
+%% scan_variable(FirstChar, CharList, Tokens, Pos)
+
+scan_key_word(C, Cs0, Toks, Pos) ->
+ {Wcs,Cs} = scan_name(Cs0, []),
+ case catch list_to_atom([C|reverse(Wcs)]) of
+ Name when atom(Name) ->
+ scan1(Cs, [{Name,Pos}|Toks], Pos);
+ _Error -> scan_error({illegal,atom}, Pos)
+ end.
+
+scan_variable(C, Cs0, Toks, Pos) ->
+ {Wcs,Cs} = scan_name(Cs0, []),
+ case catch list_to_atom([C|reverse(Wcs)]) of
+ Name when atom(Name) ->
+ scan1(Cs, [{var,Pos,Name}|Toks], Pos);
+ _Error -> scan_error({illegal,var}, Pos)
+ end.
+
+%% scan_name(Cs) -> lists:splitwith(fun (C) -> name_char(C) end, Cs).
+
+scan_name([C|Cs], Ncs) ->
+ case name_char(C) of
+ true -> scan_name(Cs, [C|Ncs]);
+ false -> {Ncs,[C|Cs]} %Must rebuild here, sigh!
+ end;
+scan_name([], Ncs) ->
+ {Ncs,[]}.
+
+name_char(C) when C >= $a, C =< $z -> true;
+name_char(C) when C >= $�, C =< $�, C /= $� -> true;
+name_char(C) when C >= $A, C =< $Z -> true;
+name_char(C) when C >= $�, C =< $�, C /= $� -> true;
+name_char(C) when C >= $0, C =< $9 -> true;
+name_char($_) -> true;
+name_char($@) -> true;
+name_char(_) -> false.
+
+%% scan_string(CharList, QuoteChar, Pos) -> {StringChars,RestChars,NewPos}.
+
+scan_string(Cs, Q, Pos) ->
+ scan_string(Cs, [], Q, Pos).
+
+scan_string([Q|Cs], Scs, Q, Pos) ->
+ {reverse(Scs),Cs,Pos};
+scan_string([$\n|Cs], Scs, Q, Pos) ->
+ scan_string(Cs, [$\n|Scs], Q, Pos+1);
+scan_string([$\\|Cs0], Scs, Q, Pos) ->
+ {C,Cs,Pos1} = scan_escape(Cs0, Pos),
+ scan_string(Cs, [C|Scs], Q, Pos1);
+scan_string([C|Cs], Scs, Q, Pos) ->
+ scan_string(Cs, [C|Scs], Q, Pos).
+
+%% scan_char(Chars, Pos) -> {Char,RestChars,NewPos}.
+%% Read a single character from a character constant. The pre-scan
+%% phase has checked for errors here.
+
+scan_char([$\\|Cs], Pos) ->
+ scan_escape(Cs, Pos);
+scan_char([$\n|Cs], Pos) -> %Newline
+ {$\n,Cs,Pos+1};
+scan_char([C|Cs], Pos) ->
+ {C,Cs,Pos}.
+
+scan_escape([O1,O2,O3|Cs], Pos) when %\<1-3> octal digits
+ O1 >= $0, O1 =< $7, O2 >= $0, O2 =< $7, O3 >= $0, O3 =< $7 ->
+ Val = (O1*8 + O2)*8 + O3 - 73*$0,
+ {Val,Cs,Pos};
+scan_escape([O1,O2|Cs], Pos) when
+ O1 >= $0, O1 =< $7, O2 >= $0, O2 =< $7 ->
+ Val = (O1*8 + O2) - 9*$0,
+ {Val,Cs,Pos};
+scan_escape([O1|Cs], Pos) when
+ O1 >= $0, O1 =< $7 ->
+ {O1 - $0,Cs,Pos};
+scan_escape([$^,C|Cs], Pos) -> %\^X -> CTL-X
+ Val = C band 31,
+ {Val,Cs,Pos};
+%scan_escape([$\n,C1|Cs],Pos) ->
+% {C1,Cs,Pos+1};
+%scan_escape([C,C1|Cs],Pos) when C >= $\000, C =< $\s ->
+% {C1,Cs,Pos};
+scan_escape([$\n|Cs],Pos) ->
+ {$\n,Cs,Pos+1};
+scan_escape([C0|Cs],Pos) ->
+ C = escape_char(C0),
+ {C,Cs,Pos}.
+
+escape_char($n) -> $\n; %\n = LF
+escape_char($r) -> $\r; %\r = CR
+escape_char($t) -> $\t; %\t = TAB
+escape_char($v) -> $\v; %\v = VT
+escape_char($b) -> $\b; %\b = BS
+escape_char($f) -> $\f; %\f = FF
+escape_char($e) -> $\e; %\e = ESC
+escape_char($s) -> $\s; %\s = SPC
+escape_char($d) -> $\d; %\d = DEL
+escape_char(C) -> C.
+
+%% scan_number(Char, CharList, TokenStack, Pos)
+%% We can handle simple radix notation:
+%% <digit>#<digits> - the digits read in that base
+%% <digits> - the digits in base 10
+%% <digits>.<digits>
+%% <digits>.<digits>E+-<digits>
+%%
+%% Except for explicitly based integers we build a list of all the
+%% characters and then use list_to_integer/1 or list_to_float/1 to
+%% generate the value.
+
+%% SPos == Start position
+%% CPos == Current position
+
+scan_number(C, Cs0, Toks, Pos) ->
+ {Ncs,Cs,Pos1} = scan_integer(Cs0, [C], Pos),
+ scan_after_int(Cs, Ncs, Toks, Pos, Pos1).
+
+scan_signed_number(S, C, Cs0, Toks, Pos) ->
+ {Ncs,Cs,Pos1} = scan_integer(Cs0, [C,S], Pos),
+ scan_after_int(Cs, Ncs, Toks, Pos, Pos1).
+
+scan_integer([C|Cs], Stack, Pos) when C >= $0, C =< $9 ->
+ scan_integer(Cs, [C|Stack], Pos);
+scan_integer(Cs, Stack, Pos) ->
+ {Stack,Cs,Pos}.
+
+scan_after_int([$.,C|Cs0], Ncs0, Toks, SPos, CPos) when C >= $0, C =< $9 ->
+ {Ncs,Cs,CPos1} = scan_integer(Cs0, [C,$.|Ncs0], CPos),
+ scan_after_fraction(Cs, Ncs, Toks, SPos, CPos1);
+scan_after_int([$#|Cs], Ncs, Toks, SPos, CPos) ->
+ case list_to_integer(reverse(Ncs)) of
+ Base when Base >= 2, Base =< 16 ->
+ scan_based_int(Cs, 0, Base, Toks, SPos, CPos);
+ Base ->
+ scan_error({base,Base}, CPos)
+ end;
+scan_after_int(Cs, Ncs, Toks, SPos, CPos) ->
+ N = list_to_integer(reverse(Ncs)),
+ scan1(Cs, [{integer,SPos,N}|Toks], CPos).
+
+scan_based_int([C|Cs], SoFar, Base, Toks, SPos, CPos) when
+ C >= $0, C =< $9, C < Base + $0 ->
+ Next = SoFar * Base + (C - $0),
+ scan_based_int(Cs, Next, Base, Toks, SPos, CPos);
+scan_based_int([C|Cs], SoFar, Base, Toks, SPos, CPos) when
+ C >= $a, C =< $f, C < Base + $a - 10 ->
+ Next = SoFar * Base + (C - $a + 10),
+ scan_based_int(Cs, Next, Base, Toks, SPos, CPos);
+scan_based_int([C|Cs], SoFar, Base, Toks, SPos, CPos) when
+ C >= $A, C =< $F, C < Base + $A - 10 ->
+ Next = SoFar * Base + (C - $A + 10),
+ scan_based_int(Cs, Next, Base, Toks, SPos, CPos);
+scan_based_int(Cs, SoFar, _, Toks, SPos, CPos) ->
+ scan1(Cs, [{integer,SPos,SoFar}|Toks], CPos).
+
+scan_after_fraction([$E|Cs], Ncs, Toks, SPos, CPos) ->
+ scan_exponent(Cs, [$E|Ncs], Toks, SPos, CPos);
+scan_after_fraction([$e|Cs], Ncs, Toks, SPos, CPos) ->
+ scan_exponent(Cs, [$E|Ncs], Toks, SPos, CPos);
+scan_after_fraction(Cs, Ncs, Toks, SPos, CPos) ->
+ case catch list_to_float(reverse(Ncs)) of
+ N when float(N) ->
+ scan1(Cs, [{float,SPos,N}|Toks], CPos);
+ _Error -> scan_error({illegal,float}, SPos)
+ end.
+
+%% scan_exponent(CharList, NumberCharStack, TokenStack, StartPos, CurPos)
+%% Generate an error here if E{+|-} not followed by any digits.
+
+scan_exponent([$+|Cs], Ncs, Toks, SPos, CPos) ->
+ scan_exponent1(Cs, [$+|Ncs], Toks, SPos, CPos);
+scan_exponent([$-|Cs], Ncs, Toks, SPos, CPos) ->
+ scan_exponent1(Cs, [$-|Ncs], Toks, SPos, CPos);
+scan_exponent(Cs, Ncs, Toks, SPos, CPos) ->
+ scan_exponent1(Cs, Ncs, Toks, SPos, CPos).
+
+scan_exponent1([C|Cs0], Ncs0, Toks, SPos, CPos) when C >= $0, C =< $9 ->
+ {Ncs,Cs,CPos1} = scan_integer(Cs0, [C|Ncs0], CPos),
+ case catch list_to_float(reverse(Ncs)) of
+ N when float(N) ->
+ scan1(Cs, [{float,SPos,N}|Toks], CPos1);
+ _Error -> scan_error({illegal,float}, SPos)
+ end;
+scan_exponent1(_, _, _, _, CPos) ->
+ scan_error(float, CPos).
+
+scan_error(In, Pos) ->
+ {error,{Pos,core_scan,In}}.
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/erl_bifs.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/erl_bifs.erl
new file mode 100644
index 0000000000..1dbeefb5ac
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/erl_bifs.erl
@@ -0,0 +1,486 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: erl_bifs.erl,v 1.2 2009/09/17 09:46:19 kostis Exp $
+%%
+%% Purpose: Information about the Erlang built-in functions.
+
+-module(erl_bifs).
+
+-export([is_bif/3, is_guard_bif/3, is_pure/3, is_safe/3]).
+
+
+%% =====================================================================
+%% is_bif(Module, Name, Arity) -> boolean()
+%%
+%% Module = Name = atom()
+%% Arity = integer()
+%%
+%% Returns `true' if the function `Module:Name/Arity' is a Built-In
+%% Function (BIF) of Erlang. BIFs "come with the implementation",
+%% and can be assumed to exist and have the same behaviour in any
+%% later versions of the same implementation of the language. Being
+%% a BIF does *not* imply that the function belongs to the module
+%% `erlang', nor that it is implemented in C or assembler (cf.
+%% `erlang:is_builtin/3'), or that it is auto-imported by the
+%% compiler (cf. `erl_internal:bif/3').
+
+is_bif(erlang, '!', 2) -> true;
+is_bif(erlang, '*', 2) -> true;
+is_bif(erlang, '+', 1) -> true;
+is_bif(erlang, '+', 2) -> true;
+is_bif(erlang, '++', 2) -> true;
+is_bif(erlang, '-', 1) -> true;
+is_bif(erlang, '-', 2) -> true;
+is_bif(erlang, '--', 2) -> true;
+is_bif(erlang, '/', 2) -> true;
+is_bif(erlang, '/=', 2) -> true;
+is_bif(erlang, '<', 2) -> true;
+is_bif(erlang, '=/=', 2) -> true;
+is_bif(erlang, '=:=', 2) -> true;
+is_bif(erlang, '=<', 2) -> true;
+is_bif(erlang, '==', 2) -> true;
+is_bif(erlang, '>', 2) -> true;
+is_bif(erlang, '>=', 2) -> true;
+is_bif(erlang, 'and', 2) -> true;
+is_bif(erlang, 'band', 2) -> true;
+is_bif(erlang, 'bnot', 1) -> true;
+is_bif(erlang, 'bor', 2) -> true;
+is_bif(erlang, 'bsl', 2) -> true;
+is_bif(erlang, 'bsr', 2) -> true;
+is_bif(erlang, 'bxor', 2) -> true;
+is_bif(erlang, 'div', 2) -> true;
+is_bif(erlang, 'not', 1) -> true;
+is_bif(erlang, 'or', 2) -> true;
+is_bif(erlang, 'rem', 2) -> true;
+is_bif(erlang, 'xor', 2) -> true;
+is_bif(erlang, abs, 1) -> true;
+is_bif(erlang, append_element, 2) -> true;
+is_bif(erlang, apply, 2) -> true;
+is_bif(erlang, apply, 3) -> true;
+is_bif(erlang, atom_to_list, 1) -> true;
+is_bif(erlang, binary_to_list, 1) -> true;
+is_bif(erlang, binary_to_list, 3) -> true;
+is_bif(erlang, binary_to_term, 1) -> true;
+is_bif(erlang, cancel_timer, 1) -> true;
+is_bif(erlang, concat_binary, 1) -> true;
+is_bif(erlang, date, 0) -> true;
+is_bif(erlang, demonitor, 1) -> true;
+is_bif(erlang, disconnect_node, 1) -> true;
+is_bif(erlang, display, 1) -> true;
+is_bif(erlang, element, 2) -> true;
+is_bif(erlang, erase, 0) -> true;
+is_bif(erlang, erase, 1) -> true;
+is_bif(erlang, error, 1) -> true;
+is_bif(erlang, error, 2) -> true;
+is_bif(erlang, exit, 1) -> true;
+is_bif(erlang, exit, 2) -> true;
+is_bif(erlang, fault, 1) -> true;
+is_bif(erlang, fault, 2) -> true;
+is_bif(erlang, float, 1) -> true;
+is_bif(erlang, float_to_list, 1) -> true;
+is_bif(erlang, fun_info, 1) -> true;
+is_bif(erlang, fun_info, 2) -> true;
+is_bif(erlang, fun_to_list, 1) -> true;
+is_bif(erlang, get, 0) -> true;
+is_bif(erlang, get, 1) -> true;
+is_bif(erlang, get_cookie, 0) -> true;
+is_bif(erlang, get_keys, 1) -> true;
+is_bif(erlang, group_leader, 0) -> true;
+is_bif(erlang, group_leader, 2) -> true;
+is_bif(erlang, halt, 0) -> false;
+is_bif(erlang, halt, 1) -> false;
+is_bif(erlang, hash, 2) -> false;
+is_bif(erlang, hd, 1) -> true;
+is_bif(erlang, info, 1) -> true;
+is_bif(erlang, integer_to_list, 1) -> true;
+is_bif(erlang, is_alive, 0) -> true;
+is_bif(erlang, is_atom, 1) -> true;
+is_bif(erlang, is_binary, 1) -> true;
+is_bif(erlang, is_boolean, 1) -> true;
+is_bif(erlang, is_builtin, 3) -> true;
+is_bif(erlang, is_constant, 1) -> true;
+is_bif(erlang, is_float, 1) -> true;
+is_bif(erlang, is_function, 1) -> true;
+is_bif(erlang, is_integer, 1) -> true;
+is_bif(erlang, is_list, 1) -> true;
+is_bif(erlang, is_number, 1) -> true;
+is_bif(erlang, is_pid, 1) -> true;
+is_bif(erlang, is_port, 1) -> true;
+is_bif(erlang, is_process_alive, 1) -> true;
+is_bif(erlang, is_record, 3) -> true;
+is_bif(erlang, is_reference, 1) -> true;
+is_bif(erlang, is_tuple, 1) -> true;
+is_bif(erlang, length, 1) -> true;
+is_bif(erlang, link, 1) -> true;
+is_bif(erlang, list_to_atom, 1) -> true;
+is_bif(erlang, list_to_binary, 1) -> true;
+is_bif(erlang, list_to_float, 1) -> true;
+is_bif(erlang, list_to_integer, 1) -> true;
+is_bif(erlang, list_to_pid, 1) -> true;
+is_bif(erlang, list_to_tuple, 1) -> true;
+is_bif(erlang, loaded, 0) -> true;
+is_bif(erlang, localtime, 0) -> true;
+is_bif(erlang, localtime_to_universaltime, 1) -> true;
+is_bif(erlang, make_ref, 0) -> true;
+is_bif(erlang, make_tuple, 2) -> true;
+is_bif(erlang, md5, 1) -> true;
+is_bif(erlang, md5_final, 1) -> true;
+is_bif(erlang, md5_init, 0) -> true;
+is_bif(erlang, md5_update, 2) -> true;
+is_bif(erlang, monitor, 2) -> true;
+is_bif(erlang, monitor_node, 2) -> true;
+is_bif(erlang, node, 0) -> true;
+is_bif(erlang, node, 1) -> true;
+is_bif(erlang, nodes, 0) -> true;
+is_bif(erlang, now, 0) -> true;
+is_bif(erlang, open_port, 2) -> true;
+is_bif(erlang, phash, 2) -> true;
+is_bif(erlang, pid_to_list, 1) -> true;
+is_bif(erlang, port_close, 2) -> true;
+is_bif(erlang, port_command, 2) -> true;
+is_bif(erlang, port_connect, 2) -> true;
+is_bif(erlang, port_control, 3) -> true;
+is_bif(erlang, port_info, 2) -> true;
+is_bif(erlang, port_to_list, 1) -> true;
+is_bif(erlang, ports, 0) -> true;
+is_bif(erlang, pre_loaded, 0) -> true;
+is_bif(erlang, process_display, 2) -> true;
+is_bif(erlang, process_flag, 2) -> true;
+is_bif(erlang, process_flag, 3) -> true;
+is_bif(erlang, process_info, 1) -> true;
+is_bif(erlang, process_info, 2) -> true;
+is_bif(erlang, processes, 0) -> true;
+is_bif(erlang, put, 2) -> true;
+is_bif(erlang, read_timer, 1) -> true;
+is_bif(erlang, ref_to_list, 1) -> true;
+is_bif(erlang, register, 2) -> true;
+is_bif(erlang, registered, 0) -> true;
+is_bif(erlang, resume_process, 1) -> true;
+is_bif(erlang, round, 1) -> true;
+is_bif(erlang, self, 0) -> true;
+is_bif(erlang, send_after, 3) -> true;
+is_bif(erlang, set_cookie, 2) -> true;
+is_bif(erlang, setelement, 3) -> true;
+is_bif(erlang, size, 1) -> true;
+is_bif(erlang, spawn, 1) -> true;
+is_bif(erlang, spawn, 2) -> true;
+is_bif(erlang, spawn, 3) -> true;
+is_bif(erlang, spawn, 4) -> true;
+is_bif(erlang, spawn_link, 1) -> true;
+is_bif(erlang, spawn_link, 2) -> true;
+is_bif(erlang, spawn_link, 3) -> true;
+is_bif(erlang, spawn_link, 4) -> true;
+is_bif(erlang, spawn_opt, 4) -> true;
+is_bif(erlang, split_binary, 2) -> true;
+is_bif(erlang, start_timer, 3) -> true;
+is_bif(erlang, statistics, 1) -> true;
+is_bif(erlang, suspend_process, 1) -> true;
+is_bif(erlang, system_flag, 2) -> true;
+is_bif(erlang, system_info, 1) -> true;
+is_bif(erlang, term_to_binary, 1) -> true;
+is_bif(erlang, term_to_binary, 2) -> true;
+is_bif(erlang, throw, 1) -> true;
+is_bif(erlang, time, 0) -> true;
+is_bif(erlang, tl, 1) -> true;
+is_bif(erlang, trace, 3) -> true;
+is_bif(erlang, trace_info, 2) -> true;
+is_bif(erlang, trace_pattern, 2) -> true;
+is_bif(erlang, trace_pattern, 3) -> true;
+is_bif(erlang, trunc, 1) -> true;
+is_bif(erlang, tuple_to_list, 1) -> true;
+is_bif(erlang, universaltime, 0) -> true;
+is_bif(erlang, universaltime_to_localtime, 1) -> true;
+is_bif(erlang, unlink, 1) -> true;
+is_bif(erlang, unregister, 1) -> true;
+is_bif(erlang, whereis, 1) -> true;
+is_bif(erlang, yield, 0) -> true;
+is_bif(lists, append, 2) -> true;
+is_bif(lists, reverse, 1) -> true;
+is_bif(lists, reverse, 2) -> true;
+is_bif(lists, subtract, 2) -> true;
+is_bif(math, acos, 1) -> true;
+is_bif(math, acosh, 1) -> true;
+is_bif(math, asin, 1) -> true;
+is_bif(math, asinh, 1) -> true;
+is_bif(math, atan, 1) -> true;
+is_bif(math, atan2, 2) -> true;
+is_bif(math, atanh, 1) -> true;
+is_bif(math, cos, 1) -> true;
+is_bif(math, cosh, 1) -> true;
+is_bif(math, erf, 1) -> true;
+is_bif(math, erfc, 1) -> true;
+is_bif(math, exp, 1) -> true;
+is_bif(math, log, 1) -> true;
+is_bif(math, log10, 1) -> true;
+is_bif(math, pow, 2) -> true;
+is_bif(math, sin, 1) -> true;
+is_bif(math, sinh, 1) -> true;
+is_bif(math, sqrt, 1) -> true;
+is_bif(math, tan, 1) -> true;
+is_bif(math, tanh, 1) -> true;
+is_bif(_, _, _) -> false.
+
+
+%% =====================================================================
+%% is_guard_bif(Module, Name, Arity) -> boolean()
+%%
+%% Module = Name = atom()
+%% Arity = integer()
+%%
+%% Returns `true' if the built-in function `Module:Name/Arity' may
+%% be called from a clause guard. Note that such "guard BIFs" are
+%% not necessarily "pure", since some (notably `erlang:self/0') may
+%% depend on the current state, nor "safe", since many guard BIFs
+%% can fail. Also note that even a "pure" function could be
+%% unsuitable for calling from a guard because of its time or space
+%% complexity.
+
+is_guard_bif(erlang, '*', 2) -> true;
+is_guard_bif(erlang, '+', 1) -> true;
+is_guard_bif(erlang, '+', 2) -> true;
+is_guard_bif(erlang, '-', 1) -> true;
+is_guard_bif(erlang, '-', 2) -> true;
+is_guard_bif(erlang, '/', 2) -> true;
+is_guard_bif(erlang, '/=', 2) -> true;
+is_guard_bif(erlang, '<', 2) -> true;
+is_guard_bif(erlang, '=/=', 2) -> true;
+is_guard_bif(erlang, '=:=', 2) -> true;
+is_guard_bif(erlang, '=<', 2) -> true;
+is_guard_bif(erlang, '==', 2) -> true;
+is_guard_bif(erlang, '>', 2) -> true;
+is_guard_bif(erlang, '>=', 2) -> true;
+is_guard_bif(erlang, 'and', 2) -> true;
+is_guard_bif(erlang, 'band', 2) -> true;
+is_guard_bif(erlang, 'bnot', 1) -> true;
+is_guard_bif(erlang, 'bor', 2) -> true;
+is_guard_bif(erlang, 'bsl', 2) -> true;
+is_guard_bif(erlang, 'bsr', 2) -> true;
+is_guard_bif(erlang, 'bxor', 2) -> true;
+is_guard_bif(erlang, 'div', 2) -> true;
+is_guard_bif(erlang, 'not', 1) -> true;
+is_guard_bif(erlang, 'or', 2) -> true;
+is_guard_bif(erlang, 'rem', 2) -> true;
+is_guard_bif(erlang, 'xor', 2) -> true;
+is_guard_bif(erlang, abs, 1) -> true;
+is_guard_bif(erlang, element, 2) -> true;
+is_guard_bif(erlang, error, 1) -> true; % unorthodox
+is_guard_bif(erlang, exit, 1) -> true; % unorthodox
+is_guard_bif(erlang, fault, 1) -> true; % unorthodox
+is_guard_bif(erlang, float, 1) -> true; % (the type coercion function)
+is_guard_bif(erlang, hd, 1) -> true;
+is_guard_bif(erlang, is_atom, 1) -> true;
+is_guard_bif(erlang, is_boolean, 1) -> true;
+is_guard_bif(erlang, is_binary, 1) -> true;
+is_guard_bif(erlang, is_constant, 1) -> true;
+is_guard_bif(erlang, is_float, 1) -> true;
+is_guard_bif(erlang, is_function, 1) -> true;
+is_guard_bif(erlang, is_integer, 1) -> true;
+is_guard_bif(erlang, is_list, 1) -> true;
+is_guard_bif(erlang, is_number, 1) -> true;
+is_guard_bif(erlang, is_pid, 1) -> true;
+is_guard_bif(erlang, is_port, 1) -> true;
+is_guard_bif(erlang, is_reference, 1) -> true;
+is_guard_bif(erlang, is_tuple, 1) -> true;
+is_guard_bif(erlang, length, 1) -> true;
+is_guard_bif(erlang, list_to_atom, 1) -> true; % unorthodox
+is_guard_bif(erlang, node, 0) -> true; % (not pure)
+is_guard_bif(erlang, node, 1) -> true; % (not pure)
+is_guard_bif(erlang, round, 1) -> true;
+is_guard_bif(erlang, self, 0) -> true; % (not pure)
+is_guard_bif(erlang, size, 1) -> true;
+is_guard_bif(erlang, throw, 1) -> true; % unorthodox
+is_guard_bif(erlang, tl, 1) -> true;
+is_guard_bif(erlang, trunc, 1) -> true;
+is_guard_bif(math, acos, 1) -> true; % unorthodox
+is_guard_bif(math, acosh, 1) -> true; % unorthodox
+is_guard_bif(math, asin, 1) -> true; % unorthodox
+is_guard_bif(math, asinh, 1) -> true; % unorthodox
+is_guard_bif(math, atan, 1) -> true; % unorthodox
+is_guard_bif(math, atan2, 2) -> true; % unorthodox
+is_guard_bif(math, atanh, 1) -> true; % unorthodox
+is_guard_bif(math, cos, 1) -> true; % unorthodox
+is_guard_bif(math, cosh, 1) -> true; % unorthodox
+is_guard_bif(math, erf, 1) -> true; % unorthodox
+is_guard_bif(math, erfc, 1) -> true; % unorthodox
+is_guard_bif(math, exp, 1) -> true; % unorthodox
+is_guard_bif(math, log, 1) -> true; % unorthodox
+is_guard_bif(math, log10, 1) -> true; % unorthodox
+is_guard_bif(math, pow, 2) -> true; % unorthodox
+is_guard_bif(math, sin, 1) -> true; % unorthodox
+is_guard_bif(math, sinh, 1) -> true; % unorthodox
+is_guard_bif(math, sqrt, 1) -> true; % unorthodox
+is_guard_bif(math, tan, 1) -> true; % unorthodox
+is_guard_bif(math, tanh, 1) -> true; % unorthodox
+is_guard_bif(_, _, _) -> false.
+
+
+%% =====================================================================
+%% is_pure(Module, Name, Arity) -> boolean()
+%%
+%% Module = Name = atom()
+%% Arity = integer()
+%%
+%% Returns `true' if the function `Module:Name/Arity' does not
+%% affect the state, nor depend on the state, although its
+%% evaluation is not guaranteed to complete normally for all input.
+
+is_pure(erlang, '*', 2) -> true;
+is_pure(erlang, '+', 1) -> true; % (even for non-numbers)
+is_pure(erlang, '+', 2) -> true;
+is_pure(erlang, '++', 2) -> true;
+is_pure(erlang, '-', 1) -> true;
+is_pure(erlang, '-', 2) -> true;
+is_pure(erlang, '--', 2) -> true;
+is_pure(erlang, '/', 2) -> true;
+is_pure(erlang, '/=', 2) -> true;
+is_pure(erlang, '<', 2) -> true;
+is_pure(erlang, '=/=', 2) -> true;
+is_pure(erlang, '=:=', 2) -> true;
+is_pure(erlang, '=<', 2) -> true;
+is_pure(erlang, '==', 2) -> true;
+is_pure(erlang, '>', 2) -> true;
+is_pure(erlang, '>=', 2) -> true;
+is_pure(erlang, 'and', 2) -> true;
+is_pure(erlang, 'band', 2) -> true;
+is_pure(erlang, 'bnot', 1) -> true;
+is_pure(erlang, 'bor', 2) -> true;
+is_pure(erlang, 'bsl', 2) -> true;
+is_pure(erlang, 'bsr', 2) -> true;
+is_pure(erlang, 'bxor', 2) -> true;
+is_pure(erlang, 'div', 2) -> true;
+is_pure(erlang, 'not', 1) -> true;
+is_pure(erlang, 'or', 2) -> true;
+is_pure(erlang, 'rem', 2) -> true;
+is_pure(erlang, 'xor', 2) -> true;
+is_pure(erlang, abs, 1) -> true;
+is_pure(erlang, atom_to_list, 1) -> true;
+is_pure(erlang, binary_to_list, 1) -> true;
+is_pure(erlang, binary_to_list, 3) -> true;
+is_pure(erlang, concat_binary, 1) -> true;
+is_pure(erlang, element, 2) -> true;
+is_pure(erlang, float, 1) -> true;
+is_pure(erlang, float_to_list, 1) -> true;
+is_pure(erlang, hash, 2) -> false;
+is_pure(erlang, hd, 1) -> true;
+is_pure(erlang, integer_to_list, 1) -> true;
+is_pure(erlang, is_atom, 1) -> true;
+is_pure(erlang, is_boolean, 1) -> true;
+is_pure(erlang, is_binary, 1) -> true;
+is_pure(erlang, is_builtin, 3) -> true;
+is_pure(erlang, is_constant, 1) -> true;
+is_pure(erlang, is_float, 1) -> true;
+is_pure(erlang, is_function, 1) -> true;
+is_pure(erlang, is_integer, 1) -> true;
+is_pure(erlang, is_list, 1) -> true;
+is_pure(erlang, is_number, 1) -> true;
+is_pure(erlang, is_pid, 1) -> true;
+is_pure(erlang, is_port, 1) -> true;
+is_pure(erlang, is_record, 3) -> true;
+is_pure(erlang, is_reference, 1) -> true;
+is_pure(erlang, is_tuple, 1) -> true;
+is_pure(erlang, length, 1) -> true;
+is_pure(erlang, list_to_atom, 1) -> true;
+is_pure(erlang, list_to_binary, 1) -> true;
+is_pure(erlang, list_to_float, 1) -> true;
+is_pure(erlang, list_to_integer, 1) -> true;
+is_pure(erlang, list_to_pid, 1) -> true;
+is_pure(erlang, list_to_tuple, 1) -> true;
+is_pure(erlang, phash, 2) -> false;
+is_pure(erlang, pid_to_list, 1) -> true;
+is_pure(erlang, round, 1) -> true;
+is_pure(erlang, setelement, 3) -> true;
+is_pure(erlang, size, 1) -> true;
+is_pure(erlang, split_binary, 2) -> true;
+is_pure(erlang, term_to_binary, 1) -> true;
+is_pure(erlang, tl, 1) -> true;
+is_pure(erlang, trunc, 1) -> true;
+is_pure(erlang, tuple_to_list, 1) -> true;
+is_pure(lists, append, 2) -> true;
+is_pure(lists, subtract, 2) -> true;
+is_pure(math, acos, 1) -> true;
+is_pure(math, acosh, 1) -> true;
+is_pure(math, asin, 1) -> true;
+is_pure(math, asinh, 1) -> true;
+is_pure(math, atan, 1) -> true;
+is_pure(math, atan2, 2) -> true;
+is_pure(math, atanh, 1) -> true;
+is_pure(math, cos, 1) -> true;
+is_pure(math, cosh, 1) -> true;
+is_pure(math, erf, 1) -> true;
+is_pure(math, erfc, 1) -> true;
+is_pure(math, exp, 1) -> true;
+is_pure(math, log, 1) -> true;
+is_pure(math, log10, 1) -> true;
+is_pure(math, pow, 2) -> true;
+is_pure(math, sin, 1) -> true;
+is_pure(math, sinh, 1) -> true;
+is_pure(math, sqrt, 1) -> true;
+is_pure(math, tan, 1) -> true;
+is_pure(math, tanh, 1) -> true;
+is_pure(_, _, _) -> false.
+
+
+%% =====================================================================
+%% is_safe(Module, Name, Arity) -> boolean()
+%%
+%% Module = Name = atom()
+%% Arity = integer()
+%%
+%% Returns `true' if the function `Module:Name/Arity' is completely
+%% effect free, i.e., if its evaluation always completes normally
+%% and does not affect the state (although the value it returns
+%% might depend on the state).
+
+is_safe(erlang, '/=', 2) -> true;
+is_safe(erlang, '<', 2) -> true;
+is_safe(erlang, '=/=', 2) -> true;
+is_safe(erlang, '=:=', 2) -> true;
+is_safe(erlang, '=<', 2) -> true;
+is_safe(erlang, '==', 2) -> true;
+is_safe(erlang, '>', 2) -> true;
+is_safe(erlang, '>=', 2) -> true;
+is_safe(erlang, date, 0) -> true;
+is_safe(erlang, get, 0) -> true;
+is_safe(erlang, get, 1) -> true;
+is_safe(erlang, get_cookie, 0) -> true;
+is_safe(erlang, get_keys, 1) -> true;
+is_safe(erlang, group_leader, 0) -> true;
+is_safe(erlang, is_alive, 0) -> true;
+is_safe(erlang, is_atom, 1) -> true;
+is_safe(erlang, is_boolean, 1) -> true;
+is_safe(erlang, is_binary, 1) -> true;
+is_safe(erlang, is_constant, 1) -> true;
+is_safe(erlang, is_float, 1) -> true;
+is_safe(erlang, is_function, 1) -> true;
+is_safe(erlang, is_integer, 1) -> true;
+is_safe(erlang, is_list, 1) -> true;
+is_safe(erlang, is_number, 1) -> true;
+is_safe(erlang, is_pid, 1) -> true;
+is_safe(erlang, is_port, 1) -> true;
+is_safe(erlang, is_record, 3) -> true;
+is_safe(erlang, is_reference, 1) -> true;
+is_safe(erlang, is_tuple, 1) -> true;
+is_safe(erlang, make_ref, 0) -> true;
+is_safe(erlang, node, 0) -> true;
+is_safe(erlang, nodes, 0) -> true;
+is_safe(erlang, ports, 0) -> true;
+is_safe(erlang, pre_loaded, 0) -> true;
+is_safe(erlang, processes, 0) -> true;
+is_safe(erlang, registered, 0) -> true;
+is_safe(erlang, self, 0) -> true;
+is_safe(erlang, term_to_binary, 1) -> true;
+is_safe(erlang, time, 0) -> true;
+is_safe(_, _, _) -> false.
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/rec_env.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/rec_env.erl
new file mode 100644
index 0000000000..01c2512397
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/rec_env.erl
@@ -0,0 +1,611 @@
+%% =====================================================================
+%% This library is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU Lesser General Public License as
+%% published by the Free Software Foundation; either version 2 of the
+%% License, or (at your option) any later version.
+%%
+%% This library is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of
+%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+%% Lesser General Public License for more details.
+%%
+%% 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
+%% USA
+%%
+%% $Id: rec_env.erl,v 1.2 2009/09/17 09:46:19 kostis Exp $
+%%
+%% @author Richard Carlsson <[email protected]>
+%% @copyright 1999-2004 Richard Carlsson
+%% @doc Abstract environments, supporting self-referential bindings and
+%% automatic new-key generation.
+
+%% The current implementation is based on Erlang standard library
+%% dictionaries.
+
+%%% -define(DEBUG, true).
+
+-module(rec_env).
+
+-export([bind/3, bind_list/3, bind_recursive/4, delete/2, empty/0,
+ get/2, is_defined/2, is_empty/1, keys/1, lookup/2, new_key/1,
+ new_key/2, new_keys/2, new_keys/3, size/1, to_list/1]).
+
+-ifdef(DEBUG).
+-export([test/1, test_custom/1, test_custom/2]).
+-endif.
+
+-ifdef(DEBUG).
+%% Code for testing:
+%%@hidden
+test(N) ->
+ test_0(integer, N).
+
+%%@hidden
+test_custom(N) ->
+ F = fun (X) -> list_to_atom("X"++integer_to_list(X)) end,
+ test_custom(F, N).
+
+%%@hidden
+test_custom(F, N) ->
+ test_0({custom, F}, N).
+
+test_0(Type, N) ->
+ put(new_key_calls, 0),
+ put(new_key_retries, 0),
+ put(new_key_max, 0),
+ Env = test_1(Type, N, empty()),
+ io:fwrite("\ncalls: ~w.\n", [get(new_key_calls)]),
+ io:fwrite("\nretries: ~w.\n", [get(new_key_retries)]),
+ io:fwrite("\nmax: ~w.\n", [get(new_key_max)]),
+ dict:to_list(element(1,Env)).
+
+test_1(integer = Type, N, Env) when integer(N), N > 0 ->
+ Key = new_key(Env),
+ test_1(Type, N - 1, bind(Key, value, Env));
+test_1({custom, F} = Type, N, Env) when integer(N), N > 0 ->
+ Key = new_key(F, Env),
+ test_1(Type, N - 1, bind(Key, value, Env));
+test_1(_,0, Env) ->
+ Env.
+-endif.
+
+
+%% Representation:
+%%
+%% environment() = [Mapping]
+%%
+%% Mapping = {map, Dict} | {rec, Dict, Dict}
+%% Dict = dict:dictionary()
+%%
+%% An empty environment is a list containing a single `{map, Dict}'
+%% element - empty lists are not valid environments. To find a key in an
+%% environment, it is searched for in each mapping in the list, in
+%% order, until it the key is found in some mapping, or the end of the
+%% list is reached. In a 'rec' mapping, we keep the original dictionary
+%% together with a version where entries may have been deleted - this
+%% makes it possible to garbage collect the entire 'rec' mapping when
+%% all its entries are unused (for example, by being shadowed by later
+%% definitions).
+
+
+
+%% =====================================================================
+%% @type environment(). An abstract environment.
+
+
+%% =====================================================================
+%% @spec empty() -> environment()
+%%
+%% @doc Returns an empty environment.
+
+empty() ->
+ [{map, dict:new()}].
+
+
+%% =====================================================================
+%% @spec is_empty(Env::environment()) -> boolean()
+%%
+%% @doc Returns <code>true</code> if the environment is empty, otherwise
+%% <code>false</code>.
+
+is_empty([{map, Dict} | Es]) ->
+ N = dict:size(Dict),
+ if N /= 0 -> false;
+ Es == [] -> true;
+ true -> is_empty(Es)
+ end;
+is_empty([{rec, Dict, _} | Es]) ->
+ N = dict:size(Dict),
+ if N /= 0 -> false;
+ Es == [] -> true;
+ true -> is_empty(Es)
+ end.
+
+
+%% =====================================================================
+%% @spec size(Env::environment()) -> integer()
+%%
+%% @doc Returns the number of entries in an environment.
+
+%% (The name 'size' cannot be used in local calls, since there exists a
+%% built-in function with the same name.)
+
+size(Env) ->
+ env_size(Env).
+
+env_size([{map, Dict}]) ->
+ dict:size(Dict);
+env_size([{map, Dict} | Env]) ->
+ dict:size(Dict) + env_size(Env);
+env_size([{rec, Dict, _Dict0} | Env]) ->
+ dict:size(Dict) + env_size(Env).
+
+
+%% =====================================================================
+%% @spec is_defined(Key, Env) -> boolean()
+%%
+%% Key = term()
+%% Env = environment()
+%%
+%% @doc Returns <code>true</code> if <code>Key</code> is bound in the
+%% environment, otherwise <code>false</code>.
+
+is_defined(Key, [{map, Dict} | Env]) ->
+ case dict:is_key(Key, Dict) of
+ true ->
+ true;
+ false when Env == [] ->
+ false;
+ false ->
+ is_defined(Key, Env)
+ end;
+is_defined(Key, [{rec, Dict, _Dict0} | Env]) ->
+ case dict:is_key(Key, Dict) of
+ true ->
+ true;
+ false ->
+ is_defined(Key, Env)
+ end.
+
+
+%% =====================================================================
+%% @spec keys(Env::environment()) -> [term()]
+%%
+%% @doc Returns the ordered list of all keys in the environment.
+
+keys(Env) ->
+ lists:sort(keys(Env, [])).
+
+keys([{map, Dict}], S) ->
+ dict:fetch_keys(Dict) ++ S;
+keys([{map, Dict} | Env], S) ->
+ keys(Env, dict:fetch_keys(Dict) ++ S);
+keys([{rec, Dict, _Dict0} | Env], S) ->
+ keys(Env, dict:fetch_keys(Dict) ++ S).
+
+
+%% =====================================================================
+%% @spec to_list(Env) -> [{Key, Value}]
+%%
+%% Env = environment()
+%% Key = term()
+%% Value = term()
+%%
+%% @doc Returns an ordered list of <code>{Key, Value}</code> pairs for
+%% all keys in <code>Env</code>. <code>Value</code> is the same as that
+%% returned by {@link get/2}.
+
+to_list(Env) ->
+ lists:sort(to_list(Env, [])).
+
+to_list([{map, Dict}], S) ->
+ dict:to_list(Dict) ++ S;
+to_list([{map, Dict} | Env], S) ->
+ to_list(Env, dict:to_list(Dict) ++ S);
+to_list([{rec, Dict, _Dict0} | Env], S) ->
+ to_list(Env, dict:to_list(Dict) ++ S).
+
+
+%% =====================================================================
+%% @spec bind(Key, Value, Env) -> environment()
+%%
+%% Key = term()
+%% Value = term()
+%% Env = environment()
+%%
+%% @doc Make a nonrecursive entry. This binds <code>Key</code> to
+%% <code>Value</code>. If the key already existed in the environment,
+%% the old entry is replaced.
+
+%% Note that deletion is done to free old bindings so they can be
+%% garbage collected.
+
+bind(Key, Value, [{map, Dict}]) ->
+ [{map, dict:store(Key, Value, Dict)}];
+bind(Key, Value, [{map, Dict} | Env]) ->
+ [{map, dict:store(Key, Value, Dict)} | delete_any(Key, Env)];
+bind(Key, Value, Env) ->
+ [{map, dict:store(Key, Value, dict:new())} | delete_any(Key, Env)].
+
+
+%% =====================================================================
+%% @spec bind_list(Keys, Values, Env) -> environment()
+%%
+%% Keys = [term()]
+%% Values = [term()]
+%% Env = environment()
+%%
+%% @doc Make N nonrecursive entries. This binds each key in
+%% <code>Keys</code> to the corresponding value in
+%% <code>Values</code>. If some key already existed in the environment,
+%% the previous entry is replaced. If <code>Keys</code> does not have
+%% the same length as <code>Values</code>, an exception is generated.
+
+bind_list(Ks, Vs, [{map, Dict}]) ->
+ [{map, store_list(Ks, Vs, Dict)}];
+bind_list(Ks, Vs, [{map, Dict} | Env]) ->
+ [{map, store_list(Ks, Vs, Dict)} | delete_list(Ks, Env)];
+bind_list(Ks, Vs, Env) ->
+ [{map, store_list(Ks, Vs, dict:new())} | delete_list(Ks, Env)].
+
+store_list([K | Ks], [V | Vs], Dict) ->
+ store_list(Ks, Vs, dict:store(K, V, Dict));
+store_list([], _, Dict) ->
+ Dict.
+
+delete_list([K | Ks], Env) ->
+ delete_list(Ks, delete_any(K, Env));
+delete_list([], Env) ->
+ Env.
+
+%% By not calling `delete' unless we have to, we avoid unnecessary
+%% rewriting of the data.
+
+delete_any(Key, Env) ->
+ case is_defined(Key, Env) of
+ true ->
+ delete(Key, Env);
+ false ->
+ Env
+ end.
+
+%% =====================================================================
+%% @spec delete(Key, Env) -> environment()
+%%
+%% Key = term()
+%% Env = environment()
+%%
+%% @doc Delete an entry. This removes <code>Key</code> from the
+%% environment.
+
+delete(Key, [{map, Dict} = E | Env]) ->
+ case dict:is_key(Key, Dict) of
+ true ->
+ [{map, dict:erase(Key, Dict)} | Env];
+ false ->
+ delete_1(Key, Env, E)
+ end;
+delete(Key, [{rec, Dict, Dict0} = E | Env]) ->
+ case dict:is_key(Key, Dict) of
+ true ->
+ %% The Dict0 component must be preserved as it is until all
+ %% keys in Dict have been deleted.
+ Dict1 = dict:erase(Key, Dict),
+ case dict:size(Dict1) of
+ 0 ->
+ Env; % the whole {rec,...} is now garbage
+ _ ->
+ [{rec, Dict1, Dict0} | Env]
+ end;
+ false ->
+ [E | delete(Key, Env)]
+ end.
+
+%% This is just like above, except we pass on the preceding 'map'
+%% mapping in the list to enable merging when removing 'rec' mappings.
+
+delete_1(Key, [{rec, Dict, Dict0} = E | Env], E1) ->
+ case dict:is_key(Key, Dict) of
+ true ->
+ Dict1 = dict:erase(Key, Dict),
+ case dict:size(Dict1) of
+ 0 ->
+ concat(E1, Env);
+ _ ->
+ [E1, {rec, Dict1, Dict0} | Env]
+ end;
+ false ->
+ [E1, E | delete(Key, Env)]
+ end.
+
+concat({map, D1}, [{map, D2} | Env]) ->
+ [dict:merge(fun (_K, V1, _V2) -> V1 end, D1, D2) | Env];
+concat(E1, Env) ->
+ [E1 | Env].
+
+
+%% =====================================================================
+%% @spec bind_recursive(Keys, Values, Fun, Env) -> NewEnv
+%%
+%% Keys = [term()]
+%% Values = [term()]
+%% Fun = (Value, Env) -> term()
+%% Env = environment()
+%% NewEnv = environment()
+%%
+%% @doc Make N recursive entries. This binds each key in
+%% <code>Keys</code> to the value of <code>Fun(Value, NewEnv)</code> for
+%% the corresponding <code>Value</code>. If <code>Keys</code> does not
+%% have the same length as <code>Values</code>, an exception is
+%% generated. If some key already existed in the environment, the old
+%% entry is replaced.
+%%
+%% <p>Note: the function <code>Fun</code> is evaluated each time one of
+%% the stored keys is looked up, but only then.</p>
+%%
+%% <p>Examples:
+%%<pre>
+%% NewEnv = bind_recursive([foo, bar], [1, 2],
+%% fun (V, E) -> V end,
+%% Env)</pre>
+%%
+%% This does nothing interesting; <code>get(foo, NewEnv)</code> yields
+%% <code>1</code> and <code>get(bar, NewEnv)</code> yields
+%% <code>2</code>, but there is more overhead than if the {@link
+%% bind_list/3} function had been used.
+%%
+%% <pre>
+%% NewEnv = bind_recursive([foo, bar], [1, 2],
+%% fun (V, E) -> {V, E} end,
+%% Env)</pre>
+%%
+%% Here, however, <code>get(foo, NewEnv)</code> will yield <code>{1,
+%% NewEnv}</code> and <code>get(bar, NewEnv)</code> will yield <code>{2,
+%% NewEnv}</code>, i.e., the environment <code>NewEnv</code> contains
+%% recursive bindings.</p>
+
+bind_recursive([], [], _, Env) ->
+ Env;
+bind_recursive(Ks, Vs, F, Env) ->
+ F1 = fun (V) ->
+ fun (Dict) -> F(V, [{rec, Dict, Dict} | Env]) end
+ end,
+ Dict = bind_recursive_1(Ks, Vs, F1, dict:new()),
+ [{rec, Dict, Dict} | Env].
+
+bind_recursive_1([K | Ks], [V | Vs], F, Dict) ->
+ bind_recursive_1(Ks, Vs, F, dict:store(K, F(V), Dict));
+bind_recursive_1([], [], _, Dict) ->
+ Dict.
+
+
+%% =====================================================================
+%% @spec lookup(Key, Env) -> error | {ok, Value}
+%%
+%% Key = term()
+%% Env = environment()
+%% Value = term()
+%%
+%% @doc Returns <code>{ok, Value}</code> if <code>Key</code> is bound to
+%% <code>Value</code> in <code>Env</code>, and <code>error</code>
+%% otherwise.
+
+lookup(Key, [{map, Dict} | Env]) ->
+ case dict:find(Key, Dict) of
+ {ok, _}=Value ->
+ Value;
+ error when Env == [] ->
+ error;
+ error ->
+ lookup(Key, Env)
+ end;
+lookup(Key, [{rec, Dict, Dict0} | Env]) ->
+ case dict:find(Key, Dict) of
+ {ok, F} ->
+ {ok, F(Dict0)};
+ error ->
+ lookup(Key, Env)
+ end.
+
+
+%% =====================================================================
+%% @spec get(Key, Env) -> Value
+%%
+%% Key = term()
+%% Env = environment()
+%% Value = term()
+%%
+%% @doc Returns the value that <code>Key</code> is bound to in
+%% <code>Env</code>. Throws <code>{undefined, Key}</code> if the key
+%% does not exist in <code>Env</code>.
+
+get(Key, Env) ->
+ case lookup(Key, Env) of
+ {ok, Value} -> Value;
+ error -> throw({undefined, Key})
+ end.
+
+
+%% =====================================================================
+%% The key-generating algorithm could possibly be further improved. The
+%% important thing to keep in mind is, that when we need a new key, we
+%% are generally in mid-traversal of a syntax tree, and existing names
+%% in the tree may be closely grouped and evenly distributed or even
+%% forming a compact range (often having been generated by a "gensym",
+%% or by this very algorithm itself). This means that if we generate an
+%% identifier whose value is too close to those already seen (i.e.,
+%% which are in the environment), it is very probable that we will
+%% shadow a not-yet-seen identifier further down in the tree, the result
+%% being that we induce another later renaming, and end up renaming most
+%% of the identifiers, completely contrary to our intention. We need to
+%% generate new identifiers in a way that avoids such systematic
+%% collisions.
+%%
+%% One way of getting a new key to try when the previous attempt failed
+%% is of course to e.g. add one to the last tried value. However, in
+%% general it's a bad idea to try adjacent identifiers: the percentage
+%% of retries will typically increase a lot, so you may lose big on the
+%% extra lookups while gaining only a little from the quicker
+%% computation.
+%%
+%% We want an initial range that is large enough for most typical cases.
+%% If we start with, say, a range of 10, we might quickly use up most of
+%% the values in the range 1-10 (or 1-100) for new top-level variables -
+%% but as we start traversing the syntax tree, it is quite likely that
+%% exactly those variables will be encountered again (this depends on
+%% how the names in the tree were created), and will then need to be
+%% renamed. If we instead begin with a larger range, it is less likely
+%% that any top-level names that we introduce will shadow names that we
+%% will find in the tree. Of course we cannot know how large is large
+%% enough: for any initial range, there is some syntax tree that uses
+%% all the values in that range, and thus any top-level names introduced
+%% will shadow names in the tree. The point is to avoid this happening
+%% all the time - a range of about 1000 seems enough for most programs.
+%%
+%% The following values have been shown to work well:
+
+-define(MINIMUM_RANGE, 1000).
+-define(START_RANGE_FACTOR, 50).
+-define(MAX_RETRIES, 2). % retries before enlarging range
+-define(ENLARGE_FACTOR, 10). % range enlargment factor
+
+-ifdef(DEBUG).
+%% If you want to use these process dictionary counters, make sure to
+%% initialise them to zero before you call any of the key-generating
+%% functions.
+%%
+%% new_key_calls total number of calls
+%% new_key_retries failed key generation attempts
+%% new_key_max maximum generated integer value
+%%
+-define(measure_calls(),
+ put(new_key_calls, 1 + get(new_key_calls))).
+-define(measure_max_key(N),
+ case N > get(new_key_max) of
+ true ->
+ put(new_key_max, N);
+ false ->
+ ok
+ end).
+-define(measure_retries(N),
+ put(new_key_retries, get(new_key_retries) + N)).
+-else.
+-define(measure_calls(), ok).
+-define(measure_max_key(N), ok).
+-define(measure_retries(N), ok).
+-endif.
+
+
+%% =====================================================================
+%% @spec new_key(Env::environment()) -> integer()
+%%
+%% @doc Returns an integer which is not already used as key in the
+%% environment. New integers are generated using an algorithm which
+%% tries to keep the values randomly distributed within a reasonably
+%% small range relative to the number of entries in the environment.
+%%
+%% <p>This function uses the Erlang standard library module
+%% <code>random</code> to generate new keys.</p>
+%%
+%% <p>Note that only the new key is returned; the environment itself is
+%% not updated by this function.</p>
+
+new_key(Env) ->
+ new_key(fun (X) -> X end, Env).
+
+
+%% =====================================================================
+%% @spec new_key(Function, Env) -> term()
+%%
+%% Function = (integer()) -> term()
+%% Env = environment()
+%%
+%% @doc Returns a term which is not already used as key in the
+%% environment. The term is generated by applying <code>Function</code>
+%% to an integer generated as in {@link new_key/1}.
+%%
+%% <p>Note that only the generated term is returned; the environment
+%% itself is not updated by this function.</p>
+
+new_key(F, Env) ->
+ ?measure_calls(),
+ R = start_range(Env),
+%%% io:fwrite("Start range: ~w.\n", [R]),
+ new_key(R, F, Env).
+
+new_key(R, F, Env) ->
+ new_key(generate(R, R), R, 0, F, Env).
+
+new_key(N, R, T, F, Env) when T < ?MAX_RETRIES ->
+ A = F(N),
+ case is_defined(A, Env) of
+ true ->
+%%% io:fwrite("CLASH: ~w.\n", [A]),
+ new_key(generate(N, R), R, T + 1, F, Env);
+ false ->
+ ?measure_max_key(N),
+ ?measure_retries(T),
+%%% io:fwrite("New: ~w.\n", [N]),
+ A
+ end;
+new_key(N, R, _T, F, Env) ->
+ %% Too many retries - enlarge the range and start over.
+ ?measure_retries((_T + 1)),
+ R1 = trunc(R * ?ENLARGE_FACTOR),
+%%% io:fwrite("**NEW RANGE**: ~w.\n", [R1]),
+ new_key(generate(N, R1), R1, 0, F, Env).
+
+start_range(Env) ->
+ max(env_size(Env) * ?START_RANGE_FACTOR, ?MINIMUM_RANGE).
+
+max(X, Y) when X > Y -> X;
+max(_, Y) -> Y.
+
+%% The previous key might or might not be used to compute the next key
+%% to be tried. It is currently not used.
+%%
+%% In order to avoid causing cascading renamings, it is important that
+%% this function does not generate values in order, but
+%% (pseudo-)randomly distributed over the range.
+
+generate(_N, Range) ->
+ random:uniform(Range). % works well
+
+
+%% =====================================================================
+%% @spec new_keys(N, Env) -> [integer()]
+%%
+%% N = integer()
+%% Env = environment()
+%%
+%% @doc Returns a list of <code>N</code> distinct integers that are not
+%% already used as keys in the environment. See {@link new_key/1} for
+%% details.
+
+new_keys(N, Env) when integer(N) ->
+ new_keys(N, fun (X) -> X end, Env).
+
+
+%% =====================================================================
+%% @spec new_keys(N, Function, Env) -> [term()]
+%%
+%% N = integer()
+%% Function = (integer()) -> term()
+%% Env = environment()
+%%
+%% @doc Returns a list of <code>N</code> distinct terms that are not
+%% already used as keys in the environment. See {@link new_key/3} for
+%% details.
+
+new_keys(N, F, Env) when integer(N) ->
+ R = start_range(Env),
+ new_keys(N, [], R, F, Env).
+
+new_keys(N, Ks, R, F, Env) when N > 0 ->
+ Key = new_key(R, F, Env),
+ Env1 = bind(Key, true, Env), % dummy binding
+ new_keys(N - 1, [Key | Ks], R, F, Env1);
+new_keys(0, Ks, _, _, _) ->
+ Ks.
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/sys_expand_pmod.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/sys_expand_pmod.erl
new file mode 100644
index 0000000000..f48cc05b9c
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/sys_expand_pmod.erl
@@ -0,0 +1,425 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: sys_expand_pmod.erl,v 1.1 2008/12/17 09:53:42 mikpe Exp $
+%%
+-module(sys_expand_pmod).
+
+%% Expand function definition forms of parameterized module. We assume
+%% all record definitions, imports, queries, etc., have been expanded
+%% away. Any calls on the form 'foo(...)' must be calls to local
+%% functions. Auto-generated functions (module_info,...) have not yet
+%% been added to the function definitions, but are listed in 'defined'
+%% and 'exports'. The 'new/N' function is neither added to the
+%% definitions nor to the 'exports'/'defines' lists yet.
+
+-export([forms/4]).
+
+-record(pmod, {parameters, exports, defined, predef}).
+
+%% TODO: more abstract handling of predefined/static functions.
+
+forms(Fs0, Ps, Es0, Ds0) ->
+ PreDef = [{module_info,0},{module_info,1}],
+ forms(Fs0, Ps, Es0, Ds0, PreDef).
+
+forms(Fs0, Ps, Es0, Ds0, PreDef) ->
+ St0 = #pmod{parameters=Ps,exports=Es0,defined=Ds0, predef=PreDef},
+ {Fs1, St1} = forms(Fs0, St0),
+ Es1 = update_function_names(Es0, St1),
+ Ds1 = update_function_names(Ds0, St1),
+ Fs2 = update_forms(Fs1, St1),
+ {Fs2,Es1,Ds1}.
+
+%% This is extremely simplistic for now; all functions get an extra
+%% parameter, whether they need it or not, except for static functions.
+
+update_function_names(Es, St) ->
+ [update_function_name(E, St) || E <- Es].
+
+update_function_name(E={F,A}, St) ->
+ case ordsets:is_element(E, St#pmod.predef) of
+ true -> E;
+ false -> {F, A + 1}
+ end.
+
+update_forms([{function,L,N,A,Cs}|Fs],St) ->
+ [{function,L,N,A+1,Cs}|update_forms(Fs,St)];
+update_forms([F|Fs],St) ->
+ [F|update_forms(Fs,St)];
+update_forms([],_St) ->
+ [].
+
+%% Process the program forms.
+
+forms([F0|Fs0],St0) ->
+ {F1,St1} = form(F0,St0),
+ {Fs1,St2} = forms(Fs0,St1),
+ {[F1|Fs1],St2};
+forms([], St0) ->
+ {[], St0}.
+
+%% Only function definitions are of interest here. State is not updated.
+form({function,Line,Name0,Arity0,Clauses0},St) ->
+ {Name,Arity,Clauses} = function(Name0, Arity0, Clauses0, St),
+ {{function,Line,Name,Arity,Clauses},St};
+%% Pass anything else through
+form(F,St) -> {F,St}.
+
+function(Name, Arity, Clauses0, St) ->
+ Clauses1 = clauses(Clauses0,St),
+ {Name,Arity,Clauses1}.
+
+clauses([C|Cs],St) ->
+ {clause,L,H,G,B} = clause(C,St),
+ T = {tuple,L,[{var,L,V} || V <- ['_'|St#pmod.parameters]]},
+ [{clause,L,H++[{match,L,T,{var,L,'THIS'}}],G,B}|clauses(Cs,St)];
+clauses([],_St) -> [].
+
+clause({clause,Line,H0,G0,B0},St) ->
+ H1 = head(H0,St),
+ G1 = guard(G0,St),
+ B1 = exprs(B0,St),
+ {clause,Line,H1,G1,B1}.
+
+head(Ps,St) -> patterns(Ps,St).
+
+patterns([P0|Ps],St) ->
+ P1 = pattern(P0,St),
+ [P1|patterns(Ps,St)];
+patterns([],_St) -> [].
+
+string_to_conses([], _Line, Tail) ->
+ Tail;
+string_to_conses([E|Rest], Line, Tail) ->
+ {cons, Line, {integer, Line, E}, string_to_conses(Rest, Line, Tail)}.
+
+pattern({var,Line,V},_St) -> {var,Line,V};
+pattern({match,Line,L0,R0},St) ->
+ L1 = pattern(L0,St),
+ R1 = pattern(R0,St),
+ {match,Line,L1,R1};
+pattern({integer,Line,I},_St) -> {integer,Line,I};
+pattern({char,Line,C},_St) -> {char,Line,C};
+pattern({float,Line,F},_St) -> {float,Line,F};
+pattern({atom,Line,A},_St) -> {atom,Line,A};
+pattern({string,Line,S},_St) -> {string,Line,S};
+pattern({nil,Line},_St) -> {nil,Line};
+pattern({cons,Line,H0,T0},St) ->
+ H1 = pattern(H0,St),
+ T1 = pattern(T0,St),
+ {cons,Line,H1,T1};
+pattern({tuple,Line,Ps0},St) ->
+ Ps1 = pattern_list(Ps0,St),
+ {tuple,Line,Ps1};
+pattern({bin,Line,Fs},St) ->
+ Fs2 = pattern_grp(Fs,St),
+ {bin,Line,Fs2};
+pattern({op,_Line,'++',{nil,_},R},St) ->
+ pattern(R,St);
+pattern({op,_Line,'++',{cons,Li,{char,C2,I},T},R},St) ->
+ pattern({cons,Li,{char,C2,I},{op,Li,'++',T,R}},St);
+pattern({op,_Line,'++',{cons,Li,{integer,L2,I},T},R},St) ->
+ pattern({cons,Li,{integer,L2,I},{op,Li,'++',T,R}},St);
+pattern({op,_Line,'++',{string,Li,L},R},St) ->
+ pattern(string_to_conses(L, Li, R),St);
+pattern({op,Line,Op,A},_St) ->
+ {op,Line,Op,A};
+pattern({op,Line,Op,L,R},_St) ->
+ {op,Line,Op,L,R}.
+
+pattern_grp([{bin_element,L1,E1,S1,T1} | Fs],St) ->
+ S2 = case S1 of
+ default ->
+ default;
+ _ ->
+ expr(S1,St)
+ end,
+ T2 = case T1 of
+ default ->
+ default;
+ _ ->
+ bit_types(T1)
+ end,
+ [{bin_element,L1,expr(E1,St),S2,T2} | pattern_grp(Fs,St)];
+pattern_grp([],_St) ->
+ [].
+
+bit_types([]) ->
+ [];
+bit_types([Atom | Rest]) when atom(Atom) ->
+ [Atom | bit_types(Rest)];
+bit_types([{Atom, Integer} | Rest]) when atom(Atom), integer(Integer) ->
+ [{Atom, Integer} | bit_types(Rest)].
+
+pattern_list([P0|Ps],St) ->
+ P1 = pattern(P0,St),
+ [P1|pattern_list(Ps,St)];
+pattern_list([],_St) -> [].
+
+guard([G0|Gs],St) when list(G0) ->
+ [guard0(G0,St) | guard(Gs,St)];
+guard(L,St) ->
+ guard0(L,St).
+
+guard0([G0|Gs],St) ->
+ G1 = guard_test(G0,St),
+ [G1|guard0(Gs,St)];
+guard0([],_St) -> [].
+
+guard_test(Expr={call,Line,{atom,La,F},As0},St) ->
+ case erl_internal:type_test(F, length(As0)) of
+ true ->
+ As1 = gexpr_list(As0,St),
+ {call,Line,{atom,La,F},As1};
+ _ ->
+ gexpr(Expr,St)
+ end;
+guard_test(Any,St) ->
+ gexpr(Any,St).
+
+gexpr({var,L,V},_St) ->
+ {var,L,V};
+% %% alternative implementation of accessing module parameters
+% case index(V,St#pmod.parameters) of
+% N when N > 0 ->
+% {call,L,{remote,L,{atom,L,erlang},{atom,L,element}},
+% [{integer,L,N+1},{var,L,'THIS'}]};
+% _ ->
+% {var,L,V}
+% end;
+gexpr({integer,Line,I},_St) -> {integer,Line,I};
+gexpr({char,Line,C},_St) -> {char,Line,C};
+gexpr({float,Line,F},_St) -> {float,Line,F};
+gexpr({atom,Line,A},_St) -> {atom,Line,A};
+gexpr({string,Line,S},_St) -> {string,Line,S};
+gexpr({nil,Line},_St) -> {nil,Line};
+gexpr({cons,Line,H0,T0},St) ->
+ H1 = gexpr(H0,St),
+ T1 = gexpr(T0,St),
+ {cons,Line,H1,T1};
+gexpr({tuple,Line,Es0},St) ->
+ Es1 = gexpr_list(Es0,St),
+ {tuple,Line,Es1};
+gexpr({call,Line,{atom,La,F},As0},St) ->
+ case erl_internal:guard_bif(F, length(As0)) of
+ true -> As1 = gexpr_list(As0,St),
+ {call,Line,{atom,La,F},As1}
+ end;
+% Pre-expansion generated calls to erlang:is_record/3 must also be handled
+gexpr({call,Line,{remote,La,{atom,Lb,erlang},{atom,Lc,is_record}},As0},St)
+ when length(As0) == 3 ->
+ As1 = gexpr_list(As0,St),
+ {call,Line,{remote,La,{atom,Lb,erlang},{atom,Lc,is_record}},As1};
+% Guard bif's can be remote, but only in the module erlang...
+gexpr({call,Line,{remote,La,{atom,Lb,erlang},{atom,Lc,F}},As0},St) ->
+ case erl_internal:guard_bif(F, length(As0)) or
+ erl_internal:arith_op(F, length(As0)) or
+ erl_internal:comp_op(F, length(As0)) or
+ erl_internal:bool_op(F, length(As0)) of
+ true -> As1 = gexpr_list(As0,St),
+ {call,Line,{remote,La,{atom,Lb,erlang},{atom,Lc,F}},As1}
+ end;
+% Unfortunately, writing calls as {M,F}(...) is also allowed.
+gexpr({call,Line,{tuple,La,[{atom,Lb,erlang},{atom,Lc,F}]},As0},St) ->
+ case erl_internal:guard_bif(F, length(As0)) or
+ erl_internal:arith_op(F, length(As0)) or
+ erl_internal:comp_op(F, length(As0)) or
+ erl_internal:bool_op(F, length(As0)) of
+ true -> As1 = gexpr_list(As0,St),
+ {call,Line,{tuple,La,[{atom,Lb,erlang},{atom,Lc,F}]},As1}
+ end;
+gexpr({bin,Line,Fs},St) ->
+ Fs2 = pattern_grp(Fs,St),
+ {bin,Line,Fs2};
+gexpr({op,Line,Op,A0},St) ->
+ case erl_internal:arith_op(Op, 1) or
+ erl_internal:bool_op(Op, 1) of
+ true -> A1 = gexpr(A0,St),
+ {op,Line,Op,A1}
+ end;
+gexpr({op,Line,Op,L0,R0},St) ->
+ case erl_internal:arith_op(Op, 2) or
+ erl_internal:bool_op(Op, 2) or
+ erl_internal:comp_op(Op, 2) of
+ true ->
+ L1 = gexpr(L0,St),
+ R1 = gexpr(R0,St),
+ {op,Line,Op,L1,R1}
+ end.
+
+gexpr_list([E0|Es],St) ->
+ E1 = gexpr(E0,St),
+ [E1|gexpr_list(Es,St)];
+gexpr_list([],_St) -> [].
+
+exprs([E0|Es],St) ->
+ E1 = expr(E0,St),
+ [E1|exprs(Es,St)];
+exprs([],_St) -> [].
+
+expr({var,L,V},_St) ->
+ {var,L,V};
+% case index(V,St#pmod.parameters) of
+% N when N > 0 ->
+% {call,L,{remote,L,{atom,L,erlang},{atom,L,element}},
+% [{integer,L,N+1},{var,L,'THIS'}]};
+% _ ->
+% {var,L,V}
+% end;
+expr({integer,Line,I},_St) -> {integer,Line,I};
+expr({float,Line,F},_St) -> {float,Line,F};
+expr({atom,Line,A},_St) -> {atom,Line,A};
+expr({string,Line,S},_St) -> {string,Line,S};
+expr({char,Line,C},_St) -> {char,Line,C};
+expr({nil,Line},_St) -> {nil,Line};
+expr({cons,Line,H0,T0},St) ->
+ H1 = expr(H0,St),
+ T1 = expr(T0,St),
+ {cons,Line,H1,T1};
+expr({lc,Line,E0,Qs0},St) ->
+ Qs1 = lc_quals(Qs0,St),
+ E1 = expr(E0,St),
+ {lc,Line,E1,Qs1};
+expr({tuple,Line,Es0},St) ->
+ Es1 = expr_list(Es0,St),
+ {tuple,Line,Es1};
+expr({block,Line,Es0},St) ->
+ Es1 = exprs(Es0,St),
+ {block,Line,Es1};
+expr({'if',Line,Cs0},St) ->
+ Cs1 = icr_clauses(Cs0,St),
+ {'if',Line,Cs1};
+expr({'case',Line,E0,Cs0},St) ->
+ E1 = expr(E0,St),
+ Cs1 = icr_clauses(Cs0,St),
+ {'case',Line,E1,Cs1};
+expr({'receive',Line,Cs0},St) ->
+ Cs1 = icr_clauses(Cs0,St),
+ {'receive',Line,Cs1};
+expr({'receive',Line,Cs0,To0,ToEs0},St) ->
+ To1 = expr(To0,St),
+ ToEs1 = exprs(ToEs0,St),
+ Cs1 = icr_clauses(Cs0,St),
+ {'receive',Line,Cs1,To1,ToEs1};
+expr({'try',Line,Es0,Scs0,Ccs0,As0},St) ->
+ Es1 = exprs(Es0,St),
+ Scs1 = icr_clauses(Scs0,St),
+ Ccs1 = icr_clauses(Ccs0,St),
+ As1 = exprs(As0,St),
+ {'try',Line,Es1,Scs1,Ccs1,As1};
+expr({'fun',Line,Body,Info},St) ->
+ case Body of
+ {clauses,Cs0} ->
+ Cs1 = fun_clauses(Cs0,St),
+ {'fun',Line,{clauses,Cs1},Info};
+ {function,F,A} ->
+ {F1,A1} = update_function_name({F,A},St),
+ if A1 == A ->
+ {'fun',Line,{function,F,A},Info};
+ true ->
+ %% Must rewrite local fun-name to a fun that does a
+ %% call with the extra THIS parameter.
+ As = make_vars(A, Line),
+ As1 = As ++ [{var,Line,'THIS'}],
+ Call = {call,Line,{atom,Line,F1},As1},
+ Cs = [{clause,Line,As,[],[Call]}],
+ {'fun',Line,{clauses,Cs},Info}
+ end;
+ {function,M,F,A} -> %This is an error in lint!
+ {'fun',Line,{function,M,F,A},Info}
+ end;
+expr({call,Lc,{atom,_,new}=Name,As0},#pmod{parameters=Ps}=St)
+ when length(As0) =:= length(Ps) ->
+ %% The new() function does not take a 'THIS' argument (it's static).
+ As1 = expr_list(As0,St),
+ {call,Lc,Name,As1};
+expr({call,Lc,{atom,_,module_info}=Name,As0},St)
+ when length(As0) == 0; length(As0) == 1 ->
+ %% The module_info/0 and module_info/1 functions are also static.
+ As1 = expr_list(As0,St),
+ {call,Lc,Name,As1};
+expr({call,Lc,{atom,Lf,F},As0},St) ->
+ %% Local function call - needs THIS parameter.
+ As1 = expr_list(As0,St),
+ {call,Lc,{atom,Lf,F},As1 ++ [{var,0,'THIS'}]};
+expr({call,Line,F0,As0},St) ->
+ %% Other function call
+ F1 = expr(F0,St),
+ As1 = expr_list(As0,St),
+ {call,Line,F1,As1};
+expr({'catch',Line,E0},St) ->
+ E1 = expr(E0,St),
+ {'catch',Line,E1};
+expr({match,Line,P0,E0},St) ->
+ E1 = expr(E0,St),
+ P1 = pattern(P0,St),
+ {match,Line,P1,E1};
+expr({bin,Line,Fs},St) ->
+ Fs2 = pattern_grp(Fs,St),
+ {bin,Line,Fs2};
+expr({op,Line,Op,A0},St) ->
+ A1 = expr(A0,St),
+ {op,Line,Op,A1};
+expr({op,Line,Op,L0,R0},St) ->
+ L1 = expr(L0,St),
+ R1 = expr(R0,St),
+ {op,Line,Op,L1,R1};
+%% The following are not allowed to occur anywhere!
+expr({remote,Line,M0,F0},St) ->
+ M1 = expr(M0,St),
+ F1 = expr(F0,St),
+ {remote,Line,M1,F1}.
+
+expr_list([E0|Es],St) ->
+ E1 = expr(E0,St),
+ [E1|expr_list(Es,St)];
+expr_list([],_St) -> [].
+
+icr_clauses([C0|Cs],St) ->
+ C1 = clause(C0,St),
+ [C1|icr_clauses(Cs,St)];
+icr_clauses([],_St) -> [].
+
+lc_quals([{generate,Line,P0,E0}|Qs],St) ->
+ E1 = expr(E0,St),
+ P1 = pattern(P0,St),
+ [{generate,Line,P1,E1}|lc_quals(Qs,St)];
+lc_quals([E0|Qs],St) ->
+ E1 = expr(E0,St),
+ [E1|lc_quals(Qs,St)];
+lc_quals([],_St) -> [].
+
+fun_clauses([C0|Cs],St) ->
+ C1 = clause(C0,St),
+ [C1|fun_clauses(Cs,St)];
+fun_clauses([],_St) -> [].
+
+% %% Return index from 1 upwards, or 0 if not in the list.
+%
+% index(X,Ys) -> index(X,Ys,1).
+%
+% index(X,[X|Ys],A) -> A;
+% index(X,[Y|Ys],A) -> index(X,Ys,A+1);
+% index(X,[],A) -> 0.
+
+make_vars(N, L) ->
+ make_vars(1, N, L).
+
+make_vars(N, M, L) when N =< M ->
+ V = list_to_atom("X"++integer_to_list(N)),
+ [{var,L,V} | make_vars(N + 1, M, L)];
+make_vars(_, _, _) ->
+ [].
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/sys_pre_attributes.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/sys_pre_attributes.erl
new file mode 100644
index 0000000000..21d28868f0
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/sys_pre_attributes.erl
@@ -0,0 +1,212 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: sys_pre_attributes.erl,v 1.1 2008/12/17 09:53:42 mikpe Exp $
+%%
+%% Purpose : Transform Erlang compiler attributes
+
+-module(sys_pre_attributes).
+
+-export([parse_transform/2]).
+
+-define(OPTION_TAG, attributes).
+
+-record(state, {forms,
+ pre_ops = [],
+ post_ops = [],
+ options}).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Inserts, deletes and replaces Erlang compiler attributes.
+%%
+%% Valid options are:
+%%
+%% {attribute, insert, AttrName, NewAttrVal}
+%% {attribute, replace, AttrName, NewAttrVal} % replace first occurrence
+%% {attribute, delete, AttrName}
+%%
+%% The transformation is performed in two passes:
+%%
+%% pre_transform
+%% -------------
+%% Searches for attributes in the list of Forms in order to
+%% delete or replace them. 'delete' will delete all occurrences
+%% of attributes with the given name. 'replace' will replace the
+%% first occurrence of the attribute. This pass is will only be
+%% performed if there are replace or delete operations stated
+%% as options.
+%%
+%% post_transform
+%% -------------
+%% Looks up the module attribute and inserts the new attributes
+%% directly after. This pass will only be performed if there are
+%% any attributes left to be inserted after pre_transform. The left
+%% overs will be those replace operations that not has been performed
+%% due to that the pre_transform pass did not find the attribute plus
+%% all insert operations.
+
+parse_transform(Forms, Options) ->
+ S = #state{forms = Forms, options = Options},
+ S2 = init_transform(S),
+ report_verbose("Pre options: ~p~n", [S2#state.pre_ops], S2),
+ report_verbose("Post options: ~p~n", [S2#state.post_ops], S2),
+ S3 = pre_transform(S2),
+ S4 = post_transform(S3),
+ S4#state.forms.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Computes the lists of pre_ops and post_ops that are
+%% used in the real transformation.
+init_transform(S) ->
+ case S#state.options of
+ Options when list(Options) ->
+ init_transform(Options, S);
+ Option ->
+ init_transform([Option], S)
+ end.
+
+init_transform([{attribute, insert, Name, Val} | Tail], S) ->
+ Op = {insert, Name, Val},
+ PostOps = [Op | S#state.post_ops],
+ init_transform(Tail, S#state{post_ops = PostOps});
+init_transform([{attribute, replace, Name, Val} | Tail], S) ->
+ Op = {replace, Name, Val},
+ PreOps = [Op | S#state.pre_ops],
+ PostOps = [Op | S#state.post_ops],
+ init_transform(Tail, S#state{pre_ops = PreOps, post_ops = PostOps});
+init_transform([{attribute, delete, Name} | Tail], S) ->
+ Op = {delete, Name},
+ PreOps = [Op | S#state.pre_ops],
+ init_transform(Tail, S#state{pre_ops = PreOps});
+init_transform([], S) ->
+ S;
+init_transform([_ | T], S) ->
+ init_transform(T, S);
+init_transform(BadOpt, S) ->
+ report_error("Illegal option (ignored): ~p~n", [BadOpt], S),
+ S.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Handle delete and perhaps replace
+
+pre_transform(S) when S#state.pre_ops == [] ->
+ S;
+pre_transform(S) ->
+ pre_transform(S#state.forms, [], S).
+
+pre_transform([H | T], Acc, S) ->
+ case H of
+ {attribute, Line, Name, Val} ->
+ case lists:keysearch(Name, 2, S#state.pre_ops) of
+ false ->
+ pre_transform(T, [H | Acc], S);
+
+ {value, {replace, Name, NewVal}} ->
+ report_warning("Replace attribute ~p: ~p -> ~p~n",
+ [Name, Val, NewVal],
+ S),
+ New = {attribute, Line, Name, NewVal},
+ Pre = lists:keydelete(Name, 2, S#state.pre_ops),
+ Post = lists:keydelete(Name, 2, S#state.post_ops),
+ S2 = S#state{pre_ops = Pre, post_ops = Post},
+ if
+ Pre == [] ->
+ %% No need to search the rest of the Forms
+ Forms = lists:reverse(Acc, [New | T]),
+ S2#state{forms = Forms};
+ true ->
+ pre_transform(T, [New | Acc], S2)
+ end;
+
+ {value, {delete, Name}} ->
+ report_warning("Delete attribute ~p: ~p~n",
+ [Name, Val],
+ S),
+ pre_transform(T, Acc, S)
+ end;
+ _Any ->
+ pre_transform(T, [H | Acc], S)
+ end;
+pre_transform([], Acc, S) ->
+ S#state{forms = lists:reverse(Acc)}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Handle insert and perhaps replace
+
+post_transform(S) when S#state.post_ops == [] ->
+ S;
+post_transform(S) ->
+ post_transform(S#state.forms, [], S).
+
+post_transform([H | T], Acc, S) ->
+ case H of
+ {attribute, Line, module, Val} ->
+ Acc2 = lists:reverse([{attribute, Line, module, Val} | Acc]),
+ Forms = Acc2 ++ attrs(S#state.post_ops, Line, S) ++ T,
+ S#state{forms = Forms, post_ops = []};
+ _Any ->
+ post_transform(T, [H | Acc], S)
+ end;
+post_transform([], Acc, S) ->
+ S#state{forms = lists:reverse(Acc)}.
+
+attrs([{replace, Name, NewVal} | T], Line, S) ->
+ report_verbose("Insert attribute ~p: ~p~n", [Name, NewVal], S),
+ [{attribute, Line, Name, NewVal} | attrs(T, Line, S)];
+attrs([{insert, Name, NewVal} | T], Line, S) ->
+ report_verbose("Insert attribute ~p: ~p~n", [Name, NewVal], S),
+ [{attribute, Line, Name, NewVal} | attrs(T, Line, S)];
+attrs([], _, _) ->
+ [].
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Report functions.
+%%
+%% Errors messages are controlled with the 'report_errors' compiler option
+%% Warning messages are controlled with the 'report_warnings' compiler option
+%% Verbose messages are controlled with the 'verbose' compiler option
+
+report_error(Format, Args, S) ->
+ case is_error(S) of
+ true ->
+ io:format("~p: * ERROR * " ++ Format, [?MODULE | Args]);
+ false ->
+ ok
+ end.
+
+report_warning(Format, Args, S) ->
+ case is_warning(S) of
+ true ->
+ io:format("~p: * WARNING * " ++ Format, [?MODULE | Args]);
+ false ->
+ ok
+ end.
+
+report_verbose(Format, Args, S) ->
+ case is_verbose(S) of
+ true ->
+ io:format("~p: " ++ Format, [?MODULE | Args]);
+ false ->
+ ok
+ end.
+
+is_error(S) ->
+ lists:member(report_errors, S#state.options) or is_verbose(S).
+
+is_warning(S) ->
+ lists:member(report_warnings, S#state.options) or is_verbose(S).
+
+is_verbose(S) ->
+ lists:member(verbose, S#state.options).
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/sys_pre_expand.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/sys_pre_expand.erl
new file mode 100644
index 0000000000..08bc6cb147
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/sys_pre_expand.erl
@@ -0,0 +1,1026 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: sys_pre_expand.erl,v 1.1 2008/12/17 09:53:42 mikpe Exp $
+%%
+%% Purpose : Expand some source Erlang constructions. This is part of the
+%% pre-processing phase.
+
+%% N.B. Although structs (tagged tuples) are not yet allowed in the
+%% language there is code included in pattern/2 and expr/3 (commented out)
+%% that handles them by transforming them to tuples.
+
+-module(sys_pre_expand).
+
+%% Main entry point.
+-export([module/2]).
+
+-import(ordsets, [from_list/1,add_element/2,
+ union/1,union/2,intersection/1,intersection/2,subtract/2]).
+-import(lists, [member/2,map/2,foldl/3,foldr/3,sort/1,reverse/1,duplicate/2]).
+
+-include("../my_include/erl_bits.hrl").
+
+-record(expand, {module=[], %Module name
+ parameters=undefined, %Module parameters
+ package="", %Module package
+ exports=[], %Exports
+ imports=[], %Imports
+ mod_imports, %Module Imports
+ compile=[], %Compile flags
+ records=dict:new(), %Record definitions
+ attributes=[], %Attributes
+ defined=[], %Defined functions
+ vcount=0, %Variable counter
+ func=[], %Current function
+ arity=[], %Arity for current function
+ fcount=0, %Local fun count
+ fun_index=0, %Global index for funs
+ bitdefault,
+ bittypes
+ }).
+
+%% module(Forms, CompileOptions)
+%% {ModuleName,Exports,TransformedForms}
+%% Expand the forms in one module. N.B.: the lists of predefined
+%% exports and imports are really ordsets!
+
+module(Fs, Opts) ->
+ %% Set pre-defined exported functions.
+ PreExp = [{module_info,0},{module_info,1}],
+
+ %% Set pre-defined module imports.
+ PreModImp = [{erlang,erlang},{packages,packages}],
+
+ %% Build initial expand record.
+ St0 = #expand{exports=PreExp,
+ mod_imports=dict:from_list(PreModImp),
+ compile=Opts,
+ defined=PreExp,
+ bitdefault = erl_bits:system_bitdefault(),
+ bittypes = erl_bits:system_bittypes()
+ },
+ %% Expand the functions.
+ {Tfs,St1} = forms(Fs, foldl(fun define_function/2, St0, Fs)),
+ {Efs,St2} = expand_pmod(Tfs, St1),
+ %% Get the correct list of exported functions.
+ Exports = case member(export_all, St2#expand.compile) of
+ true -> St2#expand.defined;
+ false -> St2#expand.exports
+ end,
+ %% Generate all functions from stored info.
+ {Ats,St3} = module_attrs(St2#expand{exports = Exports}),
+ {Mfs,St4} = module_predef_funcs(St3),
+ {St4#expand.module, St4#expand.exports, Ats ++ Efs ++ Mfs,
+ St4#expand.compile}.
+
+expand_pmod(Fs0, St) ->
+ case St#expand.parameters of
+ undefined ->
+ {Fs0,St};
+ Ps ->
+ {Fs1,Xs,Ds} = sys_expand_pmod:forms(Fs0, Ps,
+ St#expand.exports,
+ St#expand.defined),
+ A = length(Ps),
+ Vs = [{var,0,V} || V <- Ps],
+ N = {atom,0,St#expand.module},
+ B = [{tuple,0,[N|Vs]}],
+ F = {function,0,new,A,[{clause,0,Vs,[],B}]},
+ As = St#expand.attributes,
+ {[F|Fs1],St#expand{exports=add_element({new,A}, Xs),
+ defined=add_element({new,A}, Ds),
+ attributes = [{abstract, true} | As]}}
+ end.
+
+%% -type define_function(Form, State) -> State.
+%% Add function to defined if form a function.
+
+define_function({function,_,N,A,_Cs}, St) ->
+ St#expand{defined=add_element({N,A}, St#expand.defined)};
+define_function(_, St) -> St.
+
+module_attrs(St) ->
+ {[{attribute,0,Name,Val} || {Name,Val} <- St#expand.attributes],St}.
+
+module_predef_funcs(St) ->
+ PreDef = [{module_info,0},{module_info,1}],
+ PreExp = PreDef,
+ {[{function,0,module_info,0,
+ [{clause,0,[],[],
+ [{call,0,{remote,0,{atom,0,erlang},{atom,0,get_module_info}},
+ [{atom,0,St#expand.module}]}]}]},
+ {function,0,module_info,1,
+ [{clause,0,[{var,0,'X'}],[],
+ [{call,0,{remote,0,{atom,0,erlang},{atom,0,get_module_info}},
+ [{atom,0,St#expand.module},{var,0,'X'}]}]}]}],
+ St#expand{defined=union(from_list(PreDef), St#expand.defined),
+ exports=union(from_list(PreExp), St#expand.exports)}}.
+
+%% forms(Forms, State) ->
+%% {TransformedForms,State'}
+%% Process the forms. Attributes are lost and just affect the state.
+%% Ignore uninteresting forms like eof and type.
+
+forms([{attribute,_,Name,Val}|Fs0], St0) ->
+ St1 = attribute(Name, Val, St0),
+ forms(Fs0, St1);
+forms([{function,L,N,A,Cs}|Fs0], St0) ->
+ {Ff,St1} = function(L, N, A, Cs, St0),
+ {Fs,St2} = forms(Fs0, St1),
+ {[Ff|Fs],St2};
+forms([_|Fs], St) -> forms(Fs, St);
+forms([], St) -> {[],St}.
+
+%% -type attribute(Attribute, Value, State) ->
+%% State.
+%% Process an attribute, this just affects the state.
+
+attribute(module, {Module, As}, St) ->
+ M = package_to_string(Module),
+ St#expand{module=list_to_atom(M),
+ package = packages:strip_last(M),
+ parameters=As};
+attribute(module, Module, St) ->
+ M = package_to_string(Module),
+ St#expand{module=list_to_atom(M),
+ package = packages:strip_last(M)};
+attribute(export, Es, St) ->
+ St#expand{exports=union(from_list(Es), St#expand.exports)};
+attribute(import, Is, St) ->
+ import(Is, St);
+attribute(compile, C, St) when list(C) ->
+ St#expand{compile=St#expand.compile ++ C};
+attribute(compile, C, St) ->
+ St#expand{compile=St#expand.compile ++ [C]};
+attribute(record, {Name,Defs}, St) ->
+ St#expand{records=dict:store(Name, normalise_fields(Defs),
+ St#expand.records)};
+attribute(file, _File, St) -> St; %This is ignored
+attribute(Name, Val, St) when list(Val) ->
+ St#expand{attributes=St#expand.attributes ++ [{Name,Val}]};
+attribute(Name, Val, St) ->
+ St#expand{attributes=St#expand.attributes ++ [{Name,[Val]}]}.
+
+function(L, N, A, Cs0, St0) ->
+ {Cs,St} = clauses(Cs0, St0#expand{func=N,arity=A,fcount=0}),
+ {{function,L,N,A,Cs},St}.
+
+%% -type clauses([Clause], State) ->
+%% {[TransformedClause],State}.
+%% Expand function clauses.
+
+clauses([{clause,Line,H0,G0,B0}|Cs0], St0) ->
+ {H,Hvs,_Hus,St1} = head(H0, St0),
+ {G,Gvs,_Gus,St2} = guard(G0, Hvs, St1),
+ {B,_Bvs,_Bus,St3} = exprs(B0, union(Hvs, Gvs), St2),
+ {Cs,St4} = clauses(Cs0, St3),
+ {[{clause,Line,H,G,B}|Cs],St4};
+clauses([], St) -> {[],St}.
+
+%% head(HeadPatterns, State) ->
+%% {TransformedPatterns,Variables,UsedVariables,State'}
+
+head(As, St) -> pattern_list(As, St).
+
+%% pattern(Pattern, State) ->
+%% {TransformedPattern,Variables,UsedVariables,State'}
+%% BITS: added used variables for bit patterns with varaible length
+%%
+
+pattern({var,_,'_'}=Var, St) -> %Ignore anonymous variable.
+ {Var,[],[],St};
+pattern({var,_,V}=Var, St) ->
+ {Var,[V],[],St};
+pattern({char,_,_}=Char, St) ->
+ {Char,[],[],St};
+pattern({integer,_,_}=Int, St) ->
+ {Int,[],[],St};
+pattern({float,_,_}=Float, St) ->
+ {Float,[],[],St};
+pattern({atom,_,_}=Atom, St) ->
+ {Atom,[],[],St};
+pattern({string,_,_}=String, St) ->
+ {String,[],[],St};
+pattern({nil,_}=Nil, St) ->
+ {Nil,[],[],St};
+pattern({cons,Line,H,T}, St0) ->
+ {TH,THvs,Hus,St1} = pattern(H, St0),
+ {TT,TTvs,Tus,St2} = pattern(T, St1),
+ {{cons,Line,TH,TT},union(THvs, TTvs),union(Hus,Tus),St2};
+pattern({tuple,Line,Ps}, St0) ->
+ {TPs,TPsvs,Tus,St1} = pattern_list(Ps, St0),
+ {{tuple,Line,TPs},TPsvs,Tus,St1};
+%%pattern({struct,Line,Tag,Ps}, St0) ->
+%% {TPs,TPsvs,St1} = pattern_list(Ps, St0),
+%% {{tuple,Line,[{atom,Line,Tag}|TPs]},TPsvs,St1};
+pattern({record_field,_,_,_}=M, St) ->
+ {expand_package(M, St), [], [], St}; % must be a package name
+pattern({record_index,Line,Name,Field}, St) ->
+ {index_expr(Line, Field, Name, record_fields(Name, St)),[],[],St};
+pattern({record,Line,Name,Pfs}, St0) ->
+ Fs = record_fields(Name, St0),
+ {TMs,TMsvs,Us,St1} = pattern_list(pattern_fields(Fs, Pfs), St0),
+ {{tuple,Line,[{atom,Line,Name}|TMs]},TMsvs,Us,St1};
+pattern({bin,Line,Es0}, St0) ->
+ {Es1,Esvs,Esus,St1} = pattern_bin(Es0, St0),
+ {{bin,Line,Es1},Esvs,Esus,St1};
+pattern({op,_,'++',{nil,_},R}, St) ->
+ pattern(R, St);
+pattern({op,_,'++',{cons,Li,H,T},R}, St) ->
+ pattern({cons,Li,H,{op,Li,'++',T,R}}, St);
+pattern({op,_,'++',{string,Li,L},R}, St) ->
+ pattern(string_to_conses(Li, L, R), St);
+pattern({match,Line,Pat1, Pat2}, St0) ->
+ {TH,Hvt,Hus,St1} = pattern(Pat2, St0),
+ {TT,Tvt,Tus,St2} = pattern(Pat1, St1),
+ {{match,Line,TT,TH}, union(Hvt,Tvt), union(Hus,Tus), St2};
+%% Compile-time pattern expressions, including unary operators.
+pattern({op,Line,Op,A}, St) ->
+ { erl_eval:partial_eval({op,Line,Op,A}), [], [], St};
+pattern({op,Line,Op,L,R}, St) ->
+ { erl_eval:partial_eval({op,Line,Op,L,R}), [], [], St}.
+
+pattern_list([P0|Ps0], St0) ->
+ {P,Pvs,Pus,St1} = pattern(P0, St0),
+ {Ps,Psvs,Psus,St2} = pattern_list(Ps0, St1),
+ {[P|Ps],union(Pvs, Psvs),union(Pus, Psus),St2};
+pattern_list([], St) -> {[],[],[],St}.
+
+%% guard(Guard, VisibleVariables, State) ->
+%% {TransformedGuard,NewVariables,UsedVariables,State'}
+%% Transform a list of guard tests. We KNOW that this has been checked
+%% and what the guards test are. Use expr for transforming the guard
+%% expressions.
+
+guard([G0|Gs0], Vs, St0) ->
+ {G,Hvs,Hus,St1} = guard_tests(G0, Vs, St0),
+ {Gs,Tvs,Tus,St2} = guard(Gs0, Vs, St1),
+ {[G|Gs],union(Hvs, Tvs),union(Hus, Tus),St2};
+guard([], _, St) -> {[],[],[],St}.
+
+guard_tests([Gt0|Gts0], Vs, St0) ->
+ {Gt1,Gvs,Gus,St1} = guard_test(Gt0, Vs, St0),
+ {Gts1,Gsvs,Gsus,St2} = guard_tests(Gts0, union(Gvs, Vs), St1),
+ {[Gt1|Gts1],union(Gvs, Gsvs),union(Gus, Gsus),St2};
+guard_tests([], _, St) -> {[],[],[],St}.
+
+guard_test({call,Line,{atom,_,record},[A,{atom,_,Name}]}, Vs, St) ->
+ record_test_in_guard(Line, A, Name, Vs, St);
+guard_test({call,Line,{atom,Lt,Tname},As}, Vs, St) ->
+ %% XXX This is ugly. We can remove this workaround if/when
+ %% we'll allow 'andalso' in guards. For now, we must have
+ %% different code in guards and in bodies.
+ Test = {remote,Lt,
+ {atom,Lt,erlang},
+ {atom,Lt,normalise_test(Tname, length(As))}},
+ put(sys_pre_expand_in_guard, yes),
+ R = expr({call,Line,Test,As}, Vs, St),
+ erase(sys_pre_expand_in_guard),
+ R;
+guard_test(Test, Vs, St) ->
+ %% XXX See the previous clause.
+ put(sys_pre_expand_in_guard, yes),
+ R = expr(Test, Vs, St),
+ erase(sys_pre_expand_in_guard),
+ R.
+
+%% record_test(Line, Term, Name, Vs, St) -> TransformedExpr
+%% Generate code for is_record/1.
+
+record_test(Line, Term, Name, Vs, St) ->
+ case get(sys_pre_expand_in_guard) of
+ undefined ->
+ record_test_in_body(Line, Term, Name, Vs, St);
+ yes ->
+ record_test_in_guard(Line, Term, Name, Vs, St)
+ end.
+
+record_test_in_guard(Line, Term, Name, Vs, St) ->
+ %% Notes: (1) To keep is_record/3 properly atomic (e.g. when inverted
+ %% using 'not'), we cannot convert it to an instruction
+ %% sequence here. It must remain a single call.
+ %% (2) Later passes assume that the last argument (the size)
+ %% is a literal.
+ %% (3) We don't want calls to erlang:is_record/3 (in the source code)
+ %% confused we the internal instruction. (Reason: (2) above +
+ %% code bloat.)
+ %% (4) Xref may be run on the abstract code, so the name in the
+ %% abstract code must be erlang:is_record/3.
+ %% (5) To achive both (3) and (4) at the same time, set the name
+ %% here to erlang:is_record/3, but mark it as compiler-generated.
+ %% The v3_core pass will change the name to erlang:internal_is_record/3.
+ Fs = record_fields(Name, St),
+ expr({call,-Line,{remote,-Line,{atom,-Line,erlang},{atom,-Line,is_record}},
+ [Term,{atom,Line,Name},{integer,Line,length(Fs)+1}]},
+ Vs, St).
+
+record_test_in_body(Line, Expr, Name, Vs, St0) ->
+ %% As Expr may have side effects, we must evaluate it
+ %% first and bind the value to a new variable.
+ %% We must use also handle the case that Expr does not
+ %% evaluate to a tuple properly.
+ Fs = record_fields(Name, St0),
+ {Var,St} = new_var(Line, St0),
+
+ expr({block,Line,
+ [{match,Line,Var,Expr},
+ {op,Line,
+ 'andalso',
+ {call,Line,{atom,Line,is_tuple},[Var]},
+ {op,Line,'andalso',
+ {op,Line,'=:=',
+ {call,Line,{atom,Line,size},[Var]},
+ {integer,Line,length(Fs)+1}},
+ {op,Line,'=:=',
+ {call,Line,{atom,Line,element},[{integer,Line,1},Var]},
+ {atom,Line,Name}}}}]}, Vs, St).
+
+normalise_test(atom, 1) -> is_atom;
+normalise_test(binary, 1) -> is_binary;
+normalise_test(constant, 1) -> is_constant;
+normalise_test(float, 1) -> is_float;
+normalise_test(function, 1) -> is_function;
+normalise_test(integer, 1) -> is_integer;
+normalise_test(list, 1) -> is_list;
+normalise_test(number, 1) -> is_number;
+normalise_test(pid, 1) -> is_pid;
+normalise_test(port, 1) -> is_port;
+normalise_test(reference, 1) -> is_reference;
+normalise_test(tuple, 1) -> is_tuple;
+normalise_test(Name, _) -> Name.
+
+%% exprs(Expressions, VisibleVariables, State) ->
+%% {TransformedExprs,NewVariables,UsedVariables,State'}
+
+exprs([E0|Es0], Vs, St0) ->
+ {E,Evs,Eus,St1} = expr(E0, Vs, St0),
+ {Es,Esvs,Esus,St2} = exprs(Es0, union(Evs, Vs), St1),
+ {[E|Es],union(Evs, Esvs),union(Eus, Esus),St2};
+exprs([], _, St) -> {[],[],[],St}.
+
+%% expr(Expression, VisibleVariables, State) ->
+%% {TransformedExpression,NewVariables,UsedVariables,State'}
+
+expr({var,_,V}=Var, _Vs, St) ->
+ {Var,[],[V],St};
+expr({char,_,_}=Char, _Vs, St) ->
+ {Char,[],[],St};
+expr({integer,_,_}=Int, _Vs, St) ->
+ {Int,[],[],St};
+expr({float,_,_}=Float, _Vs, St) ->
+ {Float,[],[],St};
+expr({atom,_,_}=Atom, _Vs, St) ->
+ {Atom,[],[],St};
+expr({string,_,_}=String, _Vs, St) ->
+ {String,[],[],St};
+expr({nil,_}=Nil, _Vs, St) ->
+ {Nil,[],[],St};
+expr({cons,Line,H0,T0}, Vs, St0) ->
+ {H,Hvs,Hus,St1} = expr(H0, Vs, St0),
+ {T,Tvs,Tus,St2} = expr(T0, Vs, St1),
+ {{cons,Line,H,T},union(Hvs, Tvs),union(Hus, Tus),St2};
+expr({lc,Line,E0,Qs0}, Vs, St0) ->
+ {E1,Qs1,_,Lvs,Lus,St1} = lc_tq(Line, E0, Qs0, {nil,Line}, Vs, St0),
+ {{lc,Line,E1,Qs1},Lvs,Lus,St1};
+expr({tuple,Line,Es0}, Vs, St0) ->
+ {Es1,Esvs,Esus,St1} = expr_list(Es0, Vs, St0),
+ {{tuple,Line,Es1},Esvs,Esus,St1};
+%%expr({struct,Line,Tag,Es0}, Vs, St0) ->
+%% {Es1,Esvs,Esus,St1} = expr_list(Es0, Vs, St0),
+%% {{tuple,Line,[{atom,Line,Tag}|Es1]},Esvs,Esus,St1};
+expr({record_field,_,_,_}=M, _Vs, St) ->
+ {expand_package(M, St), [], [], St}; % must be a package name
+expr({record_index,Line,Name,F}, Vs, St) ->
+ I = index_expr(Line, F, Name, record_fields(Name, St)),
+ expr(I, Vs, St);
+expr({record,Line,Name,Is}, Vs, St) ->
+ expr({tuple,Line,[{atom,Line,Name}|
+ record_inits(record_fields(Name, St), Is)]},
+ Vs, St);
+expr({record_field,Line,R,Name,F}, Vs, St) ->
+ I = index_expr(Line, F, Name, record_fields(Name, St)),
+ expr({call,Line,{atom,Line,element},[I,R]}, Vs, St);
+expr({record,_,R,Name,Us}, Vs, St0) ->
+ {Ue,St1} = record_update(R, Name, record_fields(Name, St0), Us, St0),
+ expr(Ue, Vs, St1);
+expr({bin,Line,Es0}, Vs, St0) ->
+ {Es1,Esvs,Esus,St1} = expr_bin(Es0, Vs, St0),
+ {{bin,Line,Es1},Esvs,Esus,St1};
+expr({block,Line,Es0}, Vs, St0) ->
+ {Es,Esvs,Esus,St1} = exprs(Es0, Vs, St0),
+ {{block,Line,Es},Esvs,Esus,St1};
+expr({'if',Line,Cs0}, Vs, St0) ->
+ {Cs,Csvss,Csuss,St1} = icr_clauses(Cs0, Vs, St0),
+ All = new_in_all(Vs, Csvss),
+ {{'if',Line,Cs},All,union(Csuss),St1};
+expr({'case',Line,E0,Cs0}, Vs, St0) ->
+ {E,Evs,Eus,St1} = expr(E0, Vs, St0),
+ {Cs,Csvss,Csuss,St2} = icr_clauses(Cs0, union(Evs, Vs), St1),
+ All = new_in_all(Vs, Csvss),
+ {{'case',Line,E,Cs},union(Evs, All),union([Eus|Csuss]),St2};
+expr({'cond',Line,Cs}, Vs, St0) ->
+ {V,St1} = new_var(Line,St0),
+ expr(cond_clauses(Cs,V), Vs, St1);
+expr({'receive',Line,Cs0}, Vs, St0) ->
+ {Cs,Csvss,Csuss,St1} = icr_clauses(Cs0, Vs, St0),
+ All = new_in_all(Vs, Csvss),
+ {{'receive',Line,Cs},All,union(Csuss),St1};
+expr({'receive',Line,Cs0,To0,ToEs0}, Vs, St0) ->
+ {To,Tovs,Tous,St1} = expr(To0, Vs, St0),
+ {ToEs,ToEsvs,_ToEsus,St2} = exprs(ToEs0, Vs, St1),
+ {Cs,Csvss,Csuss,St3} = icr_clauses(Cs0, Vs, St2),
+ All = new_in_all(Vs, [ToEsvs|Csvss]),
+ {{'receive',Line,Cs,To,ToEs},union(Tovs, All),union([Tous|Csuss]),St3};
+expr({'fun',Line,Body}, Vs, St) ->
+ fun_tq(Line, Body, Vs, St);
+%%% expr({call,_,{atom,La,this_module},[]}, _Vs, St) ->
+%%% {{atom,La,St#expand.module}, [], [], St};
+%%% expr({call,_,{atom,La,this_package},[]}, _Vs, St) ->
+%%% {{atom,La,list_to_atom(St#expand.package)}, [], [], St};
+%%% expr({call,_,{atom,La,this_package},[{atom,_,Name}]}, _Vs, St) ->
+%%% M = packages:concat(St#expand.package,Name),
+%%% {{atom,La,list_to_atom(M)}, [], [], St};
+%%% expr({call,Line,{atom,La,this_package},[A]}, Vs, St) ->
+%%% M = {call,Line,{remote,La,{atom,La,packages},{atom,La,concat}},
+%%% [{string,La,St#expand.package}, A]},
+%%% expr({call,Line,{atom,Line,list_to_atom},[M]}, Vs, St);
+expr({call,Line,{atom,_,is_record},[A,{atom,_,Name}]}, Vs, St) ->
+ record_test(Line, A, Name, Vs, St);
+expr({call,Line,{remote,_,{atom,_,erlang},{atom,_,is_record}},
+ [A,{atom,_,Name}]}, Vs, St) ->
+ record_test(Line, A, Name, Vs, St);
+expr({call,Line,{atom,La,N},As0}, Vs, St0) ->
+ {As,Asvs,Asus,St1} = expr_list(As0, Vs, St0),
+ Ar = length(As),
+ case erl_internal:bif(N, Ar) of
+ true ->
+ {{call,Line,{remote,La,{atom,La,erlang},{atom,La,N}},As},
+ Asvs,Asus,St1};
+ false ->
+ case imported(N, Ar, St1) of
+ {yes,Mod} ->
+ {{call,Line,{remote,La,{atom,La,Mod},{atom,La,N}},As},
+ Asvs,Asus,St1};
+ no ->
+ case {N,Ar} of
+ {record_info,2} ->
+ record_info_call(Line, As, St1);
+ _ ->
+ {{call,Line,{atom,La,N},As},Asvs,Asus,St1}
+ end
+ end
+ end;
+expr({call,Line,{record_field,_,_,_}=M,As0}, Vs, St0) ->
+ expr({call,Line,expand_package(M, St0),As0}, Vs, St0);
+expr({call,Line,{remote,Lr,M,F},As0}, Vs, St0) ->
+ M1 = expand_package(M, St0),
+ {[M2,F1|As1],Asvs,Asus,St1} = expr_list([M1,F|As0], Vs, St0),
+ {{call,Line,{remote,Lr,M2,F1},As1},Asvs,Asus,St1};
+expr({call,Line,{tuple,_,[{atom,_,_}=M,{atom,_,_}=F]},As}, Vs, St) ->
+ %% Rewrite {Mod,Function}(Args...) to Mod:Function(Args...).
+ expr({call,Line,{remote,Line,M,F},As}, Vs, St);
+expr({call,Line,F,As0}, Vs, St0) ->
+ {[Fun1|As1],Asvs,Asus,St1} = expr_list([F|As0], Vs, St0),
+ {{call,Line,Fun1,As1},Asvs,Asus,St1};
+expr({'try',Line,Es0,Scs0,Ccs0,As0}, Vs, St0) ->
+ {Es1,Esvs,Esus,St1} = exprs(Es0, Vs, St0),
+ Cvs = union(Esvs, Vs),
+ {Scs1,Scsvss,Scsuss,St2} = icr_clauses(Scs0, Cvs, St1),
+ {Ccs1,Ccsvss,Ccsuss,St3} = icr_clauses(Ccs0, Cvs, St2),
+ Csvss = Scsvss ++ Ccsvss,
+ Csuss = Scsuss ++ Ccsuss,
+ All = new_in_all(Vs, Csvss),
+ {As1,Asvs,Asus,St4} = exprs(As0, Cvs, St3),
+ {{'try',Line,Es1,Scs1,Ccs1,As1}, union([Asvs,Esvs,All]),
+ union([Esus,Asus|Csuss]), St4};
+expr({'catch',Line,E0}, Vs, St0) ->
+ %% Catch exports no new variables.
+ {E,_Evs,Eus,St1} = expr(E0, Vs, St0),
+ {{'catch',Line,E},[],Eus,St1};
+expr({match,Line,P0,E0}, Vs, St0) ->
+ {E,Evs,Eus,St1} = expr(E0, Vs, St0),
+ {P,Pvs,Pus,St2} = pattern(P0, St1),
+ {{match,Line,P,E},
+ union(subtract(Pvs, Vs), Evs),
+ union(intersection(Pvs, Vs), union(Eus,Pus)),St2};
+expr({op,L,'andalso',E1,E2}, Vs, St0) ->
+ {V,St1} = new_var(L,St0),
+ E = make_bool_switch(L,E1,V,
+ make_bool_switch(L,E2,V,{atom,L,true},
+ {atom,L,false}),
+ {atom,L,false}),
+ expr(E, Vs, St1);
+expr({op,L,'orelse',E1,E2}, Vs, St0) ->
+ {V,St1} = new_var(L,St0),
+ E = make_bool_switch(L,E1,V,{atom,L,true},
+ make_bool_switch(L,E2,V,{atom,L,true},
+ {atom,L,false})),
+ expr(E, Vs, St1);
+expr({op,Line,'++',{lc,Ll,E0,Qs0},M0}, Vs, St0) ->
+ {E1,Qs1,M1,Lvs,Lus,St1} = lc_tq(Ll, E0, Qs0, M0, Vs, St0),
+ {{op,Line,'++',{lc,Ll,E1,Qs1},M1},Lvs,Lus,St1};
+expr({op,_,'++',{string,L1,S1},{string,_,S2}}, _Vs, St) ->
+ {{string,L1,S1 ++ S2},[],[],St};
+expr({op,Ll,'++',{string,L1,S1}=Str,R0}, Vs, St0) ->
+ {R1,Rvs,Rus,St1} = expr(R0, Vs, St0),
+ E = case R1 of
+ {string,_,S2} -> {string,L1,S1 ++ S2};
+ _Other when length(S1) < 8 -> string_to_conses(L1, S1, R1);
+ _Other -> {op,Ll,'++',Str,R1}
+ end,
+ {E,Rvs,Rus,St1};
+expr({op,Ll,'++',{cons,Lc,H,T},L2}, Vs, St) ->
+ expr({cons,Ll,H,{op,Lc,'++',T,L2}}, Vs, St);
+expr({op,_,'++',{nil,_},L2}, Vs, St) ->
+ expr(L2, Vs, St);
+expr({op,Line,Op,A0}, Vs, St0) ->
+ {A,Avs,Aus,St1} = expr(A0, Vs, St0),
+ {{op,Line,Op,A},Avs,Aus,St1};
+expr({op,Line,Op,L0,R0}, Vs, St0) ->
+ {L,Lvs,Lus,St1} = expr(L0, Vs, St0),
+ {R,Rvs,Rus,St2} = expr(R0, Vs, St1),
+ {{op,Line,Op,L,R},union(Lvs, Rvs),union(Lus, Rus),St2}.
+
+expr_list([E0|Es0], Vs, St0) ->
+ {E,Evs,Eus,St1} = expr(E0, Vs, St0),
+ {Es,Esvs,Esus,St2} = expr_list(Es0, Vs, St1),
+ {[E|Es],union(Evs, Esvs),union(Eus, Esus),St2};
+expr_list([], _, St) ->
+ {[],[],[],St}.
+
+%% icr_clauses([Clause], [VisibleVariable], State) ->
+%% {[TransformedClause],[[NewVariable]],[[UsedVariable]],State'}
+%% Be very careful here to return the variables that are really used
+%% and really new.
+
+icr_clauses([], _, St) ->
+ {[],[[]],[],St};
+icr_clauses(Clauses, Vs, St) ->
+ icr_clauses2(Clauses, Vs, St).
+
+icr_clauses2([{clause,Line,H0,G0,B0}|Cs0], Vs, St0) ->
+ {H,Hvs,Hus,St1} = head(H0, St0), %Hvs is really used!
+ {G,Gvs,Gus,St2} = guard(G0, union(Hvs, Vs), St1),
+ {B,Bvs,Bus,St3} = exprs(B0, union([Vs,Hvs,Gvs]), St2),
+ New = subtract(union([Hvs,Gvs,Bvs]), Vs), %Really new
+ Used = intersection(union([Hvs,Hus,Gus,Bus]), Vs), %Really used
+ {Cs,Csvs,Csus,St4} = icr_clauses2(Cs0, Vs, St3),
+ {[{clause,Line,H,G,B}|Cs],[New|Csvs],[Used|Csus],St4};
+icr_clauses2([], _, St) ->
+ {[],[],[],St}.
+
+%% lc_tq(Line, Expr, Qualifiers, More, [VisibleVar], State) ->
+%% {TransExpr,[TransQual],TransMore,[NewVar],[UsedVar],State'}
+
+lc_tq(Line, E0, [{generate,Lg,P0,G0}|Qs0], M0, Vs, St0) ->
+ {G1,Gvs,Gus,St1} = expr(G0, Vs, St0),
+ {P1,Pvs,Pus,St2} = pattern(P0, St1),
+ {E1,Qs1,M1,Lvs,Lus,St3} = lc_tq(Line, E0, Qs0, M0, union(Pvs, Vs), St2),
+ {E1,[{generate,Lg,P1,G1}|Qs1],M1,
+ union(Gvs, Lvs),union([Gus,Pus,Lus]),St3};
+lc_tq(Line, E0, [F0|Qs0], M0, Vs, St0) ->
+ %% Allow record/2 and expand out as guard test.
+ case erl_lint:is_guard_test(F0) of
+ true ->
+ {F1,Fvs,_Fus,St1} = guard_tests([F0], Vs, St0),
+ {E1,Qs1,M1,Lvs,Lus,St2} = lc_tq(Line, E0, Qs0, M0, union(Fvs, Vs), St1),
+ {E1,F1++Qs1,M1,Lvs,Lus,St2};
+ false ->
+ {F1,Fvs,_Fus,St1} = expr(F0, Vs, St0),
+ {E1,Qs1,M1,Lvs,Lus,St2} = lc_tq(Line, E0, Qs0, M0, union(Fvs, Vs), St1),
+ {E1,[F1|Qs1],M1,Lvs,Lus,St2}
+ end;
+lc_tq(_Line, E0, [], M0, Vs, St0) ->
+ {E1,Evs,Eus,St1} = expr(E0, Vs, St0),
+ {M1,Mvs,Mus,St2} = expr(M0, Vs, St1),
+ {E1,[],M1,union(Evs, Mvs),union(Eus, Mus),St2}.
+
+%% fun_tq(Line, Body, VisibleVariables, State) ->
+%% {Fun,NewVariables,UsedVariables,State'}
+%% Transform an "explicit" fun {'fun', Line, {clauses, Cs}} into an
+%% extended form {'fun', Line, {clauses, Cs}, Info}, unless it is the
+%% name of a BIF (erl_lint has checked that it is not an import).
+%% Process the body sequence directly to get the new and used variables.
+%% "Implicit" funs {'fun', Line, {function, F, A}} are not changed.
+
+fun_tq(Lf, {function,F,A}, Vs, St0) ->
+ {As,St1} = new_vars(A, Lf, St0),
+ Cs = [{clause,Lf,As,[],[{call,Lf,{atom,Lf,F},As}]}],
+ case erl_internal:bif(F, A) of
+ true ->
+ fun_tq(Lf, {clauses,Cs}, Vs, St1);
+ false ->
+ Index = St0#expand.fun_index,
+ Uniq = erlang:hash(Cs, (1 bsl 27)-1),
+ {Fname,St2} = new_fun_name(St1),
+ {{'fun',Lf,{function,F,A},{Index,Uniq,Fname}},[],[],
+ St2#expand{fun_index=Index+1}}
+ end;
+fun_tq(Lf, {clauses,Cs0}, Vs, St0) ->
+ Uniq = erlang:hash(Cs0, (1 bsl 27)-1),
+ {Cs1,_Hvss,Frees,St1} = fun_clauses(Cs0, Vs, St0),
+ Ufrees = union(Frees),
+ Index = St1#expand.fun_index,
+ {Fname,St2} = new_fun_name(St1),
+ {{'fun',Lf,{clauses,Cs1},{Index,Uniq,Fname}},[],Ufrees,
+ St2#expand{fun_index=Index+1}}.
+
+fun_clauses([{clause,L,H0,G0,B0}|Cs0], Vs, St0) ->
+ {H,Hvs,Hus,St1} = head(H0, St0),
+ {G,Gvs,Gus,St2} = guard(G0, union(Hvs, Vs), St1),
+ {B,Bvs,Bus,St3} = exprs(B0, union([Vs,Hvs,Gvs]), St2),
+ %% Free variables cannot be new anywhere in the clause.
+ Free = subtract(union([Gus,Hus,Bus]), union([Hvs,Gvs,Bvs])),
+ %%io:format(" Gus :~p~n Bvs :~p~n Bus :~p~n Free:~p~n" ,[Gus,Bvs,Bus,Free]),
+ {Cs,Hvss,Frees,St4} = fun_clauses(Cs0, Vs, St3),
+ {[{clause,L,H,G,B}|Cs],[Hvs|Hvss],[Free|Frees],St4};
+fun_clauses([], _, St) -> {[],[],[],St}.
+
+%% new_fun_name(State) -> {FunName,State}.
+
+new_fun_name(#expand{func=F,arity=A,fcount=I}=St) ->
+ Name = "-" ++ atom_to_list(F) ++ "/" ++ integer_to_list(A)
+ ++ "-fun-" ++ integer_to_list(I) ++ "-",
+ {list_to_atom(Name),St#expand{fcount=I+1}}.
+
+
+%% normalise_fields([RecDef]) -> [Field].
+%% Normalise the field definitions to always have a default value. If
+%% none has been given then use 'undefined'.
+
+normalise_fields(Fs) ->
+ map(fun ({record_field,Lf,Field}) ->
+ {record_field,Lf,Field,{atom,Lf,undefined}};
+ (F) -> F end, Fs).
+
+%% record_fields(RecordName, State)
+%% find_field(FieldName, Fields)
+
+record_fields(R, St) -> dict:fetch(R, St#expand.records).
+
+find_field(F, [{record_field,_,{atom,_,F},Val}|_]) -> {ok,Val};
+find_field(F, [_|Fs]) -> find_field(F, Fs);
+find_field(_, []) -> error.
+
+%% field_names(RecFields) -> [Name].
+%% Return a list of the field names structures.
+
+field_names(Fs) ->
+ map(fun ({record_field,_,Field,_Val}) -> Field end, Fs).
+
+%% index_expr(Line, FieldExpr, Name, Fields) -> IndexExpr.
+%% Return an expression which evaluates to the index of a
+%% field. Currently only handle the case where the field is an
+%% atom. This expansion must be passed through expr again.
+
+index_expr(Line, {atom,_,F}, _Name, Fs) ->
+ {integer,Line,index_expr(F, Fs, 2)}.
+
+index_expr(F, [{record_field,_,{atom,_,F},_}|_], I) -> I;
+index_expr(F, [_|Fs], I) ->
+ index_expr(F, Fs, I+1).
+
+%% pattern_fields([RecDefField], [Match]) -> [Pattern].
+%% Build a list of match patterns for the record tuple elements.
+%% This expansion must be passed through pattern again. N.B. We are
+%% scanning the record definition field list!
+
+pattern_fields(Fs, Ms) ->
+ Wildcard = record_wildcard_init(Ms),
+ map(fun ({record_field,L,{atom,_,F},_}) ->
+ case find_field(F, Ms) of
+ {ok,Match} -> Match;
+ error when Wildcard =:= none -> {var,L,'_'};
+ error -> Wildcard
+ end end,
+ Fs).
+
+%% record_inits([RecDefField], [Init]) -> [InitExpr].
+%% Build a list of initialisation expressions for the record tuple
+%% elements. This expansion must be passed through expr
+%% again. N.B. We are scanning the record definition field list!
+
+record_inits(Fs, Is) ->
+ WildcardInit = record_wildcard_init(Is),
+ map(fun ({record_field,_,{atom,_,F},D}) ->
+ case find_field(F, Is) of
+ {ok,Init} -> Init;
+ error when WildcardInit =:= none -> D;
+ error -> WildcardInit
+ end end,
+ Fs).
+
+record_wildcard_init([{record_field,_,{var,_,'_'},D}|_]) -> D;
+record_wildcard_init([_|Is]) -> record_wildcard_init(Is);
+record_wildcard_init([]) -> none.
+
+%% record_update(Record, RecordName, [RecDefField], [Update], State) ->
+%% {Expr,State'}
+%% Build an expression to update fields in a record returning a new
+%% record. Try to be smart and optimise this. This expansion must be
+%% passed through expr again.
+
+record_update(R, Name, Fs, Us0, St0) ->
+ Line = element(2, R),
+ {Pre,Us,St1} = record_exprs(Us0, St0),
+ Nf = length(Fs), %# of record fields
+ Nu = length(Us), %# of update fields
+ Nc = Nf - Nu, %# of copy fields
+
+ %% We need a new variable for the record expression
+ %% to guarantee that it is only evaluated once.
+ {Var,St2} = new_var(Line, St1),
+
+ %% Try to be intelligent about which method of updating record to use.
+ {Update,St} =
+ if
+ Nu == 0 -> {R,St2}; %No fields updated
+ Nu =< Nc -> %Few fields updated
+ {record_setel(Var, Name, Fs, Us), St2};
+ true -> %The wide area inbetween
+ record_match(Var, Name, Fs, Us, St2)
+ end,
+ {{block,element(2, R),Pre ++ [{match,Line,Var,R},Update]},St}.
+
+%% record_match(Record, RecordName, [RecDefField], [Update], State)
+%% Build a 'case' expression to modify record fields.
+
+record_match(R, Name, Fs, Us, St0) ->
+ {Ps,News,St1} = record_upd_fs(Fs, Us, St0),
+ Lr = element(2, hd(Us)),
+ {{'case',Lr,R,
+ [{clause,Lr,[{tuple,Lr,[{atom,Lr,Name}|Ps]}],[],
+ [{tuple,Lr,[{atom,Lr,Name}|News]}]},
+ {clause,Lr,[{var,Lr,'_'}],[],
+ [call_error(Lr, {tuple,Lr,[{atom,Lr,badrecord},{atom,Lr,Name}]})]}
+ ]},
+ St1}.
+
+record_upd_fs([{record_field,Lf,{atom,_La,F},_Val}|Fs], Us, St0) ->
+ {P,St1} = new_var(Lf, St0),
+ {Ps,News,St2} = record_upd_fs(Fs, Us, St1),
+ case find_field(F, Us) of
+ {ok,New} -> {[P|Ps],[New|News],St2};
+ error -> {[P|Ps],[P|News],St2}
+ end;
+record_upd_fs([], _, St) -> {[],[],St}.
+
+%% record_setel(Record, RecordName, [RecDefField], [Update])
+%% Build a nested chain of setelement calls to build the
+%% updated record tuple.
+
+record_setel(R, Name, Fs, Us0) ->
+ Us1 = foldl(fun ({record_field,Lf,Field,Val}, Acc) ->
+ I = index_expr(Lf, Field, Name, Fs),
+ [{I,Lf,Val}|Acc]
+ end, [], Us0),
+ Us = sort(Us1),
+ Lr = element(2, hd(Us)),
+ Wildcards = duplicate(length(Fs), {var,Lr,'_'}),
+ {'case',Lr,R,
+ [{clause,Lr,[{tuple,Lr,[{atom,Lr,Name}|Wildcards]}],[],
+ [foldr(fun ({I,Lf,Val}, Acc) ->
+ {call,Lf,{atom,Lf,setelement},[I,Acc,Val]} end,
+ R, Us)]},
+ {clause,Lr,[{var,Lr,'_'}],[],
+ [call_error(Lr, {tuple,Lr,[{atom,Lr,badrecord},{atom,Lr,Name}]})]}]}.
+
+%% Expand a call to record_info/2. We have checked that it is not
+%% shadowed by an import.
+
+record_info_call(Line, [{atom,_Li,Info},{atom,_Ln,Name}], St) ->
+ case Info of
+ size ->
+ {{integer,Line,1+length(record_fields(Name, St))},[],[],St};
+ fields ->
+ {make_list(field_names(record_fields(Name, St)), Line),
+ [],[],St}
+ end.
+
+%% Break out expressions from an record update list and bind to new
+%% variables. The idea is that we will evaluate all update expressions
+%% before starting to update the record.
+
+record_exprs(Us, St) ->
+ record_exprs(Us, St, [], []).
+
+record_exprs([{record_field,Lf,{atom,_La,_F}=Name,Val}=Field0|Us], St0, Pre, Fs) ->
+ case is_simple_val(Val) of
+ true ->
+ record_exprs(Us, St0, Pre, [Field0|Fs]);
+ false ->
+ {Var,St} = new_var(Lf, St0),
+ Bind = {match,Lf,Var,Val},
+ Field = {record_field,Lf,Name,Var},
+ record_exprs(Us, St, [Bind|Pre], [Field|Fs])
+ end;
+record_exprs([], St, Pre, Fs) ->
+ {reverse(Pre),Fs,St}.
+
+is_simple_val({var,_,_}) -> true;
+is_simple_val({atom,_,_}) -> true;
+is_simple_val({integer,_,_}) -> true;
+is_simple_val({float,_,_}) -> true;
+is_simple_val({nil,_}) -> true;
+is_simple_val(_) -> false.
+
+%% pattern_bin([Element], State) -> {[Element],[Variable],[UsedVar],State}.
+
+pattern_bin(Es0, St) ->
+ Es1 = bin_expand_strings(Es0),
+ foldr(fun (E, Acc) -> pattern_element(E, Acc) end, {[],[],[],St}, Es1).
+
+pattern_element({bin_element,Line,Expr,Size,Type}, {Es,Esvs,Esus,St0}) ->
+ {Expr1,Vs1,Us1,St1} = pattern(Expr, St0),
+ {Size1,Vs2,Us2,St2} = pat_bit_size(Size, St1),
+ {Size2,Type1} = make_bit_type(Line, Size1,Type),
+ {[{bin_element,Line,Expr1,Size2,Type1}|Es],
+ union([Vs1,Vs2,Esvs]),union([Us1,Us2,Esus]),St2}.
+
+pat_bit_size(default, St) -> {default,[],[],St};
+pat_bit_size({atom,_La,all}=All, St) -> {All,[],[],St};
+pat_bit_size({var,_Lv,V}=Var, St) -> {Var,[],[V],St};
+pat_bit_size(Size, St) ->
+ Line = element(2, Size),
+ {value,Sz,_} = erl_eval:expr(Size, erl_eval:new_bindings()),
+ {{integer,Line,Sz},[],[],St}.
+
+make_bit_type(Line, default, Type0) ->
+ case erl_bits:set_bit_type(default, Type0) of
+ {ok,all,Bt} -> {{atom,Line,all},erl_bits:as_list(Bt)};
+ {ok,Size,Bt} -> {{integer,Line,Size},erl_bits:as_list(Bt)}
+ end;
+make_bit_type(_Line, Size, Type0) -> %Integer or 'all'
+ {ok,Size,Bt} = erl_bits:set_bit_type(Size, Type0),
+ {Size,erl_bits:as_list(Bt)}.
+
+%% expr_bin([Element], [VisibleVar], State) ->
+%% {[Element],[NewVar],[UsedVar],State}.
+
+expr_bin(Es0, Vs, St) ->
+ Es1 = bin_expand_strings(Es0),
+ foldr(fun (E, Acc) -> bin_element(E, Vs, Acc) end, {[],[],[],St}, Es1).
+
+bin_element({bin_element,Line,Expr,Size,Type}, Vs, {Es,Esvs,Esus,St0}) ->
+ {Expr1,Vs1,Us1,St1} = expr(Expr, Vs, St0),
+ {Size1,Vs2,Us2,St2} = if Size == default -> {default,[],[],St1};
+ true -> expr(Size, Vs, St1)
+ end,
+ {Size2,Type1} = make_bit_type(Line, Size1, Type),
+ {[{bin_element,Line,Expr1,Size2,Type1}|Es],
+ union([Vs1,Vs2,Esvs]),union([Us1,Us2,Esus]),St2}.
+
+bin_expand_strings(Es) ->
+ foldr(fun ({bin_element,Line,{string,_,S},default,default}, Es1) ->
+ foldr(fun (C, Es2) ->
+ [{bin_element,Line,{char,Line,C},default,default}|Es2]
+ end, Es1, S);
+ (E, Es1) -> [E|Es1]
+ end, [], Es).
+
+%% new_var_name(State) -> {VarName,State}.
+
+new_var_name(St) ->
+ C = St#expand.vcount,
+ {list_to_atom("pre" ++ integer_to_list(C)),St#expand{vcount=C+1}}.
+
+%% new_var(Line, State) -> {Var,State}.
+
+new_var(L, St0) ->
+ {New,St1} = new_var_name(St0),
+ {{var,L,New},St1}.
+
+%% new_vars(Count, Line, State) -> {[Var],State}.
+%% Make Count new variables.
+
+new_vars(N, L, St) -> new_vars(N, L, St, []).
+
+new_vars(N, L, St0, Vs) when N > 0 ->
+ {V,St1} = new_var(L, St0),
+ new_vars(N-1, L, St1, [V|Vs]);
+new_vars(0, _L, St, Vs) -> {Vs,St}.
+
+%% make_list(TermList, Line) -> ConsTerm.
+
+make_list(Ts, Line) ->
+ foldr(fun (H, T) -> {cons,Line,H,T} end, {nil,Line}, Ts).
+
+string_to_conses(Line, Cs, Tail) ->
+ foldr(fun (C, T) -> {cons,Line,{char,Line,C},T} end, Tail, Cs).
+
+
+%% In syntax trees, module/package names are atoms or lists of atoms.
+
+package_to_string(A) when atom(A) -> atom_to_list(A);
+package_to_string(L) when list(L) -> packages:concat(L).
+
+expand_package({atom,L,A} = M, St) ->
+ case dict:find(A, St#expand.mod_imports) of
+ {ok, A1} ->
+ {atom,L,A1};
+ error ->
+ case packages:is_segmented(A) of
+ true ->
+ M;
+ false ->
+ M1 = packages:concat(St#expand.package, A),
+ {atom,L,list_to_atom(M1)}
+ end
+ end;
+expand_package(M, _St) ->
+ case erl_parse:package_segments(M) of
+ error ->
+ M;
+ M1 ->
+ {atom,element(2,M),list_to_atom(package_to_string(M1))}
+ end.
+
+%% Create a case-switch on true/false, generating badarg for all other
+%% values.
+
+make_bool_switch(L, E, V, T, F) ->
+ make_bool_switch_1(L, E, V, [T], [F]).
+
+make_bool_switch_1(L, E, V, T, F) ->
+ case get(sys_pre_expand_in_guard) of
+ undefined -> make_bool_switch_body(L, E, V, T, F);
+ yes -> make_bool_switch_guard(L, E, V, T, F)
+ end.
+
+make_bool_switch_guard(_, E, _, [{atom,_,true}], [{atom,_,false}]) -> E;
+make_bool_switch_guard(L, E, V, T, F) ->
+ NegL = -abs(L),
+ {'case',NegL,E,
+ [{clause,NegL,[{atom,NegL,true}],[],T},
+ {clause,NegL,[{atom,NegL,false}],[],F},
+ {clause,NegL,[V],[],[V]}
+ ]}.
+
+make_bool_switch_body(L, E, V, T, F) ->
+ NegL = -abs(L),
+ {'case',NegL,E,
+ [{clause,NegL,[{atom,NegL,true}],[],T},
+ {clause,NegL,[{atom,NegL,false}],[],F},
+ {clause,NegL,[V],[],
+ [call_error(NegL,{tuple,NegL,[{atom,NegL,badarg},V]})]}
+ ]}.
+
+%% Expand a list of cond-clauses to a sequence of case-switches.
+
+cond_clauses([{clause,L,[],[[E]],B}],V) ->
+ make_bool_switch_1(L,E,V,B,[call_error(L,{atom,L,cond_clause})]);
+cond_clauses([{clause,L,[],[[E]],B} | Cs],V) ->
+ make_bool_switch_1(L,E,V,B,[cond_clauses(Cs,V)]).
+
+%% call_error(Line, Reason) -> Expr.
+%% Build a call to erlang:error/1 with reason Reason.
+
+call_error(L, R) ->
+ {call,L,{remote,L,{atom,L,erlang},{atom,L,error}},[R]}.
+
+%% new_in_all(Before, RegionList) -> NewInAll
+%% Return the variables new in all clauses.
+
+new_in_all(Before, Region) ->
+ InAll = intersection(Region),
+ subtract(InAll, Before).
+
+%% import(Line, Imports, State) ->
+%% State'
+%% imported(Name, Arity, State) ->
+%% {yes,Module} | no
+%% Handle import declarations and est for imported functions. No need to
+%% check when building imports as code is correct.
+
+import({Mod0,Fs}, St) ->
+ Mod = list_to_atom(package_to_string(Mod0)),
+ Mfs = from_list(Fs),
+ St#expand{imports=add_imports(Mod, Mfs, St#expand.imports)};
+import(Mod0, St) ->
+ Mod = package_to_string(Mod0),
+ Key = list_to_atom(packages:last(Mod)),
+ St#expand{mod_imports=dict:store(Key, list_to_atom(Mod),
+ St#expand.mod_imports)}.
+
+add_imports(Mod, [F|Fs], Is) ->
+ add_imports(Mod, Fs, orddict:store(F, Mod, Is));
+add_imports(_, [], Is) -> Is.
+
+imported(F, A, St) ->
+ case orddict:find({F,A}, St#expand.imports) of
+ {ok,Mod} -> {yes,Mod};
+ error -> no
+ end.
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_codegen.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_codegen.erl
new file mode 100644
index 0000000000..6b787e8c95
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_codegen.erl
@@ -0,0 +1,1755 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: v3_codegen.erl,v 1.1 2008/12/17 09:53:42 mikpe Exp $
+%%
+%% Purpose : Code generator for Beam.
+
+%% The following assumptions have been made:
+%%
+%% 1. Matches, i.e. things with {match,M,Ret} wrappers, only return
+%% values; no variables are exported. If the match would have returned
+%% extra variables then these have been transformed to multiple return
+%% values.
+%%
+%% 2. All BIF's called in guards are gc-safe so there is no need to
+%% put thing on the stack in the guard. While this would in principle
+%% work it would be difficult to keep track of the stack depth when
+%% trimming.
+%%
+%% The code generation uses variable lifetime information added by
+%% the v3_life module to save variables, allocate registers and
+%% move registers to the stack when necessary.
+%%
+%% We try to use a consistent variable name scheme throughout. The
+%% StackReg record is always called Bef,Int<n>,Aft.
+
+-module(v3_codegen).
+
+%% The main interface.
+-export([module/2]).
+
+-import(lists, [member/2,keymember/3,keysort/2,keysearch/3,append/1,
+ map/2,flatmap/2,foldl/3,foldr/3,mapfoldl/3,
+ sort/1,reverse/1,reverse/2]).
+-import(v3_life, [vdb_find/2]).
+
+%%-compile([export_all]).
+
+-include("v3_life.hrl").
+
+%% Main codegen structure.
+-record(cg, {lcount=1, %Label counter
+ mod, %Current module
+ func, %Current function
+ finfo, %Function info label
+ fcode, %Function code label
+ btype, %Type of bif used.
+ bfail, %Fail label of bif
+ break, %Break label
+ recv, %Receive label
+ is_top_block, %Boolean: top block or not
+ functable = [], %Table of local functions:
+ %[{{Name, Arity}, Label}...]
+ in_catch=false, %Inside a catch or not.
+ need_frame, %Need a stack frame.
+ new_funs=true}). %Generate new fun instructions.
+
+%% Stack/register state record.
+-record(sr, {reg=[], %Register table
+ stk=[], %Stack table
+ res=[]}). %Reserved regs: [{reserved,I,V}]
+
+module({Mod,Exp,Attr,Forms}, Options) ->
+ NewFunsFlag = not member(no_new_funs, Options),
+ {Fs,St} = functions(Forms, #cg{mod=Mod,new_funs=NewFunsFlag}),
+ {ok,{Mod,Exp,Attr,Fs,St#cg.lcount}}.
+
+functions(Forms, St0) ->
+ mapfoldl(fun (F, St) -> function(F, St) end, St0#cg{lcount=1}, Forms).
+
+function({function,Name,Arity,As0,Vb,Vdb}, St0) ->
+ %%ok = io:fwrite("cg ~w:~p~n", [?LINE,{Name,Arity}]),
+ St1 = St0#cg{func={Name,Arity}},
+ {Fun,St2} = cg_fun(Vb, As0, Vdb, St1),
+ Func0 = {function,Name,Arity,St2#cg.fcode,Fun},
+ Func = bs_function(Func0),
+ {Func,St2}.
+
+%% cg_fun([Lkexpr], [HeadVar], Vdb, State) -> {[Ainstr],State}
+
+cg_fun(Les, Hvs, Vdb, St0) ->
+ {Name,Arity} = St0#cg.func,
+ {Fi,St1} = new_label(St0), %FuncInfo label
+ {Fl,St2} = local_func_label(Name, Arity, St1),
+ %% Create initial stack/register state, clear unused arguments.
+ Bef = clear_dead(#sr{reg=foldl(fun ({var,V}, Reg) ->
+ put_reg(V, Reg)
+ end, [], Hvs),
+ stk=[]}, 0, Vdb),
+ {B2,_Aft,St3} = cg_list(Les, 0, Vdb, Bef, St2#cg{btype=exit,
+ bfail=Fi,
+ finfo=Fi,
+ fcode=Fl,
+ is_top_block=true}),
+ A = [{label,Fi},{func_info,{atom,St3#cg.mod},{atom,Name},Arity},
+ {label,Fl}|B2],
+ {A,St3}.
+
+%% cg(Lkexpr, Vdb, StackReg, State) -> {[Ainstr],StackReg,State}.
+%% Generate code for a kexpr.
+%% Split function into two steps for clarity, not efficiency.
+
+cg(Le, Vdb, Bef, St) ->
+ cg(Le#l.ke, Le, Vdb, Bef, St).
+
+cg({block,Es}, Le, Vdb, Bef, St) ->
+ block_cg(Es, Le, Vdb, Bef, St);
+cg({match,M,Rs}, Le, Vdb, Bef, St) ->
+ match_cg(M, Rs, Le, Vdb, Bef, St);
+cg({match_fail,F}, Le, Vdb, Bef, St) ->
+ match_fail_cg(F, Le, Vdb, Bef, St);
+cg({call,Func,As,Rs}, Le, Vdb, Bef, St) ->
+ call_cg(Func, As, Rs, Le, Vdb, Bef, St);
+cg({enter,Func,As}, Le, Vdb, Bef, St) ->
+ enter_cg(Func, As, Le, Vdb, Bef, St);
+cg({bif,Bif,As,Rs}, Le, Vdb, Bef, St) ->
+ bif_cg(Bif, As, Rs, Le, Vdb, Bef, St);
+cg({receive_loop,Te,Rvar,Rm,Tes,Rs}, Le, Vdb, Bef, St) ->
+ recv_loop_cg(Te, Rvar, Rm, Tes, Rs, Le, Vdb, Bef, St);
+cg(receive_next, Le, Vdb, Bef, St) ->
+ recv_next_cg(Le, Vdb, Bef, St);
+cg(receive_accept, _Le, _Vdb, Bef, St) -> {[remove_message],Bef,St};
+cg({'try',Ta,Vs,Tb,Evs,Th,Rs}, Le, Vdb, Bef, St) ->
+ try_cg(Ta, Vs, Tb, Evs, Th, Rs, Le, Vdb, Bef, St);
+cg({'catch',Cb,R}, Le, Vdb, Bef, St) ->
+ catch_cg(Cb, R, Le, Vdb, Bef, St);
+cg({set,Var,Con}, Le, Vdb, Bef, St) -> set_cg(Var, Con, Le, Vdb, Bef, St);
+cg({return,Rs}, Le, Vdb, Bef, St) -> return_cg(Rs, Le, Vdb, Bef, St);
+cg({break,Bs}, Le, Vdb, Bef, St) -> break_cg(Bs, Le, Vdb, Bef, St);
+cg({need_heap,0}, _Le, _Vdb, Bef, St) ->
+ {[],Bef,St};
+cg({need_heap,H}, _Le, _Vdb, Bef, St) ->
+ {[{test_heap,H,max_reg(Bef#sr.reg)}],Bef,St}.
+
+%% cg_list([Kexpr], FirstI, Vdb, StackReg, St) -> {[Ainstr],StackReg,St}.
+
+cg_list(Kes, I, Vdb, Bef, St0) ->
+ {Keis,{Aft,St1}} =
+ flatmapfoldl(fun (Ke, {Inta,Sta}) ->
+% ok = io:fwrite(" %% ~p\n", [Inta]),
+% ok = io:fwrite("cgl:~p\n", [Ke]),
+ {Keis,Intb,Stb} = cg(Ke, Vdb, Inta, Sta),
+% ok = io:fwrite(" ~p\n", [Keis]),
+% ok = io:fwrite(" %% ~p\n", [Intb]),
+ {comment(Inta) ++ Keis,{Intb,Stb}}
+ end, {Bef,St0}, need_heap(Kes, I)),
+ {Keis,Aft,St1}.
+
+%% need_heap([Lkexpr], I, BifType) -> [Lkexpr].
+%% Insert need_heap instructions in Kexpr list. Try to be smart and
+%% collect them together as much as possible.
+
+need_heap(Kes0, I) ->
+ {Kes1,{H,F}} = flatmapfoldr(fun (Ke, {H0,F0}) ->
+ {Ns,H1,F1} = need_heap_1(Ke, H0, F0),
+ {[Ke|Ns],{H1,F1}}
+ end, {0,false}, Kes0),
+ %% Prepend need_heap if necessary.
+ Kes2 = need_heap_need(I, H, F) ++ Kes1,
+% ok = io:fwrite("need_heap: ~p~n",
+% [{{H,F},
+% map(fun (#l{ke={match,M,Rs}}) -> match;
+% (Lke) -> Lke#l.ke end, Kes2)}]),
+ Kes2.
+
+need_heap_1(#l{ke={set,_,{binary,_}},i=I}, H, F) ->
+ {need_heap_need(I, H, F),0,false};
+need_heap_1(#l{ke={set,_,Val}}, H, F) ->
+ %% Just pass through adding to needed heap.
+ {[],H + case Val of
+ {cons,_} -> 2;
+ {tuple,Es} -> 1 + length(Es);
+ {string,S} -> 2 * length(S);
+ _Other -> 0
+ end,F};
+need_heap_1(#l{ke={call,_Func,_As,_Rs},i=I}, H, F) ->
+ %% Calls generate a need if necessary and also force one.
+ {need_heap_need(I, H, F),0,true};
+need_heap_1(#l{ke={bif,dsetelement,_As,_Rs},i=I}, H, F) ->
+ {need_heap_need(I, H, F),0,true};
+need_heap_1(#l{ke={bif,{make_fun,_,_,_,_},_As,_Rs},i=I}, H, F) ->
+ {need_heap_need(I, H, F),0,true};
+need_heap_1(#l{ke={bif,_Bif,_As,_Rs}}, H, F) ->
+ {[],H,F};
+need_heap_1(#l{i=I}, H, F) ->
+ %% Others kexprs generate a need if necessary but don't force.
+ {need_heap_need(I, H, F),0,false}.
+
+need_heap_need(_I, 0, false) -> [];
+need_heap_need(I, H, _F) -> [#l{ke={need_heap,H},i=I}].
+
+
+%% match_cg(Match, [Ret], Le, Vdb, StackReg, State) ->
+%% {[Ainstr],StackReg,State}.
+%% Generate code for a match. First save all variables on the stack
+%% that are to survive after the match. We leave saved variables in
+%% their registers as they might actually be in the right place.
+%% Should test this.
+
+match_cg(M, Rs, Le, Vdb, Bef, St0) ->
+ I = Le#l.i,
+ {Sis,Int0} = adjust_stack(Bef, I, I+1, Vdb),
+ {B,St1} = new_label(St0),
+ {Mis,Int1,St2} = match_cg(M, none, Int0, St1#cg{break=B}),
+ %% Put return values in registers.
+ Reg = load_vars(Rs, Int1#sr.reg),
+ {Sis ++ Mis ++ [{label,B}],
+ clear_dead(Int1#sr{reg=Reg}, I, Vdb),
+ St2#cg{break=St1#cg.break}}.
+
+%% match_cg(Match, Fail, StackReg, State) -> {[Ainstr],StackReg,State}.
+%% Generate code for a match tree. N.B. there is no need pass Vdb
+%% down as each level which uses this takes its own internal Vdb not
+%% the outer one.
+
+match_cg(Le, Fail, Bef, St) ->
+ match_cg(Le#l.ke, Le, Fail, Bef, St).
+
+match_cg({alt,F,S}, _Le, Fail, Bef, St0) ->
+ {Tf,St1} = new_label(St0),
+ {Fis,Faft,St2} = match_cg(F, Tf, Bef, St1),
+ {Sis,Saft,St3} = match_cg(S, Fail, Bef, St2),
+ Aft = sr_merge(Faft, Saft),
+ {Fis ++ [{label,Tf}] ++ Sis,Aft,St3};
+match_cg({select,V,Scs}, _Va, Fail, Bef, St) ->
+ match_fmf(fun (S, F, Sta) ->
+ select_cg(S, V, F, Fail, Bef, Sta) end,
+ Fail, St, Scs);
+match_cg({guard,Gcs}, _Le, Fail, Bef, St) ->
+ match_fmf(fun (G, F, Sta) -> guard_clause_cg(G, F, Bef, Sta) end,
+ Fail, St, Gcs);
+match_cg({block,Es}, Le, _Fail, Bef, St) ->
+ %% Must clear registers and stack of dead variables.
+ Int = clear_dead(Bef, Le#l.i, Le#l.vdb),
+ block_cg(Es, Le, Int, St).
+
+%% match_fail_cg(FailReason, Le, Vdb, StackReg, State) ->
+%% {[Ainstr],StackReg,State}.
+%% Generate code for the match_fail "call". N.B. there is no generic
+%% case for when the fail value has been created elsewhere.
+
+match_fail_cg({function_clause,As}, Le, Vdb, Bef, St) ->
+ %% Must have the args in {x,0}, {x,1},...
+ {Sis,Int} = cg_setup_call(As, Bef, Le#l.i, Vdb),
+ {Sis ++ [{jump,{f,St#cg.finfo}}],
+ Int#sr{reg=clear_regs(Int#sr.reg)},St};
+match_fail_cg({badmatch,Term}, Le, Vdb, Bef, St) ->
+ R = cg_reg_arg(Term, Bef),
+ Int0 = clear_dead(Bef, Le#l.i, Vdb),
+ {Sis,Int} = adjust_stack(Int0, Le#l.i, Le#l.i+1, Vdb),
+ {Sis ++ [{badmatch,R}],
+ Int#sr{reg=clear_regs(Int0#sr.reg)},St};
+match_fail_cg({case_clause,Reason}, Le, Vdb, Bef, St) ->
+ R = cg_reg_arg(Reason, Bef),
+ Int0 = clear_dead(Bef, Le#l.i, Vdb),
+ {Sis,Int} = adjust_stack(Int0, Le#l.i, Le#l.i+1, Vdb),
+ {Sis++[{case_end,R}],
+ Int#sr{reg=clear_regs(Bef#sr.reg)},St};
+match_fail_cg(if_clause, Le, Vdb, Bef, St) ->
+ Int0 = clear_dead(Bef, Le#l.i, Vdb),
+ {Sis,Int1} = adjust_stack(Int0, Le#l.i, Le#l.i+1, Vdb),
+ {Sis++[if_end],Int1#sr{reg=clear_regs(Int1#sr.reg)},St};
+match_fail_cg({try_clause,Reason}, Le, Vdb, Bef, St) ->
+ R = cg_reg_arg(Reason, Bef),
+ Int0 = clear_dead(Bef, Le#l.i, Vdb),
+ {Sis,Int} = adjust_stack(Int0, Le#l.i, Le#l.i+1, Vdb),
+ {Sis ++ [{try_case_end,R}],
+ Int#sr{reg=clear_regs(Int0#sr.reg)},St}.
+
+
+%% block_cg([Kexpr], Le, Vdb, StackReg, St) -> {[Ainstr],StackReg,St}.
+%% block_cg([Kexpr], Le, StackReg, St) -> {[Ainstr],StackReg,St}.
+
+block_cg(Es, Le, _Vdb, Bef, St) ->
+ block_cg(Es, Le, Bef, St).
+
+block_cg(Es, Le, Bef, St0) ->
+ case St0#cg.is_top_block of
+ false ->
+ cg_block(Es, Le#l.i, Le#l.vdb, Bef, St0);
+ true ->
+ {Keis,Aft,St1} = cg_block(Es, Le#l.i, Le#l.vdb, Bef,
+ St0#cg{is_top_block=false,
+ need_frame=false}),
+ top_level_block(Keis, Aft, max_reg(Bef#sr.reg), St1)
+ end.
+
+cg_block([], _I, _Vdb, Bef, St0) ->
+ {[],Bef,St0};
+cg_block(Kes0, I, Vdb, Bef, St0) ->
+ {Kes2,Int1,St1} =
+ case basic_block(Kes0) of
+ {Kes1,LastI,Args,Rest} ->
+ Ke = hd(Kes1),
+ Fb = Ke#l.i,
+ cg_basic_block(Kes1, Fb, LastI, Args, Vdb, Bef, St0);
+ {Kes1,Rest} ->
+ cg_list(Kes1, I, Vdb, Bef, St0)
+ end,
+ {Kes3,Int2,St2} = cg_block(Rest, I, Vdb, Int1, St1),
+ {Kes2 ++ Kes3,Int2,St2}.
+
+basic_block(Kes) -> basic_block(Kes, []).
+
+basic_block([], Acc) -> {reverse(Acc),[]};
+basic_block([Le|Les], Acc) ->
+ case collect_block(Le#l.ke) of
+ include -> basic_block(Les, [Le|Acc]);
+ {block_end,As} -> {reverse(Acc, [Le]),Le#l.i,As,Les};
+ no_block -> {reverse(Acc, [Le]),Les}
+ end.
+
+collect_block({set,_,{binary,_}}) -> no_block;
+collect_block({set,_,_}) -> include;
+collect_block({call,{var,_}=Var,As,_Rs}) -> {block_end,As++[Var]};
+collect_block({call,Func,As,_Rs}) -> {block_end,As++func_vars(Func)};
+collect_block({enter,{var,_}=Var,As})-> {block_end,As++[Var]};
+collect_block({enter,Func,As}) -> {block_end,As++func_vars(Func)};
+collect_block({return,Rs}) -> {block_end,Rs};
+collect_block({break,Bs}) -> {block_end,Bs};
+collect_block({bif,_Bif,_As,_Rs}) -> include;
+collect_block(_) -> no_block.
+
+func_vars({remote,M,F}) when element(1, M) == var;
+ element(1, F) == var ->
+ [M,F];
+func_vars(_) -> [].
+
+%% cg_basic_block([Kexpr], FirstI, LastI, As, Vdb, StackReg, State) ->
+%% {[Ainstr],StackReg,State}.
+
+cg_basic_block(Kes, Fb, Lf, As, Vdb, Bef, St0) ->
+ Res = make_reservation(As, 0),
+ Regs0 = reserve(Res, Bef#sr.reg, Bef#sr.stk),
+ Stk = extend_stack(Bef, Lf, Lf+1, Vdb),
+ Int0 = Bef#sr{reg=Regs0,stk=Stk,res=Res},
+ X0_v0 = x0_vars(As, Fb, Lf, Vdb),
+ {Keis,{Aft,_,St1}} =
+ flatmapfoldl(fun(Ke, St) -> cg_basic_block(Ke, St, Lf, Vdb) end,
+ {Int0,X0_v0,St0}, need_heap(Kes, Fb)),
+ {Keis,Aft,St1}.
+
+cg_basic_block(Ke, {Inta,X0v,Sta}, _Lf, Vdb) when element(1, Ke#l.ke) =:= need_heap ->
+ {Keis,Intb,Stb} = cg(Ke, Vdb, Inta, Sta),
+ {comment(Inta) ++ Keis, {Intb,X0v,Stb}};
+cg_basic_block(Ke, {Inta,X0_v1,Sta}, Lf, Vdb) ->
+ {Sis,Intb} = save_carefully(Inta, Ke#l.i, Lf+1, Vdb),
+ {X0_v2,Intc} = allocate_x0(X0_v1, Ke#l.i, Intb),
+ Intd = reserve(Intc),
+ {Keis,Inte,Stb} = cg(Ke, Vdb, Intd, Sta),
+ {comment(Inta) ++ Sis ++ Keis, {Inte,X0_v2,Stb}}.
+
+make_reservation([], _) -> [];
+make_reservation([{var,V}|As], I) -> [{I,V}|make_reservation(As, I+1)];
+make_reservation([A|As], I) -> [{I,A}|make_reservation(As, I+1)].
+
+reserve(Sr) -> Sr#sr{reg=reserve(Sr#sr.res, Sr#sr.reg, Sr#sr.stk)}.
+
+reserve([{I,V}|Rs], [free|Regs], Stk) -> [{reserved,I,V}|reserve(Rs, Regs, Stk)];
+reserve([{I,V}|Rs], [{I,V}|Regs], Stk) -> [{I,V}|reserve(Rs, Regs, Stk)];
+reserve([{I,V}|Rs], [{I,Var}|Regs], Stk) ->
+ case on_stack(Var, Stk) of
+ true -> [{reserved,I,V}|reserve(Rs, Regs, Stk)];
+ false -> [{I,Var}|reserve(Rs, Regs, Stk)]
+ end;
+reserve([{I,V}|Rs], [{reserved,I,_}|Regs], Stk) ->
+ [{reserved,I,V}|reserve(Rs, Regs, Stk)];
+%reserve([{I,V}|Rs], [Other|Regs], Stk) -> [Other|reserve(Rs, Regs, Stk)];
+reserve([{I,V}|Rs], [], Stk) -> [{reserved,I,V}|reserve(Rs, [], Stk)];
+reserve([], Regs, _) -> Regs.
+
+extend_stack(Bef, Fb, Lf, Vdb) ->
+ Stk0 = clear_dead_stk(Bef#sr.stk, Fb, Vdb),
+ Saves = [V || {V,F,L} <- Vdb,
+ F < Fb,
+ L >= Lf,
+ not on_stack(V, Stk0)],
+ Stk1 = foldl(fun (V, Stk) -> put_stack(V, Stk) end, Stk0, Saves),
+ Bef#sr.stk ++ lists:duplicate(length(Stk1) - length(Bef#sr.stk), free).
+
+save_carefully(Bef, Fb, Lf, Vdb) ->
+ Stk = Bef#sr.stk,
+ %% New variables that are in use but not on stack.
+ New = [ {V,F,L} || {V,F,L} <- Vdb,
+ F < Fb,
+ L >= Lf,
+ not on_stack(V, Stk) ],
+ Saves = [ V || {V,_,_} <- keysort(2, New) ],
+ save_carefully(Saves, Bef, []).
+
+save_carefully([], Bef, Acc) -> {reverse(Acc),Bef};
+save_carefully([V|Vs], Bef, Acc) ->
+ case put_stack_carefully(V, Bef#sr.stk) of
+ error -> {reverse(Acc),Bef};
+ Stk1 ->
+ SrcReg = fetch_reg(V, Bef#sr.reg),
+ Move = {move,SrcReg,fetch_stack(V, Stk1)},
+ {x,_} = SrcReg, %Assertion - must be X register.
+ save_carefully(Vs, Bef#sr{stk=Stk1}, [Move|Acc])
+ end.
+
+x0_vars([], _Fb, _Lf, _Vdb) -> [];
+x0_vars([{var,V}|_], Fb, _Lf, Vdb) ->
+ {V,F,_L} = VFL = vdb_find(V, Vdb),
+ x0_vars1([VFL], Fb, F, Vdb);
+x0_vars([X0|_], Fb, Lf, Vdb) ->
+ x0_vars1([{X0,Lf,Lf}], Fb, Lf, Vdb).
+
+x0_vars1(X0, Fb, Xf, Vdb) ->
+ Vs0 = [VFL || {_V,F,L}=VFL <- Vdb,
+ F >= Fb,
+ L < Xf],
+ Vs1 = keysort(3, Vs0),
+ keysort(2, X0++Vs1).
+
+allocate_x0([], _, Bef) -> {[],Bef#sr{res=[]}};
+allocate_x0([{_,_,L}|Vs], I, Bef) when L =< I ->
+ allocate_x0(Vs, I, Bef);
+allocate_x0([{V,_F,_L}=VFL|Vs], _, Bef) ->
+ {[VFL|Vs],Bef#sr{res=reserve_x0(V, Bef#sr.res)}}.
+
+reserve_x0(V, [_|Res]) -> [{0,V}|Res];
+reserve_x0(V, []) -> [{0,V}].
+
+top_level_block(Keis, Bef, _MaxRegs, St0) when St0#cg.need_frame =:= false,
+ length(Bef#sr.stk) =:= 0 ->
+ %% This block need no stack frame. However, we still need to turn the
+ %% stack frame upside down.
+ MaxY = length(Bef#sr.stk)-1,
+ Keis1 = flatmap(fun (Tuple) when tuple(Tuple) ->
+ [turn_yregs(size(Tuple), Tuple, MaxY)];
+ (Other) ->
+ [Other]
+ end, Keis),
+ {Keis1, Bef, St0#cg{is_top_block=true}};
+top_level_block(Keis, Bef, MaxRegs, St0) ->
+ %% This top block needs an allocate instruction before it, and a
+ %% deallocate instruction before each return.
+ FrameSz = length(Bef#sr.stk),
+ MaxY = FrameSz-1,
+ Keis1 = flatmap(fun ({call_only,Arity,Func}) ->
+ [{call_last,Arity,Func,FrameSz}];
+ ({call_ext_only,Arity,Func}) ->
+ [{call_ext_last,Arity,Func,FrameSz}];
+ ({apply_only,Arity}) ->
+ [{apply_last,Arity,FrameSz}];
+ (return) ->
+ [{deallocate,FrameSz}, return];
+ (Tuple) when tuple(Tuple) ->
+ [turn_yregs(size(Tuple), Tuple, MaxY)];
+ (Other) ->
+ [Other]
+ end, Keis),
+ {[{allocate_zero,FrameSz,MaxRegs}|Keis1], Bef, St0#cg{is_top_block=true}}.
+
+%% turn_yregs(Size, Tuple, MaxY) -> Tuple'
+%% Renumber y register so that {y, 0} becomes {y, FrameSize-1},
+%% {y, FrameSize-1} becomes {y, 0} and so on. This is to make nested
+%% catches work. The code generation algorithm gives a lower register
+%% number to the outer catch, which is wrong.
+
+turn_yregs(0, Tp, _) -> Tp;
+turn_yregs(El, Tp, MaxY) when element(1, element(El, Tp)) == yy ->
+ turn_yregs(El-1, setelement(El, Tp, {y,MaxY-element(2, element(El, Tp))}), MaxY);
+turn_yregs(El, Tp, MaxY) when list(element(El, Tp)) ->
+ New = map(fun ({yy,YY}) -> {y,MaxY-YY};
+ (Other) -> Other end, element(El, Tp)),
+ turn_yregs(El-1, setelement(El, Tp, New), MaxY);
+turn_yregs(El, Tp, MaxY) ->
+ turn_yregs(El-1, Tp, MaxY).
+
+%% select_cg(Sclause, V, TypeFail, ValueFail, StackReg, State) ->
+%% {Is,StackReg,State}.
+%% Selecting type and value needs two failure labels, TypeFail is the
+%% label to jump to of the next type test when this type fails, and
+%% ValueFail is the label when this type is correct but the value is
+%% wrong. These are different as in the second case there is no need
+%% to try the next type, it will always fail.
+
+select_cg(#l{ke={type_clause,cons,[S]}}, {var,V}, Tf, Vf, Bef, St) ->
+ select_cons(S, V, Tf, Vf, Bef, St);
+select_cg(#l{ke={type_clause,nil,[S]}}, {var,V}, Tf, Vf, Bef, St) ->
+ select_nil(S, V, Tf, Vf, Bef, St);
+select_cg(#l{ke={type_clause,binary,[S]}}, {var,V}, Tf, Vf, Bef, St) ->
+ select_binary(S, V, Tf, Vf, Bef, St);
+select_cg(#l{ke={type_clause,bin_seg,S}}, {var,V}, Tf, Vf, Bef, St) ->
+ select_bin_segs(S, V, Tf, Vf, Bef, St);
+select_cg(#l{ke={type_clause,bin_end,[S]}}, {var,V}, Tf, Vf, Bef, St) ->
+ select_bin_end(S, V, Tf, Vf, Bef, St);
+select_cg(#l{ke={type_clause,Type,Scs}}, {var,V}, Tf, Vf, Bef, St0) ->
+ {Vis,{Aft,St1}} =
+ mapfoldl(fun (S, {Int,Sta}) ->
+ {Val,Is,Inta,Stb} = select_val(S, V, Vf, Bef, Sta),
+ {{Is,[Val]},{sr_merge(Int, Inta),Stb}}
+ end, {void,St0}, Scs),
+ OptVls = combine(lists:sort(combine(Vis))),
+ {Vls,Sis,St2} = select_labels(OptVls, St1, [], []),
+ {select_val_cg(Type, fetch_var(V, Bef), Vls, Tf, Vf, Sis), Aft, St2}.
+
+select_val_cg(tuple, R, [Arity,{f,Lbl}], Tf, Vf, [{label,Lbl}|Sis]) ->
+ [{test,is_tuple,{f,Tf},[R]},{test,test_arity,{f,Vf},[R,Arity]}|Sis];
+select_val_cg(tuple, R, Vls, Tf, Vf, Sis) ->
+ [{test,is_tuple,{f,Tf},[R]},{select_tuple_arity,R,{f,Vf},{list,Vls}}|Sis];
+select_val_cg(Type, R, [Val, {f,Lbl}], Fail, Fail, [{label,Lbl}|Sis]) ->
+ [{test,is_eq_exact,{f,Fail},[R,{Type,Val}]}|Sis];
+select_val_cg(Type, R, [Val, {f,Lbl}], Tf, Vf, [{label,Lbl}|Sis]) ->
+ [{test,select_type_test(Type),{f,Tf},[R]},
+ {test,is_eq_exact,{f,Vf},[R,{Type,Val}]}|Sis];
+select_val_cg(Type, R, Vls0, Tf, Vf, Sis) ->
+ Vls1 = map(fun ({f,Lbl}) -> {f,Lbl};
+ (Value) -> {Type,Value}
+ end, Vls0),
+ [{test,select_type_test(Type),{f,Tf},[R]}, {select_val,R,{f,Vf},{list,Vls1}}|Sis].
+
+select_type_test(tuple) -> is_tuple;
+select_type_test(integer) -> is_integer;
+select_type_test(atom) -> is_atom;
+select_type_test(float) -> is_float.
+
+combine([{Is,Vs1}, {Is,Vs2}|Vis]) -> combine([{Is,Vs1 ++ Vs2}|Vis]);
+combine([V|Vis]) -> [V|combine(Vis)];
+combine([]) -> [].
+
+select_labels([{Is,Vs}|Vis], St0, Vls, Sis) ->
+ {Lbl,St1} = new_label(St0),
+ select_labels(Vis, St1, add_vls(Vs, Lbl, Vls), [[{label,Lbl}|Is]|Sis]);
+select_labels([], St, Vls, Sis) ->
+ {Vls,append(Sis),St}.
+
+add_vls([V|Vs], Lbl, Acc) ->
+ add_vls(Vs, Lbl, [V, {f,Lbl}|Acc]);
+add_vls([], _, Acc) -> Acc.
+
+select_cons(#l{ke={val_clause,{cons,Es},B},i=I,vdb=Vdb}, V, Tf, Vf, Bef, St0) ->
+ {Eis,Int,St1} = select_extract_cons(V, Es, I, Vdb, Bef, St0),
+ {Bis,Aft,St2} = match_cg(B, Vf, Int, St1),
+ {[{test,is_nonempty_list,{f,Tf},[fetch_var(V, Bef)]}] ++ Eis ++ Bis,Aft,St2}.
+
+select_nil(#l{ke={val_clause,nil,B}}, V, Tf, Vf, Bef, St0) ->
+ {Bis,Aft,St1} = match_cg(B, Vf, Bef, St0),
+ {[{test,is_nil,{f,Tf},[fetch_var(V, Bef)]}] ++ Bis,Aft,St1}.
+
+select_binary(#l{ke={val_clause,{old_binary,Var},B}}=L,
+ V, Tf, Vf, Bef, St) ->
+ %% Currently handled in the same way as new binaries.
+ select_binary(L#l{ke={val_clause,{binary,Var},B}}, V, Tf, Vf, Bef, St);
+select_binary(#l{ke={val_clause,{binary,{var,Ivar}},B},i=I,vdb=Vdb},
+ V, Tf, Vf, Bef, St0) ->
+ Int0 = clear_dead(Bef, I, Vdb),
+ {Bis,Aft,St1} = match_cg(B, Vf, Int0, St0),
+ {[{test,bs_start_match,{f,Tf},[fetch_var(V, Bef)]},{bs_save,Ivar}|Bis],
+ Aft,St1}.
+
+select_bin_segs(Scs, Ivar, Tf, _Vf, Bef, St) ->
+ match_fmf(fun(S, Fail, Sta) ->
+ select_bin_seg(S, Ivar, Fail, Bef, Sta) end,
+ Tf, St, Scs).
+
+select_bin_seg(#l{ke={val_clause,{bin_seg,Size,U,T,Fs,Es},B},i=I,vdb=Vdb},
+ Ivar, Fail, Bef, St0) ->
+ {Mis,Int,St1} = select_extract_bin(Es, Size, U, T, Fs, Fail,
+ I, Vdb, Bef, St0),
+ {Bis,Aft,St2} = match_cg(B, Fail, Int, St1),
+ {[{bs_restore,Ivar}|Mis] ++ Bis,Aft,St2}.
+
+select_extract_bin([{var,Hd},{var,Tl}], Size0, Unit, Type, Flags, Vf,
+ I, Vdb, Bef, St) ->
+ SizeReg = get_bin_size_reg(Size0, Bef),
+ {Es,Aft} =
+ case vdb_find(Hd, Vdb) of
+ {_,_,Lhd} when Lhd =< I ->
+ {[{test,bs_skip_bits,{f,Vf},[SizeReg,Unit,{field_flags,Flags}]},
+ {bs_save,Tl}],Bef};
+ {_,_,_} ->
+ Reg0 = put_reg(Hd, Bef#sr.reg),
+ Int1 = Bef#sr{reg=Reg0},
+ Rhd = fetch_reg(Hd, Reg0),
+ Name = get_bits_instr(Type),
+ {[{test,Name,{f,Vf},[SizeReg,Unit,{field_flags,Flags},Rhd]},
+ {bs_save,Tl}],Int1}
+ end,
+ {Es,clear_dead(Aft, I, Vdb),St}.
+
+get_bin_size_reg({var,V}, Bef) ->
+ fetch_var(V, Bef);
+get_bin_size_reg(Literal, _Bef) ->
+ Literal.
+
+select_bin_end(#l{ke={val_clause,bin_end,B}},
+ Ivar, Tf, Vf, Bef, St0) ->
+ {Bis,Aft,St2} = match_cg(B, Vf, Bef, St0),
+ {[{bs_restore,Ivar},{test,bs_test_tail,{f,Tf},[0]}|Bis],Aft,St2}.
+
+get_bits_instr(integer) -> bs_get_integer;
+get_bits_instr(float) -> bs_get_float;
+get_bits_instr(binary) -> bs_get_binary.
+
+select_val(#l{ke={val_clause,{tuple,Es},B},i=I,vdb=Vdb}, V, Vf, Bef, St0) ->
+ {Eis,Int,St1} = select_extract_tuple(V, Es, I, Vdb, Bef, St0),
+ {Bis,Aft,St2} = match_cg(B, Vf, Int, St1),
+ {length(Es),Eis ++ Bis,Aft,St2};
+select_val(#l{ke={val_clause,{_,Val},B}}, _V, Vf, Bef, St0) ->
+ {Bis,Aft,St1} = match_cg(B, Vf, Bef, St0),
+ {Val,Bis,Aft,St1}.
+
+%% select_extract_tuple(Src, [V], I, Vdb, StackReg, State) ->
+%% {[E],StackReg,State}.
+%% Extract tuple elements, but only if they do not immediately die.
+
+select_extract_tuple(Src, Vs, I, Vdb, Bef, St) ->
+ F = fun ({var,V}, {Int0,Elem}) ->
+ case vdb_find(V, Vdb) of
+ {V,_,L} when L =< I -> {[], {Int0,Elem+1}};
+ _Other ->
+ Reg1 = put_reg(V, Int0#sr.reg),
+ Int1 = Int0#sr{reg=Reg1},
+ Rsrc = fetch_var(Src, Int1),
+ {[{get_tuple_element,Rsrc,Elem,fetch_reg(V, Reg1)}],
+ {Int1,Elem+1}}
+ end
+ end,
+ {Es,{Aft,_}} = flatmapfoldl(F, {Bef,0}, Vs),
+ {Es,Aft,St}.
+
+select_extract_cons(Src, [{var,Hd}, {var,Tl}], I, Vdb, Bef, St) ->
+ {Es,Aft} = case {vdb_find(Hd, Vdb), vdb_find(Tl, Vdb)} of
+ {{_,_,Lhd}, {_,_,Ltl}} when Lhd =< I, Ltl =< I ->
+ %% Both head and tail are dead. No need to generate
+ %% any instruction.
+ {[], Bef};
+ _ ->
+ %% At least one of head and tail will be used,
+ %% but we must always fetch both. We will call
+ %% clear_dead/2 to allow reuse of the register
+ %% in case only of them is used.
+
+ Reg0 = put_reg(Tl, put_reg(Hd, Bef#sr.reg)),
+ Int0 = Bef#sr{reg=Reg0},
+ Rsrc = fetch_var(Src, Int0),
+ Rhd = fetch_reg(Hd, Reg0),
+ Rtl = fetch_reg(Tl, Reg0),
+ Int1 = clear_dead(Int0, I, Vdb),
+ {[{get_list,Rsrc,Rhd,Rtl}], Int1}
+ end,
+ {Es,Aft,St}.
+
+
+guard_clause_cg(#l{ke={guard_clause,G,B},vdb=Vdb}, Fail, Bef, St0) ->
+ {Gis,Int,St1} = guard_cg(G, Fail, Vdb, Bef, St0),
+ {Bis,Aft,St2} = match_cg(B, Fail, Int, St1),
+ {Gis ++ Bis,Aft,St2}.
+
+%% guard_cg(Guard, Fail, Vdb, StackReg, State) ->
+%% {[Ainstr],StackReg,State}.
+%% A guard is a boolean expression of tests. Tests return true or
+%% false. A fault in a test causes the test to return false. Tests
+%% never return the boolean, instead we generate jump code to go to
+%% the correct exit point. Primops and tests all go to the next
+%% instruction on success or jump to a failure label.
+
+guard_cg(#l{ke={protected,Ts,Rs},i=I,vdb=Pdb}, Fail, _Vdb, Bef, St) ->
+ protected_cg(Ts, Rs, Fail, I, Pdb, Bef, St);
+guard_cg(#l{ke={block,Ts},i=I,vdb=Bdb}, Fail, _Vdb, Bef, St) ->
+ guard_cg_list(Ts, Fail, I, Bdb, Bef, St);
+guard_cg(#l{ke={test,Test,As},i=I,vdb=_Tdb}, Fail, Vdb, Bef, St) ->
+ test_cg(Test, As, Fail, I, Vdb, Bef, St);
+guard_cg(G, _Fail, Vdb, Bef, St) ->
+ %%ok = io:fwrite("cg ~w: ~p~n", [?LINE,{G,Fail,Vdb,Bef}]),
+ {Gis,Aft,St1} = cg(G, Vdb, Bef, St),
+ %%ok = io:fwrite("cg ~w: ~p~n", [?LINE,{Aft}]),
+ {Gis,Aft,St1}.
+
+%% protected_cg([Kexpr], [Ret], Fail, I, Vdb, Bef, St) -> {[Ainstr],Aft,St}.
+%% Do a protected. Protecteds without return values are just done
+%% for effect, the return value is not checked, success passes on to
+%% the next instruction and failure jumps to Fail. If there are
+%% return values then these must be set to 'false' on failure,
+%% control always passes to the next instruction.
+
+protected_cg(Ts, [], Fail, I, Vdb, Bef, St0) ->
+ %% Protect these calls, revert when done.
+ {Tis,Aft,St1} = guard_cg_list(Ts, Fail, I, Vdb, Bef,
+ St0#cg{btype=fail,bfail=Fail}),
+ {Tis,Aft,St1#cg{btype=St0#cg.btype,bfail=St0#cg.bfail}};
+protected_cg(Ts, Rs, _Fail, I, Vdb, Bef, St0) ->
+ {Pfail,St1} = new_label(St0),
+ {Psucc,St2} = new_label(St1),
+ {Tis,Aft,St3} = guard_cg_list(Ts, Pfail, I, Vdb, Bef,
+ St2#cg{btype=fail,bfail=Pfail}),
+ %%ok = io:fwrite("cg ~w: ~p~n", [?LINE,{Rs,I,Vdb,Aft}]),
+ %% Set return values to false.
+ Mis = map(fun ({var,V}) -> {move,{atom,false},fetch_var(V, Aft)} end, Rs),
+ Live = {'%live',max_reg(Aft#sr.reg)},
+ {Tis ++ [Live,{jump,{f,Psucc}},
+ {label,Pfail}] ++ Mis ++ [Live,{label,Psucc}],
+ Aft,St3#cg{btype=St0#cg.btype,bfail=St0#cg.bfail}}.
+
+%% test_cg(TestName, Args, Fail, I, Vdb, Bef, St) -> {[Ainstr],Aft,St}.
+%% Generate test instruction. Use explicit fail label here.
+
+test_cg(Test, As, Fail, I, Vdb, Bef, St) ->
+ case test_type(Test, length(As)) of
+ {cond_op,Op} ->
+ Ars = cg_reg_args(As, Bef),
+ Int = clear_dead(Bef, I, Vdb),
+ {[{test,Op,{f,Fail},Ars}],
+ clear_dead(Int, I, Vdb),
+ St};
+ {rev_cond_op,Op} ->
+ [S1,S2] = cg_reg_args(As, Bef),
+ Int = clear_dead(Bef, I, Vdb),
+ {[{test,Op,{f,Fail},[S2,S1]}],
+ clear_dead(Int, I, Vdb),
+ St}
+ end.
+
+test_type(is_atom, 1) -> {cond_op,is_atom};
+test_type(is_boolean, 1) -> {cond_op,is_boolean};
+test_type(is_binary, 1) -> {cond_op,is_binary};
+test_type(is_constant, 1) -> {cond_op,is_constant};
+test_type(is_float, 1) -> {cond_op,is_float};
+test_type(is_function, 1) -> {cond_op,is_function};
+test_type(is_integer, 1) -> {cond_op,is_integer};
+test_type(is_list, 1) -> {cond_op,is_list};
+test_type(is_number, 1) -> {cond_op,is_number};
+test_type(is_pid, 1) -> {cond_op,is_pid};
+test_type(is_port, 1) -> {cond_op,is_port};
+test_type(is_reference, 1) -> {cond_op,is_reference};
+test_type(is_tuple, 1) -> {cond_op,is_tuple};
+test_type('=<', 2) -> {rev_cond_op,is_ge};
+test_type('>', 2) -> {rev_cond_op,is_lt};
+test_type('<', 2) -> {cond_op,is_lt};
+test_type('>=', 2) -> {cond_op,is_ge};
+test_type('==', 2) -> {cond_op,is_eq};
+test_type('/=', 2) -> {cond_op,is_ne};
+test_type('=:=', 2) -> {cond_op,is_eq_exact};
+test_type('=/=', 2) -> {cond_op,is_ne_exact};
+test_type(internal_is_record, 3) -> {cond_op,internal_is_record}.
+
+%% guard_cg_list([Kexpr], Fail, I, Vdb, StackReg, St) ->
+%% {[Ainstr],StackReg,St}.
+
+guard_cg_list(Kes, Fail, I, Vdb, Bef, St0) ->
+ {Keis,{Aft,St1}} =
+ flatmapfoldl(fun (Ke, {Inta,Sta}) ->
+ {Keis,Intb,Stb} =
+ guard_cg(Ke, Fail, Vdb, Inta, Sta),
+ {comment(Inta) ++ Keis,{Intb,Stb}}
+ end, {Bef,St0}, need_heap(Kes, I)),
+ {Keis,Aft,St1}.
+
+%% match_fmf(Fun, LastFail, State, [Clause]) -> {Is,Aft,State}.
+%% This is a special flatmapfoldl for match code gen where we
+%% generate a "failure" label for each clause. The last clause uses
+%% an externally generated failure label, LastFail. N.B. We do not
+%% know or care how the failure labels are used.
+
+match_fmf(F, LastFail, St, [H]) ->
+ F(H, LastFail, St);
+match_fmf(F, LastFail, St0, [H|T]) ->
+ {Fail,St1} = new_label(St0),
+ {R,Aft1,St2} = F(H, Fail, St1),
+ {Rs,Aft2,St3} = match_fmf(F, LastFail, St2, T),
+ {R ++ [{label,Fail}] ++ Rs,sr_merge(Aft1, Aft2),St3};
+match_fmf(_, _, St, []) -> {[],void,St}.
+
+%% call_cg(Func, [Arg], [Ret], Le, Vdb, StackReg, State) ->
+%% {[Ainstr],StackReg,State}.
+%% enter_cg(Func, [Arg], Le, Vdb, Bef, St) -> {[Ainstr],Aft,St}.
+%% Call and enter first put the arguments into registers and save any
+%% other registers, then clean up and compress the stack and set the
+%% frame size. Finally the actual call is made. Call then needs the
+%% return values filled in.
+
+call_cg({var,V}, As, Rs, Le, Vdb, Bef, St0) ->
+ {Sis,Int} = cg_setup_call(As++[{var,V}], Bef, Le#l.i, Vdb),
+ %% Put return values in registers.
+ Reg = load_vars(Rs, clear_regs(Int#sr.reg)),
+ %% Build complete code and final stack/register state.
+ Arity = length(As),
+ {Frees,Aft} = free_dead(clear_dead(Int#sr{reg=Reg}, Le#l.i, Vdb)),
+ {comment({call_fun,{var,V},As}) ++ Sis ++ Frees ++ [{call_fun,Arity}],
+ Aft,need_stack_frame(St0)};
+call_cg({remote,Mod,Name}, As, Rs, Le, Vdb, Bef, St0)
+ when element(1, Mod) == var;
+ element(1, Name) == var ->
+ {Sis,Int} = cg_setup_call(As++[Mod,Name], Bef, Le#l.i, Vdb),
+ %% Put return values in registers.
+ Reg = load_vars(Rs, clear_regs(Int#sr.reg)),
+ %% Build complete code and final stack/register state.
+ Arity = length(As),
+ Call = {apply,Arity},
+ St = need_stack_frame(St0),
+ %%{Call,St1} = build_call(Func, Arity, St0),
+ {Frees,Aft} = free_dead(clear_dead(Int#sr{reg=Reg}, Le#l.i, Vdb)),
+ {Sis ++ Frees ++ [Call],Aft,St};
+call_cg(Func, As, Rs, Le, Vdb, Bef, St0) ->
+ {Sis,Int} = cg_setup_call(As, Bef, Le#l.i, Vdb),
+ %% Put return values in registers.
+ Reg = load_vars(Rs, clear_regs(Int#sr.reg)),
+ %% Build complete code and final stack/register state.
+ Arity = length(As),
+ {Call,St1} = build_call(Func, Arity, St0),
+ {Frees,Aft} = free_dead(clear_dead(Int#sr{reg=Reg}, Le#l.i, Vdb)),
+ {comment({call,Func,As}) ++ Sis ++ Frees ++ Call,Aft,St1}.
+
+build_call({remote,{atom,erlang},{atom,'!'}}, 2, St0) ->
+ {[send],need_stack_frame(St0)};
+build_call({remote,{atom,Mod},{atom,Name}}, Arity, St0) ->
+ {[{call_ext,Arity,{extfunc,Mod,Name,Arity}}],need_stack_frame(St0)};
+build_call(Name, Arity, St0) when atom(Name) ->
+ {Lbl,St1} = local_func_label(Name, Arity, need_stack_frame(St0)),
+ {[{call,Arity,{f,Lbl}}],St1}.
+
+free_dead(#sr{stk=Stk0}=Aft) ->
+ {Instr,Stk} = free_dead(Stk0, 0, [], []),
+ {Instr,Aft#sr{stk=Stk}}.
+
+free_dead([dead|Stk], Y, Instr, StkAcc) ->
+ %% Note: kill/1 is equivalent to init/1 (translated by beam_asm).
+ %% We use kill/1 to help further optimisation passes.
+ free_dead(Stk, Y+1, [{kill,{yy,Y}}|Instr], [free|StkAcc]);
+free_dead([Any|Stk], Y, Instr, StkAcc) ->
+ free_dead(Stk, Y+1, Instr, [Any|StkAcc]);
+free_dead([], _, Instr, StkAcc) -> {Instr,reverse(StkAcc)}.
+
+enter_cg({var,V}, As, Le, Vdb, Bef, St0) ->
+ {Sis,Int} = cg_setup_call(As++[{var,V}], Bef, Le#l.i, Vdb),
+ %% Build complete code and final stack/register state.
+ Arity = length(As),
+ {comment({call_fun,{var,V},As}) ++ Sis ++ [{call_fun,Arity},return],
+ clear_dead(Int#sr{reg=clear_regs(Int#sr.reg)}, Le#l.i, Vdb),
+ need_stack_frame(St0)};
+enter_cg({remote,Mod,Name}=Func, As, Le, Vdb, Bef, St0)
+ when element(1, Mod) == var;
+ element(1, Name) == var ->
+ {Sis,Int} = cg_setup_call(As++[Mod,Name], Bef, Le#l.i, Vdb),
+ %% Build complete code and final stack/register state.
+ Arity = length(As),
+ Call = {apply_only,Arity},
+ St = need_stack_frame(St0),
+ {comment({enter,Func,As}) ++ Sis ++ [Call],
+ clear_dead(Int#sr{reg=clear_regs(Int#sr.reg)}, Le#l.i, Vdb),
+ St};
+enter_cg(Func, As, Le, Vdb, Bef, St0) ->
+ {Sis,Int} = cg_setup_call(As, Bef, Le#l.i, Vdb),
+ %% Build complete code and final stack/register state.
+ Arity = length(As),
+ {Call,St1} = build_enter(Func, Arity, St0),
+ {comment({enter,Func,As}) ++ Sis ++ Call,
+ clear_dead(Int#sr{reg=clear_regs(Int#sr.reg)}, Le#l.i, Vdb),
+ St1}.
+
+build_enter({remote,{atom,erlang},{atom,'!'}}, 2, St0) ->
+ {[send,return],need_stack_frame(St0)};
+build_enter({remote,{atom,Mod},{atom,Name}}, Arity, St0) ->
+ St1 = case trap_bif(Mod, Name, Arity) of
+ true -> need_stack_frame(St0);
+ false -> St0
+ end,
+ {[{call_ext_only,Arity,{extfunc,Mod,Name,Arity}}],St1};
+build_enter(Name, Arity, St0) when is_atom(Name) ->
+ {Lbl,St1} = local_func_label(Name, Arity, St0),
+ {[{call_only,Arity,{f,Lbl}}],St1}.
+
+%% local_func_label(Name, Arity, State) -> {Label,State'}
+%% Get the function entry label for a local function.
+
+local_func_label(Name, Arity, St0) ->
+ Key = {Name,Arity},
+ case keysearch(Key, 1, St0#cg.functable) of
+ {value,{Key,Label}} ->
+ {Label,St0};
+ false ->
+ {Label,St1} = new_label(St0),
+ {Label,St1#cg{functable=[{Key,Label}|St1#cg.functable]}}
+ end.
+
+%% need_stack_frame(State) -> State'
+%% Make a note in the state that this function will need a stack frame.
+
+need_stack_frame(#cg{need_frame=true}=St) -> St;
+need_stack_frame(St) -> St#cg{need_frame=true}.
+
+%% trap_bif(Mod, Name, Arity) -> true|false
+%% Trap bifs that need a stack frame.
+
+trap_bif(erlang, '!', 2) -> true;
+trap_bif(erlang, link, 1) -> true;
+trap_bif(erlang, unlink, 1) -> true;
+trap_bif(erlang, monitor_node, 2) -> true;
+trap_bif(erlang, group_leader, 2) -> true;
+trap_bif(erlang, exit, 2) -> true;
+trap_bif(_, _, _) -> false.
+
+%% bif_cg(Bif, [Arg], [Ret], Le, Vdb, StackReg, State) ->
+%% {[Ainstr],StackReg,State}.
+
+bif_cg(dsetelement, [Index0,Tuple0,New0], _Rs, Le, Vdb, Bef, St0) ->
+ [New,Tuple,{integer,Index1}] = cg_reg_args([New0,Tuple0,Index0], Bef),
+ Index = Index1-1,
+ {[{set_tuple_element,New,Tuple,Index}],
+ clear_dead(Bef, Le#l.i, Vdb), St0};
+bif_cg({make_fun,Func,Arity,Index,Uniq}, As, Rs, Le, Vdb, Bef, St0) ->
+ %% This behaves more like a function call.
+ {Sis,Int} = cg_setup_call(As, Bef, Le#l.i, Vdb),
+ Reg = load_vars(Rs, clear_regs(Int#sr.reg)),
+ {FuncLbl,St1} = local_func_label(Func, Arity, St0),
+ MakeFun = case St0#cg.new_funs of
+ true -> {make_fun2,{f,FuncLbl},Index,Uniq,length(As)};
+ false -> {make_fun,{f,FuncLbl},Uniq,length(As)}
+ end,
+ {comment({make_fun,{Func,Arity,Uniq},As}) ++ Sis ++
+ [MakeFun],
+ clear_dead(Int#sr{reg=Reg}, Le#l.i, Vdb),
+ St1};
+bif_cg(Bif, As, [{var,V}], Le, Vdb, Bef, St0) ->
+ Ars = cg_reg_args(As, Bef),
+
+ %% If we are inside a catch, we must save everything that will
+ %% be alive after the catch (because the BIF might fail and there
+ %% will be a jump to the code after the catch).
+ %% Currently, we are somewhat pessimistic in
+ %% that we save any variable that will be live after this BIF call.
+
+ {Sis,Int0} =
+ case St0#cg.in_catch of
+ true -> adjust_stack(Bef, Le#l.i, Le#l.i+1, Vdb);
+ false -> {[],Bef}
+ end,
+
+ Int1 = clear_dead(Int0, Le#l.i, Vdb),
+ Reg = put_reg(V, Int1#sr.reg),
+ Int = Int1#sr{reg=Reg},
+ Dst = fetch_reg(V, Reg),
+ {Sis ++ [{bif,Bif,bif_fail(St0#cg.btype, St0#cg.bfail, length(Ars)),Ars,Dst}],
+ clear_dead(Int, Le#l.i, Vdb), St0}.
+
+bif_fail(_, _, 0) -> nofail;
+bif_fail(exit, _, _) -> {f,0};
+bif_fail(fail, Fail, _) -> {f,Fail}.
+
+%% recv_loop_cg(TimeOut, ReceiveVar, ReceiveMatch, TimeOutExprs,
+%% [Ret], Le, Vdb, Bef, St) -> {[Ainstr],Aft,St}.
+
+recv_loop_cg(Te, Rvar, Rm, Tes, Rs, Le, Vdb, Bef, St0) ->
+ {Sis,Int0} = adjust_stack(Bef, Le#l.i, Le#l.i, Vdb),
+ Int1 = Int0#sr{reg=clear_regs(Int0#sr.reg)},
+ %% Get labels.
+ {Rl,St1} = new_label(St0),
+ {Tl,St2} = new_label(St1),
+ {Bl,St3} = new_label(St2),
+ St4 = St3#cg{break=Bl,recv=Rl}, %Set correct receive labels
+ {Ris,Raft,St5} = cg_recv_mesg(Rvar, Rm, Tl, Int1, St4),
+ {Wis,Taft,St6} = cg_recv_wait(Te, Tes, Le#l.i, Int1, St5),
+ Int2 = sr_merge(Raft, Taft), %Merge stack/registers
+ Reg = load_vars(Rs, Int2#sr.reg),
+ {Sis ++ Ris ++ [{label,Tl}] ++ Wis ++ [{label,Bl}],
+ clear_dead(Int2#sr{reg=Reg}, Le#l.i, Vdb),
+ St6#cg{break=St0#cg.break,recv=St0#cg.recv}}.
+
+%% cg_recv_mesg( ) -> {[Ainstr],Aft,St}.
+
+cg_recv_mesg({var,R}, Rm, Tl, Bef, St0) ->
+ Int0 = Bef#sr{reg=put_reg(R, Bef#sr.reg)},
+ Ret = fetch_reg(R, Int0#sr.reg),
+ %% Int1 = clear_dead(Int0, I, Rm#l.vdb),
+ Int1 = Int0,
+ {Mis,Int2,St1} = match_cg(Rm, none, Int1, St0),
+ {[{'%live',0},{label,St1#cg.recv},{loop_rec,{f,Tl},Ret}|Mis],Int2,St1}.
+
+%% cg_recv_wait(Te, Tes, I, Vdb, Int2, St3) -> {[Ainstr],Aft,St}.
+
+cg_recv_wait({atom,infinity}, Tes, I, Bef, St0) ->
+ %% We know that the 'after' body will never be executed.
+ %% But to keep the stack and register information up to date,
+ %% we will generate the code for the 'after' body, and then discard it.
+ Int1 = clear_dead(Bef, I, Tes#l.vdb),
+ {_,Int2,St1} = cg_block(Tes#l.ke, Tes#l.i, Tes#l.vdb,
+ Int1#sr{reg=clear_regs(Int1#sr.reg)}, St0),
+ {[{wait,{f,St1#cg.recv}}],Int2,St1};
+cg_recv_wait({integer,0}, Tes, _I, Bef, St0) ->
+ {Tis,Int,St1} = cg_block(Tes#l.ke, Tes#l.i, Tes#l.vdb, Bef, St0),
+ {[timeout|Tis],Int,St1};
+cg_recv_wait(Te, Tes, I, Bef, St0) ->
+ Reg = cg_reg_arg(Te, Bef),
+ %% Must have empty registers here! Bug if anything in registers.
+ Int0 = clear_dead(Bef, I, Tes#l.vdb),
+ {Tis,Int,St1} = cg_block(Tes#l.ke, Tes#l.i, Tes#l.vdb,
+ Int0#sr{reg=clear_regs(Int0#sr.reg)}, St0),
+ {[{wait_timeout,{f,St1#cg.recv},Reg},timeout] ++ Tis,Int,St1}.
+
+%% recv_next_cg(Le, Vdb, StackReg, St) -> {[Ainstr],StackReg,St}.
+%% Use adjust stack to clear stack, but only need it for Aft.
+
+recv_next_cg(Le, Vdb, Bef, St) ->
+ {Sis,Aft} = adjust_stack(Bef, Le#l.i, Le#l.i+1, Vdb),
+ {[{loop_rec_end,{f,St#cg.recv}}] ++ Sis,Aft,St}. %Joke
+
+%% try_cg(TryBlock, [BodyVar], TryBody, [ExcpVar], TryHandler, [Ret],
+%% Le, Vdb, StackReg, St) -> {[Ainstr],StackReg,St}.
+
+try_cg(Ta, Vs, Tb, Evs, Th, Rs, Le, Vdb, Bef, St0) ->
+ {B,St1} = new_label(St0), %Body label
+ {H,St2} = new_label(St1), %Handler label
+ {E,St3} = new_label(St2), %End label
+ TryTag = Ta#l.i,
+ Int1 = Bef#sr{stk=put_catch(TryTag, Bef#sr.stk)},
+ TryReg = fetch_stack({catch_tag,TryTag}, Int1#sr.stk),
+ {Ais,Int2,St4} = cg(Ta, Vdb, Int1, St3#cg{break=B,in_catch=true}),
+ Int3 = Int2#sr{stk=drop_catch(TryTag, Int2#sr.stk)},
+ St5 = St4#cg{break=E,in_catch=St3#cg.in_catch},
+ {Bis,Baft,St6} = cg(Tb, Vdb, Int3#sr{reg=load_vars(Vs, Int3#sr.reg)}, St5),
+ {His,Haft,St7} = cg(Th, Vdb, Int3#sr{reg=load_vars(Evs, Int3#sr.reg)}, St6),
+ Int4 = sr_merge(Baft, Haft), %Merge stack/registers
+ Aft = Int4#sr{reg=load_vars(Rs, Int4#sr.reg)},
+ {[{'try',TryReg,{f,H}}] ++ Ais ++
+ [{label,B},{try_end,TryReg}] ++ Bis ++
+ [{label,H},{try_case,TryReg}] ++ His ++
+ [{label,E}],
+ clear_dead(Aft, Le#l.i, Vdb),
+ St7#cg{break=St0#cg.break}}.
+
+%% catch_cg(CatchBlock, Ret, Le, Vdb, Bef, St) -> {[Ainstr],Aft,St}.
+
+catch_cg(C, {var,R}, Le, Vdb, Bef, St0) ->
+ {B,St1} = new_label(St0),
+ CatchTag = Le#l.i,
+ Int1 = Bef#sr{stk=put_catch(CatchTag, Bef#sr.stk)},
+ CatchReg = fetch_stack({catch_tag,CatchTag}, Int1#sr.stk),
+ {Cis,Int2,St2} = cg_block(C, Le#l.i, Le#l.vdb, Int1,
+ St1#cg{break=B,in_catch=true}),
+ Aft = Int2#sr{reg=load_reg(R, 0, Int2#sr.reg),
+ stk=drop_catch(CatchTag, Int2#sr.stk)},
+ {[{'catch',CatchReg,{f,B}}] ++ Cis ++
+ [{label,B},{catch_end,CatchReg}],
+ clear_dead(Aft, Le#l.i, Vdb),
+ St2#cg{break=St1#cg.break,in_catch=St1#cg.in_catch}}.
+
+%% set_cg([Var], Constr, Le, Vdb, Bef, St) -> {[Ainstr],Aft,St}.
+%% We have to be careful how a 'set' works. First the structure is
+%% built, then it is filled and finally things can be cleared. The
+%% annotation must reflect this and make sure that the return
+%% variable is allocated first.
+%%
+%% put_list for constructing a cons is an atomic instruction
+%% which can safely resuse one of the source registers as target.
+%% Also binaries can reuse a source register as target.
+
+set_cg([{var,R}], {cons,Es}, Le, Vdb, Bef, St) ->
+ [S1,S2] = map(fun ({var,V}) -> fetch_var(V, Bef);
+ (Other) -> Other
+ end, Es),
+ Int0 = clear_dead(Bef, Le#l.i, Vdb),
+ Int1 = Int0#sr{reg=put_reg(R, Int0#sr.reg)},
+ Ret = fetch_reg(R, Int1#sr.reg),
+ {[{put_list,S1,S2,Ret}], Int1, St};
+set_cg([{var,R}], {old_binary,Segs}, Le, Vdb, Bef, St) ->
+ Fail = bif_fail(St#cg.btype, St#cg.bfail, 42),
+ PutCode = cg_bin_put(Segs, Fail, Bef),
+ Code = cg_binary_old(PutCode),
+ Int0 = clear_dead(Bef, Le#l.i, Vdb),
+ Aft = Int0#sr{reg=put_reg(R, Int0#sr.reg)},
+ Ret = fetch_reg(R, Aft#sr.reg),
+ {Code ++ [{bs_final,Fail,Ret}],Aft,St};
+set_cg([{var,R}], {binary,Segs}, Le, Vdb, Bef, #cg{in_catch=InCatch}=St) ->
+ Int0 = Bef#sr{reg=put_reg(R, Bef#sr.reg)},
+ Target = fetch_reg(R, Int0#sr.reg),
+ Fail = bif_fail(St#cg.btype, St#cg.bfail, 42),
+ Temp = find_scratch_reg(Int0#sr.reg),
+ PutCode = cg_bin_put(Segs, Fail, Bef),
+ {Sis,Int1} =
+ case InCatch of
+ true -> adjust_stack(Int0, Le#l.i, Le#l.i+1, Vdb);
+ false -> {[],Int0}
+ end,
+ Aft = clear_dead(Int1, Le#l.i, Vdb),
+ Code = cg_binary(PutCode, Target, Temp, Fail, Aft),
+ {Sis++Code,Aft,St};
+set_cg([{var,R}], Con, Le, Vdb, Bef, St) ->
+ %% Find a place for the return register first.
+ Int = Bef#sr{reg=put_reg(R, Bef#sr.reg)},
+ Ret = fetch_reg(R, Int#sr.reg),
+ Ais = case Con of
+ {tuple,Es} ->
+ [{put_tuple,length(Es),Ret}] ++ cg_build_args(Es, Bef);
+ {var,V} -> % Normally removed by kernel optimizer.
+ [{move,fetch_var(V, Int),Ret}];
+ {string,Str} ->
+ [{put_string,length(Str),{string,Str},Ret}];
+ Other ->
+ [{move,Other,Ret}]
+ end,
+ {Ais,clear_dead(Int, Le#l.i, Vdb),St};
+set_cg([], {binary,Segs}, Le, Vdb, Bef, St) ->
+ Fail = bif_fail(St#cg.btype, St#cg.bfail, 42),
+ Target = find_scratch_reg(Bef#sr.reg),
+ Temp = find_scratch_reg(put_reg(Target, Bef#sr.reg)),
+ PutCode = cg_bin_put(Segs, Fail, Bef),
+ Code = cg_binary(PutCode, Target, Temp, Fail, Bef),
+ Aft = clear_dead(Bef, Le#l.i, Vdb),
+ {Code,Aft,St};
+set_cg([], {old_binary,Segs}, Le, Vdb, Bef, St) ->
+ Fail = bif_fail(St#cg.btype, St#cg.bfail, 42),
+ PutCode = cg_bin_put(Segs, Fail, Bef),
+ Ais0 = cg_binary_old(PutCode),
+ Ret = find_scratch_reg(Bef#sr.reg),
+ Ais = Ais0 ++ [{bs_final,Fail,Ret}],
+ {Ais,clear_dead(Bef, Le#l.i, Vdb),St};
+set_cg([], _, Le, Vdb, Bef, St) ->
+ %% This should have been stripped by compiler, just cleanup.
+ {[],clear_dead(Bef, Le#l.i, Vdb), St}.
+
+
+%%%
+%%% Code generation for constructing binaries.
+%%%
+
+cg_binary(PutCode, Target, Temp, Fail, Bef) ->
+ SzCode = cg_binary_size(PutCode, Target, Temp, Fail),
+ MaxRegs = max_reg(Bef#sr.reg),
+ Code = SzCode ++ [{bs_init2,Fail,Target,MaxRegs,{field_flags,[]},Target}|PutCode],
+ cg_bin_opt(Code).
+
+cg_binary_size(PutCode, Target, Temp, Fail) ->
+ Szs = cg_binary_size_1(PutCode, 0, []),
+ cg_binary_size_expr(Szs, Target, Temp, Fail).
+
+cg_binary_size_1([{_Put,_Fail,S,U,_Flags,Src}|T], Bits, Acc) ->
+ cg_binary_size_2(S, U, Src, T, Bits, Acc);
+cg_binary_size_1([], Bits, Acc) ->
+ Bytes = Bits div 8,
+ RemBits = Bits rem 8,
+ Res = sort([{1,{integer,RemBits}},{8,{integer,Bytes}}|Acc]),
+ cg_binary_size_3(Res).
+
+cg_binary_size_2({integer,N}, U, _, Next, Bits, Acc) ->
+ cg_binary_size_1(Next, Bits+N*U, Acc);
+cg_binary_size_2({atom,all}, 8, E, Next, Bits, Acc) ->
+ cg_binary_size_1(Next, Bits, [{8,{size,E}}|Acc]);
+cg_binary_size_2(Reg, 1, _, Next, Bits, Acc) ->
+ cg_binary_size_1(Next, Bits, [{1,Reg}|Acc]);
+cg_binary_size_2(Reg, 8, _, Next, Bits, Acc) ->
+ cg_binary_size_1(Next, Bits, [{8,Reg}|Acc]);
+cg_binary_size_2(Reg, U, _, Next, Bits, Acc) ->
+ cg_binary_size_1(Next, Bits, [{1,{'*',Reg,U}}|Acc]).
+
+cg_binary_size_3([{_,{integer,0}}|T]) ->
+ cg_binary_size_3(T);
+cg_binary_size_3([{U,S1},{U,S2}|T]) ->
+ {L0,Rest} = cg_binary_size_4(T, U, []),
+ L = [S1,S2|L0],
+ [{U,L}|cg_binary_size_3(Rest)];
+cg_binary_size_3([{U,S}|T]) ->
+ [{U,[S]}|cg_binary_size_3(T)];
+cg_binary_size_3([]) -> [].
+
+cg_binary_size_4([{U,S}|T], U, Acc) ->
+ cg_binary_size_4(T, U, [S|Acc]);
+cg_binary_size_4(T, _, Acc) ->
+ {Acc,T}.
+
+%% cg_binary_size_expr/4
+%% Generate code for calculating the resulting size of a binary.
+cg_binary_size_expr(Sizes, Target, Temp, Fail) ->
+ cg_binary_size_expr_1(Sizes, Target, Temp, Fail,
+ [{move,{integer,0},Target}]).
+
+cg_binary_size_expr_1([{1,E0}|T], Target, Temp, Fail, Acc) ->
+ E1 = cg_gen_binsize(E0, Target, Temp, Fail, Acc),
+ E = [{bs_bits_to_bytes,Fail,Target,Target}|E1],
+ cg_binary_size_expr_1(T, Target, Temp, Fail, E);
+cg_binary_size_expr_1([{8,E0}], Target, Temp, Fail, Acc) ->
+ E = cg_gen_binsize(E0, Target, Temp, Fail, Acc),
+ reverse(E);
+cg_binary_size_expr_1([], _, _, _, Acc) -> reverse(Acc).
+
+cg_gen_binsize([{'*',A,B}|T], Target, Temp, Fail, Acc) ->
+ cg_gen_binsize(T, Target, Temp, Fail,
+ [{bs_add,Fail,[Target,A,B],Target}|Acc]);
+cg_gen_binsize([{size,B}|T], Target, Temp, Fail, Acc) ->
+ cg_gen_binsize([Temp|T], Target, Temp, Fail,
+ [{bif,size,Fail,[B],Temp}|Acc]);
+cg_gen_binsize([E0|T], Target, Temp, Fail, Acc) ->
+ cg_gen_binsize(T, Target, Temp, Fail,
+ [{bs_add,Fail,[Target,E0,1],Target}|Acc]);
+cg_gen_binsize([], _, _, _, Acc) -> Acc.
+
+%% cg_bin_opt(Code0) -> Code
+%% Optimize the size calculations for binary construction.
+
+cg_bin_opt([{move,{integer,0},D},{bs_add,_,[D,{integer,_}=S,1],Dst}|Is]) ->
+ cg_bin_opt([{move,S,Dst}|Is]);
+cg_bin_opt([{move,{integer,0},D},{bs_add,Fail,[D,S,U],Dst}|Is]) ->
+ cg_bin_opt([{bs_add,Fail,[{integer,0},S,U],Dst}|Is]);
+cg_bin_opt([{move,{integer,Bytes},D},{bs_init2,Fail,D,Regs0,Flags,D}|Is]) ->
+ Regs = cg_bo_newregs(Regs0, D),
+ cg_bin_opt([{bs_init2,Fail,Bytes,Regs,Flags,D}|Is]);
+cg_bin_opt([{move,Src,D},{bs_init2,Fail,D,Regs0,Flags,D}|Is]) ->
+ Regs = cg_bo_newregs(Regs0, D),
+ cg_bin_opt([{bs_init2,Fail,Src,Regs,Flags,D}|Is]);
+cg_bin_opt([{move,Src,Dst},{bs_bits_to_bytes,Fail,Dst,Dst}|Is]) ->
+ cg_bin_opt([{bs_bits_to_bytes,Fail,Src,Dst}|Is]);
+cg_bin_opt([{move,Src1,Dst},{bs_add,Fail,[Dst,Src2,U],Dst}|Is]) ->
+ cg_bin_opt([{bs_add,Fail,[Src1,Src2,U],Dst}|Is]);
+cg_bin_opt([{bs_bits_to_bytes,Fail,{integer,N},_}|Is0]) when N rem 8 =/= 0 ->
+ case Fail of
+ {f,0} ->
+ Is = [{move,{atom,badarg},{x,0}},
+ {call_ext_only,1,{extfunc,erlang,error,1}}|Is0],
+ cg_bin_opt(Is);
+ _ ->
+ cg_bin_opt([{jump,Fail}|Is0])
+ end;
+cg_bin_opt([I|Is]) ->
+ [I|cg_bin_opt(Is)];
+cg_bin_opt([]) -> [].
+
+cg_bo_newregs(R, {x,X}) when R-1 =:= X -> R-1;
+cg_bo_newregs(R, _) -> R.
+
+%% Common for new and old binary code generation.
+
+cg_bin_put({bin_seg,S0,U,T,Fs,[E0,Next]}, Fail, Bef) ->
+ S1 = case S0 of
+ {var,Sv} -> fetch_var(Sv, Bef);
+ _ -> S0
+ end,
+ E1 = case E0 of
+ {var,V} -> fetch_var(V, Bef);
+ Other -> Other
+ end,
+ Op = case T of
+ integer -> bs_put_integer;
+ binary -> bs_put_binary;
+ float -> bs_put_float
+ end,
+ [{Op,Fail,S1,U,{field_flags,Fs},E1}|cg_bin_put(Next, Fail, Bef)];
+cg_bin_put(bin_end, _, _) -> [].
+
+%% Old style.
+
+cg_binary_old(PutCode) ->
+ [cg_bs_init(PutCode)] ++ need_bin_buf(PutCode).
+
+cg_bs_init(Code) ->
+ {Size,Fs} = foldl(fun ({_,_,{integer,N},U,_,_}, {S,Fs}) ->
+ {S + N*U,Fs};
+ (_, {S,_}) ->
+ {S,[]}
+ end, {0,[exact]}, Code),
+ {bs_init,(Size+7) div 8,{field_flags,Fs}}.
+
+need_bin_buf(Code0) ->
+ {Code1,F,H} = foldr(fun ({_,_,{integer,N},U,_,_}=Bs, {Code,F,H}) ->
+ {[Bs|Code],F,H + N*U};
+ ({_,_,_,_,_,_}=Bs, {Code,F,H}) ->
+ {[Bs|need_bin_buf_need(H, F, Code)],true,0}
+ end, {[],false,0}, Code0),
+ need_bin_buf_need(H, F, Code1).
+
+need_bin_buf_need(0, false, Rest) -> Rest;
+need_bin_buf_need(H, _, Rest) -> [{bs_need_buf,H}|Rest].
+
+cg_build_args(As, Bef) ->
+ map(fun ({var,V}) -> {put,fetch_var(V, Bef)};
+ (Other) -> {put,Other}
+ end, As).
+
+%% return_cg([Val], Le, Vdb, Bef, St) -> {[Ainstr],Aft,St}.
+%% break_cg([Val], Le, Vdb, Bef, St) -> {[Ainstr],Aft,St}.
+%% These are very simple, just put return/break values in registers
+%% from 0, then return/break. Use the call setup to clean up stack,
+%% but must clear registers to ensure sr_merge works correctly.
+
+return_cg(Rs, Le, Vdb, Bef, St) ->
+ {Ms,Int} = cg_setup_call(Rs, Bef, Le#l.i, Vdb),
+ {comment({return,Rs}) ++ Ms ++ [return],
+ Int#sr{reg=clear_regs(Int#sr.reg)},St}.
+
+break_cg(Bs, Le, Vdb, Bef, St) ->
+ {Ms,Int} = cg_setup_call(Bs, Bef, Le#l.i, Vdb),
+ {comment({break,Bs}) ++ Ms ++ [{jump,{f,St#cg.break}}],
+ Int#sr{reg=clear_regs(Int#sr.reg)},St}.
+
+%% cg_reg_arg(Arg0, Info) -> Arg
+%% cg_reg_args([Arg0], Info) -> [Arg]
+%% Convert argument[s] into registers. Literal values are returned unchanged.
+
+cg_reg_args(As, Bef) -> [cg_reg_arg(A, Bef) || A <- As].
+
+cg_reg_arg({var,V}, Bef) -> fetch_var(V, Bef);
+cg_reg_arg(Literal, _) -> Literal.
+
+%% cg_setup_call([Arg], Bef, Cur, Vdb) -> {[Instr],Aft}.
+%% Do the complete setup for a call/enter.
+
+cg_setup_call(As, Bef, I, Vdb) ->
+ {Ms,Int0} = cg_call_args(As, Bef, I, Vdb),
+ %% Have set up arguments, can now clean up, compress and save to stack.
+ Int1 = Int0#sr{stk=clear_dead_stk(Int0#sr.stk, I, Vdb),res=[]},
+ {Sis,Int2} = adjust_stack(Int1, I, I+1, Vdb),
+ {Ms ++ Sis ++ [{'%live',length(As)}],Int2}.
+
+%% cg_call_args([Arg], SrState) -> {[Instr],SrState}.
+%% Setup the arguments to a call/enter/bif. Put the arguments into
+%% consecutive registers starting at {x,0} moving any data which
+%% needs to be saved. Return a modified SrState structure with the
+%% new register contents. N.B. the resultant register info will
+%% contain non-variable values when there are non-variable values.
+%%
+%% This routine is complicated by unsaved values in x registers.
+%% We'll move away any unsaved values that are in the registers
+%% to be overwritten by the arguments.
+
+cg_call_args(As, Bef, I, Vdb) ->
+ Regs0 = load_arg_regs(Bef#sr.reg, As),
+ Unsaved = unsaved_registers(Regs0, Bef#sr.stk, I, I+1, Vdb),
+ {UnsavedMoves,Regs} = move_unsaved(Unsaved, Bef#sr.reg, Regs0),
+ Moves0 = gen_moves(As, Bef),
+ Moves = order_moves(Moves0, find_scratch_reg(Regs)),
+ {UnsavedMoves ++ Moves,Bef#sr{reg=Regs}}.
+
+%% load_arg_regs([Reg], Arguments) -> [Reg]
+%% Update the register descriptor to include the arguments (from {x,0}
+%% and upwards). Values in argument register are overwritten.
+%% Values in x registers above the arguments are preserved.
+
+load_arg_regs(Regs, As) -> load_arg_regs(Regs, As, 0).
+
+load_arg_regs([_|Rs], [{var,V}|As], I) -> [{I,V}|load_arg_regs(Rs, As, I+1)];
+load_arg_regs([_|Rs], [A|As], I) -> [{I,A}|load_arg_regs(Rs, As, I+1)];
+load_arg_regs([], [{var,V}|As], I) -> [{I,V}|load_arg_regs([], As, I+1)];
+load_arg_regs([], [A|As], I) -> [{I,A}|load_arg_regs([], As, I+1)];
+load_arg_regs(Rs, [], _) -> Rs.
+
+%% Returns the variables must be saved and are currently in the
+%% x registers that are about to be overwritten by the arguments.
+
+unsaved_registers(Regs, Stk, Fb, Lf, Vdb) ->
+ [V || {V,F,L} <- Vdb,
+ F < Fb,
+ L >= Lf,
+ not on_stack(V, Stk),
+ not in_reg(V, Regs)].
+
+in_reg(V, Regs) -> keymember(V, 2, Regs).
+
+%% Move away unsaved variables from the registers that are to be
+%% overwritten by the arguments.
+move_unsaved(Vs, OrigRegs, NewRegs) ->
+ move_unsaved(Vs, OrigRegs, NewRegs, []).
+
+move_unsaved([V|Vs], OrigRegs, NewRegs0, Acc) ->
+ NewRegs = put_reg(V, NewRegs0),
+ Src = fetch_reg(V, OrigRegs),
+ Dst = fetch_reg(V, NewRegs),
+ move_unsaved(Vs, OrigRegs, NewRegs, [{move,Src,Dst}|Acc]);
+move_unsaved([], _, Regs, Acc) -> {Acc,Regs}.
+
+%% gen_moves(As, Sr)
+%% Generate the basic move instruction to move the arguments
+%% to their proper registers. The list will be sorted on
+%% destinations. (I.e. the move to {x,0} will be first --
+%% see the comment to order_moves/2.)
+
+gen_moves(As, Sr) -> gen_moves(As, Sr, 0, []).
+
+gen_moves([{var,V}|As], Sr, I, Acc) ->
+ case fetch_var(V, Sr) of
+ {x,I} -> gen_moves(As, Sr, I+1, Acc);
+ Reg -> gen_moves(As, Sr, I+1, [{move,Reg,{x,I}}|Acc])
+ end;
+gen_moves([A|As], Sr, I, Acc) ->
+ gen_moves(As, Sr, I+1, [{move,A,{x,I}}|Acc]);
+gen_moves([], _, _, Acc) -> lists:keysort(3, Acc).
+
+%% order_moves([Move], ScratchReg) -> [Move]
+%% Orders move instruction so that source registers are not
+%% destroyed before they are used. If there are cycles
+%% (such as {move,{x,0},{x,1}}, {move,{x,1},{x,1}}),
+%% the scratch register is used to break up the cycle.
+%% If possible, the first move of the input list is placed
+%% last in the result list (to make the move to {x,0} occur
+%% just before the call to allow the Beam loader to coalesce
+%% the instructions).
+
+order_moves(Ms, Scr) -> order_moves(Ms, Scr, []).
+
+order_moves([{move,_,_}=M|Ms0], ScrReg, Acc0) ->
+ {Chain,Ms} = collect_chain(Ms0, [M], ScrReg),
+ Acc = reverse(Chain, Acc0),
+ order_moves(Ms, ScrReg, Acc);
+order_moves([], _, Acc) -> Acc.
+
+collect_chain(Ms, Path, ScrReg) ->
+ collect_chain(Ms, Path, [], ScrReg).
+
+collect_chain([{move,Src,Same}=M|Ms0], [{move,Same,_}|_]=Path, Others, ScrReg) ->
+ case keysearch(Src, 3, Path) of
+ {value,_} -> %We have a cycle.
+ {break_up_cycle(M, Path, ScrReg),reverse(Others, Ms0)};
+ false ->
+ collect_chain(reverse(Others, Ms0), [M|Path], [], ScrReg)
+ end;
+collect_chain([M|Ms], Path, Others, ScrReg) ->
+ collect_chain(Ms, Path, [M|Others], ScrReg);
+collect_chain([], Path, Others, _) ->
+ {Path,Others}.
+
+break_up_cycle({move,Src,_}=M, Path, ScrReg) ->
+ [{move,ScrReg,Src},M|break_up_cycle1(Src, Path, ScrReg)].
+
+break_up_cycle1(Dst, [{move,Src,Dst}|Path], ScrReg) ->
+ [{move,Src,ScrReg}|Path];
+break_up_cycle1(Dst, [M|Path], LastMove) ->
+ [M|break_up_cycle1(Dst, Path, LastMove)].
+
+%% clear_dead(Sr, Until, Vdb) -> Aft.
+%% Remove all variables in Sr which have died AT ALL so far.
+
+clear_dead(Sr, Until, Vdb) ->
+ Sr#sr{reg=clear_dead_reg(Sr, Until, Vdb),
+ stk=clear_dead_stk(Sr#sr.stk, Until, Vdb)}.
+
+clear_dead_reg(Sr, Until, Vdb) ->
+ Reg = map(fun ({I,V}) ->
+ case vdb_find(V, Vdb) of
+ {V,_,L} when L > Until -> {I,V};
+ _ -> free %Remove anything else
+ end;
+ ({reserved,I,V}) -> {reserved,I,V};
+ (free) -> free
+ end, Sr#sr.reg),
+ reserve(Sr#sr.res, Reg, Sr#sr.stk).
+
+clear_dead_stk(Stk, Until, Vdb) ->
+ map(fun ({V}) ->
+ case vdb_find(V, Vdb) of
+ {V,_,L} when L > Until -> {V};
+ _ -> dead %Remove anything else
+ end;
+ (free) -> free;
+ (dead) -> dead
+ end, Stk).
+
+%% sr_merge(Sr1, Sr2) -> Sr.
+%% Merge two stack/register states keeping the longest of both stack
+%% and register. Perform consistency check on both, elements must be
+%% the same. Allow frame size 'void' to make easy creation of
+%% "empty" frame.
+
+sr_merge(#sr{reg=R1,stk=S1,res=[]}, #sr{reg=R2,stk=S2,res=[]}) ->
+ #sr{reg=longest(R1, R2),stk=longest(S1, S2),res=[]};
+sr_merge(void, S2) -> S2#sr{res=[]};
+sr_merge(S1, void) -> S1#sr{res=[]}.
+
+longest([H|T1], [H|T2]) -> [H|longest(T1, T2)];
+longest([dead|T1], [free|T2]) -> [dead|longest(T1, T2)];
+longest([free|T1], [dead|T2]) -> [dead|longest(T1, T2)];
+longest([dead|T1], []) -> [dead|T1];
+longest([], [dead|T2]) -> [dead|T2];
+longest([free|T1], []) -> [free|T1];
+longest([], [free|T2]) -> [free|T2];
+longest([], []) -> [].
+
+%% adjust_stack(Bef, FirstBefore, LastFrom, Vdb) -> {[Ainstr],Aft}.
+%% Do complete stack adjustment by compressing stack and adding
+%% variables to be saved. Try to optimise ordering on stack by
+%% having reverse order to their lifetimes.
+%%
+%% In Beam, there is a fixed stack frame and no need to do stack compression.
+
+adjust_stack(Bef, Fb, Lf, Vdb) ->
+ Stk0 = Bef#sr.stk,
+ {Stk1,Saves} = save_stack(Stk0, Fb, Lf, Vdb),
+ {saves(Saves, Bef#sr.reg, Stk1),
+ Bef#sr{stk=Stk1}}.
+
+%% save_stack(Stack, FirstBefore, LastFrom, Vdb) -> {[SaveVar],NewStack}.
+%% Save variables which are used past current point and which are not
+%% already on the stack.
+
+save_stack(Stk0, Fb, Lf, Vdb) ->
+ %% New variables that are in use but not on stack.
+ New = [ {V,F,L} || {V,F,L} <- Vdb,
+ F < Fb,
+ L >= Lf,
+ not on_stack(V, Stk0) ],
+ %% Add new variables that are not just dropped immediately.
+ %% N.B. foldr works backwards from the end!!
+ Saves = [ V || {V,_,_} <- keysort(3, New) ],
+ Stk1 = foldr(fun (V, Stk) -> put_stack(V, Stk) end, Stk0, Saves),
+ {Stk1,Saves}.
+
+%% saves([SaveVar], Reg, Stk) -> [{move,Reg,Stk}].
+%% Generate move instructions to save variables onto stack. The
+%% stack/reg info used is that after the new stack has been made.
+
+saves(Ss, Reg, Stk) ->
+ Res = map(fun (V) ->
+ {move,fetch_reg(V, Reg),fetch_stack(V, Stk)}
+ end, Ss),
+ Res.
+
+%% comment(C) -> ['%'{C}].
+
+%comment(C) -> [{'%',C}].
+comment(_) -> [].
+
+%% fetch_var(VarName, StkReg) -> r{R} | sp{Sp}.
+%% find_var(VarName, StkReg) -> ok{r{R} | sp{Sp}} | error.
+%% Fetch/find a variable in either the registers or on the
+%% stack. Fetch KNOWS it's there.
+
+fetch_var(V, Sr) ->
+ case find_reg(V, Sr#sr.reg) of
+ {ok,R} -> R;
+ error -> fetch_stack(V, Sr#sr.stk)
+ end.
+
+% find_var(V, Sr) ->
+% case find_reg(V, Sr#sr.reg) of
+% {ok,R} -> {ok,R};
+% error ->
+% case find_stack(V, Sr#sr.stk) of
+% {ok,S} -> {ok,S};
+% error -> error
+% end
+% end.
+
+load_vars(Vs, Regs) ->
+ foldl(fun ({var,V}, Rs) -> put_reg(V, Rs) end, Regs, Vs).
+
+%% put_reg(Val, Regs) -> Regs.
+%% load_reg(Val, Reg, Regs) -> Regs.
+%% free_reg(Val, Regs) -> Regs.
+%% find_reg(Val, Regs) -> ok{r{R}} | error.
+%% fetch_reg(Val, Regs) -> r{R}.
+%% Functions to interface the registers.
+%% put_reg puts a value into a free register,
+%% load_reg loads a value into a fixed register
+%% free_reg frees a register containing a specific value.
+
+% put_regs(Vs, Rs) -> foldl(fun put_reg/2, Rs, Vs).
+
+put_reg(V, Rs) -> put_reg_1(V, Rs, 0).
+
+put_reg_1(V, [free|Rs], I) -> [{I,V}|Rs];
+put_reg_1(V, [{reserved,I,V}|Rs], I) -> [{I,V}|Rs];
+put_reg_1(V, [R|Rs], I) -> [R|put_reg_1(V, Rs, I+1)];
+put_reg_1(V, [], I) -> [{I,V}].
+
+load_reg(V, R, Rs) -> load_reg_1(V, R, Rs, 0).
+
+load_reg_1(V, I, [_|Rs], I) -> [{I,V}|Rs];
+load_reg_1(V, I, [R|Rs], C) -> [R|load_reg_1(V, I, Rs, C+1)];
+load_reg_1(V, I, [], I) -> [{I,V}];
+load_reg_1(V, I, [], C) -> [free|load_reg_1(V, I, [], C+1)].
+
+% free_reg(V, [{I,V}|Rs]) -> [free|Rs];
+% free_reg(V, [R|Rs]) -> [R|free_reg(V, Rs)];
+% free_reg(V, []) -> [].
+
+fetch_reg(V, [{I,V}|_]) -> {x,I};
+fetch_reg(V, [_|SRs]) -> fetch_reg(V, SRs).
+
+find_reg(V, [{I,V}|_]) -> {ok,{x,I}};
+find_reg(V, [_|SRs]) -> find_reg(V, SRs);
+find_reg(_, []) -> error.
+
+%% For the bit syntax, we need a scratch register if we are constructing
+%% a binary that will not be used.
+
+find_scratch_reg(Rs) -> find_scratch_reg(Rs, 0).
+
+find_scratch_reg([free|_], I) -> {x,I};
+find_scratch_reg([_|Rs], I) -> find_scratch_reg(Rs, I+1);
+find_scratch_reg([], I) -> {x,I}.
+
+%%copy_reg(Val, R, Regs) -> load_reg(Val, R, Regs).
+%%move_reg(Val, R, Regs) -> load_reg(Val, R, free_reg(Val, Regs)).
+
+%%clear_regs(Regs) -> map(fun (R) -> free end, Regs).
+clear_regs(_) -> [].
+
+max_reg(Regs) ->
+ foldl(fun ({I,_}, _) -> I;
+ (_, Max) -> Max end,
+ -1, Regs) + 1.
+
+%% put_stack(Val, [{Val}]) -> [{Val}].
+%% fetch_stack(Var, Stk) -> sp{S}.
+%% find_stack(Var, Stk) -> ok{sp{S}} | error.
+%% Functions to interface the stack.
+
+put_stack(Val, []) -> [{Val}];
+put_stack(Val, [dead|Stk]) -> [{Val}|Stk];
+put_stack(Val, [free|Stk]) -> [{Val}|Stk];
+put_stack(Val, [NotFree|Stk]) -> [NotFree|put_stack(Val, Stk)].
+
+put_stack_carefully(Val, Stk0) ->
+ case catch put_stack_carefully1(Val, Stk0) of
+ error -> error;
+ Stk1 when list(Stk1) -> Stk1
+ end.
+
+put_stack_carefully1(_, []) -> throw(error);
+put_stack_carefully1(Val, [dead|Stk]) -> [{Val}|Stk];
+put_stack_carefully1(Val, [free|Stk]) -> [{Val}|Stk];
+put_stack_carefully1(Val, [NotFree|Stk]) ->
+ [NotFree|put_stack_carefully1(Val, Stk)].
+
+fetch_stack(Var, Stk) -> fetch_stack(Var, Stk, 0).
+
+fetch_stack(V, [{V}|_], I) -> {yy,I};
+fetch_stack(V, [_|Stk], I) -> fetch_stack(V, Stk, I+1).
+
+% find_stack(Var, Stk) -> find_stack(Var, Stk, 0).
+
+% find_stack(V, [{V}|Stk], I) -> {ok,{yy,I}};
+% find_stack(V, [O|Stk], I) -> find_stack(V, Stk, I+1);
+% find_stack(V, [], I) -> error.
+
+on_stack(V, Stk) -> keymember(V, 1, Stk).
+
+%% put_catch(CatchTag, Stack) -> Stack'
+%% drop_catch(CatchTag, Stack) -> Stack'
+%% Special interface for putting and removing catch tags, to ensure that
+%% catches nest properly. Also used for try tags.
+
+put_catch(Tag, Stk0) -> put_catch(Tag, reverse(Stk0), []).
+
+put_catch(Tag, [], Stk) ->
+ put_stack({catch_tag,Tag}, Stk);
+put_catch(Tag, [{{catch_tag,_}}|_]=RevStk, Stk) ->
+ reverse(RevStk, put_stack({catch_tag,Tag}, Stk));
+put_catch(Tag, [Other|Stk], Acc) ->
+ put_catch(Tag, Stk, [Other|Acc]).
+
+drop_catch(Tag, [{{catch_tag,Tag}}|Stk]) -> [free|Stk];
+drop_catch(Tag, [Other|Stk]) -> [Other|drop_catch(Tag, Stk)].
+
+%%%
+%%% Finish the code generation for the bit syntax matching.
+%%%
+
+bs_function({function,Name,Arity,CLabel,Asm0}=Func) ->
+ case bs_needed(Asm0, 0, false, []) of
+ {false,[]} -> Func;
+ {true,Dict} ->
+ Asm = bs_replace(Asm0, Dict, []),
+ {function,Name,Arity,CLabel,Asm}
+ end.
+
+%%%
+%%% Pass 1: Found out which bs_restore's that are needed. For now we assume
+%%% that a bs_restore is needed unless it is directly preceeded by a bs_save.
+%%%
+
+bs_needed([{bs_save,Name},{bs_restore,Name}|T], N, _BsUsed, Dict) ->
+ bs_needed(T, N, true, Dict);
+bs_needed([{bs_save,_Name}|T], N, _BsUsed, Dict) ->
+ bs_needed(T, N, true, Dict);
+bs_needed([{bs_restore,Name}|T], N, _BsUsed, Dict) ->
+ case keysearch(Name, 1, Dict) of
+ {value,{Name,_}} -> bs_needed(T, N, true, Dict);
+ false -> bs_needed(T, N+1, true, [{Name,N}|Dict])
+ end;
+bs_needed([{bs_init,_,_}|T], N, _, Dict) ->
+ bs_needed(T, N, true, Dict);
+bs_needed([{bs_init2,_,_,_,_,_}|T], N, _, Dict) ->
+ bs_needed(T, N, true, Dict);
+bs_needed([{bs_start_match,_,_}|T], N, _, Dict) ->
+ bs_needed(T, N, true, Dict);
+bs_needed([_|T], N, BsUsed, Dict) ->
+ bs_needed(T, N, BsUsed, Dict);
+bs_needed([], _, BsUsed, Dict) -> {BsUsed,Dict}.
+
+%%%
+%%% Pass 2: Only needed if there were some bs_* instructions found.
+%%%
+%%% Remove any bs_save with a name that never were found to be restored
+%%% in the first pass.
+%%%
+
+bs_replace([{bs_save,Name}=Save,{bs_restore,Name}|T], Dict, Acc) ->
+ bs_replace([Save|T], Dict, Acc);
+bs_replace([{bs_save,Name}|T], Dict, Acc) ->
+ case keysearch(Name, 1, Dict) of
+ {value,{Name,N}} ->
+ bs_replace(T, Dict, [{bs_save,N}|Acc]);
+ false ->
+ bs_replace(T, Dict, Acc)
+ end;
+bs_replace([{bs_restore,Name}|T], Dict, Acc) ->
+ case keysearch(Name, 1, Dict) of
+ {value,{Name,N}} ->
+ bs_replace(T, Dict, [{bs_restore,N}|Acc]);
+ false ->
+ bs_replace(T, Dict, Acc)
+ end;
+bs_replace([{bs_init2,Fail,Bytes,Regs,Flags,Dst}|T0], Dict, Acc) ->
+ case bs_find_test_heap(T0) of
+ none ->
+ bs_replace(T0, Dict, [{bs_init2,Fail,Bytes,0,Regs,Flags,Dst}|Acc]);
+ {T,Words} ->
+ bs_replace(T, Dict, [{bs_init2,Fail,Bytes,Words,Regs,Flags,Dst}|Acc])
+ end;
+bs_replace([H|T], Dict, Acc) ->
+ bs_replace(T, Dict, [H|Acc]);
+bs_replace([], _, Acc) -> reverse(Acc).
+
+bs_find_test_heap(Is) ->
+ bs_find_test_heap_1(Is, []).
+
+bs_find_test_heap_1([{bs_put_integer,_,_,_,_,_}=I|Is], Acc) ->
+ bs_find_test_heap_1(Is, [I|Acc]);
+bs_find_test_heap_1([{bs_put_float,_,_,_,_,_}=I|Is], Acc) ->
+ bs_find_test_heap_1(Is, [I|Acc]);
+bs_find_test_heap_1([{bs_put_binary,_,_,_,_,_}=I|Is], Acc) ->
+ bs_find_test_heap_1(Is, [I|Acc]);
+bs_find_test_heap_1([{test_heap,Words,_}|Is], Acc) ->
+ {reverse(Acc, Is),Words};
+bs_find_test_heap_1(_, _) -> none.
+
+%% new_label(St) -> {L,St}.
+
+new_label(St) ->
+ L = St#cg.lcount,
+ {L,St#cg{lcount=L+1}}.
+
+flatmapfoldl(F, Accu0, [Hd|Tail]) ->
+ {R,Accu1} = F(Hd, Accu0),
+ {Rs,Accu2} = flatmapfoldl(F, Accu1, Tail),
+ {R++Rs,Accu2};
+flatmapfoldl(_, Accu, []) -> {[],Accu}.
+
+flatmapfoldr(F, Accu0, [Hd|Tail]) ->
+ {Rs,Accu1} = flatmapfoldr(F, Accu0, Tail),
+ {R,Accu2} = F(Hd, Accu1),
+ {R++Rs,Accu2};
+flatmapfoldr(_, Accu, []) -> {[],Accu}.
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_core.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_core.erl
new file mode 100644
index 0000000000..c96837ab5e
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_core.erl
@@ -0,0 +1,1319 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: v3_core.erl,v 1.1 2008/12/17 09:53:42 mikpe Exp $
+%%
+%% Purpose : Transform normal Erlang to Core Erlang
+
+%% At this stage all preprocessing has been done. All that is left are
+%% "pure" Erlang functions.
+%%
+%% Core transformation is done in three stages:
+%%
+%% 1. Flatten expressions into an internal core form without doing
+%% matching.
+%%
+%% 2. Step "forwards" over the icore code annotating each "top-level"
+%% thing with variable usage. Detect bound variables in matching
+%% and replace with explicit guard test. Annotate "internal-core"
+%% expressions with variables they use and create. Convert matches
+%% to cases when not pure assignments.
+%%
+%% 3. Step "backwards" over icore code using variable usage
+%% annotations to change implicit exported variables to explicit
+%% returns.
+%%
+%% To ensure the evaluation order we ensure that all arguments are
+%% safe. A "safe" is basically a core_lib simple with VERY restricted
+%% binaries.
+%%
+%% We have to be very careful with matches as these create variables.
+%% While we try not to flatten things more than necessary we must make
+%% sure that all matches are at the top level. For this we use the
+%% type "novars" which are non-match expressions. Cases and receives
+%% can also create problems due to exports variables so they are not
+%% "novars" either. I.e. a novars will not export variables.
+%%
+%% Annotations in the #iset, #iletrec, and all other internal records
+%% is kept in a record, #a, not in a list as in proper core. This is
+%% easier and faster and creates no problems as we have complete control
+%% over all annotations.
+%%
+%% On output, the annotation for most Core Erlang terms will contain
+%% the source line number. A few terms will be marked with the atom
+%% atom 'compiler_generated', to indicate that the compiler has generated
+%% them and that no warning should be generated if they are optimized
+%% away.
+%%
+%%
+%% In this translation:
+%%
+%% call ops are safes
+%% call arguments are safes
+%% match arguments are novars
+%% case arguments are novars
+%% receive timeouts are novars
+%% let/set arguments are expressions
+%% fun is not a safe
+
+-module(v3_core).
+
+-export([module/2,format_error/1]).
+
+-import(lists, [map/2,foldl/3,foldr/3,mapfoldl/3,splitwith/2]).
+-import(ordsets, [add_element/2,del_element/2,is_element/2,
+ union/1,union/2,intersection/2,subtract/2]).
+
+-include("core_parse.hrl").
+
+-record(a, {us=[],ns=[],anno=[]}). %Internal annotation
+
+%% Internal core expressions and help functions.
+%% N.B. annotations fields in place as normal Core expressions.
+
+-record(iset, {anno=#a{},var,arg}).
+-record(iletrec, {anno=#a{},defs,body}).
+-record(imatch, {anno=#a{},pat,guard=[],arg,fc}).
+-record(icase, {anno=#a{},args,clauses,fc}).
+-record(iclause, {anno=#a{},pats,pguard=[],guard,body}).
+-record(ifun, {anno=#a{},id,vars,clauses,fc}).
+-record(iapply, {anno=#a{},op,args}).
+-record(icall, {anno=#a{},module,name,args}).
+-record(iprimop, {anno=#a{},name,args}).
+-record(itry, {anno=#a{},args,vars,body,evars,handler}).
+-record(icatch, {anno=#a{},body}).
+-record(ireceive1, {anno=#a{},clauses}).
+-record(ireceive2, {anno=#a{},clauses,timeout,action}).
+-record(iprotect, {anno=#a{},body}).
+-record(ibinary, {anno=#a{},segments}). %Not used in patterns.
+
+-record(core, {vcount=0, %Variable counter
+ fcount=0, %Function counter
+ ws=[]}). %Warnings.
+
+module({Mod,Exp,Forms}, _Opts) ->
+ Cexp = map(fun ({N,A}) -> #c_fname{id=N,arity=A} end, Exp),
+ {Kfs,As,Ws} = foldr(fun form/2, {[],[],[]}, Forms),
+ {ok,#c_module{name=#c_atom{val=Mod},exports=Cexp,attrs=As,defs=Kfs},Ws}.
+
+form({function,_,_,_,_}=F0, {Fs,As,Ws0}) ->
+ {F,Ws} = function(F0, Ws0),
+ {[F|Fs],As,Ws};
+form({attribute,_,_,_}=F, {Fs,As,Ws}) ->
+ {Fs,[attribute(F)|As],Ws}.
+
+attribute({attribute,_,Name,Val}) ->
+ #c_def{name=core_lib:make_literal(Name),
+ val=core_lib:make_literal(Val)}.
+
+function({function,_,Name,Arity,Cs0}, Ws0) ->
+ %%ok = io:fwrite("~p - ", [{Name,Arity}]),
+ St0 = #core{vcount=0,ws=Ws0},
+ {B0,St1} = body(Cs0, Arity, St0),
+ %%ok = io:fwrite("1", []),
+ %%ok = io:fwrite("~w:~p~n", [?LINE,B0]),
+ {B1,St2} = ubody(B0, St1),
+ %%ok = io:fwrite("2", []),
+ %%ok = io:fwrite("~w:~p~n", [?LINE,B1]),
+ {B2,#core{ws=Ws}} = cbody(B1, St2),
+ %%ok = io:fwrite("3~n", []),
+ {#c_def{name=#c_fname{id=Name,arity=Arity},val=B2},Ws}.
+
+body(Cs0, Arity, St0) ->
+ Anno = [element(2, hd(Cs0))],
+ {Args,St1} = new_vars(Anno, Arity, St0),
+ {Cs1,St2} = clauses(Cs0, St1),
+ {Ps,St3} = new_vars(Arity, St2), %Need new variables here
+ Fc = fail_clause(Ps, #c_tuple{es=[#c_atom{val=function_clause}|Ps]}),
+ {#ifun{anno=#a{anno=Anno},id=[],vars=Args,clauses=Cs1,fc=Fc},St3}.
+
+%% clause(Clause, State) -> {Cclause,State} | noclause.
+%% clauses([Clause], State) -> {[Cclause],State}.
+%% Convert clauses. Trap bad pattern aliases and remove clause from
+%% clause list.
+
+clauses([C0|Cs0], St0) ->
+ case clause(C0, St0) of
+ {noclause,St} -> clauses(Cs0, St);
+ {C,St1} ->
+ {Cs,St2} = clauses(Cs0, St1),
+ {[C|Cs],St2}
+ end;
+clauses([], St) -> {[],St}.
+
+clause({clause,Lc,H0,G0,B0}, St0) ->
+ case catch head(H0) of
+ {'EXIT',_}=Exit -> exit(Exit); %Propagate error
+ nomatch ->
+ St = add_warning(Lc, nomatch, St0),
+ {noclause,St}; %Bad pattern
+ H1 ->
+ {G1,St1} = guard(G0, St0),
+ {B1,St2} = exprs(B0, St1),
+ {#iclause{anno=#a{anno=[Lc]},pats=H1,guard=G1,body=B1},St2}
+ end.
+
+%% head([P]) -> [P].
+
+head(Ps) -> pattern_list(Ps).
+
+%% guard([Expr], State) -> {[Cexpr],State}.
+%% Build an explict and/or tree of guard alternatives, then traverse
+%% top-level and/or tree and "protect" inner tests.
+
+guard([], St) -> {[],St};
+guard(Gs0, St) ->
+ Gs = foldr(fun (Gt0, Rhs) ->
+ Gt1 = guard_tests(Gt0),
+ L = element(2, Gt1),
+ {op,L,'or',Gt1,Rhs}
+ end, guard_tests(last(Gs0)), first(Gs0)),
+ gexpr_top(Gs, St).
+
+guard_tests([]) -> [];
+guard_tests(Gs) ->
+ L = element(2, hd(Gs)),
+ {protect,L,foldr(fun (G, Rhs) -> {op,L,'and',G,Rhs} end, last(Gs), first(Gs))}.
+
+%% gexpr_top(Expr, State) -> {Cexpr,State}.
+%% Generate an internal core expression of a guard test. Explicitly
+%% handle outer boolean expressions and "protect" inner tests in a
+%% reasonably smart way.
+
+gexpr_top(E0, St0) ->
+ {E1,Eps0,Bools,St1} = gexpr(E0, [], St0),
+ {E,Eps,St} = force_booleans(Bools, E1, Eps0, St1),
+ {Eps++[E],St}.
+
+%% gexpr(Expr, Bools, State) -> {Cexpr,[PreExp],Bools,State}.
+%% Generate an internal core expression of a guard test.
+
+gexpr({protect,Line,Arg}, Bools0, St0) ->
+ case gexpr(Arg, [], St0) of
+ {E0,[],Bools,St1} ->
+ {E,Eps,St} = force_booleans(Bools, E0, [], St1),
+ {E,Eps,Bools0,St};
+ {E0,Eps0,Bools,St1} ->
+ {E,Eps,St} = force_booleans(Bools, E0, Eps0, St1),
+ {#iprotect{anno=#a{anno=[Line]},body=Eps++[E]},[],Bools0,St}
+ end;
+gexpr({op,Line,Op,L,R}=Call, Bools0, St0) ->
+ case erl_internal:bool_op(Op, 2) of
+ true ->
+ {Le,Lps,Bools1,St1} = gexpr(L, Bools0, St0),
+ {Ll,Llps,St2} = force_safe(Le, St1),
+ {Re,Rps,Bools,St3} = gexpr(R, Bools1, St2),
+ {Rl,Rlps,St4} = force_safe(Re, St3),
+ Anno = [Line],
+ {#icall{anno=#a{anno=Anno}, %Must have an #a{}
+ module=#c_atom{anno=Anno,val=erlang},name=#c_atom{anno=Anno,val=Op},
+ args=[Ll,Rl]},Lps ++ Llps ++ Rps ++ Rlps,Bools,St4};
+ false ->
+ gexpr_test(Call, Bools0, St0)
+ end;
+gexpr({op,Line,Op,A}=Call, Bools0, St0) ->
+ case erl_internal:bool_op(Op, 1) of
+ true ->
+ {Ae,Aps,Bools,St1} = gexpr(A, Bools0, St0),
+ {Al,Alps,St2} = force_safe(Ae, St1),
+ Anno = [Line],
+ {#icall{anno=#a{anno=Anno}, %Must have an #a{}
+ module=#c_atom{anno=Anno,val=erlang},name=#c_atom{anno=Anno,val=Op},
+ args=[Al]},Aps ++ Alps,Bools,St2};
+ false ->
+ gexpr_test(Call, Bools0, St0)
+ end;
+gexpr(E0, Bools, St0) ->
+ gexpr_test(E0, Bools, St0).
+
+%% gexpr_test(Expr, Bools, State) -> {Cexpr,[PreExp],Bools,State}.
+%% Generate a guard test. At this stage we must be sure that we have
+%% a proper boolean value here so wrap things with an true test if we
+%% don't know, i.e. if it is not a comparison or a type test.
+
+gexpr_test({atom,L,true}, Bools, St0) ->
+ {#c_atom{anno=[L],val=true},[],Bools,St0};
+gexpr_test({atom,L,false}, Bools, St0) ->
+ {#c_atom{anno=[L],val=false},[],Bools,St0};
+gexpr_test(E0, Bools0, St0) ->
+ {E1,Eps0,St1} = expr(E0, St0),
+ %% Generate "top-level" test and argument calls.
+ case E1 of
+ #icall{anno=Anno,module=#c_atom{val=erlang},name=#c_atom{val=N},args=As} ->
+ Ar = length(As),
+ case erl_internal:type_test(N, Ar) orelse
+ erl_internal:comp_op(N, Ar) orelse
+ (N == internal_is_record andalso Ar == 3) of
+ true -> {E1,Eps0,Bools0,St1};
+ false ->
+ Lanno = Anno#a.anno,
+ {New,St2} = new_var(Lanno, St1),
+ Bools = [New|Bools0],
+ {#icall{anno=Anno, %Must have an #a{}
+ module=#c_atom{anno=Lanno,val=erlang},
+ name=#c_atom{anno=Lanno,val='=:='},
+ args=[New,#c_atom{anno=Lanno,val=true}]},
+ Eps0 ++ [#iset{anno=Anno,var=New,arg=E1}],Bools,St2}
+ end;
+ _ ->
+ Anno = get_ianno(E1),
+ Lanno = get_lineno_anno(E1),
+ case core_lib:is_simple(E1) of
+ true ->
+ Bools = [E1|Bools0],
+ {#icall{anno=Anno, %Must have an #a{}
+ module=#c_atom{anno=Lanno,val=erlang},
+ name=#c_atom{anno=Lanno,val='=:='},
+ args=[E1,#c_atom{anno=Lanno,val=true}]},Eps0,Bools,St1};
+ false ->
+ {New,St2} = new_var(Lanno, St1),
+ Bools = [New|Bools0],
+ {#icall{anno=Anno, %Must have an #a{}
+ module=#c_atom{anno=Lanno,val=erlang},
+ name=#c_atom{anno=Lanno,val='=:='},
+ args=[New,#c_atom{anno=Lanno,val=true}]},
+ Eps0 ++ [#iset{anno=Anno,var=New,arg=E1}],Bools,St2}
+ end
+ end.
+
+force_booleans([], E, Eps, St) ->
+ {E,Eps,St};
+force_booleans([V|Vs], E0, Eps0, St0) ->
+ {E1,Eps1,St1} = force_safe(E0, St0),
+ Lanno = element(2, V),
+ Anno = #a{anno=Lanno},
+ Call = #icall{anno=Anno,module=#c_atom{anno=Lanno,val=erlang},
+ name=#c_atom{anno=Lanno,val=is_boolean},
+ args=[V]},
+ {New,St} = new_var(Lanno, St1),
+ Iset = #iset{anno=Anno,var=New,arg=Call},
+ Eps = Eps0 ++ Eps1 ++ [Iset],
+ E = #icall{anno=Anno,
+ module=#c_atom{anno=Lanno,val=erlang},name=#c_atom{anno=Lanno,val='and'},
+ args=[E1,New]},
+ force_booleans(Vs, E, Eps, St).
+
+%% exprs([Expr], State) -> {[Cexpr],State}.
+%% Flatten top-level exprs.
+
+exprs([E0|Es0], St0) ->
+ {E1,Eps,St1} = expr(E0, St0),
+ {Es1,St2} = exprs(Es0, St1),
+ {Eps ++ [E1] ++ Es1,St2};
+exprs([], St) -> {[],St}.
+
+%% expr(Expr, State) -> {Cexpr,[PreExp],State}.
+%% Generate an internal core expression.
+
+expr({var,L,V}, St) -> {#c_var{anno=[L],name=V},[],St};
+expr({char,L,C}, St) -> {#c_char{anno=[L],val=C},[],St};
+expr({integer,L,I}, St) -> {#c_int{anno=[L],val=I},[],St};
+expr({float,L,F}, St) -> {#c_float{anno=[L],val=F},[],St};
+expr({atom,L,A}, St) -> {#c_atom{anno=[L],val=A},[],St};
+expr({nil,L}, St) -> {#c_nil{anno=[L]},[],St};
+expr({string,L,S}, St) -> {#c_string{anno=[L],val=S},[],St};
+expr({cons,L,H0,T0}, St0) ->
+ {H1,Hps,St1} = safe(H0, St0),
+ {T1,Tps,St2} = safe(T0, St1),
+ {#c_cons{anno=[L],hd=H1,tl=T1},Hps ++ Tps,St2};
+expr({lc,L,E,Qs}, St) ->
+ lc_tq(L, E, Qs, {nil,L}, St);
+expr({tuple,L,Es0}, St0) ->
+ {Es1,Eps,St1} = safe_list(Es0, St0),
+ {#c_tuple{anno=[L],es=Es1},Eps,St1};
+expr({bin,L,Es0}, St0) ->
+ {Es1,Eps,St1} = expr_bin(Es0, St0),
+ {#ibinary{anno=#a{anno=[L]},segments=Es1},Eps,St1};
+expr({block,_,Es0}, St0) ->
+ %% Inline the block directly.
+ {Es1,St1} = exprs(first(Es0), St0),
+ {E1,Eps,St2} = expr(last(Es0), St1),
+ {E1,Es1 ++ Eps,St2};
+expr({'if',L,Cs0}, St0) ->
+ {Cs1,St1} = clauses(Cs0, St0),
+ Fc = fail_clause([], #c_atom{val=if_clause}),
+ {#icase{anno=#a{anno=[L]},args=[],clauses=Cs1,fc=Fc},[],St1};
+expr({'case',L,E0,Cs0}, St0) ->
+ {E1,Eps,St1} = novars(E0, St0),
+ {Cs1,St2} = clauses(Cs0, St1),
+ {Fpat,St3} = new_var(St2),
+ Fc = fail_clause([Fpat], #c_tuple{es=[#c_atom{val=case_clause},Fpat]}),
+ {#icase{anno=#a{anno=[L]},args=[E1],clauses=Cs1,fc=Fc},Eps,St3};
+expr({'receive',L,Cs0}, St0) ->
+ {Cs1,St1} = clauses(Cs0, St0),
+ {#ireceive1{anno=#a{anno=[L]},clauses=Cs1}, [], St1};
+expr({'receive',L,Cs0,Te0,Tes0}, St0) ->
+ {Te1,Teps,St1} = novars(Te0, St0),
+ {Tes1,St2} = exprs(Tes0, St1),
+ {Cs1,St3} = clauses(Cs0, St2),
+ {#ireceive2{anno=#a{anno=[L]},
+ clauses=Cs1,timeout=Te1,action=Tes1},Teps,St3};
+expr({'try',L,Es0,[],Ecs,[]}, St0) ->
+ %% 'try ... catch ... end'
+ {Es1,St1} = exprs(Es0, St0),
+ {V,St2} = new_var(St1), %This name should be arbitrary
+ {Evs,Hs,St3} = try_exception(Ecs, St2),
+ {#itry{anno=#a{anno=[L]},args=Es1,vars=[V],body=[V],
+ evars=Evs,handler=Hs},
+ [],St3};
+expr({'try',L,Es0,Cs0,Ecs,[]}, St0) ->
+ %% 'try ... of ... catch ... end'
+ {Es1,St1} = exprs(Es0, St0),
+ {V,St2} = new_var(St1), %This name should be arbitrary
+ {Cs1,St3} = clauses(Cs0, St2),
+ {Fpat,St4} = new_var(St3),
+ Fc = fail_clause([Fpat], #c_tuple{es=[#c_atom{val=try_clause},Fpat]}),
+ {Evs,Hs,St5} = try_exception(Ecs, St4),
+ {#itry{anno=#a{anno=[L]},args=Es1,
+ vars=[V],body=[#icase{anno=#a{},args=[V],clauses=Cs1,fc=Fc}],
+ evars=Evs,handler=Hs},
+ [],St5};
+expr({'try',L,Es0,[],[],As0}, St0) ->
+ %% 'try ... after ... end'
+ {Es1,St1} = exprs(Es0, St0),
+ {As1,St2} = exprs(As0, St1),
+ {Evs,Hs,St3} = try_after(As1,St2),
+ {V,St4} = new_var(St3), % (must not exist in As1)
+ %% TODO: this duplicates the 'after'-code; should lift to function.
+ {#itry{anno=#a{anno=[L]},args=Es1,vars=[V],body=As1++[V],
+ evars=Evs,handler=Hs},
+ [],St4};
+expr({'try',L,Es,Cs,Ecs,As}, St0) ->
+ %% 'try ... [of ...] [catch ...] after ... end'
+ expr({'try',L,[{'try',L,Es,Cs,Ecs,[]}],[],[],As}, St0);
+expr({'catch',L,E0}, St0) ->
+ {E1,Eps,St1} = expr(E0, St0),
+ {#icatch{anno=#a{anno=[L]},body=Eps ++ [E1]},[],St1};
+expr({'fun',L,{function,F,A},{_,_,_}=Id}, St) ->
+ {#c_fname{anno=[L,{id,Id}],id=F,arity=A},[],St};
+expr({'fun',L,{clauses,Cs},Id}, St) ->
+ fun_tq(Id, Cs, L, St);
+expr({call,L0,{remote,_,{atom,_,erlang},{atom,_,is_record}},[_,_,_]=As}, St)
+ when L0 < 0 ->
+ %% Compiler-generated erlang:is_record/3 should be converted to
+ %% erlang:internal_is_record/3.
+ L = -L0,
+ expr({call,L,{remote,L,{atom,L,erlang},{atom,L,internal_is_record}},As}, St);
+expr({call,L,{remote,_,M,F},As0}, St0) ->
+ {[M1,F1|As1],Aps,St1} = safe_list([M,F|As0], St0),
+ {#icall{anno=#a{anno=[L]},module=M1,name=F1,args=As1},Aps,St1};
+expr({call,Lc,{atom,Lf,F},As0}, St0) ->
+ {As1,Aps,St1} = safe_list(As0, St0),
+ Op = #c_fname{anno=[Lf],id=F,arity=length(As1)},
+ {#iapply{anno=#a{anno=[Lc]},op=Op,args=As1},Aps,St1};
+expr({call,L,FunExp,As0}, St0) ->
+ {Fun,Fps,St1} = safe(FunExp, St0),
+ {As1,Aps,St2} = safe_list(As0, St1),
+ {#iapply{anno=#a{anno=[L]},op=Fun,args=As1},Fps ++ Aps,St2};
+expr({match,L,P0,E0}, St0) ->
+ %% First fold matches together to create aliases.
+ {P1,E1} = fold_match(E0, P0),
+ {E2,Eps,St1} = novars(E1, St0),
+ P2 = (catch pattern(P1)),
+ {Fpat,St2} = new_var(St1),
+ Fc = fail_clause([Fpat], #c_tuple{es=[#c_atom{val=badmatch},Fpat]}),
+ case P2 of
+ {'EXIT',_}=Exit -> exit(Exit); %Propagate error
+ nomatch ->
+ St = add_warning(L, nomatch, St2),
+ {#icase{anno=#a{anno=[L]},
+ args=[E2],clauses=[],fc=Fc},Eps,St};
+ _Other ->
+ {#imatch{anno=#a{anno=[L]},pat=P2,arg=E2,fc=Fc},Eps,St2}
+ end;
+expr({op,_,'++',{lc,Llc,E,Qs},L2}, St) ->
+ %% Optimise this here because of the list comprehension algorithm.
+ lc_tq(Llc, E, Qs, L2, St);
+expr({op,L,Op,A0}, St0) ->
+ {A1,Aps,St1} = safe(A0, St0),
+ LineAnno = [L],
+ {#icall{anno=#a{anno=LineAnno}, %Must have an #a{}
+ module=#c_atom{anno=LineAnno,val=erlang},
+ name=#c_atom{anno=LineAnno,val=Op},args=[A1]},Aps,St1};
+expr({op,L,Op,L0,R0}, St0) ->
+ {As,Aps,St1} = safe_list([L0,R0], St0),
+ LineAnno = [L],
+ {#icall{anno=#a{anno=LineAnno}, %Must have an #a{}
+ module=#c_atom{anno=LineAnno,val=erlang},
+ name=#c_atom{anno=LineAnno,val=Op},args=As},Aps,St1}.
+
+%% try_exception([ExcpClause], St) -> {[ExcpVar],Handler,St}.
+
+try_exception(Ecs0, St0) ->
+ %% Note that Tag is not needed for rethrow - it is already in Info.
+ {Evs,St1} = new_vars(3, St0), % Tag, Value, Info
+ {Ecs1,St2} = clauses(Ecs0, St1),
+ [_,Value,Info] = Evs,
+ Ec = #iclause{anno=#a{anno=[compiler_generated]},
+ pats=[#c_tuple{es=Evs}],guard=[#c_atom{val=true}],
+ body=[#iprimop{anno=#a{}, %Must have an #a{}
+ name=#c_atom{val=raise},
+ args=[Info,Value]}]},
+ Hs = [#icase{anno=#a{},args=[#c_tuple{es=Evs}],clauses=Ecs1,fc=Ec}],
+ {Evs,Hs,St2}.
+
+try_after(As, St0) ->
+ %% See above.
+ {Evs,St1} = new_vars(3, St0), % Tag, Value, Info
+ [_,Value,Info] = Evs,
+ B = As ++ [#iprimop{anno=#a{}, %Must have an #a{}
+ name=#c_atom{val=raise},
+ args=[Info,Value]}],
+ Ec = #iclause{anno=#a{anno=[compiler_generated]},
+ pats=[#c_tuple{es=Evs}],guard=[#c_atom{val=true}],
+ body=B},
+ Hs = [#icase{anno=#a{},args=[#c_tuple{es=Evs}],clauses=[],fc=Ec}],
+ {Evs,Hs,St1}.
+
+%% expr_bin([ArgExpr], St) -> {[Arg],[PreExpr],St}.
+%% Flatten the arguments of a bin. Do this straight left to right!
+
+expr_bin(Es, St) ->
+ foldr(fun (E, {Ces,Esp,St0}) ->
+ {Ce,Ep,St1} = bitstr(E, St0),
+ {[Ce|Ces],Ep ++ Esp,St1}
+ end, {[],[],St}, Es).
+
+bitstr({bin_element,_,E0,Size0,[Type,{unit,Unit}|Flags]}, St0) ->
+ {E1,Eps,St1} = safe(E0, St0),
+ {Size1,Eps2,St2} = safe(Size0, St1),
+ {#c_bitstr{val=E1,size=Size1,
+ unit=core_lib:make_literal(Unit),
+ type=core_lib:make_literal(Type),
+ flags=core_lib:make_literal(Flags)},
+ Eps ++ Eps2,St2}.
+
+%% fun_tq(Id, [Clauses], Line, State) -> {Fun,[PreExp],State}.
+
+fun_tq(Id, Cs0, L, St0) ->
+ {Cs1,St1} = clauses(Cs0, St0),
+ Arity = length((hd(Cs1))#iclause.pats),
+ {Args,St2} = new_vars(Arity, St1),
+ {Ps,St3} = new_vars(Arity, St2), %Need new variables here
+ Fc = fail_clause(Ps, #c_tuple{es=[#c_atom{val=function_clause}|Ps]}),
+ Fun = #ifun{anno=#a{anno=[L]},
+ id=[{id,Id}], %We KNOW!
+ vars=Args,clauses=Cs1,fc=Fc},
+ {Fun,[],St3}.
+
+%% lc_tq(Line, Exp, [Qualifier], More, State) -> {LetRec,[PreExp],State}.
+%% This TQ from Simon PJ pp 127-138.
+%% This gets a bit messy as we must transform all directly here. We
+%% recognise guard tests and try to fold them together and join to a
+%% preceding generators, this should give us better and more compact
+%% code.
+%% More could be transformed before calling lc_tq.
+
+lc_tq(Line, E, [{generate,Lg,P,G}|Qs0], More, St0) ->
+ {Gs,Qs1} = splitwith(fun is_guard_test/1, Qs0),
+ {Name,St1} = new_fun_name("lc", St0),
+ {Head,St2} = new_var(St1),
+ {Tname,St3} = new_var_name(St2),
+ LA = [Line],
+ LAnno = #a{anno=LA},
+ Tail = #c_var{anno=LA,name=Tname},
+ {Arg,St4} = new_var(St3),
+ NewMore = {call,Lg,{atom,Lg,Name},[{var,Lg,Tname}]},
+ {Guardc,St5} = lc_guard_tests(Gs, St4), %These are always flat!
+ {Lc,Lps,St6} = lc_tq(Line, E, Qs1, NewMore, St5),
+ {Mc,Mps,St7} = expr(More, St6),
+ {Nc,Nps,St8} = expr(NewMore, St7),
+ case catch pattern(P) of
+ {'EXIT',_}=Exit ->
+ St9 = St8,
+ Pc = nomatch,
+ exit(Exit); %Propagate error
+ nomatch ->
+ St9 = add_warning(Line, nomatch, St8),
+ Pc = nomatch;
+ Pc ->
+ St9 = St8
+ end,
+ {Gc,Gps,St10} = safe(G, St9), %Will be a function argument!
+ Fc = fail_clause([Arg], #c_tuple{anno=LA,
+ es=[#c_atom{val=function_clause},Arg]}),
+ Cs0 = [#iclause{anno=#a{anno=[compiler_generated|LA]},
+ pats=[#c_cons{anno=LA,hd=Head,tl=Tail}],
+ guard=[],
+ body=Nps ++ [Nc]},
+ #iclause{anno=LAnno,
+ pats=[#c_nil{anno=LA}],guard=[],
+ body=Mps ++ [Mc]}],
+ Cs = case Pc of
+ nomatch -> Cs0;
+ _ ->
+ [#iclause{anno=LAnno,
+ pats=[#c_cons{anno=LA,hd=Pc,tl=Tail}],
+ guard=Guardc,
+ body=Lps ++ [Lc]}|Cs0]
+ end,
+ Fun = #ifun{anno=LAnno,id=[],vars=[Arg],clauses=Cs,fc=Fc},
+ {#iletrec{anno=LAnno,defs=[{Name,Fun}],
+ body=Gps ++ [#iapply{anno=LAnno,
+ op=#c_fname{anno=LA,id=Name,arity=1},
+ args=[Gc]}]},
+ [],St10};
+lc_tq(Line, E, [Fil0|Qs0], More, St0) ->
+ %% Special case sequences guard tests.
+ LA = [Line],
+ LAnno = #a{anno=LA},
+ case is_guard_test(Fil0) of
+ true ->
+ {Gs0,Qs1} = splitwith(fun is_guard_test/1, Qs0),
+ {Lc,Lps,St1} = lc_tq(Line, E, Qs1, More, St0),
+ {Mc,Mps,St2} = expr(More, St1),
+ {Gs,St3} = lc_guard_tests([Fil0|Gs0], St2), %These are always flat!
+ {#icase{anno=LAnno,
+ args=[],
+ clauses=[#iclause{anno=LAnno,pats=[],
+ guard=Gs,body=Lps ++ [Lc]}],
+ fc=#iclause{anno=LAnno,pats=[],guard=[],body=Mps ++ [Mc]}},
+ [],St3};
+ false ->
+ {Lc,Lps,St1} = lc_tq(Line, E, Qs0, More, St0),
+ {Mc,Mps,St2} = expr(More, St1),
+ {Fpat,St3} = new_var(St2),
+ Fc = fail_clause([Fpat], #c_tuple{es=[#c_atom{val=case_clause},Fpat]}),
+ %% Do a novars little optimisation here.
+ case Fil0 of
+ {op,_,'not',Fil1} ->
+ {Filc,Fps,St4} = novars(Fil1, St3),
+ {#icase{anno=LAnno,
+ args=[Filc],
+ clauses=[#iclause{anno=LAnno,
+ pats=[#c_atom{anno=LA,val=true}],
+ guard=[],
+ body=Mps ++ [Mc]},
+ #iclause{anno=LAnno,
+ pats=[#c_atom{anno=LA,val=false}],
+ guard=[],
+ body=Lps ++ [Lc]}],
+ fc=Fc},
+ Fps,St4};
+ _Other ->
+ {Filc,Fps,St4} = novars(Fil0, St3),
+ {#icase{anno=LAnno,
+ args=[Filc],
+ clauses=[#iclause{anno=LAnno,
+ pats=[#c_atom{anno=LA,val=true}],
+ guard=[],
+ body=Lps ++ [Lc]},
+ #iclause{anno=LAnno,
+ pats=[#c_atom{anno=LA,val=false}],
+ guard=[],
+ body=Mps ++ [Mc]}],
+ fc=Fc},
+ Fps,St4}
+ end
+ end;
+lc_tq(Line, E, [], More, St) ->
+ expr({cons,Line,E,More}, St).
+
+lc_guard_tests([], St) -> {[],St};
+lc_guard_tests(Gs0, St) ->
+ Gs = guard_tests(Gs0),
+ gexpr_top(Gs, St).
+
+%% is_guard_test(Expression) -> true | false.
+%% Test if a general expression is a guard test. Use erl_lint here
+%% as it now allows sys_pre_expand transformed source.
+
+is_guard_test(E) -> erl_lint:is_guard_test(E).
+
+%% novars(Expr, State) -> {Novars,[PreExpr],State}.
+%% Generate a novars expression, basically a call or a safe. At this
+%% level we do not need to do a deep check.
+
+novars(E0, St0) ->
+ {E1,Eps,St1} = expr(E0, St0),
+ {Se,Sps,St2} = force_novars(E1, St1),
+ {Se,Eps ++ Sps,St2}.
+
+force_novars(#iapply{}=App, St) -> {App,[],St};
+force_novars(#icall{}=Call, St) -> {Call,[],St};
+force_novars(#iprimop{}=Prim, St) -> {Prim,[],St};
+force_novars(#ifun{}=Fun, St) -> {Fun,[],St}; %These are novars too
+force_novars(#ibinary{}=Bin, St) -> {Bin,[],St};
+force_novars(Ce, St) ->
+ force_safe(Ce, St).
+
+%% safe(Expr, State) -> {Safe,[PreExpr],State}.
+%% Generate an internal safe expression. These are simples without
+%% binaries which can fail. At this level we do not need to do a
+%% deep check. Must do special things with matches here.
+
+safe(E0, St0) ->
+ {E1,Eps,St1} = expr(E0, St0),
+ {Se,Sps,St2} = force_safe(E1, St1),
+ {Se,Eps ++ Sps,St2}.
+
+safe_list(Es, St) ->
+ foldr(fun (E, {Ces,Esp,St0}) ->
+ {Ce,Ep,St1} = safe(E, St0),
+ {[Ce|Ces],Ep ++ Esp,St1}
+ end, {[],[],St}, Es).
+
+force_safe(#imatch{anno=Anno,pat=P,arg=E,fc=Fc}, St0) ->
+ {Le,Lps,St1} = force_safe(E, St0),
+ {Le,Lps ++ [#imatch{anno=Anno,pat=P,arg=Le,fc=Fc}],St1};
+force_safe(Ce, St0) ->
+ case is_safe(Ce) of
+ true -> {Ce,[],St0};
+ false ->
+ {V,St1} = new_var(St0),
+ {V,[#iset{var=V,arg=Ce}],St1}
+ end.
+
+is_safe(#c_cons{}) -> true;
+is_safe(#c_tuple{}) -> true;
+is_safe(#c_var{}) -> true;
+is_safe(E) -> core_lib:is_atomic(E).
+
+%%% %% variable(Expr, State) -> {Variable,[PreExpr],State}.
+%%% %% force_variable(Expr, State) -> {Variable,[PreExpr],State}.
+%%% %% Generate a variable.
+
+%%% variable(E0, St0) ->
+%%% {E1,Eps,St1} = expr(E0, St0),
+%%% {V,Vps,St2} = force_variable(E1, St1),
+%%% {V,Eps ++ Vps,St2}.
+
+%%% force_variable(#c_var{}=Var, St) -> {Var,[],St};
+%%% force_variable(Ce, St0) ->
+%%% {V,St1} = new_var(St0),
+%%% {V,[#iset{var=V,arg=Ce}],St1}.
+
+%%% %% atomic(Expr, State) -> {Atomic,[PreExpr],State}.
+%%% %% force_atomic(Expr, State) -> {Atomic,[PreExpr],State}.
+
+%%% atomic(E0, St0) ->
+%%% {E1,Eps,St1} = expr(E0, St0),
+%%% {A,Aps,St2} = force_atomic(E1, St1),
+%%% {A,Eps ++ Aps,St2}.
+
+%%% force_atomic(Ce, St0) ->
+%%% case core_lib:is_atomic(Ce) of
+%%% true -> {Ce,[],St0};
+%%% false ->
+%%% {V,St1} = new_var(St0),
+%%% {V,[#iset{var=V,arg=Ce}],St1}
+%%% end.
+
+%% fold_match(MatchExpr, Pat) -> {MatchPat,Expr}.
+%% Fold nested matches into one match with aliased patterns.
+
+fold_match({match,L,P0,E0}, P) ->
+ {P1,E1} = fold_match(E0, P),
+ {{match,L,P0,P1},E1};
+fold_match(E, P) -> {P,E}.
+
+%% pattern(Pattern) -> CorePat.
+%% Transform a pattern by removing line numbers. We also normalise
+%% aliases in patterns to standard form, {alias,Pat,[Var]}.
+
+pattern({var,L,V}) -> #c_var{anno=[L],name=V};
+pattern({char,L,C}) -> #c_char{anno=[L],val=C};
+pattern({integer,L,I}) -> #c_int{anno=[L],val=I};
+pattern({float,L,F}) -> #c_float{anno=[L],val=F};
+pattern({atom,L,A}) -> #c_atom{anno=[L],val=A};
+pattern({string,L,S}) -> #c_string{anno=[L],val=S};
+pattern({nil,L}) -> #c_nil{anno=[L]};
+pattern({cons,L,H,T}) ->
+ #c_cons{anno=[L],hd=pattern(H),tl=pattern(T)};
+pattern({tuple,L,Ps}) ->
+ #c_tuple{anno=[L],es=pattern_list(Ps)};
+pattern({bin,L,Ps}) ->
+ %% We don't create a #ibinary record here, since there is
+ %% no need to hold any used/new annoations in a pattern.
+ #c_binary{anno=[L],segments=pat_bin(Ps)};
+pattern({match,_,P1,P2}) ->
+ pat_alias(pattern(P1), pattern(P2)).
+
+%% bin_pattern_list([BinElement]) -> [BinSeg].
+
+pat_bin(Ps) -> map(fun pat_segment/1, Ps).
+
+pat_segment({bin_element,_,Term,Size,[Type,{unit,Unit}|Flags]}) ->
+ #c_bitstr{val=pattern(Term),size=pattern(Size),
+ unit=core_lib:make_literal(Unit),
+ type=core_lib:make_literal(Type),
+ flags=core_lib:make_literal(Flags)}.
+
+%% pat_alias(CorePat, CorePat) -> AliasPat.
+%% Normalise aliases. Trap bad aliases by throwing 'nomatch'.
+
+pat_alias(#c_var{name=V1}, P2) -> #c_alias{var=#c_var{name=V1},pat=P2};
+pat_alias(P1, #c_var{name=V2}) -> #c_alias{var=#c_var{name=V2},pat=P1};
+pat_alias(#c_cons{}=Cons, #c_string{anno=A,val=[H|T]}=S) ->
+ pat_alias(Cons, #c_cons{anno=A,hd=#c_char{anno=A,val=H},
+ tl=S#c_string{val=T}});
+pat_alias(#c_string{anno=A,val=[H|T]}=S, #c_cons{}=Cons) ->
+ pat_alias(#c_cons{anno=A,hd=#c_char{anno=A,val=H},
+ tl=S#c_string{val=T}}, Cons);
+pat_alias(#c_nil{}=Nil, #c_string{val=[]}) ->
+ Nil;
+pat_alias(#c_string{val=[]}, #c_nil{}=Nil) ->
+ Nil;
+pat_alias(#c_cons{anno=A,hd=H1,tl=T1}, #c_cons{hd=H2,tl=T2}) ->
+ #c_cons{anno=A,hd=pat_alias(H1, H2),tl=pat_alias(T1, T2)};
+pat_alias(#c_tuple{es=Es1}, #c_tuple{es=Es2}) ->
+ #c_tuple{es=pat_alias_list(Es1, Es2)};
+pat_alias(#c_char{val=C}=Char, #c_int{val=C}) ->
+ Char;
+pat_alias(#c_int{val=C}, #c_char{val=C}=Char) ->
+ Char;
+pat_alias(#c_alias{var=V1,pat=P1},
+ #c_alias{var=V2,pat=P2}) ->
+ if V1 == V2 -> pat_alias(P1, P2);
+ true -> #c_alias{var=V1,pat=#c_alias{var=V2,pat=pat_alias(P1, P2)}}
+ end;
+pat_alias(#c_alias{var=V1,pat=P1}, P2) ->
+ #c_alias{var=V1,pat=pat_alias(P1, P2)};
+pat_alias(P1, #c_alias{var=V2,pat=P2}) ->
+ #c_alias{var=V2,pat=pat_alias(P1, P2)};
+pat_alias(P, P) -> P;
+pat_alias(_, _) -> throw(nomatch).
+
+%% pat_alias_list([A1], [A2]) -> [A].
+
+pat_alias_list([A1|A1s], [A2|A2s]) ->
+ [pat_alias(A1, A2)|pat_alias_list(A1s, A2s)];
+pat_alias_list([], []) -> [];
+pat_alias_list(_, _) -> throw(nomatch).
+
+%% pattern_list([P]) -> [P].
+
+pattern_list(Ps) -> map(fun pattern/1, Ps).
+
+%% first([A]) -> [A].
+%% last([A]) -> A.
+
+first([_]) -> [];
+first([H|T]) -> [H|first(T)].
+
+last([L]) -> L;
+last([_|T]) -> last(T).
+
+%% make_vars([Name]) -> [{Var,Name}].
+
+make_vars(Vs) -> [ #c_var{name=V} || V <- Vs ].
+
+%% new_fun_name(Type, State) -> {FunName,State}.
+
+new_fun_name(Type, #core{fcount=C}=St) ->
+ {list_to_atom(Type ++ "$^" ++ integer_to_list(C)),St#core{fcount=C+1}}.
+
+%% new_var_name(State) -> {VarName,State}.
+
+new_var_name(#core{vcount=C}=St) ->
+ {list_to_atom("cor" ++ integer_to_list(C)),St#core{vcount=C + 1}}.
+
+%% new_var(State) -> {{var,Name},State}.
+%% new_var(LineAnno, State) -> {{var,Name},State}.
+
+new_var(St) ->
+ new_var([], St).
+
+new_var(Anno, St0) ->
+ {New,St} = new_var_name(St0),
+ {#c_var{anno=Anno,name=New},St}.
+
+%% new_vars(Count, State) -> {[Var],State}.
+%% new_vars(Anno, Count, State) -> {[Var],State}.
+%% Make Count new variables.
+
+new_vars(N, St) -> new_vars_1(N, [], St, []).
+new_vars(Anno, N, St) -> new_vars_1(N, Anno, St, []).
+
+new_vars_1(N, Anno, St0, Vs) when N > 0 ->
+ {V,St1} = new_var(Anno, St0),
+ new_vars_1(N-1, Anno, St1, [V|Vs]);
+new_vars_1(0, _, St, Vs) -> {Vs,St}.
+
+fail_clause(Pats, A) ->
+ #iclause{anno=#a{anno=[compiler_generated]},
+ pats=Pats,guard=[],
+ body=[#iprimop{anno=#a{},name=#c_atom{val=match_fail},args=[A]}]}.
+
+ubody(B, St) -> uexpr(B, [], St).
+
+%% uclauses([Lclause], [KnownVar], State) -> {[Lclause],State}.
+
+uclauses(Lcs, Ks, St0) ->
+ mapfoldl(fun (Lc, St) -> uclause(Lc, Ks, St) end, St0, Lcs).
+
+%% uclause(Lclause, [KnownVar], State) -> {Lclause,State}.
+
+uclause(Cl0, Ks, St0) ->
+ {Cl1,_Pvs,Used,New,St1} = uclause(Cl0, Ks, Ks, St0),
+ A0 = get_ianno(Cl1),
+ A = A0#a{us=Used,ns=New},
+ {Cl1#iclause{anno=A},St1}.
+
+uclause(#iclause{anno=Anno,pats=Ps0,guard=G0,body=B0}, Pks, Ks0, St0) ->
+ {Ps1,Pg,Pvs,Pus,St1} = upattern_list(Ps0, Pks, St0),
+ Pu = union(Pus, intersection(Pvs, Ks0)),
+ Pn = subtract(Pvs, Pu),
+ Ks1 = union(Pn, Ks0),
+ {G1,St2} = uguard(Pg, G0, Ks1, St1),
+ Gu = used_in_any(G1),
+ Gn = new_in_any(G1),
+ Ks2 = union(Gn, Ks1),
+ {B1,St3} = uexprs(B0, Ks2, St2),
+ Used = intersection(union([Pu,Gu,used_in_any(B1)]), Ks0),
+ New = union([Pn,Gn,new_in_any(B1)]),
+ {#iclause{anno=Anno,pats=Ps1,guard=G1,body=B1},Pvs,Used,New,St3}.
+
+%% uguard([Test], [Kexpr], [KnownVar], State) -> {[Kexpr],State}.
+%% Build a guard expression list by folding in the equality tests.
+
+uguard([], [], _, St) -> {[],St};
+uguard(Pg, [], Ks, St) ->
+ %% No guard, so fold together equality tests.
+ uguard(first(Pg), [last(Pg)], Ks, St);
+uguard(Pg, Gs0, Ks, St0) ->
+ %% Gs0 must contain at least one element here.
+ {Gs3,St5} = foldr(fun (T, {Gs1,St1}) ->
+ {L,St2} = new_var(St1),
+ {R,St3} = new_var(St2),
+ {[#iset{var=L,arg=T}] ++ first(Gs1) ++
+ [#iset{var=R,arg=last(Gs1)},
+ #icall{anno=#a{}, %Must have an #a{}
+ module=#c_atom{val=erlang},
+ name=#c_atom{val='and'},
+ args=[L,R]}],
+ St3}
+ end, {Gs0,St0}, Pg),
+ %%ok = io:fwrite("core ~w: ~p~n", [?LINE,Gs3]),
+ uexprs(Gs3, Ks, St5).
+
+%% uexprs([Kexpr], [KnownVar], State) -> {[Kexpr],State}.
+
+uexprs([#imatch{anno=A,pat=P0,arg=Arg,fc=Fc}|Les], Ks, St0) ->
+ %% Optimise for simple set of unbound variable.
+ case upattern(P0, Ks, St0) of
+ {#c_var{},[],_Pvs,_Pus,_} ->
+ %% Throw our work away and just set to iset.
+ uexprs([#iset{var=P0,arg=Arg}|Les], Ks, St0);
+ _Other ->
+ %% Throw our work away and set to icase.
+ if
+ Les == [] ->
+ %% Need to explicitly return match "value", make
+ %% safe for efficiency.
+ {La,Lps,St1} = force_safe(Arg, St0),
+ Mc = #iclause{anno=A,pats=[P0],guard=[],body=[La]},
+ uexprs(Lps ++ [#icase{anno=A,
+ args=[La],clauses=[Mc],fc=Fc}], Ks, St1);
+ true ->
+ Mc = #iclause{anno=A,pats=[P0],guard=[],body=Les},
+ uexprs([#icase{anno=A,args=[Arg],
+ clauses=[Mc],fc=Fc}], Ks, St0)
+ end
+ end;
+uexprs([Le0|Les0], Ks, St0) ->
+ {Le1,St1} = uexpr(Le0, Ks, St0),
+ {Les1,St2} = uexprs(Les0, union((core_lib:get_anno(Le1))#a.ns, Ks), St1),
+ {[Le1|Les1],St2};
+uexprs([], _, St) -> {[],St}.
+
+uexpr(#iset{anno=A,var=V,arg=A0}, Ks, St0) ->
+ {A1,St1} = uexpr(A0, Ks, St0),
+ {#iset{anno=A#a{us=del_element(V#c_var.name, (core_lib:get_anno(A1))#a.us),
+ ns=add_element(V#c_var.name, (core_lib:get_anno(A1))#a.ns)},
+ var=V,arg=A1},St1};
+%% imatch done in uexprs.
+uexpr(#iletrec{anno=A,defs=Fs0,body=B0}, Ks, St0) ->
+ %%ok = io:fwrite("~w: ~p~n", [?LINE,{Fs0,B0}]),
+ {Fs1,St1} = mapfoldl(fun ({Name,F0}, St0) ->
+ {F1,St1} = uexpr(F0, Ks, St0),
+ {{Name,F1},St1}
+ end, St0, Fs0),
+ {B1,St2} = uexprs(B0, Ks, St1),
+ Used = used_in_any(map(fun ({_,F}) -> F end, Fs1) ++ B1),
+ {#iletrec{anno=A#a{us=Used,ns=[]},defs=Fs1,body=B1},St2};
+uexpr(#icase{anno=A,args=As0,clauses=Cs0,fc=Fc0}, Ks, St0) ->
+ %% As0 will never generate new variables.
+ {As1,St1} = uexpr_list(As0, Ks, St0),
+ {Cs1,St2} = uclauses(Cs0, Ks, St1),
+ {Fc1,St3} = uclause(Fc0, Ks, St2),
+ Used = union(used_in_any(As1), used_in_any(Cs1)),
+ New = new_in_all(Cs1),
+ {#icase{anno=A#a{us=Used,ns=New},args=As1,clauses=Cs1,fc=Fc1},St3};
+uexpr(#ifun{anno=A,id=Id,vars=As,clauses=Cs0,fc=Fc0}, Ks0, St0) ->
+ Avs = lit_list_vars(As),
+ Ks1 = union(Avs, Ks0),
+ {Cs1,St1} = ufun_clauses(Cs0, Ks1, St0),
+ {Fc1,St2} = ufun_clause(Fc0, Ks1, St1),
+ Used = subtract(intersection(used_in_any(Cs1), Ks0), Avs),
+ {#ifun{anno=A#a{us=Used,ns=[]},id=Id,vars=As,clauses=Cs1,fc=Fc1},St2};
+uexpr(#iapply{anno=A,op=Op,args=As}, _, St) ->
+ Used = union(lit_vars(Op), lit_list_vars(As)),
+ {#iapply{anno=A#a{us=Used},op=Op,args=As},St};
+uexpr(#iprimop{anno=A,name=Name,args=As}, _, St) ->
+ Used = lit_list_vars(As),
+ {#iprimop{anno=A#a{us=Used},name=Name,args=As},St};
+uexpr(#icall{anno=A,module=Mod,name=Name,args=As}, _, St) ->
+ Used = union([lit_vars(Mod),lit_vars(Name),lit_list_vars(As)]),
+ {#icall{anno=A#a{us=Used},module=Mod,name=Name,args=As},St};
+uexpr(#itry{anno=A,args=As0,vars=Vs,body=Bs0,evars=Evs,handler=Hs0}, Ks, St0) ->
+ %% Note that we export only from body and exception.
+ {As1,St1} = uexprs(As0, Ks, St0),
+ {Bs1,St2} = uexprs(Bs0, Ks, St1),
+ {Hs1,St3} = uexprs(Hs0, Ks, St2),
+ Used = intersection(used_in_any(Bs1++Hs1++As1), Ks),
+ New = new_in_all(Bs1++Hs1),
+ {#itry{anno=A#a{us=Used,ns=New},
+ args=As1,vars=Vs,body=Bs1,evars=Evs,handler=Hs1},St3};
+uexpr(#icatch{anno=A,body=Es0}, Ks, St0) ->
+ {Es1,St1} = uexprs(Es0, Ks, St0),
+ {#icatch{anno=A#a{us=used_in_any(Es1)},body=Es1},St1};
+uexpr(#ireceive1{anno=A,clauses=Cs0}, Ks, St0) ->
+ {Cs1,St1} = uclauses(Cs0, Ks, St0),
+ {#ireceive1{anno=A#a{us=used_in_any(Cs1),ns=new_in_all(Cs1)},
+ clauses=Cs1},St1};
+uexpr(#ireceive2{anno=A,clauses=Cs0,timeout=Te0,action=Tes0}, Ks, St0) ->
+ %% Te0 will never generate new variables.
+ {Te1,St1} = uexpr(Te0, Ks, St0),
+ {Cs1,St2} = uclauses(Cs0, Ks, St1),
+ {Tes1,St3} = uexprs(Tes0, Ks, St2),
+ Used = union([used_in_any(Cs1),used_in_any(Tes1),
+ (core_lib:get_anno(Te1))#a.us]),
+ New = case Cs1 of
+ [] -> new_in_any(Tes1);
+ _ -> intersection(new_in_all(Cs1), new_in_any(Tes1))
+ end,
+ {#ireceive2{anno=A#a{us=Used,ns=New},
+ clauses=Cs1,timeout=Te1,action=Tes1},St3};
+uexpr(#iprotect{anno=A,body=Es0}, Ks, St0) ->
+ {Es1,St1} = uexprs(Es0, Ks, St0),
+ Used = used_in_any(Es1),
+ {#iprotect{anno=A#a{us=Used},body=Es1},St1}; %No new variables escape!
+uexpr(#ibinary{anno=A,segments=Ss}, _, St) ->
+ Used = bitstr_vars(Ss),
+ {#ibinary{anno=A#a{us=Used},segments=Ss},St};
+uexpr(Lit, _, St) ->
+ true = core_lib:is_simple(Lit), %Sanity check!
+ Vs = lit_vars(Lit),
+ Anno = core_lib:get_anno(Lit),
+ {core_lib:set_anno(Lit, #a{us=Vs,anno=Anno}),St}.
+
+uexpr_list(Les0, Ks, St0) ->
+ mapfoldl(fun (Le, St) -> uexpr(Le, Ks, St) end, St0, Les0).
+
+%% ufun_clauses([Lclause], [KnownVar], State) -> {[Lclause],State}.
+
+ufun_clauses(Lcs, Ks, St0) ->
+ mapfoldl(fun (Lc, St) -> ufun_clause(Lc, Ks, St) end, St0, Lcs).
+
+%% ufun_clause(Lclause, [KnownVar], State) -> {Lclause,State}.
+
+ufun_clause(Cl0, Ks, St0) ->
+ {Cl1,Pvs,Used,_,St1} = uclause(Cl0, [], Ks, St0),
+ A0 = get_ianno(Cl1),
+ A = A0#a{us=subtract(intersection(Used, Ks), Pvs),ns=[]},
+ {Cl1#iclause{anno=A},St1}.
+
+%% upattern(Pat, [KnownVar], State) ->
+%% {Pat,[GuardTest],[NewVar],[UsedVar],State}.
+
+upattern(#c_var{name='_'}, _, St0) ->
+ {New,St1} = new_var_name(St0),
+ {#c_var{name=New},[],[New],[],St1};
+upattern(#c_var{name=V}=Var, Ks, St0) ->
+ case is_element(V, Ks) of
+ true ->
+ {N,St1} = new_var_name(St0),
+ New = #c_var{name=N},
+ Test = #icall{anno=#a{us=add_element(N, [V])},
+ module=#c_atom{val=erlang},
+ name=#c_atom{val='=:='},
+ args=[New,Var]},
+ %% Test doesn't need protecting.
+ {New,[Test],[N],[],St1};
+ false -> {Var,[],[V],[],St0}
+ end;
+upattern(#c_cons{hd=H0,tl=T0}=Cons, Ks, St0) ->
+ {H1,Hg,Hv,Hu,St1} = upattern(H0, Ks, St0),
+ {T1,Tg,Tv,Tu,St2} = upattern(T0, union(Hv, Ks), St1),
+ {Cons#c_cons{hd=H1,tl=T1},Hg ++ Tg,union(Hv, Tv),union(Hu, Tu),St2};
+upattern(#c_tuple{es=Es0}=Tuple, Ks, St0) ->
+ {Es1,Esg,Esv,Eus,St1} = upattern_list(Es0, Ks, St0),
+ {Tuple#c_tuple{es=Es1},Esg,Esv,Eus,St1};
+upattern(#c_binary{segments=Es0}=Bin, Ks, St0) ->
+ {Es1,Esg,Esv,Eus,St1} = upat_bin(Es0, Ks, St0),
+ {Bin#c_binary{segments=Es1},Esg,Esv,Eus,St1};
+upattern(#c_alias{var=V0,pat=P0}=Alias, Ks, St0) ->
+ {V1,Vg,Vv,Vu,St1} = upattern(V0, Ks, St0),
+ {P1,Pg,Pv,Pu,St2} = upattern(P0, union(Vv, Ks), St1),
+ {Alias#c_alias{var=V1,pat=P1},Vg ++ Pg,union(Vv, Pv),union(Vu, Pu),St2};
+upattern(Other, _, St) -> {Other,[],[],[],St}. %Constants
+
+%% upattern_list([Pat], [KnownVar], State) ->
+%% {[Pat],[GuardTest],[NewVar],[UsedVar],State}.
+
+upattern_list([P0|Ps0], Ks, St0) ->
+ {P1,Pg,Pv,Pu,St1} = upattern(P0, Ks, St0),
+ {Ps1,Psg,Psv,Psu,St2} = upattern_list(Ps0, union(Pv, Ks), St1),
+ {[P1|Ps1],Pg ++ Psg,union(Pv, Psv),union(Pu, Psu),St2};
+upattern_list([], _, St) -> {[],[],[],[],St}.
+
+%% upat_bin([Pat], [KnownVar], State) ->
+%% {[Pat],[GuardTest],[NewVar],[UsedVar],State}.
+upat_bin(Es0, Ks, St0) ->
+ upat_bin(Es0, Ks, [], St0).
+
+%% upat_bin([Pat], [KnownVar], [LocalVar], State) ->
+%% {[Pat],[GuardTest],[NewVar],[UsedVar],State}.
+upat_bin([P0|Ps0], Ks, Bs, St0) ->
+ {P1,Pg,Pv,Pu,Bs1,St1} = upat_element(P0, Ks, Bs, St0),
+ {Ps1,Psg,Psv,Psu,St2} = upat_bin(Ps0, union(Pv, Ks), Bs1, St1),
+ {[P1|Ps1],Pg ++ Psg,union(Pv, Psv),union(Pu, Psu),St2};
+upat_bin([], _, _, St) -> {[],[],[],[],St}.
+
+
+%% upat_element(Segment, [KnownVar], [LocalVar], State) ->
+%% {Segment,[GuardTest],[NewVar],[UsedVar],[LocalVar],State}
+upat_element(#c_bitstr{val=H0,size=Sz}=Seg, Ks, Bs, St0) ->
+ {H1,Hg,Hv,[],St1} = upattern(H0, Ks, St0),
+ Bs1 = case H0 of
+ #c_var{name=Hname} ->
+ case H1 of
+ #c_var{name=Hname} ->
+ Bs;
+ #c_var{name=Other} ->
+ [{Hname, Other}|Bs]
+ end;
+ _ ->
+ Bs
+ end,
+ {Sz1, Us} = case Sz of
+ #c_var{name=Vname} ->
+ rename_bitstr_size(Vname, Bs);
+ _Other -> {Sz, []}
+ end,
+ {Seg#c_bitstr{val=H1, size=Sz1},Hg,Hv,Us,Bs1,St1}.
+
+rename_bitstr_size(V, [{V, N}|_]) ->
+ New = #c_var{name=N},
+ {New, [N]};
+rename_bitstr_size(V, [_|Rest]) ->
+ rename_bitstr_size(V, Rest);
+rename_bitstr_size(V, []) ->
+ Old = #c_var{name=V},
+ {Old, [V]}.
+
+used_in_any(Les) ->
+ foldl(fun (Le, Ns) -> union((core_lib:get_anno(Le))#a.us, Ns) end,
+ [], Les).
+
+new_in_any(Les) ->
+ foldl(fun (Le, Ns) -> union((core_lib:get_anno(Le))#a.ns, Ns) end,
+ [], Les).
+
+new_in_all([Le|Les]) ->
+ foldl(fun (L, Ns) -> intersection((core_lib:get_anno(L))#a.ns, Ns) end,
+ (core_lib:get_anno(Le))#a.ns, Les);
+new_in_all([]) -> [].
+
+%% The AfterVars are the variables which are used afterwards. We need
+%% this to work out which variables are actually exported and used
+%% from case/receive. In subblocks/clauses the AfterVars of the block
+%% are just the exported variables.
+
+cbody(B0, St0) ->
+ {B1,_,_,St1} = cexpr(B0, [], St0),
+ {B1,St1}.
+
+%% cclause(Lclause, [AfterVar], State) -> {Cclause,State}.
+%% The AfterVars are the exported variables.
+
+cclause(#iclause{anno=#a{anno=Anno},pats=Ps,guard=G0,body=B0}, Exp, St0) ->
+ {B1,_Us1,St1} = cexprs(B0, Exp, St0),
+ {G1,St2} = cguard(G0, St1),
+ {#c_clause{anno=Anno,pats=Ps,guard=G1,body=B1},St2}.
+
+cclauses(Lcs, Es, St0) ->
+ mapfoldl(fun (Lc, St) -> cclause(Lc, Es, St) end, St0, Lcs).
+
+cguard([], St) -> {#c_atom{val=true},St};
+cguard(Gs, St0) ->
+ {G,_,St1} = cexprs(Gs, [], St0),
+ {G,St1}.
+
+%% cexprs([Lexpr], [AfterVar], State) -> {Cexpr,[AfterVar],State}.
+%% Must be sneaky here at the last expr when combining exports for the
+%% whole sequence and exports for that expr.
+
+cexprs([#iset{var=#c_var{name=Name}=Var}=Iset], As, St) ->
+ %% Make return value explicit, and make Var true top level.
+ cexprs([Iset,Var#c_var{anno=#a{us=[Name]}}], As, St);
+cexprs([Le], As, St0) ->
+ {Ce,Es,Us,St1} = cexpr(Le, As, St0),
+ Exp = make_vars(As), %The export variables
+ if
+ Es == [] -> {core_lib:make_values([Ce|Exp]),union(Us, As),St1};
+ true ->
+ {R,St2} = new_var(St1),
+ {#c_let{anno=get_lineno_anno(Ce),
+ vars=[R|make_vars(Es)],arg=Ce,
+ body=core_lib:make_values([R|Exp])},
+ union(Us, As),St2}
+ end;
+cexprs([#iset{anno=#a{anno=A},var=V,arg=A0}|Les], As0, St0) ->
+ {Ces,As1,St1} = cexprs(Les, As0, St0),
+ {A1,Es,Us,St2} = cexpr(A0, As1, St1),
+ {#c_let{anno=A,vars=[V|make_vars(Es)],arg=A1,body=Ces},
+ union(Us, As1),St2};
+cexprs([Le|Les], As0, St0) ->
+ {Ces,As1,St1} = cexprs(Les, As0, St0),
+ {Ce,Es,Us,St2} = cexpr(Le, As1, St1),
+ if
+ Es == [] ->
+ {#c_seq{arg=Ce,body=Ces},union(Us, As1),St2};
+ true ->
+ {R,St3} = new_var(St2),
+ {#c_let{vars=[R|make_vars(Es)],arg=Ce,body=Ces},
+ union(Us, As1),St3}
+ end.
+
+%% cexpr(Lexpr, [AfterVar], State) -> {Cexpr,[ExpVar],[UsedVar],State}.
+
+cexpr(#iletrec{anno=A,defs=Fs0,body=B0}, As, St0) ->
+ {Fs1,{_,St1}} = mapfoldl(fun ({Name,F0}, {Used,St0}) ->
+ {F1,[],Us,St1} = cexpr(F0, [], St0),
+ {#c_def{name=#c_fname{id=Name,arity=1},
+ val=F1},
+ {union(Us, Used),St1}}
+ end, {[],St0}, Fs0),
+ Exp = intersection(A#a.ns, As),
+ {B1,_Us,St2} = cexprs(B0, Exp, St1),
+ {#c_letrec{anno=A#a.anno,defs=Fs1,body=B1},Exp,A#a.us,St2};
+cexpr(#icase{anno=A,args=Largs,clauses=Lcs,fc=Lfc}, As, St0) ->
+ Exp = intersection(A#a.ns, As), %Exports
+ {Cargs,St1} = foldr(fun (La, {Cas,Sta}) ->
+ {Ca,[],_Us1,Stb} = cexpr(La, As, Sta),
+ {[Ca|Cas],Stb}
+ end, {[],St0}, Largs),
+ {Ccs,St2} = cclauses(Lcs, Exp, St1),
+ {Cfc,St3} = cclause(Lfc, [], St2), %Never exports
+ {#c_case{anno=A#a.anno,
+ arg=core_lib:make_values(Cargs),clauses=Ccs ++ [Cfc]},
+ Exp,A#a.us,St3};
+cexpr(#ireceive1{anno=A,clauses=Lcs}, As, St0) ->
+ Exp = intersection(A#a.ns, As), %Exports
+ {Ccs,St1} = cclauses(Lcs, Exp, St0),
+ {#c_receive{anno=A#a.anno,
+ clauses=Ccs,
+ timeout=#c_atom{val=infinity},action=#c_atom{val=true}},
+ Exp,A#a.us,St1};
+cexpr(#ireceive2{anno=A,clauses=Lcs,timeout=Lto,action=Les}, As, St0) ->
+ Exp = intersection(A#a.ns, As), %Exports
+ {Cto,[],_Us1,St1} = cexpr(Lto, As, St0),
+ {Ccs,St2} = cclauses(Lcs, Exp, St1),
+ {Ces,_Us2,St3} = cexprs(Les, Exp, St2),
+ {#c_receive{anno=A#a.anno,
+ clauses=Ccs,timeout=Cto,action=Ces},
+ Exp,A#a.us,St3};
+cexpr(#itry{anno=A,args=La,vars=Vs,body=Lb,evars=Evs,handler=Lh}, As, St0) ->
+ Exp = intersection(A#a.ns, As), %Exports
+ {Ca,_Us1,St1} = cexprs(La, [], St0),
+ {Cb,_Us2,St2} = cexprs(Lb, Exp, St1),
+ {Ch,_Us3,St3} = cexprs(Lh, Exp, St2),
+ {#c_try{anno=A#a.anno,arg=Ca,vars=Vs,body=Cb,evars=Evs,handler=Ch},
+ Exp,A#a.us,St3};
+cexpr(#icatch{anno=A,body=Les}, _As, St0) ->
+ {Ces,_Us1,St1} = cexprs(Les, [], St0), %Never export!
+ {#c_catch{body=Ces},[],A#a.us,St1};
+cexpr(#ifun{anno=A,id=Id,vars=Args,clauses=Lcs,fc=Lfc}, _As, St0) ->
+ {Ccs,St1} = cclauses(Lcs, [], St0), %NEVER export!
+ {Cfc,St2} = cclause(Lfc, [], St1),
+ Anno = A#a.anno,
+ {#c_fun{anno=Id++Anno,vars=Args,
+ body=#c_case{anno=Anno,
+ arg=core_lib:set_anno(core_lib:make_values(Args), Anno),
+ clauses=Ccs ++ [Cfc]}},
+ [],A#a.us,St2};
+cexpr(#iapply{anno=A,op=Op,args=Args}, _As, St) ->
+ {#c_apply{anno=A#a.anno,op=Op,args=Args},[],A#a.us,St};
+cexpr(#icall{anno=A,module=Mod,name=Name,args=Args}, _As, St) ->
+ {#c_call{anno=A#a.anno,module=Mod,name=Name,args=Args},[],A#a.us,St};
+cexpr(#iprimop{anno=A,name=Name,args=Args}, _As, St) ->
+ {#c_primop{anno=A#a.anno,name=Name,args=Args},[],A#a.us,St};
+cexpr(#iprotect{anno=A,body=Es}, _As, St0) ->
+ {Ce,_,St1} = cexprs(Es, [], St0),
+ V = #c_var{name='Try'}, %The names are arbitrary
+ Vs = [#c_var{name='T'},#c_var{name='R'}],
+ {#c_try{anno=A#a.anno,arg=Ce,vars=[V],body=V,
+ evars=Vs,handler=#c_atom{val=false}},
+ [],A#a.us,St1};
+cexpr(#ibinary{anno=#a{anno=Anno,us=Us},segments=Segs}, _As, St) ->
+ {#c_binary{anno=Anno,segments=Segs},[],Us,St};
+cexpr(Lit, _As, St) ->
+ true = core_lib:is_simple(Lit), %Sanity check!
+ Anno = core_lib:get_anno(Lit),
+ Vs = Anno#a.us,
+ %%Vs = lit_vars(Lit),
+ {core_lib:set_anno(Lit, Anno#a.anno),[],Vs,St}.
+
+%% lit_vars(Literal) -> [Var].
+
+lit_vars(Lit) -> lit_vars(Lit, []).
+
+lit_vars(#c_cons{hd=H,tl=T}, Vs) -> lit_vars(H, lit_vars(T, Vs));
+lit_vars(#c_tuple{es=Es}, Vs) -> lit_list_vars(Es, Vs);
+lit_vars(#c_var{name=V}, Vs) -> add_element(V, Vs);
+lit_vars(_, Vs) -> Vs. %These are atomic
+
+% lit_bin_vars(Segs, Vs) ->
+% foldl(fun (#c_bitstr{val=V,size=S}, Vs0) ->
+% lit_vars(V, lit_vars(S, Vs0))
+% end, Vs, Segs).
+
+lit_list_vars(Ls) -> lit_list_vars(Ls, []).
+
+lit_list_vars(Ls, Vs) ->
+ foldl(fun (L, Vs0) -> lit_vars(L, Vs0) end, Vs, Ls).
+
+bitstr_vars(Segs) ->
+ bitstr_vars(Segs, []).
+
+bitstr_vars(Segs, Vs) ->
+ foldl(fun (#c_bitstr{val=V,size=S}, Vs0) ->
+ lit_vars(V, lit_vars(S, Vs0))
+ end, Vs, Segs).
+
+get_ianno(Ce) ->
+ case core_lib:get_anno(Ce) of
+ #a{}=A -> A;
+ A when is_list(A) -> #a{anno=A}
+ end.
+
+get_lineno_anno(Ce) ->
+ case core_lib:get_anno(Ce) of
+ #a{anno=A} -> A;
+ A when is_list(A) -> A
+ end.
+
+
+%%%
+%%% Handling of warnings.
+%%%
+
+format_error(nomatch) -> "pattern cannot possibly match".
+
+add_warning(Line, Term, #core{ws=Ws}=St) when Line >= 0 ->
+ St#core{ws=[{Line,?MODULE,Term}|Ws]};
+add_warning(_, _, St) -> St.
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_kernel.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_kernel.erl
new file mode 100644
index 0000000000..d7c3e1add9
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_kernel.erl
@@ -0,0 +1,1567 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: v3_kernel.erl,v 1.3 2010/03/04 13:54:20 maria Exp $
+%%
+%% Purpose : Transform Core Erlang to Kernel Erlang
+
+%% Kernel erlang is like Core Erlang with a few significant
+%% differences:
+%%
+%% 1. It is flat! There are no nested calls or sub-blocks.
+%%
+%% 2. All variables are unique in a function. There is no scoping, or
+%% rather the scope is the whole function.
+%%
+%% 3. Pattern matching (in cases and receives) has been compiled.
+%%
+%% 4. The annotations contain variable usages. Seeing we have to work
+%% this out anyway for funs we might as well pass it on for free to
+%% later passes.
+%%
+%% 5. All remote-calls are to statically named m:f/a. Meta-calls are
+%% passed via erlang:apply/3.
+%%
+%% The translation is done in two passes:
+%%
+%% 1. Basic translation, translate variable/function names, flatten
+%% completely, pattern matching compilation.
+%%
+%% 2. Fun-lifting (lambda-lifting), variable usage annotation and
+%% last-call handling.
+%%
+%% All new Kexprs are created in the first pass, they are just
+%% annotated in the second.
+%%
+%% Functions and BIFs
+%%
+%% Functions are "call"ed or "enter"ed if it is a last call, their
+%% return values may be ignored. BIFs are things which are known to
+%% be internal by the compiler and can only be called, their return
+%% values cannot be ignored.
+%%
+%% Letrec's are handled rather naively. All the functions in one
+%% letrec are handled as one block to find the free variables. While
+%% this is not optimal it reflects how letrec's often are used. We
+%% don't have to worry about variable shadowing and nested letrec's as
+%% this is handled in the variable/function name translation. There
+%% is a little bit of trickery to ensure letrec transformations fit
+%% into the scheme of things.
+%%
+%% To ensure unique variable names we use a variable substitution
+%% table and keep the set of all defined variables. The nested
+%% scoping of Core means that we must also nest the substitution
+%% tables, but the defined set must be passed through to match the
+%% flat structure of Kernel and to make sure variables with the same
+%% name from different scopes get different substitutions.
+%%
+%% We also use these substitutions to handle the variable renaming
+%% necessary in pattern matching compilation.
+%%
+%% The pattern matching compilation assumes that the values of
+%% different types don't overlap. This means that as there is no
+%% character type yet in the machine all characters must be converted
+%% to integers!
+
+-module(v3_kernel).
+
+-export([module/2,format_error/1]).
+
+-import(lists, [map/2,foldl/3,foldr/3,mapfoldl/3,splitwith/2,
+ member/2,reverse/1,reverse/2]).
+-import(ordsets, [add_element/2,del_element/2,union/2,union/1,subtract/2]).
+
+-include("core_parse.hrl").
+-include("v3_kernel.hrl").
+
+%% These are not defined in v3_kernel.hrl.
+get_kanno(Kthing) -> element(2, Kthing).
+set_kanno(Kthing, Anno) -> setelement(2, Kthing, Anno).
+
+%% Internal kernel expressions and help functions.
+%% N.B. the annotation field is ALWAYS the first field!
+
+-record(ivalues, {anno=[],args}).
+-record(ifun, {anno=[],vars,body}).
+-record(iset, {anno=[],vars,arg,body}).
+-record(iletrec, {anno=[],defs}).
+-record(ialias, {anno=[],vars,pat}).
+-record(iclause, {anno=[],sub,pats,guard,body}).
+-record(ireceive_accept, {anno=[],arg}).
+-record(ireceive_next, {anno=[],arg}).
+
+%% State record for kernel translator.
+-record(kern, {func, %Current function
+ vcount=0, %Variable counter
+ fcount=0, %Fun counter
+ ds=[], %Defined variables
+ funs=[], %Fun functions
+ free=[], %Free variables
+ ws=[], %Warnings.
+ extinstr=false}). %Generate extended instructions
+
+module(#c_module{anno=A,name=M,exports=Es,attrs=As,defs=Fs}, Options) ->
+ ExtInstr = not member(no_new_apply, Options),
+ {Kfs,St} = mapfoldl(fun function/2, #kern{extinstr=ExtInstr}, Fs),
+ Kes = map(fun (#c_fname{id=N,arity=Ar}) -> {N,Ar} end, Es),
+ Kas = map(fun (#c_def{name=#c_atom{val=N},val=V}) ->
+ {N,core_lib:literal_value(V)} end, As),
+ {ok,#k_mdef{anno=A,name=M#c_atom.val,exports=Kes,attributes=Kas,
+ body=Kfs ++ St#kern.funs},St#kern.ws}.
+
+function(#c_def{anno=Af,name=#c_fname{id=F,arity=Arity},val=Body}, St0) ->
+ %%ok = io:fwrite("kern: ~p~n", [{F,Arity}]),
+ St1 = St0#kern{func={F,Arity},vcount=0,fcount=0,ds=sets:new()},
+ {#ifun{anno=Ab,vars=Kvs,body=B0},[],St2} = expr(Body, new_sub(), St1),
+ {B1,_,St3} = ubody(B0, return, St2),
+ %%B1 = B0, St3 = St2, %Null second pass
+ {#k_fdef{anno=#k{us=[],ns=[],a=Af ++ Ab},
+ func=F,arity=Arity,vars=Kvs,body=B1},St3}.
+
+%% body(Cexpr, Sub, State) -> {Kexpr,[PreKepxr],State}.
+%% Do the main sequence of a body. A body ends in an atomic value or
+%% values. Must check if vector first so do expr.
+
+body(#c_values{anno=A,es=Ces}, Sub, St0) ->
+ %% Do this here even if only in bodies.
+ {Kes,Pe,St1} = atomic_list(Ces, Sub, St0),
+ %%{Kes,Pe,St1} = expr_list(Ces, Sub, St0),
+ {#ivalues{anno=A,args=Kes},Pe,St1};
+body(#ireceive_next{anno=A}, _, St) ->
+ {#k_receive_next{anno=A},[],St};
+body(Ce, Sub, St0) ->
+ expr(Ce, Sub, St0).
+
+%% guard(Cexpr, Sub, State) -> {Kexpr,State}.
+%% We handle guards almost as bodies. The only special thing we
+%% must do is to make the final Kexpr a #k_test{}.
+%% Also, we wrap the entire guard in a try/catch which is
+%% not strictly needed, but makes sure that every 'bif' instruction
+%% will get a proper failure label.
+
+guard(G0, Sub, St0) ->
+ {G1,St1} = wrap_guard(G0, St0),
+ {Ge0,Pre,St2} = expr(G1, Sub, St1),
+ {Ge,St} = gexpr_test(Ge0, St2),
+ {pre_seq(Pre, Ge),St}.
+
+%% Wrap the entire guard in a try/catch if needed.
+
+wrap_guard(#c_try{}=Try, St) -> {Try,St};
+wrap_guard(Core, St0) ->
+ {VarName,St} = new_var_name(St0),
+ Var = #c_var{name=VarName},
+ Try = #c_try{arg=Core,vars=[Var],body=Var,evars=[],handler=#c_atom{val=false}},
+ {Try,St}.
+
+%% gexpr_test(Kexpr, State) -> {Kexpr,State}.
+%% Builds the final boolean test from the last Kexpr in a guard test.
+%% Must enter try blocks and isets and find the last Kexpr in them.
+%% This must end in a recognised BEAM test!
+
+gexpr_test(#k_bif{anno=A,op=#k_remote{mod=#k_atom{val=erlang},
+ name=#k_atom{val=is_boolean},arity=1}=Op,
+ args=Kargs}, St) ->
+ %% XXX Remove this clause in R11. For bootstrap purposes, we must
+ %% recognize erlang:is_boolean/1 here.
+ {#k_test{anno=A,op=Op,args=Kargs},St};
+gexpr_test(#k_bif{anno=A,op=#k_remote{mod=#k_atom{val=erlang},
+ name=#k_atom{val=internal_is_record},arity=3}=Op,
+ args=Kargs}, St) ->
+ {#k_test{anno=A,op=Op,args=Kargs},St};
+gexpr_test(#k_bif{anno=A,op=#k_remote{mod=#k_atom{val=erlang},
+ name=#k_atom{val=F},arity=Ar}=Op,
+ args=Kargs}=Ke, St) ->
+ %% Either convert to test if ok, or add test.
+ %% At this stage, erlang:float/1 is not a type test. (It should
+ %% have been converted to erlang:is_float/1.)
+ case erl_internal:new_type_test(F, Ar) orelse
+ erl_internal:comp_op(F, Ar) of
+ true -> {#k_test{anno=A,op=Op,args=Kargs},St};
+ false -> gexpr_test_add(Ke, St) %Add equality test
+ end;
+gexpr_test(#k_try{arg=B0,vars=[#k_var{name=X}],body=#k_var{name=X},
+ handler=#k_atom{val=false}}=Try, St0) ->
+ {B,St} = gexpr_test(B0, St0),
+ %%ok = io:fwrite("~w: ~p~n", [?LINE,{B0,B}]),
+ {Try#k_try{arg=B},St};
+gexpr_test(#iset{body=B0}=Iset, St0) ->
+ {B1,St1} = gexpr_test(B0, St0),
+ {Iset#iset{body=B1},St1};
+gexpr_test(Ke, St) -> gexpr_test_add(Ke, St). %Add equality test
+
+gexpr_test_add(Ke, St0) ->
+ Test = #k_remote{mod=#k_atom{val='erlang'},
+ name=#k_atom{val='=:='},
+ arity=2},
+ {Ae,Ap,St1} = force_atomic(Ke, St0),
+ {pre_seq(Ap, #k_test{anno=get_kanno(Ke),
+ op=Test,args=[Ae,#k_atom{val='true'}]}),St1}.
+
+%% expr(Cexpr, Sub, State) -> {Kexpr,[PreKexpr],State}.
+%% Convert a Core expression, flattening it at the same time.
+
+expr(#c_var{anno=A,name=V}, Sub, St) ->
+ {#k_var{anno=A,name=get_vsub(V, Sub)},[],St};
+expr(#c_char{anno=A,val=C}, _Sub, St) ->
+ {#k_int{anno=A,val=C},[],St}; %Convert to integers!
+expr(#c_int{anno=A,val=I}, _Sub, St) ->
+ {#k_int{anno=A,val=I},[],St};
+expr(#c_float{anno=A,val=F}, _Sub, St) ->
+ {#k_float{anno=A,val=F},[],St};
+expr(#c_atom{anno=A,val=At}, _Sub, St) ->
+ {#k_atom{anno=A,val=At},[],St};
+expr(#c_string{anno=A,val=S}, _Sub, St) ->
+ {#k_string{anno=A,val=S},[],St};
+expr(#c_nil{anno=A}, _Sub, St) ->
+ {#k_nil{anno=A},[],St};
+expr(#c_cons{anno=A,hd=Ch,tl=Ct}, Sub, St0) ->
+ %% Do cons in two steps, first the expressions left to right, then
+ %% any remaining literals right to left.
+ {Kh0,Hp0,St1} = expr(Ch, Sub, St0),
+ {Kt0,Tp0,St2} = expr(Ct, Sub, St1),
+ {Kt1,Tp1,St3} = force_atomic(Kt0, St2),
+ {Kh1,Hp1,St4} = force_atomic(Kh0, St3),
+ {#k_cons{anno=A,hd=Kh1,tl=Kt1},Hp0 ++ Tp0 ++ Tp1 ++ Hp1,St4};
+expr(#c_tuple{anno=A,es=Ces}, Sub, St0) ->
+ {Kes,Ep,St1} = atomic_list(Ces, Sub, St0),
+ {#k_tuple{anno=A,es=Kes},Ep,St1};
+expr(#c_binary{anno=A,segments=Cv}, Sub, St0) ->
+ case catch atomic_bin(Cv, Sub, St0, 0) of
+ {'EXIT',R} -> exit(R);
+ bad_element_size ->
+ Erl = #c_atom{val=erlang},
+ Name = #c_atom{val=error},
+ Args = [#c_atom{val=badarg}],
+ Fault = #c_call{module=Erl,name=Name,args=Args},
+ expr(Fault, Sub, St0);
+ {Kv,Ep,St1} ->
+ {#k_binary{anno=A,segs=Kv},Ep,St1}
+ end;
+expr(#c_fname{anno=A,arity=Ar}=Fname, Sub, St) ->
+ %% A local in an expression.
+ %% For now, these are wrapped into a fun by reverse
+ %% etha-conversion, but really, there should be exactly one
+ %% such "lambda function" for each escaping local name,
+ %% instead of one for each occurrence as done now.
+ Vs = [#c_var{name=list_to_atom("V" ++ integer_to_list(V))} ||
+ V <- integers(1, Ar)],
+ Fun = #c_fun{anno=A,vars=Vs,body=#c_apply{op=Fname,args=Vs}},
+ expr(Fun, Sub, St);
+expr(#c_fun{anno=A,vars=Cvs,body=Cb}, Sub0, St0) ->
+ {Kvs,Sub1,St1} = pattern_list(Cvs, Sub0, St0),
+ %%ok = io:fwrite("~w: ~p~n", [?LINE,{{Cvs,Sub0,St0},{Kvs,Sub1,St1}}]),
+ {Kb,Pb,St2} = body(Cb, Sub1, St1),
+ {#ifun{anno=A,vars=Kvs,body=pre_seq(Pb, Kb)},[],St2};
+expr(#c_seq{arg=Ca,body=Cb}, Sub, St0) ->
+ {Ka,Pa,St1} = body(Ca, Sub, St0),
+ case is_exit_expr(Ka) of
+ true -> {Ka,Pa,St1};
+ false ->
+ {Kb,Pb,St2} = body(Cb, Sub, St1),
+ {Kb,Pa ++ [Ka] ++ Pb,St2}
+ end;
+expr(#c_let{anno=A,vars=Cvs,arg=Ca,body=Cb}, Sub0, St0) ->
+ %%ok = io:fwrite("~w: ~p~n", [?LINE,{Cvs,Sub0,St0}]),
+ {Ka,Pa,St1} = body(Ca, Sub0, St0),
+ case is_exit_expr(Ka) of
+ true -> {Ka,Pa,St1};
+ false ->
+ {Kps,Sub1,St2} = pattern_list(Cvs, Sub0, St1),
+ %%ok = io:fwrite("~w: ~p~n", [?LINE,{Kps,Sub1,St1,St2}]),
+ %% Break known multiple values into separate sets.
+ Sets = case Ka of
+ #ivalues{args=Kas} ->
+ foldr2(fun (V, Val, Sb) ->
+ [#iset{vars=[V],arg=Val}|Sb] end,
+ [], Kps, Kas);
+ _Other ->
+ [#iset{anno=A,vars=Kps,arg=Ka}]
+ end,
+ {Kb,Pb,St3} = body(Cb, Sub1, St2),
+ {Kb,Pa ++ Sets ++ Pb,St3}
+ end;
+expr(#c_letrec{anno=A,defs=Cfs,body=Cb}, Sub0, St0) ->
+ %% Make new function names and store substitution.
+ {Fs0,{Sub1,St1}} =
+ mapfoldl(fun (#c_def{name=#c_fname{id=F,arity=Ar},val=B}, {Sub,St0}) ->
+ {N,St1} = new_fun_name(atom_to_list(F)
+ ++ "/" ++
+ integer_to_list(Ar),
+ St0),
+ {{N,B},{set_fsub(F, Ar, N, Sub),St1}}
+ end, {Sub0,St0}, Cfs),
+ %% Run translation on functions and body.
+ {Fs1,St2} = mapfoldl(fun ({N,Fd0}, St1) ->
+ {Fd1,[],St2} = expr(Fd0, Sub1, St1),
+ Fd = set_kanno(Fd1, A),
+ {{N,Fd},St2}
+ end, St1, Fs0),
+ {Kb,Pb,St3} = body(Cb, Sub1, St2),
+ {Kb,[#iletrec{anno=A,defs=Fs1}|Pb],St3};
+expr(#c_case{arg=Ca,clauses=Ccs}, Sub, St0) ->
+ {Ka,Pa,St1} = body(Ca, Sub, St0), %This is a body!
+ {Kvs,Pv,St2} = match_vars(Ka, St1), %Must have variables here!
+ {Km,St3} = kmatch(Kvs, Ccs, Sub, St2),
+ Match = flatten_seq(build_match(Kvs, Km)),
+ {last(Match),Pa ++ Pv ++ first(Match),St3};
+expr(#c_receive{anno=A,clauses=Ccs0,timeout=Ce,action=Ca}, Sub, St0) ->
+ {Ke,Pe,St1} = atomic_lit(Ce, Sub, St0), %Force this to be atomic!
+ {Rvar,St2} = new_var(St1),
+ %% Need to massage accept clauses and add reject clause before matching.
+ Ccs1 = map(fun (#c_clause{anno=Banno,body=B0}=C) ->
+ B1 = #c_seq{arg=#ireceive_accept{anno=A},body=B0},
+ C#c_clause{anno=Banno,body=B1}
+ end, Ccs0),
+ {Mpat,St3} = new_var_name(St2),
+ Rc = #c_clause{anno=[compiler_generated|A],
+ pats=[#c_var{name=Mpat}],guard=#c_atom{anno=A,val=true},
+ body=#ireceive_next{anno=A}},
+ {Km,St4} = kmatch([Rvar], Ccs1 ++ [Rc], Sub, add_var_def(Rvar, St3)),
+ {Ka,Pa,St5} = body(Ca, Sub, St4),
+ {#k_receive{anno=A,var=Rvar,body=Km,timeout=Ke,action=pre_seq(Pa, Ka)},
+ Pe,St5};
+expr(#c_apply{anno=A,op=Cop,args=Cargs}, Sub, St) ->
+ c_apply(A, Cop, Cargs, Sub, St);
+expr(#c_call{anno=A,module=M0,name=F0,args=Cargs}, Sub, St0) ->
+ {[M1,F1|Kargs],Ap,St1} = atomic_list([M0,F0|Cargs], Sub, St0),
+ Ar = length(Cargs),
+ case {M1,F1} of
+ {#k_atom{val=Ma},#k_atom{val=Fa}} ->
+ Call = case is_remote_bif(Ma, Fa, Ar) of
+ true ->
+ #k_bif{anno=A,
+ op=#k_remote{mod=M1,name=F1,arity=Ar},
+ args=Kargs};
+ false ->
+ #k_call{anno=A,
+ op=#k_remote{mod=M1,name=F1,arity=Ar},
+ args=Kargs}
+ end,
+ {Call,Ap,St1};
+ _Other when St0#kern.extinstr == false -> %Old explicit apply
+ Call = #c_call{anno=A,
+ module=#c_atom{val=erlang},
+ name=#c_atom{val=apply},
+ args=[M0,F0,make_list(Cargs)]},
+ expr(Call, Sub, St0);
+ _Other -> %New instruction in R10.
+ Call = #k_call{anno=A,
+ op=#k_remote{mod=M1,name=F1,arity=Ar},
+ args=Kargs},
+ {Call,Ap,St1}
+ end;
+expr(#c_primop{anno=A,name=#c_atom{val=match_fail},args=Cargs}, Sub, St0) ->
+ %% This special case will disappear.
+ {Kargs,Ap,St1} = atomic_list(Cargs, Sub, St0),
+ Ar = length(Cargs),
+ Call = #k_call{anno=A,op=#k_internal{name=match_fail,arity=Ar},args=Kargs},
+ {Call,Ap,St1};
+expr(#c_primop{anno=A,name=#c_atom{val=N},args=Cargs}, Sub, St0) ->
+ {Kargs,Ap,St1} = atomic_list(Cargs, Sub, St0),
+ Ar = length(Cargs),
+ {#k_bif{anno=A,op=#k_internal{name=N,arity=Ar},args=Kargs},Ap,St1};
+expr(#c_try{anno=A,arg=Ca,vars=Cvs,body=Cb,evars=Evs,handler=Ch}, Sub0, St0) ->
+ %% The normal try expression. The body and exception handler
+ %% variables behave as let variables.
+ {Ka,Pa,St1} = body(Ca, Sub0, St0),
+ {Kcvs,Sub1,St2} = pattern_list(Cvs, Sub0, St1),
+ {Kb,Pb,St3} = body(Cb, Sub1, St2),
+ {Kevs,Sub2,St4} = pattern_list(Evs, Sub0, St3),
+ {Kh,Ph,St5} = body(Ch, Sub2, St4),
+ {#k_try{anno=A,arg=pre_seq(Pa, Ka),
+ vars=Kcvs,body=pre_seq(Pb, Kb),
+ evars=Kevs,handler=pre_seq(Ph, Kh)},[],St5};
+expr(#c_catch{anno=A,body=Cb}, Sub, St0) ->
+ {Kb,Pb,St1} = body(Cb, Sub, St0),
+ {#k_catch{anno=A,body=pre_seq(Pb, Kb)},[],St1};
+%% Handle internal expressions.
+expr(#ireceive_accept{anno=A}, _Sub, St) -> {#k_receive_accept{anno=A},[],St}.
+
+%% expr_list([Cexpr], Sub, State) -> {[Kexpr],[PreKexpr],State}.
+
+% expr_list(Ces, Sub, St) ->
+% foldr(fun (Ce, {Kes,Esp,St0}) ->
+% {Ke,Ep,St1} = expr(Ce, Sub, St0),
+% {[Ke|Kes],Ep ++ Esp,St1}
+% end, {[],[],St}, Ces).
+
+%% match_vars(Kexpr, State) -> {[Kvar],[PreKexpr],State}.
+%% Force return from body into a list of variables.
+
+match_vars(#ivalues{args=As}, St) ->
+ foldr(fun (Ka, {Vs,Vsp,St0}) ->
+ {V,Vp,St1} = force_variable(Ka, St0),
+ {[V|Vs],Vp ++ Vsp,St1}
+ end, {[],[],St}, As);
+match_vars(Ka, St0) ->
+ {V,Vp,St1} = force_variable(Ka, St0),
+ {[V],Vp,St1}.
+
+%% c_apply(A, Op, [Carg], Sub, State) -> {Kexpr,[PreKexpr],State}.
+%% Transform application, detect which are guaranteed to be bifs.
+
+c_apply(A, #c_fname{anno=Ra,id=F0,arity=Ar}, Cargs, Sub, St0) ->
+ {Kargs,Ap,St1} = atomic_list(Cargs, Sub, St0),
+ F1 = get_fsub(F0, Ar, Sub), %Has it been rewritten
+ {#k_call{anno=A,op=#k_local{anno=Ra,name=F1,arity=Ar},args=Kargs},
+ Ap,St1};
+c_apply(A, Cop, Cargs, Sub, St0) ->
+ {Kop,Op,St1} = variable(Cop, Sub, St0),
+ {Kargs,Ap,St2} = atomic_list(Cargs, Sub, St1),
+ {#k_call{anno=A,op=Kop,args=Kargs},Op ++ Ap,St2}.
+
+flatten_seq(#iset{anno=A,vars=Vs,arg=Arg,body=B}) ->
+ [#iset{anno=A,vars=Vs,arg=Arg}|flatten_seq(B)];
+flatten_seq(Ke) -> [Ke].
+
+pre_seq([#iset{anno=A,vars=Vs,arg=Arg,body=B}|Ps], K) ->
+ B = undefined, %Assertion.
+ #iset{anno=A,vars=Vs,arg=Arg,body=pre_seq(Ps, K)};
+pre_seq([P|Ps], K) ->
+ #iset{vars=[],arg=P,body=pre_seq(Ps, K)};
+pre_seq([], K) -> K.
+
+%% atomic_lit(Cexpr, Sub, State) -> {Katomic,[PreKexpr],State}.
+%% Convert a Core expression making sure the result is an atomic
+%% literal.
+
+atomic_lit(Ce, Sub, St0) ->
+ {Ke,Kp,St1} = expr(Ce, Sub, St0),
+ {Ka,Ap,St2} = force_atomic(Ke, St1),
+ {Ka,Kp ++ Ap,St2}.
+
+force_atomic(Ke, St0) ->
+ case is_atomic(Ke) of
+ true -> {Ke,[],St0};
+ false ->
+ {V,St1} = new_var(St0),
+ {V,[#iset{vars=[V],arg=Ke}],St1}
+ end.
+
+% force_atomic_list(Kes, St) ->
+% foldr(fun (Ka, {As,Asp,St0}) ->
+% {A,Ap,St1} = force_atomic(Ka, St0),
+% {[A|As],Ap ++ Asp,St1}
+% end, {[],[],St}, Kes).
+
+atomic_bin([#c_bitstr{anno=A,val=E0,size=S0,unit=U,type=T,flags=Fs}|Es0],
+ Sub, St0, B0) ->
+ {E,Ap1,St1} = atomic_lit(E0, Sub, St0),
+ {S1,Ap2,St2} = atomic_lit(S0, Sub, St1),
+ validate_bin_element_size(S1),
+ U0 = core_lib:literal_value(U),
+ Fs0 = core_lib:literal_value(Fs),
+ {B1,Fs1} = aligned(B0, S1, U0, Fs0),
+ {Es,Ap3,St3} = atomic_bin(Es0, Sub, St2, B1),
+ {#k_bin_seg{anno=A,size=S1,
+ unit=U0,
+ type=core_lib:literal_value(T),
+ flags=Fs1,
+ seg=E,next=Es},
+ Ap1++Ap2++Ap3,St3};
+atomic_bin([], _Sub, St, _Bits) -> {#k_bin_end{},[],St}.
+
+validate_bin_element_size(#k_var{}) -> ok;
+validate_bin_element_size(#k_int{val=V}) when V >= 0 -> ok;
+validate_bin_element_size(#k_atom{val=all}) -> ok;
+validate_bin_element_size(_) -> throw(bad_element_size).
+
+%% atomic_list([Cexpr], Sub, State) -> {[Kexpr],[PreKexpr],State}.
+
+atomic_list(Ces, Sub, St) ->
+ foldr(fun (Ce, {Kes,Esp,St0}) ->
+ {Ke,Ep,St1} = atomic_lit(Ce, Sub, St0),
+ {[Ke|Kes],Ep ++ Esp,St1}
+ end, {[],[],St}, Ces).
+
+%% is_atomic(Kexpr) -> boolean().
+%% Is a Kexpr atomic? Strings are NOT considered atomic!
+
+is_atomic(#k_int{}) -> true;
+is_atomic(#k_float{}) -> true;
+is_atomic(#k_atom{}) -> true;
+%%is_atomic(#k_char{}) -> true; %No characters
+%%is_atomic(#k_string{}) -> true;
+is_atomic(#k_nil{}) -> true;
+is_atomic(#k_var{}) -> true;
+is_atomic(_) -> false.
+
+%% variable(Cexpr, Sub, State) -> {Kvar,[PreKexpr],State}.
+%% Convert a Core expression making sure the result is a variable.
+
+variable(Ce, Sub, St0) ->
+ {Ke,Kp,St1} = expr(Ce, Sub, St0),
+ {Kv,Vp,St2} = force_variable(Ke, St1),
+ {Kv,Kp ++ Vp,St2}.
+
+force_variable(#k_var{}=Ke, St) -> {Ke,[],St};
+force_variable(Ke, St0) ->
+ {V,St1} = new_var(St0),
+ {V,[#iset{vars=[V],arg=Ke}],St1}.
+
+%% pattern(Cpat, Sub, State) -> {Kpat,Sub,State}.
+%% Convert patterns. Variables shadow so rename variables that are
+%% already defined.
+
+pattern(#c_var{anno=A,name=V}, Sub, St0) ->
+ case sets:is_element(V, St0#kern.ds) of
+ true ->
+ {New,St1} = new_var_name(St0),
+ {#k_var{anno=A,name=New},
+ set_vsub(V, New, Sub),
+ St1#kern{ds=sets:add_element(New, St1#kern.ds)}};
+ false ->
+ {#k_var{anno=A,name=V},Sub,
+ St0#kern{ds=sets:add_element(V, St0#kern.ds)}}
+ end;
+pattern(#c_char{anno=A,val=C}, Sub, St) ->
+ {#k_int{anno=A,val=C},Sub,St}; %Convert to integers!
+pattern(#c_int{anno=A,val=I}, Sub, St) ->
+ {#k_int{anno=A,val=I},Sub,St};
+pattern(#c_float{anno=A,val=F}, Sub, St) ->
+ {#k_float{anno=A,val=F},Sub,St};
+pattern(#c_atom{anno=A,val=At}, Sub, St) ->
+ {#k_atom{anno=A,val=At},Sub,St};
+pattern(#c_string{val=S}, Sub, St) ->
+ L = foldr(fun (C, T) -> #k_cons{hd=#k_int{val=C},tl=T} end,
+ #k_nil{}, S),
+ {L,Sub,St};
+pattern(#c_nil{anno=A}, Sub, St) ->
+ {#k_nil{anno=A},Sub,St};
+pattern(#c_cons{anno=A,hd=Ch,tl=Ct}, Sub0, St0) ->
+ {Kh,Sub1,St1} = pattern(Ch, Sub0, St0),
+ {Kt,Sub2,St2} = pattern(Ct, Sub1, St1),
+ {#k_cons{anno=A,hd=Kh,tl=Kt},Sub2,St2};
+pattern(#c_tuple{anno=A,es=Ces}, Sub0, St0) ->
+ {Kes,Sub1,St1} = pattern_list(Ces, Sub0, St0),
+ {#k_tuple{anno=A,es=Kes},Sub1,St1};
+pattern(#c_binary{anno=A,segments=Cv}, Sub0, St0) ->
+ {Kv,Sub1,St1} = pattern_bin(Cv, Sub0, St0),
+ {#k_binary{anno=A,segs=Kv},Sub1,St1};
+pattern(#c_alias{anno=A,var=Cv,pat=Cp}, Sub0, St0) ->
+ {Cvs,Cpat} = flatten_alias(Cp),
+ {Kvs,Sub1,St1} = pattern_list([Cv|Cvs], Sub0, St0),
+ {Kpat,Sub2,St2} = pattern(Cpat, Sub1, St1),
+ {#ialias{anno=A,vars=Kvs,pat=Kpat},Sub2,St2}.
+
+flatten_alias(#c_alias{var=V,pat=P}) ->
+ {Vs,Pat} = flatten_alias(P),
+ {[V|Vs],Pat};
+flatten_alias(Pat) -> {[],Pat}.
+
+pattern_bin(Es, Sub, St) -> pattern_bin(Es, Sub, St, 0).
+
+pattern_bin([#c_bitstr{anno=A,val=E0,size=S0,unit=U,type=T,flags=Fs}|Es0],
+ Sub0, St0, B0) ->
+ {S1,[],St1} = expr(S0, Sub0, St0),
+ U0 = core_lib:literal_value(U),
+ Fs0 = core_lib:literal_value(Fs),
+ %%ok= io:fwrite("~w: ~p~n", [?LINE,{B0,S1,U0,Fs0}]),
+ {B1,Fs1} = aligned(B0, S1, U0, Fs0),
+ {E,Sub1,St2} = pattern(E0, Sub0, St1),
+ {Es,Sub2,St3} = pattern_bin(Es0, Sub1, St2, B1),
+ {#k_bin_seg{anno=A,size=S1,
+ unit=U0,
+ type=core_lib:literal_value(T),
+ flags=Fs1,
+ seg=E,next=Es},
+ Sub2,St3};
+pattern_bin([], Sub, St, _Bits) -> {#k_bin_end{},Sub,St}.
+
+%% pattern_list([Cexpr], Sub, State) -> {[Kexpr],Sub,State}.
+
+pattern_list(Ces, Sub, St) ->
+ foldr(fun (Ce, {Kes,Sub0,St0}) ->
+ {Ke,Sub1,St1} = pattern(Ce, Sub0, St0),
+ {[Ke|Kes],Sub1,St1}
+ end, {[],Sub,St}, Ces).
+
+%% new_sub() -> Subs.
+%% set_vsub(Name, Sub, Subs) -> Subs.
+%% subst_vsub(Name, Sub, Subs) -> Subs.
+%% get_vsub(Name, Subs) -> SubName.
+%% Add/get substitute Sub for Name to VarSub. Use orddict so we know
+%% the format is a list {Name,Sub} pairs. When adding a new
+%% substitute we fold substitute chains so we never have to search
+%% more than once.
+
+new_sub() -> orddict:new().
+
+get_vsub(V, Vsub) ->
+ case orddict:find(V, Vsub) of
+ {ok,Val} -> Val;
+ error -> V
+ end.
+
+set_vsub(V, S, Vsub) ->
+ orddict:store(V, S, Vsub).
+
+subst_vsub(V, S, Vsub0) ->
+ %% Fold chained substitutions.
+ Vsub1 = orddict:map(fun (_, V1) when V1 =:= V -> S;
+ (_, V1) -> V1
+ end, Vsub0),
+ orddict:store(V, S, Vsub1).
+
+get_fsub(F, A, Fsub) ->
+ case orddict:find({F,A}, Fsub) of
+ {ok,Val} -> Val;
+ error -> F
+ end.
+
+set_fsub(F, A, S, Fsub) ->
+ orddict:store({F,A}, S, Fsub).
+
+new_fun_name(St) ->
+ new_fun_name("anonymous", St).
+
+%% new_fun_name(Type, State) -> {FunName,State}.
+
+new_fun_name(Type, #kern{func={F,Arity},fcount=C}=St) ->
+ Name = "-" ++ atom_to_list(F) ++ "/" ++ integer_to_list(Arity) ++
+ "-" ++ Type ++ "-" ++ integer_to_list(C) ++ "-",
+ {list_to_atom(Name),St#kern{fcount=C+1}}.
+
+%% new_var_name(State) -> {VarName,State}.
+
+new_var_name(#kern{vcount=C}=St) ->
+ {list_to_atom("ker" ++ integer_to_list(C)),St#kern{vcount=C+1}}.
+
+%% new_var(State) -> {#k_var{},State}.
+
+new_var(St0) ->
+ {New,St1} = new_var_name(St0),
+ {#k_var{name=New},St1}.
+
+%% new_vars(Count, State) -> {[#k_var{}],State}.
+%% Make Count new variables.
+
+new_vars(N, St) -> new_vars(N, St, []).
+
+new_vars(N, St0, Vs) when N > 0 ->
+ {V,St1} = new_var(St0),
+ new_vars(N-1, St1, [V|Vs]);
+new_vars(0, St, Vs) -> {Vs,St}.
+
+make_vars(Vs) -> [ #k_var{name=V} || V <- Vs ].
+
+add_var_def(V, St) ->
+ St#kern{ds=sets:add_element(V#k_var.name, St#kern.ds)}.
+
+%%add_vars_def(Vs, St) ->
+%% Ds = foldl(fun (#k_var{name=V}, Ds) -> add_element(V, Ds) end,
+%% St#kern.ds, Vs),
+%% St#kern{ds=Ds}.
+
+%% is_remote_bif(Mod, Name, Arity) -> true | false.
+%% Test if function is really a BIF.
+
+is_remote_bif(erlang, is_boolean, 1) ->
+ %% XXX Remove this clause in R11. For bootstrap purposes, we must
+ %% recognize erlang:is_boolean/1 here.
+ true;
+is_remote_bif(erlang, internal_is_record, 3) -> true;
+is_remote_bif(erlang, get, 1) -> true;
+is_remote_bif(erlang, N, A) ->
+ case erl_internal:guard_bif(N, A) of
+ true -> true;
+ false ->
+ case erl_internal:type_test(N, A) of
+ true -> true;
+ false ->
+ case catch erl_internal:op_type(N, A) of
+ arith -> true;
+ bool -> true;
+ comp -> true;
+ _Other -> false %List, send or not an op
+ end
+ end
+ end;
+is_remote_bif(_, _, _) -> false.
+
+%% bif_vals(Name, Arity) -> integer().
+%% bif_vals(Mod, Name, Arity) -> integer().
+%% Determine how many return values a BIF has. Provision for BIFs to
+%% return multiple values. Only used in bodies where a BIF may be
+%% called for effect only.
+
+bif_vals(dsetelement, 3) -> 0;
+bif_vals(_, _) -> 1.
+
+bif_vals(_, _, _) -> 1.
+
+%% foldr2(Fun, Acc, List1, List2) -> Acc.
+%% Fold over two lists.
+
+foldr2(Fun, Acc0, [E1|L1], [E2|L2]) ->
+ Acc1 = Fun(E1, E2, Acc0),
+ foldr2(Fun, Acc1, L1, L2);
+foldr2(_, Acc, [], []) -> Acc.
+
+%% first([A]) -> [A].
+%% last([A]) -> A.
+
+last([L]) -> L;
+last([_|T]) -> last(T).
+
+first([_]) -> [];
+first([H|T]) -> [H|first(T)].
+
+%% This code implements the algorithm for an optimizing compiler for
+%% pattern matching given "The Implementation of Functional
+%% Programming Languages" by Simon Peyton Jones. The code is much
+%% longer as the meaning of constructors is different from the book.
+%%
+%% In Erlang many constructors can have different values, e.g. 'atom'
+%% or 'integer', whereas in the original algorithm thse would be
+%% different constructors. Our view makes it easier in later passes to
+%% handle indexing over each type.
+%%
+%% Patterns are complicated by having alias variables. The form of a
+%% pattern is Pat | {alias,Pat,[AliasVar]}. This is hidden by access
+%% functions to pattern arguments but the code must be aware of it.
+%%
+%% The compilation proceeds in two steps:
+%%
+%% 1. The patterns in the clauses to converted to lists of kernel
+%% patterns. The Core clause is now hybrid, this is easier to work
+%% with. Remove clauses with trivially false guards, this simplifies
+%% later passes. Add local defined vars and variable subs to each
+%% clause for later use.
+%%
+%% 2. The pattern matching is optimised. Variable substitutions are
+%% added to the VarSub structure and new variables are made visible.
+%% The guard and body are then converted to Kernel form.
+
+%% kmatch([Var], [Clause], Sub, State) -> {Kexpr,[PreExpr],State}.
+
+kmatch(Us, Ccs, Sub, St0) ->
+ {Cs,St1} = match_pre(Ccs, Sub, St0), %Convert clauses
+ %%Def = kernel_match_error, %The strict case
+ %% This should be a kernel expression from the first pass.
+ Def = #k_call{anno=[compiler_generated],
+ op=#k_remote{mod=#k_atom{val=erlang},
+ name=#k_atom{val=exit},
+ arity=1},
+ args=[#k_atom{val=kernel_match_error}]},
+ {Km,St2} = match(Us, Cs, Def, St1), %Do the match.
+ {Km,St2}.
+
+%% match_pre([Cclause], Sub, State) -> {[Clause],State}.
+%% Must be careful not to generate new substitutions here now!
+%% Remove clauses with trivially false guards which will never
+%% succeed.
+
+match_pre(Cs, Sub0, St) ->
+ foldr(fun (#c_clause{anno=A,pats=Ps,guard=G,body=B}, {Cs0,St0}) ->
+ case is_false_guard(G) of
+ true -> {Cs0,St0};
+ false ->
+ {Kps,Sub1,St1} = pattern_list(Ps, Sub0, St0),
+ {[#iclause{anno=A,sub=Sub1,pats=Kps,guard=G,body=B}|
+ Cs0],St1}
+ end
+ end, {[],St}, Cs).
+
+%% match([Var], [Clause], Default, State) -> {MatchExpr,State}.
+
+match([U|Us], Cs, Def, St0) ->
+ %%ok = io:format("match ~p~n", [Cs]),
+ Pcss = partition(Cs),
+ foldr(fun (Pcs, {D,St}) -> match_varcon([U|Us], Pcs, D, St) end,
+ {Def,St0}, Pcss);
+match([], Cs, Def, St) ->
+ match_guard(Cs, Def, St).
+
+%% match_guard([Clause], Default, State) -> {IfExpr,State}.
+%% Build a guard to handle guards. A guard *ALWAYS* fails if no
+%% clause matches, there will be a surrounding 'alt' to catch the
+%% failure. Drop redundant cases, i.e. those after a true guard.
+
+match_guard(Cs0, Def0, St0) ->
+ {Cs1,Def1,St1} = match_guard_1(Cs0, Def0, St0),
+ {build_alt(build_guard(Cs1), Def1),St1}.
+
+match_guard_1([#iclause{anno=A,sub=Sub,guard=G,body=B}|Cs0], Def0, St0) ->
+ case is_true_guard(G) of
+ true ->
+ %% The true clause body becomes the default.
+ {Kb,Pb,St1} = body(B, Sub, St0),
+ Line = get_line(A),
+ St2 = maybe_add_warning(Cs0, Line, St1),
+ St = maybe_add_warning(Def0, Line, St2),
+ {[],pre_seq(Pb, Kb),St};
+ false ->
+ {Kg,St1} = guard(G, Sub, St0),
+ {Kb,Pb,St2} = body(B, Sub, St1),
+ {Cs1,Def1,St3} = match_guard_1(Cs0, Def0, St2),
+ {[#k_guard_clause{guard=Kg,body=pre_seq(Pb, Kb)}|Cs1],
+ Def1,St3}
+ end;
+match_guard_1([], Def, St) -> {[],Def,St}.
+
+maybe_add_warning([C|_], Line, St) ->
+ maybe_add_warning(C, Line, St);
+maybe_add_warning([], _Line, St) -> St;
+maybe_add_warning(fail, _Line, St) -> St;
+maybe_add_warning(Ke, MatchLine, St) ->
+ case get_kanno(Ke) of
+ [compiler_generated|_] -> St;
+ Anno ->
+ Line = get_line(Anno),
+ Warn = case MatchLine of
+ none -> nomatch_shadow;
+ _ -> {nomatch_shadow,MatchLine}
+ end,
+ add_warning(Line, Warn, St)
+ end.
+
+get_line([Line|_]) when is_integer(Line) -> Line;
+get_line([_|T]) -> get_line(T);
+get_line([]) -> none.
+
+
+%% is_true_guard(Guard) -> boolean().
+%% is_false_guard(Guard) -> boolean().
+%% Test if a guard is either trivially true/false. This has probably
+%% already been optimised away, but what the heck!
+
+is_true_guard(G) -> guard_value(G) == true.
+is_false_guard(G) -> guard_value(G) == false.
+
+%% guard_value(Guard) -> true | false | unknown.
+
+guard_value(#c_atom{val=true}) -> true;
+guard_value(#c_atom{val=false}) -> false;
+guard_value(#c_call{module=#c_atom{val=erlang},
+ name=#c_atom{val='not'},
+ args=[A]}) ->
+ case guard_value(A) of
+ true -> false;
+ false -> true;
+ unknown -> unknown
+ end;
+guard_value(#c_call{module=#c_atom{val=erlang},
+ name=#c_atom{val='and'},
+ args=[Ca,Cb]}) ->
+ case guard_value(Ca) of
+ true -> guard_value(Cb);
+ false -> false;
+ unknown ->
+ case guard_value(Cb) of
+ false -> false;
+ _Other -> unknown
+ end
+ end;
+guard_value(#c_call{module=#c_atom{val=erlang},
+ name=#c_atom{val='or'},
+ args=[Ca,Cb]}) ->
+ case guard_value(Ca) of
+ true -> true;
+ false -> guard_value(Cb);
+ unknown ->
+ case guard_value(Cb) of
+ true -> true;
+ _Other -> unknown
+ end
+ end;
+guard_value(#c_try{arg=E,vars=[#c_var{name=X}],body=#c_var{name=X},
+ handler=#c_atom{val=false}}) ->
+ guard_value(E);
+guard_value(_) -> unknown.
+
+%% partition([Clause]) -> [[Clause]].
+%% Partition a list of clauses into groups which either contain
+%% clauses with a variable first argument, or with a "constructor".
+
+partition([C1|Cs]) ->
+ V1 = is_var_clause(C1),
+ {More,Rest} = splitwith(fun (C) -> is_var_clause(C) == V1 end, Cs),
+ [[C1|More]|partition(Rest)];
+partition([]) -> [].
+
+%% match_varcon([Var], [Clause], Def, [Var], Sub, State) ->
+%% {MatchExpr,State}.
+
+match_varcon(Us, [C|_]=Cs, Def, St) ->
+ case is_var_clause(C) of
+ true -> match_var(Us, Cs, Def, St);
+ false -> match_con(Us, Cs, Def, St)
+ end.
+
+%% match_var([Var], [Clause], Def, State) -> {MatchExpr,State}.
+%% Build a call to "select" from a list of clauses all containing a
+%% variable as the first argument. We must rename the variable in
+%% each clause to be the match variable as these clause will share
+%% this variable and may have different names for it. Rename aliases
+%% as well.
+
+match_var([U|Us], Cs0, Def, St) ->
+ Cs1 = map(fun (#iclause{sub=Sub0,pats=[Arg|As]}=C) ->
+ Vs = [arg_arg(Arg)|arg_alias(Arg)],
+ Sub1 = foldl(fun (#k_var{name=V}, Acc) ->
+ subst_vsub(V, U#k_var.name, Acc)
+ end, Sub0, Vs),
+ C#iclause{sub=Sub1,pats=As}
+ end, Cs0),
+ match(Us, Cs1, Def, St).
+
+%% match_con(Variables, [Clause], Default, State) -> {SelectExpr,State}.
+%% Build call to "select" from a list of clauses all containing a
+%% constructor/constant as first argument. Group the constructors
+%% according to type, the order is really irrelevant but tries to be
+%% smart.
+
+match_con([U|Us], Cs, Def, St0) ->
+ %% Extract clauses for different constructors (types).
+ %%ok = io:format("match_con ~p~n", [Cs]),
+ Ttcs = [ {T,Tcs} || T <- [k_cons,k_tuple,k_atom,k_float,k_int,k_nil,
+ k_binary,k_bin_end],
+ begin Tcs = select(T, Cs),
+ Tcs /= []
+ end ] ++ select_bin_con(Cs),
+ %%ok = io:format("ttcs = ~p~n", [Ttcs]),
+ {Scs,St1} =
+ mapfoldl(fun ({T,Tcs}, St) ->
+ {[S|_]=Sc,S1} = match_value([U|Us], T, Tcs, fail, St),
+ %%ok = io:format("match_con type2 ~p~n", [T]),
+ Anno = get_kanno(S),
+ {#k_type_clause{anno=Anno,type=T,values=Sc},S1} end,
+ St0, Ttcs),
+ {build_alt_1st_no_fail(build_select(U, Scs), Def),St1}.
+
+%% select_bin_con([Clause]) -> [{Type,[Clause]}].
+%% Extract clauses for the k_bin_seg constructor. As k_bin_seg
+%% matching can overlap, the k_bin_seg constructors cannot be
+%% reordered, only grouped.
+
+select_bin_con(Cs0) ->
+ Cs1 = lists:filter(fun (C) ->
+ clause_con(C) == k_bin_seg
+ end, Cs0),
+ select_bin_con_1(Cs1).
+
+select_bin_con_1([C1|Cs]) ->
+ Con = clause_con(C1),
+ {More,Rest} = splitwith(fun (C) -> clause_con(C) == Con end, Cs),
+ [{Con,[C1|More]}|select_bin_con_1(Rest)];
+select_bin_con_1([]) -> [].
+
+%% select(Con, [Clause]) -> [Clause].
+
+select(T, Cs) -> [ C || C <- Cs, clause_con(C) == T ].
+
+%% match_value([Var], Con, [Clause], Default, State) -> {SelectExpr,State}.
+%% At this point all the clauses have the same constructor, we must
+%% now separate them according to value.
+
+match_value(_, _, [], _, St) -> {[],St};
+match_value(Us, T, Cs0, Def, St0) ->
+ Css = group_value(T, Cs0),
+ %%ok = io:format("match_value ~p ~p~n", [T, Css]),
+ {Css1,St1} = mapfoldl(fun (Cs, St) ->
+ match_clause(Us, Cs, Def, St) end,
+ St0, Css),
+ {Css1,St1}.
+ %%{#k_select_val{type=T,var=hd(Us),clauses=Css1},St1}.
+
+%% group_value([Clause]) -> [[Clause]].
+%% Group clauses according to value. Here we know that
+%% 1. Some types are singled valued
+%% 2. The clauses in bin_segs cannot be reordered only grouped
+%% 3. Other types are disjoint and can be reordered
+
+group_value(k_cons, Cs) -> [Cs]; %These are single valued
+group_value(k_nil, Cs) -> [Cs];
+group_value(k_binary, Cs) -> [Cs];
+group_value(k_bin_end, Cs) -> [Cs];
+group_value(k_bin_seg, Cs) ->
+ group_bin_seg(Cs);
+group_value(_, Cs) ->
+ %% group_value(Cs).
+ Cd = foldl(fun (C, Gcs0) -> dict:append(clause_val(C), C, Gcs0) end,
+ dict:new(), Cs),
+ dict:fold(fun (_, Vcs, Css) -> [Vcs|Css] end, [], Cd).
+
+group_bin_seg([C1|Cs]) ->
+ V1 = clause_val(C1),
+ {More,Rest} = splitwith(fun (C) -> clause_val(C) == V1 end, Cs),
+ [[C1|More]|group_bin_seg(Rest)];
+group_bin_seg([]) -> [].
+
+%% Profiling shows that this quadratic implementation account for a big amount
+%% of the execution time if there are many values.
+% group_value([C|Cs]) ->
+% V = clause_val(C),
+% Same = [ Cv || Cv <- Cs, clause_val(Cv) == V ], %Same value
+% Rest = [ Cv || Cv <- Cs, clause_val(Cv) /= V ], % and all the rest
+% [[C|Same]|group_value(Rest)];
+% group_value([]) -> [].
+
+%% match_clause([Var], [Clause], Default, State) -> {Clause,State}.
+%% At this point all the clauses have the same "value". Build one
+%% select clause for this value and continue matching. Rename
+%% aliases as well.
+
+match_clause([U|Us], [C|_]=Cs0, Def, St0) ->
+ Anno = get_kanno(C),
+ {Match0,Vs,St1} = get_match(get_con(Cs0), St0),
+ Match = sub_size_var(Match0, Cs0),
+ {Cs1,St2} = new_clauses(Cs0, U, St1),
+ {B,St3} = match(Vs ++ Us, Cs1, Def, St2),
+ {#k_val_clause{anno=Anno,val=Match,body=B},St3}.
+
+sub_size_var(#k_bin_seg{size=#k_var{name=Name}=Kvar}=BinSeg, [#iclause{sub=Sub}|_]) ->
+ BinSeg#k_bin_seg{size=Kvar#k_var{name=get_vsub(Name, Sub)}};
+sub_size_var(K, _) -> K.
+
+get_con([C|_]) -> arg_arg(clause_arg(C)). %Get the constructor
+
+get_match(#k_cons{}, St0) ->
+ {[H,T],St1} = new_vars(2, St0),
+ {#k_cons{hd=H,tl=T},[H,T],St1};
+get_match(#k_binary{}, St0) ->
+ {[V]=Mes,St1} = new_vars(1, St0),
+ {#k_binary{segs=V},Mes,St1};
+get_match(#k_bin_seg{}=Seg, St0) ->
+ {[S,N]=Mes,St1} = new_vars(2, St0),
+ {Seg#k_bin_seg{seg=S,next=N},Mes,St1};
+get_match(#k_tuple{es=Es}, St0) ->
+ {Mes,St1} = new_vars(length(Es), St0),
+ {#k_tuple{es=Mes},Mes,St1};
+get_match(M, St) ->
+ {M,[],St}.
+
+new_clauses(Cs0, U, St) ->
+ Cs1 = map(fun (#iclause{sub=Sub0,pats=[Arg|As]}=C) ->
+ Head = case arg_arg(Arg) of
+ #k_cons{hd=H,tl=T} -> [H,T|As];
+ #k_tuple{es=Es} -> Es ++ As;
+ #k_binary{segs=E} -> [E|As];
+ #k_bin_seg{seg=S,next=N} ->
+ [S,N|As];
+ _Other -> As
+ end,
+ Vs = arg_alias(Arg),
+ Sub1 = foldl(fun (#k_var{name=V}, Acc) ->
+ subst_vsub(V, U#k_var.name, Acc)
+ end, Sub0, Vs),
+ C#iclause{sub=Sub1,pats=Head}
+ end, Cs0),
+ {Cs1,St}.
+
+%% build_guard([GuardClause]) -> GuardExpr.
+
+build_guard([]) -> fail;
+build_guard(Cs) -> #k_guard{clauses=Cs}.
+
+%% build_select(Var, [ConClause]) -> SelectExpr.
+
+build_select(V, [Tc|_]=Tcs) ->
+ Anno = get_kanno(Tc),
+ #k_select{anno=Anno,var=V,types=Tcs}.
+
+%% build_alt(First, Then) -> AltExpr.
+%% Build an alt, attempt some simple optimisation.
+
+build_alt(fail, Then) -> Then;
+build_alt(First,Then) -> build_alt_1st_no_fail(First, Then).
+
+build_alt_1st_no_fail(First, fail) -> First;
+build_alt_1st_no_fail(First, Then) -> #k_alt{first=First,then=Then}.
+
+%% build_match([MatchVar], MatchExpr) -> Kexpr.
+%% Build a match expr if there is a match.
+
+build_match(Us, #k_alt{}=Km) -> #k_match{vars=Us,body=Km};
+build_match(Us, #k_select{}=Km) -> #k_match{vars=Us,body=Km};
+build_match(Us, #k_guard{}=Km) -> #k_match{vars=Us,body=Km};
+build_match(_, Km) -> Km.
+
+%% clause_arg(Clause) -> FirstArg.
+%% clause_con(Clause) -> Constructor.
+%% clause_val(Clause) -> Value.
+%% is_var_clause(Clause) -> boolean().
+
+clause_arg(#iclause{pats=[Arg|_]}) -> Arg.
+
+clause_con(C) -> arg_con(clause_arg(C)).
+
+clause_val(C) -> arg_val(clause_arg(C)).
+
+is_var_clause(C) -> clause_con(C) == k_var.
+
+%% arg_arg(Arg) -> Arg.
+%% arg_alias(Arg) -> Aliases.
+%% arg_con(Arg) -> Constructor.
+%% arg_val(Arg) -> Value.
+%% These are the basic functions for obtaining fields in an argument.
+
+arg_arg(#ialias{pat=Con}) -> Con;
+arg_arg(Con) -> Con.
+
+arg_alias(#ialias{vars=As}) -> As;
+arg_alias(_Con) -> [].
+
+arg_con(Arg) ->
+ case arg_arg(Arg) of
+ #k_int{} -> k_int;
+ #k_float{} -> k_float;
+ #k_atom{} -> k_atom;
+ #k_nil{} -> k_nil;
+ #k_cons{} -> k_cons;
+ #k_tuple{} -> k_tuple;
+ #k_binary{} -> k_binary;
+ #k_bin_end{} -> k_bin_end;
+ #k_bin_seg{} -> k_bin_seg;
+ #k_var{} -> k_var
+ end.
+
+arg_val(Arg) ->
+ case arg_arg(Arg) of
+ #k_int{val=I} -> I;
+ #k_float{val=F} -> F;
+ #k_atom{val=A} -> A;
+ #k_nil{} -> 0;
+ #k_cons{} -> 2;
+ #k_tuple{es=Es} -> length(Es);
+ #k_bin_seg{size=S,unit=U,type=T,flags=Fs} ->
+ {set_kanno(S, []),U,T,Fs};
+ #k_bin_end{} -> 0;
+ #k_binary{} -> 0
+ end.
+
+%% ubody(Expr, Break, State) -> {Expr,[UsedVar],State}.
+%% Tag the body sequence with its used variables. These bodies
+%% either end with a #k_break{}, or with #k_return{} or an expression
+%% which itself can return, #k_enter{}, #k_match{} ... .
+
+ubody(#iset{vars=[],arg=#iletrec{}=Let,body=B0}, Br, St0) ->
+ %% An iletrec{} should never be last.
+ St1 = iletrec_funs(Let, St0),
+ ubody(B0, Br, St1);
+ubody(#iset{anno=A,vars=Vs,arg=E0,body=B0}, Br, St0) ->
+ {E1,Eu,St1} = uexpr(E0, {break,Vs}, St0),
+ {B1,Bu,St2} = ubody(B0, Br, St1),
+ Ns = lit_list_vars(Vs),
+ Used = union(Eu, subtract(Bu, Ns)), %Used external vars
+ {#k_seq{anno=#k{us=Used,ns=Ns,a=A},arg=E1,body=B1},Used,St2};
+ubody(#ivalues{anno=A,args=As}, return, St) ->
+ Au = lit_list_vars(As),
+ {#k_return{anno=#k{us=Au,ns=[],a=A},args=As},Au,St};
+ubody(#ivalues{anno=A,args=As}, {break,_Vbs}, St) ->
+ Au = lit_list_vars(As),
+ {#k_break{anno=#k{us=Au,ns=[],a=A},args=As},Au,St};
+ubody(E, return, St0) ->
+ %% Enterable expressions need no trailing return.
+ case is_enter_expr(E) of
+ true -> uexpr(E, return, St0);
+ false ->
+ {Ea,Pa,St1} = force_atomic(E, St0),
+ ubody(pre_seq(Pa, #ivalues{args=[Ea]}), return, St1)
+ end;
+ubody(E, {break,Rs}, St0) ->
+ %%ok = io:fwrite("ubody ~w:~p~n", [?LINE,{E,Br}]),
+ %% Exiting expressions need no trailing break.
+ case is_exit_expr(E) of
+ true -> uexpr(E, return, St0);
+ false ->
+ {Ea,Pa,St1} = force_atomic(E, St0),
+ ubody(pre_seq(Pa, #ivalues{args=[Ea]}), {break,Rs}, St1)
+ end.
+
+iletrec_funs(#iletrec{defs=Fs}, St0) ->
+ %% Use union of all free variables.
+ %% First just work out free variables for all functions.
+ Free = foldl(fun ({_,#ifun{vars=Vs,body=Fb0}}, Free0) ->
+ {_,Fbu,_} = ubody(Fb0, return, St0),
+ Ns = lit_list_vars(Vs),
+ Free1 = subtract(Fbu, Ns),
+ union(Free1, Free0)
+ end, [], Fs),
+ FreeVs = make_vars(Free),
+ %% Add this free info to State.
+ St1 = foldl(fun ({N,#ifun{vars=Vs}}, Lst) ->
+ store_free(N, length(Vs), FreeVs, Lst)
+ end, St0, Fs),
+ %% Now regenerate local functions to use free variable information.
+ St2 = foldl(fun ({N,#ifun{anno=Fa,vars=Vs,body=Fb0}}, Lst0) ->
+ {Fb1,_,Lst1} = ubody(Fb0, return, Lst0),
+ Arity = length(Vs) + length(FreeVs),
+ Fun = #k_fdef{anno=#k{us=[],ns=[],a=Fa},
+ func=N,arity=Arity,
+ vars=Vs ++ FreeVs,body=Fb1},
+ Lst1#kern{funs=[Fun|Lst1#kern.funs]}
+ end, St1, Fs),
+ St2.
+
+%% is_exit_expr(Kexpr) -> boolean().
+%% Test whether Kexpr always exits and never returns.
+
+is_exit_expr(#k_call{op=#k_remote{mod=erlang,name=throw,arity=1}}) -> true;
+is_exit_expr(#k_call{op=#k_remote{mod=erlang,name=exit,arity=1}}) -> true;
+is_exit_expr(#k_call{op=#k_remote{mod=erlang,name=error,arity=1}}) -> true;
+is_exit_expr(#k_call{op=#k_remote{mod=erlang,name=error,arity=2}}) -> true;
+is_exit_expr(#k_call{op=#k_remote{mod=erlang,name=fault,arity=1}}) -> true;
+is_exit_expr(#k_call{op=#k_remote{mod=erlang,name=fault,arity=2}}) -> true;
+is_exit_expr(#k_call{op=#k_internal{name=match_fail,arity=1}}) -> true;
+is_exit_expr(#k_bif{op=#k_internal{name=rethrow,arity=2}}) -> true;
+is_exit_expr(#k_receive_next{}) -> true;
+is_exit_expr(_) -> false.
+
+%% is_enter_expr(Kexpr) -> boolean().
+%% Test whether Kexpr is "enterable", i.e. can handle return from
+%% within itself without extra #k_return{}.
+
+is_enter_expr(#k_call{}) -> true;
+is_enter_expr(#k_match{}) -> true;
+is_enter_expr(#k_receive{}) -> true;
+is_enter_expr(#k_receive_next{}) -> true;
+%%is_enter_expr(#k_try{}) -> true; %Soon
+is_enter_expr(_) -> false.
+
+%% uguard(Expr, State) -> {Expr,[UsedVar],State}.
+%% Tag the guard sequence with its used variables.
+
+uguard(#k_try{anno=A,arg=B0,vars=[#k_var{name=X}],body=#k_var{name=X},
+ handler=#k_atom{val=false}}=Try, St0) ->
+ {B1,Bu,St1} = uguard(B0, St0),
+ {Try#k_try{anno=#k{us=Bu,ns=[],a=A},arg=B1},Bu,St1};
+uguard(T, St) ->
+ %%ok = io:fwrite("~w: ~p~n", [?LINE,T]),
+ uguard_test(T, St).
+
+%% uguard_test(Expr, State) -> {Test,[UsedVar],State}.
+%% At this stage tests are just expressions which don't return any
+%% values.
+
+uguard_test(T, St) -> uguard_expr(T, [], St).
+
+uguard_expr(#iset{anno=A,vars=Vs,arg=E0,body=B0}, Rs, St0) ->
+ Ns = lit_list_vars(Vs),
+ {E1,Eu,St1} = uguard_expr(E0, Vs, St0),
+ {B1,Bu,St2} = uguard_expr(B0, Rs, St1),
+ Used = union(Eu, subtract(Bu, Ns)),
+ {#k_seq{anno=#k{us=Used,ns=Ns,a=A},arg=E1,body=B1},Used,St2};
+uguard_expr(#k_try{anno=A,arg=B0,vars=[#k_var{name=X}],body=#k_var{name=X},
+ handler=#k_atom{val=false}}=Try, Rs, St0) ->
+ {B1,Bu,St1} = uguard_expr(B0, Rs, St0),
+ {Try#k_try{anno=#k{us=Bu,ns=lit_list_vars(Rs),a=A},arg=B1,ret=Rs},
+ Bu,St1};
+uguard_expr(#k_test{anno=A,op=Op,args=As}=Test, Rs, St) ->
+ [] = Rs, %Sanity check
+ Used = union(op_vars(Op), lit_list_vars(As)),
+ {Test#k_test{anno=#k{us=Used,ns=lit_list_vars(Rs),a=A}},
+ Used,St};
+uguard_expr(#k_bif{anno=A,op=Op,args=As}=Bif, Rs, St) ->
+ Used = union(op_vars(Op), lit_list_vars(As)),
+ {Bif#k_bif{anno=#k{us=Used,ns=lit_list_vars(Rs),a=A},ret=Rs},
+ Used,St};
+uguard_expr(#ivalues{anno=A,args=As}, Rs, St) ->
+ Sets = foldr2(fun (V, Arg, Rhs) ->
+ #iset{anno=A,vars=[V],arg=Arg,body=Rhs}
+ end, #k_atom{val=true}, Rs, As),
+ uguard_expr(Sets, [], St);
+uguard_expr(#k_match{anno=A,vars=Vs,body=B0}, Rs, St0) ->
+ %% Experimental support for andalso/orelse in guards.
+ Br = case Rs of
+ [] -> return;
+ _ -> {break,Rs}
+ end,
+ {B1,Bu,St1} = umatch(B0, Br, St0),
+ {#k_match{anno=#k{us=Bu,ns=lit_list_vars(Rs),a=A},
+ vars=Vs,body=B1,ret=Rs},Bu,St1};
+uguard_expr(Lit, Rs, St) ->
+ %% Transform literals to puts here.
+ Used = lit_vars(Lit),
+ {#k_put{anno=#k{us=Used,ns=lit_list_vars(Rs),a=get_kanno(Lit)},
+ arg=Lit,ret=Rs},Used,St}.
+
+%% uexpr(Expr, Break, State) -> {Expr,[UsedVar],State}.
+%% Tag an expression with its used variables.
+%% Break = return | {break,[RetVar]}.
+
+uexpr(#k_call{anno=A,op=#k_local{name=F,arity=Ar}=Op,args=As0}=Call, Br, St) ->
+ Free = get_free(F, Ar, St),
+ As1 = As0 ++ Free, %Add free variables LAST!
+ Used = lit_list_vars(As1),
+ {case Br of
+ {break,Rs} ->
+ Call#k_call{anno=#k{us=Used,ns=lit_list_vars(Rs),a=A},
+ op=Op#k_local{arity=Ar + length(Free)},
+ args=As1,ret=Rs};
+ return ->
+ #k_enter{anno=#k{us=Used,ns=[],a=A},
+ op=Op#k_local{arity=Ar + length(Free)},
+ args=As1}
+ end,Used,St};
+uexpr(#k_call{anno=A,op=Op,args=As}=Call, {break,Rs}, St) ->
+ Used = union(op_vars(Op), lit_list_vars(As)),
+ {Call#k_call{anno=#k{us=Used,ns=lit_list_vars(Rs),a=A},ret=Rs},
+ Used,St};
+uexpr(#k_call{anno=A,op=Op,args=As}, return, St) ->
+ Used = union(op_vars(Op), lit_list_vars(As)),
+ {#k_enter{anno=#k{us=Used,ns=[],a=A},op=Op,args=As},
+ Used,St};
+uexpr(#k_bif{anno=A,op=Op,args=As}=Bif, {break,Rs}, St0) ->
+ Used = union(op_vars(Op), lit_list_vars(As)),
+ {Brs,St1} = bif_returns(Op, Rs, St0),
+ {Bif#k_bif{anno=#k{us=Used,ns=lit_list_vars(Brs),a=A},ret=Brs},
+ Used,St1};
+uexpr(#k_match{anno=A,vars=Vs,body=B0}, Br, St0) ->
+ Rs = break_rets(Br),
+ {B1,Bu,St1} = umatch(B0, Br, St0),
+ {#k_match{anno=#k{us=Bu,ns=lit_list_vars(Rs),a=A},
+ vars=Vs,body=B1,ret=Rs},Bu,St1};
+uexpr(#k_receive{anno=A,var=V,body=B0,timeout=T,action=A0}, Br, St0) ->
+ Rs = break_rets(Br),
+ Tu = lit_vars(T), %Timeout is atomic
+ {B1,Bu,St1} = umatch(B0, Br, St0),
+ {A1,Au,St2} = ubody(A0, Br, St1),
+ Used = del_element(V#k_var.name, union(Bu, union(Tu, Au))),
+ {#k_receive{anno=#k{us=Used,ns=lit_list_vars(Rs),a=A},
+ var=V,body=B1,timeout=T,action=A1,ret=Rs},
+ Used,St2};
+uexpr(#k_receive_accept{anno=A}, _, St) ->
+ {#k_receive_accept{anno=#k{us=[],ns=[],a=A}},[],St};
+uexpr(#k_receive_next{anno=A}, _, St) ->
+ {#k_receive_next{anno=#k{us=[],ns=[],a=A}},[],St};
+uexpr(#k_try{anno=A,arg=A0,vars=Vs,body=B0,evars=Evs,handler=H0},
+ {break,Rs0}, St0) ->
+ {Avs,St1} = new_vars(length(Vs), St0), %Need dummy names here
+ {A1,Au,St2} = ubody(A0, {break,Avs}, St1), %Must break to clean up here!
+ {B1,Bu,St3} = ubody(B0, {break,Rs0}, St2),
+ {H1,Hu,St4} = ubody(H0, {break,Rs0}, St3),
+ %% Guarantee ONE return variable.
+ NumNew = if
+ Rs0 =:= [] -> 1;
+ true -> 0
+ end,
+ {Ns,St5} = new_vars(NumNew, St4),
+ Rs1 = Rs0 ++ Ns,
+ Used = union([Au,subtract(Bu, lit_list_vars(Vs)),
+ subtract(Hu, lit_list_vars(Evs))]),
+ {#k_try{anno=#k{us=Used,ns=lit_list_vars(Rs1),a=A},
+ arg=A1,vars=Vs,body=B1,evars=Evs,handler=H1,ret=Rs1},
+ Used,St5};
+uexpr(#k_catch{anno=A,body=B0}, {break,Rs0}, St0) ->
+ {Rb,St1} = new_var(St0),
+ {B1,Bu,St2} = ubody(B0, {break,[Rb]}, St1),
+ %% Guarantee ONE return variable.
+ {Ns,St3} = new_vars(1 - length(Rs0), St2),
+ Rs1 = Rs0 ++ Ns,
+ {#k_catch{anno=#k{us=Bu,ns=lit_list_vars(Rs1),a=A},body=B1,ret=Rs1},Bu,St3};
+uexpr(#ifun{anno=A,vars=Vs,body=B0}=IFun, {break,Rs}, St0) ->
+ {B1,Bu,St1} = ubody(B0, return, St0), %Return out of new function
+ Ns = lit_list_vars(Vs),
+ Free = subtract(Bu, Ns), %Free variables in fun
+ Fvs = make_vars(Free),
+ Arity = length(Vs) + length(Free),
+ {{Index,Uniq,Fname}, St3} =
+ case lists:keysearch(id, 1, A) of
+ {value,{id,Id}} ->
+ {Id, St1};
+ false ->
+ %% No id annotation. Must invent one.
+ I = St1#kern.fcount,
+ U = erlang:hash(IFun, (1 bsl 27)-1),
+ {N, St2} = new_fun_name(St1),
+ {{I,U,N}, St2}
+ end,
+ Fun = #k_fdef{anno=#k{us=[],ns=[],a=A},func=Fname,arity=Arity,
+ vars=Vs ++ Fvs,body=B1},
+ {#k_bif{anno=#k{us=Free,ns=lit_list_vars(Rs),a=A},
+ op=#k_internal{name=make_fun,arity=length(Free)+3},
+ args=[#k_atom{val=Fname},#k_int{val=Arity},
+ #k_int{val=Index},#k_int{val=Uniq}|Fvs],
+ ret=Rs},
+% {#k_call{anno=#k{us=Free,ns=lit_list_vars(Rs),a=A},
+% op=#k_internal{name=make_fun,arity=length(Free)+3},
+% args=[#k_atom{val=Fname},#k_int{val=Arity},
+% #k_int{val=Index},#k_int{val=Uniq}|Fvs],
+% ret=Rs},
+ Free,St3#kern{funs=[Fun|St3#kern.funs]}};
+uexpr(Lit, {break,Rs}, St) ->
+ %% Transform literals to puts here.
+ %%ok = io:fwrite("uexpr ~w:~p~n", [?LINE,Lit]),
+ Used = lit_vars(Lit),
+ {#k_put{anno=#k{us=Used,ns=lit_list_vars(Rs),a=get_kanno(Lit)},
+ arg=Lit,ret=Rs},Used,St}.
+
+%% get_free(Name, Arity, State) -> [Free].
+%% store_free(Name, Arity, [Free], State) -> State.
+
+get_free(F, A, St) ->
+ case orddict:find({F,A}, St#kern.free) of
+ {ok,Val} -> Val;
+ error -> []
+ end.
+
+store_free(F, A, Free, St) ->
+ St#kern{free=orddict:store({F,A}, Free, St#kern.free)}.
+
+break_rets({break,Rs}) -> Rs;
+break_rets(return) -> [].
+
+%% bif_returns(Op, [Ret], State) -> {[Ret],State}.
+
+bif_returns(#k_remote{mod=M,name=N,arity=Ar}, Rs, St0) ->
+ %%ok = io:fwrite("uexpr ~w:~p~n", [?LINE,{M,N,Ar,Rs}]),
+ {Ns,St1} = new_vars(bif_vals(M, N, Ar) - length(Rs), St0),
+ {Rs ++ Ns,St1};
+bif_returns(#k_internal{name=N,arity=Ar}, Rs, St0) ->
+ %%ok = io:fwrite("uexpr ~w:~p~n", [?LINE,{N,Ar,Rs}]),
+ {Ns,St1} = new_vars(bif_vals(N, Ar) - length(Rs), St0),
+ {Rs ++ Ns,St1}.
+
+%% umatch(Match, Break, State) -> {Match,[UsedVar],State}.
+%% Tag a match expression with its used variables.
+
+umatch(#k_alt{anno=A,first=F0,then=T0}, Br, St0) ->
+ {F1,Fu,St1} = umatch(F0, Br, St0),
+ {T1,Tu,St2} = umatch(T0, Br, St1),
+ Used = union(Fu, Tu),
+ {#k_alt{anno=#k{us=Used,ns=[],a=A},first=F1,then=T1},
+ Used,St2};
+umatch(#k_select{anno=A,var=V,types=Ts0}, Br, St0) ->
+ {Ts1,Tus,St1} = umatch_list(Ts0, Br, St0),
+ Used = add_element(V#k_var.name, Tus),
+ {#k_select{anno=#k{us=Used,ns=[],a=A},var=V,types=Ts1},Used,St1};
+umatch(#k_type_clause{anno=A,type=T,values=Vs0}, Br, St0) ->
+ {Vs1,Vus,St1} = umatch_list(Vs0, Br, St0),
+ {#k_type_clause{anno=#k{us=Vus,ns=[],a=A},type=T,values=Vs1},Vus,St1};
+umatch(#k_val_clause{anno=A,val=P,body=B0}, Br, St0) ->
+ {U0,Ps} = pat_vars(P),
+ {B1,Bu,St1} = umatch(B0, Br, St0),
+ Used = union(U0, subtract(Bu, Ps)),
+ {#k_val_clause{anno=#k{us=Used,ns=[],a=A},val=P,body=B1},
+ Used,St1};
+umatch(#k_guard{anno=A,clauses=Gs0}, Br, St0) ->
+ {Gs1,Gus,St1} = umatch_list(Gs0, Br, St0),
+ {#k_guard{anno=#k{us=Gus,ns=[],a=A},clauses=Gs1},Gus,St1};
+umatch(#k_guard_clause{anno=A,guard=G0,body=B0}, Br, St0) ->
+ %%ok = io:fwrite("~w: ~p~n", [?LINE,G0]),
+ {G1,Gu,St1} = uguard(G0, St0),
+ %%ok = io:fwrite("~w: ~p~n", [?LINE,G1]),
+ {B1,Bu,St2} = umatch(B0, Br, St1),
+ Used = union(Gu, Bu),
+ {#k_guard_clause{anno=#k{us=Used,ns=[],a=A},guard=G1,body=B1},Used,St2};
+umatch(B0, Br, St0) -> ubody(B0, Br, St0).
+
+umatch_list(Ms0, Br, St) ->
+ foldr(fun (M0, {Ms1,Us,Sta}) ->
+ {M1,Mu,Stb} = umatch(M0, Br, Sta),
+ {[M1|Ms1],union(Mu, Us),Stb}
+ end, {[],[],St}, Ms0).
+
+%% op_vars(Op) -> [VarName].
+
+op_vars(#k_local{}) -> [];
+op_vars(#k_remote{mod=Mod,name=Name}) ->
+ ordsets:from_list([V || #k_var{name=V} <- [Mod,Name]]);
+op_vars(#k_internal{}) -> [];
+op_vars(Atomic) -> lit_vars(Atomic).
+
+%% lit_vars(Literal) -> [VarName].
+%% Return the variables in a literal.
+
+lit_vars(#k_var{name=N}) -> [N];
+lit_vars(#k_int{}) -> [];
+lit_vars(#k_float{}) -> [];
+lit_vars(#k_atom{}) -> [];
+%%lit_vars(#k_char{}) -> [];
+lit_vars(#k_string{}) -> [];
+lit_vars(#k_nil{}) -> [];
+lit_vars(#k_cons{hd=H,tl=T}) ->
+ union(lit_vars(H), lit_vars(T));
+lit_vars(#k_binary{segs=V}) -> lit_vars(V);
+lit_vars(#k_bin_end{}) -> [];
+lit_vars(#k_bin_seg{size=Size,seg=S,next=N}) ->
+ union(lit_vars(Size), union(lit_vars(S), lit_vars(N)));
+lit_vars(#k_tuple{es=Es}) ->
+ lit_list_vars(Es).
+
+lit_list_vars(Ps) ->
+ foldl(fun (P, Vs) -> union(lit_vars(P), Vs) end, [], Ps).
+
+%% pat_vars(Pattern) -> {[UsedVarName],[NewVarName]}.
+%% Return variables in a pattern. All variables are new variables
+%% except those in the size field of binary segments.
+
+pat_vars(#k_var{name=N}) -> {[],[N]};
+%%pat_vars(#k_char{}) -> {[],[]};
+pat_vars(#k_int{}) -> {[],[]};
+pat_vars(#k_float{}) -> {[],[]};
+pat_vars(#k_atom{}) -> {[],[]};
+pat_vars(#k_string{}) -> {[],[]};
+pat_vars(#k_nil{}) -> {[],[]};
+pat_vars(#k_cons{hd=H,tl=T}) ->
+ pat_list_vars([H,T]);
+pat_vars(#k_binary{segs=V}) ->
+ pat_vars(V);
+pat_vars(#k_bin_seg{size=Size,seg=S,next=N}) ->
+ {U1,New} = pat_list_vars([S,N]),
+ {[],U2} = pat_vars(Size),
+ {union(U1, U2),New};
+pat_vars(#k_bin_end{}) -> {[],[]};
+pat_vars(#k_tuple{es=Es}) ->
+ pat_list_vars(Es).
+
+pat_list_vars(Ps) ->
+ foldl(fun (P, {Used0,New0}) ->
+ {Used,New} = pat_vars(P),
+ {union(Used0, Used),union(New0, New)} end,
+ {[],[]}, Ps).
+
+%% aligned(Bits, Size, Unit, Flags) -> {Size,Flags}
+%% Add 'aligned' to the flags if the current field is aligned.
+%% Number of bits correct modulo 8.
+
+aligned(B, S, U, Fs) when B rem 8 =:= 0 ->
+ {incr_bits(B, S, U),[aligned|Fs]};
+aligned(B, S, U, Fs) ->
+ {incr_bits(B, S, U),Fs}.
+
+incr_bits(B, #k_int{val=S}, U) when integer(B) -> B + S*U;
+incr_bits(_, #k_atom{val=all}, _) -> 0; %Always aligned
+incr_bits(B, _, 8) -> B;
+incr_bits(_, _, _) -> unknown.
+
+make_list(Es) ->
+ foldr(fun (E, Acc) -> #c_cons{hd=E,tl=Acc} end, #c_nil{}, Es).
+
+%% List of integers in interval [N,M]. Empty list if N > M.
+
+integers(N, M) when N =< M ->
+ [N|integers(N + 1, M)];
+integers(_, _) -> [].
+
+%%%
+%%% Handling of warnings.
+%%%
+
+format_error({nomatch_shadow,Line}) ->
+ M = io_lib:format("this clause cannot match because a previous clause at line ~p "
+ "always matches", [Line]),
+ lists:flatten(M);
+format_error(nomatch_shadow) ->
+ "this clause cannot match because a previous clause always matches".
+
+add_warning(none, Term, #kern{ws=Ws}=St) ->
+ St#kern{ws=[{?MODULE,Term}|Ws]};
+add_warning(Line, Term, #kern{ws=Ws}=St) when Line >= 0 ->
+ St#kern{ws=[{Line,?MODULE,Term}|Ws]};
+add_warning(_, _, St) -> St.
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_kernel.hrl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_kernel.hrl
new file mode 100644
index 0000000000..6e97d4d66a
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_kernel.hrl
@@ -0,0 +1,77 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: v3_kernel.hrl,v 1.1 2008/12/17 09:53:43 mikpe Exp $
+%%
+
+%% Purpose : Kernel Erlang as records.
+
+%% It would be nice to incorporate some generic functions as well but
+%% this could make including this file difficult.
+%% N.B. the annotation field is ALWAYS the first field!
+
+%% Kernel annotation record.
+-record(k, {us, %Used variables
+ ns, %New variables
+ a}). %Core annotation
+
+%% Literals
+%% NO CHARACTERS YET.
+%%-record(k_char, {anno=[],val}).
+-record(k_int, {anno=[],val}).
+-record(k_float, {anno=[],val}).
+-record(k_atom, {anno=[],val}).
+-record(k_string, {anno=[],val}).
+-record(k_nil, {anno=[]}).
+
+-record(k_tuple, {anno=[],es}).
+-record(k_cons, {anno=[],hd,tl}).
+-record(k_binary, {anno=[],segs}).
+-record(k_bin_seg, {anno=[],size,unit,type,flags,seg,next}).
+-record(k_bin_end, {anno=[]}).
+-record(k_var, {anno=[],name}).
+
+-record(k_local, {anno=[],name,arity}).
+-record(k_remote, {anno=[],mod,name,arity}).
+-record(k_internal, {anno=[],name,arity}).
+
+-record(k_mdef, {anno=[],name,exports,attributes,body}).
+-record(k_fdef, {anno=[],func,arity,vars,body}).
+
+-record(k_seq, {anno=[],arg,body}).
+-record(k_put, {anno=[],arg,ret=[]}).
+-record(k_bif, {anno=[],op,args,ret=[]}).
+-record(k_test, {anno=[],op,args}).
+-record(k_call, {anno=[],op,args,ret=[]}).
+-record(k_enter, {anno=[],op,args}).
+-record(k_receive, {anno=[],var,body,timeout,action,ret=[]}).
+-record(k_receive_accept, {anno=[]}).
+-record(k_receive_next, {anno=[]}).
+-record(k_try, {anno=[],arg,vars,body,evars,handler,ret=[]}).
+-record(k_catch, {anno=[],body,ret=[]}).
+
+-record(k_match, {anno=[],vars,body,ret=[]}).
+-record(k_alt, {anno=[],first,then}).
+-record(k_select, {anno=[],var,types}).
+-record(k_type_clause, {anno=[],type,values}).
+-record(k_val_clause, {anno=[],val,body}).
+-record(k_guard, {anno=[],clauses}).
+-record(k_guard_clause, {anno=[],guard,body}).
+
+-record(k_break, {anno=[],args=[]}).
+-record(k_return, {anno=[],args=[]}).
+
+%%k_get_anno(Thing) -> element(2, Thing).
+%%k_set_anno(Thing, Anno) -> setelement(2, Thing, Anno).
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_kernel_pp.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_kernel_pp.erl
new file mode 100644
index 0000000000..41f59b7a81
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_kernel_pp.erl
@@ -0,0 +1,444 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: v3_kernel_pp.erl,v 1.1 2008/12/17 09:53:43 mikpe Exp $
+%%
+%% Purpose : Kernel Erlang (naive) prettyprinter
+
+-module(v3_kernel_pp).
+
+-include("v3_kernel.hrl").
+
+-export([format/1]).
+
+%% These are "internal" structures in sys_kernel which are here for
+%% debugging purposes.
+-record(iset, {anno=[],vars,arg,body}).
+-record(ifun, {anno=[],vars,body}).
+
+%% ====================================================================== %%
+%% format(Node) -> Text
+%% Node = coreErlang()
+%% Text = string() | [Text]
+%%
+%% Prettyprint-formats (naively) an abstract Core Erlang syntax
+%% tree.
+
+-record(ctxt, {indent = 0,
+ item_indent = 2,
+ body_indent = 2,
+ tab_width = 8}).
+
+canno(Cthing) -> element(2, Cthing).
+
+format(Node) -> format(Node, #ctxt{}).
+
+format(Node, Ctxt) ->
+ case canno(Node) of
+ [] ->
+ format_1(Node, Ctxt);
+ List ->
+ format_anno(List, Ctxt, fun (Ctxt1) -> format_1(Node, Ctxt1) end)
+ end.
+
+format_anno(Anno, Ctxt, ObjFun) ->
+ Ctxt1 = ctxt_bump_indent(Ctxt, 2),
+ ["( ",
+ ObjFun(Ctxt1),
+ nl_indent(Ctxt1),
+ "-| ",io_lib:write(Anno),
+ " )"].
+
+%% format_1(Kexpr, Context) -> string().
+
+format_1(#k_atom{val=A}, _Ctxt) -> core_atom(A);
+%%format_1(#k_char{val=C}, _Ctxt) -> io_lib:write_char(C);
+format_1(#k_float{val=F}, _Ctxt) -> float_to_list(F);
+format_1(#k_int{val=I}, _Ctxt) -> integer_to_list(I);
+format_1(#k_nil{}, _Ctxt) -> "[]";
+format_1(#k_string{val=S}, _Ctxt) -> io_lib:write_string(S);
+format_1(#k_var{name=V}, _Ctxt) ->
+ if atom(V) ->
+ case atom_to_list(V) of
+ [$_|Cs] -> "_X" ++ Cs;
+ [C|Cs] when C >= $A, C =< $Z -> [C|Cs];
+ Cs -> [$_|Cs]
+ end;
+ integer(V) -> [$_|integer_to_list(V)]
+ end;
+format_1(#k_cons{hd=H,tl=T}, Ctxt) ->
+ Txt = ["["|format(H, ctxt_bump_indent(Ctxt, 1))],
+ [Txt|format_list_tail(T, ctxt_bump_indent(Ctxt, width(Txt, Ctxt)))];
+format_1(#k_tuple{es=Es}, Ctxt) ->
+ [${,
+ format_hseq(Es, ",", ctxt_bump_indent(Ctxt, 1), fun format/2),
+ $}
+ ];
+format_1(#k_binary{segs=S}, Ctxt) ->
+ ["#<",format(S, ctxt_bump_indent(Ctxt, 2)),">#"];
+format_1(#k_bin_seg{}=S, Ctxt) ->
+ [format_bin_seg_1(S, Ctxt),
+ format_bin_seg(S#k_bin_seg.next, ctxt_bump_indent(Ctxt, 2))];
+format_1(#k_bin_end{}, _Ctxt) -> "#<>#";
+format_1(#k_local{name=N,arity=A}, Ctxt) ->
+ "local " ++ format_fa_pair({N,A}, Ctxt);
+format_1(#k_remote{mod=M,name=N,arity=A}, _Ctxt) ->
+ %% This is for our internal translator.
+ io_lib:format("remote ~s:~s/~w", [format(M),format(N),A]);
+format_1(#k_internal{name=N,arity=A}, Ctxt) ->
+ "internal " ++ format_fa_pair({N,A}, Ctxt);
+format_1(#k_seq{arg=A,body=B}, Ctxt) ->
+ Ctxt1 = ctxt_bump_indent(Ctxt, 2),
+ ["do",
+ nl_indent(Ctxt1),
+ format(A, Ctxt1),
+ nl_indent(Ctxt),
+ "then",
+ nl_indent(Ctxt)
+ | format(B, Ctxt)
+ ];
+format_1(#k_match{vars=Vs,body=Bs,ret=Rs}, Ctxt) ->
+ Ctxt1 = ctxt_bump_indent(Ctxt, Ctxt#ctxt.item_indent),
+ ["match ",
+ format_hseq(Vs, ",", ctxt_bump_indent(Ctxt, 6), fun format/2),
+ nl_indent(Ctxt1),
+ format(Bs, Ctxt1),
+ nl_indent(Ctxt),
+ "end",
+ format_ret(Rs, Ctxt1)
+ ];
+format_1(#k_alt{first=O,then=T}, Ctxt) ->
+ Ctxt1 = ctxt_bump_indent(Ctxt, Ctxt#ctxt.item_indent),
+ ["alt",
+ nl_indent(Ctxt1),
+ format(O, Ctxt1),
+ nl_indent(Ctxt1),
+ format(T, Ctxt1)];
+format_1(#k_select{var=V,types=Cs}, Ctxt) ->
+ Ctxt1 = ctxt_bump_indent(Ctxt, 2),
+ ["select ",
+ format(V, Ctxt),
+ nl_indent(Ctxt1),
+ format_vseq(Cs, "", "", Ctxt1, fun format/2)
+ ];
+format_1(#k_type_clause{type=T,values=Cs}, Ctxt) ->
+ Ctxt1 = ctxt_bump_indent(Ctxt, Ctxt#ctxt.body_indent),
+ ["type ",
+ io_lib:write(T),
+ nl_indent(Ctxt1),
+ format_vseq(Cs, "", "", Ctxt1, fun format/2)
+ ];
+format_1(#k_val_clause{val=Val,body=B}, Ctxt) ->
+ Ctxt1 = ctxt_bump_indent(Ctxt, Ctxt#ctxt.body_indent),
+ [format(Val, Ctxt),
+ " ->",
+ nl_indent(Ctxt1)
+ | format(B, Ctxt1)
+ ];
+format_1(#k_guard{clauses=Gs}, Ctxt) ->
+ Ctxt1 = ctxt_bump_indent(Ctxt, 5),
+ ["when ",
+ nl_indent(Ctxt1),
+ format_vseq(Gs, "", "", Ctxt1, fun format/2)];
+format_1(#k_guard_clause{guard=G,body=B}, Ctxt) ->
+ Ctxt1 = ctxt_bump_indent(Ctxt, Ctxt#ctxt.body_indent),
+ [format(G, Ctxt),
+ nl_indent(Ctxt),
+ "->",
+ nl_indent(Ctxt1)
+ | format(B, Ctxt1)
+ ];
+format_1(#k_call{op=Op,args=As,ret=Rs}, Ctxt) ->
+ Txt = ["call (",format(Op, ctxt_bump_indent(Ctxt, 6)),$)],
+ Ctxt1 = ctxt_bump_indent(Ctxt, 2),
+ [Txt,format_args(As, Ctxt1),
+ format_ret(Rs, Ctxt1)
+ ];
+format_1(#k_enter{op=Op,args=As}, Ctxt) ->
+ Txt = ["enter (",format(Op, ctxt_bump_indent(Ctxt, 7)),$)],
+ Ctxt1 = ctxt_bump_indent(Ctxt, 2),
+ [Txt,format_args(As, Ctxt1)];
+format_1(#k_bif{op=Op,args=As,ret=Rs}, Ctxt) ->
+ Txt = ["bif (",format(Op, ctxt_bump_indent(Ctxt, 5)),$)],
+ Ctxt1 = ctxt_bump_indent(Ctxt, 2),
+ [Txt,format_args(As, Ctxt1),
+ format_ret(Rs, Ctxt1)
+ ];
+format_1(#k_test{op=Op,args=As}, Ctxt) ->
+ Txt = ["test (",format(Op, ctxt_bump_indent(Ctxt, 6)),$)],
+ Ctxt1 = ctxt_bump_indent(Ctxt, 2),
+ [Txt,format_args(As, Ctxt1)];
+format_1(#k_put{arg=A,ret=Rs}, Ctxt) ->
+ [format(A, Ctxt),
+ format_ret(Rs, ctxt_bump_indent(Ctxt, 1))
+ ];
+format_1(#k_try{arg=A,vars=Vs,body=B,evars=Evs,handler=H,ret=Rs}, Ctxt) ->
+ Ctxt1 = ctxt_bump_indent(Ctxt, Ctxt#ctxt.body_indent),
+ ["try",
+ nl_indent(Ctxt1),
+ format(A, Ctxt1),
+ nl_indent(Ctxt),
+ "of ",
+ format_hseq(Vs, ", ", ctxt_bump_indent(Ctxt, 3), fun format/2),
+ nl_indent(Ctxt1),
+ format(B, Ctxt1),
+ nl_indent(Ctxt),
+ "catch ",
+ format_hseq(Evs, ", ", ctxt_bump_indent(Ctxt, 6), fun format/2),
+ nl_indent(Ctxt1),
+ format(H, Ctxt1),
+ nl_indent(Ctxt),
+ "end",
+ format_ret(Rs, Ctxt1)
+ ];
+format_1(#k_catch{body=B,ret=Rs}, Ctxt) ->
+ Ctxt1 = ctxt_bump_indent(Ctxt, Ctxt#ctxt.body_indent),
+ ["catch",
+ nl_indent(Ctxt1),
+ format(B, Ctxt1),
+ nl_indent(Ctxt),
+ "end",
+ format_ret(Rs, Ctxt1)
+ ];
+format_1(#k_receive{var=V,body=B,timeout=T,action=A,ret=Rs}, Ctxt) ->
+ Ctxt1 = ctxt_bump_indent(Ctxt, Ctxt#ctxt.item_indent),
+ ["receive ",
+ format(V, Ctxt),
+ nl_indent(Ctxt1),
+ format(B, Ctxt1),
+ nl_indent(Ctxt),
+ "after ",
+ format(T, ctxt_bump_indent(Ctxt, 6)),
+ " ->",
+ nl_indent(Ctxt1),
+ format(A, Ctxt1),
+ nl_indent(Ctxt),
+ "end",
+ format_ret(Rs, Ctxt1)
+ ];
+format_1(#k_receive_accept{}, _Ctxt) -> "receive_accept";
+format_1(#k_receive_next{}, _Ctxt) -> "receive_next";
+format_1(#k_break{args=As}, Ctxt) ->
+ ["<",
+ format_hseq(As, ",", ctxt_bump_indent(Ctxt, 1), fun format/2),
+ ">"
+ ];
+format_1(#k_return{args=As}, Ctxt) ->
+ ["<<",
+ format_hseq(As, ",", ctxt_bump_indent(Ctxt, 1), fun format/2),
+ ">>"
+ ];
+format_1(#k_fdef{func=F,arity=A,vars=Vs,body=B}, Ctxt) ->
+ Ctxt1 = ctxt_bump_indent(Ctxt, Ctxt#ctxt.body_indent),
+ ["fdef ",
+ format_fa_pair({F,A}, ctxt_bump_indent(Ctxt, 5)),
+ format_args(Vs, ctxt_bump_indent(Ctxt, 14)),
+ " =",
+ nl_indent(Ctxt1),
+ format(B, Ctxt1)
+ ];
+format_1(#k_mdef{name=N,exports=Es,attributes=As,body=B}, Ctxt) ->
+ ["module ",
+ format(#k_atom{val=N}, ctxt_bump_indent(Ctxt, 7)),
+ nl_indent(Ctxt),
+ "export [",
+ format_vseq(Es,
+ "", ",",
+ ctxt_bump_indent(Ctxt, 8),
+ fun format_fa_pair/2),
+ "]",
+ nl_indent(Ctxt),
+ "attributes [",
+ format_vseq(As,
+ "", ",",
+ ctxt_bump_indent(Ctxt, 12),
+ fun format_attribute/2),
+ "]",
+ nl_indent(Ctxt),
+ format_vseq(B,
+ "", "",
+ Ctxt,
+ fun format/2),
+ nl_indent(Ctxt)
+ | "end"
+ ];
+%% Internal sys_kernel structures.
+format_1(#iset{vars=Vs,arg=A,body=B}, Ctxt) ->
+ Ctxt1 = ctxt_bump_indent(Ctxt, Ctxt#ctxt.body_indent),
+ ["set <",
+ format_hseq(Vs, ", ", ctxt_bump_indent(Ctxt, 5), fun format/2),
+ "> =",
+ nl_indent(Ctxt1),
+ format(A, Ctxt1),
+ nl_indent(Ctxt),
+ "in "
+ | format(B, ctxt_bump_indent(Ctxt, 2))
+ ];
+format_1(#ifun{vars=Vs,body=B}, Ctxt) ->
+ Ctxt1 = ctxt_bump_indent(Ctxt, Ctxt#ctxt.body_indent),
+ ["fun ",
+ format_args(Vs, ctxt_bump_indent(Ctxt, 4)),
+ " ->",
+ nl_indent(Ctxt1)
+ | format(B, Ctxt1)
+ ];
+format_1(Type, _Ctxt) ->
+ ["** Unsupported type: ",
+ io_lib:write(Type)
+ | " **"
+ ].
+
+%% format_ret([RetVar], Context) -> Txt.
+%% Format the return vars of kexpr.
+
+format_ret(Rs, Ctxt) ->
+ [" >> ",
+ "<",
+ format_hseq(Rs, ",", ctxt_bump_indent(Ctxt, 5), fun format/2),
+ ">"].
+
+%% format_args([Arg], Context) -> Txt.
+%% Format arguments.
+
+format_args(As, Ctxt) ->
+ [$(,format_hseq(As, ", ", ctxt_bump_indent(Ctxt, 1), fun format/2),$)].
+
+%% format_hseq([Thing], Separator, Context, Fun) -> Txt.
+%% Format a sequence horizontally.
+
+format_hseq([H], _Sep, Ctxt, Fun) ->
+ Fun(H, Ctxt);
+format_hseq([H|T], Sep, Ctxt, Fun) ->
+ Txt = [Fun(H, Ctxt)|Sep],
+ Ctxt1 = ctxt_bump_indent(Ctxt, width(Txt, Ctxt)),
+ [Txt|format_hseq(T, Sep, Ctxt1, Fun)];
+format_hseq([], _, _, _) -> "".
+
+%% format_vseq([Thing], LinePrefix, LineSuffix, Context, Fun) -> Txt.
+%% Format a sequence vertically.
+
+format_vseq([H], _Pre, _Suf, Ctxt, Fun) ->
+ Fun(H, Ctxt);
+format_vseq([H|T], Pre, Suf, Ctxt, Fun) ->
+ [Fun(H, Ctxt),Suf,nl_indent(Ctxt),Pre|
+ format_vseq(T, Pre, Suf, Ctxt, Fun)];
+format_vseq([], _, _, _, _) -> "".
+
+format_fa_pair({F,A}, _Ctxt) -> [core_atom(F),$/,integer_to_list(A)].
+
+%% format_attribute({Name,Val}, Context) -> Txt.
+
+format_attribute({Name,Val}, Ctxt) when list(Val) ->
+ Txt = format(#k_atom{val=Name}, Ctxt),
+ Ctxt1 = ctxt_bump_indent(Ctxt, width(Txt,Ctxt)+4),
+ [Txt," = ",
+ $[,format_vseq(Val, "", ",", Ctxt1,
+ fun (A, _C) -> io_lib:write(A) end),$]
+ ];
+format_attribute({Name,Val}, Ctxt) ->
+ Txt = format(#k_atom{val=Name}, Ctxt),
+ [Txt," = ",io_lib:write(Val)].
+
+format_list_tail(#k_nil{anno=[]}, _Ctxt) -> "]";
+format_list_tail(#k_cons{anno=[],hd=H,tl=T}, Ctxt) ->
+ Txt = [$,|format(H, Ctxt)],
+ Ctxt1 = ctxt_bump_indent(Ctxt, width(Txt, Ctxt)),
+ [Txt|format_list_tail(T, Ctxt1)];
+format_list_tail(Tail, Ctxt) ->
+ ["|",format(Tail, ctxt_bump_indent(Ctxt, 1)), "]"].
+
+format_bin_seg(#k_bin_end{anno=[]}, _Ctxt) -> "";
+format_bin_seg(#k_bin_seg{anno=[],next=N}=Seg, Ctxt) ->
+ Txt = [$,|format_bin_seg_1(Seg, Ctxt)],
+ [Txt|format_bin_seg(N, ctxt_bump_indent(Ctxt, width(Txt, Ctxt)))];
+format_bin_seg(Seg, Ctxt) ->
+ ["|",format(Seg, ctxt_bump_indent(Ctxt, 2))].
+
+format_bin_seg_1(#k_bin_seg{size=S,unit=U,type=T,flags=Fs,seg=Seg}, Ctxt) ->
+ [format(Seg, Ctxt),
+ ":",format(S, Ctxt),"*",io_lib:write(U),
+ ":",io_lib:write(T),
+ lists:map(fun (F) -> [$-,io_lib:write(F)] end, Fs)
+ ].
+
+% format_bin_elements(#k_binary_cons{hd=H,tl=T,size=S,info=I}, Ctxt) ->
+% A = canno(T),
+% Fe = fun (Eh, Es, Ei, Ct) ->
+% [format(Eh, Ct),":",format(Es, Ct),"/",io_lib:write(Ei)]
+% end,
+% case T of
+% #k_zero_binary{} when A == [] ->
+% Fe(H, S, I, Ctxt);
+% #k_binary_cons{} when A == [] ->
+% Txt = [Fe(H, S, I, Ctxt)|","],
+% Ctxt1 = ctxt_bump_indent(Ctxt, width(Txt, Ctxt)),
+% [Txt|format_bin_elements(T, Ctxt1)];
+% _ ->
+% Txt = [Fe(H, S, I, Ctxt)|"|"],
+% [Txt|format(T, ctxt_bump_indent(Ctxt, width(Txt, Ctxt)))]
+% end.
+
+indent(Ctxt) -> indent(Ctxt#ctxt.indent, Ctxt).
+
+indent(N, _Ctxt) when N =< 0 -> "";
+indent(N, Ctxt) ->
+ T = Ctxt#ctxt.tab_width,
+ string:chars($\t, N div T, string:chars($\s, N rem T)).
+
+nl_indent(Ctxt) -> [$\n|indent(Ctxt)].
+
+
+unindent(T, Ctxt) ->
+ unindent(T, Ctxt#ctxt.indent, Ctxt, []).
+
+unindent(T, N, _Ctxt, C) when N =< 0 ->
+ [T|C];
+unindent([$\s|T], N, Ctxt, C) ->
+ unindent(T, N - 1, Ctxt, C);
+unindent([$\t|T], N, Ctxt, C) ->
+ Tab = Ctxt#ctxt.tab_width,
+ if N >= Tab ->
+ unindent(T, N - Tab, Ctxt, C);
+ true ->
+ unindent([string:chars($\s, Tab - N)|T], 0, Ctxt, C)
+ end;
+unindent([L|T], N, Ctxt, C) when list(L) ->
+ unindent(L, N, Ctxt, [T|C]);
+unindent([H|T], _N, _Ctxt, C) ->
+ [H|[T|C]];
+unindent([], N, Ctxt, [H|T]) ->
+ unindent(H, N, Ctxt, T);
+unindent([], _, _, []) -> [].
+
+
+width(Txt, Ctxt) ->
+ width(Txt, 0, Ctxt, []).
+
+width([$\t|T], A, Ctxt, C) ->
+ width(T, A + Ctxt#ctxt.tab_width, Ctxt, C);
+width([$\n|T], _A, Ctxt, C) ->
+ width(unindent([T|C], Ctxt), Ctxt);
+width([H|T], A, Ctxt, C) when list(H) ->
+ width(H, A, Ctxt, [T|C]);
+width([_|T], A, Ctxt, C) ->
+ width(T, A + 1, Ctxt, C);
+width([], A, Ctxt, [H|T]) ->
+ width(H, A, Ctxt, T);
+width([], A, _, []) -> A.
+
+ctxt_bump_indent(Ctxt, Dx) ->
+ Ctxt#ctxt{indent=Ctxt#ctxt.indent + Dx}.
+
+core_atom(A) -> io_lib:write_string(atom_to_list(A), $').
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_life.erl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_life.erl
new file mode 100644
index 0000000000..9579b5f46a
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_life.erl
@@ -0,0 +1,448 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: v3_life.erl,v 1.2 2010/03/04 13:54:20 maria Exp $
+%%
+%% Purpose : Convert annotated kernel expressions to annotated beam format.
+
+%% This module creates beam format annotated with variable lifetime
+%% information. Each thing is given an index and for each variable we
+%% store the first and last index for its occurrence. The variable
+%% database, VDB, attached to each thing is only relevant internally
+%% for that thing.
+%%
+%% For nested things like matches the numbering continues locally and
+%% the VDB for that thing refers to the variable usage within that
+%% thing. Variables which live through a such a thing are internally
+%% given a very large last index. Internally the indexes continue
+%% after the index of that thing. This creates no problems as the
+%% internal variable info never escapes and externally we only see
+%% variable which are alive both before or after.
+%%
+%% This means that variables never "escape" from a thing and the only
+%% way to get values from a thing is to "return" them, with 'break' or
+%% 'return'. Externally these values become the return values of the
+%% thing. This is no real limitation as most nested things have
+%% multiple threads so working out a common best variable usage is
+%% difficult.
+
+-module(v3_life).
+
+-export([module/2]).
+
+-export([vdb_find/2]).
+
+-import(lists, [map/2,foldl/3]).
+-import(ordsets, [add_element/2,intersection/2,union/2,union/1]).
+
+-include("v3_kernel.hrl").
+-include("v3_life.hrl").
+
+%% These are not defined in v3_kernel.hrl.
+get_kanno(Kthing) -> element(2, Kthing).
+%%set_kanno(Kthing, Anno) -> setelement(2, Kthing, Anno).
+
+module(#k_mdef{name=M,exports=Es,attributes=As,body=Fs0}, Opts) ->
+ put(?MODULE, Opts),
+ Fs1 = map(fun function/1, Fs0),
+ erase(?MODULE),
+ {ok,{M,Es,As,Fs1}}.
+
+%% function(Kfunc) -> Func.
+
+function(#k_fdef{func=F,arity=Ar,vars=Vs,body=Kb}) ->
+ %%ok = io:fwrite("life ~w: ~p~n", [?LINE,{F,Ar}]),
+ As = var_list(Vs),
+ Vdb0 = foldl(fun ({var,N}, Vdb) -> new_var(N, 0, Vdb) end, [], As),
+ %% Force a top-level match!
+ B0 = case Kb of
+ #k_match{} -> Kb;
+ _ ->
+ Ka = get_kanno(Kb),
+ #k_match{anno=#k{us=Ka#k.us,ns=[],a=Ka#k.a},
+ vars=Vs,body=Kb,ret=[]}
+ end,
+ {B1,_,Vdb1} = body(B0, 1, Vdb0),
+ {function,F,Ar,As,B1,Vdb1}.
+
+%% body(Kbody, I, Vdb) -> {[Expr],MaxI,Vdb}.
+%% Handle a body, need special cases for transforming match_fails.
+%% We KNOW that they only occur last in a body.
+
+body(#k_seq{arg=#k_put{anno=Pa,arg=Arg,ret=[R]},
+ body=#k_enter{anno=Ea,op=#k_internal{name=match_fail,arity=1},
+ args=[R]}},
+ I, Vdb0) ->
+ Vdb1 = use_vars(Pa#k.us, I, Vdb0), %All used here
+ {[match_fail(Arg, I, Pa#k.a ++ Ea#k.a)],I,Vdb1};
+body(#k_enter{anno=Ea,op=#k_internal{name=match_fail,arity=1},args=[Arg]},
+ I, Vdb0) ->
+ Vdb1 = use_vars(Ea#k.us, I, Vdb0),
+ {[match_fail(Arg, I, Ea#k.a)],I,Vdb1};
+body(#k_seq{arg=Ke,body=Kb}, I, Vdb0) ->
+ %%ok = io:fwrite("life ~w:~p~n", [?LINE,{Ke,I,Vdb0}]),
+ A = get_kanno(Ke),
+ Vdb1 = use_vars(A#k.us, I, new_vars(A#k.ns, I, Vdb0)),
+ {Es,MaxI,Vdb2} = body(Kb, I+1, Vdb1),
+ E = expr(Ke, I, Vdb2),
+ {[E|Es],MaxI,Vdb2};
+body(Ke, I, Vdb0) ->
+ %%ok = io:fwrite("life ~w:~p~n", [?LINE,{Ke,I,Vdb0}]),
+ A = get_kanno(Ke),
+ Vdb1 = use_vars(A#k.us, I, new_vars(A#k.ns, I, Vdb0)),
+ E = expr(Ke, I, Vdb1),
+ {[E],I,Vdb1}.
+
+%% guard(Kguard, I, Vdb) -> Guard.
+
+guard(#k_try{anno=A,arg=Ts,vars=[#k_var{name=X}],body=#k_var{name=X},
+ handler=#k_atom{val=false},ret=Rs}, I, Vdb) ->
+ %% Lock variables that are alive before try and used afterwards.
+ %% Don't lock variables that are only used inside the try expression.
+ Pdb0 = vdb_sub(I, I+1, Vdb),
+ {T,MaxI,Pdb1} = guard_body(Ts, I+1, Pdb0),
+ Pdb2 = use_vars(A#k.ns, MaxI+1, Pdb1), %Save "return" values
+ #l{ke={protected,T,var_list(Rs)},i=I,a=A#k.a,vdb=Pdb2};
+guard(#k_seq{}=G, I, Vdb0) ->
+ {Es,_,Vdb1} = guard_body(G, I, Vdb0),
+ #l{ke={block,Es},i=I,vdb=Vdb1,a=[]};
+guard(G, I, Vdb) -> guard_expr(G, I, Vdb).
+
+%% guard_body(Kbody, I, Vdb) -> {[Expr],MaxI,Vdb}.
+
+guard_body(#k_seq{arg=Ke,body=Kb}, I, Vdb0) ->
+ A = get_kanno(Ke),
+ Vdb1 = use_vars(A#k.us, I, new_vars(A#k.ns, I, Vdb0)),
+ {Es,MaxI,Vdb2} = guard_body(Kb, I+1, Vdb1),
+ E = guard_expr(Ke, I, Vdb2),
+ {[E|Es],MaxI,Vdb2};
+guard_body(Ke, I, Vdb0) ->
+ A = get_kanno(Ke),
+ Vdb1 = use_vars(A#k.us, I, new_vars(A#k.ns, I, Vdb0)),
+ E = guard_expr(Ke, I, Vdb1),
+ {[E],I,Vdb1}.
+
+%% guard_expr(Call, I, Vdb) -> Expr
+
+guard_expr(#k_test{anno=A,op=Op,args=As}, I, _Vdb) ->
+ #l{ke={test,test_op(Op),atomic_list(As)},i=I,a=A#k.a};
+guard_expr(#k_bif{anno=A,op=Op,args=As,ret=Rs}, I, _Vdb) ->
+ #l{ke={bif,bif_op(Op),atomic_list(As),var_list(Rs)},i=I,a=A#k.a};
+guard_expr(#k_put{anno=A,arg=Arg,ret=Rs}, I, _Vdb) ->
+ #l{ke={set,var_list(Rs),literal(Arg)},i=I,a=A#k.a};
+guard_expr(#k_match{anno=A,body=Kb,ret=Rs}, I, Vdb) ->
+ %% Experimental support for andalso/orelse in guards.
+ %% Work out imported variables which need to be locked.
+ Mdb = vdb_sub(I, I+1, Vdb),
+ M = match(Kb, A#k.us, I+1, Mdb),
+ #l{ke={match,M,var_list(Rs)},i=I,vdb=use_vars(A#k.us, I+1, Mdb),a=A#k.a};
+guard_expr(G, I, Vdb) -> guard(G, I, Vdb).
+
+%% expr(Kexpr, I, Vdb) -> Expr.
+
+expr(#k_call{anno=A,op=Op,args=As,ret=Rs}, I, _Vdb) ->
+ #l{ke={call,call_op(Op),atomic_list(As),var_list(Rs)},i=I,a=A#k.a};
+expr(#k_enter{anno=A,op=Op,args=As}, I, _Vdb) ->
+ #l{ke={enter,call_op(Op),atomic_list(As)},i=I,a=A#k.a};
+expr(#k_bif{anno=A,op=Op,args=As,ret=Rs}, I, _Vdb) ->
+ Bif = k_bif(A, Op, As, Rs),
+ #l{ke=Bif,i=I,a=A#k.a};
+expr(#k_match{anno=A,body=Kb,ret=Rs}, I, Vdb) ->
+ %% Work out imported variables which need to be locked.
+ Mdb = vdb_sub(I, I+1, Vdb),
+ M = match(Kb, A#k.us, I+1, Mdb),
+ #l{ke={match,M,var_list(Rs)},i=I,vdb=use_vars(A#k.us, I+1, Mdb),a=A#k.a};
+expr(#k_try{anno=A,arg=Ka,vars=Vs,body=Kb,evars=Evs,handler=Kh,ret=Rs}, I, Vdb) ->
+ %% Lock variables that are alive before the catch and used afterwards.
+ %% Don't lock variables that are only used inside the try.
+ Tdb0 = vdb_sub(I, I+1, Vdb),
+ %% This is the tricky bit. Lock variables in Arg that are used in
+ %% the body and handler. Add try tag 'variable'.
+ Ab = get_kanno(Kb),
+ Ah = get_kanno(Kh),
+ Tdb1 = use_vars(Ab#k.us, I+3, use_vars(Ah#k.us, I+3, Tdb0)),
+ Tdb2 = vdb_sub(I, I+2, Tdb1),
+ Vnames = fun (Kvar) -> Kvar#k_var.name end, %Get the variable names
+ {Aes,_,Adb} = body(Ka, I+2, add_var({catch_tag,I+1}, I+1, 1000000, Tdb2)),
+ {Bes,_,Bdb} = body(Kb, I+4, new_vars(map(Vnames, Vs), I+3, Tdb2)),
+ {Hes,_,Hdb} = body(Kh, I+4, new_vars(map(Vnames, Evs), I+3, Tdb2)),
+ #l{ke={'try',#l{ke={block,Aes},i=I+1,vdb=Adb,a=[]},
+ var_list(Vs),#l{ke={block,Bes},i=I+3,vdb=Bdb,a=[]},
+ var_list(Evs),#l{ke={block,Hes},i=I+3,vdb=Hdb,a=[]},
+ var_list(Rs)},
+ i=I,vdb=Tdb1,a=A#k.a};
+expr(#k_catch{anno=A,body=Kb,ret=[R]}, I, Vdb) ->
+ %% Lock variables that are alive before the catch and used afterwards.
+ %% Don't lock variables that are only used inside the catch.
+ %% Add catch tag 'variable'.
+ Cdb0 = vdb_sub(I, I+1, Vdb),
+ {Es,_,Cdb1} = body(Kb, I+1, add_var({catch_tag,I}, I, 1000000, Cdb0)),
+ #l{ke={'catch',Es,variable(R)},i=I,vdb=Cdb1,a=A#k.a};
+expr(#k_receive{anno=A,var=V,body=Kb,timeout=T,action=Ka,ret=Rs}, I, Vdb) ->
+ %% Work out imported variables which need to be locked.
+ Rdb = vdb_sub(I, I+1, Vdb),
+ M = match(Kb, add_element(V#k_var.name, A#k.us), I+1,
+ new_var(V#k_var.name, I, Rdb)),
+ {Tes,_,Adb} = body(Ka, I+1, Rdb),
+ #l{ke={receive_loop,atomic_lit(T),variable(V),M,
+ #l{ke=Tes,i=I+1,vdb=Adb,a=[]},var_list(Rs)},
+ i=I,vdb=use_vars(A#k.us, I+1, Vdb),a=A#k.a};
+expr(#k_receive_accept{anno=A}, I, _Vdb) ->
+ #l{ke=receive_accept,i=I,a=A#k.a};
+expr(#k_receive_next{anno=A}, I, _Vdb) ->
+ #l{ke=receive_next,i=I,a=A#k.a};
+expr(#k_put{anno=A,arg=Arg,ret=Rs}, I, _Vdb) ->
+ #l{ke={set,var_list(Rs),literal(Arg)},i=I,a=A#k.a};
+expr(#k_break{anno=A,args=As}, I, _Vdb) ->
+ #l{ke={break,atomic_list(As)},i=I,a=A#k.a};
+expr(#k_return{anno=A,args=As}, I, _Vdb) ->
+ #l{ke={return,atomic_list(As)},i=I,a=A#k.a}.
+
+%% call_op(Op) -> Op.
+%% bif_op(Op) -> Op.
+%% test_op(Op) -> Op.
+%% Do any necessary name translations here to munge into beam format.
+
+call_op(#k_local{name=N}) -> N;
+call_op(#k_remote{mod=M,name=N}) -> {remote,atomic_lit(M),atomic_lit(N)};
+call_op(Other) -> variable(Other).
+
+bif_op(#k_remote{mod=#k_atom{val=erlang},name=#k_atom{val=N}}) -> N;
+bif_op(#k_internal{name=N}) -> N.
+
+test_op(#k_remote{mod=#k_atom{val=erlang},name=#k_atom{val=N}}) -> N.
+
+%% k_bif(Anno, Op, [Arg], [Ret]) -> Expr.
+%% Build bifs, do special handling of internal some calls.
+
+k_bif(_A, #k_internal{name=dsetelement,arity=3}, As, []) ->
+ {bif,dsetelement,atomic_list(As),[]};
+k_bif(_A, #k_internal{name=make_fun},
+ [#k_atom{val=Fun},#k_int{val=Arity},
+ #k_int{val=Index},#k_int{val=Uniq}|Free],
+ Rs) ->
+ {bif,{make_fun,Fun,Arity,Index,Uniq},var_list(Free),var_list(Rs)};
+k_bif(_A, Op, As, Rs) ->
+ %% The general case.
+ {bif,bif_op(Op),atomic_list(As),var_list(Rs)}.
+
+%% match(Kexpr, [LockVar], I, Vdb) -> Expr.
+%% Convert match tree to old format.
+
+match(#k_alt{anno=A,first=Kf,then=Kt}, Ls, I, Vdb0) ->
+ Vdb1 = use_vars(union(A#k.us, Ls), I, Vdb0),
+ F = match(Kf, Ls, I+1, Vdb1),
+ T = match(Kt, Ls, I+1, Vdb1),
+ #l{ke={alt,F,T},i=I,vdb=Vdb1,a=A#k.a};
+match(#k_select{anno=A,var=V,types=Kts}, Ls0, I, Vdb0) ->
+ Ls1 = add_element(V#k_var.name, Ls0),
+ Vdb1 = use_vars(union(A#k.us, Ls1), I, Vdb0),
+ Ts = map(fun (Tc) -> type_clause(Tc, Ls1, I+1, Vdb1) end, Kts),
+ #l{ke={select,literal(V),Ts},i=I,vdb=Vdb1,a=A#k.a};
+match(#k_guard{anno=A,clauses=Kcs}, Ls, I, Vdb0) ->
+ Vdb1 = use_vars(union(A#k.us, Ls), I, Vdb0),
+ Cs = map(fun (G) -> guard_clause(G, Ls, I+1, Vdb1) end, Kcs),
+ #l{ke={guard,Cs},i=I,vdb=Vdb1,a=A#k.a};
+match(Other, Ls, I, Vdb0) ->
+ Vdb1 = use_vars(Ls, I, Vdb0),
+ {B,_,Vdb2} = body(Other, I+1, Vdb1),
+ #l{ke={block,B},i=I,vdb=Vdb2,a=[]}.
+
+type_clause(#k_type_clause{anno=A,type=T,values=Kvs}, Ls, I, Vdb0) ->
+ %%ok = io:format("life ~w: ~p~n", [?LINE,{T,Kvs}]),
+ Vdb1 = use_vars(union(A#k.us, Ls), I+1, Vdb0),
+ Vs = map(fun (Vc) -> val_clause(Vc, Ls, I+1, Vdb1) end, Kvs),
+ #l{ke={type_clause,type(T),Vs},i=I,vdb=Vdb1,a=A#k.a}.
+
+val_clause(#k_val_clause{anno=A,val=V,body=Kb}, Ls0, I, Vdb0) ->
+ {_Used,New} = match_pat_vars(V),
+ %% Not clear yet how Used should be used.
+ Bus = (get_kanno(Kb))#k.us,
+ %%ok = io:format("Ls0 = ~p, Used=~p\n New=~p, Bus=~p\n", [Ls0,Used,New,Bus]),
+ Ls1 = union(intersection(New, Bus), Ls0), %Lock for safety
+ Vdb1 = use_vars(union(A#k.us, Ls1), I+1, new_vars(New, I, Vdb0)),
+ B = match(Kb, Ls1, I+1, Vdb1),
+ #l{ke={val_clause,literal(V),B},i=I,vdb=use_vars(Bus, I+1, Vdb1),a=A#k.a}.
+
+guard_clause(#k_guard_clause{anno=A,guard=Kg,body=Kb}, Ls, I, Vdb0) ->
+ Vdb1 = use_vars(union(A#k.us, Ls), I+2, Vdb0),
+ Gdb = vdb_sub(I+1, I+2, Vdb1),
+ G = guard(Kg, I+1, Gdb),
+ B = match(Kb, Ls, I+2, Vdb1),
+ #l{ke={guard_clause,G,B},
+ i=I,vdb=use_vars((get_kanno(Kg))#k.us, I+2, Vdb1),
+ a=A#k.a}.
+
+%% match_fail(FailValue, I, Anno) -> Expr.
+%% Generate the correct match_fail instruction. N.B. there is no
+%% generic case for when the fail value has been created elsewhere.
+
+match_fail(#k_tuple{es=[#k_atom{val=function_clause}|As]}, I, A) ->
+ #l{ke={match_fail,{function_clause,literal_list(As)}},i=I,a=A};
+match_fail(#k_tuple{es=[#k_atom{val=badmatch},Val]}, I, A) ->
+ #l{ke={match_fail,{badmatch,literal(Val)}},i=I,a=A};
+match_fail(#k_tuple{es=[#k_atom{val=case_clause},Val]}, I, A) ->
+ #l{ke={match_fail,{case_clause,literal(Val)}},i=I,a=A};
+match_fail(#k_atom{val=if_clause}, I, A) ->
+ #l{ke={match_fail,if_clause},i=I,a=A};
+match_fail(#k_tuple{es=[#k_atom{val=try_clause},Val]}, I, A) ->
+ #l{ke={match_fail,{try_clause,literal(Val)}},i=I,a=A}.
+
+%% type(Ktype) -> Type.
+
+type(k_int) -> integer;
+type(k_char) -> integer; %Hhhmmm???
+type(k_float) -> float;
+type(k_atom) -> atom;
+type(k_nil) -> nil;
+type(k_cons) -> cons;
+type(k_tuple) -> tuple;
+type(k_binary) -> binary;
+type(k_bin_seg) -> bin_seg;
+type(k_bin_end) -> bin_end.
+
+%% variable(Klit) -> Lit.
+%% var_list([Klit]) -> [Lit].
+
+variable(#k_var{name=N}) -> {var,N}.
+
+var_list(Ks) -> map(fun variable/1, Ks).
+
+%% atomic_lit(Klit) -> Lit.
+%% atomic_list([Klit]) -> [Lit].
+
+atomic_lit(#k_var{name=N}) -> {var,N};
+atomic_lit(#k_int{val=I}) -> {integer,I};
+atomic_lit(#k_float{val=F}) -> {float,F};
+atomic_lit(#k_atom{val=N}) -> {atom,N};
+%%atomic_lit(#k_char{val=C}) -> {char,C};
+%%atomic_lit(#k_string{val=S}) -> {string,S};
+atomic_lit(#k_nil{}) -> nil.
+
+atomic_list(Ks) -> map(fun atomic_lit/1, Ks).
+
+%% literal(Klit) -> Lit.
+%% literal_list([Klit]) -> [Lit].
+
+literal(#k_var{name=N}) -> {var,N};
+literal(#k_int{val=I}) -> {integer,I};
+literal(#k_float{val=F}) -> {float,F};
+literal(#k_atom{val=N}) -> {atom,N};
+%%literal(#k_char{val=C}) -> {char,C};
+literal(#k_string{val=S}) -> {string,S};
+literal(#k_nil{}) -> nil;
+literal(#k_cons{hd=H,tl=T}) ->
+ {cons,[literal(H),literal(T)]};
+literal(#k_binary{segs=V}) ->
+ case proplists:get_bool(no_new_binaries, get(?MODULE)) of
+ true ->
+ {old_binary,literal(V)};
+ false ->
+ {binary,literal(V)}
+ end;
+literal(#k_bin_seg{size=S,unit=U,type=T,flags=Fs,seg=Seg,next=N}) ->
+ {bin_seg,literal(S),U,T,Fs,[literal(Seg),literal(N)]};
+literal(#k_bin_end{}) -> bin_end;
+literal(#k_tuple{es=Es}) ->
+ {tuple,literal_list(Es)}.
+
+literal_list(Ks) -> map(fun literal/1, Ks).
+
+%% match_pat_vars(Pattern) -> {[UsedVarName],[NewVarName]}.
+
+match_pat_vars(#k_var{name=N}) -> {[],[N]};
+match_pat_vars(#k_int{}) -> {[],[]};
+match_pat_vars(#k_float{}) -> {[],[]};
+match_pat_vars(#k_atom{}) -> {[],[]};
+%%match_pat_vars(#k_char{}) -> {[],[]};
+match_pat_vars(#k_string{}) -> {[],[]};
+match_pat_vars(#k_nil{}) -> {[],[]};
+match_pat_vars(#k_cons{hd=H,tl=T}) ->
+ match_pat_list_vars([H,T]);
+match_pat_vars(#k_binary{segs=V}) ->
+ match_pat_vars(V);
+match_pat_vars(#k_bin_seg{size=S,seg=Seg,next=N}) ->
+ {U1,New1} = match_pat_vars(Seg),
+ {U2,New2} = match_pat_vars(N),
+ {[],U3} = match_pat_vars(S),
+ {union([U1,U2,U3]),union(New1, New2)};
+match_pat_vars(#k_bin_end{}) -> {[],[]};
+match_pat_vars(#k_tuple{es=Es}) ->
+ match_pat_list_vars(Es).
+
+match_pat_list_vars(Ps) ->
+ foldl(fun (P, {Used0,New0}) ->
+ {Used,New} = match_pat_vars(P),
+ {union(Used0, Used),union(New0, New)} end,
+ {[],[]}, Ps).
+
+%% new_var(VarName, I, Vdb) -> Vdb.
+%% new_vars([VarName], I, Vdb) -> Vdb.
+%% use_var(VarName, I, Vdb) -> Vdb.
+%% use_vars([VarName], I, Vdb) -> Vdb.
+%% add_var(VarName, F, L, Vdb) -> Vdb.
+
+new_var(V, I, Vdb) ->
+ case vdb_find(V, Vdb) of
+ {V,F,L} when I < F -> vdb_store(V, I, L, Vdb);
+ {V,_,_} -> Vdb;
+ error -> vdb_store(V, I, I, Vdb)
+ end.
+
+new_vars(Vs, I, Vdb0) ->
+ foldl(fun (V, Vdb) -> new_var(V, I, Vdb) end, Vdb0, Vs).
+
+use_var(V, I, Vdb) ->
+ case vdb_find(V, Vdb) of
+ {V,F,L} when I > L -> vdb_store(V, F, I, Vdb);
+ {V,_,_} -> Vdb;
+ error -> vdb_store(V, I, I, Vdb)
+ end.
+
+use_vars(Vs, I, Vdb0) ->
+ foldl(fun (V, Vdb) -> use_var(V, I, Vdb) end, Vdb0, Vs).
+
+add_var(V, F, L, Vdb) ->
+ use_var(V, L, new_var(V, F, Vdb)).
+
+vdb_find(V, Vdb) ->
+ %% Peformance note: Profiling shows that this function accounts for
+ %% a lot of the execution time when huge constants terms are built.
+ %% Using the BIF lists:keysearch/3 is a lot faster than the
+ %% original Erlang version.
+ case lists:keysearch(V, 1, Vdb) of
+ {value,Vd} -> Vd;
+ false -> error
+ end.
+
+%vdb_find(V, [{V1,F,L}=Vd|Vdb]) when V < V1 -> error;
+%vdb_find(V, [{V1,F,L}=Vd|Vdb]) when V == V1 -> Vd;
+%vdb_find(V, [{V1,F,L}=Vd|Vdb]) when V > V1 -> vdb_find(V, Vdb);
+%vdb_find(V, []) -> error.
+
+vdb_store(V, F, L, [{V1,_,_}=Vd|Vdb]) when V > V1 ->
+ [Vd|vdb_store(V, F, L, Vdb)];
+vdb_store(V, F, L, [{V1,_,_}=Vd|Vdb]) when V < V1 -> [{V,F,L},Vd|Vdb];
+vdb_store(V, F, L, [{_V1,_,_}|Vdb]) -> [{V,F,L}|Vdb]; %V == V1
+vdb_store(V, F, L, []) -> [{V,F,L}].
+
+%% vdb_sub(Min, Max, Vdb) -> Vdb.
+%% Extract variables which are used before and after Min. Lock
+%% variables alive after Max.
+
+vdb_sub(Min, Max, Vdb) ->
+ [ if L >= Max -> {V,F,1000000};
+ true -> Vd
+ end || {V,F,L}=Vd <- Vdb, F < Min, L >= Min ].
diff --git a/lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_life.hrl b/lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_life.hrl
new file mode 100644
index 0000000000..4d183b7234
--- /dev/null
+++ b/lib/dialyzer/test/options1_SUITE_data/src/compiler/v3_life.hrl
@@ -0,0 +1,24 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: v3_life.hrl,v 1.1 2008/12/17 09:53:43 mikpe Exp $
+%%
+%% This record contains variable life-time annotation for a
+%% kernel expression. Added by v3_life, used by v3_codegen.
+
+-record(l, {ke, %Kernel expression
+ i=0, %Op number
+ vdb=[], %Variable database
+ a}). %Core annotation
diff --git a/lib/dialyzer/test/options2_SUITE_data/dialyzer_options b/lib/dialyzer/test/options2_SUITE_data/dialyzer_options
new file mode 100644
index 0000000000..5db2e50d23
--- /dev/null
+++ b/lib/dialyzer/test/options2_SUITE_data/dialyzer_options
@@ -0,0 +1 @@
+{dialyzer_options, [{defines, [{'vsn', 4}]}, {warnings, [no_return]}]}.
diff --git a/lib/dialyzer/test/options2_SUITE_data/results/kernel b/lib/dialyzer/test/options2_SUITE_data/results/kernel
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/options2_SUITE_data/results/kernel
diff --git a/lib/dialyzer/test/options2_SUITE_data/src/kernel/global.erl b/lib/dialyzer/test/options2_SUITE_data/src/kernel/global.erl
new file mode 100644
index 0000000000..4778a39a3c
--- /dev/null
+++ b/lib/dialyzer/test/options2_SUITE_data/src/kernel/global.erl
@@ -0,0 +1,1999 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: global.erl,v 1.4 2009/09/17 09:46:19 kostis Exp $
+%%
+-module(global).
+-behaviour(gen_server).
+
+%% A Global register that allows the global registration of pid's and
+%% name's, that dynamically keeps up to date with the entire network.
+%% global can operate in two modes; in a fully connected network, or
+%% in a non-fully connected network. In the latter case, the name
+%% registration mechanism won't work.
+%%
+
+%% External exports
+-export([start/0, start_link/0, stop/0, sync/0, sync/1,
+ safe_whereis_name/1, whereis_name/1, register_name/2, register_name/3,
+ register_name_external/2, register_name_external/3, unregister_name_external/1,
+ re_register_name/2, re_register_name/3,
+ unregister_name/1, registered_names/0, send/2, node_disconnected/1,
+ set_lock/1, set_lock/2, set_lock/3,
+ del_lock/1, del_lock/2,
+ trans/2, trans/3, trans/4,
+ random_exit_name/3, random_notify_name/3, notify_all_name/3, cnode/3]).
+
+%% Internal exports
+-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2,
+ code_change/3, timer/2, sync_init/2, init_locker/5, resolve_it/4,
+ init_the_locker/1]).
+
+-export([info/0]).
+
+
+%-define(PRINT(X), erlang:display(X)).
+-define(PRINT(X), true).
+
+%-define(P2(X), erlang:display(X)).
+%-define(P2(X), erlang:display({cs(),X})).
+-define(P2(X), true).
+
+%-define(P1(X), erlang:display(X)).
+-define(P1(X), true).
+
+%-define(P(X), erlang:display(X)).
+-define(P(X), true).
+
+%-define(FORMAT(S, A), format(S, A)).
+-define(FORMAT(S, A), ok).
+
+%%% In certain places in the server, calling io:format hangs everything,
+%%% so we'd better use erlang:display/1.
+% format(S, A) ->
+% erlang:display({format, cs(), S, A}),
+% % io:format(S, A),
+% ok.
+
+% cs() ->
+% {Big, Small, Tiny} = now(),
+% (Small rem 100) * 100 + (Tiny div 10000).
+
+%% Some notes on the internal structure:
+%% One invariant is that the list of locker processes is keyed; i.e.,
+%% there is only one process per neighboring node.
+%% When an item has been stored in the process dictionary, it is not
+%% necessarily cleared when not in use anymore. In other words, it's
+%% not an error if there is already an item there when one is to be
+%% stored.
+
+
+%% This is the protocol version
+%% Vsn 1 is the original protocol.
+%% Vsn 2 is enhanced with code to take care of registration of names from
+%% non erlang nodes, e.g. c-nodes.
+%% Vsn 3 is enhanced with a tag in the synch messages to distinguish
+%% different synch sessions from each other, see OTP-2766.
+%% Note: This requires also that the ticket OTP-2928 is fixed on the nodes
+%% running vsn 1 or 2; if such nodes will coexist with vsn 3 nodes.
+%% Vsn 4 uses a single, permanent, locker process, but works like vsn 3
+%% when communicating with vsn 3 nodes.
+
+%% -define(vsn, 4). %% Now given in options
+
+%%-----------------------------------------------------------------
+%% connect_all = boolean() - true if we are supposed to set up a
+%% fully connected net
+%% known = [Node] - all nodes known to us
+%% synced = [Node] - all nodes that have the same names as us
+%% lockers = [{Node, MyLockerPid}] - the pid of the locker
+%% process for each Node
+%% syncers = [pid()] - all current syncers processes
+%% node_name = atom() - our node name (can change if distribution
+%% is started/stopped dynamically)
+%%
+%% In addition to these, we keep info about messages arrived in
+%% the process dictionary:
+%% {pre_connect, Node} = {Vsn, InitMsg} - init_connect msgs that
+%% arrived before nodeup
+%% {wait_lock, Node} = {exchange, NameList} | lock_is_set
+%% - see comment below (handle_cast)
+%% {save_ops, Node} = [operation()] - save the ops between
+%% exchange and resolved
+%% {prot_vsn, Node} = Vsn - the exchange protocol version
+%% {sync_tag_my, Node} = My tag, used at synchronization with Node
+%% {sync_tag_his, Node} = The Node's tag, used at synchronization
+%%-----------------------------------------------------------------
+-record(state, {connect_all, known = [], synced = [],
+ lockers = [], syncers = [], node_name = node(),
+ the_locker, the_deleter}).
+
+start() -> gen_server:start({local, global_name_server}, global, [], []).
+start_link() -> gen_server:start_link({local, global_name_server},global,[],[]).
+stop() -> gen_server:call(global_name_server, stop, infinity).
+
+sync() ->
+ case check_sync_nodes() of
+ {error, Error} ->
+ {error, Error};
+ SyncNodes ->
+ gen_server:call(global_name_server, {sync, SyncNodes}, infinity)
+ end.
+sync(Nodes) ->
+ case check_sync_nodes(Nodes) of
+ {error, Error} ->
+ {error, Error};
+ SyncNodes ->
+ gen_server:call(global_name_server, {sync, SyncNodes}, infinity)
+ end.
+
+
+send(Name, Msg) ->
+ case whereis_name(Name) of
+ Pid when pid(Pid) ->
+ Pid ! Msg,
+ Pid;
+ undefined ->
+ exit({badarg, {Name, Msg}})
+ end.
+
+%% See OTP-3737. (safe_whereis_name/1 is in fact not used anywhere in OTP.)
+whereis_name(Name) ->
+ where(Name).
+
+safe_whereis_name(Name) ->
+ gen_server:call(global_name_server, {whereis, Name}, infinity).
+
+
+node_disconnected(Node) ->
+ global_name_server ! {nodedown, Node}.
+
+
+%%-----------------------------------------------------------------
+%% Method = function(Name, Pid1, Pid2) -> Pid | Pid2 | none
+%% Method is called if a name conflict is detected when two nodes
+%% are connecting to each other. It is supposed to return one of
+%% the Pids or 'none'. If a pid is returned, that pid is
+%% registered as Name on all nodes. If 'none' is returned, the
+%% Name is unregistered on all nodes. If anything else is returned,
+%% the Name is unregistered as well.
+%% Method is called once at one of the nodes where the processes reside
+%% only. If different Methods are used for the same name, it is
+%% undefined which one of them is used.
+%% Method is blocking, i.e. when it is called, no calls to whereis/
+%% send is let through until it has returned.
+%%-----------------------------------------------------------------
+register_name(Name, Pid) when pid(Pid) ->
+ register_name(Name, Pid, {global, random_exit_name}).
+register_name(Name, Pid, Method) when pid(Pid) ->
+ trans_all_known(fun(Nodes) ->
+ case where(Name) of
+ undefined ->
+ gen_server:multi_call(Nodes,
+ global_name_server,
+ {register, Name, Pid, Method}),
+ yes;
+ _Pid -> no
+ end
+ end).
+
+unregister_name(Name) ->
+ case where(Name) of
+ undefined ->
+ ok;
+ _ ->
+ trans_all_known(fun(Nodes) ->
+ gen_server:multi_call(Nodes,
+ global_name_server,
+ {unregister, Name}),
+ ok
+ end)
+ end.
+
+re_register_name(Name, Pid) when pid(Pid) ->
+ re_register_name(Name, Pid, {global, random_exit_name}).
+re_register_name(Name, Pid, Method) when pid(Pid) ->
+ trans_all_known(fun(Nodes) ->
+ gen_server:multi_call(Nodes,
+ global_name_server,
+ {register, Name, Pid, Method}),
+ yes
+ end).
+
+%% Returns all globally registered names
+registered_names() -> lists:map(fun({Name, _Pid, _Method}) -> Name end,
+ ets:tab2list(global_names)).
+
+%%-----------------------------------------------------------------
+%% An external node (i.e not an erlang node) (un)registers a name.
+%% If the registered Pid crashes the name is to be removed from global.
+%% If the external node crashes the name is to be removed from global.
+%% If the erlang node which registers the name crashes the name is also to be
+%% removed, because the registered process is not supervised any more,
+%% (i.e there is no link to the registered Pid).
+%%-----------------------------------------------------------------
+register_name_external(Name, Pid) when pid(Pid) ->
+ register_name_external(Name, Pid, {global, random_exit_name}).
+register_name_external(Name, Pid, Method) when pid(Pid) ->
+ trans_all_known(fun(Nodes) ->
+ case where(Name) of
+ undefined ->
+ gen_server:multi_call(Nodes,
+ global_name_server,
+ {register, Name, Pid, Method}),
+ gen_server:multi_call(Nodes,
+ global_name_server,
+ {register_ext, Name, Pid, node()}),
+ yes;
+ _Pid -> no
+ end
+ end).
+
+
+
+
+unregister_name_external(Name) ->
+ case where(Name) of
+ undefined ->
+ ok;
+ _ ->
+ trans_all_known(fun(Nodes) ->
+ gen_server:multi_call(Nodes,
+ global_name_server,
+ {unregister, Name}),
+ gen_server:multi_call(Nodes,
+ global_name_server,
+ {unregister_ext, Name}),
+ ok
+ end)
+ end.
+
+
+
+
+
+%%-----------------------------------------------------------------
+%% Args: Id = id()
+%% Nodes = [node()]
+%% id() = {ResourceId, LockRequesterId}
+%% Retries = infinity | int() > 0
+%% Purpose: Sets a lock on the specified nodes (or all nodes if
+%% none are specified) on ResourceId for LockRequesterId. If there
+%% already exists a lock on ResourceId for another owner
+%% than LockRequesterId, false is returned, otherwise true.
+%% Returns: boolean()
+%%-----------------------------------------------------------------
+set_lock(Id) ->
+ set_lock(Id, [node() | nodes()], infinity, 1).
+set_lock(Id, Nodes) ->
+ set_lock(Id, Nodes, infinity, 1).
+set_lock(Id, Nodes, Retries) when Retries > 0 ->
+ set_lock(Id, Nodes, Retries, 1);
+set_lock(Id, Nodes, infinity) ->
+ set_lock(Id, Nodes, infinity, 1).
+set_lock(_Id, _Nodes, 0, _) -> false;
+set_lock({ResourceId, LockRequesterId}, Nodes, Retries, Times) ->
+ Id = {ResourceId, LockRequesterId},
+ Msg = {set_lock, Id},
+ {Replies, _} =
+ gen_server:multi_call(Nodes, global_name_server, Msg),
+ ?P2({set_lock, node(), self(), {ResourceId, LockRequesterId},
+ Nodes, Retries, Times, Replies, catch erlang:error(kaka)}),
+ ?P({set_lock, node(), ResourceId,
+ {LockRequesterId, node(LockRequesterId)}}),
+ case check_replies(Replies, Id, Nodes) of
+ true -> ?P({set_lock_true, node(), ResourceId}),
+ true;
+ false ->
+ random_sleep(Times),
+ set_lock(Id, Nodes, dec(Retries), Times+1);
+ N when integer(N) ->
+ ?P({sleeping, N}),
+ timer:sleep(N*500),
+ set_lock(Id, Nodes, Retries, Times);
+ Pid when pid(Pid) ->
+ ?P({waiting_for, Pid}),
+ Ref = erlang:monitor(process, Pid),
+ receive
+ {'DOWN', Ref, process, Pid, _Reason} ->
+ ?P({waited_for, Pid, _Reason}),
+ set_lock(Id, Nodes, Retries, Times)
+ end
+ end.
+
+check_replies([{_Node, true} | T], Id, Nodes) ->
+ check_replies(T, Id, Nodes);
+check_replies([{_Node, Status} | _T], Id, Nodes) ->
+ gen_server:multi_call(Nodes, global_name_server, {del_lock, Id}),
+ Status;
+check_replies([], _Id, _Nodes) ->
+ true.
+
+del_lock(Id) ->
+ del_lock(Id, [node() | nodes()]).
+del_lock({ResourceId, LockRequesterId}, Nodes) ->
+ Id = {ResourceId, LockRequesterId},
+ ?P2({del_lock, node(), self(), ResourceId, LockRequesterId, Nodes}),
+ gen_server:multi_call(Nodes, global_name_server, {del_lock, Id}),
+ true.
+
+%%-----------------------------------------------------------------
+%% Args: Id = id()
+%% Fun = fun() | {M,F}
+%% Nodes = [node()]
+%% Retries = infinity | int() > 0
+%% Purpose: Sets a lock on Id (as set_lock), and evaluates
+%% Res = Fun() on success.
+%% Returns: Res | aborted (note, if Retries is infinity, the
+%% transaction won't abort)
+%%-----------------------------------------------------------------
+trans(Id, Fun) -> trans(Id, Fun, [node() | nodes()], infinity).
+trans(Id, Fun, Nodes) -> trans(Id, Fun, Nodes, infinity).
+trans(_Id, _Fun, _Nodes, 0) -> aborted;
+trans(Id, Fun, Nodes, Retries) ->
+ case set_lock(Id, Nodes, Retries) of
+ true ->
+ case catch Fun() of
+ {'EXIT', R} ->
+ del_lock(Id, Nodes),
+ exit(R);
+ Res ->
+ del_lock(Id, Nodes),
+ Res
+ end;
+ false ->
+ aborted
+ end.
+
+%%% Similar to trans(Id, Fun), but always uses global's own lock,
+%%% on all nodes known to global, making sure that no new nodes have
+%%% become known while we got the list of known nodes.
+trans_all_known(F) ->
+ Id = {global, self()},
+ Nodes = [node() | gen_server:call(global_name_server, get_known)],
+ case set_lock(Id, Nodes) of
+ true ->
+ Nodes2 = [node() | gen_server:call(global_name_server, get_known)],
+ case Nodes2 -- Nodes of
+ [] ->
+ case catch F(Nodes2) of
+ {'EXIT', R} ->
+ del_lock(Id, Nodes2),
+ exit(R);
+ Res ->
+ del_lock(Id, Nodes2),
+ Res
+ end;
+ _ ->
+ del_lock(Id, Nodes),
+ trans_all_known(F)
+ end;
+ false ->
+ aborted
+ end.
+
+info() ->
+ gen_server:call(global_name_server, info).
+
+%%%-----------------------------------------------------------------
+%%% Call-back functions from gen_server
+%%%-----------------------------------------------------------------
+init([]) ->
+ process_flag(trap_exit, true),
+ ets:new(global_locks, [set, named_table, protected]),
+ ets:new(global_names, [set, named_table, protected]),
+ ets:new(global_names_ext, [set, named_table, protected]),
+
+ %% multi
+ S = #state{the_locker = start_the_locker(self()),
+ the_deleter = start_the_deleter(self())},
+
+ case init:get_argument(connect_all) of
+ {ok, [["false"]]} ->
+ {ok, S#state{connect_all = false}};
+ _ ->
+ {ok, S#state{connect_all = true}}
+ end.
+
+%%-----------------------------------------------------------------
+%% Connection algorithm
+%% ====================
+%% This alg solves the problem with partitioned nets as well.
+%%
+%% The main idea in the alg is that when two nodes connect, they
+%% try to set a lock in their own partition (i.e. all nodes already
+%% known to them). When the lock is set in each partition, these
+%% two nodes send each other a list with all registered names in
+%% resp partition(*). If no conflict is found, the name tables are
+%% just updated. If a conflict is found, a resolve function is
+%% called once for each conflict. The result of the resolving
+%% is sent to the other node. When the names are exchanged, all
+%% other nodes in each partition are informed of the other nodes,
+%% and they ping each other to form a fully connected net.
+%%
+%% Here's the flow:
+%% Suppose nodes A and B connect, and C is connected to A.
+%%
+%% Node A
+%% ------
+%% << {nodeup, B}
+%% [spawn locker]
+%% B ! {init_connect, MyLocker}
+%% << {init_connect, MyLocker}
+%% [The lockers try to set the lock]
+%% << {lock_is_set, B}
+%% [Now, lock is set in both partitions]
+%% B ! {exchange, Names}
+%% << {exchange, Names}
+%% [solve conflict]
+%% B ! {resolved, Resolved}
+%% << {resolved, Resolved}
+%% C ! {new_nodes, Resolved, [B]}
+%%
+%% Node C
+%% ------
+%% << {new_nodes, ResolvedOps, NewNodes}
+%% [insert Ops]
+%% ping(NewNodes)
+%% << {nodeup, B}
+%% <ignore this one>
+%%
+%% Several things can disturb this picture.
+%%
+%% First, the got_names message may arrive *before* the nodeup
+%% message, due to delay in net_kernel and an optimisation in the
+%% emulator. We handle this by keeping track of these messages in the
+%% pre_connect and lockers variables in our state.
+%%
+%% The most common situation is when a new node connects to an
+%% existing net. In this case there's no need to set the lock on
+%% all nodes in the net, as we know that there won't be any conflict.
+%% This is optimised by sending {first_contact, Node} instead of got_names.
+%% This implies that first_contact may arrive before nodeup as well.
+%%
+%% Of course we must handle that some node goes down during the
+%% connection.
+%%
+%% (*) When this information is being exchanged, no one is allowed
+%% to change the global register table. All calls to register etc
+%% are protected by a lock. If a registered process dies
+%% during this phase, the deregistration is done as soon as possible
+%% on each node (i.e. when the info about the process has arrived).
+%%-----------------------------------------------------------------
+%% Messages in the protocol
+%% ========================
+%% 1. Between connecting nodes (gen_server:casts)
+%% {init_connect, Vsn, Node, InitMsg}
+%% InitMsg = {locker, LockerPid}
+%% {exchange, Node, ListOfNames}
+%% {resolved, Node, Ops, Known}
+%% Known = list of nodes in Node's partition
+%% 2. Between lockers on connecting nodes (!s)
+%% {his_locker, Pid} (from our global)
+%% lockers link to each other
+%% {lock, Bool} loop until both lockers have lock = true,
+%% then send to global {lock_is_set, Node}
+%% 3. From connecting node to other nodes in the partition
+%% {new_nodes, Node, Ops, NewNodes}
+%% 4. sync protocol
+%% {in_sync, Node, IsKnown}
+%% - sent by each node to all new nodes
+%%-----------------------------------------------------------------
+
+handle_call({whereis, Name}, From, S) ->
+ do_whereis(Name, From),
+ {noreply, S};
+
+handle_call({register, Name, Pid, Method}, _From, S) ->
+ ?P2({register, node(), Name}),
+ ins_name(Name, Pid, Method),
+ {reply, yes, S};
+
+handle_call({unregister, Name}, _From, S) ->
+ case ets:lookup(global_names, Name) of
+ [{_, Pid, _}] ->
+ ?P2({unregister, node(), Name, Pid, node(Pid)}),
+ ets:delete(global_names, Name),
+ dounlink(Pid);
+ _ -> ok
+ end,
+ {reply, ok, S};
+
+handle_call({register_ext, Name, Pid, RegNode}, _F, S) ->
+ ins_name_ext(Name, Pid, RegNode),
+ {reply, yes, S};
+
+handle_call({unregister_ext, Name}, _From, S) ->
+ ets:delete(global_names_ext, Name),
+ {reply, ok, S};
+
+
+handle_call({set_lock, Lock}, {Pid, _Tag}, S) ->
+ Reply = handle_set_lock(Lock, Pid),
+ {reply, Reply, S};
+
+handle_call({del_lock, Lock}, {Pid, _Tag}, S) ->
+ handle_del_lock(Lock, Pid),
+ {reply, true, S};
+
+handle_call(get_known, _From, S) ->
+ {reply, S#state.known, S};
+
+%% R7 may call us?
+handle_call(get_known_v2, _From, S) ->
+ {reply, S#state.known, S};
+
+handle_call({sync, Nodes}, From, S) ->
+ %% If we have several global groups, this won't work, since we will
+ %% do start_sync on a nonempty list of nodes even if the system
+ %% is quiet.
+ Pid = start_sync(lists:delete(node(), Nodes) -- S#state.synced, From),
+ {noreply, S#state{syncers = [Pid | S#state.syncers]}};
+
+handle_call(get_protocol_version, _From, S) ->
+ {reply, ?vsn, S};
+
+handle_call(get_names_ext, _From, S) ->
+ {reply, get_names_ext(), S};
+
+handle_call(info, _From, S) ->
+ {reply, S, S};
+
+handle_call(stop, _From, S) ->
+ {stop, normal, stopped, S}.
+
+
+%%=======================================================================================
+%% init_connect
+%%
+%% Vsn 1 is the original protocol.
+%% Vsn 2 is enhanced with code to take care of registration of names from
+%% non erlang nodes, e.g. c-nodes.
+%% Vsn 3 is enhanced with a tag in the synch messages to distinguish
+%% different synch sessions from each other, see OTP-2766.
+%% Note: This requires also that the ticket OTP-2928 is fixed on the nodes
+%% running vsn 1 or 2; if such nodes will coexist with vsn 3 nodes.
+%%=======================================================================================
+handle_cast({init_connect, Vsn, Node, InitMsg}, S) ->
+ ?FORMAT("~p #### init_connect Vsn ~p, Node ~p, InitMsg ~p~n",[node(), Vsn, Node, InitMsg]),
+ case Vsn of
+ %% It is always the responsibility of newer versions to understand
+ %% older versions of the protocol.
+ {HisVsn, HisTag} when HisVsn > ?vsn ->
+ init_connect(?vsn, Node, InitMsg, HisTag, S#state.lockers, S);
+ {HisVsn, HisTag} ->
+ init_connect(HisVsn, Node, InitMsg, HisTag, S#state.lockers, S);
+ %% To be future compatible
+ Tuple when tuple(Tuple) ->
+ List = tuple_to_list(Tuple),
+ [_HisVsn, HisTag | _] = List,
+ %% use own version handling if his is newer.
+ init_connect(?vsn, Node, InitMsg, HisTag, S#state.lockers, S);
+ _ when Vsn < 3 ->
+ init_connect(Vsn, Node, InitMsg, undef, S#state.lockers, S);
+ _ ->
+ Txt = io_lib:format("Illegal global protocol version ~p Node: ~p",[Vsn, Node]),
+ error_logger:info_report(lists:flatten(Txt))
+ end,
+ {noreply, S};
+
+%%=======================================================================================
+%% lock_is_set
+%%
+%% Ok, the lock is now set on both partitions. Send our names to other node.
+%%=======================================================================================
+handle_cast({lock_is_set, Node, MyTag}, S) ->
+ ?FORMAT("~p #### lock_is_set Node ~p~n",[node(), Node]),
+ Sync_tag_my = get({sync_tag_my, Node}),
+ PVsn = get({prot_vsn, Node}),
+ ?P2({lock_is_set, node(), Node, {MyTag, PVsn}, Sync_tag_my}),
+ case {MyTag, PVsn} of
+ {Sync_tag_my, undefined} ->
+ %% Patch for otp-2728, the connection to the Node is flipping up and down
+ %% the messages from the 'older' sync tries can disturb the 'new' sync try
+ %% therefor all messages are discarded if the protocol vsn is not defined.
+ Txt = io_lib:format("undefined global protocol version Node: ~p",[Node]),
+ error_logger:info_report(lists:flatten(Txt)),
+ {noreply, S};
+ {Sync_tag_my, _} ->
+ %% Check that the Node is still not known
+ case lists:member(Node, S#state.known) of
+ false ->
+ ?P2({lset, node(), Node, false}),
+ lock_is_set(Node, S#state.known),
+ {noreply, S};
+ true ->
+ ?P2({lset, node(), Node, true}),
+ erase({wait_lock, Node}),
+ NewS = cancel_locker(Node, S),
+ {noreply, NewS}
+ end;
+ _ ->
+ ?P2({lset, illegal, node(), Node}),
+ %% Illegal tag, delete the locker.
+ erase({wait_lock, Node}),
+ NewS = cancel_locker(Node, S),
+ {noreply, NewS}
+ end;
+
+%%=======================================================================================
+%% exchange
+%%
+%% Here the names are checked to detect name clashes.
+%%=======================================================================================
+%% Vsn 3 of the protocol
+handle_cast({exchange, Node, NameList, NameExtList, MyTag}, S) ->
+ ?FORMAT("~p #### handle_cast 3 lock_is_set exchange ~p~n",
+ [node(),{Node, NameList, NameExtList, MyTag}]),
+ Sync_tag_my = get({sync_tag_my, Node}),
+ PVsn = get({prot_vsn, Node}),
+ case {MyTag, PVsn} of
+ {Sync_tag_my, undefined} ->
+ %% Patch for otp-2728, the connection to the Node is flipping up and down
+ %% the messages from the 'older' sync tries can disturb the 'new' sync try
+ %% therefor all messages are discarded if the protocol vsn is not defined.
+ Txt = lists:flatten(io_lib:format(
+ "undefined global protocol version Node: ~p",[Node])),
+ error_logger:info_report(Txt),
+ {noreply, S};
+ {Sync_tag_my, _} ->
+ exchange(PVsn, Node, {NameList, NameExtList}, S#state.known),
+ {noreply, S};
+ _ ->
+ %% Illegal tag, delete the locker.
+ erase({wait_lock, Node}),
+ NewS = cancel_locker(Node, S),
+ {noreply, NewS}
+ end;
+
+
+
+%%=======================================================================================
+%% resolved
+%%
+%% Here the name clashes are resolved.
+%%=======================================================================================
+%% Vsn 3 of the protocol
+handle_cast({resolved, Node, Resolved, HisKnown, _HisKnown_v2, Names_ext, MyTag}, S) ->
+ ?FORMAT("~p #### 2 resolved ~p~n",[node(),{Node, Resolved, HisKnown, Names_ext}]),
+ Sync_tag_my = get({sync_tag_my, Node}),
+ PVsn = get({prot_vsn, Node}),
+ case {MyTag, PVsn} of
+ {Sync_tag_my, undefined} ->
+ %% Patch for otp-2728, the connection to the Node is flipping up and down
+ %% the messages from the 'older' sync tries can disturb the 'new' sync try
+ %% therefor all messages are discarded if the protocol vsn is not defined.
+ Txt = lists:flatten(io_lib:format(
+ "undefined global protocol version Node: ~p",[Node])),
+ error_logger:info_report(Txt),
+ {noreply, S};
+ {Sync_tag_my, _} ->
+ NewS = resolved(Node, Resolved, {HisKnown, HisKnown}, Names_ext, S),
+ {noreply, NewS};
+ _ ->
+ %% Illegal tag, delete the locker.
+ erase({wait_lock, Node}),
+ NewS = cancel_locker(Node, S),
+ {noreply, NewS}
+ end;
+
+
+
+
+
+
+%%=======================================================================================
+%% new_nodes
+%%
+%% We get to know the other node's known nodes.
+%%=======================================================================================
+%% Vsn 2 and 3 of the protocol
+handle_cast({new_nodes, _Node, Ops, Names_ext, Nodes, _Nodes_v2}, S) ->
+ ?P2({new_nodes, node(), Nodes}),
+ ?FORMAT("~p #### 2 new_nodes ~p~n",[node(),{Ops, Names_ext, Nodes}]),
+ NewS = new_nodes(Ops, Names_ext, Nodes, S),
+ {noreply, NewS};
+
+
+
+
+%%=======================================================================================
+%% in_sync
+%%
+%% We are in sync with this node (from the other node's known world).
+%%=======================================================================================
+handle_cast({in_sync, Node, IsKnown}, S) ->
+ ?FORMAT("~p #### in_sync ~p~n",[node(),{Node, IsKnown}]),
+ lists:foreach(fun(Pid) -> Pid ! {synced, [Node]} end, S#state.syncers),
+ %% moved up:
+ NewS = cancel_locker(Node, S),
+ erase({wait_lock, Node}),
+ erase({pre_connect, Node}),
+ erase({sync_tag_my, Node}),
+ erase({sync_tag_his, Node}),
+ NKnown = case lists:member(Node, Known = NewS#state.known) of
+ false when IsKnown == true ->
+ gen_server:cast({global_name_server, Node},
+ {in_sync, node(), false}),
+ [Node | Known];
+ _ ->
+ Known
+ end,
+ NSynced = case lists:member(Node, Synced = NewS#state.synced) of
+ true -> Synced;
+ false -> [Node | Synced]
+ end,
+ {noreply, NewS#state{known = NKnown, synced = NSynced}};
+
+
+
+
+%% Called when Pid on other node crashed
+handle_cast({async_del_name, Name, Pid}, S) ->
+ ?P2({async_del_name, node(), Name, Pid, node(Pid)}),
+ case ets:lookup(global_names, Name) of
+ [{Name, Pid, _}] ->
+ ets:delete(global_names, Name),
+ dounlink(Pid);
+ _ -> ok
+ end,
+ ets:delete(global_names_ext, Name),
+ {noreply, S};
+
+handle_cast({async_del_lock, _ResourceId, Pid}, S) ->
+ del_locks2(ets:tab2list(global_locks), Pid),
+% ets:match_delete(global_locks, {ResourceId, '_', Pid}),
+ {noreply, S}.
+
+
+handle_info({'EXIT', Deleter, _Reason}=Exit, #state{the_deleter=Deleter}=S) ->
+ {stop, {deleter_died,Exit}, S#state{the_deleter=undefined}};
+handle_info({'EXIT', Pid, _Reason}, #state{the_deleter=Deleter}=S)
+ when pid(Pid) ->
+ ?P2({global, exit, node(), Pid, node(Pid)}),
+ check_exit(Deleter, Pid),
+ Syncers = lists:delete(Pid, S#state.syncers),
+ Lockers = lists:keydelete(Pid, 2, S#state.lockers),
+ ?PRINT({exit, Pid, lockers, node(), S#state.lockers}),
+ {noreply, S#state{syncers = Syncers, lockers = Lockers}};
+
+handle_info({nodedown, Node}, S) when Node == S#state.node_name ->
+ %% Somebody stopped the distribution dynamically - change
+ %% references to old node name (Node) to new node name ('nonode@nohost')
+ {noreply, change_our_node_name(node(), S)};
+
+handle_info({nodedown, Node}, S) ->
+ ?FORMAT("~p #### nodedown 1 ####### Node ~p",[node(),Node]),
+ %% moved up:
+ do_node_down(Node),
+ #state{known = Known, synced = Syncs} = S,
+ NewS = cancel_locker(Node, S),
+
+ erase({wait_lock, Node}),
+ erase({save_ops, Node}),
+ erase({pre_connect, Node}),
+ erase({prot_vsn, Node}),
+ erase({sync_tag_my, Node}),
+ erase({sync_tag_his, Node}),
+ {noreply, NewS#state{known = lists:delete(Node, Known),
+ synced = lists:delete(Node, Syncs)}};
+
+
+
+handle_info({nodeup, Node}, S) when Node == node() ->
+ ?FORMAT("~p #### nodeup S ####### Node ~p~n",[node(), Node]),
+ %% Somebody started the distribution dynamically - change
+ %% references to old node name ('nonode@nohost') to Node.
+ {noreply, change_our_node_name(Node, S)};
+
+handle_info({nodeup, Node}, S) when S#state.connect_all == true ->
+ ?FORMAT("~p #### nodeup 1 ####### Node ~p",[node(),Node]),
+ IsKnown = lists:member(Node, S#state.known) or
+ %% This one is only for double nodeups (shouldn't occur!)
+ lists:keymember(Node, 1, S#state.lockers),
+ case IsKnown of
+ true ->
+ {noreply, S};
+ false ->
+ %% now() is used as a tag to separate different sycnh sessions
+ %% from each others. Global could be confused at bursty nodeups
+ %% because it couldn't separate the messages between the different
+ %% synch sessions started by a nodeup.
+ MyTag = now(),
+ resend_pre_connect(Node),
+
+ %% multi
+ S#state.the_locker ! {nodeup, Node, S#state.known, MyTag, self()},
+
+ Pid = start_locker(Node, S#state.known, MyTag, self(), S#state.the_locker),
+ Ls = S#state.lockers,
+ InitC = {init_connect, {?vsn, MyTag}, node(), {locker, Pid, S#state.known}},
+ ?P2({putting, MyTag}),
+ put({sync_tag_my, Node}, MyTag),
+ gen_server:cast({global_name_server, Node}, InitC),
+ {noreply, S#state{lockers = [{Node, Pid} | Ls]}}
+ end;
+
+
+%% This message is only to test otp-2766 Global may be confused at bursty
+%% nodeup/nodedowns. It's a copy of the complex part of the handling of
+%% the 'nodeup' message.
+handle_info({test_vsn_tag_nodeup, Node}, S) when S#state.connect_all == true,
+ Node == node() ->
+ {noreply, S};
+handle_info({test_vsn_tag_nodeup, Node}, S) when S#state.connect_all == true ->
+ ?FORMAT("~p #### test_nodeup 1 ####### Node ~p~n",[node(), Node]),
+ MyTag = now(),
+ resend_pre_connect(Node),
+ S#state.the_locker ! {nodeup, Node, S#state.known, MyTag, self()},
+ Pid = start_locker(Node, S#state.known, MyTag, self(), S#state.the_locker),
+ Ls = S#state.lockers,
+ InitC = {init_connect, {?vsn, MyTag}, node(), {locker, Pid, S#state.known}},
+ put({sync_tag_my, Node}, MyTag),
+ gen_server:cast({global_name_server, Node}, InitC),
+ ?PRINT({lockers, node(), Ls}),
+ {noreply, S#state{lockers = [{Node, Pid} | Ls]}};
+
+
+handle_info({whereis, Name, From}, S) ->
+ do_whereis(Name, From),
+ {noreply, S};
+
+handle_info(known, S) ->
+ io:format(">>>> ~p~n",[S#state.known]),
+ {noreply, S};
+
+handle_info(_, S) ->
+ {noreply, S}.
+
+
+
+
+%%=======================================================================================
+%%=======================================================================================
+%%=============================== Internal Functions ====================================
+%%=======================================================================================
+%%=======================================================================================
+
+
+
+%%=======================================================================================
+%% Another node wants to synchronize its registered names with us.
+%% Start a locker process. Both nodes must have a lock before they are
+%% allowed to continue.
+%%=======================================================================================
+init_connect(Vsn, Node, InitMsg, HisTag, Lockers, S) ->
+ ?P2({init_connect, node(), Node}),
+ ?FORMAT("~p #### init_connect Vsn, Node, InitMsg ~p~n",[node(),{Vsn, Node, InitMsg}]),
+ %% It is always the responsibility of newer versions to understand
+ %% older versions of the protocol.
+ put({prot_vsn, Node}, Vsn),
+ put({sync_tag_his, Node}, HisTag),
+ if
+ Vsn =< 3 ->
+ case lists:keysearch(Node, 1, Lockers) of
+ {value, {_Node, MyLocker}} ->
+ %% We both have lockers; let them set the lock
+ case InitMsg of
+ {locker, HisLocker, HisKnown} -> %% current version
+ ?PRINT({init_connect1, node(), self(), Node,
+ MyLocker, HisLocker}),
+ MyLocker ! {his_locker, HisLocker, HisKnown};
+
+ {locker, _HisLocker, HisKnown, HisTheLocker} -> %% multi
+ ?PRINT({init_connect1, node(), self(), Node,
+ MyLocker, _HisLocker}),
+ S#state.the_locker ! {his_the_locker, HisTheLocker,
+ HisKnown, S#state.known}
+ end;
+ false ->
+ ?PRINT({init_connect11, node(), self(), Node}),
+ put({pre_connect, Node}, {Vsn, InitMsg, HisTag})
+ end;
+ true -> % Vsn > 3
+ ?P2(vsn4),
+ case lists:keysearch(Node, 1, Lockers) of
+ {value, {_Node, _MyLocker}} ->
+ %% We both have lockers; let them set the lock
+ case InitMsg of
+ {locker, HisLocker, HisKnown} -> %% current version
+ ?PRINT({init_connect1, node(), self(), Node,
+ _MyLocker, HisLocker}),
+ HisLocker ! {his_locker_new, S#state.the_locker,
+ {HisKnown, S#state.known}};
+
+ {locker, _HisLocker, HisKnown, HisTheLocker} -> %% multi
+ ?PRINT({init_connect1, node(), self(), Node,
+ _MyLocker, _HisLocker}),
+ S#state.the_locker ! {his_the_locker, HisTheLocker,
+ HisKnown, S#state.known}
+ end;
+ false ->
+ ?PRINT({init_connect11, node(), self(), Node}),
+ put({pre_connect, Node}, {Vsn, InitMsg, HisTag})
+ end
+ end.
+
+
+
+%%=======================================================================================
+%% In the simple case, we'll get lock_is_set before we get exchange,
+%% but we may get exchange before we get lock_is_set from our locker.
+%% If that's the case, we'll have to remember the exchange info, and
+%% handle it when we get the lock_is_set. We do this by using the
+%% process dictionary - when the lock_is_set msg is received, we store
+%% this info. When exchange is received, we can check the dictionary
+%% if the lock_is_set has been received. If not, we store info about
+%% the exchange instead. In the lock_is_set we must first check if
+%% exchange info is stored, in that case we take care of it.
+%%=======================================================================================
+lock_is_set(Node, Known) ->
+ ?FORMAT("~p #### lock_is_set ~p~n",[node(),{Node, Node, Known}]),
+ PVsn = get({prot_vsn, Node}),
+ case PVsn of
+ _ -> % 3 and higher
+ gen_server:cast({global_name_server, Node},
+ {exchange, node(), get_names(), get_names_ext(),
+ get({sync_tag_his, Node})})
+ end,
+ %% If both have the lock, continue with exchange
+ case get({wait_lock, Node}) of
+ {exchange, NameList, NameExtList} ->
+ %% vsn 2, 3
+ put({wait_lock, Node}, lock_is_set),
+ exchange(PVsn, Node, {NameList, NameExtList}, Known);
+ undefined ->
+ put({wait_lock, Node}, lock_is_set)
+ end.
+
+
+
+%%=======================================================================================
+%% exchange
+%%=======================================================================================
+%% Vsn 3 and higher of the protocol
+exchange(_Vsn, Node, {NameList, NameExtList}, Known) ->
+ ?FORMAT("~p #### 3 lock_is_set exchange ~p~n",[node(),{Node, NameList, NameExtList}]),
+ case erase({wait_lock, Node}) of
+ lock_is_set ->
+ {Ops, Resolved} = exchange_names(NameList, Node, [], []),
+ put({save_ops, Node}, Ops),
+ gen_server:cast({global_name_server, Node},
+ {resolved, node(), Resolved, Known,
+ Known, get_names_ext(), get({sync_tag_his, Node})});
+ undefined ->
+ put({wait_lock, Node}, {exchange, NameList, NameExtList})
+ end.
+
+
+
+
+
+resolved(Node, Resolved, {HisKnown, _HisKnown_v2}, Names_ext, S) ->
+ ?P2({resolved, node(), Node, S#state.known}),
+ ?FORMAT("~p #### 2 resolved ~p~n",[node(),{Node, Resolved, HisKnown, Names_ext}]),
+ erase({prot_vsn, Node}),
+ Ops = erase({save_ops, Node}) ++ Resolved,
+ Known = S#state.known,
+ Synced = S#state.synced,
+ NewNodes = [Node | HisKnown],
+ do_ops(Ops),
+ do_ops_ext(Ops,Names_ext),
+ gen_server:abcast(Known, global_name_server,
+ {new_nodes, node(), Ops, Names_ext, NewNodes, NewNodes}),
+ %% I am synced with Node, but not with HisKnown yet
+ lists:foreach(fun(Pid) -> Pid ! {synced, [Node]} end, S#state.syncers),
+ gen_server:abcast(HisKnown, global_name_server, {in_sync, node(), true}),
+ NewS = lists:foldl(fun(Node1, S1) -> cancel_locker(Node1, S1) end,
+ S,
+ NewNodes),
+ %% See (*) below... we're node b in that description
+ NewKnown = Known ++ (NewNodes -- Known),
+ NewS#state{known = NewKnown, synced = [Node | Synced]}.
+
+
+
+
+new_nodes(Ops, Names_ext, Nodes, S) ->
+ ?FORMAT("~p #### 2 new_nodes ~p~n",[node(),{Ops, Names_ext, Nodes}]),
+ do_ops(Ops),
+ do_ops_ext(Ops,Names_ext),
+ Known = S#state.known,
+ %% (*) This one requires some thought...
+ %% We're node a, other nodes b and c:
+ %% The problem is that {in_sync, a} may arrive before {resolved, [a]} to
+ %% b from c, leading to b sending {new_nodes, [a]} to us (node a).
+ %% Therefore, we make sure we never get duplicates in Known.
+ NewNodes = lists:delete(node(), Nodes -- Known),
+ gen_server:abcast(NewNodes, global_name_server, {in_sync, node(), true}),
+ S#state{known = Known ++ NewNodes}.
+
+
+
+
+
+do_whereis(Name, From) ->
+ case is_lock_set(global) of
+ false ->
+ gen_server:reply(From, where(Name));
+ true ->
+ send_again({whereis, Name, From})
+ end.
+
+terminate(_Reason, _S) ->
+ ets:delete(global_names),
+ ets:delete(global_names_ext),
+ ets:delete(global_locks).
+
+code_change(_OldVsn, S, _Extra) ->
+ {ok, S}.
+
+%% Resend init_connect to ourselves.
+resend_pre_connect(Node) ->
+ case erase({pre_connect, Node}) of
+% {Vsn, InitMsg, undef} ->
+% %% Vsn 1 & 2
+% ?PRINT({resend_pre_connect2, node(), self(), Node}),
+% gen_server:cast(self(), {init_connect, Vsn, Node, InitMsg});
+ {Vsn, InitMsg, HisTag} ->
+ %% Vsn 3
+ ?PRINT({resend_pre_connect3, node(), self(), Node}),
+ gen_server:cast(self(), {init_connect, {Vsn, HisTag}, Node, InitMsg});
+ _ ->
+ ?PRINT({resend_pre_connect0, node(), self(), Node}),
+ ok
+ end.
+
+ins_name(Name, Pid, Method) ->
+ case ets:lookup(global_names, Name) of
+ [{Name, Pid2, _}] ->
+ dounlink(Pid2);
+ [] ->
+ ok
+ end,
+ dolink(Pid),
+ ets:insert(global_names, {Name, Pid, Method}).
+
+ins_name_ext(Name, Pid, RegNode) ->
+ case ets:lookup(global_names_ext, Name) of
+ [{Name, Pid2, _}] ->
+ dounlink(Pid2);
+ [] ->
+ ok
+ end,
+ dolink_ext(Pid, RegNode),
+ ets:insert(global_names_ext, {Name, Pid, RegNode}).
+
+where(Name) ->
+ case ets:lookup(global_names, Name) of
+ [{_, Pid, _}] -> Pid;
+ [] -> undefined
+ end.
+
+handle_set_lock({ResourceId, LockRequesterId}, Pid) ->
+ case ets:lookup(global_locks, ResourceId) of
+ [{ResourceId, LockRequesterId, Pids}] ->
+ case lists:member(Pid, Pids) of
+ true ->
+ true;
+ false ->
+ dolink(Pid),
+ ets:insert(global_locks, {ResourceId, LockRequesterId, [Pid | Pids]}),
+ true
+ end;
+ [{ResourceId, _LockRequesterId2, _Pid2}] ->
+ case ResourceId of
+ global ->
+ ?P({before,
+ LockRequesterId,
+ _LockRequesterId2,
+ S#state.lockers}),
+ false;
+ _ ->
+ false
+ end;
+ [] ->
+ dolink(Pid),
+ ets:insert(global_locks, {ResourceId, LockRequesterId, [Pid]}),
+ true
+ end.
+
+is_lock_set(ResourceId) ->
+ case ets:lookup(global_locks, ResourceId) of
+ [_Lock] -> true;
+ [] -> false
+ end.
+
+handle_del_lock({ResourceId, LockRequesterId}, Pid) ->
+ case ets:lookup(global_locks, ResourceId) of
+ [{ResourceId, LockRequesterId, Pids}] when [Pid] == Pids ->
+ ets:delete(global_locks, ResourceId),
+ dounlink(Pid);
+ [{ResourceId, LockRequesterId, Pids}] ->
+ NewPids = lists:delete(Pid, Pids),
+ ets:insert(global_locks, {ResourceId, LockRequesterId, NewPids}),
+ dounlink(Pid);
+ _ -> ok
+ end.
+
+do_ops(Ops) ->
+ lists:foreach(fun({insert, Item}) -> ets:insert(global_names, Item);
+ ({delete, Name}) ->
+ case ets:lookup(global_names, Name) of
+ [{Name, Pid, _}] ->
+ ?P2({do_ops_delete, node(), Name, Pid, node(Pid)}),
+ ets:delete(global_names, Name),
+ dounlink(Pid);
+ [] ->
+ ok
+ end
+ end, Ops).
+
+%% If a new name, then it must be checked if it is an external name
+%% If delete a name it is always deleted from global_names_ext
+do_ops_ext(Ops, Names_ext) ->
+ lists:foreach(fun({insert, {Name, Pid, _Method}}) ->
+ case lists:keysearch(Name, 1, Names_ext) of
+ {value, {Name, Pid, RegNode}} ->
+ ets:insert(global_names_ext, {Name, Pid, RegNode});
+ _ ->
+ ok
+ end;
+ ({delete, Name}) ->
+ ets:delete(global_names_ext, Name)
+ end, Ops).
+
+%%-----------------------------------------------------------------
+%% A locker is a process spawned by global_name_server when a
+%% nodeup is received from a new node. Its purpose is to try to
+%% set a lock in our partition, i.e. on all nodes known to us.
+%% When the lock is set, it tells global about it, and keeps
+%% the lock set. global sends a cancel message to the locker when
+%% the partitions are connected.
+
+%% Versions: at version 2, the messages exchanged between the lockers
+%% include the known nodes (see OTP-3576). There is no way of knowing
+%% the version number of the other side's locker when sending a message
+%% to it, so we send both version 1 and 2, and flush the version 1 if
+%% we receive version 2.
+%%
+%% Due to a mistake, an intermediate version of the new locking protocol
+%% (using 3-tuples) went out in R7, which only understands itself. This patch
+%% to R7 handles all kinds, which means sending all, and flush the ones we
+%% don't want. (It will remain difficult to make a future version of the
+%% protocol communicate with this one.)
+%%
+%%-----------------------------------------------------------------
+%% (Version 2 in patched R7. No named version in R6 and older - let's call that
+%% version 1.)
+-define(locker_vsn, 2).
+
+%%% multi
+
+-record(multi, {known, others = []}).
+
+start_the_locker(Global) ->
+ spawn_link(?MODULE, init_the_locker, [Global]).
+
+%init_the_locker(Global) ->
+% ok;
+init_the_locker(Global) ->
+ process_flag(trap_exit, true), %needed?
+ loop_the_locker(Global, #multi{}),
+ erlang:error(locker_exited).
+
+remove_node(_Node, []) ->
+ [];
+remove_node(Node, [{Node, _HisTheLocker, _HisKnown, _MyTag} | Rest]) ->
+ Rest;
+remove_node(Node, [E | Rest]) ->
+ [E | remove_node(Node, Rest)].
+
+find_node_tag(_Node, []) ->
+ false;
+find_node_tag(Node, [{Node, _HisTheLocker, _HisKnown, MyTag} | _Rest]) ->
+ {true, MyTag};
+find_node_tag(Node, [_E | Rest]) ->
+ find_node_tag(Node, Rest).
+
+loop_the_locker(Global, S) ->
+ ?P2({others, node(), S#multi.others}),
+% Known = S#multi.known,
+ Timeout = case S#multi.others of
+ [] ->
+ infinity;
+ _ ->
+ 0
+ end,
+ receive
+% {nodeup, Node, Known, Tag, P} ->
+% ?P2({the_locker, nodeup, time(), node(), nodeup, Node, Tag}),
+% loop_the_locker(Global, S);
+ {his_the_locker, HisTheLocker, HisKnown, MyKnown} ->
+ ?P2({his_the_locker, time(), node(), HisTheLocker,
+ node(HisTheLocker)}),
+ receive
+ {nodeup, Node, _Known, MyTag, _P} when node(HisTheLocker) == Node ->
+ ?P2({the_locker, nodeup, node(), Node,
+ node(HisTheLocker), MyTag,
+ process_info(self(), messages)}),
+ Others = S#multi.others,
+ loop_the_locker(Global,
+ S#multi{known=MyKnown,
+ others=[{node(HisTheLocker), HisTheLocker, HisKnown, MyTag} | Others]});
+ {cancel, Node, _Tag} when node(HisTheLocker) == Node ->
+ loop_the_locker(Global, S)
+ after 60000 ->
+ ?P2({nodeupnevercame, node(), node(HisTheLocker)}),
+ error_logger:error_msg("global: nodeup never came ~w ~w~n",
+ [node(), node(HisTheLocker)]),
+ loop_the_locker(Global, S)
+ end;
+ {cancel, Node, undefined} ->
+ ?P2({the_locker, cancel1, undefined, node(), Node}),
+%% If we actually cancel something when a cancel message with the tag
+%% 'undefined' arrives, we may be acting on an old nodedown, to cancel
+%% a new nodeup, so we can't do that.
+% receive
+% {nodeup, Node, _Known, _MyTag, _P} ->
+% ?P2({the_locker, cancelnodeup1, node(), Node}),
+% ok
+% after 0 ->
+% ok
+% end,
+% Others = remove_node(Node, S#multi.others),
+% loop_the_locker(Global, S#multi{others = Others});
+ loop_the_locker(Global, S);
+ {cancel, Node, Tag} ->
+ ?P2({the_locker, cancel1, Tag, node(), Node}),
+ receive
+ {nodeup, Node, _Known, Tag, _P} ->
+ ?P2({the_locker, cancelnodeup2, node(), Node}),
+ ok
+ after 0 ->
+ ok
+ end,
+ Others = remove_node(Node, S#multi.others),
+ loop_the_locker(Global, S#multi{others = Others});
+ {lock_set, _Pid, false, _} ->
+ ?P2({the_locker, spurious, node(), node(_Pid)}),
+ loop_the_locker(Global, S);
+ {lock_set, Pid, true, HisKnown} ->
+ Node = node(Pid),
+ ?P2({the_locker, spontaneous, node(), Node}),
+
+ NewKnown = gen_server:call(global_name_server, get_known),
+
+ Others =
+ case find_node_tag(Node, S#multi.others) of
+ {true, MyTag} ->
+
+ BothsKnown = HisKnown -- (HisKnown -- NewKnown),
+ Known1 = if
+ node() < Node ->
+ [node() | NewKnown];
+ true ->
+ [node() | NewKnown] -- BothsKnown
+ end,
+
+ ?P2({lock1, node()}),
+ LockId = {global, self()},
+ IsLockSet = set_lock(LockId, Known1, 1),
+ Pid ! {lock_set, self(), IsLockSet, NewKnown},
+ ?P2({the_locker, spontaneous, node(), Node, IsLockSet}),
+ case IsLockSet of
+ true ->
+ gen_server:cast(global_name_server,
+ {lock_is_set, Node, MyTag}),
+ ?P1({lock_sync_done, time(), node(),
+ {Pid, node(Pid)}, self()}),
+ %% Wait for global to tell us to remove lock.
+ receive
+ {cancel, Node, _Tag} ->
+ %% All conflicts are resolved,
+ %% remove lock.
+ ?PRINT({node(), self(), locked1}),
+ del_lock(LockId, Known1);
+ {'EXIT', Pid, _} ->
+ ?PRINT({node(), self(), locked2}),
+ %% Other node died;
+ %% remove lock and ignore him.
+ del_lock(LockId, Known1),
+ link(Global)
+ end,
+ remove_node(Node, S#multi.others);
+ false ->
+ S#multi.others
+ end;
+ false ->
+ ?P2({the_locker, spontaneous, node(), Node, not_there}),
+ Pid ! {lock_set, self(), false, NewKnown},
+ S#multi.others
+ end,
+ loop_the_locker(Global, S#multi{others = Others});
+ Other when element(1, Other) /= nodeup ->
+ ?P2({the_locker, other_msg, Other}),
+ loop_the_locker(Global, S)
+ after Timeout ->
+ NewKnown = gen_server:call(global_name_server, get_known),
+ [{Node, HisTheLocker, HisKnown, MyTag} | Rest] = S#multi.others,
+ BothsKnown = HisKnown -- (HisKnown -- NewKnown),
+ Known1 = if
+ node() < Node ->
+ [node() | NewKnown];
+ true ->
+ [node() | NewKnown] -- BothsKnown
+ end,
+ ?P2({picking, node(), Node}),
+ case lists:member(Node, NewKnown) of
+ false ->
+ LockId = {global, self()},
+ ?P2({lock2, node()}),
+ IsLockSet = set_lock(LockId, Known1, 1),
+ Others =
+ case IsLockSet of
+ true ->
+ HisTheLocker ! {lock_set, self(),
+ IsLockSet, NewKnown},
+ %% OTP-4902
+ lock_set_loop(Global, S,
+ Node, MyTag, Rest,
+ Known1,
+ LockId);
+ false ->
+ ?P2({the_locker, not_locked, node(),
+ Node}),
+ S#multi.others
+ end,
+ loop_the_locker(Global, S#multi{known=NewKnown,
+ others = Others});
+ true ->
+ ?P2({is_known, node(), Node}),
+ loop_the_locker(Global, S#multi{known=NewKnown,
+ others = Rest})
+ end
+ end.
+
+lock_set_loop(Global, S, Node, MyTag, Rest, Known1, LockId) ->
+ receive
+ {lock_set, P, true, _} when node(P) == Node ->
+ ?P2({the_locker, both_set, node(), Node}),
+
+ %% do sync
+ gen_server:cast(global_name_server, {lock_is_set, Node, MyTag}),
+ ?P1({lock_sync_done, time(), node(), {Pid, node(Pid)}, self()}),
+
+ %% Wait for global to tell us to remove lock.
+ receive
+ {cancel, Node, _} ->
+ %% All conflicts are resolved, remove lock.
+ ?PRINT({node(), self(), locked1}),
+ del_lock(LockId, Known1);
+ {'EXIT', _Pid, _} ->
+ ?PRINT({node(), self(), locked2}),
+ %% Other node died; remove lock and ignore him.
+ del_lock(LockId, Known1),
+ link(Global)
+ end,
+ Rest;
+ {lock_set, P, false, _} when node(P) == Node ->
+ ?P2({the_locker, not_both_set, node(), Node}),
+ del_lock(LockId, Known1),
+ S#multi.others;
+ {cancel, Node, _} ->
+ ?P2({the_locker, cancel2, node(), Node}),
+ del_lock(LockId, Known1),
+ remove_node(Node, S#multi.others);
+ {'EXIT', _, _} ->
+ ?P2({the_locker, exit, node(), Node}),
+ del_lock(LockId, Known1),
+ S#multi.others
+
+ after
+ %% OTP-4902
+ %% A cyclic deadlock could occur in rare cases where three or
+ %% more nodes waited for a reply from each other.
+ %% Therefore, reject lock_set attempts in this state from
+ %% nodes < this node (its enough if at least one node in
+ %% the cycle rejects and thus breaks the deadlock)
+ 5000 ->
+ reject_lock_set(),
+ lock_set_loop(Global, S, Node, MyTag, Rest, Known1, LockId)
+ end.
+
+reject_lock_set() ->
+ receive
+ {lock_set, P, true, _} when node(P) < node() ->
+ P ! {lock_set, self(), false, []},
+ reject_lock_set()
+ after
+ 0 ->
+ true
+ end.
+
+start_locker(Node, Known, MyTag, Global, TheLocker) ->
+ %% No link here! The del_lock call would delete the link anyway.
+ %% global_name_server has control of these processes anyway...
+ %% When the locker process exits due to being sent the 'cancel' message
+ %% by the server, the server then removes it from its tables.
+ %% When the locker terminates due to other reasons, the server must
+ %% be told, so we make a link to it just before exiting.
+ spawn(?MODULE, init_locker, [Node, Known, MyTag, Global, TheLocker]).
+
+init_locker(Node, Known, MyTag, Global, TheLocker) ->
+ process_flag(trap_exit, true),
+ ?PRINT({init_locker, node(), self(), Node}),
+ ?P1({init_locker, time(), node(), self(), Node}),
+ receive
+ {his_locker, Pid, HisKnown} ->
+ ?PRINT({init_locker, node(), self(), his_locker, Node}),
+ link(Pid),
+ %% If two nodes in a group of nodes first disconnect
+ %% and then reconnect, this causes global to deadlock.
+ %% This because both of the reconnecting nodes
+ %% tries to set lock on the other nodes in the group.
+ %% This is solved by letting only one of the reconneting nodes set the lock.
+ BothsKnown = HisKnown -- (HisKnown -- Known),
+ ?P({loop_locker1, node(), {Pid, node(Pid)}}),
+ Res = loop_locker(Node, Pid, Known, 1, MyTag, BothsKnown, Global),
+ ?P({loop_locker2, node(), {Pid, node(Pid)}}),
+ Res;
+ {his_locker_new, HisTheLocker, {Known1, Known2}} ->
+ %% slide into the vsn 4 stuff
+ ?P2({his_locker_new, node()}),
+ HisTheLocker ! {his_the_locker, TheLocker, Known1, Known2},
+ exit(normal);
+ cancel ->
+ ?PRINT({init_locker, node(), self(), cancel, Node}),
+ exit(normal)
+ end.
+
+loop_locker(Node, Pid, Known0, Try, MyTag, BothsKnown, Global) ->
+ Known = if
+ node() < Node ->
+ [node() | Known0];
+ true ->
+ [node() | Known0] -- BothsKnown
+ end,
+
+ ?PRINT({locking, node(), self(), Known}),
+ LockId = {global, self()},
+ ?P2({lock3, node()}),
+ IsLockSet = set_lock(LockId, Known, 1),
+ ?P({loop_locker, IsLockSet,
+ node(), {Pid, node(Pid)}, self(), Try}),
+ ?P1({loop_locker, time(), IsLockSet,
+ node(), {Pid, node(Pid)}, self(), Try}),
+ ?PRINT({locking1, node(), self(), Known, IsLockSet}),
+ %% Tell other node that we managed to get the lock.
+ Pid ! {lock, ?locker_vsn, IsLockSet, Known},
+ Pid ! {lock, IsLockSet, Known},
+ Pid ! {lock, IsLockSet},
+ %% Wait for other node's result.
+ receive
+ %% R7 patched and later
+ {lock, _LockerVsn, true, _} when IsLockSet == true ->
+ receive
+ {lock, _} ->
+ ok
+ end,
+ receive
+ {lock, _, _} ->
+ ok
+ end,
+ ?PRINT({node(), self(), locked}),
+ %% Now we got the lock in both partitions. Tell
+ %% global, and let him resolve name conflict.
+ ?P1({lock_sync, time(), node(), {Pid, node(Pid)}, self()}),
+ gen_server:cast(global_name_server, {lock_is_set, Node, MyTag}),
+ ?P1({lock_sync_done, time(), node(), {Pid, node(Pid)}, self()}),
+ %% Wait for global to tell us to remove lock.
+ receive
+ cancel ->
+ %% All conflicts are resolved, remove lock.
+ ?PRINT({node(), self(), locked1}),
+ del_lock(LockId, Known);
+ {'EXIT', Pid, _} ->
+ ?PRINT({node(), self(), locked2}),
+ %% Other node died; remove lock and ignore him.
+ del_lock(LockId, Known),
+ link(Global)
+ end;
+ {lock, _LockerVsn, _, HisKnown} ->
+ receive
+ {lock, _} ->
+ ok
+ end,
+ receive
+ {lock, _, _} ->
+ ok
+ end,
+ %% Some of us failed to get the lock; try again
+ ?PRINT({node(), self(), locked0}),
+ d_lock(IsLockSet, LockId, Known),
+ try_again_locker(Node, Pid, Try, MyTag, HisKnown, Global);
+ %% R7 unpatched
+ {lock, true, _} when IsLockSet == true ->
+ ?PRINT({node(), self(), locked}),
+ %% Now we got the lock in both partitions. Tell
+ %% global, and let him resolve name conflict.
+ gen_server:cast(global_name_server, {lock_is_set, Node, MyTag}),
+ %% Wait for global to tell us to remove lock.
+ receive
+ cancel ->
+ %% All conflicts are resolved, remove lock.
+ ?PRINT({node(), self(), locked1}),
+ del_lock(LockId, Known);
+ {'EXIT', Pid, _} ->
+ ?PRINT({node(), self(), locked2}),
+ %% Other node died; remove lock and ignore him.
+ del_lock(LockId, Known),
+ link(Global)
+ end;
+ {lock, _, HisKnown} ->
+ %% Some of us failed to get the lock; try again
+ ?PRINT({node(), self(), locked0}),
+ d_lock(IsLockSet, LockId, Known),
+ try_again_locker(Node, Pid, Try, MyTag, HisKnown, Global);
+ %% R6 and earlier
+ {lock, true} when IsLockSet == true ->
+ ?PRINT({node(), self(), locked}),
+ %% Now we got the lock in both partitions. Tell
+ %% global, and let him resolve name conflict.
+ gen_server:cast(global_name_server, {lock_is_set, Node, MyTag}),
+ %% Wait for global to tell us to remove lock.
+ receive
+ cancel ->
+ %% All conflicts are resolved, remove lock.
+ ?PRINT({node(), self(), locked1}),
+ del_lock(LockId, Known);
+ {'EXIT', Pid, _} ->
+ ?PRINT({node(), self(), locked2}),
+ %% Other node died; remove lock and ignore him.
+ del_lock(LockId, Known),
+ link(Global)
+ end;
+ {lock, _} ->
+ %% Some of us failed to get the lock; try again
+ ?PRINT({node(), self(), locked0}),
+ d_lock(IsLockSet, LockId, Known),
+ try_again_locker(Node, Pid, Try, MyTag, BothsKnown, Global);
+ {'EXIT', Pid, _} ->
+ %% Other node died; remove lock and ignore him.
+ ?PRINT({node(), self(), locked7}),
+ d_lock(IsLockSet, LockId, Known),
+ link(Global);
+ cancel ->
+ ?PRINT({node(), self(), locked8}),
+ d_lock(IsLockSet, LockId, Known)
+ end.
+
+d_lock(true, LockId, Known) -> del_lock(LockId, Known);
+d_lock(false, _, _) -> ok.
+
+try_again_locker(Node, Pid, Try, MyTag, HisKnown, Global) ->
+ ?PRINT({try_again, node(), self(), Node, Pid, Known, Try, MyTag}),
+ ?P1({try_again, time(), node(), self(), Node, Pid, Known, Try, MyTag}),
+ random_sleep(Try),
+ ?P1({try_again2, time(), node(), self(), Node, Pid, Known, Try, MyTag}),
+ NewKnown = gen_server:call(global_name_server, get_known),
+ case lists:member(Node, NewKnown) of
+ false ->
+ BothsKnown1 = HisKnown -- (HisKnown -- NewKnown),
+ ?PRINT({node(), self(), Node, again, notknown}),
+ ?PRINT({bothknown, BothsKnown, BothsKnown1}),
+ loop_locker(Node, Pid, NewKnown, Try+1, MyTag,
+ BothsKnown1, Global);
+ true ->
+ ?PRINT({node(), self(), Node, again, known}),
+ link(Global),
+ %% Node is already handled, we are ready.
+ ok
+ end.
+
+cancel_locker(Node, S) ->
+ %% multi
+ ?P2({cancel, node(), Node, get({sync_tag_my, Node})}),
+ S#state.the_locker ! {cancel, Node, get({sync_tag_my, Node})},
+
+ Lockers = S#state.lockers,
+ case lists:keysearch(Node, 1, Lockers) of
+ {value, {_, Pid}} ->
+ Pid ! cancel,
+ ?PRINT({cancel, Node, lockers, node(), Lockers}),
+ S#state{lockers = lists:keydelete(Node, 1, Lockers)};
+ _ ->
+ S
+ end.
+
+%% A node sent us his names. When a name clash is found, the resolve
+%% function is called from the smaller node => all resolve funcs are called
+%% from the same partition.
+exchange_names([{Name, Pid, Method} |Tail], Node, Ops, Res) ->
+ case ets:lookup(global_names, Name) of
+ [{Name, Pid, _}] ->
+ exchange_names(Tail, Node, Ops, Res);
+ [{Name, Pid2, Method2}] when node() < Node ->
+ %% Name clash! Add the result of resolving to Res(olved).
+ %% We know that node(Pid) /= node(), so we don't
+ %% need to link/unlink to Pid.
+ Node2 = node(Pid2), %%&&&&&& check external node???
+ case rpc:call(Node2, ?MODULE, resolve_it,
+ [Method2, Name, Pid, Pid2]) of
+ Pid ->
+ dounlink(Pid2),
+ ets:insert(global_names, {Name, Pid, Method}),
+ Op = {insert, {Name, Pid, Method}},
+ exchange_names(Tail, Node, [Op | Ops], [Op | Res]);
+ Pid2 ->
+ Op = {insert, {Name, Pid2, Method2}},
+ exchange_names(Tail, Node, Ops, [Op | Res]);
+ none ->
+ dounlink(Pid2),
+ ?P2({unregister, node(), Name, Pid2, node(Pid2)}),
+ ets:delete(global_names, Name),
+ Op = {delete, Name},
+ exchange_names(Tail, Node, [Op | Ops], [Op | Res]);
+ {badrpc, Badrpc} ->
+ error_logger:info_msg("global: badrpc ~w received when "
+ "conflicting name ~w was found",
+ [Badrpc, Name]),
+ dounlink(Pid2),
+ ets:insert(global_names, {Name, Pid, Method}),
+ Op = {insert, {Name, Pid, Method}},
+ exchange_names(Tail, Node, [Op | Ops], [Op | Res]);
+ Else ->
+ error_logger:info_msg("global: Resolve method ~w for "
+ "conflicting name ~w returned ~w~n",
+ [Method, Name, Else]),
+ dounlink(Pid2),
+ ets:delete(global_names, Name),
+ Op = {delete, Name},
+ exchange_names(Tail, Node, [Op | Ops], [Op | Res])
+ end;
+ [{Name, _Pid2, _}] ->
+ %% The other node will solve the conflict.
+ exchange_names(Tail, Node, Ops, Res);
+ _ ->
+ %% Entirely new name.
+ ets:insert(global_names, {Name, Pid, Method}),
+ exchange_names(Tail, Node,
+ [{insert, {Name, Pid, Method}} | Ops], Res)
+ end;
+exchange_names([], _, Ops, Res) ->
+ {Ops, Res}.
+
+resolve_it(Method, Name, Pid1, Pid2) ->
+ catch Method(Name, Pid1, Pid2).
+
+minmax(P1,P2) ->
+ if node(P1) < node(P2) -> {P1, P2}; true -> {P2, P1} end.
+
+random_exit_name(Name, Pid, Pid2) ->
+ {Min, Max} = minmax(Pid, Pid2),
+ error_logger:info_msg("global: Name conflict terminating ~w~n",
+ [{Name, Max}]),
+ exit(Max, kill),
+ Min.
+
+random_notify_name(Name, Pid, Pid2) ->
+ {Min, Max} = minmax(Pid, Pid2),
+ Max ! {global_name_conflict, Name},
+ Min.
+
+notify_all_name(Name, Pid, Pid2) ->
+ Pid ! {global_name_conflict, Name, Pid2},
+ Pid2 ! {global_name_conflict, Name, Pid},
+ none.
+
+cnode(Name, Pid, Pid2) ->
+ {Min, Max} = minmax(Pid, Pid2),
+ error_logger:info_msg("global: Name conflict terminating ~w~n",
+ [{Name, Max}]),
+ Max ! {global_name_conflict, Name},
+ Min.
+
+%% Only link to pids on our own node
+dolink(Pid) when node(Pid) == node() ->
+ link(Pid);
+dolink(_) -> ok.
+
+%% Only link to pids on our own node
+dolink_ext(Pid, RegNode) when RegNode == node() -> link(Pid);
+dolink_ext(_, _) -> ok.
+
+dounlink(Pid) when node(Pid) == node() ->
+ case ets:match(global_names, {'_', Pid, '_'}) of
+ [] ->
+ case is_pid_used(Pid) of
+ false ->
+ unlink(Pid);
+ true -> ok
+ end;
+ _ -> ok
+ end;
+dounlink(_Pid) ->
+ ok.
+
+is_pid_used(Pid) ->
+ is_pid_used(ets:tab2list(global_locks), Pid).
+
+is_pid_used([], _Pid) ->
+ false;
+is_pid_used([{_ResourceId, _LockReqId, Pids} | Tail], Pid) ->
+ case lists:member(Pid, Pids) of
+ true ->
+ true;
+ false ->
+ is_pid_used(Tail, Pid)
+ end.
+
+
+
+%% check_exit/3 removes the Pid from affected tables.
+%% This function needs to abcast the thingie since only the local
+%% server is linked to the registered process (or the owner of the
+%% lock). All the other servers rely on the nodedown mechanism.
+check_exit(Deleter, Pid) ->
+ del_names(Deleter, Pid, ets:tab2list(global_names)),
+ del_locks(ets:tab2list(global_locks), Pid).
+
+del_names(Deleter, Pid, [{Name, Pid, _Method} | Tail]) ->
+ %% First, delete the Pid from the local ets; then send to other nodes
+ ets:delete(global_names, Name),
+ ets:delete(global_names_ext, Name),
+ dounlink(Pid),
+ Deleter ! {delete_name,self(),Name,Pid},
+ del_names(Deleter, Pid, Tail);
+del_names(Deleter, Pid, [_|T]) ->
+ del_names(Deleter, Pid, T);
+del_names(_Deleter, _Pid, []) -> done.
+
+del_locks([{ResourceId, LockReqId, Pids} | Tail], Pid) ->
+ case {lists:member(Pid, Pids), Pids} of
+ {true, [Pid]} ->
+ ets:delete(global_locks, ResourceId),
+ gen_server:abcast(nodes(), global_name_server,
+ {async_del_lock, ResourceId, Pid});
+ {true, _} ->
+ NewPids = lists:delete(Pid, Pids),
+ ets:insert(global_locks, {ResourceId, LockReqId, NewPids}),
+ gen_server:abcast(nodes(), global_name_server,
+ {async_del_lock, ResourceId, Pid});
+ _ ->
+ continue
+ end,
+ del_locks(Tail, Pid);
+del_locks([], _Pid) -> done.
+
+del_locks2([{ResourceId, LockReqId, Pids} | Tail], Pid) ->
+ case {lists:member(Pid, Pids), Pids} of
+ {true, [Pid]} ->
+ ets:delete(global_locks, ResourceId);
+ {true, _} ->
+ NewPids = lists:delete(Pid, Pids),
+ ets:insert(global_locks, {ResourceId, LockReqId, NewPids});
+ _ ->
+ continue
+ end,
+ del_locks2(Tail, Pid);
+del_locks2([], _Pid) ->
+ done.
+
+
+
+%% Unregister all Name/Pid pairs such that node(Pid) == Node
+%% and delete all locks where node(Pid) == Node
+do_node_down(Node) ->
+ do_node_down_names(Node, ets:tab2list(global_names)),
+ do_node_down_names_ext(Node, ets:tab2list(global_names_ext)),
+ do_node_down_locks(Node, ets:tab2list(global_locks)).
+
+do_node_down_names(Node, [{Name, Pid, _Method} | T]) when node(Pid) == Node ->
+ ets:delete(global_names, Name),
+ do_node_down_names(Node, T);
+do_node_down_names(Node, [_|T]) ->
+ do_node_down_names(Node, T);
+do_node_down_names(_, []) -> ok.
+
+%%remove all external names registered on the crashed node
+do_node_down_names_ext(Node, [{Name, _Pid, Node} | T]) ->
+ ets:delete(global_names, Name),
+ ets:delete(global_names_ext, Name),
+ do_node_down_names_ext(Node, T);
+do_node_down_names_ext(Node, [_|T]) ->
+ do_node_down_names_ext(Node, T);
+do_node_down_names_ext(_, []) -> ok.
+
+do_node_down_locks(Node, [{ResourceId, LockReqId, Pids} | T]) ->
+ case do_node_down_locks2(Pids, Node) of
+ [] ->
+ continue;
+ RemovePids ->
+ case Pids -- RemovePids of
+ [] ->
+ ets:delete(global_locks, ResourceId);
+ NewPids ->
+ ets:insert(global_locks, {ResourceId, LockReqId, NewPids})
+ end
+ end,
+ do_node_down_locks(Node, T);
+do_node_down_locks(Node, [_|T]) ->
+ do_node_down_locks(Node, T);
+do_node_down_locks(_, []) -> done.
+
+
+do_node_down_locks2(Pids, Node) ->
+ do_node_down_locks2(Pids, Node, []).
+
+do_node_down_locks2([], _Node, Res) ->
+ Res;
+do_node_down_locks2([Pid | Pids], Node, Res) when node(Pid) == Node ->
+ do_node_down_locks2(Pids, Node, [Pid | Res]);
+do_node_down_locks2([_ | Pids], Node, Res) ->
+ do_node_down_locks2(Pids, Node, Res).
+
+
+get_names() ->
+ ets:tab2list(global_names).
+
+get_names_ext() ->
+ ets:tab2list(global_names_ext).
+
+random_sleep(Times) ->
+ case (Times rem 10) of
+ 0 -> erase(random_seed);
+ _ -> ok
+ end,
+ case get(random_seed) of
+ undefined ->
+ {A1, A2, A3} = now(),
+ random:seed(A1, A2, A3 + erlang:phash(node(), 100000));
+ _ -> ok
+ end,
+ %% First time 1/4 seconds, then doubling each time up to 8 seconds max.
+ Tmax = if Times > 5 -> 8000;
+ true -> ((1 bsl Times) * 1000) div 8
+ end,
+ T = random:uniform(Tmax),
+ ?P({random_sleep, node(), self(), Times, T}),
+ receive after T -> ok end.
+
+dec(infinity) -> infinity;
+dec(N) -> N-1.
+
+send_again(Msg) ->
+ spawn_link(?MODULE, timer, [self(), Msg]).
+
+timer(Pid, Msg) ->
+ random_sleep(5),
+ Pid ! Msg.
+
+change_our_node_name(NewNode, S) ->
+ S#state{node_name = NewNode}.
+
+
+%%-----------------------------------------------------------------
+%% Each sync process corresponds to one call to sync. Each such
+%% process asks the global_name_server on all Nodes if it is in sync
+%% with Nodes. If not, that (other) node spawns a syncer process that
+%% waits for global to get in sync with all Nodes. When it is in
+%% sync, the syncer process tells the original sync process about it.
+%%-----------------------------------------------------------------
+start_sync(Nodes, From) ->
+ spawn_link(?MODULE, sync_init, [Nodes, From]).
+
+sync_init(Nodes, From) ->
+ lists:foreach(fun(Node) -> monitor_node(Node, true) end, Nodes),
+ sync_loop(Nodes, From).
+
+sync_loop([], From) ->
+ gen_server:reply(From, ok);
+sync_loop(Nodes, From) ->
+ receive
+ {nodedown, Node} ->
+ monitor_node(Node, false),
+ sync_loop(lists:delete(Node, Nodes), From);
+ {synced, SNodes} ->
+ lists:foreach(fun(N) -> monitor_node(N, false) end, SNodes),
+ sync_loop(Nodes -- SNodes, From)
+ end.
+
+
+%%%====================================================================================
+%%% Get the current global_groups definition
+%%%====================================================================================
+check_sync_nodes() ->
+ case get_own_nodes() of
+ {ok, all} ->
+ nodes();
+ {ok, NodesNG} ->
+ %% global_groups parameter is defined, we are not allowed to sync
+ %% with nodes not in our own global group.
+ (nodes() -- (nodes() -- NodesNG));
+ {error, Error} ->
+ {error, Error}
+ end.
+
+check_sync_nodes(SyncNodes) ->
+ case get_own_nodes() of
+ {ok, all} ->
+ SyncNodes;
+ {ok, NodesNG} ->
+ %% global_groups parameter is defined, we are not allowed to sync
+ %% with nodes not in our own global group.
+ OwnNodeGroup = (nodes() -- (nodes() -- NodesNG)),
+ IllegalSyncNodes = (SyncNodes -- [node() | OwnNodeGroup]),
+ case IllegalSyncNodes of
+ [] -> SyncNodes;
+ _ -> {error, {"Trying to sync nodes not defined in the own global group",
+ IllegalSyncNodes}}
+ end;
+ {error, Error} ->
+ {error, Error}
+ end.
+
+get_own_nodes() ->
+ case global_group:get_own_nodes_with_errors() of
+ {error, Error} ->
+ {error, {"global_groups definition error", Error}};
+ OkTup ->
+ OkTup
+ end.
+
+
+%%-----------------------------------------------------------------
+%% The deleter process is a satellite process to global_name_server
+%% that does background batch deleting of names when a process
+%% that had globally registered names dies. It is started by and
+%% linked to global_name_server.
+%%-----------------------------------------------------------------
+
+start_the_deleter(Global) ->
+ spawn_link(
+ fun () ->
+ loop_the_deleter(Global)
+ end).
+
+loop_the_deleter(Global) ->
+ Deletions = collect_deletions(Global, []),
+ trans({global, self()},
+ fun() ->
+ lists:map(
+ fun ({Name,Pid}) ->
+ ?P2({delete_name2, Name, Pid, nodes()}),
+ gen_server:abcast(nodes(), global_name_server,
+ {async_del_name, Name, Pid})
+ end, Deletions)
+ end,
+ nodes()),
+ loop_the_deleter(Global).
+
+collect_deletions(Global, Deletions) ->
+ receive
+ {delete_name,Global,Name,Pid} ->
+ ?P2({delete_name, node(), self(), Name, Pid, nodes()}),
+ collect_deletions(Global, [{Name,Pid}|Deletions]);
+ Other ->
+ error_logger:error_msg("The global_name_server deleter process "
+ "received an unexpected message:\n~p\n",
+ [Other]),
+ collect_deletions(Global, Deletions)
+ after case Deletions of
+ [] -> infinity;
+ _ -> 0
+ end ->
+ lists:reverse(Deletions)
+ end.
diff --git a/lib/dialyzer/test/plt_SUITE.erl b/lib/dialyzer/test/plt_SUITE.erl
new file mode 100644
index 0000000000..aee9f449a6
--- /dev/null
+++ b/lib/dialyzer/test/plt_SUITE.erl
@@ -0,0 +1,21 @@
+%% This suite is the only hand made and simply
+%% checks if we can build a plt.
+
+-module(plt_SUITE).
+
+-include_lib("common_test/include/ct.hrl").
+-include("dialyzer_test_constants.hrl").
+
+-export([suite/0, all/0, build_plt/1]).
+
+suite() ->
+ [{timetrap, ?plt_timeout}].
+
+all() -> [build_plt].
+
+build_plt(Config) ->
+ OutDir = ?config(priv_dir, Config),
+ case dialyzer_common:check_plt(OutDir) of
+ ok -> ok;
+ fail -> ct:fail(plt_build_fail)
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/dialyzer_options b/lib/dialyzer/test/r9c_SUITE_data/dialyzer_options
new file mode 100644
index 0000000000..e00e23bb66
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/dialyzer_options
@@ -0,0 +1,2 @@
+{dialyzer_options, [{defines, [{vsn, 42}]}]}.
+{time_limit, 20}.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/results/asn1 b/lib/dialyzer/test/r9c_SUITE_data/results/asn1
new file mode 100644
index 0000000000..ac83366bc8
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/results/asn1
@@ -0,0 +1,106 @@
+
+asn1ct.erl:1500: The variable Err can never match since previous clauses completely covered the type #type{}
+asn1ct.erl:1596: The variable _ can never match since previous clauses completely covered the type 'ber_bin_v2'
+asn1ct.erl:1673: The pattern 'all' can never match the type 'asn1_module' | 'exclusive_decode' | 'partial_decode'
+asn1ct.erl:672: The pattern <{'false', Result}, _, _> can never match the type <{'true','true'},atom() | binary() | [atom() | binary() | [atom() | binary() | [any()] | char()] | char()],[any()]>
+asn1ct.erl:909: Guard test is_atom(Ext::[49 | 97 | 98 | 100 | 110 | 115]) can never succeed
+asn1ct_check.erl:1698: The pattern {'error', _} can never match the type [any()]
+asn1ct_check.erl:2733: The pattern {'type', Tag, _, _, _, _} can never match the type 'ASN1_OPEN_TYPE' | {_,_} | {'fixedtypevaluefield',_,_}
+asn1ct_check.erl:2738: The pattern <_S, _> can never match since previous clauses completely covered the type <#state{},#ObjectClassFieldType{class::#objectclass{fields::maybe_improper_list() | {_,_,_,_}},fieldname::{_,maybe_improper_list()},type::'ASN1_OPEN_TYPE' | {_,_} | {'fixedtypevaluefield',_,_}}>
+asn1ct_check.erl:2887: The variable Other can never match since previous clauses completely covered the type any()
+asn1ct_check.erl:3188: The pattern <_S, [], B> can never match the type <#state{},{'SingleValue',_},{'ValueRange',_}>
+asn1ct_check.erl:3190: The pattern <_S, A, []> can never match the type <#state{},{'SingleValue',_},{'ValueRange',_}>
+asn1ct_check.erl:3212: The pattern {[], C3} can never match the type {[any(),...],{'ValueRange',{'MIN','MAX'}}}
+asn1ct_check.erl:3225: The pattern {L1, UbNew} can never match the type 'false'
+asn1ct_check.erl:3228: The pattern {L1, LbNew} can never match the type 'false'
+asn1ct_check.erl:3235: The call asn1ct_check:remove_val_from_list(number(),L::[any(),...]) will never return since it differs in the 1st argument from the success typing arguments: ([any()],any())
+asn1ct_check.erl:3240: The call asn1ct_check:remove_val_from_list(number(),L::[any(),...]) will never return since it differs in the 1st argument from the success typing arguments: ([any()],any())
+asn1ct_check.erl:3242: Function remove_val_from_list/2 has no local return
+asn1ct_check.erl:3243: The call lists:member(Val::[any(),...],List::number()) will never return since it differs in the 2nd argument from the success typing arguments: (any(),[any()])
+asn1ct_check.erl:3283: The pattern [] can never match the type [any(),...]
+asn1ct_check.erl:3362: The pattern <_, [], _VR> can never match the type <#state{},[any(),...],[any(),...]>
+asn1ct_check.erl:3364: The pattern <_, _SV, []> can never match the type <#state{},[any(),...],[any(),...]>
+asn1ct_check.erl:4150: The pattern <_, [_]> can never match the type <_,[]>
+asn1ct_check.erl:4314: The pattern <S, Type, {Rlist, ExtList}> can never match the type <#state{},_,[any()]>
+asn1ct_check.erl:4360: The pattern <S, Type, {Rlist, ExtList}> can never match the type <#state{},_,[any()]>
+asn1ct_check.erl:4719: The call asn1ct_check:error({'type',{'asn1',[1..255,...],[any(),...]}}) will never return since it differs in the 1st argument from the success typing arguments: ({'ObjectSet' | 'class' | 'export' | 'ptype' | 'type' | 'value',_,#state{}})
+asn1ct_check.erl:5120: Guard test is_record(Type::{_,_} | {'fixedtypevaluefield',_,_},'type',6) can never succeed
+asn1ct_check.erl:5128: Guard test is_record(Type::{_,_} | {'fixedtypevaluefield',_,_},'type',6) can never succeed
+asn1ct_check.erl:540: The pattern <_S, {'poc', _ObjSet, _Params}> can never match since previous clauses completely covered the type <#state{},_>
+asn1ct_check.erl:5517: The pattern <_, []> can never match the type <_,[{'ABSTRACT-SYNTAX',{_,_,_}} | {'TYPE-IDENTIFIER',{_,_,_}},...]>
+asn1ct_constructed_ber.erl:1075: The pattern {{{'ObjectClassFieldType', _, _, _, {'objectfield', PrimFieldName1, PFNList}}, _}, {'componentrelation', _, _}} can never match the type {#type{},_}
+asn1ct_constructed_ber.erl:695: The pattern {'EXTENSIONMARK', _, _} can never match the type #ComponentType{}
+asn1ct_constructed_ber.erl:748: The pattern <Erules, TopType, {CompList, _ExtList}> can never match the type <_,maybe_improper_list(),[#ComponentType{typespec::{_,_,_,_,_,_}}]>
+asn1ct_constructed_ber_bin_v2.erl:914: The pattern {{{'ObjectClassFieldType', _, _, _, {'objectfield', PrimFieldName1, PFNList}}, _}, {'componentrelation', _, _}} can never match the type {#type{},_}
+asn1ct_gen.erl:740: The pattern [] can never match the type [any(),...]
+asn1ct_gen_ber.erl:974: The pattern <Erules, [{Name, Def} | Rest]> can never match the type <_,[#typedef{name::atom(),typespec::{_,_,_,_,_,_}}]>
+asn1ct_gen_ber_bin_v2.erl:975: The pattern <Erules, [{Name, Def} | Rest]> can never match the type <_,[#typedef{name::atom(),typespec::{_,_,_,_,_,_}}]>
+asn1ct_gen_per.erl:646: The pattern <Erules, [{Name, Def} | Rest]> can never match the type <_,[#typedef{name::atom()}]>
+asn1ct_gen_per_rt2ct.erl:1189: The pattern <Erules, [{Name, Def} | Rest]> can never match the type <_,[#typedef{name::atom()}]>
+asn1ct_gen_per_rt2ct.erl:563: The pattern <C, ['EXT_MARK' | T], _Count> can never match the type <[{'ValueRange',{_,_}},...],[char() | {'asn1_enum',integer()},...],non_neg_integer()>
+asn1ct_gen_per_rt2ct.erl:580: The pattern <_C, 'EXT_MARK', _Count> can never match the type <[{'ValueRange',{_,_}},...],char(),non_neg_integer()>
+asn1ct_gen_per_rt2ct.erl:583: The pattern <_C, {1, EnumName}, Count> can never match the type <[{'ValueRange',{_,_}},...],char(),non_neg_integer()>
+asn1ct_gen_per_rt2ct.erl:587: The pattern <C, {0, EnumName}, Count> can never match the type <[{'ValueRange',{_,_}},...],char(),non_neg_integer()>
+asn1ct_gen_per_rt2ct.erl:656: The pattern <Type, C> can never match since previous clauses completely covered the type <'bitstring' | 'integer',_>
+asn1ct_parser2.erl:2017: Call to missing or unexported function ordsets:list_to_set/1
+asn1ct_parser2.erl:2497: The variable _ can never match since previous clauses completely covered the type 'ok'
+asn1ct_parser2.erl:2628: The pattern {Rlist, ExtList} can never match the type [{_,_,_},...]
+asn1ct_parser2.erl:2660: Call to missing or unexported function ordsets:list_to_set/1
+asn1ct_parser2.erl:2685: Call to missing or unexported function ordsets:list_to_set/1
+asn1ct_parser2.erl:281: The variable Other can never match since previous clauses completely covered the type [any()]
+asn1ct_parser2.erl:529: The variable _ can never match since previous clauses completely covered the type #constraint{}
+asn1ct_parser2.erl:555: The variable _ can never match since previous clauses completely covered the type #constraint{}
+asn1ct_parser2.erl:796: The variable _ can never match since previous clauses completely covered the type {_,_}
+asn1ct_parser2.erl:814: The variable _ can never match since previous clauses completely covered the type {_,_}
+asn1ct_parser2.erl:831: The variable _ can never match since previous clauses completely covered the type {_,_}
+asn1ct_value.erl:247: The pattern <'undefined', Default> can never match the type <maybe_improper_list(),[1..255,...]>
+asn1rt_ber_bin.erl:1125: Cons will produce an improper list since its 2nd argument is binary() | tuple()
+asn1rt_ber_bin.erl:1276: The pattern <{{_Min1, Max1}, {Min2, Max2}}, BitListVal, _DoTag> can never match since previous clauses completely covered the type <{_,_},maybe_improper_list(),_>
+asn1rt_ber_bin.erl:2057: The call asn1rt_ber_bin:check_if_valid_tag2('false',[],[],OptOrMand::any()) will never return since it differs in the 2nd argument from the success typing arguments: ('false' | {'APPLICATION',_} | {'CONTEXT',_} | {'PRIVATE',_} | {'UNIVERSAL',_},nonempty_maybe_improper_list(),[] | {_,_,_},any())
+asn1rt_ber_bin.erl:969: The pattern {Val01, Buffer01, Rb01} can never match the type {'MINUS-INFINITY' | 'PLUS-INFINITY' | 0,binary()}
+asn1rt_ber_bin.erl:998: The pattern {FirstLen, {Exp, Buffer3}, RemBytes2} can never match the type {1..1114111,{integer(),binary(),number()},number()}
+asn1rt_ber_bin_v2.erl:1230: The pattern <{{_Min1, Max1}, {Min2, Max2}}, BitListVal, TagIn> can never match since previous clauses completely covered the type <{_,_},maybe_improper_list(),_>
+asn1rt_ber_bin_v2.erl:328: The variable _ can never match since previous clauses completely covered the type {{0 | 1,non_neg_integer(),'indefinite' | non_neg_integer(),binary()},binary() | []}
+asn1rt_ber_bin_v2.erl:337: The variable _ can never match since previous clauses completely covered the type {{0 | 1,non_neg_integer(),'indefinite' | non_neg_integer(),binary()},binary() | []}
+asn1rt_ber_bin_v2.erl:392: The variable _ can never match since previous clauses completely covered the type {{0 | 1,non_neg_integer(),'indefinite' | non_neg_integer(),binary()},binary() | []}
+asn1rt_ber_bin_v2.erl:963: Function decode_real/3 has no local return
+asn1rt_check.erl:100: The variable _ can never match since previous clauses completely covered the type [any()]
+asn1rt_check.erl:85: The variable _ can never match since previous clauses completely covered the type [any()]
+asn1rt_driver_handler.erl:32: The pattern 'already_done' can never match the type {'error',_}
+asn1rt_per.erl:1065: The pattern {'BMPString', {'octets', Ol}} can never match the type {_,[{'bits',1 | 2 | 4 | 8 | 16 | 32,_}]}
+asn1rt_per.erl:1066: Function will never be called
+asn1rt_per.erl:1231: The call erlang:'not'('implemented') will never return since it differs in the 1st argument from the success typing arguments: (boolean())
+asn1rt_per.erl:1233: The call erlang:'not'('implemented') will never return since it differs in the 1st argument from the success typing arguments: (boolean())
+asn1rt_per.erl:1235: The call erlang:'not'('implemented') will never return since it differs in the 1st argument from the success typing arguments: (boolean())
+asn1rt_per.erl:1237: The call erlang:'not'('implemented') will never return since it differs in the 1st argument from the success typing arguments: (boolean())
+asn1rt_per.erl:989: The pattern <_C, 'true', _Val> can never match the type <_,'false',_>
+asn1rt_per_bin.erl:1361: The pattern <_, 'true', _> can never match the type <_,'false',_>
+asn1rt_per_bin.erl:1436: The pattern {'BMPString', {'octets', Ol}} can never match the type {'BMPString' | 'IA5String' | 'NumericString' | 'PrintableString' | 'UniversalString' | 'VisibleString',[{'bits',1 | 2 | 4 | 8 | 16 | 32,_}]}
+asn1rt_per_bin.erl:1437: Function will never be called
+asn1rt_per_bin.erl:161: The call asn1rt_per_bin:getbit({0,maybe_improper_list()}) will never return since it differs in the 1st argument from the success typing arguments: (<<_:8,_:_*8>> | {non_neg_integer(),<<_:1,_:_*1>>})
+asn1rt_per_bin.erl:1812: The pattern {Name, Val} can never match since previous clauses completely covered the type any()
+asn1rt_per_bin.erl:2106: Cons will produce an improper list since its 2nd argument is binary()
+asn1rt_per_bin.erl:2111: Cons will produce an improper list since its 2nd argument is binary()
+asn1rt_per_bin.erl:2111: Cons will produce an improper list since its 2nd argument is integer()
+asn1rt_per_bin.erl:2117: Cons will produce an improper list since its 2nd argument is integer()
+asn1rt_per_bin.erl:2121: Cons will produce an improper list since its 2nd argument is 0
+asn1rt_per_bin.erl:2123: Cons will produce an improper list since its 2nd argument is 0
+asn1rt_per_bin.erl:2127: Cons will produce an improper list since its 2nd argument is 0
+asn1rt_per_bin.erl:2129: Cons will produce an improper list since its 2nd argument is integer()
+asn1rt_per_bin.erl:446: The variable _ can never match since previous clauses completely covered the type integer()
+asn1rt_per_bin.erl:467: The variable _ can never match since previous clauses completely covered the type integer()
+asn1rt_per_bin.erl:474: The pattern <{_N, <<_:8/integer-unit:1,Bs/binary-unit:8>>}, C> can never match since previous clauses completely covered the type <{0,_},integer()>
+asn1rt_per_bin.erl:487: The variable _ can never match since previous clauses completely covered the type integer()
+asn1rt_per_bin.erl:498: The variable _ can never match since previous clauses completely covered the type integer()
+asn1rt_per_bin_rt2ct.erl:152: The call asn1rt_per_bin_rt2ct:getbit({0,maybe_improper_list()}) will never return since it differs in the 1st argument from the success typing arguments: (<<_:8,_:_*8>> | {non_neg_integer(),<<_:1,_:_*1>>})
+asn1rt_per_bin_rt2ct.erl:1533: The pattern {'BMPString', {'octets', Ol}} can never match the type {_,[[any(),...]]}
+asn1rt_per_bin_rt2ct.erl:1534: Function will never be called
+asn1rt_per_bin_rt2ct.erl:1875: The pattern {Name, Val} can never match since previous clauses completely covered the type any()
+asn1rt_per_bin_rt2ct.erl:443: The variable _ can never match since previous clauses completely covered the type integer()
+asn1rt_per_bin_rt2ct.erl:464: The variable _ can never match since previous clauses completely covered the type integer()
+asn1rt_per_bin_rt2ct.erl:471: The pattern <{_N, <<_B:8/integer-unit:1,Bs/binary-unit:8>>}, C> can never match since previous clauses completely covered the type <{0,_},integer()>
+asn1rt_per_bin_rt2ct.erl:484: The variable _ can never match since previous clauses completely covered the type integer()
+asn1rt_per_bin_rt2ct.erl:495: The variable _ can never match since previous clauses completely covered the type integer()
+asn1rt_per_v1.erl:1209: The pattern <_, 'true', _> can never match the type <_,'false',_>
+asn1rt_per_v1.erl:1290: The pattern {'BMPString', {'octets', Ol}} can never match the type {'BMPString' | 'IA5String' | 'NumericString' | 'PrintableString' | 'UniversalString' | 'VisibleString',[{'bits',1 | 2 | 4 | 8 | 16 | 32,_}]}
+asn1rt_per_v1.erl:1291: Function will never be called
diff --git a/lib/dialyzer/test/r9c_SUITE_data/results/inets b/lib/dialyzer/test/r9c_SUITE_data/results/inets
new file mode 100644
index 0000000000..fd5e36a3cd
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/results/inets
@@ -0,0 +1,59 @@
+
+ftp.erl:1243: The pattern {'ok', {N, Bytes}} can never match the type 'eof' | {'error',atom()} | {'ok',binary() | string()}
+ftp.erl:640: The pattern {'closed', _Why} can never match the type 'perm_fname_not_allowed' | 'perm_neg_compl' | 'perm_no_space' | 'pos_compl' | 'pos_interm' | 'pos_interm_acct' | 'trans_neg_compl' | 'trans_no_space' | {'error' | 'perm_fname_not_allowed' | 'perm_neg_compl' | 'perm_no_space' | 'pos_compl' | 'pos_interm' | 'pos_interm_acct' | 'pos_prel' | 'trans_neg_compl' | 'trans_no_space',atom() | [any()] | {'invalid_server_response',[any(),...]}}
+http.erl:117: The pattern {'error', Reason} can never match the type #req_headers{connection::[45 | 97 | 101 | 105 | 107 | 108 | 112 | 118,...],content_length::[48,...],other::[{_,_}]}
+http.erl:138: Function close_session/2 will never be called
+http_lib.erl:286: The call http_lib:close('ip_comm' | {'ssl',_},any()) will never return since it differs in the 1st argument from the success typing arguments: ('http' | 'https',any())
+http_lib.erl:424: The variable _ can never match since previous clauses completely covered the type any()
+http_lib.erl:438: The variable _ can never match since previous clauses completely covered the type any()
+http_lib.erl:99: Function getHeaderValue/2 will never be called
+httpc_handler.erl:322: Function status_continue/2 has no local return
+httpc_handler.erl:37: Function init_connection/2 has no local return
+httpc_handler.erl:65: Function next_response_with_request/2 has no local return
+httpc_handler.erl:660: Function exit_session_ok/2 has no local return
+httpc_manager.erl:145: The pattern {ErrorReply, State2} can never match the type {{'ok',number()},number(),#state{reqid::number()}}
+httpc_manager.erl:160: The pattern {ErrorReply, State2} can never match the type {{'ok',number()},number(),#state{reqid::number()}}
+httpc_manager.erl:478: The pattern {'error', Reason} can never match the type 'ok' | {number(),#session{clientclose::boolean(),pipeline::[],quelength::1}}
+httpc_manager.erl:490: The pattern {'error', Reason} can never match the type 'ok' | {number(),#session{clientclose::boolean(),pipeline::[],quelength::1}}
+httpd.erl:583: The pattern <{'error', Reason}, _Fd, SoFar> can never match the type <[any()],pid(),[[any(),...]]>
+httpd_acceptor.erl:105: The pattern {'error', Reason} can never match the type {'ok',pid()}
+httpd_acceptor.erl:110: Function handle_connection_err/4 will never be called
+httpd_acceptor.erl:168: Function report_error/2 will never be called
+httpd_acceptor.erl:91: The call httpd_acceptor:handle_error({'EXIT',_},ConfigDb::any(),SocketType::any()) will never return since it differs in the 1st argument from the success typing arguments: ('econnaborted' | 'emfile' | 'esslaccept' | 'timeout' | {'enfile',_},any(),any())
+httpd_manager.erl:885: The pattern {'EXIT', Reason} can never match since previous clauses completely covered the type any()
+httpd_manager.erl:919: Function auth_status/1 will never be called
+httpd_manager.erl:926: Function sec_status/1 will never be called
+httpd_manager.erl:933: Function acceptor_status/1 will never be called
+httpd_request_handler.erl:374: The call httpd_response:send_status(Info::#mod{parsed_header::maybe_improper_list()},417,[32 | 66 | 98 | 100 | 103 | 105 | 111 | 116 | 121,...]) will never return since it differs in the 2nd argument from the success typing arguments: (#mod{socket_type::'ip_comm' | {'ssl',_}},100 | 301 | 304 | 400 | 401 | 403 | 404 | 412 | 414 | 416 | 500 | 501 | 503,any())
+httpd_request_handler.erl:378: The call httpd_response:send_status(Info::#mod{parsed_header::maybe_improper_list()},417,[32 | 77 | 97 | 100 | 101 | 104 | 108 | 110 | 111 | 116 | 119,...]) will never return since it differs in the 2nd argument from the success typing arguments: (#mod{socket_type::'ip_comm' | {'ssl',_}},100 | 301 | 304 | 400 | 401 | 403 | 404 | 412 | 414 | 416 | 500 | 501 | 503,any())
+httpd_request_handler.erl:401: The call httpd_response:send_status(Info::#mod{parsed_header::maybe_improper_list()},417,[32 | 77 | 97 | 100 | 101 | 104 | 108 | 110 | 111 | 116 | 119,...]) will never return since it differs in the 2nd argument from the success typing arguments: (#mod{socket_type::'ip_comm' | {'ssl',_}},100 | 301 | 304 | 400 | 401 | 403 | 404 | 412 | 414 | 416 | 500 | 501 | 503,any())
+httpd_request_handler.erl:644: The call lists:reverse(Fields0::{'error',_} | {'ok',[[any()]]}) will never return since it differs in the 1st argument from the success typing arguments: ([any()])
+httpd_request_handler.erl:645: Function will never be called
+httpd_sup.erl:63: The variable Else can never match since previous clauses completely covered the type {'error',_} | {'ok',[any()],_,_}
+httpd_sup.erl:88: The pattern {'error', Reason} can never match the type {'ok',_,_}
+httpd_sup.erl:92: The variable Else can never match since previous clauses completely covered the type {'ok',_,_}
+mod_auth.erl:559: The pattern {'error', Reason} can never match the type {_,integer(),maybe_improper_list(),_}
+mod_auth_dets.erl:120: The call lists:foreach(fun((_) -> 'true' | {'error','no_such_group' | 'no_such_group_member'}),{'ok',[any()]}) will never return since it differs in the 2nd argument from the success typing arguments: (fun((_) -> any()),[any()])
+mod_auth_plain.erl:100: The variable _ can never match since previous clauses completely covered the type {'ok',[any()]}
+mod_auth_plain.erl:159: The variable _ can never match since previous clauses completely covered the type [any()]
+mod_auth_plain.erl:83: The variable O can never match since previous clauses completely covered the type [any()]
+mod_cgi.erl:372: The pattern {'http_response', NewAccResponse} can never match the type 'ok'
+mod_dir.erl:101: The call lists:flatten(nonempty_improper_list(atom() | binary() | [any()] | char(),atom())) will never return since it differs in the 1st argument from the success typing arguments: ([any()])
+mod_dir.erl:72: The pattern {'error', Reason} can never match the type {'ok',[[[any()] | char()],...]}
+mod_get.erl:135: The pattern <{'enfile', _}, _Info, Path> can never match the type <atom(),#mod{},atom() | binary() | [atom() | binary() | [any()] | char()]>
+mod_head.erl:80: The pattern <{'enfile', _}, _Info, Path> can never match the type <atom(),#mod{},atom() | binary() | [atom() | binary() | [atom() | binary() | [any()] | char()] | char()]>
+mod_htaccess.erl:460: The pattern {'error', BadData} can never match the type {'ok',_}
+mod_include.erl:193: The pattern {_, Name, {[], []}} can never match the type {[any()],[any()],maybe_improper_list()}
+mod_include.erl:195: The pattern {_, Name, {PathInfo, []}} can never match the type {[any()],[any()],maybe_improper_list()}
+mod_include.erl:197: The pattern {_, Name, {PathInfo, QueryString}} can never match the type {[any()],[any()],maybe_improper_list()}
+mod_include.erl:201: The variable Gurka can never match since previous clauses completely covered the type {[any()],[any()],maybe_improper_list()}
+mod_include.erl:692: The pattern <{'read', Reason}, Info, Path> can never match the type <{'open',atom()},#mod{},atom() | binary() | [atom() | binary() | [atom() | binary() | [any()] | char()] | char()]>
+mod_include.erl:706: The pattern <{'enfile', _}, _Info, Path> can never match the type <atom(),#mod{},atom() | binary() | [atom() | binary() | [atom() | binary() | [any()] | char()] | char()]>
+mod_include.erl:716: Function read_error/3 will never be called
+mod_include.erl:719: Function read_error/4 will never be called
+mod_security_server.erl:386: The variable O can never match since previous clauses completely covered the type [any()]
+mod_security_server.erl:433: The variable Other can never match since previous clauses completely covered the type [any()]
+mod_security_server.erl:585: The variable _ can never match since previous clauses completely covered the type [any()]
+mod_security_server.erl:608: The variable _ can never match since previous clauses completely covered the type [any()]
+mod_security_server.erl:641: The variable _ can never match since previous clauses completely covered the type [any()]
+uri.erl:146: The pattern {'error', Error} can never match since previous clauses completely covered the type {_,{[],[]}}
diff --git a/lib/dialyzer/test/r9c_SUITE_data/results/mnesia b/lib/dialyzer/test/r9c_SUITE_data/results/mnesia
new file mode 100644
index 0000000000..e199581a0e
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/results/mnesia
@@ -0,0 +1,34 @@
+
+mnesia.erl:1319: Guard test size(Spec::[{_,_,_},...]) can never succeed
+mnesia.erl:1498: The call mnesia:bad_info_reply(Tab::atom(),Item::'type') will never return since it differs in the 2nd argument from the success typing arguments: (atom(),'memory' | 'size')
+mnesia.erl:331: Function mod2abs/1 has no local return
+mnesia_bup.erl:111: The created fun has no local return
+mnesia_bup.erl:574: Function fallback_receiver/2 has no local return
+mnesia_bup.erl:967: Function uninstall_fallback_master/2 has no local return
+mnesia_checkpoint.erl:1014: The variable Error can never match since previous clauses completely covered the type {'ok',#checkpoint_args{nodes::[any()],retainers::[any(),...]}}
+mnesia_controller.erl:1666: The variable Tab can never match since previous clauses completely covered the type [any()]
+mnesia_controller.erl:1679: The pattern {'stop', Reason, Reply, State2} can never match the type {'noreply',_} | {'reply',_,_} | {'stop','shutdown',#state{}}
+mnesia_controller.erl:1685: The pattern {'noreply', State2, _Timeout} can never match the type {'reply',_,_}
+mnesia_event.erl:77: The pattern 'remove_handler' can never match the type {'ok',_}
+mnesia_event.erl:79: The pattern {'swap_handler', Args1, State1, Mod2, Args2} can never match the type {'ok',_}
+mnesia_frag.erl:294: The call mnesia_frag:remote_collect(Ref::reference(),{'error',_},[],OldSelectFun::fun(() -> [any()])) will never return since it differs in the 2nd argument from the success typing arguments: (reference(),'ok',[any()],fun(() -> [any()]))
+mnesia_frag.erl:304: The call mnesia_frag:remote_collect(Ref::reference(),{'error',{'node_not_running',_}},[],OldSelectFun::fun(() -> [any()])) will never return since it differs in the 2nd argument from the success typing arguments: (reference(),'ok',[any()],fun(() -> [any()]))
+mnesia_frag.erl:312: The call mnesia_frag:remote_collect(Ref::reference(),LocalRes::{'error',_},[],OldSelectFun::fun(() -> [any()])) will never return since it differs in the 2nd argument from the success typing arguments: (reference(),'ok',[any()],fun(() -> [any()]))
+mnesia_index.erl:52: The call mnesia_lib:other_val(Var::{_,'commit_work' | 'index' | 'setorbag' | 'storage_type' | {'index',_}},_ReASoN_::any()) will never return since it differs in the 1st argument from the success typing arguments: ({_,'active_replicas' | 'where_to_read' | 'where_to_write'},any())
+mnesia_lib.erl:957: The pattern {'ok', {0, _}} can never match the type 'eof' | {'error',atom()} | {'ok',binary() | string()}
+mnesia_lib.erl:959: The pattern {'ok', {_, Bin}} can never match the type 'eof' | {'error',atom()} | {'ok',binary() | string()}
+mnesia_loader.erl:36: The call mnesia_lib:other_val(Var::{_,'access_mode' | 'cstruct' | 'db_nodes' | 'setorbag' | 'snmp' | 'storage_type'},Reason::any()) will never return since it differs in the 1st argument from the success typing arguments: ({_,'active_replicas' | 'where_to_read' | 'where_to_write'},any())
+mnesia_locker.erl:1017: Function system_terminate/4 has no local return
+mnesia_log.erl:707: The test {'error',{[1..255,...],[any(),...]}} | {'ok',_} == atom() can never evaluate to 'true'
+mnesia_log.erl:727: The created fun has no local return
+mnesia_monitor.erl:162: The pattern <[], []> can never match the type <[any(),...],[any(),...]>
+mnesia_monitor.erl:354: The pattern {'error', Reason} can never match the type 'ok'
+mnesia_recover.erl:159: The call mnesia_lib:other_val(Var::'latest_transient_decision' | 'max_wait_for_decision' | 'previous_transient_decisions' | 'recover_nodes',Reason::any()) will never return since it differs in the 1st argument from the success typing arguments: ({_,'active_replicas' | 'where_to_read' | 'where_to_write'},any())
+mnesia_recover.erl:884: The pattern {'stop', Reason, Reply, State2} can never match the type {'noreply',_} | {'stop','shutdown',#state{}}
+mnesia_schema.erl:1088: Guard test Storage::'disc_copies' | 'disc_only_copies' | 'ram_copies' == 'unknown' can never succeed
+mnesia_schema.erl:1258: Guard test FromS::'disc_copies' | 'disc_only_copies' | 'ram_copies' == 'unknown' can never succeed
+mnesia_schema.erl:1639: The pattern {'false', 'mandatory'} can never match the type {'false','optional'}
+mnesia_schema.erl:2434: The variable Reason can never match since previous clauses completely covered the type {'error',_} | {'ok',_}
+mnesia_schema.erl:451: Guard test UseDirAnyway::'false' == 'true' can never succeed
+mnesia_tm.erl:1522: Function commit_participant/5 has no local return
+mnesia_tm.erl:2169: Function system_terminate/4 has no local return
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/Makefile b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/Makefile
new file mode 100644
index 0000000000..9dba643327
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/Makefile
@@ -0,0 +1,142 @@
+#
+# Copyright (C) 1997, Ericsson Telecommunications
+# Author: Kenneth Lundin
+#
+include $(ERL_TOP)/make/target.mk
+include $(ERL_TOP)/make/$(TARGET)/otp.mk
+
+# ----------------------------------------------------
+# Application version
+# ----------------------------------------------------
+include ../vsn.mk
+VSN=$(ASN1_VSN)
+
+# ----------------------------------------------------
+# Release directory specification
+# ----------------------------------------------------
+RELSYSDIR = $(RELEASE_PATH)/lib/asn1-$(VSN)
+
+
+
+
+#
+# Common Macros
+#
+# PARSER_SRC = \
+# asn1ct_parser.yrl
+
+# PARSER_MODULE=$(PARSER_SRC:%.yrl=%)
+
+EBIN = ../ebin
+CT_MODULES= \
+ asn1ct \
+ asn1ct_check \
+ asn1_db \
+ asn1ct_pretty_format \
+ asn1ct_gen \
+ asn1ct_gen_per \
+ asn1ct_gen_per_rt2ct \
+ asn1ct_name \
+ asn1ct_constructed_per \
+ asn1ct_constructed_ber \
+ asn1ct_gen_ber \
+ asn1ct_constructed_ber_bin_v2 \
+ asn1ct_gen_ber_bin_v2 \
+ asn1ct_value \
+ asn1ct_tok \
+ asn1ct_parser2
+
+RT_MODULES= \
+ asn1rt \
+ asn1rt_per \
+ asn1rt_per_bin \
+ asn1rt_per_v1 \
+ asn1rt_ber_bin \
+ asn1rt_ber_bin_v2 \
+ asn1rt_per_bin_rt2ct \
+ asn1rt_driver_handler \
+ asn1rt_check
+
+# asn1rt_ber_v1 \
+# asn1rt_ber \
+# the rt module to use is defined in asn1_records.hrl
+# and must be updated when an incompatible change is done in the rt modules
+
+
+MODULES= $(CT_MODULES) $(RT_MODULES)
+
+ERL_FILES = $(MODULES:%=%.erl)
+
+TARGET_FILES = $(MODULES:%=$(EBIN)/%.$(EMULATOR))
+
+GENERATED_PARSER = $(PARSER_MODULE:%=%.erl)
+
+# internal hrl file
+HRL_FILES = asn1_records.hrl
+
+APP_FILE = asn1.app
+APPUP_FILE = asn1.appup
+
+APP_SRC = $(APP_FILE).src
+APP_TARGET = $(EBIN)/$(APP_FILE)
+
+APPUP_SRC = $(APPUP_FILE).src
+APPUP_TARGET = $(EBIN)/$(APPUP_FILE)
+
+EXAMPLES = \
+ ../examples/P-Record.asn
+
+# ----------------------------------------------------
+# FLAGS
+# ----------------------------------------------------
+ERL_FLAGS +=
+ERL_COMPILE_FLAGS += \
+ -I$(ERL_TOP)/lib/stdlib \
+ +warn_unused_vars
+YRL_FLAGS =
+# ----------------------------------------------------
+# Targets
+# ----------------------------------------------------
+
+debug opt: $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
+
+
+clean:
+ rm -f $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) $(GENERATED_PARSER)
+ rm -f core *~
+
+docs:
+
+
+# ----------------------------------------------------
+# Special Build Targets
+# ----------------------------------------------------
+
+$(EBIN)/asn1ct.$(EMULATOR):asn1ct.erl
+ $(ERLC) -b$(EMULATOR) -o$(EBIN) $(ERL_COMPILE_FLAGS) -Dvsn=\"$(VSN)\" $<
+
+$(APP_TARGET): $(APP_SRC) ../vsn.mk
+ sed -e 's;%VSN%;$(VSN);' $< > $@
+
+$(APPUP_TARGET): $(APPUP_SRC) ../vsn.mk
+ sed -e 's;%VSN%;$(VSN);' $< > $@
+
+
+# ----------------------------------------------------
+# Release Target
+# ----------------------------------------------------
+include $(ERL_TOP)/make/otp_release_targets.mk
+
+release_spec: opt
+ $(INSTALL_DIR) $(RELSYSDIR)/ebin
+ $(INSTALL_DATA) $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) $(RELSYSDIR)/ebin
+ $(INSTALL_DIR) $(RELSYSDIR)/src
+ $(INSTALL_DATA) $(PARSER_SRC) $(ERL_FILES) $(HRL_FILES) $(APP_SRC) $(APPUP_SRC) $(RELSYSDIR)/src
+ $(INSTALL_DIR) $(RELSYSDIR)/examples
+ $(INSTALL_DATA) $(EXAMPLES) $(RELSYSDIR)/examples
+
+# there are no include files to be used by the user
+#$(INSTALL_DIR) $(RELSYSDIR)/include
+#$(INSTALL_DATA) $(HRL_FILES) $(RELSYSDIR)/include
+
+release_docs_spec:
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/Restrictions.txt b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/Restrictions.txt
new file mode 100644
index 0000000000..d1d1855dc9
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/Restrictions.txt
@@ -0,0 +1,55 @@
+The following restrictions apply to this implementation of the ASN.1 compiler:
+
+Supported encoding rules are:
+BER
+PER (aligned)
+
+PER (unaligned) IS NOT SUPPORTED
+
+Supported types are:
+
+INTEGER
+BOOLEAN
+ENUMERATION
+SEQUENCE
+SEQUENCE OF
+SET
+SET OF
+CHOICE
+OBJECT IDENTIFIER
+RestrictedCharacterStringTypes
+UnrestrictedCharacterStringTypes
+
+
+NOT SUPPORTED types are:
+ANY IS (IS NOT IN THE STANDARD ANY MORE)
+ANY DEFINED BY (IS NOT IN THE STANDARD ANY MORE)
+EXTERNAL
+EMBEDDED-PDV
+REAL
+
+The support for value definitions in the ASN.1 notation is very limited.
+
+The support for constraints is limited to:
+SizeConstraint SIZE(X)
+SingleValue (1)
+ValueRange (X..Y)
+PermittedAlpabet FROM
+
+The only supported value-notation for SEQUENCE and SET in Erlang is
+the record variant.
+The list notation with named components used by the old ASN.1 compiler
+was supported in the first versions of this compiler both are no longer
+supported.
+
+The decode functions always return a symbolic value if they can.
+
+
+Files with ASN.1 source must have a suffix .asn1 the suffix .py used by the
+old ASN.1 compiler is supported in this version but will not be supported in the future.
+
+Generated files:
+X.asn1db % the intermediate format of a compiled ASN.1 module
+X.hrl % generated Erlang include file for module X
+X.erl % generated Erlang module with encode decode functions for
+ % ASN.1 module X
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1.app.src b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1.app.src
new file mode 100644
index 0000000000..2ec06ff4db
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1.app.src
@@ -0,0 +1,20 @@
+{application, asn1,
+ [{description, "The Erlang ASN1 compiler version %VSN%"},
+ {vsn, "%VSN%"},
+ {modules, [
+ asn1rt,
+ asn1rt_per,
+ asn1rt_per_v1,
+ asn1rt_per_bin,
+ asn1rt_per_bin_rt2ct,
+ asn1rt_ber_bin,
+ asn1rt_ber_bin_v2,
+ asn1rt_check,
+ asn1rt_driver_handler
+ ]},
+ {registered, [
+ asn1_driver_owner
+ ]},
+ {env, []},
+ {applications, [kernel, stdlib]}
+ ]}.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1.appup.src b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1.appup.src
new file mode 100644
index 0000000000..55ef53994a
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1.appup.src
@@ -0,0 +1,162 @@
+{"%VSN%",
+ [
+ {"1.3",
+ [
+ {load_module, asn1rt_per_v1, soft_purge, soft_purge, []},
+ {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []},
+ {load_module, asn1rt, soft_purge, soft_purge, []},
+ {add_module, asn1rt_per_bin},
+ {add_module, asn1rt_check}
+ {add_module, asn1rt_per_bin_rt2ct},
+ {add_module, asn1rt_ber_bin_v2},
+ {add_module, asn1rt_driver_handler}
+ {remove, {asn1rt_ber_v1, soft_purge, soft_purge}},
+ ]
+ },
+ {"1.3.1",
+ [
+ {load_module, asn1rt_per_v1, soft_purge, soft_purge, []},
+ {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []},
+ {load_module, asn1rt, soft_purge, soft_purge, []},
+ {add_module, asn1rt_per_bin},
+ {add_module, asn1rt_check}
+ {add_module, asn1rt_per_bin_rt2ct},
+ {add_module, asn1rt_ber_bin_v2},
+ {add_module, asn1rt_driver_handler}
+ {remove, {asn1rt_ber_v1, soft_purge, soft_purge}},
+ ]
+ },
+ {"1.3.1.1",
+ [
+ {load_module, asn1rt_per_v1, soft_purge, soft_purge, []},
+ {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []},
+ {load_module, asn1rt, soft_purge, soft_purge, []},
+ {add_module, asn1rt_per_bin},
+ {add_module, asn1rt_check}
+ {add_module, asn1rt_per_bin_rt2ct},
+ {add_module, asn1rt_ber_bin_v2},
+ {add_module, asn1rt_driver_handler}
+ {remove, {asn1rt_ber_v1, soft_purge, soft_purge}},
+ ]
+ },
+ {"1.3.2",
+ [
+ {load_module, asn1rt_per_v1, soft_purge, soft_purge, []},
+ {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []},
+ {load_module, asn1rt, soft_purge, soft_purge, []},
+ {load_module, asn1rt_per_bin, soft_purge, soft_purge, []},
+ {load_module, asn1rt_check, soft_purge, soft_purge, []},
+ {add_module, asn1rt_per_bin_rt2ct},
+ {add_module, asn1rt_ber_bin_v2},
+ {add_module, asn1rt_driver_handler}
+ {remove, {asn1rt_ber_v1, soft_purge, soft_purge}},
+ ]
+ },
+ {"1.3.3",
+ [
+ {load_module, asn1rt_per_v1, soft_purge, soft_purge, []},
+ {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []},
+ {load_module, asn1rt, soft_purge, soft_purge, []},
+ {load_module, asn1rt_per_bin, soft_purge, soft_purge, []},
+ {load_module, asn1rt_check, soft_purge, soft_purge, []},
+ {load_module, asn1rt_per_bin_rt2ct, soft_purge, soft_purge, []},
+ {add_module, asn1rt_ber_bin_v2},
+ {add_module, asn1rt_driver_handler}
+ {remove, {asn1rt_ber_v1, soft_purge, soft_purge}},
+ ]
+ },
+ {"1.3.3.1",
+ [
+ {load_module, asn1rt_per_v1, soft_purge, soft_purge, []},
+ {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []},
+ {load_module, asn1rt, soft_purge, soft_purge, []},
+ {load_module, asn1rt_per_bin, soft_purge, soft_purge, []},
+ {load_module, asn1rt_check, soft_purge, soft_purge, []},
+ {load_module, asn1rt_per_bin_rt2ct, soft_purge, soft_purge, []},
+ {add_module, asn1rt_ber_bin_v2},
+ {add_module, asn1rt_driver_handler}
+ {remove, {asn1rt_ber_v1, soft_purge, soft_purge}},
+ ]
+ }
+ ],
+ [
+ {"1.3",
+ [
+ {load_module, asn1rt_per_v1, soft_purge, soft_purge, []},
+ {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []},
+ {load_module, asn1rt, soft_purge, soft_purge, []},
+ {add_module, asn1rt_ber_v1},
+ {remove, {asn1rt_per_bin, soft_purge, soft_purge}},
+ {remove, {asn1rt_check, soft_purge, soft_purge}}
+ {remove, {asn1rt_per_bin_rt2ct, soft_purge, soft_purge}},
+ {remove, {asn1rt_ber_bin_v2, soft_purge, soft_purge}},
+ {remove, {asn1rt_driver_handler, soft_purge, soft_purge}}
+ ]
+ },
+ {"1.3.1",
+ [
+ {load_module, asn1rt_per_v1, soft_purge, soft_purge, []},
+ {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []},
+ {load_module, asn1rt, soft_purge, soft_purge, []},
+ {add_module, asn1rt_ber_v1},
+ {remove, {asn1rt_per_bin, soft_purge, soft_purge}},
+ {remove, {asn1rt_check, soft_purge, soft_purge}}
+ {remove, {asn1rt_per_bin_rt2ct, soft_purge, soft_purge}},
+ {remove, {asn1rt_ber_bin_v2, soft_purge, soft_purge}},
+ {remove, {asn1rt_driver_handler, soft_purge, soft_purge}}
+ ]
+ },
+ {"1.3.1.1",
+ [
+ {load_module, asn1rt_per_v1, soft_purge, soft_purge, []},
+ {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []},
+ {load_module, asn1rt, soft_purge, soft_purge, []},
+ {add_module, asn1rt_ber_v1},
+ {remove, {asn1rt_per_bin, soft_purge, soft_purge}},
+ {remove, {asn1rt_check, soft_purge, soft_purge}}
+ {remove, {asn1rt_per_bin_rt2ct, soft_purge, soft_purge}},
+ {remove, {asn1rt_ber_bin_v2, soft_purge, soft_purge}},
+ {remove, {asn1rt_driver_handler, soft_purge, soft_purge}}
+ ]
+ },
+ {"1.3.2",
+ [
+ {load_module, asn1rt_per_v1, soft_purge, soft_purge, []},
+ {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []},
+ {load_module, asn1rt, soft_purge, soft_purge, []},
+ {load_module, asn1rt_per_bin, soft_purge, soft_purge, []},
+ {load_module, asn1rt_check, soft_purge, soft_purge, []},
+ {add_module, asn1rt_ber_v1},
+ {remove, {asn1rt_per_bin_rt2ct, soft_purge, soft_purge}},
+ {remove, {asn1rt_ber_bin_v2, soft_purge, soft_purge}},
+ {remove, {asn1rt_driver_handler, soft_purge, soft_purge}}
+ ]
+ },
+ {"1.3.3",
+ [
+ {load_module, asn1rt_per_v1, soft_purge, soft_purge, []},
+ {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []},
+ {load_module, asn1rt, soft_purge, soft_purge, []},
+ {load_module, asn1rt_per_bin, soft_purge, soft_purge, []},
+ {load_module, asn1rt_check, soft_purge, soft_purge, []},
+ {load_module, asn1rt_per_bin_rt2ct, soft_purge, soft_purge, []},
+ {add_module, asn1rt_ber_v1},
+ {remove, {asn1rt_ber_bin_v2, soft_purge, soft_purge}},
+ {remove, {asn1rt_driver_handler, soft_purge, soft_purge}}
+ ]
+ },
+ {"1.3.3.1",
+ [
+ {load_module, asn1rt_per_v1, soft_purge, soft_purge, []},
+ {load_module, asn1rt_ber_bin, soft_purge, soft_purge, []},
+ {load_module, asn1rt, soft_purge, soft_purge, []},
+ {load_module, asn1rt_per_bin, soft_purge, soft_purge, []},
+ {load_module, asn1rt_check, soft_purge, soft_purge, []},
+ {load_module, asn1rt_per_bin_rt2ct, soft_purge, soft_purge, []},
+ {add_module, asn1rt_ber_v1},
+ {remove, {asn1rt_ber_bin_v2, soft_purge, soft_purge}},
+ {remove, {asn1rt_driver_handler, soft_purge, soft_purge}}
+ ]
+ }
+
+ ]}.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1_db.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1_db.erl
new file mode 100644
index 0000000000..d5ddb9582b
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1_db.erl
@@ -0,0 +1,160 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1_db.erl,v 1.1 2008/12/17 09:53:29 mikpe Exp $
+%%
+-module(asn1_db).
+%-compile(export_all).
+-export([dbnew/1,dbsave/2,dbload/1,dbput/3,dbget/2,dbget_all/1]).
+-export([dbget_all_mod/1,dbstop/0,dbclear/0,dberase_module/1,dbstart/1,stop_server/1]).
+%% internal exports
+-export([dbloop0/1,dbloop/2]).
+
+%% Db stuff
+dbstart(Includes) ->
+ start_server(asn1db, asn1_db, dbloop0, [Includes]).
+
+dbloop0(Includes) ->
+ dbloop(Includes, ets:new(asn1, [set,named_table])).
+
+opentab(Tab,Mod,[]) ->
+ opentab(Tab,Mod,["."]);
+opentab(Tab,Mod,Includes) ->
+ Base = lists:concat([Mod,".asn1db"]),
+ opentab2(Tab,Base,Mod,Includes,ok).
+
+opentab2(_Tab,_Base,_Mod,[],Error) ->
+ Error;
+opentab2(Tab,Base,Mod,[Ih|It],_Error) ->
+ File = filename:join(Ih,Base),
+ case ets:file2tab(File) of
+ {ok,Modtab} ->
+ ets:insert(Tab,{Mod, Modtab}),
+ {ok,Modtab};
+ NewErr ->
+ opentab2(Tab,Base,Mod,It,NewErr)
+ end.
+
+
+dbloop(Includes, Tab) ->
+ receive
+ {From,{set, Mod, K2, V}} ->
+ [{_,Modtab}] = ets:lookup(Tab,Mod),
+ ets:insert(Modtab,{K2, V}),
+ From ! {asn1db, ok},
+ dbloop(Includes, Tab);
+ {From, {get, Mod, K2}} ->
+ Result = case ets:lookup(Tab,Mod) of
+ [] ->
+ opentab(Tab,Mod,Includes);
+ [{_,Modtab}] -> {ok,Modtab}
+ end,
+ case Result of
+ {ok,Newtab} ->
+ From ! {asn1db, lookup(Newtab, K2)};
+ _Error ->
+ From ! {asn1db, undefined}
+ end,
+ dbloop(Includes, Tab);
+ {From, {all_mod, Mod}} ->
+ [{_,Modtab}] = ets:lookup(Tab,Mod),
+ From ! {asn1db, ets:tab2list(Modtab)},
+ dbloop(Includes, Tab);
+ {From, {delete_mod, Mod}} ->
+ [{_,Modtab}] = ets:lookup(Tab,Mod),
+ ets:delete(Modtab),
+ ets:delete(Tab,Mod),
+ From ! {asn1db, ok},
+ dbloop(Includes, Tab);
+ {From, {save, OutFile,Mod}} ->
+ [{_,Mtab}] = ets:lookup(Tab,Mod),
+ {From ! {asn1db, ets:tab2file(Mtab,OutFile)}},
+ dbloop(Includes,Tab);
+ {From, {load, Mod}} ->
+ Result = case ets:lookup(Tab,Mod) of
+ [] ->
+ opentab(Tab,Mod,Includes);
+ [{_,Modtab}] -> {ok,Modtab}
+ end,
+ {From, {asn1db,Result}},
+ dbloop(Includes,Tab);
+ {From, {new, Mod}} ->
+ case ets:lookup(Tab,Mod) of
+ [{_,Modtab}] ->
+ ets:delete(Modtab);
+ _ ->
+ true
+ end,
+ Tabname = list_to_atom(lists:concat(["asn1_",Mod])),
+ ets:new(Tabname, [set,named_table]),
+ ets:insert(Tab,{Mod,Tabname}),
+ From ! {asn1db, ok},
+ dbloop(Includes,Tab);
+ {From, stop} ->
+ From ! {asn1db, ok}; %% nothing to store
+ {From, clear} ->
+ ModTabList = [Mt||{_,Mt} <- ets:tab2list(Tab)],
+ lists:foreach(fun(T) -> ets:delete(T) end,ModTabList),
+ ets:delete(Tab),
+ From ! {asn1db, cleared},
+ dbloop(Includes, ets:new(asn1, [set]))
+ end.
+
+
+%%all(Tab, K) ->
+%% pickup(K, ets:match(Tab, {{K, '$1'}, '$2'})).
+%%pickup(K, []) -> [];
+%%pickup(K, [[V1,V2] |T]) ->
+%% [{{K,V1},V2} | pickup(K, T)].
+
+lookup(Tab, K) ->
+ case ets:lookup(Tab, K) of
+ [] -> undefined;
+ [{K,V}] -> V
+ end.
+
+
+dbnew(Module) -> req({new,Module}).
+dbsave(OutFile,Module) -> req({save,OutFile,Module}).
+dbload(Module) -> req({load,Module}).
+
+dbput(Module,K,V) -> req({set, Module, K, V}).
+dbget(Module,K) -> req({get, Module, K}).
+dbget_all(K) -> req({get_all, K}).
+dbget_all_mod(Mod) -> req({all_mod,Mod}).
+dbstop() -> stop_server(asn1db).
+dbclear() -> req(clear).
+dberase_module({module,M})->
+ req({delete_mod, M}).
+
+req(R) ->
+ asn1db ! {self(), R},
+ receive {asn1db, Reply} -> Reply end.
+
+stop_server(Name) ->
+ stop_server(Name, whereis(Name)).
+stop_server(_, undefined) -> stopped;
+stop_server(Name, _Pid) ->
+ Name ! {self(), stop},
+ receive {Name, _} -> stopped end.
+
+
+start_server(Name,Mod,Fun,Args) ->
+ case whereis(Name) of
+ undefined ->
+ register(Name, spawn(Mod,Fun, Args));
+ _Pid ->
+ already_started
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1_records.hrl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1_records.hrl
new file mode 100644
index 0000000000..6ba4877523
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1_records.hrl
@@ -0,0 +1,96 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1_records.hrl,v 1.1 2008/12/17 09:53:29 mikpe Exp $
+%%
+-define('RT_BER',"asn1rt_ber_v1").
+-define('RT_BER_BIN',"asn1rt_ber_bin").
+-define('RT_PER',"asn1rt_per_v1").
+%% change to this when we have this module -define('RT_PER_BIN',"asn1rt_per_bin").
+-define('RT_PER_BIN',"asn1rt_per_bin").
+
+-record(module,{pos,name,defid,tagdefault='EXPLICIT',exports={exports,[]},imports={imports,[]}, extensiondefault=empty,typeorval}).
+
+-record('SEQUENCE',{pname=false,tablecinf=false,components=[]}).
+-record('SET',{pname=false,sorted=false,tablecinf=false,components=[]}).
+-record('ComponentType',{pos,name,typespec,prop,tags}).
+-record('ObjectClassFieldType',{classname,class,fieldname,type}).
+
+-record(typedef,{checked=false,pos,name,typespec}).
+-record(classdef,{checked=false,pos,name,typespec}).
+-record(valuedef,{checked=false,pos,name,type,value}).
+-record(ptypedef,{checked=false,pos,name,args,typespec}).
+-record(pvaluedef,{checked=false,pos,name,args,type,value}).
+-record(pvaluesetdef,{checked=false,pos,name,args,type,valueset}).
+-record(pobjectdef,{checked=false,pos,name,args,class,def}).
+-record(pobjectsetdef,{checked=false,pos,name,args,class,def}).
+
+-record(typereference,{pos,val}).
+-record(identifier,{pos,val}).
+-record(constraint,{c,e}).
+-record('Constraint',{'SingleValue'=no,'SizeConstraint'=no,'ValueRange'=no,'PermittedAlphabet'=no,
+ 'ContainedSubtype'=no, 'TypeConstraint'=no,'InnerSubtyping'=no,e=no,'Other'=no}).
+-record(simpletableattributes,{objectsetname,c_name,c_index,usedclassfield,
+ uniqueclassfield,valueindex}).
+-record(type,{tag=[],def,constraint=[],tablecinf=[],inlined=no}).
+
+-record(objectclass,{fields=[],syntax}).
+-record('Object',{classname,gen=true,def}).
+-record('ObjectSet',{class,gen=true,uniquefname,set}).
+
+-record(tag,{class,number,type,form=32}). % form = ?CONSTRUCTED
+% This record holds information about allowed constraint types per type
+-record(cmap,{single_value=no,contained_subtype=no,value_range=no,
+ size=no,permitted_alphabet=no,type_constraint=no,
+ inner_subtyping=no}).
+
+
+-record('EXTENSIONMARK',{pos,val}).
+
+% each IMPORT contains a list of 'SymbolsFromModule'
+-record('SymbolsFromModule',{symbols,module,objid}).
+
+% Externaltypereference -> modulename '.' typename
+-record('Externaltypereference',{pos,module,type}).
+% Externalvaluereference -> modulename '.' typename
+-record('Externalvaluereference',{pos,module,value}).
+
+-record(state,{module,mname,type,tname,value,vname,erule,parameters=[],
+ inputmodules,abscomppath=[],recordtopname=[],options}).
+
+%% state record used by backend at partial decode
+%% active is set to 'yes' when a partial decode function is generated.
+%% prefix is set to 'dec-inc-' or 'dec-partial-' is for
+%% incomplete partial decode or partial decode respectively
+%% inc_tag_pattern holds the tags of the significant types/components
+%% for incomplete partial decode.
+%% tag_pattern holds the tags for partial decode.
+%% inc_type_pattern and type_pattern holds the names of the
+%% significant types/components.
+%% func_name holds the name of the function for the toptype.
+%% namelist holds the list of names of types/components that still
+%% haven't been generated.
+%% tobe_refed_funcs is a list of tuples {function names
+%% (Types),namelist of incomplete decode spec}, with function names
+%% that are referenced within other generated partial incomplete
+%% decode functions. They shall be generated as partial incomplete
+%% decode functions.
+
+%% gen_refed_funcs is as list of function names. Unlike
+%% tobe_refed_funcs these have been generated.
+-record(gen_state,{active=false,prefix,inc_tag_pattern,
+ tag_pattern,inc_type_pattern,
+ type_pattern,func_name,namelist,
+ tobe_refed_funcs=[],gen_refed_funcs=[]}).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct.erl
new file mode 100644
index 0000000000..fd36f1657e
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct.erl
@@ -0,0 +1,1904 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1ct.erl,v 1.1 2008/12/17 09:53:29 mikpe Exp $
+%%
+-module(asn1ct).
+
+%% Compile Time functions for ASN.1 (e.g ASN.1 compiler).
+
+%%-compile(export_all).
+%% Public exports
+-export([compile/1, compile/2]).
+-export([start/0, start/1, stop/0]).
+-export([encode/2, encode/3, decode/3]).
+-export([test/1, test/2, test/3, value/2]).
+%% Application internal exports
+-export([compile_asn/3,compile_asn1/3,compile_py/3,compile/3,value/1,vsn/0,
+ create_ets_table/2,get_name_of_def/1,get_pos_of_def/1]).
+-export([read_config_data/1,get_gen_state_field/1,get_gen_state/0,
+ partial_inc_dec_toptype/1,save_gen_state/1,update_gen_state/2,
+ get_tobe_refed_func/1,reset_gen_state/0,is_function_generated/1,
+ generated_refed_func/1,next_refed_func/0,pop_namelist/0,
+ next_namelist_el/0,update_namelist/1,step_in_constructed/0,
+ add_tobe_refed_func/1,add_generated_refed_func/1]).
+
+-include("asn1_records.hrl").
+-include_lib("stdlib/include/erl_compile.hrl").
+
+-import(asn1ct_gen_ber_bin_v2,[encode_tag_val/3,decode_class/1]).
+
+-define(unique_names,0).
+-define(dupl_uniquedefs,1).
+-define(dupl_equaldefs,2).
+-define(dupl_eqdefs_uniquedefs,?dupl_equaldefs bor ?dupl_uniquedefs).
+
+-define(CONSTRUCTED, 2#00100000).
+
+%% macros used for partial decode commands
+-define(CHOOSEN,choosen).
+-define(SKIP,skip).
+-define(SKIP_OPTIONAL,skip_optional).
+
+%% macros used for partial incomplete decode commands
+-define(MANDATORY,mandatory).
+-define(DEFAULT,default).
+-define(OPTIONAL,opt).
+-define(PARTS,parts).
+-define(UNDECODED,undec).
+-define(ALTERNATIVE,alt).
+-define(ALTERNATIVE_UNDECODED,alt_undec).
+-define(ALTERNATIVE_PARTS,alt_parts).
+%-define(BINARY,bin).
+
+%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% This is the interface to the compiler
+%%
+%%
+
+
+compile(File) ->
+ compile(File,[]).
+
+compile(File,Options) when list(Options) ->
+ Options1 =
+ case {lists:member(optimize,Options),lists:member(ber_bin,Options)} of
+ {true,true} ->
+ [ber_bin_v2|Options--[ber_bin]];
+ _ -> Options
+ end,
+ case (catch input_file_type(File)) of
+ {single_file,PrefixedFile} ->
+ (catch compile1(PrefixedFile,Options1));
+ {multiple_files_file,SetBase,FileName} ->
+ FileList = get_file_list(FileName),
+ (catch compile_set(SetBase,filename:dirname(FileName),
+ FileList,Options1));
+ Err = {input_file_error,_Reason} ->
+ {error,Err}
+ end.
+
+
+compile1(File,Options) when list(Options) ->
+ io:format("Erlang ASN.1 version ~p compiling ~p ~n",[?vsn,File]),
+ io:format("Compiler Options: ~p~n",[Options]),
+ Ext = filename:extension(File),
+ Base = filename:basename(File,Ext),
+ OutFile = outfile(Base,"",Options),
+ DbFile = outfile(Base,"asn1db",Options),
+ Includes = [I || {i,I} <- Options],
+ EncodingRule = get_rule(Options),
+ create_ets_table(asn1_functab,[named_table]),
+ Continue1 = scan({true,true},File,Options),
+ Continue2 = parse(Continue1,File,Options),
+ Continue3 = check(Continue2,File,OutFile,Includes,EncodingRule,
+ DbFile,Options,[]),
+ Continue4 = generate(Continue3,OutFile,EncodingRule,Options),
+ delete_tables([asn1_functab]),
+ compile_erl(Continue4,OutFile,Options).
+
+%%****************************************************************************%%
+%% functions dealing with compiling of several input files to one output file %%
+%%****************************************************************************%%
+compile_set(SetBase,DirName,Files,Options) when list(hd(Files)),list(Options) ->
+ %% case when there are several input files in a list
+ io:format("Erlang ASN.1 version ~p compiling ~p ~n",[?vsn,Files]),
+ io:format("Compiler Options: ~p~n",[Options]),
+ OutFile = outfile(SetBase,"",Options),
+ DbFile = outfile(SetBase,"asn1db",Options),
+ Includes = [I || {i,I} <- Options],
+ EncodingRule = get_rule(Options),
+ create_ets_table(asn1_functab,[named_table]),
+ ScanRes = scan_set(DirName,Files,Options),
+ ParseRes = parse_set(ScanRes,Options),
+ Result =
+ case [X||X <- ParseRes,element(1,X)==true] of
+ [] -> %% all were false, time to quit
+ lists:map(fun(X)->element(2,X) end,ParseRes);
+ ParseRes -> %% all were true, continue with check
+ InputModules =
+ lists:map(
+ fun(F)->
+ E = filename:extension(F),
+ B = filename:basename(F,E),
+ if
+ list(B) -> list_to_atom(B);
+ true -> B
+ end
+ end,
+ Files),
+ check_set(ParseRes,SetBase,OutFile,Includes,
+ EncodingRule,DbFile,Options,InputModules);
+ Other ->
+ {error,{'unexpected error in scan/parse phase',
+ lists:map(fun(X)->element(3,X) end,Other)}}
+ end,
+ delete_tables([asn1_functab]),
+ Result.
+
+check_set(ParseRes,SetBase,OutFile,Includes,EncRule,DbFile,
+ Options,InputModules) ->
+ lists:foreach(fun({_T,M,File})->
+ cmp(M#module.name,File)
+ end,
+ ParseRes),
+ MergedModule = merge_modules(ParseRes,SetBase),
+ SetM = MergedModule#module{name=SetBase},
+ Continue1 = check({true,SetM},SetBase,OutFile,Includes,EncRule,DbFile,
+ Options,InputModules),
+ Continue2 = generate(Continue1,OutFile,EncRule,Options),
+
+ delete_tables([renamed_defs,original_imports,automatic_tags]),
+
+ compile_erl(Continue2,OutFile,Options).
+
+%% merge_modules/2 -> returns a module record where the typeorval lists are merged,
+%% the exports lists are merged, the imports lists are merged when the
+%% elements come from other modules than the merge set, the tagdefault
+%% field gets the shared value if all modules have same tagging scheme,
+%% otherwise a tagging_error exception is thrown,
+%% the extensiondefault ...(not handled yet).
+merge_modules(ParseRes,CommonName) ->
+ ModuleList = lists:map(fun(X)->element(2,X) end,ParseRes),
+ NewModuleList = remove_name_collisions(ModuleList),
+ case ets:info(renamed_defs,size) of
+ 0 -> ets:delete(renamed_defs);
+ _ -> ok
+ end,
+ save_imports(NewModuleList),
+% io:format("~p~n~p~n~p~n~n",[ets:lookup(original_imports,'M1'),ets:lookup(original_imports,'M2'),ets:tab2list(original_imports)]),
+ TypeOrVal = lists:append(lists:map(fun(X)->X#module.typeorval end,
+ NewModuleList)),
+ InputMNameList = lists:map(fun(X)->X#module.name end,
+ NewModuleList),
+ CExports = common_exports(NewModuleList),
+
+ ImportsModuleNameList = lists:map(fun(X)->
+ {X#module.imports,
+ X#module.name} end,
+ NewModuleList),
+ %% ImportsModuleNameList: [{Imports,ModuleName},...]
+ %% Imports is a tuple {imports,[#'SymbolsFromModule'{},...]}
+ CImports = common_imports(ImportsModuleNameList,InputMNameList),
+ TagDefault = check_tagdefault(NewModuleList),
+ #module{name=CommonName,tagdefault=TagDefault,exports=CExports,
+ imports=CImports,typeorval=TypeOrVal}.
+
+%% causes an exit if duplicate definition names exist in a module
+remove_name_collisions(Modules) ->
+ create_ets_table(renamed_defs,[named_table]),
+ %% Name duplicates in the same module is not allowed.
+ lists:foreach(fun exit_if_nameduplicate/1,Modules),
+ %% Then remove duplicates in different modules and return the
+ %% new list of modules.
+ remove_name_collisions2(Modules,[]).
+
+%% For each definition in the first module in module list, find
+%% all definitons with same name and rename both definitions in
+%% the first module and in rest of modules
+remove_name_collisions2([M|Ms],Acc) ->
+ TypeOrVal = M#module.typeorval,
+ MName = M#module.name,
+ %% Test each name in TypeOrVal on all modules in Ms
+ {NewM,NewMs} = remove_name_collisions2(MName,TypeOrVal,Ms,[]),
+ remove_name_collisions2(NewMs,[M#module{typeorval=NewM}|Acc]);
+remove_name_collisions2([],Acc) ->
+ finished_warn_prints(),
+ Acc.
+
+%% For each definition in list of defs find definitions in (rest of)
+%% modules that have same name. If duplicate was found rename def.
+%% Test each name in [T|Ts] on all modules in Ms
+remove_name_collisions2(ModName,[T|Ts],Ms,Acc) ->
+ Name = get_name_of_def(T),
+ case discover_dupl_in_mods(Name,T,Ms,[],?unique_names) of
+ {_,?unique_names} -> % there was no name collision
+ remove_name_collisions2(ModName,Ts,Ms,[T|Acc]);
+ {NewMs,?dupl_uniquedefs} -> % renamed defs in NewMs
+ %% rename T
+ NewT = set_name_of_def(ModName,Name,T), %rename def
+ warn_renamed_def(ModName,get_name_of_def(NewT),Name),
+ ets:insert(renamed_defs,{get_name_of_def(NewT),Name,ModName}),
+ remove_name_collisions2(ModName,Ts,NewMs,[NewT|Acc]);
+ {NewMs,?dupl_equaldefs} -> % name duplicates, but identical defs
+ %% keep name of T
+ warn_kept_def(ModName,Name),
+ remove_name_collisions2(ModName,Ts,NewMs,[T|Acc]);
+ {NewMs,?dupl_eqdefs_uniquedefs} ->
+ %% keep name of T, renamed defs in NewMs
+ warn_kept_def(ModName,Name),
+ remove_name_collisions2(ModName,Ts,NewMs,[T|Acc])
+ end;
+remove_name_collisions2(_,[],Ms,Acc) ->
+ {Acc,Ms}.
+
+%% Name is the name of a definition. If a definition with the same name
+%% is found in the modules Ms the definition will be renamed and returned.
+discover_dupl_in_mods(Name,Def,[M=#module{name=N,typeorval=TorV}|Ms],
+ Acc,AnyRenamed) ->
+ Fun = fun(T,RenamedOrDupl)->
+ case {get_name_of_def(T),compare_defs(Def,T)} of
+ {Name,not_equal} ->
+ %% rename def
+ NewT=set_name_of_def(N,Name,T),
+ warn_renamed_def(N,get_name_of_def(NewT),Name),
+ ets:insert(renamed_defs,{get_name_of_def(NewT),
+ Name,N}),
+ {NewT,?dupl_uniquedefs bor RenamedOrDupl};
+ {Name,equal} ->
+ %% delete def
+ warn_deleted_def(N,Name),
+ {[],?dupl_equaldefs bor RenamedOrDupl};
+ _ ->
+ {T,RenamedOrDupl}
+ end
+ end,
+ {NewTorV,NewAnyRenamed} = lists:mapfoldl(Fun,AnyRenamed,TorV),
+ %% have to flatten the NewTorV to remove any empty list elements
+ discover_dupl_in_mods(Name,Def,Ms,
+ [M#module{typeorval=lists:flatten(NewTorV)}|Acc],
+ NewAnyRenamed);
+discover_dupl_in_mods(_,_,[],Acc,AnyRenamed) ->
+ {Acc,AnyRenamed}.
+
+warn_renamed_def(ModName,NewName,OldName) ->
+ maybe_first_warn_print(),
+ io:format("NOTICE: The ASN.1 definition in module ~p with name ~p has been renamed in generated module. New name is ~p.~n",[ModName,OldName,NewName]).
+
+warn_deleted_def(ModName,DefName) ->
+ maybe_first_warn_print(),
+ io:format("NOTICE: The ASN.1 definition in module ~p with name ~p has been deleted in generated module.~n",[ModName,DefName]).
+
+warn_kept_def(ModName,DefName) ->
+ maybe_first_warn_print(),
+ io:format("NOTICE: The ASN.1 definition in module ~p with name ~p has kept its name due to equal definition as duplicate.~n",[ModName,DefName]).
+
+maybe_first_warn_print() ->
+ case get(warn_duplicate_defs) of
+ undefined ->
+ put(warn_duplicate_defs,true),
+ io:format("~nDue to multiple occurrences of a definition name in "
+ "multi-file compiled files:~n");
+ _ ->
+ ok
+ end.
+finished_warn_prints() ->
+ put(warn_duplicate_defs,undefined).
+
+
+exit_if_nameduplicate(#module{typeorval=TorV}) ->
+ exit_if_nameduplicate(TorV);
+exit_if_nameduplicate([]) ->
+ ok;
+exit_if_nameduplicate([Def|Rest]) ->
+ Name=get_name_of_def(Def),
+ exit_if_nameduplicate2(Name,Rest),
+ exit_if_nameduplicate(Rest).
+
+exit_if_nameduplicate2(Name,Rest) ->
+ Pred=fun(Def)->
+ case get_name_of_def(Def) of
+ Name -> true;
+ _ -> false
+ end
+ end,
+ case lists:any(Pred,Rest) of
+ true ->
+ throw({error,{"more than one definition with same name",Name}});
+ _ ->
+ ok
+ end.
+
+compare_defs(D1,D2) ->
+ compare_defs2(unset_pos(D1),unset_pos(D2)).
+compare_defs2(D,D) ->
+ equal;
+compare_defs2(_,_) ->
+ not_equal.
+
+unset_pos(Def) when record(Def,typedef) ->
+ Def#typedef{pos=undefined};
+unset_pos(Def) when record(Def,classdef) ->
+ Def#classdef{pos=undefined};
+unset_pos(Def) when record(Def,valuedef) ->
+ Def#valuedef{pos=undefined};
+unset_pos(Def) when record(Def,ptypedef) ->
+ Def#ptypedef{pos=undefined};
+unset_pos(Def) when record(Def,pvaluedef) ->
+ Def#pvaluedef{pos=undefined};
+unset_pos(Def) when record(Def,pvaluesetdef) ->
+ Def#pvaluesetdef{pos=undefined};
+unset_pos(Def) when record(Def,pobjectdef) ->
+ Def#pobjectdef{pos=undefined};
+unset_pos(Def) when record(Def,pobjectsetdef) ->
+ Def#pobjectsetdef{pos=undefined}.
+
+get_pos_of_def(#typedef{pos=Pos}) ->
+ Pos;
+get_pos_of_def(#classdef{pos=Pos}) ->
+ Pos;
+get_pos_of_def(#valuedef{pos=Pos}) ->
+ Pos;
+get_pos_of_def(#ptypedef{pos=Pos}) ->
+ Pos;
+get_pos_of_def(#pvaluedef{pos=Pos}) ->
+ Pos;
+get_pos_of_def(#pvaluesetdef{pos=Pos}) ->
+ Pos;
+get_pos_of_def(#pobjectdef{pos=Pos}) ->
+ Pos;
+get_pos_of_def(#pobjectsetdef{pos=Pos}) ->
+ Pos.
+
+
+get_name_of_def(#typedef{name=Name}) ->
+ Name;
+get_name_of_def(#classdef{name=Name}) ->
+ Name;
+get_name_of_def(#valuedef{name=Name}) ->
+ Name;
+get_name_of_def(#ptypedef{name=Name}) ->
+ Name;
+get_name_of_def(#pvaluedef{name=Name}) ->
+ Name;
+get_name_of_def(#pvaluesetdef{name=Name}) ->
+ Name;
+get_name_of_def(#pobjectdef{name=Name}) ->
+ Name;
+get_name_of_def(#pobjectsetdef{name=Name}) ->
+ Name.
+
+set_name_of_def(ModName,Name,OldDef) ->
+ NewName = list_to_atom(lists:concat([Name,ModName])),
+ case OldDef of
+ #typedef{} -> OldDef#typedef{name=NewName};
+ #classdef{} -> OldDef#classdef{name=NewName};
+ #valuedef{} -> OldDef#valuedef{name=NewName};
+ #ptypedef{} -> OldDef#ptypedef{name=NewName};
+ #pvaluedef{} -> OldDef#pvaluedef{name=NewName};
+ #pvaluesetdef{} -> OldDef#pvaluesetdef{name=NewName};
+ #pobjectdef{} -> OldDef#pobjectdef{name=NewName};
+ #pobjectsetdef{} -> OldDef#pobjectsetdef{name=NewName}
+ end.
+
+save_imports(ModuleList)->
+ Fun = fun(M) ->
+ case M#module.imports of
+ {_,[]} -> [];
+ {_,I} ->
+ {M#module.name,I}
+ end
+ end,
+ ImportsList = lists:map(Fun,ModuleList),
+ case lists:flatten(ImportsList) of
+ [] ->
+ ok;
+ ImportsList2 ->
+ create_ets_table(original_imports,[named_table]),
+ ets:insert(original_imports,ImportsList2)
+ end.
+
+
+common_exports(ModuleList) ->
+ %% if all modules exports 'all' then export 'all',
+ %% otherwise export each typeorval name
+ case lists:filter(fun(X)->
+ element(2,X#module.exports) /= all
+ end,
+ ModuleList) of
+ []->
+ {exports,all};
+ ModsWithExpList ->
+ CExports1 =
+ lists:append(lists:map(fun(X)->element(2,X#module.exports) end,
+ ModsWithExpList)),
+ CExports2 = export_all(lists:subtract(ModuleList,ModsWithExpList)),
+ {exports,CExports1++CExports2}
+ end.
+
+export_all([])->[];
+export_all(ModuleList) ->
+ ExpList =
+ lists:map(
+ fun(M)->
+ TorVL=M#module.typeorval,
+ MName = M#module.name,
+ lists:map(
+ fun(Def)->
+ case Def of
+ T when record(T,typedef)->
+ #'Externaltypereference'{pos=0,
+ module=MName,
+ type=T#typedef.name};
+ V when record(V,valuedef) ->
+ #'Externalvaluereference'{pos=0,
+ module=MName,
+ value=V#valuedef.name};
+ C when record(C,classdef) ->
+ #'Externaltypereference'{pos=0,
+ module=MName,
+ type=C#classdef.name};
+ P when record(P,ptypedef) ->
+ #'Externaltypereference'{pos=0,
+ module=MName,
+ type=P#ptypedef.name};
+ PV when record(PV,pvaluesetdef) ->
+ #'Externaltypereference'{pos=0,
+ module=MName,
+ type=PV#pvaluesetdef.name};
+ PO when record(PO,pobjectdef) ->
+ #'Externalvaluereference'{pos=0,
+ module=MName,
+ value=PO#pobjectdef.name}
+ end
+ end,
+ TorVL)
+ end,
+ ModuleList),
+ lists:append(ExpList).
+
+%% common_imports/2
+%% IList is a list of tuples, {Imports,MName}, where Imports is the imports of
+%% the module with name MName.
+%% InputMNameL holds the names of all merged modules.
+%% Returns an import tuple with a list of imports that are external the merged
+%% set of modules.
+common_imports(IList,InputMNameL) ->
+ SetExternalImportsList = remove_in_set_imports(IList,InputMNameL,[]),
+ {imports,remove_import_doubles(SetExternalImportsList)}.
+
+check_tagdefault(ModList) ->
+ case have_same_tagdefault(ModList) of
+ {true,TagDefault} -> TagDefault;
+ {false,TagDefault} ->
+ create_ets_table(automatic_tags,[named_table]),
+ save_automatic_tagged_types(ModList),
+ TagDefault
+ end.
+
+have_same_tagdefault([#module{tagdefault=T}|Ms]) ->
+ have_same_tagdefault(Ms,{true,T}).
+
+have_same_tagdefault([],TagDefault) ->
+ TagDefault;
+have_same_tagdefault([#module{tagdefault=T}|Ms],TDefault={_,T}) ->
+ have_same_tagdefault(Ms,TDefault);
+have_same_tagdefault([#module{tagdefault=T1}|Ms],{_,T2}) ->
+ have_same_tagdefault(Ms,{false,rank_tagdef([T1,T2])}).
+
+rank_tagdef(L) ->
+ case lists:member('EXPLICIT',L) of
+ true -> 'EXPLICIT';
+ _ -> 'IMPLICIT'
+ end.
+
+save_automatic_tagged_types([])->
+ done;
+save_automatic_tagged_types([#module{tagdefault='AUTOMATIC',
+ typeorval=TorV}|Ms]) ->
+ Fun =
+ fun(T) ->
+ ets:insert(automatic_tags,{get_name_of_def(T)})
+ end,
+ lists:foreach(Fun,TorV),
+ save_automatic_tagged_types(Ms);
+save_automatic_tagged_types([_M|Ms]) ->
+ save_automatic_tagged_types(Ms).
+
+%% remove_in_set_imports/3 :
+%% input: list with tuples of each module's imports and module name
+%% respectively.
+%% output: one list with same format but each occured import from a
+%% module in the input set (IMNameL) is removed.
+remove_in_set_imports([{{imports,ImpL},_ModName}|Rest],InputMNameL,Acc) ->
+ NewImpL = remove_in_set_imports1(ImpL,InputMNameL,[]),
+ remove_in_set_imports(Rest,InputMNameL,NewImpL++Acc);
+remove_in_set_imports([],_,Acc) ->
+ lists:reverse(Acc).
+
+remove_in_set_imports1([I|Is],InputMNameL,Acc) ->
+ case I#'SymbolsFromModule'.module of
+ #'Externaltypereference'{type=MName} ->
+ case lists:member(MName,InputMNameL) of
+ true ->
+ remove_in_set_imports1(Is,InputMNameL,Acc);
+ false ->
+ remove_in_set_imports1(Is,InputMNameL,[I|Acc])
+ end;
+ _ ->
+ remove_in_set_imports1(Is,InputMNameL,[I|Acc])
+ end;
+remove_in_set_imports1([],_,Acc) ->
+ lists:reverse(Acc).
+
+remove_import_doubles([]) ->
+ [];
+%% If several modules in the merge set imports symbols from
+%% the same external module it might be doubled.
+%% ImportList has #'SymbolsFromModule' elements
+remove_import_doubles(ImportList) ->
+ MergedImportList =
+ merge_symbols_from_module(ImportList,[]),
+%% io:format("MergedImportList: ~p~n",[MergedImportList]),
+ delete_double_of_symbol(MergedImportList,[]).
+
+merge_symbols_from_module([Imp|Imps],Acc) ->
+ #'Externaltypereference'{type=ModName} = Imp#'SymbolsFromModule'.module,
+ IfromModName =
+ lists:filter(
+ fun(I)->
+ case I#'SymbolsFromModule'.module of
+ #'Externaltypereference'{type=ModName} ->
+ true;
+ #'Externalvaluereference'{value=ModName} ->
+ true;
+ _ -> false
+ end
+ end,
+ Imps),
+ NewImps = lists:subtract(Imps,IfromModName),
+%% io:format("Imp: ~p~nIfromModName: ~p~n",[Imp,IfromModName]),
+ NewImp =
+ Imp#'SymbolsFromModule'{
+ symbols = lists:append(
+ lists:map(fun(SL)->
+ SL#'SymbolsFromModule'.symbols
+ end,[Imp|IfromModName]))},
+ merge_symbols_from_module(NewImps,[NewImp|Acc]);
+merge_symbols_from_module([],Acc) ->
+ lists:reverse(Acc).
+
+delete_double_of_symbol([I|Is],Acc) ->
+ SymL=I#'SymbolsFromModule'.symbols,
+ NewSymL = delete_double_of_symbol1(SymL,[]),
+ delete_double_of_symbol(Is,[I#'SymbolsFromModule'{symbols=NewSymL}|Acc]);
+delete_double_of_symbol([],Acc) ->
+ Acc.
+
+delete_double_of_symbol1([TRef=#'Externaltypereference'{type=TrefName}|Rest],Acc)->
+ NewRest =
+ lists:filter(fun(S)->
+ case S of
+ #'Externaltypereference'{type=TrefName}->
+ false;
+ _ -> true
+ end
+ end,
+ Rest),
+ delete_double_of_symbol1(NewRest,[TRef|Acc]);
+delete_double_of_symbol1([VRef=#'Externalvaluereference'{value=VName}|Rest],Acc) ->
+ NewRest =
+ lists:filter(fun(S)->
+ case S of
+ #'Externalvaluereference'{value=VName}->
+ false;
+ _ -> true
+ end
+ end,
+ Rest),
+ delete_double_of_symbol1(NewRest,[VRef|Acc]);
+delete_double_of_symbol1([TRef={#'Externaltypereference'{type=MRef},
+ #'Externaltypereference'{type=TRef}}|Rest],
+ Acc)->
+ NewRest =
+ lists:filter(
+ fun(S)->
+ case S of
+ {#'Externaltypereference'{type=MRef},
+ #'Externaltypereference'{type=TRef}}->
+ false;
+ _ -> true
+ end
+ end,
+ Rest),
+ delete_double_of_symbol1(NewRest,[TRef|Acc]);
+delete_double_of_symbol1([],Acc) ->
+ Acc.
+
+
+scan_set(DirName,Files,Options) ->
+ lists:map(
+ fun(F)->
+ case scan({true,true},filename:join([DirName,F]),Options) of
+ {false,{error,Reason}} ->
+ throw({error,{'scan error in file:',F,Reason}});
+ {TrueOrFalse,Res} ->
+ {TrueOrFalse,Res,F}
+ end
+ end,
+ Files).
+
+parse_set(ScanRes,Options) ->
+ lists:map(
+ fun({TorF,Toks,F})->
+ case parse({TorF,Toks},F,Options) of
+ {false,{error,Reason}} ->
+ throw({error,{'parse error in file:',F,Reason}});
+ {TrueOrFalse,Res} ->
+ {TrueOrFalse,Res,F}
+ end
+ end,
+ ScanRes).
+
+
+%%***********************************
+
+
+scan({true,_}, File,Options) ->
+ case asn1ct_tok:file(File) of
+ {error,Reason} ->
+ io:format("~p~n",[Reason]),
+ {false,{error,Reason}};
+ Tokens ->
+ case lists:member(ss,Options) of
+ true -> % we terminate after scan
+ {false,Tokens};
+ false -> % continue with next pass
+ {true,Tokens}
+ end
+ end;
+scan({false,Result},_,_) ->
+ Result.
+
+
+parse({true,Tokens},File,Options) ->
+ %Presult = asn1ct_parser2:parse(Tokens),
+ %%case lists:member(p1,Options) of
+ %% true ->
+ %% asn1ct_parser:parse(Tokens);
+ %% _ ->
+ %% asn1ct_parser2:parse(Tokens)
+ %% end,
+ case catch asn1ct_parser2:parse(Tokens) of
+ {error,{{Line,_Mod,Message},_TokTup}} ->
+ if
+ integer(Line) ->
+ BaseName = filename:basename(File),
+ io:format("syntax error at line ~p in module ~s:~n",
+ [Line,BaseName]);
+ true ->
+ io:format("syntax error in module ~p:~n",[File])
+ end,
+ print_error_message(Message),
+ {false,{error,Message}};
+ {error,{Line,_Mod,[Message,Token]}} ->
+ io:format("syntax error: ~p ~p at line ~p~n",
+ [Message,Token,Line]),
+ {false,{error,{Line,[Message,Token]}}};
+ {ok,M} ->
+ case lists:member(sp,Options) of
+ true -> % terminate after parse
+ {false,M};
+ false -> % continue with next pass
+ {true,M}
+ end;
+ OtherError ->
+ io:format("~p~n",[OtherError])
+ end;
+parse({false,Tokens},_,_) ->
+ {false,Tokens}.
+
+check({true,M},File,OutFile,Includes,EncodingRule,DbFile,Options,InputMods) ->
+ cmp(M#module.name,File),
+ start(["."|Includes]),
+ case asn1ct_check:storeindb(M) of
+ ok ->
+ Module = asn1_db:dbget(M#module.name,'MODULE'),
+ State = #state{mname=Module#module.name,
+ module=Module#module{typeorval=[]},
+ erule=EncodingRule,
+ inputmodules=InputMods,
+ options=Options},
+ Check = asn1ct_check:check(State,Module#module.typeorval),
+ case {Check,lists:member(abs,Options)} of
+ {{error,Reason},_} ->
+ {false,{error,Reason}};
+ {{ok,NewTypeOrVal,_},true} ->
+ NewM = Module#module{typeorval=NewTypeOrVal},
+ asn1_db:dbput(NewM#module.name,'MODULE',NewM),
+ pretty2(M#module.name,lists:concat([OutFile,".abs"])),
+ {false,ok};
+ {{ok,NewTypeOrVal,GenTypeOrVal},_} ->
+ NewM = Module#module{typeorval=NewTypeOrVal},
+ asn1_db:dbput(NewM#module.name,'MODULE',NewM),
+ asn1_db:dbsave(DbFile,M#module.name),
+ io:format("--~p--~n",[{generated,DbFile}]),
+ {true,{M,NewM,GenTypeOrVal}}
+ end
+ end;
+check({false,M},_,_,_,_,_,_,_) ->
+ {false,M}.
+
+generate({true,{M,_Module,GenTOrV}},OutFile,EncodingRule,Options) ->
+ debug_on(Options),
+ case lists:member(compact_bit_string,Options) of
+ true -> put(compact_bit_string,true);
+ _ -> ok
+ end,
+ put(encoding_options,Options),
+ create_ets_table(check_functions,[named_table]),
+
+ %% create decoding function names and taglists for partial decode
+ %% For the time being leave errors unnoticed !!!!!!!!!
+% io:format("Options: ~p~n",[Options]),
+ case catch specialized_decode_prepare(EncodingRule,M,GenTOrV,Options) of
+ {error, enoent} -> ok;
+ {error, Reason} -> io:format("WARNING: Error in configuration"
+ "file: ~n~p~n",[Reason]);
+ {'EXIT',Reason} -> io:format("WARNING: Internal error when "
+ "analyzing configuration"
+ "file: ~n~p~n",[Reason]);
+ _ -> ok
+ end,
+
+ asn1ct_gen:pgen(OutFile,EncodingRule,M#module.name,GenTOrV),
+ debug_off(Options),
+ put(compact_bit_string,false),
+ erase(encoding_options),
+ erase(tlv_format), % used in ber_bin, optimize
+ erase(class_default_type),% used in ber_bin, optimize
+ ets:delete(check_functions),
+ case lists:member(sg,Options) of
+ true -> % terminate here , with .erl file generated
+ {false,true};
+ false ->
+ {true,true}
+ end;
+generate({false,M},_,_,_) ->
+ {false,M}.
+
+compile_erl({true,_},OutFile,Options) ->
+ erl_compile(OutFile,Options);
+compile_erl({false,true},_,_) ->
+ ok;
+compile_erl({false,Result},_,_) ->
+ Result.
+
+input_file_type([]) ->
+ {empty_name,[]};
+input_file_type(File) ->
+ case filename:extension(File) of
+ [] ->
+ case file:read_file_info(lists:concat([File,".asn1"])) of
+ {ok,_FileInfo} ->
+ {single_file, lists:concat([File,".asn1"])};
+ _Error ->
+ case file:read_file_info(lists:concat([File,".asn"])) of
+ {ok,_FileInfo} ->
+ {single_file, lists:concat([File,".asn"])};
+ _Error ->
+ {single_file, lists:concat([File,".py"])}
+ end
+ end;
+ ".asn1config" ->
+ case read_config_file(File,asn1_module) of
+ {ok,Asn1Module} ->
+ put(asn1_config_file,File),
+ input_file_type(Asn1Module);
+ Error ->
+ Error
+ end;
+ Asn1PFix ->
+ Base = filename:basename(File,Asn1PFix),
+ case filename:extension(Base) of
+ [] ->
+ {single_file,File};
+ SetPFix when (SetPFix == ".set") ->
+ {multiple_files_file,
+ filename:basename(Base,SetPFix),
+ File};
+ _Error ->
+ throw({input_file_error,{'Bad input file',File}})
+ end
+ end.
+
+get_file_list(File) ->
+ case file:open(File, [read]) of
+ {error,Reason} ->
+ {error,{File,file:format_error(Reason)}};
+ {ok,Stream} ->
+ get_file_list1(Stream,[])
+ end.
+
+get_file_list1(Stream,Acc) ->
+ Ret = io:get_line(Stream,''),
+ case Ret of
+ eof ->
+ file:close(Stream),
+ lists:reverse(Acc);
+ FileName ->
+ PrefixedNameList =
+ case (catch input_file_type(lists:delete($\n,FileName))) of
+ {empty_name,[]} -> [];
+ {single_file,Name} -> [Name];
+ {multiple_files_file,Name} ->
+ get_file_list(Name);
+ Err = {input_file_error,_Reason} ->
+ throw(Err)
+ end,
+ get_file_list1(Stream,PrefixedNameList++Acc)
+ end.
+
+get_rule(Options) ->
+ case [Rule ||Rule <-[per,ber,ber_bin,ber_bin_v2,per_bin],
+ Opt <- Options,
+ Rule==Opt] of
+ [Rule] ->
+ Rule;
+ [Rule|_] ->
+ Rule;
+ [] ->
+ ber
+ end.
+
+erl_compile(OutFile,Options) ->
+% io:format("Options:~n~p~n",[Options]),
+ case lists:member(noobj,Options) of
+ true ->
+ ok;
+ _ ->
+ ErlOptions = remove_asn_flags(Options),
+ case c:c(OutFile,ErlOptions) of
+ {ok,_Module} ->
+ ok;
+ _ ->
+ {error,'no_compilation'}
+ end
+ end.
+
+remove_asn_flags(Options) ->
+ [X || X <- Options,
+ X /= get_rule(Options),
+ X /= optimize,
+ X /= compact_bit_string,
+ X /= debug,
+ X /= keyed_list].
+
+debug_on(Options) ->
+ case lists:member(debug,Options) of
+ true ->
+ put(asndebug,true);
+ _ ->
+ true
+ end,
+ case lists:member(keyed_list,Options) of
+ true ->
+ put(asn_keyed_list,true);
+ _ ->
+ true
+ end.
+
+
+debug_off(_Options) ->
+ erase(asndebug),
+ erase(asn_keyed_list).
+
+
+outfile(Base, Ext, Opts) when atom(Ext) ->
+ outfile(Base, atom_to_list(Ext), Opts);
+outfile(Base, Ext, Opts) ->
+ Obase = case lists:keysearch(outdir, 1, Opts) of
+ {value, {outdir, Odir}} -> filename:join(Odir, Base);
+ _NotFound -> Base % Not found or bad format
+ end,
+ case Ext of
+ [] ->
+ Obase;
+ _ ->
+ Obase++"."++Ext
+ end.
+
+%% compile(AbsFileName, Options)
+%% Compile entry point for erl_compile.
+
+compile_asn(File,OutFile,Options) ->
+ compile(lists:concat([File,".asn"]),OutFile,Options).
+
+compile_asn1(File,OutFile,Options) ->
+ compile(lists:concat([File,".asn1"]),OutFile,Options).
+
+compile_py(File,OutFile,Options) ->
+ compile(lists:concat([File,".py"]),OutFile,Options).
+
+compile(File, _OutFile, Options) ->
+ case catch compile(File, make_erl_options(Options)) of
+ Exit = {'EXIT',_Reason} ->
+ io:format("~p~n~s~n",[Exit,"error"]),
+ error;
+ {error,_Reason} ->
+ %% case occurs due to error in asn1ct_parser2,asn1ct_check
+%% io:format("~p~n",[_Reason]),
+%% io:format("~p~n~s~n",[_Reason,"error"]),
+ error;
+ ok ->
+ io:format("ok~n"),
+ ok;
+ ParseRes when tuple(ParseRes) ->
+ io:format("~p~n",[ParseRes]),
+ ok;
+ ScanRes when list(ScanRes) ->
+ io:format("~p~n",[ScanRes]),
+ ok;
+ Unknown ->
+ io:format("~p~n~s~n",[Unknown,"error"]),
+ error
+ end.
+
+%% Converts generic compiler options to specific options.
+
+make_erl_options(Opts) ->
+
+ %% This way of extracting will work even if the record passed
+ %% has more fields than known during compilation.
+
+ Includes = Opts#options.includes,
+ Defines = Opts#options.defines,
+ Outdir = Opts#options.outdir,
+%% Warning = Opts#options.warning,
+ Verbose = Opts#options.verbose,
+ Specific = Opts#options.specific,
+ Optimize = Opts#options.optimize,
+ OutputType = Opts#options.output_type,
+ Cwd = Opts#options.cwd,
+
+ Options =
+ case Verbose of
+ true -> [verbose];
+ false -> []
+ end ++
+%%% case Warning of
+%%% 0 -> [];
+%%% _ -> [report_warnings]
+%%% end ++
+ [] ++
+ case Optimize of
+ 1 -> [optimize];
+ 999 -> [];
+ _ -> [{optimize,Optimize}]
+ end ++
+ lists:map(
+ fun ({Name, Value}) ->
+ {d, Name, Value};
+ (Name) ->
+ {d, Name}
+ end,
+ Defines) ++
+ case OutputType of
+ undefined -> [ber]; % temporary default (ber when it's ready)
+ ber -> [ber];
+ ber_bin -> [ber_bin];
+ ber_bin_v2 -> [ber_bin_v2];
+ per -> [per];
+ per_bin -> [per_bin]
+ end,
+
+ Options++[report_errors, {cwd, Cwd}, {outdir, Outdir}|
+ lists:map(fun(Dir) -> {i, Dir} end, Includes)]++Specific.
+
+pretty2(Module,AbsFile) ->
+ start(),
+ {ok,F} = file:open(AbsFile, [write]),
+ M = asn1_db:dbget(Module,'MODULE'),
+ io:format(F,"%%%%%%%%%%%%%%%%%%% ~p %%%%%%%%%%%%%%%%%%%~n",[Module]),
+ io:format(F,"~s\n",[asn1ct_pretty_format:term(M#module.defid)]),
+ io:format(F,"~s\n",[asn1ct_pretty_format:term(M#module.tagdefault)]),
+ io:format(F,"~s\n",[asn1ct_pretty_format:term(M#module.exports)]),
+ io:format(F,"~s\n",[asn1ct_pretty_format:term(M#module.imports)]),
+ io:format(F,"~s\n\n",[asn1ct_pretty_format:term(M#module.extensiondefault)]),
+
+ {Types,Values,ParameterizedTypes,Classes,Objects,ObjectSets} = M#module.typeorval,
+ io:format(F,"%%%%%%%%%%%%%%%%%%% TYPES in ~p %%%%%%%%%%%%%%%%%%%~n",[Module]),
+ lists:foreach(fun(T)-> io:format(F,"~s\n",
+ [asn1ct_pretty_format:term(asn1_db:dbget(Module,T))])
+ end,Types),
+ io:format(F,"%%%%%%%%%%%%%%%%%%% VALUES in ~p %%%%%%%%%%%%%%%%%%%~n",[Module]),
+ lists:foreach(fun(T)-> io:format(F,"~s\n",
+ [asn1ct_pretty_format:term(asn1_db:dbget(Module,T))])
+ end,Values),
+ io:format(F,"%%%%%%%%%%%%%%%%%%% Parameterized Types in ~p %%%%%%%%%%%%%%%%%%%~n",[Module]),
+ lists:foreach(fun(T)-> io:format(F,"~s\n",
+ [asn1ct_pretty_format:term(asn1_db:dbget(Module,T))])
+ end,ParameterizedTypes),
+ io:format(F,"%%%%%%%%%%%%%%%%%%% Classes in ~p %%%%%%%%%%%%%%%%%%%~n",[Module]),
+ lists:foreach(fun(T)-> io:format(F,"~s\n",
+ [asn1ct_pretty_format:term(asn1_db:dbget(Module,T))])
+ end,Classes),
+ io:format(F,"%%%%%%%%%%%%%%%%%%% Objects in ~p %%%%%%%%%%%%%%%%%%%~n",[Module]),
+ lists:foreach(fun(T)-> io:format(F,"~s\n",
+ [asn1ct_pretty_format:term(asn1_db:dbget(Module,T))])
+ end,Objects),
+ io:format(F,"%%%%%%%%%%%%%%%%%%% Object Sets in ~p %%%%%%%%%%%%%%%%%%%~n",[Module]),
+ lists:foreach(fun(T)-> io:format(F,"~s\n",
+ [asn1ct_pretty_format:term(asn1_db:dbget(Module,T))])
+ end,ObjectSets).
+start() ->
+ Includes = ["."],
+ start(Includes).
+
+
+start(Includes) when list(Includes) ->
+ asn1_db:dbstart(Includes).
+
+stop() ->
+ save(),
+ asn1_db:stop_server(ns),
+ asn1_db:stop_server(rand),
+ stopped.
+
+save() ->
+ asn1_db:dbstop().
+
+%%clear() ->
+%% asn1_db:dbclear().
+
+encode(Module,Term) ->
+ asn1rt:encode(Module,Term).
+
+encode(Module,Type,Term) when list(Module) ->
+ asn1rt:encode(list_to_atom(Module),Type,Term);
+encode(Module,Type,Term) ->
+ asn1rt:encode(Module,Type,Term).
+
+decode(Module,Type,Bytes) when list(Module) ->
+ asn1rt:decode(list_to_atom(Module),Type,Bytes);
+decode(Module,Type,Bytes) ->
+ asn1rt:decode(Module,Type,Bytes).
+
+
+test(Module) ->
+ start(),
+ M = asn1_db:dbget(Module,'MODULE'),
+ {Types,_Values,_Ptypes,_Classes,_Objects,_ObjectSets} = M#module.typeorval,
+ test_each(Module,Types).
+
+test_each(Module,[Type | Rest]) ->
+ case test(Module,Type) of
+ {ok,_Result} ->
+ test_each(Module,Rest);
+ Error ->
+ Error
+ end;
+test_each(_,[]) ->
+ ok.
+
+test(Module,Type) ->
+ io:format("~p:~p~n",[Module,Type]),
+ case (catch value(Module,Type)) of
+ {ok,Val} ->
+ %% io:format("asn1ct:test/2: ~w~n",[Val]),
+ test(Module,Type,Val);
+ {'EXIT',Reason} ->
+ {error,{asn1,{value,Reason}}}
+ end.
+
+
+test(Module,Type,Value) ->
+ case catch encode(Module,Type,Value) of
+ {ok,Bytes} ->
+ %% io:format("test 1: ~p~n",[{Bytes}]),
+ M = if
+ list(Module) ->
+ list_to_atom(Module);
+ true ->
+ Module
+ end,
+ NewBytes =
+ case M:encoding_rule() of
+ ber ->
+ lists:flatten(Bytes);
+ ber_bin when binary(Bytes) ->
+ Bytes;
+ ber_bin ->
+ list_to_binary(Bytes);
+ ber_bin_v2 when binary(Bytes) ->
+ Bytes;
+ ber_bin_v2 ->
+ list_to_binary(Bytes);
+ per ->
+ lists:flatten(Bytes);
+ per_bin when binary(Bytes) ->
+ Bytes;
+ per_bin ->
+ list_to_binary(Bytes)
+ end,
+ case decode(Module,Type,NewBytes) of
+ {ok,Value} ->
+ {ok,{Module,Type,Value}};
+ {ok,Res} ->
+ {error,{asn1,{encode_decode_mismatch,
+ {{Module,Type,Value},Res}}}};
+ Error ->
+ {error,{asn1,{{decode,
+ {Module,Type,Value},Error}}}}
+ end;
+ Error ->
+ {error,{asn1,{encode,{{Module,Type,Value},Error}}}}
+ end.
+
+value(Module) ->
+ start(),
+ M = asn1_db:dbget(Module,'MODULE'),
+ {Types,_Values,_Ptypes,_Classes,_Objects,_ObjectSets} = M#module.typeorval,
+ lists:map(fun(A) ->value(Module,A) end,Types).
+
+value(Module,Type) ->
+ start(),
+ case catch asn1ct_value:get_type(Module,Type,no) of
+ {error,Reason} ->
+ {error,Reason};
+ {'EXIT',Reason} ->
+ {error,Reason};
+ Result ->
+ {ok,Result}
+ end.
+
+cmp(Module,InFile) ->
+ Base = filename:basename(InFile),
+ Dir = filename:dirname(InFile),
+ Ext = filename:extension(Base),
+ Finfo = file:read_file_info(InFile),
+ Minfo = file:read_file_info(filename:join(Dir,lists:concat([Module,Ext]))),
+ case Finfo of
+ Minfo ->
+ ok;
+ _ ->
+ io:format("asn1error: Modulename and filename must be equal~n",[]),
+ throw(error)
+ end.
+
+vsn() ->
+ ?vsn.
+
+print_error_message([got,H|T]) when list(H) ->
+ io:format(" got:"),
+ print_listing(H,"and"),
+ print_error_message(T);
+print_error_message([expected,H|T]) when list(H) ->
+ io:format(" expected one of:"),
+ print_listing(H,"or"),
+ print_error_message(T);
+print_error_message([H|T]) ->
+ io:format(" ~p",[H]),
+ print_error_message(T);
+print_error_message([]) ->
+ io:format("~n").
+
+print_listing([H1,H2|[]],AndOr) ->
+ io:format(" ~p ~s ~p",[H1,AndOr,H2]);
+print_listing([H1,H2|T],AndOr) ->
+ io:format(" ~p,",[H1]),
+ print_listing([H2|T],AndOr);
+print_listing([H],_AndOr) ->
+ io:format(" ~p",[H]);
+print_listing([],_) ->
+ ok.
+
+
+%% functions to administer ets tables
+
+%% Always creates a new table
+create_ets_table(Name,Options) when atom(Name) ->
+ case ets:info(Name) of
+ undefined ->
+ ets:new(Name,Options);
+ _ ->
+ ets:delete(Name),
+ ets:new(Name,Options)
+ end.
+
+%% Creates a new ets table only if no table exists
+create_if_no_table(Name,Options) ->
+ case ets:info(Name) of
+ undefined ->
+ %% create a new table
+ create_ets_table(Name,Options);
+ _ -> ok
+ end.
+
+
+delete_tables([Table|Ts]) ->
+ case ets:info(Table) of
+ undefined -> ok;
+ _ -> ets:delete(Table)
+ end,
+ delete_tables(Ts);
+delete_tables([]) ->
+ ok.
+
+
+specialized_decode_prepare(Erule,M,TsAndVs,Options) ->
+% Asn1confMember =
+% fun([{asn1config,File}|_],_) ->
+% {true,File};
+% ([],_) -> false;
+% ([_H|T],Fun) ->
+% Fun(T,Fun)
+% end,
+% case Asn1confMember(Options,Asn1confMember) of
+% {true,File} ->
+ case lists:member(asn1config,Options) of
+ true ->
+ partial_decode_prepare(Erule,M,TsAndVs,Options);
+ _ ->
+ ok
+ end.
+%% Reads the configuration file if it exists and stores information
+%% about partial decode and incomplete decode
+partial_decode_prepare(ber_bin_v2,M,TsAndVs,Options) when tuple(TsAndVs) ->
+ %% read configure file
+% Types = element(1,TsAndVs),
+ CfgList = read_config_file(M#module.name),
+ SelectedDecode = get_config_info(CfgList,partial_decode),
+ ExclusiveDecode = get_config_info(CfgList,exclusive_decode),
+ CommandList =
+ create_partial_decode_gen_info(M#module.name,SelectedDecode),
+% io:format("partial_decode = ~p~n",[CommandList]),
+
+ save_config(partial_decode,CommandList),
+ CommandList2 =
+ create_partial_inc_decode_gen_info(M#module.name,ExclusiveDecode),
+% io:format("partial_incomplete_decode = ~p~n",[CommandList2]),
+ Part_inc_tlv_tags = tag_format(ber_bin_v2,Options,CommandList2),
+% io:format("partial_incomplete_decode: tlv_tags = ~p~n",[Part_inc_tlv_tags]),
+ save_config(partial_incomplete_decode,Part_inc_tlv_tags),
+ save_gen_state(ExclusiveDecode,Part_inc_tlv_tags);
+partial_decode_prepare(_,_,_,_) ->
+ ok.
+
+
+
+%% create_partial_inc_decode_gen_info/2
+%%
+%% Creats a list of tags out of the information in TypeNameList that
+%% tells which value will be incomplete decoded, i.e. each end
+%% component/type in TypeNameList. The significant types/components in
+%% the path from the toptype must be specified in the
+%% TypeNameList. Significant elements are all constructed types that
+%% branches the path to the leaf and the leaf it selfs.
+%%
+%% Returns a list of elements, where an element may be one of
+%% mandatory|[opt,Tag]|[bin,Tag]. mandatory correspond to a mandatory
+%% element that shall be decoded as usual. [opt,Tag] matches an
+%% OPTIONAL or DEFAULT element that shall be decoded as
+%% usual. [bin,Tag] corresponds to an element, mandatory, OPTIONAL or
+%% DEFAULT, that shall be left encoded (incomplete decoded).
+create_partial_inc_decode_gen_info(ModName,{Mod,[{Name,L}|Ls]}) when list(L) ->
+ TopTypeName = partial_inc_dec_toptype(L),
+ [{Name,TopTypeName,
+ create_partial_inc_decode_gen_info1(ModName,TopTypeName,{Mod,L})}|
+ create_partial_inc_decode_gen_info(ModName,{Mod,Ls})];
+create_partial_inc_decode_gen_info(_,{_,[]}) ->
+ [];
+create_partial_inc_decode_gen_info(_,[]) ->
+ [].
+
+create_partial_inc_decode_gen_info1(ModName,TopTypeName,{ModName,
+ [_TopType|Rest]}) ->
+ case asn1_db:dbget(ModName,TopTypeName) of
+ #typedef{typespec=TS} ->
+ TagCommand = get_tag_command(TS,?MANDATORY,mandatory),
+ create_pdec_inc_command(ModName,get_components(TS#type.def),
+ Rest,[TagCommand]);
+ _ ->
+ throw({error,{"wrong type list in asn1 config file",
+ TopTypeName}})
+ end;
+create_partial_inc_decode_gen_info1(M1,_,{M2,_}) when M1 /= M2 ->
+ throw({error,{"wrong module name in asn1 config file",
+ M2}});
+create_partial_inc_decode_gen_info1(_,_,TNL) ->
+ throw({error,{"wrong type list in asn1 config file",
+ TNL}}).
+
+%%
+%% Only when there is a 'ComponentType' the config data C1 may be a
+%% list, where the incomplete decode is branched. So, C1 may be a
+%% list, a "binary tuple", a "parts tuple" or an atom. The second
+%% element of a binary tuple and a parts tuple is an atom.
+create_pdec_inc_command(_ModName,_,[],Acc) ->
+ lists:reverse(Acc);
+create_pdec_inc_command(ModName,{Comps1,Comps2},TNL,Acc)
+ when list(Comps1),list(Comps2) ->
+ create_pdec_inc_command(ModName,Comps1 ++ Comps2,TNL,Acc);
+create_pdec_inc_command(ModN,Clist,[CL|_Rest],Acc) when list(CL) ->
+ create_pdec_inc_command(ModN,Clist,CL,Acc);
+create_pdec_inc_command(ModName,
+ CList=[#'ComponentType'{name=Name,typespec=TS,
+ prop=Prop}|Comps],
+ TNL=[C1|Cs],Acc) ->
+ case C1 of
+% Name ->
+% %% In this case C1 is an atom
+% TagCommand = get_tag_command(TS,?MANDATORY,Prop),
+% create_pdec_inc_command(ModName,get_components(TS#type.def),Cs,[TagCommand|Acc]);
+ {Name,undecoded} ->
+ TagCommand = get_tag_command(TS,?UNDECODED,Prop),
+ create_pdec_inc_command(ModName,Comps,Cs,[TagCommand|Acc]);
+ {Name,parts} ->
+ TagCommand = get_tag_command(TS,?PARTS,Prop),
+ create_pdec_inc_command(ModName,Comps,Cs,[TagCommand|Acc]);
+ L when list(L) ->
+ %% This case is only possible as the first element after
+ %% the top type element, when top type is SEGUENCE or SET.
+ %% Follow each element in L. Must note every tag on the
+ %% way until the last command is reached, but it ought to
+ %% be enough to have a "complete" or "complete optional"
+ %% command for each component that is not specified in the
+ %% config file. Then in the TLV decode the components with
+ %% a "complete" command will be decoded by an ordinary TLV
+ %% decode.
+ create_pdec_inc_command(ModName,CList,L,Acc);
+ {Name,RestPartsList} when list(RestPartsList) ->
+ %% Same as previous, but this may occur at any place in
+ %% the structure. The previous is only possible as the
+ %% second element.
+ case get_tag_command(TS,?MANDATORY,Prop) of
+ ?MANDATORY ->
+ InnerDirectives=
+ create_pdec_inc_command(ModName,TS#type.def,
+ RestPartsList,[]),
+ create_pdec_inc_command(ModName,Comps,Cs,
+ [[?MANDATORY,InnerDirectives]|Acc]);
+% create_pdec_inc_command(ModName,Comps,Cs,
+% [InnerDirectives,?MANDATORY|Acc]);
+ [Opt,EncTag] ->
+ InnerDirectives =
+ create_pdec_inc_command(ModName,TS#type.def,
+ RestPartsList,[]),
+ create_pdec_inc_command(ModName,Comps,Cs,
+ [[Opt,EncTag,InnerDirectives]|Acc])
+ end;
+% create_pdec_inc_command(ModName,CList,RestPartsList,Acc);
+%% create_pdec_inc_command(ModName,TS#type.def,RestPartsList,Acc);
+ _ -> %% this component may not be in the config list
+ TagCommand = get_tag_command(TS,?MANDATORY,Prop),
+ create_pdec_inc_command(ModName,Comps,TNL,[TagCommand|Acc])
+ end;
+create_pdec_inc_command(ModName,
+ {'CHOICE',[#'ComponentType'{name=C1,
+ typespec=TS,
+ prop=Prop}|Comps]},
+ [{C1,Directive}|Rest],Acc) ->
+ case Directive of
+ List when list(List) ->
+ [Command,Tag] = get_tag_command(TS,?ALTERNATIVE,Prop),
+ CompAcc = create_pdec_inc_command(ModName,TS#type.def,List,[]),
+ create_pdec_inc_command(ModName,{'CHOICE',Comps},Rest,
+ [[Command,Tag,CompAcc]|Acc]);
+ undecoded ->
+ TagCommand = get_tag_command(TS,?ALTERNATIVE_UNDECODED,Prop),
+ create_pdec_inc_command(ModName,{'CHOICE',Comps},Rest,
+ [TagCommand|Acc]);
+ parts ->
+ TagCommand = get_tag_command(TS,?ALTERNATIVE_PARTS,Prop),
+ create_pdec_inc_command(ModName,{'CHOICE',Comps},Rest,
+ [TagCommand|Acc])
+ end;
+create_pdec_inc_command(ModName,
+ {'CHOICE',[#'ComponentType'{typespec=TS,
+ prop=Prop}|Comps]},
+ TNL,Acc) ->
+ TagCommand = get_tag_command(TS,?ALTERNATIVE,Prop),
+ create_pdec_inc_command(ModName,{'CHOICE',Comps},TNL,[TagCommand|Acc]);
+create_pdec_inc_command(M,{'CHOICE',{Cs1,Cs2}},TNL,Acc)
+ when list(Cs1),list(Cs2) ->
+ create_pdec_inc_command(M,{'CHOICE',Cs1 ++ Cs2},TNL,Acc);
+create_pdec_inc_command(ModName,#'Externaltypereference'{module=M,type=Name},
+ TNL,Acc) ->
+ #type{def=Def} = get_referenced_type(M,Name),
+ create_pdec_inc_command(ModName,get_components(Def),TNL,Acc);
+create_pdec_inc_command(_,_,TNL,_) ->
+ throw({error,{"unexpected error when creating partial "
+ "decode command",TNL}}).
+
+partial_inc_dec_toptype([T|_]) when atom(T) ->
+ T;
+partial_inc_dec_toptype([{T,_}|_]) when atom(T) ->
+ T;
+partial_inc_dec_toptype([L|_]) when list(L) ->
+ partial_inc_dec_toptype(L);
+partial_inc_dec_toptype(_) ->
+ throw({error,{"no top type found for partial incomplete decode"}}).
+
+
+%% Creats a list of tags out of the information in TypeList and Types
+%% that tells which value will be decoded. Each constructed type that
+%% is in the TypeList will get a "choosen" command. Only the last
+%% type/component in the TypeList may be a primitive type. Components
+%% "on the way" to the final element may get the "skip" or the
+%% "skip_optional" command.
+%% CommandList = [Elements]
+%% Elements = {choosen,Tag}|{skip_optional,Tag}|skip
+%% Tag is a binary with the tag BER encoded.
+create_partial_decode_gen_info(ModName,{{_,ModName},TypeList}) ->
+ case TypeList of
+ [TopType|Rest] ->
+ case asn1_db:dbget(ModName,TopType) of
+ #typedef{typespec=TS} ->
+ TagCommand = get_tag_command(TS,?CHOOSEN),
+ create_pdec_command(ModName,get_components(TS#type.def),
+ Rest,[TagCommand]);
+ _ ->
+ throw({error,{"wrong type list in asn1 config file",
+ TypeList}})
+ end;
+ _ ->
+ []
+ end;
+create_partial_decode_gen_info(_,[]) ->
+ [];
+create_partial_decode_gen_info(_M1,{{_,M2},_}) ->
+ throw({error,{"wrong module name in asn1 config file",
+ M2}}).
+
+%% create_pdec_command/4 for each name (type or component) in the
+%% third argument, TypeNameList, a command is created. The command has
+%% information whether the component/type shall be skipped, looked
+%% into or returned. The list of commands is returned.
+create_pdec_command(_ModName,_,[],Acc) ->
+ lists:reverse(Acc);
+create_pdec_command(ModName,[#'ComponentType'{name=C1,typespec=TS}|_Comps],
+ [C1|Cs],Acc) ->
+ %% this component is a constructed type or the last in the
+ %% TypeNameList otherwise the config spec is wrong
+ TagCommand = get_tag_command(TS,?CHOOSEN),
+ create_pdec_command(ModName,get_components(TS#type.def),
+ Cs,[TagCommand|Acc]);
+create_pdec_command(ModName,[#'ComponentType'{typespec=TS,
+ prop=Prop}|Comps],
+ [C2|Cs],Acc) ->
+ TagCommand =
+ case Prop of
+ mandatory ->
+ get_tag_command(TS,?SKIP);
+ _ ->
+ get_tag_command(TS,?SKIP_OPTIONAL)
+ end,
+ create_pdec_command(ModName,Comps,[C2|Cs],[TagCommand|Acc]);
+create_pdec_command(ModName,{'CHOICE',[Comp=#'ComponentType'{name=C1}|_]},TNL=[C1|_Cs],Acc) ->
+ create_pdec_command(ModName,[Comp],TNL,Acc);
+create_pdec_command(ModName,{'CHOICE',[#'ComponentType'{}|Comps]},TNL,Acc) ->
+ create_pdec_command(ModName,{'CHOICE',Comps},TNL,Acc);
+create_pdec_command(ModName,#'Externaltypereference'{module=M,type=C1},
+ TypeNameList,Acc) ->
+ case get_referenced_type(M,C1) of
+ #type{def=Def} ->
+ create_pdec_command(ModName,get_components(Def),TypeNameList,
+ Acc);
+ Err ->
+ throw({error,{"unexpected result when fetching "
+ "referenced element",Err}})
+ end;
+create_pdec_command(ModName,TS=#type{def=Def},[C1|Cs],Acc) ->
+ %% This case when we got the "components" of a SEQUENCE/SET OF
+ case C1 of
+ [1] ->
+ %% A list with an integer is the only valid option in a 'S
+ %% OF', the other valid option would be an empty
+ %% TypeNameList saying that the entire 'S OF' will be
+ %% decoded.
+ TagCommand = get_tag_command(TS,?CHOOSEN),
+ create_pdec_command(ModName,Def,Cs,[TagCommand|Acc]);
+ [N] when integer(N) ->
+ TagCommand = get_tag_command(TS,?SKIP),
+ create_pdec_command(ModName,Def,[[N-1]|Cs],[TagCommand|Acc]);
+ Err ->
+ throw({error,{"unexpected error when creating partial "
+ "decode command",Err}})
+ end;
+create_pdec_command(_,_,TNL,_) ->
+ throw({error,{"unexpected error when creating partial "
+ "decode command",TNL}}).
+
+% get_components({'CHOICE',Components}) ->
+% Components;
+get_components(#'SEQUENCE'{components=Components}) ->
+ Components;
+get_components(#'SET'{components=Components}) ->
+ Components;
+get_components({'SEQUENCE OF',Components}) ->
+ Components;
+get_components({'SET OF',Components}) ->
+ Components;
+get_components(Def) ->
+ Def.
+
+%% get_tag_command(Type,Command)
+
+%% Type is the type that has information about the tag Command tells
+%% what to do with the encoded value with the tag of Type when
+%% decoding.
+get_tag_command(#type{tag=[]},_) ->
+ [];
+get_tag_command(#type{tag=[_Tag]},?SKIP) ->
+ ?SKIP;
+get_tag_command(#type{tag=[Tag]},Command) ->
+ %% encode the tag according to BER
+ [Command,encode_tag_val(decode_class(Tag#tag.class),Tag#tag.form,
+ Tag#tag.number)];
+get_tag_command(T=#type{tag=[Tag|Tags]},Command) ->
+ [get_tag_command(T#type{tag=Tag},Command)|
+ get_tag_command(T#type{tag=Tags},Command)].
+
+%% get_tag_command/3 used by create_pdec_inc_command
+get_tag_command(#type{tag=[]},_,_) ->
+ [];
+get_tag_command(#type{tag=[Tag]},?MANDATORY,Prop) ->
+ case Prop of
+ mandatory ->
+ ?MANDATORY;
+ {'DEFAULT',_} ->
+ [?DEFAULT,encode_tag_val(decode_class(Tag#tag.class),
+ Tag#tag.form,Tag#tag.number)];
+ _ -> [?OPTIONAL,encode_tag_val(decode_class(Tag#tag.class),
+ Tag#tag.form,Tag#tag.number)]
+ end;
+get_tag_command(#type{tag=[Tag]},Command,_) ->
+ [Command,encode_tag_val(decode_class(Tag#tag.class),Tag#tag.form,
+ Tag#tag.number)].
+
+
+get_referenced_type(M,Name) ->
+ case asn1_db:dbget(M,Name) of
+ #typedef{typespec=TS} ->
+ case TS of
+ #type{def=#'Externaltypereference'{module=M2,type=Name2}} ->
+ %% The tags have already been taken care of in the
+ %% first reference where they were gathered in a
+ %% list of tags.
+ get_referenced_type(M2,Name2);
+ #type{} -> TS;
+ _ ->
+ throw({error,{"unexpected element when"
+ " fetching referenced type",TS}})
+ end;
+ T ->
+ throw({error,{"unexpected element when fetching "
+ "referenced type",T}})
+ end.
+
+tag_format(EncRule,_Options,CommandList) ->
+ case EncRule of
+ ber_bin_v2 ->
+ tlv_tags(CommandList);
+ _ ->
+ CommandList
+ end.
+
+tlv_tags([]) ->
+ [];
+tlv_tags([mandatory|Rest]) ->
+ [mandatory|tlv_tags(Rest)];
+tlv_tags([[Command,Tag]|Rest]) when atom(Command),binary(Tag) ->
+ [[Command,tlv_tag(Tag)]|tlv_tags(Rest)];
+tlv_tags([[Command,Directives]|Rest]) when atom(Command),list(Directives) ->
+ [[Command,tlv_tags(Directives)]|tlv_tags(Rest)];
+%% remove all empty lists
+tlv_tags([[]|Rest]) ->
+ tlv_tags(Rest);
+tlv_tags([{Name,TopType,L1}|Rest]) when list(L1),atom(TopType) ->
+ [{Name,TopType,tlv_tags(L1)}|tlv_tags(Rest)];
+tlv_tags([[Command,Tag,L1]|Rest]) when list(L1),binary(Tag) ->
+ [[Command,tlv_tag(Tag),tlv_tags(L1)]|tlv_tags(Rest)];
+tlv_tags([L=[L1|_]|Rest]) when list(L1) ->
+ [tlv_tags(L)|tlv_tags(Rest)].
+
+tlv_tag(<<Cl:2,_:1,TagNo:5>>) when TagNo < 31 ->
+ (Cl bsl 16) + TagNo;
+tlv_tag(<<Cl:2,_:1,31:5,0:1,TagNo:7>>) ->
+ (Cl bsl 16) + TagNo;
+tlv_tag(<<Cl:2,_:1,31:5,Buffer/binary>>) ->
+ TagNo = tlv_tag1(Buffer,0),
+ (Cl bsl 16) + TagNo.
+tlv_tag1(<<0:1,PartialTag:7>>,Acc) ->
+ (Acc bsl 7) bor PartialTag;
+tlv_tag1(<<1:1,PartialTag:7,Buffer/binary>>,Acc) ->
+ tlv_tag1(Buffer,(Acc bsl 7) bor PartialTag).
+
+%% reads the content from the configuration file and returns the
+%% selected part choosen by InfoType. Assumes that the config file
+%% content is an Erlang term.
+read_config_file(ModuleName,InfoType) when atom(InfoType) ->
+ CfgList = read_config_file(ModuleName),
+ get_config_info(CfgList,InfoType).
+
+
+read_config_file(ModuleName) ->
+ case file:consult(lists:concat([ModuleName,'.asn1config'])) of
+% case file:consult(ModuleName) of
+ {ok,CfgList} ->
+ CfgList;
+ {error,enoent} ->
+ Options = get(encoding_options),
+ Includes = [I || {i,I} <- Options],
+ read_config_file1(ModuleName,Includes);
+ {error,Reason} ->
+ file:format_error(Reason),
+ throw({error,{"error reading asn1 config file",Reason}})
+ end.
+read_config_file1(ModuleName,[]) ->
+ case filename:extension(ModuleName) of
+ ".asn1config" ->
+ throw({error,enoent});
+ _ ->
+ read_config_file(lists:concat([ModuleName,".asn1config"]))
+ end;
+read_config_file1(ModuleName,[H|T]) ->
+% File = filename:join([H,lists:concat([ModuleName,'.asn1config'])]),
+ File = filename:join([H,ModuleName]),
+ case file:consult(File) of
+ {ok,CfgList} ->
+ CfgList;
+ {error,enoent} ->
+ read_config_file1(ModuleName,T);
+ {error,Reason} ->
+ file:format_error(Reason),
+ throw({error,{"error reading asn1 config file",Reason}})
+ end.
+
+get_config_info(CfgList,InfoType) ->
+ case InfoType of
+ all ->
+ CfgList;
+ _ ->
+ case lists:keysearch(InfoType,1,CfgList) of
+ {value,{InfoType,Value}} ->
+ Value;
+ false ->
+ []
+ end
+ end.
+
+%% save_config/2 saves the Info with the key Key
+%% Before saving anything check if a table exists
+save_config(Key,Info) ->
+ create_if_no_table(asn1_general,[named_table]),
+ ets:insert(asn1_general,{{asn1_config,Key},Info}).
+
+read_config_data(Key) ->
+ case ets:info(asn1_general) of
+ undefined -> undefined;
+ _ ->
+ case ets:lookup(asn1_general,{asn1_config,Key}) of
+ [{_,Data}] -> Data;
+ Err ->
+ io:format("strange data from config file ~w~n",[Err]),
+ Err
+ end
+ end.
+
+
+%%
+%% Functions to manipulate the gen_state record saved in the
+%% asn1_general ets table.
+%%
+
+%% saves input data in a new gen_state record
+save_gen_state({_,ConfList},PartIncTlvTagList) ->
+ %ConfList=[{FunctionName,PatternList}|Rest]
+ StateRec = #gen_state{inc_tag_pattern=PartIncTlvTagList,
+ inc_type_pattern=ConfList},
+ save_config(gen_state,StateRec);
+save_gen_state(_,_) ->
+%% ok.
+ save_config(gen_state,#gen_state{}).
+
+save_gen_state(GenState) when record(GenState,gen_state) ->
+ save_config(gen_state,GenState).
+
+
+%% get_gen_state_field returns undefined if no gen_state exists or if
+%% Field is undefined or the data at the field.
+get_gen_state_field(Field) ->
+ case read_config_data(gen_state) of
+ undefined ->
+ undefined;
+ GenState ->
+ get_gen_state_field(GenState,Field)
+ end.
+get_gen_state_field(#gen_state{active=Active},active) ->
+ Active;
+get_gen_state_field(_,active) ->
+ false;
+get_gen_state_field(GS,prefix) ->
+ GS#gen_state.prefix;
+get_gen_state_field(GS,inc_tag_pattern) ->
+ GS#gen_state.inc_tag_pattern;
+get_gen_state_field(GS,tag_pattern) ->
+ GS#gen_state.tag_pattern;
+get_gen_state_field(GS,inc_type_pattern) ->
+ GS#gen_state.inc_type_pattern;
+get_gen_state_field(GS,type_pattern) ->
+ GS#gen_state.type_pattern;
+get_gen_state_field(GS,func_name) ->
+ GS#gen_state.func_name;
+get_gen_state_field(GS,namelist) ->
+ GS#gen_state.namelist;
+get_gen_state_field(GS,tobe_refed_funcs) ->
+ GS#gen_state.tobe_refed_funcs;
+get_gen_state_field(GS,gen_refed_funcs) ->
+ GS#gen_state.gen_refed_funcs.
+
+
+get_gen_state() ->
+ read_config_data(gen_state).
+
+
+update_gen_state(Field,Data) ->
+ case get_gen_state() of
+ State when record(State,gen_state) ->
+ update_gen_state(Field,State,Data);
+ _ ->
+ exit({error,{asn1,{internal,
+ "tried to update nonexistent gen_state",Field,Data}}})
+ end.
+update_gen_state(active,State,Data) ->
+ save_gen_state(State#gen_state{active=Data});
+update_gen_state(prefix,State,Data) ->
+ save_gen_state(State#gen_state{prefix=Data});
+update_gen_state(inc_tag_pattern,State,Data) ->
+ save_gen_state(State#gen_state{inc_tag_pattern=Data});
+update_gen_state(tag_pattern,State,Data) ->
+ save_gen_state(State#gen_state{tag_pattern=Data});
+update_gen_state(inc_type_pattern,State,Data) ->
+ save_gen_state(State#gen_state{inc_type_pattern=Data});
+update_gen_state(type_pattern,State,Data) ->
+ save_gen_state(State#gen_state{type_pattern=Data});
+update_gen_state(func_name,State,Data) ->
+ save_gen_state(State#gen_state{func_name=Data});
+update_gen_state(namelist,State,Data) ->
+% SData =
+% case Data of
+% [D] when list(D) -> D;
+% _ -> Data
+% end,
+ save_gen_state(State#gen_state{namelist=Data});
+update_gen_state(tobe_refed_funcs,State,Data) ->
+ save_gen_state(State#gen_state{tobe_refed_funcs=Data});
+update_gen_state(gen_refed_funcs,State,Data) ->
+ save_gen_state(State#gen_state{gen_refed_funcs=Data}).
+
+update_namelist(Name) ->
+ case get_gen_state_field(namelist) of
+ [Name,Rest] -> update_gen_state(namelist,Rest);
+ [Name|Rest] -> update_gen_state(namelist,Rest);
+ [{Name,List}] when list(List) -> update_gen_state(namelist,List);
+ [{Name,Atom}|Rest] when atom(Atom) -> update_gen_state(namelist,Rest);
+ Other -> Other
+ end.
+
+pop_namelist() ->
+ DeepTail = %% removes next element in order
+ fun([[{_,A}]|T],_Fun) when atom(A) -> T;
+ ([{_N,L}|T],_Fun) when list(L) -> [L|T];
+ ([[]|T],Fun) -> Fun(T,Fun);
+ ([L1|L2],Fun) when list(L1) ->
+ case lists:flatten(L1) of
+ [] -> Fun([L2],Fun);
+ _ -> [Fun(L1,Fun)|L2]
+ end;
+ ([_H|T],_Fun) -> T
+ end,
+ {Pop,NewNL} =
+ case get_gen_state_field(namelist) of
+ [] -> {[],[]};
+ L ->
+ {next_namelist_el(L),
+ DeepTail(L,DeepTail)}
+ end,
+ update_gen_state(namelist,NewNL),
+ Pop.
+
+%% next_namelist_el fetches the next type/component name in turn in
+%% the namelist, without changing the namelist.
+next_namelist_el() ->
+ case get_gen_state_field(namelist) of
+ undefined -> undefined;
+ L when list(L) -> next_namelist_el(L)
+ end.
+
+next_namelist_el([]) ->
+ [];
+next_namelist_el([L]) when list(L) ->
+ next_namelist_el(L);
+next_namelist_el([H|_]) when atom(H) ->
+ H;
+next_namelist_el([L|T]) when list(L) ->
+ case next_namelist_el(L) of
+ [] ->
+ next_namelist_el([T]);
+ R ->
+ R
+ end;
+next_namelist_el([H={_,A}|_]) when atom(A) ->
+ H.
+
+%% removes a bracket from the namelist
+step_in_constructed() ->
+ case get_gen_state_field(namelist) of
+ [L] when list(L) ->
+ update_gen_state(namelist,L);
+ _ -> ok
+ end.
+
+is_function_generated(Name) ->
+ case get_gen_state_field(gen_refed_funcs) of
+ L when list(L) ->
+ lists:member(Name,L);
+ _ ->
+ false
+ end.
+
+get_tobe_refed_func(Name) ->
+ case get_gen_state_field(tobe_refed_funcs) of
+ L when list(L) ->
+ case lists:keysearch(Name,1,L) of
+ {_,Element} ->
+ Element;
+ _ ->
+ undefined
+ end;
+ _ ->
+ undefined
+ end.
+
+add_tobe_refed_func(Data) ->
+ L = get_gen_state_field(tobe_refed_funcs),
+ update_gen_state(tobe_refed_funcs,[Data|L]).
+
+%% moves Name from the to be list to the generated list.
+generated_refed_func(Name) ->
+ L = get_gen_state_field(tobe_refed_funcs),
+ NewL = lists:keydelete(Name,1,L),
+ update_gen_state(tobe_refed_funcs,NewL),
+ L2 = get_gen_state_field(gen_refed_funcs),
+ update_gen_state(gen_refed_funcs,[Name|L2]).
+
+add_generated_refed_func(Data) ->
+ L = get_gen_state_field(gen_refed_funcs),
+ update_gen_state(gen_refed_funcs,[Data|L]).
+
+
+next_refed_func() ->
+ case get_gen_state_field(tobe_refed_funcs) of
+ [] ->
+ [];
+ [H|T] ->
+ update_gen_state(tobe_refed_funcs,T),
+ H
+ end.
+
+reset_gen_state() ->
+ save_gen_state(#gen_state{}).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_check.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_check.erl
new file mode 100644
index 0000000000..2f0ada122e
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_check.erl
@@ -0,0 +1,5566 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1ct_check.erl,v 1.1 2008/12/17 09:53:29 mikpe Exp $
+%%
+-module(asn1ct_check).
+
+%% Main Module for ASN.1 compile time functions
+
+%-compile(export_all).
+-export([check/2,storeindb/1]).
+-include("asn1_records.hrl").
+%%% The tag-number for universal types
+-define(N_BOOLEAN, 1).
+-define(N_INTEGER, 2).
+-define(N_BIT_STRING, 3).
+-define(N_OCTET_STRING, 4).
+-define(N_NULL, 5).
+-define(N_OBJECT_IDENTIFIER, 6).
+-define(N_OBJECT_DESCRIPTOR, 7).
+-define(N_EXTERNAL, 8). % constructed
+-define(N_INSTANCE_OF,8).
+-define(N_REAL, 9).
+-define(N_ENUMERATED, 10).
+-define(N_EMBEDDED_PDV, 11). % constructed
+-define(N_SEQUENCE, 16).
+-define(N_SET, 17).
+-define(N_NumericString, 18).
+-define(N_PrintableString, 19).
+-define(N_TeletexString, 20).
+-define(N_VideotexString, 21).
+-define(N_IA5String, 22).
+-define(N_UTCTime, 23).
+-define(N_GeneralizedTime, 24).
+-define(N_GraphicString, 25).
+-define(N_VisibleString, 26).
+-define(N_GeneralString, 27).
+-define(N_UniversalString, 28).
+-define(N_CHARACTER_STRING, 29). % constructed
+-define(N_BMPString, 30).
+
+-define(TAG_PRIMITIVE(Num),
+ case S#state.erule of
+ ber_bin_v2 ->
+ #tag{class='UNIVERSAL',number=Num,type='IMPLICIT',form=0};
+ _ -> []
+ end).
+-define(TAG_CONSTRUCTED(Num),
+ case S#state.erule of
+ ber_bin_v2 ->
+ #tag{class='UNIVERSAL',number=Num,type='IMPLICIT',form=32};
+ _ -> []
+ end).
+
+-record(newt,{type=unchanged,tag=unchanged,constraint=unchanged,inlined=no}). % used in check_type to update type and tag
+-record(newv,{type=unchanged,value=unchanged}). % used in check_value to update type and value
+
+check(S,{Types,Values,ParameterizedTypes,Classes,Objects,ObjectSets}) ->
+ %%Predicates used to filter errors
+ TupleIs = fun({T,_},T) -> true;
+ (_,_) -> false
+ end,
+ IsClass = fun(X) -> TupleIs(X,asn1_class) end,
+ IsObjSet = fun(X) -> TupleIs(X,objectsetdef) end,
+ IsPObjSet = fun(X) -> TupleIs(X,pobjectsetdef) end,
+ IsObject = fun(X) -> TupleIs(X,objectdef) end,
+ IsValueSet = fun(X) -> TupleIs(X,valueset) end,
+ Element2 = fun(X) -> element(2,X) end,
+
+ _Perror = checkp(S,ParameterizedTypes,[]), % must do this before the templates are used
+ Terror = checkt(S,Types,[]),
+
+ %% get parameterized object sets sent to checkt/3
+ %% and update Terror
+
+ {PObjSetNames1,Terror2} = filter_errors(IsPObjSet,Terror),
+
+ Verror = checkv(S,Values ++ ObjectSets,[]), %value sets may be parsed as object sets
+
+ %% get information object classes wrongly sent to checkt/3
+ %% and update Terror2
+
+ {AddClasses,Terror3} = filter_errors(IsClass,Terror2),
+
+ NewClasses = Classes++AddClasses,
+
+ Cerror = checkc(S,NewClasses,[]),
+
+ %% get object sets incorrectly sent to checkv/3
+ %% and update Verror
+
+ {ObjSetNames,Verror2} = filter_errors(IsObjSet,Verror),
+
+ %% get parameterized object sets incorrectly sent to checkv/3
+ %% and update Verror2
+
+ {PObjSetNames,Verror3} = filter_errors(IsPObjSet,Verror2),
+
+ %% get objects incorrectly sent to checkv/3
+ %% and update Verror3
+
+ {ObjectNames,Verror4} = filter_errors(IsObject,Verror3),
+
+ NewObjects = Objects++ObjectNames,
+ NewObjectSets = ObjSetNames ++ PObjSetNames ++ PObjSetNames1,
+
+ %% get value sets
+ %% and update Verror4
+
+ {ValueSetNames,Verror5} = filter_errors(IsValueSet,Verror4),
+
+ asn1ct:create_ets_table(inlined_objects,[named_table]),
+ {Oerror,ExclO,ExclOS} = checko(S,NewObjects ++
+ NewObjectSets,
+ [],[],[]),
+ InlinedObjTuples = ets:tab2list(inlined_objects),
+ InlinedObjects = lists:map(Element2,InlinedObjTuples),
+ ets:delete(inlined_objects),
+
+ Exporterror = check_exports(S,S#state.module),
+ case {Terror3,Verror5,Cerror,Oerror,Exporterror} of
+ {[],[],[],[],[]} ->
+ ContextSwitchTs = context_switch_in_spec(),
+ InstanceOf = instance_of_in_spec(),
+ NewTypes = lists:subtract(Types,AddClasses) ++ ContextSwitchTs
+ ++ InstanceOf,
+ NewValues = lists:subtract(Values,PObjSetNames++ObjectNames++
+ ValueSetNames),
+ {ok,
+ {NewTypes,NewValues,ParameterizedTypes,
+ NewClasses,NewObjects,NewObjectSets},
+ {NewTypes,NewValues,ParameterizedTypes,NewClasses,
+ lists:subtract(NewObjects,ExclO)++InlinedObjects,
+ lists:subtract(NewObjectSets,ExclOS)}};
+ _ ->{error,{asn1,lists:flatten([Terror3,Verror5,Cerror,
+ Oerror,Exporterror])}}
+ end.
+
+context_switch_in_spec() ->
+ L = [{external,'EXTERNAL'},
+ {embedded_pdv,'EMBEDDED PDV'},
+ {character_string,'CHARACTER STRING'}],
+ F = fun({T,TName},Acc) ->
+ case get(T) of
+ generate -> erase(T),
+ [TName|Acc];
+ _ -> Acc
+ end
+ end,
+ lists:foldl(F,[],L).
+
+instance_of_in_spec() ->
+ case get(instance_of) of
+ generate ->
+ erase(instance_of),
+ ['INSTANCE OF'];
+ _ ->
+ []
+ end.
+
+filter_errors(Pred,ErrorList) ->
+ Element2 = fun(X) -> element(2,X) end,
+ RemovedTupleElements = lists:filter(Pred,ErrorList),
+ RemovedNames = lists:map(Element2,RemovedTupleElements),
+ %% remove value set name tuples from Verror
+ RestErrors = lists:subtract(ErrorList,RemovedTupleElements),
+ {RemovedNames,RestErrors}.
+
+
+check_exports(S,Module = #module{}) ->
+ case Module#module.exports of
+ {exports,[]} ->
+ [];
+ {exports,all} ->
+ [];
+ {exports,ExportList} when list(ExportList) ->
+ IsNotDefined =
+ fun(X) ->
+ case catch get_referenced_type(S,X) of
+ {error,{asn1,_}} ->
+ true;
+ _ -> false
+ end
+ end,
+ case lists:filter(IsNotDefined,ExportList) of
+ [] ->
+ [];
+ NoDefExp ->
+ GetName =
+ fun(T = #'Externaltypereference'{type=N})->
+ %%{exported,undefined,entity,N}
+ NewS=S#state{type=T,tname=N},
+ error({export,"exported undefined entity",NewS})
+ end,
+ lists:map(GetName,NoDefExp)
+ end
+ end.
+
+checkt(S,[Name|T],Acc) ->
+ %%io:format("check_typedef:~p~n",[Name]),
+ Result =
+ case asn1_db:dbget(S#state.mname,Name) of
+ undefined ->
+ error({type,{internal_error,'???'},S});
+ Type when record(Type,typedef) ->
+ NewS = S#state{type=Type,tname=Name},
+ case catch(check_type(NewS,Type,Type#typedef.typespec)) of
+ {error,Reason} ->
+ error({type,Reason,NewS});
+ {'EXIT',Reason} ->
+ error({type,{internal_error,Reason},NewS});
+ {asn1_class,_ClassDef} ->
+ {asn1_class,Name};
+ pobjectsetdef ->
+ {pobjectsetdef,Name};
+ pvalueset ->
+ {pvalueset,Name};
+ Ts ->
+ case Type#typedef.checked of
+ true -> % already checked and updated
+ ok;
+ _ ->
+ NewTypeDef = Type#typedef{checked=true,typespec = Ts},
+ %io:format("checkt:dbput:~p, ~p~n",[S#state.mname,NewTypeDef#typedef.name]),
+ asn1_db:dbput(NewS#state.mname,Name,NewTypeDef), % update the type
+ ok
+ end
+ end
+ end,
+ case Result of
+ ok ->
+ checkt(S,T,Acc);
+ _ ->
+ checkt(S,T,[Result|Acc])
+ end;
+checkt(S,[],Acc) ->
+ case check_contextswitchingtypes(S,[]) of
+ [] ->
+ lists:reverse(Acc);
+ L ->
+ checkt(S,L,Acc)
+ end.
+
+check_contextswitchingtypes(S,Acc) ->
+ CSTList=[{external,'EXTERNAL'},
+ {embedded_pdv,'EMBEDDED PDV'},
+ {character_string,'CHARACTER STRING'}],
+ check_contextswitchingtypes(S,CSTList,Acc).
+
+check_contextswitchingtypes(S,[{T,TName}|Ts],Acc) ->
+ case get(T) of
+ unchecked ->
+ put(T,generate),
+ check_contextswitchingtypes(S,Ts,[TName|Acc]);
+ _ ->
+ check_contextswitchingtypes(S,Ts,Acc)
+ end;
+check_contextswitchingtypes(_,[],Acc) ->
+ Acc.
+
+checkv(S,[Name|T],Acc) ->
+ %%io:format("check_valuedef:~p~n",[Name]),
+ Result = case asn1_db:dbget(S#state.mname,Name) of
+ undefined -> error({value,{internal_error,'???'},S});
+ Value when record(Value,valuedef);
+ record(Value,typedef); %Value set may be parsed as object set.
+ record(Value,pvaluedef);
+ record(Value,pvaluesetdef) ->
+ NewS = S#state{value=Value},
+ case catch(check_value(NewS,Value)) of
+ {error,Reason} ->
+ error({value,Reason,NewS});
+ {'EXIT',Reason} ->
+ error({value,{internal_error,Reason},NewS});
+ {pobjectsetdef} ->
+ {pobjectsetdef,Name};
+ {objectsetdef} ->
+ {objectsetdef,Name};
+ {objectdef} ->
+ %% this is an object, save as typedef
+ #valuedef{checked=C,pos=Pos,name=N,type=Type,
+ value=Def}=Value,
+% Currmod = S#state.mname,
+% #type{def=
+% #'Externaltypereference'{module=Mod,
+% type=CName}} = Type,
+ ClassName =
+ Type#type.def,
+% case Mod of
+% Currmod ->
+% {objectclassname,CName};
+% _ ->
+% {objectclassname,Mod,CName}
+% end,
+ NewSpec = #'Object'{classname=ClassName,
+ def=Def},
+ NewDef = #typedef{checked=C,pos=Pos,name=N,
+ typespec=NewSpec},
+ asn1_db:dbput(NewS#state.mname,Name,NewDef),
+ {objectdef,Name};
+ {valueset,VSet} ->
+ Pos = asn1ct:get_pos_of_def(Value),
+ CheckedVSDef = #typedef{checked=true,pos=Pos,
+ name=Name,typespec=VSet},
+ asn1_db:dbput(NewS#state.mname,Name,CheckedVSDef),
+ {valueset,Name};
+ V ->
+ %% update the valuedef
+ asn1_db:dbput(NewS#state.mname,Name,V),
+ ok
+ end
+ end,
+ case Result of
+ ok ->
+ checkv(S,T,Acc);
+ _ ->
+ checkv(S,T,[Result|Acc])
+ end;
+checkv(_S,[],Acc) ->
+ lists:reverse(Acc).
+
+
+checkp(S,[Name|T],Acc) ->
+ %io:format("check_ptypedef:~p~n",[Name]),
+ Result = case asn1_db:dbget(S#state.mname,Name) of
+ undefined ->
+ error({type,{internal_error,'???'},S});
+ Type when record(Type,ptypedef) ->
+ NewS = S#state{type=Type,tname=Name},
+ case catch(check_ptype(NewS,Type,Type#ptypedef.typespec)) of
+ {error,Reason} ->
+ error({type,Reason,NewS});
+ {'EXIT',Reason} ->
+ error({type,{internal_error,Reason},NewS});
+ {asn1_class,_ClassDef} ->
+ {asn1_class,Name};
+ Ts ->
+ NewType = Type#ptypedef{checked=true,typespec = Ts},
+ asn1_db:dbput(NewS#state.mname,Name,NewType), % update the type
+ ok
+ end
+ end,
+ case Result of
+ ok ->
+ checkp(S,T,Acc);
+ _ ->
+ checkp(S,T,[Result|Acc])
+ end;
+checkp(_S,[],Acc) ->
+ lists:reverse(Acc).
+
+
+
+
+checkc(S,[Name|Cs],Acc) ->
+ Result =
+ case asn1_db:dbget(S#state.mname,Name) of
+ undefined ->
+ error({class,{internal_error,'???'},S});
+ Class ->
+ ClassSpec = if
+ record(Class,classdef) ->
+ Class#classdef.typespec;
+ record(Class,typedef) ->
+ Class#typedef.typespec
+ end,
+ NewS = S#state{type=Class,tname=Name},
+ case catch(check_class(NewS,ClassSpec)) of
+ {error,Reason} ->
+ error({class,Reason,NewS});
+ {'EXIT',Reason} ->
+ error({class,{internal_error,Reason},NewS});
+ C ->
+ %% update the classdef
+ NewClass =
+ if
+ record(Class,classdef) ->
+ Class#classdef{checked=true,typespec=C};
+ record(Class,typedef) ->
+ #classdef{checked=true,name=Name,typespec=C}
+ end,
+ asn1_db:dbput(NewS#state.mname,Name,NewClass),
+ ok
+ end
+ end,
+ case Result of
+ ok ->
+ checkc(S,Cs,Acc);
+ _ ->
+ checkc(S,Cs,[Result|Acc])
+ end;
+checkc(_S,[],Acc) ->
+%% include_default_class(S#state.mname),
+ lists:reverse(Acc).
+
+checko(S,[Name|Os],Acc,ExclO,ExclOS) ->
+ Result =
+ case asn1_db:dbget(S#state.mname,Name) of
+ undefined ->
+ error({type,{internal_error,'???'},S});
+ Object when record(Object,typedef) ->
+ NewS = S#state{type=Object,tname=Name},
+ case catch(check_object(NewS,Object,Object#typedef.typespec)) of
+ {error,Reason} ->
+ error({type,Reason,NewS});
+ {'EXIT',Reason} ->
+ error({type,{internal_error,Reason},NewS});
+ {asn1,Reason} ->
+ error({type,Reason,NewS});
+ O ->
+ NewObj = Object#typedef{checked=true,typespec=O},
+ asn1_db:dbput(NewS#state.mname,Name,NewObj),
+ if
+ record(O,'Object') ->
+ case O#'Object'.gen of
+ true ->
+ {ok,ExclO,ExclOS};
+ false ->
+ {ok,[Name|ExclO],ExclOS}
+ end;
+ record(O,'ObjectSet') ->
+ case O#'ObjectSet'.gen of
+ true ->
+ {ok,ExclO,ExclOS};
+ false ->
+ {ok,ExclO,[Name|ExclOS]}
+ end
+ end
+ end;
+ PObject when record(PObject,pobjectdef) ->
+ NewS = S#state{type=PObject,tname=Name},
+ case (catch check_pobject(NewS,PObject)) of
+ {error,Reason} ->
+ error({type,Reason,NewS});
+ {'EXIT',Reason} ->
+ error({type,{internal_error,Reason},NewS});
+ {asn1,Reason} ->
+ error({type,Reason,NewS});
+ PO ->
+ NewPObj = PObject#pobjectdef{def=PO},
+ asn1_db:dbput(NewS#state.mname,Name,NewPObj),
+ {ok,[Name|ExclO],ExclOS}
+ end;
+ PObjSet when record(PObjSet,pvaluesetdef) ->
+ %% this is a parameterized object set. Might be a parameterized
+ %% value set, couldn't it?
+ NewS = S#state{type=PObjSet,tname=Name},
+ case (catch check_pobjectset(NewS,PObjSet)) of
+ {error,Reason} ->
+ error({type,Reason,NewS});
+ {'EXIT',Reason} ->
+ error({type,{internal_error,Reason},NewS});
+ {asn1,Reason} ->
+ error({type,Reason,NewS});
+ POS ->
+ %%NewPObjSet = PObjSet#pvaluesetdef{valueset=POS},
+ asn1_db:dbput(NewS#state.mname,Name,POS),
+ {ok,ExclO,[Name|ExclOS]}
+ end
+ end,
+ case Result of
+ {ok,NewExclO,NewExclOS} ->
+ checko(S,Os,Acc,NewExclO,NewExclOS);
+ _ ->
+ checko(S,Os,[Result|Acc],ExclO,ExclOS)
+ end;
+checko(_S,[],Acc,ExclO,ExclOS) ->
+ {lists:reverse(Acc),lists:reverse(ExclO),lists:reverse(ExclOS)}.
+
+check_class(S,CDef=#classdef{checked=Ch,name=Name,typespec=TS}) ->
+ case Ch of
+ true -> TS;
+ idle -> TS;
+ _ ->
+ NewCDef = CDef#classdef{checked=idle},
+ asn1_db:dbput(S#state.mname,Name,NewCDef),
+ CheckedTS = check_class(S,TS),
+ asn1_db:dbput(S#state.mname,Name,
+ NewCDef#classdef{checked=true,
+ typespec=CheckedTS}),
+ CheckedTS
+ end;
+check_class(S = #state{mname=M,tname=T},ClassSpec)
+ when record(ClassSpec,type) ->
+ Def = ClassSpec#type.def,
+ case Def of
+ #'Externaltypereference'{module=M,type=T} ->
+ #objectclass{fields=Def}; % in case of recursive definitions
+ Tref when record(Tref,'Externaltypereference') ->
+ {_,RefType} = get_referenced_type(S,Tref),
+% case RefType of
+% RefClass when record(RefClass,classdef) ->
+% check_class(S,RefClass#classdef.typespec)
+% end
+ case is_class(S,RefType) of
+ true ->
+ check_class(S,get_class_def(S,RefType));
+ _ ->
+ error({class,{internal_error,RefType},S})
+ end
+ end;
+% check_class(S,{objectclassname,ModuleName,ClassName}) when atom(ModuleName),atom(ClassName) ->
+% 'fix this';
+check_class(S,C) when record(C,objectclass) ->
+ NewFieldSpec = check_class_fields(S,C#objectclass.fields),
+ C#objectclass{fields=NewFieldSpec};
+%check_class(S,{objectclassname,ClassName}) ->
+check_class(S,ClassName) ->
+ {_,Def} = get_referenced_type(S,ClassName),
+ case Def of
+ ClassDef when record(ClassDef,classdef) ->
+ case ClassDef#classdef.checked of
+ true ->
+ ClassDef#classdef.typespec;
+ idle ->
+ ClassDef#classdef.typespec;
+ false ->
+ check_class(S,ClassDef#classdef.typespec)
+ end;
+ TypeDef when record(TypeDef,typedef) ->
+ %% this case may occur when a definition is a reference
+ %% to a class definition.
+ case TypeDef#typedef.typespec of
+ #type{def=Ext} when record(Ext,'Externaltypereference') ->
+ check_class(S,Ext)
+ end
+ end;
+check_class(_S,{poc,_ObjSet,_Params}) ->
+ 'fix this later'.
+
+check_class_fields(S,Fields) ->
+ check_class_fields(S,Fields,[]).
+
+check_class_fields(S,[F|Fields],Acc) ->
+ NewField =
+ case element(1,F) of
+ fixedtypevaluefield ->
+ {_,Name,Type,Unique,OSpec} = F,
+ RefType = check_type(S,#typedef{typespec=Type},Type),
+ {fixedtypevaluefield,Name,RefType,Unique,OSpec};
+ object_or_fixedtypevalue_field ->
+ {_,Name,Type,Unique,OSpec} = F,
+ Cat =
+ case asn1ct_gen:type(asn1ct_gen:get_inner(Type#type.def)) of
+ Def when record(Def,typereference);
+ record(Def,'Externaltypereference') ->
+ {_,D} = get_referenced_type(S,Def),
+ D;
+ {undefined,user} ->
+ %% neither of {primitive,bif} or {constructed,bif}
+%% {_,D} = get_referenced_type(S,#typereference{val=Type#type.def}),
+ {_,D} = get_referenced_type(S,#'Externaltypereference'{module=S#state.mname,type=Type#type.def}),
+ D;
+ _ ->
+ Type
+ end,
+ case Cat of
+ Class when record(Class,classdef) ->
+ {objectfield,Name,Type,Unique,OSpec};
+ _ ->
+ RefType = check_type(S,#typedef{typespec=Type},Type),
+ {fixedtypevaluefield,Name,RefType,Unique,OSpec}
+ end;
+ objectset_or_fixedtypevalueset_field ->
+ {_,Name,Type,OSpec} = F,
+%% RefType = check_type(S,#typedef{typespec=Type},Type),
+ RefType =
+ case (catch check_type(S,#typedef{typespec=Type},Type)) of
+ {asn1_class,_ClassDef} ->
+ case if_current_checked_type(S,Type) of
+ true ->
+ Type#type.def;
+ _ ->
+ check_class(S,Type)
+ end;
+ CheckedType when record(CheckedType,type) ->
+ CheckedType;
+ _ ->
+ error({class,"internal error, check_class_fields",S})
+ end,
+ if
+ record(RefType,'Externaltypereference') ->
+ {objectsetfield,Name,Type,OSpec};
+ record(RefType,classdef) ->
+ {objectsetfield,Name,Type,OSpec};
+ record(RefType,objectclass) ->
+ {objectsetfield,Name,Type,OSpec};
+ true ->
+ {fixedtypevaluesetfield,Name,RefType,OSpec}
+ end;
+ typefield ->
+ case F of
+ {TF,Name,{'DEFAULT',Type}} ->
+ {TF,Name,{'DEFAULT',check_type(S,#typedef{typespec=Type},Type)}};
+ _ -> F
+ end;
+ _ -> F
+ end,
+ check_class_fields(S,Fields,[NewField|Acc]);
+check_class_fields(_S,[],Acc) ->
+ lists:reverse(Acc).
+
+if_current_checked_type(S,#type{def=Def}) ->
+ CurrentCheckedName = S#state.tname,
+ MergedModules = S#state.inputmodules,
+ % CurrentCheckedModule = S#state.mname,
+ case Def of
+ #'Externaltypereference'{module=CurrentCheckedName,
+ type=CurrentCheckedName} ->
+ true;
+ #'Externaltypereference'{module=ModuleName,
+ type=CurrentCheckedName} ->
+ case MergedModules of
+ undefined ->
+ false;
+ _ ->
+ lists:member(ModuleName,MergedModules)
+ end;
+ _ ->
+ false
+ end.
+
+
+
+check_pobject(_S,PObject) when record(PObject,pobjectdef) ->
+ Def = PObject#pobjectdef.def,
+ Def.
+
+
+check_pobjectset(S,PObjSet) ->
+ #pvaluesetdef{pos=Pos,name=Name,args=Args,type=Type,
+ valueset=ValueSet}=PObjSet,
+ {Mod,Def} = get_referenced_type(S,Type#type.def),
+ case Def of
+ #classdef{} ->
+ ClassName = #'Externaltypereference'{module=Mod,
+ type=Def#classdef.name},
+ {valueset,Set} = ValueSet,
+% ObjectSet = #'ObjectSet'{class={objectclassname,ClassName},
+ ObjectSet = #'ObjectSet'{class=ClassName,
+ set=Set},
+ #pobjectsetdef{pos=Pos,name=Name,args=Args,class=Type#type.def,
+ def=ObjectSet};
+ _ ->
+ PObjSet
+ end.
+
+check_object(_S,ObjDef,ObjSpec) when (ObjDef#typedef.checked == true) ->
+ ObjSpec;
+check_object(S,_ObjDef,#'Object'{classname=ClassRef,def=ObjectDef}) ->
+ {_,_ClassDef} = get_referenced_type(S,ClassRef),
+ NewClassRef = check_externaltypereference(S,ClassRef),
+ ClassDef =
+ case _ClassDef#classdef.checked of
+ false ->
+ #classdef{checked=true,
+ typespec=check_class(S,_ClassDef#classdef.typespec)};
+ _ ->
+ _ClassDef
+ end,
+ NewObj =
+ case ObjectDef of
+ Def when tuple(Def), (element(1,Def)==object) ->
+ NewSettingList = check_objectdefn(S,Def,ClassDef),
+ #'Object'{def=NewSettingList};
+% Def when tuple(Def), (element(1,Def)=='ObjectFromObject') ->
+% fixa;
+ {po,{object,DefObj},ArgsList} ->
+ {_,Object} = get_referenced_type(S,DefObj),%DefObj is a
+ %%#'Externalvaluereference' or a #'Externaltypereference'
+ %% Maybe this call should be catched and in case of an exception
+ %% an nonallocated parameterized object should be returned.
+ instantiate_po(S,ClassDef,Object,ArgsList);
+ #'Externalvaluereference'{} ->
+ {_,Object} = get_referenced_type(S,ObjectDef),
+ check_object(S,Object,Object#typedef.typespec);
+ _ ->
+ exit({error,{no_object,ObjectDef},S})
+ end,
+ Gen = gen_incl(S,NewObj#'Object'.def,
+ (ClassDef#classdef.typespec)#objectclass.fields),
+ NewObj#'Object'{classname=NewClassRef,gen=Gen};
+
+%%check_object(S,ObjSetDef,ObjSet=#type{def={pt,ObjSetRef,Args}}) ->
+ %% A parameterized
+
+check_object(S,
+ _ObjSetDef,
+ ObjSet=#'ObjectSet'{class=ClassRef}) ->
+ {_,ClassDef} = get_referenced_type(S,ClassRef),
+ NewClassRef = check_externaltypereference(S,ClassRef),
+ UniqueFieldName =
+ case (catch get_unique_fieldname(ClassDef)) of
+ {error,'__undefined_'} -> {unique,undefined};
+ {asn1,Msg,_} -> error({class,Msg,S});
+ Other -> Other
+ end,
+ NewObjSet=
+ case ObjSet#'ObjectSet'.set of
+ {'SingleValue',Set} when list(Set) ->
+ CheckedSet = check_object_list(S,NewClassRef,Set),
+ NewSet = get_unique_valuelist(S,CheckedSet,UniqueFieldName),
+ ObjSet#'ObjectSet'{uniquefname=UniqueFieldName,
+ set=NewSet};
+ {'SingleValue',{definedvalue,ObjName}} ->
+ {_,ObjDef} = get_referenced_type(S,#identifier{val=ObjName}),
+ #'Object'{def=CheckedObj} =
+ check_object(S,ObjDef,ObjDef#typedef.typespec),
+ NewSet = get_unique_valuelist(S,[{ObjDef#typedef.name,
+ CheckedObj}],
+ UniqueFieldName),
+ ObjSet#'ObjectSet'{uniquefname=UniqueFieldName,
+ set=NewSet};
+ {'SingleValue',#'Externalvaluereference'{value=ObjName}} ->
+ {_,ObjDef} = get_referenced_type(S,#identifier{val=ObjName}),
+ #'Object'{def=CheckedObj} =
+ check_object(S,ObjDef,ObjDef#typedef.typespec),
+ NewSet = get_unique_valuelist(S,[{ObjDef#typedef.name,
+ CheckedObj}],
+ UniqueFieldName),
+ ObjSet#'ObjectSet'{uniquefname=UniqueFieldName,
+ set=NewSet};
+ ['EXTENSIONMARK'] ->
+ ObjSet#'ObjectSet'{uniquefname=UniqueFieldName,
+ set=['EXTENSIONMARK']};
+ Set when list(Set) ->
+ CheckedSet = check_object_list(S,NewClassRef,Set),
+ NewSet = get_unique_valuelist(S,CheckedSet,UniqueFieldName),
+ ObjSet#'ObjectSet'{uniquefname=UniqueFieldName,
+ set=NewSet};
+ {Set,Ext} when list(Set) ->
+ CheckedSet = check_object_list(S,NewClassRef,Set++Ext),
+ NewSet = get_unique_valuelist(S,CheckedSet,UniqueFieldName),
+ ObjSet#'ObjectSet'{uniquefname=UniqueFieldName,
+ set=NewSet++['EXTENSIONMARK']};
+ {{'SingleValue',Set},Ext} ->
+ CheckedSet = check_object_list(S,NewClassRef,
+ merge_sets(Set,Ext)),
+ NewSet = get_unique_valuelist(S,CheckedSet,UniqueFieldName),
+ ObjSet#'ObjectSet'{uniquefname=UniqueFieldName,
+ set=NewSet++['EXTENSIONMARK']};
+ {Type,{'EXCEPT',Exclusion}} when record(Type,type) ->
+ {_,TDef} = get_referenced_type(S,Type#type.def),
+ OS = TDef#typedef.typespec,
+ NewSet = reduce_objectset(OS#'ObjectSet'.set,Exclusion),
+ NewOS = OS#'ObjectSet'{set=NewSet},
+ check_object(S,TDef#typedef{typespec=NewOS},
+ NewOS);
+ #type{def={pt,DefinedObjSet,ParamList}} ->
+ {_,PObjSetDef} = get_referenced_type(S,DefinedObjSet),
+ instantiate_pos(S,ClassDef,PObjSetDef,ParamList);
+ {ObjDef={object,definedsyntax,_ObjFields},_Ext} ->
+ CheckedSet = check_object_list(S,NewClassRef,[ObjDef]),
+ NewSet = get_unique_valuelist(S,CheckedSet,UniqueFieldName),
+ ObjSet#'ObjectSet'{uniquefname=UniqueFieldName,
+ set=NewSet++['EXTENSIONMARK']}
+ end,
+ Gen = gen_incl_set(S,NewObjSet#'ObjectSet'.set,
+ ClassDef),
+ NewObjSet#'ObjectSet'{class=NewClassRef,gen=Gen}.
+
+
+merge_sets(Set,Ext) when list(Set),list(Ext) ->
+ Set ++ Ext;
+merge_sets(Set,Ext) when list(Ext) ->
+ [Set|Ext];
+merge_sets(Set,{'SingleValue',Ext}) when list(Set) ->
+ Set ++ [Ext];
+merge_sets(Set,{'SingleValue',Ext}) ->
+ [Set] ++ [Ext].
+
+reduce_objectset(ObjectSet,Exclusion) ->
+ case Exclusion of
+ {'SingleValue',#'Externalvaluereference'{value=Name}} ->
+ case lists:keysearch(Name,1,ObjectSet) of
+ {value,El} ->
+ lists:subtract(ObjectSet,[El]);
+ _ ->
+ ObjectSet
+ end
+ end.
+
+%% Checks a list of objects or object sets and returns a list of selected
+%% information for the code generation.
+check_object_list(S,ClassRef,ObjectList) ->
+ check_object_list(S,ClassRef,ObjectList,[]).
+
+check_object_list(S,ClassRef,[ObjOrSet|Objs],Acc) ->
+ case ObjOrSet of
+ ObjDef when tuple(ObjDef),(element(1,ObjDef)==object) ->
+ Def =
+ check_object(S,#typedef{typespec=ObjDef},
+% #'Object'{classname={objectclassname,ClassRef},
+ #'Object'{classname=ClassRef,
+ def=ObjDef}),
+ check_object_list(S,ClassRef,Objs,[{no_name,Def#'Object'.def}|Acc]);
+ {'SingleValue',{definedvalue,ObjName}} ->
+ {_,ObjectDef} = get_referenced_type(S,#identifier{val=ObjName}),
+ #'Object'{def=Def} = check_object(S,ObjectDef,ObjectDef#typedef.typespec),
+ check_object_list(S,ClassRef,Objs,[{ObjectDef#typedef.name,Def}|Acc]);
+ {'SingleValue',Ref = #'Externalvaluereference'{}} ->
+ {_,ObjectDef} = get_referenced_type(S,Ref),
+ #'Object'{def=Def} = check_object(S,ObjectDef,ObjectDef#typedef.typespec),
+ check_object_list(S,ClassRef,Objs,[{ObjectDef#typedef.name,Def}|Acc]);
+ ObjRef when record(ObjRef,'Externalvaluereference') ->
+ {_,ObjectDef} = get_referenced_type(S,ObjRef),
+ #'Object'{def=Def} = check_object(S,ObjectDef,ObjectDef#typedef.typespec),
+ check_object_list(S,ClassRef,Objs,
+%% [{ObjRef#'Externalvaluereference'.value,Def}|Acc]);
+ [{ObjectDef#typedef.name,Def}|Acc]);
+ {'ValueFromObject',{_,Object},FieldName} ->
+ {_,Def} = get_referenced_type(S,Object),
+%% TypeOrVal = get_fieldname_element(S,Def,FieldName);%% this must result in an object set
+ TypeDef = get_fieldname_element(S,Def,FieldName),
+ (TypeDef#typedef.typespec)#'ObjectSet'.set;
+ ObjSet when record(ObjSet,type) ->
+ ObjSetDef =
+ case ObjSet#type.def of
+ Ref when record(Ref,typereference);
+ record(Ref,'Externaltypereference') ->
+ {_,D} = get_referenced_type(S,ObjSet#type.def),
+ D;
+ Other ->
+ throw({asn1_error,{'unknown objecset',Other,S}})
+ end,
+ #'ObjectSet'{set=ObjectsInSet} =
+ check_object(S,ObjSetDef,ObjSetDef#typedef.typespec),
+ AccList = transform_set_to_object_list(ObjectsInSet,[]),
+ check_object_list(S,ClassRef,Objs,AccList++Acc);
+ union ->
+ check_object_list(S,ClassRef,Objs,Acc);
+ Other ->
+ exit({error,{'unknown object',Other},S})
+ end;
+%% Finally reverse the accumulated list and if there are any extension
+%% marks in the object set put one indicator of that in the end of the
+%% list.
+check_object_list(_,_,[],Acc) ->
+ lists:reverse(Acc).
+%% case lists:member('EXTENSIONMARK',RevAcc) of
+%% true ->
+%% ExclRevAcc = lists:filter(fun(X)->X /= 'EXTENSIONMARK' end,
+%% RevAcc),
+%% ExclRevAcc ++ ['EXTENSIONMARK'];
+%% false ->
+%% RevAcc
+%% end.
+
+
+%% get_fieldname_element/3
+%% gets the type/value/object/... of the referenced element in FieldName
+%% FieldName is a list and may have more than one element.
+%% Each element in FieldName can be either {typefieldreference,AnyFieldName}
+%% or {valuefieldreference,AnyFieldName}
+%% Def is the def of the first object referenced by FieldName
+get_fieldname_element(S,Def,[{_RefType,FieldName}]) when record(Def,typedef) ->
+ {_,_,ObjComps} = (Def#typedef.typespec)#'Object'.def,
+ case lists:keysearch(FieldName,1,ObjComps) of
+ {value,{_,TDef}} when record(TDef,typedef) ->
+ %% ORec = TDef#typedef.typespec, %% XXX This must be made general
+% case TDef#typedef.typespec of
+% ObjSetRec when record(ObjSetRec,'ObjectSet') ->
+% ObjSet = ObjSetRec#'ObjectSet'.set;
+% ObjRec when record(ObjRec,'Object') ->
+% %% now get the field in ObjRec that RestFName points out
+% %ObjRec
+% TDef
+% end;
+ TDef;
+ {value,{_,VDef}} when record(VDef,valuedef) ->
+ check_value(S,VDef);
+ _ ->
+ throw({assigned_object_error,"not_assigned_object",S})
+ end;
+get_fieldname_element(_S,Def,[{_RefType,_FieldName}|_RestFName])
+ when record(Def,typedef) ->
+ ok.
+
+transform_set_to_object_list([{Name,_UVal,Fields}|Objs],Acc) ->
+ transform_set_to_object_list(Objs,[{Name,{object,generatesyntax,Fields}}|Acc]);
+transform_set_to_object_list(['EXTENSIONMARK'|Objs],Acc) ->
+%% transform_set_to_object_list(Objs,['EXTENSIONMARK'|Acc]);
+ transform_set_to_object_list(Objs,Acc);
+transform_set_to_object_list([],Acc) ->
+ Acc.
+
+get_unique_valuelist(_S,ObjSet,{unique,undefined}) -> % no unique field in object
+ lists:map(fun({N,{_,_,F}})->{N,F};
+ (V={_,_,_}) ->V end, ObjSet);
+get_unique_valuelist(S,ObjSet,UFN) ->
+ get_unique_vlist(S,ObjSet,UFN,[]).
+
+get_unique_vlist(S,[],_,Acc) ->
+ case catch check_uniqueness(Acc) of
+ {asn1_error,_} ->
+% exit({error,Reason,S});
+ error({'ObjectSet',"not unique objects in object set",S});
+ true ->
+ lists:reverse(Acc)
+ end;
+get_unique_vlist(S,[{ObjName,Obj}|Rest],UniqueFieldName,Acc) ->
+ {_,_,Fields} = Obj,
+ VDef = get_unique_value(S,Fields,UniqueFieldName),
+ get_unique_vlist(S,Rest,UniqueFieldName,
+ [{ObjName,VDef#valuedef.value,Fields}|Acc]);
+get_unique_vlist(S,[V={_,_,_}|Rest],UniqueFieldName,Acc) ->
+ get_unique_vlist(S,Rest,UniqueFieldName,[V|Acc]).
+
+get_unique_value(S,Fields,UniqueFieldName) ->
+ Module = S#state.mname,
+ case lists:keysearch(UniqueFieldName,1,Fields) of
+ {value,Field} ->
+ case element(2,Field) of
+ VDef when record(VDef,valuedef) ->
+ VDef;
+ {definedvalue,ValName} ->
+ ValueDef = asn1_db:dbget(Module,ValName),
+ case ValueDef of
+ VDef when record(VDef,valuedef) ->
+ ValueDef;
+ undefined ->
+ #valuedef{value=ValName}
+ end;
+ {'ValueFromObject',Object,Name} ->
+ case Object of
+ {object,Ext} when record(Ext,'Externaltypereference') ->
+ OtherModule = Ext#'Externaltypereference'.module,
+ ExtObjName = Ext#'Externaltypereference'.type,
+ ObjDef = asn1_db:dbget(OtherModule,ExtObjName),
+ ObjSpec = ObjDef#typedef.typespec,
+ get_unique_value(OtherModule,element(3,ObjSpec),Name);
+ {object,{_,_,ObjName}} ->
+ ObjDef = asn1_db:dbget(Module,ObjName),
+ ObjSpec = ObjDef#typedef.typespec,
+ get_unique_value(Module,element(3,ObjSpec),Name);
+ {po,Object,_Params} ->
+ exit({error,{'parameterized object not implemented yet',
+ Object},S})
+ end;
+ Value when atom(Value);number(Value) ->
+ #valuedef{value=Value};
+ {'CHOICE',{_,Value}} when atom(Value);number(Value) ->
+ #valuedef{value=Value}
+ end;
+ false ->
+ exit({error,{'no unique value',Fields,UniqueFieldName},S})
+%% io:format("WARNING: no unique value in object"),
+%% exit(uniqueFieldName)
+ end.
+
+check_uniqueness(NameValueList) ->
+ check_uniqueness1(lists:keysort(2,NameValueList)).
+
+check_uniqueness1([]) ->
+ true;
+check_uniqueness1([_]) ->
+ true;
+check_uniqueness1([{_,N,_},{_,N,_}|_Rest]) ->
+ throw({asn1_error,{'objects in set must have unique values in UNIQUE fields',N}});
+check_uniqueness1([_|Rest]) ->
+ check_uniqueness1(Rest).
+
+%% instantiate_po/4
+%% ClassDef is the class of Object,
+%% Object is the Parameterized object, which is referenced,
+%% ArgsList is the list of actual parameters
+%% returns an #'Object' record.
+instantiate_po(S,_ClassDef,Object,ArgsList) when record(Object,pobjectdef) ->
+ FormalParams = get_pt_args(Object),
+ MatchedArgs = match_args(FormalParams,ArgsList,[]),
+ NewS = S#state{type=Object,parameters=MatchedArgs},
+ check_object(NewS,Object,#'Object'{classname=Object#pobjectdef.class,
+ def=Object#pobjectdef.def}).
+
+%% instantiate_pos/4
+%% ClassDef is the class of ObjectSetDef,
+%% ObjectSetDef is the Parameterized object set, which is referenced
+%% on the right side of the assignment,
+%% ArgsList is the list of actual parameters, i.e. real objects
+instantiate_pos(S,ClassDef,ObjectSetDef,ArgsList) ->
+ ClassName = ClassDef#classdef.name,
+ FormalParams = get_pt_args(ObjectSetDef),
+ Set = case get_pt_spec(ObjectSetDef) of
+ {valueset,_Set} -> _Set;
+ _Set -> _Set
+ end,
+ MatchedArgs = match_args(FormalParams,ArgsList,[]),
+ NewS = S#state{type=ObjectSetDef,parameters=MatchedArgs},
+ check_object(NewS,ObjectSetDef,
+ #'ObjectSet'{class=name2Extref(S#state.mname,ClassName),
+ set=Set}).
+
+
+%% gen_incl -> boolean()
+%% If object with Fields has any of the corresponding class' typefields
+%% then return value is true otherwise it is false.
+%% If an object lacks a typefield but the class has a type field that
+%% is OPTIONAL then we want gen to be true
+gen_incl(S,{_,_,Fields},CFields)->
+ gen_incl1(S,Fields,CFields).
+
+gen_incl1(_,_,[]) ->
+ false;
+gen_incl1(S,Fields,[C|CFields]) ->
+ case element(1,C) of
+ typefield ->
+% case lists:keymember(element(2,C),1,Fields) of
+% true ->
+% true;
+% false ->
+% gen_incl1(S,Fields,CFields)
+% end;
+ true; %% should check that field is OPTIONAL or DEFUALT if
+ %% the object lacks this field
+ objectfield ->
+ case lists:keysearch(element(2,C),1,Fields) of
+ {value,Field} ->
+ Type = element(3,C),
+ {_,ClassDef} = get_referenced_type(S,Type#type.def),
+% {_,ClassFields,_} = ClassDef#classdef.typespec,
+ #objectclass{fields=ClassFields} =
+ ClassDef#classdef.typespec,
+ ObjTDef = element(2,Field),
+ case gen_incl(S,(ObjTDef#typedef.typespec)#'Object'.def,
+ ClassFields) of
+ true ->
+ true;
+ _ ->
+ gen_incl1(S,Fields,CFields)
+ end;
+ _ ->
+ gen_incl1(S,Fields,CFields)
+ end;
+ _ ->
+ gen_incl1(S,Fields,CFields)
+ end.
+
+%% first if no unique field in the class return false.(don't generate code)
+gen_incl_set(S,Fields,ClassDef) ->
+ case catch get_unique_fieldname(ClassDef) of
+ Tuple when tuple(Tuple) ->
+ false;
+ _ ->
+ gen_incl_set1(S,Fields,
+ (ClassDef#classdef.typespec)#objectclass.fields)
+ end.
+
+%% if any of the existing or potentially existing objects has a typefield
+%% then return true.
+gen_incl_set1(_,[],_CFields)->
+ false;
+gen_incl_set1(_,['EXTENSIONMARK'],_) ->
+ true;
+%% Fields are the fields of an object in the object set.
+%% CFields are the fields of the class of the object set.
+gen_incl_set1(S,[Object|Rest],CFields)->
+ Fields = element(size(Object),Object),
+ case gen_incl1(S,Fields,CFields) of
+ true ->
+ true;
+ false ->
+ gen_incl_set1(S,Rest,CFields)
+ end.
+
+check_objectdefn(S,Def,CDef) when record(CDef,classdef) ->
+ WithSyntax = (CDef#classdef.typespec)#objectclass.syntax,
+ ClassFields = (CDef#classdef.typespec)#objectclass.fields,
+ case Def of
+ {object,defaultsyntax,Fields} ->
+ check_defaultfields(S,Fields,ClassFields);
+ {object,definedsyntax,Fields} ->
+ {_,WSSpec} = WithSyntax,
+ NewFields =
+ case catch( convert_definedsyntax(S,Fields,WSSpec,
+ ClassFields,[])) of
+ {asn1,{_ErrorType,ObjToken,ClassToken}} ->
+ throw({asn1,{'match error in object',ObjToken,
+ 'found in object',ClassToken,'found in class'}});
+ Err={asn1,_} -> throw(Err);
+ Err={'EXIT',_} -> throw(Err);
+ DefaultFields when list(DefaultFields) ->
+ DefaultFields
+ end,
+ {object,defaultsyntax,NewFields};
+ {object,_ObjectId} -> % This is a DefinedObject
+ fixa;
+ Other ->
+ exit({error,{objectdefn,Other}})
+ end.
+
+check_defaultfields(S,Fields,ClassFields) ->
+ check_defaultfields(S,Fields,ClassFields,[]).
+
+check_defaultfields(_S,[],_ClassFields,Acc) ->
+ {object,defaultsyntax,lists:reverse(Acc)};
+check_defaultfields(S,[{FName,Spec}|Fields],ClassFields,Acc) ->
+ case lists:keysearch(FName,2,ClassFields) of
+ {value,CField} ->
+ NewField = convert_to_defaultfield(S,FName,Spec,CField),
+ check_defaultfields(S,Fields,ClassFields,[NewField|Acc]);
+ _ ->
+ throw({error,{asn1,{'unvalid field in object',FName}}})
+ end.
+%% {object,defaultsyntax,Fields}.
+
+convert_definedsyntax(_S,[],[],_ClassFields,Acc) ->
+ lists:reverse(Acc);
+convert_definedsyntax(S,Fields,WithSyntax,ClassFields,Acc) ->
+ case match_field(S,Fields,WithSyntax,ClassFields) of
+ {MatchedField,RestFields,RestWS} ->
+ if
+ list(MatchedField) ->
+ convert_definedsyntax(S,RestFields,RestWS,ClassFields,
+ lists:append(MatchedField,Acc));
+ true ->
+ convert_definedsyntax(S,RestFields,RestWS,ClassFields,
+ [MatchedField|Acc])
+ end
+%% throw({error,{asn1,{'unvalid syntax in object',WorS}}})
+ end.
+
+match_field(S,Fields,WithSyntax,ClassFields) ->
+ match_field(S,Fields,WithSyntax,ClassFields,[]).
+
+match_field(S,Fields,[W|Ws],ClassFields,Acc) when list(W) ->
+ case catch(match_optional_field(S,Fields,W,ClassFields,[])) of
+ {'EXIT',_} ->
+ match_field(Fields,Ws,ClassFields,Acc); %% add S
+%% {[Result],RestFields} ->
+%% {Result,RestFields,Ws};
+ {Result,RestFields} when list(Result) ->
+ {Result,RestFields,Ws};
+ _ ->
+ match_field(S,Fields,Ws,ClassFields,Acc)
+ end;
+match_field(S,Fields,WithSyntax,ClassFields,_Acc) ->
+ match_mandatory_field(S,Fields,WithSyntax,ClassFields,[]).
+
+match_optional_field(_S,RestFields,[],_,Ret) ->
+ {Ret,RestFields};
+%% An additional optional field within an optional field
+match_optional_field(S,Fields,[W|Ws],ClassFields,Ret) when list(W) ->
+ case catch match_optional_field(S,Fields,W,ClassFields,[]) of
+ {'EXIT',_} ->
+ {Ret,Fields};
+ {asn1,{optional_matcherror,_,_}} ->
+ {Ret,Fields};
+ {OptionalField,RestFields} ->
+ match_optional_field(S,RestFields,Ws,ClassFields,
+ lists:append(OptionalField,Ret))
+ end;
+%% identify and skip word
+%match_optional_field(S,[#'Externaltypereference'{type=WorS}|Rest],
+match_optional_field(S,[{_,_,WorS}|Rest],
+ [WorS|Ws],ClassFields,Ret) ->
+ match_optional_field(S,Rest,Ws,ClassFields,Ret);
+match_optional_field(S,[],_,ClassFields,Ret) ->
+ match_optional_field(S,[],[],ClassFields,Ret);
+%% identify and skip comma
+match_optional_field(S,[{WorS,_}|Rest],[{WorS,_}|Ws],ClassFields,Ret) ->
+ match_optional_field(S,Rest,Ws,ClassFields,Ret);
+%% identify and save field data
+match_optional_field(S,[Setting|Rest],[{_,W}|Ws],ClassFields,Ret) ->
+ WorS =
+ case Setting of
+ Type when record(Type,type) -> Type;
+%% #'Externalvaluereference'{value=WordOrSetting} -> WordOrSetting;
+ {'ValueFromObject',_,_} -> Setting;
+ {object,_,_} -> Setting;
+ {_,_,WordOrSetting} -> WordOrSetting;
+%% Atom when atom(Atom) -> Atom
+ Other -> Other
+ end,
+ case lists:keysearch(W,2,ClassFields) of
+ false ->
+ throw({asn1,{optional_matcherror,WorS,W}});
+ {value,CField} ->
+ NewField = convert_to_defaultfield(S,W,WorS,CField),
+ match_optional_field(S,Rest,Ws,ClassFields,[NewField|Ret])
+ end;
+match_optional_field(_S,[WorS|_Rest],[W|_Ws],_ClassFields,_Ret) ->
+ throw({asn1,{optional_matcherror,WorS,W}}).
+
+match_mandatory_field(_S,[],[],_,[Acc]) ->
+ {Acc,[],[]};
+match_mandatory_field(_S,[],[],_,Acc) ->
+ {Acc,[],[]};
+match_mandatory_field(S,[],[H|T],CF,Acc) when list(H) ->
+ match_mandatory_field(S,[],T,CF,Acc);
+match_mandatory_field(_S,[],WithSyntax,_,_Acc) ->
+ throw({asn1,{mandatory_matcherror,[],WithSyntax}});
+%match_mandatory_field(_S,Fields,WithSyntax=[W|_Ws],_ClassFields,[Acc]) when list(W) ->
+match_mandatory_field(_S,Fields,WithSyntax=[W|_Ws],_ClassFields,Acc) when list(W), length(Acc) >= 1 ->
+ {Acc,Fields,WithSyntax};
+%% identify and skip word
+match_mandatory_field(S,[{_,_,WorS}|Rest],
+ [WorS|Ws],ClassFields,Acc) ->
+ match_mandatory_field(S,Rest,Ws,ClassFields,Acc);
+%% identify and skip comma
+match_mandatory_field(S,[{WorS,_}|Rest],[{WorS,_}|Ws],ClassFields,Ret) ->
+ match_mandatory_field(S,Rest,Ws,ClassFields,Ret);
+%% identify and save field data
+match_mandatory_field(S,[Setting|Rest],[{_,W}|Ws],ClassFields,Acc) ->
+ WorS =
+ case Setting of
+%% Atom when atom(Atom) -> Atom;
+%% #'Externalvaluereference'{value=WordOrSetting} -> WordOrSetting;
+ {object,_,_} -> Setting;
+ {_,_,WordOrSetting} -> WordOrSetting;
+ Type when record(Type,type) -> Type;
+ Other -> Other
+ end,
+ case lists:keysearch(W,2,ClassFields) of
+ false ->
+ throw({asn1,{mandatory_matcherror,WorS,W}});
+ {value,CField} ->
+ NewField = convert_to_defaultfield(S,W,WorS,CField),
+ match_mandatory_field(S,Rest,Ws,ClassFields,[NewField|Acc])
+ end;
+
+match_mandatory_field(_S,[WorS|_Rest],[W|_Ws],_ClassFields,_Acc) ->
+ throw({asn1,{mandatory_matcherror,WorS,W}}).
+
+%% Converts a field of an object from defined syntax to default syntax
+convert_to_defaultfield(S,ObjFieldName,ObjFieldSetting,CField)->
+ CurrMod = S#state.mname,
+ case element(1,CField) of
+ typefield ->
+ TypeDef=
+ case ObjFieldSetting of
+ TypeRec when record(TypeRec,type) -> TypeRec#type.def;
+ TDef when record(TDef,typedef) ->
+ TDef#typedef{typespec=check_type(S,TDef,
+ TDef#typedef.typespec)};
+ _ -> ObjFieldSetting
+ end,
+ Type =
+ if
+ record(TypeDef,typedef) -> TypeDef;
+ true ->
+ case asn1ct_gen:type(asn1ct_gen:get_inner(TypeDef)) of
+ ERef = #'Externaltypereference'{module=CurrMod} ->
+ {_,T} = get_referenced_type(S,ERef),
+ T#typedef{checked=true,
+ typespec=check_type(S,T,
+ T#typedef.typespec)};
+ ERef = #'Externaltypereference'{module=ExtMod} ->
+ {_,T} = get_referenced_type(S,ERef),
+ #typedef{name=Name} = T,
+ check_type(S,T,T#typedef.typespec),
+ #typedef{checked=true,
+ name={ExtMod,Name},
+ typespec=ERef};
+ Bif when Bif=={primitive,bif};Bif=={constructed,bif} ->
+ T = check_type(S,#typedef{typespec=ObjFieldSetting},
+ ObjFieldSetting),
+ #typedef{checked=true,name=Bif,typespec=T};
+ _ ->
+ {Mod,T} =
+ %% get_referenced_type(S,#typereference{val=ObjFieldSetting}),
+ get_referenced_type(S,#'Externaltypereference'{module=S#state.mname,type=ObjFieldSetting}),
+ case Mod of
+ CurrMod ->
+ T;
+ ExtMod ->
+ #typedef{name=Name} = T,
+ T#typedef{name={ExtMod,Name}}
+ end
+ end
+ end,
+ {ObjFieldName,Type};
+ fixedtypevaluefield ->
+ case ObjFieldName of
+ Val when atom(Val) ->
+ %% ObjFieldSetting can be a value,an objectidentifiervalue,
+ %% an element in an enumeration or namednumberlist etc.
+ ValRef =
+ case ObjFieldSetting of
+ #'Externalvaluereference'{} -> ObjFieldSetting;
+ {'ValueFromObject',{_,ObjRef},FieldName} ->
+ {_,Object} = get_referenced_type(S,ObjRef),
+ ChObject = check_object(S,Object,
+ Object#typedef.typespec),
+ get_fieldname_element(S,Object#typedef{typespec=ChObject},
+ FieldName);
+ #valuedef{} ->
+ ObjFieldSetting;
+ _ ->
+ #identifier{val=ObjFieldSetting}
+ end,
+ case ValRef of
+ #valuedef{} ->
+ {ObjFieldName,check_value(S,ValRef)};
+ _ ->
+ ValDef =
+ case catch get_referenced_type(S,ValRef) of
+ {error,_} ->
+ check_value(S,#valuedef{name=Val,
+ type=element(3,CField),
+ value=ObjFieldSetting});
+ {_,VDef} when record(VDef,valuedef) ->
+ check_value(S,VDef);%% XXX
+ {_,VDef} ->
+ check_value(S,#valuedef{name=Val,
+ type=element(3,CField),
+ value=VDef})
+ end,
+ {ObjFieldName,ValDef}
+ end;
+ Val ->
+ {ObjFieldName,Val}
+ end;
+ fixedtypevaluesetfield ->
+ {ObjFieldName,ObjFieldSetting};
+ objectfield ->
+ ObjectSpec =
+ case ObjFieldSetting of
+ Ref when record(Ref,typereference);record(Ref,identifier);
+ record(Ref,'Externaltypereference');
+ record(Ref,'Externalvaluereference') ->
+ {_,R} = get_referenced_type(S,ObjFieldSetting),
+ R;
+ {'ValueFromObject',{_,ObjRef},FieldName} ->
+ %% This is an ObjectFromObject
+ {_,Object} = get_referenced_type(S,ObjRef),
+ ChObject = check_object(S,Object,
+ Object#typedef.typespec),
+ _ObjFromObj=
+ get_fieldname_element(S,Object#typedef{
+ typespec=ChObject},
+ FieldName);
+ %%ClassName = ObjFromObj#'Object'.classname,
+ %%#typedef{name=,
+ %% typespec=
+ %% ObjFromObj#'Object'{classname=
+ %% {objectclassname,ClassName}}};
+ {object,_,_} ->
+ %% An object defined inlined in another object
+ #type{def=Ref} = element(3,CField),
+% CRef = case Ref of
+% #'Externaltypereference'{module=CurrMod,
+% type=CName} ->
+% CName;
+% #'Externaltypereference'{module=ExtMod,
+% type=CName} ->
+% {ExtMod,CName}
+% end,
+ InlinedObjName=
+ list_to_atom(lists:concat([S#state.tname]++
+ ['_',ObjFieldName])),
+% ObjSpec = #'Object'{classname={objectclassname,CRef},
+ ObjSpec = #'Object'{classname=Ref,
+ def=ObjFieldSetting},
+ CheckedObj=
+ check_object(S,#typedef{typespec=ObjSpec},ObjSpec),
+ InlObj = #typedef{checked=true,name=InlinedObjName,
+ typespec=CheckedObj},
+ asn1ct_gen:insert_once(inlined_objects,{InlinedObjName,
+ InlinedObjName}),
+ asn1_db:dbput(S#state.mname,InlinedObjName,InlObj),
+ InlObj;
+ #type{def=Eref} when record(Eref,'Externaltypereference') ->
+ {_,R} = get_referenced_type(S,Eref),
+ R;
+ _ ->
+%% {_,R} = get_referenced_type(S,#typereference{val=ObjFieldSetting}),
+ {_,R} = get_referenced_type(S,#'Externaltypereference'{module=S#state.mname,type=ObjFieldSetting}),
+ R
+ end,
+ {ObjFieldName,
+ ObjectSpec#typedef{checked=true,
+ typespec=check_object(S,ObjectSpec,
+ ObjectSpec#typedef.typespec)}};
+ variabletypevaluefield ->
+ {ObjFieldName,ObjFieldSetting};
+ variabletypevaluesetfield ->
+ {ObjFieldName,ObjFieldSetting};
+ objectsetfield ->
+ {_,ObjSetSpec} =
+ case ObjFieldSetting of
+ Ref when record(Ref,'Externaltypereference');
+ record(Ref,'Externalvaluereference') ->
+ get_referenced_type(S,ObjFieldSetting);
+ ObjectList when list(ObjectList) ->
+ %% an objctset defined in the object,though maybe
+ %% parsed as a SequenceOfValue
+ %% The ObjectList may be a list of references to
+ %% objects, a ValueFromObject
+ {_,_,Type,_} = CField,
+ ClassDef = Type#type.def,
+ case ClassDef#'Externaltypereference'.module of
+ CurrMod ->
+ ClassDef#'Externaltypereference'.type;
+ ExtMod ->
+ {ExtMod,
+ ClassDef#'Externaltypereference'.type}
+ end,
+ {no_name,
+ #typedef{typespec=
+ #'ObjectSet'{class=
+% {objectclassname,ClassRef},
+ ClassDef,
+ set=ObjectList}}};
+ ObjectSet={'SingleValue',_} ->
+ %% a Union of defined objects
+ {_,_,Type,_} = CField,
+ ClassDef = Type#type.def,
+% ClassRef =
+% case ClassDef#'Externaltypereference'.module of
+% CurrMod ->
+% ClassDef#'Externaltypereference'.type;
+% ExtMod ->
+% {ExtMod,
+% ClassDef#'Externaltypereference'.type}
+% end,
+ {no_name,
+% #typedef{typespec=#'ObjectSet'{class={objectclassname,ClassRef},
+ #typedef{typespec=#'ObjectSet'{class=ClassDef,
+ set=ObjectSet}}};
+ {object,_,[#type{def={'TypeFromObject',
+ {object,RefedObj},
+ FieldName}}]} ->
+ %% This case occurs when an ObjectSetFromObjects
+ %% production is used
+ {M,Def} = get_referenced_type(S,RefedObj),
+ {M,get_fieldname_element(S,Def,FieldName)};
+ #type{def=Eref} when
+ record(Eref,'Externaltypereference') ->
+ get_referenced_type(S,Eref);
+ _ ->
+%% get_referenced_type(S,#typereference{val=ObjFieldSetting})
+ get_referenced_type(S,#'Externaltypereference'{module=S#state.mname,type=ObjFieldSetting})
+ end,
+ {ObjFieldName,
+ ObjSetSpec#typedef{checked=true,
+ typespec=check_object(S,ObjSetSpec,
+ ObjSetSpec#typedef.typespec)}}
+ end.
+
+check_value(OldS,V) when record(V,pvaluesetdef) ->
+ #pvaluesetdef{checked=Checked,type=Type} = V,
+ case Checked of
+ true -> V;
+ {error,_} -> V;
+ false ->
+ case get_referenced_type(OldS,Type#type.def) of
+ {_,Class} when record(Class,classdef) ->
+ throw({pobjectsetdef});
+ _ -> continue
+ end
+ end;
+check_value(_OldS,V) when record(V,pvaluedef) ->
+ %% Fix this case later
+ V;
+check_value(OldS,V) when record(V,typedef) ->
+ %% This case when a value set has been parsed as an object set.
+ %% It may be a value set
+ #typedef{typespec=TS} = V,
+ case TS of
+ #'ObjectSet'{class=ClassRef} ->
+ {_,TSDef} = get_referenced_type(OldS,ClassRef),
+ %%IsObjectSet(TSDef);
+ case TSDef of
+ #classdef{} -> throw({objectsetdef});
+ #typedef{typespec=#type{def=Eref}} when
+ record(Eref,'Externaltypereference') ->
+ %% This case if the class reference is a defined
+ %% reference to class
+ check_value(OldS,V#typedef{typespec=TS#'ObjectSet'{class=Eref}});
+ #typedef{} ->
+ % an ordinary value set with a type in #typedef.typespec
+ ValueSet = TS#'ObjectSet'.set,
+ Type=check_type(OldS,TSDef,TSDef#typedef.typespec),
+ Value = check_value(OldS,#valuedef{type=Type,
+ value=ValueSet}),
+ {valueset,Type#type{constraint=Value#valuedef.value}}
+ end;
+ _ ->
+ throw({objectsetdef})
+ end;
+check_value(S,#valuedef{pos=Pos,name=Name,type=Type,
+ value={valueset,Constr}}) ->
+ NewType = Type#type{constraint=[Constr]},
+ {valueset,
+ check_type(S,#typedef{pos=Pos,name=Name,typespec=NewType},NewType)};
+check_value(OldS=#state{recordtopname=TopName},V) when record(V,valuedef) ->
+ #valuedef{name=Name,checked=Checked,type=Vtype,value=Value} = V,
+ case Checked of
+ true ->
+ V;
+ {error,_} ->
+ V;
+ false ->
+ Def = Vtype#type.def,
+ Constr = Vtype#type.constraint,
+ S = OldS#state{type=Vtype,tname=Def,value=V,vname=Name},
+ NewDef =
+ case Def of
+ Ext when record(Ext,'Externaltypereference') ->
+ RecName = Ext#'Externaltypereference'.type,
+ {_,Type} = get_referenced_type(S,Ext),
+ %% If V isn't a value but an object Type is a #classdef{}
+ case Type of
+ #classdef{} ->
+ throw({objectdef});
+ #typedef{} ->
+ case is_contextswitchtype(Type) of
+ true ->
+ #valuedef{value=CheckedVal}=
+ check_value(S,V#valuedef{type=Type#typedef.typespec}),
+ #newv{value=CheckedVal};
+ _ ->
+ #valuedef{value=CheckedVal}=
+ check_value(S#state{recordtopname=[RecName|TopName]},
+ V#valuedef{type=Type#typedef.typespec}),
+ #newv{value=CheckedVal}
+ end
+ end;
+ 'ANY' ->
+ throw({error,{asn1,{'cant check value of type',Def}}});
+ 'INTEGER' ->
+ validate_integer(S,Value,[],Constr),
+ #newv{value=normalize_value(S,Vtype,Value,[])};
+ {'INTEGER',NamedNumberList} ->
+ validate_integer(S,Value,NamedNumberList,Constr),
+ #newv{value=normalize_value(S,Vtype,Value,[])};
+ {'BIT STRING',NamedNumberList} ->
+ validate_bitstring(S,Value,NamedNumberList,Constr),
+ #newv{value=normalize_value(S,Vtype,Value,[])};
+ 'NULL' ->
+ validate_null(S,Value,Constr),
+ #newv{};
+ 'OBJECT IDENTIFIER' ->
+ validate_objectidentifier(S,Value,Constr),
+ #newv{value = normalize_value(S,Vtype,Value,[])};
+ 'ObjectDescriptor' ->
+ validate_objectdescriptor(S,Value,Constr),
+ #newv{value=normalize_value(S,Vtype,Value,[])};
+ {'ENUMERATED',NamedNumberList} ->
+ validate_enumerated(S,Value,NamedNumberList,Constr),
+ #newv{value=normalize_value(S,Vtype,Value,[])};
+ 'BOOLEAN'->
+ validate_boolean(S,Value,Constr),
+ #newv{value=normalize_value(S,Vtype,Value,[])};
+ 'OCTET STRING' ->
+ validate_octetstring(S,Value,Constr),
+ #newv{value=normalize_value(S,Vtype,Value,[])};
+ 'NumericString' ->
+ validate_restrictedstring(S,Value,Def,Constr),
+ #newv{value=normalize_value(S,Vtype,Value,[])};
+ 'TeletexString' ->
+ validate_restrictedstring(S,Value,Def,Constr),
+ #newv{value=normalize_value(S,Vtype,Value,[])};
+ 'VideotexString' ->
+ validate_restrictedstring(S,Value,Def,Constr),
+ #newv{value=normalize_value(S,Vtype,Value,[])};
+ 'UTCTime' ->
+ #newv{value=normalize_value(S,Vtype,Value,[])};
+% exit({'cant check value of type' ,Def});
+ 'GeneralizedTime' ->
+ #newv{value=normalize_value(S,Vtype,Value,[])};
+% exit({'cant check value of type' ,Def});
+ 'GraphicString' ->
+ validate_restrictedstring(S,Value,Def,Constr),
+ #newv{value=normalize_value(S,Vtype,Value,[])};
+ 'VisibleString' ->
+ validate_restrictedstring(S,Value,Def,Constr),
+ #newv{value=normalize_value(S,Vtype,Value,[])};
+ 'GeneralString' ->
+ validate_restrictedstring(S,Value,Def,Constr),
+ #newv{value=normalize_value(S,Vtype,Value,[])};
+ 'PrintableString' ->
+ validate_restrictedstring(S,Value,Def,Constr),
+ #newv{value=normalize_value(S,Vtype,Value,[])};
+ 'IA5String' ->
+ validate_restrictedstring(S,Value,Def,Constr),
+ #newv{value=normalize_value(S,Vtype,Value,[])};
+ 'BMPString' ->
+ validate_restrictedstring(S,Value,Def,Constr),
+ #newv{value=normalize_value(S,Vtype,Value,[])};
+%% 'UniversalString' -> %added 6/12 -00
+%% #newv{value=validate_restrictedstring(S,Value,Def,Constr)};
+ Seq when record(Seq,'SEQUENCE') ->
+ SeqVal = validate_sequence(S,Value,
+ Seq#'SEQUENCE'.components,
+ Constr),
+ #newv{value=normalize_value(S,Vtype,SeqVal,TopName)};
+ {'SEQUENCE OF',Components} ->
+ validate_sequenceof(S,Value,Components,Constr),
+ #newv{value=normalize_value(S,Vtype,Value,TopName)};
+ {'CHOICE',Components} ->
+ validate_choice(S,Value,Components,Constr),
+ #newv{value=normalize_value(S,Vtype,Value,TopName)};
+ Set when record(Set,'SET') ->
+ validate_set(S,Value,Set#'SET'.components,
+ Constr),
+ #newv{value=normalize_value(S,Vtype,Value,TopName)};
+ {'SET OF',Components} ->
+ validate_setof(S,Value,Components,Constr),
+ #newv{value=normalize_value(S,Vtype,Value,TopName)};
+ Other ->
+ exit({'cant check value of type' ,Other})
+ end,
+ case NewDef#newv.value of
+ unchanged ->
+ V#valuedef{checked=true,value=Value};
+ ok ->
+ V#valuedef{checked=true,value=Value};
+ {error,Reason} ->
+ V#valuedef{checked={error,Reason},value=Value};
+ _V ->
+ V#valuedef{checked=true,value=_V}
+ end
+ end.
+
+is_contextswitchtype(#typedef{name='EXTERNAL'})->
+ true;
+is_contextswitchtype(#typedef{name='EMBEDDED PDV'}) ->
+ true;
+is_contextswitchtype(#typedef{name='CHARACTER STRING'}) ->
+ true;
+is_contextswitchtype(_) ->
+ false.
+
+% validate_integer(S,{identifier,Pos,Id},NamedNumberList,Constr) ->
+% case lists:keysearch(Id,1,NamedNumberList) of
+% {value,_} -> ok;
+% false -> error({value,"unknown NamedNumber",S})
+% end;
+%% This case occurs when there is a valuereference
+validate_integer(S=#state{mname=M},
+ #'Externalvaluereference'{module=M,value=Id},
+ NamedNumberList,_Constr) ->
+ case lists:keysearch(Id,1,NamedNumberList) of
+ {value,_} -> ok;
+ false -> error({value,"unknown NamedNumber",S})
+ end;
+validate_integer(S,Id,NamedNumberList,_Constr) when atom(Id) ->
+ case lists:keysearch(Id,1,NamedNumberList) of
+ {value,_} -> ok;
+ false -> error({value,"unknown NamedNumber",S})
+ end;
+validate_integer(_S,Value,_NamedNumberList,Constr) when integer(Value) ->
+ check_integer_range(Value,Constr).
+
+check_integer_range(Int,Constr) when list(Constr) ->
+ NewConstr = [X || #constraint{c=X} <- Constr],
+ check_constr(Int,NewConstr);
+
+check_integer_range(_Int,_Constr) ->
+ %%io:format("~p~n",[Constr]),
+ ok.
+
+check_constr(Int,[{'ValueRange',Lb,Ub}|T]) when Int >= Lb, Int =< Ub ->
+ check_constr(Int,T);
+check_constr(_Int,[]) ->
+ ok.
+
+validate_bitstring(_S,_Value,_NamedNumberList,_Constr) ->
+ ok.
+
+validate_null(_S,'NULL',_Constr) ->
+ ok.
+
+%%------------
+%% This can be removed when the old parser is removed
+%% The function removes 'space' atoms from the list
+
+is_space_list([H],Acc) ->
+ lists:reverse([H|Acc]);
+is_space_list([H,space|T],Acc) ->
+ is_space_list(T,[H|Acc]);
+is_space_list([],Acc) ->
+ lists:reverse(Acc);
+is_space_list([H|T],Acc) ->
+ is_space_list(T,[H|Acc]).
+
+validate_objectidentifier(S,L,_) ->
+ case is_space_list(L,[]) of
+ NewL when list(NewL) ->
+ case validate_objectidentifier1(S,NewL) of
+ NewL2 when list(NewL2) ->
+ list_to_tuple(NewL2);
+ Other -> Other
+ end;
+ {error,_} ->
+ error({value, "illegal OBJECT IDENTIFIER", S})
+ end.
+
+validate_objectidentifier1(S, [Id|T]) when record(Id,'Externalvaluereference') ->
+ case catch get_referenced_type(S,Id) of
+ {_,V} when record(V,valuedef) ->
+ case check_value(S,V) of
+ #valuedef{type=#type{def='OBJECT IDENTIFIER'},
+ checked=true,value=Value} when tuple(Value) ->
+ validate_objectid(S, T, lists:reverse(tuple_to_list(Value)));
+ _ ->
+ error({value, "illegal OBJECT IDENTIFIER", S})
+ end;
+ _ ->
+ validate_objectid(S, [Id|T], [])
+ end;
+validate_objectidentifier1(S,V) ->
+ validate_objectid(S,V,[]).
+
+validate_objectid(_, [], Acc) ->
+ lists:reverse(Acc);
+validate_objectid(S, [Value|Vrest], Acc) when integer(Value) ->
+ validate_objectid(S, Vrest, [Value|Acc]);
+validate_objectid(S, [{'NamedNumber',_Name,Value}|Vrest], Acc)
+ when integer(Value) ->
+ validate_objectid(S, Vrest, [Value|Acc]);
+validate_objectid(S, [Id|Vrest], Acc)
+ when record(Id,'Externalvaluereference') ->
+ case catch get_referenced_type(S, Id) of
+ {_,V} when record(V,valuedef) ->
+ case check_value(S, V) of
+ #valuedef{checked=true,value=Value} when integer(Value) ->
+ validate_objectid(S, Vrest, [Value|Acc]);
+ _ ->
+ error({value, "illegal OBJECT IDENTIFIER", S})
+ end;
+ _ ->
+ case reserved_objectid(Id#'Externalvaluereference'.value, Acc) of
+ Value when integer(Value) ->
+ validate_objectid(S, Vrest, [Value|Acc]);
+ false ->
+ error({value, "illegal OBJECT IDENTIFIER", S})
+ end
+ end;
+validate_objectid(S, [{Atom,Value}],[]) when atom(Atom),integer(Value) ->
+ %% this case when an OBJECT IDENTIFIER value has been parsed as a
+ %% SEQUENCE value
+ Rec = #'Externalvaluereference'{module=S#state.mname,
+ value=Atom},
+ validate_objectidentifier1(S,[Rec,Value]);
+validate_objectid(S, [{Atom,EVRef}],[])
+ when atom(Atom),record(EVRef,'Externalvaluereference') ->
+ %% this case when an OBJECT IDENTIFIER value has been parsed as a
+ %% SEQUENCE value OTP-4354
+ Rec = #'Externalvaluereference'{module=S#state.mname,
+ value=Atom},
+ validate_objectidentifier1(S,[Rec,EVRef]);
+validate_objectid(S, _V, _Acc) ->
+ error({value, "illegal OBJECT IDENTIFIER",S}).
+
+
+%% ITU-T Rec. X.680 Annex B - D
+reserved_objectid('itu-t',[]) -> 0;
+reserved_objectid('ccitt',[]) -> 0;
+%% arcs below "itu-t"
+reserved_objectid('recommendation',[0]) -> 0;
+reserved_objectid('question',[0]) -> 1;
+reserved_objectid('administration',[0]) -> 2;
+reserved_objectid('network-operator',[0]) -> 3;
+reserved_objectid('identified-organization',[0]) -> 4;
+%% arcs below "recommendation"
+reserved_objectid('a',[0,0]) -> 1;
+reserved_objectid('b',[0,0]) -> 2;
+reserved_objectid('c',[0,0]) -> 3;
+reserved_objectid('d',[0,0]) -> 4;
+reserved_objectid('e',[0,0]) -> 5;
+reserved_objectid('f',[0,0]) -> 6;
+reserved_objectid('g',[0,0]) -> 7;
+reserved_objectid('h',[0,0]) -> 8;
+reserved_objectid('i',[0,0]) -> 9;
+reserved_objectid('j',[0,0]) -> 10;
+reserved_objectid('k',[0,0]) -> 11;
+reserved_objectid('l',[0,0]) -> 12;
+reserved_objectid('m',[0,0]) -> 13;
+reserved_objectid('n',[0,0]) -> 14;
+reserved_objectid('o',[0,0]) -> 15;
+reserved_objectid('p',[0,0]) -> 16;
+reserved_objectid('q',[0,0]) -> 17;
+reserved_objectid('r',[0,0]) -> 18;
+reserved_objectid('s',[0,0]) -> 19;
+reserved_objectid('t',[0,0]) -> 20;
+reserved_objectid('u',[0,0]) -> 21;
+reserved_objectid('v',[0,0]) -> 22;
+reserved_objectid('w',[0,0]) -> 23;
+reserved_objectid('x',[0,0]) -> 24;
+reserved_objectid('y',[0,0]) -> 25;
+reserved_objectid('z',[0,0]) -> 26;
+
+
+reserved_objectid(iso,[]) -> 1;
+%% arcs below "iso", note that number 1 is not used
+reserved_objectid('standard',[1]) -> 0;
+reserved_objectid('member-body',[1]) -> 2;
+reserved_objectid('identified-organization',[1]) -> 3;
+
+reserved_objectid('joint-iso-itu-t',[]) -> 2;
+reserved_objectid('joint-iso-ccitt',[]) -> 2;
+
+reserved_objectid(_,_) -> false.
+
+
+
+
+
+validate_objectdescriptor(_S,_Value,_Constr) ->
+ ok.
+
+validate_enumerated(S,Id,NamedNumberList,_Constr) when atom(Id) ->
+ case lists:keysearch(Id,1,NamedNumberList) of
+ {value,_} -> ok;
+ false -> error({value,"unknown ENUMERATED",S})
+ end;
+validate_enumerated(S,{identifier,_Pos,Id},NamedNumberList,_Constr) ->
+ case lists:keysearch(Id,1,NamedNumberList) of
+ {value,_} -> ok;
+ false -> error({value,"unknown ENUMERATED",S})
+ end;
+validate_enumerated(S,#'Externalvaluereference'{value=Id},
+ NamedNumberList,_Constr) ->
+ case lists:keysearch(Id,1,NamedNumberList) of
+ {value,_} -> ok;
+ false -> error({value,"unknown ENUMERATED",S})
+ end.
+
+validate_boolean(_S,_Value,_Constr) ->
+ ok.
+
+validate_octetstring(_S,_Value,_Constr) ->
+ ok.
+
+validate_restrictedstring(_S,_Value,_Def,_Constr) ->
+ ok.
+
+validate_sequence(S=#state{type=Vtype},Value,_Components,_Constr) ->
+ case Vtype of
+ #type{tag=[{tag,'UNIVERSAL',8,'IMPLICIT',32}]} ->
+ %% this is an 'EXTERNAL' (or INSTANCE OF)
+ case Value of
+ [{identification,_}|_RestVal] ->
+ to_EXTERNAL1990(S,Value);
+ _ ->
+ Value
+ end;
+ _ ->
+ Value
+ end.
+
+validate_sequenceof(_S,_Value,_Components,_Constr) ->
+ ok.
+
+validate_choice(_S,_Value,_Components,_Constr) ->
+ ok.
+
+validate_set(_S,_Value,_Components,_Constr) ->
+ ok.
+
+validate_setof(_S,_Value,_Components,_Constr) ->
+ ok.
+
+to_EXTERNAL1990(S,[{identification,{'CHOICE',{syntax,Stx}}}|Rest]) ->
+ to_EXTERNAL1990(S,Rest,[{'direct-reference',Stx}]);
+to_EXTERNAL1990(S,[{identification,{'CHOICE',{'presentation-context-id',I}}}|Rest]) ->
+ to_EXTERNAL1990(S,Rest,[{'indirect-reference',I}]);
+to_EXTERNAL1990(S,[{identification,{'CHOICE',{'context-negotiation',[{_,PCid},{_,TrStx}]}}}|Rest]) ->
+ to_EXTERNAL1990(S,Rest,[{'indirect-reference',PCid},{'direct-reference',TrStx}]);
+to_EXTERNAL1990(S,_) ->
+ error({value,"illegal value in EXTERNAL type",S}).
+
+to_EXTERNAL1990(S,[V={'data-value-descriptor',_}|Rest],Acc) ->
+ to_EXTERNAL1990(S,Rest,[V|Acc]);
+to_EXTERNAL1990(_S,[{'data-value',Val}],Acc) ->
+ Encoding = {encoding,{'CHOICE',{'octet-aligned',Val}}},
+ lists:reverse([Encoding|Acc]);
+to_EXTERNAL1990(S,_,_) ->
+ error({value,"illegal value in EXTERNAL type",S}).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Functions to normalize the default values of SEQUENCE
+%% and SET components into Erlang valid format
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+normalize_value(_,_,mandatory,_) ->
+ mandatory;
+normalize_value(_,_,'OPTIONAL',_) ->
+ 'OPTIONAL';
+normalize_value(S,Type,{'DEFAULT',Value},NameList) ->
+ case catch get_canonic_type(S,Type,NameList) of
+ {'BOOLEAN',CType,_} ->
+ normalize_boolean(S,Value,CType);
+ {'INTEGER',CType,_} ->
+ normalize_integer(S,Value,CType);
+ {'BIT STRING',CType,_} ->
+ normalize_bitstring(S,Value,CType);
+ {'OCTET STRING',CType,_} ->
+ normalize_octetstring(S,Value,CType);
+ {'NULL',_CType,_} ->
+ %%normalize_null(Value);
+ 'NULL';
+ {'OBJECT IDENTIFIER',_,_} ->
+ normalize_objectidentifier(S,Value);
+ {'ObjectDescriptor',_,_} ->
+ normalize_objectdescriptor(Value);
+ {'REAL',_,_} ->
+ normalize_real(Value);
+ {'ENUMERATED',CType,_} ->
+ normalize_enumerated(Value,CType);
+ {'CHOICE',CType,NewNameList} ->
+ normalize_choice(S,Value,CType,NewNameList);
+ {'SEQUENCE',CType,NewNameList} ->
+ normalize_sequence(S,Value,CType,NewNameList);
+ {'SEQUENCE OF',CType,NewNameList} ->
+ normalize_seqof(S,Value,CType,NewNameList);
+ {'SET',CType,NewNameList} ->
+ normalize_set(S,Value,CType,NewNameList);
+ {'SET OF',CType,NewNameList} ->
+ normalize_setof(S,Value,CType,NewNameList);
+ {restrictedstring,CType,_} ->
+ normalize_restrictedstring(S,Value,CType);
+ _ ->
+ io:format("WARNING: could not check default value ~p~n",[Value]),
+ Value
+ end;
+normalize_value(S,Type,Val,NameList) ->
+ normalize_value(S,Type,{'DEFAULT',Val},NameList).
+
+normalize_boolean(S,{Name,Bool},CType) when atom(Name) ->
+ normalize_boolean(S,Bool,CType);
+normalize_boolean(_,true,_) ->
+ true;
+normalize_boolean(_,false,_) ->
+ false;
+normalize_boolean(S,Bool=#'Externalvaluereference'{},CType) ->
+ get_normalized_value(S,Bool,CType,fun normalize_boolean/3,[]);
+normalize_boolean(_,Other,_) ->
+ throw({error,{asn1,{'invalid default value',Other}}}).
+
+normalize_integer(_S,Int,_) when integer(Int) ->
+ Int;
+normalize_integer(_S,{Name,Int},_) when atom(Name),integer(Int) ->
+ Int;
+normalize_integer(S,{Name,Int=#'Externalvaluereference'{}},
+ Type) when atom(Name) ->
+ normalize_integer(S,Int,Type);
+normalize_integer(S,Int=#'Externalvaluereference'{value=Name},Type) ->
+ case Type of
+ NNL when list(NNL) ->
+ case lists:keysearch(Name,1,NNL) of
+ {value,{Name,Val}} ->
+ Val;
+ false ->
+ get_normalized_value(S,Int,Type,
+ fun normalize_integer/3,[])
+ end;
+ _ ->
+ get_normalized_value(S,Int,Type,fun normalize_integer/3,[])
+ end;
+normalize_integer(_,Int,_) ->
+ exit({'Unknown INTEGER value',Int}).
+
+normalize_bitstring(S,Value,Type)->
+ %% There are four different Erlang formats of BIT STRING:
+ %% 1 - a list of ones and zeros.
+ %% 2 - a list of atoms.
+ %% 3 - as an integer, for instance in hexadecimal form.
+ %% 4 - as a tuple {Unused, Binary} where Unused is an integer
+ %% and tells how many bits of Binary are unused.
+ %%
+ %% normalize_bitstring/3 transforms Value according to:
+ %% A to 3,
+ %% B to 1,
+ %% C to 1 or 3
+ %% D to 2,
+ %% Value can be on format:
+ %% A - {hstring, String}, where String is a hexadecimal string.
+ %% B - {bstring, String}, where String is a string on bit format
+ %% C - #'Externalvaluereference'{value=V}, where V is a defined value
+ %% D - list of #'Externalvaluereference', where each value component
+ %% is an identifier corresponing to NamedBits in Type.
+ case Value of
+ {hstring,String} when list(String) ->
+ hstring_to_int(String);
+ {bstring,String} when list(String) ->
+ bstring_to_bitlist(String);
+ Rec when record(Rec,'Externalvaluereference') ->
+ get_normalized_value(S,Value,Type,
+ fun normalize_bitstring/3,[]);
+ RecList when list(RecList) ->
+ case Type of
+ NBL when list(NBL) ->
+ F = fun(#'Externalvaluereference'{value=Name}) ->
+ case lists:keysearch(Name,1,NBL) of
+ {value,{Name,_}} ->
+ Name;
+ Other ->
+ throw({error,Other})
+ end;
+ (Other) ->
+ throw({error,Other})
+ end,
+ case catch lists:map(F,RecList) of
+ {error,Reason} ->
+ io:format("WARNING: default value not "
+ "compatible with type definition ~p~n",
+ [Reason]),
+ Value;
+ NewList ->
+ NewList
+ end;
+ _ ->
+ io:format("WARNING: default value not "
+ "compatible with type definition ~p~n",
+ [RecList]),
+ Value
+ end;
+ {Name,String} when atom(Name) ->
+ normalize_bitstring(S,String,Type);
+ Other ->
+ io:format("WARNING: illegal default value ~p~n",[Other]),
+ Value
+ end.
+
+hstring_to_int(L) when list(L) ->
+ hstring_to_int(L,0).
+hstring_to_int([H|T],Acc) when H >= $A, H =< $F ->
+ hstring_to_int(T,(Acc bsl 4) + (H - $A + 10) ) ;
+hstring_to_int([H|T],Acc) when H >= $0, H =< $9 ->
+ hstring_to_int(T,(Acc bsl 4) + (H - $0));
+hstring_to_int([],Acc) ->
+ Acc.
+
+bstring_to_bitlist([H|T]) when H == $0; H == $1 ->
+ [H - $0 | bstring_to_bitlist(T)];
+bstring_to_bitlist([]) ->
+ [].
+
+%% normalize_octetstring/1 changes representation of input Value to a
+%% list of octets.
+%% Format of Value is one of:
+%% {bstring,String} each element in String corresponds to one bit in an octet
+%% {hstring,String} each element in String corresponds to one byte in an octet
+%% #'Externalvaluereference'
+normalize_octetstring(S,Value,CType) ->
+ case Value of
+ {bstring,String} ->
+ bstring_to_octetlist(String);
+ {hstring,String} ->
+ hstring_to_octetlist(String);
+ Rec when record(Rec,'Externalvaluereference') ->
+ get_normalized_value(S,Value,CType,
+ fun normalize_octetstring/3,[]);
+ {Name,String} when atom(Name) ->
+ normalize_octetstring(S,String,CType);
+ List when list(List) ->
+ %% check if list elements are valid octet values
+ lists:map(fun([])-> ok;
+ (H)when H > 255->
+ io:format("WARNING: not legal octet value ~p in OCTET STRING, ~p~n",[H,List]);
+ (_)-> ok
+ end, List),
+ List;
+ Other ->
+ io:format("WARNING: unknown default value ~p~n",[Other]),
+ Value
+ end.
+
+
+bstring_to_octetlist([]) ->
+ [];
+bstring_to_octetlist([H|T]) when H == $0 ; H == $1 ->
+ bstring_to_octetlist(T,6,[(H - $0) bsl 7]).
+bstring_to_octetlist([H|T],0,[Hacc|Tacc]) when H == $0; H == $1 ->
+ bstring_to_octetlist(T, 7, [0,Hacc + (H -$0)| Tacc]);
+bstring_to_octetlist([H|T],BSL,[Hacc|Tacc]) when H == $0; H == $1 ->
+ bstring_to_octetlist(T, BSL-1, [Hacc + ((H - $0) bsl BSL)| Tacc]);
+bstring_to_octetlist([],7,[0|Acc]) ->
+ lists:reverse(Acc);
+bstring_to_octetlist([],_,Acc) ->
+ lists:reverse(Acc).
+
+hstring_to_octetlist([]) ->
+ [];
+hstring_to_octetlist(L) ->
+ hstring_to_octetlist(L,4,[]).
+hstring_to_octetlist([H|T],0,[Hacc|Tacc]) when H >= $A, H =< $F ->
+ hstring_to_octetlist(T,4,[Hacc + (H - $A + 10)|Tacc]);
+hstring_to_octetlist([H|T],BSL,Acc) when H >= $A, H =< $F ->
+ hstring_to_octetlist(T,0,[(H - $A + 10) bsl BSL|Acc]);
+hstring_to_octetlist([H|T],0,[Hacc|Tacc]) when H >= $0; H =< $9 ->
+ hstring_to_octetlist(T,4,[Hacc + (H - $0)|Tacc]);
+hstring_to_octetlist([H|T],BSL,Acc) when H >= $0; H =< $9 ->
+ hstring_to_octetlist(T,0,[(H - $0) bsl BSL|Acc]);
+hstring_to_octetlist([],_,Acc) ->
+ lists:reverse(Acc).
+
+normalize_objectidentifier(S,Value) ->
+ validate_objectidentifier(S,Value,[]).
+
+normalize_objectdescriptor(Value) ->
+ Value.
+
+normalize_real(Value) ->
+ Value.
+
+normalize_enumerated(#'Externalvaluereference'{value=V},CType)
+ when list(CType) ->
+ normalize_enumerated2(V,CType);
+normalize_enumerated(Value,CType) when atom(Value),list(CType) ->
+ normalize_enumerated2(Value,CType);
+normalize_enumerated({Name,EnumV},CType) when atom(Name) ->
+ normalize_enumerated(EnumV,CType);
+normalize_enumerated(Value,{CType1,CType2}) when list(CType1), list(CType2)->
+ normalize_enumerated(Value,CType1++CType2);
+normalize_enumerated(V,CType) ->
+ io:format("WARNING: Enumerated unknown type ~p~n",[CType]),
+ V.
+normalize_enumerated2(V,Enum) ->
+ case lists:keysearch(V,1,Enum) of
+ {value,{Val,_}} -> Val;
+ _ ->
+ io:format("WARNING: Enumerated value is not correct ~p~n",[V]),
+ V
+ end.
+
+normalize_choice(S,{'CHOICE',{C,V}},CType,NameList) when atom(C) ->
+ Value =
+ case V of
+ Rec when record(Rec,'Externalvaluereference') ->
+ get_normalized_value(S,V,CType,
+ fun normalize_choice/4,
+ [NameList]);
+ _ -> V
+ end,
+ case catch lists:keysearch(C,#'ComponentType'.name,CType) of
+ {value,#'ComponentType'{typespec=CT,name=Name}} ->
+ {C,normalize_value(S,CT,{'DEFAULT',Value},
+ [Name|NameList])};
+ Other ->
+ io:format("WARNING: Wrong format of type/value ~p/~p~n",
+ [Other,Value]),
+ {C,Value}
+ end;
+normalize_choice(S,{'DEFAULT',ValueList},CType,NameList) ->
+ lists:map(fun(X)-> normalize_choice(S,X,CType,NameList) end, ValueList);
+normalize_choice(S,Val=#'Externalvaluereference'{},CType,NameList) ->
+ {_,#valuedef{value=V}}=get_referenced_type(S,Val),
+ normalize_choice(S,{'CHOICE',V},CType,NameList);
+% get_normalized_value(S,Val,CType,fun normalize_choice/4,[NameList]);
+normalize_choice(S,{Name,ChoiceVal},CType,NameList)
+ when atom(Name) ->
+ normalize_choice(S,ChoiceVal,CType,NameList).
+
+normalize_sequence(S,{Name,Value},Components,NameList)
+ when atom(Name),list(Value) ->
+ normalize_sequence(S,Value,Components,NameList);
+normalize_sequence(S,Value,Components,NameList) ->
+ normalized_record('SEQUENCE',S,Value,Components,NameList).
+
+normalize_set(S,{Name,Value},Components,NameList)
+ when atom(Name),list(Value) ->
+ normalized_record('SET',S,Value,Components,NameList);
+normalize_set(S,Value,Components,NameList) ->
+ normalized_record('SET',S,Value,Components,NameList).
+
+normalized_record(SorS,S,Value,Components,NameList) ->
+ NewName = list_to_atom(asn1ct_gen:list2name(NameList)),
+ NoComps = length(Components),
+ case normalize_seq_or_set(SorS,S,Value,Components,NameList,[]) of
+ ListOfVals when length(ListOfVals) == NoComps ->
+ list_to_tuple([NewName|ListOfVals]);
+ _ ->
+ error({type,{illegal,default,value,Value},S})
+ end.
+
+normalize_seq_or_set(SorS,S,[{Cname,V}|Vs],
+ [#'ComponentType'{name=Cname,typespec=TS}|Cs],
+ NameList,Acc) ->
+ NewNameList =
+ case TS#type.def of
+ #'Externaltypereference'{type=TName} ->
+ [TName];
+ _ -> [Cname|NameList]
+ end,
+ NVal = normalize_value(S,TS,{'DEFAULT',V},NewNameList),
+ normalize_seq_or_set(SorS,S,Vs,Cs,NameList,[NVal|Acc]);
+normalize_seq_or_set(SorS,S,Values=[{_Cname1,_V}|_Vs],
+ [#'ComponentType'{prop='OPTIONAL'}|Cs],
+ NameList,Acc) ->
+ normalize_seq_or_set(SorS,S,Values,Cs,NameList,[asn1_NOVALUE|Acc]);
+normalize_seq_or_set(SorS,S,Values=[{_Cname1,_V}|_Vs],
+ [#'ComponentType'{name=Cname2,typespec=TS,
+ prop={'DEFAULT',Value}}|Cs],
+ NameList,Acc) ->
+ NewNameList =
+ case TS#type.def of
+ #'Externaltypereference'{type=TName} ->
+ [TName];
+ _ -> [Cname2|NameList]
+ end,
+ NVal = normalize_value(S,TS,{'DEFAULT',Value},NewNameList),
+ normalize_seq_or_set(SorS,S,Values,Cs,NameList,[NVal|Acc]);
+normalize_seq_or_set(_SorS,_S,[],[],_,Acc) ->
+ lists:reverse(Acc);
+%% If default value is {} ComponentTypes in SEQUENCE are marked DEFAULT
+%% or OPTIONAL (or the type is defined SEQUENCE{}, which is handled by
+%% the previous case).
+normalize_seq_or_set(SorS,S,[],
+ [#'ComponentType'{name=Name,typespec=TS,
+ prop={'DEFAULT',Value}}|Cs],
+ NameList,Acc) ->
+ NewNameList =
+ case TS#type.def of
+ #'Externaltypereference'{type=TName} ->
+ [TName];
+ _ -> [Name|NameList]
+ end,
+ NVal = normalize_value(S,TS,{'DEFAULT',Value},NewNameList),
+ normalize_seq_or_set(SorS,S,[],Cs,NameList,[NVal|Acc]);
+normalize_seq_or_set(SorS,S,[],[#'ComponentType'{prop='OPTIONAL'}|Cs],
+ NameList,Acc) ->
+ normalize_seq_or_set(SorS,S,[],Cs,NameList,[asn1_NOVALUE|Acc]);
+normalize_seq_or_set(SorS,S,Value=#'Externalvaluereference'{},
+ Cs,NameList,Acc) ->
+ get_normalized_value(S,Value,Cs,fun normalize_seq_or_set/6,
+ [SorS,NameList,Acc]);
+normalize_seq_or_set(_SorS,S,V,_,_,_) ->
+ error({type,{illegal,default,value,V},S}).
+
+normalize_seqof(S,Value,Type,NameList) ->
+ normalize_s_of('SEQUENCE OF',S,Value,Type,NameList).
+
+normalize_setof(S,Value,Type,NameList) ->
+ normalize_s_of('SET OF',S,Value,Type,NameList).
+
+normalize_s_of(SorS,S,Value,Type,NameList) when list(Value) ->
+ DefValueList = lists:map(fun(X) -> {'DEFAULT',X} end,Value),
+ Suffix = asn1ct_gen:constructed_suffix(SorS,Type),
+ Def = Type#type.def,
+ InnerType = asn1ct_gen:get_inner(Def),
+ WhatKind = asn1ct_gen:type(InnerType),
+ NewNameList =
+ case WhatKind of
+ {constructed,bif} ->
+ [Suffix|NameList];
+ #'Externaltypereference'{type=Name} ->
+ [Name];
+ _ -> []
+ end,
+ NormFun = fun (X) -> normalize_value(S,Type,X,
+ NewNameList) end,
+ case catch lists:map(NormFun, DefValueList) of
+ List when list(List) ->
+ List;
+ _ ->
+ io:format("WARNING: ~p could not handle value ~p~n",
+ [SorS,Value]),
+ Value
+ end;
+normalize_s_of(SorS,S,Value,Type,NameList)
+ when record(Value,'Externalvaluereference') ->
+ get_normalized_value(S,Value,Type,fun normalize_s_of/5,
+ [SorS,NameList]).
+% case catch get_referenced_type(S,Value) of
+% {_,#valuedef{value=V}} ->
+% normalize_s_of(SorS,S,V,Type);
+% {error,Reason} ->
+% io:format("WARNING: ~p could not handle value ~p~n",
+% [SorS,Value]),
+% Value;
+% {_,NewVal} ->
+% normalize_s_of(SorS,S,NewVal,Type);
+% _ ->
+% io:format("WARNING: ~p could not handle value ~p~n",
+% [SorS,Value]),
+% Value
+% end.
+
+
+%% normalize_restrictedstring handles all format of restricted strings.
+%% tuple case
+normalize_restrictedstring(_S,[Int1,Int2],_) when integer(Int1),integer(Int2) ->
+ {Int1,Int2};
+%% quadruple case
+normalize_restrictedstring(_S,[Int1,Int2,Int3,Int4],_) when integer(Int1),
+ integer(Int2),
+ integer(Int3),
+ integer(Int4) ->
+ {Int1,Int2,Int3,Int4};
+%% character string list case
+normalize_restrictedstring(S,[H|T],CType) when list(H);tuple(H) ->
+ [normalize_restrictedstring(S,H,CType)|normalize_restrictedstring(S,T,CType)];
+%% character sting case
+normalize_restrictedstring(_S,CString,_) when list(CString) ->
+ Fun =
+ fun(X) ->
+ if
+ $X =< 255, $X >= 0 ->
+ ok;
+ true ->
+ io:format("WARNING: illegal character in string"
+ " ~p~n",[X])
+ end
+ end,
+ lists:foreach(Fun,CString),
+ CString;
+%% definedvalue case or argument in a parameterized type
+normalize_restrictedstring(S,ERef,CType) when record(ERef,'Externalvaluereference') ->
+ get_normalized_value(S,ERef,CType,
+ fun normalize_restrictedstring/3,[]);
+%%
+normalize_restrictedstring(S,{Name,Val},CType) when atom(Name) ->
+ normalize_restrictedstring(S,Val,CType).
+
+
+get_normalized_value(S,Val,Type,Func,AddArg) ->
+ case catch get_referenced_type(S,Val) of
+ {_,#valuedef{type=_T,value=V}} ->
+ %% should check that Type and T equals
+ call_Func(S,V,Type,Func,AddArg);
+ {error,_} ->
+ io:format("WARNING: default value not "
+ "comparable ~p~n",[Val]),
+ Val;
+ {_,NewVal} ->
+ call_Func(S,NewVal,Type,Func,AddArg);
+ _ ->
+ io:format("WARNING: default value not "
+ "comparable ~p~n",[Val]),
+ Val
+ end.
+
+call_Func(S,Val,Type,Func,ArgList) ->
+ case ArgList of
+ [] ->
+ Func(S,Val,Type);
+ [LastArg] ->
+ Func(S,Val,Type,LastArg);
+ [Arg1,LastArg1] ->
+ Func(Arg1,S,Val,Type,LastArg1);
+ [Arg1,LastArg1,LastArg2] ->
+ Func(Arg1,S,Val,Type,LastArg1,LastArg2)
+ end.
+
+
+get_canonic_type(S,Type,NameList) ->
+ {InnerType,NewType,NewNameList} =
+ case Type#type.def of
+ Name when atom(Name) ->
+ {Name,Type,NameList};
+ Ref when record(Ref,'Externaltypereference') ->
+ {_,#typedef{name=Name,typespec=RefedType}} =
+ get_referenced_type(S,Ref),
+ get_canonic_type(S,RefedType,[Name]);
+ {Name,T} when atom(Name) ->
+ {Name,T,NameList};
+ Seq when record(Seq,'SEQUENCE') ->
+ {'SEQUENCE',Seq#'SEQUENCE'.components,NameList};
+ Set when record(Set,'SET') ->
+ {'SET',Set#'SET'.components,NameList}
+ end,
+ {asn1ct_gen:unify_if_string(InnerType),NewType,NewNameList}.
+
+
+
+check_ptype(_S,Type,Ts) when record(Ts,type) ->
+ %Tag = Ts#type.tag,
+ %Constr = Ts#type.constraint,
+ Def = Ts#type.def,
+ NewDef=
+ case Def of
+ Seq when record(Seq,'SEQUENCE') ->
+ #newt{type=Seq#'SEQUENCE'{pname=Type#ptypedef.name}};
+ Set when record(Set,'SET') ->
+ #newt{type=Set#'SET'{pname=Type#ptypedef.name}};
+ _Other ->
+ #newt{}
+ end,
+ Ts2 = case NewDef of
+ #newt{type=unchanged} ->
+ Ts;
+ #newt{type=TDef}->
+ Ts#type{def=TDef}
+ end,
+ Ts2.
+
+
+% check_type(S,Type,ObjSpec={{objectclassname,_},_}) ->
+% check_class(S,ObjSpec);
+check_type(_S,Type,Ts) when record(Type,typedef),
+ (Type#typedef.checked==true) ->
+ Ts;
+check_type(_S,Type,Ts) when record(Type,typedef),
+ (Type#typedef.checked==idle) -> % the check is going on
+ Ts;
+check_type(S=#state{recordtopname=TopName},Type,Ts) when record(Ts,type) ->
+ {Def,Tag,Constr} =
+ case match_parameters(Ts#type.def,S#state.parameters) of
+ #type{constraint=_Ctmp,def=Dtmp} ->
+ {Dtmp,Ts#type.tag,Ts#type.constraint};
+ Dtmp ->
+ {Dtmp,Ts#type.tag,Ts#type.constraint}
+ end,
+ TempNewDef = #newt{type=Def,tag=Tag,constraint=Constr},
+ TestFun =
+ fun(Tref) ->
+ {_,MaybeChoice} = get_referenced_type(S,Tref),
+ case catch((MaybeChoice#typedef.typespec)#type.def) of
+ {'CHOICE',_} ->
+ maybe_illicit_implicit_tag(choice,Tag);
+ 'ANY' ->
+ maybe_illicit_implicit_tag(open_type,Tag);
+ 'ANY DEFINED BY' ->
+ maybe_illicit_implicit_tag(open_type,Tag);
+ 'ASN1_OPEN_TYPE' ->
+ maybe_illicit_implicit_tag(open_type,Tag);
+ _ ->
+ Tag
+ end
+ end,
+ NewDef=
+ case Def of
+ Ext when record(Ext,'Externaltypereference') ->
+ {_,RefTypeDef} = get_referenced_type(S,Ext),
+% case RefTypeDef of
+% Class when record(Class,classdef) ->
+% throw({asn1_class,Class});
+% _ -> ok
+% end,
+ case is_class(S,RefTypeDef) of
+ true -> throw({asn1_class,RefTypeDef});
+ _ -> ok
+ end,
+ Ct = TestFun(Ext),
+ RefType =
+%case S#state.erule of
+% ber_bin_v2 ->
+ case RefTypeDef#typedef.checked of
+ true ->
+ RefTypeDef#typedef.typespec;
+ _ ->
+ NewRefTypeDef1 = RefTypeDef#typedef{checked=idle},
+ asn1_db:dbput(S#state.mname,
+ NewRefTypeDef1#typedef.name,NewRefTypeDef1),
+ RefType1 =
+ check_type(S,RefTypeDef,RefTypeDef#typedef.typespec),
+ NewRefTypeDef2 =
+ RefTypeDef#typedef{checked=true,typespec = RefType1},
+ asn1_db:dbput(S#state.mname,
+ NewRefTypeDef2#typedef.name,NewRefTypeDef2),
+ %% update the type and mark as checked
+ RefType1
+ end,
+% _ -> RefTypeDef#typedef.typespec
+% end,
+
+ case asn1ct_gen:prim_bif(asn1ct_gen:get_inner(RefType#type.def)) of
+ true ->
+ %% Here we expand to a built in type and inline it
+ TempNewDef#newt{
+ type=
+ RefType#type.def,
+ tag=
+ merge_tags(Ct,RefType#type.tag),
+ constraint=
+ merge_constraints(check_constraints(S,Constr),
+ RefType#type.constraint)};
+ _ ->
+ %% Here we only expand the tags and keep the ext ref
+
+ TempNewDef#newt{
+ type=
+ check_externaltypereference(S,Ext),
+ tag =
+ case S#state.erule of
+ ber_bin_v2 ->
+ merge_tags(Ct,RefType#type.tag);
+ _ ->
+ Ct
+ end
+ }
+ end;
+ 'ANY' ->
+ Ct=maybe_illicit_implicit_tag(open_type,Tag),
+ TempNewDef#newt{type='ASN1_OPEN_TYPE',tag=Ct};
+ {'ANY_DEFINED_BY',_} ->
+ Ct=maybe_illicit_implicit_tag(open_type,Tag),
+ TempNewDef#newt{type='ASN1_OPEN_TYPE',tag=Ct};
+ 'INTEGER' ->
+ check_integer(S,[],Constr),
+ TempNewDef#newt{tag=
+ merge_tags(Tag,?TAG_PRIMITIVE(?N_INTEGER))};
+
+ {'INTEGER',NamedNumberList} ->
+ TempNewDef#newt{type={'INTEGER',check_integer(S,NamedNumberList,Constr)},
+ tag=
+ merge_tags(Tag,?TAG_PRIMITIVE(?N_INTEGER))};
+ {'BIT STRING',NamedNumberList} ->
+ NewL = check_bitstring(S,NamedNumberList,Constr),
+%% erlang:display({asn1ct_check,NamedNumberList,NewL}),
+ TempNewDef#newt{type={'BIT STRING',NewL},
+ tag=
+ merge_tags(Tag,?TAG_PRIMITIVE(?N_BIT_STRING))};
+ 'NULL' ->
+ TempNewDef#newt{tag=
+ merge_tags(Tag,?TAG_PRIMITIVE(?N_NULL))};
+ 'OBJECT IDENTIFIER' ->
+ check_objectidentifier(S,Constr),
+ TempNewDef#newt{tag=
+ merge_tags(Tag,?TAG_PRIMITIVE(?N_OBJECT_IDENTIFIER))};
+ 'ObjectDescriptor' ->
+ TempNewDef#newt{tag=
+ merge_tags(Tag,?TAG_PRIMITIVE(?N_OBJECT_DESCRIPTOR))};
+ 'EXTERNAL' ->
+%% AssociatedType = asn1_db:dbget(S#state.mname,'EXTERNAL'),
+%% #newt{type=check_type(S,Type,AssociatedType)};
+ put(external,unchecked),
+ TempNewDef#newt{type=
+ #'Externaltypereference'{module=S#state.mname,
+ type='EXTERNAL'},
+ tag=
+ merge_tags(Tag,?TAG_CONSTRUCTED(?N_EXTERNAL))};
+ {'INSTANCE OF',DefinedObjectClass,Constraint} ->
+ %% check that DefinedObjectClass is of TYPE-IDENTIFIER class
+ %% If Constraint is empty make it the general INSTANCE OF type
+ %% If Constraint is not empty make an inlined type
+ %% convert INSTANCE OF to the associated type
+ IOFDef=check_instance_of(S,DefinedObjectClass,Constraint),
+ TempNewDef#newt{type=IOFDef,
+ tag=merge_tags(Tag,?TAG_CONSTRUCTED(?N_INSTANCE_OF))};
+ {'ENUMERATED',NamedNumberList} ->
+ TempNewDef#newt{type=
+ {'ENUMERATED',
+ check_enumerated(S,NamedNumberList,Constr)},
+ tag=
+ merge_tags(Tag,?TAG_PRIMITIVE(?N_ENUMERATED))};
+ 'EMBEDDED PDV' ->
+% AssociatedType = asn1_db:dbget(S#state.mname,'EMBEDDED PDV'),
+% CheckedType = check_type(S,Type,
+% AssociatedType#typedef.typespec),
+ put(embedded_pdv,unchecked),
+ TempNewDef#newt{type=
+ #'Externaltypereference'{module=S#state.mname,
+ type='EMBEDDED PDV'},
+ tag=
+ merge_tags(Tag,?TAG_CONSTRUCTED(?N_EMBEDDED_PDV))};
+ 'BOOLEAN'->
+ check_boolean(S,Constr),
+ TempNewDef#newt{tag=
+ merge_tags(Tag,?TAG_PRIMITIVE(?N_BOOLEAN))};
+ 'OCTET STRING' ->
+ check_octetstring(S,Constr),
+ TempNewDef#newt{tag=
+ merge_tags(Tag,?TAG_PRIMITIVE(?N_OCTET_STRING))};
+ 'NumericString' ->
+ check_restrictedstring(S,Def,Constr),
+ TempNewDef#newt{tag=
+ merge_tags(Tag,?TAG_PRIMITIVE(?N_NumericString))};
+ 'TeletexString' ->
+ check_restrictedstring(S,Def,Constr),
+ TempNewDef#newt{tag=
+ merge_tags(Tag,?TAG_PRIMITIVE(?N_TeletexString))};
+ 'VideotexString' ->
+ check_restrictedstring(S,Def,Constr),
+ TempNewDef#newt{tag=
+ merge_tags(Tag,?TAG_PRIMITIVE(?N_VideotexString))};
+ 'UTCTime' ->
+ TempNewDef#newt{tag=
+ merge_tags(Tag,?TAG_PRIMITIVE(?N_UTCTime))};
+ 'GeneralizedTime' ->
+ TempNewDef#newt{tag=
+ merge_tags(Tag,?TAG_PRIMITIVE(?N_GeneralizedTime))};
+ 'GraphicString' ->
+ check_restrictedstring(S,Def,Constr),
+ TempNewDef#newt{tag=
+ merge_tags(Tag,?TAG_PRIMITIVE(?N_GraphicString))};
+ 'VisibleString' ->
+ check_restrictedstring(S,Def,Constr),
+ TempNewDef#newt{tag=
+ merge_tags(Tag,?TAG_PRIMITIVE(?N_VisibleString))};
+ 'GeneralString' ->
+ check_restrictedstring(S,Def,Constr),
+ TempNewDef#newt{tag=
+ merge_tags(Tag,?TAG_PRIMITIVE(?N_GeneralString))};
+ 'PrintableString' ->
+ check_restrictedstring(S,Def,Constr),
+ TempNewDef#newt{tag=
+ merge_tags(Tag,?TAG_PRIMITIVE(?N_PrintableString))};
+ 'IA5String' ->
+ check_restrictedstring(S,Def,Constr),
+ TempNewDef#newt{tag=
+ merge_tags(Tag,?TAG_PRIMITIVE(?N_IA5String))};
+ 'BMPString' ->
+ check_restrictedstring(S,Def,Constr),
+ TempNewDef#newt{tag=
+ merge_tags(Tag,?TAG_PRIMITIVE(?N_BMPString))};
+ 'UniversalString' ->
+ check_restrictedstring(S,Def,Constr),
+ TempNewDef#newt{tag=
+ merge_tags(Tag,?TAG_PRIMITIVE(?N_UniversalString))};
+ 'CHARACTER STRING' ->
+% AssociatedType = asn1_db:dbget(S#state.mname,
+% 'CHARACTER STRING'),
+% CheckedType = check_type(S,Type,
+% AssociatedType#typedef.typespec),
+ put(character_string,unchecked),
+ TempNewDef#newt{type=
+ #'Externaltypereference'{module=S#state.mname,
+ type='CHARACTER STRING'},
+ tag=
+ merge_tags(Tag,?TAG_CONSTRUCTED(?N_CHARACTER_STRING))};
+ Seq when record(Seq,'SEQUENCE') ->
+ RecordName =
+ case TopName of
+ [] ->
+ [Type#typedef.name];
+ _ ->
+ TopName
+ end,
+ {TableCInf,Components} =
+ check_sequence(S#state{recordtopname=
+ RecordName},
+ Type,Seq#'SEQUENCE'.components),
+ TempNewDef#newt{type=Seq#'SEQUENCE'{tablecinf=TableCInf,
+ components=Components},
+ tag=
+ merge_tags(Tag,?TAG_CONSTRUCTED(?N_SEQUENCE))};
+ {'SEQUENCE OF',Components} ->
+ TempNewDef#newt{type={'SEQUENCE OF',check_sequenceof(S,Type,Components)},
+ tag=
+ merge_tags(Tag,?TAG_CONSTRUCTED(?N_SEQUENCE))};
+ {'CHOICE',Components} ->
+ Ct = maybe_illicit_implicit_tag(choice,Tag),
+ TempNewDef#newt{type={'CHOICE',check_choice(S,Type,Components)},tag=Ct};
+ Set when record(Set,'SET') ->
+ RecordName=
+ case TopName of
+ [] ->
+ [Type#typedef.name];
+ _ ->
+ TopName
+ end,
+ {Sorted,TableCInf,Components} =
+ check_set(S#state{recordtopname=RecordName},
+ Type,Set#'SET'.components),
+ TempNewDef#newt{type=Set#'SET'{sorted=Sorted,
+ tablecinf=TableCInf,
+ components=Components},
+ tag=
+ merge_tags(Tag,?TAG_CONSTRUCTED(?N_SET))};
+ {'SET OF',Components} ->
+ TempNewDef#newt{type={'SET OF',check_setof(S,Type,Components)},
+ tag=
+ merge_tags(Tag,?TAG_CONSTRUCTED(?N_SET))};
+ %% This is a temporary hack until the full Information Obj Spec
+ %% in X.681 is supported
+ {{typereference,_,'TYPE-IDENTIFIER'},[{typefieldreference,_,'Type'}]} ->
+ Ct=maybe_illicit_implicit_tag(open_type,Tag),
+ TempNewDef#newt{type='ASN1_OPEN_TYPE',tag=Ct};
+
+ {#'Externaltypereference'{type='TYPE-IDENTIFIER'},
+ [{typefieldreference,_,'Type'}]} ->
+ Ct=maybe_illicit_implicit_tag(open_type,Tag),
+ TempNewDef#newt{type='ASN1_OPEN_TYPE',tag=Ct};
+
+ {pt,Ptype,ParaList} ->
+ %% Ptype might be a parameterized - type, object set or
+ %% value set. If it isn't a parameterized type notify the
+ %% calling function.
+ {_,Ptypedef} = get_referenced_type(S,Ptype),
+ notify_if_not_ptype(S,Ptypedef),
+ NewParaList = [match_parameters(TmpParam,S#state.parameters)||
+ TmpParam <- ParaList],
+ Instance = instantiate_ptype(S,Ptypedef,NewParaList),
+ TempNewDef#newt{type=Instance#type.def,
+ tag=merge_tags(Tag,Instance#type.tag),
+ constraint=Instance#type.constraint,
+ inlined=yes};
+
+% {ClRef,FieldRefList} when record(ClRef,'Externaltypereference') ->
+ OCFT=#'ObjectClassFieldType'{class=ClRef} ->
+ %% this case occures in a SEQUENCE when
+ %% the type of the component is a ObjectClassFieldType
+ ClassSpec = check_class(S,ClRef),
+ NewTypeDef = maybe_open_type(S,ClassSpec,OCFT,Constr),
+ InnerTag = get_innertag(S,NewTypeDef),
+ MergedTag = merge_tags(Tag,InnerTag),
+ Ct =
+ case is_open_type(NewTypeDef) of
+ true ->
+ maybe_illicit_implicit_tag(open_type,MergedTag);
+ _ ->
+ MergedTag
+ end,
+ TempNewDef#newt{type=NewTypeDef,tag=Ct};
+ {valueset,Vtype} ->
+ TempNewDef#newt{type={valueset,check_type(S,Type,Vtype)}};
+ Other ->
+ exit({'cant check' ,Other})
+ end,
+ Ts2 = case NewDef of
+ #newt{type=unchanged} ->
+ Ts#type{def=Def};
+ #newt{type=TDef}->
+ Ts#type{def=TDef}
+ end,
+ NewTag = case NewDef of
+ #newt{tag=unchanged} ->
+ Tag;
+ #newt{tag=TT} ->
+ TT
+ end,
+ T3 = Ts2#type{tag = lists:map(fun(TempTag = #tag{type={default,TTx}}) ->
+ TempTag#tag{type=TTx};
+ (Else) -> Else end, NewTag)},
+ T4 = case NewDef of
+ #newt{constraint=unchanged} ->
+ T3#type{constraint=Constr};
+ #newt{constraint=NewConstr} ->
+ T3#type{constraint=NewConstr}
+ end,
+ T5 = T4#type{inlined=NewDef#newt.inlined},
+ T5#type{constraint=check_constraints(S,T5#type.constraint)}.
+
+
+get_innertag(_S,#'ObjectClassFieldType'{type=Type}) ->
+ case Type of
+ #type{tag=Tag} -> Tag;
+ {fixedtypevaluefield,_,#type{tag=Tag}} -> Tag;
+ {TypeFieldName,_} when atom(TypeFieldName) -> [];
+ _ -> []
+ end;
+get_innertag(_S,_) ->
+ [].
+
+is_class(_S,#classdef{}) ->
+ true;
+is_class(S,#typedef{typespec=#type{def=Eref}})
+ when record(Eref,'Externaltypereference')->
+ {_,NextDef} = get_referenced_type(S,Eref),
+ is_class(S,NextDef);
+is_class(_,_) ->
+ false.
+
+get_class_def(_S,CD=#classdef{}) ->
+ CD;
+get_class_def(S,#typedef{typespec=#type{def=Eref}})
+ when record(Eref,'Externaltypereference') ->
+ {_,NextDef} = get_referenced_type(S,Eref),
+ get_class_def(S,NextDef).
+
+maybe_illicit_implicit_tag(Kind,Tag) ->
+ case Tag of
+ [#tag{type='IMPLICIT'}|_T] ->
+ throw({error,{asn1,{implicit_tag_before,Kind}}});
+ [ChTag = #tag{type={default,_}}|T] ->
+ case Kind of
+ open_type ->
+ [ChTag#tag{type='EXPLICIT',form=32}|T]; %X.680 30.6c, X.690 8.14.2
+ choice ->
+ [ChTag#tag{type='EXPLICIT',form=32}|T] % X.680 28.6 c, 30.6c
+ end;
+ _ ->
+ Tag % unchanged
+ end.
+
+%% maybe_open_type/2 -> {ClassSpec,FieldRefList} | 'ASN1_OPEN_TYPE'
+%% if the FieldRefList points out a typefield and the class don't have
+%% any UNIQUE field, so that a component relation constraint cannot specify
+%% the type of a typefield, return 'ASN1_OPEN_TYPE', otherwise return
+%% {ClassSpec,FieldRefList}.
+maybe_open_type(S,ClassSpec=#objectclass{fields=Fs},
+ OCFT=#'ObjectClassFieldType'{fieldname=FieldRefList},
+ Constr) ->
+ Type = get_ObjectClassFieldType(S,Fs,FieldRefList),
+ FieldNames=get_referenced_fieldname(FieldRefList),
+ case lists:last(FieldRefList) of
+ {valuefieldreference,_} ->
+ OCFT#'ObjectClassFieldType'{class=ClassSpec,
+ fieldname=FieldNames,
+ type=Type};
+ {typefieldreference,_} ->
+ case {catch get_unique_fieldname(#classdef{typespec=ClassSpec}),
+ asn1ct_gen:get_constraint(Constr,componentrelation)}of
+ {Tuple,_} when tuple(Tuple) ->
+ OCFT#'ObjectClassFieldType'{class=ClassSpec,
+ fieldname=FieldNames,
+ type='ASN1_OPEN_TYPE'};
+ {_,no} ->
+ OCFT#'ObjectClassFieldType'{class=ClassSpec,
+ fieldname=FieldNames,
+ type='ASN1_OPEN_TYPE'};
+ _ ->
+ OCFT#'ObjectClassFieldType'{class=ClassSpec,
+ fieldname=FieldNames,
+ type=Type}
+ end
+ end.
+
+is_open_type(#'ObjectClassFieldType'{type='ASN1_OPEN_TYPE'}) ->
+ true;
+is_open_type(#'ObjectClassFieldType'{}) ->
+ false.
+
+
+notify_if_not_ptype(S,#pvaluesetdef{type=Type}) ->
+ case Type#type.def of
+ Ref when record(Ref,'Externaltypereference') ->
+ case get_referenced_type(S,Ref) of
+ {_,#classdef{}} ->
+ throw(pobjectsetdef);
+ {_,#typedef{}} ->
+ throw(pvalueset)
+ end;
+ T when record(T,type) -> % this must be a value set
+ throw(pvalueset)
+ end;
+notify_if_not_ptype(_S,#ptypedef{}) ->
+ ok.
+
+% fix me
+instantiate_ptype(S,Ptypedef,ParaList) ->
+ #ptypedef{args=Args,typespec=Type} = Ptypedef,
+% Args = get_pt_args(Ptypedef),
+% Type = get_pt_spec(Ptypedef),
+ MatchedArgs = match_args(Args, ParaList, []),
+ NewS = S#state{type=Type,parameters=MatchedArgs,abscomppath=[]},
+ %The abscomppath must be empty since a table constraint in a
+ %parameterized type only can refer to components within the type
+ check_type(NewS, Ptypedef, Type).
+
+get_pt_args(#ptypedef{args=Args}) ->
+ Args;
+get_pt_args(#pvaluesetdef{args=Args}) ->
+ Args;
+get_pt_args(#pvaluedef{args=Args}) ->
+ Args;
+get_pt_args(#pobjectdef{args=Args}) ->
+ Args;
+get_pt_args(#pobjectsetdef{args=Args}) ->
+ Args.
+
+get_pt_spec(#ptypedef{typespec=Type}) ->
+ Type;
+get_pt_spec(#pvaluedef{value=Value}) ->
+ Value;
+get_pt_spec(#pvaluesetdef{valueset=VS}) ->
+ VS;
+get_pt_spec(#pobjectdef{def=Def}) ->
+ Def;
+get_pt_spec(#pobjectsetdef{def=Def}) ->
+ Def.
+
+
+
+match_args([FormArg|Ft], [ActArg|At], Acc) ->
+ match_args(Ft, At, [{FormArg,ActArg}|Acc]);
+match_args([], [], Acc) ->
+ lists:reverse(Acc);
+match_args(_, _, _) ->
+ throw({error,{asn1,{wrong_number_of_arguments}}}).
+
+check_constraints(S,C) when list(C) ->
+ check_constraints(S, C, []);
+check_constraints(S,C) when record(C,constraint) ->
+ check_constraints(S, C#constraint.c, []).
+
+
+resolv_tuple_or_list(S,List) when list(List) ->
+ lists:map(fun(X)->resolv_value(S,X) end, List);
+resolv_tuple_or_list(S,{Lb,Ub}) ->
+ {resolv_value(S,Lb),resolv_value(S,Ub)}.
+
+%%%-----------------------------------------
+%% If the constraint value is a defined value the valuename
+%% is replaced by the actual value
+%%
+resolv_value(S,Val) ->
+ case match_parameters(Val, S#state.parameters) of
+ Id -> % unchanged
+ resolv_value1(S,Id);
+ Other ->
+ resolv_value(S,Other)
+ end.
+
+resolv_value1(S = #state{mname=M,inputmodules=InpMods},
+ V=#'Externalvaluereference'{pos=Pos,module=ExtM,value=Name}) ->
+ case ExtM of
+ M -> resolv_value2(S,M,Name,Pos);
+ _ ->
+ case lists:member(ExtM,InpMods) of
+ true ->
+ resolv_value2(S,M,Name,Pos);
+ false ->
+ V
+ end
+ end;
+resolv_value1(S,{gt,V}) ->
+ case V of
+ Int when integer(Int) ->
+ V + 1;
+ #valuedef{value=Int} ->
+ 1 + resolv_value(S,Int);
+ Other ->
+ throw({error,{asn1,{undefined_type_or_value,Other}}})
+ end;
+resolv_value1(S,{lt,V}) ->
+ case V of
+ Int when integer(Int) ->
+ V - 1;
+ #valuedef{value=Int} ->
+ resolv_value(S,Int) - 1;
+ Other ->
+ throw({error,{asn1,{undefined_type_or_value,Other}}})
+ end;
+resolv_value1(S,{'ValueFromObject',{object,Object},[{valuefieldreference,
+ FieldName}]}) ->
+ %% FieldName can hold either a fixed-type value or a variable-type value
+ %% Object is a DefinedObject, i.e. a #'Externaltypereference'
+ {_,ObjTDef} = get_referenced_type(S,Object),
+ TS = check_object(S,ObjTDef,ObjTDef#typedef.typespec),
+ {_,_,Components} = TS#'Object'.def,
+ case lists:keysearch(FieldName,1,Components) of
+ {value,{_,#valuedef{value=Val}}} ->
+ Val;
+ _ ->
+ error({value,"illegal value in constraint",S})
+ end;
+% resolv_value1(S,{'ValueFromObject',{po,Object,Params},FieldName}) ->
+% %% FieldName can hold either a fixed-type value or a variable-type value
+% %% Object is a ParameterizedObject
+resolv_value1(_,V) ->
+ V.
+
+resolv_value2(S,ModuleName,Name,Pos) ->
+ case asn1_db:dbget(ModuleName,Name) of
+ undefined ->
+ case imported(S,Name) of
+ {ok,Imodule} ->
+ {_,V2} = get_referenced(S,Imodule,Name,Pos),
+ V2#valuedef.value;
+ _ ->
+ throw({error,{asn1,{undefined_type_or_value,Name}}})
+ end;
+ Val ->
+ Val#valuedef.value
+ end.
+
+check_constraints(S,[{'ContainedSubtype',Type} | Rest], Acc) ->
+ {_,CTDef} = get_referenced_type(S,Type#type.def),
+ CType = check_type(S,S#state.tname,CTDef#typedef.typespec),
+ check_constraints(S,Rest,CType#type.constraint ++ Acc);
+check_constraints(S,[C | Rest], Acc) ->
+ check_constraints(S,Rest,[check_constraint(S,C) | Acc]);
+check_constraints(S,[],Acc) ->
+% io:format("Acc: ~p~n",[Acc]),
+ C = constraint_merge(S,lists:reverse(Acc)),
+% io:format("C: ~p~n",[C]),
+ lists:flatten(C).
+
+
+range_check(F={FixV,FixV}) ->
+% FixV;
+ F;
+range_check(VR={Lb,Ub}) when Lb < Ub ->
+ VR;
+range_check(Err={_,_}) ->
+ throw({error,{asn1,{illegal_size_constraint,Err}}});
+range_check(Value) ->
+ Value.
+
+check_constraint(S,Ext) when record(Ext,'Externaltypereference') ->
+ check_externaltypereference(S,Ext);
+
+
+check_constraint(S,{'SizeConstraint',{Lb,Ub}})
+ when list(Lb);tuple(Lb),size(Lb)==2 ->
+ case Lb of
+ #'Externalvaluereference'{} ->
+ check_constraint(S,{'SizeConstraint',{resolv_value(S,Lb),Ub}});
+ _ ->
+ NewLb = range_check(resolv_tuple_or_list(S,Lb)),
+ NewUb = range_check(resolv_tuple_or_list(S,Ub)),
+ {'SizeConstraint',{NewLb,NewUb}}
+ end;
+check_constraint(S,{'SizeConstraint',{Lb,Ub}}) ->
+ case {resolv_value(S,Lb),resolv_value(S,Ub)} of
+ {FixV,FixV} ->
+ {'SizeConstraint',FixV};
+ {Low,High} when Low < High ->
+ {'SizeConstraint',{Low,High}};
+ Err ->
+ throw({error,{asn1,{illegal_size_constraint,Err}}})
+ end;
+check_constraint(S,{'SizeConstraint',Lb}) ->
+ {'SizeConstraint',resolv_value(S,Lb)};
+
+check_constraint(S,{'SingleValue', L}) when list(L) ->
+ F = fun(A) -> resolv_value(S,A) end,
+ {'SingleValue',lists:map(F,L)};
+
+check_constraint(S,{'SingleValue', V}) when integer(V) ->
+ Val = resolv_value(S,V),
+%% [{'SingleValue',Val},{'ValueRange',{Val,Val}}]; % Why adding value range?
+ {'SingleValue',Val};
+check_constraint(S,{'SingleValue', V}) ->
+ {'SingleValue',resolv_value(S,V)};
+
+check_constraint(S,{'ValueRange', {Lb, Ub}}) ->
+ {'ValueRange',{resolv_value(S,Lb),resolv_value(S,Ub)}};
+
+%%check_constraint(S,{'ContainedSubtype',Type}) ->
+%% #typedef{typespec=TSpec} =
+%% check_type(S,S#state.tname,get_referenced_type(S,Type#type.def)),
+%% [C] = TSpec#type.constraint,
+%% C;
+
+check_constraint(S,{valueset,Type}) ->
+ {valueset,check_type(S,S#state.tname,Type)};
+
+check_constraint(S,{simpletable,Type}) ->
+ OSName = (Type#type.def)#'Externaltypereference'.type,
+ C = match_parameters(Type#type.def,S#state.parameters),
+ case C of
+ #'Externaltypereference'{} ->
+ Type#type{def=check_externaltypereference(S,C)},
+ {simpletable,OSName};
+ _ ->
+ check_type(S,S#state.tname,Type),
+ {simpletable,OSName}
+ end;
+
+check_constraint(S,{componentrelation,{objectset,Opos,Objset},Id}) ->
+ %% Objset is an 'Externaltypereference' record, since Objset is
+ %% a DefinedObjectSet.
+ RealObjset = match_parameters(Objset,S#state.parameters),
+ Ext = check_externaltypereference(S,RealObjset),
+ {componentrelation,{objectset,Opos,Ext},Id};
+
+check_constraint(S,Type) when record(Type,type) ->
+ #type{def=Def} = check_type(S,S#state.tname,Type),
+ Def;
+
+check_constraint(S,C) when list(C) ->
+ lists:map(fun(X)->check_constraint(S,X) end,C);
+% else keep the constraint unchanged
+check_constraint(_S,Any) ->
+% io:format("Constraint = ~p~n",[Any]),
+ Any.
+
+%% constraint_merge/2
+%% Compute the intersection of the outermost level of the constraint list.
+%% See Dubuisson second paragraph and fotnote on page 285.
+%% If constraints with extension are included in combined constraints. The
+%% resulting combination will have the extension of the last constraint. Thus,
+%% there will be no extension if the last constraint is without extension.
+%% The rootset of all constraints are considered in the "outermoust
+%% intersection". See section 13.1.2 in Dubuisson.
+constraint_merge(_S,C=[H])when tuple(H) ->
+ C;
+constraint_merge(_S,[]) ->
+ [];
+constraint_merge(S,C) ->
+ %% skip all extension but the last
+ C1 = filter_extensions(C),
+ %% perform all internal level intersections, intersections first
+ %% since they have precedence over unions
+ C2 = lists:map(fun(X)when list(X)->constraint_intersection(S,X);
+ (X) -> X end,
+ C1),
+ %% perform all internal level unions
+ C3 = lists:map(fun(X)when list(X)->constraint_union(S,X);
+ (X) -> X end,
+ C2),
+
+ %% now get intersection of the outermost level
+ %% get the least common single value constraint
+ SVs = get_constraints(C3,'SingleValue'),
+ CombSV = intersection_of_sv(S,SVs),
+ %% get the least common value range constraint
+ VRs = get_constraints(C3,'ValueRange'),
+ CombVR = intersection_of_vr(S,VRs),
+ %% get the least common size constraint
+ SZs = get_constraints(C3,'SizeConstraint'),
+ CombSZ = intersection_of_size(S,SZs),
+ CminusSVs=ordsets:subtract(ordsets:from_list(C3),ordsets:from_list(SVs)),
+ % CminusSVsVRs = ordsets:subtract(ordsets:from_list(CminusSVs),
+% ordsets:from_list(VRs)),
+ RestC = ordsets:subtract(ordsets:from_list(CminusSVs),
+ ordsets:from_list(SZs)),
+ %% get the least common combined constraint. That is the union of each
+ %% deep costraint and merge of single value and value range constraints
+ combine_constraints(S,CombSV,CombVR,CombSZ++RestC).
+
+%% constraint_union(S,C) takes a list of constraints as input and
+%% merge them to a union. Unions are performed when two
+%% constraints is found with an atom union between.
+%% The list may be nested. Fix that later !!!
+constraint_union(_S,[]) ->
+ [];
+constraint_union(_S,C=[_E]) ->
+ C;
+constraint_union(S,C) when list(C) ->
+ case lists:member(union,C) of
+ true ->
+ constraint_union1(S,C,[]);
+ _ ->
+ C
+ end;
+% SV = get_constraints(C,'SingleValue'),
+% SV1 = constraint_union_sv(S,SV),
+% VR = get_constraints(C,'ValueRange'),
+% VR1 = constraint_union_vr(VR),
+% RestC = ordsets:filter(fun({'SingleValue',_})->false;
+% ({'ValueRange',_})->false;
+% (_) -> true end,ordsets:from_list(C)),
+% SV1++VR1++RestC;
+constraint_union(_S,C) ->
+ [C].
+
+constraint_union1(S,[A={'ValueRange',_},union,B={'ValueRange',_}|Rest],Acc) ->
+ AunionB = constraint_union_vr([A,B]),
+ constraint_union1(S,Rest,AunionB++Acc);
+constraint_union1(S,[A={'SingleValue',_},union,B={'SingleValue',_}|Rest],Acc) ->
+ AunionB = constraint_union_sv(S,[A,B]),
+ constraint_union1(S,Rest,AunionB++Acc);
+constraint_union1(S,[A={'SingleValue',_},union,B={'ValueRange',_}|Rest],Acc) ->
+ AunionB = union_sv_vr(S,A,B),
+ constraint_union1(S,Rest,AunionB++Acc);
+constraint_union1(S,[A={'ValueRange',_},union,B={'SingleValue',_}|Rest],Acc) ->
+ AunionB = union_sv_vr(S,B,A),
+ constraint_union1(S,Rest,AunionB++Acc);
+constraint_union1(S,[union|Rest],Acc) -> %skip when unsupported constraints
+ constraint_union1(S,Rest,Acc);
+constraint_union1(S,[A|Rest],Acc) ->
+ constraint_union1(S,Rest,[A|Acc]);
+constraint_union1(_S,[],Acc) ->
+ lists:reverse(Acc).
+
+constraint_union_sv(_S,SV) ->
+ Values=lists:map(fun({_,V})->V end,SV),
+ case ordsets:from_list(Values) of
+ [] -> [];
+ [N] -> [{'SingleValue',N}];
+ L -> [{'SingleValue',L}]
+ end.
+
+%% REMOVE????
+%%constraint_union(S,VR,'ValueRange') ->
+%% constraint_union_vr(VR).
+
+%% constraint_union_vr(VR)
+%% VR = [{'ValueRange',{Lb,Ub}},...]
+%% Lb = 'MIN' | integer()
+%% Ub = 'MAX' | integer()
+%% Returns if possible only one ValueRange tuple with a range that
+%% is a union of all ranges in VR.
+constraint_union_vr(VR) ->
+ %% Sort VR by Lb in first hand and by Ub in second hand
+ Fun=fun({_,{'MIN',_B1}},{_,{A2,_B2}}) when integer(A2)->true;
+ ({_,{A1,_B1}},{_,{'MAX',_B2}}) when integer(A1) -> true;
+ ({_,{A1,_B1}},{_,{A2,_B2}}) when integer(A1),integer(A2),A1<A2 -> true;
+ ({_,{A,B1}},{_,{A,B2}}) when B1=<B2->true;
+ (_,_)->false end,
+ constraint_union_vr(lists:usort(Fun,VR),[]).
+
+constraint_union_vr([],Acc) ->
+ lists:reverse(Acc);
+constraint_union_vr([C|Rest],[]) ->
+ constraint_union_vr(Rest,[C]);
+constraint_union_vr([{_,{Lb,Ub2}}|Rest],[{_,{Lb,_Ub1}}|Acc]) -> %Ub2 > Ub1
+ constraint_union_vr(Rest,[{'ValueRange',{Lb,Ub2}}|Acc]);
+constraint_union_vr([{_,{_,Ub}}|Rest],A=[{_,{_,Ub}}|_Acc]) ->
+ constraint_union_vr(Rest,A);
+constraint_union_vr([{_,{Lb2,Ub2}}|Rest],[{_,{Lb1,Ub1}}|Acc]) when Lb2=<Ub1,
+ Ub2>Ub1->
+ constraint_union_vr(Rest,[{'ValueRange',{Lb1,Ub2}}|Acc]);
+constraint_union_vr([{_,{_,Ub2}}|Rest],A=[{_,{_,Ub1}}|_Acc]) when Ub2=<Ub1->
+ constraint_union_vr(Rest,A);
+constraint_union_vr([VR|Rest],Acc) ->
+ constraint_union_vr(Rest,[VR|Acc]).
+
+union_sv_vr(_S,[],B) ->
+ [B];
+union_sv_vr(_S,A,[]) ->
+ [A];
+union_sv_vr(_S,C1={'SingleValue',SV},C2={'ValueRange',VR={Lb,Ub}})
+ when integer(SV) ->
+ case is_int_in_vr(SV,C2) of
+ true -> [C2];
+ _ ->
+ case VR of
+ {'MIN',Ub} when SV==Ub+1 -> [{'ValueRange',{'MIN',SV}}];
+ {Lb,'MAX'} when SV==Lb-1 -> [{'ValueRange',{SV,'MAX'}}];
+ {Lb,Ub} when SV==Ub+1 -> [{'ValueRange',{Lb,SV}}];
+ {Lb,Ub} when SV==Lb-1 -> [{'ValueRange',{SV,Ub}}];
+ _ ->
+ [C1,C2]
+ end
+ end;
+union_sv_vr(_S,C1={'SingleValue',SV},C2={'ValueRange',{_Lb,_Ub}})
+ when list(SV) ->
+ case lists:filter(fun(X)->is_int_in_vr(X,C2) end,SV) of
+ [] -> [C2];
+ L ->
+ case expand_vr(L,C2) of
+ {[],C3} -> [C3];
+ {L,C2} -> [C1,C2];
+ {[Val],C3} -> [{'SingleValue',Val},C3];
+ {L2,C3} -> [{'SingleValue',L2},C3]
+ end
+ end.
+
+expand_vr(L,VR={_,{Lb,Ub}}) ->
+ case lower_Lb(L,Lb) of
+ false ->
+ case higher_Ub(L,Ub) of
+ false ->
+ {L,VR};
+ {L1,UbNew} ->
+ expand_vr(L1,{'ValueRange',{Lb,UbNew}})
+ end;
+ {L1,LbNew} ->
+ expand_vr(L1,{'ValueRange',{LbNew,Ub}})
+ end.
+
+lower_Lb(_,'MIN') ->
+ false;
+lower_Lb(L,Lb) ->
+ remove_val_from_list(Lb - 1,L).
+
+higher_Ub(_,'MAX') ->
+ false;
+higher_Ub(L,Ub) ->
+ remove_val_from_list(Ub + 1,L).
+
+remove_val_from_list(List,Val) ->
+ case lists:member(Val,List) of
+ true ->
+ {lists:delete(Val,List),Val};
+ false ->
+ false
+ end.
+
+%% get_constraints/2
+%% Arguments are a list of constraints, which has the format {key,value},
+%% and a constraint type
+%% Returns a list of constraints only of the requested type or the atom
+%% 'no' if no such constraints were found
+get_constraints(L=[{CType,_}],CType) ->
+ L;
+get_constraints(C,CType) ->
+ keysearch_allwithkey(CType,1,C).
+
+%% keysearch_allwithkey(Key,Ix,L)
+%% Types:
+%% Key = atom()
+%% Ix = integer()
+%% L = [TwoTuple]
+%% TwoTuple = [{atom(),term()}|...]
+%% Returns a List that contains all
+%% elements from L that has a key Key as element Ix
+keysearch_allwithkey(Key,Ix,L) ->
+ lists:filter(fun(X) when tuple(X) ->
+ case element(Ix,X) of
+ Key -> true;
+ _ -> false
+ end;
+ (_) -> false
+ end, L).
+
+
+%% filter_extensions(C)
+%% takes a list of constraints as input and
+%% returns a list with the intersection of all extension roots
+%% and only the extension of the last constraint kept if any
+%% extension in the last constraint
+filter_extensions([]) ->
+ [];
+filter_extensions(C=[_H]) ->
+ C;
+filter_extensions(C) when list(C) ->
+ filter_extensions(C,[]).
+
+filter_extensions([C],Acc) ->
+ lists:reverse([C|Acc]);
+filter_extensions([{C,_E},H2|T],Acc) when tuple(C) ->
+ filter_extensions([H2|T],[C|Acc]);
+filter_extensions([{'SizeConstraint',{A,_B}},H2|T],Acc)
+ when list(A);tuple(A) ->
+ filter_extensions([H2|T],[{'SizeConstraint',A}|Acc]);
+filter_extensions([H1,H2|T],Acc) ->
+ filter_extensions([H2|T],[H1|Acc]).
+
+%% constraint_intersection(S,C) takes a list of constraints as input and
+%% performs intersections. Intersecions are performed when an
+%% atom intersection is found between two constraints.
+%% The list may be nested. Fix that later !!!
+constraint_intersection(_S,[]) ->
+ [];
+constraint_intersection(_S,C=[_E]) ->
+ C;
+constraint_intersection(S,C) when list(C) ->
+% io:format("constraint_intersection: ~p~n",[C]),
+ case lists:member(intersection,C) of
+ true ->
+ constraint_intersection1(S,C,[]);
+ _ ->
+ C
+ end;
+constraint_intersection(_S,C) ->
+ [C].
+
+constraint_intersection1(S,[A,intersection,B|Rest],Acc) ->
+ AisecB = c_intersect(S,A,B),
+ constraint_intersection1(S,Rest,AisecB++Acc);
+constraint_intersection1(S,[A|Rest],Acc) ->
+ constraint_intersection1(S,Rest,[A|Acc]);
+constraint_intersection1(_,[],Acc) ->
+ lists:reverse(Acc).
+
+c_intersect(S,C1={'SingleValue',_},C2={'SingleValue',_}) ->
+ intersection_of_sv(S,[C1,C2]);
+c_intersect(S,C1={'ValueRange',_},C2={'ValueRange',_}) ->
+ intersection_of_vr(S,[C1,C2]);
+c_intersect(S,C1={'ValueRange',_},C2={'SingleValue',_}) ->
+ intersection_sv_vr(S,[C2],[C1]);
+c_intersect(S,C1={'SingleValue',_},C2={'ValueRange',_}) ->
+ intersection_sv_vr(S,[C1],[C2]);
+c_intersect(_S,C1,C2) ->
+ [C1,C2].
+
+%% combine_constraints(S,SV,VR,CComb)
+%% Types:
+%% S = record(state,S)
+%% SV = [] | [SVC]
+%% VR = [] | [VRC]
+%% CComb = [] | [Lists]
+%% SVC = {'SingleValue',integer()} | {'SingleValue',[integer(),...]}
+%% VRC = {'ValueRange',{Lb,Ub}}
+%% Lists = List of lists containing any constraint combination
+%% Lb = 'MIN' | integer()
+%% Ub = 'MAX' | integer()
+%% Returns a combination of the least common constraint among SV,VR and all
+%% elements in CComb
+combine_constraints(_S,[],VR,CComb) ->
+ VR ++ CComb;
+% combine_combined_cnstr(S,VR,CComb);
+combine_constraints(_S,SV,[],CComb) ->
+ SV ++ CComb;
+% combine_combined_cnstr(S,SV,CComb);
+combine_constraints(S,SV,VR,CComb) ->
+ C=intersection_sv_vr(S,SV,VR),
+ C ++ CComb.
+% combine_combined_cnstr(S,C,CComb).
+
+intersection_sv_vr(_,[],_VR) ->
+ [];
+intersection_sv_vr(_,_SV,[]) ->
+ [];
+intersection_sv_vr(_S,[C1={'SingleValue',SV}],[C2={'ValueRange',{_Lb,_Ub}}])
+ when integer(SV) ->
+ case is_int_in_vr(SV,C2) of
+ true -> [C1];
+ _ -> %%error({type,{"asn1 illegal constraint",C1,C2},S})
+ throw({error,{"asn1 illegal constraint",C1,C2}})
+ end;
+intersection_sv_vr(_S,[C1={'SingleValue',SV}],[C2])
+ when list(SV) ->
+ case lists:filter(fun(X)->is_int_in_vr(X,C2) end,SV) of
+ [] ->
+ %%error({type,{"asn1 illegal constraint",C1,C2},S});
+ throw({error,{"asn1 illegal constraint",C1,C2}});
+ [V] -> [{'SingleValue',V}];
+ L -> [{'SingleValue',L}]
+ end.
+
+
+
+intersection_of_size(_,[]) ->
+ [];
+intersection_of_size(_,C=[_SZ]) ->
+ C;
+intersection_of_size(S,[SZ,SZ|Rest]) ->
+ intersection_of_size(S,[SZ|Rest]);
+intersection_of_size(S,C=[C1={_,Int},{_,Range}|Rest])
+ when integer(Int),tuple(Range) ->
+ case Range of
+ {Lb,Ub} when Int >= Lb,
+ Int =< Ub ->
+ intersection_of_size(S,[C1|Rest]);
+ _ ->
+ throw({error,{asn1,{illegal_size_constraint,C}}})
+ end;
+intersection_of_size(S,[C1={_,Range},C2={_,Int}|Rest])
+ when integer(Int),tuple(Range) ->
+ intersection_of_size(S,[C2,C1|Rest]);
+intersection_of_size(S,[{_,{Lb1,Ub1}},{_,{Lb2,Ub2}}|Rest]) ->
+ Lb=greatest_LB(ordsets:from_list([Lb1,Lb2])),
+ Ub=smallest_UB(ordsets:from_list([Ub1,Ub2])),
+ intersection_of_size(S,[{'SizeConstraint',{Lb,Ub}}|Rest]);
+intersection_of_size(_,SZ) ->
+ throw({error,{asn1,{illegal_size_constraint,SZ}}}).
+
+intersection_of_vr(_,[]) ->
+ [];
+intersection_of_vr(_,VR=[_C]) ->
+ VR;
+intersection_of_vr(S,[{_,{Lb1,Ub1}},{_,{Lb2,Ub2}}|Rest]) ->
+ Lb=greatest_LB(ordsets:from_list([Lb1,Lb2])),
+ Ub=smallest_UB(ordsets:from_list([Ub1,Ub2])),
+ intersection_of_vr(S,[{'ValueRange',{Lb,Ub}}|Rest]);
+intersection_of_vr(_S,VR) ->
+ %%error({type,{asn1,{illegal_value_range_constraint,VR}},S});
+ throw({error,{asn1,{illegal_value_range_constraint,VR}}}).
+
+intersection_of_sv(_,[]) ->
+ [];
+intersection_of_sv(_,SV=[_C]) ->
+ SV;
+intersection_of_sv(S,[SV,SV|Rest]) ->
+ intersection_of_sv(S,[SV|Rest]);
+intersection_of_sv(S,[{_,Int},{_,SV}|Rest]) when integer(Int),
+ list(SV) ->
+ SV2=intersection_of_sv1(S,Int,SV),
+ intersection_of_sv(S,[SV2|Rest]);
+intersection_of_sv(S,[{_,SV},{_,Int}|Rest]) when integer(Int),
+ list(SV) ->
+ SV2=intersection_of_sv1(S,Int,SV),
+ intersection_of_sv(S,[SV2|Rest]);
+intersection_of_sv(S,[{_,SV1},{_,SV2}|Rest]) when list(SV1),
+ list(SV2) ->
+ SV3=common_set(SV1,SV2),
+ intersection_of_sv(S,[SV3|Rest]);
+intersection_of_sv(_S,SV) ->
+ %%error({type,{asn1,{illegal_single_value_constraint,SV}},S}).
+ throw({error,{asn1,{illegal_single_value_constraint,SV}}}).
+
+intersection_of_sv1(_S,Int,SV) when integer(Int),list(SV) ->
+ case lists:member(Int,SV) of
+ true -> {'SingleValue',Int};
+ _ ->
+ %%error({type,{asn1,{illegal_single_value_constraint,Int,SV}},S})
+ throw({error,{asn1,{illegal_single_value_constraint,Int,SV}}})
+ end;
+intersection_of_sv1(_S,SV1,SV2) ->
+ %%error({type,{asn1,{illegal_single_value_constraint,SV1,SV2}},S}).
+ throw({error,{asn1,{illegal_single_value_constraint,SV1,SV2}}}).
+
+greatest_LB([H]) ->
+ H;
+greatest_LB(L) ->
+ greatest_LB1(lists:reverse(L)).
+greatest_LB1(['MIN',H2|_T])->
+ H2;
+greatest_LB1([H|_T]) ->
+ H.
+smallest_UB(L) ->
+ hd(L).
+
+common_set(SV1,SV2) ->
+ lists:filter(fun(X)->lists:member(X,SV1) end,SV2).
+
+is_int_in_vr(Int,{_,{'MIN','MAX'}}) when integer(Int) ->
+ true;
+is_int_in_vr(Int,{_,{'MIN',Ub}}) when integer(Int),Int =< Ub ->
+ true;
+is_int_in_vr(Int,{_,{Lb,'MAX'}}) when integer(Int),Int >= Lb ->
+ true;
+is_int_in_vr(Int,{_,{Lb,Ub}}) when integer(Int),Int >= Lb,Int =< Ub ->
+ true;
+is_int_in_vr(_,_) ->
+ false.
+
+
+
+check_imported(_S,Imodule,Name) ->
+ case asn1_db:dbget(Imodule,'MODULE') of
+ undefined ->
+ io:format("~s.asn1db not found~n",[Imodule]),
+ io:format("Type ~s imported from non existing module ~s~n",[Name,Imodule]);
+ Im when record(Im,module) ->
+ case is_exported(Im,Name) of
+ false ->
+ io:format("Imported type ~s not exported from module ~s~n",[Name,Imodule]);
+ _ ->
+ ok
+ end
+ end,
+ ok.
+
+is_exported(Module,Name) when record(Module,module) ->
+ {exports,Exports} = Module#module.exports,
+ case Exports of
+ all ->
+ true;
+ [] ->
+ false;
+ L when list(L) ->
+ case lists:keysearch(Name,#'Externaltypereference'.type,Exports) of
+ false -> false;
+ _ -> true
+ end
+ end.
+
+
+
+check_externaltypereference(S,Etref=#'Externaltypereference'{module=Emod})->
+ Currmod = S#state.mname,
+ MergedMods = S#state.inputmodules,
+ case Emod of
+ Currmod ->
+ %% reference to current module or to imported reference
+ check_reference(S,Etref);
+ _ ->
+ %% io:format("Type ~s IMPORTED FROM ~s~n",[Etype,Emod]),
+ case lists:member(Emod,MergedMods) of
+ true ->
+ check_reference(S,Etref);
+ false ->
+ Etref
+ end
+ end.
+
+check_reference(S,#'Externaltypereference'{pos=Pos,module=Emod,type=Name}) ->
+ ModName = S#state.mname,
+ case asn1_db:dbget(ModName,Name) of
+ undefined ->
+ case imported(S,Name) of
+ {ok,Imodule} ->
+ check_imported(S,Imodule,Name),
+ #'Externaltypereference'{module=Imodule,type=Name};
+ _ ->
+ %may be a renamed type in multi file compiling!
+ {_,T}=renamed_reference(S,Name,Emod),
+ NewName = asn1ct:get_name_of_def(T),
+ NewPos = asn1ct:get_pos_of_def(T),
+ #'Externaltypereference'{pos=NewPos,
+ module=ModName,
+ type=NewName}
+ end;
+ _ ->
+ %% cannot do check_type here due to recursive definitions, like
+ %% S ::= SEQUENCE {a INTEGER, b S}. This implies that references
+ %% that appear before the definition will be an
+ %% Externaltypereference in the abstract syntax tree
+ #'Externaltypereference'{pos=Pos,module=ModName,type=Name}
+ end.
+
+
+name2Extref(_Mod,Name) when record(Name,'Externaltypereference') ->
+ Name;
+name2Extref(Mod,Name) ->
+ #'Externaltypereference'{module=Mod,type=Name}.
+
+get_referenced_type(S,Ext) when record(Ext,'Externaltypereference') ->
+ case match_parameters(Ext, S#state.parameters) of
+ Ext ->
+ #'Externaltypereference'{pos=Pos,module=Emod,type=Etype} = Ext,
+ case S#state.mname of
+ Emod -> % a local reference in this module
+ get_referenced1(S,Emod,Etype,Pos);
+ _ ->% always when multi file compiling
+ case lists:member(Emod,S#state.inputmodules) of
+ true ->
+ get_referenced1(S,Emod,Etype,Pos);
+ false ->
+ get_referenced(S,Emod,Etype,Pos)
+ end
+ end;
+ Other ->
+ {undefined,Other}
+ end;
+get_referenced_type(S=#state{mname=Emod},
+ ERef=#'Externalvaluereference'{pos=P,module=Emod,
+ value=Eval}) ->
+ case match_parameters(ERef,S#state.parameters) of
+ ERef ->
+ get_referenced1(S,Emod,Eval,P);
+ OtherERef when record(OtherERef,'Externalvaluereference') ->
+ get_referenced_type(S,OtherERef);
+ Value ->
+ {Emod,Value}
+ end;
+get_referenced_type(S,ERef=#'Externalvaluereference'{pos=Pos,module=Emod,
+ value=Eval}) ->
+ case match_parameters(ERef,S#state.parameters) of
+ ERef ->
+ case lists:member(Emod,S#state.inputmodules) of
+ true ->
+ get_referenced1(S,Emod,Eval,Pos);
+ false ->
+ get_referenced(S,Emod,Eval,Pos)
+ end;
+ OtherERef ->
+ get_referenced_type(S,OtherERef)
+ end;
+get_referenced_type(S,#identifier{val=Name,pos=Pos}) ->
+ get_referenced1(S,undefined,Name,Pos);
+get_referenced_type(_S,Type) ->
+ {undefined,Type}.
+
+%% get_referenced/3
+%% The referenced entity Ename may in case of an imported parameterized
+%% type reference imported entities in the other module, which implies that
+%% asn1_db:dbget will fail even though the referenced entity exists. Thus
+%% Emod may be the module that imports the entity Ename and not holds the
+%% data about Ename.
+get_referenced(S,Emod,Ename,Pos) ->
+ case asn1_db:dbget(Emod,Ename) of
+ undefined ->
+ %% May be an imported entity in module Emod
+% throw({error,{asn1,{undefined_type_or_value,{Emod,Ename}}}});
+ NewS = S#state{module=asn1_db:dbget(Emod,'MODULE')},
+ get_imported(NewS,Ename,Emod,Pos);
+ T when record(T,typedef) ->
+ Spec = T#typedef.typespec,
+ case Spec#type.def of
+ Tref when record(Tref,typereference) ->
+ Def = #'Externaltypereference'{module=Emod,
+ type=Tref#typereference.val,
+ pos=Tref#typereference.pos},
+
+
+ {Emod,T#typedef{typespec=Spec#type{def=Def}}};
+ _ ->
+ {Emod,T} % should add check that T is exported here
+ end;
+ V -> {Emod,V}
+ end.
+
+get_referenced1(S,ModuleName,Name,Pos) ->
+ case asn1_db:dbget(S#state.mname,Name) of
+ undefined ->
+ %% ModuleName may be other than S#state.mname when
+ %% multi file compiling is used.
+ get_imported(S,Name,ModuleName,Pos);
+ T ->
+ {S#state.mname,T}
+ end.
+
+get_imported(S,Name,Module,Pos) ->
+ case imported(S,Name) of
+ {ok,Imodule} ->
+ case asn1_db:dbget(Imodule,'MODULE') of
+ undefined ->
+ throw({error,{asn1,{module_not_found,Imodule}}});
+ Im when record(Im,module) ->
+ case is_exported(Im,Name) of
+ false ->
+ throw({error,
+ {asn1,{not_exported,{Im,Name}}}});
+ _ ->
+ get_referenced_type(S,
+ #'Externaltypereference'
+ {module=Imodule,
+ type=Name,pos=Pos})
+ end
+ end;
+ _ ->
+ renamed_reference(S,Name,Module)
+ end.
+
+renamed_reference(S,Name,Module) ->
+ %% first check if there is a renamed type in this module
+ %% second check if any type was imported with this name
+ case ets:info(renamed_defs) of
+ undefined -> throw({error,{asn1,{undefined_type,Name}}});
+ _ ->
+ case ets:match(renamed_defs,{'$1',Name,Module}) of
+ [] ->
+ case ets:info(original_imports) of
+ undefined ->
+ throw({error,{asn1,{undefined_type,Name}}});
+ _ ->
+ case ets:match(original_imports,{Module,'$1'}) of
+ [] ->
+ throw({error,{asn1,{undefined_type,Name}}});
+ [[ImportsList]] ->
+ case get_importmoduleoftype(ImportsList,Name) of
+ undefined ->
+ throw({error,{asn1,{undefined_type,Name}}});
+ NextMod ->
+ renamed_reference(S,Name,NextMod)
+ end
+ end
+ end;
+ [[NewTypeName]] ->
+ get_referenced1(S,Module,NewTypeName,undefined)
+ end
+ end.
+
+get_importmoduleoftype([I|Is],Name) ->
+ Index = #'Externaltypereference'.type,
+ case lists:keysearch(Name,Index,I#'SymbolsFromModule'.symbols) of
+ {value,_Ref} ->
+ (I#'SymbolsFromModule'.module)#'Externaltypereference'.type;
+ _ ->
+ get_importmoduleoftype(Is,Name)
+ end;
+get_importmoduleoftype([],_) ->
+ undefined.
+
+
+match_parameters(Name,[]) ->
+ Name;
+
+match_parameters(#'Externaltypereference'{type=Name},[{#'Externaltypereference'{type=Name},NewName}|_T]) ->
+ NewName;
+match_parameters(#'Externaltypereference'{type=Name},[{{_,#'Externaltypereference'{type=Name}},NewName}|_T]) ->
+ NewName;
+% match_parameters(#'Externaltypereference'{type=Name},[{#typereference{val=Name},NewName}|T]) ->
+% NewName;
+% match_parameters(#'Externaltypereference'{type=Name},[{{_,#typereference{val=Name}},NewName}|T]) ->
+% NewName;
+%match_parameters(#typereference{val=Name},[{#typereference{val=Name},NewName}|T]) ->
+% NewName;
+match_parameters(#'Externalvaluereference'{value=Name},[{#'Externalvaluereference'{value=Name},NewName}|_T]) ->
+ NewName;
+match_parameters(#'Externalvaluereference'{value=Name},[{{_,#'Externalvaluereference'{value=Name}},NewName}|_T]) ->
+ NewName;
+% match_parameters(#identifier{val=Name},[{#identifier{val=Name},NewName}|T]) ->
+% NewName;
+% match_parameters(#identifier{val=Name},[{{_,#identifier{val=Name}},NewName}|T]) ->
+% NewName;
+match_parameters({valueset,#type{def=#'Externaltypereference'{type=Name}}},
+ [{{_,#'Externaltypereference'{type=Name}},{valueset,#type{def=NewName}}}|_T]) ->
+ NewName;
+match_parameters({valueset,#type{def=#'Externaltypereference'{type=Name}}},
+ [{{_,#'Externaltypereference'{type=Name}},NewName}|_T]) ->
+ NewName;
+% match_parameters({valueset,#type{def=#'Externaltypereference'{type=Name}}},
+% [{{_,#typereference{val=Name}},{valueset,#type{def=NewName}}}|T]) ->
+% NewName;
+% match_parameters({valueset,#type{def=#'Externaltypereference'{type=Name}}},
+% [{{_,#typereference{val=Name}},NewName}|T]) ->
+% NewName;
+
+match_parameters(Name, [_H|T]) ->
+ %%io:format("match_parameters(~p,~p)~n",[Name,[H|T]]),
+ match_parameters(Name,T).
+
+imported(S,Name) ->
+ {imports,Ilist} = (S#state.module)#module.imports,
+ imported1(Name,Ilist).
+
+imported1(Name,
+ [#'SymbolsFromModule'{symbols=Symlist,
+ module=#'Externaltypereference'{type=ModuleName}}|T]) ->
+ case lists:keysearch(Name,#'Externaltypereference'.type,Symlist) of
+ {value,_V} ->
+ {ok,ModuleName};
+ _ ->
+ imported1(Name,T)
+ end;
+imported1(_Name,[]) ->
+ false.
+
+
+check_integer(_S,[],_C) ->
+ ok;
+check_integer(S,NamedNumberList,_C) ->
+ case check_unique(NamedNumberList,2) of
+ [] ->
+ check_int(S,NamedNumberList,[]);
+ L when list(L) ->
+ error({type,{duplicates,L},S}),
+ unchanged
+
+ end.
+
+check_int(S,[{'NamedNumber',Id,Num}|T],Acc) when integer(Num) ->
+ check_int(S,T,[{Id,Num}|Acc]);
+check_int(S,[{'NamedNumber',Id,{identifier,_,Name}}|T],Acc) ->
+ Val = dbget_ex(S,S#state.mname,Name),
+ check_int(S,[{'NamedNumber',Id,Val#valuedef.value}|T],Acc);
+check_int(_S,[],Acc) ->
+ lists:keysort(2,Acc).
+
+
+
+check_bitstring(_S,[],_Constr) ->
+ [];
+check_bitstring(S,NamedNumberList,_Constr) ->
+ case check_unique(NamedNumberList,2) of
+ [] ->
+ check_bitstr(S,NamedNumberList,[]);
+ L when list(L) ->
+ error({type,{duplicates,L},S}),
+ unchanged
+ end.
+
+check_bitstr(S,[{'NamedNumber',Id,Num}|T],Acc)when integer(Num) ->
+ check_bitstr(S,T,[{Id,Num}|Acc]);
+check_bitstr(S,[{'NamedNumber',Id,Name}|T],Acc) when atom(Name) ->
+%%check_bitstr(S,[{'NamedNumber',Id,{identifier,_,Name}}|T],Acc) ->
+%% io:format("asn1ct_check:check_bitstr/3 hej hop ~w~n",[Name]),
+ Val = dbget_ex(S,S#state.mname,Name),
+%% io:format("asn1ct_check:check_bitstr/3: ~w~n",[Val]),
+ check_bitstr(S,[{'NamedNumber',Id,Val#valuedef.value}|T],Acc);
+check_bitstr(S,[],Acc) ->
+ case check_unique(Acc,2) of
+ [] ->
+ lists:keysort(2,Acc);
+ L when list(L) ->
+ error({type,{duplicate_values,L},S}),
+ unchanged
+ end.
+
+%%check_bitstring(S,NamedNumberList,Constr) ->
+%% NamedNumberList.
+
+%% Check INSTANCE OF
+%% check that DefinedObjectClass is of TYPE-IDENTIFIER class
+%% If Constraint is empty make it the general INSTANCE OF type
+%% If Constraint is not empty make an inlined type
+%% convert INSTANCE OF to the associated type
+check_instance_of(S,DefinedObjectClass,Constraint) ->
+ check_type_identifier(S,DefinedObjectClass),
+ iof_associated_type(S,Constraint).
+
+
+check_type_identifier(_S,'TYPE-IDENTIFIER') ->
+ ok;
+check_type_identifier(S,Eref=#'Externaltypereference'{}) ->
+ case get_referenced_type(S,Eref) of
+ {_,#classdef{name='TYPE-IDENTIFIER'}} -> ok;
+ {_,TD=#typedef{typespec=#type{def=#'Externaltypereference'{}}}} ->
+ check_type_identifier(S,(TD#typedef.typespec)#type.def);
+ _ ->
+ error({type,{"object set in type INSTANCE OF "
+ "not of class TYPE-IDENTIFIER",Eref},S})
+ end.
+
+iof_associated_type(S,[]) ->
+ %% in this case encode/decode functions for INSTANCE OF must be
+ %% generated
+ case get(instance_of) of
+ undefined ->
+ AssociateSeq = iof_associated_type1(S,[]),
+ Tag =
+ case S#state.erule of
+ ber_bin_v2 ->
+ [?TAG_CONSTRUCTED(?N_INSTANCE_OF)];
+ _ -> []
+ end,
+ TypeDef=#typedef{checked=true,
+ name='INSTANCE OF',
+ typespec=#type{tag=Tag,
+ def=AssociateSeq}},
+ asn1_db:dbput(S#state.mname,'INSTANCE OF',TypeDef),
+ put(instance_of,generate);
+ _ ->
+ ok
+ end,
+ #'Externaltypereference'{module=S#state.mname,type='INSTANCE OF'};
+iof_associated_type(S,C) ->
+ iof_associated_type1(S,C).
+
+iof_associated_type1(S,C) ->
+ {TableCInf,Comp1Cnstr,Comp2Cnstr,Comp2tablecinf}=
+ instance_of_constraints(S,C),
+
+ ModuleName = S#state.mname,
+ Typefield_type=
+ case C of
+ [] -> 'ASN1_OPEN_TYPE';
+ _ -> {typefield,'Type'}
+ end,
+ {ObjIdTag,C1TypeTag}=
+ case S#state.erule of
+ ber_bin_v2 ->
+ {[{'UNIVERSAL',8}],
+ [#tag{class='UNIVERSAL',
+ number=6,
+ type='IMPLICIT',
+ form=0}]};
+ _ -> {[{'UNIVERSAL','INTEGER'}],[]}
+ end,
+ TypeIdentifierRef=#'Externaltypereference'{module=ModuleName,
+ type='TYPE-IDENTIFIER'},
+ ObjectIdentifier =
+ #'ObjectClassFieldType'{classname=TypeIdentifierRef,
+ class=[],
+ fieldname={id,[]},
+ type={fixedtypevaluefield,id,
+ #type{def='OBJECT IDENTIFIER'}}},
+ Typefield =
+ #'ObjectClassFieldType'{classname=TypeIdentifierRef,
+ class=[],
+ fieldname={'Type',[]},
+ type=Typefield_type},
+ IOFComponents =
+ [#'ComponentType'{name='type-id',
+ typespec=#type{tag=C1TypeTag,
+ def=ObjectIdentifier,
+ constraint=Comp1Cnstr},
+ prop=mandatory,
+ tags=ObjIdTag},
+ #'ComponentType'{name=value,
+ typespec=#type{tag=[#tag{class='CONTEXT',
+ number=0,
+ type='EXPLICIT',
+ form=32}],
+ def=Typefield,
+ constraint=Comp2Cnstr,
+ tablecinf=Comp2tablecinf},
+ prop=mandatory,
+ tags=[{'CONTEXT',0}]}],
+ #'SEQUENCE'{tablecinf=TableCInf,
+ components=IOFComponents}.
+
+
+%% returns the leading attribute, the constraint of the components and
+%% the tablecinf value for the second component.
+instance_of_constraints(_,[]) ->
+ {false,[],[],[]};
+instance_of_constraints(S,#constraint{c={simpletable,Type}}) ->
+ #type{def=#'Externaltypereference'{type=Name}} = Type,
+ ModuleName = S#state.mname,
+ ObjectSetRef=#'Externaltypereference'{module=ModuleName,
+ type=Name},
+ CRel=[{componentrelation,{objectset,
+ undefined, %% pos
+ ObjectSetRef},
+ [{innermost,
+ [#'Externalvaluereference'{module=ModuleName,
+ value=type}]}]}],
+ TableCInf=#simpletableattributes{objectsetname=Name,
+ c_name='type-id',
+ c_index=1,
+ usedclassfield=id,
+ uniqueclassfield=id,
+ valueindex=[]},
+ {TableCInf,[{simpletable,Name}],CRel,[{objfun,ObjectSetRef}]}.
+
+%% Check ENUMERATED
+%% ****************************************
+%% Check that all values are unique
+%% assign values to un-numbered identifiers
+%% check that the constraints are allowed and correct
+%% put the updated info back into database
+check_enumerated(_S,[{Name,Number}|Rest],_Constr) when atom(Name), integer(Number)->
+ %% already checked , just return the same list
+ [{Name,Number}|Rest];
+check_enumerated(S,NamedNumberList,_Constr) ->
+ check_enum(S,NamedNumberList,[],[]).
+
+%% identifiers are put in Acc2
+%% returns either [{Name,Number}] or {[{Name,Number}],[{ExtName,ExtNumber}]}
+%% the latter is returned if the ENUMERATION contains EXTENSIONMARK
+check_enum(S,[{'NamedNumber',Id,Num}|T],Acc1,Acc2) when integer(Num) ->
+ check_enum(S,T,[{Id,Num}|Acc1],Acc2);
+check_enum(S,[{'NamedNumber',Id,{identifier,_,Name}}|T],Acc1,Acc2) ->
+ Val = dbget_ex(S,S#state.mname,Name),
+ check_enum(S,[{'NamedNumber',Id,Val#valuedef.value}|T],Acc1,Acc2);
+check_enum(S,['EXTENSIONMARK'|T],Acc1,Acc2) ->
+ NewAcc2 = lists:keysort(2,Acc1),
+ NewList = enum_number(lists:reverse(Acc2),NewAcc2,0,[]),
+ { NewList, check_enum(S,T,[],[])};
+check_enum(S,[Id|T],Acc1,Acc2) when atom(Id) ->
+ check_enum(S,T,Acc1,[Id|Acc2]);
+check_enum(_S,[],Acc1,Acc2) ->
+ NewAcc2 = lists:keysort(2,Acc1),
+ enum_number(lists:reverse(Acc2),NewAcc2,0,[]).
+
+
+% assign numbers to identifiers , numbers from 0 ... but must not
+% be the same as already assigned to NamedNumbers
+enum_number([H|T],[{Id,Num}|T2],Cnt,Acc) when Num > Cnt ->
+ enum_number(T,[{Id,Num}|T2],Cnt+1,[{H,Cnt}|Acc]);
+enum_number([H|T],[{Id,Num}|T2],Cnt,Acc) when Num < Cnt -> % negative Num
+ enum_number(T,T2,Cnt+1,[{H,Cnt},{Id,Num}|Acc]);
+enum_number([],L2,_Cnt,Acc) ->
+ lists:concat([lists:reverse(Acc),L2]);
+enum_number(L,[{Id,Num}|T2],Cnt,Acc) -> % Num == Cnt
+ enum_number(L,T2,Cnt+1,[{Id,Num}|Acc]);
+enum_number([H|T],[],Cnt,Acc) ->
+ enum_number(T,[],Cnt+1,[{H,Cnt}|Acc]).
+
+
+check_boolean(_S,_Constr) ->
+ ok.
+
+check_octetstring(_S,_Constr) ->
+ ok.
+
+% check all aspects of a SEQUENCE
+% - that all component names are unique
+% - that all TAGS are ok (when TAG default is applied)
+% - that each component is of a valid type
+% - that the extension marks are valid
+
+check_sequence(S,Type,Comps) ->
+ Components = expand_components(S,Comps),
+ case check_unique([C||C <- Components ,record(C,'ComponentType')]
+ ,#'ComponentType'.name) of
+ [] ->
+ %% sort_canonical(Components),
+ Components2 = maybe_automatic_tags(S,Components),
+ %% check the table constraints from here. The outermost type
+ %% is Type, the innermost is Comps (the list of components)
+ NewComps =
+ case check_each_component(S,Type,Components2) of
+ NewComponents when list(NewComponents) ->
+ check_unique_sequence_tags(S,NewComponents),
+ NewComponents;
+ Ret = {NewComponents,NewEcomps} ->
+ TagComps = NewComponents ++
+ [Comp#'ComponentType'{prop='OPTIONAL'}|| Comp <- NewEcomps],
+ %% extension components are like optionals when it comes to tagging
+ check_unique_sequence_tags(S,TagComps),
+ Ret
+ end,
+ %% CRelInf is the "leading attribute" information
+ %% necessary for code generating of the look up in the
+ %% object set table,
+ %% i.e. getenc_ObjectSet/getdec_ObjectSet.
+ %% {objfun,ERef} tuple added in NewComps2 in tablecinf
+ %% field in type record of component relation constrained
+ %% type
+% io:format("NewComps: ~p~n",[NewComps]),
+ {CRelInf,NewComps2} = componentrelation_leadingattr(S,NewComps),
+% io:format("CRelInf: ~p~n",[CRelInf]),
+% io:format("NewComps2: ~p~n",[NewComps2]),
+ %% CompListWithTblInf has got a lot unecessary info about
+ %% the involved class removed, as the class of the object
+ %% set.
+ CompListWithTblInf = get_tableconstraint_info(S,Type,NewComps2),
+% io:format("CompListWithTblInf: ~p~n",[CompListWithTblInf]),
+ {CRelInf,CompListWithTblInf};
+ Dupl ->
+ throw({error,{asn1,{duplicate_components,Dupl}}})
+ end.
+
+expand_components(S, [{'COMPONENTS OF',Type}|T]) ->
+ CompList =
+ case get_referenced_type(S,Type#type.def) of
+ {_,#typedef{typespec=#type{def=Seq}}} when record(Seq,'SEQUENCE') ->
+ case Seq#'SEQUENCE'.components of
+ {Root,_Ext} -> Root;
+ Root -> Root
+ end;
+ Err -> throw({error,{asn1,{illegal_COMPONENTS_OF,Err}}})
+ end,
+ expand_components(S,CompList) ++ expand_components(S,T);
+expand_components(S,[H|T]) ->
+ [H|expand_components(S,T)];
+expand_components(_,[]) ->
+ [].
+
+check_unique_sequence_tags(S,[#'ComponentType'{prop=mandatory}|Rest]) ->
+ check_unique_sequence_tags(S,Rest);
+check_unique_sequence_tags(S,[C|Rest]) when record(C,'ComponentType') ->
+ check_unique_sequence_tags1(S,Rest,[C]);% optional or default
+check_unique_sequence_tags(S,[_ExtensionMarker|Rest]) ->
+ check_unique_sequence_tags(S,Rest);
+check_unique_sequence_tags(_S,[]) ->
+ true.
+
+check_unique_sequence_tags1(S,[C|Rest],Acc) when record(C,'ComponentType') ->
+ case C#'ComponentType'.prop of
+ mandatory ->
+ check_unique_tags(S,lists:reverse([C|Acc])),
+ check_unique_sequence_tags(S,Rest);
+ _ ->
+ check_unique_sequence_tags1(S,Rest,[C|Acc]) % default or optional
+ end;
+check_unique_sequence_tags1(S,[H|Rest],Acc) ->
+ check_unique_sequence_tags1(S,Rest,[H|Acc]);
+check_unique_sequence_tags1(S,[],Acc) ->
+ check_unique_tags(S,lists:reverse(Acc)).
+
+check_sequenceof(S,Type,Component) when record(Component,type) ->
+ check_type(S,Type,Component).
+
+check_set(S,Type,Components) ->
+ {TableCInf,NewComponents} = check_sequence(S,Type,Components),
+ case lists:member(der,S#state.options) of
+ true when S#state.erule == ber;
+ S#state.erule == ber_bin ->
+ {Sorted,SortedComponents} =
+ sort_components(S#state.tname,
+ (S#state.module)#module.tagdefault,
+ NewComponents),
+ {Sorted,TableCInf,SortedComponents};
+ _ ->
+ {false,TableCInf,NewComponents}
+ end.
+
+sort_components(_TypeName,'AUTOMATIC',Components) ->
+ {true,Components};
+sort_components(TypeName,_TagDefault,Components) ->
+ case untagged_choice(Components) of
+ false ->
+ {true,sort_components1(TypeName,Components,[],[],[],[])};
+ true ->
+ {dynamic,Components} % sort in run-time
+ end.
+
+sort_components1(TypeName,[C=#'ComponentType'{tags=[{'UNIVERSAL',_}|_R]}|Cs],
+ UnivAcc,ApplAcc,ContAcc,PrivAcc) ->
+ sort_components1(TypeName,Cs,[C|UnivAcc],ApplAcc,ContAcc,PrivAcc);
+sort_components1(TypeName,[C=#'ComponentType'{tags=[{'APPLICATION',_}|_R]}|Cs],
+ UnivAcc,ApplAcc,ContAcc,PrivAcc) ->
+ sort_components1(TypeName,Cs,UnivAcc,[C|ApplAcc],ContAcc,PrivAcc);
+sort_components1(TypeName,[C=#'ComponentType'{tags=[{'CONTEXT',_}|_R]}|Cs],
+ UnivAcc,ApplAcc,ContAcc,PrivAcc) ->
+ sort_components1(TypeName,Cs,UnivAcc,ApplAcc,[C|ContAcc],PrivAcc);
+sort_components1(TypeName,[C=#'ComponentType'{tags=[{'PRIVATE',_}|_R]}|Cs],
+ UnivAcc,ApplAcc,ContAcc,PrivAcc) ->
+ sort_components1(TypeName,Cs,UnivAcc,ApplAcc,ContAcc,[C|PrivAcc]);
+sort_components1(TypeName,[],UnivAcc,ApplAcc,ContAcc,PrivAcc) ->
+ I = #'ComponentType'.tags,
+ ascending_order_check(TypeName,sort_universal_type(UnivAcc)) ++
+ ascending_order_check(TypeName,lists:keysort(I,ApplAcc)) ++
+ ascending_order_check(TypeName,lists:keysort(I,ContAcc)) ++
+ ascending_order_check(TypeName,lists:keysort(I,PrivAcc)).
+
+ascending_order_check(TypeName,Components) ->
+ ascending_order_check1(TypeName,Components),
+ Components.
+
+ascending_order_check1(TypeName,
+ [C1 = #'ComponentType'{tags=[{_,T}|_]},
+ C2 = #'ComponentType'{tags=[{_,T}|_]}|Rest]) ->
+ io:format("WARNING: Indistinct tag ~p in SET ~p, components ~p and ~p~n",
+ [T,TypeName,C1#'ComponentType'.name,C2#'ComponentType'.name]),
+ ascending_order_check1(TypeName,[C2|Rest]);
+ascending_order_check1(TypeName,
+ [C1 = #'ComponentType'{tags=[{'UNIVERSAL',T1}|_]},
+ C2 = #'ComponentType'{tags=[{'UNIVERSAL',T2}|_]}|Rest]) ->
+ case (asn1ct_gen_ber:decode_type(T1) == asn1ct_gen_ber:decode_type(T2)) of
+ true ->
+ io:format("WARNING: Indistinct tags ~p and ~p in"
+ " SET ~p, components ~p and ~p~n",
+ [T1,T2,TypeName,C1#'ComponentType'.name,
+ C2#'ComponentType'.name]),
+ ascending_order_check1(TypeName,[C2|Rest]);
+ _ ->
+ ascending_order_check1(TypeName,[C2|Rest])
+ end;
+ascending_order_check1(N,[_|Rest]) ->
+ ascending_order_check1(N,Rest);
+ascending_order_check1(_,[_]) ->
+ ok;
+ascending_order_check1(_,[]) ->
+ ok.
+
+sort_universal_type(Components) ->
+ List = lists:map(fun(C) ->
+ #'ComponentType'{tags=[{_,T}|_]} = C,
+ {asn1ct_gen_ber:decode_type(T),C}
+ end,
+ Components),
+ SortedList = lists:keysort(1,List),
+ lists:map(fun(X)->element(2,X) end,SortedList).
+
+untagged_choice([#'ComponentType'{typespec=#type{tag=[],def={'CHOICE',_}}}|_Rest]) ->
+ true;
+untagged_choice([_|Rest]) ->
+ untagged_choice(Rest);
+untagged_choice([]) ->
+ false.
+
+check_setof(S,Type,Component) when record(Component,type) ->
+ check_type(S,Type,Component).
+
+check_restrictedstring(_S,_Def,_Constr) ->
+ ok.
+
+check_objectidentifier(_S,_Constr) ->
+ ok.
+
+% check all aspects of a CHOICE
+% - that all alternative names are unique
+% - that all TAGS are ok (when TAG default is applied)
+% - that each alternative is of a valid type
+% - that the extension marks are valid
+check_choice(S,Type,Components) when list(Components) ->
+ case check_unique([C||C <- Components,
+ record(C,'ComponentType')],#'ComponentType'.name) of
+ [] ->
+ %% sort_canonical(Components),
+ Components2 = maybe_automatic_tags(S,Components),
+ %NewComps =
+ case check_each_alternative(S,Type,Components2) of
+ {NewComponents,NewEcomps} ->
+ check_unique_tags(S,NewComponents ++ NewEcomps),
+ {NewComponents,NewEcomps};
+ NewComponents ->
+ check_unique_tags(S,NewComponents),
+ NewComponents
+ end;
+%% CompListWithTblInf = get_tableconstraint_info(S,Type,NewComps);
+ Dupl ->
+ throw({error,{asn1,{duplicate_choice_alternatives,Dupl}}})
+ end;
+check_choice(_S,_,[]) ->
+ [].
+
+%% probably dead code that should be removed
+%%maybe_automatic_tags(S,{Rc,Ec}) ->
+%% {maybe_automatic_tags1(S,Rc,0),maybe_automatic_tags1(S,Ec,length(Rc))};
+maybe_automatic_tags(#state{erule=per},C) ->
+ C;
+maybe_automatic_tags(#state{erule=per_bin},C) ->
+ C;
+maybe_automatic_tags(S,C) ->
+ maybe_automatic_tags1(S,C,0).
+
+maybe_automatic_tags1(S,C,TagNo) ->
+ case (S#state.module)#module.tagdefault of
+ 'AUTOMATIC' ->
+ generate_automatic_tags(S,C,TagNo);
+ _ ->
+ %% maybe is the module a multi file module were only some of
+ %% the modules have defaulttag AUTOMATIC TAGS then the names
+ %% of those types are saved in the table automatic_tags
+ Name= S#state.tname,
+ case is_automatic_tagged_in_multi_file(Name) of
+ true ->
+ generate_automatic_tags(S,C,TagNo);
+ false ->
+ C
+ end
+ end.
+
+is_automatic_tagged_in_multi_file(Name) ->
+ case ets:info(automatic_tags) of
+ undefined ->
+ %% this case when not multifile compilation
+ false;
+ _ ->
+ case ets:member(automatic_tags,Name) of
+ true ->
+ true;
+ _ ->
+ false
+ end
+ end.
+
+generate_automatic_tags(_S,C,TagNo) ->
+ case any_manual_tag(C) of
+ true ->
+ C;
+ false ->
+ generate_automatic_tags1(C,TagNo)
+ end.
+
+generate_automatic_tags1([H|T],TagNo) when record(H,'ComponentType') ->
+ #'ComponentType'{typespec=Ts} = H,
+ NewTs = Ts#type{tag=[#tag{class='CONTEXT',
+ number=TagNo,
+ type={default,'IMPLICIT'},
+ form= 0 }]}, % PRIMITIVE
+ [H#'ComponentType'{typespec=NewTs}|generate_automatic_tags1(T,TagNo+1)];
+generate_automatic_tags1([ExtMark|T],TagNo) -> % EXTENSIONMARK
+ [ExtMark | generate_automatic_tags1(T,TagNo)];
+generate_automatic_tags1([],_) ->
+ [].
+
+any_manual_tag([#'ComponentType'{typespec=#type{tag=[]}}|Rest]) ->
+ any_manual_tag(Rest);
+any_manual_tag([{'EXTENSIONMARK',_,_}|Rest]) ->
+ any_manual_tag(Rest);
+any_manual_tag([_|_Rest]) ->
+ true;
+any_manual_tag([]) ->
+ false.
+
+
+check_unique_tags(S,C) ->
+ case (S#state.module)#module.tagdefault of
+ 'AUTOMATIC' ->
+ case any_manual_tag(C) of
+ false -> true;
+ _ -> collect_and_sort_tags(C,[])
+ end;
+ _ ->
+ collect_and_sort_tags(C,[])
+ end.
+
+collect_and_sort_tags([C|Rest],Acc) when record(C,'ComponentType') ->
+ collect_and_sort_tags(Rest,C#'ComponentType'.tags ++ Acc);
+collect_and_sort_tags([_|Rest],Acc) ->
+ collect_and_sort_tags(Rest,Acc);
+collect_and_sort_tags([],Acc) ->
+ {Dupl,_}= lists:mapfoldl(fun(El,El)->{{dup,El},El};(El,_Prev)-> {El,El} end,notag,lists:sort(Acc)),
+ Dupl2 = [Dup|| {dup,Dup} <- Dupl],
+ if
+ length(Dupl2) > 0 ->
+ throw({error,{asn1,{duplicates_of_the_tags,Dupl2}}});
+ true ->
+ true
+ end.
+
+check_unique(L,Pos) ->
+ Slist = lists:keysort(Pos,L),
+ check_unique2(Slist,Pos,[]).
+
+check_unique2([A,B|T],Pos,Acc) when element(Pos,A) == element(Pos,B) ->
+ check_unique2([B|T],Pos,[element(Pos,B)|Acc]);
+check_unique2([_|T],Pos,Acc) ->
+ check_unique2(T,Pos,Acc);
+check_unique2([],_,Acc) ->
+ lists:reverse(Acc).
+
+check_each_component(S,Type,{Rlist,ExtList}) ->
+ {check_each_component(S,Type,Rlist),
+ check_each_component(S,Type,ExtList)};
+check_each_component(S,Type,Components) ->
+ check_each_component(S,Type,Components,[],[],noext).
+
+check_each_component(S = #state{abscomppath=Path,recordtopname=TopName},Type,
+ [C|Ct],Acc,Extacc,Ext) when record(C,'ComponentType') ->
+ #'ComponentType'{name=Cname,typespec=Ts,prop=Prop} = C,
+ NewAbsCPath =
+ case Ts#type.def of
+ #'Externaltypereference'{} -> [];
+ _ -> [Cname|Path]
+ end,
+ CheckedTs = check_type(S#state{abscomppath=NewAbsCPath,
+ recordtopname=[Cname|TopName]},Type,Ts),
+ NewTags = get_taglist(S,CheckedTs),
+
+ NewProp =
+% case lists:member(der,S#state.options) of
+% true ->
+% True ->
+ case normalize_value(S,CheckedTs,Prop,[Cname|TopName]) of
+ mandatory -> mandatory;
+ 'OPTIONAL' -> 'OPTIONAL';
+ DefaultValue -> {'DEFAULT',DefaultValue}
+ end,
+% _ ->
+% Prop
+% end,
+ NewC = C#'ComponentType'{typespec=CheckedTs,prop=NewProp,tags=NewTags},
+ case Ext of
+ noext ->
+ check_each_component(S,Type,Ct,[NewC|Acc],Extacc,Ext);
+ ext ->
+ check_each_component(S,Type,Ct,Acc,[NewC|Extacc],Ext)
+ end;
+check_each_component(S,Type,[_|Ct],Acc,Extacc,noext) -> % skip 'EXTENSIONMARK'
+ check_each_component(S,Type,Ct,Acc,Extacc,ext);
+check_each_component(_S,_,[_C|_Ct],_,_,ext) -> % skip 'EXTENSIONMARK'
+ throw({error,{asn1,{too_many_extension_marks}}});
+check_each_component(_S,_,[],Acc,Extacc,ext) ->
+ {lists:reverse(Acc),lists:reverse(Extacc)};
+check_each_component(_S,_,[],Acc,_,noext) ->
+ lists:reverse(Acc).
+
+check_each_alternative(S,Type,{Rlist,ExtList}) ->
+ {check_each_alternative(S,Type,Rlist),
+ check_each_alternative(S,Type,ExtList)};
+check_each_alternative(S,Type,[C|Ct]) ->
+ check_each_alternative(S,Type,[C|Ct],[],[],noext).
+
+check_each_alternative(S=#state{abscomppath=Path,recordtopname=TopName},Type,[C|Ct],
+ Acc,Extacc,Ext) when record(C,'ComponentType') ->
+ #'ComponentType'{name=Cname,typespec=Ts,prop=_Prop} = C,
+ NewAbsCPath =
+ case Ts#type.def of
+ #'Externaltypereference'{} -> [];
+ _ -> [Cname|Path]
+ end,
+ NewState =
+ S#state{abscomppath=NewAbsCPath,recordtopname=[Cname|TopName]},
+ CheckedTs = check_type(NewState,Type,Ts),
+ NewTags = get_taglist(S,CheckedTs),
+ NewC = C#'ComponentType'{typespec=CheckedTs,tags=NewTags},
+ case Ext of
+ noext ->
+ check_each_alternative(S,Type,Ct,[NewC|Acc],Extacc,Ext);
+ ext ->
+ check_each_alternative(S,Type,Ct,Acc,[NewC|Extacc],Ext)
+ end;
+
+check_each_alternative(S,Type,[_|Ct],Acc,Extacc,noext) -> % skip 'EXTENSIONMARK'
+ check_each_alternative(S,Type,Ct,Acc,Extacc,ext);
+check_each_alternative(_S,_,[_C|_Ct],_,_,ext) -> % skip 'EXTENSIONMARK'
+ throw({error,{asn1,{too_many_extension_marks}}});
+check_each_alternative(_S,_,[],Acc,Extacc,ext) ->
+ {lists:reverse(Acc),lists:reverse(Extacc)};
+check_each_alternative(_S,_,[],Acc,_,noext) ->
+ lists:reverse(Acc).
+
+%% componentrelation_leadingattr/2 searches the structure for table
+%% constraints, if any is found componentrelation_leadingattr/5 is
+%% called.
+componentrelation_leadingattr(S,CompList) ->
+% {Cs1,Cs2} =
+ Cs =
+ case CompList of
+ {Components,EComponents} when list(Components) ->
+% {Components,Components};
+ Components ++ EComponents;
+ CompList when list(CompList) ->
+% {CompList,CompList}
+ CompList
+ end,
+% case any_simple_table(S,Cs1,[]) of
+
+ %% get_simple_table_if_used/2 should find out whether there are any
+ %% component relation constraints in the entire tree of Cs1 that
+ %% relates to this level. It returns information about the simple
+ %% table constraint necessary for the the call to
+ %% componentrelation_leadingattr/6. The step when the leading
+ %% attribute and the syntax tree is modified to support the code
+ %% generating.
+ case get_simple_table_if_used(S,Cs) of
+ [] -> {false,CompList};
+ STList ->
+% componentrelation_leadingattr(S,Cs1,Cs2,STList,[],[])
+ componentrelation_leadingattr(S,Cs,Cs,STList,[],[])
+ end.
+
+%% componentrelation_leadingattr/6 when all components are searched
+%% the new modified components are returned together with the "leading
+%% attribute" information, which later is stored in the tablecinf
+%% field in the SEQUENCE/SET record. The "leading attribute"
+%% information is used to generate the lookup in the object set
+%% table. The other information gathered in the #type.tablecinf field
+%% is used in code generating phase too, to recognice the proper
+%% components for "open type" encoding and to propagate the result of
+%% the object set lookup when needed.
+componentrelation_leadingattr(_,[],_CompList,_,[],NewCompList) ->
+ {false,lists:reverse(NewCompList)};
+componentrelation_leadingattr(_,[],_CompList,_,LeadingAttr,NewCompList) ->
+ {lists:last(LeadingAttr),lists:reverse(NewCompList)}; %send all info in Ts later
+componentrelation_leadingattr(S,[C|Cs],CompList,STList,Acc,CompAcc) ->
+ {LAAcc,NewC} =
+ case catch componentrelation1(S,C#'ComponentType'.typespec,
+ [C#'ComponentType'.name]) of
+ {'EXIT',_} ->
+ {[],C};
+ {CRI=[{_A1,_B1,_C1,_D1}|_Rest],NewTSpec} ->
+ %% {ObjectSet,AtPath,ClassDef,Path}
+ %% _A1 is a reference to the object set of the
+ %% component relation constraint.
+ %% _B1 is the path of names in the at-list of the
+ %% component relation constraint.
+ %% _C1 is the class definition of the
+ %% ObjectClassFieldType.
+ %% _D1 is the path of components that was traversed to
+ %% find this constraint.
+ case leading_attr_index(S,CompList,CRI,
+ lists:reverse(S#state.abscomppath),[]) of
+ [] ->
+ {[],C};
+ [{ObjSet,Attr,N,ClassDef,_Path,ValueIndex}|_NewRest] ->
+ OS = object_set_mod_name(S,ObjSet),
+ UniqueFieldName =
+ case (catch get_unique_fieldname(#classdef{typespec=ClassDef})) of
+ {error,'__undefined_'} ->
+ no_unique;
+ {asn1,Msg,_} ->
+ error({type,Msg,S});
+ Other -> Other
+ end,
+% UsedFieldName = get_used_fieldname(S,Attr,STList),
+ %% Res should be done differently: even though
+ %% a unique field name exists it is not
+ %% certain that the ObjectClassFieldType of
+ %% the simple table constraint picks that
+ %% class field.
+ Res = #simpletableattributes{objectsetname=OS,
+%% c_name=asn1ct_gen:un_hyphen_var(Attr),
+ c_name=Attr,
+ c_index=N,
+ usedclassfield=UniqueFieldName,
+ uniqueclassfield=UniqueFieldName,
+ valueindex=ValueIndex},
+ {[Res],C#'ComponentType'{typespec=NewTSpec}}
+ end;
+ _ ->
+ %% no constraint was found
+ {[],C}
+ end,
+ componentrelation_leadingattr(S,Cs,CompList,STList,LAAcc++Acc,
+ [NewC|CompAcc]).
+
+object_set_mod_name(_S,ObjSet) when atom(ObjSet) ->
+ ObjSet;
+object_set_mod_name(#state{mname=M},
+ #'Externaltypereference'{module=M,type=T}) ->
+ T;
+object_set_mod_name(S,#'Externaltypereference'{module=M,type=T}) ->
+ case lists:member(M,S#state.inputmodules) of
+ true ->
+ T;
+ false ->
+ {M,T}
+ end.
+
+%% get_used_fieldname gets the used field of the class referenced by
+%% the ObjectClassFieldType construct in the simple table constraint
+%% corresponding to the component relation constraint that depends on
+%% it.
+% get_used_fieldname(_S,CName,[{[CName|_Rest],_,ClFieldName}|_RestSimpleT]) ->
+% ClFieldName;
+% get_used_fieldname(S,CName,[_SimpleTC|Rest]) ->
+% get_used_fieldname(S,CName,Rest);
+% get_used_fieldname(S,_,[]) ->
+% error({type,"Error in Simple table constraint",S}).
+
+%% any_simple_table/3 checks if any of the components on this level is
+%% constrained by a simple table constraint. It returns a list of
+%% tuples with three elements. It is a name path to the place in the
+%% type structure where the constraint is, and the name of the object
+%% set and the referenced field in the class.
+% any_simple_table(S = #state{mname=M,abscomppath=Path},
+% [#'ComponentType'{name=Name,typespec=Type}|Cs],Acc) ->
+% Constraint = Type#type.constraint,
+% case lists:keysearch(simpletable,1,Constraint) of
+% {value,{_,#type{def=Ref}}} ->
+% %% This ObjectClassFieldType, which has a simple table
+% %% constraint, must pick a fixed type value, mustn't it ?
+% {ClassDef,[{_,ClassFieldName}]} = Type#type.def,
+% ST =
+% case Ref of
+% #'Externaltypereference'{module=M,type=ObjSetName} ->
+% {[Name|Path],ObjSetName,ClassFieldName};
+% _ ->
+% {[Name|Path],Ref,ClassFieldName}
+% end,
+% any_simple_table(S,Cs,[ST|Acc]);
+% false ->
+% any_simple_table(S,Cs,Acc)
+% end;
+% any_simple_table(_,[],Acc) ->
+% lists:reverse(Acc);
+% any_simple_table(S,[_|Cs],Acc) ->
+% any_simple_table(S,Cs,Acc).
+
+%% get_simple_table_if_used/2 searches the structure of Cs for any
+%% component relation constraints due to the present level of the
+%% structure. If there are any, the necessary information for code
+%% generation of the look up functionality in the object set table are
+%% returned.
+get_simple_table_if_used(S,Cs) ->
+ CNames = lists:map(fun(#'ComponentType'{name=Name}) -> Name;
+ (_) -> [] %% in case of extension marks
+ end,
+ Cs),
+ RefedSimpleTable=any_component_relation(S,Cs,CNames,[],[]),
+ get_simple_table_info(S,Cs,remove_doubles(RefedSimpleTable)).
+
+remove_doubles(L) ->
+ remove_doubles(L,[]).
+remove_doubles([H|T],Acc) ->
+ NewT = remove_doubles1(H,T),
+ remove_doubles(NewT,[H|Acc]);
+remove_doubles([],Acc) ->
+ Acc.
+
+remove_doubles1(El,L) ->
+ case lists:delete(El,L) of
+ L -> L;
+ NewL -> remove_doubles1(El,NewL)
+ end.
+
+%% get_simple_table_info searches the commponents Cs by the path from
+%% an at-list (third argument), and follows into a component of it if
+%% necessary, to get information needed for code generating.
+%%
+%% Returns a list of tuples with three elements. It holds a list of
+%% atoms that is the path, the name of the field of the class that are
+%% referred to in the ObjectClassFieldType, and the name of the unique
+%% field of the class of the ObjectClassFieldType.
+%%
+% %% The level information outermost/innermost must be kept. There are
+% %% at least two possibilities to cover here for an outermost case: 1)
+% %% Both the simple table and the component relation have a common path
+% %% at least one step below the outermost level, i.e. the leading
+% %% information shall be on a sub level. 2) They don't have any common
+% %% path.
+get_simple_table_info(S,Cs,[AtList|Rest]) ->
+%% [get_simple_table_info1(S,Cs,AtList,S#state.abscomppath)|get_simple_table_info(S,Cs,Rest)];
+ [get_simple_table_info1(S,Cs,AtList,[])|get_simple_table_info(S,Cs,Rest)];
+get_simple_table_info(_,_,[]) ->
+ [].
+get_simple_table_info1(S,Cs,[Cname|Cnames],Path) when list(Cs) ->
+ case lists:keysearch(Cname,#'ComponentType'.name,Cs) of
+ {value,C} ->
+ get_simple_table_info1(S,C,Cnames,[Cname|Path]);
+ _ ->
+ error({type,"Missing expected simple table constraint",S})
+ end;
+get_simple_table_info1(S,#'ComponentType'{typespec=TS},[],Path) ->
+ %% In this component there must be a simple table constraint
+ %% o.w. the asn1 code is wrong.
+ #type{def=OCFT,constraint=Cnstr} = TS,
+ case Cnstr of
+ [{simpletable,_OSRef}]�->
+ #'ObjectClassFieldType'{classname=ClRef,
+ class=ObjectClass,
+ fieldname=FieldName} = OCFT,
+% #'ObjectClassFieldType'{ObjectClass,FieldType} = ObjectClassFieldType,
+ ObjectClassFieldName =
+ case FieldName of
+ {LastFieldName,[]} -> LastFieldName;
+ {_FirstFieldName,FieldNames} ->
+ lists:last(FieldNames)
+ end,
+ %%ObjectClassFieldName is the last element in the dotted
+ %%list of the ObjectClassFieldType. The last element may
+ %%be of another class, that is referenced from the class
+ %%of the ObjectClassFieldType
+ ClassDef =
+ case ObjectClass of
+ [] ->
+ {_,CDef}=get_referenced_type(S,ClRef),
+ CDef;
+ _ -> #classdef{typespec=ObjectClass}
+ end,
+ UniqueName =
+ case (catch get_unique_fieldname(ClassDef)) of
+ {error,'__undefined_'} -> no_unique;
+ {asn1,Msg,_} ->
+ error({type,Msg,S});
+ Other -> Other
+ end,
+ {lists:reverse(Path),ObjectClassFieldName,UniqueName};
+ _ ->
+ error({type,{asn1,"missing expected simple table constraint",
+ Cnstr},S})
+ end;
+get_simple_table_info1(S,#'ComponentType'{typespec=TS},Cnames,Path) ->
+ Components = get_atlist_components(TS#type.def),
+ get_simple_table_info1(S,Components,Cnames,Path).
+
+%% any_component_relation searches for all component relation
+%% constraints that refers to the actual level and returns a list of
+%% the "name path" in the at-list to the component relation constraint
+%% that must refer to a simple table constraint. The list is empty if
+%% no component relation constraints were found.
+%%
+%% NamePath has the names of all components that are followed from the
+%% beginning of the search. CNames holds the names of all components
+%% of the start level, this info is used if an outermost at-notation
+%% is found to check the validity of the at-list.
+any_component_relation(S,[C|Cs],CNames,NamePath,Acc) ->
+ CName = C#'ComponentType'.name,
+ Type = C#'ComponentType'.typespec,
+ CRelPath =
+ case Type#type.constraint of
+ [{componentrelation,_,AtNotation}] ->
+ %% Found component relation constraint, now check
+ %% whether this constraint is relevant for the level
+ %% where the search started
+ AtNot = extract_at_notation(AtNotation),
+ %% evaluate_atpath returns the relative path to the
+ %% simple table constraint from where the component
+ %% relation is found.
+ evaluate_atpath(S#state.abscomppath,NamePath,CNames,AtNot);
+ _ ->
+ []
+ end,
+ InnerAcc =
+ case {Type#type.inlined,
+ asn1ct_gen:type(asn1ct_gen:get_inner(Type#type.def))} of
+ {no,{constructed,bif}} ->
+ InnerCs =
+ case get_components(Type#type.def) of
+ {IC1,_IC2} -> IC1 ++ IC1;
+ IC -> IC
+ end,
+ %% here we are interested in components of an
+ %% SEQUENCE/SET OF as well as SEQUENCE, SET and CHOICE
+ any_component_relation(S,InnerCs,CNames,[CName|NamePath],[]);
+ _ ->
+ []
+ end,
+ any_component_relation(S,Cs,CNames,NamePath,InnerAcc++CRelPath++Acc);
+any_component_relation(_,[],_,_,Acc) ->
+ Acc.
+
+%% evaluate_atpath/4 finds out whether the at notation refers to the
+%% search level. The list of referenced names in the AtNot list shall
+%% begin with a name that exists on the level it refers to. If the
+%% found AtPath is refering to the same sub-branch as the simple table
+%% has, then there shall not be any leading attribute info on this
+%% level.
+evaluate_atpath(_,[],Cnames,{innermost,AtPath=[Ref|_Refs]}) ->
+ %% any innermost constraint found deeper in the structure is
+ %% ignored.
+ case lists:member(Ref,Cnames) of
+ true -> [AtPath];
+ false -> []
+ end;
+%% In this case must check that the AtPath doesn't step any step of
+%% the NamePath, in that case the constraint will be handled in an
+%% inner level.
+evaluate_atpath(TopPath,NamePath,Cnames,{outermost,AtPath=[_Ref|_Refs]}) ->
+ AtPathBelowTop =
+ case TopPath of
+ [] -> AtPath;
+ _ ->
+ case lists:prefix(TopPath,AtPath) of
+ true ->
+ lists:subtract(AtPath,TopPath);
+ _ -> []
+ end
+ end,
+ case {NamePath,AtPathBelowTop} of
+ {[H|_T1],[H|_T2]} -> []; % this must be handled in lower level
+ {_,[]} -> [];% this must be handled in an above level
+ {_,[H|_T]} ->
+ case lists:member(H,Cnames) of
+ true -> [AtPathBelowTop];
+ _ -> error({type,{asn1,"failed to analyze at-path",AtPath}})
+ end
+ end;
+evaluate_atpath(_,_,_,_) ->
+ [].
+
+%% Type may be any of SEQUENCE, SET, CHOICE, SEQUENCE OF, SET OF but
+%% only the three first have valid components.
+get_atlist_components(Def) ->
+ get_components(atlist,Def).
+
+get_components(Def) ->
+ get_components(any,Def).
+
+get_components(_,#'SEQUENCE'{components=Cs}) ->
+ Cs;
+get_components(_,#'SET'{components=Cs}) ->
+ Cs;
+get_components(_,{'CHOICE',Cs}) ->
+ Cs;
+get_components(any,{'SEQUENCE OF',#type{def=Def}}) ->
+ get_components(any,Def);
+get_components(any,{'SET OF',#type{def=Def}}) ->
+ get_components(any,Def);
+get_components(_,_) ->
+ [].
+
+
+extract_at_notation([{Level,[#'Externalvaluereference'{value=Name}|Rest]}]) ->
+ {Level,[Name|extract_at_notation1(Rest)]};
+extract_at_notation(At) ->
+ exit({error,{asn1,{at_notation,At}}}).
+extract_at_notation1([#'Externalvaluereference'{value=Name}|Rest]) ->
+ [Name|extract_at_notation1(Rest)];
+extract_at_notation1([]) ->
+ [].
+
+%% componentrelation1/1 identifies all componentrelation constraints
+%% that exist in C or in the substructure of C. Info about the found
+%% constraints are returned in a list. It is ObjectSet, the reference
+%% to the object set, AttrPath, the name atoms extracted from the
+%% at-list in the component relation constraint, ClassDef, the
+%% objectclass record of the class of the ObjectClassFieldType, Path,
+%% that is the component name "path" from the searched level to this
+%% constraint.
+%%
+%% The function is called with one component of the type in turn and
+%% with the component name in Path at the first call. When called from
+%% within, the name of the inner component is added to Path.
+componentrelation1(S,C = #type{def=Def,constraint=Constraint,tablecinf=TCI},
+ Path) ->
+ Ret =
+ case Constraint of
+ [{componentrelation,{_,_,ObjectSet},AtList}|_Rest] ->
+ [{_,AL=[#'Externalvaluereference'{}|_R1]}|_R2] = AtList,
+ %% Note: if Path is longer than one,i.e. it is within
+ %% an inner type of the actual level, then the only
+ %% relevant at-list is of "outermost" type.
+%% #'ObjectClassFieldType'{class=ClassDef} = Def,
+ ClassDef = get_ObjectClassFieldType_classdef(S,Def),
+ AtPath =
+ lists:map(fun(#'Externalvaluereference'{value=V})->V end,
+ AL),
+ {[{ObjectSet,AtPath,ClassDef,Path}],Def};
+ _Other ->
+ %% check the inner type of component
+ innertype_comprel(S,Def,Path)
+ end,
+ case Ret of
+ nofunobj ->
+ nofunobj; %% ignored by caller
+ {CRelI=[{ObjSet,_,_,_}],NewDef} -> %%
+ TCItmp = lists:subtract(TCI,[{objfun,ObjSet}]),
+ {CRelI,C#type{tablecinf=[{objfun,ObjSet}|TCItmp],def=NewDef}};
+ {CompRelInf,NewDef} -> %% more than one tuple in CompRelInf
+ TCItmp = lists:subtract(TCI,[{objfun,anyset}]),
+ {CompRelInf,C#type{tablecinf=[{objfun,anyset}|TCItmp],def=NewDef}}
+ end.
+
+innertype_comprel(S,{'SEQUENCE OF',Type},Path) ->
+ case innertype_comprel1(S,Type,Path) of
+ nofunobj ->
+ nofunobj;
+ {CompRelInf,NewType} ->
+ {CompRelInf,{'SEQUENCE OF',NewType}}
+ end;
+innertype_comprel(S,{'SET OF',Type},Path) ->
+ case innertype_comprel1(S,Type,Path) of
+ nofunobj ->
+ nofunobj;
+ {CompRelInf,NewType} ->
+ {CompRelInf,{'SET OF',NewType}}
+ end;
+innertype_comprel(S,{'CHOICE',CTypeList},Path) ->
+ case componentlist_comprel(S,CTypeList,[],Path,[]) of
+ nofunobj ->
+ nofunobj;
+ {CompRelInf,NewCs} ->
+ {CompRelInf,{'CHOICE',NewCs}}
+ end;
+innertype_comprel(S,Seq = #'SEQUENCE'{components=Cs},Path) ->
+ case componentlist_comprel(S,Cs,[],Path,[]) of
+ nofunobj ->
+ nofunobj;
+ {CompRelInf,NewCs} ->
+ {CompRelInf,Seq#'SEQUENCE'{components=NewCs}}
+ end;
+innertype_comprel(S,Set = #'SET'{components=Cs},Path) ->
+ case componentlist_comprel(S,Cs,[],Path,[]) of
+ nofunobj ->
+ nofunobj;
+ {CompRelInf,NewCs} ->
+ {CompRelInf,Set#'SET'{components=NewCs}}
+ end;
+innertype_comprel(_,_,_) ->
+ nofunobj.
+
+componentlist_comprel(S,[C = #'ComponentType'{name=Name,typespec=Type}|Cs],
+ Acc,Path,NewCL) ->
+ case catch componentrelation1(S,Type,Path++[Name]) of
+ {'EXIT',_} ->
+ componentlist_comprel(S,Cs,Acc,Path,[C|NewCL]);
+ nofunobj ->
+ componentlist_comprel(S,Cs,Acc,Path,[C|NewCL]);
+ {CRelInf,NewType} ->
+ componentlist_comprel(S,Cs,CRelInf++Acc,Path,
+ [C#'ComponentType'{typespec=NewType}|NewCL])
+ end;
+componentlist_comprel(_,[],Acc,_,NewCL) ->
+ case Acc of
+ [] ->
+ nofunobj;
+ _ ->
+ {Acc,lists:reverse(NewCL)}
+ end.
+
+innertype_comprel1(S,T = #type{def=Def,constraint=Cons,tablecinf=TCI},Path) ->
+ Ret =
+ case Cons of
+ [{componentrelation,{_,_,ObjectSet},AtList}|_Rest] ->
+ %% This AtList must have an "outermost" at sign to be
+ %% relevent here.
+ [{_,AL=[#'Externalvaluereference'{value=_Attr}|_R1]}|_R2]
+ = AtList,
+%% #'ObjectClassFieldType'{class=ClassDef} = Def,
+ ClassDef = get_ObjectClassFieldType_classdef(S,Def),
+ AtPath =
+ lists:map(fun(#'Externalvaluereference'{value=V})->V end,
+ AL),
+ [{ObjectSet,AtPath,ClassDef,Path}];
+ _ ->
+ innertype_comprel(S,Def,Path)
+ end,
+ case Ret of
+ nofunobj -> nofunobj;
+ L = [{ObjSet,_,_,_}] ->
+ TCItmp = lists:subtract(TCI,[{objfun,ObjSet}]),
+ {L,T#type{tablecinf=[{objfun,ObjSet}|TCItmp]}};
+ {CRelInf,NewDef} ->
+ TCItmp = lists:subtract(TCI,[{objfun,anyset}]),
+ {CRelInf,T#type{def=NewDef,tablecinf=[{objfun,anyset}|TCItmp]}}
+ end.
+
+
+%% leading_attr_index counts the index and picks the name of the
+%% component that is at the actual level in the at-list of the
+%% component relation constraint (AttrP). AbsP is the path of
+%% component names from the top type level to the actual level. AttrP
+%% is a list with the atoms from the at-list.
+leading_attr_index(S,Cs,[H={_,AttrP,_,_}|T],AbsP,Acc) ->
+ AttrInfo =
+ case lists:prefix(AbsP,AttrP) of
+ %% why this ?? It is necessary when in same situation as
+ %% TConstrChoice, there is an inner structure with an
+ %% outermost at-list and the "leading attribute" code gen
+ %% may be at a level some steps below the outermost level.
+ true ->
+ RelativAttrP = lists:subtract(AttrP,AbsP),
+ %% The header is used to calculate the index of the
+ %% component and to give the fun, received from the
+ %% object set look up, an unique name. The tail is
+ %% used to match the proper value input to the fun.
+ {hd(RelativAttrP),tl(RelativAttrP)};
+ false ->
+ {hd(AttrP),tl(AttrP)}
+ end,
+ case leading_attr_index1(S,Cs,H,AttrInfo,1) of
+ 0 ->
+ leading_attr_index(S,Cs,T,AbsP,Acc);
+ Res ->
+ leading_attr_index(S,Cs,T,AbsP,[Res|Acc])
+ end;
+leading_attr_index(_,_Cs,[],_,Acc) ->
+ lists:reverse(Acc).
+
+leading_attr_index1(_,[],_,_,_) ->
+ 0;
+leading_attr_index1(S,[C|Cs],Arg={ObjectSet,_,CDef,P},
+ AttrInfo={Attr,SubAttr},N) ->
+ case C#'ComponentType'.name of
+ Attr ->
+ ValueMatch = value_match(S,C,Attr,SubAttr),
+ {ObjectSet,Attr,N,CDef,P,ValueMatch};
+ _ ->
+ leading_attr_index1(S,Cs,Arg,AttrInfo,N+1)
+ end.
+
+%% value_math gathers information for a proper value match in the
+%% generated encode function. For a SEQUENCE or a SET the index of the
+%% component is counted. For a CHOICE the index is 2.
+value_match(S,C,Name,SubAttr) ->
+ value_match(S,C,Name,SubAttr,[]). % C has name Name
+value_match(_S,#'ComponentType'{},_Name,[],Acc) ->
+ Acc;% do not reverse, indexes in reverse order
+value_match(S,#'ComponentType'{typespec=Type},Name,[At|Ats],Acc) ->
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ Components =
+ case get_atlist_components(Type#type.def) of
+ [] -> error({type,{asn1,"element in at list must be a "
+ "SEQUENCE, SET or CHOICE.",Name},S});
+ Comps -> Comps
+ end,
+ {Index,ValueIndex} = component_value_index(S,InnerType,At,Components),
+ value_match(S,lists:nth(Index,Components),At,Ats,[ValueIndex|Acc]).
+
+component_value_index(S,'CHOICE',At,Components) ->
+ {component_index(S,At,Components),2};
+component_value_index(S,_,At,Components) ->
+ %% SEQUENCE or SET
+ Index = component_index(S,At,Components),
+ {Index,{Index+1,At}}.
+
+component_index(S,Name,Components) ->
+ component_index1(S,Name,Components,1).
+component_index1(_S,Name,[#'ComponentType'{name=Name}|_Cs],N) ->
+ N;
+component_index1(S,Name,[_C|Cs],N) ->
+ component_index1(S,Name,Cs,N+1);
+component_index1(S,Name,[],_) ->
+ error({type,{asn1,"component of at-list was not"
+ " found in substructure",Name},S}).
+
+get_unique_fieldname(ClassDef) ->
+%% {_,Fields,_} = ClassDef#classdef.typespec,
+ Fields = (ClassDef#classdef.typespec)#objectclass.fields,
+ get_unique_fieldname(Fields,[]).
+
+get_unique_fieldname([],[]) ->
+ throw({error,'__undefined_'});
+get_unique_fieldname([],[Name]) ->
+ Name;
+get_unique_fieldname([],Acc) ->
+ throw({asn1,'only one UNIQUE field is allowed in CLASS',Acc});
+get_unique_fieldname([{fixedtypevaluefield,Name,_,'UNIQUE',_}|Rest],Acc) ->
+ get_unique_fieldname(Rest,[Name|Acc]);
+get_unique_fieldname([_H|T],Acc) ->
+ get_unique_fieldname(T,Acc).
+
+get_tableconstraint_info(S,Type,{CheckedTs,EComps}) ->
+ {get_tableconstraint_info(S,Type,CheckedTs,[]),
+ get_tableconstraint_info(S,Type,EComps,[])};
+get_tableconstraint_info(S,Type,CheckedTs) ->
+ get_tableconstraint_info(S,Type,CheckedTs,[]).
+
+get_tableconstraint_info(_S,_Type,[],Acc) ->
+ lists:reverse(Acc);
+get_tableconstraint_info(S,Type,[C|Cs],Acc) ->
+ CheckedTs = C#'ComponentType'.typespec,
+ AccComp =
+ case CheckedTs#type.def of
+ %% ObjectClassFieldType
+ OCFT=#'ObjectClassFieldType'{class=#objectclass{},
+ type=_AType} ->
+% AType = get_ObjectClassFieldType(S,Fields,FieldRef),
+% RefedFieldName =
+% get_referencedclassfield(CheckedTs#type.def),%is probably obsolete
+ NewOCFT =
+ OCFT#'ObjectClassFieldType'{class=[]},
+ C#'ComponentType'{typespec=
+ CheckedTs#type{
+% def=AType,
+ def=NewOCFT
+ }};
+% constraint=[{tableconstraint_info,
+% FieldRef}]}};
+ {'SEQUENCE OF',SOType} when record(SOType,type),
+ (element(1,SOType#type.def)=='CHOICE') ->
+ CTypeList = element(2,SOType#type.def),
+ NewInnerCList =
+ get_tableconstraint_info(S,Type,CTypeList,[]),
+ C#'ComponentType'{typespec=
+ CheckedTs#type{
+ def={'SEQUENCE OF',
+ SOType#type{def={'CHOICE',
+ NewInnerCList}}}}};
+ {'SET OF',SOType} when record(SOType,type),
+ (element(1,SOType#type.def)=='CHOICE') ->
+ CTypeList = element(2,SOType#type.def),
+ NewInnerCList =
+ get_tableconstraint_info(S,Type,CTypeList,[]),
+ C#'ComponentType'{typespec=
+ CheckedTs#type{
+ def={'SET OF',
+ SOType#type{def={'CHOICE',
+ NewInnerCList}}}}};
+ _ ->
+ C
+ end,
+ get_tableconstraint_info(S,Type,Cs,[AccComp|Acc]).
+
+get_referenced_fieldname([{_,FirstFieldname}]) ->
+ {FirstFieldname,[]};
+get_referenced_fieldname([{_,FirstFieldname}|Rest]) ->
+ {FirstFieldname,lists:map(fun(X)->element(2,X) end,Rest)};
+get_referenced_fieldname(Def) ->
+ {no_type,Def}.
+
+%% get_ObjectClassFieldType extracts the type from the chain of
+%% objects that leads to a final type.
+get_ObjectClassFieldType(S,ERef,PrimFieldNameList) when
+ record(ERef,'Externaltypereference') ->
+ {_,Type} = get_referenced_type(S,ERef),
+ ClassSpec = check_class(S,Type),
+ Fields = ClassSpec#objectclass.fields,
+ get_ObjectClassFieldType(S,Fields,PrimFieldNameList);
+get_ObjectClassFieldType(S,Fields,L=[_PrimFieldName1|_Rest]) ->
+ check_PrimitiveFieldNames(S,Fields,L),
+ get_OCFType(S,Fields,L).
+
+check_PrimitiveFieldNames(_S,_Fields,_) ->
+ ok.
+
+%% get_ObjectClassFieldType_classdef gets the def of the class of the
+%% ObjectClassFieldType, i.e. the objectclass record. If the type has
+%% been checked (it may be a field type of an internal SEQUENCE) the
+%% class field = [], then the classdef has to be fetched by help of
+%% the class reference in the classname field.
+get_ObjectClassFieldType_classdef(S,#'ObjectClassFieldType'{classname=Name,
+ class=[]}) ->
+ {_,#classdef{typespec=TS}} = get_referenced_type(S,Name),
+ TS;
+get_ObjectClassFieldType_classdef(_,#'ObjectClassFieldType'{class=Cl}) ->
+ Cl.
+
+get_OCFType(S,Fields,[{_FieldType,PrimFieldName}|Rest]) ->
+ case lists:keysearch(PrimFieldName,2,Fields) of
+ {value,{fixedtypevaluefield,_,Type,_Unique,_OptSpec}} ->
+ {fixedtypevaluefield,PrimFieldName,Type};
+ {value,{objectfield,_,Type,_Unique,_OptSpec}} ->
+ {_,ClassDef} = get_referenced_type(S,Type#type.def),
+ CheckedCDef = check_class(S#state{type=ClassDef,
+ tname=ClassDef#classdef.name},
+ ClassDef#classdef.typespec),
+ get_OCFType(S,CheckedCDef#objectclass.fields,Rest);
+ {value,{objectsetfield,_,Type,_OptSpec}} ->
+ {_,ClassDef} = get_referenced_type(S,Type#type.def),
+ CheckedCDef = check_class(S#state{type=ClassDef,
+ tname=ClassDef#classdef.name},
+ ClassDef#classdef.typespec),
+ get_OCFType(S,CheckedCDef#objectclass.fields,Rest);
+
+ {value,Other} ->
+ {element(1,Other),PrimFieldName};
+ _ ->
+ error({type,"undefined FieldName in ObjectClassFieldType",S})
+ end.
+
+get_taglist(#state{erule=per},_) ->
+ [];
+get_taglist(#state{erule=per_bin},_) ->
+ [];
+get_taglist(S,Ext) when record(Ext,'Externaltypereference') ->
+ {_,T} = get_referenced_type(S,Ext),
+ get_taglist(S,T#typedef.typespec);
+get_taglist(S,Tref) when record(Tref,typereference) ->
+ {_,T} = get_referenced_type(S,Tref),
+ get_taglist(S,T#typedef.typespec);
+get_taglist(S,Type) when record(Type,type) ->
+ case Type#type.tag of
+ [] ->
+ get_taglist(S,Type#type.def);
+ [Tag|_] ->
+% case lists:member(S#state.erule,[ber,ber_bin]) of
+% true ->
+% lists:map(fun(Tx) -> asn1ct_gen:def_to_tag(Tx) end,Type#type.tag);
+% _ ->
+ [asn1ct_gen:def_to_tag(Tag)]
+% end
+ end;
+get_taglist(S,{'CHOICE',{Rc,Ec}}) ->
+ get_taglist(S,{'CHOICE',Rc ++ Ec});
+get_taglist(S,{'CHOICE',Components}) ->
+ get_taglist1(S,Components);
+%% ObjectClassFieldType OTP-4390
+get_taglist(_S,#'ObjectClassFieldType'{type={typefield,_}}) ->
+ [];
+get_taglist(S,#'ObjectClassFieldType'{type={fixedtypevaluefield,_,Type}}) ->
+ get_taglist(S,Type);
+get_taglist(S,{ERef=#'Externaltypereference'{},FieldNameList})
+ when list(FieldNameList) ->
+ case get_ObjectClassFieldType(S,ERef,FieldNameList) of
+ Type when record(Type,type) ->
+ get_taglist(S,Type);
+ {fixedtypevaluefield,_,Type} -> get_taglist(S,Type);
+ {TypeFieldName,_} when atom(TypeFieldName) -> []%should check if allowed
+ end;
+get_taglist(S,{ObjCl,FieldNameList}) when record(ObjCl,objectclass),
+ list(FieldNameList) ->
+ case get_ObjectClassFieldType(S,ObjCl#objectclass.fields,FieldNameList) of
+ Type when record(Type,type) ->
+ get_taglist(S,Type);
+ {fixedtypevaluefield,_,Type} -> get_taglist(S,Type);
+ {TypeFieldName,_} when atom(TypeFieldName) -> []%should check if allowed
+ end;
+get_taglist(S,Def) ->
+ case lists:member(S#state.erule,[ber_bin_v2]) of
+ false ->
+ case Def of
+ 'ASN1_OPEN_TYPE' -> % open_type has no UNIVERSAL tag as such
+ [];
+ _ ->
+ [asn1ct_gen:def_to_tag(Def)]
+ end;
+ _ ->
+ []
+ end.
+
+get_taglist1(S,[#'ComponentType'{name=_Cname,tags=TagL}|Rest]) when list(TagL) ->
+ %% tag_list has been here , just return TagL and continue with next alternative
+ TagL ++ get_taglist1(S,Rest);
+get_taglist1(S,[#'ComponentType'{typespec=Ts,tags=undefined}|Rest]) ->
+ get_taglist(S,Ts) ++ get_taglist1(S,Rest);
+get_taglist1(S,[_H|Rest]) -> % skip EXTENSIONMARK
+ get_taglist1(S,Rest);
+get_taglist1(_S,[]) ->
+ [].
+
+dbget_ex(_S,Module,Key) ->
+ case asn1_db:dbget(Module,Key) of
+ undefined ->
+
+ throw({error,{asn1,{undefined,{Module,Key}}}}); % this is catched on toplevel type or value
+ T -> T
+ end.
+
+merge_tags(T1, T2) when list(T2) ->
+ merge_tags2(T1 ++ T2, []);
+merge_tags(T1, T2) ->
+ merge_tags2(T1 ++ [T2], []).
+
+merge_tags2([T1= #tag{type='IMPLICIT'}, T2 |Rest], Acc) ->
+ merge_tags2([T1#tag{type=T2#tag.type, form=T2#tag.form}|Rest],Acc);
+merge_tags2([T1= #tag{type={default,'IMPLICIT'}}, T2 |Rest], Acc) ->
+ merge_tags2([T1#tag{type=T2#tag.type, form=T2#tag.form}|Rest],Acc);
+merge_tags2([H|T],Acc) ->
+ merge_tags2(T, [H|Acc]);
+merge_tags2([], Acc) ->
+ lists:reverse(Acc).
+
+merge_constraints(C1, []) ->
+ C1;
+merge_constraints([], C2) ->
+ C2;
+merge_constraints(C1, C2) ->
+ {SList,VList,PAList,Rest} = splitlist(C1++C2,[],[],[],[]),
+ SizeC = merge_constraints(SList),
+ ValueC = merge_constraints(VList),
+ PermAlphaC = merge_constraints(PAList),
+ case Rest of
+ [] ->
+ SizeC ++ ValueC ++ PermAlphaC;
+ _ ->
+ throw({error,{asn1,{not_implemented,{merge_constraints,Rest}}}})
+ end.
+
+merge_constraints([]) -> [];
+merge_constraints([C1 = {_,{Low1,High1}},{_,{Low2,High2}}|Rest]) when Low1 >= Low2,
+ High1 =< High2 ->
+ merge_constraints([C1|Rest]);
+merge_constraints([C1={'PermittedAlphabet',_},C2|Rest]) ->
+ [C1|merge_constraints([C2|Rest])];
+merge_constraints([C1 = {_,{_Low1,_High1}},C2 = {_,{_Low2,_High2}}|_Rest]) ->
+ throw({error,asn1,{conflicting_constraints,{C1,C2}}});
+merge_constraints([C]) ->
+ [C].
+
+splitlist([C={'SizeConstraint',_}|Rest],Sacc,Vacc,PAacc,Restacc) ->
+ splitlist(Rest,[C|Sacc],Vacc,PAacc,Restacc);
+splitlist([C={'ValueRange',_}|Rest],Sacc,Vacc,PAacc,Restacc) ->
+ splitlist(Rest,Sacc,[C|Vacc],PAacc,Restacc);
+splitlist([C={'PermittedAlphabet',_}|Rest],Sacc,Vacc,PAacc,Restacc) ->
+ splitlist(Rest,Sacc,Vacc,[C|PAacc],Restacc);
+splitlist([C|Rest],Sacc,Vacc,PAacc,Restacc) ->
+ splitlist(Rest,Sacc,Vacc,PAacc,[C|Restacc]);
+splitlist([],Sacc,Vacc,PAacc,Restacc) ->
+ {lists:reverse(Sacc),
+ lists:reverse(Vacc),
+ lists:reverse(PAacc),
+ lists:reverse(Restacc)}.
+
+
+
+storeindb(M) when record(M,module) ->
+ TVlist = M#module.typeorval,
+ NewM = M#module{typeorval=findtypes_and_values(TVlist)},
+ asn1_db:dbnew(NewM#module.name),
+ asn1_db:dbput(NewM#module.name,'MODULE', NewM),
+ Res = storeindb(NewM#module.name,TVlist,[]),
+ include_default_class(NewM#module.name),
+ include_default_type(NewM#module.name),
+ Res.
+
+storeindb(Module,[H|T],ErrAcc) when record(H,typedef) ->
+ storeindb(Module,H#typedef.name,H,T,ErrAcc);
+storeindb(Module,[H|T],ErrAcc) when record(H,valuedef) ->
+ storeindb(Module,H#valuedef.name,H,T,ErrAcc);
+storeindb(Module,[H|T],ErrAcc) when record(H,ptypedef) ->
+ storeindb(Module,H#ptypedef.name,H,T,ErrAcc);
+storeindb(Module,[H|T],ErrAcc) when record(H,classdef) ->
+ storeindb(Module,H#classdef.name,H,T,ErrAcc);
+storeindb(Module,[H|T],ErrAcc) when record(H,pvaluesetdef) ->
+ storeindb(Module,H#pvaluesetdef.name,H,T,ErrAcc);
+storeindb(Module,[H|T],ErrAcc) when record(H,pobjectdef) ->
+ storeindb(Module,H#pobjectdef.name,H,T,ErrAcc);
+storeindb(Module,[H|T],ErrAcc) when record(H,pvaluedef) ->
+ storeindb(Module,H#pvaluedef.name,H,T,ErrAcc);
+storeindb(_,[],[]) -> ok;
+storeindb(_,[],ErrAcc) ->
+ {error,ErrAcc}.
+
+storeindb(Module,Name,H,T,ErrAcc) ->
+ case asn1_db:dbget(Module,Name) of
+ undefined ->
+ asn1_db:dbput(Module,Name,H),
+ storeindb(Module,T,ErrAcc);
+ _ ->
+ case H of
+ _Type when record(H,typedef) ->
+ error({type,"already defined",
+ #state{mname=Module,type=H,tname=Name}});
+ _Type when record(H,valuedef) ->
+ error({value,"already defined",
+ #state{mname=Module,value=H,vname=Name}});
+ _Type when record(H,ptypedef) ->
+ error({ptype,"already defined",
+ #state{mname=Module,type=H,tname=Name}});
+ _Type when record(H,pobjectdef) ->
+ error({ptype,"already defined",
+ #state{mname=Module,type=H,tname=Name}});
+ _Type when record(H,pvaluesetdef) ->
+ error({ptype,"already defined",
+ #state{mname=Module,type=H,tname=Name}});
+ _Type when record(H,pvaluedef) ->
+ error({ptype,"already defined",
+ #state{mname=Module,type=H,tname=Name}});
+ _Type when record(H,classdef) ->
+ error({class,"already defined",
+ #state{mname=Module,value=H,vname=Name}})
+ end,
+ storeindb(Module,T,[H|ErrAcc])
+ end.
+
+findtypes_and_values(TVList) ->
+ findtypes_and_values(TVList,[],[],[],[],[],[]).%% Types,Values,
+%% Parameterizedtypes,Classes,Objects and ObjectSets
+
+findtypes_and_values([H|T],Tacc,Vacc,Pacc,Cacc,Oacc,OSacc)
+ when record(H,typedef),record(H#typedef.typespec,'Object') ->
+ findtypes_and_values(T,Tacc,Vacc,Pacc,Cacc,[H#typedef.name|Oacc],OSacc);
+findtypes_and_values([H|T],Tacc,Vacc,Pacc,Cacc,Oacc,OSacc)
+ when record(H,typedef),record(H#typedef.typespec,'ObjectSet') ->
+ findtypes_and_values(T,Tacc,Vacc,Pacc,Cacc,Oacc,[H#typedef.name|OSacc]);
+findtypes_and_values([H|T],Tacc,Vacc,Pacc,Cacc,Oacc,OSacc)
+ when record(H,typedef) ->
+ findtypes_and_values(T,[H#typedef.name|Tacc],Vacc,Pacc,Cacc,Oacc,OSacc);
+findtypes_and_values([H|T],Tacc,Vacc,Pacc,Cacc,Oacc,OSacc)
+ when record(H,valuedef) ->
+ findtypes_and_values(T,Tacc,[H#valuedef.name|Vacc],Pacc,Cacc,Oacc,OSacc);
+findtypes_and_values([H|T],Tacc,Vacc,Pacc,Cacc,Oacc,OSacc)
+ when record(H,ptypedef) ->
+ findtypes_and_values(T,Tacc,Vacc,[H#ptypedef.name|Pacc],Cacc,Oacc,OSacc);
+findtypes_and_values([H|T],Tacc,Vacc,Pacc,Cacc,Oacc,OSacc)
+ when record(H,classdef) ->
+ findtypes_and_values(T,Tacc,Vacc,Pacc,[H#classdef.name|Cacc],Oacc,OSacc);
+findtypes_and_values([H|T],Tacc,Vacc,Pacc,Cacc,Oacc,OSacc)
+ when record(H,pvaluedef) ->
+ findtypes_and_values(T,Tacc,[H#pvaluedef.name|Vacc],Pacc,Cacc,Oacc,OSacc);
+findtypes_and_values([H|T],Tacc,Vacc,Pacc,Cacc,Oacc,OSacc)
+ when record(H,pvaluesetdef) ->
+ findtypes_and_values(T,Tacc,[H#pvaluesetdef.name|Vacc],Pacc,Cacc,Oacc,OSacc);
+findtypes_and_values([H|T],Tacc,Vacc,Pacc,Cacc,Oacc,OSacc)
+ when record(H,pobjectdef) ->
+ findtypes_and_values(T,Tacc,Vacc,Pacc,Cacc,[H#pobjectdef.name|Oacc],OSacc);
+findtypes_and_values([H|T],Tacc,Vacc,Pacc,Cacc,Oacc,OSacc)
+ when record(H,pobjectsetdef) ->
+ findtypes_and_values(T,Tacc,Vacc,Pacc,Cacc,Oacc,[H#pobjectsetdef.name|OSacc]);
+findtypes_and_values([],Tacc,Vacc,Pacc,Cacc,Oacc,OSacc) ->
+ {lists:reverse(Tacc),lists:reverse(Vacc),lists:reverse(Pacc),
+ lists:reverse(Cacc),lists:reverse(Oacc),lists:reverse(OSacc)}.
+
+
+
+error({export,Msg,#state{mname=Mname,type=Ref,tname=Typename}}) ->
+ Pos = Ref#'Externaltypereference'.pos,
+ io:format("asn1error:~p:~p:~p ~p~n",[Pos,Mname,Typename,Msg]),
+ {error,{export,Pos,Mname,Typename,Msg}};
+error({type,Msg,#state{mname=Mname,type=Type,tname=Typename}})
+ when record(Type,typedef) ->
+ io:format("asn1error:~p:~p:~p ~p~n",
+ [Type#typedef.pos,Mname,Typename,Msg]),
+ {error,{type,Type#typedef.pos,Mname,Typename,Msg}};
+error({type,Msg,#state{mname=Mname,type=Type,tname=Typename}})
+ when record(Type,ptypedef) ->
+ io:format("asn1error:~p:~p:~p ~p~n",
+ [Type#ptypedef.pos,Mname,Typename,Msg]),
+ {error,{type,Type#ptypedef.pos,Mname,Typename,Msg}};
+error({type,Msg,#state{mname=Mname,value=Value,vname=Valuename}})
+ when record(Value,valuedef) ->
+ io:format("asn1error:~p:~p:~p ~p~n",[Value#valuedef.pos,Mname,Valuename,Msg]),
+ {error,{type,Value#valuedef.pos,Mname,Valuename,Msg}};
+error({type,Msg,#state{mname=Mname,type=Type,tname=Typename}})
+ when record(Type,pobjectdef) ->
+ io:format("asn1error:~p:~p:~p ~p~n",
+ [Type#pobjectdef.pos,Mname,Typename,Msg]),
+ {error,{type,Type#pobjectdef.pos,Mname,Typename,Msg}};
+error({value,Msg,#state{mname=Mname,value=Value,vname=Valuename}}) ->
+ io:format("asn1error:~p:~p:~p ~p~n",[Value#valuedef.pos,Mname,Valuename,Msg]),
+ {error,{value,Value#valuedef.pos,Mname,Valuename,Msg}};
+error({Other,Msg,#state{mname=Mname,value=#valuedef{pos=Pos},vname=Valuename}}) ->
+ io:format("asn1error:~p:~p:~p ~p~n",[Pos,Mname,Valuename,Msg]),
+ {error,{Other,Pos,Mname,Valuename,Msg}};
+error({Other,Msg,#state{mname=Mname,type=#typedef{pos=Pos},tname=Typename}}) ->
+ io:format("asn1error:~p:~p:~p ~p~n",[Pos,Mname,Typename,Msg]),
+ {error,{Other,Pos,Mname,Typename,Msg}};
+error({Other,Msg,#state{mname=Mname,type=#classdef{pos=Pos},tname=Typename}}) ->
+ io:format("asn1error:~p:~p:~p ~p~n",[Pos,Mname,Typename,Msg]),
+ {error,{Other,Pos,Mname,Typename,Msg}}.
+
+include_default_type(Module) ->
+ NameAbsList = default_type_list(),
+ include_default_type1(Module,NameAbsList).
+
+include_default_type1(_,[]) ->
+ ok;
+include_default_type1(Module,[{Name,TS}|Rest]) ->
+ case asn1_db:dbget(Module,Name) of
+ undefined ->
+ T = #typedef{name=Name,
+ typespec=TS},
+ asn1_db:dbput(Module,Name,T);
+ _ -> ok
+ end,
+ include_default_type1(Module,Rest).
+
+default_type_list() ->
+ %% The EXTERNAL type is represented, according to ASN.1 1997,
+ %% as a SEQUENCE with components: identification, data-value-descriptor
+ %% and data-value.
+ Syntax =
+ #'ComponentType'{name=syntax,
+ typespec=#type{def='OBJECT IDENTIFIER'},
+ prop=mandatory},
+ Presentation_Cid =
+ #'ComponentType'{name='presentation-context-id',
+ typespec=#type{def='INTEGER'},
+ prop=mandatory},
+ Transfer_syntax =
+ #'ComponentType'{name='transfer-syntax',
+ typespec=#type{def='OBJECT IDENTIFIER'},
+ prop=mandatory},
+ Negotiation_items =
+ #type{def=
+ #'SEQUENCE'{components=
+ [Presentation_Cid,
+ Transfer_syntax#'ComponentType'{prop=mandatory}]}},
+ Context_negot =
+ #'ComponentType'{name='context-negotiation',
+ typespec=Negotiation_items,
+ prop=mandatory},
+
+ Data_value_descriptor =
+ #'ComponentType'{name='data-value-descriptor',
+ typespec=#type{def='ObjectDescriptor'},
+ prop='OPTIONAL'},
+ Data_value =
+ #'ComponentType'{name='data-value',
+ typespec=#type{def='OCTET STRING'},
+ prop=mandatory},
+
+ %% The EXTERNAL type is represented, according to ASN.1 1990,
+ %% as a SEQUENCE with components: direct-reference, indirect-reference,
+ %% data-value-descriptor and encoding.
+
+ Direct_reference =
+ #'ComponentType'{name='direct-reference',
+ typespec=#type{def='OBJECT IDENTIFIER'},
+ prop='OPTIONAL'},
+
+ Indirect_reference =
+ #'ComponentType'{name='indirect-reference',
+ typespec=#type{def='INTEGER'},
+ prop='OPTIONAL'},
+
+ Single_ASN1_type =
+ #'ComponentType'{name='single-ASN1-type',
+ typespec=#type{tag=[{tag,'CONTEXT',0,
+ 'EXPLICIT',32}],
+ def='ANY'},
+ prop=mandatory},
+
+ Octet_aligned =
+ #'ComponentType'{name='octet-aligned',
+ typespec=#type{tag=[{tag,'CONTEXT',1,
+ 'IMPLICIT',32}],
+ def='OCTET STRING'},
+ prop=mandatory},
+
+ Arbitrary =
+ #'ComponentType'{name=arbitrary,
+ typespec=#type{tag=[{tag,'CONTEXT',2,
+ 'IMPLICIT',32}],
+ def={'BIT STRING',[]}},
+ prop=mandatory},
+
+ Encoding =
+ #'ComponentType'{name=encoding,
+ typespec=#type{def={'CHOICE',
+ [Single_ASN1_type,Octet_aligned,
+ Arbitrary]}},
+ prop=mandatory},
+
+ EXTERNAL_components1990 =
+ [Direct_reference,Indirect_reference,Data_value_descriptor,Encoding],
+
+ %% The EMBEDDED PDV type is represented by a SEQUENCE type
+ %% with components: identification and data-value
+ Abstract =
+ #'ComponentType'{name=abstract,
+ typespec=#type{def='OBJECT IDENTIFIER'},
+ prop=mandatory},
+ Transfer =
+ #'ComponentType'{name=transfer,
+ typespec=#type{def='OBJECT IDENTIFIER'},
+ prop=mandatory},
+ AbstractTrSeq =
+ #'SEQUENCE'{components=[Abstract,Transfer]},
+ Syntaxes =
+ #'ComponentType'{name=syntaxes,
+ typespec=#type{def=AbstractTrSeq},
+ prop=mandatory},
+ Fixed = #'ComponentType'{name=fixed,
+ typespec=#type{def='NULL'},
+ prop=mandatory},
+ Negotiations =
+ [Syntaxes,Syntax,Presentation_Cid,Context_negot,
+ Transfer_syntax,Fixed],
+ Identification2 =
+ #'ComponentType'{name=identification,
+ typespec=#type{def={'CHOICE',Negotiations}},
+ prop=mandatory},
+ EmbeddedPdv_components =
+ [Identification2,Data_value],
+
+ %% The CHARACTER STRING type is represented by a SEQUENCE type
+ %% with components: identification and string-value
+ String_value =
+ #'ComponentType'{name='string-value',
+ typespec=#type{def='OCTET STRING'},
+ prop=mandatory},
+ CharacterString_components =
+ [Identification2,String_value],
+
+ [{'EXTERNAL',
+ #type{tag=[#tag{class='UNIVERSAL',
+ number=8,
+ type='IMPLICIT',
+ form=32}],
+ def=#'SEQUENCE'{components=
+ EXTERNAL_components1990}}},
+ {'EMBEDDED PDV',
+ #type{tag=[#tag{class='UNIVERSAL',
+ number=11,
+ type='IMPLICIT',
+ form=32}],
+ def=#'SEQUENCE'{components=EmbeddedPdv_components}}},
+ {'CHARACTER STRING',
+ #type{tag=[#tag{class='UNIVERSAL',
+ number=29,
+ type='IMPLICIT',
+ form=32}],
+ def=#'SEQUENCE'{components=CharacterString_components}}}
+ ].
+
+
+include_default_class(Module) ->
+ NameAbsList = default_class_list(),
+ include_default_class1(Module,NameAbsList).
+
+include_default_class1(_,[]) ->
+ ok;
+include_default_class1(Module,[{Name,TS}|_Rest]) ->
+ case asn1_db:dbget(Module,Name) of
+ undefined ->
+ C = #classdef{checked=true,name=Name,
+ typespec=TS},
+ asn1_db:dbput(Module,Name,C);
+ _ -> ok
+ end.
+
+default_class_list() ->
+ [{'TYPE-IDENTIFIER',
+ {objectclass,
+ [{fixedtypevaluefield,
+ id,
+ {type,[],'OBJECT IDENTIFIER',[]},
+ 'UNIQUE',
+ 'MANDATORY'},
+ {typefield,'Type','MANDATORY'}],
+ {'WITH SYNTAX',
+ [{typefieldreference,'Type'},
+ 'IDENTIFIED',
+ 'BY',
+ {valuefieldreference,id}]}}},
+ {'ABSTRACT-SYNTAX',
+ {objectclass,
+ [{fixedtypevaluefield,
+ id,
+ {type,[],'OBJECT IDENTIFIER',[]},
+ 'UNIQUE',
+ 'MANDATORY'},
+ {typefield,'Type','MANDATORY'},
+ {fixedtypevaluefield,
+ property,
+ {type,
+ [],
+ {'BIT STRING',[]},
+ []},
+ undefined,
+ {'DEFAULT',
+ [0,1,0]}}],
+ {'WITH SYNTAX',
+ [{typefieldreference,'Type'},
+ 'IDENTIFIED',
+ 'BY',
+ {valuefieldreference,id},
+ ['HAS',
+ 'PROPERTY',
+ {valuefieldreference,property}]]}}}].
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_constructed_ber.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_constructed_ber.erl
new file mode 100644
index 0000000000..695f648924
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_constructed_ber.erl
@@ -0,0 +1,1468 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1ct_constructed_ber.erl,v 1.1 2008/12/17 09:53:29 mikpe Exp $
+%%
+-module(asn1ct_constructed_ber).
+
+-export([gen_encode_sequence/3]).
+-export([gen_decode_sequence/3]).
+-export([gen_encode_set/3]).
+-export([gen_decode_set/3]).
+-export([gen_encode_sof/4]).
+-export([gen_decode_sof/4]).
+-export([gen_encode_choice/3]).
+-export([gen_decode_choice/3]).
+
+%%%% Application internal exports
+-export([match_tag/2]).
+
+-include("asn1_records.hrl").
+
+-import(asn1ct_gen, [emit/1,demit/1]).
+
+% the encoding of class of tag bits 8 and 7
+-define(UNIVERSAL, 0).
+-define(APPLICATION, 16#40).
+-define(CONTEXT, 16#80).
+-define(PRIVATE, 16#C0).
+
+% primitive or constructed encoding % bit 6
+-define(PRIMITIVE, 0).
+-define(CONSTRUCTED, 2#00100000).
+
+
+
+
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+%% Encode/decode SEQUENCE
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+
+gen_encode_sequence(Erules,Typename,D) when record(D,type) ->
+ asn1ct_name:start(),
+ asn1ct_name:new(term),
+ asn1ct_name:new(bytes),
+
+ %% if EXTERNAL type the input value must be transformed to
+ %% ASN1 1990 format
+ case Typename of
+ ['EXTERNAL'] ->
+ emit([" NewVal = asn1rt_check:transform_to_EXTERNAL1990(Val),",
+ nl]);
+ _ ->
+ ok
+ end,
+
+ {SeqOrSet,TableConsInfo,CompList} =
+ case D#type.def of
+ #'SEQUENCE'{tablecinf=TCI,components=CL} ->
+ {'SEQUENCE',TCI,CL};
+ #'SET'{tablecinf=TCI,components=CL} ->
+ {'SET',TCI,CL}
+ end,
+ Ext = extensible(CompList),
+ CompList1 = case CompList of
+ {Rl,El} -> Rl ++ El;
+ _ -> CompList
+ end,
+ EncObj =
+ case TableConsInfo of
+ #simpletableattributes{usedclassfield=Used,
+ uniqueclassfield=Unique} when Used /= Unique ->
+ false;
+ %% ObjectSet, name of the object set in constraints
+ %%
+ %%{ObjectSet,AttrN,N,UniqueFieldName}
+ #simpletableattributes{objectsetname=ObjectSet,
+ c_name=AttrN,
+ c_index=N,
+ usedclassfield=UniqueFieldName,
+ uniqueclassfield=UniqueFieldName,
+ valueindex=ValueIndex
+ } ->
+ OSDef =
+ case ObjectSet of
+ {Module,OSName} ->
+ asn1_db:dbget(Module,OSName);
+ OSName ->
+ asn1_db:dbget(get(currmod),OSName)
+ end,
+% io:format("currmod: ~p~nOSName: ~p~nAttrN: ~p~nN: ~p~nUniqueFieldName: ~p~n",
+% [get(currmod),OSName,AttrN,N,UniqueFieldName]),
+ case (OSDef#typedef.typespec)#'ObjectSet'.gen of
+ true ->
+% Val = lists:concat(["?RT_BER:cindex(",
+% N+1,",Val,"]),
+ ObjectEncode =
+ asn1ct_gen:un_hyphen_var(lists:concat(['Obj',
+ AttrN])),
+ emit({ObjectEncode," = ",nl}),
+ emit({" 'getenc_",ObjectSet,"'(",{asis,UniqueFieldName},
+ ", ",nl}),
+% emit({indent(35),"?RT_BER:cindex(",N+1,", Val,",
+% {asis,AttrN},")),",nl}),
+ emit([indent(10+length(atom_to_list(ObjectSet))),
+ "value_match(",{asis,ValueIndex},",",
+ "?RT_BER:cindex(",N+1,",Val,",
+ {asis,AttrN},"))),",nl]),
+ notice_value_match(),
+ {AttrN,ObjectEncode};
+ _ ->
+ false
+ end;
+ _ ->
+ case D#type.tablecinf of
+ [{objfun,_}|_] ->
+ %% when the simpletableattributes was at an
+ %% outer level and the objfun has been passed
+ %% through the function call
+ {"got objfun through args","ObjFun"};
+ _ ->
+ false
+ end
+ end,
+
+ gen_enc_sequence_call(Erules,Typename,CompList1,1,Ext,EncObj),
+
+ MyTag = [X#tag{class=asn1ct_gen_ber:decode_class(X#tag.class)}|| X <- D#type.tag]
+ ++
+ [#tag{class = asn1ct_gen_ber:decode_class('UNIVERSAL'),
+ number = asn1ct_gen_ber:decode_type(SeqOrSet),
+ form = ?CONSTRUCTED,
+ type = 'IMPLICIT'}],
+ emit([nl," BytesSoFar = "]),
+ case SeqOrSet of
+ 'SET' when (D#type.def)#'SET'.sorted == dynamic ->
+ emit("?RT_BER:dynamicsort_SET_components(["),
+ mkvlist(asn1ct_name:all(encBytes)),
+ emit(["]),",nl]);
+ _ ->
+ emit("["),
+ mkvlist(asn1ct_name:all(encBytes)),
+ emit(["],",nl])
+ end,
+ emit(" LenSoFar = "),
+ case asn1ct_name:all(encLen) of
+ [] -> emit("0");
+ AllLengths ->
+ mkvplus(AllLengths)
+ end,
+ emit([",",nl]),
+% emit(["{TagBytes,Len} = ?RT_BER:encode_tags(TagIn ++ ",
+ emit([" ?RT_BER:encode_tags(TagIn ++ ",
+ {asis,MyTag},", BytesSoFar, LenSoFar).",nl]).
+
+
+gen_decode_sequence(Erules,Typename,D) when record(D,type) ->
+ asn1ct_name:start(),
+% asn1ct_name:new(term),
+ asn1ct_name:new(tag),
+ #'SEQUENCE'{tablecinf=TableConsInfo,components=CList} = D#type.def,
+ Ext = extensible(CList),
+ CompList = case CList of
+ {Rl,El} -> Rl ++ El;
+ _ -> CList
+ end,
+
+ emit({" %%-------------------------------------------------",nl}),
+ emit({" %% decode tag and length ",nl}),
+ emit({" %%-------------------------------------------------",nl}),
+
+ asn1ct_name:new(rb),
+ MyTag = [X#tag{class=asn1ct_gen_ber:decode_class(X#tag.class)}|| X <- D#type.tag]
+ ++
+ [#tag{class = asn1ct_gen_ber:decode_class('UNIVERSAL'),
+ number = asn1ct_gen_ber:decode_type('SEQUENCE'),
+ form = ?CONSTRUCTED,
+ type = 'IMPLICIT'}],
+ emit([" {{_,",asn1ct_gen_ber:unused_var("Len",D#type.def),"},",{next,bytes},",",{curr,rb},
+ "} = ?RT_BER:check_tags(TagIn ++ ",{asis,MyTag},", ",
+ {curr,bytes},", OptOrMand), ",nl]),
+ asn1ct_name:new(bytes),
+ asn1ct_name:new(len),
+
+ case CompList of
+ [] -> true;
+ _ ->
+ emit({"{",{next,bytes},
+ ",RemBytes} = ?RT_BER:split_list(",
+ {curr,bytes},
+ ",", {prev,len},"),",nl}),
+ asn1ct_name:new(bytes)
+ end,
+
+ {DecObjInf,UniqueFName,ValueIndex} =
+ case TableConsInfo of
+ #simpletableattributes{objectsetname=ObjectSet,
+ c_name=AttrN,
+ usedclassfield=UniqueFieldName,
+ uniqueclassfield=UniqueFieldName,
+ valueindex=ValIndex
+ } ->
+ F = fun(#'ComponentType'{typespec=CT})->
+ case {CT#type.constraint,CT#type.tablecinf} of
+ {[],[{objfun,_}|_R]} -> true;
+ _ -> false
+ end
+ end,
+ case lists:any(F,CompList) of
+ %%AttributeName = asn1ct_gen:un_hyphen_var(AttrN),
+ true -> % when component relation constraint establish
+ %% relation from a component to another components
+ %% subtype component
+ {{AttrN,{deep,ObjectSet,UniqueFieldName,
+ ValIndex}},
+ UniqueFieldName,ValIndex};
+ false ->
+ {{AttrN,ObjectSet},UniqueFieldName,ValIndex}
+ end;
+ _ ->
+ {false,false,false}
+ end,
+ case gen_dec_sequence_call(Erules,Typename,CompList,Ext,DecObjInf) of
+ no_terms -> % an empty sequence
+ emit([nl,nl]),
+ demit({"Result = "}), %dbg
+ %% return value as record
+ asn1ct_name:new(rb),
+ emit([" {{'",asn1ct_gen:list2rname(Typename),"'}, ",{curr,bytes},",",nl," "]),
+ asn1ct_gen_ber:add_removed_bytes(),
+ emit(["}.",nl]);
+ {LeadingAttrTerm,PostponedDecArgs} ->
+ emit([com,nl,nl]),
+ case {LeadingAttrTerm,PostponedDecArgs} of
+ {[],[]} ->
+ ok;
+ {_,[]} ->
+ ok;
+ {[{ObjSet,LeadingAttr,Term}],PostponedDecArgs} ->
+ DecObj = asn1ct_gen:un_hyphen_var(lists:concat(['DecObj',LeadingAttr,Term])),
+ ValueMatch = value_match(ValueIndex,Term),
+ emit([DecObj," =",nl," 'getdec_",ObjSet,"'(",
+% {asis,UniqueFName},", ",Term,"),",nl}),
+ {asis,UniqueFName},", ",ValueMatch,"),",nl]),
+ gen_dec_postponed_decs(DecObj,PostponedDecArgs)
+ end,
+ demit({"Result = "}), %dbg
+ %% return value as record
+ asn1ct_name:new(rb),
+ asn1ct_name:new(bytes),
+ ExtStatus = case Ext of
+ {ext,_,_} -> ext;
+ noext -> noext
+ end,
+ emit([" {",{next,bytes},",",{curr,rb},"} = ?RT_BER:restbytes2(RemBytes, ",
+ {curr,bytes},",",ExtStatus,"),",nl]),
+ asn1ct_name:new(rb),
+ case Typename of
+ ['EXTERNAL'] ->
+ emit([" OldFormat={'",asn1ct_gen:list2rname(Typename),
+ "', "]),
+ mkvlist(asn1ct_name:all(term)),
+ emit(["},",nl]),
+ emit([" ASN11994Format =",nl,
+ " asn1rt_check:transform_to_EXTERNAL1994",
+ "(OldFormat),",nl]),
+ emit([" {ASN11994Format,",{next,bytes},", "]);
+ _ ->
+ emit([" {{'",asn1ct_gen:list2rname(Typename),"', "]),
+ mkvlist(asn1ct_name:all(term)),
+ emit(["}, ",{next,bytes},", "])
+ end,
+ asn1ct_gen_ber:add_removed_bytes(),
+ emit(["}.",nl])
+ end.
+
+gen_dec_postponed_decs(_,[]) ->
+ emit(nl);
+gen_dec_postponed_decs(DecObj,[{_Cname,{FirstPFN,PFNList},Term,TmpTerm,_Tag,OptOrMand}|Rest]) ->
+% asn1ct_name:new(term),
+ asn1ct_name:new(tmpterm),
+ asn1ct_name:new(reason),
+
+ emit({"{",Term,", _, _} = ",nl}),
+ N = case OptOrMand of
+ mandatory -> 0;
+ 'OPTIONAL' ->
+ emit_opt_or_mand_check(asn1_NOVALUE,TmpTerm),
+ 6;
+ {'DEFAULT',Val} ->
+ emit_opt_or_mand_check(Val,TmpTerm),
+ 6
+ end,
+ emit({indent(N+3),"case (catch ",DecObj,"(",{asis,FirstPFN},
+% ", ",TmpTerm,", ", {asis,Tag},", ",{asis,PFNList},")) of",nl}),
+ ", ",TmpTerm,", [], ",{asis,PFNList},")) of",nl}),
+ emit({indent(N+6),"{'EXIT', ",{curr,reason},"} ->",nl}),
+ emit({indent(N+9),"exit({'Type not compatible with table constraint',",
+ {curr,reason},"});",nl}),
+ emit({indent(N+6),{curr,tmpterm}," ->",nl}),
+ emit({indent(N+9),{curr,tmpterm},nl}),
+
+ case OptOrMand of
+ mandatory -> emit([indent(N+3),"end,",nl]);
+ _ ->
+ emit([indent(N+3),"end",nl,
+ indent(3),"end,",nl])
+ end,
+% emit({indent(3),"end,",nl}),
+ gen_dec_postponed_decs(DecObj,Rest).
+
+
+emit_opt_or_mand_check(Value,TmpTerm) ->
+ emit([indent(3),"case ",TmpTerm," of",nl,
+ indent(6),{asis,Value}," -> {",{asis,Value},",[],[]};",nl,
+ indent(6),"_ ->",nl]).
+
+%%============================================================================
+%% Encode/decode SET
+%%
+%%============================================================================
+
+gen_encode_set(Erules,Typename,D) when record(D,type) ->
+ gen_encode_sequence(Erules,Typename,D).
+
+gen_decode_set(Erules,Typename,D) when record(D,type) ->
+ asn1ct_name:start(),
+ asn1ct_name:new(term),
+ asn1ct_name:new(tag),
+ #'SET'{components=TCompList} = D#type.def,
+ Ext = extensible(TCompList),
+ CompList = case TCompList of
+ {Rl,El} -> Rl ++ El;
+ _ -> TCompList
+ end,
+
+ emit([" %%-------------------------------------------------",nl]),
+ emit([" %% decode tag and length ",nl]),
+ emit([" %%-------------------------------------------------",nl]),
+
+ asn1ct_name:new(rb),
+ MyTag = [X#tag{class=asn1ct_gen_ber:decode_class(X#tag.class)}|| X <- D#type.tag]
+ ++
+ [#tag{class = asn1ct_gen_ber:decode_class('UNIVERSAL'),
+ number = asn1ct_gen_ber:decode_type('SET'),
+ form = ?CONSTRUCTED,
+ type = 'IMPLICIT'}],
+ emit([" {{_,Len},",{next,bytes},",",{curr,rb},
+ "} = ?RT_BER:check_tags(TagIn ++ ",{asis,MyTag},", ",
+ {curr,bytes},", OptOrMand), ",nl]),
+ asn1ct_name:new(bytes),
+ asn1ct_name:new(len),
+ asn1ct_name:new(rb),
+
+ emit([" {SetTerm, SetBytes, ",{curr,rb},"} = ?RT_BER:decode_set(0, Len, ",
+ {curr,bytes},", OptOrMand, ",
+ "fun 'dec_",asn1ct_gen:list2name(Typename),"_fun'/2, []),",nl]),
+
+ asn1ct_name:new(rb),
+ emit([" 'dec_",asn1ct_gen:list2name(Typename),"_result'(lists:sort(SetTerm), SetBytes, "]),
+ asn1ct_gen_ber:add_removed_bytes(),
+ emit([").",nl,nl,nl]),
+
+ emit({"%%-------------------------------------------------",nl}),
+ emit({"%% Set loop fun for ",asn1ct_gen:list2name(Typename),nl}),
+ emit({"%%-------------------------------------------------",nl}),
+
+ asn1ct_name:clear(),
+ asn1ct_name:new(term),
+ emit(["'dec_",asn1ct_gen:list2name(Typename),"_fun'(",{curr,bytes},
+ ", OptOrMand) ->",nl]),
+
+ asn1ct_name:new(bytes),
+ gen_dec_set(Erules,Typename,CompList,1,Ext),
+
+ emit([" %% tag not found, if extensionmark we should skip bytes here",nl]),
+ emit([indent(6),"_ -> {[], Bytes,0}",nl]),
+ emit([indent(3),"end.",nl,nl,nl]),
+
+
+ emit({"%%-------------------------------------------------",nl}),
+ emit({"%% Result ",asn1ct_gen:list2name(Typename),nl}),
+ emit({"%%-------------------------------------------------",nl}),
+
+ asn1ct_name:clear(),
+ emit({"'dec_",asn1ct_gen:list2name(Typename),"_result'(",
+ asn1ct_gen_ber:unused_var("TermList",D#type.def),", Bytes, Rb) ->",nl}),
+
+ case gen_dec_set_result(Erules,Typename,CompList) of
+ no_terms ->
+ %% return value as record
+ asn1ct_name:new(rb),
+ emit({" {{'",asn1ct_gen:list2rname(Typename),"'}, Bytes, Rb}.",nl});
+ _ ->
+ emit({nl," case ",{curr,termList}," of",nl}),
+ emit({" [] -> {{'",asn1ct_gen:list2rname(Typename),"', "}),
+ mkvlist(asn1ct_name:all(term)),
+ emit({"}, Bytes, Rb};",nl}),
+ emit({" ExtraAtt -> exit({error,{asn1,{too_many_attributes, ExtraAtt}}})",nl}),
+ emit({" end.",nl}),
+ emit({nl,nl,nl})
+ end.
+
+
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+%% Encode/decode SEQUENCE OF and SET OF
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+
+gen_encode_sof(Erules,Typename,_InnerTypename,D) when record(D,type) ->
+ asn1ct_name:start(),
+ {SeqOrSetOf, Cont} = D#type.def,
+
+ Objfun = case D#type.tablecinf of
+ [{objfun,_}|_R] ->
+ ", ObjFun";
+ _ ->
+ ""
+ end,
+
+ emit({" {EncBytes,EncLen} = 'enc_",asn1ct_gen:list2name(Typename),
+ "_components'(Val",Objfun,",[],0),",nl}),
+
+ MyTag = [X#tag{class=asn1ct_gen_ber:decode_class(X#tag.class)}|| X <- D#type.tag]
+ ++
+ [#tag{class = asn1ct_gen_ber:decode_class('UNIVERSAL'),
+ number = asn1ct_gen_ber:decode_type(SeqOrSetOf),
+ form = ?CONSTRUCTED,
+ type = 'IMPLICIT'}],
+% gen_encode_tags(Erules,MyTag,"EncLen","EncBytes"),
+ emit([" ?RT_BER:encode_tags(TagIn ++ ",
+ {asis,MyTag},", EncBytes, EncLen).",nl,nl]),
+
+ gen_encode_sof_components(Erules,Typename,SeqOrSetOf,Cont).
+% gen_enc_line(Erules,Typename,TypeNameSuffix,Cont,"H",0,
+% mandatory,"{EncBytes,EncLen} = "),
+
+
+gen_decode_sof(Erules,Typename,_InnerTypename,D) when record(D,type) ->
+ asn1ct_name:start(),
+ {SeqOrSetOf, TypeTag, Cont} =
+ case D#type.def of
+ {'SET OF',_Cont} -> {'SET OF','SET',_Cont};
+ {'SEQUENCE OF',_Cont} -> {'SEQUENCE OF','SEQUENCE',_Cont}
+ end,
+ TypeNameSuffix = asn1ct_gen:constructed_suffix(SeqOrSetOf,Cont#type.def),
+
+ emit({" %%-------------------------------------------------",nl}),
+ emit({" %% decode tag and length ",nl}),
+ emit({" %%-------------------------------------------------",nl}),
+
+ asn1ct_name:new(rb),
+ MyTag = [X#tag{class=asn1ct_gen_ber:decode_class(X#tag.class)}|| X <- D#type.tag]
+ ++
+ [#tag{class = asn1ct_gen_ber:decode_class('UNIVERSAL'),
+ number = asn1ct_gen_ber:decode_type(TypeTag),
+ form = ?CONSTRUCTED,
+ type = 'IMPLICIT'}],
+ emit([" {{_,Len},",{next,bytes},",",{curr,rb},
+ "} = ?RT_BER:check_tags(TagIn ++ ",{asis,MyTag},", ",
+ {curr,bytes},", OptOrMand), ",nl]),
+
+ emit([" ?RT_BER:decode_components(",{curr,rb}]),
+ InnerType = asn1ct_gen:get_inner(Cont#type.def),
+ ContName = case asn1ct_gen:type(InnerType) of
+ Atom when atom(Atom) -> Atom;
+ _ -> TypeNameSuffix
+ end,
+ emit([", Len, ",{next,bytes},", "]),
+% NewCont =
+% case Cont#type.def of
+% {'ENUMERATED',_,Components}->
+% Cont#type{def={'ENUMERATED',Components}};
+% _ -> Cont
+% end,
+ ObjFun =
+ case D#type.tablecinf of
+ [{objfun,_}|_R] ->
+ ", ObjFun";
+ _ ->
+ []
+ end,
+ gen_dec_line_sof(Erules,Typename,ContName,Cont,ObjFun),
+ emit([", []).",nl,nl,nl]).
+
+
+gen_encode_sof_components(Erules,Typename,SeqOrSetOf,Cont)
+ when record(Cont,type)->
+
+ {Objfun,ObjFun_novar,EncObj} =
+ case Cont#type.tablecinf of
+ [{objfun,_}|_R] ->
+ {", ObjFun",", _",{no_attr,"ObjFun"}};
+ _ ->
+ {"","",false}
+ end,
+ emit(["'enc_",asn1ct_gen:list2name(Typename),
+ "_components'([]",ObjFun_novar,", AccBytes, AccLen) -> ",nl]),
+
+ case catch lists:member(der,get(encoding_options)) of
+ true ->
+ emit([indent(3),
+ "{?RT_BER:dynamicsort_SETOF(AccBytes),AccLen};",nl,nl]);
+ _ ->
+ emit([indent(3),"{lists:reverse(AccBytes),AccLen};",nl,nl])
+ end,
+ emit(["'enc_",asn1ct_gen:list2name(Typename),
+ "_components'([H|T]",Objfun,",AccBytes, AccLen) ->",nl]),
+ TypeNameSuffix = asn1ct_gen:constructed_suffix(SeqOrSetOf,Cont#type.def),
+ gen_enc_line(Erules,Typename,TypeNameSuffix,Cont,"H",3,
+ mandatory,"{EncBytes,EncLen} = ",EncObj),
+ emit([",",nl]),
+ emit([indent(3),"'enc_",asn1ct_gen:list2name(Typename),
+ "_components'(T",Objfun,","]),
+ emit(["[EncBytes|AccBytes], AccLen + EncLen).",nl,nl]).
+
+%%============================================================================
+%% Encode/decode CHOICE
+%%
+%%============================================================================
+
+gen_encode_choice(Erules,Typename,D) when record(D,type) ->
+ ChoiceTag = D#type.tag,
+ {'CHOICE',CompList} = D#type.def,
+ Ext = extensible(CompList),
+ CompList1 = case CompList of
+ {Rl,El} -> Rl ++ El;
+ _ -> CompList
+ end,
+ gen_enc_choice(Erules,Typename,ChoiceTag,CompList1,Ext),
+ emit({nl,nl}).
+
+gen_decode_choice(Erules,Typename,D) when record(D,type) ->
+ asn1ct_name:start(),
+ asn1ct_name:new(bytes),
+ ChoiceTag = D#type.tag,
+ {'CHOICE',CompList} = D#type.def,
+ Ext = extensible(CompList),
+ CompList1 = case CompList of
+ {Rl,El} -> Rl ++ El;
+ _ -> CompList
+ end,
+ gen_dec_choice(Erules,Typename,ChoiceTag,CompList1,Ext),
+ emit({".",nl}).
+
+
+%%============================================================================
+%% Encode SEQUENCE
+%%
+%%============================================================================
+
+gen_enc_sequence_call(Erules,TopType,[#'ComponentType'{name=Cname,typespec=Type,prop=Prop}|Rest],Pos,Ext,EncObj) ->
+ asn1ct_name:new(encBytes),
+ asn1ct_name:new(encLen),
+ Element =
+ case TopType of
+ ['EXTERNAL'] ->
+ io_lib:format("?RT_BER:cindex(~w,NewVal,~w)",[Pos+1,Cname]);
+ _ ->
+ io_lib:format("?RT_BER:cindex(~w,Val,~w)",[Pos+1,Cname])
+ end,
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ print_attribute_comment(InnerType,Pos,Prop),
+ gen_enc_line(Erules,TopType,Cname,Type,Element,3,Prop,EncObj),
+ case Rest of
+ [] ->
+ emit({com,nl});
+ _ ->
+ emit({com,nl}),
+ gen_enc_sequence_call(Erules,TopType,Rest,Pos+1,Ext,EncObj)
+ end;
+
+gen_enc_sequence_call(_Erules,_TopType,[],_Num,_,_) ->
+ true.
+
+%%============================================================================
+%% Decode SEQUENCE
+%%
+%%============================================================================
+
+gen_dec_sequence_call(Erules,TopType,CompList,Ext,DecObjInf) ->
+ gen_dec_sequence_call1(Erules,TopType, CompList, 1, Ext,DecObjInf,[],[]).
+
+
+gen_dec_sequence_call1(Erules,TopType,[#'ComponentType'{name=Cname,typespec=Type,prop=Prop,tags=Tags}|Rest],Num,Ext,DecObjInf,LeadingAttrAcc,ArgsAcc) ->
+ {LA,PostponedDec} =
+ gen_dec_component(Erules,TopType,Cname,Tags,Type,Num,Prop,
+ Ext,DecObjInf),
+ case Rest of
+ [] ->
+ {LA ++ LeadingAttrAcc,PostponedDec ++ ArgsAcc};
+ _ ->
+ emit({com,nl}),
+% asn1ct_name:new(term),
+ asn1ct_name:new(bytes),
+ gen_dec_sequence_call1(Erules,TopType,Rest,Num+1,Ext,DecObjInf,
+ LA++LeadingAttrAcc,PostponedDec++ArgsAcc)
+ end;
+
+gen_dec_sequence_call1(_Erules,_TopType,[],1,_,_,_,_) ->
+ no_terms.
+%%gen_dec_sequence_call1(Erules,_TopType,[],Num,_) ->
+%% true.
+
+
+
+%%----------------------------
+%%SEQUENCE mandatory
+%%----------------------------
+
+gen_dec_component(Erules,TopType,Cname,CTags,Type,Pos,Prop,Ext,DecObjInf) ->
+ InnerType =
+ case Type#type.def of
+ #'ObjectClassFieldType'{type=OCFTType} -> OCFTType;
+ _ -> asn1ct_gen:get_inner(Type#type.def)
+ end,
+% case asn1ct_gen:get_constraint(Type#type.constraint,
+% tableconstraint_info) of
+% no ->
+% asn1ct_gen:get_inner(Type#type.def);
+% _ ->
+% Type#type.def
+% end,
+ Prop1 = case {Prop,Ext} of
+ {mandatory,{ext,Epos,_}} when Pos >= Epos ->
+ 'OPTIONAL';
+ _ ->
+ Prop
+ end,
+ print_attribute_comment(InnerType,Pos,Prop1),
+ emit(" "),
+
+ case {InnerType,DecObjInf} of
+ {{typefield,_},NotFalse} when NotFalse /= false ->
+ asn1ct_name:new(term),
+ asn1ct_name:new(tmpterm),
+ emit({"{",{curr,tmpterm},", ",{next,bytes},",",{next,rb},"} = "});
+ {{objectfield,_,_},_} ->
+ asn1ct_name:new(term),
+ asn1ct_name:new(tmpterm),
+ emit({"{",{curr,tmpterm},", ",{next,bytes},",",{next,rb},"} = "});
+ _ ->
+ asn1ct_name:new(term),
+ emit({"{",{curr,term},",",{next,bytes},",",{next,rb},"} = "})
+ end,
+ asn1ct_name:new(rb),
+ PostponedDec =
+ gen_dec_line(Erules,TopType,Cname,CTags,Type,Prop1,DecObjInf),
+ asn1ct_name:new(form),
+ PostponedDec.
+
+
+%%-------------------------------------
+%% Decode SET
+%%-------------------------------------
+
+gen_dec_set(Erules,TopType,CompList,Pos,_Ext) ->
+ TagList = get_all_choice_tags(CompList),
+ emit({indent(3),
+ {curr,tagList}," = ",{asis,TagList},",",nl}),
+ emit({indent(3),
+ "case ?RT_BER:check_if_valid_tag(Bytes, ",
+ {curr,tagList},", OptOrMand) of",nl}),
+ asn1ct_name:new(tagList),
+ asn1ct_name:new(rbCho),
+ asn1ct_name:new(choTags),
+ gen_dec_set_cases(Erules,TopType,CompList,TagList,Pos),
+ asn1ct_name:new(tag),
+ asn1ct_name:new(bytes).
+
+
+
+gen_dec_set_cases(_,_,[],_,_) ->
+ ok;
+gen_dec_set_cases(Erules,TopType,[H|T],List,Pos) ->
+ case H of
+ {'EXTENSIONMARK', _, _} ->
+ gen_dec_set_cases(Erules,TopType,T,List,Pos);
+ _ ->
+ Name = H#'ComponentType'.name,
+ Type = H#'ComponentType'.typespec,
+
+ emit({indent(6),"'",Name,"' ->",nl}),
+ case Type#type.def of
+ {'CHOICE',_NewCompList} ->
+ gen_dec_set_cases_choice(Erules,TopType,H,Pos);
+ _ ->
+ gen_dec_set_cases_type(Erules,TopType,H,Pos)
+ end,
+ gen_dec_set_cases(Erules,TopType,T,List,Pos+1)
+ end.
+
+
+
+
+gen_dec_set_cases_choice(_Erules,TopType,H,Pos) ->
+ Cname = H#'ComponentType'.name,
+ Tag = [X#tag{class=asn1ct_gen_ber:decode_class(X#tag.class)}
+ || X <- (H#'ComponentType'.typespec)#type.tag],
+ asn1ct_name:new(rbCho),
+ emit({indent(9),"{Dec, Rest, ",{curr,rbCho},"} = "}),
+ emit({"'dec_",asn1ct_gen:list2name([Cname|TopType]),
+ "'(Bytes,OptOrMand,",{asis,Tag},"),",nl}),
+ emit([" {{",Pos,",Dec}, Rest, ",{curr,rbCho},"}"]),
+ emit([";",nl,nl]).
+
+
+gen_dec_set_cases_type(Erules,TopType,H,Pos) ->
+ Cname = H#'ComponentType'.name,
+ Type = H#'ComponentType'.typespec,
+ %% always use Prop = mandatory here Prop = H#'ComponentType'.prop,
+
+ asn1ct_name:new(rbCho),
+ emit({indent(9),"{Dec, Rest, ",{curr,rbCho},"} = "}),
+ asn1ct_name:delete(bytes),
+ %% we have already seen the tag so now we must find the value
+ %% that why we always use 'mandatory' here
+ gen_dec_line(Erules,TopType,Cname,[],Type,mandatory,decObjInf),
+ asn1ct_name:new(bytes),
+
+ emit([",",nl]),
+ emit(["{{",Pos,",Dec}, Rest, ",{curr,rbCho},"}"]),
+ emit([";",nl,nl]).
+
+
+%%---------------------------------
+%% Decode SET result
+%%---------------------------------
+
+gen_dec_set_result(Erules,TopType,{CompList,_ExtList}) ->
+ gen_dec_set_result1(Erules,TopType, CompList, 1);
+gen_dec_set_result(Erules,TopType,CompList) ->
+ gen_dec_set_result1(Erules,TopType, CompList, 1).
+
+gen_dec_set_result1(Erules,TopType,
+ [#'ComponentType'{name=Cname,
+ typespec=Type,
+ prop=Prop}|Rest],Num) ->
+ gen_dec_set_component(Erules,TopType,Cname,Type,Num,Prop),
+ case Rest of
+ [] ->
+ true;
+ _ ->
+ gen_dec_set_result1(Erules,TopType,Rest,Num+1)
+ end;
+
+gen_dec_set_result1(_Erules,_TopType,[],1) ->
+ no_terms;
+gen_dec_set_result1(_Erules,_TopType,[],_Num) ->
+ true.
+
+
+gen_dec_set_component(_Erules,_TopType,_Cname,Type,Pos,Prop) ->
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ print_attribute_comment(InnerType,Pos,Prop),
+ emit({" {",{next,term},com,{next,termList},"} =",nl}),
+ emit({" case ",{curr,termList}," of",nl}),
+ emit({" [{",Pos,com,{curr,termTmp},"}|",
+ {curr,rest},"] -> "}),
+ emit({"{",{curr,termTmp},com,
+ {curr,rest},"};",nl}),
+ case Prop of
+ 'OPTIONAL' ->
+ emit([indent(10),"_ -> {asn1_NOVALUE, ",{curr,termList},"}",nl]);
+ {'DEFAULT', DefVal} ->
+ emit([indent(10),
+ "_ -> {",{asis,DefVal},", ",{curr,termList},"}",nl]);
+ mandatory ->
+ emit([indent(10),
+ "_ -> exit({error,{asn1,{mandatory_attribute_no, ",
+ Pos,", missing}}})",nl])
+ end,
+ emit([indent(6),"end,",nl]),
+ asn1ct_name:new(rest),
+ asn1ct_name:new(term),
+ asn1ct_name:new(termList),
+ asn1ct_name:new(termTmp).
+
+
+%%---------------------------------------------
+%% Encode CHOICE
+%%---------------------------------------------
+%% for BER we currently do care (a little) if the choice has an EXTENSIONMARKER
+
+
+gen_enc_choice(Erules,TopType,Tag,CompList,_Ext) ->
+ gen_enc_choice1(Erules,TopType,Tag,CompList,_Ext).
+
+gen_enc_choice1(Erules,TopType,Tag,CompList,_Ext) ->
+ asn1ct_name:clear(),
+ emit({" {EncBytes,EncLen} = case element(1,Val) of",nl}),
+ gen_enc_choice2(Erules,TopType,CompList),
+ emit([nl," end,",nl,nl]),
+ NewTag = [X#tag{class=asn1ct_gen_ber:decode_class(X#tag.class)}|| X <- Tag],
+% gen_encode_tags(Erules,NewTag,"EncLen","EncBytes").
+ emit(["?RT_BER:encode_tags(TagIn ++",{asis,NewTag},", EncBytes, EncLen).",nl]).
+
+
+
+gen_enc_choice2(Erules,TopType,[H1|T]) when record(H1,'ComponentType') ->
+ Cname = H1#'ComponentType'.name,
+ Type = H1#'ComponentType'.typespec,
+ emit({" ",{asis,Cname}," ->",nl}),
+ {Encobj,Assign} =
+% case asn1ct_gen:get_constraint(Type#type.constraint,
+% tableconstraint_info) of
+ case {Type#type.def,asn1ct_gen:get_constraint(Type#type.constraint,
+ componentrelation)} of
+ {#'ObjectClassFieldType'{},{componentrelation,_,_}} ->
+ asn1ct_name:new(tmpBytes),
+ asn1ct_name:new(encBytes),
+ asn1ct_name:new(encLen),
+ Emit = ["{",{curr,tmpBytes},", _} = "],
+ {{no_attr,"ObjFun"},Emit};
+ _ ->
+ {false,[]}
+ end,
+ gen_enc_line(Erules,TopType,Cname,Type,"element(2,Val)",9,
+ mandatory,Assign,Encobj),
+ case Encobj of
+ false -> ok;
+ _ ->
+ emit({",",nl,indent(9),"{",{curr,encBytes},", ",
+ {curr,encLen},"}"})
+ end,
+ emit({";",nl}),
+ case T of
+ [] ->
+ emit([indent(6), "Else -> ",nl,
+ indent(9),"exit({error,{asn1,{invalid_choice_type,Else}}})"]);
+ _ ->
+ true
+ end,
+ gen_enc_choice2(Erules,TopType,T);
+
+gen_enc_choice2(_,_,[]) ->
+ true.
+
+
+
+
+%%--------------------------------------------
+%% Decode CHOICE
+%%--------------------------------------------
+
+gen_dec_choice(Erules,TopType, ChTag, CompList, Ext) ->
+ asn1ct_name:delete(bytes),
+ Tags = [X#tag{class=asn1ct_gen_ber:decode_class(X#tag.class)}|| X <- ChTag],
+
+ emit([" {{_,Len},",{next,bytes},
+ ", RbExp} = ?RT_BER:check_tags(TagIn++",
+ {asis,Tags},", ",
+ {curr,bytes},", OptOrMand),",nl]),
+ asn1ct_name:new(bytes),
+ asn1ct_name:new(len),
+ gen_dec_choice_indef_funs(Erules),
+ case Erules of
+ ber_bin ->
+ emit([indent(3),"case ",{curr,bytes}," of",nl]);
+ ber ->
+ emit([indent(3),
+ "case (catch ?RT_BER:peek_tag(",{curr,bytes},")) of",nl])
+ end,
+ asn1ct_name:new(tagList),
+ asn1ct_name:new(choTags),
+ gen_dec_choice_cases(Erules,TopType,CompList),
+ case Ext of
+ noext ->
+ emit([indent(6), {curr,else}," -> ",nl]),
+ emit([indent(9),"case OptOrMand of",nl,
+ indent(12),"mandatory ->","exit({error,{asn1,",
+ "{invalid_choice_tag,",{curr,else},"}}});",nl,
+ indent(12),"_ ->","exit({error,{asn1,{no_optional_tag,",
+ {curr,else},"}}})",nl,
+ indent(9),"end",nl]);
+ _ ->
+ emit([indent(6),"_ -> ",nl]),
+ emit([indent(9),"{{asn1_ExtAlt,",{curr,bytes},"},",
+ empty_lb(Erules),", RbExp}",nl])
+ end,
+ emit([indent(3),"end"]),
+ asn1ct_name:new(tag),
+ asn1ct_name:new(else).
+
+gen_dec_choice_indef_funs(Erules) ->
+ emit({indent(3),"IndefEndBytes = fun(indefinite,",indefend_match(Erules,used_var),
+ ")-> R; (_,B)-> B end,",nl}),
+ emit({indent(3),"IndefEndRb = fun(indefinite,",indefend_match(Erules,unused_var),
+ ")-> 2; (_,_)-> 0 end,",nl}).
+
+
+gen_dec_choice_cases(_,_, []) ->
+ ok;
+gen_dec_choice_cases(Erules,TopType, [H|T]) ->
+ asn1ct_name:push(rbCho),
+ Name = H#'ComponentType'.name,
+ emit([nl,"%% '",Name,"'",nl]),
+ Fcases = fun([T1,T2|Tail],Fun) ->
+ emit([indent(6),match_tag(Erules,T1)," ->",nl]),
+ gen_dec_choice_cases_type(Erules,TopType, H),
+ Fun([T2|Tail],Fun);
+ ([T1],_) ->
+ emit([indent(6),match_tag(Erules,T1)," ->",nl]),
+ gen_dec_choice_cases_type(Erules,TopType, H)
+ end,
+ Fcases(H#'ComponentType'.tags,Fcases),
+ asn1ct_name:pop(rbCho),
+ gen_dec_choice_cases(Erules,TopType, T).
+
+
+
+gen_dec_choice_cases_type(Erules,TopType,H) ->
+ Cname = H#'ComponentType'.name,
+ Type = H#'ComponentType'.typespec,
+ Prop = H#'ComponentType'.prop,
+ emit({indent(9),"{Dec, Rest, ",{curr,rbCho},"} = "}),
+ gen_dec_line(Erules,TopType,Cname,[],Type,Prop,false),
+ emit([",",nl,indent(9),"{{",{asis,Cname},
+ ", Dec}, IndefEndBytes(Len,Rest), RbExp + ",
+ {curr,rbCho}," + IndefEndRb(Len,Rest)};",nl,nl]).
+
+encode_tag_val(Erules,{Class,TagNo}) when integer(TagNo) ->
+ Rtmod = rtmod(Erules),
+ Rtmod:encode_tag_val({asn1ct_gen_ber:decode_class(Class),
+ 0,TagNo});
+encode_tag_val(Erules,{Class,TypeName}) ->
+ Rtmod = rtmod(Erules),
+ Rtmod:encode_tag_val({asn1ct_gen_ber:decode_class(Class),
+ 0,asn1ct_gen_ber:decode_type(TypeName)}).
+
+
+match_tag(ber_bin,Arg) ->
+ match_tag_with_bitsyntax(Arg);
+match_tag(Erules,Arg) ->
+ io_lib:format("~p",[encode_tag_val(Erules,Arg)]).
+
+match_tag_with_bitsyntax({Class,TagNo}) when integer(TagNo) ->
+ match_tag_with_bitsyntax1({asn1ct_gen_ber:decode_class(Class),
+ 0,TagNo});
+match_tag_with_bitsyntax({Class,TypeName}) ->
+ match_tag_with_bitsyntax1({asn1ct_gen_ber:decode_class(Class),
+ 0,asn1ct_gen_ber:decode_type(TypeName)}).
+
+match_tag_with_bitsyntax1({Class, _Form, TagNo}) when (TagNo =< 30) ->
+ io_lib:format("<<~p:2,_:1,~p:5,_/binary>>",[Class bsr 6,TagNo]);
+
+match_tag_with_bitsyntax1({Class, _Form, TagNo}) ->
+ {Octets,Len} = mk_object_val(TagNo),
+ OctForm = case Len of
+ 1 -> "~p";
+ 2 -> "~p,~p";
+ 3 -> "~p,~p,~p";
+ 4 -> "~p,~p,~p,~p"
+ end,
+ io_lib:format("<<~p:2,_:1,31:5," ++ OctForm ++ ",_/binary>>",
+ [Class bsr 6] ++ Octets).
+
+%%%%%%%%%%%
+%% mk_object_val(Value) -> {OctetList, Len}
+%% returns a Val as a list of octets, the 8 bit is allways set to one except
+%% for the last octet, where its 0
+%%
+
+
+mk_object_val(Val) when Val =< 127 ->
+ {[255 band Val], 1};
+mk_object_val(Val) ->
+ mk_object_val(Val bsr 7, [Val band 127], 1).
+mk_object_val(0, Ack, Len) ->
+ {Ack, Len};
+mk_object_val(Val, Ack, Len) ->
+ mk_object_val(Val bsr 7, [((Val band 127) bor 128) | Ack], Len + 1).
+
+
+get_all_choice_tags(ComponentTypeList) ->
+ get_all_choice_tags(ComponentTypeList,[]).
+
+get_all_choice_tags([],TagList) ->
+ TagList;
+get_all_choice_tags([H|T],TagList) ->
+ Tags = H#'ComponentType'.tags,
+ get_all_choice_tags(T, TagList ++ [{H#'ComponentType'.name, Tags}]).
+
+
+
+%%---------------------------------------
+%% Generate the encode/decode code
+%%---------------------------------------
+
+gen_enc_line(Erules,TopType,Cname,
+ Type=#type{constraint=[{componentrelation,_,_}],
+ def=#'ObjectClassFieldType'{type={typefield,_}}},
+ Element,Indent,OptOrMand=mandatory,EncObj)
+ when list(Element) ->
+ asn1ct_name:new(tmpBytes),
+ gen_enc_line(Erules,TopType,Cname,Type,Element,Indent,OptOrMand,
+ ["{",{curr,tmpBytes},",_} = "],EncObj);
+gen_enc_line(Erules,TopType,Cname,Type,Element,Indent,OptOrMand,EncObj)
+ when list(Element) ->
+ gen_enc_line(Erules,TopType,Cname,Type,Element,Indent,OptOrMand,
+ ["{",{curr,encBytes},",",{curr,encLen},"} = "],EncObj).
+
+gen_enc_line(Erules,TopType,Cname,Type,Element,Indent,OptOrMand,Assign,EncObj)
+ when list(Element) ->
+ IndDeep = indent(Indent),
+
+ Tag = [X#tag{class=asn1ct_gen_ber:decode_class(X#tag.class)}
+ || X <- Type#type.tag],
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ WhatKind = asn1ct_gen:type(InnerType),
+ emit(IndDeep),
+ emit(Assign),
+ gen_optormand_case(OptOrMand,Erules,TopType,Cname,Type,InnerType,WhatKind,
+ Element),
+ case {Type,asn1ct_gen:get_constraint(Type#type.constraint,
+ componentrelation)} of
+% #type{constraint=[{tableconstraint_info,RefedFieldName}],
+% def={typefield,_}} ->
+ {#type{def=#'ObjectClassFieldType'{type={typefield,_},
+ fieldname=RefedFieldName}},
+ {componentrelation,_,_}} ->
+ {_LeadingAttrName,Fun} = EncObj,
+ case RefedFieldName of
+ {notype,T} ->
+ throw({error,{notype,type_from_object,T}});
+ {Name,RestFieldNames} when atom(Name) ->
+ case OptOrMand of
+ mandatory -> ok;
+ _ ->
+% emit(["{",{curr,tmpBytes},",",{curr,tmpLen},
+ emit(["{",{curr,tmpBytes},", _} = "])
+%% asn1ct_name:new(tmpBytes),
+%% asn1ct_name:new(tmpLen)
+ end,
+ emit({Fun,"(",{asis,Name},", ",Element,", [], ",
+ {asis,RestFieldNames},"),",nl}),
+ emit(IndDeep),
+ case OptOrMand of
+ mandatory ->
+ emit({"{",{curr,encBytes},", ",{curr,encLen},"} = "}),
+ emit({"?RT_BER:encode_open_type(",{curr,tmpBytes},
+ ",",{asis,Tag},")"});
+ _ ->
+% emit({"{",{next,tmpBytes},", _} = "}),
+ emit({"{",{next,tmpBytes},", ",{curr,tmpLen},
+ "} = "}),
+ emit({"?RT_BER:encode_open_type(",{curr,tmpBytes},
+ ",",{asis,Tag},"),",nl}),
+ emit(IndDeep),
+ emit({"{",{next,tmpBytes},", ",{curr,tmpLen},"}"})
+ end;
+ _ ->
+ throw({asn1,{'internal error'}})
+ end;
+% #type{constraint=[{tableconstraint_info,_}],
+% def={objectfield,PrimFieldName1,PFNList}} ->
+ {{#'ObjectClassFieldType'{type={objectfield,PrimFieldName1,
+ PFNList}},_},
+ {componentrelation,_,_}} ->
+ %% this is when the dotted list in the FieldName has more
+ %% than one element
+ {_LeadingAttrName,Fun} = EncObj,
+ emit({"?RT_BER:encode_open_type(",Fun,"(",{asis,PrimFieldName1},
+ ", ",Element,", ",{asis,PFNList},"),",{asis,Tag},")"});
+ _ ->
+ case WhatKind of
+ {primitive,bif} ->
+ EncType =
+ case Type#type.def of
+ #'ObjectClassFieldType'{
+ type={fixedtypevaluefield,
+ _,Btype}} ->
+ Btype;
+ _ ->
+ Type
+ end,
+ asn1ct_gen_ber:gen_encode_prim(ber,EncType,{asis,Tag},
+ Element);
+ {notype,_} ->
+ emit({"'enc_",InnerType,"'(",Element,", ",{asis,Tag},")"});
+ 'ASN1_OPEN_TYPE' ->
+ asn1ct_gen_ber:gen_encode_prim(ber,Type#type{def='ASN1_OPEN_TYPE'},{asis,Tag},Element);
+ _ ->
+ {EncFunName, _, _} =
+ mkfuncname(TopType,Cname,WhatKind,enc),
+ case {WhatKind,Type#type.tablecinf,EncObj} of
+ {{constructed,bif},[{objfun,_}|_R],{_,Fun}} ->
+ emit([EncFunName,"(",Element,", ",{asis,Tag},
+ ", ",Fun,")"]);
+ _ ->
+ emit([EncFunName,"(",Element,", ",{asis,Tag},")"])
+ end
+ end
+ end,
+ case OptOrMand of
+ mandatory -> true;
+ _ ->
+ emit({nl,indent(7),"end"})
+ end.
+
+
+
+gen_optormand_case(mandatory,_,_,_,_,_,_, _) ->
+ ok;
+gen_optormand_case('OPTIONAL',Erules,_,_,_,_,_,Element) ->
+ emit({" case ",Element," of",nl}),
+ emit({indent(9),"asn1_NOVALUE -> {",
+ empty_lb(Erules),",0};",nl}),
+ emit({indent(9),"_ ->",nl,indent(12)});
+gen_optormand_case({'DEFAULT',DefaultValue},Erules,TopType,Cname,Type,
+ InnerType,WhatKind,Element) ->
+ CurrMod = get(currmod),
+ case catch lists:member(der,get(encoding_options)) of
+ true ->
+ emit(" case catch "),
+ asn1ct_gen:gen_check_call(TopType,Cname,Type,InnerType,
+ WhatKind,{asis,DefaultValue},
+ Element),
+ emit({" of",nl}),
+ emit({indent(12),"true -> {[],0};",nl});
+ _ ->
+ emit({" case ",Element," of",nl}),
+ emit({indent(9),"asn1_DEFAULT -> {",
+ empty_lb(Erules),
+ ",0};",nl}),
+ case DefaultValue of
+ #'Externalvaluereference'{module=CurrMod,
+ value=V} ->
+ emit({indent(9),"?",{asis,V}," -> {",
+ empty_lb(Erules),",0};",nl});
+ _ ->
+ emit({indent(9),{asis,
+ DefaultValue}," -> {",
+ empty_lb(Erules),",0};",nl})
+ end
+ end,
+ emit({indent(9),"_ ->",nl,indent(12)}).
+
+
+
+
+gen_dec_line_sof(_Erules,TopType,Cname,Type,ObjFun) ->
+
+ Tag = [X#tag{class=asn1ct_gen_ber:decode_class(X#tag.class)}
+ || X <- Type#type.tag],
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ WhatKind = asn1ct_gen:type(InnerType),
+ case WhatKind of
+ {primitive,bif} ->
+ asn1ct_name:delete(len),
+
+ asn1ct_name:new(len),
+ emit(["fun(FBytes,_,_)->",nl]),
+ EncType = case Type#type.def of
+ #'ObjectClassFieldType'{
+ type={fixedtypevaluefield,
+ _,Btype}} ->
+ Btype;
+ _ ->
+ Type
+ end,
+ asn1ct_gen_ber:gen_dec_prim(ber,EncType,"FBytes",Tag,
+ [],no_length,?PRIMITIVE,
+ mandatory),
+ emit([nl,"end, []"]);
+ _ ->
+ case ObjFun of
+ [] ->
+ {DecFunName, _, _} =
+ mkfunname(TopType,Cname,WhatKind,dec,3),
+ emit([DecFunName,", ",{asis,Tag}]);
+ _ ->
+ {DecFunName, _, _} =
+ mkfunname(TopType,Cname,WhatKind,dec,4),
+ emit([DecFunName,", ",{asis,Tag},", ObjFun"])
+ end
+ end.
+
+
+gen_dec_line(Erules,TopType,Cname,CTags,Type,OptOrMand,DecObjInf) ->
+ BytesVar = asn1ct_gen:mk_var(asn1ct_name:curr(bytes)),
+ Tag = [X#tag{class=asn1ct_gen_ber:decode_class(X#tag.class)}
+ || X <- Type#type.tag],
+ InnerType =
+ case Type#type.def of
+ #'ObjectClassFieldType'{type=OCFTType} ->
+ OCFTType;
+ _ ->
+ asn1ct_gen:get_inner(Type#type.def)
+ end,
+ PostpDec =
+ case OptOrMand of
+ mandatory ->
+ gen_dec_call(InnerType,Erules,TopType,Cname,Type,
+ BytesVar,Tag,mandatory,", mandatory, ",
+ DecObjInf,OptOrMand);
+ _ -> %optional or default
+ case {CTags,Erules} of
+ {[CTag],ber_bin} ->
+ emit(["case ",{curr,bytes}," of",nl]),
+ emit([match_tag(Erules,CTag)," ->",nl]),
+ PostponedDec =
+ gen_dec_call(InnerType,Erules,TopType,Cname,Type,
+ BytesVar,Tag,mandatory,
+ ", opt_or_default, ",DecObjInf,
+ OptOrMand),
+ emit([";",nl]),
+ emit(["_ ->",nl]),
+ case OptOrMand of
+ {'DEFAULT', Def} ->
+ emit(["{",{asis,Def},",",
+ BytesVar,", 0 }",nl]);
+ 'OPTIONAL' ->
+ emit(["{ asn1_NOVALUE, ",
+ BytesVar,", 0 }",nl])
+ end,
+ emit("end"),
+ PostponedDec;
+ _ ->
+ emit("case (catch "),
+ PostponedDec =
+ gen_dec_call(InnerType,Erules,TopType,Cname,Type,
+ BytesVar,Tag,OptOrMand,
+ ", opt_or_default, ",DecObjInf,
+ OptOrMand),
+ emit([") of",nl]),
+ case OptOrMand of
+ {'DEFAULT', Def} ->
+ emit(["{'EXIT',{error,{asn1,{no_optional_tag,_}}}}",
+ " -> {",{asis,Def},",",
+ BytesVar,", 0 };",nl]);
+ 'OPTIONAL' ->
+ emit(["{'EXIT',{error,{asn1,{no_optional_tag,_}}}}",
+ " -> { asn1_NOVALUE, ",
+ BytesVar,", 0 };",nl])
+ end,
+ asn1ct_name:new(casetmp),
+ emit([{curr,casetmp},"-> ",{curr,casetmp},nl,"end"]),
+ PostponedDec
+ end
+ end,
+ case DecObjInf of
+ {Cname,ObjSet} -> % this must be the component were an object is
+ %% choosen from the object set according to the table
+ %% constraint.
+ {[{ObjSet,Cname,asn1ct_gen:mk_var(asn1ct_name:curr(term))}],
+ PostpDec};
+ _ -> {[],PostpDec}
+ end.
+
+
+gen_dec_call({typefield,_},Erules,_,_,Type,_,Tag,_,_,false,_) ->
+ %% this in case of a choice with typefield components
+ asn1ct_name:new(reason),
+ {FirstPFName,RestPFName} =
+% asn1ct_gen:get_constraint(Type#type.constraint,
+% tableconstraint_info),
+ (Type#type.def)#'ObjectClassFieldType'.fieldname,
+ emit([nl,indent(6),"begin",nl]),
+ emit([indent(9),"{OpenDec,TmpRest,TmpRbCho} =",nl,indent(12),
+ "?RT_BER:decode_open_type(",Erules,",",{curr,bytes},",",
+ {asis,Tag},"),",nl]),
+ emit([indent(9),"case (catch ObjFun(",{asis,FirstPFName},
+ ", OpenDec, [], ",{asis,RestPFName},
+ ")) of", nl]),%% ??? What about Tag
+ emit([indent(12),"{'EXIT',",{curr,reason},"} ->",nl]),
+%% emit({indent(15),"throw({runtime_error,{'Type not ",
+%% "compatible with tableconstraint', OpenDec}});",nl}),
+ emit([indent(15),"exit({'Type not ",
+ "compatible with table constraint', ",{curr,reason},"});",nl]),
+ emit([indent(12),"{TmpDec,_ ,_} ->",nl]),
+ emit([indent(15),"{TmpDec, TmpRest, TmpRbCho}",nl]),
+ emit([indent(9),"end",nl,indent(6),"end",nl]),
+ [];
+gen_dec_call({typefield,_},_Erules,_,Cname,Type,_BytesVar,Tag,_,_,
+ _DecObjInf,OptOrMandComp) ->
+ emit(["?RT_BER:decode_open_type(",{curr,bytes},",",{asis,Tag},")"]),
+ RefedFieldName =
+ (Type#type.def)#'ObjectClassFieldType'.fieldname,
+% asn1ct_gen:get_constraint(Type#type.constraint,
+% tableconstraint_info),
+ [{Cname,RefedFieldName,
+ asn1ct_gen:mk_var(asn1ct_name:curr(term)),
+% asn1ct_gen:mk_var(asn1ct_name:curr(tmpterm)),[],OptOrMandComp}];
+ asn1ct_gen:mk_var(asn1ct_name:curr(tmpterm)),Tag,OptOrMandComp}];
+gen_dec_call({objectfield,PrimFieldName,PFNList},_Erules,_,Cname,_,_,Tag,_,_,_,
+ OptOrMandComp) ->
+ emit(["?RT_BER:decode_open_type(",{curr,bytes},",",{asis,Tag},")"]),
+ [{Cname,{PrimFieldName,PFNList},
+ asn1ct_gen:mk_var(asn1ct_name:curr(term)),
+% asn1ct_gen:mk_var(asn1ct_name:curr(tmpterm)),[],OptOrMandComp}];
+ asn1ct_gen:mk_var(asn1ct_name:curr(tmpterm)),Tag,OptOrMandComp}];
+gen_dec_call(InnerType,Erules,TopType,Cname,Type,BytesVar,Tag,PrimOptOrMand,
+ OptOrMand,DecObjInf,_) ->
+ WhatKind = asn1ct_gen:type(InnerType),
+ gen_dec_call1(WhatKind,InnerType,Erules,TopType,Cname,Type,BytesVar,Tag,
+ PrimOptOrMand,OptOrMand),
+ case DecObjInf of
+ {Cname,{_,OSet,UniqueFName,ValIndex}} ->
+ Term = asn1ct_gen:mk_var(asn1ct_name:curr(term)),
+ ValueMatch = value_match(ValIndex,Term),
+ emit({",",nl,"ObjFun = 'getdec_",OSet,"'(",
+% {asis,UniqueFName},", ",{curr,term},")"});
+ {asis,UniqueFName},", ",ValueMatch,")"});
+ _ ->
+ ok
+ end,
+ [].
+gen_dec_call1({primitive,bif},InnerType,Erules,_,_,Type,BytesVar,
+ Tag,OptOrMand,_) ->
+ case InnerType of
+ {fixedtypevaluefield,_,Btype} ->
+ asn1ct_gen_ber:gen_dec_prim(Erules,Btype,BytesVar,Tag,[],no_length,
+ ?PRIMITIVE,OptOrMand);
+ _ ->
+ asn1ct_gen_ber:gen_dec_prim(Erules,Type,BytesVar,Tag,[],no_length,
+ ?PRIMITIVE,OptOrMand)
+ end;
+gen_dec_call1('ASN1_OPEN_TYPE',_InnerType,Erules,_,_,Type,BytesVar,
+ Tag,OptOrMand,_) ->
+ asn1ct_gen_ber:gen_dec_prim(Erules,Type#type{def='ASN1_OPEN_TYPE'},
+ BytesVar,Tag,[],no_length,
+ ?PRIMITIVE,OptOrMand);
+gen_dec_call1(WhatKind,_,_Erules,TopType,Cname,Type,_,Tag,_,OptOrMand) ->
+ {DecFunName,_,_} =
+ mkfuncname(TopType,Cname,WhatKind,dec),
+ case {WhatKind,Type#type.tablecinf} of
+ {{constructed,bif},[{objfun,_}|_R]} ->
+ emit({DecFunName,"(",{curr,bytes},OptOrMand,{asis,Tag},", ObjFun)"});
+ _ ->
+ emit({DecFunName,"(",{curr,bytes},OptOrMand,{asis,Tag},")"})
+ end.
+
+
+%%------------------------------------------------------
+%% General and special help functions (not exported)
+%%------------------------------------------------------
+
+
+indent(N) ->
+ lists:duplicate(N,32). % 32 = space
+
+
+mkvlist([H,T1|T], Sep) -> % Sep is a string e.g ", " or "+ "
+ emit([{var,H},Sep]),
+ mkvlist([T1|T], Sep);
+mkvlist([H|T], Sep) ->
+ emit([{var,H}]),
+ mkvlist(T, Sep);
+mkvlist([], _) ->
+ true.
+
+mkvlist(L) ->
+ mkvlist(L,", ").
+
+mkvplus(L) ->
+ mkvlist(L," + ").
+
+extensible(CompList) when list(CompList) ->
+ noext;
+extensible({RootList,ExtList}) ->
+ {ext,length(RootList)+1,length(ExtList)}.
+
+
+print_attribute_comment(InnerType,Pos,Prop) ->
+ CommentLine = "%%-------------------------------------------------",
+ emit([nl,CommentLine]),
+ case InnerType of
+ {typereference,_,Name} ->
+ emit([nl,"%% attribute number ",Pos," with type ",Name]);
+ {'Externaltypereference',_,XModule,Name} ->
+ emit([nl,"%% attribute number ",Pos," External ",XModule,":",Name]);
+ _ ->
+ emit([nl,"%% attribute number ",Pos," with type ",InnerType])
+ end,
+ case Prop of
+ mandatory ->
+ continue;
+ {'DEFAULT', Def} ->
+ emit([" DEFAULT = ",{asis,Def}]);
+ 'OPTIONAL' ->
+ emit([" OPTIONAL"])
+ end,
+ emit([nl,CommentLine,nl]).
+
+
+mkfuncname(TopType,Cname,WhatKind,DecOrEnc) ->
+ CurrMod = get(currmod),
+ case WhatKind of
+ #'Externaltypereference'{module=CurrMod,type=EType} ->
+ F = lists:concat(["'",DecOrEnc,"_",EType,"'"]),
+ {F, "?MODULE", F};
+ #'Externaltypereference'{module=Mod,type=EType} ->
+ {lists:concat(["'",Mod,"':'",DecOrEnc,"_",EType,"'"]),Mod,
+ lists:concat(["'",DecOrEnc,"_",EType,"'"])};
+ {constructed,bif} ->
+ F = lists:concat(["'",DecOrEnc,"_",asn1ct_gen:list2name([Cname|TopType]),"'"]),
+ {F, "?MODULE", F}
+ end.
+
+mkfunname(TopType,Cname,WhatKind,DecOrEnc,Arity) ->
+ CurrMod = get(currmod),
+ case WhatKind of
+ #'Externaltypereference'{module=CurrMod,type=EType} ->
+ F = lists:concat(["fun '",DecOrEnc,"_",EType,"'/",Arity]),
+ {F, "?MODULE", F};
+ #'Externaltypereference'{module=Mod,type=EType} ->
+ {lists:concat(["{'",Mod,"','",DecOrEnc,"_",EType,"'}"]),Mod,
+ lists:concat(["'",DecOrEnc,"_",EType,"'"])};
+ {constructed,bif} ->
+ F =
+ lists:concat(["fun '",DecOrEnc,"_",
+ asn1ct_gen:list2name([Cname|TopType]),"'/",
+ Arity]),
+ {F, "?MODULE", F}
+ end.
+
+empty_lb(ber) ->
+ "[]";
+empty_lb(ber_bin) ->
+ "<<>>".
+
+rtmod(ber) ->
+ list_to_atom(?RT_BER);
+rtmod(ber_bin) ->
+ list_to_atom(?RT_BER_BIN).
+
+indefend_match(ber,used_var) ->
+ "[0,0|R]";
+indefend_match(ber,unused_var) ->
+ "[0,0|_R]";
+indefend_match(ber_bin,used_var) ->
+ "<<0,0,R/binary>>";
+indefend_match(ber_bin,unused_var) ->
+ "<<0,0,_R/binary>>".
+
+notice_value_match() ->
+ Module = get(currmod),
+ put(value_match,{true,Module}).
+
+value_match(Index,Value) when atom(Value) ->
+ value_match(Index,atom_to_list(Value));
+value_match([],Value) ->
+ Value;
+value_match([{VI,_Cname}|VIs],Value) ->
+ value_match1(Value,VIs,lists:concat(["element(",VI,","]),1).
+value_match1(Value,[],Acc,Depth) ->
+ Acc ++ Value ++ lists:concat(lists:duplicate(Depth,")"));
+value_match1(Value,[{VI,_Cname}|VIs],Acc,Depth) ->
+ value_match1(Value,VIs,Acc++lists:concat(["element(",VI,","]),Depth+1).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_constructed_ber_bin_v2.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_constructed_ber_bin_v2.erl
new file mode 100644
index 0000000000..991240731e
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_constructed_ber_bin_v2.erl
@@ -0,0 +1,1357 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1ct_constructed_ber_bin_v2.erl,v 1.1 2008/12/17 09:53:29 mikpe Exp $
+%%
+-module(asn1ct_constructed_ber_bin_v2).
+
+-export([gen_encode_sequence/3]).
+-export([gen_decode_sequence/3]).
+-export([gen_encode_set/3]).
+-export([gen_decode_set/3]).
+-export([gen_encode_sof/4]).
+-export([gen_decode_sof/4]).
+-export([gen_encode_choice/3]).
+-export([gen_decode_choice/3]).
+
+
+-include("asn1_records.hrl").
+
+-import(asn1ct_gen, [emit/1,demit/1]).
+-import(asn1ct_constructed_ber,[match_tag/2]).
+
+-define(ASN1CT_GEN_BER,asn1ct_gen_ber_bin_v2).
+
+% the encoding of class of tag bits 8 and 7
+-define(UNIVERSAL, 0).
+-define(APPLICATION, 16#40).
+-define(CONTEXT, 16#80).
+-define(PRIVATE, 16#C0).
+
+% primitive or constructed encoding % bit 6
+-define(PRIMITIVE, 0).
+-define(CONSTRUCTED, 2#00100000).
+
+
+
+
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+%% Encode/decode SEQUENCE (and SET)
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+
+gen_encode_sequence(Erules,Typename,D) when record(D,type) ->
+ asn1ct_name:start(),
+ asn1ct_name:new(term),
+ asn1ct_name:new(bytes),
+
+ %% if EXTERNAL type the input value must be transformed to
+ %% ASN1 1990 format
+ ValName =
+ case Typename of
+ ['EXTERNAL'] ->
+ emit([indent(4),
+ "NewVal = asn1rt_check:transform_to_EXTERNAL1990(Val),",
+ nl]),
+ "NewVal";
+ _ ->
+ "Val"
+ end,
+
+ {SeqOrSet,TableConsInfo,CompList} =
+ case D#type.def of
+ #'SEQUENCE'{tablecinf=TCI,components=CL} ->
+ {'SEQUENCE',TCI,CL};
+ #'SET'{tablecinf=TCI,components=CL} ->
+ {'SET',TCI,CL}
+ end,
+ Ext = extensible(CompList),
+ CompList1 = case CompList of
+ {Rl,El} -> Rl ++ El;
+ _ -> CompList
+ end,
+
+%% don't match recordname for now, because of compatibility reasons
+%% emit(["{'",asn1ct_gen:list2rname(Typename),"'"]),
+ emit(["{_"]),
+ case length(CompList1) of
+ 0 ->
+ true;
+ CompListLen ->
+ emit([","]),
+ mkcindexlist([Tc || Tc <- lists:seq(1,CompListLen)])
+ end,
+ emit(["} = ",ValName,",",nl]),
+ EncObj =
+ case TableConsInfo of
+ #simpletableattributes{usedclassfield=Used,
+ uniqueclassfield=Unique} when Used /= Unique ->
+ false;
+ %% ObjectSet, name of the object set in constraints
+ %%
+ #simpletableattributes{objectsetname=ObjectSet,
+ c_name=AttrN,
+ c_index=N,
+ usedclassfield=UniqueFieldName,
+ uniqueclassfield=UniqueFieldName,
+ valueindex=ValueIndex} -> %% N is index of attribute that determines constraint
+ OSDef =
+ case ObjectSet of
+ {Module,OSName} ->
+ asn1_db:dbget(Module,OSName);
+ OSName ->
+ asn1_db:dbget(get(currmod),OSName)
+ end,
+% io:format("currmod: ~p~nOSName: ~p~nAttrN: ~p~nN: ~p~nUniqueFieldName: ~p~n",
+% [get(currmod),OSName,AttrN,N,UniqueFieldName]),
+ case (OSDef#typedef.typespec)#'ObjectSet'.gen of
+ true ->
+ ObjectEncode =
+ asn1ct_gen:un_hyphen_var(lists:concat(['Obj',
+ AttrN])),
+ emit([ObjectEncode," = ",nl]),
+ emit([" 'getenc_",ObjectSet,"'(",{asis,UniqueFieldName},
+ ", ",nl]),
+ ValueMatch = value_match(ValueIndex,
+ lists:concat(["Cindex",N])),
+ emit([indent(35),ValueMatch,"),",nl]),
+ {AttrN,ObjectEncode};
+ _ ->
+ false
+ end;
+ _ ->
+ case D#type.tablecinf of
+ [{objfun,_}|_] ->
+ %% when the simpletableattributes was at an outer
+ %% level and the objfun has been passed through the
+ %% function call
+ {"got objfun through args","ObjFun"};
+ _ ->
+ false
+ end
+ end,
+
+ gen_enc_sequence_call(Erules,Typename,CompList1,1,Ext,EncObj),
+
+ emit([nl," BytesSoFar = "]),
+ case SeqOrSet of
+ 'SET' when (D#type.def)#'SET'.sorted == dynamic ->
+ emit("?RT_BER:dynamicsort_SET_components(["),
+ mkvlist(asn1ct_name:all(encBytes)),
+ emit(["]),",nl]);
+ _ ->
+ emit("["),
+ mkvlist(asn1ct_name:all(encBytes)),
+ emit(["],",nl])
+ end,
+ emit("LenSoFar = "),
+ case asn1ct_name:all(encLen) of
+ [] -> emit("0");
+ AllLengths ->
+ mkvplus(AllLengths)
+ end,
+ emit([",",nl]),
+ emit(["?RT_BER:encode_tags(TagIn, BytesSoFar, LenSoFar)."
+ ,nl]).
+
+gen_decode_sequence(Erules,Typename,D) when record(D,type) ->
+ asn1ct_name:start(),
+ asn1ct_name:new(tag),
+ #'SEQUENCE'{tablecinf=TableConsInfo,components=CList} = D#type.def,
+ Ext = extensible(CList),
+ CompList = case CList of
+ {Rl,El} -> Rl ++ El;
+ _ -> CList
+ end,
+
+ emit([" %%-------------------------------------------------",nl]),
+ emit([" %% decode tag and length ",nl]),
+ emit([" %%-------------------------------------------------",nl]),
+
+ asn1ct_name:new(tlv),
+ case CompList of
+ EmptyCL when EmptyCL == [];EmptyCL == {[],[]}-> % empty sequence
+ true;
+ _ ->
+ emit([{curr,tlv}," = "])
+ end,
+ emit(["?RT_BER:match_tags(",{prev,tlv},",TagIn), ",nl]),
+ asn1ct_name:new(tlv),
+ asn1ct_name:new(v),
+
+ {DecObjInf,UniqueFName,ValueIndex} =
+ case TableConsInfo of
+ #simpletableattributes{objectsetname=ObjectSet,
+ c_name=AttrN,
+ usedclassfield=UniqueFieldName,
+ uniqueclassfield=UniqueFieldName,
+ valueindex=ValIndex} ->
+% {ObjectSet,AttrN,_N,UniqueFieldName} ->%% N is index of attribute that determines constraint
+ F = fun(#'ComponentType'{typespec=CT})->
+ case {CT#type.constraint,CT#type.tablecinf} of
+ {[],[{objfun,_}|_]} -> true;
+ _ -> false
+ end
+ end,
+ case lists:any(F,CompList) of
+ true -> % when component relation constraint establish
+ %% relation from a component to another components
+ %% subtype component
+ {{AttrN,{deep,ObjectSet,UniqueFieldName,ValIndex}},
+ UniqueFieldName,ValIndex};
+ false ->
+ {{AttrN,ObjectSet},UniqueFieldName,ValIndex}
+ end;
+ _ ->
+% case D#type.tablecinf of
+% [{objfun,_}|_] ->
+% {{"got objfun through args","ObjFun"},false,false};
+% _ ->
+ {false,false,false}
+% end
+ end,
+ case gen_dec_sequence_call(Erules,Typename,CompList,Ext,DecObjInf) of
+ no_terms -> % an empty sequence
+ emit([nl,nl]),
+ demit(["Result = "]), %dbg
+ %% return value as record
+ asn1ct_name:new(rb),
+ emit([" {'",asn1ct_gen:list2rname(Typename),"'}.",nl,nl]);
+ {LeadingAttrTerm,PostponedDecArgs} ->
+ emit([com,nl,nl]),
+ case {LeadingAttrTerm,PostponedDecArgs} of
+ {[],[]} ->
+ ok;
+ {_,[]} ->
+ ok;
+ {[{ObjSet,LeadingAttr,Term}],PostponedDecArgs} ->
+ DecObj = asn1ct_gen:un_hyphen_var(lists:concat(['DecObj',LeadingAttr,Term])),
+ ValueMatch = value_match(ValueIndex,Term),
+ emit([DecObj," =",nl," 'getdec_",ObjSet,"'(",
+ {asis,UniqueFName},", ",ValueMatch,"),",nl]),
+ gen_dec_postponed_decs(DecObj,PostponedDecArgs)
+ end,
+ demit(["Result = "]), %dbg
+ %% return value as record
+ case Ext of
+ {ext,_,_} ->
+ emit(["case ",{prev,tlv}," of [] -> true; _ -> true end, % ... extra fields skipped",nl]);
+ noext ->
+ emit(["case ",{prev,tlv}," of",nl,
+ "[] -> true;",
+ "_ -> exit({error,{asn1, {unexpected,",{prev,tlv},
+ "}}}) % extra fields not allowed",nl,
+ "end,",nl])
+ end,
+ asn1ct_name:new(rb),
+ case Typename of
+ ['EXTERNAL'] ->
+ emit([" OldFormat={'",asn1ct_gen:list2rname(Typename),
+ "', "]),
+ mkvlist(asn1ct_name:all(term)),
+ emit(["},",nl]),
+ emit([" asn1rt_check:transform_to_EXTERNAL1994",
+ "(OldFormat).",nl]);
+ _ ->
+ emit([" {'",asn1ct_gen:list2rname(Typename),"', "]),
+ mkvlist(asn1ct_name:all(term)),
+ emit(["}.",nl,nl])
+ end
+ end.
+
+gen_dec_postponed_decs(_,[]) ->
+ emit(nl);
+gen_dec_postponed_decs(DecObj,[{_Cname,{FirstPFN,PFNList},Term,
+ TmpTerm,_Tag,OptOrMand}|Rest]) ->
+
+ asn1ct_name:new(tmpterm),
+ asn1ct_name:new(reason),
+ asn1ct_name:new(tmptlv),
+
+ emit([Term," = ",nl]),
+ N = case OptOrMand of
+ mandatory -> 0;
+ 'OPTIONAL' ->
+ emit_opt_or_mand_check(asn1_NOVALUE,TmpTerm),
+ 6;
+ {'DEFAULT',Val} ->
+ emit_opt_or_mand_check(Val,TmpTerm),
+ 6
+ end,
+ emit([indent(N+3),"case (catch ",DecObj,"(",{asis,FirstPFN},
+ ", ",TmpTerm,", ",{asis,PFNList},")) of",nl]),
+ emit([indent(N+6),"{'EXIT', ",{curr,reason},"} ->",nl]),
+ emit([indent(N+9),"exit({'Type not compatible with table constraint',",
+ {curr,reason},"});",nl]),
+ emit([indent(N+6),{curr,tmpterm}," ->",nl]),
+ emit([indent(N+9),{curr,tmpterm},nl]),
+
+ case OptOrMand of
+ mandatory -> emit([indent(N+3),"end,",nl]);
+ _ ->
+ emit([indent(N+3),"end",nl,
+ indent(3),"end,",nl])
+ end,
+ gen_dec_postponed_decs(DecObj,Rest).
+
+emit_opt_or_mand_check(Value,TmpTerm) ->
+ emit([indent(3),"case ",TmpTerm," of",nl,
+ indent(6),{asis,Value}," ->",{asis,Value},";",nl,
+ indent(6),"_ ->",nl]).
+
+%%============================================================================
+%% Encode/decode SET
+%%
+%%============================================================================
+
+gen_encode_set(Erules,Typename,D) when record(D,type) ->
+ gen_encode_sequence(Erules,Typename,D).
+
+gen_decode_set(Erules,Typename,D) when record(D,type) ->
+ asn1ct_name:start(),
+ asn1ct_name:new(term),
+ asn1ct_name:new(tag),
+ #'SET'{tablecinf=TableConsInfo,components=TCompList} = D#type.def,
+ Ext = extensible(TCompList),
+ CompList = case TCompList of
+ {Rl,El} -> Rl ++ El;
+ _ -> TCompList
+ end,
+
+ asn1ct_name:clear(),
+ asn1ct_name:new(tlv),
+ case CompList of
+ EmptyCL when EmptyCL == [];EmptyCL == {[],[]}-> % empty sequence
+ true;
+ _ ->
+ emit([{curr,tlv}," = "])
+ end,
+ emit(["?RT_BER:match_tags(",{prev,tlv},",TagIn), ",nl]),
+ asn1ct_name:new(v),
+
+
+ {DecObjInf,UniqueFName} =
+ case TableConsInfo of
+ {ObjectSet,AttrN,_N,UniqueFieldName} ->%% N is index of attribute that determines constraint
+ F = fun(#'ComponentType'{typespec=CT})->
+ case {CT#type.constraint,CT#type.tablecinf} of
+ {[],[{objfun,_}|_]} -> true;
+ _ -> false
+ end
+ end,
+ case lists:any(F,CompList) of
+ true -> % when component relation constraint establish
+ %% relation from a component to another components
+ %% subtype component
+ {{AttrN,{deep,ObjectSet,UniqueFieldName}},
+ UniqueFieldName};
+ false ->
+ {{AttrN,ObjectSet},UniqueFieldName}
+ end;
+ _ ->
+ {false,false}
+ end,
+
+ case CompList of
+ [] -> % empty set
+ true;
+ _ ->
+ emit(["SetFun = fun(FunTlv) ->", nl]),
+ emit(["case FunTlv of ",nl]),
+ NextNum = gen_dec_set_cases(Erules,Typename,CompList,1),
+ emit([indent(6), {curr,else}," -> ",nl,
+ indent(9),"{",NextNum,", ",{curr,else},"}",nl]),
+ emit([indent(3),"end",nl]),
+ emit([indent(3),"end,",nl]),
+
+ emit(["PositionList = [SetFun(TempTlv)|| TempTlv <- ",{curr,tlv},"],",nl]),
+ asn1ct_name:new(tlv),
+ emit([{curr,tlv}," = [Stlv || {_,Stlv} <- lists:sort(PositionList)],",nl]),
+ asn1ct_name:new(tlv)
+
+ end,
+ case gen_dec_sequence_call(Erules,Typename,CompList,Ext,DecObjInf) of
+ no_terms -> % an empty sequence
+ emit([nl,nl]),
+ demit(["Result = "]), %dbg
+ %% return value as record
+ emit([" {'",asn1ct_gen:list2rname(Typename),"'}.",nl]);
+ {LeadingAttrTerm,PostponedDecArgs} ->
+ emit([com,nl,nl]),
+ case {LeadingAttrTerm,PostponedDecArgs} of
+ {[],[]} ->
+ ok;
+ {_,[]} ->
+ ok;
+ {[{ObjSet,LeadingAttr,Term}],PostponedDecArgs} ->
+ DecObj = lists:concat(['DecObj',LeadingAttr,Term]),
+ emit([DecObj," =",nl," 'getdec_",ObjSet,"'(",
+ {asis,UniqueFName},", ",Term,"),",nl]),
+ gen_dec_postponed_decs(DecObj,PostponedDecArgs)
+ end,
+ demit(["Result = "]), %dbg
+ %% return value as record
+ case Ext of
+ {ext,_,_} ->
+ emit(["case ",{prev,tlv}," of [] -> true; _ -> true end, % ... extra fields skipped",nl]);
+ noext ->
+ emit(["case ",{prev,tlv}," of",nl,
+ "[] -> true;",
+ "_ -> exit({error,{asn1, {unexpected,",{prev,tlv},
+ "}}}) % extra fields not allowed",nl,
+ "end,",nl])
+ end,
+ emit([" {'",asn1ct_gen:list2rname(Typename),"', "]),
+ mkvlist(asn1ct_name:all(term)),
+ emit(["}.",nl])
+ end.
+
+
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+%% Encode/decode SEQUENCE OF and SET OF
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+
+gen_encode_sof(Erules,Typename,_InnerTypename,D) when record(D,type) ->
+ asn1ct_name:start(),
+ {SeqOrSetOf, Cont} = D#type.def,
+
+ Objfun = case D#type.tablecinf of
+ [{objfun,_}|_R] ->
+ ", ObjFun";
+ _ ->
+ ""
+ end,
+
+ emit([" {EncBytes,EncLen} = 'enc_",asn1ct_gen:list2name(Typename),
+ "_components'(Val",Objfun,",[],0),",nl]),
+
+ emit([" ?RT_BER:encode_tags(TagIn, EncBytes, EncLen).",nl,nl]),
+
+ gen_encode_sof_components(Erules,Typename,SeqOrSetOf,Cont).
+
+
+gen_decode_sof(Erules,TypeName,_InnerTypeName,D) when record(D,type) ->
+ asn1ct_name:start(),
+ {SeqOrSetOf, _TypeTag, Cont} =
+ case D#type.def of
+ {'SET OF',_Cont} -> {'SET OF','SET',_Cont};
+ {'SEQUENCE OF',_Cont} -> {'SEQUENCE OF','SEQUENCE',_Cont}
+ end,
+ TypeNameSuffix = asn1ct_gen:constructed_suffix(SeqOrSetOf,Cont#type.def),
+
+ emit([" %%-------------------------------------------------",nl]),
+ emit([" %% decode tag and length ",nl]),
+ emit([" %%-------------------------------------------------",nl]),
+
+ asn1ct_name:new(tlv),
+ emit([{curr,tlv},
+ " = ?RT_BER:match_tags(",{prev,tlv},",TagIn), ",nl]),
+ asn1ct_name:new(v),
+
+ emit(["["]),
+
+ InnerType = asn1ct_gen:get_inner(Cont#type.def),
+ ContName = case asn1ct_gen:type(InnerType) of
+ Atom when atom(Atom) -> Atom;
+ _ -> TypeNameSuffix
+ end,
+%% fix me
+ ObjFun =
+ case D#type.tablecinf of
+ [{objfun,_}|_R] ->
+ ", ObjFun";
+ _ ->
+ []
+ end,
+ gen_dec_line(Erules,TypeName,ContName,[],Cont,mandatory,ObjFun),
+ %% gen_dec_line_sof(Erules,Typename,ContName,Cont,ObjFun),
+ emit([" || ",{curr,v}," <- ",{curr,tlv},"].",nl,nl,nl]).
+
+
+gen_encode_sof_components(Erules,Typename,SeqOrSetOf,Cont)
+ when record(Cont,type)->
+
+ {Objfun,Objfun_novar,EncObj} =
+ case Cont#type.tablecinf of
+ [{objfun,_}|_R] ->
+ {", ObjFun",", _",{no_attr,"ObjFun"}};
+ _ ->
+ {"","",false}
+ end,
+ emit(["'enc_",asn1ct_gen:list2name(Typename),
+ "_components'([]",Objfun_novar,", AccBytes, AccLen) -> ",nl]),
+
+ case catch lists:member(der,get(encoding_options)) of
+ true ->
+ emit([indent(3),
+ "{?RT_BER:dynamicsort_SETOF(AccBytes),AccLen};",nl,nl]);
+ _ ->
+ emit([indent(3),"{lists:reverse(AccBytes),AccLen};",nl,nl])
+ end,
+ emit(["'enc_",asn1ct_gen:list2name(Typename),
+ "_components'([H|T]",Objfun,",AccBytes, AccLen) ->",nl]),
+ TypeNameSuffix = asn1ct_gen:constructed_suffix(SeqOrSetOf,Cont#type.def),
+ gen_enc_line(Erules,Typename,TypeNameSuffix,Cont,"H",3,
+ mandatory,"{EncBytes,EncLen} = ",EncObj),
+ emit([",",nl]),
+ emit([indent(3),"'enc_",asn1ct_gen:list2name(Typename),
+ "_components'(T",Objfun,","]),
+ emit(["[EncBytes|AccBytes], AccLen + EncLen).",nl,nl]).
+
+%%============================================================================
+%% Encode/decode CHOICE
+%%
+%%============================================================================
+
+gen_encode_choice(Erules,Typename,D) when record(D,type) ->
+ ChoiceTag = D#type.tag,
+ {'CHOICE',CompList} = D#type.def,
+ Ext = extensible(CompList),
+ CompList1 = case CompList of
+ {Rl,El} -> Rl ++ El;
+ _ -> CompList
+ end,
+ gen_enc_choice(Erules,Typename,ChoiceTag,CompList1,Ext),
+ emit([nl,nl]).
+
+gen_decode_choice(Erules,Typename,D) when record(D,type) ->
+ asn1ct_name:start(),
+ asn1ct_name:new(bytes),
+ ChoiceTag = D#type.tag,
+ {'CHOICE',CompList} = D#type.def,
+ Ext = extensible(CompList),
+ CompList1 = case CompList of
+ {Rl,El} -> Rl ++ El;
+ _ -> CompList
+ end,
+ gen_dec_choice(Erules,Typename,ChoiceTag,CompList1,Ext),
+ emit([".",nl]).
+
+
+%%============================================================================
+%% Encode SEQUENCE
+%%
+%%============================================================================
+
+gen_enc_sequence_call(Erules,TopType,[#'ComponentType'{name=Cname,typespec=Type,prop=Prop}|Rest],Pos,Ext,EncObj) ->
+ asn1ct_name:new(encBytes),
+ asn1ct_name:new(encLen),
+ Element =
+ case TopType of
+ ['EXTERNAL'] ->
+ io_lib:format("Cindex~w",[Pos]);
+ _ ->
+ io_lib:format("Cindex~w",[Pos])
+ end,
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ print_attribute_comment(InnerType,Pos,Cname,Prop),
+ gen_enc_line(Erules,TopType,Cname,Type,Element,3,Prop,EncObj),
+ emit([com,nl]),
+ gen_enc_sequence_call(Erules,TopType,Rest,Pos+1,Ext,EncObj);
+
+gen_enc_sequence_call(_Erules,_TopType,[],_Num,_,_) ->
+ true.
+
+%%============================================================================
+%% Decode SEQUENCE
+%%
+%%============================================================================
+
+gen_dec_sequence_call(Erules,TopType,CompList,Ext,DecObjInf) ->
+ gen_dec_sequence_call1(Erules,TopType, CompList, 1, Ext,DecObjInf,[],[]).
+
+
+gen_dec_sequence_call1(Erules,TopType,[#'ComponentType'{name=Cname,typespec=Type,prop=Prop,tags=Tags}|Rest],Num,Ext,DecObjInf,LeadingAttrAcc,ArgsAcc) ->
+ {LA,PostponedDec} =
+ gen_dec_component(Erules,TopType,Cname,Tags,Type,Num,Prop,
+ Ext,DecObjInf),
+ case Rest of
+ [] ->
+ {LA ++ LeadingAttrAcc,PostponedDec ++ ArgsAcc};
+ _ ->
+ emit([com,nl]),
+ asn1ct_name:new(bytes),
+ gen_dec_sequence_call1(Erules,TopType,Rest,Num+1,Ext,DecObjInf,
+ LA++LeadingAttrAcc,PostponedDec++ArgsAcc)
+ end;
+
+gen_dec_sequence_call1(_Erules,_TopType,[],1,_,_,_,_) ->
+ no_terms.
+
+
+%%----------------------------
+%%SEQUENCE mandatory
+%%----------------------------
+
+gen_dec_component(Erules,TopType,Cname,CTags,Type,Pos,Prop,Ext,DecObjInf) ->
+ InnerType =
+ case Type#type.def of
+ #'ObjectClassFieldType'{type=OCFTType} -> OCFTType;
+ _ -> asn1ct_gen:get_inner(Type#type.def)
+ end,
+% case asn1ct_gen:get_constraint(Type#type.constraint,
+% tableconstraint_info) of
+% no ->
+% asn1ct_gen:get_inner(Type#type.def);
+% _ ->
+% Type#type.def
+% end,
+ Prop1 = case {Prop,Ext} of
+ {mandatory,{ext,Epos,_}} when Pos >= Epos ->
+ 'OPTIONAL';
+ _ ->
+ Prop
+ end,
+ print_attribute_comment(InnerType,Pos,Cname,Prop1),
+ asn1ct_name:new(term),
+ emit_term_tlv(Prop1,InnerType,DecObjInf),
+ asn1ct_name:new(rb),
+ PostponedDec =
+ gen_dec_line(Erules,TopType,Cname,CTags,Type,Prop1,DecObjInf),
+ asn1ct_name:new(v),
+ asn1ct_name:new(tlv),
+ asn1ct_name:new(form),
+ PostponedDec.
+
+
+emit_term_tlv({'DEFAULT',_},InnerType,DecObjInf) ->
+ emit_term_tlv(opt_or_def,InnerType,DecObjInf);
+emit_term_tlv('OPTIONAL',InnerType,DecObjInf) ->
+ emit_term_tlv(opt_or_def,InnerType,DecObjInf);
+emit_term_tlv(Prop,{typefield,_},DecObjInf) ->
+ emit_term_tlv(Prop,type_or_object_field,DecObjInf);
+emit_term_tlv(Prop,{objectfield,_,_},DecObjInf) ->
+ emit_term_tlv(Prop,type_or_object_field,DecObjInf);
+emit_term_tlv(opt_or_def,type_or_object_field,_) ->
+ asn1ct_name:new(tmpterm),
+ emit(["{",{curr,tmpterm},",",{curr,tlv},"} = "]);
+emit_term_tlv(opt_or_def,_,_) ->
+ emit(["{",{curr,term},",",{curr,tlv},"} = "]);
+emit_term_tlv(_,type_or_object_field,false) ->
+ emit(["[",{curr,v},"|",{curr,tlv},"] = ",{prev,tlv},", ",nl,
+ {curr,term}," = "]);
+emit_term_tlv(_,type_or_object_field,_) ->
+ asn1ct_name:new(tmpterm),
+ emit(["[",{curr,v},"|",{curr,tlv},"] = ",{prev,tlv},", ",nl]),
+ emit([nl," ",{curr,tmpterm}," = "]);
+emit_term_tlv(mandatory,_,_) ->
+ emit(["[",{curr,v},"|",{curr,tlv},"] = ",{prev,tlv},", ",nl,
+ {curr,term}," = "]).
+
+
+gen_dec_set_cases(_Erules,_TopType,[],Pos) ->
+ Pos;
+gen_dec_set_cases(Erules,TopType,[Comp|RestComps],Pos) ->
+ Name = Comp#'ComponentType'.name,
+ Type = Comp#'ComponentType'.typespec,
+ CTags = Comp#'ComponentType'.tags,
+
+ emit([indent(6),"%",Name,nl]),
+ Tags = case Type#type.tag of
+ [] -> % this is a choice without explicit tag
+ [(?ASN1CT_GEN_BER:decode_class(T1class) bsl 10) + T1number||
+ {T1class,T1number} <- CTags];
+ [FirstTag|_] ->
+ [(?ASN1CT_GEN_BER:decode_class(FirstTag#tag.class) bsl 10) + FirstTag#tag.number]
+ end,
+% emit([indent(6),"%Tags: ",Tags,nl]),
+% emit([indent(6),"%Type#type.tag: ",Type#type.tag,nl]),
+ CaseFun = fun(TagList=[H|T],Fun,N) ->
+ Semicolon = case TagList of
+ [_Tag1,_|_] -> [";",nl];
+ _ -> ""
+ end,
+ emit(["TTlv = {",H,",_} ->",nl]),
+ emit([indent(4),"{",Pos,", TTlv}",Semicolon]),
+ Fun(T,Fun,N+1);
+ ([],_,0) ->
+ true;
+ ([],_,_) ->
+ emit([";",nl])
+ end,
+ CaseFun(Tags,CaseFun,0),
+%% emit([";",nl]),
+ gen_dec_set_cases(Erules,TopType,RestComps,Pos+1).
+
+
+
+%%---------------------------------------------
+%% Encode CHOICE
+%%---------------------------------------------
+%% for BER we currently do care (a little) if the choice has an EXTENSIONMARKER
+
+
+gen_enc_choice(Erules,TopType,Tag,CompList,_Ext) ->
+ gen_enc_choice1(Erules,TopType,Tag,CompList,_Ext).
+
+gen_enc_choice1(Erules,TopType,_Tag,CompList,_Ext) ->
+ asn1ct_name:clear(),
+ emit([" {EncBytes,EncLen} = case element(1,Val) of",nl]),
+ gen_enc_choice2(Erules,TopType,CompList),
+ emit([nl," end,",nl,nl]),
+
+ emit(["?RT_BER:encode_tags(TagIn, EncBytes, EncLen).",nl]).
+
+
+gen_enc_choice2(Erules,TopType,[H1|T]) when record(H1,'ComponentType') ->
+ Cname = H1#'ComponentType'.name,
+ Type = H1#'ComponentType'.typespec,
+ emit([" ",{asis,Cname}," ->",nl]),
+ {Encobj,Assign} =
+ case {Type#type.def,asn1ct_gen:get_constraint(Type#type.constraint,
+ componentrelation)} of
+ {#'ObjectClassFieldType'{},{componentrelation,_,_}} ->
+ asn1ct_name:new(tmpBytes),
+ asn1ct_name:new(encBytes),
+ asn1ct_name:new(encLen),
+ Emit = ["{",{curr,tmpBytes},", _} = "],
+ {{no_attr,"ObjFun"},Emit};
+ _ ->
+ {false,[]}
+ end,
+% case asn1ct_gen:get_constraint(Type#type.constraint,
+% tableconstraint_info) of
+% no ->
+% {false,[]};
+% _ ->
+% asn1ct_name:new(tmpBytes),
+% asn1ct_name:new(encBytes),
+% asn1ct_name:new(encLen),
+% Emit = ["{",{curr,tmpBytes},", _} = "],
+% {{no_attr,"ObjFun"},Emit}
+% end,
+ gen_enc_line(Erules,TopType,Cname,Type,"element(2,Val)",9,
+ mandatory,Assign,Encobj),
+ case Encobj of
+ false -> ok;
+ _ ->
+ emit([",",nl,indent(9),"{",{curr,encBytes},", ",
+ {curr,encLen},"}"])
+ end,
+ emit([";",nl]),
+ case T of
+ [] ->
+ emit([indent(6), "Else -> ",nl,
+ indent(9),"exit({error,{asn1,{invalid_choice_type,Else}}})"]);
+ _ ->
+ true
+ end,
+ gen_enc_choice2(Erules,TopType,T);
+
+gen_enc_choice2(_Erules,_TopType,[]) ->
+ true.
+
+
+
+
+%%--------------------------------------------
+%% Decode CHOICE
+%%--------------------------------------------
+
+gen_dec_choice(Erules,TopType, _ChTag, CompList, Ext) ->
+ asn1ct_name:clear(),
+ asn1ct_name:new(tlv),
+ emit([{curr,tlv},
+ " = ?RT_BER:match_tags(",{prev,tlv},",TagIn), ",nl]),
+ asn1ct_name:new(tlv),
+ asn1ct_name:new(v),
+ emit(["case (case ",{prev,tlv},
+ " of [Ctemp",{prev,tlv},"] -> Ctemp",{prev,tlv},
+ "; _ -> ",{prev,tlv}," end)"," of",nl]),
+ asn1ct_name:new(tagList),
+ asn1ct_name:new(choTags),
+ asn1ct_name:new(res),
+ gen_dec_choice_cases(Erules,TopType,CompList),
+ emit([indent(6), {curr,else}," -> ",nl]),
+ case Ext of
+ noext ->
+ emit([indent(9),"exit({error,{asn1,{invalid_choice_tag,",
+ {curr,else},"}}})",nl]);
+ _ ->
+ emit([indent(9),"{asn1_ExtAlt, ?RT_BER:encode(",{curr,else},")}",nl])
+ end,
+ emit([indent(3),"end",nl]),
+ asn1ct_name:new(tag),
+ asn1ct_name:new(else).
+
+
+gen_dec_choice_cases(_Erules,_TopType, []) ->
+ ok;
+gen_dec_choice_cases(Erules,TopType, [H|T]) ->
+ Cname = H#'ComponentType'.name,
+ Type = H#'ComponentType'.typespec,
+ Prop = H#'ComponentType'.prop,
+ Tags = Type#type.tag,
+ Fcases = fun([{T1class,T1number}|Tail],Fun) ->
+ emit([indent(4),{curr,v}," = {",
+ (?ASN1CT_GEN_BER:decode_class(T1class) bsl 10) +
+ T1number,",_} -> ",nl]),
+ emit([indent(8),"{",{asis,Cname},", "]),
+ gen_dec_line(Erules,TopType,Cname,[],Type,Prop,false),
+ emit(["};",nl,nl]),
+ Fun(Tail,Fun);
+ ([],_) ->
+ ok
+ end,
+ emit([nl,"%% '",Cname,"'",nl]),
+ case {Tags,asn1ct:get_gen_state_field(namelist)} of
+ {[],_} -> % choice without explicit tags
+ Fcases(H#'ComponentType'.tags,Fcases);
+ {[FirstT|_RestT],[{Cname,undecoded}|Names]} ->
+ DecTag=(?ASN1CT_GEN_BER:decode_class(FirstT#tag.class) bsl 10) +
+ FirstT#tag.number,
+ asn1ct:add_generated_refed_func({[Cname|TopType],undecoded,
+ [DecTag],Type}),
+ asn1ct:update_gen_state(namelist,Names),
+ emit([indent(4),{curr,res}," = ",
+ match_tag(ber_bin,{FirstT#tag.class,FirstT#tag.number}),
+ " -> ",nl]),
+ emit([indent(8),"{",{asis,Cname},", {'",
+ asn1ct_gen:list2name([Cname|TopType]),"',",
+ {curr,res},"}};",nl,nl]);
+ {[FirstT|RestT],_} ->
+ emit([indent(4),"{",
+ (?ASN1CT_GEN_BER:decode_class(FirstT#tag.class) bsl 10) +
+ FirstT#tag.number,", ",{curr,v},"} -> ",nl]),
+ emit([indent(8),"{",{asis,Cname},", "]),
+ gen_dec_line(Erules,TopType,Cname,[],Type#type{tag=RestT},Prop,false),
+ emit(["};",nl,nl])
+ end,
+ gen_dec_choice_cases(Erules,TopType, T).
+
+
+
+%%---------------------------------------
+%% Generate the encode/decode code
+%%---------------------------------------
+
+gen_enc_line(Erules,TopType,Cname,
+ Type=#type{constraint=[{componentrelation,_,_}],
+ def=#'ObjectClassFieldType'{type={typefield,_}}},
+ Element,Indent,OptOrMand=mandatory,EncObj)
+ when list(Element) ->
+ asn1ct_name:new(tmpBytes),
+ gen_enc_line(Erules,TopType,Cname,Type,Element,Indent,OptOrMand,
+ ["{",{curr,tmpBytes},",_} = "],EncObj);
+gen_enc_line(Erules,TopType,Cname,Type,Element,Indent,OptOrMand,EncObj)
+ when list(Element) ->
+ gen_enc_line(Erules,TopType,Cname,Type,Element,Indent,OptOrMand,
+ ["{",{curr,encBytes},",",{curr,encLen},"} = "],EncObj).
+
+gen_enc_line(Erules,TopType,Cname,Type,Element,Indent,OptOrMand,Assign,EncObj)
+ when list(Element) ->
+ IndDeep = indent(Indent),
+ Tag = lists:reverse([?ASN1CT_GEN_BER:encode_tag_val(
+ ?ASN1CT_GEN_BER:decode_class(X#tag.class),
+ X#tag.form,
+ X#tag.number)
+ || X <- Type#type.tag]),
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ WhatKind = asn1ct_gen:type(InnerType),
+ emit(IndDeep),
+ emit(Assign),
+ gen_optormand_case(OptOrMand,Erules,TopType,Cname,Type,InnerType,WhatKind,
+ Element),
+ case {Type,asn1ct_gen:get_constraint(Type#type.constraint,
+ componentrelation)} of
+% #type{constraint=[{tableconstraint_info,RefedFieldName}],
+% def={typefield,_}} ->
+ {#type{def=#'ObjectClassFieldType'{type={typefield,_},
+ fieldname=RefedFieldName}},
+ {componentrelation,_,_}} ->
+ {_LeadingAttrName,Fun} = EncObj,
+ case RefedFieldName of
+ {notype,T} ->
+ throw({error,{notype,type_from_object,T}});
+ {Name,RestFieldNames} when atom(Name) ->
+ case OptOrMand of
+ mandatory -> ok;
+ _ ->
+% emit(["{",{curr,tmpBytes},",",{curr,tmpLen},
+ emit(["{",{curr,tmpBytes},",_ } = "])
+% "} = "])
+ end,
+ emit([Fun,"(",{asis,Name},", ",Element,", ",
+ {asis,RestFieldNames},"),",nl]),
+ emit(IndDeep),
+ case OptOrMand of
+ mandatory ->
+ emit(["{",{curr,encBytes},",",{curr,encLen},
+ "} = "]),
+ emit(["?RT_BER:encode_open_type(",{curr,tmpBytes},
+ ",",{asis,Tag},")"]);
+ _ ->
+% emit(["{",{next,tmpBytes},", _} = "]),
+ emit(["{",{next,tmpBytes},",",{curr,tmpLen},
+ "} = "]),
+ emit(["?RT_BER:encode_open_type(",{curr,tmpBytes},
+ ",",{asis,Tag},"),",nl]),
+ emit(IndDeep),
+ emit(["{",{next,tmpBytes},", ",{curr,tmpLen},"}"])
+ end;
+ _ ->
+ throw({asn1,{'internal error'}})
+ end;
+ {{#'ObjectClassFieldType'{type={objectfield,PrimFieldName1,
+ PFNList}},_},
+ {componentrelation,_,_}} ->
+ %% this is when the dotted list in the FieldName has more
+ %% than one element
+ {_LeadingAttrName,Fun} = EncObj,
+ emit(["?RT_BER:encode_open_type(",Fun,"(",{asis,PrimFieldName1},
+ ", ",Element,", ",{asis,PFNList},"))"]);
+ _ ->
+ case WhatKind of
+ {primitive,bif} ->
+ EncType =
+ case Type#type.def of
+ #'ObjectClassFieldType'{type={fixedtypevaluefield,_,Btype}} ->
+ Btype;
+ _ ->
+ Type
+ end,
+ ?ASN1CT_GEN_BER:gen_encode_prim(ber,EncType,{asis,Tag},
+ Element);
+ {notype,_} ->
+ emit(["'enc_",InnerType,"'(",Element,", ",{asis,Tag},")"]);
+ 'ASN1_OPEN_TYPE' ->
+ case Type#type.def of
+ #'ObjectClassFieldType'{} -> %Open Type
+ ?ASN1CT_GEN_BER:gen_encode_prim(ber,#type{def='ASN1_OPEN_TYPE'},{asis,Tag},Element);
+ _ ->
+ ?ASN1CT_GEN_BER:gen_encode_prim(ber,Type,
+ {asis,Tag},
+ Element)
+ end;
+ _ ->
+ {EncFunName, _EncMod, _EncFun} =
+ mkfuncname(TopType,Cname,WhatKind,"enc_"),
+ case {WhatKind,Type#type.tablecinf,EncObj} of
+ {{constructed,bif},[{objfun,_}|_R],{_,Fun}} ->
+ emit([EncFunName,"(",Element,", ",{asis,Tag},
+ ", ",Fun,")"]);
+ _ ->
+ emit([EncFunName,"(",Element,", ",{asis,Tag},")"])
+ end
+ end
+ end,
+ case OptOrMand of
+ mandatory -> true;
+ _ ->
+ emit([nl,indent(7),"end"])
+ end.
+
+gen_optormand_case(mandatory,_Erules,_TopType,_Cname,_Type,_InnerType,_WhatKind,
+ _Element) ->
+ ok;
+gen_optormand_case('OPTIONAL',Erules,_TopType,_Cname,_Type,_InnerType,_WhatKind,
+ Element) ->
+ emit([" case ",Element," of",nl]),
+ emit([indent(9),"asn1_NOVALUE -> {",
+ empty_lb(Erules),",0};",nl]),
+ emit([indent(9),"_ ->",nl,indent(12)]);
+gen_optormand_case({'DEFAULT',DefaultValue},Erules,TopType,Cname,Type,
+ InnerType,WhatKind,Element) ->
+ CurrMod = get(currmod),
+ case catch lists:member(der,get(encoding_options)) of
+ true ->
+ emit(" case catch "),
+ asn1ct_gen:gen_check_call(TopType,Cname,Type,InnerType,
+ WhatKind,{asis,DefaultValue},
+ Element),
+ emit([" of",nl]),
+ emit([indent(12),"true -> {[],0};",nl]);
+ _ ->
+ emit([" case ",Element," of",nl]),
+ emit([indent(9),"asn1_DEFAULT -> {",
+ empty_lb(Erules),
+ ",0};",nl]),
+ case DefaultValue of
+ #'Externalvaluereference'{module=CurrMod,
+ value=V} ->
+ emit([indent(9),"?",{asis,V}," -> {",
+ empty_lb(Erules),",0};",nl]);
+ _ ->
+ emit([indent(9),{asis,
+ DefaultValue}," -> {",
+ empty_lb(Erules),",0};",nl])
+ end
+ end,
+ emit([indent(9),"_ ->",nl,indent(12)]).
+
+
+
+gen_dec_line(Erules,TopType,Cname,CTags,Type,OptOrMand,DecObjInf) ->
+ BytesVar = asn1ct_gen:mk_var(asn1ct_name:curr(v)),
+ Tag =
+ [(?ASN1CT_GEN_BER:decode_class(X#tag.class) bsl 10) + X#tag.number ||
+ X <- Type#type.tag],
+ ChoiceTags =
+ [(?ASN1CT_GEN_BER:decode_class(Class) bsl 10) + Number||
+ {Class,Number} <- CTags],
+ InnerType =
+ case Type#type.def of
+ #'ObjectClassFieldType'{type=OCFTType} ->
+ OCFTType;
+ _ ->
+ asn1ct_gen:get_inner(Type#type.def)
+ end,
+ PostpDec =
+ case OptOrMand of
+ mandatory ->
+ gen_dec_call(InnerType,Erules,TopType,Cname,Type,
+ BytesVar,Tag,
+ mandatory,", mandatory, ",DecObjInf,OptOrMand);
+ _ -> %optional or default or a mandatory component after an extensionmark
+ {FirstTag,RestTag} =
+ case Tag of
+ [] ->
+ {ChoiceTags,[]};
+ [Ft|Rt] ->
+ {Ft,Rt}
+ end,
+ emit(["case ",{prev,tlv}," of",nl]),
+ PostponedDec =
+ case Tag of
+ [] when length(ChoiceTags) > 0 -> % a choice without explicit tag
+ Fcases =
+ fun(FirstTag1) ->
+ emit(["[",{curr,v}," = {",{asis,FirstTag1},
+ ",_}|Temp",
+ {curr,tlv},
+ "] ->",nl]),
+ emit([indent(4),"{"]),
+ Pdec=
+ gen_dec_call(InnerType,Erules,
+ TopType,Cname,Type,
+ BytesVar,RestTag,
+ mandatory,
+ ", mandatory, ",
+ DecObjInf,OptOrMand),
+
+ emit([", Temp",{curr,tlv},"}"]),
+ emit([";",nl]),
+ Pdec
+ end,
+ hd([Fcases(TmpTag)|| TmpTag <- FirstTag]);
+
+ [] -> % an open type without explicit tag
+ emit(["[",{curr,v},"|Temp",{curr,tlv},"] ->",nl]),
+ emit([indent(4),"{"]),
+ Pdec=
+ gen_dec_call(InnerType,Erules,TopType,Cname,
+ Type,BytesVar,RestTag,mandatory,
+ ", mandatory, ",DecObjInf,
+ OptOrMand),
+
+ emit([", Temp",{curr,tlv},"}"]),
+ emit([";",nl]),
+ Pdec;
+
+ _ ->
+ emit(["[{",{asis,FirstTag},
+ ",",{curr,v},"}|Temp",
+ {curr,tlv},
+ "] ->",nl]),
+ emit([indent(4),"{"]),
+ Pdec=
+ gen_dec_call(InnerType,Erules,TopType,Cname,
+ Type,BytesVar,RestTag,mandatory,
+ ", mandatory, ",DecObjInf,
+ OptOrMand),
+
+ emit([", Temp",{curr,tlv},"}"]),
+ emit([";",nl]),
+ Pdec
+ end,
+
+ emit([indent(4),"_ ->",nl]),
+ case OptOrMand of
+ {'DEFAULT', Def} ->
+ emit([indent(8),"{",{asis,Def},",",{prev,tlv},"}",nl]);
+ 'OPTIONAL' ->
+ emit([indent(8),"{ asn1_NOVALUE, ",{prev,tlv},"}",nl])
+ end,
+ emit(["end"]),
+ PostponedDec
+ end,
+ case DecObjInf of
+ {Cname,ObjSet} -> % this must be the component were an object is
+ %% choosen from the object set according to the table
+ %% constraint.
+ {[{ObjSet,Cname,asn1ct_gen:mk_var(asn1ct_name:curr(term))}],
+ PostpDec};
+ _ -> {[],PostpDec}
+ end.
+
+gen_dec_call({typefield,_},_,_,_Cname,Type,BytesVar,Tag,_,_,false,_) ->
+ %% this in case of a choice with typefield components
+ asn1ct_name:new(reason),
+ asn1ct_name:new(opendec),
+ asn1ct_name:new(tmpterm),
+ asn1ct_name:new(tmptlv),
+
+ {FirstPFName,RestPFName} =
+% asn1ct_gen:get_constraint(Type#type.constraint,
+% tableconstraint_info),
+ (Type#type.def)#'ObjectClassFieldType'.fieldname,
+ emit([nl,indent(6),"begin",nl]),
+% emit([indent(9),{curr,opendec}," = ?RT_BER:decode_open_type(",
+ emit([indent(9),{curr,tmptlv}," = ?RT_BER:decode_open_type(",
+ BytesVar,",",{asis,Tag},"),",nl]),
+% emit([indent(9),"{",{curr,tmptlv},",_} = ?RT_BER:decode(",
+% {curr,opendec},"),",nl]),
+
+ emit([indent(9),"case (catch ObjFun(",{asis,FirstPFName},
+ ", ",{curr,tmptlv},", ",{asis,RestPFName},
+ ")) of", nl]),%% ??? What about Tag
+ emit([indent(12),"{'EXIT',",{curr,reason},"} ->",nl]),
+ emit([indent(15),"exit({'Type not ",
+ "compatible with table constraint', ",{curr,reason},"});",nl]),
+ emit([indent(12),{curr,tmpterm}," ->",nl]),
+ emit([indent(15),{curr,tmpterm},nl]),
+ emit([indent(9),"end",nl,indent(6),"end",nl]),
+ [];
+gen_dec_call({typefield,_},_,_,Cname,Type,BytesVar,Tag,_,_,_DecObjInf,OptOrMandComp) ->
+ emit(["?RT_BER:decode_open_type(",BytesVar,",",{asis,Tag},")"]),
+ RefedFieldName =
+% asn1ct_gen:get_constraint(Type#type.constraint,
+% tableconstraint_info),
+ (Type#type.def)#'ObjectClassFieldType'.fieldname,
+ [{Cname,RefedFieldName,asn1ct_gen:mk_var(asn1ct_name:curr(term)),
+ asn1ct_gen:mk_var(asn1ct_name:curr(tmpterm)),Tag,OptOrMandComp}];
+gen_dec_call({objectfield,PrimFieldName,PFNList},_,_,Cname,_,BytesVar,Tag,_,_,_,OptOrMandComp) ->
+ emit(["?RT_BER:decode_open_type(",BytesVar,",",{asis,Tag},")"]),
+ [{Cname,{PrimFieldName,PFNList},asn1ct_gen:mk_var(asn1ct_name:curr(term)),
+ asn1ct_gen:mk_var(asn1ct_name:curr(tmpterm)),Tag,OptOrMandComp}];
+gen_dec_call(InnerType,Erules,TopType,Cname,Type,BytesVar,Tag,PrimOptOrMand,
+ OptOrMand,DecObjInf,_) ->
+ WhatKind = asn1ct_gen:type(InnerType),
+ gen_dec_call1(WhatKind,InnerType,Erules,TopType,Cname,Type,BytesVar,Tag,
+ PrimOptOrMand,OptOrMand),
+ case DecObjInf of
+ {Cname,{_,OSet,UniqueFName,ValIndex}} ->
+ Term = asn1ct_gen:mk_var(asn1ct_name:curr(term)),
+ ValueMatch = value_match(ValIndex,Term),
+ emit([",",nl,"ObjFun = 'getdec_",OSet,"'(",
+% {asis,UniqueFName},", ",{curr,term},")"]);
+ {asis,UniqueFName},", ",ValueMatch,")"]);
+ _ ->
+ ok
+ end,
+ [].
+gen_dec_call1({primitive,bif},InnerType,Erules,TopType,Cname,Type,BytesVar,
+ Tag,OptOrMand,_) ->
+ case {asn1ct:get_gen_state_field(namelist),InnerType} of
+ {[{Cname,undecoded}|Rest],_} ->
+ asn1ct:add_generated_refed_func({[Cname|TopType],undecoded,
+ Tag,Type}),
+ asn1ct:update_gen_state(namelist,Rest),
+% emit(["?RT_BER:match_tags(",BytesVar,",",{asis,Tag},")"]);
+ emit(["{'",asn1ct_gen:list2name([Cname|TopType]),"',",
+ BytesVar,"}"]);
+ {_,{fixedtypevaluefield,_,Btype}} ->
+ ?ASN1CT_GEN_BER:gen_dec_prim(Erules,Btype,BytesVar,Tag,[],
+ ?PRIMITIVE,OptOrMand);
+ _ ->
+ ?ASN1CT_GEN_BER:gen_dec_prim(Erules,Type,BytesVar,Tag,[],
+ ?PRIMITIVE,OptOrMand)
+ end;
+gen_dec_call1('ASN1_OPEN_TYPE',_InnerType,Erules,TopType,Cname,Type,BytesVar,
+ Tag,OptOrMand,_) ->
+ case {asn1ct:get_gen_state_field(namelist),Type#type.def} of
+ {[{Cname,undecoded}|Rest],_} ->
+ asn1ct:add_generated_refed_func({[Cname|TopType],undecoded,
+ Tag,Type}),
+ asn1ct:update_gen_state(namelist,Rest),
+ emit(["{'",asn1ct_gen:list2name([Cname|TopType]),"',",
+ BytesVar,"}"]);
+% emit(["?RT_BER:match_tags(",BytesVar,",",{asis,Tag},")"]);
+ {_,#'ObjectClassFieldType'{type=OpenType}} ->
+ ?ASN1CT_GEN_BER:gen_dec_prim(Erules,#type{def=OpenType},
+ BytesVar,Tag,[],
+ ?PRIMITIVE,OptOrMand);
+ _ ->
+ ?ASN1CT_GEN_BER:gen_dec_prim(Erules,Type,BytesVar,Tag,[],
+ ?PRIMITIVE,OptOrMand)
+ end;
+gen_dec_call1(WhatKind,_,_Erules,TopType,Cname,Type,BytesVar,
+ Tag,_,_OptOrMand) ->
+ case asn1ct:get_gen_state_field(namelist) of
+ [{Cname,undecoded}|Rest] ->
+ asn1ct:add_generated_refed_func({[Cname|TopType],undecoded,
+ Tag,Type}),
+ asn1ct:update_gen_state(namelist,Rest),
+ emit(["{'",asn1ct_gen:list2name([Cname|TopType]),"',",
+ BytesVar,"}"]);
+ _ ->
+% {DecFunName, _DecMod, _DecFun} =
+% case {asn1ct:get_gen_state_field(namelist),WhatKind} of
+ EmitDecFunCall =
+ fun(FuncName) ->
+ case {WhatKind,Type#type.tablecinf} of
+ {{constructed,bif},[{objfun,_}|_Rest]} ->
+ emit([FuncName,"(",BytesVar,", ",{asis,Tag},
+ ", ObjFun)"]);
+ _ ->
+ emit([FuncName,"(",BytesVar,", ",{asis,Tag},")"])
+ end
+ end,
+ case asn1ct:get_gen_state_field(namelist) of
+ [{Cname,List}|Rest] when list(List) ->
+ case WhatKind of
+ #'Externaltypereference'{} ->
+ %%io:format("gen_dec_call1 1:~n~p~n~n",[WhatKind]),
+ asn1ct:add_tobe_refed_func({WhatKind,List});
+ _ ->
+ %%io:format("gen_dec_call1 2:~n~p~n~n",[[Cname|TopType]]),
+ asn1ct:add_tobe_refed_func({[Cname|TopType],
+ List})
+ end,
+ asn1ct:update_gen_state(namelist,Rest),
+ Prefix=asn1ct:get_gen_state_field(prefix),
+ {DecFunName,_,_}=
+ mkfuncname(TopType,Cname,WhatKind,Prefix),
+ EmitDecFunCall(DecFunName);
+ [{Cname,parts}|Rest] ->
+ asn1ct:update_gen_state(namelist,Rest),
+ asn1ct:get_gen_state_field(prefix),
+ %% This is to prepare SEQUENCE OF value in
+ %% partial incomplete decode for a later
+ %% part-decode, i.e. skip %% the tag.
+ asn1ct:add_generated_refed_func({[Cname|TopType],
+ parts,
+ [],Type}),
+ emit(["{'",asn1ct_gen:list2name([Cname|TopType]),"',"]),
+ EmitDecFunCall("?RT_BER:match_tags"),
+ emit("}");
+ _ ->
+ {DecFunName,_,_}=
+ mkfuncname(TopType,Cname,WhatKind,"dec_"),
+ EmitDecFunCall(DecFunName)
+ end
+% case {WhatKind,Type#type.tablecinf} of
+% {{constructed,bif},[{objfun,_}|_Rest]} ->
+% emit([DecFunName,"(",BytesVar,", ",{asis,Tag},
+% ", ObjFun)"]);
+% _ ->
+% emit([DecFunName,"(",BytesVar,", ",{asis,Tag},")"])
+% end
+ end.
+
+
+%%------------------------------------------------------
+%% General and special help functions (not exported)
+%%------------------------------------------------------
+
+
+indent(N) ->
+ lists:duplicate(N,32). % 32 = space
+
+mkcindexlist([H,T1|T], Sep) -> % Sep is a string e.g ", " or "+ "
+ emit(["Cindex",H,Sep]),
+ mkcindexlist([T1|T], Sep);
+mkcindexlist([H|T], Sep) ->
+ emit(["Cindex",H]),
+ mkcindexlist(T, Sep);
+mkcindexlist([], _) ->
+ true.
+
+mkcindexlist(L) ->
+ mkcindexlist(L,", ").
+
+
+mkvlist([H,T1|T], Sep) -> % Sep is a string e.g ", " or "+ "
+ emit([{var,H},Sep]),
+ mkvlist([T1|T], Sep);
+mkvlist([H|T], Sep) ->
+ emit([{var,H}]),
+ mkvlist(T, Sep);
+mkvlist([], _) ->
+ true.
+
+mkvlist(L) ->
+ mkvlist(L,", ").
+
+mkvplus(L) ->
+ mkvlist(L," + ").
+
+extensible(CompList) when list(CompList) ->
+ noext;
+extensible({RootList,ExtList}) ->
+ {ext,length(RootList)+1,length(ExtList)}.
+
+
+print_attribute_comment(InnerType,Pos,Cname,Prop) ->
+ CommentLine = "%%-------------------------------------------------",
+ emit([nl,CommentLine]),
+ case InnerType of
+ {typereference,_,Name} ->
+ emit([nl,"%% attribute ",Cname,"(",Pos,") with type ",Name]);
+ {'Externaltypereference',_,XModule,Name} ->
+ emit([nl,"%% attribute ",Cname,"(",Pos,") External ",XModule,":",Name]);
+ _ ->
+ emit([nl,"%% attribute ",Cname,"(",Pos,") with type ",InnerType])
+ end,
+ case Prop of
+ mandatory ->
+ continue;
+ {'DEFAULT', Def} ->
+ emit([" DEFAULT = ",{asis,Def}]);
+ 'OPTIONAL' ->
+ emit([" OPTIONAL"])
+ end,
+ emit([nl,CommentLine,nl]).
+
+
+
+mkfuncname(TopType,Cname,WhatKind,Prefix) ->
+ CurrMod = get(currmod),
+ case WhatKind of
+ #'Externaltypereference'{module=CurrMod,type=EType} ->
+ F = lists:concat(["'",Prefix,EType,"'"]),
+ {F, "?MODULE", F};
+ #'Externaltypereference'{module=Mod,type=EType} ->
+ {lists:concat(["'",Mod,"':'",Prefix,EType,"'"]),Mod,
+ lists:concat(["'",Prefix,EType,"'"])};
+ {constructed,bif} ->
+ F = lists:concat(["'",Prefix,asn1ct_gen:list2name([Cname|TopType]),"'"]),
+ {F, "?MODULE", F}
+ end.
+
+empty_lb(ber) ->
+ "[]";
+empty_lb(ber_bin) ->
+ "<<>>";
+empty_lb(ber_bin_v2) ->
+ "<<>>".
+
+value_match(Index,Value) when atom(Value) ->
+ value_match(Index,atom_to_list(Value));
+value_match([],Value) ->
+ Value;
+value_match([{VI,_}|VIs],Value) ->
+ value_match1(Value,VIs,lists:concat(["element(",VI,","]),1).
+value_match1(Value,[],Acc,Depth) ->
+ Acc ++ Value ++ lists:concat(lists:duplicate(Depth,")"));
+value_match1(Value,[{VI,_}|VIs],Acc,Depth) ->
+ value_match1(Value,VIs,Acc++lists:concat(["element(",VI,","]),Depth+1).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_constructed_per.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_constructed_per.erl
new file mode 100644
index 0000000000..a21c38f8a8
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_constructed_per.erl
@@ -0,0 +1,1234 @@
+% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1ct_constructed_per.erl,v 1.1 2008/12/17 09:53:29 mikpe Exp $
+%%
+-module(asn1ct_constructed_per).
+
+-export([gen_encode_sequence/3]).
+-export([gen_decode_sequence/3]).
+-export([gen_encode_set/3]).
+-export([gen_decode_set/3]).
+-export([gen_encode_sof/4]).
+-export([gen_decode_sof/4]).
+-export([gen_encode_choice/3]).
+-export([gen_decode_choice/3]).
+
+-include("asn1_records.hrl").
+%-compile(export_all).
+
+-import(asn1ct_gen, [emit/1,demit/1]).
+
+
+%% ENCODE GENERATOR FOR SEQUENCE TYPE ** **********
+
+
+gen_encode_set(Erules,TypeName,D) ->
+ gen_encode_constructed(Erules,TypeName,D).
+
+gen_encode_sequence(Erules,TypeName,D) ->
+ gen_encode_constructed(Erules,TypeName,D).
+
+gen_encode_constructed(Erules,Typename,D) when record(D,type) ->
+ asn1ct_name:start(),
+ asn1ct_name:new(term),
+ asn1ct_name:new(bytes),
+ {CompList,TableConsInfo} =
+ case D#type.def of
+ #'SEQUENCE'{tablecinf=TCI,components=CL} ->
+ {CL,TCI};
+ #'SET'{tablecinf=TCI,components=CL} ->
+ {CL,TCI}
+ end,
+ case Typename of
+ ['EXTERNAL'] ->
+ emit({{var,asn1ct_name:next(val)},
+ " = asn1rt_check:transform_to_EXTERNAL1990(",
+ {var,asn1ct_name:curr(val)},"),",nl}),
+ asn1ct_name:new(val);
+ _ ->
+ ok
+ end,
+ case {Optionals = optionals(CompList),CompList} of
+ {[],EmptyCL} when EmptyCL == {[],[]};EmptyCL == [] ->
+ emit(["%%Variable setting just to eliminate ",
+ "compiler warning for unused vars!",nl,
+ "_Val = ",{var,asn1ct_name:curr(val)},",",nl]);
+ {[],_} ->
+ emit([{var,asn1ct_name:next(val)}," = ?RT_PER:list_to_record("]),
+ emit(["'",asn1ct_gen:list2rname(Typename),"'"]),
+ emit([", ",{var,asn1ct_name:curr(val)},"),",nl]);
+ _ ->
+ Fixoptcall =
+ case Erules of
+ per -> ",Opt} = ?RT_PER:fixoptionals2(";
+ _ -> ",Opt} = ?RT_PER:fixoptionals("
+ end,
+ emit({"{",{var,asn1ct_name:next(val)},Fixoptcall,
+ {asis,Optionals},",",length(Optionals),
+ ",",{var,asn1ct_name:curr(val)},"),",nl})
+ end,
+ asn1ct_name:new(val),
+ Ext = extensible(CompList),
+ case Ext of
+ {ext,_,NumExt} when NumExt > 0 ->
+ emit(["Extensions = ?RT_PER:fixextensions(",{asis,Ext},
+ ", ",{curr,val},"),",nl]);
+ _ -> true
+ end,
+ EncObj =
+ case TableConsInfo of
+ #simpletableattributes{usedclassfield=Used,
+ uniqueclassfield=Unique} when Used /= Unique ->
+ false;
+ %% ObjectSet, name of the object set in constraints
+ %%
+ %%{ObjectSet,AttrN,N,UniqueFieldName} -> %% N is index of attribute that determines constraint
+ #simpletableattributes{objectsetname=ObjectSet,
+ c_name=AttrN,
+ c_index=N,
+ usedclassfield=UniqueFieldName,
+ uniqueclassfield=UniqueFieldName,
+ valueindex=ValueIndex
+ } -> %% N is index of attribute that determines constraint
+ OSDef =
+ case ObjectSet of
+ {Module,OSName} ->
+ asn1_db:dbget(Module,OSName);
+ OSName ->
+ asn1_db:dbget(get(currmod),OSName)
+ end,
+ case (OSDef#typedef.typespec)#'ObjectSet'.gen of
+ true ->
+ ObjectEncode =
+ asn1ct_gen:un_hyphen_var(lists:concat(['Obj',AttrN])),
+ emit([ObjectEncode," = ",nl]),
+ emit([" 'getenc_",ObjectSet,"'(",
+ {asis,UniqueFieldName},", ",nl]),
+ El = make_element(N+1,asn1ct_gen:mk_var(asn1ct_name:curr(val)),AttrN),
+ Indent = 12 + length(atom_to_list(ObjectSet)),
+ case ValueIndex of
+ [] ->
+ emit([indent(Indent),El,"),",nl]);
+ _ ->
+ emit([indent(Indent),"value_match(",
+ {asis,ValueIndex},",",El,")),",nl]),
+ notice_value_match()
+ end,
+ {AttrN,ObjectEncode};
+ _ ->
+ false
+ end;
+ _ ->
+ case D#type.tablecinf of
+ [{objfun,_}|_] ->
+ %% when the simpletableattributes was at an outer
+ %% level and the objfun has been passed through the
+ %% function call
+ {"got objfun through args","ObjFun"};
+ _ ->
+ false
+ end
+ end,
+ emit({"[",nl}),
+ MaybeComma1 =
+ case Ext of
+ {ext,_Pos,NumExt2} when NumExt2 > 0 ->
+ emit({"?RT_PER:setext(Extensions =/= [])"}),
+ ", ";
+ {ext,_Pos,_} ->
+ emit({"?RT_PER:setext(false)"}),
+ ", ";
+ _ ->
+ ""
+ end,
+ MaybeComma2 =
+ case optionals(CompList) of
+ [] -> MaybeComma1;
+ _ ->
+ emit(MaybeComma1),
+ emit("Opt"),
+ {",",nl}
+ end,
+ gen_enc_components_call(Typename,CompList,MaybeComma2,EncObj,Ext),
+ emit({"].",nl}).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% generate decode function for SEQUENCE and SET
+%%
+gen_decode_set(Erules,Typename,D) ->
+ gen_decode_constructed(Erules,Typename,D).
+
+gen_decode_sequence(Erules,Typename,D) ->
+ gen_decode_constructed(Erules,Typename,D).
+
+gen_decode_constructed(_Erules,Typename,D) when record(D,type) ->
+ asn1ct_name:start(),
+ {CompList,TableConsInfo} =
+ case D#type.def of
+ #'SEQUENCE'{tablecinf=TCI,components=CL} ->
+ {CL,TCI};
+ #'SET'{tablecinf=TCI,components=CL} ->
+ {CL,TCI}
+ end,
+ Ext = extensible(CompList),
+ MaybeComma1 = case Ext of
+ {ext,_Pos,_NumExt} ->
+ gen_dec_extension_value("Bytes"),
+ {",",nl};
+ _ ->
+ ""
+ end,
+ Optionals = optionals(CompList),
+ MaybeComma2 = case Optionals of
+ [] -> MaybeComma1;
+ _ ->
+ Bcurr = asn1ct_name:curr(bytes),
+ Bnext = asn1ct_name:next(bytes),
+ emit(MaybeComma1),
+ GetoptCall = "} = ?RT_PER:getoptionals2(",
+ emit({"{Opt,",{var,Bnext},GetoptCall,
+ {var,Bcurr},",",{asis,length(Optionals)},")"}),
+ asn1ct_name:new(bytes),
+ ", "
+ end,
+ {DecObjInf,UniqueFName,ValueIndex} =
+ case TableConsInfo of
+%% {ObjectSet,AttrN,N,UniqueFieldName} ->%% N is index of attribute that determines constraint
+ #simpletableattributes{objectsetname=ObjectSet,
+ c_name=AttrN,
+ usedclassfield=UniqueFieldName,
+ uniqueclassfield=UniqueFieldName,
+ valueindex=ValIndex} ->
+%% {AttrN,ObjectSet};
+ F = fun(#'ComponentType'{typespec=CT})->
+ case {CT#type.constraint,CT#type.tablecinf} of
+ {[],[{objfun,_}|_R]} -> true;
+ _ -> false
+ end
+ end,
+ case lists:any(F,CompList) of
+ true -> % when component relation constraint establish
+ %% relation from a component to another components
+ %% subtype component
+ {{AttrN,{deep,ObjectSet,UniqueFieldName,ValIndex}},
+ UniqueFieldName,ValIndex};
+ false ->
+ {{AttrN,ObjectSet},UniqueFieldName,ValIndex}
+ end;
+ _ ->
+ case D#type.tablecinf of
+ [{objfun,_}|_] ->
+ {{"got objfun through args","ObjFun"},false,false};
+ _ ->
+ {false,false,false}
+ end
+ end,
+ {AccTerm,AccBytes} =
+ gen_dec_components_call(Typename,CompList,MaybeComma2,DecObjInf,Ext,length(Optionals)),
+ case asn1ct_name:all(term) of
+ [] -> emit(MaybeComma2); % no components at all
+ _ -> emit({com,nl})
+ end,
+ case {AccTerm,AccBytes} of
+ {[],[]} ->
+ ok;
+ {_,[]} ->
+ ok;
+ {[{ObjSet,LeadingAttr,Term}],ListOfOpenTypes} ->
+ DecObj = asn1ct_gen:un_hyphen_var(lists:concat(['DecObj',LeadingAttr,Term])),
+ ValueMatch = value_match(ValueIndex,Term),
+ emit({DecObj," =",nl," 'getdec_",ObjSet,"'(",
+% {asis,UniqueFName},", ",Term,"),",nl}),
+ {asis,UniqueFName},", ",ValueMatch,"),",nl}),
+ gen_dec_listofopentypes(DecObj,ListOfOpenTypes,false)
+ end,
+ %% we don't return named lists any more Cnames = mkcnamelist(CompList),
+ demit({"Result = "}), %dbg
+ %% return value as record
+ case Typename of
+ ['EXTERNAL'] ->
+ emit({" OldFormat={'",asn1ct_gen:list2rname(Typename),
+ "'"}),
+ mkvlist(asn1ct_name:all(term)),
+ emit({"},",nl}),
+ emit({" ASN11994Format =",nl,
+ " asn1rt_check:transform_to_EXTERNAL1994",
+ "(OldFormat),",nl}),
+ emit(" {ASN11994Format,");
+ _ ->
+ emit(["{{'",asn1ct_gen:list2rname(Typename),"'"]),
+ mkvlist(asn1ct_name:all(term)),
+ emit("},")
+ end,
+ emit({{var,asn1ct_name:curr(bytes)},"}"}),
+ emit({".",nl,nl}).
+
+gen_dec_listofopentypes(_,[],_) ->
+ emit(nl);
+gen_dec_listofopentypes(DecObj,[{_Cname,{FirstPFN,PFNList},Term,TmpTerm,Prop}|Rest],_Update) ->
+
+% asn1ct_name:new(term),
+ asn1ct_name:new(tmpterm),
+ asn1ct_name:new(reason),
+
+ emit([Term," = ",nl]),
+
+ N = case Prop of
+ mandatory -> 0;
+ 'OPTIONAL' ->
+ emit_opt_or_mand_check(asn1_NOVALUE,TmpTerm),
+ 6;
+ {'DEFAULT',Val} ->
+ emit_opt_or_mand_check(Val,TmpTerm),
+ 6
+ end,
+
+ emit([indent(N+3),"case (catch ",DecObj,"(",
+ {asis,FirstPFN},", ",TmpTerm,", telltype,",{asis,PFNList},")) of",nl]),
+ emit([indent(N+6),"{'EXIT', ",{curr,reason},"} ->",nl]),
+%% emit({indent(9),"throw({runtime_error,{","'Type not compatible with table constraint'",",",Term,"}});",nl}),
+ emit([indent(N+9),"exit({'Type not compatible with table constraint',",
+ {curr,reason},"});",nl]),
+ emit([indent(N+6),"{",{curr,tmpterm},",_} ->",nl]),
+ emit([indent(N+9),{curr,tmpterm},nl]),
+
+ case Prop of
+ mandatory ->
+ emit([indent(N+3),"end,",nl]);
+ _ ->
+ emit([indent(N+3),"end",nl,
+ indent(3),"end,",nl])
+ end,
+ gen_dec_listofopentypes(DecObj,Rest,true).
+
+
+emit_opt_or_mand_check(Val,Term) ->
+ emit([indent(3),"case ",Term," of",nl,
+ indent(6),{asis,Val}," ->",{asis,Val},";",nl,
+ indent(6),"_ ->",nl]).
+
+%% ENCODE GENERATOR FOR THE CHOICE TYPE *******
+%% assume Val = {Alternative,AltType}
+%% generate
+%%[
+%% ?RT_PER:set_choice(element(1,Val),Altnum,Altlist,ext),
+%%case element(1,Val) of
+%% alt1 ->
+%% encode_alt1(element(2,Val));
+%% alt2 ->
+%% encode_alt2(element(2,Val))
+%%end
+%%].
+
+gen_encode_choice(_Erules,Typename,D) when record(D,type) ->
+ {'CHOICE',CompList} = D#type.def,
+ emit({"[",nl}),
+ Ext = extensible(CompList),
+ gen_enc_choice(Typename,CompList,Ext),
+ emit({nl,"].",nl}).
+
+gen_decode_choice(_Erules,Typename,D) when record(D,type) ->
+ asn1ct_name:start(),
+ asn1ct_name:new(bytes),
+ {'CHOICE',CompList} = D#type.def,
+ Ext = extensible(CompList),
+ gen_dec_choice(Typename,CompList,Ext),
+ emit({".",nl}).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Encode generator for SEQUENCE OF type
+
+
+gen_encode_sof(_Erules,Typename,SeqOrSetOf,D) when record(D,type) ->
+ asn1ct_name:start(),
+% Val = [Component]
+% ?RT_PER:encode_length(length(Val)),
+% lists:
+ {_SeqOrSetOf,ComponentType} = D#type.def,
+ emit({"[",nl}),
+ SizeConstraint =
+ case asn1ct_gen:get_constraint(D#type.constraint,
+ 'SizeConstraint') of
+ no -> undefined;
+ Range -> Range
+ end,
+ ObjFun =
+ case D#type.tablecinf of
+ [{objfun,_}|_R] ->
+ ", ObjFun";
+ _->
+ ""
+ end,
+ emit({nl,indent(3),"?RT_PER:encode_length(",
+ {asis,SizeConstraint},
+ ",length(Val)),",nl}),
+ emit({indent(3),"'enc_",asn1ct_gen:list2name(Typename),
+ "_components'(Val",ObjFun,", [])"}),
+ emit({nl,"].",nl}),
+ NewComponentType =
+ case ComponentType#type.def of
+ {'ENUMERATED',_,Component}->
+ ComponentType#type{def={'ENUMERATED',Component}};
+ _ -> ComponentType
+ end,
+ gen_encode_sof_components(Typename,SeqOrSetOf,NewComponentType).
+
+gen_decode_sof(_Erules,Typename,SeqOrSetOf,D) when record(D,type) ->
+ asn1ct_name:start(),
+% Val = [Component]
+% ?RT_PER:encode_length(length(Val)),
+% lists:
+ {_SeqOrSetOf,ComponentType} = D#type.def,
+ SizeConstraint =
+ case asn1ct_gen:get_constraint(D#type.constraint,
+ 'SizeConstraint') of
+ no -> undefined;
+ Range -> Range
+ end,
+ ObjFun =
+ case D#type.tablecinf of
+ [{objfun,_}|_R] ->
+ ", ObjFun";
+ _ ->
+ ""
+ end,
+ emit({nl,"{Num,Bytes1} = ?RT_PER:decode_length(Bytes,",{asis,SizeConstraint},"),",nl}),
+ emit({"'dec_",asn1ct_gen:list2name(Typename),
+ "_components'(Num, Bytes1, telltype",ObjFun,", []).",nl}),
+ NewComponentType =
+ case ComponentType#type.def of
+ {'ENUMERATED',_,Component}->
+ ComponentType#type{def={'ENUMERATED',Component}};
+ _ -> ComponentType
+ end,
+ gen_decode_sof_components(Typename,SeqOrSetOf,NewComponentType).
+
+gen_encode_sof_components(Typename,SeqOrSetOf,Cont) ->
+ {ObjFun,ObjFun_Var} =
+ case Cont#type.tablecinf of
+ [{objfun,_}|_R] ->
+ {", ObjFun",", _"};
+ _ ->
+ {"",""}
+ end,
+ emit({"'enc_",asn1ct_gen:list2name(Typename),"_components'([]",
+ ObjFun_Var,", Acc) -> lists:reverse(Acc);",nl,nl}),
+ emit({"'enc_",asn1ct_gen:list2name(Typename),"_components'([H|T]",
+ ObjFun,", Acc) ->",nl}),
+ emit({"'enc_",asn1ct_gen:list2name(Typename),"_components'(T"}),
+ emit({ObjFun,", ["}),
+ %% the component encoder
+ Constructed_Suffix = asn1ct_gen:constructed_suffix(SeqOrSetOf,
+ Cont#type.def),
+
+ Conttype = asn1ct_gen:get_inner(Cont#type.def),
+ Currmod = get(currmod),
+ Ctgenmod = list_to_atom(lists:concat(["asn1ct_gen_",per,
+ asn1ct_gen:rt2ct_suffix()])),
+ case asn1ct_gen:type(Conttype) of
+ {primitive,bif} ->
+ gen_encode_prim_wrapper(Ctgenmod,per,Cont,false,"H");
+% Ctgenmod:gen_encode_prim(per,Cont,false,"H");
+ {constructed,bif} ->
+ NewTypename = [Constructed_Suffix|Typename],
+ emit({"'enc_",asn1ct_gen:list2name(NewTypename),"'(H",
+ ObjFun,")",nl,nl});
+ #'Externaltypereference'{module=Currmod,type=Ename} ->
+ emit({"'enc_",Ename,"'(H)",nl,nl});
+ #'Externaltypereference'{module=EMod,type=EType} ->
+ emit({"'",EMod,"':'enc_",EType,"'(H)",nl,nl});
+ _ ->
+ emit({"'enc_",Conttype,"'(H)",nl,nl})
+ end,
+ emit({" | Acc]).",nl}).
+
+gen_decode_sof_components(Typename,SeqOrSetOf,Cont) ->
+ {ObjFun,ObjFun_Var} =
+ case Cont#type.tablecinf of
+ [{objfun,_}|_R] ->
+ {", ObjFun",", _"};
+ _ ->
+ {"",""}
+ end,
+ emit({"'dec_",asn1ct_gen:list2name(Typename),
+ "_components'(0, Bytes, _",ObjFun_Var,", Acc) ->",nl,
+ indent(3),"{lists:reverse(Acc), Bytes};",nl}),
+ emit({"'dec_",asn1ct_gen:list2name(Typename),
+ "_components'(Num, Bytes, _",ObjFun,", Acc) ->",nl}),
+ emit({indent(3),"{Term,Remain} = "}),
+ Constructed_Suffix = asn1ct_gen:constructed_suffix(SeqOrSetOf,
+ Cont#type.def),
+ Conttype = asn1ct_gen:get_inner(Cont#type.def),
+ Ctgenmod = list_to_atom(lists:concat(["asn1ct_gen_",per,
+ asn1ct_gen:rt2ct_suffix()])),
+ case asn1ct_gen:type(Conttype) of
+ {primitive,bif} ->
+ Ctgenmod:gen_dec_prim(per,Cont,"Bytes"),
+ emit({com,nl});
+ {constructed,bif} ->
+ NewTypename = [Constructed_Suffix|Typename],
+ emit({"'dec_",asn1ct_gen:list2name(NewTypename),
+ "'(Bytes, telltype",ObjFun,"),",nl});
+ #typereference{val=Dname} ->
+ emit({"'dec_",Dname,"'(Bytes,telltype),",nl});
+ #'Externaltypereference'{module=EMod,type=EType} ->
+ emit({"'",EMod,"':'dec_",EType,"'(Bytes,telltype),",nl});
+ _ ->
+ emit({"'dec_",Conttype,"'(Bytes,telltype),",nl})
+ end,
+ emit({indent(3),"'dec_",asn1ct_gen:list2name(Typename),
+ "_components'(Num-1, Remain, telltype",ObjFun,", [Term|Acc]).",nl}).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% General and special help functions (not exported)
+
+mkvlist([H|T]) ->
+ emit(","),
+ mkvlist2([H|T]);
+mkvlist([]) ->
+ true.
+mkvlist2([H,T1|T]) ->
+ emit({{var,H},","}),
+ mkvlist2([T1|T]);
+mkvlist2([H|T]) ->
+ emit({{var,H}}),
+ mkvlist2(T);
+mkvlist2([]) ->
+ true.
+
+extensible(CompList) when list(CompList) ->
+ noext;
+extensible({RootList,ExtList}) ->
+ {ext,length(RootList)+1,length(ExtList)}.
+
+gen_dec_extension_value(_) ->
+ emit({"{Ext,",{next,bytes},"} = ?RT_PER:getext(",{curr,bytes},")"}),
+ asn1ct_name:new(bytes).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Produce a list with positions (in the Value record) where
+%% there are optional components, start with 2 because first element
+%% is the record name
+
+optionals({L,_Ext}) -> optionals(L,[],2);
+optionals(L) -> optionals(L,[],2).
+
+optionals([{'EXTENSIONMARK',_,_}|Rest],Acc,Pos) ->
+ optionals(Rest,Acc,Pos); % optionals in extension are currently not handled
+optionals([#'ComponentType'{prop='OPTIONAL'}|Rest],Acc,Pos) ->
+ optionals(Rest,[Pos|Acc],Pos+1);
+optionals([#'ComponentType'{prop={'DEFAULT',_}}|Rest],Acc,Pos) ->
+ optionals(Rest,[Pos|Acc],Pos+1);
+optionals([#'ComponentType'{}|Rest],Acc,Pos) ->
+ optionals(Rest,Acc,Pos+1);
+optionals([],Acc,_) ->
+ lists:reverse(Acc).
+
+
+gen_enc_components_call(TopType,{CompList,ExtList},MaybeComma,DynamicEnc,Ext) ->
+ %% The type has extensionmarker
+ Rpos = gen_enc_components_call1(TopType,CompList,1,MaybeComma,DynamicEnc,noext),
+ case Ext of
+ {ext,_,ExtNum} when ExtNum > 0 ->
+ emit([nl,
+ ",Extensions",nl]);
+ _ -> true
+ end,
+ %handle extensions
+ gen_enc_components_call1(TopType,ExtList,Rpos,MaybeComma,DynamicEnc,Ext);
+gen_enc_components_call(TopType, CompList, MaybeComma, DynamicEnc, Ext) ->
+ %% The type has no extensionmarker
+ gen_enc_components_call1(TopType,CompList,1,MaybeComma,DynamicEnc,Ext).
+
+gen_enc_components_call1(TopType,
+ [C=#'ComponentType'{name=Cname,typespec=Type,prop=Prop}|Rest],
+ Tpos,
+ MaybeComma, DynamicEnc, Ext) ->
+
+ put(component_type,{true,C}),
+ %% information necessary in asn1ct_gen_per_rt2ct:gen_encode_prim
+
+ Pos = case Ext of
+ noext -> Tpos;
+ {ext,Epos,_Enum} -> Tpos - Epos + 1
+ end,
+ emit(MaybeComma),
+ case Prop of
+ 'OPTIONAL' ->
+ gen_enc_component_optional(TopType,Cname,Type,Tpos,DynamicEnc,Ext);
+ {'DEFAULT',_DefVal} ->
+ gen_enc_component_default(TopType,Cname,Type,Tpos,DynamicEnc,Ext);
+ _ ->
+ case Ext of
+ {ext,ExtPos,_} when Tpos >= ExtPos ->
+ gen_enc_component_optional(TopType,Cname,Type,Tpos,DynamicEnc,Ext);
+ _ ->
+ gen_enc_component_mandatory(TopType,Cname,Type,Tpos,DynamicEnc,Ext)
+ end
+ end,
+
+ erase(component_type),
+
+ case Rest of
+ [] ->
+ Pos+1;
+ _ ->
+ emit({com,nl}),
+ gen_enc_components_call1(TopType,Rest,Tpos+1,"",DynamicEnc,Ext)
+ end;
+gen_enc_components_call1(_TopType,[],Pos,_,_,_) ->
+ Pos.
+
+gen_enc_component_default(TopType,Cname,Type,Pos,DynamicEnc,Ext) ->
+% Element = io_lib:format("?RT_PER:cindex(~w,Val1,~w)",[Pos+1,Cname]),
+ Element = make_element(Pos+1,"Val1",Cname),
+ emit({"case ",Element," of",nl}),
+% case Ext of
+% {ext,ExtPos,_} when Pos >= ExtPos ->
+% emit({"asn1_NOEXTVALUE -> [];",nl});
+% _ ->
+ emit({"asn1_DEFAULT -> [];",nl}),
+% end,
+ asn1ct_name:new(tmpval),
+ emit({{curr,tmpval}," ->",nl}),
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ emit({nl,"%% attribute number ",Pos," with type ",
+ InnerType,nl}),
+ NextElement = asn1ct_gen:mk_var(asn1ct_name:curr(tmpval)),
+ gen_enc_line(TopType,Cname,Type,NextElement, Pos,DynamicEnc,Ext),
+ emit({nl,"end"}).
+
+gen_enc_component_optional(TopType,Cname,Type,Pos,DynamicEnc,Ext) ->
+% Element = io_lib:format("?RT_PER:cindex(~w,Val1,~w)",[Pos+1,Cname]),
+ Element = make_element(Pos+1,"Val1",Cname),
+ emit({"case ",Element," of",nl}),
+% case Ext of
+% {ext,ExtPos,_} when Pos >= ExtPos ->
+% emit({"asn1_NOEXTVALUE -> [];",nl});
+% _ ->
+ emit({"asn1_NOVALUE -> [];",nl}),
+% end,
+ asn1ct_name:new(tmpval),
+ emit({{curr,tmpval}," ->",nl}),
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ emit({nl,"%% attribute number ",Pos," with type ",
+ InnerType,nl}),
+ NextElement = asn1ct_gen:mk_var(asn1ct_name:curr(tmpval)),
+ gen_enc_line(TopType,Cname,Type,NextElement, Pos,DynamicEnc,Ext),
+ emit({nl,"end"}).
+
+gen_enc_component_mandatory(TopType,Cname,Type,Pos,DynamicEnc,Ext) ->
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ emit({nl,"%% attribute number ",Pos," with type ",
+ InnerType,nl}),
+ gen_enc_line(TopType,Cname,Type,[],Pos,DynamicEnc,Ext).
+
+gen_enc_line(TopType, Cname, Type, [], Pos,DynamicEnc,Ext) ->
+% Element = io_lib:format("?RT_PER:cindex(~w,~s,~w)",[Pos+1,asn1ct_gen:mk_var(asn1ct_name:curr(val)),Cname]),
+ Element = make_element(Pos+1,asn1ct_gen:mk_var(asn1ct_name:curr(val)),Cname),
+ gen_enc_line(TopType,Cname,Type,Element, Pos,DynamicEnc,Ext);
+gen_enc_line(TopType,Cname,Type,Element, Pos,DynamicEnc,Ext) ->
+ Ctgenmod = list_to_atom(lists:concat(["asn1ct_gen_",per,
+ asn1ct_gen:rt2ct_suffix()])),
+ Atype =
+ case Type of
+ #type{def=#'ObjectClassFieldType'{type=InnerType}} ->
+ InnerType;
+ _ ->
+ asn1ct_gen:get_inner(Type#type.def)
+ end,
+% case asn1ct_gen:get_constraint(Type#type.constraint,
+% tableconstraint_info) of
+% no ->
+% asn1ct_gen:get_inner(Type#type.def);
+% _ ->
+% Type#type.def
+% end,
+ case Ext of
+ {ext,Ep1,_} when Pos >= Ep1 ->
+ emit(["?RT_PER:encode_open_type(dummy,?RT_PER:complete("]);
+ _ -> true
+ end,
+ case Atype of
+ {typefield,_} ->
+ case DynamicEnc of
+ {_LeadingAttrName,Fun} ->
+% case asn1ct_gen:get_constraint(Type#type.constraint,
+% componentrelation) of
+ case (Type#type.def)#'ObjectClassFieldType'.fieldname of
+ {notype,T} ->
+ throw({error,{notype,type_from_object,T}});
+ {Name,RestFieldNames} when atom(Name) ->
+ emit({"?RT_PER:encode_open_type([],?RT_PER:complete(",nl}),
+ emit({" ",Fun,"(",{asis,Name},", ",
+ Element,", ",{asis,RestFieldNames},")))"});
+ Other ->
+ throw({asn1,{'internal error',Other}})
+ end
+ end;
+ {objectfield,PrimFieldName1,PFNList} ->
+ case DynamicEnc of
+ {_LeadingAttrName,Fun} ->
+ emit({"?RT_PER:encode_open_type([],"
+ "?RT_PER:complete(",nl}),
+ emit({" ",Fun,"(",{asis,PrimFieldName1},
+ ", ",Element,", ",{asis,PFNList},")))"})
+ end;
+ _ ->
+ CurrMod = get(currmod),
+ case asn1ct_gen:type(Atype) of
+ #'Externaltypereference'{module=Mod,type=EType} when
+ (CurrMod==Mod) ->
+ emit({"'enc_",EType,"'(",Element,")"});
+ #'Externaltypereference'{module=Mod,type=EType} ->
+ emit({"'",Mod,"':'enc_",
+ EType,"'(",Element,")"});
+ #typereference{val=Ename} ->
+ emit({"'enc_",Ename,"'(",Element,")"});
+ {notype,_} ->
+ emit({"'enc_",Atype,"'(",Element,")"});
+ {primitive,bif} ->
+ EncType =
+ case Atype of
+ {fixedtypevaluefield,_,Btype} ->
+ Btype;
+ _ ->
+ Type
+ end,
+ gen_encode_prim_wrapper(Ctgenmod,per,EncType,
+ false,Element);
+% Ctgenmod:gen_encode_prim(per,EncType,
+% false,Element);
+ 'ASN1_OPEN_TYPE' ->
+ case Type#type.def of
+ #'ObjectClassFieldType'{type=OpenType} ->
+ gen_encode_prim_wrapper(Ctgenmod,per,
+ #type{def=OpenType},
+ false,Element);
+ _ ->
+ gen_encode_prim_wrapper(Ctgenmod,per,Type,
+ false,Element)
+ end;
+% Ctgenmod:gen_encode_prim(per,Type,
+% false,Element);
+ {constructed,bif} ->
+ NewTypename = [Cname|TopType],
+ case {Type#type.tablecinf,DynamicEnc} of
+ {[{objfun,_}|_R],{_,EncFun}} ->
+%% emit({"?RT_PER:encode_open_type([],",
+%% "?RT_PER:complete(",nl}),
+ emit({"'enc_",
+ asn1ct_gen:list2name(NewTypename),
+ "'(",Element,", ",EncFun,")"});
+ _ ->
+ emit({"'enc_",
+ asn1ct_gen:list2name(NewTypename),
+ "'(",Element,")"})
+ end
+ end
+ end,
+ case Ext of
+ {ext,Ep2,_} when Pos >= Ep2 ->
+ emit(["))"]);
+ _ -> true
+ end.
+
+gen_dec_components_call(TopType,{CompList,ExtList},MaybeComma,DecInfObj,Ext,NumberOfOptionals) ->
+ %% The type has extensionmarker
+ {Rpos,AccTerm,AccBytes} =
+ gen_dec_components_call1(TopType, CompList, 1, 1, MaybeComma,DecInfObj,
+ noext,[],[],NumberOfOptionals),
+ emit([",",nl,"{Extensions,",{next,bytes},"} = "]),
+ emit(["?RT_PER:getextension(Ext,",{curr,bytes},"),",nl]),
+ asn1ct_name:new(bytes),
+ {_Epos,AccTermE,AccBytesE} =
+ gen_dec_components_call1(TopType,ExtList,Rpos, 1, "",DecInfObj,Ext,[],[],NumberOfOptionals),
+ case ExtList of
+ [] -> true;
+ _ -> emit([",",nl])
+ end,
+ emit([{next,bytes},"= ?RT_PER:skipextensions(",{curr,bytes},",",
+ length(ExtList)+1,",Extensions)",nl]),
+ asn1ct_name:new(bytes),
+ {AccTerm++AccTermE,AccBytes++AccBytesE};
+
+gen_dec_components_call(TopType,CompList,MaybeComma,DecInfObj,Ext,NumberOfOptionals) ->
+ %% The type has no extensionmarker
+ {_,AccTerm,AccBytes} =
+ gen_dec_components_call1(TopType, CompList, 1, 1,MaybeComma,DecInfObj,Ext,[],[],NumberOfOptionals),
+ {AccTerm,AccBytes}.
+
+
+gen_dec_components_call1(TopType,
+ [C=#'ComponentType'{name=Cname,typespec=Type,prop=Prop}|Rest],
+ Tpos,OptPos,MaybeComma,DecInfObj,Ext,AccTerm,AccBytes,NumberOfOptionals) ->
+ Pos = case Ext of
+ noext -> Tpos;
+ {ext,Epos,_Enum} -> Tpos - Epos + 1
+ end,
+ emit(MaybeComma),
+%% asn1ct_name:new(term),
+ InnerType =
+ case Type#type.def of
+ #'ObjectClassFieldType'{type=InType} ->
+ InType;
+ Def ->
+ asn1ct_gen:get_inner(Def)
+ end,
+% case asn1ct_gen:get_constraint(Type#type.constraint,
+% tableconstraint_info) of
+% no ->
+% asn1ct_gen:get_inner(Type#type.def);
+% _ ->
+% Type#type.def
+% end,
+ case InnerType of
+ #'Externaltypereference'{type=T} ->
+ emit({nl,"%% attribute number ",Tpos," with type ",
+ T,nl});
+ IT when tuple(IT) ->
+ emit({nl,"%% attribute number ",Tpos," with type ",
+ element(2,IT),nl});
+ _ ->
+ emit({nl,"%% attribute number ",Tpos," with type ",
+ InnerType,nl})
+ end,
+
+ case InnerType of
+ {typefield,_} ->
+ asn1ct_name:new(term),
+ asn1ct_name:new(tmpterm),
+ emit({"{",{curr,tmpterm},", ",{next,bytes},"} = "});
+ {objectfield,_,_} ->
+ asn1ct_name:new(term),
+ asn1ct_name:new(tmpterm),
+ emit({"{",{curr,tmpterm},", ",{next,bytes},"} = "});
+ _ ->
+ asn1ct_name:new(term),
+ emit({"{",{curr,term},",",{next,bytes},"} = "})
+ end,
+
+ NewOptPos =
+ case {Ext,Prop} of
+ {noext,mandatory} -> OptPos; % generate nothing
+ {noext,_} ->
+ Element = io_lib:format("Opt band (1 bsl ~w)",[NumberOfOptionals - OptPos]),
+ emit({"case ",Element," of",nl}),
+ emit({"_Opt",OptPos," when _Opt",OptPos," > 0 ->"}),
+ OptPos+1;
+ _ ->
+ emit(["case Extensions of",nl]),
+ emit(["_ when size(Extensions) >= ",Pos,",element(",Pos,",Extensions) == 1 ->",nl])
+ end,
+ put(component_type,{true,C}),
+ {TermVar,BytesVar} = gen_dec_line(TopType,Cname,Type,Tpos,DecInfObj,Ext),
+ erase(component_type),
+ case {Ext,Prop} of
+ {noext,mandatory} -> true; % generate nothing
+ {noext,_} ->
+ emit([";",nl,"0 ->"]),
+ gen_dec_component_no_val(TopType,Cname,Type,Prop,Tpos,Ext);
+ _ ->
+ emit([";",nl,"_ ->",nl]),
+ gen_dec_component_no_val(TopType,Cname,Type,Prop,Tpos,Ext)
+ end,
+ case {Ext,Prop} of
+ {noext,mandatory} -> true; % generate nothing
+ {noext,_} ->
+ emit([nl,"end"]);
+ _ ->
+ emit([nl,"end"])
+
+ end,
+ asn1ct_name:new(bytes),
+ case Rest of
+ [] ->
+ {Pos+1,AccTerm++TermVar,AccBytes++BytesVar};
+ _ ->
+ emit({com,nl}),
+ gen_dec_components_call1(TopType,Rest,Tpos+1,NewOptPos,"",DecInfObj,Ext,
+ AccTerm++TermVar,AccBytes++BytesVar,NumberOfOptionals)
+ end;
+
+gen_dec_components_call1(_TopType,[],Pos,_OptPos,_,_,_,AccTerm,AccBytes,_NumberOfOptionals) ->
+ {Pos,AccTerm,AccBytes}.
+
+
+%%gen_dec_component_no_val(TopType,Cname,Type,_,Pos,{ext,Ep,Enum}) when Pos >= Ep ->
+%% emit({"{asn1_NOEXTVALUE,",{curr,bytes},"}",nl});
+gen_dec_component_no_val(_,_,_,{'DEFAULT',DefVal},_,_) ->
+ emit(["{",{asis,DefVal},",",{curr,bytes},"}",nl]);
+gen_dec_component_no_val(_,_,_,'OPTIONAL',_,_) ->
+ emit({"{asn1_NOVALUE,",{curr,bytes},"}",nl});
+gen_dec_component_no_val(_,_,_,mandatory,_,{ext,_,_}) ->
+ emit({"{asn1_NOVALUE,",{curr,bytes},"}",nl}).
+
+
+gen_dec_line(TopType,Cname,Type,Pos,DecInfObj,Ext) ->
+ Ctgenmod = list_to_atom(lists:concat(["asn1ct_gen_",per,
+ asn1ct_gen:rt2ct_suffix()])),
+ Atype =
+ case Type of
+ #type{def=#'ObjectClassFieldType'{type=InnerType}} ->
+ InnerType;
+ _ ->
+ asn1ct_gen:get_inner(Type#type.def)
+ end,
+% case asn1ct_gen:get_constraint(Type#type.constraint,
+% tableconstraint_info) of
+% no ->
+% asn1ct_gen:get_inner(Type#type.def);
+% _ ->
+% Type#type.def
+% end,
+ BytesVar0 = asn1ct_gen:mk_var(asn1ct_name:curr(bytes)),
+ BytesVar = case Ext of
+ {ext,Ep,_} when Pos >= Ep ->
+ emit(["begin",nl,"{TmpVal",Pos,",Trem",Pos,
+ "}=?RT_PER:decode_open_type(",
+ {curr,bytes},",[]),",nl,
+ "{TmpValx",Pos,",_}="]),
+ io_lib:format("TmpVal~p",[Pos]);
+ _ -> BytesVar0
+ end,
+ SaveBytes =
+ case Atype of
+ {typefield,_} ->
+ case DecInfObj of
+ false -> % This is in a choice with typefield components
+ {Name,RestFieldNames} =
+ (Type#type.def)#'ObjectClassFieldType'.fieldname,
+% asn1ct_gen:get_constraint(Type#type.constraint,
+% tableconstraint_info),
+ asn1ct_name:new(tmpterm),
+ asn1ct_name:new(reason),
+ emit([indent(2),"{",{curr,tmpterm},", ",{next,bytes},
+ "} = ?RT_PER:decode_open_type(",{curr,bytes},
+ ", []),",nl]),
+ emit([indent(2),"case (catch ObjFun(",
+ {asis,Name},
+ ",",{curr,tmpterm},",telltype,",
+ {asis,RestFieldNames},")) of", nl]),
+ emit([indent(4),"{'EXIT',",{curr,reason},"} ->",nl]),
+ emit([indent(6),"exit({'Type not ",
+ "compatible with table constraint', ",
+ {curr,reason},"});",nl]),
+ asn1ct_name:new(tmpterm),
+ emit([indent(4),"{",{curr,tmpterm},", _} ->",nl]),
+ emit([indent(6),"{",Cname,", {",{curr,tmpterm},", ",
+ {next,bytes},"}}",nl]),
+ emit([indent(2),"end"]),
+ [];
+ {"got objfun through args","ObjFun"} ->
+ %% this is when the generated code gots the
+ %% objfun though arguments on function
+ %% invocation.
+ {Name,RestFieldNames} =
+ (Type#type.def)#'ObjectClassFieldType'.fieldname,
+ emit(["?RT_PER:decode_open_type(",{curr,bytes},
+ ", []),",nl]),
+ emit([{curr,term}," =",nl,
+ " case (catch ObjFun(",{asis,Name},",",
+ {curr,tmpterm},",telltype,",
+ {asis,RestFieldNames},")) of", nl]),
+ emit([" {'EXIT',",{curr,reason},"} ->",nl]),
+ emit([indent(6),"exit({'Type not ",
+ "compatible with table constraint', ",
+ {curr,reason},"});",nl]),
+ asn1ct_name:new(tmpterm),
+ emit([indent(4),"{",{curr,tmpterm},", _} ->",nl]),
+ emit([indent(6),{curr,tmpterm},nl]),
+ emit([indent(2),"end"]),
+ [];
+ _ ->
+ emit({"?RT_PER:decode_open_type(",{curr,bytes},
+ ", [])"}),
+ RefedFieldName =
+ (Type#type.def)#'ObjectClassFieldType'.fieldname,
+% asn1ct_gen:get_constraint(Type#type.constraint,
+% tableconstraint_info),
+ [{Cname,RefedFieldName,
+ asn1ct_gen:mk_var(asn1ct_name:curr(term)),
+ asn1ct_gen:mk_var(asn1ct_name:curr(tmpterm)),
+ get_components_prop()}]
+ end;
+ {objectfield,PrimFieldName1,PFNList} ->
+ emit({"?RT_PER:decode_open_type(",{curr,bytes},", [])"}),
+ [{Cname,{PrimFieldName1,PFNList},
+ asn1ct_gen:mk_var(asn1ct_name:curr(term)),
+ asn1ct_gen:mk_var(asn1ct_name:curr(tmpterm)),
+ get_components_prop()}];
+ _ ->
+ CurrMod = get(currmod),
+ case asn1ct_gen:type(Atype) of
+ #'Externaltypereference'{module=CurrMod,type=EType} ->
+ emit({"'dec_",EType,"'(",BytesVar,",telltype)"});
+ #'Externaltypereference'{module=Mod,type=EType} ->
+ emit({"'",Mod,"':'dec_",EType,"'(",BytesVar,
+ ",telltype)"});
+ {primitive,bif} ->
+ case Atype of
+ {fixedtypevaluefield,_,Btype} ->
+ Ctgenmod:gen_dec_prim(per,Btype,
+ BytesVar);
+ _ ->
+ Ctgenmod:gen_dec_prim(per,Type,
+ BytesVar)
+ end;
+ 'ASN1_OPEN_TYPE' ->
+ case Type#type.def of
+ #'ObjectClassFieldType'{type=OpenType} ->
+ Ctgenmod:gen_dec_prim(per,#type{def=OpenType},
+ BytesVar);
+ _ ->
+ Ctgenmod:gen_dec_prim(per,Type,
+ BytesVar)
+ end;
+ #typereference{val=Dname} ->
+ emit({"'dec_",Dname,"'(",BytesVar,",telltype)"});
+ {notype,_} ->
+ emit({"'dec_",Atype,"'(",BytesVar,",telltype)"});
+ {constructed,bif} ->
+ NewTypename = [Cname|TopType],
+ case Type#type.tablecinf of
+ [{objfun,_}|_R] ->
+ emit({"'dec_",asn1ct_gen:list2name(NewTypename),
+ "'(",BytesVar,", telltype, ObjFun)"});
+ _ ->
+ emit({"'dec_",asn1ct_gen:list2name(NewTypename),
+ "'(",BytesVar,", telltype)"})
+ end
+ end,
+ case DecInfObj of
+ {Cname,{_,OSet,UniqueFName,ValIndex}} ->
+ Term = asn1ct_gen:mk_var(asn1ct_name:curr(term)),
+ ValueMatch = value_match(ValIndex,Term),
+ emit({",",nl,"ObjFun = 'getdec_",OSet,"'(",
+ {asis,UniqueFName},", ",ValueMatch,")"});
+ _ ->
+ ok
+ end,
+ []
+ end,
+ case Ext of
+ {ext,Ep2,_} when Pos >= Ep2 ->
+ emit([", {TmpValx",Pos,",Trem",Pos,"}",nl,"end"]);
+ _ -> true
+ end,
+ %% Prepare return value
+ case DecInfObj of
+ {Cname,ObjSet} ->
+ {[{ObjSet,Cname,asn1ct_gen:mk_var(asn1ct_name:curr(term))}],
+ SaveBytes};
+ _ ->
+ {[],SaveBytes}
+ end.
+
+gen_enc_choice(TopType,CompList,Ext) ->
+ gen_enc_choice_tag(CompList, [], Ext),
+ emit({com,nl}),
+ emit({"case element(1,Val) of",nl}),
+ gen_enc_choice2(TopType, CompList, Ext),
+ emit({nl,"end"}).
+
+gen_enc_choice_tag({C1,C2},_,_) ->
+ N1 = get_name_list(C1),
+ N2 = get_name_list(C2),
+ emit(["?RT_PER:set_choice(element(1,Val),",
+ {asis,{N1,N2}},", ",{asis,{length(N1),length(N2)}},")"]);
+gen_enc_choice_tag(C,_,_) ->
+ N = get_name_list(C),
+ emit(["?RT_PER:set_choice(element(1,Val),",
+ {asis,N},", ",{asis,length(N)},")"]).
+
+get_name_list(L) ->
+ get_name_list(L,[]).
+
+get_name_list([#'ComponentType'{name=Name}|T], Acc) ->
+ get_name_list(T,[Name|Acc]);
+get_name_list([], Acc) ->
+ lists:reverse(Acc).
+
+%gen_enc_choice_tag([H|T],Acc,Ext) when record(H,'ComponentType') ->
+% gen_enc_choice_tag(T,[H#'ComponentType'.name|Acc],Ext);
+%gen_enc_choice_tag([H|T],Acc,Ext) -> % skip EXTENSIONMARK
+% gen_enc_choice_tag(T,Acc,Ext);
+%gen_enc_choice_tag([],Acc,Ext) ->
+% Length = length(Acc),
+% emit({"?RT_PER:set_choice(element(1,Val),",{asis,Length},",",
+% {asis,lists:reverse(Acc)},",",{asis,Ext},")"}),
+% Length.
+
+gen_enc_choice2(TopType, {L1,L2}, Ext) ->
+ gen_enc_choice2(TopType, L1 ++ L2, 0, Ext);
+gen_enc_choice2(TopType, L, Ext) ->
+ gen_enc_choice2(TopType, L, 0, Ext).
+
+gen_enc_choice2(TopType,[H1,H2|T], Pos, Ext)
+when record(H1,'ComponentType'), record(H2,'ComponentType') ->
+ Cname = H1#'ComponentType'.name,
+ Type = H1#'ComponentType'.typespec,
+ EncObj =
+% case asn1ct_gen:get_constraint(Type#type.constraint,
+% tableconstraint_info) of
+% no ->
+% false;
+% _ ->
+% {no_attr,"ObjFun"}
+% end,
+ case asn1ct_gen:get_constraint(Type#type.constraint,
+ componentrelation) of
+ no -> false;
+ _ -> {no_attr,"ObjFun"}
+ end,
+ emit({{asis,Cname}," ->",nl}),
+ gen_enc_line(TopType,Cname,Type,"element(2,Val)", Pos+1,EncObj,Ext),
+ emit({";",nl}),
+ gen_enc_choice2(TopType,[H2|T], Pos+1, Ext);
+gen_enc_choice2(TopType,[H1|T], Pos, Ext) when record(H1,'ComponentType') ->
+ Cname = H1#'ComponentType'.name,
+ Type = H1#'ComponentType'.typespec,
+ EncObj =
+% case asn1ct_gen:get_constraint(Type#type.constraint,
+% tableconstraint_info) of
+% no ->
+% false;
+% _ ->
+% {no_attr,"ObjFun"}
+% end,
+ case asn1ct_gen:get_constraint(Type#type.constraint,
+ componentrelation) of
+ no -> false;
+ _ -> {no_attr,"ObjFun"}
+ end,
+ emit({{asis,H1#'ComponentType'.name}," ->",nl}),
+ gen_enc_line(TopType,Cname,Type,"element(2,Val)", Pos+1,EncObj,Ext),
+ gen_enc_choice2(TopType,T, Pos+1, Ext);
+gen_enc_choice2(_,[], _, _) ->
+ true.
+
+gen_dec_choice(TopType,CompList,{ext,Pos,NumExt}) ->
+ emit({"{Ext,",{curr,bytes},"} = ?RT_PER:getbit(Bytes),",nl}),
+ asn1ct_name:new(bytes),
+ gen_dec_choice1(TopType,CompList,{ext,Pos,NumExt});
+gen_dec_choice(TopType,CompList,noext) ->
+ gen_dec_choice1(TopType,CompList,noext).
+
+gen_dec_choice1(TopType,CompList,noext) ->
+ emit({"{Choice,",{curr,bytes},
+ "} = ?RT_PER:getchoice(",{prev,bytes},",",
+ length(CompList),", 0),",nl}),
+ emit({"{Cname,{Val,NewBytes}} = case Choice of",nl}),
+ gen_dec_choice2(TopType,CompList,noext),
+ emit({nl,"end,",nl}),
+ emit({nl,"{{Cname,Val},NewBytes}"});
+gen_dec_choice1(TopType,{RootList,ExtList},Ext) ->
+ NewList = RootList ++ ExtList,
+ gen_dec_choice1(TopType, NewList, Ext);
+gen_dec_choice1(TopType,CompList,{ext,ExtPos,ExtNum}) ->
+ emit({"{Choice,",{curr,bytes},
+ "} = ?RT_PER:getchoice(",{prev,bytes},",",
+ length(CompList)-ExtNum,",Ext ),",nl}),
+ emit({"{Cname,{Val,NewBytes}} = case Choice + Ext*",ExtPos-1," of",nl}),
+ gen_dec_choice2(TopType,CompList,{ext,ExtPos,ExtNum}),
+ emit([";",nl,"_ -> {asn1_ExtAlt, ?RT_PER:decode_open_type(",{curr,bytes},",[])}"]),
+ emit({nl,"end,",nl}),
+ emit({nl,"{{Cname,Val},NewBytes}"}).
+
+
+gen_dec_choice2(TopType,L,Ext) ->
+ gen_dec_choice2(TopType,L,0,Ext).
+
+gen_dec_choice2(TopType,[H1,H2|T],Pos,Ext)
+when record(H1,'ComponentType'), record(H2,'ComponentType') ->
+ Cname = H1#'ComponentType'.name,
+ Type = H1#'ComponentType'.typespec,
+ case Type#type.def of
+ #'ObjectClassFieldType'{type={typefield,_}} ->
+ emit({Pos," -> ",nl}),
+ wrap_gen_dec_line(H1,TopType,Cname,Type,Pos+1,false,Ext),
+ emit({";",nl});
+ _ ->
+ emit({Pos," -> {",{asis,Cname},",",nl}),
+ wrap_gen_dec_line(H1,TopType,Cname,Type,Pos+1,false,Ext),
+ emit({"};",nl})
+ end,
+ gen_dec_choice2(TopType,[H2|T],Pos+1,Ext);
+gen_dec_choice2(TopType,[H1,_H2|T],Pos,Ext) when record(H1,'ComponentType') ->
+ gen_dec_choice2(TopType,[H1|T],Pos,Ext); % skip extensionmark
+gen_dec_choice2(TopType,[H1|T],Pos,Ext) when record(H1,'ComponentType') ->
+ Cname = H1#'ComponentType'.name,
+ Type = H1#'ComponentType'.typespec,
+ case Type#type.def of
+ #'ObjectClassFieldType'{type={typefield,_}} ->
+ emit({Pos," -> ",nl}),
+ wrap_gen_dec_line(H1,TopType,Cname,Type,Pos+1,false,Ext);
+ _ ->
+ emit({Pos," -> {",{asis,Cname},",",nl}),
+ wrap_gen_dec_line(H1,TopType,Cname,Type,Pos+1,false,Ext),
+ emit("}")
+ end,
+ gen_dec_choice2(TopType,[T],Pos+1);
+gen_dec_choice2(TopType,[_|T],Pos,Ext) ->
+ gen_dec_choice2(TopType,T,Pos,Ext);% skip extensionmark
+gen_dec_choice2(_,[],Pos,_) ->
+ Pos.
+
+indent(N) ->
+ lists:duplicate(N,32). % 32 = space
+
+gen_encode_prim_wrapper(CtgenMod,Erule,Cont,DoTag,Value) ->
+% put(component_type,true), % add more info in component_type
+ CtgenMod:gen_encode_prim(Erule,Cont,DoTag,Value).
+% erase(component_type).
+
+make_element(I,Val,Cname) ->
+ case lists:member(optimize,get(encoding_options)) of
+ false ->
+ io_lib:format("?RT_PER:cindex(~w,~s,~w)",[I,Val,Cname]);
+ _ ->
+ io_lib:format("element(~w,~s)",[I,Val])
+ end.
+
+wrap_gen_dec_line(C,TopType,Cname,Type,Pos,DIO,Ext) ->
+ put(component_type,{true,C}),
+ gen_dec_line(TopType,Cname,Type,Pos,DIO,Ext),
+ erase(component_type).
+
+get_components_prop() ->
+ case get(component_type) of
+ undefined ->
+ mandatory;
+ {true,#'ComponentType'{prop=Prop}} -> Prop
+ end.
+
+
+value_match(Index,Value) when atom(Value) ->
+ value_match(Index,atom_to_list(Value));
+value_match([],Value) ->
+ Value;
+value_match([{VI,_}|VIs],Value) ->
+ value_match1(Value,VIs,lists:concat(["element(",VI,","]),1).
+value_match1(Value,[],Acc,Depth) ->
+ Acc ++ Value ++ lists:concat(lists:duplicate(Depth,")"));
+value_match1(Value,[{VI,_}|VIs],Acc,Depth) ->
+ value_match1(Value,VIs,Acc++lists:concat(["element(",VI,","]),Depth+1).
+
+notice_value_match() ->
+ Module = get(currmod),
+ put(value_match,{true,Module}).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_gen.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_gen.erl
new file mode 100644
index 0000000000..5d2f7a13bd
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_gen.erl
@@ -0,0 +1,1664 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1ct_gen.erl,v 1.1 2008/12/17 09:53:29 mikpe Exp $
+%%
+-module(asn1ct_gen).
+
+-include("asn1_records.hrl").
+%%-compile(export_all).
+-export([pgen_exports/3,
+ pgen_hrl/4,
+ gen_head/3,
+ demit/1,
+ emit/1,
+ fopen/2,
+ get_inner/1,type/1,def_to_tag/1,prim_bif/1,
+ type_from_object/1,
+ get_typefromobject/1,get_fieldcategory/2,
+ get_classfieldcategory/2,
+ list2name/1,
+ list2rname/1,
+ constructed_suffix/2,
+ unify_if_string/1,
+ gen_check_call/7,
+ get_constraint/2,
+ insert_once/2,
+ rt2ct_suffix/1,rt2ct_suffix/0]).
+-export([pgen/4,pgen_module/5,mk_var/1, un_hyphen_var/1]).
+-export([gen_encode_constructed/4,gen_decode_constructed/4]).
+
+%% pgen(Erules, Module, TypeOrVal)
+%% Generate Erlang module (.erl) and (.hrl) file corresponding to an ASN.1 module
+%% .hrl file is only generated if necessary
+%% Erules = per | ber | ber_bin | per_bin
+%% Module = atom()
+%% TypeOrVal = {TypeList,ValueList}
+%% TypeList = ValueList = [atom()]
+
+pgen(OutFile,Erules,Module,TypeOrVal) ->
+ pgen_module(OutFile,Erules,Module,TypeOrVal,true).
+
+
+pgen_module(OutFile,Erules,Module,TypeOrVal,Indent) ->
+ put(outfile,OutFile),
+ HrlGenerated = asn1ct_gen:pgen_hrl(Erules,Module,TypeOrVal,Indent),
+ asn1ct_name:start(),
+ ErlFile = lists:concat([OutFile,".erl"]),
+ Fid = asn1ct_gen:fopen(ErlFile,write),
+ put(gen_file_out,Fid),
+ asn1ct_gen:gen_head(Erules,Module,HrlGenerated),
+ pgen_exports(Erules,Module,TypeOrVal),
+ pgen_dispatcher(Erules,Module,TypeOrVal),
+ pgen_info(Erules,Module),
+ pgen_typeorval(wrap_ber(Erules),Module,TypeOrVal),
+ pgen_partial_incomplete_decode(Erules),
+% gen_vars(asn1_db:mod_to_vars(Module)),
+% gen_tag_table(AllTypes),
+ file:close(Fid),
+ io:format("--~p--~n",[{generated,ErlFile}]).
+
+
+pgen_typeorval(Erules,Module,{Types,Values,_Ptypes,_Classes,Objects,ObjectSets}) ->
+ pgen_types(Erules,Module,Types),
+ pgen_values(Erules,Module,Values),
+ pgen_objects(Erules,Module,Objects),
+ pgen_objectsets(Erules,Module,ObjectSets),
+ case catch lists:member(der,get(encoding_options)) of
+ true ->
+ pgen_check_defaultval(Erules,Module);
+ _ -> ok
+ end,
+ pgen_partial_decode(Erules,Module).
+
+pgen_values(_,_,[]) ->
+ true;
+pgen_values(Erules,Module,[H|T]) ->
+ Valuedef = asn1_db:dbget(Module,H),
+ gen_value(Valuedef),
+ pgen_values(Erules,Module,T).
+
+pgen_types(_,Module,[]) ->
+ gen_value_match(Module),
+ true;
+pgen_types(Erules,Module,[H|T]) ->
+ Rtmod = list_to_atom(lists:concat(["asn1ct_gen_",erule(Erules),
+ rt2ct_suffix(Erules)])),
+ asn1ct_name:clear(),
+ Typedef = asn1_db:dbget(Module,H),
+ Rtmod:gen_encode(Erules,Typedef),
+ asn1ct_name:clear(),
+ Rtmod:gen_decode(Erules,Typedef),
+ pgen_types(Erules,Module,T).
+
+pgen_objects(_,_,[]) ->
+ true;
+pgen_objects(Erules,Module,[H|T]) ->
+ Rtmod = list_to_atom(lists:concat(["asn1ct_gen_",erule(Erules),
+ rt2ct_suffix(Erules)])),
+ asn1ct_name:clear(),
+ Typedef = asn1_db:dbget(Module,H),
+ Rtmod:gen_obj_code(Erules,Module,Typedef),
+ pgen_objects(Erules,Module,T).
+
+pgen_objectsets(_,_,[]) ->
+ true;
+pgen_objectsets(Erules,Module,[H|T]) ->
+ Rtmod = list_to_atom(lists:concat(["asn1ct_gen_",erule(Erules),
+ rt2ct_suffix(Erules)])),
+ asn1ct_name:clear(),
+ TypeDef = asn1_db:dbget(Module,H),
+ Rtmod:gen_objectset_code(Erules,TypeDef),
+ pgen_objectsets(Erules,Module,T).
+
+pgen_check_defaultval(Erules,Module) ->
+ CheckObjects = ets:tab2list(check_functions),
+ case get(asndebug) of
+ true ->
+ FileName = lists:concat([Module,'.table']),
+ {ok,IoDevice} = file:open(FileName,[write]),
+ Fun =
+ fun(X)->
+ io:format(IoDevice,"~n~n************~n~n~p~n~n*****"
+ "********~n~n",[X])
+ end,
+ lists:foreach(Fun,CheckObjects),
+ file:close(IoDevice);
+ _ -> ok
+ end,
+ gen_check_defaultval(Erules,Module,CheckObjects).
+
+pgen_partial_decode(Erules,Module) ->
+ pgen_partial_inc_dec(Erules,Module),
+ pgen_partial_dec(Erules,Module).
+
+pgen_partial_inc_dec(Erules,Module) ->
+% io:format("Start partial incomplete decode gen?~n"),
+ case asn1ct:get_gen_state_field(inc_type_pattern) of
+ undefined ->
+% io:format("Partial incomplete decode gen not started:�~w~n",[asn1ct:get_gen_state_field(active)]),
+ ok;
+% [] ->
+% ok;
+ ConfList ->
+ PatternLists=lists:map(fun({_,P}) -> P end,ConfList),
+ pgen_partial_inc_dec1(Erules,Module,PatternLists),
+ gen_partial_inc_dec_refed_funcs(Erules)
+ end.
+
+%% pgen_partial_inc_dec1 generates a function of the toptype in each
+%% of the partial incomplete decoded types.
+pgen_partial_inc_dec1(Erules,Module,[P|Ps]) ->
+ Rtmod = list_to_atom(lists:concat(["asn1ct_gen_",erule(Erules),
+ rt2ct_suffix(Erules)])),
+ TopTypeName = asn1ct:partial_inc_dec_toptype(P),
+ TypeDef=asn1_db:dbget(Module,TopTypeName),
+ asn1ct_name:clear(),
+ asn1ct:update_gen_state(namelist,P),
+ asn1ct:update_gen_state(active,true),
+ asn1ct:update_gen_state(prefix,"dec-inc-"),
+ Rtmod:gen_decode(Erules,TypeDef),
+%% asn1ct:update_gen_state(namelist,tl(P)), %%
+ gen_dec_part_inner_constr(Erules,TypeDef,[TopTypeName]),
+ pgen_partial_inc_dec1(Erules,Module,Ps);
+pgen_partial_inc_dec1(_,_,[]) ->
+ ok.
+
+gen_partial_inc_dec_refed_funcs(Erule) when Erule == ber_bin_v2 ->
+ Rtmod = list_to_atom(lists:concat(["asn1ct_gen_",erule(Erule),
+ rt2ct_suffix(Erule)])),
+ case asn1ct:next_refed_func() of
+ [] ->
+ ok;
+ {#'Externaltypereference'{module=M,type=Name},Pattern} ->
+ TypeDef = asn1_db:dbget(M,Name),
+ asn1ct:update_gen_state(namelist,Pattern),
+ Rtmod:gen_inc_decode(Erule,TypeDef),
+ gen_dec_part_inner_constr(Erule,TypeDef,[Name]),
+ gen_partial_inc_dec_refed_funcs(Erule);
+ _ ->
+ gen_partial_inc_dec_refed_funcs(Erule)
+ end;
+gen_partial_inc_dec_refed_funcs(_) ->
+ ok.
+
+pgen_partial_dec(_Erules,_Module) ->
+ ok. %%%% implement later
+
+%% generate code for all inner types that are called from the top type
+%% of the partial incomplete decode
+gen_dec_part_inner_constr(Erules,TypeDef,TypeName) ->
+ Def = TypeDef#typedef.typespec,
+ InnerType = asn1ct_gen:get_inner(Def#type.def),
+ case InnerType of
+ 'SET' ->
+ #'SET'{components=Components} = Def#type.def,
+ gen_dec_part_inner_types(Erules,Components,TypeName);
+ %% Continue generate the inner of each component
+ 'SEQUENCE' ->
+ #'SEQUENCE'{components=Components} = Def#type.def,
+ gen_dec_part_inner_types(Erules,Components,TypeName);
+ 'CHOICE' ->
+ {_,Components} = Def#type.def,
+ gen_dec_part_inner_types(Erules,Components,TypeName);
+ 'SEQUENCE OF' ->
+ %% this and next case must be the last component in the
+ %% partial decode chain here. Not likely that this occur.
+ {_,Type} = Def#type.def,
+ NameSuffix = constructed_suffix(InnerType,Type#type.def),
+ Rtmod = list_to_atom(lists:concat(["asn1ct_gen_",erule(Erules),
+ rt2ct_suffix(Erules)])),
+ asn1ct_name:clear(),
+ Rtmod:gen_decode(Erules,[NameSuffix|TypeName],Type);
+%% gen_types(Erules,[NameSuffix|Typename],Type);
+ 'SET OF' ->
+ {_,Type} = Def#type.def,
+ NameSuffix = constructed_suffix(InnerType,Type#type.def),
+ Rtmod = list_to_atom(lists:concat(["asn1ct_gen_",erule(Erules),
+ rt2ct_suffix(Erules)])),
+ asn1ct_name:clear(),
+ Rtmod:gen_decode(Erules,[NameSuffix|TypeName],Type);
+ _ ->
+ ok
+ end.
+
+gen_dec_part_inner_types(Erules,[ComponentType|Rest],TypeName) ->
+ Rtmod = list_to_atom(lists:concat(["asn1ct_gen_",erule(Erules),
+ rt2ct_suffix(Erules)])),
+ asn1ct_name:clear(),
+ Rtmod:gen_decode(Erules,TypeName,ComponentType),
+ gen_dec_part_inner_types(Erules,Rest,TypeName);
+gen_dec_part_inner_types(Erules,{Comps1,Comps2},TypeName)
+ when list(Comps1),list(Comps2) ->
+ gen_dec_part_inner_types(Erules,Comps1 ++ Comps2,TypeName);
+gen_dec_part_inner_types(_,[],_) ->
+ ok.
+
+
+pgen_partial_incomplete_decode(Erule) ->
+ case asn1ct:get_gen_state_field(active) of
+ true ->
+ pgen_partial_incomplete_decode1(Erule),
+ asn1ct:reset_gen_state();
+ _ ->
+ ok
+ end.
+pgen_partial_incomplete_decode1(ber_bin_v2) ->
+ case asn1ct:read_config_data(partial_incomplete_decode) of
+ undefined ->
+ ok;
+ Data ->
+ lists:foreach(fun emit_partial_incomplete_decode/1,Data)
+ end,
+ GeneratedFs= asn1ct:get_gen_state_field(gen_refed_funcs),
+% io:format("GeneratedFs :~n~p~n",[GeneratedFs]),
+ gen_part_decode_funcs(GeneratedFs,0);
+pgen_partial_incomplete_decode1(_) -> ok.
+
+emit_partial_incomplete_decode({FuncName,TopTypeName,Pattern}) ->
+ emit([{asis,FuncName},"(Bytes) ->",nl,
+ " decode_partial_incomplete(",{asis,TopTypeName},",Bytes,",{asis,Pattern},").",nl]);
+emit_partial_incomplete_decode(D) ->
+ throw({error,{asn1,{"bad data in asn1config file",D}}}).
+
+gen_part_decode_funcs([Data={Name,_,_,Type}|GeneratedFs],N) ->
+ InnerType =
+ case Type#type.def of
+ #'ObjectClassFieldType'{type=OCFTType} ->
+ OCFTType;
+ _ ->
+ get_inner(Type#type.def)
+ end,
+ WhatKind = type(InnerType),
+ TypeName=list2name(Name),
+ if
+ N > 0 -> emit([";",nl]);
+ true -> ok
+ end,
+ emit(["decode_inc_disp('",TypeName,"',Data) ->",nl]),
+ gen_part_decode_funcs(WhatKind,TypeName,Data),
+ gen_part_decode_funcs(GeneratedFs,N+1);
+gen_part_decode_funcs([_H|T],N) ->
+ gen_part_decode_funcs(T,N);
+gen_part_decode_funcs([],N) ->
+ if
+ N > 0 ->
+ .emit([".",nl]);
+ true ->
+ ok
+ end.
+
+gen_part_decode_funcs(#'Externaltypereference'{module=M,type=T},
+ _TypeName,Data) ->
+ #typedef{typespec=TS} = asn1_db:dbget(M,T),
+ InnerType =
+ case TS#type.def of
+ #'ObjectClassFieldType'{type=OCFTType} ->
+ OCFTType;
+ _ ->
+ get_inner(TS#type.def)
+ end,
+ WhatKind = type(InnerType),
+ gen_part_decode_funcs(WhatKind,[T],Data);
+gen_part_decode_funcs({constructed,bif},TypeName,
+ {_Name,parts,Tag,_Type}) ->
+ emit([" case Data of",nl,
+ " L when list(L) ->",nl,
+ " 'dec_",TypeName,"'(lists:map(fun(X)->element(1,?RT_BER:decode(X)) end,L),",{asis,Tag},");",nl,
+ " _ ->",nl,
+ " [Res] = 'dec_",TypeName,"'([Data],",{asis,Tag},"),",nl,
+ " Res",nl,
+ " end"]);
+gen_part_decode_funcs(WhatKind,_TypeName,{_Name,parts,_Tag,_Type}) ->
+ throw({error,{asn1,{"only SEQUENCE OF/SET OF may have the partial incomplete directive 'parts'.",WhatKind}}});
+gen_part_decode_funcs({constructed,bif},TypeName,
+ {_Name,undecoded,Tag,_Type}) ->
+ emit([" 'dec_",TypeName,"'(Data,",{asis,Tag},")"]);
+gen_part_decode_funcs({primitive,bif},_TypeName,
+ {_Name,undecoded,Tag,Type}) ->
+ % Argument no 6 is 0, i.e. bit 6 for primitive encoding.
+ asn1ct_gen_ber_bin_v2:gen_dec_prim(ber_bin_v2,Type,"Data",Tag,[],0,", mandatory, ");
+gen_part_decode_funcs(WhatKind,_TypeName,{_,Directive,_,_}) ->
+ throw({error,{asn1,{"Not implemented yet",WhatKind," partial incomplete directive:",Directive}}}).
+
+gen_types(Erules,Tname,{RootList,ExtList}) when list(RootList) ->
+ gen_types(Erules,Tname,RootList),
+ gen_types(Erules,Tname,ExtList);
+gen_types(Erules,Tname,[{'EXTENSIONMARK',_,_}|Rest]) ->
+ gen_types(Erules,Tname,Rest);
+gen_types(Erules,Tname,[ComponentType|Rest]) ->
+ Rtmod = list_to_atom(lists:concat(["asn1ct_gen_",erule(Erules),
+ rt2ct_suffix(Erules)])),
+ asn1ct_name:clear(),
+ Rtmod:gen_encode(Erules,Tname,ComponentType),
+ asn1ct_name:clear(),
+ Rtmod:gen_decode(Erules,Tname,ComponentType),
+ gen_types(Erules,Tname,Rest);
+gen_types(_,_,[]) ->
+ true;
+gen_types(Erules,Tname,Type) when record(Type,type) ->
+ Rtmod = list_to_atom(lists:concat(["asn1ct_gen_",erule(Erules),
+ rt2ct_suffix(Erules)])),
+ asn1ct_name:clear(),
+ Rtmod:gen_encode(Erules,Tname,Type),
+ asn1ct_name:clear(),
+ Rtmod:gen_decode(Erules,Tname,Type).
+
+gen_value_match(Module) ->
+ case get(value_match) of
+ {true,Module} ->
+ emit(["value_match([{Index,Cname}|Rest],Value) ->",nl,
+ " Value2 =",nl,
+ " case element(Index,Value) of",nl,
+ " {Cname,Val2} -> Val2;",nl,
+ " X -> X",nl,
+ " end,",nl,
+ " value_match(Rest,Value2);",nl,
+ "value_match([],Value) ->",nl,
+ " Value.",nl]);
+ _ -> ok
+ end,
+ put(value_match,undefined).
+
+gen_check_defaultval(Erules,Module,[{Name,Type}|Rest]) ->
+ gen_check_func(Name,Type),
+ gen_check_defaultval(Erules,Module,Rest);
+gen_check_defaultval(_,_,[]) ->
+ ok.
+
+gen_check_func(Name,FType = #type{def=Def}) ->
+ emit({Name,"(V,asn1_DEFAULT) ->",nl," true;",nl}),
+ emit({Name,"(V,V) ->",nl," true;",nl}),
+ emit({Name,"(V,{_,V}) ->",nl," true;",nl}),
+ case Def of
+ {'SEQUENCE OF',Type} ->
+ gen_check_sof(Name,'SEQOF',Type);
+ {'SET OF',Type} ->
+ gen_check_sof(Name,'SETOF',Type);
+ #'SEQUENCE'{components=Components} ->
+ gen_check_sequence(Name,Components);
+ #'SET'{components=Components} ->
+ gen_check_sequence(Name,Components);
+ {'CHOICE',Components} ->
+ gen_check_choice(Name,Components);
+ #'Externaltypereference'{type=T} ->
+ emit({Name,"(DefaultValue,Value) ->",nl}),
+ emit({" ",list2name([T,check]),"(DefaultValue,Value).",nl});
+ MaybePrim ->
+ InnerType = get_inner(MaybePrim),
+ case type(InnerType) of
+ {primitive,bif} ->
+ emit({Name,"(DefaultValue,Value) ->",nl," "}),
+ gen_prim_check_call(InnerType,"DefaultValue","Value",
+ FType),
+ emit({".",nl,nl});
+ _ ->
+ throw({asn1_error,{unknown,type,MaybePrim}})
+ end
+ end.
+
+gen_check_sof(Name,SOF,Type) ->
+ NewName = list2name([sorted,Name]),
+ emit({Name,"(V1,V2) ->",nl}),
+ emit({" ",NewName,"(lists:sort(V1),lists:sort(V2)).",nl,nl}),
+ emit({NewName,"([],[]) ->",nl," true;",nl}),
+ emit({NewName,"([DV|DVs],[V|Vs]) ->",nl," "}),
+ InnerType = get_inner(Type#type.def),
+ case type(InnerType) of
+ {primitive,bif} ->
+ gen_prim_check_call(InnerType,"DV","V",Type),
+ emit({",",nl});
+ {constructed,bif} ->
+ emit({list2name([SOF,Name]),"(DV, V),",nl});
+ #'Externaltypereference'{type=T} ->
+ emit({list2name([T,check]),"(DV,V),",nl})
+ end,
+ emit({" ",NewName,"(DVs,Vs).",nl,nl}).
+
+gen_check_sequence(Name,Components) ->
+ emit({Name,"(DefaultValue,Value) ->",nl}),
+ gen_check_sequence(Name,Components,1).
+gen_check_sequence(Name,[#'ComponentType'{name=N,typespec=Type}|Cs],Num) ->
+ InnerType = get_inner(Type#type.def),
+% NthDefV = lists:concat(["lists:nth(",Num,",DefaultValue)"]),
+ NthDefV = ["element(",Num+1,",DefaultValue)"],
+% NthV = lists:concat(["lists:nth(",Num,",Value)"]),
+ NthV = ["element(",Num+1,",Value)"],
+ gen_check_func_call(Name,Type,InnerType,NthDefV,NthV,N),
+ case Cs of
+ [] ->
+ emit({".",nl,nl});
+ _ ->
+ emit({",",nl}),
+ gen_check_sequence(Name,Cs,Num+1)
+ end;
+gen_check_sequence(_,[],_) ->
+ ok.
+
+gen_check_choice(Name,CList=[#'ComponentType'{}|_Cs]) ->
+ emit({Name,"({Id,DefaultValue},{Id,Value}) ->",nl}),
+ emit({" case Id of",nl}),
+ gen_check_choice_components(Name,CList,1).
+
+gen_check_choice_components(_,[],_)->
+ ok;
+gen_check_choice_components(Name,[#'ComponentType'{name=N,typespec=Type}|
+ Cs],Num) ->
+ Ind6 = " ",
+ InnerType = get_inner(Type#type.def),
+% DefVal = ["element(2,lists:nth(",Num,",DefaultValue))"],
+ emit({Ind6,N," ->",nl,Ind6}),
+ gen_check_func_call(Name,Type,InnerType,{var,"defaultValue"},
+ {var,"value"},N),
+ case Cs of
+ [] ->
+ emit({nl," end.",nl,nl});
+ _ ->
+ emit({";",nl}),
+ gen_check_choice_components(Name,Cs,Num+1)
+ end.
+
+gen_check_func_call(Name,Type,InnerType,DefVal,Val,N) ->
+ case type(InnerType) of
+ {primitive,bif} ->
+ emit(" "),
+ gen_prim_check_call(InnerType,DefVal,Val,Type);
+ #'Externaltypereference'{type=T} ->
+ emit({" ",list2name([T,check]),"(",DefVal,",",Val,")"});
+ _ ->
+ emit({" ",list2name([N,Name]),"(",DefVal,",",Val,")"})
+ end.
+
+
+%% VARIOUS GENERATOR STUFF
+%% *************************************************
+%%**************************************************
+
+mk_var(X) when atom(X) ->
+ list_to_atom(mk_var(atom_to_list(X)));
+
+mk_var([H|T]) ->
+ [H-32|T].
+
+%% Since hyphens are allowed in ASN.1 names, it may occur in a
+%% variable to. Turn a hyphen into a under-score sign.
+un_hyphen_var(X) when atom(X) ->
+ list_to_atom(un_hyphen_var(atom_to_list(X)));
+un_hyphen_var([45|T]) ->
+ [95|un_hyphen_var(T)];
+un_hyphen_var([H|T]) ->
+ [H|un_hyphen_var(T)];
+un_hyphen_var([]) ->
+ [].
+
+%% Generate value functions ***************
+%% ****************************************
+%% Generates a function 'V'/0 for each Value V defined in the ASN.1 module
+%% the function returns the value in an Erlang representation which can be
+%% used as input to the runtime encode functions
+
+gen_value(Value) when record(Value,valuedef) ->
+%% io:format(" ~w ",[Value#valuedef.name]),
+ emit({"'",Value#valuedef.name,"'() ->",nl}),
+ V = Value#valuedef.value,
+ emit([{asis,V},".",nl,nl]).
+
+gen_encode_constructed(Erules,Typename,InnerType,D) when record(D,type) ->
+
+ Rtmod = list_to_atom(lists:concat(["asn1ct_constructed_",erule(Erules)])),
+ case InnerType of
+ 'SET' ->
+ Rtmod:gen_encode_set(Erules,Typename,D),
+ #'SET'{components=Components} = D#type.def,
+ gen_types(Erules,Typename,Components);
+ 'SEQUENCE' ->
+ Rtmod:gen_encode_sequence(Erules,Typename,D),
+ #'SEQUENCE'{components=Components} = D#type.def,
+ gen_types(Erules,Typename,Components);
+ 'CHOICE' ->
+ Rtmod:gen_encode_choice(Erules,Typename,D),
+ {_,Components} = D#type.def,
+ gen_types(Erules,Typename,Components);
+ 'SEQUENCE OF' ->
+ Rtmod:gen_encode_sof(Erules,Typename,InnerType,D),
+ {_,Type} = D#type.def,
+ NameSuffix = asn1ct_gen:constructed_suffix(InnerType,Type#type.def),
+ gen_types(Erules,[NameSuffix|Typename],Type);
+ 'SET OF' ->
+ Rtmod:gen_encode_sof(Erules,Typename,InnerType,D),
+ {_,Type} = D#type.def,
+ NameSuffix = asn1ct_gen:constructed_suffix(InnerType,Type#type.def),
+ gen_types(Erules,[NameSuffix|Typename],Type);
+ _ ->
+ exit({nyi,InnerType})
+ end;
+gen_encode_constructed(Erules,Typename,InnerType,D)
+ when record(D,typedef) ->
+ gen_encode_constructed(Erules,Typename,InnerType,D#typedef.typespec).
+
+gen_decode_constructed(Erules,Typename,InnerType,D) when record(D,type) ->
+ Rtmod = list_to_atom(lists:concat(["asn1ct_constructed_",erule(Erules)])),
+ asn1ct:step_in_constructed(), %% updates namelist for incomplete
+ %% partial decode
+ case InnerType of
+ 'SET' ->
+ Rtmod:gen_decode_set(Erules,Typename,D);
+ 'SEQUENCE' ->
+ Rtmod:gen_decode_sequence(Erules,Typename,D);
+ 'CHOICE' ->
+ Rtmod:gen_decode_choice(Erules,Typename,D);
+ 'SEQUENCE OF' ->
+ Rtmod:gen_decode_sof(Erules,Typename,InnerType,D);
+ 'SET OF' ->
+ Rtmod:gen_decode_sof(Erules,Typename,InnerType,D);
+ _ ->
+ exit({nyi,InnerType})
+ end;
+
+
+gen_decode_constructed(Erules,Typename,InnerType,D) when record(D,typedef) ->
+ gen_decode_constructed(Erules,Typename,InnerType,D#typedef.typespec).
+
+
+pgen_exports(Erules,_Module,{Types,Values,_,_,Objects,ObjectSets}) ->
+ emit({"-export([encoding_rule/0]).",nl}),
+ case Types of
+ [] -> ok;
+ _ ->
+ emit({"-export([",nl}),
+ case Erules of
+ ber ->
+ gen_exports1(Types,"enc_",2);
+ ber_bin ->
+ gen_exports1(Types,"enc_",2);
+ ber_bin_v2 ->
+ gen_exports1(Types,"enc_",2);
+ _ ->
+ gen_exports1(Types,"enc_",1)
+ end,
+ emit({"-export([",nl}),
+ gen_exports1(Types,"dec_",2),
+ case Erules of
+ ber ->
+ emit({"-export([",nl}),
+ gen_exports1(Types,"dec_",3);
+ ber_bin ->
+ emit({"-export([",nl}),
+ gen_exports1(Types,"dec_",3);
+ ber_bin_v2 ->
+ emit({"-export([",nl}),
+ gen_exports1(Types,"dec_",2);
+ _ -> ok
+ end
+ end,
+ case Values of
+ [] -> ok;
+ _ ->
+ emit({"-export([",nl}),
+ gen_exports1(Values,"",0)
+ end,
+ case Objects of
+ [] -> ok;
+ _ ->
+ case erule(Erules) of
+ per ->
+ emit({"-export([",nl}),
+ gen_exports1(Objects,"enc_",3),
+ emit({"-export([",nl}),
+ gen_exports1(Objects,"dec_",4);
+ ber_bin_v2 ->
+ emit({"-export([",nl}),
+ gen_exports1(Objects,"enc_",3),
+ emit({"-export([",nl}),
+ gen_exports1(Objects,"dec_",3);
+ _ ->
+ emit({"-export([",nl}),
+ gen_exports1(Objects,"enc_",4),
+ emit({"-export([",nl}),
+ gen_exports1(Objects,"dec_",4)
+ end
+ end,
+ case ObjectSets of
+ [] -> ok;
+ _ ->
+ emit({"-export([",nl}),
+ gen_exports1(ObjectSets,"getenc_",2),
+ emit({"-export([",nl}),
+ gen_exports1(ObjectSets,"getdec_",2)
+ end,
+ emit({"-export([info/0]).",nl}),
+ gen_partial_inc_decode_exports(),
+ emit({nl,nl}).
+
+gen_exports1([F1,F2|T],Prefix,Arity) ->
+ emit({"'",Prefix,F1,"'/",Arity,com,nl}),
+ gen_exports1([F2|T],Prefix,Arity);
+gen_exports1([Flast|_T],Prefix,Arity) ->
+ emit({"'",Prefix,Flast,"'/",Arity,nl,"]).",nl,nl}).
+
+gen_partial_inc_decode_exports() ->
+ case {asn1ct:read_config_data(partial_incomplete_decode),
+ asn1ct:get_gen_state_field(inc_type_pattern)} of
+ {undefined,_} ->
+ ok;
+ {_,undefined} ->
+ ok;
+ {Data,_} ->
+ gen_partial_inc_decode_exports(Data),
+ emit("-export([decode_part/2]).")
+ end.
+gen_partial_inc_decode_exports([]) ->
+ ok;
+gen_partial_inc_decode_exports([{Name,_,_}|Rest]) ->
+ emit(["-export([",Name,"/1"]),
+ gen_partial_inc_decode_exports1(Rest);
+gen_partial_inc_decode_exports([_|Rest]) ->
+ gen_partial_inc_decode_exports(Rest).
+
+gen_partial_inc_decode_exports1([]) ->
+ emit(["]).",nl]);
+gen_partial_inc_decode_exports1([{Name,_,_}|Rest]) ->
+ emit([", ",Name,"/1"]),
+ gen_partial_inc_decode_exports1(Rest);
+gen_partial_inc_decode_exports1([_|Rest]) ->
+ gen_partial_inc_decode_exports1(Rest).
+
+pgen_dispatcher(Erules,_Module,{[],_Values,_,_,_Objects,_ObjectSets}) ->
+ emit(["encoding_rule() ->",nl]),
+ emit([{asis,Erules},".",nl,nl]);
+pgen_dispatcher(Erules,_Module,{Types,_Values,_,_,_Objects,_ObjectSets}) ->
+ emit(["-export([encode/2,decode/2,encode_disp/2,decode_disp/2]).",nl,nl]),
+ emit(["encoding_rule() ->",nl]),
+ emit([" ",{asis,Erules},".",nl,nl]),
+ Call = case Erules of
+ per -> "?RT_PER:complete(encode_disp(Type,Data))";
+ per_bin -> "?RT_PER:complete(encode_disp(Type,Data))";
+ ber -> "encode_disp(Type,Data)";
+ ber_bin -> "encode_disp(Type,Data)";
+ ber_bin_v2 -> "encode_disp(Type,Data)"
+ end,
+ EncWrap = case Erules of
+ ber -> "wrap_encode(Bytes)";
+ _ -> "Bytes"
+ end,
+ emit(["encode(Type,Data) ->",nl,
+ "case catch ",Call," of",nl,
+ " {'EXIT',{error,Reason}} ->",nl,
+ " {error,Reason};",nl,
+ " {'EXIT',Reason} ->",nl,
+ " {error,{asn1,Reason}};",nl,
+ " {Bytes,_Len} ->",nl,
+ " {ok,",EncWrap,"};",nl,
+ " Bytes ->",nl,
+ " {ok,",EncWrap,"}",nl,
+ "end.",nl,nl]),
+
+ case Erules of
+ ber_bin_v2 ->
+ emit(["decode(Type,Data0) ->",nl]),
+ emit(["{Data,_RestBin} = ?RT_BER:decode(Data0",driver_parameter(),"),",nl]);
+ _ ->
+ emit(["decode(Type,Data) ->",nl])
+ end,
+ DecWrap = case Erules of
+ ber -> "wrap_decode(Data)";
+ _ -> "Data"
+ end,
+
+ emit(["case catch decode_disp(Type,",DecWrap,") of",nl,
+ " {'EXIT',{error,Reason}} ->",nl,
+ " {error,Reason};",nl,
+ " {'EXIT',Reason} ->",nl,
+ " {error,{asn1,Reason}};",nl]),
+ case Erules of
+ ber_bin_v2 ->
+ emit([" Result ->",nl,
+ " {ok,Result}",nl]);
+ _ ->
+ emit([" {X,_Rest} ->",nl,
+ " {ok,X};",nl,
+ " {X,_Rest,_Len} ->",nl,
+ " {ok,X}",nl])
+ end,
+ emit(["end.",nl,nl]),
+
+ gen_decode_partial_incomplete(Erules),
+
+ case Types of
+ [] -> ok;
+ _ ->
+ case Erules of
+ ber ->
+ gen_dispatcher(Types,"encode_disp","enc_",",[]"),
+ gen_dispatcher(Types,"decode_disp","dec_",",mandatory");
+ ber_bin ->
+ gen_dispatcher(Types,"encode_disp","enc_",",[]"),
+ gen_dispatcher(Types,"decode_disp","dec_",",mandatory");
+ ber_bin_v2 ->
+ gen_dispatcher(Types,"encode_disp","enc_",""),
+ gen_dispatcher(Types,"decode_disp","dec_",""),
+ gen_partial_inc_dispatcher();
+ _PerOrPer_bin ->
+ gen_dispatcher(Types,"encode_disp","enc_",""),
+ gen_dispatcher(Types,"decode_disp","dec_",",mandatory")
+ end,
+ emit([nl])
+ end,
+ case Erules of
+ ber ->
+ gen_wrapper();
+ _ -> ok
+ end,
+ emit({nl,nl}).
+
+
+gen_decode_partial_incomplete(Erule) when Erule == ber;Erule==ber_bin;
+ Erule==ber_bin_v2 ->
+ case {asn1ct:read_config_data(partial_incomplete_decode),
+ asn1ct:get_gen_state_field(inc_type_pattern)} of
+ {undefined,_} ->
+ ok;
+ {_,undefined} ->
+ ok;
+ _ ->
+ case Erule of
+ ber_bin_v2 ->
+ EmitCaseClauses =
+ fun() ->
+ emit([" {'EXIT',{error,Reason}} ->",nl,
+ " {error,Reason};",nl,
+ " {'EXIT',Reason} ->",nl,
+ " {error,{asn1,Reason}};",nl,
+ " Result ->",nl,
+ " {ok,Result}",nl,
+ " end.",nl,nl])
+ end,
+ emit(["decode_partial_incomplete(Type,Data0,",
+ "Pattern) ->",nl]),
+ emit([" {Data,_RestBin} =",nl,
+ " ?RT_BER:decode_primitive_",
+ "incomplete(Pattern,Data0),",nl,
+ " case catch decode_partial_inc_disp(Type,",
+ "Data) of",nl]),
+ EmitCaseClauses(),
+ emit(["decode_part(Type,Data0) ->",nl,
+ " {Data,_RestBin} = ?RT_BER:decode(Data0),",nl,
+ " case catch decode_inc_disp(Type,Data) of",nl]),
+ EmitCaseClauses();
+ _ -> ok % add later
+ end
+ end;
+gen_decode_partial_incomplete(_Erule) ->
+ ok.
+
+gen_partial_inc_dispatcher() ->
+ case {asn1ct:read_config_data(partial_incomplete_decode),
+ asn1ct:get_gen_state_field(inc_type_pattern)} of
+ {undefined,_} ->
+ ok;
+ {_,undefined} ->
+ ok;
+ {Data,_} ->
+ gen_partial_inc_dispatcher(Data)
+ end.
+gen_partial_inc_dispatcher([{_FuncName,TopType,_Pattern}|Rest]) ->
+ emit(["decode_partial_inc_disp(",{asis,TopType},",Data) ->",nl,
+ " ",{asis,list_to_atom(lists:concat([dec,"-inc-",TopType]))},
+ "(Data);",nl]),
+ gen_partial_inc_dispatcher(Rest);
+gen_partial_inc_dispatcher([]) ->
+ emit(["decode_partial_inc_disp(Type,_Data) ->",nl,
+ " exit({error,{asn1,{undefined_type,Type}}}).",nl]).
+
+driver_parameter() ->
+ Options = get(encoding_options),
+ case lists:member(driver,Options) of
+ true ->
+ ",driver";
+ _ -> ""
+ end.
+
+gen_wrapper() ->
+ emit(["wrap_encode(Bytes) when list(Bytes) ->",nl,
+ " binary_to_list(list_to_binary(Bytes));",nl,
+ "wrap_encode(Bytes) when binary(Bytes) ->",nl,
+ " binary_to_list(Bytes);",nl,
+ "wrap_encode(Bytes) -> Bytes.",nl,nl]),
+ emit(["wrap_decode(Bytes) when list(Bytes) ->",nl,
+ " list_to_binary(Bytes);",nl,
+ "wrap_decode(Bytes) -> Bytes.",nl]).
+
+gen_dispatcher([F1,F2|T],FuncName,Prefix,ExtraArg) ->
+ emit([FuncName,"('",F1,"',Data) -> '",Prefix,F1,"'(Data",ExtraArg,")",";",nl]),
+ gen_dispatcher([F2|T],FuncName,Prefix,ExtraArg);
+gen_dispatcher([Flast|_T],FuncName,Prefix,ExtraArg) ->
+ emit([FuncName,"('",Flast,"',Data) -> '",Prefix,Flast,"'(Data",ExtraArg,")",";",nl]),
+ emit([FuncName,"(","Type",",_Data) -> exit({error,{asn1,{undefined_type,Type}}}).",nl,nl,nl]).
+
+pgen_info(_Erules,Module) ->
+ Options = get(encoding_options),
+ emit({"info() ->",nl,
+ " [{vsn,'",asn1ct:vsn(),"'},",
+ " {module,'",Module,"'},",
+ " {options,",io_lib:format("~p",[Options]),"}].",nl}).
+
+open_hrl(OutFile,Module) ->
+ File = lists:concat([OutFile,".hrl"]),
+ Fid = fopen(File,write),
+ put(gen_file_out,Fid),
+ gen_hrlhead(Module).
+
+%% EMIT functions ************************
+%% ***************************************
+
+ % debug generation
+demit(Term) ->
+ case get(asndebug) of
+ true -> emit(Term);
+ _ ->true
+ end.
+
+ % always generation
+
+emit({external,_M,T}) ->
+ emit(T);
+
+emit({prev,Variable}) when atom(Variable) ->
+ emit({var,asn1ct_name:prev(Variable)});
+
+emit({next,Variable}) when atom(Variable) ->
+ emit({var,asn1ct_name:next(Variable)});
+
+emit({curr,Variable}) when atom(Variable) ->
+ emit({var,asn1ct_name:curr(Variable)});
+
+emit({var,Variable}) when atom(Variable) ->
+ [Head|V] = atom_to_list(Variable),
+ emit([Head-32|V]);
+
+emit({var,Variable}) ->
+ [Head|V] = Variable,
+ emit([Head-32|V]);
+
+emit({asis,What}) ->
+ format(get(gen_file_out),"~w",[What]);
+
+emit(nl) ->
+ nl(get(gen_file_out));
+
+emit(com) ->
+ emit(",");
+
+emit(tab) ->
+ put_chars(get(gen_file_out)," ");
+
+emit(What) when integer(What) ->
+ put_chars(get(gen_file_out),integer_to_list(What));
+
+emit(What) when list(What), integer(hd(What)) ->
+ put_chars(get(gen_file_out),What);
+
+emit(What) when atom(What) ->
+ put_chars(get(gen_file_out),atom_to_list(What));
+
+emit(What) when tuple(What) ->
+ emit_parts(tuple_to_list(What));
+
+emit(What) when list(What) ->
+ emit_parts(What);
+
+emit(X) ->
+ exit({'cant emit ',X}).
+
+emit_parts([]) -> true;
+emit_parts([H|T]) ->
+ emit(H),
+ emit_parts(T).
+
+format(undefined,X,Y) ->
+ io:format(X,Y);
+format(X,Y,Z) ->
+ io:format(X,Y,Z).
+
+nl(undefined) -> io:nl();
+nl(X) -> io:nl(X).
+
+put_chars(undefined,X) ->
+ io:put_chars(X);
+put_chars(Y,X) ->
+ io:put_chars(Y,X).
+
+fopen(F, Mode) ->
+ case file:open(F, [Mode]) of
+ {ok, Fd} ->
+ Fd;
+ {error, Reason} ->
+ io:format("** Can't open file ~p ~n", [F]),
+ exit({error,Reason})
+ end.
+
+pgen_hrl(Erules,Module,TypeOrVal,_Indent) ->
+ put(currmod,Module),
+ {Types,Values,Ptypes,_,_,_} = TypeOrVal,
+ Ret =
+ case pgen_hrltypes(Erules,Module,Ptypes++Types,0) of
+ 0 ->
+ case Values of
+ [] ->
+ 0;
+ _ ->
+ open_hrl(get(outfile),get(currmod)),
+ pgen_macros(Erules,Module,Values),
+ 1
+ end;
+ X ->
+ pgen_macros(Erules,Module,Values),
+ X
+ end,
+ case Ret of
+ 0 ->
+ 0;
+ Y ->
+ Fid = get(gen_file_out),
+ file:close(Fid),
+ io:format("--~p--~n",
+ [{generated,lists:concat([get(outfile),".hrl"])}]),
+ Y
+ end.
+
+pgen_macros(_,_,[]) ->
+ true;
+pgen_macros(Erules,Module,[H|T]) ->
+ Valuedef = asn1_db:dbget(Module,H),
+ gen_macro(Valuedef),
+ pgen_macros(Erules,Module,T).
+
+pgen_hrltypes(_,_,[],NumRecords) ->
+ NumRecords;
+pgen_hrltypes(Erules,Module,[H|T],NumRecords) ->
+% io:format("records = ~p~n",NumRecords),
+ Typedef = asn1_db:dbget(Module,H),
+ AddNumRecords = gen_record(Typedef,NumRecords),
+ pgen_hrltypes(Erules,Module,T,NumRecords+AddNumRecords).
+
+
+%% Generates a macro for value Value defined in the ASN.1 module
+gen_macro(Value) when record(Value,valuedef) ->
+ emit({"-define('",Value#valuedef.name,"', ",
+ {asis,Value#valuedef.value},").",nl}).
+
+%% Generate record functions **************
+%% Generates an Erlang record for each named and unnamed SEQUENCE and SET in the ASN.1
+%% module. If no SEQUENCE or SET is found there is no .hrl file generated
+
+
+gen_record(Tdef,NumRecords) when record(Tdef,typedef) ->
+ Name = [Tdef#typedef.name],
+ Type = Tdef#typedef.typespec,
+ gen_record(type,Name,Type,NumRecords);
+
+gen_record(Tdef,NumRecords) when record(Tdef,ptypedef) ->
+ Name = [Tdef#ptypedef.name],
+ Type = Tdef#ptypedef.typespec,
+ gen_record(ptype,Name,Type,NumRecords).
+
+gen_record(TorPtype,Name,[#'ComponentType'{name=Cname,typespec=Type}|T],Num) ->
+ Num2 = gen_record(TorPtype,[Cname|Name],Type,Num),
+ gen_record(TorPtype,Name,T,Num2);
+gen_record(TorPtype,Name,{Clist1,Clist2},Num) when list(Clist1), list(Clist2) ->
+ gen_record(TorPtype,Name,Clist1++Clist2,Num);
+gen_record(TorPtype,Name,[_|T],Num) -> % skip EXTENSIONMARK
+ gen_record(TorPtype,Name,T,Num);
+gen_record(_TorPtype,_Name,[],Num) ->
+ Num;
+
+gen_record(TorPtype,Name,Type,Num) when record(Type,type) ->
+ Def = Type#type.def,
+ Rec = case Def of
+ Seq when record(Seq,'SEQUENCE') ->
+ case Seq#'SEQUENCE'.pname of
+ false ->
+ {record,Seq#'SEQUENCE'.components};
+ _Pname when TorPtype == type ->
+ false;
+ _ ->
+ {record,Seq#'SEQUENCE'.components}
+ end;
+ Set when record(Set,'SET') ->
+ case Set#'SET'.pname of
+ false ->
+ {record,Set#'SET'.components};
+ _Pname when TorPtype == type ->
+ false;
+ _ ->
+ {record,Set#'SET'.components}
+ end;
+% {'SET',{_,_CompList}} ->
+% {record,_CompList};
+ {'CHOICE',_CompList} -> {inner,Def};
+ {'SEQUENCE OF',_CompList} -> {['SEQOF'|Name],Def};
+ {'SET OF',_CompList} -> {['SETOF'|Name],Def};
+ _ -> false
+ end,
+ case Rec of
+ false -> Num;
+ {record,CompList} ->
+ case Num of
+ 0 -> open_hrl(get(outfile),get(currmod));
+ _ -> true
+ end,
+ emit({"-record('",list2name(Name),"',{",nl}),
+ RootList = case CompList of
+ _ when list(CompList) ->
+ CompList;
+ {_Rl,_} -> _Rl
+ end,
+ gen_record2(Name,'SEQUENCE',RootList),
+ NewCompList =
+ case CompList of
+ {CompList1,[]} ->
+ emit({"}). % with extension mark",nl,nl}),
+ CompList1;
+ {Tr,ExtensionList2} ->
+ case Tr of
+ [] -> true;
+ _ -> emit({",",nl})
+ end,
+ emit({"%% with extensions",nl}),
+ gen_record2(Name, 'SEQUENCE', ExtensionList2,
+ "", ext),
+ emit({"}).",nl,nl}),
+ Tr ++ ExtensionList2;
+ _ ->
+ emit({"}).",nl,nl}),
+ CompList
+ end,
+ gen_record(TorPtype,Name,NewCompList,Num+1);
+ {inner,{'CHOICE', CompList}} ->
+ gen_record(TorPtype,Name,CompList,Num);
+ {NewName,{_, CompList}} ->
+ gen_record(TorPtype,NewName,CompList,Num)
+ end;
+gen_record(_,_,_,NumRecords) -> % skip CLASS etc for now.
+ NumRecords.
+
+gen_head(Erules,Mod,Hrl) ->
+ {Rtmac,Rtmod} = case Erules of
+ per ->
+ emit({"%% Generated by the Erlang ASN.1 PER-"
+ "compiler version:",asn1ct:vsn(),nl}),
+ {"RT_PER",?RT_PER};
+ ber ->
+ emit({"%% Generated by the Erlang ASN.1 BER-"
+ "compiler version:",asn1ct:vsn(),nl}),
+ {"RT_BER",?RT_BER_BIN};
+ per_bin ->
+ emit({"%% Generated by the Erlang ASN.1 BER-"
+ "compiler version, utilizing bit-syntax:",
+ asn1ct:vsn(),nl}),
+ %% temporary code to enable rt2ct optimization
+ Options = get(encoding_options),
+ case lists:member(optimize,Options) of
+ true -> {"RT_PER","asn1rt_per_bin_rt2ct"};
+ _ ->
+ {"RT_PER",?RT_PER_BIN}
+ end;
+ ber_bin ->
+ emit({"%% Generated by the Erlang ASN.1 BER-"
+ "compiler version, utilizing bit-syntax:",
+ asn1ct:vsn(),nl}),
+ {"RT_BER",?RT_BER_BIN};
+ ber_bin_v2 ->
+ emit({"%% Generated by the Erlang ASN.1 BER_V2-"
+ "compiler version, utilizing bit-syntax:",
+ asn1ct:vsn(),nl}),
+ {"RT_BER","asn1rt_ber_bin_v2"}
+ end,
+ emit({"%% Purpose: encoder and decoder to the types in mod ",Mod,nl,nl}),
+ emit({"-module('",Mod,"').",nl}),
+ put(currmod,Mod),
+ %emit({"-compile(export_all).",nl}),
+ case Hrl of
+ 0 -> true;
+ _ ->
+ emit({"-include(\"",Mod,".hrl\").",nl})
+ end,
+ emit(["-define('",Rtmac,"',",Rtmod,").",nl]).
+
+
+gen_hrlhead(Mod) ->
+ emit({"%% Generated by the Erlang ASN.1 compiler version:",asn1ct:vsn(),nl}),
+ emit({"%% Purpose: Erlang record definitions for each named and unnamed",nl}),
+ emit({"%% SEQUENCE and SET, and macro definitions for each value",nl}),
+ emit({"%% definition,in module ",Mod,nl,nl}),
+ emit({nl,nl}).
+
+gen_record2(Name,SeqOrSet,Comps) ->
+ gen_record2(Name,SeqOrSet,Comps,"",noext).
+
+gen_record2(_Name,_SeqOrSet,[],_Com,_Extension) ->
+ true;
+gen_record2(Name,SeqOrSet,[{'EXTENSIONMARK',_,_}|T],Com,Extension) ->
+ gen_record2(Name,SeqOrSet,T,Com,Extension);
+gen_record2(_Name,_SeqOrSet,[H],Com,Extension) ->
+ #'ComponentType'{name=Cname} = H,
+ emit(Com),
+ emit({asis,Cname}),
+ gen_record_default(H, Extension);
+gen_record2(Name,SeqOrSet,[H|T],Com, Extension) ->
+ #'ComponentType'{name=Cname} = H,
+ emit(Com),
+ emit({asis,Cname}),
+ gen_record_default(H, Extension),
+% emit(", "),
+ gen_record2(Name,SeqOrSet,T,", ", Extension).
+
+%gen_record_default(C, ext) ->
+% emit(" = asn1_NOEXTVALUE");
+gen_record_default(#'ComponentType'{prop='OPTIONAL'}, _)->
+ emit(" = asn1_NOVALUE");
+gen_record_default(#'ComponentType'{prop={'DEFAULT',_}}, _)->
+ emit(" = asn1_DEFAULT");
+gen_record_default(_, _) ->
+ true.
+
+gen_check_call(TopType,Cname,Type,InnerType,WhatKind,DefaultValue,Element) ->
+ case WhatKind of
+ {primitive,bif} ->
+ gen_prim_check_call(InnerType,DefaultValue,Element,Type);
+ #'Externaltypereference'{module=M,type=T} ->
+ %% generate function call
+ Name = list2name([T,check]),
+ emit({"'",Name,"'(",DefaultValue,", ",Element,")"}),
+ %% insert in ets table and do look ahead check
+ Typedef = asn1_db:dbget(M,T),
+ RefType = Typedef#typedef.typespec,
+ InType = asn1ct_gen:get_inner(RefType#type.def),
+ case insert_once(check_functions,{Name,RefType}) of
+ true ->
+ lookahead_innertype([T],InType,RefType);
+% case asn1ct_gen:type(InType) of
+% {constructed,bif} ->
+% lookahead_innertype([T],InType,RefType);
+% #'Externaltypereference'{type=TNew} ->
+% lookahead_innertype([TNew],InType,RefType);
+% _ ->
+% ok
+% end;
+ _ ->
+ ok
+ end;
+ {constructed,bif} ->
+ NameList = [Cname|TopType],
+ Name = list2name(NameList ++ [check]),
+ emit({"'",Name,"'(",DefaultValue,", ",Element,")"}),
+ ets:insert(check_functions,{Name,Type}),
+ %% Must look for check functions in InnerType,
+ %% that may be referenced or internal defined
+ %% constructed types not used elsewhere.
+ lookahead_innertype(NameList,InnerType,Type)
+ end.
+
+gen_prim_check_call(PrimType,DefaultValue,Element,Type) ->
+ case unify_if_string(PrimType) of
+ 'BOOLEAN' ->
+ emit({"asn1rt_check:check_bool(",DefaultValue,", ",
+ Element,")"});
+ 'INTEGER' ->
+ NNL =
+ case Type#type.def of
+ {_,NamedNumberList} -> NamedNumberList;
+ _ -> []
+ end,
+ emit({"asn1rt_check:check_int(",DefaultValue,", ",
+ Element,", ",{asis,NNL},")"});
+ 'BIT STRING' ->
+ {_,NBL} = Type#type.def,
+ emit({"asn1rt_check:check_bitstring(",DefaultValue,", ",
+ Element,", ",{asis,NBL},")"});
+ 'OCTET STRING' ->
+ emit({"asn1rt_check:check_octetstring(",DefaultValue,", ",
+ Element,")"});
+ 'NULL' ->
+ emit({"asn1rt_check:check_null(",DefaultValue,", ",
+ Element,")"});
+ 'OBJECT IDENTIFIER' ->
+ emit({"asn1rt_check:check_objectidentifier(",DefaultValue,
+ ", ",Element,")"});
+ 'ObjectDescriptor' ->
+ emit({"asn1rt_check:check_objectdescriptor(",DefaultValue,
+ ", ",Element,")"});
+ 'REAL' ->
+ emit({"asn1rt_check:check_real(",DefaultValue,
+ ", ",Element,")"});
+ 'ENUMERATED' ->
+ {_,Enumerations} = Type#type.def,
+ emit({"asn1rt_check:check_enum(",DefaultValue,
+ ", ",Element,", ",{asis,Enumerations},")"});
+ restrictedstring ->
+ emit({"asn1rt_check:check_restrictedstring(",DefaultValue,
+ ", ",Element,")"})
+ end.
+
+%% lokahead_innertype/3 traverses Type and checks if check functions
+%% have to be generated, i.e. for all constructed or referenced types.
+lookahead_innertype(Name,'SEQUENCE',Type) ->
+ Components = (Type#type.def)#'SEQUENCE'.components,
+ lookahead_components(Name,Components);
+lookahead_innertype(Name,'SET',Type) ->
+ Components = (Type#type.def)#'SET'.components,
+ lookahead_components(Name,Components);
+lookahead_innertype(Name,'CHOICE',Type) ->
+ {_,Components} = Type#type.def,
+ lookahead_components(Name,Components);
+lookahead_innertype(Name,'SEQUENCE OF',SeqOf) ->
+ lookahead_sof(Name,'SEQOF',SeqOf);
+lookahead_innertype(Name,'SET OF',SeqOf) ->
+ lookahead_sof(Name,'SETOF',SeqOf);
+lookahead_innertype(_Name,#'Externaltypereference'{module=M,type=T},_) ->
+ Typedef = asn1_db:dbget(M,T),
+ RefType = Typedef#typedef.typespec,
+ InType = asn1ct_gen:get_inner(RefType#type.def),
+ case type(InType) of
+ {constructed,bif} ->
+ NewName = list2name([T,check]),
+ case insert_once(check_functions,{NewName,RefType}) of
+ true ->
+ lookahead_innertype([T],InType,RefType);
+ _ ->
+ ok
+ end;
+ #'Externaltypereference'{} ->
+ NewName = list2name([T,check]),
+ case insert_once(check_functions,{NewName,RefType}) of
+ true ->
+ lookahead_innertype([T],InType,RefType);
+ _ ->
+ ok
+ end;
+ _ ->
+ ok
+ end;
+% case insert_once(check_functions,{list2name(Name++[check]),Type}) of
+% true ->
+% InnerType = asn1ct_gen:get_inner(Type#type.def),
+% case asn1ct_gen:type(InnerType) of
+% {constructed,bif} ->
+% lookahead_innertype([T],InnerType,Type);
+% #'Externaltypereference'{type=TNew} ->
+% lookahead_innertype([TNew],InnerType,Type);
+% _ ->
+% ok
+% end;
+% _ ->
+% ok
+% end;
+lookahead_innertype(_,_,_) ->
+ ok.
+
+lookahead_components(_,[]) -> ok;
+lookahead_components(Name,[C|Cs]) ->
+ #'ComponentType'{name=Cname,typespec=Type} = C,
+ InType = asn1ct_gen:get_inner(Type#type.def),
+ case asn1ct_gen:type(InType) of
+ {constructed,bif} ->
+ case insert_once(check_functions,
+ {list2name([Cname|Name] ++ [check]),Type}) of
+ true ->
+ lookahead_innertype([Cname|Name],InType,Type);
+ _ ->
+ ok
+ end;
+ #'Externaltypereference'{module=RefMod,type=RefName} ->
+ Typedef = asn1_db:dbget(RefMod,RefName),
+ RefType = Typedef#typedef.typespec,
+ case insert_once(check_functions,{list2name([RefName,check]),
+ RefType}) of
+ true ->
+ lookahead_innertype([RefName],InType,RefType);
+ _ ->
+ ok
+ end;
+ _ ->
+ ok
+ end,
+ lookahead_components(Name,Cs).
+
+lookahead_sof(Name,SOF,SOFType) ->
+ Type = case SOFType#type.def of
+ {_,_Type} -> _Type;
+ _Type -> _Type
+ end,
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ case asn1ct_gen:type(InnerType) of
+ {constructed,bif} ->
+ %% this is if a constructed type is defined in
+ %% the SEQUENCE OF type
+ NameList = [SOF|Name],
+ insert_once(check_functions,
+ {list2name(NameList ++ [check]),Type}),
+ lookahead_innertype(NameList,InnerType,Type);
+ #'Externaltypereference'{module=M,type=T} ->
+ Typedef = asn1_db:dbget(M,T),
+ RefType = Typedef#typedef.typespec,
+ InType = get_inner(RefType#type.def),
+ case insert_once(check_functions,
+ {list2name([T,check]),RefType}) of
+ true ->
+ lookahead_innertype([T],InType,RefType);
+ _ ->
+ ok
+ end;
+ _ ->
+ ok
+ end.
+
+
+insert_once(Table,Object) ->
+ case ets:lookup(Table,element(1,Object)) of
+ [] ->
+ ets:insert(Table,Object); %returns true
+ _ -> false
+ end.
+
+unify_if_string(PrimType) ->
+ case PrimType of
+ 'NumericString' ->
+ restrictedstring;
+ 'PrintableString' ->
+ restrictedstring;
+ 'TeletexString' ->
+ restrictedstring;
+ 'VideotexString' ->
+ restrictedstring;
+ 'IA5String' ->
+ restrictedstring;
+ 'UTCTime' ->
+ restrictedstring;
+ 'GeneralizedTime' ->
+ restrictedstring;
+ 'GraphicString' ->
+ restrictedstring;
+ 'VisibleString' ->
+ restrictedstring;
+ 'GeneralString' ->
+ restrictedstring;
+ 'UniversalString' ->
+ restrictedstring;
+ 'BMPString' ->
+ restrictedstring;
+ Other -> Other
+ end.
+
+
+
+
+
+get_inner(A) when atom(A) -> A;
+get_inner(Ext) when record(Ext,'Externaltypereference') -> Ext;
+get_inner(Tref) when record(Tref,typereference) -> Tref;
+get_inner({fixedtypevaluefield,_,Type}) ->
+ if
+ record(Type,type) ->
+ get_inner(Type#type.def);
+ true ->
+ get_inner(Type)
+ end;
+get_inner({typefield,TypeName}) ->
+ TypeName;
+get_inner(#'ObjectClassFieldType'{type=Type}) ->
+% get_inner(Type);
+ Type;
+get_inner(T) when tuple(T) ->
+ case element(1,T) of
+ Tuple when tuple(Tuple),element(1,Tuple) == objectclass ->
+ case catch(lists:last(element(2,T))) of
+ {valuefieldreference,FieldName} ->
+ get_fieldtype(element(2,Tuple),FieldName);
+ {typefieldreference,FieldName} ->
+ get_fieldtype(element(2,Tuple),FieldName);
+ {'EXIT',Reason} ->
+ throw({asn1,{'internal error in get_inner/1',Reason}})
+ end;
+ _ -> element(1,T)
+ end.
+
+
+
+
+
+type(X) when record(X,'Externaltypereference') ->
+ X;
+type(X) when record(X,typereference) ->
+ X;
+type('ASN1_OPEN_TYPE') ->
+ 'ASN1_OPEN_TYPE';
+type({fixedtypevaluefield,_Name,Type}) when record(Type,type) ->
+ type(get_inner(Type#type.def));
+type({typefield,_}) ->
+ 'ASN1_OPEN_TYPE';
+type(X) ->
+ %% io:format("asn1_types:type(~p)~n",[X]),
+ case catch type2(X) of
+ {'EXIT',_} ->
+ {notype,X};
+ Normal ->
+ Normal
+ end.
+
+type2(X) ->
+ case prim_bif(X) of
+ true ->
+ {primitive,bif};
+ false ->
+ case construct_bif(X) of
+ true ->
+ {constructed,bif};
+ false ->
+ {undefined,user}
+ end
+ end.
+
+prim_bif(X) ->
+ lists:member(X,['INTEGER' ,
+ 'ENUMERATED',
+ 'OBJECT IDENTIFIER',
+ 'ANY',
+ 'NULL',
+ 'BIT STRING' ,
+ 'OCTET STRING' ,
+ 'ObjectDescriptor',
+ 'NumericString',
+ 'TeletexString',
+ 'VideotexString',
+ 'UTCTime',
+ 'GeneralizedTime',
+ 'GraphicString',
+ 'VisibleString',
+ 'GeneralString',
+ 'PrintableString',
+ 'IA5String',
+ 'UniversalString',
+ 'BMPString',
+ 'ENUMERATED',
+ 'BOOLEAN']).
+
+construct_bif(T) ->
+ lists:member(T,['SEQUENCE' ,
+ 'SEQUENCE OF' ,
+ 'CHOICE' ,
+ 'SET' ,
+ 'SET OF']).
+
+def_to_tag(#tag{class=Class,number=Number}) ->
+ {Class,Number};
+def_to_tag(#'ObjectClassFieldType'{type=Type}) ->
+ case Type of
+ T when tuple(T),element(1,T)==fixedtypevaluefield ->
+ {'UNIVERSAL',get_inner(Type)};
+ _ ->
+ []
+ end;
+def_to_tag(Def) ->
+ {'UNIVERSAL',get_inner(Def)}.
+
+
+%% Information Object Class
+
+type_from_object(X) ->
+ case (catch lists:last(element(2,X))) of
+ {'EXIT',_} ->
+ {notype,X};
+ Normal ->
+ Normal
+ end.
+
+
+get_fieldtype([],_FieldName)->
+ {no_type,no_name};
+get_fieldtype([Field|Rest],FieldName) ->
+ case element(2,Field) of
+ FieldName ->
+ case element(1,Field) of
+ fixedtypevaluefield ->
+ {element(1,Field),FieldName,element(3,Field)};
+ _ ->
+ {element(1,Field),FieldName}
+ end;
+ _ ->
+ get_fieldtype(Rest,FieldName)
+ end.
+
+get_fieldcategory([],_FieldName) ->
+ no_cat;
+get_fieldcategory([Field|Rest],FieldName) ->
+ case element(2,Field) of
+ FieldName ->
+ element(1,Field);
+ _ ->
+ get_fieldcategory(Rest,FieldName)
+ end.
+
+get_typefromobject(Type) when record(Type,type) ->
+ case Type#type.def of
+ {{objectclass,_,_},TypeFrObj} when list(TypeFrObj) ->
+ {_,FieldName} = lists:last(TypeFrObj),
+ FieldName;
+ _ ->
+ {no_field}
+ end.
+
+get_classfieldcategory(Type,FieldName) ->
+ case (catch Type#type.def) of
+ {{obejctclass,Fields,_},_} ->
+ get_fieldcategory(Fields,FieldName);
+ {'EXIT',_} ->
+ no_cat;
+ _ ->
+ no_cat
+ end.
+%% Information Object Class
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Convert a list of name parts to something that can be output by emit
+%%
+%% used to output function names in generated code.
+
+list2name(L) ->
+ NewL = list2name1(L),
+ lists:concat(lists:reverse(NewL)).
+
+list2name1([{ptype,H1},H2|T]) ->
+ [H1,"_",list2name([H2|T])];
+list2name1([H1,H2|T]) ->
+ [H1,"_",list2name([H2|T])];
+list2name1([{ptype,H}|_T]) ->
+ [H];
+list2name1([H|_T]) ->
+ [H];
+list2name1([]) ->
+ [].
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Convert a list of name parts to something that can be output by emit
+%% stops at {ptype,Pname} i.e Pname whill be the first part of the name
+%% used to output record names in generated code.
+
+list2rname(L) ->
+ NewL = list2rname1(L),
+ lists:concat(lists:reverse(NewL)).
+
+list2rname1([{ptype,H1},_H2|_T]) ->
+ [H1];
+list2rname1([H1,H2|T]) ->
+ [H1,"_",list2name([H2|T])];
+list2rname1([{ptype,H}|_T]) ->
+ [H];
+list2rname1([H|_T]) ->
+ [H];
+list2rname1([]) ->
+ [].
+
+
+
+constructed_suffix(_,#'SEQUENCE'{pname=Ptypename}) when Ptypename =/= false ->
+ {ptype, Ptypename};
+constructed_suffix(_,#'SET'{pname=Ptypename}) when Ptypename =/= false ->
+ {ptype,Ptypename};
+constructed_suffix('SEQUENCE OF',_) ->
+ 'SEQOF';
+constructed_suffix('SET OF',_) ->
+ 'SETOF'.
+
+erule(ber) ->
+ ber;
+erule(ber_bin) ->
+ ber;
+erule(ber_bin_v2) ->
+ ber_bin_v2;
+erule(per) ->
+ per;
+erule(per_bin) ->
+ per.
+
+wrap_ber(ber) ->
+ ber_bin;
+wrap_ber(Erule) ->
+ Erule.
+
+rt2ct_suffix() ->
+ Options = get(encoding_options),
+ case {lists:member(optimize,Options),lists:member(per_bin,Options)} of
+ {true,true} -> "_rt2ct";
+ _ -> ""
+ end.
+rt2ct_suffix(per_bin) ->
+ Options = get(encoding_options),
+ case lists:member(optimize,Options) of
+ true -> "_rt2ct";
+ _ -> ""
+ end;
+rt2ct_suffix(_) -> "".
+
+get_constraint(C,Key) ->
+ case lists:keysearch(Key,1,C) of
+ false ->
+ no;
+ {value,{_,V}} ->
+ V;
+ {value,Cnstr} ->
+ Cnstr
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_gen_ber.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_gen_ber.erl
new file mode 100644
index 0000000000..765745dc13
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_gen_ber.erl
@@ -0,0 +1,1525 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1ct_gen_ber.erl,v 1.1 2008/12/17 09:53:29 mikpe Exp $
+%%
+-module(asn1ct_gen_ber).
+
+%% Generate erlang module which handles (PER) encode and decode for
+%% all types in an ASN.1 module
+
+-include("asn1_records.hrl").
+
+-export([pgen/4]).
+-export([decode_class/1, decode_type/1]).
+-export([add_removed_bytes/0]).
+-export([gen_encode/2,gen_encode/3,gen_decode/2,gen_decode/3]).
+-export([gen_encode_prim/4]).
+-export([gen_dec_prim/8]).
+-export([gen_objectset_code/2, gen_obj_code/3]).
+-export([re_wrap_erule/1]).
+-export([unused_var/2]).
+
+-import(asn1ct_gen, [emit/1,demit/1]).
+
+ % the encoding of class of tag bits 8 and 7
+-define(UNIVERSAL, 0).
+-define(APPLICATION, 16#40).
+-define(CONTEXT, 16#80).
+-define(PRIVATE, 16#C0).
+
+ % primitive or constructed encoding % bit 6
+-define(PRIMITIVE, 0).
+-define(CONSTRUCTED, 2#00100000).
+
+
+-define(T_ObjectDescriptor, ?UNIVERSAL bor ?PRIMITIVE bor 7).
+ % restricted character string types
+-define(T_NumericString, ?UNIVERSAL bor ?PRIMITIVE bor 18). %can be constructed
+-define(T_PrintableString, ?UNIVERSAL bor ?PRIMITIVE bor 19). %can be constructed
+-define(T_TeletexString, ?UNIVERSAL bor ?PRIMITIVE bor 20). %can be constructed
+-define(T_VideotexString, ?UNIVERSAL bor ?PRIMITIVE bor 21). %can be constructed
+-define(T_IA5String, ?UNIVERSAL bor ?PRIMITIVE bor 22). %can be constructed
+-define(T_GraphicString, ?UNIVERSAL bor ?PRIMITIVE bor 25). %can be constructed
+-define(T_VisibleString, ?UNIVERSAL bor ?PRIMITIVE bor 26). %can be constructed
+-define(T_GeneralString, ?UNIVERSAL bor ?PRIMITIVE bor 27). %can be constructed
+
+%% pgen(Erules, Module, TypeOrVal)
+%% Generate Erlang module (.erl) and (.hrl) file corresponding to an ASN.1 module
+%% .hrl file is only generated if necessary
+%% Erules = per | ber
+%% Module = atom()
+%% TypeOrVal = {TypeList,ValueList,PTypeList}
+%% TypeList = ValueList = [atom()]
+
+pgen(OutFile,Erules,Module,TypeOrVal) ->
+ asn1ct_gen:pgen_module(OutFile,Erules,Module,TypeOrVal,true).
+
+
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+%% Generate ENCODING
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+
+%%===============================================================================
+%% encode #{typedef, {pos, name, typespec}}
+%%===============================================================================
+
+gen_encode(Erules,Type) when record(Type,typedef) ->
+ gen_encode_user(Erules,Type).
+
+%%===============================================================================
+%% encode #{type, {tag, def, constraint}}
+%%===============================================================================
+
+gen_encode(Erules,Typename,Type) when record(Type,type) ->
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ ObjFun =
+ case lists:keysearch(objfun,1,Type#type.tablecinf) of
+ {value,{_,_Name}} ->
+ ", ObjFun";
+ false ->
+ ""
+ end,
+ case asn1ct_gen:type(InnerType) of
+ {constructed,bif} ->
+ emit([nl,nl,nl,"%%================================"]),
+ emit([nl,"%% ",asn1ct_gen:list2name(Typename)]),
+ emit([nl,"%%================================",nl]),
+ case lists:member(InnerType,['SET','SEQUENCE']) of
+ true ->
+ case get(asn_keyed_list) of
+ true ->
+ CompList =
+ case Type#type.def of
+ #'SEQUENCE'{components=Cl} -> Cl;
+ #'SET'{components=Cl} -> Cl
+ end,
+ emit([nl,"'enc_",asn1ct_gen:list2name(Typename),
+ "'(Val, TagIn",ObjFun,
+ ") when list(Val) ->",nl]),
+ emit([" 'enc_",asn1ct_gen:list2name(Typename),
+ "'(?RT_BER:fixoptionals(",
+ {asis,optionals(CompList)},
+ ",Val), TagIn",ObjFun,");",nl,nl]);
+ _ -> true
+ end;
+ _ ->
+ emit([nl,"'enc_",asn1ct_gen:list2name(Typename),
+ "'({'",asn1ct_gen:list2name(Typename),
+ "',Val}, TagIn",ObjFun,") ->",nl]),
+ emit([" 'enc_",asn1ct_gen:list2name(Typename),
+ "'(Val, TagIn",ObjFun,");",nl,nl])
+ end,
+ emit(["'enc_",asn1ct_gen:list2name(Typename),
+ "'(Val, TagIn",ObjFun,") ->",nl," "]),
+ asn1ct_gen:gen_encode_constructed(Erules,Typename,InnerType,Type);
+ _ ->
+ true
+ end;
+
+%%===============================================================================
+%% encode ComponentType
+%%===============================================================================
+
+gen_encode(Erules,Tname,{'ComponentType',_Pos,Cname,Type,_,_}) ->
+ NewTname = [Cname|Tname],
+ %% The tag is set to [] to avoid that it is
+ %% taken into account twice, both as a component/alternative (passed as
+ %% argument to the encode decode function and within the encode decode
+ %% function it self.
+ NewType = Type#type{tag=[]},
+ gen_encode(Erules,NewTname,NewType).
+
+gen_encode_user(Erules,D) when record(D,typedef) ->
+ Typename = [D#typedef.name],
+ Type = D#typedef.typespec,
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ OTag = Type#type.tag,
+ Tag = [X#tag{class=decode_class(X#tag.class)}|| X <- OTag],
+ emit([nl,nl,"%%================================"]),
+ emit([nl,"%% ",Typename]),
+ emit([nl,"%%================================",nl]),
+ case lists:member(InnerType,['SET','SEQUENCE']) of
+ true ->
+ case get(asn_keyed_list) of
+ true ->
+ CompList =
+ case Type#type.def of
+ #'SEQUENCE'{components=Cl} -> Cl;
+ #'SET'{components=Cl} -> Cl
+ end,
+
+ emit([nl,"'enc_",asn1ct_gen:list2name(Typename),
+ "'(Val, TagIn) when list(Val) ->",nl]),
+ emit([" 'enc_",asn1ct_gen:list2name(Typename),
+ "'(?RT_BER:fixoptionals(",
+ {asis,optionals(CompList)},
+ ",Val), TagIn);",nl,nl]);
+ _ -> true
+ end;
+ _ ->
+ emit({nl,"'enc_",asn1ct_gen:list2name(Typename),
+ "'({'",asn1ct_gen:list2name(Typename),"',Val}, TagIn) ->",nl}),
+ emit({" 'enc_",asn1ct_gen:list2name(Typename),"'(Val, TagIn);",nl,nl})
+ end,
+ emit({"'enc_",asn1ct_gen:list2name(Typename),"'(",
+ unused_var("Val",Type#type.def),", TagIn) ->",nl}),
+ CurrentMod = get(currmod),
+ case asn1ct_gen:type(InnerType) of
+ {constructed,bif} ->
+ asn1ct_gen:gen_encode_constructed(Erules,Typename,InnerType,D);
+ {primitive,bif} ->
+ asn1ct_gen_ber:gen_encode_prim(ber,Type,["TagIn ++ ",
+ {asis,Tag}],"Val"),
+ emit([".",nl]);
+ #typereference{val=Ename} ->
+ emit([" 'enc_",Ename,"'(Val, TagIn ++ ",{asis,Tag},").",nl]);
+ #'Externaltypereference'{module=CurrentMod,type=Etype} ->
+ emit([" 'enc_",Etype,"'(Val, TagIn ++ ",
+ {asis,Tag},").",nl]);
+ #'Externaltypereference'{module=Emod,type=Etype} ->
+ emit([" '",Emod,"':'enc_",Etype,"'(Val, TagIn ++ ",
+ {asis,Tag},").",nl]);
+ 'ASN1_OPEN_TYPE' ->
+ emit(["%% OPEN TYPE",nl]),
+ asn1ct_gen_ber:gen_encode_prim(ber,
+ Type#type{def='ASN1_OPEN_TYPE'},
+ ["TagIn ++ ",
+ {asis,Tag}],"Val"),
+ emit([".",nl])
+ end.
+
+unused_var(Var,#'SEQUENCE'{components=Cl}) ->
+ unused_var1(Var,Cl);
+unused_var(Var,#'SET'{components=Cl}) ->
+ unused_var1(Var,Cl);
+unused_var(Var,_) ->
+ Var.
+unused_var1(Var,Cs) when Cs == []; Cs == {[],[]} ->
+ lists:concat(["_",Var]);
+unused_var1(Var,_) ->
+ Var.
+
+unused_optormand_var(Var,Def) ->
+ case asn1ct_gen:type(asn1ct_gen:get_inner(Def)) of
+ 'ASN1_OPEN_TYPE' ->
+ lists:concat(["_",Var]);
+ _ ->
+ Var
+ end.
+
+
+gen_encode_prim(_Erules,D,DoTag,Value) when record(D,type) ->
+
+%%% Currently not used for BER (except for BitString) and therefore replaced
+%%% with [] as a placeholder
+ BitStringConstraint = D#type.constraint,
+ Constraint = [],
+ asn1ct_name:new(enumval),
+ case D#type.def of
+ 'BOOLEAN' ->
+ emit_encode_func('boolean',Value,DoTag);
+ 'INTEGER' ->
+ emit_encode_func('integer',Constraint,Value,DoTag);
+ {'INTEGER',NamedNumberList} ->
+ emit_encode_func('integer',Constraint,Value,
+ NamedNumberList,DoTag);
+ {'ENUMERATED',NamedNumberList={_,_}} ->
+
+ emit(["case (case ",Value," of {asn1_enum,_}->",Value,";{_,_}->element(2,",Value,");_->",
+ Value," end) of",nl]),
+ emit_enc_enumerated_cases(NamedNumberList,DoTag);
+ {'ENUMERATED',NamedNumberList} ->
+
+ emit(["case (case ",Value," of {_,_}->element(2,",Value,");_->",
+ Value," end) of",nl]),
+ emit_enc_enumerated_cases(NamedNumberList,DoTag);
+
+ {'BIT STRING',NamedNumberList} ->
+ emit_encode_func('bit_string',BitStringConstraint,Value,
+ NamedNumberList,DoTag);
+ 'ANY' ->
+ emit_encode_func('open_type', Value,DoTag);
+ 'NULL' ->
+ emit_encode_func('null',Value,DoTag);
+ 'OBJECT IDENTIFIER' ->
+ emit_encode_func("object_identifier",Value,DoTag);
+ 'ObjectDescriptor' ->
+ emit_encode_func('restricted_string',Constraint,Value,
+ ?T_ObjectDescriptor,DoTag);
+ 'OCTET STRING' ->
+ emit_encode_func('octet_string',Constraint,Value,DoTag);
+ 'NumericString' ->
+ emit_encode_func('restricted_string',Constraint,Value,
+ ?T_NumericString,DoTag);
+ 'TeletexString' ->
+ emit_encode_func('restricted_string',Constraint,Value,
+ ?T_TeletexString,DoTag);
+ 'VideotexString' ->
+ emit_encode_func('restricted_string',Constraint,Value,
+ ?T_VideotexString,DoTag);
+ 'GraphicString' ->
+ emit_encode_func('restricted_string',Constraint,Value,
+ ?T_GraphicString,DoTag);
+ 'VisibleString' ->
+ emit_encode_func('restricted_string',Constraint,Value,
+ ?T_VisibleString,DoTag);
+ 'GeneralString' ->
+ emit_encode_func('restricted_string',Constraint,Value,
+ ?T_GeneralString,DoTag);
+ 'PrintableString' ->
+ emit_encode_func('restricted_string',Constraint,Value,
+ ?T_PrintableString,DoTag);
+ 'IA5String' ->
+ emit_encode_func('restricted_string',Constraint,Value,
+ ?T_IA5String,DoTag);
+ 'UniversalString' ->
+ emit_encode_func('universal_string',Constraint,Value,DoTag);
+ 'BMPString' ->
+ emit_encode_func('BMP_string',Constraint,Value,DoTag);
+ 'UTCTime' ->
+ emit_encode_func('utc_time',Constraint,Value,DoTag);
+ 'GeneralizedTime' ->
+ emit_encode_func('generalized_time',Constraint,Value,DoTag);
+ 'ASN1_OPEN_TYPE' ->
+ emit_encode_func('open_type', Value,DoTag);
+ XX ->
+ exit({'can not encode' ,XX})
+ end.
+
+
+emit_encode_func(Name,Value,Tags) when atom(Name) ->
+ emit_encode_func(atom_to_list(Name),Value,Tags);
+emit_encode_func(Name,Value,Tags) ->
+ Fname = "?RT_BER:encode_" ++ Name,
+ emit([Fname,"(",Value,", ",Tags,")"]).
+
+emit_encode_func(Name,Constraint,Value,Tags) when atom(Name) ->
+ emit_encode_func(atom_to_list(Name),Constraint,Value,Tags);
+emit_encode_func(Name,Constraint,Value,Tags) ->
+ Fname = "?RT_BER:encode_" ++ Name,
+ emit([Fname,"(",{asis,Constraint},", ",Value,", ",Tags,")"]).
+
+emit_encode_func(Name,Constraint,Value,Asis,Tags) when atom(Name) ->
+ emit_encode_func(atom_to_list(Name),Constraint,Value,Asis,Tags);
+emit_encode_func(Name,Constraint,Value,Asis,Tags) ->
+ Fname = "?RT_BER:encode_" ++ Name,
+ emit([Fname,"(",{asis,Constraint},", ",Value,
+ ", ",{asis,Asis},
+ ", ",Tags,")"]).
+
+emit_enc_enumerated_cases({L1,L2}, Tags) ->
+ emit_enc_enumerated_cases(L1++L2, Tags, ext);
+emit_enc_enumerated_cases(L, Tags) ->
+ emit_enc_enumerated_cases(L, Tags, noext).
+
+emit_enc_enumerated_cases([{EnumName,EnumVal},H2|T], Tags, Ext) ->
+ emit([{asis,EnumName}," -> ?RT_BER:encode_enumerated(",EnumVal,",",Tags,");",nl]),
+%% emit(["'",{asis,EnumName},"' -> ?RT_BER:encode_enumerated(",EnumVal,",",Tags,");",nl]),
+ emit_enc_enumerated_cases([H2|T], Tags, Ext);
+emit_enc_enumerated_cases([{EnumName,EnumVal}], Tags, Ext) ->
+ emit([{asis,EnumName}," -> ?RT_BER:encode_enumerated(",EnumVal,",",Tags,")"]),
+%% emit(["'",{asis,EnumName},"' -> ?RT_BER:encode_enumerated(",EnumVal,",",Tags,")"]),
+ case Ext of
+ noext -> emit([";",nl]);
+ ext ->
+ emit([";",nl,"{asn1_enum,",{curr,enumval},"} -> ",
+ "?RT_BER:encode_enumerated(",{curr,enumval},",",Tags,");",nl]),
+ asn1ct_name:new(enumval)
+ end,
+ emit([{curr,enumval}," -> exit({error,{asn1, {enumerated_not_in_range,",{curr, enumval},"}}})"]),
+ emit([nl,"end"]).
+
+
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+%% Generate DECODING
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+
+%%===============================================================================
+%% decode #{typedef, {pos, name, typespec}}
+%%===============================================================================
+
+gen_decode(Erules,Type) when record(Type,typedef) ->
+ D = Type,
+ emit({nl,nl}),
+ emit({"'dec_",Type#typedef.name,"'(Bytes, OptOrMand) ->",nl}),
+ emit({" 'dec_",Type#typedef.name,"'(Bytes, OptOrMand, []).",nl,nl}),
+ emit({"'dec_",Type#typedef.name,"'(Bytes, ",
+ unused_optormand_var("OptOrMand",(Type#typedef.typespec)#type.def),", TagIn) ->",nl}),
+ dbdec(Type#typedef.name),
+ gen_decode_user(Erules,D).
+
+
+%%===============================================================================
+%% decode #{type, {tag, def, constraint}}
+%%===============================================================================
+
+gen_decode(Erules,Tname,Type) when record(Type,type) ->
+ Typename = Tname,
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ case asn1ct_gen:type(InnerType) of
+ {constructed,bif} ->
+ ObjFun =
+ case Type#type.tablecinf of
+ [{objfun,_}|_R] ->
+ ", ObjFun";
+ _ ->
+ ""
+ end,
+ emit({"'dec_",asn1ct_gen:list2name(Typename),"'(Bytes, OptOrMand, TagIn",ObjFun,") ->",nl}),
+ dbdec(Typename),
+ asn1ct_gen:gen_decode_constructed(Erules,Typename,InnerType,Type);
+ _ ->
+ true
+ end;
+
+
+%%===============================================================================
+%% decode ComponentType
+%%===============================================================================
+
+gen_decode(Erules,Tname,{'ComponentType',_Pos,Cname,Type,_,_}) ->
+ NewTname = [Cname|Tname],
+ %% The tag is set to [] to avoid that it is
+ %% taken into account twice, both as a component/alternative (passed as
+ %% argument to the encode decode function and within the encode decode
+ %% function it self.
+ NewType = Type#type{tag=[]},
+ gen_decode(Erules,NewTname,NewType).
+
+
+gen_decode_user(Erules,D) when record(D,typedef) ->
+ Typename = [D#typedef.name],
+ Def = D#typedef.typespec,
+ InnerType = asn1ct_gen:get_inner(Def#type.def),
+ InnerTag = Def#type.tag ,
+ Tag = [X#tag{class=decode_class(X#tag.class)}|| X <- InnerTag],
+ case asn1ct_gen:type(InnerType) of
+ 'ASN1_OPEN_TYPE' ->
+ BytesVar = asn1ct_gen:mk_var(asn1ct_name:curr(bytes)),
+ asn1ct_name:new(len),
+ gen_dec_prim(Erules, Def#type{def='ASN1_OPEN_TYPE'},
+ BytesVar, Tag, "TagIn",no_length,
+ ?PRIMITIVE,"OptOrMand"),
+ emit({".",nl,nl});
+ {primitive,bif} ->
+ BytesVar = asn1ct_gen:mk_var(asn1ct_name:curr(bytes)),
+ asn1ct_name:new(len),
+ gen_dec_prim(Erules, Def, BytesVar, Tag, "TagIn",no_length,
+ ?PRIMITIVE,"OptOrMand"),
+ emit({".",nl,nl});
+ {constructed,bif} ->
+ asn1ct_gen:gen_decode_constructed(Erules,Typename,InnerType,D);
+ TheType ->
+ DecFunName = mkfuncname(TheType,dec),
+ emit({DecFunName,"(",{curr,bytes},
+ ", OptOrMand, TagIn++",{asis,Tag},")"}),
+ emit({".",nl,nl})
+ end.
+
+
+gen_dec_prim(Erules,Att,BytesVar,DoTag,TagIn,Length,_Form,OptOrMand) ->
+ Typename = Att#type.def,
+%% Currently not used for BER replaced with [] as place holder
+%% Constraint = Att#type.constraint,
+%% Constraint = [],
+ Constraint =
+ case get_constraint(Att#type.constraint,'SizeConstraint') of
+ no -> [];
+ Tc -> Tc
+ end,
+ ValueRange =
+ case get_constraint(Att#type.constraint,'ValueRange') of
+ no -> [];
+ Tv -> Tv
+ end,
+ SingleValue =
+ case get_constraint(Att#type.constraint,'SingleValue') of
+ no -> [];
+ Sv -> Sv
+ end,
+ AsBin = case get(binary_strings) of
+ true -> "_as_bin";
+ _ -> ""
+ end,
+ NewTypeName = case Typename of
+ 'ANY' -> 'ASN1_OPEN_TYPE';
+ _ -> Typename
+ end,
+ DoLength =
+ case NewTypeName of
+ 'BOOLEAN'->
+ emit({"?RT_BER:decode_boolean(",BytesVar,","}),
+ false;
+ 'INTEGER' ->
+ emit({"?RT_BER:decode_integer(",BytesVar,",",
+ {asis,int_constr(SingleValue,ValueRange)},","}),
+ false;
+ {'INTEGER',NamedNumberList} ->
+ emit({"?RT_BER:decode_integer(",BytesVar,",",
+ {asis,int_constr(SingleValue,ValueRange)},",",
+ {asis,NamedNumberList},","}),
+ false;
+ {'ENUMERATED',NamedNumberList} ->
+ emit({"?RT_BER:decode_enumerated(",BytesVar,",",
+ {asis,Constraint},",",
+ {asis,NamedNumberList},","}),
+ false;
+ {'BIT STRING',NamedNumberList} ->
+ case get(compact_bit_string) of
+ true ->
+ emit({"?RT_BER:decode_compact_bit_string(",
+ BytesVar,",",{asis,Constraint},",",
+ {asis,NamedNumberList},","});
+ _ ->
+ emit({"?RT_BER:decode_bit_string(",BytesVar,",",
+ {asis,Constraint},",",
+ {asis,NamedNumberList},","})
+ end,
+ true;
+ 'NULL' ->
+ emit({"?RT_BER:decode_null(",BytesVar,","}),
+ false;
+ 'OBJECT IDENTIFIER' ->
+ emit({"?RT_BER:decode_object_identifier(",BytesVar,","}),
+ false;
+ 'ObjectDescriptor' ->
+ emit({"?RT_BER:decode_restricted_string(",
+ BytesVar,",",{asis,Constraint},",",{asis,?T_ObjectDescriptor},","}),
+ true;
+ 'OCTET STRING' ->
+ emit({"?RT_BER:decode_octet_string",AsBin,"(",BytesVar,",",{asis,Constraint},","}),
+ true;
+ 'NumericString' ->
+ emit({"?RT_BER:decode_restricted_string",AsBin,"(",
+ BytesVar,",",{asis,Constraint},",",{asis,?T_NumericString},","}),true;
+ 'TeletexString' ->
+ emit({"?RT_BER:decode_restricted_string",AsBin,"(",
+ BytesVar,",",{asis,Constraint},",",{asis,?T_TeletexString},","}),
+ true;
+ 'VideotexString' ->
+ emit({"?RT_BER:decode_restricted_string",AsBin,"(",
+ BytesVar,",",{asis,Constraint},",",{asis,?T_VideotexString},","}),
+ true;
+ 'GraphicString' ->
+ emit({"?RT_BER:decode_restricted_string",AsBin,"(",
+ BytesVar,",",{asis,Constraint},",",{asis,?T_GraphicString},","})
+ ,true;
+ 'VisibleString' ->
+ emit({"?RT_BER:decode_restricted_string",AsBin,"(",
+ BytesVar,",",{asis,Constraint},",",{asis,?T_VisibleString},","}),
+ true;
+ 'GeneralString' ->
+ emit({"?RT_BER:decode_restricted_string",AsBin,"(",
+ BytesVar,",",{asis,Constraint},",",{asis,?T_GeneralString},","}),
+ true;
+ 'PrintableString' ->
+ emit({"?RT_BER:decode_restricted_string",AsBin,"(",
+ BytesVar,",",{asis,Constraint},",",{asis,?T_PrintableString},","}),
+ true;
+ 'IA5String' ->
+ emit({"?RT_BER:decode_restricted_string",AsBin,"(",
+ BytesVar,",",{asis,Constraint},",",{asis,?T_IA5String},","}),
+ true;
+ 'UniversalString' ->
+ emit({"?RT_BER:decode_universal_string",AsBin,"(",
+ BytesVar,",",{asis,Constraint},","}),
+ true;
+ 'BMPString' ->
+ emit({"?RT_BER:decode_BMP_string",AsBin,"(",
+ BytesVar,",",{asis,Constraint},","}),
+ true;
+ 'UTCTime' ->
+ emit({"?RT_BER:decode_utc_time",AsBin,"(",
+ BytesVar,",",{asis,Constraint},","}),
+ true;
+ 'GeneralizedTime' ->
+ emit({"?RT_BER:decode_generalized_time",AsBin,"(",
+ BytesVar,",",{asis,Constraint},","}),
+ true;
+ 'ASN1_OPEN_TYPE' ->
+ emit(["?RT_BER:decode_open_type(",re_wrap_erule(Erules),",",
+ BytesVar,","]),
+ false;
+ Other ->
+ exit({'can not decode' ,Other})
+ end,
+
+ NewLength = case DoLength of
+ true -> [", ", Length];
+ false -> ""
+ end,
+ NewOptOrMand = case OptOrMand of
+ _ when list(OptOrMand) -> OptOrMand;
+ mandatory -> {asis,mandatory};
+ _ -> {asis,opt_or_default}
+ end,
+ case {TagIn,NewTypeName} of
+ {[],'ASN1_OPEN_TYPE'} ->
+ emit([{asis,DoTag},")"]);
+ {_,'ASN1_OPEN_TYPE'} ->
+ emit([TagIn,"++",{asis,DoTag},")"]);
+ {[],_} ->
+ emit([{asis,DoTag},NewLength,", ",NewOptOrMand,")"]);
+ _ when list(TagIn) ->
+ emit([TagIn,"++",{asis,DoTag},NewLength,", ",NewOptOrMand,")"])
+ end.
+
+
+int_constr([],[]) ->
+ [];
+int_constr([],ValueRange) ->
+ ValueRange;
+int_constr(SingleValue,[]) ->
+ SingleValue;
+int_constr(SV,VR) ->
+ [SV,VR].
+
+%% Object code generating for encoding and decoding
+%% ------------------------------------------------
+
+gen_obj_code(Erules,_Module,Obj) when record(Obj,typedef) ->
+ ObjName = Obj#typedef.name,
+ Def = Obj#typedef.typespec,
+ #'Externaltypereference'{module=M,type=ClName} = Def#'Object'.classname,
+ Class = asn1_db:dbget(M,ClName),
+
+ {object,_,Fields} = Def#'Object'.def,
+ emit({nl,nl,nl,"%%================================"}),
+ emit({nl,"%% ",ObjName}),
+ emit({nl,"%%================================",nl}),
+ EncConstructed =
+ gen_encode_objectfields(ClName,get_class_fields(Class),
+ ObjName,Fields,[]),
+ emit(nl),
+ gen_encode_constr_type(Erules,EncConstructed),
+ emit(nl),
+ DecConstructed =
+ gen_decode_objectfields(ClName,get_class_fields(Class),
+ ObjName,Fields,[]),
+ emit(nl),
+ gen_decode_constr_type(Erules,DecConstructed);
+gen_obj_code(_Erules,_Module,Obj) when record(Obj,pobjectdef) ->
+ ok.
+
+
+gen_encode_objectfields(ClassName,[{typefield,Name,OptOrMand}|Rest],
+ ObjName,ObjectFields,ConstrAcc) ->
+ EmitFuncClause =
+ fun(Args) ->
+ emit(["'enc_",ObjName,"'(",{asis,Name},
+ ", ",Args,", _RestPrimFieldName) ->",nl])
+ end,
+% emit(["'enc_",ObjName,"'(",{asis,Name},
+% ", Val, TagIn, _RestPrimFieldName) ->",nl]),
+ MaybeConstr=
+ case {get_object_field(Name,ObjectFields),OptOrMand} of
+ {false,'MANDATORY'} -> %% this case is illegal
+ exit({error,{asn1,{"missing mandatory field in object",
+ ObjName}}});
+ {false,'OPTIONAL'} ->
+ EmitFuncClause("_, _"),
+ emit([" {[],0}"]),
+ [];
+ {false,{'DEFAULT',DefaultType}} ->
+ EmitFuncClause("Val, TagIn"),
+ gen_encode_default_call(ClassName,Name,DefaultType);
+ {{Name,TypeSpec},_} ->
+ %% A specified field owerwrites any 'DEFAULT' or
+ %% 'OPTIONAL' field in the class
+ EmitFuncClause("Val, TagIn"),
+ gen_encode_field_call(ObjName,Name,TypeSpec)
+ end,
+ case more_genfields(Rest) of
+ true ->
+ emit([";",nl]);
+ false ->
+ emit([".",nl])
+ end,
+ gen_encode_objectfields(ClassName,Rest,ObjName,ObjectFields,
+ MaybeConstr++ConstrAcc);
+gen_encode_objectfields(ClassName,[{objectfield,Name,_,_,OptOrMand}|Rest],
+ ObjName,ObjectFields,ConstrAcc) ->
+ EmitFuncClause =
+ fun(Args) ->
+ emit(["'enc_",ObjName,"'(",{asis,Name},
+ ", ",Args,") ->",nl])
+ end,
+% emit(["'enc_",ObjName,"'(",{asis,Name},
+% ", Val, TagIn, [H|T]) ->",nl]),
+ case {get_object_field(Name,ObjectFields),OptOrMand} of
+ {false,'MANDATORY'} ->
+ exit({error,{asn1,{"missing mandatory field in object",
+ ObjName}}});
+ {false,'OPTIONAL'} ->
+ EmitFuncClause("_,_,_"),
+ emit([" exit({error,{'use of missing field in object', ",Name,
+ "}})"]);
+ {false,{'DEFAULT',_DefaultObject}} ->
+ exit({error,{asn1,{"not implemented yet",Name}}});
+ {{Name,TypeSpec},_} ->
+ EmitFuncClause(" Val, TagIn, [H|T]"),
+ case TypeSpec#typedef.name of
+ {ExtMod,TypeName} ->
+ emit({indent(3),"'",ExtMod,"':'enc_",TypeName,
+ "'(H, Val, TagIn, T)"});
+ TypeName ->
+ emit({indent(3),"'enc_",TypeName,"'(H, Val, TagIn, T)"})
+ end
+ end,
+ case more_genfields(Rest) of
+ true ->
+ emit([";",nl]);
+ false ->
+ emit([".",nl])
+ end,
+ gen_encode_objectfields(ClassName,Rest,ObjName,ObjectFields,ConstrAcc);
+gen_encode_objectfields(ClassName,[_|Cs],O,OF,Acc) ->
+ gen_encode_objectfields(ClassName,Cs,O,OF,Acc);
+gen_encode_objectfields(_,[],_,_,Acc) ->
+ Acc.
+
+
+% gen_encode_objectfields(Class,ObjName,[{FieldName,Type}|Rest],ConstrAcc) ->
+% Fields = Class#objectclass.fields,
+% MaybeConstr=
+% case is_typefield(Fields,FieldName) of
+% true ->
+% Def = Type#typedef.typespec,
+% OTag = Def#type.tag,
+% Tag = [X#tag{class=decode_class(X#tag.class)}|| X <- OTag],
+% emit({"'enc_",ObjName,"'(",{asis,FieldName},
+% ", Val, TagIn, RestPrimFieldName) ->",nl}),
+% CAcc=
+% case Type#typedef.name of
+% {primitive,bif} ->
+% gen_encode_prim(ber,Def,["TagIn ++ ",{asis,Tag}],
+% "Val"),
+% [];
+% {constructed,bif} ->
+% %%InnerType = asn1ct_gen:get_inner(Def#type.def),
+% %%asn1ct_gen:gen_encode_constructed(ber,[ObjName],
+% %% InnerType,Def);
+% emit({" 'enc_",ObjName,'_',FieldName,
+% "'(Val, TagIn ++ ",{asis,Tag},")"}),
+% [{['enc_',ObjName,'_',FieldName],Def}];
+% {ExtMod,TypeName} ->
+% emit({" '",ExtMod,"':'enc_",TypeName,
+% "'(Val, TagIn ++ ",{asis,Tag},")"}),
+% [];
+% TypeName ->
+% emit({" 'enc_",TypeName,"'(Val, TagIn ++ ",
+% {asis,Tag},")"}),
+% []
+% end,
+% case more_genfields(Fields,Rest) of
+% true ->
+% emit({";",nl});
+% false ->
+% emit({".",nl})
+% end,
+% CAcc;
+% {false,objectfield} ->
+% emit({"'enc_",ObjName,"'(",{asis,FieldName},
+% ", Val, TagIn, [H|T]) ->",nl}),
+% case Type#typedef.name of
+% {ExtMod,TypeName} ->
+% emit({indent(3),"'",ExtMod,"':'enc_",TypeName,
+% "'(H, Val, TagIn, T)"});
+% TypeName ->
+% emit({indent(3),"'enc_",TypeName,"'(H, Val, TagIn, T)"})
+% end,
+% case more_genfields(Fields,Rest) of
+% true ->
+% emit({";",nl});
+% false ->
+% emit({".",nl})
+% end,
+% [];
+% {false,_} -> []
+% end,
+% gen_encode_objectfields(Class,ObjName,Rest,MaybeConstr ++ ConstrAcc);
+% gen_encode_objectfields(C,O,[H|T],Acc) ->
+% gen_encode_objectfields(C,O,T,Acc);
+% gen_encode_objectfields(_,_,[],Acc) ->
+% Acc.
+
+% gen_encode_constr_type([{Name,Def}|Rest]) ->
+% emit({Name,"(Val,TagIn) ->",nl}),
+% InnerType = asn1ct_gen:get_inner(Def#type.def),
+% asn1ct_gen:gen_encode_constructed(ber,Name,InnerType,Def),
+% gen_encode_constr_type(Rest);
+gen_encode_constr_type(Erules,[TypeDef|Rest]) when record(TypeDef,typedef) ->
+ case is_already_generated(enc,TypeDef#typedef.name) of
+ true -> ok;
+ _ -> gen_encode_user(Erules,TypeDef)
+ end,
+ gen_encode_constr_type(Erules,Rest);
+gen_encode_constr_type(_,[]) ->
+ ok.
+
+gen_encode_field_call(ObjName,FieldName,Type) ->
+ Def = Type#typedef.typespec,
+ OTag = Def#type.tag,
+ Tag = [X#tag{class=decode_class(X#tag.class)}|| X <- OTag],
+ case Type#typedef.name of
+ {primitive,bif} -> %%tag should be the primitive tag
+ gen_encode_prim(ber,Def,["TagIn ++ ",{asis,Tag}],
+ "Val"),
+ [];
+ {constructed,bif} ->
+ emit({" 'enc_",ObjName,'_',FieldName,
+ "'(Val, TagIn ++",{asis,Tag},")"}),
+ [Type#typedef{name=list_to_atom(lists:concat([ObjName,'_',FieldName]))}];
+ {ExtMod,TypeName} ->
+ emit({" '",ExtMod,"':'enc_",TypeName,
+ "'(Val, TagIn ++ ",{asis,Tag},")"}),
+ [];
+ TypeName ->
+ emit({" 'enc_",TypeName,"'(Val, TagIn ++ ",{asis,Tag},")"}),
+ []
+ end.
+
+gen_encode_default_call(ClassName,FieldName,Type) ->
+ CurrentMod = get(currmod),
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ OTag = Type#type.tag,
+ Tag = [X#tag{class=decode_class(X#tag.class)}|| X <- OTag],
+ case asn1ct_gen:type(InnerType) of
+ {constructed,bif} ->
+%% asn1ct_gen:gen_encode_constructed(Erules,Typename,InnerType,Type);
+ emit([" 'enc_",ClassName,'_',FieldName,"'(Bytes, TagIn ++ ",
+ {asis,Tag},")"]),
+ [#typedef{name=list_to_atom(lists:concat([ClassName,'_',FieldName])),
+ typespec=Type}];
+ {primitive,bif} ->
+ gen_encode_prim(ber,Type,["TagIn ++ ",{asis,Tag}],"Val"),
+ [];
+ #'Externaltypereference'{module=CurrentMod,type=Etype} ->
+ emit([" 'enc_",Etype,"'(Val, TagIn ++ ",{asis,Tag},")",nl]),
+ [];
+ #'Externaltypereference'{module=Emod,type=Etype} ->
+ emit([" '",Emod,"':'enc_",Etype,"'(Val, TagIn ++ ",{asis,Tag},")",nl]),
+ []
+ end.
+
+
+
+gen_decode_objectfields(ClassName,[{typefield,Name,OptOrMand}|Rest],
+ ObjName,ObjectFields,ConstrAcc) ->
+ EmitFuncClause =
+ fun(Args) ->
+ emit(["'dec_",ObjName,"'(",{asis,Name},
+ ", ",Args,"_) ->",nl])
+ end,
+% emit(["'dec_",ObjName,"'(",{asis,Name},
+% ", Bytes, TagIn, RestPrimFieldName) ->",nl]),
+ MaybeConstr=
+ case {get_object_field(Name,ObjectFields),OptOrMand} of
+ {false,'MANDATORY'} -> %% this case is illegal
+ exit({error,{asn1,{"missing mandatory field in object",
+ ObjName}}});
+ {false,'OPTIONAL'} ->
+ EmitFuncClause("_, _,"),
+ emit([" asn1_NOVALUE"]),
+ [];
+ {false,{'DEFAULT',DefaultType}} ->
+ EmitFuncClause("Bytes, TagIn,"),
+ gen_decode_default_call(ClassName,Name,"Bytes",DefaultType);
+ {{Name,TypeSpec},_} ->
+ %% A specified field owerwrites any 'DEFAULT' or
+ %% 'OPTIONAL' field in the class
+ EmitFuncClause("Bytes, TagIn,"),
+ gen_decode_field_call(ObjName,Name,"Bytes",TypeSpec)
+ end,
+ case more_genfields(Rest) of
+ true ->
+ emit([";",nl]);
+ false ->
+ emit([".",nl])
+ end,
+ gen_decode_objectfields(ClassName,Rest,ObjName,ObjectFields,MaybeConstr++ConstrAcc);
+gen_decode_objectfields(ClassName,[{objectfield,Name,_,_,OptOrMand}|Rest],
+ ObjName,ObjectFields,ConstrAcc) ->
+ EmitFuncClause =
+ fun(Args) ->
+ emit(["'dec_",ObjName,"'(",{asis,Name},
+ ", ",Args,") ->",nl])
+ end,
+% emit(["'dec_",ObjName,"'(",{asis,Name},
+% ", Bytes,TagIn,[H|T]) ->",nl]),
+ case {get_object_field(Name,ObjectFields),OptOrMand} of
+ {false,'MANDATORY'} ->
+ exit({error,{asn1,{"missing mandatory field in object",
+ ObjName}}});
+ {false,'OPTIONAL'} ->
+ EmitFuncClause("_,_,_"),
+ emit([" exit({error,{'illegal use of missing field in object', ",Name,
+ "}})"]);
+ {false,{'DEFAULT',_DefaultObject}} ->
+ exit({error,{asn1,{"not implemented yet",Name}}});
+ {{Name,TypeSpec},_} ->
+ EmitFuncClause("Bytes,TagIn,[H|T]"),
+ case TypeSpec#typedef.name of
+ {ExtMod,TypeName} ->
+ emit({indent(3),"'",ExtMod,"':'dec_",TypeName,
+ "'(H, Bytes, TagIn, T)"});
+ TypeName ->
+ emit({indent(3),"'dec_",TypeName,"'(H, Bytes, TagIn, T)"})
+ end
+ end,
+ case more_genfields(Rest) of
+ true ->
+ emit([";",nl]);
+ false ->
+ emit([".",nl])
+ end,
+ gen_decode_objectfields(ClassName,Rest,ObjName,ObjectFields,ConstrAcc);
+gen_decode_objectfields(CN,[_|Cs],O,OF,CAcc) ->
+ gen_decode_objectfields(CN,Cs,O,OF,CAcc);
+gen_decode_objectfields(_,[],_,_,CAcc) ->
+ CAcc.
+
+
+
+% gen_decode_objectfields(Erules,Class,ObjName,[{FieldName,Type}|Rest],ConstrAcc) ->
+% Fields = Class#objectclass.fields,
+% MaybeConstr =
+% case is_typefield(Fields,FieldName) of
+% true ->
+% Def = Type#typedef.typespec,
+% emit({"'dec_",ObjName,"'(",{asis,FieldName},
+% ", Bytes, TagIn, RestPrimFieldName) ->",nl}),
+% OTag = Def#type.tag,
+% Tag = [X#tag{class=decode_class(X#tag.class)}|| X <- OTag],
+% Prop =
+% case get_optionalityspec(Fields,FieldName) of
+% 'OPTIONAL' -> opt_or_default;
+% {'DEFAULT',_} -> opt_or_default;
+% _ -> mandatory
+% end,
+% CAcc =
+% case Type#typedef.name of
+% {primitive,bif} ->
+% gen_dec_prim(Erules,Def,"Bytes",Tag,"TagIn",no_length,
+% ?PRIMITIVE,Prop),
+% [];
+% {constructed,bif} ->
+% emit({" 'dec_",ObjName,'_',FieldName,"'(Bytes,",
+% {asis,Prop},", TagIn ++ ",{asis,Tag},")"}),
+% [{['dec_',ObjName,'_',FieldName],Def}];
+% {ExtMod,TypeName} ->
+% emit({" '",ExtMod,"':'dec_",TypeName,"'(Bytes, ",
+% {asis,Prop},", TagIn ++ ",{asis,Tag},")"}),
+% [];
+% TypeName ->
+% emit({" 'dec_",TypeName,"'(Bytes, ",{asis,Prop},
+% ", TagIn ++ ",{asis,Tag},")"}),
+% []
+% end,
+% case more_genfields(Fields,Rest) of
+% true ->
+% emit({";",nl});
+% false ->
+% emit({".",nl})
+% end,
+% CAcc;
+% {false,objectfield} ->
+% emit({"'dec_",ObjName,"'(",{asis,FieldName},
+% ", Bytes, TagIn, [H|T]) ->",nl}),
+% case Type#typedef.name of
+% {ExtMod,TypeName} ->
+% emit({indent(3),"'",ExtMod,"':'dec_",TypeName,
+% "'(H, Bytes, TagIn, T)"});
+% TypeName ->
+% emit({indent(3),"'dec_",TypeName,
+% "'(H, Bytes, TagIn, T)"})
+% end,
+% case more_genfields(Fields,Rest) of
+% true ->
+% emit({";",nl});
+% false ->
+% emit({".",nl})
+% end,
+% [];
+% {false,_} ->
+% []
+% end,
+% gen_decode_objectfields(Erules,Class,ObjName,Rest,MaybeConstr ++ ConstrAcc);
+% gen_decode_objectfields(Erules,C,O,[H|T],CAcc) ->
+% gen_decode_objectfields(Erules,C,O,T,CAcc);
+% gen_decode_objectfields(_,_,_,[],CAcc) ->
+% CAcc.
+
+gen_decode_constr_type(Erules,[{Name,Def}|Rest]) ->
+%% emit({Name,"(Bytes, OptOrMand) ->",nl}),
+%% emit({" ",Name,"(Bytes, OptOrMand, []).",nl,nl}),
+ emit({Name,"(Bytes, OptOrMand, TagIn) ->",nl}),
+ InnerType = asn1ct_gen:get_inner(Def#type.def),
+ asn1ct_gen:gen_decode_constructed(ber,Name,InnerType,Def),
+ gen_decode_constr_type(Erules,Rest);
+gen_decode_constr_type(Erules,[TypeDef|Rest]) when record(TypeDef,typedef) ->
+ case is_already_generated(dec,TypeDef#typedef.name) of
+ true -> ok;
+ _ ->
+ gen_decode(Erules,TypeDef)
+ end,
+ gen_decode_constr_type(Erules,Rest);
+gen_decode_constr_type(_,[]) ->
+ ok.
+
+gen_decode_field_call(ObjName,FieldName,Bytes,Type) ->
+ Def = Type#typedef.typespec,
+ OTag = Def#type.tag,
+ Tag = [X#tag{class=decode_class(X#tag.class)}|| X <- OTag],
+ case Type#typedef.name of
+ {primitive,bif} -> %%tag should be the primitive tag
+ gen_dec_prim(ber,Def,Bytes,Tag,"TagIn",no_length,
+ ?PRIMITIVE,opt_or_default),
+ [];
+ {constructed,bif} ->
+ emit({" 'dec_",ObjName,'_',FieldName,
+ "'(",Bytes,",opt_or_default, TagIn ++ ",{asis,Tag},")"}),
+ [Type#typedef{name=list_to_atom(lists:concat([ObjName,'_',FieldName]))}];
+ {ExtMod,TypeName} ->
+ emit({" '",ExtMod,"':'dec_",TypeName,
+ "'(",Bytes,", opt_or_default,TagIn ++ ",{asis,Tag},")"}),
+ [];
+ TypeName ->
+ emit({" 'dec_",TypeName,"'(",Bytes,
+ ", opt_or_default,TagIn ++ ",{asis,Tag},")"}),
+ []
+ end.
+
+gen_decode_default_call(ClassName,FieldName,Bytes,Type) ->
+ CurrentMod = get(currmod),
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ OTag = Type#type.tag,
+ Tag = [X#tag{class=decode_class(X#tag.class)}|| X <- OTag],
+ case asn1ct_gen:type(InnerType) of
+ {constructed,bif} ->
+ emit([" 'dec_",ClassName,'_',FieldName,"'(",Bytes,
+ ",opt_or_default, TagIn ++ ",{asis,Tag},")"]),
+ [#typedef{name=list_to_atom(lists:concat([ClassName,'_',FieldName])),
+ typespec=Type}];
+ {primitive,bif} ->
+ gen_dec_prim(ber,Type,Bytes,Tag,"TagIn",no_length,
+ ?PRIMITIVE,opt_or_default),
+ [];
+ #'Externaltypereference'{module=CurrentMod,type=Etype} ->
+ emit([" 'dec_",Etype,"'(",Bytes,
+ " ,opt_or_default, TagIn ++ ",{asis,Tag},")",nl]),
+ [];
+ #'Externaltypereference'{module=Emod,type=Etype} ->
+ emit([" '",Emod,"':'dec_",Etype,"'(",Bytes,
+ ", opt_or_defualt, TagIn ++ ",{asis,Tag},")",nl]),
+ []
+ end.
+
+
+more_genfields([]) ->
+ false;
+more_genfields([Field|Fields]) ->
+ case element(1,Field) of
+ typefield ->
+ true;
+ objectfield ->
+ true;
+ _ ->
+ more_genfields(Fields)
+ end.
+
+
+
+%% Object Set code generating for encoding and decoding
+%% ----------------------------------------------------
+gen_objectset_code(Erules,ObjSet) ->
+ ObjSetName = ObjSet#typedef.name,
+ Def = ObjSet#typedef.typespec,
+% {ClassName,ClassDef} = Def#'ObjectSet'.class,
+ #'Externaltypereference'{module=ClassModule,
+ type=ClassName} = Def#'ObjectSet'.class,
+ ClassDef = asn1_db:dbget(ClassModule,ClassName),
+ UniqueFName = Def#'ObjectSet'.uniquefname,
+ Set = Def#'ObjectSet'.set,
+ emit({nl,nl,nl,"%%================================"}),
+ emit({nl,"%% ",ObjSetName}),
+ emit({nl,"%%================================",nl}),
+ case ClassName of
+ {_Module,ExtClassName} ->
+ gen_objset_code(Erules,ObjSetName,UniqueFName,Set,
+ ExtClassName,ClassDef);
+ _ ->
+ gen_objset_code(Erules,ObjSetName,UniqueFName,Set,
+ ClassName,ClassDef)
+ end,
+ emit(nl).
+
+gen_objset_code(Erules,ObjSetName,UniqueFName,Set,ClassName,ClassDef)->
+ ClassFields = (ClassDef#classdef.typespec)#objectclass.fields,
+ InternalFuncs=gen_objset_enc(ObjSetName,UniqueFName,Set,ClassName,ClassFields,1,[]),
+ gen_objset_dec(Erules,ObjSetName,UniqueFName,Set,ClassName,ClassFields,1),
+ gen_internal_funcs(Erules,InternalFuncs).
+
+%% gen_objset_enc iterates over the objects of the object set
+gen_objset_enc(_,{unique,undefined},_,_,_,_,_) ->
+ %% There is no unique field in the class of this object set
+ %% don't bother about the constraint
+ [];
+gen_objset_enc(ObjSName,UniqueName,
+ [{ObjName,Val,Fields},T|Rest],ClName,ClFields,NthObj,Acc)->
+ emit({"'getenc_",ObjSName,"'(",{asis,UniqueName},",",{asis,Val},") ->",nl}),
+ {InternalFunc,NewNthObj}=
+ case ObjName of
+ no_name ->
+ gen_inlined_enc_funs(Fields,ClFields,ObjSName,NthObj);
+ _Other ->
+ emit({" fun 'enc_",ObjName,"'/4"}),
+ {[],NthObj}
+ end,
+ emit({";",nl}),
+ gen_objset_enc(ObjSName,UniqueName,[T|Rest],ClName,ClFields,
+ NewNthObj,InternalFunc ++ Acc);
+gen_objset_enc(ObjSetName,UniqueName,
+ [{ObjName,Val,Fields}],_ClName,ClFields,NthObj,Acc) ->
+ emit({"'getenc_",ObjSetName,"'(",{asis,UniqueName},",",{asis,Val},") ->",nl}),
+ {InternalFunc,_}=
+ case ObjName of
+ no_name ->
+ gen_inlined_enc_funs(Fields,ClFields,ObjSetName,NthObj);
+ _Other ->
+ emit({" fun 'enc_",ObjName,"'/4"}),
+ {[],NthObj}
+ end,
+ emit({".",nl,nl}),
+ InternalFunc ++ Acc;
+%% See X.681 Annex E for the following case
+gen_objset_enc(ObjSetName,_UniqueName,['EXTENSIONMARK'],
+ _ClName,_ClFields,_NthObj,Acc) ->
+ emit({"'getenc_",ObjSetName,"'(_, _) ->",nl}),
+ emit({indent(3),"fun(_Attr, Val, _TagIn, _RestPrimFieldName) ->",nl}),
+ emit({indent(6),"Len = case Val of",nl,indent(9),
+ "Bin when binary(Bin) -> size(Bin);",nl,indent(9),
+ "_ -> length(Val)",nl,indent(6),"end,"}),
+ emit({indent(6),"{Val,Len}",nl}),
+ emit({indent(3),"end.",nl,nl}),
+ Acc;
+gen_objset_enc(_,_,[],_,_,_,Acc) ->
+ Acc.
+
+%% gen_inlined_enc_funs for each object iterates over all fields of a
+%% class, and for each typefield it checks if the object has that
+%% field and emits the proper code.
+gen_inlined_enc_funs(Fields,[{typefield,Name,_}|Rest],ObjSetName,
+ NthObj) ->
+ InternalDefFunName = asn1ct_gen:list2name([NthObj,Name,ObjSetName]),
+ case lists:keysearch(Name,1,Fields) of
+ {value,{_,Type}} when record(Type,type) ->
+ emit({indent(3),"fun(Type, Val, TagIn, _RestPrimFieldName) ->",nl,
+ indent(6),"case Type of",nl}),
+ {Ret,N} = emit_inner_of_fun(Type,InternalDefFunName),
+ gen_inlined_enc_funs1(Fields,Rest,ObjSetName,NthObj+N,Ret);
+ {value,{_,Type}} when record(Type,typedef) ->
+ emit({indent(3),"fun(Type, Val, TagIn, _RestPrimFieldName) ->",nl,
+ indent(6),"case Type of",nl}),
+ emit({indent(9),{asis,Name}," ->",nl}),
+ {Ret,N} = emit_inner_of_fun(Type,InternalDefFunName),
+ gen_inlined_enc_funs1(Fields,Rest,ObjSetName,NthObj+N,Ret);
+ false ->
+ gen_inlined_enc_funs(Fields,Rest,ObjSetName,NthObj)
+ end;
+gen_inlined_enc_funs(Fields,[_H|Rest],ObjSetName,NthObj) ->
+ gen_inlined_enc_funs(Fields,Rest,ObjSetName,NthObj);
+gen_inlined_enc_funs(_,[],_,NthObj) ->
+ {[],NthObj}.
+
+gen_inlined_enc_funs1(Fields,[{typefield,Name,_}|Rest],ObjSetName,
+ NthObj,Acc) ->
+ InternalDefFunName = asn1ct_gen:list2name([NthObj,Name,ObjSetName]),
+ {Acc2,NAdd}=
+ case lists:keysearch(Name,1,Fields) of
+ {value,{_,Type}} when record(Type,type) ->
+ emit({";",nl}),
+ {Ret,N}=emit_inner_of_fun(Type,InternalDefFunName),
+ {Ret++Acc,N};
+ {value,{_,Type}} when record(Type,typedef) ->
+ emit({";",nl,indent(9),{asis,Name}," ->",nl}),
+ {Ret,N}=emit_inner_of_fun(Type,InternalDefFunName),
+ {Ret++Acc,N};
+ false ->
+ {Acc,0}
+ end,
+ gen_inlined_enc_funs1(Fields,Rest,ObjSetName,NthObj+NAdd,Acc2);
+gen_inlined_enc_funs1(Fields,[_H|Rest],ObjSetName,NthObj,Acc)->
+ gen_inlined_enc_funs1(Fields,Rest,ObjSetName,NthObj,Acc);
+gen_inlined_enc_funs1(_,[],_,NthObj,Acc) ->
+ emit({nl,indent(6),"end",nl}),
+ emit({indent(3),"end"}),
+ {Acc,NthObj}.
+
+
+emit_inner_of_fun(TDef = #typedef{name={ExtMod,Name},typespec=Type},
+ InternalDefFunName) ->
+ OTag = Type#type.tag,
+ Tag = [X#tag{class=decode_class(X#tag.class)}|| X <- OTag],
+ case {ExtMod,Name} of
+ {primitive,bif} ->
+ emit(indent(12)),
+ gen_encode_prim(ber,Type,["TagIn ++ ",{asis,Tag}],"Val"),
+ {[],0};
+ {constructed,bif} ->
+ emit([indent(12),"'enc_",
+ InternalDefFunName,"'(Val,TagIn ++ ",
+ {asis,Tag},")"]),
+ {[TDef#typedef{name=InternalDefFunName}],1};
+ _ ->
+ emit({indent(12),"'",ExtMod,"':'enc_",Name,"'(Val, TagIn ++ ",
+ {asis,Tag},")"}),
+ {[],0}
+ end;
+emit_inner_of_fun(#typedef{name=Name,typespec=Type},_) ->
+ OTag = Type#type.tag,
+ Tag = [X#tag{class=decode_class(X#tag.class)}|| X <- OTag],
+ emit({indent(12),"'enc_",Name,"'(Val, TagIn ++ ",{asis,Tag},")"}),
+ {[],0};
+emit_inner_of_fun(Type,_) when record(Type,type) ->
+ CurrMod = get(currmod),
+ OTag = Type#type.tag,
+ Tag = [X#tag{class=decode_class(X#tag.class)}|| X <- OTag],
+ case Type#type.def of
+ Def when atom(Def) ->
+ emit({indent(9),Def," ->",nl,indent(12)}),
+ gen_encode_prim(ber,Type,["TagIn ++ ",{asis,Tag}],"Val");
+ TRef when record(TRef,typereference) ->
+ T = TRef#typereference.val,
+ emit({indent(9),T," ->",nl,indent(12),"'enc_",T,
+ "'(Val, TagIn ++ ",{asis,Tag},")"});
+ #'Externaltypereference'{module=CurrMod,type=T} ->
+ emit({indent(9),T," ->",nl,indent(12),"'enc_",T,
+ "'(Val, TagIn ++ ",{asis,Tag},")"});
+ #'Externaltypereference'{module=ExtMod,type=T} ->
+ emit({indent(9),T," ->",nl,indent(12),ExtMod,":'enc_",
+ T,"'(Val, TagIn ++ ",{asis,Tag},")"})
+ end,
+ {[],0}.
+
+indent(N) ->
+ lists:duplicate(N,32). % 32 = space
+
+
+gen_objset_dec(_,_,{unique,undefined},_,_,_,_) ->
+ %% There is no unique field in the class of this object set
+ %% don't bother about the constraint
+ ok;
+gen_objset_dec(Erules,ObjSName,UniqueName,[{ObjName,Val,Fields},T|Rest],
+ ClName,ClFields,NthObj)->
+ emit({"'getdec_",ObjSName,"'(",{asis,UniqueName},",",{asis,Val},
+ ") ->",nl}),
+ NewNthObj=
+ case ObjName of
+ no_name ->
+ gen_inlined_dec_funs(Erules,Fields,ClFields,ObjSName,
+ NthObj);
+ _Other ->
+ emit({" fun 'dec_",ObjName,"'/4"}),
+ NthObj
+ end,
+ emit({";",nl}),
+ gen_objset_dec(Erules,ObjSName,UniqueName,[T|Rest],ClName,ClFields,
+ NewNthObj);
+gen_objset_dec(Erules,ObjSetName,UniqueName,[{ObjName,Val,Fields}],_ClName,
+ ClFields,NthObj) ->
+ emit({"'getdec_",ObjSetName,"'(",{asis,UniqueName},",",{asis,Val},") ->",nl}),
+ case ObjName of
+ no_name ->
+ gen_inlined_dec_funs(Erules,Fields,ClFields,ObjSetName,
+ NthObj);
+ _Other ->
+ emit({" fun 'dec_",ObjName,"'/4"})
+ end,
+ emit({".",nl,nl});
+gen_objset_dec(_,ObjSetName,_UniqueName,['EXTENSIONMARK'],_ClName,_ClFields,
+ _NthObj) ->
+ emit({"'getdec_",ObjSetName,"'(_, _) ->",nl}),
+ emit({indent(3),"fun(_, Bytes, _, _) ->",nl}),
+ emit({indent(6),"Len = case Bytes of",nl,indent(9),
+ "Bin when binary(Bin) -> size(Bin);",nl,indent(9),
+ "_ -> length(Bytes)",nl,indent(6),"end,"}),
+ emit({indent(6),"{Bytes,[],Len}",nl}),
+ emit({indent(3),"end.",nl,nl}),
+ ok;
+gen_objset_dec(_,_,_,[],_,_,_) ->
+ ok.
+
+gen_inlined_dec_funs(Erules,Fields,[{typefield,Name,Prop}|Rest],
+ ObjSetName,NthObj) ->
+ DecProp = case Prop of
+ 'OPTIONAL' -> opt_or_default;
+ {'DEFAULT',_} -> opt_or_default;
+ _ -> mandatory
+ end,
+ InternalDefFunName = [NthObj,Name,ObjSetName],
+ case lists:keysearch(Name,1,Fields) of
+ {value,{_,Type}} when record(Type,type) ->
+ emit({indent(3),"fun(Type, Bytes, TagIn, _RestPrimFieldName) ->",
+ nl,indent(6),"case Type of",nl}),
+ N=emit_inner_of_decfun(Erules,Type,DecProp,InternalDefFunName),
+ gen_inlined_dec_funs1(Erules,Fields,Rest,ObjSetName,NthObj+N);
+ {value,{_,Type}} when record(Type,typedef) ->
+ emit({indent(3),"fun(Type, Bytes, TagIn, _RestPrimFieldName) ->",
+ nl,indent(6),"case Type of",nl}),
+ emit({indent(9),{asis,Name}," ->",nl}),
+ N=emit_inner_of_decfun(Erules,Type,DecProp,InternalDefFunName),
+ gen_inlined_dec_funs1(Erules,Fields,Rest,ObjSetName,NthObj+N);
+ false ->
+ gen_inlined_dec_funs(Erules,Fields,Rest,ObjSetName,NthObj)
+ end;
+gen_inlined_dec_funs(Erules,Fields,[_H|Rest],ObjSetName,NthObj) ->
+ gen_inlined_dec_funs(Erules,Fields,Rest,ObjSetName,NthObj);
+gen_inlined_dec_funs(_,_,[],_,NthObj) ->
+ NthObj.
+
+gen_inlined_dec_funs1(Erules,Fields,[{typefield,Name,Prop}|Rest],
+ ObjSetName,NthObj) ->
+ DecProp = case Prop of
+ 'OPTIONAL' -> opt_or_default;
+ {'DEFAULT',_} -> opt_or_default;
+ _ -> mandatory
+ end,
+ InternalDefFunName = [NthObj,Name,ObjSetName],
+ N=
+ case lists:keysearch(Name,1,Fields) of
+ {value,{_,Type}} when record(Type,type) ->
+ emit({";",nl}),
+ emit_inner_of_decfun(Erules,Type,DecProp,InternalDefFunName);
+ {value,{_,Type}} when record(Type,typedef) ->
+ emit({";",nl,indent(9),{asis,Name}," ->",nl}),
+ emit_inner_of_decfun(Erules,Type,DecProp,InternalDefFunName);
+ false ->
+ 0
+ end,
+ gen_inlined_dec_funs1(Erules,Fields,Rest,ObjSetName,NthObj+N);
+gen_inlined_dec_funs1(Erules,Fields,[_H|Rest],ObjSetName,NthObj)->
+ gen_inlined_dec_funs1(Erules,Fields,Rest,ObjSetName,NthObj);
+gen_inlined_dec_funs1(_,_,[],_,NthObj) ->
+ emit({nl,indent(6),"end",nl}),
+ emit({indent(3),"end"}),
+ NthObj.
+
+emit_inner_of_decfun(Erules,#typedef{name={ExtName,Name},typespec=Type},
+ Prop,InternalDefFunName) ->
+ OTag = Type#type.tag,
+ Tag = [X#tag{class=decode_class(X#tag.class)}|| X <- OTag],
+ case {ExtName,Name} of
+ {primitive,bif} ->
+ emit(indent(12)),
+ gen_dec_prim(Erules,Type,"Bytes",Tag,"TagIn",no_length,
+ ?PRIMITIVE,Prop),
+ 0;
+ {constructed,bif} ->
+ emit({indent(12),"'dec_",
+ asn1ct_gen:list2name(InternalDefFunName),"'(Bytes, ",Prop,
+ ", TagIn ++ ",{asis,Tag},")"}),
+ 1;
+ _ ->
+ emit({indent(12),"'",ExtName,"':'dec_",Name,"'(Bytes, ",Prop,
+ ", TagIn ++ ",{asis,Tag},")"}),
+ 0
+ end;
+emit_inner_of_decfun(_,#typedef{name=Name,typespec=Type},Prop,_) ->
+ OTag = Type#type.tag,
+ Tag = [X#tag{class=decode_class(X#tag.class)}|| X <- OTag],
+ emit({indent(12),"'dec_",Name,"'(Bytes, ",Prop,", TagIn ++ ",
+ {asis,Tag},")"}),
+ 0;
+emit_inner_of_decfun(Erules,Type,Prop,_) when record(Type,type) ->
+ OTag = Type#type.tag,
+ Tag = [X#tag{class=decode_class(X#tag.class)}|| X <- OTag],
+ CurrMod = get(currmod),
+ Def = Type#type.def,
+ InnerType = asn1ct_gen:get_inner(Def),
+ WhatKind = asn1ct_gen:type(InnerType),
+ case WhatKind of
+ {primitive,bif} ->
+ emit({indent(9),Def," ->",nl,indent(12)}),
+ gen_dec_prim(Erules,Type,"Bytes",Tag,"TagIn",no_length,
+ ?PRIMITIVE,Prop);
+% TRef when record(TRef,typereference) ->
+% T = TRef#typereference.val,
+% emit({indent(9),T," ->",nl,indent(12),"'dec_",T,"'(Val)"});
+ #'Externaltypereference'{module=CurrMod,type=T} ->
+ emit({indent(9),T," ->",nl,indent(12),"'dec_",T,
+ "'(Bytes, ",Prop,", TagIn ++ ",{asis,Tag},")"});
+ #'Externaltypereference'{module=ExtMod,type=T} ->
+ emit({indent(9),T," ->",nl,indent(12),ExtMod,":'dec_",
+ T,"'(Bytes, ",Prop,", TagIn ++ ",{asis,Tag},")"})
+ end,
+ 0.
+
+
+gen_internal_funcs(_,[]) ->
+ ok;
+gen_internal_funcs(Erules,[TypeDef|Rest]) ->
+ gen_encode_user(Erules,TypeDef),
+ emit({"'dec_",TypeDef#typedef.name,"'(Bytes, ",
+ unused_optormand_var("OptOrMand",(TypeDef#typedef.typespec)#type.def),", TagIn) ->",nl}),
+ gen_decode_user(Erules,TypeDef),
+ gen_internal_funcs(Erules,Rest).
+
+
+dbdec(Type) ->
+ demit({"io:format(\"decoding: ",{asis,Type},"~w~n\",[Bytes]),",nl}).
+
+
+decode_class('UNIVERSAL') ->
+ ?UNIVERSAL;
+decode_class('APPLICATION') ->
+ ?APPLICATION;
+decode_class('CONTEXT') ->
+ ?CONTEXT;
+decode_class('PRIVATE') ->
+ ?PRIVATE.
+
+decode_type('BOOLEAN') -> 1;
+decode_type('INTEGER') -> 2;
+decode_type('BIT STRING') -> 3;
+decode_type('OCTET STRING') -> 4;
+decode_type('NULL') -> 5;
+decode_type('OBJECT IDENTIFIER') -> 6;
+decode_type('OBJECT DESCRIPTOR') -> 7;
+decode_type('EXTERNAL') -> 8;
+decode_type('REAL') -> 9;
+decode_type('ENUMERATED') -> 10;
+decode_type('EMBEDDED_PDV') -> 11;
+decode_type('SEQUENCE') -> 16;
+decode_type('SEQUENCE OF') -> 16;
+decode_type('SET') -> 17;
+decode_type('SET OF') -> 17;
+decode_type('NumericString') -> 18;
+decode_type('PrintableString') -> 19;
+decode_type('TeletexString') -> 20;
+decode_type('VideotexString') -> 21;
+decode_type('IA5String') -> 22;
+decode_type('UTCTime') -> 23;
+decode_type('GeneralizedTime') -> 24;
+decode_type('GraphicString') -> 25;
+decode_type('VisibleString') -> 26;
+decode_type('GeneralString') -> 27;
+decode_type('UniversalString') -> 28;
+decode_type('BMPString') -> 30;
+decode_type('CHOICE') -> 'CHOICE'; % choice gets the tag from the actual alternative
+decode_type(Else) -> exit({error,{asn1,{unrecognized_type,Else}}}).
+
+add_removed_bytes() ->
+ asn1ct_name:delete(rb),
+ add_removed_bytes(asn1ct_name:all(rb)).
+
+add_removed_bytes([H,T1|T]) ->
+ emit({{var,H},"+"}),
+ add_removed_bytes([T1|T]);
+add_removed_bytes([H|T]) ->
+ emit({{var,H}}),
+ add_removed_bytes(T);
+add_removed_bytes([]) ->
+ true.
+
+mkfuncname(WhatKind,DecOrEnc) ->
+ case WhatKind of
+ #'Externaltypereference'{module=Mod,type=EType} ->
+ CurrMod = get(currmod),
+ case CurrMod of
+ Mod ->
+ lists:concat(["'",DecOrEnc,"_",EType,"'"]);
+ _ ->
+% io:format("CurrMod: ~p, Mod: ~p~n",[CurrMod,Mod]),
+ lists:concat(["'",Mod,"':'",DecOrEnc,"_",EType,"'"])
+ end;
+ #'typereference'{val=EType} ->
+ lists:concat(["'",DecOrEnc,"_",EType,"'"]);
+ 'ASN1_OPEN_TYPE' ->
+ lists:concat(["'",DecOrEnc,"_",WhatKind,"'"])
+
+ end.
+
+optionals(L) -> optionals(L,[],1).
+
+optionals([{'EXTENSIONMARK',_,_}|Rest],Acc,Pos) ->
+ optionals(Rest,Acc,Pos); % optionals in extension are currently not handled
+optionals([#'ComponentType'{name=Name,prop='OPTIONAL'}|Rest],Acc,Pos) ->
+ optionals(Rest,[{Name,Pos}|Acc],Pos+1);
+optionals([#'ComponentType'{name=Name,prop={'DEFAULT',_}}|Rest],Acc,Pos) ->
+ optionals(Rest,[{Name,Pos}|Acc],Pos+1);
+optionals([#'ComponentType'{}|Rest],Acc,Pos) ->
+ optionals(Rest,Acc,Pos+1);
+optionals([],Acc,_) ->
+ lists:reverse(Acc).
+
+get_constraint(C,Key) ->
+ case lists:keysearch(Key,1,C) of
+ false ->
+ no;
+ {value,{_,V}} ->
+ V
+ end.
+
+%% if the original option was ber and it has been wrapped to ber_bin
+%% turn it back to ber
+re_wrap_erule(ber_bin) ->
+ case get(encoding_options) of
+ Options when list(Options) ->
+ case lists:member(ber,Options) of
+ true -> ber;
+ _ -> ber_bin
+ end;
+ _ -> ber_bin
+ end;
+re_wrap_erule(Erule) ->
+ Erule.
+
+is_already_generated(Operation,Name) ->
+ case get(class_default_type) of
+ undefined ->
+ put(class_default_type,[{Operation,Name}]),
+ false;
+ GeneratedList ->
+ case lists:member({Operation,Name},GeneratedList) of
+ true ->
+ true;
+ false ->
+ put(class_default_type,[{Operation,Name}|GeneratedList]),
+ false
+ end
+ end.
+
+get_class_fields(#classdef{typespec=ObjClass}) ->
+ ObjClass#objectclass.fields;
+get_class_fields(#objectclass{fields=Fields}) ->
+ Fields;
+get_class_fields(_) ->
+ [].
+
+get_object_field(Name,ObjectFields) ->
+ case lists:keysearch(Name,1,ObjectFields) of
+ {value,Field} -> Field;
+ false -> false
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_gen_ber_bin_v2.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_gen_ber_bin_v2.erl
new file mode 100644
index 0000000000..89530d4017
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_gen_ber_bin_v2.erl
@@ -0,0 +1,1562 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1ct_gen_ber_bin_v2.erl,v 1.1 2008/12/17 09:53:29 mikpe Exp $
+%%
+-module(asn1ct_gen_ber_bin_v2).
+
+%% Generate erlang module which handles (PER) encode and decode for
+%% all types in an ASN.1 module
+
+-include("asn1_records.hrl").
+
+-export([pgen/4]).
+-export([decode_class/1, decode_type/1]).
+-export([add_removed_bytes/0]).
+-export([gen_encode/2,gen_encode/3,gen_decode/2,gen_decode/3]).
+-export([gen_encode_prim/4]).
+-export([gen_dec_prim/7]).
+-export([gen_objectset_code/2, gen_obj_code/3]).
+-export([encode_tag_val/3]).
+-export([gen_inc_decode/2]).
+
+-import(asn1ct_gen, [emit/1,demit/1]).
+
+ % the encoding of class of tag bits 8 and 7
+-define(UNIVERSAL, 0).
+-define(APPLICATION, 16#40).
+-define(CONTEXT, 16#80).
+-define(PRIVATE, 16#C0).
+
+ % primitive or constructed encoding % bit 6
+-define(PRIMITIVE, 0).
+-define(CONSTRUCTED, 2#00100000).
+
+
+-define(T_ObjectDescriptor, ?UNIVERSAL bor ?PRIMITIVE bor 7).
+ % restricted character string types
+-define(T_NumericString, ?UNIVERSAL bor ?PRIMITIVE bor 18). %can be constructed
+-define(T_PrintableString, ?UNIVERSAL bor ?PRIMITIVE bor 19). %can be constructed
+-define(T_TeletexString, ?UNIVERSAL bor ?PRIMITIVE bor 20). %can be constructed
+-define(T_VideotexString, ?UNIVERSAL bor ?PRIMITIVE bor 21). %can be constructed
+-define(T_IA5String, ?UNIVERSAL bor ?PRIMITIVE bor 22). %can be constructed
+-define(T_GraphicString, ?UNIVERSAL bor ?PRIMITIVE bor 25). %can be constructed
+-define(T_VisibleString, ?UNIVERSAL bor ?PRIMITIVE bor 26). %can be constructed
+-define(T_GeneralString, ?UNIVERSAL bor ?PRIMITIVE bor 27). %can be constructed
+
+%% pgen(Erules, Module, TypeOrVal)
+%% Generate Erlang module (.erl) and (.hrl) file corresponding to an ASN.1 module
+%% .hrl file is only generated if necessary
+%% Erules = per | ber
+%% Module = atom()
+%% TypeOrVal = {TypeList,ValueList,PTypeList}
+%% TypeList = ValueList = [atom()]
+
+pgen(OutFile,Erules,Module,TypeOrVal) ->
+ asn1ct_gen:pgen_module(OutFile,Erules,Module,TypeOrVal,true).
+
+
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+%% Generate ENCODING
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+
+%%===============================================================================
+%% encode #{typedef, {pos, name, typespec}}
+%%===============================================================================
+
+gen_encode(Erules,Type) when record(Type,typedef) ->
+ gen_encode_user(Erules,Type).
+
+%%===============================================================================
+%% encode #{type, {tag, def, constraint}}
+%%===============================================================================
+
+gen_encode(Erules,Typename,Type) when record(Type,type) ->
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ ObjFun =
+ case lists:keysearch(objfun,1,Type#type.tablecinf) of
+ {value,{_,_Name}} ->
+ ", ObjFun";
+ false ->
+ ""
+ end,
+
+ case asn1ct_gen:type(InnerType) of
+ {constructed,bif} ->
+ emit([nl,nl,nl,"%%================================"]),
+ emit([nl,"%% ",asn1ct_gen:list2name(Typename)]),
+ emit([nl,"%%================================",nl]),
+ case length(Typename) of
+ 1 -> % top level type
+ emit(["'enc_",asn1ct_gen:list2name(Typename),
+ "'(Val",ObjFun,") ->",nl]),
+ emit([" 'enc_",asn1ct_gen:list2name(Typename),
+ "'(Val, ", {asis,lists:reverse(Type#type.tag)},ObjFun,").",nl,nl]);
+ _ -> % embedded type with constructed name
+ true
+ end,
+ case lists:member(InnerType,['SET','SEQUENCE']) of
+ true ->
+ case get(asn_keyed_list) of
+ true ->
+ CompList =
+ case Type#type.def of
+ #'SEQUENCE'{components=Cl} -> Cl;
+ #'SET'{components=Cl} -> Cl
+ end,
+ emit([nl,"'enc_",asn1ct_gen:list2name(Typename),
+ "'(Val, TagIn",ObjFun,
+ ") when list(Val) ->",nl]),
+ emit([" 'enc_",asn1ct_gen:list2name(Typename),
+ "'(?RT_BER:fixoptionals(",
+ {asis,optionals(CompList)},
+ ",Val), TagIn",ObjFun,");",nl,nl]);
+ _ -> true
+ end;
+ _ ->
+ emit([nl,"'enc_",asn1ct_gen:list2name(Typename),
+ "'({'",asn1ct_gen:list2name(Typename),
+ "',Val}, TagIn",ObjFun,") ->",nl]),
+ emit([" 'enc_",asn1ct_gen:list2name(Typename),
+ "'(Val, TagIn",ObjFun,");",nl,nl])
+ end,
+ emit(["'enc_",asn1ct_gen:list2name(Typename),
+ "'(Val, TagIn",ObjFun,") ->",nl," "]),
+ asn1ct_gen:gen_encode_constructed(Erules,Typename,InnerType,Type);
+ _ ->
+ true
+ end;
+
+%%===============================================================================
+%% encode ComponentType
+%%===============================================================================
+
+gen_encode(Erules,Tname,{'ComponentType',_Pos,Cname,Type,_Prop,_Tags}) ->
+ NewTname = [Cname|Tname],
+ %% The tag is set to [] to avoid that it is
+ %% taken into account twice, both as a component/alternative (passed as
+ %% argument to the encode decode function and within the encode decode
+ %% function it self.
+ NewType = Type#type{tag=[]},
+ gen_encode(Erules,NewTname,NewType).
+
+gen_encode_user(Erules,D) when record(D,typedef) ->
+ Typename = [D#typedef.name],
+ Type = D#typedef.typespec,
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ OTag = Type#type.tag,
+ Tag = [encode_tag_val(decode_class(X#tag.class),X#tag.form,X#tag.number)|| X <- OTag],
+ emit([nl,nl,"%%================================"]),
+ emit([nl,"%% ",Typename]),
+ emit([nl,"%%================================",nl]),
+ emit(["'enc_",asn1ct_gen:list2name(Typename),
+ "'(Val",") ->",nl]),
+ emit([" 'enc_",asn1ct_gen:list2name(Typename),
+ "'(Val, ", {asis,lists:reverse(Tag)},").",nl,nl]),
+
+ case lists:member(InnerType,['SET','SEQUENCE']) of
+ true ->
+ case get(asn_keyed_list) of
+ true ->
+ CompList =
+ case Type#type.def of
+ #'SEQUENCE'{components=Cl} -> Cl;
+ #'SET'{components=Cl} -> Cl
+ end,
+
+ emit([nl,"'enc_",asn1ct_gen:list2name(Typename),
+ "'(Val, TagIn) when list(Val) ->",nl]),
+ emit([" 'enc_",asn1ct_gen:list2name(Typename),
+ "'(?RT_BER:fixoptionals(",
+ {asis,optionals(CompList)},
+ ",Val), TagIn);",nl,nl]);
+ _ -> true
+ end;
+ _ ->
+ emit({nl,"'enc_",asn1ct_gen:list2name(Typename),
+ "'({'",asn1ct_gen:list2name(Typename),"',Val}, TagIn) ->",nl}),
+ emit({" 'enc_",asn1ct_gen:list2name(Typename),"'(Val, TagIn);",nl,nl})
+ end,
+ emit({"'enc_",asn1ct_gen:list2name(Typename),"'(Val, TagIn) ->",nl}),
+ CurrentMod = get(currmod),
+ case asn1ct_gen:type(InnerType) of
+ {constructed,bif} ->
+ asn1ct_gen:gen_encode_constructed(Erules,Typename,InnerType,D);
+ {primitive,bif} ->
+ gen_encode_prim(ber,Type,"TagIn","Val"),
+ emit([".",nl]);
+ #typereference{val=Ename} ->
+ emit([" 'enc_",Ename,"'(Val, TagIn).",nl]);
+ #'Externaltypereference'{module=CurrentMod,type=Etype} ->
+ emit([" 'enc_",Etype,"'(Val, TagIn).",nl]);
+ #'Externaltypereference'{module=Emod,type=Etype} ->
+ emit([" '",Emod,"':'enc_",Etype,"'(Val, TagIn).",nl]);
+ 'ASN1_OPEN_TYPE' ->
+ emit(["%% OPEN TYPE",nl]),
+ gen_encode_prim(ber,
+ Type#type{def='ASN1_OPEN_TYPE'},
+ "TagIn","Val"),
+ emit([".",nl])
+ end.
+
+gen_encode_prim(_Erules,D,DoTag,Value) when record(D,type) ->
+
+%%% Constraint is currently not used for BER (except for BitString) and therefore replaced
+%%% with [] as a placeholder
+ BitStringConstraint = D#type.constraint,
+ Constraint = [],
+ asn1ct_name:new(enumval),
+ case D#type.def of
+ 'BOOLEAN' ->
+ emit_encode_func('boolean',Value,DoTag);
+ 'INTEGER' ->
+ emit_encode_func('integer',Constraint,Value,DoTag);
+ {'INTEGER',NamedNumberList} ->
+ emit_encode_func('integer',Constraint,Value,
+ NamedNumberList,DoTag);
+ {'ENUMERATED',NamedNumberList={_,_}} ->
+
+ emit(["case (case ",Value," of {asn1_enum,_}->",Value,";{_,_}->element(2,",Value,");_->",
+ Value," end) of",nl]),
+ emit_enc_enumerated_cases(NamedNumberList,DoTag);
+ {'ENUMERATED',NamedNumberList} ->
+
+ emit(["case (case ",Value," of {_,_}->element(2,",Value,");_->",
+ Value," end) of",nl]),
+ emit_enc_enumerated_cases(NamedNumberList,DoTag);
+
+ {'BIT STRING',NamedNumberList} ->
+ emit_encode_func('bit_string',BitStringConstraint,Value,
+ NamedNumberList,DoTag);
+ 'ANY' ->
+ emit_encode_func('open_type', Value,DoTag);
+ 'NULL' ->
+ emit_encode_func('null',Value,DoTag);
+ 'OBJECT IDENTIFIER' ->
+ emit_encode_func("object_identifier",Value,DoTag);
+ 'ObjectDescriptor' ->
+ emit_encode_func('restricted_string',Constraint,Value,
+ ?T_ObjectDescriptor,DoTag);
+ 'OCTET STRING' ->
+ emit_encode_func('octet_string',Constraint,Value,DoTag);
+ 'NumericString' ->
+ emit_encode_func('restricted_string',Constraint,Value,
+ ?T_NumericString,DoTag);
+ 'TeletexString' ->
+ emit_encode_func('restricted_string',Constraint,Value,
+ ?T_TeletexString,DoTag);
+ 'VideotexString' ->
+ emit_encode_func('restricted_string',Constraint,Value,
+ ?T_VideotexString,DoTag);
+ 'GraphicString' ->
+ emit_encode_func('restricted_string',Constraint,Value,
+ ?T_GraphicString,DoTag);
+ 'VisibleString' ->
+ emit_encode_func('restricted_string',Constraint,Value,
+ ?T_VisibleString,DoTag);
+ 'GeneralString' ->
+ emit_encode_func('restricted_string',Constraint,Value,
+ ?T_GeneralString,DoTag);
+ 'PrintableString' ->
+ emit_encode_func('restricted_string',Constraint,Value,
+ ?T_PrintableString,DoTag);
+ 'IA5String' ->
+ emit_encode_func('restricted_string',Constraint,Value,
+ ?T_IA5String,DoTag);
+ 'UniversalString' ->
+ emit_encode_func('universal_string',Constraint,Value,DoTag);
+ 'BMPString' ->
+ emit_encode_func('BMP_string',Constraint,Value,DoTag);
+ 'UTCTime' ->
+ emit_encode_func('utc_time',Constraint,Value,DoTag);
+ 'GeneralizedTime' ->
+ emit_encode_func('generalized_time',Constraint,Value,DoTag);
+ 'ASN1_OPEN_TYPE' ->
+ emit_encode_func('open_type', Value,DoTag);
+ XX ->
+ exit({'can not encode' ,XX})
+ end.
+
+
+emit_encode_func(Name,Value,Tags) when atom(Name) ->
+ emit_encode_func(atom_to_list(Name),Value,Tags);
+emit_encode_func(Name,Value,Tags) ->
+ Fname = "?RT_BER:encode_" ++ Name,
+ emit([Fname,"(",Value,", ",Tags,")"]).
+
+emit_encode_func(Name,Constraint,Value,Tags) when atom(Name) ->
+ emit_encode_func(atom_to_list(Name),Constraint,Value,Tags);
+emit_encode_func(Name,Constraint,Value,Tags) ->
+ Fname = "?RT_BER:encode_" ++ Name,
+ emit([Fname,"(",{asis,Constraint},", ",Value,", ",Tags,")"]).
+
+emit_encode_func(Name,Constraint,Value,Asis,Tags) when atom(Name) ->
+ emit_encode_func(atom_to_list(Name),Constraint,Value,Asis,Tags);
+emit_encode_func(Name,Constraint,Value,Asis,Tags) ->
+ Fname = "?RT_BER:encode_" ++ Name,
+ emit([Fname,"(",{asis,Constraint},", ",Value,
+ ", ",{asis,Asis},
+ ", ",Tags,")"]).
+
+emit_enc_enumerated_cases({L1,L2}, Tags) ->
+ emit_enc_enumerated_cases(L1++L2, Tags, ext);
+emit_enc_enumerated_cases(L, Tags) ->
+ emit_enc_enumerated_cases(L, Tags, noext).
+
+emit_enc_enumerated_cases([{EnumName,EnumVal},H2|T], Tags, Ext) ->
+ emit([{asis,EnumName}," -> ?RT_BER:encode_enumerated(",EnumVal,",",Tags,");",nl]),
+%% emit(["'",{asis,EnumName},"' -> ?RT_BER:encode_enumerated(",EnumVal,",",Tags,");",nl]),
+ emit_enc_enumerated_cases([H2|T], Tags, Ext);
+emit_enc_enumerated_cases([{EnumName,EnumVal}], Tags, Ext) ->
+ emit([{asis,EnumName}," -> ?RT_BER:encode_enumerated(",EnumVal,",",Tags,")"]),
+%% emit(["'",{asis,EnumName},"' -> ?RT_BER:encode_enumerated(",EnumVal,",",Tags,")"]),
+ case Ext of
+ noext -> emit([";",nl]);
+ ext ->
+ emit([";",nl,"{asn1_enum,",{curr,enumval},"} -> ",
+ "?RT_BER:encode_enumerated(",{curr,enumval},",",Tags,");",nl]),
+ asn1ct_name:new(enumval)
+ end,
+ emit([{curr,enumval}," -> exit({error,{asn1, {enumerated_not_in_range,",{curr, enumval},"}}})"]),
+ emit([nl,"end"]).
+
+
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+%% Generate DECODING
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+
+%%===============================================================================
+%% decode #{typedef, {pos, name, typespec}}
+%%===============================================================================
+
+gen_decode(Erules,Type) when record(Type,typedef) ->
+ Def = Type#typedef.typespec,
+ InnerTag = Def#type.tag ,
+
+ Tag = [(decode_class(X#tag.class) bsl 10) + X#tag.number || X <- InnerTag],
+
+ Prefix =
+ case {asn1ct:get_gen_state_field(active),
+ asn1ct:get_gen_state_field(prefix)} of
+ {true,Pref} -> Pref;
+ _ -> "dec_"
+ end,
+ emit({nl,nl}),
+ emit(["'",Prefix,Type#typedef.name,"'(Tlv) ->",nl]),
+ emit([" '",Prefix,Type#typedef.name,"'(Tlv, ",{asis,Tag},").",nl,nl]),
+ emit(["'",Prefix,Type#typedef.name,"'(Tlv, TagIn) ->",nl]),
+ dbdec(Type#typedef.name),
+ gen_decode_user(Erules,Type).
+
+gen_inc_decode(Erules,Type) when record(Type,typedef) ->
+ Prefix = asn1ct:get_gen_state_field(prefix),
+ emit({nl,nl}),
+ emit(["'",Prefix,Type#typedef.name,"'(Tlv, TagIn) ->",nl]),
+ gen_decode_user(Erules,Type).
+
+%%===============================================================================
+%% decode #{type, {tag, def, constraint}}
+%%===============================================================================
+
+%% This gen_decode is called by the gen_decode/3 that decodes
+%% ComponentType and the type of a SEQUENCE OF/SET OF.
+gen_decode(Erules,Tname,Type) when record(Type,type) ->
+ Typename = Tname,
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ Prefix =
+ case asn1ct:get_gen_state_field(active) of
+ true -> "'dec-inc-";
+ _ -> "'dec_"
+ end,
+ case asn1ct_gen:type(InnerType) of
+ {constructed,bif} ->
+ ObjFun =
+ case Type#type.tablecinf of
+ [{objfun,_}|_R] ->
+ ", ObjFun";
+ _ ->
+ ""
+ end,
+ emit([Prefix,asn1ct_gen:list2name(Typename),"'(Tlv, TagIn",ObjFun,") ->",nl]),
+ dbdec(Typename),
+ asn1ct_gen:gen_decode_constructed(Erules,Typename,InnerType,Type);
+ Rec when record(Rec,'Externaltypereference') ->
+ case {Typename,asn1ct:get_gen_state_field(namelist)} of
+ {[Cname|_],[{Cname,_}|_]} -> %%
+ %% This referenced type must only be generated
+ %% once as incomplete partial decode. Therefore we
+ %% have to check whether this function already is
+ %% generated.
+ case asn1ct:is_function_generated(Typename) of
+ true ->
+ ok;
+ _ ->
+ asn1ct:generated_refed_func(Typename),
+ #'Externaltypereference'{module=M,type=Name}=Rec,
+ TypeDef = asn1_db:dbget(M,Name),
+ gen_decode(Erules,TypeDef)
+ end;
+ _ ->
+ true
+ end;
+ _ ->
+ true
+ end;
+
+
+%%===============================================================================
+%% decode ComponentType
+%%===============================================================================
+
+gen_decode(Erules,Tname,{'ComponentType',_Pos,Cname,Type,_Prop,_Tags}) ->
+ NewTname = [Cname|Tname],
+ %% The tag is set to [] to avoid that it is
+ %% taken into account twice, both as a component/alternative (passed as
+ %% argument to the encode decode function and within the encode decode
+ %% function it self.
+ NewType = Type#type{tag=[]},
+ case {asn1ct:get_gen_state_field(active),
+ asn1ct:get_tobe_refed_func(NewTname)} of
+ {true,{_,NameList}} ->
+ asn1ct:update_gen_state(namelist,NameList),
+ %% remove to gen_refed_funcs list from tobe_refed_funcs later
+ gen_decode(Erules,NewTname,NewType);
+ {No,_} when No == false; No == undefined ->
+ gen_decode(Erules,NewTname,NewType);
+ _ ->
+ ok
+ end.
+
+
+gen_decode_user(Erules,D) when record(D,typedef) ->
+ Typename = [D#typedef.name],
+ Def = D#typedef.typespec,
+ InnerType = asn1ct_gen:get_inner(Def#type.def),
+ BytesVar = "Tlv",
+ case asn1ct_gen:type(InnerType) of
+ 'ASN1_OPEN_TYPE' ->
+ asn1ct_name:new(len),
+ gen_dec_prim(ber, Def#type{def='ASN1_OPEN_TYPE'},
+ BytesVar,{string,"TagIn"}, [] ,
+ ?PRIMITIVE,"OptOrMand"),
+ emit({".",nl,nl});
+ {primitive,bif} ->
+ asn1ct_name:new(len),
+ gen_dec_prim(ber, Def, BytesVar,{string,"TagIn"},[] ,
+ ?PRIMITIVE,"OptOrMand"),
+ emit([".",nl,nl]);
+ {constructed,bif} ->
+ asn1ct:update_namelist(D#typedef.name),
+ asn1ct_gen:gen_decode_constructed(Erules,Typename,InnerType,D);
+ TheType ->
+ DecFunName = mkfuncname(TheType,dec),
+ emit([DecFunName,"(",BytesVar,
+ ", TagIn)"]),
+ emit([".",nl,nl])
+ end.
+
+
+gen_dec_prim(_Erules,Att,BytesVar,DoTag,_TagIn,_Form,_OptOrMand) ->
+ Typename = Att#type.def,
+%% Currently not used for BER replaced with [] as place holder
+%% Constraint = Att#type.constraint,
+%% Constraint = [],
+ Constraint =
+ case get_constraint(Att#type.constraint,'SizeConstraint') of
+ no -> [];
+ Tc -> Tc
+ end,
+ ValueRange =
+ case get_constraint(Att#type.constraint,'ValueRange') of
+ no -> [];
+ Tv -> Tv
+ end,
+ SingleValue =
+ case get_constraint(Att#type.constraint,'SingleValue') of
+ no -> [];
+ Sv -> Sv
+ end,
+ AsBin = case get(binary_strings) of
+ true -> "_as_bin";
+ _ -> ""
+ end,
+ NewTypeName = case Typename of
+ 'ANY' -> 'ASN1_OPEN_TYPE';
+ _ -> Typename
+ end,
+% DoLength =
+ case NewTypeName of
+ 'BOOLEAN'->
+ emit({"?RT_BER:decode_boolean(",BytesVar,","}),
+ add_func({decode_boolean,2});
+ 'INTEGER' ->
+ emit({"?RT_BER:decode_integer(",BytesVar,",",
+ {asis,int_constr(SingleValue,ValueRange)},","}),
+ add_func({decode_integer,3});
+ {'INTEGER',NamedNumberList} ->
+ emit({"?RT_BER:decode_integer(",BytesVar,",",
+ {asis,int_constr(SingleValue,ValueRange)},",",
+ {asis,NamedNumberList},","}),
+ add_func({decode_integer,4});
+ {'ENUMERATED',NamedNumberList} ->
+ emit({"?RT_BER:decode_enumerated(",BytesVar,",",
+ {asis,Constraint},",",
+ {asis,NamedNumberList},","}),
+ add_func({decode_enumerated,4});
+ {'BIT STRING',NamedNumberList} ->
+ case get(compact_bit_string) of
+ true ->
+ emit({"?RT_BER:decode_compact_bit_string(",
+ BytesVar,",",{asis,Constraint},",",
+ {asis,NamedNumberList},","}),
+ add_func({decode_compact_bit_string,4});
+ _ ->
+ emit({"?RT_BER:decode_bit_string(",BytesVar,",",
+ {asis,Constraint},",",
+ {asis,NamedNumberList},","}),
+ add_func({decode_bit_string,4})
+ end;
+ 'NULL' ->
+ emit({"?RT_BER:decode_null(",BytesVar,","}),
+ add_func({decode_null,2});
+ 'OBJECT IDENTIFIER' ->
+ emit({"?RT_BER:decode_object_identifier(",BytesVar,","}),
+ add_func({decode_object_identifier,2});
+ 'ObjectDescriptor' ->
+ emit({"?RT_BER:decode_restricted_string(",
+ BytesVar,",",{asis,Constraint},",",{asis,?T_ObjectDescriptor},","}),
+ add_func({decode_restricted_string,4});
+ 'OCTET STRING' ->
+ emit({"?RT_BER:decode_octet_string",AsBin,"(",BytesVar,",",{asis,Constraint},","}),
+ add_func({decode_octet_string,3});
+ 'NumericString' ->
+ emit({"?RT_BER:decode_restricted_string",AsBin,"(",
+ BytesVar,",",{asis,Constraint},",",{asis,?T_NumericString},","}),
+ add_func({decode_restricted_string,4});
+ 'TeletexString' ->
+ emit({"?RT_BER:decode_restricted_string",AsBin,"(",
+ BytesVar,",",{asis,Constraint},",",{asis,?T_TeletexString},","}),
+ add_func({decode_restricted_string,4});
+ 'VideotexString' ->
+ emit({"?RT_BER:decode_restricted_string",AsBin,"(",
+ BytesVar,",",{asis,Constraint},",",{asis,?T_VideotexString},","}),
+ add_func({decode_restricted_string,4});
+ 'GraphicString' ->
+ emit({"?RT_BER:decode_restricted_string",AsBin,"(",
+ BytesVar,",",{asis,Constraint},",",{asis,?T_GraphicString},","}),
+ add_func({decode_restricted_string,4});
+ 'VisibleString' ->
+ emit({"?RT_BER:decode_restricted_string",AsBin,"(",
+ BytesVar,",",{asis,Constraint},",",{asis,?T_VisibleString},","}),
+ add_func({decode_restricted_string,4});
+ 'GeneralString' ->
+ emit({"?RT_BER:decode_restricted_string",AsBin,"(",
+ BytesVar,",",{asis,Constraint},",",{asis,?T_GeneralString},","}),
+ add_func({decode_restricted_string,4});
+ 'PrintableString' ->
+ emit({"?RT_BER:decode_restricted_string",AsBin,"(",
+ BytesVar,",",{asis,Constraint},",",{asis,?T_PrintableString},","}),
+ add_func({decode_restricted_string,4});
+ 'IA5String' ->
+ emit({"?RT_BER:decode_restricted_string",AsBin,"(",
+ BytesVar,",",{asis,Constraint},",",{asis,?T_IA5String},","}),
+ add_func({decode_restricted_string,4}) ;
+ 'UniversalString' ->
+ emit({"?RT_BER:decode_universal_string",AsBin,"(",
+ BytesVar,",",{asis,Constraint},","}),
+ add_func({decode_universal_string,3});
+ 'BMPString' ->
+ emit({"?RT_BER:decode_BMP_string",AsBin,"(",
+ BytesVar,",",{asis,Constraint},","}),
+ add_func({decode_BMP_string,3});
+ 'UTCTime' ->
+ emit({"?RT_BER:decode_utc_time",AsBin,"(",
+ BytesVar,",",{asis,Constraint},","}),
+ add_func({decode_utc_time,3});
+ 'GeneralizedTime' ->
+ emit({"?RT_BER:decode_generalized_time",AsBin,"(",
+ BytesVar,",",{asis,Constraint},","}),
+ add_func({decode_generalized_time,3});
+ 'ASN1_OPEN_TYPE' ->
+ emit(["?RT_BER:decode_open_type_as_binary(",
+ BytesVar,","]),
+ add_func({decode_open_type_as_binary,2});
+ Other ->
+ exit({'can not decode' ,Other})
+ end,
+
+ case {DoTag,NewTypeName} of
+ {{string,TagStr},'ASN1_OPEN_TYPE'} ->
+ emit([TagStr,")"]);
+ {_,'ASN1_OPEN_TYPE'} ->
+ emit([{asis,DoTag},")"]);
+ {{string,TagStr},_} ->
+ emit([TagStr,")"]);
+ _ when list(DoTag) ->
+ emit([{asis,DoTag},")"])
+ end.
+
+
+int_constr([],[]) ->
+ [];
+int_constr([],ValueRange) ->
+ ValueRange;
+int_constr(SingleValue,[]) ->
+ SingleValue;
+int_constr(SV,VR) ->
+ [SV,VR].
+
+%% Object code generating for encoding and decoding
+%% ------------------------------------------------
+
+gen_obj_code(Erules,_Module,Obj) when record(Obj,typedef) ->
+ ObjName = Obj#typedef.name,
+ Def = Obj#typedef.typespec,
+ #'Externaltypereference'{module=M,type=ClName} = Def#'Object'.classname,
+ Class = asn1_db:dbget(M,ClName),
+ {object,_,Fields} = Def#'Object'.def,
+ emit({nl,nl,nl,"%%================================"}),
+ emit({nl,"%% ",ObjName}),
+ emit({nl,"%%================================",nl}),
+ EncConstructed =
+ gen_encode_objectfields(ClName,get_class_fields(Class),
+ ObjName,Fields,[]),
+ emit(nl),
+ gen_encode_constr_type(Erules,EncConstructed),
+ emit(nl),
+ DecConstructed =
+ gen_decode_objectfields(ClName,get_class_fields(Class),
+ ObjName,Fields,[]),
+ emit(nl),
+ gen_decode_constr_type(Erules,DecConstructed),
+ emit_tlv_format_function();
+gen_obj_code(_Erules,_Module,Obj) when record(Obj,pobjectdef) ->
+ ok.
+
+gen_encode_objectfields(ClassName,[{typefield,Name,OptOrMand}|Rest],
+ ObjName,ObjectFields,ConstrAcc) ->
+ EmitFuncClause =
+ fun(Arg) ->
+ emit(["'enc_",ObjName,"'(",{asis,Name},
+ ", ",Arg,", _RestPrimFieldName) ->",nl])
+ end,
+% emit(["'enc_",ObjName,"'(",{asis,Name},
+% ", Val, RestPrimFieldName) ->",nl]),
+ MaybeConstr=
+ case {get_object_field(Name,ObjectFields),OptOrMand} of
+ {false,'MANDATORY'} -> %% this case is illegal
+ exit({error,{asn1,{"missing mandatory field in object",
+ ObjName}}});
+ {false,'OPTIONAL'} ->
+ EmitFuncClause("_"),
+ emit([" {<<>>,0}"]),
+ [];
+ {false,{'DEFAULT',DefaultType}} ->
+ EmitFuncClause("Val"),
+ gen_encode_default_call(ClassName,Name,DefaultType);
+ {{Name,TypeSpec},_} ->
+ %% A specified field owerwrites any 'DEFAULT' or
+ %% 'OPTIONAL' field in the class
+ EmitFuncClause("Val"),
+ gen_encode_field_call(ObjName,Name,TypeSpec)
+ end,
+ case more_genfields(Rest) of
+ true ->
+ emit([";",nl]);
+ false ->
+ emit([".",nl])
+ end,
+ gen_encode_objectfields(ClassName,Rest,ObjName,ObjectFields,
+ MaybeConstr++ConstrAcc);
+gen_encode_objectfields(ClassName,[{objectfield,Name,_,_,OptOrMand}|Rest],
+ ObjName,ObjectFields,ConstrAcc) ->
+ EmitFuncClause =
+ fun(Args) ->
+ emit(["'enc_",ObjName,"'(",{asis,Name},
+ ", ",Args,") ->",nl])
+ end,
+% emit(["'enc_",ObjName,"'(",{asis,Name},
+% ", Val,[H|T]) ->",nl]),
+ case {get_object_field(Name,ObjectFields),OptOrMand} of
+ {false,'MANDATORY'} ->
+ exit({error,{asn1,{"missing mandatory field in object",
+ ObjName}}});
+ {false,'OPTIONAL'} ->
+ EmitFuncClause("_,_"),
+ emit([" exit({error,{'use of missing field in object', ",Name,
+ "}})"]);
+ {false,{'DEFAULT',_DefaultObject}} ->
+ exit({error,{asn1,{"not implemented yet",Name}}});
+ {{Name,TypeSpec},_} ->
+ EmitFuncClause(" Val, [H|T]"),
+ case TypeSpec#typedef.name of
+ {ExtMod,TypeName} ->
+ emit({indent(3),"'",ExtMod,"':'enc_",TypeName,
+ "'(H, Val, T)"});
+ TypeName ->
+ emit({indent(3),"'enc_",TypeName,"'(H, Val, T)"})
+ end
+ end,
+ case more_genfields(Rest) of
+ true ->
+ emit([";",nl]);
+ false ->
+ emit([".",nl])
+ end,
+ gen_encode_objectfields(ClassName,Rest,ObjName,ObjectFields,ConstrAcc);
+
+% gen_encode_objectfields(Class,ObjName,[{FieldName,Type}|Rest],ConstrAcc) ->
+% Fields = Class#objectclass.fields,
+% MaybeConstr=
+% case is_typefield(Fields,FieldName) of
+% true ->
+% Def = Type#typedef.typespec,
+% emit({"'enc_",ObjName,"'(",{asis,FieldName},
+% ", Val, RestPrimFieldName) ->",nl}),
+% CAcc=
+% case Type#typedef.name of
+% {primitive,bif} -> %%tag should be the primitive tag
+% OTag = Def#type.tag,
+% Tag = [encode_tag_val(decode_class(X#tag.class),
+% X#tag.form,X#tag.number)||
+% X <- OTag],
+% gen_encode_prim(ber,Def,{asis,lists:reverse(Tag)},
+% "Val"),
+% [];
+% {constructed,bif} ->
+% emit({" 'enc_",ObjName,'_',FieldName,
+% "'(Val)"}),
+% [Type#typedef{name=list_to_atom(lists:concat([ObjName,'_',FieldName]))}];
+% {ExtMod,TypeName} ->
+% emit({" '",ExtMod,"':'enc_",TypeName,
+% "'(Val)"}),
+% [];
+% TypeName ->
+% emit({" 'enc_",TypeName,"'(Val)"}),
+% []
+% end,
+% case more_genfields(Fields,Rest) of
+% true ->
+% emit({";",nl});
+% false ->
+% emit({".",nl})
+% end,
+% CAcc;
+% {false,objectfield} ->
+% emit({"'enc_",ObjName,"'(",{asis,FieldName},
+% ", Val,[H|T]) ->",nl}),
+% case Type#typedef.name of
+% {ExtMod,TypeName} ->
+% emit({indent(3),"'",ExtMod,"':'enc_",TypeName,
+% "'(H, Val, T)"});
+% TypeName ->
+% emit({indent(3),"'enc_",TypeName,"'(H, Val, T)"})
+% end,
+% case more_genfields(Fields,Rest) of
+% true ->
+% emit({";",nl});
+% false ->
+% emit({".",nl})
+% end,
+% [];
+% {false,_} -> []
+% end,
+% gen_encode_objectfields(Class,ObjName,Rest,MaybeConstr ++ ConstrAcc);
+gen_encode_objectfields(ClassName,[_C|Cs],O,OF,Acc) ->
+ gen_encode_objectfields(ClassName,Cs,O,OF,Acc);
+gen_encode_objectfields(_,[],_,_,Acc) ->
+ Acc.
+
+% gen_encode_constr_type(Erules,[{Name,Def}|Rest]) ->
+% emit({Name,"(Val,TagIn) ->",nl}),
+% InnerType = asn1ct_gen:get_inner(Def#type.def),
+% asn1ct_gen:gen_encode_constructed(Erules,Name,InnerType,Def),
+% gen_encode_constr_type(Erules,Rest);
+gen_encode_constr_type(Erules,[TypeDef|Rest]) when record(TypeDef,typedef) ->
+ case is_already_generated(enc,TypeDef#typedef.name) of
+ true -> ok;
+ _ -> gen_encode_user(Erules,TypeDef)
+ end,
+ gen_encode_constr_type(Erules,Rest);
+gen_encode_constr_type(_,[]) ->
+ ok.
+
+gen_encode_field_call(ObjName,FieldName,Type) ->
+ Def = Type#typedef.typespec,
+ OTag = Def#type.tag,
+ Tag = [encode_tag_val(decode_class(X#tag.class),
+ X#tag.form,X#tag.number)||
+ X <- OTag],
+ case Type#typedef.name of
+ {primitive,bif} -> %%tag should be the primitive tag
+% OTag = Def#type.tag,
+% Tag = [encode_tag_val(decode_class(X#tag.class),
+% X#tag.form,X#tag.number)||
+% X <- OTag],
+ gen_encode_prim(ber,Def,{asis,lists:reverse(Tag)},
+ "Val"),
+ [];
+ {constructed,bif} ->
+ emit({" 'enc_",ObjName,'_',FieldName,
+ "'(Val,",{asis,Tag},")"}),
+ [Type#typedef{name=list_to_atom(lists:concat([ObjName,'_',FieldName]))}];
+ {ExtMod,TypeName} ->
+ emit({" '",ExtMod,"':'enc_",TypeName,
+ "'(Val,",{asis,Tag},")"}),
+ [];
+ TypeName ->
+ emit({" 'enc_",TypeName,"'(Val,",{asis,Tag},")"}),
+ []
+ end.
+
+gen_encode_default_call(ClassName,FieldName,Type) ->
+ CurrentMod = get(currmod),
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ OTag = Type#type.tag,
+ Tag = [encode_tag_val(decode_class(X#tag.class),X#tag.form,X#tag.number)|| X <- OTag],
+ case asn1ct_gen:type(InnerType) of
+ {constructed,bif} ->
+%% asn1ct_gen:gen_encode_constructed(Erules,Typename,InnerType,Type);
+ emit([" 'enc_",ClassName,'_',FieldName,"'(Bytes)"]),
+ [#typedef{name=list_to_atom(lists:concat([ClassName,'_',FieldName])),
+ typespec=Type}];
+ {primitive,bif} ->
+ gen_encode_prim(ber,Type,{asis,lists:reverse(Tag)},"Val"),
+ [];
+ #'Externaltypereference'{module=CurrentMod,type=Etype} ->
+ emit([" 'enc_",Etype,"'(Val, ",{asis,Tag},")",nl]),
+ [];
+ #'Externaltypereference'{module=Emod,type=Etype} ->
+ emit([" '",Emod,"':'enc_",Etype,"'(Val, ",{asis,Tag},")",nl]),
+ []
+% 'ASN1_OPEN_TYPE' ->
+% emit(["%% OPEN TYPE",nl]),
+% gen_encode_prim(ber,
+% Type#type{def='ASN1_OPEN_TYPE'},
+% "TagIn","Val"),
+% emit([".",nl])
+ end.
+
+%%%%%%%%%%%%%%%%
+
+gen_decode_objectfields(ClassName,[{typefield,Name,OptOrMand}|Rest],
+ ObjName,ObjectFields,ConstrAcc) ->
+ EmitFuncClause =
+ fun(Arg) ->
+ emit(["'dec_",ObjName,"'(",{asis,Name},
+ ", ",Arg,",_) ->",nl])
+ end,
+% emit(["'dec_",ObjName,"'(",{asis,Name},
+% ", Bytes, RestPrimFieldName) ->",nl]),
+ MaybeConstr=
+ case {get_object_field(Name,ObjectFields),OptOrMand} of
+ {false,'MANDATORY'} -> %% this case is illegal
+ exit({error,{asn1,{"missing mandatory field in object",
+ ObjName}}});
+ {false,'OPTIONAL'} ->
+ EmitFuncClause(" _"),
+ emit([" asn1_NOVALUE"]),
+ [];
+ {false,{'DEFAULT',DefaultType}} ->
+ EmitFuncClause("Bytes"),
+ emit_tlv_format("Bytes"),
+ gen_decode_default_call(ClassName,Name,"Tlv",DefaultType);
+ {{Name,TypeSpec},_} ->
+ %% A specified field owerwrites any 'DEFAULT' or
+ %% 'OPTIONAL' field in the class
+ EmitFuncClause("Bytes"),
+ emit_tlv_format("Bytes"),
+ gen_decode_field_call(ObjName,Name,"Tlv",TypeSpec)
+ end,
+ case more_genfields(Rest) of
+ true ->
+ emit([";",nl]);
+ false ->
+ emit([".",nl])
+ end,
+ gen_decode_objectfields(ClassName,Rest,ObjName,ObjectFields,MaybeConstr++ConstrAcc);
+gen_decode_objectfields(ClassName,[{objectfield,Name,_,_,OptOrMand}|Rest],
+ ObjName,ObjectFields,ConstrAcc) ->
+ EmitFuncClause =
+ fun(Args) ->
+ emit(["'dec_",ObjName,"'(",{asis,Name},
+ ", ",Args,") ->",nl])
+ end,
+% emit(["'dec_",ObjName,"'(",{asis,Name},
+% ", Bytes,[H|T]) ->",nl]),
+% emit_tlv_format("Bytes"),
+ case {get_object_field(Name,ObjectFields),OptOrMand} of
+ {false,'MANDATORY'} ->
+ exit({error,{asn1,{"missing mandatory field in object",
+ ObjName}}});
+ {false,'OPTIONAL'} ->
+ EmitFuncClause("_,_"),
+ emit([" exit({error,{'illegal use of missing field in object', ",Name,
+ "}})"]);
+ {false,{'DEFAULT',_DefaultObject}} ->
+ exit({error,{asn1,{"not implemented yet",Name}}});
+ {{Name,TypeSpec},_} ->
+ EmitFuncClause("Bytes,[H|T]"),
+% emit_tlv_format("Bytes"),
+ case TypeSpec#typedef.name of
+ {ExtMod,TypeName} ->
+ emit({indent(3),"'",ExtMod,"':'dec_",TypeName,
+ "'(H, Bytes, T)"});
+ TypeName ->
+ emit({indent(3),"'dec_",TypeName,"'(H, Bytes, T)"})
+ end
+ end,
+ case more_genfields(Rest) of
+ true ->
+ emit([";",nl]);
+ false ->
+ emit([".",nl])
+ end,
+ gen_decode_objectfields(ClassName,Rest,ObjName,ObjectFields,ConstrAcc);
+gen_decode_objectfields(CN,[_C|Cs],O,OF,CAcc) ->
+ gen_decode_objectfields(CN,Cs,O,OF,CAcc);
+gen_decode_objectfields(_,[],_,_,CAcc) ->
+ CAcc.
+
+emit_tlv_format(Bytes) ->
+ notice_tlv_format_gen(), % notice for generating of tlv_format/1
+ emit([" Tlv = tlv_format(",Bytes,"),",nl]).
+
+notice_tlv_format_gen() ->
+ Module = get(currmod),
+% io:format("Noticed: ~p~n",[Module]),
+ case get(tlv_format) of
+ {done,Module} ->
+ ok;
+ _ -> % true or undefined
+ put(tlv_format,true)
+ end.
+
+emit_tlv_format_function() ->
+ Module = get(currmod),
+% io:format("Tlv formated: ~p",[Module]),
+ case get(tlv_format) of
+ true ->
+% io:format(" YES!~n"),
+ emit_tlv_format_function1(),
+ put(tlv_format,{done,Module});
+ _ ->
+% io:format(" NO!~n"),
+ ok
+ end.
+emit_tlv_format_function1() ->
+ emit(["tlv_format(Bytes) when binary(Bytes) ->",nl,
+ " {Tlv,_}=?RT_BER:decode(Bytes),",nl,
+ " Tlv;",nl,
+ "tlv_format(Bytes) ->",nl,
+ " Bytes.",nl]).
+
+
+gen_decode_constr_type(Erules,[{Name,Def}|Rest]) ->
+ emit([Name,"(Tlv, TagIn) ->",nl]),
+ InnerType = asn1ct_gen:get_inner(Def#type.def),
+ asn1ct_gen:gen_decode_constructed(Erules,Name,InnerType,Def),
+ gen_decode_constr_type(Erules,Rest);
+gen_decode_constr_type(Erules,[TypeDef|Rest]) when record(TypeDef,typedef) ->
+ case is_already_generated(dec,TypeDef#typedef.name) of
+ true -> ok;
+ _ ->
+ gen_decode(Erules,TypeDef)
+ end,
+ gen_decode_constr_type(Erules,Rest);
+gen_decode_constr_type(_,[]) ->
+ ok.
+
+%%%%%%%%%%%
+gen_decode_field_call(ObjName,FieldName,Bytes,Type) ->
+ Def = Type#typedef.typespec,
+ OTag = Def#type.tag,
+ Tag = [(decode_class(X#tag.class) bsl 10) + X#tag.number ||
+ X <- OTag],
+ case Type#typedef.name of
+ {primitive,bif} -> %%tag should be the primitive tag
+ gen_dec_prim(ber,Def,Bytes,Tag,"TagIn",?PRIMITIVE,
+ opt_or_default),
+ [];
+ {constructed,bif} ->
+ emit({" 'dec_",ObjName,'_',FieldName,
+ "'(",Bytes,",",{asis,Tag},")"}),
+ [Type#typedef{name=list_to_atom(lists:concat([ObjName,'_',FieldName]))}];
+ {ExtMod,TypeName} ->
+ emit({" '",ExtMod,"':'dec_",TypeName,
+ "'(",Bytes,",",{asis,Tag},")"}),
+ [];
+ TypeName ->
+ emit({" 'dec_",TypeName,"'(",Bytes,",",{asis,Tag},")"}),
+ []
+ end.
+
+gen_decode_default_call(ClassName,FieldName,Bytes,Type) ->
+ CurrentMod = get(currmod),
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ OTag = Type#type.tag,
+ Tag = [(decode_class(X#tag.class) bsl 10) + X#tag.number || X <- OTag],
+ case asn1ct_gen:type(InnerType) of
+ {constructed,bif} ->
+ emit([" 'dec_",ClassName,'_',FieldName,"'(",Bytes,",",
+ {asis,Tag},")"]),
+ [#typedef{name=list_to_atom(lists:concat([ClassName,'_',
+ FieldName])),
+ typespec=Type}];
+ {primitive,bif} ->
+ gen_dec_prim(ber,Type,Bytes,Tag,"TagIn",
+ ?PRIMITIVE,opt_or_default),
+ [];
+ #'Externaltypereference'{module=CurrentMod,type=Etype} ->
+ emit([" 'dec_",Etype,"'(",Bytes, " ,",{asis,Tag},")",nl]),
+ [];
+ #'Externaltypereference'{module=Emod,type=Etype} ->
+ emit([" '",Emod,"':'dec_",Etype,"'(",Bytes,", ",
+ {asis,Tag},")",nl]),
+ []
+% 'ASN1_OPEN_TYPE' ->
+% emit(["%% OPEN TYPE",nl]),
+% gen_encode_prim(ber,
+% Type#type{def='ASN1_OPEN_TYPE'},
+% "TagIn","Val"),
+% emit([".",nl])
+ end.
+%%%%%%%%%%%
+
+is_already_generated(Operation,Name) ->
+ case get(class_default_type) of
+ undefined ->
+ put(class_default_type,[{Operation,Name}]),
+ false;
+ GeneratedList ->
+ case lists:member({Operation,Name},GeneratedList) of
+ true ->
+ true;
+ false ->
+ put(class_default_type,[{Operation,Name}|GeneratedList]),
+ false
+ end
+ end.
+
+more_genfields([]) ->
+ false;
+more_genfields([Field|Fields]) ->
+ case element(1,Field) of
+ typefield ->
+ true;
+ objectfield ->
+ true;
+ _ ->
+ more_genfields(Fields)
+ end.
+
+
+
+
+%% Object Set code generating for encoding and decoding
+%% ----------------------------------------------------
+gen_objectset_code(Erules,ObjSet) ->
+ ObjSetName = ObjSet#typedef.name,
+ Def = ObjSet#typedef.typespec,
+% {ClassName,ClassDef} = Def#'ObjectSet'.class,
+ #'Externaltypereference'{module=ClassModule,
+ type=ClassName} = Def#'ObjectSet'.class,
+ ClassDef = asn1_db:dbget(ClassModule,ClassName),
+ UniqueFName = Def#'ObjectSet'.uniquefname,
+ Set = Def#'ObjectSet'.set,
+ emit({nl,nl,nl,"%%================================"}),
+ emit({nl,"%% ",ObjSetName}),
+ emit({nl,"%%================================",nl}),
+ case ClassName of
+ {_Module,ExtClassName} ->
+ gen_objset_code(Erules,ObjSetName,UniqueFName,Set,ExtClassName,ClassDef);
+ _ ->
+ gen_objset_code(Erules,ObjSetName,UniqueFName,Set,ClassName,ClassDef)
+ end,
+ emit(nl).
+
+gen_objset_code(Erules,ObjSetName,UniqueFName,Set,ClassName,ClassDef)->
+ ClassFields = get_class_fields(ClassDef),
+ InternalFuncs=gen_objset_enc(Erules,ObjSetName,UniqueFName,Set,
+ ClassName,ClassFields,1,[]),
+ gen_objset_dec(Erules,ObjSetName,UniqueFName,Set,ClassName,ClassFields,1),
+ gen_internal_funcs(Erules,InternalFuncs).
+
+%% gen_objset_enc iterates over the objects of the object set
+gen_objset_enc(_,_,{unique,undefined},_,_,_,_,_) ->
+ %% There is no unique field in the class of this object set
+ %% don't bother about the constraint
+ [];
+gen_objset_enc(Erules,ObjSName,UniqueName,
+ [{ObjName,Val,Fields},T|Rest],ClName,ClFields,
+ NthObj,Acc)->
+ emit({"'getenc_",ObjSName,"'(",{asis,UniqueName},",",{asis,Val},
+ ") ->",nl}),
+ {InternalFunc,NewNthObj}=
+ case ObjName of
+ no_name ->
+ gen_inlined_enc_funs(Fields,ClFields,ObjSName,NthObj);
+ _ ->
+ emit({" fun 'enc_",ObjName,"'/3"}),
+ {[],NthObj}
+ end,
+ emit({";",nl}),
+ gen_objset_enc(Erules,ObjSName,UniqueName,[T|Rest],ClName,ClFields,
+ NewNthObj,InternalFunc ++ Acc);
+gen_objset_enc(_,ObjSetName,UniqueName,
+ [{ObjName,Val,Fields}],_ClName,ClFields,NthObj,Acc) ->
+ emit({"'getenc_",ObjSetName,"'(",{asis,UniqueName},",",
+ {asis,Val},") ->",nl}),
+ {InternalFunc,_} =
+ case ObjName of
+ no_name ->
+ gen_inlined_enc_funs(Fields,ClFields,ObjSetName,NthObj);
+ _ ->
+ emit({" fun 'enc_",ObjName,"'/3"}),
+ {[],NthObj}
+ end,
+ emit({".",nl,nl}),
+ InternalFunc ++ Acc;
+%% See X.681 Annex E for the following case
+gen_objset_enc(_,ObjSetName,_UniqueName,['EXTENSIONMARK'],_ClName,
+ _ClFields,_NthObj,Acc) ->
+ emit({"'getenc_",ObjSetName,"'(_, _) ->",nl}),
+ emit({indent(3),"fun(_, Val, _RestPrimFieldName) ->",nl}),
+ emit({indent(6),"Len = case Val of",nl,indent(9),
+ "Bin when binary(Bin) -> size(Bin);",nl,indent(9),
+ "_ -> length(Val)",nl,indent(6),"end,"}),
+ emit({indent(6),"{Val,Len}",nl}),
+ emit({indent(3),"end.",nl,nl}),
+ Acc;
+gen_objset_enc(_,_,_,[],_,_,_,Acc) ->
+ Acc.
+
+%% gen_inlined_enc_funs for each object iterates over all fields of a
+%% class, and for each typefield it checks if the object has that
+%% field and emits the proper code.
+gen_inlined_enc_funs(Fields,[{typefield,Name,_}|Rest],
+ ObjSetName,NthObj) ->
+ InternalDefFunName = asn1ct_gen:list2name([NthObj,Name,ObjSetName]),
+ case lists:keysearch(Name,1,Fields) of
+ {value,{_,Type}} when record(Type,type) ->
+ emit({indent(3),"fun(Type, Val, _RestPrimFieldName) ->",nl,
+ indent(6),"case Type of",nl}),
+ {Ret,N}=emit_inner_of_fun(Type,InternalDefFunName),
+ gen_inlined_enc_funs1(Fields,Rest,ObjSetName,NthObj+N,Ret);
+ {value,{_,Type}} when record(Type,typedef) ->
+ emit({indent(3),"fun(Type, Val, _RestPrimFieldName) ->",nl,
+ indent(6),"case Type of",nl}),
+ emit({indent(9),{asis,Name}," ->",nl}),
+ {Ret,N}=emit_inner_of_fun(Type,InternalDefFunName),
+ gen_inlined_enc_funs1(Fields,Rest,ObjSetName,NthObj+N,Ret);
+ false ->
+ gen_inlined_enc_funs(Fields,Rest,ObjSetName,NthObj)
+ end;
+gen_inlined_enc_funs(Fields,[_|Rest],ObjSetName,NthObj) ->
+ gen_inlined_enc_funs(Fields,Rest,ObjSetName,NthObj);
+gen_inlined_enc_funs(_,[],_,NthObj) ->
+ {[],NthObj}.
+
+gen_inlined_enc_funs1(Fields,[{typefield,Name,_}|Rest],ObjSetName,
+ NthObj,Acc) ->
+ InternalDefFunName = asn1ct_gen:list2name([NthObj,Name,ObjSetName]),
+ {Acc2,NAdd}=
+ case lists:keysearch(Name,1,Fields) of
+ {value,{_,Type}} when record(Type,type) ->
+ emit({";",nl}),
+ {Ret,N}=emit_inner_of_fun(Type,InternalDefFunName),
+ {Ret++Acc,N};
+ {value,{_,Type}} when record(Type,typedef) ->
+ emit({";",nl,indent(9),{asis,Name}," ->",nl}),
+ {Ret,N}=emit_inner_of_fun(Type,InternalDefFunName),
+ {Ret++Acc,N};
+ false ->
+ {Acc,0}
+ end,
+ gen_inlined_enc_funs1(Fields,Rest,ObjSetName,NthObj+NAdd,Acc2);
+gen_inlined_enc_funs1(Fields,[_|Rest],ObjSetName,NthObj,Acc)->
+ gen_inlined_enc_funs1(Fields,Rest,ObjSetName,NthObj,Acc);
+gen_inlined_enc_funs1(_,[],_,NthObj,Acc) ->
+ emit({nl,indent(6),"end",nl}),
+ emit({indent(3),"end"}),
+ {Acc,NthObj}.
+
+emit_inner_of_fun(TDef=#typedef{name={ExtMod,Name},typespec=Type},
+ InternalDefFunName) ->
+ OTag = Type#type.tag,
+ Tag = [encode_tag_val(decode_class(X#tag.class),X#tag.form,X#tag.number)|| X <- OTag],
+% remove Tag = [X#tag{class=decode_class(X#tag.class)}|| X <- OTag],
+ case {ExtMod,Name} of
+ {primitive,bif} ->
+ emit(indent(12)),
+ gen_encode_prim(ber,Type,[{asis,lists:reverse(Tag)}],"Val"),
+ {[],0};
+ {constructed,bif} ->
+ emit([indent(12),"'enc_",
+ InternalDefFunName,"'(Val)"]),
+ {[TDef#typedef{name=InternalDefFunName}],1};
+ _ ->
+ emit({indent(12),"'",ExtMod,"':'enc_",Name,"'(Val)"}),
+ {[],0}
+ end;
+emit_inner_of_fun(#typedef{name=Name},_) ->
+% OTag = Type#type.tag,
+% remove Tag = [X#tag{class=decode_class(X#tag.class)}|| X <- OTag],
+% Tag = [encode_tag_val(decode_class(X#tag.class),X#tag.form,X#tag.number)|| X <- OTag],
+ emit({indent(12),"'enc_",Name,"'(Val)"}),
+ {[],0};
+emit_inner_of_fun(Type,_) when record(Type,type) ->
+ CurrMod = get(currmod),
+% OTag = Type#type.tag,
+% remove Tag = [X#tag{class=decode_class(X#tag.class)}|| X <- OTag],
+% Tag = [encode_tag_val(decode_class(X#tag.class),X#tag.form,X#tag.number)|| X <- OTag],
+ case Type#type.def of
+ Def when atom(Def) ->
+ OTag = Type#type.tag,
+ Tag = [encode_tag_val(decode_class(X#tag.class),
+ X#tag.form,X#tag.number)||X <- OTag],
+ emit([indent(9),Def," ->",nl,indent(12)]),
+ gen_encode_prim(ber,Type,{asis,lists:reverse(Tag)},"Val");
+ TRef when record(TRef,typereference) ->
+ T = TRef#typereference.val,
+ emit([indent(9),T," ->",nl,indent(12),"'enc_",T,
+ "'(Val)"]);
+ #'Externaltypereference'{module=CurrMod,type=T} ->
+ emit([indent(9),T," ->",nl,indent(12),"'enc_",T,
+ "'(Val)"]);
+ #'Externaltypereference'{module=ExtMod,type=T} ->
+ emit([indent(9),T," ->",nl,indent(12),ExtMod,":'enc_",
+ T,"'(Val)"])
+ end,
+ {[],0}.
+
+indent(N) ->
+ lists:duplicate(N,32). % 32 = space
+
+
+gen_objset_dec(_,_,{unique,undefined},_,_,_,_) ->
+ %% There is no unique field in the class of this object set
+ %% don't bother about the constraint
+ ok;
+gen_objset_dec(Erules,ObjSName,UniqueName,[{ObjName,Val,Fields},T|Rest],
+ ClName,ClFields,NthObj)->
+ emit(["'getdec_",ObjSName,"'(",{asis,UniqueName},",",
+ {asis,Val},") ->",nl]),
+ NewNthObj=
+ case ObjName of
+ no_name ->
+ gen_inlined_dec_funs(Fields,ClFields,ObjSName,NthObj);
+ _ ->
+ emit([" fun 'dec_",ObjName,"'/3"]),
+ NthObj
+ end,
+ emit([";",nl]),
+ gen_objset_dec(Erules,ObjSName,UniqueName,[T|Rest],ClName,
+ ClFields,NewNthObj);
+gen_objset_dec(_,ObjSetName,UniqueName,[{ObjName,Val,Fields}],
+ _ClName,ClFields,NthObj) ->
+ emit(["'getdec_",ObjSetName,"'(",{asis,UniqueName},",",
+ {asis,Val},") ->",nl]),
+ case ObjName of
+ no_name ->
+ gen_inlined_dec_funs(Fields,ClFields,ObjSetName,NthObj);
+ _ ->
+ emit([" fun 'dec_",ObjName,"'/3"])
+ end,
+ emit([".",nl,nl]),
+ ok;
+gen_objset_dec(Erules,ObjSetName,_UniqueName,['EXTENSIONMARK'],_ClName,
+ _ClFields,_NthObj) ->
+ emit(["'getdec_",ObjSetName,"'(_, _) ->",nl]),
+ emit([indent(2),"fun(_,Bytes, _RestPrimFieldName) ->",nl]),
+ case Erules of
+ ber_bin_v2 ->
+ emit([indent(4),"case Bytes of",nl,
+ indent(6),"Bin when binary(Bin) -> ",nl,
+ indent(8),"Bin;",nl,
+ indent(6),"_ ->",nl,
+ indent(8),"?RT_BER:encode(Bytes)",nl,
+ indent(4),"end",nl]);
+ _ ->
+ emit([indent(6),"Len = case Bytes of",nl,indent(9),
+ "Bin when binary(Bin) -> size(Bin);",nl,indent(9),
+ "_ -> length(Bytes)",nl,indent(6),"end,"]),
+ emit([indent(4),"{Bytes,[],Len}",nl])
+ end,
+ emit([indent(2),"end.",nl,nl]),
+ ok;
+gen_objset_dec(_,_,_,[],_,_,_) ->
+ ok.
+
+gen_inlined_dec_funs(Fields,[{typefield,Name,Prop}|Rest],
+ ObjSetName,NthObj) ->
+ DecProp = case Prop of
+ 'OPTIONAL' -> opt_or_default;
+ {'DEFAULT',_} -> opt_or_default;
+ _ -> mandatory
+ end,
+ InternalDefFunName = [NthObj,Name,ObjSetName],
+ case lists:keysearch(Name,1,Fields) of
+ {value,{_,Type}} when record(Type,type) ->
+ emit([indent(3),"fun(Type, Bytes, _RestPrimFieldName) ->",
+ nl,indent(6),"case Type of",nl]),
+ N=emit_inner_of_decfun(Type,DecProp,InternalDefFunName),
+ gen_inlined_dec_funs1(Fields,Rest,ObjSetName,NthObj+N);
+ {value,{_,Type}} when record(Type,typedef) ->
+ emit([indent(3),"fun(Type, Bytes, _RestPrimFieldName) ->",
+ nl,indent(6),"case Type of",nl]),
+ emit([indent(9),{asis,Name}," ->",nl]),
+ N=emit_inner_of_decfun(Type,DecProp,InternalDefFunName),
+ gen_inlined_dec_funs1(Fields,Rest,ObjSetName,NthObj+N);
+ false ->
+ gen_inlined_dec_funs(Fields,Rest,ObjSetName,NthObj)
+ end;
+gen_inlined_dec_funs(Fields,[_H|Rest],ObjSetName,NthObj) ->
+ gen_inlined_dec_funs(Fields,Rest,ObjSetName,NthObj);
+gen_inlined_dec_funs(_,[],_,NthObj) ->
+ NthObj.
+
+gen_inlined_dec_funs1(Fields,[{typefield,Name,Prop}|Rest],
+ ObjSetName,NthObj) ->
+ DecProp = case Prop of
+ 'OPTIONAL' -> opt_or_default;
+ {'DEFAULT',_} -> opt_or_default;
+ _ -> mandatory
+ end,
+ InternalDefFunName = [NthObj,Name,ObjSetName],
+ N=
+ case lists:keysearch(Name,1,Fields) of
+ {value,{_,Type}} when record(Type,type) ->
+ emit([";",nl]),
+ emit_inner_of_decfun(Type,DecProp,InternalDefFunName);
+ {value,{_,Type}} when record(Type,typedef) ->
+ emit([";",nl,indent(9),{asis,Name}," ->",nl]),
+ emit_inner_of_decfun(Type,DecProp,InternalDefFunName);
+ false ->
+ 0
+ end,
+ gen_inlined_dec_funs1(Fields,Rest,ObjSetName,NthObj+N);
+gen_inlined_dec_funs1(Fields,[_|Rest],ObjSetName,NthObj)->
+ gen_inlined_dec_funs1(Fields,Rest,ObjSetName,NthObj);
+gen_inlined_dec_funs1(_,[],_,NthObj) ->
+ emit([nl,indent(6),"end",nl]),
+ emit([indent(3),"end"]),
+ NthObj.
+
+emit_inner_of_decfun(#typedef{name={ExtName,Name},typespec=Type},Prop,
+ InternalDefFunName) ->
+ OTag = Type#type.tag,
+%% Tag = [X#tag{class=decode_class(X#tag.class)}|| X <- OTag],
+ Tag = [(decode_class(X#tag.class) bsl 10) + X#tag.number || X <- OTag],
+ case {ExtName,Name} of
+ {primitive,bif} ->
+ emit(indent(12)),
+ gen_dec_prim(ber,Type,"Bytes",Tag,"TagIn",
+ ?PRIMITIVE,Prop),
+ 0;
+ {constructed,bif} ->
+ emit([indent(12),"'dec_",
+% asn1ct_gen:list2name(InternalDefFunName),"'(Bytes, ",Prop,
+% ", ",{asis,Tag},")"]),
+ asn1ct_gen:list2name(InternalDefFunName),"'(Bytes, ",
+ {asis,Tag},")"]),
+ 1;
+ _ ->
+ emit([indent(12),"'",ExtName,"':'dec_",Name,"'(Bytes)"]),
+ 0
+ end;
+emit_inner_of_decfun(#typedef{name=Name},_Prop,_) ->
+ emit([indent(12),"'dec_",Name,"'(Bytes)"]),
+ 0;
+emit_inner_of_decfun(Type,Prop,_) when record(Type,type) ->
+ OTag = Type#type.tag,
+%% Tag = [X#tag{class=decode_class(X#tag.class)}|| X <- OTag],
+ Tag = [(decode_class(X#tag.class) bsl 10) + X#tag.number || X <- OTag],
+ CurrMod = get(currmod),
+ Def = Type#type.def,
+ InnerType = asn1ct_gen:get_inner(Def),
+ WhatKind = asn1ct_gen:type(InnerType),
+ case WhatKind of
+ {primitive,bif} ->
+ emit([indent(9),Def," ->",nl,indent(12)]),
+ gen_dec_prim(ber,Type,"Bytes",Tag,"TagIn",
+ ?PRIMITIVE,Prop);
+ #'Externaltypereference'{module=CurrMod,type=T} ->
+ emit([indent(9),T," ->",nl,indent(12),"'dec_",T,
+% "'(Bytes, ",Prop,")"]);
+ "'(Bytes)"]);
+ #'Externaltypereference'{module=ExtMod,type=T} ->
+ emit([indent(9),T," ->",nl,indent(12),ExtMod,":'dec_",
+% T,"'(Bytes, ",Prop,")"])
+ T,"'(Bytes)"])
+ end,
+ 0.
+
+gen_internal_funcs(_,[]) ->
+ ok;
+gen_internal_funcs(Erules,[TypeDef|Rest]) ->
+ gen_encode_user(Erules,TypeDef),
+ emit([nl,nl,"'dec_",TypeDef#typedef.name,
+% "'(Tlv, OptOrMand, TagIn) ->",nl]),
+ "'(Tlv, TagIn) ->",nl]),
+ gen_decode_user(Erules,TypeDef),
+ gen_internal_funcs(Erules,Rest).
+
+
+dbdec(Type) ->
+ demit({"io:format(\"decoding: ",{asis,Type},"~w~n\",[Bytes]),",nl}).
+
+
+decode_class('UNIVERSAL') ->
+ ?UNIVERSAL;
+decode_class('APPLICATION') ->
+ ?APPLICATION;
+decode_class('CONTEXT') ->
+ ?CONTEXT;
+decode_class('PRIVATE') ->
+ ?PRIVATE.
+
+decode_type('BOOLEAN') -> 1;
+decode_type('INTEGER') -> 2;
+decode_type('BIT STRING') -> 3;
+decode_type('OCTET STRING') -> 4;
+decode_type('NULL') -> 5;
+decode_type('OBJECT IDENTIFIER') -> 6;
+decode_type('OBJECT DESCRIPTOR') -> 7;
+decode_type('EXTERNAL') -> 8;
+decode_type('REAL') -> 9;
+decode_type('ENUMERATED') -> 10;
+decode_type('EMBEDDED_PDV') -> 11;
+decode_type('SEQUENCE') -> 16;
+decode_type('SEQUENCE OF') -> 16;
+decode_type('SET') -> 17;
+decode_type('SET OF') -> 17;
+decode_type('NumericString') -> 18;
+decode_type('PrintableString') -> 19;
+decode_type('TeletexString') -> 20;
+decode_type('VideotexString') -> 21;
+decode_type('IA5String') -> 22;
+decode_type('UTCTime') -> 23;
+decode_type('GeneralizedTime') -> 24;
+decode_type('GraphicString') -> 25;
+decode_type('VisibleString') -> 26;
+decode_type('GeneralString') -> 27;
+decode_type('UniversalString') -> 28;
+decode_type('BMPString') -> 30;
+decode_type('CHOICE') -> 'CHOICE'; % choice gets the tag from the actual alternative
+decode_type(Else) -> exit({error,{asn1,{unrecognized_type,Else}}}).
+
+add_removed_bytes() ->
+ asn1ct_name:delete(rb),
+ add_removed_bytes(asn1ct_name:all(rb)).
+
+add_removed_bytes([H,T1|T]) ->
+ emit({{var,H},"+"}),
+ add_removed_bytes([T1|T]);
+add_removed_bytes([H|T]) ->
+ emit({{var,H}}),
+ add_removed_bytes(T);
+add_removed_bytes([]) ->
+ true.
+
+mkfuncname(WhatKind,DecOrEnc) ->
+ case WhatKind of
+ #'Externaltypereference'{module=Mod,type=EType} ->
+ CurrMod = get(currmod),
+ case CurrMod of
+ Mod ->
+ lists:concat(["'",DecOrEnc,"_",EType,"'"]);
+ _ ->
+% io:format("CurrMod: ~p, Mod: ~p~n",[CurrMod,Mod]),
+ lists:concat(["'",Mod,"':'",DecOrEnc,"_",EType,"'"])
+ end;
+ #'typereference'{val=EType} ->
+ lists:concat(["'",DecOrEnc,"_",EType,"'"]);
+ 'ASN1_OPEN_TYPE' ->
+ lists:concat(["'",DecOrEnc,"_",WhatKind,"'"])
+
+ end.
+
+optionals(L) -> optionals(L,[],1).
+
+optionals([{'EXTENSIONMARK',_,_}|Rest],Acc,Pos) ->
+ optionals(Rest,Acc,Pos); % optionals in extension are currently not handled
+optionals([#'ComponentType'{name=Name,prop='OPTIONAL'}|Rest],Acc,Pos) ->
+ optionals(Rest,[{Name,Pos}|Acc],Pos+1);
+optionals([#'ComponentType'{name=Name,prop={'DEFAULT',_}}|Rest],Acc,Pos) ->
+ optionals(Rest,[{Name,Pos}|Acc],Pos+1);
+optionals([#'ComponentType'{}|Rest],Acc,Pos) ->
+ optionals(Rest,Acc,Pos+1);
+optionals([],Acc,_) ->
+ lists:reverse(Acc).
+
+get_constraint(C,Key) ->
+ case lists:keysearch(Key,1,C) of
+ false ->
+ no;
+ {value,{_,V}} ->
+ V
+ end.
+
+
+get_class_fields(#classdef{typespec=ObjClass}) ->
+ ObjClass#objectclass.fields;
+get_class_fields(#objectclass{fields=Fields}) ->
+ Fields;
+get_class_fields(_) ->
+ [].
+
+get_object_field(Name,ObjectFields) ->
+ case lists:keysearch(Name,1,ObjectFields) of
+ {value,Field} -> Field;
+ false -> false
+ end.
+
+%%encode_tag(TagClass(?UNI, APP etc), Form (?PRIM etx), TagInteger) ->
+%% 8bit Int | binary
+encode_tag_val(Class, Form, TagNo) when (TagNo =< 30) ->
+ <<(Class bsr 6):2,(Form bsr 5):1,TagNo:5>>;
+
+encode_tag_val(Class, Form, TagNo) ->
+ {Octets,_Len} = mk_object_val(TagNo),
+ BinOct = list_to_binary(Octets),
+ <<(Class bsr 6):2, (Form bsr 5):1, 31:5,BinOct/binary>>.
+
+%%%%%%%%%%%
+%% mk_object_val(Value) -> {OctetList, Len}
+%% returns a Val as a list of octets, the 8 bit is allways set to one except
+%% for the last octet, where its 0
+%%
+
+
+mk_object_val(Val) when Val =< 127 ->
+ {[255 band Val], 1};
+mk_object_val(Val) ->
+ mk_object_val(Val bsr 7, [Val band 127], 1).
+mk_object_val(0, Ack, Len) ->
+ {Ack, Len};
+mk_object_val(Val, Ack, Len) ->
+ mk_object_val(Val bsr 7, [((Val band 127) bor 128) | Ack], Len + 1).
+
+add_func(F={_Func,_Arity}) ->
+ ets:insert(asn1_functab,{F}).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_gen_per.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_gen_per.erl
new file mode 100644
index 0000000000..b5c70fd856
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_gen_per.erl
@@ -0,0 +1,1189 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1ct_gen_per.erl,v 1.1 2008/12/17 09:53:30 mikpe Exp $
+%%
+-module(asn1ct_gen_per).
+
+%% Generate erlang module which handles (PER) encode and decode for
+%% all types in an ASN.1 module
+
+-include("asn1_records.hrl").
+%-compile(export_all).
+
+-export([pgen/4,gen_dec_prim/3,gen_encode_prim/4]).
+-export([gen_obj_code/3,gen_objectset_code/2]).
+-export([gen_decode/2, gen_decode/3]).
+-export([gen_encode/2, gen_encode/3]).
+-export([is_already_generated/2,more_genfields/1,get_class_fields/1,
+ get_object_field/2]).
+
+-import(asn1ct_gen, [emit/1,demit/1]).
+
+%% pgen(Erules, Module, TypeOrVal)
+%% Generate Erlang module (.erl) and (.hrl) file corresponding to an ASN.1 module
+%% .hrl file is only generated if necessary
+%% Erules = per | ber
+%% Module = atom()
+%% TypeOrVal = {TypeList,ValueList}
+%% TypeList = ValueList = [atom()]
+
+pgen(OutFile,Erules,Module,TypeOrVal) ->
+ asn1ct_gen:pgen_module(OutFile,Erules,Module,TypeOrVal,true).
+
+
+%% Generate ENCODING ******************************
+%%****************************************x
+
+
+gen_encode(Erules,Type) when record(Type,typedef) ->
+ gen_encode_user(Erules,Type).
+%% case Type#typedef.typespec of
+%% Def when record(Def,type) ->
+%% gen_encode_user(Erules,Type);
+%% Def when tuple(Def),(element(1,Def) == 'Object') ->
+%% gen_encode_object(Erules,Type);
+%% Other ->
+%% exit({error,{asn1,{unknown,Other}}})
+%% end.
+
+gen_encode(Erules,Typename,#'ComponentType'{name=Cname,typespec=Type}) ->
+ NewTypename = [Cname|Typename],
+ gen_encode(Erules,NewTypename,Type);
+
+gen_encode(Erules,Typename,Type) when record(Type,type) ->
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ ObjFun =
+ case lists:keysearch(objfun,1,Type#type.tablecinf) of
+ {value,{_,_Name}} ->
+%% lists:concat([", ObjFun",Name]);
+ ", ObjFun";
+ false ->
+ ""
+ end,
+ case asn1ct_gen:type(InnerType) of
+ {constructed,bif} ->
+ case InnerType of
+ 'SET' ->
+ true;
+ 'SEQUENCE' ->
+ true;
+ _ ->
+ emit({nl,"'enc_",asn1ct_gen:list2name(Typename),
+ "'({'",asn1ct_gen:list2name(Typename),
+ "',Val}",ObjFun,") ->",nl}),
+ emit({"'enc_",asn1ct_gen:list2name(Typename),
+ "'(Val",ObjFun,");",nl,nl})
+ end,
+ emit({"'enc_",asn1ct_gen:list2name(Typename),"'(Val",ObjFun,
+ ") ->",nl}),
+ asn1ct_gen:gen_encode_constructed(Erules,Typename,InnerType,Type);
+ _ ->
+ true
+ end.
+
+
+gen_encode_user(Erules,D) when record(D,typedef) ->
+ CurrMod = get(currmod),
+ Typename = [D#typedef.name],
+ Def = D#typedef.typespec,
+ InnerType = asn1ct_gen:get_inner(Def#type.def),
+ case InnerType of
+ 'SET' -> true;
+ 'SEQUENCE' -> true;
+ _ ->
+ emit({nl,"'enc_",asn1ct_gen:list2name(Typename),"'({'",asn1ct_gen:list2name(Typename),"',Val}) ->",nl}),
+ emit({"'enc_",asn1ct_gen:list2name(Typename),"'(Val);",nl,nl})
+ end,
+ emit({"'enc_",asn1ct_gen:list2name(Typename),"'(Val) ->",nl}),
+ case asn1ct_gen:type(InnerType) of
+ {primitive,bif} ->
+ gen_encode_prim(Erules,Def,"false"),
+ emit({".",nl});
+ 'ASN1_OPEN_TYPE' ->
+ gen_encode_prim(Erules,Def#type{def='ASN1_OPEN_TYPE'},"false"),
+ emit({".",nl});
+ {constructed,bif} ->
+ asn1ct_gen:gen_encode_constructed(Erules,Typename,InnerType,D);
+ #'Externaltypereference'{module=CurrMod,type=Etype} ->
+ emit({"'enc_",Etype,"'(Val).",nl,nl});
+ #'Externaltypereference'{module=Emod,type=Etype} ->
+ emit({"'",Emod,"':'enc_",Etype,"'(Val).",nl,nl});
+ #typereference{val=Ename} ->
+ emit({"'enc_",Ename,"'(Val).",nl,nl});
+ {notype,_} ->
+ emit({"'enc_",InnerType,"'(Val).",nl,nl})
+ end.
+
+
+gen_encode_prim(Erules,D,DoTag) ->
+ Value = case asn1ct_name:active(val) of
+ true ->
+ asn1ct_gen:mk_var(asn1ct_name:curr(val));
+ false ->
+ "Val"
+ end,
+ gen_encode_prim(Erules,D,DoTag,Value).
+
+gen_encode_prim(_Erules,D,_DoTag,Value) when record(D,type) ->
+ Constraint = D#type.constraint,
+ case D#type.def of
+ 'INTEGER' ->
+ emit({"?RT_PER:encode_integer(", %fel
+ {asis,Constraint},",",Value,")"});
+ {'INTEGER',NamedNumberList} ->
+ emit({"?RT_PER:encode_integer(",
+ {asis,Constraint},",",Value,",",
+ {asis,NamedNumberList},")"});
+ {'ENUMERATED',{Nlist1,Nlist2}} ->
+ NewList = lists:concat([[{0,X}||{X,_} <- Nlist1],['EXT_MARK'],[{1,X}||{X,_} <- Nlist2]]),
+ NewC = [{'ValueRange',{0,length(Nlist1)-1}}],
+ emit(["case (case ",Value," of {_,_}->element(2,",Value,");_->",
+ Value," end) of",nl]),
+ emit_enc_enumerated_cases(NewC, NewList++[{asn1_enum,length(Nlist1)-1}], 0);
+ {'ENUMERATED',NamedNumberList} ->
+ NewList = [X||{X,_} <- NamedNumberList],
+ NewC = [{'ValueRange',{0,length(NewList)-1}}],
+ emit(["case (case ",Value," of {_,_}->element(2,",Value,");_->",
+ Value," end) of",nl]),
+ emit_enc_enumerated_cases(NewC, NewList, 0);
+ {'BIT STRING',NamedNumberList} ->
+ emit({"?RT_PER:encode_bit_string(",
+ {asis,Constraint},",",Value,",",
+ {asis,NamedNumberList},")"});
+ 'NULL' ->
+ emit({"?RT_PER:encode_null(",Value,")"});
+ 'OBJECT IDENTIFIER' ->
+ emit({"?RT_PER:encode_object_identifier(",Value,")"});
+ 'ObjectDescriptor' ->
+ emit({"?RT_PER:encode_ObjectDescriptor(",{asis,Constraint},
+ ",",Value,")"});
+ 'BOOLEAN' ->
+ emit({"?RT_PER:encode_boolean(",Value,")"});
+ 'OCTET STRING' ->
+ emit({"?RT_PER:encode_octet_string(",{asis,Constraint},",",Value,")"});
+ 'NumericString' ->
+ emit({"?RT_PER:encode_NumericString(",{asis,Constraint},",",Value,")"});
+ 'TeletexString' ->
+ emit({"?RT_PER:encode_TeletexString(",{asis,Constraint},",",Value,")"});
+ 'VideotexString' ->
+ emit({"?RT_PER:encode_VideotexString(",{asis,Constraint},",",Value,")"});
+ 'UTCTime' ->
+ emit({"?RT_PER:encode_VisibleString(",{asis,Constraint},",",Value,")"});
+ 'GeneralizedTime' ->
+ emit({"?RT_PER:encode_VisibleString(",{asis,Constraint},",",Value,")"});
+ 'GraphicString' ->
+ emit({"?RT_PER:encode_GraphicString(",{asis,Constraint},",",Value,")"});
+ 'VisibleString' ->
+ emit({"?RT_PER:encode_VisibleString(",{asis,Constraint},",",Value,")"});
+ 'GeneralString' ->
+ emit({"?RT_PER:encode_GeneralString(",{asis,Constraint},",",Value,")"});
+ 'PrintableString' ->
+ emit({"?RT_PER:encode_PrintableString(",{asis,Constraint},",",Value,")"});
+ 'IA5String' ->
+ emit({"?RT_PER:encode_IA5String(",{asis,Constraint},",",Value,")"});
+ 'BMPString' ->
+ emit({"?RT_PER:encode_BMPString(",{asis,Constraint},",",Value,")"});
+ 'UniversalString' ->
+ emit({"?RT_PER:encode_UniversalString(",{asis,Constraint},",",Value,")"});
+ 'ANY' ->
+ emit(["?RT_PER:encode_open_type(", {asis,Constraint}, ",",
+ Value, ")"]);
+ 'ASN1_OPEN_TYPE' ->
+ NewValue = case Constraint of
+ [#'Externaltypereference'{type=Tname}] ->
+ io_lib:format(
+ "?RT_PER:complete(enc_~s(~s))",[Tname,Value]);
+ [#type{def=#'Externaltypereference'{type=Tname}}] ->
+ io_lib:format(
+ "?RT_PER:complete(enc_~s(~s))",[Tname,Value]);
+ _ -> Value
+ end,
+ emit(["?RT_PER:encode_open_type(", {asis,Constraint}, ",",
+ NewValue, ")"]);
+ XX ->
+ exit({asn1_error,nyi,XX})
+ end.
+
+emit_enc_enumerated_cases(C, [H], Count) ->
+ emit_enc_enumerated_case(C, H, Count),
+ emit([";",nl,"EnumVal -> exit({error,{asn1, {enumerated_not_in_range, EnumVal}}})"]),
+ emit([nl,"end"]);
+emit_enc_enumerated_cases(C, ['EXT_MARK'|T], _Count) ->
+ emit_enc_enumerated_cases(C, T, 0);
+emit_enc_enumerated_cases(C, [H1,H2|T], Count) ->
+ emit_enc_enumerated_case(C, H1, Count),
+ emit([";",nl]),
+ emit_enc_enumerated_cases(C, [H2|T], Count+1).
+
+
+
+emit_enc_enumerated_case(_C, {asn1_enum,High}, _) ->
+ emit([
+ "{asn1_enum,EnumV} when integer(EnumV), EnumV > ",High," -> ",
+ "[{bit,1},?RT_PER:encode_small_number(EnumV)]"]);
+emit_enc_enumerated_case(_C, 'EXT_MARK', _Count) ->
+ true;
+emit_enc_enumerated_case(_C, {1,EnumName}, Count) ->
+ emit(["'",EnumName,"' -> [{bit,1},?RT_PER:encode_small_number(",Count,")]"]);
+emit_enc_enumerated_case(C, {0,EnumName}, Count) ->
+ emit(["'",EnumName,"' -> [{bit,0},?RT_PER:encode_integer(",{asis,C},", ",Count,")]"]);
+emit_enc_enumerated_case(C, EnumName, Count) ->
+ emit(["'",EnumName,"' -> ?RT_PER:encode_integer(",{asis,C},", ",Count,")"]).
+
+
+%% Object code generating for encoding and decoding
+%% ------------------------------------------------
+
+gen_obj_code(Erules,_Module,Obj) when record(Obj,typedef) ->
+ ObjName = Obj#typedef.name,
+ Def = Obj#typedef.typespec,
+ #'Externaltypereference'{module=Mod,type=ClassName} =
+ Def#'Object'.classname,
+ Class = asn1_db:dbget(Mod,ClassName),
+ {object,_,Fields} = Def#'Object'.def,
+ emit({nl,nl,nl,"%%================================"}),
+ emit({nl,"%% ",ObjName}),
+ emit({nl,"%%================================",nl}),
+ EncConstructed =
+ gen_encode_objectfields(ClassName,get_class_fields(Class),
+ ObjName,Fields,[]),
+ emit(nl),
+ gen_encode_constr_type(Erules,EncConstructed),
+ emit(nl),
+ DecConstructed =
+ gen_decode_objectfields(ClassName,get_class_fields(Class),
+ ObjName,Fields,[]),
+ emit(nl),
+ gen_decode_constr_type(Erules,DecConstructed),
+ emit(nl);
+gen_obj_code(_,_,Obj) when record(Obj,pobjectdef) ->
+ ok.
+
+
+gen_encode_objectfields(ClassName,[{typefield,Name,OptOrMand}|Rest],
+ ObjName,ObjectFields,ConstrAcc) ->
+ EmitFuncClause =
+ fun(V) ->
+ emit(["'enc_",ObjName,"'(",{asis,Name},
+ ",",V,",_RestPrimFieldName) ->",nl])
+ end,
+% emit(["'enc_",ObjName,"'(",{asis,Name},
+% ", Val, _RestPrimFieldName) ->",nl]),
+ MaybeConstr =
+ case {get_object_field(Name,ObjectFields),OptOrMand} of
+ {false,'MANDATORY'} -> %% this case is illegal
+ exit({error,{asn1,{"missing mandatory field in object",
+ ObjName}}});
+ {false,'OPTIONAL'} ->
+ EmitFuncClause("_"),
+ emit(" []"),
+ [];
+ {false,{'DEFAULT',DefaultType}} ->
+ EmitFuncClause("Val"),
+ gen_encode_default_call(ClassName,Name,DefaultType);
+ {{Name,TypeSpec},_} ->
+ %% A specified field owerwrites any 'DEFAULT' or
+ %% 'OPTIONAL' field in the class
+ EmitFuncClause("Val"),
+ gen_encode_field_call(ObjName,Name,TypeSpec)
+ end,
+ case more_genfields(Rest) of
+ true ->
+ emit([";",nl]);
+ false ->
+ emit([".",nl])
+ end,
+ gen_encode_objectfields(ClassName,Rest,ObjName,ObjectFields,
+ MaybeConstr++ConstrAcc);
+gen_encode_objectfields(ClassName,[{objectfield,Name,_,_,OptOrMand}|Rest],
+ ObjName,ObjectFields,ConstrAcc) ->
+ EmitFuncClause =
+ fun(Attrs) ->
+ emit(["'enc_",ObjName,"'(",{asis,Name},
+ ",",Attrs,") ->",nl])
+ end,
+% emit(["'enc_",ObjName,"'(",{asis,Name},
+% ", Val,[H|T]) ->",nl]),
+ case {get_object_field(Name,ObjectFields),OptOrMand} of
+ {false,'MANDATORY'} ->
+ exit({error,{asn1,{"missing mandatory field in object",
+ ObjName}}});
+ {false,'OPTIONAL'} ->
+ EmitFuncClause("_,_"),
+ emit([" exit({error,{'use of missing field in object', ",Name,
+ "}})"]);
+ {false,{'DEFAULT',_DefaultObject}} ->
+ exit({error,{asn1,{"not implemented yet",Name}}});
+ {{Name,TypeSpec},_} ->
+ EmitFuncClause("Val,[H|T]"),
+ case TypeSpec#typedef.name of
+ {ExtMod,TypeName} ->
+ emit({indent(3),"'",ExtMod,"':'enc_",TypeName,
+ "'(H, Val, T)"});
+ TypeName ->
+ emit({indent(3),"'enc_",TypeName,"'(H, Val, T)"})
+ end
+ end,
+ case more_genfields(Rest) of
+ true ->
+ emit([";",nl]);
+ false ->
+ emit([".",nl])
+ end,
+ gen_encode_objectfields(ClassName,Rest,ObjName,ObjectFields,ConstrAcc);
+gen_encode_objectfields(ClassName,[_C|Cs],O,OF,Acc) ->
+ gen_encode_objectfields(ClassName,Cs,O,OF,Acc);
+gen_encode_objectfields(_,[],_,_,Acc) ->
+ Acc.
+
+
+% gen_encode_objectfields(Class,ObjName,[{FieldName,Type}|Rest],ConstrAcc) ->
+% Fields = Class#objectclass.fields,
+
+% MaybeConstr =
+% case is_typefield(Fields,FieldName) of
+% true ->
+% Def = Type#typedef.typespec,
+% emit({"'enc_",ObjName,"'(",{asis,FieldName},
+% ", Val, Dummy) ->",nl}),
+
+% CAcc =
+% case Type#typedef.name of
+% {primitive,bif} ->
+% gen_encode_prim(per,Def,"false","Val"),
+% [];
+% {constructed,bif} ->
+% emit({" 'enc_",ObjName,'_',FieldName,
+% "'(Val)"}),
+% [{['enc_',ObjName,'_',FieldName],Def}];
+% {ExtMod,TypeName} ->
+% emit({" '",ExtMod,"':'enc_",TypeName,"'(Val)"}),
+% [];
+% TypeName ->
+% emit({" 'enc_",TypeName,"'(Val)"}),
+% []
+% end,
+% case more_genfields(Fields,Rest) of
+% true ->
+% emit({";",nl});
+% false ->
+% emit({".",nl})
+% end,
+% CAcc;
+% {false,objectfield} ->
+% emit({"'enc_",ObjName,"'(",{asis,FieldName},
+% ", Val, [H|T]) ->",nl}),
+% case Type#typedef.name of
+% {ExtMod,TypeName} ->
+% emit({indent(3),"'",ExtMod,"':'enc_",TypeName,
+% "'(H, Val, T)"});
+% TypeName ->
+% emit({indent(3),"'enc_",TypeName,"'(H, Val, T)"})
+% end,
+% case more_genfields(Fields,Rest) of
+% true ->
+% emit({";",nl});
+% false ->
+% emit({".",nl})
+% end,
+% [];
+% {false,_} -> []
+% end,
+% gen_encode_objectfields(Class,ObjName,Rest,MaybeConstr ++ ConstrAcc);
+% gen_encode_objectfields(C,O,[H|T],Acc) ->
+% gen_encode_objectfields(C,O,T,Acc);
+% gen_encode_objectfields(_,_,[],Acc) ->
+% Acc.
+
+% gen_encode_constr_type(Erules,[{Name,Def}|Rest]) ->
+% emit({Name,"(Val) ->",nl}),
+% InnerType = asn1ct_gen:get_inner(Def#type.def),
+% asn1ct_gen:gen_encode_constructed(Erules,Name,InnerType,Def),
+% gen_encode_constr_type(Erules,Rest);
+gen_encode_constr_type(Erules,[TypeDef|Rest]) when record(TypeDef,typedef) ->
+ case is_already_generated(enc,TypeDef#typedef.name) of
+ true -> ok;
+ _ ->
+ Name = lists:concat(["enc_",TypeDef#typedef.name]),
+ emit({Name,"(Val) ->",nl}),
+ Def = TypeDef#typedef.typespec,
+ InnerType = asn1ct_gen:get_inner(Def#type.def),
+ asn1ct_gen:gen_encode_constructed(Erules,Name,InnerType,Def),
+ gen_encode_constr_type(Erules,Rest)
+ end;
+gen_encode_constr_type(_,[]) ->
+ ok.
+
+gen_encode_field_call(ObjName,FieldName,Type) ->
+ Def = Type#typedef.typespec,
+ case Type#typedef.name of
+ {primitive,bif} ->
+ gen_encode_prim(per,Def,"false",
+ "Val"),
+ [];
+ {constructed,bif} ->
+ emit({" 'enc_",ObjName,'_',FieldName,
+ "'(Val)"}),
+ [Type#typedef{name=list_to_atom(lists:concat([ObjName,'_',FieldName]))}];
+ {ExtMod,TypeName} ->
+ emit({" '",ExtMod,"':'enc_",TypeName,
+ "'(Val)"}),
+ [];
+ TypeName ->
+ emit({" 'enc_",TypeName,"'(Val)"}),
+ []
+ end.
+
+gen_encode_default_call(ClassName,FieldName,Type) ->
+ CurrentMod = get(currmod),
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ case asn1ct_gen:type(InnerType) of
+ {constructed,bif} ->
+%% asn1ct_gen:gen_encode_constructed(Erules,Typename,InnerType,Type);
+ emit([" 'enc_",ClassName,'_',FieldName,"'(Val)"]),
+ [#typedef{name=list_to_atom(lists:concat([ClassName,'_',FieldName])),
+ typespec=Type}];
+ {primitive,bif} ->
+ gen_encode_prim(per,Type,"false","Val"),
+ [];
+ #'Externaltypereference'{module=CurrentMod,type=Etype} ->
+ emit([" 'enc_",Etype,"'(Val)",nl]),
+ [];
+ #'Externaltypereference'{module=Emod,type=Etype} ->
+ emit([" '",Emod,"':'enc_",Etype,"'(Val)",nl]),
+ []
+ end.
+
+
+gen_decode_objectfields(ClassName,[{typefield,Name,OptOrMand}|Rest],
+ ObjName,ObjectFields,ConstrAcc) ->
+ EmitFuncClause =
+ fun(Bytes) ->
+ emit(["'dec_",ObjName,"'(",{asis,Name},",",Bytes,
+ ",_,_RestPrimFieldName) ->",nl])
+ end,
+ MaybeConstr=
+ case {get_object_field(Name,ObjectFields),OptOrMand} of
+ {false,'MANDATORY'} -> %% this case is illegal
+ exit({error,{asn1,{"missing mandatory field in object",
+ ObjName}}});
+ {false,'OPTIONAL'} ->
+ EmitFuncClause("_"),
+ emit([" asn1_NOVALUE"]),
+ [];
+ {false,{'DEFAULT',DefaultType}} ->
+ EmitFuncClause("Bytes"),
+ gen_decode_default_call(ClassName,Name,"Bytes",DefaultType);
+ {{Name,TypeSpec},_} ->
+ %% A specified field owerwrites any 'DEFAULT' or
+ %% 'OPTIONAL' field in the class
+ EmitFuncClause("Bytes"),
+ gen_decode_field_call(ObjName,Name,"Bytes",TypeSpec)
+ end,
+ case more_genfields(Rest) of
+ true ->
+ emit([";",nl]);
+ false ->
+ emit([".",nl])
+ end,
+ gen_decode_objectfields(ClassName,Rest,ObjName,ObjectFields,MaybeConstr++ConstrAcc);
+gen_decode_objectfields(ClassName,[{objectfield,Name,_,_,OptOrMand}|Rest],
+ ObjName,ObjectFields,ConstrAcc) ->
+ EmitFuncClause =
+ fun(Attrs) ->
+ emit(["'dec_",ObjName,"'(",{asis,Name},
+ ",",Attrs,") ->",nl])
+ end,
+% emit(["'dec_",ObjName,"'(",{asis,Name},
+% ", Bytes,_,[H|T]) ->",nl]),
+ case {get_object_field(Name,ObjectFields),OptOrMand} of
+ {false,'MANDATORY'} ->
+ exit({error,{asn1,{"missing mandatory field in object",
+ ObjName}}});
+ {false,'OPTIONAL'} ->
+ EmitFuncClause("_,_,_"),
+ emit([" exit({error,{'illegal use of missing field in object', ",Name,
+ "}})"]);
+ {false,{'DEFAULT',_DefaultObject}} ->
+ exit({error,{asn1,{"not implemented yet",Name}}});
+ {{Name,TypeSpec},_} ->
+ EmitFuncClause("Bytes,_,[H|T]"),
+ case TypeSpec#typedef.name of
+ {ExtMod,TypeName} ->
+ emit({indent(3),"'",ExtMod,"':'dec_",TypeName,
+ "'(H, Bytes, telltype, T)"});
+ TypeName ->
+ emit({indent(3),"'dec_",TypeName,"'(H, Bytes, telltype, T)"})
+ end
+ end,
+ case more_genfields(Rest) of
+ true ->
+ emit([";",nl]);
+ false ->
+ emit([".",nl])
+ end,
+ gen_decode_objectfields(ClassName,Rest,ObjName,ObjectFields,ConstrAcc);
+gen_decode_objectfields(CN,[_C|Cs],O,OF,CAcc) ->
+ gen_decode_objectfields(CN,Cs,O,OF,CAcc);
+gen_decode_objectfields(_,[],_,_,CAcc) ->
+ CAcc.
+
+
+% gen_decode_objectfields(Class,ObjName,[{FieldName,Type}|Rest],ConstrAcc) ->
+% Fields = Class#objectclass.fields,
+
+% MaybeConstr =
+% case is_typefield(Fields,FieldName) of
+% true ->
+% Def = Type#typedef.typespec,
+% emit({"'dec_",ObjName,"'(",{asis,FieldName},
+% ", Val, Telltype, RestPrimFieldName) ->",nl}),
+
+% CAcc =
+% case Type#typedef.name of
+% {primitive,bif} ->
+% gen_dec_prim(per,Def,"Val"),
+% [];
+% {constructed,bif} ->
+% emit({" 'dec_",ObjName,'_',FieldName,
+% "'(Val, Telltype)"}),
+% [{['dec_',ObjName,'_',FieldName],Def}];
+% {ExtMod,TypeName} ->
+% emit({" '",ExtMod,"':'dec_",TypeName,
+% "'(Val, Telltype)"}),
+% [];
+% TypeName ->
+% emit({" 'dec_",TypeName,"'(Val, Telltype)"}),
+% []
+% end,
+% case more_genfields(Fields,Rest) of
+% true ->
+% emit({";",nl});
+% false ->
+% emit({".",nl})
+% end,
+% CAcc;
+% {false,objectfield} ->
+% emit({"'dec_",ObjName,"'(",{asis,FieldName},
+% ", Val, Telltype, [H|T]) ->",nl}),
+% case Type#typedef.name of
+% {ExtMod,TypeName} ->
+% emit({indent(3),"'",ExtMod,"':'dec_",TypeName,
+% "'(H, Val, Telltype, T)"});
+% TypeName ->
+% emit({indent(3),"'dec_",TypeName,
+% "'(H, Val, Telltype, T)"})
+% end,
+% case more_genfields(Fields,Rest) of
+% true ->
+% emit({";",nl});
+% false ->
+% emit({".",nl})
+% end,
+% [];
+% {false,_} ->
+% []
+% end,
+% gen_decode_objectfields(Class,ObjName,Rest,MaybeConstr ++ ConstrAcc);
+% gen_decode_objectfields(C,O,[H|T],CAcc) ->
+% gen_decode_objectfields(C,O,T,CAcc);
+% gen_decode_objectfields(_,_,[],CAcc) ->
+% CAcc.
+
+
+gen_decode_field_call(ObjName,FieldName,Bytes,Type) ->
+ Def = Type#typedef.typespec,
+ case Type#typedef.name of
+ {primitive,bif} ->
+ gen_dec_prim(per,Def,Bytes),
+ [];
+ {constructed,bif} ->
+ emit({" 'dec_",ObjName,'_',FieldName,
+ "'(",Bytes,",telltype)"}),
+ [Type#typedef{name=list_to_atom(lists:concat([ObjName,'_',FieldName]))}];
+ {ExtMod,TypeName} ->
+ emit({" '",ExtMod,"':'dec_",TypeName,
+ "'(",Bytes,", telltype)"}),
+ [];
+ TypeName ->
+ emit({" 'dec_",TypeName,"'(",Bytes,", telltype)"}),
+ []
+ end.
+
+gen_decode_default_call(ClassName,FieldName,Bytes,Type) ->
+ CurrentMod = get(currmod),
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ case asn1ct_gen:type(InnerType) of
+ {constructed,bif} ->
+ emit([" 'dec_",ClassName,'_',FieldName,"'(",Bytes,", telltype)"]),
+ [#typedef{name=list_to_atom(lists:concat([ClassName,'_',FieldName])),
+ typespec=Type}];
+ {primitive,bif} ->
+ gen_dec_prim(per,Type,Bytes),
+ [];
+ #'Externaltypereference'{module=CurrentMod,type=Etype} ->
+ emit([" 'dec_",Etype,"'(",Bytes,", telltype)",nl]),
+ [];
+ #'Externaltypereference'{module=Emod,type=Etype} ->
+ emit([" '",Emod,"':'dec_",Etype,"'(",Bytes,", telltype)",nl]),
+ []
+ end.
+
+
+gen_decode_constr_type(Erules,[{Name,Def}|Rest]) ->
+ emit({Name,"(Bytes,_) ->",nl}),
+ InnerType = asn1ct_gen:get_inner(Def#type.def),
+ asn1ct_gen:gen_decode_constructed(Erules,Name,InnerType,Def),
+ gen_decode_constr_type(Erules,Rest);
+gen_decode_constr_type(Erules,[TypeDef|Rest]) when record(TypeDef,typedef) ->
+ case is_already_generated(dec,TypeDef#typedef.name) of
+ true -> ok;
+ _ ->
+ gen_decode(Erules,TypeDef)
+ end,
+ gen_decode_constr_type(Erules,Rest);
+gen_decode_constr_type(_,[]) ->
+ ok.
+
+% more_genfields(Fields,[]) ->
+% false;
+% more_genfields(Fields,[{FieldName,_}|T]) ->
+% case is_typefield(Fields,FieldName) of
+% true -> true;
+% {false,objectfield} -> true;
+% {false,_} -> more_genfields(Fields,T)
+% end.
+
+more_genfields([]) ->
+ false;
+more_genfields([Field|Fields]) ->
+ case element(1,Field) of
+ typefield ->
+ true;
+ objectfield ->
+ true;
+ _ ->
+ more_genfields(Fields)
+ end.
+
+% is_typefield(Fields,FieldName) ->
+% case lists:keysearch(FieldName,2,Fields) of
+% {value,Field} ->
+% case element(1,Field) of
+% typefield ->
+% true;
+% Other ->
+% {false,Other}
+% end;
+% _ ->
+% false
+% end.
+%% Object Set code generating for encoding and decoding
+%% ----------------------------------------------------
+gen_objectset_code(Erules,ObjSet) ->
+ ObjSetName = ObjSet#typedef.name,
+ Def = ObjSet#typedef.typespec,
+%% {ClassName,ClassDef} = Def#'ObjectSet'.class,
+ #'Externaltypereference'{module=ClassModule,
+ type=ClassName} = Def#'ObjectSet'.class,
+ ClassDef = asn1_db:dbget(ClassModule,ClassName),
+ UniqueFName = Def#'ObjectSet'.uniquefname,
+ Set = Def#'ObjectSet'.set,
+ emit({nl,nl,nl,"%%================================"}),
+ emit({nl,"%% ",ObjSetName}),
+ emit({nl,"%%================================",nl}),
+ case ClassName of
+ {_Module,ExtClassName} ->
+ gen_objset_code(Erules,ObjSetName,UniqueFName,Set,
+ ExtClassName,ClassDef);
+ _ ->
+ gen_objset_code(Erules,ObjSetName,UniqueFName,Set,
+ ClassName,ClassDef)
+ end,
+ emit(nl).
+
+gen_objset_code(Erules,ObjSetName,UniqueFName,Set,ClassName,ClassDef)->
+ ClassFields = (ClassDef#classdef.typespec)#objectclass.fields,
+ InternalFuncs=
+ gen_objset_enc(ObjSetName,UniqueFName,Set,ClassName,ClassFields,1,[]),
+ gen_objset_dec(ObjSetName,UniqueFName,Set,ClassName,ClassFields,1),
+ gen_internal_funcs(Erules,InternalFuncs).
+
+%% gen_objset_enc iterates over the objects of the object set
+gen_objset_enc(_,{unique,undefined},_,_,_,_,_) ->
+ %% There is no unique field in the class of this object set
+ %% don't bother about the constraint
+ [];
+gen_objset_enc(ObjSName,UniqueName,[{ObjName,Val,Fields},T|Rest],
+ ClName,ClFields,NthObj,Acc)->
+ emit({"'getenc_",ObjSName,"'(",{asis,UniqueName},",",{asis,Val},
+ ") ->",nl}),
+ {InternalFunc,NewNthObj}=
+ case ObjName of
+ no_name ->
+ gen_inlined_enc_funs(Fields,ClFields,ObjSName,NthObj);
+ _Other ->
+ emit({" fun 'enc_",ObjName,"'/3"}),
+ {[],0}
+ end,
+ emit({";",nl}),
+ gen_objset_enc(ObjSName,UniqueName,[T|Rest],ClName,ClFields,
+ NewNthObj,InternalFunc ++ Acc);
+gen_objset_enc(ObjSetName,UniqueName,
+ [{ObjName,Val,Fields}],_ClName,ClFields,NthObj,Acc) ->
+
+ emit({"'getenc_",ObjSetName,"'(",{asis,UniqueName},",",
+ {asis,Val},") ->",nl}),
+ {InternalFunc,_}=
+ case ObjName of
+ no_name ->
+ gen_inlined_enc_funs(Fields,ClFields,ObjSetName,NthObj);
+ _Other ->
+ emit({" fun 'enc_",ObjName,"'/3"}),
+ {[],NthObj}
+ end,
+ emit({".",nl,nl}),
+ InternalFunc++Acc;
+gen_objset_enc(ObjSetName,_UniqueName,['EXTENSIONMARK'],_ClName,
+ _ClFields,_NthObj,Acc) ->
+ emit({"'getenc_",ObjSetName,"'(_, _) ->",nl}),
+ emit({indent(3),"fun(_, Val, _) ->",nl}),
+ emit({indent(6),"[{octets,Val}]",nl}),
+ emit({indent(3),"end.",nl,nl}),
+ Acc;
+gen_objset_enc(_,_,[],_,_,_,Acc) ->
+ Acc.
+
+%% gen_inlined_enc_funs for each object iterates over all fields of a
+%% class, and for each typefield it checks if the object has that
+%% field and emits the proper code.
+gen_inlined_enc_funs(Fields,[{typefield,Name,_}|Rest],ObjSetName,NthObj) ->
+ InternalDefFunName = asn1ct_gen:list2name([NthObj,Name,ObjSetName]),
+ case lists:keysearch(Name,1,Fields) of
+ {value,{_,Type}} when record(Type,type) ->
+ emit({indent(3),"fun(Type, Val, _) ->",nl,
+ indent(6),"case Type of",nl}),
+ {Ret,N}=emit_inner_of_fun(Type,InternalDefFunName),
+ gen_inlined_enc_funs1(Fields,Rest,ObjSetName,NthObj+N,Ret);
+ {value,{_,Type}} when record(Type,typedef) ->
+ emit({indent(3),"fun(Type, Val, _) ->",nl,
+ indent(6),"case Type of",nl}),
+ emit({indent(9),{asis,Name}," ->",nl}),
+ {Ret,N} = emit_inner_of_fun(Type,InternalDefFunName),
+ gen_inlined_enc_funs1(Fields,Rest,ObjSetName,NthObj+N,Ret);
+ false ->
+ gen_inlined_enc_funs(Fields,Rest,ObjSetName,NthObj)
+ end;
+gen_inlined_enc_funs(Fields,[_H|Rest],ObjSetName,NthObj) ->
+ gen_inlined_enc_funs(Fields,Rest,ObjSetName,NthObj);
+gen_inlined_enc_funs(_,[],_,NthObj) ->
+ {[],NthObj}.
+
+gen_inlined_enc_funs1(Fields,[{typefield,Name,_}|Rest],ObjSetName,
+ NthObj,Acc) ->
+ InternalDefFunName = asn1ct_gen:list2name([NthObj,Name,ObjSetName]),
+ {Acc2,NAdd}=
+ case lists:keysearch(Name,1,Fields) of
+ {value,{_,Type}} when record(Type,type) ->
+ emit({";",nl}),
+ {Ret,N}=emit_inner_of_fun(Type,InternalDefFunName),
+ {Ret++Acc,N};
+ {value,{_,Type}} when record(Type,typedef) ->
+ emit({";",nl,indent(9),{asis,Name}," ->",nl}),
+ {Ret,N}=emit_inner_of_fun(Type,InternalDefFunName),
+ {Ret++Acc,N};
+ false ->
+ {Acc,0}
+ end,
+ gen_inlined_enc_funs1(Fields,Rest,ObjSetName,NthObj+NAdd,Acc2);
+gen_inlined_enc_funs1(Fields,[_H|Rest],ObjSetName,NthObj,Acc)->
+ gen_inlined_enc_funs1(Fields,Rest,ObjSetName,NthObj,Acc);
+gen_inlined_enc_funs1(_,[],_,NthObj,Acc) ->
+ emit({nl,indent(6),"end",nl}),
+ emit({indent(3),"end"}),
+ {Acc,NthObj}.
+
+emit_inner_of_fun(TDef=#typedef{name={ExtMod,Name},typespec=Type},
+ InternalDefFunName) ->
+ case {ExtMod,Name} of
+ {primitive,bif} ->
+ emit(indent(12)),
+ gen_encode_prim(per,Type,dotag,"Val"),
+ {[],0};
+ {constructed,bif} ->
+ emit([indent(12),"'enc_",
+ InternalDefFunName,"'(Val)"]),
+ {[TDef#typedef{name=InternalDefFunName}],1};
+ _ ->
+ emit({indent(12),"'",ExtMod,"':'enc_",Name,"'(Val)"}),
+ {[],0}
+ end;
+emit_inner_of_fun(#typedef{name=Name},_) ->
+ emit({indent(12),"'enc_",Name,"'(Val)"}),
+ {[],0};
+emit_inner_of_fun(Type,_) when record(Type,type) ->
+ CurrMod = get(currmod),
+ case Type#type.def of
+ Def when atom(Def) ->
+ emit({indent(9),Def," ->",nl,indent(12)}),
+ gen_encode_prim(erules,Type,dotag,"Val");
+ TRef when record(TRef,typereference) ->
+ T = TRef#typereference.val,
+ emit({indent(9),T," ->",nl,indent(12),"'enc_",T,"'(Val)"});
+ #'Externaltypereference'{module=CurrMod,type=T} ->
+ emit({indent(9),T," ->",nl,indent(12),"'enc_",T,"'(Val)"});
+ #'Externaltypereference'{module=ExtMod,type=T} ->
+ emit({indent(9),T," ->",nl,indent(12),ExtMod,":'enc_",
+ T,"'(Val)"})
+ end,
+ {[],0}.
+
+indent(N) ->
+ lists:duplicate(N,32). % 32 = space
+
+
+gen_objset_dec(_,{unique,undefined},_,_,_,_) ->
+ %% There is no unique field in the class of this object set
+ %% don't bother about the constraint
+ ok;
+gen_objset_dec(ObjSName,UniqueName,[{ObjName,Val,Fields},T|Rest],ClName,
+ ClFields,NthObj)->
+
+ emit({"'getdec_",ObjSName,"'(",{asis,UniqueName},",",{asis,Val},
+ ") ->",nl}),
+ NewNthObj=
+ case ObjName of
+ no_name ->
+ gen_inlined_dec_funs(Fields,ClFields,ObjSName,NthObj);
+ _Other ->
+ emit({" fun 'dec_",ObjName,"'/4"}),
+ NthObj
+ end,
+ emit({";",nl}),
+ gen_objset_dec(ObjSName,UniqueName,[T|Rest],ClName,ClFields,NewNthObj);
+gen_objset_dec(ObjSetName,UniqueName,[{ObjName,Val,Fields}],_ClName,
+ ClFields,NthObj) ->
+
+ emit({"'getdec_",ObjSetName,"'(",{asis,UniqueName},",",{asis,Val},
+ ") ->",nl}),
+ case ObjName of
+ no_name ->
+ gen_inlined_dec_funs(Fields,ClFields,ObjSetName,NthObj);
+ _Other ->
+ emit({" fun 'dec_",ObjName,"'/4"})
+ end,
+ emit({".",nl,nl}),
+ ok;
+gen_objset_dec(ObjSetName,_UniqueName,['EXTENSIONMARK'],_ClName,_ClFields,
+ _NthObj) ->
+ emit({"'getdec_",ObjSetName,"'(_, _) ->",nl}),
+ emit({indent(3),"fun(Attr1, Bytes, _,_) ->",nl}),
+%% emit({indent(6),"?RT_PER:decode_open_type(Bytes,[])",nl}),
+ emit({indent(6),"{Bytes,Attr1}",nl}),
+ emit({indent(3),"end.",nl,nl}),
+ ok;
+gen_objset_dec(_,_,[],_,_,_) ->
+ ok.
+
+gen_inlined_dec_funs(Fields,[{typefield,Name,_}|Rest],
+ ObjSetName,NthObj) ->
+ InternalDefFunName = [NthObj,Name,ObjSetName],
+ case lists:keysearch(Name,1,Fields) of
+ {value,{_,Type}} when record(Type,type) ->
+ emit({indent(3),"fun(Type, Val, _, _) ->",nl,
+ indent(6),"case Type of",nl}),
+ N=emit_inner_of_decfun(Type,InternalDefFunName),
+ gen_inlined_dec_funs1(Fields,Rest,ObjSetName,NthObj+N);
+ {value,{_,Type}} when record(Type,typedef) ->
+ emit({indent(3),"fun(Type, Val, _, _) ->",nl,
+ indent(6),"case Type of",nl}),
+ emit({indent(9),{asis,Name}," ->",nl}),
+ N=emit_inner_of_decfun(Type,InternalDefFunName),
+ gen_inlined_dec_funs1(Fields,Rest,ObjSetName,NthObj+N);
+ false ->
+ gen_inlined_dec_funs(Fields,Rest,ObjSetName,NthObj)
+ end;
+gen_inlined_dec_funs(Fields,[_|Rest],ObjSetName,NthObj) ->
+ gen_inlined_dec_funs(Fields,Rest,ObjSetName,NthObj);
+gen_inlined_dec_funs(_,[],_,NthObj) ->
+ NthObj.
+
+gen_inlined_dec_funs1(Fields,[{typefield,Name,_}|Rest],
+ ObjSetName,NthObj) ->
+ InternalDefFunName = [NthObj,Name,ObjSetName],
+ N=case lists:keysearch(Name,1,Fields) of
+ {value,{_,Type}} when record(Type,type) ->
+ emit({";",nl}),
+ emit_inner_of_decfun(Type,InternalDefFunName);
+ {value,{_,Type}} when record(Type,typedef) ->
+ emit({";",nl,indent(9),{asis,Name}," ->",nl}),
+ emit_inner_of_decfun(Type,InternalDefFunName);
+ false ->
+ 0
+ end,
+ gen_inlined_dec_funs1(Fields,Rest,ObjSetName,NthObj+N);
+gen_inlined_dec_funs1(Fields,[_|Rest],ObjSetName,NthObj)->
+ gen_inlined_dec_funs1(Fields,Rest,ObjSetName,NthObj);
+gen_inlined_dec_funs1(_,[],_,NthObj) ->
+ emit({nl,indent(6),"end",nl}),
+ emit({indent(3),"end"}),
+ NthObj.
+
+emit_inner_of_decfun(#typedef{name={ExtName,Name},typespec=Type},
+ InternalDefFunName) ->
+ case {ExtName,Name} of
+ {primitive,bif} ->
+ emit(indent(12)),
+ gen_dec_prim(per,Type,"Val"),
+ 0;
+ {constructed,bif} ->
+ emit({indent(12),"'dec_",
+ asn1ct_gen:list2name(InternalDefFunName),"'(Val)"}),
+ 1;
+ _ ->
+ emit({indent(12),"'",ExtName,"':'dec_",Name,"'(Val, telltype)"}),
+ 0
+ end;
+emit_inner_of_decfun(#typedef{name=Name},_) ->
+ emit({indent(12),"'dec_",Name,"'(Val, telltype)"}),
+ 0;
+emit_inner_of_decfun(Type,_) when record(Type,type) ->
+ CurrMod = get(currmod),
+ case Type#type.def of
+ Def when atom(Def) ->
+ emit({indent(9),Def," ->",nl,indent(12)}),
+ gen_dec_prim(erules,Type,"Val");
+ TRef when record(TRef,typereference) ->
+ T = TRef#typereference.val,
+ emit({indent(9),T," ->",nl,indent(12),"'dec_",T,"'(Val)"});
+ #'Externaltypereference'{module=CurrMod,type=T} ->
+ emit({indent(9),T," ->",nl,indent(12),"'dec_",T,"'(Val)"});
+ #'Externaltypereference'{module=ExtMod,type=T} ->
+ emit({indent(9),T," ->",nl,indent(12),ExtMod,":'dec_",
+ T,"'(Val)"})
+ end,
+ 0.
+
+
+gen_internal_funcs(_,[]) ->
+ ok;
+gen_internal_funcs(Erules,[TypeDef|Rest]) ->
+ gen_encode_user(Erules,TypeDef),
+ emit([nl,nl,"'dec_",TypeDef#typedef.name,"'(Bytes) ->",nl]),
+ gen_decode_user(Erules,TypeDef),
+ gen_internal_funcs(Erules,Rest).
+
+
+
+%% DECODING *****************************
+%%***************************************
+
+
+gen_decode(Erules,Type) when record(Type,typedef) ->
+ D = Type,
+ emit({nl,nl}),
+ emit({"'dec_",Type#typedef.name,"'(Bytes,_) ->",nl}),
+ dbdec(Type#typedef.name),
+ gen_decode_user(Erules,D).
+
+gen_decode(Erules,Tname,#'ComponentType'{name=Cname,typespec=Type}) ->
+ NewTname = [Cname|Tname],
+ gen_decode(Erules,NewTname,Type);
+
+gen_decode(Erules,Typename,Type) when record(Type,type) ->
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ case asn1ct_gen:type(InnerType) of
+ {constructed,bif} ->
+ ObjFun =
+ case Type#type.tablecinf of
+ [{objfun,_}|_R] ->
+ ", ObjFun";
+ _ ->
+ ""
+ end,
+ emit({nl,"'dec_",asn1ct_gen:list2name(Typename),
+ "'(Bytes,_",ObjFun,") ->",nl}),
+ dbdec(Typename),
+ asn1ct_gen:gen_decode_constructed(Erules,Typename,InnerType,Type);
+ _ ->
+ true
+ end.
+
+dbdec(Type) when list(Type)->
+ demit({"io:format(\"decoding: ",asn1ct_gen:list2name(Type),"~w~n\",[Bytes]),",nl});
+dbdec(Type) ->
+ demit({"io:format(\"decoding: ",{asis,Type},"~w~n\",[Bytes]),",nl}).
+
+gen_decode_user(Erules,D) when record(D,typedef) ->
+ CurrMod = get(currmod),
+ Typename = [D#typedef.name],
+ Def = D#typedef.typespec,
+ InnerType = asn1ct_gen:get_inner(Def#type.def),
+ case asn1ct_gen:type(InnerType) of
+ {primitive,bif} ->
+ gen_dec_prim(Erules,Def,"Bytes"),
+ emit({".",nl,nl});
+ 'ASN1_OPEN_TYPE' ->
+ gen_dec_prim(Erules,Def#type{def='ASN1_OPEN_TYPE'},"Bytes"),
+ emit({".",nl,nl});
+ {constructed,bif} ->
+ asn1ct_gen:gen_decode_constructed(Erules,Typename,InnerType,D);
+ #typereference{val=Dname} ->
+ emit({"'dec_",Dname,"'(Bytes,telltype)"}),
+ emit({".",nl,nl});
+ #'Externaltypereference'{module=CurrMod,type=Etype} ->
+ emit({"'dec_",Etype,"'(Bytes,telltype).",nl,nl});
+ #'Externaltypereference'{module=Emod,type=Etype} ->
+ emit({"'",Emod,"':'dec_",Etype,"'(Bytes,telltype).",nl,nl});
+ Other ->
+ exit({error,{asn1,{unknown,Other}}})
+ end.
+
+
+gen_dec_prim(_Erules,Att,BytesVar) ->
+ Typename = Att#type.def,
+ Constraint = Att#type.constraint,
+ case Typename of
+ 'INTEGER' ->
+ emit({"?RT_PER:decode_integer(",BytesVar,",",
+ {asis,Constraint},")"});
+ {'INTEGER',NamedNumberList} ->
+ emit({"?RT_PER:decode_integer(",BytesVar,",",
+ {asis,Constraint},",",
+ {asis,NamedNumberList},")"});
+ {'BIT STRING',NamedNumberList} ->
+ case get(compact_bit_string) of
+ true ->
+ emit({"?RT_PER:decode_compact_bit_string(",
+ BytesVar,",",{asis,Constraint},",",
+ {asis,NamedNumberList},")"});
+ _ ->
+ emit({"?RT_PER:decode_bit_string(",BytesVar,",",
+ {asis,Constraint},",",
+ {asis,NamedNumberList},")"})
+ end;
+ 'NULL' ->
+ emit({"?RT_PER:decode_null(",
+ BytesVar,")"});
+ 'OBJECT IDENTIFIER' ->
+ emit({"?RT_PER:decode_object_identifier(",
+ BytesVar,")"});
+ 'ObjectDescriptor' ->
+ emit({"?RT_PER:decode_ObjectDescriptor(",
+ BytesVar,")"});
+ {'ENUMERATED',{NamedNumberList1,NamedNumberList2}} ->
+ NewTup = {list_to_tuple([X||{X,_} <- NamedNumberList1]),
+ list_to_tuple([X||{X,_} <- NamedNumberList2])},
+ NewC = [{'ValueRange',{0,size(element(1,NewTup))-1}}],
+ emit({"?RT_PER:decode_enumerated(",BytesVar,",",
+ {asis,NewC},",",
+ {asis,NewTup},")"});
+ {'ENUMERATED',NamedNumberList} ->
+ NewTup = list_to_tuple([X||{X,_} <- NamedNumberList]),
+ NewC = [{'ValueRange',{0,size(NewTup)-1}}],
+ emit({"?RT_PER:decode_enumerated(",BytesVar,",",
+ {asis,NewC},",",
+ {asis,NewTup},")"});
+ 'BOOLEAN'->
+ emit({"?RT_PER:decode_boolean(",BytesVar,")"});
+ 'OCTET STRING' ->
+ emit({"?RT_PER:decode_octet_string(",BytesVar,",",
+ {asis,Constraint},")"});
+ 'NumericString' ->
+ emit({"?RT_PER:decode_NumericString(",BytesVar,",",
+ {asis,Constraint},")"});
+ 'TeletexString' ->
+ emit({"?RT_PER:decode_TeletexString(",BytesVar,",",
+ {asis,Constraint},")"});
+ 'VideotexString' ->
+ emit({"?RT_PER:decode_VideotexString(",BytesVar,",",
+ {asis,Constraint},")"});
+ 'UTCTime' ->
+ emit({"?RT_PER:decode_VisibleString(",BytesVar,",",
+ {asis,Constraint},")"});
+ 'GeneralizedTime' ->
+ emit({"?RT_PER:decode_VisibleString(",BytesVar,",",
+ {asis,Constraint},")"});
+ 'GraphicString' ->
+ emit({"?RT_PER:decode_GraphicString(",BytesVar,",",
+ {asis,Constraint},")"});
+ 'VisibleString' ->
+ emit({"?RT_PER:decode_VisibleString(",BytesVar,",",
+ {asis,Constraint},")"});
+ 'GeneralString' ->
+ emit({"?RT_PER:decode_GeneralString(",BytesVar,",",
+ {asis,Constraint},")"});
+ 'PrintableString' ->
+ emit({"?RT_PER:decode_PrintableString(",BytesVar,",",{asis,Constraint},")"});
+ 'IA5String' ->
+ emit({"?RT_PER:decode_IA5String(",BytesVar,",",{asis,Constraint},")"});
+ 'BMPString' ->
+ emit({"?RT_PER:decode_BMPString(",BytesVar,",",{asis,Constraint},")"});
+ 'UniversalString' ->
+ emit({"?RT_PER:decode_UniversalString(",BytesVar,",",{asis,Constraint},")"});
+ 'ANY' ->
+ emit(["?RT_PER:decode_open_type(",BytesVar,",",
+ {asis,Constraint}, ")"]);
+ 'ASN1_OPEN_TYPE' ->
+ case Constraint of
+ [#'Externaltypereference'{type=Tname}] ->
+ emit(["fun(FBytes) ->",nl,
+ " {XTerm,XBytes} = "]),
+ emit(["?RT_PER:decode_open_type(FBytes,[]),",nl]),
+ emit([" {YTerm,_} = dec_",Tname,"(XTerm,mandatory),",nl]),
+ emit([" {YTerm,XBytes} end(",BytesVar,")"]);
+ [#type{def=#'Externaltypereference'{type=Tname}}] ->
+ emit(["fun(FBytes) ->",nl,
+ " {XTerm,XBytes} = "]),
+ emit(["?RT_PER:decode_open_type(FBytes,[]),",nl]),
+ emit([" {YTerm,_} = dec_",Tname,"(XTerm,mandatory),",nl]),
+ emit([" {YTerm,XBytes} end(",BytesVar,")"]);
+ _ ->
+ emit(["?RT_PER:decode_open_type(",BytesVar,",[])"])
+ end;
+ Other ->
+ exit({'cant decode' ,Other})
+ end.
+
+
+is_already_generated(Operation,Name) ->
+ case get(class_default_type) of
+ undefined ->
+ put(class_default_type,[{Operation,Name}]),
+ false;
+ GeneratedList ->
+ case lists:member({Operation,Name},GeneratedList) of
+ true ->
+ true;
+ false ->
+ put(class_default_type,[{Operation,Name}|GeneratedList]),
+ false
+ end
+ end.
+
+get_class_fields(#classdef{typespec=ObjClass}) ->
+ ObjClass#objectclass.fields;
+get_class_fields(#objectclass{fields=Fields}) ->
+ Fields;
+get_class_fields(_) ->
+ [].
+
+
+get_object_field(Name,ObjectFields) ->
+ case lists:keysearch(Name,1,ObjectFields) of
+ {value,Field} -> Field;
+ false -> false
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_gen_per_rt2ct.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_gen_per_rt2ct.erl
new file mode 100644
index 0000000000..ddfa124048
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_gen_per_rt2ct.erl
@@ -0,0 +1,1811 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1ct_gen_per_rt2ct.erl,v 1.1 2008/12/17 09:53:30 mikpe Exp $
+%%
+-module(asn1ct_gen_per_rt2ct).
+
+%% Generate erlang module which handles (PER) encode and decode for
+%% all types in an ASN.1 module
+
+-include("asn1_records.hrl").
+%-compile(export_all).
+
+-export([pgen/4,gen_dec_prim/3,gen_encode_prim/4]).
+-export([gen_obj_code/3,gen_objectset_code/2]).
+-export([gen_decode/2, gen_decode/3]).
+-export([gen_encode/2, gen_encode/3]).
+
+-import(asn1ct_gen, [emit/1,demit/1]).
+-import(asn1ct_gen_per, [is_already_generated/2,more_genfields/1,
+ get_class_fields/1,get_object_field/2]).
+
+%% pgen(Erules, Module, TypeOrVal)
+%% Generate Erlang module (.erl) and (.hrl) file corresponding to an ASN.1 module
+%% .hrl file is only generated if necessary
+%% Erules = per | ber
+%% Module = atom()
+%% TypeOrVal = {TypeList,ValueList}
+%% TypeList = ValueList = [atom()]
+
+pgen(OutFile,Erules,Module,TypeOrVal) ->
+ asn1ct_gen:pgen_module(OutFile,Erules,Module,TypeOrVal,true).
+
+
+%% Generate ENCODING ******************************
+%%****************************************x
+
+
+gen_encode(Erules,Type) when record(Type,typedef) ->
+ gen_encode_user(Erules,Type).
+
+gen_encode(Erules,Typename,#'ComponentType'{name=Cname,typespec=Type}) ->
+ NewTypename = [Cname|Typename],
+ gen_encode(Erules,NewTypename,Type);
+
+gen_encode(Erules,Typename,Type) when record(Type,type) ->
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ ObjFun =
+ case lists:keysearch(objfun,1,Type#type.tablecinf) of
+ {value,{_,_Name}} ->
+ ", ObjFun";
+ false ->
+ ""
+ end,
+ case asn1ct_gen:type(InnerType) of
+ {constructed,bif} ->
+ case InnerType of
+ 'SET' ->
+ true;
+ 'SEQUENCE' ->
+ true;
+ _ ->
+ emit({nl,"'enc_",asn1ct_gen:list2name(Typename),
+ "'({'",asn1ct_gen:list2name(Typename),
+ "',Val}",ObjFun,") ->",nl}),
+ emit({"'enc_",asn1ct_gen:list2name(Typename),
+ "'(Val",ObjFun,");",nl,nl})
+ end,
+ emit({"'enc_",asn1ct_gen:list2name(Typename),"'(Val",ObjFun,
+ ") ->",nl}),
+ asn1ct_gen:gen_encode_constructed(Erules,Typename,InnerType,Type);
+ _ ->
+ true
+ end.
+
+
+gen_encode_user(Erules,D) when record(D,typedef) ->
+ CurrMod = get(currmod),
+ Typename = [D#typedef.name],
+ Def = D#typedef.typespec,
+ InnerType = asn1ct_gen:get_inner(Def#type.def),
+ case InnerType of
+ 'SET' -> true;
+ 'SEQUENCE' -> true;
+ _ ->
+ emit({nl,"'enc_",asn1ct_gen:list2name(Typename),"'({'",asn1ct_gen:list2name(Typename),"',Val}) ->",nl}),
+ emit({"'enc_",asn1ct_gen:list2name(Typename),"'(Val);",nl,nl})
+ end,
+ emit({"'enc_",asn1ct_gen:list2name(Typename),"'(Val) ->",nl}),
+ case asn1ct_gen:type(InnerType) of
+ {primitive,bif} ->
+ gen_encode_prim(Erules,Def,"false"),
+ emit({".",nl});
+ 'ASN1_OPEN_TYPE' ->
+ gen_encode_prim(Erules,Def#type{def='ASN1_OPEN_TYPE'},"false"),
+ emit({".",nl});
+ {constructed,bif} ->
+ asn1ct_gen:gen_encode_constructed(Erules,Typename,InnerType,D);
+ #'Externaltypereference'{module=CurrMod,type=Etype} ->
+ emit({"'enc_",Etype,"'(Val).",nl,nl});
+ #'Externaltypereference'{module=Emod,type=Etype} ->
+ emit({"'",Emod,"':'enc_",Etype,"'(Val).",nl,nl});
+ #typereference{val=Ename} ->
+ emit({"'enc_",Ename,"'(Val).",nl,nl});
+ {notype,_} ->
+ emit({"'enc_",InnerType,"'(Val).",nl,nl})
+ end.
+
+
+gen_encode_prim(Erules,D,DoTag) ->
+ Value = case asn1ct_name:active(val) of
+ true ->
+ asn1ct_gen:mk_var(asn1ct_name:curr(val));
+ false ->
+ "Val"
+ end,
+ gen_encode_prim(Erules,D,DoTag,Value).
+
+
+
+
+
+gen_encode_prim(_Erules,D,_DoTag,Value) when record(D,type) ->
+ Constraint = D#type.constraint,
+ case D#type.def of
+ 'INTEGER' ->
+ EffectiveConstr = effective_constraint(integer,Constraint),
+ emit([" %%INTEGER with effective constraint: ",
+ {asis,EffectiveConstr},nl]),
+ emit_enc_integer(EffectiveConstr,Value);
+ {'INTEGER',NamedNumberList} ->
+ EffectiveConstr = effective_constraint(integer,Constraint),
+ %% maybe an emit_enc_NNL_integer
+ emit([" %%INTEGER with effective constraint: ",
+ {asis,EffectiveConstr},nl]),
+ emit_enc_integer_NNL(EffectiveConstr,Value,NamedNumberList);
+ {'ENUMERATED',{Nlist1,Nlist2}} ->
+ NewList = lists:concat([[{0,X}||{X,_} <- Nlist1],['EXT_MARK'],[{1,X}||{X,_} <- Nlist2]]),
+ NewC = [{'ValueRange',{0,length(Nlist1)-1}}],
+ emit(["case (case ",Value," of {_,_}->element(2,",Value,");_->",
+ Value," end) of",nl]),
+ emit_enc_enumerated_cases(NewC, NewList++[{asn1_enum,length(Nlist1)-1}], 0);
+ {'ENUMERATED',NamedNumberList} ->
+ NewList = [X||{X,_} <- NamedNumberList],
+ NewC = effective_constraint(integer,
+ [{'ValueRange',
+ {0,length(NewList)-1}}]),
+ NewVal = enc_enum_cases(Value,NewList),
+ emit_enc_integer(NewC,NewVal);
+ {'BIT STRING',NamedNumberList} ->
+ EffectiveC = effective_constraint(bitstring,Constraint),
+ case EffectiveC of
+ 0 -> emit({"[]"});
+ _ ->
+ emit({"?RT_PER:encode_bit_string(",
+ {asis,EffectiveC},",",Value,",",
+ {asis,NamedNumberList},")"})
+ end;
+ 'NULL' ->
+ emit({"?RT_PER:encode_null(",Value,")"});
+ 'OBJECT IDENTIFIER' ->
+ emit({"?RT_PER:encode_object_identifier(",Value,")"});
+ 'ObjectDescriptor' ->
+ emit({"?RT_PER:encode_ObjectDescriptor(",{asis,Constraint},
+ ",",Value,")"});
+ 'BOOLEAN' ->
+% emit({"?RT_PER:encode_boolean(",Value,")"});
+ emit({"case ",Value," of",nl,
+% " true -> {bits,1,1};",nl,
+ " true -> [1];",nl,
+% " false -> {bits,1,0};",nl,
+ " false -> [0];",nl,
+ " _ -> exit({error,{asn1,{encode_boolean,",Value,"}}})",nl,
+ "end"});
+ 'OCTET STRING' ->
+ emit_enc_octet_string(Constraint,Value);
+
+ 'NumericString' ->
+ emit_enc_known_multiplier_string('NumericString',Constraint,Value);
+ 'TeletexString' ->
+ emit({"?RT_PER:encode_TeletexString(",{asis,Constraint},",",Value,")"});
+ 'VideotexString' ->
+ emit({"?RT_PER:encode_VideotexString(",{asis,Constraint},",",Value,")"});
+ 'UTCTime' ->
+ emit_enc_known_multiplier_string('VisibleString',Constraint,Value);
+ 'GeneralizedTime' ->
+ emit_enc_known_multiplier_string('VisibleString',Constraint,Value);
+ 'GraphicString' ->
+ emit({"?RT_PER:encode_GraphicString(",{asis,Constraint},",",Value,")"});
+ 'VisibleString' ->
+ emit_enc_known_multiplier_string('VisibleString',Constraint,Value);
+ 'GeneralString' ->
+ emit({"?RT_PER:encode_GeneralString(",{asis,Constraint},",",Value,")"});
+ 'PrintableString' ->
+ emit_enc_known_multiplier_string('PrintableString',Constraint,Value);
+ 'IA5String' ->
+ emit_enc_known_multiplier_string('IA5String',Constraint,Value);
+ 'BMPString' ->
+ emit_enc_known_multiplier_string('BMPString',Constraint,Value);
+ 'UniversalString' ->
+ emit_enc_known_multiplier_string('UniversalString',Constraint,Value);
+ 'ANY' ->
+ emit(["?RT_PER:encode_open_type(", {asis,Constraint}, ",",
+ Value, ")"]);
+ 'ASN1_OPEN_TYPE' ->
+ NewValue = case Constraint of
+ [#'Externaltypereference'{type=Tname}] ->
+ io_lib:format(
+ "?RT_PER:complete(enc_~s(~s))",[Tname,Value]);
+ [#type{def=#'Externaltypereference'{type=Tname}}] ->
+ io_lib:format(
+ "?RT_PER:complete(enc_~s(~s))",[Tname,Value]);
+ _ -> Value
+ end,
+ emit(["?RT_PER:encode_open_type(", {asis,Constraint}, ",",
+ NewValue, ")"]);
+ XX ->
+ exit({asn1_error,nyi,XX})
+ end.
+
+emit_enc_known_multiplier_string(StringType,C,Value) ->
+ SizeC =
+ case get_constraint(C,'SizeConstraint') of
+ L when list(L) -> {lists:min(L),lists:max(L)};
+ L -> L
+ end,
+ PAlphabC = get_constraint(C,'PermittedAlphabet'),
+ case {StringType,PAlphabC} of
+ {'UniversalString',{_,_}} ->
+ exit({error,{asn1,{'not implemented',"UniversalString with "
+ "PermittedAlphabet constraint"}}});
+ {'BMPString',{_,_}} ->
+ exit({error,{asn1,{'not implemented',"BMPString with "
+ "PermittedAlphabet constraint"}}});
+ _ -> ok
+ end,
+ NumBits = get_NumBits(C,StringType),
+ CharOutTab = get_CharOutTab(C,StringType),
+ %% NunBits and CharOutTab for chars_encode
+ emit_enc_k_m_string(StringType,SizeC,NumBits,CharOutTab,Value).
+
+emit_enc_k_m_string(_StringType,0,_NumBits,_CharOutTab,_Value) ->
+ emit({"[]"});
+emit_enc_k_m_string(StringType,SizeC,NumBits,CharOutTab,Value) ->
+ emit({"?RT_PER:encode_known_multiplier_string(",{asis,StringType},",",
+ {asis,SizeC},",",NumBits,",",{asis,CharOutTab},",",Value,")"}).
+
+emit_dec_known_multiplier_string(StringType,C,BytesVar) ->
+ SizeC = get_constraint(C,'SizeConstraint'),
+ PAlphabC = get_constraint(C,'PermittedAlphabet'),
+ case {StringType,PAlphabC} of
+ {'BMPString',{_,_}} ->
+ exit({error,{asn1,
+ {'not implemented',
+ "BMPString with PermittedAlphabet "
+ "constraint"}}});
+ _ ->
+ ok
+ end,
+ NumBits = get_NumBits(C,StringType),
+ CharInTab = get_CharInTab(C,StringType),
+ case SizeC of
+ 0 ->
+ emit({"{[],",BytesVar,"}"});
+ _ ->
+ emit({"?RT_PER:decode_known_multiplier_string(",
+ {asis,StringType},",",{asis,SizeC},",",NumBits,
+ ",",{asis,CharInTab},",",BytesVar,")"})
+ end.
+
+
+%% copied from run time module
+
+get_CharOutTab(C,StringType) ->
+ get_CharTab(C,StringType,out).
+
+get_CharInTab(C,StringType) ->
+ get_CharTab(C,StringType,in).
+
+get_CharTab(C,StringType,InOut) ->
+ case get_constraint(C,'PermittedAlphabet') of
+ {'SingleValue',Sv} ->
+ get_CharTab2(C,StringType,hd(Sv),lists:max(Sv),Sv,InOut);
+ no ->
+ case StringType of
+ 'IA5String' ->
+ {0,16#7F,notab};
+ 'VisibleString' ->
+ get_CharTab2(C,StringType,16#20,16#7F,notab,InOut);
+ 'PrintableString' ->
+ Chars = lists:sort(
+ " '()+,-./0123456789:=?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"),
+ get_CharTab2(C,StringType,hd(Chars),lists:max(Chars),Chars,InOut);
+ 'NumericString' ->
+ get_CharTab2(C,StringType,16#20,$9," 0123456789",InOut);
+ 'UniversalString' ->
+ {0,16#FFFFFFFF,notab};
+ 'BMPString' ->
+ {0,16#FFFF,notab}
+ end
+ end.
+
+get_CharTab2(C,StringType,Min,Max,Chars,InOut) ->
+ BitValMax = (1 bsl get_NumBits(C,StringType))-1,
+ if
+ Max =< BitValMax ->
+ {0,Max,notab};
+ true ->
+ case InOut of
+ out ->
+ {Min,Max,create_char_tab(Min,Chars)};
+ in ->
+ {Min,Max,list_to_tuple(Chars)}
+ end
+ end.
+
+create_char_tab(Min,L) ->
+ list_to_tuple(create_char_tab(Min,L,0)).
+create_char_tab(Min,[Min|T],V) ->
+ [V|create_char_tab(Min+1,T,V+1)];
+create_char_tab(_Min,[],_V) ->
+ [];
+create_char_tab(Min,L,V) ->
+ [false|create_char_tab(Min+1,L,V)].
+
+get_NumBits(C,StringType) ->
+ case get_constraint(C,'PermittedAlphabet') of
+ {'SingleValue',Sv} ->
+ charbits(length(Sv),aligned);
+ no ->
+ case StringType of
+ 'IA5String' ->
+ charbits(128,aligned); % 16#00..16#7F
+ 'VisibleString' ->
+ charbits(95,aligned); % 16#20..16#7E
+ 'PrintableString' ->
+ charbits(74,aligned); % [$\s,$',$(,$),$+,$,,$-,$.,$/,"0123456789",$:,$=,$?,$A..$Z,$a..$z
+ 'NumericString' ->
+ charbits(11,aligned); % $ ,"0123456789"
+ 'UniversalString' ->
+ 32;
+ 'BMPString' ->
+ 16
+ end
+ end.
+
+charbits(NumOfChars,aligned) ->
+ case charbits(NumOfChars) of
+ 1 -> 1;
+ 2 -> 2;
+ B when B =< 4 -> 4;
+ B when B =< 8 -> 8;
+ B when B =< 16 -> 16;
+ B when B =< 32 -> 32
+ end.
+
+charbits(NumOfChars) when NumOfChars =< 2 -> 1;
+charbits(NumOfChars) when NumOfChars =< 4 -> 2;
+charbits(NumOfChars) when NumOfChars =< 8 -> 3;
+charbits(NumOfChars) when NumOfChars =< 16 -> 4;
+charbits(NumOfChars) when NumOfChars =< 32 -> 5;
+charbits(NumOfChars) when NumOfChars =< 64 -> 6;
+charbits(NumOfChars) when NumOfChars =< 128 -> 7;
+charbits(NumOfChars) when NumOfChars =< 256 -> 8;
+charbits(NumOfChars) when NumOfChars =< 512 -> 9;
+charbits(NumOfChars) when NumOfChars =< 1024 -> 10;
+charbits(NumOfChars) when NumOfChars =< 2048 -> 11;
+charbits(NumOfChars) when NumOfChars =< 4096 -> 12;
+charbits(NumOfChars) when NumOfChars =< 8192 -> 13;
+charbits(NumOfChars) when NumOfChars =< 16384 -> 14;
+charbits(NumOfChars) when NumOfChars =< 32768 -> 15;
+charbits(NumOfChars) when NumOfChars =< 65536 -> 16;
+charbits(NumOfChars) when integer(NumOfChars) ->
+ 16 + charbits1(NumOfChars bsr 16).
+
+charbits1(0) ->
+ 0;
+charbits1(NumOfChars) ->
+ 1 + charbits1(NumOfChars bsr 1).
+
+%% copied from run time module
+
+emit_enc_octet_string(Constraint,Value) ->
+ case get_constraint(Constraint,'SizeConstraint') of
+ 0 ->
+ emit({" []"});
+ 1 ->
+ asn1ct_name:new(tmpval),
+ emit({" begin",nl}),
+ emit({" [",{curr,tmpval},"] = ",Value,",",nl}),
+% emit({" {bits,8,",{curr,tmpval},"}",nl}),
+ emit({" [10,8,",{curr,tmpval},"]",nl}),
+ emit(" end");
+ 2 ->
+ asn1ct_name:new(tmpval),
+ emit({" begin",nl}),
+ emit({" [",{curr,tmpval},",",{next,tmpval},"] = ",
+ Value,",",nl}),
+% emit({" [{bits,8,",{curr,tmpval},"},{bits,8,",
+% {next,tmpval},"}]",nl}),
+ emit({" [[10,8,",{curr,tmpval},"],[10,8,",
+ {next,tmpval},"]]",nl}),
+ emit(" end"),
+ asn1ct_name:new(tmpval);
+ Sv when integer(Sv),Sv =< 256 ->
+ asn1ct_name:new(tmpval),
+ emit({" begin",nl}),
+% emit({" case length(",Value,") == ",Sv," of",nl}),
+ emit({" case length(",Value,") of",nl}),
+ emit({" ",{curr,tmpval}," when ",{curr,tmpval}," == ",Sv," -> [2,20,",{curr,tmpval},",",Value,"];",nl}),
+ emit({" _ -> exit({error,{value_out_of_bounds,",Value,"}})",
+ nl," end",nl}),
+ emit(" end");
+ Sv when integer(Sv),Sv =< 65535 ->
+ asn1ct_name:new(tmpval),
+ emit({" begin",nl}),
+% emit({" case length(",Value,") == ",Sv," of",nl}),
+ emit({" case length(",Value,") of",nl}),
+% emit({" true -> [align,{octets,",Value,"}];",nl}),
+ emit({" ",{curr,tmpval}," when ",{curr,tmpval}," == ",Sv," -> [2,21,",{curr,tmpval},",",Value,"];",nl}),
+ emit({" _ -> exit({error,{value_out_of_bounds,",Value,"}})",
+ nl," end",nl}),
+ emit(" end");
+ C ->
+ emit({" ?RT_PER:encode_octet_string(",{asis,C},",false,",Value,")",nl})
+ end.
+
+emit_dec_octet_string(Constraint,BytesVar) ->
+ case get_constraint(Constraint,'SizeConstraint') of
+ 0 ->
+ emit({" {[],",BytesVar,"}",nl});
+ {_,0} ->
+ emit({" {[],",BytesVar,"}",nl});
+ C ->
+ emit({" ?RT_PER:decode_octet_string(",BytesVar,",",
+ {asis,C},",false)",nl})
+ end.
+
+emit_enc_integer_case(Value) ->
+ case get(component_type) of
+ {true,#'ComponentType'{prop=Prop}} ->
+ emit({" begin",nl}),
+ case Prop of
+ Opt when Opt=='OPTIONAL';
+ tuple(Opt),element(1,Opt)=='DEFAULT' ->
+ emit({" case ",Value," of",nl}),
+ ok;
+ _ ->
+ emit({" ",{curr,tmpval},"=",Value,",",nl}),
+ emit({" case ",{curr,tmpval}," of",nl}),
+ asn1ct_name:new(tmpval)
+ end;
+% asn1ct_name:new(tmpval);
+ _ ->
+ emit({" case ",Value," of ",nl})
+ end.
+emit_enc_integer_end_case() ->
+ case get(component_type) of
+ {true,_} ->
+ emit({nl," end"}); % end of begin ... end
+ _ -> ok
+ end.
+
+
+emit_enc_integer_NNL(C,Value,NNL) ->
+ EncVal = enc_integer_NNL_cases(Value,NNL),
+ emit_enc_integer(C,EncVal).
+
+enc_integer_NNL_cases(Value,NNL) ->
+ asn1ct_name:new(tmpval),
+ TmpVal = asn1ct_gen:mk_var(asn1ct_name:curr(tmpval)),
+ Cases=enc_integer_NNL_cases1(NNL),
+ lists:flatten(io_lib:format("(case ~s of "++Cases++
+ "~s when atom(~s)->exit({error,{asn1,{namednumber,~s}}});_->~s end)",[Value,TmpVal,TmpVal,TmpVal,Value])).
+
+enc_integer_NNL_cases1([{NNo,No}|Rest]) ->
+ io_lib:format("~w->~w;",[NNo,No])++enc_integer_NNL_cases1(Rest);
+enc_integer_NNL_cases1([]) ->
+ "".
+
+emit_enc_integer([{'SingleValue',Int}],Value) ->
+ asn1ct_name:new(tmpval),
+ emit_enc_integer_case(Value),% emit([" case ",Value," of",nl]),
+ emit([" ",Int," -> [];",nl]),
+ emit([" ",{curr,tmpval}," ->",nl]),
+ emit([" exit({error,{value_out_of_bounds,",{curr,tmpval},"}})",
+ nl," end",nl]),
+ emit_enc_integer_end_case();
+
+emit_enc_integer([{_,{Lb,Ub},_Range,{bits,NoBs}}],Value) -> % Range =< 255
+ asn1ct_name:new(tmpval),
+ emit_enc_integer_case(Value),
+ emit([" ",{curr,tmpval}," when ",{curr,tmpval},"=<",Ub,",",
+ {curr,tmpval},">=",Lb," ->",nl]),
+ emit([" [10,",NoBs,",",{curr,tmpval},"-",Lb,"];",nl]),
+ emit([" ",{curr,tmpval}," ->",nl]),
+ emit([" exit({error,{value_out_of_bounds,",{curr,tmpval},"}})",
+ nl," end",nl]),
+ emit_enc_integer_end_case();
+
+emit_enc_integer([{_,{Lb,Ub},Range,_}],Value) when Range =< 256 ->
+ asn1ct_name:new(tmpval),
+ emit_enc_integer_case(Value),
+ emit([" ",{curr,tmpval}," when ",{curr,tmpval},"=<",Ub,",",
+ {curr,tmpval},">=",Lb," ->",nl]),
+ emit([" [20,1,",{curr,tmpval},"-",Lb,"];",nl]),
+ emit([" ",{curr,tmpval}," ->",nl]),
+ emit([" exit({error,{value_out_of_bounds,",{curr,tmpval},"}})",
+ nl," end",nl]),
+ emit_enc_integer_end_case();
+
+emit_enc_integer([{_,{Lb,Ub},Range,_}],Value) when Range =< 65536 ->
+ asn1ct_name:new(tmpval),
+ emit_enc_integer_case(Value),
+ emit([" ",{curr,tmpval}," when ",{curr,tmpval},"=<",Ub,",",
+ {curr,tmpval},">=",Lb," ->",nl]),
+ emit([" [20,2,<<(",{curr,tmpval},"-",Lb,"):16>>];",nl]),
+ emit([" ",{curr,tmpval}," ->",nl]),
+ emit([" exit({error,{value_out_of_bounds,",{curr,tmpval},"}})",
+ nl," end",nl]),
+ emit_enc_integer_end_case();
+
+
+emit_enc_integer(C,Value) ->
+ emit({" ?RT_PER:encode_integer(",{asis,C},",",Value,")"}).
+
+
+
+
+enc_enum_cases(Value,NewList) ->
+ asn1ct_name:new(tmpval),
+ TmpVal = asn1ct_gen:mk_var(asn1ct_name:curr(tmpval)),
+ Cases=enc_enum_cases1(NewList),
+ lists:flatten(io_lib:format("(case ~s of "++Cases++
+ "~s ->exit({error,"
+ "{asn1,{enumerated,~s}}})"
+ " end)",
+ [Value,TmpVal,TmpVal])).
+enc_enum_cases1(NNL) ->
+ enc_enum_cases1(NNL,0).
+enc_enum_cases1([H|T],Index) ->
+ io_lib:format("~w->~w;",[H,Index])++enc_enum_cases1(T,Index+1);
+enc_enum_cases1([],_) ->
+ "".
+
+
+emit_enc_enumerated_cases(C, [H], Count) ->
+ emit_enc_enumerated_case(C, H, Count),
+ emit([";",nl,"EnumVal -> exit({error,{asn1, {enumerated_not_in_range, EnumVal}}})"]),
+ emit([nl,"end"]);
+emit_enc_enumerated_cases(C, ['EXT_MARK'|T], _Count) ->
+ emit_enc_enumerated_cases(C, T, 0);
+emit_enc_enumerated_cases(C, [H1,H2|T], Count) ->
+ emit_enc_enumerated_case(C, H1, Count),
+ emit([";",nl]),
+ emit_enc_enumerated_cases(C, [H2|T], Count+1).
+
+
+%% The function clauses matching on tuples with first element
+%% asn1_enum, 1 or 0 and the atom 'EXT_MARK' are for ENUMERATED
+%% with extension mark.
+emit_enc_enumerated_case(_C, {asn1_enum,High}, _) ->
+ %% ENUMERATED with extensionmark
+ %% value higher than the extension base and not
+ %% present in the extension range.
+ emit(["{asn1_enum,EnumV} when integer(EnumV), EnumV > ",High," -> ",
+ "[1,?RT_PER:encode_small_number(EnumV)]"]);
+emit_enc_enumerated_case(_C, 'EXT_MARK', _Count) ->
+ %% ENUMERATED with extensionmark
+ true;
+emit_enc_enumerated_case(_C, {1,EnumName}, Count) ->
+ %% ENUMERATED with extensionmark
+ %% values higher than extension root
+ emit(["'",EnumName,"' -> [1,?RT_PER:encode_small_number(",Count,")]"]);
+emit_enc_enumerated_case(C, {0,EnumName}, Count) ->
+ %% ENUMERATED with extensionmark
+ %% values within extension root
+ emit(["'",EnumName,"' -> [0,?RT_PER:encode_integer(",{asis,C},", ",Count,")]"]);
+
+%% This clause is invoked in case of an ENUMERATED without extension mark
+emit_enc_enumerated_case(_C, EnumName, Count) ->
+ emit(["'",EnumName,"' -> ",Count]).
+
+
+get_constraint([{Key,V}],Key) ->
+ V;
+get_constraint([],_) ->
+ no;
+get_constraint(C,Key) ->
+ case lists:keysearch(Key,1,C) of
+ false ->
+ no;
+ {value,{_,V}} ->
+ V
+ end.
+
+get_constraints(L=[{Key,_}],Key) ->
+ L;
+get_constraints([],_) ->
+ [];
+get_constraints(C,Key) ->
+ {value,L} = keysearch_allwithkey(Key,1,C,[]),
+ L.
+
+keysearch_allwithkey(Key,Ix,C,Acc) ->
+ case lists:keysearch(Key,Ix,C) of
+ false ->
+ {value,Acc};
+ {value,T} ->
+ RestC = lists:delete(T,C),
+ keysearch_allwithkey(Key,Ix,RestC,[T|Acc])
+ end.
+
+%% effective_constraint(Type,C)
+%% Type = atom()
+%% C = [C1,...]
+%% C1 = {'SingleValue',SV} | {'ValueRange',VR} | {atom(),term()}
+%% SV = integer() | [integer(),...]
+%% VR = {Lb,Ub}
+%% Lb = 'MIN' | integer()
+%% Ub = 'MAX' | integer()
+%% Returns a single value if C only has a single value constraint, and no
+%% value range constraints, that constrains to a single value, otherwise
+%% returns a value range that has the lower bound set to the lowest value
+%% of all single values and lower bound values in C and the upper bound to
+%% the greatest value.
+effective_constraint(integer,[C={{_,_},_}|_Rest]) -> % extension
+ [C]; %% [C|effective_constraint(integer,Rest)]; XXX what is possible ???
+effective_constraint(integer,C) ->
+ SVs = get_constraints(C,'SingleValue'),
+ SV = effective_constr('SingleValue',SVs),
+ VRs = get_constraints(C,'ValueRange'),
+ VR = effective_constr('ValueRange',VRs),
+ CRange = greatest_common_range(SV,VR),
+ pre_encode(integer,CRange);
+effective_constraint(bitstring,C) ->
+% Constr=get_constraints(C,'SizeConstraint'),
+% case Constr of
+% [] -> no;
+% [{'SizeConstraint',Val}] -> Val;
+% Other -> Other
+% end;
+ get_constraint(C,'SizeConstraint');
+effective_constraint(Type,C) ->
+ io:format("Effective constraint for ~p, not implemented yet.~n",[Type]),
+ C.
+
+effective_constr(_,[]) ->
+ [];
+effective_constr('SingleValue',List) ->
+ SVList = lists:flatten(lists:map(fun(X)->element(2,X)end,List)),
+ case lists:usort(SVList) of
+ [N] ->
+ [{'SingleValue',N}];
+ L when list(L) ->
+ [{'ValueRange',{hd(L),lists:last(L)}}]
+ end;
+effective_constr('ValueRange',List) ->
+ LBs = lists:map(fun({_,{Lb,_}})-> Lb end,List),
+ UBs = lists:map(fun({_,{_,Ub}})-> Ub end,List),
+ Lb = least_Lb(LBs),
+ [{'ValueRange',{Lb,lists:max(UBs)}}].
+
+greatest_common_range([],VR) ->
+ VR;
+greatest_common_range(SV,[]) ->
+ SV;
+greatest_common_range([{_,Int}],[{_,{'MIN',Ub}}]) when integer(Int),
+ Int > Ub ->
+ [{'ValueRange',{'MIN',Int}}];
+greatest_common_range([{_,Int}],[{_,{Lb,Ub}}]) when integer(Int),
+ Int < Lb ->
+ [{'ValueRange',{Int,Ub}}];
+greatest_common_range([{_,Int}],VR=[{_,{_Lb,_Ub}}]) when integer(Int) ->
+ VR;
+greatest_common_range([{_,L}],[{_,{Lb,Ub}}]) when list(L) ->
+ Min = least_Lb([Lb|L]),
+ Max = greatest_Ub([Ub|L]),
+ [{'ValueRange',{Min,Max}}].
+
+
+least_Lb(L) ->
+ case lists:member('MIN',L) of
+ true -> 'MIN';
+ _ -> lists:min(L)
+ end.
+
+greatest_Ub(L) ->
+ case lists:member('MAX',L) of
+ true -> 'MAX';
+ _ -> lists:max(L)
+ end.
+
+% effective_constraint1('SingleValue',List) ->
+% SVList = lists:map(fun(X)->element(2,X)end,List),
+% sv_effective_constraint(hd(SVList),tl(SVList));
+% effective_constraint1('ValueRange',List) ->
+% VRList = lists:map(fun(X)->element(2,X)end,List),
+% vr_effective_constraint(lists:map(fun(X)->element(1,X)end,VRList),
+% lists:map(fun(X)->element(2,X)end,VRList)).
+
+%% vr_effective_constraint/2
+%% Gets all LowerEndPoints and UpperEndPoints as arguments
+%% Returns {'ValueRange',{Lb,Ub}} where Lb is the highest value of
+%% the LowerEndPoints and Ub is the lowest value of the UpperEndPoints,
+%% i.e. the intersection of all value ranges.
+% vr_effective_constraint(Mins,Maxs) ->
+% Lb=lists:foldl(fun(X,'MIN') when integer(X) -> X;
+% (X,'MIN') -> 'MIN';
+% (X,AccIn) when integer(X),X >= AccIn -> X;
+% (X,AccIn) -> AccIn
+% end,hd(Mins),tl(Mins)),
+% Ub = lists:min(Maxs),
+% {'ValueRange',{Lb,Ub}}.
+
+
+% sv_effective_constraint(SV,[]) ->
+% {'SingleValue',SV};
+% sv_effective_constraint([],_) ->
+% exit({error,{asn1,{illegal_single_value_constraint}}});
+% sv_effective_constraint(SV,[SV|Rest]) ->
+% sv_effective_constraint(SV,Rest);
+% sv_effective_constraint(Int,[SV|Rest]) when integer(Int),list(SV) ->
+% case lists:member(Int,SV) of
+% true ->
+% sv_effective_constraint(Int,Rest);
+% _ ->
+% exit({error,{asn1,{illegal_single_value_constraint}}})
+% end;
+% sv_effective_constraint(SV,[Int|Rest]) when integer(Int),list(SV) ->
+% case lists:member(Int,SV) of
+% true ->
+% sv_effective_constraint(Int,Rest);
+% _ ->
+% exit({error,{asn1,{illegal_single_value_constraint}}})
+% end;
+% sv_effective_constraint(SV1,[SV2|Rest]) when list(SV1),list(SV2) ->
+% sv_effective_constraint(common_set(SV1,SV2),Rest);
+% sv_effective_constraint(_,_) ->
+% exit({error,{asn1,{illegal_single_value_constraint}}}).
+
+%% common_set/2
+%% Two lists as input
+%% Returns the list with all elements that are common for both
+%% input lists
+% common_set(SV1,SV2) ->
+% lists:filter(fun(X)->lists:member(X,SV1) end,SV2).
+
+
+
+pre_encode(integer,[]) ->
+ [];
+pre_encode(integer,C=[{'SingleValue',_}]) ->
+ C;
+pre_encode(integer,C=[{'ValueRange',VR={Lb,Ub}}]) when integer(Lb),integer(Ub)->
+ Range = Ub-Lb+1,
+ if
+ Range =< 255 ->
+ NoBits = no_bits(Range),
+ [{'ValueRange',VR,Range,{bits,NoBits}}];
+ Range =< 256 ->
+ [{'ValueRange',VR,Range,{octets,1}}];
+ Range =< 65536 ->
+ [{'ValueRange',VR,Range,{octets,2}}];
+ true ->
+ C
+ end;
+pre_encode(integer,C) ->
+ C.
+
+no_bits(2) -> 1;
+no_bits(N) when N=<4 -> 2;
+no_bits(N) when N=<8 -> 3;
+no_bits(N) when N=<16 -> 4;
+no_bits(N) when N=<32 -> 5;
+no_bits(N) when N=<64 -> 6;
+no_bits(N) when N=<128 -> 7;
+no_bits(N) when N=<255 -> 8.
+
+%% Object code generating for encoding and decoding
+%% ------------------------------------------------
+
+gen_obj_code(Erules,_Module,Obj) when record(Obj,typedef) ->
+ ObjName = Obj#typedef.name,
+ Def = Obj#typedef.typespec,
+ #'Externaltypereference'{module=Mod,type=ClassName} =
+ Def#'Object'.classname,
+ Class = asn1_db:dbget(Mod,ClassName),
+ {object,_,Fields} = Def#'Object'.def,
+ emit({nl,nl,nl,"%%================================"}),
+ emit({nl,"%% ",ObjName}),
+ emit({nl,"%%================================",nl}),
+ EncConstructed =
+% gen_encode_objectfields(Class#classdef.typespec,ObjName,Fields,[]),
+ gen_encode_objectfields(ClassName,get_class_fields(Class),
+ ObjName,Fields,[]),
+ emit(nl),
+ gen_encode_constr_type(Erules,EncConstructed),
+ emit(nl),
+ DecConstructed =
+% gen_decode_objectfields(Class#classdef.typespec,ObjName,Fields,[]),
+ gen_decode_objectfields(ClassName,get_class_fields(Class),
+ ObjName,Fields,[]),
+ emit(nl),
+ gen_decode_constr_type(Erules,DecConstructed),
+ emit(nl);
+gen_obj_code(_Erules,_Module,Obj) when record(Obj,pobjectdef) ->
+ ok.
+
+gen_encode_objectfields(ClassName,[{typefield,Name,OptOrMand}|Rest],
+ ObjName,ObjectFields,ConstrAcc) ->
+ EmitFuncClause =
+ fun(V) ->
+ emit(["'enc_",ObjName,"'(",{asis,Name},
+ ",",V,",_RestPrimFieldName) ->",nl])
+ end,
+% emit(["'enc_",ObjName,"'(",{asis,Name},
+% ", Val, RestPrimFieldName) ->",nl]),
+ MaybeConstr =
+ case {get_object_field(Name,ObjectFields),OptOrMand} of
+ {false,'MANDATORY'} -> %% this case is illegal
+ exit({error,{asn1,{"missing mandatory field in object",
+ ObjName}}});
+ {false,'OPTIONAL'} ->
+ EmitFuncClause("_"),
+ emit(" <<>>"),
+ [];
+ {false,{'DEFAULT',DefaultType}} ->
+ EmitFuncClause("Val"),
+ gen_encode_default_call(ClassName,Name,DefaultType);
+ {{Name,TypeSpec},_} ->
+ %% A specified field owerwrites any 'DEFAULT' or
+ %% 'OPTIONAL' field in the class
+ EmitFuncClause("Val"),
+ gen_encode_field_call(ObjName,Name,TypeSpec)
+ end,
+ case more_genfields(Rest) of
+ true ->
+ emit([";",nl]);
+ false ->
+ emit([".",nl])
+ end,
+ gen_encode_objectfields(ClassName,Rest,ObjName,ObjectFields,
+ MaybeConstr++ConstrAcc);
+gen_encode_objectfields(ClassName,[{objectfield,Name,_,_,OptOrMand}|Rest],
+ ObjName,ObjectFields,ConstrAcc) ->
+ EmitFuncClause =
+ fun(Attrs) ->
+ emit(["'enc_",ObjName,"'(",{asis,Name},
+ ",",Attrs,") ->",nl])
+ end,
+% emit(["'enc_",ObjName,"'(",{asis,Name},
+% ", Val,[H|T]) ->",nl]),
+ case {get_object_field(Name,ObjectFields),OptOrMand} of
+ {false,'MANDATORY'} ->
+ exit({error,{asn1,{"missing mandatory field in object",
+ ObjName}}});
+ {false,'OPTIONAL'} ->
+ EmitFuncClause("_,_"),
+ emit([" exit({error,{'use of missing field in object', ",Name,
+ "}})"]);
+ {false,{'DEFAULT',_DefaultObject}} ->
+ exit({error,{asn1,{"not implemented yet",Name}}});
+ {{Name,TypeSpec},_} ->
+ EmitFuncClause("Val,[H|T]"),
+ case TypeSpec#typedef.name of
+ {ExtMod,TypeName} ->
+ emit({indent(3),"'",ExtMod,"':'enc_",TypeName,
+ "'(H, Val, T)"});
+ TypeName ->
+ emit({indent(3),"'enc_",TypeName,"'(H, Val, T)"})
+ end
+ end,
+ case more_genfields(Rest) of
+ true ->
+ emit([";",nl]);
+ false ->
+ emit([".",nl])
+ end,
+ gen_encode_objectfields(ClassName,Rest,ObjName,ObjectFields,ConstrAcc);
+gen_encode_objectfields(ClassName,[_C|Cs],O,OF,Acc) ->
+ gen_encode_objectfields(ClassName,Cs,O,OF,Acc);
+gen_encode_objectfields(_,[],_,_,Acc) ->
+ Acc.
+
+% gen_encode_objectfields(Class,ObjName,[{FieldName,Type}|Rest],ConstrAcc) ->
+% Fields = Class#objectclass.fields,
+
+% MaybeConstr =
+% case is_typefield(Fields,FieldName) of
+% true ->
+% Def = Type#typedef.typespec,
+% emit({"'enc_",ObjName,"'(",{asis,FieldName},
+% ", Val, Dummy) ->",nl}),
+
+% CAcc =
+% case Type#typedef.name of
+% {primitive,bif} ->
+% gen_encode_prim(per,Def,"false","Val"),
+% [];
+% {constructed,bif} ->
+% emit({" 'enc_",ObjName,'_',FieldName,
+% "'(Val)"}),
+% [{['enc_',ObjName,'_',FieldName],Def}];
+% {ExtMod,TypeName} ->
+% emit({" '",ExtMod,"':'enc_",TypeName,"'(Val)"}),
+% [];
+% TypeName ->
+% emit({" 'enc_",TypeName,"'(Val)"}),
+% []
+% end,
+% case more_genfields(Fields,Rest) of
+% true ->
+% emit({";",nl});
+% false ->
+% emit({".",nl})
+% end,
+% CAcc;
+% {false,objectfield} ->
+% emit({"'enc_",ObjName,"'(",{asis,FieldName},
+% ", Val, [H|T]) ->",nl}),
+% case Type#typedef.name of
+% {ExtMod,TypeName} ->
+% emit({indent(3),"'",ExtMod,"':'enc_",TypeName,
+% "'(H, Val, T)"});
+% TypeName ->
+% emit({indent(3),"'enc_",TypeName,"'(H, Val, T)"})
+% end,
+% case more_genfields(Fields,Rest) of
+% true ->
+% emit({";",nl});
+% false ->
+% emit({".",nl})
+% end,
+% [];
+% {false,_} -> []
+% end,
+% gen_encode_objectfields(Class,ObjName,Rest,MaybeConstr ++ ConstrAcc);
+% gen_encode_objectfields(C,O,[_|T],Acc) ->
+% gen_encode_objectfields(C,O,T,Acc);
+% gen_encode_objectfields(_,_,[],Acc) ->
+% Acc.
+
+gen_encode_constr_type(Erules,[TypeDef|Rest]) when record(TypeDef,typedef) ->
+ case is_already_generated(enc,TypeDef#typedef.name) of
+ true -> ok;
+ _ ->
+ Name = lists:concat(["enc_",TypeDef#typedef.name]),
+ emit({Name,"(Val) ->",nl}),
+ Def = TypeDef#typedef.typespec,
+ InnerType = asn1ct_gen:get_inner(Def#type.def),
+ asn1ct_gen:gen_encode_constructed(Erules,Name,InnerType,Def),
+ gen_encode_constr_type(Erules,Rest)
+ end;
+gen_encode_constr_type(_,[]) ->
+ ok.
+
+gen_encode_field_call(ObjName,FieldName,Type) ->
+ Def = Type#typedef.typespec,
+ case Type#typedef.name of
+ {primitive,bif} ->
+ gen_encode_prim(per,Def,"false",
+ "Val"),
+ [];
+ {constructed,bif} ->
+ emit({" 'enc_",ObjName,'_',FieldName,
+ "'(Val)"}),
+ [Type#typedef{name=list_to_atom(lists:concat([ObjName,'_',FieldName]))}];
+ {ExtMod,TypeName} ->
+ emit({" '",ExtMod,"':'enc_",TypeName,
+ "'(Val)"}),
+ [];
+ TypeName ->
+ emit({" 'enc_",TypeName,"'(Val)"}),
+ []
+ end.
+
+gen_encode_default_call(ClassName,FieldName,Type) ->
+ CurrentMod = get(currmod),
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ case asn1ct_gen:type(InnerType) of
+ {constructed,bif} ->
+%% asn1ct_gen:gen_encode_constructed(Erules,Typename,InnerType,Type);
+ emit([" 'enc_",ClassName,'_',FieldName,"'(Val)"]),
+ [#typedef{name=list_to_atom(lists:concat([ClassName,'_',FieldName])),
+ typespec=Type}];
+ {primitive,bif} ->
+ gen_encode_prim(per,Type,"false","Val"),
+ [];
+ #'Externaltypereference'{module=CurrentMod,type=Etype} ->
+ emit([" 'enc_",Etype,"'(Val)",nl]),
+ [];
+ #'Externaltypereference'{module=Emod,type=Etype} ->
+ emit([" '",Emod,"':'enc_",Etype,"'(Val)",nl]),
+ []
+ end.
+
+
+
+gen_decode_objectfields(ClassName,[{typefield,Name,OptOrMand}|Rest],
+ ObjName,ObjectFields,ConstrAcc) ->
+ EmitFuncClause =
+ fun(Bytes) ->
+ emit(["'dec_",ObjName,"'(",{asis,Name},",",Bytes,
+ ",_,_RestPrimFieldName) ->",nl])
+ end,
+% emit(["'dec_",ObjName,"'(",{asis,Name},
+% ", Bytes, _, RestPrimFieldName) ->",nl]),
+ MaybeConstr=
+ case {get_object_field(Name,ObjectFields),OptOrMand} of
+ {false,'MANDATORY'} -> %% this case is illegal
+ exit({error,{asn1,{"missing mandatory field in object",
+ ObjName}}});
+ {false,'OPTIONAL'} ->
+ EmitFuncClause("_"),
+ emit([" asn1_NOVALUE"]),
+ [];
+ {false,{'DEFAULT',DefaultType}} ->
+ EmitFuncClause("Bytes"),
+ gen_decode_default_call(ClassName,Name,"Bytes",DefaultType);
+ {{Name,TypeSpec},_} ->
+ %% A specified field owerwrites any 'DEFAULT' or
+ %% 'OPTIONAL' field in the class
+ EmitFuncClause("Bytes"),
+ gen_decode_field_call(ObjName,Name,"Bytes",TypeSpec)
+ end,
+ case more_genfields(Rest) of
+ true ->
+ emit([";",nl]);
+ false ->
+ emit([".",nl])
+ end,
+ gen_decode_objectfields(ClassName,Rest,ObjName,ObjectFields,MaybeConstr++ConstrAcc);
+gen_decode_objectfields(ClassName,[{objectfield,Name,_,_,OptOrMand}|Rest],
+ ObjName,ObjectFields,ConstrAcc) ->
+ EmitFuncClause =
+ fun(Attrs) ->
+ emit(["'dec_",ObjName,"'(",{asis,Name},
+ ",",Attrs,") ->",nl])
+ end,
+% emit(["'dec_",ObjName,"'(",{asis,Name},
+% ", Bytes,_,[H|T]) ->",nl]),
+ case {get_object_field(Name,ObjectFields),OptOrMand} of
+ {false,'MANDATORY'} ->
+ exit({error,{asn1,{"missing mandatory field in object",
+ ObjName}}});
+ {false,'OPTIONAL'} ->
+ EmitFuncClause("_,_,_"),
+ emit([" exit({error,{'illegal use of missing field in object', ",Name,
+ "}})"]);
+ {false,{'DEFAULT',_DefaultObject}} ->
+ exit({error,{asn1,{"not implemented yet",Name}}});
+ {{Name,TypeSpec},_} ->
+ EmitFuncClause("Bytes,_,[H|T]"),
+ case TypeSpec#typedef.name of
+ {ExtMod,TypeName} ->
+ emit({indent(3),"'",ExtMod,"':'dec_",TypeName,
+ "'(H, Bytes, telltype, T)"});
+ TypeName ->
+ emit({indent(3),"'dec_",TypeName,"'(H, Bytes, telltype, T)"})
+ end
+ end,
+ case more_genfields(Rest) of
+ true ->
+ emit([";",nl]);
+ false ->
+ emit([".",nl])
+ end,
+ gen_decode_objectfields(ClassName,Rest,ObjName,ObjectFields,ConstrAcc);
+gen_decode_objectfields(CN,[_C|Cs],O,OF,CAcc) ->
+ gen_decode_objectfields(CN,Cs,O,OF,CAcc);
+gen_decode_objectfields(_,[],_,_,CAcc) ->
+ CAcc.
+
+
+gen_decode_field_call(ObjName,FieldName,Bytes,Type) ->
+ Def = Type#typedef.typespec,
+ case Type#typedef.name of
+ {primitive,bif} ->
+ gen_dec_prim(per,Def,Bytes),
+ [];
+ {constructed,bif} ->
+ emit({" 'dec_",ObjName,'_',FieldName,
+ "'(",Bytes,",telltype)"}),
+ [Type#typedef{name=list_to_atom(lists:concat([ObjName,'_',FieldName]))}];
+ {ExtMod,TypeName} ->
+ emit({" '",ExtMod,"':'dec_",TypeName,
+ "'(",Bytes,", telltype)"}),
+ [];
+ TypeName ->
+ emit({" 'dec_",TypeName,"'(",Bytes,", telltype)"}),
+ []
+ end.
+
+gen_decode_default_call(ClassName,FieldName,Bytes,Type) ->
+ CurrentMod = get(currmod),
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ case asn1ct_gen:type(InnerType) of
+ {constructed,bif} ->
+ emit([" 'dec_",ClassName,'_',FieldName,"'(",Bytes,", telltype)"]),
+ [#typedef{name=list_to_atom(lists:concat([ClassName,'_',FieldName])),
+ typespec=Type}];
+ {primitive,bif} ->
+ gen_dec_prim(per,Type,Bytes),
+ [];
+ #'Externaltypereference'{module=CurrentMod,type=Etype} ->
+ emit([" 'dec_",Etype,"'(",Bytes,", telltype)",nl]),
+ [];
+ #'Externaltypereference'{module=Emod,type=Etype} ->
+ emit([" '",Emod,"':'dec_",Etype,"'(",Bytes,", telltype)",nl]),
+ []
+ end.
+
+%%%%%%%%%%%%%%%
+
+% gen_decode_objectfields(Class,ObjName,[{FieldName,Type}|Rest],ConstrAcc) ->
+% Fields = Class#objectclass.fields,
+
+% MaybeConstr =
+% case is_typefield(Fields,FieldName) of
+% true ->
+% Def = Type#typedef.typespec,
+% emit({"'dec_",ObjName,"'(",{asis,FieldName},
+% ", Val, Telltype, RestPrimFieldName) ->",nl}),
+
+% CAcc =
+% case Type#typedef.name of
+% {primitive,bif} ->
+% gen_dec_prim(per,Def,"Val"),
+% [];
+% {constructed,bif} ->
+% emit({" 'dec_",ObjName,'_',FieldName,
+% "'(Val, Telltype)"}),
+% [{['dec_',ObjName,'_',FieldName],Def}];
+% {ExtMod,TypeName} ->
+% emit({" '",ExtMod,"':'dec_",TypeName,
+% "'(Val, Telltype)"}),
+% [];
+% TypeName ->
+% emit({" 'dec_",TypeName,"'(Val, Telltype)"}),
+% []
+% end,
+% case more_genfields(Fields,Rest) of
+% true ->
+% emit({";",nl});
+% false ->
+% emit({".",nl})
+% end,
+% CAcc;
+% {false,objectfield} ->
+% emit({"'dec_",ObjName,"'(",{asis,FieldName},
+% ", Val, Telltype, [H|T]) ->",nl}),
+% case Type#typedef.name of
+% {ExtMod,TypeName} ->
+% emit({indent(3),"'",ExtMod,"':'dec_",TypeName,
+% "'(H, Val, Telltype, T)"});
+% TypeName ->
+% emit({indent(3),"'dec_",TypeName,
+% "'(H, Val, Telltype, T)"})
+% end,
+% case more_genfields(Fields,Rest) of
+% true ->
+% emit({";",nl});
+% false ->
+% emit({".",nl})
+% end,
+% [];
+% {false,_} ->
+% []
+% end,
+% gen_decode_objectfields(Class,ObjName,Rest,MaybeConstr ++ ConstrAcc);
+% gen_decode_objectfields(C,O,[_|T],CAcc) ->
+% gen_decode_objectfields(C,O,T,CAcc);
+% gen_decode_objectfields(_,_,[],CAcc) ->
+% CAcc.
+
+gen_decode_constr_type(Erules,[{Name,Def}|Rest]) ->
+ emit({Name,"(Bytes,_) ->",nl}),
+ InnerType = asn1ct_gen:get_inner(Def#type.def),
+ asn1ct_gen:gen_decode_constructed(Erules,Name,InnerType,Def),
+ gen_decode_constr_type(Erules,Rest);
+gen_decode_constr_type(Erules,[TypeDef|Rest]) when record(TypeDef,typedef) ->
+ case is_already_generated(dec,TypeDef#typedef.name) of
+ true -> ok;
+ _ ->
+ gen_decode(Erules,TypeDef)
+ end,
+ gen_decode_constr_type(Erules,Rest);
+gen_decode_constr_type(_,[]) ->
+ ok.
+
+% is_typefield(Fields,FieldName) ->
+% case lists:keysearch(FieldName,2,Fields) of
+% {value,Field} ->
+% case element(1,Field) of
+% typefield ->
+% true;
+% Other ->
+% {false,Other}
+% end;
+% _ ->
+% false
+% end.
+%% Object Set code generating for encoding and decoding
+%% ----------------------------------------------------
+gen_objectset_code(Erules,ObjSet) ->
+ ObjSetName = ObjSet#typedef.name,
+ Def = ObjSet#typedef.typespec,
+%% {ClassName,ClassDef} = Def#'ObjectSet'.class,
+ #'Externaltypereference'{module=ClassModule,
+ type=ClassName} = Def#'ObjectSet'.class,
+ ClassDef = asn1_db:dbget(ClassModule,ClassName),
+ UniqueFName = Def#'ObjectSet'.uniquefname,
+ Set = Def#'ObjectSet'.set,
+ emit({nl,nl,nl,"%%================================"}),
+ emit({nl,"%% ",ObjSetName}),
+ emit({nl,"%%================================",nl}),
+ case ClassName of
+ {_Module,ExtClassName} ->
+ gen_objset_code(Erules,ObjSetName,UniqueFName,Set,
+ ExtClassName,ClassDef);
+ _ ->
+ gen_objset_code(Erules,ObjSetName,UniqueFName,Set,
+ ClassName,ClassDef)
+ end,
+ emit(nl).
+
+gen_objset_code(Erules,ObjSetName,UniqueFName,Set,ClassName,ClassDef)->
+ ClassFields = (ClassDef#classdef.typespec)#objectclass.fields,
+ InternalFuncs=
+ gen_objset_enc(ObjSetName,UniqueFName,Set,ClassName,
+ ClassFields,1,[]),
+ gen_objset_dec(ObjSetName,UniqueFName,Set,ClassName,ClassFields,1),
+ gen_internal_funcs(Erules,InternalFuncs).
+
+gen_objset_enc(_,{unique,undefined},_,_,_,_,_) ->
+ %% There is no unique field in the class of this object set
+ %% don't bother about the constraint
+ [];
+gen_objset_enc(ObjSName,UniqueName,[{ObjName,Val,Fields},T|Rest],
+ ClName,ClFields,NthObj,Acc)->
+ emit({"'getenc_",ObjSName,"'(",{asis,UniqueName},",",
+ {asis,Val},") ->",nl}),
+ {InternalFunc,NewNthObj}=
+ case ObjName of
+ no_name ->
+ gen_inlined_enc_funs(Fields,ClFields,ObjSName,NthObj);
+ _ ->
+ emit({" fun 'enc_",ObjName,"'/3"}),
+ {[],NthObj}
+ end,
+ emit({";",nl}),
+ gen_objset_enc(ObjSName,UniqueName,[T|Rest],ClName,ClFields,
+ NewNthObj,InternalFunc++Acc);
+gen_objset_enc(ObjSetName,UniqueName,
+ [{ObjName,Val,Fields}],_ClName,ClFields,NthObj,Acc) ->
+
+ emit({"'getenc_",ObjSetName,"'(",{asis,UniqueName},",",
+ {asis,Val},") ->",nl}),
+ {InternalFunc,_}=
+ case ObjName of
+ no_name ->
+ gen_inlined_enc_funs(Fields,ClFields,ObjSetName,NthObj);
+ _ ->
+ emit({" fun 'enc_",ObjName,"'/3"}),
+ {[],NthObj}
+ end,
+ emit({".",nl,nl}),
+ InternalFunc++Acc;
+gen_objset_enc(ObjSetName,_UniqueName,['EXTENSIONMARK'],_ClName,
+ _ClFields,_NthObj,Acc) ->
+ emit({"'getenc_",ObjSetName,"'(_, _) ->",nl}),
+ emit({indent(3),"fun(_, Val, _) ->",nl}),
+ emit({indent(6),"Size = if",nl}),
+ emit({indent(9),"list(Val) -> length(Val);",nl}),
+ emit({indent(9),"true -> size(Val)",nl}),
+ emit({indent(6),"end,",nl}),
+ emit({indent(6),"if",nl}),
+ emit({indent(9),"Size < 256 ->",nl}),
+ emit({indent(12),"[20,Size,Val];",nl}),
+ emit({indent(9),"true ->",nl}),
+ emit({indent(12),"[21,<<Size:16>>,Val]",nl}),
+ emit({indent(6),"end",nl}),
+ emit({indent(3),"end.",nl,nl}),
+ Acc;
+gen_objset_enc(_,_,[],_,_,_,Acc) ->
+ Acc.
+
+%% gen_inlined_enc_funs for each object iterates over all fields of a
+%% class, and for each typefield it checks if the object has that
+%% field and emits the proper code.
+gen_inlined_enc_funs(Fields,[{typefield,Name,_}|Rest],ObjSetName,NthObj) ->
+ InternalDefFunName=asn1ct_gen:list2name([NthObj,Name,ObjSetName]),
+ case lists:keysearch(Name,1,Fields) of
+ {value,{_,Type}} when record(Type,type) ->
+ emit({indent(3),"fun(Type, Val, _) ->",nl,
+ indent(6),"case Type of",nl}),
+ {Ret,N}=emit_inner_of_fun(Type,InternalDefFunName),
+ gen_inlined_enc_funs1(Fields,Rest,ObjSetName,NthObj+N,Ret);
+ {value,{_,Type}} when record(Type,typedef) ->
+ emit({indent(3),"fun(Type, Val, _) ->",nl,
+ indent(6),"case Type of",nl}),
+ emit({indent(9),{asis,Name}," ->",nl}),
+ {Ret,N}=emit_inner_of_fun(Type,InternalDefFunName),
+ gen_inlined_enc_funs1(Fields,Rest,ObjSetName,NthObj+N,Ret);
+ false ->
+ gen_inlined_enc_funs(Fields,Rest,ObjSetName,NthObj)
+ end;
+gen_inlined_enc_funs(Fields,[_|Rest],ObjSetName,NthObj) ->
+ gen_inlined_enc_funs(Fields,Rest,ObjSetName,NthObj);
+gen_inlined_enc_funs(_,[],_,NthObj) ->
+ {[],NthObj}.
+
+gen_inlined_enc_funs1(Fields,[{typefield,Name,_}|Rest],ObjSetName,
+ NthObj,Acc) ->
+ InternalDefFunName = asn1ct_gen:list2name([NthObj,Name,ObjSetName]),
+ {Acc2,NAdd}=
+ case lists:keysearch(Name,1,Fields) of
+ {value,{_,Type}} when record(Type,type) ->
+ emit({";",nl}),
+ {Ret,N}=emit_inner_of_fun(Type,InternalDefFunName),
+ {Ret++Acc,N};
+ {value,{_,Type}} when record(Type,typedef) ->
+ emit({";",nl,indent(9),{asis,Name}," ->",nl}),
+ {Ret,N}=emit_inner_of_fun(Type,InternalDefFunName),
+ {Ret++Acc,N};
+ false ->
+ {Acc,0}
+ end,
+ gen_inlined_enc_funs1(Fields,Rest,ObjSetName,NthObj+NAdd,Acc2);
+gen_inlined_enc_funs1(Fields,[_|Rest],ObjSetName,NthObj,Acc)->
+ gen_inlined_enc_funs1(Fields,Rest,ObjSetName,NthObj,Acc);
+gen_inlined_enc_funs1(_,[],_,NthObj,Acc) ->
+ emit({nl,indent(6),"end",nl}),
+ emit({indent(3),"end"}),
+ {Acc,NthObj}.
+
+emit_inner_of_fun(TDef=#typedef{name={ExtMod,Name},typespec=Type},
+ InternalDefFunName) ->
+ case {ExtMod,Name} of
+ {primitive,bif} ->
+ emit(indent(12)),
+ gen_encode_prim(per,Type,dotag,"Val"),
+ {[],0};
+ {constructed,bif} ->
+ emit([indent(12),"'enc_",
+ InternalDefFunName,"'(Val)"]),
+ {[TDef#typedef{name=InternalDefFunName}],1};
+ _ ->
+ emit({indent(12),"'",ExtMod,"':'enc_",Name,"'(Val)"}),
+ {[],0}
+ end;
+emit_inner_of_fun(#typedef{name=Name},_) ->
+ emit({indent(12),"'enc_",Name,"'(Val)"}),
+ {[],0};
+emit_inner_of_fun(Type,_) when record(Type,type) ->
+ CurrMod = get(currmod),
+ case Type#type.def of
+ Def when atom(Def) ->
+ emit({indent(9),Def," ->",nl,indent(12)}),
+ gen_encode_prim(erules,Type,dotag,"Val");
+ TRef when record(TRef,typereference) ->
+ T = TRef#typereference.val,
+ emit({indent(9),T," ->",nl,indent(12),"'enc_",T,"'(Val)"});
+ #'Externaltypereference'{module=CurrMod,type=T} ->
+ emit({indent(9),T," ->",nl,indent(12),"'enc_",T,"'(Val)"});
+ #'Externaltypereference'{module=ExtMod,type=T} ->
+ emit({indent(9),T," ->",nl,indent(12),ExtMod,":'enc_",
+ T,"'(Val)"})
+ end,
+ {[],0}.
+
+indent(N) ->
+ lists:duplicate(N,32). % 32 = space
+
+
+gen_objset_dec(_,{unique,undefined},_,_,_,_) ->
+ %% There is no unique field in the class of this object set
+ %% don't bother about the constraint
+ ok;
+gen_objset_dec(ObjSName,UniqueName,[{ObjName,Val,Fields},T|Rest],ClName,
+ ClFields,NthObj)->
+
+ emit({"'getdec_",ObjSName,"'(",{asis,UniqueName},",",
+ {asis,Val},") ->",nl}),
+ NewNthObj=
+ case ObjName of
+ no_name ->
+ gen_inlined_dec_funs(Fields,ClFields,ObjSName,NthObj);
+ _ ->
+ emit({" fun 'dec_",ObjName,"'/4"}),
+ NthObj
+ end,
+ emit({";",nl}),
+ gen_objset_dec(ObjSName,UniqueName,[T|Rest],ClName,ClFields,NewNthObj);
+gen_objset_dec(ObjSetName,UniqueName,[{ObjName,Val,Fields}],_ClName,
+ ClFields,NthObj) ->
+
+ emit({"'getdec_",ObjSetName,"'(",{asis,UniqueName},",",
+ {asis,Val},") ->",nl}),
+ case ObjName of
+ no_name ->
+ gen_inlined_dec_funs(Fields,ClFields,ObjSetName,NthObj);
+ _ ->
+ emit({" fun 'dec_",ObjName,"'/4"})
+ end,
+ emit({".",nl,nl}),
+ ok;
+gen_objset_dec(ObjSetName,_,['EXTENSIONMARK'],_ClName,_ClFields,
+ _NthObj) ->
+ emit({"'getdec_",ObjSetName,"'(_, _) ->",nl}),
+ emit({indent(3),"fun(Attr1, Bytes, _, _) ->",nl}),
+ %% emit({indent(6),"?RT_PER:decode_open_type(Bytes,[])",nl}),
+ emit({indent(6),"{Bytes,Attr1}",nl}),
+ emit({indent(3),"end.",nl,nl}),
+ ok;
+gen_objset_dec(_,_,[],_,_,_) ->
+ ok.
+
+gen_inlined_dec_funs(Fields,[{typefield,Name,_}|Rest],
+ ObjSetName,NthObj) ->
+ InternalDefFunName = [NthObj,Name,ObjSetName],
+ case lists:keysearch(Name,1,Fields) of
+ {value,{_,Type}} when record(Type,type) ->
+ emit({indent(3),"fun(Type, Val, _, _) ->",nl,
+ indent(6),"case Type of",nl}),
+ N=emit_inner_of_decfun(Type,InternalDefFunName),
+ gen_inlined_dec_funs1(Fields,Rest,ObjSetName,NthObj+N);
+ {value,{_,Type}} when record(Type,typedef) ->
+ emit({indent(3),"fun(Type, Val, _, _) ->",nl,
+ indent(6),"case Type of",nl}),
+ emit({indent(9),{asis,Name}," ->",nl}),
+ N=emit_inner_of_decfun(Type,InternalDefFunName),
+ gen_inlined_dec_funs1(Fields,Rest,ObjSetName,NthObj+N);
+ false ->
+ gen_inlined_dec_funs(Fields,Rest,ObjSetName,NthObj)
+ end;
+gen_inlined_dec_funs(Fields,[_|Rest],ObjSetName,NthObj) ->
+ gen_inlined_dec_funs(Fields,Rest,ObjSetName,NthObj);
+gen_inlined_dec_funs(_,[],_,NthObj) ->
+ NthObj.
+
+gen_inlined_dec_funs1(Fields,[{typefield,Name,_}|Rest],
+ ObjSetName,NthObj) ->
+ InternalDefFunName = [NthObj,Name,ObjSetName],
+ N=
+ case lists:keysearch(Name,1,Fields) of
+ {value,{_,Type}} when record(Type,type) ->
+ emit({";",nl}),
+ emit_inner_of_decfun(Type,InternalDefFunName);
+ {value,{_,Type}} when record(Type,typedef) ->
+ emit({";",nl,indent(9),{asis,Name}," ->",nl}),
+ emit_inner_of_decfun(Type,InternalDefFunName);
+ false ->
+ 0
+ end,
+ gen_inlined_dec_funs1(Fields,Rest,ObjSetName,NthObj+N);
+gen_inlined_dec_funs1(Fields,[_|Rest],ObjSetName,NthObj)->
+ gen_inlined_dec_funs1(Fields,Rest,ObjSetName,NthObj);
+gen_inlined_dec_funs1(_,[],_,NthObj) ->
+ emit({nl,indent(6),"end",nl}),
+ emit({indent(3),"end"}),
+ NthObj.
+
+emit_inner_of_decfun(#typedef{name={ExtName,Name},typespec=Type},
+ InternalDefFunName) ->
+ case {ExtName,Name} of
+ {primitive,bif} ->
+ emit(indent(12)),
+ gen_dec_prim(per,Type,"Val"),
+ 0;
+ {constructed,bif} ->
+ emit({indent(12),"'dec_",
+ asn1ct_gen:list2name(InternalDefFunName),"'(Val)"}),
+ 1;
+ _ ->
+ emit({indent(12),"'",ExtName,"':'dec_",Name,
+ "'(Val, telltype)"}),
+ 0
+ end;
+emit_inner_of_decfun(#typedef{name=Name},_) ->
+ emit({indent(12),"'dec_",Name,"'(Val, telltype)"}),
+ 0;
+emit_inner_of_decfun(Type,_) when record(Type,type) ->
+ CurrMod = get(currmod),
+ case Type#type.def of
+ Def when atom(Def) ->
+ emit({indent(9),Def," ->",nl,indent(12)}),
+ gen_dec_prim(erules,Type,"Val");
+ TRef when record(TRef,typereference) ->
+ T = TRef#typereference.val,
+ emit({indent(9),T," ->",nl,indent(12),"'dec_",T,"'(Val)"});
+ #'Externaltypereference'{module=CurrMod,type=T} ->
+ emit({indent(9),T," ->",nl,indent(12),"'dec_",T,"'(Val)"});
+ #'Externaltypereference'{module=ExtMod,type=T} ->
+ emit({indent(9),T," ->",nl,indent(12),ExtMod,":'dec_",
+ T,"'(Val)"})
+ end,
+ 0.
+
+
+gen_internal_funcs(_Erules,[]) ->
+ ok;
+gen_internal_funcs(Erules,[TypeDef|Rest]) ->
+ gen_encode_user(Erules,TypeDef),
+ emit([nl,nl,"'dec_",TypeDef#typedef.name,"'(Bytes) ->",nl]),
+ gen_decode_user(Erules,TypeDef),
+ gen_internal_funcs(Erules,Rest).
+
+
+
+%% DECODING *****************************
+%%***************************************
+
+
+gen_decode(Erules,Type) when record(Type,typedef) ->
+ D = Type,
+ emit({nl,nl}),
+ emit({"'dec_",Type#typedef.name,"'(Bytes,_) ->",nl}),
+ dbdec(Type#typedef.name),
+ gen_decode_user(Erules,D).
+
+gen_decode(Erules,Tname,#'ComponentType'{name=Cname,typespec=Type}) ->
+ NewTname = [Cname|Tname],
+ gen_decode(Erules,NewTname,Type);
+
+gen_decode(Erules,Typename,Type) when record(Type,type) ->
+ InnerType = asn1ct_gen:get_inner(Type#type.def),
+ case asn1ct_gen:type(InnerType) of
+ {constructed,bif} ->
+ ObjFun =
+ case Type#type.tablecinf of
+ [{objfun,_}|_R] ->
+ ", ObjFun";
+ _ ->
+ ""
+ end,
+ emit({nl,"'dec_",asn1ct_gen:list2name(Typename),
+ "'(Bytes,_",ObjFun,") ->",nl}),
+ dbdec(Typename),
+ asn1ct_gen:gen_decode_constructed(Erules,Typename,InnerType,Type);
+ _ ->
+ true
+ end.
+
+dbdec(Type) when list(Type)->
+ demit({"io:format(\"decoding: ",asn1ct_gen:list2name(Type),"~w~n\",[Bytes]),",nl});
+dbdec(Type) ->
+ demit({"io:format(\"decoding: ",{asis,Type},"~w~n\",[Bytes]),",nl}).
+
+gen_decode_user(Erules,D) when record(D,typedef) ->
+ CurrMod = get(currmod),
+ Typename = [D#typedef.name],
+ Def = D#typedef.typespec,
+ InnerType = asn1ct_gen:get_inner(Def#type.def),
+ case asn1ct_gen:type(InnerType) of
+ {primitive,bif} ->
+ gen_dec_prim(Erules,Def,"Bytes"),
+ emit({".",nl,nl});
+ 'ASN1_OPEN_TYPE' ->
+ gen_dec_prim(Erules,Def#type{def='ASN1_OPEN_TYPE'},"Bytes"),
+ emit({".",nl,nl});
+ {constructed,bif} ->
+ asn1ct_gen:gen_decode_constructed(Erules,Typename,InnerType,D);
+ #typereference{val=Dname} ->
+ emit({"'dec_",Dname,"'(Bytes,telltype)"}),
+ emit({".",nl,nl});
+ #'Externaltypereference'{module=CurrMod,type=Etype} ->
+ emit({"'dec_",Etype,"'(Bytes,telltype).",nl,nl});
+ #'Externaltypereference'{module=Emod,type=Etype} ->
+ emit({"'",Emod,"':'dec_",Etype,"'(Bytes,telltype).",nl,nl});
+ Other ->
+ exit({error,{asn1,{unknown,Other}}})
+ end.
+
+
+
+gen_dec_prim(_Erules,Att,BytesVar) ->
+ Typename = Att#type.def,
+ Constraint = Att#type.constraint,
+ case Typename of
+ 'INTEGER' ->
+ EffectiveConstr = effective_constraint(integer,Constraint),
+ emit_dec_integer(EffectiveConstr,BytesVar);
+% emit({"?RT_PER:decode_integer(",BytesVar,",",
+% {asis,EffectiveConstr},")"});
+ {'INTEGER',NamedNumberList} ->
+ EffectiveConstr = effective_constraint(integer,Constraint),
+ emit_dec_integer(EffectiveConstr,BytesVar,NamedNumberList);
+% emit({"?RT_PER:decode_integer(",BytesVar,",",
+% {asis,EffectiveConstr},",",
+% {asis,NamedNumberList},")"});
+ {'BIT STRING',NamedNumberList} ->
+ case get(compact_bit_string) of
+ true ->
+ emit({"?RT_PER:decode_compact_bit_string(",
+ BytesVar,",",{asis,Constraint},",",
+ {asis,NamedNumberList},")"});
+ _ ->
+ emit({"?RT_PER:decode_bit_string(",BytesVar,",",
+ {asis,Constraint},",",
+ {asis,NamedNumberList},")"})
+ end;
+ 'NULL' ->
+ emit({"?RT_PER:decode_null(",
+ BytesVar,")"});
+ 'OBJECT IDENTIFIER' ->
+ emit({"?RT_PER:decode_object_identifier(",
+ BytesVar,")"});
+ 'ObjectDescriptor' ->
+ emit({"?RT_PER:decode_ObjectDescriptor(",
+ BytesVar,")"});
+ {'ENUMERATED',{NamedNumberList1,NamedNumberList2}} ->
+ NewTup = {list_to_tuple([X||{X,_} <- NamedNumberList1]),
+ list_to_tuple([X||{X,_} <- NamedNumberList2])},
+ NewC = [{'ValueRange',{0,size(element(1,NewTup))-1}}],
+ emit({"?RT_PER:decode_enumerated(",BytesVar,",",
+ {asis,NewC},",",
+ {asis,NewTup},")"});
+ {'ENUMERATED',NamedNumberList} ->
+ %NewTup = list_to_tuple([X||{X,Y} <- NamedNumberList]),
+ NewNNL = [X||{X,_} <- NamedNumberList],
+ NewC = effective_constraint(integer,
+ [{'ValueRange',{0,length(NewNNL)-1}}]),
+ emit_dec_enumerated(BytesVar,NewC,NewNNL);
+% emit({"?RT_PER:decode_enumerated(",BytesVar,",",
+% {asis,NewC},",",
+% {asis,NewTup},")"});
+ 'BOOLEAN'->
+ emit({"?RT_PER:decode_boolean(",BytesVar,")"});
+ 'OCTET STRING' ->
+ emit_dec_octet_string(Constraint,BytesVar);
+% emit({"?RT_PER:decode_octet_string(",BytesVar,",",
+% {asis,Constraint},")"});
+ 'NumericString' ->
+ emit_dec_known_multiplier_string('NumericString',
+ Constraint,BytesVar);
+% emit({"?RT_PER:decode_NumericString(",BytesVar,",",
+% {asis,Constraint},")"});
+ 'TeletexString' ->
+ emit({"?RT_PER:decode_TeletexString(",BytesVar,",",
+ {asis,Constraint},")"});
+ 'VideotexString' ->
+ emit({"?RT_PER:decode_VideotexString(",BytesVar,",",
+ {asis,Constraint},")"});
+ 'UTCTime' ->
+ emit_dec_known_multiplier_string('VisibleString',
+ Constraint,BytesVar);
+% emit({"?RT_PER:decode_VisibleString(",BytesVar,",",
+% {asis,Constraint},")"});
+ 'GeneralizedTime' ->
+ emit_dec_known_multiplier_string('VisibleString',
+ Constraint,BytesVar);
+% emit({"?RT_PER:decode_VisibleString(",BytesVar,",",
+% {asis,Constraint},")"});
+ 'GraphicString' ->
+ emit({"?RT_PER:decode_GraphicString(",BytesVar,",",
+ {asis,Constraint},")"});
+ 'VisibleString' ->
+ emit_dec_known_multiplier_string('VisibleString',
+ Constraint,BytesVar);
+% emit({"?RT_PER:decode_VisibleString(",BytesVar,",",
+% {asis,Constraint},")"});
+ 'GeneralString' ->
+ emit({"?RT_PER:decode_GeneralString(",BytesVar,",",
+ {asis,Constraint},")"});
+ 'PrintableString' ->
+ emit_dec_known_multiplier_string('PrintableString',
+ Constraint,BytesVar);
+% emit({"?RT_PER:decode_PrintableString(",BytesVar,",",{asis,Constraint},")"});
+ 'IA5String' ->
+ emit_dec_known_multiplier_string('IA5String',Constraint,BytesVar);
+% emit({"?RT_PER:decode_IA5String(",BytesVar,",",{asis,Constraint},")"});
+ 'BMPString' ->
+ emit_dec_known_multiplier_string('BMPString',Constraint,BytesVar);
+% emit({"?RT_PER:decode_BMPString(",BytesVar,",",{asis,Constraint},")"});
+ 'UniversalString' ->
+ emit_dec_known_multiplier_string('UniversalString',
+ Constraint,BytesVar);
+% emit({"?RT_PER:decode_UniversalString(",BytesVar,",",{asis,Constraint},")"});
+ 'ANY' ->
+ emit(["?RT_PER:decode_open_type(",BytesVar,",",
+ {asis,Constraint}, ")"]);
+ 'ASN1_OPEN_TYPE' ->
+ case Constraint of
+ [#'Externaltypereference'{type=Tname}] ->
+ emit(["fun(FBytes) ->",nl,
+ " {XTerm,XBytes} = "]),
+ emit(["?RT_PER:decode_open_type(FBytes,[]),",nl]),
+ emit([" {YTerm,_} = dec_",Tname,"(XTerm,mandatory),",nl]),
+ emit([" {YTerm,XBytes} end(",BytesVar,")"]);
+ [#type{def=#'Externaltypereference'{type=Tname}}] ->
+ emit(["fun(FBytes) ->",nl,
+ " {XTerm,XBytes} = "]),
+ emit(["?RT_PER:decode_open_type(FBytes,[]),",nl]),
+ emit([" {YTerm,_} = dec_",Tname,"(XTerm,mandatory),",nl]),
+ emit([" {YTerm,XBytes} end(",BytesVar,")"]);
+ _ ->
+ emit(["?RT_PER:decode_open_type(",BytesVar,",[])"])
+ end;
+ Other ->
+ exit({'cant decode' ,Other})
+ end.
+
+
+emit_dec_integer(C,BytesVar,NNL) ->
+ asn1ct_name:new(tmpterm),
+ asn1ct_name:new(buffer),
+ Tmpterm = asn1ct_gen:mk_var(asn1ct_name:curr(tmpterm)),
+ Buffer = asn1ct_gen:mk_var(asn1ct_name:curr(buffer)),
+ emit({" begin {",{curr,tmpterm},",",{curr,buffer},"} = ",nl}),
+ emit_dec_integer(C,BytesVar),
+ emit({",",nl," case ",Tmpterm," of",nl}),
+ lists:map(fun({Name,Int})->emit({" ",Int," -> {",{asis,Name},",",
+ Buffer,"};",nl});
+ (_)-> exit({error,{asn1,{"error in named number list",NNL}}})
+ end,
+ NNL),
+ emit({" _ -> {",Tmpterm,",",Buffer,"}",nl}),
+ emit({" end",nl}), % end of case
+ emit(" end"). % end of begin
+
+emit_dec_integer([{'SingleValue',Int}],BytesVar) when integer(Int) ->
+ emit(["{",Int,",",BytesVar,"}"]);
+emit_dec_integer([{_,{Lb,_Ub},_Range,{BitsOrOctets,N}}],BytesVar) ->
+ GetBorO =
+ case BitsOrOctets of
+ bits -> "getbits";
+ _ -> "getoctets"
+ end,
+ asn1ct_name:new(tmpterm),
+ asn1ct_name:new(tmpremain),
+ emit({" begin",nl," {",{curr,tmpterm},",",{curr,tmpremain},"}=",
+ "?RT_PER:",GetBorO,"(",BytesVar,",",N,"),",nl}),
+ emit({" {",{curr,tmpterm},"+",Lb,",",{curr,tmpremain},"}",nl,
+ " end"});
+emit_dec_integer([{_,{'MIN',_}}],BytesVar) ->
+ emit({"?RT_PER:decode_unconstrained_number(",BytesVar,")"});
+emit_dec_integer([{_,{Lb,'MAX'}}],BytesVar) ->
+ emit({"?RT_PER:decode_semi_constrained_number(",BytesVar,",",Lb,")"});
+emit_dec_integer([{'ValueRange',VR={Lb,Ub}}],BytesVar) ->
+ Range = Ub-Lb+1,
+ emit({"?RT_PER:decode_constrained_number(",BytesVar,",",
+ {asis,VR},",",Range,")"});
+emit_dec_integer(C=[{Rc,_}],BytesVar) when tuple(Rc) ->
+ emit({"?RT_PER:decode_integer(",BytesVar,",",{asis,C},")"});
+emit_dec_integer(_,BytesVar) ->
+ emit({"?RT_PER:decode_unconstrained_number(",BytesVar,")"}).
+
+
+emit_dec_enumerated(BytesVar,C,NamedNumberList) ->
+ emit_dec_enumerated_begin(),% emits a begin if component
+ asn1ct_name:new(tmpterm),
+ Tmpterm = asn1ct_gen:mk_var(asn1ct_name:curr(tmpterm)),
+ asn1ct_name:new(tmpremain),
+ Tmpremain = asn1ct_gen:mk_var(asn1ct_name:curr(tmpremain)),
+ emit({" {",{curr,tmpterm},",",{curr,tmpremain},"} =",nl}),
+ emit_dec_integer(C,BytesVar),
+ emit({",",nl," case ",Tmpterm," of "}),
+% Cases=lists:flatten(dec_enumerated_cases(NamedNumberList,asn1ct_gen:mk_var(asn1ct_name:curr(tmpremain)),0)),
+ Cases=lists:flatten(dec_enumerated_cases(NamedNumberList,Tmpremain,0)),
+ emit({Cases++"_->exit({error,{asn1,{decode_enumerated,{",Tmpterm,
+ ",",{asis,NamedNumberList},"}}}}) end",nl}),
+ emit_dec_enumerated_end().
+
+emit_dec_enumerated_begin() ->
+ case get(component_type) of
+ {true,_} ->
+ emit({" begin",nl});
+ _ -> ok
+ end.
+
+emit_dec_enumerated_end() ->
+ case get(component_type) of
+ {true,_} ->
+ emit(" end");
+ _ -> ok
+ end.
+
+% dec_enumerated_cases(NNL,Tmpremain,No) ->
+% Cases=dec_enumerated_cases1(NNL,Tmpremain,0),
+% lists:flatten(io_lib:format("(case ~s "++Cases++
+% "~s when atom(~s)->exit({error,{asn1,{namednumber,~s}}});_->~s end)",[Value,"TmpVal","TmpVal","TmpVal",Value])).
+
+dec_enumerated_cases([Name|Rest],Tmpremain,No) ->
+ io_lib:format("~w->{~w,~s};",[No,Name,Tmpremain])++
+ dec_enumerated_cases(Rest,Tmpremain,No+1);
+dec_enumerated_cases([],_,_) ->
+ "".
+
+
+% more_genfields(_Fields,[]) ->
+% false;
+% more_genfields(Fields,[{FieldName,_}|T]) ->
+% case is_typefield(Fields,FieldName) of
+% true -> true;
+% {false,objectfield} -> true;
+% {false,_} -> more_genfields(Fields,T)
+% end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_name.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_name.erl
new file mode 100644
index 0000000000..1c7769998c
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_name.erl
@@ -0,0 +1,225 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1ct_name.erl,v 1.1 2008/12/17 09:53:30 mikpe Exp $
+%%
+-module(asn1ct_name).
+
+%%-compile(export_all).
+-export([name_server_loop/1,
+ start/0,
+ stop/0,
+ push/1,
+ pop/1,
+ curr/1,
+ clear/0,
+ delete/1,
+ active/1,
+ prev/1,
+ next/1,
+ all/1,
+ new/1]).
+
+start() ->
+ start_server(asn1_ns, asn1ct_name,name_server_loop,[[]]).
+
+stop() -> stop_server(asn1_ns).
+
+name_server_loop(Vars) ->
+%% io:format("name -- ~w~n",[Vars]),
+ receive
+ {From,{current,Variable}} ->
+ From ! {asn1_ns,get_curr(Vars,Variable)},
+ name_server_loop(Vars);
+ {From,{pop,Variable}} ->
+ From ! {asn1_ns,done},
+ name_server_loop(pop_var(Vars,Variable));
+ {From,{push,Variable}} ->
+ From ! {asn1_ns,done},
+ name_server_loop(push_var(Vars,Variable));
+ {From,{delete,Variable}} ->
+ From ! {asn1_ns,done},
+ name_server_loop(delete_var(Vars,Variable));
+ {From,{new,Variable}} ->
+ From ! {asn1_ns,done},
+ name_server_loop(new_var(Vars,Variable));
+ {From,{prev,Variable}} ->
+ From ! {asn1_ns,get_prev(Vars,Variable)},
+ name_server_loop(Vars);
+ {From,{next,Variable}} ->
+ From ! {asn1_ns,get_next(Vars,Variable)},
+ name_server_loop(Vars);
+ {From,stop} ->
+ From ! {asn1_ns,stopped},
+ exit(normal)
+ end.
+
+active(V) ->
+ case curr(V) of
+ nil -> false;
+ _ -> true
+ end.
+
+req(Req) ->
+ asn1_ns ! {self(), Req},
+ receive {asn1_ns, Reply} -> Reply end.
+
+pop(V) -> req({pop,V}).
+push(V) -> req({push,V}).
+clear() -> req(stop), start().
+curr(V) -> req({current,V}).
+new(V) -> req({new,V}).
+delete(V) -> req({delete,V}).
+prev(V) ->
+ case req({prev,V}) of
+ none ->
+ exit('cant get prev of none');
+ Rep -> Rep
+ end.
+
+next(V) ->
+ case req({next,V}) of
+ none ->
+ exit('cant get next of none');
+ Rep -> Rep
+ end.
+
+all(V) ->
+ Curr = curr(V),
+ if Curr == V -> [];
+ true ->
+ lists:reverse(generate(V,last(Curr),[],0))
+ end.
+
+generate(V,Number,Res,Pos) ->
+ Ell = Pos+1,
+ if
+ Ell > Number ->
+ Res;
+ true ->
+ generate(V,Number,[list_to_atom(lists:concat([V,Ell]))|Res],Ell)
+ end.
+
+last(V) ->
+ last2(lists:reverse(atom_to_list(V))).
+
+last2(RevL) ->
+ list_to_integer(lists:reverse(get_digs(RevL))).
+
+
+get_digs([H|T]) ->
+ if
+ H < $9+1,
+ H > $0-1 ->
+ [H|get_digs(T)];
+ true ->
+ []
+ end.
+
+push_var(Vars,Variable) ->
+ case lists:keysearch(Variable,1,Vars) of
+ false ->
+ [{Variable,[0]}|Vars];
+ {value,{Variable,[Digit|Drest]}} ->
+ NewVars = lists:keydelete(Variable,1,Vars),
+ [{Variable,[Digit,Digit|Drest]}|NewVars]
+ end.
+
+pop_var(Vars,Variable) ->
+ case lists:keysearch(Variable,1,Vars) of
+ false ->
+ ok;
+ {value,{Variable,[_Dig]}} ->
+ lists:keydelete(Variable,1,Vars);
+ {value,{Variable,[_Dig|Digits]}} ->
+ NewVars = lists:keydelete(Variable,1,Vars),
+ [{Variable,Digits}|NewVars]
+ end.
+
+get_curr([],Variable) ->
+ Variable;
+get_curr([{Variable,[0|_Drest]}|_Tail],Variable) ->
+ Variable;
+get_curr([{Variable,[Digit|_Drest]}|_Tail],Variable) ->
+ list_to_atom(lists:concat([Variable,integer_to_list(Digit)]));
+
+get_curr([_|Tail],Variable) ->
+ get_curr(Tail,Variable).
+
+new_var(Vars,Variable) ->
+ case lists:keysearch(Variable,1,Vars) of
+ false ->
+ [{Variable,[1]}|Vars];
+ {value,{Variable,[Digit|Drest]}} ->
+ NewVars = lists:keydelete(Variable,1,Vars),
+ [{Variable,[Digit+1|Drest]}|NewVars]
+ end.
+
+delete_var(Vars,Variable) ->
+ case lists:keysearch(Variable,1,Vars) of
+ false ->
+ Vars;
+ {value,{Variable,[N]}} when N =< 1 ->
+ lists:keydelete(Variable,1,Vars);
+ {value,{Variable,[Digit|Drest]}} ->
+ case Digit of
+ 0 ->
+ Vars;
+ _ ->
+ NewVars = lists:keydelete(Variable,1,Vars),
+ [{Variable,[Digit-1|Drest]}|NewVars]
+ end
+ end.
+
+get_prev(Vars,Variable) ->
+ case lists:keysearch(Variable,1,Vars) of
+ false ->
+ none;
+ {value,{Variable,[Digit|_]}} when Digit =< 1 ->
+ Variable;
+ {value,{Variable,[Digit|_]}} when Digit > 1 ->
+ list_to_atom(lists:concat([Variable,
+ integer_to_list(Digit-1)]));
+ _ ->
+ none
+ end.
+
+get_next(Vars,Variable) ->
+ case lists:keysearch(Variable,1,Vars) of
+ false ->
+ list_to_atom(lists:concat([Variable,"1"]));
+ {value,{Variable,[Digit|_]}} when Digit >= 0 ->
+ list_to_atom(lists:concat([Variable,
+ integer_to_list(Digit+1)]));
+ _ ->
+ none
+ end.
+
+
+stop_server(Name) ->
+ stop_server(Name, whereis(Name)).
+stop_server(_Name, undefined) -> stopped;
+stop_server(Name, _Pid) ->
+ Name ! {self(), stop},
+ receive {Name, _} -> stopped end.
+
+
+start_server(Name,Mod,Fun,Args) ->
+ case whereis(Name) of
+ undefined ->
+ register(Name, spawn(Mod,Fun, Args));
+ _Pid ->
+ already_started
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_parser.yrl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_parser.yrl
new file mode 100644
index 0000000000..b2c1d70f6e
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_parser.yrl
@@ -0,0 +1,1162 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1ct_parser.yrl,v 1.1 2008/12/17 09:53:30 mikpe Exp $
+%%
+Nonterminals
+ModuleDefinition ModuleIdentifier DefinitiveIdentifier DefinitiveObjIdComponentList
+DefinitiveObjIdComponent TagDefault ExtensionDefault
+ModuleBody Exports SymbolsExported Imports SymbolsImported
+SymbolsFromModuleList SymbolsFromModule GlobalModuleReference AssignedIdentifier SymbolList
+Symbol Reference AssignmentList Assignment
+ExtensionAndException
+ComponentTypeLists
+Externaltypereference Externalvaluereference DefinedType DefinedValue
+AbsoluteReference ItemSpec ItemId ComponentId TypeAssignment
+ValueAssignment
+% ValueSetTypeAssignment
+ValueSet
+Type BuiltinType NamedType ReferencedType
+Value ValueNotNull BuiltinValue ReferencedValue NamedValue
+% BooleanType
+BooleanValue IntegerType NamedNumberList NamedNumber SignedNumber
+% inlined IntegerValue
+EnumeratedType
+% inlined Enumerations
+Enumeration EnumerationItem
+% inlined EnumeratedValue
+% RealType
+RealValue NumericRealValue SpecialRealValue BitStringType
+% inlined BitStringValue
+IdentifierList
+% OctetStringType
+% inlined OctetStringValue
+% NullType NullValue
+SequenceType ComponentTypeList ComponentType
+% SequenceValue SequenceOfValue
+ComponentValueList SequenceOfType
+SAndSOfValue ValueList SetType
+% SetValue SetOfValue
+SetOfType
+ChoiceType
+% AlternativeTypeList made common with ComponentTypeList
+ChoiceValue
+AnyValue
+AnyDefBy
+SelectionType
+TaggedType Tag ClassNumber Class
+% redundant TaggedValue
+% EmbeddedPDVType EmbeddedPDVValue ExternalType ExternalValue ObjectIdentifierType
+ObjectIdentifierValue ObjIdComponentList ObjIdComponent
+% NameForm NumberForm NameAndNumberForm
+CharacterStringType
+RestrictedCharacterStringValue CharacterStringList
+% CharSyms CharsDefn
+Quadruple
+% Group Plane Row Cell
+Tuple
+% TableColumn TableRow
+% UnrestrictedCharacterString
+CharacterStringValue
+% UnrestrictedCharacterStringValue
+ConstrainedType Constraint ConstraintSpec TypeWithConstraint
+ElementSetSpecs ElementSetSpec
+%GeneralConstraint
+UserDefinedConstraint UserDefinedConstraintParameter
+UserDefinedConstraintParameters
+ExceptionSpec
+ExceptionIdentification
+Unions
+UnionMark
+UElems
+Intersections
+IntersectionElements
+IntersectionMark
+IElems
+Elements
+Elems
+SubTypeElements
+Exclusions
+LowerEndpoint
+UpperEndpoint
+LowerEndValue
+UpperEndValue
+TypeConstraints NamedConstraint PresenceConstraint
+
+ParameterizedTypeAssignment
+ParameterList
+Parameters
+Parameter
+ParameterizedType
+
+% X.681
+ObjectClassAssignment ObjectClass ObjectClassDefn
+FieldSpecs FieldSpec OptionalitySpec WithSyntaxSpec
+TokenOrGroupSpecs TokenOrGroupSpec
+SyntaxList OptionalGroup RequiredToken Word
+TypeOptionalitySpec
+ValueOrObjectOptSpec
+VSetOrOSetOptSpec
+ValueOptionalitySpec
+ObjectOptionalitySpec
+ValueSetOptionalitySpec
+ObjectSetOptionalitySpec
+% X.681 chapter 15
+InformationFromObjects
+ValueFromObject
+%ValueSetFromObjects
+TypeFromObject
+%ObjectFromObject
+%ObjectSetFromObjects
+ReferencedObjects
+FieldName
+PrimitiveFieldName
+
+ObjectAssignment
+ObjectSetAssignment
+ObjectSet
+ObjectSetElements
+Object
+ObjectDefn
+DefaultSyntax
+DefinedSyntax
+FieldSettings
+FieldSetting
+DefinedSyntaxTokens
+DefinedSyntaxToken
+Setting
+DefinedObject
+ObjectFromObject
+ObjectSetFromObjects
+ParameterizedObject
+ExternalObjectReference
+DefinedObjectSet
+DefinedObjectClass
+ExternalObjectClassReference
+
+% X.682
+TableConstraint
+ComponentRelationConstraint
+ComponentIdList
+
+% X.683
+ActualParameter
+.
+
+%UsefulType.
+
+Terminals
+'ABSENT' 'ABSTRACT-SYNTAX' 'ALL' 'ANY'
+'APPLICATION' 'AUTOMATIC' 'BEGIN' 'BIT'
+'BOOLEAN' 'BY' 'CHARACTER' 'CHOICE' 'CLASS' 'COMPONENT'
+'COMPONENTS' 'CONSTRAINED' 'DEFAULT' 'DEFINED' 'DEFINITIONS'
+'EMBEDDED' 'END' 'ENUMERATED' 'EXCEPT' 'EXPLICIT'
+'EXPORTS' 'EXTENSIBILITY' 'EXTERNAL' 'FALSE' 'FROM' 'GeneralizedTime'
+'TYPE-IDENTIFIER'
+'IDENTIFIER' 'IMPLICIT' 'IMPLIED' 'IMPORTS'
+'INCLUDES' 'INSTANCE' 'INTEGER' 'INTERSECTION'
+'MAX' 'MIN' 'MINUS-INFINITY' 'NULL'
+'OBJECT' 'ObjectDescriptor' 'OCTET' 'OF' 'OPTIONAL' 'PDV' 'PLUS-INFINITY'
+'PRESENT' 'PRIVATE' 'REAL' 'SEQUENCE' 'SET' 'SIZE'
+'STRING' 'SYNTAX' 'TAGS' 'TRUE' 'UNION'
+'UNIQUE' 'UNIVERSAL' 'UTCTime' 'WITH'
+'{' '}' '(' ')' '.' '::=' ';' ',' '@' '*' '-' '[' ']'
+'!' '..' '...' '|' '<' ':' '^'
+number identifier typereference restrictedcharacterstringtype
+bstring hstring cstring typefieldreference valuefieldreference
+objectclassreference word.
+
+Rootsymbol ModuleDefinition.
+Endsymbol '$end'.
+
+Left 300 'EXCEPT'.
+Left 200 '^'.
+Left 200 'INTERSECTION'.
+Left 100 '|'.
+Left 100 'UNION'.
+
+
+ModuleDefinition -> ModuleIdentifier
+ 'DEFINITIONS'
+ TagDefault
+ ExtensionDefault
+ '::='
+ 'BEGIN'
+ ModuleBody
+ 'END' :
+ {'ModuleBody',Ex,Im,Types} = '$7',
+ {{typereference,Pos,Name},Defid} = '$1',
+ #module{
+ pos= Pos,
+ name= Name,
+ defid= Defid,
+ tagdefault='$3',
+ extensiondefault='$4',
+ exports=Ex,
+ imports=Im,
+ typeorval=Types}.
+% {module, '$1','$3','$6'}.
+% Results always in a record of type module defined in asn_records.hlr
+
+ModuleIdentifier -> typereference DefinitiveIdentifier :
+ put(asn1_module,'$1'#typereference.val),
+ {'$1','$2'}.
+
+DefinitiveIdentifier -> '{' DefinitiveObjIdComponentList '}' : '$2' .
+DefinitiveIdentifier -> '$empty': [].
+
+DefinitiveObjIdComponentList -> DefinitiveObjIdComponent : ['$1'].
+DefinitiveObjIdComponentList -> DefinitiveObjIdComponent DefinitiveObjIdComponentList : ['$1'|'$2'].
+
+DefinitiveObjIdComponent -> identifier : '$1' . %expanded->
+% DefinitiveObjIdComponent -> NameForm : '$1' .
+DefinitiveObjIdComponent -> number : '$1' . %expanded->
+% DefinitiveObjIdComponent -> DefinitiveNumberForm : 'fix' .
+DefinitiveObjIdComponent -> identifier '(' number ')' : {'$1','$3'} . %expanded->
+% DefinitiveObjIdComponent -> DefinitiveNameAndNumberForm : {'$1','$3'} .
+
+% DefinitiveNumberForm -> number : 'fix' .
+
+% DefinitiveNameAndNumberForm -> identifier '(' DefinitiveNumberForm ')' : 'fix' .
+
+TagDefault -> 'EXPLICIT' 'TAGS' : put(tagdefault,'EXPLICIT'),'EXPLICIT' .
+TagDefault -> 'IMPLICIT' 'TAGS' : put(tagdefault,'IMPLICIT'),'IMPLICIT' .
+TagDefault -> 'AUTOMATIC' 'TAGS' : put(tagdefault,'AUTOMATIC'),'AUTOMATIC' .
+TagDefault -> '$empty': put(tagdefault,'EXPLICIT'),'EXPLICIT'. % because this is the default
+
+ExtensionDefault -> 'EXTENSIBILITY' 'IMPLIED' : 'IMPLIED'.
+ExtensionDefault -> '$empty' : 'false'. % because this is the default
+
+ModuleBody -> Exports Imports AssignmentList : {'ModuleBody','$1','$2','$3'}.
+ModuleBody -> '$empty' : {'ModuleBody',nil,nil,[]}.
+
+Exports -> 'EXPORTS' SymbolList ';' : {exports,'$2'}.
+Exports -> 'EXPORTS' ';' : {exports,[]}.
+Exports -> '$empty' : {exports,all} .
+
+% inlined above SymbolsExported -> SymbolList : '$1'.
+% inlined above SymbolsExported -> '$empty' : [].
+
+Imports -> 'IMPORTS' SymbolsFromModuleList ';' : {imports,'$2'}.
+Imports -> 'IMPORTS' ';' : {imports,[]}.
+Imports -> '$empty' : {imports,[]} .
+
+% inlined above SymbolsImported -> SymbolsFromModuleList : '$1'.
+% inlined above SymbolsImported -> '$empty' : [].
+
+SymbolsFromModuleList -> SymbolsFromModule :['$1'].
+% SymbolsFromModuleList -> SymbolsFromModuleList SymbolsFromModule :$1.%changed
+SymbolsFromModuleList -> SymbolsFromModule SymbolsFromModuleList :['$1'|'$2'].
+
+% expanded SymbolsFromModule -> SymbolList 'FROM' GlobalModuleReference : #'SymbolsFromModule'{symbols = '$1',module='$3'}.
+SymbolsFromModule -> SymbolList 'FROM' typereference : #'SymbolsFromModule'{symbols = '$1',module='$3'}.
+SymbolsFromModule -> SymbolList 'FROM' typereference '{' ValueList '}': #'SymbolsFromModule'{symbols = '$1',module='$3'}.
+%SymbolsFromModule -> SymbolList 'FROM' typereference identifier: #'SymbolsFromModule'{symbols = '$1',module='$3'}.
+%SymbolsFromModule -> SymbolList 'FROM' typereference Externalvaluereference: #'SymbolsFromModule'{symbols = '$1',module='$3'}.
+%SymbolsFromModule -> SymbolList 'FROM' typereference DefinedValue: #'SymbolsFromModule'{symbols = '$1',module='$3'}.
+
+% inlined GlobalModuleReference -> typereference AssignedIdentifier : {'$1','$2'} .
+
+% inlined above AssignedIdentifier -> '{' ValueList '}' : '$2'.
+% replaced AssignedIdentifier -> '{' DefinedValue ObjIdComponentList '}' :{'$2','$3'}.
+% not necessary , replaced by SAndSOfValue AssignedIdentifier -> ObjectIdentifierValue :'$1'.
+% AssignedIdentifier -> DefinedValue : '$1'.
+% inlined AssignedIdentifier -> '$empty' : undefined.
+
+SymbolList -> Symbol : ['$1'].
+SymbolList -> Symbol ',' SymbolList :['$1'|'$3'].
+
+Symbol -> Reference :'$1'.
+% later Symbol -> ParameterizedReference :'$1'.
+
+Reference -> typereference :'$1'.
+Reference -> identifier:'$1'.
+Reference -> typereference '{' '}':'$1'.
+Reference -> Externaltypereference '{' '}':'$1'.
+
+% later Reference -> objectclassreference :'$1'.
+% later Reference -> objectreference :'$1'.
+% later Reference -> objectsetreference :'$1'.
+
+AssignmentList -> Assignment : ['$1'].
+% modified AssignmentList -> AssignmentList Assignment : '$1'.
+AssignmentList -> Assignment AssignmentList : ['$1'|'$2'].
+
+Assignment -> TypeAssignment : '$1'.
+Assignment -> ValueAssignment : '$1'.
+% later Assignment -> ValueSetTypeAssignment : '$1'.
+Assignment -> ObjectClassAssignment : '$1'.
+% later Assignment -> ObjectAssignment : '$1'.
+% combined with ValueAssignment Assignment -> ObjectAssignment : '$1'.
+Assignment -> ObjectSetAssignment : '$1'.
+Assignment -> ParameterizedTypeAssignment : '$1'.
+%Assignment -> ParameterizedValueAssignment : '$1'.
+%Assignment -> ParameterizedValueSetTypeAssignment : '$1'.
+%Assignment -> ParameterizedObjectClassAssignment : '$1'.
+
+ObjectClassAssignment -> typereference '::=' 'CLASS' '{' FieldSpecs '}' :
+%ObjectClassAssignment -> objectclassreference '::=' 'CLASS' '{' FieldSpecs '}' :
+ #typedef{pos=element(2,'$1'),name=element(3,'$1'),typespec={'CLASS','$5',[]}}.
+ObjectClassAssignment -> typereference '::=' 'CLASS' '{' FieldSpecs '}' WithSyntaxSpec :
+%ObjectClassAssignment -> objectclassreference '::=' 'CLASS' '{' FieldSpecs '}' WithSyntaxSpec :
+ #typedef{pos=element(2,'$1'),name=element(3,'$1'),typespec={'CLASS','$5','$7'}}.
+
+FieldSpecs -> FieldSpec : ['$1'].
+FieldSpecs -> FieldSpec ',' FieldSpecs : ['$1'|'$3'].
+
+FieldSpec -> typefieldreference TypeOptionalitySpec : {typefield,'$1','$2'}.
+
+FieldSpec -> valuefieldreference Type 'UNIQUE' ValueOrObjectOptSpec :
+ {fixedtypevaluefield,'$1','$2','UNIQUE','$4'}.
+FieldSpec -> valuefieldreference Type ValueOrObjectOptSpec :
+ {fixedtypevaluefield,'$1','$2',undefined,'$3'}.
+
+FieldSpec -> valuefieldreference typefieldreference ValueOrObjectOptSpec :
+ {variabletypevaluefield, '$1','$2','$3'}.
+
+FieldSpec -> typefieldreference typefieldreference VSetOrOSetOptSpec :
+ {variabletypevaluesetfield, '$1','$2','$3'}.
+
+FieldSpec -> typefieldreference Type VSetOrOSetOptSpec :
+ {fixedtypevaluesetfield, '$1','$2','$3'}.
+
+TypeOptionalitySpec -> 'DEFAULT' Type : {'DEFAULT','$2'}.
+TypeOptionalitySpec -> 'OPTIONAL' : 'OPTIONAL'.
+TypeOptionalitySpec -> '$empty' : 'MANDATORY'.
+
+ValueOrObjectOptSpec -> ValueOptionalitySpec : '$1'.
+ValueOrObjectOptSpec -> ObjectOptionalitySpec : '$1'.
+ValueOrObjectOptSpec -> 'OPTIONAL' : 'OPTIONAL'.
+ValueOrObjectOptSpec -> '$empty' : 'MANDATORY'.
+
+ValueOptionalitySpec -> 'DEFAULT' Value :
+ case '$2' of
+ {identifier,_,Id} -> {'DEFAULT',Id};
+ _ -> {'DEFAULT','$2'}
+ end.
+
+%ObjectOptionalitySpec -> 'DEFAULT' Object :{'DEFAULT','$1'}.
+ObjectOptionalitySpec -> 'DEFAULT' '{' FieldSetting ',' FieldSettings '}' :
+ {'DEFAULT',{object,['$2'|'$4']}}.
+ObjectOptionalitySpec -> 'DEFAULT' '{' FieldSetting '}' :
+ {'DEFAULT',{object, ['$2']}}.
+%ObjectOptionalitySpec -> 'DEFAULT' '{' DefinedSyntaxTokens '}' :
+% {'DEFAULT',{object, '$2'}}.
+ObjectOptionalitySpec -> 'DEFAULT' ObjectFromObject :
+ {'DEFAULT',{object, '$2'}}.
+
+
+VSetOrOSetOptSpec -> ValueSetOptionalitySpec : '$1'.
+%VSetOrOSetOptSpec -> ObjectSetOptionalitySpec : '$1'.
+VSetOrOSetOptSpec -> 'OPTIONAL' : 'OPTIONAL'.
+VSetOrOSetOptSpec -> '$empty' : 'MANDATORY'.
+
+ValueSetOptionalitySpec -> 'DEFAULT' ValueSet : {'DEFAULT','$1'}.
+
+%ObjectSetOptionalitySpec -> 'DEFAULT' ObjectSet : {'DEFAULT','$1'}.
+
+OptionalitySpec -> 'DEFAULT' Type : {'DEFAULT','$2'}.
+OptionalitySpec -> 'DEFAULT' ValueNotNull :
+ case '$2' of
+ {identifier,_,Id} -> {'DEFAULT',Id};
+ _ -> {'DEFAULT','$2'}
+ end.
+OptionalitySpec -> 'OPTIONAL' : 'OPTIONAL'.
+OptionalitySpec -> '$empty' : 'MANDATORY'.
+
+WithSyntaxSpec -> 'WITH' 'SYNTAX' SyntaxList : {'WITH SYNTAX','$3'}.
+
+SyntaxList -> '{' TokenOrGroupSpecs '}' : '$2'.
+SyntaxList -> '{' '}' : [].
+
+TokenOrGroupSpecs -> TokenOrGroupSpec : ['$1'].
+TokenOrGroupSpecs -> TokenOrGroupSpec TokenOrGroupSpecs : ['$1'|'$2'].
+
+TokenOrGroupSpec -> RequiredToken : '$1'.
+TokenOrGroupSpec -> OptionalGroup : '$1'.
+
+OptionalGroup -> '[' TokenOrGroupSpecs ']' : '$2'.
+
+RequiredToken -> typereference : '$1'.
+RequiredToken -> Word : '$1'.
+RequiredToken -> ',' : '$1'.
+RequiredToken -> PrimitiveFieldName : '$1'.
+
+Word -> 'BY' : 'BY'.
+
+ParameterizedTypeAssignment -> typereference ParameterList '::=' Type :
+ #ptypedef{pos=element(2,'$1'),name=element(3,'$1'),
+ args='$2', typespec='$4'}.
+
+ParameterList -> '{' Parameters '}':'$2'.
+
+Parameters -> Parameter: ['$1'].
+Parameters -> Parameter ',' Parameters: ['$1'|'$3'].
+
+Parameter -> typereference: '$1'.
+Parameter -> Value: '$1'.
+Parameter -> Type ':' typereference: {'$1','$3'}.
+Parameter -> Type ':' Value: {'$1','$3'}.
+Parameter -> '{' typereference '}': {objectset,'$2'}.
+
+
+% Externaltypereference -> modulereference '.' typereference : {'$1','$3'} .
+Externaltypereference -> typereference '.' typereference : #'Externaltypereference'{pos=element(2,'$1'),module=element(3,'$1'),type=element(3,'$3')}.
+
+% Externalvaluereference -> modulereference '.' valuereference : {'$1','$3'} .
+% inlined Externalvaluereference -> typereference '.' identifier : #'Externalvaluereference'{pos=element(2,'$1'),module=element(3,'$1'),value=element(3,'$3')}.
+
+
+DefinedType -> Externaltypereference : '$1' .
+DefinedType -> typereference :
+ #'Externaltypereference'{pos='$1'#typereference.pos,
+ module= get(asn1_module),
+ type= '$1'#typereference.val} .
+DefinedType -> typereference ParameterList : {pt,'$1','$2'}.
+DefinedType -> Externaltypereference ParameterList : {pt,'$1','$2'}.
+
+% ActualParameterList -> '{' ActualParameters '}' : '$1'.
+
+% ActualParameters -> ActualParameter : ['$1'].
+% ActualParameters -> ActualParameter ',' ActualParameters : ['$1'|'$3'].
+
+ActualParameter -> Type : '$1'.
+ActualParameter -> ValueNotNull : '$1'.
+ActualParameter -> ValueSet : '$1'.
+% later DefinedType -> ParameterizedType : '$1' .
+% later DefinedType -> ParameterizedValueSetType : '$1' .
+
+% inlined DefinedValue -> Externalvaluereference :'$1'.
+% inlined DefinedValue -> identifier :'$1'.
+% later DefinedValue -> ParameterizedValue :'$1'.
+
+% not referenced yet AbsoluteReference -> '@' GlobalModuleReference '.' ItemSpec :{'$2','$4'}.
+
+% not referenced yet ItemSpec -> typereference :'$1'.
+% not referenced yet ItemSpec -> ItemId '.' ComponentId : {'$1','$3'}.
+
+% not referenced yet ItemId -> ItemSpec : '$1'.
+
+% not referenced yet ComponentId -> identifier :'$1'.
+% not referenced yet ComponentId -> number :'$1'.
+% not referenced yet ComponentId -> '*' :'$1'.
+
+TypeAssignment -> typereference '::=' Type :
+ #typedef{pos=element(2,'$1'),name=element(3,'$1'),typespec='$3'}.
+
+ValueAssignment -> identifier Type '::=' Value :
+ #valuedef{pos=element(2,'$1'),name=element(3,'$1'),type='$2',value='$4'}.
+
+% later ValueSetTypeAssignment -> typereference Type '::=' ValueSet :{'ValueSetTypeAssignment','$1','$2','$4'}.
+
+
+ValueSet -> '{' ElementSetSpec '}' : {valueset,'$2'}.
+
+% record(type,{tag,def,constraint}).
+Type -> BuiltinType :#type{def='$1'}.
+Type -> 'NULL' :#type{def='NULL'}.
+Type -> TaggedType:'$1'.
+Type -> ReferencedType:#type{def='$1'}. % change notag later
+Type -> ConstrainedType:'$1'.
+
+%ANY is here for compatibility with the old ASN.1 standard from 1988
+BuiltinType -> 'ANY' AnyDefBy:
+ case '$2' of
+ [] -> 'ANY';
+ _ -> {'ANY DEFINED BY','$2'}
+ end.
+BuiltinType -> BitStringType :'$1'.
+BuiltinType -> 'BOOLEAN' :element(1,'$1').
+BuiltinType -> CharacterStringType :'$1'.
+BuiltinType -> ChoiceType :'$1'.
+BuiltinType -> 'EMBEDDED' 'PDV' :'EMBEDDED PDV'.
+BuiltinType -> EnumeratedType :'$1'.
+BuiltinType -> 'EXTERNAL' :element(1,'$1').
+% later BuiltinType -> InstanceOfType :'$1'.
+BuiltinType -> IntegerType :'$1'.
+% BuiltinType -> 'NULL' :element(1,'$1').
+% later BuiltinType -> ObjectClassFieldType :'$1'.
+BuiltinType -> 'OBJECT' 'IDENTIFIER' :'OBJECT IDENTIFIER'.
+BuiltinType -> 'OCTET' 'STRING' :'OCTET STRING'.
+BuiltinType -> 'REAL' :element(1,'$1').
+BuiltinType -> SequenceType :'$1'.
+BuiltinType -> SequenceOfType :'$1'.
+BuiltinType -> SetType :'$1'.
+BuiltinType -> SetOfType :'$1'.
+% The so called Useful types
+BuiltinType -> 'GeneralizedTime': 'GeneralizedTime'.
+BuiltinType -> 'UTCTime' :'UTCTime'.
+BuiltinType -> 'ObjectDescriptor' : 'ObjectDescriptor'.
+
+% moved BuiltinType -> TaggedType :'$1'.
+
+
+AnyDefBy -> 'DEFINED' 'BY' identifier: '$3'.
+AnyDefBy -> '$empty': [].
+
+NamedType -> identifier Type :
+%{_,Pos,Val} = '$1',
+%{'NamedType',Pos,{Val,'$2'}}.
+V1 = '$1',
+{'NamedType',V1#identifier.pos,{V1#identifier.val,'$2'}}.
+NamedType -> SelectionType :'$1'.
+
+ReferencedType -> DefinedType : '$1'.
+% redundant ReferencedType -> UsefulType : 'fix'.
+ReferencedType -> SelectionType : '$1'.
+ReferencedType -> TypeFromObject : '$1'.
+% later ReferencedType -> ValueSetFromObjects : 'fix'.
+
+% to much conflicts Value -> AnyValue :'$1'.
+Value -> ValueNotNull : '$1'.
+Value -> 'NULL' :element(1,'$1').
+
+ValueNotNull -> BuiltinValue :'$1'.
+% inlined Value -> DefinedValue :'$1'. % DefinedValue , identifier
+% inlined Externalvaluereference -> Externalvaluereference :'$1'.
+ValueNotNull -> typereference '.' identifier :
+ #'Externalvaluereference'{pos=element(2,'$1'),module=element(3,'$1'),
+ value=element(3,'$3')}.
+ValueNotNull -> identifier :'$1'.
+
+
+%tmp Value -> NamedNumber: '$1'. % not a value but part of ObjIdC
+% redundant BuiltinValue -> BitStringValue :'$1'.
+BuiltinValue -> BooleanValue :'$1'.
+BuiltinValue -> CharacterStringValue :'$1'.
+BuiltinValue -> ChoiceValue :'$1'.
+% BuiltinValue -> EmbeddedPDVValue :'$1'. ==SequenceValue
+% BuiltinValue -> EnumeratedValue :'$1'. identifier
+% BuiltinValue -> ExternalValue :'$1'. ==SequenceValue
+% later BuiltinValue -> InstanceOfValue :'$1'.
+BuiltinValue -> SignedNumber :'$1'.
+% BuiltinValue -> 'NULL' :'$1'.
+% later BuiltinValue -> ObjectClassFieldValue :'$1'.
+% replaced by SAndSOfValue BuiltinValue -> ObjectIdentifierValue :'$1'.
+BuiltinValue -> bstring :element(3,'$1').
+BuiltinValue -> hstring :element(3,'$1').
+% conflict BuiltinValue -> RealValue :'$1'.
+BuiltinValue -> SAndSOfValue :'$1'.
+% replaced BuiltinValue -> SequenceOfValue :'$1'.
+% replaced BuiltinValue -> SequenceValue :'$1'.
+% replaced BuiltinValue -> SetValue :'$1'.
+% replaced BuiltinValue -> SetOfValue :'$1'.
+% conflict redundant BuiltinValue -> TaggedValue :'$1'.
+
+% inlined ReferencedValue -> DefinedValue:'$1'.
+% ReferencedValue -> Externalvaluereference:'$1'.
+% ReferencedValue -> identifier :'$1'.
+% later ReferencedValue -> ValueFromObject:'$1'.
+
+% inlined BooleanType -> BOOLEAN :'BOOLEAN'.
+
+% to much conflicts AnyValue -> Type ':' Value : {'ANYVALUE',{'$1','$3'}}.
+
+BooleanValue -> TRUE :true.
+BooleanValue -> FALSE :false.
+
+IntegerType -> 'INTEGER' : 'INTEGER'.
+IntegerType -> 'INTEGER' '{' NamedNumberList '}' : {'INTEGER','$3'}.
+
+NamedNumberList -> NamedNumber :['$1'].
+% modified NamedNumberList -> NamedNumberList ',' NamedNumber :'fix'.
+NamedNumberList -> NamedNumber ',' NamedNumberList :['$1'|'$3'].
+
+NamedNumber -> identifier '(' SignedNumber ')' : {'NamedNumber',element(3,'$1'),'$3'}.
+NamedNumber -> identifier '(' typereference '.' identifier ')' : {'NamedNumber',element(3,'$1'),{'ExternalValue',element(3,'$3'),element(3,'$5')}}.
+NamedNumber -> identifier '(' identifier ')' : {'NamedNumber',element(3,'$1'),element(3,'$3')}.
+
+%NamedValue -> identifier Value :
+% {'NamedValue',element(2,'$1'),element(3,'$1'),'$2'}.
+
+
+SignedNumber -> number : element(3,'$1').
+SignedNumber -> '-' number : - element(3,'$1').
+
+% inlined IntegerValue -> SignedNumber :'$1'.
+% conflict moved to Value IntegerValue -> identifier:'$1'.
+
+EnumeratedType -> ENUMERATED '{' Enumeration '}' :{'ENUMERATED','$3'}.
+
+% inlined Enumerations -> Enumeration :{'$1','false',[]}.
+% inlined Enumerations -> Enumeration ',' '...' : {'$1','true',[]}.
+% inlined Enumerations -> Enumeration ',' '...' ',' Enumeration : {'$1','true','$5'}.
+
+Enumeration -> EnumerationItem :['$1'].
+% modified Enumeration -> EnumerationItem ',' Enumeration :'fix'.
+Enumeration -> EnumerationItem ',' Enumeration :['$1'|'$3'].
+
+EnumerationItem -> identifier:element(3,'$1').
+EnumerationItem -> NamedNumber :'$1'.
+EnumerationItem -> '...' :'EXTENSIONMARK'.
+
+% conflict moved to Value EnumeratedValue -> identifier:'$1'.
+
+% inlined RealType -> REAL:'REAL'.
+
+RealValue -> NumericRealValue :'$1'.
+RealValue -> SpecialRealValue:'$1'.
+
+% ?? NumericRealValue -> number:'$1'. % number MUST BE '0'
+NumericRealValue -> SAndSOfValue : '$1'. % Value of the associated sequence type
+
+SpecialRealValue -> 'PLUS-INFINITY' :'$1'.
+SpecialRealValue -> 'MINUS-INFINITY' :'$1'.
+
+BitStringType -> 'BIT' 'STRING' :{'BIT STRING',[]}.
+BitStringType -> 'BIT' 'STRING' '{' NamedNumberList '}' :{'BIT STRING','$4'}.
+% NamedBitList replaced by NamedNumberList to reduce the grammar
+% Must check later that all "numbers" are positive
+
+% inlined BitStringValue -> bstring:'$1'.
+% inlined BitStringValue -> hstring:'$1'.
+% redundant use SequenceValue BitStringValue -> '{' IdentifierList '}' :$2.
+% redundant use SequenceValue BitStringValue -> '{' '}' :'fix'.
+
+IdentifierList -> identifier :[element(3,'$1')].
+% modified IdentifierList -> IdentifierList ',' identifier :'$1'.
+IdentifierList -> identifier ',' IdentifierList :[element(3,'$1')|'$3'].
+
+% inlined OctetStringType -> 'OCTET' 'STRING' :'OCTET STRING'.
+
+% inlined OctetStringValue -> bstring:'$1'.
+% inlined OctetStringValue -> hstring:'$1'.
+
+% inlined NullType -> 'NULL':'NULL'.
+
+% inlined NullValue -> NULL:'NULL'.
+
+% result is {'SEQUENCE',Optionals,Extensionmark,Componenttypelist}.
+SequenceType -> SEQUENCE '{' ComponentTypeList '}' :{'SEQUENCE','$3'}.
+% SequenceType -> SEQUENCE '{' ComponentTypeLists '}' :{'SEQUENCE','$3'}.
+% SequenceType -> SEQUENCE '{' ExtensionAndException '}' :{'SEQUENCE','$3'}.
+SequenceType -> SEQUENCE '{' '}' :{'SEQUENCE',[]}.
+
+% result is {RootComponentList,ExtensionAndException,AdditionalComponentTypeList}.
+%ComponentTypeLists -> ComponentTypeList ',' ExtensionAndException :{'$1','$3',[]}.
+%ComponentTypeLists -> ComponentTypeList :{'$1','false',[]}.
+%ComponentTypeLists -> ComponentTypeList ',' ExtensionAndException
+% ',' ComponentTypeList :{'$1','$3', '$5'}.
+%ComponentTypeLists -> ExtensionAndException ',' ComponentTypeList :{[],'$1','$3'}.
+
+ComponentTypeList -> ComponentType :['$1'].
+% modified below ComponentTypeList -> ComponentTypeList ',' ComponentType :'$1'.
+ComponentTypeList -> ComponentType ',' ComponentTypeList :['$1'|'$3'].
+
+% -record('ComponentType',{pos,name,type,attrib}).
+ComponentType -> '...' ExceptionSpec :{'EXTENSIONMARK',element(2,'$1'),'$2'}.
+ComponentType -> NamedType :
+ {'NamedType',Pos,{Name,Type}} = '$1',
+ #'ComponentType'{pos=Pos,name=Name,typespec=Type,prop=mandatory}.
+ComponentType -> NamedType 'OPTIONAL' :
+ {'NamedType',Pos,{Name,Type}} = '$1',
+ #'ComponentType'{pos=Pos,name=Name,typespec=Type,prop='OPTIONAL'}.
+ComponentType -> NamedType 'DEFAULT' Value:
+ {'NamedType',Pos,{Name,Type}} = '$1',
+ #'ComponentType'{pos=Pos,name=Name,typespec=Type,prop={'DEFAULT','$3'}}.
+ComponentType -> 'COMPONENTS' 'OF' Type :{'COMPONENTS OF','$3'}.
+
+% redundant ExtensionAndException -> '...' : extensionmark.
+% ExtensionAndException -> '...' ExceptionSpec : {extensionmark,'$2'}.
+
+% replaced SequenceValue -> '{' ComponentValueList '}':'$2'.
+% replaced SequenceValue -> '{' '}':[].
+
+ValueList -> Value :['$1'].
+ValueList -> NamedNumber :['$1'].
+% modified ValueList -> ValueList ',' Value :'$1'.
+ValueList -> Value ',' ValueList :['$1'|'$3'].
+ValueList -> Value ',' '...' :['$1' |[]].
+ValueList -> Value ValueList : ['$1',space|'$2'].
+ValueList -> NamedNumber ValueList: ['$1',space|'$2'].
+
+%ComponentValueList -> identifier ObjIdComponent:[{'NamedValue','$1','$2'}].
+%ComponentValueList -> NamedValue :['$1'].
+%ComponentValueList -> NamedValue ',' ComponentValueList:['$1'|'$3'].
+%ComponentValueList -> identifier ObjIdComponent ',' ComponentValueList :[{'NamedValue', '$1','$2'}|'$4'].
+
+SequenceOfType -> SEQUENCE OF Type : {'SEQUENCE OF','$3'}.
+
+% replaced SequenceOfValue with SAndSOfValue
+
+SAndSOfValue -> '{' ValueList '}' :'$2'.
+%SAndSOfValue -> '{' ComponentValueList '}' :'$2'.
+SAndSOfValue -> '{' '}' :[].
+
+% save for later SetType ->
+% result is {'SET',Optionals,Extensionmark,Componenttypelist}.
+SetType -> SET '{' ComponentTypeList '}' :{'SET','$3'}.
+% SetType -> SET '{' ExtensionAndException '}' :{'SET','$3'}.
+SetType -> SET '{' '}' :{'SET',[]}.
+
+% replaced SetValue with SAndSOfValue
+
+SetOfType -> SET OF Type : {'SET OF','$3'}.
+
+% replaced SetOfValue with SAndSOfValue
+
+ChoiceType -> 'CHOICE' '{' ComponentTypeList '}' :{'CHOICE','$3'}.
+% AlternativeTypeList is replaced by ComponentTypeList
+ChoiceValue -> identifier ':' Value : {'ChoiceValue',element(3,'$1'),'$3'}.
+% save for later SelectionType ->
+
+TaggedType -> Tag Type : '$2'#type{tag=['$1'#tag{type={default,get(tagdefault)}}]}.
+TaggedType -> Tag IMPLICIT Type :'$3'#type{tag=['$1'#tag{type='IMPLICIT'}]}.
+TaggedType -> Tag EXPLICIT Type :'$3'#type{tag=['$1'#tag{type='EXPLICIT'}]}.
+
+Tag -> '[' Class ClassNumber ']': #tag{class='$2',number='$3'}.
+Tag -> '[' Class typereference '.' identifier ']':
+ #tag{class='$2',number=#'Externalvaluereference'{pos=element(2,'$3'),module=element(3,'$3'),
+ value=element(3,'$5')}}.
+Tag -> '[' Class number ']': #tag{class='$2',number=element(3,'$3')}.
+Tag -> '[' Class identifier ']': #tag{class='$2',number=element(3,'$3')}.
+
+ClassNumber -> number :element(3,'$1').
+% inlined above ClassNumber -> typereference '.' identifier :{'Externalvaluereference',element(3,'$1'),element(3,'$3')}.
+ClassNumber -> identifier :element(3,'$1').
+
+Class -> 'UNIVERSAL' :element(1,'$1').
+Class -> 'APPLICATION' :element(1,'$1').
+Class -> 'PRIVATE' :element(1,'$1').
+Class -> '$empty' :'CONTEXT'.
+
+% conflict redundant TaggedValue -> Value:'$1'.
+
+% inlined EmbeddedPDVType -> 'EMBEDDED' 'PDV' :'EMBEDDED PDV'.
+
+% inlined EmbeddedPDVValue -> SequenceValue:'$1'.
+
+% inlined ExternalType -> 'EXTERNAL' :'EXTERNAL'.
+
+% inlined ExternalValue -> SequenceValue :'$1'.
+
+% inlined ObjectIdentifierType -> 'OBJECT' 'IDENTIFIER' :'OBJECT IDENTIFIER'.
+
+ObjectIdentifierValue -> '{' ObjIdComponentList '}' :'$2'.
+% inlined ObjectIdentifierValue -> SequenceAndSequenceOfValue :'$1'.
+% ObjectIdentifierValue -> '{' identifier ObjIdComponentList '}' :{'ObjectIdentifierValue','$2','$3'}.
+% ObjectIdentifierValue -> '{' typereference '.' identifier ObjIdComponentList '}' :{'ObjectIdentifierValue',{'$2','$4'},'$5'}.
+
+ObjIdComponentList -> Value:'$1'.
+ObjIdComponentList -> Value ObjIdComponentList :['$1'|'$2'].
+%ObjIdComponentList -> DefinedValue:'$1'.
+%ObjIdComponentList -> number:'$1'.
+%ObjIdComponentList -> DefinedValue ObjIdComponentList :['$1'|'$2'].
+%ObjIdComponentList -> number ObjIdComponentList :['$1'|'$2'].
+%ObjIdComponentList -> ObjIdComponent ObjIdComponentList :['$1'|'$2'].
+%ObjIdComponentList -> ObjIdComponent ObjIdComponentList :['$1'|'$2'].
+
+% redundant ObjIdComponent -> NameForm :'$1'. % expanded
+% replaced by 2 ObjIdComponent -> NumberForm :'$1'.
+% ObjIdComponent -> number :'$1'.
+% ObjIdComponent -> DefinedValue :'$1'. % means DefinedValue
+% ObjIdComponent -> NameAndNumberForm :'$1'.
+% ObjIdComponent -> NamedNumber :'$1'.
+% NamedBit replaced by NamedNumber to reduce grammar
+% must check later that "number" is positive
+
+% NameForm -> identifier:'$1'.
+
+% inlined NumberForm -> number :'$1'.
+% inlined NumberForm -> DefinedValue :'$1'.
+
+% replaced by NamedBit NameAndNumberForm -> identifier '(' NumberForm ')'.
+% NameAndNumberForm -> NamedBit:'$1'.
+
+
+CharacterStringType -> restrictedcharacterstringtype :element(3,'$1').
+CharacterStringType -> 'CHARACTER' 'STRING' :'CHARACTER STRING'.
+
+RestrictedCharacterStringValue -> cstring :element(3, '$1').
+% modified below RestrictedCharacterStringValue -> CharacterStringList :'$1'.
+% conflict vs BuiltinValue RestrictedCharacterStringValue -> SequenceAndSequenceOfValue :'$1'.
+RestrictedCharacterStringValue -> Quadruple :'$1'.
+RestrictedCharacterStringValue -> Tuple :'$1'.
+
+% redundant CharacterStringList -> '{' ValueList '}' :'$2'. % modified
+
+% redundant CharSyms -> CharsDefn :'$1'.
+% redundant CharSyms -> CharSyms ',' CharsDefn :['$1'|'$3'].
+
+% redundant CharsDefn -> cstring :'$1'.
+% temporary replaced see below CharsDefn -> DefinedValue :'$1'.
+% redundant CharsDefn -> Value :'$1'.
+
+Quadruple -> '{' number ',' number ',' number ',' number '}' :{'Quadruple','$2','$4','$6','$8'}.
+% {Group,Plane,Row,Cell}
+
+Tuple -> '{' number ',' number '}' :{'Tuple', '$2','$4'}.
+% {TableColumn,TableRow}
+
+% inlined UnrestrictedCharacterString -> 'CHARACTER' 'STRING' :'CHARACTER STRING'.
+
+CharacterStringValue -> RestrictedCharacterStringValue :'$1'.
+% conflict vs BuiltinValue CharacterStringValue -> SequenceValue :'$1'. % UnrestrictedCharacterStringValue
+
+% inlined UsefulType -> typereference :'$1'.
+
+SelectionType -> identifier '<' Type : {'SelectionType',element(3,'$1'),'$3'}.
+
+ConstrainedType -> Type Constraint :
+ '$1'#type{constraint=merge_constraints(['$2'])}.
+ConstrainedType -> Type Constraint Constraint :
+ '$1'#type{constraint=merge_constraints(['$2','$3'])}.
+ConstrainedType -> Type Constraint Constraint Constraint:
+ '$1'#type{constraint=merge_constraints(['$2','$3','$4'])}.
+ConstrainedType -> Type Constraint Constraint Constraint Constraint:
+ '$1'#type{constraint=merge_constraints(['$2','$3','$4','$5'])}.
+%ConstrainedType -> Type Constraint :'$1'#type{constraint='$2'}.
+%ConstrainedType -> Type Constraint :'$1'#type{constraint='$2'}.
+ConstrainedType -> TypeWithConstraint :'$1'.
+
+TypeWithConstraint -> 'SET' Constraint 'OF' Type :
+ #type{def = {'SET OF','$4'},constraint=merge_constraints(['$2'])}.
+TypeWithConstraint -> 'SET' 'SIZE' Constraint 'OF' Type :
+ #type{def = {'SET OF','$5'},constraint = merge_constraints([#constraint{c={'SizeConstraint','$3'#constraint.c}}])}.
+TypeWithConstraint -> 'SEQUENCE' Constraint 'OF' Type :
+ #type{def = {'SEQUENCE OF','$4'},constraint =
+ merge_constraints(['$2'])}.
+TypeWithConstraint -> 'SEQUENCE' 'SIZE' Constraint 'OF' Type :
+ #type{def = {'SEQUENCE OF','$5'},constraint = merge_constraints([#constraint{c={'SizeConstraint','$3'#constraint.c}}])}.
+
+
+Constraint -> '(' ConstraintSpec ExceptionSpec ')' :
+ #constraint{c='$2',e='$3'}.
+
+% inlined Constraint -> SubTypeConstraint :'$1'.
+ConstraintSpec -> ElementSetSpecs :'$1'.
+ConstraintSpec -> UserDefinedConstraint :'$1'.
+ConstraintSpec -> TableConstraint :'$1'.
+
+TableConstraint -> ComponentRelationConstraint : '$1'.
+TableConstraint -> ObjectSet : '$1'.
+%TableConstraint -> '{' typereference '}' :tableconstraint.
+
+ComponentRelationConstraint -> '{' typereference '}' '{' '@' ComponentIdList '}' : componentrelation.
+ComponentRelationConstraint -> '{' typereference '}' '{' '@' '.' ComponentIdList '}' : componentrelation.
+
+ComponentIdList -> identifier: ['$1'].
+ComponentIdList -> identifier '.' ComponentIdList: ['$1'| '$3'].
+
+
+% later ConstraintSpec -> GeneralConstraint :'$1'.
+
+% from X.682
+UserDefinedConstraint -> 'CONSTRAINED' 'BY' '{' '}' : {constrained_by,[]}.
+UserDefinedConstraint -> 'CONSTRAINED' 'BY'
+ '{' UserDefinedConstraintParameters '}' : {constrained_by,'$4'}.
+
+UserDefinedConstraintParameters -> UserDefinedConstraintParameter : ['$1'].
+UserDefinedConstraintParameters ->
+ UserDefinedConstraintParameter ','
+ UserDefinedConstraintParameters: ['$1'|'$3'].
+
+UserDefinedConstraintParameter -> Type '.' ActualParameter : {'$1','$3'}.
+UserDefinedConstraintParameter -> ActualParameter : '$1'.
+
+
+
+ExceptionSpec -> '!' ExceptionIdentification : '$1'.
+ExceptionSpec -> '$empty' : undefined.
+
+ExceptionIdentification -> SignedNumber : '$1'.
+% inlined ExceptionIdentification -> DefinedValue : '$1'.
+ExceptionIdentification -> typereference '.' identifier :
+ #'Externalvaluereference'{pos=element(2,'$1'),module=element(3,'$1'),
+ value=element(3,'$1')}.
+ExceptionIdentification -> identifier :'$1'.
+ExceptionIdentification -> Type ':' Value : {'$1','$3'}.
+
+% inlined SubTypeConstraint -> ElementSetSpec
+
+ElementSetSpecs -> ElementSetSpec : '$1'.
+ElementSetSpecs -> ElementSetSpec ',' '...': {'$1',[]}.
+ElementSetSpecs -> '...' ',' ElementSetSpec : {[],'$3'}.
+ElementSetSpecs -> ElementSetSpec ',' '...' ',' ElementSetSpec : {'$1','$5'}.
+
+ElementSetSpec -> Unions : '$1'.
+ElementSetSpec -> 'ALL' Exclusions : {'ALL','$2'}.
+
+Unions -> Intersections : '$1'.
+Unions -> UElems UnionMark IntersectionElements :
+ case {'$1','$3'} of
+ {{'SingleValue',V1},{'SingleValue',V2}} ->
+ {'SingleValue',ordsets:union(to_set(V1),to_set(V2))}
+ end.
+
+UElems -> Unions :'$1'.
+
+Intersections -> IntersectionElements :'$1'.
+Intersections -> IElems IntersectionMark IntersectionElements :
+ case {'$1','$3'} of
+ {{'SingleValue',V1},{'SingleValue',V2}} ->
+ {'SingleValue',ordsets:intersection(to_set(V1),to_set(V2))};
+ {V1,V2} when list(V1) ->
+ V1 ++ [V2];
+ {V1,V2} ->
+ [V1,V2]
+ end.
+%Intersections -> IElems '^' IntersectionElements :{'INTERSECTION','$1','$3'}.
+%Intersections -> IElems 'INTERSECTION' IntersectionElements :{'INTERSECTION','$1','$3'}.
+
+IElems -> Intersections :'$1'.
+
+IntersectionElements -> Elements :'$1'.
+IntersectionElements -> Elems Exclusions :{'$1','$2'}.
+
+Elems -> Elements :'$1'.
+
+Exclusions -> 'EXCEPT' Elements :{'EXCEPT','$2'}.
+
+IntersectionMark -> 'INTERSECTION':'$1'.
+IntersectionMark -> '^':'$1'.
+UnionMark -> 'UNION':'$1'.
+UnionMark -> '|':'$1'.
+
+
+Elements -> SubTypeElements : '$1'.
+%Elements -> ObjectSetElements : '$1'.
+Elements -> '(' ElementSetSpec ')' : '$2'.
+Elements -> ReferencedType : '$1'.
+
+SubTypeElements -> ValueList : {'SingleValue','$1'}. % NOTE it must be a Value
+% The rule above modifyed only because of conflicts
+SubTypeElements -> 'INCLUDES' Type : {'ContainedSubType','$2'}.
+%not lalr1 if this is activated SubTypeElements -> Type : {'TypeConstraint','$1'}.
+SubTypeElements -> LowerEndpoint '..' UpperEndpoint : {'ValueRange',{'$1','$3'}}.
+SubTypeElements -> 'FROM' Constraint : {'PermittedAlphabet','$2'#constraint.c}.
+SubTypeElements -> 'SIZE' Constraint: {'SizeConstraint','$2'#constraint.c}.
+% later will introduce conflicts related to NULL SubTypeElements -> Type : {'TypeConstraint','$1'}.
+SubTypeElements -> 'WITH' 'COMPONENT' Constraint:{'WITH COMPONENT','$3'}.
+SubTypeElements -> 'WITH' 'COMPONENTS' '{' TypeConstraints '}':{'WITH COMPONENTS',{'FullSpecification','$4'}}.
+SubTypeElements -> 'WITH' 'COMPONENTS' '{' '...' ',' TypeConstraints '}' :{'WITH COMPONENTS',{'PartialSpecification','$3'}}.
+
+% inlined above InnerTypeConstraints ::=
+% inlined above SingleTypeConstraint::= Constraint
+% inlined above MultipleTypeConstraints ::= FullSpecification | PartialSpecification
+% inlined above FullSpecification ::= "{" TypeConstraints "}"
+% inlined above PartialSpecification ::= "{" "..." "," TypeConstraints "}"
+% TypeConstraints -> identifier : [{'NamedConstraint',element(3,'$1'),undefined,undefined}]. % is this really meaningful or allowed
+TypeConstraints -> NamedConstraint : ['$1'].
+TypeConstraints -> NamedConstraint ',' TypeConstraints : ['$1'|'$3'].
+TypeConstraints -> identifier : ['$1'].
+TypeConstraints -> identifier ',' TypeConstraints : ['$1'|'$3'].
+
+NamedConstraint -> identifier Constraint PresenceConstraint :{'NamedConstraint',element(3,'$1'),'$2','$3'}.
+NamedConstraint -> identifier Constraint :{'NamedConstraint',element(3,'$1'),'$2',undefined}.
+NamedConstraint -> identifier PresenceConstraint :{'NamedConstraint',element(3,'$1'),undefined,'$2'}.
+
+PresenceConstraint -> 'PRESENT' : 'PRESENT'.
+PresenceConstraint -> 'ABSENT' : 'ABSENT'.
+PresenceConstraint -> 'OPTIONAL' : 'OPTIONAL'.
+
+
+
+LowerEndpoint -> LowerEndValue :'$1'.
+%LowerEndpoint -> LowerEndValue '<':{gt,'$1'}.
+LowerEndpoint -> LowerEndValue '<':('$1'+1).
+
+UpperEndpoint -> UpperEndValue :'$1'.
+%UpperEndpoint -> '<' UpperEndValue :{lt,'$2'}.
+UpperEndpoint -> '<' UpperEndValue :('$2'-1).
+
+LowerEndValue -> Value :'$1'.
+LowerEndValue -> 'MIN' :'MIN'.
+
+UpperEndValue -> Value :'$1'.
+UpperEndValue -> 'MAX' :'MAX'.
+
+
+% X.681
+
+
+% X.681 chap 15
+
+%TypeFromObject -> ReferencedObjects '.' FieldName : {'$1','$3'}.
+TypeFromObject -> typereference '.' FieldName : {'$1','$3'}.
+
+ReferencedObjects -> typereference : '$1'.
+%ReferencedObjects -> ParameterizedObject
+%ReferencedObjects -> DefinedObjectSet
+%ReferencedObjects -> ParameterizedObjectSet
+
+FieldName -> typefieldreference : ['$1'].
+FieldName -> valuefieldreference : ['$1'].
+FieldName -> FieldName '.' FieldName : ['$1' | '$3'].
+
+PrimitiveFieldName -> typefieldreference : '$1'.
+PrimitiveFieldName -> valuefieldreference : '$1'.
+
+%ObjectSetAssignment -> typereference DefinedObjectClass '::=' ObjectSet: null.
+ObjectSetAssignment -> typereference typereference '::=' ObjectSet :
+ #typedef{pos=element(2,'$1'),name=element(3,'$1'),typespec={'ObjectSet',element(3,'$2'), '$4'}}.
+ObjectSetAssignment -> typereference typereference '.' typereference '::=' ObjectSet.
+
+ObjectSet -> '{' ElementSetSpecs '}' : '$2'.
+ObjectSet -> '{' '...' '}' : ['EXTENSIONMARK'].
+
+%ObjectSetElements -> Object.
+% ObjectSetElements -> identifier : '$1'.
+%ObjectSetElements -> DefinedObjectSet.
+%ObjectSetElements -> ObjectSetFromObjects.
+%ObjectSetElements -> ParameterizedObjectSet.
+
+%ObjectAssignment -> identifier DefinedObjectClass '::=' Object.
+ObjectAssignment -> ValueAssignment.
+%ObjectAssignment -> identifier typereference '::=' Object.
+%ObjectAssignment -> identifier typereference '.' typereference '::=' Object.
+
+%Object -> DefinedObject: '$1'.
+%Object -> ExternalObjectReference: '$1'.%Object -> DefinedObject: '$1'.
+Object -> typereference '.' identifier: '$1'.%Object -> DefinedObject: '$1'.
+Object -> identifier: '$1'.%Object -> DefinedObject: '$1'.
+
+%Object -> ObjectDefn -> DefaultSyntax: '$1'.
+Object -> '{' FieldSetting ',' FieldSettings '}' : ['$2'|'$4'].
+Object -> '{' FieldSetting '}' :['$2'].
+
+%% For User-friendly notation
+%% Object -> ObjectDefn -> DefinedSyntax
+Object -> '{' '}'.
+Object -> '{' DefinedSyntaxTokens '}'.
+
+% later Object -> ParameterizedObject: '$1'. look in x.683
+
+%DefinedObject -> ExternalObjectReference: '$1'.
+%DefinedObject -> identifier: '$1'.
+
+DefinedObjectClass -> typereference.
+%DefinedObjectClass -> objectclassreference.
+DefinedObjectClass -> ExternalObjectClassReference.
+%DefinedObjectClass -> typereference '.' objectclassreference.
+%%DefinedObjectClass -> UsefulObjectClassReference.
+
+ExternalObjectReference -> typereference '.' identifier.
+ExternalObjectClassReference -> typereference '.' typereference.
+%%ExternalObjectClassReference -> typereference '.' objectclassreference.
+
+ObjectDefn -> DefaultSyntax: '$1'.
+%ObjectDefn -> DefinedSyntax: '$1'.
+
+ObjectFromObject -> ReferencedObjects '.' FieldName : {'ObjectFromObject','$1','$3'}.
+
+% later look in x.683 ParameterizedObject ->
+
+%DefaultSyntax -> '{' '}'.
+%DefaultSyntax -> '{' FieldSettings '}': '$2'.
+DefaultSyntax -> '{' FieldSetting ',' FieldSettings '}': '$2'.
+DefaultSyntax -> '{' FieldSetting '}': '$2'.
+
+FieldSetting -> PrimitiveFieldName Setting: {'$1','$2'}.
+
+FieldSettings -> FieldSetting ',' FieldSettings: ['$1'|'$3'].
+FieldSettings -> FieldSetting ',' FieldSettings: ['$1'|'$3'].
+FieldSettings -> FieldSetting: '$1'.
+
+%DefinedSyntax -> '{' '}'.
+DefinedSyntax -> '{' DefinedSyntaxTokens '}': '$2'.
+
+DefinedSyntaxTokens -> DefinedSyntaxToken: '$1'.
+DefinedSyntaxTokens -> DefinedSyntaxToken DefinedSyntaxTokens: ['$1'|'$2'].
+
+% expanded DefinedSyntaxToken -> Literal: '$1'.
+%DefinedSyntaxToken -> typereference: '$1'.
+DefinedSyntaxToken -> word: '$1'.
+DefinedSyntaxToken -> ',': '$1'.
+DefinedSyntaxToken -> Setting: '$1'.
+%DefinedSyntaxToken -> '$empty': nil .
+
+% Setting ::= Type|Value|ValueSet|Object|ObjectSet
+Setting -> Type: '$1'.
+%Setting -> Value: '$1'.
+%Setting -> ValueNotNull: '$1'.
+Setting -> BuiltinValue: '$1'.
+Setting -> ValueSet: '$1'.
+%Setting -> Object: '$1'.
+%Setting -> ExternalObjectReference.
+Setting -> typereference '.' identifier.
+Setting -> identifier.
+Setting -> ObjectDefn.
+
+Setting -> ObjectSet: '$1'.
+
+
+Erlang code.
+%%-author('[email protected]').
+-copyright('Copyright (c) 1991-99 Ericsson Telecom AB').
+-vsn('$Revision: 1.1 $').
+-include("asn1_records.hrl").
+
+to_set(V) when list(V) ->
+ ordsets:list_to_set(V);
+to_set(V) ->
+ ordsets:list_to_set([V]).
+
+merge_constraints({Rlist,ExtList}) -> % extensionmarker in constraint
+ {merge_constraints(Rlist,[],[]),
+ merge_constraints(ExtList,[],[])};
+
+merge_constraints(Clist) ->
+ merge_constraints(Clist, [], []).
+
+merge_constraints([Ch|Ct],Cacc, Eacc) ->
+ NewEacc = case Ch#constraint.e of
+ undefined -> Eacc;
+ E -> [E|Eacc]
+ end,
+ merge_constraints(Ct,[fixup_constraint(Ch#constraint.c)|Cacc],NewEacc);
+
+merge_constraints([],Cacc,[]) ->
+ lists:flatten(Cacc);
+merge_constraints([],Cacc,Eacc) ->
+ lists:flatten(Cacc) ++ [{'Errors',Eacc}].
+
+fixup_constraint(C) ->
+ case C of
+ {'SingleValue',V} when list(V) ->
+ [C,
+ {'ValueRange',{lists:min(V),lists:max(V)}}];
+ {'PermittedAlphabet',{'SingleValue',V}} when list(V) ->
+ V2 = {'SingleValue',
+ ordsets:list_to_set(lists:flatten(V))},
+ {'PermittedAlphabet',V2};
+ {'PermittedAlphabet',{'SingleValue',V}} ->
+ V2 = {'SingleValue',[V]},
+ {'PermittedAlphabet',V2};
+ {'SizeConstraint',Sc} ->
+ {'SizeConstraint',fixup_size_constraint(Sc)};
+
+ List when list(List) ->
+ [fixup_constraint(Xc)||Xc <- List];
+ Other ->
+ Other
+ end.
+
+fixup_size_constraint({'ValueRange',{Lb,Ub}}) ->
+ {Lb,Ub};
+fixup_size_constraint({{'ValueRange',R},[]}) ->
+ {R,[]};
+fixup_size_constraint({[],{'ValueRange',R}}) ->
+ {[],R};
+fixup_size_constraint({{'ValueRange',R1},{'ValueRange',R2}}) ->
+ {R1,R2};
+fixup_size_constraint({'SingleValue',[Sv]}) ->
+ fixup_size_constraint({'SingleValue',Sv});
+fixup_size_constraint({'SingleValue',L}) when list(L) ->
+ ordsets:list_to_set(L);
+fixup_size_constraint({'SingleValue',L}) ->
+ {L,L};
+fixup_size_constraint({C1,C2}) ->
+ {fixup_size_constraint(C1), fixup_size_constraint(C2)}.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_parser2.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_parser2.erl
new file mode 100644
index 0000000000..07dacb73c8
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_parser2.erl
@@ -0,0 +1,2763 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 2000, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1ct_parser2.erl,v 1.1 2008/12/17 09:53:30 mikpe Exp $
+%%
+-module(asn1ct_parser2).
+
+-export([parse/1]).
+-include("asn1_records.hrl").
+
+%% parse all types in module
+parse(Tokens) ->
+ case catch parse_ModuleDefinition(Tokens) of
+ {'EXIT',Reason} ->
+ {error,{{undefined,get(asn1_module),
+ [internal,error,'when',parsing,module,definition,Reason]},
+ hd(Tokens)}};
+ {asn1_error,Reason} ->
+ {error,{Reason,hd(Tokens)}};
+ {ModuleDefinition,Rest1} ->
+ {Types,Rest2} = parse_AssignmentList(Rest1),
+ case Rest2 of
+ [{'END',_}|_Rest3] ->
+ {ok,ModuleDefinition#module{typeorval = Types}};
+ _ ->
+ {error,{{get_line(hd(Rest2)),get(asn1_module),
+ [got,get_token(hd(Rest2)),expected,'END']},
+ hd(Rest2)}}
+ end
+ end.
+
+parse_ModuleDefinition([{typereference,L1,ModuleIdentifier}|Rest0]) ->
+ put(asn1_module,ModuleIdentifier),
+ {_DefinitiveIdentifier,Rest02} =
+ case Rest0 of
+ [{'{',_}|_Rest01] ->
+ parse_ObjectIdentifierValue(Rest0);
+ _ ->
+ {[],Rest0}
+ end,
+ Rest = case Rest02 of
+ [{'DEFINITIONS',_}|Rest03] ->
+ Rest03;
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest02)),get(asn1_module),
+ [got,get_token(hd(Rest02)),
+ expected,'DEFINITIONS']}})
+ end,
+ {TagDefault,Rest2} =
+ case Rest of
+ [{'EXPLICIT',_L3},{'TAGS',_L4}|Rest1] ->
+ put(tagdefault,'EXPLICIT'), {'EXPLICIT',Rest1};
+ [{'IMPLICIT',_L3},{'TAGS',_L4}|Rest1] ->
+ put(tagdefault,'IMPLICIT'), {'IMPLICIT',Rest1};
+ [{'AUTOMATIC',_L3},{'TAGS',_L4}|Rest1] ->
+ put(tagdefault,'AUTOMATIC'), {'AUTOMATIC',Rest1};
+ Rest1 ->
+ put(tagdefault,'EXPLICIT'), {'EXPLICIT',Rest1} % The default
+ end,
+ {ExtensionDefault,Rest3} =
+ case Rest2 of
+ [{'EXTENSIBILITY',_L5}, {'IMPLIED',_L6}|Rest21] ->
+ {'IMPLIED',Rest21};
+ _ -> {false,Rest2}
+ end,
+ case Rest3 of
+ [{'::=',_L7}, {'BEGIN',_L8}|Rest4] ->
+ {Exports, Rest5} = parse_Exports(Rest4),
+ {Imports, Rest6} = parse_Imports(Rest5),
+ {#module{ pos = L1,
+ name = ModuleIdentifier,
+ defid = [], % fix this
+ tagdefault = TagDefault,
+ extensiondefault = ExtensionDefault,
+ exports = Exports,
+ imports = Imports},Rest6};
+ _ -> throw({asn1_error,{get_line(hd(Rest3)),get(asn1_module),
+ [got,get_token(hd(Rest3)),expected,"::= BEGIN"]}})
+ end;
+parse_ModuleDefinition(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,typereference]}}).
+
+parse_Exports([{'EXPORTS',_L1},{';',_L2}|Rest]) ->
+ {{exports,[]},Rest};
+parse_Exports([{'EXPORTS',_L1}|Rest]) ->
+ {SymbolList,Rest2} = parse_SymbolList(Rest),
+ case Rest2 of
+ [{';',_}|Rest3] ->
+ {{exports,SymbolList},Rest3};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
+ [got,get_token(hd(Rest2)),expected,';']}})
+ end;
+parse_Exports(Rest) ->
+ {{exports,all},Rest}.
+
+parse_SymbolList(Tokens) ->
+ parse_SymbolList(Tokens,[]).
+
+parse_SymbolList(Tokens,Acc) ->
+ {Symbol,Rest} = parse_Symbol(Tokens),
+ case Rest of
+ [{',',_L1}|Rest2] ->
+ parse_SymbolList(Rest2,[Symbol|Acc]);
+ Rest2 ->
+ {lists:reverse([Symbol|Acc]),Rest2}
+ end.
+
+parse_Symbol(Tokens) ->
+ parse_Reference(Tokens).
+
+parse_Reference([{typereference,L1,TrefName},{'{',_L2},{'}',_L3}|Rest]) ->
+% {Tref,Rest};
+ {tref2Exttref(L1,TrefName),Rest};
+parse_Reference([Tref1 = {typereference,_,_},{'.',_},Tref2 = {typereference,_,_},
+ {'{',_L2},{'}',_L3}|Rest]) ->
+% {{Tref1,Tref2},Rest};
+ {{tref2Exttref(Tref1),tref2Exttref(Tref2)},Rest};
+parse_Reference([Tref = {typereference,_L1,_TrefName}|Rest]) ->
+ {tref2Exttref(Tref),Rest};
+parse_Reference([Vref = {identifier,_L1,_VName}|Rest]) ->
+ {identifier2Extvalueref(Vref),Rest};
+parse_Reference(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,
+ [typereference,identifier]]}}).
+
+parse_Imports([{'IMPORTS',_L1},{';',_L2}|Rest]) ->
+ {{imports,[]},Rest};
+parse_Imports([{'IMPORTS',_L1}|Rest]) ->
+ {SymbolsFromModuleList,Rest2} = parse_SymbolsFromModuleList(Rest),
+ case Rest2 of
+ [{';',_L2}|Rest3] ->
+ {{imports,SymbolsFromModuleList},Rest3};
+ Rest3 ->
+ throw({asn1_error,{get_line(hd(Rest3)),get(asn1_module),
+ [got,get_token(hd(Rest3)),expected,';']}})
+ end;
+parse_Imports(Tokens) ->
+ {{imports,[]},Tokens}.
+
+parse_SymbolsFromModuleList(Tokens) ->
+ parse_SymbolsFromModuleList(Tokens,[]).
+
+parse_SymbolsFromModuleList(Tokens,Acc) ->
+ {SymbolsFromModule,Rest} = parse_SymbolsFromModule(Tokens),
+ case (catch parse_SymbolsFromModule(Rest)) of
+ {Sl,_Rest2} when record(Sl,'SymbolsFromModule') ->
+ parse_SymbolsFromModuleList(Rest,[SymbolsFromModule|Acc]);
+ _ ->
+ {lists:reverse([SymbolsFromModule|Acc]),Rest}
+ end.
+
+parse_SymbolsFromModule(Tokens) ->
+ SetRefModuleName =
+ fun(N) ->
+ fun(X) when record(X,'Externaltypereference')->
+ X#'Externaltypereference'{module=N};
+ (X) when record(X,'Externalvaluereference')->
+ X#'Externalvaluereference'{module=N}
+ end
+ end,
+ {SymbolList,Rest} = parse_SymbolList(Tokens),
+ case Rest of
+ %%How does this case correspond to x.680 ?
+ [{'FROM',_L1},Tref = {typereference,_,_},Ref={identifier,_L2,_Id},C={',',_}|Rest2] ->
+ {#'SymbolsFromModule'{symbols=SymbolList,
+ module=tref2Exttref(Tref)},[Ref,C|Rest2]};
+ %%How does this case correspond to x.680 ?
+ [{'FROM',_L1},Tref = {typereference,_,_},{identifier,_L2,_Id}|Rest2] ->
+ {#'SymbolsFromModule'{symbols=SymbolList,
+ module=tref2Exttref(Tref)},Rest2};
+ [{'FROM',_L1},Tref = {typereference,_,Name},Brace = {'{',_}|Rest2] ->
+ {_ObjIdVal,Rest3} = parse_ObjectIdentifierValue([Brace|Rest2]), % value not used yet, fix me
+ NewSymbolList = lists:map(SetRefModuleName(Name),SymbolList),
+ {#'SymbolsFromModule'{symbols=NewSymbolList,
+ module=tref2Exttref(Tref)},Rest3};
+ [{'FROM',_L1},Tref = {typereference,_,Name}|Rest2] ->
+ NewSymbolList = lists:map(SetRefModuleName(Name),SymbolList),
+ {#'SymbolsFromModule'{symbols=NewSymbolList,
+ module=tref2Exttref(Tref)},Rest2};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest)),get(asn1_module),
+ [got,get_token(hd(Rest)),expected,
+ ['FROM typerefernece identifier ,',
+ 'FROM typereference identifier',
+ 'FROM typereference {',
+ 'FROM typereference']]}})
+ end.
+
+parse_ObjectIdentifierValue([{'{',_}|Rest]) ->
+ parse_ObjectIdentifierValue(Rest,[]).
+
+parse_ObjectIdentifierValue([{number,_,Num}|Rest],Acc) ->
+ parse_ObjectIdentifierValue(Rest,[Num|Acc]);
+parse_ObjectIdentifierValue([{identifier,_,Id},{'(',_}, {number,_,Num}, {')',_}|Rest],Acc) ->
+ parse_ObjectIdentifierValue(Rest,[{'NamedNumber',Id,Num}|Acc]);
+parse_ObjectIdentifierValue([{identifier,_,Id},{'(',_}, {identifier,_,Id2}, {')',_}|Rest],Acc) ->
+ parse_ObjectIdentifierValue(Rest,[{'NamedNumber',Id,Id2}|Acc]);
+parse_ObjectIdentifierValue([{identifier,_,Id},{'(',_}, {typereference,_,Tref},{'.',_},{identifier,_,Id2}, {')',_}|Rest],Acc) ->
+ parse_ObjectIdentifierValue(Rest,[{'NamedNumber',Id,{'ExternalValue',Tref,Id2}}|Acc]);
+parse_ObjectIdentifierValue([Id = {identifier,_,_}|Rest],Acc) ->
+ parse_ObjectIdentifierValue(Rest,[identifier2Extvalueref(Id)|Acc]);
+parse_ObjectIdentifierValue([{'}',_}|Rest],Acc) ->
+ {lists:reverse(Acc),Rest};
+parse_ObjectIdentifierValue([H|_T],_Acc) ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,
+ ['{ some of the following }',number,'identifier ( number )',
+ 'identifier ( identifier )',
+ 'identifier ( typereference.identifier)',identifier]]}}).
+
+parse_AssignmentList(Tokens = [{'END',_}|_Rest]) ->
+ {[],Tokens};
+parse_AssignmentList(Tokens = [{'$end',_}|_Rest]) ->
+ {[],Tokens};
+parse_AssignmentList(Tokens) ->
+ parse_AssignmentList(Tokens,[]).
+
+parse_AssignmentList(Tokens= [{'END',_}|_Rest],Acc) ->
+ {lists:reverse(Acc),Tokens};
+parse_AssignmentList(Tokens= [{'$end',_}|_Rest],Acc) ->
+ {lists:reverse(Acc),Tokens};
+parse_AssignmentList(Tokens,Acc) ->
+ case (catch parse_Assignment(Tokens)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ {asn1_error,R} ->
+% [H|T] = Tokens,
+ throw({error,{R,hd(Tokens)}});
+ {Assignment,Rest} ->
+ parse_AssignmentList(Rest,[Assignment|Acc])
+ end.
+
+parse_Assignment(Tokens) ->
+ Flist = [fun parse_TypeAssignment/1,
+ fun parse_ValueAssignment/1,
+ fun parse_ObjectClassAssignment/1,
+ fun parse_ObjectAssignment/1,
+ fun parse_ObjectSetAssignment/1,
+ fun parse_ParameterizedAssignment/1,
+ fun parse_ValueSetTypeAssignment/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ AsnErr = {asn1_error,_} ->
+ throw(AsnErr);
+ {asn1_assignment_error,Reason} ->
+ throw({asn1_error,Reason});
+ Result ->
+ Result
+ end.
+
+
+parse_or(Tokens,Flist) ->
+ parse_or(Tokens,Flist,[]).
+
+parse_or(_Tokens,[],ErrList) ->
+ case ErrList of
+ [] ->
+ throw({asn1_error,{parse_or,ErrList}});
+ L when list(L) ->
+%%% throw({asn1_error,{parse_or,hd(lists:reverse(ErrList))}});
+ %% chose to throw 1) the error with the highest line no,
+ %% 2) the last error which is not a asn1_assignment_error or
+ %% 3) the last error.
+ throw(prioritize_error(ErrList));
+ Other ->
+ throw({asn1_error,{parse_or,Other}})
+ end;
+parse_or(Tokens,[Fun|Frest],ErrList) ->
+ case (catch Fun(Tokens)) of
+ Exit = {'EXIT',_Reason} ->
+ parse_or(Tokens,Frest,[Exit|ErrList]);
+ AsnErr = {asn1_error,_} ->
+ parse_or(Tokens,Frest,[AsnErr|ErrList]);
+ AsnAssErr = {asn1_assignment_error,_} ->
+ parse_or(Tokens,Frest,[AsnAssErr|ErrList]);
+ Result = {_,L} when list(L) ->
+ Result;
+% Result ->
+% Result
+ Error ->
+ parse_or(Tokens,Frest,[Error|ErrList])
+ end.
+
+parse_TypeAssignment([{typereference,L1,Tref},{'::=',_}|Rest]) ->
+ {Type,Rest2} = parse_Type(Rest),
+ {#typedef{pos=L1,name=Tref,typespec=Type},Rest2};
+parse_TypeAssignment([H1,H2|_Rest]) ->
+ throw({asn1_assignment_error,{get_line(H1),get(asn1_module),
+ [got,[get_token(H1),get_token(H2)], expected,
+ typereference,'::=']}});
+parse_TypeAssignment([H|_T]) ->
+ throw({asn1_assignment_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,
+ typereference]}}).
+
+parse_Type(Tokens) ->
+ {Tag,Rest3} = case Tokens of
+ [Lbr= {'[',_}|Rest] ->
+ parse_Tag([Lbr|Rest]);
+ Rest-> {[],Rest}
+ end,
+ {Tag2,Rest4} = case Rest3 of
+ [{'IMPLICIT',_}|Rest31] when record(Tag,tag)->
+ {[Tag#tag{type='IMPLICIT'}],Rest31};
+ [{'EXPLICIT',_}|Rest31] when record(Tag,tag)->
+ {[Tag#tag{type='EXPLICIT'}],Rest31};
+ Rest31 when record(Tag,tag) ->
+ {[Tag#tag{type={default,get(tagdefault)}}],Rest31};
+ Rest31 ->
+ {Tag,Rest31}
+ end,
+ Flist = [fun parse_BuiltinType/1,fun parse_ReferencedType/1,fun parse_TypeWithConstraint/1],
+ {Type,Rest5} = case (catch parse_or(Rest4,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ AsnErr = {asn1_error,_Reason} ->
+ throw(AsnErr);
+ Result ->
+ Result
+ end,
+ case hd(Rest5) of
+ {'(',_} ->
+ {Constraints,Rest6} = parse_Constraints(Rest5),
+ if record(Type,type) ->
+ {Type#type{constraint=merge_constraints(Constraints),
+ tag=Tag2},Rest6};
+ true ->
+ {#type{def=Type,constraint=merge_constraints(Constraints),
+ tag=Tag2},Rest6}
+ end;
+ _ ->
+ if record(Type,type) ->
+ {Type#type{tag=Tag2},Rest5};
+ true ->
+ {#type{def=Type,tag=Tag2},Rest5}
+ end
+ end.
+
+parse_BuiltinType([{'BIT',_},{'STRING',_}|Rest]) ->
+ case Rest of
+ [{'{',_}|Rest2] ->
+ {NamedNumberList,Rest3} = parse_NamedNumberList(Rest2),
+ case Rest3 of
+ [{'}',_}|Rest4] ->
+ {#type{def={'BIT STRING',NamedNumberList}},Rest4};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest3)),get(asn1_module),
+ [got,get_token(hd(Rest3)),expected,'}']}})
+ end;
+ _ ->
+ {{'BIT STRING',[]},Rest}
+ end;
+parse_BuiltinType([{'BOOLEAN',_}|Rest]) ->
+ {#type{def='BOOLEAN'},Rest};
+%% CharacterStringType ::= RestrictedCharacterStringType |
+%% UnrestrictedCharacterStringType
+parse_BuiltinType([{restrictedcharacterstringtype,_,StringName}|Rest]) ->
+ {#type{def=StringName},Rest};
+parse_BuiltinType([{'CHARACTER',_},{'STRING',_}|Rest]) ->
+ {#type{def='CHARACTER STRING'},Rest};
+
+parse_BuiltinType([{'CHOICE',_},{'{',_}|Rest]) ->
+ {AlternativeTypeLists,Rest2} = parse_AlternativeTypeLists(Rest),
+ case Rest2 of
+ [{'}',_}|Rest3] ->
+ {#type{def={'CHOICE',AlternativeTypeLists}},Rest3};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
+ [got,get_token(hd(Rest2)),expected,'}']}})
+ end;
+parse_BuiltinType([{'EMBEDDED',_},{'PDV',_}|Rest]) ->
+ {#type{def='EMBEDDED PDV'},Rest};
+parse_BuiltinType([{'ENUMERATED',_},{'{',_}|Rest]) ->
+ {Enumerations,Rest2} = parse_Enumerations(Rest),
+ case Rest2 of
+ [{'}',_}|Rest3] ->
+ {#type{def={'ENUMERATED',Enumerations}},Rest3};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
+ [got,get_token(hd(Rest2)),expected,'}']}})
+ end;
+parse_BuiltinType([{'EXTERNAL',_}|Rest]) ->
+ {#type{def='EXTERNAL'},Rest};
+
+% InstanceOfType
+parse_BuiltinType([{'INSTANCE',_},{'OF',_}|Rest]) ->
+ {DefinedObjectClass,Rest2} = parse_DefinedObjectClass(Rest),
+ case Rest2 of
+ [{'(',_}|_] ->
+ {Constraint,Rest3} = parse_Constraint(Rest2),
+ {#type{def={'INSTANCE OF',DefinedObjectClass,Constraint}},Rest3};
+ _ ->
+ {#type{def={'INSTANCE OF',DefinedObjectClass,[]}},Rest2}
+ end;
+
+% parse_BuiltinType(Tokens) ->
+
+parse_BuiltinType([{'INTEGER',_}|Rest]) ->
+ case Rest of
+ [{'{',_}|Rest2] ->
+ {NamedNumberList,Rest3} = parse_NamedNumberList(Rest2),
+ case Rest3 of
+ [{'}',_}|Rest4] ->
+ {#type{def={'INTEGER',NamedNumberList}},Rest4};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest3)),get(asn1_module),
+ [got,get_token(hd(Rest3)),expected,'}']}})
+ end;
+ _ ->
+ {#type{def='INTEGER'},Rest}
+ end;
+parse_BuiltinType([{'NULL',_}|Rest]) ->
+ {#type{def='NULL'},Rest};
+
+% ObjectClassFieldType fix me later
+
+parse_BuiltinType([{'OBJECT',_},{'IDENTIFIER',_}|Rest]) ->
+ {#type{def='OBJECT IDENTIFIER'},Rest};
+parse_BuiltinType([{'OCTET',_},{'STRING',_}|Rest]) ->
+ {#type{def='OCTET STRING'},Rest};
+parse_BuiltinType([{'REAL',_}|Rest]) ->
+ {#type{def='REAL'},Rest};
+parse_BuiltinType([{'SEQUENCE',_},{'{',_},{'...',Line},{'}',_}|Rest]) ->
+ {#type{def=#'SEQUENCE'{components=[{'EXTENSIONMARK',Line,undefined}]}},
+ Rest};
+parse_BuiltinType([{'SEQUENCE',_},{'{',_},{'...',Line},{'!',_}|Rest]) ->
+ {ExceptionIdentification,Rest2} = parse_ExceptionIdentification(Rest),
+ case Rest2 of
+ [{'}',_}|Rest3] ->
+ {#type{def=#'SEQUENCE'{components=[{'EXTENSIONMARK',
+ Line,
+ ExceptionIdentification}]}},
+ Rest3};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
+ [got,get_token(hd(Rest2)),expected,'}']}})
+ end;
+parse_BuiltinType([{'SEQUENCE',_},{'{',_}|Rest]) ->
+ {ComponentTypeLists,Rest2} = parse_ComponentTypeLists(Rest),
+ case Rest2 of
+ [{'}',_}|Rest3] ->
+ {#type{def=#'SEQUENCE'{components=ComponentTypeLists}},Rest3};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
+ [got,get_token(hd(Rest2)),expected,'}']}})
+ end;
+parse_BuiltinType([{'SEQUENCE',_},{'OF',_}|Rest]) ->
+ {Type,Rest2} = parse_Type(Rest),
+ {#type{def={'SEQUENCE OF',Type}},Rest2};
+
+
+parse_BuiltinType([{'SET',_},{'{',_},{'...',Line},{'}',_}|Rest]) ->
+ {#type{def=#'SET'{components=[{'EXTENSIONMARK',Line,undefined}]}},Rest};
+parse_BuiltinType([{'SET',_},{'{',_},{'...',Line},{'!',_}|Rest]) ->
+ {ExceptionIdentification,Rest2} = parse_ExceptionIdentification(Rest),
+ case Rest2 of
+ [{'}',_}|Rest3] ->
+ {#type{def=#'SET'{components=
+ [{'EXTENSIONMARK',Line,ExceptionIdentification}]}},
+ Rest3};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
+ [got,get_token(hd(Rest2)),expected,'}']}})
+ end;
+parse_BuiltinType([{'SET',_},{'{',_}|Rest]) ->
+ {ComponentTypeLists,Rest2} = parse_ComponentTypeLists(Rest),
+ case Rest2 of
+ [{'}',_}|Rest3] ->
+ {#type{def=#'SET'{components=ComponentTypeLists}},Rest3};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
+ [got,get_token(hd(Rest2)),expected,'}']}})
+ end;
+parse_BuiltinType([{'SET',_},{'OF',_}|Rest]) ->
+ {Type,Rest2} = parse_Type(Rest),
+ {#type{def={'SET OF',Type}},Rest2};
+
+%% The so called Useful types
+parse_BuiltinType([{'GeneralizedTime',_}|Rest]) ->
+ {#type{def='GeneralizedTime'},Rest};
+parse_BuiltinType([{'UTCTime',_}|Rest]) ->
+ {#type{def='UTCTime'},Rest};
+parse_BuiltinType([{'ObjectDescriptor',_}|Rest]) ->
+ {#type{def='ObjectDescriptor'},Rest};
+
+%% For compatibility with old standard
+parse_BuiltinType([{'ANY',_},{'DEFINED',_},{'BY',_},{identifier,_,Id}|Rest]) ->
+ {#type{def={'ANY_DEFINED_BY',Id}},Rest};
+parse_BuiltinType([{'ANY',_}|Rest]) ->
+ {#type{def='ANY'},Rest};
+
+parse_BuiltinType(Tokens) ->
+ parse_ObjectClassFieldType(Tokens).
+% throw({asn1_error,unhandled_type}).
+
+
+parse_TypeWithConstraint([{'SEQUENCE',_},Lpar = {'(',_}|Rest]) ->
+ {Constraint,Rest2} = parse_Constraint([Lpar|Rest]),
+ case Rest2 of
+ [{'OF',_}|Rest3] ->
+ {Type,Rest4} = parse_Type(Rest3),
+ {#type{def = {'SEQUENCE OF',Type}, constraint = merge_constraints([Constraint])},Rest4};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
+ [got,get_token(hd(Rest2)),expected,'OF']}})
+ end;
+parse_TypeWithConstraint([{'SEQUENCE',_},{'SIZE',_},Lpar = {'(',_}|Rest]) ->
+ {Constraint,Rest2} = parse_Constraint([Lpar|Rest]),
+ Constraint2 =
+ case Constraint of
+ #constraint{c=C} ->
+ Constraint#constraint{c={'SizeConstraint',C}};
+ _ -> Constraint
+ end,
+ case Rest2 of
+ [{'OF',_}|Rest3] ->
+ {Type,Rest4} = parse_Type(Rest3),
+ {#type{def = {'SEQUENCE OF',Type}, constraint = merge_constraints([Constraint2])},Rest4};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
+ [got,get_token(hd(Rest2)),expected,'OF']}})
+ end;
+parse_TypeWithConstraint([{'SET',_},Lpar = {'(',_}|Rest]) ->
+ {Constraint,Rest2} = parse_Constraint([Lpar|Rest]),
+ case Rest2 of
+ [{'OF',_}|Rest3] ->
+ {Type,Rest4} = parse_Type(Rest3),
+ {#type{def = {'SET OF',Type}, constraint = merge_constraints([Constraint])},Rest4};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
+ [got,get_token(hd(Rest2)),expected,'OF']}})
+ end;
+parse_TypeWithConstraint([{'SET',_},{'SIZE',_},Lpar = {'(',_}|Rest]) ->
+ {Constraint,Rest2} = parse_Constraint([Lpar|Rest]),
+ Constraint2 =
+ case Constraint of
+ #constraint{c=C} ->
+ Constraint#constraint{c={'SizeConstraint',C}};
+ _ -> Constraint
+ end,
+ case Rest2 of
+ [{'OF',_}|Rest3] ->
+ {Type,Rest4} = parse_Type(Rest3),
+ {#type{def = {'SET OF',Type}, constraint = merge_constraints([Constraint2])},Rest4};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
+ [got,get_token(hd(Rest2)),expected,'OF']}})
+ end;
+parse_TypeWithConstraint(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,
+ ['SEQUENCE','SEQUENCE SIZE','SET','SET SIZE'],
+ followed,by,a,constraint]}}).
+
+
+%% --------------------------
+
+parse_ReferencedType(Tokens) ->
+ Flist = [fun parse_DefinedType/1,
+ fun parse_SelectionType/1,
+ fun parse_TypeFromObject/1,
+ fun parse_ValueSetFromObjects/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ AsnErr = {asn1_error,_} ->
+ throw(AsnErr);
+ Result ->
+ Result
+ end.
+
+parse_DefinedType(Tokens=[{typereference,_,_},{'{',_}|_Rest]) ->
+ parse_ParameterizedType(Tokens);
+parse_DefinedType(Tokens=[{typereference,L1,TypeName},
+ T2={typereference,_,_},T3={'{',_}|Rest]) ->
+ case (catch parse_ParameterizedType(Tokens)) of
+ {'EXIT',_Reason} ->
+ Rest2 = [T2,T3|Rest],
+ {#type{def = #'Externaltypereference'{pos=L1,
+ module=get(asn1_module),
+ type=TypeName}},Rest2};
+ {asn1_error,_} ->
+ Rest2 = [T2,T3|Rest],
+ {#type{def = #'Externaltypereference'{pos=L1,
+ module=get(asn1_module),
+ type=TypeName}},Rest2};
+ Result ->
+ Result
+ end;
+parse_DefinedType([{typereference,L1,Module},{'.',_},{typereference,_,TypeName}|Rest]) ->
+ {#type{def = #'Externaltypereference'{pos=L1,module=Module,type=TypeName}},Rest};
+parse_DefinedType([{typereference,L1,TypeName}|Rest]) ->
+ {#type{def = #'Externaltypereference'{pos=L1,module=get(asn1_module),
+ type=TypeName}},Rest};
+parse_DefinedType(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,
+ [typereference,'typereference.typereference',
+ 'typereference typereference']]}}).
+
+parse_SelectionType([{identifier,_,Name},{'<',_}|Rest]) ->
+ {Type,Rest2} = parse_Type(Rest),
+ {{'SelectionType',Name,Type},Rest2};
+parse_SelectionType(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,'identifier <']}}).
+
+
+%% --------------------------
+
+
+%% This should probably be removed very soon
+% parse_ConstrainedType(Tokens) ->
+% case (catch parse_TypeWithConstraint(Tokens)) of
+% {'EXIT',Reason} ->
+% {Type,Rest} = parse_Type(Tokens),
+% {Constraint,Rest2} = parse_Constraint(Rest),
+% {Type#type{constraint=Constraint},Rest2};
+% {asn1_error,Reason2} ->
+% {Type,Rest} = parse_Type(Tokens),
+% {Constraint,Rest2} = parse_Constraint(Rest),
+% {Type#type{constraint=Constraint},Rest2};
+% Result ->
+% Result
+% end.
+
+parse_Constraints(Tokens) ->
+ parse_Constraints(Tokens,[]).
+
+parse_Constraints(Tokens,Acc) ->
+ {Constraint,Rest} = parse_Constraint(Tokens),
+ case Rest of
+ [{'(',_}|_Rest2] ->
+ parse_Constraints(Rest,[Constraint|Acc]);
+ _ ->
+ {lists:reverse([Constraint|Acc]),Rest}
+ end.
+
+parse_Constraint([{'(',_}|Rest]) ->
+ {Constraint,Rest2} = parse_ConstraintSpec(Rest),
+ {Exception,Rest3} = parse_ExceptionSpec(Rest2),
+ case Rest3 of
+ [{')',_}|Rest4] ->
+ {#constraint{c=Constraint,e=Exception},Rest4};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,')']}})
+ end;
+parse_Constraint(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,'(']}}).
+
+parse_ConstraintSpec(Tokens) ->
+ Flist = [fun parse_GeneralConstraint/1,
+ fun parse_SubtypeConstraint/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ {asn1_error,Reason2} ->
+ throw({asn1_error,Reason2});
+ Result ->
+ Result
+ end.
+
+parse_ExceptionSpec([LPar={')',_}|Rest]) ->
+ {undefined,[LPar|Rest]};
+parse_ExceptionSpec([{'!',_}|Rest]) ->
+ parse_ExceptionIdentification(Rest);
+parse_ExceptionSpec(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,[')','!']]}}).
+
+parse_ExceptionIdentification(Tokens) ->
+ Flist = [fun parse_SignedNumber/1,
+ fun parse_DefinedValue/1,
+ fun parse_TypeColonValue/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ {asn1_error,Reason2} ->
+ throw({asn1_error,Reason2});
+ Result ->
+ Result
+ end.
+
+parse_TypeColonValue(Tokens) ->
+ {Type,Rest} = parse_Type(Tokens),
+ case Rest of
+ [{':',_}|Rest2] ->
+ {Value,Rest3} = parse_Value(Rest2),
+ {{Type,Value},Rest3};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,':']}})
+ end.
+
+parse_SubtypeConstraint(Tokens) ->
+ parse_ElementSetSpecs(Tokens).
+
+parse_ElementSetSpecs([{'...',_}|Rest]) ->
+ {Elements,Rest2} = parse_ElementSetSpec(Rest),
+ {{[],Elements},Rest2};
+parse_ElementSetSpecs(Tokens) ->
+ {RootElems,Rest} = parse_ElementSetSpec(Tokens),
+ case Rest of
+ [{',',_},{'...',_},{',',_}|Rest2] ->
+ {AdditionalElems,Rest3} = parse_ElementSetSpec(Rest2),
+ {{RootElems,AdditionalElems},Rest3};
+ [{',',_},{'...',_}|Rest2] ->
+ {{RootElems,[]},Rest2};
+ _ ->
+ {RootElems,Rest}
+ end.
+
+parse_ElementSetSpec([{'ALL',_},{'EXCEPT',_}|Rest]) ->
+ {Exclusions,Rest2} = parse_Elements(Rest),
+ {{'ALL',{'EXCEPT',Exclusions}},Rest2};
+parse_ElementSetSpec(Tokens) ->
+ parse_Unions(Tokens).
+
+
+parse_Unions(Tokens) ->
+ {InterSec,Rest} = parse_Intersections(Tokens),
+ {Unions,Rest2} = parse_UnionsRec(Rest),
+ case {InterSec,Unions} of
+ {InterSec,[]} ->
+ {InterSec,Rest2};
+ {{'SingleValue',V1},{'SingleValue',V2}} ->
+ {{'SingleValue',ordsets:union(to_set(V1),to_set(V2))},Rest2};
+ {V1,V2} when list(V2) ->
+ {[V1] ++ [union|V2],Rest2};
+ {V1,V2} ->
+ {[V1,union,V2],Rest2}
+% Other ->
+% throw(Other)
+ end.
+
+parse_UnionsRec([{'|',_}|Rest]) ->
+ {InterSec,Rest2} = parse_Intersections(Rest),
+ {URec,Rest3} = parse_UnionsRec(Rest2),
+ case {InterSec,URec} of
+ {V1,[]} ->
+ {V1,Rest3};
+ {{'SingleValue',V1},{'SingleValue',V2}} ->
+ {{'SingleValue',ordsets:union(to_set(V1),to_set(V2))},Rest3};
+ {V1,V2} when list(V2) ->
+ {[V1] ++ V2,Rest3};
+ {V1,V2} ->
+ {[V1,V2],Rest3}
+ end;
+parse_UnionsRec([{'UNION',_}|Rest]) ->
+ {InterSec,Rest2} = parse_Intersections(Rest),
+ {URec,Rest3} = parse_UnionsRec(Rest2),
+ case {InterSec,URec} of
+ {V1,[]} ->
+ {V1,Rest3};
+ {{'SingleValue',V1},{'SingleValue',V2}} ->
+ {{'SingleValue',ordsets:union(to_set(V1),to_set(V2))},Rest3};
+ {V1,V2} when list(V2) ->
+ {[V1] ++ V2,Rest3};
+ {V1,V2} ->
+ {[V1,V2],Rest3}
+ end;
+parse_UnionsRec(Tokens) ->
+ {[],Tokens}.
+
+parse_Intersections(Tokens) ->
+ {InterSec,Rest} = parse_IntersectionElements(Tokens),
+ {IRec,Rest2} = parse_IElemsRec(Rest),
+ case {InterSec,IRec} of
+ {V1,[]} ->
+ {V1,Rest2};
+ {{'SingleValue',V1},{'SingleValue',V2}} ->
+ {{'SingleValue',
+ ordsets:intersection(to_set(V1),to_set(V2))},Rest2};
+ {V1,V2} when list(V2) ->
+ {[V1] ++ [intersection|V2],Rest2};
+ {V1,V2} ->
+ {[V1,intersection,V2],Rest2};
+ _ ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,'a Union']}})
+ end.
+
+parse_IElemsRec([{'^',_}|Rest]) ->
+ {InterSec,Rest2} = parse_IntersectionElements(Rest),
+ {IRec,Rest3} = parse_IElemsRec(Rest2),
+ case {InterSec,IRec} of
+ {{'SingleValue',V1},{'SingleValue',V2}} ->
+ {{'SingleValue',
+ ordsets:intersection(to_set(V1),to_set(V2))},Rest3};
+ {V1,[]} ->
+ {V1,Rest3};
+ {V1,V2} when list(V2) ->
+ {[V1] ++ V2,Rest3};
+ {V1,V2} ->
+ {[V1,V2],Rest3};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest)),get(asn1_module),
+ [got,get_token(hd(Rest)),expected,'an Intersection']}})
+ end;
+parse_IElemsRec([{'INTERSECTION',_}|Rest]) ->
+ {InterSec,Rest2} = parse_IntersectionElements(Rest),
+ {IRec,Rest3} = parse_IElemsRec(Rest2),
+ case {InterSec,IRec} of
+ {{'SingleValue',V1},{'SingleValue',V2}} ->
+ {{'SingleValue',
+ ordsets:intersection(to_set(V1),to_set(V2))},Rest3};
+ {V1,[]} ->
+ {V1,Rest3};
+ {V1,V2} when list(V2) ->
+ {[V1] ++ V2,Rest3};
+ {V1,V2} ->
+ {[V1,V2],Rest3};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest)),get(asn1_module),
+ [got,get_token(hd(Rest)),expected,'an Intersection']}})
+ end;
+parse_IElemsRec(Tokens) ->
+ {[],Tokens}.
+
+parse_IntersectionElements(Tokens) ->
+ {InterSec,Rest} = parse_Elements(Tokens),
+ case Rest of
+ [{'EXCEPT',_}|Rest2] ->
+ {Exclusion,Rest3} = parse_Elements(Rest2),
+ {{InterSec,{'EXCEPT',Exclusion}},Rest3};
+ Rest ->
+ {InterSec,Rest}
+ end.
+
+parse_Elements([{'(',_}|Rest]) ->
+ {Elems,Rest2} = parse_ElementSetSpec(Rest),
+ case Rest2 of
+ [{')',_}|Rest3] ->
+ {Elems,Rest3};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,')']}})
+ end;
+parse_Elements(Tokens) ->
+ Flist = [fun parse_SubtypeElements/1,
+ fun parse_ObjectSetElements/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ Err = {asn1_error,_} ->
+ throw(Err);
+ Result ->
+ Result
+ end.
+
+
+
+
+%% --------------------------
+
+parse_DefinedObjectClass([{typereference,_,_ModName},{'.',_},Tr={typereference,_,_ObjClName}|Rest]) ->
+%% {{objectclassname,ModName,ObjClName},Rest};
+% {{objectclassname,tref2Exttref(Tr)},Rest};
+ {tref2Exttref(Tr),Rest};
+parse_DefinedObjectClass([Tr={typereference,_,_ObjClName}|Rest]) ->
+% {{objectclassname,tref2Exttref(Tr)},Rest};
+ {tref2Exttref(Tr),Rest};
+parse_DefinedObjectClass([{'TYPE-IDENTIFIER',_}|Rest]) ->
+ {'TYPE-IDENTIFIER',Rest};
+parse_DefinedObjectClass([{'ABSTRACT-SYNTAX',_}|Rest]) ->
+ {'ABSTRACT-SYNTAX',Rest};
+parse_DefinedObjectClass(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,
+ ['typereference . typereference',
+ typereference,
+ 'TYPE-IDENTIFIER',
+ 'ABSTRACT-SYNTAX']]}}).
+
+parse_ObjectClassAssignment([{typereference,L1,ObjClName},{'::=',_}|Rest]) ->
+ {Type,Rest2} = parse_ObjectClass(Rest),
+ {#classdef{pos=L1,name=ObjClName,typespec=Type},Rest2};
+parse_ObjectClassAssignment(Tokens) ->
+ throw({asn1_assignment_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,
+ 'typereference ::=']}}).
+
+parse_ObjectClass(Tokens) ->
+ Flist = [fun parse_DefinedObjectClass/1,
+ fun parse_ObjectClassDefn/1,
+ fun parse_ParameterizedObjectClass/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ {asn1_error,Reason2} ->
+ throw({asn1_error,Reason2});
+ Result ->
+ Result
+ end.
+
+parse_ObjectClassDefn([{'CLASS',_},{'{',_}|Rest]) ->
+ {Type,Rest2} = parse_FieldSpec(Rest),
+ {WithSyntaxSpec,Rest3} = parse_WithSyntaxSpec(Rest2),
+ {#objectclass{fields=Type,syntax=WithSyntaxSpec},Rest3};
+parse_ObjectClassDefn(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,'CLASS {']}}).
+
+parse_FieldSpec(Tokens) ->
+ parse_FieldSpec(Tokens,[]).
+
+parse_FieldSpec(Tokens,Acc) ->
+ Flist = [fun parse_FixedTypeValueFieldSpec/1,
+ fun parse_VariableTypeValueFieldSpec/1,
+ fun parse_ObjectFieldSpec/1,
+ fun parse_FixedTypeValueSetFieldSpec/1,
+ fun parse_VariableTypeValueSetFieldSpec/1,
+ fun parse_TypeFieldSpec/1,
+ fun parse_ObjectSetFieldSpec/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ AsnErr = {asn1_error,_} ->
+ throw(AsnErr);
+ {Type,[{'}',_}|Rest]} ->
+ {lists:reverse([Type|Acc]),Rest};
+ {Type,[{',',_}|Rest2]} ->
+ parse_FieldSpec(Rest2,[Type|Acc]);
+ {_,[H|_T]} ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,'}']}})
+ end.
+
+parse_PrimitiveFieldName([{typefieldreference,_,FieldName}|Rest]) ->
+ {{typefieldreference,FieldName},Rest};
+parse_PrimitiveFieldName([{valuefieldreference,_,FieldName}|Rest]) ->
+ {{valuefieldreference,FieldName},Rest};
+parse_PrimitiveFieldName(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,
+ [typefieldreference,valuefieldreference]]}}).
+
+parse_FieldName(Tokens) ->
+ {Field,Rest} = parse_PrimitiveFieldName(Tokens),
+ parse_FieldName(Rest,[Field]).
+
+parse_FieldName([{'.',_}|Rest],Acc) ->
+ case (catch parse_PrimitiveFieldName(Rest)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ AsnErr = {asn1_error,_} ->
+ throw(AsnErr);
+ {FieldName,Rest2} ->
+ parse_FieldName(Rest2,[FieldName|Acc])
+ end;
+parse_FieldName(Tokens,Acc) ->
+ {lists:reverse(Acc),Tokens}.
+
+parse_FixedTypeValueFieldSpec([{valuefieldreference,L1,VFieldName}|Rest]) ->
+ {Type,Rest2} = parse_Type(Rest),
+ {Unique,Rest3} =
+ case Rest2 of
+ [{'UNIQUE',_}|Rest4] ->
+ {'UNIQUE',Rest4};
+ _ ->
+ {undefined,Rest2}
+ end,
+ {OptionalitySpec,Rest5} = parse_ValueOptionalitySpec(Rest3),
+ case Unique of
+ 'UNIQUE' ->
+ case OptionalitySpec of
+ {'DEFAULT',_} ->
+ throw({asn1_error,
+ {L1,get(asn1_module),
+ ['UNIQUE and DEFAULT in same field',VFieldName]}});
+ _ ->
+ {{fixedtypevaluefield,VFieldName,Type,Unique,OptionalitySpec},Rest5}
+ end;
+ _ ->
+ {{object_or_fixedtypevalue_field,VFieldName,Type,Unique,OptionalitySpec},Rest5}
+ end;
+parse_FixedTypeValueFieldSpec(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,valuefieldreference]}}).
+
+parse_VariableTypeValueFieldSpec([{valuefieldreference,_,VFieldName}|Rest]) ->
+ {FieldRef,Rest2} = parse_FieldName(Rest),
+ {OptionalitySpec,Rest3} = parse_ValueOptionalitySpec(Rest2),
+ {{variabletypevaluefield,VFieldName,FieldRef,OptionalitySpec},Rest3};
+parse_VariableTypeValueFieldSpec(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,valuefieldreference]}}).
+
+parse_ObjectFieldSpec([{valuefieldreference,_,VFieldName}|Rest]) ->
+ {Class,Rest2} = parse_DefinedObjectClass(Rest),
+ {OptionalitySpec,Rest3} = parse_ObjectOptionalitySpec(Rest2),
+ {{objectfield,VFieldName,Class,OptionalitySpec},Rest3};
+parse_ObjectFieldSpec(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,valuefieldreference]}}).
+
+parse_TypeFieldSpec([{typefieldreference,_,TFieldName}|Rest]) ->
+ {OptionalitySpec,Rest2} = parse_TypeOptionalitySpec(Rest),
+ {{typefield,TFieldName,OptionalitySpec},Rest2};
+parse_TypeFieldSpec(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,typefieldreference]}}).
+
+parse_FixedTypeValueSetFieldSpec([{typefieldreference,_,TFieldName}|Rest]) ->
+ {Type,Rest2} = parse_Type(Rest),
+ {OptionalitySpec,Rest3} = parse_ValueSetOptionalitySpec(Rest2),
+ {{objectset_or_fixedtypevalueset_field,TFieldName,Type,
+ OptionalitySpec},Rest3};
+parse_FixedTypeValueSetFieldSpec(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,typefieldreference]}}).
+
+parse_VariableTypeValueSetFieldSpec([{typefieldreference,_,TFieldName}|Rest]) ->
+ {FieldRef,Rest2} = parse_FieldName(Rest),
+ {OptionalitySpec,Rest3} = parse_ValueSetOptionalitySpec(Rest2),
+ {{variabletypevaluesetfield,TFieldName,FieldRef,OptionalitySpec},Rest3};
+parse_VariableTypeValueSetFieldSpec(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,typefieldreference]}}).
+
+parse_ObjectSetFieldSpec([{typefieldreference,_,TFieldName}|Rest]) ->
+ {Class,Rest2} = parse_DefinedObjectClass(Rest),
+ {OptionalitySpec,Rest3} = parse_ObjectSetOptionalitySpec(Rest2),
+ {{objectsetfield,TFieldName,Class,OptionalitySpec},Rest3};
+parse_ObjectSetFieldSpec(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,typefieldreference]}}).
+
+parse_ValueOptionalitySpec(Tokens)->
+ case Tokens of
+ [{'OPTIONAL',_}|Rest] -> {'OPTIONAL',Rest};
+ [{'DEFAULT',_}|Rest] ->
+ {Value,Rest2} = parse_Value(Rest),
+ {{'DEFAULT',Value},Rest2};
+ _ -> {'MANDATORY',Tokens}
+ end.
+
+parse_ObjectOptionalitySpec(Tokens) ->
+ case Tokens of
+ [{'OPTIONAL',_}|Rest] -> {'OPTIONAL',Rest};
+ [{'DEFAULT',_}|Rest] ->
+ {Object,Rest2} = parse_Object(Rest),
+ {{'DEFAULT',Object},Rest2};
+ _ -> {'MANDATORY',Tokens}
+ end.
+
+parse_TypeOptionalitySpec(Tokens) ->
+ case Tokens of
+ [{'OPTIONAL',_}|Rest] -> {'OPTIONAL',Rest};
+ [{'DEFAULT',_}|Rest] ->
+ {Type,Rest2} = parse_Type(Rest),
+ {{'DEFAULT',Type},Rest2};
+ _ -> {'MANDATORY',Tokens}
+ end.
+
+parse_ValueSetOptionalitySpec(Tokens) ->
+ case Tokens of
+ [{'OPTIONAL',_}|Rest] -> {'OPTIONAL',Rest};
+ [{'DEFAULT',_}|Rest] ->
+ {ValueSet,Rest2} = parse_ValueSet(Rest),
+ {{'DEFAULT',ValueSet},Rest2};
+ _ -> {'MANDATORY',Tokens}
+ end.
+
+parse_ObjectSetOptionalitySpec(Tokens) ->
+ case Tokens of
+ [{'OPTIONAL',_}|Rest] -> {'OPTIONAL',Rest};
+ [{'DEFAULT',_}|Rest] ->
+ {ObjectSet,Rest2} = parse_ObjectSet(Rest),
+ {{'DEFAULT',ObjectSet},Rest2};
+ _ -> {'MANDATORY',Tokens}
+ end.
+
+parse_WithSyntaxSpec([{'WITH',_},{'SYNTAX',_}|Rest]) ->
+ {SyntaxList,Rest2} = parse_SyntaxList(Rest),
+ {{'WITH SYNTAX',SyntaxList},Rest2};
+parse_WithSyntaxSpec(Tokens) ->
+ {[],Tokens}.
+
+parse_SyntaxList([{'{',_},{'}',_}|Rest]) ->
+ {[],Rest};
+parse_SyntaxList([{'{',_}|Rest]) ->
+ parse_SyntaxList(Rest,[]);
+parse_SyntaxList(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,['{}','{']]}}).
+
+parse_SyntaxList(Tokens,Acc) ->
+ {SyntaxList,Rest} = parse_TokenOrGroupSpec(Tokens),
+ case Rest of
+ [{'}',_}|Rest2] ->
+ {lists:reverse([SyntaxList|Acc]),Rest2};
+ _ ->
+ parse_SyntaxList(Rest,[SyntaxList|Acc])
+ end.
+
+parse_TokenOrGroupSpec(Tokens) ->
+ Flist = [fun parse_RequiredToken/1,
+ fun parse_OptionalGroup/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ AsnErr = {asn1_error,_} ->
+ throw(AsnErr);
+ Result ->
+ Result
+ end.
+
+parse_RequiredToken([{typereference,L1,WordName}|Rest]) ->
+ case is_word(WordName) of
+ false ->
+ throw({asn1_error,{L1,get(asn1_module),
+ [got,WordName,expected,a,'Word']}});
+ true ->
+ {WordName,Rest}
+ end;
+parse_RequiredToken([{',',L1}|Rest]) ->
+ {{',',L1},Rest};
+parse_RequiredToken([{WordName,L1}|Rest]) ->
+ case is_word(WordName) of
+ false ->
+ throw({asn1_error,{L1,get(asn1_module),
+ [got,WordName,expected,a,'Word']}});
+ true ->
+ {WordName,Rest}
+ end;
+parse_RequiredToken(Tokens) ->
+ parse_PrimitiveFieldName(Tokens).
+
+parse_OptionalGroup([{'[',_}|Rest]) ->
+ {Spec,Rest2} = parse_TokenOrGroupSpec(Rest),
+ {SpecList,Rest3} = parse_OptionalGroup(Rest2,[Spec]),
+ {SpecList,Rest3}.
+
+parse_OptionalGroup([{']',_}|Rest],Acc) ->
+ {lists:reverse(Acc),Rest};
+parse_OptionalGroup(Tokens,Acc) ->
+ {Spec,Rest} = parse_TokenOrGroupSpec(Tokens),
+ parse_OptionalGroup(Rest,[Spec|Acc]).
+
+parse_DefinedObject([Id={identifier,_,_ObjName}|Rest]) ->
+ {{object,identifier2Extvalueref(Id)},Rest};
+parse_DefinedObject([{typereference,L1,ModName},{'.',_},{identifier,_,ObjName}|Rest]) ->
+ {{object, #'Externaltypereference'{pos=L1,module=ModName,type=ObjName}},Rest};
+parse_DefinedObject(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,
+ [identifier,'typereference.identifier']]}}).
+
+parse_ObjectAssignment([{identifier,L1,ObjName}|Rest]) ->
+ {Class,Rest2} = parse_DefinedObjectClass(Rest),
+ case Rest2 of
+ [{'::=',_}|Rest3] ->
+ {Object,Rest4} = parse_Object(Rest3),
+ {#typedef{pos=L1,name=ObjName,
+ typespec=#'Object'{classname=Class,def=Object}},Rest4};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,'::=']}});
+ Other ->
+ throw({asn1_error,{L1,get(asn1_module),
+ [got,Other,expected,'::=']}})
+ end;
+parse_ObjectAssignment(Tokens) ->
+ throw({asn1_assignment_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,identifier]}}).
+
+parse_Object(Tokens) ->
+ Flist=[fun parse_ObjectDefn/1,
+ fun parse_ObjectFromObject/1,
+ fun parse_ParameterizedObject/1,
+ fun parse_DefinedObject/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ AsnErr = {asn1_error,_} ->
+ throw(AsnErr);
+ Result ->
+ Result
+ end.
+
+parse_ObjectDefn(Tokens) ->
+ Flist=[fun parse_DefaultSyntax/1,
+ fun parse_DefinedSyntax/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ AsnErr = {asn1_error,_} ->
+ throw(AsnErr);
+ Result ->
+ Result
+ end.
+
+parse_DefaultSyntax([{'{',_},{'}',_}|Rest]) ->
+ {{object,defaultsyntax,[]},Rest};
+parse_DefaultSyntax([{'{',_}|Rest]) ->
+ parse_DefaultSyntax(Rest,[]);
+parse_DefaultSyntax(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,['{}','{']]}}).
+
+parse_DefaultSyntax(Tokens,Acc) ->
+ {Setting,Rest} = parse_FieldSetting(Tokens),
+ case Rest of
+ [{',',_}|Rest2] ->
+ parse_DefaultSyntax(Rest2,[Setting|Acc]);
+ [{'}',_}|Rest3] ->
+ {{object,defaultsyntax,lists:reverse([Setting|Acc])},Rest3};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,[',','}']]}})
+ end.
+
+parse_FieldSetting(Tokens) ->
+ {{_,PrimFieldName},Rest} = parse_PrimitiveFieldName(Tokens),
+ {Setting,Rest2} = parse_Setting(Rest),
+ {{PrimFieldName,Setting},Rest2}.
+
+parse_DefinedSyntax([{'{',_}|Rest]) ->
+ parse_DefinedSyntax(Rest,[]).
+
+parse_DefinedSyntax(Tokens,Acc) ->
+ case Tokens of
+ [{'}',_}|Rest2] ->
+ {{object,definedsyntax,lists:reverse(Acc)},Rest2};
+ _ ->
+ {DefSynTok,Rest3} = parse_DefinedSyntaxToken(Tokens),
+ parse_DefinedSyntax(Rest3,[DefSynTok|Acc])
+ end.
+
+parse_DefinedSyntaxToken([{',',L1}|Rest]) ->
+ {{',',L1},Rest};
+parse_DefinedSyntaxToken([{typereference,L1,Name}|Rest]) ->
+ case is_word(Name) of
+ false ->
+ {{setting,L1,Name},Rest};
+ true ->
+ {{word_or_setting,L1,Name},Rest}
+ end;
+parse_DefinedSyntaxToken(Tokens) ->
+ case catch parse_Setting(Tokens) of
+ {asn1_error,_} ->
+ parse_Word(Tokens);
+ {'EXIT',Reason} ->
+ exit(Reason);
+ Result ->
+ Result
+ end.
+
+parse_Word([{Name,Pos}|Rest]) ->
+ case is_word(Name) of
+ false ->
+ throw({asn1_error,{Pos,get(asn1_module),
+ [got,Name, expected,a,'Word']}});
+ true ->
+ {{word_or_setting,Pos,Name},Rest}
+ end.
+
+parse_Setting(Tokens) ->
+ Flist = [fun parse_Type/1,
+ fun parse_Value/1,
+ fun parse_Object/1,
+ fun parse_ObjectSet/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ AsnErr = {asn1_error,_} ->
+ throw(AsnErr);
+ Result ->
+ Result
+ end.
+
+parse_DefinedObjectSet([{typereference,L1,ModuleName},{'.',_},
+ {typereference,L2,ObjSetName}|Rest]) ->
+ {{objectset,L1,#'Externaltypereference'{pos=L2,module=ModuleName,
+ type=ObjSetName}},Rest};
+parse_DefinedObjectSet([{typereference,L1,ObjSetName}|Rest]) ->
+ {{objectset,L1,#'Externaltypereference'{pos=L1,module=get(asn1_module),
+ type=ObjSetName}},Rest};
+parse_DefinedObjectSet(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,
+ [typereference,'typereference.typereference']]}}).
+
+parse_ObjectSetAssignment([{typereference,L1,ObjSetName}|Rest]) ->
+ {Class,Rest2} = parse_DefinedObjectClass(Rest),
+ case Rest2 of
+ [{'::=',_}|Rest3] ->
+ {ObjectSet,Rest4} = parse_ObjectSet(Rest3),
+ {#typedef{pos=L1,name=ObjSetName,
+ typespec=#'ObjectSet'{class=Class,
+ set=ObjectSet}},Rest4};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,'::=']}})
+%%% Other ->
+%%% throw(Other)
+ end;
+parse_ObjectSetAssignment(Tokens) ->
+ throw({asn1_assignment_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,
+ typereference]}}).
+
+parse_ObjectSet([{'{',_}|Rest]) ->
+ {ObjSetSpec,Rest2} = parse_ObjectSetSpec(Rest),
+ case Rest2 of
+ [{'}',_}|Rest3] ->
+ {ObjSetSpec,Rest3};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,'}']}})
+ end;
+parse_ObjectSet(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,'{']}}).
+
+parse_ObjectSetSpec([{'...',_}|Rest]) ->
+ {['EXTENSIONMARK'],Rest};
+parse_ObjectSetSpec(Tokens) ->
+ parse_ElementSetSpecs(Tokens).
+
+parse_ObjectSetElements(Tokens) ->
+ Flist = [fun parse_Object/1,
+ fun parse_DefinedObjectSet/1,
+ fun parse_ObjectSetFromObjects/1,
+ fun parse_ParameterizedObjectSet/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ AsnErr = {asn1_error,_} ->
+ throw(AsnErr);
+ Result ->
+ Result
+ end.
+
+parse_ObjectClassFieldType(Tokens) ->
+ {Class,Rest} = parse_DefinedObjectClass(Tokens),
+ case Rest of
+ [{'.',_}|Rest2] ->
+ {FieldName,Rest3} = parse_FieldName(Rest2),
+ OCFT = #'ObjectClassFieldType'{
+ classname=Class,
+ class=Class,fieldname=FieldName},
+ {#type{def=OCFT},Rest3};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,'.']}})
+%%% Other ->
+%%% throw(Other)
+ end.
+
+%parse_ObjectClassFieldValue(Tokens) ->
+% Flist = [fun parse_OpenTypeFieldVal/1,
+% fun parse_FixedTypeFieldVal/1],
+% case (catch parse_or(Tokens,Flist)) of
+% {'EXIT',Reason} ->
+% throw(Reason);
+% AsnErr = {asn1_error,_} ->
+% throw(AsnErr);
+% Result ->
+% Result
+% end.
+
+parse_ObjectClassFieldValue(Tokens) ->
+ parse_OpenTypeFieldVal(Tokens).
+
+parse_OpenTypeFieldVal(Tokens) ->
+ {Type,Rest} = parse_Type(Tokens),
+ case Rest of
+ [{':',_}|Rest2] ->
+ {Value,Rest3} = parse_Value(Rest2),
+ {{opentypefieldvalue,Type,Value},Rest3};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,':']}})
+ end.
+
+% parse_FixedTypeFieldVal(Tokens) ->
+% parse_Value(Tokens).
+
+% parse_InformationFromObjects(Tokens) ->
+% Flist = [fun parse_ValueFromObject/1,
+% fun parse_ValueSetFromObjects/1,
+% fun parse_TypeFromObject/1,
+% fun parse_ObjectFromObject/1],
+% case (catch parse_or(Tokens,Flist)) of
+% {'EXIT',Reason} ->
+% throw(Reason);
+% AsnErr = {asn1_error,_} ->
+% throw(AsnErr);
+% Result ->
+% Result
+% end.
+
+parse_ReferencedObjects(Tokens) ->
+ Flist = [fun parse_DefinedObject/1,
+ fun parse_DefinedObjectSet/1,
+ fun parse_ParameterizedObject/1,
+ fun parse_ParameterizedObjectSet/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ AsnErr = {asn1_error,_} ->
+ throw(AsnErr);
+ Result ->
+ Result
+ end.
+
+parse_ValueFromObject(Tokens) ->
+ {Objects,Rest} = parse_ReferencedObjects(Tokens),
+ case Rest of
+ [{'.',_}|Rest2] ->
+ {Name,Rest3} = parse_FieldName(Rest2),
+ case lists:last(Name) of
+ {valuefieldreference,_} ->
+ {{'ValueFromObject',Objects,Name},Rest3};
+ _ ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,typefieldreference,expected,
+ valuefieldreference]}})
+ end;
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,'.']}})
+%%% Other ->
+%%% throw({asn1_error,{got,Other,expected,'.'}})
+ end.
+
+parse_ValueSetFromObjects(Tokens) ->
+ {Objects,Rest} = parse_ReferencedObjects(Tokens),
+ case Rest of
+ [{'.',_}|Rest2] ->
+ {Name,Rest3} = parse_FieldName(Rest2),
+ case lists:last(Name) of
+ {typefieldreference,_FieldName} ->
+ {{'ValueSetFromObjects',Objects,Name},Rest3};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
+ [got,get_token(hd(Rest2)),expected,
+ typefieldreference]}})
+ end;
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,'.']}})
+%%% Other ->
+%%% throw({asn1_error,{got,Other,expected,'.'}})
+ end.
+
+parse_TypeFromObject(Tokens) ->
+ {Objects,Rest} = parse_ReferencedObjects(Tokens),
+ case Rest of
+ [{'.',_}|Rest2] ->
+ {Name,Rest3} = parse_FieldName(Rest2),
+ case lists:last(Name) of
+ {typefieldreference,_FieldName} ->
+ {{'TypeFromObject',Objects,Name},Rest3};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
+ [got,get_token(hd(Rest2)),expected,
+ typefieldreference]}})
+ end;
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,'.']}})
+%%% Other ->
+%%% throw({asn1_error,{got,Other,expected,'.'}})
+ end.
+
+parse_ObjectFromObject(Tokens) ->
+ {Objects,Rest} = parse_ReferencedObjects(Tokens),
+ case Rest of
+ [{'.',_}|Rest2] ->
+ {Name,Rest3} = parse_FieldName(Rest2),
+ {{'ObjectFromObject',Objects,Name},Rest3};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,'.']}})
+%%% Other ->
+%%% throw({asn1_error,{got,Other,expected,'.'}})
+ end.
+
+parse_ObjectSetFromObjects(Tokens) ->
+ {Objects,Rest} = parse_ReferencedObjects(Tokens),
+ case Rest of
+ [{'.',_}|Rest2] ->
+ {Name,Rest3} = parse_FieldName(Rest2),
+ {{'ObjectSetFromObjects',Objects,Name},Rest3};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,'.']}})
+%%% Other ->
+%%% throw({asn1_error,{got,Other,expected,'.'}})
+ end.
+
+% parse_InstanceOfType([{'INSTANCE',_},{'OF',_}|Rest]) ->
+% {Class,Rest2} = parse_DefinedObjectClass(Rest),
+% {{'InstanceOfType',Class},Rest2}.
+
+% parse_InstanceOfValue(Tokens) ->
+% parse_Value(Tokens).
+
+
+
+%% X.682 constraint specification
+
+parse_GeneralConstraint(Tokens) ->
+ Flist = [fun parse_UserDefinedConstraint/1,
+ fun parse_TableConstraint/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ AsnErr = {asn1_error,_} ->
+ throw(AsnErr);
+ Result ->
+ Result
+ end.
+
+parse_UserDefinedConstraint([{'CONSTRAINED',_},{'BY',_},{'{',_},{'}',_}|Rest])->
+ {{constrained_by,[]},Rest};
+parse_UserDefinedConstraint([{'CONSTRAINED',_},
+ {'BY',_},
+ {'{',_}|Rest]) ->
+ {Param,Rest2} = parse_UserDefinedConstraintParameter(Rest),
+ case Rest2 of
+ [{'}',_}|Rest3] ->
+ {{constrained_by,Param},Rest3};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,'}']}})
+ end;
+parse_UserDefinedConstraint(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,
+ ['CONSTRAINED BY {}','CONSTRAINED BY {']]}}).
+
+parse_UserDefinedConstraintParameter(Tokens) ->
+ parse_UserDefinedConstraintParameter(Tokens,[]).
+parse_UserDefinedConstraintParameter(Tokens,Acc) ->
+ Flist = [fun parse_GovernorAndActualParameter/1,
+ fun parse_ActualParameter/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ AsnErr = {asn1_error,_} ->
+ throw(AsnErr);
+ {Result,Rest} ->
+ case Rest of
+ [{',',_}|_Rest2] ->
+ parse_UserDefinedConstraintParameter(Tokens,[Result|Acc]);
+ _ ->
+ {lists:reverse([Result|Acc]),Rest}
+ end
+ end.
+
+parse_GovernorAndActualParameter(Tokens) ->
+ {Governor,Rest} = parse_Governor(Tokens),
+ case Rest of
+ [{':',_}|Rest2] ->
+ {Params,Rest3} = parse_ActualParameter(Rest2),
+ {{'Governor_Params',Governor,Params},Rest3};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,':']}})
+ end.
+
+parse_TableConstraint(Tokens) ->
+ Flist = [fun parse_ComponentRelationConstraint/1,
+ fun parse_SimpleTableConstraint/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ AsnErr = {asn1_error,_} ->
+ throw(AsnErr);
+ Result ->
+ Result
+ end.
+
+parse_SimpleTableConstraint(Tokens) ->
+ {ObjectSet,Rest} = parse_ObjectSet(Tokens),
+ {{simpletable,ObjectSet},Rest}.
+
+parse_ComponentRelationConstraint([{'{',_}|Rest]) ->
+ {ObjectSet,Rest2} = parse_DefinedObjectSet(Rest),
+ case Rest2 of
+ [{'}',_},{'{',_}|Rest3] ->
+ {AtNot,Rest4} = parse_AtNotationList(Rest3,[]),
+ case Rest4 of
+ [{'}',_}|Rest5] ->
+ {{componentrelation,ObjectSet,AtNot},Rest5};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,'}']}})
+ end;
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,
+ 'ComponentRelationConstraint',ended,with,'}']}})
+%%% Other ->
+%%% throw(Other)
+ end;
+parse_ComponentRelationConstraint(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,'{']}}).
+
+parse_AtNotationList(Tokens,Acc) ->
+ {AtNot,Rest} = parse_AtNotation(Tokens),
+ case Rest of
+ [{',',_}|Rest2] ->
+ parse_AtNotationList(Rest2,[AtNot|Acc]);
+ _ ->
+ {lists:reverse([AtNot|Acc]),Rest}
+ end.
+
+parse_AtNotation([{'@',_},{'.',_}|Rest]) ->
+ {CIdList,Rest2} = parse_ComponentIdList(Rest),
+ {{innermost,CIdList},Rest2};
+parse_AtNotation([{'@',_}|Rest]) ->
+ {CIdList,Rest2} = parse_ComponentIdList(Rest),
+ {{outermost,CIdList},Rest2};
+parse_AtNotation(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,['@','@.']]}}).
+
+parse_ComponentIdList(Tokens) ->
+ parse_ComponentIdList(Tokens,[]).
+
+parse_ComponentIdList([Id = {identifier,_,_},{'.',_}|Rest],Acc) ->
+ parse_ComponentIdList(Rest,[identifier2Extvalueref(Id)|Acc]);
+parse_ComponentIdList([Id = {identifier,_,_}|Rest],Acc) ->
+ {lists:reverse([identifier2Extvalueref(Id)|Acc]),Rest};
+parse_ComponentIdList(Tokens,_) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,
+ [identifier,'identifier.']]}}).
+
+
+
+
+
+% X.683 Parameterization of ASN.1 specifications
+
+parse_Governor(Tokens) ->
+ Flist = [fun parse_Type/1,
+ fun parse_DefinedObjectClass/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ AsnErr = {asn1_error,_} ->
+ throw(AsnErr);
+ Result ->
+ Result
+ end.
+
+parse_ActualParameter(Tokens) ->
+ Flist = [fun parse_Type/1,
+ fun parse_Value/1,
+ fun parse_ValueSet/1,
+ fun parse_DefinedObjectClass/1,
+ fun parse_Object/1,
+ fun parse_ObjectSet/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ AsnErr = {asn1_error,_} ->
+ throw(AsnErr);
+ Result ->
+ Result
+ end.
+
+parse_ParameterizedAssignment(Tokens) ->
+ Flist = [fun parse_ParameterizedTypeAssignment/1,
+ fun parse_ParameterizedValueAssignment/1,
+ fun parse_ParameterizedValueSetTypeAssignment/1,
+ fun parse_ParameterizedObjectClassAssignment/1,
+ fun parse_ParameterizedObjectAssignment/1,
+ fun parse_ParameterizedObjectSetAssignment/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ AsnErr = {asn1_error,_} ->
+ throw(AsnErr);
+ AsnAssErr = {asn1_assignment_error,_} ->
+ throw(AsnAssErr);
+ Result ->
+ Result
+ end.
+
+parse_ParameterizedTypeAssignment([{typereference,L1,Name}|Rest]) ->
+ {ParameterList,Rest2} = parse_ParameterList(Rest),
+ case Rest2 of
+ [{'::=',_}|Rest3] ->
+ {Type,Rest4} = parse_Type(Rest3),
+ {#ptypedef{pos=L1,name=Name,args=ParameterList,typespec=Type},
+ Rest4};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,'::=']}})
+ end;
+parse_ParameterizedTypeAssignment(Tokens) ->
+ throw({asn1_assignment_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,
+ typereference]}}).
+
+parse_ParameterizedValueAssignment([{identifier,L1,Name}|Rest]) ->
+ {ParameterList,Rest2} = parse_ParameterList(Rest),
+ {Type,Rest3} = parse_Type(Rest2),
+ case Rest3 of
+ [{'::=',_}|Rest4] ->
+ {Value,Rest5} = parse_Value(Rest4),
+ {#pvaluedef{pos=L1,name=Name,args=ParameterList,type=Type,
+ value=Value},Rest5};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,'::=']}})
+ end;
+parse_ParameterizedValueAssignment(Tokens) ->
+ throw({asn1_assignment_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,identifier]}}).
+
+parse_ParameterizedValueSetTypeAssignment([{typereference,L1,Name}|Rest]) ->
+ {ParameterList,Rest2} = parse_ParameterList(Rest),
+ {Type,Rest3} = parse_Type(Rest2),
+ case Rest3 of
+ [{'::=',_}|Rest4] ->
+ {ValueSet,Rest5} = parse_ValueSet(Rest4),
+ {#pvaluesetdef{pos=L1,name=Name,args=ParameterList,
+ type=Type,valueset=ValueSet},Rest5};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,'::=']}})
+ end;
+parse_ParameterizedValueSetTypeAssignment(Tokens) ->
+ throw({asn1_assignment_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,
+ typereference]}}).
+
+parse_ParameterizedObjectClassAssignment([{typereference,L1,Name}|Rest]) ->
+ {ParameterList,Rest2} = parse_ParameterList(Rest),
+ case Rest2 of
+ [{'::=',_}|Rest3] ->
+ {Class,Rest4} = parse_ObjectClass(Rest3),
+ {#ptypedef{pos=L1,name=Name,args=ParameterList,typespec=Class},
+ Rest4};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,'::=']}})
+ end;
+parse_ParameterizedObjectClassAssignment(Tokens) ->
+ throw({asn1_assignment_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,
+ typereference]}}).
+
+parse_ParameterizedObjectAssignment([{identifier,L1,Name}|Rest]) ->
+ {ParameterList,Rest2} = parse_ParameterList(Rest),
+ {Class,Rest3} = parse_DefinedObjectClass(Rest2),
+ case Rest3 of
+ [{'::=',_}|Rest4] ->
+ {Object,Rest5} = parse_Object(Rest4),
+ {#pobjectdef{pos=L1,name=Name,args=ParameterList,
+ class=Class,def=Object},Rest5};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,'::=']}})
+%%% Other ->
+%%% throw(Other)
+ end;
+parse_ParameterizedObjectAssignment(Tokens) ->
+ throw({asn1_assignment_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,identifier]}}).
+
+parse_ParameterizedObjectSetAssignment([{typereference,L1,Name}|Rest]) ->
+ {ParameterList,Rest2} = parse_ParameterList(Rest),
+ {Class,Rest3} = parse_DefinedObjectClass(Rest2),
+ case Rest3 of
+ [{'::=',_}|Rest4] ->
+ {ObjectSet,Rest5} = parse_ObjectSet(Rest4),
+ {#pobjectsetdef{pos=L1,name=Name,args=ParameterList,
+ class=Class,def=ObjectSet},Rest5};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,'::=']}})
+%%% Other ->
+%%% throw(Other)
+ end;
+parse_ParameterizedObjectSetAssignment(Tokens) ->
+ throw({asn1_assignment_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,
+ typereference]}}).
+
+parse_ParameterList([{'{',_}|Rest]) ->
+ parse_ParameterList(Rest,[]);
+parse_ParameterList(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,'{']}}).
+
+parse_ParameterList(Tokens,Acc) ->
+ {Parameter,Rest} = parse_Parameter(Tokens),
+ case Rest of
+ [{',',_}|Rest2] ->
+ parse_ParameterList(Rest2,[Parameter|Acc]);
+ [{'}',_}|Rest3] ->
+ {lists:reverse([Parameter|Acc]),Rest3};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,[',','}']]}})
+ end.
+
+parse_Parameter(Tokens) ->
+ Flist = [fun parse_ParamGovAndRef/1,
+ fun parse_Reference/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ AsnErr = {asn1_error,_} ->
+ throw(AsnErr);
+ Result ->
+ Result
+ end.
+
+parse_ParamGovAndRef(Tokens) ->
+ {ParamGov,Rest} = parse_ParamGovernor(Tokens),
+ case Rest of
+ [{':',_}|Rest2] ->
+ {Ref,Rest3} = parse_Reference(Rest2),
+ {{ParamGov,Ref},Rest3};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,':']}})
+ end.
+
+parse_ParamGovernor(Tokens) ->
+ Flist = [fun parse_Governor/1,
+ fun parse_Reference/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ AsnErr = {asn1_error,_} ->
+ throw(AsnErr);
+ Result ->
+ Result
+ end.
+
+% parse_ParameterizedReference(Tokens) ->
+% {Ref,Rest} = parse_Reference(Tokens),
+% case Rest of
+% [{'{',_},{'}',_}|Rest2] ->
+% {{ptref,Ref},Rest2};
+% _ ->
+% {{ptref,Ref},Rest}
+% end.
+
+parse_SimpleDefinedType([{typereference,L1,ModuleName},{'.',_},
+ {typereference,_,TypeName}|Rest]) ->
+ {#'Externaltypereference'{pos=L1,module=ModuleName,
+ type=TypeName},Rest};
+parse_SimpleDefinedType([Tref={typereference,_,_}|Rest]) ->
+% {#'Externaltypereference'{pos=L2,module=get(asn1_module),
+% type=TypeName},Rest};
+ {tref2Exttref(Tref),Rest};
+parse_SimpleDefinedType(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,
+ [typereference,'typereference.typereference']]}}).
+
+parse_SimpleDefinedValue([{typereference,L1,ModuleName},{'.',_},
+ {identifier,_,Value}|Rest]) ->
+ {{simpledefinedvalue,#'Externalvaluereference'{pos=L1,module=ModuleName,
+ value=Value}},Rest};
+parse_SimpleDefinedValue([{identifier,L2,Value}|Rest]) ->
+ {{simpledefinedvalue,L2,Value},Rest};
+parse_SimpleDefinedValue(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,
+ ['typereference.identifier',identifier]]}}).
+
+parse_ParameterizedType(Tokens) ->
+ {Type,Rest} = parse_SimpleDefinedType(Tokens),
+ {Params,Rest2} = parse_ActualParameterList(Rest),
+ {{pt,Type,Params},Rest2}.
+
+parse_ParameterizedValue(Tokens) ->
+ {Value,Rest} = parse_SimpleDefinedValue(Tokens),
+ {Params,Rest2} = parse_ActualParameterList(Rest),
+ {{pv,Value,Params},Rest2}.
+
+parse_ParameterizedObjectClass(Tokens) ->
+ {Type,Rest} = parse_DefinedObjectClass(Tokens),
+ {Params,Rest2} = parse_ActualParameterList(Rest),
+ {{poc,Type,Params},Rest2}.
+
+parse_ParameterizedObjectSet(Tokens) ->
+ {ObjectSet,Rest} = parse_DefinedObjectSet(Tokens),
+ {Params,Rest2} = parse_ActualParameterList(Rest),
+ {{pos,ObjectSet,Params},Rest2}.
+
+parse_ParameterizedObject(Tokens) ->
+ {Object,Rest} = parse_DefinedObject(Tokens),
+ {Params,Rest2} = parse_ActualParameterList(Rest),
+ {{po,Object,Params},Rest2}.
+
+parse_ActualParameterList([{'{',_}|Rest]) ->
+ parse_ActualParameterList(Rest,[]);
+parse_ActualParameterList(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,'{']}}).
+
+parse_ActualParameterList(Tokens,Acc) ->
+ {Parameter,Rest} = parse_ActualParameter(Tokens),
+ case Rest of
+ [{',',_}|Rest2] ->
+ parse_ActualParameterList(Rest2,[Parameter|Acc]);
+ [{'}',_}|Rest3] ->
+ {lists:reverse([Parameter|Acc]),Rest3};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,[',','}']]}})
+%%% Other ->
+%%% throw(Other)
+ end.
+
+
+
+
+
+
+
+%-------------------------
+
+is_word(Token) ->
+ case not_allowed_word(Token) of
+ true -> false;
+ _ ->
+ if
+ atom(Token) ->
+ Item = atom_to_list(Token),
+ is_word(Item);
+ list(Token), length(Token) == 1 ->
+ check_one_char_word(Token);
+ list(Token) ->
+ [A|Rest] = Token,
+ case check_first(A) of
+ true ->
+ check_rest(Rest);
+ _ ->
+ false
+ end
+ end
+ end.
+
+not_allowed_word(Name) ->
+ lists:member(Name,["BIT",
+ "BOOLEAN",
+ "CHARACTER",
+ "CHOICE",
+ "EMBEDDED",
+ "END",
+ "ENUMERATED",
+ "EXTERNAL",
+ "FALSE",
+ "INSTANCE",
+ "INTEGER",
+ "INTERSECTION",
+ "MINUS-INFINITY",
+ "NULL",
+ "OBJECT",
+ "OCTET",
+ "PLUS-INFINITY",
+ "REAL",
+ "SEQUENCE",
+ "SET",
+ "TRUE",
+ "UNION"]).
+
+check_one_char_word([A]) when $A =< A, $Z >= A ->
+ true;
+check_one_char_word([_]) ->
+ false. %% unknown item in SyntaxList
+
+check_first(A) when $A =< A, $Z >= A ->
+ true;
+check_first(_) ->
+ false. %% unknown item in SyntaxList
+
+check_rest([R,R|_Rs]) when $- == R ->
+ false; %% two consecutive hyphens are not allowed in a word
+check_rest([R]) when $- == R ->
+ false; %% word cannot end with hyphen
+check_rest([R|Rs]) when $A=<R, $Z>=R; $-==R ->
+ check_rest(Rs);
+check_rest([]) ->
+ true;
+check_rest(_) ->
+ false.
+
+
+to_set(V) when list(V) ->
+ ordsets:list_to_set(V);
+to_set(V) ->
+ ordsets:list_to_set([V]).
+
+
+parse_AlternativeTypeLists(Tokens) ->
+ {AlternativeTypeList,Rest1} = parse_AlternativeTypeList(Tokens),
+ {ExtensionAndException,Rest2} =
+ case Rest1 of
+ [{',',_},{'...',L1},{'!',_}|Rest12] ->
+ {_,Rest13} = parse_ExceptionIdentification(Rest12),
+ %% Exception info is currently thrown away
+ {[#'EXTENSIONMARK'{pos=L1}],Rest13};
+ [{',',_},{'...',L1}|Rest12] ->
+ {[#'EXTENSIONMARK'{pos=L1}],Rest12};
+ _ ->
+ {[],Rest1}
+ end,
+ case ExtensionAndException of
+ [] ->
+ {AlternativeTypeList,Rest2};
+ _ ->
+ {ExtensionAddition,Rest3} =
+ case Rest2 of
+ [{',',_}|Rest23] ->
+ parse_ExtensionAdditionAlternativeList(Rest23);
+ _ ->
+ {[],Rest2}
+ end,
+ {OptionalExtensionMarker,Rest4} =
+ case Rest3 of
+ [{',',_},{'...',L3}|Rest31] ->
+ {[#'EXTENSIONMARK'{pos=L3}],Rest31};
+ _ ->
+ {[],Rest3}
+ end,
+ {AlternativeTypeList ++ ExtensionAndException ++ ExtensionAddition ++ OptionalExtensionMarker, Rest4}
+ end.
+
+
+parse_AlternativeTypeList(Tokens) ->
+ parse_AlternativeTypeList(Tokens,[]).
+
+parse_AlternativeTypeList(Tokens,Acc) ->
+ {NamedType,Rest} = parse_NamedType(Tokens),
+ case Rest of
+ [{',',_},Id = {identifier,_,_}|Rest2] ->
+ parse_AlternativeTypeList([Id|Rest2],[NamedType|Acc]);
+ _ ->
+ {lists:reverse([NamedType|Acc]),Rest}
+ end.
+
+
+
+parse_ExtensionAdditionAlternativeList(Tokens) ->
+ parse_ExtensionAdditionAlternativeList(Tokens,[]).
+
+parse_ExtensionAdditionAlternativeList(Tokens,Acc) ->
+ {Element,Rest0} =
+ case Tokens of
+ [{identifier,_,_}|_Rest] ->
+ parse_NamedType(Tokens);
+ [{'[[',_}|_] ->
+ parse_ExtensionAdditionAlternatives(Tokens)
+ end,
+ case Rest0 of
+ [{',',_}|Rest01] ->
+ parse_ExtensionAdditionAlternativeList(Rest01,[Element|Acc]);
+ _ ->
+ {lists:reverse([Element|Acc]),Rest0}
+ end.
+
+parse_ExtensionAdditionAlternatives([{'[[',_}|Rest]) ->
+ parse_ExtensionAdditionAlternatives(Rest,[]);
+parse_ExtensionAdditionAlternatives(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,'[[']}}).
+
+parse_ExtensionAdditionAlternatives([Id = {identifier,_,_}|Rest],Acc) ->
+ {NamedType, Rest2} = parse_NamedType([Id|Rest]),
+ case Rest2 of
+ [{',',_}|Rest21] ->
+ parse_ExtensionAdditionAlternatives(Rest21,[NamedType|Acc]);
+ [{']]',_}|Rest21] ->
+ {lists:reverse(Acc),Rest21};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
+ [got,get_token(hd(Rest2)),expected,[',',']]']]}})
+ end.
+
+parse_NamedType([{identifier,L1,Idname}|Rest]) ->
+ {Type,Rest2} = parse_Type(Rest),
+ {#'ComponentType'{pos=L1,name=Idname,typespec=Type,prop=mandatory},Rest2};
+parse_NamedType(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,identifier]}}).
+
+
+parse_ComponentTypeLists(Tokens) ->
+% Resulting tuple {ComponentTypeList,Rest1} is returned
+ case Tokens of
+ [{identifier,_,_}|_Rest0] ->
+ {Clist,Rest01} = parse_ComponentTypeList(Tokens),
+ case Rest01 of
+ [{',',_}|Rest02] ->
+ parse_ComponentTypeLists(Rest02,Clist);
+ _ ->
+ {Clist,Rest01}
+ end;
+ [{'COMPONENTS',_},{'OF',_}|_Rest] ->
+ {Clist,Rest01} = parse_ComponentTypeList(Tokens),
+ case Rest01 of
+ [{',',_}|Rest02] ->
+ parse_ComponentTypeLists(Rest02,Clist);
+ _ ->
+ {Clist,Rest01}
+ end;
+ _ ->
+ parse_ComponentTypeLists(Tokens,[])
+ end.
+
+parse_ComponentTypeLists([{'...',L1},{'!',_}|Rest],Clist1) ->
+ {_,Rest2} = parse_ExceptionIdentification(Rest),
+ %% Exception info is currently thrown away
+ parse_ComponentTypeLists2(Rest2,Clist1++[#'EXTENSIONMARK'{pos=L1}]);
+parse_ComponentTypeLists([{'...',L1}|Rest],Clist1) ->
+ parse_ComponentTypeLists2(Rest,Clist1++[#'EXTENSIONMARK'{pos=L1}]);
+parse_ComponentTypeLists(Tokens,Clist1) ->
+ {Clist1,Tokens}.
+
+
+parse_ComponentTypeLists2(Tokens,Clist1) ->
+ {ExtensionAddition,Rest2} =
+ case Tokens of
+ [{',',_}|Rest1] ->
+ parse_ExtensionAdditionList(Rest1);
+ _ ->
+ {[],Tokens}
+ end,
+ {OptionalExtensionMarker,Rest3} =
+ case Rest2 of
+ [{',',_},{'...',L2}|Rest21] ->
+ {[#'EXTENSIONMARK'{pos=L2}],Rest21};
+ _ ->
+ {[],Rest2}
+ end,
+ {RootComponentTypeList,Rest4} =
+ case Rest3 of
+ [{',',_}|Rest31] ->
+ parse_ComponentTypeList(Rest31);
+ _ ->
+ {[],Rest3}
+ end,
+ {Clist1 ++ ExtensionAddition ++ OptionalExtensionMarker ++ RootComponentTypeList, Rest4}.
+
+
+parse_ComponentTypeList(Tokens) ->
+ parse_ComponentTypeList(Tokens,[]).
+
+parse_ComponentTypeList(Tokens,Acc) ->
+ {ComponentType,Rest} = parse_ComponentType(Tokens),
+ case Rest of
+ [{',',_},Id = {identifier,_,_}|Rest2] ->
+ parse_ComponentTypeList([Id|Rest2],[ComponentType|Acc]);
+ [{',',_},C1={'COMPONENTS',_},C2={'OF',_}|Rest2] ->
+ parse_ComponentTypeList([C1,C2|Rest2],[ComponentType|Acc]);
+% _ ->
+% {lists:reverse([ComponentType|Acc]),Rest}
+ [{'}',_}|_] ->
+ {lists:reverse([ComponentType|Acc]),Rest};
+ [{',',_},{'...',_}|_] ->
+ {lists:reverse([ComponentType|Acc]),Rest};
+ _ ->
+ throw({asn1_error,
+ {get_line(hd(Tokens)),get(asn1_module),
+ [got,[get_token(hd(Rest)),get_token(hd(tl(Rest)))],
+ expected,['}',', identifier']]}})
+ end.
+
+
+parse_ExtensionAdditionList(Tokens) ->
+ parse_ExtensionAdditionList(Tokens,[]).
+
+parse_ExtensionAdditionList(Tokens,Acc) ->
+ {Element,Rest0} =
+ case Tokens of
+ [{identifier,_,_}|_Rest] ->
+ parse_ComponentType(Tokens);
+ [{'[[',_}|_] ->
+ parse_ExtensionAdditions(Tokens);
+ _ ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,
+ [identifier,'[[']]}})
+ end,
+ case Rest0 of
+ [{',',_}|Rest01] ->
+ parse_ExtensionAdditionList(Rest01,[Element|Acc]);
+ _ ->
+ {lists:reverse([Element|Acc]),Rest0}
+ end.
+
+parse_ExtensionAdditions([{'[[',_}|Rest]) ->
+ parse_ExtensionAdditions(Rest,[]);
+parse_ExtensionAdditions(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,'[[']}}).
+
+parse_ExtensionAdditions([Id = {identifier,_,_}|Rest],Acc) ->
+ {ComponentType, Rest2} = parse_ComponentType([Id|Rest]),
+ case Rest2 of
+ [{',',_}|Rest21] ->
+ parse_ExtensionAdditions(Rest21,[ComponentType|Acc]);
+ [{']]',_}|Rest21] ->
+ {lists:reverse(Acc),Rest21};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
+ [got,get_token(hd(Rest2)),expected,[',',']]']]}})
+ end;
+parse_ExtensionAdditions(Tokens,_) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,identifier]}}).
+
+parse_ComponentType([{'COMPONENTS',_},{'OF',_}|Rest]) ->
+ {Type,Rest2} = parse_Type(Rest),
+ {{'COMPONENTS OF',Type},Rest2};
+parse_ComponentType(Tokens) ->
+ {NamedType,Rest} = parse_NamedType(Tokens),
+ case Rest of
+ [{'OPTIONAL',_}|Rest2] ->
+ {NamedType#'ComponentType'{prop='OPTIONAL'},Rest2};
+ [{'DEFAULT',_}|Rest2] ->
+ {Value,Rest21} = parse_Value(Rest2),
+ {NamedType#'ComponentType'{prop={'DEFAULT',Value}},Rest21};
+ _ ->
+ {NamedType,Rest}
+ end.
+
+
+
+parse_SignedNumber([{number,_,Value}|Rest]) ->
+ {Value,Rest};
+parse_SignedNumber([{'-',_},{number,_,Value}|Rest]) ->
+ {-Value,Rest};
+parse_SignedNumber(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,
+ [number,'-number']]}}).
+
+parse_Enumerations(Tokens=[{identifier,_,_}|_Rest]) ->
+ parse_Enumerations(Tokens,[]);
+parse_Enumerations([H|_T]) ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,identifier]}}).
+
+parse_Enumerations(Tokens = [{identifier,_,_},{'(',_}|_Rest], Acc) ->
+ {NamedNumber,Rest2} = parse_NamedNumber(Tokens),
+ case Rest2 of
+ [{',',_}|Rest3] ->
+ parse_Enumerations(Rest3,[NamedNumber|Acc]);
+ _ ->
+ {lists:reverse([NamedNumber|Acc]),Rest2}
+ end;
+parse_Enumerations([{identifier,_,Id}|Rest], Acc) ->
+ case Rest of
+ [{',',_}|Rest2] ->
+ parse_Enumerations(Rest2,[Id|Acc]);
+ _ ->
+ {lists:reverse([Id|Acc]),Rest}
+ end;
+parse_Enumerations([{'...',_}|Rest], Acc) ->
+ case Rest of
+ [{',',_}|Rest2] ->
+ parse_Enumerations(Rest2,['EXTENSIONMARK'|Acc]);
+ _ ->
+ {lists:reverse(['EXTENSIONMARK'|Acc]),Rest}
+ end;
+parse_Enumerations([H|_T],_) ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,identifier]}}).
+
+parse_NamedNumberList(Tokens) ->
+ parse_NamedNumberList(Tokens,[]).
+
+parse_NamedNumberList(Tokens,Acc) ->
+ {NamedNum,Rest} = parse_NamedNumber(Tokens),
+ case Rest of
+ [{',',_}|Rest2] ->
+ parse_NamedNumberList(Rest2,[NamedNum|Acc]);
+ _ ->
+ {lists:reverse([NamedNum|Acc]),Rest}
+ end.
+
+parse_NamedNumber([{identifier,_,Name},{'(',_}|Rest]) ->
+ Flist = [fun parse_SignedNumber/1,
+ fun parse_DefinedValue/1],
+ case (catch parse_or(Rest,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ AsnErr = {asn1_error,_} ->
+ throw(AsnErr);
+ {NamedNum,[{')',_}|Rest2]} ->
+ {{'NamedNumber',Name,NamedNum},Rest2};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest)),get(asn1_module),
+ [got,get_token(hd(Rest)),expected,'NamedNumberList']}})
+ end;
+parse_NamedNumber(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,identifier]}}).
+
+
+parse_Tag([{'[',_}|Rest]) ->
+ {Class,Rest2} = parse_Class(Rest),
+ {ClassNumber,Rest3} =
+ case Rest2 of
+ [{number,_,Num}|Rest21] ->
+ {Num,Rest21};
+ _ ->
+ parse_DefinedValue(Rest2)
+ end,
+ case Rest3 of
+ [{']',_}|Rest4] ->
+ {#tag{class=Class,number=ClassNumber},Rest4};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest3)),get(asn1_module),
+ [got,get_token(hd(Rest3)),expected,']']}})
+ end;
+parse_Tag(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,'[']}}).
+
+parse_Class([{'UNIVERSAL',_}|Rest]) ->
+ {'UNIVERSAL',Rest};
+parse_Class([{'APPLICATION',_}|Rest]) ->
+ {'APPLICATION',Rest};
+parse_Class([{'PRIVATE',_}|Rest]) ->
+ {'PRIVATE',Rest};
+parse_Class(Tokens) ->
+ {'CONTEXT',Tokens}.
+
+parse_Value(Tokens) ->
+ Flist = [fun parse_BuiltinValue/1,
+ fun parse_ValueFromObject/1,
+ fun parse_DefinedValue/1],
+
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ AsnErr = {asn1_error,_} ->
+ throw(AsnErr);
+ Result ->
+ Result
+ end.
+
+parse_BuiltinValue([{bstring,_,Bstr}|Rest]) ->
+ {{bstring,Bstr},Rest};
+parse_BuiltinValue([{hstring,_,Hstr}|Rest]) ->
+ {{hstring,Hstr},Rest};
+parse_BuiltinValue([{'{',_},{'}',_}|Rest]) ->
+ {[],Rest};
+parse_BuiltinValue(Tokens = [{'{',_}|_Rest]) ->
+ Flist = [
+ fun parse_SequenceOfValue/1,
+ fun parse_SequenceValue/1,
+ fun parse_ObjectIdentifierValue/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ AsnErr = {asn1_error,_} ->
+ throw(AsnErr);
+ Result ->
+ Result
+ end;
+parse_BuiltinValue([{identifier,_,IdName},{':',_}|Rest]) ->
+ {Value,Rest2} = parse_Value(Rest),
+ {{'CHOICE',{IdName,Value}},Rest2};
+parse_BuiltinValue([{'NULL',_}|Rest]) ->
+ {'NULL',Rest};
+parse_BuiltinValue([{'TRUE',_}|Rest]) ->
+ {true,Rest};
+parse_BuiltinValue([{'FALSE',_}|Rest]) ->
+ {false,Rest};
+parse_BuiltinValue([{'PLUS-INFINITY',_}|Rest]) ->
+ {'PLUS-INFINITY',Rest};
+parse_BuiltinValue([{'MINUS-INFINITY',_}|Rest]) ->
+ {'MINUS-INFINITY',Rest};
+parse_BuiltinValue([{cstring,_,Cstr}|Rest]) ->
+ {Cstr,Rest};
+parse_BuiltinValue([{number,_,Num}|Rest]) ->
+ {Num,Rest};
+parse_BuiltinValue([{'-',_},{number,_,Num}|Rest]) ->
+ {- Num,Rest};
+parse_BuiltinValue(Tokens) ->
+ parse_ObjectClassFieldValue(Tokens).
+
+%% Externalvaluereference
+parse_DefinedValue([{typereference,L1,Tname},{'.',_},{identifier,_,Idname}|Rest]) ->
+ {#'Externalvaluereference'{pos=L1,module=Tname,value=Idname},Rest};
+%% valuereference
+parse_DefinedValue([Id = {identifier,_,_}|Rest]) ->
+ {identifier2Extvalueref(Id),Rest};
+%% ParameterizedValue
+parse_DefinedValue(Tokens) ->
+ parse_ParameterizedValue(Tokens).
+
+
+parse_SequenceValue([{'{',_}|Tokens]) ->
+ parse_SequenceValue(Tokens,[]);
+parse_SequenceValue(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,'{']}}).
+
+parse_SequenceValue([{identifier,_,IdName}|Rest],Acc) ->
+ {Value,Rest2} = parse_Value(Rest),
+ case Rest2 of
+ [{',',_}|Rest3] ->
+ parse_SequenceValue(Rest3,[{IdName,Value}|Acc]);
+ [{'}',_}|Rest3] ->
+ {lists:reverse([{IdName,Value}|Acc]),Rest3};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
+ [got,get_token(hd(Rest2)),expected,'}']}})
+ end;
+parse_SequenceValue(Tokens,_Acc) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,identifier]}}).
+
+parse_SequenceOfValue([{'{',_}|Tokens]) ->
+ parse_SequenceOfValue(Tokens,[]);
+parse_SequenceOfValue(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,'{']}}).
+
+parse_SequenceOfValue(Tokens,Acc) ->
+ {Value,Rest2} = parse_Value(Tokens),
+ case Rest2 of
+ [{',',_}|Rest3] ->
+ parse_SequenceOfValue(Rest3,[Value|Acc]);
+ [{'}',_}|Rest3] ->
+ {lists:reverse([Value|Acc]),Rest3};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
+ [got,get_token(hd(Rest2)),expected,'}']}})
+ end.
+
+parse_ValueSetTypeAssignment([{typereference,L1,Name}|Rest]) ->
+ {Type,Rest2} = parse_Type(Rest),
+ case Rest2 of
+ [{'::=',_}|Rest3] ->
+ {ValueSet,Rest4} = parse_ValueSet(Rest3),
+ {#valuedef{pos=L1,name=Name,type=Type,value=ValueSet},Rest4};
+ [H|_T] ->
+ throw({asn1_error,{get_line(L1),get(asn1_module),
+ [got,get_token(H),expected,'::=']}})
+ end;
+parse_ValueSetTypeAssignment(Tokens) ->
+ throw({asn1_assignment_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,
+ typereference]}}).
+
+parse_ValueSet([{'{',_}|Rest]) ->
+ {Elems,Rest2} = parse_ElementSetSpecs(Rest),
+ case Rest2 of
+ [{'}',_}|Rest3] ->
+ {{valueset,Elems},Rest3};
+ [H|_T] ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,'}']}})
+ end;
+parse_ValueSet(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,'{']}}).
+
+parse_ValueAssignment([{identifier,L1,IdName}|Rest]) ->
+ {Type,Rest2} = parse_Type(Rest),
+ case Rest2 of
+ [{'::=',_}|Rest3] ->
+ {Value,Rest4} = parse_Value(Rest3),
+ case lookahead_assignment(Rest4) of
+ ok ->
+ {#valuedef{pos=L1,name=IdName,type=Type,value=Value},Rest4};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
+ [got,get_token(hd(Rest2)),expected,'::=']}})
+ end;
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
+ [got,get_token(hd(Rest2)),expected,'::=']}})
+ end;
+parse_ValueAssignment(Tokens) ->
+ throw({asn1_assignment_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,identifier]}}).
+
+%% SizeConstraint
+parse_SubtypeElements([{'SIZE',_}|Tokens]) ->
+ {Constraint,Rest} = parse_Constraint(Tokens),
+ {{'SizeConstraint',Constraint#constraint.c},Rest};
+%% PermittedAlphabet
+parse_SubtypeElements([{'FROM',_}|Tokens]) ->
+ {Constraint,Rest} = parse_Constraint(Tokens),
+ {{'PermittedAlphabet',Constraint#constraint.c},Rest};
+%% InnerTypeConstraints
+parse_SubtypeElements([{'WITH',_},{'COMPONENT',_}|Tokens]) ->
+ {Constraint,Rest} = parse_Constraint(Tokens),
+ {{'WITH COMPONENT',Constraint},Rest};
+parse_SubtypeElements([{'WITH',_},{'COMPONENTS',_},{'{',_},{'...',_},{',',_}|Tokens]) ->
+ {Constraint,Rest} = parse_TypeConstraints(Tokens),
+ case Rest of
+ [{'}',_}|Rest2] ->
+ {{'WITH COMPONENTS',{'PartialSpecification',Constraint}},Rest2};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest)),get(asn1_module),
+ [got,get_token(hd(Rest)),expected,'}']}})
+ end;
+parse_SubtypeElements([{'WITH',_},{'COMPONENTS',_},{'{',_}|Tokens]) ->
+ {Constraint,Rest} = parse_TypeConstraints(Tokens),
+ case Rest of
+ [{'}',_}|Rest2] ->
+ {{'WITH COMPONENTS',{'FullSpecification',Constraint}},Rest2};
+ _ ->
+ throw({asn1_error,{get_line(hd(Rest)),get(asn1_module),
+ [got,get_token(hd(Rest)),expected,'}']}})
+ end;
+%% SingleValue
+%% ContainedSubtype
+%% ValueRange
+%% TypeConstraint
+parse_SubtypeElements(Tokens) ->
+ Flist = [fun parse_ContainedSubtype/1,
+ fun parse_Value/1,
+ fun([{'MIN',_}|T]) -> {'MIN',T} end,
+ fun parse_Type/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ {asn1_error,Reason} ->
+ throw(Reason);
+ Result = {Val,_} when record(Val,type) ->
+ Result;
+ {Lower,[{'..',_}|Rest]} ->
+ {Upper,Rest2} = parse_UpperEndpoint(Rest),
+ {{'ValueRange',{Lower,Upper}},Rest2};
+ {Lower,[{'<',_},{'..',_}|Rest]} ->
+ {Upper,Rest2} = parse_UpperEndpoint(Rest),
+ {{'ValueRange',{{gt,Lower},Upper}},Rest2};
+ {Res={'ContainedSubtype',_Type},Rest} ->
+ {Res,Rest};
+ {Value,Rest} ->
+ {{'SingleValue',Value},Rest}
+ end.
+
+parse_ContainedSubtype([{'INCLUDES',_}|Rest]) ->
+ {Type,Rest2} = parse_Type(Rest),
+ {{'ContainedSubtype',Type},Rest2};
+parse_ContainedSubtype(Tokens) ->
+ throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
+ [got,get_token(hd(Tokens)),expected,'INCLUDES']}}).
+%%parse_ContainedSubtype(Tokens) -> %this option is moved to parse_SubtypeElements
+%% parse_Type(Tokens).
+
+parse_UpperEndpoint([{'<',_}|Rest]) ->
+ parse_UpperEndpoint(lt,Rest);
+parse_UpperEndpoint(Tokens) ->
+ parse_UpperEndpoint(false,Tokens).
+
+parse_UpperEndpoint(Lt,Tokens) ->
+ Flist = [ fun([{'MAX',_}|T]) -> {'MAX',T} end,
+ fun parse_Value/1],
+ case (catch parse_or(Tokens,Flist)) of
+ {'EXIT',Reason} ->
+ exit(Reason);
+ AsnErr = {asn1_error,_} ->
+ throw(AsnErr);
+ {Value,Rest2} when Lt == lt ->
+ {{lt,Value},Rest2};
+ {Value,Rest2} ->
+ {Value,Rest2}
+ end.
+
+parse_TypeConstraints(Tokens) ->
+ parse_TypeConstraints(Tokens,[]).
+
+parse_TypeConstraints([{identifier,_,_}|Rest],Acc) ->
+ {ComponentConstraint,Rest2} = parse_ComponentConstraint(Rest),
+ case Rest2 of
+ [{',',_}|Rest3] ->
+ parse_TypeConstraints(Rest3,[ComponentConstraint|Acc]);
+ _ ->
+ {lists:reverse([ComponentConstraint|Acc]),Rest2}
+ end;
+parse_TypeConstraints([H|_T],_) ->
+ throw({asn1_error,{get_line(H),get(asn1_module),
+ [got,get_token(H),expected,identifier]}}).
+
+parse_ComponentConstraint(Tokens = [{'(',_}|_Rest]) ->
+ {ValueConstraint,Rest2} = parse_Constraint(Tokens),
+ {PresenceConstraint,Rest3} = parse_PresenceConstraint(Rest2),
+ {{ValueConstraint,PresenceConstraint},Rest3};
+parse_ComponentConstraint(Tokens) ->
+ {PresenceConstraint,Rest} = parse_PresenceConstraint(Tokens),
+ {{asn1_empty,PresenceConstraint},Rest}.
+
+parse_PresenceConstraint([{'PRESENT',_}|Rest]) ->
+ {'PRESENT',Rest};
+parse_PresenceConstraint([{'ABSENT',_}|Rest]) ->
+ {'ABSENT',Rest};
+parse_PresenceConstraint([{'OPTIONAL',_}|Rest]) ->
+ {'OPTIONAL',Rest};
+parse_PresenceConstraint(Tokens) ->
+ {asn1_empty,Tokens}.
+
+
+merge_constraints({Rlist,ExtList}) -> % extensionmarker in constraint
+ {merge_constraints(Rlist,[],[]),
+ merge_constraints(ExtList,[],[])};
+
+merge_constraints(Clist) ->
+ merge_constraints(Clist, [], []).
+
+merge_constraints([Ch|Ct],Cacc, Eacc) ->
+ NewEacc = case Ch#constraint.e of
+ undefined -> Eacc;
+ E -> [E|Eacc]
+ end,
+ merge_constraints(Ct,[fixup_constraint(Ch#constraint.c)|Cacc],NewEacc);
+
+merge_constraints([],Cacc,[]) ->
+%% lists:flatten(Cacc);
+ lists:reverse(Cacc);
+merge_constraints([],Cacc,Eacc) ->
+%% lists:flatten(Cacc) ++ [{'Errors',Eacc}].
+ lists:reverse(Cacc) ++ [{'Errors',Eacc}].
+
+fixup_constraint(C) ->
+ case C of
+ {'SingleValue',SubType} when element(1,SubType) == 'ContainedSubtype' ->
+ SubType;
+ {'SingleValue',V} when list(V) ->
+ C;
+ %% [C,{'ValueRange',{lists:min(V),lists:max(V)}}];
+ %% bug, turns wrong when an element in V is a reference to a defined value
+ {'PermittedAlphabet',{'SingleValue',V}} when list(V) ->
+ %%sort and remove duplicates
+ V2 = {'SingleValue',
+ ordsets:list_to_set(lists:flatten(V))},
+ {'PermittedAlphabet',V2};
+ {'PermittedAlphabet',{'SingleValue',V}} ->
+ V2 = {'SingleValue',[V]},
+ {'PermittedAlphabet',V2};
+ {'SizeConstraint',Sc} ->
+ {'SizeConstraint',fixup_size_constraint(Sc)};
+
+ List when list(List) -> %% In This case maybe a union or intersection
+ [fixup_constraint(Xc)||Xc <- List];
+ Other ->
+ Other
+ end.
+
+fixup_size_constraint({'ValueRange',{Lb,Ub}}) ->
+ {Lb,Ub};
+fixup_size_constraint({{'ValueRange',R},[]}) ->
+ {R,[]};
+fixup_size_constraint({[],{'ValueRange',R}}) ->
+ {[],R};
+fixup_size_constraint({{'ValueRange',R1},{'ValueRange',R2}}) ->
+ {R1,R2};
+fixup_size_constraint({'SingleValue',[Sv]}) ->
+ fixup_size_constraint({'SingleValue',Sv});
+fixup_size_constraint({'SingleValue',L}) when list(L) ->
+ ordsets:list_to_set(L);
+fixup_size_constraint({'SingleValue',L}) ->
+ {L,L};
+fixup_size_constraint({C1,C2}) ->
+ {fixup_size_constraint(C1), fixup_size_constraint(C2)}.
+
+get_line({_,Pos,Token}) when integer(Pos),atom(Token) ->
+ Pos;
+get_line({Token,Pos}) when integer(Pos),atom(Token) ->
+ Pos;
+get_line(_) ->
+ undefined.
+
+get_token({_,Pos,Token}) when integer(Pos),atom(Token) ->
+ Token;
+get_token({'$end',Pos}) when integer(Pos) ->
+ undefined;
+get_token({Token,Pos}) when integer(Pos),atom(Token) ->
+ Token;
+get_token(_) ->
+ undefined.
+
+prioritize_error(ErrList) ->
+ case lists:keymember(asn1_error,1,ErrList) of
+ false -> % only asn1_assignment_error -> take the last
+ lists:last(ErrList);
+ true -> % contains errors from deeper in a Type
+ NewErrList = [_Err={_,_}|_RestErr] =
+ lists:filter(fun({asn1_error,_})->true;(_)->false end,
+ ErrList),
+ SplitErrs =
+ lists:splitwith(fun({_,X})->
+ case element(1,X) of
+ Int when integer(Int) -> true;
+ _ -> false
+ end
+ end,
+ NewErrList),
+ case SplitErrs of
+ {[],UndefPosErrs} -> % if no error with Positon exists
+ lists:last(UndefPosErrs);
+ {IntPosErrs,_} ->
+ IntPosReasons = lists:map(fun(X)->element(2,X) end,IntPosErrs),
+ SortedReasons = lists:keysort(1,IntPosReasons),
+ {asn1_error,lists:last(SortedReasons)}
+ end
+ end.
+
+%% most_prio_error([H={_,Reason}|T],Atom,Err) when atom(Atom) ->
+%% most_prio_error(T,element(1,Reason),H);
+%% most_prio_error([H={_,Reason}|T],Greatest,Err) ->
+%% case element(1,Reason) of
+%% Pos when integer(Pos),Pos>Greatest ->
+%% most_prio_error(
+
+
+tref2Exttref(#typereference{pos=Pos,val=Name}) ->
+ #'Externaltypereference'{pos=Pos,
+ module=get(asn1_module),
+ type=Name}.
+
+tref2Exttref(Pos,Name) ->
+ #'Externaltypereference'{pos=Pos,
+ module=get(asn1_module),
+ type=Name}.
+
+identifier2Extvalueref(#identifier{pos=Pos,val=Name}) ->
+ #'Externalvaluereference'{pos=Pos,
+ module=get(asn1_module),
+ value=Name}.
+
+%% lookahead_assignment/1 checks that the next sequence of tokens
+%% in Token contain a valid assignment or the
+%% 'END' token. Otherwise an exception is thrown.
+lookahead_assignment([{'END',_}|_Rest]) ->
+ ok;
+lookahead_assignment(Tokens) ->
+ parse_Assignment(Tokens),
+ ok.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_pretty_format.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_pretty_format.erl
new file mode 100644
index 0000000000..99dd246d5c
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_pretty_format.erl
@@ -0,0 +1,197 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1ct_pretty_format.erl,v 1.1 2008/12/17 09:53:30 mikpe Exp $
+%%
+
+%% usage: pretty_format:term(Term) -> PNF list of characters
+%%
+%% Note: this is usually used in expressions like:
+%% io:format('~s\n',[pretty_format:term(Term)]).
+%%
+%% Uses the following simple heuristics
+%%
+%% 1) Simple tuples are printed across the page
+%% (Simple means *all* the elements are "flat")
+%% 2) The Complex tuple {Arg1, Arg2, Arg3,....} is printed thus:
+%% {Arg1,
+%% Arg2,
+%% Arg3,
+%% ...}
+%% 3) Lists are treated as for tuples
+%% 4) Lists of printable characters are treated as strings
+%%
+%% This method seems to work reasonable well for {Tag, ...} type
+%% data structures
+
+-module(asn1ct_pretty_format).
+
+-export([term/1]).
+
+-import(io_lib, [write/1, write_string/1]).
+
+term(Term) ->
+ element(2, term(Term, 0)).
+
+%%______________________________________________________________________
+%% pretty_format:term(Term, Indent} -> {Indent', Chars}
+%% Format <Term> -- use <Indent> to indent the *next* line
+%% Note: Indent' is a new indentaion level (sometimes printing <Term>
+%% the next line to need an "extra" indent!).
+
+term([], Indent) ->
+ {Indent, [$[,$]]};
+term(L, Indent) when is_list(L) ->
+ case is_string(L) of
+ true ->
+ {Indent, write_string(L)};
+ false ->
+ case complex_list(L) of
+ true ->
+ write_complex_list(L, Indent);
+ false ->
+ write_simple_list(L, Indent)
+ end
+ end;
+term(T, Indent) when is_tuple(T) ->
+ case complex_tuple(T) of
+ true ->
+ write_complex_tuple(T, Indent);
+ false ->
+ write_simple_tuple(T, Indent)
+ end;
+term(A, Indent) ->
+ {Indent, write(A)}.
+
+%%______________________________________________________________________
+%% write_simple_list([H|T], Indent) -> {Indent', Chars}
+
+write_simple_list([H|T], Indent) ->
+ {_, S1} = term(H, Indent),
+ {_, S2} = write_simple_list_tail(T, Indent),
+ {Indent, [$[,S1|S2]}.
+
+write_simple_list_tail([H|T], Indent) ->
+ {_, S1} = term(H, Indent),
+ {_, S2} = write_simple_list_tail(T, Indent),
+ {Indent, [$,,S1| S2]};
+write_simple_list_tail([], Indent) ->
+ {Indent, "]"};
+write_simple_list_tail(Other, Indent) ->
+ {_, S} = term(Other, Indent),
+ {Indent, [$|,S,$]]}.
+
+%%______________________________________________________________________
+%% write_complex_list([H|T], Indent) -> {Indent', Chars}
+
+write_complex_list([H|T], Indent) ->
+ {I1, S1} = term(H, Indent+1),
+ {_, S2} = write_complex_list_tail(T, I1),
+ {Indent, [$[,S1|S2]}.
+
+write_complex_list_tail([H|T], Indent) ->
+ {I1, S1} = term(H, Indent),
+ {_, S2} = write_complex_list_tail(T, I1),
+ {Indent, [$,,nl_indent(Indent),S1,S2]};
+write_complex_list_tail([], Indent) ->
+ {Indent, "]"};
+write_complex_list_tail(Other, Indent) ->$,,
+ {_, S} = term(Other, Indent),
+ {Indent, [$|,S,$]]}.
+
+%%______________________________________________________________________
+%% complex_list(List) -> true | false
+%% returns true if the list is complex otherwise false
+
+complex_list([]) ->
+ false;
+complex_list([H|T]) when is_number(H); is_atom(H) ->
+ complex_list(T);
+complex_list([H|T]) ->
+ case is_string(H) of
+ true ->
+ complex_list(T);
+ false ->
+ true
+ end;
+complex_list(_) -> true.
+
+%%______________________________________________________________________
+%% complex_tuple(Tuple) -> true | false
+%% returns true if the tuple is complex otherwise false
+
+complex_tuple(T) ->
+ complex_list(tuple_to_list(T)).
+
+%%______________________________________________________________________
+%% write_simple_tuple(Tuple, Indent} -> {Indent', Chars}
+
+write_simple_tuple({}, Indent) ->
+ {Indent, "{}"};
+write_simple_tuple(Tuple, Indent) ->
+ {_, S} = write_simple_tuple_args(tuple_to_list(Tuple), Indent),
+ {Indent, [${, S, $}]}.
+
+write_simple_tuple_args([X], Indent) ->
+ term(X, Indent);
+write_simple_tuple_args([H|T], Indent) ->
+ {_, SH} = term(H, Indent),
+ {_, ST} = write_simple_tuple_args(T, Indent),
+ {Indent, [SH, $,, ST]}.
+
+%%______________________________________________________________________
+%% write_complex_tuple(Tuple, Indent} -> {Indent', Chars}
+
+write_complex_tuple(Tuple, Indent) ->
+ [H|T] = tuple_to_list(Tuple),
+ {I1, SH} = term(H, Indent+2),
+ {_, ST} = write_complex_tuple_args(T, I1),
+ {Indent, [${, SH, ST, $}]}.
+
+write_complex_tuple_args([X], Indent) ->
+ {_, S} = term(X, Indent),
+ {Indent, [$,, nl_indent(Indent), S]};
+write_complex_tuple_args([H|T], Indent) ->
+ {I1, SH} = term(H, Indent),
+ {_, ST} = write_complex_tuple_args(T, I1),
+ {Indent, [$,, nl_indent(Indent) , SH, ST]};
+write_complex_tuple_args([], Indent) ->
+ {Indent, []}.
+
+%%______________________________________________________________________
+%% utilities
+
+nl_indent(I) when I >= 0 ->
+ ["\n"|indent(I)];
+nl_indent(_) ->
+ [$\s].
+
+indent(I) when I >= 8 ->
+ [$\t|indent(I-8)];
+indent(I) when I > 0 ->
+ [$\s|indent(I-1)];
+indent(_) ->
+ [].
+
+is_string([9|T]) ->
+ is_string(T);
+is_string([10|T]) ->
+ is_string(T);
+is_string([H|T]) when H >31, H < 127 ->
+ is_string(T);
+is_string([]) ->
+ true;
+is_string(_) ->
+ false.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_tok.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_tok.erl
new file mode 100644
index 0000000000..b5ccc4a5d2
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_tok.erl
@@ -0,0 +1,351 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1ct_tok.erl,v 1.1 2008/12/17 09:53:30 mikpe Exp $
+%%
+-module(asn1ct_tok).
+
+%% Tokenize ASN.1 code (input to parser generated with yecc)
+
+-export([get_name/2,tokenise/2, file/1]).
+
+
+file(File) ->
+ case file:open(File, [read]) of
+ {error, Reason} ->
+ {error,{File,file:format_error(Reason)}};
+ {ok,Stream} ->
+ process0(Stream)
+ end.
+
+process0(Stream) ->
+ process(Stream,0,[]).
+
+process(Stream,Lno,R) ->
+ process(io:get_line(Stream, ''), Stream,Lno+1,R).
+
+process(eof, Stream,Lno,R) ->
+ file:close(Stream),
+ lists:flatten(lists:reverse([{'$end',Lno}|R]));
+
+
+process(L, Stream,Lno,R) when list(L) ->
+ %%io:format('read:~s',[L]),
+ case catch tokenise(L,Lno) of
+ {'ERR',Reason} ->
+ io:format("Tokeniser error on line: ~w ~w~n",[Lno,Reason]),
+ exit(0);
+ T ->
+ %%io:format('toks:~w~n',[T]),
+ process(Stream,Lno,[T|R])
+ end.
+
+
+tokenise([H|T],Lno) when $a =< H , H =< $z ->
+ {X, T1} = get_name(T, [H]),
+ [{identifier,Lno, list_to_atom(X)}|tokenise(T1,Lno)];
+
+tokenise([$&,H|T],Lno) when $A =< H , H =< $Z ->
+ {Y, T1} = get_name(T, [H]),
+ X = list_to_atom(Y),
+ [{typefieldreference, Lno, X} | tokenise(T1, Lno)];
+
+tokenise([$&,H|T],Lno) when $a =< H , H =< $z ->
+ {Y, T1} = get_name(T, [H]),
+ X = list_to_atom(Y),
+ [{valuefieldreference, Lno, X} | tokenise(T1, Lno)];
+
+tokenise([H|T],Lno) when $A =< H , H =< $Z ->
+ {Y, T1} = get_name(T, [H]),
+ X = list_to_atom(Y),
+ case reserved_word(X) of
+ true ->
+ [{X,Lno}|tokenise(T1,Lno)];
+ false ->
+ [{typereference,Lno,X}|tokenise(T1,Lno)];
+ rstrtype ->
+ [{restrictedcharacterstringtype,Lno,X}|tokenise(T1,Lno)]
+ end;
+
+tokenise([$-,H|T],Lno) when $0 =< H , H =< $9 ->
+ {X, T1} = get_number(T, [H]),
+ [{number,Lno,-1 * list_to_integer(X)}|tokenise(T1,Lno)];
+
+tokenise([H|T],Lno) when $0 =< H , H =< $9 ->
+ {X, T1} = get_number(T, [H]),
+ [{number,Lno,list_to_integer(X)}|tokenise(T1,Lno)];
+
+tokenise([$-,$-|T],Lno) ->
+ tokenise(skip_comment(T),Lno);
+tokenise([$:,$:,$=|T],Lno) ->
+ [{'::=',Lno}|tokenise(T,Lno)];
+
+tokenise([$'|T],Lno) ->
+ case catch collect_quoted(T,Lno,[]) of
+ {'ERR',_} ->
+ throw({'ERR','bad_quote'});
+ {Thing, T1} ->
+ [Thing|tokenise(T1,Lno)]
+ end;
+
+tokenise([$"|T],Lno) ->
+ collect_string(T,Lno);
+
+tokenise([${|T],Lno) ->
+ [{'{',Lno}|tokenise(T,Lno)];
+
+tokenise([$}|T],Lno) ->
+ [{'}',Lno}|tokenise(T,Lno)];
+
+tokenise([$]|T],Lno) ->
+ [{']',Lno}|tokenise(T,Lno)];
+
+tokenise([$[|T],Lno) ->
+ [{'[',Lno}|tokenise(T,Lno)];
+
+tokenise([$,|T],Lno) ->
+ [{',',Lno}|tokenise(T,Lno)];
+
+tokenise([$(|T],Lno) ->
+ [{'(',Lno}|tokenise(T,Lno)];
+tokenise([$)|T],Lno) ->
+ [{')',Lno}|tokenise(T,Lno)];
+
+tokenise([$.,$.,$.|T],Lno) ->
+ [{'...',Lno}|tokenise(T,Lno)];
+
+tokenise([$.,$.|T],Lno) ->
+ [{'..',Lno}|tokenise(T,Lno)];
+
+tokenise([$.|T],Lno) ->
+ [{'.',Lno}|tokenise(T,Lno)];
+tokenise([$^|T],Lno) ->
+ [{'^',Lno}|tokenise(T,Lno)];
+tokenise([$!|T],Lno) ->
+ [{'!',Lno}|tokenise(T,Lno)];
+tokenise([$||T],Lno) ->
+ [{'|',Lno}|tokenise(T,Lno)];
+
+
+tokenise([H|T],Lno) ->
+ case white_space(H) of
+ true ->
+ tokenise(T,Lno);
+ false ->
+ [{list_to_atom([H]),Lno}|tokenise(T,Lno)]
+ end;
+tokenise([],_) ->
+ [].
+
+
+collect_string(L,Lno) ->
+ collect_string(L,Lno,[]).
+
+collect_string([],_,_) ->
+ throw({'ERR','bad_quote found eof'});
+
+collect_string([H|T],Lno,Str) ->
+ case H of
+ $" ->
+ [{cstring,1,lists:reverse(Str)}|tokenise(T,Lno)];
+ Ch ->
+ collect_string(T,Lno,[Ch|Str])
+ end.
+
+
+
+% <name> is letters digits hyphens
+% hypen is not the last character. Hypen hyphen is NOT allowed
+%
+% <identifier> ::= <lowercase> <name>
+
+get_name([$-,Char|T], L) ->
+ case isalnum(Char) of
+ true ->
+ get_name(T,[Char,$-|L]);
+ false ->
+ {lists:reverse(L),[$-,Char|T]}
+ end;
+get_name([$-|T], L) ->
+ {lists:reverse(L),[$-|T]};
+get_name([Char|T], L) ->
+ case isalnum(Char) of
+ true ->
+ get_name(T,[Char|L]);
+ false ->
+ {lists:reverse(L),[Char|T]}
+ end;
+get_name([], L) ->
+ {lists:reverse(L), []}.
+
+
+isalnum(H) when $A =< H , H =< $Z ->
+ true;
+isalnum(H) when $a =< H , H =< $z ->
+ true;
+isalnum(H) when $0 =< H , H =< $9 ->
+ true;
+isalnum(_) ->
+ false.
+
+isdigit(H) when $0 =< H , H =< $9 ->
+ true;
+isdigit(_) ->
+ false.
+
+white_space(9) -> true;
+white_space(10) -> true;
+white_space(13) -> true;
+white_space(32) -> true;
+white_space(_) -> false.
+
+
+get_number([H|T], L) ->
+ case isdigit(H) of
+ true ->
+ get_number(T, [H|L]);
+ false ->
+ {lists:reverse(L), [H|T]}
+ end;
+get_number([], L) ->
+ {lists:reverse(L), []}.
+
+skip_comment([]) ->
+ [];
+skip_comment([$-,$-|T]) ->
+ T;
+skip_comment([_|T]) ->
+ skip_comment(T).
+
+collect_quoted([$',$B|T],Lno, L) ->
+ case check_bin(L) of
+ true ->
+ {{bstring,Lno, lists:reverse(L)}, T};
+ false ->
+ throw({'ERR',{invalid_binary_number, lists:reverse(L)}})
+ end;
+collect_quoted([$',$H|T],Lno, L) ->
+ case check_hex(L) of
+ true ->
+ {{hstring,Lno, lists:reverse(L)}, T};
+ false ->
+ throw({'ERR',{invalid_binary_number, lists:reverse(L)}})
+ end;
+collect_quoted([H|T], Lno, L) ->
+ collect_quoted(T, Lno,[H|L]);
+collect_quoted([], _, _) -> % This should be allowed FIX later
+ throw({'ERR',{eol_in_token}}).
+
+check_bin([$0|T]) ->
+ check_bin(T);
+check_bin([$1|T]) ->
+ check_bin(T);
+check_bin([]) ->
+ true;
+check_bin(_) ->
+ false.
+
+check_hex([H|T]) when $0 =< H , H =< $9 ->
+ check_hex(T);
+check_hex([H|T]) when $A =< H , H =< $F ->
+ check_hex(T);
+check_hex([]) ->
+ true;
+check_hex(_) ->
+ false.
+
+
+%% reserved_word(A) -> true|false|rstrtype
+%% A = atom()
+%% returns true if A is a reserved ASN.1 word
+%% returns false if A is not a reserved word
+%% returns rstrtype if A is a reserved word in the group
+%% RestrictedCharacterStringType
+reserved_word('ABSENT') -> true;
+%reserved_word('ABSTRACT-SYNTAX') -> true; % impl as predef item
+reserved_word('ALL') -> true;
+reserved_word('ANY') -> true;
+reserved_word('APPLICATION') -> true;
+reserved_word('AUTOMATIC') -> true;
+reserved_word('BEGIN') -> true;
+reserved_word('BIT') -> true;
+reserved_word('BMPString') -> rstrtype;
+reserved_word('BOOLEAN') -> true;
+reserved_word('BY') -> true;
+reserved_word('CHARACTER') -> true;
+reserved_word('CHOICE') -> true;
+reserved_word('CLASS') -> true;
+reserved_word('COMPONENT') -> true;
+reserved_word('COMPONENTS') -> true;
+reserved_word('CONSTRAINED') -> true;
+reserved_word('DEFAULT') -> true;
+reserved_word('DEFINED') -> true;
+reserved_word('DEFINITIONS') -> true;
+reserved_word('EMBEDDED') -> true;
+reserved_word('END') -> true;
+reserved_word('ENUMERATED') -> true;
+reserved_word('EXCEPT') -> true;
+reserved_word('EXPLICIT') -> true;
+reserved_word('EXPORTS') -> true;
+reserved_word('EXTERNAL') -> true;
+reserved_word('FALSE') -> true;
+reserved_word('FROM') -> true;
+reserved_word('GeneralizedTime') -> true;
+reserved_word('GeneralString') -> rstrtype;
+reserved_word('GraphicString') -> rstrtype;
+reserved_word('IA5String') -> rstrtype;
+% reserved_word('TYPE-IDENTIFIER') -> true; % impl as predef item
+reserved_word('IDENTIFIER') -> true;
+reserved_word('IMPLICIT') -> true;
+reserved_word('IMPORTS') -> true;
+reserved_word('INCLUDES') -> true;
+reserved_word('INSTANCE') -> true;
+reserved_word('INTEGER') -> true;
+reserved_word('INTERSECTION') -> true;
+reserved_word('ISO646String') -> rstrtype;
+reserved_word('MAX') -> true;
+reserved_word('MIN') -> true;
+reserved_word('MINUS-INFINITY') -> true;
+reserved_word('NULL') -> true;
+reserved_word('NumericString') -> rstrtype;
+reserved_word('OBJECT') -> true;
+reserved_word('ObjectDescriptor') -> true;
+reserved_word('OCTET') -> true;
+reserved_word('OF') -> true;
+reserved_word('OPTIONAL') -> true;
+reserved_word('PDV') -> true;
+reserved_word('PLUS-INFINITY') -> true;
+reserved_word('PRESENT') -> true;
+reserved_word('PrintableString') -> rstrtype;
+reserved_word('PRIVATE') -> true;
+reserved_word('REAL') -> true;
+reserved_word('SEQUENCE') -> true;
+reserved_word('SET') -> true;
+reserved_word('SIZE') -> true;
+reserved_word('STRING') -> true;
+reserved_word('SYNTAX') -> true;
+reserved_word('T61String') -> rstrtype;
+reserved_word('TAGS') -> true;
+reserved_word('TeletexString') -> rstrtype;
+reserved_word('TRUE') -> true;
+reserved_word('UNION') -> true;
+reserved_word('UNIQUE') -> true;
+reserved_word('UNIVERSAL') -> true;
+reserved_word('UniversalString') -> rstrtype;
+reserved_word('UTCTime') -> true;
+reserved_word('VideotexString') -> rstrtype;
+reserved_word('VisibleString') -> rstrtype;
+reserved_word('WITH') -> true;
+reserved_word(_) -> false.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_value.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_value.erl
new file mode 100644
index 0000000000..3d366a1a27
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1ct_value.erl
@@ -0,0 +1,330 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1ct_value.erl,v 1.1 2008/12/17 09:53:30 mikpe Exp $
+%%
+-module(asn1ct_value).
+
+%% Generate Erlang values for ASN.1 types.
+%% The value is randomized within it's constraints
+
+-include("asn1_records.hrl").
+%-compile(export_all).
+
+-export([get_type/3]).
+
+
+
+%% Generate examples of values ******************************
+%%****************************************x
+
+
+get_type(M,Typename,Tellname) ->
+ case asn1_db:dbget(M,Typename) of
+ undefined ->
+ {asn1_error,{not_found,{M,Typename}}};
+ Tdef when record(Tdef,typedef) ->
+ Type = Tdef#typedef.typespec,
+ get_type(M,[Typename],Type,Tellname);
+ Err ->
+ {asn1_error,{other,Err}}
+ end.
+
+get_type(M,Typename,Type,Tellname) when record(Type,type) ->
+ InnerType = get_inner(Type#type.def),
+ case asn1ct_gen:type(InnerType) of
+ #'Externaltypereference'{module=Emod,type=Etype} ->
+ get_type(Emod,Etype,Tellname);
+ {_,user} ->
+ case Tellname of
+ yes -> {Typename,get_type(M,InnerType,no)};
+ no -> get_type(M,InnerType,no)
+ end;
+ {notype,_} ->
+ true;
+ {primitive,bif} ->
+ get_type_prim(Type);
+ 'ASN1_OPEN_TYPE' ->
+ case Type#type.constraint of
+ [#'Externaltypereference'{type=TrefConstraint}] ->
+ get_type(M,TrefConstraint,no);
+ _ ->
+ "open_type"
+ end;
+ {constructed,bif} ->
+ get_type_constructed(M,Typename,InnerType,Type)
+ end;
+get_type(M,Typename,#'ComponentType'{name = Name,typespec = Type},_) ->
+ get_type(M,[Name|Typename],Type,no);
+get_type(_,_,_,_) -> % 'EXTENSIONMARK'
+ undefined.
+
+get_inner(A) when atom(A) -> A;
+get_inner(Ext) when record(Ext,'Externaltypereference') -> Ext;
+get_inner({typereference,_Pos,Name}) -> Name;
+get_inner(T) when tuple(T) ->
+ case asn1ct_gen:get_inner(T) of
+ {fixedtypevaluefield,_,Type} ->
+ Type#type.def;
+ {typefield,_FieldName} ->
+ 'ASN1_OPEN_TYPE';
+ Other ->
+ Other
+ end.
+%%get_inner(T) when tuple(T) -> element(1,T).
+
+
+
+get_type_constructed(M,Typename,InnerType,D) when record(D,type) ->
+ case InnerType of
+ 'SET' ->
+ get_sequence(M,Typename,D);
+ 'SEQUENCE' ->
+ get_sequence(M,Typename,D);
+ 'CHOICE' ->
+ get_choice(M,Typename,D);
+ 'SEQUENCE OF' ->
+ {_,Type} = D#type.def,
+ NameSuffix = asn1ct_gen:constructed_suffix(InnerType,Type#type.def),
+ get_sequence_of(M,Typename,D,NameSuffix);
+ 'SET OF' ->
+ {_,Type} = D#type.def,
+ NameSuffix = asn1ct_gen:constructed_suffix(InnerType,Type#type.def),
+ get_sequence_of(M,Typename,D,NameSuffix);
+ _ ->
+ exit({nyi,InnerType})
+ end.
+
+get_sequence(M,Typename,Type) ->
+ {_SEQorSET,CompList} =
+ case Type#type.def of
+ #'SEQUENCE'{components=Cl} -> {'SEQUENCE',Cl};
+ #'SET'{components=Cl} -> {'SET',Cl}
+ end,
+ case get_components(M,Typename,CompList) of
+ [] ->
+ {list_to_atom(asn1ct_gen:list2rname(Typename))};
+ C ->
+ list_to_tuple([list_to_atom(asn1ct_gen:list2rname(Typename))|C])
+ end.
+
+get_components(M,Typename,{Root,Ext}) ->
+ get_components(M,Typename,Root++Ext);
+
+%% Should enhance this *** HERE *** with proper handling of extensions
+
+get_components(M,Typename,[H|T]) ->
+ [get_type(M,Typename,H,no)|
+ get_components(M,Typename,T)];
+get_components(_,_,[]) ->
+ [].
+
+get_choice(M,Typename,Type) ->
+ {'CHOICE',TCompList} = Type#type.def,
+ case TCompList of
+ [] ->
+ {asn1_EMPTY,asn1_EMPTY};
+ {CompList,ExtList} -> % Should be enhanced to handle extensions too
+ CList = CompList ++ ExtList,
+ C = lists:nth(random(length(CList)),CList),
+ {C#'ComponentType'.name,get_type(M,Typename,C,no)};
+ CompList when list(CompList) ->
+ C = lists:nth(random(length(CompList)),CompList),
+ {C#'ComponentType'.name,get_type(M,Typename,C,no)}
+ end.
+
+get_sequence_of(M,Typename,Type,TypeSuffix) ->
+ %% should generate length according to constraints later
+ {_,Oftype} = Type#type.def,
+ C = Type#type.constraint,
+ S = size_random(C),
+ NewTypeName = [TypeSuffix|Typename],
+ gen_list(M,NewTypeName,Oftype,no,S).
+
+gen_list(_,_,_,_,0) ->
+ [];
+gen_list(M,Typename,Oftype,Tellname,N) ->
+ [get_type(M,Typename,Oftype,no)|gen_list(M,Typename,Oftype,Tellname,N-1)].
+
+get_type_prim(D) ->
+ C = D#type.constraint,
+ case D#type.def of
+ 'INTEGER' ->
+ i_random(C);
+ {'INTEGER',NamedNumberList} ->
+ NN = [X||{X,_} <- NamedNumberList],
+ case NN of
+ [] ->
+ i_random(C);
+ _ ->
+ lists:nth(random(length(NN)),NN)
+ end;
+ Enum when tuple(Enum),element(1,Enum)=='ENUMERATED' ->
+ NamedNumberList =
+ case Enum of
+ {_,_,NNL} -> NNL;
+ {_,NNL} -> NNL
+ end,
+ NNew=
+ case NamedNumberList of
+ {N1,N2} ->
+ N1 ++ N2;
+ _->
+ NamedNumberList
+ end,
+ NN = [X||{X,_} <- NNew],
+ case NN of
+ [] ->
+ asn1_EMPTY;
+ _ ->
+ lists:nth(random(length(NN)),NN)
+ end;
+ {'BIT STRING',NamedNumberList} ->
+%% io:format("get_type_prim 1: ~w~n",[NamedNumberList]),
+ NN = [X||{X,_} <- NamedNumberList],
+ case NN of
+ [] ->
+ Bl1 =lists:reverse(adjust_list(size_random(C),[1,0,1,1])),
+ lists:reverse(lists:dropwhile(fun(0)->true;(1)->false end,Bl1));
+ _ ->
+%% io:format("get_type_prim 2: ~w~n",[NN]),
+ [lists:nth(random(length(NN)),NN)]
+ end;
+ 'ANY' ->
+ exit({asn1_error,nyi,'ANY'});
+ 'NULL' ->
+ 'NULL';
+ 'OBJECT IDENTIFIER' ->
+ Len = random(3),
+ Olist = [(random(1000)-1)||_X <-lists:seq(1,Len)],
+ list_to_tuple([random(3)-1,random(40)-1|Olist]);
+ 'ObjectDescriptor' ->
+ object_descriptor_nyi;
+ 'BOOLEAN' ->
+ true;
+ 'OCTET STRING' ->
+ adjust_list(size_random(C),c_string(C,"OCTET STRING"));
+ 'NumericString' ->
+ adjust_list(size_random(C),c_string(C,"0123456789"));
+ 'TeletexString' ->
+ adjust_list(size_random(C),c_string(C,"TeletexString"));
+ 'VideotexString' ->
+ adjust_list(size_random(C),c_string(C,"VideotexString"));
+ 'UTCTime' ->
+ "97100211-0500";
+ 'GeneralizedTime' ->
+ "19971002103130.5";
+ 'GraphicString' ->
+ adjust_list(size_random(C),c_string(C,"GraphicString"));
+ 'VisibleString' ->
+ adjust_list(size_random(C),c_string(C,"VisibleString"));
+ 'GeneralString' ->
+ adjust_list(size_random(C),c_string(C,"GeneralString"));
+ 'PrintableString' ->
+ adjust_list(size_random(C),c_string(C,"PrintableString"));
+ 'IA5String' ->
+ adjust_list(size_random(C),c_string(C,"IA5String"));
+ 'BMPString' ->
+ adjust_list(size_random(C),c_string(C,"BMPString"));
+ 'UniversalString' ->
+ adjust_list(size_random(C),c_string(C,"UniversalString"));
+ XX ->
+ exit({asn1_error,nyi,XX})
+ end.
+
+c_string(undefined,Default) ->
+ Default;
+c_string(C,Default) ->
+ case get_constraint(C,'PermittedAlphabet') of
+ {'SingleValue',Sv} when list(Sv) ->
+ Sv;
+ {'SingleValue',V} when integer(V) ->
+ [V];
+ no ->
+ Default
+ end.
+
+random(Upper) ->
+ {A1,A2,A3} = erlang:now(),
+ random:seed(A1,A2,A3),
+ random:uniform(Upper).
+
+size_random(C) ->
+ case get_constraint(C,'SizeConstraint') of
+ no ->
+ c_random({0,5},no);
+ {Lb,Ub} when Ub-Lb =< 4 ->
+ c_random({Lb,Ub},no);
+ {Lb,_} ->
+ c_random({Lb,Lb+4},no);
+ Sv ->
+ c_random(no,Sv)
+ end.
+
+i_random(C) ->
+ c_random(get_constraint(C,'ValueRange'),get_constraint(C,'SingleValue')).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% c_random(Range,SingleValue)
+%% only called from other X_random functions
+
+c_random(VRange,Single) ->
+ case {VRange,Single} of
+ {no,no} ->
+ random(16#fffffff) - (16#fffffff bsr 1);
+ {R,no} ->
+ case R of
+ {Lb,Ub} when integer(Lb),integer(Ub) ->
+ Range = Ub - Lb +1,
+ Lb + (random(Range)-1);
+ {Lb,'MAX'} ->
+ Lb + random(16#fffffff)-1;
+ {'MIN',Ub} ->
+ Ub - random(16#fffffff)-1;
+ {A,{'ASN1_OK',B}} ->
+ Range = B - A +1,
+ A + (random(Range)-1)
+ end;
+ {_,S} when integer(S) ->
+ S;
+ {_,S} when list(S) ->
+ lists:nth(random(length(S)),S)
+%% {S1,S2} ->
+%% io:format("asn1ct_value: hejsan hoppsan~n");
+%% _ ->
+%% io:format("asn1ct_value: hejsan hoppsan 2~n")
+%% io:format("asn1ct_value: c_random/2: S1 = ~w~n"
+%% "S2 = ~w,~n",[S1,S2])
+%% exit(self(),goodbye)
+ end.
+
+adjust_list(Len,Orig) ->
+ adjust_list1(Len,Orig,Orig,[]).
+
+adjust_list1(0,_Orig,[_Oh|_Ot],Acc) ->
+ lists:reverse(Acc);
+adjust_list1(Len,Orig,[],Acc) ->
+ adjust_list1(Len,Orig,Orig,Acc);
+adjust_list1(Len,Orig,[Oh|Ot],Acc) ->
+ adjust_list1(Len-1,Orig,Ot,[Oh|Acc]).
+
+
+get_constraint(C,Key) ->
+ case lists:keysearch(Key,1,C) of
+ false ->
+ no;
+ {value,{_,V}} ->
+ V
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt.erl
new file mode 100644
index 0000000000..efac8daf6b
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt.erl
@@ -0,0 +1,69 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1rt.erl,v 1.1 2008/12/17 09:53:30 mikpe Exp $
+%%
+-module(asn1rt).
+
+%% Runtime functions for ASN.1 (i.e encode, decode)
+
+-export([encode/2,encode/3,decode/3,load_driver/0,unload_driver/0,info/1]).
+
+encode(Module,{Type,Term}) ->
+ encode(Module,Type,Term).
+
+encode(Module,Type,Term) ->
+ case catch apply(Module,encode,[Type,Term]) of
+ {'EXIT',undef} ->
+ {error,{asn1,{undef,Module,Type}}};
+ Result ->
+ Result
+ end.
+
+decode(Module,Type,Bytes) ->
+ case catch apply(Module,decode,[Type,Bytes]) of
+ {'EXIT',undef} ->
+ {error,{asn1,{undef,Module,Type}}};
+ Result ->
+ Result
+ end.
+
+load_driver() ->
+ asn1rt_driver_handler:load_driver(),
+ receive
+ driver_ready ->
+ ok;
+ Err={error,_Reason} ->
+ Err;
+ Error ->
+ {error,Error}
+ end.
+
+unload_driver() ->
+ case catch asn1rt_driver_handler:unload_driver() of
+ ok ->
+ ok;
+ Error ->
+ {error,Error}
+ end.
+
+
+info(Module) ->
+ case catch apply(Module,info,[]) of
+ {'EXIT',{undef,_Reason}} ->
+ {error,{asn1,{undef,Module,info}}};
+ Result ->
+ {ok,Result}
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_ber_bin.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_ber_bin.erl
new file mode 100644
index 0000000000..6064515a7e
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_ber_bin.erl
@@ -0,0 +1,2310 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1rt_ber_bin.erl,v 1.1 2008/12/17 09:53:30 mikpe Exp $
+%%
+-module(asn1rt_ber_bin).
+
+%% encoding / decoding of BER
+
+-export([decode/1]).
+-export([fixoptionals/2,split_list/2,cindex/3,restbytes2/3,
+ list_to_record/2,
+ encode_tag_val/1,decode_tag/1,peek_tag/1,
+ check_tags/3, encode_tags/3]).
+-export([encode_boolean/2,decode_boolean/3,
+ encode_integer/3,encode_integer/4,
+ decode_integer/4,decode_integer/5,encode_enumerated/2,
+ encode_enumerated/4,decode_enumerated/5,
+ encode_real/2,decode_real/4,
+ encode_bit_string/4,decode_bit_string/6,
+ decode_compact_bit_string/6,
+ encode_octet_string/3,decode_octet_string/5,
+ encode_null/2,decode_null/3,
+ encode_object_identifier/2,decode_object_identifier/3,
+ encode_restricted_string/4,decode_restricted_string/6,
+ encode_universal_string/3,decode_universal_string/5,
+ encode_BMP_string/3,decode_BMP_string/5,
+ encode_generalized_time/3,decode_generalized_time/5,
+ encode_utc_time/3,decode_utc_time/5,
+ encode_length/1,decode_length/1,
+ check_if_valid_tag/3,
+ decode_tag_and_length/1, decode_components/6,
+ decode_components/7, decode_set/6]).
+
+-export([encode_open_type/1,encode_open_type/2,decode_open_type/1,decode_open_type/2,decode_open_type/3]).
+-export([skipvalue/1, skipvalue/2]).
+
+-include("asn1_records.hrl").
+
+% the encoding of class of tag bits 8 and 7
+-define(UNIVERSAL, 0).
+-define(APPLICATION, 16#40).
+-define(CONTEXT, 16#80).
+-define(PRIVATE, 16#C0).
+
+%%% primitive or constructed encoding % bit 6
+-define(PRIMITIVE, 0).
+-define(CONSTRUCTED, 2#00100000).
+
+%%% The tag-number for universal types
+-define(N_BOOLEAN, 1).
+-define(N_INTEGER, 2).
+-define(N_BIT_STRING, 3).
+-define(N_OCTET_STRING, 4).
+-define(N_NULL, 5).
+-define(N_OBJECT_IDENTIFIER, 6).
+-define(N_OBJECT_DESCRIPTOR, 7).
+-define(N_EXTERNAL, 8).
+-define(N_REAL, 9).
+-define(N_ENUMERATED, 10).
+-define(N_EMBEDDED_PDV, 11).
+-define(N_SEQUENCE, 16).
+-define(N_SET, 17).
+-define(N_NumericString, 18).
+-define(N_PrintableString, 19).
+-define(N_TeletexString, 20).
+-define(N_VideotexString, 21).
+-define(N_IA5String, 22).
+-define(N_UTCTime, 23).
+-define(N_GeneralizedTime, 24).
+-define(N_GraphicString, 25).
+-define(N_VisibleString, 26).
+-define(N_GeneralString, 27).
+-define(N_UniversalString, 28).
+-define(N_BMPString, 30).
+
+
+% the complete tag-word of built-in types
+-define(T_BOOLEAN, ?UNIVERSAL bor ?PRIMITIVE bor 1).
+-define(T_INTEGER, ?UNIVERSAL bor ?PRIMITIVE bor 2).
+-define(T_BIT_STRING, ?UNIVERSAL bor ?PRIMITIVE bor 3). % can be CONSTRUCTED
+-define(T_OCTET_STRING, ?UNIVERSAL bor ?PRIMITIVE bor 4). % can be CONSTRUCTED
+-define(T_NULL, ?UNIVERSAL bor ?PRIMITIVE bor 5).
+-define(T_OBJECT_IDENTIFIER,?UNIVERSAL bor ?PRIMITIVE bor 6).
+-define(T_OBJECT_DESCRIPTOR,?UNIVERSAL bor ?PRIMITIVE bor 7).
+-define(T_EXTERNAL, ?UNIVERSAL bor ?PRIMITIVE bor 8).
+-define(T_REAL, ?UNIVERSAL bor ?PRIMITIVE bor 9).
+-define(T_ENUMERATED, ?UNIVERSAL bor ?PRIMITIVE bor 10).
+-define(T_EMBEDDED_PDV, ?UNIVERSAL bor ?PRIMITIVE bor 11).
+-define(T_SEQUENCE, ?UNIVERSAL bor ?CONSTRUCTED bor 16).
+-define(T_SET, ?UNIVERSAL bor ?CONSTRUCTED bor 17).
+-define(T_NumericString, ?UNIVERSAL bor ?PRIMITIVE bor 18). %can be constructed
+-define(T_PrintableString, ?UNIVERSAL bor ?PRIMITIVE bor 19). %can be constructed
+-define(T_TeletexString, ?UNIVERSAL bor ?PRIMITIVE bor 20). %can be constructed
+-define(T_VideotexString, ?UNIVERSAL bor ?PRIMITIVE bor 21). %can be constructed
+-define(T_IA5String, ?UNIVERSAL bor ?PRIMITIVE bor 22). %can be constructed
+-define(T_UTCTime, ?UNIVERSAL bor ?PRIMITIVE bor 23).
+-define(T_GeneralizedTime, ?UNIVERSAL bor ?PRIMITIVE bor 24).
+-define(T_GraphicString, ?UNIVERSAL bor ?PRIMITIVE bor 25). %can be constructed
+-define(T_VisibleString, ?UNIVERSAL bor ?PRIMITIVE bor 26). %can be constructed
+-define(T_GeneralString, ?UNIVERSAL bor ?PRIMITIVE bor 27). %can be constructed
+-define(T_UniversalString, ?UNIVERSAL bor ?PRIMITIVE bor 28). %can be constructed
+-define(T_BMPString, ?UNIVERSAL bor ?PRIMITIVE bor 30). %can be constructed
+
+
+decode(Bin) ->
+ decode_primitive(Bin).
+
+decode_primitive(Bin) ->
+ {Tlv = {Tag,Len,V},<<>>} = decode_tlv(Bin),
+ case element(2,Tag) of
+ ?CONSTRUCTED ->
+ {Tag,Len,decode_constructed(V)};
+ _ ->
+ Tlv
+ end.
+
+decode_constructed(<<>>) ->
+ [];
+decode_constructed(Bin) ->
+ {Tlv = {Tag,Len,V},Rest} = decode_tlv(Bin),
+ NewTlv =
+ case element(2,Tag) of
+ ?CONSTRUCTED ->
+ {Tag,Len,decode_constructed(V)};
+ _ ->
+ Tlv
+ end,
+ [NewTlv|decode_constructed(Rest)].
+
+decode_tlv(Bin) ->
+ {Tag,Bin1,_Rb1} = decode_tag(Bin),
+ {{Len,Bin2},_Rb2} = decode_length(Bin1),
+ <<V:Len/binary,Bin3/binary>> = Bin2,
+ {{Tag,Len,V},Bin3}.
+
+
+
+%%%%%%%%%%%%%
+% split_list(List,HeadLen) -> {HeadList,TailList}
+%
+% splits List into HeadList (Length=HeadLen) and TailList
+% if HeadLen == indefinite -> return {List,indefinite}
+split_list(List,indefinite) ->
+ {List, indefinite};
+split_list(Bin, Len) when binary(Bin) ->
+ split_binary(Bin,Len);
+split_list(List,Len) ->
+ {lists:sublist(List,Len),lists:nthtail(Len,List)}.
+
+
+%%% new function which fixes a bug regarding indefinite length decoding
+restbytes2(indefinite,<<0,0,RemBytes/binary>>,_) ->
+ {RemBytes,2};
+restbytes2(indefinite,RemBytes,ext) ->
+ skipvalue(indefinite,RemBytes);
+restbytes2(RemBytes,<<>>,_) ->
+ {RemBytes,0};
+restbytes2(_RemBytes,Bytes,noext) ->
+ exit({error,{asn1, {unexpected,Bytes}}});
+restbytes2(RemBytes,_Bytes,ext) ->
+ {RemBytes,0}.
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% skipvalue(Length, Bytes) -> {RemainingBytes, RemovedNumberOfBytes}
+%%
+%% skips the one complete (could be nested) TLV from Bytes
+%% handles both definite and indefinite length encodings
+%%
+
+skipvalue(L, Bytes) ->
+ skipvalue(L, Bytes, 0).
+
+skipvalue(indefinite, Bytes, Rb) ->
+ {_T,Bytes2,R2} = decode_tag(Bytes),
+ {{L,Bytes3},R3} = decode_length(Bytes2),
+ {Bytes4,Rb4} = case L of
+ indefinite ->
+ skipvalue(indefinite,Bytes3,R2+R3);
+ _ ->
+ <<_:L/binary, RestBytes/binary>> = Bytes3,
+ {RestBytes, R2+R3+L}
+ end,
+ case Bytes4 of
+ <<0,0,Bytes5/binary>> ->
+ {Bytes5,Rb+Rb4+2};
+ _ -> skipvalue(indefinite,Bytes4,Rb+Rb4)
+ end;
+skipvalue(L, Bytes, Rb) ->
+% <<Skip:L/binary, RestBytes/binary>> = Bytes,
+ <<_:L/binary, RestBytes/binary>> = Bytes,
+ {RestBytes,Rb+L}.
+
+%%skipvalue(indefinite, Bytes, Rb) ->
+%% {T,Bytes2,R2} = decode_tag(Bytes),
+%% {L,Bytes3,R3} = decode_length(Bytes2),
+%% {Bytes4,Rb4} = case L of
+%% indefinite ->
+%% skipvalue(indefinite,Bytes3,R2+R3);
+%% _ ->
+%% lists:nthtail(L,Bytes3) %% konstigt !?
+%% end,
+%% case Bytes4 of
+%% [0,0|Bytes5] ->
+%% {Bytes5,Rb4+2};
+%% _ -> skipvalue(indefinite,Bytes4,Rb4)
+%% end;
+%%skipvalue(L, Bytes, Rb) ->
+%% {lists:nthtail(L,Bytes),Rb+L}.
+
+skipvalue(Bytes) ->
+ {_T,Bytes2,R2} = decode_tag(Bytes),
+ {{L,Bytes3},R3} = decode_length(Bytes2),
+ skipvalue(L,Bytes3,R2+R3).
+
+
+cindex(Ix,Val,Cname) ->
+ case element(Ix,Val) of
+ {Cname,Val2} -> Val2;
+ X -> X
+ end.
+
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+%% Optionals, preset not filled optionals with asn1_NOVALUE
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+
+% converts a list to a record if necessary
+list_to_record(Name,List) when list(List) ->
+ list_to_tuple([Name|List]);
+list_to_record(_Name,Tuple) when tuple(Tuple) ->
+ Tuple.
+
+
+fixoptionals(OptList,Val) when list(Val) ->
+ fixoptionals(OptList,Val,1,[],[]).
+
+fixoptionals([{Name,Pos}|Ot],[{Name,Val}|Vt],_Opt,Acc1,Acc2) ->
+ fixoptionals(Ot,Vt,Pos+1,[1|Acc1],[{Name,Val}|Acc2]);
+fixoptionals([{_Name,Pos}|Ot],V,Pos,Acc1,Acc2) ->
+ fixoptionals(Ot,V,Pos+1,[0|Acc1],[asn1_NOVALUE|Acc2]);
+fixoptionals(O,[Vh|Vt],Pos,Acc1,Acc2) ->
+ fixoptionals(O,Vt,Pos+1,Acc1,[Vh|Acc2]);
+fixoptionals([],[Vh|Vt],Pos,Acc1,Acc2) ->
+ fixoptionals([],Vt,Pos+1,Acc1,[Vh|Acc2]);
+fixoptionals([],[],_,_Acc1,Acc2) ->
+ % return Val as a record
+ list_to_tuple([asn1_RECORDNAME|lists:reverse(Acc2)]).
+
+
+%%encode_tag(TagClass(?UNI, APP etc), Form (?PRIM etx), TagInteger) ->
+%% 8bit Int | binary
+encode_tag_val({Class, Form, TagNo}) when (TagNo =< 30) ->
+ <<(Class bsr 6):2,(Form bsr 5):1,TagNo:5>>;
+
+encode_tag_val({Class, Form, TagNo}) ->
+ {Octets,_Len} = mk_object_val(TagNo),
+ BinOct = list_to_binary(Octets),
+ <<(Class bsr 6):2, (Form bsr 5):1, 31:5,BinOct/binary>>;
+
+%% asumes whole correct tag bitpattern, multiple of 8
+encode_tag_val(Tag) when (Tag =< 255) -> Tag; %% anv�nds denna funktion??!!
+%% asumes correct bitpattern of 0-5
+encode_tag_val(Tag) -> encode_tag_val2(Tag,[]).
+
+encode_tag_val2(Tag, OctAck) when (Tag =< 255) ->
+ [Tag | OctAck];
+encode_tag_val2(Tag, OctAck) ->
+ encode_tag_val2(Tag bsr 8, [255 band Tag | OctAck]).
+
+
+%%%encode_tag(TagClass(?UNI, APP etc), Form (?PRIM etx), TagInteger) ->
+%%% 8bit Int | [list of octets]
+%encode_tag_val({Class, Form, TagNo}) when (TagNo =< 30) ->
+%%% <<Class:2,Form:1,TagNo:5>>;
+% [Class bor Form bor TagNo];
+%encode_tag_val({Class, Form, TagNo}) ->
+% {Octets,L} = mk_object_val(TagNo),
+% [Class bor Form bor 31 | Octets];
+
+
+%%============================================================================\%% Peek on the initial tag
+%% peek_tag(Bytes) -> TagBytes
+%% interprets the first byte and possible second, third and fourth byte as
+%% a tag and returns all the bytes comprising the tag, the constructed/primitive bit (6:th bit of first byte) is normalised to 0
+%%
+
+peek_tag(<<B7_6:2,_:1,31:5,Buffer/binary>>) ->
+ Bin = peek_tag(Buffer, <<>>),
+ <<B7_6:2,31:6,Bin/binary>>;
+%% single tag (tagno < 31)
+peek_tag(<<B7_6:2,_:1,B4_0:5,_Buffer/binary>>) ->
+ <<B7_6:2,B4_0:6>>.
+
+peek_tag(<<0:1,PartialTag:7,_Buffer/binary>>, TagAck) ->
+ <<TagAck/binary,PartialTag>>;
+peek_tag(<<PartialTag,Buffer/binary>>, TagAck) ->
+ peek_tag(Buffer,<<TagAck/binary,PartialTag>>);
+peek_tag(_,TagAck) ->
+ exit({error,{asn1, {invalid_tag,TagAck}}}).
+%%peek_tag([Tag|Buffer]) when (Tag band 31) == 31 ->
+%% [Tag band 2#11011111 | peek_tag(Buffer,[])];
+%%%% single tag (tagno < 31)
+%%peek_tag([Tag|Buffer]) ->
+%% [Tag band 2#11011111].
+
+%%peek_tag([PartialTag|Buffer], TagAck) when (PartialTag < 128 ) ->
+%% lists:reverse([PartialTag|TagAck]);
+%%peek_tag([PartialTag|Buffer], TagAck) ->
+%% peek_tag(Buffer,[PartialTag|TagAck]);
+%%peek_tag(Buffer,TagAck) ->
+%% exit({error,{asn1, {invalid_tag,lists:reverse(TagAck)}}}).
+
+
+%%===============================================================================
+%% Decode a tag
+%%
+%% decode_tag(OctetListBuffer) -> {{Class, Form, TagNo}, RestOfBuffer, RemovedBytes}
+%%===============================================================================
+
+%% multiple octet tag
+decode_tag(<<Class:2, Form:1, 31:5, Buffer/binary>>) ->
+ {TagNo, Buffer1, RemovedBytes} = decode_tag(Buffer, 0, 1),
+ {{(Class bsl 6), (Form bsl 5), TagNo}, Buffer1, RemovedBytes};
+
+%% single tag (< 31 tags)
+decode_tag(<<Class:2,Form:1,TagNo:5, Buffer/binary>>) ->
+ {{(Class bsl 6), (Form bsl 5), TagNo}, Buffer, 1}.
+
+%% last partial tag
+decode_tag(<<0:1,PartialTag:7, Buffer/binary>>, TagAck, RemovedBytes) ->
+ TagNo = (TagAck bsl 7) bor PartialTag,
+ %%<<TagNo>> = <<TagAck:1, PartialTag:7>>,
+ {TagNo, Buffer, RemovedBytes+1};
+% more tags
+decode_tag(<<_:1,PartialTag:7, Buffer/binary>>, TagAck, RemovedBytes) ->
+ TagAck1 = (TagAck bsl 7) bor PartialTag,
+ %%<<TagAck1:16>> = <<TagAck:1, PartialTag:7,0:8>>,
+ decode_tag(Buffer, TagAck1, RemovedBytes+1).
+
+%%------------------------------------------------------------------
+%% check_tags_i is the same as check_tags except that it stops and
+%% returns the remaining tags not checked when it encounters an
+%% indefinite length field
+%% only called internally within this module
+
+check_tags_i([Tag], Buffer, OptOrMand) -> % optimized very usual case
+ {[],check_one_tag(Tag, Buffer, OptOrMand)};
+check_tags_i(Tags, Buffer, OptOrMand) ->
+ check_tags_i(Tags, Buffer, 0, OptOrMand).
+
+check_tags_i([Tag1,Tag2|TagRest], Buffer, Rb, OptOrMand)
+ when Tag1#tag.type == 'IMPLICIT' ->
+ check_tags_i([Tag1#tag{type=Tag2#tag.type}|TagRest], Buffer, Rb, OptOrMand);
+
+check_tags_i([Tag1|TagRest], Buffer, Rb, OptOrMand) ->
+ {Form_Length,Buffer2,Rb1} = check_one_tag(Tag1, Buffer, OptOrMand),
+ case TagRest of
+ [] -> {TagRest, {Form_Length, Buffer2, Rb + Rb1}};
+ _ ->
+ case Form_Length of
+ {?CONSTRUCTED,_} ->
+ {TagRest, {Form_Length, Buffer2, Rb + Rb1}};
+ _ ->
+ check_tags_i(TagRest, Buffer2, Rb + Rb1, mandatory)
+ end
+ end;
+
+check_tags_i([], Buffer, Rb, _) ->
+ {[],{{0,0},Buffer,Rb}}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% This function is called from generated code
+
+check_tags([Tag], Buffer, OptOrMand) -> % optimized very usual case
+ check_one_tag(Tag, Buffer, OptOrMand);
+check_tags(Tags, Buffer, OptOrMand) ->
+ check_tags(Tags, Buffer, 0, OptOrMand).
+
+check_tags([Tag1,Tag2|TagRest], Buffer, Rb, OptOrMand)
+ when Tag1#tag.type == 'IMPLICIT' ->
+ check_tags([Tag1#tag{type=Tag2#tag.type}|TagRest], Buffer, Rb, OptOrMand);
+
+check_tags([Tag1|TagRest], Buffer, Rb, OptOrMand) ->
+ {Form_Length,Buffer2,Rb1} = check_one_tag(Tag1, Buffer, OptOrMand),
+ case TagRest of
+ [] -> {Form_Length, Buffer2, Rb + Rb1};
+ _ -> check_tags(TagRest, Buffer2, Rb + Rb1, mandatory)
+ end;
+
+check_tags([], Buffer, Rb, _) ->
+ {{0,0},Buffer,Rb}.
+
+check_one_tag(Tag=#tag{class=ExpectedClass,number=ExpectedNumber}, Buffer, OptOrMand) ->
+ case catch decode_tag(Buffer) of
+ {'EXIT',_Reason} ->
+ tag_error(no_data,Tag,Buffer,OptOrMand);
+ {{ExpectedClass,Form,ExpectedNumber},Buffer2,Rb} ->
+ {{L,Buffer3},RemBytes2} = decode_length(Buffer2),
+ {{Form,L}, Buffer3, RemBytes2+Rb};
+ {ErrorTag,_,_} ->
+ tag_error(ErrorTag, Tag, Buffer, OptOrMand)
+ end.
+
+tag_error(ErrorTag, Tag, Buffer, OptOrMand) ->
+ case OptOrMand of
+ mandatory ->
+ exit({error,{asn1, {invalid_tag,
+ {ErrorTag, Tag, Buffer}}}});
+ _ ->
+ exit({error,{asn1, {no_optional_tag,
+ {ErrorTag, Tag, Buffer}}}})
+ end.
+%%=======================================================================
+%%
+%% Encode all tags in the list Tags and return a possibly deep list of
+%% bytes with tag and length encoded
+%%
+%% prepend_tags(Tags, BytesSoFar, LenSoFar) -> {Bytes, Len}
+encode_tags(Tags, BytesSoFar, LenSoFar) ->
+ NewTags = encode_tags1(Tags, []),
+ %% NewTags contains the resulting tags in reverse order
+ encode_tags2(NewTags, BytesSoFar, LenSoFar).
+
+%encode_tags2([#tag{class=?UNIVERSAL,number=No}|Trest], BytesSoFar, LenSoFar) ->
+% {Bytes2,L2} = encode_length(LenSoFar),
+% encode_tags2(Trest,[[No|Bytes2],BytesSoFar], LenSoFar + 1 + L2);
+encode_tags2([Tag|Trest], BytesSoFar, LenSoFar) ->
+ {Bytes1,L1} = encode_one_tag(Tag),
+ {Bytes2,L2} = encode_length(LenSoFar),
+ encode_tags2(Trest, [Bytes1,Bytes2|BytesSoFar],
+ LenSoFar + L1 + L2);
+encode_tags2([], BytesSoFar, LenSoFar) ->
+ {BytesSoFar,LenSoFar}.
+
+encode_tags1([Tag1, Tag2| Trest], Acc)
+ when Tag1#tag.type == 'IMPLICIT' ->
+ encode_tags1([Tag1#tag{type=Tag2#tag.type,form=Tag2#tag.form}|Trest],Acc);
+encode_tags1([Tag1 | Trest], Acc) ->
+ encode_tags1(Trest, [Tag1|Acc]);
+encode_tags1([], Acc) ->
+ Acc. % the resulting tags are returned in reverse order
+
+encode_one_tag(Bin) when binary(Bin) ->
+ {Bin,size(Bin)};
+encode_one_tag(#tag{class=Class,number=No,type=Type, form = Form}) ->
+ NewForm = case Type of
+ 'EXPLICIT' ->
+ ?CONSTRUCTED;
+ _ ->
+ Form
+ end,
+ Bytes = encode_tag_val({Class,NewForm,No}),
+ {Bytes,size(Bytes)}.
+
+%%===============================================================================
+%% Change the tag (used when an implicit tagged type has a reference to something else)
+%% The constructed bit in the tag is taken from the tag to be replaced.
+%%
+%% change_tag(NewTag,[Tag,Buffer]) -> [NewTag,Buffer]
+%%===============================================================================
+
+%change_tag({NewClass,NewTagNr}, Buffer) ->
+% {{OldClass, OldForm, OldTagNo}, Buffer1, RemovedBytes} = decode_tag(lists:flatten(Buffer)),
+% [encode_tag_val({NewClass, OldForm, NewTagNr}) | Buffer1].
+
+
+
+
+
+
+
+%%===============================================================================
+%%
+%% This comment is valid for all the encode/decode functions
+%%
+%% C = Constraint -> typically {'ValueRange',LowerBound,UpperBound}
+%% used for PER-coding but not for BER-coding.
+%%
+%% Val = Value. If Val is an atom then it is a symbolic integer value
+%% (i.e the atom must be one of the names in the NamedNumberList).
+%% The NamedNumberList is used to translate the atom to an integer value
+%% before encoding.
+%%
+%%===============================================================================
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% encode_open_type(Value) -> CompleteList
+%% Value = list of bytes of an already encoded value (the list must be flat)
+%% | binary
+
+%% This version does not consider Explicit tagging of the open type. It
+%% is only left because of backward compatibility.
+encode_open_type(Val) when list(Val) ->
+ {Val,size(list_to_binary(Val))};
+encode_open_type(Val) ->
+ {Val, size(Val)}.
+
+%%
+encode_open_type(Val, []) when list(Val) ->
+ {Val,size(list_to_binary(Val))};
+encode_open_type(Val,[]) ->
+ {Val, size(Val)};
+encode_open_type(Val, Tag) when list(Val) ->
+ encode_tags(Tag,Val,size(list_to_binary(Val)));
+encode_open_type(Val,Tag) ->
+ encode_tags(Tag,Val, size(Val)).
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% decode_open_type(Buffer) -> Value
+%% Bytes = [byte] with BER encoded data
+%% Value = [byte] with decoded data (which must be decoded again as some type)
+%%
+decode_open_type(Bytes) ->
+ {_Tag, Len, _RemainingBuffer, RemovedBytes} = decode_tag_and_length(Bytes),
+ N = Len + RemovedBytes,
+ <<Val:N/binary, RemainingBytes/binary>> = Bytes,
+ {Val, RemainingBytes, Len + RemovedBytes}.
+
+decode_open_type(Bytes,ExplTag) ->
+ {Tag, Len, RemainingBuffer, RemovedBytes} = decode_tag_and_length(Bytes),
+ case {Tag,ExplTag} of
+ {{Class,Form,No},[#tag{class=Class,number=No,form=Form}]} ->
+ {_Tag2, Len2, _RemainingBuffer2, RemovedBytes2} = decode_tag_and_length(RemainingBuffer),
+ N = Len2 + RemovedBytes2,
+ <<_:RemovedBytes/unit:8,Val:N/binary,RemainingBytes/binary>> = Bytes,
+ {Val, RemainingBytes, N + RemovedBytes};
+ _ ->
+ N = Len + RemovedBytes,
+ <<Val:N/binary, RemainingBytes/binary>> = Bytes,
+ {Val, RemainingBytes, Len + RemovedBytes}
+ end.
+
+decode_open_type(ber_bin,Bytes,ExplTag) ->
+ decode_open_type(Bytes,ExplTag);
+decode_open_type(ber,Bytes,ExplTag) ->
+ {Val,RemBytes,Len}=decode_open_type(Bytes,ExplTag),
+ {binary_to_list(Val),RemBytes,Len}.
+
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+%% Boolean, ITU_T X.690 Chapter 8.2
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+
+%%===============================================================================
+%% encode_boolean(Integer, tag | notag) -> [octet list]
+%%===============================================================================
+
+encode_boolean({Name, Val}, DoTag) when atom(Name) ->
+ dotag(DoTag, ?N_BOOLEAN, encode_boolean(Val));
+encode_boolean(true,[]) ->
+ {[1,1,16#FF],3};
+encode_boolean(false,[]) ->
+ {[1,1,0],3};
+encode_boolean(Val, DoTag) ->
+ dotag(DoTag, ?N_BOOLEAN, encode_boolean(Val)).
+
+%% encode_boolean(Boolean) -> [Len, Boolean] = [1, $FF | 0]
+encode_boolean(true) -> {[16#FF],1};
+encode_boolean(false) -> {[0],1};
+encode_boolean(X) -> exit({error,{asn1, {encode_boolean, X}}}).
+
+
+%%===============================================================================
+%% decode_boolean(BuffList, HasTag, TotalLen) -> {true, Remain, RemovedBytes} |
+%% {false, Remain, RemovedBytes}
+%%===============================================================================
+
+decode_boolean(Buffer, Tags, OptOrMand) ->
+ NewTags = new_tags(Tags,#tag{class=?UNIVERSAL,number=?N_BOOLEAN}),
+ decode_boolean_notag(Buffer, NewTags, OptOrMand).
+
+decode_boolean_notag(Buffer, Tags, OptOrMand) ->
+ {RestTags, {FormLen,Buffer0,Rb0}} =
+ check_tags_i(Tags, Buffer, OptOrMand),
+ case FormLen of
+ {?CONSTRUCTED,Len} ->
+ {Buffer00,RestBytes} = split_list(Buffer0,Len),
+ {Val,Buffer1,Rb1} = decode_boolean_notag(Buffer00, RestTags, OptOrMand),
+ {Buffer2, Rb2} = restbytes2(RestBytes,Buffer1,noext),
+ {Val, Buffer2, Rb0+Rb1+Rb2};
+ {_,_} ->
+ decode_boolean2(Buffer0, Rb0)
+ end.
+
+decode_boolean2(<<0:8, Buffer/binary>>, RemovedBytes) ->
+ {false, Buffer, RemovedBytes + 1};
+decode_boolean2(<<_:8, Buffer/binary>>, RemovedBytes) ->
+ {true, Buffer, RemovedBytes + 1};
+decode_boolean2(Buffer, _) ->
+ exit({error,{asn1, {decode_boolean, Buffer}}}).
+
+
+
+
+%%===========================================================================
+%% Integer, ITU_T X.690 Chapter 8.3
+
+%% encode_integer(Constraint, Value, Tag) -> [octet list]
+%% encode_integer(Constraint, Name, NamedNumberList, Tag) -> [octet list]
+%% Value = INTEGER | {Name,INTEGER}
+%% Tag = tag | notag
+%%===========================================================================
+
+encode_integer(C, Val, []) when integer(Val) ->
+ {EncVal,Len}=encode_integer(C, Val),
+ dotag_universal(?N_INTEGER,EncVal,Len);
+encode_integer(C, Val, Tag) when integer(Val) ->
+ dotag(Tag, ?N_INTEGER, encode_integer(C, Val));
+encode_integer(C,{Name,Val},Tag) when atom(Name) ->
+ encode_integer(C,Val,Tag);
+encode_integer(_, Val, _) ->
+ exit({error,{asn1, {encode_integer, Val}}}).
+
+
+
+encode_integer(C, Val, NamedNumberList, Tag) when atom(Val) ->
+ case lists:keysearch(Val, 1, NamedNumberList) of
+ {value,{_, NewVal}} ->
+ dotag(Tag, ?N_INTEGER, encode_integer(C, NewVal));
+ _ ->
+ exit({error,{asn1, {encode_integer_namednumber, Val}}})
+ end;
+encode_integer(C,{_,Val},NamedNumberList,Tag) ->
+ encode_integer(C,Val,NamedNumberList,Tag);
+encode_integer(C, Val, _NamedNumberList, Tag) ->
+ dotag(Tag, ?N_INTEGER, encode_integer(C, Val)).
+
+
+
+
+encode_integer(_C, Val) ->
+ Bytes =
+ if
+ Val >= 0 ->
+ encode_integer_pos(Val, []);
+ true ->
+ encode_integer_neg(Val, [])
+ end,
+ {Bytes,length(Bytes)}.
+
+encode_integer_pos(0, L=[B|_Acc]) when B < 128 ->
+ L;
+encode_integer_pos(N, Acc) ->
+ encode_integer_pos((N bsr 8), [N band 16#ff| Acc]).
+
+encode_integer_neg(-1, L=[B1|_T]) when B1 > 127 ->
+ L;
+encode_integer_neg(N, Acc) ->
+ encode_integer_neg(N bsr 8, [N band 16#ff|Acc]).
+
+%%===============================================================================
+%% decode integer
+%% (Buffer, Range, HasTag, TotalLen) -> {Integer, Remain, RemovedBytes}
+%% (Buffer, Range, NamedNumberList, HasTag, TotalLen) -> {Integer, Remain, RemovedBytes}
+%%===============================================================================
+
+
+decode_integer(Buffer, Range, Tags, OptOrMand) ->
+ NewTags = new_tags(Tags,#tag{class=?UNIVERSAL,number=?N_INTEGER}),
+ decode_integer_notag(Buffer, Range, [], NewTags, OptOrMand).
+
+decode_integer(Buffer, Range, NamedNumberList, Tags, OptOrMand) ->
+ NewTags = new_tags(Tags,#tag{class=?UNIVERSAL,number=?N_INTEGER}),
+ decode_integer_notag(Buffer, Range, NamedNumberList, NewTags, OptOrMand).
+
+decode_integer_notag(Buffer, Range, NamedNumberList, NewTags, OptOrMand) ->
+ {RestTags, {FormLen, Buffer0, Rb0}} =
+ check_tags_i(NewTags, Buffer, OptOrMand),
+% Result = {Val, Buffer2, RemovedBytes} =
+ case FormLen of
+ {?CONSTRUCTED,Len} ->
+ {Buffer00, RestBytes} = split_list(Buffer0,Len),
+ {Val01, Buffer01, Rb01} =
+ decode_integer_notag(Buffer00, Range, NamedNumberList,
+ RestTags, OptOrMand),
+ {Buffer02, Rb02} = restbytes2(RestBytes,Buffer01,noext),
+ {Val01, Buffer02, Rb0+Rb01+Rb02};
+ {_, Len} ->
+ Result =
+ decode_integer2(Len,Buffer0,Rb0+Len),
+ Result2 = check_integer_constraint(Result,Range),
+ resolve_named_value(Result2,NamedNumberList)
+ end.
+
+resolve_named_value(Result={Val,Buffer,RemBytes},NamedNumberList) ->
+ case NamedNumberList of
+ [] -> Result;
+ _ ->
+ NewVal = case lists:keysearch(Val, 2, NamedNumberList) of
+ {value,{NamedVal, _}} ->
+ NamedVal;
+ _ ->
+ Val
+ end,
+ {NewVal, Buffer, RemBytes}
+ end.
+
+check_integer_constraint(Result={Val, _Buffer,_},Range) ->
+ case Range of
+ [] -> % No length constraint
+ Result;
+ {Lb,Ub} when Val >= Lb, Ub >= Val -> % variable length constraint
+ Result;
+ Val -> % fixed value constraint
+ Result;
+ {_,_} ->
+ exit({error,{asn1,{integer_range,Range,Val}}});
+ SingleValue when integer(SingleValue) ->
+ exit({error,{asn1,{integer_range,Range,Val}}});
+ _ -> % some strange constraint that we don't support yet
+ Result
+ end.
+
+%%============================================================================
+%% Enumerated value, ITU_T X.690 Chapter 8.4
+
+%% encode enumerated value
+%%============================================================================
+encode_enumerated(Val, []) when integer(Val)->
+ {EncVal,Len} = encode_integer(false,Val),
+ dotag_universal(?N_ENUMERATED,EncVal,Len);
+encode_enumerated(Val, DoTag) when integer(Val)->
+ dotag(DoTag, ?N_ENUMERATED, encode_integer(false,Val));
+encode_enumerated({Name,Val}, DoTag) when atom(Name) ->
+ encode_enumerated(Val, DoTag).
+
+%% The encode_enumerated functions below this line can be removed when the
+%% new code generation is stable. (the functions might have to be kept here
+%% a while longer for compatibility reasons)
+
+encode_enumerated(C, Val, {NamedNumberList,ExtList}, DoTag) when atom(Val) ->
+ case catch encode_enumerated(C, Val, NamedNumberList, DoTag) of
+ {'EXIT',_} -> encode_enumerated(C, Val, ExtList, DoTag);
+ Result -> Result
+ end;
+
+encode_enumerated(C, Val, NamedNumberList, DoTag) when atom(Val) ->
+ case lists:keysearch(Val, 1, NamedNumberList) of
+ {value, {_, NewVal}} when DoTag == []->
+ {EncVal,Len} = encode_integer(C,NewVal),
+ dotag_universal(?N_ENUMERATED,EncVal,Len);
+ {value, {_, NewVal}} ->
+ dotag(DoTag, ?N_ENUMERATED, encode_integer(C, NewVal));
+ _ ->
+ exit({error,{asn1, {enumerated_not_in_range, Val}}})
+ end;
+
+encode_enumerated(C, {asn1_enum, Val}, {_,_}, DoTag) when integer(Val) ->
+ dotag(DoTag, ?N_ENUMERATED, encode_integer(C,Val));
+
+encode_enumerated(C, {Name,Val}, NamedNumberList, DoTag) when atom(Name) ->
+ encode_enumerated(C, Val, NamedNumberList, DoTag);
+
+encode_enumerated(_, Val, _, _) ->
+ exit({error,{asn1, {enumerated_not_namednumber, Val}}}).
+
+
+
+%%============================================================================
+%% decode enumerated value
+%% (Buffer, Range, NamedNumberList, HasTag, TotalLen) ->
+%% {Value, RemainingBuffer, RemovedBytes}
+%%===========================================================================
+decode_enumerated(Buffer, Range, NamedNumberList, Tags, OptOrMand) ->
+ NewTags = new_tags(Tags,#tag{class=?UNIVERSAL,number=?N_ENUMERATED}),
+ decode_enumerated_notag(Buffer, Range, NamedNumberList,
+ NewTags, OptOrMand).
+
+decode_enumerated_notag(Buffer, Range, NNList = {NamedNumberList,ExtList}, Tags, OptOrMand) ->
+ {RestTags, {FormLen, Buffer0, Rb0}} =
+ check_tags_i(Tags, Buffer, OptOrMand),
+
+ case FormLen of
+ {?CONSTRUCTED,Len} ->
+ {Buffer00,RestBytes} = split_list(Buffer0,Len),
+ {Val01, Buffer01, Rb01} =
+ decode_enumerated_notag(Buffer00, Range, NNList, RestTags, OptOrMand),
+ {Buffer02, Rb02} = restbytes2(RestBytes,Buffer01,noext),
+ {Val01, Buffer02, Rb0+Rb01+Rb02};
+ {_,Len} ->
+ {Val01, Buffer01, Rb01} =
+ decode_integer2(Len, Buffer0, Rb0+Len),
+ case decode_enumerated1(Val01, NamedNumberList) of
+ {asn1_enum,Val01} ->
+ {decode_enumerated1(Val01,ExtList), Buffer01, Rb01};
+ Result01 ->
+ {Result01, Buffer01, Rb01}
+ end
+ end;
+
+decode_enumerated_notag(Buffer, Range, NNList, Tags, OptOrMand) ->
+ {RestTags, {FormLen, Buffer0, Rb0}} =
+ check_tags_i(Tags, Buffer, OptOrMand),
+
+ case FormLen of
+ {?CONSTRUCTED,Len} ->
+ {Buffer00,RestBytes} = split_list(Buffer0,Len),
+ {Val01, Buffer01, Rb01} =
+ decode_enumerated_notag(Buffer00, Range, NNList, RestTags, OptOrMand),
+ {Buffer02, Rb02} = restbytes2(RestBytes,Buffer01,noext),
+ {Val01, Buffer02, Rb0+Rb01+Rb02};
+ {_,Len} ->
+ {Val01, Buffer02, Rb02} =
+ decode_integer2(Len, Buffer0, Rb0+Len),
+ case decode_enumerated1(Val01, NNList) of
+ {asn1_enum,_} ->
+ exit({error,{asn1, {illegal_enumerated, Val01}}});
+ Result01 ->
+ {Result01, Buffer02, Rb02}
+ end
+ end.
+
+decode_enumerated1(Val, NamedNumberList) ->
+ %% it must be a named integer
+ case lists:keysearch(Val, 2, NamedNumberList) of
+ {value,{NamedVal, _}} ->
+ NamedVal;
+ _ ->
+ {asn1_enum,Val}
+ end.
+
+
+%%============================================================================
+%%
+%% Real value, ITU_T X.690 Chapter 8.5
+%%============================================================================
+%%
+%% encode real value
+%%============================================================================
+
+%% only base 2 internally so far!!
+encode_real(0, DoTag) ->
+ dotag(DoTag, ?N_REAL, {[],0});
+encode_real('PLUS-INFINITY', DoTag) ->
+ dotag(DoTag, ?N_REAL, {[64],1});
+encode_real('MINUS-INFINITY', DoTag) ->
+ dotag(DoTag, ?N_REAL, {[65],1});
+encode_real(Val, DoTag) when tuple(Val)->
+ dotag(DoTag, ?N_REAL, encode_real(Val)).
+
+%%%%%%%%%%%%%%
+%% not optimal efficient..
+%% only base 2 of Mantissa encoding!
+%% only base 2 of ExpBase encoding!
+encode_real({Man, Base, Exp}) ->
+%% io:format("Mantissa: ~w Base: ~w, Exp: ~w~n",[Man, Base, Exp]),
+
+ OctExp = if Exp >= 0 -> list_to_binary(encode_integer_pos(Exp, []));
+ true -> list_to_binary(encode_integer_neg(Exp, []))
+ end,
+%% ok = io:format("OctExp: ~w~n",[OctExp]),
+ SignBit = if Man > 0 -> 0; % bit 7 is pos or neg, no Zeroval
+ true -> 1
+ end,
+%% ok = io:format("SignBitMask: ~w~n",[SignBitMask]),
+ InBase = if Base =:= 2 -> 0; % bit 6,5: only base 2 this far!
+ true ->
+ exit({error,{asn1, {encode_real_non_supported_encodeing, Base}}})
+ end,
+ SFactor = 0, % bit 4,3: no scaling since only base 2
+ OctExpLen = size(OctExp),
+ if OctExpLen > 255 ->
+ exit({error,{asn1, {to_big_exp_in_encode_real, OctExpLen}}});
+ true -> true %% make real assert later..
+ end,
+ {LenCode, EOctets} = case OctExpLen of % bit 2,1
+ 1 -> {0, OctExp};
+ 2 -> {1, OctExp};
+ 3 -> {2, OctExp};
+ _ -> {3, <<OctExpLen, OctExp/binary>>}
+ end,
+ FirstOctet = <<1:1,SignBit:1,InBase:2,SFactor:2,LenCode:2>>,
+ OctMantissa = if Man > 0 -> list_to_binary(minimum_octets(Man));
+ true -> list_to_binary(minimum_octets(-(Man))) % signbit keeps track of sign
+ end,
+ %% ok = io:format("LenMask: ~w EOctets: ~w~nFirstOctet: ~w OctMantissa: ~w OctExpLen: ~w~n", [LenMask, EOctets, FirstOctet, OctMantissa, OctExpLen]),
+ Bin = <<FirstOctet/binary, EOctets/binary, OctMantissa/binary>>,
+ {Bin, size(Bin)}.
+
+
+%encode_real({Man, Base, Exp}) ->
+%% io:format("Mantissa: ~w Base: ~w, Exp: ~w~n",[Man, Base, Exp]),
+
+% OctExp = if Exp >= 0 -> encode_integer_pos(Exp, []);
+% true -> encode_integer_neg(Exp, [])
+% end,
+%% ok = io:format("OctExp: ~w~n",[OctExp]),
+% SignBitMask = if Man > 0 -> 2#00000000; % bit 7 is pos or neg, no Zeroval
+% true -> 2#01000000
+% end,
+%% ok = io:format("SignBitMask: ~w~n",[SignBitMask]),
+% InternalBaseMask = if Base =:= 2 -> 2#00000000; % bit 6,5: only base 2 this far!
+% true ->
+% exit({error,{asn1, {encode_real_non_supported_encodeing, Base}}})
+% end,
+% ScalingFactorMask =2#00000000, % bit 4,3: no scaling since only base 2
+% OctExpLen = length(OctExp),
+% if OctExpLen > 255 ->
+% exit({error,{asn1, {to_big_exp_in_encode_real, OctExpLen}}});
+% true -> true %% make real assert later..
+% end,
+% {LenMask, EOctets} = case OctExpLen of % bit 2,1
+% 1 -> {0, OctExp};
+% 2 -> {1, OctExp};
+% 3 -> {2, OctExp};
+% _ -> {3, [OctExpLen, OctExp]}
+% end,
+% FirstOctet = (SignBitMask bor InternalBaseMask bor
+% ScalingFactorMask bor LenMask bor
+% 2#10000000), % bit set for binary mantissa encoding!
+% OctMantissa = if Man > 0 -> minimum_octets(Man);
+% true -> minimum_octets(-(Man)) % signbit keeps track of sign
+% end,
+%% ok = io:format("LenMask: ~w EOctets: ~w~nFirstOctet: ~w OctMantissa: ~w OctExpLen: ~w~n", [LenMask, EOctets, FirstOctet, OctMantissa, OctExpLen]),
+% {[FirstOctet, EOctets, OctMantissa],
+% length(OctMantissa) +
+% (if OctExpLen > 3 ->
+% OctExpLen + 2;
+% true ->
+% OctExpLen + 1
+% end)
+% }.
+
+
+%%============================================================================
+%% decode real value
+%%
+%% decode_real([OctetBufferList], tuple|value, tag|notag) ->
+%% {{Mantissa, Base, Exp} | realval | PLUS-INFINITY | MINUS-INFINITY | 0,
+%% RestBuff}
+%%
+%% only for base 2 decoding sofar!!
+%%============================================================================
+
+decode_real(Buffer, Form, Tags, OptOrMand) ->
+ NewTags = new_tags(Tags,#tag{class=?UNIVERSAL,number=?N_REAL}),
+ decode_real_notag(Buffer, Form, NewTags, OptOrMand).
+
+decode_real_notag(Buffer, Form, Tags, OptOrMand) ->
+ {RestTags, {FormLen, Buffer0, Rb0}} =
+ check_tags_i(Tags, Buffer, OptOrMand),
+
+ case FormLen of
+ {?CONSTRUCTED,Len} ->
+ {Buffer00,RestBytes} = split_list(Buffer0,Len),
+ {Val01, Buffer01, Rb01} =
+ decode_real_notag(Buffer00, Form, RestTags, OptOrMand),
+ {Buffer02, Rb02} = restbytes2(RestBytes,Buffer01,noext),
+ {Val01, Buffer02, Rb0+Rb01+Rb02};
+ {_,Len} ->
+ decode_real2(Buffer0, Form, Len, Rb0)
+ end.
+
+decode_real2(Buffer0, Form, Len, RemBytes1) ->
+ <<First, Buffer2/binary>> = Buffer0,
+ if
+ First =:= 2#01000000 -> {'PLUS-INFINITY', Buffer2};
+ First =:= 2#01000001 -> {'MINUS-INFINITY', Buffer2};
+ First =:= 2#00000000 -> {0, Buffer2};
+ true ->
+ %% have some check here to verify only supported bases (2)
+ <<_B7:1,B6:1,B5_4:2,B3_2:2,B1_0:2>> = <<First>>,
+ Sign = B6,
+ Base =
+ case B5_4 of
+ 0 -> 2; % base 2, only one so far
+ _ -> exit({error,{asn1, {non_supported_base, First}}})
+ end,
+% ScalingFactor =
+ case B3_2 of
+ 0 -> 0; % no scaling so far
+ _ -> exit({error,{asn1, {non_supported_scaling, First}}})
+ end,
+ % ok = io:format("Buffer2: ~w~n",[Buffer2]),
+ {FirstLen, {Exp, Buffer3}, RemBytes2} =
+ case B1_0 of
+ 0 -> {2, decode_integer2(1, Buffer2, RemBytes1), RemBytes1+1};
+ 1 -> {3, decode_integer2(2, Buffer2, RemBytes1), RemBytes1+2};
+ 2 -> {4, decode_integer2(3, Buffer2, RemBytes1), RemBytes1+3};
+ 3 ->
+ <<ExpLen1,RestBuffer/binary>> = Buffer2,
+ { ExpLen1 + 2,
+ decode_integer2(ExpLen1, RestBuffer, RemBytes1),
+ RemBytes1+ExpLen1}
+ end,
+ % io:format("FirstLen: ~w, Exp: ~w, Buffer3: ~w ~n",
+ % [FirstLen, Exp, Buffer3]),
+ Length = Len - FirstLen,
+ <<LongInt:Length/unit:8,RestBuff/binary>> = Buffer3,
+ {{Mantissa, Buffer4}, RemBytes3} =
+ if Sign =:= 0 ->
+ % io:format("sign plus~n"),
+ {{LongInt, RestBuff}, 1 + Length};
+ true ->
+ % io:format("sign minus~n"),
+ {{-LongInt, RestBuff}, 1 + Length}
+ end,
+ % io:format("Form: ~w~n",[Form]),
+ case Form of
+ tuple ->
+ {Val,Buf,_RemB} = Exp,
+ {{Mantissa, Base, {Val,Buf}}, Buffer4, RemBytes2+RemBytes3};
+ _value ->
+ comming
+ end
+ end.
+
+
+%%============================================================================
+%% Bitstring value, ITU_T X.690 Chapter 8.6
+%%
+%% encode bitstring value
+%%
+%% bitstring NamedBitList
+%% Val can be of:
+%% - [identifiers] where only named identifers are set to one,
+%% the Constraint must then have some information of the
+%% bitlength.
+%% - [list of ones and zeroes] all bits
+%% - integer value representing the bitlist
+%% C is constrint Len, only valid when identifiers
+%%============================================================================
+
+encode_bit_string(C,Bin={Unused,BinBits},NamedBitList,DoTag) when integer(Unused), binary(BinBits) ->
+ encode_bin_bit_string(C,Bin,NamedBitList,DoTag);
+encode_bit_string(C, [FirstVal | RestVal], NamedBitList, DoTag) when atom(FirstVal) ->
+ encode_bit_string_named(C, [FirstVal | RestVal], NamedBitList, DoTag);
+
+encode_bit_string(C, [{bit,X} | RestVal], NamedBitList, DoTag) ->
+ encode_bit_string_named(C, [{bit,X} | RestVal], NamedBitList, DoTag);
+
+encode_bit_string(C, [FirstVal| RestVal], NamedBitList, DoTag) when integer(FirstVal) ->
+ encode_bit_string_bits(C, [FirstVal | RestVal], NamedBitList, DoTag);
+
+encode_bit_string(_, 0, _, []) ->
+ {[?N_BIT_STRING,1,0],3};
+
+encode_bit_string(_, 0, _, DoTag) ->
+ dotag(DoTag, ?N_BIT_STRING, {<<0>>,1});
+
+encode_bit_string(_, [], _, []) ->
+ {[?N_BIT_STRING,1,0],3};
+
+encode_bit_string(_, [], _, DoTag) ->
+ dotag(DoTag, ?N_BIT_STRING, {<<0>>,1});
+
+encode_bit_string(C, IntegerVal, NamedBitList, DoTag) when integer(IntegerVal) ->
+ BitListVal = int_to_bitlist(IntegerVal),
+ encode_bit_string_bits(C, BitListVal, NamedBitList, DoTag);
+
+encode_bit_string(C, {Name,BitList}, NamedBitList, DoTag) when atom(Name) ->
+ encode_bit_string(C, BitList, NamedBitList, DoTag).
+
+
+
+int_to_bitlist(0) ->
+ [];
+int_to_bitlist(Int) when integer(Int), Int >= 0 ->
+ [Int band 1 | int_to_bitlist(Int bsr 1)].
+
+
+%%=================================================================
+%% Encode BIT STRING of the form {Unused,BinBits}.
+%% Unused is the number of unused bits in the last byte in BinBits
+%% and BinBits is a binary representing the BIT STRING.
+%%=================================================================
+encode_bin_bit_string(C,{Unused,BinBits},_NamedBitList,DoTag)->
+ case get_constraint(C,'SizeConstraint') of
+ no ->
+ remove_unused_then_dotag(DoTag,?N_BIT_STRING,Unused,BinBits);
+ {_Min,Max} ->
+ BBLen = (size(BinBits)*8)-Unused,
+ if
+ BBLen > Max ->
+ exit({error,{asn1,
+ {bitstring_length,
+ {{was,BBLen},{maximum,Max}}}}});
+ true ->
+ remove_unused_then_dotag(DoTag,?N_BIT_STRING,
+ Unused,BinBits)
+ end;
+ Size ->
+ case ((size(BinBits)*8)-Unused) of
+ BBSize when BBSize =< Size ->
+ remove_unused_then_dotag(DoTag,?N_BIT_STRING,
+ Unused,BinBits);
+ BBSize ->
+ exit({error,{asn1,
+ {bitstring_length,
+ {{was,BBSize},{should_be,Size}}}}})
+ end
+ end.
+
+remove_unused_then_dotag(DoTag,StringType,Unused,BinBits) ->
+ case Unused of
+ 0 when (size(BinBits) == 0),DoTag==[] ->
+ %% time optimization of next case
+ {[StringType,1,0],3};
+ 0 when (size(BinBits) == 0) ->
+ dotag(DoTag,StringType,{<<0>>,1});
+ 0 when DoTag==[]-> % time optimization of next case
+ dotag_universal(StringType,[Unused|BinBits],size(BinBits)+1);
+% {LenEnc,Len} = encode_legth(size(BinBits)+1),
+% {[StringType,LenEnc,[Unused|BinBits]],size(BinBits)+1+Len+1};
+ 0 ->
+ dotag(DoTag,StringType,<<Unused,BinBits/binary>>);
+ Num when DoTag == [] -> % time optimization of next case
+ N = (size(BinBits)-1),
+ <<BBits:N/binary,LastByte>> = BinBits,
+ dotag_universal(StringType,
+ [Unused,BBits,(LastByte bsr Num) bsl Num],
+ size(BinBits)+1);
+% {LenEnc,Len} = encode_legth(size(BinBits)+1),
+% {[StringType,LenEnc,[Unused,BBits,(LastByte bsr Num) bsl Num],
+% 1+Len+size(BinBits)+1};
+ Num ->
+ N = (size(BinBits)-1),
+ <<BBits:N/binary,LastByte>> = BinBits,
+ dotag(DoTag,StringType,{[Unused,binary_to_list(BBits) ++
+ [(LastByte bsr Num) bsl Num]],
+ 1+size(BinBits)})
+ end.
+
+
+%%=================================================================
+%% Encode named bits
+%%=================================================================
+
+encode_bit_string_named(C, [FirstVal | RestVal], NamedBitList, DoTag) ->
+ {Len,Unused,OctetList} =
+ case get_constraint(C,'SizeConstraint') of
+ no ->
+ ToSetPos = get_all_bitposes([FirstVal | RestVal],
+ NamedBitList, []),
+ BitList = make_and_set_list(lists:max(ToSetPos)+1,
+ ToSetPos, 0),
+ encode_bitstring(BitList);
+ {_Min,Max} ->
+ ToSetPos = get_all_bitposes([FirstVal | RestVal],
+ NamedBitList, []),
+ BitList = make_and_set_list(Max, ToSetPos, 0),
+ encode_bitstring(BitList);
+ Size ->
+ ToSetPos = get_all_bitposes([FirstVal | RestVal],
+ NamedBitList, []),
+ BitList = make_and_set_list(Size, ToSetPos, 0),
+ encode_bitstring(BitList)
+ end,
+ case DoTag of
+ [] ->
+ dotag_universal(?N_BIT_STRING,[Unused|OctetList],Len+1);
+% {EncLen,LenLen} = encode_length(Len+1),
+% {[?N_BIT_STRING,EncLen,Unused,OctetList],1+LenLen+Len+1};
+ _ ->
+ dotag(DoTag, ?N_BIT_STRING, {[Unused|OctetList],Len+1})
+ end.
+
+
+%%----------------------------------------
+%% get_all_bitposes([list of named bits to set], named_bit_db, []) ->
+%% [sorted_list_of_bitpositions_to_set]
+%%----------------------------------------
+
+get_all_bitposes([{bit,ValPos}|Rest], NamedBitList, Ack) ->
+ get_all_bitposes(Rest, NamedBitList, [ValPos | Ack ]);
+get_all_bitposes([Val | Rest], NamedBitList, Ack) when atom(Val) ->
+ case lists:keysearch(Val, 1, NamedBitList) of
+ {value, {_ValName, ValPos}} ->
+ get_all_bitposes(Rest, NamedBitList, [ValPos | Ack]);
+ _ ->
+ exit({error,{asn1, {bitstring_namedbit, Val}}})
+ end;
+get_all_bitposes([], _NamedBitList, Ack) ->
+ lists:sort(Ack).
+
+
+%%----------------------------------------
+%% make_and_set_list(Len of list to return, [list of positions to set to 1])->
+%% returns list of Len length, with all in SetPos set.
+%% in positioning in list the first element is 0, the second 1 etc.., but
+%% Len will make a list of length Len, not Len + 1.
+%% BitList = make_and_set_list(C, ToSetPos, 0),
+%%----------------------------------------
+
+make_and_set_list(0, [], _) -> [];
+make_and_set_list(0, _, _) ->
+ exit({error,{asn1,bitstring_sizeconstraint}});
+make_and_set_list(Len, [XPos|SetPos], XPos) ->
+ [1 | make_and_set_list(Len - 1, SetPos, XPos + 1)];
+make_and_set_list(Len, [Pos|SetPos], XPos) ->
+ [0 | make_and_set_list(Len - 1, [Pos | SetPos], XPos + 1)];
+make_and_set_list(Len, [], XPos) ->
+ [0 | make_and_set_list(Len - 1, [], XPos + 1)].
+
+
+
+
+
+
+%%=================================================================
+%% Encode bit string for lists of ones and zeroes
+%%=================================================================
+encode_bit_string_bits(C, BitListVal, _NamedBitList, DoTag) when list(BitListVal) ->
+ {Len,Unused,OctetList} =
+ case get_constraint(C,'SizeConstraint') of
+ no ->
+ encode_bitstring(BitListVal);
+ Constr={Min,Max} when integer(Min),integer(Max) ->
+ encode_constr_bit_str_bits(Constr,BitListVal,DoTag);
+ {Constr={_,_},[]} ->
+ %% constraint with extension mark
+ encode_constr_bit_str_bits(Constr,BitListVal,DoTag);
+ Constr={{_,_},{_,_}} ->%{{Min1,Max1},{Min2,Max2}}
+ %% constraint with extension mark
+ encode_constr_bit_str_bits(Constr,BitListVal,DoTag);
+ Size ->
+ case length(BitListVal) of
+ BitSize when BitSize == Size ->
+ encode_bitstring(BitListVal);
+ BitSize when BitSize < Size ->
+ PaddedList =
+ pad_bit_list(Size-BitSize,BitListVal),
+ encode_bitstring(PaddedList);
+ BitSize ->
+ exit({error,
+ {asn1,
+ {bitstring_length,
+ {{was,BitSize},
+ {should_be,Size}}}}})
+ end
+ end,
+ %%add unused byte to the Len
+ case DoTag of
+ [] ->
+ dotag_universal(?N_BIT_STRING,[Unused|OctetList],Len+1);
+% {EncLen,LenLen}=encode_length(Len+1),
+% {[?N_BIT_STRING,EncLen,Unused|OctetList],1+LenLen+Len+1};
+ _ ->
+ dotag(DoTag, ?N_BIT_STRING,
+ {[Unused | OctetList],Len+1})
+ end.
+
+
+encode_constr_bit_str_bits({_Min,Max},BitListVal,_DoTag) ->
+ BitLen = length(BitListVal),
+ if
+ BitLen > Max ->
+ exit({error,{asn1,{bitstring_length,{{was,BitLen},
+ {maximum,Max}}}}});
+ true ->
+ encode_bitstring(BitListVal)
+ end;
+encode_constr_bit_str_bits({{_Min1,Max1},{Min2,Max2}},BitListVal,_DoTag) ->
+ BitLen = length(BitListVal),
+ case BitLen of
+ Len when Len > Max2 ->
+ exit({error,{asn1,{bitstring_length,{{was,BitLen},
+ {maximum,Max2}}}}});
+ Len when Len > Max1, Len < Min2 ->
+ exit({error,{asn1,{bitstring_length,{{was,BitLen},
+ {not_allowed_interval,
+ Max1,Min2}}}}});
+ _ ->
+ encode_bitstring(BitListVal)
+ end.
+
+%% returns a list of length Size + length(BitListVal), with BitListVal
+%% as the most significant elements followed by padded zero elements
+pad_bit_list(Size,BitListVal) ->
+ Tail = lists:duplicate(Size,0),
+ lists:append(BitListVal,Tail).
+
+%%=================================================================
+%% Do the actual encoding
+%% ([bitlist]) -> {ListLen, UnusedBits, OctetList}
+%%=================================================================
+
+encode_bitstring([B8, B7, B6, B5, B4, B3, B2, B1 | Rest]) ->
+ Val = (B8 bsl 7) bor (B7 bsl 6) bor (B6 bsl 5) bor (B5 bsl 4) bor
+ (B4 bsl 3) bor (B3 bsl 2) bor (B2 bsl 1) bor B1,
+ encode_bitstring(Rest, [Val], 1);
+encode_bitstring(Val) ->
+ {Unused, Octet} = unused_bitlist(Val, 7, 0),
+ {1, Unused, [Octet]}.
+
+encode_bitstring([B8, B7, B6, B5, B4, B3, B2, B1 | Rest], Ack, Len) ->
+ Val = (B8 bsl 7) bor (B7 bsl 6) bor (B6 bsl 5) bor (B5 bsl 4) bor
+ (B4 bsl 3) bor (B3 bsl 2) bor (B2 bsl 1) bor B1,
+ encode_bitstring(Rest, [Ack | [Val]], Len + 1);
+%%even multiple of 8 bits..
+encode_bitstring([], Ack, Len) ->
+ {Len, 0, Ack};
+%% unused bits in last octet
+encode_bitstring(Rest, Ack, Len) ->
+% io:format("uneven ~w ~w ~w~n",[Rest, Ack, Len]),
+ {Unused, Val} = unused_bitlist(Rest, 7, 0),
+ {Len + 1, Unused, [Ack | [Val]]}.
+
+%%%%%%%%%%%%%%%%%%
+%% unused_bitlist([list of ones and zeros <= 7], 7, []) ->
+%% {Unused bits, Last octet with bits moved to right}
+unused_bitlist([], Trail, Ack) ->
+ {Trail + 1, Ack};
+unused_bitlist([Bit | Rest], Trail, Ack) ->
+%% io:format("trail Bit: ~w Rest: ~w Trail: ~w Ack:~w~n",[Bit, Rest, Trail, Ack]),
+ unused_bitlist(Rest, Trail - 1, (Bit bsl Trail) bor Ack).
+
+
+%%============================================================================
+%% decode bitstring value
+%% (Buffer, Range, NamedNumberList, HasTag, TotalLen) -> {Integer, Remain, RemovedBytes}
+%%============================================================================
+
+decode_compact_bit_string(Buffer, Range, NamedNumberList, Tags, LenIn, OptOrMand) ->
+% NewTags = new_tags(HasTag,#tag{class=?UNIVERSAL,number=?N_BIT_STRING}),
+ decode_restricted_string(Buffer, Range, ?N_BIT_STRING, Tags, LenIn,
+ NamedNumberList, OptOrMand,bin).
+
+decode_bit_string(Buffer, Range, NamedNumberList, Tags, LenIn, OptOrMand) ->
+% NewTags = new_tags(HasTag,#tag{class=?UNIVERSAL,number=?N_BIT_STRING}),
+ decode_restricted_string(Buffer, Range, ?N_BIT_STRING, Tags, LenIn,
+ NamedNumberList, OptOrMand,old).
+
+
+decode_bit_string2(1,<<0 ,Buffer/binary>>,_NamedNumberList,RemovedBytes,BinOrOld) ->
+ case BinOrOld of
+ bin ->
+ {{0,<<>>},Buffer,RemovedBytes};
+ _ ->
+ {[], Buffer, RemovedBytes}
+ end;
+decode_bit_string2(Len,<<Unused,Buffer/binary>>,NamedNumberList,
+ RemovedBytes,BinOrOld) ->
+ L = Len - 1,
+ <<Bits:L/binary,BufferTail/binary>> = Buffer,
+ case NamedNumberList of
+ [] ->
+ case BinOrOld of
+ bin ->
+ {{Unused,Bits},BufferTail,RemovedBytes};
+ _ ->
+ BitString = decode_bitstring2(L, Unused, Buffer),
+ {BitString,BufferTail, RemovedBytes}
+ end;
+ _ ->
+ BitString = decode_bitstring2(L, Unused, Buffer),
+ {decode_bitstring_NNL(BitString,NamedNumberList),
+ BufferTail,
+ RemovedBytes}
+ end.
+
+%%----------------------------------------
+%% Decode the in buffer to bits
+%%----------------------------------------
+decode_bitstring2(1,Unused,<<B7:1,B6:1,B5:1,B4:1,B3:1,B2:1,B1:1,B0:1,_/binary>>) ->
+ lists:sublist([B7,B6,B5,B4,B3,B2,B1,B0],8-Unused);
+decode_bitstring2(Len, Unused,
+ <<B7:1,B6:1,B5:1,B4:1,B3:1,B2:1,B1:1,B0:1,Buffer/binary>>) ->
+ [B7, B6, B5, B4, B3, B2, B1, B0 |
+ decode_bitstring2(Len - 1, Unused, Buffer)].
+
+%%decode_bitstring2(1, Unused, Buffer) ->
+%% make_bits_of_int(hd(Buffer), 128, 8-Unused);
+%%decode_bitstring2(Len, Unused, [BitVal | Buffer]) ->
+%% [B7, B6, B5, B4, B3, B2, B1, B0] = make_bits_of_int(BitVal, 128, 8),
+%% [B7, B6, B5, B4, B3, B2, B1, B0 |
+%% decode_bitstring2(Len - 1, Unused, Buffer)].
+
+
+%%make_bits_of_int(_, _, 0) ->
+%% [];
+%%make_bits_of_int(BitVal, MaskVal, Unused) when Unused > 0 ->
+%% X = case MaskVal band BitVal of
+%% 0 -> 0 ;
+%% _ -> 1
+%% end,
+%% [X | make_bits_of_int(BitVal, MaskVal bsr 1, Unused - 1)].
+
+
+
+%%----------------------------------------
+%% Decode the bitlist to names
+%%----------------------------------------
+
+
+decode_bitstring_NNL(BitList,NamedNumberList) ->
+ decode_bitstring_NNL(BitList,NamedNumberList,0,[]).
+
+
+decode_bitstring_NNL([],_,_No,Result) ->
+ lists:reverse(Result);
+
+decode_bitstring_NNL([B|BitList],[{Name,No}|NamedNumberList],No,Result) ->
+ if
+ B == 0 ->
+ decode_bitstring_NNL(BitList,NamedNumberList,No+1,Result);
+ true ->
+ decode_bitstring_NNL(BitList,NamedNumberList,No+1,[Name|Result])
+ end;
+decode_bitstring_NNL([1|BitList],NamedNumberList,No,Result) ->
+ decode_bitstring_NNL(BitList,NamedNumberList,No+1,[{bit,No}|Result]);
+decode_bitstring_NNL([0|BitList],NamedNumberList,No,Result) ->
+ decode_bitstring_NNL(BitList,NamedNumberList,No+1,Result).
+
+
+%%============================================================================
+%% Octet string, ITU_T X.690 Chapter 8.7
+%%
+%% encode octet string
+%% The OctetList must be a flat list of integers in the range 0..255
+%% the function does not check this because it takes to much time
+%%============================================================================
+encode_octet_string(_C, OctetList, []) when binary(OctetList) ->
+ dotag_universal(?N_OCTET_STRING,OctetList,size(OctetList));
+encode_octet_string(_C, OctetList, DoTag) when binary(OctetList) ->
+ dotag(DoTag, ?N_OCTET_STRING, {OctetList,size(OctetList)});
+encode_octet_string(_C, OctetList, DoTag) when list(OctetList) ->
+ case length(OctetList) of
+ Len when DoTag == [] ->
+ dotag_universal(?N_OCTET_STRING,OctetList,Len);
+ Len ->
+ dotag(DoTag, ?N_OCTET_STRING, {OctetList,Len})
+ end;
+% encode_octet_string(C, OctetList, DoTag) when list(OctetList) ->
+% dotag(DoTag, ?N_OCTET_STRING, {OctetList,length(OctetList)});
+encode_octet_string(C, {Name,OctetList}, DoTag) when atom(Name) ->
+ encode_octet_string(C, OctetList, DoTag).
+
+
+%%============================================================================
+%% decode octet string
+%% (Buffer, Range, HasTag, TotalLen) -> {String, Remain, RemovedBytes}
+%%
+%% Octet string is decoded as a restricted string
+%%============================================================================
+decode_octet_string(Buffer, Range, Tags, TotalLen, OptOrMand) ->
+% NewTags = new_tags(HasTag,#tag{class=?UNIVERSAL,number=?N_OCTET_STRING}),
+ decode_restricted_string(Buffer, Range, ?N_OCTET_STRING,
+ Tags, TotalLen, [], OptOrMand,old).
+
+%%============================================================================
+%% Null value, ITU_T X.690 Chapter 8.8
+%%
+%% encode NULL value
+%%============================================================================
+
+encode_null(_, []) ->
+ {[?N_NULL,0],2};
+encode_null(_, DoTag) ->
+ dotag(DoTag, ?N_NULL, {[],0}).
+
+%%============================================================================
+%% decode NULL value
+%% (Buffer, HasTag, TotalLen) -> {NULL, Remain, RemovedBytes}
+%%============================================================================
+decode_null(Buffer, Tags, OptOrMand) ->
+ NewTags = new_tags(Tags,#tag{class=?UNIVERSAL,number=?N_NULL}),
+ decode_null_notag(Buffer, NewTags, OptOrMand).
+
+decode_null_notag(Buffer, Tags, OptOrMand) ->
+ {RestTags, {FormLen, Buffer0, Rb0}} =
+ check_tags_i(Tags, Buffer, OptOrMand),
+
+ case FormLen of
+ {?CONSTRUCTED,Len} ->
+ {_Buffer00,RestBytes} = split_list(Buffer0,Len),
+ {Val01, Buffer01, Rb01} = decode_null_notag(Buffer0, RestTags,
+ OptOrMand),
+ {Buffer02, Rb02} = restbytes2(RestBytes,Buffer01,noext),
+ {Val01, Buffer02, Rb0+Rb01+Rb02};
+ {_,0} ->
+ {'NULL', Buffer0, Rb0};
+ {_,Len} ->
+ exit({error,{asn1,{invalid_length,'NULL',Len}}})
+ end.
+
+
+%%============================================================================
+%% Object identifier, ITU_T X.690 Chapter 8.19
+%%
+%% encode Object Identifier value
+%%============================================================================
+
+encode_object_identifier({Name,Val}, DoTag) when atom(Name) ->
+ encode_object_identifier(Val, DoTag);
+encode_object_identifier(Val, []) ->
+ {EncVal,Len} = e_object_identifier(Val),
+ dotag_universal(?N_OBJECT_IDENTIFIER,EncVal,Len);
+encode_object_identifier(Val, DoTag) ->
+ dotag(DoTag, ?N_OBJECT_IDENTIFIER, e_object_identifier(Val)).
+
+e_object_identifier({'OBJECT IDENTIFIER', V}) ->
+ e_object_identifier(V);
+e_object_identifier({Cname, V}) when atom(Cname), tuple(V) ->
+ e_object_identifier(tuple_to_list(V));
+e_object_identifier({Cname, V}) when atom(Cname), list(V) ->
+ e_object_identifier(V);
+e_object_identifier(V) when tuple(V) ->
+ e_object_identifier(tuple_to_list(V));
+
+%%%%%%%%%%%%%%%
+%% e_object_identifier([List of Obect Identifiers]) ->
+%% {[Encoded Octetlist of ObjIds], IntLength}
+%%
+e_object_identifier([E1, E2 | Tail]) ->
+ Head = 40*E1 + E2, % wow!
+ {H,Lh} = mk_object_val(Head),
+ {R,Lr} = enc_obj_id_tail(Tail, [], 0),
+ {[H|R], Lh+Lr}.
+
+enc_obj_id_tail([], Ack, Len) ->
+ {lists:reverse(Ack), Len};
+enc_obj_id_tail([H|T], Ack, Len) ->
+ {B, L} = mk_object_val(H),
+ enc_obj_id_tail(T, [B|Ack], Len+L).
+
+%% e_object_identifier([List of Obect Identifiers]) ->
+%% {[Encoded Octetlist of ObjIds], IntLength}
+%%
+%%e_object_identifier([E1, E2 | Tail]) ->
+%% Head = 40*E1 + E2, % wow!
+%% F = fun(Val, AckLen) ->
+%% {L, Ack} = mk_object_val(Val),
+%% {L, Ack + AckLen}
+%% end,
+%% {Octets, Len} = lists:mapfoldl(F, 0, [Head | Tail]).
+
+%%%%%%%%%%%
+%% mk_object_val(Value) -> {OctetList, Len}
+%% returns a Val as a list of octets, the 8 bit is allways set to one except
+%% for the last octet, where its 0
+%%
+
+
+mk_object_val(Val) when Val =< 127 ->
+ {[255 band Val], 1};
+mk_object_val(Val) ->
+ mk_object_val(Val bsr 7, [Val band 127], 1).
+mk_object_val(0, Ack, Len) ->
+ {Ack, Len};
+mk_object_val(Val, Ack, Len) ->
+ mk_object_val(Val bsr 7, [((Val band 127) bor 128) | Ack], Len + 1).
+
+
+
+%%============================================================================
+%% decode Object Identifier value
+%% (Buffer, HasTag, TotalLen) -> {{ObjId}, Remain, RemovedBytes}
+%%============================================================================
+
+decode_object_identifier(Buffer, Tags, OptOrMand) ->
+ NewTags = new_tags(Tags,#tag{class=?UNIVERSAL,
+ number=?N_OBJECT_IDENTIFIER}),
+ decode_object_identifier_notag(Buffer, NewTags, OptOrMand).
+
+decode_object_identifier_notag(Buffer, Tags, OptOrMand) ->
+ {RestTags, {FormLen, Buffer0, Rb0}} =
+ check_tags_i(Tags, Buffer, OptOrMand),
+
+ case FormLen of
+ {?CONSTRUCTED,Len} ->
+ {Buffer00,RestBytes} = split_list(Buffer0,Len),
+ {Val01, Buffer01, Rb01} =
+ decode_object_identifier_notag(Buffer00,
+ RestTags, OptOrMand),
+ {Buffer02, Rb02} = restbytes2(RestBytes,Buffer01,noext),
+ {Val01, Buffer02, Rb0+Rb01+Rb02};
+ {_,Len} ->
+ {[AddedObjVal|ObjVals],Buffer01} =
+ dec_subidentifiers(Buffer0,0,[],Len),
+ {Val1, Val2} = if
+ AddedObjVal < 40 ->
+ {0, AddedObjVal};
+ AddedObjVal < 80 ->
+ {1, AddedObjVal - 40};
+ true ->
+ {2, AddedObjVal - 80}
+ end,
+ {list_to_tuple([Val1, Val2 | ObjVals]), Buffer01,
+ Rb0+Len}
+ end.
+
+dec_subidentifiers(Buffer,_Av,Al,0) ->
+ {lists:reverse(Al),Buffer};
+dec_subidentifiers(<<1:1,H:7,T/binary>>,Av,Al,Len) ->
+ dec_subidentifiers(T,(Av bsl 7) + H,Al,Len-1);
+dec_subidentifiers(<<H,T/binary>>,Av,Al,Len) ->
+ dec_subidentifiers(T,0,[((Av bsl 7) + H)|Al],Len-1).
+
+
+%%dec_subidentifiers(Buffer,Av,Al,0) ->
+%% {lists:reverse(Al),Buffer};
+%%dec_subidentifiers([H|T],Av,Al,Len) when H >=16#80 ->
+%% dec_subidentifiers(T,(Av bsl 7) + (H band 16#7F),Al,Len-1);
+%%dec_subidentifiers([H|T],Av,Al,Len) ->
+%% dec_subidentifiers(T,0,[(Av bsl 7) + H |Al],Len-1).
+
+
+%%============================================================================
+%% Restricted character string types, ITU_T X.690 Chapter 8.20
+%%
+%% encode Numeric Printable Teletex Videotex Visible IA5 Graphic General strings
+%%============================================================================
+encode_restricted_string(_C, OctetList, StringType, [])
+ when binary(OctetList) ->
+ dotag_universal(StringType,OctetList,size(OctetList));
+encode_restricted_string(_C, OctetList, StringType, DoTag)
+ when binary(OctetList) ->
+ dotag(DoTag, StringType, {OctetList, size(OctetList)});
+encode_restricted_string(_C, OctetList, StringType, [])
+ when list(OctetList) ->
+ dotag_universal(StringType,OctetList,length(OctetList));
+encode_restricted_string(_C, OctetList, StringType, DoTag)
+ when list(OctetList) ->
+ dotag(DoTag, StringType, {OctetList, length(OctetList)});
+encode_restricted_string(C,{Name,OctetL},StringType,DoTag) when atom(Name)->
+ encode_restricted_string(C, OctetL, StringType, DoTag).
+
+%%============================================================================
+%% decode Numeric Printable Teletex Videotex Visible IA5 Graphic General strings
+%% (Buffer, Range, StringType, HasTag, TotalLen) ->
+%% {String, Remain, RemovedBytes}
+%%============================================================================
+
+decode_restricted_string(Buffer, Range, StringType, Tags, LenIn, OptOrMand) ->
+ {Val,Buffer2,Rb} =
+ decode_restricted_string_tag(Buffer, Range, StringType, Tags,
+ LenIn, [], OptOrMand,old),
+ {check_and_convert_restricted_string(Val,StringType,Range,[],old),
+ Buffer2,Rb}.
+
+
+decode_restricted_string(Buffer, Range, StringType, Tags, LenIn, NNList, OptOrMand, BinOrOld ) ->
+ {Val,Buffer2,Rb} =
+ decode_restricted_string_tag(Buffer, Range, StringType, Tags,
+ LenIn, NNList, OptOrMand, BinOrOld),
+ {check_and_convert_restricted_string(Val,StringType,Range,NNList,BinOrOld),
+ Buffer2,Rb}.
+
+decode_restricted_string_tag(Buffer, Range, StringType, TagsIn, LenIn, NNList, OptOrMand, BinOrOld ) ->
+ NewTags = new_tags(TagsIn, #tag{class=?UNIVERSAL,number=StringType}),
+ decode_restricted_string_notag(Buffer, Range, StringType, NewTags,
+ LenIn, NNList, OptOrMand, BinOrOld).
+
+
+
+
+check_and_convert_restricted_string(Val,StringType,Range,NamedNumberList,_BinOrOld) ->
+ {StrLen,NewVal} = case StringType of
+ ?N_BIT_STRING when NamedNumberList /= [] ->
+ {no_check,Val};
+ ?N_BIT_STRING when list(Val) ->
+ {length(Val),Val};
+ ?N_BIT_STRING when tuple(Val) ->
+ {(size(element(2,Val))*8) - element(1,Val),Val};
+ _ when binary(Val) ->
+ {size(Val),binary_to_list(Val)};
+ _ when list(Val) ->
+ {length(Val), Val}
+ end,
+ case Range of
+ _ when StrLen == no_check ->
+ NewVal;
+ [] -> % No length constraint
+ NewVal;
+ {Lb,Ub} when StrLen >= Lb, Ub >= StrLen -> % variable length constraint
+ NewVal;
+ {{Lb,_Ub},[]} when StrLen >= Lb ->
+ NewVal;
+ {{Lb1,Ub1},{Lb2,Ub2}} when StrLen >= Lb1, StrLen =< Ub1;
+ StrLen =< Ub2, StrLen >= Lb2 ->
+ NewVal;
+ StrLen -> % fixed length constraint
+ NewVal;
+ {_,_} ->
+ exit({error,{asn1,{length,Range,Val}}});
+ _Len when integer(_Len) ->
+ exit({error,{asn1,{length,Range,Val}}});
+ _ -> % some strange constraint that we don't support yet
+ NewVal
+ end.
+
+
+%%=============================================================================
+%% Common routines for several string types including bit string
+%% handles indefinite length
+%%=============================================================================
+
+
+decode_restricted_string_notag(Buffer, _Range, StringType, TagsIn,
+ _, NamedNumberList, OptOrMand,BinOrOld) ->
+ %%-----------------------------------------------------------
+ %% Get inner (the implicit tag or no tag) and
+ %% outer (the explicit tag) lengths.
+ %%-----------------------------------------------------------
+ {RestTags, {FormLength={_,_Len01}, Buffer0, Rb0}} =
+ check_tags_i(TagsIn, Buffer, OptOrMand),
+
+ case FormLength of
+ {?CONSTRUCTED,Len} ->
+ {Buffer00, RestBytes} = split_list(Buffer0,Len),
+ {Val01, Buffer01, Rb01} =
+ decode_restricted_parts(Buffer00, RestBytes, [], StringType,
+ RestTags,
+ Len, NamedNumberList,
+ OptOrMand,
+ BinOrOld, 0, []),
+ {Val01, Buffer01, Rb0+Rb01};
+ {_, Len} ->
+ {Val01, Buffer01, Rb01} =
+ decode_restricted(Buffer0, Len, StringType,
+ NamedNumberList, BinOrOld),
+ {Val01, Buffer01, Rb0+Rb01}
+ end.
+
+
+decode_restricted_parts(Buffer, RestBytes, [], StringType, RestTags, Len, NNList,
+ OptOrMand, BinOrOld, AccRb, AccVal) ->
+ DecodeFun = case RestTags of
+ [] -> fun decode_restricted_string_tag/8;
+ _ -> fun decode_restricted_string_notag/8
+ end,
+ {Val, Buffer1, Rb} =
+ DecodeFun(Buffer, [], StringType, RestTags,
+ no_length, NNList,
+ OptOrMand, BinOrOld),
+ {Buffer2,More} =
+ case Buffer1 of
+ <<0,0,Buffer10/binary>> when Len == indefinite ->
+ {Buffer10,false};
+ <<>> ->
+ {RestBytes,false};
+ _ ->
+ {Buffer1,true}
+ end,
+ {NewVal, NewRb} =
+ case StringType of
+ ?N_BIT_STRING when BinOrOld == bin ->
+ {concat_bit_binaries(AccVal, Val), AccRb+Rb};
+ _ when binary(Val),binary(AccVal) ->
+ {<<AccVal/binary,Val/binary>>,AccRb+Rb};
+ _ when binary(Val), AccVal==[] ->
+ {Val,AccRb+Rb};
+ _ ->
+ {AccVal++Val, AccRb+Rb}
+ end,
+ case More of
+ false ->
+ {NewVal, Buffer2, NewRb};
+ true ->
+ decode_restricted_parts(Buffer2, RestBytes, [], StringType, RestTags, Len, NNList,
+ OptOrMand, BinOrOld, NewRb, NewVal)
+ end.
+
+
+
+decode_restricted(Buffer, InnerLen, StringType, NamedNumberList,BinOrOld) ->
+
+ case StringType of
+ ?N_BIT_STRING ->
+ decode_bit_string2(InnerLen,Buffer,NamedNumberList,InnerLen,BinOrOld);
+
+ ?N_UniversalString ->
+ <<PreBuff:InnerLen/binary,RestBuff/binary>> = Buffer,%%added for binary
+ UniString = mk_universal_string(binary_to_list(PreBuff)),
+ {UniString,RestBuff,InnerLen};
+ ?N_BMPString ->
+ <<PreBuff:InnerLen/binary,RestBuff/binary>> = Buffer,%%added for binary
+ BMP = mk_BMP_string(binary_to_list(PreBuff)),
+ {BMP,RestBuff,InnerLen};
+ _ ->
+ <<PreBuff:InnerLen/binary,RestBuff/binary>> = Buffer,%%added for binary
+ {PreBuff, RestBuff, InnerLen}
+ end.
+
+
+
+%%============================================================================
+%% encode Universal string
+%%============================================================================
+
+encode_universal_string(C, {Name, Universal}, DoTag) when atom(Name) ->
+ encode_universal_string(C, Universal, DoTag);
+encode_universal_string(_C, Universal, []) ->
+ OctetList = mk_uni_list(Universal),
+ dotag_universal(?N_UniversalString,OctetList,length(OctetList));
+encode_universal_string(_C, Universal, DoTag) ->
+ OctetList = mk_uni_list(Universal),
+ dotag(DoTag, ?N_UniversalString, {OctetList,length(OctetList)}).
+
+mk_uni_list(In) ->
+ mk_uni_list(In,[]).
+
+mk_uni_list([],List) ->
+ lists:reverse(List);
+mk_uni_list([{A,B,C,D}|T],List) ->
+ mk_uni_list(T,[D,C,B,A|List]);
+mk_uni_list([H|T],List) ->
+ mk_uni_list(T,[H,0,0,0|List]).
+
+%%===========================================================================
+%% decode Universal strings
+%% (Buffer, Range, StringType, HasTag, LenIn) ->
+%% {String, Remain, RemovedBytes}
+%%===========================================================================
+
+decode_universal_string(Buffer, Range, Tags, LenIn, OptOrMand) ->
+% NewTags = new_tags(HasTag, #tag{class=?UNIVERSAL,number=?N_UniversalString}),
+ decode_restricted_string(Buffer, Range, ?N_UniversalString,
+ Tags, LenIn, [], OptOrMand,old).
+
+
+mk_universal_string(In) ->
+ mk_universal_string(In,[]).
+
+mk_universal_string([],Acc) ->
+ lists:reverse(Acc);
+mk_universal_string([0,0,0,D|T],Acc) ->
+ mk_universal_string(T,[D|Acc]);
+mk_universal_string([A,B,C,D|T],Acc) ->
+ mk_universal_string(T,[{A,B,C,D}|Acc]).
+
+
+%%============================================================================
+%% encode BMP string
+%%============================================================================
+
+encode_BMP_string(C, {Name,BMPString}, DoTag) when atom(Name)->
+ encode_BMP_string(C, BMPString, DoTag);
+encode_BMP_string(_C, BMPString, []) ->
+ OctetList = mk_BMP_list(BMPString),
+ dotag_universal(?N_BMPString,OctetList,length(OctetList));
+encode_BMP_string(_C, BMPString, DoTag) ->
+ OctetList = mk_BMP_list(BMPString),
+ dotag(DoTag, ?N_BMPString, {OctetList,length(OctetList)}).
+
+mk_BMP_list(In) ->
+ mk_BMP_list(In,[]).
+
+mk_BMP_list([],List) ->
+ lists:reverse(List);
+mk_BMP_list([{0,0,C,D}|T],List) ->
+ mk_BMP_list(T,[D,C|List]);
+mk_BMP_list([H|T],List) ->
+ mk_BMP_list(T,[H,0|List]).
+
+%%============================================================================
+%% decode (OctetList, Range(ignored), tag|notag) -> {ValList, RestList}
+%% (Buffer, Range, StringType, HasTag, TotalLen) ->
+%% {String, Remain, RemovedBytes}
+%%============================================================================
+decode_BMP_string(Buffer, Range, Tags, LenIn, OptOrMand) ->
+% NewTags = new_tags(HasTag, #tag{class=?UNIVERSAL,number=?N_BMPString}),
+ decode_restricted_string(Buffer, Range, ?N_BMPString,
+ Tags, LenIn, [], OptOrMand,old).
+
+mk_BMP_string(In) ->
+ mk_BMP_string(In,[]).
+
+mk_BMP_string([],US) ->
+ lists:reverse(US);
+mk_BMP_string([0,B|T],US) ->
+ mk_BMP_string(T,[B|US]);
+mk_BMP_string([C,D|T],US) ->
+ mk_BMP_string(T,[{0,0,C,D}|US]).
+
+
+%%============================================================================
+%% Generalized time, ITU_T X.680 Chapter 39
+%%
+%% encode Generalized time
+%%============================================================================
+
+encode_generalized_time(C, {Name,OctetList}, DoTag) when atom(Name) ->
+ encode_generalized_time(C, OctetList, DoTag);
+encode_generalized_time(_C, OctetList, []) ->
+ dotag_universal(?N_GeneralizedTime,OctetList,length(OctetList));
+encode_generalized_time(_C, OctetList, DoTag) ->
+ dotag(DoTag, ?N_GeneralizedTime, {OctetList,length(OctetList)}).
+
+%%============================================================================
+%% decode Generalized time
+%% (Buffer, Range, HasTag, TotalLen) -> {String, Remain, RemovedBytes}
+%%============================================================================
+
+decode_generalized_time(Buffer, Range, Tags, TotalLen, OptOrMand) ->
+ NewTags = new_tags(Tags,#tag{class=?UNIVERSAL,
+ number=?N_GeneralizedTime}),
+ decode_generalized_time_notag(Buffer, Range, NewTags, TotalLen, OptOrMand).
+
+decode_generalized_time_notag(Buffer, Range, Tags, TotalLen, OptOrMand) ->
+ {RestTags, {FormLen, Buffer0, Rb0}} =
+ check_tags_i(Tags, Buffer, OptOrMand),
+
+ case FormLen of
+ {?CONSTRUCTED,Len} ->
+ {Buffer00,RestBytes} = split_list(Buffer0,Len),
+ {Val01, Buffer01, Rb01} =
+ decode_generalized_time_notag(Buffer00, Range,
+ RestTags, TotalLen,
+ OptOrMand),
+ {Buffer02, Rb02} = restbytes2(RestBytes,Buffer01,noext),
+ {Val01, Buffer02, Rb0+Rb01+Rb02};
+ {_,Len} ->
+ <<PreBuff:Len/binary,RestBuff/binary>> = Buffer0,
+ {binary_to_list(PreBuff), RestBuff, Rb0+Len}
+ end.
+
+%%============================================================================
+%% Universal time, ITU_T X.680 Chapter 40
+%%
+%% encode UTC time
+%%============================================================================
+
+encode_utc_time(C, {Name,OctetList}, DoTag) when atom(Name) ->
+ encode_utc_time(C, OctetList, DoTag);
+encode_utc_time(_C, OctetList, []) ->
+ dotag_universal(?N_UTCTime, OctetList,length(OctetList));
+encode_utc_time(_C, OctetList, DoTag) ->
+ dotag(DoTag, ?N_UTCTime, {OctetList,length(OctetList)}).
+
+%%============================================================================
+%% decode UTC time
+%% (Buffer, Range, HasTag, TotalLen) -> {String, Remain, RemovedBytes}
+%%============================================================================
+
+decode_utc_time(Buffer, Range, Tags, TotalLen, OptOrMand) ->
+ NewTags = new_tags(Tags,#tag{class=?UNIVERSAL,number=?N_UTCTime}),
+ decode_utc_time_notag(Buffer, Range, NewTags, TotalLen, OptOrMand).
+
+decode_utc_time_notag(Buffer, Range, Tags, TotalLen, OptOrMand) ->
+ {RestTags, {FormLen, Buffer0, Rb0}} =
+ check_tags_i(Tags, Buffer, OptOrMand),
+
+ case FormLen of
+ {?CONSTRUCTED,Len} ->
+ {Buffer00,RestBytes} = split_list(Buffer0,Len),
+ {Val01, Buffer01, Rb01} =
+ decode_utc_time_notag(Buffer00, Range,
+ RestTags, TotalLen,
+ OptOrMand),
+ {Buffer02, Rb02} = restbytes2(RestBytes,Buffer01,noext),
+ {Val01, Buffer02, Rb0+Rb01+Rb02};
+ {_,Len} ->
+ <<PreBuff:Len/binary,RestBuff/binary>> = Buffer0,
+ {binary_to_list(PreBuff), RestBuff, Rb0+Len}
+ end.
+
+
+%%============================================================================
+%% Length handling
+%%
+%% Encode length
+%%
+%% encode_length(Int | indefinite) ->
+%% [<127]| [128 + Int (<127),OctetList] | [16#80]
+%%============================================================================
+
+encode_length(indefinite) ->
+ {[16#80],1}; % 128
+encode_length(L) when L =< 16#7F ->
+ {[L],1};
+encode_length(L) ->
+ Oct = minimum_octets(L),
+ Len = length(Oct),
+ if
+ Len =< 126 ->
+ {[ (16#80+Len) | Oct ],Len+1};
+ true ->
+ exit({error,{asn1, to_long_length_oct, Len}})
+ end.
+
+
+%% Val must be >= 0
+minimum_octets(Val) ->
+ minimum_octets(Val,[]).
+
+minimum_octets(0,Acc) ->
+ Acc;
+minimum_octets(Val, Acc) ->
+ minimum_octets((Val bsr 8),[Val band 16#FF | Acc]).
+
+
+%%===========================================================================
+%% Decode length
+%%
+%% decode_length(OctetList) -> {{indefinite, RestOctetsL}, NoRemovedBytes} |
+%% {{Length, RestOctetsL}, NoRemovedBytes}
+%%===========================================================================
+
+decode_length(<<1:1,0:7,T/binary>>) ->
+ {{indefinite, T}, 1};
+decode_length(<<0:1,Length:7,T/binary>>) ->
+ {{Length,T},1};
+decode_length(<<1:1,LL:7,T/binary>>) ->
+ <<Length:LL/unit:8,Rest/binary>> = T,
+ {{Length,Rest}, LL+1}.
+
+%decode_length([128 | T]) ->
+% {{indefinite, T},1};
+%decode_length([H | T]) when H =< 127 ->
+% {{H, T},1};
+%decode_length([H | T]) ->
+% dec_long_length(H band 16#7F, T, 0, 1).
+
+
+%%dec_long_length(0, Buffer, Acc, Len) ->
+%% {{Acc, Buffer},Len};
+%%dec_long_length(Bytes, [H | T], Acc, Len) ->
+%% dec_long_length(Bytes - 1, T, (Acc bsl 8) + H, Len+1).
+
+%%===========================================================================
+%% Decode tag and length
+%%
+%% decode_tag_and_length(Buffer) -> {Tag, Len, RemainingBuffer, RemovedBytes}
+%%
+%%===========================================================================
+
+decode_tag_and_length(Buffer) ->
+ {Tag, Buffer2, RemBytesTag} = decode_tag(Buffer),
+ {{Len, Buffer3}, RemBytesLen} = decode_length(Buffer2),
+ {Tag, Len, Buffer3, RemBytesTag+RemBytesLen}.
+
+
+%%============================================================================
+%% Check if valid tag
+%%
+%% check_if_valid_tag(Tag, List_of_valid_tags, OptOrMand) -> name of the tag
+%%===============================================================================
+
+check_if_valid_tag(<<0,0,_/binary>>,_,_) ->
+ asn1_EOC;
+check_if_valid_tag(<<>>, _, OptOrMand) ->
+ check_if_valid_tag2(false,[],[],OptOrMand);
+check_if_valid_tag(Bytes, ListOfTags, OptOrMand) when binary(Bytes) ->
+ {Tag, _, _} = decode_tag(Bytes),
+ check_if_valid_tag(Tag, ListOfTags, OptOrMand);
+
+%% This alternative should be removed in the near future
+%% Bytes as input should be the only necessary call
+check_if_valid_tag(Tag, ListOfTags, OptOrMand) ->
+ {Class, _Form, TagNo} = Tag,
+ C = code_class(Class),
+ T = case C of
+ 'UNIVERSAL' ->
+ code_type(TagNo);
+ _ ->
+ TagNo
+ end,
+ check_if_valid_tag2({C,T}, ListOfTags, Tag, OptOrMand).
+
+check_if_valid_tag2(_Class_TagNo, [], Tag, mandatory) ->
+ exit({error,{asn1,{invalid_tag,Tag}}});
+check_if_valid_tag2(_Class_TagNo, [], Tag, _) ->
+ exit({error,{asn1,{no_optional_tag,Tag}}});
+
+check_if_valid_tag2(Class_TagNo, [{TagName,TagList}|T], Tag, OptOrMand) ->
+ case check_if_valid_tag_loop(Class_TagNo, TagList) of
+ true ->
+ TagName;
+ false ->
+ check_if_valid_tag2(Class_TagNo, T, Tag, OptOrMand)
+ end.
+
+check_if_valid_tag_loop(_Class_TagNo,[]) ->
+ false;
+check_if_valid_tag_loop(Class_TagNo,[H|T]) ->
+ %% It is not possible to distinguish between SEQUENCE OF and SEQUENCE, and
+ %% between SET OF and SET because both are coded as 16 and 17, respectively.
+ H_without_OF = case H of
+ {C, 'SEQUENCE OF'} ->
+ {C, 'SEQUENCE'};
+ {C, 'SET OF'} ->
+ {C, 'SET'};
+ Else ->
+ Else
+ end,
+
+ case H_without_OF of
+ Class_TagNo ->
+ true;
+ {_,_} ->
+ check_if_valid_tag_loop(Class_TagNo,T);
+ _ ->
+ check_if_valid_tag_loop(Class_TagNo,H),
+ check_if_valid_tag_loop(Class_TagNo,T)
+ end.
+
+
+
+code_class(0) -> 'UNIVERSAL';
+code_class(16#40) -> 'APPLICATION';
+code_class(16#80) -> 'CONTEXT';
+code_class(16#C0) -> 'PRIVATE'.
+
+
+code_type(1) -> 'BOOLEAN';
+code_type(2) -> 'INTEGER';
+code_type(3) -> 'BIT STRING';
+code_type(4) -> 'OCTET STRING';
+code_type(5) -> 'NULL';
+code_type(6) -> 'OBJECT IDENTIFIER';
+code_type(7) -> 'OBJECT DESCRIPTOR';
+code_type(8) -> 'EXTERNAL';
+code_type(9) -> 'REAL';
+code_type(10) -> 'ENUMERATED';
+code_type(11) -> 'EMBEDDED_PDV';
+code_type(16) -> 'SEQUENCE';
+code_type(16) -> 'SEQUENCE OF';
+code_type(17) -> 'SET';
+code_type(17) -> 'SET OF';
+code_type(18) -> 'NumericString';
+code_type(19) -> 'PrintableString';
+code_type(20) -> 'TeletexString';
+code_type(21) -> 'VideotexString';
+code_type(22) -> 'IA5String';
+code_type(23) -> 'UTCTime';
+code_type(24) -> 'GeneralizedTime';
+code_type(25) -> 'GraphicString';
+code_type(26) -> 'VisibleString';
+code_type(27) -> 'GeneralString';
+code_type(28) -> 'UniversalString';
+code_type(30) -> 'BMPString';
+code_type(Else) -> exit({error,{asn1,{unrecognized_type,Else}}}).
+
+%%-------------------------------------------------------------------------
+%% decoding of the components of a SET
+%%-------------------------------------------------------------------------
+
+decode_set(Rb, indefinite, <<0,0,Bytes/binary>>, _OptOrMand, _Fun3, Acc) ->
+ {lists:reverse(Acc),Bytes,Rb+2};
+
+decode_set(Rb, indefinite, Bytes, OptOrMand, Fun3, Acc) ->
+ {Term, Remain, Rb1} = Fun3(Bytes, OptOrMand),
+ decode_set(Rb+Rb1, indefinite, Remain, OptOrMand, Fun3, [Term|Acc]);
+
+decode_set(Rb, Num, Bytes, _OptOrMand, _Fun3, Acc) when Num == 0 ->
+ {lists:reverse(Acc), Bytes, Rb};
+
+decode_set(_, Num, _, _, _, _) when Num < 0 ->
+ exit({error,{asn1,{length_error,'SET'}}});
+
+decode_set(Rb, Num, Bytes, OptOrMand, Fun3, Acc) ->
+ {Term, Remain, Rb1} = Fun3(Bytes, OptOrMand),
+ decode_set(Rb+Rb1, Num-Rb1, Remain, OptOrMand, Fun3, [Term|Acc]).
+
+
+%%-------------------------------------------------------------------------
+%% decoding of SEQUENCE OF and SET OF
+%%-------------------------------------------------------------------------
+
+decode_components(Rb, indefinite, <<0,0,Bytes/binary>>, _Fun3, _TagIn, Acc) ->
+ {lists:reverse(Acc),Bytes,Rb+2};
+
+decode_components(Rb, indefinite, Bytes, Fun3, TagIn, Acc) ->
+ {Term, Remain, Rb1} = Fun3(Bytes, mandatory, TagIn),
+ decode_components(Rb+Rb1, indefinite, Remain, Fun3, TagIn, [Term|Acc]);
+
+decode_components(Rb, Num, Bytes, _Fun3, _TagIn, Acc) when Num == 0 ->
+ {lists:reverse(Acc), Bytes, Rb};
+
+decode_components(_, Num, _, _, _, _) when Num < 0 ->
+ exit({error,{asn1,{length_error,'SET/SEQUENCE OF'}}});
+
+decode_components(Rb, Num, Bytes, Fun3, TagIn, Acc) ->
+ {Term, Remain, Rb1} = Fun3(Bytes, mandatory, TagIn),
+ decode_components(Rb+Rb1, Num-Rb1, Remain, Fun3, TagIn, [Term|Acc]).
+
+%%decode_components(Rb, indefinite, [0,0|Bytes], _Fun3, _TagIn, Acc) ->
+%% {lists:reverse(Acc),Bytes,Rb+2};
+
+decode_components(Rb, indefinite, <<0,0,Bytes/binary>>, _Fun4, _TagIn, _Fun, Acc) ->
+ {lists:reverse(Acc),Bytes,Rb+2};
+
+decode_components(Rb, indefinite, Bytes, _Fun4, TagIn, _Fun, Acc) ->
+ {Term, Remain, Rb1} = _Fun4(Bytes, mandatory, TagIn, _Fun),
+ decode_components(Rb+Rb1, indefinite, Remain, _Fun4, TagIn, _Fun, [Term|Acc]);
+
+decode_components(Rb, Num, Bytes, _Fun4, _TagIn, _Fun, Acc) when Num == 0 ->
+ {lists:reverse(Acc), Bytes, Rb};
+
+decode_components(_, Num, _, _, _, _, _) when Num < 0 ->
+ exit({error,{asn1,{length_error,'SET/SEQUENCE OF'}}});
+
+decode_components(Rb, Num, Bytes, _Fun4, TagIn, _Fun, Acc) ->
+ {Term, Remain, Rb1} = _Fun4(Bytes, mandatory, TagIn, _Fun),
+ decode_components(Rb+Rb1, Num-Rb1, Remain, _Fun4, TagIn, _Fun, [Term|Acc]).
+
+
+
+%%-------------------------------------------------------------------------
+%% INTERNAL HELPER FUNCTIONS (not exported)
+%%-------------------------------------------------------------------------
+
+
+%%==========================================================================
+%% Encode tag
+%%
+%% dotag(tag | notag, TagValpattern | TagValTuple, [Length, Value]) -> [Tag]
+%% TagValPattern is a correct bitpattern for a tag
+%% TagValTuple is a tuple of three bitpatterns, Class, Form and TagNo where
+%% Class = UNIVERSAL | APPLICATION | CONTEXT | PRIVATE
+%% Form = Primitive | Constructed
+%% TagNo = Number of tag
+%%==========================================================================
+
+
+dotag([], Tag, {Bytes,Len}) ->
+ dotag_universal(Tag,Bytes,Len);
+dotag(Tags, Tag, {Bytes,Len}) ->
+ encode_tags(Tags ++ [#tag{class=?UNIVERSAL,number=Tag,form=?PRIMITIVE}],
+ Bytes, Len);
+
+dotag(Tags, Tag, Bytes) ->
+ encode_tags(Tags ++ [#tag{class=?UNIVERSAL,number=Tag,form=?PRIMITIVE}],
+ Bytes, size(Bytes)).
+
+dotag_universal(UniversalTag,Bytes,Len) when Len =< 16#7F->
+ {[UniversalTag,Len,Bytes],2+Len};
+dotag_universal(UniversalTag,Bytes,Len) ->
+ {EncLen,LenLen}=encode_length(Len),
+ {[UniversalTag,EncLen,Bytes],1+LenLen+Len}.
+
+%% decoding postitive integer values.
+decode_integer2(Len,Bin = <<0:1,_:7,_Bs/binary>>,RemovedBytes) ->
+ <<Int:Len/unit:8,Buffer2/binary>> = Bin,
+ {Int,Buffer2,RemovedBytes};
+%% decoding negative integer values.
+decode_integer2(Len,<<1:1,B2:7,Bs/binary>>,RemovedBytes) ->
+ <<N:Len/unit:8,Buffer2/binary>> = <<B2,Bs/binary>>,
+ Int = N - (1 bsl (8 * Len - 1)),
+ {Int,Buffer2,RemovedBytes}.
+
+%%decode_integer2(Len,Buffer,Acc,RemovedBytes) when (hd(Buffer) band 16#FF) =< 16#7F ->
+%% {decode_integer_pos(Buffer, 8 * (Len - 1)),skip(Buffer,Len),RemovedBytes};
+%%decode_integer2(Len,Buffer,Acc,RemovedBytes) ->
+%% {decode_integer_neg(Buffer, 8 * (Len - 1)),skip(Buffer,Len),RemovedBytes}.
+
+%%decode_integer_pos([Byte|Tail], Shift) ->
+%% (Byte bsl Shift) bor decode_integer_pos(Tail, Shift-8);
+%%decode_integer_pos([], _) -> 0.
+
+
+%%decode_integer_neg([Byte|Tail], Shift) ->
+%% (-128 + (Byte band 127) bsl Shift) bor decode_integer_pos(Tail, Shift-8).
+
+
+concat_bit_binaries([],Bin={_,_}) ->
+ Bin;
+concat_bit_binaries({0,B1},{U2,B2}) ->
+ {U2,<<B1/binary,B2/binary>>};
+concat_bit_binaries({U1,B1},{U2,B2}) ->
+ S1 = (size(B1) * 8) - U1,
+ S2 = (size(B2) * 8) - U2,
+ PadBits = 8 - ((S1+S2) rem 8),
+ {PadBits, <<B1:S1/binary-unit:1,B2:S2/binary-unit:1,0:PadBits>>};
+concat_bit_binaries(L1,L2) when list(L1),list(L2) ->
+ %% this case occur when decoding with NNL
+ L1 ++ L2.
+
+
+get_constraint(C,Key) ->
+ case lists:keysearch(Key,1,C) of
+ false ->
+ no;
+ {value,{_,V}} ->
+ V
+ end.
+
+%%skip(Buffer, 0) ->
+%% Buffer;
+%%skip([H | T], Len) ->
+%% skip(T, Len-1).
+
+new_tags([],LastTag) ->
+ [LastTag];
+new_tags(Tags=[#tag{type='IMPLICIT'}],_LastTag) ->
+ Tags;
+new_tags([T1 = #tag{type='IMPLICIT'},#tag{type=T2Type}|Rest],LastTag) ->
+ new_tags([T1#tag{type=T2Type}|Rest],LastTag);
+new_tags(Tags,LastTag) ->
+ case lists:last(Tags) of
+ #tag{type='IMPLICIT'} ->
+ Tags;
+ _ ->
+ Tags ++ [LastTag]
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_ber_bin_v2.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_ber_bin_v2.erl
new file mode 100644
index 0000000000..50a91cf201
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_ber_bin_v2.erl
@@ -0,0 +1,1849 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1rt_ber_bin_v2.erl,v 1.1 2008/12/17 09:53:30 mikpe Exp $
+%%
+-module(asn1rt_ber_bin_v2).
+
+%% encoding / decoding of BER
+
+-export([decode/1, decode/2, match_tags/2, encode/1]).
+-export([fixoptionals/2, cindex/3,
+ list_to_record/2,
+ encode_tag_val/1,
+ encode_tags/3]).
+-export([encode_boolean/2,decode_boolean/2,
+ encode_integer/3,encode_integer/4,
+ decode_integer/3, decode_integer/4,
+ encode_enumerated/2,
+ encode_enumerated/4,decode_enumerated/4,
+ encode_real/2,decode_real/3,
+ encode_bit_string/4,decode_bit_string/4,
+ decode_compact_bit_string/4,
+ encode_octet_string/3,decode_octet_string/3,
+ encode_null/2,decode_null/2,
+ encode_object_identifier/2,decode_object_identifier/2,
+ encode_restricted_string/4,decode_restricted_string/4,
+ encode_universal_string/3,decode_universal_string/3,
+ encode_BMP_string/3,decode_BMP_string/3,
+ encode_generalized_time/3,decode_generalized_time/3,
+ encode_utc_time/3,decode_utc_time/3,
+ encode_length/1,decode_length/1,
+ decode_tag_and_length/1]).
+
+-export([encode_open_type/1,encode_open_type/2,
+ decode_open_type/2,decode_open_type_as_binary/2]).
+
+-export([decode_primitive_incomplete/2]).
+
+-include("asn1_records.hrl").
+
+% the encoding of class of tag bits 8 and 7
+-define(UNIVERSAL, 0).
+-define(APPLICATION, 16#40).
+-define(CONTEXT, 16#80).
+-define(PRIVATE, 16#C0).
+
+%%% primitive or constructed encoding % bit 6
+-define(PRIMITIVE, 0).
+-define(CONSTRUCTED, 2#00100000).
+
+%%% The tag-number for universal types
+-define(N_BOOLEAN, 1).
+-define(N_INTEGER, 2).
+-define(N_BIT_STRING, 3).
+-define(N_OCTET_STRING, 4).
+-define(N_NULL, 5).
+-define(N_OBJECT_IDENTIFIER, 6).
+-define(N_OBJECT_DESCRIPTOR, 7).
+-define(N_EXTERNAL, 8).
+-define(N_REAL, 9).
+-define(N_ENUMERATED, 10).
+-define(N_EMBEDDED_PDV, 11).
+-define(N_SEQUENCE, 16).
+-define(N_SET, 17).
+-define(N_NumericString, 18).
+-define(N_PrintableString, 19).
+-define(N_TeletexString, 20).
+-define(N_VideotexString, 21).
+-define(N_IA5String, 22).
+-define(N_UTCTime, 23).
+-define(N_GeneralizedTime, 24).
+-define(N_GraphicString, 25).
+-define(N_VisibleString, 26).
+-define(N_GeneralString, 27).
+-define(N_UniversalString, 28).
+-define(N_BMPString, 30).
+
+
+% the complete tag-word of built-in types
+-define(T_BOOLEAN, ?UNIVERSAL bor ?PRIMITIVE bor 1).
+-define(T_INTEGER, ?UNIVERSAL bor ?PRIMITIVE bor 2).
+-define(T_BIT_STRING, ?UNIVERSAL bor ?PRIMITIVE bor 3). % can be CONSTRUCTED
+-define(T_OCTET_STRING, ?UNIVERSAL bor ?PRIMITIVE bor 4). % can be CONSTRUCTED
+-define(T_NULL, ?UNIVERSAL bor ?PRIMITIVE bor 5).
+-define(T_OBJECT_IDENTIFIER,?UNIVERSAL bor ?PRIMITIVE bor 6).
+-define(T_OBJECT_DESCRIPTOR,?UNIVERSAL bor ?PRIMITIVE bor 7).
+-define(T_EXTERNAL, ?UNIVERSAL bor ?PRIMITIVE bor 8).
+-define(T_REAL, ?UNIVERSAL bor ?PRIMITIVE bor 9).
+-define(T_ENUMERATED, ?UNIVERSAL bor ?PRIMITIVE bor 10).
+-define(T_EMBEDDED_PDV, ?UNIVERSAL bor ?PRIMITIVE bor 11).
+-define(T_SEQUENCE, ?UNIVERSAL bor ?CONSTRUCTED bor 16).
+-define(T_SET, ?UNIVERSAL bor ?CONSTRUCTED bor 17).
+-define(T_NumericString, ?UNIVERSAL bor ?PRIMITIVE bor 18). %can be constructed
+-define(T_PrintableString, ?UNIVERSAL bor ?PRIMITIVE bor 19). %can be constructed
+-define(T_TeletexString, ?UNIVERSAL bor ?PRIMITIVE bor 20). %can be constructed
+-define(T_VideotexString, ?UNIVERSAL bor ?PRIMITIVE bor 21). %can be constructed
+-define(T_IA5String, ?UNIVERSAL bor ?PRIMITIVE bor 22). %can be constructed
+-define(T_UTCTime, ?UNIVERSAL bor ?PRIMITIVE bor 23).
+-define(T_GeneralizedTime, ?UNIVERSAL bor ?PRIMITIVE bor 24).
+-define(T_GraphicString, ?UNIVERSAL bor ?PRIMITIVE bor 25). %can be constructed
+-define(T_VisibleString, ?UNIVERSAL bor ?PRIMITIVE bor 26). %can be constructed
+-define(T_GeneralString, ?UNIVERSAL bor ?PRIMITIVE bor 27). %can be constructed
+-define(T_UniversalString, ?UNIVERSAL bor ?PRIMITIVE bor 28). %can be constructed
+-define(T_BMPString, ?UNIVERSAL bor ?PRIMITIVE bor 30). %can be constructed
+
+% encode(Tlv={_Tag={?PRIMITIVE,_},_VList}) ->
+% encode_primitive(Tlv);
+% encode(Tlv) ->
+% encode_constructed(Tlv).
+
+encode([Tlv]) ->
+ encode(Tlv);
+encode({TlvTag,TlvVal}) when list(TlvVal) ->
+ %% constructed form of value
+ encode_tlv(TlvTag,TlvVal,?CONSTRUCTED);
+encode({TlvTag,TlvVal}) ->
+ encode_tlv(TlvTag,TlvVal,?PRIMITIVE);
+encode(Bin) when binary(Bin) ->
+ Bin.
+
+encode_tlv(TlvTag,TlvVal,Form) ->
+ Tag = encode_tlv_tag(TlvTag,Form),
+ {Val,VLen} = encode_tlv_val(TlvVal),
+ {Len,_LLen} = encode_length(VLen),
+ BinLen = list_to_binary(Len),
+ <<Tag/binary,BinLen/binary,Val/binary>>.
+
+encode_tlv_tag(ClassTagNo,Form) ->
+ Class = ClassTagNo bsr 16,
+ case encode_tag_val({Class bsl 6,Form,(ClassTagNo - (Class bsl 16))}) of
+ T when list(T) ->
+ list_to_binary(T);
+ T ->
+ T
+ end.
+
+encode_tlv_val(TlvL) when list(TlvL) ->
+ encode_tlv_list(TlvL,[]);
+encode_tlv_val(Bin) ->
+ {Bin,size(Bin)}.
+
+encode_tlv_list([Tlv|Tlvs],Acc) ->
+ EncTlv = encode(Tlv),
+ encode_tlv_list(Tlvs,[EncTlv|Acc]);
+encode_tlv_list([],Acc) ->
+ Bin=list_to_binary(lists:reverse(Acc)),
+ {Bin,size(Bin)}.
+
+% encode_primitive({{_,ClassTagNo},V}) ->
+% Len = size(V), % not sufficient as length encode
+% Class = ClassTagNo bsr 16,
+% {TagLen,Tag} =
+% case encode_tag_val({Class,?PRIMITIVE,ClassTagNo - Class}) of
+% T when list(T) ->
+% {length(T),list_to_binary(T)};
+% T ->
+% {1,T}
+% end,
+
+
+decode(B,driver) ->
+ case catch port_control(drv_complete,2,B) of
+ Bin when binary(Bin) ->
+ binary_to_term(Bin);
+ List when list(List) -> handle_error(List,B);
+ {'EXIT',{badarg,Reason}} ->
+ asn1rt_driver_handler:load_driver(),
+ receive
+ driver_ready ->
+ case catch port_control(drv_complete,2,B) of
+ Bin2 when binary(Bin2) -> binary_to_term(Bin2);
+ List when list(List) -> handle_error(List,B);
+ Error -> exit(Error)
+ end;
+ {error,Error} -> % error when loading driver
+ %% the driver could not be loaded
+ exit(Error);
+ Error={port_error,Reason} ->
+ exit(Error)
+ end;
+ {'EXIT',Reason} ->
+ exit(Reason)
+ end.
+
+handle_error([],_)->
+ exit({error,{"memory allocation problem"}});
+handle_error([$1|_],L) -> % error in driver
+ exit({error,{asn1_error,L}});
+handle_error([$2|_],L) -> % error in driver due to wrong tag
+ exit({error,{asn1_error,{"bad tag",L}}});
+handle_error([$3|_],L) -> % error in driver due to length error
+ exit({error,{asn1_error,{"bad length field",L}}});
+handle_error([$4|_],L) -> % error in driver due to indefinite length error
+ exit({error,{asn1_error,{"indefinite length without end bytes",L}}});
+handle_error(ErrL,L) ->
+ exit({error,{unknown_error,ErrL,L}}).
+
+
+decode(Bin) when binary(Bin) ->
+ decode_primitive(Bin);
+decode(Tlv) -> % assume it is a tlv
+ {Tlv,<<>>}.
+
+
+decode_primitive(Bin) ->
+ {{Form,TagNo,Len,V},Rest} = decode_tlv(Bin),
+ case Form of
+ 1 when Len == indefinite -> % constructed
+ {Vlist,Rest2} = decode_constructed_indefinite(V,[]),
+ {{TagNo,Vlist},Rest2};
+ 1 -> % constructed
+ {{TagNo,decode_constructed(V)},Rest};
+ 0 -> % primitive
+ {{TagNo,V},Rest}
+ end.
+
+decode_constructed(<<>>) ->
+ [];
+decode_constructed(Bin) ->
+ {Tlv,Rest} = decode_primitive(Bin),
+ [Tlv|decode_constructed(Rest)].
+
+decode_constructed_indefinite(<<0,0,Rest/binary>>,Acc) ->
+ {lists:reverse(Acc),Rest};
+decode_constructed_indefinite(Bin,Acc) ->
+ {Tlv,Rest} = decode_primitive(Bin),
+ decode_constructed_indefinite(Rest, [Tlv|Acc]).
+
+decode_tlv(Bin) ->
+ {Form,TagNo,Len,Bin2} = decode_tag_and_length(Bin),
+ case Len of
+ indefinite ->
+ {{Form,TagNo,Len,Bin2},[]};
+ _ ->
+ <<V:Len/binary,Bin3/binary>> = Bin2,
+ {{Form,TagNo,Len,V},Bin3}
+ end.
+
+%% decode_primitive_incomplete/2 decodes an encoded message incomplete
+%% by help of the pattern attribute (first argument).
+decode_primitive_incomplete([[default,TagNo]],Bin) -> %default
+ case decode_tlv(Bin) of
+ {{Form,TagNo,Len,V},Rest} ->
+ decode_incomplete2(Form,TagNo,Len,V,[],Rest);
+ _ ->
+ %{asn1_DEFAULT,Bin}
+ asn1_NOVALUE
+ end;
+decode_primitive_incomplete([[default,TagNo,Directives]],Bin) -> %default, constructed type, Directives points into this type
+ case decode_tlv(Bin) of
+ {{Form,TagNo,Len,V},Rest} ->
+ decode_incomplete2(Form,TagNo,Len,V,Directives,Rest);
+ _ ->
+ %{asn1_DEFAULT,Bin}
+ asn1_NOVALUE
+ end;
+decode_primitive_incomplete([[opt,TagNo]],Bin) -> %optional
+ case decode_tlv(Bin) of
+ {{Form,TagNo,Len,V},Rest} ->
+ decode_incomplete2(Form,TagNo,Len,V,[],Rest);
+ _ ->
+ %{{TagNo,asn1_NOVALUE},Bin}
+ asn1_NOVALUE
+ end;
+decode_primitive_incomplete([[opt,TagNo,Directives]],Bin) -> %optional
+ case decode_tlv(Bin) of
+ {{Form,TagNo,Len,V},Rest} ->
+ decode_incomplete2(Form,TagNo,Len,V,Directives,Rest);
+ _ ->
+ %{{TagNo,asn1_NOVALUE},Bin}
+ asn1_NOVALUE
+ end;
+%% A choice alternative that shall be undecoded
+decode_primitive_incomplete([[alt_undec,TagNo]|RestAlts],Bin) ->
+% decode_incomplete_bin(Bin);
+ case decode_tlv(Bin) of
+ {{_Form,TagNo,_Len,_V},_R} ->
+ decode_incomplete_bin(Bin);
+ _ ->
+ decode_primitive_incomplete(RestAlts,Bin)
+ end;
+decode_primitive_incomplete([[alt,TagNo]|RestAlts],Bin) ->
+ case decode_tlv(Bin) of
+ {{_Form,TagNo,_Len,V},Rest} ->
+ {{TagNo,V},Rest};
+ _ ->
+ decode_primitive_incomplete(RestAlts,Bin)
+ end;
+decode_primitive_incomplete([[alt,TagNo,Directives]|RestAlts],Bin) ->
+ case decode_tlv(Bin) of
+ {{Form,TagNo,Len,V},Rest} ->
+ decode_incomplete2(Form,TagNo,Len,V,Directives,Rest);
+ _ ->
+ decode_primitive_incomplete(RestAlts,Bin)
+ end;
+decode_primitive_incomplete([[alt_parts,TagNo]|RestAlts],Bin) ->
+ case decode_tlv(Bin) of
+ {{_Form,TagNo,_Len,V},Rest} ->
+ {{TagNo,decode_parts_incomplete(V)},Rest};
+ _ ->
+ decode_primitive_incomplete(RestAlts,Bin)
+ end;
+decode_primitive_incomplete([[undec,_TagNo]|_RestTag],Bin) -> %incomlete decode
+ decode_incomplete_bin(Bin); %% use this if changing handling of
+decode_primitive_incomplete([[parts,TagNo]|_RestTag],Bin) ->
+ case decode_tlv(Bin) of
+ {{_Form,TagNo,_Len,V},Rest} ->
+ {{TagNo,decode_parts_incomplete(V)},Rest};
+ Err ->
+ {error,{asn1,"tag failure",TagNo,Err}}
+ end;
+decode_primitive_incomplete([mandatory|RestTag],Bin) ->
+ case decode_tlv(Bin) of
+ {{Form,TagNo,Len,V},Rest} ->
+ decode_incomplete2(Form,TagNo,Len,V,RestTag,Rest);
+ _ ->
+ {error,{asn1,"partial incomplete decode failure"}}
+ end;
+%% A choice that is a toptype or a mandatory component of a
+%% SEQUENCE or SET.
+decode_primitive_incomplete([[mandatory,Directives]],Bin) ->
+ case decode_tlv(Bin) of
+ {{Form,TagNo,Len,V},Rest} ->
+ decode_incomplete2(Form,TagNo,Len,V,Directives,Rest);
+ _ ->
+ {error,{asn1,"partial incomplete decode failure"}}
+ end;
+decode_primitive_incomplete([],Bin) ->
+ decode_primitive(Bin).
+
+%% decode_parts_incomplete/1 receives a number of values encoded in
+%% sequence and returns the parts as unencoded binaries
+decode_parts_incomplete(<<>>) ->
+ [];
+decode_parts_incomplete(Bin) ->
+ {ok,Rest} = skip_tag(Bin),
+ {ok,Rest2} = skip_length_and_value(Rest),
+ LenPart = size(Bin) - size(Rest2),
+ <<Part:LenPart/binary,RestBin/binary>> = Bin,
+ [Part|decode_parts_incomplete(RestBin)].
+
+
+%% decode_incomplete2 checks if V is a value of a constructed or
+%% primitive type, and continues the decode propeerly.
+decode_incomplete2(1,TagNo,indefinite,V,TagMatch,_) ->
+ %% constructed indefinite length
+ {Vlist,Rest2} = decode_constr_indef_incomplete(TagMatch,V,[]),
+ {{TagNo,Vlist},Rest2};
+decode_incomplete2(1,TagNo,_Len,V,TagMatch,Rest) ->
+ {{TagNo,decode_constructed_incomplete(TagMatch,V)},Rest};
+decode_incomplete2(0,TagNo,_Len,V,_TagMatch,Rest) ->
+ {{TagNo,V},Rest}.
+
+decode_constructed_incomplete(_TagMatch,<<>>) ->
+ [];
+decode_constructed_incomplete([mandatory|RestTag],Bin) ->
+ {Tlv,Rest} = decode_primitive(Bin),
+ [Tlv|decode_constructed_incomplete(RestTag,Rest)];
+decode_constructed_incomplete(Directives=[[Alt,_]|_],Bin)
+ when Alt == alt_undec; Alt == alt ->
+ case decode_tlv(Bin) of
+ {{_Form,TagNo,_Len,V},Rest} ->
+ case incomplete_choice_alt(TagNo,Directives) of
+ alt_undec ->
+ LenA = size(Bin)-size(Rest),
+ <<A:LenA/binary,Rest/binary>> = Bin,
+ A;
+% {UndecBin,_}=decode_incomplete_bin(Bin),
+% UndecBin;
+% [{TagNo,V}];
+ alt ->
+ {Tlv,_} = decode_primitive(V),
+ [{TagNo,Tlv}];
+ alt_parts ->
+ %{{TagNo,decode_parts_incomplete(V)},Rest}; % maybe wrong
+ [{TagNo,decode_parts_incomplete(V)}];
+ Err ->
+ {error,{asn1,"partial incomplete decode failure",Err}}
+ end;
+ _ ->
+ {error,{asn1,"partial incomplete decode failure"}}
+ end;
+decode_constructed_incomplete([TagNo|RestTag],Bin) ->
+%% {Tlv,Rest} = decode_primitive_incomplete([TagNo],Bin),
+ case decode_primitive_incomplete([TagNo],Bin) of
+ {Tlv,Rest} ->
+ [Tlv|decode_constructed_incomplete(RestTag,Rest)];
+ asn1_NOVALUE ->
+ decode_constructed_incomplete(RestTag,Bin)
+ end;
+decode_constructed_incomplete([],Bin) ->
+ {Tlv,_Rest}=decode_primitive(Bin),
+ [Tlv].
+
+decode_constr_indef_incomplete(_TagMatch,<<0,0,Rest/binary>>,Acc) ->
+ {lists:reverse(Acc),Rest};
+decode_constr_indef_incomplete([Tag|RestTags],Bin,Acc) ->
+% {Tlv,Rest} = decode_primitive_incomplete([Tag],Bin),
+ case decode_primitive_incomplete([Tag],Bin) of
+ {Tlv,Rest} ->
+ decode_constr_indef_incomplete(RestTags,Rest,[Tlv|Acc]);
+ asn1_NOVALUE ->
+ decode_constr_indef_incomplete(RestTags,Bin,Acc)
+ end.
+
+
+decode_incomplete_bin(Bin) ->
+ {ok,Rest} = skip_tag(Bin),
+ {ok,Rest2} = skip_length_and_value(Rest),
+ IncLen = size(Bin) - size(Rest2),
+ <<IncBin:IncLen/binary,Ret/binary>> = Bin,
+ {IncBin,Ret}.
+
+incomplete_choice_alt(TagNo,[[Alt,TagNo]|_Directives]) ->
+ Alt;
+incomplete_choice_alt(TagNo,[_H|Directives]) ->
+ incomplete_choice_alt(TagNo,Directives);
+incomplete_choice_alt(_,[]) ->
+ error.
+
+
+%% skip_tag and skip_length_and_value are rutines used both by
+%% decode_partial_incomplete and decode_partial (decode/2).
+
+skip_tag(<<_:3,31:5,Rest/binary>>)->
+ skip_long_tag(Rest);
+skip_tag(<<_:3,_Tag:5,Rest/binary>>) ->
+ {ok,Rest}.
+
+skip_long_tag(<<1:1,_:7,Rest/binary>>) ->
+ skip_long_tag(Rest);
+skip_long_tag(<<0:1,_:7,Rest/binary>>) ->
+ {ok,Rest}.
+
+skip_length_and_value(Binary) ->
+ case decode_length(Binary) of
+ {indefinite,RestBinary} ->
+ skip_indefinite_value(RestBinary);
+ {Length,RestBinary} ->
+ <<_:Length/unit:8,Rest/binary>> = RestBinary,
+ {ok,Rest}
+ end.
+
+skip_indefinite_value(<<0,0,Rest/binary>>) ->
+ {ok,Rest};
+skip_indefinite_value(Binary) ->
+ {ok,RestBinary}=skip_tag(Binary),
+ {ok,RestBinary2} = skip_length_and_value(RestBinary),
+ skip_indefinite_value(RestBinary2).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% match_tags takes a Tlv (Tag, Length, Value) structure and matches
+%% it with the tags in TagList. If the tags does not match the function
+%% crashes otherwise it returns the remaining Tlv after that the tags have
+%% been removed.
+%%
+%% match_tags(Tlv, TagList)
+%%
+
+
+match_tags({T,V}, [T|Tt]) ->
+ match_tags(V,Tt);
+match_tags([{T,V}],[T|Tt]) ->
+ match_tags(V, Tt);
+match_tags(Vlist = [{T,_V}|_], [T]) ->
+ Vlist;
+match_tags(Tlv, []) ->
+ Tlv;
+match_tags({Tag,_V},[T|_Tt]) ->
+ {error,{asn1,{wrong_tag,{Tag,T}}}}.
+
+
+cindex(Ix,Val,Cname) ->
+ case element(Ix,Val) of
+ {Cname,Val2} -> Val2;
+ X -> X
+ end.
+
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+%% Optionals, preset not filled optionals with asn1_NOVALUE
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+
+% converts a list to a record if necessary
+list_to_record(Name,List) when list(List) ->
+ list_to_tuple([Name|List]);
+list_to_record(_Name,Tuple) when tuple(Tuple) ->
+ Tuple.
+
+
+fixoptionals(OptList,Val) when list(Val) ->
+ fixoptionals(OptList,Val,1,[],[]).
+
+fixoptionals([{Name,Pos}|Ot],[{Name,Val}|Vt],_Opt,Acc1,Acc2) ->
+ fixoptionals(Ot,Vt,Pos+1,[1|Acc1],[{Name,Val}|Acc2]);
+fixoptionals([{_Name,Pos}|Ot],V,Pos,Acc1,Acc2) ->
+ fixoptionals(Ot,V,Pos+1,[0|Acc1],[asn1_NOVALUE|Acc2]);
+fixoptionals(O,[Vh|Vt],Pos,Acc1,Acc2) ->
+ fixoptionals(O,Vt,Pos+1,Acc1,[Vh|Acc2]);
+fixoptionals([],[Vh|Vt],Pos,Acc1,Acc2) ->
+ fixoptionals([],Vt,Pos+1,Acc1,[Vh|Acc2]);
+fixoptionals([],[],_,_Acc1,Acc2) ->
+ % return Val as a record
+ list_to_tuple([asn1_RECORDNAME|lists:reverse(Acc2)]).
+
+
+%%encode_tag(TagClass(?UNI, APP etc), Form (?PRIM etx), TagInteger) ->
+%% 8bit Int | binary
+encode_tag_val({Class, Form, TagNo}) when (TagNo =< 30) ->
+ <<(Class bsr 6):2,(Form bsr 5):1,TagNo:5>>;
+
+encode_tag_val({Class, Form, TagNo}) ->
+ {Octets,_Len} = mk_object_val(TagNo),
+ BinOct = list_to_binary(Octets),
+ <<(Class bsr 6):2, (Form bsr 5):1, 31:5,BinOct/binary>>;
+
+%% asumes whole correct tag bitpattern, multiple of 8
+encode_tag_val(Tag) when (Tag =< 255) -> Tag; %% anv�nds denna funktion??!!
+%% asumes correct bitpattern of 0-5
+encode_tag_val(Tag) -> encode_tag_val2(Tag,[]).
+
+encode_tag_val2(Tag, OctAck) when (Tag =< 255) ->
+ [Tag | OctAck];
+encode_tag_val2(Tag, OctAck) ->
+ encode_tag_val2(Tag bsr 8, [255 band Tag | OctAck]).
+
+
+%%===============================================================================
+%% Decode a tag
+%%
+%% decode_tag(OctetListBuffer) -> {{Form, (Class bsl 16)+ TagNo}, RestOfBuffer, RemovedBytes}
+%%===============================================================================
+
+decode_tag_and_length(<<Class:2, Form:1, TagNo:5, 0:1, Length:7, RestBuffer/binary>>) when TagNo < 31 ->
+ {Form, (Class bsl 16) + TagNo, Length, RestBuffer};
+decode_tag_and_length(<<Class:2, Form:1, TagNo:5, 1:1, 0:7, T/binary>>) when TagNo < 31 ->
+ {Form, (Class bsl 16) + TagNo, indefinite, T};
+decode_tag_and_length(<<Class:2, Form:1, TagNo:5, 1:1, LL:7, T/binary>>) when TagNo < 31 ->
+ <<Length:LL/unit:8,RestBuffer/binary>> = T,
+ {Form, (Class bsl 16) + TagNo, Length, RestBuffer};
+decode_tag_and_length(<<Class:2, Form:1, 31:5, 0:1, TagNo:7, 0:1, Length:7, RestBuffer/binary>>) ->
+ {Form, (Class bsl 16) + TagNo, Length, RestBuffer};
+decode_tag_and_length(<<Class:2, Form:1, 31:5, 0:1, TagNo:7, 1:1, 0:7, T/binary>>) ->
+ {Form, (Class bsl 16) + TagNo, indefinite, T};
+decode_tag_and_length(<<Class:2, Form:1, 31:5, 0:1, TagNo:7, 1:1, LL:7, T/binary>>) ->
+ <<Length:LL/unit:8,RestBuffer/binary>> = T,
+ {Form, (Class bsl 16) + TagNo, Length, RestBuffer};
+decode_tag_and_length(<<Class:2, Form:1, 31:5, Buffer/binary>>) ->
+ {TagNo, Buffer1} = decode_tag(Buffer, 0),
+ {Length, RestBuffer} = decode_length(Buffer1),
+ {Form, (Class bsl 16) + TagNo, Length, RestBuffer}.
+
+
+
+%% last partial tag
+decode_tag(<<0:1,PartialTag:7, Buffer/binary>>, TagAck) ->
+ TagNo = (TagAck bsl 7) bor PartialTag,
+ %%<<TagNo>> = <<TagAck:1, PartialTag:7>>,
+ {TagNo, Buffer};
+% more tags
+decode_tag(<<_:1,PartialTag:7, Buffer/binary>>, TagAck) ->
+ TagAck1 = (TagAck bsl 7) bor PartialTag,
+ %%<<TagAck1:16>> = <<TagAck:1, PartialTag:7,0:8>>,
+ decode_tag(Buffer, TagAck1).
+
+
+%%=======================================================================
+%%
+%% Encode all tags in the list Tags and return a possibly deep list of
+%% bytes with tag and length encoded
+%% The taglist must be in reverse order (fixed by the asn1 compiler)
+%% e.g [T1,T2] will result in
+%% {[EncodedT2,EncodedT1|BytesSoFar],LenSoFar+LenT2+LenT1}
+%%
+
+encode_tags([Tag|Trest], BytesSoFar, LenSoFar) ->
+% remove {Bytes1,L1} = encode_one_tag(Tag),
+ {Bytes2,L2} = encode_length(LenSoFar),
+ encode_tags(Trest, [Tag,Bytes2|BytesSoFar],
+ LenSoFar + size(Tag) + L2);
+encode_tags([], BytesSoFar, LenSoFar) ->
+ {BytesSoFar,LenSoFar}.
+
+encode_tags(TagIn, {BytesSoFar,LenSoFar}) ->
+ encode_tags(TagIn, BytesSoFar, LenSoFar).
+
+% encode_one_tag(#tag{class=Class,number=No,type=Type, form = Form}) ->
+% NewForm = case Type of
+% 'EXPLICIT' ->
+% ?CONSTRUCTED;
+% _ ->
+% Form
+% end,
+% Bytes = encode_tag_val({Class,NewForm,No}),
+% {Bytes,size(Bytes)}.
+
+
+%%===============================================================================
+%%
+%% This comment is valid for all the encode/decode functions
+%%
+%% C = Constraint -> typically {'ValueRange',LowerBound,UpperBound}
+%% used for PER-coding but not for BER-coding.
+%%
+%% Val = Value. If Val is an atom then it is a symbolic integer value
+%% (i.e the atom must be one of the names in the NamedNumberList).
+%% The NamedNumberList is used to translate the atom to an integer value
+%% before encoding.
+%%
+%%===============================================================================
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% encode_open_type(Value) -> io_list (i.e nested list with integers, binaries)
+%% Value = list of bytes of an already encoded value (the list must be flat)
+%% | binary
+
+%%
+encode_open_type(Val) when list(Val) ->
+% {Val,length(Val)};
+ encode_open_type(list_to_binary(Val));
+encode_open_type(Val) ->
+ {Val, size(Val)}.
+
+%%
+encode_open_type(Val, T) when list(Val) ->
+ encode_open_type(list_to_binary(Val),T);
+encode_open_type(Val,[]) ->
+ {Val, size(Val)};
+encode_open_type(Val,Tag) ->
+ encode_tags(Tag,Val, size(Val)).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% decode_open_type(Tlv, TagIn) -> Value
+%% Tlv = {Tag,V} | V where V -> binary()
+%% TagIn = [TagVal] where TagVal -> int()
+%% Value = binary with decoded data (which must be decoded again as some type)
+%%
+decode_open_type(Tlv, TagIn) ->
+ case match_tags(Tlv,TagIn) of
+ Bin when binary(Bin) ->
+ {InnerTlv,_} = decode(Bin),
+ InnerTlv;
+ TlvBytes -> TlvBytes
+ end.
+
+
+decode_open_type_as_binary(Tlv,TagIn)->
+ case match_tags(Tlv,TagIn) of
+ V when binary(V) ->
+ V;
+ [Tlv2] -> encode(Tlv2);
+ Tlv2 -> encode(Tlv2)
+ end.
+
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+%% Boolean, ITU_T X.690 Chapter 8.2
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+
+%%===============================================================================
+%% encode_boolean(Integer, ReversedTagList) -> {[Octet],Len}
+%%===============================================================================
+
+encode_boolean({Name, Val}, TagIn) when atom(Name) ->
+ encode_boolean(Val, TagIn);
+encode_boolean(true, TagIn) ->
+ encode_tags(TagIn, [16#FF],1);
+encode_boolean(false, TagIn) ->
+ encode_tags(TagIn, [0],1);
+encode_boolean(X,_) ->
+ exit({error,{asn1, {encode_boolean, X}}}).
+
+
+%%===============================================================================
+%% decode_boolean(BuffList, HasTag, TotalLen) -> {true, Remain, RemovedBytes} |
+%% {false, Remain, RemovedBytes}
+%%===============================================================================
+decode_boolean(Tlv,TagIn) ->
+ Val = match_tags(Tlv, TagIn),
+ case Val of
+ <<0:8>> ->
+ false;
+ <<_:8>> ->
+ true;
+ _ ->
+ exit({error,{asn1, {decode_boolean, Val}}})
+ end.
+
+
+%%===========================================================================
+%% Integer, ITU_T X.690 Chapter 8.3
+
+%% encode_integer(Constraint, Value, Tag) -> [octet list]
+%% encode_integer(Constraint, Name, NamedNumberList, Tag) -> [octet list]
+%% Value = INTEGER | {Name,INTEGER}
+%% Tag = tag | notag
+%%===========================================================================
+
+encode_integer(C, Val, Tag) when integer(Val) ->
+ encode_tags(Tag, encode_integer(C, Val));
+encode_integer(C,{Name,Val},Tag) when atom(Name) ->
+ encode_integer(C,Val,Tag);
+encode_integer(_C, Val, _Tag) ->
+ exit({error,{asn1, {encode_integer, Val}}}).
+
+
+
+encode_integer(C, Val, NamedNumberList, Tag) when atom(Val) ->
+ case lists:keysearch(Val, 1, NamedNumberList) of
+ {value,{_, NewVal}} ->
+ encode_tags(Tag, encode_integer(C, NewVal));
+ _ ->
+ exit({error,{asn1, {encode_integer_namednumber, Val}}})
+ end;
+encode_integer(C,{_Name,Val},NamedNumberList,Tag) ->
+ encode_integer(C,Val,NamedNumberList,Tag);
+encode_integer(C, Val, _NamedNumberList, Tag) ->
+ encode_tags(Tag, encode_integer(C, Val)).
+
+
+encode_integer(_, Val) ->
+ Bytes =
+ if
+ Val >= 0 ->
+ encode_integer_pos(Val, []);
+ true ->
+ encode_integer_neg(Val, [])
+ end,
+ {Bytes,length(Bytes)}.
+
+encode_integer_pos(0, L=[B|_Acc]) when B < 128 ->
+ L;
+encode_integer_pos(N, Acc) ->
+ encode_integer_pos((N bsr 8), [N band 16#ff| Acc]).
+
+encode_integer_neg(-1, L=[B1|_T]) when B1 > 127 ->
+ L;
+encode_integer_neg(N, Acc) ->
+ encode_integer_neg(N bsr 8, [N band 16#ff|Acc]).
+
+%%===============================================================================
+%% decode integer
+%% (Buffer, Range, HasTag, TotalLen) -> {Integer, Remain, RemovedBytes}
+%% (Buffer, Range, NamedNumberList, HasTag, TotalLen) -> {Integer, Remain, RemovedBytes}
+%%===============================================================================
+
+decode_integer(Tlv,Range,NamedNumberList,TagIn) ->
+ V = match_tags(Tlv,TagIn),
+ Int = decode_integer(V),
+ range_check_integer(Int,Range),
+ number2name(Int,NamedNumberList).
+
+decode_integer(Tlv,Range,TagIn) ->
+ V = match_tags(Tlv, TagIn),
+ Int = decode_integer(V),
+ range_check_integer(Int,Range),
+ Int.
+
+%% decoding postitive integer values.
+decode_integer(Bin = <<0:1,_:7,_/binary>>) ->
+ Len = size(Bin),
+% <<Int:Len/unit:8,Buffer2/binary>> = Bin,
+ <<Int:Len/unit:8>> = Bin,
+ Int;
+%% decoding negative integer values.
+decode_integer(Bin = <<1:1,B2:7,Bs/binary>>) ->
+ Len = size(Bin),
+% <<N:Len/unit:8,Buffer2/binary>> = <<B2,Bs/binary>>,
+ <<N:Len/unit:8>> = <<B2,Bs/binary>>,
+ Int = N - (1 bsl (8 * Len - 1)),
+ Int.
+
+range_check_integer(Int,Range) ->
+ case Range of
+ [] -> % No length constraint
+ Int;
+ {Lb,Ub} when Int >= Lb, Ub >= Int -> % variable length constraint
+ Int;
+ Int -> % fixed value constraint
+ Int;
+ {_,_} ->
+ exit({error,{asn1,{integer_range,Range,Int}}});
+ SingleValue when integer(SingleValue) ->
+ exit({error,{asn1,{integer_range,Range,Int}}});
+ _ -> % some strange constraint that we don't support yet
+ Int
+ end.
+
+number2name(Int,[]) ->
+ Int;
+number2name(Int,NamedNumberList) ->
+ case lists:keysearch(Int, 2, NamedNumberList) of
+ {value,{NamedVal, _}} ->
+ NamedVal;
+ _ ->
+ Int
+ end.
+
+
+%%============================================================================
+%% Enumerated value, ITU_T X.690 Chapter 8.4
+
+%% encode enumerated value
+%%============================================================================
+encode_enumerated(Val, TagIn) when integer(Val)->
+ encode_tags(TagIn, encode_integer(false,Val));
+encode_enumerated({Name,Val}, TagIn) when atom(Name) ->
+ encode_enumerated(Val, TagIn).
+
+%% The encode_enumerated functions below this line can be removed when the
+%% new code generation is stable. (the functions might have to be kept here
+%% a while longer for compatibility reasons)
+
+encode_enumerated(C, Val, {NamedNumberList,ExtList}, TagIn) when atom(Val) ->
+ case catch encode_enumerated(C, Val, NamedNumberList, TagIn) of
+ {'EXIT',_} -> encode_enumerated(C, Val, ExtList, TagIn);
+ Result -> Result
+ end;
+
+encode_enumerated(C, Val, NamedNumberList, TagIn) when atom(Val) ->
+ case lists:keysearch(Val, 1, NamedNumberList) of
+ {value, {_, NewVal}} ->
+ encode_tags(TagIn, encode_integer(C, NewVal));
+ _ ->
+ exit({error,{asn1, {enumerated_not_in_range, Val}}})
+ end;
+
+encode_enumerated(C, {asn1_enum, Val}, {_,_}, TagIn) when integer(Val) ->
+ encode_tags(TagIn, encode_integer(C,Val));
+
+encode_enumerated(C, {Name,Val}, NamedNumberList, TagIn) when atom(Name) ->
+ encode_enumerated(C, Val, NamedNumberList, TagIn);
+
+encode_enumerated(_C, Val, _NamedNumberList, _TagIn) ->
+ exit({error,{asn1, {enumerated_not_namednumber, Val}}}).
+
+
+
+%%============================================================================
+%% decode enumerated value
+%% (Buffer, Range, NamedNumberList, HasTag, TotalLen) -> Value
+%%===========================================================================
+decode_enumerated(Tlv, Range, NamedNumberList, Tags) ->
+ Buffer = match_tags(Tlv,Tags),
+ decode_enumerated_notag(Buffer, Range, NamedNumberList, Tags).
+
+decode_enumerated_notag(Buffer, _Range, {NamedNumberList,ExtList}, _Tags) ->
+
+ IVal = decode_integer2(size(Buffer), Buffer),
+ case decode_enumerated1(IVal, NamedNumberList) of
+ {asn1_enum,IVal} ->
+ decode_enumerated1(IVal,ExtList);
+ EVal ->
+ EVal
+ end;
+decode_enumerated_notag(Buffer, _Range, NNList, _Tags) ->
+ IVal = decode_integer2(size(Buffer), Buffer),
+ case decode_enumerated1(IVal, NNList) of
+ {asn1_enum,_} ->
+ exit({error,{asn1, {illegal_enumerated, IVal}}});
+ EVal ->
+ EVal
+ end.
+
+decode_enumerated1(Val, NamedNumberList) ->
+ %% it must be a named integer
+ case lists:keysearch(Val, 2, NamedNumberList) of
+ {value,{NamedVal, _}} ->
+ NamedVal;
+ _ ->
+ {asn1_enum,Val}
+ end.
+
+
+%%============================================================================
+%%
+%% Real value, ITU_T X.690 Chapter 8.5
+%%============================================================================
+%%
+%% encode real value
+%%============================================================================
+
+%% only base 2 internally so far!!
+encode_real(0, TagIn) ->
+ encode_tags(TagIn, {[],0});
+encode_real('PLUS-INFINITY', TagIn) ->
+ encode_tags(TagIn, {[64],1});
+encode_real('MINUS-INFINITY', TagIn) ->
+ encode_tags(TagIn, {[65],1});
+encode_real(Val, TagIn) when tuple(Val)->
+ encode_tags(TagIn, encode_real(Val)).
+
+%%%%%%%%%%%%%%
+%% not optimal efficient..
+%% only base 2 of Mantissa encoding!
+%% only base 2 of ExpBase encoding!
+encode_real({Man, Base, Exp}) ->
+%% io:format("Mantissa: ~w Base: ~w, Exp: ~w~n",[Man, Base, Exp]),
+
+ OctExp = if Exp >= 0 -> list_to_binary(encode_integer_pos(Exp, []));
+ true -> list_to_binary(encode_integer_neg(Exp, []))
+ end,
+%% ok = io:format("OctExp: ~w~n",[OctExp]),
+ SignBit = if Man > 0 -> 0; % bit 7 is pos or neg, no Zeroval
+ true -> 1
+ end,
+%% ok = io:format("SignBitMask: ~w~n",[SignBitMask]),
+ InBase = if Base =:= 2 -> 0; % bit 6,5: only base 2 this far!
+ true ->
+ exit({error,{asn1, {encode_real_non_supported_encodeing, Base}}})
+ end,
+ SFactor = 0, % bit 4,3: no scaling since only base 2
+ OctExpLen = size(OctExp),
+ if OctExpLen > 255 ->
+ exit({error,{asn1, {to_big_exp_in_encode_real, OctExpLen}}});
+ true -> true %% make real assert later..
+ end,
+ {LenCode, EOctets} = case OctExpLen of % bit 2,1
+ 1 -> {0, OctExp};
+ 2 -> {1, OctExp};
+ 3 -> {2, OctExp};
+ _ -> {3, <<OctExpLen, OctExp/binary>>}
+ end,
+ FirstOctet = <<1:1,SignBit:1,InBase:2,SFactor:2,LenCode:2>>,
+ OctMantissa = if Man > 0 -> list_to_binary(minimum_octets(Man));
+ true -> list_to_binary(minimum_octets(-(Man))) % signbit keeps track of sign
+ end,
+ %% ok = io:format("LenMask: ~w EOctets: ~w~nFirstOctet: ~w OctMantissa: ~w OctExpLen: ~w~n", [LenMask, EOctets, FirstOctet, OctMantissa, OctExpLen]),
+ Bin = <<FirstOctet/binary, EOctets/binary, OctMantissa/binary>>,
+ {Bin, size(Bin)}.
+
+
+%%============================================================================
+%% decode real value
+%%
+%% decode_real([OctetBufferList], tuple|value, tag|notag) ->
+%% {{Mantissa, Base, Exp} | realval | PLUS-INFINITY | MINUS-INFINITY | 0,
+%% RestBuff}
+%%
+%% only for base 2 decoding sofar!!
+%%============================================================================
+
+decode_real(Tlv, Form, Tags) ->
+ Buffer = match_tags(Tlv,Tags),
+ decode_real_notag(Buffer, Form).
+
+decode_real_notag(_Buffer, _Form) ->
+ exit({error,{asn1, {unimplemented,real}}}).
+%% decode_real2(Buffer, Form, size(Buffer)).
+
+% decode_real2(Buffer, Form, Len) ->
+% <<First, Buffer2/binary>> = Buffer,
+% if
+% First =:= 2#01000000 -> {'PLUS-INFINITY', Buffer2};
+% First =:= 2#01000001 -> {'MINUS-INFINITY', Buffer2};
+% First =:= 2#00000000 -> {0, Buffer2};
+% true ->
+% %% have some check here to verify only supported bases (2)
+% <<B7:1,B6:1,B5_4:2,B3_2:2,B1_0:2>> = <<First>>,
+% Sign = B6,
+% Base =
+% case B5_4 of
+% 0 -> 2; % base 2, only one so far
+% _ -> exit({error,{asn1, {non_supported_base, First}}})
+% end,
+% ScalingFactor =
+% case B3_2 of
+% 0 -> 0; % no scaling so far
+% _ -> exit({error,{asn1, {non_supported_scaling, First}}})
+% end,
+
+% {FirstLen,Exp,Buffer3} =
+% case B1_0 of
+% 0 ->
+% <<_:1/unit:8,Buffer21/binary>> = Buffer2,
+% {2, decode_integer2(1, Buffer2),Buffer21};
+% 1 ->
+% <<_:2/unit:8,Buffer21/binary>> = Buffer2,
+% {3, decode_integer2(2, Buffer2)};
+% 2 ->
+% <<_:3/unit:8,Buffer21/binary>> = Buffer2,
+% {4, decode_integer2(3, Buffer2)};
+% 3 ->
+% <<ExpLen1,RestBuffer/binary>> = Buffer2,
+% <<_:ExpLen1/unit:8,RestBuffer2/binary>> = RestBuffer,
+% { ExpLen1 + 2,
+% decode_integer2(ExpLen1, RestBuffer, RemBytes1),
+% RestBuffer2}
+% end,
+% Length = Len - FirstLen,
+% <<LongInt:Length/unit:8,RestBuff/binary>> = Buffer3,
+% {Mantissa, Buffer4} =
+% if Sign =:= 0 ->
+
+% {LongInt, RestBuff};% sign plus,
+% true ->
+
+% {-LongInt, RestBuff}% sign minus
+% end,
+% case Form of
+% tuple ->
+% {Val,Buf,RemB} = Exp,
+% {{Mantissa, Base, {Val,Buf}}, Buffer4, RemBytes2+RemBytes3};
+% _value ->
+% comming
+% end
+% end.
+
+
+%%============================================================================
+%% Bitstring value, ITU_T X.690 Chapter 8.6
+%%
+%% encode bitstring value
+%%
+%% bitstring NamedBitList
+%% Val can be of:
+%% - [identifiers] where only named identifers are set to one,
+%% the Constraint must then have some information of the
+%% bitlength.
+%% - [list of ones and zeroes] all bits
+%% - integer value representing the bitlist
+%% C is constrint Len, only valid when identifiers
+%%============================================================================
+
+encode_bit_string(C,Bin={Unused,BinBits},NamedBitList,TagIn) when integer(Unused), binary(BinBits) ->
+ encode_bin_bit_string(C,Bin,NamedBitList,TagIn);
+encode_bit_string(C, [FirstVal | RestVal], NamedBitList, TagIn) when atom(FirstVal) ->
+ encode_bit_string_named(C, [FirstVal | RestVal], NamedBitList, TagIn);
+
+encode_bit_string(C, [{bit,X} | RestVal], NamedBitList, TagIn) ->
+ encode_bit_string_named(C, [{bit,X} | RestVal], NamedBitList, TagIn);
+
+encode_bit_string(C, [FirstVal| RestVal], NamedBitList, TagIn) when integer(FirstVal) ->
+ encode_bit_string_bits(C, [FirstVal | RestVal], NamedBitList, TagIn);
+
+encode_bit_string(_C, 0, _NamedBitList, TagIn) ->
+ encode_tags(TagIn, <<0>>,1);
+
+encode_bit_string(_C, [], _NamedBitList, TagIn) ->
+ encode_tags(TagIn, <<0>>,1);
+
+encode_bit_string(C, IntegerVal, NamedBitList, TagIn) when integer(IntegerVal) ->
+ BitListVal = int_to_bitlist(IntegerVal),
+ encode_bit_string_bits(C, BitListVal, NamedBitList, TagIn);
+
+encode_bit_string(C, {Name,BitList}, NamedBitList, TagIn) when atom(Name) ->
+ encode_bit_string(C, BitList, NamedBitList, TagIn).
+
+
+
+int_to_bitlist(0) ->
+ [];
+int_to_bitlist(Int) when integer(Int), Int >= 0 ->
+ [Int band 1 | int_to_bitlist(Int bsr 1)].
+
+
+%%=================================================================
+%% Encode BIT STRING of the form {Unused,BinBits}.
+%% Unused is the number of unused bits in the last byte in BinBits
+%% and BinBits is a binary representing the BIT STRING.
+%%=================================================================
+encode_bin_bit_string(C,{Unused,BinBits},_NamedBitList,TagIn)->
+ case get_constraint(C,'SizeConstraint') of
+ no ->
+ remove_unused_then_dotag(TagIn, Unused, BinBits);
+ {_Min,Max} ->
+ BBLen = (size(BinBits)*8)-Unused,
+ if
+ BBLen > Max ->
+ exit({error,{asn1,
+ {bitstring_length,
+ {{was,BBLen},{maximum,Max}}}}});
+ true ->
+ remove_unused_then_dotag(TagIn, Unused, BinBits)
+ end;
+ Size ->
+ case ((size(BinBits)*8)-Unused) of
+ BBSize when BBSize =< Size ->
+ remove_unused_then_dotag(TagIn, Unused, BinBits);
+ BBSize ->
+ exit({error,{asn1,
+ {bitstring_length,
+ {{was,BBSize},{should_be,Size}}}}})
+ end
+ end.
+
+remove_unused_then_dotag(TagIn,Unused,BinBits) ->
+ case Unused of
+ 0 when (size(BinBits) == 0) ->
+ encode_tags(TagIn,<<0>>,1);
+ 0 ->
+ Bin = <<Unused,BinBits/binary>>,
+ encode_tags(TagIn,Bin,size(Bin));
+ Num ->
+ N = (size(BinBits)-1),
+ <<BBits:N/binary,LastByte>> = BinBits,
+ encode_tags(TagIn,
+ [Unused,binary_to_list(BBits) ++[(LastByte bsr Num) bsl Num]],
+ 1+size(BinBits))
+ end.
+
+
+%%=================================================================
+%% Encode named bits
+%%=================================================================
+
+encode_bit_string_named(C, [FirstVal | RestVal], NamedBitList, TagIn) ->
+ ToSetPos = get_all_bitposes([FirstVal | RestVal], NamedBitList, []),
+ Size =
+ case get_constraint(C,'SizeConstraint') of
+ no ->
+ lists:max(ToSetPos)+1;
+ {_Min,Max} ->
+ Max;
+ TSize ->
+ TSize
+ end,
+ BitList = make_and_set_list(Size, ToSetPos, 0),
+ {Len, Unused, OctetList} = encode_bitstring(BitList),
+ encode_tags(TagIn, [Unused|OctetList],Len+1).
+
+
+%%----------------------------------------
+%% get_all_bitposes([list of named bits to set], named_bit_db, []) ->
+%% [sorted_list_of_bitpositions_to_set]
+%%----------------------------------------
+
+get_all_bitposes([{bit,ValPos}|Rest], NamedBitList, Ack) ->
+ get_all_bitposes(Rest, NamedBitList, [ValPos | Ack ]);
+get_all_bitposes([Val | Rest], NamedBitList, Ack) when atom(Val) ->
+ case lists:keysearch(Val, 1, NamedBitList) of
+ {value, {_ValName, ValPos}} ->
+ get_all_bitposes(Rest, NamedBitList, [ValPos | Ack]);
+ _ ->
+ exit({error,{asn1, {bitstring_namedbit, Val}}})
+ end;
+get_all_bitposes([], _NamedBitList, Ack) ->
+ lists:sort(Ack).
+
+
+%%----------------------------------------
+%% make_and_set_list(Len of list to return, [list of positions to set to 1])->
+%% returns list of Len length, with all in SetPos set.
+%% in positioning in list the first element is 0, the second 1 etc.., but
+%% Len will make a list of length Len, not Len + 1.
+%% BitList = make_and_set_list(C, ToSetPos, 0),
+%%----------------------------------------
+
+make_and_set_list(0, [], _) -> [];
+make_and_set_list(0, _, _) ->
+ exit({error,{asn1,bitstring_sizeconstraint}});
+make_and_set_list(Len, [XPos|SetPos], XPos) ->
+ [1 | make_and_set_list(Len - 1, SetPos, XPos + 1)];
+make_and_set_list(Len, [Pos|SetPos], XPos) ->
+ [0 | make_and_set_list(Len - 1, [Pos | SetPos], XPos + 1)];
+make_and_set_list(Len, [], XPos) ->
+ [0 | make_and_set_list(Len - 1, [], XPos + 1)].
+
+
+
+
+
+
+%%=================================================================
+%% Encode bit string for lists of ones and zeroes
+%%=================================================================
+encode_bit_string_bits(C, BitListVal, _NamedBitList, TagIn) when list(BitListVal) ->
+ case get_constraint(C,'SizeConstraint') of
+ no ->
+ {Len, Unused, OctetList} = encode_bitstring(BitListVal),
+ %%add unused byte to the Len
+ encode_tags(TagIn, [Unused | OctetList], Len+1);
+ Constr={Min,Max} when integer(Min),integer(Max) ->
+ encode_constr_bit_str_bits(Constr,BitListVal,TagIn);
+ {Constr={_,_},[]} ->%Constr={Min,Max}
+ %% constraint with extension mark
+ encode_constr_bit_str_bits(Constr,BitListVal,TagIn);
+ Constr={{_,_},{_,_}} ->%{{Min1,Max1},{Min2,Max2}}
+ %% constraint with extension mark
+ encode_constr_bit_str_bits(Constr,BitListVal,TagIn);
+ Size ->
+ case length(BitListVal) of
+ BitSize when BitSize == Size ->
+ {Len, Unused, OctetList} = encode_bitstring(BitListVal),
+ %%add unused byte to the Len
+ encode_tags(TagIn, [Unused | OctetList], Len+1);
+ BitSize when BitSize < Size ->
+ PaddedList = pad_bit_list(Size-BitSize,BitListVal),
+ {Len, Unused, OctetList} = encode_bitstring(PaddedList),
+ %%add unused byte to the Len
+ encode_tags(TagIn, [Unused | OctetList], Len+1);
+ BitSize ->
+ exit({error,{asn1,
+ {bitstring_length, {{was,BitSize},{should_be,Size}}}}})
+ end
+
+ end.
+
+encode_constr_bit_str_bits({_Min,Max},BitListVal,TagIn) ->
+ BitLen = length(BitListVal),
+ if
+ BitLen > Max ->
+ exit({error,{asn1,{bitstring_length,{{was,BitLen},
+ {maximum,Max}}}}});
+ true ->
+ {Len, Unused, OctetList} = encode_bitstring(BitListVal),
+ %%add unused byte to the Len
+ encode_tags(TagIn, [Unused, OctetList], Len+1)
+ end;
+encode_constr_bit_str_bits({{_Min1,Max1},{Min2,Max2}},BitListVal,TagIn) ->
+ BitLen = length(BitListVal),
+ case BitLen of
+ Len when Len > Max2 ->
+ exit({error,{asn1,{bitstring_length,{{was,BitLen},
+ {maximum,Max2}}}}});
+ Len when Len > Max1, Len < Min2 ->
+ exit({error,{asn1,{bitstring_length,{{was,BitLen},
+ {not_allowed_interval,
+ Max1,Min2}}}}});
+ _ ->
+ {Len, Unused, OctetList} = encode_bitstring(BitListVal),
+ %%add unused byte to the Len
+ encode_tags(TagIn, [Unused, OctetList], Len+1)
+ end.
+
+%% returns a list of length Size + length(BitListVal), with BitListVal
+%% as the most significant elements followed by padded zero elements
+pad_bit_list(Size,BitListVal) ->
+ Tail = lists:duplicate(Size,0),
+ lists:append(BitListVal,Tail).
+
+%%=================================================================
+%% Do the actual encoding
+%% ([bitlist]) -> {ListLen, UnusedBits, OctetList}
+%%=================================================================
+
+encode_bitstring([B8, B7, B6, B5, B4, B3, B2, B1 | Rest]) ->
+ Val = (B8 bsl 7) bor (B7 bsl 6) bor (B6 bsl 5) bor (B5 bsl 4) bor
+ (B4 bsl 3) bor (B3 bsl 2) bor (B2 bsl 1) bor B1,
+ encode_bitstring(Rest, [Val], 1);
+encode_bitstring(Val) ->
+ {Unused, Octet} = unused_bitlist(Val, 7, 0),
+ {1, Unused, [Octet]}.
+
+encode_bitstring([B8, B7, B6, B5, B4, B3, B2, B1 | Rest], Ack, Len) ->
+ Val = (B8 bsl 7) bor (B7 bsl 6) bor (B6 bsl 5) bor (B5 bsl 4) bor
+ (B4 bsl 3) bor (B3 bsl 2) bor (B2 bsl 1) bor B1,
+ encode_bitstring(Rest, [Ack | [Val]], Len + 1);
+%%even multiple of 8 bits..
+encode_bitstring([], Ack, Len) ->
+ {Len, 0, Ack};
+%% unused bits in last octet
+encode_bitstring(Rest, Ack, Len) ->
+% io:format("uneven ~w ~w ~w~n",[Rest, Ack, Len]),
+ {Unused, Val} = unused_bitlist(Rest, 7, 0),
+ {Len + 1, Unused, [Ack | [Val]]}.
+
+%%%%%%%%%%%%%%%%%%
+%% unused_bitlist([list of ones and zeros <= 7], 7, []) ->
+%% {Unused bits, Last octet with bits moved to right}
+unused_bitlist([], Trail, Ack) ->
+ {Trail + 1, Ack};
+unused_bitlist([Bit | Rest], Trail, Ack) ->
+%% io:format("trail Bit: ~w Rest: ~w Trail: ~w Ack:~w~n",[Bit, Rest, Trail, Ack]),
+ unused_bitlist(Rest, Trail - 1, (Bit bsl Trail) bor Ack).
+
+
+%%============================================================================
+%% decode bitstring value
+%% (Buffer, Range, NamedNumberList, HasTag, TotalLen) -> {Integer, Remain, RemovedBytes}
+%%============================================================================
+
+decode_compact_bit_string(Buffer, Range, NamedNumberList, Tags) ->
+% NewTags = new_tags(HasTag,#tag{class=?UNIVERSAL,number=?N_BIT_STRING}),
+ decode_restricted_string(Buffer, Range, ?N_BIT_STRING, Tags,
+ NamedNumberList,bin).
+
+decode_bit_string(Buffer, Range, NamedNumberList, Tags) ->
+% NewTags = new_tags(HasTag,#tag{class=?UNIVERSAL,number=?N_BIT_STRING}),
+ decode_restricted_string(Buffer, Range, ?N_BIT_STRING, Tags,
+ NamedNumberList,old).
+
+
+decode_bit_string2(<<0>>,_NamedNumberList,BinOrOld) ->
+ case BinOrOld of
+ bin ->
+ {0,<<>>};
+ _ ->
+ []
+ end;
+decode_bit_string2(<<Unused,Bits/binary>>,NamedNumberList,BinOrOld) ->
+ case NamedNumberList of
+ [] ->
+ case BinOrOld of
+ bin ->
+ {Unused,Bits};
+ _ ->
+ decode_bitstring2(size(Bits), Unused, Bits)
+ end;
+ _ ->
+ BitString = decode_bitstring2(size(Bits), Unused, Bits),
+ decode_bitstring_NNL(BitString,NamedNumberList)
+ end.
+
+%%----------------------------------------
+%% Decode the in buffer to bits
+%%----------------------------------------
+decode_bitstring2(1,Unused,<<B7:1,B6:1,B5:1,B4:1,B3:1,B2:1,B1:1,B0:1,_/binary>>) ->
+ lists:sublist([B7,B6,B5,B4,B3,B2,B1,B0],8-Unused);
+decode_bitstring2(Len, Unused,
+ <<B7:1,B6:1,B5:1,B4:1,B3:1,B2:1,B1:1,B0:1,Buffer/binary>>) ->
+ [B7, B6, B5, B4, B3, B2, B1, B0 |
+ decode_bitstring2(Len - 1, Unused, Buffer)].
+
+%%decode_bitstring2(1, Unused, Buffer) ->
+%% make_bits_of_int(hd(Buffer), 128, 8-Unused);
+%%decode_bitstring2(Len, Unused, [BitVal | Buffer]) ->
+%% [B7, B6, B5, B4, B3, B2, B1, B0] = make_bits_of_int(BitVal, 128, 8),
+%% [B7, B6, B5, B4, B3, B2, B1, B0 |
+%% decode_bitstring2(Len - 1, Unused, Buffer)].
+
+
+%%make_bits_of_int(_, _, 0) ->
+%% [];
+%%make_bits_of_int(BitVal, MaskVal, Unused) when Unused > 0 ->
+%% X = case MaskVal band BitVal of
+%% 0 -> 0 ;
+%% _ -> 1
+%% end,
+%% [X | make_bits_of_int(BitVal, MaskVal bsr 1, Unused - 1)].
+
+
+
+%%----------------------------------------
+%% Decode the bitlist to names
+%%----------------------------------------
+
+
+decode_bitstring_NNL(BitList,NamedNumberList) ->
+ decode_bitstring_NNL(BitList,NamedNumberList,0,[]).
+
+
+decode_bitstring_NNL([],_,_No,Result) ->
+ lists:reverse(Result);
+
+decode_bitstring_NNL([B|BitList],[{Name,No}|NamedNumberList],No,Result) ->
+ if
+ B == 0 ->
+ decode_bitstring_NNL(BitList,NamedNumberList,No+1,Result);
+ true ->
+ decode_bitstring_NNL(BitList,NamedNumberList,No+1,[Name|Result])
+ end;
+decode_bitstring_NNL([1|BitList],NamedNumberList,No,Result) ->
+ decode_bitstring_NNL(BitList,NamedNumberList,No+1,[{bit,No}|Result]);
+decode_bitstring_NNL([0|BitList],NamedNumberList,No,Result) ->
+ decode_bitstring_NNL(BitList,NamedNumberList,No+1,Result).
+
+
+%%============================================================================
+%% Octet string, ITU_T X.690 Chapter 8.7
+%%
+%% encode octet string
+%% The OctetList must be a flat list of integers in the range 0..255
+%% the function does not check this because it takes to much time
+%%============================================================================
+encode_octet_string(_C, OctetList, TagIn) when binary(OctetList) ->
+ encode_tags(TagIn, OctetList, size(OctetList));
+encode_octet_string(_C, OctetList, TagIn) when list(OctetList) ->
+ encode_tags(TagIn, OctetList, length(OctetList));
+encode_octet_string(C, {Name,OctetList}, TagIn) when atom(Name) ->
+ encode_octet_string(C, OctetList, TagIn).
+
+
+%%============================================================================
+%% decode octet string
+%% (Buffer, Range, HasTag, TotalLen) -> {String, Remain, RemovedBytes}
+%%
+%% Octet string is decoded as a restricted string
+%%============================================================================
+decode_octet_string(Buffer, Range, Tags) ->
+% NewTags = new_tags(HasTag,#tag{class=?UNIVERSAL,number=?N_OCTET_STRING}),
+ decode_restricted_string(Buffer, Range, ?N_OCTET_STRING,
+ Tags, [], old).
+
+%%============================================================================
+%% Null value, ITU_T X.690 Chapter 8.8
+%%
+%% encode NULL value
+%%============================================================================
+
+encode_null({Name, _Val}, TagIn) when atom(Name) ->
+ encode_tags(TagIn, [], 0);
+encode_null(_Val, TagIn) ->
+ encode_tags(TagIn, [], 0).
+
+%%============================================================================
+%% decode NULL value
+%% (Buffer, HasTag, TotalLen) -> {NULL, Remain, RemovedBytes}
+%%============================================================================
+
+decode_null(Tlv, Tags) ->
+ Val = match_tags(Tlv, Tags),
+ case Val of
+ <<>> ->
+ 'NULL';
+ _ ->
+ exit({error,{asn1,{decode_null,Val}}})
+ end.
+
+%%============================================================================
+%% Object identifier, ITU_T X.690 Chapter 8.19
+%%
+%% encode Object Identifier value
+%%============================================================================
+
+encode_object_identifier({Name,Val}, TagIn) when atom(Name) ->
+ encode_object_identifier(Val, TagIn);
+encode_object_identifier(Val, TagIn) ->
+ encode_tags(TagIn, e_object_identifier(Val)).
+
+e_object_identifier({'OBJECT IDENTIFIER', V}) ->
+ e_object_identifier(V);
+e_object_identifier({Cname, V}) when atom(Cname), tuple(V) ->
+ e_object_identifier(tuple_to_list(V));
+e_object_identifier({Cname, V}) when atom(Cname), list(V) ->
+ e_object_identifier(V);
+e_object_identifier(V) when tuple(V) ->
+ e_object_identifier(tuple_to_list(V));
+
+%%%%%%%%%%%%%%%
+%% e_object_identifier([List of Obect Identifiers]) ->
+%% {[Encoded Octetlist of ObjIds], IntLength}
+%%
+e_object_identifier([E1, E2 | Tail]) ->
+ Head = 40*E1 + E2, % wow!
+ {H,Lh} = mk_object_val(Head),
+ {R,Lr} = enc_obj_id_tail(Tail, [], 0),
+ {[H|R], Lh+Lr}.
+
+enc_obj_id_tail([], Ack, Len) ->
+ {lists:reverse(Ack), Len};
+enc_obj_id_tail([H|T], Ack, Len) ->
+ {B, L} = mk_object_val(H),
+ enc_obj_id_tail(T, [B|Ack], Len+L).
+
+%% e_object_identifier([List of Obect Identifiers]) ->
+%% {[Encoded Octetlist of ObjIds], IntLength}
+%%
+%%e_object_identifier([E1, E2 | Tail]) ->
+%% Head = 40*E1 + E2, % wow!
+%% F = fun(Val, AckLen) ->
+%% {L, Ack} = mk_object_val(Val),
+%% {L, Ack + AckLen}
+%% end,
+%% {Octets, Len} = lists:mapfoldl(F, 0, [Head | Tail]).
+
+%%%%%%%%%%%
+%% mk_object_val(Value) -> {OctetList, Len}
+%% returns a Val as a list of octets, the 8 bit is allways set to one except
+%% for the last octet, where its 0
+%%
+
+
+mk_object_val(Val) when Val =< 127 ->
+ {[255 band Val], 1};
+mk_object_val(Val) ->
+ mk_object_val(Val bsr 7, [Val band 127], 1).
+mk_object_val(0, Ack, Len) ->
+ {Ack, Len};
+mk_object_val(Val, Ack, Len) ->
+ mk_object_val(Val bsr 7, [((Val band 127) bor 128) | Ack], Len + 1).
+
+
+
+%%============================================================================
+%% decode Object Identifier value
+%% (Buffer, HasTag, TotalLen) -> {{ObjId}, Remain, RemovedBytes}
+%%============================================================================
+
+decode_object_identifier(Tlv, Tags) ->
+ Val = match_tags(Tlv, Tags),
+ [AddedObjVal|ObjVals] = dec_subidentifiers(Val,0,[]),
+ {Val1, Val2} = if
+ AddedObjVal < 40 ->
+ {0, AddedObjVal};
+ AddedObjVal < 80 ->
+ {1, AddedObjVal - 40};
+ true ->
+ {2, AddedObjVal - 80}
+ end,
+ list_to_tuple([Val1, Val2 | ObjVals]).
+
+dec_subidentifiers(<<>>,_Av,Al) ->
+ lists:reverse(Al);
+dec_subidentifiers(<<1:1,H:7,T/binary>>,Av,Al) ->
+ dec_subidentifiers(T,(Av bsl 7) + H,Al);
+dec_subidentifiers(<<H,T/binary>>,Av,Al) ->
+ dec_subidentifiers(T,0,[((Av bsl 7) + H)|Al]).
+
+
+%%============================================================================
+%% Restricted character string types, ITU_T X.690 Chapter 8.20
+%%
+%% encode Numeric Printable Teletex Videotex Visible IA5 Graphic General strings
+%%============================================================================
+%% The StringType arg is kept for future use but might be removed
+encode_restricted_string(_C, OctetList, _StringType, TagIn)
+ when binary(OctetList) ->
+ encode_tags(TagIn, OctetList, size(OctetList));
+encode_restricted_string(_C, OctetList, _StringType, TagIn)
+ when list(OctetList) ->
+ encode_tags(TagIn, OctetList, length(OctetList));
+encode_restricted_string(C,{Name,OctetL}, StringType, TagIn) when atom(Name)->
+ encode_restricted_string(C, OctetL, StringType, TagIn).
+
+%%============================================================================
+%% decode Numeric Printable Teletex Videotex Visible IA5 Graphic General strings
+%% (Buffer, Range, StringType, HasTag, TotalLen) ->
+%% {String, Remain, RemovedBytes}
+%%============================================================================
+
+decode_restricted_string(Buffer, Range, StringType, Tags) ->
+ decode_restricted_string(Buffer, Range, StringType, Tags, [], old).
+
+
+decode_restricted_string(Tlv, Range, StringType, TagsIn,
+ NamedNumberList, BinOrOld) ->
+ Val = match_tags(Tlv, TagsIn),
+ Val2 =
+ case Val of
+ PartList = [_H|_T] -> % constructed val
+ Bin = collect_parts(PartList),
+ decode_restricted(Bin, StringType,
+ NamedNumberList, BinOrOld);
+ Bin ->
+ decode_restricted(Bin, StringType,
+ NamedNumberList, BinOrOld)
+ end,
+ check_and_convert_restricted_string(Val2,StringType,Range,NamedNumberList,BinOrOld).
+
+
+
+% case StringType of
+% ?N_BIT_STRING when BinOrOld == bin ->
+% {concat_bit_binaries(AccVal, Val), AccRb+Rb};
+% _ when binary(Val),binary(AccVal) ->
+% {<<AccVal/binary,Val/binary>>,AccRb+Rb};
+% _ when binary(Val), AccVal==[] ->
+% {Val,AccRb+Rb};
+% _ ->
+% {AccVal++Val, AccRb+Rb}
+% end,
+
+
+
+decode_restricted(Bin, StringType, NamedNumberList,BinOrOld) ->
+ case StringType of
+ ?N_BIT_STRING ->
+ decode_bit_string2(Bin, NamedNumberList, BinOrOld);
+ ?N_UniversalString ->
+ mk_universal_string(binary_to_list(Bin));
+ ?N_BMPString ->
+ mk_BMP_string(binary_to_list(Bin));
+ _ ->
+ Bin
+ end.
+
+
+check_and_convert_restricted_string(Val,StringType,Range,NamedNumberList,_BinOrOld) ->
+ {StrLen,NewVal} = case StringType of
+ ?N_BIT_STRING when NamedNumberList /= [] ->
+ {no_check,Val};
+ ?N_BIT_STRING when list(Val) ->
+ {length(Val),Val};
+ ?N_BIT_STRING when tuple(Val) ->
+ {(size(element(2,Val))*8) - element(1,Val),Val};
+ _ when binary(Val) ->
+ {size(Val),binary_to_list(Val)};
+ _ when list(Val) ->
+ {length(Val), Val}
+ end,
+ case Range of
+ _ when StrLen == no_check ->
+ NewVal;
+ [] -> % No length constraint
+ NewVal;
+ {Lb,Ub} when StrLen >= Lb, Ub >= StrLen -> % variable length constraint
+ NewVal;
+ {{Lb,_Ub},[]} when StrLen >= Lb ->
+ NewVal;
+ {{Lb1,Ub1},{Lb2,Ub2}} when StrLen >= Lb1, StrLen =< Ub1;
+ StrLen =< Ub2, StrLen >= Lb2 ->
+ NewVal;
+ StrLen -> % fixed length constraint
+ NewVal;
+ {_,_} ->
+ exit({error,{asn1,{length,Range,Val}}});
+ _Len when integer(_Len) ->
+ exit({error,{asn1,{length,Range,Val}}});
+ _ -> % some strange constraint that we don't support yet
+ NewVal
+ end.
+
+
+%%============================================================================
+%% encode Universal string
+%%============================================================================
+
+encode_universal_string(C, {Name, Universal}, TagIn) when atom(Name) ->
+ encode_universal_string(C, Universal, TagIn);
+encode_universal_string(_C, Universal, TagIn) ->
+ OctetList = mk_uni_list(Universal),
+ encode_tags(TagIn, OctetList, length(OctetList)).
+
+mk_uni_list(In) ->
+ mk_uni_list(In,[]).
+
+mk_uni_list([],List) ->
+ lists:reverse(List);
+mk_uni_list([{A,B,C,D}|T],List) ->
+ mk_uni_list(T,[D,C,B,A|List]);
+mk_uni_list([H|T],List) ->
+ mk_uni_list(T,[H,0,0,0|List]).
+
+%%===========================================================================
+%% decode Universal strings
+%% (Buffer, Range, StringType, HasTag, LenIn) ->
+%% {String, Remain, RemovedBytes}
+%%===========================================================================
+
+decode_universal_string(Buffer, Range, Tags) ->
+ decode_restricted_string(Buffer, Range, ?N_UniversalString,
+ Tags, [], old).
+
+
+mk_universal_string(In) ->
+ mk_universal_string(In,[]).
+
+mk_universal_string([],Acc) ->
+ lists:reverse(Acc);
+mk_universal_string([0,0,0,D|T],Acc) ->
+ mk_universal_string(T,[D|Acc]);
+mk_universal_string([A,B,C,D|T],Acc) ->
+ mk_universal_string(T,[{A,B,C,D}|Acc]).
+
+
+%%============================================================================
+%% encode BMP string
+%%============================================================================
+
+encode_BMP_string(C, {Name,BMPString}, TagIn) when atom(Name)->
+ encode_BMP_string(C, BMPString, TagIn);
+encode_BMP_string(_C, BMPString, TagIn) ->
+ OctetList = mk_BMP_list(BMPString),
+ encode_tags(TagIn, OctetList, length(OctetList)).
+
+mk_BMP_list(In) ->
+ mk_BMP_list(In,[]).
+
+mk_BMP_list([],List) ->
+ lists:reverse(List);
+mk_BMP_list([{0,0,C,D}|T],List) ->
+ mk_BMP_list(T,[D,C|List]);
+mk_BMP_list([H|T],List) ->
+ mk_BMP_list(T,[H,0|List]).
+
+%%============================================================================
+%% decode (OctetList, Range(ignored), tag|notag) -> {ValList, RestList}
+%% (Buffer, Range, StringType, HasTag, TotalLen) ->
+%% {String, Remain, RemovedBytes}
+%%============================================================================
+decode_BMP_string(Buffer, Range, Tags) ->
+ decode_restricted_string(Buffer, Range, ?N_BMPString,
+ Tags, [], old).
+
+mk_BMP_string(In) ->
+ mk_BMP_string(In,[]).
+
+mk_BMP_string([],US) ->
+ lists:reverse(US);
+mk_BMP_string([0,B|T],US) ->
+ mk_BMP_string(T,[B|US]);
+mk_BMP_string([C,D|T],US) ->
+ mk_BMP_string(T,[{0,0,C,D}|US]).
+
+
+%%============================================================================
+%% Generalized time, ITU_T X.680 Chapter 39
+%%
+%% encode Generalized time
+%%============================================================================
+
+encode_generalized_time(C, {Name,OctetList}, TagIn) when atom(Name) ->
+ encode_generalized_time(C, OctetList, TagIn);
+encode_generalized_time(_C, OctetList, TagIn) ->
+ encode_tags(TagIn, OctetList, length(OctetList)).
+
+%%============================================================================
+%% decode Generalized time
+%% (Buffer, Range, HasTag, TotalLen) -> {String, Remain, RemovedBytes}
+%%============================================================================
+
+decode_generalized_time(Tlv, _Range, Tags) ->
+ Val = match_tags(Tlv, Tags),
+ NewVal = case Val of
+ PartList = [_H|_T] -> % constructed
+ collect_parts(PartList);
+ Bin ->
+ Bin
+ end,
+ binary_to_list(NewVal).
+
+%%============================================================================
+%% Universal time, ITU_T X.680 Chapter 40
+%%
+%% encode UTC time
+%%============================================================================
+
+encode_utc_time(C, {Name,OctetList}, TagIn) when atom(Name) ->
+ encode_utc_time(C, OctetList, TagIn);
+encode_utc_time(_C, OctetList, TagIn) ->
+ encode_tags(TagIn, OctetList, length(OctetList)).
+
+%%============================================================================
+%% decode UTC time
+%% (Buffer, Range, HasTag, TotalLen) -> {String, Remain, RemovedBytes}
+%%============================================================================
+
+decode_utc_time(Tlv, _Range, Tags) ->
+ Val = match_tags(Tlv, Tags),
+ NewVal = case Val of
+ PartList = [_H|_T] -> % constructed
+ collect_parts(PartList);
+ Bin ->
+ Bin
+ end,
+ binary_to_list(NewVal).
+
+
+%%============================================================================
+%% Length handling
+%%
+%% Encode length
+%%
+%% encode_length(Int | indefinite) ->
+%% [<127]| [128 + Int (<127),OctetList] | [16#80]
+%%============================================================================
+
+encode_length(indefinite) ->
+ {[16#80],1}; % 128
+encode_length(L) when L =< 16#7F ->
+ {[L],1};
+encode_length(L) ->
+ Oct = minimum_octets(L),
+ Len = length(Oct),
+ if
+ Len =< 126 ->
+ {[ (16#80+Len) | Oct ],Len+1};
+ true ->
+ exit({error,{asn1, to_long_length_oct, Len}})
+ end.
+
+
+%% Val must be >= 0
+minimum_octets(Val) ->
+ minimum_octets(Val,[]).
+
+minimum_octets(0,Acc) ->
+ Acc;
+minimum_octets(Val, Acc) ->
+ minimum_octets((Val bsr 8),[Val band 16#FF | Acc]).
+
+
+%%===========================================================================
+%% Decode length
+%%
+%% decode_length(OctetList) -> {{indefinite, RestOctetsL}, NoRemovedBytes} |
+%% {{Length, RestOctetsL}, NoRemovedBytes}
+%%===========================================================================
+
+decode_length(<<1:1,0:7,T/binary>>) ->
+ {indefinite, T};
+decode_length(<<0:1,Length:7,T/binary>>) ->
+ {Length,T};
+decode_length(<<1:1,LL:7,T/binary>>) ->
+ <<Length:LL/unit:8,Rest/binary>> = T,
+ {Length,Rest}.
+
+
+
+%%-------------------------------------------------------------------------
+%% INTERNAL HELPER FUNCTIONS (not exported)
+%%-------------------------------------------------------------------------
+
+
+%% decoding postitive integer values.
+decode_integer2(Len,Bin = <<0:1,_:7,_Bs/binary>>) ->
+ <<Int:Len/unit:8>> = Bin,
+ Int;
+%% decoding negative integer values.
+decode_integer2(Len,<<1:1,B2:7,Bs/binary>>) ->
+ <<N:Len/unit:8>> = <<B2,Bs/binary>>,
+ Int = N - (1 bsl (8 * Len - 1)),
+ Int.
+
+get_constraint(C,Key) ->
+ case lists:keysearch(Key,1,C) of
+ false ->
+ no;
+ {value,{_,V}} ->
+ V
+ end.
+
+collect_parts(TlvList) ->
+ collect_parts(TlvList,[]).
+
+collect_parts([{_,L}|Rest],Acc) when list(L) ->
+ collect_parts(Rest,[collect_parts(L)|Acc]);
+collect_parts([{?N_BIT_STRING,<<Unused,Bits/binary>>}|Rest],_Acc) ->
+ collect_parts_bit(Rest,[Bits],Unused);
+collect_parts([{_T,V}|Rest],Acc) ->
+ collect_parts(Rest,[V|Acc]);
+collect_parts([],Acc) ->
+ list_to_binary(lists:reverse(Acc)).
+
+collect_parts_bit([{?N_BIT_STRING,<<Unused,Bits/binary>>}|Rest],Acc,Uacc) ->
+ collect_parts_bit(Rest,[Bits|Acc],Unused+Uacc);
+collect_parts_bit([],Acc,Uacc) ->
+ list_to_binary([Uacc|lists:reverse(Acc)]).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_check.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_check.erl
new file mode 100644
index 0000000000..cfda8a2a88
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_check.erl
@@ -0,0 +1,333 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1rt_check.erl,v 1.1 2008/12/17 09:53:30 mikpe Exp $
+%%
+-module(asn1rt_check).
+
+-include("asn1_records.hrl").
+
+-export([check_bool/2,
+ check_int/3,
+ check_bitstring/3,
+ check_octetstring/2,
+ check_null/2,
+ check_objectidentifier/2,
+ check_objectdescriptor/2,
+ check_real/2,
+ check_enum/3,
+ check_restrictedstring/2]).
+
+-export([transform_to_EXTERNAL1990/1,
+ transform_to_EXTERNAL1994/1]).
+
+
+check_bool(_Bool,asn1_DEFAULT) ->
+ true;
+check_bool(Bool,Bool) when Bool == true; Bool == false ->
+ true;
+check_bool(_Bool1,Bool2) ->
+ throw({error,Bool2}).
+
+check_int(_,asn1_DEFAULT,_) ->
+ true;
+check_int(Value,Value,_) when integer(Value) ->
+ true;
+check_int(DefValue,Value,NNL) when atom(Value) ->
+ case lists:keysearch(Value,1,NNL) of
+ {value,{_,DefValue}} ->
+ true;
+ _ ->
+ throw({error,DefValue})
+ end;
+check_int(DefaultValue,_Value,_) ->
+ throw({error,DefaultValue}).
+
+% check_bitstring([H|T],[H|T],_) when integer(H) ->
+% true;
+% check_bitstring(V,V,_) when integer(V) ->
+% true;
+%% Two equal lists or integers
+check_bitstring(_,asn1_DEFAULT,_) ->
+ true;
+check_bitstring(V,V,_) ->
+ true;
+%% Default value as a list of 1 and 0 and user value as an integer
+check_bitstring(L=[H|T],Int,_) when integer(Int),integer(H) ->
+ case bit_list_to_int(L,length(T)) of
+ Int -> true;
+ _ -> throw({error,L,Int})
+ end;
+%% Default value as an integer, val as list
+check_bitstring(Int,Val,NBL) when integer(Int),list(Val) ->
+ BL = int_to_bit_list(Int,[],length(Val)),
+ check_bitstring(BL,Val,NBL);
+%% Default value and user value as lists of ones and zeros
+check_bitstring(L1=[H1|_T1],L2=[H2|_T2],NBL=[_H|_T]) when integer(H1),integer(H2) ->
+ L2new = remove_trailing_zeros(L2),
+ check_bitstring(L1,L2new,NBL);
+%% Default value as a list of 1 and 0 and user value as a list of atoms
+check_bitstring(L1=[H1|_T1],L2=[H2|_T2],NBL) when integer(H1),atom(H2) ->
+ case bit_list_to_nbl(L1,NBL,0,[]) of
+ L3 -> check_bitstring(L3,L2,NBL);
+ _ -> throw({error,L2})
+ end;
+%% Both default value and user value as a list of atoms
+check_bitstring(L1=[H1|T1],L2=[H2|_T2],_) when atom(H1),atom(H2) ->
+ length(L1) == length(L2),
+ case lists:member(H1,L2) of
+ true ->
+ check_bitstring1(T1,L2);
+ false -> throw({error,L2})
+ end;
+%% Default value as a list of atoms and user value as a list of 1 and 0
+check_bitstring(L1=[H1|_T1],L2=[H2|_T2],NBL) when atom(H1),integer(H2) ->
+ case bit_list_to_nbl(L2,NBL,0,[]) of
+ L3 ->
+ check_bitstring(L1,L3,NBL);
+ _ -> throw({error,L2})
+ end;
+%% User value in compact format
+check_bitstring(DefVal,CBS={_,_},NBL) ->
+ NewVal = cbs_to_bit_list(CBS),
+ check_bitstring(DefVal,NewVal,NBL);
+check_bitstring(DV,V,_) ->
+ throw({error,DV,V}).
+
+
+bit_list_to_int([0|Bs],ShL)->
+ bit_list_to_int(Bs,ShL-1) + 0;
+bit_list_to_int([1|Bs],ShL) ->
+ bit_list_to_int(Bs,ShL-1) + (1 bsl ShL);
+bit_list_to_int([],_) ->
+ 0.
+
+int_to_bit_list(0,Acc,0) ->
+ Acc;
+int_to_bit_list(Int,Acc,Len) ->
+ int_to_bit_list(Int bsr 1,[Int band 1|Acc],Len - 1).
+
+bit_list_to_nbl([0|T],NBL,Pos,Acc) ->
+ bit_list_to_nbl(T,NBL,Pos+1,Acc);
+bit_list_to_nbl([1|T],NBL,Pos,Acc) ->
+ case lists:keysearch(Pos,2,NBL) of
+ {value,{N,_}} ->
+ bit_list_to_nbl(T,NBL,Pos+1,[N|Acc]);
+ _ ->
+ throw({error,{no,named,element,at,pos,Pos}})
+ end;
+bit_list_to_nbl([],_,_,Acc) ->
+ Acc.
+
+remove_trailing_zeros(L2) ->
+ remove_trailing_zeros1(lists:reverse(L2)).
+remove_trailing_zeros1(L) ->
+ lists:reverse(lists:dropwhile(fun(0)->true;
+ (_) ->false
+ end,
+ L)).
+
+check_bitstring1([H|T],NBL) ->
+ case lists:member(H,NBL) of
+ true ->
+ check_bitstring1(T,NBL);
+ V -> throw({error,V})
+ end;
+check_bitstring1([],_) ->
+ true.
+
+cbs_to_bit_list({Unused,<<B7:1,B6:1,B5:1,B4:1,B3:1,B2:1,B1:1,B0:1,Rest/binary>>}) when size(Rest) >= 1 ->
+ [B7,B6,B5,B4,B3,B2,B1,B0|cbs_to_bit_list({Unused,Rest})];
+cbs_to_bit_list({0,<<B7:1,B6:1,B5:1,B4:1,B3:1,B2:1,B1:1,B0:1>>}) ->
+ [B7,B6,B5,B4,B3,B2,B1,B0];
+cbs_to_bit_list({Unused,Bin}) when size(Bin) == 1 ->
+ Used = 8-Unused,
+ <<Int:Used,_:Unused>> = Bin,
+ int_to_bit_list(Int,[],Used).
+
+
+check_octetstring(_,asn1_DEFAULT) ->
+ true;
+check_octetstring(L,L) ->
+ true;
+check_octetstring(L,Int) when list(L),integer(Int) ->
+ case integer_to_octetlist(Int) of
+ L -> true;
+ V -> throw({error,V})
+ end;
+check_octetstring(_,V) ->
+ throw({error,V}).
+
+integer_to_octetlist(Int) ->
+ integer_to_octetlist(Int,[]).
+integer_to_octetlist(0,Acc) ->
+ Acc;
+integer_to_octetlist(Int,Acc) ->
+ integer_to_octetlist(Int bsr 8,[(Int band 255)|Acc]).
+
+check_null(_,asn1_DEFAULT) ->
+ true;
+check_null('NULL','NULL') ->
+ true;
+check_null(_,V) ->
+ throw({error,V}).
+
+check_objectidentifier(_,asn1_DEFAULT) ->
+ true;
+check_objectidentifier(OI,OI) ->
+ true;
+check_objectidentifier(DOI,OI) when tuple(DOI),tuple(OI) ->
+ check_objectidentifier1(tuple_to_list(DOI),tuple_to_list(OI));
+check_objectidentifier(_,OI) ->
+ throw({error,OI}).
+
+check_objectidentifier1([V|Rest1],[V|Rest2]) ->
+ check_objectidentifier1(Rest1,Rest2,V);
+check_objectidentifier1([V1|Rest1],[V2|Rest2]) ->
+ case reserved_objectid(V2,[]) of
+ V1 ->
+ check_objectidentifier1(Rest1,Rest2,[V1]);
+ V ->
+ throw({error,V})
+ end.
+check_objectidentifier1([V|Rest1],[V|Rest2],Above) ->
+ check_objectidentifier1(Rest1,Rest2,[V|Above]);
+check_objectidentifier1([V1|Rest1],[V2|Rest2],Above) ->
+ case reserved_objectid(V2,Above) of
+ V1 ->
+ check_objectidentifier1(Rest1,Rest2,[V1|Above]);
+ V ->
+ throw({error,V})
+ end;
+check_objectidentifier1([],[],_) ->
+ true;
+check_objectidentifier1(_,V,_) ->
+ throw({error,object,identifier,V}).
+
+%% ITU-T Rec. X.680 Annex B - D
+reserved_objectid('itu-t',[]) -> 0;
+reserved_objectid('ccitt',[]) -> 0;
+%% arcs below "itu-t"
+reserved_objectid('recommendation',[0]) -> 0;
+reserved_objectid('question',[0]) -> 1;
+reserved_objectid('administration',[0]) -> 2;
+reserved_objectid('network-operator',[0]) -> 3;
+reserved_objectid('identified-organization',[0]) -> 4;
+
+reserved_objectid(iso,[]) -> 1;
+%% arcs below "iso", note that number 1 is not used
+reserved_objectid('standard',[1]) -> 0;
+reserved_objectid('member-body',[1]) -> 2;
+reserved_objectid('identified-organization',[1]) -> 3;
+
+reserved_objectid('joint-iso-itu-t',[]) -> 2;
+reserved_objectid('joint-iso-ccitt',[]) -> 2;
+
+reserved_objectid(_,_) -> false.
+
+
+check_objectdescriptor(_,asn1_DEFAULT) ->
+ true;
+check_objectdescriptor(OD,OD) ->
+ true;
+check_objectdescriptor(OD,OD) ->
+ throw({error,{not_implemented_yet,check_objectdescriptor}}).
+
+check_real(_,asn1_DEFAULT) ->
+ true;
+check_real(R,R) ->
+ true;
+check_real(_,_) ->
+ throw({error,{not_implemented_yet,check_real}}).
+
+check_enum(_,asn1_DEFAULT,_) ->
+ true;
+check_enum(Val,Val,_) ->
+ true;
+check_enum(Int,Atom,Enumerations) when integer(Int),atom(Atom) ->
+ case lists:keysearch(Atom,1,Enumerations) of
+ {value,{_,Int}} -> true;
+ _ -> throw({error,{enumerated,Int,Atom}})
+ end;
+check_enum(DefVal,Val,_) ->
+ throw({error,{enumerated,DefVal,Val}}).
+
+
+check_restrictedstring(_,asn1_DEFAULT) ->
+ true;
+check_restrictedstring(Val,Val) ->
+ true;
+check_restrictedstring([V|Rest1],[V|Rest2]) ->
+ check_restrictedstring(Rest1,Rest2);
+check_restrictedstring([V1|Rest1],[V2|Rest2]) ->
+ check_restrictedstring(V1,V2),
+ check_restrictedstring(Rest1,Rest2);
+%% tuple format of value
+check_restrictedstring({V1,V2},[V1,V2]) ->
+ true;
+check_restrictedstring([V1,V2],{V1,V2}) ->
+ true;
+%% quadruple format of value
+check_restrictedstring({V1,V2,V3,V4},[V1,V2,V3,V4]) ->
+ true;
+check_restrictedstring([V1,V2,V3,V4],{V1,V2,V3,V4}) ->
+ true;
+%% character string list
+check_restrictedstring(V1,V2) when list(V1),tuple(V2) ->
+ check_restrictedstring(V1,tuple_to_list(V2));
+check_restrictedstring(V1,V2) ->
+ throw({error,{restricted,string,V1,V2}}).
+
+transform_to_EXTERNAL1990(Val) when tuple(Val),size(Val) == 4 ->
+ transform_to_EXTERNAL1990(tuple_to_list(Val),[]);
+transform_to_EXTERNAL1990(Val) when tuple(Val) ->
+ %% Data already in ASN1 1990 format
+ Val.
+
+transform_to_EXTERNAL1990(['EXTERNAL'|Rest],Acc) ->
+ transform_to_EXTERNAL1990(Rest,['EXTERNAL'|Acc]);
+transform_to_EXTERNAL1990([{syntax,Syntax}|Rest],Acc) ->
+ transform_to_EXTERNAL1990(Rest,[asn1_NOVALUE,Syntax|Acc]);
+transform_to_EXTERNAL1990([{'presentation-context-id',PCid}|Rest],Acc) ->
+ transform_to_EXTERNAL1990(Rest,[PCid,asn1_NOVALUE|Acc]);
+transform_to_EXTERNAL1990([{'context-negotiation',Context_negot}|Rest],Acc) ->
+ {_,Presentation_Cid,Transfer_syntax} = Context_negot,
+ transform_to_EXTERNAL1990(Rest,[Transfer_syntax,Presentation_Cid|Acc]);
+transform_to_EXTERNAL1990([asn1_NOVALUE|Rest],Acc) ->
+ transform_to_EXTERNAL1990(Rest,[asn1_NOVALUE|Acc]);
+transform_to_EXTERNAL1990([Data_val_desc,Data_value],Acc) when list(Data_value)->
+ list_to_tuple(lists:reverse([{'octet-aligned',Data_value},
+ Data_val_desc|Acc]));
+transform_to_EXTERNAL1990([Data_value],Acc) when list(Data_value)->
+ list_to_tuple(lists:reverse([{'octet-aligned',Data_value}|Acc])).
+
+
+transform_to_EXTERNAL1994(V={'EXTERNAL',DRef,IndRef,Data_v_desc,Encoding}) ->
+ Identification =
+ case {DRef,IndRef} of
+ {DRef,asn1_NOVALUE} ->
+ {syntax,DRef};
+ {asn1_NOVALUE,IndRef} ->
+ {'presentation-context-id',IndRef};
+ _ ->
+ {'context-negotiation',
+ {'EXTERNAL_identification_context-negotiation',IndRef,DRef}}
+ end,
+ case Encoding of
+ {_,Val} when list(Val) ->
+ {'EXTERNAL',Identification,Data_v_desc,Val};
+ _ ->
+ V
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_driver_handler.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_driver_handler.erl
new file mode 100644
index 0000000000..5200f9d2d9
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_driver_handler.erl
@@ -0,0 +1,108 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1rt_driver_handler.erl,v 1.1 2008/12/17 09:53:30 mikpe Exp $
+%%
+
+-module(asn1rt_driver_handler).
+
+-export([init/1,load_driver/0,unload_driver/0]).
+
+
+load_driver() ->
+ spawn(asn1rt_driver_handler, init, [self()]).
+
+init(From) ->
+ Port=
+ case load_driver("asn1_erl_drv") of
+ ok ->
+ open_named_port(From);
+ already_done ->
+ From ! driver_ready;
+ Error -> % if erl_ddll:load_driver fails
+ erl_ddll:unload_driver("asn1_erl_drv"),
+ From ! Error
+ end,
+ register_and_loop(Port).
+
+load_driver(DriverName) ->
+ case is_driver_loaded(DriverName) of
+ false ->
+ Dir = filename:join([code:priv_dir(asn1),"lib"]),
+ erl_ddll:load_driver(Dir,DriverName);
+ true ->
+ ok
+ end.
+
+
+is_driver_loaded(_Name) ->
+ case whereis(asn1_driver_owner) of
+ undefined ->
+ false;
+ _ ->
+ true
+ end.
+
+open_named_port(From) ->
+ case is_port_open(drv_complete) of
+ false ->
+ case catch open_port({spawn,"asn1_erl_drv"},[]) of
+ {'EXIT',Reason} ->
+ From ! {port_error,Reason};
+ Port ->
+ register(drv_complete,Port),
+ From ! driver_ready,
+ Port
+ end;
+ _ ->
+ From ! driver_ready,
+ ok
+ end.
+
+is_port_open(Name) ->
+ case whereis(Name) of
+ Port when port(Port) ->
+ true;
+ _ -> false
+ end.
+
+register_and_loop(Port) when port(Port) ->
+ register(asn1_driver_owner,self()),
+ loop();
+register_and_loop(_) ->
+ ok.
+
+loop() ->
+ receive
+ unload ->
+ case whereis(drv_complete) of
+ Port when port(Port) ->
+ port_close(Port);
+ _ -> ok
+ end,
+ erl_ddll:unload_driver("asn1_erl_drv"),
+ ok;
+ _ ->
+ loop()
+ end.
+
+unload_driver() ->
+ case whereis(asn1_driver_owner) of
+ Pid when pid(Pid) ->
+ Pid ! unload,
+ ok;
+ _ ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_per.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_per.erl
new file mode 100644
index 0000000000..4999dde2cc
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_per.erl
@@ -0,0 +1,1593 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1rt_per.erl,v 1.1 2008/12/17 09:53:31 mikpe Exp $
+%%
+-module(asn1rt_per).
+
+%% encoding / decoding of PER aligned
+
+-include("asn1_records.hrl").
+
+-export([dec_fixup/3, cindex/3, list_to_record/2]).
+-export([setchoiceext/1, setext/1, fixoptionals/2, fixextensions/2, setoptionals/1,
+ getext/1, getextension/2, skipextensions/3, getbit/1, getchoice/3 ]).
+-export([getoptionals/3, set_choice/3, encode_integer/2, encode_integer/3 ]).
+-export([decode_integer/2, decode_integer/3, encode_boolean/1,
+ decode_boolean/1, encode_length/2, decode_length/1, decode_length/2,
+ encode_small_length/1, decode_small_length/1]).
+-export([encode_enumerated/3, decode_enumerated/3,
+ encode_bit_string/3, decode_bit_string/3 ]).
+-export([encode_octet_string/2, decode_octet_string/2,
+ encode_restricted_string/4, encode_restricted_string/5,
+ decode_restricted_string/4, decode_restricted_string/5,
+ encode_null/1, decode_null/1,
+ encode_object_identifier/1, decode_object_identifier/1,
+ complete/1]).
+
+-export([encode_open_type/2, decode_open_type/2]).
+
+-export([encode_UniversalString/2, decode_UniversalString/2,
+ encode_PrintableString/2, decode_PrintableString/2,
+ encode_GeneralString/2, decode_GeneralString/2,
+ encode_GraphicString/2, decode_GraphicString/2,
+ encode_TeletexString/2, decode_TeletexString/2,
+ encode_VideotexString/2, decode_VideotexString/2,
+ encode_VisibleString/2, decode_VisibleString/2,
+ encode_BMPString/2, decode_BMPString/2,
+ encode_IA5String/2, decode_IA5String/2,
+ encode_NumericString/2, decode_NumericString/2
+ ]).
+
+
+dec_fixup(Terms,Cnames,RemBytes) ->
+ dec_fixup(Terms,Cnames,RemBytes,[]).
+
+dec_fixup([novalue|T],[_Hc|Tc],RemBytes,Acc) ->
+ dec_fixup(T,Tc,RemBytes,Acc);
+dec_fixup([{_Name,novalue}|T],[_Hc|Tc],RemBytes,Acc) ->
+ dec_fixup(T,Tc,RemBytes,Acc);
+dec_fixup([H|T],[Hc|Tc],RemBytes,Acc) ->
+ dec_fixup(T,Tc,RemBytes,[{Hc,H}|Acc]);
+dec_fixup([],_Cnames,RemBytes,Acc) ->
+ {lists:reverse(Acc),RemBytes}.
+
+cindex(Ix,Val,Cname) ->
+ case element(Ix,Val) of
+ {Cname,Val2} -> Val2;
+ X -> X
+ end.
+
+% converts a list to a record if necessary
+list_to_record(Name,List) when list(List) ->
+ list_to_tuple([Name|List]);
+list_to_record(_Name,Tuple) when tuple(Tuple) ->
+ Tuple.
+
+%%--------------------------------------------------------
+%% setchoiceext(InRootSet) -> [{bit,X}]
+%% X is set to 1 when InRootSet==false
+%% X is set to 0 when InRootSet==true
+%%
+setchoiceext(true) ->
+ [{debug,choiceext},{bit,0}];
+setchoiceext(false) ->
+ [{debug,choiceext},{bit,1}].
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% setext(true|false) -> CompleteList
+%%
+
+setext(true) ->
+ [{debug,ext},{bit,1}];
+setext(false) ->
+ [{debug,ext},{bit,0}].
+
+fixoptionals(OptList,Val) when tuple(Val) ->
+ fixoptionals(OptList,Val,[]);
+
+fixoptionals(OptList,Val) when list(Val) ->
+ fixoptionals(OptList,Val,1,[],[]).
+
+fixoptionals([],Val,Acc) ->
+ % return {Val,Opt}
+ {Val,lists:reverse(Acc)};
+fixoptionals([{_,Pos}|Ot],Val,Acc) ->
+ case element(Pos+1,Val) of
+ asn1_NOVALUE -> fixoptionals(Ot,Val,[0|Acc]);
+ asn1_DEFAULT -> fixoptionals(Ot,Val,[0|Acc]);
+ _ -> fixoptionals(Ot,Val,[1|Acc])
+ end.
+
+
+%setoptionals(OptList,Val) ->
+% Vlist = tuple_to_list(Val),
+% setoptionals(OptList,Vlist,1,[]).
+
+fixoptionals([{Name,Pos}|Ot],[{Name,Val}|Vt],_Opt,Acc1,Acc2) ->
+ fixoptionals(Ot,Vt,Pos+1,[1|Acc1],[{Name,Val}|Acc2]);
+fixoptionals([{_Name,Pos}|Ot],V,Pos,Acc1,Acc2) ->
+ fixoptionals(Ot,V,Pos+1,[0|Acc1],[asn1_NOVALUE|Acc2]);
+fixoptionals(O,[Vh|Vt],Pos,Acc1,Acc2) ->
+ fixoptionals(O,Vt,Pos+1,Acc1,[Vh|Acc2]);
+fixoptionals([],[Vh|Vt],Pos,Acc1,Acc2) ->
+ fixoptionals([],Vt,Pos+1,Acc1,[Vh|Acc2]);
+fixoptionals([],[],_,Acc1,Acc2) ->
+ % return {Val,Opt}
+ {list_to_tuple([asn1_RECORDNAME|lists:reverse(Acc2)]),lists:reverse(Acc1)}.
+
+setoptionals([H|T]) ->
+ [{bit,H}|setoptionals(T)];
+setoptionals([]) ->
+ [{debug,optionals}].
+
+getext(Bytes) when tuple(Bytes) ->
+ getbit(Bytes);
+getext(Bytes) when list(Bytes) ->
+ getbit({0,Bytes}).
+
+getextension(0, Bytes) ->
+ {{},Bytes};
+getextension(1, Bytes) ->
+ {Len,Bytes2} = decode_small_length(Bytes),
+ {Blist, Bytes3} = getbits_as_list(Len,Bytes2),
+ {list_to_tuple(Blist),Bytes3}.
+
+fixextensions({ext,ExtPos,ExtNum},Val) ->
+ case fixextensions(ExtPos,ExtNum+ExtPos,Val,0) of
+ 0 -> [];
+ ExtBits ->
+ [encode_small_length(ExtNum),{bits,ExtNum,ExtBits}]
+ end.
+
+fixextensions(Pos,MaxPos,_,Acc) when Pos >= MaxPos ->
+ Acc;
+fixextensions(Pos,ExtPos,Val,Acc) ->
+ Bit = case catch(element(Pos+1,Val)) of
+ asn1_NOVALUE ->
+ 0;
+ asn1_NOEXTVALUE ->
+ 0;
+ {'EXIT',_} ->
+ 0;
+ _ ->
+ 1
+ end,
+ fixextensions(Pos+1,ExtPos,Val,(Acc bsl 1)+Bit).
+
+skipextensions(Bytes,Nr,ExtensionBitPattern) ->
+ case (catch element(Nr,ExtensionBitPattern)) of
+ 1 ->
+ {_,Bytes2} = decode_open_type(Bytes,[]),
+ skipextensions(Bytes2, Nr+1, ExtensionBitPattern);
+ 0 ->
+ skipextensions(Bytes, Nr+1, ExtensionBitPattern);
+ {'EXIT',_} -> % badarg, no more extensions
+ Bytes
+ end.
+
+
+getchoice(Bytes,1,0) -> % only 1 alternative is not encoded
+ {0,Bytes};
+getchoice(Bytes,_NumChoices,1) ->
+ decode_small_number(Bytes);
+getchoice(Bytes,NumChoices,0) ->
+ decode_integer(Bytes,[{'ValueRange',{0,NumChoices-1}}]).
+
+getoptionals(Bytes,L,NumComp) when list(L) ->
+ {Blist,Bytes1} = getbits_as_list(length(L),Bytes),
+ {list_to_tuple(comptuple(Blist,L,NumComp,1)),Bytes1}.
+
+comptuple([Bh|Bt],[{_Name,Nr}|T],NumComp,Nr) ->
+ [Bh|comptuple(Bt,T,NumComp-1,Nr+1)];
+comptuple(Bl,[{Name,Tnr}|Tl],NumComp,Nr) ->
+ [0|comptuple(Bl,[{Name,Tnr}|Tl],NumComp-1,Nr+1)];
+comptuple(_B,_L,0,_Nr) ->
+ [];
+comptuple(B,O,N,Nr) ->
+ [0|comptuple(B,O,N-1,Nr+1)].
+
+getbits_as_list(Num,Bytes) ->
+ getbits_as_list(Num,Bytes,[]).
+
+getbits_as_list(0,Bytes,Acc) ->
+ {lists:reverse(Acc),Bytes};
+getbits_as_list(Num,Bytes,Acc) ->
+ {Bit,NewBytes} = getbit(Bytes),
+ getbits_as_list(Num-1,NewBytes,[Bit|Acc]).
+
+getbit(Bytes) ->
+% io:format("getbit:~p~n",[Bytes]),
+ getbit1(Bytes).
+
+getbit1({7,[H|T]}) ->
+ {H band 1,{0,T}};
+getbit1({Pos,[H|T]}) ->
+ {(H bsr (7-Pos)) band 1,{(Pos+1) rem 8,[H|T]}};
+getbit1(Bytes) when list(Bytes) ->
+ getbit1({0,Bytes}).
+
+%% This could be optimized
+getbits(Buffer,Num) ->
+% io:format("getbits:Buffer = ~p~nNum=~p~n",[Buffer,Num]),
+ getbits(Buffer,Num,0).
+
+getbits(Buffer,0,Acc) ->
+ {Acc,Buffer};
+getbits(Buffer,Num,Acc) ->
+ {B,NewBuffer} = getbit(Buffer),
+ getbits(NewBuffer,Num-1,B + (Acc bsl 1)).
+
+
+getoctet(Bytes) when list(Bytes) ->
+ getoctet({0,Bytes});
+getoctet(Bytes) ->
+% io:format("getoctet:Buffer = ~p~n",[Bytes]),
+ getoctet1(Bytes).
+
+getoctet1({0,[H|T]}) ->
+ {H,{0,T}};
+getoctet1({_Pos,[_,H|T]}) ->
+ {H,{0,T}}.
+
+align({0,L}) ->
+ {0,L};
+align({_Pos,[_H|T]}) ->
+ {0,T};
+align(Bytes) ->
+ {0,Bytes}.
+
+getoctets(Buffer,Num) ->
+% io:format("getoctets:Buffer = ~p~nNum = ~p~n",[Buffer,Num]),
+ getoctets(Buffer,Num,0).
+
+getoctets(Buffer,0,Acc) ->
+ {Acc,Buffer};
+getoctets(Buffer,Num,Acc) ->
+ {Oct,NewBuffer} = getoctet(Buffer),
+ getoctets(NewBuffer,Num-1,(Acc bsl 8)+Oct).
+
+getoctets_as_list(Buffer,Num) ->
+ getoctets_as_list(Buffer,Num,[]).
+
+getoctets_as_list(Buffer,0,Acc) ->
+ {lists:reverse(Acc),Buffer};
+getoctets_as_list(Buffer,Num,Acc) ->
+ {Oct,NewBuffer} = getoctet(Buffer),
+ getoctets_as_list(NewBuffer,Num-1,[Oct|Acc]).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% set_choice(Alt,Choices,Altnum) -> ListofBitSettings
+%% Alt = atom()
+%% Altnum = integer() | {integer(),integer()}% number of alternatives
+%% Choices = [atom()] | {[atom()],[atom()]}
+%% When Choices is a tuple the first list is the Rootset and the
+%% second is the Extensions and then Altnum must also be a tuple with the
+%% lengths of the 2 lists
+%%
+set_choice(Alt,{L1,L2},{Len1,_Len2}) ->
+ case set_choice_tag(Alt,L1) of
+ N when integer(N), Len1 > 1 ->
+ [{bit,0}, % the value is in the root set
+ encode_integer([{'ValueRange',{0,Len1-1}}],N)];
+ N when integer(N) ->
+ [{bit,0}]; % no encoding if only 0 or 1 alternative
+ false ->
+ [{bit,1}, % extension value
+ case set_choice_tag(Alt,L2) of
+ N2 when integer(N2) ->
+ encode_small_number(N2);
+ false ->
+ unknown_choice_alt
+ end]
+ end;
+set_choice(Alt,L,Len) ->
+ case set_choice_tag(Alt,L) of
+ N when integer(N), Len > 1 ->
+ encode_integer([{'ValueRange',{0,Len-1}}],N);
+ N when integer(N) ->
+ []; % no encoding if only 0 or 1 alternative
+ false ->
+ [unknown_choice_alt]
+ end.
+
+set_choice_tag(Alt,Choices) ->
+ set_choice_tag(Alt,Choices,0).
+
+set_choice_tag(Alt,[Alt|_Rest],Tag) ->
+ Tag;
+set_choice_tag(Alt,[_H|Rest],Tag) ->
+ set_choice_tag(Alt,Rest,Tag+1);
+set_choice_tag(_,[],_) ->
+ false.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% encode_open_type(Constraint, Value) -> CompleteList
+%% Value = list of bytes of an already encoded value (the list must be flat)
+%% | binary
+%% Contraint = not used in this version
+%%
+encode_open_type(_Constraint, Val) when list(Val) ->
+ [encode_length(undefined,length(Val)),align,
+ {octets,Val}];
+encode_open_type(_Constraint, Val) when binary(Val) ->
+ [encode_length(undefined,size(Val)),align,
+ {octets,binary_to_list(Val)}].
+%% the binary_to_list is not optimal but compatible with the current solution
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% decode_open_type(Buffer,Constraint) -> Value
+%% Constraint is not used in this version
+%% Buffer = [byte] with PER encoded data
+%% Value = [byte] with decoded data (which must be decoded again as some type)
+%%
+decode_open_type(Bytes, _Constraint) ->
+ {Len,Bytes2} = decode_length(Bytes,undefined),
+ Bytes3 = align(Bytes2),
+ getoctets_as_list(Bytes3,Len).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% encode_integer(Constraint,Value,NamedNumberList) -> CompleteList
+%% encode_integer(Constraint,Value) -> CompleteList
+%% encode_integer(Constraint,{Name,Value}) -> CompleteList
+%%
+%%
+encode_integer(C,V,NamedNumberList) when atom(V) ->
+ case lists:keysearch(V,1,NamedNumberList) of
+ {value,{_,NewV}} ->
+ encode_integer(C,NewV);
+ _ ->
+ exit({error,{asn1,{namednumber,V}}})
+ end;
+encode_integer(C,V,_NamedNumberList) when integer(V) ->
+ encode_integer(C,V).
+
+encode_integer(C,{Name,Val}) when atom(Name) ->
+ encode_integer(C,Val);
+
+encode_integer({Rc,_Ec},Val) ->
+ case (catch encode_integer(Rc,Val)) of
+ {'EXIT',{error,{asn1,_}}} ->
+ [{bit,1},encode_unconstrained_number(Val)];
+ Encoded ->
+ [{bit,0},Encoded]
+ end;
+encode_integer(C,Val ) when list(C) ->
+ case get_constraint(C,'SingleValue') of
+ no ->
+ encode_integer1(C,Val);
+ V when integer(V),V == Val ->
+ []; % a type restricted to a single value encodes to nothing
+ V when list(V) ->
+ case lists:member(Val,V) of
+ true ->
+ encode_integer1(C,Val);
+ _ ->
+ exit({error,{asn1,{illegal_value,Val}}})
+ end;
+ _ ->
+ exit({error,{asn1,{illegal_value,Val}}})
+ end.
+
+encode_integer1(C, Val) ->
+ case VR = get_constraint(C,'ValueRange') of
+ no ->
+ encode_unconstrained_number(Val);
+ {Lb,'MAX'} ->
+ encode_semi_constrained_number(Lb,Val);
+ %% positive with range
+ {Lb,Ub} when Val >= Lb,
+ Ub >= Val ->
+ encode_constrained_number(VR,Val)
+ end.
+
+decode_integer(Buffer,Range,NamedNumberList) ->
+ {Val,Buffer2} = decode_integer(Buffer,Range),
+ case lists:keysearch(Val,2,NamedNumberList) of
+ {value,{NewVal,_}} -> {NewVal,Buffer2};
+ _ -> {Val,Buffer2}
+ end.
+
+decode_integer(Buffer,{Rc,_Ec}) ->
+ {Ext,Buffer2} = getext(Buffer),
+ case Ext of
+ 0 -> decode_integer(Buffer2,Rc);
+ 1 -> decode_unconstrained_number(Buffer2)
+ end;
+decode_integer(Buffer,undefined) ->
+ decode_unconstrained_number(Buffer);
+decode_integer(Buffer,C) ->
+ case get_constraint(C,'SingleValue') of
+ V when integer(V) ->
+ {V,Buffer};
+ V when list(V) ->
+ {Val,Buffer2} = decode_integer1(Buffer,C),
+ case lists:member(Val,V) of
+ true ->
+ {Val,Buffer2};
+ _ ->
+ exit({error,{asn1,{illegal_value,Val}}})
+ end;
+ _ ->
+ decode_integer1(Buffer,C)
+ end.
+
+decode_integer1(Buffer,C) ->
+ case VR = get_constraint(C,'ValueRange') of
+ no ->
+ decode_unconstrained_number(Buffer);
+ {Lb, 'MAX'} ->
+ decode_semi_constrained_number(Buffer,Lb);
+ {_,_} ->
+ decode_constrained_number(Buffer,VR)
+ end.
+
+% X.691:10.6 Encoding of a normally small non-negative whole number
+% Use this for encoding of CHOICE index if there is an extension marker in
+% the CHOICE
+encode_small_number({Name,Val}) when atom(Name) ->
+ encode_small_number(Val);
+encode_small_number(Val) when Val =< 63 ->
+ [{bit,0},{bits,6,Val}];
+encode_small_number(Val) ->
+ [{bit,1},encode_semi_constrained_number(0,Val)].
+
+decode_small_number(Bytes) ->
+ {Bit,Bytes2} = getbit(Bytes),
+ case Bit of
+ 0 ->
+ getbits(Bytes2,6);
+ 1 ->
+ decode_semi_constrained_number(Bytes2,{0,'MAX'})
+ end.
+
+% X.691:10.7 Encoding of a semi-constrained whole number
+%% might be an optimization encode_semi_constrained_number(0,Val) ->
+encode_semi_constrained_number(C,{Name,Val}) when atom(Name) ->
+ encode_semi_constrained_number(C,Val);
+encode_semi_constrained_number({Lb,'MAX'},Val) ->
+ encode_semi_constrained_number(Lb,Val);
+encode_semi_constrained_number(Lb,Val) ->
+ Val2 = Val - Lb,
+ Octs = eint_positive(Val2),
+ [encode_length(undefined,length(Octs)),{octets,Octs}].
+
+decode_semi_constrained_number(Bytes,{Lb,_}) ->
+ decode_semi_constrained_number(Bytes,Lb);
+decode_semi_constrained_number(Bytes,Lb) ->
+ {Len,Bytes2} = decode_length(Bytes,undefined),
+ {V,Bytes3} = getoctets(Bytes2,Len),
+ {V+Lb,Bytes3}.
+
+encode_constrained_number(Range,{Name,Val}) when atom(Name) ->
+ encode_constrained_number(Range,Val);
+encode_constrained_number({Lb,Ub},Val) when Val >= Lb, Ub >= Val ->
+ Range = Ub - Lb + 1,
+ Val2 = Val - Lb,
+ if
+ Range == 2 ->
+ {bits,1,Val2};
+ Range =< 4 ->
+ {bits,2,Val2};
+ Range =< 8 ->
+ {bits,3,Val2};
+ Range =< 16 ->
+ {bits,4,Val2};
+ Range =< 32 ->
+ {bits,5,Val2};
+ Range =< 64 ->
+ {bits,6,Val2};
+ Range =< 128 ->
+ {bits,7,Val2};
+ Range =< 255 ->
+ {bits,8,Val2};
+ Range =< 256 ->
+ {octets,1,Val2};
+ Range =< 65536 ->
+ {octets,2,Val2};
+ Range =< 16#1000000 ->
+ Octs = eint_positive(Val2),
+ [encode_length({1,3},length(Octs)),{octets,Octs}];
+ Range =< 16#100000000 ->
+ Octs = eint_positive(Val2),
+ [encode_length({1,4},length(Octs)),{octets,Octs}];
+ Range =< 16#10000000000 ->
+ Octs = eint_positive(Val2),
+ [encode_length({1,5},length(Octs)),{octets,Octs}];
+ true ->
+ exit({not_supported,{integer_range,Range}})
+ end.
+
+decode_constrained_number(Buffer,{Lb,Ub}) ->
+ Range = Ub - Lb + 1,
+% Val2 = Val - Lb,
+ {Val,Remain} =
+ if
+ Range == 2 ->
+ getbits(Buffer,1);
+ Range =< 4 ->
+ getbits(Buffer,2);
+ Range =< 8 ->
+ getbits(Buffer,3);
+ Range =< 16 ->
+ getbits(Buffer,4);
+ Range =< 32 ->
+ getbits(Buffer,5);
+ Range =< 64 ->
+ getbits(Buffer,6);
+ Range =< 128 ->
+ getbits(Buffer,7);
+ Range =< 255 ->
+ getbits(Buffer,8);
+ Range =< 256 ->
+ getoctets(Buffer,1);
+ Range =< 65536 ->
+ getoctets(Buffer,2);
+ Range =< 16#1000000 ->
+ {Len,Bytes2} = decode_length(Buffer,{1,3}),
+ {Octs,Bytes3} = getoctets_as_list(Bytes2,Len),
+ {dec_pos_integer(Octs),Bytes3};
+ Range =< 16#100000000 ->
+ {Len,Bytes2} = decode_length(Buffer,{1,4}),
+ {Octs,Bytes3} = getoctets_as_list(Bytes2,Len),
+ {dec_pos_integer(Octs),Bytes3};
+ Range =< 16#10000000000 ->
+ {Len,Bytes2} = decode_length(Buffer,{1,5}),
+ {Octs,Bytes3} = getoctets_as_list(Bytes2,Len),
+ {dec_pos_integer(Octs),Bytes3};
+ true ->
+ exit({not_supported,{integer_range,Range}})
+ end,
+ {Val+Lb,Remain}.
+
+% X.691:10.8 Encoding of an unconstrained whole number
+
+encode_unconstrained_number(Val) when Val >= 0 ->
+ Oct = eint(Val,[]),
+ [{debug,unconstrained_number},
+ encode_length({0,'MAX'},length(Oct)),
+ {octets,Oct}];
+encode_unconstrained_number(Val) -> % negative
+ Oct = enint(Val,[]),
+ [{debug,unconstrained_number},
+ encode_length({0,'MAX'},length(Oct)),
+ {octets,Oct}].
+
+%% used for positive Values which don't need a sign bit
+eint_positive(Val) ->
+ case eint(Val,[]) of
+ [0,B1|T] ->
+ [B1|T];
+ T ->
+ T
+ end.
+
+eint(0, [B|Acc]) when B < 128 ->
+ [B|Acc];
+eint(N, Acc) ->
+ eint(N bsr 8, [N band 16#ff| Acc]).
+
+enint(-1, [B1|T]) when B1 > 127 ->
+ [B1|T];
+enint(N, Acc) ->
+ enint(N bsr 8, [N band 16#ff|Acc]).
+
+%% used for signed positive values
+
+%eint(Val, Ack) ->
+% X = Val band 255,
+% Next = Val bsr 8,
+% if
+% Next == 0, X >= 127 ->
+% [0,X|Ack];
+% Next == 0 ->
+% [X|Ack];
+% true ->
+% eint(Next,[X|Ack])
+% end.
+
+%%% used for signed negative values
+%enint(Val, Acc) ->
+% NumOctets = if
+% -Val < 16#80 -> 1;
+% -Val < 16#8000 ->2;
+% -Val < 16#800000 ->3;
+% -Val < 16#80000000 ->4;
+% -Val < 16#8000000000 ->5;
+% -Val < 16#800000000000 ->6;
+% -Val < 16#80000000000000 ->7;
+% -Val < 16#8000000000000000 ->8;
+% -Val < 16#800000000000000000 ->9
+% end,
+% enint(Val,Acc,NumOctets).
+
+%enint(Val, Acc,0) ->
+% Acc;
+%enint(Val, Acc,NumOctets) ->
+% enint(Val bsr 8,[Val band 255|Acc],NumOctets-1).
+
+
+decode_unconstrained_number(Bytes) ->
+ {Len,Bytes2} = decode_length(Bytes,undefined),
+ {Ints,Bytes3} = getoctets_as_list(Bytes2,Len),
+ {dec_integer(Ints),Bytes3}.
+
+dec_pos_integer(Ints) ->
+ decpint(Ints, 8 * (length(Ints) - 1)).
+dec_integer(Ints) when hd(Ints) band 255 =< 127 -> %% Positive number
+ decpint(Ints, 8 * (length(Ints) - 1));
+dec_integer(Ints) -> %% Negative
+ decnint(Ints, 8 * (length(Ints) - 1)).
+
+decpint([Byte|Tail], Shift) ->
+ (Byte bsl Shift) bor decpint(Tail, Shift-8);
+decpint([], _) -> 0.
+
+decnint([Byte|Tail], Shift) ->
+ (-128 + (Byte band 127) bsl Shift) bor decpint(Tail, Shift-8).
+
+minimum_octets(Val) ->
+ minimum_octets(Val,[]).
+
+minimum_octets(Val,Acc) when Val > 0 ->
+ minimum_octets((Val bsr 8),[Val band 16#FF|Acc]);
+minimum_octets(0,Acc) ->
+ Acc.
+
+
+%% X.691:10.9 Encoding of a length determinant
+%%encode_small_length(undefined,Len) -> % null means no UpperBound
+%% encode_small_number(Len).
+
+%% X.691:10.9.3.5
+%% X.691:10.9.3.7
+encode_length(undefined,Len) -> % un-constrained
+ if
+ Len < 128 ->
+ {octet,Len band 16#7F};
+ Len < 16384 ->
+ {octets,2,2#1000000000000000 bor Len};
+ true ->
+ exit({error,{asn1,{encode_length,{nyi,above_16k}}}})
+ end;
+
+encode_length({0,'MAX'},Len) ->
+ encode_length(undefined,Len);
+encode_length({Lb,Ub},Len) when Ub =< 65535 ,Lb >= 0 -> % constrained
+ encode_constrained_number({Lb,Ub},Len);
+encode_length(SingleValue,_Len) when integer(SingleValue) ->
+ [].
+
+encode_small_length(Len) when Len =< 64 ->
+ [{bit,0},{bits,6,Len-1}];
+encode_small_length(Len) ->
+ [{bit,1},encode_length(undefined,Len)].
+
+decode_small_length(Buffer) ->
+ case getbit(Buffer) of
+ {0,Remain} ->
+ {Bits,Remain2} = getbits(Remain,6),
+ {Bits+1,Remain2};
+ {1,Remain} ->
+ decode_length(Remain,undefined)
+ end.
+
+decode_length(Buffer) ->
+ decode_length(Buffer,undefined).
+
+decode_length(Buffer,undefined) -> % un-constrained
+ Buffer2 = align(Buffer),
+ {Bits,_} = getbits(Buffer2,2),
+ case Bits of
+ 2 ->
+ {Val,Bytes3} = getoctets(Buffer2,2),
+ {(Val band 16#3FFF),Bytes3};
+ 3 ->
+ exit({error,{asn1,{decode_length,{nyi,above_16k}}}});
+ _ ->
+ {Val,Bytes3} = getoctet(Buffer2),
+ {Val band 16#7F,Bytes3}
+ end;
+
+decode_length(Buffer,{Lb,Ub}) when Ub =< 65535 ,Lb >= 0 -> % constrained
+ decode_constrained_number(Buffer,{Lb,Ub});
+ % X.691:10.9.3.5
+decode_length(Buffer,{_,_Lb,_Ub}) -> %when Len =< 127 -> % Unconstrained or large Ub
+ case getbit(Buffer) of
+ {0,Remain} ->
+ getbits(Remain,7);
+ {1,_Remain} ->
+ {Val,Remain2} = getoctets(Buffer,2),
+ {Val band 2#0111111111111111, Remain2}
+ end;
+decode_length(Buffer,SingleValue) when integer(SingleValue) ->
+ {SingleValue,Buffer}.
+
+
+% X.691:11
+encode_boolean({Name,Val}) when atom(Name) ->
+ encode_boolean(Val);
+encode_boolean(true) ->
+ {bit,1};
+encode_boolean(false) ->
+ {bit,0};
+encode_boolean(Val) ->
+ exit({error,{asn1,{encode_boolean,Val}}}).
+
+
+decode_boolean(Buffer) -> %when record(Buffer,buffer)
+ case getbit(Buffer) of
+ {1,Remain} -> {true,Remain};
+ {0,Remain} -> {false,Remain}
+ end.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% X.691:12
+%% ENUMERATED
+%%
+%% encode_enumerated(C,Value,NamedNumberTup) -> CompleteList
+%%
+%%
+
+encode_enumerated(C,{Name,Value},NamedNumberList) when
+ atom(Name),list(NamedNumberList) ->
+ encode_enumerated(C,Value,NamedNumberList);
+
+%% ENUMERATED with extension mark
+encode_enumerated(_C,{asn1_enum,Value},{_Nlist1,Nlist2}) when Value >= length(Nlist2) ->
+ [{bit,1},encode_small_number(Value)];
+encode_enumerated(C,Value,{Nlist1,Nlist2}) ->
+ case enum_search(Value,Nlist1,0) of
+ NewV when integer(NewV) ->
+ [{bit,0},encode_integer(C,NewV)];
+ false ->
+ case enum_search(Value,Nlist2,0) of
+ ExtV when integer(ExtV) ->
+ [{bit,1},encode_small_number(ExtV)];
+ false ->
+ exit({error,{asn1,{encode_enumerated,Value}}})
+ end
+ end;
+
+encode_enumerated(C,Value,NamedNumberList) when list(NamedNumberList) ->
+ case enum_search(Value,NamedNumberList,0) of
+ NewV when integer(NewV) ->
+ encode_integer(C,NewV);
+ false ->
+ exit({error,{asn1,{encode_enumerated,Value}}})
+ end.
+
+%% returns the ordinal number from 0 ,1 ... in the list where Name is found
+%% or false if not found
+%%
+enum_search(Name,[Name|_NamedNumberList],Acc) ->
+ Acc;
+enum_search(Name,[_H|T],Acc) ->
+ enum_search(Name,T,Acc+1);
+enum_search(_,[],_) ->
+ false. % name not found !error
+
+%% ENUMERATED with extension marker
+decode_enumerated(Buffer,C,{Ntup1,Ntup2}) when tuple(Ntup1), tuple(Ntup2) ->
+ {Ext,Buffer2} = getext(Buffer),
+ case Ext of
+ 0 -> % not an extension value
+ {Val,Buffer3} = decode_integer(Buffer2,C),
+ case catch (element(Val+1,Ntup1)) of
+ NewVal when atom(NewVal) -> {NewVal,Buffer3};
+ _Error -> exit({error,{asn1,{decode_enumerated,{Val,[Ntup1,Ntup2]}}}})
+ end;
+ 1 -> % this an extension value
+ {Val,Buffer3} = decode_small_number(Buffer2),
+ case catch (element(Val+1,Ntup2)) of
+ NewVal when atom(NewVal) -> {NewVal,Buffer3};
+ _ -> {{asn1_enum,Val},Buffer3}
+ end
+ end;
+
+decode_enumerated(Buffer,C,NamedNumberTup) when tuple(NamedNumberTup) ->
+ {Val,Buffer2} = decode_integer(Buffer,C),
+ case catch (element(Val+1,NamedNumberTup)) of
+ NewVal when atom(NewVal) -> {NewVal,Buffer2};
+ _Error -> exit({error,{asn1,{decode_enumerated,{Val,NamedNumberTup}}}})
+ end.
+
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+%% Bitstring value, ITU_T X.690 Chapter 8.5
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+
+%%===============================================================================
+%% encode bitstring value
+%%===============================================================================
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% bitstring NamedBitList
+%% Val can be of:
+%% - [identifiers] where only named identifers are set to one,
+%% the Constraint must then have some information of the
+%% bitlength.
+%% - [list of ones and zeroes] all bits
+%% - integer value representing the bitlist
+%% C is constraint Len, only valid when identifiers
+
+%% when the value is a list of named bits
+encode_bit_string(C, [FirstVal | RestVal], NamedBitList) when atom(FirstVal) ->
+ ToSetPos = get_all_bitposes([FirstVal | RestVal], NamedBitList, []),
+ BitList = make_and_set_list(ToSetPos,0),
+ encode_bit_string(C,BitList,NamedBitList);
+
+encode_bit_string(C, [{bit,No} | RestVal], NamedBitList) ->
+ ToSetPos = get_all_bitposes([{bit,No} | RestVal], NamedBitList, []),
+ BitList = make_and_set_list(ToSetPos,0),
+ encode_bit_string(C,BitList,NamedBitList);
+
+%% when the value is a list of ones and zeroes
+
+encode_bit_string(C, BitListValue, _NamedBitList) when list(BitListValue) ->
+ %% first remove any trailing zeroes
+ Bl1 = lists:dropwhile(fun(0)->true;(1)->false end,lists:reverse(BitListValue)),
+ BitList = [{bit,X} || X <- lists:reverse(Bl1)],
+ case get_constraint(C,'SizeConstraint') of
+ 0 -> % fixed length
+ []; % nothing to encode
+ V when integer(V),V=<16 -> % fixed length 16 bits or less
+ pad_list(V,BitList);
+ V when integer(V) -> % fixed length more than 16 bits
+ [align,pad_list(V,BitList)];
+ {Lb,Ub} when integer(Lb),integer(Ub) ->
+ [encode_length({Lb,Ub},length(BitList)),align,BitList];
+ no ->
+ [encode_length(undefined,length(BitList)),align,BitList]
+ end;
+
+%% when the value is an integer
+encode_bit_string(C, IntegerVal, NamedBitList) ->
+ BitList = int_to_bitlist(IntegerVal),
+ encode_bit_string(C,BitList,NamedBitList).
+
+
+
+
+%%%%%%%%%%%%%%%
+%% The result is presented as a list of named bits (if possible)
+%% else as a list of 0 and 1.
+%%
+decode_bit_string(Buffer, C, NamedNumberList) ->
+ case get_constraint(C,'SizeConstraint') of
+ 0 -> % fixed length
+ {[],Buffer}; % nothing to encode
+ V when integer(V),V=<16 -> % fixed length 16 bits or less
+ bit_list_to_named(Buffer,V,NamedNumberList);
+ V when integer(V) -> % fixed length 16 bits or less
+ Bytes2 = align(Buffer),
+ bit_list_to_named(Bytes2,V,NamedNumberList);
+ {Lb,Ub} when integer(Lb),integer(Ub) ->
+ {Len,Bytes2} = decode_length(Buffer,{Lb,Ub}),
+ Bytes3 = align(Bytes2),
+ bit_list_to_named(Bytes3,Len,NamedNumberList);
+ no ->
+ {Len,Bytes2} = decode_length(Buffer,undefined),
+ Bytes3 = align(Bytes2),
+ bit_list_to_named(Bytes3,Len,NamedNumberList)
+ end.
+
+%% if no named bits are declared we will return a
+%% BitList = [0 | 1]
+
+bit_list_to_named(Buffer,Len,[]) ->
+ getbits_as_list(Len,Buffer);
+
+%% if there are named bits declared we will return a named
+%% BitList where the names are atoms and unnamed bits represented
+%% as {bit,Pos}
+%% BitList = [atom() | {bit,Pos}]
+%% Pos = integer()
+
+bit_list_to_named(Buffer,Len,NamedNumberList) ->
+ {BitList,Rest} = getbits_as_list(Len,Buffer),
+ {bit_list_to_named1(0,BitList,NamedNumberList,[]), Rest}.
+
+bit_list_to_named1(Pos,[0|Bt],Names,Acc) ->
+ bit_list_to_named1(Pos+1,Bt,Names,Acc);
+bit_list_to_named1(Pos,[1|Bt],Names,Acc) ->
+ case lists:keysearch(Pos,2,Names) of
+ {value,{Name,_}} ->
+ bit_list_to_named1(Pos+1,Bt,Names,[Name|Acc]);
+ _ ->
+ bit_list_to_named1(Pos+1,Bt,Names,[{bit,Pos}|Acc])
+ end;
+bit_list_to_named1(_Pos,[],_Names,Acc) ->
+ lists:reverse(Acc).
+
+
+
+%%%%%%%%%%%%%%%
+%%
+
+int_to_bitlist(0) ->
+ [];
+int_to_bitlist(Int) when integer(Int), Int >= 0 ->
+ [Int band 1 | int_to_bitlist(Int bsr 1)].
+
+
+%%%%%%%%%%%%%%%%%%
+%% get_all_bitposes([list of named bits to set], named_bit_db, []) ->
+%% [sorted_list_of_bitpositions_to_set]
+
+get_all_bitposes([{bit,ValPos}|Rest], NamedBitList, Ack) ->
+ get_all_bitposes(Rest, NamedBitList, [ValPos | Ack ]);
+
+get_all_bitposes([Val | Rest], NamedBitList, Ack) ->
+ case lists:keysearch(Val, 1, NamedBitList) of
+ {value, {_ValName, ValPos}} ->
+ get_all_bitposes(Rest, NamedBitList, [ValPos | Ack]);
+ _ ->
+ exit({error,{asn1, {bitstring_namedbit, Val}}})
+ end;
+get_all_bitposes([], _NamedBitList, Ack) ->
+ lists:sort(Ack).
+
+%%%%%%%%%%%%%%%%%%
+%% make_and_set_list([list of positions to set to 1])->
+%% returns list with all in SetPos set.
+%% in positioning in list the first element is 0, the second 1 etc.., but
+%%
+
+make_and_set_list([XPos|SetPos], XPos) ->
+ [1 | make_and_set_list(SetPos, XPos + 1)];
+make_and_set_list([Pos|SetPos], XPos) ->
+ [0 | make_and_set_list([Pos | SetPos], XPos + 1)];
+make_and_set_list([], _) ->
+ [].
+
+%%%%%%%%%%%%%%%%%
+%% pad_list(N,BitList) -> PaddedList
+%% returns a padded (with trailing {bit,0} elements) list of length N
+%% if Bitlist contains more than N significant bits set an exit asn1_error
+%% is generated
+
+pad_list(0,BitList) ->
+ case BitList of
+ [] -> [];
+ _ -> exit({error,{asn1,{range_error,{bit_string,BitList}}}})
+ end;
+pad_list(N,[Bh|Bt]) ->
+ [Bh|pad_list(N-1,Bt)];
+pad_list(N,[]) ->
+ [{bit,0},pad_list(N-1,[])].
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% X.691:16
+%% encode_octet_string(Constraint,ExtensionMarker,Val)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+encode_octet_string(C,{Name,Val}) when atom(Name) ->
+ encode_octet_string(C,false,Val);
+encode_octet_string(C,Val) ->
+ encode_octet_string(C,false,Val).
+
+encode_octet_string(_C,true,_Val) ->
+ exit({error,{asn1,{'not_supported',extensionmarker}}});
+encode_octet_string(C,false,Val) ->
+ case get_constraint(C,'SizeConstraint') of
+ 0 ->
+ [];
+ 1 ->
+ [V] = Val,
+ {bits,8,V};
+ 2 ->
+ [V1,V2] = Val,
+ [{bits,8,V1},{bits,8,V2}];
+ Sv when Sv =<65535, Sv == length(Val) -> % fixed length
+ [align,{octets,Val}];
+ {Lb,Ub} ->
+ [encode_length({Lb,Ub},length(Val)),align,
+ {octets,Val}];
+ Sv when list(Sv) ->
+ [encode_length({hd(Sv),lists:max(Sv)},length(Val)),align,
+ {octets,Val}];
+ no ->
+ [encode_length(undefined,length(Val)),align,
+ {octets,Val}]
+ end.
+
+decode_octet_string(Bytes,Range) ->
+ decode_octet_string(Bytes,Range,false).
+
+decode_octet_string(Bytes,C,false) ->
+ case get_constraint(C,'SizeConstraint') of
+ 0 ->
+ {[],Bytes};
+ 1 ->
+ {B1,Bytes2} = getbits(Bytes,8),
+ {[B1],Bytes2};
+ 2 ->
+ {B1,Bytes2}= getbits(Bytes,8),
+ {B2,Bytes3}= getbits(Bytes2,8),
+ {[B1,B2],Bytes3};
+ {_,0} ->
+ {[],Bytes};
+ Sv when integer(Sv), Sv =<65535 -> % fixed length
+ Bytes2 = align(Bytes),
+ getoctets_as_list(Bytes2,Sv);
+ {Lb,Ub} ->
+ {Len,Bytes2} = decode_length(Bytes,{Lb,Ub}),
+ Bytes3 = align(Bytes2),
+ getoctets_as_list(Bytes3,Len);
+ Sv when list(Sv) ->
+ {Len,Bytes2} = decode_length(Bytes,{hd(Sv),lists:max(Sv)}),
+ Bytes3 = align(Bytes2),
+ getoctets_as_list(Bytes3,Len);
+ no ->
+ {Len,Bytes2} = decode_length(Bytes,undefined),
+ Bytes3 = align(Bytes2),
+ getoctets_as_list(Bytes3,Len)
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Restricted char string types
+%% (NumericString, PrintableString,VisibleString,IA5String,BMPString,UniversalString)
+%% X.691:26 and X.680:34-36
+%%encode_restricted_string(aligned,'BMPString',Constraints,Extension,Val)
+
+encode_restricted_string(aligned,StringType,C,Val) ->
+encode_restricted_string(aligned,StringType,C,false,Val).
+
+
+encode_restricted_string(aligned,StringType,C,_Ext,{Name,Val}) when atom(Name) ->
+ encode_restricted_string(aligned,StringType,C,false,Val);
+encode_restricted_string(aligned,StringType,C,_Ext,Val) ->
+ Result = chars_encode(C,StringType,Val),
+ NumBits = get_NumBits(C,StringType),
+ case get_constraint(C,'SizeConstraint') of
+ Ub when integer(Ub), Ub*NumBits =< 16 ->
+ case {StringType,Result} of
+ {'BMPString',{octets,Ol}} ->
+ [{bits,8,Oct}||Oct <- Ol];
+ _ ->
+ Result
+ end;
+ 0 ->
+ [];
+ Ub when integer(Ub),Ub =<65535 -> % fixed length
+ [align,Result];
+ {Ub,Lb} ->
+ [encode_length({Ub,Lb},length(Val)),align,Result];
+ Vl when list(Vl) ->
+ [encode_length({lists:min(Vl),lists:max(Vl)},length(Val)),align,Result];
+ no ->
+ [encode_length(undefined,length(Val)),align,Result]
+ end.
+
+decode_restricted_string(Bytes,aligned,StringType,C) ->
+ decode_restricted_string(Bytes,aligned,StringType,C,false).
+
+decode_restricted_string(Bytes,aligned,StringType,C,_Ext) ->
+ NumBits = get_NumBits(C,StringType),
+ case get_constraint(C,'SizeConstraint') of
+ Ub when integer(Ub), Ub*NumBits =< 16 ->
+ chars_decode(Bytes,NumBits,StringType,C,Ub);
+ Ub when integer(Ub),Ub =<65535 -> % fixed length
+ Bytes1 = align(Bytes),
+ chars_decode(Bytes1,NumBits,StringType,C,Ub);
+ 0 ->
+ {[],Bytes};
+ Vl when list(Vl) ->
+ {Len,Bytes1} = decode_length(Bytes,{hd(Vl),lists:max(Vl)}),
+ Bytes2 = align(Bytes1),
+ chars_decode(Bytes2,NumBits,StringType,C,Len);
+ no ->
+ {Len,Bytes1} = decode_length(Bytes,undefined),
+ Bytes2 = align(Bytes1),
+ chars_decode(Bytes2,NumBits,StringType,C,Len);
+ {Lb,Ub}->
+ {Len,Bytes1} = decode_length(Bytes,{Lb,Ub}),
+ Bytes2 = align(Bytes1),
+ chars_decode(Bytes2,NumBits,StringType,C,Len)
+ end.
+
+
+
+encode_BMPString(C,Val) ->
+ encode_restricted_string(aligned,'BMPString',C,false,Val).
+decode_BMPString(Bytes,C) ->
+ decode_restricted_string(Bytes,aligned,'BMPString',C,false).
+
+encode_GeneralString(C,Val) ->
+ encode_restricted_string(aligned,'GeneralString',C,false,Val).
+decode_GeneralString(Bytes,C) ->
+ decode_restricted_string(Bytes,aligned,'GeneralString',C,false).
+
+encode_GraphicString(C,Val) ->
+ encode_restricted_string(aligned,'GraphicString',C,false,Val).
+decode_GraphicString(Bytes,C) ->
+ decode_restricted_string(Bytes,aligned,'GraphicString',C,false).
+
+encode_IA5String(C,Val) ->
+ encode_restricted_string(aligned,'IA5String',C,false,Val).
+decode_IA5String(Bytes,C) ->
+ decode_restricted_string(Bytes,aligned,'IA5String',C,false).
+
+encode_NumericString(C,Val) ->
+ encode_restricted_string(aligned,'NumericString',C,false,Val).
+decode_NumericString(Bytes,C) ->
+ decode_restricted_string(Bytes,aligned,'NumericString',C,false).
+
+encode_PrintableString(C,Val) ->
+ encode_restricted_string(aligned,'PrintableString',C,false,Val).
+decode_PrintableString(Bytes,C) ->
+ decode_restricted_string(Bytes,aligned,'PrintableString',C,false).
+
+encode_TeletexString(C,Val) -> % equivalent with T61String
+ encode_restricted_string(aligned,'TeletexString',C,false,Val).
+decode_TeletexString(Bytes,C) ->
+ decode_restricted_string(Bytes,aligned,'TeletexString',C,false).
+
+encode_UniversalString(C,Val) ->
+ encode_restricted_string(aligned,'UniversalString',C,false,Val).
+decode_UniversalString(Bytes,C) ->
+ decode_restricted_string(Bytes,aligned,'UniversalString',C,false).
+
+encode_VideotexString(C,Val) ->
+ encode_restricted_string(aligned,'VideotexString',C,false,Val).
+decode_VideotexString(Bytes,C) ->
+ decode_restricted_string(Bytes,aligned,'VideotexString',C,false).
+
+encode_VisibleString(C,Val) -> % equivalent with ISO646String
+ encode_restricted_string(aligned,'VisibleString',C,false,Val).
+decode_VisibleString(Bytes,C) ->
+ decode_restricted_string(Bytes,aligned,'VisibleString',C,false).
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% getBMPChars(Bytes,Len) ->{BMPcharList,RemainingBytes}
+%%
+getBMPChars(Bytes,1) ->
+ {O1,Bytes2} = getbits(Bytes,8),
+ {O2,Bytes3} = getbits(Bytes2,8),
+ if
+ O1 == 0 ->
+ {[O2],Bytes3};
+ true ->
+ {[{O1,O2}],Bytes3}
+ end;
+getBMPChars(Bytes,Len) ->
+ getBMPChars(Bytes,Len,[]).
+
+getBMPChars(Bytes,0,Acc) ->
+ {lists:reverse(Acc),Bytes};
+getBMPChars(Bytes,Len,Acc) ->
+ {Octs,Bytes1} = getoctets_as_list(Bytes,2),
+ case Octs of
+ [0,O2] ->
+ getBMPChars(Bytes1,Len-1,[O2|Acc]);
+ [O1,O2]->
+ getBMPChars(Bytes1,Len-1,[{O1,O2}|Acc])
+ end.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% chars_encode(C,StringType,Value) -> ValueList
+%%
+%% encodes chars according to the per rules taking the constraint PermittedAlphabet
+%% into account.
+%% This function does only encode the value part and NOT the length
+
+chars_encode(C,StringType,Value) ->
+ case {StringType,get_constraint(C,'PermittedAlphabet')} of
+ {'UniversalString',{_,_Sv}} ->
+ exit({error,{asn1,{'not implemented',"UniversalString with PermittedAlphabet constraint"}}});
+ {'BMPString',{_,_Sv}} ->
+ exit({error,{asn1,{'not implemented',"BMPString with PermittedAlphabet constraint"}}});
+ _ ->
+ {NumBits,CharOutTab} = {get_NumBits(C,StringType),get_CharOutTab(C,StringType)},
+ chars_encode2(Value,NumBits,CharOutTab)
+ end.
+
+chars_encode2([H|T],NumBits,{Min,Max,notab}) when H =< Max, H >= Min ->
+ [{bits,NumBits,H-Min}|chars_encode2(T,NumBits,{Min,Max,notab})];
+chars_encode2([H|T],NumBits,{Min,Max,Tab}) when H =< Max, H >= Min ->
+ [{bits,NumBits,element(H-Min+1,Tab)}|chars_encode2(T,NumBits,{Min,Max,Tab})];
+chars_encode2([{A,B,C,D}|T],NumBits,{Min,Max,notab}) ->
+ %% no value range check here (ought to be, but very expensive)
+ [{bits,NumBits,(A*B*C*D)-Min}|chars_encode2(T,NumBits,{Min,Max,notab})];
+chars_encode2([{A,B,C,D}|T],NumBits,{Min,Max,Tab}) ->
+ %% no value range check here (ought to be, but very expensive)
+ [{bits,NumBits,element((A*B*C*D)-Min,Tab)}|chars_encode2(T,NumBits,{Min,Max,notab})];
+chars_encode2([H|_T],_NumBits,{_Min,_Max,_Tab}) ->
+ exit({error,{asn1,{illegal_char_value,H}}});
+chars_encode2([],_,_) ->
+ [].
+
+
+get_NumBits(C,StringType) ->
+ case get_constraint(C,'PermittedAlphabet') of
+ {'SingleValue',Sv} ->
+ charbits(length(Sv),aligned);
+ no ->
+ case StringType of
+ 'GeneralString' ->
+ exit({error,{asn1,{not implemented,'GeneralString'}}});
+ 'GraphicString' ->
+ exit({error,{asn1,{not implemented,'GraphicString'}}});
+ 'TeletexString' ->
+ exit({error,{asn1,{not implemented,'TeletexString'}}});
+ 'VideotexString' ->
+ exit({error,{asn1,{not implemented,'VideotexString'}}});
+ 'IA5String' ->
+ charbits(128,aligned); % 16#00..16#7F
+ 'VisibleString' ->
+ charbits(95,aligned); % 16#20..16#7E
+ 'PrintableString' ->
+ charbits(74,aligned); % [$\s,$',$(,$),$+,$,,$-,$.,$/,"0123456789",$:,$=,$?,$A..$Z,$a..$z
+ 'NumericString' ->
+ charbits(11,aligned); % $ ,"0123456789"
+ 'UniversalString' ->
+ 32;
+ 'BMPString' ->
+ 16
+ end
+ end.
+
+%%Maybe used later
+%%get_MaxChar(C,StringType) ->
+%% case get_constraint(C,'PermittedAlphabet') of
+%% {'SingleValue',Sv} ->
+%% lists:nth(length(Sv),Sv);
+%% no ->
+%% case StringType of
+%% 'IA5String' ->
+%% 16#7F; % 16#00..16#7F
+%% 'VisibleString' ->
+%% 16#7E; % 16#20..16#7E
+%% 'PrintableString' ->
+%% $z; % [$\s,$',$(,$),$+,$,,$-,$.,$/,"0123456789",$:,$=,$?,$A..$Z,$a..$z
+%% 'NumericString' ->
+%% $9; % $ ,"0123456789"
+%% 'UniversalString' ->
+%% 16#ffffffff;
+%% 'BMPString' ->
+%% 16#ffff
+%% end
+%% end.
+
+%%Maybe used later
+%%get_MinChar(C,StringType) ->
+%% case get_constraint(C,'PermittedAlphabet') of
+%% {'SingleValue',Sv} ->
+%% hd(Sv);
+%% no ->
+%% case StringType of
+%% 'IA5String' ->
+%% 16#00; % 16#00..16#7F
+%% 'VisibleString' ->
+%% 16#20; % 16#20..16#7E
+%% 'PrintableString' ->
+%% $\s; % [$\s,$',$(,$),$+,$,,$-,$.,$/,"0123456789",$:,$=,$?,$A..$Z,$a..$z
+%% 'NumericString' ->
+%% $\s; % $ ,"0123456789"
+%% 'UniversalString' ->
+%% 16#00;
+%% 'BMPString' ->
+%% 16#00
+%% end
+%% end.
+
+get_CharOutTab(C,StringType) ->
+ get_CharTab(C,StringType,out).
+
+get_CharInTab(C,StringType) ->
+ get_CharTab(C,StringType,in).
+
+get_CharTab(C,StringType,InOut) ->
+ case get_constraint(C,'PermittedAlphabet') of
+ {'SingleValue',Sv} ->
+ get_CharTab2(C,StringType,hd(Sv),lists:max(Sv),Sv,InOut);
+ no ->
+ case StringType of
+ 'IA5String' ->
+ {0,16#7F,notab};
+ 'VisibleString' ->
+ get_CharTab2(C,StringType,16#20,16#7F,notab,InOut);
+ 'PrintableString' ->
+ Chars = lists:sort(
+ " '()+,-./0123456789:=?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"),
+ get_CharTab2(C,StringType,hd(Chars),lists:max(Chars),Chars,InOut);
+ 'NumericString' ->
+ get_CharTab2(C,StringType,16#20,$9," 0123456789",InOut);
+ 'UniversalString' ->
+ {0,16#FFFFFFFF,notab};
+ 'BMPString' ->
+ {0,16#FFFF,notab}
+ end
+ end.
+
+get_CharTab2(C,StringType,Min,Max,Chars,InOut) ->
+ BitValMax = (1 bsl get_NumBits(C,StringType))-1,
+ if
+ Max =< BitValMax ->
+ {0,Max,notab};
+ true ->
+ case InOut of
+ out ->
+ {Min,Max,create_char_tab(Min,Chars)};
+ in ->
+ {Min,Max,list_to_tuple(Chars)}
+ end
+ end.
+
+create_char_tab(Min,L) ->
+ list_to_tuple(create_char_tab(Min,L,0)).
+create_char_tab(Min,[Min|T],V) ->
+ [V|create_char_tab(Min+1,T,V+1)];
+create_char_tab(_Min,[],_V) ->
+ [];
+create_char_tab(Min,L,V) ->
+ [false|create_char_tab(Min+1,L,V)].
+
+%% This very inefficient and should be moved to compiletime
+charbits(NumOfChars,aligned) ->
+ case charbits(NumOfChars) of
+ 1 -> 1;
+ 2 -> 2;
+ B when B > 2, B =< 4 -> 4;
+ B when B > 4, B =< 8 -> 8;
+ B when B > 8, B =< 16 -> 16;
+ B when B > 16, B =< 32 -> 32
+ end.
+
+charbits(NumOfChars) when NumOfChars =< 2 -> 1;
+charbits(NumOfChars) when NumOfChars =< 4 -> 2;
+charbits(NumOfChars) when NumOfChars =< 8 -> 3;
+charbits(NumOfChars) when NumOfChars =< 16 -> 4;
+charbits(NumOfChars) when NumOfChars =< 32 -> 5;
+charbits(NumOfChars) when NumOfChars =< 64 -> 6;
+charbits(NumOfChars) when NumOfChars =< 128 -> 7;
+charbits(NumOfChars) when NumOfChars =< 256 -> 8;
+charbits(NumOfChars) when NumOfChars =< 512 -> 9;
+charbits(NumOfChars) when NumOfChars =< 1024 -> 10;
+charbits(NumOfChars) when NumOfChars =< 2048 -> 11;
+charbits(NumOfChars) when NumOfChars =< 4096 -> 12;
+charbits(NumOfChars) when NumOfChars =< 8192 -> 13;
+charbits(NumOfChars) when NumOfChars =< 16384 -> 14;
+charbits(NumOfChars) when NumOfChars =< 32768 -> 15;
+charbits(NumOfChars) when NumOfChars =< 65536 -> 16;
+charbits(NumOfChars) when integer(NumOfChars) ->
+ 16 + charbits1(NumOfChars bsr 16).
+
+charbits1(0) ->
+ 0;
+charbits1(NumOfChars) ->
+ 1 + charbits1(NumOfChars bsr 1).
+
+
+chars_decode(Bytes,_,'BMPString',C,Len) ->
+ case get_constraint(C,'PermittedAlphabet') of
+ no ->
+ getBMPChars(Bytes,Len);
+ _ ->
+ exit({error,{asn1,
+ {'not implemented',
+ "BMPString with PermittedAlphabet constraint"}}})
+ end;
+chars_decode(Bytes,NumBits,StringType,C,Len) ->
+ CharInTab = get_CharInTab(C,StringType),
+ chars_decode2(Bytes,CharInTab,NumBits,Len).
+
+
+chars_decode2(Bytes,CharInTab,NumBits,Len) ->
+ chars_decode2(Bytes,CharInTab,NumBits,Len,[]).
+
+chars_decode2(Bytes,_CharInTab,_NumBits,0,Acc) ->
+ {lists:reverse(Acc),Bytes};
+chars_decode2(Bytes,{Min,Max,notab},NumBits,Len,Acc) when NumBits > 8 ->
+ {Char,Bytes2} = getbits(Bytes,NumBits),
+ Result = case minimum_octets(Char+Min) of
+ [NewChar] -> NewChar;
+ [C1,C2] -> {0,0,C1,C2};
+ [C1,C2,C3] -> {0,C1,C2,C3};
+ [C1,C2,C3,C4] -> {C1,C2,C3,C4}
+ end,
+ chars_decode2(Bytes2,{Min,Max,notab},NumBits,Len -1,[Result|Acc]);
+chars_decode2(Bytes,{Min,Max,notab},NumBits,Len,Acc) ->
+ {Char,Bytes2} = getbits(Bytes,NumBits),
+ chars_decode2(Bytes2,{Min,Max,notab},NumBits,Len -1,[Char+Min|Acc]);
+
+%% BMPString and UniversalString with PermittedAlphabet is currently not supported
+chars_decode2(Bytes,{Min,Max,CharInTab},NumBits,Len,Acc) ->
+ {Char,Bytes2} = getbits(Bytes,NumBits),
+ chars_decode2(Bytes2,{Min,Max,CharInTab},NumBits,Len -1,[element(Char+1,CharInTab)|Acc]).
+
+
+ % X.691:17
+encode_null({Name,Val}) when atom(Name) ->
+ encode_null(Val);
+encode_null(_) -> []. % encodes to nothing
+
+decode_null(Bytes) ->
+ {'NULL',Bytes}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% encode_object_identifier(Val) -> CompleteList
+%% encode_object_identifier({Name,Val}) -> CompleteList
+%% Val -> {Int1,Int2,...,IntN} % N >= 2
+%% Name -> atom()
+%% Int1 -> integer(0..2)
+%% Int2 -> integer(0..39) when Int1 (0..1) else integer()
+%% Int3-N -> integer()
+%% CompleteList -> [{bits,8,Val}|{octets,Ol}|align|...]
+%%
+encode_object_identifier(Val) ->
+ Octets = e_object_identifier(Val,notag),
+ [{debug,object_identifier},encode_length(undefined,length(Octets)),{octets,Octets}].
+
+%% This code is copied from asn1_encode.erl (BER) and corrected and modified
+
+e_object_identifier({'OBJECT IDENTIFIER',V},DoTag) ->
+ e_object_identifier(V,DoTag);
+e_object_identifier({Cname,V},DoTag) when atom(Cname),tuple(V) ->
+ e_object_identifier(tuple_to_list(V),DoTag);
+e_object_identifier({Cname,V},DoTag) when atom(Cname),list(V) ->
+ e_object_identifier(V,DoTag);
+e_object_identifier(V,DoTag) when tuple(V) ->
+ e_object_identifier(tuple_to_list(V),DoTag);
+
+% E1 = 0|1|2 and (E2 < 40 when E1 = 0|1)
+e_object_identifier([E1,E2|Tail],_DoTag) when E1 =< 2 ->
+ Head = 40*E1 + E2, % weird
+ Res = e_object_elements([Head|Tail]),
+% dotag(DoTag,[6],elength(length(Res)+1),[Head|Res]),
+ Res.
+
+e_object_elements([]) ->
+ [];
+e_object_elements([H|T]) ->
+ lists:append(e_object_element(H),e_object_elements(T)).
+
+e_object_element(Num) when Num < 128 ->
+ [Num];
+% must be changed to handle more than 2 octets
+e_object_element(Num) -> %% when Num < ???
+ Left = ((Num band 2#11111110000000) bsr 7) bor 2#10000000,
+ Right = Num band 2#1111111 ,
+ [Left,Right].
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% decode_object_identifier(Bytes) -> {ObjId,RemainingBytes}
+%% ObjId -> {integer(),integer(),...} % at least 2 integers
+%% RemainingBytes -> [integer()] when integer() (0..255)
+decode_object_identifier(Bytes) ->
+ {Len,Bytes2} = decode_length(Bytes,undefined),
+ {Octs,Bytes3} = getoctets_as_list(Bytes2,Len),
+ [First|Rest] = dec_subidentifiers(Octs,0,[]),
+ Idlist = if
+ First < 40 ->
+ [0,First|Rest];
+ First < 80 ->
+ [1,First - 40|Rest];
+ true ->
+ [2,First - 80|Rest]
+ end,
+ {list_to_tuple(Idlist),Bytes3}.
+
+dec_subidentifiers([H|T],Av,Al) when H >=16#80 ->
+ dec_subidentifiers(T,(Av bsl 7) + (H band 16#7F),Al);
+dec_subidentifiers([H|T],Av,Al) ->
+ dec_subidentifiers(T,0,[(Av bsl 7) + H |Al]);
+dec_subidentifiers([],_Av,Al) ->
+ lists:reverse(Al).
+
+get_constraint(C,Key) ->
+ case lists:keysearch(Key,1,C) of
+ false ->
+ no;
+ {value,{_,V}} ->
+ V
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% complete(InList) -> ByteList
+%% Takes a coded list with bits and bytes and converts it to a list of bytes
+%% Should be applied as the last step at encode of a complete ASN.1 type
+%%
+complete(InList) when list(InList) ->
+ complete(InList,[],0);
+complete(InList) ->
+ complete([InList],[],0).
+
+complete([{debug,_}|T], Acc, Acclen) ->
+ complete(T,Acc,Acclen);
+complete([H|T],Acc,Acclen) when list(H) ->
+ complete(lists:concat([H,T]),Acc,Acclen);
+
+
+complete([{octets,N,Val}|T],Acc,Acclen) when N =< 4 ,integer(Val) ->
+ Newval = case N of
+ 1 ->
+ Val4 = Val band 16#FF,
+ [Val4];
+ 2 ->
+ Val3 = (Val bsr 8) band 16#FF,
+ Val4 = Val band 16#FF,
+ [Val3,Val4];
+ 3 ->
+ Val2 = (Val bsr 16) band 16#FF,
+ Val3 = (Val bsr 8) band 16#FF,
+ Val4 = Val band 16#FF,
+ [Val2,Val3,Val4];
+ 4 ->
+ Val1 = (Val bsr 24) band 16#FF,
+ Val2 = (Val bsr 16) band 16#FF,
+ Val3 = (Val bsr 8) band 16#FF,
+ Val4 = Val band 16#FF,
+ [Val1,Val2,Val3,Val4]
+ end,
+ complete([{octets,Newval}|T],Acc,Acclen);
+
+complete([{octets,Oct}|T],[],_Acclen) when list(Oct) ->
+ complete(T,lists:reverse(Oct),0);
+complete([{octets,Oct}|T],[Hacc|Tacc],Acclen) when list(Oct) ->
+ Rest = 8 - Acclen,
+ if
+ Rest == 8 ->
+ complete(T,lists:concat([lists:reverse(Oct),[Hacc|Tacc]]),0);
+ true ->
+ complete(T,lists:concat([lists:reverse(Oct),[Hacc bsl Rest|Tacc]]),0)
+ end;
+
+complete([{bit,Val}|T], Acc, Acclen) ->
+ complete([{bits,1,Val}|T],Acc,Acclen);
+complete([{octet,Val}|T], Acc, Acclen) ->
+ complete([{octets,1,Val}|T],Acc,Acclen);
+
+complete([{bits,N,Val}|T], Acc, 0) when N =< 8 ->
+ complete(T,[Val|Acc],N);
+complete([{bits,N,Val}|T], [Hacc|Tacc], Acclen) when N =< 8 ->
+ Rest = 8 - Acclen,
+ if
+ Rest >= N ->
+ complete(T,[(Hacc bsl N) + Val|Tacc],(Acclen+N) rem 8);
+ true ->
+ Diff = N - Rest,
+ NewHacc = (Hacc bsl Rest) + (Val bsr Diff),
+ Mask = element(Diff,{1,3,7,15,31,63,127,255}),
+ complete(T,[(Val band Mask),NewHacc|Tacc],(Acclen+N) rem 8)
+ end;
+complete([{bits,N,Val}|T], Acc, Acclen) -> % N > 8
+ complete([{bits,N-8,Val bsr 8},{bits,8,Val band 255}|T],Acc,Acclen);
+
+complete([align|T],Acc,0) ->
+ complete(T,Acc,0);
+complete([align|T],[Hacc|Tacc],Acclen) ->
+ Rest = 8 - Acclen,
+ complete(T,[Hacc bsl Rest|Tacc],0);
+complete([{octets,_N,Val}|T],Acc,Acclen) when list(Val) -> % no security check here
+ complete([{octets,Val}|T],Acc,Acclen);
+complete([],Acc,0) ->
+ lists:reverse(Acc);
+complete([],[Hacc|Tacc],Acclen) when Acclen > 0->
+ Rest = 8 - Acclen,
+ NewHacc = Hacc bsl Rest,
+ lists:reverse([NewHacc|Tacc]).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_per_bin.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_per_bin.erl
new file mode 100644
index 0000000000..8b4512b58e
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_per_bin.erl
@@ -0,0 +1,2176 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1rt_per_bin.erl,v 1.1 2008/12/17 09:53:31 mikpe Exp $
+%%
+-module(asn1rt_per_bin).
+
+%% encoding / decoding of PER aligned
+
+-include("asn1_records.hrl").
+
+-export([dec_fixup/3, cindex/3, list_to_record/2]).
+-export([setchoiceext/1, setext/1, fixoptionals/2, fixoptionals/3,
+ fixextensions/2,
+ getext/1, getextension/2, skipextensions/3, getbit/1, getchoice/3 ]).
+-export([getoptionals/2, getoptionals2/2, set_choice/3, encode_integer/2, encode_integer/3 ]).
+-export([decode_integer/2, decode_integer/3, encode_small_number/1, encode_boolean/1,
+ decode_boolean/1, encode_length/2, decode_length/1, decode_length/2,
+ encode_small_length/1, decode_small_length/1,
+ decode_compact_bit_string/3]).
+-export([decode_enumerated/3,
+ encode_bit_string/3, decode_bit_string/3 ]).
+-export([encode_octet_string/2, decode_octet_string/2,
+ encode_null/1, decode_null/1,
+ encode_object_identifier/1, decode_object_identifier/1,
+ complete/1]).
+
+
+-export([encode_open_type/2, decode_open_type/2]).
+
+-export([encode_UniversalString/2, decode_UniversalString/2,
+ encode_PrintableString/2, decode_PrintableString/2,
+ encode_GeneralString/2, decode_GeneralString/2,
+ encode_GraphicString/2, decode_GraphicString/2,
+ encode_TeletexString/2, decode_TeletexString/2,
+ encode_VideotexString/2, decode_VideotexString/2,
+ encode_VisibleString/2, decode_VisibleString/2,
+ encode_BMPString/2, decode_BMPString/2,
+ encode_IA5String/2, decode_IA5String/2,
+ encode_NumericString/2, decode_NumericString/2,
+ encode_ObjectDescriptor/2, decode_ObjectDescriptor/1
+ ]).
+-export([complete_bytes/1]).
+
+-define('16K',16384).
+-define('32K',32768).
+-define('64K',65536).
+
+dec_fixup(Terms,Cnames,RemBytes) ->
+ dec_fixup(Terms,Cnames,RemBytes,[]).
+
+dec_fixup([novalue|T],[_Hc|Tc],RemBytes,Acc) ->
+ dec_fixup(T,Tc,RemBytes,Acc);
+dec_fixup([{_Name,novalue}|T],[_Hc|Tc],RemBytes,Acc) ->
+ dec_fixup(T,Tc,RemBytes,Acc);
+dec_fixup([H|T],[Hc|Tc],RemBytes,Acc) ->
+ dec_fixup(T,Tc,RemBytes,[{Hc,H}|Acc]);
+dec_fixup([],_Cnames,RemBytes,Acc) ->
+ {lists:reverse(Acc),RemBytes}.
+
+cindex(Ix,Val,Cname) ->
+ case element(Ix,Val) of
+ {Cname,Val2} -> Val2;
+ X -> X
+ end.
+
+%% converts a list to a record if necessary
+list_to_record(_Name,Tuple) when tuple(Tuple) ->
+ Tuple;
+list_to_record(Name,List) when list(List) ->
+ list_to_tuple([Name|List]).
+
+%%--------------------------------------------------------
+%% setchoiceext(InRootSet) -> [{bit,X}]
+%% X is set to 1 when InRootSet==false
+%% X is set to 0 when InRootSet==true
+%%
+setchoiceext(true) ->
+ [{debug,choiceext},{bits,1,0}];
+setchoiceext(false) ->
+ [{debug,choiceext},{bits,1,1}].
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% setext(true|false) -> CompleteList
+%%
+
+setext(false) ->
+ [{debug,ext},{bits,1,0}];
+setext(true) ->
+ [{debug,ext},{bits,1,1}].
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% This version of fixoptionals/2 are left only because of
+%% backward compatibility with older generates
+
+fixoptionals(OptList,Val) when tuple(Val) ->
+ fixoptionals1(OptList,Val,[]);
+
+fixoptionals(OptList,Val) when list(Val) ->
+ fixoptionals1(OptList,Val,1,[],[]).
+
+fixoptionals1([],Val,Acc) ->
+ %% return {Val,Opt}
+ {Val,lists:reverse(Acc)};
+fixoptionals1([{_,Pos}|Ot],Val,Acc) ->
+ case element(Pos+1,Val) of
+ asn1_NOVALUE -> fixoptionals1(Ot,Val,[0|Acc]);
+ asn1_DEFAULT -> fixoptionals1(Ot,Val,[0|Acc]);
+ _ -> fixoptionals1(Ot,Val,[1|Acc])
+ end.
+
+
+fixoptionals1([{Name,Pos}|Ot],[{Name,Val}|Vt],_Opt,Acc1,Acc2) ->
+ fixoptionals1(Ot,Vt,Pos+1,[1|Acc1],[{Name,Val}|Acc2]);
+fixoptionals1([{_Name,Pos}|Ot],V,Pos,Acc1,Acc2) ->
+ fixoptionals1(Ot,V,Pos+1,[0|Acc1],[asn1_NOVALUE|Acc2]);
+fixoptionals1(O,[Vh|Vt],Pos,Acc1,Acc2) ->
+ fixoptionals1(O,Vt,Pos+1,Acc1,[Vh|Acc2]);
+fixoptionals1([],[Vh|Vt],Pos,Acc1,Acc2) ->
+ fixoptionals1([],Vt,Pos+1,Acc1,[Vh|Acc2]);
+fixoptionals1([],[],_,Acc1,Acc2) ->
+ % return {Val,Opt}
+ {list_to_tuple([asn1_RECORDNAME|lists:reverse(Acc2)]),lists:reverse(Acc1)}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% This is the new fixoptionals/3 which is used by the new generates
+%%
+fixoptionals(OptList,OptLength,Val) when tuple(Val) ->
+ Bits = fixoptionals(OptList,Val,0),
+ {Val,{bits,OptLength,Bits}};
+
+fixoptionals([],_Val,Acc) ->
+ %% Optbits
+ Acc;
+fixoptionals([Pos|Ot],Val,Acc) ->
+ case element(Pos,Val) of
+ asn1_NOVALUE -> fixoptionals(Ot,Val,Acc bsl 1);
+ asn1_DEFAULT -> fixoptionals(Ot,Val,Acc bsl 1);
+ _ -> fixoptionals(Ot,Val,(Acc bsl 1) + 1)
+ end.
+
+
+getext(Bytes) when tuple(Bytes) ->
+ getbit(Bytes);
+getext(Bytes) when binary(Bytes) ->
+ getbit({0,Bytes});
+getext(Bytes) when list(Bytes) ->
+ getbit({0,Bytes}).
+
+getextension(0, Bytes) ->
+ {{},Bytes};
+getextension(1, Bytes) ->
+ {Len,Bytes2} = decode_small_length(Bytes),
+ {Blist, Bytes3} = getbits_as_list(Len,Bytes2),
+ {list_to_tuple(Blist),Bytes3}.
+
+fixextensions({ext,ExtPos,ExtNum},Val) ->
+ case fixextensions(ExtPos,ExtNum+ExtPos,Val,0) of
+ 0 -> [];
+ ExtBits ->
+ [encode_small_length(ExtNum),{bits,ExtNum,ExtBits}]
+ end.
+
+fixextensions(Pos,MaxPos,_,Acc) when Pos >= MaxPos ->
+ Acc;
+fixextensions(Pos,ExtPos,Val,Acc) ->
+ Bit = case catch(element(Pos+1,Val)) of
+ asn1_NOVALUE ->
+ 0;
+ asn1_NOEXTVALUE ->
+ 0;
+ {'EXIT',_} ->
+ 0;
+ _ ->
+ 1
+ end,
+ fixextensions(Pos+1,ExtPos,Val,(Acc bsl 1)+Bit).
+
+skipextensions(Bytes,Nr,ExtensionBitPattern) ->
+ case (catch element(Nr,ExtensionBitPattern)) of
+ 1 ->
+ {_,Bytes2} = decode_open_type(Bytes,[]),
+ skipextensions(Bytes2, Nr+1, ExtensionBitPattern);
+ 0 ->
+ skipextensions(Bytes, Nr+1, ExtensionBitPattern);
+ {'EXIT',_} -> % badarg, no more extensions
+ Bytes
+ end.
+
+
+getchoice(Bytes,1,0) -> % only 1 alternative is not encoded
+ {0,Bytes};
+getchoice(Bytes,_,1) ->
+ decode_small_number(Bytes);
+getchoice(Bytes,NumChoices,0) ->
+ decode_constrained_number(Bytes,{0,NumChoices-1}).
+
+%% old version kept for backward compatibility with generates from R7B
+getoptionals(Bytes,NumOpt) ->
+ {Blist,Bytes1} = getbits_as_list(NumOpt,Bytes),
+ {list_to_tuple(Blist),Bytes1}.
+
+%% new version used in generates from r8b_patch/3 and later
+getoptionals2(Bytes,NumOpt) ->
+ getbits(Bytes,NumOpt).
+
+
+%% getbits_as_binary(Num,Bytes) -> {{Unused,BinBits},RestBytes},
+%% Num = integer(),
+%% Bytes = list() | tuple(),
+%% Unused = integer(),
+%% BinBits = binary(),
+%% RestBytes = tuple()
+getbits_as_binary(Num,Bytes) when binary(Bytes) ->
+ getbits_as_binary(Num,{0,Bytes});
+getbits_as_binary(0,Buffer) ->
+ {{0,<<>>},Buffer};
+getbits_as_binary(Num,{0,Bin}) when Num > 16 ->
+ Used = Num rem 8,
+ Pad = (8 - Used) rem 8,
+% Nbytes = Num div 8,
+ <<Bits:Num,_:Pad,RestBin/binary>> = Bin,
+ {{Pad,<<Bits:Num,0:Pad>>},RestBin};
+getbits_as_binary(Num,Buffer={_Used,_Bin}) -> % Unaligned buffer
+ %% Num =< 16,
+ {Bits2,Buffer2} = getbits(Buffer,Num),
+ Pad = (8 - (Num rem 8)) rem 8,
+ {{Pad,<<Bits2:Num,0:Pad>>},Buffer2}.
+
+
+% integer_from_list(Int,[],BigInt) ->
+% BigInt;
+% integer_from_list(Int,[H|T],BigInt) when Int < 8 ->
+% (BigInt bsl Int) bor (H bsr (8-Int));
+% integer_from_list(Int,[H|T],BigInt) ->
+% integer_from_list(Int-8,T,(BigInt bsl 8) bor H).
+
+getbits_as_list(Num,Bytes) when binary(Bytes) ->
+ getbits_as_list(Num,{0,Bytes},[]);
+getbits_as_list(Num,Bytes) ->
+ getbits_as_list(Num,Bytes,[]).
+
+%% If buffer is empty and nothing more will be picked.
+getbits_as_list(0, B, Acc) ->
+ {lists:reverse(Acc),B};
+%% If first byte in buffer is full and at least one byte will be picked,
+%% then pick one byte.
+getbits_as_list(N,{0,Bin},Acc) when N >= 8 ->
+ <<B7:1,B6:1,B5:1,B4:1,B3:1,B2:1,B1:1,B0:1,Rest/binary>> = Bin,
+ getbits_as_list(N-8,{0,Rest},[B0,B1,B2,B3,B4,B5,B6,B7|Acc]);
+getbits_as_list(N,{Used,Bin},Acc) when N >= 4, Used =< 4 ->
+ NewUsed = Used + 4,
+ Rem = 8 - NewUsed,
+ <<_:Used,B3:1,B2:1,B1:1,B0:1,_:Rem, Rest/binary>> = Bin,
+ NewRest = case Rem of 0 -> Rest; _ -> Bin end,
+ getbits_as_list(N-4,{NewUsed rem 8,NewRest},[B0,B1,B2,B3|Acc]);
+getbits_as_list(N,{Used,Bin},Acc) when N >= 2, Used =< 6 ->
+ NewUsed = Used + 2,
+ Rem = 8 - NewUsed,
+ <<_:Used,B1:1,B0:1,_:Rem, Rest/binary>> = Bin,
+ NewRest = case Rem of 0 -> Rest; _ -> Bin end,
+ getbits_as_list(N-2,{NewUsed rem 8,NewRest},[B0,B1|Acc]);
+getbits_as_list(N,{Used,Bin},Acc) when Used =< 7 ->
+ NewUsed = Used + 1,
+ Rem = 8 - NewUsed,
+ <<_:Used,B0:1,_:Rem, Rest/binary>> = Bin,
+ NewRest = case Rem of 0 -> Rest; _ -> Bin end,
+ getbits_as_list(N-1,{NewUsed rem 8,NewRest},[B0|Acc]).
+
+
+getbit({7,<<_:7,B:1,Rest/binary>>}) ->
+ {B,{0,Rest}};
+getbit({0,Buffer = <<B:1,_:7,_/binary>>}) ->
+ {B,{1,Buffer}};
+getbit({Used,Buffer}) ->
+ Unused = (8 - Used) - 1,
+ <<_:Used,B:1,_:Unused,_/binary>> = Buffer,
+ {B,{Used+1,Buffer}};
+getbit(Buffer) when binary(Buffer) ->
+ getbit({0,Buffer}).
+
+
+getbits({0,Buffer},Num) when (Num rem 8) == 0 ->
+ <<Bits:Num,Rest/binary>> = Buffer,
+ {Bits,{0,Rest}};
+getbits({Used,Bin},Num) ->
+ NumPlusUsed = Num + Used,
+ NewUsed = NumPlusUsed rem 8,
+ Unused = (8-NewUsed) rem 8,
+ case Unused of
+ 0 ->
+ <<_:Used,Bits:Num,Rest/binary>> = Bin,
+ {Bits,{0,Rest}};
+ _ ->
+ Bytes = NumPlusUsed div 8,
+ <<_:Used,Bits:Num,_UBits:Unused,_/binary>> = Bin,
+ <<_:Bytes/binary,Rest/binary>> = Bin,
+ {Bits,{NewUsed,Rest}}
+ end;
+getbits(Bin,Num) when binary(Bin) ->
+ getbits({0,Bin},Num).
+
+
+
+% getoctet(Bytes) when list(Bytes) ->
+% getoctet({0,Bytes});
+% getoctet(Bytes) ->
+% %% io:format("getoctet:Buffer = ~p~n",[Bytes]),
+% getoctet1(Bytes).
+
+% getoctet1({0,[H|T]}) ->
+% {H,{0,T}};
+% getoctet1({Pos,[_,H|T]}) ->
+% {H,{0,T}}.
+
+align({0,L}) ->
+ {0,L};
+align({_Pos,<<_H,T/binary>>}) ->
+ {0,T};
+align(Bytes) ->
+ {0,Bytes}.
+
+%% First align buffer, then pick the first Num octets.
+%% Returns octets as an integer with bit significance as in buffer.
+getoctets({0,Buffer},Num) ->
+ <<Val:Num/integer-unit:8,RestBin/binary>> = Buffer,
+ {Val,{0,RestBin}};
+getoctets({U,<<_Padding,Rest/binary>>},Num) when U /= 0 ->
+ getoctets({0,Rest},Num);
+getoctets(Buffer,Num) when binary(Buffer) ->
+ getoctets({0,Buffer},Num).
+% getoctets(Buffer,Num) ->
+% %% io:format("getoctets:Buffer = ~p~nNum = ~p~n",[Buffer,Num]),
+% getoctets(Buffer,Num,0).
+
+% getoctets(Buffer,0,Acc) ->
+% {Acc,Buffer};
+% getoctets(Buffer,Num,Acc) ->
+% {Oct,NewBuffer} = getoctet(Buffer),
+% getoctets(NewBuffer,Num-1,(Acc bsl 8)+Oct).
+
+% getoctets_as_list(Buffer,Num) ->
+% getoctets_as_list(Buffer,Num,[]).
+
+% getoctets_as_list(Buffer,0,Acc) ->
+% {lists:reverse(Acc),Buffer};
+% getoctets_as_list(Buffer,Num,Acc) ->
+% {Oct,NewBuffer} = getoctet(Buffer),
+% getoctets_as_list(NewBuffer,Num-1,[Oct|Acc]).
+
+%% First align buffer, then pick the first Num octets.
+%% Returns octets as a binary
+getoctets_as_bin({0,Bin},Num)->
+ <<Octets:Num/binary,RestBin/binary>> = Bin,
+ {Octets,{0,RestBin}};
+getoctets_as_bin({_U,Bin},Num) ->
+ <<_Padding,Octets:Num/binary,RestBin/binary>> = Bin,
+ {Octets,{0,RestBin}};
+getoctets_as_bin(Bin,Num) when binary(Bin) ->
+ getoctets_as_bin({0,Bin},Num).
+
+%% same as above but returns octets as a List
+getoctets_as_list(Buffer,Num) ->
+ {Bin,Buffer2} = getoctets_as_bin(Buffer,Num),
+ {binary_to_list(Bin),Buffer2}.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% set_choice(Alt,Choices,Altnum) -> ListofBitSettings
+%% Alt = atom()
+%% Altnum = integer() | {integer(),integer()}% number of alternatives
+%% Choices = [atom()] | {[atom()],[atom()]}
+%% When Choices is a tuple the first list is the Rootset and the
+%% second is the Extensions and then Altnum must also be a tuple with the
+%% lengths of the 2 lists
+%%
+set_choice(Alt,{L1,L2},{Len1,_Len2}) ->
+ case set_choice_tag(Alt,L1) of
+ N when integer(N), Len1 > 1 ->
+ [{bits,1,0}, % the value is in the root set
+ encode_integer([{'ValueRange',{0,Len1-1}}],N)];
+ N when integer(N) ->
+ [{bits,1,0}]; % no encoding if only 0 or 1 alternative
+ false ->
+ [{bits,1,1}, % extension value
+ case set_choice_tag(Alt,L2) of
+ N2 when integer(N2) ->
+ encode_small_number(N2);
+ false ->
+ unknown_choice_alt
+ end]
+ end;
+set_choice(Alt,L,Len) ->
+ case set_choice_tag(Alt,L) of
+ N when integer(N), Len > 1 ->
+ encode_integer([{'ValueRange',{0,Len-1}}],N);
+ N when integer(N) ->
+ []; % no encoding if only 0 or 1 alternative
+ false ->
+ [unknown_choice_alt]
+ end.
+
+set_choice_tag(Alt,Choices) ->
+ set_choice_tag(Alt,Choices,0).
+
+set_choice_tag(Alt,[Alt|_Rest],Tag) ->
+ Tag;
+set_choice_tag(Alt,[_H|Rest],Tag) ->
+ set_choice_tag(Alt,Rest,Tag+1);
+set_choice_tag(_Alt,[],_Tag) ->
+ false.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% decode_fragmented_XXX; decode of values encoded fragmented according
+%% to ITU-T X.691 clause 10.9.3.8. The unit (XXX) is either bits, octets,
+%% characters or number of components (in a choice,sequence or similar).
+%% Buffer is a buffer {Used, Bin}.
+%% C is the constrained length.
+%% If the buffer is not aligned, this function does that.
+decode_fragmented_bits({0,Buffer},C) ->
+ decode_fragmented_bits(Buffer,C,[]);
+decode_fragmented_bits({_N,<<_,Bs/binary>>},C) ->
+ decode_fragmented_bits(Bs,C,[]).
+
+decode_fragmented_bits(<<3:2,Len:6,Bin/binary>>,C,Acc) ->
+ {Value,Bin2} = split_binary(Bin, Len * ?'16K'),
+ decode_fragmented_bits(Bin2,C,[Value,Acc]);
+decode_fragmented_bits(<<0:1,0:7,Bin/binary>>,C,Acc) ->
+ BinBits = list_to_binary(lists:reverse(Acc)),
+ case C of
+ Int when integer(Int),C == size(BinBits) ->
+ {BinBits,{0,Bin}};
+ Int when integer(Int) ->
+ exit({error,{asn1,{illegal_value,C,BinBits}}});
+ _ ->
+ {BinBits,{0,Bin}}
+ end;
+decode_fragmented_bits(<<0:1,Len:7,Bin/binary>>,C,Acc) ->
+ Result = {BinBits,{Used,_Rest}} =
+ case (Len rem 8) of
+ 0 ->
+ <<Value:Len/binary-unit:1,Bin2/binary>> = Bin,
+ {list_to_binary(lists:reverse([Value|Acc])),{0,Bin2}};
+ Rem ->
+ Bytes = Len div 8,
+ U = 8 - Rem,
+ <<Value:Bytes/binary-unit:8,Bits1:Rem,Bits2:U,Bin2/binary>> = Bin,
+ {list_to_binary(lists:reverse([Bits1 bsl U,Value|Acc])),
+ {Rem,<<Bits2,Bin2/binary>>}}
+ end,
+ case C of
+ Int when integer(Int),C == (size(BinBits) - ((8 - Used) rem 8)) ->
+ Result;
+ Int when integer(Int) ->
+ exit({error,{asn1,{illegal_value,C,BinBits}}});
+ _ ->
+ Result
+ end.
+
+
+decode_fragmented_octets({0,Bin},C) ->
+ decode_fragmented_octets(Bin,C,[]);
+decode_fragmented_octets({_N,<<_,Bs/binary>>},C) ->
+ decode_fragmented_octets(Bs,C,[]).
+
+decode_fragmented_octets(<<3:2,Len:6,Bin/binary>>,C,Acc) ->
+ {Value,Bin2} = split_binary(Bin,Len * ?'16K'),
+ decode_fragmented_octets(Bin2,C,[Value,Acc]);
+decode_fragmented_octets(<<0:1,0:7,Bin/binary>>,C,Acc) ->
+ Octets = list_to_binary(lists:reverse(Acc)),
+ case C of
+ Int when integer(Int), C == size(Octets) ->
+ {Octets,{0,Bin}};
+ Int when integer(Int) ->
+ exit({error,{asn1,{illegal_value,C,Octets}}});
+ _ ->
+ {Octets,{0,Bin}}
+ end;
+decode_fragmented_octets(<<0:1,Len:7,Bin/binary>>,C,Acc) ->
+ <<Value:Len/binary-unit:8,Bin2/binary>> = Bin,
+ BinOctets = list_to_binary(lists:reverse([Value|Acc])),
+ case C of
+ Int when integer(Int),size(BinOctets) == Int ->
+ {BinOctets,Bin2};
+ Int when integer(Int) ->
+ exit({error,{asn1,{illegal_value,C,BinOctets}}});
+ _ ->
+ {BinOctets,Bin2}
+ end.
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% encode_open_type(Constraint, Value) -> CompleteList
+%% Value = list of bytes of an already encoded value (the list must be flat)
+%% | binary
+%% Contraint = not used in this version
+%%
+encode_open_type(_C, Val) when list(Val) ->
+ Bin = list_to_binary(Val),
+ [encode_length(undefined,size(Bin)),{octets,Bin}]; % octets implies align
+encode_open_type(_C, Val) when binary(Val) ->
+ [encode_length(undefined,size(Val)),{octets,Val}]. % octets implies align
+%% the binary_to_list is not optimal but compatible with the current solution
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% decode_open_type(Buffer,Constraint) -> Value
+%% Constraint is not used in this version
+%% Buffer = [byte] with PER encoded data
+%% Value = [byte] with decoded data (which must be decoded again as some type)
+%%
+decode_open_type(Bytes, _C) ->
+ {Len,Bytes2} = decode_length(Bytes,undefined),
+ getoctets_as_bin(Bytes2,Len).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% encode_integer(Constraint,Value,NamedNumberList) -> CompleteList
+%% encode_integer(Constraint,Value) -> CompleteList
+%% encode_integer(Constraint,{Name,Value}) -> CompleteList
+%%
+%%
+encode_integer(C,V,NamedNumberList) when atom(V) ->
+ case lists:keysearch(V,1,NamedNumberList) of
+ {value,{_,NewV}} ->
+ encode_integer(C,NewV);
+ _ ->
+ exit({error,{asn1,{namednumber,V}}})
+ end;
+encode_integer(C,V,_NamedNumberList) when integer(V) ->
+ encode_integer(C,V);
+encode_integer(C,{Name,V},NamedNumberList) when atom(Name) ->
+ encode_integer(C,V,NamedNumberList).
+
+encode_integer(C,{Name,Val}) when atom(Name) ->
+ encode_integer(C,Val);
+
+encode_integer([{Rc,_Ec}],Val) when tuple(Rc) -> % XXX when is this invoked? First argument most often a list,...Ok this is the extension case...but it doesn't work.
+ case (catch encode_integer([Rc],Val)) of
+ {'EXIT',{error,{asn1,_}}} ->
+ [{bits,1,1},encode_unconstrained_number(Val)];
+ Encoded ->
+ [{bits,1,0},Encoded]
+ end;
+encode_integer(C,Val ) when list(C) ->
+ case get_constraint(C,'SingleValue') of
+ no ->
+ encode_integer1(C,Val);
+ V when integer(V),V == Val ->
+ []; % a type restricted to a single value encodes to nothing
+ V when list(V) ->
+ case lists:member(Val,V) of
+ true ->
+ encode_integer1(C,Val);
+ _ ->
+ exit({error,{asn1,{illegal_value,Val}}})
+ end;
+ _ ->
+ exit({error,{asn1,{illegal_value,Val}}})
+ end.
+
+encode_integer1(C, Val) ->
+ case VR = get_constraint(C,'ValueRange') of
+ no ->
+ encode_unconstrained_number(Val);
+ {Lb,'MAX'} ->
+ encode_semi_constrained_number(Lb,Val);
+ %% positive with range
+ {Lb,Ub} when Val >= Lb,
+ Ub >= Val ->
+ encode_constrained_number(VR,Val);
+ _ ->
+ exit({error,{asn1,{illegal_value,VR,Val}}})
+ end.
+
+decode_integer(Buffer,Range,NamedNumberList) ->
+ {Val,Buffer2} = decode_integer(Buffer,Range),
+ case lists:keysearch(Val,2,NamedNumberList) of
+ {value,{NewVal,_}} -> {NewVal,Buffer2};
+ _ -> {Val,Buffer2}
+ end.
+
+decode_integer(Buffer,[{Rc,_Ec}]) when tuple(Rc) ->
+ {Ext,Buffer2} = getext(Buffer),
+ case Ext of
+ 0 -> decode_integer(Buffer2,[Rc]);
+ 1 -> decode_unconstrained_number(Buffer2)
+ end;
+decode_integer(Buffer,undefined) ->
+ decode_unconstrained_number(Buffer);
+decode_integer(Buffer,C) ->
+ case get_constraint(C,'SingleValue') of
+ V when integer(V) ->
+ {V,Buffer};
+ V when list(V) ->
+ {Val,Buffer2} = decode_integer1(Buffer,C),
+ case lists:member(Val,V) of
+ true ->
+ {Val,Buffer2};
+ _ ->
+ exit({error,{asn1,{illegal_value,Val}}})
+ end;
+ _ ->
+ decode_integer1(Buffer,C)
+ end.
+
+decode_integer1(Buffer,C) ->
+ case VR = get_constraint(C,'ValueRange') of
+ no ->
+ decode_unconstrained_number(Buffer);
+ {Lb, 'MAX'} ->
+ decode_semi_constrained_number(Buffer,Lb);
+ {_,_} ->
+ decode_constrained_number(Buffer,VR)
+ end.
+
+ % X.691:10.6 Encoding of a normally small non-negative whole number
+ % Use this for encoding of CHOICE index if there is an extension marker in
+ % the CHOICE
+encode_small_number({Name,Val}) when atom(Name) ->
+ encode_small_number(Val);
+encode_small_number(Val) when Val =< 63 ->
+% [{bits,1,0},{bits,6,Val}];
+ [{bits,7,Val}]; % same as above but more efficient
+encode_small_number(Val) ->
+ [{bits,1,1},encode_semi_constrained_number(0,Val)].
+
+decode_small_number(Bytes) ->
+ {Bit,Bytes2} = getbit(Bytes),
+ case Bit of
+ 0 ->
+ getbits(Bytes2,6);
+ 1 ->
+ decode_semi_constrained_number(Bytes2,0)
+ end.
+
+%% X.691:10.7 Encoding of a semi-constrained whole number
+%% might be an optimization encode_semi_constrained_number(0,Val) ->
+encode_semi_constrained_number(C,{Name,Val}) when atom(Name) ->
+ encode_semi_constrained_number(C,Val);
+encode_semi_constrained_number({Lb,'MAX'},Val) ->
+ encode_semi_constrained_number(Lb,Val);
+encode_semi_constrained_number(Lb,Val) ->
+ Val2 = Val - Lb,
+ Oct = eint_positive(Val2),
+ Len = length(Oct),
+ if
+ Len < 128 ->
+ {octets,[Len|Oct]}; % equiv with encode_length(undefined,Len) but faster
+ true ->
+ [encode_length(undefined,Len),{octets,Oct}]
+ end.
+
+decode_semi_constrained_number(Bytes,{Lb,_}) ->
+ decode_semi_constrained_number(Bytes,Lb);
+decode_semi_constrained_number(Bytes,Lb) ->
+ {Len,Bytes2} = decode_length(Bytes,undefined),
+ {V,Bytes3} = getoctets(Bytes2,Len),
+ {V+Lb,Bytes3}.
+
+encode_constrained_number(Range,{Name,Val}) when atom(Name) ->
+ encode_constrained_number(Range,Val);
+encode_constrained_number({Lb,Ub},Val) when Val >= Lb, Ub >= Val ->
+ Range = Ub - Lb + 1,
+ Val2 = Val - Lb,
+ if
+ Range == 2 ->
+ {bits,1,Val2};
+ Range =< 4 ->
+ {bits,2,Val2};
+ Range =< 8 ->
+ {bits,3,Val2};
+ Range =< 16 ->
+ {bits,4,Val2};
+ Range =< 32 ->
+ {bits,5,Val2};
+ Range =< 64 ->
+ {bits,6,Val2};
+ Range =< 128 ->
+ {bits,7,Val2};
+ Range =< 255 ->
+ {bits,8,Val2};
+ Range =< 256 ->
+ {octets,[Val2]};
+ Range =< 65536 ->
+ {octets,<<Val2:16>>};
+ Range =< 16#1000000 ->
+ Octs = eint_positive(Val2),
+ [{bits,2,length(Octs)-1},{octets,Octs}];
+ Range =< 16#100000000 ->
+ Octs = eint_positive(Val2),
+ [{bits,2,length(Octs)-1},{octets,Octs}];
+ Range =< 16#10000000000 ->
+ Octs = eint_positive(Val2),
+ [{bits,3,length(Octs)-1},{octets,Octs}];
+ true ->
+ exit({not_supported,{integer_range,Range}})
+ end;
+encode_constrained_number(Range,Val) ->
+ exit({error,{asn1,{integer_range,Range,value,Val}}}).
+
+
+decode_constrained_number(Buffer,{Lb,Ub}) ->
+ Range = Ub - Lb + 1,
+ % Val2 = Val - Lb,
+ {Val,Remain} =
+ if
+ Range == 2 ->
+ getbits(Buffer,1);
+ Range =< 4 ->
+ getbits(Buffer,2);
+ Range =< 8 ->
+ getbits(Buffer,3);
+ Range =< 16 ->
+ getbits(Buffer,4);
+ Range =< 32 ->
+ getbits(Buffer,5);
+ Range =< 64 ->
+ getbits(Buffer,6);
+ Range =< 128 ->
+ getbits(Buffer,7);
+ Range =< 255 ->
+ getbits(Buffer,8);
+ Range =< 256 ->
+ getoctets(Buffer,1);
+ Range =< 65536 ->
+ getoctets(Buffer,2);
+ Range =< 16#1000000 ->
+ {Len,Bytes2} = decode_length(Buffer,{1,3}),
+ {Octs,Bytes3} = getoctets_as_list(Bytes2,Len),
+ {dec_pos_integer(Octs),Bytes3};
+ Range =< 16#100000000 ->
+ {Len,Bytes2} = decode_length(Buffer,{1,4}),
+ {Octs,Bytes3} = getoctets_as_list(Bytes2,Len),
+ {dec_pos_integer(Octs),Bytes3};
+ Range =< 16#10000000000 ->
+ {Len,Bytes2} = decode_length(Buffer,{1,5}),
+ {Octs,Bytes3} = getoctets_as_list(Bytes2,Len),
+ {dec_pos_integer(Octs),Bytes3};
+ true ->
+ exit({not_supported,{integer_range,Range}})
+ end,
+ {Val+Lb,Remain}.
+
+%% X.691:10.8 Encoding of an unconstrained whole number
+
+encode_unconstrained_number(Val) when Val >= 0 ->
+ Oct = eint(Val,[]),
+ Len = length(Oct),
+ if
+ Len < 128 ->
+ {octets,[Len|Oct]}; % equiv with encode_length(undefined,Len) but faster
+ true ->
+ [encode_length(undefined,Len),{octets,Oct}]
+ end;
+encode_unconstrained_number(Val) -> % negative
+ Oct = enint(Val,[]),
+ Len = length(Oct),
+ if
+ Len < 128 ->
+ {octets,[Len|Oct]}; % equiv with encode_length(undefined,Len) but faster
+ true ->
+ [encode_length(undefined,Len),{octets,Oct}]
+ end.
+
+
+%% used for positive Values which don't need a sign bit
+%% returns a binary
+eint_positive(Val) ->
+ case eint(Val,[]) of
+ [0,B1|T] ->
+ [B1|T];
+ T ->
+ T
+ end.
+
+
+eint(0, [B|Acc]) when B < 128 ->
+ [B|Acc];
+eint(N, Acc) ->
+ eint(N bsr 8, [N band 16#ff| Acc]).
+
+enint(-1, [B1|T]) when B1 > 127 ->
+ [B1|T];
+enint(N, Acc) ->
+ enint(N bsr 8, [N band 16#ff|Acc]).
+
+decode_unconstrained_number(Bytes) ->
+ {Len,Bytes2} = decode_length(Bytes,undefined),
+ {Ints,Bytes3} = getoctets_as_list(Bytes2,Len),
+ {dec_integer(Ints),Bytes3}.
+
+dec_pos_integer(Ints) ->
+ decpint(Ints, 8 * (length(Ints) - 1)).
+dec_integer(Ints) when hd(Ints) band 255 =< 127 -> %% Positive number
+ decpint(Ints, 8 * (length(Ints) - 1));
+dec_integer(Ints) -> %% Negative
+ decnint(Ints, 8 * (length(Ints) - 1)).
+
+decpint([Byte|Tail], Shift) ->
+ (Byte bsl Shift) bor decpint(Tail, Shift-8);
+decpint([], _) -> 0.
+
+decnint([Byte|Tail], Shift) ->
+ (-128 + (Byte band 127) bsl Shift) bor decpint(Tail, Shift-8).
+
+% minimum_octets(Val) ->
+% minimum_octets(Val,[]).
+
+% minimum_octets(Val,Acc) when Val > 0 ->
+% minimum_octets((Val bsr 8),[Val band 16#FF|Acc]);
+% minimum_octets(0,Acc) ->
+% Acc.
+
+
+%% X.691:10.9 Encoding of a length determinant
+%%encode_small_length(undefined,Len) -> % null means no UpperBound
+%% encode_small_number(Len).
+
+%% X.691:10.9.3.5
+%% X.691:10.9.3.7
+encode_length(undefined,Len) -> % un-constrained
+ if
+ Len < 128 ->
+ {octets,[Len]};
+ Len < 16384 ->
+ {octets,<<2:2,Len:14>>};
+ true -> % should be able to endode length >= 16384
+ exit({error,{asn1,{encode_length,{nyi,above_16k}}}})
+ end;
+
+encode_length({0,'MAX'},Len) ->
+ encode_length(undefined,Len);
+encode_length(Vr={Lb,Ub},Len) when Ub =< 65535 ,Lb >= 0 -> % constrained
+ encode_constrained_number(Vr,Len);
+encode_length({Lb,_Ub},Len) when integer(Lb), Lb >= 0 -> % Ub > 65535
+ encode_length(undefined,Len);
+encode_length({Vr={Lb,Ub},[]},Len) when Ub =< 65535 ,Lb >= 0 ->
+ %% constrained extensible
+ [{bits,1,0},encode_constrained_number(Vr,Len)];
+encode_length(SingleValue,_Len) when integer(SingleValue) ->
+ [].
+
+%% X.691 10.9.3.4 (only used for length of bitmap that prefixes extension
+%% additions in a sequence or set
+encode_small_length(Len) when Len =< 64 ->
+%% [{bits,1,0},{bits,6,Len-1}];
+ {bits,7,Len-1}; % the same as above but more efficient
+encode_small_length(Len) ->
+ [{bits,1,1},encode_length(undefined,Len)].
+
+% decode_small_length({Used,<<_:Used,0:1,Num:6,_:((8-Used+1) rem 8),Rest/binary>>}) ->
+% case Buffer of
+% <<_:Used,0:1,Num:6,_:((8-Used+1) rem 8),Rest/binary>> ->
+% {Num,
+% case getbit(Buffer) of
+% {0,Remain} ->
+% {Bits,Remain2} = getbits(Remain,6),
+% {Bits+1,Remain2};
+% {1,Remain} ->
+% decode_length(Remain,undefined)
+% end.
+
+decode_small_length(Buffer) ->
+ case getbit(Buffer) of
+ {0,Remain} ->
+ {Bits,Remain2} = getbits(Remain,6),
+ {Bits+1,Remain2};
+ {1,Remain} ->
+ decode_length(Remain,undefined)
+ end.
+
+decode_length(Buffer) ->
+ decode_length(Buffer,undefined).
+
+decode_length(Buffer,undefined) -> % un-constrained
+ {0,Buffer2} = align(Buffer),
+ case Buffer2 of
+ <<0:1,Oct:7,Rest/binary>> ->
+ {Oct,{0,Rest}};
+ <<2:2,Val:14,Rest/binary>> ->
+ {Val,{0,Rest}};
+ <<3:2,_:14,_Rest/binary>> ->
+ %% this case should be fixed
+ exit({error,{asn1,{decode_length,{nyi,above_16k}}}})
+ end;
+%% {Bits,_} = getbits(Buffer2,2),
+% case Bits of
+% 2 ->
+% {Val,Bytes3} = getoctets(Buffer2,2),
+% {(Val band 16#3FFF),Bytes3};
+% 3 ->
+% exit({error,{asn1,{decode_length,{nyi,above_16k}}}});
+% _ ->
+% {Val,Bytes3} = getoctet(Buffer2),
+% {Val band 16#7F,Bytes3}
+% end;
+
+decode_length(Buffer,{Lb,Ub}) when Ub =< 65535 ,Lb >= 0 -> % constrained
+ decode_constrained_number(Buffer,{Lb,Ub});
+decode_length(_,{Lb,_}) when integer(Lb), Lb >= 0 -> % Ub > 65535
+ exit({error,{asn1,{decode_length,{nyi,above_64K}}}});
+decode_length(Buffer,{{Lb,Ub},[]}) ->
+ case getbit(Buffer) of
+ {0,Buffer2} ->
+ decode_length(Buffer2, {Lb,Ub})
+ end;
+
+
+%When does this case occur with {_,_Lb,Ub} ??
+% X.691:10.9.3.5
+decode_length({Used,Bin},{_,_Lb,_Ub}) -> %when Len =< 127 -> % Unconstrained or large Ub NOTE! this case does not cover case when Ub > 65535
+ Unused = (8-Used) rem 8,
+ case Bin of
+ <<_:Used,0:1,Val:7,R:Unused,Rest/binary>> ->
+ {Val,{Used,<<R,Rest/binary>>}};
+ <<_:Used,_:Unused,2:2,Val:14,Rest/binary>> ->
+ {Val, {0,Rest}};
+ <<_:Used,_:Unused,3:2,_:14,_Rest/binary>> ->
+ exit({error,{asn1,{decode_length,{nyi,length_above_64K}}}})
+ end;
+% decode_length(Buffer,{_,_Lb,Ub}) -> %when Len =< 127 -> % Unconstrained or large Ub
+% case getbit(Buffer) of
+% {0,Remain} ->
+% getbits(Remain,7);
+% {1,Remain} ->
+% {Val,Remain2} = getoctets(Buffer,2),
+% {Val band 2#0111111111111111, Remain2}
+% end;
+decode_length(Buffer,SingleValue) when integer(SingleValue) ->
+ {SingleValue,Buffer}.
+
+
+ % X.691:11
+encode_boolean(true) ->
+ {bits,1,1};
+encode_boolean(false) ->
+ {bits,1,0};
+encode_boolean({Name,Val}) when atom(Name) ->
+ encode_boolean(Val);
+encode_boolean(Val) ->
+ exit({error,{asn1,{encode_boolean,Val}}}).
+
+decode_boolean(Buffer) -> %when record(Buffer,buffer)
+ case getbit(Buffer) of
+ {1,Remain} -> {true,Remain};
+ {0,Remain} -> {false,Remain}
+ end.
+
+
+%% ENUMERATED with extension marker
+decode_enumerated(Buffer,C,{Ntup1,Ntup2}) when tuple(Ntup1), tuple(Ntup2) ->
+ {Ext,Buffer2} = getext(Buffer),
+ case Ext of
+ 0 -> % not an extension value
+ {Val,Buffer3} = decode_integer(Buffer2,C),
+ case catch (element(Val+1,Ntup1)) of
+ NewVal when atom(NewVal) -> {NewVal,Buffer3};
+ _Error -> exit({error,{asn1,{decode_enumerated,{Val,[Ntup1,Ntup2]}}}})
+ end;
+ 1 -> % this an extension value
+ {Val,Buffer3} = decode_small_number(Buffer2),
+ case catch (element(Val+1,Ntup2)) of
+ NewVal when atom(NewVal) -> {NewVal,Buffer3};
+ _ -> {{asn1_enum,Val},Buffer3}
+ end
+ end;
+
+decode_enumerated(Buffer,C,NamedNumberTup) when tuple(NamedNumberTup) ->
+ {Val,Buffer2} = decode_integer(Buffer,C),
+ case catch (element(Val+1,NamedNumberTup)) of
+ NewVal when atom(NewVal) -> {NewVal,Buffer2};
+ _Error -> exit({error,{asn1,{decode_enumerated,{Val,NamedNumberTup}}}})
+ end.
+
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+%% Bitstring value, ITU_T X.690 Chapter 8.5
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+
+%%===============================================================================
+%% encode bitstring value
+%%===============================================================================
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% bitstring NamedBitList
+%% Val can be of:
+%% - [identifiers] where only named identifers are set to one,
+%% the Constraint must then have some information of the
+%% bitlength.
+%% - [list of ones and zeroes] all bits
+%% - integer value representing the bitlist
+%% C is constraint Len, only valid when identifiers
+
+
+%% when the value is a list of {Unused,BinBits}, where
+%% Unused = integer(),
+%% BinBits = binary().
+
+encode_bit_string(C,Bin={Unused,BinBits},NamedBitList) when integer(Unused),
+ binary(BinBits) ->
+ encode_bin_bit_string(C,Bin,NamedBitList);
+
+%% when the value is a list of named bits
+encode_bit_string(C, LoNB=[FirstVal | _RestVal], NamedBitList) when atom(FirstVal) ->
+ ToSetPos = get_all_bitposes(LoNB, NamedBitList, []),
+ BitList = make_and_set_list(ToSetPos,0),
+ encode_bit_string(C,BitList,NamedBitList);
+
+encode_bit_string(C, BL=[{bit,_No} | _RestVal], NamedBitList) ->
+ ToSetPos = get_all_bitposes(BL, NamedBitList, []),
+ BitList = make_and_set_list(ToSetPos,0),
+ encode_bit_string(C,BitList,NamedBitList);
+
+%% when the value is a list of ones and zeroes
+
+% encode_bit_string(C, BitListValue, NamedBitList) when list(BitListValue) ->
+% Bl1 =
+% case NamedBitList of
+% [] -> % dont remove trailing zeroes
+% BitListValue;
+% _ -> % first remove any trailing zeroes
+% lists:reverse(lists:dropwhile(fun(0)->true;(1)->false end,
+% lists:reverse(BitListValue)))
+% end,
+% BitList = [{bit,X} || X <- Bl1],
+% %% BListLen = length(BitList),
+% case get_constraint(C,'SizeConstraint') of
+% 0 -> % fixed length
+% []; % nothing to encode
+% V when integer(V),V=<16 -> % fixed length 16 bits or less
+% pad_list(V,BitList);
+% V when integer(V) -> % fixed length 16 bits or more
+% [align,pad_list(V,BitList)]; % should be another case for V >= 65537
+% {Lb,Ub} when integer(Lb),integer(Ub) ->
+% [encode_length({Lb,Ub},length(BitList)),align,BitList];
+% no ->
+% [encode_length(undefined,length(BitList)),align,BitList];
+% Sc -> % extension marker
+% [encode_length(Sc,length(BitList)),align,BitList]
+% end;
+encode_bit_string(C, BitListValue, NamedBitList) when list(BitListValue) ->
+ BitListToBinary =
+ %% fun that transforms a list of 1 and 0 to a tuple:
+ %% {UnusedBitsInLastByte, Binary}
+ fun([H|T],Acc,N,Fun) ->
+ Fun(T,(Acc bsl 1)+H,N+1,Fun);
+ ([],Acc,N,_) ->
+ Unused = (8 - (N rem 8)) rem 8,
+ {Unused,<<Acc:N,0:Unused>>}
+ end,
+ UnusedAndBin =
+ case NamedBitList of
+ [] -> % dont remove trailing zeroes
+ BitListToBinary(BitListValue,0,0,BitListToBinary);
+ _ ->
+ BitListToBinary(lists:reverse(
+ lists:dropwhile(fun(0)->true;(1)->false end,
+ lists:reverse(BitListValue))),
+ 0,0,BitListToBinary)
+ end,
+ encode_bin_bit_string(C,UnusedAndBin,NamedBitList);
+
+%% when the value is an integer
+encode_bit_string(C, IntegerVal, NamedBitList) when integer(IntegerVal)->
+ BitList = int_to_bitlist(IntegerVal),
+ encode_bit_string(C,BitList,NamedBitList);
+
+%% when the value is a tuple
+encode_bit_string(C,{Name,Val}, NamedBitList) when atom(Name) ->
+ encode_bit_string(C,Val,NamedBitList).
+
+
+%% encode_bin_bit_string/3, when value is a tuple of Unused and BinBits.
+%% Unused = integer(),i.e. number unused bits in least sign. byte of
+%% BinBits = binary().
+
+
+encode_bin_bit_string(C,UnusedAndBin={_Unused,_BinBits},NamedBitList) ->
+ Constr = get_constraint(C,'SizeConstraint'),
+ UnusedAndBin1 = {Unused1,Bin1} =
+ remove_trailing_bin(NamedBitList,UnusedAndBin,lower_bound(Constr)),
+ case Constr of
+ 0 ->
+ [];
+ V when integer(V),V=<16 ->
+ {Unused2,Bin2} = pad_list(V,UnusedAndBin1),
+ <<BitVal:V,_:Unused2>> = Bin2,
+ {bits,V,BitVal};
+ V when integer(V) ->
+ [align, pad_list(V, UnusedAndBin1)];
+ {Lb,Ub} when integer(Lb),integer(Ub) ->
+ [encode_length({Lb,Ub},size(Bin1)*8 - Unused1),
+ align,UnusedAndBin1];
+ no ->
+ [encode_length(undefined,size(Bin1)*8 - Unused1),
+ align,UnusedAndBin1];
+ Sc ->
+ [encode_length(Sc,size(Bin1)*8 - Unused1),
+ align,UnusedAndBin1]
+ end.
+
+remove_trailing_bin([], {Unused,Bin},_) ->
+ {Unused,Bin};
+remove_trailing_bin(NamedNumberList, {_Unused,Bin},C) ->
+ Size = size(Bin)-1,
+ <<Bfront:Size/binary, LastByte:8>> = Bin,
+ %% clear the Unused bits to be sure
+% LastByte1 = LastByte band (((1 bsl Unused) -1) bxor 255),
+ Unused1 = trailingZeroesInNibble(LastByte band 15),
+ Unused2 =
+ case Unused1 of
+ 4 ->
+ 4 + trailingZeroesInNibble(LastByte bsr 4);
+ _ -> Unused1
+ end,
+ case Unused2 of
+ 8 ->
+ remove_trailing_bin(NamedNumberList,{0,Bfront},C);
+ _ ->
+ case C of
+ Int when integer(Int),Int > ((size(Bin)*8)-Unused2) ->
+ %% this padding see OTP-4353
+ pad_list(Int,{Unused2,Bin});
+ _ -> {Unused2,Bin}
+ end
+ end.
+
+
+trailingZeroesInNibble(0) ->
+ 4;
+trailingZeroesInNibble(1) ->
+ 0;
+trailingZeroesInNibble(2) ->
+ 1;
+trailingZeroesInNibble(3) ->
+ 0;
+trailingZeroesInNibble(4) ->
+ 2;
+trailingZeroesInNibble(5) ->
+ 0;
+trailingZeroesInNibble(6) ->
+ 1;
+trailingZeroesInNibble(7) ->
+ 0;
+trailingZeroesInNibble(8) ->
+ 3;
+trailingZeroesInNibble(9) ->
+ 0;
+trailingZeroesInNibble(10) ->
+ 1;
+trailingZeroesInNibble(11) ->
+ 0;
+trailingZeroesInNibble(12) -> %#1100
+ 2;
+trailingZeroesInNibble(13) ->
+ 0;
+trailingZeroesInNibble(14) ->
+ 1;
+trailingZeroesInNibble(15) ->
+ 0.
+
+lower_bound({{Lb,_},_}) when integer(Lb) ->
+ Lb;
+lower_bound({Lb,_}) when integer(Lb) ->
+ Lb;
+lower_bound(C) ->
+ C.
+
+%%%%%%%%%%%%%%%
+%% The result is presented as a list of named bits (if possible)
+%% else as a tuple {Unused,Bits}. Unused is the number of unused
+%% bits, least significant bits in the last byte of Bits. Bits is
+%% the BIT STRING represented as a binary.
+%%
+decode_compact_bit_string(Buffer, C, NamedNumberList) ->
+ case get_constraint(C,'SizeConstraint') of
+ 0 -> % fixed length
+ {{8,0},Buffer};
+ V when integer(V),V=<16 -> %fixed length 16 bits or less
+ compact_bit_string(Buffer,V,NamedNumberList);
+ V when integer(V),V=<65536 -> %fixed length > 16 bits
+ Bytes2 = align(Buffer),
+ compact_bit_string(Bytes2,V,NamedNumberList);
+ V when integer(V) -> % V > 65536 => fragmented value
+ {Bin,Buffer2} = decode_fragmented_bits(Buffer,V),
+ case Buffer2 of
+ {0,_} -> {{0,Bin},Buffer2};
+ {U,_} -> {{8-U,Bin},Buffer2}
+ end;
+ {Lb,Ub} when integer(Lb),integer(Ub) ->
+ %% This case may demand decoding of fragmented length/value
+ {Len,Bytes2} = decode_length(Buffer,{Lb,Ub}),
+ Bytes3 = align(Bytes2),
+ compact_bit_string(Bytes3,Len,NamedNumberList);
+ no ->
+ %% This case may demand decoding of fragmented length/value
+ {Len,Bytes2} = decode_length(Buffer,undefined),
+ Bytes3 = align(Bytes2),
+ compact_bit_string(Bytes3,Len,NamedNumberList);
+ Sc ->
+ {Len,Bytes2} = decode_length(Buffer,Sc),
+ Bytes3 = align(Bytes2),
+ compact_bit_string(Bytes3,Len,NamedNumberList)
+ end.
+
+
+%%%%%%%%%%%%%%%
+%% The result is presented as a list of named bits (if possible)
+%% else as a list of 0 and 1.
+%%
+decode_bit_string(Buffer, C, NamedNumberList) ->
+ case get_constraint(C,'SizeConstraint') of
+ {Lb,Ub} when integer(Lb),integer(Ub) ->
+ {Len,Bytes2} = decode_length(Buffer,{Lb,Ub}),
+ Bytes3 = align(Bytes2),
+ bit_list_or_named(Bytes3,Len,NamedNumberList);
+ no ->
+ {Len,Bytes2} = decode_length(Buffer,undefined),
+ Bytes3 = align(Bytes2),
+ bit_list_or_named(Bytes3,Len,NamedNumberList);
+ 0 -> % fixed length
+ {[],Buffer}; % nothing to encode
+ V when integer(V),V=<16 -> % fixed length 16 bits or less
+ bit_list_or_named(Buffer,V,NamedNumberList);
+ V when integer(V),V=<65536 ->
+ Bytes2 = align(Buffer),
+ bit_list_or_named(Bytes2,V,NamedNumberList);
+ V when integer(V) ->
+ Bytes2 = align(Buffer),
+ {BinBits,_} = decode_fragmented_bits(Bytes2,V),
+ bit_list_or_named(BinBits,V,NamedNumberList);
+ Sc -> % extension marker
+ {Len,Bytes2} = decode_length(Buffer,Sc),
+ Bytes3 = align(Bytes2),
+ bit_list_or_named(Bytes3,Len,NamedNumberList)
+ end.
+
+
+%% if no named bits are declared we will return a
+%% {Unused,Bits}. Unused = integer(),
+%% Bits = binary().
+compact_bit_string(Buffer,Len,[]) ->
+ getbits_as_binary(Len,Buffer); % {{Unused,BinBits},NewBuffer}
+compact_bit_string(Buffer,Len,NamedNumberList) ->
+ bit_list_or_named(Buffer,Len,NamedNumberList).
+
+
+%% if no named bits are declared we will return a
+%% BitList = [0 | 1]
+
+bit_list_or_named(Buffer,Len,[]) ->
+ getbits_as_list(Len,Buffer);
+
+%% if there are named bits declared we will return a named
+%% BitList where the names are atoms and unnamed bits represented
+%% as {bit,Pos}
+%% BitList = [atom() | {bit,Pos}]
+%% Pos = integer()
+
+bit_list_or_named(Buffer,Len,NamedNumberList) ->
+ {BitList,Rest} = getbits_as_list(Len,Buffer),
+ {bit_list_or_named1(0,BitList,NamedNumberList,[]), Rest}.
+
+bit_list_or_named1(Pos,[0|Bt],Names,Acc) ->
+ bit_list_or_named1(Pos+1,Bt,Names,Acc);
+bit_list_or_named1(Pos,[1|Bt],Names,Acc) ->
+ case lists:keysearch(Pos,2,Names) of
+ {value,{Name,_}} ->
+ bit_list_or_named1(Pos+1,Bt,Names,[Name|Acc]);
+ _ ->
+ bit_list_or_named1(Pos+1,Bt,Names,[{bit,Pos}|Acc])
+ end;
+bit_list_or_named1(_,[],_,Acc) ->
+ lists:reverse(Acc).
+
+
+
+%%%%%%%%%%%%%%%
+%%
+
+int_to_bitlist(Int) when integer(Int), Int > 0 ->
+ [Int band 1 | int_to_bitlist(Int bsr 1)];
+int_to_bitlist(0) ->
+ [].
+
+
+%%%%%%%%%%%%%%%%%%
+%% get_all_bitposes([list of named bits to set], named_bit_db, []) ->
+%% [sorted_list_of_bitpositions_to_set]
+
+get_all_bitposes([{bit,ValPos}|Rest], NamedBitList, Ack) ->
+ get_all_bitposes(Rest, NamedBitList, [ValPos | Ack ]);
+
+get_all_bitposes([Val | Rest], NamedBitList, Ack) ->
+ case lists:keysearch(Val, 1, NamedBitList) of
+ {value, {_ValName, ValPos}} ->
+ get_all_bitposes(Rest, NamedBitList, [ValPos | Ack]);
+ _ ->
+ exit({error,{asn1, {bitstring_namedbit, Val}}})
+ end;
+get_all_bitposes([], _NamedBitList, Ack) ->
+ lists:sort(Ack).
+
+%%%%%%%%%%%%%%%%%%
+%% make_and_set_list([list of positions to set to 1])->
+%% returns list with all in SetPos set.
+%% in positioning in list the first element is 0, the second 1 etc.., but
+%%
+
+make_and_set_list([XPos|SetPos], XPos) ->
+ [1 | make_and_set_list(SetPos, XPos + 1)];
+make_and_set_list([Pos|SetPos], XPos) ->
+ [0 | make_and_set_list([Pos | SetPos], XPos + 1)];
+make_and_set_list([], _) ->
+ [].
+
+%%%%%%%%%%%%%%%%%
+%% pad_list(N,BitList) -> PaddedList
+%% returns a padded (with trailing {bit,0} elements) list of length N
+%% if Bitlist contains more than N significant bits set an exit asn1_error
+%% is generated
+
+pad_list(N,In={Unused,Bin}) ->
+ pad_list(N, size(Bin)*8 - Unused, In).
+
+pad_list(N,Size,In={_,_}) when N < Size ->
+ exit({error,{asn1,{range_error,{bit_string,In}}}});
+pad_list(N,Size,{Unused,Bin}) when N > Size, Unused > 0 ->
+ pad_list(N,Size+1,{Unused-1,Bin});
+pad_list(N,Size,{_Unused,Bin}) when N > Size ->
+ pad_list(N,Size+1,{7,<<Bin/binary,0>>});
+pad_list(N,N,In={_,_}) ->
+ In.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% X.691:16
+%% encode_octet_string(Constraint,ExtensionMarker,Val)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+encode_octet_string(C,Val) ->
+ encode_octet_string(C,false,Val).
+
+encode_octet_string(C,Bool,{_Name,Val}) ->
+ encode_octet_string(C,Bool,Val);
+encode_octet_string(_,true,_) ->
+ exit({error,{asn1,{'not_supported',extensionmarker}}});
+encode_octet_string(C,false,Val) ->
+ case get_constraint(C,'SizeConstraint') of
+ 0 ->
+ [];
+ 1 ->
+ [V] = Val,
+ {bits,8,V};
+ 2 ->
+ [V1,V2] = Val,
+ [{bits,8,V1},{bits,8,V2}];
+ Sv when Sv =<65535, Sv == length(Val) -> % fixed length
+ {octets,Val};
+ {Lb,Ub} ->
+ [encode_length({Lb,Ub},length(Val)),{octets,Val}];
+ Sv when list(Sv) ->
+ [encode_length({hd(Sv),lists:max(Sv)},length(Val)),{octets,Val}];
+ no ->
+ [encode_length(undefined,length(Val)),{octets,Val}]
+ end.
+
+decode_octet_string(Bytes,Range) ->
+ decode_octet_string(Bytes,Range,false).
+
+decode_octet_string(Bytes,C,false) ->
+ case get_constraint(C,'SizeConstraint') of
+ 0 ->
+ {[],Bytes};
+ 1 ->
+ {B1,Bytes2} = getbits(Bytes,8),
+ {[B1],Bytes2};
+ 2 ->
+ {Bs,Bytes2}= getbits(Bytes,16),
+ {binary_to_list(<<Bs:16>>),Bytes2};
+ {_,0} ->
+ {[],Bytes};
+ Sv when integer(Sv), Sv =<65535 -> % fixed length
+ getoctets_as_list(Bytes,Sv);
+ Sv when integer(Sv) -> % fragmented encoding
+ Bytes2 = align(Bytes),
+ decode_fragmented_octets(Bytes2,Sv);
+ {Lb,Ub} ->
+ {Len,Bytes2} = decode_length(Bytes,{Lb,Ub}),
+ getoctets_as_list(Bytes2,Len);
+ Sv when list(Sv) ->
+ {Len,Bytes2} = decode_length(Bytes,{hd(Sv),lists:max(Sv)}),
+ getoctets_as_list(Bytes2,Len);
+ no ->
+ {Len,Bytes2} = decode_length(Bytes,undefined),
+ getoctets_as_list(Bytes2,Len)
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Restricted char string types
+%% (NumericString, PrintableString,VisibleString,IA5String,BMPString,UniversalString)
+%% X.691:26 and X.680:34-36
+%%encode_restricted_string(aligned,'BMPString',Constraints,Extension,Val)
+
+
+encode_restricted_string(aligned,{Name,Val}) when atom(Name) ->
+ encode_restricted_string(aligned,Val);
+
+encode_restricted_string(aligned,Val) when list(Val)->
+ [encode_length(undefined,length(Val)),{octets,Val}].
+
+encode_known_multiplier_string(aligned,StringType,C,_Ext,{Name,Val}) when atom(Name) ->
+ encode_known_multiplier_string(aligned,StringType,C,false,Val);
+
+encode_known_multiplier_string(aligned,StringType,C,_Ext,Val) ->
+ Result = chars_encode(C,StringType,Val),
+ NumBits = get_NumBits(C,StringType),
+ case get_constraint(C,'SizeConstraint') of
+ Ub when integer(Ub), Ub*NumBits =< 16 ->
+ case {StringType,Result} of
+ {'BMPString',{octets,Ol}} ->
+ [{bits,8,Oct}||Oct <- Ol];
+ _ ->
+ Result
+ end;
+ 0 ->
+ [];
+ Ub when integer(Ub),Ub =<65535 -> % fixed length
+ [align,Result];
+ {Ub,Lb} ->
+ [encode_length({Ub,Lb},length(Val)),align,Result];
+ Vl when list(Vl) ->
+ [encode_length({lists:min(Vl),lists:max(Vl)},length(Val)),align,Result];
+ no ->
+ [encode_length(undefined,length(Val)),align,Result]
+ end.
+
+decode_restricted_string(Bytes,aligned) ->
+ {Len,Bytes2} = decode_length(Bytes,undefined),
+ getoctets_as_list(Bytes2,Len).
+
+decode_known_multiplier_string(Bytes,aligned,StringType,C,_Ext) ->
+ NumBits = get_NumBits(C,StringType),
+ case get_constraint(C,'SizeConstraint') of
+ Ub when integer(Ub), Ub*NumBits =< 16 ->
+ chars_decode(Bytes,NumBits,StringType,C,Ub);
+ Ub when integer(Ub),Ub =<65535 -> % fixed length
+ Bytes1 = align(Bytes),
+ chars_decode(Bytes1,NumBits,StringType,C,Ub);
+ 0 ->
+ {[],Bytes};
+ Vl when list(Vl) ->
+ {Len,Bytes1} = decode_length(Bytes,{hd(Vl),lists:max(Vl)}),
+ Bytes2 = align(Bytes1),
+ chars_decode(Bytes2,NumBits,StringType,C,Len);
+ no ->
+ {Len,Bytes1} = decode_length(Bytes,undefined),
+ Bytes2 = align(Bytes1),
+ chars_decode(Bytes2,NumBits,StringType,C,Len);
+ {Lb,Ub}->
+ {Len,Bytes1} = decode_length(Bytes,{Lb,Ub}),
+ Bytes2 = align(Bytes1),
+ chars_decode(Bytes2,NumBits,StringType,C,Len)
+ end.
+
+
+encode_NumericString(C,Val) ->
+ encode_known_multiplier_string(aligned,'NumericString',C,false,Val).
+decode_NumericString(Bytes,C) ->
+ decode_known_multiplier_string(Bytes,aligned,'NumericString',C,false).
+
+encode_PrintableString(C,Val) ->
+ encode_known_multiplier_string(aligned,'PrintableString',C,false,Val).
+decode_PrintableString(Bytes,C) ->
+ decode_known_multiplier_string(Bytes,aligned,'PrintableString',C,false).
+
+encode_VisibleString(C,Val) -> % equivalent with ISO646String
+ encode_known_multiplier_string(aligned,'VisibleString',C,false,Val).
+decode_VisibleString(Bytes,C) ->
+ decode_known_multiplier_string(Bytes,aligned,'VisibleString',C,false).
+
+encode_IA5String(C,Val) ->
+ encode_known_multiplier_string(aligned,'IA5String',C,false,Val).
+decode_IA5String(Bytes,C) ->
+ decode_known_multiplier_string(Bytes,aligned,'IA5String',C,false).
+
+encode_BMPString(C,Val) ->
+ encode_known_multiplier_string(aligned,'BMPString',C,false,Val).
+decode_BMPString(Bytes,C) ->
+ decode_known_multiplier_string(Bytes,aligned,'BMPString',C,false).
+
+encode_UniversalString(C,Val) ->
+ encode_known_multiplier_string(aligned,'UniversalString',C,false,Val).
+decode_UniversalString(Bytes,C) ->
+ decode_known_multiplier_string(Bytes,aligned,'UniversalString',C,false).
+
+%% end of known-multiplier strings for which PER visible constraints are
+%% applied
+
+encode_GeneralString(_C,Val) ->
+ encode_restricted_string(aligned,Val).
+decode_GeneralString(Bytes,_C) ->
+ decode_restricted_string(Bytes,aligned).
+
+encode_GraphicString(_C,Val) ->
+ encode_restricted_string(aligned,Val).
+decode_GraphicString(Bytes,_C) ->
+ decode_restricted_string(Bytes,aligned).
+
+encode_ObjectDescriptor(_C,Val) ->
+ encode_restricted_string(aligned,Val).
+decode_ObjectDescriptor(Bytes) ->
+ decode_restricted_string(Bytes,aligned).
+
+encode_TeletexString(_C,Val) -> % equivalent with T61String
+ encode_restricted_string(aligned,Val).
+decode_TeletexString(Bytes,_C) ->
+ decode_restricted_string(Bytes,aligned).
+
+encode_VideotexString(_C,Val) ->
+ encode_restricted_string(aligned,Val).
+decode_VideotexString(Bytes,_C) ->
+ decode_restricted_string(Bytes,aligned).
+
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% getBMPChars(Bytes,Len) ->{BMPcharList,RemainingBytes}
+%%
+getBMPChars(Bytes,1) ->
+ {O1,Bytes2} = getbits(Bytes,8),
+ {O2,Bytes3} = getbits(Bytes2,8),
+ if
+ O1 == 0 ->
+ {[O2],Bytes3};
+ true ->
+ {[{0,0,O1,O2}],Bytes3}
+ end;
+getBMPChars(Bytes,Len) ->
+ getBMPChars(Bytes,Len,[]).
+
+getBMPChars(Bytes,0,Acc) ->
+ {lists:reverse(Acc),Bytes};
+getBMPChars(Bytes,Len,Acc) ->
+ {Octs,Bytes1} = getoctets_as_list(Bytes,2),
+ case Octs of
+ [0,O2] ->
+ getBMPChars(Bytes1,Len-1,[O2|Acc]);
+ [O1,O2]->
+ getBMPChars(Bytes1,Len-1,[{0,0,O1,O2}|Acc])
+ end.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% chars_encode(C,StringType,Value) -> ValueList
+%%
+%% encodes chars according to the per rules taking the constraint PermittedAlphabet
+%% into account.
+%% This function does only encode the value part and NOT the length
+
+chars_encode(C,StringType,Value) ->
+ case {StringType,get_constraint(C,'PermittedAlphabet')} of
+ {'UniversalString',{_,_Sv}} ->
+ exit({error,{asn1,{'not implemented',"UniversalString with PermittedAlphabet constraint"}}});
+ {'BMPString',{_,_Sv}} ->
+ exit({error,{asn1,{'not implemented',"BMPString with PermittedAlphabet constraint"}}});
+ _ ->
+ {NumBits,CharOutTab} = {get_NumBits(C,StringType),get_CharOutTab(C,StringType)},
+ chars_encode2(Value,NumBits,CharOutTab)
+ end.
+
+chars_encode2([H|T],NumBits,{Min,Max,notab}) when H =< Max, H >= Min ->
+ [{bits,NumBits,H-Min}|chars_encode2(T,NumBits,{Min,Max,notab})];
+chars_encode2([H|T],NumBits,{Min,Max,Tab}) when H =< Max, H >= Min ->
+ [{bits,NumBits,exit_if_false(H,element(H-Min+1,Tab))}|chars_encode2(T,NumBits,{Min,Max,Tab})];
+chars_encode2([{A,B,C,D}|T],NumBits,{Min,Max,notab}) ->
+ %% no value range check here (ought to be, but very expensive)
+% [{bits,NumBits,(A*B*C*D)-Min}|chars_encode2(T,NumBits,{Min,Max,notab})];
+ [{bits,NumBits,((((((A bsl 8)+B) bsl 8)+C) bsl 8)+D)-Min}|chars_encode2(T,NumBits,{Min,Max,notab})];
+chars_encode2([{A,B,C,D}|T],NumBits,{Min,Max,Tab}) ->
+ %% no value range check here (ought to be, but very expensive)
+% [{bits,NumBits,element((A*B*C*D)-Min,Tab)}|chars_encode2(T,NumBits,{Min,Max,notab})];
+ [{bits,NumBits,exit_if_false({A,B,C,D},element(((((((A bsl 8)+B) bsl 8)+C) bsl 8)+D)-Min,Tab))}|chars_encode2(T,NumBits,{Min,Max,notab})];
+chars_encode2([H|_T],_,{_,_,_}) ->
+ exit({error,{asn1,{illegal_char_value,H}}});
+chars_encode2([],_,_) ->
+ [].
+
+exit_if_false(V,false)->
+ exit({error,{asn1,{"illegal value according to Permitted alphabet constraint",V}}});
+exit_if_false(_,V) ->V.
+
+
+get_NumBits(C,StringType) ->
+ case get_constraint(C,'PermittedAlphabet') of
+ {'SingleValue',Sv} ->
+ charbits(length(Sv),aligned);
+ no ->
+ case StringType of
+ 'IA5String' ->
+ charbits(128,aligned); % 16#00..16#7F
+ 'VisibleString' ->
+ charbits(95,aligned); % 16#20..16#7E
+ 'PrintableString' ->
+ charbits(74,aligned); % [$\s,$',$(,$),$+,$,,$-,$.,$/,"0123456789",$:,$=,$?,$A..$Z,$a..$z
+ 'NumericString' ->
+ charbits(11,aligned); % $ ,"0123456789"
+ 'UniversalString' ->
+ 32;
+ 'BMPString' ->
+ 16
+ end
+ end.
+
+%%Maybe used later
+%%get_MaxChar(C,StringType) ->
+%% case get_constraint(C,'PermittedAlphabet') of
+%% {'SingleValue',Sv} ->
+%% lists:nth(length(Sv),Sv);
+%% no ->
+%% case StringType of
+%% 'IA5String' ->
+%% 16#7F; % 16#00..16#7F
+%% 'VisibleString' ->
+%% 16#7E; % 16#20..16#7E
+%% 'PrintableString' ->
+%% $z; % [$\s,$',$(,$),$+,$,,$-,$.,$/,"0123456789",$:,$=,$?,$A..$Z,$a..$z
+%% 'NumericString' ->
+%% $9; % $ ,"0123456789"
+%% 'UniversalString' ->
+%% 16#ffffffff;
+%% 'BMPString' ->
+%% 16#ffff
+%% end
+%% end.
+
+%%Maybe used later
+%%get_MinChar(C,StringType) ->
+%% case get_constraint(C,'PermittedAlphabet') of
+%% {'SingleValue',Sv} ->
+%% hd(Sv);
+%% no ->
+%% case StringType of
+%% 'IA5String' ->
+%% 16#00; % 16#00..16#7F
+%% 'VisibleString' ->
+%% 16#20; % 16#20..16#7E
+%% 'PrintableString' ->
+%% $\s; % [$\s,$',$(,$),$+,$,,$-,$.,$/,"0123456789",$:,$=,$?,$A..$Z,$a..$z
+%% 'NumericString' ->
+%% $\s; % $ ,"0123456789"
+%% 'UniversalString' ->
+%% 16#00;
+%% 'BMPString' ->
+%% 16#00
+%% end
+%% end.
+
+get_CharOutTab(C,StringType) ->
+ get_CharTab(C,StringType,out).
+
+get_CharInTab(C,StringType) ->
+ get_CharTab(C,StringType,in).
+
+get_CharTab(C,StringType,InOut) ->
+ case get_constraint(C,'PermittedAlphabet') of
+ {'SingleValue',Sv} ->
+ get_CharTab2(C,StringType,hd(Sv),lists:max(Sv),Sv,InOut);
+ no ->
+ case StringType of
+ 'IA5String' ->
+ {0,16#7F,notab};
+ 'VisibleString' ->
+ get_CharTab2(C,StringType,16#20,16#7F,notab,InOut);
+ 'PrintableString' ->
+ Chars = lists:sort(
+ " '()+,-./0123456789:=?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"),
+ get_CharTab2(C,StringType,hd(Chars),lists:max(Chars),Chars,InOut);
+ 'NumericString' ->
+ get_CharTab2(C,StringType,16#20,$9," 0123456789",InOut);
+ 'UniversalString' ->
+ {0,16#FFFFFFFF,notab};
+ 'BMPString' ->
+ {0,16#FFFF,notab}
+ end
+ end.
+
+get_CharTab2(C,StringType,Min,Max,Chars,InOut) ->
+ BitValMax = (1 bsl get_NumBits(C,StringType))-1,
+ if
+ Max =< BitValMax ->
+ {0,Max,notab};
+ true ->
+ case InOut of
+ out ->
+ {Min,Max,create_char_tab(Min,Chars)};
+ in ->
+ {Min,Max,list_to_tuple(Chars)}
+ end
+ end.
+
+create_char_tab(Min,L) ->
+ list_to_tuple(create_char_tab(Min,L,0)).
+create_char_tab(Min,[Min|T],V) ->
+ [V|create_char_tab(Min+1,T,V+1)];
+create_char_tab(_Min,[],_V) ->
+ [];
+create_char_tab(Min,L,V) ->
+ [false|create_char_tab(Min+1,L,V)].
+
+%% This very inefficient and should be moved to compiletime
+charbits(NumOfChars,aligned) ->
+ case charbits(NumOfChars) of
+ 1 -> 1;
+ 2 -> 2;
+ B when B =< 4 -> 4;
+ B when B =< 8 -> 8;
+ B when B =< 16 -> 16;
+ B when B =< 32 -> 32
+ end.
+
+charbits(NumOfChars) when NumOfChars =< 2 -> 1;
+charbits(NumOfChars) when NumOfChars =< 4 -> 2;
+charbits(NumOfChars) when NumOfChars =< 8 -> 3;
+charbits(NumOfChars) when NumOfChars =< 16 -> 4;
+charbits(NumOfChars) when NumOfChars =< 32 -> 5;
+charbits(NumOfChars) when NumOfChars =< 64 -> 6;
+charbits(NumOfChars) when NumOfChars =< 128 -> 7;
+charbits(NumOfChars) when NumOfChars =< 256 -> 8;
+charbits(NumOfChars) when NumOfChars =< 512 -> 9;
+charbits(NumOfChars) when NumOfChars =< 1024 -> 10;
+charbits(NumOfChars) when NumOfChars =< 2048 -> 11;
+charbits(NumOfChars) when NumOfChars =< 4096 -> 12;
+charbits(NumOfChars) when NumOfChars =< 8192 -> 13;
+charbits(NumOfChars) when NumOfChars =< 16384 -> 14;
+charbits(NumOfChars) when NumOfChars =< 32768 -> 15;
+charbits(NumOfChars) when NumOfChars =< 65536 -> 16;
+charbits(NumOfChars) when integer(NumOfChars) ->
+ 16 + charbits1(NumOfChars bsr 16).
+
+charbits1(0) ->
+ 0;
+charbits1(NumOfChars) ->
+ 1 + charbits1(NumOfChars bsr 1).
+
+
+chars_decode(Bytes,_,'BMPString',C,Len) ->
+ case get_constraint(C,'PermittedAlphabet') of
+ no ->
+ getBMPChars(Bytes,Len);
+ _ ->
+ exit({error,{asn1,
+ {'not implemented',
+ "BMPString with PermittedAlphabet constraint"}}})
+ end;
+chars_decode(Bytes,NumBits,StringType,C,Len) ->
+ CharInTab = get_CharInTab(C,StringType),
+ chars_decode2(Bytes,CharInTab,NumBits,Len).
+
+
+chars_decode2(Bytes,CharInTab,NumBits,Len) ->
+ chars_decode2(Bytes,CharInTab,NumBits,Len,[]).
+
+chars_decode2(Bytes,_CharInTab,_NumBits,0,Acc) ->
+ {lists:reverse(Acc),Bytes};
+chars_decode2(Bytes,{Min,Max,notab},NumBits,Len,Acc) when NumBits > 8 ->
+ {Char,Bytes2} = getbits(Bytes,NumBits),
+ Result =
+ if
+ Char < 256 -> Char;
+ true ->
+ list_to_tuple(binary_to_list(<<Char:32>>))
+ end,
+ chars_decode2(Bytes2,{Min,Max,notab},NumBits,Len -1,[Result|Acc]);
+% chars_decode2(Bytes,{Min,Max,notab},NumBits,Len,Acc) when NumBits > 8 ->
+% {Char,Bytes2} = getbits(Bytes,NumBits),
+% Result = case minimum_octets(Char+Min) of
+% [NewChar] -> NewChar;
+% [C1,C2] -> {0,0,C1,C2};
+% [C1,C2,C3] -> {0,C1,C2,C3};
+% [C1,C2,C3,C4] -> {C1,C2,C3,C4}
+% end,
+% chars_decode2(Bytes2,{Min,Max,notab},NumBits,Len -1,[Result|Acc]);
+chars_decode2(Bytes,{Min,Max,notab},NumBits,Len,Acc) ->
+ {Char,Bytes2} = getbits(Bytes,NumBits),
+ chars_decode2(Bytes2,{Min,Max,notab},NumBits,Len -1,[Char+Min|Acc]);
+
+%% BMPString and UniversalString with PermittedAlphabet is currently not supported
+chars_decode2(Bytes,{Min,Max,CharInTab},NumBits,Len,Acc) ->
+ {Char,Bytes2} = getbits(Bytes,NumBits),
+ chars_decode2(Bytes2,{Min,Max,CharInTab},NumBits,Len -1,[element(Char+1,CharInTab)|Acc]).
+
+
+ % X.691:17
+encode_null(_) -> []; % encodes to nothing
+encode_null({Name,Val}) when atom(Name) ->
+ encode_null(Val).
+
+decode_null(Bytes) ->
+ {'NULL',Bytes}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% encode_object_identifier(Val) -> CompleteList
+%% encode_object_identifier({Name,Val}) -> CompleteList
+%% Val -> {Int1,Int2,...,IntN} % N >= 2
+%% Name -> atom()
+%% Int1 -> integer(0..2)
+%% Int2 -> integer(0..39) when Int1 (0..1) else integer()
+%% Int3-N -> integer()
+%% CompleteList -> [{bits,8,Val}|{octets,Ol}|align|...]
+%%
+encode_object_identifier({Name,Val}) when atom(Name) ->
+ encode_object_identifier(Val);
+encode_object_identifier(Val) ->
+ OctetList = e_object_identifier(Val),
+ Octets = list_to_binary(OctetList), % performs a flatten at the same time
+ [{debug,object_identifier},encode_length(undefined,size(Octets)),{octets,Octets}].
+
+%% This code is copied from asn1_encode.erl (BER) and corrected and modified
+
+e_object_identifier({'OBJECT IDENTIFIER',V}) ->
+ e_object_identifier(V);
+e_object_identifier({Cname,V}) when atom(Cname),tuple(V) ->
+ e_object_identifier(tuple_to_list(V));
+e_object_identifier({Cname,V}) when atom(Cname),list(V) ->
+ e_object_identifier(V);
+e_object_identifier(V) when tuple(V) ->
+ e_object_identifier(tuple_to_list(V));
+
+%% E1 = 0|1|2 and (E2 < 40 when E1 = 0|1)
+e_object_identifier([E1,E2|Tail]) when E1 >= 0, E1 < 2, E2 < 40 ; E1==2 ->
+ Head = 40*E1 + E2, % weird
+ e_object_elements([Head|Tail],[]);
+e_object_identifier(Oid=[_,_|_Tail]) ->
+ exit({error,{asn1,{'illegal_value',Oid}}}).
+
+e_object_elements([],Acc) ->
+ lists:reverse(Acc);
+e_object_elements([H|T],Acc) ->
+ e_object_elements(T,[e_object_element(H)|Acc]).
+
+e_object_element(Num) when Num < 128 ->
+ Num;
+%% must be changed to handle more than 2 octets
+e_object_element(Num) -> %% when Num < ???
+ Left = ((Num band 2#11111110000000) bsr 7) bor 2#10000000,
+ Right = Num band 2#1111111 ,
+ [Left,Right].
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% decode_object_identifier(Bytes) -> {ObjId,RemainingBytes}
+%% ObjId -> {integer(),integer(),...} % at least 2 integers
+%% RemainingBytes -> [integer()] when integer() (0..255)
+decode_object_identifier(Bytes) ->
+ {Len,Bytes2} = decode_length(Bytes,undefined),
+ {Octs,Bytes3} = getoctets_as_list(Bytes2,Len),
+ [First|Rest] = dec_subidentifiers(Octs,0,[]),
+ Idlist = if
+ First < 40 ->
+ [0,First|Rest];
+ First < 80 ->
+ [1,First - 40|Rest];
+ true ->
+ [2,First - 80|Rest]
+ end,
+ {list_to_tuple(Idlist),Bytes3}.
+
+dec_subidentifiers([H|T],Av,Al) when H >=16#80 ->
+ dec_subidentifiers(T,(Av bsl 7) + (H band 16#7F),Al);
+dec_subidentifiers([H|T],Av,Al) ->
+ dec_subidentifiers(T,0,[(Av bsl 7) + H |Al]);
+dec_subidentifiers([],_Av,Al) ->
+ lists:reverse(Al).
+
+get_constraint([{Key,V}],Key) ->
+ V;
+get_constraint([],_Key) ->
+ no;
+get_constraint(C,Key) ->
+ case lists:keysearch(Key,1,C) of
+ false ->
+ no;
+ {value,{_,V}} ->
+ V
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% complete(InList) -> ByteList
+%% Takes a coded list with bits and bytes and converts it to a list of bytes
+%% Should be applied as the last step at encode of a complete ASN.1 type
+%%
+
+% complete(L) ->
+% case complete1(L) of
+% {[],0} ->
+% <<0>>;
+% {Acc,0} ->
+% lists:reverse(Acc);
+% {[Hacc|Tacc],Acclen} -> % Acclen >0
+% Rest = 8 - Acclen,
+% NewHacc = Hacc bsl Rest,
+% lists:reverse([NewHacc|Tacc])
+% end.
+
+
+% complete1(InList) when list(InList) ->
+% complete1(InList,[]);
+% complete1(InList) ->
+% complete1([InList],[]).
+
+% complete1([{debug,_}|T], Acc) ->
+% complete1(T,Acc);
+% complete1([H|T],Acc) when list(H) ->
+% {NewH,NewAcclen} = complete1(H,Acc),
+% complete1(T,NewH,NewAcclen);
+
+% complete1([{0,Bin}|T],Acc,0) when binary(Bin) ->
+% complete1(T,[Bin|Acc],0);
+% complete1([{Unused,Bin}|T],Acc,0) when integer(Unused),binary(Bin) ->
+% Size = size(Bin)-1,
+% <<Bs:Size/binary,B>> = Bin,
+% complete1(T,[(B bsr Unused),Bs|Acc],8-Unused);
+% complete1([{Unused,Bin}|T],[Hacc|Tacc],Acclen) when integer(Unused),binary(Bin) ->
+% Rest = 8 - Acclen,
+% Used = 8 - Unused,
+% case size(Bin) of
+% 1 ->
+% if
+% Rest >= Used ->
+% <<B:Used,_:Unused>> = Bin,
+% complete1(T,[(Hacc bsl Used) + B|Tacc],
+% (Acclen+Used) rem 8);
+% true ->
+% LeftOver = 8 - Rest - Unused,
+% <<Val2:Rest,Val1:LeftOver,_:Unused>> = Bin,
+% complete1(T,[Val1,(Hacc bsl Rest) + Val2|Tacc],
+% (Acclen+Used) rem 8)
+% end;
+% N ->
+% if
+% Rest == Used ->
+% N1 = N - 1,
+% <<B:Rest,Bs:N1/binary,_:Unused>> = Bin,
+% complete1(T,[Bs,(Hacc bsl Rest) + B|Tacc],0);
+% Rest > Used ->
+% N1 = N - 2,
+% N2 = (8 - Rest) + Used,
+% <<B1:Rest,Bytes:N1/binary,B2:N2,_:Unused>> = Bin,
+% complete1(T,[B2,Bytes,(Hacc bsl Rest) + B1|Tacc],
+% (Acclen + Used) rem 8);
+% true -> % Rest < Used
+% N1 = N - 1,
+% N2 = Used - Rest,
+% <<B1:Rest,Bytes:N1/binary,B2:N2,_:Unused>> = Bin,
+% complete1(T,[B2,Bytes,(Hacc bsl Rest) + B1|Tacc],
+% (Acclen + Used) rem 8)
+% end
+% end;
+
+% %complete1([{octets,N,Val}|T],Acc,Acclen) when N =< 4 ,integer(Val) ->
+% % complete1([{octets,<<Val:N/unit:8>>}|T],Acc,Acclen);
+% complete1([{octets,N,Val}|T],Acc,Acclen) when N =< 4 ,integer(Val) ->
+% Newval = case N of
+% 1 ->
+% Val4 = Val band 16#FF,
+% [Val4];
+% 2 ->
+% Val3 = (Val bsr 8) band 16#FF,
+% Val4 = Val band 16#FF,
+% [Val3,Val4];
+% 3 ->
+% Val2 = (Val bsr 16) band 16#FF,
+% Val3 = (Val bsr 8) band 16#FF,
+% Val4 = Val band 16#FF,
+% [Val2,Val3,Val4];
+% 4 ->
+% Val1 = (Val bsr 24) band 16#FF,
+% Val2 = (Val bsr 16) band 16#FF,
+% Val3 = (Val bsr 8) band 16#FF,
+% Val4 = Val band 16#FF,
+% [Val1,Val2,Val3,Val4]
+% end,
+% complete1([{octets,Newval}|T],Acc,Acclen);
+
+% complete1([{octets,Bin}|T],Acc,Acclen) when binary(Bin) ->
+% Rest = 8 - Acclen,
+% if
+% Rest == 8 ->
+% complete1(T,[Bin|Acc],0);
+% true ->
+% [Hacc|Tacc]=Acc,
+% complete1(T,[Bin, Hacc bsl Rest|Tacc],0)
+% end;
+
+% complete1([{octets,Oct}|T],Acc,Acclen) when list(Oct) ->
+% Rest = 8 - Acclen,
+% if
+% Rest == 8 ->
+% complete1(T,[list_to_binary(Oct)|Acc],0);
+% true ->
+% [Hacc|Tacc]=Acc,
+% complete1(T,[list_to_binary(Oct), Hacc bsl Rest|Tacc],0)
+% end;
+
+% complete1([{bit,Val}|T], Acc, Acclen) ->
+% complete1([{bits,1,Val}|T],Acc,Acclen);
+% complete1([{octet,Val}|T], Acc, Acclen) ->
+% complete1([{octets,1,Val}|T],Acc,Acclen);
+
+% complete1([{bits,N,Val}|T], Acc, 0) when N =< 8 ->
+% complete1(T,[Val|Acc],N);
+% complete1([{bits,N,Val}|T], [Hacc|Tacc], Acclen) when N =< 8 ->
+% Rest = 8 - Acclen,
+% if
+% Rest >= N ->
+% complete1(T,[(Hacc bsl N) + Val|Tacc],(Acclen+N) rem 8);
+% true ->
+% Diff = N - Rest,
+% NewHacc = (Hacc bsl Rest) + (Val bsr Diff),
+% Mask = element(Diff,{1,3,7,15,31,63,127,255}),
+% complete1(T,[(Val band Mask),NewHacc|Tacc],(Acclen+N) rem 8)
+% end;
+% complete1([{bits,N,Val}|T], Acc, Acclen) -> % N > 8
+% complete1([{bits,N-8,Val bsr 8},{bits,8,Val band 255}|T],Acc,Acclen);
+
+% complete1([align|T],Acc,0) ->
+% complete1(T,Acc,0);
+% complete1([align|T],[Hacc|Tacc],Acclen) ->
+% Rest = 8 - Acclen,
+% complete1(T,[Hacc bsl Rest|Tacc],0);
+% complete1([{octets,N,Val}|T],Acc,Acclen) when list(Val) -> % no security check here
+% complete1([{octets,Val}|T],Acc,Acclen);
+
+% complete1([],Acc,Acclen) ->
+% {Acc,Acclen}.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% complete(InList) -> ByteList
+%% Takes a coded list with bits and bytes and converts it to a list of bytes
+%% Should be applied as the last step at encode of a complete ASN.1 type
+%%
+
+complete(L) ->
+ case complete1(L) of
+ {[],[]} ->
+ <<0>>;
+ {Acc,[]} ->
+ Acc;
+ {Acc,Bacc} ->
+ [Acc|complete_bytes(Bacc)]
+ end.
+
+%% this function builds the ugly form of lists [E1|E2] to avoid having to reverse it at the end.
+%% this is done because it is efficient and that the result always will be sent on a port or
+%% converted by means of list_to_binary/1
+complete1(InList) when list(InList) ->
+ complete1(InList,[],[]);
+complete1(InList) ->
+ complete1([InList],[],[]).
+
+complete1([],Acc,Bacc) ->
+ {Acc,Bacc};
+complete1([H|T],Acc,Bacc) when list(H) ->
+ {NewH,NewBacc} = complete1(H,Acc,Bacc),
+ complete1(T,NewH,NewBacc);
+
+complete1([{octets,Bin}|T],Acc,[]) ->
+ complete1(T,[Acc|Bin],[]);
+
+complete1([{octets,Bin}|T],Acc,Bacc) ->
+ complete1(T,[Acc|[complete_bytes(Bacc),Bin]],[]);
+
+complete1([{debug,_}|T], Acc,Bacc) ->
+ complete1(T,Acc,Bacc);
+
+complete1([{bits,N,Val}|T],Acc,Bacc) ->
+ complete1(T,Acc,complete_update_byte(Bacc,Val,N));
+
+complete1([{bit,Val}|T],Acc,Bacc) ->
+ complete1(T,Acc,complete_update_byte(Bacc,Val,1));
+
+complete1([align|T],Acc,[]) ->
+ complete1(T,Acc,[]);
+complete1([align|T],Acc,Bacc) ->
+ complete1(T,[Acc|complete_bytes(Bacc)],[]);
+complete1([{0,Bin}|T],Acc,[]) when binary(Bin) ->
+ complete1(T,[Acc|Bin],[]);
+complete1([{Unused,Bin}|T],Acc,[]) when integer(Unused),binary(Bin) ->
+ Size = size(Bin)-1,
+ <<Bs:Size/binary,B>> = Bin,
+ NumBits = 8-Unused,
+ complete1(T,[Acc|Bs],[[B bsr Unused]|NumBits]);
+complete1([{Unused,Bin}|T],Acc,Bacc) when integer(Unused),binary(Bin) ->
+ Size = size(Bin)-1,
+ <<Bs:Size/binary,B>> = Bin,
+ NumBits = 8 - Unused,
+ Bf = complete_bytes(Bacc),
+ complete1(T,[Acc|[Bf,Bs]],[[B bsr Unused]|NumBits]).
+
+
+complete_update_byte([],Val,Len) ->
+ complete_update_byte([[0]|0],Val,Len);
+complete_update_byte([[Byte|Bacc]|NumBits],Val,Len) when NumBits + Len == 8 ->
+ [[0,((Byte bsl Len) + Val) band 255|Bacc]|0];
+complete_update_byte([[Byte|Bacc]|NumBits],Val,Len) when NumBits + Len > 8 ->
+ Rem = 8 - NumBits,
+ Rest = Len - Rem,
+ complete_update_byte([[0,((Byte bsl Rem) + (Val bsr Rest)) band 255 |Bacc]|0],Val,Rest);
+complete_update_byte([[Byte|Bacc]|NumBits],Val,Len) ->
+ [[((Byte bsl Len) + Val) band 255|Bacc]|NumBits+Len].
+
+
+complete_bytes([[_Byte|Bacc]|0]) ->
+ lists:reverse(Bacc);
+complete_bytes([[Byte|Bacc]|NumBytes]) ->
+ lists:reverse([(Byte bsl (8-NumBytes)) band 255|Bacc]);
+complete_bytes([]) ->
+ [].
+
+% complete_bytes(L) ->
+% complete_bytes1(lists:reverse(L),[],[],0,0).
+
+% complete_bytes1([H={V,B}|T],Acc,ReplyAcc,NumBits,NumFields) when ((NumBits+B) rem 8) == 0 ->
+% NewReplyAcc = [complete_bytes2([H|Acc],0)|ReplyAcc],
+% complete_bytes1(T,[],NewReplyAcc,0,0);
+% complete_bytes1([H={V,B}|T],Acc,ReplyAcc,NumBits,NumFields) when NumFields == 7; (NumBits+B) div 8 > 0 ->
+% Rem = (NumBits+B) rem 8,
+% NewReplyAcc = [complete_bytes2([{V bsr Rem,B - Rem}|Acc],0)|ReplyAcc],
+% complete_bytes1([{V,Rem}|T],[],NewReplyAcc,0,0);
+% complete_bytes1([H={V,B}|T],Acc,ReplyAcc,NumBits,NumFields) ->
+% complete_bytes1(T,[H|Acc],ReplyAcc,NumBits+B,NumFields+1);
+% complete_bytes1([],[],ReplyAcc,_,_) ->
+% lists:reverse(ReplyAcc);
+% complete_bytes1([],Acc,ReplyAcc,NumBits,_) ->
+% PadBits = case NumBits rem 8 of
+% 0 -> 0;
+% Rem -> 8 - Rem
+% end,
+% lists:reverse([complete_bytes2(Acc,PadBits)|ReplyAcc]).
+
+
+% complete_bytes2([{V1,B1}],PadBits) ->
+% <<V1:B1,0:PadBits>>;
+% complete_bytes2([{V2,B2},{V1,B1}],PadBits) ->
+% <<V1:B1,V2:B2,0:PadBits>>;
+% complete_bytes2([{V3,B3},{V2,B2},{V1,B1}],PadBits) ->
+% <<V1:B1,V2:B2,V3:B3,0:PadBits>>;
+% complete_bytes2([{V4,B4},{V3,B3},{V2,B2},{V1,B1}],PadBits) ->
+% <<V1:B1,V2:B2,V3:B3,V4:B4,0:PadBits>>;
+% complete_bytes2([{V5,B5},{V4,B4},{V3,B3},{V2,B2},{V1,B1}],PadBits) ->
+% <<V1:B1,V2:B2,V3:B3,V4:B4,V5:B5,0:PadBits>>;
+% complete_bytes2([{V6,B6},{V5,B5},{V4,B4},{V3,B3},{V2,B2},{V1,B1}],PadBits) ->
+% <<V1:B1,V2:B2,V3:B3,V4:B4,V5:B5,V6:B6,0:PadBits>>;
+% complete_bytes2([{V7,B7},{V6,B6},{V5,B5},{V4,B4},{V3,B3},{V2,B2},{V1,B1}],PadBits) ->
+% <<V1:B1,V2:B2,V3:B3,V4:B4,V5:B5,V6:B6,V7:B7,0:PadBits>>;
+% complete_bytes2([{V8,B8},{V7,B7},{V6,B6},{V5,B5},{V4,B4},{V3,B3},{V2,B2},{V1,B1}],PadBits) ->
+% <<V1:B1,V2:B2,V3:B3,V4:B4,V5:B5,V6:B6,V7:B7,V8:B8,0:PadBits>>.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_per_bin_rt2ct.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_per_bin_rt2ct.erl
new file mode 100644
index 0000000000..9f02ad4466
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_per_bin_rt2ct.erl
@@ -0,0 +1,2102 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1rt_per_bin_rt2ct.erl,v 1.1 2008/12/17 09:53:31 mikpe Exp $
+%%
+-module(asn1rt_per_bin_rt2ct).
+
+%% encoding / decoding of PER aligned
+
+-include("asn1_records.hrl").
+
+-export([dec_fixup/3, cindex/3, list_to_record/2]).
+-export([setchoiceext/1, setext/1, fixoptionals/3, fixextensions/2,
+ getext/1, getextension/2, skipextensions/3, getbit/1, getchoice/3 ]).
+-export([getoptionals/2, getoptionals2/2,
+ set_choice/3, encode_integer/2, encode_integer/3 ]).
+-export([decode_integer/2, decode_integer/3, encode_small_number/1,
+ decode_boolean/1, encode_length/2, decode_length/1, decode_length/2,
+ encode_small_length/1, decode_small_length/1,
+ decode_compact_bit_string/3]).
+-export([decode_enumerated/3,
+ encode_bit_string/3, decode_bit_string/3 ]).
+-export([encode_octet_string/2, decode_octet_string/2,
+ encode_null/1, decode_null/1,
+ encode_object_identifier/1, decode_object_identifier/1,
+ complete/1]).
+
+
+-export([encode_open_type/2, decode_open_type/2]).
+
+-export([%encode_UniversalString/2, decode_UniversalString/2,
+ %encode_PrintableString/2, decode_PrintableString/2,
+ encode_GeneralString/2, decode_GeneralString/2,
+ encode_GraphicString/2, decode_GraphicString/2,
+ encode_TeletexString/2, decode_TeletexString/2,
+ encode_VideotexString/2, decode_VideotexString/2,
+ %encode_VisibleString/2, decode_VisibleString/2,
+ %encode_BMPString/2, decode_BMPString/2,
+ %encode_IA5String/2, decode_IA5String/2,
+ %encode_NumericString/2, decode_NumericString/2,
+ encode_ObjectDescriptor/2, decode_ObjectDescriptor/1
+ ]).
+
+-export([decode_constrained_number/2,
+ decode_constrained_number/3,
+ decode_unconstrained_number/1,
+ decode_semi_constrained_number/2,
+ encode_unconstrained_number/1,
+ decode_constrained_number/4,
+ encode_octet_string/3,
+ decode_octet_string/3,
+ encode_known_multiplier_string/5,
+ decode_known_multiplier_string/5,
+ getoctets/2, getbits/2
+% start_drv/1,start_drv2/1,init_drv/1
+ ]).
+
+
+-export([eint_positive/1]).
+-export([pre_complete_bits/2]).
+
+-define('16K',16384).
+-define('32K',32768).
+-define('64K',65536).
+
+%%-define(nodriver,true).
+
+dec_fixup(Terms,Cnames,RemBytes) ->
+ dec_fixup(Terms,Cnames,RemBytes,[]).
+
+dec_fixup([novalue|T],[_Hc|Tc],RemBytes,Acc) ->
+ dec_fixup(T,Tc,RemBytes,Acc);
+dec_fixup([{_Name,novalue}|T],[_Hc|Tc],RemBytes,Acc) ->
+ dec_fixup(T,Tc,RemBytes,Acc);
+dec_fixup([H|T],[Hc|Tc],RemBytes,Acc) ->
+ dec_fixup(T,Tc,RemBytes,[{Hc,H}|Acc]);
+dec_fixup([],_Cnames,RemBytes,Acc) ->
+ {lists:reverse(Acc),RemBytes}.
+
+cindex(Ix,Val,Cname) ->
+ case element(Ix,Val) of
+ {Cname,Val2} -> Val2;
+ X -> X
+ end.
+
+%% converts a list to a record if necessary
+list_to_record(_,Tuple) when tuple(Tuple) ->
+ Tuple;
+list_to_record(Name,List) when list(List) ->
+ list_to_tuple([Name|List]).
+
+%%--------------------------------------------------------
+%% setchoiceext(InRootSet) -> [{bit,X}]
+%% X is set to 1 when InRootSet==false
+%% X is set to 0 when InRootSet==true
+%%
+setchoiceext(true) ->
+% [{debug,choiceext},{bits,1,0}];
+ [0];
+setchoiceext(false) ->
+% [{debug,choiceext},{bits,1,1}].
+ [1].
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% setext(true|false) -> CompleteList
+%%
+
+setext(false) ->
+% [{debug,ext},{bits,1,0}];
+ [0];
+setext(true) ->
+% [{debug,ext},{bits,1,1}];
+ [1].
+
+fixoptionals(OptList,_OptLength,Val) when tuple(Val) ->
+% Bits = fixoptionals(OptList,Val,0),
+% {Val,{bits,OptLength,Bits}};
+% {Val,[10,OptLength,Bits]};
+ {Val,fixoptionals(OptList,Val,[])};
+
+fixoptionals([],_,Acc) ->
+ %% Optbits
+ lists:reverse(Acc);
+fixoptionals([Pos|Ot],Val,Acc) ->
+ case element(Pos,Val) of
+% asn1_NOVALUE -> fixoptionals(Ot,Val,Acc bsl 1);
+% asn1_DEFAULT -> fixoptionals(Ot,Val,Acc bsl 1);
+% _ -> fixoptionals(Ot,Val,(Acc bsl 1) + 1)
+ asn1_NOVALUE -> fixoptionals(Ot,Val,[0|Acc]);
+ asn1_DEFAULT -> fixoptionals(Ot,Val,[0|Acc]);
+ _ -> fixoptionals(Ot,Val,[1|Acc])
+ end.
+
+
+getext(Bytes) when tuple(Bytes) ->
+ getbit(Bytes);
+getext(Bytes) when binary(Bytes) ->
+ getbit({0,Bytes});
+getext(Bytes) when list(Bytes) ->
+ getbit({0,Bytes}).
+
+getextension(0, Bytes) ->
+ {{},Bytes};
+getextension(1, Bytes) ->
+ {Len,Bytes2} = decode_small_length(Bytes),
+ {Blist, Bytes3} = getbits_as_list(Len,Bytes2),
+ {list_to_tuple(Blist),Bytes3}.
+
+fixextensions({ext,ExtPos,ExtNum},Val) ->
+ case fixextensions(ExtPos,ExtNum+ExtPos,Val,0) of
+ 0 -> [];
+ ExtBits ->
+% [encode_small_length(ExtNum),{bits,ExtNum,ExtBits}]
+% [encode_small_length(ExtNum),[10,ExtNum,ExtBits]]
+ [encode_small_length(ExtNum),pre_complete_bits(ExtNum,ExtBits)]
+ end.
+
+fixextensions(Pos,MaxPos,_,Acc) when Pos >= MaxPos ->
+ Acc;
+fixextensions(Pos,ExtPos,Val,Acc) ->
+ Bit = case catch(element(Pos+1,Val)) of
+ asn1_NOVALUE ->
+ 0;
+ asn1_NOEXTVALUE ->
+ 0;
+ {'EXIT',_} ->
+ 0;
+ _ ->
+ 1
+ end,
+ fixextensions(Pos+1,ExtPos,Val,(Acc bsl 1)+Bit).
+
+skipextensions(Bytes,Nr,ExtensionBitPattern) ->
+ case (catch element(Nr,ExtensionBitPattern)) of
+ 1 ->
+ {_,Bytes2} = decode_open_type(Bytes,[]),
+ skipextensions(Bytes2, Nr+1, ExtensionBitPattern);
+ 0 ->
+ skipextensions(Bytes, Nr+1, ExtensionBitPattern);
+ {'EXIT',_} -> % badarg, no more extensions
+ Bytes
+ end.
+
+
+getchoice(Bytes,1,0) -> % only 1 alternative is not encoded
+ {0,Bytes};
+getchoice(Bytes,_,1) ->
+ decode_small_number(Bytes);
+getchoice(Bytes,NumChoices,0) ->
+ decode_constrained_number(Bytes,{0,NumChoices-1}).
+
+%% old version kept for backward compatibility with generates from R7B01
+getoptionals(Bytes,NumOpt) ->
+ {Blist,Bytes1} = getbits_as_list(NumOpt,Bytes),
+ {list_to_tuple(Blist),Bytes1}.
+
+%% new version used in generates from r8b_patch/3 and later
+getoptionals2(Bytes,NumOpt) ->
+ {_,_} = getbits(Bytes,NumOpt).
+
+
+%% getbits_as_binary(Num,Bytes) -> {{Unused,BinBits},RestBytes},
+%% Num = integer(),
+%% Bytes = list() | tuple(),
+%% Unused = integer(),
+%% BinBits = binary(),
+%% RestBytes = tuple()
+getbits_as_binary(Num,Bytes) when binary(Bytes) ->
+ getbits_as_binary(Num,{0,Bytes});
+getbits_as_binary(0,Buffer) ->
+ {{0,<<>>},Buffer};
+getbits_as_binary(Num,{0,Bin}) when Num > 16 ->
+ Used = Num rem 8,
+ Pad = (8 - Used) rem 8,
+%% Nbytes = Num div 8,
+ <<Bits:Num,_:Pad,RestBin/binary>> = Bin,
+ {{Pad,<<Bits:Num,0:Pad>>},RestBin};
+getbits_as_binary(Num,Buffer={_Used,_Bin}) -> % Unaligned buffer
+ %% Num =< 16,
+ {Bits2,Buffer2} = getbits(Buffer,Num),
+ Pad = (8 - (Num rem 8)) rem 8,
+ {{Pad,<<Bits2:Num,0:Pad>>},Buffer2}.
+
+
+% integer_from_list(Int,[],BigInt) ->
+% BigInt;
+% integer_from_list(Int,[H|T],BigInt) when Int < 8 ->
+% (BigInt bsl Int) bor (H bsr (8-Int));
+% integer_from_list(Int,[H|T],BigInt) ->
+% integer_from_list(Int-8,T,(BigInt bsl 8) bor H).
+
+getbits_as_list(Num,Bytes) when binary(Bytes) ->
+ getbits_as_list(Num,{0,Bytes},[]);
+getbits_as_list(Num,Bytes) ->
+ getbits_as_list(Num,Bytes,[]).
+
+%% If buffer is empty and nothing more will be picked.
+getbits_as_list(0, B, Acc) ->
+ {lists:reverse(Acc),B};
+%% If first byte in buffer is full and at least one byte will be picked,
+%% then pick one byte.
+getbits_as_list(N,{0,Bin},Acc) when N >= 8 ->
+ <<B7:1,B6:1,B5:1,B4:1,B3:1,B2:1,B1:1,B0:1,Rest/binary>> = Bin,
+ getbits_as_list(N-8,{0,Rest},[B0,B1,B2,B3,B4,B5,B6,B7|Acc]);
+getbits_as_list(N,{Used,Bin},Acc) when N >= 4, Used =< 4 ->
+ NewUsed = Used + 4,
+ Rem = 8 - NewUsed,
+ <<_:Used,B3:1,B2:1,B1:1,B0:1,_:Rem, Rest/binary>> = Bin,
+ NewRest = case Rem of 0 -> Rest; _ -> Bin end,
+ getbits_as_list(N-4,{NewUsed rem 8,NewRest},[B0,B1,B2,B3|Acc]);
+getbits_as_list(N,{Used,Bin},Acc) when N >= 2, Used =< 6 ->
+ NewUsed = Used + 2,
+ Rem = 8 - NewUsed,
+ <<_:Used,B1:1,B0:1,_:Rem, Rest/binary>> = Bin,
+ NewRest = case Rem of 0 -> Rest; _ -> Bin end,
+ getbits_as_list(N-2,{NewUsed rem 8,NewRest},[B0,B1|Acc]);
+getbits_as_list(N,{Used,Bin},Acc) when Used =< 7 ->
+ NewUsed = Used + 1,
+ Rem = 8 - NewUsed,
+ <<_:Used,B0:1,_:Rem, Rest/binary>> = Bin,
+ NewRest = case Rem of 0 -> Rest; _ -> Bin end,
+ getbits_as_list(N-1,{NewUsed rem 8,NewRest},[B0|Acc]).
+
+
+getbit({7,<<_:7,B:1,Rest/binary>>}) ->
+ {B,{0,Rest}};
+getbit({0,Buffer = <<B:1,_:7,_/binary>>}) ->
+ {B,{1,Buffer}};
+getbit({Used,Buffer}) ->
+ Unused = (8 - Used) - 1,
+ <<_:Used,B:1,_:Unused,_/binary>> = Buffer,
+ {B,{Used+1,Buffer}};
+getbit(Buffer) when binary(Buffer) ->
+ getbit({0,Buffer}).
+
+
+getbits({0,Buffer},Num) when (Num rem 8) == 0 ->
+ <<Bits:Num,Rest/binary>> = Buffer,
+ {Bits,{0,Rest}};
+getbits({Used,Bin},Num) ->
+ NumPlusUsed = Num + Used,
+ NewUsed = NumPlusUsed rem 8,
+ Unused = (8-NewUsed) rem 8,
+ case Unused of
+ 0 ->
+ <<_:Used,Bits:Num,Rest/binary>> = Bin,
+ {Bits,{0,Rest}};
+ _ ->
+ Bytes = NumPlusUsed div 8,
+ <<_:Used,Bits:Num,_:Unused,_/binary>> = Bin,
+ <<_:Bytes/binary,Rest/binary>> = Bin,
+ {Bits,{NewUsed,Rest}}
+ end;
+getbits(Bin,Num) when binary(Bin) ->
+ getbits({0,Bin},Num).
+
+
+
+% getoctet(Bytes) when list(Bytes) ->
+% getoctet({0,Bytes});
+% getoctet(Bytes) ->
+% %% io:format("getoctet:Buffer = ~p~n",[Bytes]),
+% getoctet1(Bytes).
+
+% getoctet1({0,[H|T]}) ->
+% {H,{0,T}};
+% getoctet1({Pos,[_,H|T]}) ->
+% {H,{0,T}}.
+
+align({0,L}) ->
+ {0,L};
+align({_Pos,<<_H,T/binary>>}) ->
+ {0,T};
+align(Bytes) ->
+ {0,Bytes}.
+
+%% First align buffer, then pick the first Num octets.
+%% Returns octets as an integer with bit significance as in buffer.
+getoctets({0,Buffer},Num) ->
+ <<Val:Num/integer-unit:8,RestBin/binary>> = Buffer,
+ {Val,{0,RestBin}};
+getoctets({U,<<_Padding,Rest/binary>>},Num) when U /= 0 ->
+ getoctets({0,Rest},Num);
+getoctets(Buffer,Num) when binary(Buffer) ->
+ getoctets({0,Buffer},Num).
+% getoctets(Buffer,Num) ->
+% %% io:format("getoctets:Buffer = ~p~nNum = ~p~n",[Buffer,Num]),
+% getoctets(Buffer,Num,0).
+
+% getoctets(Buffer,0,Acc) ->
+% {Acc,Buffer};
+% getoctets(Buffer,Num,Acc) ->
+% {Oct,NewBuffer} = getoctet(Buffer),
+% getoctets(NewBuffer,Num-1,(Acc bsl 8)+Oct).
+
+% getoctets_as_list(Buffer,Num) ->
+% getoctets_as_list(Buffer,Num,[]).
+
+% getoctets_as_list(Buffer,0,Acc) ->
+% {lists:reverse(Acc),Buffer};
+% getoctets_as_list(Buffer,Num,Acc) ->
+% {Oct,NewBuffer} = getoctet(Buffer),
+% getoctets_as_list(NewBuffer,Num-1,[Oct|Acc]).
+
+%% First align buffer, then pick the first Num octets.
+%% Returns octets as a binary
+getoctets_as_bin({0,Bin},Num)->
+ <<Octets:Num/binary,RestBin/binary>> = Bin,
+ {Octets,{0,RestBin}};
+getoctets_as_bin({_U,Bin},Num) ->
+ <<_Padding,Octets:Num/binary,RestBin/binary>> = Bin,
+ {Octets,{0,RestBin}};
+getoctets_as_bin(Bin,Num) when binary(Bin) ->
+ getoctets_as_bin({0,Bin},Num).
+
+%% same as above but returns octets as a List
+getoctets_as_list(Buffer,Num) ->
+ {Bin,Buffer2} = getoctets_as_bin(Buffer,Num),
+ {binary_to_list(Bin),Buffer2}.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% set_choice(Alt,Choices,Altnum) -> ListofBitSettings
+%% Alt = atom()
+%% Altnum = integer() | {integer(),integer()}% number of alternatives
+%% Choices = [atom()] | {[atom()],[atom()]}
+%% When Choices is a tuple the first list is the Rootset and the
+%% second is the Extensions and then Altnum must also be a tuple with the
+%% lengths of the 2 lists
+%%
+set_choice(Alt,{L1,L2},{Len1,_Len2}) ->
+ case set_choice_tag(Alt,L1) of
+ N when integer(N), Len1 > 1 ->
+% [{bits,1,0}, % the value is in the root set
+% encode_constrained_number({0,Len1-1},N)];
+ [0, % the value is in the root set
+ encode_constrained_number({0,Len1-1},N)];
+ N when integer(N) ->
+% [{bits,1,0}]; % no encoding if only 0 or 1 alternative
+ [0]; % no encoding if only 0 or 1 alternative
+ false ->
+% [{bits,1,1}, % extension value
+ [1, % extension value
+ case set_choice_tag(Alt,L2) of
+ N2 when integer(N2) ->
+ encode_small_number(N2);
+ false ->
+ unknown_choice_alt
+ end]
+ end;
+set_choice(Alt,L,Len) ->
+ case set_choice_tag(Alt,L) of
+ N when integer(N), Len > 1 ->
+ encode_constrained_number({0,Len-1},N);
+ N when integer(N) ->
+ []; % no encoding if only 0 or 1 alternative
+ false ->
+ [unknown_choice_alt]
+ end.
+
+set_choice_tag(Alt,Choices) ->
+ set_choice_tag(Alt,Choices,0).
+
+set_choice_tag(Alt,[Alt|_Rest],Tag) ->
+ Tag;
+set_choice_tag(Alt,[_H|Rest],Tag) ->
+ set_choice_tag(Alt,Rest,Tag+1);
+set_choice_tag(_Alt,[],_Tag) ->
+ false.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% decode_fragmented_XXX; decode of values encoded fragmented according
+%% to ITU-T X.691 clause 10.9.3.8. The unit (XXX) is either bits, octets,
+%% characters or number of components (in a choice,sequence or similar).
+%% Buffer is a buffer {Used, Bin}.
+%% C is the constrained length.
+%% If the buffer is not aligned, this function does that.
+decode_fragmented_bits({0,Buffer},C) ->
+ decode_fragmented_bits(Buffer,C,[]);
+decode_fragmented_bits({_N,<<_B,Bs/binary>>},C) ->
+ decode_fragmented_bits(Bs,C,[]).
+
+decode_fragmented_bits(<<3:2,Len:6,Bin/binary>>,C,Acc) ->
+ {Value,Bin2} = split_binary(Bin, Len * ?'16K'),
+ decode_fragmented_bits(Bin2,C,[Value,Acc]);
+decode_fragmented_bits(<<0:1,0:7,Bin/binary>>,C,Acc) ->
+ BinBits = list_to_binary(lists:reverse(Acc)),
+ case C of
+ Int when integer(Int),C == size(BinBits) ->
+ {BinBits,{0,Bin}};
+ Int when integer(Int) ->
+ exit({error,{asn1,{illegal_value,C,BinBits}}});
+ _ ->
+ {BinBits,{0,Bin}}
+ end;
+decode_fragmented_bits(<<0:1,Len:7,Bin/binary>>,C,Acc) ->
+ Result = {BinBits,{Used,_Rest}} =
+ case (Len rem 8) of
+ 0 ->
+ <<Value:Len/binary-unit:1,Bin2/binary>> = Bin,
+ {list_to_binary(lists:reverse([Value|Acc])),{0,Bin2}};
+ Rem ->
+ Bytes = Len div 8,
+ U = 8 - Rem,
+ <<Value:Bytes/binary-unit:8,Bits1:Rem,Bits2:U,Bin2/binary>> = Bin,
+ {list_to_binary(lists:reverse([Bits1 bsl U,Value|Acc])),
+ {Rem,<<Bits2,Bin2/binary>>}}
+ end,
+ case C of
+ Int when integer(Int),C == (size(BinBits) - ((8 - Used) rem 8)) ->
+ Result;
+ Int when integer(Int) ->
+ exit({error,{asn1,{illegal_value,C,BinBits}}});
+ _ ->
+ Result
+ end.
+
+
+decode_fragmented_octets({0,Bin},C) ->
+ decode_fragmented_octets(Bin,C,[]);
+decode_fragmented_octets({_N,<<_B,Bs/binary>>},C) ->
+ decode_fragmented_octets(Bs,C,[]).
+
+decode_fragmented_octets(<<3:2,Len:6,Bin/binary>>,C,Acc) ->
+ {Value,Bin2} = split_binary(Bin,Len * ?'16K'),
+ decode_fragmented_octets(Bin2,C,[Value,Acc]);
+decode_fragmented_octets(<<0:1,0:7,Bin/binary>>,C,Acc) ->
+ Octets = list_to_binary(lists:reverse(Acc)),
+ case C of
+ Int when integer(Int), C == size(Octets) ->
+ {Octets,{0,Bin}};
+ Int when integer(Int) ->
+ exit({error,{asn1,{illegal_value,C,Octets}}});
+ _ ->
+ {Octets,{0,Bin}}
+ end;
+decode_fragmented_octets(<<0:1,Len:7,Bin/binary>>,C,Acc) ->
+ <<Value:Len/binary-unit:8,Bin2/binary>> = Bin,
+ BinOctets = list_to_binary(lists:reverse([Value|Acc])),
+ case C of
+ Int when integer(Int),size(BinOctets) == Int ->
+ {BinOctets,Bin2};
+ Int when integer(Int) ->
+ exit({error,{asn1,{illegal_value,C,BinOctets}}});
+ _ ->
+ {BinOctets,Bin2}
+ end.
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% encode_open_type(Constraint, Value) -> CompleteList
+%% Value = list of bytes of an already encoded value (the list must be flat)
+%% | binary
+%% Contraint = not used in this version
+%%
+encode_open_type(_Constraint, Val) when list(Val) ->
+ Bin = list_to_binary(Val),
+ case size(Bin) of
+ Size when Size>255 ->
+ [encode_length(undefined,Size),[21,<<Size:16>>,Bin]];
+ Size ->
+ [encode_length(undefined,Size),[20,Size,Bin]]
+ end;
+% [encode_length(undefined,size(Bin)),{octets,Bin}]; % octets implies align
+encode_open_type(_Constraint, Val) when binary(Val) ->
+% [encode_length(undefined,size(Val)),{octets,Val}]. % octets implies align
+ case size(Val) of
+ Size when Size>255 ->
+ [encode_length(undefined,size(Val)),[21,<<Size:16>>,Val]]; % octets implies align
+ Size ->
+ [encode_length(undefined,Size),[20,Size,Val]]
+ end.
+%% the binary_to_list is not optimal but compatible with the current solution
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% decode_open_type(Buffer,Constraint) -> Value
+%% Constraint is not used in this version
+%% Buffer = [byte] with PER encoded data
+%% Value = [byte] with decoded data (which must be decoded again as some type)
+%%
+decode_open_type(Bytes, _Constraint) ->
+ {Len,Bytes2} = decode_length(Bytes,undefined),
+ getoctets_as_bin(Bytes2,Len).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% encode_integer(Constraint,Value,NamedNumberList) -> CompleteList
+%% encode_integer(Constraint,Value) -> CompleteList
+%% encode_integer(Constraint,{Name,Value}) -> CompleteList
+%%
+%%
+encode_integer(C,V,NamedNumberList) when atom(V) ->
+ case lists:keysearch(V,1,NamedNumberList) of
+ {value,{_,NewV}} ->
+ encode_integer(C,NewV);
+ _ ->
+ exit({error,{asn1,{namednumber,V}}})
+ end;
+encode_integer(C,V,_NamedNumberList) when integer(V) ->
+ encode_integer(C,V);
+encode_integer(C,{Name,V},NamedNumberList) when atom(Name) ->
+ encode_integer(C,V,NamedNumberList).
+
+encode_integer(C,{Name,Val}) when atom(Name) ->
+ encode_integer(C,Val);
+
+encode_integer([{Rc,_Ec}],Val) when tuple(Rc) -> % XXX when is this invoked? First argument most often a list,...Ok this is the extension case...but it doesn't work.
+ case (catch encode_integer([Rc],Val)) of
+ {'EXIT',{error,{asn1,_}}} ->
+% [{bits,1,1},encode_unconstrained_number(Val)];
+ [1,encode_unconstrained_number(Val)];
+ Encoded ->
+% [{bits,1,0},Encoded]
+ [0,Encoded]
+ end;
+
+encode_integer([],Val) ->
+ encode_unconstrained_number(Val);
+%% The constraint is the effective constraint, and in this case is a number
+encode_integer([{'SingleValue',V}],V) ->
+ [];
+encode_integer([{'ValueRange',VR={Lb,Ub},Range,PreEnc}],Val) when Val >= Lb,
+ Ub >= Val ->
+ %% this case when NamedNumberList
+ encode_constrained_number(VR,Range,PreEnc,Val);
+encode_integer([{'ValueRange',{Lb,'MAX'}}],Val) ->
+ encode_semi_constrained_number(Lb,Val);
+encode_integer([{'ValueRange',{'MIN',_}}],Val) ->
+ encode_unconstrained_number(Val);
+encode_integer([{'ValueRange',VR={_Lb,_Ub}}],Val) ->
+ encode_constrained_number(VR,Val);
+encode_integer(_,Val) ->
+ exit({error,{asn1,{illegal_value,Val}}}).
+
+
+
+decode_integer(Buffer,Range,NamedNumberList) ->
+ {Val,Buffer2} = decode_integer(Buffer,Range),
+ case lists:keysearch(Val,2,NamedNumberList) of
+ {value,{NewVal,_}} -> {NewVal,Buffer2};
+ _ -> {Val,Buffer2}
+ end.
+
+decode_integer(Buffer,[{Rc,_Ec}]) when tuple(Rc) ->
+ {Ext,Buffer2} = getext(Buffer),
+ case Ext of
+ 0 -> decode_integer(Buffer2,[Rc]);
+ 1 -> decode_unconstrained_number(Buffer2)
+ end;
+decode_integer(Buffer,undefined) ->
+ decode_unconstrained_number(Buffer);
+decode_integer(Buffer,C) ->
+ case get_constraint(C,'SingleValue') of
+ V when integer(V) ->
+ {V,Buffer};
+ _ ->
+ decode_integer1(Buffer,C)
+ end.
+
+decode_integer1(Buffer,C) ->
+ case VR = get_constraint(C,'ValueRange') of
+ no ->
+ decode_unconstrained_number(Buffer);
+ {Lb, 'MAX'} ->
+ decode_semi_constrained_number(Buffer,Lb);
+ {_Lb,_Ub} ->
+ decode_constrained_number(Buffer,VR)
+ end.
+
+%% X.691:10.6 Encoding of a normally small non-negative whole number
+%% Use this for encoding of CHOICE index if there is an extension marker in
+%% the CHOICE
+encode_small_number({Name,Val}) when atom(Name) ->
+ encode_small_number(Val);
+encode_small_number(Val) when Val =< 63 ->
+% [{bits,1,0},{bits,6,Val}];
+% [{bits,7,Val}]; % same as above but more efficient
+ [10,7,Val]; % same as above but more efficient
+encode_small_number(Val) ->
+% [{bits,1,1},encode_semi_constrained_number(0,Val)].
+ [1,encode_semi_constrained_number(0,Val)].
+
+decode_small_number(Bytes) ->
+ {Bit,Bytes2} = getbit(Bytes),
+ case Bit of
+ 0 ->
+ getbits(Bytes2,6);
+ 1 ->
+ decode_semi_constrained_number(Bytes2,0)
+ end.
+
+%% X.691:10.7 Encoding of a semi-constrained whole number
+%% might be an optimization encode_semi_constrained_number(0,Val) ->
+encode_semi_constrained_number(C,{Name,Val}) when atom(Name) ->
+ encode_semi_constrained_number(C,Val);
+encode_semi_constrained_number({Lb,'MAX'},Val) ->
+ encode_semi_constrained_number(Lb,Val);
+encode_semi_constrained_number(Lb,Val) ->
+ Val2 = Val - Lb,
+ Oct = eint_positive(Val2),
+ Len = length(Oct),
+ if
+ Len < 128 ->
+ %{octets,[Len|Oct]}; % equiv with encode_length(undefined,Len) but faster
+ [20,Len+1,[Len|Oct]];
+ Len < 256 ->
+ [encode_length(undefined,Len),[20,Len,Oct]];
+ true ->
+ [encode_length(undefined,Len),[21,<<Len:16>>,Oct]]
+ end.
+
+decode_semi_constrained_number(Bytes,{Lb,_}) ->
+ decode_semi_constrained_number(Bytes,Lb);
+decode_semi_constrained_number(Bytes,Lb) ->
+ {Len,Bytes2} = decode_length(Bytes,undefined),
+ {V,Bytes3} = getoctets(Bytes2,Len),
+ {V+Lb,Bytes3}.
+
+encode_constrained_number({Lb,_Ub},_Range,{bits,N},Val) ->
+ Val2 = Val-Lb,
+% {bits,N,Val2};
+ [10,N,Val2];
+encode_constrained_number({Lb,_Ub},_Range,{octets,N},Val) when N < 256->
+ %% N is 8 or 16 (1 or 2 octets)
+ Val2 = Val-Lb,
+% {octets,<<Val2:N/unit:8>>};
+ [20,N,Val2];
+encode_constrained_number({Lb,_Ub},_Range,{octets,N},Val) -> % N>255
+ %% N is 8 or 16 (1 or 2 octets)
+ Val2 = Val-Lb,
+% {octets,<<Val2:N/unit:8>>};
+ [21,<<N:16>>,Val2];
+encode_constrained_number({Lb,_Ub},Range,_,Val) ->
+ Val2 = Val-Lb,
+ if
+ Range =< 16#1000000 -> % max 3 octets
+ Octs = eint_positive(Val2),
+% [encode_length({1,3},size(Octs)),{octets,Octs}];
+ L = length(Octs),
+ [encode_length({1,3},L),[20,L,Octs]];
+ Range =< 16#100000000 -> % max 4 octets
+ Octs = eint_positive(Val2),
+% [encode_length({1,4},size(Octs)),{octets,Octs}];
+ L = length(Octs),
+ [encode_length({1,4},L),[20,L,Octs]];
+ Range =< 16#10000000000 -> % max 5 octets
+ Octs = eint_positive(Val2),
+% [encode_length({1,5},size(Octs)),{octets,Octs}];
+ L = length(Octs),
+ [encode_length({1,5},L),[20,L,Octs]];
+ true ->
+ exit({not_supported,{integer_range,Range}})
+ end.
+
+encode_constrained_number(Range,{Name,Val}) when atom(Name) ->
+ encode_constrained_number(Range,Val);
+encode_constrained_number({Lb,Ub},Val) when Val >= Lb, Ub >= Val ->
+ Range = Ub - Lb + 1,
+ Val2 = Val - Lb,
+ if
+ Range == 2 ->
+% Size = {bits,1,Val2};
+ [Val2];
+ Range =< 4 ->
+% Size = {bits,2,Val2};
+ [10,2,Val2];
+ Range =< 8 ->
+ [10,3,Val2];
+ Range =< 16 ->
+ [10,4,Val2];
+ Range =< 32 ->
+ [10,5,Val2];
+ Range =< 64 ->
+ [10,6,Val2];
+ Range =< 128 ->
+ [10,7,Val2];
+ Range =< 255 ->
+ [10,8,Val2];
+ Range =< 256 ->
+% Size = {octets,[Val2]};
+ [20,1,Val2];
+ Range =< 65536 ->
+% Size = {octets,<<Val2:16>>};
+ [20,2,<<Val2:16>>];
+ Range =< 16#1000000 ->
+ Octs = eint_positive(Val2),
+% [{bits,2,length(Octs)-1},{octets,Octs}];
+ Len = length(Octs),
+ [10,2,Len-1,20,Len,Octs];
+ Range =< 16#100000000 ->
+ Octs = eint_positive(Val2),
+ Len = length(Octs),
+ [10,2,Len-1,20,Len,Octs];
+ Range =< 16#10000000000 ->
+ Octs = eint_positive(Val2),
+ Len = length(Octs),
+ [10,3,Len-1,20,Len,Octs];
+ true ->
+ exit({not_supported,{integer_range,Range}})
+ end;
+encode_constrained_number({_,_},Val) ->
+ exit({error,{asn1,{illegal_value,Val}}}).
+
+decode_constrained_number(Buffer,VR={Lb,Ub}) ->
+ Range = Ub - Lb + 1,
+ decode_constrained_number(Buffer,VR,Range).
+
+decode_constrained_number(Buffer,{Lb,_Ub},_Range,{bits,N}) ->
+ {Val,Remain} = getbits(Buffer,N),
+ {Val+Lb,Remain};
+decode_constrained_number(Buffer,{Lb,_Ub},_Range,{octets,N}) ->
+ {Val,Remain} = getoctets(Buffer,N),
+ {Val+Lb,Remain}.
+
+decode_constrained_number(Buffer,{Lb,_Ub},Range) ->
+ % Val2 = Val - Lb,
+ {Val,Remain} =
+ if
+ Range == 2 ->
+ getbits(Buffer,1);
+ Range =< 4 ->
+ getbits(Buffer,2);
+ Range =< 8 ->
+ getbits(Buffer,3);
+ Range =< 16 ->
+ getbits(Buffer,4);
+ Range =< 32 ->
+ getbits(Buffer,5);
+ Range =< 64 ->
+ getbits(Buffer,6);
+ Range =< 128 ->
+ getbits(Buffer,7);
+ Range =< 255 ->
+ getbits(Buffer,8);
+ Range =< 256 ->
+ getoctets(Buffer,1);
+ Range =< 65536 ->
+ getoctets(Buffer,2);
+ Range =< 16#1000000 ->
+ {Len,Bytes2} = decode_length(Buffer,{1,3}),
+ {Octs,Bytes3} = getoctets_as_list(Bytes2,Len),
+ {dec_pos_integer(Octs),Bytes3};
+ Range =< 16#100000000 ->
+ {Len,Bytes2} = decode_length(Buffer,{1,4}),
+ {Octs,Bytes3} = getoctets_as_list(Bytes2,Len),
+ {dec_pos_integer(Octs),Bytes3};
+ Range =< 16#10000000000 ->
+ {Len,Bytes2} = decode_length(Buffer,{1,5}),
+ {Octs,Bytes3} = getoctets_as_list(Bytes2,Len),
+ {dec_pos_integer(Octs),Bytes3};
+ true ->
+ exit({not_supported,{integer_range,Range}})
+ end,
+ {Val+Lb,Remain}.
+
+%% X.691:10.8 Encoding of an unconstrained whole number
+
+encode_unconstrained_number(Val) when Val >= 0 ->
+ Oct = eint(Val,[]),
+ Len = length(Oct),
+ if
+ Len < 128 ->
+ %{octets,[Len|Oct]}; % equiv with encode_length(undefined,Len) but faster
+ [20,Len+1,[Len|Oct]];
+ Len < 256 ->
+% [encode_length(undefined,Len),20,Len,Oct];
+ [20,Len+2,<<2:2,Len:14>>,Oct];% equiv with encode_length(undefined,Len) but faster
+ true ->
+% [encode_length(undefined,Len),{octets,Oct}]
+ [encode_length(undefined,Len),[21,<<Len:16>>,Oct]]
+ end;
+encode_unconstrained_number(Val) -> % negative
+ Oct = enint(Val,[]),
+ Len = length(Oct),
+ if
+ Len < 128 ->
+% {octets,[Len|Oct]}; % equiv with encode_length(undefined,Len) but faster
+ [20,Len+1,[Len|Oct]];% equiv with encode_length(undefined,Len) but faster
+ Len < 256 ->
+% [encode_length(undefined,Len),20,Len,Oct];
+ [20,Len+2,<<2:2,Len:14>>,Oct];% equiv with encode_length(undefined,Len) but faster
+ true ->
+ %[encode_length(undefined,Len),{octets,Oct}]
+ [encode_length(undefined,Len),[21,<<Len:16>>,Oct]]
+ end.
+
+
+%% used for positive Values which don't need a sign bit
+%% returns a list
+eint_positive(Val) ->
+ case eint(Val,[]) of
+ [0,B1|T] ->
+ [B1|T];
+ T ->
+ T
+ end.
+
+
+eint(0, [B|Acc]) when B < 128 ->
+ [B|Acc];
+eint(N, Acc) ->
+ eint(N bsr 8, [N band 16#ff| Acc]).
+
+enint(-1, [B1|T]) when B1 > 127 ->
+ [B1|T];
+enint(N, Acc) ->
+ enint(N bsr 8, [N band 16#ff|Acc]).
+
+decode_unconstrained_number(Bytes) ->
+ {Len,Bytes2} = decode_length(Bytes,undefined),
+ {Ints,Bytes3} = getoctets_as_list(Bytes2,Len),
+ {dec_integer(Ints),Bytes3}.
+
+dec_pos_integer(Ints) ->
+ decpint(Ints, 8 * (length(Ints) - 1)).
+dec_integer(Ints) when hd(Ints) band 255 =< 127 -> %% Positive number
+ decpint(Ints, 8 * (length(Ints) - 1));
+dec_integer(Ints) -> %% Negative
+ decnint(Ints, 8 * (length(Ints) - 1)).
+
+decpint([Byte|Tail], Shift) ->
+ (Byte bsl Shift) bor decpint(Tail, Shift-8);
+decpint([], _) -> 0.
+
+decnint([Byte|Tail], Shift) ->
+ (-128 + (Byte band 127) bsl Shift) bor decpint(Tail, Shift-8).
+
+% minimum_octets(Val) ->
+% minimum_octets(Val,[]).
+
+% minimum_octets(Val,Acc) when Val > 0 ->
+% minimum_octets((Val bsr 8),[Val band 16#FF|Acc]);
+% minimum_octets(0,Acc) ->
+% Acc.
+
+
+%% X.691:10.9 Encoding of a length determinant
+%%encode_small_length(undefined,Len) -> % null means no UpperBound
+%% encode_small_number(Len).
+
+%% X.691:10.9.3.5
+%% X.691:10.9.3.7
+encode_length(undefined,Len) -> % un-constrained
+ if
+ Len < 128 ->
+% {octets,[Len]};
+ [20,1,Len];
+ Len < 16384 ->
+ %{octets,<<2:2,Len:14>>};
+ [20,2,<<2:2,Len:14>>];
+ true -> % should be able to endode length >= 16384 i.e. fragmented length
+ exit({error,{asn1,{encode_length,{nyi,above_16k}}}})
+ end;
+
+encode_length({0,'MAX'},Len) ->
+ encode_length(undefined,Len);
+encode_length(Vr={Lb,Ub},Len) when Ub =< 65535 ,Lb >= 0 -> % constrained
+ encode_constrained_number(Vr,Len);
+encode_length({Lb,_Ub},Len) when integer(Lb), Lb >= 0 -> % Ub > 65535
+ encode_length(undefined,Len);
+encode_length({Vr={Lb,Ub},[]},Len) when Ub =< 65535 ,Lb >= 0,Len=<Ub ->
+ %% constrained extensible
+% [{bits,1,0},encode_constrained_number(Vr,Len)];
+ [0,encode_constrained_number(Vr,Len)];
+encode_length({{Lb,_},[]},Len) ->
+ [1,encode_semi_constrained_number(Lb,Len)];
+encode_length(SingleValue,_Len) when integer(SingleValue) ->
+ [].
+
+%% X.691 10.9.3.4 (only used for length of bitmap that prefixes extension
+%% additions in a sequence or set
+encode_small_length(Len) when Len =< 64 ->
+%% [{bits,1,0},{bits,6,Len-1}];
+% {bits,7,Len-1}; % the same as above but more efficient
+ [10,7,Len-1];
+encode_small_length(Len) ->
+% [{bits,1,1},encode_length(undefined,Len)].
+ [1,encode_length(undefined,Len)].
+
+% decode_small_length({Used,<<_:Used,0:1,Num:6,_:((8-Used+1) rem 8),Rest/binary>>}) ->
+% case Buffer of
+% <<_:Used,0:1,Num:6,_:((8-Used+1) rem 8),Rest/binary>> ->
+% {Num,
+% case getbit(Buffer) of
+% {0,Remain} ->
+% {Bits,Remain2} = getbits(Remain,6),
+% {Bits+1,Remain2};
+% {1,Remain} ->
+% decode_length(Remain,undefined)
+% end.
+
+decode_small_length(Buffer) ->
+ case getbit(Buffer) of
+ {0,Remain} ->
+ {Bits,Remain2} = getbits(Remain,6),
+ {Bits+1,Remain2};
+ {1,Remain} ->
+ decode_length(Remain,undefined)
+ end.
+
+decode_length(Buffer) ->
+ decode_length(Buffer,undefined).
+
+decode_length(Buffer,undefined) -> % un-constrained
+ {0,Buffer2} = align(Buffer),
+ case Buffer2 of
+ <<0:1,Oct:7,Rest/binary>> ->
+ {Oct,{0,Rest}};
+ <<2:2,Val:14,Rest/binary>> ->
+ {Val,{0,Rest}};
+ <<3:2,_Val:14,_Rest/binary>> ->
+ %% this case should be fixed
+ exit({error,{asn1,{decode_length,{nyi,above_16k}}}})
+ end;
+%% {Bits,_} = getbits(Buffer2,2),
+% case Bits of
+% 2 ->
+% {Val,Bytes3} = getoctets(Buffer2,2),
+% {(Val band 16#3FFF),Bytes3};
+% 3 ->
+% exit({error,{asn1,{decode_length,{nyi,above_16k}}}});
+% _ ->
+% {Val,Bytes3} = getoctet(Buffer2),
+% {Val band 16#7F,Bytes3}
+% end;
+
+decode_length(Buffer,{Lb,Ub}) when Ub =< 65535 ,Lb >= 0 -> % constrained
+ decode_constrained_number(Buffer,{Lb,Ub});
+decode_length(_Buffer,{Lb,_Ub}) when integer(Lb), Lb >= 0 -> % Ub > 65535
+ exit({error,{asn1,{decode_length,{nyi,above_64K}}}});
+decode_length(Buffer,{{Lb,Ub},[]}) ->
+ case getbit(Buffer) of
+ {0,Buffer2} ->
+ decode_length(Buffer2, {Lb,Ub})
+ end;
+
+
+%When does this case occur with {_,_Lb,Ub} ??
+% X.691:10.9.3.5
+decode_length({Used,Bin},{_,_Lb,_Ub}) -> %when Len =< 127 -> % Unconstrained or large Ub NOTE! this case does not cover case when Ub > 65535
+ Unused = (8-Used) rem 8,
+ case Bin of
+ <<_:Used,0:1,Val:7,R:Unused,Rest/binary>> ->
+ {Val,{Used,<<R,Rest/binary>>}};
+ <<_:Used,_:Unused,2:2,Val:14,Rest/binary>> ->
+ {Val, {0,Rest}};
+ <<_:Used,_:Unused,3:2,_:14,_Rest/binary>> ->
+ exit({error,{asn1,{decode_length,{nyi,length_above_64K}}}})
+ end;
+% decode_length(Buffer,{_,_Lb,Ub}) -> %when Len =< 127 -> % Unconstrained or large Ub
+% case getbit(Buffer) of
+% {0,Remain} ->
+% getbits(Remain,7);
+% {1,Remain} ->
+% {Val,Remain2} = getoctets(Buffer,2),
+% {Val band 2#0111111111111111, Remain2}
+% end;
+decode_length(Buffer,SingleValue) when integer(SingleValue) ->
+ {SingleValue,Buffer}.
+
+
+ % X.691:11
+decode_boolean(Buffer) -> %when record(Buffer,buffer)
+ case getbit(Buffer) of
+ {1,Remain} -> {true,Remain};
+ {0,Remain} -> {false,Remain}
+ end.
+
+
+%% ENUMERATED with extension marker
+decode_enumerated(Buffer,C,{Ntup1,Ntup2}) when tuple(Ntup1), tuple(Ntup2) ->
+ {Ext,Buffer2} = getext(Buffer),
+ case Ext of
+ 0 -> % not an extension value
+ {Val,Buffer3} = decode_integer(Buffer2,C),
+ case catch (element(Val+1,Ntup1)) of
+ NewVal when atom(NewVal) -> {NewVal,Buffer3};
+ _Error -> exit({error,{asn1,{decode_enumerated,{Val,[Ntup1,Ntup2]}}}})
+ end;
+ 1 -> % this an extension value
+ {Val,Buffer3} = decode_small_number(Buffer2),
+ case catch (element(Val+1,Ntup2)) of
+ NewVal when atom(NewVal) -> {NewVal,Buffer3};
+ _ -> {{asn1_enum,Val},Buffer3}
+ end
+ end;
+
+decode_enumerated(Buffer,C,NamedNumberTup) when tuple(NamedNumberTup) ->
+ {Val,Buffer2} = decode_integer(Buffer,C),
+ case catch (element(Val+1,NamedNumberTup)) of
+ NewVal when atom(NewVal) -> {NewVal,Buffer2};
+ _Error -> exit({error,{asn1,{decode_enumerated,{Val,NamedNumberTup}}}})
+ end.
+
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+%% Bitstring value, ITU_T X.690 Chapter 8.5
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+
+%%===============================================================================
+%% encode bitstring value
+%%===============================================================================
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% bitstring NamedBitList
+%% Val can be of:
+%% - [identifiers] where only named identifers are set to one,
+%% the Constraint must then have some information of the
+%% bitlength.
+%% - [list of ones and zeroes] all bits
+%% - integer value representing the bitlist
+%% C is constraint Len, only valid when identifiers
+
+
+%% when the value is a list of {Unused,BinBits}, where
+%% Unused = integer(),
+%% BinBits = binary().
+
+encode_bit_string(C,Bin={Unused,BinBits},NamedBitList) when integer(Unused),
+ binary(BinBits) ->
+ encode_bin_bit_string(C,Bin,NamedBitList);
+
+%% when the value is a list of named bits
+
+encode_bit_string(C, LoNB=[FirstVal | _RestVal], NamedBitList) when atom(FirstVal) ->
+ ToSetPos = get_all_bitposes(LoNB, NamedBitList, []),
+ BitList = make_and_set_list(ToSetPos,0),
+ encode_bit_string(C,BitList,NamedBitList);% consider the constraint
+
+encode_bit_string(C, BL=[{bit,_} | _RestVal], NamedBitList) ->
+ ToSetPos = get_all_bitposes(BL, NamedBitList, []),
+ BitList = make_and_set_list(ToSetPos,0),
+ encode_bit_string(C,BitList,NamedBitList);
+
+%% when the value is a list of ones and zeroes
+encode_bit_string(Int, BitListValue, _)
+ when list(BitListValue),integer(Int) ->
+ %% The type is constrained by a single value size constraint
+ [40,Int,length(BitListValue),BitListValue];
+% encode_bit_string(C, BitListValue,NamedBitList)
+% when list(BitListValue) ->
+% [encode_bit_str_length(C,BitListValue),
+% 2,45,BitListValue];
+encode_bit_string(no, BitListValue,[])
+ when list(BitListValue) ->
+ [encode_length(undefined,length(BitListValue)),
+ 2,BitListValue];
+encode_bit_string(C, BitListValue,[])
+ when list(BitListValue) ->
+ [encode_length(C,length(BitListValue)),
+ 2,BitListValue];
+encode_bit_string(no, BitListValue,_NamedBitList)
+ when list(BitListValue) ->
+ %% this case with an unconstrained BIT STRING can be made more efficient
+ %% if the complete driver can take a special code so the length field
+ %% is encoded there.
+ NewBitLVal = lists:reverse(lists:dropwhile(fun(0)->true;(1)->false end,
+ lists:reverse(BitListValue))),
+ [encode_length(undefined,length(NewBitLVal)),
+ 2,NewBitLVal];
+encode_bit_string(C,BitListValue,_NamedBitList)
+ when list(BitListValue) ->% C = {_,'MAX'}
+% NewBitLVal = lists:reverse(lists:dropwhile(fun(0)->true;(1)->false end,
+% lists:reverse(BitListValue))),
+ NewBitLVal = bit_string_trailing_zeros(BitListValue,C),
+ [encode_length(C,length(NewBitLVal)),
+ 2,NewBitLVal];
+
+% encode_bit_string(C, BitListValue, NamedBitList) when list(BitListValue) ->
+% BitListToBinary =
+% %% fun that transforms a list of 1 and 0 to a tuple:
+% %% {UnusedBitsInLastByte, Binary}
+% fun([H|T],Acc,N,Fun) ->
+% Fun(T,(Acc bsl 1)+H,N+1,Fun);
+% ([],Acc,N,_) -> % length fits in one byte
+% Unused = (8 - (N rem 8)) rem 8,
+% % case N/8 of
+% % _Len =< 255 ->
+% % [30,Unused,(Unused+N)/8,<<Acc:N,0:Unused>>];
+% % _Len ->
+% % Len = (Unused+N)/8,
+% % [31,Unused,<<Len:16>>,<<Acc:N,0:Unused>>]
+% % end
+% {Unused,<<Acc:N,0:Unused>>}
+% end,
+% UnusedAndBin =
+% case NamedBitList of
+% [] -> % dont remove trailing zeroes
+% BitListToBinary(BitListValue,0,0,BitListToBinary);
+% _ ->
+% BitListToBinary(lists:reverse(
+% lists:dropwhile(fun(0)->true;(1)->false end,
+% lists:reverse(BitListValue))),
+% 0,0,BitListToBinary)
+% end,
+% encode_bin_bit_string(C,UnusedAndBin,NamedBitList);
+
+%% when the value is an integer
+encode_bit_string(C, IntegerVal, NamedBitList) when integer(IntegerVal)->
+ BitList = int_to_bitlist(IntegerVal),
+ encode_bit_string(C,BitList,NamedBitList);
+
+%% when the value is a tuple
+encode_bit_string(C,{Name,Val}, NamedBitList) when atom(Name) ->
+ encode_bit_string(C,Val,NamedBitList).
+
+bit_string_trailing_zeros(BitList,C) when integer(C) ->
+ bit_string_trailing_zeros1(BitList,C,C);
+bit_string_trailing_zeros(BitList,{Lb,Ub}) when integer(Lb) ->
+ bit_string_trailing_zeros1(BitList,Lb,Ub);
+bit_string_trailing_zeros(BitList,{{Lb,Ub},_}) when integer(Lb) ->
+ bit_string_trailing_zeros1(BitList,Lb,Ub);
+bit_string_trailing_zeros(BitList,_) ->
+ BitList.
+
+bit_string_trailing_zeros1(BitList,Lb,Ub) ->
+ case length(BitList) of
+ Lb -> BitList;
+ B when B<Lb -> BitList++lists:duplicate(Lb-B,0);
+ D -> F = fun(L,LB,LB,_,_)->lists:reverse(L);
+ ([0|R],L1,LB,UB,Fun)->Fun(R,L1-1,LB,UB,Fun);
+ (L,L1,_,UB,_)when L1 =< UB -> lists:reverse(L);
+ (_,_L1,_,_,_) ->exit({error,{list_length_BIT_STRING,
+ BitList}}) end,
+ F(lists:reverse(BitList),D,Lb,Ub,F)
+ end.
+
+%% encode_bin_bit_string/3, when value is a tuple of Unused and BinBits.
+%% Unused = integer(),i.e. number unused bits in least sign. byte of
+%% BinBits = binary().
+encode_bin_bit_string(C,{_,BinBits},_NamedBitList)
+ when integer(C),C=<16 ->
+ [45,C,size(BinBits),BinBits];
+encode_bin_bit_string(C,{_Unused,BinBits},_NamedBitList)
+ when integer(C) ->
+ [2,45,C,size(BinBits),BinBits];
+encode_bin_bit_string(C,UnusedAndBin={_,_},NamedBitList) ->
+% UnusedAndBin1 = {Unused1,Bin1} =
+ {Unused1,Bin1} =
+ %% removes all trailing bits if NamedBitList is not empty
+ remove_trailing_bin(NamedBitList,UnusedAndBin),
+ case C of
+% case get_constraint(C,'SizeConstraint') of
+
+% 0 ->
+% []; % borde avg�ras i compile-time
+% V when integer(V),V=<16 ->
+% {Unused2,Bin2} = pad_list(V,UnusedAndBin1),
+% <<BitVal:V,_:Unused2>> = Bin2,
+% % {bits,V,BitVal};
+% [10,V,BitVal];
+% V when integer(V) ->
+% %[align, pad_list(V, UnusedAndBin1)];
+% {Unused2,Bin2} = pad_list(V, UnusedAndBin1),
+% <<BitVal:V,_:Unused2>> = Bin2,
+% [2,octets_unused_to_complete(Unused2,size(Bin2),Bin2)];
+
+ {Lb,Ub} when integer(Lb),integer(Ub) ->
+% [encode_length({Lb,Ub},size(Bin1)*8 - Unused1),
+% align,UnusedAndBin1];
+ Size=size(Bin1),
+ [encode_length({Lb,Ub},Size*8 - Unused1),
+ 2,octets_unused_to_complete(Unused1,Size,Bin1)];
+ no ->
+ Size=size(Bin1),
+ [encode_length(undefined,Size*8 - Unused1),
+ 2,octets_unused_to_complete(Unused1,Size,Bin1)];
+ Sc ->
+ Size=size(Bin1),
+ [encode_length(Sc,Size*8 - Unused1),
+ 2,octets_unused_to_complete(Unused1,Size,Bin1)]
+ end.
+
+remove_trailing_bin([], {Unused,Bin}) ->
+ {Unused,Bin};
+remove_trailing_bin(NamedNumberList, {_Unused,Bin}) ->
+ Size = size(Bin)-1,
+ <<Bfront:Size/binary, LastByte:8>> = Bin,
+ %% clear the Unused bits to be sure
+% LastByte1 = LastByte band (((1 bsl Unused) -1) bxor 255),% why this???
+ Unused1 = trailingZeroesInNibble(LastByte band 15),
+ Unused2 =
+ case Unused1 of
+ 4 ->
+ 4 + trailingZeroesInNibble(LastByte bsr 4);
+ _ -> Unused1
+ end,
+ case Unused2 of
+ 8 ->
+ remove_trailing_bin(NamedNumberList,{0,Bfront});
+ _ ->
+ {Unused2,Bin}
+ end.
+
+
+trailingZeroesInNibble(0) ->
+ 4;
+trailingZeroesInNibble(1) ->
+ 0;
+trailingZeroesInNibble(2) ->
+ 1;
+trailingZeroesInNibble(3) ->
+ 0;
+trailingZeroesInNibble(4) ->
+ 2;
+trailingZeroesInNibble(5) ->
+ 0;
+trailingZeroesInNibble(6) ->
+ 1;
+trailingZeroesInNibble(7) ->
+ 0;
+trailingZeroesInNibble(8) ->
+ 3;
+trailingZeroesInNibble(9) ->
+ 0;
+trailingZeroesInNibble(10) ->
+ 1;
+trailingZeroesInNibble(11) ->
+ 0;
+trailingZeroesInNibble(12) -> %#1100
+ 2;
+trailingZeroesInNibble(13) ->
+ 0;
+trailingZeroesInNibble(14) ->
+ 1;
+trailingZeroesInNibble(15) ->
+ 0.
+
+%%%%%%%%%%%%%%%
+%% The result is presented as a list of named bits (if possible)
+%% else as a tuple {Unused,Bits}. Unused is the number of unused
+%% bits, least significant bits in the last byte of Bits. Bits is
+%% the BIT STRING represented as a binary.
+%%
+decode_compact_bit_string(Buffer, C, NamedNumberList) ->
+ case get_constraint(C,'SizeConstraint') of
+ 0 -> % fixed length
+ {{8,0},Buffer};
+ V when integer(V),V=<16 -> %fixed length 16 bits or less
+ compact_bit_string(Buffer,V,NamedNumberList);
+ V when integer(V),V=<65536 -> %fixed length > 16 bits
+ Bytes2 = align(Buffer),
+ compact_bit_string(Bytes2,V,NamedNumberList);
+ V when integer(V) -> % V > 65536 => fragmented value
+ {Bin,Buffer2} = decode_fragmented_bits(Buffer,V),
+ case Buffer2 of
+ {0,_} -> {{0,Bin},Buffer2};
+ {U,_} -> {{8-U,Bin},Buffer2}
+ end;
+ {Lb,Ub} when integer(Lb),integer(Ub) ->
+ %% This case may demand decoding of fragmented length/value
+ {Len,Bytes2} = decode_length(Buffer,{Lb,Ub}),
+ Bytes3 = align(Bytes2),
+ compact_bit_string(Bytes3,Len,NamedNumberList);
+ no ->
+ %% This case may demand decoding of fragmented length/value
+ {Len,Bytes2} = decode_length(Buffer,undefined),
+ Bytes3 = align(Bytes2),
+ compact_bit_string(Bytes3,Len,NamedNumberList);
+ Sc ->
+ {Len,Bytes2} = decode_length(Buffer,Sc),
+ Bytes3 = align(Bytes2),
+ compact_bit_string(Bytes3,Len,NamedNumberList)
+ end.
+
+
+%%%%%%%%%%%%%%%
+%% The result is presented as a list of named bits (if possible)
+%% else as a list of 0 and 1.
+%%
+decode_bit_string(Buffer, C, NamedNumberList) ->
+ case get_constraint(C,'SizeConstraint') of
+ {Lb,Ub} when integer(Lb),integer(Ub) ->
+ {Len,Bytes2} = decode_length(Buffer,{Lb,Ub}),
+ Bytes3 = align(Bytes2),
+ bit_list_or_named(Bytes3,Len,NamedNumberList);
+ no ->
+ {Len,Bytes2} = decode_length(Buffer,undefined),
+ Bytes3 = align(Bytes2),
+ bit_list_or_named(Bytes3,Len,NamedNumberList);
+ 0 -> % fixed length
+ {[],Buffer}; % nothing to encode
+ V when integer(V),V=<16 -> % fixed length 16 bits or less
+ bit_list_or_named(Buffer,V,NamedNumberList);
+ V when integer(V),V=<65536 ->
+ Bytes2 = align(Buffer),
+ bit_list_or_named(Bytes2,V,NamedNumberList);
+ V when integer(V) ->
+ Bytes2 = align(Buffer),
+ {BinBits,_Bytes3} = decode_fragmented_bits(Bytes2,V),
+ bit_list_or_named(BinBits,V,NamedNumberList);
+ Sc -> % extension marker
+ {Len,Bytes2} = decode_length(Buffer,Sc),
+ Bytes3 = align(Bytes2),
+ bit_list_or_named(Bytes3,Len,NamedNumberList)
+ end.
+
+
+%% if no named bits are declared we will return a
+%% {Unused,Bits}. Unused = integer(),
+%% Bits = binary().
+compact_bit_string(Buffer,Len,[]) ->
+ getbits_as_binary(Len,Buffer); % {{Unused,BinBits},NewBuffer}
+compact_bit_string(Buffer,Len,NamedNumberList) ->
+ bit_list_or_named(Buffer,Len,NamedNumberList).
+
+
+%% if no named bits are declared we will return a
+%% BitList = [0 | 1]
+
+bit_list_or_named(Buffer,Len,[]) ->
+ getbits_as_list(Len,Buffer);
+
+%% if there are named bits declared we will return a named
+%% BitList where the names are atoms and unnamed bits represented
+%% as {bit,Pos}
+%% BitList = [atom() | {bit,Pos}]
+%% Pos = integer()
+
+bit_list_or_named(Buffer,Len,NamedNumberList) ->
+ {BitList,Rest} = getbits_as_list(Len,Buffer),
+ {bit_list_or_named1(0,BitList,NamedNumberList,[]), Rest}.
+
+bit_list_or_named1(Pos,[0|Bt],Names,Acc) ->
+ bit_list_or_named1(Pos+1,Bt,Names,Acc);
+bit_list_or_named1(Pos,[1|Bt],Names,Acc) ->
+ case lists:keysearch(Pos,2,Names) of
+ {value,{Name,_}} ->
+ bit_list_or_named1(Pos+1,Bt,Names,[Name|Acc]);
+ _ ->
+ bit_list_or_named1(Pos+1,Bt,Names,[{bit,Pos}|Acc])
+ end;
+bit_list_or_named1(_Pos,[],_Names,Acc) ->
+ lists:reverse(Acc).
+
+
+
+%%%%%%%%%%%%%%%
+%%
+
+int_to_bitlist(Int) when integer(Int), Int > 0 ->
+ [Int band 1 | int_to_bitlist(Int bsr 1)];
+int_to_bitlist(0) ->
+ [].
+
+
+%%%%%%%%%%%%%%%%%%
+%% get_all_bitposes([list of named bits to set], named_bit_db, []) ->
+%% [sorted_list_of_bitpositions_to_set]
+
+get_all_bitposes([{bit,ValPos}|Rest], NamedBitList, Ack) ->
+ get_all_bitposes(Rest, NamedBitList, [ValPos | Ack ]);
+
+get_all_bitposes([Val | Rest], NamedBitList, Ack) ->
+ case lists:keysearch(Val, 1, NamedBitList) of
+ {value, {_ValName, ValPos}} ->
+ get_all_bitposes(Rest, NamedBitList, [ValPos | Ack]);
+ _ ->
+ exit({error,{asn1, {bitstring_namedbit, Val}}})
+ end;
+get_all_bitposes([], _NamedBitList, Ack) ->
+ lists:sort(Ack).
+
+%%%%%%%%%%%%%%%%%%
+%% make_and_set_list([list of positions to set to 1])->
+%% returns list with all in SetPos set.
+%% in positioning in list the first element is 0, the second 1 etc.., but
+%%
+
+make_and_set_list([XPos|SetPos], XPos) ->
+ [1 | make_and_set_list(SetPos, XPos + 1)];
+make_and_set_list([Pos|SetPos], XPos) ->
+ [0 | make_and_set_list([Pos | SetPos], XPos + 1)];
+make_and_set_list([], _) ->
+ [].
+
+%%%%%%%%%%%%%%%%%
+%% pad_list(N,BitList) -> PaddedList
+%% returns a padded (with trailing {bit,0} elements) list of length N
+%% if Bitlist contains more than N significant bits set an exit asn1_error
+%% is generated
+
+% pad_list(N,In={Unused,Bin}) ->
+% pad_list(N, size(Bin)*8 - Unused, In).
+
+% pad_list(N,Size,In={Unused,Bin}) when N < Size ->
+% exit({error,{asn1,{range_error,{bit_string,In}}}});
+% pad_list(N,Size,{Unused,Bin}) when N > Size, Unused > 0 ->
+% pad_list(N,Size+1,{Unused-1,Bin});
+% pad_list(N,Size,{Unused,Bin}) when N > Size ->
+% pad_list(N,Size+1,{7,<<Bin/binary,0>>});
+% pad_list(N,N,In={Unused,Bin}) ->
+% In.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% X.691:16
+%% encode_octet_string(Constraint,ExtensionMarker,Val)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+encode_octet_string(C,Val) ->
+ encode_octet_string(C,false,Val).
+
+encode_octet_string(C,Bool,{_Name,Val}) ->
+ encode_octet_string(C,Bool,Val);
+encode_octet_string(_C,true,_Val) ->
+ exit({error,{asn1,{'not_supported',extensionmarker}}});
+encode_octet_string(SZ={_,_},false,Val) ->
+% [encode_length(SZ,length(Val)),align,
+% {octets,Val}];
+ Len = length(Val),
+ [encode_length(SZ,Len),2,
+ octets_to_complete(Len,Val)];
+encode_octet_string(SZ,false,Val) when list(SZ) ->
+ Len = length(Val),
+ [encode_length({hd(SZ),lists:max(SZ)},Len),2,
+ octets_to_complete(Len,Val)];
+encode_octet_string(no,false,Val) ->
+ Len = length(Val),
+ [encode_length(undefined,Len),2,
+ octets_to_complete(Len,Val)];
+encode_octet_string(C,_,_) ->
+ exit({error,{not_implemented,C}}).
+
+
+decode_octet_string(Bytes,Range) ->
+ decode_octet_string(Bytes,Range,false).
+
+decode_octet_string(Bytes,1,false) ->
+ {B1,Bytes2} = getbits(Bytes,8),
+ {[B1],Bytes2};
+decode_octet_string(Bytes,2,false) ->
+ {Bs,Bytes2}= getbits(Bytes,16),
+ {binary_to_list(<<Bs:16>>),Bytes2};
+decode_octet_string(Bytes,Sv,false) when integer(Sv),Sv=<65535 ->
+ Bytes2 = align(Bytes),
+ getoctets_as_list(Bytes2,Sv);
+decode_octet_string(Bytes,Sv,false) when integer(Sv) ->
+ Bytes2 = align(Bytes),
+ decode_fragmented_octets(Bytes2,Sv);
+decode_octet_string(Bytes,{Lb,Ub},false) ->
+ {Len,Bytes2} = decode_length(Bytes,{Lb,Ub}),
+ Bytes3 = align(Bytes2),
+ getoctets_as_list(Bytes3,Len);
+decode_octet_string(Bytes,Sv,false) when list(Sv) ->
+ {Len,Bytes2} = decode_length(Bytes,{hd(Sv),lists:max(Sv)}),
+ Bytes3 = align(Bytes2),
+ getoctets_as_list(Bytes3,Len);
+decode_octet_string(Bytes,no,false) ->
+ {Len,Bytes2} = decode_length(Bytes,undefined),
+ Bytes3 = align(Bytes2),
+ getoctets_as_list(Bytes3,Len).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Restricted char string types
+%% (NumericString, PrintableString,VisibleString,IA5String,BMPString,UniversalString)
+%% X.691:26 and X.680:34-36
+%%encode_restricted_string(aligned,'BMPString',Constraints,Extension,Val)
+
+
+encode_restricted_string(aligned,{Name,Val}) when atom(Name) ->
+ encode_restricted_string(aligned,Val);
+
+encode_restricted_string(aligned,Val) when list(Val)->
+ Len = length(Val),
+% [encode_length(undefined,length(Val)),{octets,Val}].
+ [encode_length(undefined,Len),octets_to_complete(Len,Val)].
+
+
+encode_known_multiplier_string(StringType,SizeC,NumBits,CharOutTab,{Name,Val}) when atom(Name) ->
+ encode_known_multiplier_string(StringType,SizeC,NumBits,CharOutTab,Val);
+encode_known_multiplier_string(StringType,SizeC,NumBits,CharOutTab,Val) ->
+ Result = chars_encode2(Val,NumBits,CharOutTab),
+ case SizeC of
+ Ub when integer(Ub), Ub*NumBits =< 16 ->
+ case {StringType,Result} of
+ {'BMPString',{octets,Ol}} -> %% this case cannot happen !!??
+ [{bits,8,Oct}||Oct <- Ol];
+ _ ->
+ Result
+ end;
+ Ub when integer(Ub),Ub =<65535 -> % fixed length
+%% [align,Result];
+ [2,Result];
+ {Ub,Lb} ->
+% [encode_length({Ub,Lb},length(Val)),align,Result];
+ [encode_length({Ub,Lb},length(Val)),2,Result];
+ no ->
+% [encode_length(undefined,length(Val)),align,Result]
+ [encode_length(undefined,length(Val)),2,Result]
+ end.
+
+decode_restricted_string(Bytes,aligned) ->
+ {Len,Bytes2} = decode_length(Bytes,undefined),
+ getoctets_as_list(Bytes2,Len).
+
+decode_known_multiplier_string(StringType,SizeC,NumBits,CharInTab,Bytes) ->
+ case SizeC of
+ Ub when integer(Ub), Ub*NumBits =< 16 ->
+ chars_decode(Bytes,NumBits,StringType,CharInTab,Ub);
+ Ub when integer(Ub),Ub =<65535 -> % fixed length
+ Bytes1 = align(Bytes),
+ chars_decode(Bytes1,NumBits,StringType,CharInTab,Ub);
+ Vl when list(Vl) ->
+ {Len,Bytes1} = decode_length(Bytes,{hd(Vl),lists:max(Vl)}),
+ Bytes2 = align(Bytes1),
+ chars_decode(Bytes2,NumBits,StringType,CharInTab,Len);
+ no ->
+ {Len,Bytes1} = decode_length(Bytes,undefined),
+ Bytes2 = align(Bytes1),
+ chars_decode(Bytes2,NumBits,StringType,CharInTab,Len);
+ {Lb,Ub}->
+ {Len,Bytes1} = decode_length(Bytes,{Lb,Ub}),
+ Bytes2 = align(Bytes1),
+ chars_decode(Bytes2,NumBits,StringType,CharInTab,Len)
+ end.
+
+encode_GeneralString(_C,Val) ->
+ encode_restricted_string(aligned,Val).
+decode_GeneralString(Bytes,_C) ->
+ decode_restricted_string(Bytes,aligned).
+
+encode_GraphicString(_C,Val) ->
+ encode_restricted_string(aligned,Val).
+decode_GraphicString(Bytes,_C) ->
+ decode_restricted_string(Bytes,aligned).
+
+encode_ObjectDescriptor(_C,Val) ->
+ encode_restricted_string(aligned,Val).
+decode_ObjectDescriptor(Bytes) ->
+ decode_restricted_string(Bytes,aligned).
+
+encode_TeletexString(_C,Val) -> % equivalent with T61String
+ encode_restricted_string(aligned,Val).
+decode_TeletexString(Bytes,_C) ->
+ decode_restricted_string(Bytes,aligned).
+
+encode_VideotexString(_C,Val) ->
+ encode_restricted_string(aligned,Val).
+decode_VideotexString(Bytes,_C) ->
+ decode_restricted_string(Bytes,aligned).
+
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% getBMPChars(Bytes,Len) ->{BMPcharList,RemainingBytes}
+%%
+getBMPChars(Bytes,1) ->
+ {O1,Bytes2} = getbits(Bytes,8),
+ {O2,Bytes3} = getbits(Bytes2,8),
+ if
+ O1 == 0 ->
+ {[O2],Bytes3};
+ true ->
+ {[{0,0,O1,O2}],Bytes3}
+ end;
+getBMPChars(Bytes,Len) ->
+ getBMPChars(Bytes,Len,[]).
+
+getBMPChars(Bytes,0,Acc) ->
+ {lists:reverse(Acc),Bytes};
+getBMPChars(Bytes,Len,Acc) ->
+ {Octs,Bytes1} = getoctets_as_list(Bytes,2),
+ case Octs of
+ [0,O2] ->
+ getBMPChars(Bytes1,Len-1,[O2|Acc]);
+ [O1,O2]->
+ getBMPChars(Bytes1,Len-1,[{0,0,O1,O2}|Acc])
+ end.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% chars_encode(C,StringType,Value) -> ValueList
+%%
+%% encodes chars according to the per rules taking the constraint PermittedAlphabet
+%% into account.
+%% This function does only encode the value part and NOT the length
+
+% chars_encode(C,StringType,Value) ->
+% case {StringType,get_constraint(C,'PermittedAlphabet')} of
+% {'UniversalString',{_,Sv}} ->
+% exit({error,{asn1,{'not implemented',"UniversalString with PermittedAlphabet constraint"}}});
+% {'BMPString',{_,Sv}} ->
+% exit({error,{asn1,{'not implemented',"BMPString with PermittedAlphabet constraint"}}});
+% _ ->
+% {NumBits,CharOutTab} = {get_NumBits(C,StringType),get_CharOutTab(C,StringType)},
+% chars_encode2(Value,NumBits,CharOutTab)
+% end.
+
+
+chars_encode2([H|T],NumBits,T1={Min,Max,notab}) when H =< Max, H >= Min ->
+% [[10,NumBits,H-Min]|chars_encode2(T,NumBits,T1)];
+ [pre_complete_bits(NumBits,H-Min)|chars_encode2(T,NumBits,T1)];
+chars_encode2([H|T],NumBits,T1={Min,Max,Tab}) when H =< Max, H >= Min ->
+% [[10,NumBits,element(H-Min+1,Tab)]|chars_encode2(T,NumBits,T1)];
+ [pre_complete_bits(NumBits,exit_if_false(H,element(H-Min+1,Tab)))|
+ chars_encode2(T,NumBits,T1)];
+chars_encode2([{A,B,C,D}|T],NumBits,T1={Min,_Max,notab}) ->
+ %% no value range check here (ought to be, but very expensive)
+% [{bits,NumBits,(A*B*C*D)-Min}|chars_encode2(T,NumBits,{Min,Max,notab})];
+% [[10,NumBits,((((((A bsl 8)+B) bsl 8)+C) bsl 8)+D)-Min]|chars_encode2(T,NumBits,T1)];
+ [pre_complete_bits(NumBits,
+ ((((((A bsl 8)+B) bsl 8)+C) bsl 8)+D)-Min)|
+ chars_encode2(T,NumBits,T1)];
+chars_encode2([H={A,B,C,D}|T],NumBits,{Min,Max,Tab}) ->
+ %% no value range check here (ought to be, but very expensive)
+ [pre_complete_bits(NumBits,exit_if_false(H,element(((((((A bsl 8)+B) bsl 8)+C) bsl 8)+D)-Min,Tab)))|chars_encode2(T,NumBits,{Min,Max,notab})];
+chars_encode2([H|_T],_NumBits,{_Min,_Max,_Tab}) ->
+ exit({error,{asn1,{illegal_char_value,H}}});
+chars_encode2([],_,_) ->
+ [].
+
+exit_if_false(V,false)->
+ exit({error,{asn1,{"illegal value according to Permitted alphabet constraint",V}}});
+exit_if_false(_,V) ->V.
+
+pre_complete_bits(NumBits,Val) when NumBits =< 8 ->
+ [10,NumBits,Val];
+pre_complete_bits(NumBits,Val) when NumBits =< 16 ->
+ [10,NumBits-8,Val bsr 8,10,8,(Val band 255)];
+pre_complete_bits(NumBits,Val) when NumBits =< 2040 -> % 255 * 8
+% LBUsed = NumBits rem 8,
+% {Unused,Len} = case (8 - LBUsed) of
+% 8 -> {0,NumBits div 8};
+% U -> {U,(NumBits div 8) + 1}
+% end,
+% NewVal = Val bsr LBUsed,
+% [30,Unused,Len,<<NewVal:Len/unit:8,Val:LBUsed,0:Unused>>].
+ Unused = (8 - (NumBits rem 8)) rem 8,
+ Len = NumBits + Unused,
+ [30,Unused,Len div 8,<<(Val bsl Unused):Len>>].
+
+% get_NumBits(C,StringType) ->
+% case get_constraint(C,'PermittedAlphabet') of
+% {'SingleValue',Sv} ->
+% charbits(length(Sv),aligned);
+% no ->
+% case StringType of
+% 'IA5String' ->
+% charbits(128,aligned); % 16#00..16#7F
+% 'VisibleString' ->
+% charbits(95,aligned); % 16#20..16#7E
+% 'PrintableString' ->
+% charbits(74,aligned); % [$\s,$',$(,$),$+,$,,$-,$.,$/,"0123456789",$:,$=,$?,$A..$Z,$a..$z
+% 'NumericString' ->
+% charbits(11,aligned); % $ ,"0123456789"
+% 'UniversalString' ->
+% 32;
+% 'BMPString' ->
+% 16
+% end
+% end.
+
+%%Maybe used later
+%%get_MaxChar(C,StringType) ->
+%% case get_constraint(C,'PermittedAlphabet') of
+%% {'SingleValue',Sv} ->
+%% lists:nth(length(Sv),Sv);
+%% no ->
+%% case StringType of
+%% 'IA5String' ->
+%% 16#7F; % 16#00..16#7F
+%% 'VisibleString' ->
+%% 16#7E; % 16#20..16#7E
+%% 'PrintableString' ->
+%% $z; % [$\s,$',$(,$),$+,$,,$-,$.,$/,"0123456789",$:,$=,$?,$A..$Z,$a..$z
+%% 'NumericString' ->
+%% $9; % $ ,"0123456789"
+%% 'UniversalString' ->
+%% 16#ffffffff;
+%% 'BMPString' ->
+%% 16#ffff
+%% end
+%% end.
+
+%%Maybe used later
+%%get_MinChar(C,StringType) ->
+%% case get_constraint(C,'PermittedAlphabet') of
+%% {'SingleValue',Sv} ->
+%% hd(Sv);
+%% no ->
+%% case StringType of
+%% 'IA5String' ->
+%% 16#00; % 16#00..16#7F
+%% 'VisibleString' ->
+%% 16#20; % 16#20..16#7E
+%% 'PrintableString' ->
+%% $\s; % [$\s,$',$(,$),$+,$,,$-,$.,$/,"0123456789",$:,$=,$?,$A..$Z,$a..$z
+%% 'NumericString' ->
+%% $\s; % $ ,"0123456789"
+%% 'UniversalString' ->
+%% 16#00;
+%% 'BMPString' ->
+%% 16#00
+%% end
+%% end.
+
+% get_CharOutTab(C,StringType) ->
+% get_CharTab(C,StringType,out).
+
+% get_CharInTab(C,StringType) ->
+% get_CharTab(C,StringType,in).
+
+% get_CharTab(C,StringType,InOut) ->
+% case get_constraint(C,'PermittedAlphabet') of
+% {'SingleValue',Sv} ->
+% get_CharTab2(C,StringType,hd(Sv),lists:max(Sv),Sv,InOut);
+% no ->
+% case StringType of
+% 'IA5String' ->
+% {0,16#7F,notab};
+% 'VisibleString' ->
+% get_CharTab2(C,StringType,16#20,16#7F,notab,InOut);
+% 'PrintableString' ->
+% Chars = lists:sort(
+% " '()+,-./0123456789:=?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"),
+% get_CharTab2(C,StringType,hd(Chars),lists:max(Chars),Chars,InOut);
+% 'NumericString' ->
+% get_CharTab2(C,StringType,16#20,$9," 0123456789",InOut);
+% 'UniversalString' ->
+% {0,16#FFFFFFFF,notab};
+% 'BMPString' ->
+% {0,16#FFFF,notab}
+% end
+% end.
+
+% get_CharTab2(C,StringType,Min,Max,Chars,InOut) ->
+% BitValMax = (1 bsl get_NumBits(C,StringType))-1,
+% if
+% Max =< BitValMax ->
+% {0,Max,notab};
+% true ->
+% case InOut of
+% out ->
+% {Min,Max,create_char_tab(Min,Chars)};
+% in ->
+% {Min,Max,list_to_tuple(Chars)}
+% end
+% end.
+
+% create_char_tab(Min,L) ->
+% list_to_tuple(create_char_tab(Min,L,0)).
+% create_char_tab(Min,[Min|T],V) ->
+% [V|create_char_tab(Min+1,T,V+1)];
+% create_char_tab(_Min,[],_V) ->
+% [];
+% create_char_tab(Min,L,V) ->
+% [false|create_char_tab(Min+1,L,V)].
+
+%% This very inefficient and should be moved to compiletime
+% charbits(NumOfChars,aligned) ->
+% case charbits(NumOfChars) of
+% 1 -> 1;
+% 2 -> 2;
+% B when B =< 4 -> 4;
+% B when B =< 8 -> 8;
+% B when B =< 16 -> 16;
+% B when B =< 32 -> 32
+% end.
+
+% charbits(NumOfChars) when NumOfChars =< 2 -> 1;
+% charbits(NumOfChars) when NumOfChars =< 4 -> 2;
+% charbits(NumOfChars) when NumOfChars =< 8 -> 3;
+% charbits(NumOfChars) when NumOfChars =< 16 -> 4;
+% charbits(NumOfChars) when NumOfChars =< 32 -> 5;
+% charbits(NumOfChars) when NumOfChars =< 64 -> 6;
+% charbits(NumOfChars) when NumOfChars =< 128 -> 7;
+% charbits(NumOfChars) when NumOfChars =< 256 -> 8;
+% charbits(NumOfChars) when NumOfChars =< 512 -> 9;
+% charbits(NumOfChars) when NumOfChars =< 1024 -> 10;
+% charbits(NumOfChars) when NumOfChars =< 2048 -> 11;
+% charbits(NumOfChars) when NumOfChars =< 4096 -> 12;
+% charbits(NumOfChars) when NumOfChars =< 8192 -> 13;
+% charbits(NumOfChars) when NumOfChars =< 16384 -> 14;
+% charbits(NumOfChars) when NumOfChars =< 32768 -> 15;
+% charbits(NumOfChars) when NumOfChars =< 65536 -> 16;
+% charbits(NumOfChars) when integer(NumOfChars) ->
+% 16 + charbits1(NumOfChars bsr 16).
+
+% charbits1(0) ->
+% 0;
+% charbits1(NumOfChars) ->
+% 1 + charbits1(NumOfChars bsr 1).
+
+
+chars_decode(Bytes,_,'BMPString',_,Len) ->
+ getBMPChars(Bytes,Len);
+chars_decode(Bytes,NumBits,_StringType,CharInTab,Len) ->
+ chars_decode2(Bytes,CharInTab,NumBits,Len).
+
+
+chars_decode2(Bytes,CharInTab,NumBits,Len) ->
+ chars_decode2(Bytes,CharInTab,NumBits,Len,[]).
+
+chars_decode2(Bytes,_CharInTab,_NumBits,0,Acc) ->
+ {lists:reverse(Acc),Bytes};
+chars_decode2(Bytes,{Min,Max,notab},NumBits,Len,Acc) when NumBits > 8 ->
+ {Char,Bytes2} = getbits(Bytes,NumBits),
+ Result =
+ if
+ Char < 256 -> Char;
+ true ->
+ list_to_tuple(binary_to_list(<<Char:32>>))
+ end,
+ chars_decode2(Bytes2,{Min,Max,notab},NumBits,Len -1,[Result|Acc]);
+chars_decode2(Bytes,{Min,Max,notab},NumBits,Len,Acc) ->
+ {Char,Bytes2} = getbits(Bytes,NumBits),
+ chars_decode2(Bytes2,{Min,Max,notab},NumBits,Len -1,[Char+Min|Acc]);
+
+%% BMPString and UniversalString with PermittedAlphabet is currently not supported
+chars_decode2(Bytes,{Min,Max,CharInTab},NumBits,Len,Acc) ->
+ {Char,Bytes2} = getbits(Bytes,NumBits),
+ chars_decode2(Bytes2,{Min,Max,CharInTab},NumBits,Len -1,[element(Char+1,CharInTab)|Acc]).
+
+
+ % X.691:17
+encode_null(_Val) -> []; % encodes to nothing
+encode_null({Name,Val}) when atom(Name) ->
+ encode_null(Val).
+
+decode_null(Bytes) ->
+ {'NULL',Bytes}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% encode_object_identifier(Val) -> CompleteList
+%% encode_object_identifier({Name,Val}) -> CompleteList
+%% Val -> {Int1,Int2,...,IntN} % N >= 2
+%% Name -> atom()
+%% Int1 -> integer(0..2)
+%% Int2 -> integer(0..39) when Int1 (0..1) else integer()
+%% Int3-N -> integer()
+%% CompleteList -> [{bits,8,Val}|{octets,Ol}|align|...]
+%%
+encode_object_identifier({Name,Val}) when atom(Name) ->
+ encode_object_identifier(Val);
+encode_object_identifier(Val) ->
+ OctetList = e_object_identifier(Val),
+ Octets = list_to_binary(OctetList), % performs a flatten at the same time
+% [{debug,object_identifier},encode_length(undefined,size(Octets)),{octets,Octets}].
+ [encode_length(undefined,size(Octets)),
+ octets_to_complete(size(Octets),Octets)].
+
+%% This code is copied from asn1_encode.erl (BER) and corrected and modified
+
+e_object_identifier({'OBJECT IDENTIFIER',V}) ->
+ e_object_identifier(V);
+e_object_identifier({Cname,V}) when atom(Cname),tuple(V) ->
+ e_object_identifier(tuple_to_list(V));
+e_object_identifier({Cname,V}) when atom(Cname),list(V) ->
+ e_object_identifier(V);
+e_object_identifier(V) when tuple(V) ->
+ e_object_identifier(tuple_to_list(V));
+
+%% E1 = 0|1|2 and (E2 < 40 when E1 = 0|1)
+e_object_identifier([E1,E2|Tail]) when E1 >= 0, E1 < 2, E2 < 40 ; E1==2 ->
+ Head = 40*E1 + E2, % weird
+ e_object_elements([Head|Tail],[]);
+e_object_identifier(Oid=[_,_|_Tail]) ->
+ exit({error,{asn1,{'illegal_value',Oid}}}).
+
+e_object_elements([],Acc) ->
+ lists:reverse(Acc);
+e_object_elements([H|T],Acc) ->
+ e_object_elements(T,[e_object_element(H)|Acc]).
+
+e_object_element(Num) when Num < 128 ->
+ Num;
+%% must be changed to handle more than 2 octets
+e_object_element(Num) -> %% when Num < ???
+ Left = ((Num band 2#11111110000000) bsr 7) bor 2#10000000,
+ Right = Num band 2#1111111 ,
+ [Left,Right].
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% decode_object_identifier(Bytes) -> {ObjId,RemainingBytes}
+%% ObjId -> {integer(),integer(),...} % at least 2 integers
+%% RemainingBytes -> [integer()] when integer() (0..255)
+decode_object_identifier(Bytes) ->
+ {Len,Bytes2} = decode_length(Bytes,undefined),
+ {Octs,Bytes3} = getoctets_as_list(Bytes2,Len),
+ [First|Rest] = dec_subidentifiers(Octs,0,[]),
+ Idlist = if
+ First < 40 ->
+ [0,First|Rest];
+ First < 80 ->
+ [1,First - 40|Rest];
+ true ->
+ [2,First - 80|Rest]
+ end,
+ {list_to_tuple(Idlist),Bytes3}.
+
+dec_subidentifiers([H|T],Av,Al) when H >=16#80 ->
+ dec_subidentifiers(T,(Av bsl 7) + (H band 16#7F),Al);
+dec_subidentifiers([H|T],Av,Al) ->
+ dec_subidentifiers(T,0,[(Av bsl 7) + H |Al]);
+dec_subidentifiers([],_Av,Al) ->
+ lists:reverse(Al).
+
+get_constraint([{Key,V}],Key) ->
+ V;
+get_constraint([],_) ->
+ no;
+get_constraint(C,Key) ->
+ case lists:keysearch(Key,1,C) of
+ false ->
+ no;
+ {value,{_,V}} ->
+ V
+ end.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% complete(InList) -> ByteList
+%% Takes a coded list with bits and bytes and converts it to a list of bytes
+%% Should be applied as the last step at encode of a complete ASN.1 type
+%%
+
+-ifdef(nodriver).
+
+complete(L) ->
+ case complete1(L) of
+ {[],[]} ->
+ <<0>>;
+ {Acc,[]} ->
+ Acc;
+ {Acc,Bacc} ->
+ [Acc|complete_bytes(Bacc)]
+ end.
+
+
+% this function builds the ugly form of lists [E1|E2] to avoid having to reverse it at the end.
+% this is done because it is efficient and that the result always will be sent on a port or
+% converted by means of list_to_binary/1
+ complete1(InList) when list(InList) ->
+ complete1(InList,[],[]);
+ complete1(InList) ->
+ complete1([InList],[],[]).
+
+ complete1([],Acc,Bacc) ->
+ {Acc,Bacc};
+ complete1([H|T],Acc,Bacc) when list(H) ->
+ {NewH,NewBacc} = complete1(H,Acc,Bacc),
+ complete1(T,NewH,NewBacc);
+
+ complete1([{octets,Bin}|T],Acc,[]) ->
+ complete1(T,[Acc|Bin],[]);
+
+ complete1([{octets,Bin}|T],Acc,Bacc) ->
+ complete1(T,[Acc|[complete_bytes(Bacc),Bin]],[]);
+
+ complete1([{debug,_}|T], Acc,Bacc) ->
+ complete1(T,Acc,Bacc);
+
+ complete1([{bits,N,Val}|T],Acc,Bacc) ->
+ complete1(T,Acc,complete_update_byte(Bacc,Val,N));
+
+ complete1([{bit,Val}|T],Acc,Bacc) ->
+ complete1(T,Acc,complete_update_byte(Bacc,Val,1));
+
+ complete1([align|T],Acc,[]) ->
+ complete1(T,Acc,[]);
+ complete1([align|T],Acc,Bacc) ->
+ complete1(T,[Acc|complete_bytes(Bacc)],[]);
+ complete1([{0,Bin}|T],Acc,[]) when binary(Bin) ->
+ complete1(T,[Acc|Bin],[]);
+ complete1([{Unused,Bin}|T],Acc,[]) when integer(Unused),binary(Bin) ->
+ Size = size(Bin)-1,
+ <<Bs:Size/binary,B>> = Bin,
+ NumBits = 8-Unused,
+ complete1(T,[Acc|Bs],[[B bsr Unused]|NumBits]);
+ complete1([{Unused,Bin}|T],Acc,Bacc) when integer(Unused),binary(Bin) ->
+ Size = size(Bin)-1,
+ <<Bs:Size/binary,B>> = Bin,
+ NumBits = 8 - Unused,
+ Bf = complete_bytes(Bacc),
+ complete1(T,[Acc|[Bf,Bs]],[[B bsr Unused]|NumBits]).
+
+
+ complete_update_byte([],Val,Len) ->
+ complete_update_byte([[0]|0],Val,Len);
+ complete_update_byte([[Byte|Bacc]|NumBits],Val,Len) when NumBits + Len == 8 ->
+ [[0,((Byte bsl Len) + Val) band 255|Bacc]|0];
+ complete_update_byte([[Byte|Bacc]|NumBits],Val,Len) when NumBits + Len > 8 ->
+ Rem = 8 - NumBits,
+ Rest = Len - Rem,
+ complete_update_byte([[0,((Byte bsl Rem) + (Val bsr Rest)) band 255 |Bacc]|0],Val,Rest);
+ complete_update_byte([[Byte|Bacc]|NumBits],Val,Len) ->
+ [[((Byte bsl Len) + Val) band 255|Bacc]|NumBits+Len].
+
+
+ complete_bytes([[Byte|Bacc]|0]) ->
+ lists:reverse(Bacc);
+ complete_bytes([[Byte|Bacc]|NumBytes]) ->
+ lists:reverse([(Byte bsl (8-NumBytes)) band 255|Bacc]);
+ complete_bytes([]) ->
+ [].
+
+-else.
+
+
+ complete(L) ->
+ case catch port_control(drv_complete,1,L) of
+ Bin when binary(Bin) ->
+ Bin;
+ List when list(List) -> handle_error(List,L);
+ {'EXIT',{badarg,Reason}} ->
+ asn1rt_driver_handler:load_driver(),
+ receive
+ driver_ready ->
+ case catch port_control(drv_complete,1,L) of
+ Bin2 when binary(Bin2) -> Bin2;
+ List when list(List) -> handle_error(List,L);
+ Error -> exit(Error)
+ end;
+ {error,Error} -> % error when loading driver
+ %% the driver could not be loaded
+ exit(Error);
+ Error={port_error,Reason} ->
+ exit(Error)
+ end;
+ {'EXIT',Reason} ->
+ exit(Reason)
+ end.
+
+handle_error([],_)->
+ exit({error,{"memory allocation problem"}});
+handle_error("1",L) -> % error in complete in driver
+ exit({error,{asn1_error,L}});
+handle_error(ErrL,L) ->
+ exit({error,{unknown_error,ErrL,L}}).
+
+-endif.
+
+
+octets_to_complete(Len,Val) when Len < 256 ->
+ [20,Len,Val];
+octets_to_complete(Len,Val) ->
+ [21,<<Len:16>>,Val].
+
+octets_unused_to_complete(Unused,Len,Val) when Len < 256 ->
+ [30,Unused,Len,Val];
+octets_unused_to_complete(Unused,Len,Val) ->
+ [31,Unused,<<Len:16>>,Val].
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_per_v1.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_per_v1.erl
new file mode 100644
index 0000000000..90ffb0cb1c
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_per_v1.erl
@@ -0,0 +1,1827 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: asn1rt_per_v1.erl,v 1.1 2008/12/17 09:53:31 mikpe Exp $
+%%
+-module(asn1rt_per_v1).
+
+%% encoding / decoding of PER aligned
+
+-include("asn1_records.hrl").
+
+-export([dec_fixup/3, cindex/3, list_to_record/2]).
+-export([setchoiceext/1, setext/1, fixoptionals/2, fixextensions/2,
+ setoptionals/1, fixoptionals2/3, getext/1, getextension/2,
+ skipextensions/3, getbit/1, getchoice/3 ]).
+-export([getoptionals/2, getoptionals/3, set_choice/3,
+ getoptionals2/2,
+ encode_integer/2, encode_integer/3 ]).
+-export([decode_integer/2, decode_integer/3, encode_small_number/1,
+ encode_boolean/1, decode_boolean/1, encode_length/2,
+ decode_length/1, decode_length/2,
+ encode_small_length/1, decode_small_length/1,
+ decode_compact_bit_string/3]).
+-export([encode_enumerated/3, decode_enumerated/3,
+ encode_bit_string/3, decode_bit_string/3 ]).
+-export([encode_octet_string/2, decode_octet_string/2,
+ encode_null/1, decode_null/1,
+ encode_object_identifier/1, decode_object_identifier/1,
+ complete/1]).
+
+-export([encode_open_type/2, decode_open_type/2]).
+
+-export([encode_UniversalString/2, decode_UniversalString/2,
+ encode_PrintableString/2, decode_PrintableString/2,
+ encode_GeneralString/2, decode_GeneralString/2,
+ encode_GraphicString/2, decode_GraphicString/2,
+ encode_TeletexString/2, decode_TeletexString/2,
+ encode_VideotexString/2, decode_VideotexString/2,
+ encode_VisibleString/2, decode_VisibleString/2,
+ encode_BMPString/2, decode_BMPString/2,
+ encode_IA5String/2, decode_IA5String/2,
+ encode_NumericString/2, decode_NumericString/2,
+ encode_ObjectDescriptor/2, decode_ObjectDescriptor/1
+ ]).
+
+
+dec_fixup(Terms,Cnames,RemBytes) ->
+ dec_fixup(Terms,Cnames,RemBytes,[]).
+
+dec_fixup([novalue|T],[_Hc|Tc],RemBytes,Acc) ->
+ dec_fixup(T,Tc,RemBytes,Acc);
+dec_fixup([{_Name,novalue}|T],[_Hc|Tc],RemBytes,Acc) ->
+ dec_fixup(T,Tc,RemBytes,Acc);
+dec_fixup([H|T],[Hc|Tc],RemBytes,Acc) ->
+ dec_fixup(T,Tc,RemBytes,[{Hc,H}|Acc]);
+dec_fixup([],_Cnames,RemBytes,Acc) ->
+ {lists:reverse(Acc),RemBytes}.
+
+cindex(Ix,Val,Cname) ->
+ case element(Ix,Val) of
+ {Cname,Val2} -> Val2;
+ X -> X
+ end.
+
+% converts a list to a record if necessary
+list_to_record(Name,List) when list(List) ->
+ list_to_tuple([Name|List]);
+list_to_record(_Name,Tuple) when tuple(Tuple) ->
+ Tuple.
+
+%%--------------------------------------------------------
+%% setchoiceext(InRootSet) -> [{bit,X}]
+%% X is set to 1 when InRootSet==false
+%% X is set to 0 when InRootSet==true
+%%
+setchoiceext(true) ->
+ [{debug,choiceext},{bit,0}];
+setchoiceext(false) ->
+ [{debug,choiceext},{bit,1}].
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% setext(true|false) -> CompleteList
+%%
+
+setext(true) ->
+ [{debug,ext},{bit,1}];
+setext(false) ->
+ [{debug,ext},{bit,0}].
+
+%%
+
+fixoptionals2(OptList,OptLength,Val) when tuple(Val) ->
+ Bits = fixoptionals2(OptList,Val,0),
+ {Val,{bits,OptLength,Bits}};
+
+fixoptionals2([],_Val,Acc) ->
+ %% Optbits
+ Acc;
+fixoptionals2([Pos|Ot],Val,Acc) ->
+ case element(Pos,Val) of
+ asn1_NOVALUE -> fixoptionals2(Ot,Val,Acc bsl 1);
+ asn1_DEFAULT -> fixoptionals2(Ot,Val,Acc bsl 1);
+ _ -> fixoptionals2(Ot,Val,(Acc bsl 1) + 1)
+ end.
+
+
+%%
+%% fixoptionals remains only for backward compatibility purpose
+fixoptionals(OptList,Val) when tuple(Val) ->
+ fixoptionals(OptList,Val,[]);
+
+fixoptionals(OptList,Val) when list(Val) ->
+ fixoptionals(OptList,Val,1,[],[]).
+
+fixoptionals([],Val,Acc) ->
+ % return {Val,Opt}
+ {Val,lists:reverse(Acc)};
+fixoptionals([{_,Pos}|Ot],Val,Acc) ->
+ case element(Pos+1,Val) of
+ asn1_NOVALUE -> fixoptionals(Ot,Val,[0|Acc]);
+ asn1_DEFAULT -> fixoptionals(Ot,Val,[0|Acc]);
+ _ -> fixoptionals(Ot,Val,[1|Acc])
+ end.
+
+
+%setoptionals(OptList,Val) ->
+% Vlist = tuple_to_list(Val),
+% setoptionals(OptList,Vlist,1,[]).
+
+fixoptionals([{Name,Pos}|Ot],[{Name,Val}|Vt],_Opt,Acc1,Acc2) ->
+ fixoptionals(Ot,Vt,Pos+1,[1|Acc1],[{Name,Val}|Acc2]);
+fixoptionals([{_Name,Pos}|Ot],V,Pos,Acc1,Acc2) ->
+ fixoptionals(Ot,V,Pos+1,[0|Acc1],[asn1_NOVALUE|Acc2]);
+fixoptionals(O,[Vh|Vt],Pos,Acc1,Acc2) ->
+ fixoptionals(O,Vt,Pos+1,Acc1,[Vh|Acc2]);
+fixoptionals([],[Vh|Vt],Pos,Acc1,Acc2) ->
+ fixoptionals([],Vt,Pos+1,Acc1,[Vh|Acc2]);
+fixoptionals([],[],_,Acc1,Acc2) ->
+ % return {Val,Opt}
+ {list_to_tuple([asn1_RECORDNAME|lists:reverse(Acc2)]),lists:reverse(Acc1)}.
+
+setoptionals([H|T]) ->
+ [{bit,H}|setoptionals(T)];
+setoptionals([]) ->
+ [{debug,optionals}].
+
+getext(Bytes) when tuple(Bytes) ->
+ getbit(Bytes);
+getext(Bytes) when list(Bytes) ->
+ getbit({0,Bytes}).
+
+getextension(0, Bytes) ->
+ {{},Bytes};
+getextension(1, Bytes) ->
+ {Len,Bytes2} = decode_small_length(Bytes),
+ {Blist, Bytes3} = getbits_as_list(Len,Bytes2),
+ {list_to_tuple(Blist),Bytes3}.
+
+fixextensions({ext,ExtPos,ExtNum},Val) ->
+ case fixextensions(ExtPos,ExtNum+ExtPos,Val,0) of
+ 0 -> [];
+ ExtBits ->
+ [encode_small_length(ExtNum),{bits,ExtNum,ExtBits}]
+ end.
+
+fixextensions(Pos,MaxPos,_,Acc) when Pos >= MaxPos ->
+ Acc;
+fixextensions(Pos,ExtPos,Val,Acc) ->
+ Bit = case catch(element(Pos+1,Val)) of
+ asn1_NOVALUE ->
+ 0;
+ asn1_NOEXTVALUE ->
+ 0;
+ {'EXIT',_} ->
+ 0;
+ _ ->
+ 1
+ end,
+ fixextensions(Pos+1,ExtPos,Val,(Acc bsl 1)+Bit).
+
+skipextensions(Bytes,Nr,ExtensionBitPattern) ->
+ case (catch element(Nr,ExtensionBitPattern)) of
+ 1 ->
+ {_,Bytes2} = decode_open_type(Bytes,[]),
+ skipextensions(Bytes2, Nr+1, ExtensionBitPattern);
+ 0 ->
+ skipextensions(Bytes, Nr+1, ExtensionBitPattern);
+ {'EXIT',_} -> % badarg, no more extensions
+ Bytes
+ end.
+
+
+getchoice(Bytes,1,0) -> % only 1 alternative is not encoded
+ {0,Bytes};
+getchoice(Bytes,_NumChoices,1) ->
+ decode_small_number(Bytes);
+getchoice(Bytes,NumChoices,0) ->
+ decode_integer(Bytes,[{'ValueRange',{0,NumChoices-1}}]).
+
+getoptionals2(Bytes,NumOpt) ->
+ getbits(Bytes,NumOpt).
+
+%% getoptionals is kept only for bakwards compatibility
+getoptionals(Bytes,NumOpt) ->
+ {Blist,Bytes1} = getbits_as_list(NumOpt,Bytes),
+ {list_to_tuple(Blist),Bytes1}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% getoptionals/3 is only here for compatibility from 1.3.2
+%% the codegenerator uses getoptionals/2
+
+getoptionals(Bytes,L,NumComp) when list(L) ->
+ {Blist,Bytes1} = getbits_as_list(length(L),Bytes),
+ {list_to_tuple(comptuple(Blist,L,NumComp,1)),Bytes1}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% comptuple is only here for compatibility not used from 1.3.2
+comptuple([Bh|Bt],[{_Name,Nr}|T],NumComp,Nr) ->
+ [Bh|comptuple(Bt,T,NumComp-1,Nr+1)];
+comptuple(Bl,[{Name,Tnr}|Tl],NumComp,Nr) ->
+ [0|comptuple(Bl,[{Name,Tnr}|Tl],NumComp-1,Nr+1)];
+comptuple(_B,_L,0,_Nr) ->
+ [];
+comptuple(B,O,N,Nr) ->
+ [0|comptuple(B,O,N-1,Nr+1)].
+
+%% getbits_as_binary(Num,Bytes) -> {{Unused,BinBits},RestBytes},
+%% Num = integer(),
+%% Bytes = list() | tuple(),
+%% Unused = integer(),
+%% BinBits = binary(),
+%% RestBytes = tuple()
+getbits_as_binary(Num,Bytes) when list(Bytes) ->
+ getbits_as_binary(Num,{0,Bytes});
+getbits_as_binary(_Num,{Used,[]}) ->
+ {{0,<<>>},{Used,[]}};
+getbits_as_binary(Num,{Used,Bits=[H|T]}) ->
+ B1 = case (Num+Used) =< 8 of
+ true -> Num;
+ _ -> 8-Used
+ end,
+ B2 = Num - B1,
+ Pad = (8 - ((B1+B2) rem 8)) rem 8,% Pad /= 8
+ RestBits = lists:nthtail((B1+B2) div 8,Bits),
+ Int = integer_from_list(B2,T,0),
+ NewUsed = (Used + Num) rem 8,
+ {{Pad,<<(H bsr (8-(Used+B1))):B1,Int:B2,0:Pad>>},{NewUsed,RestBits}}.
+
+integer_from_list(_Int,[],BigInt) ->
+ BigInt;
+integer_from_list(Int,[H|_T],BigInt) when Int < 8 ->
+ (BigInt bsl Int) bor (H bsr (8-Int));
+integer_from_list(Int,[H|T],BigInt) ->
+ integer_from_list(Int-8,T,(BigInt bsl 8) bor H).
+
+getbits_as_list(Num,Bytes) ->
+ getbits_as_list(Num,Bytes,[]).
+
+getbits_as_list(0,Bytes,Acc) ->
+ {lists:reverse(Acc),Bytes};
+getbits_as_list(Num,Bytes,Acc) ->
+ {Bit,NewBytes} = getbit(Bytes),
+ getbits_as_list(Num-1,NewBytes,[Bit|Acc]).
+
+getbit(Bytes) ->
+% io:format("getbit:~p~n",[Bytes]),
+ getbit1(Bytes).
+
+getbit1({7,[H|T]}) ->
+ {H band 1,{0,T}};
+getbit1({Pos,[H|T]}) ->
+ {(H bsr (7-Pos)) band 1,{(Pos+1) rem 8,[H|T]}};
+getbit1(Bytes) when list(Bytes) ->
+ getbit1({0,Bytes}).
+
+%% This could be optimized
+getbits(Buffer,Num) ->
+% io:format("getbits:Buffer = ~p~nNum=~p~n",[Buffer,Num]),
+ getbits(Buffer,Num,0).
+
+getbits(Buffer,0,Acc) ->
+ {Acc,Buffer};
+getbits(Buffer,Num,Acc) ->
+ {B,NewBuffer} = getbit(Buffer),
+ getbits(NewBuffer,Num-1,B + (Acc bsl 1)).
+
+
+getoctet(Bytes) when list(Bytes) ->
+ getoctet({0,Bytes});
+getoctet(Bytes) ->
+% io:format("getoctet:Buffer = ~p~n",[Bytes]),
+ getoctet1(Bytes).
+
+getoctet1({0,[H|T]}) ->
+ {H,{0,T}};
+getoctet1({_Pos,[_,H|T]}) ->
+ {H,{0,T}}.
+
+align({0,L}) ->
+ {0,L};
+align({_Pos,[_H|T]}) ->
+ {0,T};
+align(Bytes) ->
+ {0,Bytes}.
+
+getoctets(Buffer,Num) ->
+% io:format("getoctets:Buffer = ~p~nNum = ~p~n",[Buffer,Num]),
+ getoctets(Buffer,Num,0).
+
+getoctets(Buffer,0,Acc) ->
+ {Acc,Buffer};
+getoctets(Buffer,Num,Acc) ->
+ {Oct,NewBuffer} = getoctet(Buffer),
+ getoctets(NewBuffer,Num-1,(Acc bsl 8)+Oct).
+
+getoctets_as_list(Buffer,Num) ->
+ getoctets_as_list(Buffer,Num,[]).
+
+getoctets_as_list(Buffer,0,Acc) ->
+ {lists:reverse(Acc),Buffer};
+getoctets_as_list(Buffer,Num,Acc) ->
+ {Oct,NewBuffer} = getoctet(Buffer),
+ getoctets_as_list(NewBuffer,Num-1,[Oct|Acc]).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% set_choice(Alt,Choices,Altnum) -> ListofBitSettings
+%% Alt = atom()
+%% Altnum = integer() | {integer(),integer()}% number of alternatives
+%% Choices = [atom()] | {[atom()],[atom()]}
+%% When Choices is a tuple the first list is the Rootset and the
+%% second is the Extensions and then Altnum must also be a tuple with the
+%% lengths of the 2 lists
+%%
+set_choice(Alt,{L1,L2},{Len1,_Len2}) ->
+ case set_choice_tag(Alt,L1) of
+ N when integer(N), Len1 > 1 ->
+ [{bit,0}, % the value is in the root set
+ encode_integer([{'ValueRange',{0,Len1-1}}],N)];
+ N when integer(N) ->
+ [{bit,0}]; % no encoding if only 0 or 1 alternative
+ false ->
+ [{bit,1}, % extension value
+ case set_choice_tag(Alt,L2) of
+ N2 when integer(N2) ->
+ encode_small_number(N2);
+ false ->
+ unknown_choice_alt
+ end]
+ end;
+set_choice(Alt,L,Len) ->
+ case set_choice_tag(Alt,L) of
+ N when integer(N), Len > 1 ->
+ encode_integer([{'ValueRange',{0,Len-1}}],N);
+ N when integer(N) ->
+ []; % no encoding if only 0 or 1 alternative
+ false ->
+ [unknown_choice_alt]
+ end.
+
+set_choice_tag(Alt,Choices) ->
+ set_choice_tag(Alt,Choices,0).
+
+set_choice_tag(Alt,[Alt|_Rest],Tag) ->
+ Tag;
+set_choice_tag(Alt,[_H|Rest],Tag) ->
+ set_choice_tag(Alt,Rest,Tag+1);
+set_choice_tag(_Alt,[],_Tag) ->
+ false.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% encode_open_type(Constraint, Value) -> CompleteList
+%% Value = list of bytes of an already encoded value (the list must be flat)
+%% | binary
+%% Contraint = not used in this version
+%%
+encode_open_type(_Constraint, Val) when list(Val) ->
+ [encode_length(undefined,length(Val)),align,
+ {octets,Val}];
+encode_open_type(_Constraint, Val) when binary(Val) ->
+ [encode_length(undefined,size(Val)),align,
+ {octets,binary_to_list(Val)}].
+%% the binary_to_list is not optimal but compatible with the current solution
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% decode_open_type(Buffer,Constraint) -> Value
+%% Constraint is not used in this version
+%% Buffer = [byte] with PER encoded data
+%% Value = [byte] with decoded data (which must be decoded again as some type)
+%%
+decode_open_type(Bytes, _Constraint) ->
+ {Len,Bytes2} = decode_length(Bytes,undefined),
+ Bytes3 = align(Bytes2),
+ getoctets_as_list(Bytes3,Len).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% encode_integer(Constraint,Value,NamedNumberList) -> CompleteList
+%% encode_integer(Constraint,Value) -> CompleteList
+%% encode_integer(Constraint,{Name,Value}) -> CompleteList
+%%
+%%
+encode_integer(C,V,NamedNumberList) when atom(V) ->
+ case lists:keysearch(V,1,NamedNumberList) of
+ {value,{_,NewV}} ->
+ encode_integer(C,NewV);
+ _ ->
+ exit({error,{asn1,{namednumber,V}}})
+ end;
+encode_integer(C,V,_) when integer(V) ->
+ encode_integer(C,V);
+encode_integer(C,{Name,V},NamedNumberList) when atom(Name) ->
+ encode_integer(C,V,NamedNumberList).
+
+encode_integer(C,{Name,Val}) when atom(Name) ->
+ encode_integer(C,Val);
+
+encode_integer({Rc,_Ec},Val) ->
+ case (catch encode_integer(Rc,Val)) of
+ {'EXIT',{error,{asn1,_}}} ->
+ [{bit,1},encode_unconstrained_number(Val)];
+ Encoded ->
+ [{bit,0},Encoded]
+ end;
+encode_integer(C,Val ) when list(C) ->
+ case get_constraint(C,'SingleValue') of
+ no ->
+ encode_integer1(C,Val);
+ V when integer(V),V == Val ->
+ []; % a type restricted to a single value encodes to nothing
+ V when list(V) ->
+ case lists:member(Val,V) of
+ true ->
+ encode_integer1(C,Val);
+ _ ->
+ exit({error,{asn1,{illegal_value,Val}}})
+ end;
+ _ ->
+ exit({error,{asn1,{illegal_value,Val}}})
+ end.
+
+encode_integer1(C, Val) ->
+ case VR = get_constraint(C,'ValueRange') of
+ no ->
+ encode_unconstrained_number(Val);
+ {Lb,'MAX'} ->
+ encode_semi_constrained_number(Lb,Val);
+ %% positive with range
+ {Lb,Ub} when Val >= Lb,
+ Ub >= Val ->
+ encode_constrained_number(VR,Val);
+ _ ->
+ exit({error,{asn1,{illegal_value,VR,Val}}})
+ end.
+
+decode_integer(Buffer,Range,NamedNumberList) ->
+ {Val,Buffer2} = decode_integer(Buffer,Range),
+ case lists:keysearch(Val,2,NamedNumberList) of
+ {value,{NewVal,_}} -> {NewVal,Buffer2};
+ _ -> {Val,Buffer2}
+ end.
+
+decode_integer(Buffer,{Rc,_Ec}) ->
+ {Ext,Buffer2} = getext(Buffer),
+ case Ext of
+ 0 -> decode_integer(Buffer2,Rc);
+ 1 -> decode_unconstrained_number(Buffer2)
+ end;
+decode_integer(Buffer,undefined) ->
+ decode_unconstrained_number(Buffer);
+decode_integer(Buffer,C) ->
+ case get_constraint(C,'SingleValue') of
+ V when integer(V) ->
+ {V,Buffer};
+ V when list(V) ->
+ {Val,Buffer2} = decode_integer1(Buffer,C),
+ case lists:member(Val,V) of
+ true ->
+ {Val,Buffer2};
+ _ ->
+ exit({error,{asn1,{illegal_value,Val}}})
+ end;
+ _ ->
+ decode_integer1(Buffer,C)
+ end.
+
+decode_integer1(Buffer,C) ->
+ case VR = get_constraint(C,'ValueRange') of
+ no ->
+ decode_unconstrained_number(Buffer);
+ {Lb, 'MAX'} ->
+ decode_semi_constrained_number(Buffer,Lb);
+ {_,_} ->
+ decode_constrained_number(Buffer,VR)
+ end.
+
+% X.691:10.6 Encoding of a normally small non-negative whole number
+% Use this for encoding of CHOICE index if there is an extension marker in
+% the CHOICE
+encode_small_number({Name,Val}) when atom(Name) ->
+ encode_small_number(Val);
+encode_small_number(Val) when Val =< 63 ->
+ [{bit,0},{bits,6,Val}];
+encode_small_number(Val) ->
+ [{bit,1},encode_semi_constrained_number(0,Val)].
+
+decode_small_number(Bytes) ->
+ {Bit,Bytes2} = getbit(Bytes),
+ case Bit of
+ 0 ->
+ getbits(Bytes2,6);
+ 1 ->
+ decode_semi_constrained_number(Bytes2,{0,'MAX'})
+ end.
+
+% X.691:10.7 Encoding of a semi-constrained whole number
+%% might be an optimization encode_semi_constrained_number(0,Val) ->
+encode_semi_constrained_number(C,{Name,Val}) when atom(Name) ->
+ encode_semi_constrained_number(C,Val);
+encode_semi_constrained_number({Lb,'MAX'},Val) ->
+ encode_semi_constrained_number(Lb,Val);
+encode_semi_constrained_number(Lb,Val) ->
+ Val2 = Val - Lb,
+ Octs = eint_positive(Val2),
+ [encode_length(undefined,length(Octs)),{octets,Octs}].
+
+decode_semi_constrained_number(Bytes,{Lb,_}) ->
+ decode_semi_constrained_number(Bytes,Lb);
+decode_semi_constrained_number(Bytes,Lb) ->
+ {Len,Bytes2} = decode_length(Bytes,undefined),
+ {V,Bytes3} = getoctets(Bytes2,Len),
+ {V+Lb,Bytes3}.
+
+encode_constrained_number(Range,{Name,Val}) when atom(Name) ->
+ encode_constrained_number(Range,Val);
+encode_constrained_number({Lb,Ub},Val) when Val >= Lb, Ub >= Val ->
+ Range = Ub - Lb + 1,
+ Val2 = Val - Lb,
+ if
+ Range == 2 ->
+ {bits,1,Val2};
+ Range =< 4 ->
+ {bits,2,Val2};
+ Range =< 8 ->
+ {bits,3,Val2};
+ Range =< 16 ->
+ {bits,4,Val2};
+ Range =< 32 ->
+ {bits,5,Val2};
+ Range =< 64 ->
+ {bits,6,Val2};
+ Range =< 128 ->
+ {bits,7,Val2};
+ Range =< 255 ->
+ {bits,8,Val2};
+ Range =< 256 ->
+ {octets,1,Val2};
+ Range =< 65536 ->
+ {octets,2,Val2};
+ Range =< 16#1000000 ->
+ Octs = eint_positive(Val2),
+ [encode_length({1,3},length(Octs)),{octets,Octs}];
+ Range =< 16#100000000 ->
+ Octs = eint_positive(Val2),
+ [encode_length({1,4},length(Octs)),{octets,Octs}];
+ Range =< 16#10000000000 ->
+ Octs = eint_positive(Val2),
+ [encode_length({1,5},length(Octs)),{octets,Octs}];
+ true ->
+ exit({not_supported,{integer_range,Range}})
+ end.
+
+decode_constrained_number(Buffer,{Lb,Ub}) ->
+ Range = Ub - Lb + 1,
+% Val2 = Val - Lb,
+ {Val,Remain} =
+ if
+ Range == 2 ->
+ getbits(Buffer,1);
+ Range =< 4 ->
+ getbits(Buffer,2);
+ Range =< 8 ->
+ getbits(Buffer,3);
+ Range =< 16 ->
+ getbits(Buffer,4);
+ Range =< 32 ->
+ getbits(Buffer,5);
+ Range =< 64 ->
+ getbits(Buffer,6);
+ Range =< 128 ->
+ getbits(Buffer,7);
+ Range =< 255 ->
+ getbits(Buffer,8);
+ Range =< 256 ->
+ getoctets(Buffer,1);
+ Range =< 65536 ->
+ getoctets(Buffer,2);
+ Range =< 16#1000000 ->
+ {Len,Bytes2} = decode_length(Buffer,{1,3}),
+ {Octs,Bytes3} = getoctets_as_list(Bytes2,Len),
+ {dec_pos_integer(Octs),Bytes3};
+ Range =< 16#100000000 ->
+ {Len,Bytes2} = decode_length(Buffer,{1,4}),
+ {Octs,Bytes3} = getoctets_as_list(Bytes2,Len),
+ {dec_pos_integer(Octs),Bytes3};
+ Range =< 16#10000000000 ->
+ {Len,Bytes2} = decode_length(Buffer,{1,5}),
+ {Octs,Bytes3} = getoctets_as_list(Bytes2,Len),
+ {dec_pos_integer(Octs),Bytes3};
+ true ->
+ exit({not_supported,{integer_range,Range}})
+ end,
+ {Val+Lb,Remain}.
+
+% X.691:10.8 Encoding of an unconstrained whole number
+
+encode_unconstrained_number(Val) when Val >= 0 ->
+ Oct = eint(Val,[]),
+ [{debug,unconstrained_number},
+ encode_length({0,'MAX'},length(Oct)),
+ {octets,Oct}];
+encode_unconstrained_number(Val) -> % negative
+ Oct = enint(Val,[]),
+ [{debug,unconstrained_number},
+ encode_length({0,'MAX'},length(Oct)),
+ {octets,Oct}].
+
+%% used for positive Values which don't need a sign bit
+eint_positive(Val) ->
+ case eint(Val,[]) of
+ [0,B1|T] ->
+ [B1|T];
+ T ->
+ T
+ end.
+
+eint(0, [B|Acc]) when B < 128 ->
+ [B|Acc];
+eint(N, Acc) ->
+ eint(N bsr 8, [N band 16#ff| Acc]).
+
+enint(-1, [B1|T]) when B1 > 127 ->
+ [B1|T];
+enint(N, Acc) ->
+ enint(N bsr 8, [N band 16#ff|Acc]).
+
+%% used for signed positive values
+
+%eint(Val, Ack) ->
+% X = Val band 255,
+% Next = Val bsr 8,
+% if
+% Next == 0, X >= 127 ->
+% [0,X|Ack];
+% Next == 0 ->
+% [X|Ack];
+% true ->
+% eint(Next,[X|Ack])
+% end.
+
+%%% used for signed negative values
+%enint(Val, Acc) ->
+% NumOctets = if
+% -Val < 16#80 -> 1;
+% -Val < 16#8000 ->2;
+% -Val < 16#800000 ->3;
+% -Val < 16#80000000 ->4;
+% -Val < 16#8000000000 ->5;
+% -Val < 16#800000000000 ->6;
+% -Val < 16#80000000000000 ->7;
+% -Val < 16#8000000000000000 ->8;
+% -Val < 16#800000000000000000 ->9
+% end,
+% enint(Val,Acc,NumOctets).
+
+%enint(Val, Acc,0) ->
+% Acc;
+%enint(Val, Acc,NumOctets) ->
+% enint(Val bsr 8,[Val band 255|Acc],NumOctets-1).
+
+
+decode_unconstrained_number(Bytes) ->
+ {Len,Bytes2} = decode_length(Bytes,undefined),
+ {Ints,Bytes3} = getoctets_as_list(Bytes2,Len),
+ {dec_integer(Ints),Bytes3}.
+
+dec_pos_integer(Ints) ->
+ decpint(Ints, 8 * (length(Ints) - 1)).
+dec_integer(Ints) when hd(Ints) band 255 =< 127 -> %% Positive number
+ decpint(Ints, 8 * (length(Ints) - 1));
+dec_integer(Ints) -> %% Negative
+ decnint(Ints, 8 * (length(Ints) - 1)).
+
+decpint([Byte|Tail], Shift) ->
+ (Byte bsl Shift) bor decpint(Tail, Shift-8);
+decpint([], _) -> 0.
+
+decnint([Byte|Tail], Shift) ->
+ (-128 + (Byte band 127) bsl Shift) bor decpint(Tail, Shift-8).
+
+minimum_octets(Val) ->
+ minimum_octets(Val,[]).
+
+minimum_octets(Val,Acc) when Val > 0 ->
+ minimum_octets((Val bsr 8),[Val band 16#FF|Acc]);
+minimum_octets(0,Acc) ->
+ Acc.
+
+
+%% X.691:10.9 Encoding of a length determinant
+%%encode_small_length(undefined,Len) -> % null means no UpperBound
+%% encode_small_number(Len).
+
+%% X.691:10.9.3.5
+%% X.691:10.9.3.7
+encode_length(undefined,Len) -> % un-constrained
+ if
+ Len < 128 ->
+ {octet,Len band 16#7F};
+ Len < 16384 ->
+ {octets,2,2#1000000000000000 bor Len};
+ true ->
+ exit({error,{asn1,{encode_length,{nyi,above_16k}}}})
+ end;
+
+encode_length({0,'MAX'},Len) ->
+ encode_length(undefined,Len);
+encode_length({Lb,Ub},Len) when Ub =< 65535 ,Lb >= 0 -> % constrained
+ encode_constrained_number({Lb,Ub},Len);
+encode_length({{Lb,Ub},[]},Len) when Ub =< 65535 ,Lb >= 0 ->
+ %% constrained extensible
+ [{bit,0},encode_constrained_number({Lb,Ub},Len)];
+encode_length(SingleValue,_) when integer(SingleValue) ->
+ [].
+
+encode_small_length(Len) when Len =< 64 ->
+ [{bit,0},{bits,6,Len-1}];
+encode_small_length(Len) ->
+ [{bit,1},encode_length(undefined,Len)].
+
+decode_small_length(Buffer) ->
+ case getbit(Buffer) of
+ {0,Remain} ->
+ {Bits,Remain2} = getbits(Remain,6),
+ {Bits+1,Remain2};
+ {1,Remain} ->
+ decode_length(Remain,undefined)
+ end.
+
+decode_length(Buffer) ->
+ decode_length(Buffer,undefined).
+
+decode_length(Buffer,undefined) -> % un-constrained
+ Buffer2 = align(Buffer),
+ {Bits,_} = getbits(Buffer2,2),
+ case Bits of
+ 2 ->
+ {Val,Bytes3} = getoctets(Buffer2,2),
+ {(Val band 16#3FFF),Bytes3};
+ 3 ->
+ exit({error,{asn1,{decode_length,{nyi,above_16k}}}});
+ _ ->
+ {Val,Bytes3} = getoctet(Buffer2),
+ {Val band 16#7F,Bytes3}
+ end;
+
+decode_length(Buffer,{Lb,Ub}) when Ub =< 65535 ,Lb >= 0 -> % constrained
+ decode_constrained_number(Buffer,{Lb,Ub});
+
+decode_length(Buffer,{{Lb,Ub},[]}) ->
+ case getbit(Buffer) of
+ {0,Buffer2} ->
+ decode_length(Buffer2, {Lb,Ub})
+ end;
+ % X.691:10.9.3.5
+decode_length(Buffer,{_,_Lb,_Ub}) -> %when Len =< 127 -> % Unconstrained or large Ub
+ case getbit(Buffer) of
+ {0,Remain} ->
+ getbits(Remain,7);
+ {1,_Remain} ->
+ {Val,Remain2} = getoctets(Buffer,2),
+ {Val band 2#0111111111111111, Remain2}
+ end;
+decode_length(Buffer,SingleValue) when integer(SingleValue) ->
+ {SingleValue,Buffer}.
+
+
+% X.691:11
+encode_boolean({Name,Val}) when atom(Name) ->
+ encode_boolean(Val);
+encode_boolean(true) ->
+ {bit,1};
+encode_boolean(false) ->
+ {bit,0};
+encode_boolean(Val) ->
+ exit({error,{asn1,{encode_boolean,Val}}}).
+
+
+decode_boolean(Buffer) -> %when record(Buffer,buffer)
+ case getbit(Buffer) of
+ {1,Remain} -> {true,Remain};
+ {0,Remain} -> {false,Remain}
+ end.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% X.691:12
+%% ENUMERATED
+%%
+%% encode_enumerated(C,Value,NamedNumberTup) -> CompleteList
+%%
+%%
+
+encode_enumerated(C,{Name,Value},NamedNumberList) when
+ atom(Name),list(NamedNumberList) ->
+ encode_enumerated(C,Value,NamedNumberList);
+
+%% ENUMERATED with extension mark
+encode_enumerated(_C,{asn1_enum,Value},{_Nlist1,Nlist2}) when Value >= length(Nlist2) ->
+ [{bit,1},encode_small_number(Value)];
+encode_enumerated(C,Value,{Nlist1,Nlist2}) ->
+ case enum_search(Value,Nlist1,0) of
+ NewV when integer(NewV) ->
+ [{bit,0},encode_integer(C,NewV)];
+ false ->
+ case enum_search(Value,Nlist2,0) of
+ ExtV when integer(ExtV) ->
+ [{bit,1},encode_small_number(ExtV)];
+ false ->
+ exit({error,{asn1,{encode_enumerated,Value}}})
+ end
+ end;
+
+encode_enumerated(C,Value,NamedNumberList) when list(NamedNumberList) ->
+ case enum_search(Value,NamedNumberList,0) of
+ NewV when integer(NewV) ->
+ encode_integer(C,NewV);
+ false ->
+ exit({error,{asn1,{encode_enumerated,Value}}})
+ end.
+
+%% returns the ordinal number from 0 ,1 ... in the list where Name is found
+%% or false if not found
+%%
+enum_search(Name,[Name|_NamedNumberList],Acc) ->
+ Acc;
+enum_search(Name,[_H|T],Acc) ->
+ enum_search(Name,T,Acc+1);
+enum_search(_,[],_) ->
+ false. % name not found !error
+
+%% ENUMERATED with extension marker
+decode_enumerated(Buffer,C,{Ntup1,Ntup2}) when tuple(Ntup1), tuple(Ntup2) ->
+ {Ext,Buffer2} = getext(Buffer),
+ case Ext of
+ 0 -> % not an extension value
+ {Val,Buffer3} = decode_integer(Buffer2,C),
+ case catch (element(Val+1,Ntup1)) of
+ NewVal when atom(NewVal) -> {NewVal,Buffer3};
+ _Error -> exit({error,{asn1,{decode_enumerated,{Val,[Ntup1,Ntup2]}}}})
+ end;
+ 1 -> % this an extension value
+ {Val,Buffer3} = decode_small_number(Buffer2),
+ case catch (element(Val+1,Ntup2)) of
+ NewVal when atom(NewVal) -> {NewVal,Buffer3};
+ _ -> {{asn1_enum,Val},Buffer3}
+ end
+ end;
+
+decode_enumerated(Buffer,C,NamedNumberTup) when tuple(NamedNumberTup) ->
+ {Val,Buffer2} = decode_integer(Buffer,C),
+ case catch (element(Val+1,NamedNumberTup)) of
+ NewVal when atom(NewVal) -> {NewVal,Buffer2};
+ _Error -> exit({error,{asn1,{decode_enumerated,{Val,NamedNumberTup}}}})
+ end.
+
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+%% Bitstring value, ITU_T X.690 Chapter 8.5
+%%===============================================================================
+%%===============================================================================
+%%===============================================================================
+
+%%===============================================================================
+%% encode bitstring value
+%%===============================================================================
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% bitstring NamedBitList
+%% Val can be of:
+%% - [identifiers] where only named identifers are set to one,
+%% the Constraint must then have some information of the
+%% bitlength.
+%% - [list of ones and zeroes] all bits
+%% - integer value representing the bitlist
+%% C is constraint Len, only valid when identifiers
+
+
+%% when the value is a list of {Unused,BinBits}, where
+%% Unused = integer(),
+%% BinBits = binary().
+encode_bit_string(C,Bin={Unused,BinBits},NamedBitList) when integer(Unused),
+ binary(BinBits) ->
+ encode_bin_bit_string(C,Bin,NamedBitList);
+
+%% when the value is a list of named bits
+encode_bit_string(C, [FirstVal | RestVal], NamedBitList) when atom(FirstVal) ->
+ ToSetPos = get_all_bitposes([FirstVal | RestVal], NamedBitList, []),
+ BitList = make_and_set_list(ToSetPos,0),
+ encode_bit_string(C,BitList,NamedBitList);
+
+encode_bit_string(C, [{bit,No} | RestVal], NamedBitList) ->
+ ToSetPos = get_all_bitposes([{bit,No} | RestVal], NamedBitList, []),
+ BitList = make_and_set_list(ToSetPos,0),
+ encode_bit_string(C,BitList,NamedBitList);
+
+%% when the value is a list of ones and zeroes
+
+encode_bit_string(C, BitListValue, NamedBitList) when list(BitListValue) ->
+ Bl1 =
+ case NamedBitList of
+ [] -> % dont remove trailing zeroes
+ BitListValue;
+ _ -> % first remove any trailing zeroes
+ lists:reverse(lists:dropwhile(fun(0)->true;(1)->false end,
+ lists:reverse(BitListValue)))
+ end,
+ BitList = [{bit,X} || X <- Bl1],
+ BListLen = length(BitList),
+ case get_constraint(C,'SizeConstraint') of
+ 0 -> % fixed length
+ []; % nothing to encode
+ V when integer(V),V=<16 -> % fixed length 16 bits or less
+ pad_list(V,BitList);
+ V when integer(V) -> % fixed length 16 bits or less
+ [align,pad_list(V,BitList)];
+ {Lb,Ub} when integer(Lb),integer(Ub),BListLen<Lb ->
+ %% padding due to OTP-4353
+ [encode_length({Lb,Ub},Lb),align,pad_list(Lb,BitList)];
+ {Lb,Ub} when integer(Lb),integer(Ub) ->
+ [encode_length({Lb,Ub},length(BitList)),align,BitList];
+ no ->
+ [encode_length(undefined,length(BitList)),align,BitList];
+ Sc={{Lb,Ub},_} when integer(Lb),integer(Ub),BListLen<Lb ->
+ %% padding due to OTP-4353
+ [encode_length(Sc,Lb),align,pad_list(Lb,BitList)];
+ Sc -> % extension marker
+ [encode_length(Sc,length(BitList)),align,BitList]
+ end;
+
+%% when the value is an integer
+encode_bit_string(C, IntegerVal, NamedBitList) when integer(IntegerVal)->
+ BitList = int_to_bitlist(IntegerVal),
+ encode_bit_string(C,BitList,NamedBitList);
+
+%% when the value is a tuple
+encode_bit_string(C,{Name,Val}, NamedBitList) when atom(Name) ->
+ encode_bit_string(C,Val,NamedBitList).
+
+
+%% encode_bin_bit_string/3, when value is a tuple of Unused and BinBits.
+%% Unused = integer(),
+%% BinBits = binary().
+
+encode_bin_bit_string(C,{Unused,BinBits},NamedBitList) ->
+ RemoveZerosIfNNL =
+ fun({NNL,BitList}) ->
+ case NNL of
+ [] -> BitList;
+ _ ->
+ lists:reverse(
+ lists:dropwhile(fun(0)->true;(1)->false end,
+ lists:reverse(BitList)))
+ end
+ end,
+ {OctetList,OLSize,LastBits} =
+ case size(BinBits) of
+ N when N>1 ->
+ IntList = binary_to_list(BinBits),
+ [H|T] = lists:reverse(IntList),
+ Bl1 = RemoveZerosIfNNL({NamedBitList,lists:reverse(int_to_bitlist(H,8-Unused))}),% lists:sublist obsolete if trailing bits are zero !
+ {[{octet,X} || X <- lists:reverse(T)],size(BinBits)-1,
+ [{bit,X} || X <- Bl1]};
+ 1 ->
+ <<B7:1,B6:1,B5:1,B4:1,B3:1,B2:1,B1:1,B0:1>> = BinBits,
+ {[],0,[{bit,X} || X <- lists:sublist([B7,B6,B5,B4,B3,B2,B1,B0],8-Unused)]};
+ _ ->
+ {[],0,[]}
+ end,
+ case get_constraint(C,'SizeConstraint') of
+ 0 ->
+ [];
+ V when integer(V),V=<16 ->
+ [OctetList, pad_list(V,LastBits)];
+ V when integer(V) ->
+% [OctetList, align, pad_list(V rem 8,LastBits)];
+ [align,OctetList, pad_list(V rem 8,LastBits)];
+ {Lb,Ub} when integer(Lb),integer(Ub) ->
+ NewLastBits = maybe_pad(Lb,length(LastBits)+(OLSize*8),LastBits,NamedBitList),
+ [encode_length({Lb,Ub},length(NewLastBits)+(OLSize*8)),
+% OctetList,align,LastBits];
+ align,OctetList,NewLastBits];
+ no ->
+ [encode_length(undefined,length(LastBits)+(OLSize*8)),
+% OctetList,align,LastBits];
+ align,OctetList,LastBits];
+ Sc={{Lb,_},_} when integer(Lb) ->
+ NewLastBits = maybe_pad(Lb,length(LastBits)+(OLSize*8),LastBits,NamedBitList),
+ [encode_length(Sc,length(NewLastBits)+(OLSize*8)),
+ align,OctetList,NewLastBits];
+ Sc ->
+ [encode_length(Sc,length(LastBits)+(OLSize*8)),
+% OctetList,align,LastBits]
+ align,OctetList,LastBits]
+ end.
+
+maybe_pad(_,_,Bits,[]) ->
+ Bits;
+maybe_pad(Lb,LenBits,Bits,_) when Lb>LenBits ->
+ pad_list(Lb,Bits);
+maybe_pad(_,_,Bits,_) ->
+ Bits.
+
+%%%%%%%%%%%%%%%
+%% The result is presented as a list of named bits (if possible)
+%% else as a tuple {Unused,Bits}. Unused is the number of unused
+%% bits, least significant bits in the last byte of Bits. Bits is
+%% the BIT STRING represented as a binary.
+%%
+decode_compact_bit_string(Buffer, C, NamedNumberList) ->
+ case get_constraint(C,'SizeConstraint') of
+ 0 -> % fixed length
+ {{0,<<>>},Buffer};
+ V when integer(V),V=<16 -> %fixed length 16 bits or less
+ compact_bit_string(Buffer,V,NamedNumberList);
+ V when integer(V) -> %fixed length > 16 bits
+ Bytes2 = align(Buffer),
+ compact_bit_string(Bytes2,V,NamedNumberList);
+ {Lb,Ub} when integer(Lb),integer(Ub) ->
+ {Len,Bytes2} = decode_length(Buffer,{Lb,Ub}),
+ Bytes3 = align(Bytes2),
+ compact_bit_string(Bytes3,Len,NamedNumberList);
+ no ->
+ {Len,Bytes2} = decode_length(Buffer,undefined),
+ Bytes3 = align(Bytes2),
+ compact_bit_string(Bytes3,Len,NamedNumberList);
+ Sc ->
+ {Len,Bytes2} = decode_length(Buffer,Sc),
+ Bytes3 = align(Bytes2),
+ compact_bit_string(Bytes3,Len,NamedNumberList)
+ end.
+
+
+%%%%%%%%%%%%%%%
+%% The result is presented as a list of named bits (if possible)
+%% else as a list of 0 and 1.
+%%
+decode_bit_string(Buffer, C, NamedNumberList) ->
+ case get_constraint(C,'SizeConstraint') of
+ 0 -> % fixed length
+ {[],Buffer}; % nothing to encode
+ V when integer(V),V=<16 -> % fixed length 16 bits or less
+ bit_list_to_named(Buffer,V,NamedNumberList);
+ V when integer(V) -> % fixed length 16 bits or less
+ Bytes2 = align(Buffer),
+ bit_list_to_named(Bytes2,V,NamedNumberList);
+ {Lb,Ub} when integer(Lb),integer(Ub) ->
+ {Len,Bytes2} = decode_length(Buffer,{Lb,Ub}),
+ Bytes3 = align(Bytes2),
+ bit_list_to_named(Bytes3,Len,NamedNumberList);
+ no ->
+ {Len,Bytes2} = decode_length(Buffer,undefined),
+ Bytes3 = align(Bytes2),
+ bit_list_to_named(Bytes3,Len,NamedNumberList);
+ Sc -> % extension marker
+ {Len,Bytes2} = decode_length(Buffer,Sc),
+ Bytes3 = align(Bytes2),
+ bit_list_to_named(Bytes3,Len,NamedNumberList)
+ end.
+
+
+%% if no named bits are declared we will return a
+%% {Unused,Bits}. Unused = integer(),
+%% Bits = binary().
+compact_bit_string(Buffer,Len,[]) ->
+ getbits_as_binary(Len,Buffer); % {{Unused,BinBits},NewBuffer}
+compact_bit_string(Buffer,Len,NamedNumberList) ->
+ bit_list_to_named(Buffer,Len,NamedNumberList).
+
+
+%% if no named bits are declared we will return a
+%% BitList = [0 | 1]
+
+bit_list_to_named(Buffer,Len,[]) ->
+ getbits_as_list(Len,Buffer);
+
+%% if there are named bits declared we will return a named
+%% BitList where the names are atoms and unnamed bits represented
+%% as {bit,Pos}
+%% BitList = [atom() | {bit,Pos}]
+%% Pos = integer()
+
+bit_list_to_named(Buffer,Len,NamedNumberList) ->
+ {BitList,Rest} = getbits_as_list(Len,Buffer),
+ {bit_list_to_named1(0,BitList,NamedNumberList,[]), Rest}.
+
+bit_list_to_named1(Pos,[0|Bt],Names,Acc) ->
+ bit_list_to_named1(Pos+1,Bt,Names,Acc);
+bit_list_to_named1(Pos,[1|Bt],Names,Acc) ->
+ case lists:keysearch(Pos,2,Names) of
+ {value,{Name,_}} ->
+ bit_list_to_named1(Pos+1,Bt,Names,[Name|Acc]);
+ _ ->
+ bit_list_to_named1(Pos+1,Bt,Names,[{bit,Pos}|Acc])
+ end;
+bit_list_to_named1(_Pos,[],_Names,Acc) ->
+ lists:reverse(Acc).
+
+
+
+%%%%%%%%%%%%%%%
+%%
+
+int_to_bitlist(0) ->
+ [];
+int_to_bitlist(Int) when integer(Int), Int >= 0 ->
+ [Int band 1 | int_to_bitlist(Int bsr 1)].
+
+int_to_bitlist(_Int,0) ->
+ [];
+int_to_bitlist(0,N) ->
+ [0|int_to_bitlist(0,N-1)];
+int_to_bitlist(Int,N) ->
+ [Int band 1 | int_to_bitlist(Int bsr 1, N-1)].
+
+
+%%%%%%%%%%%%%%%%%%
+%% get_all_bitposes([list of named bits to set], named_bit_db, []) ->
+%% [sorted_list_of_bitpositions_to_set]
+
+get_all_bitposes([{bit,ValPos}|Rest], NamedBitList, Ack) ->
+ get_all_bitposes(Rest, NamedBitList, [ValPos | Ack ]);
+
+get_all_bitposes([Val | Rest], NamedBitList, Ack) ->
+ case lists:keysearch(Val, 1, NamedBitList) of
+ {value, {_ValName, ValPos}} ->
+ get_all_bitposes(Rest, NamedBitList, [ValPos | Ack]);
+ _ ->
+ exit({error,{asn1, {bitstring_namedbit, Val}}})
+ end;
+get_all_bitposes([], _NamedBitList, Ack) ->
+ lists:sort(Ack).
+
+%%%%%%%%%%%%%%%%%%
+%% make_and_set_list([list of positions to set to 1])->
+%% returns list with all in SetPos set.
+%% in positioning in list the first element is 0, the second 1 etc.., but
+%%
+
+make_and_set_list([XPos|SetPos], XPos) ->
+ [1 | make_and_set_list(SetPos, XPos + 1)];
+make_and_set_list([Pos|SetPos], XPos) ->
+ [0 | make_and_set_list([Pos | SetPos], XPos + 1)];
+make_and_set_list([], _XPos) ->
+ [].
+
+%%%%%%%%%%%%%%%%%
+%% pad_list(N,BitList) -> PaddedList
+%% returns a padded (with trailing {bit,0} elements) list of length N
+%% if Bitlist contains more than N significant bits set an exit asn1_error
+%% is generated
+
+pad_list(0,BitList) ->
+ case BitList of
+ [] -> [];
+ _ -> exit({error,{asn1,{range_error,{bit_string,BitList}}}})
+ end;
+pad_list(N,[Bh|Bt]) ->
+ [Bh|pad_list(N-1,Bt)];
+pad_list(N,[]) ->
+ [{bit,0},pad_list(N-1,[])].
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% X.691:16
+%% encode_octet_string(Constraint,ExtensionMarker,Val)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+encode_octet_string(C,{Name,Val}) when atom(Name) ->
+ encode_octet_string(C,false,Val);
+encode_octet_string(C,Val) ->
+ encode_octet_string(C,false,Val).
+
+encode_octet_string(C,Bool,{_Name,Val}) ->
+ encode_octet_string(C,Bool,Val);
+encode_octet_string(_,true,_) ->
+ exit({error,{asn1,{'not_supported',extensionmarker}}});
+encode_octet_string(C,false,Val) ->
+ case get_constraint(C,'SizeConstraint') of
+ 0 ->
+ [];
+ 1 ->
+ [V] = Val,
+ {bits,8,V};
+ 2 ->
+ [V1,V2] = Val,
+ [{bits,8,V1},{bits,8,V2}];
+ Sv when Sv =<65535, Sv == length(Val) -> % fixed length
+ [align,{octets,Val}];
+ {Lb,Ub} ->
+ [encode_length({Lb,Ub},length(Val)),align,
+ {octets,Val}];
+ Sv when list(Sv) ->
+ [encode_length({hd(Sv),lists:max(Sv)},length(Val)),align,
+ {octets,Val}];
+ no ->
+ [encode_length(undefined,length(Val)),align,
+ {octets,Val}]
+ end.
+
+decode_octet_string(Bytes,Range) ->
+ decode_octet_string(Bytes,Range,false).
+
+decode_octet_string(Bytes,C,false) ->
+ case get_constraint(C,'SizeConstraint') of
+ 0 ->
+ {[],Bytes};
+ 1 ->
+ {B1,Bytes2} = getbits(Bytes,8),
+ {[B1],Bytes2};
+ 2 ->
+ {B1,Bytes2}= getbits(Bytes,8),
+ {B2,Bytes3}= getbits(Bytes2,8),
+ {[B1,B2],Bytes3};
+ {_,0} ->
+ {[],Bytes};
+ Sv when integer(Sv), Sv =<65535 -> % fixed length
+ Bytes2 = align(Bytes),
+ getoctets_as_list(Bytes2,Sv);
+ {Lb,Ub} ->
+ {Len,Bytes2} = decode_length(Bytes,{Lb,Ub}),
+ Bytes3 = align(Bytes2),
+ getoctets_as_list(Bytes3,Len);
+ Sv when list(Sv) ->
+ {Len,Bytes2} = decode_length(Bytes,{hd(Sv),lists:max(Sv)}),
+ Bytes3 = align(Bytes2),
+ getoctets_as_list(Bytes3,Len);
+ no ->
+ {Len,Bytes2} = decode_length(Bytes,undefined),
+ Bytes3 = align(Bytes2),
+ getoctets_as_list(Bytes3,Len)
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Restricted char string types
+%% (NumericString, PrintableString,VisibleString,IA5String,BMPString,UniversalString)
+%% X.691:26 and X.680:34-36
+%%encode_restricted_string(aligned,'BMPString',Constraints,Extension,Val)
+
+
+encode_restricted_string(aligned,{Name,Val}) when atom(Name) ->
+ encode_restricted_string(aligned,Val);
+
+encode_restricted_string(aligned,Val) when list(Val)->
+ [encode_length(undefined,length(Val)),align,
+ {octets,Val}].
+
+encode_known_multiplier_string(aligned,StringType,C,_Ext,{Name,Val}) when atom(Name) ->
+ encode_known_multiplier_string(aligned,StringType,C,false,Val);
+
+encode_known_multiplier_string(aligned,StringType,C,_Ext,Val) ->
+ Result = chars_encode(C,StringType,Val),
+ NumBits = get_NumBits(C,StringType),
+ case get_constraint(C,'SizeConstraint') of
+ Ub when integer(Ub), Ub*NumBits =< 16 ->
+ case {StringType,Result} of
+ {'BMPString',{octets,Ol}} ->
+ [{bits,8,Oct}||Oct <- Ol];
+ _ ->
+ Result
+ end;
+ 0 ->
+ [];
+ Ub when integer(Ub),Ub =<65535 -> % fixed length
+ [align,Result];
+ {Ub,Lb} ->
+ [encode_length({Ub,Lb},length(Val)),align,Result];
+ Vl when list(Vl) ->
+ [encode_length({lists:min(Vl),lists:max(Vl)},length(Val)),align,Result];
+ no ->
+ [encode_length(undefined,length(Val)),align,Result]
+ end.
+
+decode_restricted_string(Bytes,aligned) ->
+ {Len,Bytes2} = decode_length(Bytes,undefined),
+ Bytes3 = align(Bytes2),
+ getoctets_as_list(Bytes3,Len).
+
+decode_known_multiplier_string(Bytes,aligned,StringType,C,_Ext) ->
+ NumBits = get_NumBits(C,StringType),
+ case get_constraint(C,'SizeConstraint') of
+ Ub when integer(Ub), Ub*NumBits =< 16 ->
+ chars_decode(Bytes,NumBits,StringType,C,Ub);
+ Ub when integer(Ub),Ub =<65535 -> % fixed length
+ Bytes1 = align(Bytes),
+ chars_decode(Bytes1,NumBits,StringType,C,Ub);
+ 0 ->
+ {[],Bytes};
+ Vl when list(Vl) ->
+ {Len,Bytes1} = decode_length(Bytes,{hd(Vl),lists:max(Vl)}),
+ Bytes2 = align(Bytes1),
+ chars_decode(Bytes2,NumBits,StringType,C,Len);
+ no ->
+ {Len,Bytes1} = decode_length(Bytes,undefined),
+ Bytes2 = align(Bytes1),
+ chars_decode(Bytes2,NumBits,StringType,C,Len);
+ {Lb,Ub}->
+ {Len,Bytes1} = decode_length(Bytes,{Lb,Ub}),
+ Bytes2 = align(Bytes1),
+ chars_decode(Bytes2,NumBits,StringType,C,Len)
+ end.
+
+
+encode_NumericString(C,Val) ->
+ encode_known_multiplier_string(aligned,'NumericString',C,false,Val).
+decode_NumericString(Bytes,C) ->
+ decode_known_multiplier_string(Bytes,aligned,'NumericString',C,false).
+
+encode_PrintableString(C,Val) ->
+ encode_known_multiplier_string(aligned,'PrintableString',C,false,Val).
+decode_PrintableString(Bytes,C) ->
+ decode_known_multiplier_string(Bytes,aligned,'PrintableString',C,false).
+
+encode_VisibleString(C,Val) -> % equivalent with ISO646String
+ encode_known_multiplier_string(aligned,'VisibleString',C,false,Val).
+decode_VisibleString(Bytes,C) ->
+ decode_known_multiplier_string(Bytes,aligned,'VisibleString',C,false).
+
+encode_IA5String(C,Val) ->
+ encode_known_multiplier_string(aligned,'IA5String',C,false,Val).
+decode_IA5String(Bytes,C) ->
+ decode_known_multiplier_string(Bytes,aligned,'IA5String',C,false).
+
+encode_BMPString(C,Val) ->
+ encode_known_multiplier_string(aligned,'BMPString',C,false,Val).
+decode_BMPString(Bytes,C) ->
+ decode_known_multiplier_string(Bytes,aligned,'BMPString',C,false).
+
+encode_UniversalString(C,Val) ->
+ encode_known_multiplier_string(aligned,'UniversalString',C,false,Val).
+decode_UniversalString(Bytes,C) ->
+ decode_known_multiplier_string(Bytes,aligned,'UniversalString',C,false).
+
+%% end of known-multiplier strings for which PER visible constraints are
+%% applied
+
+encode_GeneralString(_C,Val) ->
+ encode_restricted_string(aligned,Val).
+decode_GeneralString(Bytes,_C) ->
+ decode_restricted_string(Bytes,aligned).
+
+encode_GraphicString(_C,Val) ->
+ encode_restricted_string(aligned,Val).
+decode_GraphicString(Bytes,_C) ->
+ decode_restricted_string(Bytes,aligned).
+
+encode_ObjectDescriptor(_C,Val) ->
+ encode_restricted_string(aligned,Val).
+decode_ObjectDescriptor(Bytes) ->
+ decode_restricted_string(Bytes,aligned).
+
+encode_TeletexString(_C,Val) -> % equivalent with T61String
+ encode_restricted_string(aligned,Val).
+decode_TeletexString(Bytes,_C) ->
+ decode_restricted_string(Bytes,aligned).
+
+encode_VideotexString(_C,Val) ->
+ encode_restricted_string(aligned,Val).
+decode_VideotexString(Bytes,_C) ->
+ decode_restricted_string(Bytes,aligned).
+
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% getBMPChars(Bytes,Len) ->{BMPcharList,RemainingBytes}
+%%
+getBMPChars(Bytes,1) ->
+ {O1,Bytes2} = getbits(Bytes,8),
+ {O2,Bytes3} = getbits(Bytes2,8),
+ if
+ O1 == 0 ->
+ {[O2],Bytes3};
+ true ->
+ {[{0,0,O1,O2}],Bytes3}
+ end;
+getBMPChars(Bytes,Len) ->
+ getBMPChars(Bytes,Len,[]).
+
+getBMPChars(Bytes,0,Acc) ->
+ {lists:reverse(Acc),Bytes};
+getBMPChars(Bytes,Len,Acc) ->
+ {Octs,Bytes1} = getoctets_as_list(Bytes,2),
+ case Octs of
+ [0,O2] ->
+ getBMPChars(Bytes1,Len-1,[O2|Acc]);
+ [O1,O2]->
+ getBMPChars(Bytes1,Len-1,[{0,0,O1,O2}|Acc])
+ end.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% chars_encode(C,StringType,Value) -> ValueList
+%%
+%% encodes chars according to the per rules taking the constraint PermittedAlphabet
+%% into account.
+%% This function does only encode the value part and NOT the length
+
+chars_encode(C,StringType,Value) ->
+ case {StringType,get_constraint(C,'PermittedAlphabet')} of
+ {'UniversalString',{_,_Sv}} ->
+ exit({error,{asn1,{'not implemented',"UniversalString with PermittedAlphabet constraint"}}});
+ {'BMPString',{_,_Sv}} ->
+ exit({error,{asn1,{'not implemented',"BMPString with PermittedAlphabet constraint"}}});
+ _ ->
+ {NumBits,CharOutTab} = {get_NumBits(C,StringType),get_CharOutTab(C,StringType)},
+ chars_encode2(Value,NumBits,CharOutTab)
+ end.
+
+chars_encode2([H|T],NumBits,{Min,Max,notab}) when H =< Max, H >= Min ->
+ [{bits,NumBits,H-Min}|chars_encode2(T,NumBits,{Min,Max,notab})];
+chars_encode2([H|T],NumBits,{Min,Max,Tab}) when H =< Max, H >= Min ->
+ [{bits,NumBits,element(H-Min+1,Tab)}|chars_encode2(T,NumBits,{Min,Max,Tab})];
+chars_encode2([{A,B,C,D}|T],NumBits,{Min,Max,notab}) ->
+ %% no value range check here (ought to be, but very expensive)
+% [{bits,NumBits,(A*B*C*D)-Min}|chars_encode2(T,NumBits,{Min,Max,notab})];
+ [{bits,NumBits,((((((A bsl 8) + B) bsl 8) + C) bsl 8) + D)-Min}|chars_encode2(T,NumBits,{Min,Max,notab})];
+chars_encode2([{A,B,C,D}|T],NumBits,{Min,Max,Tab}) ->
+ %% no value range check here (ought to be, but very expensive)
+% [{bits,NumBits,element((A*B*C*D)-Min,Tab)}|chars_encode2(T,NumBits,{Min,Max,notab})];
+ [{bits,NumBits,element(((((((A bsl 8)+B) bsl 8)+C) bsl 8)+D)-Min,Tab)}|chars_encode2(T,NumBits,{Min,Max,notab})];
+chars_encode2([H|_T],_,{_,_,_}) ->
+ exit({error,{asn1,{illegal_char_value,H}}});
+chars_encode2([],_,_) ->
+ [].
+
+
+get_NumBits(C,StringType) ->
+ case get_constraint(C,'PermittedAlphabet') of
+ {'SingleValue',Sv} ->
+ charbits(length(Sv),aligned);
+ no ->
+ case StringType of
+ 'IA5String' ->
+ charbits(128,aligned); % 16#00..16#7F
+ 'VisibleString' ->
+ charbits(95,aligned); % 16#20..16#7E
+ 'PrintableString' ->
+ charbits(74,aligned); % [$\s,$',$(,$),$+,$,,$-,$.,$/,"0123456789",$:,$=,$?,$A..$Z,$a..$z
+ 'NumericString' ->
+ charbits(11,aligned); % $ ,"0123456789"
+ 'UniversalString' ->
+ 32;
+ 'BMPString' ->
+ 16
+ end
+ end.
+
+%%Maybe used later
+%%get_MaxChar(C,StringType) ->
+%% case get_constraint(C,'PermittedAlphabet') of
+%% {'SingleValue',Sv} ->
+%% lists:nth(length(Sv),Sv);
+%% no ->
+%% case StringType of
+%% 'IA5String' ->
+%% 16#7F; % 16#00..16#7F
+%% 'VisibleString' ->
+%% 16#7E; % 16#20..16#7E
+%% 'PrintableString' ->
+%% $z; % [$\s,$',$(,$),$+,$,,$-,$.,$/,"0123456789",$:,$=,$?,$A..$Z,$a..$z
+%% 'NumericString' ->
+%% $9; % $ ,"0123456789"
+%% 'UniversalString' ->
+%% 16#ffffffff;
+%% 'BMPString' ->
+%% 16#ffff
+%% end
+%% end.
+
+%%Maybe used later
+%%get_MinChar(C,StringType) ->
+%% case get_constraint(C,'PermittedAlphabet') of
+%% {'SingleValue',Sv} ->
+%% hd(Sv);
+%% no ->
+%% case StringType of
+%% 'IA5String' ->
+%% 16#00; % 16#00..16#7F
+%% 'VisibleString' ->
+%% 16#20; % 16#20..16#7E
+%% 'PrintableString' ->
+%% $\s; % [$\s,$',$(,$),$+,$,,$-,$.,$/,"0123456789",$:,$=,$?,$A..$Z,$a..$z
+%% 'NumericString' ->
+%% $\s; % $ ,"0123456789"
+%% 'UniversalString' ->
+%% 16#00;
+%% 'BMPString' ->
+%% 16#00
+%% end
+%% end.
+
+get_CharOutTab(C,StringType) ->
+ get_CharTab(C,StringType,out).
+
+get_CharInTab(C,StringType) ->
+ get_CharTab(C,StringType,in).
+
+get_CharTab(C,StringType,InOut) ->
+ case get_constraint(C,'PermittedAlphabet') of
+ {'SingleValue',Sv} ->
+ get_CharTab2(C,StringType,hd(Sv),lists:max(Sv),Sv,InOut);
+ no ->
+ case StringType of
+ 'IA5String' ->
+ {0,16#7F,notab};
+ 'VisibleString' ->
+ get_CharTab2(C,StringType,16#20,16#7F,notab,InOut);
+ 'PrintableString' ->
+ Chars = lists:sort(
+ " '()+,-./0123456789:=?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"),
+ get_CharTab2(C,StringType,hd(Chars),lists:max(Chars),Chars,InOut);
+ 'NumericString' ->
+ get_CharTab2(C,StringType,16#20,$9," 0123456789",InOut);
+ 'UniversalString' ->
+ {0,16#FFFFFFFF,notab};
+ 'BMPString' ->
+ {0,16#FFFF,notab}
+ end
+ end.
+
+get_CharTab2(C,StringType,Min,Max,Chars,InOut) ->
+ BitValMax = (1 bsl get_NumBits(C,StringType))-1,
+ if
+ Max =< BitValMax ->
+ {0,Max,notab};
+ true ->
+ case InOut of
+ out ->
+ {Min,Max,create_char_tab(Min,Chars)};
+ in ->
+ {Min,Max,list_to_tuple(Chars)}
+ end
+ end.
+
+create_char_tab(Min,L) ->
+ list_to_tuple(create_char_tab(Min,L,0)).
+create_char_tab(Min,[Min|T],V) ->
+ [V|create_char_tab(Min+1,T,V+1)];
+create_char_tab(_Min,[],_V) ->
+ [];
+create_char_tab(Min,L,V) ->
+ [false|create_char_tab(Min+1,L,V)].
+
+%% This very inefficient and should be moved to compiletime
+charbits(NumOfChars,aligned) ->
+ case charbits(NumOfChars) of
+ 1 -> 1;
+ 2 -> 2;
+ B when B > 2, B =< 4 -> 4;
+ B when B > 4, B =< 8 -> 8;
+ B when B > 8, B =< 16 -> 16;
+ B when B > 16, B =< 32 -> 32
+ end.
+
+charbits(NumOfChars) when NumOfChars =< 2 -> 1;
+charbits(NumOfChars) when NumOfChars =< 4 -> 2;
+charbits(NumOfChars) when NumOfChars =< 8 -> 3;
+charbits(NumOfChars) when NumOfChars =< 16 -> 4;
+charbits(NumOfChars) when NumOfChars =< 32 -> 5;
+charbits(NumOfChars) when NumOfChars =< 64 -> 6;
+charbits(NumOfChars) when NumOfChars =< 128 -> 7;
+charbits(NumOfChars) when NumOfChars =< 256 -> 8;
+charbits(NumOfChars) when NumOfChars =< 512 -> 9;
+charbits(NumOfChars) when NumOfChars =< 1024 -> 10;
+charbits(NumOfChars) when NumOfChars =< 2048 -> 11;
+charbits(NumOfChars) when NumOfChars =< 4096 -> 12;
+charbits(NumOfChars) when NumOfChars =< 8192 -> 13;
+charbits(NumOfChars) when NumOfChars =< 16384 -> 14;
+charbits(NumOfChars) when NumOfChars =< 32768 -> 15;
+charbits(NumOfChars) when NumOfChars =< 65536 -> 16;
+charbits(NumOfChars) when integer(NumOfChars) ->
+ 16 + charbits1(NumOfChars bsr 16).
+
+charbits1(0) ->
+ 0;
+charbits1(NumOfChars) ->
+ 1 + charbits1(NumOfChars bsr 1).
+
+
+chars_decode(Bytes,_,'BMPString',C,Len) ->
+ case get_constraint(C,'PermittedAlphabet') of
+ no ->
+ getBMPChars(Bytes,Len);
+ _ ->
+ exit({error,{asn1,
+ {'not implemented',
+ "BMPString with PermittedAlphabet constraint"}}})
+ end;
+chars_decode(Bytes,NumBits,StringType,C,Len) ->
+ CharInTab = get_CharInTab(C,StringType),
+ chars_decode2(Bytes,CharInTab,NumBits,Len).
+
+
+chars_decode2(Bytes,CharInTab,NumBits,Len) ->
+ chars_decode2(Bytes,CharInTab,NumBits,Len,[]).
+
+chars_decode2(Bytes,_CharInTab,_NumBits,0,Acc) ->
+ {lists:reverse(Acc),Bytes};
+chars_decode2(Bytes,{Min,Max,notab},NumBits,Len,Acc) when NumBits > 8 ->
+ {Char,Bytes2} = getbits(Bytes,NumBits),
+ Result = case minimum_octets(Char+Min) of
+ [NewChar] -> NewChar;
+ [C1,C2] -> {0,0,C1,C2};
+ [C1,C2,C3] -> {0,C1,C2,C3};
+ [C1,C2,C3,C4] -> {C1,C2,C3,C4}
+ end,
+ chars_decode2(Bytes2,{Min,Max,notab},NumBits,Len -1,[Result|Acc]);
+chars_decode2(Bytes,{Min,Max,notab},NumBits,Len,Acc) ->
+ {Char,Bytes2} = getbits(Bytes,NumBits),
+ chars_decode2(Bytes2,{Min,Max,notab},NumBits,Len -1,[Char+Min|Acc]);
+
+%% BMPString and UniversalString with PermittedAlphabet is currently not supported
+chars_decode2(Bytes,{Min,Max,CharInTab},NumBits,Len,Acc) ->
+ {Char,Bytes2} = getbits(Bytes,NumBits),
+ chars_decode2(Bytes2,{Min,Max,CharInTab},NumBits,Len -1,[element(Char+1,CharInTab)|Acc]).
+
+
+ % X.691:17
+encode_null({Name,Val}) when atom(Name) ->
+ encode_null(Val);
+encode_null(_) -> []. % encodes to nothing
+
+decode_null(Bytes) ->
+ {'NULL',Bytes}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% encode_object_identifier(Val) -> CompleteList
+%% encode_object_identifier({Name,Val}) -> CompleteList
+%% Val -> {Int1,Int2,...,IntN} % N >= 2
+%% Name -> atom()
+%% Int1 -> integer(0..2)
+%% Int2 -> integer(0..39) when Int1 (0..1) else integer()
+%% Int3-N -> integer()
+%% CompleteList -> [{bits,8,Val}|{octets,Ol}|align|...]
+%%
+encode_object_identifier({Name,Val}) when atom(Name) ->
+ encode_object_identifier(Val);
+encode_object_identifier(Val) ->
+ Octets = e_object_identifier(Val,notag),
+ [{debug,object_identifier},encode_length(undefined,length(Octets)),{octets,Octets}].
+
+%% This code is copied from asn1_encode.erl (BER) and corrected and modified
+
+e_object_identifier({'OBJECT IDENTIFIER',V},DoTag) ->
+ e_object_identifier(V,DoTag);
+e_object_identifier({Cname,V},DoTag) when atom(Cname),tuple(V) ->
+ e_object_identifier(tuple_to_list(V),DoTag);
+e_object_identifier({Cname,V},DoTag) when atom(Cname),list(V) ->
+ e_object_identifier(V,DoTag);
+e_object_identifier(V,DoTag) when tuple(V) ->
+ e_object_identifier(tuple_to_list(V),DoTag);
+
+% E1 = 0|1|2 and (E2 < 40 when E1 = 0|1)
+e_object_identifier([E1,E2|Tail],_DoTag) when E1 =< 2 ->
+ Head = 40*E1 + E2, % weird
+ Res = e_object_elements([Head|Tail]),
+% dotag(DoTag,[6],elength(length(Res)+1),[Head|Res]),
+ Res.
+
+e_object_elements([]) ->
+ [];
+e_object_elements([H|T]) ->
+ lists:append(e_object_element(H),e_object_elements(T)).
+
+e_object_element(Num) when Num < 128 ->
+ [Num];
+% must be changed to handle more than 2 octets
+e_object_element(Num) -> %% when Num < ???
+ Left = ((Num band 2#11111110000000) bsr 7) bor 2#10000000,
+ Right = Num band 2#1111111 ,
+ [Left,Right].
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% decode_object_identifier(Bytes) -> {ObjId,RemainingBytes}
+%% ObjId -> {integer(),integer(),...} % at least 2 integers
+%% RemainingBytes -> [integer()] when integer() (0..255)
+decode_object_identifier(Bytes) ->
+ {Len,Bytes2} = decode_length(Bytes,undefined),
+ {Octs,Bytes3} = getoctets_as_list(Bytes2,Len),
+ [First|Rest] = dec_subidentifiers(Octs,0,[]),
+ Idlist = if
+ First < 40 ->
+ [0,First|Rest];
+ First < 80 ->
+ [1,First - 40|Rest];
+ true ->
+ [2,First - 80|Rest]
+ end,
+ {list_to_tuple(Idlist),Bytes3}.
+
+dec_subidentifiers([H|T],Av,Al) when H >=16#80 ->
+ dec_subidentifiers(T,(Av bsl 7) + (H band 16#7F),Al);
+dec_subidentifiers([H|T],Av,Al) ->
+ dec_subidentifiers(T,0,[(Av bsl 7) + H |Al]);
+dec_subidentifiers([],_Av,Al) ->
+ lists:reverse(Al).
+
+get_constraint(C,Key) ->
+ case lists:keysearch(Key,1,C) of
+ false ->
+ no;
+ {value,{_,V}} ->
+ V
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% complete(InList) -> ByteList
+%% Takes a coded list with bits and bytes and converts it to a list of bytes
+%% Should be applied as the last step at encode of a complete ASN.1 type
+%%
+complete(InList) when list(InList) ->
+ complete(InList,[],0);
+complete(InList) ->
+ complete([InList],[],0).
+
+complete([{debug,_}|T], Acc, Acclen) ->
+ complete(T,Acc,Acclen);
+complete([H|T],Acc,Acclen) when list(H) ->
+ complete(lists:concat([H,T]),Acc,Acclen);
+
+
+complete([{octets,N,Val}|T],Acc,Acclen) when N =< 4 ,integer(Val) ->
+ Newval = case N of
+ 1 ->
+ Val4 = Val band 16#FF,
+ [Val4];
+ 2 ->
+ Val3 = (Val bsr 8) band 16#FF,
+ Val4 = Val band 16#FF,
+ [Val3,Val4];
+ 3 ->
+ Val2 = (Val bsr 16) band 16#FF,
+ Val3 = (Val bsr 8) band 16#FF,
+ Val4 = Val band 16#FF,
+ [Val2,Val3,Val4];
+ 4 ->
+ Val1 = (Val bsr 24) band 16#FF,
+ Val2 = (Val bsr 16) band 16#FF,
+ Val3 = (Val bsr 8) band 16#FF,
+ Val4 = Val band 16#FF,
+ [Val1,Val2,Val3,Val4]
+ end,
+ complete([{octets,Newval}|T],Acc,Acclen);
+
+complete([{octets,Oct}|T],[],_Acclen) when list(Oct) ->
+ complete(T,lists:reverse(Oct),0);
+complete([{octets,Oct}|T],[Hacc|Tacc],Acclen) when list(Oct) ->
+ Rest = 8 - Acclen,
+ if
+ Rest == 8 ->
+ complete(T,lists:concat([lists:reverse(Oct),[Hacc|Tacc]]),0);
+ true ->
+ complete(T,lists:concat([lists:reverse(Oct),[Hacc bsl Rest|Tacc]]),0)
+ end;
+
+complete([{bit,Val}|T], Acc, Acclen) ->
+ complete([{bits,1,Val}|T],Acc,Acclen);
+complete([{octet,Val}|T], Acc, Acclen) ->
+ complete([{octets,1,Val}|T],Acc,Acclen);
+
+complete([{bits,N,Val}|T], Acc, 0) when N =< 8 ->
+ complete(T,[Val|Acc],N);
+complete([{bits,N,Val}|T], [Hacc|Tacc], Acclen) when N =< 8 ->
+ Rest = 8 - Acclen,
+ if
+ Rest >= N ->
+ complete(T,[(Hacc bsl N) + Val|Tacc],(Acclen+N) rem 8);
+ true ->
+ Diff = N - Rest,
+ NewHacc = (Hacc bsl Rest) + (Val bsr Diff),
+ Mask = element(Diff,{1,3,7,15,31,63,127,255}),
+ complete(T,[(Val band Mask),NewHacc|Tacc],(Acclen+N) rem 8)
+ end;
+complete([{bits,N,Val}|T], Acc, Acclen) -> % N > 8
+ complete([{bits,N-8,Val bsr 8},{bits,8,Val band 255}|T],Acc,Acclen);
+
+complete([align|T],Acc,0) ->
+ complete(T,Acc,0);
+complete([align|T],[Hacc|Tacc],Acclen) ->
+ Rest = 8 - Acclen,
+ complete(T,[Hacc bsl Rest|Tacc],0);
+complete([{octets,_N,Val}|T],Acc,Acclen) when list(Val) -> % no security check here
+ complete([{octets,Val}|T],Acc,Acclen);
+
+complete([],[],0) ->
+ [0]; % a complete encoding must always be at least 1 byte
+complete([],Acc,0) ->
+ lists:reverse(Acc);
+complete([],[Hacc|Tacc],Acclen) when Acclen > 0->
+ Rest = 8 - Acclen,
+ NewHacc = Hacc bsl Rest,
+ lists:reverse([NewHacc|Tacc]).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/notes_history.sgml b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/notes_history.sgml
new file mode 100644
index 0000000000..3b50c1b73f
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/notes_history.sgml
@@ -0,0 +1,97 @@
+<!doctype chapter PUBLIC "-//Stork//DTD chapter//EN">
+<!--
+ ``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 via the world wide web 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.
+
+ The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+ Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+ AB. All Rights Reserved.''
+
+ $Id: notes_history.sgml,v 1.1 2008/12/17 09:53:31 mikpe Exp $
+-->
+<chapter>
+ <header>
+ <title>ASN1 Release Notes (Old)</title>
+ <prepared>Kenneth Lundin</prepared>
+ <responsible>Kenneth Lundin</responsible>
+ <docno></docno>
+ <approved>Kenneth Lundin</approved>
+ <checked>Kenneth Lundin</checked>
+ <date>98-02-02</date>
+ <rev>A</rev>
+ <file>notes_history.sgml</file>
+ </header>
+
+ <p>This document describes the changes made to old versions of the <c>asn1</c> application.
+
+ <section>
+ <title>ASN1 0.8.1</title>
+ <p>This is the first release of the ASN1 application. This version is released
+ for beta-testing. Some functionality will be added until the 1.0 version is
+ released. A list of missing features and restrictions can be found in the
+ chapter below.
+
+ <section>
+ <title>Missing features and other restrictions</title>
+ <list>
+ <item>
+ <p>The encoding rules BER and PER (aligned) is supported. <em>PER (unaligned)
+ IS NOT SUPPORTED</em>.
+ <item>
+ <p>NOT SUPPORTED types <c>ANY</c> and <c>ANY DEFINED BY</c>
+ (is not in the standard any more).
+ <item>
+ <p>NOT SUPPORTED types <c>EXTERNAL</c> and <c>EMBEDDED-PDV</c>.
+ <item>
+ <p>NOT SUPPORTED type <c>REAL</c> (planned to be implemented).
+ <item>
+ <p>The code generation support for value definitions in the ASN.1 notation is very limited
+ (planned to be enhanced).
+ <item>
+ <p>The support for constraints is limited to:
+ <list>
+ <item><p>
+ SizeConstraint SIZE(X)
+ <item><p>
+ SingleValue (1)
+ <item><p>
+ ValueRange (X..Y)
+ <item><p>
+ PermittedAlpabet FROM (but not for BMPString and UniversalString when generating PER).
+ </list>
+ <p>Complex expressions in constraints is not supported (planned to be extended).
+ <item>
+ <p>The current version of the compiler has very limited error checking:
+ <list>
+ <item><p>Stops at first syntax error.
+ <item><p>Does not stop when a reference to an undefined type is found ,
+ but prints an error message. Compilation of the generated
+ Erlang module will then fail.
+ <item><p>A whole number of other semantical controls is currently missing. This
+ means that the compiler will give little or bad help to detect what's wrong
+ with an ASN.1 specification, but will mostly work very well when the
+ ASN.1 specification is correct.
+ </list>
+ <item>
+ <p>The maximum INTEGER supported in this version is a signed 64 bit integer. This
+ limitation is probably quite reasonable. (Planned to be extended).
+ <item>
+ <p>Only AUTOMATIC TAGS supported for PER.
+ <item>
+ <p>Only EXPLICIT and IMPLICIT TAGS supported for BER.
+ <item>
+ <p>The compiler supports decoding of BER-data with indefinite length but it is
+ not possible to produce data with indefinite length with the encoder.
+ </list>
+ </section>
+
+ </section>
+</chapter>
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/notes_latest.sgml b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/notes_latest.sgml
new file mode 100644
index 0000000000..ff1f5adfa2
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/notes_latest.sgml
@@ -0,0 +1,97 @@
+<!doctype chapter PUBLIC "-//Stork//DTD chapter//EN">
+<!--
+ ``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 via the world wide web 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.
+
+ The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+ Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+ AB. All Rights Reserved.''
+
+ $Id: notes_latest.sgml,v 1.1 2008/12/17 09:53:31 mikpe Exp $
+-->
+<chapter>
+ <header>
+ <title>ASN1 Release Notes</title>
+ <prepared>Kenneth Lundin</prepared>
+ <responsible>Kenneth Lundin</responsible>
+ <docno></docno>
+ <approved>Kenneth Lundin</approved>
+ <checked>Kenneth Lundin</checked>
+ <date>97-10-07</date>
+ <rev>A</rev>
+ <file>notes_latest.sgml</file>
+ </header>
+
+ <p>This document describes the changes made to the asn1 application.
+
+ <section>
+ <title>ASN1 0.8.1</title>
+ <p>This is the first release of the ASN1 application. This version is released
+ for beta-testing. Some functionality will be added until the 1.0 version is
+ released. A list of missing features and restrictions can be found in the
+ chapter below.
+
+ <section>
+ <title>Missing features and other restrictions</title>
+ <list>
+ <item>
+ <p>The encoding rules BER and PER (aligned) is supported. <em>PER (unaligned)
+ IS NOT SUPPORTED</em>.
+ <item>
+ <p>NOT SUPPORTED types <c>ANY</c> and <c>ANY DEFINED BY</c>
+ (is not in the standard any more).
+ <item>
+ <p>NOT SUPPORTED types <c>EXTERNAL</c> and <c>EMBEDDED-PDV</c>.
+ <item>
+ <p>NOT SUPPORTED type <c>REAL</c> (planned to be implemented).
+ <item>
+ <p>The code generation support for value definitions in the ASN.1 notation is very limited
+ (planned to be enhanced).
+ <item>
+ <p>The support for constraints is limited to:
+ <list>
+ <item><p>
+ SizeConstraint SIZE(X)
+ <item><p>
+ SingleValue (1)
+ <item><p>
+ ValueRange (X..Y)
+ <item><p>
+ PermittedAlpabet FROM (but not for BMPString and UniversalString when generating PER).
+ </list>
+ <p>Complex expressions in constraints is not supported (planned to be extended).
+ <item>
+ <p>The current version of the compiler has very limited error checking:
+ <list>
+ <item><p>Stops at first syntax error.
+ <item><p>Does not stop when a reference to an undefined type is found ,
+ but prints an error message. Compilation of the generated
+ Erlang module will then fail.
+ <item><p>A whole number of other semantical controls is currently missing. This
+ means that the compiler will give little or bad help to detect what's wrong
+ with an ASN.1 specification, but will mostly work very well when the
+ ASN.1 specification is correct.
+ </list>
+ <item>
+ <p>The maximum INTEGER supported in this version is a signed 64 bit integer. This
+ limitation is probably quite reasonable. (Planned to be extended).
+ <item>
+ <p>Only AUTOMATIC TAGS supported for PER.
+ <item>
+ <p>Only EXPLICIT and IMPLICIT TAGS supported for BER.
+ <item>
+ <p>The compiler supports decoding of BER-data with indefinite length but it is
+ not possible to produce data with indefinite length with the encoder.
+ </list>
+ </section>
+
+ </section>
+</chapter>
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/Makefile b/lib/dialyzer/test/r9c_SUITE_data/src/inets/Makefile
new file mode 100644
index 0000000000..be63eb73b2
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/Makefile
@@ -0,0 +1,178 @@
+# ``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 via the world wide web 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.
+#
+# The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+# Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+# AB. All Rights Reserved.''
+#
+# $Id: Makefile,v 1.1 2008/12/17 09:53:33 mikpe Exp $
+#
+include $(ERL_TOP)/make/target.mk
+include $(ERL_TOP)/make/$(TARGET)/otp.mk
+
+# ----------------------------------------------------
+# Application version
+# ----------------------------------------------------
+include ../vsn.mk
+
+VSN = $(INETS_VSN)
+APP_VSN = "inets-$(VSN)"
+
+
+# ----------------------------------------------------
+# Release directory specification
+# ----------------------------------------------------
+RELSYSDIR = $(RELEASE_PATH)/lib/inets-$(VSN)
+
+# ----------------------------------------------------
+# Target Specs
+# ----------------------------------------------------
+MODULES = \
+ ftp \
+ http \
+ http_lib \
+ httpc_handler \
+ httpc_manager \
+ uri \
+ httpd \
+ httpd_acceptor \
+ httpd_acceptor_sup \
+ httpd_conf \
+ httpd_example \
+ httpd_manager \
+ httpd_misc_sup \
+ httpd_parse \
+ httpd_request_handler \
+ httpd_response \
+ httpd_socket \
+ httpd_sup \
+ httpd_util \
+ httpd_verbosity \
+ inets_sup \
+ mod_actions \
+ mod_alias \
+ mod_auth \
+ mod_auth_plain \
+ mod_auth_dets \
+ mod_auth_mnesia \
+ mod_auth_server \
+ mod_browser \
+ mod_cgi \
+ mod_dir \
+ mod_disk_log \
+ mod_esi \
+ mod_get \
+ mod_head \
+ mod_htaccess \
+ mod_include \
+ mod_log \
+ mod_range \
+ mod_responsecontrol \
+ mod_trace \
+ mod_security \
+ mod_security_server
+
+HRL_FILES = httpd.hrl httpd_verbosity.hrl mod_auth.hrl \
+ http.hrl jnets_httpd.hrl
+
+ERL_FILES = $(MODULES:%=%.erl)
+
+TARGET_FILES= $(MODULES:%=$(EBIN)/%.$(EMULATOR)) $(APP_TARGET) $(APPUP_TARGET)
+
+APP_FILE= inets.app
+APPUP_FILE= inets.appup
+
+APP_SRC= $(APP_FILE).src
+APP_TARGET= $(EBIN)/$(APP_FILE)
+
+APPUP_SRC= $(APPUP_FILE).src
+APPUP_TARGET= $(EBIN)/$(APPUP_FILE)
+
+# ----------------------------------------------------
+# INETS FLAGS
+# ----------------------------------------------------
+# DONT_USE_VERBOSITY = -Ddont_use_verbosity=true
+INETS_FLAGS = -D'SERVER_SOFTWARE="inets/$(VSN)"' \
+ -Ddefault_verbosity=silence \
+ $(DONT_USE_VERBOSITY)
+
+# INETS_DEBUG_DEFAULT = d
+ifeq ($(INETS_DEBUG),)
+ INETS_DEBUG = $(INETS_DEBUG_DEFAULT)
+endif
+
+ifeq ($(INETS_DEBUG),c)
+ INETS_FLAGS += -Dinets_cdebug -Dinets_debug -Dinets_log -Dinets_error
+endif
+ifeq ($(INETS_DEBUG),d)
+ INETS_FLAGS += -Dinets_debug -Dinets_log -Dinets_error
+endif
+ifeq ($(INETS_DEBUG),l)
+ INETS_FLAGS += -Dinets_log -Dinets_error
+endif
+ifeq ($(INETS_DEBUG),e)
+ INETS_FLAGS += -Dinets_error
+endif
+
+
+# ----------------------------------------------------
+# FLAGS
+# ----------------------------------------------------
+ERL_FLAGS +=
+
+ifeq ($(WARN_UNUSED_WARS),true)
+ERL_COMPILE_FLAGS += +warn_unused_vars
+endif
+
+ERL_COMPILE_FLAGS += $(INETS_FLAGS) \
+ +'{parse_transform,sys_pre_attributes}' \
+ +'{attribute,insert,app_vsn,$(APP_VSN)}'
+
+
+# ----------------------------------------------------
+# Targets
+# ----------------------------------------------------
+
+debug opt: $(TARGET_FILES)
+
+clean:
+ rm -f $(TARGET_FILES)
+ rm -f core
+
+docs:
+
+# ----------------------------------------------------
+# Special Build Targets
+# ----------------------------------------------------
+
+$(APP_TARGET): $(APP_SRC) ../vsn.mk
+ sed -e 's;%VSN%;$(VSN);' $< > $@
+
+$(APPUP_TARGET): $(APPUP_SRC) ../vsn.mk
+ sed -e 's;%VSN%;$(VSN);' $< > $@
+
+# ----------------------------------------------------
+# Release Target
+# ----------------------------------------------------
+include $(ERL_TOP)/make/otp_release_targets.mk
+
+release_spec: opt
+ $(INSTALL_DIR) $(RELSYSDIR)/src
+ $(INSTALL_DATA) $(HRL_FILES) $(ERL_FILES) $(RELSYSDIR)/src
+ $(INSTALL_DIR) $(RELSYSDIR)/ebin
+ $(INSTALL_DATA) $(TARGET_FILES) $(RELSYSDIR)/ebin
+
+release_docs_spec:
+
+info:
+ @echo "INETS_DEBUG = $(INETS_DEBUG)"
+ @echo "INETS_FLAGS = $(INETS_FLAGS)"
+ @echo "ERL_COMPILE_FLAGS = $(ERL_COMPILE_FLAGS)"
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/ftp.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/ftp.erl
new file mode 100644
index 0000000000..312bb3a5c8
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/ftp.erl
@@ -0,0 +1,1582 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: ftp.erl,v 1.2 2009/03/03 01:55:01 kostis Exp $
+%%
+-module(ftp).
+
+-behaviour(gen_server).
+
+%% This module implements an ftp client based on socket(3)/gen_tcp(3),
+%% file(3) and filename(3).
+%%
+
+
+-define(OPEN_TIMEOUT, 60*1000).
+-define(BYTE_TIMEOUT, 1000). % Timeout for _ONE_ byte to arrive. (ms)
+-define(OPER_TIMEOUT, 300). % Operation timeout (seconds)
+-define(FTP_PORT, 21).
+
+%% Client interface
+-export([cd/2, close/1, delete/2, formaterror/1, help/0,
+ lcd/2, lpwd/1, ls/1, ls/2,
+ mkdir/2, nlist/1, nlist/2,
+ open/1, open/2, open/3,
+ pwd/1,
+ recv/2, recv/3, recv_bin/2,
+ recv_chunk_start/2, recv_chunk/1,
+ rename/3, rmdir/2,
+ send/2, send/3, send_bin/3,
+ send_chunk_start/2, send_chunk/2, send_chunk_end/1,
+ type/2, user/3,user/4,account/2,
+ append/3, append/2, append_bin/3,
+ append_chunk/2, append_chunk_end/1, append_chunk_start/2]).
+
+%% Internal
+-export([init/1, handle_call/3, handle_cast/2,
+ handle_info/2, terminate/2,code_change/3]).
+
+
+%%
+%% CLIENT FUNCTIONS
+%%
+
+%% open(Host)
+%% open(Host, Flags)
+%%
+%% Purpose: Start an ftp client and connect to a host.
+%% Args: Host = string(),
+%% Port = integer(),
+%% Flags = [Flag],
+%% Flag = verbose | debug
+%% Returns: {ok, Pid} | {error, ehost}
+
+%%Tho only option was the host in textual form
+open({option_list,Option_list})->
+ %% Dbg = {debug,[trace,log,statistics]},
+ %% Options = [Dbg],
+ Options = [],
+ {ok,Pid1}=case lists:keysearch(flags,1,Option_list) of
+ {value,{flags,Flags}}->
+ {ok, Pid} = gen_server:start_link(?MODULE, [Flags], Options);
+ false ->
+ {ok, Pid} = gen_server:start_link(?MODULE, [], Options)
+ end,
+ gen_server:call(Pid1, {open, ip_comm,Option_list}, infinity);
+
+
+%%The only option was the tuple form of the ip-number
+open(Host)when tuple(Host) ->
+ open(Host, ?FTP_PORT, []);
+
+%%Host is the string form of the hostname
+open(Host)->
+ open(Host,?FTP_PORT,[]).
+
+
+
+open(Host, Port) when integer(Port) ->
+ open(Host,Port,[]);
+
+open(Host, Flags) when list(Flags) ->
+ open(Host,?FTP_PORT, Flags).
+
+open(Host,Port,Flags) when integer(Port), list(Flags) ->
+ %% Dbg = {debug,[trace,log,statistics]},
+ %% Options = [Dbg],
+ Options = [],
+ {ok, Pid} = gen_server:start_link(?MODULE, [Flags], Options),
+ gen_server:call(Pid, {open, ip_comm, Host, Port}, infinity).
+
+%% user(Pid, User, Pass)
+%% Purpose: Login.
+%% Args: Pid = pid(), User = Pass = string()
+%% Returns: ok | {error, euser} | {error, econn}
+user(Pid, User, Pass) ->
+ gen_server:call(Pid, {user, User, Pass}, infinity).
+
+%% user(Pid, User, Pass,Acc)
+%% Purpose: Login whith a supplied account name
+%% Args: Pid = pid(), User = Pass = Acc = string()
+%% Returns: ok | {error, euser} | {error, econn} | {error, eacct}
+user(Pid, User, Pass,Acc) ->
+ gen_server:call(Pid, {user, User, Pass,Acc}, infinity).
+
+%% account(Pid,Acc)
+%% Purpose: Set a user Account.
+%% Args: Pid = pid(), Acc= string()
+%% Returns: ok | {error, eacct}
+account(Pid,Acc) ->
+ gen_server:call(Pid, {account,Acc}, infinity).
+
+%% pwd(Pid)
+%%
+%% Purpose: Get the current working directory at remote server.
+%% Args: Pid = pid()
+%% Returns: {ok, Dir} | {error, elogin} | {error, econn}
+pwd(Pid) ->
+ gen_server:call(Pid, pwd, infinity).
+
+%% lpwd(Pid)
+%%
+%% Purpose: Get the current working directory at local server.
+%% Args: Pid = pid()
+%% Returns: {ok, Dir} | {error, elogin}
+lpwd(Pid) ->
+ gen_server:call(Pid, lpwd, infinity).
+
+%% cd(Pid, Dir)
+%%
+%% Purpose: Change current working directory at remote server.
+%% Args: Pid = pid(), Dir = string()
+%% Returns: ok | {error, epath} | {error, elogin} | {error, econn}
+cd(Pid, Dir) ->
+ gen_server:call(Pid, {cd, Dir}, infinity).
+
+%% lcd(Pid, Dir)
+%%
+%% Purpose: Change current working directory for the local client.
+%% Args: Pid = pid(), Dir = string()
+%% Returns: ok | {error, epath}
+lcd(Pid, Dir) ->
+ gen_server:call(Pid, {lcd, Dir}, infinity).
+
+%% ls(Pid)
+%% ls(Pid, Dir)
+%%
+%% Purpose: List the contents of current directory (ls/1) or directory
+%% Dir (ls/2) at remote server.
+%% Args: Pid = pid(), Dir = string()
+%% Returns: {ok, Listing} | {error, epath} | {error, elogin} | {error, econn}
+ls(Pid) ->
+ ls(Pid, "").
+ls(Pid, Dir) ->
+ gen_server:call(Pid, {dir, long, Dir}, infinity).
+
+%% nlist(Pid)
+%% nlist(Pid, Dir)
+%%
+%% Purpose: List the contents of current directory (ls/1) or directory
+%% Dir (ls/2) at remote server. The returned list is a stream
+%% of file names.
+%% Args: Pid = pid(), Dir = string()
+%% Returns: {ok, Listing} | {error, epath} | {error, elogin} | {error, econn}
+nlist(Pid) ->
+ nlist(Pid, "").
+nlist(Pid, Dir) ->
+ gen_server:call(Pid, {dir, short, Dir}, infinity).
+
+%% rename(Pid, CurrFile, NewFile)
+%%
+%% Purpose: Rename a file at remote server.
+%% Args: Pid = pid(), CurrFile = NewFile = string()
+%% Returns: ok | {error, epath} | {error, elogin} | {error, econn}
+rename(Pid, CurrFile, NewFile) ->
+ gen_server:call(Pid, {rename, CurrFile, NewFile}, infinity).
+
+%% delete(Pid, File)
+%%
+%% Purpose: Remove file at remote server.
+%% Args: Pid = pid(), File = string()
+%% Returns: ok | {error, epath} | {error, elogin} | {error, econn}
+delete(Pid, File) ->
+ gen_server:call(Pid, {delete, File}, infinity).
+
+%% mkdir(Pid, Dir)
+%%
+%% Purpose: Make directory at remote server.
+%% Args: Pid = pid(), Dir = string()
+%% Returns: ok | {error, epath} | {error, elogin} | {error, econn}
+mkdir(Pid, Dir) ->
+ gen_server:call(Pid, {mkdir, Dir}, infinity).
+
+%% rmdir(Pid, Dir)
+%%
+%% Purpose: Remove directory at remote server.
+%% Args: Pid = pid(), Dir = string()
+%% Returns: ok | {error, epath} | {error, elogin} | {error, econn}
+rmdir(Pid, Dir) ->
+ gen_server:call(Pid, {rmdir, Dir}, infinity).
+
+%% type(Pid, Type)
+%%
+%% Purpose: Set transfer type.
+%% Args: Pid = pid(), Type = ascii | binary
+%% Returns: ok | {error, etype} | {error, elogin} | {error, econn}
+type(Pid, Type) ->
+ gen_server:call(Pid, {type, Type}, infinity).
+
+%% recv(Pid, RFile [, LFile])
+%%
+%% Purpose: Transfer file from remote server.
+%% Args: Pid = pid(), RFile = LFile = string()
+%% Returns: ok | {error, epath} | {error, elogin} | {error, econn}
+recv(Pid, RFile) ->
+ recv(Pid, RFile, "").
+
+recv(Pid, RFile, LFile) ->
+ gen_server:call(Pid, {recv, RFile, LFile}, infinity).
+
+%% recv_bin(Pid, RFile)
+%%
+%% Purpose: Transfer file from remote server into binary.
+%% Args: Pid = pid(), RFile = string()
+%% Returns: {ok, Bin} | {error, epath} | {error, elogin} | {error, econn}
+recv_bin(Pid, RFile) ->
+ gen_server:call(Pid, {recv_bin, RFile}, infinity).
+
+%% recv_chunk_start(Pid, RFile)
+%%
+%% Purpose: Start receive of chunks of remote file.
+%% Args: Pid = pid(), RFile = string().
+%% Returns: ok | {error, elogin} | {error, epath} | {error, econn}
+recv_chunk_start(Pid, RFile) ->
+ gen_server:call(Pid, {recv_chunk_start, RFile}, infinity).
+
+
+%% recv_chunk(Pid, RFile)
+%%
+%% Purpose: Transfer file from remote server into binary in chunks
+%% Args: Pid = pid(), RFile = string()
+%% Returns: Reference
+recv_chunk(Pid) ->
+ gen_server:call(Pid, recv_chunk, infinity).
+
+%% send(Pid, LFile [, RFile])
+%%
+%% Purpose: Transfer file to remote server.
+%% Args: Pid = pid(), LFile = RFile = string()
+%% Returns: ok | {error, epath} | {error, elogin} | {error, econn}
+send(Pid, LFile) ->
+ send(Pid, LFile, "").
+
+send(Pid, LFile, RFile) ->
+ gen_server:call(Pid, {send, LFile, RFile}, infinity).
+
+%% send_bin(Pid, Bin, RFile)
+%%
+%% Purpose: Transfer a binary to a remote file.
+%% Args: Pid = pid(), Bin = binary(), RFile = string()
+%% Returns: ok | {error, epath} | {error, elogin} | {error, enotbinary}
+%% | {error, econn}
+send_bin(Pid, Bin, RFile) when binary(Bin) ->
+ gen_server:call(Pid, {send_bin, Bin, RFile}, infinity);
+send_bin(Pid, Bin, RFile) ->
+ {error, enotbinary}.
+
+%% send_chunk_start(Pid, RFile)
+%%
+%% Purpose: Start transfer of chunks to remote file.
+%% Args: Pid = pid(), RFile = string().
+%% Returns: ok | {error, elogin} | {error, epath} | {error, econn}
+send_chunk_start(Pid, RFile) ->
+ gen_server:call(Pid, {send_chunk_start, RFile}, infinity).
+
+
+%% append_chunk_start(Pid, RFile)
+%%
+%% Purpose: Start append chunks of data to remote file.
+%% Args: Pid = pid(), RFile = string().
+%% Returns: ok | {error, elogin} | {error, epath} | {error, econn}
+append_chunk_start(Pid, RFile) ->
+ gen_server:call(Pid, {append_chunk_start, RFile}, infinity).
+
+
+%% send_chunk(Pid, Bin)
+%%
+%% Purpose: Send chunk to remote file.
+%% Args: Pid = pid(), Bin = binary().
+%% Returns: ok | {error, elogin} | {error, enotbinary} | {error, echunk}
+%% | {error, econn}
+send_chunk(Pid, Bin) when binary(Bin) ->
+ gen_server:call(Pid, {send_chunk, Bin}, infinity);
+send_chunk(Pid, Bin) ->
+ {error, enotbinary}.
+
+%%append_chunk(Pid, Bin)
+%%
+%% Purpose: Append chunk to remote file.
+%% Args: Pid = pid(), Bin = binary().
+%% Returns: ok | {error, elogin} | {error, enotbinary} | {error, echunk}
+%% | {error, econn}
+append_chunk(Pid, Bin) when binary(Bin) ->
+ gen_server:call(Pid, {append_chunk, Bin}, infinity);
+append_chunk(Pid, Bin) ->
+ {error, enotbinary}.
+
+%% send_chunk_end(Pid)
+%%
+%% Purpose: End sending of chunks to remote file.
+%% Args: Pid = pid().
+%% Returns: ok | {error, elogin} | {error, echunk} | {error, econn}
+send_chunk_end(Pid) ->
+ gen_server:call(Pid, send_chunk_end, infinity).
+
+%% append_chunk_end(Pid)
+%%
+%% Purpose: End appending of chunks to remote file.
+%% Args: Pid = pid().
+%% Returns: ok | {error, elogin} | {error, echunk} | {error, econn}
+append_chunk_end(Pid) ->
+ gen_server:call(Pid, append_chunk_end, infinity).
+
+%% append(Pid, LFile,RFile)
+%%
+%% Purpose: Append the local file to the remote file
+%% Args: Pid = pid(), LFile = RFile = string()
+%% Returns: ok | {error, epath} | {error, elogin} | {error, econn}
+append(Pid, LFile) ->
+ append(Pid, LFile, "").
+
+append(Pid, LFile, RFile) ->
+ gen_server:call(Pid, {append, LFile, RFile}, infinity).
+
+%% append_bin(Pid, Bin, RFile)
+%%
+%% Purpose: Append a binary to a remote file.
+%% Args: Pid = pid(), Bin = binary(), RFile = string()
+%% Returns: ok | {error, epath} | {error, elogin} | {error, enotbinary}
+%% | {error, econn}
+append_bin(Pid, Bin, RFile) when binary(Bin) ->
+ gen_server:call(Pid, {append_bin, Bin, RFile}, infinity);
+append_bin(Pid, Bin, RFile) ->
+ {error, enotbinary}.
+
+
+%% close(Pid)
+%%
+%% Purpose: End the ftp session.
+%% Args: Pid = pid()
+%% Returns: ok
+close(Pid) ->
+ case (catch gen_server:call(Pid, close, 30000)) of
+ ok ->
+ ok;
+ {'EXIT',{noproc,_}} ->
+ %% Already gone...
+ ok;
+ Res ->
+ Res
+ end.
+
+%% formaterror(Tag)
+%%
+%% Purpose: Return diagnostics.
+%% Args: Tag = atom() | {error, atom()}
+%% Returns: string().
+formaterror(Tag) ->
+ errstr(Tag).
+
+%% help()
+%%
+%% Purpose: Print list of valid commands.
+%%
+%% Undocumented.
+%%
+help() ->
+ io:format("\n Commands:\n"
+ " ---------\n"
+ " cd(Pid, Dir)\n"
+ " close(Pid)\n"
+ " delete(Pid, File)\n"
+ " formaterror(Tag)\n"
+ " help()\n"
+ " lcd(Pid, Dir)\n"
+ " lpwd(Pid)\n"
+ " ls(Pid [, Dir])\n"
+ " mkdir(Pid, Dir)\n"
+ " nlist(Pid [, Dir])\n"
+ " open(Host [Port, Flags])\n"
+ " pwd(Pid)\n"
+ " recv(Pid, RFile [, LFile])\n"
+ " recv_bin(Pid, RFile)\n"
+ " recv_chunk_start(Pid, RFile)\n"
+ " recv_chunk(Pid)\n"
+ " rename(Pid, CurrFile, NewFile)\n"
+ " rmdir(Pid, Dir)\n"
+ " send(Pid, LFile [, RFile])\n"
+ " send_chunk(Pid, Bin)\n"
+ " send_chunk_start(Pid, RFile)\n"
+ " send_chunk_end(Pid)\n"
+ " send_bin(Pid, Bin, RFile)\n"
+ " append(Pid, LFile [, RFile])\n"
+ " append_chunk(Pid, Bin)\n"
+ " append_chunk_start(Pid, RFile)\n"
+ " append_chunk_end(Pid)\n"
+ " append_bin(Pid, Bin, RFile)\n"
+ " type(Pid, Type)\n"
+ " account(Pid,Account)\n"
+ " user(Pid, User, Pass)\n"
+ " user(Pid, User, Pass,Account)\n").
+
+%%
+%% INIT
+%%
+
+-record(state, {csock = undefined, dsock = undefined, flags = undefined,
+ ldir = undefined, type = undefined, chunk = false,
+ pending = undefined}).
+
+init([Flags]) ->
+ sock_start(),
+ put(debug,get_debug(Flags)),
+ put(verbose,get_verbose(Flags)),
+ process_flag(priority, low),
+ {ok, LDir} = file:get_cwd(),
+ {ok, #state{flags = Flags, ldir = LDir}}.
+
+%%
+%% HANDLERS
+%%
+
+%% First group of reply code digits
+-define(POS_PREL, 1).
+-define(POS_COMPL, 2).
+-define(POS_INTERM, 3).
+-define(TRANS_NEG_COMPL, 4).
+-define(PERM_NEG_COMPL, 5).
+
+%% Second group of reply code digits
+-define(SYNTAX,0).
+-define(INFORMATION,1).
+-define(CONNECTION,2).
+-define(AUTH_ACC,3).
+-define(UNSPEC,4).
+-define(FILE_SYSTEM,5).
+
+
+-define(STOP_RET(E),{stop, normal, {error, E},
+ State#state{csock = undefined}}).
+
+
+rescode(?POS_PREL,_,_) -> pos_prel; %%Positive Preleminary Reply
+rescode(?POS_COMPL,_,_) -> pos_compl; %%Positive Completion Reply
+rescode(?POS_INTERM,?AUTH_ACC,2) -> pos_interm_acct; %%Positive Intermediate Reply nedd account
+rescode(?POS_INTERM,_,_) -> pos_interm; %%Positive Intermediate Reply
+rescode(?TRANS_NEG_COMPL,?FILE_SYSTEM,2) -> trans_no_space; %%No storage area no action taken
+rescode(?TRANS_NEG_COMPL,_,_) -> trans_neg_compl;%%Temporary Error, no action taken
+rescode(?PERM_NEG_COMPL,?FILE_SYSTEM,2) -> perm_no_space; %%Permanent disk space error, the user shall not try again
+rescode(?PERM_NEG_COMPL,?FILE_SYSTEM,3) -> perm_fname_not_allowed;
+rescode(?PERM_NEG_COMPL,_,_) -> perm_neg_compl.
+
+retcode(trans_no_space,_) -> etnospc;
+retcode(perm_no_space,_) -> epnospc;
+retcode(perm_fname_not_allowed,_) -> efnamena;
+retcode(_,Otherwise) -> Otherwise.
+
+handle_call({open,ip_comm,Conn_data},From,State) ->
+ case lists:keysearch(host,1,Conn_data) of
+ {value,{host,Host}}->
+ Port=get_key1(port,Conn_data,?FTP_PORT),
+ Timeout=get_key1(timeout,Conn_data,?OPEN_TIMEOUT),
+ open(Host,Port,Timeout,State);
+ false ->
+ ehost
+ end;
+
+handle_call({open,ip_comm,Host,Port},From,State) ->
+ open(Host,Port,?OPEN_TIMEOUT,State);
+
+handle_call({user, User, Pass}, _From, State) ->
+ #state{csock = CSock} = State,
+ case ctrl_cmd(CSock, "USER ~s", [User]) of
+ pos_interm ->
+ case ctrl_cmd(CSock, "PASS ~s", [Pass]) of
+ pos_compl ->
+ set_type(binary, CSock),
+ {reply, ok, State#state{type = binary}};
+ {error,enotconn} ->
+ ?STOP_RET(econn);
+ _ ->
+ {reply, {error, euser}, State}
+ end;
+ pos_compl ->
+ set_type(binary, CSock),
+ {reply, ok, State#state{type = binary}};
+ {error, enotconn} ->
+ ?STOP_RET(econn);
+ _ ->
+ {reply, {error, euser}, State}
+ end;
+
+handle_call({user, User, Pass,Acc}, _From, State) ->
+ #state{csock = CSock} = State,
+ case ctrl_cmd(CSock, "USER ~s", [User]) of
+ pos_interm ->
+ case ctrl_cmd(CSock, "PASS ~s", [Pass]) of
+ pos_compl ->
+ set_type(binary, CSock),
+ {reply, ok, State#state{type = binary}};
+ pos_interm_acct->
+ case ctrl_cmd(CSock,"ACCT ~s",[Acc]) of
+ pos_compl->
+ set_type(binary, CSock),
+ {reply, ok, State#state{type = binary}};
+ {error,enotconn}->
+ ?STOP_RET(econn);
+ _ ->
+ {reply, {error, eacct}, State}
+ end;
+ {error,enotconn} ->
+ ?STOP_RET(econn);
+ _ ->
+ {reply, {error, euser}, State}
+ end;
+ pos_compl ->
+ set_type(binary, CSock),
+ {reply, ok, State#state{type = binary}};
+ {error, enotconn} ->
+ ?STOP_RET(econn);
+ _ ->
+ {reply, {error, euser}, State}
+ end;
+
+%%set_account(Acc,State)->Reply
+%%Reply={reply, {error, euser}, State} | {error,enotconn}->
+handle_call({account,Acc},_From,State)->
+ #state{csock = CSock} = State,
+ case ctrl_cmd(CSock,"ACCT ~s",[Acc]) of
+ pos_compl->
+ {reply, ok,State};
+ {error,enotconn}->
+ ?STOP_RET(econn);
+ Error ->
+ debug(" error: ~p",[Error]),
+ {reply, {error, eacct}, State}
+ end;
+
+handle_call(pwd, _From, State) when State#state.chunk == false ->
+ #state{csock = CSock} = State,
+ %%
+ %% NOTE: The directory string comes over the control connection.
+ case sock_write(CSock, mk_cmd("PWD", [])) of
+ ok ->
+ {_, Line} = result_line(CSock),
+ {_, Cs} = split($", Line), % XXX Ugly
+ {Dir0, _} = split($", Cs),
+ Dir = lists:delete($", Dir0),
+ {reply, {ok, Dir}, State};
+ {error, enotconn} ->
+ ?STOP_RET(econn)
+ end;
+
+handle_call(lpwd, _From, State) ->
+ #state{csock = CSock, ldir = LDir} = State,
+ {reply, {ok, LDir}, State};
+
+handle_call({cd, Dir}, _From, State) when State#state.chunk == false ->
+ #state{csock = CSock} = State,
+ case ctrl_cmd(CSock, "CWD ~s", [Dir]) of
+ pos_compl ->
+ {reply, ok, State};
+ {error, enotconn} ->
+ ?STOP_RET(econn);
+ _ ->
+ {reply, {error, epath}, State}
+ end;
+
+handle_call({lcd, Dir}, _From, State) ->
+ #state{csock = CSock, ldir = LDir0} = State,
+ LDir = absname(LDir0, Dir),
+ case file:read_file_info(LDir) of
+ {ok, _ } ->
+ {reply, ok, State#state{ldir = LDir}};
+ _ ->
+ {reply, {error, epath}, State}
+ end;
+
+handle_call({dir, Len, Dir}, _From, State) when State#state.chunk == false ->
+ debug(" dir : ~p: ~s~n",[Len,Dir]),
+ #state{csock = CSock, type = Type} = State,
+ set_type(ascii, Type, CSock),
+ LSock = listen_data(CSock, raw),
+ Cmd = case Len of
+ short -> "NLST";
+ long -> "LIST"
+ end,
+ Result = case Dir of
+ "" ->
+ ctrl_cmd(CSock, Cmd, "");
+ _ ->
+ ctrl_cmd(CSock, Cmd ++ " ~s", [Dir])
+ end,
+ debug(" ctrl : command result: ~p~n",[Result]),
+ case Result of
+ pos_prel ->
+ debug(" dbg : await the data connection", []),
+ DSock = accept_data(LSock),
+ debug(" dbg : await the data", []),
+ Reply0 =
+ case recv_data(DSock) of
+ {ok, DirData} ->
+ debug(" data : DirData: ~p~n",[DirData]),
+ case result(CSock) of
+ pos_compl ->
+ {ok, DirData};
+ _ ->
+ {error, epath}
+ end;
+ {error, Reason} ->
+ sock_close(DSock),
+ verbose(" data : error: ~p, ~p~n",[Reason, result(CSock)]),
+ {error, epath}
+ end,
+
+ debug(" ctrl : reply: ~p~n",[Reply0]),
+ reset_type(ascii, Type, CSock),
+ {reply, Reply0, State};
+ {closed, _Why} ->
+ ?STOP_RET(econn);
+ _ ->
+ sock_close(LSock),
+ {reply, {error, epath}, State}
+ end;
+
+
+handle_call({rename, CurrFile, NewFile}, _From, State) when State#state.chunk == false ->
+ #state{csock = CSock} = State,
+ case ctrl_cmd(CSock, "RNFR ~s", [CurrFile]) of
+ pos_interm ->
+ case ctrl_cmd(CSock, "RNTO ~s", [NewFile]) of
+ pos_compl ->
+ {reply, ok, State};
+ _ ->
+ {reply, {error, epath}, State}
+ end;
+ {error, enotconn} ->
+ ?STOP_RET(econn);
+ _ ->
+ {reply, {error, epath}, State}
+ end;
+
+handle_call({delete, File}, _From, State) when State#state.chunk == false ->
+ #state{csock = CSock} = State,
+ case ctrl_cmd(CSock, "DELE ~s", [File]) of
+ pos_compl ->
+ {reply, ok, State};
+ {error, enotconn} ->
+ ?STOP_RET(econn);
+ _ ->
+ {reply, {error, epath}, State}
+ end;
+
+handle_call({mkdir, Dir}, _From, State) when State#state.chunk == false ->
+ #state{csock = CSock} = State,
+ case ctrl_cmd(CSock, "MKD ~s", [Dir]) of
+ pos_compl ->
+ {reply, ok, State};
+ {error, enotconn} ->
+ ?STOP_RET(econn);
+ _ ->
+ {reply, {error, epath}, State}
+ end;
+
+handle_call({rmdir, Dir}, _From, State) when State#state.chunk == false ->
+ #state{csock = CSock} = State,
+ case ctrl_cmd(CSock, "RMD ~s", [Dir]) of
+ pos_compl ->
+ {reply, ok, State};
+ {error, enotconn} ->
+ ?STOP_RET(econn);
+ _ ->
+ {reply, {error, epath}, State}
+ end;
+
+handle_call({type, Type}, _From, State) when State#state.chunk == false ->
+ #state{csock = CSock} = State,
+ case Type of
+ ascii ->
+ set_type(ascii, CSock),
+ {reply, ok, State#state{type = ascii}};
+ binary ->
+ set_type(binary, CSock),
+ {reply, ok, State#state{type = binary}};
+ _ ->
+ {reply, {error, etype}, State}
+ end;
+
+handle_call({recv, RFile, LFile}, _From, State) when State#state.chunk == false ->
+ #state{csock = CSock, ldir = LDir} = State,
+ ALFile = case LFile of
+ "" ->
+ absname(LDir, RFile);
+ _ ->
+ absname(LDir, LFile)
+ end,
+ case file_open(ALFile, write) of
+ {ok, Fd} ->
+ LSock = listen_data(CSock, binary),
+ Ret = case ctrl_cmd(CSock, "RETR ~s", [RFile]) of
+ pos_prel ->
+ DSock = accept_data(LSock),
+ recv_file(DSock, Fd),
+ Reply0 = case result(CSock) of
+ pos_compl ->
+ ok;
+ _ ->
+ {error, epath}
+ end,
+ sock_close(DSock),
+ {reply, Reply0, State};
+ {error, enotconn} ->
+ ?STOP_RET(econn);
+ _ ->
+ {reply, {error, epath}, State}
+ end,
+ file_close(Fd),
+ Ret;
+ {error, _What} ->
+ {reply, {error, epath}, State}
+ end;
+
+handle_call({recv_bin, RFile}, _From, State) when State#state.chunk == false ->
+ #state{csock = CSock, ldir = LDir} = State,
+ LSock = listen_data(CSock, binary),
+ case ctrl_cmd(CSock, "RETR ~s", [RFile]) of
+ pos_prel ->
+ DSock = accept_data(LSock),
+ Reply = recv_binary(DSock,CSock),
+ sock_close(DSock),
+ {reply, Reply, State};
+ {error, enotconn} ->
+ ?STOP_RET(econn);
+ _ ->
+ {reply, {error, epath}, State}
+ end;
+
+
+handle_call({recv_chunk_start, RFile}, _From, State)
+ when State#state.chunk == false ->
+ start_chunk_transfer("RETR",RFile,State);
+
+handle_call(recv_chunk, _From, State)
+ when State#state.chunk == true ->
+ do_recv_chunk(State);
+
+
+handle_call({send, LFile, RFile}, _From, State)
+ when State#state.chunk == false ->
+ transfer_file("STOR",LFile,RFile,State);
+
+handle_call({append, LFile, RFile}, _From, State)
+ when State#state.chunk == false ->
+ transfer_file("APPE",LFile,RFile,State);
+
+
+handle_call({send_bin, Bin, RFile}, _From, State)
+ when State#state.chunk == false ->
+ transfer_data("STOR",Bin,RFile,State);
+
+handle_call({append_bin, Bin, RFile}, _From, State)
+ when State#state.chunk == false ->
+ transfer_data("APPE",Bin,RFile,State);
+
+
+
+handle_call({send_chunk_start, RFile}, _From, State)
+ when State#state.chunk == false ->
+ start_chunk_transfer("STOR",RFile,State);
+
+handle_call({append_chunk_start,RFile},_From,State)
+ when State#state.chunk==false->
+ start_chunk_transfer("APPE",RFile,State);
+
+handle_call({send_chunk, Bin}, _From, State)
+ when State#state.chunk == true ->
+ chunk_transfer(Bin,State);
+
+handle_call({append_chunk, Bin}, _From, State)
+ when State#state.chunk == true ->
+ chunk_transfer(Bin,State);
+
+handle_call(append_chunk_end, _From, State)
+ when State#state.chunk == true ->
+ end_chunk_transfer(State);
+
+handle_call(send_chunk_end, _From, State)
+ when State#state.chunk == true ->
+ end_chunk_transfer(State);
+
+
+
+handle_call(close, _From, State) when State#state.chunk == false ->
+ #state{csock = CSock} = State,
+ ctrl_cmd(CSock, "QUIT", []),
+ sock_close(CSock),
+ {stop, normal, ok, State};
+
+handle_call(_, _From, State) when State#state.chunk == true ->
+ {reply, {error, echunk}, State}.
+
+
+handle_cast(Msg, State) ->
+ {noreply, State}.
+
+
+handle_info({Sock, {fromsocket, Bytes}}, State) when Sock == State#state.csock ->
+ put(leftovers, Bytes ++ leftovers()),
+ {noreply, State};
+
+%% Data connection closed (during chunk sending)
+handle_info({Sock, {socket_closed, _Reason}}, State) when Sock == State#state.dsock ->
+ {noreply, State#state{dsock = undefined}};
+
+%% Control connection closed.
+handle_info({Sock, {socket_closed, _Reason}}, State) when Sock == State#state.csock ->
+ debug(" sc : ~s~n",[leftovers()]),
+ {stop, ftp_server_close, State#state{csock = undefined}};
+
+handle_info(Info, State) ->
+ error_logger:info_msg("ftp : ~w : Unexpected message: ~w\n", [self(),Info]),
+ {noreply, State}.
+
+code_change(OldVsn,State,Extra)->
+ {ok,State}.
+
+terminate(Reason, State) ->
+ ok.
+%%
+%% OPEN CONNECTION
+%%
+open(Host,Port,Timeout,State)->
+ case sock_connect(Host,Port,Timeout) of
+ {error, What} ->
+ {stop, normal, {error, What}, State};
+ CSock ->
+ case result(CSock, State#state.flags) of
+ {error,Reason} ->
+ sock_close(CSock),
+ {stop,normal,{error,Reason},State};
+ _ -> % We should really check this...
+ {reply, {ok, self()}, State#state{csock = CSock}}
+ end
+ end.
+
+
+
+%%
+%% CONTROL CONNECTION
+%%
+
+ctrl_cmd(CSock, Fmt, Args) ->
+ Cmd = mk_cmd(Fmt, Args),
+ case sock_write(CSock, Cmd) of
+ ok ->
+ debug(" cmd : ~s",[Cmd]),
+ result(CSock);
+ {error, enotconn} ->
+ {error, enotconn};
+ Other ->
+ Other
+ end.
+
+mk_cmd(Fmt, Args) ->
+ [io_lib:format(Fmt, Args)| "\r\n"]. % Deep list ok.
+
+%%
+%% TRANSFER TYPE
+%%
+
+%%
+%% set_type(NewType, CurrType, CSock)
+%% reset_type(NewType, CurrType, CSock)
+%%
+set_type(Type, Type, CSock) ->
+ ok;
+set_type(NewType, _OldType, CSock) ->
+ set_type(NewType, CSock).
+
+reset_type(Type, Type, CSock) ->
+ ok;
+reset_type(_NewType, OldType, CSock) ->
+ set_type(OldType, CSock).
+
+set_type(ascii, CSock) ->
+ ctrl_cmd(CSock, "TYPE A", []);
+set_type(binary, CSock) ->
+ ctrl_cmd(CSock, "TYPE I", []).
+
+%%
+%% DATA CONNECTION
+%%
+
+%% Create a listen socket for a data connection and send a PORT command
+%% containing the IP address and port number. Mode is binary or raw.
+%%
+listen_data(CSock, Mode) ->
+ {IP, _} = sock_name(CSock), % IP address of control conn.
+ LSock = sock_listen(Mode, IP),
+ Port = sock_listen_port(LSock),
+ {A1, A2, A3, A4} = IP,
+ {P1, P2} = {Port div 256, Port rem 256},
+ ctrl_cmd(CSock, "PORT ~w,~w,~w,~w,~w,~w", [A1, A2, A3, A4, P1, P2]),
+ LSock.
+
+%%
+%% Accept the data connection and close the listen socket.
+%%
+accept_data(LSock) ->
+ Sock = sock_accept(LSock),
+ sock_close(LSock),
+ Sock.
+
+%%
+%% DATA COLLECTION (ls, dir)
+%%
+%% Socket is a byte stream in ASCII mode.
+%%
+
+%% Receive data (from data connection).
+recv_data(Sock) ->
+ recv_data(Sock, [], 0).
+recv_data(Sock, Sofar, ?OPER_TIMEOUT) ->
+ sock_close(Sock),
+ {ok, lists:flatten(lists:reverse(Sofar))};
+recv_data(Sock, Sofar, Retry) ->
+ case sock_read(Sock) of
+ {ok, Data} ->
+ debug(" dbg : received some data: ~n~s", [Data]),
+ recv_data(Sock, [Data| Sofar], 0);
+ {error, timeout} ->
+ %% Retry..
+ recv_data(Sock, Sofar, Retry+1);
+ {error, Reason} ->
+ SoFar1 = lists:flatten(lists:reverse(Sofar)),
+ {error, {socket_error, Reason, SoFar1, Retry}};
+ {closed, _} ->
+ {ok, lists:flatten(lists:reverse(Sofar))}
+ end.
+
+%%
+%% BINARY TRANSFER
+%%
+
+%% --------------------------------------------------
+
+%% recv_binary(DSock,CSock) = {ok,Bin} | {error,Reason}
+%%
+recv_binary(DSock,CSock) ->
+ recv_binary1(recv_binary2(DSock,[],0),CSock).
+
+recv_binary1(Reply,Sock) ->
+ case result(Sock) of
+ pos_compl -> Reply;
+ _ -> {error, epath}
+ end.
+
+recv_binary2(Sock, _Bs, ?OPER_TIMEOUT) ->
+ sock_close(Sock),
+ {error,eclosed};
+recv_binary2(Sock, Bs, Retry) ->
+ case sock_read(Sock) of
+ {ok, Bin} ->
+ recv_binary2(Sock, [Bs, Bin], 0);
+ {error, timeout} ->
+ recv_binary2(Sock, Bs, Retry+1);
+ {closed, _Why} ->
+ {ok,list_to_binary(Bs)}
+ end.
+
+%% --------------------------------------------------
+
+%%
+%% recv_chunk
+%%
+
+do_recv_chunk(#state{dsock = undefined} = State) ->
+ {reply, {error,econn}, State};
+do_recv_chunk(State) ->
+ recv_chunk1(recv_chunk2(State, 0), State).
+
+recv_chunk1({ok, _Bin} = Reply, State) ->
+ {reply, Reply, State};
+%% Reply = ok | {error, Reason}
+recv_chunk1(Reply, #state{csock = CSock} = State) ->
+ State1 = State#state{dsock = undefined, chunk = false},
+ case result(CSock) of
+ pos_compl ->
+ {reply, Reply, State1};
+ _ ->
+ {reply, {error, epath}, State1}
+ end.
+
+recv_chunk2(#state{dsock = DSock} = State, ?OPER_TIMEOUT) ->
+ sock_close(DSock),
+ {error, eclosed};
+recv_chunk2(#state{dsock = DSock} = State, Retry) ->
+ case sock_read(DSock) of
+ {ok, Bin} ->
+ {ok, Bin};
+ {error, timeout} ->
+ recv_chunk2(State, Retry+1);
+ {closed, Reason} ->
+ debug(" dbg : socket closed: ~p", [Reason]),
+ ok
+ end.
+
+
+%% --------------------------------------------------
+
+%%
+%% FILE TRANSFER
+%%
+
+recv_file(Sock, Fd) ->
+ recv_file(Sock, Fd, 0).
+
+recv_file(Sock, Fd, ?OPER_TIMEOUT) ->
+ sock_close(Sock),
+ {closed, timeout};
+recv_file(Sock, Fd, Retry) ->
+ case sock_read(Sock) of
+ {ok, Bin} ->
+ file_write(Fd, Bin),
+ recv_file(Sock, Fd);
+ {error, timeout} ->
+ recv_file(Sock, Fd, Retry+1);
+% {error, Reason} ->
+% SoFar1 = lists:flatten(lists:reverse(Sofar)),
+% exit({socket_error, Reason, Sock, SoFar1, Retry});
+ {closed, How} ->
+ {closed, How}
+ end.
+
+%%
+%% send_file(Fd, Sock) = ok | {error, Why}
+%%
+
+send_file(Fd, Sock) ->
+ {N, Bin} = file_read(Fd),
+ if
+ N > 0 ->
+ case sock_write(Sock, Bin) of
+ ok ->
+ send_file(Fd, Sock);
+ {error, Reason} ->
+ {error, Reason}
+ end;
+ true ->
+ ok
+ end.
+
+
+
+%%
+%% PARSING OF RESULT LINES
+%%
+
+%% Excerpt from RFC 959:
+%%
+%% "A reply is defined to contain the 3-digit code, followed by Space
+%% <SP>, followed by one line of text (where some maximum line length
+%% has been specified), and terminated by the Telnet end-of-line
+%% code. There will be cases however, where the text is longer than
+%% a single line. In these cases the complete text must be bracketed
+%% so the User-process knows when it may stop reading the reply (i.e.
+%% stop processing input on the control connection) and go do other
+%% things. This requires a special format on the first line to
+%% indicate that more than one line is coming, and another on the
+%% last line to designate it as the last. At least one of these must
+%% contain the appropriate reply code to indicate the state of the
+%% transaction. To satisfy all factions, it was decided that both
+%% the first and last line codes should be the same.
+%%
+%% Thus the format for multi-line replies is that the first line
+%% will begin with the exact required reply code, followed
+%% immediately by a Hyphen, "-" (also known as Minus), followed by
+%% text. The last line will begin with the same code, followed
+%% immediately by Space <SP>, optionally some text, and the Telnet
+%% end-of-line code.
+%%
+%% For example:
+%% 123-First line
+%% Second line
+%% 234 A line beginning with numbers
+%% 123 The last line
+%%
+%% The user-process then simply needs to search for the second
+%% occurrence of the same reply code, followed by <SP> (Space), at
+%% the beginning of a line, and ignore all intermediary lines. If
+%% an intermediary line begins with a 3-digit number, the Server
+%% must pad the front to avoid confusion.
+%%
+%% This scheme allows standard system routines to be used for
+%% reply information (such as for the STAT reply), with
+%% "artificial" first and last lines tacked on. In rare cases
+%% where these routines are able to generate three digits and a
+%% Space at the beginning of any line, the beginning of each
+%% text line should be offset by some neutral text, like Space.
+%%
+%% This scheme assumes that multi-line replies may not be nested."
+
+%% We have to collect the stream of result characters into lines (ending
+%% in "\r\n"; we check for "\n"). When a line is assembled, left-over
+%% characters are saved in the process dictionary.
+%%
+
+%% result(Sock) = rescode()
+%%
+result(Sock) ->
+ result(Sock, false).
+
+result_line(Sock) ->
+ result(Sock, true).
+
+%% result(Sock, Bool) = {error,Reason} | rescode() | {rescode(), Lines}
+%% Printout if Bool = true.
+%%
+result(Sock, RetForm) ->
+ case getline(Sock) of
+ Line when length(Line) > 3 ->
+ [D1, D2, D3| Tail] = Line,
+ case Tail of
+ [$-| _] ->
+ parse_to_end(Sock, [D1, D2, D3, $ ]); % 3 digits + space
+ _ ->
+ ok
+ end,
+ result(D1,D2,D3,Line,RetForm);
+ _ ->
+ retform(rescode(?PERM_NEG_COMPL,-1,-1),[],RetForm)
+ end.
+
+result(D1,_D2,_D3,Line,_RetForm) when D1 - $0 > 10 ->
+ {error,{invalid_server_response,Line}};
+result(D1,_D2,_D3,Line,_RetForm) when D1 - $0 < 0 ->
+ {error,{invalid_server_response,Line}};
+result(D1,D2,D3,Line,RetForm) ->
+ Res1 = D1 - $0,
+ Res2 = D2 - $0,
+ Res3 = D3 - $0,
+ verbose(" ~w : ~s", [Res1, Line]),
+ retform(rescode(Res1,Res2,Res3),Line,RetForm).
+
+retform(ResCode,Line,true) ->
+ {ResCode,Line};
+retform(ResCode,_,_) ->
+ ResCode.
+
+leftovers() ->
+ case get(leftovers) of
+ undefined -> [];
+ X -> X
+ end.
+
+%% getline(Sock) = Line
+%%
+getline(Sock) ->
+ getline(Sock, leftovers()).
+
+getline(Sock, Rest) ->
+ getline1(Sock, split($\n, Rest), 0).
+
+getline1(Sock, {[], Rest}, ?OPER_TIMEOUT) ->
+ sock_close(Sock),
+ put(leftovers, Rest),
+ [];
+getline1(Sock, {[], Rest}, Retry) ->
+ case sock_read(Sock) of
+ {ok, More} ->
+ debug(" read : ~s~n",[More]),
+ getline(Sock, Rest ++ More);
+ {error, timeout} ->
+ %% Retry..
+ getline1(Sock, {[], Rest}, Retry+1);
+ Error ->
+ put(leftovers, Rest),
+ []
+ end;
+getline1(Sock, {Line, Rest}, Retry) ->
+ put(leftovers, Rest),
+ Line.
+
+parse_to_end(Sock, Prefix) ->
+ Line = getline(Sock),
+ case lists:prefix(Prefix, Line) of
+ false ->
+ parse_to_end(Sock, Prefix);
+ true ->
+ ok
+ end.
+
+
+%% Split list after first occurence of S.
+%% Returns {Prefix, Suffix} ({[], Cs} if S not found).
+split(S, Cs) ->
+ split(S, Cs, []).
+
+split(S, [S| Cs], As) ->
+ {lists:reverse([S|As]), Cs};
+split(S, [C| Cs], As) ->
+ split(S, Cs, [C| As]);
+split(_, [], As) ->
+ {[], lists:reverse(As)}.
+
+%%
+%% FILE INTERFACE
+%%
+%% All files are opened raw in binary mode.
+%%
+-define(BUFSIZE, 4096).
+
+file_open(File, Option) ->
+ file:open(File, [raw, binary, Option]).
+
+file_close(Fd) ->
+ file:close(Fd).
+
+
+file_read(Fd) -> % Compatible with pre R2A.
+ case file:read(Fd, ?BUFSIZE) of
+ {ok, {N, Bytes}} ->
+ {N, Bytes};
+ {ok, Bytes} ->
+ {size(Bytes), Bytes};
+ eof ->
+ {0, []}
+ end.
+
+file_write(Fd, Bytes) ->
+ file:write(Fd, Bytes).
+
+absname(Dir, File) -> % Args swapped.
+ filename:absname(File, Dir).
+
+
+
+%% sock_start()
+%%
+
+%%
+%% USE GEN_TCP
+%%
+
+sock_start() ->
+ inet_db:start().
+
+%%
+%% Connect to FTP server at Host (default is TCP port 21) in raw mode,
+%% in order to establish a control connection.
+%%
+
+sock_connect(Host,Port,TimeOut) ->
+ debug(" info : connect to server on ~p:~p~n",[Host,Port]),
+ Opts = [{packet, 0}, {active, false}],
+ case (catch gen_tcp:connect(Host, Port, Opts,TimeOut)) of
+ {'EXIT', R1} -> % XXX Probably no longer needed.
+ debug(" error: socket connectionn failed with exit reason:"
+ "~n ~p",[R1]),
+ {error, ehost};
+ {error, R2} ->
+ debug(" error: socket connectionn failed with exit reason:"
+ "~n ~p",[R2]),
+ {error, ehost};
+ {ok, Sock} ->
+ Sock
+ end.
+
+%%
+%% Create a listen socket (any port) in binary or raw non-packet mode for
+%% data connection.
+%%
+sock_listen(Mode, IP) ->
+ Opts = case Mode of
+ binary ->
+ [binary, {packet, 0}];
+ raw ->
+ [{packet, 0}]
+ end,
+ {ok, Sock} = gen_tcp:listen(0, [{ip, IP}, {active, false} | Opts]),
+ Sock.
+
+sock_accept(LSock) ->
+ {ok, Sock} = gen_tcp:accept(LSock),
+ Sock.
+
+sock_close(undefined) ->
+ ok;
+sock_close(Sock) ->
+ gen_tcp:close(Sock).
+
+sock_read(Sock) ->
+ case gen_tcp:recv(Sock, 0, ?BYTE_TIMEOUT) of
+ {ok, Bytes} ->
+ {ok, Bytes};
+
+ {error, closed} ->
+ {closed, closed}; % Yes
+
+ %% --- OTP-4770 begin ---
+ %%
+ %% This seems to happen on windows
+ %% "Someone" tried to close an already closed socket...
+ %%
+
+ {error, enotsock} ->
+ {closed, enotsock};
+
+ %%
+ %% --- OTP-4770 end ---
+
+ {error, etimedout} ->
+ {error, timeout};
+
+ Other ->
+ Other
+ end.
+
+%% receive
+%% {tcp, Sock, Bytes} ->
+%% {ok, Bytes};
+%% {tcp_closed, Sock} ->
+%% {closed, closed}
+%% end.
+
+sock_write(Sock, Bytes) ->
+ gen_tcp:send(Sock, Bytes).
+
+sock_name(Sock) ->
+ {ok, {IP, Port}} = inet:sockname(Sock),
+ {IP, Port}.
+
+sock_listen_port(LSock) ->
+ {ok, Port} = inet:port(LSock),
+ Port.
+
+
+%%
+%% ERROR STRINGS
+%%
+errstr({error, Reason}) ->
+ errstr(Reason);
+
+errstr(echunk) -> "Synchronisation error during chung sending.";
+errstr(eclosed) -> "Session has been closed.";
+errstr(econn) -> "Connection to remote server prematurely closed.";
+errstr(eexists) ->"File or directory already exists.";
+errstr(ehost) -> "Host not found, FTP server not found, "
+"or connection rejected.";
+errstr(elogin) -> "User not logged in.";
+errstr(enotbinary) -> "Term is not a binary.";
+errstr(epath) -> "No such file or directory, already exists, "
+"or permission denied.";
+errstr(etype) -> "No such type.";
+errstr(euser) -> "User name or password not valid.";
+errstr(etnospc) -> "Insufficient storage space in system.";
+errstr(epnospc) -> "Exceeded storage allocation "
+"(for current directory or dataset).";
+errstr(efnamena) -> "File name not allowed.";
+errstr(Reason) ->
+ lists:flatten(io_lib:format("Unknown error: ~w", [Reason])).
+
+
+
+%% ----------------------------------------------------------
+
+get_verbose(Params) -> check_param(verbose,Params).
+
+get_debug(Flags) -> check_param(debug,Flags).
+
+check_param(P,Ps) -> lists:member(P,Ps).
+
+
+%% verbose -> ok
+%%
+%% Prints the string if the Flags list is non-epmty
+%%
+%% Params: F Format string
+%% A Arguments to the format string
+%%
+verbose(F,A) -> verbose(get(verbose),F,A).
+
+verbose(true,F,A) -> print(F,A);
+verbose(_,_F,_A) -> ok.
+
+
+
+
+%% debug -> ok
+%%
+%% Prints the string if debug enabled
+%%
+%% Params: F Format string
+%% A Arguments to the format string
+%%
+debug(F,A) -> debug(get(debug),F,A).
+
+debug(true,F,A) -> print(F,A);
+debug(_,_F,_A) -> ok.
+
+
+print(F,A) -> io:format(F,A).
+
+
+
+transfer_file(Cmd,LFile,RFile,State)->
+ #state{csock = CSock, ldir = LDir} = State,
+ ARFile = case RFile of
+ "" ->
+ LFile;
+ _ ->
+ RFile
+ end,
+ ALFile = absname(LDir, LFile),
+ case file_open(ALFile, read) of
+ {ok, Fd} ->
+ LSock = listen_data(CSock, binary),
+ case ctrl_cmd(CSock, "~s ~s", [Cmd,ARFile]) of
+ pos_prel ->
+ DSock = accept_data(LSock),
+ SFreply = send_file(Fd, DSock),
+ file_close(Fd),
+ sock_close(DSock),
+ case {SFreply,result(CSock)} of
+ {ok,pos_compl} ->
+ {reply, ok, State};
+ {ok,Other} ->
+ debug(" error: unknown reply: ~p~n",[Other]),
+ {reply, {error, epath}, State};
+ {{error,Why},Result} ->
+ ?STOP_RET(retcode(Result,econn))
+ end;
+ {error, enotconn} ->
+ ?STOP_RET(econn);
+ Other ->
+ debug(" error: ctrl failed: ~p~n",[Other]),
+ {reply, {error, epath}, State}
+ end;
+ {error, Reason} ->
+ debug(" error: file open: ~p~n",[Reason]),
+ {reply, {error, epath}, State}
+ end.
+
+transfer_data(Cmd,Bin,RFile,State)->
+ #state{csock = CSock, ldir = LDir} = State,
+ LSock = listen_data(CSock, binary),
+ case ctrl_cmd(CSock, "~s ~s", [Cmd,RFile]) of
+ pos_prel ->
+ DSock = accept_data(LSock),
+ SReply = sock_write(DSock, Bin),
+ sock_close(DSock),
+ case {SReply,result(CSock)} of
+ {ok,pos_compl} ->
+ {reply, ok, State};
+ {ok,trans_no_space} ->
+ ?STOP_RET(etnospc);
+ {ok,perm_no_space} ->
+ ?STOP_RET(epnospc);
+ {ok,perm_fname_not_allowed} ->
+ ?STOP_RET(efnamena);
+ {ok,Other} ->
+ debug(" error: unknown reply: ~p~n",[Other]),
+ {reply, {error, epath}, State};
+ {{error,Why},Result} ->
+ ?STOP_RET(retcode(Result,econn))
+ %% {{error,_Why},_Result} ->
+ %% ?STOP_RET(econn)
+ end;
+
+ {error, enotconn} ->
+ ?STOP_RET(econn);
+
+ Other ->
+ debug(" error: ctrl failed: ~p~n",[Other]),
+ {reply, {error, epath}, State}
+ end.
+
+
+start_chunk_transfer(Cmd, RFile, #state{csock = CSock} = State) ->
+ LSock = listen_data(CSock, binary),
+ case ctrl_cmd(CSock, "~s ~s", [Cmd,RFile]) of
+ pos_prel ->
+ DSock = accept_data(LSock),
+ {reply, ok, State#state{dsock = DSock, chunk = true}};
+ {error, enotconn} ->
+ ?STOP_RET(econn);
+ Otherwise ->
+ debug(" error: ctrl failed: ~p~n",[Otherwise]),
+ {reply, {error, epath}, State}
+ end.
+
+
+chunk_transfer(Bin,State)->
+ #state{dsock = DSock, csock = CSock} = State,
+ case DSock of
+ undefined ->
+ {reply,{error,econn},State};
+ _ ->
+ case sock_write(DSock, Bin) of
+ ok ->
+ {reply, ok, State};
+ Other ->
+ debug(" error: chunk write error: ~p~n",[Other]),
+ {reply, {error, econn}, State#state{dsock = undefined}}
+ end
+ end.
+
+
+
+end_chunk_transfer(State)->
+ #state{csock = CSock, dsock = DSock} = State,
+ case DSock of
+ undefined ->
+ Result = result(CSock),
+ case Result of
+ pos_compl ->
+ {reply,ok,State#state{dsock = undefined,
+ chunk = false}};
+ trans_no_space ->
+ ?STOP_RET(etnospc);
+ perm_no_space ->
+ ?STOP_RET(epnospc);
+ perm_fname_not_allowed ->
+ ?STOP_RET(efnamena);
+ Result ->
+ debug(" error: send chunk end (1): ~p~n",
+ [Result]),
+ {reply,{error,epath},State#state{dsock = undefined,
+ chunk = false}}
+ end;
+ _ ->
+ sock_close(DSock),
+ Result = result(CSock),
+ case Result of
+ pos_compl ->
+ {reply,ok,State#state{dsock = undefined,
+ chunk = false}};
+ trans_no_space ->
+ sock_close(CSock),
+ ?STOP_RET(etnospc);
+ perm_no_space ->
+ sock_close(CSock),
+ ?STOP_RET(epnospc);
+ perm_fname_not_allowed ->
+ sock_close(CSock),
+ ?STOP_RET(efnamena);
+ Result ->
+ debug(" error: send chunk end (2): ~p~n",
+ [Result]),
+ {reply,{error,epath},State#state{dsock = undefined,
+ chunk = false}}
+ end
+ end.
+
+get_key1(Key,List,Default)->
+ case lists:keysearch(Key,1,List)of
+ {value,{_,Val}}->
+ Val;
+ false->
+ Default
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/http.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/http.erl
new file mode 100644
index 0000000000..a732f23aec
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/http.erl
@@ -0,0 +1,260 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Mobile Arts AB
+%% Portions created by Mobile Arts are Copyright 2002, Mobile Arts AB
+%% All Rights Reserved.''
+%%
+%%
+
+%%% This version of the HTTP/1.1 client implements:
+%%% - RFC 2616 HTTP 1.1 client part
+%%% - RFC 2817 Upgrading to TLS Within HTTP/1.1 (not yet!)
+%%% - RFC 2818 HTTP Over TLS
+%%% - RFC 3229 Delta encoding in HTTP (not yet!)
+%%% - RFC 3230 Instance Digests in HTTP (not yet!)
+%%% - RFC 3310 Authentication and Key Agreement (AKA) (not yet!)
+%%% - HTTP/1.1 Specification Errata found at
+%%% http://world.std.com/~lawrence/http_errata.html
+%%% Additionaly follows the following recommendations:
+%%% - RFC 3143 Known HTTP Proxy/Caching Problems (not yet!)
+%%% - draft-nottingham-hdrreg-http-00.txt (not yet!)
+%%%
+%%% Depends on
+%%% - uri.erl for all URL parsing (except what is handled by the C driver)
+%%% - http_lib.erl for all parsing of body and headers
+%%%
+%%% Supported Settings are:
+%%% http_timeout % (int) Milliseconds before a request times out
+%%% http_useproxy % (bool) True if a proxy should be used
+%%% http_proxy % (string) Proxy
+%%% http_noproxylist % (list) List with hosts not requiring proxy
+%%% http_autoredirect % (bool) True if automatic redirection on 30X responses
+%%% http_ssl % (list) SSL settings. A non-empty list enables SSL/TLS
+%%% support in the HTTP client
+%%% http_pipelinesize % (int) Length of pipeline. 1 means no pipeline.
+%%% Only has effect when initiating a new session.
+%%% http_sessions % (int) Max number of open sessions for {Addr,Port}
+%%%
+%%% TODO: (Known bugs!)
+%% - Cache handling
+%% - Doesn't handle a bunch of entity headers properly
+%% - Better handling of status codes different from 200,30X and 50X
+%% - Many of the settings above are not implemented!
+%% - close_session/2 and cancel_request/1 doesn't work
+%% - Variable pipe size.
+%% - Due to the fact that inet_drv only has a single timer, the timeouts given
+%% for pipelined requests are not ok (too long)
+%%
+%% Note:
+%% - Some servers (e.g. Microsoft-IIS/5.0) may sometimes not return a proper
+%% 'Location' header on a redirect.
+%% The client will fail with {error,no_scheme} in these cases.
+
+-module(http).
+-author("[email protected]").
+
+-export([start/0,
+ request/3,request/4,cancel_request/1,
+ request_sync/2,request_sync/3]).
+
+-include("http.hrl").
+-include("jnets_httpd.hrl").
+
+-define(START_OPTIONS,[]).
+
+%%% HTTP Client manager. Used to store open connections.
+%%% Will be started automatically unless started explicitly.
+start() ->
+ application:start(ssl),
+ httpc_manager:start().
+
+%%% Asynchronous HTTP request that spawns a handler.
+%%% Method HTTPReq
+%%% options,get,head,delete,trace = {Url,Headers}
+%%% post,put = {Url,Headers,ContentType,Body}
+%%% where Url is a {Scheme,Host,Port,PathQuery} tuple, as returned by uri.erl
+%%%
+%%% Returns: {ok,ReqId} |
+%%% {error,Reason}
+%%% If {ok,Pid} was returned, the handler will return with
+%%% gen_server:cast(From,{Ref,ReqId,{error,Reason}}) |
+%%% gen_server:cast(From,{Ref,ReqId,{Status,Headers,Body}})
+%%% where Reason is an atom and Headers a #res_headers{} record
+%%% http:format_error(Reason) gives a more informative description.
+%%%
+%%% Note:
+%%% - Always try to find an open connection to a given host and port, and use
+%%% the associated socket.
+%%% - Unless a 'Connection: close' header is provided don't close the socket
+%%% after a response is given
+%%% - A given Pid, found in the database, might be terminated before the
+%%% message is sent to the Pid. This will happen e.g., if the connection is
+%%% closed by the other party and there are no pending requests.
+%%% - The HTTP connection process is spawned, if necessary, in
+%%% httpc_manager:add_connection/4
+request(Ref,Method,HTTPReqCont) ->
+ request(Ref,Method,HTTPReqCont,[],self()).
+
+request(Ref,Method,HTTPReqCont,Settings) ->
+ request(Ref,Method,HTTPReqCont,Settings,self()).
+
+request(Ref,Method,{{Scheme,Host,Port,PathQuery},
+ Headers,ContentType,Body},Settings,From) ->
+ case create_settings(Settings,#client_settings{}) of
+ {error,Reason} ->
+ {error,Reason};
+ CS ->
+ case create_headers(Headers,#req_headers{}) of
+ {error,Reason} ->
+ {error,Reason};
+ H ->
+ Req=#request{ref=Ref,from=From,
+ scheme=Scheme,address={Host,Port},
+ pathquery=PathQuery,method=Method,
+ headers=H,content={ContentType,Body},
+ settings=CS},
+ httpc_manager:request(Req)
+ end
+ end;
+request(Ref,Method,{Url,Headers},Settings,From) ->
+ request(Ref,Method,{Url,Headers,[],[]},Settings,From).
+
+%%% Cancels requests identified with ReqId.
+%%% FIXME! Doesn't work...
+cancel_request(ReqId) ->
+ httpc_manager:cancel_request(ReqId).
+
+%%% Close all sessions currently open to Host:Port
+%%% FIXME! Doesn't work...
+close_session(Host,Port) ->
+ httpc_manager:close_session(Host,Port).
+
+
+%%% Synchronous HTTP request that waits until a response is created
+%%% (e.g. successfull reply or timeout)
+%%% Method HTTPReq
+%%% options,get,head,delete,trace = {Url,Headers}
+%%% post,put = {Url,Headers,ContentType,Body}
+%%% where Url is a string() or a {Scheme,Host,Port,PathQuery} tuple
+%%%
+%%% Returns: {Status,Headers,Body} |
+%%% {error,Reason}
+%%% where Reason is an atom.
+%%% http:format_error(Reason) gives a more informative description.
+request_sync(Method,HTTPReqCont) ->
+ request_sync(Method,HTTPReqCont,[]).
+
+request_sync(Method,{Url,Headers},Settings)
+ when Method==options;Method==get;Method==head;Method==delete;Method==trace ->
+ case uri:parse(Url) of
+ {error,Reason} ->
+ {error,Reason};
+ ParsedUrl ->
+ request_sync(Method,{ParsedUrl,Headers,[],[]},Settings,0)
+ end;
+request_sync(Method,{Url,Headers,ContentType,Body},Settings)
+ when Method==post;Method==put ->
+ case uri:parse(Url) of
+ {error,Reason} ->
+ {error,Reason};
+ ParsedUrl ->
+ request_sync(Method,{ParsedUrl,Headers,ContentType,Body},Settings,0)
+ end;
+request_sync(Method,Request,Settings) ->
+ {error,bad_request}.
+
+request_sync(Method,HTTPCont,Settings,_Redirects) ->
+ case request(request_sync,Method,HTTPCont,Settings,self()) of
+ {ok,_ReqId} ->
+ receive
+ {'$gen_cast',{request_sync,_ReqId2,{Status,Headers,Body}}} ->
+ {Status,pp_headers(Headers),binary_to_list(Body)};
+ {'$gen_cast',{request_sync,_ReqId2,{error,Reason}}} ->
+ {error,Reason};
+ Error ->
+ Error
+ end;
+ Error ->
+ Error
+ end.
+
+
+create_settings([],Out) ->
+ Out;
+create_settings([{http_timeout,Val}|Settings],Out) ->
+ create_settings(Settings,Out#client_settings{timeout=Val});
+create_settings([{http_useproxy,Val}|Settings],Out) ->
+ create_settings(Settings,Out#client_settings{useproxy=Val});
+create_settings([{http_proxy,Val}|Settings],Out) ->
+ create_settings(Settings,Out#client_settings{proxy=Val});
+create_settings([{http_noproxylist,Val}|Settings],Out) ->
+ create_settings(Settings,Out#client_settings{noproxylist=Val});
+create_settings([{http_autoredirect,Val}|Settings],Out) ->
+ create_settings(Settings,Out#client_settings{autoredirect=Val});
+create_settings([{http_ssl,Val}|Settings],Out) ->
+ create_settings(Settings,Out#client_settings{ssl=Val});
+create_settings([{http_pipelinesize,Val}|Settings],Out)
+ when integer(Val),Val>0 ->
+ create_settings(Settings,Out#client_settings{max_quelength=Val});
+create_settings([{http_sessions,Val}|Settings],Out)
+ when integer(Val),Val>0 ->
+ create_settings(Settings,Out#client_settings{max_sessions=Val});
+create_settings([{Key,_Val}|_Settings],_Out) ->
+ io:format("ERROR bad settings, got ~p~n",[Key]),
+ {error,bad_settings}.
+
+
+create_headers([],Req) ->
+ Req;
+create_headers([{Key,Val}|Rest],Req) ->
+ case httpd_util:to_lower(Key) of
+ "expect" ->
+ create_headers(Rest,Req#req_headers{expect=Val});
+ OtherKey ->
+ create_headers(Rest,
+ Req#req_headers{other=[{OtherKey,Val}|
+ Req#req_headers.other]})
+ end.
+
+
+pp_headers(#res_headers{connection=Connection,
+ transfer_encoding=Transfer_encoding,
+ retry_after=Retry_after,
+ content_length=Content_length,
+ content_type=Content_type,
+ location=Location,
+ other=Other}) ->
+ H1=case Connection of
+ undefined -> [];
+ _ -> [{'Connection',Connection}]
+ end,
+ H2=case Transfer_encoding of
+ undefined -> [];
+ _ -> [{'Transfer-Encoding',Transfer_encoding}]
+ end,
+ H3=case Retry_after of
+ undefined -> [];
+ _ -> [{'Retry-After',Retry_after}]
+ end,
+ H4=case Location of
+ undefined -> [];
+ _ -> [{'Location',Location}]
+ end,
+ HCL=case Content_length of
+ "0" -> [];
+ _ -> [{'Content-Length',Content_length}]
+ end,
+ HCT=case Content_type of
+ undefined -> [];
+ _ -> [{'Content-Type',Content_type}]
+ end,
+ H1++H2++H3++H4++HCL++HCT++Other.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/http.hrl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/http.hrl
new file mode 100644
index 0000000000..6904a2379f
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/http.hrl
@@ -0,0 +1,127 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Mobile Arts AB
+%% Portions created by Mobile Arts are Copyright 2002, Mobile Arts AB
+%% All Rights Reserved.''
+%%
+%%
+
+-define(HTTP_REQUEST_TIMEOUT, 5000).
+-define(PIPELINE_LENGTH,3).
+-define(OPEN_SESSIONS,400).
+
+
+%%% FIXME! These definitions should probably be possible to defined via
+%%% user settings
+-define(MAX_REDIRECTS, 4).
+
+
+%%% Note that if not persitent the connection can be closed immediately on a
+%%% response, because new requests are not sent to this connection process.
+%%% address, % ({Host,Port}) Destination Host and Port
+-record(session,{
+ id, % (int) Session Id identifies session in http_manager
+ clientclose, % (bool) true if client requested "close" connection
+ scheme, % (atom) http (HTTP/TCP) or https (TCP/SSL/TCP)
+ socket, % (socket) Open socket, used by connection
+ pipeline=[], % (list) Sent requests, not yet taken care of by the
+ % associated http_responder.
+ quelength=1, % (int) Current length of pipeline (1 when created)
+ max_quelength% (int) Max pipeline length
+ }).
+
+%%% [{Pid,RequestQue,QueLength},...] list where
+%%% - RequestQue (implemented with a list) contains sent requests that
+%%% has not yet received a response (pipelined) AND is not currently
+%%% handled (awaiting data) by the session process.
+%%% - QueLength is the length of this que, but
+
+%%% Response headers
+-record(res_headers,{
+%%% --- Standard "General" headers
+% cache_control,
+ connection,
+% date,
+% pragma,
+% trailer,
+ transfer_encoding,
+% upgrade,
+% via,
+% warning,
+%%% --- Standard "Request" headers
+% accept_ranges,
+% age,
+% etag,
+ location,
+% proxy_authenticate,
+ retry_after,
+% server,
+% vary,
+% www_authenticate,
+%%% --- Standard "Entity" headers
+% allow,
+% content_encoding,
+% content_language,
+ content_length="0",
+% content_location,
+% content_md5,
+% content_range,
+ content_type,
+% expires,
+% last_modified,
+ other=[] % (list) Key/Value list with other headers
+ }).
+
+%%% All data associated to a specific HTTP request
+-record(request,{
+ id, % (int) Request Id
+ ref, % Caller specific
+ from, % (pid) Caller
+ redircount=0,% (int) Number of redirects made for this request
+ scheme, % (http|https) (HTTP/TCP) or (TCP/SSL/TCP) connection
+ address, % ({Host,Port}) Destination Host and Port
+ pathquery, % (string) Rest of parsed URL
+ method, % (atom) HTTP request Method
+ headers, % (list) Key/Value list with Headers
+ content, % ({ContentType,Body}) Current HTTP request
+ settings % (#client_settings{}) User defined settings
+ }).
+
+-record(response,{
+ scheme, % (atom) http (HTTP/TCP) or https (TCP/SSL/TCP)
+ socket, % (socket) Open socket, used by connection
+ status,
+ http_version,
+ headers=#res_headers{},
+ body = <<>>
+ }).
+
+
+
+
+%%% HTTP Client settings
+-record(client_settings,{
+ timeout=?HTTP_REQUEST_TIMEOUT,
+ % (int) Milliseconds before a request times out
+ useproxy=false, % (bool) True if the proxy should be used
+ proxy=undefined, % (tuple) Parsed Proxy URL
+ noproxylist=[], % (list) List with hosts not requiring proxy
+ autoredirect=true, % (bool) True if automatic redirection on 30X
+ % responses.
+ max_sessions=?OPEN_SESSIONS,% (int) Max open sessions for any Adr,Port
+ max_quelength=?PIPELINE_LENGTH, % (int) Max pipeline length
+% ssl=[{certfile,"/jb/server_root/ssl/ssl_client.pem"},
+% {keyfile,"/jb/server_root/ssl/ssl_client.pem"},
+% {verify,0}]
+ ssl=false % (list) SSL settings. A non-empty list enables SSL/TLS
+ % support in the HTTP client
+ }).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/http_lib.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/http_lib.erl
new file mode 100644
index 0000000000..4f6c43710b
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/http_lib.erl
@@ -0,0 +1,745 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Mobile Arts AB
+%% Portions created by Mobile Arts are Copyright 2002, Mobile Arts AB
+%% All Rights Reserved.''
+%%
+%%
+%%% File : http_lib.erl
+%%% Author : Johan Blom <[email protected]>
+%%% Description : Generic, HTTP specific helper functions
+%%% Created : 4 Mar 2002 by Johan Blom
+
+%%% TODO
+%%% - Check if I need to anything special when parsing
+%%% "Content-Type:multipart/form-data"
+
+-module(http_lib).
+-author("[email protected]").
+
+-include("http.hrl").
+-include("jnets_httpd.hrl").
+
+-export([connection_close/1,
+ accept/3,deliver/3,recv/4,recv0/3,
+ connect/1,send/3,close/2,controlling_process/3,setopts/3,
+ getParameterValue/2,
+% get_var/2,
+ create_request_line/3]).
+
+-export([read_client_headers/2,read_server_headers/2,
+ get_auth_data/1,create_header_list/1,
+ read_client_body/2,read_client_multipartrange_body/3,
+ read_server_body/2]).
+
+
+%%% Server response:
+%%% Check "Connection" header if server requests session to be closed.
+%%% No 'close' means returns false
+%%% Client Request:
+%%% Check if 'close' in request headers
+%%% Only care about HTTP 1.1 clients!
+connection_close(Headers) when record(Headers,req_headers) ->
+ case Headers#req_headers.connection of
+ "close" ->
+ true;
+ "keep-alive" ->
+ false;
+ Value when list(Value) ->
+ true;
+ _ ->
+ false
+ end;
+connection_close(Headers) when record(Headers,res_headers) ->
+ case Headers#res_headers.connection of
+ "close" ->
+ true;
+ "keep-alive" ->
+ false;
+ Value when list(Value) ->
+ true;
+ _ ->
+ false
+ end.
+
+
+%% =============================================================================
+%%% Debugging:
+
+% format_time(TS) ->
+% {_,_,MicroSecs}=TS,
+% {{Y,Mon,D},{H,M,S}}=calendar:now_to_universal_time(TS),
+% lists:flatten(io_lib:format("~4.4.0w-~2.2.0w-~2.2.0w,~2.2.0w:~2.2.0w:~6.3.0f",
+% [Y,Mon,D,H,M,S+(MicroSecs/1000000)])).
+
+%% Time in milli seconds
+% t() ->
+% {A,B,C} = erlang:now(),
+% A*1000000000+B*1000+(C div 1000).
+
+% sz(L) when list(L) ->
+% length(L);
+% sz(B) when binary(B) ->
+% size(B);
+% sz(O) ->
+% {unknown_size,O}.
+
+
+%% =============================================================================
+
+getHeaderValue(_Attr,[]) ->
+ [];
+getHeaderValue(Attr,[{Attr,Value}|_Rest]) ->
+ Value;
+getHeaderValue(Attr,[_|Rest]) ->
+ getHeaderValue(Attr,Rest).
+
+getParameterValue(_Attr,undefined) ->
+ undefined;
+getParameterValue(Attr,List) ->
+ case lists:keysearch(Attr,1,List) of
+ {value,{Attr,Val}} ->
+ Val;
+ _ ->
+ undefined
+ end.
+
+create_request_line(Method,Path,{Major,Minor}) ->
+ [atom_to_list(Method)," ",Path,
+ " HTTP/",integer_to_list(Major),".",integer_to_list(Minor)];
+create_request_line(Method,Path,Minor) ->
+ [atom_to_list(Method)," ",Path," HTTP/1.",integer_to_list(Minor)].
+
+
+%%% ============================================================================
+read_client_headers(Info,Timeout) ->
+ Headers=read_response_h(Info#response.scheme,Info#response.socket,Timeout,
+ Info#response.headers),
+ Info#response{headers=Headers}.
+
+read_server_headers(Info,Timeout) ->
+ Headers=read_request_h(Info#mod.socket_type,Info#mod.socket,Timeout,
+ Info#mod.headers),
+ Info#mod{headers=Headers}.
+
+
+%% Parses the header of a HTTP request and returns a key,value tuple
+%% list containing Name and Value of each header directive as of:
+%%
+%% Content-Type: multipart/mixed -> {"Content-Type", "multipart/mixed"}
+%%
+%% But in http/1.1 the field-names are case insencitive so now it must be
+%% Content-Type: multipart/mixed -> {"content-type", "multipart/mixed"}
+%% The standard furthermore says that leading and traling white space
+%% is not a part of the fieldvalue and shall therefore be removed.
+read_request_h(SType,S,Timeout,H) ->
+ case recv0(SType,S,Timeout) of
+ {ok,{http_header,_,'Connection',_,Value}} ->
+ read_request_h(SType,S,Timeout,H#req_headers{connection=Value});
+ {ok,{http_header,_,'Content-Type',_,Val}} ->
+ read_request_h(SType,S,Timeout,H#req_headers{content_type=Val});
+ {ok,{http_header,_,'Host',_,Value}} ->
+ read_request_h(SType,S,Timeout,H#req_headers{host=Value});
+ {ok,{http_header,_,'Content-Length',_,Value}} ->
+ read_request_h(SType,S,Timeout,H#req_headers{content_length=Value});
+% {ok,{http_header,_,'Expect',_,Value}} -> % FIXME! Update inet_drv.c!!
+% read_request_h(SType,S,Timeout,H#req_headers{expect=Value});
+ {ok,{http_header,_,'Transfer-Encoding',_,V}} ->
+ read_request_h(SType,S,Timeout,H#req_headers{transfer_encoding=V});
+ {ok,{http_header,_,'Authorization',_,Value}} ->
+ read_request_h(SType,S,Timeout,H#req_headers{authorization=Value});
+ {ok,{http_header,_,'User-Agent',_,Value}} ->
+ read_request_h(SType,S,Timeout,H#req_headers{user_agent=Value});
+ {ok,{http_header,_,'Range',_,Value}} ->
+ read_request_h(SType,S,Timeout,H#req_headers{range=Value});
+ {ok,{http_header,_,'If-Range',_,Value}} ->
+ read_request_h(SType,S,Timeout,H#req_headers{if_range=Value});
+ {ok,{http_header,_,'If-Match',_,Value}} ->
+ read_request_h(SType,S,Timeout,H#req_headers{if_match=Value});
+ {ok,{http_header,_,'If-None-Match',_,Value}} ->
+ read_request_h(SType,S,Timeout,H#req_headers{if_none_match=Value});
+ {ok,{http_header,_,'If-Modified-Since',_,V}} ->
+ read_request_h(SType,S,Timeout,H#req_headers{if_modified_since=V});
+ {ok,{http_header,_,'If-Unmodified-Since',_,V}} ->
+ read_request_h(SType,S,Timeout,H#req_headers{if_unmodified_since=V});
+ {ok,{http_header,_,K,_,V}} ->
+ read_request_h(SType,S,Timeout,
+ H#req_headers{other=H#req_headers.other++[{K,V}]});
+ {ok,http_eoh} ->
+ H;
+ {error, timeout} when SType==http ->
+ throw({error, session_local_timeout});
+ {error, etimedout} when SType==https ->
+ throw({error, session_local_timeout});
+ {error, Reason} when Reason==closed;Reason==enotconn ->
+ throw({error, session_remotely_closed});
+ {error, Reason} ->
+ throw({error,Reason})
+ end.
+
+
+read_response_h(SType,S,Timeout,H) ->
+ case recv0(SType,S,Timeout) of
+ {ok,{http_header,_,'Connection',_,Val}} ->
+ read_response_h(SType,S,Timeout,H#res_headers{connection=Val});
+ {ok,{http_header,_,'Content-Length',_,Val}} ->
+ read_response_h(SType,S,Timeout,H#res_headers{content_length=Val});
+ {ok,{http_header,_,'Content-Type',_,Val}} ->
+ read_response_h(SType,S,Timeout,H#res_headers{content_type=Val});
+ {ok,{http_header,_,'Transfer-Encoding',_,V}} ->
+ read_response_h(SType,S,Timeout,H#res_headers{transfer_encoding=V});
+ {ok,{http_header,_,'Location',_,V}} ->
+ read_response_h(SType,S,Timeout,H#res_headers{location=V});
+ {ok,{http_header,_,'Retry-After',_,V}} ->
+ read_response_h(SType,S,Timeout,H#res_headers{retry_after=V});
+ {ok,{http_header,_,K,_,V}} ->
+ read_response_h(SType,S,Timeout,
+ H#res_headers{other=H#res_headers.other++[{K,V}]});
+ {ok,http_eoh} ->
+ H;
+ {error, timeout} when SType==http ->
+ throw({error, session_local_timeout});
+ {error, etimedout} when SType==https ->
+ throw({error, session_local_timeout});
+ {error, Reason} when Reason==closed;Reason==enotconn ->
+ throw({error, session_remotely_closed});
+ {error, Reason} ->
+ throw({error,Reason})
+ end.
+
+
+%%% Got the headers, and maybe a part of the body, now read in the rest
+%%% Note:
+%%% - No need to check for Expect header if client
+%%% - Currently no support for setting MaxHeaderSize in client, set to
+%%% unlimited.
+%%% - Move to raw packet mode as we are finished with HTTP parsing
+read_client_body(Info,Timeout) ->
+ Headers=Info#response.headers,
+ case Headers#res_headers.transfer_encoding of
+ "chunked" ->
+ ?DEBUG("read_entity_body2()->"
+ "Transfer-encoding:Chunked Data:",[]),
+ read_client_chunked_body(Info,Timeout,?MAXBODYSIZE);
+ Encoding when list(Encoding) ->
+ ?DEBUG("read_entity_body2()->"
+ "Transfer-encoding:Unknown",[]),
+ throw({error,unknown_coding});
+ _ ->
+ ContLen=list_to_integer(Headers#res_headers.content_length),
+ if
+ ContLen>?MAXBODYSIZE ->
+ throw({error,body_too_big});
+ true ->
+ ?DEBUG("read_entity_body2()->"
+ "Transfer-encoding:none ",[]),
+ Info#response{body=read_plain_body(Info#response.scheme,
+ Info#response.socket,
+ ContLen,
+ Info#response.body,
+ Timeout)}
+ end
+ end.
+
+
+%%% ----------------------------------------------------------------------
+read_server_body(Info,Timeout) ->
+ MaxBodySz=httpd_util:lookup(Info#mod.config_db,max_body_size,?MAXBODYSIZE),
+ ContLen=list_to_integer((Info#mod.headers)#req_headers.content_length),
+ %% ?vtrace("ContentLength: ~p", [ContLen]),
+ if
+ integer(ContLen),integer(MaxBodySz),ContLen>MaxBodySz ->
+ throw({error,body_too_big});
+ true ->
+ read_server_body2(Info,Timeout,ContLen,MaxBodySz)
+ end.
+
+
+%%----------------------------------------------------------------------
+%% Control if the body is transfer encoded, if so decode it.
+%% Note:
+%% - MaxBodySz has an integer value or 'nolimit'
+%% - ContLen has an integer value or 'undefined'
+%% All applications MUST be able to receive and decode the "chunked"
+%% transfer-coding, see RFC 2616 Section 3.6.1
+read_server_body2(Info,Timeout,ContLen,MaxBodySz) ->
+ ?DEBUG("read_entity_body2()->Max: ~p ~nLength:~p ~nSocket: ~p ~n",
+ [MaxBodySz,ContLen,Info#mod.socket]),
+ case (Info#mod.headers)#req_headers.transfer_encoding of
+ "chunked" ->
+ ?DEBUG("read_entity_body2()->"
+ "Transfer-encoding:Chunked Data:",[]),
+ read_server_chunked_body(Info,Timeout,MaxBodySz);
+ Encoding when list(Encoding) ->
+ ?DEBUG("read_entity_body2()->"
+ "Transfer-encoding:Unknown",[]),
+ httpd_response:send_status(Info,501,"Unknown Transfer-Encoding"),
+ http_lib:close(Info#mod.socket_type,Info#mod.socket),
+ throw({error,{status_sent,"Unknown Transfer-Encoding "++Encoding}});
+ _ when integer(ContLen),integer(MaxBodySz),ContLen>MaxBodySz ->
+ throw({error,body_too_big});
+ _ when integer(ContLen) ->
+ ?DEBUG("read_entity_body2()->"
+ "Transfer-encoding:none ",[]),
+ Info#mod{entity_body=read_plain_body(Info#mod.socket_type,
+ Info#mod.socket,
+ ContLen,Info#mod.entity_body,
+ Timeout)}
+ end.
+
+
+%%% ----------------------------------------------------------------------------
+%%% The body was plain, just read it from the socket.
+read_plain_body(_SocketType,Socket,0,Cont,_Timeout) ->
+ Cont;
+read_plain_body(SocketType,Socket,ContLen,Cont,Timeout) ->
+ Body=read_more_data(SocketType,Socket,ContLen,Timeout),
+ <<Cont/binary,Body/binary>>.
+
+%%% ----------------------------------------------------------------------------
+%%% The body was chunked, decode it.
+%%% From RFC2616, Section 3.6.1
+%% Chunked-Body = *chunk
+%% last-chunk
+%% trailer
+%% CRLF
+%%
+%% chunk = chunk-size [ chunk-extension ] CRLF
+%% chunk-data CRLF
+%% chunk-size = 1*HEX
+%% last-chunk = 1*("0") [ chunk-extension ] CRLF
+%%
+%% chunk-extension= *( ";" chunk-ext-name [ "=" chunk-ext-val ] )
+%% chunk-ext-name = token
+%% chunk-ext-val = token | quoted-string
+%% chunk-data = chunk-size(OCTET)
+%% trailer = *(entity-header CRLF)
+%%
+%%% "All applications MUST ignore chunk-extension extensions they do not
+%%% understand.", see RFC 2616 Section 3.6.1
+%%% We don't understand any extension...
+read_client_chunked_body(Info,Timeout,MaxChunkSz) ->
+ case read_chunk(Info#response.scheme,Info#response.socket,
+ Timeout,0,MaxChunkSz) of
+ {last_chunk,_ExtensionList} -> % Ignore extension
+ TrailH=read_headers_old(Info#response.scheme,Info#response.socket,
+ Timeout),
+ H=Info#response.headers,
+ OtherHeaders=H#res_headers.other++TrailH,
+ Info#response{headers=H#res_headers{other=OtherHeaders}};
+ {Chunk,ChunkSize,_ExtensionList} -> % Ignore extension
+ Info1=Info#response{body= <<(Info#response.body)/binary,
+ Chunk/binary>>},
+ read_client_chunked_body(Info1,Timeout,MaxChunkSz-ChunkSize);
+ {error,Reason} ->
+ throw({error,Reason})
+ end.
+
+
+read_server_chunked_body(Info,Timeout,MaxChunkSz) ->
+ case read_chunk(Info#mod.socket_type,Info#mod.socket,
+ Timeout,0,MaxChunkSz) of
+ {last_chunk,_ExtensionList} -> % Ignore extension
+ TrailH=read_headers_old(Info#mod.socket_type,Info#mod.socket,
+ Timeout),
+ H=Info#mod.headers,
+ OtherHeaders=H#req_headers.other++TrailH,
+ Info#mod{headers=H#req_headers{other=OtherHeaders}};
+ {Chunk,ChunkSize,_ExtensionList} -> % Ignore extension
+ Info1=Info#mod{entity_body= <<(Info#mod.entity_body)/binary,
+ Chunk/binary>>},
+ read_server_chunked_body(Info1,Timeout,MaxChunkSz-ChunkSize);
+ {error,Reason} ->
+ throw({error,Reason})
+ end.
+
+
+read_chunk(Scheme,Socket,Timeout,Int,MaxChunkSz) when MaxChunkSz>Int ->
+ case read_more_data(Scheme,Socket,1,Timeout) of
+ <<C>> when $0=<C,C=<$9 ->
+ read_chunk(Scheme,Socket,Timeout,16*Int+(C-$0),MaxChunkSz);
+ <<C>> when $a=<C,C=<$f ->
+ read_chunk(Scheme,Socket,Timeout,16*Int+10+(C-$a),MaxChunkSz);
+ <<C>> when $A=<C,C=<$F ->
+ read_chunk(Scheme,Socket,Timeout,16*Int+10+(C-$A),MaxChunkSz);
+ <<$;>> when Int>0 ->
+ ExtensionList=read_chunk_ext_name(Scheme,Socket,Timeout,[],[]),
+ read_chunk_data(Scheme,Socket,Int+1,ExtensionList,Timeout);
+ <<$;>> when Int==0 ->
+ ExtensionList=read_chunk_ext_name(Scheme,Socket,Timeout,[],[]),
+ read_data_lf(Scheme,Socket,Timeout),
+ {last_chunk,ExtensionList};
+ <<?CR>> when Int>0 ->
+ read_chunk_data(Scheme,Socket,Int+1,[],Timeout);
+ <<?CR>> when Int==0 ->
+ read_data_lf(Scheme,Socket,Timeout),
+ {last_chunk,[]};
+ <<C>> when C==$ -> % Some servers (e.g., Apache 1.3.6) throw in
+ % additional whitespace...
+ read_chunk(Scheme,Socket,Timeout,Int,MaxChunkSz);
+ _Other ->
+ {error,unexpected_chunkdata}
+ end;
+read_chunk(_Scheme,_Socket,_Timeout,_Int,_MaxChunkSz) ->
+ {error,body_too_big}.
+
+
+%%% Note:
+%%% - Got the initial ?CR already!
+%%% - Bitsyntax does not allow matching of ?CR,?LF in the end of the first read
+read_chunk_data(Scheme,Socket,Int,ExtensionList,Timeout) ->
+ case read_more_data(Scheme,Socket,Int,Timeout) of
+ <<?LF,Chunk/binary>> ->
+ case read_more_data(Scheme,Socket,2,Timeout) of
+ <<?CR,?LF>> ->
+ {Chunk,size(Chunk),ExtensionList};
+ _ ->
+ {error,bad_chunkdata}
+ end;
+ _ ->
+ {error,bad_chunkdata}
+ end.
+
+read_chunk_ext_name(Scheme,Socket,Timeout,Name,Acc) ->
+ Len=length(Name),
+ case read_more_data(Scheme,Socket,1,Timeout) of
+ $= when Len>0 ->
+ read_chunk_ext_val(Scheme,Socket,Timeout,Name,[],Acc);
+ $; when Len>0 ->
+ read_chunk_ext_name(Scheme,Socket,Timeout,[],
+ [{lists:reverse(Name),""}|Acc]);
+ ?CR when Len>0 ->
+ lists:reverse([{lists:reverse(Name,"")}|Acc]);
+ Token -> % FIXME Check that it is "token"
+ read_chunk_ext_name(Scheme,Socket,Timeout,[Token|Name],Acc);
+ _ ->
+ {error,bad_chunk_extension_name}
+ end.
+
+read_chunk_ext_val(Scheme,Socket,Timeout,Name,Val,Acc) ->
+ Len=length(Val),
+ case read_more_data(Scheme,Socket,1,Timeout) of
+ $; when Len>0 ->
+ read_chunk_ext_name(Scheme,Socket,Timeout,[],
+ [{Name,lists:reverse(Val)}|Acc]);
+ ?CR when Len>0 ->
+ lists:reverse([{Name,lists:reverse(Val)}|Acc]);
+ Token -> % FIXME Check that it is "token" or "quoted-string"
+ read_chunk_ext_val(Scheme,Socket,Timeout,Name,[Token|Val],Acc);
+ _ ->
+ {error,bad_chunk_extension_value}
+ end.
+
+read_data_lf(Scheme,Socket,Timeout) ->
+ case read_more_data(Scheme,Socket,1,Timeout) of
+ ?LF ->
+ ok;
+ _ ->
+ {error,bad_chunkdata}
+ end.
+
+%%% ----------------------------------------------------------------------------
+%%% The body was "multipart/byteranges", decode it.
+%%% Example from RFC 2616, Appendix 19.2
+%%% HTTP/1.1 206 Partial Content
+%%% Date: Wed, 15 Nov 1995 06:25:24 GMT
+%%% Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
+%%% Content-type: multipart/byteranges; boundary=THIS_STRING_SEPARATES
+%%%
+%%% --THIS_STRING_SEPARATES
+%%% Content-type: application/pdf
+%%% Content-range: bytes 500-999/8000
+%%%
+%%% ...the first range...
+%%% --THIS_STRING_SEPARATES
+%%% Content-type: application/pdf
+%%% Content-range: bytes 7000-7999/8000
+%%%
+%%% ...the second range
+%%% --THIS_STRING_SEPARATES--
+%%%
+%%% Notes:
+%%%
+%%% 1) Additional CRLFs may precede the first boundary string in the
+%%% entity.
+%%% FIXME!!
+read_client_multipartrange_body(Info,Parstr,Timeout) ->
+ Boundary=get_boundary(Parstr),
+ scan_boundary(Info,Boundary),
+ Info#response{body=read_multipart_body(Info,Boundary,Timeout)}.
+
+read_multipart_body(Info,Boundary,Timeout) ->
+ Info.
+
+% Headers=read_headers_old(Info#response.scheme,Info#response.socket,Timeout),
+% H=Info#response.headers,
+% OtherHeaders=H#res_headers.other++TrailH,
+% Info#response{headers=H#res_headers{other=OtherHeaders}}.
+
+
+scan_boundary(Info,Boundary) ->
+ Info.
+
+
+get_boundary(Parstr) ->
+ case skip_lwsp(Parstr) of
+ [] ->
+ throw({error,missing_range_boundary_parameter});
+ Val ->
+ get_boundary2(string:tokens(Val, ";"))
+ end.
+
+get_boundary2([]) ->
+ undefined;
+get_boundary2([Param|Rest]) ->
+ case string:tokens(skip_lwsp(Param), "=") of
+ ["boundary"++Attribute,Value] ->
+ Value;
+ _ ->
+ get_boundary2(Rest)
+ end.
+
+
+%% skip space & tab
+skip_lwsp([$ | Cs]) -> skip_lwsp(Cs);
+skip_lwsp([$\t | Cs]) -> skip_lwsp(Cs);
+skip_lwsp(Cs) -> Cs.
+
+%%% ----------------------------------------------------------------------------
+
+%%% Read the incoming data from the open socket.
+read_more_data(http,Socket,Len,Timeout) ->
+ case gen_tcp:recv(Socket,Len,Timeout) of
+ {ok,Val} ->
+ Val;
+ {error, timeout} ->
+ throw({error, session_local_timeout});
+ {error, Reason} when Reason==closed;Reason==enotconn ->
+ throw({error, session_remotely_closed});
+ {error, Reason} ->
+% httpd_response:send_status(Info,400,none),
+ throw({error, Reason})
+ end;
+read_more_data(https,Socket,Len,Timeout) ->
+ case ssl:recv(Socket,Len,Timeout) of
+ {ok,Val} ->
+ Val;
+ {error, etimedout} ->
+ throw({error, session_local_timeout});
+ {error, Reason} when Reason==closed;Reason==enotconn ->
+ throw({error, session_remotely_closed});
+ {error, Reason} ->
+% httpd_response:send_status(Info,400,none),
+ throw({error, Reason})
+ end.
+
+
+%% =============================================================================
+%%% Socket handling
+
+accept(http,ListenSocket, Timeout) ->
+ gen_tcp:accept(ListenSocket, Timeout);
+accept(https,ListenSocket, Timeout) ->
+ ssl:accept(ListenSocket, Timeout).
+
+
+close(http,Socket) ->
+ gen_tcp:close(Socket);
+close(https,Socket) ->
+ ssl:close(Socket).
+
+
+connect(#request{scheme=http,settings=Settings,address=Addr}) ->
+ case proxyusage(Addr,Settings) of
+ {error,Reason} ->
+ {error,Reason};
+ {Host,Port} ->
+ Opts=[binary,{active,false},{reuseaddr,true}],
+ gen_tcp:connect(Host,Port,Opts)
+ end;
+connect(#request{scheme=https,settings=Settings,address=Addr}) ->
+ case proxyusage(Addr,Settings) of
+ {error,Reason} ->
+ {error,Reason};
+ {Host,Port} ->
+ Opts=case Settings#client_settings.ssl of
+ false ->
+ [binary,{active,false}];
+ SSLSettings ->
+ [binary,{active,false}]++SSLSettings
+ end,
+ ssl:connect(Host,Port,Opts)
+ end.
+
+
+%%% Check to see if the given {Host,Port} tuple is in the NoProxyList
+%%% Returns an eventually updated {Host,Port} tuple, with the proxy address
+proxyusage(HostPort,Settings) ->
+ case Settings#client_settings.useproxy of
+ true ->
+ case noProxy(HostPort,Settings#client_settings.noproxylist) of
+ true ->
+ HostPort;
+ _ ->
+ case Settings#client_settings.proxy of
+ undefined ->
+ {error,no_proxy_defined};
+ ProxyHostPort ->
+ ProxyHostPort
+ end
+ end;
+ _ ->
+ HostPort
+ end.
+
+noProxy(_HostPort,[]) ->
+ false;
+noProxy({Host,Port},[{Host,Port}|Rest]) ->
+ true;
+noProxy(HostPort,[_|Rest]) ->
+ noProxy(HostPort,Rest).
+
+
+controlling_process(http,Socket,Pid) ->
+ gen_tcp:controlling_process(Socket,Pid);
+controlling_process(https,Socket,Pid) ->
+ ssl:controlling_process(Socket,Pid).
+
+
+deliver(SocketType, Socket, Message) ->
+ case send(SocketType, Socket, Message) of
+ {error, einval} ->
+ close(SocketType, Socket),
+ socket_closed;
+ {error, _Reason} ->
+% ?vlog("deliver(~p) failed for reason:"
+% "~n Reason: ~p",[SocketType,_Reason]),
+ close(SocketType, Socket),
+ socket_closed;
+ _Other ->
+ ok
+ end.
+
+
+recv0(http,Socket,Timeout) ->
+ gen_tcp:recv(Socket,0,Timeout);
+recv0(https,Socket,Timeout) ->
+ ssl:recv(Socket,0,Timeout).
+
+recv(http,Socket,Len,Timeout) ->
+ gen_tcp:recv(Socket,Len,Timeout);
+recv(https,Socket,Len,Timeout) ->
+ ssl:recv(Socket,Len,Timeout).
+
+
+setopts(http,Socket,Options) ->
+ inet:setopts(Socket,Options);
+setopts(https,Socket,Options) ->
+ ssl:setopts(Socket,Options).
+
+
+send(http,Socket,Message) ->
+ gen_tcp:send(Socket,Message);
+send(https,Socket,Message) ->
+ ssl:send(Socket,Message).
+
+
+%%% ============================================================================
+%%% HTTP Server only
+
+%%% Returns the Authenticating data in the HTTP request
+get_auth_data("Basic "++EncodedString) ->
+ UnCodedString=httpd_util:decode_base64(EncodedString),
+ case catch string:tokens(UnCodedString,":") of
+ [User,PassWord] ->
+ {User,PassWord};
+ {error,Error}->
+ {error,Error}
+ end;
+get_auth_data(BadCredentials) when list(BadCredentials) ->
+ {error,BadCredentials};
+get_auth_data(_) ->
+ {error,nouser}.
+
+
+create_header_list(H) ->
+ lookup(connection,H#req_headers.connection)++
+ lookup(host,H#req_headers.host)++
+ lookup(content_length,H#req_headers.content_length)++
+ lookup(transfer_encoding,H#req_headers.transfer_encoding)++
+ lookup(authorization,H#req_headers.authorization)++
+ lookup(user_agent,H#req_headers.user_agent)++
+ lookup(user_agent,H#req_headers.range)++
+ lookup(user_agent,H#req_headers.if_range)++
+ lookup(user_agent,H#req_headers.if_match)++
+ lookup(user_agent,H#req_headers.if_none_match)++
+ lookup(user_agent,H#req_headers.if_modified_since)++
+ lookup(user_agent,H#req_headers.if_unmodified_since)++
+ H#req_headers.other.
+
+lookup(_Key,undefined) ->
+ [];
+lookup(Key,Val) ->
+ [{Key,Val}].
+
+
+
+%%% ============================================================================
+%%% This code is for parsing trailer headers in chunked messages.
+%%% Will be deprecated whenever I have found an alternative working solution!
+%%% Note:
+%%% - The header names are returned slighly different from what the what
+%%% inet_drv returns
+read_headers_old(Scheme,Socket,Timeout) ->
+ read_headers_old(<<>>,Scheme,Socket,Timeout,[],[]).
+
+read_headers_old(<<>>,Scheme,Socket,Timeout,Acc,AccHdrs) ->
+ read_headers_old(read_more_data(Scheme,Socket,1,Timeout),
+ Scheme,Socket,Timeout,Acc,AccHdrs);
+read_headers_old(<<$\r>>,Scheme,Socket,Timeout,Acc,AccHdrs) ->
+ read_headers_old(<<$\r,(read_more_data(Scheme,Socket,1,Timeout))/binary>>,
+ Scheme,Socket,Timeout,Acc,AccHdrs);
+read_headers_old(<<$\r,$\n>>,Scheme,Socket,Timeout,Acc,AccHdrs) ->
+ if
+ Acc==[] -> % Done!
+ tagup_header(lists:reverse(AccHdrs));
+ true ->
+ read_headers_old(read_more_data(Scheme,Socket,1,Timeout),
+ Scheme,Socket,
+ Timeout,[],[lists:reverse(Acc)|AccHdrs])
+ end;
+read_headers_old(<<C>>,Scheme,Socket,Timeout,Acc,AccHdrs) ->
+ read_headers_old(read_more_data(Scheme,Socket,1,Timeout),
+ Scheme,Socket,Timeout,[C|Acc],AccHdrs);
+read_headers_old(Bin,_Scheme,_Socket,_Timeout,_Acc,_AccHdrs) ->
+ io:format("ERROR: Unexpected data from inet driver: ~p",[Bin]),
+ throw({error,this_is_a_bug}).
+
+
+%% Parses the header of a HTTP request and returns a key,value tuple
+%% list containing Name and Value of each header directive as of:
+%%
+%% Content-Type: multipart/mixed -> {"Content-Type", "multipart/mixed"}
+%%
+%% But in http/1.1 the field-names are case insencitive so now it must be
+%% Content-Type: multipart/mixed -> {"content-type", "multipart/mixed"}
+%% The standard furthermore says that leading and traling white space
+%% is not a part of the fieldvalue and shall therefore be removed.
+tagup_header([]) -> [];
+tagup_header([Line|Rest]) -> [tag(Line, [])|tagup_header(Rest)].
+
+tag([], Tag) ->
+ {httpd_util:to_lower(lists:reverse(Tag)), ""};
+tag([$:|Rest], Tag) ->
+ {httpd_util:to_lower(lists:reverse(Tag)), httpd_util:strip(Rest)};
+tag([Chr|Rest], Tag) ->
+ tag(Rest, [Chr|Tag]).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpc_handler.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpc_handler.erl
new file mode 100644
index 0000000000..8e5e1c709a
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpc_handler.erl
@@ -0,0 +1,724 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Mobile Arts AB
+%% Portions created by Mobile Arts are Copyright 2002, Mobile Arts AB
+%% All Rights Reserved.''
+%%
+%%
+
+%%% TODO:
+%%% - If an error is returned when sending a request, don't use this
+%%% session anymore.
+%%% - Closing of sessions not properly implemented for some cases
+
+%%% File : httpc_handler.erl
+%%% Author : Johan Blom <[email protected]>
+%%% Description : Handles HTTP client responses, for a single TCP session
+%%% Created : 4 Mar 2002 by Johan Blom
+
+-module(httpc_handler).
+
+-include("http.hrl").
+-include("jnets_httpd.hrl").
+
+-export([init_connection/2,http_request/2]).
+
+%%% ==========================================================================
+%%% "Main" function in the spawned process for the session.
+init_connection(Req,Session) when record(Req,request) ->
+ case catch http_lib:connect(Req) of
+ {ok,Socket} ->
+ case catch http_request(Req,Socket) of
+ ok ->
+ case Session#session.clientclose of
+ true ->
+ ok;
+ false ->
+ httpc_manager:register_socket(Req#request.address,
+ Session#session.id,
+ Socket)
+ end,
+ next_response_with_request(Req,
+ Session#session{socket=Socket});
+ {error,Reason} -> % Not possible to use new session
+ gen_server:cast(Req#request.from,
+ {Req#request.ref,Req#request.id,{error,Reason}}),
+ exit_session_ok(Req#request.address,
+ Session#session{socket=Socket})
+ end;
+ {error,Reason} -> % Not possible to set up new session
+ gen_server:cast(Req#request.from,
+ {Req#request.ref,Req#request.id,{error,Reason}}),
+ exit_session_ok2(Req#request.address,
+ Session#session.clientclose,Session#session.id)
+ end.
+
+next_response_with_request(Req,Session) ->
+ Timeout=(Req#request.settings)#client_settings.timeout,
+ case catch read(Timeout,Session#session.scheme,Session#session.socket) of
+ {Status,Headers,Body} ->
+ NewReq=handle_response({Status,Headers,Body},Timeout,Req,Session),
+ next_response_with_request(NewReq,Session);
+ {error,Reason} ->
+ gen_server:cast(Req#request.from,
+ {Req#request.ref,Req#request.id,{error,Reason}}),
+ exit_session(Req#request.address,Session,aborted_request);
+ {'EXIT',Reason} ->
+ gen_server:cast(Req#request.from,
+ {Req#request.ref,Req#request.id,{error,Reason}}),
+ exit_session(Req#request.address,Session,aborted_request)
+ end.
+
+handle_response(Response,Timeout,Req,Session) ->
+ case http_response(Response,Req,Session) of
+ ok ->
+ next_response(Timeout,Req#request.address,Session);
+ stop ->
+ exit(normal);
+ {error,Reason} ->
+ gen_server:cast(Req#request.from,
+ {Req#request.ref,Req#request.id,{error,Reason}}),
+ exit_session(Req#request.address,Session,aborted_request)
+ end.
+
+
+
+%%% Wait for the next respond until
+%%% - session is closed by the other side
+%%% => set up a new a session, if there are pending requests in the que
+%%% - "Connection:close" header is received
+%%% => close the connection (release socket) then
+%%% set up a new a session, if there are pending requests in the que
+%%%
+%%% Note:
+%%% - When invoked there are no pending responses on received requests.
+%%% - Never close the session explicitly, let it timeout instead!
+next_response(Timeout,Address,Session) ->
+ case httpc_manager:next_request(Address,Session#session.id) of
+ no_more_requests ->
+ %% There are no more pending responses, now just wait for
+ %% timeout or a new response.
+ case catch read(Timeout,
+ Session#session.scheme,Session#session.socket) of
+ {error,Reason} when Reason==session_remotely_closed;
+ Reason==session_local_timeout ->
+ exit_session_ok(Address,Session);
+ {error,Reason} ->
+ exit_session(Address,Session,aborted_request);
+ {'EXIT',Reason} ->
+ exit_session(Address,Session,aborted_request);
+ {Status2,Headers2,Body2} ->
+ case httpc_manager:next_request(Address,
+ Session#session.id) of
+ no_more_requests -> % Should not happen!
+ exit_session(Address,Session,aborted_request);
+ {error,Reason} -> % Should not happen!
+ exit_session(Address,Session,aborted_request);
+ NewReq ->
+ handle_response({Status2,Headers2,Body2},
+ Timeout,NewReq,Session)
+ end
+ end;
+ {error,Reason} -> % The connection has been closed by httpc_manager
+ exit_session(Address,Session,aborted_request);
+ NewReq ->
+ NewReq
+ end.
+
+%% ===========================================================================
+%% Internals
+
+%%% Read in and parse response data from the socket
+read(Timeout,SockType,Socket) ->
+ Info=#response{scheme=SockType,socket=Socket},
+ http_lib:setopts(SockType,Socket,[{packet, http}]),
+ Info1=read_response(SockType,Socket,Info,Timeout),
+ http_lib:setopts(SockType,Socket,[binary,{packet, raw}]),
+ case (Info1#response.headers)#res_headers.content_type of
+ "multipart/byteranges"++Param ->
+ range_response_body(Info1,Timeout,Param);
+ _ ->
+ #response{status=Status2,headers=Headers2,body=Body2}=
+ http_lib:read_client_body(Info1,Timeout),
+ {Status2,Headers2,Body2}
+ end.
+
+
+%%% From RFC 2616:
+%%% Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
+%%% HTTP-Version = "HTTP" "/" 1*DIGIT "." 1*DIGIT
+%%% Status-Code = 3DIGIT
+%%% Reason-Phrase = *<TEXT, excluding CR, LF>
+read_response(SockType,Socket,Info,Timeout) ->
+ case http_lib:recv0(SockType,Socket,Timeout) of
+ {ok,{http_response,{1,VerMin}, Status, _Phrase}} when VerMin==0;
+ VerMin==1 ->
+ Info1=Info#response{status=Status,http_version=VerMin},
+ http_lib:read_client_headers(Info1,Timeout);
+ {ok,{http_response,_Version, _Status, _Phrase}} ->
+ throw({error,bad_status_line});
+ {error, timeout} ->
+ throw({error,session_local_timeout});
+ {error, Reason} when Reason==closed;Reason==enotconn ->
+ throw({error,session_remotely_closed});
+ {error, Reason} ->
+ throw({error,Reason})
+ end.
+
+%%% From RFC 2616, Section 4.4, Page 34
+%% 4.If the message uses the media type "multipart/byteranges", and the
+%% transfer-length is not otherwise specified, then this self-
+%% delimiting media type defines the transfer-length. This media type
+%% MUST NOT be used unless the sender knows that the recipient can parse
+%% it; the presence in a request of a Range header with multiple byte-
+%% range specifiers from a 1.1 client implies that the client can parse
+%% multipart/byteranges responses.
+%%% FIXME !!
+range_response_body(Info,Timeout,Param) ->
+ Headers=Info#response.headers,
+ case {Headers#res_headers.content_length,
+ Headers#res_headers.transfer_encoding} of
+ {undefined,undefined} ->
+ #response{status=Status2,headers=Headers2,body=Body2}=
+ http_lib:read_client_multipartrange_body(Info,Param,Timeout),
+ {Status2,Headers2,Body2};
+ _ ->
+ #response{status=Status2,headers=Headers2,body=Body2}=
+ http_lib:read_client_body(Info,Timeout),
+ {Status2,Headers2,Body2}
+ end.
+
+
+%%% ----------------------------------------------------------------------------
+%%% Host: field is required when addressing multi-homed sites ...
+%%% It must not be present when the request is being made to a proxy.
+http_request(#request{method=Method,id=Id,
+ scheme=Scheme,address={Host,Port},pathquery=PathQuery,
+ headers=Headers, content={ContentType,Body},
+ settings=Settings},
+ Socket) ->
+ PostData=
+ if
+ Method==post;Method==put ->
+ case Headers#req_headers.expect of
+ "100-continue" ->
+ content_type_header(ContentType) ++
+ content_length_header(length(Body)) ++
+ "\r\n";
+ _ ->
+ content_type_header(ContentType) ++
+ content_length_header(length(Body)) ++
+ "\r\n" ++ Body
+ end;
+ true ->
+ "\r\n"
+ end,
+ Message=
+ case useProxy(Settings#client_settings.useproxy,
+ {Scheme,Host,Port,PathQuery}) of
+ false ->
+ method(Method)++" "++PathQuery++" HTTP/1.1\r\n"++
+ host_header(Host)++te_header()++
+ headers(Headers) ++ PostData;
+ AbsURI ->
+ method(Method)++" "++AbsURI++" HTTP/1.1\r\n"++
+ te_header()++
+ headers(Headers)++PostData
+ end,
+ http_lib:send(Scheme,Socket,Message).
+
+useProxy(false,_) ->
+ false;
+useProxy(true,{Scheme,Host,Port,PathQuery}) ->
+ [atom_to_list(Scheme),"://",Host,":",integer_to_list(Port),PathQuery].
+
+
+
+headers(#req_headers{expect=Expect,
+ other=Other}) ->
+ H1=case Expect of
+ undefined ->[];
+ _ -> "Expect: "++Expect++"\r\n"
+ end,
+ H1++headers_other(Other).
+
+
+headers_other([]) ->
+ [];
+headers_other([{Key,Value}|Rest]) when atom(Key) ->
+ Head = atom_to_list(Key)++": "++Value++"\r\n",
+ Head ++ headers_other(Rest);
+headers_other([{Key,Value}|Rest]) ->
+ Head = Key++": "++Value++"\r\n",
+ Head ++ headers_other(Rest).
+
+host_header(Host) ->
+ "Host: "++lists:concat([Host])++"\r\n".
+content_type_header(ContentType) ->
+ "Content-Type: " ++ ContentType ++ "\r\n".
+content_length_header(ContentLength) ->
+ "Content-Length: "++integer_to_list(ContentLength) ++ "\r\n".
+te_header() ->
+ "TE: \r\n".
+
+method(Method) ->
+ httpd_util:to_upper(atom_to_list(Method)).
+
+
+%%% ----------------------------------------------------------------------------
+http_response({Status,Headers,Body},Req,Session) ->
+ case Status of
+ 100 ->
+ status_continue(Req,Session);
+ 200 ->
+ gen_server:cast(Req#request.from,{Req#request.ref,Req#request.id,
+ {Status,Headers,Body}}),
+ ServerClose=http_lib:connection_close(Headers),
+ handle_connection(Session#session.clientclose,ServerClose,
+ Req,Session);
+ 300 -> status_multiple_choices(Headers,Body,Req,Session);
+ 301 -> status_moved_permanently(Req#request.method,
+ Headers,Body,Req,Session);
+ 302 -> status_found(Headers,Body,Req,Session);
+ 303 -> status_see_other(Headers,Body,Req,Session);
+ 304 -> status_not_modified(Headers,Body,Req,Session);
+ 305 -> status_use_proxy(Headers,Body,Req,Session);
+ %% 306 This Status code is not used in HTTP 1.1
+ 307 -> status_temporary_redirect(Headers,Body,Req,Session);
+ 503 -> status_service_unavailable({Status,Headers,Body},Req,Session);
+ Status50x when Status50x==500;Status50x==501;Status50x==502;
+ Status50x==504;Status50x==505 ->
+ status_server_error_50x({Status,Headers,Body},Req,Session);
+ _ -> % FIXME May want to take some action on other Status codes as well
+ gen_server:cast(Req#request.from,{Req#request.ref,Req#request.id,
+ {Status,Headers,Body}}),
+ ServerClose=http_lib:connection_close(Headers),
+ handle_connection(Session#session.clientclose,ServerClose,
+ Req,Session)
+ end.
+
+
+%%% Status code dependent functions.
+
+%%% Received a 100 Status code ("Continue")
+%%% From RFC2616
+%%% The client SHOULD continue with its request. This interim response is
+%%% used to inform the client that the initial part of the request has
+%%% been received and has not yet been rejected by the server. The client
+%%% SHOULD continue by sending the remainder of the request or, if the
+%%% request has already been completed, ignore this response. The server
+%%% MUST send a final response after the request has been completed. See
+%%% section 8.2.3 for detailed discussion of the use and handling of this
+%%% status code.
+status_continue(Req,Session) ->
+ {_,Body}=Req#request.content,
+ http_lib:send(Session#session.scheme,Session#session.socket,Body),
+ next_response_with_request(Req,Session).
+
+
+%%% Received a 300 Status code ("Multiple Choices")
+%%% The resource is located in any one of a set of locations
+%%% - If a 'Location' header is present (preserved server choice), use that
+%%% to automatically redirect to the given URL
+%%% - else if the Content-Type/Body both are non-empty let the user agent make
+%%% the choice and thus return a response with status 300
+%%% Note:
+%%% - If response to a HEAD request, the Content-Type/Body both should be empty.
+%%% - The behaviour on an empty Content-Type or Body is unspecified.
+%%% However, e.g. "Apache/1.3" servers returns both empty if the header
+%%% 'if-modified-since: Date' was sent in the request and the content is
+%%% "not modified" (instead of 304). Thus implicitly giving the cache as the
+%%% only choice.
+status_multiple_choices(Headers,Body,Req,Session)
+ when ((Req#request.settings)#client_settings.autoredirect)==true ->
+ ServerClose=http_lib:connection_close(Headers),
+ case Headers#res_headers.location of
+ undefined ->
+ gen_server:cast(Req#request.from,{Req#request.ref,Req#request.id,
+ {300,Headers,Body}}),
+ handle_connection(Session#session.clientclose,ServerClose,
+ Req,Session);
+ RedirUrl ->
+ Scheme=Session#session.scheme,
+ case uri:parse(RedirUrl) of
+ {error,Reason} ->
+ {error,Reason};
+ {Scheme,Host,Port,PathQuery} -> % Automatic redirection
+ NewReq=Req#request{redircount=Req#request.redircount+1,
+ address={Host,Port},pathquery=PathQuery},
+ handle_redirect(Session#session.clientclose,ServerClose,
+ NewReq,Session)
+ end
+ end;
+status_multiple_choices(Headers,Body,Req,Session) ->
+ ServerClose=http_lib:connection_close(Headers),
+ gen_server:cast(Req#request.from,{Req#request.ref,Req#request.id,
+ {300,Headers,Body}}),
+ handle_connection(Session#session.clientclose,ServerClose,Req,Session).
+
+
+%%% Received a 301 Status code ("Moved Permanently")
+%%% The resource has been assigned a new permanent URI
+%%% - If a 'Location' header is present, use that to automatically redirect to
+%%% the given URL if GET or HEAD request
+%%% - else return
+%%% Note:
+%%% - The Body should contain a short hypertext note with a hyperlink to the
+%%% new URI. Return this if Content-Type acceptable (some HTTP servers doesn't
+%%% deal properly with Accept headers)
+status_moved_permanently(Method,Headers,Body,Req,Session)
+ when (((Req#request.settings)#client_settings.autoredirect)==true) and
+ (Method==get) or (Method==head) ->
+ ServerClose=http_lib:connection_close(Headers),
+ case Headers#res_headers.location of
+ undefined ->
+ gen_server:cast(Req#request.from,{Req#request.ref,Req#request.id,
+ {301,Headers,Body}}),
+ handle_connection(Session#session.clientclose,ServerClose,
+ Req,Session);
+ RedirUrl ->
+ Scheme=Session#session.scheme,
+ case uri:parse(RedirUrl) of
+ {error,Reason} ->
+ {error,Reason};
+ {Scheme,Host,Port,PathQuery} -> % Automatic redirection
+ NewReq=Req#request{redircount=Req#request.redircount+1,
+ address={Host,Port},pathquery=PathQuery},
+ handle_redirect(Session#session.clientclose,ServerClose,
+ NewReq,Session)
+ end
+ end;
+status_moved_permanently(_Method,Headers,Body,Req,Session) ->
+ ServerClose=http_lib:connection_close(Headers),
+ gen_server:cast(Req#request.from,{Req#request.ref,Req#request.id,
+ {301,Headers,Body}}),
+ handle_connection(Session#session.clientclose,ServerClose,Req,Session).
+
+
+%%% Received a 302 Status code ("Found")
+%%% The requested resource resides temporarily under a different URI.
+%%% Note:
+%%% - Only cacheable if indicated by a Cache-Control or Expires header
+status_found(Headers,Body,Req,Session)
+ when ((Req#request.settings)#client_settings.autoredirect)==true ->
+ ServerClose=http_lib:connection_close(Headers),
+ case Headers#res_headers.location of
+ undefined ->
+ gen_server:cast(Req#request.from,{Req#request.ref,Req#request.id,
+ {302,Headers,Body}}),
+ handle_connection(Session#session.clientclose,ServerClose,
+ Req,Session);
+ RedirUrl ->
+ Scheme=Session#session.scheme,
+ case uri:parse(RedirUrl) of
+ {error,Reason} ->
+ {error,Reason};
+ {Scheme,Host,Port,PathQuery} -> % Automatic redirection
+ NewReq=Req#request{redircount=Req#request.redircount+1,
+ address={Host,Port},pathquery=PathQuery},
+ handle_redirect(Session#session.clientclose,ServerClose,
+ NewReq,Session)
+ end
+ end;
+status_found(Headers,Body,Req,Session) ->
+ ServerClose=http_lib:connection_close(Headers),
+ gen_server:cast(Req#request.from,{Req#request.ref,Req#request.id,
+ {302,Headers,Body}}),
+ handle_connection(Session#session.clientclose,ServerClose,Req,Session).
+
+%%% Received a 303 Status code ("See Other")
+%%% The request found under a different URI and should be retrieved using GET
+%%% Note:
+%%% - Must not be cached
+status_see_other(Headers,Body,Req,Session)
+ when ((Req#request.settings)#client_settings.autoredirect)==true ->
+ ServerClose=http_lib:connection_close(Headers),
+ case Headers#res_headers.location of
+ undefined ->
+ gen_server:cast(Req#request.from,{Req#request.ref,Req#request.id,
+ {303,Headers,Body}}),
+ handle_connection(Session#session.clientclose,ServerClose,
+ Req,Session);
+ RedirUrl ->
+ Scheme=Session#session.scheme,
+ case uri:parse(RedirUrl) of
+ {error,Reason} ->
+ {error,Reason};
+ {Scheme,Host,Port,PathQuery} -> % Automatic redirection
+ NewReq=Req#request{redircount=Req#request.redircount+1,
+ method=get,
+ address={Host,Port},pathquery=PathQuery},
+ handle_redirect(Session#session.clientclose,ServerClose,
+ NewReq,Session)
+ end
+ end;
+status_see_other(Headers,Body,Req,Session) ->
+ ServerClose=http_lib:connection_close(Headers),
+ gen_server:cast(Req#request.from,{Req#request.ref,Req#request.id,
+ {303,Headers,Body}}),
+ handle_connection(Session#session.clientclose,ServerClose,Req,Session).
+
+
+%%% Received a 304 Status code ("Not Modified")
+%%% Note:
+%%% - The response MUST NOT contain a body.
+%%% - The response MUST include the following header fields:
+%%% - Date, unless its omission is required
+%%% - ETag and/or Content-Location, if the header would have been sent
+%%% in a 200 response to the same request
+%%% - Expires, Cache-Control, and/or Vary, if the field-value might
+%%% differ from that sent in any previous response for the same
+%%% variant
+status_not_modified(Headers,Body,Req,Session)
+ when ((Req#request.settings)#client_settings.autoredirect)==true ->
+ ServerClose=http_lib:connection_close(Headers),
+ case Headers#res_headers.location of
+ undefined ->
+ gen_server:cast(Req#request.from,{Req#request.ref,Req#request.id,
+ {304,Headers,Body}}),
+ handle_connection(Session#session.clientclose,ServerClose,
+ Req,Session);
+ RedirUrl ->
+ Scheme=Session#session.scheme,
+ case uri:parse(RedirUrl) of
+ {error,Reason} ->
+ {error,Reason};
+ {Scheme,Host,Port,PathQuery} -> % Automatic redirection
+ NewReq=Req#request{redircount=Req#request.redircount+1,
+ address={Host,Port},pathquery=PathQuery},
+ handle_redirect(Session#session.clientclose,ServerClose,
+ NewReq,Session)
+ end
+ end;
+status_not_modified(Headers,Body,Req,Session) ->
+ ServerClose=http_lib:connection_close(Headers),
+ gen_server:cast(Req#request.from,{Req#request.ref,Req#request.id,
+ {304,Headers,Body}}),
+ handle_connection(Session#session.clientclose,ServerClose,Req,Session).
+
+
+
+%%% Received a 305 Status code ("Use Proxy")
+%%% The requested resource MUST be accessed through the proxy given by the
+%%% Location field
+status_use_proxy(Headers,Body,Req,Session)
+ when ((Req#request.settings)#client_settings.autoredirect)==true ->
+ ServerClose=http_lib:connection_close(Headers),
+ case Headers#res_headers.location of
+ undefined ->
+ gen_server:cast(Req#request.from,{Req#request.ref,Req#request.id,
+ {305,Headers,Body}}),
+ handle_connection(Session#session.clientclose,ServerClose,
+ Req,Session);
+ RedirUrl ->
+ Scheme=Session#session.scheme,
+ case uri:parse(RedirUrl) of
+ {error,Reason} ->
+ {error,Reason};
+ {Scheme,Host,Port,PathQuery} -> % Automatic redirection
+ NewReq=Req#request{redircount=Req#request.redircount+1,
+ address={Host,Port},pathquery=PathQuery},
+ handle_redirect(Session#session.clientclose,ServerClose,
+ NewReq,Session)
+ end
+ end;
+status_use_proxy(Headers,Body,Req,Session) ->
+ ServerClose=http_lib:connection_close(Headers),
+ gen_server:cast(Req#request.from,{Req#request.ref,Req#request.id,
+ {305,Headers,Body}}),
+ handle_connection(Session#session.clientclose,ServerClose,Req,Session).
+
+
+%%% Received a 307 Status code ("Temporary Redirect")
+status_temporary_redirect(Headers,Body,Req,Session)
+ when ((Req#request.settings)#client_settings.autoredirect)==true ->
+ ServerClose=http_lib:connection_close(Headers),
+ case Headers#res_headers.location of
+ undefined ->
+ gen_server:cast(Req#request.from,{Req#request.ref,Req#request.id,
+ {307,Headers,Body}}),
+ handle_connection(Session#session.clientclose,ServerClose,
+ Req,Session);
+ RedirUrl ->
+ Scheme=Session#session.scheme,
+ case uri:parse(RedirUrl) of
+ {error,Reason} ->
+ {error,Reason};
+ {Scheme,Host,Port,PathQuery} -> % Automatic redirection
+ NewReq=Req#request{redircount=Req#request.redircount+1,
+ address={Host,Port},pathquery=PathQuery},
+ handle_redirect(Session#session.clientclose,ServerClose,
+ NewReq,Session)
+ end
+ end;
+status_temporary_redirect(Headers,Body,Req,Session) ->
+ ServerClose=http_lib:connection_close(Headers),
+ gen_server:cast(Req#request.from,{Req#request.ref,Req#request.id,
+ {307,Headers,Body}}),
+ handle_connection(Session#session.clientclose,ServerClose,Req,Session).
+
+
+
+%%% Received a 503 Status code ("Service Unavailable")
+%%% The server is currently unable to handle the request due to a
+%%% temporary overloading or maintenance of the server. The implication
+%%% is that this is a temporary condition which will be alleviated after
+%%% some delay. If known, the length of the delay MAY be indicated in a
+%%% Retry-After header. If no Retry-After is given, the client SHOULD
+%%% handle the response as it would for a 500 response.
+%% Note:
+%% - This session is now considered busy, thus cancel any requests in the
+%% pipeline and close the session.
+%% FIXME! Implement a user option to automatically retry if the 'Retry-After'
+%% header is given.
+status_service_unavailable(Resp,Req,Session) ->
+% RetryAfter=Headers#res_headers.retry_after,
+ gen_server:cast(Req#request.from,{Req#request.ref,Req#request.id,Resp}),
+ close_session(server_connection_close,Req,Session).
+
+
+%%% Received a 50x Status code (~ "Service Error")
+%%% Response status codes beginning with the digit "5" indicate cases in
+%%% which the server is aware that it has erred or is incapable of
+%%% performing the request.
+status_server_error_50x(Resp,Req,Session) ->
+ gen_server:cast(Req#request.from,{Req#request.ref,Req#request.id,Resp}),
+ close_session(server_connection_close,Req,Session).
+
+
+%%% Handles requests for redirects
+%%% The redirected request might be:
+%%% - FIXME! on another TCP session, another scheme
+%%% - on the same TCP session, same scheme
+%%% - on another TCP session , same scheme
+%%% However, in all cases treat it as a new request, with redircount updated.
+%%%
+%%% The redirect may fail, but this not a reason to close this session.
+%%% Instead return a error for this request, and continue as ok.
+handle_redirect(ClientClose,ServerClose,Req,Session) ->
+ case httpc_manager:request(Req) of
+ {ok,_ReqId} -> % FIXME Should I perhaps reuse the Reqid?
+ handle_connection(ClientClose,ServerClose,Req,Session);
+ {error,Reason} ->
+ gen_server:cast(Req#request.from,{Req#request.ref,Req#request.id,
+ {error,Reason}}),
+ handle_connection(ClientClose,ServerClose,Req,Session)
+ end.
+
+%%% Check if the persistent connection flag is false (ie client request
+%%% non-persistive connection), or if the server requires a closed connection
+%%% (by sending a "Connection: close" header). If the connection required
+%%% non-persistent, we may close the connection immediately.
+handle_connection(ClientClose,ServerClose,Req,Session) ->
+ case {ClientClose,ServerClose} of
+ {false,false} ->
+ ok;
+ {false,true} -> % The server requests this session to be closed.
+ close_session(server_connection_close,Req,Session);
+ {true,_} -> % The client requested a non-persistent connection
+ close_session(client_connection_close,Req,Session)
+ end.
+
+
+%%% Close the session.
+%%% We now have three cases:
+%%% - Client request a non-persistent connection when initiating the request.
+%%% Session info not stored in httpc_manager
+%%% - Server requests a non-persistent connection when answering a request.
+%%% No need to resend request, but there might be a pipeline.
+%%% - Some kind of error
+%%% Close the session, we may then try resending all requests in the pipeline
+%%% including the current depending on the error.
+%%% FIXME! Should not always abort the session (see close_session in
+%%% httpc_manager for more details)
+close_session(client_connection_close,_Req,Session) ->
+ http_lib:close(Session#session.scheme,Session#session.socket),
+ stop;
+close_session(server_connection_close,Req,Session) ->
+ http_lib:close(Session#session.scheme,Session#session.socket),
+ httpc_manager:abort_session(Req#request.address,Session#session.id,
+ aborted_request),
+ stop.
+
+exit_session(Address,Session,Reason) ->
+ http_lib:close(Session#session.scheme,Session#session.socket),
+ httpc_manager:abort_session(Address,Session#session.id,Reason),
+ exit(normal).
+
+%%% This is the "normal" case to close a persistent connection. I.e., there are
+%%% no more requests waiting and the session was closed by the client, or
+%%% server because of a timeout or user request.
+exit_session_ok(Address,Session) ->
+ http_lib:close(Session#session.scheme,Session#session.socket),
+ exit_session_ok2(Address,Session#session.clientclose,Session#session.id).
+
+exit_session_ok2(Address,ClientClose,Sid) ->
+ case ClientClose of
+ false ->
+ httpc_manager:close_session(Address,Sid);
+ true ->
+ ok
+ end,
+ exit(normal).
+
+%%% ============================================================================
+%%% This is deprecated code, to be removed
+
+format_time() ->
+ {_,_,MicroSecs}=TS=now(),
+ {{Y,Mon,D},{H,M,S}}=calendar:now_to_universal_time(TS),
+ lists:flatten(io_lib:format("~4.4.0w-~2.2.0w-~2.2.0w,~2.2.0w:~2.2.0w:~6.3.0f",
+ [Y,Mon,D,H,M,S+(MicroSecs/1000000)])).
+
+%%% Read more data from the open socket.
+%%% Two different read functions is used because for the {active, once} socket
+%%% option is (currently) not available for SSL...
+%%% FIXME
+% read_more_data(http,Socket,Timeout) ->
+% io:format("read_more_data(ip_comm) -> "
+% "~n set active = 'once' and "
+% "await a chunk data", []),
+% http_lib:setopts(Socket, [{active,once}]),
+% read_more_data_ipcomm(Socket,Timeout);
+% read_more_data(https,Socket,Timeout) ->
+% case ssl:recv(Socket,0,Timeout) of
+% {ok,MoreData} ->
+% MoreData;
+% {error,closed} ->
+% throw({error, session_remotely_closed});
+% {error,etimedout} ->
+% throw({error, session_local_timeout});
+% {error,Reason} ->
+% throw({error, Reason});
+% Other ->
+% throw({error, Other})
+% end.
+
+% %%% Send any incoming requests on the open session immediately
+% read_more_data_ipcomm(Socket,Timeout) ->
+% receive
+% {tcp,Socket,MoreData} ->
+% % ?vtrace("read_more_data(ip_comm) -> got some data:~p",
+% % [MoreData]),
+% MoreData;
+% {tcp_closed,Socket} ->
+% % ?vtrace("read_more_data(ip_comm) -> socket closed",[]),
+% throw({error,session_remotely_closed});
+% {tcp_error,Socket,Reason} ->
+% % ?vtrace("read_more_data(ip_comm) -> ~p socket error: ~p",
+% % [self(),Reason]),
+% throw({error, Reason});
+% stop ->
+% throw({error, user_req})
+% after Timeout ->
+% throw({error, session_local_timeout})
+% end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpc_manager.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpc_manager.erl
new file mode 100644
index 0000000000..29659ce1ce
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpc_manager.erl
@@ -0,0 +1,542 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Mobile Arts AB
+%% Portions created by Mobile Arts are Copyright 2002, Mobile Arts AB
+%% All Rights Reserved.''
+%%
+%%
+%% Created : 18 Dec 2001 by Johan Blom <[email protected]>
+%%
+
+-module(httpc_manager).
+
+-behaviour(gen_server).
+
+-include("http.hrl").
+
+-define(HMACALL, ?MODULE).
+-define(HMANAME, ?MODULE).
+
+%%--------------------------------------------------------------------
+%% External exports
+-export([start_link/0,start/0,
+ request/1,cancel_request/1,
+ next_request/2,
+ register_socket/3,
+ abort_session/3,close_session/2,close_session/3
+ ]).
+
+%% Debugging only
+-export([status/0]).
+
+%% gen_server callbacks
+-export([init/1,handle_call/3,handle_cast/2,handle_info/2,terminate/2,
+ code_change/3]).
+
+%%% address_db - ets() Contains mappings from a tuple {Host,Port} to a tuple
+%%% {LastSID,OpenSessions,ets()} where
+%%% LastSid is the last allocated session id,
+%%% OpenSessions is the number of currently open sessions and
+%%% ets() contains mappings from Session Id to #session{}.
+%%%
+%%% Note:
+%%% - Only persistent connections are stored in address_db
+%%% - When automatically redirecting, multiple requests are performed.
+-record(state,{
+ address_db, % ets()
+ reqid % int() Next Request id to use (identifies request).
+ }).
+
+%%====================================================================
+%% External functions
+%%====================================================================
+%%--------------------------------------------------------------------
+%% Function: start_link/0
+%% Description: Starts the server
+%%--------------------------------------------------------------------
+start() ->
+ ensure_started().
+
+start_link() ->
+ gen_server:start_link({local,?HMACALL}, ?HMANAME, [], []).
+
+
+%% Find available session process and store in address_db. If no
+%% available, start new handler process.
+request(Req) ->
+ ensure_started(),
+ ClientClose=http_lib:connection_close(Req#request.headers),
+ gen_server:call(?HMACALL,{request,ClientClose,Req},infinity).
+
+cancel_request(ReqId) ->
+ gen_server:call(?HMACALL,{cancel_request,ReqId},infinity).
+
+
+%%% Close Session
+close_session(Addr,Sid) ->
+ gen_server:call(?HMACALL,{close_session,Addr,Sid},infinity).
+close_session(Req,Addr,Sid) ->
+ gen_server:call(?HMACALL,{close_session,Req,Addr,Sid},infinity).
+
+abort_session(Addr,Sid,Msg) ->
+ gen_server:call(?HMACALL,{abort_session,Addr,Sid,Msg},infinity).
+
+
+%%% Pick next in request que
+next_request(Addr,Sid) ->
+ gen_server:call(?HMACALL,{next_request,Addr,Sid},infinity).
+
+%%% Session handler has succeded to set up a new session, now register
+%%% the socket
+register_socket(Addr,Sid,Socket) ->
+ gen_server:cast(?HMACALL,{register_socket,Addr,Sid,Socket}).
+
+
+%%% Debugging
+status() ->
+ gen_server:cast(?HMACALL,status).
+
+
+%%--------------------------------------------------------------------
+%% Function: init/1
+%% Description: Initiates the server
+%% Returns: {ok, State} |
+%% {ok, State, Timeout} |
+%% ignore |
+%% {stop, Reason}
+%%--------------------------------------------------------------------
+init([]) ->
+ process_flag(trap_exit, true),
+ {ok,#state{address_db=ets:new(address_db,[private]),
+ reqid=0}}.
+
+
+%%--------------------------------------------------------------------
+%% Function: handle_call/3
+%% Description: Handling call messages
+%% Returns: {reply, Reply, State} |
+%% {reply, Reply, State, Timeout} |
+%% {noreply, State} |
+%% {noreply, State, Timeout} |
+%% {stop, Reason, Reply, State} | (terminate/2 is called)
+%% {stop, Reason, State} (terminate/2 is called)
+%%--------------------------------------------------------------------
+%%% Note:
+%%% - We may have multiple non-persistent connections, each will be handled in
+%%% separate processes, thus don't add such connections to address_db
+handle_call({request,false,Req},_From,State) ->
+ case ets:lookup(State#state.address_db,Req#request.address) of
+ [] ->
+ STab=ets:new(session_db,[private,{keypos,2},set]),
+ case persistent_new_session_request(0,Req,STab,State) of
+ {Reply,LastSid,State2} ->
+ ets:insert(State2#state.address_db,
+ {Req#request.address,{LastSid,1,STab}}),
+ {reply,Reply,State2};
+ {ErrorReply,State2} ->
+ {reply,ErrorReply,State2}
+ end;
+ [{_,{LastSid,OpenS,STab}}] ->
+ case lookup_session_entry(STab) of
+ {ok,Session} ->
+ old_session_request(Session,Req,STab,State);
+ need_new_session when OpenS<(Req#request.settings)#client_settings.max_sessions ->
+ case persistent_new_session_request(LastSid,Req,
+ STab,State) of
+ {Reply,LastSid2,State2} ->
+ ets:insert(State2#state.address_db,
+ {Req#request.address,
+ {LastSid2,OpenS+1,STab}}),
+ {reply,Reply,State2};
+ {ErrorReply,State2} ->
+ {reply,ErrorReply,State2}
+ end;
+ need_new_session ->
+ {reply,{error,too_many_sessions},State}
+ end
+ end;
+handle_call({request,true,Req},_From,State) ->
+ {Reply,State2}=not_persistent_new_session_request(Req,State),
+ {reply,Reply,State2};
+handle_call({cancel_request,true,_ReqId},_From,State) ->
+%% FIXME Should be possible to scan through all requests made, but perhaps
+%% better to give some more hints (such as Addr etc)
+ Reply=ok,
+ {reply,Reply,State};
+handle_call({next_request,Addr,Sid},_From,State) ->
+ case ets:lookup(State#state.address_db,Addr) of
+ [] ->
+ {reply,{error,no_connection},State};
+ [{_,{_,_,STab}}] ->
+ case ets:lookup(STab,Sid) of
+ [] ->
+ {reply,{error,session_not_registered},State};
+ [S=#session{pipeline=[],quelength=QueLen}] ->
+ if
+ QueLen==1 ->
+ ets:insert(STab,S#session{quelength=0});
+ true ->
+ ok
+ end,
+ {reply,no_more_requests,State};
+ [S=#session{pipeline=Que}] ->
+ [Req|RevQue]=lists:reverse(Que),
+ ets:insert(STab,S#session{pipeline=lists:reverse(RevQue),
+ quelength=S#session.quelength-1}),
+ {reply,Req,State}
+ end
+ end;
+handle_call({close_session,Addr,Sid},_From,State) ->
+ case ets:lookup(State#state.address_db,Addr) of
+ [] ->
+ {reply,{error,no_connection},State};
+ [{_,{LastSid,OpenS,STab}}] ->
+ case ets:lookup(STab,Sid) of
+ [#session{pipeline=Que}] ->
+ R=handle_close_session(lists:reverse(Que),STab,Sid,State),
+ ets:insert(State#state.address_db,
+ {Addr,{LastSid,OpenS-1,STab}}),
+ {reply,R,State};
+ [] ->
+ {reply,{error,session_not_registered},State}
+ end
+ end;
+handle_call({close_session,Req,Addr,Sid},_From,State) ->
+ case ets:lookup(State#state.address_db,Addr) of
+ [] ->
+ {reply,{error,no_connection},State};
+ [{_,{LastSid,OpenS,STab}}] ->
+ case ets:lookup(STab,Sid) of
+ [#session{pipeline=Que}] ->
+ R=handle_close_session([Req|lists:reverse(Que)],
+ STab,Sid,State),
+ ets:insert(State#state.address_db,
+ {Addr,{LastSid,OpenS-1,STab}}),
+ {reply,R,State};
+ [] ->
+ {reply,{error,session_not_registered},State}
+ end
+ end;
+handle_call({abort_session,Addr,Sid,Msg},_From,State) ->
+ case ets:lookup(State#state.address_db,Addr) of
+ [] ->
+ {reply,{error,no_connection},State};
+ [{_,{LastSid,OpenS,STab}}] ->
+ case ets:lookup(STab,Sid) of
+ [#session{pipeline=Que}] ->
+ R=abort_request_que(Que,{error,Msg}),
+ ets:delete(STab,Sid),
+ ets:insert(State#state.address_db,
+ {Addr,{LastSid,OpenS-1,STab}}),
+ {reply,R,State};
+ [] ->
+ {reply,{error,session_not_registered},State}
+ end
+ end.
+
+
+%%--------------------------------------------------------------------
+%% Function: handle_cast/2
+%% Description: Handling cast messages
+%% Returns: {noreply, State} |
+%% {noreply, State, Timeout} |
+%% {stop, Reason, State} (terminate/2 is called)
+%%--------------------------------------------------------------------
+handle_cast(status, State) ->
+ io:format("Status:~n"),
+ print_all(lists:sort(ets:tab2list(State#state.address_db))),
+ {noreply, State};
+handle_cast({register_socket,Addr,Sid,Socket},State) ->
+ case ets:lookup(State#state.address_db,Addr) of
+ [] ->
+ {noreply,State};
+ [{_,{_,_,STab}}] ->
+ case ets:lookup(STab,Sid) of
+ [Session] ->
+ ets:insert(STab,Session#session{socket=Socket}),
+ {noreply,State};
+ [] ->
+ {noreply,State}
+ end
+ end.
+
+print_all([]) ->
+ ok;
+print_all([{Addr,{LastSid,OpenSessions,STab}}|Rest]) ->
+ io:format(" Address:~p LastSid=~p OpenSessions=~p~n",[Addr,LastSid,OpenSessions]),
+ SortedList=lists:sort(fun(A,B) ->
+ if
+ A#session.id<B#session.id ->
+ true;
+ true ->
+ false
+ end
+ end,ets:tab2list(STab)),
+ print_all2(SortedList),
+ print_all(Rest).
+
+print_all2([]) ->
+ ok;
+print_all2([Session|Rest]) ->
+ io:format(" Session:~p~n",[Session#session.id]),
+ io:format(" Client close:~p~n",[Session#session.clientclose]),
+ io:format(" Socket:~p~n",[Session#session.socket]),
+ io:format(" Pipe: length=~p Que=~p~n",[Session#session.quelength,Session#session.pipeline]),
+ print_all2(Rest).
+
+%%--------------------------------------------------------------------
+%% Function: handle_info/2
+%% Description: Handling all non call/cast messages
+%% Returns: {noreply, State} |
+%% {noreply, State, Timeout} |
+%% {stop, Reason, State} (terminate/2 is called)
+%%--------------------------------------------------------------------
+handle_info({'EXIT',_Pid,normal}, State) ->
+ {noreply, State};
+handle_info(Info, State) ->
+ io:format("ERROR httpc_manager:handle_info ~p~n",[Info]),
+ {noreply, State}.
+
+%%--------------------------------------------------------------------
+%% Function: terminate/2
+%% Description: Shutdown the server
+%% Returns: any (ignored by gen_server)
+%%--------------------------------------------------------------------
+terminate(_Reason, State) ->
+ ets:delete(State#state.address_db).
+
+%%--------------------------------------------------------------------
+%% Func: code_change/3
+%% Purpose: Convert process state when code is changed
+%% Returns: {ok, NewState}
+%%--------------------------------------------------------------------
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
+
+%%--------------------------------------------------------------------
+%%% Internal functions
+%%--------------------------------------------------------------------
+
+%%% From RFC 2616, Section 8.1.4
+%%% A client, server, or proxy MAY close the transport connection at any
+%%% time. For example, a client might have started to send a new request
+%%% at the same time that the server has decided to close the "idle"
+%%% connection. From the server's point of view, the connection is being
+%%% closed while it was idle, but from the client's point of view, a
+%%% request is in progress.
+%%%
+%%% This means that clients, servers, and proxies MUST be able to recover
+%%% from asynchronous close events. Client software SHOULD reopen the
+%%% transport connection and retransmit the aborted sequence of requests
+%%% without user interaction so long as the request sequence is
+%%% idempotent (see section 9.1.2). Non-idempotent methods or sequences
+%%%
+%%% FIXME
+%%% Note:
+%%% - If this happen (server close because of idle) there can't be any requests
+%%% in the que.
+%%% - This is the main function for closing of sessions
+handle_close_session([],STab,Sid,_State) ->
+ ets:delete(STab,Sid);
+handle_close_session(Que,STab,Sid,_State) ->
+ ets:delete(STab,Sid),
+ abort_request_que(Que,{error,aborted_request}).
+
+
+%%% From RFC 2616, Section 8.1.2.2
+%%% Clients which assume persistent connections and pipeline immediately
+%%% after connection establishment SHOULD be prepared to retry their
+%%% connection if the first pipelined attempt fails. If a client does
+%%% such a retry, it MUST NOT pipeline before it knows the connection is
+%%% persistent. Clients MUST also be prepared to resend their requests if
+%%% the server closes the connection before sending all of the
+%%% corresponding responses.
+%%% FIXME! I'm currently not checking if tis is the first attempt on the session
+%%% FIXME! Pipeline size must be dynamically variable (e.g. 0 if resend, 2 else)
+%%% The que contains requests that have been sent ok previously, but the session
+%%% was closed prematurely when reading the response.
+%%% Try setup a new session and resend these requests.
+%%% Note:
+%%% - This MUST be a persistent session
+% handle_closed_pipelined_session_que([],_State) ->
+% ok;
+% handle_closed_pipelined_session_que(_Que,_State) ->
+% ok.
+
+
+%%% From RFC 2616, Section 8.2.4
+%%% If an HTTP/1.1 client sends a request which includes a request body,
+%%% but which does not include an Expect request-header field with the
+%%% "100-continue" expectation, and if the client is not directly
+%%% connected to an HTTP/1.1 origin server, and if the client sees the
+%%% connection close before receiving any status from the server, the
+%%% client SHOULD retry the request. If the client does retry this
+%%% request, it MAY use the following "binary exponential backoff"
+%%% algorithm to be assured of obtaining a reliable response:
+%%% ...
+%%% FIXME! I'm currently not checking if a "Expect: 100-continue" has been sent.
+% handle_remotely_closed_session_que([],_State) ->
+% ok;
+% handle_remotely_closed_session_que(_Que,_State) ->
+% % resend_que(Que,Socket),
+% ok.
+
+%%% Resend all requests in the request que
+% resend_que([],_) ->
+% ok;
+% resend_que([Req|Que],Socket) ->
+% case catch httpc_handler:http_request(Req,Socket) of
+% ok ->
+% resend_que(Que,Socket);
+% {error,Reason} ->
+% {error,Reason}
+% end.
+
+
+%%% From RFC 2616,
+%%% Section 8.1.2.2:
+%%% Clients SHOULD NOT pipeline requests using non-idempotent methods or
+%%% non-idempotent sequences of methods (see section 9.1.2). Otherwise, a
+%%% premature termination of the transport connection could lead to
+%%% indeterminate results. A client wishing to send a non-idempotent
+%%% request SHOULD wait to send that request until it has received the
+%%% response status for the previous request.
+%%% Section 9.1.2:
+%%% Methods can also have the property of "idempotence" in that (aside
+%%% from error or expiration issues) the side-effects of N > 0 identical
+%%% requests is the same as for a single request. The methods GET, HEAD,
+%%% PUT and DELETE share this property. Also, the methods OPTIONS and
+%%% TRACE SHOULD NOT have side effects, and so are inherently idempotent.
+%%%
+%%% Note that POST and CONNECT are idempotent methods.
+%%%
+%%% Tries to find an open, free session i STab. Such a session has quelength
+%%% less than ?MAX_PIPELINE_LENGTH
+%%% Don't care about non-standard, user defined methods.
+%%%
+%%% Returns {ok,Session} or need_new_session where
+%%% Session is the session that may be used
+lookup_session_entry(STab) ->
+ MS=[{#session{quelength='$1',max_quelength='$2',
+ id='_',clientclose='_',socket='$3',scheme='_',pipeline='_'},
+ [{'<','$1','$2'},{is_port,'$3'}],
+ ['$_']}],
+ case ets:select(STab,MS) of
+ [] ->
+ need_new_session;
+ SessionList -> % Now check if any of these has an empty pipeline.
+ case lists:keysearch(0,2,SessionList) of
+ {value,Session} ->
+ {ok,Session};
+ false ->
+ {ok,hd(SessionList)}
+ end
+ end.
+
+
+%%% Returns a tuple {Reply,State} where
+%%% Reply is the response sent back to the application
+%%%
+%%% Note:
+%%% - An {error,einval} from a send should sometimes rather be {error,closed}
+%%% - Don't close the session from here, let httpc_handler take care of that.
+%old_session_request(Session,Req,STab,State)
+% when (Req#request.settings)#client_settings.max_quelength==0 ->
+% Session1=Session#session{pipeline=[Req]},
+% ets:insert(STab,Session1),
+% {reply,{ok,ReqId},State#state{reqid=ReqId+1}};
+old_session_request(Session,Req,STab,State) ->
+ ReqId=State#state.reqid,
+ Req1=Req#request{id=ReqId},
+ case catch httpc_handler:http_request(Req1,Session#session.socket) of
+ ok ->
+ Session1=Session#session{pipeline=[Req1|Session#session.pipeline],
+ quelength=Session#session.quelength+1},
+ ets:insert(STab,Session1),
+ {reply,{ok,ReqId},State#state{reqid=ReqId+1}};
+ {error,Reason} ->
+ ets:insert(STab,Session#session{socket=undefined}),
+% http_lib:close(Session#session.sockettype,Session#session.socket),
+ {reply,{error,Reason},State#state{reqid=ReqId+1}}
+ end.
+
+%%% Returns atuple {Reply,Sid,State} where
+%%% Reply is the response sent back to the application, and
+%%% Sid is the last used Session Id
+persistent_new_session_request(Sid,Req,STab,State) ->
+ ReqId=State#state.reqid,
+ case setup_new_session(Req#request{id=ReqId},false,Sid) of
+ {error,Reason} ->
+ {{error,Reason},State#state{reqid=ReqId+1}};
+ {NewSid,Session} ->
+ ets:insert(STab,Session),
+ {{ok,ReqId},NewSid,State#state{reqid=ReqId+1}}
+ end.
+
+%%% Returns a tuple {Reply,State} where
+%%% Reply is the response sent back to the application
+not_persistent_new_session_request(Req,State) ->
+ ReqId=State#state.reqid,
+ case setup_new_session(Req#request{id=ReqId},true,undefined) of
+ {error,Reason} ->
+ {{error,Reason},State#state{reqid=ReqId+1}};
+ ok ->
+ {{ok,ReqId},State#state{reqid=ReqId+1}}
+ end.
+
+%%% As there are no sessions available, setup a new session and send the request
+%%% on it.
+setup_new_session(Req,ClientClose,Sid) ->
+ S=#session{id=Sid,clientclose=ClientClose,
+ scheme=Req#request.scheme,
+ max_quelength=(Req#request.settings)#client_settings.max_quelength},
+ spawn_link(httpc_handler,init_connection,[Req,S]),
+ case ClientClose of
+ false ->
+ {Sid+1,S};
+ true ->
+ ok
+ end.
+
+
+%%% ----------------------------------------------------------------------------
+%%% Abort all requests in the request que.
+abort_request_que([],_Msg) ->
+ ok;
+abort_request_que([#request{from=From,ref=Ref,id=Id}|Que],Msg) ->
+ gen_server:cast(From,{Ref,Id,Msg}),
+ abort_request_que(Que,Msg);
+abort_request_que(#request{from=From,ref=Ref,id=Id},Msg) ->
+ gen_server:cast(From,{Ref,Id,Msg}).
+
+
+%%% --------------------------------
+% C={httpc_manager,{?MODULE,start_link,[]},permanent,1000,
+% worker,[?MODULE]},
+% supervisor:start_child(inets_sup, C),
+ensure_started() ->
+ case whereis(?HMANAME) of
+ undefined ->
+ start_link();
+ _ ->
+ ok
+ end.
+
+
+%%% ============================================================================
+%%% This is deprecated code, to be removed
+
+% format_time() ->
+% {_,_,MicroSecs}=TS=now(),
+% {{Y,Mon,D},{H,M,S}}=calendar:now_to_universal_time(TS),
+% lists:flatten(io_lib:format("~4.4.0w-~2.2.0w-~2.2.0w,~2.2.0w:~2.2.0w:~6.3.0f",
+% [Y,Mon,D,H,M,S+(MicroSecs/1000000)])).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd.erl
new file mode 100644
index 0000000000..3199e4430d
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd.erl
@@ -0,0 +1,594 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: httpd.erl,v 1.1 2008/12/17 09:53:33 mikpe Exp $
+%%
+-module(httpd).
+-export([multi_start/1, multi_start_link/1,
+ start/0, start/1, start/2,
+ start_link/0, start_link/1, start_link/2,
+ start_child/0,start_child/1,
+ multi_stop/1,
+ stop/0,stop/1,stop/2,
+ stop_child/0,stop_child/1,stop_child/2,
+ multi_restart/1,
+ restart/0,restart/1,restart/2,
+ parse_query/1]).
+
+%% Optional start related stuff...
+-export([load/1, load_mime_types/1,
+ start2/1, start2/2,
+ start_link2/1, start_link2/2,
+ stop2/1]).
+
+%% Management stuff
+-export([block/0,block/1,block/2,block/3,block/4,
+ unblock/0,unblock/1,unblock/2]).
+
+%% Debugging and status info stuff...
+-export([verbosity/3,verbosity/4]).
+-export([get_status/1,get_status/2,get_status/3,
+ get_admin_state/0,get_admin_state/1,get_admin_state/2,
+ get_usage_state/0,get_usage_state/1,get_usage_state/2]).
+
+-include("httpd.hrl").
+
+-define(D(F, A), io:format("~p:" ++ F ++ "~n", [?MODULE|A])).
+
+
+%% start
+
+start() ->
+ start("/var/tmp/server_root/conf/8888.conf").
+
+start(ConfigFile) ->
+ %% ?D("start(~s) -> entry", [ConfigFile]),
+ start(ConfigFile, []).
+
+start(ConfigFile, Verbosity) when list(ConfigFile), list(Verbosity) ->
+ httpd_sup:start(ConfigFile, Verbosity).
+
+
+%% start_link
+
+start_link() ->
+ start("/var/tmp/server_root/conf/8888.conf").
+
+start_link(ConfigFile) ->
+ start_link(ConfigFile, []).
+
+start_link(ConfigFile, Verbosity) when list(ConfigFile), list(Verbosity) ->
+ httpd_sup:start_link(ConfigFile, Verbosity).
+
+
+%% start2 & start_link2
+
+start2(Config) ->
+ start2(Config, []).
+
+start2(Config, Verbosity) when list(Config), list(Verbosity) ->
+ httpd_sup:start2(Config, Verbosity).
+
+start_link2(Config) ->
+ start_link2(Config, []).
+
+start_link2(Config, Verbosity) when list(Config), list(Verbosity) ->
+ httpd_sup:start_link2(Config, Verbosity).
+
+
+%% stop
+
+stop() ->
+ stop(8888).
+
+stop(Port) when integer(Port) ->
+ stop(undefined, Port);
+stop(Pid) when pid(Pid) ->
+ httpd_sup:stop(Pid);
+stop(ConfigFile) when list(ConfigFile) ->
+ %% ?D("stop(~s) -> entry", [ConfigFile]),
+ httpd_sup:stop(ConfigFile).
+
+stop(Addr, Port) when integer(Port) ->
+ httpd_sup:stop(Addr, Port).
+
+stop2(Config) when list(Config) ->
+ httpd_sup:stop2(Config).
+
+%% start_child
+
+start_child() ->
+ start_child("/var/tmp/server_root/conf/8888.conf").
+
+start_child(ConfigFile) ->
+ start_child(ConfigFile, []).
+
+start_child(ConfigFile, Verbosity) ->
+ inets_sup:start_child(ConfigFile, Verbosity).
+
+
+%% stop_child
+
+stop_child() ->
+ stop_child(8888).
+
+stop_child(Port) ->
+ stop_child(undefined,Port).
+
+stop_child(Addr, Port) when integer(Port) ->
+ inets_sup:stop_child(Addr, Port).
+
+
+%% multi_start
+
+multi_start(MultiConfigFile) ->
+ case read_multi_file(MultiConfigFile) of
+ {ok,ConfigFiles} ->
+ mstart(ConfigFiles);
+ Error ->
+ Error
+ end.
+
+mstart(ConfigFiles) ->
+ mstart(ConfigFiles,[]).
+mstart([],Results) ->
+ {ok,lists:reverse(Results)};
+mstart([H|T],Results) ->
+ Res = start(H),
+ mstart(T,[Res|Results]).
+
+
+%% multi_start_link
+
+multi_start_link(MultiConfigFile) ->
+ case read_multi_file(MultiConfigFile) of
+ {ok,ConfigFiles} ->
+ mstart_link(ConfigFiles);
+ Error ->
+ Error
+ end.
+
+mstart_link(ConfigFiles) ->
+ mstart_link(ConfigFiles,[]).
+mstart_link([],Results) ->
+ {ok,lists:reverse(Results)};
+mstart_link([H|T],Results) ->
+ Res = start_link(H),
+ mstart_link(T,[Res|Results]).
+
+
+%% multi_stop
+
+multi_stop(MultiConfigFile) ->
+ case read_multi_file(MultiConfigFile) of
+ {ok,ConfigFiles} ->
+ mstop(ConfigFiles);
+ Error ->
+ Error
+ end.
+
+mstop(ConfigFiles) ->
+ mstop(ConfigFiles,[]).
+mstop([],Results) ->
+ {ok,lists:reverse(Results)};
+mstop([H|T],Results) ->
+ Res = stop(H),
+ mstop(T,[Res|Results]).
+
+
+%% multi_restart
+
+multi_restart(MultiConfigFile) ->
+ case read_multi_file(MultiConfigFile) of
+ {ok,ConfigFiles} ->
+ mrestart(ConfigFiles);
+ Error ->
+ Error
+ end.
+
+mrestart(ConfigFiles) ->
+ mrestart(ConfigFiles,[]).
+mrestart([],Results) ->
+ {ok,lists:reverse(Results)};
+mrestart([H|T],Results) ->
+ Res = restart(H),
+ mrestart(T,[Res|Results]).
+
+
+%% restart
+
+restart() -> restart(undefined,8888).
+
+restart(Port) when integer(Port) ->
+ restart(undefined,Port);
+restart(ConfigFile) when list(ConfigFile) ->
+ case get_addr_and_port(ConfigFile) of
+ {ok,Addr,Port} ->
+ restart(Addr,Port);
+ Error ->
+ Error
+ end.
+
+
+restart(Addr,Port) when integer(Port) ->
+ do_restart(Addr,Port).
+
+do_restart(Addr,Port) when integer(Port) ->
+ Name = make_name(Addr,Port),
+ case whereis(Name) of
+ Pid when pid(Pid) ->
+ httpd_manager:restart(Pid);
+ _ ->
+ {error,not_started}
+ end.
+
+
+%%% =========================================================
+%%% Function: block/0, block/1, block/2, block/3, block/4
+%%% block()
+%%% block(Port)
+%%% block(ConfigFile)
+%%% block(Addr,Port)
+%%% block(Port,Mode)
+%%% block(ConfigFile,Mode)
+%%% block(Addr,Port,Mode)
+%%% block(ConfigFile,Mode,Timeout)
+%%% block(Addr,Port,Mode,Timeout)
+%%%
+%%% Returns: ok | {error,Reason}
+%%%
+%%% Description: This function is used to block an HTTP server.
+%%% The blocking can be done in two ways,
+%%% disturbing or non-disturbing. Default is disturbing.
+%%% When a HTTP server is blocked, all requests are rejected
+%%% (status code 503).
+%%%
+%%% disturbing:
+%%% By performing a disturbing block, the server
+%%% is blocked forcefully and all ongoing requests
+%%% are terminated. No new connections are accepted.
+%%% If a timeout time is given then, on-going requests
+%%% are given this much time to complete before the
+%%% server is forcefully blocked. In this case no new
+%%% connections is accepted.
+%%%
+%%% non-disturbing:
+%%% A non-disturbing block is more gracefull. No
+%%% new connections are accepted, but the ongoing
+%%% requests are allowed to complete.
+%%% If a timeout time is given, it waits this long before
+%%% giving up (the block operation is aborted and the
+%%% server state is once more not-blocked).
+%%%
+%%% Types: Port -> integer()
+%%% Addr -> {A,B,C,D} | string() | undefined
+%%% ConfigFile -> string()
+%%% Mode -> disturbing | non_disturbing
+%%% Timeout -> integer()
+%%%
+block() -> block(undefined,8888,disturbing).
+
+block(Port) when integer(Port) ->
+ block(undefined,Port,disturbing);
+
+block(ConfigFile) when list(ConfigFile) ->
+ case get_addr_and_port(ConfigFile) of
+ {ok,Addr,Port} ->
+ block(Addr,Port,disturbing);
+ Error ->
+ Error
+ end.
+
+block(Addr,Port) when integer(Port) ->
+ block(Addr,Port,disturbing);
+
+block(Port,Mode) when integer(Port), atom(Mode) ->
+ block(undefined,Port,Mode);
+
+block(ConfigFile,Mode) when list(ConfigFile), atom(Mode) ->
+ case get_addr_and_port(ConfigFile) of
+ {ok,Addr,Port} ->
+ block(Addr,Port,Mode);
+ Error ->
+ Error
+ end.
+
+
+block(Addr,Port,disturbing) when integer(Port) ->
+ do_block(Addr,Port,disturbing);
+block(Addr,Port,non_disturbing) when integer(Port) ->
+ do_block(Addr,Port,non_disturbing);
+
+block(ConfigFile,Mode,Timeout) when list(ConfigFile), atom(Mode), integer(Timeout) ->
+ case get_addr_and_port(ConfigFile) of
+ {ok,Addr,Port} ->
+ block(Addr,Port,Mode,Timeout);
+ Error ->
+ Error
+ end.
+
+
+block(Addr,Port,non_disturbing,Timeout) when integer(Port), integer(Timeout) ->
+ do_block(Addr,Port,non_disturbing,Timeout);
+block(Addr,Port,disturbing,Timeout) when integer(Port), integer(Timeout) ->
+ do_block(Addr,Port,disturbing,Timeout).
+
+do_block(Addr,Port,Mode) when integer(Port), atom(Mode) ->
+ Name = make_name(Addr,Port),
+ case whereis(Name) of
+ Pid when pid(Pid) ->
+ httpd_manager:block(Pid,Mode);
+ _ ->
+ {error,not_started}
+ end.
+
+
+do_block(Addr,Port,Mode,Timeout) when integer(Port), atom(Mode) ->
+ Name = make_name(Addr,Port),
+ case whereis(Name) of
+ Pid when pid(Pid) ->
+ httpd_manager:block(Pid,Mode,Timeout);
+ _ ->
+ {error,not_started}
+ end.
+
+
+%%% =========================================================
+%%% Function: unblock/0, unblock/1, unblock/2
+%%% unblock()
+%%% unblock(Port)
+%%% unblock(ConfigFile)
+%%% unblock(Addr,Port)
+%%%
+%%% Description: This function is used to reverse a previous block
+%%% operation on the HTTP server.
+%%%
+%%% Types: Port -> integer()
+%%% Addr -> {A,B,C,D} | string() | undefined
+%%% ConfigFile -> string()
+%%%
+unblock() -> unblock(undefined,8888).
+unblock(Port) when integer(Port) -> unblock(undefined,Port);
+
+unblock(ConfigFile) when list(ConfigFile) ->
+ case get_addr_and_port(ConfigFile) of
+ {ok,Addr,Port} ->
+ unblock(Addr,Port);
+ Error ->
+ Error
+ end.
+
+unblock(Addr,Port) when integer(Port) ->
+ Name = make_name(Addr,Port),
+ case whereis(Name) of
+ Pid when pid(Pid) ->
+ httpd_manager:unblock(Pid);
+ _ ->
+ {error,not_started}
+ end.
+
+
+verbosity(Port,Who,Verbosity) ->
+ verbosity(undefined,Port,Who,Verbosity).
+
+verbosity(Addr,Port,Who,Verbosity) ->
+ Name = make_name(Addr,Port),
+ case whereis(Name) of
+ Pid when pid(Pid) ->
+ httpd_manager:verbosity(Pid,Who,Verbosity);
+ _ ->
+ not_started
+ end.
+
+
+%%% =========================================================
+%%% Function: get_admin_state/0, get_admin_state/1, get_admin_state/2
+%%% get_admin_state()
+%%% get_admin_state(Port)
+%%% get_admin_state(Addr,Port)
+%%%
+%%% Returns: {ok,State} | {error,Reason}
+%%%
+%%% Description: This function is used to retrieve the administrative
+%%% state of the HTTP server.
+%%%
+%%% Types: Port -> integer()
+%%% Addr -> {A,B,C,D} | string() | undefined
+%%% State -> unblocked | shutting_down | blocked
+%%% Reason -> term()
+%%%
+get_admin_state() -> get_admin_state(undefined,8888).
+get_admin_state(Port) when integer(Port) -> get_admin_state(undefined,Port);
+
+get_admin_state(ConfigFile) when list(ConfigFile) ->
+ case get_addr_and_port(ConfigFile) of
+ {ok,Addr,Port} ->
+ unblock(Addr,Port);
+ Error ->
+ Error
+ end.
+
+get_admin_state(Addr,Port) when integer(Port) ->
+ Name = make_name(Addr,Port),
+ case whereis(Name) of
+ Pid when pid(Pid) ->
+ httpd_manager:get_admin_state(Pid);
+ _ ->
+ {error,not_started}
+ end.
+
+
+
+%%% =========================================================
+%%% Function: get_usage_state/0, get_usage_state/1, get_usage_state/2
+%%% get_usage_state()
+%%% get_usage_state(Port)
+%%% get_usage_state(Addr,Port)
+%%%
+%%% Returns: {ok,State} | {error,Reason}
+%%%
+%%% Description: This function is used to retrieve the usage
+%%% state of the HTTP server.
+%%%
+%%% Types: Port -> integer()
+%%% Addr -> {A,B,C,D} | string() | undefined
+%%% State -> idle | active | busy
+%%% Reason -> term()
+%%%
+get_usage_state() -> get_usage_state(undefined,8888).
+get_usage_state(Port) when integer(Port) -> get_usage_state(undefined,Port);
+
+get_usage_state(ConfigFile) when list(ConfigFile) ->
+ case get_addr_and_port(ConfigFile) of
+ {ok,Addr,Port} ->
+ unblock(Addr,Port);
+ Error ->
+ Error
+ end.
+
+get_usage_state(Addr,Port) when integer(Port) ->
+ Name = make_name(Addr,Port),
+ case whereis(Name) of
+ Pid when pid(Pid) ->
+ httpd_manager:get_usage_state(Pid);
+ _ ->
+ {error,not_started}
+ end.
+
+
+
+%%% =========================================================
+%% Function: get_status(ConfigFile) -> Status
+%% get_status(Port) -> Status
+%% get_status(Addr,Port) -> Status
+%% get_status(Port,Timeout) -> Status
+%% get_status(Addr,Port,Timeout) -> Status
+%%
+%% Arguments: ConfigFile -> string()
+%% Configuration file from which Port and
+%% BindAddress will be extracted.
+%% Addr -> {A,B,C,D} | string()
+%% Bind Address of the http server
+%% Port -> integer()
+%% Port number of the http server
+%% Timeout -> integer()
+%% Timeout time for the call
+%%
+%% Returns: Status -> list()
+%%
+%% Description: This function is used when the caller runs in the
+%% same node as the http server or if calling with a
+%% program such as erl_call (see erl_interface).
+%%
+
+get_status(ConfigFile) when list(ConfigFile) ->
+ case get_addr_and_port(ConfigFile) of
+ {ok,Addr,Port} ->
+ get_status(Addr,Port);
+ Error ->
+ Error
+ end;
+
+get_status(Port) when integer(Port) ->
+ get_status(undefined,Port,5000).
+
+get_status(Port,Timeout) when integer(Port), integer(Timeout) ->
+ get_status(undefined,Port,Timeout);
+
+get_status(Addr,Port) when list(Addr), integer(Port) ->
+ get_status(Addr,Port,5000).
+
+get_status(Addr,Port,Timeout) when integer(Port) ->
+ Name = make_name(Addr,Port),
+ case whereis(Name) of
+ Pid when pid(Pid) ->
+ httpd_manager:get_status(Pid,Timeout);
+ _ ->
+ not_started
+ end.
+
+
+%% load config
+
+load(ConfigFile) ->
+ httpd_conf:load(ConfigFile).
+
+load_mime_types(MimeTypesFile) ->
+ httpd_conf:load_mime_types(MimeTypesFile).
+
+
+%% parse_query
+
+parse_query(String) ->
+ {ok, SplitString} = regexp:split(String,"[&;]"),
+ foreach(SplitString).
+
+foreach([]) ->
+ [];
+foreach([KeyValue|Rest]) ->
+ {ok, Plus2Space, _} = regexp:gsub(KeyValue,"[\+]"," "),
+ case regexp:split(Plus2Space,"=") of
+ {ok,[Key|Value]} ->
+ [{httpd_util:decode_hex(Key),
+ httpd_util:decode_hex(lists:flatten(Value))}|foreach(Rest)];
+ {ok,_} ->
+ foreach(Rest)
+ end.
+
+
+%% get_addr_and_port
+
+get_addr_and_port(ConfigFile) ->
+ case httpd_conf:load(ConfigFile) of
+ {ok,ConfigList} ->
+ Port = httpd_util:key1search(ConfigList,port,80),
+ Addr = httpd_util:key1search(ConfigList,bind_address),
+ {ok,Addr,Port};
+ Error ->
+ Error
+ end.
+
+
+%% make_name
+
+make_name(Addr,Port) ->
+ httpd_util:make_name("httpd",Addr,Port).
+
+
+%% Multi stuff
+%%
+
+read_multi_file(File) ->
+ read_mfile(file:open(File,[read])).
+
+read_mfile({ok,Fd}) ->
+ read_mfile(read_line(Fd),Fd,[]);
+read_mfile(Error) ->
+ Error.
+
+read_mfile(eof,_Fd,SoFar) ->
+ {ok,lists:reverse(SoFar)};
+read_mfile({error,Reason},_Fd,SoFar) ->
+ {error,Reason};
+read_mfile([$#|Comment],Fd,SoFar) ->
+ read_mfile(read_line(Fd),Fd,SoFar);
+read_mfile([],Fd,SoFar) ->
+ read_mfile(read_line(Fd),Fd,SoFar);
+read_mfile(Line,Fd,SoFar) ->
+ read_mfile(read_line(Fd),Fd,[Line|SoFar]).
+
+read_line(Fd) -> read_line1(io:get_line(Fd,[])).
+read_line1(eof) -> eof;
+read_line1(String) -> httpd_conf:clean(String).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd.hrl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd.hrl
new file mode 100644
index 0000000000..015c1b1e2d
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd.hrl
@@ -0,0 +1,77 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: httpd.hrl,v 1.1 2008/12/17 09:53:33 mikpe Exp $
+%%
+
+-include_lib("kernel/include/file.hrl").
+
+-ifndef(SERVER_SOFTWARE).
+-define(SERVER_SOFTWARE,"inets/develop"). % Define in Makefile!
+-endif.
+-define(SERVER_PROTOCOL,"HTTP/1.1").
+-define(SOCKET_CHUNK_SIZE,8192).
+-define(SOCKET_MAX_POLL,25).
+-define(FILE_CHUNK_SIZE,64*1024).
+-define(NICE(Reason),lists:flatten(atom_to_list(?MODULE)++": "++Reason)).
+-define(DEFAULT_CONTEXT,
+ [{errmsg,"[an error occurred while processing this directive]"},
+ {timefmt,"%A, %d-%b-%y %T %Z"},
+ {sizefmt,"abbrev"}]).
+
+
+-ifdef(inets_error).
+-define(ERROR(Format, Args), io:format("E(~p:~p:~p) : "++Format++"~n",
+ [self(),?MODULE,?LINE]++Args)).
+-else.
+-define(ERROR(F,A),[]).
+-endif.
+
+-ifdef(inets_log).
+-define(LOG(Format, Args), io:format("L(~p:~p:~p) : "++Format++"~n",
+ [self(),?MODULE,?LINE]++Args)).
+-else.
+-define(LOG(F,A),[]).
+-endif.
+
+-ifdef(inets_debug).
+-define(DEBUG(Format, Args), io:format("D(~p:~p:~p) : "++Format++"~n",
+ [self(),?MODULE,?LINE]++Args)).
+-else.
+-define(DEBUG(F,A),[]).
+-endif.
+
+-ifdef(inets_cdebug).
+-define(CDEBUG(Format, Args), io:format("C(~p:~p:~p) : "++Format++"~n",
+ [self(),?MODULE,?LINE]++Args)).
+-else.
+-define(CDEBUG(F,A),[]).
+-endif.
+
+
+-record(init_data,{peername,resolve}).
+-record(mod,{init_data,
+ data=[],
+ socket_type=ip_comm,
+ socket,
+ config_db,
+ method,
+ absolute_uri=[],
+ request_uri,
+ http_version,
+ request_line,
+ parsed_header=[],
+ entity_body,
+ connection}).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_acceptor.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_acceptor.erl
new file mode 100644
index 0000000000..7bf2d5d868
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_acceptor.erl
@@ -0,0 +1,174 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: httpd_acceptor.erl,v 1.1 2008/12/17 09:53:33 mikpe Exp $
+%%
+-module(httpd_acceptor).
+
+-include("httpd.hrl").
+-include("httpd_verbosity.hrl").
+
+
+%% External API
+-export([start_link/6]).
+
+%% Other exports (for spawn's etc.)
+-export([acceptor/4, acceptor/7]).
+
+
+%%
+%% External API
+%%
+
+%% start_link
+
+start_link(Manager, SocketType, Addr, Port, ConfigDb, Verbosity) ->
+ Args = [self(), Manager, SocketType, Addr, Port, ConfigDb, Verbosity],
+ proc_lib:start_link(?MODULE, acceptor, Args).
+
+
+acceptor(Parent, Manager, SocketType, Addr, Port, ConfigDb, Verbosity) ->
+ put(sname,acc),
+ put(verbosity,Verbosity),
+ ?vlog("starting",[]),
+ case (catch do_init(SocketType, Addr, Port)) of
+ {ok, ListenSocket} ->
+ proc_lib:init_ack(Parent, {ok, self()}),
+ acceptor(Manager, SocketType, ListenSocket, ConfigDb);
+ Error ->
+ proc_lib:init_ack(Parent, Error),
+ error
+ end.
+
+do_init(SocketType, Addr, Port) ->
+ do_socket_start(SocketType),
+ ListenSocket = do_socket_listen(SocketType, Addr, Port),
+ {ok, ListenSocket}.
+
+
+do_socket_start(SocketType) ->
+ case httpd_socket:start(SocketType) of
+ ok ->
+ ok;
+ {error, Reason} ->
+ ?vinfo("failed socket start: ~p",[Reason]),
+ throw({error, {socket_start_failed, Reason}})
+ end.
+
+
+do_socket_listen(SocketType, Addr, Port) ->
+ case httpd_socket:listen(SocketType, Addr, Port) of
+ {error, Reason} ->
+ ?vinfo("failed socket listen operation: ~p", [Reason]),
+ throw({error, {listen, Reason}});
+ ListenSocket ->
+ ListenSocket
+ end.
+
+
+%% acceptor
+
+acceptor(Manager, SocketType, ListenSocket, ConfigDb) ->
+ ?vdebug("await connection",[]),
+ case (catch httpd_socket:accept(SocketType, ListenSocket, 30000)) of
+ {error, Reason} ->
+ handle_error(Reason, ConfigDb, SocketType),
+ ?MODULE:acceptor(Manager, SocketType, ListenSocket, ConfigDb);
+
+ {'EXIT', Reason} ->
+ handle_error({'EXIT', Reason}, ConfigDb, SocketType),
+ ?MODULE:acceptor(Manager, SocketType, ListenSocket, ConfigDb);
+
+ Socket ->
+ handle_connection(Manager, ConfigDb, SocketType, Socket),
+ ?MODULE:acceptor(Manager, SocketType, ListenSocket, ConfigDb)
+ end.
+
+
+handle_connection(Manager, ConfigDb, SocketType, Socket) ->
+ case httpd_request_handler:start_link(Manager, ConfigDb) of
+ {ok, Pid} ->
+ httpd_socket:controlling_process(SocketType, Socket, Pid),
+ httpd_request_handler:synchronize(Pid, SocketType, Socket);
+ {error, Reason} ->
+ handle_connection_err(SocketType, Socket, ConfigDb, Reason)
+ end.
+
+
+handle_connection_err(SocketType, Socket, ConfigDb, Reason) ->
+ String =
+ lists:flatten(
+ io_lib:format("failed starting request handler:~n ~p", [Reason])),
+ report_error(ConfigDb, String),
+ httpd_socket:close(SocketType, Socket).
+
+
+handle_error(timeout, _, _) ->
+ ?vtrace("Accept timeout",[]),
+ ok;
+
+handle_error({enfile, _}, _, _) ->
+ ?vinfo("Accept error: enfile",[]),
+ %% Out of sockets...
+ sleep(200);
+
+handle_error(emfile, _, _) ->
+ ?vinfo("Accept error: emfile",[]),
+ %% Too many open files -> Out of sockets...
+ sleep(200);
+
+handle_error(closed, _, _) ->
+ ?vlog("Accept error: closed",[]),
+ %% This propably only means that the application is stopping,
+ %% but just in case
+ exit(closed);
+
+handle_error(econnaborted, _, _) ->
+ ?vlog("Accept aborted",[]),
+ ok;
+
+handle_error(esslaccept, _, _) ->
+ %% The user has selected to cancel the installation of
+ %% the certifikate, This is not a real error, so we do
+ %% not write an error message.
+ ok;
+
+handle_error({'EXIT', Reason}, ConfigDb, SocketType) ->
+ ?vinfo("Accept exit:~n ~p",[Reason]),
+ String = lists:flatten(io_lib:format("Accept exit: ~p", [Reason])),
+ accept_failed(SocketType, ConfigDb, String);
+
+handle_error(Reason, ConfigDb, SocketType) ->
+ ?vinfo("Accept error:~n ~p",[Reason]),
+ String = lists:flatten(io_lib:format("Accept error: ~p", [Reason])),
+ accept_failed(SocketType, ConfigDb, String).
+
+
+accept_failed(SocketType, ConfigDb, String) ->
+ error_logger:error_report(String),
+ mod_log:error_log(SocketType, undefined, ConfigDb,
+ {0, "unknown"}, String),
+ mod_disk_log:error_log(SocketType, undefined, ConfigDb,
+ {0, "unknown"}, String),
+ exit({accept_failed, String}).
+
+
+report_error(Db, String) ->
+ error_logger:error_report(String),
+ mod_log:report_error(Db, String),
+ mod_disk_log:report_error(Db, String).
+
+
+sleep(T) -> receive after T -> ok end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_acceptor_sup.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_acceptor_sup.erl
new file mode 100644
index 0000000000..86c31ad5df
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_acceptor_sup.erl
@@ -0,0 +1,116 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: httpd_acceptor_sup.erl,v 1.1 2008/12/17 09:53:33 mikpe Exp $
+%%
+%%----------------------------------------------------------------------
+%% Purpose: The top supervisor for the Megaco/H.248 application
+%%----------------------------------------------------------------------
+
+-module(httpd_acceptor_sup).
+
+-behaviour(supervisor).
+
+-include("httpd_verbosity.hrl").
+
+%% public
+-export([start/3, stop/1, init/1]).
+
+-export([start_acceptor/4, stop_acceptor/2]).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% supervisor callback functions
+
+
+start(Addr, Port, AccSupVerbosity) ->
+ SupName = make_name(Addr, Port),
+ supervisor:start_link({local, SupName}, ?MODULE, [AccSupVerbosity]).
+
+stop(StartArgs) ->
+ ok.
+
+init([Verbosity]) -> % Supervisor
+ do_init(Verbosity);
+init(BadArg) ->
+ {error, {badarg, BadArg}}.
+
+do_init(Verbosity) ->
+ put(verbosity,?vvalidate(Verbosity)),
+ put(sname,acc_sup),
+ ?vlog("starting", []),
+ Flags = {one_for_one, 500, 100},
+ KillAfter = timer:seconds(1),
+ Workers = [],
+ {ok, {Flags, Workers}}.
+
+
+%%----------------------------------------------------------------------
+%% Function: [start|stop]_acceptor/5
+%% Description: Starts a [auth | security] worker (child) process
+%%----------------------------------------------------------------------
+
+start_acceptor(SocketType, Addr, Port, ConfigDb) ->
+ Verbosity = get_acc_verbosity(),
+ start_worker(httpd_acceptor, SocketType, Addr, Port,
+ ConfigDb, Verbosity, self(), []).
+
+stop_acceptor(Addr, Port) ->
+ stop_worker(httpd_acceptor, Addr, Port).
+
+
+%%----------------------------------------------------------------------
+%% Function: start_worker/5
+%% Description: Starts a (permanent) worker (child) process
+%%----------------------------------------------------------------------
+
+start_worker(M, SocketType, Addr, Port, ConfigDB, Verbosity, Manager,
+ Modules) ->
+ SupName = make_name(Addr, Port),
+ Args = [Manager, SocketType, Addr, Port, ConfigDB, Verbosity],
+ Spec = {{M, Addr, Port},
+ {M, start_link, Args},
+ permanent, timer:seconds(1), worker, [M] ++ Modules},
+ supervisor:start_child(SupName, Spec).
+
+
+%%----------------------------------------------------------------------
+%% Function: stop_permanent_worker/3
+%% Description: Stops a permanent worker (child) process
+%%----------------------------------------------------------------------
+
+stop_worker(M, Addr, Port) ->
+ SupName = make_name(Addr, Port),
+ Name = {M, Addr, Port},
+ case supervisor:terminate_child(SupName, Name) of
+ ok ->
+ supervisor:delete_child(SupName, Name);
+ Error ->
+ Error
+ end.
+
+
+make_name(Addr,Port) ->
+ httpd_util:make_name("httpd_acc_sup",Addr,Port).
+
+
+
+get_acc_verbosity() ->
+ get_verbosity(get(acceptor_verbosity)).
+
+get_verbosity(undefined) ->
+ ?default_verbosity;
+get_verbosity(V) ->
+ ?vvalidate(V).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_conf.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_conf.erl
new file mode 100644
index 0000000000..69419b1eb3
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_conf.erl
@@ -0,0 +1,688 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: httpd_conf.erl,v 1.1 2008/12/17 09:53:33 mikpe Exp $
+%%
+-module(httpd_conf).
+-export([load/1, load_mime_types/1,
+ load/2, store/1, store/2,
+ remove_all/1, remove/1,
+ is_directory/1, is_file/1,
+ make_integer/1, clean/1, custom_clean/3, check_enum/2]).
+
+
+-define(VMODULE,"CONF").
+-include("httpd_verbosity.hrl").
+
+%% The configuration data is handled in three (3) phases:
+%% 1. Parse the config file and put all directives into a key-vale
+%% tuple list (load/1).
+%% 2. Traverse the key-value tuple list store it into an ETS table.
+%% Directives depending on other directives are taken care of here
+%% (store/1).
+%% 3. Traverse the ETS table and do a complete clean-up (remove/1).
+
+-include("httpd.hrl").
+
+%%
+%% Phase 1: Load
+%%
+
+%% load
+
+load(ConfigFile) ->
+ ?CDEBUG("load -> ConfigFile: ~p",[ConfigFile]),
+ case read_config_file(ConfigFile) of
+ {ok, Config} ->
+ case bootstrap(Config) of
+ {error, Reason} ->
+ {error, Reason};
+ {ok, Modules} ->
+ load_config(Config, lists:append(Modules, [?MODULE]))
+ end;
+ {error, Reason} ->
+ {error, ?NICE("Error while reading config file: "++Reason)}
+ end.
+
+
+bootstrap([]) ->
+ {error, ?NICE("Modules must be specified in the config file")};
+bootstrap([Line|Config]) ->
+ case Line of
+ [$M,$o,$d,$u,$l,$e,$s,$ |Modules] ->
+ {ok, ModuleList} = regexp:split(Modules," "),
+ TheMods = [list_to_atom(X) || X <- ModuleList],
+ case verify_modules(TheMods) of
+ ok ->
+ {ok, TheMods};
+ {error, Reason} ->
+ ?ERROR("bootstrap -> : validation failed: ~p",[Reason]),
+ {error, Reason}
+ end;
+ _ ->
+ bootstrap(Config)
+ end.
+
+
+%%
+%% verify_modules/1 -> ok | {error, Reason}
+%%
+%% Verifies that all specified modules are available.
+%%
+verify_modules([]) ->
+ ok;
+verify_modules([Mod|Rest]) ->
+ case code:which(Mod) of
+ non_existing ->
+ {error, ?NICE(atom_to_list(Mod)++" does not exist")};
+ Path ->
+ verify_modules(Rest)
+ end.
+
+%%
+%% read_config_file/1 -> {ok, [line(), line()..]} | {error, Reason}
+%%
+%% Reads the entire configuration file and returns list of strings or
+%% and error.
+%%
+
+
+read_config_file(FileName) ->
+ case file:open(FileName, [read]) of
+ {ok, Stream} ->
+ read_config_file(Stream, []);
+ {error, Reason} ->
+ {error, ?NICE("Cannot open "++FileName)}
+ end.
+
+read_config_file(Stream, SoFar) ->
+ case io:get_line(Stream, []) of
+ eof ->
+ {ok, lists:reverse(SoFar)};
+ {error, Reason} ->
+ {error, Reason};
+ [$#|Rest] ->
+ %% Ignore commented lines for efficiency later ..
+ read_config_file(Stream, SoFar);
+ Line ->
+ {ok, NewLine, _}=regexp:sub(clean(Line),"[\t\r\f ]"," "),
+ case NewLine of
+ [] ->
+ %% Also ignore empty lines ..
+ read_config_file(Stream, SoFar);
+ Other ->
+ read_config_file(Stream, [NewLine|SoFar])
+ end
+ end.
+
+is_exported(Module, ToFind) ->
+ Exports = Module:module_info(exports),
+ lists:member(ToFind, Exports).
+
+%%
+%% load/4 -> {ok, ConfigList} | {error, Reason}
+%%
+%% This loads the config file into each module specified by Modules
+%% Each module has its own context that is passed to and (optionally)
+%% returned by the modules load function. The module can also return
+%% a ConfigEntry, which will be added to the global configuration
+%% list.
+%% All configuration directives are guaranteed to be passed to all
+%% modules. Each module only implements the function clauses of
+%% the load function for the configuration directives it supports,
+%% it's ok if an apply returns {'EXIT', {function_clause, ..}}.
+%%
+load_config(Config, Modules) ->
+ %% Create default contexts for all modules
+ Contexts = lists:duplicate(length(Modules), []),
+ load_config(Config, Modules, Contexts, []).
+
+
+load_config([], _Modules, _Contexts, ConfigList) ->
+ case a_must(ConfigList, [server_name,port,server_root,document_root]) of
+ ok ->
+ {ok, ConfigList};
+ {missing, Directive} ->
+ {error, ?NICE(atom_to_list(Directive)++
+ " must be specified in the config file")}
+ end;
+
+load_config([Line|Config], Modules, Contexts, ConfigList) ->
+ ?CDEBUG("load_config -> Line: ~p",[Line]),
+ case load_traverse(Line, Contexts, Modules, [], ConfigList, no) of
+ {ok, NewContexts, NewConfigList} ->
+ load_config(Config, Modules, NewContexts, NewConfigList);
+ {error, Reason} ->
+ ?ERROR("load_config -> traverse failed: ~p",[Reason]),
+ {error, Reason}
+ end.
+
+
+load_traverse(Line, [], [], NewContexts, ConfigList, no) ->
+ ?CDEBUG("load_traverse/no -> ~n"
+ " Line: ~p~n"
+ " NewContexts: ~p~n"
+ " ConfigList: ~p",
+ [Line,NewContexts,ConfigList]),
+ {error, ?NICE("Configuration directive not recognized: "++Line)};
+load_traverse(Line, [], [], NewContexts, ConfigList, yes) ->
+ ?CDEBUG("load_traverse/yes -> ~n"
+ " Line: ~p~n"
+ " NewContexts: ~p~n"
+ " ConfigList: ~p",
+ [Line,NewContexts,ConfigList]),
+ {ok, lists:reverse(NewContexts), ConfigList};
+load_traverse(Line, [Context|Contexts], [Module|Modules], NewContexts, ConfigList, State) ->
+ ?CDEBUG("load_traverse/~p -> ~n"
+ " Line: ~p~n"
+ " Module: ~p~n"
+ " Context: ~p~n"
+ " Contexts: ~p~n"
+ " NewContexts: ~p",
+ [State,Line,Module,Context,Contexts,NewContexts]),
+ case is_exported(Module, {load, 2}) of
+ true ->
+ ?CDEBUG("load_traverse -> ~p:load/2 exported",[Module]),
+ case catch apply(Module, load, [Line, Context]) of
+ {'EXIT', {function_clause, _}} ->
+ ?CDEBUG("load_traverse -> exit: function_clause"
+ "~n Module: ~p"
+ "~n Line: ~s",[Module,Line]),
+ load_traverse(Line, Contexts, Modules, [Context|NewContexts], ConfigList, State);
+ {'EXIT', Reason} ->
+ ?CDEBUG("load_traverse -> exit: ~p",[Reason]),
+ error_logger:error_report({'EXIT', Reason}),
+ load_traverse(Line, Contexts, Modules, [Context|NewContexts], ConfigList, State);
+ {ok, NewContext} ->
+ ?CDEBUG("load_traverse -> ~n"
+ " NewContext: ~p",[NewContext]),
+ load_traverse(Line, Contexts, Modules, [NewContext|NewContexts], ConfigList,yes);
+ {ok, NewContext, ConfigEntry} when tuple(ConfigEntry) ->
+ ?CDEBUG("load_traverse (tuple) -> ~n"
+ " NewContext: ~p~n"
+ " ConfigEntry: ~p",[NewContext,ConfigEntry]),
+ load_traverse(Line, Contexts, Modules, [NewContext|NewContexts],
+ [ConfigEntry|ConfigList], yes);
+ {ok, NewContext, ConfigEntry} when list(ConfigEntry) ->
+ ?CDEBUG("load_traverse (list) -> ~n"
+ " NewContext: ~p~n"
+ " ConfigEntry: ~p",[NewContext,ConfigEntry]),
+ load_traverse(Line, Contexts, Modules, [NewContext|NewContexts],
+ lists:append(ConfigEntry, ConfigList), yes);
+ {error, Reason} ->
+ ?CDEBUG("load_traverse -> error: ~p",[Reason]),
+ {error, Reason}
+ end;
+ false ->
+ ?CDEBUG("load_traverse -> ~p:load/2 not exported",[Module]),
+ load_traverse(Line, Contexts, Modules, [Context|NewContexts],
+ ConfigList,yes)
+ end.
+
+
+load(eof, []) ->
+ eof;
+
+load([$M,$a,$x,$H,$e,$a,$d,$e,$r,$S,$i,$z,$e,$ |MaxHeaderSize], []) ->
+ ?DEBUG("load -> MaxHeaderSize: ~p",[MaxHeaderSize]),
+ case make_integer(MaxHeaderSize) of
+ {ok, Integer} ->
+ {ok, [], {max_header_size,Integer}};
+ {error, _} ->
+ {error, ?NICE(clean(MaxHeaderSize)++
+ " is an invalid number of MaxHeaderSize")}
+ end;
+load([$M,$a,$x,$H,$e,$a,$d,$e,$r,$A,$c,$t,$i,$o,$n,$ |Action], []) ->
+ ?DEBUG("load -> MaxHeaderAction: ~p",[Action]),
+ {ok, [], {max_header_action,list_to_atom(clean(Action))}};
+load([$M,$a,$x,$B,$o,$d,$y,$S,$i,$z,$e,$ |MaxBodySize], []) ->
+ ?DEBUG("load -> MaxBodySize: ~p",[MaxBodySize]),
+ case make_integer(MaxBodySize) of
+ {ok, Integer} ->
+ {ok, [], {max_body_size,Integer}};
+ {error, _} ->
+ {error, ?NICE(clean(MaxBodySize)++
+ " is an invalid number of MaxBodySize")}
+ end;
+load([$M,$a,$x,$B,$o,$d,$y,$A,$c,$t,$i,$o,$n,$ |Action], []) ->
+ ?DEBUG("load -> MaxBodyAction: ~p",[Action]),
+ {ok, [], {max_body_action,list_to_atom(clean(Action))}};
+load([$S,$e,$r,$v,$e,$r,$N,$a,$m,$e,$ |ServerName], []) ->
+ ?DEBUG("load -> ServerName: ~p",[ServerName]),
+ {ok,[],{server_name,clean(ServerName)}};
+load([$S,$o,$c,$k,$e,$t,$T,$y,$p,$e,$ |SocketType], []) ->
+ ?DEBUG("load -> SocketType: ~p",[SocketType]),
+ case check_enum(clean(SocketType),["ssl","ip_comm"]) of
+ {ok, ValidSocketType} ->
+ {ok, [], {com_type,ValidSocketType}};
+ {error,_} ->
+ {error, ?NICE(clean(SocketType) ++ " is an invalid SocketType")}
+ end;
+load([$P,$o,$r,$t,$ |Port], []) ->
+ ?DEBUG("load -> Port: ~p",[Port]),
+ case make_integer(Port) of
+ {ok, Integer} ->
+ {ok, [], {port,Integer}};
+ {error, _} ->
+ {error, ?NICE(clean(Port)++" is an invalid Port")}
+ end;
+load([$B,$i,$n,$d,$A,$d,$d,$r,$e,$s,$s,$ |Address], []) ->
+ ?DEBUG("load -> Address: ~p",[Address]),
+ case clean(Address) of
+ "*" ->
+ {ok, [], {bind_address,any}};
+ CAddress ->
+ ?CDEBUG("load -> CAddress: ~p",[CAddress]),
+ case inet:getaddr(CAddress,inet) of
+ {ok, IPAddr} ->
+ ?CDEBUG("load -> IPAddr: ~p",[IPAddr]),
+ {ok, [], {bind_address,IPAddr}};
+ {error, _} ->
+ {error, ?NICE(CAddress++" is an invalid address")}
+ end
+ end;
+load([$K,$e,$e,$p,$A,$l,$i,$v,$e,$ |OnorOff], []) ->
+ case list_to_atom(clean(OnorOff)) of
+ off ->
+ {ok, [], {persistent_conn, false}};
+ _ ->
+ {ok, [], {persistent_conn, true}}
+ end;
+load([$M,$a,$x,$K,$e,$e,$p,$A,$l,$i,$v,$e,$R,$e,$q,$u,$e,$s,$t,$ |MaxRequests], []) ->
+ case make_integer(MaxRequests) of
+ {ok, Integer} ->
+ {ok, [], {max_keep_alive_request, Integer}};
+ {error, _} ->
+ {error, ?NICE(clean(MaxRequests)++" is an invalid MaxKeepAliveRequest")}
+ end;
+load([$K,$e,$e,$p,$A,$l,$i,$v,$e,$T,$i,$m,$e,$o,$u,$t,$ |Timeout], []) ->
+ case make_integer(Timeout) of
+ {ok, Integer} ->
+ {ok, [], {keep_alive_timeout, Integer*1000}};
+ {error, _} ->
+ {error, ?NICE(clean(Timeout)++" is an invalid KeepAliveTimeout")}
+ end;
+load([$M,$o,$d,$u,$l,$e,$s,$ |Modules], []) ->
+ {ok, ModuleList} = regexp:split(Modules," "),
+ {ok, [], {modules,[list_to_atom(X) || X <- ModuleList]}};
+load([$S,$e,$r,$v,$e,$r,$A,$d,$m,$i,$n,$ |ServerAdmin], []) ->
+ {ok, [], {server_admin,clean(ServerAdmin)}};
+load([$S,$e,$r,$v,$e,$r,$R,$o,$o,$t,$ |ServerRoot], []) ->
+ case is_directory(clean(ServerRoot)) of
+ {ok, Directory} ->
+ MimeTypesFile =
+ filename:join([clean(ServerRoot),"conf", "mime.types"]),
+ case load_mime_types(MimeTypesFile) of
+ {ok, MimeTypesList} ->
+ {ok, [], [{server_root,string:strip(Directory,right,$/)},
+ {mime_types,MimeTypesList}]};
+ {error, Reason} ->
+ {error, Reason}
+ end;
+ {error, _} ->
+ {error, ?NICE(clean(ServerRoot)++" is an invalid ServerRoot")}
+ end;
+load([$M,$a,$x,$C,$l,$i,$e,$n,$t,$s,$ |MaxClients], []) ->
+ ?DEBUG("load -> MaxClients: ~p",[MaxClients]),
+ case make_integer(MaxClients) of
+ {ok, Integer} ->
+ {ok, [], {max_clients,Integer}};
+ {error, _} ->
+ {error, ?NICE(clean(MaxClients)++" is an invalid number of MaxClients")}
+ end;
+load([$D,$o,$c,$u,$m,$e,$n,$t,$R,$o,$o,$t,$ |DocumentRoot],[]) ->
+ case is_directory(clean(DocumentRoot)) of
+ {ok, Directory} ->
+ {ok, [], {document_root,string:strip(Directory,right,$/)}};
+ {error, _} ->
+ {error, ?NICE(clean(DocumentRoot)++"is an invalid DocumentRoot")}
+ end;
+load([$D,$e,$f,$a,$u,$l,$t,$T,$y,$p,$e,$ |DefaultType], []) ->
+ {ok, [], {default_type,clean(DefaultType)}};
+load([$S,$S,$L,$C,$e,$r,$t,$i,$f,$i,$c,$a,$t,$e,$F,$i,$l,$e,$ | SSLCertificateFile], []) ->
+ ?DEBUG("load -> SSLCertificateFile: ~p",[SSLCertificateFile]),
+ case is_file(clean(SSLCertificateFile)) of
+ {ok, File} ->
+ {ok, [], {ssl_certificate_file,File}};
+ {error, _} ->
+ {error, ?NICE(clean(SSLCertificateFile)++
+ " is an invalid SSLCertificateFile")}
+ end;
+load([$S,$S,$L,$C,$e,$r,$t,$i,$f,$i,$c,$a,$t,$e,$K,$e,$y,$F,$i,$l,$e,$ |
+ SSLCertificateKeyFile], []) ->
+ ?DEBUG("load -> SSLCertificateKeyFile: ~p",[SSLCertificateKeyFile]),
+ case is_file(clean(SSLCertificateKeyFile)) of
+ {ok, File} ->
+ {ok, [], {ssl_certificate_key_file,File}};
+ {error, _} ->
+ {error, ?NICE(clean(SSLCertificateKeyFile)++
+ " is an invalid SSLCertificateKeyFile")}
+ end;
+load([$S,$S,$L,$V,$e,$r,$i,$f,$y,$C,$l,$i,$e,$n,$t,$ |SSLVerifyClient], []) ->
+ ?DEBUG("load -> SSLVerifyClient: ~p",[SSLVerifyClient]),
+ case make_integer(clean(SSLVerifyClient)) of
+ {ok, Integer} when Integer >=0,Integer =< 2 ->
+ {ok, [], {ssl_verify_client,Integer}};
+ {ok, Integer} ->
+ {error,?NICE(clean(SSLVerifyClient)++" is an invalid SSLVerifyClient")};
+ {error, nomatch} ->
+ {error,?NICE(clean(SSLVerifyClient)++" is an invalid SSLVerifyClient")}
+ end;
+load([$S,$S,$L,$V,$e,$r,$i,$f,$y,$D,$e,$p,$t,$h,$ |
+ SSLVerifyDepth], []) ->
+ ?DEBUG("load -> SSLVerifyDepth: ~p",[SSLVerifyDepth]),
+ case make_integer(clean(SSLVerifyDepth)) of
+ {ok, Integer} when Integer > 0 ->
+ {ok, [], {ssl_verify_client_depth,Integer}};
+ {ok, Integer} ->
+ {error,?NICE(clean(SSLVerifyDepth) ++
+ " is an invalid SSLVerifyDepth")};
+ {error, nomatch} ->
+ {error,?NICE(clean(SSLVerifyDepth) ++
+ " is an invalid SSLVerifyDepth")}
+ end;
+load([$S,$S,$L,$C,$i,$p,$h,$e,$r,$s,$ | SSLCiphers], []) ->
+ ?DEBUG("load -> SSLCiphers: ~p",[SSLCiphers]),
+ {ok, [], {ssl_ciphers, clean(SSLCiphers)}};
+load([$S,$S,$L,$C,$A,$C,$e,$r,$t,$i,$f,$i,$c,$a,$t,$e,$F,$i,$l,$e,$ |
+ SSLCACertificateFile], []) ->
+ case is_file(clean(SSLCACertificateFile)) of
+ {ok, File} ->
+ {ok, [], {ssl_ca_certificate_file,File}};
+ {error, _} ->
+ {error, ?NICE(clean(SSLCACertificateFile)++
+ " is an invalid SSLCACertificateFile")}
+ end;
+load([$S,$S,$L,$P,$a,$s,$s,$w,$o,$r,$d,$C,$a,$l,$l,$b,$a,$c,$k,$M,$o,$d,$u,$l,$e,$ | SSLPasswordCallbackModule], []) ->
+ ?DEBUG("load -> SSLPasswordCallbackModule: ~p",
+ [SSLPasswordCallbackModule]),
+ {ok, [], {ssl_password_callback_module,
+ list_to_atom(clean(SSLPasswordCallbackModule))}};
+load([$S,$S,$L,$P,$a,$s,$s,$w,$o,$r,$d,$C,$a,$l,$l,$b,$a,$c,$k,$F,$u,$n,$c,$t,$i,$o,$n,$ | SSLPasswordCallbackFunction], []) ->
+ ?DEBUG("load -> SSLPasswordCallbackFunction: ~p",
+ [SSLPasswordCallbackFunction]),
+ {ok, [], {ssl_password_callback_function,
+ list_to_atom(clean(SSLPasswordCallbackFunction))}}.
+
+
+%%
+%% load_mime_types/1 -> {ok, MimeTypes} | {error, Reason}
+%%
+load_mime_types(MimeTypesFile) ->
+ case file:open(MimeTypesFile, [read]) of
+ {ok, Stream} ->
+ parse_mime_types(Stream, []);
+ {error, _} ->
+ {error, ?NICE("Can't open " ++ MimeTypesFile)}
+ end.
+
+parse_mime_types(Stream,MimeTypesList) ->
+ Line=
+ case io:get_line(Stream,'') of
+ eof ->
+ eof;
+ String ->
+ clean(String)
+ end,
+ parse_mime_types(Stream, MimeTypesList, Line).
+
+parse_mime_types(Stream, MimeTypesList, eof) ->
+ file:close(Stream),
+ {ok, MimeTypesList};
+parse_mime_types(Stream, MimeTypesList, "") ->
+ parse_mime_types(Stream, MimeTypesList);
+parse_mime_types(Stream, MimeTypesList, [$#|_]) ->
+ parse_mime_types(Stream, MimeTypesList);
+parse_mime_types(Stream, MimeTypesList, Line) ->
+ case regexp:split(Line, " ") of
+ {ok, [NewMimeType|Suffixes]} ->
+ parse_mime_types(Stream,lists:append(suffixes(NewMimeType,Suffixes),
+ MimeTypesList));
+ {ok, _} ->
+ {error, ?NICE(Line)}
+ end.
+
+suffixes(MimeType,[]) ->
+ [];
+suffixes(MimeType,[Suffix|Rest]) ->
+ [{Suffix,MimeType}|suffixes(MimeType,Rest)].
+
+%%
+%% Phase 2: Store
+%%
+
+%% store
+
+store(ConfigList) ->
+ Modules = httpd_util:key1search(ConfigList, modules, []),
+ Port = httpd_util:key1search(ConfigList, port),
+ Addr = httpd_util:key1search(ConfigList,bind_address),
+ Name = httpd_util:make_name("httpd_conf",Addr,Port),
+ ?CDEBUG("store -> Name = ~p",[Name]),
+ ConfigDB = ets:new(Name, [named_table, bag, protected]),
+ ?CDEBUG("store -> ConfigDB = ~p",[ConfigDB]),
+ store(ConfigDB, ConfigList, lists:append(Modules,[?MODULE]),ConfigList).
+
+store(ConfigDB, ConfigList, Modules,[]) ->
+ ?vtrace("store -> done",[]),
+ ?CDEBUG("store -> done",[]),
+ {ok, ConfigDB};
+store(ConfigDB, ConfigList, Modules, [ConfigListEntry|Rest]) ->
+ ?vtrace("store -> entry with"
+ "~n ConfigListEntry: ~p",[ConfigListEntry]),
+ ?CDEBUG("store -> "
+ "~n ConfigListEntry: ~p",[ConfigListEntry]),
+ case store_traverse(ConfigListEntry,ConfigList,Modules) of
+ {ok, ConfigDBEntry} when tuple(ConfigDBEntry) ->
+ ?vtrace("store -> ConfigDBEntry(tuple): "
+ "~n ~p",[ConfigDBEntry]),
+ ?CDEBUG("store -> ConfigDBEntry(tuple): "
+ "~n ~p",[ConfigDBEntry]),
+ ets:insert(ConfigDB,ConfigDBEntry),
+ store(ConfigDB,ConfigList,Modules,Rest);
+ {ok, ConfigDBEntry} when list(ConfigDBEntry) ->
+ ?vtrace("store -> ConfigDBEntry(list): "
+ "~n ~p",[ConfigDBEntry]),
+ ?CDEBUG("store -> ConfigDBEntry(list): "
+ "~n ~p",[ConfigDBEntry]),
+ lists:foreach(fun(Entry) ->
+ ets:insert(ConfigDB,Entry)
+ end,ConfigDBEntry),
+ store(ConfigDB,ConfigList,Modules,Rest);
+ {error, Reason} ->
+ ?vlog("store -> error: ~p",[Reason]),
+ ?ERROR("store -> error: ~p",[Reason]),
+ {error,Reason}
+ end.
+
+store_traverse(ConfigListEntry,ConfigList,[]) ->
+ {error,?NICE("Unable to store configuration...")};
+store_traverse(ConfigListEntry, ConfigList, [Module|Rest]) ->
+ case is_exported(Module, {store, 2}) of
+ true ->
+ ?CDEBUG("store_traverse -> call ~p:store/2",[Module]),
+ case catch apply(Module,store,[ConfigListEntry, ConfigList]) of
+ {'EXIT',{function_clause,_}} ->
+ ?CDEBUG("store_traverse -> exit: function_clause",[]),
+ store_traverse(ConfigListEntry,ConfigList,Rest);
+ {'EXIT',Reason} ->
+ ?ERROR("store_traverse -> exit: ~p",[Reason]),
+ error_logger:error_report({'EXIT',Reason}),
+ store_traverse(ConfigListEntry,ConfigList,Rest);
+ Result ->
+ ?CDEBUG("store_traverse -> ~n"
+ " Result: ~p",[Result]),
+ Result
+ end;
+ false ->
+ store_traverse(ConfigListEntry,ConfigList,Rest)
+ end.
+
+store({mime_types,MimeTypesList},ConfigList) ->
+ Port = httpd_util:key1search(ConfigList, port),
+ Addr = httpd_util:key1search(ConfigList, bind_address),
+ Name = httpd_util:make_name("httpd_mime",Addr,Port),
+ ?CDEBUG("store(mime_types) -> Name: ~p",[Name]),
+ {ok, MimeTypesDB} = store_mime_types(Name,MimeTypesList),
+ ?CDEBUG("store(mime_types) -> ~n"
+ " MimeTypesDB: ~p~n"
+ " MimeTypesDB info: ~p",
+ [MimeTypesDB,ets:info(MimeTypesDB)]),
+ {ok, {mime_types,MimeTypesDB}};
+store(ConfigListEntry,ConfigList) ->
+ ?CDEBUG("store/2 -> ~n"
+ " ConfigListEntry: ~p~n"
+ " ConfigList: ~p",
+ [ConfigListEntry,ConfigList]),
+ {ok, ConfigListEntry}.
+
+
+%% store_mime_types
+store_mime_types(Name,MimeTypesList) ->
+ ?CDEBUG("store_mime_types -> Name: ~p",[Name]),
+ MimeTypesDB = ets:new(Name, [set, protected]),
+ ?CDEBUG("store_mime_types -> MimeTypesDB: ~p",[MimeTypesDB]),
+ store_mime_types1(MimeTypesDB, MimeTypesList).
+
+store_mime_types1(MimeTypesDB,[]) ->
+ {ok, MimeTypesDB};
+store_mime_types1(MimeTypesDB,[Type|Rest]) ->
+ ?CDEBUG("store_mime_types1 -> Type: ~p",[Type]),
+ ets:insert(MimeTypesDB, Type),
+ store_mime_types1(MimeTypesDB, Rest).
+
+
+%%
+%% Phase 3: Remove
+%%
+
+remove_all(ConfigDB) ->
+ Modules = httpd_util:lookup(ConfigDB,modules,[]),
+ remove_traverse(ConfigDB, lists:append(Modules,[?MODULE])).
+
+remove_traverse(ConfigDB,[]) ->
+ ?vtrace("remove_traverse -> done", []),
+ ok;
+remove_traverse(ConfigDB,[Module|Rest]) ->
+ ?vtrace("remove_traverse -> call ~p:remove", [Module]),
+ case (catch apply(Module,remove,[ConfigDB])) of
+ {'EXIT',{undef,_}} ->
+ ?vtrace("remove_traverse -> undef", []),
+ remove_traverse(ConfigDB,Rest);
+ {'EXIT',{function_clause,_}} ->
+ ?vtrace("remove_traverse -> function_clause", []),
+ remove_traverse(ConfigDB,Rest);
+ {'EXIT',Reason} ->
+ ?vtrace("remove_traverse -> exit: ~p", [Reason]),
+ error_logger:error_report({'EXIT',Reason}),
+ remove_traverse(ConfigDB,Rest);
+ {error,Reason} ->
+ ?vtrace("remove_traverse -> error: ~p", [Reason]),
+ error_logger:error_report(Reason),
+ remove_traverse(ConfigDB,Rest);
+ _ ->
+ remove_traverse(ConfigDB,Rest)
+ end.
+
+remove(ConfigDB) ->
+ ets:delete(ConfigDB),
+ ok.
+
+
+%%
+%% Utility functions
+%%
+
+%% is_directory
+
+is_directory(Directory) ->
+ case file:read_file_info(Directory) of
+ {ok,FileInfo} ->
+ #file_info{type = Type, access = Access} = FileInfo,
+ is_directory(Type,Access,FileInfo,Directory);
+ {error,Reason} ->
+ {error,Reason}
+ end.
+
+is_directory(directory,read,_FileInfo,Directory) ->
+ {ok,Directory};
+is_directory(directory,read_write,_FileInfo,Directory) ->
+ {ok,Directory};
+is_directory(_Type,_Access,FileInfo,_Directory) ->
+ {error,FileInfo}.
+
+
+%% is_file
+
+is_file(File) ->
+ case file:read_file_info(File) of
+ {ok,FileInfo} ->
+ #file_info{type = Type, access = Access} = FileInfo,
+ is_file(Type,Access,FileInfo,File);
+ {error,Reason} ->
+ {error,Reason}
+ end.
+
+is_file(regular,read,_FileInfo,File) ->
+ {ok,File};
+is_file(regular,read_write,_FileInfo,File) ->
+ {ok,File};
+is_file(_Type,_Access,FileInfo,_File) ->
+ {error,FileInfo}.
+
+%% make_integer
+
+make_integer(String) ->
+ case regexp:match(clean(String),"[0-9]+") of
+ {match, _, _} ->
+ {ok, list_to_integer(clean(String))};
+ nomatch ->
+ {error, nomatch}
+ end.
+
+
+%% clean
+
+clean(String) ->
+ {ok,CleanedString,_} = regexp:gsub(String, "^[ \t\n\r\f]*|[ \t\n\r\f]*\$",""),
+ CleanedString.
+
+%% custom_clean
+
+custom_clean(String,MoreBefore,MoreAfter) ->
+ {ok,CleanedString,_}=regexp:gsub(String,"^[ \t\n\r\f"++MoreBefore++
+ "]*|[ \t\n\r\f"++MoreAfter++"]*\$",""),
+ CleanedString.
+
+%% check_enum
+
+check_enum(Enum,[]) ->
+ {error, not_valid};
+check_enum(Enum,[Enum|Rest]) ->
+ {ok, list_to_atom(Enum)};
+check_enum(Enum, [NotValid|Rest]) ->
+ check_enum(Enum, Rest).
+
+%% a_must
+
+a_must(ConfigList,[]) ->
+ ok;
+a_must(ConfigList,[Directive|Rest]) ->
+ case httpd_util:key1search(ConfigList,Directive) of
+ undefined ->
+ {missing,Directive};
+ _ ->
+ a_must(ConfigList,Rest)
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_example.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_example.erl
new file mode 100644
index 0000000000..4aec440db3
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_example.erl
@@ -0,0 +1,134 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: httpd_example.erl,v 1.1 2008/12/17 09:53:34 mikpe Exp $
+%%
+-module(httpd_example).
+-export([print/1]).
+-export([get/2, post/2, yahoo/2, test1/2]).
+
+-export([newformat/3]).
+%% These are used by the inets test-suite
+-export([delay/1]).
+
+
+print(String) ->
+ [header(),
+ top("Print"),
+ String++"\n",
+ footer()].
+
+
+test1(Env, []) ->
+ io:format("Env:~p~n",[Env]),
+ ["<html>",
+ "<head>",
+ "<title>Test1</title>",
+ "</head>",
+ "<body>",
+ "<h1>Erlang Body</h1>",
+ "<h2>Stuff</h2>",
+ "</body>",
+ "</html>"].
+
+
+get(Env,[]) ->
+ [header(),
+ top("GET Example"),
+ "<FORM ACTION=\"/cgi-bin/erl/httpd_example:get\" METHOD=GET>
+<B>Input:</B> <INPUT TYPE=\"text\" NAME=\"input1\">
+<INPUT TYPE=\"text\" NAME=\"input2\">
+<INPUT TYPE=\"submit\"><BR>
+</FORM>" ++ "\n",
+ footer()];
+
+get(Env,Input) ->
+ default(Env,Input).
+
+post(Env,[]) ->
+ [header(),
+ top("POST Example"),
+ "<FORM ACTION=\"/cgi-bin/erl/httpd_example:post\" METHOD=POST>
+<B>Input:</B> <INPUT TYPE=\"text\" NAME=\"input1\">
+<INPUT TYPE=\"text\" NAME=\"input2\">
+<INPUT TYPE=\"submit\"><BR>
+</FORM>" ++ "\n",
+ footer()];
+
+post(Env,Input) ->
+ default(Env,Input).
+
+yahoo(Env,Input) ->
+ "Location: http://www.yahoo.com\r\n\r\n".
+
+default(Env,Input) ->
+ [header(),
+ top("Default Example"),
+ "<B>Environment:</B> ",io_lib:format("~p",[Env]),"<BR>\n",
+ "<B>Input:</B> ",Input,"<BR>\n",
+ "<B>Parsed Input:</B> ",
+ io_lib:format("~p",[httpd:parse_query(Input)]),"\n",
+ footer()].
+
+header() ->
+ header("text/html").
+header(MimeType) ->
+ "Content-type: " ++ MimeType ++ "\r\n\r\n".
+
+top(Title) ->
+ "<HTML>
+<HEAD>
+<TITLE>" ++ Title ++ "</TITLE>
+</HEAD>
+<BODY>\n".
+
+footer() ->
+ "</BODY>
+</HTML>\n".
+
+
+newformat(SessionID,Env,Input)->
+ mod_esi:deliver(SessionID,"Content-Type:text/html\r\n\r\n"),
+ mod_esi:deliver(SessionID,top("new esi format test")),
+ mod_esi:deliver(SessionID,"This new format is nice<BR>"),
+ mod_esi:deliver(SessionID,"This new format is nice<BR>"),
+ mod_esi:deliver(SessionID,"This new format is nice<BR>"),
+ mod_esi:deliver(SessionID,footer()).
+
+%% ------------------------------------------------------
+
+delay(Time) when integer(Time) ->
+ i("httpd_example:delay(~p) -> do the delay",[Time]),
+ sleep(Time),
+ i("httpd_example:delay(~p) -> done, now reply",[Time]),
+ delay_reply("delay ok");
+delay(Time) when list(Time) ->
+ delay(httpd_conf:make_integer(Time));
+delay({ok,Time}) when integer(Time) ->
+ delay(Time);
+delay({error,_Reason}) ->
+ i("delay -> called with invalid time"),
+ delay_reply("delay failed: invalid delay time").
+
+delay_reply(Reply) ->
+ [header(),
+ top("delay"),
+ Reply,
+ footer()].
+
+i(F) -> i(F,[]).
+i(F,A) -> io:format(F ++ "~n",A).
+
+sleep(T) -> receive after T -> ok end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_manager.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_manager.erl
new file mode 100644
index 0000000000..704cb1f319
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_manager.erl
@@ -0,0 +1,1029 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: httpd_manager.erl,v 1.1 2008/12/17 09:53:34 mikpe Exp $
+%%
+
+-module(httpd_manager).
+
+-include("httpd.hrl").
+-include("httpd_verbosity.hrl").
+
+-behaviour(gen_server).
+
+%% External API
+-export([start/2, start/3, start_link/2, start_link/3, stop/1, restart/1]).
+
+%% Internal API
+-export([new_connection/1, done_connection/1]).
+
+%% Module API
+-export([config_lookup/2, config_lookup/3,
+ config_multi_lookup/2, config_multi_lookup/3,
+ config_match/2, config_match/3]).
+
+%% gen_server exports
+-export([init/1,
+ handle_call/3, handle_cast/2, handle_info/2,
+ terminate/2,
+ code_change/3]).
+
+
+%% Management exports
+-export([block/2, block/3, unblock/1]).
+-export([get_admin_state/1, get_usage_state/1]).
+-export([is_busy/1,is_busy/2,is_busy_or_blocked/1,is_blocked/1]). %% ???????
+-export([get_status/1, get_status/2]).
+-export([verbosity/2, verbosity/3]).
+
+
+-export([c/1]).
+
+-record(state,{socket_type = ip_comm,
+ config_file,
+ config_db = null,
+ connections, %% Current request handlers
+ admin_state = unblocked,
+ blocker_ref = undefined,
+ blocking_tmr = undefined,
+ status = []}).
+
+
+c(Port) ->
+ Ref = httpd_util:make_name("httpd",undefined,Port),
+ gen_server:call(Ref, fake_close).
+
+
+%%
+%% External API
+%%
+
+start(ConfigFile, ConfigList) ->
+ start(ConfigFile, ConfigList, []).
+
+start(ConfigFile, ConfigList, Verbosity) ->
+ Port = httpd_util:key1search(ConfigList,port,80),
+ Addr = httpd_util:key1search(ConfigList,bind_address),
+ Name = make_name(Addr,Port),
+ ?LOG("start -> Name = ~p",[Name]),
+ gen_server:start({local,Name},?MODULE,
+ [ConfigFile, ConfigList, Addr, Port, Verbosity],[]).
+
+start_link(ConfigFile, ConfigList) ->
+ start_link(ConfigFile, ConfigList, []).
+
+start_link(ConfigFile, ConfigList, Verbosity) ->
+ Port = httpd_util:key1search(ConfigList,port,80),
+ Addr = httpd_util:key1search(ConfigList,bind_address),
+ Name = make_name(Addr,Port),
+ ?LOG("start_link -> Name = ~p",[Name]),
+ gen_server:start_link({local, Name},?MODULE,
+ [ConfigFile, ConfigList, Addr, Port, Verbosity],[]).
+
+%% stop
+
+stop(ServerRef) ->
+ gen_server:call(ServerRef, stop).
+
+%% restart
+
+restart(ServerRef) ->
+ gen_server:call(ServerRef, restart).
+
+
+%%%----------------------------------------------------------------
+
+block(ServerRef, disturbing) ->
+ call(ServerRef,block);
+
+block(ServerRef, non_disturbing) ->
+ do_block(ServerRef, non_disturbing, infinity).
+
+block(ServerRef, Method, Timeout) ->
+ do_block(ServerRef, Method, Timeout).
+
+
+%% The reason for not using call here, is that the manager cannot
+%% _wait_ for completion of the requests. It must be able to do
+%% do other things at the same time as the blocking goes on.
+do_block(ServerRef, Method, infinity) ->
+ Ref = make_ref(),
+ cast(ServerRef, {block, Method, infinity, self(), Ref}),
+ receive
+ {block_reply, Reply, Ref} ->
+ Reply
+ end;
+do_block(ServerRef,Method,Timeout) when Timeout > 0 ->
+ Ref = make_ref(),
+ cast(ServerRef,{block,Method,Timeout,self(),Ref}),
+ receive
+ {block_reply,Reply,Ref} ->
+ Reply
+ end.
+
+
+%%%----------------------------------------------------------------
+
+%% unblock
+
+unblock(ServerRef) ->
+ call(ServerRef,unblock).
+
+%% get admin/usage state
+
+get_admin_state(ServerRef) ->
+ call(ServerRef,get_admin_state).
+
+get_usage_state(ServerRef) ->
+ call(ServerRef,get_usage_state).
+
+
+%% get_status
+
+get_status(ServerRef) ->
+ gen_server:call(ServerRef,get_status).
+
+get_status(ServerRef,Timeout) ->
+ gen_server:call(ServerRef,get_status,Timeout).
+
+
+verbosity(ServerRef,Verbosity) ->
+ verbosity(ServerRef,all,Verbosity).
+
+verbosity(ServerRef,all,Verbosity) ->
+ gen_server:call(ServerRef,{verbosity,all,Verbosity});
+verbosity(ServerRef,manager,Verbosity) ->
+ gen_server:call(ServerRef,{verbosity,manager,Verbosity});
+verbosity(ServerRef,request,Verbosity) ->
+ gen_server:call(ServerRef,{verbosity,request,Verbosity});
+verbosity(ServerRef,acceptor,Verbosity) ->
+ gen_server:call(ServerRef,{verbosity,acceptor,Verbosity});
+verbosity(ServerRef,security,Verbosity) ->
+ gen_server:call(ServerRef,{verbosity,security,Verbosity});
+verbosity(ServerRef,auth,Verbosity) ->
+ gen_server:call(ServerRef,{verbosity,auth,Verbosity}).
+
+%%
+%% Internal API
+%%
+
+
+%% new_connection
+
+new_connection(Manager) ->
+ gen_server:call(Manager, {new_connection, self()}).
+
+%% done
+
+done_connection(Manager) ->
+ gen_server:cast(Manager, {done_connection, self()}).
+
+
+%% is_busy(ServerRef) -> true | false
+%%
+%% Tests if the server is (in usage state) busy,
+%% i.e. has rached the heavy load limit.
+%%
+
+is_busy(ServerRef) ->
+ gen_server:call(ServerRef,is_busy).
+
+is_busy(ServerRef,Timeout) ->
+ gen_server:call(ServerRef,is_busy,Timeout).
+
+
+%% is_busy_or_blocked(ServerRef) -> busy | blocked | false
+%%
+%% Tests if the server is busy (usage state), i.e. has rached,
+%% the heavy load limit, or blocked (admin state) .
+%%
+
+is_busy_or_blocked(ServerRef) ->
+ gen_server:call(ServerRef,is_busy_or_blocked).
+
+
+%% is_blocked(ServerRef) -> true | false
+%%
+%% Tests if the server is blocked (admin state) .
+%%
+
+is_blocked(ServerRef) ->
+ gen_server:call(ServerRef,is_blocked).
+
+
+%%
+%% Module API. Theese functions are intended for use from modules only.
+%%
+
+config_lookup(Port, Query) ->
+ config_lookup(undefined, Port, Query).
+config_lookup(Addr, Port, Query) ->
+ Name = httpd_util:make_name("httpd",Addr,Port),
+ gen_server:call(whereis(Name), {config_lookup, Query}).
+
+config_multi_lookup(Port, Query) ->
+ config_multi_lookup(undefined,Port,Query).
+config_multi_lookup(Addr,Port, Query) ->
+ Name = httpd_util:make_name("httpd",Addr,Port),
+ gen_server:call(whereis(Name), {config_multi_lookup, Query}).
+
+config_match(Port, Pattern) ->
+ config_match(undefined,Port,Pattern).
+config_match(Addr, Port, Pattern) ->
+ Name = httpd_util:make_name("httpd",Addr,Port),
+ gen_server:call(whereis(Name), {config_match, Pattern}).
+
+
+%%
+%% Server call-back functions
+%%
+
+%% init
+
+init([ConfigFile, ConfigList, Addr, Port, Verbosity]) ->
+ process_flag(trap_exit, true),
+ case (catch do_init(ConfigFile, ConfigList, Addr, Port, Verbosity)) of
+ {error, Reason} ->
+ ?vlog("failed starting server: ~p", [Reason]),
+ {stop, Reason};
+ {ok, State} ->
+ {ok, State}
+ end.
+
+
+do_init(ConfigFile, ConfigList, Addr, Port, Verbosity) ->
+ put(sname,man),
+ set_verbosity(Verbosity),
+ ?vlog("starting",[]),
+ ConfigDB = do_initial_store(ConfigList),
+ ?vtrace("config db: ~p", [ConfigDB]),
+ SocketType = httpd_socket:config(ConfigDB),
+ ?vtrace("socket type: ~p, now start acceptor", [SocketType]),
+ case httpd_acceptor_sup:start_acceptor(SocketType, Addr, Port, ConfigDB) of
+ {ok, Pid} ->
+ ?vtrace("acceptor started: ~p", [Pid]),
+ Status = [{max_conn,0}, {last_heavy_load,never},
+ {last_connection,never}],
+ State = #state{socket_type = SocketType,
+ config_file = ConfigFile,
+ config_db = ConfigDB,
+ connections = [],
+ status = Status},
+ ?vdebug("started",[]),
+ {ok, State};
+ Else ->
+ Else
+ end.
+
+
+do_initial_store(ConfigList) ->
+ case httpd_conf:store(ConfigList) of
+ {ok, ConfigDB} ->
+ ConfigDB;
+ {error, Reason} ->
+ ?vinfo("failed storing configuration: ~p",[Reason]),
+ throw({error, Reason})
+ end.
+
+
+
+%% handle_call
+
+handle_call(stop, _From, State) ->
+ ?vlog("stop",[]),
+ {stop, normal, ok, State};
+
+handle_call({config_lookup, Query}, _From, State) ->
+ ?vlog("config lookup: Query = ~p",[Query]),
+ Res = httpd_util:lookup(State#state.config_db, Query),
+ ?vdebug("config lookup result: ~p",[Res]),
+ {reply, Res, State};
+
+handle_call({config_multi_lookup, Query}, _From, State) ->
+ ?vlog("multi config lookup: Query = ~p",[Query]),
+ Res = httpd_util:multi_lookup(State#state.config_db, Query),
+ ?vdebug("multi config lookup result: ~p",[Res]),
+ {reply, Res, State};
+
+handle_call({config_match, Query}, _From, State) ->
+ ?vlog("config match: Query = ~p",[Query]),
+ Res = ets:match_object(State#state.config_db, Query),
+ ?vdebug("config match result: ~p",[Res]),
+ {reply, Res, State};
+
+handle_call(get_status, _From, State) ->
+ ?vdebug("get status",[]),
+ ManagerStatus = manager_status(self()),
+ %% AuthStatus = auth_status(get(auth_server)),
+ %% SecStatus = sec_status(get(sec_server)),
+ %% AccStatus = sec_status(get(acceptor_server)),
+ S1 = [{current_conn,length(State#state.connections)}|State#state.status]++
+ [ManagerStatus],
+ ?vtrace("status = ~p",[S1]),
+ {reply,S1,State};
+
+handle_call(is_busy, From, State) ->
+ Reply = case get_ustate(State) of
+ busy ->
+ true;
+ _ ->
+ false
+ end,
+ ?vlog("is busy: ~p",[Reply]),
+ {reply,Reply,State};
+
+handle_call(is_busy_or_blocked, From, State) ->
+ Reply =
+ case get_astate(State) of
+ unblocked ->
+ case get_ustate(State) of
+ busy ->
+ busy;
+ _ ->
+ false
+ end;
+ _ ->
+ blocked
+ end,
+ ?vlog("is busy or blocked: ~p",[Reply]),
+ {reply,Reply,State};
+
+handle_call(is_blocked, From, State) ->
+ Reply =
+ case get_astate(State) of
+ unblocked ->
+ false;
+ _ ->
+ true
+ end,
+ ?vlog("is blocked: ~p",[Reply]),
+ {reply,Reply,State};
+
+handle_call(get_admin_state, From, State) ->
+ Reply = get_astate(State),
+ ?vlog("admin state: ~p",[Reply]),
+ {reply,Reply,State};
+
+handle_call(get_usage_state, From, State) ->
+ Reply = get_ustate(State),
+ ?vlog("usage state: ~p",[Reply]),
+ {reply,Reply,State};
+
+handle_call({verbosity,Who,Verbosity}, From, State) ->
+ V = ?vvalidate(Verbosity),
+ ?vlog("~n Set new verbosity to ~p for ~p",[V,Who]),
+ Reply = set_verbosity(Who,V,State),
+ {reply,Reply,State};
+
+handle_call(restart, From, State) when State#state.admin_state == blocked ->
+ ?vlog("restart",[]),
+ case handle_restart(State) of
+ {stop, Reply,S1} ->
+ {stop, Reply, S1};
+ {_, Reply, S1} ->
+ {reply,Reply,S1}
+ end;
+
+handle_call(restart, From, State) ->
+ ?vlog("restart(~p)",[State#state.admin_state]),
+ {reply,{error,{invalid_admin_state,State#state.admin_state}},State};
+
+handle_call(block, From, State) ->
+ ?vlog("block(disturbing)",[]),
+ {Reply,S1} = handle_block(State),
+ {reply,Reply,S1};
+
+handle_call(unblock, {From,_Tag}, State) ->
+ ?vlog("unblock",[]),
+ {Reply,S1} = handle_unblock(State,From),
+ {reply, Reply, S1};
+
+handle_call({new_connection, Pid}, From, State) ->
+ ?vlog("~n New connection (~p) when connection count = ~p",
+ [Pid,length(State#state.connections)]),
+ {S, S1} = handle_new_connection(State, Pid),
+ Reply = {S, get(request_handler_verbosity)},
+ {reply, Reply, S1};
+
+handle_call(Request, From, State) ->
+ ?vinfo("~n unknown request '~p' from ~p", [Request,From]),
+ String =
+ lists:flatten(
+ io_lib:format("Unknown request "
+ "~n ~p"
+ "~nto manager (~p)"
+ "~nfrom ~p",
+ [Request, self(), From])),
+ report_error(State,String),
+ {reply, ok, State}.
+
+
+%% handle_cast
+
+handle_cast({done_connection, Pid}, State) ->
+ ?vlog("~n Done connection (~p)", [Pid]),
+ S1 = handle_done_connection(State, Pid),
+ {noreply, S1};
+
+handle_cast({block, disturbing, Timeout, From, Ref}, State) ->
+ ?vlog("block(disturbing,~p)",[Timeout]),
+ S1 = handle_block(State, Timeout, From, Ref),
+ {noreply,S1};
+
+handle_cast({block, non_disturbing, Timeout, From, Ref}, State) ->
+ ?vlog("block(non-disturbing,~p)",[Timeout]),
+ S1 = handle_nd_block(State, Timeout, From, Ref),
+ {noreply,S1};
+
+handle_cast(Message, State) ->
+ ?vinfo("~n received unknown message '~p'",[Message]),
+ String =
+ lists:flatten(
+ io_lib:format("Unknown message "
+ "~n ~p"
+ "~nto manager (~p)",
+ [Message, self()])),
+ report_error(State, String),
+ {noreply, State}.
+
+%% handle_info
+
+handle_info({block_timeout, Method}, State) ->
+ ?vlog("received block_timeout event",[]),
+ S1 = handle_block_timeout(State,Method),
+ {noreply, S1};
+
+handle_info({'DOWN', Ref, process, _Object, Info}, State) ->
+ ?vlog("~n down message for ~p",[Ref]),
+ S1 =
+ case State#state.blocker_ref of
+ Ref ->
+ handle_blocker_exit(State);
+ _ ->
+ %% Not our blocker, so ignore
+ State
+ end,
+ {noreply, S1};
+
+handle_info({'EXIT', Pid, normal}, State) ->
+ ?vdebug("~n Normal exit message from ~p", [Pid]),
+ {noreply, State};
+
+handle_info({'EXIT', Pid, blocked}, S) ->
+ ?vdebug("blocked exit signal from request handler (~p)", [Pid]),
+ {noreply, S};
+
+handle_info({'EXIT', Pid, Reason}, State) ->
+ ?vlog("~n Exit message from ~p for reason ~p",[Pid, Reason]),
+ S1 = check_connections(State, Pid, Reason),
+ {noreply, S1};
+
+handle_info(Info, State) ->
+ ?vinfo("~n received unknown info '~p'",[Info]),
+ String =
+ lists:flatten(
+ io_lib:format("Unknown info "
+ "~n ~p"
+ "~nto manager (~p)",
+ [Info, self()])),
+ report_error(State, String),
+ {noreply, State}.
+
+
+%% terminate
+
+terminate(R, #state{config_db = Db}) ->
+ ?vlog("Terminating for reason: ~n ~p", [R]),
+ httpd_conf:remove_all(Db),
+ ok.
+
+
+%% code_change({down,ToVsn}, State, Extra)
+%%
+%% NOTE:
+%% Actually upgrade from 2.5.1 to 2.5.3 and downgrade from
+%% 2.5.3 to 2.5.1 is done with an application restart, so
+%% these function is actually never used. The reason for keeping
+%% this stuff is only for future use.
+%%
+code_change({down,ToVsn},State,Extra) ->
+ {ok,State};
+
+%% code_change(FromVsn, State, Extra)
+%%
+code_change(FromVsn,State,Extra) ->
+ {ok,State}.
+
+
+
+%% -------------------------------------------------------------------------
+%% check_connection
+%%
+%%
+%%
+%%
+
+check_connections(#state{connections = []} = State, _Pid, _Reason) ->
+ State;
+check_connections(#state{admin_state = shutting_down,
+ connections = Connections} = State, Pid, Reason) ->
+ %% Could be a crashing request handler
+ case lists:delete(Pid, Connections) of
+ [] -> % Crashing request handler => block complete
+ String =
+ lists:flatten(
+ io_lib:format("request handler (~p) crashed:"
+ "~n ~p", [Pid, Reason])),
+ report_error(State, String),
+ ?vlog("block complete",[]),
+ demonitor_blocker(State#state.blocker_ref),
+ {Tmr,From,Ref} = State#state.blocking_tmr,
+ ?vlog("(possibly) stop block timer",[]),
+ stop_block_tmr(Tmr),
+ ?vlog("and send the reply",[]),
+ From ! {block_reply,ok,Ref},
+ State#state{admin_state = blocked, connections = [],
+ blocker_ref = undefined};
+ Connections1 ->
+ State#state{connections = Connections1}
+ end;
+check_connections(#state{connections = Connections} = State, Pid, Reason) ->
+ case lists:delete(Pid, Connections) of
+ Connections -> % Not a request handler, so ignore
+ State;
+ Connections1 ->
+ String =
+ lists:flatten(
+ io_lib:format("request handler (~p) crashed:"
+ "~n ~p", [Pid, Reason])),
+ report_error(State, String),
+ State#state{connections = lists:delete(Pid, Connections)}
+ end.
+
+
+%% -------------------------------------------------------------------------
+%% handle_[new | done]_connection
+%%
+%%
+%%
+%%
+
+handle_new_connection(State, Handler) ->
+ UsageState = get_ustate(State),
+ AdminState = get_astate(State),
+ handle_new_connection(UsageState, AdminState, State, Handler).
+
+handle_new_connection(busy, unblocked, State, Handler) ->
+ Status = update_heavy_load_status(State#state.status),
+ {{reject, busy},
+ State#state{status = Status}};
+
+handle_new_connection(_UsageState, unblocked, State, Handler) ->
+ Connections = State#state.connections,
+ Status = update_connection_status(State#state.status,
+ length(Connections)+1),
+ link(Handler),
+ {accept,
+ State#state{connections = [Handler|Connections], status = Status}};
+
+handle_new_connection(_UsageState, _AdminState, State, _Handler) ->
+ {{reject, blocked},
+ State}.
+
+
+handle_done_connection(#state{admin_state = shutting_down,
+ connections = Connections} = State, Handler) ->
+ unlink(Handler),
+ case lists:delete(Handler, Connections) of
+ [] -> % Ok, block complete
+ ?vlog("block complete",[]),
+ demonitor_blocker(State#state.blocker_ref),
+ {Tmr,From,Ref} = State#state.blocking_tmr,
+ ?vlog("(possibly) stop block timer",[]),
+ stop_block_tmr(Tmr),
+ ?vlog("and send the reply",[]),
+ From ! {block_reply,ok,Ref},
+ State#state{admin_state = blocked, connections = [],
+ blocker_ref = undefined};
+ Connections1 ->
+ State#state{connections = Connections1}
+ end;
+
+handle_done_connection(#state{connections = Connections} = State, Handler) ->
+ State#state{connections = lists:delete(Handler, Connections)}.
+
+
+%% -------------------------------------------------------------------------
+%% handle_block
+%%
+%%
+%%
+%%
+handle_block(#state{admin_state = AdminState} = S) ->
+ handle_block(S, AdminState).
+
+handle_block(S,unblocked) ->
+ %% Kill all connections
+ ?vtrace("handle_block(unblocked) -> kill all request handlers",[]),
+%% [exit(Pid,blocked) || Pid <- S#state.connections],
+ [kill_handler(Pid) || Pid <- S#state.connections],
+ {ok,S#state{connections = [], admin_state = blocked}};
+handle_block(S,blocked) ->
+ ?vtrace("handle_block(blocked) -> already blocked",[]),
+ {ok,S};
+handle_block(S,shutting_down) ->
+ ?vtrace("handle_block(shutting_down) -> ongoing...",[]),
+ {{error,shutting_down},S}.
+
+
+kill_handler(Pid) ->
+ ?vtrace("kill request handler: ~p",[Pid]),
+ exit(Pid, blocked).
+%% exit(Pid, kill).
+
+handle_block(S,Timeout,From,Ref) when Timeout >= 0 ->
+ do_block(S,Timeout,From,Ref);
+
+handle_block(S,Timeout,From,Ref) ->
+ Reply = {error,{invalid_block_request,Timeout}},
+ From ! {block_reply,Reply,Ref},
+ S.
+
+do_block(S,Timeout,From,Ref) ->
+ case S#state.connections of
+ [] ->
+ %% Already in idle usage state => go directly to blocked
+ ?vdebug("do_block -> already in idle usage state",[]),
+ From ! {block_reply,ok,Ref},
+ S#state{admin_state = blocked};
+ _ ->
+ %% Active or Busy usage state => go to shutting_down
+ ?vdebug("do_block -> active or busy usage state",[]),
+ %% Make sure we get to know if blocker dies...
+ ?vtrace("do_block -> create blocker monitor",[]),
+ MonitorRef = monitor_blocker(From),
+ ?vtrace("do_block -> (possibly) start block timer",[]),
+ Tmr = {start_block_tmr(Timeout,disturbing),From,Ref},
+ S#state{admin_state = shutting_down,
+ blocker_ref = MonitorRef, blocking_tmr = Tmr}
+ end.
+
+handle_nd_block(S,infinity,From,Ref) ->
+ do_nd_block(S,infinity,From,Ref);
+
+handle_nd_block(S,Timeout,From,Ref) when Timeout >= 0 ->
+ do_nd_block(S,Timeout,From,Ref);
+
+handle_nd_block(S,Timeout,From,Ref) ->
+ Reply = {error,{invalid_block_request,Timeout}},
+ From ! {block_reply,Reply,Ref},
+ S.
+
+do_nd_block(S,Timeout,From,Ref) ->
+ case S#state.connections of
+ [] ->
+ %% Already in idle usage state => go directly to blocked
+ ?vdebug("do_nd_block -> already in idle usage state",[]),
+ From ! {block_reply,ok,Ref},
+ S#state{admin_state = blocked};
+ _ ->
+ %% Active or Busy usage state => go to shutting_down
+ ?vdebug("do_nd_block -> active or busy usage state",[]),
+ %% Make sure we get to know if blocker dies...
+ ?vtrace("do_nd_block -> create blocker monitor",[]),
+ MonitorRef = monitor_blocker(From),
+ ?vtrace("do_nd_block -> (possibly) start block timer",[]),
+ Tmr = {start_block_tmr(Timeout,non_disturbing),From,Ref},
+ S#state{admin_state = shutting_down,
+ blocker_ref = MonitorRef, blocking_tmr = Tmr}
+ end.
+
+handle_block_timeout(S,Method) ->
+ %% Time to take this to the road...
+ demonitor_blocker(S#state.blocker_ref),
+ handle_block_timeout1(S,Method,S#state.blocking_tmr).
+
+handle_block_timeout1(S,non_disturbing,{_,From,Ref}) ->
+ ?vdebug("handle_block_timeout1(non-disturbing) -> send reply: timeout",[]),
+ From ! {block_reply,{error,timeout},Ref},
+ S#state{admin_state = unblocked,
+ blocker_ref = undefined, blocking_tmr = undefined};
+
+handle_block_timeout1(S,disturbing,{_,From,Ref}) ->
+ ?vdebug("handle_block_timeout1(disturbing) -> kill all connections",[]),
+ [exit(Pid,blocked) || Pid <- S#state.connections],
+
+ ?vdebug("handle_block_timeout1 -> send reply: ok",[]),
+ From ! {block_reply,ok,Ref},
+ S#state{admin_state = blocked, connections = [],
+ blocker_ref = undefined, blocking_tmr = undefined};
+
+handle_block_timeout1(S,Method,{_,From,Ref}) ->
+ ?vinfo("received block timeout with unknown block method:"
+ "~n Method: ~p",[Method]),
+ From ! {block_reply,{error,{unknown_block_method,Method}},Ref},
+ S#state{admin_state = blocked, connections = [],
+ blocker_ref = undefined, blocking_tmr = undefined};
+
+handle_block_timeout1(S,Method,TmrInfo) ->
+ ?vinfo("received block timeout with erroneous timer info:"
+ "~n Method: ~p"
+ "~n TmrInfo: ~p",[Method,TmrInfo]),
+ S#state{admin_state = unblocked,
+ blocker_ref = undefined, blocking_tmr = undefined}.
+
+handle_unblock(S,FromA) ->
+ handle_unblock(S,FromA,S#state.admin_state).
+
+handle_unblock(S,_FromA,unblocked) ->
+ {ok,S};
+handle_unblock(S,FromA,_AdminState) ->
+ ?vtrace("handle_unblock -> (possibly) stop block timer",[]),
+ stop_block_tmr(S#state.blocking_tmr),
+ case S#state.blocking_tmr of
+ {Tmr,FromB,Ref} ->
+ %% Another process is trying to unblock
+ %% Inform the blocker
+ FromB ! {block_reply, {error,{unblocked,FromA}},Ref};
+ _ ->
+ ok
+ end,
+ {ok,S#state{admin_state = unblocked, blocking_tmr = undefined}}.
+
+%% The blocker died so we give up on the block.
+handle_blocker_exit(S) ->
+ {Tmr,_From,_Ref} = S#state.blocking_tmr,
+ ?vtrace("handle_blocker_exit -> (possibly) stop block timer",[]),
+ stop_block_tmr(Tmr),
+ S#state{admin_state = unblocked,
+ blocker_ref = undefined, blocking_tmr = undefined}.
+
+
+
+%% -------------------------------------------------------------------------
+%% handle_restart
+%%
+%%
+%%
+%%
+handle_restart(#state{config_file = undefined} = State) ->
+ {continue, {error, undefined_config_file}, State};
+handle_restart(#state{config_db = Db, config_file = ConfigFile} = State) ->
+ ?vtrace("load new configuration",[]),
+ {ok, Config} = httpd_conf:load(ConfigFile),
+ ?vtrace("check for illegal changes (addr, port and socket-type)",[]),
+ case (catch check_constant_values(Db, Config)) of
+ ok ->
+ %% If something goes wrong between the remove
+ %% and the store where fu-ed
+ ?vtrace("remove old configuration, now hold you breath...",[]),
+ httpd_conf:remove_all(Db),
+ ?vtrace("store new configuration",[]),
+ case httpd_conf:store(Config) of
+ {ok, NewConfigDB} ->
+ ?vlog("restart done, puh!",[]),
+ {continue, ok, State#state{config_db = NewConfigDB}};
+ Error ->
+ ?vlog("failed store new config: ~n ~p",[Error]),
+ {stop, Error, State}
+ end;
+ Error ->
+ ?vlog("restart NOT performed due to:"
+ "~n ~p",[Error]),
+ {continue, Error, State}
+ end.
+
+
+check_constant_values(Db, Config) ->
+ %% Check port number
+ ?vtrace("check_constant_values -> check port number",[]),
+ Port = httpd_util:lookup(Db,port),
+ case httpd_util:key1search(Config,port) of %% MUST be equal
+ Port ->
+ ok;
+ OtherPort ->
+ throw({error,{port_number_changed,Port,OtherPort}})
+ end,
+
+ %% Check bind address
+ ?vtrace("check_constant_values -> check bind address",[]),
+ Addr = httpd_util:lookup(Db,bind_address),
+ case httpd_util:key1search(Config,bind_address) of %% MUST be equal
+ Addr ->
+ ok;
+ OtherAddr ->
+ throw({error,{addr_changed,Addr,OtherAddr}})
+ end,
+
+ %% Check socket type
+ ?vtrace("check_constant_values -> check socket type",[]),
+ SockType = httpd_util:lookup(Db, com_type),
+ case httpd_util:key1search(Config, com_type) of %% MUST be equal
+ SockType ->
+ ok;
+ OtherSockType ->
+ throw({error,{sock_type_changed,SockType,OtherSockType}})
+ end,
+ ?vtrace("check_constant_values -> done",[]),
+ ok.
+
+
+%% get_ustate(State) -> idle | active | busy
+%%
+%% Retrieve the usage state of the HTTP server:
+%% 0 active connection -> idle
+%% max_clients active connections -> busy
+%% Otherwise -> active
+%%
+get_ustate(State) ->
+ get_ustate(length(State#state.connections),State).
+
+get_ustate(0,_State) ->
+ idle;
+get_ustate(ConnectionCnt,State) ->
+ ConfigDB = State#state.config_db,
+ case httpd_util:lookup(ConfigDB, max_clients, 150) of
+ ConnectionCnt ->
+ busy;
+ _ ->
+ active
+ end.
+
+
+get_astate(S) -> S#state.admin_state.
+
+
+%% Timer handling functions
+start_block_tmr(infinity,_) ->
+ undefined;
+start_block_tmr(T,M) ->
+ erlang:send_after(T,self(),{block_timeout,M}).
+
+stop_block_tmr(undefined) ->
+ ok;
+stop_block_tmr(Ref) ->
+ erlang:cancel_timer(Ref).
+
+
+%% Monitor blocker functions
+monitor_blocker(Pid) when pid(Pid) ->
+ case (catch erlang:monitor(process,Pid)) of
+ MonitorRef ->
+ MonitorRef;
+ {'EXIT',Reason} ->
+ undefined
+ end;
+monitor_blocker(_) ->
+ undefined.
+
+demonitor_blocker(undefined) ->
+ ok;
+demonitor_blocker(Ref) ->
+ (catch erlang:demonitor(Ref)).
+
+
+%% Some status utility functions
+
+update_heavy_load_status(Status) ->
+ update_status_with_time(Status,last_heavy_load).
+
+update_connection_status(Status,ConnCount) ->
+ S1 = case lists:keysearch(max_conn,1,Status) of
+ {value,{max_conn,C1}} when ConnCount > C1 ->
+ lists:keyreplace(max_conn,1,Status,{max_conn,ConnCount});
+ {value,{max_conn,C2}} ->
+ Status;
+ false ->
+ [{max_conn,ConnCount}|Status]
+ end,
+ update_status_with_time(S1,last_connection).
+
+update_status_with_time(Status,Key) ->
+ lists:keyreplace(Key,1,Status,{Key,universal_time()}).
+
+universal_time() -> calendar:universal_time().
+
+
+auth_status(P) when pid(P) ->
+ Items = [status, message_queue_len, reductions,
+ heap_size, stack_size, current_function],
+ {auth_status, process_status(P,Items,[])};
+auth_status(_) ->
+ {auth_status, undefined}.
+
+sec_status(P) when pid(P) ->
+ Items = [status, message_queue_len, reductions,
+ heap_size, stack_size, current_function],
+ {security_status, process_status(P,Items,[])};
+sec_status(_) ->
+ {security_status, undefined}.
+
+acceptor_status(P) when pid(P) ->
+ Items = [status, message_queue_len, reductions,
+ heap_size, stack_size, current_function],
+ {acceptor_status, process_status(P,Items,[])};
+acceptor_status(_) ->
+ {acceptor_status, undefined}.
+
+
+manager_status(P) ->
+ Items = [status, message_queue_len, reductions,
+ heap_size, stack_size],
+ {manager_status, process_status(P,Items,[])}.
+
+
+process_status(P,[],L) ->
+ [{pid,P}|lists:reverse(L)];
+process_status(P,[H|T],L) ->
+ case (catch process_info(P,H)) of
+ {H, Value} ->
+ process_status(P,T,[{H,Value}|L]);
+ _ ->
+ process_status(P,T,[{H,undefined}|L])
+ end.
+
+make_name(Addr,Port) ->
+ httpd_util:make_name("httpd",Addr,Port).
+
+
+report_error(State,String) ->
+ Cdb = State#state.config_db,
+ error_logger:error_report(String),
+ mod_log:report_error(Cdb,String),
+ mod_disk_log:report_error(Cdb,String).
+
+
+set_verbosity(V) ->
+ Units = [manager_verbosity,
+ acceptor_verbosity, request_handler_verbosity,
+ security_verbosity, auth_verbosity],
+ case httpd_util:key1search(V, all) of
+ undefined ->
+ set_verbosity(V, Units);
+ Verbosity when atom(Verbosity) ->
+ V1 = [{Unit, Verbosity} || Unit <- Units],
+ set_verbosity(V1, Units)
+ end.
+
+set_verbosity(_V, []) ->
+ ok;
+set_verbosity(V, [manager_verbosity = Unit|Units]) ->
+ Verbosity = httpd_util:key1search(V, Unit, ?default_verbosity),
+ put(verbosity, ?vvalidate(Verbosity)),
+ set_verbosity(V, Units);
+set_verbosity(V, [Unit|Units]) ->
+ Verbosity = httpd_util:key1search(V, Unit, ?default_verbosity),
+ put(Unit, ?vvalidate(Verbosity)),
+ set_verbosity(V, Units).
+
+
+set_verbosity(manager,V,_S) ->
+ put(verbosity,V);
+set_verbosity(acceptor,V,_S) ->
+ put(acceptor_verbosity,V);
+set_verbosity(request,V,_S) ->
+ put(request_handler_verbosity,V);
+set_verbosity(security,V,S) ->
+ OldVerbosity = put(security_verbosity,V),
+ Addr = httpd_util:lookup(S#state.config_db, bind_address),
+ Port = httpd_util:lookup(S#state.config_db, port),
+ mod_security_server:verbosity(Addr,Port,V),
+ OldVerbosity;
+set_verbosity(auth,V,S) ->
+ OldVerbosity = put(auth_verbosity,V),
+ Addr = httpd_util:lookup(S#state.config_db, bind_address),
+ Port = httpd_util:lookup(S#state.config_db, port),
+ mod_auth_server:verbosity(Addr,Port,V),
+ OldVerbosity;
+
+set_verbosity(all,V,S) ->
+ OldMv = put(verbosity,V),
+ OldAv = put(acceptor_verbosity,V),
+ OldRv = put(request_handler_verbosity,V),
+ OldSv = put(security_verbosity,V),
+ OldAv = put(auth_verbosity,V),
+ Addr = httpd_util:lookup(S#state.config_db, bind_address),
+ Port = httpd_util:lookup(S#state.config_db, port),
+ mod_security_server:verbosity(Addr,Port,V),
+ mod_auth_server:verbosity(Addr,Port,V),
+ [{manager,OldMv}, {request,OldRv}, {security,OldSv}, {auth, OldAv}].
+
+
+%%
+call(ServerRef,Request) ->
+ gen_server:call(ServerRef,Request).
+
+cast(ServerRef,Message) ->
+ gen_server:cast(ServerRef,Message).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_misc_sup.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_misc_sup.erl
new file mode 100644
index 0000000000..e671f05206
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_misc_sup.erl
@@ -0,0 +1,113 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: httpd_misc_sup.erl,v 1.1 2008/12/17 09:53:34 mikpe Exp $
+%%
+%%----------------------------------------------------------------------
+%% Purpose: The top supervisor for the Megaco/H.248 application
+%%----------------------------------------------------------------------
+
+-module(httpd_misc_sup).
+
+-behaviour(supervisor).
+
+-include("httpd_verbosity.hrl").
+
+%% public
+-export([start/3, stop/1, init/1]).
+
+-export([start_auth_server/3, stop_auth_server/2,
+ start_sec_server/3, stop_sec_server/2]).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% supervisor callback functions
+
+
+start(Addr, Port, MiscSupVerbosity) ->
+ SupName = make_name(Addr, Port),
+ supervisor:start_link({local, SupName}, ?MODULE, [MiscSupVerbosity]).
+
+stop(StartArgs) ->
+ ok.
+
+init([Verbosity]) -> % Supervisor
+ do_init(Verbosity);
+init(BadArg) ->
+ {error, {badarg, BadArg}}.
+
+do_init(Verbosity) ->
+ put(verbosity,?vvalidate(Verbosity)),
+ put(sname,misc_sup),
+ ?vlog("starting", []),
+ Flags = {one_for_one, 0, 1},
+ KillAfter = timer:seconds(1),
+ Workers = [],
+ {ok, {Flags, Workers}}.
+
+
+%%----------------------------------------------------------------------
+%% Function: [start|stop]_[auth|sec]_server/3
+%% Description: Starts a [auth | security] worker (child) process
+%%----------------------------------------------------------------------
+
+start_auth_server(Addr, Port, Verbosity) ->
+ start_permanent_worker(mod_auth_server, Addr, Port,
+ Verbosity, [gen_server]).
+
+stop_auth_server(Addr, Port) ->
+ stop_permanent_worker(mod_auth_server, Addr, Port).
+
+
+start_sec_server(Addr, Port, Verbosity) ->
+ start_permanent_worker(mod_security_server, Addr, Port,
+ Verbosity, [gen_server]).
+
+stop_sec_server(Addr, Port) ->
+ stop_permanent_worker(mod_security_server, Addr, Port).
+
+
+
+%%----------------------------------------------------------------------
+%% Function: start_permanent_worker/5
+%% Description: Starts a permanent worker (child) process
+%%----------------------------------------------------------------------
+
+start_permanent_worker(Mod, Addr, Port, Verbosity, Modules) ->
+ SupName = make_name(Addr, Port),
+ Spec = {{Mod, Addr, Port},
+ {Mod, start_link, [Addr, Port, Verbosity]},
+ permanent, timer:seconds(1), worker, [Mod] ++ Modules},
+ supervisor:start_child(SupName, Spec).
+
+
+%%----------------------------------------------------------------------
+%% Function: stop_permanent_worker/3
+%% Description: Stops a permanent worker (child) process
+%%----------------------------------------------------------------------
+
+stop_permanent_worker(Mod, Addr, Port) ->
+ SupName = make_name(Addr, Port),
+ Name = {Mod, Addr, Port},
+ case supervisor:terminate_child(SupName, Name) of
+ ok ->
+ supervisor:delete_child(SupName, Name);
+ Error ->
+ Error
+ end.
+
+
+make_name(Addr,Port) ->
+ httpd_util:make_name("httpd_misc_sup",Addr,Port).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_parse.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_parse.erl
new file mode 100644
index 0000000000..2f4163de00
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_parse.erl
@@ -0,0 +1,344 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: httpd_parse.erl,v 1.1 2008/12/17 09:53:34 mikpe Exp $
+%%
+-module(httpd_parse).
+-export([
+ request_header/1,
+ hsplit/2,
+ get_request_record/10,
+ split_lines/1,
+ tagup_header/1]).
+-include("httpd.hrl").
+
+
+%%----------------------------------------------------------------------
+%% request_header
+%%
+%% Input: The request as sent from the client (list of characters)
+%% (may include part of the entity body)
+%%
+%% Returns:
+%% {ok, Info#mod}
+%% {not_implemented,Info#mod}
+%% {bad_request, Reason}
+%%----------------------------------------------------------------------
+
+request_header(Header)->
+ [RequestLine|HeaderFields] = split_lines(Header),
+ ?DEBUG("request ->"
+ "~n RequestLine: ~p"
+ "~n Header: ~p",[RequestLine,Header]),
+ ParsedHeader = tagup_header(HeaderFields),
+ ?DEBUG("request ->"
+ "~n ParseHeader: ~p",[ParsedHeader]),
+ case verify_request(string:tokens(RequestLine," ")) of
+ ["HEAD", RequestURI, [$H,$T,$T,$P,$/,$1,$.,N]] ->
+ {ok, ["HEAD", RequestURI, [$H,$T,$T,$P,$/,$1,$.,N], RequestLine,
+ ParsedHeader]};
+ ["GET", RequestURI, "HTTP/0.9"] ->
+ {ok, ["GET", RequestURI, "HTTP/0.9", RequestLine, ParsedHeader]};
+ ["GET", RequestURI, [$H,$T,$T,$P,$/,$1,$.,N]] ->
+ {ok, ["GET", RequestURI, [$H,$T,$T,$P,$/,$1,$.,N], RequestLine,
+ ParsedHeader]};
+ ["POST", RequestURI, [$H,$T,$T,$P,$/,$1,$.,N]] ->
+ {ok, ["POST", RequestURI, [$H,$T,$T,$P,$/,$1,$.,N], RequestLine,
+ ParsedHeader]};
+ %%HTTP must be 1.1 or higher
+ ["TRACE", RequestURI, [$H,$T,$T,$P,$/,$1,$.,N]] when N>48->
+ {ok, ["TRACE", RequestURI, [$H,$T,$T,$P,$/,$1,$.,N], RequestLine,
+ ParsedHeader]};
+ [Method, RequestURI] ->
+ {not_implemented, RequestLine, Method, RequestURI,ParsedHeader,"HTTP/0.9"};
+ [Method, RequestURI, HTTPVersion] ->
+ {not_implemented, RequestLine, Method, RequestURI,ParsedHeader, HTTPVersion};
+ {bad_request, Reason} ->
+ {bad_request, Reason};
+ Reason ->
+ {bad_request, "Unknown request method"}
+ end.
+
+
+
+
+
+
+%%----------------------------------------------------------------------
+%% The request is passed through the server as a record of type mod get it
+%% ----------------------------------------------------------------------
+
+get_request_record(Socket,SocketType,ConfigDB,Method,RequestURI,
+ HTTPVersion,RequestLine,ParsedHeader,EntityBody,InitData)->
+ PersistentConn=get_persistens(HTTPVersion,ParsedHeader,ConfigDB),
+ Info=#mod{init_data=InitData,
+ data=[],
+ socket_type=SocketType,
+ socket=Socket,
+ config_db=ConfigDB,
+ method=Method,
+ absolute_uri=formatAbsoluteURI(RequestURI,ParsedHeader),
+ request_uri=formatRequestUri(RequestURI),
+ http_version=HTTPVersion,
+ request_line=RequestLine,
+ parsed_header=ParsedHeader,
+ entity_body=maybe_remove_nl(ParsedHeader,EntityBody),
+ connection=PersistentConn},
+ {ok,Info}.
+
+%%----------------------------------------------------------------------
+%% Conmtrol wheater we shall maintain a persistent connection or not
+%%----------------------------------------------------------------------
+get_persistens(HTTPVersion,ParsedHeader,ConfigDB)->
+ case httpd_util:lookup(ConfigDB,persistent_conn,true) of
+ true->
+ case HTTPVersion of
+ %%If it is version prio to 1.1 kill the conneciton
+ [$H, $T, $T, $P, $\/, $1, $.,N] ->
+ case httpd_util:key1search(ParsedHeader,"connection","keep-alive")of
+ %%if the connection isnt ordered to go down let it live
+ %%The keep-alive value is the older http/1.1 might be older
+ %%Clients that use it.
+ "keep-alive" when N >= 49 ->
+ ?DEBUG("CONNECTION MODE: ~p",[true]),
+ true;
+ "close" ->
+ ?DEBUG("CONNECTION MODE: ~p",[false]),
+ false;
+ Connect ->
+ ?DEBUG("CONNECTION MODE: ~p VALUE: ~p",[false,Connect]),
+ false
+ end;
+ _ ->
+ ?DEBUG("CONNECTION MODE: ~p VERSION: ~p",[false,HTTPVersion]),
+ false
+
+ end;
+ _ ->
+ false
+ end.
+
+
+
+
+%%----------------------------------------------------------------------
+%% Control whether the last newline of the body is a part of the message or
+%%it is a part of the multipart message.
+%%----------------------------------------------------------------------
+maybe_remove_nl(Header,Rest) ->
+ case find_content_type(Header) of
+ false ->
+ {ok,EntityBody,_}=regexp:sub(Rest,"\r\n\$",""),
+ EntityBody;
+ {ok, Value} ->
+ case string:str(Value, "multipart/form-data") of
+ 0 ->
+ {ok,EntityBody,_}=regexp:sub(Rest,"\r\n\$",""),
+ EntityBody;
+ _ ->
+ Rest
+ end
+ end.
+
+%%----------------------------------------------------------------------
+%% Cet the content type of the incomming request
+%%----------------------------------------------------------------------
+
+
+find_content_type([]) ->
+ false;
+find_content_type([{Name,Value}|Tail]) ->
+ case httpd_util:to_lower(Name) of
+ "content-type" ->
+ {ok, Value};
+ _ ->
+ find_content_type(Tail)
+ end.
+
+%%----------------------------------------------------------------------
+%% Split the header to a list of strings where each string represents a
+%% HTTP header-field
+%%----------------------------------------------------------------------
+split_lines(Request) ->
+ split_lines(Request, [], []).
+split_lines([], CAcc, Acc) ->
+ lists:reverse([lists:reverse(CAcc)|Acc]);
+
+%%White space in the header fields are allowed but the new line must begin with LWS se
+%%rfc2616 chap 4.2. The rfc do not say what to
+split_lines([$\r, $\n, $\t |Rest], CAcc, Acc) ->
+ split_lines(Rest, [$\r, $\n |CAcc], Acc);
+
+split_lines([$\r, $\n, $\s |Rest], CAcc, Acc) ->
+ split_lines(Rest, [$\r, $\n |CAcc], Acc);
+
+split_lines([$\r, $\n|Rest], CAcc, Acc) ->
+ split_lines(Rest, [], [lists:reverse(CAcc)|Acc]);
+split_lines([Chr|Rest], CAcc, Acc) ->
+ split_lines(Rest, [Chr|CAcc], Acc).
+
+
+%%----------------------------------------------------------------------
+%% This is a 'hack' to stop people from trying to access directories/files
+%% relative to the ServerRoot.
+%%----------------------------------------------------------------------
+
+
+verify_request([Request, RequestURI]) ->
+ verify_request([Request, RequestURI, "HTTP/0.9"]);
+
+verify_request([Request, RequestURI, Protocol]) ->
+ NewRequestURI =
+ case string:str(RequestURI, "?") of
+ 0 ->
+ RequestURI;
+ Ndx ->
+ string:left(RequestURI, Ndx)
+ end,
+ case string:str(NewRequestURI, "..") of
+ 0 ->
+ [Request, RequestURI, Protocol];
+ _ ->
+ {bad_request, {forbidden, RequestURI}}
+ end;
+verify_request(Request) ->
+ Request.
+
+%%----------------------------------------------------------------------
+%% tagup_header
+%%
+%% Parses the header of a HTTP request and returns a key,value tuple
+%% list containing Name and Value of each header directive as of:
+%%
+%% Content-Type: multipart/mixed -> {"Content-Type", "multipart/mixed"}
+%%
+%% But in http/1.1 the field-names are case insencitive so now it must be
+%% Content-Type: multipart/mixed -> {"content-type", "multipart/mixed"}
+%% The standard furthermore says that leading and traling white space
+%% is not a part of the fieldvalue and shall therefore be removed.
+%%----------------------------------------------------------------------
+
+tagup_header([]) -> [];
+tagup_header([Line|Rest]) -> [tag(Line, [])|tagup_header(Rest)].
+
+tag([], Tag) ->
+ {httpd_util:to_lower(lists:reverse(Tag)), ""};
+tag([$:|Rest], Tag) ->
+ {httpd_util:to_lower(lists:reverse(Tag)), httpd_util:strip(Rest)};
+tag([Chr|Rest], Tag) ->
+ tag(Rest, [Chr|Tag]).
+
+
+%%----------------------------------------------------------------------
+%% There are 3 possible forms of the reuqest URI
+%%
+%% 1. * When the request is not for a special assset. is is instead
+%% to the server itself
+%%
+%% 2. absoluteURI the whole servername port and asset is in the request
+%%
+%% 3. The most common form that http/1.0 used abs path that is a path
+%% to the requested asset.
+%5----------------------------------------------------------------------
+formatRequestUri("*")->
+ "*";
+formatRequestUri([$h,$t,$t,$p,$:,$\/,$\/|ServerAndPath]) ->
+ removeServer(ServerAndPath);
+
+formatRequestUri([$H,$T,$T,$P,$:,$\/,$\/|ServerAndPath]) ->
+ removeServer(ServerAndPath);
+
+formatRequestUri(ABSPath) ->
+ ABSPath.
+
+removeServer([$\/|Url])->
+ case Url of
+ []->
+ "/";
+ _->
+ [$\/|Url]
+ end;
+removeServer([N|Url]) ->
+ removeServer(Url).
+
+
+formatAbsoluteURI([$h,$t,$t,$p,$:,$\/,$\/|Uri],ParsedHeader)->
+ [$H,$T,$T,$P,$:,$\/,$\/|Uri];
+
+formatAbsoluteURI([$H,$T,$T,$P,$:,$\/,$\/|Uri],ParsedHeader)->
+ [$H,$T,$T,$P,$:,$\/,$\/|Uri];
+
+formatAbsoluteURI(Uri,ParsedHeader)->
+ case httpd_util:key1search(ParsedHeader,"host") of
+ undefined ->
+ nohost;
+ Host ->
+ Host++Uri
+ end.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%Code below is crap from an older version shall be removed when
+%%transformation to http/1.1 is finished
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+%request(Request) ->
+% ?DEBUG("request -> entry with:"
+% "~n Request: ~s",[Request]),
+ % {BeforeEntityBody, Rest} = hsplit([], Request),
+ % ?DEBUG("request ->"
+% "~n BeforeEntityBody: ~p"
+% "~n Rest: ~p",[BeforeEntityBody, Rest]),
+% [RequestLine|Header] = split_lines(BeforeEntityBody),
+% ?DEBUG("request ->"
+% "~n RequestLine: ~p"
+% "~n Header: ~p",[RequestLine,Header]),
+% ParsedHeader = tagup_header(Header),
+% ?DEBUG("request ->"
+% "~n ParseHeader: ~p",[ParsedHeader]),
+% EntityBody = maybe_remove_nl(ParsedHeader,Rest),
+% ?DEBUG("request ->"
+% "~n EntityBody: ~p",[EntityBody]),
+% case verify_request(string:tokens(RequestLine," ")) of
+% ["HEAD", RequestURI, [$H,$T,$T,$P,$/,$1,$.,N]] ->
+% {ok, ["HEAD", formatRequestUri(RequestURI), [$H,$T,$T,$P,$/,$1,$.,N], RequestLine,
+% ParsedHeader, EntityBody]};
+% ["GET", RequestURI, "HTTP/0.9"] ->
+% {ok, ["GET", RequestURI, "HTTP/0.9", RequestLine, ParsedHeader,
+% EntityBody]};
+% ["GET", RequestURI, [$H,$T,$T,$P,$/,$1,$.,N]] ->
+% {ok, ["GET", formatRequestUri(RequestURI), [$H,$T,$T,$P,$/,$1,$.,N], RequestLine,
+% ParsedHeader,EntityBody]};
+%% ["POST", RequestURI, [$H,$T,$T,$P,$/,$1,$.,N]] ->
+% {ok, ["POST", formatRequestUri(RequestURI), [$H,$T,$T,$P,$/,$1,$.,N], RequestLine,
+% ParsedHeader, EntityBody]};
+% [Method, RequestURI] ->
+% {not_implemented, RequestLine, Method, RequestURI,ParsedHeader,"HTTP/0.9"};
+% [Method, RequestURI, HTTPVersion] ->
+% {not_implemented, RequestLine, Method, RequestURI,ParsedHeader, HTTPVersion};
+% {bad_request, Reason} ->
+% {bad_request, Reason};
+% Reason ->
+% {bad_request, "Unknown request method"}
+% end.
+
+hsplit(Accu,[]) ->
+ {lists:reverse(Accu), []};
+hsplit(Accu, [ $\r, $\n, $\r, $\n | Tail]) ->
+ {lists:reverse(Accu), Tail};
+hsplit(Accu, [H|T]) ->
+ hsplit([H|Accu],T).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_request_handler.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_request_handler.erl
new file mode 100644
index 0000000000..b2d375ceff
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_request_handler.erl
@@ -0,0 +1,994 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: httpd_request_handler.erl,v 1.1 2008/12/17 09:53:34 mikpe Exp $
+%%
+-module(httpd_request_handler).
+
+%% app internal api
+-export([start_link/2, synchronize/3]).
+
+%% module internal api
+-export([connection/2, do_next_connection/6, read_header/7]).
+-export([parse_trailers/1, newline/1]).
+
+-include("httpd.hrl").
+-include("httpd_verbosity.hrl").
+
+
+%% start_link
+
+start_link(Manager, ConfigDB) ->
+ Pid = proc_lib:spawn(?MODULE, connection, [Manager, ConfigDB]),
+ {ok, Pid}.
+
+
+%% synchronize
+
+synchronize(Pid, SocketType, Socket) ->
+ Pid ! {synchronize, SocketType, Socket}.
+
+% connection
+
+connection(Manager, ConfigDB) ->
+ {SocketType, Socket, {Status, Verbosity}} = await_synchronize(Manager),
+ put(sname,self()),
+ put(verbosity,?vvalidate(Verbosity)),
+ connection1(Status, Manager, ConfigDB, SocketType, Socket).
+
+
+connection1({reject, busy}, Manager, ConfigDB, SocketType, Socket) ->
+ handle_busy(Manager, ConfigDB, SocketType, Socket);
+
+connection1({reject, blocked}, Manager, ConfigDB, SocketType, Socket) ->
+ handle_blocked(Manager, ConfigDB, SocketType, Socket);
+
+connection1(accept, Manager, ConfigDB, SocketType, Socket) ->
+ handle_connection(Manager, ConfigDB, SocketType, Socket).
+
+
+%% await_synchronize
+
+await_synchronize(Manager) ->
+ receive
+ {synchronize, SocketType, Socket} ->
+ ?vlog("received syncronize: "
+ "~n SocketType: ~p"
+ "~n Socket: ~p", [SocketType, Socket]),
+ {SocketType, Socket, httpd_manager:new_connection(Manager)}
+ after 5000 ->
+ exit(synchronize_timeout)
+ end.
+
+
+% handle_busy
+
+handle_busy(Manager, ConfigDB, SocketType, Socket) ->
+ ?vlog("handle busy: ~p", [Socket]),
+ MaxClients = httpd_util:lookup(ConfigDB, max_clients, 150),
+ String = io_lib:format("heavy load (>~w processes)", [MaxClients]),
+ reject_connection(Manager, ConfigDB, SocketType, Socket, String).
+
+
+% handle_blocked
+
+handle_blocked(Manager, ConfigDB, SocketType, Socket) ->
+ ?vlog("handle blocked: ~p", [Socket]),
+ String = "Server maintenance performed, try again later",
+ reject_connection(Manager, ConfigDB, SocketType, Socket, String).
+
+
+% reject_connection
+
+reject_connection(Manager, ConfigDB, SocketType, Socket, Info) ->
+ String = lists:flatten(Info),
+ ?vtrace("send status (503) message", []),
+ httpd_response:send_status(SocketType, Socket, 503, String, ConfigDB),
+ %% This ugly thing is to make ssl deliver the message, before the close...
+ close_sleep(SocketType, 1000),
+ ?vtrace("close the socket", []),
+ close(SocketType, Socket, ConfigDB).
+
+
+% handle_connection
+
+handle_connection(Manager, ConfigDB, SocketType, Socket) ->
+ ?vlog("handle connection: ~p", [Socket]),
+ Resolve = httpd_socket:resolve(SocketType),
+ Peername = httpd_socket:peername(SocketType, Socket),
+ InitData = #init_data{peername=Peername, resolve=Resolve},
+ TimeOut = httpd_util:lookup(ConfigDB, keep_alive_timeout, 150000),
+ NrOfRequest = httpd_util:lookup(ConfigDB, max_keep_alive_request, forever),
+ ?MODULE:do_next_connection(ConfigDB, InitData,
+ SocketType, Socket,NrOfRequest,TimeOut),
+ ?vlog("handle connection: done", []),
+ httpd_manager:done_connection(Manager),
+ ?vlog("handle connection: close socket", []),
+ close(SocketType, Socket, ConfigDB).
+
+
+% do_next_connection
+do_next_connection(_ConfigDB, _InitData, _SocketType, _Socket, NrOfRequests,
+ _Timeout) when NrOfRequests < 1 ->
+ ?vtrace("do_next_connection: done", []),
+ ok;
+do_next_connection(ConfigDB, InitData, SocketType, Socket, NrOfRequests,
+ Timeout) ->
+ Peername = InitData#init_data.peername,
+ case (catch read(ConfigDB, SocketType, Socket, InitData, Timeout)) of
+ {'EXIT', Reason} ->
+ ?vlog("exit reading from socket: ~p",[Reason]),
+ error_logger:error_report({'EXIT',Reason}),
+ String =
+ lists:flatten(
+ io_lib:format("exit reading from socket: ~p => ~n~p~n",
+ [Socket, Reason])),
+ error_log(mod_log,
+ SocketType, Socket, ConfigDB, Peername, String),
+ error_log(mod_disk_log,
+ SocketType, Socket, ConfigDB, Peername, String);
+ {error, Reason} ->
+ handle_read_error(Reason,SocketType,Socket,ConfigDB,Peername);
+ Info when record(Info, mod) ->
+ case Info#mod.connection of
+ true ->
+ ReqTimeout = httpd_util:lookup(ConfigDB,
+ keep_alive_timeout, 150000),
+ ?MODULE:do_next_connection(ConfigDB, InitData,
+ SocketType, Socket,
+ dec(NrOfRequests), ReqTimeout);
+ _ ->
+ ok
+ end;
+ _ ->
+ ok
+ end.
+
+
+
+%% read
+read(ConfigDB, SocketType, Socket, InitData, Timeout) ->
+ ?vdebug("read from socket ~p with Timeout ~p",[Socket, Timeout]),
+ MaxHdrSz = httpd_util:lookup(ConfigDB, max_header_size, 10240),
+ case ?MODULE:read_header(SocketType, Socket, Timeout, MaxHdrSz,
+ ConfigDB, InitData, []) of
+ {socket_closed, Reason} ->
+ ?vlog("Socket closed while reading request header: "
+ "~n ~p", [Reason]),
+ socket_close;
+ {error, Error} ->
+ {error, Error};
+ {ok, Info, EntityBodyPart} ->
+ read1(SocketType, Socket, ConfigDB, InitData, Timeout, Info,
+ EntityBodyPart)
+ end.
+
+%% Got the head and maybe a part of the body: read in the rest
+read1(SocketType, Socket, ConfigDB, InitData, Timeout, Info, BodyPart)->
+ MaxBodySz = httpd_util:lookup(ConfigDB, max_body_size, nolimit),
+ ContentLength = content_length(Info),
+ ?vtrace("ContentLength: ~p", [ContentLength]),
+ case read_entity_body(SocketType, Socket, Timeout, MaxBodySz,
+ ContentLength, BodyPart, Info, ConfigDB) of
+ {socket_closed, Reason} ->
+ ?vlog("Socket closed while reading request body: "
+ "~n ~p", [Reason]),
+ socket_close;
+ {ok, EntityBody} ->
+ finish_request(EntityBody, [], Info);
+ {ok, ExtraHeader, EntityBody} ->
+ finish_request(EntityBody, ExtraHeader, Info);
+ Response ->
+ httpd_socket:close(SocketType, Socket),
+ socket_closed
+ %% Catch up all bad return values
+ end.
+
+
+%% The request is read in send it forward to the module that
+%% generates the response
+
+finish_request(EntityBody, ExtraHeader,
+ #mod{parsed_header = ParsedHeader} = Info)->
+ ?DEBUG("finish_request -> ~n"
+ " EntityBody: ~p~n"
+ " ExtraHeader: ~p~n"
+ " ParsedHeader: ~p~n",
+ [EntityBody, ExtraHeader, ParsedHeader]),
+ httpd_response:send(Info#mod{parsed_header = ParsedHeader ++ ExtraHeader,
+ entity_body = EntityBody}).
+
+
+%% read_header
+
+%% This algorithm rely on the buffer size of the inet driver together
+%% with the {active, once} socket option. Atmost one message of this
+%% size will be received at a given time. When a full header has been
+%% read, the body is read with the recv function (the body size is known).
+%%
+read_header(SocketType, Socket, Timeout, MaxHdrSz, ConfigDB,
+ InitData, SoFar0) ->
+ T = t(),
+ %% remove any newlines at the begining, they might be crap from ?
+ SoFar = remove_newline(SoFar0),
+
+ case terminated_header(MaxHdrSz, SoFar) of
+ {true, Header, EntityBodyPart} ->
+ ?vdebug("read_header -> done reading header: "
+ "~n length(Header): ~p"
+ "~n length(EntityBodyPart): ~p",
+ [length(Header), length(EntityBodyPart)]),
+ transform_header(SocketType, Socket, Header, ConfigDB, InitData,
+ EntityBodyPart);
+ false ->
+ ?vtrace("read_header -> "
+ "~n set active = 'once' and "
+ "await a chunk of the header", []),
+
+ case httpd_socket:active_once(SocketType, Socket) of
+ ok ->
+ receive
+ %%
+ %% TCP
+ %%
+ {tcp, Socket, Data} ->
+ ?vtrace("read_header(ip) -> got some data: ~p",
+ [sz(Data)]),
+ ?MODULE:read_header(SocketType, Socket,
+ Timeout - (t()-T),
+ MaxHdrSz, ConfigDB,
+ InitData, SoFar ++ Data);
+ {tcp_closed, Socket} ->
+ ?vtrace("read_header(ip) -> socket closed",[]),
+ {socket_closed,normal};
+ {tcp_error, Socket, Reason} ->
+ ?vtrace("read_header(ip) -> socket error: ~p",
+ [Reason]),
+ {socket_closed, Reason};
+
+ %%
+ %% SSL
+ %%
+ {ssl, Socket, Data} ->
+ ?vtrace("read_header(ssl) -> got some data: ~p",
+ [sz(Data)]),
+ ?MODULE:read_header(SocketType, Socket,
+ Timeout - (t()-T),
+ MaxHdrSz, ConfigDB,
+ InitData, SoFar ++ Data);
+ {ssl_closed, Socket} ->
+ ?vtrace("read_header(ssl) -> socket closed", []),
+ {socket_closed, normal};
+ {ssl_error, Socket, Reason} ->
+ ?vtrace("read_header(ssl) -> socket error: ~p",
+ [Reason]),
+ {socket_closed, Reason}
+
+ after Timeout ->
+ ?vlog("read_header -> timeout", []),
+ {socket_closed, timeout}
+ end;
+
+ Error ->
+ httpd_response:send_status(SocketType, Socket,
+ 500, none, ConfigDB),
+ Error
+ end
+ end.
+
+
+terminated_header(MaxHdrSz, Data) ->
+ D1 = lists:flatten(Data),
+ ?vtrace("terminated_header -> Data size: ~p",[sz(D1)]),
+ case hsplit(MaxHdrSz,[],D1) of
+ not_terminated ->
+ false;
+ [Header, EntityBodyPart] ->
+ {true, Header++"\r\n\r\n",EntityBodyPart}
+ end.
+
+
+transform_header(SocketType, Socket, Request, ConfigDB, InitData, BodyPart) ->
+ case httpd_parse:request_header(Request) of
+ {not_implemented, RequestLine, Method, RequestURI, ParsedHeader,
+ HTTPVersion} ->
+ httpd_response:send_status(SocketType, Socket, 501,
+ {Method, RequestURI, HTTPVersion},
+ ConfigDB),
+ {error,"Not Implemented"};
+ {bad_request, {forbidden, URI}} ->
+ httpd_response:send_status(SocketType, Socket, 403, URI, ConfigDB),
+ {error,"Forbidden Request"};
+ {bad_request, Reason} ->
+ httpd_response:send_status(SocketType, Socket, 400, none,
+ ConfigDB),
+ {error,"Malformed request"};
+ {ok,[Method, RequestURI, HTTPVersion, RequestLine, ParsedHeader]} ->
+ ?DEBUG("send -> ~n"
+ " Method: ~p~n"
+ " RequestURI: ~p~n"
+ " HTTPVersion: ~p~n"
+ " RequestLine: ~p~n",
+ [Method, RequestURI, HTTPVersion, RequestLine]),
+ {ok, Info} =
+ httpd_parse:get_request_record(Socket, SocketType, ConfigDB,
+ Method, RequestURI, HTTPVersion,
+ RequestLine, ParsedHeader,
+ [], InitData),
+ %% Control that the Host header field is provided
+ case Info#mod.absolute_uri of
+ nohost ->
+ case Info#mod.http_version of
+ "HTTP/1.1" ->
+ httpd_response:send_status(Info, 400, none),
+ {error,"No host specified"};
+ _ ->
+ {ok, Info, BodyPart}
+ end;
+ _ ->
+ {ok, Info, BodyPart}
+ end
+ end.
+
+
+hsplit(_MaxHdrSz, Accu,[]) ->
+ not_terminated;
+hsplit(_MaxHdrSz, Accu, [ $\r, $\n, $\r, $\n | Tail]) ->
+ [lists:reverse(Accu), Tail];
+hsplit(nolimit, Accu, [H|T]) ->
+ hsplit(nolimit,[H|Accu],T);
+hsplit(MaxHdrSz, Accu, [H|T]) when length(Accu) < MaxHdrSz ->
+ hsplit(MaxHdrSz,[H|Accu],T);
+hsplit(MaxHdrSz, Accu, D) ->
+ throw({error,{header_too_long,length(Accu),length(D)}}).
+
+
+
+%%----------------------------------------------------------------------
+%% The http/1.1 standard chapter 8.2.3 says that a request containing
+%% An Except header-field must be responded to by 100 (Continue) by
+%% the server before the client sends the body.
+%%----------------------------------------------------------------------
+
+read_entity_body(SocketType, Socket, Timeout, Max, Length, BodyPart, Info,
+ ConfigDB) when integer(Max) ->
+ case expect(Info#mod.http_version, Info#mod.parsed_header, ConfigDB) of
+ continue when Max > Length ->
+ ?DEBUG("read_entity_body()->100 Continue ~n", []),
+ httpd_response:send_status(Info, 100, ""),
+ read_entity_body2(SocketType, Socket, Timeout, Max, Length,
+ BodyPart, Info, ConfigDB);
+ continue when Max < Length ->
+ httpd_response:send_status(Info, 417, "Body to big"),
+ httpd_socket:close(SocketType, Socket),
+ {socket_closed,"Expect denied according to size"};
+ break ->
+ httpd_response:send_status(Info, 417, "Method not allowed"),
+ httpd_socket:close(SocketType, Socket),
+ {socket_closed,"Expect conditions was not fullfilled"};
+ no_expect_header ->
+ read_entity_body2(SocketType, Socket, Timeout, Max, Length,
+ BodyPart, Info, ConfigDB);
+ http_1_0_expect_header ->
+ httpd_response:send_status(Info, 400,
+ "Only HTTP/1.1 Clients "
+ "may use the Expect Header"),
+ httpd_socket:close(SocketType, Socket),
+ {socket_closed,"Due to a HTTP/1.0 expect header"}
+ end;
+
+read_entity_body(SocketType, Socket, Timeout, Max, Length, BodyPart,
+ Info, ConfigDB) ->
+ case expect(Info#mod.http_version, Info#mod.parsed_header, ConfigDB) of
+ continue ->
+ ?DEBUG("read_entity_body() -> 100 Continue ~n", []),
+ httpd_response:send_status(Info, 100, ""),
+ read_entity_body2(SocketType, Socket, Timeout, Max, Length,
+ BodyPart, Info, ConfigDB);
+ break->
+ httpd_response:send_status(Info, 417, "Method not allowed"),
+ httpd_socket:close(SocketType, Socket),
+ {socket_closed,"Expect conditions was not fullfilled"};
+ no_expect_header ->
+ read_entity_body2(SocketType, Socket, Timeout, Max, Length,
+ BodyPart, Info, ConfigDB);
+ http_1_0_expect_header ->
+ httpd_response:send_status(Info, 400,
+ "HTTP/1.0 Clients are not allowed "
+ "to use the Expect Header"),
+ httpd_socket:close(SocketType, Socket),
+ {socket_closed,"Expect header field in an HTTP/1.0 request"}
+ end.
+
+%%----------------------------------------------------------------------
+%% control if the body is transfer encoded
+%%----------------------------------------------------------------------
+read_entity_body2(SocketType, Socket, Timeout, Max, Length, BodyPart,
+ Info, ConfigDB) ->
+ ?DEBUG("read_entity_body2() -> "
+ "~n Max: ~p"
+ "~n Length: ~p"
+ "~n Socket: ~p", [Max, Length, Socket]),
+
+ case transfer_coding(Info) of
+ {chunked, ChunkedData} ->
+ ?DEBUG("read_entity_body2() -> "
+ "Transfer-encoding: Chunked Data: BodyPart ~s", [BodyPart]),
+ read_chunked_entity(Info, Timeout, Max, Length, ChunkedData, [],
+ BodyPart);
+ unknown_coding ->
+ ?DEBUG("read_entity_body2() -> Transfer-encoding: Unknown",[]),
+ httpd_response:send_status(Info, 501, "Unknown Transfer-Encoding"),
+ httpd_socket:close(SocketType, Socket),
+ {socket_closed,"Expect conditions was not fullfilled"};
+ none ->
+ ?DEBUG("read_entity_body2() -> Transfer-encoding: none",[]),
+ read_entity_body(SocketType, Socket, Timeout, Max, Length,
+ BodyPart)
+ end.
+
+
+%%----------------------------------------------------------------------
+%% The body was plain read it from the socket
+%% ----------------------------------------------------------------------
+read_entity_body(_SocketType, _Socket, _Timeout, _Max, 0, _BodyPart) ->
+ {ok, []};
+
+read_entity_body(_SocketType, _Socket, _Timeout, Max, Len, _BodyPart)
+ when Max < Len ->
+ ?vlog("body to long: "
+ "~n Max: ~p"
+ "~n Len: ~p", [Max,Len]),
+ throw({error,{body_too_long,Max,Len}});
+
+%% OTP-4409: Fixing POST problem
+read_entity_body(_,_,_,_, Len, BodyPart) when Len == length(BodyPart) ->
+ ?vtrace("read_entity_body -> done when"
+ "~n Len = length(BodyPart): ~p", [Len]),
+ {ok, BodyPart};
+
+%% OTP-4550: Fix problem with trailing garbage produced by some clients.
+read_entity_body(_, _, _, _, Len, BodyPart) when Len < length(BodyPart) ->
+ ?vtrace("read_entity_body -> done when"
+ "~n Len: ~p"
+ "~n length(BodyPart): ~p", [Len, length(BodyPart)]),
+ {ok, lists:sublist(BodyPart,Len)};
+
+read_entity_body(SocketType, Socket, Timeout, Max, Len, BodyPart) ->
+ ?vtrace("read_entity_body -> entry when"
+ "~n Len: ~p"
+ "~n length(BodyPart): ~p", [Len, length(BodyPart)]),
+ %% OTP-4548:
+ %% The length calculation was previously (inets-2.*) done in the
+ %% read function. As of 3.0 it was removed from read but not
+ %% included here.
+ L = Len - length(BodyPart),
+ case httpd_socket:recv(SocketType, Socket, L, Timeout) of
+ {ok, Body} ->
+ ?vtrace("read_entity_body -> received some data:"
+ "~n length(Body): ~p", [length(Body)]),
+ {ok, BodyPart ++ Body};
+ {error,closed} ->
+ {socket_closed,normal};
+ {error,etimedout} ->
+ {socket_closed, timeout};
+ {error,Reason} ->
+ {socket_closed, Reason};
+ Other ->
+ {socket_closed, Other}
+ end.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% If the body of the message is encoded used the chunked transfer encoding
+%% it looks somethin like this:
+%% METHOD URI HTTP/VSN
+%% Transfer-Encoding: chunked
+%% CRLF
+%% ChunkSize
+%% Chunk
+%% ChunkSize
+%% Chunk
+%% 0
+%% Trailer
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+read_chunked_entity(Info, Timeout, Max, Length, ChunkedData, Body, []) ->
+ ?DEBUG("read_chunked_entity()->:no_chunks ~n", []),
+ read_chunked_entity(Info#mod.socket_type, Info#mod.socket,
+ Timeout, Max, Length, ChunkedData, Body,
+ Info#mod.config_db, Info);
+
+read_chunked_entity(Info, Timeout, Max, Length, ChunkedData, Body, BodyPart) ->
+ %% Get the size
+ ?DEBUG("read_chunked_entity() -> PrefetchedBodyPart: ~p ~n",[BodyPart]),
+ case parse_chunk_size(Info, Timeout, BodyPart) of
+ {ok, Size, NewBodyPart} when Size > 0 ->
+ ?DEBUG("read_chunked_entity() -> Size: ~p ~n", [Size]),
+ case parse_chunked_entity_body(Info, Timeout, Max, length(Body),
+ Size, NewBodyPart) of
+ {ok, Chunk, NewBodyPart1} ->
+ ?DEBUG("read_chunked_entity()->Size: ~p ~n", [Size]),
+ read_chunked_entity(Info, Timeout, Max, Length,
+ ChunkedData, Body ++ Chunk,
+ NewBodyPart1);
+ OK ->
+ httpd_socket:close(Info#mod.socket_type, Info#mod.socket),
+ {socket_closed, error}
+ end;
+ {ok, 0, Trailers} ->
+ ?DEBUG("read_chunked_entity()->Size: 0, Trailers: ~s Body: ~s ~n",
+ [Trailers, Body]),
+ case parse_chunk_trailer(Info, Timeout, Info#mod.config_db,
+ Trailers) of
+ {ok, TrailerFields} ->
+ {ok, TrailerFields, Body};
+ _->
+ {ok, []}
+ end;
+ Error ->
+ Error
+ end.
+
+
+parse_chunk_size(Info, Timeout, BodyPart) ->
+ case httpd_util:split(remove_newline(BodyPart), "\r\n", 2) of
+ {ok, [Size, Body]} ->
+ ?DEBUG("parse_chunk_size()->Size: ~p ~n", [Size]),
+ {ok, httpd_util:hexlist_to_integer(Size), Body};
+ {ok, [Size]} ->
+ ?DEBUG("parse_chunk_size()->Size: ~p ~n", [Size]),
+ Sz = get_chunk_size(Info#mod.socket_type,
+ Info#mod.socket, Timeout,
+ lists:reverse(Size)),
+ {ok, Sz, []}
+ end.
+
+%%----------------------------------------------------------------------
+%% We got the chunk size get the chunk
+%%
+%% Max: Max numbers of bytes to read may also be undefined
+%% Length: Numbers of bytes already read
+%% Size Numbers of byte to read for the chunk
+%%----------------------------------------------------------------------
+
+%% body to big
+parse_chunked_entity_body(Info, Timeout, Max, Length, Size, BodyPart)
+ when Max =< (Length + Size) ->
+ {error, body_to_big};
+
+%% Prefetched body part is bigger than the current chunk
+%% (i.e. BodyPart includes more than one chunk)
+parse_chunked_entity_body(Info, Timeout, Max, Length, Size, BodyPart)
+ when (Size+2) =< length(BodyPart) ->
+ Chunk = string:substr(BodyPart, 1, Size),
+ Rest = string:substr(BodyPart, Size+3),
+ ?DEBUG("parse_chunked_entity_body() -> ~nChunk: ~s ~nRest: ~s ~n",
+ [Chunk, Rest]),
+ {ok, Chunk, Rest};
+
+
+%% We just got a part of the current chunk
+parse_chunked_entity_body(Info, Timeout, Max, Length, Size, BodyPart) ->
+ %% OTP-4551:
+ %% Subtracting BodyPart from Size does not produce an integer
+ %% when BodyPart is a list...
+ Remaining = Size - length(BodyPart),
+ LastPartOfChunk = read_chunked_entity_body(Info#mod.socket_type,
+ Info#mod.socket,
+ Timeout, Max,
+ Length, Remaining),
+ %% Remove newline
+ httpd_socket:recv(Info#mod.socket_type, Info#mod.socket, 2, Timeout),
+ ?DEBUG("parse_chunked_entity_body() -> "
+ "~nBodyPart: ~s"
+ "~nLastPartOfChunk: ~s ~n",
+ [BodyPart, LastPartOfChunk]),
+ {ok, BodyPart ++ LastPartOfChunk, []}.
+
+
+%%----------------------------------------------------------------------
+%% If the data we got along with the header contained the whole chunked body
+%% It may aswell contain the trailer :-(
+%%----------------------------------------------------------------------
+%% Either trailer begins with \r\n and then all data is there or
+%% The trailer has data then read upto \r\n\r\n
+parse_chunk_trailer(Info,Timeout,ConfigDB,"\r\n")->
+ {ok,[]};
+parse_chunk_trailer(Info,Timeout,ConfigDB,Trailers) ->
+ ?DEBUG("parse_chunk_trailer()->Trailers: ~s ~n", [Trailers]),
+ case string:rstr(Trailers,"\r\n\r\n") of
+ 0 ->
+ MaxHdrSz=httpd_util:lookup(ConfigDB, max_header_size, 10240),
+ read_trailer_end(Info,Timeout,MaxHdrSz,Trailers);
+ _->
+ %%We got the whole header parse it up
+ parse_trailers(Trailers)
+ end.
+
+parse_trailers(Trailer)->
+ ?DEBUG("parse_trailer()->Trailer: ~s",[Trailer]),
+ {ok,[Fields0|Crap]}=httpd_util:split(Trailer,"\r\n\r\n",2),
+ Fields=string:tokens(Fields0,"\r\n"),
+ [getTrailerField(X)||X<-Fields,lists:member($:,X)].
+
+
+read_trailer_end(Info,Timeout,MaxHdrSz,[])->
+ ?DEBUG("read_trailer_end()->[]",[]),
+ case read_trailer(Info#mod.socket_type,Info#mod.socket,
+ Timeout,MaxHdrSz,[],[],
+ httpd_util:key1search(Info#mod.parsed_header,"trailer",[])) of
+ {ok,Trailers}->
+ Trailers;
+ _->
+ []
+ end;
+read_trailer_end(Info,Timeout,MaxHdrSz,Trailers)->
+ ?DEBUG("read_trailer_end()->Trailers: ~s ~n ",[Trailers]),
+ %% Get the last paart of the the last headerfield
+ End=lists:reverse(lists:takewhile(fun(X)->case X of 10 ->false;13->false;_ ->true end end,lists:reverse(Trailers))),
+ Fields0=regexp:split(Trailers,"\r\n"),
+ %%Get rid of the last header field
+ [_Last|Fields]=lists:reverse(Fields0),
+ Headers=[getTrailerField(X)||X<-Fields,lists:member($:,X)],
+ case read_trailer(Info#mod.socket_type,Info#mod.socket,
+ Timeout,MaxHdrSz,Headers,End,
+ httpd_util:key1search(Info#mod.parsed_header,"trailer",[])) of
+ {ok,Trailers}->
+ Trailers;
+ _->
+ []
+ end.
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% The code below is a a good way to read in chunked encoding but
+%% that require that the encoding comes from a stream and not from a list
+%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
+
+%%----------------------------------------------------------------------
+%% The body is encoded by chubnked encoding read it in
+%% ChunkedData= Chunked extensions
+%% Body= the inread chunked body
+%% Max: Max numbers of bytes to read
+%% Length: Numbers of bytes already readed
+%% Size Numbers of byte to read for the chunk
+%%----------------------------------------------------------------------
+
+
+
+read_chunked_entity(SocketType, Socket, Timeout, Max, Length, ChunkedData,
+ Body, ConfigDB, Info) ->
+ T = t(),
+ case get_chunk_size(SocketType,Socket,Timeout,[]) of
+ Size when integer(Size), Size>0 ->
+ case read_chunked_entity_body(SocketType, Socket,
+ Timeout-(t()-T),
+ Max, length(Body), Size) of
+ {ok,Chunk} ->
+ ?DEBUG("read_chunked_entity/9 Got a chunk: ~p " ,[Chunk]),
+ %% Two bytes are left of the chunk, that is the CRLF
+ %% at the end that is not a part of the message
+ %% So we read it and do nothing with it.
+ httpd_socket:recv(SocketType,Socket,2,Timeout-(t()-T)),
+ read_chunked_entity(SocketType, Socket, Timeout-(t()-T),
+ Max, Length, ChunkedData, Body++Chunk,
+ ConfigDB, Info);
+ Error ->
+ ?DEBUG("read_chunked_entity/9 Error: ~p " ,[Error]),
+ httpd_socket:close(SocketType,Socket),
+ {socket_closed,error}
+ end;
+ Size when integer(Size), Size == 0 ->
+ %% Must read in any trailer fields here
+ read_chunk_trailer(SocketType, Socket, Timeout,
+ Max, Info, ChunkedData, Body, ConfigDB);
+ Error ->
+ Error
+ end.
+
+
+%% If a user wants to send header data after the chunked data we
+%% must pick it out
+read_chunk_trailer(SocketType, Socket, Timeout, Max, Info, ChunkedData,
+ Body, ConfigDB) ->
+ ?DEBUG("read_chunk_trailer/8: ~p " ,[Body]),
+ MaxHdrSz = httpd_util:lookup(ConfigDB,max_header_size,10240),
+ case httpd_util:key1search(Info#mod.parsed_header,"trailer")of
+ undefined ->
+ {ok,Body};
+ Fields ->
+ case read_trailer(SocketType, Socket, Timeout,
+ MaxHdrSz, [], [],
+ string:tokens(
+ httpd_util:to_lower(Fields),",")) of
+ {ok,[]} ->
+ {ok,Body};
+ {ok,HeaderFields} ->
+ % ParsedExtraHeaders =
+ % httpd_parse:tagup_header(httpd_parse:split_lines(HeaderFields)),
+ {ok,HeaderFields,Body};
+ Error ->
+ Error
+ end
+ end.
+
+read_chunked_entity_body(SocketType, Socket, Timeout, Max, Length, Size)
+ when integer(Max) ->
+ read_entity_body(SocketType, Socket, Timeout, Max-Length, Size, []);
+
+read_chunked_entity_body(SocketType, Socket, Timeout, Max, _Length, Size) ->
+ read_entity_body(SocketType, Socket, Timeout, Max, Size, []).
+
+%% If we read in the \r\n the httpd_util:hexlist_to_integer
+%% Will remove it and we get rid of it emmediatly :-)
+get_chunk_size(SocketType, Socket, Timeout, Size) ->
+ T = t(),
+ ?DEBUG("get_chunk_size: ~p " ,[Size]),
+ case httpd_socket:recv(SocketType,Socket,1,Timeout) of
+ {ok,[Digit]} when Digit==$\n ->
+ httpd_util:hexlist_to_integer(lists:reverse(Size));
+ {ok,[Digit]} ->
+ get_chunk_size(SocketType,Socket,Timeout-(t()-T),[Digit|Size]);
+ {error,closed} ->
+ {socket_closed,normal};
+ {error,etimedout} ->
+ {socket_closed, timeout};
+ {error,Reason} ->
+ {socket_closed, Reason};
+ Other ->
+ {socket_closed,Other}
+ end.
+
+
+
+
+%%----------------------------------------------------------------------
+%% Reads the HTTP-trailer
+%% Would be easy to tweak the read_head to do this but in this way
+%% the chunked encoding can be updated better.
+%%----------------------------------------------------------------------
+
+
+%% When end is reached
+%% read_trailer(SocketType,Socket,Timeout,MaxHdrSz,Headers,Last,[]) ->
+%% {ok,Headers};
+
+%% When header to big
+read_trailer(_,_,_,MaxHdrSz,Headers,Bs,_Fields)
+ when MaxHdrSz < length(Headers) ->
+ ?vlog("header to long: "
+ "~n MaxHdrSz: ~p"
+ "~n length(Bs): ~p", [MaxHdrSz,length(Bs)]),
+ throw({error,{header_too_long,MaxHdrSz,length(Bs)}});
+
+%% The last Crlf is there
+read_trailer(_, _, _, _, Headers, [$\n, $\r], _) ->
+ {ok,Headers};
+
+read_trailer(SocketType, Socket, Timeout, MaxHdrSz, Headers,
+ [$\n, $\r|Rest], Fields) ->
+ case getTrailerField(lists:reverse(Rest))of
+ {error,Reason}->
+ {error,"Bad trailer"};
+ {HeaderField,Value}->
+ case lists:member(HeaderField,Fields) of
+ true ->
+ read_trailer(SocketType,Socket,Timeout,MaxHdrSz,
+ [{HeaderField,Value} |Headers],[],
+ lists:delete(HeaderField,Fields));
+ false ->
+ read_trailer(SocketType,Socket,Timeout,MaxHdrSz,
+ Headers,[],Fields)
+ end
+ end;
+
+% read_trailer(SocketType,Socket,Timeout,MaxHdrSz,Headers,[$\n, $\r|Rest],Fields) ->
+% case Rest of
+% [] ->
+% read_trailer(SocketType,Socket,Timeout,MaxHdrSz,Headers,Rest,Fields);
+% Field ->
+% case getTrailerField(lists:reverse(Rest))of
+% {error,Reason}->
+% {error,"Bad trailer"};
+% {HeaderField,Value}->
+% case lists:member(HeaderField,Fields) of
+% true ->
+% read_trailer(SocketType,Socket,Timeout,MaxHdrSz,
+% [{HeaderField,Value} |Headers],[],
+% lists:delete(HeaderField,Fields));
+% false ->
+% read_trailer(SocketType,Socket,Timeout,MaxHdrSz,
+% Headers,[],Fields)
+% end
+% end
+% end;
+
+read_trailer(SocketType,Socket,Timeout,MaxHdrSz,Headers,Bs,Fields) ->
+ %% ?vlog("read_header -> entry with Timeout: ~p",[Timeout]),
+ T = t(),
+ case (catch httpd_socket:recv(SocketType,Socket,1,Timeout)) of
+ {ok,[B]} ->
+ read_trailer(SocketType, Socket, Timeout-(t()-T),
+ MaxHdrSz, Headers, [B|Bs], Fields);
+ {error,closed} ->
+ {socket_closed,normal};
+ {error,etimedout} ->
+ {socket_closed, timeout};
+ {error,Reason} ->
+ {socket_closed, Reason};
+ Other ->
+ {socket_closed,Other}
+ end.
+
+getTrailerField(HeaderField)->
+ case string:str(HeaderField,":") of
+ 0->
+ {error,"badheaderfield"};
+ Number ->
+ {httpd_util:to_lower(string:substr(HeaderField,1,Number-1)),
+ httpd_util:to_lower(string:substr(HeaderField,Number+1))}
+ end.
+
+
+
+
+%% Time in milli seconds
+t() ->
+ {A,B,C} = erlang:now(),
+ A*1000000000+B*1000+(C div 1000).
+
+%%----------------------------------------------------------------------
+%% If the user sends an expect header-field with the value 100-continue
+%% We must send a 100 status message if he is a HTTP/1.1 client.
+
+%% If it is an HTTP/1.0 client it's little more difficult.
+%% If expect is not defined it is easy but in the other case shall we
+%% Break or the transmission or let it continue the standard is not clear
+%% if to break connection or wait for data.
+%%----------------------------------------------------------------------
+expect(HTTPVersion,ParsedHeader,ConfigDB)->
+ case HTTPVersion of
+ [$H,$T,$T,$P,$\/,$1,$.,N|_Whatever]when N>=1->
+ case httpd_util:key1search(ParsedHeader,"expect") of
+ "100-continue" ->
+ continue;
+ undefined ->
+ no_expect_header;
+ NewValue ->
+ break
+ end;
+ _OldVersion ->
+ case httpd_util:key1search(ParsedHeader,"expect") of
+ undefined ->
+ no_expect_header;
+ NewValue ->
+ case httpd_util:lookup(ConfigDB,expect,continue) of
+ continue->
+ no_expect_header;
+ _ ->
+ http_1_0_expect_header
+ end
+ end
+ end.
+
+
+%%----------------------------------------------------------------------
+%% According to the http/1.1 standard all applications must understand
+%% Chunked encoded data. (Last line chapter 3.6.1).
+transfer_coding(#mod{parsed_header = Ph}) ->
+ case httpd_util:key1search(Ph, "transfer-encoding", none) of
+ none ->
+ none;
+ [$c,$h,$u,$n,$k,$e,$d|Data]->
+ {chunked,Data};
+ _ ->
+ unknown_coding
+ end.
+
+
+
+handle_read_error({header_too_long,Max,Rem},
+ SocketType,Socket,ConfigDB,Peername) ->
+ String = io_lib:format("header too long: ~p : ~p",[Max,Rem]),
+ handle_read_error(ConfigDB,String,SocketType,Socket,Peername,
+ max_header_action,close);
+handle_read_error({body_too_long,Max,Actual},
+ SocketType,Socket,ConfigDB,Peername) ->
+ String = io_lib:format("body too long: ~p : ~p",[Max,Actual]),
+ handle_read_error(ConfigDB,String,SocketType,Socket,Peername,
+ max_body_action,close);
+handle_read_error(Error,SocketType,Socket,ConfigDB,Peername) ->
+ ok.
+
+
+handle_read_error(ConfigDB, ReasonString, SocketType, Socket, Peername,
+ Item, Default) ->
+ ?vlog("error reading request: ~s",[ReasonString]),
+ E = lists:flatten(
+ io_lib:format("Error reading request: ~s",[ReasonString])),
+ error_log(mod_log, SocketType, Socket, ConfigDB, Peername, E),
+ error_log(mod_disk_log, SocketType, Socket, ConfigDB, Peername, E),
+ case httpd_util:lookup(ConfigDB,Item,Default) of
+ reply414 ->
+ send_read_status(SocketType, Socket, 414, ReasonString, ConfigDB);
+ _ ->
+ ok
+ end.
+
+send_read_status(SocketType, Socket, Code, ReasonString, ConfigDB) ->
+ httpd_response:send_status(SocketType, Socket, Code, ReasonString,
+ ConfigDB).
+
+
+error_log(Mod, SocketType, Socket, ConfigDB, Peername, String) ->
+ Modules = httpd_util:lookup(ConfigDB, modules,
+ [mod_get, mod_head, mod_log]),
+ case lists:member(Mod, Modules) of
+ true ->
+ Mod:error_log(SocketType, Socket, ConfigDB, Peername, String);
+ _ ->
+ ok
+ end.
+
+
+sz(L) when list(L) ->
+ length(L);
+sz(B) when binary(B) ->
+ size(B);
+sz(O) ->
+ {unknown_size,O}.
+
+
+%% Socket utility functions:
+
+close(SocketType, Socket, ConfigDB) ->
+ case httpd_socket:close(SocketType, Socket) of
+ ok ->
+ ok;
+ {error, Reason} ->
+ ?vlog("error while closing socket: ~p",[Reason]),
+ ok
+ end.
+
+close_sleep({ssl, _}, Time) ->
+ sleep(Time);
+close_sleep(_, _) ->
+ ok.
+
+
+sleep(T) -> receive after T -> ok end.
+
+
+dec(N) when integer(N) ->
+ N-1;
+dec(N) ->
+ N.
+
+
+content_length(#mod{parsed_header = Ph}) ->
+ list_to_integer(httpd_util:key1search(Ph, "content-length","0")).
+
+
+remove_newline(List)->
+ lists:dropwhile(fun newline/1,List).
+
+newline($\r) ->
+ true;
+newline($\n) ->
+ true;
+newline(_Sign) ->
+ false.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_response.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_response.erl
new file mode 100644
index 0000000000..1685cbc129
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_response.erl
@@ -0,0 +1,437 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: httpd_response.erl,v 1.1 2008/12/17 09:53:34 mikpe Exp $
+%%
+-module(httpd_response).
+-export([send/1, send_status/3, send_status/5]).
+
+%%code is the key for the statuscode ex: 200 404 ...
+-define(HTTP11HEADERFIELDS,[content_length, accept_ranges, cache_control, date,
+ pragma, trailer, transfer_encoding, etag, location,
+ retry_after, server, allow,
+ content_encoding, content_language,
+ content_location, content_MD5, content_range,
+ content_type, expires, last_modified]).
+
+-define(HTTP10HEADERFIELDS,[content_length, date, pragma, transfer_encoding,
+ location, server, allow, content_encoding,
+ content_type, last_modified]).
+
+-define(PROCEED_RESPONSE(StatusCode, Info),
+ {proceed,
+ [{response,{already_sent, StatusCode,
+ httpd_util:key1search(Info#mod.data,content_lenght)}}]}).
+
+
+-include("httpd.hrl").
+
+-define(VMODULE,"RESPONSE").
+-include("httpd_verbosity.hrl").
+
+%% send
+
+send(#mod{config_db = ConfigDB} = Info) ->
+ ?vtrace("send -> Request line: ~p", [Info#mod.request_line]),
+ Modules = httpd_util:lookup(ConfigDB,modules,[mod_get, mod_head, mod_log]),
+ case traverse_modules(Info, Modules) of
+ done ->
+ Info;
+ {proceed, Data} ->
+ case httpd_util:key1search(Data, status) of
+ {StatusCode, PhraseArgs, Reason} ->
+ ?vdebug("send -> proceed/status: ~n"
+ "~n StatusCode: ~p"
+ "~n PhraseArgs: ~p"
+ "~n Reason: ~p",
+ [StatusCode, PhraseArgs, Reason]),
+ send_status(Info, StatusCode, PhraseArgs),
+ Info;
+
+ undefined ->
+ case httpd_util:key1search(Data, response) of
+ {already_sent, StatusCode, Size} ->
+ ?vtrace("send -> already sent: "
+ "~n StatusCode: ~p"
+ "~n Size: ~p",
+ [StatusCode, Size]),
+ Info;
+ {response, Header, Body} -> %% New way
+ send_response(Info, Header, Body),
+ Info;
+ {StatusCode, Response} -> %% Old way
+ send_response_old(Info, StatusCode, Response),
+ Info;
+ undefined ->
+ ?vtrace("send -> undefined response", []),
+ send_status(Info, 500, none),
+ Info
+ end
+ end
+ end.
+
+
+%% traverse_modules
+
+traverse_modules(Info,[]) ->
+ {proceed,Info#mod.data};
+traverse_modules(Info,[Module|Rest]) ->
+ case (catch apply(Module,do,[Info])) of
+ {'EXIT', Reason} ->
+ ?vlog("traverse_modules -> exit reason: ~p",[Reason]),
+ String =
+ lists:flatten(
+ io_lib:format("traverse exit from apply: ~p:do => ~n~p",
+ [Module, Reason])),
+ report_error(mod_log, Info#mod.config_db, String),
+ report_error(mod_disk_log, Info#mod.config_db, String),
+ done;
+ done ->
+ done;
+ {break,NewData} ->
+ {proceed,NewData};
+ {proceed,NewData} ->
+ traverse_modules(Info#mod{data=NewData},Rest)
+ end.
+
+%% send_status %%
+
+
+send_status(#mod{socket_type = SocketType,
+ socket = Socket,
+ connection = Conn} = Info, 100, _PhraseArgs) ->
+ ?DEBUG("send_status -> StatusCode: ~p~n",[100]),
+ Header = httpd_util:header(100, Conn),
+ httpd_socket:deliver(SocketType, Socket,
+ [Header, "Content-Length:0\r\n\r\n"]);
+
+send_status(#mod{socket_type = SocketType,
+ socket = Socket,
+ config_db = ConfigDB} = Info, StatusCode, PhraseArgs) ->
+ send_status(SocketType, Socket, StatusCode, PhraseArgs, ConfigDB).
+
+send_status(SocketType, Socket, StatusCode, PhraseArgs, ConfigDB) ->
+ ?DEBUG("send_status -> ~n"
+ " StatusCode: ~p~n"
+ " PhraseArgs: ~p",
+ [StatusCode, PhraseArgs]),
+ Header = httpd_util:header(StatusCode, "text/html", false),
+ ReasonPhrase = httpd_util:reason_phrase(StatusCode),
+ Message = httpd_util:message(StatusCode, PhraseArgs, ConfigDB),
+ Body = get_body(ReasonPhrase, Message),
+ Header1 =
+ Header ++
+ "Content-Length:" ++
+ integer_to_list(length(Body)) ++
+ "\r\n\r\n",
+ httpd_socket:deliver(SocketType, Socket, [Header1, Body]).
+
+
+get_body(ReasonPhrase, Message)->
+ "<HTML>
+ <HEAD>
+ <TITLE>"++ReasonPhrase++"</TITLE>
+ </HEAD>
+ <BODY>
+ <H1>"++ReasonPhrase++"</H1>\n"++Message++"\n</BODY>
+ </HTML>\n".
+
+
+%%% Create a response from the Key/Val tuples In the Head List
+%%% Body is a tuple {body,Fun(),Args}
+
+%% send_response
+%% Allowed Fields
+
+% HTTP-Version StatusCode Reason-Phrase
+% *((general-headers
+% response-headers
+% entity-headers)CRLF)
+% CRLF
+% ?(BODY)
+
+% General Header fields
+% ======================
+% Cache-Control cache_control
+% Connection %%Is set dependiong on the request
+% Date
+% Pramga
+% Trailer
+% Transfer-Encoding
+
+% Response Header field
+% =====================
+% Accept-Ranges
+% (Age) Mostly for proxys
+% Etag
+% Location
+% (Proxy-Authenticate) Only for proxies
+% Retry-After
+% Server
+% Vary
+% WWW-Authenticate
+%
+% Entity Header Fields
+% ====================
+% Allow
+% Content-Encoding
+% Content-Language
+% Content-Length
+% Content-Location
+% Content-MD5
+% Content-Range
+% Content-Type
+% Expires
+% Last-Modified
+
+
+send_response(Info, Header, Body) ->
+ ?vtrace("send_response -> (new) entry with"
+ "~n Header: ~p", [Header]),
+ case httpd_util:key1search(Header, code) of
+ undefined ->
+ %% No status code
+ %% Ooops this must be very bad:
+ %% generate a 404 content not availible
+ send_status(Info, 404, "The file is not availible");
+ StatusCode ->
+ case send_header(Info, StatusCode, Header) of
+ ok ->
+ send_body(Info, StatusCode, Body);
+ Error ->
+ ?vlog("head delivery failure: ~p", [Error]),
+ done
+ end
+ end.
+
+
+send_header(#mod{socket_type = Type, socket = Sock,
+ http_version = Ver, connection = Conn} = Info,
+ StatusCode, Head0) ->
+ ?vtrace("send_haeder -> entry with"
+ "~n Ver: ~p"
+ "~n Conn: ~p", [Ver, Conn]),
+ Head1 = create_header(Ver, Head0),
+ StatusLine = [Ver, " ",
+ io_lib:write(StatusCode), " ",
+ httpd_util:reason_phrase(StatusCode), "\r\n"],
+ Connection = get_connection(Conn, Ver),
+ Head = list_to_binary([StatusLine, Head1, Connection,"\r\n"]),
+ ?vtrace("deliver head", []),
+ httpd_socket:deliver(Type, Sock, Head).
+
+
+send_body(_, _, nobody) ->
+ ?vtrace("send_body -> no body", []),
+ ok;
+
+send_body(#mod{socket_type = Type, socket = Sock},
+ StatusCode, Body) when list(Body) ->
+ ?vtrace("deliver body of size ~p", [length(Body)]),
+ httpd_socket:deliver(Type, Sock, Body);
+
+send_body(#mod{socket_type = Type, socket = Sock} = Info,
+ StatusCode, {Fun, Args}) ->
+ case (catch apply(Fun, Args)) of
+ close ->
+ httpd_socket:close(Type, Sock),
+ done;
+
+ sent ->
+ ?PROCEED_RESPONSE(StatusCode, Info);
+
+ {ok, Body} ->
+ ?vtrace("deliver body", []),
+ case httpd_socket:deliver(Type, Sock, Body) of
+ ok ->
+ ?PROCEED_RESPONSE(StatusCode, Info);
+ Error ->
+ ?vlog("body delivery failure: ~p", [Error]),
+ done
+ end;
+
+ Error ->
+ ?vlog("failure of apply(~p,~p): ~p", [Fun, Args, Error]),
+ done
+ end;
+send_body(I, S, B) ->
+ ?vinfo("BAD ARGS: "
+ "~n I: ~p"
+ "~n S: ~p"
+ "~n B: ~p", [I, S, B]),
+ exit({bad_args, {I, S, B}}).
+
+
+%% Return a HTTP-header field that indicates that the
+%% connection will be inpersistent
+get_connection(true,"HTTP/1.0")->
+ "Connection:close\r\n";
+get_connection(false,"HTTP/1.1") ->
+ "Connection:close\r\n";
+get_connection(_,_) ->
+ "".
+
+
+create_header("HTTP/1.1", Data) ->
+ create_header1(?HTTP11HEADERFIELDS, Data);
+create_header(_, Data) ->
+ create_header1(?HTTP10HEADERFIELDS, Data).
+
+create_header1(Fields, Data) ->
+ ?DEBUG("create_header() -> "
+ "~n Fields :~p~n Data: ~p ~n", [Fields, Data]),
+ mapfilter(fun(Field)->
+ transform({Field, httpd_util:key1search(Data, Field)})
+ end, Fields, undefined).
+
+
+%% Do a map and removes the values that evaluates to RemoveVal
+mapfilter(Fun,List,RemoveVal)->
+ mapfilter(Fun,List,[],RemoveVal).
+
+mapfilter(Fun,[],[RemoveVal|Acc],RemoveVal)->
+ Acc;
+mapfilter(Fun,[],Acc,_RemoveVal)->
+ Acc;
+
+mapfilter(Fun,[Elem|Rest],[RemoveVal|Acc],RemoveVal)->
+ mapfilter(Fun,Rest,[Fun(Elem)|Acc],RemoveVal);
+mapfilter(Fun,[Elem|Rest],Acc,RemoveVal)->
+ mapfilter(Fun,Rest,[Fun(Elem)|Acc],RemoveVal).
+
+
+transform({content_type,undefined})->
+ ["Content-Type:text/plain\r\n"];
+
+transform({date,undefined})->
+ ["Date:",httpd_util:rfc1123_date(),"\r\n"];
+
+transform({date,RFCDate})->
+ ["Date:",RFCDate,"\r\n"];
+
+
+transform({_Key,undefined})->
+ undefined;
+transform({accept_ranges,Value})->
+ ["Accept-Ranges:",Value,"\r\n"];
+transform({cache_control,Value})->
+ ["Cache-Control:",Value,"\r\n"];
+transform({pragma,Value})->
+ ["Pragma:",Value,"\r\n"];
+transform({trailer,Value})->
+ ["Trailer:",Value,"\r\n"];
+transform({transfer_encoding,Value})->
+ ["Pragma:",Value,"\r\n"];
+transform({etag,Value})->
+ ["ETag:",Value,"\r\n"];
+transform({location,Value})->
+ ["Retry-After:",Value,"\r\n"];
+transform({server,Value})->
+ ["Server:",Value,"\r\n"];
+transform({allow,Value})->
+ ["Allow:",Value,"\r\n"];
+transform({content_encoding,Value})->
+ ["Content-Encoding:",Value,"\r\n"];
+transform({content_language,Value})->
+ ["Content-Language:",Value,"\r\n"];
+transform({retry_after,Value})->
+ ["Retry-After:",Value,"\r\n"];
+transform({server,Value})->
+ ["Server:",Value,"\r\n"];
+transform({allow,Value})->
+ ["Allow:",Value,"\r\n"];
+transform({content_encoding,Value})->
+ ["Content-Encoding:",Value,"\r\n"];
+transform({content_language,Value})->
+ ["Content-Language:",Value,"\r\n"];
+transform({content_location,Value})->
+ ["Content-Location:",Value,"\r\n"];
+transform({content_length,Value})->
+ ["Content-Length:",Value,"\r\n"];
+transform({content_MD5,Value})->
+ ["Content-MD5:",Value,"\r\n"];
+transform({content_range,Value})->
+ ["Content-Range:",Value,"\r\n"];
+transform({content_type,Value})->
+ ["Content-Type:",Value,"\r\n"];
+transform({expires,Value})->
+ ["Expires:",Value,"\r\n"];
+transform({last_modified,Value})->
+ ["Last-Modified:",Value,"\r\n"].
+
+
+
+%%----------------------------------------------------------------------
+%% This is the old way of sending data it is strongly encouraged to
+%% Leave this method and go on to the newer form of response
+%% OTP-4408
+%%----------------------------------------------------------------------
+
+send_response_old(#mod{socket_type = Type,
+ socket = Sock,
+ method = "HEAD"} = Info,
+ StatusCode, Response) ->
+ ?vtrace("send_response_old(HEAD) -> entry with"
+ "~n StatusCode: ~p"
+ "~n Response: ~p",
+ [StatusCode,Response]),
+ case httpd_util:split(lists:flatten(Response),"\r\n\r\n|\n\n",2) of
+ {ok, [Head, Body]} ->
+ Header =
+ httpd_util:header(StatusCode,Info#mod.connection) ++
+ "Content-Length:" ++ content_length(Body),
+ httpd_socket:deliver(Type, Sock, [Header,Head,"\r\n"]);
+
+ Error ->
+ send_status(Info, 500, "Internal Server Error")
+ end;
+
+send_response_old(#mod{socket_type = Type,
+ socket = Sock} = Info,
+ StatusCode, Response) ->
+ ?vtrace("send_response_old -> entry with"
+ "~n StatusCode: ~p"
+ "~n Response: ~p",
+ [StatusCode,Response]),
+ case httpd_util:split(lists:flatten(Response),"\r\n\r\n|\n\n",2) of
+ {ok, [_Head, Body]} ->
+ Header =
+ httpd_util:header(StatusCode,Info#mod.connection) ++
+ "Content-Length:" ++ content_length(Body),
+ httpd_socket:deliver(Type, Sock, [Header, Response]);
+
+ {ok, Body} ->
+ Header =
+ httpd_util:header(StatusCode,Info#mod.connection) ++
+ "Content-Length:" ++ content_length(Body) ++ "\r\n",
+ httpd_socket:deliver(Type, Sock, [Header, Response]);
+
+ {error, Reason} ->
+ send_status(Info, 500, "Internal Server Error")
+ end.
+
+content_length(Body)->
+ integer_to_list(httpd_util:flatlength(Body))++"\r\n".
+
+
+report_error(Mod, ConfigDB, Error) ->
+ Modules = httpd_util:lookup(ConfigDB, modules,
+ [mod_get, mod_head, mod_log]),
+ case lists:member(Mod, Modules) of
+ true ->
+ Mod:report_error(ConfigDB, Error);
+ _ ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_socket.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_socket.erl
new file mode 100644
index 0000000000..375b43784b
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_socket.erl
@@ -0,0 +1,381 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: httpd_socket.erl,v 1.1 2008/12/17 09:53:34 mikpe Exp $
+%%
+-module(httpd_socket).
+-export([start/1,
+ listen/2, listen/3, accept/2, accept/3,
+ deliver/3, send/3, recv/4,
+ close/2,
+ peername/2, resolve/1, config/1,
+ controlling_process/3,
+ active_once/2]).
+
+-include("httpd.hrl").
+
+-define(VMODULE,"SOCKET").
+-include("httpd_verbosity.hrl").
+
+-include_lib("kernel/include/inet.hrl").
+
+%% start -> ok | {error,Reason}
+
+start(ip_comm) ->
+ case inet_db:start() of
+ {ok,_Pid} ->
+ ok;
+ {error,{already_started,_Pid}} ->
+ ok;
+ Error ->
+ Error
+ end;
+start({ssl,_SSLConfig}) ->
+ case ssl:start() of
+ ok ->
+ ok;
+ {ok, _} ->
+ ok;
+ {error,{already_started,_}} ->
+ ok;
+ Error ->
+ Error
+ end.
+
+%% listen
+
+listen(SocketType,Port) ->
+ listen(SocketType,undefined,Port).
+
+listen(ip_comm,Addr,Port) ->
+ ?DEBUG("listening(ip_comm) to port ~p", [Port]),
+ Opt = sock_opt(Addr,[{backlog,128},{reuseaddr,true}]),
+ case gen_tcp:listen(Port,Opt) of
+ {ok,ListenSocket} ->
+ ListenSocket;
+ Error ->
+ Error
+ end;
+listen({ssl,SSLConfig},Addr,Port) ->
+ ?DEBUG("listening(ssl) to port ~p"
+ "~n SSLConfig: ~p", [Port,SSLConfig]),
+ Opt = sock_opt(Addr,SSLConfig),
+ case ssl:listen(Port, Opt) of
+ {ok,ListenSocket} ->
+ ListenSocket;
+ Error ->
+ Error
+ end.
+
+
+sock_opt(undefined,Opt) -> [{packet,0},{active,false}|Opt];
+sock_opt(Addr,Opt) -> [{ip, Addr},{packet,0},{active,false}|Opt].
+
+%% -define(packet_type_http,true).
+%% -define(packet_type_httph,true).
+
+%% -ifdef(packet_type_http).
+%% sock_opt(undefined,Opt) -> [{packet,http},{active,false}|Opt];
+%% sock_opt(Addr,Opt) -> [{ip, Addr},{packet,http},{active,false}|Opt].
+%% -elif(packet_type_httph).
+%% sock_opt(undefined,Opt) -> [{packet,httph},{active,false}|Opt];
+%% sock_opt(Addr,Opt) -> [{ip, Addr},{packet,httph},{active,false}|Opt].
+%% -else.
+%% sock_opt(undefined,Opt) -> [{packet,0},{active,false}|Opt];
+%% sock_opt(Addr,Opt) -> [{ip, Addr},{packet,0},{active,false}|Opt].
+%% -endif.
+
+
+%% active_once
+
+active_once(Type, Sock) ->
+ active(Type, Sock, once).
+
+active(ip_comm, Sock, Active) ->
+ inet:setopts(Sock, [{active, Active}]);
+active({ssl, _SSLConfig}, Sock, Active) ->
+ ssl:setopts(Sock, [{active, Active}]).
+
+%% accept
+
+accept(A, B) ->
+ accept(A, B, infinity).
+
+
+accept(ip_comm,ListenSocket, T) ->
+ ?DEBUG("accept(ip_comm) on socket ~p", [ListenSocket]),
+ case gen_tcp:accept(ListenSocket, T) of
+ {ok,Socket} ->
+ Socket;
+ Error ->
+ ?vtrace("accept(ip_comm) failed for reason:"
+ "~n Error: ~p",[Error]),
+ Error
+ end;
+accept({ssl,_SSLConfig},ListenSocket, T) ->
+ ?DEBUG("accept(ssl) on socket ~p", [ListenSocket]),
+ case ssl:accept(ListenSocket, T) of
+ {ok,Socket} ->
+ Socket;
+ Error ->
+ ?vtrace("accept(ssl) failed for reason:"
+ "~n Error: ~p",[Error]),
+ Error
+ end.
+
+
+%% controlling_process
+
+controlling_process(ip_comm, Socket, Pid) ->
+ gen_tcp:controlling_process(Socket, Pid);
+controlling_process({ssl, _}, Socket, Pid) ->
+ ssl:controlling_process(Socket, Pid).
+
+
+%% deliver
+
+deliver(SocketType, Socket, IOListOrBinary) ->
+ case send(SocketType, Socket, IOListOrBinary) of
+% {error, einval} ->
+% ?vlog("deliver failed for reason: einval"
+% "~n SocketType: ~p"
+% "~n Socket: ~p"
+% "~n Data: ~p",
+% [SocketType, Socket, type(IOListOrBinary)]),
+% (catch close(SocketType, Socket)),
+% socket_closed;
+ {error, _Reason} ->
+ ?vlog("deliver(~p) failed for reason:"
+ "~n Reason: ~p",[SocketType,_Reason]),
+ (catch close(SocketType, Socket)),
+ socket_closed;
+ _ ->
+ ok
+ end.
+
+% type(L) when list(L) ->
+% {list, L};
+% type(B) when binary(B) ->
+% Decoded =
+% case (catch binary_to_term(B)) of
+% {'EXIT', _} ->
+% %% Oups, not a term, try list
+% case (catch binary_to_list(B)) of
+% %% Oups, not a list either, give up
+% {'EXIT', _} ->
+% {size, size(B)};
+% L ->
+% {list, L}
+% end;
+
+% T ->
+% {term, T}
+% end,
+% {binary, Decoded};
+% type(T) when tuple(T) ->
+% {tuple, T};
+% type(I) when integer(I) ->
+% {integer, I};
+% type(F) when float(F) ->
+% {float, F};
+% type(P) when pid(P) ->
+% {pid, P};
+% type(P) when port(P) ->
+% {port, P};
+% type(R) when reference(R) ->
+% {reference, R};
+% type(T) ->
+% {term, T}.
+
+
+
+send(ip_comm,Socket,Data) ->
+ ?DEBUG("send(ip_comm) -> ~p bytes on socket ~p",[data_size(Data),Socket]),
+ gen_tcp:send(Socket,Data);
+send({ssl,SSLConfig},Socket,Data) ->
+ ?DEBUG("send(ssl) -> ~p bytes on socket ~p",[data_size(Data),Socket]),
+ ssl:send(Socket, Data).
+
+recv(ip_comm,Socket,Length,Timeout) ->
+ ?DEBUG("recv(ip_comm) -> read from socket ~p",[Socket]),
+ gen_tcp:recv(Socket,Length,Timeout);
+recv({ssl,SSLConfig},Socket,Length,Timeout) ->
+ ?DEBUG("recv(ssl) -> read from socket ~p",[Socket]),
+ ssl:recv(Socket,Length,Timeout).
+
+-ifdef(inets_debug).
+data_size(L) when list(L) ->
+ httpd_util:flatlength(L);
+data_size(B) when binary(B) ->
+ size(B);
+data_size(O) ->
+ {unknown_size,O}.
+-endif.
+
+
+%% peername
+
+peername(ip_comm, Socket) ->
+ case inet:peername(Socket) of
+ {ok,{{A,B,C,D},Port}} ->
+ PeerName = integer_to_list(A)++"."++integer_to_list(B)++"."++
+ integer_to_list(C)++"."++integer_to_list(D),
+ ?DEBUG("peername(ip_comm) on socket ~p: ~p",
+ [Socket,{Port,PeerName}]),
+ {Port,PeerName};
+ {error,Reason} ->
+ ?vlog("failed getting peername:"
+ "~n Reason: ~p"
+ "~n Socket: ~p",
+ [Reason,Socket]),
+ {-1,"unknown"}
+ end;
+peername({ssl,_SSLConfig},Socket) ->
+ case ssl:peername(Socket) of
+ {ok,{{A,B,C,D},Port}} ->
+ PeerName = integer_to_list(A)++"."++integer_to_list(B)++"."++
+ integer_to_list(C)++"."++integer_to_list(D),
+ ?DEBUG("peername(ssl) on socket ~p: ~p",
+ [Socket, {Port,PeerName}]),
+ {Port,PeerName};
+ {error,_Reason} ->
+ {-1,"unknown"}
+ end.
+
+%% resolve
+
+resolve(_) ->
+ {ok,Name} = inet:gethostname(),
+ Name.
+
+%% close
+
+close(ip_comm,Socket) ->
+ Res =
+ case (catch gen_tcp:close(Socket)) of
+ ok -> ok;
+ {error,Reason} -> {error,Reason};
+ {'EXIT',{noproc,_}} -> {error,closed};
+ {'EXIT',Reason} -> {error,Reason};
+ Otherwise -> {error,Otherwise}
+ end,
+ ?vtrace("close(ip_comm) result: ~p",[Res]),
+ Res;
+close({ssl,_SSLConfig},Socket) ->
+ Res =
+ case (catch ssl:close(Socket)) of
+ ok -> ok;
+ {error,Reason} -> {error,Reason};
+ {'EXIT',{noproc,_}} -> {error,closed};
+ {'EXIT',Reason} -> {error,Reason};
+ Otherwise -> {error,Otherwise}
+ end,
+ ?vtrace("close(ssl) result: ~p",[Res]),
+ Res.
+
+%% config (debug: {certfile, "/var/tmp/server_root/conf/ssl_server.pem"})
+
+config(ConfigDB) ->
+ case httpd_util:lookup(ConfigDB,com_type,ip_comm) of
+ ssl ->
+ case ssl_certificate_file(ConfigDB) of
+ undefined ->
+ {error,
+ ?NICE("Directive SSLCertificateFile "
+ "not found in the config file")};
+ SSLCertificateFile ->
+ {ssl,
+ SSLCertificateFile++
+ ssl_certificate_key_file(ConfigDB)++
+ ssl_verify_client(ConfigDB)++
+ ssl_ciphers(ConfigDB)++
+ ssl_password(ConfigDB)++
+ ssl_verify_depth(ConfigDB)++
+ ssl_ca_certificate_file(ConfigDB)}
+ end;
+ ip_comm ->
+ ip_comm
+ end.
+
+ssl_certificate_file(ConfigDB) ->
+ case httpd_util:lookup(ConfigDB,ssl_certificate_file) of
+ undefined ->
+ undefined;
+ SSLCertificateFile ->
+ [{certfile,SSLCertificateFile}]
+ end.
+
+ssl_certificate_key_file(ConfigDB) ->
+ case httpd_util:lookup(ConfigDB,ssl_certificate_key_file) of
+ undefined ->
+ [];
+ SSLCertificateKeyFile ->
+ [{keyfile,SSLCertificateKeyFile}]
+ end.
+
+ssl_verify_client(ConfigDB) ->
+ case httpd_util:lookup(ConfigDB,ssl_verify_client) of
+ undefined ->
+ [];
+ SSLVerifyClient ->
+ [{verify,SSLVerifyClient}]
+ end.
+
+ssl_ciphers(ConfigDB) ->
+ case httpd_util:lookup(ConfigDB,ssl_ciphers) of
+ undefined ->
+ [];
+ Ciphers ->
+ [{ciphers, Ciphers}]
+ end.
+
+ssl_password(ConfigDB) ->
+ case httpd_util:lookup(ConfigDB,ssl_password_callback_module) of
+ undefined ->
+ [];
+ Module ->
+ case httpd_util:lookup(ConfigDB, ssl_password_callback_function) of
+ undefined ->
+ [];
+ Function ->
+ case catch apply(Module, Function, []) of
+ Password when list(Password) ->
+ [{password, Password}];
+ Error ->
+ error_report(ssl_password,Module,Function,Error),
+ []
+ end
+ end
+ end.
+
+ssl_verify_depth(ConfigDB) ->
+ case httpd_util:lookup(ConfigDB, ssl_verify_client_depth) of
+ undefined ->
+ [];
+ Depth ->
+ [{depth, Depth}]
+ end.
+
+ssl_ca_certificate_file(ConfigDB) ->
+ case httpd_util:lookup(ConfigDB, ssl_ca_certificate_file) of
+ undefined ->
+ [];
+ File ->
+ [{cacertfile, File}]
+ end.
+
+
+error_report(Where,M,F,Error) ->
+ error_logger:error_report([{?MODULE, Where}, {apply, {M, F, []}}, Error]).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_sup.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_sup.erl
new file mode 100644
index 0000000000..e7a3557c9d
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_sup.erl
@@ -0,0 +1,202 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: httpd_sup.erl,v 1.1 2008/12/17 09:53:34 mikpe Exp $
+%%
+%%----------------------------------------------------------------------
+%% Purpose: The top supervisor for the inets application
+%%----------------------------------------------------------------------
+
+-module(httpd_sup).
+
+-behaviour(supervisor).
+
+-include("httpd_verbosity.hrl").
+
+%% public
+-export([start/2, start_link/2, start2/2, start_link2/2, stop/1, stop/2, stop2/1]).
+-export([init/1]).
+
+
+-define(D(F, A), io:format("~p:" ++ F ++ "~n", [?MODULE|A])).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% supervisor callback functions
+
+start(ConfigFile, Verbosity) ->
+ case start_link(ConfigFile, Verbosity) of
+ {ok, Pid} ->
+ unlink(Pid),
+ {ok, Pid};
+
+ Else ->
+ Else
+ end.
+
+
+start_link(ConfigFile, Verbosity) ->
+ case get_addr_and_port(ConfigFile) of
+ {ok, ConfigList, Addr, Port} ->
+ Name = make_name(Addr, Port),
+ SupName = {local, Name},
+ supervisor:start_link(SupName, ?MODULE,
+ [ConfigFile, ConfigList,
+ Verbosity, Addr, Port]);
+
+ {error, Reason} ->
+ error_logger:error_report(Reason),
+ {stop, Reason};
+
+ Else ->
+ error_logger:error_report(Else),
+ {stop, Else}
+ end.
+
+
+start2(ConfigList, Verbosity) ->
+ case start_link2(ConfigList, Verbosity) of
+ {ok, Pid} ->
+ unlink(Pid),
+ {ok, Pid};
+
+ Else ->
+ Else
+ end.
+
+
+start_link2(ConfigList, Verbosity) ->
+ case get_addr_and_port2(ConfigList) of
+ {ok, Addr, Port} ->
+ Name = make_name(Addr, Port),
+ SupName = {local, Name},
+ supervisor:start_link(SupName, ?MODULE,
+ [undefined, ConfigList, Verbosity, Addr, Port]);
+
+ {error, Reason} ->
+ error_logger:error_report(Reason),
+ {stop, Reason};
+
+ Else ->
+ error_logger:error_report(Else),
+ {stop, Else}
+ end.
+
+
+
+stop(Pid) when pid(Pid) ->
+ do_stop(Pid);
+stop(ConfigFile) when list(ConfigFile) ->
+ case get_addr_and_port(ConfigFile) of
+ {ok, _, Addr, Port} ->
+ stop(Addr, Port);
+
+ Error ->
+ Error
+ end;
+stop(StartArgs) ->
+ ok.
+
+
+stop(Addr, Port) when integer(Port) ->
+ Name = make_name(Addr, Port),
+ case whereis(Name) of
+ Pid when pid(Pid) ->
+ do_stop(Pid),
+ ok;
+ _ ->
+ not_started
+ end.
+
+stop2(ConfigList) when list(ConfigList) ->
+ {ok, Addr, Port} = get_addr_and_port2(ConfigList),
+ stop(Addr, Port).
+
+
+do_stop(Pid) ->
+ exit(Pid, shutdown).
+
+
+init([ConfigFile, ConfigList, Verbosity, Addr, Port]) ->
+ init(ConfigFile, ConfigList, Verbosity, Addr, Port);
+init(BadArg) ->
+ {error, {badarg, BadArg}}.
+
+init(ConfigFile, ConfigList, Verbosity, Addr, Port) ->
+ Flags = {one_for_one, 0, 1},
+ AccSupVerbosity = get_acc_sup_verbosity(Verbosity),
+ MiscSupVerbosity = get_misc_sup_verbosity(Verbosity),
+ Sups = [sup_spec(httpd_acceptor_sup, Addr, Port, AccSupVerbosity),
+ sup_spec(httpd_misc_sup, Addr, Port, MiscSupVerbosity),
+ worker_spec(httpd_manager, Addr, Port, ConfigFile, ConfigList,
+ Verbosity, [gen_server])],
+ {ok, {Flags, Sups}}.
+
+
+sup_spec(Name, Addr, Port, Verbosity) ->
+ {{Name, Addr, Port},
+ {Name, start, [Addr, Port, Verbosity]},
+ permanent, 2000, supervisor, [Name, supervisor]}.
+
+worker_spec(Name, Addr, Port, ConfigFile, ConfigList, Verbosity, Modules) ->
+ {{Name, Addr, Port},
+ {Name, start_link, [ConfigFile, ConfigList, Verbosity]},
+ permanent, 2000, worker, [Name] ++ Modules}.
+
+
+make_name(Addr,Port) ->
+ httpd_util:make_name("httpd_sup",Addr,Port).
+
+
+%% get_addr_and_port
+
+get_addr_and_port(ConfigFile) ->
+ case httpd_conf:load(ConfigFile) of
+ {ok, ConfigList} ->
+ {ok, Addr, Port} = get_addr_and_port2(ConfigList),
+ {ok, ConfigList, Addr, Port};
+ Error ->
+ Error
+ end.
+
+
+get_addr_and_port2(ConfigList) ->
+ Port = httpd_util:key1search(ConfigList, port, 80),
+ Addr = httpd_util:key1search(ConfigList, bind_address),
+ {ok, Addr, Port}.
+
+get_acc_sup_verbosity(V) ->
+ case key1search(V, all) of
+ undefined ->
+ key1search(V, acceptor_sup_verbosity, ?default_verbosity);
+ Verbosity ->
+ Verbosity
+ end.
+
+
+get_misc_sup_verbosity(V) ->
+ case key1search(V, all) of
+ undefined ->
+ key1search(V, misc_sup_verbosity, ?default_verbosity);
+ Verbosity ->
+ Verbosity
+ end.
+
+
+key1search(L, K) ->
+ httpd_util:key1search(L, K).
+
+key1search(L, K, D) ->
+ httpd_util:key1search(L, K, D).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_util.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_util.erl
new file mode 100644
index 0000000000..045e6f6516
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_util.erl
@@ -0,0 +1,773 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: httpd_util.erl,v 1.1 2008/12/17 09:53:34 mikpe Exp $
+%%
+-module(httpd_util).
+-export([key1search/2, key1search/3, lookup/2, lookup/3, multi_lookup/2,
+ lookup_mime/2, lookup_mime/3, lookup_mime_default/2,
+ lookup_mime_default/3, reason_phrase/1, message/3, rfc1123_date/0,
+ rfc1123_date/1, day/1, month/1, decode_hex/1, decode_base64/1, encode_base64/1,
+ flatlength/1, split_path/1, split_script_path/1, suffix/1, to_upper/1,
+ to_lower/1, split/3, header/2, header/3, header/4, uniq/1,
+ make_name/2,make_name/3,make_name/4,strip/1,
+ hexlist_to_integer/1,integer_to_hexlist/1,
+ convert_request_date/1,create_etag/1,create_etag/2,getSize/1,
+ response_generated/1]).
+
+%%Since hexlist_to_integer is a lousy name make a name convert
+-export([encode_hex/1]).
+-include("httpd.hrl").
+
+%% key1search
+
+key1search(TupleList,Key) ->
+ key1search(TupleList,Key,undefined).
+
+key1search(TupleList,Key,Undefined) ->
+ case lists:keysearch(Key,1,TupleList) of
+ {value,{Key,Value}} ->
+ Value;
+ false ->
+ Undefined
+ end.
+
+%% lookup
+
+lookup(Table,Key) ->
+ lookup(Table,Key,undefined).
+
+lookup(Table,Key,Undefined) ->
+ case catch ets:lookup(Table,Key) of
+ [{Key,Value}|_] ->
+ Value;
+ _->
+ Undefined
+ end.
+
+%% multi_lookup
+
+multi_lookup(Table,Key) ->
+ remove_key(ets:lookup(Table,Key)).
+
+remove_key([]) ->
+ [];
+remove_key([{_Key,Value}|Rest]) ->
+ [Value|remove_key(Rest)].
+
+%% lookup_mime
+
+lookup_mime(ConfigDB,Suffix) ->
+ lookup_mime(ConfigDB,Suffix,undefined).
+
+lookup_mime(ConfigDB,Suffix,Undefined) ->
+ [{mime_types,MimeTypesDB}|_]=ets:lookup(ConfigDB,mime_types),
+ case ets:lookup(MimeTypesDB,Suffix) of
+ [] ->
+ Undefined;
+ [{Suffix,MimeType}|_] ->
+ MimeType
+ end.
+
+%% lookup_mime_default
+
+lookup_mime_default(ConfigDB,Suffix) ->
+ lookup_mime_default(ConfigDB,Suffix,undefined).
+
+lookup_mime_default(ConfigDB,Suffix,Undefined) ->
+ [{mime_types,MimeTypesDB}|_]=ets:lookup(ConfigDB,mime_types),
+ case ets:lookup(MimeTypesDB,Suffix) of
+ [] ->
+ case ets:lookup(ConfigDB,default_type) of
+ [] ->
+ Undefined;
+ [{default_type,DefaultType}|_] ->
+ DefaultType
+ end;
+ [{Suffix,MimeType}|_] ->
+ MimeType
+ end.
+
+%% reason_phrase
+reason_phrase(100) -> "Continue";
+reason_phrase(101) -> "Swithing protocol";
+reason_phrase(200) -> "OK";
+reason_phrase(201) -> "Created";
+reason_phrase(202) -> "Accepted";
+reason_phrase(204) -> "No Content";
+reason_phrase(205) -> "Reset Content";
+reason_phrase(206) -> "Partial Content";
+reason_phrase(301) -> "Moved Permanently";
+reason_phrase(302) -> "Moved Temporarily";
+reason_phrase(304) -> "Not Modified";
+reason_phrase(400) -> "Bad Request";
+reason_phrase(401) -> "Unauthorized";
+reason_phrase(402) -> "Payment Required";
+reason_phrase(403) -> "Forbidden";
+reason_phrase(404) -> "Not Found";
+reason_phrase(405) -> "Method Not Allowed";
+reason_phrase(408) -> "Request Timeout";
+reason_phrase(411) -> "Length Required";
+reason_phrase(414) -> "Request-URI Too Long";
+reason_phrase(412) -> "Precondition Failed";
+reason_phrase(416) -> "request Range Not Satisfiable";
+reason_phrase(417) -> "Expectation failed";
+reason_phrase(500) -> "Internal Server Error";
+reason_phrase(501) -> "Not Implemented";
+reason_phrase(502) -> "Bad Gateway";
+reason_phrase(503) -> "Service Unavailable";
+reason_phrase(_) -> "Internal Server Error".
+
+%% message
+
+message(301,URL,_) ->
+ "The document has moved <A HREF=\""++URL++"\">here</A>.";
+message(304,_URL,_) ->
+ "The document has not been changed.";
+message(400,none,_) ->
+ "Your browser sent a query that this server could not understand.";
+message(401,none,_) ->
+ "This server could not verify that you
+are authorized to access the document you
+requested. Either you supplied the wrong
+credentials (e.g., bad password), or your
+browser does not understand how to supply
+the credentials required.";
+message(403,RequestURI,_) ->
+ "You do not have permission to access "++RequestURI++" on this server.";
+message(404,RequestURI,_) ->
+ "The requested URL "++RequestURI++" was not found on this server.";
+message(412,none,_) ->
+ "The requested preconditions where false";
+message(414,ReasonPhrase,_) ->
+ "Message "++ReasonPhrase++".";
+message(416,ReasonPhrase,_) ->
+ ReasonPhrase;
+
+message(500,none,ConfigDB) ->
+ ServerAdmin=lookup(ConfigDB,server_admin,"unknown@unknown"),
+ "The server encountered an internal error or
+misconfiguration and was unable to complete
+your request.
+<P>Please contact the server administrator "++ServerAdmin++",
+and inform them of the time the error occurred
+and anything you might have done that may have
+caused the error.";
+message(501,{Method,RequestURI,HTTPVersion},_ConfigDB) ->
+ Method++" to "++RequestURI++" ("++HTTPVersion++") not supported.";
+message(503,String,_ConfigDB) ->
+ "This service in unavailable due to: "++String.
+
+%%convert_rfc_date(Date)->{{YYYY,MM,DD},{HH,MIN,SEC}}
+
+convert_request_date([D,A,Y,DateType|Rest]) ->
+ Func=case DateType of
+ $\, ->
+ fun convert_rfc1123_date/1;
+ $\ ->
+ fun convert_ascii_date/1;
+ _ ->
+ fun convert_rfc850_date/1
+ end,
+ case catch Func([D,A,Y,DateType|Rest])of
+ {ok,Date} ->
+ Date;
+ _Error ->
+ bad_date
+ end.
+
+convert_rfc850_date(DateStr) ->
+ case string:tokens(DateStr," ") of
+ [_WeekDay,Date,Time,_TimeZone|_Rest] ->
+ convert_rfc850_date(Date,Time);
+ _Error ->
+ bad_date
+ end.
+
+convert_rfc850_date([D1,D2,_,M,O,N,_,Y1,Y2|_Rest],[H1,H2,_Col,M1,M2,_Col,S1,S2|_Rest2])->
+ Year=list_to_integer([50,48,Y1,Y2]),
+ Day=list_to_integer([D1,D2]),
+ Month=convert_month([M,O,N]),
+ Hour=list_to_integer([H1,H2]),
+ Min=list_to_integer([M1,M2]),
+ Sec=list_to_integer([S1,S2]),
+ {ok,{{Year,Month,Day},{Hour,Min,Sec}}};
+convert_rfc850_date(_BadDate,_BadTime)->
+ bad_date.
+
+convert_ascii_date([_D,_A,_Y,_SP,M,O,N,_SP,D1,D2,_SP,H1,H2,_Col,M1,M2,_Col,S1,S2,_SP,Y1,Y2,Y3,Y4|_Rest])->
+ Year=list_to_integer([Y1,Y2,Y3,Y4]),
+ Day=case D1 of
+ $\ ->
+ list_to_integer([D2]);
+ _->
+ list_to_integer([D1,D2])
+ end,
+ Month=convert_month([M,O,N]),
+ Hour=list_to_integer([H1,H2]),
+ Min=list_to_integer([M1,M2]),
+ Sec=list_to_integer([S1,S2]),
+ {ok,{{Year,Month,Day},{Hour,Min,Sec}}};
+convert_ascii_date(BadDate)->
+ bad_date.
+convert_rfc1123_date([_D,_A,_Y,_C,_SP,D1,D2,_SP,M,O,N,_SP,Y1,Y2,Y3,Y4,_SP,H1,H2,_Col,M1,M2,_Col,S1,S2|Rest])->
+ Year=list_to_integer([Y1,Y2,Y3,Y4]),
+ Day=list_to_integer([D1,D2]),
+ Month=convert_month([M,O,N]),
+ Hour=list_to_integer([H1,H2]),
+ Min=list_to_integer([M1,M2]),
+ Sec=list_to_integer([S1,S2]),
+ {ok,{{Year,Month,Day},{Hour,Min,Sec}}};
+convert_rfc1123_date(BadDate)->
+ bad_date.
+
+convert_month("Jan")->1;
+convert_month("Feb") ->2;
+convert_month("Mar") ->3;
+convert_month("Apr") ->4;
+convert_month("May") ->5;
+convert_month("Jun") ->6;
+convert_month("Jul") ->7;
+convert_month("Aug") ->8;
+convert_month("Sep") ->9;
+convert_month("Oct") ->10;
+convert_month("Nov") ->11;
+convert_month("Dec") ->12.
+
+
+%% rfc1123_date
+
+rfc1123_date() ->
+ {{YYYY,MM,DD},{Hour,Min,Sec}}=calendar:universal_time(),
+ DayNumber=calendar:day_of_the_week({YYYY,MM,DD}),
+ lists:flatten(io_lib:format("~s, ~2.2.0w ~3.s ~4.4.0w ~2.2.0w:~2.2.0w:~2.2.0w GMT",
+ [day(DayNumber),DD,month(MM),YYYY,Hour,Min,Sec])).
+
+rfc1123_date({{YYYY,MM,DD},{Hour,Min,Sec}}) ->
+ DayNumber=calendar:day_of_the_week({YYYY,MM,DD}),
+ lists:flatten(io_lib:format("~s, ~2.2.0w ~3.s ~4.4.0w ~2.2.0w:~2.2.0w:~2.2.0w GMT",
+ [day(DayNumber),DD,month(MM),YYYY,Hour,Min,Sec])).
+
+%% uniq
+
+uniq([]) ->
+ [];
+uniq([First,First|Rest]) ->
+ uniq([First|Rest]);
+uniq([First|Rest]) ->
+ [First|uniq(Rest)].
+
+
+%% day
+
+day(1) -> "Mon";
+day(2) -> "Tue";
+day(3) -> "Wed";
+day(4) -> "Thu";
+day(5) -> "Fri";
+day(6) -> "Sat";
+day(7) -> "Sun".
+
+%% month
+
+month(1) -> "Jan";
+month(2) -> "Feb";
+month(3) -> "Mar";
+month(4) -> "Apr";
+month(5) -> "May";
+month(6) -> "Jun";
+month(7) -> "Jul";
+month(8) -> "Aug";
+month(9) -> "Sep";
+month(10) -> "Oct";
+month(11) -> "Nov";
+month(12) -> "Dec".
+
+%% decode_hex
+
+decode_hex([$%,Hex1,Hex2|Rest]) ->
+ [hex2dec(Hex1)*16+hex2dec(Hex2)|decode_hex(Rest)];
+decode_hex([First|Rest]) ->
+ [First|decode_hex(Rest)];
+decode_hex([]) ->
+ [].
+
+hex2dec(X) when X>=$0,X=<$9 -> X-$0;
+hex2dec(X) when X>=$A,X=<$F -> X-$A+10;
+hex2dec(X) when X>=$a,X=<$f -> X-$a+10.
+
+%% decode_base64 (DEBUG STRING: QWxhZGRpbjpvcGVuIHNlc2FtZQ==)
+
+decode_base64([]) ->
+ [];
+decode_base64([Sextet1,Sextet2,$=,$=|Rest]) ->
+ Bits2x6=
+ (d(Sextet1) bsl 18) bor
+ (d(Sextet2) bsl 12),
+ Octet1=Bits2x6 bsr 16,
+ [Octet1|decode_base64(Rest)];
+decode_base64([Sextet1,Sextet2,Sextet3,$=|Rest]) ->
+ Bits3x6=
+ (d(Sextet1) bsl 18) bor
+ (d(Sextet2) bsl 12) bor
+ (d(Sextet3) bsl 6),
+ Octet1=Bits3x6 bsr 16,
+ Octet2=(Bits3x6 bsr 8) band 16#ff,
+ [Octet1,Octet2|decode_base64(Rest)];
+decode_base64([Sextet1,Sextet2,Sextet3,Sextet4|Rest]) ->
+ Bits4x6=
+ (d(Sextet1) bsl 18) bor
+ (d(Sextet2) bsl 12) bor
+ (d(Sextet3) bsl 6) bor
+ d(Sextet4),
+ Octet1=Bits4x6 bsr 16,
+ Octet2=(Bits4x6 bsr 8) band 16#ff,
+ Octet3=Bits4x6 band 16#ff,
+ [Octet1,Octet2,Octet3|decode_base64(Rest)];
+decode_base64(CatchAll) ->
+ "BAD!".
+
+d(X) when X >= $A, X =<$Z ->
+ X-65;
+d(X) when X >= $a, X =<$z ->
+ X-71;
+d(X) when X >= $0, X =<$9 ->
+ X+4;
+d($+) -> 62;
+d($/) -> 63;
+d(_) -> 63.
+
+
+encode_base64([]) ->
+ [];
+encode_base64([A]) ->
+ [e(A bsr 2), e((A band 3) bsl 4), $=, $=];
+encode_base64([A,B]) ->
+ [e(A bsr 2), e(((A band 3) bsl 4) bor (B bsr 4)), e((B band 15) bsl 2), $=];
+encode_base64([A,B,C|Ls]) ->
+ encode_base64_do(A,B,C, Ls).
+encode_base64_do(A,B,C, Rest) ->
+ BB = (A bsl 16) bor (B bsl 8) bor C,
+ [e(BB bsr 18), e((BB bsr 12) band 63),
+ e((BB bsr 6) band 63), e(BB band 63)|encode_base64(Rest)].
+
+e(X) when X >= 0, X < 26 -> X+65;
+e(X) when X>25, X<52 -> X+71;
+e(X) when X>51, X<62 -> X-4;
+e(62) -> $+;
+e(63) -> $/;
+e(X) -> exit({bad_encode_base64_token, X}).
+
+
+%% flatlength
+
+flatlength(List) ->
+ flatlength(List, 0).
+
+flatlength([H|T],L) when list(H) ->
+ flatlength(H,flatlength(T,L));
+flatlength([H|T],L) when binary(H) ->
+ flatlength(T,L+size(H));
+flatlength([H|T],L) ->
+ flatlength(T,L+1);
+flatlength([],L) ->
+ L.
+
+%% split_path
+
+split_path(Path) ->
+ case regexp:match(Path,"[\?].*\$") of
+ %% A QUERY_STRING exists!
+ {match,Start,Length} ->
+ {httpd_util:decode_hex(string:substr(Path,1,Start-1)),
+ string:substr(Path,Start,Length)};
+ %% A possible PATH_INFO exists!
+ nomatch ->
+ split_path(Path,[])
+ end.
+
+split_path([],SoFar) ->
+ {httpd_util:decode_hex(lists:reverse(SoFar)),[]};
+split_path([$/|Rest],SoFar) ->
+ Path=httpd_util:decode_hex(lists:reverse(SoFar)),
+ case file:read_file_info(Path) of
+ {ok,FileInfo} when FileInfo#file_info.type == regular ->
+ {Path,[$/|Rest]};
+ {ok,FileInfo} ->
+ split_path(Rest,[$/|SoFar]);
+ {error,Reason} ->
+ split_path(Rest,[$/|SoFar])
+ end;
+split_path([C|Rest],SoFar) ->
+ split_path(Rest,[C|SoFar]).
+
+%% split_script_path
+
+split_script_path(Path) ->
+ case split_script_path(Path, []) of
+ {Script, AfterPath} ->
+ {PathInfo, QueryString} = pathinfo_querystring(AfterPath),
+ {Script, {PathInfo, QueryString}};
+ not_a_script ->
+ not_a_script
+ end.
+
+pathinfo_querystring(Str) ->
+ pathinfo_querystring(Str, []).
+pathinfo_querystring([], SoFar) ->
+ {lists:reverse(SoFar), []};
+pathinfo_querystring([$?|Rest], SoFar) ->
+ {lists:reverse(SoFar), Rest};
+pathinfo_querystring([C|Rest], SoFar) ->
+ pathinfo_querystring(Rest, [C|SoFar]).
+
+split_script_path([$?|QueryString], SoFar) ->
+ Path = httpd_util:decode_hex(lists:reverse(SoFar)),
+ case file:read_file_info(Path) of
+ {ok,FileInfo} when FileInfo#file_info.type == regular ->
+ {Path, [$?|QueryString]};
+ {ok,FileInfo} ->
+ not_a_script;
+ {error,Reason} ->
+ not_a_script
+ end;
+split_script_path([], SoFar) ->
+ Path = httpd_util:decode_hex(lists:reverse(SoFar)),
+ case file:read_file_info(Path) of
+ {ok,FileInfo} when FileInfo#file_info.type == regular ->
+ {Path, []};
+ {ok,FileInfo} ->
+ not_a_script;
+ {error,Reason} ->
+ not_a_script
+ end;
+split_script_path([$/|Rest], SoFar) ->
+ Path = httpd_util:decode_hex(lists:reverse(SoFar)),
+ case file:read_file_info(Path) of
+ {ok, FileInfo} when FileInfo#file_info.type == regular ->
+ {Path, [$/|Rest]};
+ {ok, _FileInfo} ->
+ split_script_path(Rest, [$/|SoFar]);
+ {error, _Reason} ->
+ split_script_path(Rest, [$/|SoFar])
+ end;
+split_script_path([C|Rest], SoFar) ->
+ split_script_path(Rest,[C|SoFar]).
+
+%% suffix
+
+suffix(Path) ->
+ case filename:extension(Path) of
+ [] ->
+ [];
+ Extension ->
+ tl(Extension)
+ end.
+
+%% to_upper
+
+to_upper([C|Cs]) when C >= $a, C =< $z ->
+ [C-($a-$A)|to_upper(Cs)];
+to_upper([C|Cs]) ->
+ [C|to_upper(Cs)];
+to_upper([]) ->
+ [].
+
+%% to_lower
+
+to_lower([C|Cs]) when C >= $A, C =< $Z ->
+ [C+($a-$A)|to_lower(Cs)];
+to_lower([C|Cs]) ->
+ [C|to_lower(Cs)];
+to_lower([]) ->
+ [].
+
+
+%% strip
+strip(Value)->
+ lists:reverse(remove_ws(lists:reverse(remove_ws(Value)))).
+
+remove_ws([$\s|Rest])->
+ remove_ws(Rest);
+remove_ws([$\t|Rest]) ->
+ remove_ws(Rest);
+remove_ws(Rest) ->
+ Rest.
+
+%% split
+
+split(String,RegExp,Limit) ->
+ case regexp:parse(RegExp) of
+ {error,Reason} ->
+ {error,Reason};
+ {ok,_} ->
+ {ok,do_split(String,RegExp,Limit)}
+ end.
+
+do_split(String,RegExp,1) ->
+ [String];
+
+do_split(String,RegExp,Limit) ->
+ case regexp:first_match(String,RegExp) of
+ {match,Start,Length} ->
+ [string:substr(String,1,Start-1)|
+ do_split(lists:nthtail(Start+Length-1,String),RegExp,Limit-1)];
+ nomatch ->
+ [String]
+ end.
+
+%% header
+header(StatusCode,Date)when list(Date)->
+ header(StatusCode,"text/plain",false);
+
+header(StatusCode, PersistentConnection) when integer(StatusCode)->
+ Date = rfc1123_date(),
+ Connection =
+ case PersistentConnection of
+ true ->
+ "";
+ _ ->
+ "Connection: close \r\n"
+ end,
+ io_lib:format("HTTP/1.1 ~w ~s \r\nDate: ~s\r\nServer: ~s\r\n~s",
+ [StatusCode, httpd_util:reason_phrase(StatusCode),
+ Date, ?SERVER_SOFTWARE, Connection]).
+
+%%----------------------------------------------------------------------
+
+header(StatusCode, MimeType, Date) when list(Date) ->
+ header(StatusCode, MimeType, false,rfc1123_date());
+
+
+header(StatusCode, MimeType, PersistentConnection) when integer(StatusCode) ->
+ header(StatusCode, MimeType, PersistentConnection,rfc1123_date()).
+
+
+%%----------------------------------------------------------------------
+
+header(416, MimeType,PersistentConnection,Date)->
+ Connection =
+ case PersistentConnection of
+ true ->
+ "";
+ _ ->
+ "Connection: close \r\n"
+ end,
+ io_lib:format("HTTP/1.1 ~w ~s \r\nDate: ~s\r\nServer: ~s\r\n"
+ "Content-Range:bytes *"
+ "Content-Type: ~s\r\n~s",
+ [416, httpd_util:reason_phrase(416),
+ Date, ?SERVER_SOFTWARE, MimeType, Connection]);
+
+
+header(StatusCode, MimeType,PersistentConnection,Date) when integer(StatusCode)->
+ Connection =
+ case PersistentConnection of
+ true ->
+ "";
+ _ ->
+ "Connection: close \r\n"
+ end,
+ io_lib:format("HTTP/1.1 ~w ~s \r\nDate: ~s\r\nServer: ~s\r\n"
+ "Content-Type: ~s\r\n~s",
+ [StatusCode, httpd_util:reason_phrase(StatusCode),
+ Date, ?SERVER_SOFTWARE, MimeType, Connection]).
+
+
+
+%% make_name/2, make_name/3
+%% Prefix -> string()
+%% First part of the name, e.g. "httpd"
+%% Addr -> {A,B,C,D} | string() | undefined
+%% The address part of the name.
+%% e.g. "123.234.55.66" or {123,234,55,66} or "otp.ericsson.se"
+%% for a host address or undefined if local host.
+%% Port -> integer()
+%% Last part of the name, such as the HTTPD server port
+%% number (80).
+%% Postfix -> Any string that will be added last to the name
+%%
+%% Example:
+%% make_name("httpd","otp.ericsson.se",80) => httpd__otp_ericsson_se__80
+%% make_name("httpd",undefined,8088) => httpd_8088
+
+make_name(Prefix,Port) ->
+ make_name(Prefix,undefined,Port,"").
+
+make_name(Prefix,Addr,Port) ->
+ make_name(Prefix,Addr,Port,"").
+
+make_name(Prefix,"*",Port,Postfix) ->
+ make_name(Prefix,undefined,Port,Postfix);
+
+make_name(Prefix,any,Port,Postfix) ->
+ make_name1(io_lib:format("~s_~w~s",[Prefix,Port,Postfix]));
+
+make_name(Prefix,undefined,Port,Postfix) ->
+ make_name1(io_lib:format("~s_~w~s",[Prefix,Port,Postfix]));
+
+make_name(Prefix,Addr,Port,Postfix) ->
+ NameString =
+ Prefix ++ "__" ++ make_name2(Addr) ++ "__" ++
+ integer_to_list(Port) ++ Postfix,
+ make_name1(NameString).
+
+make_name1(String) ->
+ list_to_atom(lists:flatten(String)).
+
+make_name2({A,B,C,D}) ->
+ io_lib:format("~w_~w_~w_~w",[A,B,C,D]);
+make_name2(Addr) ->
+ search_and_replace(Addr,$.,$_).
+
+search_and_replace(S,A,B) ->
+ Fun = fun(What) ->
+ case What of
+ A -> B;
+ O -> O
+ end
+ end,
+ lists:map(Fun,S).
+
+
+
+%%----------------------------------------------------------------------
+%% Converts a string that constists of 0-9,A-F,a-f to a
+%% integer
+%%----------------------------------------------------------------------
+
+hexlist_to_integer([])->
+ empty;
+
+
+%%When the string only contains one value its eaasy done.
+%% 0-9
+hexlist_to_integer([Size]) when Size>=48 , Size=<57 ->
+ Size-48;
+%% A-F
+hexlist_to_integer([Size]) when Size>=65 , Size=<70 ->
+ Size-55;
+%% a-f
+hexlist_to_integer([Size]) when Size>=97 , Size=<102 ->
+ Size-87;
+hexlist_to_integer([Size]) ->
+ not_a_num;
+
+hexlist_to_integer(Size) ->
+ Len=string:span(Size,"1234567890abcdefABCDEF"),
+ hexlist_to_integer2(Size,16 bsl (4 *(Len-2)),0).
+
+hexlist_to_integer2([],_Pos,Sum)->
+ Sum;
+hexlist_to_integer2([HexVal|HexString],Pos,Sum)when HexVal>=48,HexVal=<57->
+ hexlist_to_integer2(HexString,Pos bsr 4,Sum+((HexVal-48)*Pos));
+
+hexlist_to_integer2([HexVal|HexString],Pos,Sum)when HexVal>=65,HexVal=<70->
+ hexlist_to_integer2(HexString,Pos bsr 4,Sum+((HexVal-55)*Pos));
+
+hexlist_to_integer2([HexVal|HexString],Pos,Sum)when HexVal>=97,HexVal=<102->
+ hexlist_to_integer2(HexString,Pos bsr 4,Sum+((HexVal-87)*Pos));
+
+hexlist_to_integer2(_AfterHexString,_Pos,Sum)->
+ Sum.
+
+%%----------------------------------------------------------------------
+%%Converts an integer to an hexlist
+%%----------------------------------------------------------------------
+encode_hex(Num)->
+ integer_to_hexlist(Num).
+
+
+integer_to_hexlist(Num)->
+ integer_to_hexlist(Num,getSize(Num),[]).
+
+integer_to_hexlist(Num,Pot,Res) when Pot<0 ->
+ convert_to_ascii([Num|Res]);
+
+integer_to_hexlist(Num,Pot,Res) ->
+ Position=(16 bsl (Pot*4)),
+ PosVal=Num div Position,
+ integer_to_hexlist(Num-(PosVal*Position),Pot-1,[PosVal|Res]).
+convert_to_ascii(RevesedNum)->
+ convert_to_ascii(RevesedNum,[]).
+
+convert_to_ascii([],Num)->
+ Num;
+convert_to_ascii([Num|Reversed],Number)when Num>-1, Num<10 ->
+ convert_to_ascii(Reversed,[Num+48|Number]);
+convert_to_ascii([Num|Reversed],Number)when Num>9, Num<16 ->
+ convert_to_ascii(Reversed,[Num+55|Number]);
+convert_to_ascii(NumReversed,Number) ->
+ error.
+
+
+
+getSize(Num)->
+ getSize(Num,0).
+
+getSize(Num,Pot)when Num<(16 bsl(Pot *4)) ->
+ Pot-1;
+
+getSize(Num,Pot) ->
+ getSize(Num,Pot+1).
+
+
+
+
+
+create_etag(FileInfo)->
+ create_etag(FileInfo#file_info.mtime,FileInfo#file_info.size).
+
+create_etag({{Year,Month,Day},{Hour,Min,Sec}},Size)->
+ create_part([Year,Month,Day,Hour,Min,Sec])++io_lib:write(Size);
+
+create_etag(FileInfo,Size)->
+ create_etag(FileInfo#file_info.mtime,Size).
+
+create_part(Values)->
+ lists:map(fun(Val0)->
+ Val=Val0 rem 60,
+ if
+ Val=<25 ->
+ 65+Val; % A-Z
+ Val=<50 ->
+ 72+Val; % a-z
+ %%Since no date s
+ true ->
+ Val-3
+ end
+ end,Values).
+
+
+
+%%----------------------------------------------------------------------
+%%Function that controls whether a response is generated or not
+%%----------------------------------------------------------------------
+response_generated(Info)->
+ case httpd_util:key1search(Info#mod.data,status) of
+ %% A status code has been generated!
+ {StatusCode,PhraseArgs,Reason}->
+ true;
+ %%No status code control repsonsxe
+ undefined ->
+ case httpd_util:key1search(Info#mod.data, response) of
+ %% No response has been generated!
+ undefined ->
+ false;
+ %% A response has been generated or sent!
+ Response ->
+ true
+ end
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_verbosity.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_verbosity.erl
new file mode 100644
index 0000000000..f676eb4c99
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_verbosity.erl
@@ -0,0 +1,93 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: httpd_verbosity.erl,v 1.1 2008/12/17 09:53:34 mikpe Exp $
+%%
+-module(httpd_verbosity).
+
+-include_lib("stdlib/include/erl_compile.hrl").
+
+-export([print/4,print/5,printc/4,validate/1]).
+
+print(silence,_Severity,_Format,_Arguments) ->
+ ok;
+print(Verbosity,Severity,Format,Arguments) ->
+ print1(printable(Verbosity,Severity),Format,Arguments).
+
+
+print(silence,_Severity,_Module,_Format,_Arguments) ->
+ ok;
+print(Verbosity,Severity,Module,Format,Arguments) ->
+ print1(printable(Verbosity,Severity),Module,Format,Arguments).
+
+
+printc(silence,Severity,Format,Arguments) ->
+ ok;
+printc(Verbosity,Severity,Format,Arguments) ->
+ print2(printable(Verbosity,Severity),Format,Arguments).
+
+
+print1(false,_Format,_Arguments) -> ok;
+print1(Verbosity,Format,Arguments) ->
+ V = image_of_verbosity(Verbosity),
+ S = image_of_sname(get(sname)),
+ io:format("** HTTPD ~s ~s: " ++ Format ++ "~n",[S,V]++Arguments).
+
+print1(false,_Module,_Format,_Arguments) -> ok;
+print1(Verbosity,Module,Format,Arguments) ->
+ V = image_of_verbosity(Verbosity),
+ S = image_of_sname(get(sname)),
+ io:format("** HTTPD ~s ~s ~s: " ++ Format ++ "~n",[S,Module,V]++Arguments).
+
+
+print2(false,_Format,_Arguments) -> ok;
+print2(_Verbosity,Format,Arguments) ->
+ io:format(Format ++ "~n",Arguments).
+
+
+%% printable(Verbosity,Severity)
+printable(info,info) -> info;
+printable(log,info) -> info;
+printable(log,log) -> log;
+printable(debug,info) -> info;
+printable(debug,log) -> log;
+printable(debug,debug) -> debug;
+printable(trace,V) -> V;
+printable(_Verb,_Sev) -> false.
+
+
+image_of_verbosity(info) -> "INFO";
+image_of_verbosity(log) -> "LOG";
+image_of_verbosity(debug) -> "DEBUG";
+image_of_verbosity(trace) -> "TRACE";
+image_of_verbosity(_) -> "".
+
+%% ShortName
+image_of_sname(acc) -> "ACCEPTOR";
+image_of_sname(acc_sup) -> "ACCEPTOR_SUP";
+image_of_sname(auth) -> "AUTH";
+image_of_sname(man) -> "MANAGER";
+image_of_sname(misc_sup) -> "MISC_SUP";
+image_of_sname(sec) -> "SECURITY";
+image_of_sname(P) when pid(P) -> io_lib:format("REQUEST_HANDLER(~p)",[P]);
+image_of_sname(undefined) -> "";
+image_of_sname(V) -> io_lib:format("~p",[V]).
+
+
+validate(info) -> info;
+validate(log) -> log;
+validate(debug) -> debug;
+validate(trace) -> trace;
+validate(_) -> silence.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_verbosity.hrl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_verbosity.hrl
new file mode 100644
index 0000000000..cecaf693d3
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/httpd_verbosity.hrl
@@ -0,0 +1,62 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: httpd_verbosity.hrl,v 1.1 2008/12/17 09:53:34 mikpe Exp $
+%%
+
+-ifndef(dont_use_verbosity).
+
+-ifndef(default_verbosity).
+-define(default_verbosity,silence).
+-endif.
+
+-define(vvalidate(V), httpd_verbosity:validate(V)).
+
+-ifdef(VMODULE).
+
+-define(vinfo(F,A), httpd_verbosity:print(get(verbosity),info, ?VMODULE,F,A)).
+-define(vlog(F,A), httpd_verbosity:print(get(verbosity),log, ?VMODULE,F,A)).
+-define(vdebug(F,A),httpd_verbosity:print(get(verbosity),debug,?VMODULE,F,A)).
+-define(vtrace(F,A),httpd_verbosity:print(get(verbosity),trace,?VMODULE,F,A)).
+
+-else.
+
+-define(vinfo(F,A), httpd_verbosity:print(get(verbosity),info, F,A)).
+-define(vlog(F,A), httpd_verbosity:print(get(verbosity),log, F,A)).
+-define(vdebug(F,A),httpd_verbosity:print(get(verbosity),debug,F,A)).
+-define(vtrace(F,A),httpd_verbosity:print(get(verbosity),trace,F,A)).
+
+-endif.
+
+-define(vinfoc(F,A), httpd_verbosity:printc(get(verbosity),info, F,A)).
+-define(vlogc(F,A), httpd_verbosity:printc(get(verbosity),log, F,A)).
+-define(vdebugc(F,A),httpd_verbosity:printc(get(verbosity),debug,F,A)).
+-define(vtracec(F,A),httpd_verbosity:printc(get(verbosity),trace,F,A)).
+
+-else.
+
+-define(vvalidate(V),ok).
+
+-define(vinfo(F,A),ok).
+-define(vlog(F,A),ok).
+-define(vdebug(F,A),ok).
+-define(vtrace(F,A),ok).
+
+-define(vinfoc(F,A),ok).
+-define(vlogc(F,A),ok).
+-define(vdebugc(F,A),ok).
+-define(vtracec(F,A),ok).
+
+-endif.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/inets.app.src b/lib/dialyzer/test/r9c_SUITE_data/src/inets/inets.app.src
new file mode 100644
index 0000000000..750dbc6dba
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/inets.app.src
@@ -0,0 +1,56 @@
+{application,inets,
+ [{description,"INETS CXC 138 49"},
+ {vsn,"%VSN%"},
+ {modules,[
+ %% FTP
+ ftp,
+
+ %% HTTP client:
+ http,
+ http_lib,
+ httpc_handler,
+ httpc_manager,
+ uri,
+
+ %% HTTP server:
+ httpd,
+ httpd_acceptor,
+ httpd_acceptor_sup,
+ httpd_conf,
+ httpd_example,
+ httpd_manager,
+ httpd_misc_sup,
+ httpd_parse,
+ httpd_request_handler,
+ httpd_response,
+ httpd_socket,
+ httpd_sup,
+ httpd_util,
+ httpd_verbosity,
+ inets_sup,
+ mod_actions,
+ mod_alias,
+ mod_auth,
+ mod_auth_dets,
+ mod_auth_mnesia,
+ mod_auth_plain,
+ mod_auth_server,
+ mod_browser,
+ mod_cgi,
+ mod_dir,
+ mod_disk_log,
+ mod_esi,
+ mod_get,
+ mod_head,
+ mod_htaccess,
+ mod_include,
+ mod_log,
+ mod_range,
+ mod_responsecontrol,
+ mod_security,
+ mod_security_server,
+ mod_trace
+ ]},
+ {registered,[inets_sup]},
+ {applications,[kernel,stdlib]},
+ {mod,{inets_sup,[]}}]}.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/inets.appup.src b/lib/dialyzer/test/r9c_SUITE_data/src/inets/inets.appup.src
new file mode 100644
index 0000000000..e9ad0d0fe2
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/inets.appup.src
@@ -0,0 +1,133 @@
+{"%VSN%",
+ [{"3.0.5",
+ [
+ {load_module, ftp, soft_purge, soft_purge, []}
+ ]
+ },
+ {"3.0.4",
+ [
+ {update, httpd_acceptor, soft, soft_purge, soft_purge, []}
+ ]
+ },
+ {"3.0.3",
+ [{load_module, httpd, soft_purge, soft_purge, [httpd_conf, httpd_sup]},
+ {load_module, httpd_conf, soft_purge, soft_purge, []},
+ {load_module, httpd_socket, soft_purge, soft_purge, []},
+ {load_module, httpd_response, soft_purge, soft_purge, [mod_disk_log]},
+ {load_module, mod_disk_log, soft_purge, soft_purge, []},
+ {update, httpd_acceptor, soft, soft_purge, soft_purge, []},
+ {update, httpd_sup, soft, soft_purge, soft_purge, [httpd_manager]},
+ {update, httpd_manager, soft, soft_purge, soft_purge,
+ [mod_disk_log, httpd_conf, httpd_socket]}]
+ },
+ {"3.0.2",
+ [{load_module, httpd, soft_purge, soft_purge, [httpd_conf, httpd_sup]},
+ {load_module, httpd_conf, soft_purge, soft_purge, []},
+ {load_module, httpd_socket, soft_purge, soft_purge, []},
+ {load_module, mod_disk_log, soft_purge, soft_purge, []},
+ {load_module, httpd_response, soft_purge, soft_purge, [mod_disk_log]},
+ {update, httpd_sup, soft, soft_purge, soft_purge, [httpd_manager]},
+ {update, httpd_acceptor, soft, soft_purge, soft_purge, []},
+ {update, httpd_manager, soft, soft_purge, soft_purge,
+ [httpd_request_handler, httpd_conf, httpd_socket]},
+ {update, httpd_request_handler, soft, soft_purge, soft_purge,
+ [httpd_response]}]
+ },
+ {"3.0.1",
+ [{load_module, httpd, soft_purge, soft_purge, [httpd_conf, httpd_sup]},
+ {load_module, httpd_conf, soft_purge, soft_purge, []},
+ {load_module, httpd_socket, soft_purge, soft_purge, []},
+ {load_module, httpd_response, soft_purge, soft_purge,
+ [mod_auth, mod_disk_log]},
+ {load_module, mod_disk_log, soft_purge, soft_purge, []},
+ {load_module, mod_auth, soft_purge, soft_purge, []},
+ {update, httpd_sup, soft, soft_purge, soft_purge, [httpd_manager]},
+ {update, httpd_acceptor, soft, soft_purge, soft_purge, []},
+ {update, httpd_manager, soft, soft_purge, soft_purge,
+ [httpd_request_handler, httpd_conf, httpd_socket]},
+ {update, httpd_request_handler, soft, soft_purge, soft_purge,
+ [httpd_response]}]
+ },
+ {"3.0",
+ [{load_module, httpd, soft_purge, soft_purge, [httpd_conf, httpd_sup]},
+ {load_module, httpd_conf, soft_purge, soft_purge, []},
+ {load_module, httpd_socket, soft_purge, soft_purge, []},
+ {load_module, httpd_response, soft_purge, soft_purge,
+ [mod_auth, mod_disk_log]},
+ {load_module, mod_disk_log, soft_purge, soft_purge, []},
+ {load_module, mod_auth, soft_purge, soft_purge, []},
+ {update, httpd_sup, soft, soft_purge, soft_purge,
+ [httpd_manager, httpd_misc_sup]},
+ {update, httpd_misc_sup, soft, soft_purge, soft_purge, []},
+ {update, httpd_acceptor, soft, soft_purge, soft_purge, []},
+ {update, httpd_manager, soft, soft_purge, soft_purge,
+ [httpd_request_handler, httpd_conf, httpd_socket]},
+ {update, httpd_request_handler, soft, soft_purge, soft_purge,
+ [httpd_response]}]
+ }
+ ],
+ [{"3.0.5",
+ [
+ {load_module, ftp, soft_purge, soft_purge, []}
+ ]
+ },
+ {"3.0.4",
+ [{update, httpd_acceptor, soft, soft_purge, soft_purge, []}]
+ },
+ {"3.0.3",
+ [{load_module, httpd, soft_purge, soft_purge, [httpd_conf, httpd_sup]},
+ {load_module, httpd_conf, soft_purge, soft_purge, []},
+ {load_module, httpd_socket, soft_purge, soft_purge, []},
+ {load_module, httpd_response, soft_purge, soft_purge, [mod_disk_log]},
+ {load_module, mod_disk_log, soft_purge, soft_purge, []},
+ {update, httpd_sup, soft, soft_purge, soft_purge, [httpd_manager]},
+ {update, httpd_manager, soft, soft_purge, soft_purge,
+ [mod_disk_log, httpd_conf, httpd_socket]}]
+ },
+ {"3.0.2",
+ [{load_module, httpd, soft_purge, soft_purge, [httpd_conf, httpd_sup]},
+ {load_module, httpd_conf, soft_purge, soft_purge, []},
+ {load_module, httpd_socket, soft_purge, soft_purge, []},
+ {load_module, httpd_response, soft_purge, soft_purge, [mod_disk_log]},
+ {load_module, mod_disk_log, soft_purge, soft_purge, []},
+ {update, httpd_sup, soft, soft_purge, soft_purge, [httpd_manager]},
+ {update, httpd_acceptor, soft, soft_purge, soft_purge, []},
+ {update, httpd_manager, soft, soft_purge, soft_purge,
+ [httpd_request_handler, httpd_conf, httpd_socket]},
+ {update, httpd_request_handler, soft, soft_purge, soft_purge,
+ [httpd_response]}]
+ },
+ {"3.0.1",
+ [{load_module, httpd, soft_purge, soft_purge, [httpd_conf, httpd_sup]},
+ {load_module, httpd_conf, soft_purge, soft_purge, []},
+ {load_module, httpd_socket, soft_purge, soft_purge, []},
+ {load_module, httpd_response, soft_purge, soft_purge,
+ [mod_auth, mod_disk_log]},
+ {load_module, mod_disk_log, soft_purge, soft_purge, []},
+ {load_module, mod_auth, soft_purge, soft_purge, []},
+ {update, httpd_sup, soft, soft_purge, soft_purge, [httpd_manager]},
+ {update, httpd_acceptor, soft, soft_purge, soft_purge, []},
+ {update, httpd_manager, soft, soft_purge, soft_purge,
+ [httpd_request_handler, httpd_conf, httpd_socket]},
+ {update, httpd_request_handler, soft, soft_purge, soft_purge,
+ [httpd_response]}]
+ },
+ {"3.0",
+ [{load_module, httpd, soft_purge, soft_purge, [httpd_conf, httpd_sup]},
+ {load_module, httpd_conf, soft_purge, soft_purge, []},
+ {load_module, httpd_socket, soft_purge, soft_purge, []},
+ {load_module, httpd_response, soft_purge, soft_purge,
+ [mod_auth, mod_disk_log]},
+ {load_module, mod_disk_log, soft_purge, soft_purge, []},
+ {load_module, mod_auth, soft_purge, soft_purge, []},
+ {update, httpd_sup, soft, soft_purge, soft_purge,
+ [httpd_manager, httpd_misc_sup]},
+ {update, httpd_misc_sup, soft, soft_purge, soft_purge, []},
+ {update, httpd_acceptor, soft, soft_purge, soft_purge, []},
+ {update, httpd_manager, soft, soft_purge, soft_purge,
+ [httpd_request_handler, httpd_conf, httpd_socket]},
+ {update, httpd_request_handler, soft, soft_purge, soft_purge,
+ [httpd_response]}]
+ }
+ ]
+}.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/inets.config b/lib/dialyzer/test/r9c_SUITE_data/src/inets/inets.config
new file mode 100644
index 0000000000..814ddd9fc0
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/inets.config
@@ -0,0 +1,2 @@
+[{inets,[{services,[{httpd,"/var/tmp/server_root/conf/8888.conf"},
+ {httpd,"/var/tmp/server_root/conf/8080.conf"}]}]}].
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/inets_sup.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/inets_sup.erl
new file mode 100644
index 0000000000..878fa2c54b
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/inets_sup.erl
@@ -0,0 +1,158 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: inets_sup.erl,v 1.1 2008/12/17 09:53:34 mikpe Exp $
+%%
+-module(inets_sup).
+
+-export([crock/0]).
+-export([start/2, stop/1, init/1]).
+-export([start_child/2, stop_child/2, which_children/0]).
+
+
+%% crock (Used for debugging!)
+
+crock() ->
+ application:start(sasl),
+ application:start(inets).
+
+
+%% start
+
+start(Type, State) ->
+ supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+
+%% stop
+
+stop(State) ->
+ ok.
+
+
+%% start_child
+
+start_child(ConfigFile, Verbosity) ->
+ {ok, Spec} = httpd_child_spec(ConfigFile, Verbosity),
+ supervisor:start_child(?MODULE, Spec).
+
+
+%% stop_child
+
+stop_child(Addr, Port) ->
+ Name = {httpd_sup, Addr, Port},
+ case supervisor:terminate_child(?MODULE, Name) of
+ ok ->
+ supervisor:delete_child(?MODULE, Name);
+ Error ->
+ Error
+ end.
+
+
+%% which_children
+
+which_children() ->
+ supervisor:which_children(?MODULE).
+
+
+%% init
+
+init([]) ->
+ case get_services() of
+ {error, Reason} ->
+ {error,Reason};
+ Services ->
+ SupFlags = {one_for_one, 10, 3600},
+ {ok, {SupFlags, child_spec(Services, [])}}
+ end.
+
+get_services() ->
+ case (catch application:get_env(inets, services)) of
+ {ok, Services} ->
+ Services;
+ _ ->
+ []
+ end.
+
+
+child_spec([], Acc) ->
+ Acc;
+child_spec([{httpd, ConfigFile, Verbosity}|Rest], Acc) ->
+ case httpd_child_spec(ConfigFile, Verbosity) of
+ {ok, Spec} ->
+ child_spec(Rest, [Spec | Acc]);
+ {error, Reason} ->
+ error_msg("Failed creating child spec "
+ "using ~p for reason: ~p", [ConfigFile, Reason]),
+ child_spec(Rest, Acc)
+ end;
+child_spec([{httpd, ConfigFile}|Rest], Acc) ->
+ case httpd_child_spec(ConfigFile, []) of
+ {ok, Spec} ->
+ child_spec(Rest, [Spec | Acc]);
+ {error, Reason} ->
+ error_msg("Failed creating child spec "
+ "using ~p for reason: ~p", [ConfigFile, Reason]),
+ child_spec(Rest, Acc)
+ end.
+
+
+httpd_child_spec(ConfigFile, Verbosity) ->
+ case httpd_conf:load(ConfigFile) of
+ {ok, ConfigList} ->
+ Port = httpd_util:key1search(ConfigList, port, 80),
+ Addr = httpd_util:key1search(ConfigList, bind_address),
+ {ok, httpd_child_spec(ConfigFile, Addr, Port, Verbosity)};
+ Error ->
+ Error
+ end.
+
+
+httpd_child_spec(ConfigFile, Addr, Port, Verbosity) ->
+ {{httpd_sup, Addr, Port},{httpd_sup, start_link,[ConfigFile, Verbosity]},
+ permanent, 20000, supervisor,
+ [ftp,
+ httpd,
+ httpd_conf,
+ httpd_example,
+ httpd_manager,
+ httpd_misc_sup,
+ httpd_listener,
+ httpd_parse,
+ httpd_request,
+ httpd_response,
+ httpd_socket,
+ httpd_sup,
+ httpd_util,
+ httpd_verbosity,
+ inets_sup,
+ mod_actions,
+ mod_alias,
+ mod_auth,
+ mod_cgi,
+ mod_dir,
+ mod_disk_log,
+ mod_esi,
+ mod_get,
+ mod_head,
+ mod_include,
+ mod_log,
+ mod_auth_mnesia,
+ mod_auth_plain,
+ mod_auth_dets,
+ mod_security]}.
+
+
+error_msg(F, A) ->
+ error_logger:error_msg(F ++ "~n", A).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/jnets_httpd.hrl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/jnets_httpd.hrl
new file mode 100644
index 0000000000..0a96560c92
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/jnets_httpd.hrl
@@ -0,0 +1,138 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Mobile Arts AB
+%% Portions created by Mobile Arts are Copyright 2002, Mobile Arts AB
+%% All Rights Reserved.''
+%%
+%%
+
+-include_lib("kernel/include/file.hrl").
+
+-define(SOCKET_CHUNK_SIZE,8192).
+-define(SOCKET_MAX_POLL,25).
+-define(FILE_CHUNK_SIZE,64*1024).
+-define(NICE(Reason),lists:flatten(atom_to_list(?MODULE)++": "++Reason)).
+-define(DEFAULT_CONTEXT,
+ [{errmsg,"[an error occurred while processing this directive]"},
+ {timefmt,"%A, %d-%b-%y %T %Z"},
+ {sizefmt,"abbrev"}]).
+
+
+-ifdef(inets_debug).
+-define(DEBUG(Format, Args), io:format("D(~p:~p:~p) : "++Format++"~n",
+ [self(),?MODULE,?LINE]++Args)).
+-else.
+-define(DEBUG(F,A),[]).
+-endif.
+
+-define(MAXBODYSIZE,16#ffffffff).
+
+-define(HTTP_VERSION_10,0).
+-define(HTTP_VERSION_11,1).
+
+-define(CR,13).
+-define(LF,10).
+
+
+-record(init_data,{peername,resolve}).
+
+
+-record(mod,{
+ init_data, %
+ data= [], % list() Used to propagate data between modules
+ socket_type=ip_comm, % socket_type() IP or SSL socket
+ socket, % socket() Actual socket
+ config_db, % ets() {key,val} db with config entries
+ method, % atom() HTTP method, e.g. 'GET'
+% request_uri, % string() Request URI
+ path, % string() Absolute path. May include query etc
+ http_version, % int() HTTP minor version number, e.g. 0 or 1
+% request_line, % string() Request Line
+ headers, % #req_headers{} Parsed request headers
+ entity_body= <<>>, % binary() Body of request
+ connection, % boolean() true if persistant connection
+ status_code, % int() Status code
+ logging % int() 0=No logging
+ % 1=Only mod_log present
+ % 2=Only mod_disk_log present
+ % 3=Both mod_log and mod_disk_log present
+ }).
+
+% -record(ssl,{
+% certfile, %
+% keyfile, %
+% verify= 0, %
+% ciphers, %
+% password, %
+% depth = 1, %
+% cacertfile, %
+
+% cachetimeout % Found in yaws....
+% }).
+
+
+-record(http_request,{
+ method, % atom() if known else string() HTTP methd
+ path, % {abs_path,string()} URL path
+ version % {int(),int()} {Major,Minor} HTTP version
+ }).
+
+-record(http_response,{
+ version, % {int(),int()} {Major,Minor} HTTP version
+ status, % int() Status code
+ phrase % string() HTTP Reason phrase
+ }).
+
+
+%%% Request headers
+-record(req_headers,{
+%%% --- Standard "General" headers
+% cache_control,
+ connection="keep-alive",
+% date,
+% pragma,
+% trailer,
+ transfer_encoding,
+% upgrade,
+% via,
+% warning,
+%%% --- Standard "Request" headers
+% accept,
+% accept_charset,
+% accept_encoding,
+% accept_language,
+ authorization,
+ expect, %% FIXME! Update inet_drv.c!!
+% from,
+ host,
+ if_match,
+ if_modified_since,
+ if_none_match,
+ if_range,
+ if_unmodified_since,
+% max_forwards,
+% proxy_authorization,
+ range,
+% referer,
+% te, %% FIXME! Update inet_drv.c!!
+ user_agent,
+%%% --- Standard "Entity" headers
+% content_encoding,
+% content_language,
+ content_length="0",
+% content_location,
+% content_md5,
+% content_range,
+ content_type,
+% last_modified,
+ other=[] % (list) Key/Value list with other headers
+ }).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_actions.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_actions.erl
new file mode 100644
index 0000000000..47395d4c12
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_actions.erl
@@ -0,0 +1,92 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mod_actions.erl,v 1.1 2008/12/17 09:53:34 mikpe Exp $
+%%
+-module(mod_actions).
+-export([do/1,load/2]).
+
+-include("httpd.hrl").
+
+%% do
+
+do(Info) ->
+ case httpd_util:key1search(Info#mod.data,status) of
+ %% A status code has been generated!
+ {StatusCode,PhraseArgs,Reason} ->
+ {proceed,Info#mod.data};
+ %% No status code has been generated!
+ undefined ->
+ case httpd_util:key1search(Info#mod.data,response) of
+ %% No response has been generated!
+ undefined ->
+ Path=mod_alias:path(Info#mod.data,Info#mod.config_db,
+ Info#mod.request_uri),
+ Suffix=httpd_util:suffix(Path),
+ MimeType=httpd_util:lookup_mime(Info#mod.config_db,Suffix,
+ "text/plain"),
+ Actions=httpd_util:multi_lookup(Info#mod.config_db,action),
+ case action(Info#mod.request_uri,MimeType,Actions) of
+ {yes,RequestURI} ->
+ {proceed,[{new_request_uri,RequestURI}|Info#mod.data]};
+ no ->
+ Scripts=httpd_util:multi_lookup(Info#mod.config_db,script),
+ case script(Info#mod.request_uri,Info#mod.method,Scripts) of
+ {yes,RequestURI} ->
+ {proceed,[{new_request_uri,RequestURI}|Info#mod.data]};
+ no ->
+ {proceed,Info#mod.data}
+ end
+ end;
+ %% A response has been generated or sent!
+ Response ->
+ {proceed,Info#mod.data}
+ end
+ end.
+
+action(RequestURI,MimeType,[]) ->
+ no;
+action(RequestURI,MimeType,[{MimeType,CGIScript}|Rest]) ->
+ {yes,CGIScript++RequestURI};
+action(RequestURI,MimeType,[_|Rest]) ->
+ action(RequestURI,MimeType,Rest).
+
+script(RequestURI,Method,[]) ->
+ no;
+script(RequestURI,Method,[{Method,CGIScript}|Rest]) ->
+ {yes,CGIScript++RequestURI};
+script(RequestURI,Method,[_|Rest]) ->
+ script(RequestURI,Method,Rest).
+
+%%
+%% Configuration
+%%
+
+%% load
+
+load([$A,$c,$t,$i,$o,$n,$ |Action],[]) ->
+ case regexp:split(Action," ") of
+ {ok,[MimeType,CGIScript]} ->
+ {ok,[],{action,{MimeType,CGIScript}}};
+ {ok,_} ->
+ {error,?NICE(httpd_conf:clean(Action)++" is an invalid Action")}
+ end;
+load([$S,$c,$r,$i,$p,$t,$ |Script],[]) ->
+ case regexp:split(Script," ") of
+ {ok,[Method,CGIScript]} ->
+ {ok,[],{script,{Method,CGIScript}}};
+ {ok,_} ->
+ {error,?NICE(httpd_conf:clean(Script)++" is an invalid Script")}
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_alias.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_alias.erl
new file mode 100644
index 0000000000..6b8f7210c4
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_alias.erl
@@ -0,0 +1,175 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mod_alias.erl,v 1.1 2008/12/17 09:53:34 mikpe Exp $
+%%
+-module(mod_alias).
+-export([do/1,real_name/3,real_script_name/3,default_index/2,load/2,path/3]).
+
+-include("httpd.hrl").
+
+%% do
+
+do(Info) ->
+ ?DEBUG("do -> entry",[]),
+ case httpd_util:key1search(Info#mod.data,status) of
+ %% A status code has been generated!
+ {StatusCode,PhraseArgs,Reason} ->
+ {proceed,Info#mod.data};
+ %% No status code has been generated!
+ undefined ->
+ case httpd_util:key1search(Info#mod.data,response) of
+ %% No response has been generated!
+ undefined ->
+ do_alias(Info);
+ %% A response has been generated or sent!
+ Response ->
+ {proceed,Info#mod.data}
+ end
+ end.
+
+do_alias(Info) ->
+ ?DEBUG("do_alias -> Request URI: ~p",[Info#mod.request_uri]),
+ {ShortPath,Path,AfterPath} =
+ real_name(Info#mod.config_db,Info#mod.request_uri,
+ httpd_util:multi_lookup(Info#mod.config_db,alias)),
+ %% Relocate if a trailing slash is missing else proceed!
+ LastChar = lists:last(ShortPath),
+ case file:read_file_info(ShortPath) of
+ {ok,FileInfo} when FileInfo#file_info.type == directory,LastChar /= $/ ->
+ ?LOG("do_alias -> ~n"
+ " ShortPath: ~p~n"
+ " LastChar: ~p~n"
+ " FileInfo: ~p",
+ [ShortPath,LastChar,FileInfo]),
+ ServerName = httpd_util:lookup(Info#mod.config_db,server_name),
+ Port = port_string(httpd_util:lookup(Info#mod.config_db,port,80)),
+ URL = "http://"++ServerName++Port++Info#mod.request_uri++"/",
+ ReasonPhrase = httpd_util:reason_phrase(301),
+ Message = httpd_util:message(301,URL,Info#mod.config_db),
+ {proceed,
+ [{response,
+ {301, ["Location: ", URL, "\r\n"
+ "Content-Type: text/html\r\n",
+ "\r\n",
+ "<HTML>\n<HEAD>\n<TITLE>",ReasonPhrase,
+ "</TITLE>\n</HEAD>\n"
+ "<BODY>\n<H1>",ReasonPhrase,
+ "</H1>\n", Message,
+ "\n</BODY>\n</HTML>\n"]}}|
+ [{real_name,{Path,AfterPath}}|Info#mod.data]]};
+ NoFile ->
+ {proceed,[{real_name,{Path,AfterPath}}|Info#mod.data]}
+ end.
+
+port_string(80) ->
+ "";
+port_string(Port) ->
+ ":"++integer_to_list(Port).
+
+%% real_name
+
+real_name(ConfigDB, RequestURI,[]) ->
+ DocumentRoot = httpd_util:lookup(ConfigDB, document_root, ""),
+ RealName = DocumentRoot++RequestURI,
+ {ShortPath, _AfterPath} = httpd_util:split_path(RealName),
+ {Path, AfterPath}=httpd_util:split_path(default_index(ConfigDB,RealName)),
+ {ShortPath, Path, AfterPath};
+real_name(ConfigDB, RequestURI, [{FakeName,RealName}|Rest]) ->
+ case regexp:match(RequestURI, "^"++FakeName) of
+ {match, _, _} ->
+ {ok, ActualName, _} = regexp:sub(RequestURI,
+ "^"++FakeName, RealName),
+ {ShortPath, _AfterPath} = httpd_util:split_path(ActualName),
+ {Path, AfterPath} =
+ httpd_util:split_path(default_index(ConfigDB, ActualName)),
+ {ShortPath, Path, AfterPath};
+ nomatch ->
+ real_name(ConfigDB,RequestURI,Rest)
+ end.
+
+%% real_script_name
+
+real_script_name(ConfigDB,RequestURI,[]) ->
+ not_a_script;
+real_script_name(ConfigDB,RequestURI,[{FakeName,RealName}|Rest]) ->
+ case regexp:match(RequestURI,"^"++FakeName) of
+ {match,_,_} ->
+ {ok,ActualName,_}=regexp:sub(RequestURI,"^"++FakeName,RealName),
+ httpd_util:split_script_path(default_index(ConfigDB,ActualName));
+ nomatch ->
+ real_script_name(ConfigDB,RequestURI,Rest)
+ end.
+
+%% default_index
+
+default_index(ConfigDB, Path) ->
+ case file:read_file_info(Path) of
+ {ok, FileInfo} when FileInfo#file_info.type == directory ->
+ DirectoryIndex = httpd_util:lookup(ConfigDB, directory_index, []),
+ append_index(Path, DirectoryIndex);
+ _ ->
+ Path
+ end.
+
+append_index(RealName, []) ->
+ RealName;
+append_index(RealName, [Index|Rest]) ->
+ case file:read_file_info(filename:join(RealName, Index)) of
+ {error,Reason} ->
+ append_index(RealName, Rest);
+ _ ->
+ filename:join(RealName,Index)
+ end.
+
+%% path
+
+path(Data, ConfigDB, RequestURI) ->
+ case httpd_util:key1search(Data,real_name) of
+ undefined ->
+ DocumentRoot = httpd_util:lookup(ConfigDB, document_root, ""),
+ {Path,AfterPath} =
+ httpd_util:split_path(DocumentRoot++RequestURI),
+ Path;
+ {Path,AfterPath} ->
+ Path
+ end.
+
+%%
+%% Configuration
+%%
+
+%% load
+
+load([$D,$i,$r,$e,$c,$t,$o,$r,$y,$I,$n,$d,$e,$x,$ |DirectoryIndex],[]) ->
+ {ok, DirectoryIndexes} = regexp:split(DirectoryIndex," "),
+ {ok,[], {directory_index, DirectoryIndexes}};
+load([$A,$l,$i,$a,$s,$ |Alias],[]) ->
+ case regexp:split(Alias," ") of
+ {ok, [FakeName, RealName]} ->
+ {ok,[],{alias,{FakeName,RealName}}};
+ {ok, _} ->
+ {error,?NICE(httpd_conf:clean(Alias)++" is an invalid Alias")}
+ end;
+load([$S,$c,$r,$i,$p,$t,$A,$l,$i,$a,$s,$ |ScriptAlias],[]) ->
+ case regexp:split(ScriptAlias," ") of
+ {ok, [FakeName, RealName]} ->
+ %% Make sure the path always has a trailing slash..
+ RealName1 = filename:join(filename:split(RealName)),
+ {ok, [], {script_alias,{FakeName, RealName1++"/"}}};
+ {ok, _} ->
+ {error, ?NICE(httpd_conf:clean(ScriptAlias)++
+ " is an invalid ScriptAlias")}
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth.erl
new file mode 100644
index 0000000000..9f3289c826
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth.erl
@@ -0,0 +1,748 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mod_auth.erl,v 1.1 2008/12/17 09:53:34 mikpe Exp $
+%%
+-module(mod_auth).
+
+
+%% The functions that the webbserver call on startup stop
+%% and when the server traverse the modules.
+-export([do/1, load/2, store/2, remove/1]).
+
+%% User entries to the gen-server.
+-export([add_user/2, add_user/5, add_user/6,
+ add_group_member/3, add_group_member/4, add_group_member/5,
+ list_users/1, list_users/2, list_users/3,
+ delete_user/2, delete_user/3, delete_user/4,
+ delete_group_member/3, delete_group_member/4, delete_group_member/5,
+ list_groups/1, list_groups/2, list_groups/3,
+ delete_group/2, delete_group/3, delete_group/4,
+ get_user/2, get_user/3, get_user/4,
+ list_group_members/2, list_group_members/3, list_group_members/4,
+ update_password/6, update_password/5]).
+
+-include("httpd.hrl").
+-include("mod_auth.hrl").
+
+-define(VMODULE,"AUTH").
+-include("httpd_verbosity.hrl").
+
+-define(NOPASSWORD,"NoPassword").
+
+
+%% do
+do(Info) ->
+ ?vtrace("do", []),
+ case httpd_util:key1search(Info#mod.data,status) of
+ %% A status code has been generated!
+ {StatusCode,PhraseArgs,Reason} ->
+ {proceed, Info#mod.data};
+ %% No status code has been generated!
+ undefined ->
+ case httpd_util:key1search(Info#mod.data,response) of
+ %% No response has been generated!
+ undefined ->
+ Path = mod_alias:path(Info#mod.data,Info#mod.config_db,
+ Info#mod.request_uri),
+ %% Is it a secret area?
+ case secretp(Path,Info#mod.config_db) of
+ {yes, Directory, DirectoryData} ->
+ %% Authenticate (allow)
+ case allow((Info#mod.init_data)#init_data.peername,
+ Info#mod.socket_type,Info#mod.socket,
+ DirectoryData) of
+ allowed ->
+ case deny((Info#mod.init_data)#init_data.peername,
+ Info#mod.socket_type, Info#mod.socket,
+ DirectoryData) of
+ not_denied ->
+ case httpd_util:key1search(DirectoryData,
+ auth_type) of
+ undefined ->
+ {proceed, Info#mod.data};
+ none ->
+ {proceed, Info#mod.data};
+ AuthType ->
+ do_auth(Info,
+ Directory,
+ DirectoryData,
+ AuthType)
+ end;
+ {denied, Reason} ->
+ {proceed,
+ [{status,{403,Info#mod.request_uri,Reason}}|
+ Info#mod.data]}
+ end;
+ {not_allowed, Reason} ->
+ {proceed,[{status,{403,Info#mod.request_uri,Reason}}|
+ Info#mod.data]}
+ end;
+ no ->
+ {proceed, Info#mod.data}
+ end;
+ %% A response has been generated or sent!
+ Response ->
+ {proceed, Info#mod.data}
+ end
+ end.
+
+
+do_auth(Info, Directory, DirectoryData, AuthType) ->
+ %% Authenticate (require)
+ case require(Info, Directory, DirectoryData) of
+ authorized ->
+ {proceed,Info#mod.data};
+ {authorized, User} ->
+ {proceed, [{remote_user,User}|Info#mod.data]};
+ {authorization_failed, Reason} ->
+ ?vtrace("do_auth -> authorization_failed: ~p",[Reason]),
+ {proceed, [{status,{401,none,Reason}}|Info#mod.data]};
+ {authorization_required, Realm} ->
+ ?vtrace("do_auth -> authorization_required: ~p",[Realm]),
+ ReasonPhrase = httpd_util:reason_phrase(401),
+ Message = httpd_util:message(401,none,Info#mod.config_db),
+ {proceed,
+ [{response,
+ {401,
+ ["WWW-Authenticate: Basic realm=\"",Realm,
+ "\"\r\n\r\n","<HTML>\n<HEAD>\n<TITLE>",
+ ReasonPhrase,"</TITLE>\n",
+ "</HEAD>\n<BODY>\n<H1>",ReasonPhrase,
+ "</H1>\n",Message,"\n</BODY>\n</HTML>\n"]}}|
+ Info#mod.data]};
+ {status, {StatusCode,PhraseArgs,Reason}} ->
+ {proceed, [{status,{StatusCode,PhraseArgs,Reason}}|
+ Info#mod.data]}
+ end.
+
+
+%% require
+
+require(Info, Directory, DirectoryData) ->
+ ParsedHeader = Info#mod.parsed_header,
+ ValidUsers = httpd_util:key1search(DirectoryData, require_user),
+ ValidGroups = httpd_util:key1search(DirectoryData, require_group),
+
+ %% Any user or group restrictions?
+ case ValidGroups of
+ undefined when ValidUsers == undefined ->
+ authorized;
+ _ ->
+ case httpd_util:key1search(ParsedHeader, "authorization") of
+ %% Authorization required!
+ undefined ->
+ case httpd_util:key1search(DirectoryData, auth_name) of
+ undefined ->
+ {status,{500,none,?NICE("AuthName directive not specified")}};
+ Realm ->
+ {authorization_required, Realm}
+ end;
+ %% Check credentials!
+ [$B,$a,$s,$i,$c,$ | EncodedString] ->
+ DecodedString = httpd_util:decode_base64(EncodedString),
+ case a_valid_user(Info, DecodedString,
+ ValidUsers, ValidGroups,
+ Directory, DirectoryData) of
+ {yes, User} ->
+ {authorized, User};
+ {no, Reason} ->
+ {authorization_failed, Reason};
+ {status, {StatusCode,PhraseArgs,Reason}} ->
+ {status,{StatusCode,PhraseArgs,Reason}}
+ end;
+ %% Bad credentials!
+ BadCredentials ->
+ {status,{401,none,?NICE("Bad credentials "++BadCredentials)}}
+ end
+ end.
+
+a_valid_user(Info,DecodedString,ValidUsers,ValidGroups,Dir,DirData) ->
+ case httpd_util:split(DecodedString,":",2) of
+ {ok,[SupposedUser, Password]} ->
+ case user_accepted(SupposedUser, ValidUsers) of
+ true ->
+ check_password(SupposedUser, Password, Dir, DirData);
+ false ->
+ case group_accepted(Info,SupposedUser,ValidGroups,Dir,DirData) of
+ true ->
+ check_password(SupposedUser,Password,Dir,DirData);
+ false ->
+ {no,?NICE("No such user exists")}
+ end
+ end;
+ {ok,BadCredentials} ->
+ {status,{401,none,?NICE("Bad credentials "++BadCredentials)}}
+ end.
+
+user_accepted(SupposedUser, undefined) ->
+ false;
+user_accepted(SupposedUser, ValidUsers) ->
+ lists:member(SupposedUser, ValidUsers).
+
+
+group_accepted(Info, User, undefined, Dir, DirData) ->
+ false;
+group_accepted(Info, User, [], Dir, DirData) ->
+ false;
+group_accepted(Info, User, [Group|Rest], Dir, DirData) ->
+ Ret = int_list_group_members(Group, Dir, DirData),
+ case Ret of
+ {ok, UserList} ->
+ case lists:member(User, UserList) of
+ true ->
+ true;
+ false ->
+ group_accepted(Info, User, Rest, Dir, DirData)
+ end;
+ Other ->
+ false
+ end.
+
+check_password(User, Password, Dir, DirData) ->
+ case int_get_user(DirData, User) of
+ {ok, UStruct} ->
+ case UStruct#httpd_user.password of
+ Password ->
+ %% FIXME
+ {yes, UStruct#httpd_user.username};
+ Other ->
+ {no, "No such user"} % Don't say 'Bad Password' !!!
+ end;
+ _ ->
+ {no, "No such user"}
+ end.
+
+
+%% Middle API. Theese functions call the appropriate authentication module.
+int_get_user(DirData, User) ->
+ AuthMod = auth_mod_name(DirData),
+ apply(AuthMod, get_user, [DirData, User]).
+
+int_list_group_members(Group, Dir, DirData) ->
+ AuthMod = auth_mod_name(DirData),
+ apply(AuthMod, list_group_members, [DirData, Group]).
+
+auth_mod_name(DirData) ->
+ case httpd_util:key1search(DirData, auth_type, plain) of
+ plain -> mod_auth_plain;
+ mnesia -> mod_auth_mnesia;
+ dets -> mod_auth_dets
+ end.
+
+
+%%
+%% Is it a secret area?
+%%
+
+%% secretp
+
+secretp(Path,ConfigDB) ->
+ Directories = ets:match(ConfigDB,{directory,'$1','_'}),
+ case secret_path(Path, Directories) of
+ {yes,Directory} ->
+ {yes,Directory,
+ lists:flatten(ets:match(ConfigDB,{directory,Directory,'$1'}))};
+ no ->
+ no
+ end.
+
+secret_path(Path,Directories) ->
+ secret_path(Path, httpd_util:uniq(lists:sort(Directories)),to_be_found).
+
+secret_path(Path,[],to_be_found) ->
+ no;
+secret_path(Path,[],Directory) ->
+ {yes,Directory};
+secret_path(Path,[[NewDirectory]|Rest],Directory) ->
+ case regexp:match(Path,NewDirectory) of
+ {match,_,_} when Directory == to_be_found ->
+ secret_path(Path,Rest,NewDirectory);
+ {match,_,Length} when Length > length(Directory)->
+ secret_path(Path,Rest,NewDirectory);
+ {match,_,Length} ->
+ secret_path(Path,Rest,Directory);
+ nomatch ->
+ secret_path(Path,Rest,Directory)
+ end.
+
+%%
+%% Authenticate
+%%
+
+%% allow
+
+allow({_,RemoteAddr},SocketType,Socket,DirectoryData) ->
+ Hosts = httpd_util:key1search(DirectoryData, allow_from, all),
+ case validate_addr(RemoteAddr,Hosts) of
+ true ->
+ allowed;
+ false ->
+ {not_allowed, ?NICE("Connection from your host is not allowed")}
+ end.
+
+validate_addr(RemoteAddr,all) -> % When called from 'allow'
+ true;
+validate_addr(RemoteAddr,none) -> % When called from 'deny'
+ false;
+validate_addr(RemoteAddr,[]) ->
+ false;
+validate_addr(RemoteAddr,[HostRegExp|Rest]) ->
+ ?DEBUG("validate_addr -> RemoteAddr: ~p HostRegExp: ~p",
+ [RemoteAddr, HostRegExp]),
+ case regexp:match(RemoteAddr, HostRegExp) of
+ {match,_,_} ->
+ true;
+ nomatch ->
+ validate_addr(RemoteAddr,Rest)
+ end.
+
+%% deny
+
+deny({_,RemoteAddr},SocketType,Socket,DirectoryData) ->
+ ?DEBUG("deny -> RemoteAddr: ~p",[RemoteAddr]),
+ Hosts = httpd_util:key1search(DirectoryData, deny_from, none),
+ ?DEBUG("deny -> Hosts: ~p",[Hosts]),
+ case validate_addr(RemoteAddr,Hosts) of
+ true ->
+ {denied, ?NICE("Connection from your host is not allowed")};
+ false ->
+ not_denied
+ end.
+
+%%
+%% Configuration
+%%
+
+%% load/2
+%%
+
+%% mod_auth recognizes the following Configuration Directives:
+%% <Directory /path/to/directory>
+%% AuthDBType
+%% AuthName
+%% AuthUserFile
+%% AuthGroupFile
+%% AuthAccessPassword
+%% require
+%% allow
+%% </Directory>
+
+%% When a <Directory> directive is found, a new context is set to
+%% [{directory, Directory, DirData}|OtherContext]
+%% DirData in this case is a key-value list of data belonging to the
+%% directory in question.
+%%
+%% When the </Directory> statement is found, the Context created earlier
+%% will be returned as a ConfigList and the context will return to the
+%% state it was previously.
+
+load([$<,$D,$i,$r,$e,$c,$t,$o,$r,$y,$ |Directory],[]) ->
+ Dir = httpd_conf:custom_clean(Directory,"",">"),
+ {ok,[{directory, Dir, [{path, Dir}]}]};
+load(eof,[{directory,Directory, DirData}|_]) ->
+ {error, ?NICE("Premature end-of-file in "++Directory)};
+
+load([$A,$u,$t,$h,$N,$a,$m,$e,$ |AuthName], [{directory,Directory, DirData}|Rest]) ->
+ {ok, [{directory,Directory,
+ [ {auth_name, httpd_conf:clean(AuthName)}|DirData]} | Rest ]};
+
+load([$A,$u,$t,$h,$U,$s,$e,$r,$F,$i,$l,$e,$ |AuthUserFile0],
+ [{directory, Directory, DirData}|Rest]) ->
+ AuthUserFile = httpd_conf:clean(AuthUserFile0),
+ {ok,[{directory,Directory,
+ [ {auth_user_file, AuthUserFile}|DirData]} | Rest ]};
+
+load([$A,$u,$t,$h,$G,$r,$o,$u,$p,$F,$i,$l,$e,$ |AuthGroupFile0],
+ [{directory,Directory, DirData}|Rest]) ->
+ AuthGroupFile = httpd_conf:clean(AuthGroupFile0),
+ {ok,[{directory,Directory,
+ [ {auth_group_file, AuthGroupFile}|DirData]} | Rest]};
+
+%AuthAccessPassword
+load([$A,$u,$t,$h,$A,$c,$c,$e,$s,$s,$P,$a,$s,$s,$w,$o,$r,$d,$ |AuthAccessPassword0],
+ [{directory,Directory, DirData}|Rest]) ->
+ AuthAccessPassword = httpd_conf:clean(AuthAccessPassword0),
+ {ok,[{directory,Directory,
+ [{auth_access_password, AuthAccessPassword}|DirData]} | Rest]};
+
+
+
+
+load([$A,$u,$t,$h,$D,$B,$T,$y,$p,$e,$ |Type],
+ [{directory, Dir, DirData}|Rest]) ->
+ case httpd_conf:clean(Type) of
+ "plain" ->
+ {ok, [{directory, Dir, [{auth_type, plain}|DirData]} | Rest ]};
+ "mnesia" ->
+ {ok, [{directory, Dir, [{auth_type, mnesia}|DirData]} | Rest ]};
+ "dets" ->
+ {ok, [{directory, Dir, [{auth_type, dets}|DirData]} | Rest ]};
+ _ ->
+ {error, ?NICE(httpd_conf:clean(Type)++" is an invalid AuthDBType")}
+ end;
+
+load([$r,$e,$q,$u,$i,$r,$e,$ |Require],[{directory,Directory, DirData}|Rest]) ->
+ case regexp:split(Require," ") of
+ {ok,["user"|Users]} ->
+ {ok,[{directory,Directory,
+ [{require_user,Users}|DirData]} | Rest]};
+ {ok,["group"|Groups]} ->
+ {ok,[{directory,Directory,
+ [{require_group,Groups}|DirData]} | Rest]};
+ {ok,_} ->
+ {error,?NICE(httpd_conf:clean(Require)++" is an invalid require")}
+ end;
+
+load([$a,$l,$l,$o,$w,$ |Allow],[{directory,Directory, DirData}|Rest]) ->
+ case regexp:split(Allow," ") of
+ {ok,["from","all"]} ->
+ {ok,[{directory,Directory,
+ [{allow_from,all}|DirData]} | Rest]};
+ {ok,["from"|Hosts]} ->
+ {ok,[{directory,Directory,
+ [{allow_from,Hosts}|DirData]} | Rest]};
+ {ok,_} ->
+ {error,?NICE(httpd_conf:clean(Allow)++" is an invalid allow")}
+ end;
+
+load([$d,$e,$n,$y,$ |Deny],[{directory,Directory, DirData}|Rest]) ->
+ case regexp:split(Deny," ") of
+ {ok, ["from", "all"]} ->
+ {ok,[{directory, Directory,
+ [{deny_from, all}|DirData]} | Rest]};
+ {ok, ["from"|Hosts]} ->
+ {ok,[{directory, Directory,
+ [{deny_from, Hosts}|DirData]} | Rest]};
+ {ok, _} ->
+ {error,?NICE(httpd_conf:clean(Deny)++" is an invalid deny")}
+ end;
+
+load("</Directory>",[{directory,Directory, DirData}|Rest]) ->
+ {ok, Rest, {directory, Directory, DirData}};
+
+load([$A,$u,$t,$h,$M,$n,$e,$s,$i,$a,$D,$B,$ |AuthMnesiaDB],
+ [{directory, Dir, DirData}|Rest]) ->
+ case httpd_conf:clean(AuthMnesiaDB) of
+ "On" ->
+ {ok,[{directory,Dir,[{auth_type,mnesia}|DirData]}|Rest]};
+ "Off" ->
+ {ok,[{directory,Dir,[{auth_type,plain}|DirData]}|Rest]};
+ _ ->
+ {error, ?NICE(httpd_conf:clean(AuthMnesiaDB)++" is an invalid AuthMnesiaDB")}
+ end.
+
+%% store
+
+store({directory,Directory0, DirData0}, ConfigList) ->
+ Port = httpd_util:key1search(ConfigList, port),
+ DirData = case httpd_util:key1search(ConfigList, bind_address) of
+ undefined ->
+ [{port, Port}|DirData0];
+ Addr ->
+ [{port, Port},{bind_address,Addr}|DirData0]
+ end,
+ Directory =
+ case filename:pathtype(Directory0) of
+ relative ->
+ SR = httpd_util:key1search(ConfigList, server_root),
+ filename:join(SR, Directory0);
+ _ ->
+ Directory0
+ end,
+ AuthMod =
+ case httpd_util:key1search(DirData0, auth_type) of
+ mnesia -> mod_auth_mnesia;
+ dets -> mod_auth_dets;
+ plain -> mod_auth_plain;
+ _ -> no_module_at_all
+ end,
+ case AuthMod of
+ no_module_at_all ->
+ {ok, {directory, Directory, DirData}};
+ _ ->
+ %% Control that there are a password or add a standard password:
+ %% "NoPassword"
+ %% In this way a user must select to use a noPassword
+ Pwd = case httpd_util:key1search(DirData,auth_access_password)of
+ undefined->
+ ?NOPASSWORD;
+ PassW->
+ PassW
+ end,
+ DirDataLast = lists:keydelete(auth_access_password,1,DirData),
+ case catch AuthMod:store_directory_data(Directory, DirDataLast) of
+ ok ->
+ add_auth_password(Directory,Pwd,ConfigList),
+ {ok, {directory, Directory, DirDataLast}};
+ {ok, NewDirData} ->
+ add_auth_password(Directory,Pwd,ConfigList),
+ {ok, {directory, Directory, NewDirData}};
+ {error, Reason} ->
+ {error, Reason};
+ Other ->
+ ?ERROR("unexpected result: ~p",[Other]),
+ {error, Other}
+ end
+ end.
+
+
+add_auth_password(Dir, Pwd0, ConfigList) ->
+ Addr = httpd_util:key1search(ConfigList, bind_address),
+ Port = httpd_util:key1search(ConfigList, port),
+ mod_auth_server:start(Addr, Port),
+ mod_auth_server:add_password(Addr, Port, Dir, Pwd0).
+
+%% remove
+
+
+remove(ConfigDB) ->
+ lists:foreach(fun({directory, Dir, DirData}) ->
+ AuthMod = auth_mod_name(DirData),
+ (catch apply(AuthMod, remove, [DirData]))
+ end,
+ ets:match_object(ConfigDB,{directory,'_','_'})),
+ Addr = case lookup(ConfigDB, bind_address) of
+ [] ->
+ undefined;
+ [{bind_address, Address}] ->
+ Address
+ end,
+ [{port, Port}] = lookup(ConfigDB, port),
+ mod_auth_server:stop(Addr, Port),
+ ok.
+
+
+
+
+%% --------------------------------------------------------------------
+
+%% update_password
+
+update_password(Port, Dir, Old, New, New)->
+ update_password(undefined, Port, Dir, Old, New, New).
+
+update_password(Addr, Port, Dir, Old, New, New) when list(New) ->
+ mod_auth_server:update_password(Addr, Port, Dir, Old, New);
+
+update_password(_Addr, _Port, _Dir, _Old, New, New) ->
+ {error, badtype};
+update_password(_Addr, _Port, _Dir, _Old, New, New1) ->
+ {error, notqeual}.
+
+
+%% add_user
+
+add_user(UserName, Opt) ->
+ case get_options(Opt, mandatory) of
+ {Addr, Port, Dir, AuthPwd}->
+ case get_options(Opt, userData) of
+ {error, Reason}->
+ {error, Reason};
+ {UserData, Password}->
+ User = [#httpd_user{username = UserName,
+ password = Password,
+ user_data = UserData}],
+ mod_auth_server:add_user(Addr, Port, Dir, User, AuthPwd);
+ {error, Reason} ->
+ {error, Reason}
+ end
+ end.
+
+
+add_user(UserName, Password, UserData, Port, Dir) ->
+ add_user(UserName, Password, UserData, undefined, Port, Dir).
+add_user(UserName, Password, UserData, Addr, Port, Dir) ->
+ User = [#httpd_user{username = UserName,
+ password = Password,
+ user_data = UserData}],
+ mod_auth_server:add_user(Addr, Port, Dir, User, ?NOPASSWORD).
+
+
+%% get_user
+
+get_user(UserName, Opt) ->
+ case get_options(Opt, mandatory) of
+ {Addr, Port, Dir, AuthPwd} ->
+ mod_auth_server:get_user(Addr, Port, Dir, UserName, AuthPwd);
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+get_user(UserName, Port, Dir) ->
+ get_user(UserName, undefined, Port, Dir).
+get_user(UserName, Addr, Port, Dir) ->
+ mod_auth_server:get_user(Addr, Port, Dir, UserName, ?NOPASSWORD).
+
+
+%% add_group_member
+
+add_group_member(GroupName, UserName, Opt)->
+ case get_options(Opt, mandatory) of
+ {Addr, Port, Dir, AuthPwd}->
+ mod_auth_server:add_group_member(Addr, Port, Dir,
+ GroupName, UserName, AuthPwd);
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+add_group_member(GroupName, UserName, Port, Dir) ->
+ add_group_member(GroupName, UserName, undefined, Port, Dir).
+
+add_group_member(GroupName, UserName, Addr, Port, Dir) ->
+ mod_auth_server:add_group_member(Addr, Port, Dir,
+ GroupName, UserName, ?NOPASSWORD).
+
+
+%% delete_group_member
+
+delete_group_member(GroupName, UserName, Opt) ->
+ case get_options(Opt, mandatory) of
+ {Addr, Port, Dir, AuthPwd} ->
+ mod_auth_server:delete_group_member(Addr, Port, Dir,
+ GroupName, UserName, AuthPwd);
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+delete_group_member(GroupName, UserName, Port, Dir) ->
+ delete_group_member(GroupName, UserName, undefined, Port, Dir).
+delete_group_member(GroupName, UserName, Addr, Port, Dir) ->
+ mod_auth_server:delete_group_member(Addr, Port, Dir,
+ GroupName, UserName, ?NOPASSWORD).
+
+
+%% list_users
+
+list_users(Opt) ->
+ case get_options(Opt, mandatory) of
+ {Addr, Port, Dir, AuthPwd} ->
+ mod_auth_server:list_users(Addr, Port, Dir, AuthPwd);
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+list_users(Port, Dir) ->
+ list_users(undefined, Port, Dir).
+list_users(Addr, Port, Dir) ->
+ mod_auth_server:list_users(Addr, Port, Dir, ?NOPASSWORD).
+
+
+%% delete_user
+
+delete_user(UserName, Opt) ->
+ case get_options(Opt, mandatory) of
+ {Addr, Port, Dir, AuthPwd} ->
+ mod_auth_server:delete_user(Addr, Port, Dir, UserName, AuthPwd);
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+delete_user(UserName, Port, Dir) ->
+ delete_user(UserName, undefined, Port, Dir).
+delete_user(UserName, Addr, Port, Dir) ->
+ mod_auth_server:delete_user(Addr, Port, Dir, UserName, ?NOPASSWORD).
+
+
+%% delete_group
+
+delete_group(GroupName, Opt) ->
+ case get_options(Opt, mandatory) of
+ {Addr, Port, Dir, AuthPwd}->
+ mod_auth_server:delete_group(Addr, Port, Dir, GroupName, AuthPwd);
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+delete_group(GroupName, Port, Dir) ->
+ delete_group(GroupName, undefined, Port, Dir).
+delete_group(GroupName, Addr, Port, Dir) ->
+ mod_auth_server:delete_group(Addr, Port, Dir, GroupName, ?NOPASSWORD).
+
+
+%% list_groups
+
+list_groups(Opt) ->
+ case get_options(Opt, mandatory) of
+ {Addr, Port, Dir, AuthPwd}->
+ mod_auth_server:list_groups(Addr, Port, Dir, AuthPwd);
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+list_groups(Port, Dir) ->
+ list_groups(undefined, Port, Dir).
+list_groups(Addr, Port, Dir) ->
+ mod_auth_server:list_groups(Addr, Port, Dir, ?NOPASSWORD).
+
+
+%% list_group_members
+
+list_group_members(GroupName,Opt) ->
+ case get_options(Opt, mandatory) of
+ {Addr, Port, Dir, AuthPwd} ->
+ mod_auth_server:list_group_members(Addr, Port, Dir, GroupName,
+ AuthPwd);
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+list_group_members(GroupName, Port, Dir) ->
+ list_group_members(GroupName, undefined, Port, Dir).
+list_group_members(GroupName, Addr, Port, Dir) ->
+ mod_auth_server:list_group_members(Addr, Port, Dir, GroupName, ?NOPASSWORD).
+
+
+
+%% Opt = [{port, Port},
+%% {addr, Addr},
+%% {dir, Dir},
+%% {authPassword, AuthPassword} | FunctionSpecificData]
+get_options(Opt, mandatory)->
+ case httpd_util:key1search(Opt, port, undefined) of
+ Port when integer(Port) ->
+ case httpd_util:key1search(Opt, dir, undefined) of
+ Dir when list(Dir) ->
+ Addr = httpd_util:key1search(Opt,
+ addr,
+ undefined),
+ AuthPwd = httpd_util:key1search(Opt,
+ authPassword,
+ ?NOPASSWORD),
+ {Addr, Port, Dir, AuthPwd};
+ _->
+ {error, bad_dir}
+ end;
+ _ ->
+ {error, bad_dir}
+ end;
+
+%% FunctionSpecificData = {userData, UserData} | {password, Password}
+get_options(Opt, userData)->
+ case httpd_util:key1search(Opt, userData, undefined) of
+ undefined ->
+ {error, no_userdata};
+ UserData ->
+ case httpd_util:key1search(Opt, password, undefined) of
+ undefined->
+ {error, no_password};
+ Pwd ->
+ {UserData, Pwd}
+ end
+ end.
+
+
+lookup(Db, Key) ->
+ ets:lookup(Db, Key).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth.hrl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth.hrl
new file mode 100644
index 0000000000..2b8ea6657f
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth.hrl
@@ -0,0 +1,26 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mod_auth.hrl,v 1.1 2008/12/17 09:53:34 mikpe Exp $
+%%
+
+-record(httpd_user,
+ {username,
+ password,
+ user_data}).
+
+-record(httpd_group,
+ {name,
+ userlist}).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth_dets.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth_dets.erl
new file mode 100644
index 0000000000..d947d6cf49
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth_dets.erl
@@ -0,0 +1,222 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mod_auth_dets.erl,v 1.1 2008/12/17 09:53:35 mikpe Exp $
+%%
+-module(mod_auth_dets).
+
+%% dets authentication storage
+
+-export([get_user/2,
+ list_group_members/2,
+ add_user/2,
+ add_group_member/3,
+ list_users/1,
+ delete_user/2,
+ list_groups/1,
+ delete_group_member/3,
+ delete_group/2,
+ remove/1]).
+
+-export([store_directory_data/2]).
+
+-include("httpd.hrl").
+-include("mod_auth.hrl").
+
+store_directory_data(Directory, DirData) ->
+ ?CDEBUG("store_directory_data -> ~n"
+ " Directory: ~p~n"
+ " DirData: ~p",
+ [Directory, DirData]),
+
+ PWFile = httpd_util:key1search(DirData, auth_user_file),
+ GroupFile = httpd_util:key1search(DirData, auth_group_file),
+ Addr = httpd_util:key1search(DirData, bind_address),
+ Port = httpd_util:key1search(DirData, port),
+
+ PWName = httpd_util:make_name("httpd_dets_pwdb",Addr,Port),
+ case dets:open_file(PWName,[{type,set},{file,PWFile},{repair,true}]) of
+ {ok, PWDB} ->
+ GDBName = httpd_util:make_name("httpd_dets_groupdb",Addr,Port),
+ case dets:open_file(GDBName,[{type,set},{file,GroupFile},{repair,true}]) of
+ {ok, GDB} ->
+ NDD1 = lists:keyreplace(auth_user_file, 1, DirData,
+ {auth_user_file, PWDB}),
+ NDD2 = lists:keyreplace(auth_group_file, 1, NDD1,
+ {auth_group_file, GDB}),
+ {ok, NDD2};
+ {error, Err}->
+ {error, {{file, GroupFile},Err}}
+ end;
+ {error, Err2} ->
+ {error, {{file, PWFile},Err2}}
+ end.
+
+%%
+%% Storage format of users in the dets table:
+%% {{UserName, Addr, Port, Dir}, Password, UserData}
+%%
+
+add_user(DirData, UStruct) ->
+ {Addr, Port, Dir} = lookup_common(DirData),
+ PWDB = httpd_util:key1search(DirData, auth_user_file),
+ Record = {{UStruct#httpd_user.username, Addr, Port, Dir},
+ UStruct#httpd_user.password, UStruct#httpd_user.user_data},
+ case dets:lookup(PWDB, UStruct#httpd_user.username) of
+ [Record] ->
+ {error, user_already_in_db};
+ _ ->
+ dets:insert(PWDB, Record),
+ true
+ end.
+
+get_user(DirData, UserName) ->
+ {Addr, Port, Dir} = lookup_common(DirData),
+ PWDB = httpd_util:key1search(DirData, auth_user_file),
+ User = {UserName, Addr, Port, Dir},
+ case dets:lookup(PWDB, User) of
+ [{User, Password, UserData}] ->
+ {ok, #httpd_user{username=UserName, password=Password, user_data=UserData}};
+ Other ->
+ {error, no_such_user}
+ end.
+
+list_users(DirData) ->
+ ?DEBUG("list_users -> ~n"
+ " DirData: ~p", [DirData]),
+ {Addr, Port, Dir} = lookup_common(DirData),
+ PWDB = httpd_util:key1search(DirData, auth_user_file),
+ case dets:traverse(PWDB, fun(X) -> {continue, X} end) of %% SOOOO Ugly !
+ Records when list(Records) ->
+ ?DEBUG("list_users -> ~n"
+ " Records: ~p", [Records]),
+ {ok, [UserName || {{UserName, AnyAddr, AnyPort, AnyDir}, Password, _Data} <- Records,
+ AnyAddr == Addr, AnyPort == Port, AnyDir == Dir]};
+ O ->
+ ?DEBUG("list_users -> ~n"
+ " O: ~p", [O]),
+ {ok, []}
+ end.
+
+delete_user(DirData, UserName) ->
+ {Addr, Port, Dir} = lookup_common(DirData),
+ PWDB = httpd_util:key1search(DirData, auth_user_file),
+ User = {UserName, Addr, Port, Dir},
+ case dets:lookup(PWDB, User) of
+ [{User, SomePassword, UserData}] ->
+ dets:delete(PWDB, User),
+ lists:foreach(fun(Group) -> delete_group_member(DirData, Group, UserName) end,
+ list_groups(DirData)),
+ true;
+ _ ->
+ {error, no_such_user}
+ end.
+
+%%
+%% Storage of groups in the dets table:
+%% {Group, UserList} where UserList is a list of strings.
+%%
+add_group_member(DirData, GroupName, UserName) ->
+ {Addr, Port, Dir} = lookup_common(DirData),
+ GDB = httpd_util:key1search(DirData, auth_group_file),
+ Group = {GroupName, Addr, Port, Dir},
+ case dets:lookup(GDB, Group) of
+ [{Group, Users}] ->
+ case lists:member(UserName, Users) of
+ true ->
+ true;
+ false ->
+ dets:insert(GDB, {Group, [UserName|Users]}),
+ true
+ end;
+ [] ->
+ dets:insert(GDB, {Group, [UserName]}),
+ true;
+ Other ->
+ {error, Other}
+ end.
+
+list_group_members(DirData, GroupName) ->
+ {Addr, Port, Dir} = lookup_common(DirData),
+ GDB = httpd_util:key1search(DirData, auth_group_file),
+ Group = {GroupName, Addr, Port, Dir},
+ case dets:lookup(GDB, Group) of
+ [{Group, Users}] ->
+ {ok, Users};
+ Other ->
+ {error, no_such_group}
+ end.
+
+list_groups(DirData) ->
+ {Addr, Port, Dir} = lookup_common(DirData),
+ GDB = httpd_util:key1search(DirData, auth_group_file),
+ case dets:match(GDB, {'$1', '_'}) of
+ [] ->
+ {ok, []};
+ List when list(List) ->
+ Groups = lists:flatten(List),
+ {ok, [GroupName || {GroupName, AnyAddr, AnyPort, AnyDir} <- Groups,
+ AnyAddr == Addr, AnyPort == Port, AnyDir == Dir]};
+ _ ->
+ {ok, []}
+ end.
+
+delete_group_member(DirData, GroupName, UserName) ->
+ {Addr, Port, Dir} = lookup_common(DirData),
+ GDB = httpd_util:key1search(DirData, auth_group_file),
+ Group = {GroupName, Addr, Port, Dir},
+ case dets:lookup(GDB, GroupName) of
+ [{Group, Users}] ->
+ case lists:member(UserName, Users) of
+ true ->
+ dets:delete(GDB, Group),
+ dets:insert(GDB, {Group,
+ lists:delete(UserName, Users)}),
+ true;
+ false ->
+ {error, no_such_group_member}
+ end;
+ _ ->
+ {error, no_such_group}
+ end.
+
+delete_group(DirData, GroupName) ->
+ {Addr, Port, Dir} = lookup_common(DirData),
+ GDB = httpd_util:key1search(DirData, auth_group_file),
+ Group = {GroupName, Addr, Port, Dir},
+ case dets:lookup(GDB, Group) of
+ [{Group, Users}] ->
+ dets:delete(GDB, Group),
+ true;
+ _ ->
+ {error, no_such_group}
+ end.
+
+lookup_common(DirData) ->
+ Dir = httpd_util:key1search(DirData, path),
+ Port = httpd_util:key1search(DirData, port),
+ Addr = httpd_util:key1search(DirData, bind_address),
+ {Addr, Port, Dir}.
+
+%% remove/1
+%%
+%% Closes dets tables used by this auth mod.
+%%
+remove(DirData) ->
+ PWDB = httpd_util:key1search(DirData, auth_user_file),
+ GDB = httpd_util:key1search(DirData, auth_group_file),
+ dets:close(GDB),
+ dets:close(PWDB),
+ ok.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth_mnesia.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth_mnesia.erl
new file mode 100644
index 0000000000..ea2f0cb905
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth_mnesia.erl
@@ -0,0 +1,269 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mod_auth_mnesia.erl,v 1.2 2010/03/04 13:54:19 maria Exp $
+%%
+-module(mod_auth_mnesia).
+-export([get_user/2,
+ list_group_members/2,
+ add_user/2,
+ add_group_member/3,
+ list_users/1,
+ delete_user/2,
+ list_groups/1,
+ delete_group_member/3,
+ delete_group/2]).
+
+-export([store_user/5, store_user/6,
+ store_group_member/5, store_group_member/6,
+ list_group_members/3, list_group_members/4,
+ list_groups/2, list_groups/3,
+ list_users/2, list_users/3,
+ remove_user/4, remove_user/5,
+ remove_group_member/5, remove_group_member/6,
+ remove_group/4, remove_group/5]).
+
+-export([store_directory_data/2]).
+
+-include("httpd.hrl").
+-include("mod_auth.hrl").
+
+
+
+store_directory_data(Directory, DirData) ->
+ %% We don't need to do anything here, we could ofcourse check that the appropriate
+ %% mnesia tables has been created prior to starting the http server.
+ ok.
+
+
+%%
+%% API
+%%
+
+%% Compability API
+
+
+store_user(UserName, Password, Port, Dir, AccessPassword) ->
+ %% AccessPassword is ignored - was not used in previous version
+ DirData = [{path,Dir},{port,Port}],
+ UStruct = #httpd_user{username = UserName,
+ password = Password},
+ add_user(DirData, UStruct).
+
+store_user(UserName, Password, Addr, Port, Dir, AccessPassword) ->
+ %% AccessPassword is ignored - was not used in previous version
+ DirData = [{path,Dir},{bind_address,Addr},{port,Port}],
+ UStruct = #httpd_user{username = UserName,
+ password = Password},
+ add_user(DirData, UStruct).
+
+store_group_member(GroupName, UserName, Port, Dir, AccessPassword) ->
+ DirData = [{path,Dir},{port,Port}],
+ add_group_member(DirData, GroupName, UserName).
+
+store_group_member(GroupName, UserName, Addr, Port, Dir, AccessPassword) ->
+ DirData = [{path,Dir},{bind_address,Addr},{port,Port}],
+ add_group_member(DirData, GroupName, UserName).
+
+list_group_members(GroupName, Port, Dir) ->
+ DirData = [{path,Dir},{port,Port}],
+ list_group_members(DirData, GroupName).
+
+list_group_members(GroupName, Addr, Port, Dir) ->
+ DirData = [{path,Dir},{bind_address,Addr},{port,Port}],
+ list_group_members(DirData, GroupName).
+
+list_groups(Port, Dir) ->
+ DirData = [{path,Dir},{port,Port}],
+ list_groups(DirData).
+
+list_groups(Addr, Port, Dir) ->
+ DirData = [{path,Dir},{bind_address,Addr},{port,Port}],
+ list_groups(DirData).
+
+list_users(Port, Dir) ->
+ DirData = [{path,Dir},{port,Port}],
+ list_users(DirData).
+
+list_users(Addr, Port, Dir) ->
+ DirData = [{path,Dir},{bind_address,Addr},{port,Port}],
+ list_users(DirData).
+
+remove_user(UserName, Port, Dir, _AccessPassword) ->
+ DirData = [{path,Dir},{port,Port}],
+ delete_user(DirData, UserName).
+
+remove_user(UserName, Addr, Port, Dir, _AccessPassword) ->
+ DirData = [{path,Dir},{bind_address,Addr},{port,Port}],
+ delete_user(DirData, UserName).
+
+remove_group_member(GroupName,UserName,Port,Dir,_AccessPassword) ->
+ DirData = [{path,Dir},{port,Port}],
+ delete_group_member(DirData, GroupName, UserName).
+
+remove_group_member(GroupName,UserName,Addr,Port,Dir,_AccessPassword) ->
+ DirData = [{path,Dir},{bind_address,Addr},{port,Port}],
+ delete_group_member(DirData, GroupName, UserName).
+
+remove_group(GroupName,Port,Dir,_AccessPassword) ->
+ DirData = [{path,Dir},{port,Port}],
+ delete_group(DirData, GroupName).
+
+remove_group(GroupName,Addr,Port,Dir,_AccessPassword) ->
+ DirData = [{path,Dir},{bind_address,Addr},{port,Port}],
+ delete_group(DirData, GroupName).
+
+%%
+%% Storage format of users in the mnesia table:
+%% httpd_user records
+%%
+
+add_user(DirData, UStruct) ->
+ {Addr, Port, Dir} = lookup_common(DirData),
+ UserName = UStruct#httpd_user.username,
+ Password = UStruct#httpd_user.password,
+ Data = UStruct#httpd_user.user_data,
+ User=#httpd_user{username={UserName,Addr,Port,Dir},
+ password=Password,
+ user_data=Data},
+ case mnesia:transaction(fun() -> mnesia:write(User) end) of
+ {aborted,Reason} ->
+ {error,Reason};
+ _ ->
+ true
+ end.
+
+get_user(DirData, UserName) ->
+ {Addr, Port, Dir} = lookup_common(DirData),
+ case mnesia:transaction(fun() ->
+ mnesia:read({httpd_user,
+ {UserName,Addr,Port,Dir}})
+ end) of
+ {aborted,Reason} ->
+ {error, Reason};
+ {'atomic',[]} ->
+ {error, no_such_user};
+ {'atomic', [Record]} when record(Record, httpd_user) ->
+ {ok, Record#httpd_user{username=UserName}};
+ Other ->
+ {error, no_such_user}
+ end.
+
+list_users(DirData) ->
+ {Addr, Port, Dir} = lookup_common(DirData),
+ case mnesia:transaction(fun() ->
+ mnesia:match_object({httpd_user,
+ {'_',Addr,Port,Dir},'_','_'})
+ end) of
+ {aborted,Reason} ->
+ {error,Reason};
+ {'atomic',Users} ->
+ {ok,
+ lists:foldr(fun({httpd_user, {UserName, AnyAddr, AnyPort, AnyDir},
+ Password, Data}, Acc) ->
+ [UserName|Acc]
+ end,
+ [], Users)}
+ end.
+
+delete_user(DirData, UserName) ->
+ {Addr, Port, Dir} = lookup_common(DirData),
+ case mnesia:transaction(fun() ->
+ mnesia:delete({httpd_user,
+ {UserName,Addr,Port,Dir}})
+ end) of
+ {aborted,Reason} ->
+ {error,Reason};
+ _ ->
+ true
+ end.
+
+%%
+%% Storage of groups in the mnesia table:
+%% Multiple instances of {#httpd_group, User}
+%%
+
+add_group_member(DirData, GroupName, User) ->
+ {Addr, Port, Dir} = lookup_common(DirData),
+ Group=#httpd_group{name={GroupName, Addr, Port, Dir}, userlist=User},
+ case mnesia:transaction(fun() -> mnesia:write(Group) end) of
+ {aborted,Reason} ->
+ {error,Reason};
+ _ ->
+ true
+ end.
+
+list_group_members(DirData, GroupName) ->
+ {Addr, Port, Dir} = lookup_common(DirData),
+ case mnesia:transaction(fun() ->
+ mnesia:read({httpd_group,
+ {GroupName,Addr,Port,Dir}})
+ end) of
+ {aborted, Reason} ->
+ {error,Reason};
+ {'atomic', Members} ->
+ {ok,[UserName || {httpd_group,{AnyGroupName,AnyAddr,AnyPort,AnyDir},UserName} <- Members,
+ AnyGroupName == GroupName, AnyAddr == Addr,
+ AnyPort == Port, AnyDir == Dir]}
+ end.
+
+list_groups(DirData) ->
+ {Addr, Port, Dir} = lookup_common(DirData),
+ case mnesia:transaction(fun() ->
+ mnesia:match_object({httpd_group,
+ {'_',Addr,Port,Dir},'_'})
+ end) of
+ {aborted, Reason} ->
+ {error, Reason};
+ {'atomic', Groups} ->
+ GroupNames=
+ [GroupName || {httpd_group,{GroupName,AnyAddr,AnyPort,AnyDir}, UserName} <- Groups,
+ AnyAddr == Addr, AnyPort == AnyPort, AnyDir == Dir],
+ {ok, httpd_util:uniq(lists:sort(GroupNames))}
+ end.
+
+delete_group_member(DirData, GroupName, UserName) ->
+ {Addr, Port, Dir} = lookup_common(DirData),
+ Group = #httpd_group{name={GroupName, Addr, Port, Dir}, userlist=UserName},
+ case mnesia:transaction(fun() -> mnesia:delete_object(Group) end) of
+ {aborted,Reason} ->
+ {error,Reason};
+ _ ->
+ true
+ end.
+
+%% THIS IS WRONG (?) !
+%% Should first match out all httpd_group records for this group and then
+%% do mnesia:delete on those. Or ?
+
+delete_group(DirData, GroupName) ->
+ {Addr, Port, Dir} = lookup_common(DirData),
+ case mnesia:transaction(fun() ->
+ mnesia:delete({httpd_group,
+ {GroupName,Addr,Port,Dir}})
+ end) of
+ {aborted,Reason} ->
+ {error,Reason};
+ _ ->
+ true
+ end.
+
+%% Utility functions.
+
+lookup_common(DirData) ->
+ Dir = httpd_util:key1search(DirData, path),
+ Port = httpd_util:key1search(DirData, port),
+ Addr = httpd_util:key1search(DirData, bind_address),
+ {Addr, Port, Dir}.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth_plain.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth_plain.erl
new file mode 100644
index 0000000000..75cc60f288
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth_plain.erl
@@ -0,0 +1,338 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mod_auth_plain.erl,v 1.1 2008/12/17 09:53:35 mikpe Exp $
+%%
+-module(mod_auth_plain).
+
+-include("httpd.hrl").
+-include("mod_auth.hrl").
+
+-define(VMODULE,"AUTH_PLAIN").
+-include("httpd_verbosity.hrl").
+
+
+%% Internal API
+-export([store_directory_data/2]).
+
+
+-export([get_user/2,
+ list_group_members/2,
+ add_user/2,
+ add_group_member/3,
+ list_users/1,
+ delete_user/2,
+ list_groups/1,
+ delete_group_member/3,
+ delete_group/2,
+ remove/1]).
+
+%%
+%% API
+%%
+
+%%
+%% Storage format of users in the ets table:
+%% {UserName, Password, UserData}
+%%
+
+add_user(DirData, #httpd_user{username = User} = UStruct) ->
+ ?vtrace("add_user -> entry with:"
+ "~n User: ~p",[User]),
+ PWDB = httpd_util:key1search(DirData, auth_user_file),
+ Record = {User,
+ UStruct#httpd_user.password,
+ UStruct#httpd_user.user_data},
+ case ets:lookup(PWDB, User) of
+ [{User, _SomePassword, _SomeData}] ->
+ {error, user_already_in_db};
+ _ ->
+ ets:insert(PWDB, Record),
+ true
+ end.
+
+get_user(DirData, User) ->
+ ?vtrace("get_user -> entry with:"
+ "~n User: ~p",[User]),
+ PWDB = httpd_util:key1search(DirData, auth_user_file),
+ case ets:lookup(PWDB, User) of
+ [{User, PassWd, Data}] ->
+ {ok, #httpd_user{username=User, password=PassWd, user_data=Data}};
+ _ ->
+ {error, no_such_user}
+ end.
+
+list_users(DirData) ->
+ PWDB = httpd_util:key1search(DirData, auth_user_file),
+ case ets:match(PWDB, '$1') of
+ Records when list(Records) ->
+ {ok, lists:foldr(fun({User,PassWd,Data}, A) -> [User|A] end,
+ [], lists:flatten(Records))};
+ O ->
+ {ok, []}
+ end.
+
+delete_user(DirData, UserName) ->
+ ?vtrace("delete_user -> entry with:"
+ "~n UserName: ~p",[UserName]),
+ PWDB = httpd_util:key1search(DirData, auth_user_file),
+ case ets:lookup(PWDB, UserName) of
+ [{UserName, SomePassword, SomeData}] ->
+ ets:delete(PWDB, UserName),
+ case list_groups(DirData) of
+ {ok,Groups}->
+ lists:foreach(fun(Group) ->
+ delete_group_member(DirData, Group, UserName)
+ end,Groups),
+ true;
+ _->
+ true
+ end;
+ _ ->
+ {error, no_such_user}
+ end.
+
+%%
+%% Storage of groups in the ets table:
+%% {Group, UserList} where UserList is a list of strings.
+%%
+
+add_group_member(DirData, Group, UserName) ->
+ ?DEBUG("add_group_members -> ~n"
+ " Group: ~p~n"
+ " UserName: ~p",[Group,UserName]),
+ GDB = httpd_util:key1search(DirData, auth_group_file),
+ case ets:lookup(GDB, Group) of
+ [{Group, Users}] ->
+ case lists:member(UserName, Users) of
+ true ->
+ ?DEBUG("add_group_members -> already member in group",[]),
+ true;
+ false ->
+ ?DEBUG("add_group_members -> add",[]),
+ ets:insert(GDB, {Group, [UserName|Users]}),
+ true
+ end;
+ [] ->
+ ?DEBUG("add_group_members -> create grouo",[]),
+ ets:insert(GDB, {Group, [UserName]}),
+ true;
+ Other ->
+ ?ERROR("add_group_members -> Other: ~p",[Other]),
+ {error, Other}
+ end.
+
+list_group_members(DirData, Group) ->
+ ?DEBUG("list_group_members -> Group: ~p",[Group]),
+ GDB = httpd_util:key1search(DirData, auth_group_file),
+ case ets:lookup(GDB, Group) of
+ [{Group, Users}] ->
+ ?DEBUG("list_group_members -> Users: ~p",[Users]),
+ {ok, Users};
+ _ ->
+ {error, no_such_group}
+ end.
+
+list_groups(DirData) ->
+ ?DEBUG("list_groups -> entry",[]),
+ GDB = httpd_util:key1search(DirData, auth_group_file),
+ case ets:match(GDB, '$1') of
+ [] ->
+ ?DEBUG("list_groups -> []",[]),
+ {ok, []};
+ Groups0 when list(Groups0) ->
+ ?DEBUG("list_groups -> Groups0: ~p",[Groups0]),
+ {ok, httpd_util:uniq(lists:foldr(fun({G, U}, A) -> [G|A] end,
+ [], lists:flatten(Groups0)))};
+ _ ->
+ {ok, []}
+ end.
+
+delete_group_member(DirData, Group, User) ->
+ ?DEBUG("list_group_members -> ~n"
+ " Group: ~p~n"
+ " User: ~p",[Group,User]),
+ GDB = httpd_util:key1search(DirData, auth_group_file),
+ UDB = httpd_util:key1search(DirData, auth_user_file),
+ case ets:lookup(GDB, Group) of
+ [{Group, Users}] when list(Users) ->
+ case lists:member(User, Users) of
+ true ->
+ ?DEBUG("list_group_members -> deleted from group",[]),
+ ets:delete(GDB, Group),
+ ets:insert(GDB, {Group, lists:delete(User, Users)}),
+ true;
+ false ->
+ ?DEBUG("list_group_members -> not member",[]),
+ {error, no_such_group_member}
+ end;
+ _ ->
+ ?ERROR("list_group_members -> no such group",[]),
+ {error, no_such_group}
+ end.
+
+delete_group(DirData, Group) ->
+ ?DEBUG("list_group_members -> Group: ~p",[Group]),
+ GDB = httpd_util:key1search(DirData, auth_group_file),
+ case ets:lookup(GDB, Group) of
+ [{Group, Users}] ->
+ ?DEBUG("list_group_members -> delete",[]),
+ ets:delete(GDB, Group),
+ true;
+ _ ->
+ ?ERROR("delete_group -> no such group",[]),
+ {error, no_such_group}
+ end.
+
+
+store_directory_data(Directory, DirData) ->
+ PWFile = httpd_util:key1search(DirData, auth_user_file),
+ GroupFile = httpd_util:key1search(DirData, auth_group_file),
+ case load_passwd(PWFile) of
+ {ok, PWDB} ->
+ case load_group(GroupFile) of
+ {ok, GRDB} ->
+ %% Address and port is included in the file names...
+ Addr = httpd_util:key1search(DirData, bind_address),
+ Port = httpd_util:key1search(DirData, port),
+ {ok, PasswdDB} = store_passwd(Addr,Port,PWDB),
+ {ok, GroupDB} = store_group(Addr,Port,GRDB),
+ NDD1 = lists:keyreplace(auth_user_file, 1, DirData,
+ {auth_user_file, PasswdDB}),
+ NDD2 = lists:keyreplace(auth_group_file, 1, NDD1,
+ {auth_group_file, GroupDB}),
+ {ok, NDD2};
+ Err ->
+ ?ERROR("failed storing directory data: "
+ "load group error: ~p",[Err]),
+ {error, Err}
+ end;
+ Err2 ->
+ ?ERROR("failed storing directory data: "
+ "load passwd error: ~p",[Err2]),
+ {error, Err2}
+ end.
+
+
+
+%% load_passwd
+
+load_passwd(AuthUserFile) ->
+ case file:open(AuthUserFile, [read]) of
+ {ok,Stream} ->
+ parse_passwd(Stream, []);
+ {error, _} ->
+ {error, ?NICE("Can't open "++AuthUserFile)}
+ end.
+
+parse_passwd(Stream,PasswdList) ->
+ Line =
+ case io:get_line(Stream, '') of
+ eof ->
+ eof;
+ String ->
+ httpd_conf:clean(String)
+ end,
+ parse_passwd(Stream, PasswdList, Line).
+
+parse_passwd(Stream, PasswdList, eof) ->
+ file:close(Stream),
+ {ok, PasswdList};
+parse_passwd(Stream, PasswdList, "") ->
+ parse_passwd(Stream, PasswdList);
+parse_passwd(Stream, PasswdList, [$#|_]) ->
+ parse_passwd(Stream, PasswdList);
+parse_passwd(Stream, PasswdList, Line) ->
+ case regexp:split(Line,":") of
+ {ok, [User,Password]} ->
+ parse_passwd(Stream, [{User,Password, []}|PasswdList]);
+ {ok,_} ->
+ {error, ?NICE(Line)}
+ end.
+
+%% load_group
+
+load_group(AuthGroupFile) ->
+ case file:open(AuthGroupFile, [read]) of
+ {ok, Stream} ->
+ parse_group(Stream,[]);
+ {error, _} ->
+ {error, ?NICE("Can't open "++AuthGroupFile)}
+ end.
+
+parse_group(Stream, GroupList) ->
+ Line=
+ case io:get_line(Stream,'') of
+ eof ->
+ eof;
+ String ->
+ httpd_conf:clean(String)
+ end,
+ parse_group(Stream, GroupList, Line).
+
+parse_group(Stream, GroupList, eof) ->
+ file:close(Stream),
+ {ok, GroupList};
+parse_group(Stream, GroupList, "") ->
+ parse_group(Stream, GroupList);
+parse_group(Stream, GroupList, [$#|_]) ->
+ parse_group(Stream, GroupList);
+parse_group(Stream, GroupList, Line) ->
+ case regexp:split(Line, ":") of
+ {ok, [Group,Users]} ->
+ {ok, UserList} = regexp:split(Users," "),
+ parse_group(Stream, [{Group,UserList}|GroupList]);
+ {ok, _} ->
+ {error, ?NICE(Line)}
+ end.
+
+
+%% store_passwd
+
+store_passwd(Addr,Port,PasswdList) ->
+ Name = httpd_util:make_name("httpd_passwd",Addr,Port),
+ PasswdDB = ets:new(Name, [set, public]),
+ store_passwd(PasswdDB, PasswdList).
+
+store_passwd(PasswdDB, []) ->
+ {ok, PasswdDB};
+store_passwd(PasswdDB, [User|Rest]) ->
+ ets:insert(PasswdDB, User),
+ store_passwd(PasswdDB, Rest).
+
+%% store_group
+
+store_group(Addr,Port,GroupList) ->
+ Name = httpd_util:make_name("httpd_group",Addr,Port),
+ GroupDB = ets:new(Name, [set, public]),
+ store_group(GroupDB, GroupList).
+
+
+store_group(GroupDB,[]) ->
+ {ok, GroupDB};
+store_group(GroupDB,[User|Rest]) ->
+ ets:insert(GroupDB, User),
+ store_group(GroupDB, Rest).
+
+
+%% remove/1
+%%
+%% Deletes ets tables used by this auth mod.
+%%
+remove(DirData) ->
+ PWDB = httpd_util:key1search(DirData, auth_user_file),
+ GDB = httpd_util:key1search(DirData, auth_group_file),
+ ets:delete(PWDB),
+ ets:delete(GDB).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth_server.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth_server.erl
new file mode 100644
index 0000000000..59402ac169
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_auth_server.erl
@@ -0,0 +1,422 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mod_auth_server.erl,v 1.1 2008/12/17 09:53:35 mikpe Exp $
+%%
+
+-module(mod_auth_server).
+
+-include("httpd.hrl").
+%% -include("mod_auth.hrl").
+-include("httpd_verbosity.hrl").
+
+-behaviour(gen_server).
+
+
+%% mod_auth exports
+-export([start/2, stop/2,
+ add_password/4, update_password/5,
+ add_user/5, delete_user/5, get_user/5, list_users/4,
+ add_group_member/6, delete_group_member/6, list_group_members/5,
+ delete_group/5, list_groups/4]).
+
+%% Management exports
+-export([verbosity/3]).
+
+%% gen_server exports
+-export([start_link/3,
+ init/1,
+ handle_call/3, handle_cast/2, handle_info/2,
+ terminate/2, code_change/3]).
+
+
+-record(state,{tab}).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% %%
+%% External API %%
+%% %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% start_link/3
+%%
+%% NOTE: This is called by httpd_misc_sup when the process is started
+%%
+start_link(Addr, Port, Verbosity)->
+ ?vlog("start_link -> entry with"
+ "~n Addr: ~p"
+ "~n Port: ~p", [Addr, Port]),
+ Name = make_name(Addr, Port),
+ gen_server:start_link({local, Name}, ?MODULE, [Verbosity],
+ [{timeout, infinity}]).
+
+
+%% start/2
+
+start(Addr, Port)->
+ ?vtrace("start -> entry with"
+ "~n Addr: ~p"
+ "~n Port: ~p", [Addr, Port]),
+ Name = make_name(Addr, Port),
+ case whereis(Name) of
+ undefined ->
+ Verbosity = get(auth_verbosity),
+ case (catch httpd_misc_sup:start_auth_server(Addr, Port,
+ Verbosity)) of
+ {ok, Pid} ->
+ put(auth_server, Pid),
+ ok;
+ {error, Reason} ->
+ exit({failed_start_auth_server, Reason});
+ Error ->
+ exit({failed_start_auth_server, Error})
+ end;
+ _ -> %% Already started...
+ ok
+ end.
+
+
+%% stop/2
+
+stop(Addr, Port)->
+ ?vtrace("stop -> entry with"
+ "~n Addr: ~p"
+ "~n Port: ~p", [Addr, Port]),
+ Name = make_name(Addr, Port),
+ case whereis(Name) of
+ undefined -> %% Already stopped
+ ok;
+ _ ->
+ (catch httpd_misc_sup:stop_auth_server(Addr, Port))
+ end.
+
+
+%% verbosity/3
+
+verbosity(Addr, Port, Verbosity) ->
+ Name = make_name(Addr, Port),
+ Req = {verbosity, Verbosity},
+ call(Name, Req).
+
+
+%% add_password/4
+
+add_password(Addr, Port, Dir, Password)->
+ Name = make_name(Addr, Port),
+ Req = {add_password, Dir, Password},
+ call(Name, Req).
+
+
+%% update_password/6
+
+update_password(Addr, Port, Dir, Old, New) when list(New) ->
+ Name = make_name(Addr, Port),
+ Req = {update_password, Dir, Old, New},
+ call(Name, Req).
+
+
+%% add_user/5
+
+add_user(Addr, Port, Dir, User, Password) ->
+ Name = make_name(Addr, Port),
+ Req = {add_user, Addr, Port, Dir, User, Password},
+ call(Name, Req).
+
+
+%% delete_user/5
+
+delete_user(Addr, Port, Dir, UserName, Password) ->
+ Name = make_name(Addr, Port),
+ Req = {delete_user, Addr, Port, Dir, UserName, Password},
+ call(Name, Req).
+
+
+%% get_user/5
+
+get_user(Addr, Port, Dir, UserName, Password) ->
+ Name = make_name(Addr, Port),
+ Req = {get_user, Addr, Port, Dir, UserName, Password},
+ call(Name, Req).
+
+
+%% list_users/4
+
+list_users(Addr, Port, Dir, Password) ->
+ Name = make_name(Addr,Port),
+ Req = {list_users, Addr, Port, Dir, Password},
+ call(Name, Req).
+
+
+%% add_group_member/6
+
+add_group_member(Addr, Port, Dir, GroupName, UserName, Password) ->
+ Name = make_name(Addr,Port),
+ Req = {add_group_member, Addr, Port, Dir, GroupName, UserName, Password},
+ call(Name, Req).
+
+
+%% delete_group_member/6
+
+delete_group_member(Addr, Port, Dir, GroupName, UserName, Password) ->
+ Name = make_name(Addr,Port),
+ Req = {delete_group_member, Addr, Port, Dir, GroupName, UserName, Password},
+ call(Name, Req).
+
+
+%% list_group_members/4
+
+list_group_members(Addr, Port, Dir, Group, Password) ->
+ Name = make_name(Addr, Port),
+ Req = {list_group_members, Addr, Port, Dir, Group, Password},
+ call(Name, Req).
+
+
+%% delete_group/5
+
+delete_group(Addr, Port, Dir, GroupName, Password) ->
+ Name = make_name(Addr, Port),
+ Req = {delete_group, Addr, Port, Dir, GroupName, Password},
+ call(Name, Req).
+
+
+%% list_groups/4
+
+list_groups(Addr, Port, Dir, Password) ->
+ Name = make_name(Addr, Port),
+ Req = {list_groups, Addr, Port, Dir, Password},
+ call(Name, Req).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% %%
+%% Server call-back functions %%
+%% %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% init
+
+init([undefined]) ->
+ init([?default_verbosity]);
+
+init([Verbosity]) ->
+ put(sname,auth),
+ put(verbosity,Verbosity),
+ ?vlog("starting",[]),
+ {ok,#state{tab = ets:new(auth_pwd,[set,protected])}}.
+
+
+%% handle_call
+
+%% Add a user
+handle_call({add_user, Addr, Port, Dir, User, AuthPwd}, _From, State) ->
+ Reply = api_call(Addr, Port, Dir, add_user, User, AuthPwd, State),
+ {reply, Reply, State};
+
+%% Get data about a user
+handle_call({get_user, Addr, Port, Dir, User, AuthPwd}, _From, State) ->
+ Reply = api_call(Addr, Port, Dir, get_user, [User], AuthPwd, State),
+ {reply, Reply, State};
+
+%% Add a group member
+handle_call({add_group_member, Addr, Port, Dir, Group, User, AuthPwd},
+ _From, State) ->
+ Reply = api_call(Addr, Port, Dir, add_group_member, [Group, User],
+ AuthPwd, State),
+ {reply, Reply, State};
+
+%% delete a group
+handle_call({delete_group_member, Addr, Port, Dir, Group, User, AuthPwd},
+ _From, State)->
+ Reply = api_call(Addr, Port, Dir, delete_group_member, [Group, User],
+ AuthPwd, State),
+ {reply, Reply, State};
+
+%% List all users thats standalone users
+handle_call({list_users, Addr, Port, Dir, AuthPwd}, _From, State)->
+ Reply = api_call(Addr, Port, Dir, list_users, [], AuthPwd, State),
+ {reply, Reply, State};
+
+%% Delete a user
+handle_call({delete_user, Addr, Port, Dir, User, AuthPwd}, _From, State)->
+ Reply = api_call(Addr, Port, Dir, delete_user, [User], AuthPwd, State),
+ {reply, Reply, State};
+
+%% Delete a group
+handle_call({delete_group, Addr, Port, Dir, Group, AuthPwd}, _From, State)->
+ Reply = api_call(Addr, Port, Dir, delete_group, [Group], AuthPwd, State),
+ {reply, Reply, State};
+
+%% List the current groups
+handle_call({list_groups, Addr, Port, Dir, AuthPwd}, _From, State)->
+ Reply = api_call(Addr, Port, Dir, list_groups, [], AuthPwd, State),
+ {reply, Reply, State};
+
+%% List the members of the given group
+handle_call({list_group_members, Addr, Port, Dir, Group, AuthPwd},
+ _From, State)->
+ Reply = api_call(Addr, Port, Dir, list_group_members, [Group],
+ AuthPwd, State),
+ {reply, Reply, State};
+
+
+%% Add password for a directory
+handle_call({add_password, Dir, Password}, _From, State)->
+ Reply = do_add_password(Dir, Password, State),
+ {reply, Reply, State};
+
+
+%% Update the password for a directory
+
+handle_call({update_password, Dir, Old, New},_From,State)->
+ Reply =
+ case getPassword(State, Dir) of
+ OldPwd when binary(OldPwd)->
+ case erlang:md5(Old) of
+ OldPwd ->
+ %% The old password is right =>
+ %% update the password to the new
+ do_update_password(Dir,New,State),
+ ok;
+ _->
+ {error, error_new}
+ end;
+ _->
+ {error, error_old}
+ end,
+ {reply, Reply, State};
+
+handle_call(stop, _From, State)->
+ {stop, normal, State};
+
+handle_call({verbosity,Verbosity},_From,State)->
+ OldVerbosity = put(verbosity,Verbosity),
+ ?vlog("set verbosity: ~p -> ~p",[Verbosity,OldVerbosity]),
+ {reply,OldVerbosity,State}.
+
+handle_info(Info,State)->
+ {noreply,State}.
+
+handle_cast(Request,State)->
+ {noreply,State}.
+
+
+terminate(Reason,State) ->
+ ets:delete(State#state.tab),
+ ok.
+
+
+%% code_change({down, ToVsn}, State, Extra)
+%%
+code_change({down, _}, #state{tab = Tab}, downgrade_to_2_6_0) ->
+ ?vlog("downgrade to 2.6.0", []),
+ {ok, {state, Tab, undefined}};
+
+
+%% code_change(FromVsn, State, Extra)
+%%
+code_change(_, {state, Tab, _}, upgrade_from_2_6_0) ->
+ ?vlog("upgrade from 2.6.0", []),
+ {ok, #state{tab = Tab}}.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% %%
+%% The functions that really changes the data in the database %%
+%% of users to different directories %%
+%% %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% API gateway
+
+api_call(Addr, Port, Dir, Func, Args,Password,State) ->
+ case controlPassword(Password,State,Dir) of
+ ok->
+ ConfigName = httpd_util:make_name("httpd_conf",Addr,Port),
+ case ets:match_object(ConfigName, {directory, Dir, '$1'}) of
+ [{directory, Dir, DirData}] ->
+ AuthMod = auth_mod_name(DirData),
+ ?DEBUG("api_call -> call ~p:~p",[AuthMod,Func]),
+ Ret = (catch apply(AuthMod, Func, [DirData|Args])),
+ ?DEBUG("api_call -> Ret: ~p",[ret]),
+ Ret;
+ O ->
+ ?DEBUG("api_call -> O: ~p",[O]),
+ {error, no_such_directory}
+ end;
+ bad_password ->
+ {error,bad_password}
+ end.
+
+controlPassword(Password,State,Dir)when Password=:="DummyPassword"->
+ bad_password;
+
+controlPassword(Password,State,Dir)->
+ case getPassword(State,Dir) of
+ Pwd when binary(Pwd)->
+ case erlang:md5(Password) of
+ Pwd ->
+ ok;
+ _->
+ bad_password
+ end;
+ _ ->
+ bad_password
+ end.
+
+
+getPassword(State,Dir)->
+ case lookup(State#state.tab, Dir) of
+ [{_,Pwd}]->
+ Pwd;
+ _ ->
+ {error,bad_password}
+ end.
+
+do_update_password(Dir, New, State) ->
+ ets:insert(State#state.tab, {Dir, erlang:md5(New)}).
+
+do_add_password(Dir, Password, State) ->
+ case getPassword(State,Dir) of
+ PwdExists when binary(PwdExists) ->
+ {error, dir_protected};
+ {error, _} ->
+ do_update_password(Dir, Password, State)
+ end.
+
+
+auth_mod_name(DirData) ->
+ case httpd_util:key1search(DirData, auth_type, plain) of
+ plain -> mod_auth_plain;
+ mnesia -> mod_auth_mnesia;
+ dets -> mod_auth_dets
+ end.
+
+
+lookup(Db, Key) ->
+ ets:lookup(Db, Key).
+
+
+make_name(Addr,Port) ->
+ httpd_util:make_name("httpd_auth",Addr,Port).
+
+
+call(Name, Req) ->
+ case (catch gen_server:call(Name, Req)) of
+ {'EXIT', Reason} ->
+ {error, Reason};
+ Reply ->
+ Reply
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_browser.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_browser.erl
new file mode 100644
index 0000000000..1153a5fc47
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_browser.erl
@@ -0,0 +1,213 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mod_browser.erl,v 1.1 2008/12/17 09:53:35 mikpe Exp $
+%%
+%% ----------------------------------------------------------------------
+%%
+%% Browsers sends a string to the webbserver
+%% to identify themsevles. They are a bit nasty
+%% since the only thing that the specification really
+%% is strict about is that they shall be short
+%% tree axamples:
+%%
+%% Netscape Mozilla/4.75 [en] (X11; U; SunOS 5.8 sun4u)
+%% IE5 Mozilla/4.0 (compatible; MSIE 5.0; SP1B; SunOS 5.8 sun4u; X11)
+%% Lynx Lynx/2.8.3rel.1 libwww-FM/2.142
+%%
+%% ----------------------------------------------------------------------
+
+-module(mod_browser).
+
+%% Remember that the order of the mozilla browsers are
+%% important since some browsers include others to behave
+%% as they were something else
+-define(MOZILLA_BROWSERS,[{opera,"opera"},{msie,"msie"}]).
+
+
+%% If your operatingsystem is not recognized add it to this list.
+-define(OPERATIVE_SYSTEMS,[{win3x,["win16","windows 3","windows 16-bit"]},
+ {win95,["win95","windows 95"]},
+ {win98,["win98", "windows 98"]},
+ {winnt,["winnt", "windows nt"]},
+ {win2k,["nt 5"]},
+ {sunos4,["sunos 4"]},
+ {sunos5,["sunos 5"]},
+ {sun,["sunos"]},
+ {aix,["aix"]},
+ {linux,["linux"]},
+ {sco,["sco","unix_sv"]},
+ {freebsd,["freebsd"]},
+ {bsd,["bsd"]}]).
+
+-define(LYNX,lynx).
+-define(MOZILLA,mozilla).
+-define(EMACS,emacs).
+-define(STAROFFICE,soffice).
+-define(MOSAIC,mosaic).
+-define(NETSCAPE,netscape).
+-define(UNKOWN,unknown).
+
+-include("httpd.hrl").
+
+-export([do/1, test/0, getBrowser/1]).
+
+
+do(Info) ->
+ case httpd_util:key1search(Info#mod.data,status) of
+ {Status_code,PhraseArgs,Reason} ->
+ {proceed,Info#mod.data};
+ undefined ->
+ {proceed,[{'user-agent',getBrowser1(Info)}|Info#mod.data]}
+ end.
+
+getBrowser1(Info) ->
+ PHead=Info#mod.parsed_header,
+ case httpd_util:key1search(PHead,"User-Agent") of
+ undefined->
+ undefined;
+ AgentString ->
+ getBrowser(AgentString)
+ end.
+
+getBrowser(AgentString) ->
+ LAgentString = httpd_util:to_lower(AgentString),
+ case regexp:first_match(LAgentString,"^[^ ]*") of
+ {match,Start,Length} ->
+ Browser=lists:sublist(LAgentString,Start,Length),
+ case browserType(Browser) of
+ {mozilla,Vsn} ->
+ {getMozilla(LAgentString,
+ ?MOZILLA_BROWSERS,{?NETSCAPE,Vsn}),
+ operativeSystem(LAgentString)};
+ AnyBrowser ->
+ {AnyBrowser,operativeSystem(LAgentString)}
+ end;
+ nomatch ->
+ browserType(LAgentString)
+ end.
+
+browserType([$l,$y,$n,$x|Version]) ->
+ {?LYNX,browserVersion(Version)};
+browserType([$m,$o,$z,$i,$l,$l,$a|Version]) ->
+ {?MOZILLA,browserVersion(Version)};
+browserType([$e,$m,$a,$c,$s|Version]) ->
+ {?EMACS,browserVersion(Version)};
+browserType([$e,$t,$a,$r,$o,$f,$f,$i,$c,$e|Version]) ->
+ {?STAROFFICE,browserVersion(Version)};
+browserType([$m,$o,$s,$a,$i,$c|Version]) ->
+ {?MOSAIC,browserVersion(Version)};
+browserType(Unknown)->
+ unknown.
+
+
+browserVersion([$/|VsnString]) ->
+ case catch list_to_float(VsnString) of
+ Number when float(Number) ->
+ Number;
+ Whatever ->
+ case string:span(VsnString,"1234567890.") of
+ 0 ->
+ unknown;
+ VLength ->
+ Vsn = string:substr(VsnString,1,VLength),
+ case string:tokens(Vsn,".") of
+ [Number] ->
+ list_to_float(Number++".0");
+ [Major,Minor|_MinorMinor] ->
+ list_to_float(Major++"."++Minor)
+ end
+ end
+ end;
+browserVersion(VsnString) ->
+ browserVersion([$/|VsnString]).
+
+operativeSystem(OpString) ->
+ operativeSystem(OpString, ?OPERATIVE_SYSTEMS).
+
+operativeSystem(OpString,[]) ->
+ unknown;
+operativeSystem(OpString,[{RetVal,RegExps}|Rest]) ->
+ case controlOperativeSystem(OpString,RegExps) of
+ true->
+ RetVal;
+ _ ->
+ operativeSystem(OpString,Rest)
+ end.
+
+controlOperativeSystem(OpString,[]) ->
+ false;
+controlOperativeSystem(OpString,[Regexp|Regexps]) ->
+ case regexp:match(OpString,Regexp) of
+ {match,_,_}->
+ true;
+ nomatch->
+ controlOperativeSystem(OpString,Regexps)
+ end.
+
+
+%% OK this is ugly but thats the only way since
+%% all browsers dont conform to the name/vsn standard
+%% First we check if it is one of the browsers that
+%% not are the default mozillaborwser against the regexp
+%% for the different browsers. if no match it a mozilla
+%% browser i.e opera netscape or internet explorer
+
+getMozilla(AgentString,[],Default) ->
+ Default;
+getMozilla(AgentString,[{Agent,AgentRegExp}|Rest],Default) ->
+ case regexp:match(AgentString,AgentRegExp) of
+ {match,_,_} ->
+ {Agent,getVersion(AgentString,AgentRegExp)};
+ nomatch ->
+ getMozilla(AgentString,Rest,Default)
+ end.
+
+getVersion(AgentString,AgentRegExp) ->
+ case regexp:match(AgentString,AgentRegExp++"[0-9\.\ ]*") of
+ {match,Start,Length} when length(AgentRegExp) < Length ->
+ %% Ok we got the number split it out
+ RealStart=Start+length(AgentRegExp),
+ RealLength=Length-length(AgentRegExp),
+ VsnString=string:substr(AgentString,RealStart,RealLength),
+ case string:strip(VsnString,both,$\ ) of
+ [] ->
+ unknown;
+ Vsn ->
+ case string:tokens(Vsn,".") of
+ [Number]->
+ list_to_float(Number++".0");
+ [Major,Minor|_MinorMinor]->
+ list_to_float(Major++"."++Minor)
+ end
+ end;
+ nomatch ->
+ unknown
+ end.
+
+
+test()->
+ io:format("~n--------------------------------------------------------~n"),
+ Res1=getBrowser("Mozilla/4.75 [en] (X11; U; SunOS 5.8 sun4u)"),
+ io:format("~p",[Res1]),
+ io:format("~n--------------------------------------------------------~n"),
+ io:format("~n--------------------------------------------------------~n"),
+ Res2=getBrowser("Mozilla/4.0 (compatible; MSIE 5.0; SP1B; SunOS 5.8 sun4u; X11)"),
+ io:format("~p",[Res2]),
+ io:format("~n--------------------------------------------------------~n"),
+ io:format("~n--------------------------------------------------------~n"),
+ Res3=getBrowser("Lynx/2.8.3rel.1 libwww-FM/2.142"),
+ io:format("~p",[Res3]),
+ io:format("~n--------------------------------------------------------~n").
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_cgi.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_cgi.erl
new file mode 100644
index 0000000000..d3f67eb77a
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_cgi.erl
@@ -0,0 +1,692 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mod_cgi.erl,v 1.1 2008/12/17 09:53:35 mikpe Exp $
+%%
+-module(mod_cgi).
+-export([do/1,env/3,status_code/1,load/2]).
+
+%%Exports to the interface for sending chunked data
+%% to http/1.1 users and full responses to http/1.0
+-export([send/5,final_send/4, update_status_code/2,get_new_size/2]).
+-include("httpd.hrl").
+
+-define(VMODULE,"CGI").
+-include("httpd_verbosity.hrl").
+
+-define(GATEWAY_INTERFACE,"CGI/1.1").
+-define(DEFAULT_CGI_TIMEOUT,15000).
+
+%% do
+
+do(Info) ->
+ ?vtrace("do",[]),
+ case httpd_util:key1search(Info#mod.data,status) of
+ %% A status code has been generated!
+ {StatusCode, PhraseArgs, Reason} ->
+ {proceed, Info#mod.data};
+ %% No status code has been generated!
+ undefined ->
+ ?vtrace("do -> no status code has been generated", []),
+ case httpd_util:key1search(Info#mod.data,response) of
+ %% No response has been generated!
+ undefined ->
+ ?vtrace("do -> no response has been generated", []),
+ RequestURI =
+ case httpd_util:key1search(Info#mod.data,
+ new_request_uri) of
+ undefined ->
+ Info#mod.request_uri;
+ Value ->
+ Value
+ end,
+ ?vtrace("do -> RequestURI: ~p", [RequestURI]),
+ ScriptAliases =
+ httpd_util:multi_lookup(Info#mod.config_db,
+ script_alias),
+ ?vtrace("do -> ScriptAliases: ~p", [ScriptAliases]),
+ case mod_alias:real_script_name(Info#mod.config_db,
+ RequestURI,
+ ScriptAliases) of
+ {Script, AfterScript} ->
+ exec_script(Info, Script, AfterScript, RequestURI);
+ not_a_script ->
+ {proceed,Info#mod.data}
+ end;
+ %% A response has been generated or sent!
+ Response ->
+ {proceed,Info#mod.data}
+ end
+ end.
+
+
+%% is_executable(File) ->
+%% ?DEBUG("is_executable -> entry with~n"
+%% " File: ~s",[File]),
+%% Dir = filename:dirname(File),
+%% FileName = filename:basename(File),
+%% is_executable(FileName,Dir).
+%%
+%% is_executable(FileName,Dir) ->
+%% ?DEBUG("is_executable -> entry with~n"
+%% " Dir: ~s~n"
+%% " FileName: ~s",[Dir,FileName]),
+%% case os:find_executable(FileName, Dir) of
+%% false ->
+%% false;
+%% _ ->
+%% true
+%% end.
+
+
+%% -------------------------
+%% Start temporary (hopefully) fix for win32
+%% OTP-3627
+%%
+
+is_executable(File) ->
+ Dir = filename:dirname(File),
+ FileName = filename:basename(File),
+ case os:type() of
+ {win32,_} ->
+ is_win32_executable(Dir,FileName);
+ _ ->
+ is_other_executable(Dir,FileName)
+ end.
+
+
+is_win32_executable(D,F) ->
+ case ends_with(F,[".bat",".exe",".com"]) of
+ false ->
+ %% This is why we cant use 'os:find_executable' directly.
+ %% It assumes that executable files is given without extension
+ case os:find_executable(F,D) of
+ false ->
+ false;
+ _ ->
+ true
+ end;
+ true ->
+ case file:read_file_info(D ++ "/" ++ F) of
+ {ok,_} ->
+ true;
+ _ ->
+ false
+ end
+ end.
+
+
+is_other_executable(D,F) ->
+ case os:find_executable(F,D) of
+ false ->
+ false;
+ _ ->
+ true
+ end.
+
+
+ends_with(File,[]) ->
+ false;
+ends_with(File,[Ext|Rest]) ->
+ case ends_with1(File,Ext) of
+ true ->
+ true;
+ false ->
+ ends_with(File,Rest)
+ end.
+
+ends_with1(S,E) when length(S) >= length(E) ->
+ case to_lower(string:right(S,length(E))) of
+ E ->
+ true;
+ _ ->
+ false
+ end;
+ends_with1(_S,_E) ->
+ false.
+
+
+to_lower(S) -> to_lower(S,[]).
+
+to_lower([],L) -> lists:reverse(L);
+to_lower([H|T],L) -> to_lower(T,[to_lower1(H)|L]).
+
+to_lower1(C) when C >= $A, C =< $Z ->
+ C + ($a - $A);
+to_lower1(C) ->
+ C.
+
+%%
+%% End fix
+%% ---------------------------------
+
+
+env(VarName, Value) ->
+ {VarName, Value}.
+
+env(Info, Script, AfterScript) ->
+ ?vtrace("env -> entry with"
+ "~n Script: ~p"
+ "~n AfterScript: ~p",
+ [Script, AfterScript]),
+ {_, RemoteAddr} = (Info#mod.init_data)#init_data.peername,
+ ServerName = (Info#mod.init_data)#init_data.resolve,
+ PH = parsed_header(Info#mod.parsed_header),
+ Env =
+ [env("SERVER_SOFTWARE",?SERVER_SOFTWARE),
+ env("SERVER_NAME",ServerName),
+ env("GATEWAY_INTERFACE",?GATEWAY_INTERFACE),
+ env("SERVER_PROTOCOL",?SERVER_PROTOCOL),
+ env("SERVER_PORT",
+ integer_to_list(httpd_util:lookup(Info#mod.config_db,port,80))),
+ env("REQUEST_METHOD",Info#mod.method),
+ env("REMOTE_ADDR",RemoteAddr),
+ env("SCRIPT_NAME",Script)],
+ Env1 =
+ case Info#mod.method of
+ "GET" ->
+ case AfterScript of
+ {[], QueryString} ->
+ [env("QUERY_STRING", QueryString)|Env];
+ {PathInfo, []} ->
+ Aliases = httpd_util:multi_lookup(
+ Info#mod.config_db,alias),
+ {_, PathTranslated, _} =
+ mod_alias:real_name(
+ Info#mod.config_db, PathInfo, Aliases),
+ [Env|
+ [env("PATH_INFO","/"++httpd_util:decode_hex(PathInfo)),
+ env("PATH_TRANSLATED",PathTranslated)]];
+ {PathInfo, QueryString} ->
+ Aliases = httpd_util:multi_lookup(
+ Info#mod.config_db,alias),
+ {_, PathTranslated, _} =
+ mod_alias:real_name(
+ Info#mod.config_db, PathInfo, Aliases),
+ [Env|
+ [env("PATH_INFO",
+ httpd_util:decode_hex(PathInfo)),
+ env("PATH_TRANSLATED",PathTranslated),
+ env("QUERY_STRING", QueryString)]];
+ [] ->
+ Env
+ end;
+ "POST" ->
+ [env("CONTENT_LENGTH",
+ integer_to_list(httpd_util:flatlength(
+ Info#mod.entity_body)))|Env];
+ _ ->
+ Env
+ end,
+ Env2 =
+ case httpd_util:key1search(Info#mod.data,remote_user) of
+ undefined ->
+ Env1;
+ RemoteUser ->
+ [env("REMOTE_USER",RemoteUser)|Env1] %% OTP-4416
+ end,
+ lists:flatten([Env2|PH]).
+
+
+parsed_header(List) ->
+ parsed_header(List, []).
+
+parsed_header([], SoFar) ->
+ SoFar;
+parsed_header([{Name,[Value|R1]}|R2], SoFar) when list(Value)->
+ NewName=lists:map(fun(X) -> if X == $- -> $_; true -> X end end,Name),
+ Env = env("HTTP_"++httpd_util:to_upper(NewName),
+ multi_value([Value|R1])),
+ parsed_header(R2, [Env|SoFar]);
+
+parsed_header([{Name,Value}|Rest], SoFar) ->
+ {ok,NewName,_} = regexp:gsub(Name, "-", "_"),
+ Env=env("HTTP_"++httpd_util:to_upper(NewName),Value),
+ parsed_header(Rest, [Env|SoFar]).
+
+
+multi_value([]) ->
+ [];
+multi_value([Value]) ->
+ Value;
+multi_value([Value|Rest]) ->
+ Value++", "++multi_value(Rest).
+
+
+exec_script(Info, Script, AfterScript, RequestURI) ->
+ ?vdebug("exec_script -> entry with"
+ "~n Script: ~p"
+ "~n AfterScript: ~p",
+ [Script,AfterScript]),
+ exec_script(is_executable(Script),Info,Script,AfterScript,RequestURI).
+
+exec_script(true, Info, Script, AfterScript, RequestURI) ->
+ ?vtrace("exec_script -> entry when script is executable",[]),
+ process_flag(trap_exit,true),
+ Dir = filename:dirname(Script),
+ [Script_Name|_] = string:tokens(RequestURI, "?"),
+ Env = env(Info, Script_Name, AfterScript),
+ Port = (catch open_port({spawn,Script},[stream,{cd, Dir},{env, Env}])),
+ ?vtrace("exec_script -> Port: ~w",[Port]),
+ case Port of
+ P when port(P) ->
+ %% Send entity_body to port.
+ Res = case Info#mod.entity_body of
+ [] ->
+ true;
+ EntityBody ->
+ (catch port_command(Port, EntityBody))
+ end,
+ case Res of
+ {'EXIT',Reason} ->
+ ?vlog("port send failed:"
+ "~n Port: ~p"
+ "~n URI: ~p"
+ "~n Reason: ~p",
+ [Port,Info#mod.request_uri,Reason]),
+ exit({open_cmd_failed,Reason,
+ [{mod,?MODULE},{port,Port},
+ {uri,Info#mod.request_uri},
+ {script,Script},{env,Env},{dir,Dir},
+ {ebody_size,sz(Info#mod.entity_body)}]});
+ true ->
+ proxy(Info, Port)
+ end;
+ {'EXIT',Reason} ->
+ ?vlog("open port failed: exit"
+ "~n URI: ~p"
+ "~n Reason: ~p",
+ [Info#mod.request_uri,Reason]),
+ exit({open_port_failed,Reason,
+ [{mod,?MODULE},{uri,Info#mod.request_uri},{script,Script},
+ {env,Env},{dir,Dir}]});
+ O ->
+ ?vlog("open port failed: unknown result"
+ "~n URI: ~p"
+ "~n O: ~p",
+ [Info#mod.request_uri,O]),
+ exit({open_port_failed,O,
+ [{mod,?MODULE},{uri,Info#mod.request_uri},{script,Script},
+ {env,Env},{dir,Dir}]})
+ end;
+
+exec_script(false,Info,Script,_AfterScript,_RequestURI) ->
+ ?vlog("script ~s not executable",[Script]),
+ {proceed,
+ [{status,
+ {404,Info#mod.request_uri,
+ ?NICE("You don't have permission to execute " ++
+ Info#mod.request_uri ++ " on this server")}}|
+ Info#mod.data]}.
+
+
+
+%%
+%% Socket <-> Port communication
+%%
+
+proxy(#mod{config_db = ConfigDb} = Info, Port) ->
+ Timeout = httpd_util:lookup(ConfigDb, cgi_timeout, ?DEFAULT_CGI_TIMEOUT),
+ proxy(Info, Port, 0, undefined,[], Timeout).
+
+proxy(Info, Port, Size, StatusCode, AccResponse, Timeout) ->
+ ?vdebug("proxy -> entry with"
+ "~n Size: ~p"
+ "~n StatusCode ~p"
+ "~n Timeout: ~p",
+ [Size, StatusCode, Timeout]),
+ receive
+ {Port, {data, Response}} when port(Port) ->
+ ?vtrace("proxy -> got some data from the port",[]),
+
+ NewStatusCode = update_status_code(StatusCode, Response),
+
+ ?vtrace("proxy -> NewStatusCode: ~p",[NewStatusCode]),
+ case send(Info, NewStatusCode, Response, Size, AccResponse) of
+ socket_closed ->
+ ?vtrace("proxy -> socket closed: kill port",[]),
+ (catch port_close(Port)), % KILL the port !!!!
+ process_flag(trap_exit,false),
+ {proceed,
+ [{response,{already_sent,200,Size}}|Info#mod.data]};
+
+ head_sent ->
+ ?vtrace("proxy -> head sent: kill port",[]),
+ (catch port_close(Port)), % KILL the port !!!!
+ process_flag(trap_exit,false),
+ {proceed,
+ [{response,{already_sent,200,Size}}|Info#mod.data]};
+
+ {http_response, NewAccResponse} ->
+ ?vtrace("proxy -> head response: continue",[]),
+ NewSize = get_new_size(Size, Response),
+ proxy(Info, Port, NewSize, NewStatusCode,
+ NewAccResponse, Timeout);
+
+ _ ->
+ ?vtrace("proxy -> continue",[]),
+ %% The data is sent and the socket is not closed, continue
+ NewSize = get_new_size(Size, Response),
+ proxy(Info, Port, NewSize, NewStatusCode,
+ "nonempty", Timeout)
+ end;
+
+ {'EXIT', Port, normal} when port(Port) ->
+ ?vtrace("proxy -> exit signal from port: normal",[]),
+ NewStatusCode = update_status_code(StatusCode,AccResponse),
+ final_send(Info,NewStatusCode,Size,AccResponse),
+ process_flag(trap_exit,false),
+ {proceed, [{response,{already_sent,200,Size}}|Info#mod.data]};
+
+ {'EXIT', Port, Reason} when port(Port) ->
+ ?vtrace("proxy -> exit signal from port: ~p",[Reason]),
+ process_flag(trap_exit, false),
+ {proceed, [{status,{400,none,reason(Reason)}}|Info#mod.data]};
+
+ {'EXIT', Pid, Reason} when pid(Pid) ->
+ %% This is the case that a linked process has died,
+ %% It would be nice to response with a server error
+ %% but since the heade alredy is sent
+ ?vtrace("proxy -> exit signal from ~p: ~p",[Pid, Reason]),
+ proxy(Info, Port, Size, StatusCode, AccResponse, Timeout);
+
+ %% This should not happen
+ WhatEver ->
+ ?vinfo("proxy -> received garbage: ~n~p", [WhatEver]),
+ NewStatusCode = update_status_code(StatusCode, AccResponse),
+ final_send(Info, StatusCode, Size, AccResponse),
+ process_flag(trap_exit, false),
+ {proceed, [{response,{already_sent,200,Size}}|Info#mod.data]}
+
+ after Timeout ->
+ ?vlog("proxy -> timeout",[]),
+ (catch port_close(Port)), % KILL the port !!!!
+ httpd_socket:close(Info#mod.socket_type, Info#mod.socket),
+ process_flag(trap_exit,false),
+ {proceed,[{response,{already_sent,200,Size}}|Info#mod.data]}
+ end.
+
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% %%
+%% The functions that handles the sending of the data to the client %%
+%% %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%----------------------------------------------------------------------
+%% Send the header the first time the size of the body is Zero
+%%----------------------------------------------------------------------
+
+send(#mod{method = "HEAD"} = Info, StatusCode, Response, 0, []) ->
+ first_handle_head_request(Info, StatusCode, Response);
+send(Info, StatusCode, Response, 0, []) ->
+ first_handle_other_request(Info, StatusCode, Response);
+
+%%----------------------------------------------------------------------
+%% The size of the body is bigger than zero =>
+%% we have a part of the body to send
+%%----------------------------------------------------------------------
+send(Info, StatusCode, Response, Size, AccResponse) ->
+ handle_other_request(Info, StatusCode, Response).
+
+
+%%----------------------------------------------------------------------
+%% The function is called the last time when the port has closed
+%%----------------------------------------------------------------------
+
+final_send(Info, StatusCode, Size, AccResponse)->
+ final_handle_other_request(Info, StatusCode).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% %%
+%% The code that handles the head requests %%
+%% %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%----------------------------------------------------------------------
+%% The request is a head request if its a HTPT/1.1 request answer to it
+%% otherwise we must collect the size of hte body before we can answer.
+%% Return Values:
+%% head_sent
+%%----------------------------------------------------------------------
+first_handle_head_request(Info, StatusCode, Response)->
+ case Info#mod.http_version of
+ "HTTP/1.1" ->
+ %% Since we have all we need to create the header create it
+ %% send it and return head_sent.
+ case httpd_util:split(Response,"\r\n\r\n|\n\n",2) of
+ {ok, [HeadEnd, Rest]} ->
+ HeadEnd1 = removeStatus(HeadEnd),
+ httpd_socket:deliver(Info#mod.socket_type,Info#mod.socket,
+ [create_header(Info,StatusCode),
+ HeadEnd1,"\r\n\r\n"]);
+ _ ->
+ httpd_socket:deliver(Info#mod.socket_type,Info#mod.socket,
+ [create_header(Info, StatusCode),
+ "Content-Type:text/html\r\n\r\n"])
+ end;
+ _ ->
+ Response1= case regexp:split(Response,"\r\n\r\n|\n\n") of
+ {ok,[HeadEnd|Rest]} ->
+ removeStatus(HeadEnd);
+ _ ->
+ ["Content-Type:text/html"]
+ end,
+ H1 = httpd_util:header(StatusCode,Info#mod.connection),
+ httpd_socket:deliver(Info#mod.socket_type,Info#mod.socket,
+ [H1,Response1,"\r\n\r\n"])
+ end,
+ head_sent.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% %%
+%% Handle the requests that is to the other methods %%
+%% %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%----------------------------------------------------------------------
+%% Create the http-response header and send it to the user if it is
+%% a http/1.1 request otherwise we must accumulate it
+%%----------------------------------------------------------------------
+first_handle_other_request(Info,StatusCode,Response)->
+ Header = create_header(Info,StatusCode),
+ Response1 =
+ case httpd_util:split(Response,"\r\n\r\n|\n\n",2) of
+ {ok,[HeadPart,[]]} ->
+ [Header, removeStatus(HeadPart),"\r\n\r\n"];
+
+ {ok,[HeadPart,BodyPart]} ->
+ [Header, removeStatus(HeadPart), "\r\n\r\n",
+ httpd_util:integer_to_hexlist(length(BodyPart)),
+ "\r\n", BodyPart];
+ _WhatEver ->
+ %% No response header field from the cgi-script,
+ %% Just a body
+ [Header, "Content-Type:text/html","\r\n\r\n",
+ httpd_util:integer_to_hexlist(length(Response)),
+ "\r\n", Response]
+ end,
+ httpd_socket:deliver(Info#mod.socket_type,Info#mod.socket, Response1).
+
+
+handle_other_request(#mod{http_version = "HTTP/1.1",
+ socket_type = Type, socket = Sock} = Info,
+ StatusCode, Response0) ->
+ Response = create_chunk(Info, Response0),
+ httpd_socket:deliver(Type, Sock, Response);
+handle_other_request(#mod{socket_type = Type, socket = Sock} = Info,
+ StatusCode, Response) ->
+ httpd_socket:deliver(Type, Sock, Response).
+
+
+final_handle_other_request(#mod{http_version = "HTTP/1.1",
+ socket_type = Type, socket = Sock},
+ StatusCode) ->
+ httpd_socket:deliver(Type, Sock, "0\r\n");
+final_handle_other_request(#mod{socket_type = Type, socket = Sock},
+ StatusCode) ->
+ httpd_socket:close(Type, Sock),
+ socket_closed.
+
+
+create_chunk(_Info, Response) ->
+ HEXSize = httpd_util:integer_to_hexlist(length(lists:flatten(Response))),
+ HEXSize++"\r\n"++Response++"\r\n".
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% %%
+%% The various helper functions %%
+%% %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+update_status_code(undefined, Response) ->
+ case status_code(Response) of
+ {ok, StatusCode1} ->
+ StatusCode1;
+ _ ->
+ ?vlog("invalid response from script:~n~p", [Response]),
+ 500
+ end;
+update_status_code(StatusCode,_Response)->
+ StatusCode.
+
+
+get_new_size(0,Response)->
+ case httpd_util:split(Response,"\r\n\r\n|\n\n",2) of
+ {ok,[Head,Body]}->
+ length(lists:flatten(Body));
+ _ ->
+ %%No header in the respone
+ length(lists:flatten(Response))
+ end;
+
+get_new_size(Size,Response)->
+ Size+length(lists:flatten(Response)).
+
+%%----------------------------------------------------------------------
+%% Creates the http-header for a response
+%%----------------------------------------------------------------------
+create_header(Info,StatusCode)->
+ Cache=case httpd_util:lookup(Info#mod.config_db,script_nocache,false) of
+ true->
+ Date=httpd_util:rfc1123_date(),
+ "Cache-Control:no-cache\r\nPragma:no-cache\r\nExpires:"++ Date ++ "\r\n";
+ false ->
+ []
+ end,
+ case Info#mod.http_version of
+ "HTTP/1.1" ->
+ Header=httpd_util:header(StatusCode, Info#mod.connection),
+ Header++"Transfer-encoding:chunked\r\n"++Cache;
+ _ ->
+ httpd_util:header(StatusCode,Info#mod.connection)++Cache
+ end.
+
+
+
+%% status_code
+
+status_code(Response) ->
+ case httpd_util:split(Response,"\n\n|\r\n\r\n",2) of
+ {ok,[Header,Body]} ->
+ case regexp:split(Header,"\n|\r\n") of
+ {ok,HeaderFields} ->
+ {ok,extract_status_code(HeaderFields)};
+ {error,_} ->
+ {error, bad_script_output(Response)}
+ end;
+ _ ->
+ %% No header field in the returned data return 200 the standard code
+ {ok, 200}
+ end.
+
+bad_script_output(Bad) ->
+ lists:flatten(io_lib:format("Bad script output ~s",[Bad])).
+
+
+extract_status_code([]) ->
+ 200;
+extract_status_code([[$L,$o,$c,$a,$t,$i,$o,$n,$:,$ |_]|_]) ->
+ 302;
+extract_status_code([[$S,$t,$a,$t,$u,$s,$:,$ |CodeAndReason]|_]) ->
+ case httpd_util:split(CodeAndReason," ",2) of
+ {ok,[Code,_]} ->
+ list_to_integer(Code);
+ {ok,_} ->
+ 200
+ end;
+extract_status_code([_|Rest]) ->
+ extract_status_code(Rest).
+
+
+sz(B) when binary(B) -> {binary,size(B)};
+sz(L) when list(L) -> {list,length(L)};
+sz(_) -> undefined.
+
+
+%% Convert error to printable string
+%%
+reason({error,emfile}) -> ": To many open files";
+reason({error,{enfile,_}}) -> ": File/port table overflow";
+reason({error,enomem}) -> ": Not enough memory";
+reason({error,eagain}) -> ": No more available OS processes";
+reason(_) -> "".
+
+removeStatus(Head)->
+ case httpd_util:split(Head,"Status:.\r\n",2) of
+ {ok,[HeadPart,HeadEnd]}->
+ HeadPart++HeadEnd;
+ _ ->
+ Head
+ end.
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% %%
+%% There are 2 config directives for mod_cgi: %%
+%% ScriptNoCache true|false, defines whether the server shall add %%
+%% header fields to stop proxies and %%
+%% clients from saving the page in history %%
+%% or cache %%
+%% %%
+%% ScriptTimeout Seconds, The number of seconds that the server %%
+%% maximum will wait for the script to %%
+%% generate a part of the document %%
+%% %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+load([$S,$c,$r,$i,$p,$t,$N,$o,$C,$a,$c,$h,$e |CacheArg],[])->
+ case catch list_to_atom(httpd_conf:clean(CacheArg)) of
+ true ->
+ {ok, [], {script_nocache,true}};
+ false ->
+ {ok, [], {script_nocache,false}};
+ _ ->
+ {error, ?NICE(httpd_conf:clean(CacheArg)++
+ " is an invalid ScriptNoCache directive")}
+ end;
+
+load([$S,$c,$r,$i,$p,$t,$T,$i,$m,$e,$o,$u,$t,$ |Timeout],[])->
+ case catch list_to_integer(httpd_conf:clean(Timeout)) of
+ TimeoutSec when integer(TimeoutSec) ->
+ {ok, [], {script_timeout,TimeoutSec*1000}};
+ _ ->
+ {error, ?NICE(httpd_conf:clean(Timeout)++
+ " is an invalid ScriptTimeout")}
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_dir.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_dir.erl
new file mode 100644
index 0000000000..9dda6d9119
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_dir.erl
@@ -0,0 +1,266 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mod_dir.erl,v 1.1 2008/12/17 09:53:35 mikpe Exp $
+%%
+-module(mod_dir).
+-export([do/1]).
+
+-include("httpd.hrl").
+
+%% do
+
+do(Info) ->
+ ?DEBUG("do -> entry",[]),
+ case Info#mod.method of
+ "GET" ->
+ case httpd_util:key1search(Info#mod.data,status) of
+ %% A status code has been generated!
+ {StatusCode,PhraseArgs,Reason} ->
+ {proceed,Info#mod.data};
+ %% No status code has been generated!
+ undefined ->
+ case httpd_util:key1search(Info#mod.data,response) of
+ %% No response has been generated!
+ undefined ->
+ do_dir(Info);
+ %% A response has been generated or sent!
+ Response ->
+ {proceed,Info#mod.data}
+ end
+ end;
+ %% Not a GET method!
+ _ ->
+ {proceed,Info#mod.data}
+ end.
+
+do_dir(Info) ->
+ ?DEBUG("do_dir -> Request URI: ~p",[Info#mod.request_uri]),
+ Path = mod_alias:path(Info#mod.data,Info#mod.config_db,
+ Info#mod.request_uri),
+ DefaultPath = mod_alias:default_index(Info#mod.config_db,Path),
+ %% Is it a directory?
+ case file:read_file_info(DefaultPath) of
+ {ok,FileInfo} when FileInfo#file_info.type == directory ->
+ DecodedRequestURI =
+ httpd_util:decode_hex(Info#mod.request_uri),
+ ?DEBUG("do_dir -> ~n"
+ " Path: ~p~n"
+ " DefaultPath: ~p~n"
+ " DecodedRequestURI: ~p",
+ [Path,DefaultPath,DecodedRequestURI]),
+ case dir(DefaultPath,string:strip(DecodedRequestURI,right,$/),Info#mod.config_db) of
+ {ok, Dir} ->
+ Head=[{content_type,"text/html"},
+ {content_length,integer_to_list(httpd_util:flatlength(Dir))},
+ {date,httpd_util:rfc1123_date(FileInfo#file_info.mtime)},
+ {code,200}],
+ {proceed,[{response,{response,Head,Dir}},
+ {mime_type,"text/html"}|Info#mod.data]};
+ {error, Reason} ->
+ ?ERROR("do_dir -> dir operation failed: ~p",[Reason]),
+ {proceed,
+ [{status,{404,Info#mod.request_uri,Reason}}|
+ Info#mod.data]}
+ end;
+ {ok,FileInfo} ->
+ ?DEBUG("do_dir -> ~n"
+ " Path: ~p~n"
+ " DefaultPath: ~p~n"
+ " FileInfo: ~p",
+ [Path,DefaultPath,FileInfo]),
+ {proceed,Info#mod.data};
+ {error,Reason} ->
+ ?LOG("do_dir -> failed reading file info (~p) for: ~p",
+ [Reason,DefaultPath]),
+ {proceed,
+ [{status,read_file_info_error(Reason,Info,DefaultPath)}|
+ Info#mod.data]}
+ end.
+
+dir(Path,RequestURI,ConfigDB) ->
+ case file:list_dir(Path) of
+ {ok,FileList} ->
+ SortedFileList=lists:sort(FileList),
+ {ok,[header(Path,RequestURI),
+ body(Path,RequestURI,ConfigDB,SortedFileList),
+ footer(Path,SortedFileList)]};
+ {error,Reason} ->
+ {error,?NICE("Can't open directory "++Path++": "++Reason)}
+ end.
+
+%% header
+
+header(Path,RequestURI) ->
+ Header=
+ "<HTML>\n<HEAD>\n<TITLE>Index of "++RequestURI++"</TITLE>\n</HEAD>\n<BODY>\n<H1>Index of "++
+ RequestURI++"</H1>\n<PRE><IMG SRC=\""++icon(blank)++
+ "\" ALT=" "> Name Last modified Size Description
+<HR>\n",
+ case regexp:sub(RequestURI,"[^/]*\$","") of
+ {ok,"/",_} ->
+ Header;
+ {ok,ParentRequestURI,_} ->
+ {ok,ParentPath,_}=regexp:sub(string:strip(Path,right,$/),"[^/]*\$",""),
+ Header++format(ParentPath,ParentRequestURI)
+ end.
+
+format(Path,RequestURI) ->
+ {ok,FileInfo}=file:read_file_info(Path),
+ {{Year,Month,Day},{Hour,Minute,Second}}=FileInfo#file_info.mtime,
+ io_lib:format("<IMG SRC=\"~s\" ALT=\"[~s]\"> <A HREF=\"~s\">Parent directory</A> ~2.2.0w-~s-~w ~2.2.0w:~2.2.0w -\n",
+ [icon(back),"DIR",RequestURI,Day,
+ httpd_util:month(Month),Year,Hour,Minute]).
+
+%% body
+
+body(Path,RequestURI,ConfigDB,[]) ->
+ [];
+body(Path,RequestURI,ConfigDB,[Entry|Rest]) ->
+ [format(Path,RequestURI,ConfigDB,Entry)|body(Path,RequestURI,ConfigDB,Rest)].
+
+format(Path,RequestURI,ConfigDB,Entry) ->
+ case file:read_file_info(Path++"/"++Entry) of
+ {ok,FileInfo} when FileInfo#file_info.type == directory ->
+ {{Year,Month,Day},{Hour,Minute,Second}}=FileInfo#file_info.mtime,
+ EntryLength=length(Entry),
+ if
+ EntryLength > 21 ->
+ io_lib:format("<IMG SRC=\"~s\" ALT=\"[~s]\"> <A HREF=\"~s\">~-21.s..</A>~2.2.0w-~s-~w ~2.2.0w:~2.2.0w -\n",
+ [icon(folder),"DIR",RequestURI++"/"++Entry++"/",Entry,
+ Day,httpd_util:month(Month),Year,Hour,Minute]);
+ true ->
+ io_lib:format("<IMG SRC=\"~s\" ALT=\"[~s]\"> <A HREF=\"~s\">~s</A>~*.*c~2.2.0w-~s-~w ~2.2.0w:~2.2.0w -\n",
+ [icon(folder),"DIR",RequestURI++"/"++Entry++"/",Entry,
+ 23-EntryLength,23-EntryLength,$ ,Day,
+ httpd_util:month(Month),Year,Hour,Minute])
+ end;
+ {ok,FileInfo} ->
+ {{Year,Month,Day},{Hour,Minute,Second}}=FileInfo#file_info.mtime,
+ Suffix=httpd_util:suffix(Entry),
+ MimeType=httpd_util:lookup_mime(ConfigDB,Suffix,""),
+ EntryLength=length(Entry),
+ if
+ EntryLength > 21 ->
+ io_lib:format("<IMG SRC=\"~s\" ALT=\"[~s]\"> <A HREF=\"~s\">~-21.s..</A>~2.2.0w-~s-~w ~2.2.0w:~2.2.0w~8wk ~s\n",
+ [icon(Suffix,MimeType),Suffix,RequestURI++"/"++Entry,
+ Entry,Day,httpd_util:month(Month),Year,Hour,Minute,
+ trunc(FileInfo#file_info.size/1024+1),MimeType]);
+ true ->
+ io_lib:format("<IMG SRC=\"~s\" ALT=\"[~s]\"> <A HREF=\"~s\">~s</A>~*.*c~2.2.0w-~s-~w ~2.2.0w:~2.2.0w~8wk ~s\n",
+ [icon(Suffix,MimeType),Suffix,RequestURI++"/"++Entry,
+ Entry,23-EntryLength,23-EntryLength,$ ,Day,
+ httpd_util:month(Month),Year,Hour,Minute,
+ trunc(FileInfo#file_info.size/1024+1),MimeType])
+ end;
+ {error,Reason} ->
+ ""
+ end.
+
+%% footer
+
+footer(Path,FileList) ->
+ case lists:member("README",FileList) of
+ true ->
+ {ok,Body}=file:read_file(Path++"/README"),
+ "</PRE>\n<HR>\n<PRE>\n"++binary_to_list(Body)++
+ "\n</PRE>\n</BODY>\n</HTML>\n";
+ false ->
+ "</PRE>\n</BODY>\n</HTML>\n"
+ end.
+
+%%
+%% Icon mappings are hard-wired ala default Apache (Ugly!)
+%%
+
+icon(Suffix,MimeType) ->
+ case icon(Suffix) of
+ undefined ->
+ case MimeType of
+ [$t,$e,$x,$t,$/|_] ->
+ "/icons/text.gif";
+ [$i,$m,$a,$g,$e,$/|_] ->
+ "/icons/image2.gif";
+ [$a,$u,$d,$i,$o,$/|_] ->
+ "/icons/sound2.gif";
+ [$v,$i,$d,$e,$o,$/|_] ->
+ "/icons/movie.gif";
+ _ ->
+ "/icons/unknown.gif"
+ end;
+ Icon ->
+ Icon
+ end.
+
+icon(blank) -> "/icons/blank.gif";
+icon(back) -> "/icons/back.gif";
+icon(folder) -> "/icons/folder.gif";
+icon("bin") -> "/icons/binary.gif";
+icon("exe") -> "/icons/binary.gif";
+icon("hqx") -> "/icons/binhex.gif";
+icon("tar") -> "/icons/tar.gif";
+icon("wrl") -> "/icons/world2.gif";
+icon("wrl.gz") -> "/icons/world2.gif";
+icon("vrml") -> "/icons/world2.gif";
+icon("vrm") -> "/icons/world2.gif";
+icon("iv") -> "/icons/world2.gif";
+icon("Z") -> "/icons/compressed.gif";
+icon("z") -> "/icons/compressed.gif";
+icon("tgz") -> "/icons/compressed.gif";
+icon("gz") -> "/icons/compressed.gif";
+icon("zip") -> "/icons/compressed.gif";
+icon("ps") -> "/icons/a.gif";
+icon("ai") -> "/icons/a.gif";
+icon("eps") -> "/icons/a.gif";
+icon("html") -> "/icons/layout.gif";
+icon("shtml") -> "/icons/layout.gif";
+icon("htm") -> "/icons/layout.gif";
+icon("pdf") -> "/icons/layout.gif";
+icon("txt") -> "/icons/text.gif";
+icon("erl") -> "/icons/burst.gif";
+icon("c") -> "/icons/c.gif";
+icon("pl") -> "/icons/p.gif";
+icon("py") -> "/icons/p.gif";
+icon("for") -> "/icons/f.gif";
+icon("dvi") -> "/icons/dvi.gif";
+icon("uu") -> "/icons/uuencoded.gif";
+icon("conf") -> "/icons/script.gif";
+icon("sh") -> "/icons/script.gif";
+icon("shar") -> "/icons/script.gif";
+icon("csh") -> "/icons/script.gif";
+icon("ksh") -> "/icons/script.gif";
+icon("tcl") -> "/icons/script.gif";
+icon("tex") -> "/icons/tex.gif";
+icon("core") -> "/icons/tex.gif";
+icon(_) -> undefined.
+
+
+read_file_info_error(eacces,Info,Path) ->
+ read_file_info_error(403,Info,Path,
+ ": Missing search permissions for one "
+ "of the parent directories");
+read_file_info_error(enoent,Info,Path) ->
+ read_file_info_error(404,Info,Path,"");
+read_file_info_error(enotdir,Info,Path) ->
+ read_file_info_error(404,Info,Path,
+ ": A component of the file name is not a directory");
+read_file_info_error(_,Info,Path) ->
+ read_file_info_error(500,none,Path,"").
+
+read_file_info_error(StatusCode,none,Path,Reason) ->
+ {StatusCode,none,?NICE("Can't access "++Path++Reason)};
+read_file_info_error(StatusCode,Info,Path,Reason) ->
+ {StatusCode,Info#mod.request_uri,
+ ?NICE("Can't access "++Path++Reason)}.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_disk_log.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_disk_log.erl
new file mode 100644
index 0000000000..bb175f24b0
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_disk_log.erl
@@ -0,0 +1,404 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mod_disk_log.erl,v 1.1 2008/12/17 09:53:35 mikpe Exp $
+%%
+-module(mod_disk_log).
+-export([do/1,error_log/5,security_log/2,load/2,store/2,remove/1]).
+
+-export([report_error/2]).
+
+-define(VMODULE,"DISK_LOG").
+-include("httpd_verbosity.hrl").
+
+-include("httpd.hrl").
+
+%% do
+
+do(Info) ->
+ AuthUser = auth_user(Info#mod.data),
+ Date = custom_date(),
+ log_internal_info(Info,Date,Info#mod.data),
+ LogFormat = get_log_format(Info#mod.config_db),
+ case httpd_util:key1search(Info#mod.data,status) of
+ %% A status code has been generated!
+ {StatusCode,PhraseArgs,Reason} ->
+ transfer_log(Info, "-", AuthUser, Date, StatusCode, 0, LogFormat),
+ if
+ StatusCode >= 400 ->
+ error_log(Info, Date, Reason, LogFormat);
+ true ->
+ not_an_error
+ end,
+ {proceed,Info#mod.data};
+ %% No status code has been generated!
+ undefined ->
+ case httpd_util:key1search(Info#mod.data,response) of
+ {already_sent,StatusCode,Size} ->
+ transfer_log(Info, "-", AuthUser, Date, StatusCode,
+ Size, LogFormat),
+ {proceed,Info#mod.data};
+
+ {response, Head, Body} ->
+ Size = httpd_util:key1search(Head, content_length, 0),
+ Code = httpd_util:key1search(Head, code, 200),
+ transfer_log(Info, "-", AuthUser, Date, Code,
+ Size, LogFormat),
+ {proceed,Info#mod.data};
+
+ {StatusCode,Response} ->
+ transfer_log(Info, "-", AuthUser, Date, 200,
+ httpd_util:flatlength(Response), LogFormat),
+ {proceed,Info#mod.data};
+ undefined ->
+ transfer_log(Info, "-", AuthUser, Date, 200,
+ 0, LogFormat),
+ {proceed,Info#mod.data}
+ end
+ end.
+
+custom_date() ->
+ LocalTime = calendar:local_time(),
+ UniversalTime = calendar:universal_time(),
+ Minutes = round(diff_in_minutes(LocalTime,UniversalTime)),
+ {{YYYY,MM,DD},{Hour,Min,Sec}} = LocalTime,
+ Date =
+ io_lib:format("~.2.0w/~.3s/~.4w:~.2.0w:~.2.0w:~.2.0w ~c~.2.0w~.2.0w",
+ [DD,httpd_util:month(MM),YYYY,Hour,Min,Sec,sign(Minutes),
+ abs(Minutes) div 60,abs(Minutes) rem 60]),
+ lists:flatten(Date).
+
+diff_in_minutes(L,U) ->
+ (calendar:datetime_to_gregorian_seconds(L) -
+ calendar:datetime_to_gregorian_seconds(U))/60.
+
+sign(Minutes) when Minutes > 0 ->
+ $+;
+sign(Minutes) ->
+ $-.
+
+auth_user(Data) ->
+ case httpd_util:key1search(Data,remote_user) of
+ undefined ->
+ "-";
+ RemoteUser ->
+ RemoteUser
+ end.
+
+%% log_internal_info
+
+log_internal_info(Info,Date,[]) ->
+ ok;
+log_internal_info(Info,Date,[{internal_info,Reason}|Rest]) ->
+ Format = get_log_format(Info#mod.config_db),
+ error_log(Info,Date,Reason,Format),
+ log_internal_info(Info,Date,Rest);
+log_internal_info(Info,Date,[_|Rest]) ->
+ log_internal_info(Info,Date,Rest).
+
+
+%% transfer_log
+
+transfer_log(Info,RFC931,AuthUser,Date,StatusCode,Bytes,Format) ->
+ case httpd_util:lookup(Info#mod.config_db,transfer_disk_log) of
+ undefined ->
+ no_transfer_log;
+ TransferDiskLog ->
+ {PortNumber,RemoteHost}=(Info#mod.init_data)#init_data.peername,
+ Entry = io_lib:format("~s ~s ~s [~s] \"~s\" ~w ~w~n",
+ [RemoteHost,RFC931,AuthUser,Date,
+ Info#mod.request_line,StatusCode,Bytes]),
+ write(TransferDiskLog, Entry, Format)
+ end.
+
+
+%% error_log
+
+error_log(Info, Date, Reason, Format) ->
+ Format=get_log_format(Info#mod.config_db),
+ case httpd_util:lookup(Info#mod.config_db,error_disk_log) of
+ undefined ->
+ no_error_log;
+ ErrorDiskLog ->
+ {PortNumber,RemoteHost}=(Info#mod.init_data)#init_data.peername,
+ Entry =
+ io_lib:format("[~s] access to ~s failed for ~s, reason: ~p~n",
+ [Date, Info#mod.request_uri,
+ RemoteHost, Reason]),
+ write(ErrorDiskLog, Entry, Format)
+ end.
+
+error_log(SocketType, Socket, ConfigDB, {PortNumber, RemoteHost}, Reason) ->
+ Format = get_log_format(ConfigDB),
+ case httpd_util:lookup(ConfigDB,error_disk_log) of
+ undefined ->
+ no_error_log;
+ ErrorDiskLog ->
+ Date = custom_date(),
+ Entry =
+ io_lib:format("[~s] server crash for ~s, reason: ~p~n",
+ [Date,RemoteHost,Reason]),
+ write(ErrorDiskLog, Entry, Format),
+ ok
+ end.
+
+
+%% security_log
+
+security_log(ConfigDB, Event) ->
+ Format = get_log_format(ConfigDB),
+ case httpd_util:lookup(ConfigDB,security_disk_log) of
+ undefined ->
+ no_error_log;
+ DiskLog ->
+ Date = custom_date(),
+ Entry = io_lib:format("[~s] ~s ~n", [Date, Event]),
+ write(DiskLog, Entry, Format),
+ ok
+ end.
+
+report_error(ConfigDB, Error) ->
+ Format = get_log_format(ConfigDB),
+ case httpd_util:lookup(ConfigDB, error_disk_log) of
+ undefined ->
+ no_error_log;
+ ErrorDiskLog ->
+ Date = custom_date(),
+ Entry = io_lib:format("[~s] reporting error: ~s",[Date,Error]),
+ write(ErrorDiskLog, Entry, Format),
+ ok
+ end.
+
+%%----------------------------------------------------------------------
+%% Get the current format of the disklog
+%%----------------------------------------------------------------------
+get_log_format(ConfigDB)->
+ httpd_util:lookup(ConfigDB,disk_log_format,external).
+
+
+%%
+%% Configuration
+%%
+
+%% load
+
+load([$T,$r,$a,$n,$s,$f,$e,$r,$D,$i,$s,$k,$L,$o,$g,$S,$i,$z,$e,$ |
+ TransferDiskLogSize],[]) ->
+ case regexp:split(TransferDiskLogSize," ") of
+ {ok,[MaxBytes,MaxFiles]} ->
+ case httpd_conf:make_integer(MaxBytes) of
+ {ok,MaxBytesInteger} ->
+ case httpd_conf:make_integer(MaxFiles) of
+ {ok,MaxFilesInteger} ->
+ {ok,[],{transfer_disk_log_size,
+ {MaxBytesInteger,MaxFilesInteger}}};
+ {error,_} ->
+ {error,
+ ?NICE(httpd_conf:clean(TransferDiskLogSize)++
+ " is an invalid TransferDiskLogSize")}
+ end;
+ {error,_} ->
+ {error,?NICE(httpd_conf:clean(TransferDiskLogSize)++
+ " is an invalid TransferDiskLogSize")}
+ end
+ end;
+load([$T,$r,$a,$n,$s,$f,$e,$r,$D,$i,$s,$k,$L,$o,$g,$ |TransferDiskLog],[]) ->
+ {ok,[],{transfer_disk_log,httpd_conf:clean(TransferDiskLog)}};
+
+load([$E,$r,$r,$o,$r,$D,$i,$s,$k,$L,$o,$g,$S,$i,$z,$e,$ | ErrorDiskLogSize],[]) ->
+ case regexp:split(ErrorDiskLogSize," ") of
+ {ok,[MaxBytes,MaxFiles]} ->
+ case httpd_conf:make_integer(MaxBytes) of
+ {ok,MaxBytesInteger} ->
+ case httpd_conf:make_integer(MaxFiles) of
+ {ok,MaxFilesInteger} ->
+ {ok,[],{error_disk_log_size,
+ {MaxBytesInteger,MaxFilesInteger}}};
+ {error,_} ->
+ {error,?NICE(httpd_conf:clean(ErrorDiskLogSize)++
+ " is an invalid ErrorDiskLogSize")}
+ end;
+ {error,_} ->
+ {error,?NICE(httpd_conf:clean(ErrorDiskLogSize)++
+ " is an invalid ErrorDiskLogSize")}
+ end
+ end;
+load([$E,$r,$r,$o,$r,$D,$i,$s,$k,$L,$o,$g,$ |ErrorDiskLog],[]) ->
+ {ok, [], {error_disk_log, httpd_conf:clean(ErrorDiskLog)}};
+
+load([$S,$e,$c,$u,$r,$i,$t,$y,$D,$i,$s,$k,$L,$o,$g,$S,$i,$z,$e,$ |SecurityDiskLogSize],[]) ->
+ case regexp:split(SecurityDiskLogSize, " ") of
+ {ok, [MaxBytes, MaxFiles]} ->
+ case httpd_conf:make_integer(MaxBytes) of
+ {ok, MaxBytesInteger} ->
+ case httpd_conf:make_integer(MaxFiles) of
+ {ok, MaxFilesInteger} ->
+ {ok, [], {security_disk_log_size,
+ {MaxBytesInteger, MaxFilesInteger}}};
+ {error,_} ->
+ {error, ?NICE(httpd_conf:clean(SecurityDiskLogSize)++
+ " is an invalid SecurityDiskLogSize")}
+ end;
+ {error, _} ->
+ {error, ?NICE(httpd_conf:clean(SecurityDiskLogSize)++
+ " is an invalid SecurityDiskLogSize")}
+ end
+ end;
+load([$S,$e,$c,$u,$r,$i,$t,$y,$D,$i,$s,$k,$L,$o,$g,$ |SecurityDiskLog],[]) ->
+ {ok, [], {security_disk_log, httpd_conf:clean(SecurityDiskLog)}};
+
+load([$D,$i,$s,$k,$L,$o,$g,$F,$o,$r,$m,$a,$t,$ |Format],[]) ->
+ case httpd_conf:clean(Format) of
+ "internal" ->
+ {ok, [], {disk_log_format,internal}};
+ "external" ->
+ {ok, [], {disk_log_format,external}};
+ _Default ->
+ {ok, [], {disk_log_format,external}}
+ end.
+
+%% store
+
+store({transfer_disk_log,TransferDiskLog},ConfigList) ->
+ case create_disk_log(TransferDiskLog, transfer_disk_log_size, ConfigList) of
+ {ok,TransferDB} ->
+ {ok,{transfer_disk_log,TransferDB}};
+ {error,Reason} ->
+ {error,Reason}
+ end;
+store({security_disk_log,SecurityDiskLog},ConfigList) ->
+ case create_disk_log(SecurityDiskLog, security_disk_log_size, ConfigList) of
+ {ok,SecurityDB} ->
+ {ok,{security_disk_log,SecurityDB}};
+ {error,Reason} ->
+ {error,Reason}
+ end;
+store({error_disk_log,ErrorDiskLog},ConfigList) ->
+ case create_disk_log(ErrorDiskLog, error_disk_log_size, ConfigList) of
+ {ok,ErrorDB} ->
+ {ok,{error_disk_log,ErrorDB}};
+ {error,Reason} ->
+ {error,Reason}
+ end.
+
+
+%%----------------------------------------------------------------------
+%% Open or creates the disklogs
+%%----------------------------------------------------------------------
+log_size(ConfigList, Tag) ->
+ httpd_util:key1search(ConfigList, Tag, {500*1024,8}).
+
+create_disk_log(LogFile, SizeTag, ConfigList) ->
+ Filename = httpd_conf:clean(LogFile),
+ {MaxBytes, MaxFiles} = log_size(ConfigList, SizeTag),
+ case filename:pathtype(Filename) of
+ absolute ->
+ create_disk_log(Filename, MaxBytes, MaxFiles, ConfigList);
+ volumerelative ->
+ create_disk_log(Filename, MaxBytes, MaxFiles, ConfigList);
+ relative ->
+ case httpd_util:key1search(ConfigList,server_root) of
+ undefined ->
+ {error,
+ ?NICE(Filename++
+ " is an invalid ErrorLog beacuse ServerRoot is not defined")};
+ ServerRoot ->
+ AbsoluteFilename = filename:join(ServerRoot,Filename),
+ create_disk_log(AbsoluteFilename, MaxBytes, MaxFiles,
+ ConfigList)
+ end
+ end.
+
+create_disk_log(Filename, MaxBytes, MaxFiles, ConfigList) ->
+ Format = httpd_util:key1search(ConfigList, disk_log_format, external),
+ open(Filename, MaxBytes, MaxFiles, Format).
+
+
+
+%% remove
+remove(ConfigDB) ->
+ lists:foreach(fun([DiskLog]) -> close(DiskLog) end,
+ ets:match(ConfigDB,{transfer_disk_log,'$1'})),
+ lists:foreach(fun([DiskLog]) -> close(DiskLog) end,
+ ets:match(ConfigDB,{error_disk_log,'$1'})),
+ ok.
+
+
+%%
+%% Some disk_log wrapper functions:
+%%
+
+%%----------------------------------------------------------------------
+%% Function: open/4
+%% Description: Open a disk log file.
+%% Control which format the disk log will be in. The external file
+%% format is used as default since that format was used by older
+%% implementations of inets.
+%%
+%% When the internal disk log format is used, we will do some extra
+%% controls. If the files are valid, try to repair them and if
+%% thats not possible, truncate.
+%%----------------------------------------------------------------------
+
+open(Filename, MaxBytes, MaxFiles, internal) ->
+ Opts = [{format, internal}, {repair, truncate}],
+ open1(Filename, MaxBytes, MaxFiles, Opts);
+open(Filename, MaxBytes, MaxFiles, _) ->
+ Opts = [{format, external}],
+ open1(Filename, MaxBytes, MaxFiles, Opts).
+
+open1(Filename, MaxBytes, MaxFiles, Opts0) ->
+ Opts1 = [{name, Filename}, {file, Filename}, {type, wrap}] ++ Opts0,
+ case open2(Opts1, {MaxBytes, MaxFiles}) of
+ {ok, LogDB} ->
+ {ok, LogDB};
+ {error, Reason} ->
+ ?vlog("failed opening disk log with args:"
+ "~n Filename: ~p"
+ "~n MaxBytes: ~p"
+ "~n MaxFiles: ~p"
+ "~n Opts0: ~p"
+ "~nfor reason:"
+ "~n ~p", [Filename, MaxBytes, MaxFiles, Opts0, Reason]),
+ {error,
+ ?NICE("Can't create " ++ Filename ++
+ lists:flatten(io_lib:format(", ~p",[Reason])))};
+ _ ->
+ {error, ?NICE("Can't create "++Filename)}
+ end.
+
+open2(Opts, Size) ->
+ case disk_log:open(Opts) of
+ {error, {badarg, size}} ->
+ %% File did not exist, add the size option and try again
+ disk_log:open([{size, Size} | Opts]);
+ Else ->
+ Else
+ end.
+
+
+%%----------------------------------------------------------------------
+%% Actually writes the entry to the disk_log. If the log is an
+%% internal disk_log write it with log otherwise with blog.
+%%----------------------------------------------------------------------
+write(Log, Entry, internal) ->
+ disk_log:log(Log, Entry);
+
+write(Log, Entry, _) ->
+ disk_log:blog(Log, Entry).
+
+%% Close the log file
+close(Log) ->
+ disk_log:close(Log).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_esi.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_esi.erl
new file mode 100644
index 0000000000..cb211749da
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_esi.erl
@@ -0,0 +1,481 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mod_esi.erl,v 1.1 2008/12/17 09:53:35 mikpe Exp $
+%%
+-module(mod_esi).
+-export([do/1,load/2]).
+
+%%Functions provided to help erl scheme alias programmer to
+%%Create dynamic webpages that are sent back to the user during
+%%Generation
+-export([deliver/2]).
+
+
+-include("httpd.hrl").
+
+-define(VMODULE,"ESI").
+-include("httpd_verbosity.hrl").
+
+-define(GATEWAY_INTERFACE,"CGI/1.1").
+-define(DEFAULT_ERL_TIMEOUT,15000).
+%% do
+
+do(Info) ->
+ ?vtrace("do",[]),
+ case httpd_util:key1search(Info#mod.data,status) of
+ %% A status code has been generated!
+ {StatusCode,PhraseArgs,Reason} ->
+ {proceed,Info#mod.data};
+ %% No status code has been generated!
+ undefined ->
+ case httpd_util:key1search(Info#mod.data,response) of
+ %% No response has been generated!
+ undefined ->
+ case erl_or_eval(Info#mod.request_uri,
+ Info#mod.config_db) of
+ {eval,CGIBody,Modules} ->
+ eval(Info,Info#mod.method,CGIBody,Modules);
+ {erl,CGIBody,Modules} ->
+ erl(Info,Info#mod.method,CGIBody,Modules);
+ proceed ->
+ {proceed,Info#mod.data}
+ end;
+ %% A response has been generated or sent!
+ Response ->
+ {proceed,Info#mod.data}
+ end
+ end.
+
+
+
+%% erl_or_eval
+
+erl_or_eval(RequestURI, ConfigDB) ->
+ case erlp(RequestURI, ConfigDB) of
+ false ->
+ case evalp(RequestURI, ConfigDB) of
+ false ->
+ ?vtrace("neither erl nor eval",[]),
+ proceed;
+ Other ->
+ Other
+ end;
+ Other ->
+ Other
+ end.
+
+erlp(RequestURI, ConfigDB) ->
+ case httpd_util:multi_lookup(ConfigDB, erl_script_alias) of
+ [] ->
+ false;
+ AliasMods ->
+ erlp_find_alias(RequestURI,AliasMods)
+ end.
+
+erlp_find_alias(_RequestURI,[]) ->
+ ?vtrace("erlp_find_alias -> no match",[]),
+ false;
+erlp_find_alias(RequestURI,[{Alias,Modules}|Rest]) ->
+ case regexp:first_match(RequestURI,"^"++Alias++"/") of
+ {match,1,Length} ->
+ ?vtrace("erlp -> match with Length: ~p",[Length]),
+ {erl,string:substr(RequestURI,Length+1),Modules};
+ nomatch ->
+ erlp_find_alias(RequestURI,Rest)
+ end.
+
+evalp(RequestURI, ConfigDB) ->
+ case httpd_util:multi_lookup(ConfigDB, eval_script_alias) of
+ [] ->
+ false;
+ AliasMods ->
+ evalp_find_alias(RequestURI,AliasMods)
+ end.
+
+evalp_find_alias(_RequestURI,[]) ->
+ ?vtrace("evalp_find_alias -> no match",[]),
+ false;
+evalp_find_alias(RequestURI,[{Alias,Modules}|Rest]) ->
+ case regexp:first_match(RequestURI,"^"++Alias++"\\?") of
+ {match, 1, Length} ->
+ ?vtrace("evalp_find_alias -> match with Length: ~p",[Length]),
+ {eval, string:substr(RequestURI,Length+1),Modules};
+ nomatch ->
+ evalp_find_alias(RequestURI,Rest)
+ end.
+
+
+%%
+%% Erl mechanism
+%%
+
+%%This is exactly the same as the GET method the difference is that
+%%The response must not contain any data expect the response header
+
+
+erl(Info,"HEAD",CGIBody,Modules) ->
+ erl(Info,"GET",CGIBody,Modules);
+
+erl(Info,"GET",CGIBody,Modules) ->
+ ?vtrace("erl GET request",[]),
+ case httpd_util:split(CGIBody,":|%3A|/",2) of
+ {ok, [Mod,FuncAndInput]} ->
+ ?vtrace("~n Mod: ~p"
+ "~n FuncAndInput: ~p",[Mod,FuncAndInput]),
+ case httpd_util:split(FuncAndInput,"[\?/]",2) of
+ {ok, [Func,Input]} ->
+ ?vtrace("~n Func: ~p"
+ "~n Input: ~p",[Func,Input]),
+ exec(Info,"GET",CGIBody,Modules,Mod,Func,
+ {input_type(FuncAndInput),Input});
+ {ok, [Func]} ->
+ exec(Info,"GET",CGIBody,Modules,Mod,Func,{no_input,""});
+ {ok, BadRequest} ->
+ {proceed,[{status,{400,none,BadRequest}}|Info#mod.data]}
+ end;
+ {ok, BadRequest} ->
+ ?vlog("erl BAD (GET-) request",[]),
+ {proceed, [{status,{400,none,BadRequest}}|Info#mod.data]}
+ end;
+
+erl(Info, "POST", CGIBody, Modules) ->
+ ?vtrace("erl POST request",[]),
+ case httpd_util:split(CGIBody,":|%3A|/",2) of
+ {ok,[Mod,Func]} ->
+ ?vtrace("~n Mod: ~p"
+ "~n Func: ~p",[Mod,Func]),
+ exec(Info,"POST",CGIBody,Modules,Mod,Func,
+ {entity_body,Info#mod.entity_body});
+ {ok,BadRequest} ->
+ ?vlog("erl BAD (POST-) request",[]),
+ {proceed,[{status,{400,none,BadRequest}}|Info#mod.data]}
+ end.
+
+input_type([]) ->
+ no_input;
+input_type([$/|Rest]) ->
+ path_info;
+input_type([$?|Rest]) ->
+ query_string;
+input_type([First|Rest]) ->
+ input_type(Rest).
+
+
+%% exec
+
+exec(Info,Method,CGIBody,["all"],Mod,Func,{Type,Input}) ->
+ ?vtrace("exec ~s 'all'",[Method]),
+ exec(Info,Method,CGIBody,[Mod],Mod,Func,{Type,Input});
+exec(Info,Method,CGIBody,Modules,Mod,Func,{Type,Input}) ->
+ ?vtrace("exec ~s request with:"
+ "~n Modules: ~p"
+ "~n Mod: ~p"
+ "~n Func: ~p"
+ "~n Type: ~p"
+ "~n Input: ~p",
+ [Method,Modules,Mod,Func,Type,Input]),
+ case lists:member(Mod,Modules) of
+ true ->
+ {_,RemoteAddr}=(Info#mod.init_data)#init_data.peername,
+ ServerName=(Info#mod.init_data)#init_data.resolve,
+ Env=get_environment(Info,ServerName,Method,RemoteAddr,Type,Input),
+ ?vtrace("and now call the module",[]),
+ case try_new_erl_scheme_method(Info,Env,Input,list_to_atom(Mod),list_to_atom(Func)) of
+ {error,not_new_method}->
+ case catch apply(list_to_atom(Mod),list_to_atom(Func),[Env,Input]) of
+ {'EXIT',Reason} ->
+ ?vlog("exit with Reason: ~p",[Reason]),
+ {proceed,[{status,{500,none,Reason}}|Info#mod.data]};
+ Response ->
+ control_response_header(Info,Mod,Func,Response)
+ end;
+ ResponseResult->
+ ResponseResult
+ end;
+ false ->
+ ?vlog("unknown module",[]),
+ {proceed,[{status,{403,Info#mod.request_uri,
+ ?NICE("Client not authorized to evaluate: "++CGIBody)}}|Info#mod.data]}
+ end.
+
+control_response_header(Info,Mod,Func,Response)->
+ case control_response(Response,Info,Mod,Func) of
+ {proceed,[{response,{StatusCode,Response}}|Rest]} ->
+ case httpd_util:lookup(Info#mod.config_db,erl_script_nocache,false) of
+ true ->
+ case httpd_util:split(Response,"\r\n\r\n|\n\n",2) of
+ {ok,[Head,Body]}->
+ Date=httpd_util:rfc1123_date(),
+ Cache="Cache-Control:no-cache\r\nPragma:no-cache\r\nExpires:"++ Date ++ "\r\n",
+ {proceed,[{response,{StatusCode,[Head,"\r\n",Cache,"\r\n",Body]}}|Rest]};
+ _->
+ {proceed,[{response,{StatusCode,Response}}|Rest]}
+ end;
+ WhatEver->
+ {proceed,[{response,{StatusCode,Response}}|Rest]}
+ end;
+ WhatEver->
+ WhatEver
+ end.
+
+control_response(Response,Info,Mod,Func)->
+ ?vdebug("Response: ~n~p",[Response]),
+ case mod_cgi:status_code(lists:flatten(Response)) of
+ {ok,StatusCode} ->
+ {proceed,[{response,{StatusCode,Response}}|Info#mod.data]};
+ {error,Reason} ->
+ {proceed,
+ [{status,{400,none,
+ ?NICE("Error in "++Mod++":"++Func++"/2: "++
+ lists:flatten(io_lib:format("~p",[Reason])))}}|
+ Info#mod.data]}
+ end.
+
+parsed_header([]) ->
+ [];
+parsed_header([{Name,[Value|R1]}|R2]) when list(Value) ->
+ NewName=lists:map(fun(X) -> if X == $- -> $_; true -> X end end,Name),
+ [{list_to_atom("http_"++httpd_util:to_lower(NewName)),
+ multi_value([Value|R1])}|parsed_header(R2)];
+parsed_header([{Name,Value}|Rest]) when list(Value)->
+ {ok,NewName,_}=regexp:gsub(Name,"-","_"),
+ [{list_to_atom("http_"++httpd_util:to_lower(NewName)),Value}|
+ parsed_header(Rest)].
+
+multi_value([]) ->
+ [];
+multi_value([Value]) ->
+ Value;
+multi_value([Value|Rest]) ->
+ Value++", "++multi_value(Rest).
+
+%%
+%% Eval mechanism
+%%
+
+
+eval(Info,"POST",CGIBody,Modules) ->
+ ?vtrace("eval(POST) -> method not supported",[]),
+ {proceed,[{status,{501,{"POST",Info#mod.request_uri,Info#mod.http_version},
+ ?NICE("Eval mechanism doesn't support method POST")}}|
+ Info#mod.data]};
+
+eval(Info,"HEAD",CGIBody,Modules) ->
+ %%The function that sends the data in httpd_response handles HEAD reqest by not
+ %% Sending the body
+ eval(Info,"GET",CGIBody,Modules);
+
+
+eval(Info,"GET",CGIBody,Modules) ->
+ ?vtrace("eval(GET) -> entry when"
+ "~n Modules: ~p",[Modules]),
+ case auth(CGIBody,Modules) of
+ true ->
+ case lib:eval_str(string:concat(CGIBody,". ")) of
+ {error,Reason} ->
+ ?vlog("eval -> error:"
+ "~n Reason: ~p",[Reason]),
+ {proceed,[{status,{500,none,Reason}}|Info#mod.data]};
+ {ok,Response} ->
+ ?vtrace("eval -> ok:"
+ "~n Response: ~p",[Response]),
+ case mod_cgi:status_code(lists:flatten(Response)) of
+ {ok,StatusCode} ->
+ {proceed,[{response,{StatusCode,Response}}|Info#mod.data]};
+ {error,Reason} ->
+ {proceed,[{status,{400,none,Reason}}|Info#mod.data]}
+ end
+ end;
+ false ->
+ ?vlog("eval -> auth failed",[]),
+ {proceed,[{status,
+ {403,Info#mod.request_uri,
+ ?NICE("Client not authorized to evaluate: "++CGIBody)}}|
+ Info#mod.data]}
+ end.
+
+auth(CGIBody,["all"]) ->
+ true;
+auth(CGIBody,Modules) ->
+ case regexp:match(CGIBody,"^[^\:(%3A)]*") of
+ {match,Start,Length} ->
+ lists:member(string:substr(CGIBody,Start,Length),Modules);
+ nomatch ->
+ false
+ end.
+
+%%----------------------------------------------------------------------
+%%Creates the environment list that will be the first arg to the
+%%Functions that is called through the ErlScript Schema
+%%----------------------------------------------------------------------
+
+get_environment(Info,ServerName,Method,RemoteAddr,Type,Input)->
+ Env=[{server_software,?SERVER_SOFTWARE},
+ {server_name,ServerName},
+ {gateway_interface,?GATEWAY_INTERFACE},
+ {server_protocol,?SERVER_PROTOCOL},
+ {server_port,httpd_util:lookup(Info#mod.config_db,port,80)},
+ {request_method,Method},
+ {remote_addr,RemoteAddr},
+ {script_name,Info#mod.request_uri}|
+ parsed_header(Info#mod.parsed_header)],
+ get_environment(Type,Input,Env,Info).
+
+
+get_environment(Type,Input,Env,Info)->
+ Env1=case Type of
+ query_string ->
+ [{query_string,Input}|Env];
+ path_info ->
+ Aliases=httpd_util:multi_lookup(Info#mod.config_db,alias),
+ {_,PathTranslated,_}=mod_alias:real_name(Info#mod.config_db,[$/|Input],Aliases),
+ [{path_info,"/"++httpd_util:decode_hex(Input)},
+ {path_translated,PathTranslated}|Env];
+ entity_body ->
+ [{content_length,httpd_util:flatlength(Input)}|Env];
+ no_input ->
+ Env
+ end,
+ get_environment(Info,Env1).
+
+get_environment(Info,Env)->
+ case httpd_util:key1search(Info#mod.data,remote_user) of
+ undefined ->
+ Env;
+ RemoteUser ->
+ [{remote_user,RemoteUser}|Env]
+ end.
+%%
+%% Configuration
+%%
+
+%% load
+
+load([$E,$r,$l,$S,$c,$r,$i,$p,$t,$A,$l,$i,$a,$s,$ |ErlScriptAlias],[]) ->
+ case regexp:split(ErlScriptAlias," ") of
+ {ok, [ErlName|Modules]} ->
+ {ok, [], {erl_script_alias, {ErlName,Modules}}};
+ {ok, _} ->
+ {error,?NICE(httpd_conf:clean(ErlScriptAlias)++
+ " is an invalid ErlScriptAlias")}
+ end;
+load([$E,$v,$a,$l,$S,$c,$r,$i,$p,$t,$A,$l,$i,$a,$s,$ |EvalScriptAlias],[]) ->
+ case regexp:split(EvalScriptAlias, " ") of
+ {ok, [EvalName|Modules]} ->
+ {ok, [], {eval_script_alias, {EvalName,Modules}}};
+ {ok, _} ->
+ {error, ?NICE(httpd_conf:clean(EvalScriptAlias)++
+ " is an invalid EvalScriptAlias")}
+ end;
+load([$E,$r,$l,$S,$c,$r,$i,$p,$t,$T,$i,$m,$e,$o,$u,$t,$ |Timeout],[])->
+ case catch list_to_integer(httpd_conf:clean(Timeout)) of
+ TimeoutSec when integer(TimeoutSec) ->
+ {ok, [], {erl_script_timeout,TimeoutSec*1000}};
+ _ ->
+ {error, ?NICE(httpd_conf:clean(Timeout)++
+ " is an invalid ErlScriptTimeout")}
+ end;
+load([$E,$r,$l,$S,$c,$r,$i,$p,$t,$N,$o,$C,$a,$c,$h,$e |CacheArg],[])->
+ case catch list_to_atom(httpd_conf:clean(CacheArg)) of
+ true ->
+ {ok, [], {erl_script_nocache,true}};
+ false ->
+ {ok, [], {erl_script_nocache,false}};
+ _ ->
+ {error, ?NICE(httpd_conf:clean(CacheArg)++
+ " is an invalid ErlScriptNoCache directive")}
+ end.
+
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% %%
+%% Functions below handles the data from the dynamic webpages %%
+%% That sends data back to the user part by part %%
+%% %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%----------------------------------------------------------------------
+%%Deliver is the callback function users can call to deliver back data to the
+%%client
+%%----------------------------------------------------------------------
+
+deliver(SessionID,Data)when pid(SessionID) ->
+ SessionID ! {ok,Data},
+ ok;
+deliver(SessionID,Data) ->
+ {error,bad_sessionID}.
+
+
+%%----------------------------------------------------------------------
+%% The method that tries to execute the new format
+%%----------------------------------------------------------------------
+
+%%It would be nicer to use erlang:function_exported/3 but if the
+%%Module isn't loaded the function says that it is not loaded
+
+
+try_new_erl_scheme_method(Info,Env,Input,Mod,Func)->
+ process_flag(trap_exit,true),
+ Pid=spawn_link(Mod,Func,[self(),Env,Input]),
+ Timeout=httpd_util:lookup(Info#mod.config_db,erl_script_timeout,?DEFAULT_ERL_TIMEOUT),
+ RetVal=receive_response_data(Info,Pid,0,undefined,[],Timeout),
+ process_flag(trap_exit,false),
+ RetVal.
+
+
+%%----------------------------------------------------------------------
+%%The function recieves the data from the process that generates the page
+%%and send the data to the client through the mod_cgi:send function
+%%----------------------------------------------------------------------
+
+receive_response_data(Info,Pid,Size,StatusCode,AccResponse,Timeout) ->
+ ?DEBUG("receive_response_data()-> Script Size: ~p,StatusCode ~p ,Timeout: ~p ~n",[Size,StatusCode,Timeout]),
+ receive
+ {ok, Response} ->
+ NewStatusCode=mod_cgi:update_status_code(StatusCode,Response),
+
+ ?DEBUG("receive_response_data/2 NewStatusCode: ~p~n",[NewStatusCode]),
+ case mod_cgi:send(Info, NewStatusCode,Response, Size,AccResponse) of
+ socket_closed ->
+ (catch exit(Pid,final)),
+ {proceed,[{response,{already_sent,200,Size}}|Info#mod.data]};
+ head_sent->
+ (catch exit(Pid,final)),
+ {proceed,[{response,{already_sent,200,Size}}|Info#mod.data]};
+ _ ->
+ %%The data is sent and the socket is not closed contine
+ NewSize = mod_cgi:get_new_size(Size,Response),
+ receive_response_data(Info,Pid,NewSize,NewStatusCode,"notempty",Timeout)
+ end;
+ {'EXIT', Pid, Reason} when AccResponse==[] ->
+ {error,not_new_method};
+ {'EXIT', Pid, Reason} when pid(Pid) ->
+ NewStatusCode=mod_cgi:update_status_code(StatusCode,AccResponse),
+ mod_cgi:final_send(Info,NewStatusCode,Size,AccResponse),
+ {proceed, [{response,{already_sent,200,Size}}|Info#mod.data]};
+ %% This should not happen!
+ WhatEver ->
+ NewStatusCode=mod_cgi:update_status_code(StatusCode,AccResponse),
+ mod_cgi:final_send(Info,StatusCode,Size,AccResponse),
+ {proceed, [{response,{already_sent,200,Size}}|Info#mod.data]}
+ after
+ Timeout ->
+ (catch exit(Pid,timeout)), % KILL the port !!!!
+ httpd_socket:close(Info#mod.socket_type,Info#mod.socket),
+ {proceed,[{response,{already_sent,200,Size}}|Info#mod.data]}
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_get.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_get.erl
new file mode 100644
index 0000000000..4136d31669
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_get.erl
@@ -0,0 +1,151 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mod_get.erl,v 1.1 2008/12/17 09:53:35 mikpe Exp $
+%%
+-module(mod_get).
+-export([do/1]).
+-include("httpd.hrl").
+
+%% do
+
+do(Info) ->
+ ?DEBUG("do -> entry",[]),
+ case Info#mod.method of
+ "GET" ->
+ case httpd_util:key1search(Info#mod.data,status) of
+ %% A status code has been generated!
+ {StatusCode,PhraseArgs,Reason} ->
+ {proceed,Info#mod.data};
+ %% No status code has been generated!
+ undefined ->
+ case httpd_util:key1search(Info#mod.data,response) of
+ %% No response has been generated!
+ undefined ->
+ do_get(Info);
+ %% A response has been generated or sent!
+ Response ->
+ {proceed,Info#mod.data}
+ end
+ end;
+ %% Not a GET method!
+ _ ->
+ {proceed,Info#mod.data}
+ end.
+
+
+do_get(Info) ->
+ ?DEBUG("do_get -> Request URI: ~p",[Info#mod.request_uri]),
+ Path = mod_alias:path(Info#mod.data, Info#mod.config_db,
+ Info#mod.request_uri),
+ {FileInfo, LastModified} =get_modification_date(Path),
+
+ send_response(Info#mod.socket,Info#mod.socket_type,Path,Info,FileInfo,LastModified).
+
+
+%%The common case when no range is specified
+send_response(Socket,SocketType,Path,Info,FileInfo,LastModified)->
+ %% Send the file!
+ %% Find the modification date of the file
+ case file:open(Path,[raw,binary]) of
+ {ok, FileDescriptor} ->
+ ?DEBUG("do_get -> FileDescriptor: ~p",[FileDescriptor]),
+ Suffix = httpd_util:suffix(Path),
+ MimeType = httpd_util:lookup_mime_default(Info#mod.config_db,
+ Suffix,"text/plain"),
+ %FileInfo=file:read_file_info(Path),
+ Date = httpd_util:rfc1123_date(),
+ Size = integer_to_list(FileInfo#file_info.size),
+ Header=case Info#mod.http_version of
+ "HTTP/1.1" ->
+ [httpd_util:header(200, MimeType, Info#mod.connection),
+ "Last-Modified: ", LastModified, "\r\n",
+ "Etag: ",httpd_util:create_etag(FileInfo),"\r\n",
+ "Content-Length: ",Size,"\r\n\r\n"];
+ "HTTP/1.0" ->
+ [httpd_util:header(200, MimeType, Info#mod.connection),
+ "Last-Modified: ", LastModified, "\r\n",
+ "Content-Length: ",Size,"\r\n\r\n"]
+ end,
+
+ send(Info#mod.socket_type, Info#mod.socket,
+ Header, FileDescriptor),
+ file:close(FileDescriptor),
+ {proceed,[{response,{already_sent,200,
+ FileInfo#file_info.size}},
+ {mime_type,MimeType}|Info#mod.data]};
+ {error, Reason} ->
+
+ {proceed,
+ [{status,open_error(Reason,Info,Path)}|Info#mod.data]}
+ end.
+
+%% send
+
+send(SocketType,Socket,Header,FileDescriptor) ->
+ ?DEBUG("send -> send header",[]),
+ case httpd_socket:deliver(SocketType,Socket,Header) of
+ socket_closed ->
+ ?LOG("send -> socket closed while sending header",[]),
+ socket_close;
+ _ ->
+ send_body(SocketType,Socket,FileDescriptor)
+ end.
+
+send_body(SocketType,Socket,FileDescriptor) ->
+ case file:read(FileDescriptor,?FILE_CHUNK_SIZE) of
+ {ok,Binary} ->
+ ?DEBUG("send_body -> send another chunk: ~p",[size(Binary)]),
+ case httpd_socket:deliver(SocketType,Socket,Binary) of
+ socket_closed ->
+ ?LOG("send_body -> socket closed while sending",[]),
+ socket_close;
+ _ ->
+ send_body(SocketType,Socket,FileDescriptor)
+ end;
+ eof ->
+ ?DEBUG("send_body -> done with this file",[]),
+ eof
+ end.
+
+
+%% open_error - Handle file open failure
+%%
+open_error(eacces,Info,Path) ->
+ open_error(403,Info,Path,"");
+open_error(enoent,Info,Path) ->
+ open_error(404,Info,Path,"");
+open_error(enotdir,Info,Path) ->
+ open_error(404,Info,Path,
+ ": A component of the file name is not a directory");
+open_error(emfile,_Info,Path) ->
+ open_error(500,none,Path,": To many open files");
+open_error({enfile,_},_Info,Path) ->
+ open_error(500,none,Path,": File table overflow");
+open_error(_Reason,_Info,Path) ->
+ open_error(500,none,Path,"").
+
+open_error(StatusCode,none,Path,Reason) ->
+ {StatusCode,none,?NICE("Can't open "++Path++Reason)};
+open_error(StatusCode,Info,Path,Reason) ->
+ {StatusCode,Info#mod.request_uri,?NICE("Can't open "++Path++Reason)}.
+
+get_modification_date(Path)->
+ case file:read_file_info(Path) of
+ {ok, FileInfo0} ->
+ {FileInfo0, httpd_util:rfc1123_date(FileInfo0#file_info.mtime)};
+ _ ->
+ {#file_info{},""}
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_head.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_head.erl
new file mode 100644
index 0000000000..ce71e6532e
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_head.erl
@@ -0,0 +1,89 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mod_head.erl,v 1.1 2008/12/17 09:53:35 mikpe Exp $
+%%
+-module(mod_head).
+-export([do/1]).
+
+-include("httpd.hrl").
+
+%% do
+
+do(Info) ->
+ ?DEBUG("do -> entry",[]),
+ case Info#mod.method of
+ "HEAD" ->
+ case httpd_util:key1search(Info#mod.data,status) of
+ %% A status code has been generated!
+ {StatusCode,PhraseArgs,Reason} ->
+ {proceed,Info#mod.data};
+ %% No status code has been generated!
+ _undefined ->
+ case httpd_util:key1search(Info#mod.data,response) of
+ %% No response has been generated!
+ undefined ->
+ do_head(Info);
+ %% A response has been sent! Nothing to do about it!
+ {already_sent,StatusCode,Size} ->
+ {proceed,Info#mod.data};
+ %% A response has been generated!
+ {StatusCode,Response} ->
+ {proceed,Info#mod.data}
+ end
+ end;
+ %% Not a HEAD method!
+ _ ->
+ {proceed,Info#mod.data}
+ end.
+
+do_head(Info) ->
+ ?DEBUG("do_head -> Request URI: ~p",[Info#mod.request_uri]),
+ Path = mod_alias:path(Info#mod.data,Info#mod.config_db,
+ Info#mod.request_uri),
+ Suffix = httpd_util:suffix(Path),
+ %% Does the file exists?
+ case file:read_file_info(Path) of
+ {ok,FileInfo} ->
+ MimeType=httpd_util:lookup_mime_default(Info#mod.config_db,Suffix,"text/plain"),
+ Length=io_lib:write(FileInfo#file_info.size),
+ Head=[{content_type,MimeType},{content_length,Length},{code,200}],
+ {proceed,[{response,{response,Head,nobody}}|Info#mod.data]};
+ {error,Reason} ->
+ {proceed,
+ [{status,read_file_info_error(Reason,Info,Path)}|Info#mod.data]}
+ end.
+
+%% read_file_info_error - Handle file info read failure
+%%
+read_file_info_error(eacces,Info,Path) ->
+ read_file_info_error(403,Info,Path,"");
+read_file_info_error(enoent,Info,Path) ->
+ read_file_info_error(404,Info,Path,"");
+read_file_info_error(enotdir,Info,Path) ->
+ read_file_info_error(404,Info,Path,
+ ": A component of the file name is not a directory");
+read_file_info_error(emfile,_Info,Path) ->
+ read_file_info_error(500,none,Path,": To many open files");
+read_file_info_error({enfile,_},_Info,Path) ->
+ read_file_info_error(500,none,Path,": File table overflow");
+read_file_info_error(_Reason,_Info,Path) ->
+ read_file_info_error(500,none,Path,"").
+
+read_file_info_error(StatusCode,none,Path,Reason) ->
+ {StatusCode,none,?NICE("Can't access "++Path++Reason)};
+read_file_info_error(StatusCode,Info,Path,Reason) ->
+ {StatusCode,Info#mod.request_uri,
+ ?NICE("Can't access "++Path++Reason)}.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_htaccess.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_htaccess.erl
new file mode 100644
index 0000000000..3806ce2e06
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_htaccess.erl
@@ -0,0 +1,1136 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mod_htaccess.erl,v 1.1 2008/12/17 09:53:35 mikpe Exp $
+%%
+
+-module(mod_htaccess).
+
+-export([do/1, load/2]).
+-export([debug/0]).
+
+-include("httpd.hrl").
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Public methods that interface the eswapi %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%----------------------------------------------------------------------
+% Public method called by the webbserver to insert the data about
+% Names on accessfiles
+%----------------------------------------------------------------------
+load([$A,$c,$c,$e,$s,$s,$F,$i,$l,$e,$N,$a,$m,$e|FileNames],Context)->
+ CleanFileNames=httpd_conf:clean(FileNames),
+ %%io:format("\n The filenames is:" ++ FileNames ++ "\n"),
+ {ok,[],{access_files,string:tokens(CleanFileNames," ")}}.
+
+
+%----------------------------------------------------------------------
+% Public method that the webbserver calls to control the page
+%----------------------------------------------------------------------
+do(Info)->
+ case httpd_util:key1search(Info#mod.data,status) of
+ {Status_code,PhraseArgs,Reason}->
+ {proceed,Info#mod.data};
+ undefined ->
+ control_path(Info)
+ end.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% %%
+%% The functions that start the control if there is a accessfile %%
+%% and if so controls if the dir is allowed or not %%
+%% %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%----------------------------------------------------------------------
+%Info = record mod as specified in httpd.hrl
+%returns either {proceed,Info#mod.data}
+%{proceed,[{status,403....}|Info#mod.data]}
+%{proceed,[{status,401....}|Info#mod.data]}
+%{proceed,[{status,500....}|Info#mod.data]}
+%----------------------------------------------------------------------
+control_path(Info) ->
+ Path = mod_alias:path(Info#mod.data,
+ Info#mod.config_db,
+ Info#mod.request_uri),
+ case isErlScriptOrNotAccessibleFile(Path,Info) of
+ true->
+ {proceed,Info#mod.data};
+ false->
+ case getHtAccessData(Path,Info)of
+ {ok,public}->
+ %%There was no restrictions on the page continue
+ {proceed,Info#mod.data};
+ {error,Reason} ->
+ %Something got wrong continue or quit??????????????????/
+ {proceed,Info#mod.data};
+ {accessData,AccessData}->
+ controlAllowedMethod(Info,AccessData)
+ end
+ end.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% %%
+%% These methods controls that the method the client used in the %%
+%% request is one of the limited %%
+%% %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%----------------------------------------------------------------------
+%Control that if the accessmethod used is in the list of modes to challenge
+%
+%Info is the mod record as specified in httpd.hrl
+%AccessData is an ets table whit the data in the .htaccessfiles
+%----------------------------------------------------------------------
+controlAllowedMethod(Info,AccessData)->
+ case allowedRequestMethod(Info,AccessData) of
+ allow->
+ %%The request didnt use one of the limited methods
+ ets:delete(AccessData),
+ {proceed,Info#mod.data};
+ challenge->
+ authenticateUser(Info,AccessData)
+ end.
+
+%----------------------------------------------------------------------
+%Check the specified access method in the .htaccessfile
+%----------------------------------------------------------------------
+allowedRequestMethod(Info,AccessData)->
+ case ets:lookup(AccessData,limit) of
+ [{limit,all}]->
+ challenge;
+ [{limit,Methods}]->
+ isLimitedRequestMethod(Info,Methods)
+ end.
+
+
+%----------------------------------------------------------------------
+%Check the specified accessmethods in the .htaccesfile against the users
+%accessmethod
+%
+%Info is the record from the do call
+%Methods is a list of the methods specified in the .htaccessfile
+%----------------------------------------------------------------------
+isLimitedRequestMethod(Info,Methods)->
+ case lists:member(Info#mod.method,Methods) of
+ true->
+ challenge;
+ false ->
+ allow
+ end.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% %%
+%% These methods controls that the user comes from an allowwed net %%
+%% and if so wheather its a valid user or a challenge shall be %%
+%% generated %%
+%% %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%----------------------------------------------------------------------
+%The first thing to control is that the user is from a network
+%that has access to the page
+%----------------------------------------------------------------------
+authenticateUser(Info,AccessData)->
+ case controlNet(Info,AccessData) of
+ allow->
+ %the network is ok control that it is an allowed user
+ authenticateUser2(Info,AccessData);
+ deny->
+ %The user isnt allowed to access the pages from that network
+ ets:delete(AccessData),
+ {proceed,[{status,{403,Info#mod.request_uri,
+ "Restricted area not allowed from your network"}}|Info#mod.data]}
+ end.
+
+
+%----------------------------------------------------------------------
+%The network the user comes from is allowed to view the resources
+%control whether the user needsto supply a password or not
+%----------------------------------------------------------------------
+authenticateUser2(Info,AccessData)->
+ case ets:lookup(AccessData,require) of
+ [{require,AllowedUsers}]->
+ case ets:lookup(AccessData,auth_name) of
+ [{auth_name,Realm}]->
+ authenticateUser2(Info,AccessData,Realm,AllowedUsers);
+ _NoAuthName->
+ ets:delete(AccessData),
+ {break,[{status,{500,none,
+ ?NICE("mod_htaccess:AuthName directive not specified")}}]}
+ end;
+ [] ->
+ %%No special user is required the network is ok so let
+ %%the user in
+ ets:delete(AccessData),
+ {proceed,Info#mod.data}
+ end.
+
+
+%----------------------------------------------------------------------
+%The user must send a userId and a password to get the resource
+%Control if its already in the http-request
+%if the file with users is bad send an 500 response
+%----------------------------------------------------------------------
+authenticateUser2(Info,AccessData,Realm,AllowedUsers)->
+ case authenticateUser(Info,AccessData,AllowedUsers) of
+ allow ->
+ ets:delete(AccessData),
+ {user,Name,Pwd}=getAuthenticatingDataFromHeader(Info),
+ {proceed, [{remote_user_name,Name}|Info#mod.data]};
+ challenge->
+ ets:delete(AccessData),
+ ReasonPhrase = httpd_util:reason_phrase(401),
+ Message = httpd_util:message(401,none,Info#mod.config_db),
+ {proceed,
+ [{response,
+ {401,
+ ["WWW-Authenticate: Basic realm=\"",Realm,
+ "\"\r\n\r\n","<HTML>\n<HEAD>\n<TITLE>",
+ ReasonPhrase,"</TITLE>\n",
+ "</HEAD>\n<BODY>\n<H1>",ReasonPhrase,
+ "</H1>\n",Message,"\n</BODY>\n</HTML>\n"]}}|
+ Info#mod.data]};
+ deny->
+ ets:delete(AccessData),
+ {break,[{status,{500,none,
+ ?NICE("mod_htaccess:Bad path to user or group file")}}]}
+ end.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% %%
+%% Methods that validate the netwqork the user comes from %%
+%% according to the allowed networks %%
+%% %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%---------------------------------------------------------------------
+%Controls the users networkaddress agains the specifed networks to
+%allow or deny
+%
+%returns either allow or deny
+%----------------------------------------------------------------------
+controlNet(Info,AccessData)->
+ UserNetwork=getUserNetworkAddress(Info),
+ case getAllowDenyOrder(AccessData) of
+ {_deny,[],_allow,[]}->
+ allow;
+ {deny,[],allow,AllowedNetworks}->
+ controlIfAllowed(AllowedNetworks,UserNetwork,allow,deny);
+ {allow,AllowedNetworks,deny,[]}->
+ controlIfAllowed(AllowedNetworks,UserNetwork,allow,deny);
+
+ {deny,DeniedNetworks,allow,[]}->
+ controlIfAllowed(DeniedNetworks,UserNetwork,allow,deny);
+ {allow,[],deny,DeniedNetworks}->
+ controlIfAllowed(DeniedNetworks,UserNetwork,allow,deny);
+
+ {deny,DeniedNetworks,allow,AllowedNetworks}->
+ controlDenyAllow(DeniedNetworks,AllowedNetworks,UserNetwork);
+ {allow,AllowedNetworks,deny,DeniedNetworks}->
+ controlAllowDeny(AllowedNetworks,DeniedNetworks,UserNetwork)
+ end.
+
+
+%----------------------------------------------------------------------
+%Returns the users IP-Number
+%----------------------------------------------------------------------
+getUserNetworkAddress(Info)->
+ {_Socket,Address}=(Info#mod.init_data)#init_data.peername,
+ Address.
+
+
+%----------------------------------------------------------------------
+%Control the users Ip-number against the ip-numbers in the .htaccessfile
+%----------------------------------------------------------------------
+controlIfAllowed(AllowedNetworks,UserNetwork,IfAllowed,IfDenied)->
+ case AllowedNetworks of
+ [{allow,all}]->
+ IfAllowed;
+ [{deny,all}]->
+ IfDenied;
+ [{deny,Networks}]->
+ memberNetwork(Networks,UserNetwork,IfDenied,IfAllowed);
+ [{allow,Networks}]->
+ memberNetwork(Networks,UserNetwork,IfAllowed,IfDenied);
+ _Error->
+ IfDenied
+ end.
+
+
+%---------------------------------------------------------------------%
+%The Denycontrol isn't neccessary to preform since the allow control %
+%override the deny control %
+%---------------------------------------------------------------------%
+controlDenyAllow(DeniedNetworks,AllowedNetworks,UserNetwork)->
+ case AllowedNetworks of
+ [{allow,all}]->
+ allow;
+ [{allow,Networks}]->
+ case memberNetwork(Networks,UserNetwork) of
+ true->
+ allow;
+ false->
+ deny
+ end
+ end.
+
+
+%----------------------------------------------------------------------%
+%Control that the user is in the allowed list if so control that the %
+%network is in the denied list
+%----------------------------------------------------------------------%
+controlAllowDeny(AllowedNetworks,DeniedNetworks,UserNetwork)->
+ case controlIfAllowed(AllowedNetworks,UserNetwork,allow,deny) of
+ allow->
+ controlIfAllowed(DeniedNetworks,UserNetwork,deny,allow);
+ deny ->
+ deny
+ end.
+
+%----------------------------------------------------------------------
+%Controls if the users Ipnumber is in the list of either denied or
+%allowed networks
+%----------------------------------------------------------------------
+memberNetwork(Networks,UserNetwork,IfTrue,IfFalse)->
+ case memberNetwork(Networks,UserNetwork) of
+ true->
+ IfTrue;
+ false->
+ IfFalse
+ end.
+
+
+%----------------------------------------------------------------------
+%regexp match the users ip-address against the networks in the list of
+%ipadresses or subnet addresses.
+memberNetwork(Networks,UserNetwork)->
+ case lists:filter(fun(Net)->
+ case regexp:match(UserNetwork,
+ formatRegexp(Net)) of
+ {match,1,_}->
+ true;
+ _NotSubNet ->
+ false
+ end
+ end,Networks) of
+ []->
+ false;
+ MemberNetWork ->
+ true
+ end.
+
+
+%----------------------------------------------------------------------
+%Creates a regexp from an ip-number i.e "127.0.0-> "^127[.]0[.]0.*"
+%"127.0.0.-> "^127[.]0[.]0[.].*"
+%----------------------------------------------------------------------
+formatRegexp(Net)->
+ [SubNet1|SubNets]=string:tokens(Net,"."),
+ NetRegexp=lists:foldl(fun(SubNet,Newnet)->
+ Newnet ++ "[.]" ++SubNet
+ end,"^"++SubNet1,SubNets),
+ case string:len(Net)-string:rchr(Net,$.) of
+ 0->
+ NetRegexp++"[.].*";
+ _->
+ NetRegexp++".*"
+ end.
+
+
+%----------------------------------------------------------------------
+%If the user has specified if the allow or deny check shall be preformed
+%first get that order if no order is specified take
+%allow - deny since its harder that deny - allow
+%----------------------------------------------------------------------
+getAllowDenyOrder(AccessData)->
+ case ets:lookup(AccessData,order) of
+ [{order,{deny,allow}}]->
+ {deny,ets:lookup(AccessData,deny),
+ allow,ets:lookup(AccessData,allow)};
+ _DefaultOrder->
+ {allow,ets:lookup(AccessData,allow),
+ deny,ets:lookup(AccessData,deny)}
+ end.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% %%
+%% The methods that validates the user %%
+%% %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%----------------------------------------------------------------------
+%Control if there is anyu autheticating data in threquest header
+%if so it controls it against the users in the list Allowed Users
+%----------------------------------------------------------------------
+authenticateUser(Info,AccessData,AllowedUsers)->
+ case getAuthenticatingDataFromHeader(Info) of
+ {user,User,PassWord}->
+ authenticateUser(Info,AccessData,AllowedUsers,
+ {user,User,PassWord});
+ {error,nouser}->
+ challenge;
+ {error,BadData}->
+ challenge
+ end.
+
+
+%----------------------------------------------------------------------
+%Returns the Autheticating data in the http-request
+%----------------------------------------------------------------------
+getAuthenticatingDataFromHeader(Info)->
+ PrsedHeader=Info#mod.parsed_header,
+ case httpd_util:key1search(PrsedHeader,"authorization" ) of
+ undefined->
+ {error,nouser};
+ [$B,$a,$s,$i,$c,$\ |EncodedString]->
+ UnCodedString=httpd_util:decode_base64(EncodedString),
+ case httpd_util:split(UnCodedString,":",2) of
+ {ok,[User,PassWord]}->
+ {user,User,PassWord};
+ {error,Error}->
+ {error,Error}
+ end;
+ BadCredentials ->
+ {error,BadCredentials}
+ end.
+
+
+%----------------------------------------------------------------------
+%Returns a list of all members of the allowed groups
+%----------------------------------------------------------------------
+getGroupMembers(Groups,AllowedGroups)->
+ Allowed=lists:foldl(fun({group,Name,Members},AllowedMembers)->
+ case lists:member(Name,AllowedGroups) of
+ true->
+ AllowedMembers++Members;
+ false ->
+ AllowedMembers
+ end
+ end,[],Groups),
+ {ok,Allowed}.
+
+authenticateUser(Info,AccessData,{{users,[]},{groups,Groups}},User)->
+ authenticateUser(Info,AccessData,{groups,Groups},User);
+authenticateUser(Info,AccessData,{{users,Users},{groups,[]}},User)->
+ authenticateUser(Info,AccessData,{users,Users},User);
+
+authenticateUser(Info,AccessData,{{users,Users},{groups,Groups}},User)->
+ AllowUser=authenticateUser(Info,AccessData,{users,Users},User),
+ AllowGroup=authenticateUser(Info,AccessData,{groups,Groups},User),
+ case {AllowGroup,AllowUser} of
+ {_,allow}->
+ allow;
+ {allow,_}->
+ allow;
+ {challenge,_}->
+ challenge;
+ {_,challenge}->
+ challenge;
+ {_deny,_deny}->
+ deny
+ end;
+
+
+%----------------------------------------------------------------------
+%Controls that the user is a member in one of the allowed group
+%----------------------------------------------------------------------
+authenticateUser(Info,AccessData,{groups,AllowedGroups},{user,User,PassWord})->
+ case getUsers(AccessData,group_file) of
+ {group_data,Groups}->
+ case getGroupMembers(Groups,AllowedGroups) of
+ {ok,Members}->
+ authenticateUser(Info,AccessData,{users,Members},
+ {user,User,PassWord});
+ {error,BadData}->
+ deny
+ end;
+ {error,BadData}->
+ deny
+ end;
+
+
+%----------------------------------------------------------------------
+%Control that the user is one of the allowed users and that the passwd is ok
+%----------------------------------------------------------------------
+authenticateUser(Info,AccessData,{users,AllowedUsers},{user,User,PassWord})->
+ case lists:member(User,AllowedUsers) of
+ true->
+ %Get the usernames and passwords from the file
+ case getUsers(AccessData,user_file) of
+ {error,BadData}->
+ deny;
+ {user_data,Users}->
+ %Users is a list of the users in
+ %the userfile [{user,User,Passwd}]
+ checkPassWord(Users,{user,User,PassWord})
+ end;
+ false ->
+ challenge
+ end.
+
+
+%----------------------------------------------------------------------
+%Control that the user User={user,"UserName","PassWd"} is
+%member of the list of Users
+%----------------------------------------------------------------------
+checkPassWord(Users,User)->
+ case lists:member(User,Users) of
+ true->
+ allow;
+ false->
+ challenge
+ end.
+
+
+%----------------------------------------------------------------------
+%Get the users in the specified file
+%UserOrGroup is an atom that specify if its a group file or a user file
+%i.e. group_file or user_file
+%----------------------------------------------------------------------
+getUsers({file,FileName},UserOrGroup)->
+ case file:open(FileName,[read]) of
+ {ok,AccessFileHandle} ->
+ getUsers({stream,AccessFileHandle},[],UserOrGroup);
+ {error,Reason} ->
+ {error,{Reason,FileName}}
+ end;
+
+
+%----------------------------------------------------------------------
+%The method that starts the lokkong for user files
+%----------------------------------------------------------------------
+
+getUsers(AccessData,UserOrGroup)->
+ case ets:lookup(AccessData,UserOrGroup) of
+ [{UserOrGroup,File}]->
+ getUsers({file,File},UserOrGroup);
+ _ ->
+ {error,noUsers}
+ end.
+
+
+%----------------------------------------------------------------------
+%Reads data from the filehandle File to the list FileData and when its
+%reach the end it returns the list in a tuple {user_file|group_file,FileData}
+%----------------------------------------------------------------------
+getUsers({stream,File},FileData,UserOrGroup)->
+ case io:get_line(File,[]) of
+ eof when UserOrGroup==user_file->
+ {user_data,FileData};
+ eof when UserOrGroup ==group_file->
+ {group_data,FileData};
+ Line ->
+ getUsers({stream,File},
+ formatUser(Line,FileData,UserOrGroup),UserOrGroup)
+ end.
+
+
+%----------------------------------------------------------------------
+%If the line is a comment remove it
+%----------------------------------------------------------------------
+formatUser([$#|UserDataComment],FileData,_UserOrgroup)->
+ FileData;
+
+
+%----------------------------------------------------------------------
+%The user name in the file is Username:Passwd\n
+%Remove the newline sign and split the user name in
+%UserName and Password
+%----------------------------------------------------------------------
+formatUser(UserData,FileData,UserOrGroup)->
+ case string:tokens(UserData," \r\n")of
+ [User|Whitespace] when UserOrGroup==user_file->
+ case string:tokens(User,":") of
+ [Name,PassWord]->
+ [{user,Name,PassWord}|FileData];
+ _Error->
+ FileData
+ end;
+ GroupData when UserOrGroup==group_file ->
+ parseGroupData(GroupData,FileData);
+ _Error ->
+ FileData
+ end.
+
+
+%----------------------------------------------------------------------
+%if everything is right GroupData is on the form
+% ["groupName:", "Member1", "Member2", "Member2"
+%----------------------------------------------------------------------
+parseGroupData([GroupName|GroupData],FileData)->
+ [{group,formatGroupName(GroupName),GroupData}|FileData].
+
+
+%----------------------------------------------------------------------
+%the line in the file is GroupName: Member1 Member2 .....MemberN
+%Remove the : from the group name
+%----------------------------------------------------------------------
+formatGroupName(GroupName)->
+ string:strip(GroupName,right,$:).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% %%
+%% Functions that parses the accessfiles %%
+%% %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%----------------------------------------------------------------------
+%Control that the asset is a real file and not a request for an virtual
+%asset
+%----------------------------------------------------------------------
+isErlScriptOrNotAccessibleFile(Path,Info)->
+ case file:read_file_info(Path) of
+ {ok,_fileInfo}->
+ false;
+ {error,_Reason} ->
+ true
+ end.
+
+
+%----------------------------------------------------------------------
+%Path=PathToTheRequestedFile=String
+%Innfo=record#mod
+%----------------------------------------------------------------------
+getHtAccessData(Path,Info)->
+ HtAccessFileNames=getHtAccessFileNames(Info),
+ case getData(Path,Info,HtAccessFileNames) of
+ {ok,public}->
+ {ok,public};
+ {accessData,AccessData}->
+ {accessData,AccessData};
+ {error,Reason} ->
+ {error,Reason}
+ end.
+
+
+%----------------------------------------------------------------------
+%returns the names of the accessfiles
+%----------------------------------------------------------------------
+getHtAccessFileNames(Info)->
+ case httpd_util:lookup(Info#mod.config_db,access_files) of
+ undefined->
+ [".htaccess"];
+ Files->
+ Files
+ end.
+%----------------------------------------------------------------------
+%HtAccessFileNames=["accessfileName1",..."AccessFileName2"]
+%----------------------------------------------------------------------
+getData(Path,Info,HtAccessFileNames)->
+ case regexp:split(Path,"/") of
+ {error,Error}->
+ {error,Error};
+ {ok,SplittedPath}->
+ getData2(HtAccessFileNames,SplittedPath,Info)
+ end.
+
+
+%----------------------------------------------------------------------
+%Add to together the data in the Splittedpath up to the path
+%that is the alias or the document root
+%Since we do not need to control after any accessfiles before here
+%----------------------------------------------------------------------
+getData2(HtAccessFileNames,SplittedPath,Info)->
+ case getRootPath(SplittedPath,Info) of
+ {error,Path}->
+ {error,Path};
+ {ok,StartPath,RestOfSplittedPath} ->
+ getData2(HtAccessFileNames,StartPath,RestOfSplittedPath,Info)
+ end.
+
+
+%----------------------------------------------------------------------
+%HtAccessFilenames is a list the names the accesssfiles can have
+%Path is the shortest match agains all alias and documentroot
+%rest of splitted path is a list of the parts of the path
+%Info is the mod recod from the server
+%----------------------------------------------------------------------
+getData2(HtAccessFileNames,StartPath,RestOfSplittedPath,Info)->
+ case getHtAccessFiles(HtAccessFileNames,StartPath,RestOfSplittedPath) of
+ []->
+ %No accessfile qiut its a public directory
+ {ok,public};
+ Files ->
+ loadAccessFilesData(Files)
+ end.
+
+
+%----------------------------------------------------------------------
+%Loads the data in the accessFiles specifiied by
+% AccessFiles=["/hoem/public/html/accefile",
+% "/home/public/html/priv/accessfile"]
+%----------------------------------------------------------------------
+loadAccessFilesData(AccessFiles)->
+ loadAccessFilesData(AccessFiles,ets:new(accessData,[])).
+
+
+%----------------------------------------------------------------------
+%Returns the found data
+%----------------------------------------------------------------------
+contextToValues(AccessData)->
+ case ets:lookup(AccessData,context) of
+ [{context,Values}]->
+ ets:delete(AccessData,context),
+ insertContext(AccessData,Values),
+ {accessData,AccessData};
+ _Error->
+ {error,errorInAccessFile}
+ end.
+
+
+insertContext(AccessData,[])->
+ ok;
+
+insertContext(AccessData,[{allow,From}|Values])->
+ insertDenyAllowContext(AccessData,{allow,From}),
+ insertContext(AccessData,Values);
+
+insertContext(AccessData,[{deny,From}|Values])->
+ insertDenyAllowContext(AccessData,{deny,From}),
+ insertContext(AccessData,Values);
+
+insertContext(AccessData,[{require,{GrpOrUsr,Members}}|Values])->
+ case ets:lookup(AccessData,require) of
+ []when GrpOrUsr==users->
+ ets:insert(AccessData,{require,{{users,Members},{groups,[]}}});
+
+ [{require,{{users,Users},{groups,Groups}}}]when GrpOrUsr==users ->
+ ets:insert(AccessData,{require,{{users,Users++Members},
+ {groups,Groups}}});
+ []when GrpOrUsr==groups->
+ ets:insert(AccessData,{require,{{users,[]},{groups,Members}}});
+
+ [{require,{{users,Users},{groups,Groups}}}]when GrpOrUsr==groups ->
+ ets:insert(AccessData,{require,{{users,Users},
+ {groups,Groups++Members}}})
+ end,
+ insertContext(AccessData,Values);
+
+
+
+%%limit and order directive need no transforming they areis just to insert
+insertContext(AccessData,[Elem|Values])->
+ ets:insert(AccessData,Elem),
+ insertContext(AccessData,Values).
+
+
+insertDenyAllowContext(AccessData,{AllowDeny,From})->
+ case From of
+ all->
+ ets:insert(AccessData,{AllowDeny,all});
+ AllowedSubnets->
+ case ets:lookup(AccessData,AllowDeny) of
+ []->
+ ets:insert(AccessData,{AllowDeny,From});
+ [{AllowDeny,all}]->
+ ok;
+ [{AllowDeny,Networks}]->
+ ets:insert(AccessData,{allow,Networks++From})
+ end
+ end.
+
+loadAccessFilesData([],AccessData)->
+ %preform context to limits
+ contextToValues(AccessData),
+ {accessData,AccessData};
+
+%----------------------------------------------------------------------
+%Takes each file in the list and load the data to the ets table
+%AccessData
+%----------------------------------------------------------------------
+loadAccessFilesData([FileName|FileNames],AccessData)->
+ case loadAccessFileData({file,FileName},AccessData) of
+ overRide->
+ loadAccessFilesData(FileNames,AccessData);
+ noOverRide ->
+ {accessData,AccessData};
+ error->
+ ets:delete(AccessData),
+ {error,errorInAccessFile}
+ end.
+
+%----------------------------------------------------------------------
+%opens the filehandle to the specified file
+%----------------------------------------------------------------------
+loadAccessFileData({file,FileName},AccessData)->
+ case file:open(FileName,[read]) of
+ {ok,AccessFileHandle}->
+ loadAccessFileData({stream,AccessFileHandle},AccessData,[]);
+ {error,Reason} ->
+ overRide
+ end.
+
+%----------------------------------------------------------------------
+%%look att each line in the file and add them to the database
+%%When end of file is reached control i overrride is allowed
+%% if so return
+%----------------------------------------------------------------------
+loadAccessFileData({stream,File},AccessData,FileData)->
+ case io:get_line(File,[]) of
+ eof->
+ insertData(AccessData,FileData),
+ case ets:match_object(AccessData,{'_',error}) of
+ []->
+ %Case we got no error control that we can override a
+ %at least some of the values
+ case ets:match_object(AccessData,
+ {allow_over_ride,none}) of
+ []->
+ overRide;
+ _NoOverride->
+ noOverRide
+ end;
+ Errors->
+ error
+ end;
+ Line ->
+ loadAccessFileData({stream,File},AccessData,
+ insertLine(string:strip(Line,left),FileData))
+ end.
+
+%----------------------------------------------------------------------
+%AccessData is a ets table where the previous found data is inserted
+%FileData is a list of the directives in the last parsed file
+%before insertion a control is done that the directive is allowed to
+%override
+%----------------------------------------------------------------------
+insertData(AccessData,{{context,Values},FileData})->
+ insertData(AccessData,[{context,Values}|FileData]);
+
+insertData(AccessData,FileData)->
+ case ets:lookup(AccessData,allow_over_ride) of
+ [{allow_over_ride,all}]->
+ lists:foreach(fun(Elem)->
+ ets:insert(AccessData,Elem)
+ end,FileData);
+ []->
+ lists:foreach(fun(Elem)->
+ ets:insert(AccessData,Elem)
+ end,FileData);
+ [{allow_over_ride,Directives}]when list(Directives)->
+ lists:foreach(fun({Key,Value})->
+ case lists:member(Key,Directives) of
+ true->
+ ok;
+ false ->
+ ets:insert(AccessData,{Key,Value})
+ end
+ end,FileData);
+ [{allow_over_ride,_}]->
+ %Will never appear if the user
+ %aint doing very strang econfig files
+ ok
+ end.
+%----------------------------------------------------------------------
+%Take a line in the accessfile and transform it into a tuple that
+%later can be inserted in to the ets:table
+%----------------------------------------------------------------------
+%%%Here is the alternatives that resides inside the limit context
+
+insertLine([$o,$r,$d,$e,$r|Order],{{context,Values},FileData})->
+ {{context,[{order,getOrder(Order)}|Values]},FileData};
+%%Let the user place a tab in the beginning
+insertLine([$\t,$o,$r,$d,$e,$r|Order],{{context,Values},FileData})->
+ {{context,[{order,getOrder(Order)}|Values]},FileData};
+
+insertLine([$a,$l,$l,$o,$w|Allow],{{context,Values},FileData})->
+ {{context,[{allow,getAllowDenyData(Allow)}|Values]},FileData};
+insertLine([$\t,$a,$l,$l,$o,$w|Allow],{{context,Values},FileData})->
+ {{context,[{allow,getAllowDenyData(Allow)}|Values]},FileData};
+
+insertLine([$d,$e,$n,$y|Deny],{{context,Values},FileData})->
+ {{context,[{deny,getAllowDenyData(Deny)}|Values]},FileData};
+insertLine([$\t,$d,$e,$n,$y|Deny],{{context,Values},FileData})->
+ {{context,[{deny,getAllowDenyData(Deny)}|Values]},FileData};
+
+
+insertLine([$r,$e,$q,$u,$i,$r,$e|Require],{{context,Values},FileData})->
+ {{context,[{require,getRequireData(Require)}|Values]},FileData};
+insertLine([$\t,$r,$e,$q,$u,$i,$r,$e|Require],{{context,Values},FileData})->
+ {{context,[{require,getRequireData(Require)}|Values]},FileData};
+
+
+insertLine([$<,$/,$L,$i,$m,$i,$t|EndLimit],{Context,FileData})->
+ [Context|FileData];
+
+insertLine([$<,$L,$i,$m,$i,$t|Limit],FileData)->
+ {{context,[{limit,getLimits(Limit)}]}, FileData};
+
+
+
+insertLine([$A,$u,$t,$h,$U,$s,$e,$r,$F,$i,$l,$e,$\ |AuthUserFile],FileData)->
+ [{user_file,string:strip(AuthUserFile,right,$\n)}|FileData];
+
+insertLine([$A,$u,$t,$h,$G,$r,$o,$u,$p,$F,$i,$l,$e,$\ |AuthGroupFile],
+ FileData)->
+ [{group_file,string:strip(AuthGroupFile,right,$\n)}|FileData];
+
+insertLine([$A,$l,$l,$o,$w,$O,$v,$e,$r,$R,$i,$d,$e|AllowOverRide],FileData)->
+ [{allow_over_ride,getAllowOverRideData(AllowOverRide)}
+ |FileData];
+
+insertLine([$A,$u,$t,$h,$N,$a,$m,$e,$\ |AuthName],FileData)->
+ [{auth_name,string:strip(AuthName,right,$\n)}|FileData];
+
+insertLine([$A,$u,$t,$h,$T,$y,$p,$e|AuthType],FileData)->
+ [{auth_type,getAuthorizationType(AuthType)}|FileData];
+
+insertLine(_BadDirectiveOrComment,FileData)->
+ FileData.
+
+%----------------------------------------------------------------------
+%transform the Data specified about override to a form that is ieasier
+%handled later
+%Override data="all"|"md5"|"Directive1 .... DirectioveN"
+%----------------------------------------------------------------------
+
+getAllowOverRideData(OverRideData)->
+ case string:tokens(OverRideData," \r\n") of
+ [[$a,$l,$l]|_]->
+ all;
+ [[$n,$o,$n,$e]|_]->
+ none;
+ Directives ->
+ getOverRideDirectives(Directives)
+ end.
+
+getOverRideDirectives(Directives)->
+ lists:map(fun(Directive)->
+ transformDirective(Directive)
+ end,Directives).
+transformDirective([$A,$u,$t,$h,$U,$s,$e,$r,$F,$i,$l,$e|_])->
+ user_file;
+transformDirective([$A,$u,$t,$h,$G,$r,$o,$u,$p,$F,$i,$l,$e|_]) ->
+ group_file;
+transformDirective([$A,$u,$t,$h,$N,$a,$m,$e|_])->
+ auth_name;
+transformDirective([$A,$u,$t,$h,$T,$y,$p,$e|_])->
+ auth_type;
+transformDirective(_UnAllowedOverRideDirective) ->
+ unallowed.
+%----------------------------------------------------------------------
+%Replace the string that specify which method to use for authentication
+%and replace it with the atom for easier mathing
+%----------------------------------------------------------------------
+getAuthorizationType(AuthType)->
+ [Arg|Crap]=string:tokens(AuthType,"\n\r\ "),
+ case Arg of
+ [$B,$a,$s,$i,$c]->
+ basic;
+ [$M,$D,$5] ->
+ md5;
+ _What ->
+ error
+ end.
+%----------------------------------------------------------------------
+%Returns a list of the specified methods to limit or the atom all
+%----------------------------------------------------------------------
+getLimits(Limits)->
+ case regexp:split(Limits,">")of
+ {ok,[_NoEndOnLimit]}->
+ error;
+ {ok,[Methods|Crap]}->
+ case regexp:split(Methods," ")of
+ {ok,[]}->
+ all;
+ {ok,SplittedMethods}->
+ SplittedMethods;
+ {error,Error}->
+ error
+ end;
+ {error,_Error}->
+ error
+ end.
+
+
+%----------------------------------------------------------------------
+% Transform the order to prefrom deny allow control to a tuple of atoms
+%----------------------------------------------------------------------
+getOrder(Order)->
+ [First|Rest]=lists:map(fun(Part)->
+ list_to_atom(Part)
+ end,string:tokens(Order," \n\r")),
+ case First of
+ deny->
+ {deny,allow};
+ allow->
+ {allow,deny};
+ _Error->
+ error
+ end.
+
+%----------------------------------------------------------------------
+% The string AllowDeny is "from all" or "from Subnet1 Subnet2...SubnetN"
+%----------------------------------------------------------------------
+getAllowDenyData(AllowDeny)->
+ case string:tokens(AllowDeny," \n\r") of
+ [_From|AllowDenyData] when length(AllowDenyData)>=1->
+ case lists:nth(1,AllowDenyData) of
+ [$a,$l,$l]->
+ all;
+ Hosts->
+ AllowDenyData
+ end;
+ Error->
+ errror
+ end.
+%----------------------------------------------------------------------
+% Fix the string that describes who is allowed to se the page
+%----------------------------------------------------------------------
+getRequireData(Require)->
+ [UserOrGroup|UserData]=string:tokens(Require," \n\r"),
+ case UserOrGroup of
+ [$u,$s,$e,$r]->
+ {users,UserData};
+ [$g,$r,$o,$u,$p] ->
+ {groups,UserData};
+ _Whatever ->
+ error
+ end.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% %%
+%% Methods that collects the searchways to the accessfiles %%
+%% %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%----------------------------------------------------------------------
+% Get the whole path to the different accessfiles
+%----------------------------------------------------------------------
+getHtAccessFiles(HtAccessFileNames,Path,RestOfSplittedPath)->
+ getHtAccessFiles(HtAccessFileNames,Path,RestOfSplittedPath,[]).
+
+getHtAccessFiles(HtAccessFileNames,Path,[[]],HtAccessFiles)->
+ HtAccessFiles ++ accessFilesOfPath(HtAccessFileNames,Path++"/");
+
+getHtAccessFiles(HtAccessFileNames,Path,[],HtAccessFiles)->
+ HtAccessFiles;
+getHtAccessFiles(HtAccessFileNames,Path,[NextDir|RestOfSplittedPath],
+ AccessFiles)->
+ getHtAccessFiles(HtAccessFileNames,Path++"/"++NextDir,RestOfSplittedPath,
+ AccessFiles ++
+ accessFilesOfPath(HtAccessFileNames,Path++"/")).
+
+
+%----------------------------------------------------------------------
+%Control if therer are any accessfies in the path
+%----------------------------------------------------------------------
+accessFilesOfPath(HtAccessFileNames,Path)->
+ lists:foldl(fun(HtAccessFileName,Files)->
+ case file:read_file_info(Path++HtAccessFileName) of
+ {ok,FileInfo}->
+ [Path++HtAccessFileName|Files];
+ {error,_Error} ->
+ Files
+ end
+ end,[],HtAccessFileNames).
+
+
+%----------------------------------------------------------------------
+%Sake the splitted path and joins it up to the documentroot or the alias
+%that match first
+%----------------------------------------------------------------------
+
+getRootPath(SplittedPath,Info)->
+ DocRoot=httpd_util:lookup(Info#mod.config_db,document_root,"/"),
+ PresumtiveRootPath=
+ [DocRoot|lists:map(fun({Alias,RealPath})->
+ RealPath
+ end,
+ httpd_util:multi_lookup(Info#mod.config_db,alias))],
+ getRootPath(PresumtiveRootPath,SplittedPath,Info).
+
+
+getRootPath(PresumtiveRootPath,[[],Splittedpath],Info)->
+ getRootPath(PresumtiveRootPath,["/",Splittedpath],Info);
+
+
+getRootPath(PresumtiveRootPath,[Part,NextPart|SplittedPath],Info)->
+ case lists:member(Part,PresumtiveRootPath)of
+ true->
+ {ok,Part,[NextPart|SplittedPath]};
+ false ->
+ getRootPath(PresumtiveRootPath,
+ [Part++"/"++NextPart|SplittedPath],Info)
+ end;
+
+getRootPath(PresumtiveRootPath,[Part],Info)->
+ case lists:member(Part,PresumtiveRootPath)of
+ true->
+ {ok,Part,[]};
+ false ->
+ {error,Part}
+ end.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%Debug methods %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%----------------------------------------------------------------------
+% Simulate the webserver by calling do/1 with apropiate parameters
+%----------------------------------------------------------------------
+debug()->
+ Conf=getConfigData(),
+ Uri=getUri(),
+ {_Proceed,Data}=getDataFromAlias(Conf,Uri),
+ Init_data=#init_data{peername={socket,"127.0.0.1"}},
+ ParsedHeader=headerparts(),
+ do(#mod{init_data=Init_data,
+ data=Data,
+ config_db=Conf,
+ request_uri=Uri,
+ parsed_header=ParsedHeader,
+ method="GET"}).
+
+%----------------------------------------------------------------------
+%Add authenticate data to the fake http-request header
+%----------------------------------------------------------------------
+headerparts()->
+ [{"authorization","Basic " ++ httpd_util:encode_base64("lotta:potta")}].
+
+getDataFromAlias(Conf,Uri)->
+ mod_alias:do(#mod{config_db=Conf,request_uri=Uri}).
+
+getUri()->
+ "/appmon/test/test.html".
+
+getConfigData()->
+ Tab=ets:new(test_inets,[bag,public]),
+ ets:insert(Tab,{server_name,"localhost"}),
+ ets:insert(Tab,{bind_addresss,{127,0,0,1}}),
+ ets:insert(Tab,{erl_script_alias,{"/webcover/erl",["webcover"]}}),
+ ets:insert(Tab,{erl_script_alias,{"/erl",["webappmon"]}}),
+ ets:insert(Tab,{com_type,ip_comm}),
+ ets:insert(Tab,{modules,[mod_alias,mod_auth,mod_header]}),
+ ets:insert(Tab,{default_type,"text/plain"}),
+ ets:insert(Tab,{server_root,
+ "/home/gandalf/marting/exjobb/webtool-1.0/priv/root"}),
+ ets:insert(Tab,{port,8888}),
+ ets:insert(Tab,{document_root,
+ "/home/gandalf/marting/exjobb/webtool-1.0/priv/root"}),
+ ets:insert(Tab,
+ {alias,
+ {"/appmon"
+ ,"/home/gandalf/marting/exjobb/webappmon-1.0/priv"}}),
+ ets:insert(Tab,{alias,
+ {"/webcover"
+ ,"/home/gandalf/marting/exjobb/webcover-1.0/priv"}}),
+ ets:insert(Tab,{access_file,[".htaccess","kalle","pelle"]}),
+ Tab.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_include.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_include.erl
new file mode 100644
index 0000000000..eedbf4a669
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_include.erl
@@ -0,0 +1,722 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mod_include.erl,v 1.1 2008/12/17 09:53:35 mikpe Exp $
+%%
+-module(mod_include).
+-export([do/1,parse/2,config/6,include/6,echo/6,fsize/6,flastmod/6,exec/6]).
+
+-include("httpd.hrl").
+
+-define(VMODULE,"INCLUDE").
+-include("httpd_verbosity.hrl").
+
+%% do
+
+do(Info) ->
+ ?vtrace("do",[]),
+ case Info#mod.method of
+ "GET" ->
+ case httpd_util:key1search(Info#mod.data,status) of
+ %% A status code has been generated!
+ {StatusCode,PhraseArgs,Reason} ->
+ {proceed,Info#mod.data};
+ %% No status code has been generated!
+ undefined ->
+ case httpd_util:key1search(Info#mod.data, response) of
+ %% No response has been generated!
+ undefined ->
+ do_include(Info);
+ %% A response has been generated or sent!
+ Response ->
+ {proceed,Info#mod.data}
+ end
+ end;
+ %% Not a GET method!
+ _ ->
+ {proceed,Info#mod.data}
+ end.
+
+do_include(Info) ->
+ ?vtrace("do_include -> entry with"
+ "~n URI: ~p",[Info#mod.request_uri]),
+ Path = mod_alias:path(Info#mod.data,Info#mod.config_db,
+ Info#mod.request_uri),
+ Suffix = httpd_util:suffix(Path),
+ case httpd_util:lookup_mime_default(Info#mod.config_db,Suffix) of
+ "text/x-server-parsed-html" ->
+ HeaderStart =
+ httpd_util:header(200, "text/html", Info#mod.connection),
+ ?vtrace("do_include -> send ~p", [Path]),
+ case send_in(Info,Path,HeaderStart,file:read_file_info(Path)) of
+ {ok, ErrorLog, Size} ->
+ ?vtrace("do_include -> sent ~w bytes", [Size]),
+ {proceed,[{response,{already_sent,200,Size}},
+ {mime_type,"text/html"}|
+ lists:append(ErrorLog,Info#mod.data)]};
+ {error, Reason} ->
+ ?vlog("send in failed:"
+ "~n Reason: ~p"
+ "~n Path: ~p"
+ "~n Info: ~p",
+ [Reason,Info,Path]),
+ {proceed,
+ [{status,send_error(Reason,Info,Path)}|Info#mod.data]}
+ end;
+ _ -> %% Unknown mime type, ignore
+ {proceed,Info#mod.data}
+ end.
+
+
+%%
+%% config directive
+%%
+
+config(Info, Context, ErrorLog, TagList, ValueList, R) ->
+ case verify_tags("config",[errmsg,timefmt,sizefmt],
+ TagList,ValueList) of
+ ok ->
+ {ok,update_context(TagList,ValueList,Context),ErrorLog,"",R};
+ {error,Reason} ->
+ {ok,Context,[{internal_info,Reason}|ErrorLog],
+ httpd_util:key1search(Context,errmsg,""),R}
+ end.
+
+update_context([],[],Context) ->
+ Context;
+update_context([Tag|R1],[Value|R2],Context) ->
+ update_context(R1,R2,[{Tag,Value}|Context]).
+
+verify_tags(Command,ValidTags,TagList,ValueList) when length(TagList)==length(ValueList) ->
+ verify_tags(Command,ValidTags,TagList);
+verify_tags(Command,ValidTags,TagList,ValueList) ->
+ {error,?NICE(Command++" directive has spurious tags")}.
+
+verify_tags(Command, ValidTags, []) ->
+ ok;
+verify_tags(Command, ValidTags, [Tag|Rest]) ->
+ case lists:member(Tag, ValidTags) of
+ true ->
+ verify_tags(Command, ValidTags, Rest);
+ false ->
+ {error,?NICE(Command++" directive has a spurious tag ("++
+ atom_to_list(Tag)++")")}
+ end.
+
+%%
+%% include directive
+%%
+
+include(Info,Context,ErrorLog,[virtual],[VirtualPath],R) ->
+ Aliases = httpd_util:multi_lookup(Info#mod.config_db,alias),
+ {_, Path, _AfterPath} =
+ mod_alias:real_name(Info#mod.config_db, VirtualPath, Aliases),
+ include(Info,Context,ErrorLog,R,Path);
+include(Info, Context, ErrorLog, [file], [FileName], R) ->
+ Path = file(Info#mod.config_db, Info#mod.request_uri, FileName),
+ include(Info, Context, ErrorLog, R, Path);
+include(Info, Context, ErrorLog, TagList, ValueList, R) ->
+ {ok, Context,
+ [{internal_info,?NICE("include directive has a spurious tag")}|
+ ErrorLog], httpd_util:key1search(Context, errmsg, ""), R}.
+
+include(Info, Context, ErrorLog, R, Path) ->
+ ?DEBUG("include -> read file: ~p",[Path]),
+ case file:read_file(Path) of
+ {ok, Body} ->
+ ?DEBUG("include -> size(Body): ~p",[size(Body)]),
+ {ok, NewContext, NewErrorLog, Result} =
+ parse(Info, binary_to_list(Body), Context, ErrorLog, []),
+ {ok, Context, NewErrorLog, Result, R};
+ {error, Reason} ->
+ {ok, Context,
+ [{internal_info, ?NICE("Can't open "++Path)}|ErrorLog],
+ httpd_util:key1search(Context, errmsg, ""), R}
+ end.
+
+file(ConfigDB, RequestURI, FileName) ->
+ Aliases = httpd_util:multi_lookup(ConfigDB, alias),
+ {_, Path, _AfterPath}
+ = mod_alias:real_name(ConfigDB, RequestURI, Aliases),
+ Pwd = filename:dirname(Path),
+ filename:join(Pwd, FileName).
+
+%%
+%% echo directive
+%%
+
+echo(Info,Context,ErrorLog,[var],["DOCUMENT_NAME"],R) ->
+ {ok,Context,ErrorLog,document_name(Info#mod.data,Info#mod.config_db,
+ Info#mod.request_uri),R};
+echo(Info,Context,ErrorLog,[var],["DOCUMENT_URI"],R) ->
+ {ok,Context,ErrorLog,document_uri(Info#mod.config_db,
+ Info#mod.request_uri),R};
+echo(Info,Context,ErrorLog,[var],["QUERY_STRING_UNESCAPED"],R) ->
+ {ok,Context,ErrorLog,query_string_unescaped(Info#mod.request_uri),R};
+echo(Info,Context,ErrorLog,[var],["DATE_LOCAL"],R) ->
+ {ok,Context,ErrorLog,date_local(),R};
+echo(Info,Context,ErrorLog,[var],["DATE_GMT"],R) ->
+ {ok,Context,ErrorLog,date_gmt(),R};
+echo(Info,Context,ErrorLog,[var],["LAST_MODIFIED"],R) ->
+ {ok,Context,ErrorLog,last_modified(Info#mod.data,Info#mod.config_db,
+ Info#mod.request_uri),R};
+echo(Info,Context,ErrorLog,TagList,ValueList,R) ->
+ {ok,Context,
+ [{internal_info,?NICE("echo directive has a spurious tag")}|
+ ErrorLog],"(none)",R}.
+
+document_name(Data,ConfigDB,RequestURI) ->
+ Path = mod_alias:path(Data,ConfigDB,RequestURI),
+ case regexp:match(Path,"[^/]*\$") of
+ {match,Start,Length} ->
+ string:substr(Path,Start,Length);
+ nomatch ->
+ "(none)"
+ end.
+
+document_uri(ConfigDB, RequestURI) ->
+ Aliases = httpd_util:multi_lookup(ConfigDB, alias),
+ {Path, AfterPath} =
+ case mod_alias:real_name(ConfigDB, RequestURI, Aliases) of
+ {_, Name, {[], []}} ->
+ {Name, ""};
+ {_, Name, {PathInfo, []}} ->
+ {Name, "/"++PathInfo};
+ {_, Name, {PathInfo, QueryString}} ->
+ {Name, "/"++PathInfo++"?"++QueryString};
+ {_, Name, _} ->
+ {Name, ""};
+ Gurka ->
+ io:format("Gurka: ~p~n", [Gurka])
+ end,
+ VirtualPath = string:substr(RequestURI, 1,
+ length(RequestURI)-length(AfterPath)),
+ {match, Start, Length} = regexp:match(Path,"[^/]*\$"),
+ FileName = string:substr(Path,Start,Length),
+ case regexp:match(VirtualPath, FileName++"\$") of
+ {match, _, _} ->
+ httpd_util:decode_hex(VirtualPath)++AfterPath;
+ nomatch ->
+ string:strip(httpd_util:decode_hex(VirtualPath),right,$/)++
+ "/"++FileName++AfterPath
+ end.
+
+query_string_unescaped(RequestURI) ->
+ case regexp:match(RequestURI,"[\?].*\$") of
+ {match,Start,Length} ->
+ %% Escape all shell-special variables with \
+ escape(string:substr(RequestURI,Start+1,Length-1));
+ nomatch ->
+ "(none)"
+ end.
+
+escape([]) -> [];
+escape([$;|R]) -> [$\\,$;|escape(R)];
+escape([$&|R]) -> [$\\,$&|escape(R)];
+escape([$(|R]) -> [$\\,$(|escape(R)];
+escape([$)|R]) -> [$\\,$)|escape(R)];
+escape([$||R]) -> [$\\,$||escape(R)];
+escape([$^|R]) -> [$\\,$^|escape(R)];
+escape([$<|R]) -> [$\\,$<|escape(R)];
+escape([$>|R]) -> [$\\,$>|escape(R)];
+escape([$\n|R]) -> [$\\,$\n|escape(R)];
+escape([$ |R]) -> [$\\,$ |escape(R)];
+escape([$\t|R]) -> [$\\,$\t|escape(R)];
+escape([C|R]) -> [C|escape(R)].
+
+date_local() ->
+ {{Year,Month,Day},{Hour,Minute,Second}}=calendar:local_time(),
+ %% Time format hard-wired to: "%a %b %e %T %Y" according to strftime(3)
+ io_lib:format("~s ~s ~2w ~2.2.0w:~2.2.0w:~2.2.0w ~w",
+ [httpd_util:day(calendar:day_of_the_week(Year,Month,Day)),
+ httpd_util:month(Month),Day,Hour,Minute,Second,Year]).
+
+date_gmt() ->
+ {{Year,Month,Day},{Hour,Minute,Second}}=calendar:universal_time(),
+ %% Time format hard-wired to: "%a %b %e %T %Z %Y" according to strftime(3)
+ io_lib:format("~s ~s ~2w ~2.2.0w:~2.2.0w:~2.2.0w GMT ~w",
+ [httpd_util:day(calendar:day_of_the_week(Year,Month,Day)),
+ httpd_util:month(Month),Day,Hour,Minute,Second,Year]).
+
+last_modified(Data,ConfigDB,RequestURI) ->
+ {ok,FileInfo}=file:read_file_info(mod_alias:path(Data,ConfigDB,RequestURI)),
+ {{Year,Month,Day},{Hour,Minute,Second}}=FileInfo#file_info.mtime,
+ io_lib:format("~s ~s ~2w ~2.2.0w:~2.2.0w:~2.2.0w ~w",
+ [httpd_util:day(calendar:day_of_the_week(Year,Month,Day)),
+ httpd_util:month(Month),Day,Hour,Minute,Second,Year]).
+
+%%
+%% fsize directive
+%%
+
+fsize(Info,Context,ErrorLog,[virtual],[VirtualPath],R) ->
+ Aliases=httpd_util:multi_lookup(Info#mod.config_db,alias),
+ {_,Path,AfterPath}=
+ mod_alias:real_name(Info#mod.config_db,VirtualPath,Aliases),
+ fsize(Info, Context, ErrorLog, R, Path);
+fsize(Info,Context,ErrorLog,[file],[FileName],R) ->
+ Path=file(Info#mod.config_db,Info#mod.request_uri,FileName),
+ fsize(Info,Context,ErrorLog,R,Path);
+fsize(Info,Context,ErrorLog,TagList,ValueList,R) ->
+ {ok,Context,[{internal_info,?NICE("fsize directive has a spurious tag")}|
+ ErrorLog],httpd_util:key1search(Context,errmsg,""),R}.
+
+fsize(Info,Context,ErrorLog,R,Path) ->
+ case file:read_file_info(Path) of
+ {ok,FileInfo} ->
+ case httpd_util:key1search(Context,sizefmt) of
+ "bytes" ->
+ {ok,Context,ErrorLog,
+ integer_to_list(FileInfo#file_info.size),R};
+ "abbrev" ->
+ Size = integer_to_list(trunc(FileInfo#file_info.size/1024+1))++"k",
+ {ok,Context,ErrorLog,Size,R};
+ Value->
+ {ok,Context,
+ [{internal_info,
+ ?NICE("fsize directive has a spurious tag value ("++
+ Value++")")}|
+ ErrorLog],
+ httpd_util:key1search(Context, errmsg, ""), R}
+ end;
+ {error,Reason} ->
+ {ok,Context,[{internal_info,?NICE("Can't open "++Path)}|ErrorLog],
+ httpd_util:key1search(Context,errmsg,""),R}
+ end.
+
+%%
+%% flastmod directive
+%%
+
+flastmod(Info, Context, ErrorLog, [virtual], [VirtualPath],R) ->
+ Aliases=httpd_util:multi_lookup(Info#mod.config_db,alias),
+ {_,Path,AfterPath}=
+ mod_alias:real_name(Info#mod.config_db,VirtualPath,Aliases),
+ flastmod(Info,Context,ErrorLog,R,Path);
+flastmod(Info, Context, ErrorLog, [file], [FileName], R) ->
+ Path = file(Info#mod.config_db, Info#mod.request_uri, FileName),
+ flastmod(Info, Context, ErrorLog, R, Path);
+flastmod(Info,Context,ErrorLog,TagList,ValueList,R) ->
+ {ok,Context,[{internal_info,?NICE("flastmod directive has a spurious tag")}|
+ ErrorLog],httpd_util:key1search(Context,errmsg,""),R}.
+
+flastmod(Info,Context,ErrorLog,R,File) ->
+ case file:read_file_info(File) of
+ {ok,FileInfo} ->
+ {{Yr,Mon,Day},{Hour,Minute,Second}}=FileInfo#file_info.mtime,
+ Result=
+ io_lib:format("~s ~s ~2w ~w:~w:~w ~w",
+ [httpd_util:day(
+ calendar:day_of_the_week(Yr,Mon, Day)),
+ httpd_util:month(Mon),Day,Hour,Minute,Second, Yr]),
+ {ok,Context,ErrorLog,Result,R};
+ {error,Reason} ->
+ {ok,Context,[{internal_info,?NICE("Can't open "++File)}|ErrorLog],
+ httpd_util:key1search(Context,errmsg,""),R}
+ end.
+
+%%
+%% exec directive
+%%
+
+exec(Info,Context,ErrorLog,[cmd],[Command],R) ->
+ ?vtrace("exec cmd:~n Command: ~p",[Command]),
+ cmd(Info,Context,ErrorLog,R,Command);
+exec(Info,Context,ErrorLog,[cgi],[RequestURI],R) ->
+ ?vtrace("exec cgi:~n RequestURI: ~p",[RequestURI]),
+ cgi(Info,Context,ErrorLog,R,RequestURI);
+exec(Info,Context,ErrorLog,TagList,ValueList,R) ->
+ ?vtrace("exec with spurious tag:"
+ "~n TagList: ~p"
+ "~n ValueList: ~p",
+ [TagList,ValueList]),
+ {ok, Context,
+ [{internal_info,?NICE("exec directive has a spurious tag")}|
+ ErrorLog], httpd_util:key1search(Context,errmsg,""),R}.
+
+%% cmd
+
+cmd(Info, Context, ErrorLog, R, Command) ->
+ process_flag(trap_exit,true),
+ Env = env(Info),
+ Dir = filename:dirname(Command),
+ Port = (catch open_port({spawn,Command},[stream,{cd,Dir},{env,Env}])),
+ case Port of
+ P when port(P) ->
+ {NewErrorLog, Result} = proxy(Port, ErrorLog),
+ {ok, Context, NewErrorLog, Result, R};
+ {'EXIT', Reason} ->
+ ?vlog("open port failed: exit"
+ "~n URI: ~p"
+ "~n Reason: ~p",
+ [Info#mod.request_uri,Reason]),
+ exit({open_port_failed,Reason,
+ [{uri,Info#mod.request_uri},{script,Command},
+ {env,Env},{dir,Dir}]});
+ O ->
+ ?vlog("open port failed: unknown result"
+ "~n URI: ~p"
+ "~n O: ~p",
+ [Info#mod.request_uri,O]),
+ exit({open_port_failed,O,
+ [{uri,Info#mod.request_uri},{script,Command},
+ {env,Env},{dir,Dir}]})
+ end.
+
+env(Info) ->
+ [{"DOCUMENT_NAME",document_name(Info#mod.data,Info#mod.config_db,
+ Info#mod.request_uri)},
+ {"DOCUMENT_URI", document_uri(Info#mod.config_db, Info#mod.request_uri)},
+ {"QUERY_STRING_UNESCAPED", query_string_unescaped(Info#mod.request_uri)},
+ {"DATE_LOCAL", date_local()},
+ {"DATE_GMT", date_gmt()},
+ {"LAST_MODIFIED", last_modified(Info#mod.data, Info#mod.config_db,
+ Info#mod.request_uri)}
+ ].
+
+%% cgi
+
+cgi(Info, Context, ErrorLog, R, RequestURI) ->
+ ScriptAliases = httpd_util:multi_lookup(Info#mod.config_db, script_alias),
+ case mod_alias:real_script_name(Info#mod.config_db, RequestURI,
+ ScriptAliases) of
+ {Script, AfterScript} ->
+ exec_script(Info,Script,AfterScript,ErrorLog,Context,R);
+ not_a_script ->
+ {ok, Context,
+ [{internal_info, ?NICE(RequestURI++" is not a script")}|
+ ErrorLog], httpd_util:key1search(Context, errmsg, ""),R}
+ end.
+
+remove_header([]) ->
+ [];
+remove_header([$\n,$\n|Rest]) ->
+ Rest;
+remove_header([C|Rest]) ->
+ remove_header(Rest).
+
+
+exec_script(Info,Script,AfterScript,ErrorLog,Context,R) ->
+ process_flag(trap_exit,true),
+ Aliases = httpd_util:multi_lookup(Info#mod.config_db, alias),
+ {_, Path, AfterPath} = mod_alias:real_name(Info#mod.config_db,
+ Info#mod.request_uri,
+ Aliases),
+ Env = env(Info)++mod_cgi:env(Info, Path, AfterPath),
+ Dir = filename:dirname(Path),
+ Port = (catch open_port({spawn,Script},[stream,{env, Env},{cd, Dir}])),
+ case Port of
+ P when port(P) ->
+ %% Send entity body to port.
+ Res = case Info#mod.entity_body of
+ [] ->
+ true;
+ EntityBody ->
+ (catch port_command(Port,EntityBody))
+ end,
+ case Res of
+ {'EXIT', Reason} ->
+ ?vlog("port send failed:"
+ "~n Port: ~p"
+ "~n URI: ~p"
+ "~n Reason: ~p",
+ [Port,Info#mod.request_uri,Reason]),
+ exit({open_cmd_failed,Reason,
+ [{mod,?MODULE},{port,Port},
+ {uri,Info#mod.request_uri},
+ {script,Script},{env,Env},{dir,Dir},
+ {ebody_size,sz(Info#mod.entity_body)}]});
+ true ->
+ {NewErrorLog, Result} = proxy(Port, ErrorLog),
+ {ok, Context, NewErrorLog, remove_header(Result), R}
+ end;
+ {'EXIT', Reason} ->
+ ?vlog("open port failed: exit"
+ "~n URI: ~p"
+ "~n Reason: ~p",
+ [Info#mod.request_uri,Reason]),
+ exit({open_port_failed,Reason,
+ [{mod,?MODULE},{uri,Info#mod.request_uri},{script,Script},
+ {env,Env},{dir,Dir}]});
+ O ->
+ ?vlog("open port failed: unknown result"
+ "~n URI: ~p"
+ "~n O: ~p",
+ [Info#mod.request_uri,O]),
+ exit({open_port_failed,O,
+ [{mod,?MODULE},{uri,Info#mod.request_uri},{script,Script},
+ {env,Env},{dir,Dir}]})
+ end.
+
+
+%%
+%% Port communication
+%%
+
+proxy(Port,ErrorLog) ->
+ process_flag(trap_exit, true),
+ proxy(Port, ErrorLog, []).
+
+proxy(Port, ErrorLog, Result) ->
+ receive
+ {Port, {data, Response}} ->
+ proxy(Port, ErrorLog, lists:append(Result,Response));
+ {'EXIT', Port, normal} when port(Port) ->
+ process_flag(trap_exit, false),
+ {ErrorLog, Result};
+ {'EXIT', Port, Reason} when port(Port) ->
+ process_flag(trap_exit, false),
+ {[{internal_info,
+ ?NICE("Scrambled output from CGI-script")}|ErrorLog],
+ Result};
+ {'EXIT', Pid, Reason} when pid(Pid) ->
+ process_flag(trap_exit, false),
+ {'EXIT', Pid, Reason};
+ %% This should not happen!
+ WhatEver ->
+ process_flag(trap_exit, false),
+ {ErrorLog, Result}
+ end.
+
+
+%% ------
+%% Temporary until I figure out a way to fix send_in_chunks
+%% (comments and directives that start in one chunk but end
+%% in another is not handled).
+%%
+
+send_in(Info, Path,Head, {ok,FileInfo}) ->
+ case file:read_file(Path) of
+ {ok, Bin} ->
+ send_in1(Info, binary_to_list(Bin), Head, FileInfo);
+ {error, Reason} ->
+ ?vlog("failed reading file: ~p",[Reason]),
+ {error, {open,Reason}}
+ end;
+send_in(Info,Path,Head,{error,Reason}) ->
+ ?vlog("failed open file: ~p",[Reason]),
+ {error, {open,Reason}}.
+
+send_in1(Info, Data,Head,FileInfo) ->
+ {ok, _Context, Err, ParsedBody} = parse(Info,Data,?DEFAULT_CONTEXT,[],[]),
+ Size = length(ParsedBody),
+ ?vdebug("send_in1 -> Size: ~p",[Size]),
+ Head1 = case Info#mod.http_version of
+ "HTTP/1.1"->
+ Head ++
+ "Content-Length: " ++
+ integer_to_list(Size) ++
+ "\r\nEtag:" ++
+ httpd_util:create_etag(FileInfo,Size) ++"\r\n" ++
+ "Last-Modified: " ++
+ httpd_util:rfc1123_date(FileInfo#file_info.mtime) ++
+ "\r\n\r\n";
+ _->
+ %% i.e http/1.0 and http/0.9
+ Head ++
+ "Content-Length: " ++
+ integer_to_list(Size) ++
+ "\r\nLast-Modified: " ++
+ httpd_util:rfc1123_date(FileInfo#file_info.mtime) ++
+ "\r\n\r\n"
+ end,
+ httpd_socket:deliver(Info#mod.socket_type,Info#mod.socket,
+ [Head1,ParsedBody]),
+ {ok, Err, Size}.
+
+
+
+%%
+%% Addition to "Fuzzy" HTML parser. This is actually a ugly hack to
+%% avoid putting to much data on the heap. To be rewritten...
+%%
+
+% -define(CHUNK_SIZE, 4096).
+
+% send_in_chunks(Info, Path) ->
+% ?DEBUG("send_in_chunks -> Path: ~p",[Path]),
+% case file:open(Path, [read, raw]) of
+% {ok, Stream} ->
+% send_in_chunks(Info, Stream, ?DEFAULT_CONTEXT,[]);
+% {error, Reason} ->
+% ?ERROR("Failed open file: ~p",[Reason]),
+% {error, {open,Reason}}
+% end.
+
+% send_in_chunks(Info, Stream, Context, ErrorLog) ->
+% case file:read(Stream, ?CHUNK_SIZE) of
+% {ok, Data} ->
+% ?DEBUG("send_in_chunks -> read ~p bytes",[length(Data)]),
+% {ok, NewContext, NewErrorLog, ParsedBody}=
+% parse(Info, Data, Context, ErrorLog, []),
+% httpd_socket:deliver(Info#mod.socket_type,
+% Info#mod.socket, ParsedBody),
+% send_in_chunks(Info,Stream,NewContext,NewErrorLog);
+% eof ->
+% {ok, ErrorLog};
+% {error, Reason} ->
+% ?ERROR("Failed read from file: ~p",[Reason]),
+% {error, {read,Reason}}
+% end.
+
+
+%%
+%% "Fuzzy" HTML parser
+%%
+
+parse(Info,Body) ->
+ parse(Info, Body, ?DEFAULT_CONTEXT, [], []).
+
+parse(Info, [], Context, ErrorLog, Result) ->
+ {ok, Context, lists:reverse(ErrorLog), lists:reverse(Result)};
+parse(Info,[$<,$!,$-,$-,$#|R1],Context,ErrorLog,Result) ->
+ ?DEBUG("parse -> start command directive when length(R1): ~p",[length(R1)]),
+ case catch parse0(R1,Context) of
+ {parse_error,Reason} ->
+ parse(Info,R1,Context,[{internal_info,?NICE(Reason)}|ErrorLog],
+ [$#,$-,$-,$!,$<|Result]);
+ {ok,Context,Command,TagList,ValueList,R2} ->
+ ?DEBUG("parse -> Command: ~p",[Command]),
+ {ok,NewContext,NewErrorLog,MoreResult,R3}=
+ handle(Info,Context,ErrorLog,Command,TagList,ValueList,R2),
+ parse(Info,R3,NewContext,NewErrorLog,lists:reverse(MoreResult)++Result)
+ end;
+parse(Info,[$<,$!,$-,$-|R1],Context,ErrorLog,Result) ->
+ ?DEBUG("parse -> start comment when length(R1) = ~p",[length(R1)]),
+ case catch parse5(R1,[],0) of
+ {parse_error,Reason} ->
+ ?ERROR("parse -> parse error: ~p",[Reason]),
+ parse(Info,R1,Context,[{internal_info,?NICE(Reason)}|ErrorLog],Result);
+ {Comment,R2} ->
+ ?DEBUG("parse -> length(Comment) = ~p, length(R2) = ~p",
+ [length(Comment),length(R2)]),
+ parse(Info,R2,Context,ErrorLog,Comment++Result)
+ end;
+parse(Info,[C|R],Context,ErrorLog,Result) ->
+ parse(Info,R,Context,ErrorLog,[C|Result]).
+
+handle(Info,Context,ErrorLog,Command,TagList,ValueList,R) ->
+ case catch apply(?MODULE,Command,[Info,Context,ErrorLog,TagList,ValueList,
+ R]) of
+ {'EXIT',{undef,_}} ->
+ throw({parse_error,"Unknown command "++atom_to_list(Command)++
+ " in parsed doc"});
+ Result ->
+ Result
+ end.
+
+parse0([],Context) ->
+ throw({parse_error,"Premature EOF in parsed file"});
+parse0([$-,$-,$>|R],Context) ->
+ throw({parse_error,"Premature EOF in parsed file"});
+parse0([$ |R],Context) ->
+ parse0(R,Context);
+parse0(String,Context) ->
+ parse1(String,Context,"").
+
+parse1([],Context,Command) ->
+ throw({parse_error,"Premature EOF in parsed file"});
+parse1([$-,$-,$>|R],Context,Command) ->
+ throw({parse_error,"Premature EOF in parsed file"});
+parse1([$ |R],Context,Command) ->
+ parse2(R,Context,list_to_atom(lists:reverse(Command)),[],[],"");
+parse1([C|R],Context,Command) ->
+ parse1(R,Context,[C|Command]).
+
+parse2([],Context,Command,TagList,ValueList,Tag) ->
+ throw({parse_error,"Premature EOF in parsed file"});
+parse2([$-,$-,$>|R],Context,Command,TagList,ValueList,Tag) ->
+ {ok,Context,Command,TagList,ValueList,R};
+parse2([$ |R],Context,Command,TagList,ValueList,Tag) ->
+ parse2(R,Context,Command,TagList,ValueList,Tag);
+parse2([$=|R],Context,Command,TagList,ValueList,Tag) ->
+ parse3(R,Context,Command,[list_to_atom(lists:reverse(Tag))|TagList],
+ ValueList);
+parse2([C|R],Context,Command,TagList,ValueList,Tag) ->
+ parse2(R,Context,Command,TagList,ValueList,[C|Tag]).
+
+parse3([],Context,Command,TagList,ValueList) ->
+ throw({parse_error,"Premature EOF in parsed file"});
+parse3([$-,$-,$>|R],Context,Command,TagList,ValueList) ->
+ throw({parse_error,"Premature EOF in parsed file"});
+parse3([$ |R],Context,Command,TagList,ValueList) ->
+ parse3(R,Context,Command,TagList,ValueList);
+parse3([$"|R],Context,Command,TagList,ValueList) ->
+ parse4(R,Context,Command,TagList,ValueList,"");
+parse3(String,Context,Command,TagList,ValueList) ->
+ throw({parse_error,"Premature EOF in parsed file"}).
+
+parse4([],Context,Command,TagList,ValueList,Value) ->
+ throw({parse_error,"Premature EOF in parsed file"});
+parse4([$-,$-,$>|R],Context,Command,TagList,ValueList,Value) ->
+ throw({parse_error,"Premature EOF in parsed file"});
+parse4([$"|R],Context,Command,TagList,ValueList,Value) ->
+ parse2(R,Context,Command,TagList,[lists:reverse(Value)|ValueList],"");
+parse4([C|R],Context,Command,TagList,ValueList,Value) ->
+ parse4(R,Context,Command,TagList,ValueList,[C|Value]).
+
+parse5([],Comment,Depth) ->
+ ?ERROR("parse5 -> unterminated comment of ~p bytes when Depth = ~p",
+ [length(Comment),Depth]),
+ throw({parse_error,"Premature EOF in parsed file"});
+parse5([$<,$!,$-,$-|R],Comment,Depth) ->
+ parse5(R,[$-,$-,$!,$<|Comment],Depth+1);
+parse5([$-,$-,$>|R],Comment,0) ->
+ {">--"++Comment++"--!<",R};
+parse5([$-,$-,$>|R],Comment,Depth) ->
+ parse5(R,[$>,$-,$-|Comment],Depth-1);
+parse5([C|R],Comment,Depth) ->
+ parse5(R,[C|Comment],Depth).
+
+
+sz(B) when binary(B) -> {binary,size(B)};
+sz(L) when list(L) -> {list,length(L)};
+sz(_) -> undefined.
+
+
+%% send_error - Handle failure to send the file
+%%
+send_error({open,Reason},Info,Path) -> open_error(Reason,Info,Path);
+send_error({read,Reason},Info,Path) -> read_error(Reason,Info,Path).
+
+
+%% open_error - Handle file open failure
+%%
+open_error(eacces,Info,Path) ->
+ open_error(403,Info,Path,"");
+open_error(enoent,Info,Path) ->
+ open_error(404,Info,Path,"");
+open_error(enotdir,Info,Path) ->
+ open_error(404,Info,Path,
+ ": A component of the file name is not a directory");
+open_error(emfile,_Info,Path) ->
+ open_error(500,none,Path,": To many open files");
+open_error({enfile,_},_Info,Path) ->
+ open_error(500,none,Path,": File table overflow");
+open_error(_Reason,_Info,Path) ->
+ open_error(500,none,Path,"").
+
+open_error(StatusCode,none,Path,Reason) ->
+ {StatusCode,none,?NICE("Can't open "++Path++Reason)};
+open_error(StatusCode,Info,Path,Reason) ->
+ {StatusCode,Info#mod.request_uri,?NICE("Can't open "++Path++Reason)}.
+
+read_error(_Reason,_Info,Path) ->
+ read_error(500,none,Path,"").
+
+read_error(StatusCode,none,Path,Reason) ->
+ {StatusCode,none,?NICE("Can't read "++Path++Reason)};
+read_error(StatusCode,Info,Path,Reason) ->
+ {StatusCode,Info#mod.request_uri,?NICE("Can't read "++Path++Reason)}.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_log.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_log.erl
new file mode 100644
index 0000000000..a24ac425e6
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_log.erl
@@ -0,0 +1,250 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mod_log.erl,v 1.1 2008/12/17 09:53:35 mikpe Exp $
+%%
+-module(mod_log).
+-export([do/1,error_log/5,security_log/2,load/2,store/2,remove/1]).
+
+-export([report_error/2]).
+
+-include("httpd.hrl").
+
+-define(VMODULE,"LOG").
+-include("httpd_verbosity.hrl").
+
+%% do
+
+do(Info) ->
+ AuthUser = auth_user(Info#mod.data),
+ Date = custom_date(),
+ log_internal_info(Info,Date,Info#mod.data),
+ case httpd_util:key1search(Info#mod.data,status) of
+ %% A status code has been generated!
+ {StatusCode,PhraseArgs,Reason} ->
+ transfer_log(Info,"-",AuthUser,Date,StatusCode,0),
+ if
+ StatusCode >= 400 ->
+ error_log(Info,Date,Reason);
+ true ->
+ not_an_error
+ end,
+ {proceed,Info#mod.data};
+ %% No status code has been generated!
+ undefined ->
+ case httpd_util:key1search(Info#mod.data,response) of
+ {already_sent,StatusCode,Size} ->
+ transfer_log(Info,"-",AuthUser,Date,StatusCode,Size),
+ {proceed,Info#mod.data};
+ {response,Head,Body} ->
+ Size=httpd_util:key1search(Head,content_length,unknown),
+ Code=httpd_util:key1search(Head,code,unknown),
+ transfer_log(Info,"-",AuthUser,Date,Code,Size),
+ {proceed,Info#mod.data};
+ {StatusCode,Response} ->
+ transfer_log(Info,"-",AuthUser,Date,200,
+ httpd_util:flatlength(Response)),
+ {proceed,Info#mod.data};
+ undefined ->
+ transfer_log(Info,"-",AuthUser,Date,200,0),
+ {proceed,Info#mod.data}
+ end
+ end.
+
+custom_date() ->
+ LocalTime=calendar:local_time(),
+ UniversalTime=calendar:universal_time(),
+ Minutes=round(diff_in_minutes(LocalTime,UniversalTime)),
+ {{YYYY,MM,DD},{Hour,Min,Sec}}=LocalTime,
+ Date =
+ io_lib:format("~.2.0w/~.3s/~.4w:~.2.0w:~.2.0w:~.2.0w ~c~.2.0w~.2.0w",
+ [DD, httpd_util:month(MM), YYYY, Hour, Min, Sec,
+ sign(Minutes),
+ abs(Minutes) div 60, abs(Minutes) rem 60]),
+ lists:flatten(Date).
+
+diff_in_minutes(L,U) ->
+ (calendar:datetime_to_gregorian_seconds(L) -
+ calendar:datetime_to_gregorian_seconds(U))/60.
+
+sign(Minutes) when Minutes > 0 ->
+ $+;
+sign(Minutes) ->
+ $-.
+
+auth_user(Data) ->
+ case httpd_util:key1search(Data,remote_user) of
+ undefined ->
+ "-";
+ RemoteUser ->
+ RemoteUser
+ end.
+
+%% log_internal_info
+
+log_internal_info(Info,Date,[]) ->
+ ok;
+log_internal_info(Info,Date,[{internal_info,Reason}|Rest]) ->
+ error_log(Info,Date,Reason),
+ log_internal_info(Info,Date,Rest);
+log_internal_info(Info,Date,[_|Rest]) ->
+ log_internal_info(Info,Date,Rest).
+
+%% transfer_log
+
+transfer_log(Info,RFC931,AuthUser,Date,StatusCode,Bytes) ->
+ case httpd_util:lookup(Info#mod.config_db,transfer_log) of
+ undefined ->
+ no_transfer_log;
+ TransferLog ->
+ {PortNumber,RemoteHost}=(Info#mod.init_data)#init_data.peername,
+ case (catch io:format(TransferLog, "~s ~s ~s [~s] \"~s\" ~w ~w~n",
+ [RemoteHost, RFC931, AuthUser,
+ Date, Info#mod.request_line,
+ StatusCode, Bytes])) of
+ ok ->
+ ok;
+ Error ->
+ error_logger:error_report(Error)
+ end
+ end.
+
+%% security log
+
+security_log(Info, Reason) ->
+ case httpd_util:lookup(Info#mod.config_db, security_log) of
+ undefined ->
+ no_security_log;
+ SecurityLog ->
+ io:format(SecurityLog,"[~s] ~s~n", [custom_date(), Reason])
+ end.
+
+%% error_log
+
+error_log(Info,Date,Reason) ->
+ case httpd_util:lookup(Info#mod.config_db, error_log) of
+ undefined ->
+ no_error_log;
+ ErrorLog ->
+ {PortNumber,RemoteHost}=(Info#mod.init_data)#init_data.peername,
+ io:format(ErrorLog,"[~s] access to ~s failed for ~s, reason: ~p~n",
+ [Date,Info#mod.request_uri,RemoteHost,Reason])
+ end.
+
+error_log(SocketType,Socket,ConfigDB,{PortNumber,RemoteHost},Reason) ->
+ case httpd_util:lookup(ConfigDB,error_log) of
+ undefined ->
+ no_error_log;
+ ErrorLog ->
+ Date=custom_date(),
+ io:format(ErrorLog,"[~s] server crash for ~s, reason: ~p~n",
+ [Date,RemoteHost,Reason]),
+ ok
+ end.
+
+report_error(ConfigDB,Error) ->
+ case httpd_util:lookup(ConfigDB,error_log) of
+ undefined ->
+ no_error_log;
+ ErrorLog ->
+ Date=custom_date(),
+ io:format(ErrorLog,"[~s] reporting error: ~s~n",[Date,Error]),
+ ok
+ end.
+
+%%
+%% Configuration
+%%
+
+%% load
+
+load([$T,$r,$a,$n,$s,$f,$e,$r,$L,$o,$g,$ |TransferLog],[]) ->
+ {ok,[],{transfer_log,httpd_conf:clean(TransferLog)}};
+load([$E,$r,$r,$o,$r,$L,$o,$g,$ |ErrorLog],[]) ->
+ {ok,[],{error_log,httpd_conf:clean(ErrorLog)}};
+load([$S,$e,$c,$u,$r,$i,$t,$y,$L,$o,$g,$ |SecurityLog], []) ->
+ {ok, [], {security_log, httpd_conf:clean(SecurityLog)}}.
+
+%% store
+
+store({transfer_log,TransferLog},ConfigList) ->
+ case create_log(TransferLog,ConfigList) of
+ {ok,TransferLogStream} ->
+ {ok,{transfer_log,TransferLogStream}};
+ {error,Reason} ->
+ {error,Reason}
+ end;
+store({error_log,ErrorLog},ConfigList) ->
+ case create_log(ErrorLog,ConfigList) of
+ {ok,ErrorLogStream} ->
+ {ok,{error_log,ErrorLogStream}};
+ {error,Reason} ->
+ {error,Reason}
+ end;
+store({security_log, SecurityLog},ConfigList) ->
+ case create_log(SecurityLog, ConfigList) of
+ {ok, SecurityLogStream} ->
+ {ok, {security_log, SecurityLogStream}};
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+create_log(LogFile,ConfigList) ->
+ Filename = httpd_conf:clean(LogFile),
+ case filename:pathtype(Filename) of
+ absolute ->
+ case file:open(Filename, [read,write]) of
+ {ok,LogStream} ->
+ file:position(LogStream,{eof,0}),
+ {ok,LogStream};
+ {error,_} ->
+ {error,?NICE("Can't create "++Filename)}
+ end;
+ volumerelative ->
+ case file:open(Filename, [read,write]) of
+ {ok,LogStream} ->
+ file:position(LogStream,{eof,0}),
+ {ok,LogStream};
+ {error,_} ->
+ {error,?NICE("Can't create "++Filename)}
+ end;
+ relative ->
+ case httpd_util:key1search(ConfigList,server_root) of
+ undefined ->
+ {error,
+ ?NICE(Filename++
+ " is an invalid logfile name beacuse ServerRoot is not defined")};
+ ServerRoot ->
+ AbsoluteFilename=filename:join(ServerRoot,Filename),
+ case file:open(AbsoluteFilename, [read,write]) of
+ {ok,LogStream} ->
+ file:position(LogStream,{eof,0}),
+ {ok,LogStream};
+ {error,Reason} ->
+ {error,?NICE("Can't create "++AbsoluteFilename)}
+ end
+ end
+ end.
+
+%% remove
+
+remove(ConfigDB) ->
+ lists:foreach(fun([Stream]) -> file:close(Stream) end,
+ ets:match(ConfigDB,{transfer_log,'$1'})),
+ lists:foreach(fun([Stream]) -> file:close(Stream) end,
+ ets:match(ConfigDB,{error_log,'$1'})),
+ lists:foreach(fun([Stream]) -> file:close(Stream) end,
+ ets:match(ConfigDB,{security_log,'$1'})),
+ ok.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_range.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_range.erl
new file mode 100644
index 0000000000..f623dc3ec8
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_range.erl
@@ -0,0 +1,380 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mod_range.erl,v 1.1 2008/12/17 09:53:35 mikpe Exp $
+%%
+-module(mod_range).
+-export([do/1]).
+-include("httpd.hrl").
+
+%% do
+
+
+
+do(Info) ->
+ ?DEBUG("do -> entry",[]),
+ case Info#mod.method of
+ "GET" ->
+ case httpd_util:key1search(Info#mod.data,status) of
+ %% A status code has been generated!
+ {StatusCode,PhraseArgs,Reason} ->
+ {proceed,Info#mod.data};
+ %% No status code has been generated!
+ undefined ->
+ case httpd_util:key1search(Info#mod.data,response) of
+ %% No response has been generated!
+ undefined ->
+ case httpd_util:key1search(Info#mod.parsed_header,"range") of
+ undefined ->
+ %Not a range response
+ {proceed,Info#mod.data};
+ Range ->
+ %%Control that there weren't a if-range field that stopped
+ %%The range request in favor for the whole file
+ case httpd_util:key1search(Info#mod.data,if_range) of
+ send_file ->
+ {proceed,Info#mod.data};
+ _undefined ->
+ do_get_range(Info,Range)
+ end
+ end;
+ %% A response has been generated or sent!
+ Response ->
+ {proceed,Info#mod.data}
+ end
+ end;
+ %% Not a GET method!
+ _ ->
+ {proceed,Info#mod.data}
+ end.
+
+do_get_range(Info,Ranges) ->
+ ?DEBUG("do_get_range -> Request URI: ~p",[Info#mod.request_uri]),
+ Path = mod_alias:path(Info#mod.data, Info#mod.config_db,
+ Info#mod.request_uri),
+ {FileInfo, LastModified} =get_modification_date(Path),
+ send_range_response(Path,Info,Ranges,FileInfo,LastModified).
+
+
+send_range_response(Path,Info,Ranges,FileInfo,LastModified)->
+ case parse_ranges(Ranges) of
+ error->
+ ?ERROR("send_range_response-> Unparsable range request",[]),
+ {proceed,Info#mod.data};
+ {multipart,RangeList}->
+ send_multi_range_response(Path,Info,RangeList);
+ {Start,Stop}->
+ send_range_response(Path,Info,Start,Stop,FileInfo,LastModified)
+ end.
+%%More than one range specified
+%%Send a multipart reponse to the user
+%
+%%An example of an multipart range response
+
+% HTTP/1.1 206 Partial Content
+% Date:Wed 15 Nov 1995 04:08:23 GMT
+% Last-modified:Wed 14 Nov 1995 04:08:23 GMT
+% Content-type: multipart/byteranges; boundary="SeparatorString"
+%
+% --"SeparatorString"
+% Content-Type: application/pdf
+% Content-Range: bytes 500-600/1010
+% .... The data..... 101 bytes
+%
+% --"SeparatorString"
+% Content-Type: application/pdf
+% Content-Range: bytes 700-1009/1010
+% .... The data.....
+
+
+
+send_multi_range_response(Path,Info,RangeList)->
+ case file:open(Path, [raw,binary]) of
+ {ok, FileDescriptor} ->
+ file:close(FileDescriptor),
+ ?DEBUG("send_multi_range_response -> FileDescriptor: ~p",[FileDescriptor]),
+ Suffix = httpd_util:suffix(Path),
+ PartMimeType = httpd_util:lookup_mime_default(Info#mod.config_db,Suffix,"text/plain"),
+ Date = httpd_util:rfc1123_date(),
+ {FileInfo,LastModified}=get_modification_date(Path),
+ case valid_ranges(RangeList,Path,FileInfo) of
+ {ValidRanges,true}->
+ ?DEBUG("send_multi_range_response -> Ranges are valid:",[]),
+ %Apache breaks the standard by sending the size field in the Header.
+ Header = [{code,206},
+ {content_type,"multipart/byteranges;boundary=RangeBoundarySeparator"},
+ {etag,httpd_util:create_etag(FileInfo)},
+ {last_modified,LastModified}
+ ],
+ ?DEBUG("send_multi_range_response -> Valid Ranges: ~p",[RagneList]),
+ Body={fun send_multiranges/4,[ValidRanges,Info,PartMimeType,Path]},
+ {proceed,[{response,{response,Header,Body}}|Info#mod.data]};
+ _ ->
+ {proceed, [{status, {416,"Range not valid",bad_range_boundaries }}]}
+ end;
+ {error, Reason} ->
+ ?ERROR("do_get -> failed open file: ~p",[Reason]),
+ {proceed,Info#mod.data}
+ end.
+
+send_multiranges(ValidRanges,Info,PartMimeType,Path)->
+ ?DEBUG("send_multiranges -> Start sending the ranges",[]),
+ case file:open(Path, [raw,binary]) of
+ {ok,FileDescriptor} ->
+ lists:foreach(fun(Range)->
+ send_multipart_start(Range,Info,PartMimeType,FileDescriptor)
+ end,ValidRanges),
+ file:close(FileDescriptor),
+ %%Sends an end of the multipart
+ httpd_socket:deliver(Info#mod.socket_type,Info#mod.socket,"\r\n--RangeBoundarySeparator--"),
+ sent;
+ _ ->
+ close
+ end.
+
+send_multipart_start({{Start,End},{StartByte,EndByte,Size}},Info,PartMimeType,FileDescriptor)when StartByte<Size->
+ PartHeader=["\r\n--RangeBoundarySeparator\r\n","Content-type: ",PartMimeType,"\r\n",
+ "Content-Range:bytes=",integer_to_list(StartByte),"-",integer_to_list(EndByte),"/",
+ integer_to_list(Size),"\r\n\r\n"],
+ send_part_start(Info#mod.socket_type,Info#mod.socket,PartHeader,FileDescriptor,Start,End);
+
+
+send_multipart_start({{Start,End},{StartByte,EndByte,Size}},Info,PartMimeType,FileDescriptor)->
+ PartHeader=["\r\n--RangeBoundarySeparator\r\n","Content-type: ",PartMimeType,"\r\n",
+ "Content-Range:bytes=",integer_to_list(Size-(StartByte-Size)),"-",integer_to_list(EndByte),"/",
+ integer_to_list(Size),"\r\n\r\n"],
+ send_part_start(Info#mod.socket_type,Info#mod.socket,PartHeader,FileDescriptor,Start,End).
+
+send_part_start(SocketType,Socket,PartHeader,FileDescriptor,Start,End)->
+ case httpd_socket:deliver(SocketType,Socket,PartHeader) of
+ ok ->
+ send_part_start(SocketType,Socket,FileDescriptor,Start,End);
+ _ ->
+ close
+ end.
+
+send_range_response(Path,Info,Start,Stop,FileInfo,LastModified)->
+ case file:open(Path, [raw,binary]) of
+ {ok, FileDescriptor} ->
+ file:close(FileDescriptor),
+ ?DEBUG("send_range_response -> FileDescriptor: ~p",[FileDescriptor]),
+ Suffix = httpd_util:suffix(Path),
+ MimeType = httpd_util:lookup_mime_default(Info#mod.config_db,Suffix,"text/plain"),
+ Date = httpd_util:rfc1123_date(),
+ Size = get_range_size(Start,Stop,FileInfo),
+ case valid_range(Start,Stop,FileInfo) of
+ {true,StartByte,EndByte,TotByte}->
+ Head=[{code,206},{content_type, MimeType},
+ {last_modified, LastModified},
+ {etag,httpd_util:create_etag(FileInfo)},
+ {content_range,["bytes=",integer_to_list(StartByte),"-",
+ integer_to_list(EndByte),"/",integer_to_list(TotByte)]},
+ {content_length,Size}],
+ BodyFunc=fun send_range_body/5,
+ Arg=[Info#mod.socket_type, Info#mod.socket,Path,Start,Stop],
+ {proceed,[{response,{response,Head,{BodyFunc,Arg}}}|Info#mod.data]};
+ {false,Reason} ->
+ {proceed, [{status, {416,Reason,bad_range_boundaries }}]}
+ end;
+ {error, Reason} ->
+ ?ERROR("send_range_response -> failed open file: ~p",[Reason]),
+ {proceed,Info#mod.data}
+ end.
+
+
+send_range_body(SocketType,Socket,Path,Start,End) ->
+ ?DEBUG("mod_range -> send_range_body",[]),
+ case file:open(Path, [raw,binary]) of
+ {ok,FileDescriptor} ->
+ send_part_start(SocketType,Socket,FileDescriptor,Start,End),
+ file:close(FileDescriptor);
+ _ ->
+ close
+ end.
+
+send_part_start(SocketType,Socket,FileDescriptor,Start,End) ->
+ case Start of
+ from_end ->
+ file:position(FileDescriptor,{eof,End}),
+ send_body(SocketType,Socket,FileDescriptor);
+ from_start ->
+ file:position(FileDescriptor,{bof,End}),
+ send_body(SocketType,Socket,FileDescriptor);
+ Byte when integer(Byte) ->
+ file:position(FileDescriptor,{bof,Start}),
+ send_part(SocketType,Socket,FileDescriptor,End)
+ end,
+ sent.
+
+
+%%This function could replace send_body by calling it with Start=0 end =FileSize
+%% But i gues it would be stupid when we look at performance
+send_part(SocketType,Socket,FileDescriptor,End)->
+ case file:position(FileDescriptor,{cur,0}) of
+ {ok,NewPos} ->
+ if
+ NewPos > End ->
+ ok;
+ true ->
+ Size=get_file_chunk_size(NewPos,End,?FILE_CHUNK_SIZE),
+ case file:read(FileDescriptor,Size) of
+ eof ->
+ ok;
+ {error,Reason} ->
+ ok;
+ {ok,Binary} ->
+ case httpd_socket:deliver(SocketType,Socket,Binary) of
+ socket_closed ->
+ ?LOG("send_range of body -> socket closed while sending",[]),
+ socket_close;
+ _ ->
+ send_part(SocketType,Socket,FileDescriptor,End)
+ end
+ end
+ end;
+ _->
+ ok
+ end.
+
+%% validate that the range is in the limits of the file
+valid_ranges(RangeList,Path,FileInfo)->
+ lists:mapfoldl(fun({Start,End},Acc)->
+ case Acc of
+ true ->
+ case valid_range(Start,End,FileInfo) of
+ {true,StartB,EndB,Size}->
+ {{{Start,End},{StartB,EndB,Size}},true};
+ _ ->
+ false
+ end;
+ _ ->
+ {false,false}
+ end
+ end,true,RangeList).
+
+
+
+valid_range(from_end,End,FileInfo)->
+ Size=FileInfo#file_info.size,
+ if
+ End < Size ->
+ {true,(Size+End),Size-1,Size};
+ true ->
+ false
+ end;
+valid_range(from_start,End,FileInfo)->
+ Size=FileInfo#file_info.size,
+ if
+ End < Size ->
+ {true,End,Size-1,Size};
+ true ->
+ false
+ end;
+
+valid_range(Start,End,FileInfo)when Start=<End->
+ case FileInfo#file_info.size of
+ FileSize when Start< FileSize ->
+ case FileInfo#file_info.size of
+ Size when End<Size ->
+ {true,Start,End,FileInfo#file_info.size};
+ Size ->
+ {true,Start,Size-1,Size}
+ end;
+ _->
+ {false,"The size of the range is negative"}
+ end;
+
+valid_range(Start,End,FileInfo)->
+ {false,"Range starts out of file boundaries"}.
+%% Find the modification date of the file
+get_modification_date(Path)->
+ case file:read_file_info(Path) of
+ {ok, FileInfo0} ->
+ {FileInfo0, httpd_util:rfc1123_date(FileInfo0#file_info.mtime)};
+ _ ->
+ {#file_info{},""}
+ end.
+
+%Calculate the size of the chunk to read
+
+get_file_chunk_size(Position,End,DefaultChunkSize)when (Position+DefaultChunkSize) =< End->
+ DefaultChunkSize;
+get_file_chunk_size(Position,End,DefaultChunkSize)->
+ (End-Position) +1.
+
+
+
+%Get the size of the range to send. Remember that
+%A range is from startbyte up to endbyte which means that
+%the nuber of byte in a range is (StartByte-EndByte)+1
+
+get_range_size(from_end,Stop,FileInfo)->
+ integer_to_list(-1*Stop);
+
+get_range_size(from_start,StartByte,FileInfo) ->
+ integer_to_list((((FileInfo#file_info.size)-StartByte)));
+
+get_range_size(StartByte,EndByte,FileInfo) ->
+ integer_to_list((EndByte-StartByte)+1).
+
+parse_ranges([$\ ,$b,$y,$t,$e,$s,$\=|Ranges])->
+ parse_ranges([$b,$y,$t,$e,$s,$\=|Ranges]);
+parse_ranges([$b,$y,$t,$e,$s,$\=|Ranges])->
+ case string:tokens(Ranges,", ") of
+ [Range] ->
+ parse_range(Range);
+ [Range1|SplittedRanges]->
+ {multipart,lists:map(fun parse_range/1,[Range1|SplittedRanges])}
+ end;
+%Bad unit
+parse_ranges(Ranges)->
+ io:format("Bad Ranges : ~p",[Ranges]),
+ error.
+%Parse the range specification from the request to {Start,End}
+%Start=End : Numreric string | []
+
+parse_range(Range)->
+ format_range(split_range(Range,[],[])).
+format_range({[],BytesFromEnd})->
+ {from_end,-1*(list_to_integer(BytesFromEnd))};
+format_range({StartByte,[]})->
+ {from_start,list_to_integer(StartByte)};
+format_range({StartByte,EndByte})->
+ {list_to_integer(StartByte),list_to_integer(EndByte)}.
+%Last case return the splitted range
+split_range([],Current,Other)->
+ {lists:reverse(Other),lists:reverse(Current)};
+
+split_range([$-|Rest],Current,Other)->
+ split_range(Rest,Other,Current);
+
+split_range([N|Rest],Current,End) ->
+ split_range(Rest,[N|Current],End).
+
+send_body(SocketType,Socket,FileDescriptor) ->
+ case file:read(FileDescriptor,?FILE_CHUNK_SIZE) of
+ {ok,Binary} ->
+ ?DEBUG("send_body -> send another chunk: ~p",[size(Binary)]),
+ case httpd_socket:deliver(SocketType,Socket,Binary) of
+ socket_closed ->
+ ?LOG("send_body -> socket closed while sending",[]),
+ socket_close;
+ _ ->
+ send_body(SocketType,Socket,FileDescriptor)
+ end;
+ eof ->
+ ?DEBUG("send_body -> done with this file",[]),
+ eof
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_responsecontrol.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_responsecontrol.erl
new file mode 100644
index 0000000000..b818a15f32
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_responsecontrol.erl
@@ -0,0 +1,320 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mod_responsecontrol.erl,v 1.1 2008/12/17 09:53:35 mikpe Exp $
+%%
+
+-module(mod_responsecontrol).
+-export([do/1]).
+
+-include("httpd.hrl").
+
+
+do(Info) ->
+ ?DEBUG("do -> response_control",[]),
+ case httpd_util:key1search(Info#mod.data,status) of
+ %% A status code has been generated!
+ {StatusCode,PhraseArgs,Reason} ->
+ {proceed,Info#mod.data};
+ %% No status code has been generated!
+ undefined ->
+ case httpd_util:key1search(Info#mod.data,response) of
+ %% No response has been generated!
+ undefined ->
+ case do_responsecontrol(Info) of
+ continue ->
+ {proceed,Info#mod.data};
+ Response ->
+ {proceed,[Response|Info#mod.data]}
+ end;
+ %% A response has been generated or sent!
+ Response ->
+ {proceed,Info#mod.data}
+ end
+ end.
+
+
+%%----------------------------------------------------------------------
+%%Control that the request header did not contians any limitations
+%%wheather a response shall be createed or not
+%%----------------------------------------------------------------------
+
+do_responsecontrol(Info) ->
+ ?DEBUG("do_response_control -> Request URI: ~p",[Info#mod.request_uri]),
+ Path = mod_alias:path(Info#mod.data, Info#mod.config_db,
+ Info#mod.request_uri),
+ case file:read_file_info(Path) of
+ {ok, FileInfo} ->
+ control(Path,Info,FileInfo);
+ _ ->
+ %% The requested asset is not a plain file and then it must
+ %% be generated everytime its requested
+ continue
+ end.
+
+%%----------------------------------------------------------------------
+%%Control the If-Match, If-None-Match, and If-Modified-Since
+%%----------------------------------------------------------------------
+
+
+%% If a client sends more then one of the if-XXXX fields in a request
+%% The standard says it does not specify the behaviuor so I specified it :-)
+%% The priority between the fields is
+%% 1.If-modified
+%% 2.If-Unmodified
+%% 3.If-Match
+%% 4.If-Nomatch
+
+%% This means if more than one of the fields are in the request the
+%% field with highest priority will be used
+
+%%If the request is a range request the If-Range field will be the winner.
+
+control(Path,Info,FileInfo)->
+ case control_range(Path,Info,FileInfo) of
+ undefined ->
+ case control_Etag(Path,Info,FileInfo) of
+ undefined ->
+ case control_modification(Path,Info,FileInfo) of
+ continue ->
+ continue;
+ ReturnValue ->
+ send_return_value(ReturnValue,FileInfo)
+ end;
+ continue ->
+ continue;
+ ReturnValue ->
+ send_return_value(ReturnValue,FileInfo)
+ end;
+ Response->
+ Response
+ end.
+
+%%----------------------------------------------------------------------
+%%If there are both a range and an if-range field control if
+%%----------------------------------------------------------------------
+control_range(Path,Info,FileInfo) ->
+ case httpd_util:key1search(Info#mod.parsed_header,"range") of
+ undefined->
+ undefined;
+ _Range ->
+ case httpd_util:key1search(Info#mod.parsed_header,"if-range") of
+ undefined ->
+ undefined;
+ EtagOrDate ->
+ control_if_range(Path,Info,FileInfo,EtagOrDate)
+ end
+ end.
+
+control_if_range(Path,Info,FileInfo,EtagOrDate) ->
+ case httpd_util:convert_request_date(strip_date(EtagOrDate)) of
+ bad_date ->
+ FileEtag=httpd_util:create_etag(FileInfo),
+ case FileEtag of
+ EtagOrDate ->
+ continue;
+ _ ->
+ {if_range,send_file}
+ end;
+ ErlDate ->
+ %%We got the date in the request if it is
+ case control_modification_data(Info,FileInfo#file_info.mtime,"if-range") of
+ modified ->
+ {if_range,send_file};
+ _UnmodifiedOrUndefined->
+ continue
+ end
+ end.
+
+%%----------------------------------------------------------------------
+%%Controls the values of the If-Match and I-None-Mtch
+%%----------------------------------------------------------------------
+control_Etag(Path,Info,FileInfo)->
+ FileEtag=httpd_util:create_etag(FileInfo),
+ %%Control if the E-Tag for the resource matches one of the Etags in
+ %%the -if-match header field
+ case control_match(Info,FileInfo,"if-match",FileEtag) of
+ nomatch ->
+ %%None of the Etags in the if-match field matched the current
+ %%Etag for the resource return a 304
+ {412,Info,Path};
+ match ->
+ continue;
+ undefined ->
+ case control_match(Info,FileInfo,"if-none-match",FileEtag) of
+ nomatch ->
+ continue;
+ match ->
+ case Info#mod.method of
+ "GET" ->
+ {304,Info,Path};
+ "HEAD" ->
+ {304,Info,Path};
+ _OtherrequestMethod ->
+ {412,Info,Path}
+ end;
+ undefined ->
+ undefined
+ end
+ end.
+
+%%----------------------------------------------------------------------
+%%Control if there are any Etags for HeaderField in the request if so
+%%Control if they match the Etag for the requested file
+%%----------------------------------------------------------------------
+control_match(Info,FileInfo,HeaderField,FileEtag)->
+ case split_etags(httpd_util:key1search(Info#mod.parsed_header,HeaderField)) of
+ undefined->
+ undefined;
+ Etags->
+ %%Control that the match any star not is availible
+ case lists:member("*",Etags) of
+ true->
+ match;
+ false->
+ compare_etags(FileEtag,Etags)
+ end
+ end.
+
+%%----------------------------------------------------------------------
+%%Split the etags from the request
+%%----------------------------------------------------------------------
+split_etags(undefined)->
+ undefined;
+split_etags(Tags) ->
+ string:tokens(Tags,", ").
+
+%%----------------------------------------------------------------------
+%%Control if the etag for the file is in the list
+%%----------------------------------------------------------------------
+compare_etags(Tag,Etags) ->
+ case lists:member(Tag,Etags) of
+ true ->
+ match;
+ _ ->
+ nomatch
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% %%
+%%Control if the file is modificated %%
+%% %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%----------------------------------------------------------------------
+%%Control the If-Modified-Since and If-Not-Modified-Since header fields
+%%----------------------------------------------------------------------
+control_modification(Path,Info,FileInfo)->
+ ?DEBUG("control_modification() -> entry",[]),
+ case control_modification_data(Info,FileInfo#file_info.mtime,"if-modified-since") of
+ modified->
+ continue;
+ unmodified->
+ {304,Info,Path};
+ undefined ->
+ case control_modification_data(Info,FileInfo#file_info.mtime,"if-unmodified-since") of
+ modified ->
+ {412,Info,Path};
+ _ContinueUndefined ->
+ continue
+ end
+ end.
+
+%%----------------------------------------------------------------------
+%%Controls the date from the http-request if-modified-since and
+%%if-not-modified-since against the modification data of the
+%%File
+%%----------------------------------------------------------------------
+%%Info is the record about the request
+%%ModificationTime is the time the file was edited last
+%%Header Field is the name of the field to control
+
+control_modification_data(Info,ModificationTime,HeaderField)->
+ case strip_date(httpd_util:key1search(Info#mod.parsed_header,HeaderField)) of
+ undefined->
+ undefined;
+ LastModified0 ->
+ LastModified=httpd_util:convert_request_date(LastModified0),
+ ?DEBUG("control_modification_data() -> "
+ "~n Request-Field: ~s"
+ "~n FileLastModified: ~p"
+ "~n FieldValue: ~p",
+ [HeaderField,ModificationTime,LastModified]),
+ case LastModified of
+ bad_date ->
+ undefined;
+ _ ->
+ FileTime=calendar:datetime_to_gregorian_seconds(ModificationTime),
+ FieldTime=calendar:datetime_to_gregorian_seconds(LastModified),
+ if
+ FileTime=<FieldTime ->
+ ?DEBUG("File unmodified~n", []),
+ unmodified;
+ FileTime>=FieldTime ->
+ ?DEBUG("File modified~n", []),
+ modified
+ end
+ end
+ end.
+
+%%----------------------------------------------------------------------
+%%Compare to dates on the form {{YYYY,MM,DD},{HH,MIN,SS}}
+%%If the first date is the biggest returns biggest1 (read biggestFirst)
+%%If the first date is smaller
+% compare_date(Date,bad_date)->
+% bad_date;
+
+% compare_date({D1,T1},{D2,T2})->
+% case compare_date1(D1,D2) of
+% equal ->
+% compare_date1(T1,T2);
+% GTorLT->
+% GTorLT
+% end.
+
+% compare_date1({T1,T2,T3},{T12,T22,T32}) when T1>T12 ->
+% bigger1;
+% compare_date1({T1,T2,T3},{T1,T22,T32}) when T2>T22 ->
+% bigger1;
+% compare_date1({T1,T2,T3},{T1,T2,T32}) when T3>T32 ->
+% bigger1;
+% compare_date1({T1,T2,T3},{T1,T2,T3})->
+% equal;
+% compare_date1(_D1,_D2)->
+% smaller1.
+
+
+%% IE4 & NS4 sends an extra '; length=xxxx' string at the end of the If-Modified-Since
+%% header, we detect this and ignore it (the RFCs does not mention this).
+strip_date(undefined) ->
+ undefined;
+strip_date([]) ->
+ [];
+strip_date([$;,$ |Rest]) ->
+ [];
+strip_date([C|Rest]) ->
+ [C|strip_date(Rest)].
+
+send_return_value({412,_,_},FileInfo)->
+ {status,{412,none,"Precondition Failed"}};
+
+send_return_value({304,Info,Path},FileInfo)->
+ Suffix=httpd_util:suffix(Path),
+ MimeType = httpd_util:lookup_mime_default(Info#mod.config_db,Suffix,"text/plain"),
+ Header = [{code,304},
+ {etag,httpd_util:create_etag(FileInfo)},
+ {content_length,0},
+ {last_modified,httpd_util:rfc1123_date(FileInfo#file_info.mtime)}],
+ {response,{response,Header,nobody}}.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_security.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_security.erl
new file mode 100644
index 0000000000..b4d52d1599
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_security.erl
@@ -0,0 +1,307 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mod_security.erl,v 1.1 2008/12/17 09:53:35 mikpe Exp $
+%%
+-module(mod_security).
+
+%% Security Audit Functionality
+
+%% User API exports
+-export([list_blocked_users/1, list_blocked_users/2, list_blocked_users/3,
+ block_user/4, block_user/5,
+ unblock_user/2, unblock_user/3, unblock_user/4,
+ list_auth_users/1, list_auth_users/2, list_auth_users/3]).
+
+%% module API exports
+-export([do/1, load/2, store/2, remove/1]).
+
+-include("httpd.hrl").
+
+-define(VMODULE,"SEC").
+-include("httpd_verbosity.hrl").
+
+
+%% do/1
+do(Info) ->
+ ?vdebug("~n do with ~n Info: ~p",[Info]),
+ %% Check and see if any user has been authorized.
+ case httpd_util:key1search(Info#mod.data,remote_user,not_defined_user) of
+ not_defined_user ->
+ %% No user has been authorized.
+ case httpd_util:key1search(Info#mod.data, status) of
+ %% A status code has been generated!
+ {401, PhraseArgs, Reason} ->
+ case httpd_util:key1search(Info#mod.parsed_header,
+ "authorization") of
+ undefined ->
+ %% Not an authorization attempt (server just replied to
+ %% challenge for authentication)
+ {proceed, Info#mod.data};
+ [$B,$a,$s,$i,$c,$ |EncodedString] ->
+ %% Someone tried to authenticate, and obviously failed!
+ ?vlog("~n Authentication failed: ~s",
+ [EncodedString]),
+ report_failed(Info, EncodedString,"Failed authentication"),
+ take_failed_action(Info, EncodedString),
+ {proceed, Info#mod.data}
+ end;
+ _ ->
+ {proceed, Info#mod.data}
+ end;
+ User ->
+ %% A user has been authenticated, now is he blocked ?
+ ?vtrace("user '~p' authentication",[User]),
+ Path = mod_alias:path(Info#mod.data,
+ Info#mod.config_db,
+ Info#mod.request_uri),
+ {Dir, SDirData} = secretp(Path, Info#mod.config_db),
+ Addr = httpd_util:lookup(Info#mod.config_db, bind_address),
+ Port = httpd_util:lookup(Info#mod.config_db, port),
+ DF = httpd_util:key1search(SDirData, data_file),
+ case mod_security_server:check_blocked_user(Info, User,
+ SDirData,
+ Addr, Port) of
+ true ->
+ ?vtrace("user blocked",[]),
+ report_failed(Info,httpd_util:decode_base64(User) ,"User Blocked"),
+ {proceed, [{status, {403, Info#mod.request_uri, ""}}|Info#mod.data]};
+ false ->
+ ?vtrace("user not blocked",[]),
+ EncodedUser=httpd_util:decode_base64(User),
+ report_failed(Info, EncodedUser,"Authentication Succedded"),
+ mod_security_server:store_successful_auth(Addr, Port,
+ User, SDirData),
+ {proceed, Info#mod.data}
+ end
+ end.
+
+
+
+report_failed(Info, EncodedString,Event) ->
+ Request = Info#mod.request_line,
+ Decoded = httpd_util:decode_base64(EncodedString),
+ {PortNumber,RemoteHost}=(Info#mod.init_data)#init_data.peername,
+ String = RemoteHost++" : " ++ Event ++ " : "++Request++" : "++Decoded,
+ mod_disk_log:security_log(Info,String),
+ mod_log:security_log(Info, String).
+
+take_failed_action(Info, EncodedString) ->
+ Path = mod_alias:path(Info#mod.data,Info#mod.config_db, Info#mod.request_uri),
+ {Dir, SDirData} = secretp(Path, Info#mod.config_db),
+ Addr = httpd_util:lookup(Info#mod.config_db, bind_address),
+ Port = httpd_util:lookup(Info#mod.config_db, port),
+ DecodedString = httpd_util:decode_base64(EncodedString),
+ mod_security_server:store_failed_auth(Info, Addr, Port,
+ DecodedString, SDirData).
+
+secretp(Path, ConfigDB) ->
+ Directories = ets:match(ConfigDB,{directory,'$1','_'}),
+ case secret_path(Path, Directories) of
+ {yes, Directory} ->
+ SDirs0 = httpd_util:multi_lookup(ConfigDB, security_directory),
+ SDir = lists:filter(fun(X) ->
+ lists:member({path, Directory}, X)
+ end, SDirs0),
+ {Directory, lists:flatten(SDir)};
+ no ->
+ error_report({internal_error_secretp, ?MODULE}),
+ {[], []}
+ end.
+
+secret_path(Path,Directories) ->
+ secret_path(Path, httpd_util:uniq(lists:sort(Directories)), to_be_found).
+
+secret_path(Path, [], to_be_found) ->
+ no;
+secret_path(Path, [], Directory) ->
+ {yes, Directory};
+secret_path(Path, [[NewDirectory]|Rest], Directory) ->
+ case regexp:match(Path, NewDirectory) of
+ {match, _, _} when Directory == to_be_found ->
+ secret_path(Path, Rest, NewDirectory);
+ {match, _, Length} when Length > length(Directory)->
+ secret_path(Path, Rest, NewDirectory);
+ {match, _, Length} ->
+ secret_path(Path, Rest, Directory);
+ nomatch ->
+ secret_path(Path, Rest, Directory)
+ end.
+
+
+load([$<,$D,$i,$r,$e,$c,$t,$o,$r,$y,$ |Directory],[]) ->
+ Dir = httpd_conf:custom_clean(Directory,"",">"),
+ {ok, [{security_directory, Dir, [{path, Dir}]}]};
+load(eof,[{security_directory,Directory, DirData}|_]) ->
+ {error, ?NICE("Premature end-of-file in "++Directory)};
+load([$S,$e,$c,$u,$r,$i,$t,$y,$D,$a,$t,$a,$F,$i,$l,$e,$ |FileName],
+ [{security_directory, Dir, DirData}]) ->
+ File = httpd_conf:clean(FileName),
+ {ok, [{security_directory, Dir, [{data_file, File}|DirData]}]};
+load([$S,$e,$c,$u,$r,$i,$t,$y,$C,$a,$l,$l,$b,$a,$c,$k,$M,$o,$d,$u,$l,$e,$ |ModuleName],
+ [{security_directory, Dir, DirData}]) ->
+ Mod = list_to_atom(httpd_conf:clean(ModuleName)),
+ {ok, [{security_directory, Dir, [{callback_module, Mod}|DirData]}]};
+load([$S,$e,$c,$u,$r,$i,$t,$y,$M,$a,$x,$R,$e,$t,$r,$i,$e,$s,$ |Retries],
+ [{security_directory, Dir, DirData}]) ->
+ MaxRetries = httpd_conf:clean(Retries),
+ load_return_int_tag("SecurityMaxRetries", max_retries,
+ httpd_conf:clean(Retries), Dir, DirData);
+load([$S,$e,$c,$u,$r,$i,$t,$y,$B,$l,$o,$c,$k,$T,$i,$m,$e,$ |Time],
+ [{security_directory, Dir, DirData}]) ->
+ load_return_int_tag("SecurityBlockTime", block_time,
+ httpd_conf:clean(Time), Dir, DirData);
+load([$S,$e,$c,$u,$r,$i,$t,$y,$F,$a,$i,$l,$E,$x,$p,$i,$r,$e,$T,$i,$m,$e,$ |Time],
+ [{security_directory, Dir, DirData}]) ->
+ load_return_int_tag("SecurityFailExpireTime", fail_expire_time,
+ httpd_conf:clean(Time), Dir, DirData);
+load([$S,$e,$c,$u,$r,$i,$t,$y,$A,$u,$t,$h,$T,$i,$m,$e,$o,$u,$t,$ |Time0],
+ [{security_directory, Dir, DirData}]) ->
+ Time = httpd_conf:clean(Time0),
+ load_return_int_tag("SecurityAuthTimeout", auth_timeout,
+ httpd_conf:clean(Time), Dir, DirData);
+load([$A,$u,$t,$h,$N,$a,$m,$e,$ |Name0],
+ [{security_directory, Dir, DirData}]) ->
+ Name = httpd_conf:clean(Name0),
+ {ok, [{security_directory, Dir, [{auth_name, Name}|DirData]}]};
+load("</Directory>",[{security_directory,Directory, DirData}]) ->
+ {ok, [], {security_directory, Directory, DirData}}.
+
+load_return_int_tag(Name, Atom, Time, Dir, DirData) ->
+ case Time of
+ "infinity" ->
+ {ok, [{security_directory, Dir, [{Atom, 99999999999999999999999999999}|DirData]}]};
+ Int ->
+ case catch list_to_integer(Time) of
+ {'EXIT', _} ->
+ {error, Time++" is an invalid "++Name};
+ Val ->
+ {ok, [{security_directory, Dir, [{Atom, Val}|DirData]}]}
+ end
+ end.
+
+store({security_directory, Dir0, DirData}, ConfigList) ->
+ ?CDEBUG("store(security_directory) -> ~n"
+ " Dir0: ~p~n"
+ " DirData: ~p",
+ [Dir0, DirData]),
+ Addr = httpd_util:key1search(ConfigList, bind_address),
+ Port = httpd_util:key1search(ConfigList, port),
+ mod_security_server:start(Addr, Port),
+ SR = httpd_util:key1search(ConfigList, server_root),
+ Dir =
+ case filename:pathtype(Dir0) of
+ relative ->
+ filename:join(SR, Dir0);
+ _ ->
+ Dir0
+ end,
+ case httpd_util:key1search(DirData, data_file, no_data_file) of
+ no_data_file ->
+ {error, no_security_data_file};
+ DataFile0 ->
+ DataFile =
+ case filename:pathtype(DataFile0) of
+ relative ->
+ filename:join(SR, DataFile0);
+ _ ->
+ DataFile0
+ end,
+ case mod_security_server:new_table(Addr, Port, DataFile) of
+ {ok, TwoTables} ->
+ NewDirData0 = lists:keyreplace(data_file, 1, DirData,
+ {data_file, TwoTables}),
+ NewDirData1 = case Addr of
+ undefined ->
+ [{port,Port}|NewDirData0];
+ _ ->
+ [{port,Port},{bind_address,Addr}|
+ NewDirData0]
+ end,
+ {ok, {security_directory,NewDirData1}};
+ {error, Err} ->
+ {error, {{open_data_file, DataFile}, Err}}
+ end
+ end.
+
+
+remove(ConfigDB) ->
+ Addr = case ets:lookup(ConfigDB, bind_address) of
+ [] ->
+ undefined;
+ [{bind_address, Address}] ->
+ Address
+ end,
+ [{port, Port}] = ets:lookup(ConfigDB, port),
+ mod_security_server:delete_tables(Addr, Port),
+ mod_security_server:stop(Addr, Port).
+
+
+%%
+%% User API
+%%
+
+%% list_blocked_users
+
+list_blocked_users(Port) ->
+ list_blocked_users(undefined, Port).
+
+list_blocked_users(Port, Dir) when integer(Port) ->
+ list_blocked_users(undefined,Port,Dir);
+list_blocked_users(Addr, Port) when integer(Port) ->
+ mod_security_server:list_blocked_users(Addr, Port).
+
+list_blocked_users(Addr, Port, Dir) ->
+ mod_security_server:list_blocked_users(Addr, Port, Dir).
+
+
+%% block_user
+
+block_user(User, Port, Dir, Time) ->
+ block_user(User, undefined, Port, Dir, Time).
+block_user(User, Addr, Port, Dir, Time) ->
+ mod_security_server:block_user(User, Addr, Port, Dir, Time).
+
+
+%% unblock_user
+
+unblock_user(User, Port) ->
+ unblock_user(User, undefined, Port).
+
+unblock_user(User, Port, Dir) when integer(Port) ->
+ unblock_user(User, undefined, Port, Dir);
+unblock_user(User, Addr, Port) when integer(Port) ->
+ mod_security_server:unblock_user(User, Addr, Port).
+
+unblock_user(User, Addr, Port, Dir) ->
+ mod_security_server:unblock_user(User, Addr, Port, Dir).
+
+
+%% list_auth_users
+
+list_auth_users(Port) ->
+ list_auth_users(undefined,Port).
+
+list_auth_users(Port, Dir) when integer(Port) ->
+ list_auth_users(undefined, Port, Dir);
+list_auth_users(Addr, Port) when integer(Port) ->
+ mod_security_server:list_auth_users(Addr, Port).
+
+list_auth_users(Addr, Port, Dir) ->
+ mod_security_server:list_auth_users(Addr, Port, Dir).
+
+
+error_report(M) ->
+ error_logger:error_report(M).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_security_server.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_security_server.erl
new file mode 100644
index 0000000000..81156c24e8
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_security_server.erl
@@ -0,0 +1,727 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mod_security_server.erl,v 1.1 2008/12/17 09:53:36 mikpe Exp $
+%%
+%% Security Audit Functionality
+
+%%
+%% The gen_server code.
+%%
+%% A gen_server is needed in this module to take care of shared access to the
+%% data file used to store failed and successful authentications aswell as
+%% user blocks.
+%%
+%% The storage model is a write-through model with both an ets and a dets
+%% table. Writes are done to both the ets and then the dets table, but reads
+%% are only done from the ets table.
+%%
+%% This approach also enables parallelism when using dets by returning the
+%% same dets table identifier when opening several files with the same
+%% physical location.
+%%
+%% NOTE: This could be implemented using a single dets table, as it is
+%% possible to open a dets file with the ram_file flag, but this
+%% would require periodical sync's to disk, and it would be hard
+%% to decide when such an operation should occur.
+%%
+
+
+-module(mod_security_server).
+
+-include("httpd.hrl").
+-include("httpd_verbosity.hrl").
+
+
+-behaviour(gen_server).
+
+
+%% User API exports (called via mod_security)
+-export([list_blocked_users/2, list_blocked_users/3,
+ block_user/5,
+ unblock_user/3, unblock_user/4,
+ list_auth_users/2, list_auth_users/3]).
+
+%% Internal exports (for mod_security only)
+-export([start/2, stop/1, stop/2,
+ new_table/3, delete_tables/2,
+ store_failed_auth/5, store_successful_auth/4,
+ check_blocked_user/5]).
+
+%% gen_server exports
+-export([start_link/3,
+ init/1,
+ handle_info/2, handle_call/3, handle_cast/2,
+ terminate/2,
+ code_change/3]).
+
+-export([verbosity/3]).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% %%
+%% External API %%
+%% %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% start_link/3
+%%
+%% NOTE: This is called by httpd_misc_sup when the process is started
+%%
+
+start_link(Addr, Port, Verbosity) ->
+ ?vtrace("start_link -> entry with"
+ "~n Addr: ~p"
+ "~n Port: ~p", [Addr, Port]),
+ Name = make_name(Addr, Port),
+ gen_server:start_link({local, Name}, ?MODULE, [Verbosity],
+ [{timeout, infinity}]).
+
+
+%% start/2
+%% Called by the mod_security module.
+
+start(Addr, Port) ->
+ Name = make_name(Addr, Port),
+ case whereis(Name) of
+ undefined ->
+ Verbosity = get(security_verbosity),
+ case httpd_misc_sup:start_sec_server(Addr, Port, Verbosity) of
+ {ok, Pid} ->
+ put(security_server, Pid),
+ ok;
+ Error ->
+ exit({failed_start_security_server, Error})
+ end;
+ _ -> %% Already started...
+ ok
+ end.
+
+
+%% stop
+
+stop(Port) ->
+ stop(undefined, Port).
+stop(Addr, Port) ->
+ Name = make_name(Addr, Port),
+ case whereis(Name) of
+ undefined ->
+ ok;
+ _ ->
+ httpd_misc_sup:stop_sec_server(Addr, Port)
+ end.
+
+
+%% verbosity
+
+verbosity(Addr, Port, Verbosity) ->
+ Name = make_name(Addr, Port),
+ Req = {verbosity, Verbosity},
+ call(Name, Req).
+
+
+%% list_blocked_users
+
+list_blocked_users(Addr, Port) ->
+ Name = make_name(Addr,Port),
+ Req = {list_blocked_users, Addr, Port, '_'},
+ call(Name, Req).
+
+list_blocked_users(Addr, Port, Dir) ->
+ Name = make_name(Addr, Port),
+ Req = {list_blocked_users, Addr, Port, Dir},
+ call(Name, Req).
+
+
+%% block_user
+
+block_user(User, Addr, Port, Dir, Time) ->
+ Name = make_name(Addr, Port),
+ Req = {block_user, User, Addr, Port, Dir, Time},
+ call(Name, Req).
+
+
+%% unblock_user
+
+unblock_user(User, Addr, Port) ->
+ Name = make_name(Addr, Port),
+ Req = {unblock_user, User, Addr, Port, '_'},
+ call(Name, Req).
+
+unblock_user(User, Addr, Port, Dir) ->
+ Name = make_name(Addr, Port),
+ Req = {unblock_user, User, Addr, Port, Dir},
+ call(Name, Req).
+
+
+%% list_auth_users
+
+list_auth_users(Addr, Port) ->
+ Name = make_name(Addr, Port),
+ Req = {list_auth_users, Addr, Port, '_'},
+ call(Name, Req).
+
+list_auth_users(Addr, Port, Dir) ->
+ Name = make_name(Addr,Port),
+ Req = {list_auth_users, Addr, Port, Dir},
+ call(Name, Req).
+
+
+%% new_table
+
+new_table(Addr, Port, TabName) ->
+ Name = make_name(Addr,Port),
+ Req = {new_table, Addr, Port, TabName},
+ call(Name, Req).
+
+
+%% delete_tables
+
+delete_tables(Addr, Port) ->
+ Name = make_name(Addr, Port),
+ case whereis(Name) of
+ undefined ->
+ ok;
+ _ ->
+ call(Name, delete_tables)
+ end.
+
+
+%% store_failed_auth
+
+store_failed_auth(Info, Addr, Port, DecodedString, SDirData) ->
+ Name = make_name(Addr,Port),
+ Msg = {store_failed_auth,[Info,DecodedString,SDirData]},
+ cast(Name, Msg).
+
+
+%% store_successful_auth
+
+store_successful_auth(Addr, Port, User, SDirData) ->
+ Name = make_name(Addr,Port),
+ Msg = {store_successful_auth, [User,Addr,Port,SDirData]},
+ cast(Name, Msg).
+
+
+%% check_blocked_user
+
+check_blocked_user(Info, User, SDirData, Addr, Port) ->
+ Name = make_name(Addr, Port),
+ Req = {check_blocked_user, [Info, User, SDirData]},
+ call(Name, Req).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% %%
+%% Server call-back functions %%
+%% %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% init
+
+init([undefined]) ->
+ init([?default_verbosity]);
+init([Verbosity]) ->
+ ?DEBUG("init -> entry with Verbosity: ~p",[Verbosity]),
+ process_flag(trap_exit, true),
+ put(sname, sec),
+ put(verbosity, Verbosity),
+ ?vlog("starting",[]),
+ {ok, []}.
+
+
+%% handle_call
+
+handle_call(stop, _From, Tables) ->
+ ?vlog("stop",[]),
+ {stop, normal, ok, []};
+
+
+handle_call({verbosity,Verbosity}, _From, Tables) ->
+ ?vlog("set verbosity to ~p",[Verbosity]),
+ OldVerbosity = get(verbosity),
+ put(verbosity,Verbosity),
+ ?vdebug("old verbosity: ~p",[OldVerbosity]),
+ {reply,OldVerbosity,Tables};
+
+
+handle_call({block_user, User, Addr, Port, Dir, Time}, _From, Tables) ->
+ ?vlog("block user '~p' for ~p",[User,Dir]),
+ Ret = block_user_int({User, Addr, Port, Dir, Time}),
+ ?vdebug("block user result: ~p",[Ret]),
+ {reply, Ret, Tables};
+
+
+handle_call({list_blocked_users, Addr, Port, Dir}, _From, Tables) ->
+ ?vlog("list blocked users for ~p",[Dir]),
+ Blocked = list_blocked(Tables, Addr, Port, Dir, []),
+ ?vdebug("list blocked users: ~p",[Blocked]),
+ {reply, Blocked, Tables};
+
+
+handle_call({unblock_user, User, Addr, Port, Dir}, _From, Tables) ->
+ ?vlog("unblock user '~p' for ~p",[User,Dir]),
+ Ret = unblock_user_int({User, Addr, Port, Dir}),
+ ?vdebug("unblock user result: ~p",[Ret]),
+ {reply, Ret, Tables};
+
+
+handle_call({list_auth_users, Addr, Port, Dir}, _From, Tables) ->
+ ?vlog("list auth users for ~p",[Dir]),
+ Auth = list_auth(Tables, Addr, Port, Dir, []),
+ ?vdebug("list auth users result: ~p",[Auth]),
+ {reply, Auth, Tables};
+
+
+handle_call({new_table, Addr, Port, Name}, _From, Tables) ->
+ case lists:keysearch(Name, 1, Tables) of
+ {value, {Name, {Ets, Dets}}} ->
+ ?DEBUG("handle_call(new_table) -> we already have this table: ~p",
+ [Name]),
+ ?vdebug("new table; we already have this one: ~p",[Name]),
+ {reply, {ok, {Ets, Dets}}, Tables};
+ false ->
+ ?LOG("handle_call(new_table) -> new_table: Name = ~p",[Name]),
+ ?vlog("new table: ~p",[Name]),
+ TName = make_name(Addr,Port,length(Tables)),
+ ?DEBUG("handle_call(new_table) -> TName: ~p",[TName]),
+ ?vdebug("new table: ~p",[TName]),
+ case dets:open_file(TName, [{type, bag}, {file, Name},
+ {repair, true},
+ {access, read_write}]) of
+ {ok, DFile} ->
+ ETS = ets:new(TName, [bag, private]),
+ sync_dets_to_ets(DFile, ETS),
+ NewTables = [{Name, {ETS, DFile}}|Tables],
+ ?DEBUG("handle_call(new_table) -> ~n"
+ " NewTables: ~p",[NewTables]),
+ ?vtrace("new tables: ~p",[NewTables]),
+ {reply, {ok, {ETS, DFile}}, NewTables};
+ {error, Err} ->
+ ?LOG("handle_call -> Err: ~p",[Err]),
+ ?vinfo("failed open dets file: ~p",[Err]),
+ {reply, {error, {create_dets, Err}}, Tables}
+ end
+ end;
+
+handle_call(delete_tables, _From, Tables) ->
+ ?vlog("delete tables",[]),
+ lists:foreach(fun({Name, {ETS, DETS}}) ->
+ dets:close(DETS),
+ ets:delete(ETS)
+ end, Tables),
+ {reply, ok, []};
+
+handle_call({check_blocked_user, [Info, User, SDirData]}, _From, Tables) ->
+ ?vlog("check blocked user '~p'",[User]),
+ {ETS, DETS} = httpd_util:key1search(SDirData, data_file),
+ Dir = httpd_util:key1search(SDirData, path),
+ Addr = httpd_util:key1search(SDirData, bind_address),
+ Port = httpd_util:key1search(SDirData, port),
+ CBModule = httpd_util:key1search(SDirData, callback_module, no_module_at_all),
+ ?vdebug("call back module: ~p",[CBModule]),
+ Ret = check_blocked_user(Info, User, Dir, Addr, Port, ETS, DETS, CBModule),
+ ?vdebug("check result: ~p",[Ret]),
+ {reply, Ret, Tables};
+handle_call(Request,From,Tables) ->
+ ?vinfo("~n unknown call '~p' from ~p",[Request,From]),
+ {reply,ok,Tables}.
+
+
+%% handle_cast
+
+handle_cast({store_failed_auth, [Info, DecodedString, SDirData]}, Tables) ->
+ ?vlog("store failed auth",[]),
+ {ETS, DETS} = httpd_util:key1search(SDirData, data_file),
+ Dir = httpd_util:key1search(SDirData, path),
+ Addr = httpd_util:key1search(SDirData, bind_address),
+ Port = httpd_util:key1search(SDirData, port),
+ {ok, [User,Password]} = httpd_util:split(DecodedString,":",2),
+ ?vdebug("user '~p' and password '~p'",[User,Password]),
+ Seconds = universal_time(),
+ Key = {User, Dir, Addr, Port},
+
+ %% Event
+ CBModule = httpd_util:key1search(SDirData, callback_module, no_module_at_all),
+ ?vtrace("call back module: ~p",[CBModule]),
+ auth_fail_event(CBModule,Addr,Port,Dir,User,Password),
+
+ %% Find out if any of this user's other failed logins are too old to keep..
+ ?vtrace("remove old login failures",[]),
+ case ets:match_object(ETS, {failed, {Key, '_', '_'}}) of
+ [] ->
+ ?vtrace("no old login failures",[]),
+ no;
+ List when list(List) ->
+ ?vtrace("~p old login failures",[length(List)]),
+ ExpireTime = httpd_util:key1search(SDirData, fail_expire_time, 30)*60,
+ ?vtrace("expire time ~p",[ExpireTime]),
+ lists:map(fun({failed, {TheKey, LS, Gen}}) ->
+ Diff = Seconds-LS,
+ if
+ Diff > ExpireTime ->
+ ?vtrace("~n '~p' is to old to keep: ~p",
+ [TheKey,Gen]),
+ ets:match_delete(ETS, {failed, {TheKey, LS, Gen}}),
+ dets:match_delete(DETS, {failed, {TheKey, LS, Gen}});
+ true ->
+ ?vtrace("~n '~p' is not old enough: ~p",
+ [TheKey,Gen]),
+ ok
+ end
+ end,
+ List);
+ O ->
+ ?vlog("~n unknown login failure search resuylt: ~p",[O]),
+ no
+ end,
+
+ %% Insert the new failure..
+ Generation = length(ets:match_object(ETS, {failed, {Key, '_', '_'}})),
+ ?vtrace("insert ('~p') new login failure: ~p",[Key,Generation]),
+ ets:insert(ETS, {failed, {Key, Seconds, Generation}}),
+ dets:insert(DETS, {failed, {Key, Seconds, Generation}}),
+
+ %% See if we should block this user..
+ MaxRetries = httpd_util:key1search(SDirData, max_retries, 3),
+ BlockTime = httpd_util:key1search(SDirData, block_time, 60),
+ ?vtrace("~n Max retries ~p, block time ~p",[MaxRetries,BlockTime]),
+ case ets:match_object(ETS, {failed, {Key, '_', '_'}}) of
+ List1 ->
+ ?vtrace("~n ~p tries so far",[length(List1)]),
+ if
+ length(List1) >= MaxRetries ->
+ %% Block this user until Future
+ ?vtrace("block user '~p'",[User]),
+ Future = Seconds+BlockTime*60,
+ ?vtrace("future: ~p",[Future]),
+ Reason = io_lib:format("Blocking user ~s from dir ~s "
+ "for ~p minutes",
+ [User, Dir, BlockTime]),
+ mod_log:security_log(Info, lists:flatten(Reason)),
+
+ %% Event
+ user_block_event(CBModule,Addr,Port,Dir,User),
+
+ ets:match_delete(ETS,{blocked_user,
+ {User, Addr, Port, Dir, '$1'}}),
+ dets:match_delete(DETS, {blocked_user,
+ {User, Addr, Port, Dir, '$1'}}),
+ BlockRecord = {blocked_user,
+ {User, Addr, Port, Dir, Future}},
+ ets:insert(ETS, BlockRecord),
+ dets:insert(DETS, BlockRecord),
+ %% Remove previous failed requests.
+ ets:match_delete(ETS, {failed, {Key, '_', '_'}}),
+ dets:match_delete(DETS, {failed, {Key, '_', '_'}});
+ true ->
+ ?vtrace("still some tries to go",[]),
+ no
+ end;
+ Other ->
+ no
+ end,
+ {noreply, Tables};
+
+handle_cast({store_successful_auth, [User, Addr, Port, SDirData]}, Tables) ->
+ ?vlog("store successfull auth",[]),
+ {ETS, DETS} = httpd_util:key1search(SDirData, data_file),
+ AuthTimeOut = httpd_util:key1search(SDirData, auth_timeout, 30),
+ Dir = httpd_util:key1search(SDirData, path),
+ Key = {User, Dir, Addr, Port},
+
+ %% Remove failed entries for this Key
+ dets:match_delete(DETS, {failed, {Key, '_', '_'}}),
+ ets:match_delete(ETS, {failed, {Key, '_', '_'}}),
+
+ %% Keep track of when the last successful login took place.
+ Seconds = universal_time()+AuthTimeOut,
+ ets:match_delete(ETS, {success, {Key, '_'}}),
+ dets:match_delete(DETS, {success, {Key, '_'}}),
+ ets:insert(ETS, {success, {Key, Seconds}}),
+ dets:insert(DETS, {success, {Key, Seconds}}),
+ {noreply, Tables};
+
+handle_cast(Req, Tables) ->
+ ?vinfo("~n unknown cast '~p'",[Req]),
+ error_msg("security server got unknown cast: ~p",[Req]),
+ {noreply, Tables}.
+
+
+%% handle_info
+
+handle_info(Info, State) ->
+ ?vinfo("~n unknown info '~p'",[Info]),
+ {noreply, State}.
+
+
+%% terminate
+
+terminate(Reason, _Tables) ->
+ ?vlog("~n Terminating for reason: ~p",[Reason]),
+ ok.
+
+
+%% code_change({down, ToVsn}, State, Extra)
+%%
+code_change({down, _}, State, _Extra) ->
+ ?vlog("downgrade", []),
+ {ok, State};
+
+
+%% code_change(FromVsn, State, Extra)
+%%
+code_change(_, State, Extra) ->
+ ?vlog("upgrade", []),
+ {ok, State}.
+
+
+
+
+%% block_user_int/2
+block_user_int({User, Addr, Port, Dir, Time}) ->
+ Dirs = httpd_manager:config_match(Addr, Port, {security_directory, '_'}),
+ ?vtrace("block '~p' for ~p during ~p",[User,Dir,Time]),
+ case find_dirdata(Dirs, Dir) of
+ {ok, DirData, {ETS, DETS}} ->
+ Time1 =
+ case Time of
+ infinity ->
+ 99999999999999999999999999999;
+ _ ->
+ Time
+ end,
+ Future = universal_time()+Time1,
+ ets:match_delete(ETS, {blocked_user, {User,Addr,Port,Dir,'_'}}),
+ dets:match_delete(DETS, {blocked_user, {User,Addr,Port,Dir,'_'}}),
+ ets:insert(ETS, {blocked_user, {User,Addr,Port,Dir,Future}}),
+ dets:insert(DETS, {blocked_user, {User,Addr,Port,Dir,Future}}),
+ CBModule = httpd_util:key1search(DirData, callback_module,
+ no_module_at_all),
+ ?vtrace("call back module ~p",[CBModule]),
+ user_block_event(CBModule,Addr,Port,Dir,User),
+ true;
+ _ ->
+ {error, no_such_directory}
+ end.
+
+
+find_dirdata([], _Dir) ->
+ false;
+find_dirdata([{security_directory, DirData}|SDirs], Dir) ->
+ case lists:keysearch(path, 1, DirData) of
+ {value, {path, Dir}} ->
+ {value, {data_file, {ETS, DETS}}} =
+ lists:keysearch(data_file, 1, DirData),
+ {ok, DirData, {ETS, DETS}};
+ _ ->
+ find_dirdata(SDirs, Dir)
+ end.
+
+%% unblock_user_int/2
+
+unblock_user_int({User, Addr, Port, Dir}) ->
+ ?vtrace("unblock user '~p' for ~p",[User,Dir]),
+ Dirs = httpd_manager:config_match(Addr, Port, {security_directory, '_'}),
+ ?vtrace("~n dirs: ~p",[Dirs]),
+ case find_dirdata(Dirs, Dir) of
+ {ok, DirData, {ETS, DETS}} ->
+ case ets:match_object(ETS,{blocked_user,{User,Addr,Port,Dir,'_'}}) of
+ [] ->
+ ?vtrace("not blocked",[]),
+ {error, not_blocked};
+ Objects ->
+ ets:match_delete(ETS, {blocked_user,
+ {User, Addr, Port, Dir, '_'}}),
+ dets:match_delete(DETS, {blocked_user,
+ {User, Addr, Port, Dir, '_'}}),
+ CBModule = httpd_util:key1search(DirData, callback_module,
+ no_module_at_all),
+ user_unblock_event(CBModule,Addr,Port,Dir,User),
+ true
+ end;
+ _ ->
+ ?vlog("~n cannot unblock: no such directory '~p'",[Dir]),
+ {error, no_such_directory}
+ end.
+
+
+
+%% list_auth/2
+
+list_auth([], _Addr, _Port, Dir, Acc) ->
+ Acc;
+list_auth([{Name, {ETS, DETS}}|Tables], Addr, Port, Dir, Acc) ->
+ case ets:match_object(ETS, {success, {{'_', Dir, Addr, Port}, '_'}}) of
+ [] ->
+ list_auth(Tables, Addr, Port, Dir, Acc);
+ List when list(List) ->
+ TN = universal_time(),
+ NewAcc = lists:foldr(fun({success,{{U,Ad,P,D},T}},Ac) ->
+ if
+ T-TN > 0 ->
+ [U|Ac];
+ true ->
+ Rec = {success,{{U,Ad,P,D},T}},
+ ets:match_delete(ETS,Rec),
+ dets:match_delete(DETS,Rec),
+ Ac
+ end
+ end,
+ Acc, List),
+ list_auth(Tables, Addr, Port, Dir, NewAcc);
+ _ ->
+ list_auth(Tables, Addr, Port, Dir, Acc)
+ end.
+
+
+%% list_blocked/2
+
+list_blocked([], Addr, Port, Dir, Acc) ->
+ TN = universal_time(),
+ lists:foldl(fun({U,Ad,P,D,T}, Ac) ->
+ if
+ T-TN > 0 ->
+ [{U,Ad,P,D,local_time(T)}|Ac];
+ true ->
+ Ac
+ end
+ end,
+ [], Acc);
+list_blocked([{Name, {ETS, DETS}}|Tables], Addr, Port, Dir, Acc) ->
+ NewBlocked =
+ case ets:match_object(ETS, {blocked_user, {'_',Addr,Port,Dir,'_'}}) of
+ List when list(List) ->
+ lists:foldl(fun({blocked_user, X}, A) -> [X|A] end, Acc, List);
+ _ ->
+ Acc
+ end,
+ list_blocked(Tables, Addr, Port, Dir, NewBlocked).
+
+
+%%
+%% sync_dets_to_ets/2
+%%
+%% Reads dets-table DETS and syncronizes it with the ets-table ETS.
+%%
+sync_dets_to_ets(DETS, ETS) ->
+ dets:traverse(DETS, fun(X) ->
+ ets:insert(ETS, X),
+ continue
+ end).
+
+%%
+%% check_blocked_user/7 -> true | false
+%%
+%% Check if a specific user is blocked from access.
+%%
+%% The sideeffect of this routine is that it unblocks also other users
+%% whos blocking time has expired. This to keep the tables as small
+%% as possible.
+%%
+check_blocked_user(Info, User, Dir, Addr, Port, ETS, DETS, CBModule) ->
+ TN = universal_time(),
+ case ets:match_object(ETS, {blocked_user, {User, '_', '_', '_', '_'}}) of
+ List when list(List) ->
+ Blocked = lists:foldl(fun({blocked_user, X}, A) ->
+ [X|A] end, [], List),
+ check_blocked_user(Info,User,Dir,Addr,Port,ETS,DETS,TN,Blocked,CBModule);
+ _ ->
+ false
+ end.
+check_blocked_user(Info, User, Dir, Addr, Port, ETS, DETS, TN, [], CBModule) ->
+ false;
+check_blocked_user(Info, User, Dir, Addr, Port, ETS, DETS, TN,
+ [{User,Addr,Port,Dir,T}|Ls], CBModule) ->
+ TD = T-TN,
+ if
+ TD =< 0 ->
+ %% Blocking has expired, remove and grant access.
+ unblock_user(Info, User, Dir, Addr, Port, ETS, DETS, CBModule),
+ false;
+ true ->
+ true
+ end;
+check_blocked_user(Info, User, Dir, Addr, Port, ETS, DETS, TN,
+ [{OUser,ODir,OAddr,OPort,T}|Ls], CBModule) ->
+ TD = T-TN,
+ if
+ TD =< 0 ->
+ %% Blocking has expired, remove.
+ unblock_user(Info, OUser, ODir, OAddr, OPort, ETS, DETS, CBModule);
+ true ->
+ true
+ end,
+ check_blocked_user(Info, User, Dir, Addr, Port, ETS, DETS, TN, Ls, CBModule).
+
+unblock_user(Info, User, Dir, Addr, Port, ETS, DETS, CBModule) ->
+ Reason=io_lib:format("User ~s was removed from the block list for dir ~s",
+ [User, Dir]),
+ mod_log:security_log(Info, lists:flatten(Reason)),
+ user_unblock_event(CBModule,Addr,Port,Dir,User),
+ dets:match_delete(DETS, {blocked_user, {User, Addr, Port, Dir, '_'}}),
+ ets:match_delete(ETS, {blocked_user, {User, Addr, Port, Dir, '_'}}).
+
+
+make_name(Addr,Port) ->
+ httpd_util:make_name("httpd_security",Addr,Port).
+
+make_name(Addr,Port,Num) ->
+ httpd_util:make_name("httpd_security",Addr,Port,
+ "__" ++ integer_to_list(Num)).
+
+
+auth_fail_event(Mod,Addr,Port,Dir,User,Passwd) ->
+ event(auth_fail,Mod,Addr,Port,Dir,[{user,User},{password,Passwd}]).
+
+user_block_event(Mod,Addr,Port,Dir,User) ->
+ event(user_block,Mod,Addr,Port,Dir,[{user,User}]).
+
+user_unblock_event(Mod,Addr,Port,Dir,User) ->
+ event(user_unblock,Mod,Addr,Port,Dir,[{user,User}]).
+
+event(Event,Mod,undefined,Port,Dir,Info) ->
+ (catch Mod:event(Event,Port,Dir,Info));
+event(Event,Mod,Addr,Port,Dir,Info) ->
+ (catch Mod:event(Event,Addr,Port,Dir,Info)).
+
+universal_time() ->
+ calendar:datetime_to_gregorian_seconds(calendar:universal_time()).
+
+local_time(T) ->
+ calendar:universal_time_to_local_time(
+ calendar:gregorian_seconds_to_datetime(T)).
+
+
+error_msg(F, A) ->
+ error_logger:error_msg(F, A).
+
+
+call(Name, Req) ->
+ case (catch gen_server:call(Name, Req)) of
+ {'EXIT', Reason} ->
+ {error, Reason};
+ Reply ->
+ Reply
+ end.
+
+
+cast(Name, Msg) ->
+ case (catch gen_server:cast(Name, Msg)) of
+ {'EXIT', Reason} ->
+ {error, Reason};
+ Result ->
+ Result
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_trace.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_trace.erl
new file mode 100644
index 0000000000..9f4d331d82
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/mod_trace.erl
@@ -0,0 +1,64 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mod_trace.erl,v 1.1 2008/12/17 09:53:36 mikpe Exp $
+%%
+-module(mod_trace).
+
+-export([do/1]).
+
+-include("httpd.hrl").
+
+
+do(Info) ->
+ %%?vtrace("do",[]),
+ case Info#mod.method of
+ "TRACE" ->
+ case httpd_util:response_generated(Info) of
+ false->
+ generate_trace_response(Info);
+ true->
+ {proceed,Info#mod.data}
+ end;
+ _ ->
+ {proceed,Info#mod.data}
+ end.
+
+
+%%---------------------------------------------------------------------
+%%Generate the trace response the trace response consists of a
+%%http-header and the body will be the request.
+%5----------------------------------------------------------------------
+
+generate_trace_response(Info)->
+ RequestHead=Info#mod.parsed_header,
+ Body=generate_trace_response_body(RequestHead),
+ Len=length(Body),
+ Response=["HTTP/1.1 200 OK\r\n",
+ "Content-Type:message/http\r\n",
+ "Content-Length:",integer_to_list(Len),"\r\n\r\n",
+ Info#mod.request_line,Body],
+ httpd_socket:deliver(Info#mod.socket_type,Info#mod.socket,Response),
+ {proceed,[{response,{already_sent,200,Len}}|Info#mod.data]}.
+
+generate_trace_response_body(Parsed_header)->
+ generate_trace_response_body(Parsed_header,[]).
+
+generate_trace_response_body([],Head)->
+ lists:flatten(Head);
+generate_trace_response_body([{[],[]}|Rest],Head) ->
+ generate_trace_response_body(Rest,Head);
+generate_trace_response_body([{Field,Value}|Rest],Head) ->
+ generate_trace_response_body(Rest,[Field ++ ":" ++ Value ++ "\r\n"|Head]).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/inets/uri.erl b/lib/dialyzer/test/r9c_SUITE_data/src/inets/uri.erl
new file mode 100644
index 0000000000..9a4f77f87b
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/inets/uri.erl
@@ -0,0 +1,349 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Mobile Arts AB
+%% Portions created by Mobile Arts are Copyright 2002, Mobile Arts AB
+%% All Rights Reserved.''
+%%
+%%
+%% Author : Johan Blom <[email protected]>
+%% Description :
+%% Implements various scheme dependent subsets (e.g. HTTP, FTP etc) based on
+%% RFC 2396, Uniform Resource Identifiers (URI): Generic Syntax
+%% Created : 27 Jul 2001 by Johan Blom <[email protected]>
+%%
+
+-module(uri).
+
+-author('[email protected]').
+
+-export([parse/1,resolve/2]).
+
+
+%%% Parse URI and return {Scheme,Path}
+%%% Note that Scheme specific parsing/validation is not handled here!
+resolve(Root,Rel) ->
+ ok.
+
+%%% See "http://www.isi.edu/in-notes/iana/assignments/url-schemes" for a list of
+%%% defined URL schemes and references to its sources.
+
+parse(URI) ->
+ case parse_scheme(URI) of
+ {http,Cont} -> parse_http(Cont,http);
+ {https,Cont} -> parse_http(Cont,https);
+ {ftp,Cont} -> parse_ftp(Cont,ftp);
+ {sip,Cont} -> parse_sip(Cont,sip);
+ {sms,Cont} -> parse_sms(Cont,sip);
+ {error,Error} -> {error,Error};
+ {Scheme,Cont} -> {Scheme,Cont}
+ end.
+
+
+%%% Parse the scheme.
+parse_scheme(URI) ->
+ parse_scheme(URI,[]).
+
+parse_scheme([H|URI],Acc) when $a=<H,H=<$z; $A=<H,H=<$Z ->
+ parse_scheme2(URI,[H|Acc]);
+parse_scheme(_,_) ->
+ {error,no_scheme}.
+
+parse_scheme2([H|URI],Acc)
+ when $a=<H,H=<$z; $A=<H,H=<$Z; $0=<H,H=<$9; H==$-;H==$+;H==$. ->
+ parse_scheme2(URI,[H|Acc]);
+parse_scheme2([$:|URI],Acc) ->
+ {list_to_atom(lists:reverse(Acc)),URI};
+parse_scheme2(_,_) ->
+ {error,no_scheme}.
+
+
+%%% ............................................................................
+-define(HTTP_DEFAULT_PORT, 80).
+-define(HTTPS_DEFAULT_PORT, 443).
+
+%%% HTTP (Source RFC 2396, RFC 2616)
+%%% http_URL = "*" | absoluteURI | abs_path [ "?" query ] | authority
+
+%%% http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]
+%%% Returns a tuple {http,Host,Port,PathQuery} where
+%%% Host = string() Host value
+%%% Port = string() Port value
+%%% PathQuery= string() Combined absolute path and query value
+parse_http("//"++C0,Scheme) ->
+ case scan_hostport(C0,Scheme) of
+ {C1,Host,Port} ->
+ case scan_pathquery(C1) of
+ {error,Error} ->
+ {error,Error};
+ PathQuery ->
+ {Scheme,Host,Port,PathQuery}
+ end;
+ {error,Error} ->
+ {error,Error}
+ end;
+parse_http(_,_) ->
+ {error,invalid_url}.
+
+scan_pathquery(C0) ->
+ case scan_abspath(C0) of
+ {error,Error} ->
+ {error,Error};
+ {[],[]} -> % Add implicit path
+ "/";
+ {"?"++C1,Path} ->
+ case scan_query(C1,[]) of
+ {error,Error} ->
+ {error,Error};
+ Query ->
+ Path++"?"++Query
+ end;
+ {[],Path} ->
+ Path
+ end.
+
+
+%%% ............................................................................
+%%% FIXME!!! This is just a quick hack that doesn't work!
+-define(FTP_DEFAULT_PORT, 80).
+
+%%% FTP (Source RFC 2396, RFC 1738, RFC 959)
+%%% Note: This BNF has been modified to better fit with RFC 2396
+%%% ftp_URL = "ftp:" "//" [ ftp_userinfo ] host [ ":" port ] ftp_abs_path
+%%% ftp_userinfo = ftp_user [ ":" ftp_password ]
+%%% ftp_abs_path = "/" ftp_path_segments [ ";type=" ftp_type ]
+%%% ftp_path_segments = ftp_segment *( "/" ftp_segment)
+%%% ftp_segment = *[ ftp_uchar | "?" | ":" | "@" | "&" | "=" ]
+%%% ftp_type = "A" | "I" | "D" | "a" | "i" | "d"
+%%% ftp_user = *[ ftp_uchar | ";" | "?" | "&" | "=" ]
+%%% ftp_password = *[ ftp_uchar | ";" | "?" | "&" | "=" ]
+%%% ftp_uchar = ftp_unreserved | escaped
+%%% ftp_unreserved = alphanum | mark | "$" | "+" | ","
+parse_ftp("//"++C0,Scheme) ->
+ case ftp_userinfo(C0) of
+ {C1,Creds} ->
+ case scan_hostport(C1,Scheme) of
+ {C2,Host,Port} ->
+ case scan_abspath(C2) of
+ {error,Error} ->
+ {error,Error};
+ {[],[]} -> % Add implicit path
+ {Scheme,Creds,Host,Port,"/"};
+ {[],Path} ->
+ {Scheme,Creds,Host,Port,Path}
+ end;
+ {error,Error} ->
+ {error,Error}
+ end;
+ {error,Error} ->
+ {error,Error}
+ end.
+
+ftp_userinfo(C0) ->
+ User="",
+ Password="",
+ {C0,{User,Password}}.
+
+
+%%% ............................................................................
+%%% SIP (Source RFC 2396, RFC 2543)
+%%% sip_URL = "sip:" [ sip_userinfo "@" ] host [ ":" port ]
+%%% sip_url-parameters [ sip_headers ]
+%%% sip_userinfo = sip_user [ ":" sip_password ]
+%%% sip_user = *( unreserved | escaped | "&" | "=" | "+" | "$" | "," )
+%%% sip_password = *( unreserved | escaped | "&" | "=" | "+" | "$" | "," )
+%%% sip_url-parameters = *( ";" sip_url-parameter )
+%%% sip_url-parameter = sip_transport-param | sip_user-param |
+%%% sip_method-param | sip_ttl-param |
+%%% sip_maddr-param | sip_other-param
+%%% sip_transport-param = "transport=" ( "udp" | "tcp" )
+%%% sip_ttl-param = "ttl=" sip_ttl
+%%% sip_ttl = 1*3DIGIT ; 0 to 255
+%%% sip_maddr-param = "maddr=" host
+%%% sip_user-param = "user=" ( "phone" | "ip" )
+%%% sip_method-param = "method=" sip_Method
+%%% sip_tag-param = "tag=" sip_UUID
+%%% sip_UUID = 1*( hex | "-" )
+%%% sip_other-param = ( token | ( token "=" ( token | quoted-string )))
+%%% sip_Method = "INVITE" | "ACK" | "OPTIONS" | "BYE" |
+%%% "CANCEL" | "REGISTER"
+%%% sip_token = 1*< any CHAR except CTL's or separators>
+%%% sip_quoted-string = ( <"> *(qdtext | quoted-pair ) <"> )
+%%% sip_qdtext = <any TEXT-UTF8 except <">>
+%%% sip_quoted-pair = " \ " CHAR
+parse_sip(Cont,Scheme) ->
+ {Scheme,Cont}.
+
+
+
+
+%%% ............................................................................
+%%% SMS (Source draft-wilde-sms-uri-01, January 24 2002 and
+%%% draft-allocchio-gstn-01, November 2001)
+%%% The syntax definition for "gstn-phone" is taken from
+%%% [draft-allocchio-gstn-01], allowing global as well as local telephone
+%%% numbers.
+%%% Note: This BNF has been modified to better fit with RFC 2396
+%%% sms_URI = sms ":" 1*( sms-recipient ) [ sms-body ]
+%%% sms-recipient = gstn-phone sms-qualifier
+%%% [ "," sms-recipient ]
+%%% sms-qualifier = *( smsc-qualifier / pid-qualifier )
+%%% smsc-qualifier = ";smsc=" SMSC-sub-addr
+%%% pid-qualifier = ";pid=" PID-sub-addr
+%%% sms-body = ";body=" *urlc
+%%% gstn-phone = ( global-phone / local-phone )
+%%% global-phone = "+" 1*( DIGIT / written-sep )
+%%% local-phone = [ exit-code ] dial-number / exit-code [ dial-number ]
+%%% exit-code = phone-string
+%%% dial-number = phone-string
+%%% subaddr-string = phone-string
+%%% post-dial = phone-string
+%%% phone-string = 1*( DTMF / pause / tonewait / written-sep )
+%%% DTMF = ( DIGIT / "#" / "*" / "A" / "B" / "C" / "D" )
+%%% written-sep = ( "-" / "." )
+%%% pause = "p"
+%%% tonewait = "w"
+parse_sms(Cont,Scheme) ->
+ {Scheme,Cont}.
+
+
+%%% ============================================================================
+%%% Generic URI parsing. BNF rules from RFC 2396
+
+%%% hostport = host [ ":" port ]
+scan_hostport(C0,Scheme) ->
+ case scan_host(C0) of
+ {error,Error} ->
+ {error,Error};
+ {":"++C1,Host} ->
+ {C2,Port}=scan_port(C1,[]),
+ {C2,Host,list_to_integer(Port)};
+ {C1,Host} when Scheme==http ->
+ {C1,Host,?HTTP_DEFAULT_PORT};
+ {C1,Host} when Scheme==https ->
+ {C1,Host,?HTTPS_DEFAULT_PORT};
+ {C1,Host} when Scheme==ftp ->
+ {C1,Host,?FTP_DEFAULT_PORT}
+ end.
+
+
+%%% host = hostname | IPv4address
+%%% hostname = *( domainlabel "." ) toplabel [ "." ]
+%%% domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
+%%% toplabel = alpha | alpha *( alphanum | "-" ) alphanum
+%%% IPv4address = 1*digit "." 1*digit "." 1*digit "." 1*digit
+
+-define(ALPHA, 1).
+-define(DIGIT, 2).
+
+scan_host(C0) ->
+ case scan_host2(C0,[],0,[],[]) of
+ {C1,IPv4address,[?DIGIT,?DIGIT,?DIGIT,?DIGIT]} ->
+ {C1,lists:reverse(lists:append(IPv4address))};
+ {C1,Hostname,[?ALPHA|HostF]} ->
+ {C1,lists:reverse(lists:append(Hostname))};
+ _ ->
+ {error,no_host}
+ end.
+
+scan_host2([H|C0],Acc,CurF,Host,HostF) when $0=<H,H=<$9 ->
+ scan_host2(C0,[H|Acc],CurF bor ?DIGIT,Host,HostF);
+scan_host2([H|C0],Acc,CurF,Host,HostF) when $a=<H,H=<$z; $A=<H,H=<$Z ->
+ scan_host2(C0,[H|Acc],CurF bor ?ALPHA,Host,HostF);
+scan_host2([$-|C0],Acc,CurF,Host,HostF) when CurF=/=0 ->
+ scan_host2(C0,[$-|Acc],CurF,Host,HostF);
+scan_host2([$.|C0],Acc,CurF,Host,HostF) when CurF=/=0 ->
+ scan_host2(C0,[],0,[".",Acc|Host],[CurF|HostF]);
+scan_host2(C0,Acc,CurF,Host,HostF) ->
+ {C0,[Acc|Host],[CurF|HostF]}.
+
+
+%%% port = *digit
+scan_port([H|C0],Acc) when $0=<H,H=<$9 ->
+ scan_port(C0,[H|Acc]);
+scan_port(C0,Acc) ->
+ {C0,lists:reverse(Acc)}.
+
+%%% abs_path = "/" path_segments
+scan_abspath([]) ->
+ {[],[]};
+scan_abspath("/"++C0) ->
+ scan_pathsegments(C0,["/"]);
+scan_abspath(_) ->
+ {error,no_abspath}.
+
+%%% path_segments = segment *( "/" segment )
+scan_pathsegments(C0,Acc) ->
+ case scan_segment(C0,[]) of
+ {"/"++C1,Segment} ->
+ scan_pathsegments(C1,["/",Segment|Acc]);
+ {C1,Segment} ->
+ {C1,lists:reverse(lists:append([Segment|Acc]))}
+ end.
+
+
+%%% segment = *pchar *( ";" param )
+%%% param = *pchar
+scan_segment(";"++C0,Acc) ->
+ {C1,ParamAcc}=scan_pchars(C0,";"++Acc),
+ scan_segment(C1,ParamAcc);
+scan_segment(C0,Acc) ->
+ case scan_pchars(C0,Acc) of
+ {";"++C1,Segment} ->
+ {C2,ParamAcc}=scan_pchars(C1,";"++Segment),
+ scan_segment(C2,ParamAcc);
+ {C1,Segment} ->
+ {C1,Segment}
+ end.
+
+%%% query = *uric
+%%% uric = reserved | unreserved | escaped
+%%% reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
+%%% "$" | ","
+%%% unreserved = alphanum | mark
+%%% mark = "-" | "_" | "." | "!" | "~" | "*" | "'" |
+%%% "(" | ")"
+%%% escaped = "%" hex hex
+scan_query([],Acc) ->
+ lists:reverse(Acc);
+scan_query([$%,H1,H2|C0],Acc) -> % escaped
+ scan_query(C0,[hex2dec(H1)*16+hex2dec(H2)|Acc]);
+scan_query([H|C0],Acc) when $a=<H,H=<$z;$A=<H,H=<$Z;$0=<H,H=<$9 -> % alphanum
+ scan_query(C0,[H|Acc]);
+scan_query([H|C0],Acc) when H==$;; H==$/; H==$?; H==$:; H==$@;
+ H==$&; H==$=; H==$+; H==$$; H==$, -> % reserved
+ scan_query(C0,[H|Acc]);
+scan_query([H|C0],Acc) when H==$-; H==$_; H==$.; H==$!; H==$~;
+ H==$*; H==$'; H==$(; H==$) -> % mark
+ scan_query(C0,[H|Acc]);
+scan_query([H|C0],Acc) ->
+ {error,no_query}.
+
+
+%%% pchar = unreserved | escaped |
+%%% ":" | "@" | "&" | "=" | "+" | "$" | ","
+scan_pchars([],Acc) ->
+ {[],Acc};
+scan_pchars([$%,H1,H2|C0],Acc) -> % escaped
+ scan_pchars(C0,[hex2dec(H1)*16+hex2dec(H2)|Acc]);
+scan_pchars([H|C0],Acc) when $a=<H,H=<$z;$A=<H,H=<$Z;$0=<H,H=<$9 -> % alphanum
+ scan_pchars(C0,[H|Acc]);
+scan_pchars([H|C0],Acc) when H==$-; H==$_; H==$.; H==$!; H==$~;
+ H==$*; H==$'; H==$(; H==$) -> % mark
+ scan_pchars(C0,[H|Acc]);
+scan_pchars([H|C0],Acc) when H==$:; H==$@; H==$&; H==$=; H==$+; H==$$; H==$, ->
+ scan_pchars(C0,[H|Acc]);
+scan_pchars(C0,Acc) ->
+ {C0,Acc}.
+
+hex2dec(X) when X>=$0,X=<$9 -> X-$0;
+hex2dec(X) when X>=$A,X=<$F -> X-$A+10;
+hex2dec(X) when X>=$a,X=<$f -> X-$a+10.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/Makefile b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/Makefile
new file mode 100644
index 0000000000..8b57868117
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/Makefile
@@ -0,0 +1,136 @@
+# ``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 via the world wide web 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.
+#
+# The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+# Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+# AB. All Rights Reserved.''
+#
+# $Id: Makefile,v 1.1 2008/12/17 09:53:37 mikpe Exp $
+#
+include $(ERL_TOP)/make/target.mk
+
+ifeq ($(TYPE),debug)
+ERL_COMPILE_FLAGS += -Ddebug -W
+endif
+
+include $(ERL_TOP)/make/$(TARGET)/otp.mk
+
+# ----------------------------------------------------
+# Application version
+# ----------------------------------------------------
+include ../vsn.mk
+VSN=$(MNESIA_VSN)
+
+# ----------------------------------------------------
+# Release directory specification
+# ----------------------------------------------------
+RELSYSDIR = $(RELEASE_PATH)/lib/mnesia-$(VSN)
+
+# ----------------------------------------------------
+# Target Specs
+# ----------------------------------------------------
+MODULES= \
+ mnesia \
+ mnesia_backup \
+ mnesia_bup \
+ mnesia_checkpoint \
+ mnesia_checkpoint_sup \
+ mnesia_controller \
+ mnesia_dumper\
+ mnesia_event \
+ mnesia_frag \
+ mnesia_frag_hash \
+ mnesia_frag_old_hash \
+ mnesia_index \
+ mnesia_kernel_sup \
+ mnesia_late_loader \
+ mnesia_lib\
+ mnesia_loader \
+ mnesia_locker \
+ mnesia_log \
+ mnesia_monitor \
+ mnesia_recover \
+ mnesia_registry \
+ mnesia_schema\
+ mnesia_snmp_hook \
+ mnesia_snmp_sup \
+ mnesia_subscr \
+ mnesia_sup \
+ mnesia_sp \
+ mnesia_text \
+ mnesia_tm
+
+HRL_FILES= mnesia.hrl
+
+ERL_FILES= $(MODULES:%=%.erl)
+
+TARGET_FILES= $(MODULES:%=$(EBIN)/%.$(EMULATOR)) $(APP_TARGET) $(APPUP_TARGET)
+
+APP_FILE= mnesia.app
+
+APP_SRC= $(APP_FILE).src
+APP_TARGET= $(EBIN)/$(APP_FILE)
+
+APPUP_FILE= mnesia.appup
+
+APPUP_SRC= $(APPUP_FILE).src
+APPUP_TARGET= $(EBIN)/$(APPUP_FILE)
+
+
+
+# ----------------------------------------------------
+# FLAGS
+# ----------------------------------------------------
+ERL_FLAGS +=
+ERL_COMPILE_FLAGS += \
+ +warn_unused_vars \
+ +'{parse_transform,sys_pre_attributes}' \
+ +'{attribute,insert,vsn,"mnesia_$(MNESIA_VSN)"}' \
+ -W
+
+# ----------------------------------------------------
+# Targets
+# ----------------------------------------------------
+
+opt: $(TARGET_FILES)
+
+debug:
+ @${MAKE} TYPE=debug
+
+clean:
+ rm -f $(TARGET_FILES)
+ rm -f core
+
+docs:
+
+# ----------------------------------------------------
+# Special Build Targets
+# ----------------------------------------------------
+
+$(APP_TARGET): $(APP_SRC) ../vsn.mk
+ sed -e 's;%VSN%;$(VSN);' $< > $@
+
+$(APPUP_TARGET): $(APPUP_SRC) ../vsn.mk
+ sed -e 's;%VSN%;$(VSN);' $< > $@
+
+
+# ----------------------------------------------------
+# Release Target
+# ----------------------------------------------------
+include $(ERL_TOP)/make/otp_release_targets.mk
+
+release_spec: opt
+ $(INSTALL_DIR) $(RELSYSDIR)/src
+ $(INSTALL_DATA) $(HRL_FILES) $(ERL_FILES) $(RELSYSDIR)/src
+ $(INSTALL_DIR) $(RELSYSDIR)/ebin
+ $(INSTALL_DATA) $(TARGET_FILES) $(RELSYSDIR)/ebin
+
+release_docs_spec:
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia.app.src b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia.app.src
new file mode 100644
index 0000000000..fb9d7aa0ca
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia.app.src
@@ -0,0 +1,50 @@
+{application, mnesia,
+ [{description, "MNESIA CXC 138 12"},
+ {vsn, "%VSN%"},
+ {modules, [
+ mnesia,
+ mnesia_backup,
+ mnesia_bup,
+ mnesia_checkpoint,
+ mnesia_checkpoint_sup,
+ mnesia_controller,
+ mnesia_dumper,
+ mnesia_event,
+ mnesia_frag,
+ mnesia_frag_hash,
+ mnesia_frag_old_hash,
+ mnesia_index,
+ mnesia_kernel_sup,
+ mnesia_late_loader,
+ mnesia_lib,
+ mnesia_loader,
+ mnesia_locker,
+ mnesia_log,
+ mnesia_monitor,
+ mnesia_recover,
+ mnesia_registry,
+ mnesia_schema,
+ mnesia_snmp_hook,
+ mnesia_snmp_sup,
+ mnesia_subscr,
+ mnesia_sup,
+ mnesia_sp,
+ mnesia_text,
+ mnesia_tm
+ ]},
+ {registered, [
+ mnesia_dumper_load_regulator,
+ mnesia_event,
+ mnesia_fallback,
+ mnesia_controller,
+ mnesia_kernel_sup,
+ mnesia_late_loader,
+ mnesia_locker,
+ mnesia_monitor,
+ mnesia_recover,
+ mnesia_substr,
+ mnesia_sup,
+ mnesia_tm
+ ]},
+ {applications, [kernel, stdlib]},
+ {mod, {mnesia_sup, []}}]}.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia.appup.src b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia.appup.src
new file mode 100644
index 0000000000..64f50dd5c6
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia.appup.src
@@ -0,0 +1,6 @@
+{"%VSN%",
+ [
+ ],
+ [
+ ]
+}.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia.erl
new file mode 100644
index 0000000000..b4f03fab03
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia.erl
@@ -0,0 +1,2191 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia.erl,v 1.2 2010/03/04 13:54:19 maria Exp $
+%%
+%% This module exports the public interface of the Mnesia DBMS engine
+
+-module(mnesia).
+%-behaviour(mnesia_access).
+
+-export([
+ %% Start, stop and debugging
+ start/0, start/1, stop/0, % Not for public use
+ set_debug_level/1, lkill/0, kill/0, % Not for public use
+ ms/0, nc/0, nc/1, ni/0, ni/1, % Not for public use
+ change_config/2,
+
+ %% Activity mgt
+ abort/1, transaction/1, transaction/2, transaction/3,
+ sync_transaction/1, sync_transaction/2, sync_transaction/3,
+ async_dirty/1, async_dirty/2, sync_dirty/1, sync_dirty/2, ets/1, ets/2,
+ activity/2, activity/3, activity/4, % Not for public use
+
+ %% Access within an activity - Lock acquisition
+ lock/2, lock/4,
+ read_lock_table/1,
+ write_lock_table/1,
+
+ %% Access within an activity - Updates
+ write/1, s_write/1, write/3, write/5,
+ delete/1, s_delete/1, delete/3, delete/5,
+ delete_object/1, s_delete_object/1, delete_object/3, delete_object/5,
+
+ %% Access within an activity - Reads
+ read/1, wread/1, read/3, read/5,
+ match_object/1, match_object/3, match_object/5,
+ select/2, select/3, select/5,
+ all_keys/1, all_keys/4,
+ index_match_object/2, index_match_object/4, index_match_object/6,
+ index_read/3, index_read/6,
+
+ %% Iterators within an activity
+ foldl/3, foldl/4, foldr/3, foldr/4,
+
+ %% Dirty access regardless of activities - Updates
+ dirty_write/1, dirty_write/2,
+ dirty_delete/1, dirty_delete/2,
+ dirty_delete_object/1, dirty_delete_object/2,
+ dirty_update_counter/2, dirty_update_counter/3,
+
+ %% Dirty access regardless of activities - Read
+ dirty_read/1, dirty_read/2,
+ dirty_select/2,
+ dirty_match_object/1, dirty_match_object/2, dirty_all_keys/1,
+ dirty_index_match_object/2, dirty_index_match_object/3,
+ dirty_index_read/3, dirty_slot/2,
+ dirty_first/1, dirty_next/2, dirty_last/1, dirty_prev/2,
+
+ %% Info
+ table_info/2, table_info/4, schema/0, schema/1,
+ error_description/1, info/0, system_info/1,
+ system_info/0, % Not for public use
+
+ %% Database mgt
+ create_schema/1, delete_schema/1,
+ backup/1, backup/2, traverse_backup/4, traverse_backup/6,
+ install_fallback/1, install_fallback/2,
+ uninstall_fallback/0, uninstall_fallback/1,
+ activate_checkpoint/1, deactivate_checkpoint/1,
+ backup_checkpoint/2, backup_checkpoint/3, restore/2,
+
+ %% Table mgt
+ create_table/1, create_table/2, delete_table/1,
+ add_table_copy/3, del_table_copy/2, move_table_copy/3,
+ add_table_index/2, del_table_index/2,
+ transform_table/3, transform_table/4,
+ change_table_copy_type/3,
+ read_table_property/2, write_table_property/2, delete_table_property/2,
+ change_table_frag/2,
+ clear_table/1,
+
+ %% Table load
+ dump_tables/1, wait_for_tables/2, force_load_table/1,
+ change_table_access_mode/2, change_table_load_order/2,
+ set_master_nodes/1, set_master_nodes/2,
+
+ %% Misc admin
+ dump_log/0, subscribe/1, unsubscribe/1, report_event/1,
+
+ %% Snmp
+ snmp_open_table/2, snmp_close_table/1,
+ snmp_get_row/2, snmp_get_next_index/2, snmp_get_mnesia_key/2,
+
+ %% Textfile access
+ load_textfile/1, dump_to_textfile/1,
+
+ %% Mnemosyne exclusive
+ get_activity_id/0, put_activity_id/1, % Not for public use
+
+ %% Mnesia internal functions
+ dirty_rpc/4, % Not for public use
+ has_var/1, fun_select/7,
+ foldl/6, foldr/6,
+
+ %% Module internal callback functions
+ remote_dirty_match_object/2, % Not for public use
+ remote_dirty_select/2 % Not for public use
+ ]).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-include("mnesia.hrl").
+-import(mnesia_lib, [verbose/2]).
+
+-define(DEFAULT_ACCESS, ?MODULE).
+
+%% Select
+-define(PATTERN_TO_OBJECT_MATCH_SPEC(Pat), [{Pat,[],['$_']}]).
+-define(PATTERN_TO_BINDINGS_MATCH_SPEC(Pat), [{Pat,[],['$$']}]).
+
+%% Local function in order to avoid external function call
+val(Var) ->
+ case ?catch_val(Var) of
+ {'EXIT', Reason} -> mnesia_lib:other_val(Var, Reason);
+ Value -> Value
+ end.
+
+is_dollar_digits(Var) ->
+ case atom_to_list(Var) of
+ [$$ | Digs] ->
+ is_digits(Digs);
+ _ ->
+ false
+ end.
+
+is_digits([Dig | Tail]) ->
+ if
+ $0 =< Dig, Dig =< $9 ->
+ is_digits(Tail);
+ true ->
+ false
+ end;
+is_digits([]) ->
+ true.
+
+has_var(X) when atom(X) ->
+ if
+ X == '_' ->
+ true;
+ atom(X) ->
+ is_dollar_digits(X);
+ true ->
+ false
+ end;
+has_var(X) when tuple(X) ->
+ e_has_var(X, size(X));
+has_var([H|T]) ->
+ case has_var(H) of
+ false -> has_var(T);
+ Other -> Other
+ end;
+has_var(_) -> false.
+
+e_has_var(_, 0) -> false;
+e_has_var(X, Pos) ->
+ case has_var(element(Pos, X))of
+ false -> e_has_var(X, Pos-1);
+ Other -> Other
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Start and stop
+
+start() ->
+ {Time , Res} = timer:tc(application, start, [?APPLICATION, temporary]),
+
+ Secs = Time div 1000000,
+ case Res of
+ ok ->
+ verbose("Mnesia started, ~p seconds~n",[ Secs]),
+ ok;
+ {error, {already_started, mnesia}} ->
+ verbose("Mnesia already started, ~p seconds~n",[ Secs]),
+ ok;
+ {error, R} ->
+ verbose("Mnesia failed to start, ~p seconds: ~p~n",[ Secs, R]),
+ {error, R}
+ end.
+
+start(ExtraEnv) when list(ExtraEnv) ->
+ case mnesia_lib:ensure_loaded(?APPLICATION) of
+ ok ->
+ patched_start(ExtraEnv);
+ Error ->
+ Error
+ end;
+start(ExtraEnv) ->
+ {error, {badarg, ExtraEnv}}.
+
+patched_start([{Env, Val} | Tail]) when atom(Env) ->
+ case mnesia_monitor:patch_env(Env, Val) of
+ {error, Reason} ->
+ {error, Reason};
+ _NewVal ->
+ patched_start(Tail)
+ end;
+patched_start([Head | _]) ->
+ {error, {bad_type, Head}};
+patched_start([]) ->
+ start().
+
+stop() ->
+ case application:stop(?APPLICATION) of
+ ok -> stopped;
+ {error, {not_started, ?APPLICATION}} -> stopped;
+ Other -> Other
+ end.
+
+change_config(extra_db_nodes, Ns) when list(Ns) ->
+ mnesia_controller:connect_nodes(Ns);
+change_config(BadKey, _BadVal) ->
+ {error, {badarg, BadKey}}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Debugging
+
+set_debug_level(Level) ->
+ mnesia_subscr:set_debug_level(Level).
+
+lkill() ->
+ mnesia_sup:kill().
+
+kill() ->
+ rpc:multicall(mnesia_sup, kill, []).
+
+ms() ->
+ [
+ mnesia,
+ mnesia_backup,
+ mnesia_bup,
+ mnesia_checkpoint,
+ mnesia_checkpoint_sup,
+ mnesia_controller,
+ mnesia_dumper,
+ mnesia_loader,
+ mnesia_frag,
+ mnesia_frag_hash,
+ mnesia_frag_old_hash,
+ mnesia_index,
+ mnesia_kernel_sup,
+ mnesia_late_loader,
+ mnesia_lib,
+ mnesia_log,
+ mnesia_registry,
+ mnesia_schema,
+ mnesia_snmp_hook,
+ mnesia_snmp_sup,
+ mnesia_subscr,
+ mnesia_sup,
+ mnesia_text,
+ mnesia_tm,
+ mnesia_recover,
+ mnesia_locker,
+
+ %% Keep these last in the list, so
+ %% mnesia_sup kills these last
+ mnesia_monitor,
+ mnesia_event
+ ].
+
+nc() ->
+ Mods = ms(),
+ nc(Mods).
+
+nc(Mods) when list(Mods)->
+ [Mod || Mod <- Mods, ok /= load(Mod, compile)].
+
+ni() ->
+ Mods = ms(),
+ ni(Mods).
+
+ni(Mods) when list(Mods) ->
+ [Mod || Mod <- Mods, ok /= load(Mod, interpret)].
+
+load(Mod, How) when atom(Mod) ->
+ case try_load(Mod, How) of
+ ok ->
+ ok;
+ _ ->
+ mnesia_lib:show( "~n RETRY ~p FROM: ", [Mod]),
+ Abs = mod2abs(Mod),
+ load(Abs, How)
+ end;
+load(Abs, How) ->
+ case try_load(Abs, How) of
+ ok ->
+ ok;
+ {error, Reason} ->
+ mnesia_lib:show( " *** ERROR *** ~p~n", [Reason]),
+ {error, Reason}
+ end.
+
+try_load(Mod, How) ->
+ mnesia_lib:show( " ~p ", [Mod]),
+ Flags = [{d, debug}],
+ case How of
+ compile ->
+ case catch c:nc(Mod, Flags) of
+ {ok, _} -> ok;
+ Other -> {error, Other}
+ end;
+ interpret ->
+ case catch int:ni(Mod, Flags) of
+ {module, _} -> ok;
+ Other -> {error, Other}
+ end
+ end.
+
+mod2abs(Mod) ->
+ ModString = atom_to_list(Mod),
+ SubDir =
+ case lists:suffix("test", ModString) of
+ true -> test;
+ false -> src
+ end,
+ filename:join([code:lib_dir(?APPLICATION), SubDir, ModString]).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Activity mgt
+
+abort(Reason) ->
+ exit({aborted, Reason}).
+
+transaction(Fun) ->
+ transaction(get(mnesia_activity_state), Fun, [], infinity, ?DEFAULT_ACCESS, async).
+transaction(Fun, Retries) when integer(Retries), Retries >= 0 ->
+ transaction(get(mnesia_activity_state), Fun, [], Retries, ?DEFAULT_ACCESS, async);
+transaction(Fun, Retries) when Retries == infinity ->
+ transaction(get(mnesia_activity_state), Fun, [], Retries, ?DEFAULT_ACCESS, async);
+transaction(Fun, Args) ->
+ transaction(get(mnesia_activity_state), Fun, Args, infinity, ?DEFAULT_ACCESS, async).
+transaction(Fun, Args, Retries) ->
+ transaction(get(mnesia_activity_state), Fun, Args, Retries, ?DEFAULT_ACCESS, async).
+
+sync_transaction(Fun) ->
+ transaction(get(mnesia_activity_state), Fun, [], infinity, ?DEFAULT_ACCESS, sync).
+sync_transaction(Fun, Retries) when integer(Retries), Retries >= 0 ->
+ transaction(get(mnesia_activity_state), Fun, [], Retries, ?DEFAULT_ACCESS, sync);
+sync_transaction(Fun, Retries) when Retries == infinity ->
+ transaction(get(mnesia_activity_state), Fun, [], Retries, ?DEFAULT_ACCESS, sync);
+sync_transaction(Fun, Args) ->
+ transaction(get(mnesia_activity_state), Fun, Args, infinity, ?DEFAULT_ACCESS, sync).
+sync_transaction(Fun, Args, Retries) ->
+ transaction(get(mnesia_activity_state), Fun, Args, Retries, ?DEFAULT_ACCESS, sync).
+
+
+transaction(State, Fun, Args, Retries, Mod, Kind)
+ when function(Fun), list(Args), Retries == infinity, atom(Mod) ->
+ mnesia_tm:transaction(State, Fun, Args, Retries, Mod, Kind);
+transaction(State, Fun, Args, Retries, Mod, Kind)
+ when function(Fun), list(Args), integer(Retries), Retries >= 0, atom(Mod) ->
+ mnesia_tm:transaction(State, Fun, Args, Retries, Mod, Kind);
+transaction(_State, Fun, Args, Retries, Mod, _Kind) ->
+ {aborted, {badarg, Fun, Args, Retries, Mod}}.
+
+non_transaction(State, Fun, Args, ActivityKind, Mod)
+ when function(Fun), list(Args), atom(Mod) ->
+ mnesia_tm:non_transaction(State, Fun, Args, ActivityKind, Mod);
+non_transaction(_State, Fun, Args, _ActivityKind, _Mod) ->
+ {aborted, {badarg, Fun, Args}}.
+
+async_dirty(Fun) ->
+ async_dirty(Fun, []).
+async_dirty(Fun, Args) ->
+ non_transaction(get(mnesia_activity_state), Fun, Args, async_dirty, ?DEFAULT_ACCESS).
+
+sync_dirty(Fun) ->
+ sync_dirty(Fun, []).
+sync_dirty(Fun, Args) ->
+ non_transaction(get(mnesia_activity_state), Fun, Args, sync_dirty, ?DEFAULT_ACCESS).
+
+ets(Fun) ->
+ ets(Fun, []).
+ets(Fun, Args) ->
+ non_transaction(get(mnesia_activity_state), Fun, Args, ets, ?DEFAULT_ACCESS).
+
+activity(Kind, Fun) ->
+ activity(Kind, Fun, []).
+activity(Kind, Fun, Args) when list(Args) ->
+ activity(Kind, Fun, Args, mnesia_monitor:get_env(access_module));
+activity(Kind, Fun, Mod) ->
+ activity(Kind, Fun, [], Mod).
+
+activity(Kind, Fun, Args, Mod) ->
+ State = get(mnesia_activity_state),
+ case Kind of
+ ets -> non_transaction(State, Fun, Args, Kind, Mod);
+ async_dirty -> non_transaction(State, Fun, Args, Kind, Mod);
+ sync_dirty -> non_transaction(State, Fun, Args, Kind, Mod);
+ transaction -> wrap_trans(State, Fun, Args, infinity, Mod, async);
+ {transaction, Retries} -> wrap_trans(State, Fun, Args, Retries, Mod, async);
+ sync_transaction -> wrap_trans(State, Fun, Args, infinity, Mod, sync);
+ {sync_transaction, Retries} -> wrap_trans(State, Fun, Args, Retries, Mod, sync);
+ _ -> {aborted, {bad_type, Kind}}
+ end.
+
+wrap_trans(State, Fun, Args, Retries, Mod, Kind) ->
+ case transaction(State, Fun, Args, Retries, Mod, Kind) of
+ {'atomic', GoodRes} -> GoodRes;
+ BadRes -> exit(BadRes)
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Access within an activity - lock acquisition
+
+%% Grab a lock on an item in the global lock table
+%% Item may be any term. Lock may be write or read.
+%% write lock is set on all the given nodes
+%% read lock is only set on the first node
+%% Nodes may either be a list of nodes or one node as an atom
+%% Mnesia on all Nodes must be connected to each other, but
+%% it is not neccessary that they are up and running.
+
+lock(LockItem, LockKind) ->
+ case get(mnesia_activity_state) of
+ {?DEFAULT_ACCESS, Tid, Ts} ->
+ lock(Tid, Ts, LockItem, LockKind);
+ {Mod, Tid, Ts} ->
+ Mod:lock(Tid, Ts, LockItem, LockKind);
+ _ ->
+ abort(no_transaction)
+ end.
+
+lock(Tid, Ts, LockItem, LockKind) ->
+ case element(1, Tid) of
+ tid ->
+ case LockItem of
+ {record, Tab, Key} ->
+ lock_record(Tid, Ts, Tab, Key, LockKind);
+ {table, Tab} ->
+ lock_table(Tid, Ts, Tab, LockKind);
+ {global, GlobalKey, Nodes} ->
+ global_lock(Tid, Ts, GlobalKey, LockKind, Nodes);
+ _ ->
+ abort({bad_type, LockItem})
+ end;
+ _Protocol ->
+ []
+ end.
+
+%% Grab a read lock on a whole table
+read_lock_table(Tab) ->
+ lock({table, Tab}, read),
+ ok.
+
+%% Grab a write lock on a whole table
+write_lock_table(Tab) ->
+ lock({table, Tab}, write),
+ ok.
+
+lock_record(Tid, Ts, Tab, Key, LockKind) when atom(Tab) ->
+ Store = Ts#tidstore.store,
+ Oid = {Tab, Key},
+ case LockKind of
+ read ->
+ mnesia_locker:rlock(Tid, Store, Oid);
+ write ->
+ mnesia_locker:wlock(Tid, Store, Oid);
+ sticky_write ->
+ mnesia_locker:sticky_wlock(Tid, Store, Oid);
+ none ->
+ [];
+ _ ->
+ abort({bad_type, Tab, LockKind})
+ end;
+lock_record(_Tid, _Ts, Tab, _Key, _LockKind) ->
+ abort({bad_type, Tab}).
+
+lock_table(Tid, Ts, Tab, LockKind) when atom(Tab) ->
+ Store = Ts#tidstore.store,
+ case LockKind of
+ read ->
+ mnesia_locker:rlock_table(Tid, Store, Tab);
+ write ->
+ mnesia_locker:wlock_table(Tid, Store, Tab);
+ sticky_write ->
+ mnesia_locker:sticky_wlock_table(Tid, Store, Tab);
+ none ->
+ [];
+ _ ->
+ abort({bad_type, Tab, LockKind})
+ end;
+lock_table(_Tid, _Ts, Tab, _LockKind) ->
+ abort({bad_type, Tab}).
+
+global_lock(Tid, Ts, Item, Kind, Nodes) when list(Nodes) ->
+ case element(1, Tid) of
+ tid ->
+ Store = Ts#tidstore.store,
+ GoodNs = good_global_nodes(Nodes),
+ if
+ Kind /= read, Kind /= write ->
+ abort({bad_type, Kind});
+ true ->
+ mnesia_locker:global_lock(Tid, Store, Item, Kind, GoodNs)
+ end;
+ _Protocol ->
+ []
+ end;
+global_lock(_Tid, _Ts, _Item, _Kind, Nodes) ->
+ abort({bad_type, Nodes}).
+
+good_global_nodes(Nodes) ->
+ Recover = [node() | val(recover_nodes)],
+ mnesia_lib:intersect(Nodes, Recover).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Access within an activity - updates
+
+write(Val) when tuple(Val), size(Val) > 2 ->
+ Tab = element(1, Val),
+ write(Tab, Val, write);
+write(Val) ->
+ abort({bad_type, Val}).
+
+s_write(Val) when tuple(Val), size(Val) > 2 ->
+ Tab = element(1, Val),
+ write(Tab, Val, sticky_write).
+
+write(Tab, Val, LockKind) ->
+ case get(mnesia_activity_state) of
+ {?DEFAULT_ACCESS, Tid, Ts} ->
+ write(Tid, Ts, Tab, Val, LockKind);
+ {Mod, Tid, Ts} ->
+ Mod:write(Tid, Ts, Tab, Val, LockKind);
+ _ ->
+ abort(no_transaction)
+ end.
+
+write(Tid, Ts, Tab, Val, LockKind)
+ when atom(Tab), Tab /= schema, tuple(Val), size(Val) > 2 ->
+ case element(1, Tid) of
+ ets ->
+ ?ets_insert(Tab, Val),
+ ok;
+ tid ->
+ Store = Ts#tidstore.store,
+ Oid = {Tab, element(2, Val)},
+ case LockKind of
+ write ->
+ mnesia_locker:wlock(Tid, Store, Oid);
+ sticky_write ->
+ mnesia_locker:sticky_wlock(Tid, Store, Oid);
+ _ ->
+ abort({bad_type, Tab, LockKind})
+ end,
+ write_to_store(Tab, Store, Oid, Val);
+ Protocol ->
+ do_dirty_write(Protocol, Tab, Val)
+ end;
+write(_Tid, _Ts, Tab, Val, LockKind) ->
+ abort({bad_type, Tab, Val, LockKind}).
+
+write_to_store(Tab, Store, Oid, Val) ->
+ case ?catch_val({Tab, record_validation}) of
+ {RecName, Arity, Type}
+ when size(Val) == Arity, RecName == element(1, Val) ->
+ case Type of
+ bag ->
+ ?ets_insert(Store, {Oid, Val, write});
+ _ ->
+ ?ets_delete(Store, Oid),
+ ?ets_insert(Store, {Oid, Val, write})
+ end,
+ ok;
+ {'EXIT', _} ->
+ abort({no_exists, Tab});
+ _ ->
+ abort({bad_type, Val})
+ end.
+
+delete({Tab, Key}) ->
+ delete(Tab, Key, write);
+delete(Oid) ->
+ abort({bad_type, Oid}).
+
+s_delete({Tab, Key}) ->
+ delete(Tab, Key, sticky_write);
+s_delete(Oid) ->
+ abort({bad_type, Oid}).
+
+delete(Tab, Key, LockKind) ->
+ case get(mnesia_activity_state) of
+ {?DEFAULT_ACCESS, Tid, Ts} ->
+ delete(Tid, Ts, Tab, Key, LockKind);
+ {Mod, Tid, Ts} ->
+ Mod:delete(Tid, Ts, Tab, Key, LockKind);
+ _ ->
+ abort(no_transaction)
+ end.
+
+delete(Tid, Ts, Tab, Key, LockKind)
+ when atom(Tab), Tab /= schema ->
+ case element(1, Tid) of
+ ets ->
+ ?ets_delete(Tab, Key),
+ ok;
+ tid ->
+ Store = Ts#tidstore.store,
+ Oid = {Tab, Key},
+ case LockKind of
+ write ->
+ mnesia_locker:wlock(Tid, Store, Oid);
+ sticky_write ->
+ mnesia_locker:sticky_wlock(Tid, Store, Oid);
+ _ ->
+ abort({bad_type, Tab, LockKind})
+ end,
+ ?ets_delete(Store, Oid),
+ ?ets_insert(Store, {Oid, Oid, delete}),
+ ok;
+ Protocol ->
+ do_dirty_delete(Protocol, Tab, Key)
+ end;
+delete(_Tid, _Ts, Tab, _Key, _LockKind) ->
+ abort({bad_type, Tab}).
+
+delete_object(Val) when tuple(Val), size(Val) > 2 ->
+ Tab = element(1, Val),
+ delete_object(Tab, Val, write);
+delete_object(Val) ->
+ abort({bad_type, Val}).
+
+s_delete_object(Val) when tuple(Val), size(Val) > 2 ->
+ Tab = element(1, Val),
+ delete_object(Tab, Val, sticky_write);
+s_delete_object(Val) ->
+ abort({bad_type, Val}).
+
+delete_object(Tab, Val, LockKind) ->
+ case get(mnesia_activity_state) of
+ {?DEFAULT_ACCESS, Tid, Ts} ->
+ delete_object(Tid, Ts, Tab, Val, LockKind);
+ {Mod, Tid, Ts} ->
+ Mod:delete_object(Tid, Ts, Tab, Val, LockKind);
+ _ ->
+ abort(no_transaction)
+ end.
+
+delete_object(Tid, Ts, Tab, Val, LockKind)
+ when atom(Tab), Tab /= schema, tuple(Val), size(Val) > 2 ->
+ case element(1, Tid) of
+ ets ->
+ ?ets_match_delete(Tab, Val),
+ ok;
+ tid ->
+ Store = Ts#tidstore.store,
+ Oid = {Tab, element(2, Val)},
+ case LockKind of
+ write ->
+ mnesia_locker:wlock(Tid, Store, Oid);
+ sticky_write ->
+ mnesia_locker:sticky_wlock(Tid, Store, Oid);
+ _ ->
+ abort({bad_type, Tab, LockKind})
+ end,
+ case val({Tab, setorbag}) of
+ bag ->
+ ?ets_match_delete(Store, {Oid, Val, '_'}),
+ ?ets_insert(Store, {Oid, Val, delete_object});
+ _ ->
+ case ?ets_match_object(Store, {Oid, '_', write}) of
+ [] ->
+ ?ets_match_delete(Store, {Oid, Val, '_'}),
+ ?ets_insert(Store, {Oid, Val, delete_object});
+ _ ->
+ ?ets_delete(Store, Oid),
+ ?ets_insert(Store, {Oid, Oid, delete})
+ end
+ end,
+ ok;
+ Protocol ->
+ do_dirty_delete_object(Protocol, Tab, Val)
+ end;
+delete_object(_Tid, _Ts, Tab, _Key, _LockKind) ->
+ abort({bad_type, Tab}).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Access within an activity - read
+
+read({Tab, Key}) ->
+ read(Tab, Key, read);
+read(Oid) ->
+ abort({bad_type, Oid}).
+
+wread({Tab, Key}) ->
+ read(Tab, Key, write);
+wread(Oid) ->
+ abort({bad_type, Oid}).
+
+read(Tab, Key, LockKind) ->
+ case get(mnesia_activity_state) of
+ {?DEFAULT_ACCESS, Tid, Ts} ->
+ read(Tid, Ts, Tab, Key, LockKind);
+ {Mod, Tid, Ts} ->
+ Mod:read(Tid, Ts, Tab, Key, LockKind);
+ _ ->
+ abort(no_transaction)
+ end.
+
+read(Tid, Ts, Tab, Key, LockKind)
+ when atom(Tab), Tab /= schema ->
+ case element(1, Tid) of
+ ets ->
+ ?ets_lookup(Tab, Key);
+ tid ->
+ Store = Ts#tidstore.store,
+ Oid = {Tab, Key},
+ Objs =
+ case LockKind of
+ read ->
+ mnesia_locker:rlock(Tid, Store, Oid);
+ write ->
+ mnesia_locker:rwlock(Tid, Store, Oid);
+ sticky_write ->
+ mnesia_locker:sticky_rwlock(Tid, Store, Oid);
+ _ ->
+ abort({bad_type, Tab, LockKind})
+ end,
+ add_written(?ets_lookup(Store, Oid), Tab, Objs);
+ _Protocol ->
+ dirty_read(Tab, Key)
+ end;
+read(_Tid, _Ts, Tab, _Key, _LockKind) ->
+ abort({bad_type, Tab}).
+
+%%%%%%%%%%%%%%%%%%%%%
+%% Iterators
+
+foldl(Fun, Acc, Tab) ->
+ foldl(Fun, Acc, Tab, read).
+
+foldl(Fun, Acc, Tab, LockKind) when function(Fun) ->
+ case get(mnesia_activity_state) of
+ {?DEFAULT_ACCESS, Tid, Ts} ->
+ foldl(Tid, Ts, Fun, Acc, Tab, LockKind);
+ {Mod, Tid, Ts} ->
+ Mod:foldl(Tid, Ts, Fun, Acc, Tab, LockKind);
+ _ ->
+ abort(no_transaction)
+ end.
+
+foldl(ActivityId, Opaque, Fun, Acc, Tab, LockKind) ->
+ {Type, Prev} = init_iteration(ActivityId, Opaque, Tab, LockKind),
+ Res = (catch do_foldl(ActivityId, Opaque, Tab, dirty_first(Tab), Fun, Acc, Type, Prev)),
+ close_iteration(Res, Tab).
+
+do_foldl(A, O, Tab, '$end_of_table', Fun, RAcc, _Type, Stored) ->
+ lists:foldl(fun(Key, Acc) ->
+ lists:foldl(Fun, Acc, read(A, O, Tab, Key, read))
+ end, RAcc, Stored);
+do_foldl(A, O, Tab, Key, Fun, Acc, ordered_set, [H | Stored]) when H == Key ->
+ NewAcc = lists:foldl(Fun, Acc, read(A, O, Tab, Key, read)),
+ do_foldl(A, O, Tab, dirty_next(Tab, Key), Fun, NewAcc, ordered_set, Stored);
+do_foldl(A, O, Tab, Key, Fun, Acc, ordered_set, [H | Stored]) when H < Key ->
+ NewAcc = lists:foldl(Fun, Acc, read(A, O, Tab, H, read)),
+ do_foldl(A, O, Tab, Key, Fun, NewAcc, ordered_set, Stored);
+do_foldl(A, O, Tab, Key, Fun, Acc, ordered_set, [H | Stored]) when H > Key ->
+ NewAcc = lists:foldl(Fun, Acc, read(A, O, Tab, Key, read)),
+ do_foldl(A, O, Tab, dirty_next(Tab, Key), Fun, NewAcc, ordered_set, [H |Stored]);
+do_foldl(A, O, Tab, Key, Fun, Acc, Type, Stored) -> %% Type is set or bag
+ NewAcc = lists:foldl(Fun, Acc, read(A, O, Tab, Key, read)),
+ NewStored = ordsets:del_element(Key, Stored),
+ do_foldl(A, O, Tab, dirty_next(Tab, Key), Fun, NewAcc, Type, NewStored).
+
+foldr(Fun, Acc, Tab) ->
+ foldr(Fun, Acc, Tab, read).
+foldr(Fun, Acc, Tab, LockKind) when function(Fun) ->
+ case get(mnesia_activity_state) of
+ {?DEFAULT_ACCESS, Tid, Ts} ->
+ foldr(Tid, Ts, Fun, Acc, Tab, LockKind);
+ {Mod, Tid, Ts} ->
+ Mod:foldr(Tid, Ts, Fun, Acc, Tab, LockKind);
+ _ ->
+ abort(no_transaction)
+ end.
+
+foldr(ActivityId, Opaque, Fun, Acc, Tab, LockKind) ->
+ {Type, TempPrev} = init_iteration(ActivityId, Opaque, Tab, LockKind),
+ Prev =
+ if
+ Type == ordered_set ->
+ lists:reverse(TempPrev);
+ true -> %% Order doesn't matter for set and bag
+ TempPrev %% Keep the order so we can use ordsets:del_element
+ end,
+ Res = (catch do_foldr(ActivityId, Opaque, Tab, dirty_last(Tab), Fun, Acc, Type, Prev)),
+ close_iteration(Res, Tab).
+
+do_foldr(A, O, Tab, '$end_of_table', Fun, RAcc, _Type, Stored) ->
+ lists:foldl(fun(Key, Acc) ->
+ lists:foldl(Fun, Acc, read(A, O, Tab, Key, read))
+ end, RAcc, Stored);
+do_foldr(A, O, Tab, Key, Fun, Acc, ordered_set, [H | Stored]) when H == Key ->
+ NewAcc = lists:foldl(Fun, Acc, read(A, O, Tab, Key, read)),
+ do_foldr(A, O, Tab, dirty_prev(Tab, Key), Fun, NewAcc, ordered_set, Stored);
+do_foldr(A, O, Tab, Key, Fun, Acc, ordered_set, [H | Stored]) when H > Key ->
+ NewAcc = lists:foldl(Fun, Acc, read(A, O, Tab, H, read)),
+ do_foldr(A, O, Tab, Key, Fun, NewAcc, ordered_set, Stored);
+do_foldr(A, O, Tab, Key, Fun, Acc, ordered_set, [H | Stored]) when H < Key ->
+ NewAcc = lists:foldl(Fun, Acc, read(A, O, Tab, Key, read)),
+ do_foldr(A, O, Tab, dirty_prev(Tab, Key), Fun, NewAcc, ordered_set, [H |Stored]);
+do_foldr(A, O, Tab, Key, Fun, Acc, Type, Stored) -> %% Type is set or bag
+ NewAcc = lists:foldl(Fun, Acc, read(A, O, Tab, Key, read)),
+ NewStored = ordsets:del_element(Key, Stored),
+ do_foldr(A, O, Tab, dirty_prev(Tab, Key), Fun, NewAcc, Type, NewStored).
+
+init_iteration(ActivityId, Opaque, Tab, LockKind) ->
+ lock(ActivityId, Opaque, {table, Tab}, LockKind),
+ Type = val({Tab, setorbag}),
+ Previous = add_previous(ActivityId, Opaque, Type, Tab),
+ St = val({Tab, storage_type}),
+ if
+ St == unknown ->
+ ignore;
+ true ->
+ mnesia_lib:db_fixtable(St, Tab, true)
+ end,
+ {Type, Previous}.
+
+close_iteration(Res, Tab) ->
+ case val({Tab, storage_type}) of
+ unknown ->
+ ignore;
+ St ->
+ mnesia_lib:db_fixtable(St, Tab, false)
+ end,
+ case Res of
+ {'EXIT', {aborted, What}} ->
+ abort(What);
+ {'EXIT', What} ->
+ abort(What);
+ _ ->
+ Res
+ end.
+
+add_previous(_ActivityId, non_transaction, _Type, _Tab) ->
+ [];
+add_previous(_Tid, Ts, _Type, Tab) ->
+ Previous = ?ets_match(Ts#tidstore.store, {{Tab, '$1'}, '_', write}),
+ lists:sort(lists:concat(Previous)).
+
+%% This routine fixes up the return value from read/1 so that
+%% it is correct with respect to what this particular transaction
+%% has already written, deleted .... etc
+
+add_written([], _Tab, Objs) ->
+ Objs; % standard normal fast case
+add_written(Written, Tab, Objs) ->
+ case val({Tab, setorbag}) of
+ bag ->
+ add_written_to_bag(Written, Objs, []);
+ _ ->
+ add_written_to_set(Written)
+ end.
+
+add_written_to_set(Ws) ->
+ case lists:last(Ws) of
+ {_, _, delete} -> [];
+ {_, Val, write} -> [Val];
+ {_, _, delete_object} -> []
+ end.
+
+add_written_to_bag([{_, Val, write} | Tail], Objs, Ack) ->
+ add_written_to_bag(Tail, lists:delete(Val, Objs), [Val | Ack]);
+add_written_to_bag([], Objs, Ack) ->
+ Objs ++ lists:reverse(Ack); %% Oldest write first as in ets
+add_written_to_bag([{_, _ , delete} | Tail], _Objs, _Ack) ->
+ %% This transaction just deleted all objects
+ %% with this key
+ add_written_to_bag(Tail, [], []);
+add_written_to_bag([{_, Val, delete_object} | Tail], Objs, Ack) ->
+ add_written_to_bag(Tail, lists:delete(Val, Objs), lists:delete(Val, Ack)).
+
+match_object(Pat) when tuple(Pat), size(Pat) > 2 ->
+ Tab = element(1, Pat),
+ match_object(Tab, Pat, read);
+match_object(Pat) ->
+ abort({bad_type, Pat}).
+
+match_object(Tab, Pat, LockKind) ->
+ case get(mnesia_activity_state) of
+ {?DEFAULT_ACCESS, Tid, Ts} ->
+ match_object(Tid, Ts, Tab, Pat, LockKind);
+ {Mod, Tid, Ts} ->
+ Mod:match_object(Tid, Ts, Tab, Pat, LockKind);
+ _ ->
+ abort(no_transaction)
+ end.
+
+match_object(Tid, Ts, Tab, Pat, LockKind)
+ when atom(Tab), Tab /= schema, tuple(Pat), size(Pat) > 2 ->
+ case element(1, Tid) of
+ ets ->
+ mnesia_lib:db_match_object(ram_copies, Tab, Pat);
+ tid ->
+ Key = element(2, Pat),
+ case has_var(Key) of
+ false -> lock_record(Tid, Ts, Tab, Key, LockKind);
+ true -> lock_table(Tid, Ts, Tab, LockKind)
+ end,
+ Objs = dirty_match_object(Tab, Pat),
+ add_written_match(Ts#tidstore.store, Pat, Tab, Objs);
+ _Protocol ->
+ dirty_match_object(Tab, Pat)
+ end;
+match_object(_Tid, _Ts, Tab, Pat, _LockKind) ->
+ abort({bad_type, Tab, Pat}).
+
+add_written_match(S, Pat, Tab, Objs) ->
+ Ops = find_ops(S, Tab, Pat),
+ add_match(Ops, Objs, val({Tab, setorbag})).
+
+find_ops(S, Tab, Pat) ->
+ GetWritten = [{{{Tab, '_'}, Pat, write}, [], ['$_']},
+ {{{Tab, '_'}, '_', delete}, [], ['$_']},
+ {{{Tab, '_'}, Pat, delete_object}, [], ['$_']}],
+ ets:select(S, GetWritten).
+
+add_match([], Objs, _Type) ->
+ Objs;
+add_match(Written, Objs, ordered_set) ->
+ %% Must use keysort which is stable
+ add_ordered_match(lists:keysort(1,Written), Objs, []);
+add_match([{Oid, _, delete}|R], Objs, Type) ->
+ add_match(R, deloid(Oid, Objs), Type);
+add_match([{_Oid, Val, delete_object}|R], Objs, Type) ->
+ add_match(R, lists:delete(Val, Objs), Type);
+add_match([{_Oid, Val, write}|R], Objs, bag) ->
+ add_match(R, [Val | lists:delete(Val, Objs)], bag);
+add_match([{Oid, Val, write}|R], Objs, set) ->
+ add_match(R, [Val | deloid(Oid,Objs)],set).
+
+%% For ordered_set only !!
+add_ordered_match(Written = [{{_, Key}, _, _}|_], [Obj|Objs], Acc)
+ when Key > element(2, Obj) ->
+ add_ordered_match(Written, Objs, [Obj|Acc]);
+add_ordered_match([{{_, Key}, Val, write}|Rest], Objs =[Obj|_], Acc)
+ when Key < element(2, Obj) ->
+ add_ordered_match(Rest, [Val|Objs],Acc);
+add_ordered_match([{{_, Key}, _, _DelOP}|Rest], Objs =[Obj|_], Acc)
+ when Key < element(2, Obj) ->
+ add_ordered_match(Rest,Objs,Acc);
+%% Greater than last object
+add_ordered_match([{_, Val, write}|Rest], [], Acc) ->
+ add_ordered_match(Rest, [Val], Acc);
+add_ordered_match([_|Rest], [], Acc) ->
+ add_ordered_match(Rest, [], Acc);
+%% Keys are equal from here
+add_ordered_match([{_, Val, write}|Rest], [_Obj|Objs], Acc) ->
+ add_ordered_match(Rest, [Val|Objs], Acc);
+add_ordered_match([{_, _Val, delete}|Rest], [_Obj|Objs], Acc) ->
+ add_ordered_match(Rest, Objs, Acc);
+add_ordered_match([{_, Val, delete_object}|Rest], [Val|Objs], Acc) ->
+ add_ordered_match(Rest, Objs, Acc);
+add_ordered_match([{_, _, delete_object}|Rest], Objs, Acc) ->
+ add_ordered_match(Rest, Objs, Acc);
+add_ordered_match([], Objs, Acc) ->
+ lists:reverse(Acc, Objs).
+
+
+%%%%%%%%%%%%%%%%%%
+% select
+
+select(Tab, Pat) ->
+ select(Tab, Pat, read).
+select(Tab, Pat, LockKind)
+ when atom(Tab), Tab /= schema, list(Pat) ->
+ case get(mnesia_activity_state) of
+ {?DEFAULT_ACCESS, Tid, Ts} ->
+ select(Tid, Ts, Tab, Pat, LockKind);
+ {Mod, Tid, Ts} ->
+ Mod:select(Tid, Ts, Tab, Pat, LockKind);
+ _ ->
+ abort(no_transaction)
+ end;
+select(Tab, Pat, _Lock) ->
+ abort({badarg, Tab, Pat}).
+
+select(Tid, Ts, Tab, Spec, LockKind) ->
+ SelectFun = fun(FixedSpec) -> dirty_select(Tab, FixedSpec) end,
+ fun_select(Tid, Ts, Tab, Spec, LockKind, Tab, SelectFun).
+
+fun_select(Tid, Ts, Tab, Spec, LockKind, TabPat, SelectFun) ->
+ case element(1, Tid) of
+ ets ->
+ mnesia_lib:db_select(ram_copies, Tab, Spec);
+ tid ->
+ Store = Ts#tidstore.store,
+ Written = ?ets_match_object(Store, {{TabPat, '_'}, '_', '_'}),
+ %% Avoid table lock if possible
+ case Spec of
+ [{HeadPat,_, _}] when tuple(HeadPat), size(HeadPat) > 2 ->
+ Key = element(2, HeadPat),
+ case has_var(Key) of
+ false -> lock_record(Tid, Ts, Tab, Key, LockKind);
+ true -> lock_table(Tid, Ts, Tab, LockKind)
+ end;
+ _ ->
+ lock_table(Tid, Ts, Tab, LockKind)
+ end,
+ case Written of
+ [] ->
+ %% Nothing changed in the table during this transaction,
+ %% Simple case get results from [d]ets
+ SelectFun(Spec);
+ _ ->
+ %% Hard (slow case) records added or deleted earlier
+ %% in the transaction, have to cope with that.
+ Type = val({Tab, setorbag}),
+ FixedSpec = get_record_pattern(Spec),
+ TabRecs = SelectFun(FixedSpec),
+ FixedRes = add_match(Written, TabRecs, Type),
+ CMS = ets:match_spec_compile(Spec),
+% case Type of
+% ordered_set ->
+% ets:match_spec_run(lists:sort(FixedRes), CMS);
+% _ ->
+% ets:match_spec_run(FixedRes, CMS)
+% end
+ ets:match_spec_run(FixedRes, CMS)
+ end;
+ _Protocol ->
+ SelectFun(Spec)
+ end.
+
+get_record_pattern([]) ->
+ [];
+get_record_pattern([{M,C,_B}|R]) ->
+ [{M,C,['$_']} | get_record_pattern(R)].
+
+deloid(_Oid, []) ->
+ [];
+deloid({Tab, Key}, [H | T]) when element(2, H) == Key ->
+ deloid({Tab, Key}, T);
+deloid(Oid, [H | T]) ->
+ [H | deloid(Oid, T)].
+
+all_keys(Tab) ->
+ case get(mnesia_activity_state) of
+ {?DEFAULT_ACCESS, Tid, Ts} ->
+ all_keys(Tid, Ts, Tab, read);
+ {Mod, Tid, Ts} ->
+ Mod:all_keys(Tid, Ts, Tab, read);
+ _ ->
+ abort(no_transaction)
+ end.
+
+all_keys(Tid, Ts, Tab, LockKind)
+ when atom(Tab), Tab /= schema ->
+ Pat0 = val({Tab, wild_pattern}),
+ Pat = setelement(2, Pat0, '$1'),
+ Keys = select(Tid, Ts, Tab, [{Pat, [], ['$1']}], LockKind),
+ case val({Tab, setorbag}) of
+ bag ->
+ mnesia_lib:uniq(Keys);
+ _ ->
+ Keys
+ end;
+all_keys(_Tid, _Ts, Tab, _LockKind) ->
+ abort({bad_type, Tab}).
+
+index_match_object(Pat, Attr) when tuple(Pat), size(Pat) > 2 ->
+ Tab = element(1, Pat),
+ index_match_object(Tab, Pat, Attr, read);
+index_match_object(Pat, _Attr) ->
+ abort({bad_type, Pat}).
+
+index_match_object(Tab, Pat, Attr, LockKind) ->
+ case get(mnesia_activity_state) of
+ {?DEFAULT_ACCESS, Tid, Ts} ->
+ index_match_object(Tid, Ts, Tab, Pat, Attr, LockKind);
+ {Mod, Tid, Ts} ->
+ Mod:index_match_object(Tid, Ts, Tab, Pat, Attr, LockKind);
+ _ ->
+ abort(no_transaction)
+ end.
+
+index_match_object(Tid, Ts, Tab, Pat, Attr, LockKind)
+ when atom(Tab), Tab /= schema, tuple(Pat), size(Pat) > 2 ->
+ case element(1, Tid) of
+ ets ->
+ dirty_index_match_object(Tab, Pat, Attr); % Should be optimized?
+ tid ->
+ case mnesia_schema:attr_tab_to_pos(Tab, Attr) of
+ Pos when Pos =< size(Pat) ->
+ case LockKind of
+ read ->
+ Store = Ts#tidstore.store,
+ mnesia_locker:rlock_table(Tid, Store, Tab),
+ Objs = dirty_index_match_object(Tab, Pat, Attr),
+ add_written_match(Store, Pat, Tab, Objs);
+ _ ->
+ abort({bad_type, Tab, LockKind})
+ end;
+ BadPos ->
+ abort({bad_type, Tab, BadPos})
+ end;
+ _Protocol ->
+ dirty_index_match_object(Tab, Pat, Attr)
+ end;
+index_match_object(_Tid, _Ts, Tab, Pat, _Attr, _LockKind) ->
+ abort({bad_type, Tab, Pat}).
+
+index_read(Tab, Key, Attr) ->
+ case get(mnesia_activity_state) of
+ {?DEFAULT_ACCESS, Tid, Ts} ->
+ index_read(Tid, Ts, Tab, Key, Attr, read);
+ {Mod, Tid, Ts} ->
+ Mod:index_read(Tid, Ts, Tab, Key, Attr, read);
+ _ ->
+ abort(no_transaction)
+ end.
+
+index_read(Tid, Ts, Tab, Key, Attr, LockKind)
+ when atom(Tab), Tab /= schema ->
+ case element(1, Tid) of
+ ets ->
+ dirty_index_read(Tab, Key, Attr); % Should be optimized?
+ tid ->
+ Pos = mnesia_schema:attr_tab_to_pos(Tab, Attr),
+ case LockKind of
+ read ->
+ case has_var(Key) of
+ false ->
+ Store = Ts#tidstore.store,
+ Objs = mnesia_index:read(Tid, Store, Tab, Key, Pos),
+ Pat = setelement(Pos, val({Tab, wild_pattern}), Key),
+ add_written_match(Store, Pat, Tab, Objs);
+ true ->
+ abort({bad_type, Tab, Attr, Key})
+ end;
+ _ ->
+ abort({bad_type, Tab, LockKind})
+ end;
+ _Protocol ->
+ dirty_index_read(Tab, Key, Attr)
+ end;
+index_read(_Tid, _Ts, Tab, _Key, _Attr, _LockKind) ->
+ abort({bad_type, Tab}).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Dirty access regardless of activities - updates
+
+dirty_write(Val) when tuple(Val), size(Val) > 2 ->
+ Tab = element(1, Val),
+ dirty_write(Tab, Val);
+dirty_write(Val) ->
+ abort({bad_type, Val}).
+
+dirty_write(Tab, Val) ->
+ do_dirty_write(async_dirty, Tab, Val).
+
+do_dirty_write(SyncMode, Tab, Val)
+ when atom(Tab), Tab /= schema, tuple(Val), size(Val) > 2 ->
+ case ?catch_val({Tab, record_validation}) of
+ {RecName, Arity, _Type}
+ when size(Val) == Arity, RecName == element(1, Val) ->
+ Oid = {Tab, element(2, Val)},
+ mnesia_tm:dirty(SyncMode, {Oid, Val, write});
+ {'EXIT', _} ->
+ abort({no_exists, Tab});
+ _ ->
+ abort({bad_type, Val})
+ end;
+do_dirty_write(_SyncMode, Tab, Val) ->
+ abort({bad_type, Tab, Val}).
+
+dirty_delete({Tab, Key}) ->
+ dirty_delete(Tab, Key);
+dirty_delete(Oid) ->
+ abort({bad_type, Oid}).
+
+dirty_delete(Tab, Key) ->
+ do_dirty_delete(async_dirty, Tab, Key).
+
+do_dirty_delete(SyncMode, Tab, Key) when atom(Tab), Tab /= schema ->
+ Oid = {Tab, Key},
+ mnesia_tm:dirty(SyncMode, {Oid, Oid, delete});
+do_dirty_delete(_SyncMode, Tab, _Key) ->
+ abort({bad_type, Tab}).
+
+dirty_delete_object(Val) when tuple(Val), size(Val) > 2 ->
+ Tab = element(1, Val),
+ dirty_delete_object(Tab, Val);
+dirty_delete_object(Val) ->
+ abort({bad_type, Val}).
+
+dirty_delete_object(Tab, Val) ->
+ do_dirty_delete_object(async_dirty, Tab, Val).
+
+do_dirty_delete_object(SyncMode, Tab, Val)
+ when atom(Tab), Tab /= schema, tuple(Val), size(Val) > 2 ->
+ Oid = {Tab, element(2, Val)},
+ mnesia_tm:dirty(SyncMode, {Oid, Val, delete_object});
+do_dirty_delete_object(_SyncMode, Tab, Val) ->
+ abort({bad_type, Tab, Val}).
+
+%% A Counter is an Oid being {CounterTab, CounterName}
+
+dirty_update_counter({Tab, Key}, Incr) ->
+ dirty_update_counter(Tab, Key, Incr);
+dirty_update_counter(Counter, _Incr) ->
+ abort({bad_type, Counter}).
+
+dirty_update_counter(Tab, Key, Incr) ->
+ do_dirty_update_counter(async_dirty, Tab, Key, Incr).
+
+do_dirty_update_counter(SyncMode, Tab, Key, Incr)
+ when atom(Tab), Tab /= schema, integer(Incr) ->
+ case ?catch_val({Tab, record_validation}) of
+ {RecName, 3, set} ->
+ Oid = {Tab, Key},
+ mnesia_tm:dirty(SyncMode, {Oid, {RecName, Incr}, update_counter});
+ _ ->
+ abort({combine_error, Tab, update_counter})
+ end;
+do_dirty_update_counter(_SyncMode, Tab, _Key, Incr) ->
+ abort({bad_type, Tab, Incr}).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Dirty access regardless of activities - read
+
+dirty_read({Tab, Key}) ->
+ dirty_read(Tab, Key);
+dirty_read(Oid) ->
+ abort({bad_type, Oid}).
+
+dirty_read(Tab, Key)
+ when atom(Tab), Tab /= schema ->
+%% case catch ?ets_lookup(Tab, Key) of
+%% {'EXIT', _} ->
+ %% Bad luck, we have to perform a real lookup
+ dirty_rpc(Tab, mnesia_lib, db_get, [Tab, Key]);
+%% Val ->
+%% Val
+%% end;
+dirty_read(Tab, _Key) ->
+ abort({bad_type, Tab}).
+
+dirty_match_object(Pat) when tuple(Pat), size(Pat) > 2 ->
+ Tab = element(1, Pat),
+ dirty_match_object(Tab, Pat);
+dirty_match_object(Pat) ->
+ abort({bad_type, Pat}).
+
+dirty_match_object(Tab, Pat)
+ when atom(Tab), Tab /= schema, tuple(Pat), size(Pat) > 2 ->
+ dirty_rpc(Tab, ?MODULE, remote_dirty_match_object, [Tab, Pat]);
+dirty_match_object(Tab, Pat) ->
+ abort({bad_type, Tab, Pat}).
+
+remote_dirty_match_object(Tab, Pat) ->
+ Key = element(2, Pat),
+ case has_var(Key) of
+ false ->
+ mnesia_lib:db_match_object(Tab, Pat);
+ true ->
+ PosList = val({Tab, index}),
+ remote_dirty_match_object(Tab, Pat, PosList)
+ end.
+
+remote_dirty_match_object(Tab, Pat, [Pos | Tail]) when Pos =< size(Pat) ->
+ IxKey = element(Pos, Pat),
+ case has_var(IxKey) of
+ false ->
+ mnesia_index:dirty_match_object(Tab, Pat, Pos);
+ true ->
+ remote_dirty_match_object(Tab, Pat, Tail)
+ end;
+remote_dirty_match_object(Tab, Pat, []) ->
+ mnesia_lib:db_match_object(Tab, Pat);
+remote_dirty_match_object(Tab, Pat, _PosList) ->
+ abort({bad_type, Tab, Pat}).
+
+dirty_select(Tab, Spec) when atom(Tab), Tab /= schema, list(Spec) ->
+ dirty_rpc(Tab, ?MODULE, remote_dirty_select, [Tab, Spec]);
+dirty_select(Tab, Spec) ->
+ abort({bad_type, Tab, Spec}).
+
+remote_dirty_select(Tab, Spec) ->
+ case Spec of
+ [{HeadPat, _, _}] when tuple(HeadPat), size(HeadPat) > 2 ->
+ Key = element(2, HeadPat),
+ case has_var(Key) of
+ false ->
+ mnesia_lib:db_select(Tab, Spec);
+ true ->
+ PosList = val({Tab, index}),
+ remote_dirty_select(Tab, Spec, PosList)
+ end;
+ _ ->
+ mnesia_lib:db_select(Tab, Spec)
+ end.
+
+remote_dirty_select(Tab, [{HeadPat,_, _}] = Spec, [Pos | Tail])
+ when tuple(HeadPat), size(HeadPat) > 2, Pos =< size(Spec) ->
+ Key = element(Pos, HeadPat),
+ case has_var(Key) of
+ false ->
+ Recs = mnesia_index:dirty_select(Tab, Spec, Pos),
+ %% Returns the records without applying the match spec
+ %% The actual filtering is handled by the caller
+ CMS = ets:match_spec_compile(Spec),
+ case val({Tab, setorbag}) of
+ ordered_set ->
+ ets:match_spec_run(lists:sort(Recs), CMS);
+ _ ->
+ ets:match_spec_run(Recs, CMS)
+ end;
+ true ->
+ remote_dirty_select(Tab, Spec, Tail)
+ end;
+remote_dirty_select(Tab, Spec, _) ->
+ mnesia_lib:db_select(Tab, Spec).
+
+dirty_all_keys(Tab) when atom(Tab), Tab /= schema ->
+ case ?catch_val({Tab, wild_pattern}) of
+ {'EXIT', _} ->
+ abort({no_exists, Tab});
+ Pat0 ->
+ Pat = setelement(2, Pat0, '$1'),
+ Keys = dirty_select(Tab, [{Pat, [], ['$1']}]),
+ case val({Tab, setorbag}) of
+ bag -> mnesia_lib:uniq(Keys);
+ _ -> Keys
+ end
+ end;
+dirty_all_keys(Tab) ->
+ abort({bad_type, Tab}).
+
+dirty_index_match_object(Pat, Attr) when tuple(Pat), size(Pat) > 2 ->
+ Tab = element(1, Pat),
+ dirty_index_match_object(Tab, Pat, Attr);
+dirty_index_match_object(Pat, _Attr) ->
+ abort({bad_type, Pat}).
+
+dirty_index_match_object(Tab, Pat, Attr)
+ when atom(Tab), Tab /= schema, tuple(Pat), size(Pat) > 2 ->
+ case mnesia_schema:attr_tab_to_pos(Tab, Attr) of
+ Pos when Pos =< size(Pat) ->
+ case has_var(element(2, Pat)) of
+ false ->
+ dirty_match_object(Tab, Pat);
+ true ->
+ Elem = element(Pos, Pat),
+ case has_var(Elem) of
+ false ->
+ dirty_rpc(Tab, mnesia_index, dirty_match_object,
+ [Tab, Pat, Pos]);
+ true ->
+ abort({bad_type, Tab, Attr, Elem})
+ end
+ end;
+ BadPos ->
+ abort({bad_type, Tab, BadPos})
+ end;
+dirty_index_match_object(Tab, Pat, _Attr) ->
+ abort({bad_type, Tab, Pat}).
+
+dirty_index_read(Tab, Key, Attr) when atom(Tab), Tab /= schema ->
+ Pos = mnesia_schema:attr_tab_to_pos(Tab, Attr),
+ case has_var(Key) of
+ false ->
+ mnesia_index:dirty_read(Tab, Key, Pos);
+ true ->
+ abort({bad_type, Tab, Attr, Key})
+ end;
+dirty_index_read(Tab, _Key, _Attr) ->
+ abort({bad_type, Tab}).
+
+dirty_slot(Tab, Slot) when atom(Tab), Tab /= schema, integer(Slot) ->
+ dirty_rpc(Tab, mnesia_lib, db_slot, [Tab, Slot]);
+dirty_slot(Tab, Slot) ->
+ abort({bad_type, Tab, Slot}).
+
+dirty_first(Tab) when atom(Tab), Tab /= schema ->
+ dirty_rpc(Tab, mnesia_lib, db_first, [Tab]);
+dirty_first(Tab) ->
+ abort({bad_type, Tab}).
+
+dirty_last(Tab) when atom(Tab), Tab /= schema ->
+ dirty_rpc(Tab, mnesia_lib, db_last, [Tab]);
+dirty_last(Tab) ->
+ abort({bad_type, Tab}).
+
+dirty_next(Tab, Key) when atom(Tab), Tab /= schema ->
+ dirty_rpc(Tab, mnesia_lib, db_next_key, [Tab, Key]);
+dirty_next(Tab, _Key) ->
+ abort({bad_type, Tab}).
+
+dirty_prev(Tab, Key) when atom(Tab), Tab /= schema ->
+ dirty_rpc(Tab, mnesia_lib, db_prev_key, [Tab, Key]);
+dirty_prev(Tab, _Key) ->
+ abort({bad_type, Tab}).
+
+
+dirty_rpc(Tab, M, F, Args) ->
+ Node = val({Tab, where_to_read}),
+ do_dirty_rpc(Tab, Node, M, F, Args).
+
+do_dirty_rpc(_Tab, nowhere, _, _, Args) ->
+ mnesia:abort({no_exists, Args});
+do_dirty_rpc(Tab, Node, M, F, Args) ->
+ case rpc:call(Node, M, F, Args) of
+ {badrpc,{'EXIT', {undef, [{ M, F, _} | _]}}}
+ when M == ?MODULE, F == remote_dirty_select ->
+ %% Oops, the other node has not been upgraded
+ %% to 4.0.3 yet. Lets do it the old way.
+ %% Remove this in next release.
+ do_dirty_rpc(Tab, Node, mnesia_lib, db_select, Args);
+ {badrpc, Reason} ->
+ erlang:yield(), %% Do not be too eager
+ case mnesia_controller:call({check_w2r, Node, Tab}) of % Sync
+ NewNode when NewNode == Node ->
+ ErrorTag = mnesia_lib:dirty_rpc_error_tag(Reason),
+ mnesia:abort({ErrorTag, Args});
+ NewNode ->
+ case get(mnesia_activity_state) of
+ {_Mod, Tid, _Ts} when record(Tid, tid) ->
+ %% In order to perform a consistent
+ %% retry of a transaction we need
+ %% to acquire the lock on the NewNode.
+ %% In this context we do neither know
+ %% the kind or granularity of the lock.
+ %% --> Abort the transaction
+ mnesia:abort({node_not_running, Node});
+ _ ->
+ %% Splendid! A dirty retry is safe
+ %% 'Node' probably went down now
+ %% Let mnesia_controller get broken link message first
+ do_dirty_rpc(Tab, NewNode, M, F, Args)
+ end
+ end;
+ Other ->
+ Other
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Info
+
+%% Info about one table
+table_info(Tab, Item) ->
+ case get(mnesia_activity_state) of
+ undefined ->
+ any_table_info(Tab, Item);
+ {?DEFAULT_ACCESS, _Tid, _Ts} ->
+ any_table_info(Tab, Item);
+ {Mod, Tid, Ts} ->
+ Mod:table_info(Tid, Ts, Tab, Item);
+ _ ->
+ abort(no_transaction)
+ end.
+
+table_info(_Tid, _Ts, Tab, Item) ->
+ any_table_info(Tab, Item).
+
+
+any_table_info(Tab, Item) when atom(Tab) ->
+ case Item of
+ master_nodes ->
+ mnesia_recover:get_master_nodes(Tab);
+% checkpoints ->
+% case ?catch_val({Tab, commit_work}) of
+% [{checkpoints, List} | _] -> List;
+% No_chk when list(No_chk) -> [];
+% Else -> info_reply(Else, Tab, Item)
+% end;
+ size ->
+ raw_table_info(Tab, Item);
+ memory ->
+ raw_table_info(Tab, Item);
+ type ->
+ case ?catch_val({Tab, setorbag}) of
+ {'EXIT', _} ->
+ bad_info_reply(Tab, Item);
+ Val ->
+ Val
+ end;
+ all ->
+ case mnesia_schema:get_table_properties(Tab) of
+ [] ->
+ abort({no_exists, Tab, Item});
+ Props ->
+ lists:map(fun({setorbag, Type}) -> {type, Type};
+ (Prop) -> Prop end,
+ Props)
+ end;
+ _ ->
+ case ?catch_val({Tab, Item}) of
+ {'EXIT', _} ->
+ bad_info_reply(Tab, Item);
+ Val ->
+ Val
+ end
+ end;
+any_table_info(Tab, _Item) ->
+ abort({bad_type, Tab}).
+
+raw_table_info(Tab, Item) ->
+ case ?catch_val({Tab, storage_type}) of
+ ram_copies ->
+ info_reply(catch ?ets_info(Tab, Item), Tab, Item);
+ disc_copies ->
+ info_reply(catch ?ets_info(Tab, Item), Tab, Item);
+ disc_only_copies ->
+ info_reply(catch dets:info(Tab, Item), Tab, Item);
+ unknown ->
+ bad_info_reply(Tab, Item);
+ {'EXIT', _} ->
+ bad_info_reply(Tab, Item)
+ end.
+
+info_reply({'EXIT', _Reason}, Tab, Item) ->
+ bad_info_reply(Tab, Item);
+info_reply({error, _Reason}, Tab, Item) ->
+ bad_info_reply(Tab, Item);
+info_reply(Val, _Tab, _Item) ->
+ Val.
+
+bad_info_reply(_Tab, size) -> 0;
+bad_info_reply(_Tab, memory) -> 0;
+bad_info_reply(Tab, Item) -> abort({no_exists, Tab, Item}).
+
+%% Raw info about all tables
+schema() ->
+ mnesia_schema:info().
+
+%% Raw info about one tables
+schema(Tab) ->
+ mnesia_schema:info(Tab).
+
+error_description(Err) ->
+ mnesia_lib:error_desc(Err).
+
+info() ->
+ case mnesia_lib:is_running() of
+ yes ->
+ TmInfo = mnesia_tm:get_info(10000),
+ Held = system_info(held_locks),
+ Queued = system_info(lock_queue),
+
+ io:format("---> Processes holding locks <--- ~n", []),
+ lists:foreach(fun(L) -> io:format("Lock: ~p~n", [L]) end,
+ Held),
+
+ io:format( "---> Processes waiting for locks <--- ~n", []),
+ lists:foreach(fun({Oid, Op, _Pid, Tid, OwnerTid}) ->
+ io:format("Tid ~p waits for ~p lock "
+ "on oid ~p owned by ~p ~n",
+ [Tid, Op, Oid, OwnerTid])
+ end, Queued),
+ mnesia_tm:display_info(group_leader(), TmInfo),
+
+ Pat = {'_', unclear, '_'},
+ Uncertain = ets:match_object(mnesia_decision, Pat),
+
+ io:format( "---> Uncertain transactions <--- ~n", []),
+ lists:foreach(fun({Tid, _, Nodes}) ->
+ io:format("Tid ~w waits for decision "
+ "from ~w~n",
+ [Tid, Nodes])
+ end, Uncertain),
+
+ mnesia_controller:info(),
+ display_system_info(Held, Queued, TmInfo, Uncertain);
+ _ ->
+ mini_info()
+ end,
+ ok.
+
+mini_info() ->
+ io:format("===> System info in version ~p, debug level = ~p <===~n",
+ [system_info(version), system_info(debug)]),
+ Not =
+ case system_info(use_dir) of
+ true -> "";
+ false -> "NOT "
+ end,
+
+ io:format("~w. Directory ~p is ~sused.~n",
+ [system_info(schema_location), system_info(directory), Not]),
+ io:format("use fallback at restart = ~w~n",
+ [system_info(fallback_activated)]),
+ Running = system_info(running_db_nodes),
+ io:format("running db nodes = ~w~n", [Running]),
+ All = mnesia_lib:all_nodes(),
+ io:format("stopped db nodes = ~w ~n", [All -- Running]).
+
+display_system_info(Held, Queued, TmInfo, Uncertain) ->
+ mini_info(),
+ display_tab_info(),
+ S = fun(Items) -> [system_info(I) || I <- Items] end,
+
+ io:format("~w transactions committed, ~w aborted, "
+ "~w restarted, ~w logged to disc~n",
+ S([transaction_commits, transaction_failures,
+ transaction_restarts, transaction_log_writes])),
+
+ {Active, Pending} =
+ case TmInfo of
+ {timeout, _} -> {infinity, infinity};
+ {info, P, A} -> {length(A), length(P)}
+ end,
+ io:format("~w held locks, ~w in queue; "
+ "~w local transactions, ~w remote~n",
+ [length(Held), length(Queued), Active, Pending]),
+
+ Ufold = fun({_, _, Ns}, {C, Old}) ->
+ New = [N || N <- Ns, not lists:member(N, Old)],
+ {C + 1, New ++ Old}
+ end,
+ {Ucount, Unodes} = lists:foldl(Ufold, {0, []}, Uncertain),
+ io:format("~w transactions waits for other nodes: ~p~n",
+ [Ucount, Unodes]).
+
+display_tab_info() ->
+ MasterTabs = mnesia_recover:get_master_node_tables(),
+ io:format("master node tables = ~p~n", [lists:sort(MasterTabs)]),
+
+ Tabs = system_info(tables),
+
+ {Unknown, Ram, Disc, DiscOnly} =
+ lists:foldl(fun storage_count/2, {[], [], [], []}, Tabs),
+
+ io:format("remote = ~p~n", [lists:sort(Unknown)]),
+ io:format("ram_copies = ~p~n", [lists:sort(Ram)]),
+ io:format("disc_copies = ~p~n", [lists:sort(Disc)]),
+ io:format("disc_only_copies = ~p~n", [lists:sort(DiscOnly)]),
+
+ Rfoldl = fun(T, Acc) ->
+ Rpat =
+ case val({T, access_mode}) of
+ read_only ->
+ lists:sort([{A, read_only} || A <- val({T, active_replicas})]);
+ read_write ->
+ table_info(T, where_to_commit)
+ end,
+ case lists:keysearch(Rpat, 1, Acc) of
+ {value, {_Rpat, Rtabs}} ->
+ lists:keyreplace(Rpat, 1, Acc, {Rpat, [T | Rtabs]});
+ false ->
+ [{Rpat, [T]} | Acc]
+ end
+ end,
+ Repl = lists:foldl(Rfoldl, [], Tabs),
+ Rdisp = fun({Rpat, Rtabs}) -> io:format("~p = ~p~n", [Rpat, Rtabs]) end,
+ lists:foreach(Rdisp, lists:sort(Repl)).
+
+storage_count(T, {U, R, D, DO}) ->
+ case table_info(T, storage_type) of
+ unknown -> {[T | U], R, D, DO};
+ ram_copies -> {U, [T | R], D, DO};
+ disc_copies -> {U, R, [T | D], DO};
+ disc_only_copies -> {U, R, D, [T | DO]}
+ end.
+
+system_info(Item) ->
+ case catch system_info2(Item) of
+ {'EXIT',Error} -> abort(Error);
+ Other -> Other
+ end.
+
+system_info2(all) ->
+ Items = system_info_items(mnesia_lib:is_running()),
+ [{I, system_info(I)} || I <- Items];
+
+system_info2(db_nodes) ->
+ DiscNs = ?catch_val({schema, disc_copies}),
+ RamNs = ?catch_val({schema, ram_copies}),
+ if
+ list(DiscNs), list(RamNs) ->
+ DiscNs ++ RamNs;
+ true ->
+ case mnesia_schema:read_nodes() of
+ {ok, Nodes} -> Nodes;
+ {error,Reason} -> exit(Reason)
+ end
+ end;
+system_info2(running_db_nodes) ->
+ case ?catch_val({current, db_nodes}) of
+ {'EXIT',_} ->
+ %% Ensure that we access the intended Mnesia
+ %% directory. This function may not be called
+ %% during startup since it will cause the
+ %% application_controller to get into deadlock
+ load_mnesia_or_abort(),
+ mnesia_lib:running_nodes();
+ Other ->
+ Other
+ end;
+
+system_info2(extra_db_nodes) ->
+ case ?catch_val(extra_db_nodes) of
+ {'EXIT',_} ->
+ %% Ensure that we access the intended Mnesia
+ %% directory. This function may not be called
+ %% during startup since it will cause the
+ %% application_controller to get into deadlock
+ load_mnesia_or_abort(),
+ mnesia_monitor:get_env(extra_db_nodes);
+ Other ->
+ Other
+ end;
+
+system_info2(directory) ->
+ case ?catch_val(directory) of
+ {'EXIT',_} ->
+ %% Ensure that we access the intended Mnesia
+ %% directory. This function may not be called
+ %% during startup since it will cause the
+ %% application_controller to get into deadlock
+ load_mnesia_or_abort(),
+ mnesia_monitor:get_env(dir);
+ Other ->
+ Other
+ end;
+
+system_info2(use_dir) ->
+ case ?catch_val(use_dir) of
+ {'EXIT',_} ->
+ %% Ensure that we access the intended Mnesia
+ %% directory. This function may not be called
+ %% during startup since it will cause the
+ %% application_controller to get into deadlock
+ load_mnesia_or_abort(),
+ mnesia_monitor:use_dir();
+ Other ->
+ Other
+ end;
+
+system_info2(schema_location) ->
+ case ?catch_val(schema_location) of
+ {'EXIT',_} ->
+ %% Ensure that we access the intended Mnesia
+ %% directory. This function may not be called
+ %% during startup since it will cause the
+ %% application_controller to get into deadlock
+ load_mnesia_or_abort(),
+ mnesia_monitor:get_env(schema_location);
+ Other ->
+ Other
+ end;
+
+system_info2(fallback_activated) ->
+ case ?catch_val(fallback_activated) of
+ {'EXIT',_} ->
+ %% Ensure that we access the intended Mnesia
+ %% directory. This function may not be called
+ %% during startup since it will cause the
+ %% application_controller to get into deadlock
+ load_mnesia_or_abort(),
+ mnesia_bup:fallback_exists();
+ Other ->
+ Other
+ end;
+
+system_info2(version) ->
+ case ?catch_val(version) of
+ {'EXIT', _} ->
+ Apps = application:loaded_applications(),
+ case lists:keysearch(?APPLICATION, 1, Apps) of
+ {value, {_Name, _Desc, Version}} ->
+ Version;
+ false ->
+ %% Ensure that it does not match
+ {mnesia_not_loaded, node(), now()}
+ end;
+ Version ->
+ Version
+ end;
+
+system_info2(access_module) -> mnesia_monitor:get_env(access_module);
+system_info2(auto_repair) -> mnesia_monitor:get_env(auto_repair);
+system_info2(is_running) -> mnesia_lib:is_running();
+system_info2(backup_module) -> mnesia_monitor:get_env(backup_module);
+system_info2(event_module) -> mnesia_monitor:get_env(event_module);
+system_info2(debug) -> mnesia_monitor:get_env(debug);
+system_info2(dump_log_load_regulation) -> mnesia_monitor:get_env(dump_log_load_regulation);
+system_info2(dump_log_write_threshold) -> mnesia_monitor:get_env(dump_log_write_threshold);
+system_info2(dump_log_time_threshold) -> mnesia_monitor:get_env(dump_log_time_threshold);
+system_info2(dump_log_update_in_place) ->
+ mnesia_monitor:get_env(dump_log_update_in_place);
+system_info2(dump_log_update_in_place) ->
+ mnesia_monitor:get_env(dump_log_update_in_place);
+system_info2(max_wait_for_decision) -> mnesia_monitor:get_env(max_wait_for_decision);
+system_info2(embedded_mnemosyne) -> mnesia_monitor:get_env(embedded_mnemosyne);
+system_info2(ignore_fallback_at_startup) -> mnesia_monitor:get_env(ignore_fallback_at_startup);
+system_info2(fallback_error_function) -> mnesia_monitor:get_env(fallback_error_function);
+system_info2(log_version) -> mnesia_log:version();
+system_info2(protocol_version) -> mnesia_monitor:protocol_version();
+system_info2(schema_version) -> mnesia_schema:version(); %backward compatibility
+system_info2(tables) -> val({schema, tables});
+system_info2(local_tables) -> val({schema, local_tables});
+system_info2(master_node_tables) -> mnesia_recover:get_master_node_tables();
+system_info2(subscribers) -> mnesia_subscr:subscribers();
+system_info2(checkpoints) -> mnesia_checkpoint:checkpoints();
+system_info2(held_locks) -> mnesia_locker:get_held_locks();
+system_info2(lock_queue) -> mnesia_locker:get_lock_queue();
+system_info2(transactions) -> mnesia_tm:get_transactions();
+system_info2(transaction_failures) -> mnesia_lib:read_counter(trans_failures);
+system_info2(transaction_commits) -> mnesia_lib:read_counter(trans_commits);
+system_info2(transaction_restarts) -> mnesia_lib:read_counter(trans_restarts);
+system_info2(transaction_log_writes) -> mnesia_dumper:get_log_writes();
+
+system_info2(Item) -> exit({badarg, Item}).
+
+system_info_items(yes) ->
+ [
+ access_module,
+ auto_repair,
+ backup_module,
+ checkpoints,
+ db_nodes,
+ debug,
+ directory,
+ dump_log_load_regulation,
+ dump_log_time_threshold,
+ dump_log_update_in_place,
+ dump_log_write_threshold,
+ embedded_mnemosyne,
+ event_module,
+ extra_db_nodes,
+ fallback_activated,
+ held_locks,
+ ignore_fallback_at_startup,
+ fallback_error_function,
+ is_running,
+ local_tables,
+ lock_queue,
+ log_version,
+ master_node_tables,
+ max_wait_for_decision,
+ protocol_version,
+ running_db_nodes,
+ schema_location,
+ schema_version,
+ subscribers,
+ tables,
+ transaction_commits,
+ transaction_failures,
+ transaction_log_writes,
+ transaction_restarts,
+ transactions,
+ use_dir,
+ version
+ ];
+system_info_items(no) ->
+ [
+ auto_repair,
+ backup_module,
+ db_nodes,
+ debug,
+ directory,
+ dump_log_load_regulation,
+ dump_log_time_threshold,
+ dump_log_update_in_place,
+ dump_log_write_threshold,
+ event_module,
+ extra_db_nodes,
+ ignore_fallback_at_startup,
+ fallback_error_function,
+ is_running,
+ log_version,
+ max_wait_for_decision,
+ protocol_version,
+ running_db_nodes,
+ schema_location,
+ schema_version,
+ use_dir,
+ version
+ ].
+
+system_info() ->
+ IsRunning = mnesia_lib:is_running(),
+ case IsRunning of
+ yes ->
+ TmInfo = mnesia_tm:get_info(10000),
+ Held = system_info(held_locks),
+ Queued = system_info(lock_queue),
+ Pat = {'_', unclear, '_'},
+ Uncertain = ets:match_object(mnesia_decision, Pat),
+ display_system_info(Held, Queued, TmInfo, Uncertain);
+ _ ->
+ mini_info()
+ end,
+ IsRunning.
+
+load_mnesia_or_abort() ->
+ case mnesia_lib:ensure_loaded(?APPLICATION) of
+ ok ->
+ ok;
+ {error, Reason} ->
+ abort(Reason)
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Database mgt
+
+create_schema(Ns) ->
+ mnesia_bup:create_schema(Ns).
+
+delete_schema(Ns) ->
+ mnesia_schema:delete_schema(Ns).
+
+backup(Opaque) ->
+ mnesia_log:backup(Opaque).
+
+backup(Opaque, Mod) ->
+ mnesia_log:backup(Opaque, Mod).
+
+traverse_backup(S, T, Fun, Acc) ->
+ mnesia_bup:traverse_backup(S, T, Fun, Acc).
+
+traverse_backup(S, SM, T, TM, F, A) ->
+ mnesia_bup:traverse_backup(S, SM, T, TM, F, A).
+
+install_fallback(Opaque) ->
+ mnesia_bup:install_fallback(Opaque).
+
+install_fallback(Opaque, Mod) ->
+ mnesia_bup:install_fallback(Opaque, Mod).
+
+uninstall_fallback() ->
+ mnesia_bup:uninstall_fallback().
+
+uninstall_fallback(Args) ->
+ mnesia_bup:uninstall_fallback(Args).
+
+activate_checkpoint(Args) ->
+ mnesia_checkpoint:activate(Args).
+
+deactivate_checkpoint(Name) ->
+ mnesia_checkpoint:deactivate(Name).
+
+backup_checkpoint(Name, Opaque) ->
+ mnesia_log:backup_checkpoint(Name, Opaque).
+
+backup_checkpoint(Name, Opaque, Mod) ->
+ mnesia_log:backup_checkpoint(Name, Opaque, Mod).
+
+restore(Opaque, Args) ->
+ mnesia_schema:restore(Opaque, Args).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Table mgt
+
+create_table(Arg) ->
+ mnesia_schema:create_table(Arg).
+create_table(Name, Arg) when list(Arg) ->
+ mnesia_schema:create_table([{name, Name}| Arg]);
+create_table(Name, Arg) ->
+ {aborted, badarg, Name, Arg}.
+
+delete_table(Tab) ->
+ mnesia_schema:delete_table(Tab).
+
+add_table_copy(Tab, N, S) ->
+ mnesia_schema:add_table_copy(Tab, N, S).
+del_table_copy(Tab, N) ->
+ mnesia_schema:del_table_copy(Tab, N).
+
+move_table_copy(Tab, From, To) ->
+ mnesia_schema:move_table(Tab, From, To).
+
+add_table_index(Tab, Ix) ->
+ mnesia_schema:add_table_index(Tab, Ix).
+del_table_index(Tab, Ix) ->
+ mnesia_schema:del_table_index(Tab, Ix).
+
+transform_table(Tab, Fun, NewA) ->
+ case catch val({Tab, record_name}) of
+ {'EXIT', Reason} ->
+ mnesia:abort(Reason);
+ OldRN ->
+ mnesia_schema:transform_table(Tab, Fun, NewA, OldRN)
+ end.
+
+transform_table(Tab, Fun, NewA, NewRN) ->
+ mnesia_schema:transform_table(Tab, Fun, NewA, NewRN).
+
+change_table_copy_type(T, N, S) ->
+ mnesia_schema:change_table_copy_type(T, N, S).
+
+clear_table(Tab) ->
+ mnesia_schema:clear_table(Tab).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Table mgt - user properties
+
+read_table_property(Tab, PropKey) ->
+ val({Tab, user_property, PropKey}).
+
+write_table_property(Tab, Prop) ->
+ mnesia_schema:write_table_property(Tab, Prop).
+
+delete_table_property(Tab, PropKey) ->
+ mnesia_schema:delete_table_property(Tab, PropKey).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Table mgt - user properties
+
+change_table_frag(Tab, FragProp) ->
+ mnesia_schema:change_table_frag(Tab, FragProp).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Table mgt - table load
+
+%% Dump a ram table to disc
+dump_tables(Tabs) ->
+ mnesia_schema:dump_tables(Tabs).
+
+%% allow the user to wait for some tables to be loaded
+wait_for_tables(Tabs, Timeout) ->
+ mnesia_controller:wait_for_tables(Tabs, Timeout).
+
+force_load_table(Tab) ->
+ case mnesia_controller:force_load_table(Tab) of
+ ok -> yes; % Backwards compatibility
+ Other -> Other
+ end.
+
+change_table_access_mode(T, Access) ->
+ mnesia_schema:change_table_access_mode(T, Access).
+
+change_table_load_order(T, O) ->
+ mnesia_schema:change_table_load_order(T, O).
+
+set_master_nodes(Nodes) when list(Nodes) ->
+ UseDir = system_info(use_dir),
+ IsRunning = system_info(is_running),
+ case IsRunning of
+ yes ->
+ CsPat = {{'_', cstruct}, '_'},
+ Cstructs0 = ?ets_match_object(mnesia_gvar, CsPat),
+ Cstructs = [Cs || {_, Cs} <- Cstructs0],
+ log_valid_master_nodes(Cstructs, Nodes, UseDir, IsRunning);
+ _NotRunning ->
+ case UseDir of
+ true ->
+ mnesia_lib:lock_table(schema),
+ Res =
+ case mnesia_schema:read_cstructs_from_disc() of
+ {ok, Cstructs} ->
+ log_valid_master_nodes(Cstructs, Nodes, UseDir, IsRunning);
+ {error, Reason} ->
+ {error, Reason}
+ end,
+ mnesia_lib:unlock_table(schema),
+ Res;
+ false ->
+ ok
+ end
+ end;
+set_master_nodes(Nodes) ->
+ {error, {bad_type, Nodes}}.
+
+log_valid_master_nodes(Cstructs, Nodes, UseDir, IsRunning) ->
+ Fun = fun(Cs) ->
+ Copies = mnesia_lib:copy_holders(Cs),
+ Valid = mnesia_lib:intersect(Nodes, Copies),
+ {Cs#cstruct.name, Valid}
+ end,
+ Args = lists:map(Fun, Cstructs),
+ mnesia_recover:log_master_nodes(Args, UseDir, IsRunning).
+
+set_master_nodes(Tab, Nodes) when list(Nodes) ->
+ UseDir = system_info(use_dir),
+ IsRunning = system_info(is_running),
+ case IsRunning of
+ yes ->
+ case ?catch_val({Tab, cstruct}) of
+ {'EXIT', _} ->
+ {error, {no_exists, Tab}};
+ Cs ->
+ case Nodes -- mnesia_lib:copy_holders(Cs) of
+ [] ->
+ Args = [{Tab , Nodes}],
+ mnesia_recover:log_master_nodes(Args, UseDir, IsRunning);
+ BadNodes ->
+ {error, {no_exists, Tab, BadNodes}}
+ end
+ end;
+ _NotRunning ->
+ case UseDir of
+ true ->
+ mnesia_lib:lock_table(schema),
+ Res =
+ case mnesia_schema:read_cstructs_from_disc() of
+ {ok, Cstructs} ->
+ case lists:keysearch(Tab, 2, Cstructs) of
+ {value, Cs} ->
+ case Nodes -- mnesia_lib:copy_holders(Cs) of
+ [] ->
+ Args = [{Tab , Nodes}],
+ mnesia_recover:log_master_nodes(Args, UseDir, IsRunning);
+ BadNodes ->
+ {error, {no_exists, Tab, BadNodes}}
+ end;
+ false ->
+ {error, {no_exists, Tab}}
+ end;
+ {error, Reason} ->
+ {error, Reason}
+ end,
+ mnesia_lib:unlock_table(schema),
+ Res;
+ false ->
+ ok
+ end
+ end;
+set_master_nodes(Tab, Nodes) ->
+ {error, {bad_type, Tab, Nodes}}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Misc admin
+
+dump_log() ->
+ mnesia_controller:sync_dump_log(user).
+
+subscribe(What) ->
+ mnesia_subscr:subscribe(self(), What).
+
+unsubscribe(What) ->
+ mnesia_subscr:unsubscribe(self(), What).
+
+report_event(Event) ->
+ mnesia_lib:report_system_event({mnesia_user, Event}).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Snmp
+
+snmp_open_table(Tab, Us) ->
+ mnesia_schema:add_snmp(Tab, Us).
+
+snmp_close_table(Tab) ->
+ mnesia_schema:del_snmp(Tab).
+
+snmp_get_row(Tab, RowIndex) when atom(Tab), Tab /= schema ->
+ dirty_rpc(Tab, mnesia_snmp_hook, get_row, [Tab, RowIndex]);
+snmp_get_row(Tab, _RowIndex) ->
+ abort({bad_type, Tab}).
+
+snmp_get_next_index(Tab, RowIndex) when atom(Tab), Tab /= schema ->
+ dirty_rpc(Tab, mnesia_snmp_hook, get_next_index, [Tab, RowIndex]);
+snmp_get_next_index(Tab, _RowIndex) ->
+ abort({bad_type, Tab}).
+
+snmp_get_mnesia_key(Tab, RowIndex) when atom(Tab), Tab /= schema ->
+ dirty_rpc(Tab, mnesia_snmp_hook, get_mnesia_key, [Tab, RowIndex]);
+snmp_get_mnesia_key(Tab, _RowIndex) ->
+ abort({bad_type, Tab}).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Textfile access
+
+load_textfile(F) ->
+ mnesia_text:load_textfile(F).
+dump_to_textfile(F) ->
+ mnesia_text:dump_to_textfile(F).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Mnemosyne exclusive
+
+get_activity_id() ->
+ get(mnesia_activity_state).
+
+put_activity_id(Activity) ->
+ mnesia_tm:put_activity_id(Activity).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia.hrl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia.hrl
new file mode 100644
index 0000000000..cd3cee974b
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia.hrl
@@ -0,0 +1,117 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia.hrl,v 1.1 2008/12/17 09:53:37 mikpe Exp $
+%%
+
+-define(APPLICATION, mnesia).
+
+-define(ets_lookup(Tab, Key), ets:lookup(Tab, Key)).
+-define(ets_lookup_element(Tab, Key, Pos), ets:lookup_element(Tab, Key, Pos)).
+-define(ets_insert(Tab, Rec), ets:insert(Tab, Rec)).
+-define(ets_delete(Tab, Key), ets:delete(Tab, Key)).
+-define(ets_match_delete(Tab, Pat), ets:match_delete(Tab, Pat)).
+-define(ets_match_object(Tab, Pat), ets:match_object(Tab, Pat)).
+-define(ets_match(Tab, Pat), ets:match(Tab, Pat)).
+-define(ets_info(Tab, Item), ets:info(Tab, Item)).
+-define(ets_update_counter(Tab, Key, Incr), ets:update_counter(Tab, Key, Incr)).
+-define(ets_first(Tab), ets:first(Tab)).
+-define(ets_next(Tab, Key), ets:next(Tab, Key)).
+-define(ets_last(Tab), ets:last(Tab)).
+-define(ets_prev(Tab, Key), ets:prev(Tab, Key)).
+-define(ets_slot(Tab, Pos), ets:slot(Tab, Pos)).
+-define(ets_new_table(Tab, Props), ets:new(Tab, Props)).
+-define(ets_delete_table(Tab), ets:delete(Tab)).
+-define(ets_fixtable(Tab, Bool), ets:fixtable(Tab, Bool)).
+
+-define(catch_val(Var), (catch ?ets_lookup_element(mnesia_gvar, Var, 2))).
+
+%% It's important that counter is first, since we compare tid's
+
+-record(tid,
+ {counter, %% serial no for tid
+ pid}). %% owner of tid
+
+
+-record(tidstore,
+ {store, %% current ets table for tid
+ up_stores = [], %% list of upper layer stores for nested trans
+ level = 1}). %% transaction level
+
+-define(unique_cookie, {erlang:now(), node()}).
+
+-record(cstruct, {name, % Atom
+ type = set, % set | bag
+ ram_copies = [], % [Node]
+ disc_copies = [], % [Node]
+ disc_only_copies = [], % [Node]
+ load_order = 0, % Integer
+ access_mode = read_write, % read_write | read_only
+ index = [], % [Integer]
+ snmp = [], % Snmp Ustruct
+ local_content = false, % true | false
+ record_name = {bad_record_name}, % Atom (Default = Name)
+ attributes = [key, val], % [Atom]
+ user_properties = [], % [Record]
+ frag_properties = [], % [{Key, Val]
+ cookie = ?unique_cookie, % Term
+ version = {{2, 0}, []}}). % {{Integer, Integer}, [Node]}
+
+%% Record for the head structure in Mnesia's log files
+%%
+%% The definition of this record may *NEVER* be changed
+%% since it may be written to very old backup files.
+%% By holding this record definition stable we can be
+%% able to comprahend backups from timepoint 0. It also
+%% allows us to use the backup format as an interchange
+%% format between Mnesia releases.
+
+-record(log_header,{log_kind,
+ log_version,
+ mnesia_version,
+ node,
+ now}).
+
+%% Commit records stored in the transaction log
+-record(commit, {node,
+ decision, % presume_commit | Decision
+ ram_copies = [],
+ disc_copies = [],
+ disc_only_copies = [],
+ snmp = [],
+ schema_ops = []
+ }).
+
+-record(decision, {tid,
+ outcome, % presume_abort | committed
+ disc_nodes,
+ ram_nodes}).
+
+%% Maybe cyclic wait
+-record(cyclic, {node = node(),
+ oid, % {Tab, Key}
+ op, % read | write
+ lock, % read | write
+ lucky
+ }).
+
+%% Managing conditional debug functions
+
+-ifdef(debug).
+ -define(eval_debug_fun(I, C),
+ mnesia_lib:eval_debug_fun(I, C, ?FILE, ?LINE)).
+-else.
+ -define(eval_debug_fun(I, C), ok).
+-endif.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_backup.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_backup.erl
new file mode 100644
index 0000000000..f01310530e
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_backup.erl
@@ -0,0 +1,194 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_backup.erl,v 1.1 2008/12/17 09:53:37 mikpe Exp $
+%%
+%0
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This module contains one implementation of callback functions
+%% used by Mnesia at backup and restore. The user may however
+%% write an own module the same interface as mnesia_backup and
+%% configure Mnesia so the alternate module performs the actual
+%% accesses to the backup media. This means that the user may put
+%% the backup on medias that Mnesia does not know about, possibly
+%% on hosts where Erlang is not running.
+%%
+%% The OpaqueData argument is never interpreted by other parts of
+%% Mnesia. It is the property of this module. Alternate implementations
+%% of this module may have different interpretations of OpaqueData.
+%% The OpaqueData argument given to open_write/1 and open_read/1
+%% are forwarded directly from the user.
+%%
+%% All functions must return {ok, NewOpaqueData} or {error, Reason}.
+%%
+%% The NewOpaqueData arguments returned by backup callback functions will
+%% be given as input when the next backup callback function is invoked.
+%% If any return value does not match {ok, _} the backup will be aborted.
+%%
+%% The NewOpaqueData arguments returned by restore callback functions will
+%% be given as input when the next restore callback function is invoked
+%% If any return value does not match {ok, _} the restore will be aborted.
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-module(mnesia_backup).
+-behaviour(mnesia_backup).
+
+-include_lib("kernel/include/file.hrl").
+
+-export([
+ %% Write access
+ open_write/1,
+ write/2,
+ commit_write/1,
+ abort_write/1,
+
+ %% Read access
+ open_read/1,
+ read/1,
+ close_read/1
+ ]).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Backup callback interface
+-record(backup, {tmp_file, file, file_desc}).
+
+%% Opens backup media for write
+%%
+%% Returns {ok, OpaqueData} or {error, Reason}
+open_write(OpaqueData) ->
+ File = OpaqueData,
+ Tmp = lists:concat([File,".BUPTMP"]),
+ file:delete(Tmp),
+ file:delete(File),
+ case disk_log:open([{name, make_ref()},
+ {file, Tmp},
+ {repair, false},
+ {linkto, self()}]) of
+ {ok, Fd} ->
+ {ok, #backup{tmp_file = Tmp, file = File, file_desc = Fd}};
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+%% Writes BackupItems to the backup media
+%%
+%% Returns {ok, OpaqueData} or {error, Reason}
+write(OpaqueData, BackupItems) ->
+ B = OpaqueData,
+ case disk_log:log_terms(B#backup.file_desc, BackupItems) of
+ ok ->
+ {ok, B};
+ {error, Reason} ->
+ abort_write(B),
+ {error, Reason}
+ end.
+
+%% Closes the backup media after a successful backup
+%%
+%% Returns {ok, ReturnValueToUser} or {error, Reason}
+commit_write(OpaqueData) ->
+ B = OpaqueData,
+ case disk_log:sync(B#backup.file_desc) of
+ ok ->
+ case disk_log:close(B#backup.file_desc) of
+ ok ->
+ case file:rename(B#backup.tmp_file, B#backup.file) of
+ ok ->
+ {ok, B#backup.file};
+ {error, Reason} ->
+ {error, Reason}
+ end;
+ {error, Reason} ->
+ {error, Reason}
+ end;
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+%% Closes the backup media after an interrupted backup
+%%
+%% Returns {ok, ReturnValueToUser} or {error, Reason}
+abort_write(BackupRef) ->
+ Res = disk_log:close(BackupRef#backup.file_desc),
+ file:delete(BackupRef#backup.tmp_file),
+ case Res of
+ ok ->
+ {ok, BackupRef#backup.file};
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Restore callback interface
+
+-record(restore, {file, file_desc, cont}).
+
+%% Opens backup media for read
+%%
+%% Returns {ok, OpaqueData} or {error, Reason}
+open_read(OpaqueData) ->
+ File = OpaqueData,
+ case file:read_file_info(File) of
+ {error, Reason} ->
+ {error, Reason};
+ _FileInfo -> %% file exists
+ case disk_log:open([{file, File},
+ {name, make_ref()},
+ {repair, false},
+ {mode, read_only},
+ {linkto, self()}]) of
+ {ok, Fd} ->
+ {ok, #restore{file = File, file_desc = Fd, cont = start}};
+ {repaired, Fd, _, {badbytes, 0}} ->
+ {ok, #restore{file = File, file_desc = Fd, cont = start}};
+ {repaired, Fd, _, _} ->
+ {ok, #restore{file = File, file_desc = Fd, cont = start}};
+ {error, Reason} ->
+ {error, Reason}
+ end
+ end.
+
+%% Reads BackupItems from the backup media
+%%
+%% Returns {ok, OpaqueData, BackupItems} or {error, Reason}
+%%
+%% BackupItems == [] is interpreted as eof
+read(OpaqueData) ->
+ R = OpaqueData,
+ Fd = R#restore.file_desc,
+ case disk_log:chunk(Fd, R#restore.cont) of
+ {error, Reason} ->
+ {error, {"Possibly truncated", Reason}};
+ eof ->
+ {ok, R, []};
+ {Cont, []} ->
+ read(R#restore{cont = Cont});
+ {Cont, BackupItems} ->
+ {ok, R#restore{cont = Cont}, BackupItems}
+ end.
+
+%% Closes the backup media after restore
+%%
+%% Returns {ok, ReturnValueToUser} or {error, Reason}
+close_read(OpaqueData) ->
+ R = OpaqueData,
+ case disk_log:close(R#restore.file_desc) of
+ ok -> {ok, R#restore.file};
+ {error, Reason} -> {error, Reason}
+ end.
+%0
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_bup.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_bup.erl
new file mode 100644
index 0000000000..eb636a8447
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_bup.erl
@@ -0,0 +1,1168 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_bup.erl,v 1.1 2008/12/17 09:53:37 mikpe Exp $
+%%
+-module(mnesia_bup).
+-export([
+ %% Public interface
+ iterate/4,
+ read_schema/2,
+ fallback_bup/0,
+ fallback_exists/0,
+ tm_fallback_start/1,
+ create_schema/1,
+ install_fallback/1,
+ install_fallback/2,
+ uninstall_fallback/0,
+ uninstall_fallback/1,
+ traverse_backup/4,
+ traverse_backup/6,
+ make_initial_backup/3,
+ fallback_to_schema/0,
+ lookup_schema/2,
+ schema2bup/1,
+ refresh_cookie/2,
+
+ %% Internal
+ fallback_receiver/2,
+ install_fallback_master/2,
+ uninstall_fallback_master/2,
+ local_uninstall_fallback/2,
+ do_traverse_backup/7,
+ trav_apply/4
+ ]).
+
+-include("mnesia.hrl").
+-import(mnesia_lib, [verbose/2, dbg_out/2]).
+
+-record(restore, {mode, bup_module, bup_data}).
+
+-record(fallback_args, {opaque,
+ scope = global,
+ module = mnesia_monitor:get_env(backup_module),
+ use_default_dir = true,
+ mnesia_dir,
+ fallback_bup,
+ fallback_tmp,
+ skip_tables = [],
+ keep_tables = [],
+ default_op = keep_tables
+ }).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Backup iterator
+
+%% Reads schema section and iterates over all records in a backup.
+%%
+%% Fun(BunchOfRecords, Header, Schema, Acc) is applied when a suitable amount
+%% of records has been collected.
+%%
+%% BunchOfRecords will be [] when the iteration is done.
+iterate(Mod, Fun, Opaque, Acc) ->
+ R = #restore{bup_module = Mod, bup_data = Opaque},
+ case catch read_schema_section(R) of
+ {error, Reason} ->
+ {error, Reason};
+ {R2, {Header, Schema, Rest}} ->
+ case catch iter(R2, Header, Schema, Fun, Acc, Rest) of
+ {ok, R3, Res} ->
+ catch safe_apply(R3, close_read, [R3#restore.bup_data]),
+ {ok, Res};
+ {error, Reason} ->
+ catch safe_apply(R2, close_read, [R2#restore.bup_data]),
+ {error, Reason};
+ {'EXIT', Pid, Reason} ->
+ catch safe_apply(R2, close_read, [R2#restore.bup_data]),
+ {error, {'EXIT', Pid, Reason}};
+ {'EXIT', Reason} ->
+ catch safe_apply(R2, close_read, [R2#restore.bup_data]),
+ {error, {'EXIT', Reason}}
+ end
+ end.
+
+iter(R, Header, Schema, Fun, Acc, []) ->
+ case safe_apply(R, read, [R#restore.bup_data]) of
+ {R2, []} ->
+ Res = Fun([], Header, Schema, Acc),
+ {ok, R2, Res};
+ {R2, BupItems} ->
+ iter(R2, Header, Schema, Fun, Acc, BupItems)
+ end;
+iter(R, Header, Schema, Fun, Acc, BupItems) ->
+ Acc2 = Fun(BupItems, Header, Schema, Acc),
+ iter(R, Header, Schema, Fun, Acc2, []).
+
+safe_apply(R, write, [_, Items]) when Items == [] ->
+ R;
+safe_apply(R, What, Args) ->
+ Abort = fun(Re) -> abort_restore(R, What, Args, Re) end,
+ receive
+ {'EXIT', Pid, Re} -> Abort({'EXIT', Pid, Re})
+ after 0 ->
+ Mod = R#restore.bup_module,
+ case catch apply(Mod, What, Args) of
+ {ok, Opaque, Items} when What == read ->
+ {R#restore{bup_data = Opaque}, Items};
+ {ok, Opaque} when What /= read->
+ R#restore{bup_data = Opaque};
+ {error, Re} ->
+ Abort(Re);
+ Re ->
+ Abort(Re)
+ end
+ end.
+
+abort_restore(R, What, Args, Reason) ->
+ Mod = R#restore.bup_module,
+ Opaque = R#restore.bup_data,
+ dbg_out("Restore aborted. ~p:~p~p -> ~p~n",
+ [Mod, What, Args, Reason]),
+ catch apply(Mod, close_read, [Opaque]),
+ throw({error, Reason}).
+
+fallback_to_schema() ->
+ Fname = fallback_bup(),
+ fallback_to_schema(Fname).
+
+fallback_to_schema(Fname) ->
+ Mod = mnesia_backup,
+ case read_schema(Mod, Fname) of
+ {error, Reason} ->
+ {error, Reason};
+ Schema ->
+ case catch lookup_schema(schema, Schema) of
+ {error, _} ->
+ {error, "No schema in fallback"};
+ List ->
+ {ok, fallback, List}
+ end
+ end.
+
+%% Opens Opaque reads schema and then close
+read_schema(Mod, Opaque) ->
+ R = #restore{bup_module = Mod, bup_data = Opaque},
+ case catch read_schema_section(R) of
+ {error, Reason} ->
+ {error, Reason};
+ {R2, {_Header, Schema, _}} ->
+ catch safe_apply(R2, close_read, [R2#restore.bup_data]),
+ Schema
+ end.
+
+%% Open backup media and extract schema
+%% rewind backup media and leave it open
+%% Returns {R, {Header, Schema}}
+read_schema_section(R) ->
+ case catch do_read_schema_section(R) of
+ {'EXIT', Reason} ->
+ catch safe_apply(R, close_read, [R#restore.bup_data]),
+ {error, {'EXIT', Reason}};
+ {error, Reason} ->
+ catch safe_apply(R, close_read, [R#restore.bup_data]),
+ {error, Reason};
+ {R2, {H, Schema, Rest}} ->
+ Schema2 = convert_schema(H#log_header.log_version, Schema),
+ {R2, {H, Schema2, Rest}}
+ end.
+
+do_read_schema_section(R) ->
+ R2 = safe_apply(R, open_read, [R#restore.bup_data]),
+ {R3, RawSchema} = safe_apply(R2, read, [R2#restore.bup_data]),
+ do_read_schema_section(R3, verify_header(RawSchema), []).
+
+do_read_schema_section(R, {ok, B, C, []}, Acc) ->
+ case safe_apply(R, read, [R#restore.bup_data]) of
+ {R2, []} ->
+ {R2, {B, Acc, []}};
+ {R2, RawSchema} ->
+ do_read_schema_section(R2, {ok, B, C, RawSchema}, Acc)
+ end;
+
+do_read_schema_section(R, {ok, B, C, [Head | Tail]}, Acc)
+ when element(1, Head) == schema ->
+ do_read_schema_section(R, {ok, B, C, Tail}, Acc ++ [Head]);
+
+do_read_schema_section(R, {ok, B, _C, Rest}, Acc) ->
+ {R, {B, Acc, Rest}};
+
+do_read_schema_section(_R, {error, Reason}, _Acc) ->
+ {error, Reason}.
+
+verify_header([H | RawSchema]) when record(H, log_header) ->
+ Current = mnesia_log:backup_log_header(),
+ if
+ H#log_header.log_kind == Current#log_header.log_kind ->
+ Versions = ["0.1", "1.1", Current#log_header.log_version],
+ case lists:member(H#log_header.log_version, Versions) of
+ true ->
+ {ok, H, Current, RawSchema};
+ false ->
+ {error, {"Bad header version. Cannot be used as backup.", H}}
+ end;
+ true ->
+ {error, {"Bad kind of header. Cannot be used as backup.", H}}
+ end;
+verify_header(RawSchema) ->
+ {error, {"Missing header. Cannot be used as backup.", catch hd(RawSchema)}}.
+
+refresh_cookie(Schema, NewCookie) ->
+ case lists:keysearch(schema, 2, Schema) of
+ {value, {schema, schema, List}} ->
+ Cs = mnesia_schema:list2cs(List),
+ Cs2 = Cs#cstruct{cookie = NewCookie},
+ Item = {schema, schema, mnesia_schema:cs2list(Cs2)},
+ lists:keyreplace(schema, 2, Schema, Item);
+
+ false ->
+ Reason = "No schema found. Cannot be used as backup.",
+ throw({error, {Reason, Schema}})
+ end.
+
+%% Convert schema items from an external backup
+%% If backup format is the latest, no conversion is needed
+%% All supported backup formats should have their converters
+%% here as separate function clauses.
+convert_schema("0.1", Schema) ->
+ convert_0_1(Schema);
+convert_schema("1.1", Schema) ->
+ %% The new backup format is a pure extension of the old one
+ Current = mnesia_log:backup_log_header(),
+ convert_schema(Current#log_header.log_version, Schema);
+convert_schema(Latest, Schema) ->
+ H = mnesia_log:backup_log_header(),
+ if
+ H#log_header.log_version == Latest ->
+ Schema;
+ true ->
+ Reason = "Bad backup header version. Cannot convert schema.",
+ throw({error, {Reason, H}})
+ end.
+
+%% Backward compatibility for 0.1
+convert_0_1(Schema) ->
+ case lists:keysearch(schema, 2, Schema) of
+ {value, {schema, schema, List}} ->
+ Schema2 = lists:keydelete(schema, 2, Schema),
+ Cs = mnesia_schema:list2cs(List),
+ convert_0_1(Schema2, [], Cs);
+ false ->
+ List = mnesia_schema:get_initial_schema(disc_copies, [node()]),
+ Cs = mnesia_schema:list2cs(List),
+ convert_0_1(Schema, [], Cs)
+ end.
+
+convert_0_1([{schema, cookie, Cookie} | Schema], Acc, Cs) ->
+ convert_0_1(Schema, Acc, Cs#cstruct{cookie = Cookie});
+convert_0_1([{schema, db_nodes, DbNodes} | Schema], Acc, Cs) ->
+ convert_0_1(Schema, Acc, Cs#cstruct{disc_copies = DbNodes});
+convert_0_1([{schema, version, Version} | Schema], Acc, Cs) ->
+ convert_0_1(Schema, Acc, Cs#cstruct{version = Version});
+convert_0_1([{schema, Tab, Def} | Schema], Acc, Cs) ->
+ Head =
+ case lists:keysearch(index, 1, Def) of
+ {value, {index, PosList}} ->
+ %% Remove the snmp "index"
+ P = PosList -- [snmp],
+ Def2 = lists:keyreplace(index, 1, Def, {index, P}),
+ {schema, Tab, Def2};
+ false ->
+ {schema, Tab, Def}
+ end,
+ convert_0_1(Schema, [Head | Acc], Cs);
+convert_0_1([Head | Schema], Acc, Cs) ->
+ convert_0_1(Schema, [Head | Acc], Cs);
+convert_0_1([], Acc, Cs) ->
+ [schema2bup({schema, schema, Cs}) | Acc].
+
+%% Returns Val or throw error
+lookup_schema(Key, Schema) ->
+ case lists:keysearch(Key, 2, Schema) of
+ {value, {schema, Key, Val}} -> Val;
+ false -> throw({error, {"Cannot lookup", Key}})
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Backup compatibility
+
+%% Convert internal schema items to backup dito
+schema2bup({schema, Tab}) ->
+ {schema, Tab};
+schema2bup({schema, Tab, TableDef}) ->
+ {schema, Tab, mnesia_schema:cs2list(TableDef)}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Create schema on the given nodes
+%% Requires that old schemas has been deleted
+%% Returns ok | {error, Reason}
+create_schema([]) ->
+ create_schema([node()]);
+create_schema(Ns) when list(Ns) ->
+ case is_set(Ns) of
+ true ->
+ create_schema(Ns, mnesia_schema:ensure_no_schema(Ns));
+ false ->
+ {error, {combine_error, Ns}}
+ end;
+create_schema(Ns) ->
+ {error, {badarg, Ns}}.
+
+is_set(List) when list(List) ->
+ ordsets:is_set(lists:sort(List));
+is_set(_) ->
+ false.
+
+create_schema(Ns, ok) ->
+ %% Ensure that we access the intended Mnesia
+ %% directory. This function may not be called
+ %% during startup since it will cause the
+ %% application_controller to get into deadlock
+ case mnesia_lib:ensure_loaded(?APPLICATION) of
+ ok ->
+ case mnesia_monitor:get_env(schema_location) of
+ ram ->
+ {error, {has_no_disc, node()}};
+ _ ->
+ case mnesia_schema:opt_create_dir(true, mnesia_lib:dir()) of
+ {error, What} ->
+ {error, What};
+ ok ->
+ Mod = mnesia_backup,
+ Str = mk_str(),
+ File = mnesia_lib:dir(Str),
+ file:delete(File),
+ case catch make_initial_backup(Ns, File, Mod) of
+ {ok, _Res} ->
+ case do_install_fallback(File, Mod) of
+ ok ->
+ file:delete(File),
+ ok;
+ {error, Reason} ->
+ {error, Reason}
+ end;
+ {error, Reason} ->
+ {error, Reason}
+ end
+ end
+ end;
+ {error, Reason} ->
+ {error, Reason}
+ end;
+create_schema(_Ns, {error, Reason}) ->
+ {error, Reason};
+create_schema(_Ns, Reason) ->
+ {error, Reason}.
+
+mk_str() ->
+ Now = [integer_to_list(I) || I <- tuple_to_list(now())],
+ lists:concat([node()] ++ Now ++ ".TMP").
+
+make_initial_backup(Ns, Opaque, Mod) ->
+ Schema = [{schema, schema, mnesia_schema:get_initial_schema(disc_copies, Ns)}],
+ O2 = do_apply(Mod, open_write, [Opaque], Opaque),
+ O3 = do_apply(Mod, write, [O2, [mnesia_log:backup_log_header()]], O2),
+ O4 = do_apply(Mod, write, [O3, Schema], O3),
+ O5 = do_apply(Mod, commit_write, [O4], O4),
+ {ok, O5}.
+
+do_apply(_, write, [_, Items], Opaque) when Items == [] ->
+ Opaque;
+do_apply(Mod, What, Args, _Opaque) ->
+ case catch apply(Mod, What, Args) of
+ {ok, Opaque2} -> Opaque2;
+ {error, Reason} -> throw({error, Reason});
+ {'EXIT', Reason} -> throw({error, {'EXIT', Reason}})
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Restore
+
+%% Restore schema and possibly other tables from a backup
+%% and replicate them to the necessary nodes
+%% Requires that old schemas has been deleted
+%% Returns ok | {error, Reason}
+install_fallback(Opaque) ->
+ install_fallback(Opaque, []).
+
+install_fallback(Opaque, Args) ->
+ %% Ensure that we access the intended Mnesia
+ %% directory. This function may not be called
+ %% during startup since it will cause the
+ %% application_controller to get into deadlock
+ case mnesia_lib:ensure_loaded(?APPLICATION) of
+ ok ->
+ do_install_fallback(Opaque, Args);
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+do_install_fallback(Opaque, Mod) when atom(Mod) ->
+ do_install_fallback(Opaque, [{module, Mod}]);
+do_install_fallback(Opaque, Args) when list(Args) ->
+ case check_fallback_args(Args, #fallback_args{opaque = Opaque}) of
+ {ok, FA} ->
+ do_install_fallback(FA);
+ {error, Reason} ->
+ {error, Reason}
+ end;
+do_install_fallback(_Opaque, Args) ->
+ {error, {badarg, Args}}.
+
+check_fallback_args([Arg | Tail], FA) ->
+ case catch check_fallback_arg_type(Arg, FA) of
+ {'EXIT', _Reason} ->
+ {error, {badarg, Arg}};
+ FA2 ->
+ check_fallback_args(Tail, FA2)
+ end;
+check_fallback_args([], FA) ->
+ {ok, FA}.
+
+check_fallback_arg_type(Arg, FA) ->
+ case Arg of
+ {scope, global} ->
+ FA#fallback_args{scope = global};
+ {scope, local} ->
+ FA#fallback_args{scope = local};
+ {module, Mod} ->
+ Mod2 = mnesia_monitor:do_check_type(backup_module, Mod),
+ FA#fallback_args{module = Mod2};
+ {mnesia_dir, Dir} ->
+ FA#fallback_args{mnesia_dir = Dir,
+ use_default_dir = false};
+ {keep_tables, Tabs} ->
+ atom_list(Tabs),
+ FA#fallback_args{keep_tables = Tabs};
+ {skip_tables, Tabs} ->
+ atom_list(Tabs),
+ FA#fallback_args{skip_tables = Tabs};
+ {default_op, keep_tables} ->
+ FA#fallback_args{default_op = keep_tables};
+ {default_op, skip_tables} ->
+ FA#fallback_args{default_op = skip_tables}
+ end.
+
+atom_list([H | T]) when atom(H) ->
+ atom_list(T);
+atom_list([]) ->
+ ok.
+
+do_install_fallback(FA) ->
+ Pid = spawn_link(?MODULE, install_fallback_master, [self(), FA]),
+ Res =
+ receive
+ {'EXIT', Pid, Reason} -> % if appl has trapped exit
+ {error, {'EXIT', Reason}};
+ {Pid, Res2} ->
+ case Res2 of
+ {ok, _} ->
+ ok;
+ {error, Reason} ->
+ {error, {"Cannot install fallback", Reason}}
+ end
+ end,
+ Res.
+
+install_fallback_master(ClientPid, FA) ->
+ process_flag(trap_exit, true),
+ State = {start, FA},
+ Opaque = FA#fallback_args.opaque,
+ Mod = FA#fallback_args.module,
+ Res = (catch iterate(Mod, fun restore_recs/4, Opaque, State)),
+ unlink(ClientPid),
+ ClientPid ! {self(), Res},
+ exit(shutdown).
+
+restore_recs(_, _, _, stop) ->
+ throw({error, "restore_recs already stopped"});
+
+restore_recs(Recs, Header, Schema, {start, FA}) ->
+ %% No records in backup
+ Schema2 = convert_schema(Header#log_header.log_version, Schema),
+ CreateList = lookup_schema(schema, Schema2),
+ case catch mnesia_schema:list2cs(CreateList) of
+ {'EXIT', Reason} ->
+ throw({error, {"Bad schema in restore_recs", Reason}});
+ Cs ->
+ Ns = get_fallback_nodes(FA, Cs#cstruct.disc_copies),
+ global:set_lock({{mnesia_table_lock, schema}, self()}, Ns, infinity),
+ Args = [self(), FA],
+ Pids = [spawn_link(N, ?MODULE, fallback_receiver, Args) || N <- Ns],
+ send_fallback(Pids, {start, Header, Schema2}),
+ Res = restore_recs(Recs, Header, Schema2, Pids),
+ global:del_lock({{mnesia_table_lock, schema}, self()}, Ns),
+ Res
+ end;
+
+restore_recs([], _Header, _Schema, Pids) ->
+ send_fallback(Pids, swap),
+ send_fallback(Pids, stop),
+ stop;
+
+restore_recs(Recs, _, _, Pids) ->
+ send_fallback(Pids, {records, Recs}),
+ Pids.
+
+get_fallback_nodes(FA, Ns) ->
+ This = node(),
+ case lists:member(This, Ns) of
+ true ->
+ case FA#fallback_args.scope of
+ global -> Ns;
+ local -> [This]
+ end;
+ false ->
+ throw({error, {"No disc resident schema on local node", Ns}})
+ end.
+
+send_fallback(Pids, Msg) when list(Pids), Pids /= [] ->
+ lists:foreach(fun(Pid) -> Pid ! {self(), Msg} end, Pids),
+ rec_answers(Pids, []).
+
+rec_answers([], Acc) ->
+ case {lists:keysearch(error, 1, Acc), mnesia_lib:uniq(Acc)} of
+ {{value, {error, Val}}, _} -> throw({error, Val});
+ {_, [SameAnswer]} -> SameAnswer;
+ {_, Other} -> throw({error, {"Different answers", Other}})
+ end;
+rec_answers(Pids, Acc) ->
+ receive
+ {'EXIT', Pid, stopped} ->
+ Pids2 = lists:delete(Pid, Pids),
+ rec_answers(Pids2, [stopped|Acc]);
+ {'EXIT', Pid, Reason} ->
+ Pids2 = lists:delete(Pid, Pids),
+ rec_answers(Pids2, [{error, {'EXIT', Pid, Reason}}|Acc]);
+ {Pid, Reply} ->
+ Pids2 = lists:delete(Pid, Pids),
+ rec_answers(Pids2, [Reply|Acc])
+ end.
+
+fallback_exists() ->
+ Fname = fallback_bup(),
+ fallback_exists(Fname).
+
+fallback_exists(Fname) ->
+ case mnesia_monitor:use_dir() of
+ true ->
+ mnesia_lib:exists(Fname);
+ false ->
+ case ?catch_val(active_fallback) of
+ {'EXIT', _} -> false;
+ Bool -> Bool
+ end
+ end.
+
+fallback_name() -> "FALLBACK.BUP".
+fallback_bup() -> mnesia_lib:dir(fallback_name()).
+
+fallback_tmp_name() -> "FALLBACK.TMP".
+%% fallback_full_tmp_name() -> mnesia_lib:dir(fallback_tmp_name()).
+
+fallback_receiver(Master, FA) ->
+ process_flag(trap_exit, true),
+
+ case catch register(mnesia_fallback, self()) of
+ {'EXIT', _} ->
+ Reason = {already_exists, node()},
+ local_fallback_error(Master, Reason);
+ true ->
+ FA2 = check_fallback_dir(Master, FA),
+ Bup = FA2#fallback_args.fallback_bup,
+ case mnesia_lib:exists(Bup) of
+ true ->
+ Reason2 = {already_exists, node()},
+ local_fallback_error(Master, Reason2);
+ false ->
+ Mod = mnesia_backup,
+ Tmp = FA2#fallback_args.fallback_tmp,
+ R = #restore{mode = replace,
+ bup_module = Mod,
+ bup_data = Tmp},
+ file:delete(Tmp),
+ case catch fallback_receiver_loop(Master, R, FA2, schema) of
+ {error, Reason} ->
+ local_fallback_error(Master, Reason);
+ Other ->
+ exit(Other)
+ end
+ end
+ end.
+
+local_fallback_error(Master, Reason) ->
+ Master ! {self(), {error, Reason}},
+ unlink(Master),
+ exit(Reason).
+
+check_fallback_dir(Master, FA) ->
+ case mnesia:system_info(schema_location) of
+ ram ->
+ Reason = {has_no_disc, node()},
+ local_fallback_error(Master, Reason);
+ _ ->
+ Dir = check_fallback_dir_arg(Master, FA),
+ Bup = filename:join([Dir, fallback_name()]),
+ Tmp = filename:join([Dir, fallback_tmp_name()]),
+ FA#fallback_args{fallback_bup = Bup,
+ fallback_tmp = Tmp,
+ mnesia_dir = Dir}
+ end.
+
+check_fallback_dir_arg(Master, FA) ->
+ case FA#fallback_args.use_default_dir of
+ true ->
+ mnesia_lib:dir();
+ false when FA#fallback_args.scope == local ->
+ Dir = FA#fallback_args.mnesia_dir,
+ case catch mnesia_monitor:do_check_type(dir, Dir) of
+ {'EXIT', _R} ->
+ Reason = {badarg, {dir, Dir}, node()},
+ local_fallback_error(Master, Reason);
+ AbsDir->
+ AbsDir
+ end;
+ false when FA#fallback_args.scope == global ->
+ Reason = {combine_error, global, dir, node()},
+ local_fallback_error(Master, Reason)
+ end.
+
+fallback_receiver_loop(Master, R, FA, State) ->
+ receive
+ {Master, {start, Header, Schema}} when State == schema ->
+ Dir = FA#fallback_args.mnesia_dir,
+ throw_bad_res(ok, mnesia_schema:opt_create_dir(true, Dir)),
+ R2 = safe_apply(R, open_write, [R#restore.bup_data]),
+ R3 = safe_apply(R2, write, [R2#restore.bup_data, [Header]]),
+ BupSchema = [schema2bup(S) || S <- Schema],
+ R4 = safe_apply(R3, write, [R3#restore.bup_data, BupSchema]),
+ Master ! {self(), ok},
+ fallback_receiver_loop(Master, R4, FA, records);
+
+ {Master, {records, Recs}} when State == records ->
+ R2 = safe_apply(R, write, [R#restore.bup_data, Recs]),
+ Master ! {self(), ok},
+ fallback_receiver_loop(Master, R2, FA, records);
+
+ {Master, swap} when State /= schema ->
+ ?eval_debug_fun({?MODULE, fallback_receiver_loop, pre_swap}, []),
+ safe_apply(R, commit_write, [R#restore.bup_data]),
+ Bup = FA#fallback_args.fallback_bup,
+ Tmp = FA#fallback_args.fallback_tmp,
+ throw_bad_res(ok, file:rename(Tmp, Bup)),
+ catch mnesia_lib:set(active_fallback, true),
+ ?eval_debug_fun({?MODULE, fallback_receiver_loop, post_swap}, []),
+ Master ! {self(), ok},
+ fallback_receiver_loop(Master, R, FA, stop);
+
+ {Master, stop} when State == stop ->
+ stopped;
+
+ Msg ->
+ safe_apply(R, abort_write, [R#restore.bup_data]),
+ Tmp = FA#fallback_args.fallback_tmp,
+ file:delete(Tmp),
+ throw({error, "Unexpected msg fallback_receiver_loop", Msg})
+ end.
+
+throw_bad_res(Expected, Expected) -> Expected;
+throw_bad_res(_Expected, {error, Actual}) -> throw({error, Actual});
+throw_bad_res(_Expected, Actual) -> throw({error, Actual}).
+
+-record(local_tab, {name, storage_type, dets_args, open, close, add, record_name}).
+
+tm_fallback_start(IgnoreFallback) ->
+ mnesia_schema:lock_schema(),
+ Res = do_fallback_start(fallback_exists(), IgnoreFallback),
+ mnesia_schema: unlock_schema(),
+ case Res of
+ ok -> ok;
+ {error, Reason} -> exit(Reason)
+ end.
+
+do_fallback_start(false, _IgnoreFallback) ->
+ ok;
+do_fallback_start(true, true) ->
+ verbose("Ignoring fallback at startup, but leaving it active...~n", []),
+ mnesia_lib:set(active_fallback, true),
+ ok;
+do_fallback_start(true, false) ->
+ verbose("Starting from fallback...~n", []),
+
+ Fname = fallback_bup(),
+ Mod = mnesia_backup,
+ Ets = ?ets_new_table(mnesia_local_tables, [set, public, {keypos, 2}]),
+ case catch iterate(Mod, fun restore_tables/4, Fname, {start, Ets}) of
+ {ok, Res} ->
+ case Res of
+ {local, _, LT} -> %% Close the last file
+ (LT#local_tab.close)(LT);
+ _ ->
+ ignore
+ end,
+ List = ?ets_match_object(Ets, '_'),
+ Tabs = [L#local_tab.name || L <- List, L#local_tab.name /= schema],
+ ?ets_delete_table(Ets),
+ mnesia_lib:swap_tmp_files(Tabs),
+ catch dets:close(schema),
+ Tmp = mnesia_lib:tab2tmp(schema),
+ Dat = mnesia_lib:tab2dat(schema),
+ case file:rename(Tmp, Dat) of
+ ok ->
+ file:delete(Fname),
+ ok;
+ {error, Reason} ->
+ file:delete(Tmp),
+ {error, {"Cannot start from fallback. Rename error.", Reason}}
+ end;
+ {error, Reason} ->
+ {error, {"Cannot start from fallback", Reason}};
+ {'EXIT', Reason} ->
+ {error, {"Cannot start from fallback", Reason}}
+ end.
+
+restore_tables(Recs, Header, Schema, {start, LocalTabs}) ->
+ Dir = mnesia_lib:dir(),
+ OldDir = filename:join([Dir, "OLD_DIR"]),
+ mnesia_schema:purge_dir(OldDir, []),
+ mnesia_schema:purge_dir(Dir, [fallback_name()]),
+ init_dat_files(Schema, LocalTabs),
+ State = {new, LocalTabs},
+ restore_tables(Recs, Header, Schema, State);
+restore_tables([Rec | Recs], Header, Schema, {new, LocalTabs}) ->
+ Tab = element(1, Rec),
+ case ?ets_lookup(LocalTabs, Tab) of
+ [] ->
+ State = {not_local, LocalTabs, Tab},
+ restore_tables(Recs, Header, Schema, State);
+ [L] when record(L, local_tab) ->
+ (L#local_tab.open)(Tab, L),
+ State = {local, LocalTabs, L},
+ restore_tables([Rec | Recs], Header, Schema, State)
+ end;
+restore_tables([Rec | Recs], Header, Schema, S = {not_local, LocalTabs, PrevTab}) ->
+ Tab = element(1, Rec),
+ if
+ Tab == PrevTab ->
+ restore_tables(Recs, Header, Schema, S);
+ true ->
+ State = {new, LocalTabs},
+ restore_tables([Rec | Recs], Header, Schema, State)
+ end;
+restore_tables([Rec | Recs], Header, Schema, State = {local, LocalTabs, L}) ->
+ Tab = element(1, Rec),
+ if
+ Tab == L#local_tab.name ->
+ Key = element(2, Rec),
+ (L#local_tab.add)(Tab, Key, Rec, L),
+ restore_tables(Recs, Header, Schema, State);
+ true ->
+ (L#local_tab.close)(L),
+ NState = {new, LocalTabs},
+ restore_tables([Rec | Recs], Header, Schema, NState)
+ end;
+restore_tables([], _Header, _Schema, State) ->
+ State.
+
+%% Creates all neccessary dat files and inserts
+%% the table definitions in the schema table
+%%
+%% Returns a list of local_tab tuples for all local tables
+init_dat_files(Schema, LocalTabs) ->
+ Fname = mnesia_lib:tab2tmp(schema),
+ Args = [{file, Fname}, {keypos, 2}, {type, set}],
+ case dets:open_file(schema, Args) of % Assume schema lock
+ {ok, _} ->
+ create_dat_files(Schema, LocalTabs),
+ dets:close(schema),
+ LocalTab = #local_tab{name = schema,
+ storage_type = disc_copies,
+ dets_args = Args,
+ open = fun open_media/2,
+ close = fun close_media/1,
+ add = fun add_to_media/4,
+ record_name = schema},
+ ?ets_insert(LocalTabs, LocalTab);
+ {error, Reason} ->
+ throw({error, {"Cannot open file", schema, Args, Reason}})
+ end.
+
+create_dat_files([{schema, schema, TabDef} | Tail], LocalTabs) ->
+ ok = dets:insert(schema, {schema, schema, TabDef}),
+ create_dat_files(Tail, LocalTabs);
+create_dat_files([{schema, Tab, TabDef} | Tail], LocalTabs) ->
+ Cs = mnesia_schema:list2cs(TabDef),
+ ok = dets:insert(schema, {schema, Tab, TabDef}),
+ RecName = Cs#cstruct.record_name,
+ case mnesia_lib:cs_to_storage_type(node(), Cs) of
+ unknown ->
+ cleanup_dat_file(Tab),
+ create_dat_files(Tail, LocalTabs);
+ disc_only_copies ->
+ Fname = mnesia_lib:tab2tmp(Tab),
+ Args = [{file, Fname}, {keypos, 2},
+ {type, mnesia_lib:disk_type(Tab, Cs#cstruct.type)}],
+ case mnesia_lib:dets_sync_open(Tab, Args) of
+ {ok, _} ->
+ mnesia_lib:dets_sync_close(Tab),
+ LocalTab = #local_tab{name = Tab,
+ storage_type = disc_only_copies,
+ dets_args = Args,
+ open = fun open_media/2,
+ close = fun close_media/1,
+ add = fun add_to_media/4,
+ record_name = RecName},
+ ?ets_insert(LocalTabs, LocalTab),
+ create_dat_files(Tail, LocalTabs);
+ {error, Reason} ->
+ throw({error, {"Cannot open file", Tab, Args, Reason}})
+ end;
+ ram_copies ->
+ %% Create .DCD if needed in open_media in case any ram_copies
+ %% are backed up.
+ LocalTab = #local_tab{name = Tab,
+ storage_type = ram_copies,
+ dets_args = ignore,
+ open = fun open_media/2,
+ close = fun close_media/1,
+ add = fun add_to_media/4,
+ record_name = RecName},
+ ?ets_insert(LocalTabs, LocalTab),
+ create_dat_files(Tail, LocalTabs);
+ Storage ->
+ %% Create DCD
+ Fname = mnesia_lib:tab2dcd(Tab),
+ file:delete(Fname),
+ Log = mnesia_log:open_log(fallback_tab, mnesia_log:dcd_log_header(),
+ Fname, false),
+ LocalTab = #local_tab{name = Tab,
+ storage_type = Storage,
+ dets_args = ignore,
+ open = fun open_media/2,
+ close = fun close_media/1,
+ add = fun add_to_media/4,
+ record_name = RecName},
+ mnesia_log:close_log(Log),
+ ?ets_insert(LocalTabs, LocalTab),
+ create_dat_files(Tail, LocalTabs)
+ end;
+create_dat_files([{schema, Tab} | Tail], LocalTabs) ->
+ cleanup_dat_file(Tab),
+ create_dat_files(Tail, LocalTabs);
+create_dat_files([], _LocalTabs) ->
+ ok.
+
+cleanup_dat_file(Tab) ->
+ ok = dets:delete(schema, {schema, Tab}),
+ mnesia_lib:cleanup_tmp_files([Tab]).
+
+open_media(Tab, LT) ->
+ case LT#local_tab.storage_type of
+ disc_only_copies ->
+ Args = LT#local_tab.dets_args,
+ case mnesia_lib:dets_sync_open(Tab, Args) of
+ {ok, _} -> ok;
+ {error, Reason} ->
+ throw({error, {"Cannot open file", Tab, Args, Reason}})
+ end;
+ ram_copies ->
+ %% Create .DCD as ram_copies backed up.
+ FnameDCD = mnesia_lib:tab2dcd(Tab),
+ file:delete(FnameDCD),
+ Log = mnesia_log:open_log(fallback_tab,
+ mnesia_log:dcd_log_header(),
+ FnameDCD, false),
+ mnesia_log:close_log(Log),
+
+ %% Create .DCL
+ Fname = mnesia_lib:tab2dcl(Tab),
+ file:delete(Fname),
+ mnesia_log:open_log({?MODULE,Tab},
+ mnesia_log:dcl_log_header(),
+ Fname, false, false,
+ read_write);
+ _ ->
+ Fname = mnesia_lib:tab2dcl(Tab),
+ file:delete(Fname),
+ mnesia_log:open_log({?MODULE,Tab},
+ mnesia_log:dcl_log_header(),
+ Fname, false, false,
+ read_write)
+ end.
+close_media(L) ->
+ Tab = L#local_tab.name,
+ case L#local_tab.storage_type of
+ disc_only_copies ->
+ mnesia_lib:dets_sync_close(Tab);
+ _ ->
+ mnesia_log:close_log({?MODULE,Tab})
+ end.
+
+add_to_media(Tab, Key, Rec, L) ->
+ RecName = L#local_tab.record_name,
+ case L#local_tab.storage_type of
+ disc_only_copies ->
+ case Rec of
+ {Tab, Key} ->
+ ok = dets:delete(Tab, Key);
+ (Rec) when Tab == RecName ->
+ ok = dets:insert(Tab, Rec);
+ (Rec) ->
+ Rec2 = setelement(1, Rec, RecName),
+ ok = dets:insert(Tab, Rec2)
+ end;
+ _ ->
+ Log = {?MODULE, Tab},
+ case Rec of
+ {Tab, Key} ->
+ mnesia_log:append(Log, {{Tab, Key}, {Tab, Key}, delete});
+ (Rec) when Tab == RecName ->
+ mnesia_log:append(Log, {{Tab, Key}, Rec, write});
+ (Rec) ->
+ Rec2 = setelement(1, Rec, RecName),
+ mnesia_log:append(Log, {{Tab, Key}, Rec2, write})
+ end
+ end.
+
+uninstall_fallback() ->
+ uninstall_fallback([{scope, global}]).
+
+uninstall_fallback(Args) ->
+ case check_fallback_args(Args, #fallback_args{}) of
+ {ok, FA} ->
+ do_uninstall_fallback(FA);
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+do_uninstall_fallback(FA) ->
+ %% Ensure that we access the intended Mnesia
+ %% directory. This function may not be called
+ %% during startup since it will cause the
+ %% application_controller to get into deadlock
+ case mnesia_lib:ensure_loaded(?APPLICATION) of
+ ok ->
+ Pid = spawn_link(?MODULE, uninstall_fallback_master, [self(), FA]),
+ receive
+ {'EXIT', Pid, Reason} -> % if appl has trapped exit
+ {error, {'EXIT', Reason}};
+ {Pid, Res} ->
+ Res
+ end;
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+uninstall_fallback_master(ClientPid, FA) ->
+ process_flag(trap_exit, true),
+
+ FA2 = check_fallback_dir(ClientPid, FA), % May exit
+ Bup = FA2#fallback_args.fallback_bup,
+ case fallback_to_schema(Bup) of
+ {ok, fallback, List} ->
+ Cs = mnesia_schema:list2cs(List),
+ case catch get_fallback_nodes(FA, Cs#cstruct.disc_copies) of
+ Ns when list(Ns) ->
+ do_uninstall(ClientPid, Ns, FA);
+ {error, Reason} ->
+ local_fallback_error(ClientPid, Reason)
+ end;
+ {error, Reason} ->
+ local_fallback_error(ClientPid, Reason)
+ end.
+
+do_uninstall(ClientPid, Ns, FA) ->
+ Args = [self(), FA],
+ global:set_lock({{mnesia_table_lock, schema}, self()}, Ns, infinity),
+ Pids = [spawn_link(N, ?MODULE, local_uninstall_fallback, Args) || N <- Ns],
+ Res = do_uninstall(ClientPid, Pids, [], [], ok),
+ global:del_lock({{mnesia_table_lock, schema}, self()}, Ns),
+ ClientPid ! {self(), Res},
+ unlink(ClientPid),
+ exit(shutdown).
+
+do_uninstall(ClientPid, [Pid | Pids], GoodPids, BadNodes, Res) ->
+ receive
+ %% {'EXIT', ClientPid, _} ->
+ %% client_exit;
+ {'EXIT', Pid, Reason} ->
+ BadNode = node(Pid),
+ BadRes = {error, {"Uninstall fallback", BadNode, Reason}},
+ do_uninstall(ClientPid, Pids, GoodPids, [BadNode | BadNodes], BadRes);
+ {Pid, {error, Reason}} ->
+ BadNode = node(Pid),
+ BadRes = {error, {"Uninstall fallback", BadNode, Reason}},
+ do_uninstall(ClientPid, Pids, GoodPids, [BadNode | BadNodes], BadRes);
+ {Pid, started} ->
+ do_uninstall(ClientPid, Pids, [Pid | GoodPids], BadNodes, Res)
+ end;
+do_uninstall(ClientPid, [], GoodPids, [], ok) ->
+ lists:foreach(fun(Pid) -> Pid ! {self(), do_uninstall} end, GoodPids),
+ rec_uninstall(ClientPid, GoodPids, ok);
+do_uninstall(_ClientPid, [], GoodPids, BadNodes, BadRes) ->
+ lists:foreach(fun(Pid) -> exit(Pid, shutdown) end, GoodPids),
+ {error, {node_not_running, BadNodes, BadRes}}.
+
+local_uninstall_fallback(Master, FA) ->
+ %% Don't trap exit
+
+ register(mnesia_fallback, self()), % May exit
+ FA2 = check_fallback_dir(Master, FA), % May exit
+ Master ! {self(), started},
+
+ receive
+ {Master, do_uninstall} ->
+ ?eval_debug_fun({?MODULE, uninstall_fallback2, pre_delete}, []),
+ catch mnesia_lib:set(active_fallback, false),
+ Tmp = FA2#fallback_args.fallback_tmp,
+ Bup = FA2#fallback_args.fallback_bup,
+ file:delete(Tmp),
+ Res =
+ case fallback_exists(Bup) of
+ true -> file:delete(Bup);
+ false -> ok
+ end,
+ ?eval_debug_fun({?MODULE, uninstall_fallback2, post_delete}, []),
+ Master ! {self(), Res},
+ unlink(Master),
+ exit(normal)
+ end.
+
+rec_uninstall(ClientPid, [Pid | Pids], AccRes) ->
+ receive
+ %% {'EXIT', ClientPid, _} ->
+ %% exit(shutdown);
+ {'EXIT', Pid, R} ->
+ Reason = {node_not_running, {node(Pid), R}},
+ rec_uninstall(ClientPid, Pids, {error, Reason});
+ {Pid, ok} ->
+ rec_uninstall(ClientPid, Pids, AccRes);
+ {Pid, BadRes} ->
+ rec_uninstall(ClientPid, Pids, BadRes)
+ end;
+rec_uninstall(ClientPid, [], Res) ->
+ ClientPid ! {self(), Res},
+ unlink(ClientPid),
+ exit(normal).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Backup traversal
+
+%% Iterate over a backup and produce a new backup.
+%% Fun(BackupItem, Acc) is applied for each BackupItem.
+%%
+%% Valid BackupItems are:
+%%
+%% {schema, Tab} Table to be deleted
+%% {schema, Tab, CreateList} Table to be created, CreateList may be empty
+%% {schema, db_nodes, DbNodes}List of nodes, defaults to [node()] OLD
+%% {schema, version, Version} Schema version OLD
+%% {schema, cookie, Cookie} Unique schema cookie OLD
+%% {Tab, Key} Oid for record to be deleted
+%% Record Record to be inserted.
+%%
+%% The Fun must return a tuple {BackupItems, NewAcc}
+%% where BackupItems is a list of valid BackupItems and
+%% NewAcc is a new accumulator value. Once BackupItems
+%% that not are schema related has been returned, no more schema
+%% items may be returned. The schema related items must always be
+%% first in the backup.
+%%
+%% If TargetMod == read_only, no new backup will be created.
+%%
+%% Opening of the source media will be performed by
+%% to SourceMod:open_read(Source)
+%%
+%% Opening of the target media will be performed by
+%% to TargetMod:open_write(Target)
+traverse_backup(Source, Target, Fun, Acc) ->
+ Mod = mnesia_monitor:get_env(backup_module),
+ traverse_backup(Source, Mod, Target, Mod, Fun, Acc).
+
+traverse_backup(Source, SourceMod, Target, TargetMod, Fun, Acc) ->
+ Args = [self(), Source, SourceMod, Target, TargetMod, Fun, Acc],
+ Pid = spawn_link(?MODULE, do_traverse_backup, Args),
+ receive
+ {'EXIT', Pid, Reason} ->
+ {error, {"Backup traversal crashed", Reason}};
+ {iter_done, Pid, Res} ->
+ Res
+ end.
+
+do_traverse_backup(ClientPid, Source, SourceMod, Target, TargetMod, Fun, Acc) ->
+ process_flag(trap_exit, true),
+ Iter =
+ if
+ TargetMod /= read_only ->
+ case catch do_apply(TargetMod, open_write, [Target], Target) of
+ {error, Error} ->
+ unlink(ClientPid),
+ ClientPid ! {iter_done, self(), {error, Error}},
+ exit(Error);
+ Else -> Else
+ end;
+ true ->
+ ignore
+ end,
+ A = {start, Fun, Acc, TargetMod, Iter},
+ Res =
+ case iterate(SourceMod, fun trav_apply/4, Source, A) of
+ {ok, {iter, _, Acc2, _, Iter2}} when TargetMod /= read_only ->
+ case catch do_apply(TargetMod, commit_write, [Iter2], Iter2) of
+ {error, Reason} ->
+ {error, Reason};
+ _ ->
+ {ok, Acc2}
+ end;
+ {ok, {iter, _, Acc2, _, _}} ->
+ {ok, Acc2};
+ {error, Reason} when TargetMod /= read_only->
+ catch do_apply(TargetMod, abort_write, [Iter], Iter),
+ {error, {"Backup traversal failed", Reason}};
+ {error, Reason} ->
+ {error, {"Backup traversal failed", Reason}}
+ end,
+ unlink(ClientPid),
+ ClientPid ! {iter_done, self(), Res}.
+
+trav_apply(Recs, _Header, _Schema, {iter, Fun, Acc, Mod, Iter}) ->
+ {NewRecs, Acc2} = filter_foldl(Fun, Acc, Recs),
+ if
+ Mod /= read_only, NewRecs /= [] ->
+ Iter2 = do_apply(Mod, write, [Iter, NewRecs], Iter),
+ {iter, Fun, Acc2, Mod, Iter2};
+ true ->
+ {iter, Fun, Acc2, Mod, Iter}
+ end;
+trav_apply(Recs, Header, Schema, {start, Fun, Acc, Mod, Iter}) ->
+ Iter2 =
+ if
+ Mod /= read_only ->
+ do_apply(Mod, write, [Iter, [Header]], Iter);
+ true ->
+ Iter
+ end,
+ TravAcc = trav_apply(Schema, Header, Schema, {iter, Fun, Acc, Mod, Iter2}),
+ trav_apply(Recs, Header, Schema, TravAcc).
+
+filter_foldl(Fun, Acc, [Head|Tail]) ->
+ case Fun(Head, Acc) of
+ {HeadItems, HeadAcc} when list(HeadItems) ->
+ {TailItems, TailAcc} = filter_foldl(Fun, HeadAcc, Tail),
+ {HeadItems ++ TailItems, TailAcc};
+ Other ->
+ throw({error, {"Fun must return a list", Other}})
+ end;
+filter_foldl(_Fun, Acc, []) ->
+ {[], Acc}.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_checkpoint.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_checkpoint.erl
new file mode 100644
index 0000000000..60a7a29861
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_checkpoint.erl
@@ -0,0 +1,1283 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_checkpoint.erl,v 1.1 2008/12/17 09:53:38 mikpe Exp $
+%%
+-module(mnesia_checkpoint).
+
+%% TM callback interface
+-export([
+ tm_add_copy/2,
+ tm_change_table_copy_type/3,
+ tm_del_copy/2,
+ tm_mnesia_down/1,
+ tm_prepare/1,
+ tm_retain/4,
+ tm_retain/5,
+ tm_enter_pending/1,
+ tm_enter_pending/3,
+ tm_exit_pending/1,
+ convert_cp_record/1
+ ]).
+
+%% Public interface
+-export([
+ activate/1,
+ checkpoints/0,
+ deactivate/1,
+ deactivate/2,
+ iterate/6,
+ most_local_node/2,
+ really_retain/2,
+ stop/0,
+ stop_iteration/1,
+ tables_and_cookie/1
+ ]).
+
+%% Internal
+-export([
+ call/2,
+ cast/2,
+ init/1,
+ remote_deactivate/1,
+ start/1
+ ]).
+
+%% sys callback interface
+-export([
+ system_code_change/4,
+ system_continue/3,
+ system_terminate/4
+ ]).
+
+-include("mnesia.hrl").
+-import(mnesia_lib, [add/2, del/2, set/2, unset/1]).
+-import(mnesia_lib, [dbg_out/2]).
+
+-record(tm, {log, pending, transactions, checkpoints}).
+
+-record(checkpoint_args, {name = {now(), node()},
+ allow_remote = true,
+ ram_overrides_dump = false,
+ nodes = [],
+ node = node(),
+ now = now(),
+ cookie = ?unique_cookie,
+ min = [],
+ max = [],
+ pending_tab,
+ wait_for_old, % Initially undefined then List
+ is_activated = false,
+ ignore_new = [],
+ retainers = [],
+ iterators = [],
+ supervisor,
+ pid
+ }).
+
+%% Old record definition
+-record(checkpoint, {name,
+ allow_remote,
+ ram_overrides_dump,
+ nodes,
+ node,
+ now,
+ min,
+ max,
+ pending_tab,
+ wait_for_old,
+ is_activated,
+ ignore_new,
+ retainers,
+ iterators,
+ supervisor,
+ pid
+ }).
+
+-record(retainer, {cp_name, tab_name, store, writers = [], really_retain = true}).
+
+-record(iter, {tab_name, oid_tab, main_tab, retainer_tab, source, val, pid}).
+
+-record(pending, {tid, disc_nodes = [], ram_nodes = []}).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% TM callback functions
+
+stop() ->
+ lists:foreach(fun(Name) -> call(Name, stop) end,
+ checkpoints()),
+ ok.
+
+tm_prepare(Cp) when record(Cp, checkpoint_args) ->
+ Name = Cp#checkpoint_args.name,
+ case lists:member(Name, checkpoints()) of
+ false ->
+ start_retainer(Cp);
+ true ->
+ {error, {already_exists, Name, node()}}
+ end;
+tm_prepare(Cp) when record(Cp, checkpoint) ->
+ %% Node with old protocol sent an old checkpoint record
+ %% and we have to convert it
+ case convert_cp_record(Cp) of
+ {ok, NewCp} ->
+ tm_prepare(NewCp);
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+tm_mnesia_down(Node) ->
+ lists:foreach(fun(Name) -> cast(Name, {mnesia_down, Node}) end,
+ checkpoints()).
+
+%% Returns pending
+tm_enter_pending(Tid, DiscNs, RamNs) ->
+ Pending = #pending{tid = Tid, disc_nodes = DiscNs, ram_nodes = RamNs},
+ tm_enter_pending(Pending).
+
+tm_enter_pending(Pending) ->
+ PendingTabs = val(pending_checkpoints),
+ tm_enter_pending(PendingTabs, Pending).
+
+tm_enter_pending([], Pending) ->
+ Pending;
+tm_enter_pending([Tab | Tabs], Pending) ->
+ catch ?ets_insert(Tab, Pending),
+ tm_enter_pending(Tabs, Pending).
+
+tm_exit_pending(Tid) ->
+ Pids = val(pending_checkpoint_pids),
+ tm_exit_pending(Pids, Tid).
+
+tm_exit_pending([], Tid) ->
+ Tid;
+tm_exit_pending([Pid | Pids], Tid) ->
+ Pid ! {self(), {exit_pending, Tid}},
+ tm_exit_pending(Pids, Tid).
+
+enter_still_pending([Tid | Tids], Tab) ->
+ ?ets_insert(Tab, #pending{tid = Tid}),
+ enter_still_pending(Tids, Tab);
+enter_still_pending([], _Tab) ->
+ ok.
+
+
+%% Looks up checkpoints for functions in mnesia_tm.
+tm_retain(Tid, Tab, Key, Op) ->
+ case val({Tab, commit_work}) of
+ [{checkpoints, Checkpoints} | _ ] ->
+ tm_retain(Tid, Tab, Key, Op, Checkpoints);
+ _ ->
+ undefined
+ end.
+
+tm_retain(Tid, Tab, Key, Op, Checkpoints) ->
+ case Op of
+ clear_table ->
+ OldRecs = mnesia_lib:db_match_object(Tab, '_'),
+ send_group_retain(OldRecs, Checkpoints, Tid, Tab, []),
+ OldRecs;
+ _ ->
+ OldRecs = mnesia_lib:db_get(Tab, Key),
+ send_retain(Checkpoints, {retain, Tid, Tab, Key, OldRecs}),
+ OldRecs
+ end.
+
+send_group_retain([Rec | Recs], Checkpoints, Tid, Tab, [PrevRec | PrevRecs])
+ when element(2, Rec) /= element(2, PrevRec) ->
+ Key = element(2, PrevRec),
+ OldRecs = lists:reverse([PrevRec | PrevRecs]),
+ send_retain(Checkpoints, {retain, Tid, Tab, Key, OldRecs}),
+ send_group_retain(Recs, Checkpoints, Tid, Tab, [Rec]);
+send_group_retain([Rec | Recs], Checkpoints, Tid, Tab, Acc) ->
+ send_group_retain(Recs, Checkpoints, Tid, Tab, [Rec | Acc]);
+send_group_retain([], Checkpoints, Tid, Tab, [PrevRec | PrevRecs]) ->
+ Key = element(2, PrevRec),
+ OldRecs = lists:reverse([PrevRec | PrevRecs]),
+ send_retain(Checkpoints, {retain, Tid, Tab, Key, OldRecs}),
+ ok;
+send_group_retain([], _Checkpoints, _Tid, _Tab, []) ->
+ ok.
+
+send_retain([Name | Names], Msg) ->
+ cast(Name, Msg),
+ send_retain(Names, Msg);
+send_retain([], _Msg) ->
+ ok.
+
+tm_add_copy(Tab, Node) when Node /= node() ->
+ case val({Tab, commit_work}) of
+ [{checkpoints, Checkpoints} | _ ] ->
+ Fun = fun(Name) -> call(Name, {add_copy, Tab, Node}) end,
+ map_call(Fun, Checkpoints, ok);
+ _ ->
+ ok
+ end.
+
+tm_del_copy(Tab, Node) when Node == node() ->
+ mnesia_subscr:unsubscribe_table(Tab),
+ case val({Tab, commit_work}) of
+ [{checkpoints, Checkpoints} | _ ] ->
+ Fun = fun(Name) -> call(Name, {del_copy, Tab, Node}) end,
+ map_call(Fun, Checkpoints, ok);
+ _ ->
+ ok
+ end.
+
+tm_change_table_copy_type(Tab, From, To) ->
+ case val({Tab, commit_work}) of
+ [{checkpoints, Checkpoints} | _ ] ->
+ Fun = fun(Name) -> call(Name, {change_copy, Tab, From, To}) end,
+ map_call(Fun, Checkpoints, ok);
+ _ ->
+ ok
+ end.
+
+map_call(Fun, [Name | Names], Res) ->
+ case Fun(Name) of
+ ok ->
+ map_call(Fun, Names, Res);
+ {error, {no_exists, Name}} ->
+ map_call(Fun, Names, Res);
+ {error, Reason} ->
+ %% BUGBUG: We may end up with some checkpoint retainers
+ %% too much in the add_copy case. How do we remove them?
+ map_call(Fun, Names, {error, Reason})
+ end;
+map_call(_Fun, [], Res) ->
+ Res.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Public functions
+
+deactivate(Name) ->
+ case call(Name, get_checkpoint) of
+ {error, Reason} ->
+ {error, Reason};
+ Cp ->
+ deactivate(Cp#checkpoint_args.nodes, Name)
+ end.
+
+deactivate(Nodes, Name) ->
+ rpc:multicall(Nodes, ?MODULE, remote_deactivate, [Name]),
+ ok.
+
+remote_deactivate(Name) ->
+ call(Name, deactivate).
+
+checkpoints() -> val(checkpoints).
+
+tables_and_cookie(Name) ->
+ case call(Name, get_checkpoint) of
+ {error, Reason} ->
+ {error, Reason};
+ Cp ->
+ Tabs = Cp#checkpoint_args.min ++ Cp#checkpoint_args.max,
+ Cookie = Cp#checkpoint_args.cookie,
+ {ok, Tabs, Cookie}
+ end.
+
+most_local_node(Name, Tab) ->
+ case ?catch_val({Tab, {retainer, Name}}) of
+ {'EXIT', _} ->
+ {error, {"No retainer attached to table", [Tab, Name]}};
+ R ->
+ Writers = R#retainer.writers,
+ LocalWriter = lists:member(node(), Writers),
+ if
+ LocalWriter == true ->
+ {ok, node()};
+ Writers /= [] ->
+ {ok, hd(Writers)};
+ true ->
+ {error, {"No retainer attached to table", [Tab, Name]}}
+ end
+ end.
+
+really_retain(Name, Tab) ->
+ R = val({Tab, {retainer, Name}}),
+ R#retainer.really_retain.
+
+%% Activate a checkpoint.
+%%
+%% A checkpoint is a transaction consistent state that may be used to
+%% perform a distributed backup or to rollback the involved tables to
+%% their old state. Backups may also be used to restore tables to
+%% their old state. Args is a list of the following tuples:
+%%
+%% {name, Name}
+%% Name of checkpoint. Each checkpoint must have a name which
+%% is unique on the reachable nodes. The name may be reused when
+%% the checkpoint has been deactivated.
+%% By default a probably unique name is generated.
+%% Multiple checkpoints may be set on the same table.
+%%
+%% {allow_remote, Bool}
+%% false means that all retainers must be local. If the
+%% table does not reside locally, the checkpoint fails.
+%% true allows retainers on other nodes.
+%%
+%% {min, MinTabs}
+%% Minimize redundancy and only keep checkpoint info together with
+%% one replica, preferrably at the local node. If any node involved
+%% the checkpoint goes down, the checkpoint is deactivated.
+%%
+%% {max, MaxTabs}
+%% Maximize redundancy and keep checkpoint info together with all
+%% replicas. The checkpoint becomes more fault tolerant if the
+%% tables has several replicas. When new replicas are added, they
+%% will also get a retainer attached to them.
+%%
+%% {ram_overrides_dump, Bool}
+%% {ram_overrides_dump, Tabs}
+%% Only applicable for ram_copies. Bool controls which versions of
+%% the records that should be included in the checkpoint state.
+%% true means that the latest comitted records in ram (i.e. the
+%% records that the application accesses) should be included
+%% in the checkpoint. false means that the records dumped to
+%% dat-files (the records that will be loaded at startup) should
+%% be included in the checkpoint. Tabs is a list of tables.
+%% Default is false.
+%%
+%% {ignore_new, TidList}
+%% Normally we wait for all pending transactions to complete
+%% before we allow iteration over the checkpoint. But in order
+%% to cope with checkpoint activation inside a transaction that
+%% currently prepares commit (mnesia_init:get_net_work_copy) we
+%% need to have the ability to ignore the enclosing transaction.
+%% We do not wait for the transactions in TidList to end. The
+%% transactions in TidList are regarded as newer than the checkpoint.
+
+activate(Args) ->
+ case args2cp(Args) of
+ {ok, Cp} ->
+ do_activate(Cp);
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+args2cp(Args) when list(Args)->
+ case catch lists:foldl(fun check_arg/2, #checkpoint_args{}, Args) of
+ {'EXIT', Reason} ->
+ {error, Reason};
+ Cp ->
+ case check_tables(Cp) of
+ {error, Reason} ->
+ {error, Reason};
+ {ok, Overriders, AllTabs} ->
+ arrange_retainers(Cp, Overriders, AllTabs)
+ end
+ end;
+args2cp(Args) ->
+ {error, {badarg, Args}}.
+
+check_arg({name, Name}, Cp) ->
+ case lists:member(Name, checkpoints()) of
+ true ->
+ exit({already_exists, Name});
+ false ->
+ case catch tab2retainer({foo, Name}) of
+ List when list(List) ->
+ Cp#checkpoint_args{name = Name};
+ _ ->
+ exit({badarg, Name})
+ end
+ end;
+check_arg({allow_remote, true}, Cp) ->
+ Cp#checkpoint_args{allow_remote = true};
+check_arg({allow_remote, false}, Cp) ->
+ Cp#checkpoint_args{allow_remote = false};
+check_arg({ram_overrides_dump, true}, Cp) ->
+ Cp#checkpoint_args{ram_overrides_dump = true};
+check_arg({ram_overrides_dump, false}, Cp) ->
+ Cp#checkpoint_args{ram_overrides_dump = false};
+check_arg({ram_overrides_dump, Tabs}, Cp) when list(Tabs) ->
+ Cp#checkpoint_args{ram_overrides_dump = Tabs};
+check_arg({min, Tabs}, Cp) when list(Tabs) ->
+ Cp#checkpoint_args{min = Tabs};
+check_arg({max, Tabs}, Cp) when list(Tabs) ->
+ Cp#checkpoint_args{max = Tabs};
+check_arg({ignore_new, Tids}, Cp) when list(Tids) ->
+ Cp#checkpoint_args{ignore_new = Tids};
+check_arg(Arg, _) ->
+ exit({badarg, Arg}).
+
+check_tables(Cp) ->
+ Min = Cp#checkpoint_args.min,
+ Max = Cp#checkpoint_args.max,
+ AllTabs = Min ++ Max,
+ DoubleTabs = [T || T <- Min, lists:member(T, Max)],
+ Overriders = Cp#checkpoint_args.ram_overrides_dump,
+ if
+ DoubleTabs /= [] ->
+ {error, {combine_error, Cp#checkpoint_args.name,
+ [{min, DoubleTabs}, {max, DoubleTabs}]}};
+ Min == [], Max == [] ->
+ {error, {combine_error, Cp#checkpoint_args.name,
+ [{min, Min}, {max, Max}]}};
+ Overriders == false ->
+ {ok, [], AllTabs};
+ Overriders == true ->
+ {ok, AllTabs, AllTabs};
+ list(Overriders) ->
+ case [T || T <- Overriders, not lists:member(T, Min)] of
+ [] ->
+ case [T || T <- Overriders, not lists:member(T, Max)] of
+ [] ->
+ {ok, Overriders, AllTabs};
+ Outsiders ->
+ {error, {combine_error, Cp#checkpoint_args.name,
+ [{ram_overrides_dump, Outsiders},
+ {max, Outsiders}]}}
+ end;
+ Outsiders ->
+ {error, {combine_error, Cp#checkpoint_args.name,
+ [{ram_overrides_dump, Outsiders},
+ {min, Outsiders}]}}
+ end
+ end.
+
+arrange_retainers(Cp, Overriders, AllTabs) ->
+ R = #retainer{cp_name = Cp#checkpoint_args.name},
+ case catch [R#retainer{tab_name = Tab,
+ writers = select_writers(Cp, Tab)}
+ || Tab <- AllTabs] of
+ {'EXIT', Reason} ->
+ {error, Reason};
+ Retainers ->
+ {ok, Cp#checkpoint_args{ram_overrides_dump = Overriders,
+ retainers = Retainers,
+ nodes = writers(Retainers)}}
+ end.
+
+select_writers(Cp, Tab) ->
+ case filter_remote(Cp, val({Tab, active_replicas})) of
+ [] ->
+ exit({"Cannot prepare checkpoint (replica not available)",
+ [Tab, Cp#checkpoint_args.name]});
+ Writers ->
+ This = node(),
+ case {lists:member(Tab, Cp#checkpoint_args.max),
+ lists:member(This, Writers)} of
+ {true, _} -> Writers; % Max
+ {false, true} -> [This];
+ {false, false} -> [hd(Writers)]
+ end
+ end.
+
+filter_remote(Cp, Writers) when Cp#checkpoint_args.allow_remote == true ->
+ Writers;
+filter_remote(_Cp, Writers) ->
+ This = node(),
+ case lists:member(This, Writers) of
+ true -> [This];
+ false -> []
+ end.
+
+writers(Retainers) ->
+ Fun = fun(R, Acc) -> R#retainer.writers ++ Acc end,
+ Writers = lists:foldl(Fun, [], Retainers),
+ mnesia_lib:uniq(Writers).
+
+do_activate(Cp) ->
+ Name = Cp#checkpoint_args.name,
+ Nodes = Cp#checkpoint_args.nodes,
+ case mnesia_tm:prepare_checkpoint(Nodes, Cp) of
+ {Replies, []} ->
+ check_prep(Replies, Name, Nodes, Cp#checkpoint_args.ignore_new);
+ {_, BadNodes} ->
+ {error, {"Cannot prepare checkpoint (bad nodes)",
+ [Name, BadNodes]}}
+ end.
+
+check_prep([{ok, Name, IgnoreNew, _Node} | Replies], Name, Nodes, IgnoreNew) ->
+ check_prep(Replies, Name, Nodes, IgnoreNew);
+check_prep([{error, Reason} | _Replies], Name, _Nodes, _IgnoreNew) ->
+ {error, {"Cannot prepare checkpoint (bad reply)",
+ [Name, Reason]}};
+check_prep([{badrpc, Reason} | _Replies], Name, _Nodes, _IgnoreNew) ->
+ {error, {"Cannot prepare checkpoint (badrpc)",
+ [Name, Reason]}};
+check_prep([], Name, Nodes, IgnoreNew) ->
+ collect_pending(Name, Nodes, IgnoreNew).
+
+collect_pending(Name, Nodes, IgnoreNew) ->
+ case rpc:multicall(Nodes, ?MODULE, call, [Name, collect_pending]) of
+ {Replies, []} ->
+ case catch ?ets_new_table(mnesia_union, [bag]) of
+ {'EXIT', Reason} -> %% system limit
+ Msg = "Cannot create an ets table pending union",
+ {error, {system_limit, Msg, Reason}};
+ UnionTab ->
+ compute_union(Replies, Nodes, Name, UnionTab, IgnoreNew)
+ end;
+ {_, BadNodes} ->
+ deactivate(Nodes, Name),
+ {error, {"Cannot collect from pending checkpoint", Name, BadNodes}}
+ end.
+
+compute_union([{ok, Pending} | Replies], Nodes, Name, UnionTab, IgnoreNew) ->
+ add_pending(Pending, UnionTab),
+ compute_union(Replies, Nodes, Name, UnionTab, IgnoreNew);
+compute_union([{error, Reason} | _Replies], Nodes, Name, UnionTab, _IgnoreNew) ->
+ deactivate(Nodes, Name),
+ ?ets_delete_table(UnionTab),
+ {error, Reason};
+compute_union([{badrpc, Reason} | _Replies], Nodes, Name, UnionTab, _IgnoreNew) ->
+ deactivate(Nodes, Name),
+ ?ets_delete_table(UnionTab),
+ {error, {badrpc, Reason}};
+compute_union([], Nodes, Name, UnionTab, IgnoreNew) ->
+ send_activate(Nodes, Nodes, Name, UnionTab, IgnoreNew).
+
+add_pending([P | Pending], UnionTab) ->
+ add_pending_node(P#pending.disc_nodes, P#pending.tid, UnionTab),
+ add_pending_node(P#pending.ram_nodes, P#pending.tid, UnionTab),
+ add_pending(Pending, UnionTab);
+add_pending([], _UnionTab) ->
+ ok.
+
+add_pending_node([Node | Nodes], Tid, UnionTab) ->
+ ?ets_insert(UnionTab, {Node, Tid}),
+ add_pending_node(Nodes, Tid, UnionTab);
+add_pending_node([], _Tid, _UnionTab) ->
+ ok.
+
+send_activate([Node | Nodes], AllNodes, Name, UnionTab, IgnoreNew) ->
+ Pending = [Tid || {_, Tid} <- ?ets_lookup(UnionTab, Node),
+ not lists:member(Tid, IgnoreNew)],
+ case rpc:call(Node, ?MODULE, call, [Name, {activate, Pending}]) of
+ activated ->
+ send_activate(Nodes, AllNodes, Name, UnionTab, IgnoreNew);
+ {badrpc, Reason} ->
+ deactivate(Nodes, Name),
+ ?ets_delete_table(UnionTab),
+ {error, {"Activation failed (bad node)", Name, Node, Reason}};
+ {error, Reason} ->
+ deactivate(Nodes, Name),
+ ?ets_delete_table(UnionTab),
+ {error, {"Activation failed", Name, Node, Reason}}
+ end;
+send_activate([], AllNodes, Name, UnionTab, _IgnoreNew) ->
+ ?ets_delete_table(UnionTab),
+ {ok, Name, AllNodes}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Checkpoint server
+
+cast(Name, Msg) ->
+ case ?catch_val({checkpoint, Name}) of
+ {'EXIT', _} ->
+ {error, {no_exists, Name}};
+
+ Pid when pid(Pid) ->
+ Pid ! {self(), Msg},
+ {ok, Pid}
+ end.
+
+call(Name, Msg) ->
+ case cast(Name, Msg) of
+ {ok, Pid} ->
+ catch link(Pid), % Always local
+ Self = self(),
+ receive
+ {'EXIT', Pid, Reason} ->
+ {error, {"Got exit", [Name, Reason]}};
+ {Name, Self, Reply} ->
+ unlink(Pid),
+ Reply
+ end;
+ Error ->
+ Error
+ end.
+
+abcast(Nodes, Name, Msg) ->
+ rpc:eval_everywhere(Nodes, ?MODULE, cast, [Name, Msg]).
+
+reply(nopid, _Name, _Reply) ->
+ ignore;
+reply(ReplyTo, Name, Reply) ->
+ ReplyTo ! {Name, ReplyTo, Reply}.
+
+%% Returns {ok, NewCp} or {error, Reason}
+start_retainer(Cp) ->
+ % Will never be restarted
+ Name = Cp#checkpoint_args.name,
+ case supervisor:start_child(mnesia_checkpoint_sup, [Cp]) of
+ {ok, _Pid} ->
+ {ok, Name, Cp#checkpoint_args.ignore_new, node()};
+ {error, Reason} ->
+ {error, {"Cannot create checkpoint retainer",
+ Name, node(), Reason}}
+ end.
+
+start(Cp) ->
+ Name = Cp#checkpoint_args.name,
+ Args = [Cp#checkpoint_args{supervisor = self()}],
+ mnesia_monitor:start_proc({?MODULE, Name}, ?MODULE, init, Args).
+
+init(Cp) ->
+ process_flag(trap_exit, true),
+ Name = Cp#checkpoint_args.name,
+ Props = [set, public, {keypos, 2}],
+ case catch ?ets_new_table(mnesia_pending_checkpoint, Props) of
+ {'EXIT', Reason} -> %% system limit
+ Msg = "Cannot create an ets table for pending transactions",
+ Error = {error, {system_limit, Name, Msg, Reason}},
+ proc_lib:init_ack(Cp#checkpoint_args.supervisor, Error);
+ PendingTab ->
+ Rs = [prepare_tab(Cp, R) || R <- Cp#checkpoint_args.retainers],
+ Cp2 = Cp#checkpoint_args{retainers = Rs,
+ pid = self(),
+ pending_tab = PendingTab},
+ add(pending_checkpoint_pids, self()),
+ add(pending_checkpoints, PendingTab),
+ set({checkpoint, Name}, self()),
+ add(checkpoints, Name),
+ dbg_out("Checkpoint ~p (~p) started~n", [Name, self()]),
+ proc_lib:init_ack(Cp2#checkpoint_args.supervisor, {ok, self()}),
+ retainer_loop(Cp2)
+ end.
+
+prepare_tab(Cp, R) ->
+ Tab = R#retainer.tab_name,
+ prepare_tab(Cp, R, val({Tab, storage_type})).
+
+prepare_tab(Cp, R, Storage) ->
+ Tab = R#retainer.tab_name,
+ Name = R#retainer.cp_name,
+ case lists:member(node(), R#retainer.writers) of
+ true ->
+ R2 = retainer_create(Cp, R, Tab, Name, Storage),
+ set({Tab, {retainer, Name}}, R2),
+ add({Tab, checkpoints}, Name), %% Keep checkpoint info for table_info & mnesia_session
+ add_chkp_info(Tab, Name),
+ R2;
+ false ->
+ set({Tab, {retainer, Name}}, R#retainer{store = undefined}),
+ R
+ end.
+
+add_chkp_info(Tab, Name) ->
+ case val({Tab, commit_work}) of
+ [{checkpoints, OldList} | CommitList] ->
+ case lists:member(Name, OldList) of
+ true ->
+ ok;
+ false ->
+ NewC = [{checkpoints, [Name | OldList]} | CommitList],
+ mnesia_lib:set({Tab, commit_work}, NewC)
+ end;
+ CommitList ->
+ Chkp = {checkpoints, [Name]},
+ %% OBS checkpoints needs to be first in the list!
+ mnesia_lib:set({Tab, commit_work}, [Chkp | CommitList])
+ end.
+
+tab2retainer({Tab, Name}) ->
+ FlatName = lists:flatten(io_lib:write(Name)),
+ mnesia_lib:dir(lists:concat([?MODULE, "_", Tab, "_", FlatName, ".RET"])).
+
+retainer_create(_Cp, R, Tab, Name, disc_only_copies) ->
+ Fname = tab2retainer({Tab, Name}),
+ file:delete(Fname),
+ Args = [{file, Fname}, {type, set}, {keypos, 2}, {repair, false}],
+ {ok, _} = mnesia_lib:dets_sync_open({Tab, Name}, Args),
+ dbg_out("Checkpoint retainer created ~p ~p~n", [Name, Tab]),
+ R#retainer{store = {dets, {Tab, Name}}, really_retain = true};
+retainer_create(Cp, R, Tab, Name, Storage) ->
+ T = ?ets_new_table(mnesia_retainer, [set, public, {keypos, 2}]),
+ Overriders = Cp#checkpoint_args.ram_overrides_dump,
+ ReallyR = R#retainer.really_retain,
+ ReallyCp = lists:member(Tab, Overriders),
+ ReallyR2 = prepare_ram_tab(Tab, T, Storage, ReallyR, ReallyCp),
+ dbg_out("Checkpoint retainer created ~p ~p~n", [Name, Tab]),
+ R#retainer{store = {ets, T}, really_retain = ReallyR2}.
+
+%% Copy the dumped table into retainer if needed
+%% If the really_retain flag already has been set to false,
+%% it should remain false even if we change storage type
+%% while the checkpoint is activated.
+prepare_ram_tab(Tab, T, ram_copies, true, false) ->
+ Fname = mnesia_lib:tab2dcd(Tab),
+ case mnesia_lib:exists(Fname) of
+ true ->
+ Log = mnesia_log:open_log(prepare_ram_tab,
+ mnesia_log:dcd_log_header(),
+ Fname, true,
+ mnesia_monitor:get_env(auto_repair),
+ read_only),
+ Add = fun(Rec) ->
+ Key = element(2, Rec),
+ Recs =
+ case ?ets_lookup(T, Key) of
+ [] -> [];
+ [{_, _, Old}] -> Old
+ end,
+ ?ets_insert(T, {Tab, Key, [Rec | Recs]}),
+ continue
+ end,
+ traverse_dcd(mnesia_log:chunk_log(Log, start), Log, Add),
+ mnesia_log:close_log(Log);
+ false ->
+ ok
+ end,
+ false;
+prepare_ram_tab(_, _, _, ReallyRetain, _) ->
+ ReallyRetain.
+
+traverse_dcd({Cont, [LogH | Rest]}, Log, Fun)
+ when record(LogH, log_header),
+ LogH#log_header.log_kind == dcd_log,
+ LogH#log_header.log_version >= "1.0" ->
+ traverse_dcd({Cont, Rest}, Log, Fun); %% BUGBUG Error handling repaired files
+traverse_dcd({Cont, Recs}, Log, Fun) -> %% trashed data??
+ lists:foreach(Fun, Recs),
+ traverse_dcd(mnesia_log:chunk_log(Log, Cont), Log, Fun);
+traverse_dcd(eof, _Log, _Fun) ->
+ ok.
+
+retainer_get({ets, Store}, Key) -> ?ets_lookup(Store, Key);
+retainer_get({dets, Store}, Key) -> dets:lookup(Store, Key).
+
+retainer_put({ets, Store}, Val) -> ?ets_insert(Store, Val);
+retainer_put({dets, Store}, Val) -> dets:insert(Store, Val).
+
+retainer_first({ets, Store}) -> ?ets_first(Store);
+retainer_first({dets, Store}) -> dets:first(Store).
+
+retainer_next({ets, Store}, Key) -> ?ets_next(Store, Key);
+retainer_next({dets, Store}, Key) -> dets:next(Store, Key).
+
+%% retainer_next_slot(Tab, Pos) ->
+%% case retainer_slot(Tab, Pos) of
+%% '$end_of_table' ->
+%% '$end_of_table';
+%% [] ->
+%% retainer_next_slot(Tab, Pos + 1);
+%% Recs when list(Recs) ->
+%% {Pos, Recs}
+%% end.
+%%
+%% retainer_slot({ets, Store}, Pos) -> ?ets_next(Store, Pos);
+%% retainer_slot({dets, Store}, Pos) -> dets:slot(Store, Pos).
+
+retainer_fixtable(Tab, Bool) when atom(Tab) ->
+ mnesia_lib:db_fixtable(val({Tab, storage_type}), Tab, Bool);
+retainer_fixtable({ets, Tab}, Bool) ->
+ mnesia_lib:db_fixtable(ram_copies, Tab, Bool);
+retainer_fixtable({dets, Tab}, Bool) ->
+ mnesia_lib:db_fixtable(disc_only_copies, Tab, Bool).
+
+retainer_delete({ets, Store}) ->
+ ?ets_delete_table(Store);
+retainer_delete({dets, Store}) ->
+ mnesia_lib:dets_sync_close(Store),
+ Fname = tab2retainer(Store),
+ file:delete(Fname).
+
+retainer_loop(Cp) ->
+ Name = Cp#checkpoint_args.name,
+ receive
+ {_From, {retain, Tid, Tab, Key, OldRecs}}
+ when Cp#checkpoint_args.wait_for_old == [] ->
+ R = val({Tab, {retainer, Name}}),
+ case R#retainer.really_retain of
+ true ->
+ PendingTab = Cp#checkpoint_args.pending_tab,
+ case catch ?ets_lookup_element(PendingTab, Tid, 1) of
+ {'EXIT', _} ->
+ Store = R#retainer.store,
+ case retainer_get(Store, Key) of
+ [] ->
+ retainer_put(Store, {Tab, Key, OldRecs});
+ _ ->
+ already_retained
+ end;
+ pending ->
+ ignore
+ end;
+ false ->
+ ignore
+ end,
+ retainer_loop(Cp);
+
+ %% Adm
+ {From, deactivate} ->
+ do_stop(Cp),
+ reply(From, Name, deactivated),
+ unlink(From),
+ exit(shutdown);
+
+ {'EXIT', Parent, _} when Parent == Cp#checkpoint_args.supervisor ->
+ %% do_stop(Cp),
+ %% assume that entire Mnesia is terminating
+ exit(shutdown);
+
+ {_From, {mnesia_down, Node}} ->
+ Cp2 = do_del_retainers(Cp, Node),
+ retainer_loop(Cp2);
+ {From, get_checkpoint} ->
+ reply(From, Name, Cp),
+ retainer_loop(Cp);
+ {From, {add_copy, Tab, Node}} when Cp#checkpoint_args.wait_for_old == [] ->
+ {Res, Cp2} = do_add_copy(Cp, Tab, Node),
+ reply(From, Name, Res),
+ retainer_loop(Cp2);
+ {From, {del_copy, Tab, Node}} when Cp#checkpoint_args.wait_for_old == [] ->
+ Cp2 = do_del_copy(Cp, Tab, Node),
+ reply(From, Name, ok),
+ retainer_loop(Cp2);
+ {From, {change_copy, Tab, From, To}} when Cp#checkpoint_args.wait_for_old == [] ->
+ Cp2 = do_change_copy(Cp, Tab, From, To),
+ reply(From, Name, ok),
+ retainer_loop(Cp2);
+ {_From, {add_retainer, R, Node}} ->
+ Cp2 = do_add_retainer(Cp, R, Node),
+ retainer_loop(Cp2);
+ {_From, {del_retainer, R, Node}} when Cp#checkpoint_args.wait_for_old == [] ->
+ Cp2 = do_del_retainer(Cp, R, Node),
+ retainer_loop(Cp2);
+
+ %% Iteration
+ {From, {iter_begin, Iter}} when Cp#checkpoint_args.wait_for_old == [] ->
+ Cp2 = iter_begin(Cp, From, Iter),
+ retainer_loop(Cp2);
+
+ {From, {iter_end, Iter}} when Cp#checkpoint_args.wait_for_old == [] ->
+ retainer_fixtable(Iter#iter.oid_tab, false),
+ Iters = Cp#checkpoint_args.iterators -- [Iter],
+ reply(From, Name, ok),
+ retainer_loop(Cp#checkpoint_args{iterators = Iters});
+
+ {_From, {exit_pending, Tid}}
+ when list(Cp#checkpoint_args.wait_for_old) ->
+ StillPending = lists:delete(Tid, Cp#checkpoint_args.wait_for_old),
+ Cp2 = Cp#checkpoint_args{wait_for_old = StillPending},
+ Cp3 = maybe_activate(Cp2),
+ retainer_loop(Cp3);
+
+ {From, collect_pending} ->
+ PendingTab = Cp#checkpoint_args.pending_tab,
+ del(pending_checkpoints, PendingTab),
+ Pending = ?ets_match_object(PendingTab, '_'),
+ reply(From, Name, {ok, Pending}),
+ retainer_loop(Cp);
+
+ {From, {activate, Pending}} ->
+ StillPending = mnesia_recover:still_pending(Pending),
+ enter_still_pending(StillPending, Cp#checkpoint_args.pending_tab),
+ Cp2 = maybe_activate(Cp#checkpoint_args{wait_for_old = StillPending}),
+ reply(From, Name, activated),
+ retainer_loop(Cp2);
+
+ {'EXIT', From, _Reason} ->
+ Iters = [Iter || Iter <- Cp#checkpoint_args.iterators,
+ check_iter(From, Iter)],
+ retainer_loop(Cp#checkpoint_args{iterators = Iters});
+
+ {system, From, Msg} ->
+ dbg_out("~p got {system, ~p, ~p}~n", [?MODULE, From, Msg]),
+ sys:handle_system_msg(Msg, From, no_parent, ?MODULE, [], Cp)
+ end.
+
+maybe_activate(Cp)
+ when Cp#checkpoint_args.wait_for_old == [],
+ Cp#checkpoint_args.is_activated == false ->
+ Cp#checkpoint_args{pending_tab = undefined, is_activated = true};
+maybe_activate(Cp) ->
+ Cp.
+
+iter_begin(Cp, From, Iter) ->
+ Name = Cp#checkpoint_args.name,
+ R = val({Iter#iter.tab_name, {retainer, Name}}),
+ Iter2 = init_tabs(R, Iter),
+ Iter3 = Iter2#iter{pid = From},
+ retainer_fixtable(Iter3#iter.oid_tab, true),
+ Iters = [Iter3 | Cp#checkpoint_args.iterators],
+ reply(From, Name, {ok, Iter3, self()}),
+ Cp#checkpoint_args{iterators = Iters}.
+
+do_stop(Cp) ->
+ Name = Cp#checkpoint_args.name,
+ del(pending_checkpoints, Cp#checkpoint_args.pending_tab),
+ del(pending_checkpoint_pids, self()),
+ del(checkpoints, Name),
+ unset({checkpoint, Name}),
+ lists:foreach(fun deactivate_tab/1, Cp#checkpoint_args.retainers),
+ Iters = Cp#checkpoint_args.iterators,
+ lists:foreach(fun(I) -> retainer_fixtable(I#iter.oid_tab, false) end, Iters).
+
+deactivate_tab(R) ->
+ Name = R#retainer.cp_name,
+ Tab = R#retainer.tab_name,
+ del({Tab, checkpoints}, Name), %% Keep checkpoint info for table_info & mnesia_session
+ del_chkp_info(Tab, Name),
+ unset({Tab, {retainer, Name}}),
+ Active = lists:member(node(), R#retainer.writers),
+ case R#retainer.store of
+ undefined ->
+ ignore;
+ Store when Active == true ->
+ retainer_delete(Store);
+ _ ->
+ ignore
+ end.
+
+del_chkp_info(Tab, Name) ->
+ case val({Tab, commit_work}) of
+ [{checkpoints, ChkList} | Rest] ->
+ case lists:delete(Name, ChkList) of
+ [] ->
+ %% The only checkpoint was deleted
+ mnesia_lib:set({Tab, commit_work}, Rest);
+ NewList ->
+ mnesia_lib:set({Tab, commit_work},
+ [{checkpoints, NewList} | Rest])
+ end;
+ _ -> ignore
+ end.
+
+do_del_retainers(Cp, Node) ->
+ Rs = [do_del_retainer2(Cp, R, Node) || R <- Cp#checkpoint_args.retainers],
+ Cp#checkpoint_args{retainers = Rs, nodes = writers(Rs)}.
+
+do_del_retainer2(Cp, R, Node) ->
+ Writers = R#retainer.writers -- [Node],
+ R2 = R#retainer{writers = Writers},
+ set({R2#retainer.tab_name, {retainer, R2#retainer.cp_name}}, R2),
+ if
+ Writers == [] ->
+ Event = {mnesia_checkpoint_deactivated, Cp#checkpoint_args.name},
+ mnesia_lib:report_system_event(Event),
+ do_stop(Cp),
+ exit(shutdown);
+ Node == node() ->
+ deactivate_tab(R), % Avoids unnecessary tm_retain accesses
+ set({R2#retainer.tab_name, {retainer, R2#retainer.cp_name}}, R2),
+ R2;
+ true ->
+ R2
+ end.
+
+do_del_retainer(Cp, R0, Node) ->
+ {R, Rest} = find_retainer(R0, Cp#checkpoint_args.retainers, []),
+ R2 = do_del_retainer2(Cp, R, Node),
+ Rs = [R2|Rest],
+ Cp#checkpoint_args{retainers = Rs, nodes = writers(Rs)}.
+
+do_del_copy(Cp, Tab, ThisNode) when ThisNode == node() ->
+ Name = Cp#checkpoint_args.name,
+ Others = Cp#checkpoint_args.nodes -- [ThisNode],
+ R = val({Tab, {retainer, Name}}),
+ abcast(Others, Name, {del_retainer, R, ThisNode}),
+ do_del_retainer(Cp, R, ThisNode).
+
+do_add_copy(Cp, Tab, Node) when Node /= node()->
+ case lists:member(Tab, Cp#checkpoint_args.max) of
+ false ->
+ {ok, Cp};
+ true ->
+ Name = Cp#checkpoint_args.name,
+ R0 = val({Tab, {retainer, Name}}),
+ W = R0#retainer.writers,
+ R = R0#retainer{writers = W ++ [Node]},
+
+ case lists:member(Node, Cp#checkpoint_args.nodes) of
+ true ->
+ send_retainer(Cp, R, Node);
+ false ->
+ case tm_remote_prepare(Node, Cp) of
+ {ok, Name, _IgnoreNew, Node} ->
+ case lists:member(schema, Cp#checkpoint_args.max) of
+ true ->
+ %% We need to send schema retainer somewhere
+ RS0 = val({schema, {retainer, Name}}),
+ W = RS0#retainer.writers,
+ RS1 = RS0#retainer{writers = W ++ [Node]},
+ case send_retainer(Cp, RS1, Node) of
+ {ok, Cp1} ->
+ send_retainer(Cp1, R, Node);
+ Error ->
+ Error
+ end;
+ false ->
+ send_retainer(Cp, R, Node)
+ end;
+ {badrpc, Reason} ->
+ {{error, {badrpc, Reason}}, Cp};
+ {error, Reason} ->
+ {{error, Reason}, Cp}
+ end
+ end
+ end.
+
+tm_remote_prepare(Node, Cp) ->
+ rpc:call(Node, ?MODULE, tm_prepare, [Cp]).
+
+do_add_retainer(Cp, R0, Node) ->
+ Writers = R0#retainer.writers,
+ {R, Rest} = find_retainer(R0, Cp#checkpoint_args.retainers, []),
+ NewRet =
+ if
+ Node == node() ->
+ prepare_tab(Cp, R#retainer{writers = Writers});
+ true ->
+ R#retainer{writers = Writers}
+ end,
+ Rs = [NewRet | Rest],
+ set({NewRet#retainer.tab_name, {retainer, NewRet#retainer.cp_name}}, NewRet),
+ Cp#checkpoint_args{retainers = Rs, nodes = writers(Rs)}.
+
+find_retainer(#retainer{cp_name = CP, tab_name = Tab},
+ [Ret = #retainer{cp_name = CP, tab_name = Tab} | R], Acc) ->
+ {Ret, R ++ Acc};
+find_retainer(Ret, [H|R], Acc) ->
+ find_retainer(Ret, R, [H|Acc]).
+
+send_retainer(Cp, R, Node) ->
+ Name = Cp#checkpoint_args.name,
+ Nodes0 = Cp#checkpoint_args.nodes -- [Node],
+ Nodes1 = Nodes0 ++ [Node],
+ Nodes = Nodes1 -- [node()],
+ abcast(Nodes, Name, {add_retainer, R, Node}),
+ Store = R#retainer.store,
+%% send_retainer2(Node, Name, Store, retainer_next_slot(Store, 0)),
+ send_retainer2(Node, Name, Store, retainer_first(Store)),
+ Cp2 = do_add_retainer(Cp, R, Node),
+ {ok, Cp2}.
+
+send_retainer2(_, _, _, '$end_of_table') ->
+ ok;
+%%send_retainer2(Node, Name, Store, {Slot, Records}) ->
+send_retainer2(Node, Name, Store, Key) ->
+ [{Tab, _, Records}] = retainer_get(Store, Key),
+ abcast([Node], Name, {retain, {dirty, send_retainer}, Tab, Key, Records}),
+ send_retainer2(Node, Name, Store, retainer_next(Store, Key)).
+
+do_change_copy(Cp, Tab, FromType, ToType) ->
+ Name = Cp#checkpoint_args.name,
+ R = val({Tab, {retainer, Name}}),
+ R2 = prepare_tab(Cp, R, ToType),
+ {_, Old} = R#retainer.store,
+ {_, New} = R2#retainer.store,
+
+ Fname = tab2retainer({Tab, Name}),
+ if
+ FromType == disc_only_copies ->
+ mnesia_lib:dets_sync_close(Old),
+ loaded = mnesia_lib:dets_to_ets(Old, New, Fname, set, no, yes),
+ ok = file:delete(Fname);
+ ToType == disc_only_copies ->
+ TabSize = ?ets_info(Old, size),
+ Props = [{file, Fname},
+ {type, set},
+ {keypos, 2},
+%% {ram_file, true},
+ {estimated_no_objects, TabSize + 256},
+ {repair, false}],
+ {ok, _} = mnesia_lib:dets_sync_open(New, Props),
+ ok = mnesia_dumper:raw_dump_table(New, Old),
+ ?ets_delete_table(Old);
+ true ->
+ ignore
+ end,
+ Pos = #retainer.tab_name,
+ Rs = lists:keyreplace(Tab, Pos, Cp#checkpoint_args.retainers, R2),
+ Cp#checkpoint_args{retainers = Rs, nodes = writers(Rs)}.
+
+check_iter(From, Iter) when Iter#iter.pid == From ->
+ retainer_fixtable(Iter#iter.oid_tab, false),
+ false;
+check_iter(_From, _Iter) ->
+ true.
+
+init_tabs(R, Iter) ->
+ {Kind, _} = Store = R#retainer.store,
+ Main = {Kind, Iter#iter.tab_name},
+ Ret = Store,
+ Iter2 = Iter#iter{main_tab = Main, retainer_tab = Ret},
+ case Iter#iter.source of
+ table -> Iter2#iter{oid_tab = Main};
+ retainer -> Iter2#iter{oid_tab = Ret}
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Iteration
+%%
+%% Iterates over a table and applies Fun(ListOfRecords)
+%% with a suitable amount of records, e.g. 1000 or so.
+%% ListOfRecords is [] when the iteration is over.
+%%
+%% OidKind affects which internal table to be iterated over and
+%% ValKind affects which table to pick the actual records from. Legal
+%% values for OidKind and ValKind is the atom table or the atom
+%% retainer.
+%%
+%% The iteration may either be performed over the main table (which
+%% contains the latest values of the records, i.e. the values that
+%% are visible to the applications) or over the checkpoint retainer
+%% (which contains the values as the looked like the timepoint when
+%% the checkpoint was activated).
+%%
+%% It is possible to iterate over the main table and pick values
+%% from the retainer and vice versa.
+
+iterate(Name, Tab, Fun, Acc, Source, Val) ->
+ Iter0 = #iter{tab_name = Tab, source = Source, val = Val},
+ case call(Name, {iter_begin, Iter0}) of
+ {error, Reason} ->
+ {error, Reason};
+ {ok, Iter, Pid} ->
+ link(Pid), % We don't want any pending fixtable's
+ Res = (catch iter(Fun, Acc, Iter)),
+ unlink(Pid),
+ call(Name, {iter_end, Iter}),
+ case Res of
+ {'EXIT', Reason} -> {error, Reason};
+ {error, Reason} -> {error, Reason};
+ Acc2 -> {ok, Acc2}
+ end
+ end.
+
+iter(Fun, Acc, Iter)->
+ iter(Fun, Acc, Iter, retainer_first(Iter#iter.oid_tab)).
+
+iter(Fun, Acc, Iter, Key) ->
+ case get_records(Iter, Key) of
+ {'$end_of_table', []} ->
+ Fun([], Acc);
+ {'$end_of_table', Records} ->
+ Acc2 = Fun(Records, Acc),
+ Fun([], Acc2);
+ {Next, Records} ->
+ Acc2 = Fun(Records, Acc),
+ iter(Fun, Acc2, Iter, Next)
+ end.
+
+stop_iteration(Reason) ->
+ throw({error, {stopped, Reason}}).
+
+get_records(Iter, Key) ->
+ get_records(Iter, Key, 500, []). % 500 keys
+
+get_records(_Iter, Key, 0, Acc) ->
+ {Key, lists:append(lists:reverse(Acc))};
+get_records(_Iter, '$end_of_table', _I, Acc) ->
+ {'$end_of_table', lists:append(lists:reverse(Acc))};
+get_records(Iter, Key, I, Acc) ->
+ Recs = get_val(Iter, Key),
+ Next = retainer_next(Iter#iter.oid_tab, Key),
+ get_records(Iter, Next, I-1, [Recs | Acc]).
+
+get_val(Iter, Key) when Iter#iter.val == latest ->
+ get_latest_val(Iter, Key);
+get_val(Iter, Key) when Iter#iter.val == checkpoint ->
+ get_checkpoint_val(Iter, Key).
+
+get_latest_val(Iter, Key) when Iter#iter.source == table ->
+ retainer_get(Iter#iter.main_tab, Key);
+get_latest_val(Iter, Key) when Iter#iter.source == retainer ->
+ DeleteOid = {Iter#iter.tab_name, Key},
+ [DeleteOid | retainer_get(Iter#iter.main_tab, Key)].
+
+get_checkpoint_val(Iter, Key) when Iter#iter.source == table ->
+ retainer_get(Iter#iter.main_tab, Key);
+get_checkpoint_val(Iter, Key) when Iter#iter.source == retainer ->
+ DeleteOid = {Iter#iter.tab_name, Key},
+ case retainer_get(Iter#iter.retainer_tab, Key) of
+ [{_, _, []}] -> [DeleteOid];
+ [{_, _, Records}] -> [DeleteOid | Records]
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% System upgrade
+
+system_continue(_Parent, _Debug, Cp) ->
+ retainer_loop(Cp).
+
+system_terminate(_Reason, _Parent,_Debug, Cp) ->
+ do_stop(Cp).
+
+system_code_change(Cp, _Module, _OldVsn, _Extra) ->
+ {ok, Cp}.
+
+convert_cp_record(Cp) when record(Cp, checkpoint) ->
+ ROD =
+ case Cp#checkpoint.ram_overrides_dump of
+ true -> Cp#checkpoint.min ++ Cp#checkpoint.max;
+ false -> []
+ end,
+
+ {ok, #checkpoint_args{name = Cp#checkpoint.name,
+ allow_remote = Cp#checkpoint.name,
+ ram_overrides_dump = ROD,
+ nodes = Cp#checkpoint.nodes,
+ node = Cp#checkpoint.node,
+ now = Cp#checkpoint.now,
+ cookie = ?unique_cookie,
+ min = Cp#checkpoint.min,
+ max = Cp#checkpoint.max,
+ pending_tab = Cp#checkpoint.pending_tab,
+ wait_for_old = Cp#checkpoint.wait_for_old,
+ is_activated = Cp#checkpoint.is_activated,
+ ignore_new = Cp#checkpoint.ignore_new,
+ retainers = Cp#checkpoint.retainers,
+ iterators = Cp#checkpoint.iterators,
+ supervisor = Cp#checkpoint.supervisor,
+ pid = Cp#checkpoint.pid
+ }};
+convert_cp_record(Cp) when record(Cp, checkpoint_args) ->
+ AllTabs = Cp#checkpoint_args.min ++ Cp#checkpoint_args.max,
+ ROD = case Cp#checkpoint_args.ram_overrides_dump of
+ [] ->
+ false;
+ AllTabs ->
+ true;
+ _ ->
+ error
+ end,
+ if
+ ROD == error ->
+ {error, {"Old node cannot handle new checkpoint protocol",
+ ram_overrides_dump}};
+ true ->
+ {ok, #checkpoint{name = Cp#checkpoint_args.name,
+ allow_remote = Cp#checkpoint_args.name,
+ ram_overrides_dump = ROD,
+ nodes = Cp#checkpoint_args.nodes,
+ node = Cp#checkpoint_args.node,
+ now = Cp#checkpoint_args.now,
+ min = Cp#checkpoint_args.min,
+ max = Cp#checkpoint_args.max,
+ pending_tab = Cp#checkpoint_args.pending_tab,
+ wait_for_old = Cp#checkpoint_args.wait_for_old,
+ is_activated = Cp#checkpoint_args.is_activated,
+ ignore_new = Cp#checkpoint_args.ignore_new,
+ retainers = Cp#checkpoint_args.retainers,
+ iterators = Cp#checkpoint_args.iterators,
+ supervisor = Cp#checkpoint_args.supervisor,
+ pid = Cp#checkpoint_args.pid
+ }}
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+val(Var) ->
+ case ?catch_val(Var) of
+ {'EXIT', _ReASoN_} -> mnesia_lib:other_val(Var, _ReASoN_);
+ _VaLuE_ -> _VaLuE_
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_checkpoint_sup.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_checkpoint_sup.erl
new file mode 100644
index 0000000000..36425537eb
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_checkpoint_sup.erl
@@ -0,0 +1,39 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_checkpoint_sup.erl,v 1.1 2008/12/17 09:53:38 mikpe Exp $
+%%
+-module(mnesia_checkpoint_sup).
+
+-behaviour(supervisor).
+
+-export([start/0, init/1]).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% top supervisor callback functions
+
+start() ->
+ supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% sub supervisor callback functions
+
+init([]) ->
+ Flags = {simple_one_for_one, 0, timer:hours(24)}, % Trust the top supervisor
+ MFA = {mnesia_checkpoint, start, []},
+ Modules = [?MODULE, mnesia_checkpoint, supervisor],
+ KillAfter = mnesia_kernel_sup:supervisor_timeout(timer:seconds(3)),
+ Workers = [{?MODULE, MFA, transient, KillAfter, worker, Modules}],
+ {ok, {Flags, Workers}}.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_controller.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_controller.erl
new file mode 100644
index 0000000000..1d7f29bfbd
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_controller.erl
@@ -0,0 +1,2010 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_controller.erl,v 1.3 2010/03/04 13:54:19 maria Exp $
+%%
+%% The mnesia_init process loads tables from local disc or from
+%% another nodes. It also coordinates updates of the info about
+%% where we can read and write tables.
+%%
+%% Tables may need to be loaded initially at startup of the local
+%% node or when other nodes announces that they already have loaded
+%% tables that we also want.
+%%
+%% Initially we set the load request queue to those tables that we
+%% safely can load locally, i.e. tables where we have the last
+%% consistent replica and we have received mnesia_down from all
+%% other nodes holding the table. Then we let the mnesia_init
+%% process enter its normal working state.
+%%
+%% When we need to load a table we append a request to the load
+%% request queue. All other requests are regarded as high priority
+%% and are processed immediately (e.g. update table whereabouts).
+%% We processes the load request queue as a "background" job..
+
+-module(mnesia_controller).
+
+-behaviour(gen_server).
+
+%% Mnesia internal stuff
+-export([
+ start/0,
+ i_have_tab/1,
+ info/0,
+ get_info/1,
+ get_workers/1,
+ force_load_table/1,
+ async_dump_log/1,
+ sync_dump_log/1,
+ connect_nodes/1,
+ wait_for_schema_commit_lock/0,
+ release_schema_commit_lock/0,
+ create_table/1,
+ get_disc_copy/1,
+ get_cstructs/0,
+ sync_and_block_table_whereabouts/4,
+ sync_del_table_copy_whereabouts/2,
+ block_table/1,
+ unblock_table/1,
+ block_controller/0,
+ unblock_controller/0,
+ unannounce_add_table_copy/2,
+ master_nodes_updated/2,
+ mnesia_down/1,
+ add_active_replica/2,
+ add_active_replica/3,
+ add_active_replica/4,
+ change_table_access_mode/1,
+ del_active_replica/2,
+ wait_for_tables/2,
+ get_network_copy/2,
+ merge_schema/0,
+ start_remote_sender/4,
+ schedule_late_disc_load/2
+ ]).
+
+%% gen_server callbacks
+-export([init/1,
+ handle_call/3,
+ handle_cast/2,
+ handle_info/2,
+ terminate/2,
+ code_change/3]).
+
+%% Module internal stuff
+-export([call/1,
+ cast/1,
+ dump_and_reply/2,
+ load_and_reply/2,
+ send_and_reply/2,
+ wait_for_tables_init/2
+ ]).
+
+-import(mnesia_lib, [set/2, add/2]).
+-import(mnesia_lib, [fatal/2, error/2, verbose/2, dbg_out/2]).
+
+-include("mnesia.hrl").
+
+-define(SERVER_NAME, ?MODULE).
+
+-record(state, {supervisor,
+ schema_is_merged = false,
+ early_msgs = [],
+ loader_pid,
+ loader_queue = [],
+ sender_pid,
+ sender_queue = [],
+ late_loader_queue = [],
+ dumper_pid, % Dumper or schema commit pid
+ dumper_queue = [], % Dumper or schema commit queue
+ dump_log_timer_ref,
+ is_stopping = false
+ }).
+
+-record(worker_reply, {what,
+ pid,
+ result
+ }).
+
+-record(schema_commit_lock, {owner}).
+-record(block_controller, {owner}).
+
+-record(dump_log, {initiated_by,
+ opt_reply_to
+ }).
+
+-record(net_load, {table,
+ reason,
+ opt_reply_to,
+ cstruct = unknown
+ }).
+
+-record(send_table, {table,
+ receiver_pid,
+ remote_storage
+ }).
+
+-record(disc_load, {table,
+ reason,
+ opt_reply_to
+ }).
+
+-record(late_load, {table,
+ reason,
+ opt_reply_to,
+ loaders
+ }).
+
+-record(loader_done, {worker_pid,
+ is_loaded,
+ table_name,
+ needs_announce,
+ needs_sync,
+ needs_reply,
+ reply_to,
+ reply}).
+
+-record(sender_done, {worker_pid,
+ worker_res,
+ table_name
+ }).
+
+-record(dumper_done, {worker_pid,
+ worker_res
+ }).
+
+val(Var) ->
+ case ?catch_val(Var) of
+ {'EXIT', Reason} -> mnesia_lib:other_val(Var, Reason);
+ Value -> Value
+ end.
+
+start() ->
+ gen_server:start_link({local, ?SERVER_NAME}, ?MODULE, [self()],
+ [{timeout, infinity}
+ %% ,{debug, [trace]}
+ ]).
+
+sync_dump_log(InitBy) ->
+ call({sync_dump_log, InitBy}).
+
+async_dump_log(InitBy) ->
+ ?SERVER_NAME ! {async_dump_log, InitBy}.
+
+%% Wait for tables to be active
+%% If needed, we will wait for Mnesia to start
+%% If Mnesia stops, we will wait for Mnesia to restart
+%% We will wait even if the list of tables is empty
+%%
+wait_for_tables(Tabs, Timeout) when list(Tabs), Timeout == infinity ->
+ do_wait_for_tables(Tabs, Timeout);
+wait_for_tables(Tabs, Timeout) when list(Tabs),
+ integer(Timeout), Timeout >= 0 ->
+ do_wait_for_tables(Tabs, Timeout);
+wait_for_tables(Tabs, Timeout) ->
+ {error, {badarg, Tabs, Timeout}}.
+
+do_wait_for_tables(Tabs, 0) ->
+ reply_wait(Tabs);
+do_wait_for_tables(Tabs, Timeout) ->
+ Pid = spawn_link(?MODULE, wait_for_tables_init, [self(), Tabs]),
+ receive
+ {?SERVER_NAME, Pid, Res} ->
+ Res;
+
+ {'EXIT', Pid, _} ->
+ reply_wait(Tabs)
+
+ after Timeout ->
+ unlink(Pid),
+ exit(Pid, timeout),
+ reply_wait(Tabs)
+ end.
+
+reply_wait(Tabs) ->
+ case catch mnesia_lib:active_tables() of
+ {'EXIT', _} ->
+ {error, {node_not_running, node()}};
+ Active when list(Active) ->
+ case Tabs -- Active of
+ [] ->
+ ok;
+ BadTabs ->
+ {timeout, BadTabs}
+ end
+ end.
+
+wait_for_tables_init(From, Tabs) ->
+ process_flag(trap_exit, true),
+ Res = wait_for_init(From, Tabs, whereis(?SERVER_NAME)),
+ From ! {?SERVER_NAME, self(), Res},
+ unlink(From),
+ exit(normal).
+
+wait_for_init(From, Tabs, Init) ->
+ case catch link(Init) of
+ {'EXIT', _} ->
+ %% Mnesia is not started
+ {error, {node_not_running, node()}};
+ true when pid(Init) ->
+ cast({sync_tabs, Tabs, self()}),
+ rec_tabs(Tabs, Tabs, From, Init)
+ end.
+
+sync_reply(Waiter, Tab) ->
+ Waiter ! {?SERVER_NAME, {tab_synced, Tab}}.
+
+rec_tabs([Tab | Tabs], AllTabs, From, Init) ->
+ receive
+ {?SERVER_NAME, {tab_synced, Tab}} ->
+ rec_tabs(Tabs, AllTabs, From, Init);
+
+ {'EXIT', From, _} ->
+ %% This will trigger an exit signal
+ %% to mnesia_init
+ exit(wait_for_tables_timeout);
+
+ {'EXIT', Init, _} ->
+ %% Oops, mnesia_init stopped,
+ exit(mnesia_stopped)
+ end;
+rec_tabs([], _, _, Init) ->
+ unlink(Init),
+ ok.
+
+get_cstructs() ->
+ call(get_cstructs).
+
+mnesia_down(Node) ->
+ case cast({mnesia_down, Node}) of
+ {error, _} -> mnesia_monitor:mnesia_down(?SERVER_NAME, Node);
+ _Pid -> ok
+ end.
+wait_for_schema_commit_lock() ->
+ link(whereis(?SERVER_NAME)),
+ unsafe_call(wait_for_schema_commit_lock).
+
+block_controller() ->
+ call(block_controller).
+
+unblock_controller() ->
+ cast(unblock_controller).
+
+release_schema_commit_lock() ->
+ cast({release_schema_commit_lock, self()}),
+ unlink(whereis(?SERVER_NAME)).
+
+%% Special for preparation of add table copy
+get_network_copy(Tab, Cs) ->
+ Work = #net_load{table = Tab,
+ reason = {dumper, add_table_copy},
+ cstruct = Cs
+ },
+ Res = (catch load_table(Work)),
+ if Res#loader_done.is_loaded == true ->
+ Tab = Res#loader_done.table_name,
+ case Res#loader_done.needs_announce of
+ true ->
+ i_have_tab(Tab);
+ false ->
+ ignore
+ end;
+ true -> ignore
+ end,
+
+ receive %% Flush copier done message
+ {copier_done, _Node} ->
+ ok
+ after 500 -> %% avoid hanging if something is wrong and we shall fail.
+ ignore
+ end,
+ Res#loader_done.reply.
+
+%% This functions is invoked from the dumper
+%%
+%% There are two cases here:
+%% startup ->
+%% no need for sync, since mnesia_controller not started yet
+%% schema_trans ->
+%% already synced with mnesia_controller since the dumper
+%% is syncronously started from mnesia_controller
+
+create_table(Tab) ->
+ {loaded, ok} = mnesia_loader:disc_load_table(Tab, {dumper,create_table}).
+
+get_disc_copy(Tab) ->
+ disc_load_table(Tab, {dumper,change_table_copy_type}, undefined).
+
+%% Returns ok instead of yes
+force_load_table(Tab) when atom(Tab), Tab /= schema ->
+ case ?catch_val({Tab, storage_type}) of
+ ram_copies ->
+ do_force_load_table(Tab);
+ disc_copies ->
+ do_force_load_table(Tab);
+ disc_only_copies ->
+ do_force_load_table(Tab);
+ unknown ->
+ set({Tab, load_by_force}, true),
+ cast({force_load_updated, Tab}),
+ wait_for_tables([Tab], infinity);
+ {'EXIT', _} ->
+ {error, {no_exists, Tab}}
+ end;
+force_load_table(Tab) ->
+ {error, {bad_type, Tab}}.
+
+do_force_load_table(Tab) ->
+ Loaded = ?catch_val({Tab, load_reason}),
+ case Loaded of
+ unknown ->
+ set({Tab, load_by_force}, true),
+ mnesia_late_loader:async_late_disc_load(node(), [Tab], forced_by_user),
+ wait_for_tables([Tab], infinity);
+ {'EXIT', _} ->
+ set({Tab, load_by_force}, true),
+ mnesia_late_loader:async_late_disc_load(node(), [Tab], forced_by_user),
+ wait_for_tables([Tab], infinity);
+ _ ->
+ ok
+ end.
+master_nodes_updated(schema, _Masters) ->
+ ignore;
+master_nodes_updated(Tab, Masters) ->
+ cast({master_nodes_updated, Tab, Masters}).
+
+schedule_late_disc_load(Tabs, Reason) ->
+ MsgTag = late_disc_load,
+ try_schedule_late_disc_load(Tabs, Reason, MsgTag).
+
+try_schedule_late_disc_load(Tabs, _Reason, MsgTag)
+ when Tabs == [], MsgTag /= schema_is_merged ->
+ ignore;
+try_schedule_late_disc_load(Tabs, Reason, MsgTag) ->
+ GetIntents =
+ fun() ->
+ Item = mnesia_late_disc_load,
+ Nodes = val({current, db_nodes}),
+ mnesia:lock({global, Item, Nodes}, write),
+ case multicall(Nodes -- [node()], disc_load_intents) of
+ {Replies, []} ->
+ call({MsgTag, Tabs, Reason, Replies}),
+ done;
+ {_, BadNodes} ->
+ %% Some nodes did not respond, lets try again
+ {retry, BadNodes}
+ end
+ end,
+ case mnesia:transaction(GetIntents) of
+ {'atomic', done} ->
+ done;
+ {'atomic', {retry, BadNodes}} ->
+ verbose("Retry late_load_tables because bad nodes: ~p~n",
+ [BadNodes]),
+ try_schedule_late_disc_load(Tabs, Reason, MsgTag);
+ {aborted, AbortReason} ->
+ fatal("Cannot late_load_tables~p: ~p~n",
+ [[Tabs, Reason, MsgTag], AbortReason])
+ end.
+
+connect_nodes(Ns) ->
+ case mnesia:system_info(is_running) of
+ no ->
+ {error, {node_not_running, node()}};
+ yes ->
+ {NewC, OldC} = mnesia_recover:connect_nodes(Ns),
+ Connected = NewC ++OldC,
+ New1 = mnesia_lib:intersect(Ns, Connected),
+ New = New1 -- val({current, db_nodes}),
+
+ case try_merge_schema(New) of
+ ok ->
+ mnesia_lib:add_list(extra_db_nodes, New),
+ {ok, New};
+ {aborted, {throw, Str}} when list(Str) ->
+ %%mnesia_recover:disconnect_nodes(New),
+ {error, {merge_schema_failed, lists:flatten(Str)}};
+ Else ->
+ %% Unconnect nodes where merge failed!!
+ %% mnesia_recover:disconnect_nodes(New),
+ {error, Else}
+ end
+ end.
+
+%% Merge the local schema with the schema on other nodes.
+%% But first we must let all processes that want to force
+%% load tables wait until the schema merge is done.
+
+merge_schema() ->
+ AllNodes = mnesia_lib:all_nodes(),
+ case try_merge_schema(AllNodes) of
+ ok ->
+ schema_is_merged();
+ {aborted, {throw, Str}} when list(Str) ->
+ fatal("Failed to merge schema: ~s~n", [Str]);
+ Else ->
+ fatal("Failed to merge schema: ~p~n", [Else])
+ end.
+
+try_merge_schema(Nodes) ->
+ case mnesia_schema:merge_schema() of
+ {'atomic', not_merged} ->
+ %% No more nodes that we need to merge the schema with
+ ok;
+ {'atomic', {merged, OldFriends, NewFriends}} ->
+ %% Check if new nodes has been added to the schema
+ Diff = mnesia_lib:all_nodes() -- [node() | Nodes],
+ mnesia_recover:connect_nodes(Diff),
+
+ %% Tell everybody to adopt orphan tables
+ im_running(OldFriends, NewFriends),
+ im_running(NewFriends, OldFriends),
+
+ try_merge_schema(Nodes);
+ {'atomic', {"Cannot get cstructs", Node, Reason}} ->
+ dbg_out("Cannot get cstructs, Node ~p ~p~n", [Node, Reason]),
+ timer:sleep(1000), % Avoid a endless loop look alike
+ try_merge_schema(Nodes);
+ Other ->
+ Other
+ end.
+
+im_running(OldFriends, NewFriends) ->
+ abcast(OldFriends, {im_running, node(), NewFriends}).
+
+schema_is_merged() ->
+ MsgTag = schema_is_merged,
+ SafeLoads = initial_safe_loads(),
+
+ %% At this point we do not know anything about
+ %% which tables that the other nodes already
+ %% has loaded and therefore we let the normal
+ %% processing of the loader_queue take care
+ %% of it, since we at that time point will
+ %% know the whereabouts. We rely on the fact
+ %% that all nodes tells each other directly
+ %% when they have loaded a table and are
+ %% willing to share it.
+
+ try_schedule_late_disc_load(SafeLoads, initial, MsgTag).
+
+
+cast(Msg) ->
+ case whereis(?SERVER_NAME) of
+ undefined ->{error, {node_not_running, node()}};
+ Pid -> gen_server:cast(Pid, Msg)
+ end.
+
+abcast(Nodes, Msg) ->
+ gen_server:abcast(Nodes, ?SERVER_NAME, Msg).
+
+unsafe_call(Msg) ->
+ case whereis(?SERVER_NAME) of
+ undefined -> {error, {node_not_running, node()}};
+ Pid -> gen_server:call(Pid, Msg, infinity)
+ end.
+
+call(Msg) ->
+ case whereis(?SERVER_NAME) of
+ undefined ->
+ {error, {node_not_running, node()}};
+ Pid ->
+ link(Pid),
+ Res = gen_server:call(Pid, Msg, infinity),
+ unlink(Pid),
+
+ %% We get an exit signal if server dies
+ receive
+ {'EXIT', Pid, _Reason} ->
+ {error, {node_not_running, node()}}
+ after 0 ->
+ ignore
+ end,
+ Res
+ end.
+
+remote_call(Node, Func, Args) ->
+ case catch gen_server:call({?MODULE, Node}, {Func, Args, self()}, infinity) of
+ {'EXIT', Error} ->
+ {error, Error};
+ Else ->
+ Else
+ end.
+
+multicall(Nodes, Msg) ->
+ {Good, Bad} = gen_server:multi_call(Nodes, ?MODULE, Msg, infinity),
+ PatchedGood = [Reply || {_Node, Reply} <- Good],
+ {PatchedGood, Bad}. %% Make the replies look like rpc:multicalls..
+%% rpc:multicall(Nodes, ?MODULE, call, [Msg]).
+
+%%%----------------------------------------------------------------------
+%%% Callback functions from gen_server
+%%%----------------------------------------------------------------------
+
+%%----------------------------------------------------------------------
+%% Func: init/1
+%% Returns: {ok, State} |
+%% {ok, State, Timeout} |
+%% {stop, Reason}
+%%----------------------------------------------------------------------
+init([Parent]) ->
+ process_flag(trap_exit, true),
+ mnesia_lib:verbose("~p starting: ~p~n", [?SERVER_NAME, self()]),
+
+ %% Handshake and initialize transaction recovery
+ %% for new nodes detected in the schema
+ All = mnesia_lib:all_nodes(),
+ Diff = All -- [node() | val(original_nodes)],
+ mnesia_lib:unset(original_nodes),
+ mnesia_recover:connect_nodes(Diff),
+
+ Interval = mnesia_monitor:get_env(dump_log_time_threshold),
+ Msg = {async_dump_log, time_threshold},
+ {ok, Ref} = timer:send_interval(Interval, Msg),
+ mnesia_dumper:start_regulator(),
+
+ {ok, #state{supervisor = Parent, dump_log_timer_ref = Ref}}.
+
+%%----------------------------------------------------------------------
+%% Func: handle_call/3
+%% Returns: {reply, Reply, State} |
+%% {reply, Reply, State, Timeout} |
+%% {noreply, State} |
+%% {noreply, State, Timeout} |
+%% {stop, Reason, Reply, State} | (terminate/2 is called)
+%% {stop, Reason, Reply, State} (terminate/2 is called)
+%%----------------------------------------------------------------------
+
+handle_call({sync_dump_log, InitBy}, From, State) ->
+ Worker = #dump_log{initiated_by = InitBy,
+ opt_reply_to = From
+ },
+ State2 = add_worker(Worker, State),
+ noreply(State2);
+
+handle_call(wait_for_schema_commit_lock, From, State) ->
+ Worker = #schema_commit_lock{owner = From},
+ State2 = add_worker(Worker, State),
+ noreply(State2);
+
+handle_call(block_controller, From, State) ->
+ Worker = #block_controller{owner = From},
+ State2 = add_worker(Worker, State),
+ noreply(State2);
+
+
+handle_call(get_cstructs, From, State) ->
+ Tabs = val({schema, tables}),
+ Cstructs = [val({T, cstruct}) || T <- Tabs],
+ Running = val({current, db_nodes}),
+ reply(From, {cstructs, Cstructs, Running}),
+ noreply(State);
+
+handle_call({schema_is_merged, TabsR, Reason, RemoteLoaders}, From, State) ->
+ State2 = late_disc_load(TabsR, Reason, RemoteLoaders, From, State),
+
+ %% Handle early messages
+ Msgs = State2#state.early_msgs,
+ State3 = State2#state{early_msgs = [], schema_is_merged = true},
+ Ns = val({current, db_nodes}),
+ dbg_out("Schema is merged ~w, State ~w~n", [Ns, State3]),
+%% dbg_out("handle_early_msgs ~p ~n", [Msgs]), % qqqq
+ handle_early_msgs(lists:reverse(Msgs), State3);
+
+handle_call(disc_load_intents, From, State) ->
+ Tabs = disc_load_intents(State#state.loader_queue) ++
+ disc_load_intents(State#state.late_loader_queue),
+ ActiveTabs = mnesia_lib:local_active_tables(),
+ reply(From, {ok, node(), mnesia_lib:union(Tabs, ActiveTabs)}),
+ noreply(State);
+
+handle_call({update_where_to_write, [add, Tab, AddNode], _From}, _Dummy, State) ->
+%%% dbg_out("update_w2w ~p", [[add, Tab, AddNode]]), %%% qqqq
+ Current = val({current, db_nodes}),
+ Res =
+ case lists:member(AddNode, Current) and
+ State#state.schema_is_merged == true of
+ true ->
+ mnesia_lib:add({Tab, where_to_write}, AddNode);
+ false ->
+ ignore
+ end,
+ {reply, Res, State};
+
+handle_call({add_active_replica, [Tab, ToNode, RemoteS, AccessMode], From},
+ ReplyTo, State) ->
+ KnownNode = lists:member(ToNode, val({current, db_nodes})),
+ Merged = State#state.schema_is_merged,
+ if
+ KnownNode == false ->
+ reply(ReplyTo, ignore),
+ noreply(State);
+ Merged == true ->
+ Res = add_active_replica(Tab, ToNode, RemoteS, AccessMode),
+ reply(ReplyTo, Res),
+ noreply(State);
+ true -> %% Schema is not merged
+ Msg = {add_active_replica, [Tab, ToNode, RemoteS, AccessMode], From},
+ Msgs = State#state.early_msgs,
+ reply(ReplyTo, ignore), %% Reply ignore and add data after schema merge
+ noreply(State#state{early_msgs = [{call, Msg, undefined} | Msgs]})
+ end;
+
+handle_call({unannounce_add_table_copy, [Tab, Node], From}, ReplyTo, State) ->
+ KnownNode = lists:member(node(From), val({current, db_nodes})),
+ Merged = State#state.schema_is_merged,
+ if
+ KnownNode == false ->
+ reply(ReplyTo, ignore),
+ noreply(State);
+ Merged == true ->
+ Res = unannounce_add_table_copy(Tab, Node),
+ reply(ReplyTo, Res),
+ noreply(State);
+ true -> %% Schema is not merged
+ Msg = {unannounce_add_table_copy, [Tab, Node], From},
+ Msgs = State#state.early_msgs,
+ reply(ReplyTo, ignore), %% Reply ignore and add data after schema merge
+ %% Set ReplyTO to undefined so we don't reply twice
+ noreply(State#state{early_msgs = [{call, Msg, undefined} | Msgs]})
+ end;
+
+handle_call(Msg, From, State) when State#state.schema_is_merged == false ->
+ %% Buffer early messages
+%% dbg_out("Buffered early msg ~p ~n", [Msg]), %% qqqq
+ Msgs = State#state.early_msgs,
+ noreply(State#state{early_msgs = [{call, Msg, From} | Msgs]});
+
+handle_call({net_load, Tab, Cs}, From, State) ->
+ Worker = #net_load{table = Tab,
+ opt_reply_to = From,
+ reason = add_table_copy,
+ cstruct = Cs
+ },
+ State2 = add_worker(Worker, State),
+ noreply(State2);
+
+handle_call({late_disc_load, Tabs, Reason, RemoteLoaders}, From, State) ->
+ State2 = late_disc_load(Tabs, Reason, RemoteLoaders, From, State),
+ noreply(State2);
+
+handle_call({block_table, [Tab], From}, _Dummy, State) ->
+ case lists:member(node(From), val({current, db_nodes})) of
+ true ->
+ block_table(Tab);
+ false ->
+ ignore
+ end,
+ {reply, ok, State};
+
+handle_call({check_w2r, _Node, Tab}, _From, State) ->
+ {reply, val({Tab, where_to_read}), State};
+
+handle_call(Msg, _From, State) ->
+ error("~p got unexpected call: ~p~n", [?SERVER_NAME, Msg]),
+ noreply(State).
+
+disc_load_intents([H | T]) when record(H, disc_load) ->
+ [H#disc_load.table | disc_load_intents(T)];
+disc_load_intents([H | T]) when record(H, late_load) ->
+ [H#late_load.table | disc_load_intents(T)];
+disc_load_intents( [H | T]) when record(H, net_load) ->
+ disc_load_intents(T);
+disc_load_intents([]) ->
+ [].
+
+late_disc_load(TabsR, Reason, RemoteLoaders, From, State) ->
+ verbose("Intend to load tables: ~p~n", [TabsR]),
+ ?eval_debug_fun({?MODULE, late_disc_load},
+ [{tabs, TabsR},
+ {reason, Reason},
+ {loaders, RemoteLoaders}]),
+
+ reply(From, queued),
+ %% RemoteLoaders is a list of {ok, Node, Tabs} tuples
+
+ %% Remove deleted tabs
+ LocalTabs = mnesia_lib:val({schema, local_tables}),
+ Filter = fun({Tab, Reas}, Acc) ->
+ case lists:member(Tab, LocalTabs) of
+ true -> [{Tab, Reas} | Acc];
+ false -> Acc
+ end;
+ (Tab, Acc) ->
+ case lists:member(Tab, LocalTabs) of
+ true -> [Tab | Acc];
+ false -> Acc
+ end
+ end,
+
+ Tabs = lists:foldl(Filter, [], TabsR),
+
+ Nodes = val({current, db_nodes}),
+ LateLoaders = late_loaders(Tabs, Reason, RemoteLoaders, Nodes),
+ LateQueue = State#state.late_loader_queue ++ LateLoaders,
+ State#state{late_loader_queue = LateQueue}.
+
+late_loaders([{Tab, Reason} | Tabs], DefaultReason, RemoteLoaders, Nodes) ->
+ LoadNodes = late_load_filter(RemoteLoaders, Tab, Nodes, []),
+ case LoadNodes of
+ [] ->
+ cast({disc_load, Tab, Reason}); % Ugly cast
+ _ ->
+ ignore
+ end,
+ LateLoad = #late_load{table = Tab, loaders = LoadNodes, reason = Reason},
+ [LateLoad | late_loaders(Tabs, DefaultReason, RemoteLoaders, Nodes)];
+
+late_loaders([Tab | Tabs], Reason, RemoteLoaders, Nodes) ->
+ Loaders = late_load_filter(RemoteLoaders, Tab, Nodes, []),
+ case Loaders of
+ [] ->
+ cast({disc_load, Tab, Reason}); % Ugly cast
+ _ ->
+ ignore
+ end,
+ LateLoad = #late_load{table = Tab, loaders = Loaders, reason = Reason},
+ [LateLoad | late_loaders(Tabs, Reason, RemoteLoaders, Nodes)];
+late_loaders([], _Reason, _RemoteLoaders, _Nodes) ->
+ [].
+
+late_load_filter([{error, _} | RemoteLoaders], Tab, Nodes, Acc) ->
+ late_load_filter(RemoteLoaders, Tab, Nodes, Acc);
+late_load_filter([{badrpc, _} | RemoteLoaders], Tab, Nodes, Acc) ->
+ late_load_filter(RemoteLoaders, Tab, Nodes, Acc);
+late_load_filter([RL | RemoteLoaders], Tab, Nodes, Acc) ->
+ {ok, Node, Intents} = RL,
+ Access = val({Tab, access_mode}),
+ LocalC = val({Tab, local_content}),
+ StillActive = lists:member(Node, Nodes),
+ RemoteIntent = lists:member(Tab, Intents),
+ if
+ Access == read_write,
+ LocalC == false,
+ StillActive == true,
+ RemoteIntent == true ->
+ Masters = mnesia_recover:get_master_nodes(Tab),
+ case lists:member(Node, Masters) of
+ true ->
+ %% The other node is master node for
+ %% the table, accept his load intent
+ late_load_filter(RemoteLoaders, Tab, Nodes, [Node | Acc]);
+ false when Masters == [] ->
+ %% The table has no master nodes
+ %% accept his load intent
+ late_load_filter(RemoteLoaders, Tab, Nodes, [Node | Acc]);
+ false ->
+ %% Some one else is master node for
+ %% the table, ignore his load intent
+ late_load_filter(RemoteLoaders, Tab, Nodes, Acc)
+ end;
+ true ->
+ late_load_filter(RemoteLoaders, Tab, Nodes, Acc)
+ end;
+late_load_filter([], _Tab, _Nodes, Acc) ->
+ Acc.
+
+%%----------------------------------------------------------------------
+%% Func: handle_cast/2
+%% Returns: {noreply, State} |
+%% {noreply, State, Timeout} |
+%% {stop, Reason, State} (terminate/2 is called)
+%%----------------------------------------------------------------------
+
+handle_cast({release_schema_commit_lock, _Owner}, State) ->
+ if
+ State#state.is_stopping == true ->
+ {stop, shutdown, State};
+ true ->
+ case State#state.dumper_queue of
+ [#schema_commit_lock{}|Rest] ->
+ [_Worker | Rest] = State#state.dumper_queue,
+ State2 = State#state{dumper_pid = undefined,
+ dumper_queue = Rest},
+ State3 = opt_start_worker(State2),
+ noreply(State3);
+ _ ->
+ noreply(State)
+ end
+ end;
+
+handle_cast(unblock_controller, State) ->
+ if
+ State#state.is_stopping == true ->
+ {stop, shutdown, State};
+ record(hd(State#state.dumper_queue), block_controller) ->
+ [_Worker | Rest] = State#state.dumper_queue,
+ State2 = State#state{dumper_pid = undefined,
+ dumper_queue = Rest},
+ State3 = opt_start_worker(State2),
+ noreply(State3)
+ end;
+
+handle_cast({mnesia_down, Node}, State) ->
+ maybe_log_mnesia_down(Node),
+ mnesia_lib:del({current, db_nodes}, Node),
+ mnesia_checkpoint:tm_mnesia_down(Node),
+ Alltabs = val({schema, tables}),
+ State2 = reconfigure_tables(Node, State, Alltabs),
+ case State#state.sender_pid of
+ undefined -> ignore;
+ Pid when pid(Pid) -> Pid ! {copier_done, Node}
+ end,
+ case State#state.loader_pid of
+ undefined -> ignore;
+ Pid2 when pid(Pid2) -> Pid2 ! {copier_done, Node}
+ end,
+ NewSenders =
+ case State#state.sender_queue of
+ [OldSender | RestSenders] ->
+ Remove = fun(ST) ->
+ node(ST#send_table.receiver_pid) /= Node
+ end,
+ NewS = lists:filter(Remove, RestSenders),
+ %% Keep old sender it will be removed by sender_done
+ [OldSender | NewS];
+ [] ->
+ []
+ end,
+ Early = remove_early_messages(State2#state.early_msgs, Node),
+ mnesia_monitor:mnesia_down(?SERVER_NAME, Node),
+ noreply(State2#state{sender_queue = NewSenders, early_msgs = Early});
+
+handle_cast({im_running, _Node, NewFriends}, State) ->
+ Tabs = mnesia_lib:local_active_tables() -- [schema],
+ Ns = mnesia_lib:intersect(NewFriends, val({current, db_nodes})),
+ abcast(Ns, {adopt_orphans, node(), Tabs}),
+ noreply(State);
+
+handle_cast(Msg, State) when State#state.schema_is_merged == false ->
+ %% Buffer early messages
+ Msgs = State#state.early_msgs,
+ noreply(State#state{early_msgs = [{cast, Msg} | Msgs]});
+
+handle_cast({disc_load, Tab, Reason}, State) ->
+ Worker = #disc_load{table = Tab, reason = Reason},
+ State2 = add_worker(Worker, State),
+ noreply(State2);
+
+handle_cast(Worker, State) when record(Worker, send_table) ->
+ State2 = add_worker(Worker, State),
+ noreply(State2);
+
+handle_cast({sync_tabs, Tabs, From}, State) ->
+ %% user initiated wait_for_tables
+ handle_sync_tabs(Tabs, From),
+ noreply(State);
+
+handle_cast({i_have_tab, Tab, Node}, State) ->
+ case lists:member(Node, val({current, db_nodes})) of
+ true ->
+ State2 = node_has_tabs([Tab], Node, State),
+ noreply(State2);
+ false ->
+ noreply(State)
+ end;
+
+handle_cast({force_load_updated, Tab}, State) ->
+ case val({Tab, active_replicas}) of
+ [] ->
+ %% No valid replicas
+ noreply(State);
+ [SomeNode | _] ->
+ State2 = node_has_tabs([Tab], SomeNode, State),
+ noreply(State2)
+ end;
+
+handle_cast({master_nodes_updated, Tab, Masters}, State) ->
+ Active = val({Tab, active_replicas}),
+ Valid =
+ case val({Tab, load_by_force}) of
+ true ->
+ Active;
+ false ->
+ if
+ Masters == [] ->
+ Active;
+ true ->
+ mnesia_lib:intersect(Masters, Active)
+ end
+ end,
+ case Valid of
+ [] ->
+ %% No valid replicas
+ noreply(State);
+ [SomeNode | _] ->
+ State2 = node_has_tabs([Tab], SomeNode, State),
+ noreply(State2)
+ end;
+
+handle_cast({adopt_orphans, Node, Tabs}, State) ->
+
+ State2 = node_has_tabs(Tabs, Node, State),
+
+ %% Register the other node as up and running
+ mnesia_recover:log_mnesia_up(Node),
+ verbose("Logging mnesia_up ~w~n", [Node]),
+ mnesia_lib:report_system_event({mnesia_up, Node}),
+
+ %% Load orphan tables
+ LocalTabs = val({schema, local_tables}) -- [schema],
+ Nodes = val({current, db_nodes}),
+ {LocalOrphans, RemoteMasters} =
+ orphan_tables(LocalTabs, Node, Nodes, [], []),
+ Reason = {adopt_orphan, node()},
+ mnesia_late_loader:async_late_disc_load(node(), LocalOrphans, Reason),
+
+ Fun =
+ fun(N) ->
+ RemoteOrphans =
+ [Tab || {Tab, Ns} <- RemoteMasters,
+ lists:member(N, Ns)],
+ mnesia_late_loader:maybe_async_late_disc_load(N, RemoteOrphans, Reason)
+ end,
+ lists:foreach(Fun, Nodes),
+
+ Queue = State2#state.loader_queue,
+ State3 = State2#state{loader_queue = Queue},
+ noreply(State3);
+
+handle_cast(Msg, State) ->
+ error("~p got unexpected cast: ~p~n", [?SERVER_NAME, Msg]),
+ noreply(State).
+
+handle_sync_tabs([Tab | Tabs], From) ->
+ case val({Tab, where_to_read}) of
+ nowhere ->
+ case get({sync_tab, Tab}) of
+ undefined ->
+ put({sync_tab, Tab}, [From]);
+ Pids ->
+ put({sync_tab, Tab}, [From | Pids])
+ end;
+ _ ->
+ sync_reply(From, Tab)
+ end,
+ handle_sync_tabs(Tabs, From);
+handle_sync_tabs([], _From) ->
+ ok.
+
+%%----------------------------------------------------------------------
+%% Func: handle_info/2
+%% Returns: {noreply, State} |
+%% {noreply, State, Timeout} |
+%% {stop, Reason, State} (terminate/2 is called)
+%%----------------------------------------------------------------------
+
+handle_info({async_dump_log, InitBy}, State) ->
+ Worker = #dump_log{initiated_by = InitBy},
+ State2 = add_worker(Worker, State),
+ noreply(State2);
+
+handle_info(Done, State) when record(Done, dumper_done) ->
+ Pid = Done#dumper_done.worker_pid,
+ Res = Done#dumper_done.worker_res,
+ if
+ State#state.is_stopping == true ->
+ {stop, shutdown, State};
+ Res == dumped, Pid == State#state.dumper_pid ->
+ [Worker | Rest] = State#state.dumper_queue,
+ reply(Worker#dump_log.opt_reply_to, Res),
+ State2 = State#state{dumper_pid = undefined,
+ dumper_queue = Rest},
+ State3 = opt_start_worker(State2),
+ noreply(State3);
+ true ->
+ fatal("Dumper failed: ~p~n state: ~p~n", [Res, State]),
+ {stop, fatal, State}
+ end;
+
+handle_info(Done, State) when record(Done, loader_done) ->
+ if
+ %% Assertion
+ Done#loader_done.worker_pid == State#state.loader_pid -> ok
+ end,
+
+ [_Worker | Rest] = LoadQ0 = State#state.loader_queue,
+ LateQueue0 = State#state.late_loader_queue,
+ {LoadQ, LateQueue} =
+ case Done#loader_done.is_loaded of
+ true ->
+ Tab = Done#loader_done.table_name,
+
+ %% Optional user sync
+ case Done#loader_done.needs_sync of
+ true -> user_sync_tab(Tab);
+ false -> ignore
+ end,
+
+ %% Optional table announcement
+ case Done#loader_done.needs_announce of
+ true ->
+ i_have_tab(Tab),
+ case Tab of
+ schema ->
+ ignore;
+ _ ->
+ %% Local node needs to perform user_sync_tab/1
+ Ns = val({current, db_nodes}),
+ abcast(Ns, {i_have_tab, Tab, node()})
+ end;
+ false ->
+ case Tab of
+ schema ->
+ ignore;
+ _ ->
+ %% Local node needs to perform user_sync_tab/1
+ Ns = val({current, db_nodes}),
+ AlreadyKnows = val({Tab, active_replicas}),
+ abcast(Ns -- AlreadyKnows, {i_have_tab, Tab, node()})
+ end
+ end,
+
+ %% Optional client reply
+ case Done#loader_done.needs_reply of
+ true ->
+ reply(Done#loader_done.reply_to,
+ Done#loader_done.reply);
+ false ->
+ ignore
+ end,
+ {Rest, reply_late_load(Tab, LateQueue0)};
+ false ->
+ case Done#loader_done.reply of
+ restart ->
+ {LoadQ0, LateQueue0};
+ _ ->
+ {Rest, LateQueue0}
+ end
+ end,
+
+ State2 = State#state{loader_pid = undefined,
+ loader_queue = LoadQ,
+ late_loader_queue = LateQueue},
+
+ State3 = opt_start_worker(State2),
+ noreply(State3);
+
+handle_info(Done, State) when record(Done, sender_done) ->
+ Pid = Done#sender_done.worker_pid,
+ Res = Done#sender_done.worker_res,
+ if
+ Res == ok, Pid == State#state.sender_pid ->
+ [Worker | Rest] = State#state.sender_queue,
+ Worker#send_table.receiver_pid ! {copier_done, node()},
+ State2 = State#state{sender_pid = undefined,
+ sender_queue = Rest},
+ State3 = opt_start_worker(State2),
+ noreply(State3);
+ true ->
+ %% No need to send any message to the table receiver
+ %% since it will soon get a mnesia_down anyway
+ fatal("Sender failed: ~p~n state: ~p~n", [Res, State]),
+ {stop, fatal, State}
+ end;
+
+handle_info({'EXIT', Pid, R}, State) when Pid == State#state.supervisor ->
+ catch set(mnesia_status, stopping),
+ case State#state.dumper_pid of
+ undefined ->
+ dbg_out("~p was ~p~n", [?SERVER_NAME, R]),
+ {stop, shutdown, State};
+ _ ->
+ noreply(State#state{is_stopping = true})
+ end;
+
+handle_info({'EXIT', Pid, R}, State) when Pid == State#state.dumper_pid ->
+ case State#state.dumper_queue of
+ [#schema_commit_lock{}|Workers] -> %% Schema trans crashed or was killed
+ State2 = State#state{dumper_queue = Workers, dumper_pid = undefined},
+ State3 = opt_start_worker(State2),
+ noreply(State3);
+ _Other ->
+ fatal("Dumper or schema commit crashed: ~p~n state: ~p~n", [R, State]),
+ {stop, fatal, State}
+ end;
+
+handle_info({'EXIT', Pid, R}, State) when Pid == State#state.loader_pid ->
+ fatal("Loader crashed: ~p~n state: ~p~n", [R, State]),
+ {stop, fatal, State};
+
+handle_info({'EXIT', Pid, R}, State) when Pid == State#state.sender_pid ->
+ %% No need to send any message to the table receiver
+ %% since it will soon get a mnesia_down anyway
+ fatal("Sender crashed: ~p~n state: ~p~n", [R, State]),
+ {stop, fatal, State};
+
+handle_info({From, get_state}, State) ->
+ From ! {?SERVER_NAME, State},
+ noreply(State);
+
+%% No real need for buffering
+handle_info(Msg, State) when State#state.schema_is_merged == false ->
+ %% Buffer early messages
+ Msgs = State#state.early_msgs,
+ noreply(State#state{early_msgs = [{info, Msg} | Msgs]});
+
+handle_info({'EXIT', Pid, wait_for_tables_timeout}, State) ->
+ sync_tab_timeout(Pid, get()),
+ noreply(State);
+
+handle_info(Msg, State) ->
+ error("~p got unexpected info: ~p~n", [?SERVER_NAME, Msg]),
+ noreply(State).
+
+reply_late_load(Tab, [H | T]) when H#late_load.table == Tab ->
+ reply(H#late_load.opt_reply_to, ok),
+ reply_late_load(Tab, T);
+reply_late_load(Tab, [H | T]) ->
+ [H | reply_late_load(Tab, T)];
+reply_late_load(_Tab, []) ->
+ [].
+
+sync_tab_timeout(Pid, [{{sync_tab, Tab}, Pids} | Tail]) ->
+ case lists:delete(Pid, Pids) of
+ [] ->
+ erase({sync_tab, Tab});
+ Pids2 ->
+ put({sync_tab, Tab}, Pids2)
+ end,
+ sync_tab_timeout(Pid, Tail);
+sync_tab_timeout(Pid, [_ | Tail]) ->
+ sync_tab_timeout(Pid, Tail);
+sync_tab_timeout(_Pid, []) ->
+ ok.
+
+%% Pick the load record that has the highest load order
+%% Returns {BestLoad, RemainingQueue} or {none, []} if queue is empty
+pick_next(Queue) ->
+ pick_next(Queue, none, none, []).
+
+pick_next([Head | Tail], Load, Order, Rest) when record(Head, net_load) ->
+ Tab = Head#net_load.table,
+ select_best(Head, Tail, val({Tab, load_order}), Load, Order, Rest);
+pick_next([Head | Tail], Load, Order, Rest) when record(Head, disc_load) ->
+ Tab = Head#disc_load.table,
+ select_best(Head, Tail, val({Tab, load_order}), Load, Order, Rest);
+pick_next([], Load, _Order, Rest) ->
+ {Load, Rest}.
+
+select_best(Load, Tail, Order, none, none, Rest) ->
+ pick_next(Tail, Load, Order, Rest);
+select_best(Load, Tail, Order, OldLoad, OldOrder, Rest) when Order > OldOrder ->
+ pick_next(Tail, Load, Order, [OldLoad | Rest]);
+select_best(Load, Tail, _Order, OldLoad, OldOrder, Rest) ->
+ pick_next(Tail, OldLoad, OldOrder, [Load | Rest]).
+
+%%----------------------------------------------------------------------
+%% Func: terminate/2
+%% Purpose: Shutdown the server
+%% Returns: any (ignored by gen_server)
+%%----------------------------------------------------------------------
+terminate(Reason, State) ->
+ mnesia_monitor:terminate_proc(?SERVER_NAME, Reason, State).
+
+%%----------------------------------------------------------------------
+%% Func: code_change/3
+%% Purpose: Upgrade process when its code is to be changed
+%% Returns: {ok, NewState}
+%%----------------------------------------------------------------------
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
+
+%%%----------------------------------------------------------------------
+%%% Internal functions
+%%%----------------------------------------------------------------------
+
+maybe_log_mnesia_down(N) ->
+ %% We use mnesia_down when deciding which tables to load locally,
+ %% so if we are not running (i.e haven't decided which tables
+ %% to load locally), don't log mnesia_down yet.
+ case mnesia_lib:is_running() of
+ yes ->
+ verbose("Logging mnesia_down ~w~n", [N]),
+ mnesia_recover:log_mnesia_down(N),
+ ok;
+ _ ->
+ Filter = fun(Tab) ->
+ inactive_copy_holders(Tab, N)
+ end,
+ HalfLoadedTabs = lists:any(Filter, val({schema, local_tables}) -- [schema]),
+ if
+ HalfLoadedTabs == true ->
+ verbose("Logging mnesia_down ~w~n", [N]),
+ mnesia_recover:log_mnesia_down(N),
+ ok;
+ true ->
+ %% Unfortunately we have not loaded some common
+ %% tables yet, so we cannot rely on the nodedown
+ log_later %% BUGBUG handle this case!!!
+ end
+ end.
+
+inactive_copy_holders(Tab, Node) ->
+ Cs = val({Tab, cstruct}),
+ case mnesia_lib:cs_to_storage_type(Node, Cs) of
+ unknown ->
+ false;
+ _Storage ->
+ mnesia_lib:not_active_here(Tab)
+ end.
+
+orphan_tables([Tab | Tabs], Node, Ns, Local, Remote) ->
+ Cs = val({Tab, cstruct}),
+ CopyHolders = mnesia_lib:copy_holders(Cs),
+ RamCopyHolders = Cs#cstruct.ram_copies,
+ DiscCopyHolders = CopyHolders -- RamCopyHolders,
+ DiscNodes = val({schema, disc_copies}),
+ LocalContent = Cs#cstruct.local_content,
+ RamCopyHoldersOnDiscNodes = mnesia_lib:intersect(RamCopyHolders, DiscNodes),
+ Active = val({Tab, active_replicas}),
+ case lists:member(Node, DiscCopyHolders) of
+ true when Active == [] ->
+ case DiscCopyHolders -- Ns of
+ [] ->
+ %% We're last up and the other nodes have not
+ %% loaded the table. Lets load it if we are
+ %% the smallest node.
+ case lists:min(DiscCopyHolders) of
+ Min when Min == node() ->
+ case mnesia_recover:get_master_nodes(Tab) of
+ [] ->
+ L = [Tab | Local],
+ orphan_tables(Tabs, Node, Ns, L, Remote);
+ Masters ->
+ R = [{Tab, Masters} | Remote],
+ orphan_tables(Tabs, Node, Ns, Local, R)
+ end;
+ _ ->
+ orphan_tables(Tabs, Node, Ns, Local, Remote)
+ end;
+ _ ->
+ orphan_tables(Tabs, Node, Ns, Local, Remote)
+ end;
+ false when Active == [], DiscCopyHolders == [], RamCopyHoldersOnDiscNodes == [] ->
+ %% Special case when all replicas resides on disc less nodes
+ orphan_tables(Tabs, Node, Ns, [Tab | Local], Remote);
+ _ when LocalContent == true ->
+ orphan_tables(Tabs, Node, Ns, [Tab | Local], Remote);
+ _ ->
+ orphan_tables(Tabs, Node, Ns, Local, Remote)
+ end;
+orphan_tables([], _, _, LocalOrphans, RemoteMasters) ->
+ {LocalOrphans, RemoteMasters}.
+
+node_has_tabs([Tab | Tabs], Node, State) when Node /= node() ->
+ State2 = update_whereabouts(Tab, Node, State),
+ node_has_tabs(Tabs, Node, State2);
+node_has_tabs([Tab | Tabs], Node, State) ->
+ user_sync_tab(Tab),
+ node_has_tabs(Tabs, Node, State);
+node_has_tabs([], _Node, State) ->
+ State.
+
+update_whereabouts(Tab, Node, State) ->
+ Storage = val({Tab, storage_type}),
+ Read = val({Tab, where_to_read}),
+ LocalC = val({Tab, local_content}),
+ BeingCreated = (?catch_val({Tab, create_table}) == true),
+ Masters = mnesia_recover:get_master_nodes(Tab),
+ ByForce = val({Tab, load_by_force}),
+ GoGetIt =
+ if
+ ByForce == true ->
+ true;
+ Masters == [] ->
+ true;
+ true ->
+ lists:member(Node, Masters)
+ end,
+
+ dbg_out("Table ~w is loaded on ~w. s=~w, r=~w, lc=~w, f=~w, m=~w~n",
+ [Tab, Node, Storage, Read, LocalC, ByForce, GoGetIt]),
+ if
+ LocalC == true ->
+ %% Local contents, don't care about other node
+ State;
+ Storage == unknown, Read == nowhere ->
+ %% No own copy, time to read remotely
+ %% if the other node is a good node
+ add_active_replica(Tab, Node),
+ case GoGetIt of
+ true ->
+ set({Tab, where_to_read}, Node),
+ user_sync_tab(Tab),
+ State;
+ false ->
+ State
+ end;
+ Storage == unknown ->
+ %% No own copy, continue to read remotely
+ add_active_replica(Tab, Node),
+ NodeST = mnesia_lib:storage_type_at_node(Node, Tab),
+ ReadST = mnesia_lib:storage_type_at_node(Read, Tab),
+ if %% Avoid reading from disc_only_copies
+ NodeST == disc_only_copies ->
+ ignore;
+ ReadST == disc_only_copies ->
+ mnesia_lib:set_remote_where_to_read(Tab);
+ true ->
+ ignore
+ end,
+ user_sync_tab(Tab),
+ State;
+ BeingCreated == true ->
+ %% The table is currently being created
+ %% and we shall have an own copy of it.
+ %% We will load the (empty) table locally.
+ add_active_replica(Tab, Node),
+ State;
+ Read == nowhere ->
+ %% Own copy, go and get a copy of the table
+ %% if the other node is master or if there
+ %% are no master at all
+ add_active_replica(Tab, Node),
+ case GoGetIt of
+ true ->
+ Worker = #net_load{table = Tab,
+ reason = {active_remote, Node}},
+ add_worker(Worker, State);
+ false ->
+ State
+ end;
+ true ->
+ %% We already have an own copy
+ add_active_replica(Tab, Node),
+ user_sync_tab(Tab),
+ State
+ end.
+
+initial_safe_loads() ->
+ case val({schema, storage_type}) of
+ ram_copies ->
+ Downs = [],
+ Tabs = val({schema, local_tables}) -- [schema],
+ LastC = fun(T) -> last_consistent_replica(T, Downs) end,
+ lists:zf(LastC, Tabs);
+
+ disc_copies ->
+ Downs = mnesia_recover:get_mnesia_downs(),
+ dbg_out("mnesia_downs = ~p~n", [Downs]),
+
+ Tabs = val({schema, local_tables}) -- [schema],
+ LastC = fun(T) -> last_consistent_replica(T, Downs) end,
+ lists:zf(LastC, Tabs)
+ end.
+
+last_consistent_replica(Tab, Downs) ->
+ Cs = val({Tab, cstruct}),
+ Storage = mnesia_lib:cs_to_storage_type(node(), Cs),
+ Ram = Cs#cstruct.ram_copies,
+ Disc = Cs#cstruct.disc_copies,
+ DiscOnly = Cs#cstruct.disc_only_copies,
+ BetterCopies0 = mnesia_lib:remote_copy_holders(Cs) -- Downs,
+ BetterCopies = BetterCopies0 -- Ram,
+ AccessMode = Cs#cstruct.access_mode,
+ Copies = mnesia_lib:copy_holders(Cs),
+ Masters = mnesia_recover:get_master_nodes(Tab),
+ LocalMaster0 = lists:member(node(), Masters),
+ LocalContent = Cs#cstruct.local_content,
+ RemoteMaster =
+ if
+ Masters == [] -> false;
+ true -> not LocalMaster0
+ end,
+ LocalMaster =
+ if
+ Masters == [] -> false;
+ true -> LocalMaster0
+ end,
+ if
+ Copies == [node()] ->
+ %% Only one copy holder and it is local.
+ %% It may also be a local contents table
+ {true, {Tab, local_only}};
+ LocalContent == true ->
+ {true, {Tab, local_content}};
+ LocalMaster == true ->
+ %% We have a local master
+ {true, {Tab, local_master}};
+ RemoteMaster == true ->
+ %% Wait for remote master copy
+ false;
+ Storage == ram_copies ->
+ if
+ Disc == [], DiscOnly == [] ->
+ %% Nobody has copy on disc
+ {true, {Tab, ram_only}};
+ true ->
+ %% Some other node has copy on disc
+ false
+ end;
+ AccessMode == read_only ->
+ %% No one has been able to update the table,
+ %% i.e. all disc resident copies are equal
+ {true, {Tab, read_only}};
+ BetterCopies /= [], Masters /= [node()] ->
+ %% There are better copies on other nodes
+ %% and we do not have the only master copy
+ false;
+ true ->
+ {true, {Tab, initial}}
+ end.
+
+reconfigure_tables(N, State, [Tab |Tail]) ->
+ del_active_replica(Tab, N),
+ case val({Tab, where_to_read}) of
+ N -> mnesia_lib:set_remote_where_to_read(Tab);
+ _ -> ignore
+ end,
+ LateQ = drop_loaders(Tab, N, State#state.late_loader_queue),
+ reconfigure_tables(N, State#state{late_loader_queue = LateQ}, Tail);
+
+reconfigure_tables(_, State, []) ->
+ State.
+
+remove_early_messages([], _Node) ->
+ [];
+remove_early_messages([{call, {add_active_replica, [_, Node, _, _], _}, _}|R], Node) ->
+ remove_early_messages(R, Node); %% Does a reply before queuing
+remove_early_messages([{call, {block_table, _, From}, ReplyTo}|R], Node)
+ when node(From) == Node ->
+ reply(ReplyTo, ok), %% Remove gen:server waits..
+ remove_early_messages(R, Node);
+remove_early_messages([{cast, {i_have_tab, _Tab, Node}}|R], Node) ->
+ remove_early_messages(R, Node);
+remove_early_messages([{cast, {adopt_orphans, Node, _Tabs}}|R], Node) ->
+ remove_early_messages(R, Node);
+remove_early_messages([M|R],Node) ->
+ [M|remove_early_messages(R,Node)].
+
+%% Drop loader from late load queue and possibly trigger a disc_load
+drop_loaders(Tab, Node, [H | T]) when H#late_load.table == Tab ->
+ %% Check if it is time to issue a disc_load request
+ case H#late_load.loaders of
+ [Node] ->
+ Reason = {H#late_load.reason, last_loader_down, Node},
+ cast({disc_load, Tab, Reason}); % Ugly cast
+ _ ->
+ ignore
+ end,
+ %% Drop the node from the list of loaders
+ H2 = H#late_load{loaders = H#late_load.loaders -- [Node]},
+ [H2 | drop_loaders(Tab, Node, T)];
+drop_loaders(Tab, Node, [H | T]) ->
+ [H | drop_loaders(Tab, Node, T)];
+drop_loaders(_, _, []) ->
+ [].
+
+add_active_replica(Tab, Node) ->
+ add_active_replica(Tab, Node, val({Tab, cstruct})).
+
+add_active_replica(Tab, Node, Cs) when record(Cs, cstruct) ->
+ Storage = mnesia_lib:schema_cs_to_storage_type(Node, Cs),
+ AccessMode = Cs#cstruct.access_mode,
+ add_active_replica(Tab, Node, Storage, AccessMode).
+
+%% Block table primitives
+
+block_table(Tab) ->
+ Var = {Tab, where_to_commit},
+ Old = val(Var),
+ New = {blocked, Old},
+ set(Var, New). % where_to_commit
+
+unblock_table(Tab) ->
+ Var = {Tab, where_to_commit},
+ New =
+ case val(Var) of
+ {blocked, List} ->
+ List;
+ List ->
+ List
+ end,
+ set(Var, New). % where_to_commit
+
+is_tab_blocked(W2C) when list(W2C) ->
+ {false, W2C};
+is_tab_blocked({blocked, W2C}) when list(W2C) ->
+ {true, W2C}.
+
+mark_blocked_tab(true, Value) ->
+ {blocked, Value};
+mark_blocked_tab(false, Value) ->
+ Value.
+
+%%
+
+add_active_replica(Tab, Node, Storage, AccessMode) ->
+ Var = {Tab, where_to_commit},
+ {Blocked, Old} = is_tab_blocked(val(Var)),
+ Del = lists:keydelete(Node, 1, Old),
+ case AccessMode of
+ read_write ->
+ New = lists:sort([{Node, Storage} | Del]),
+ set(Var, mark_blocked_tab(Blocked, New)), % where_to_commit
+ add({Tab, where_to_write}, Node);
+ read_only ->
+ set(Var, mark_blocked_tab(Blocked, Del)),
+ mnesia_lib:del({Tab, where_to_write}, Node)
+ end,
+ add({Tab, active_replicas}, Node).
+
+del_active_replica(Tab, Node) ->
+ Var = {Tab, where_to_commit},
+ {Blocked, Old} = is_tab_blocked(val(Var)),
+ Del = lists:keydelete(Node, 1, Old),
+ New = lists:sort(Del),
+ set(Var, mark_blocked_tab(Blocked, New)), % where_to_commit
+ mnesia_lib:del({Tab, active_replicas}, Node),
+ mnesia_lib:del({Tab, where_to_write}, Node).
+
+change_table_access_mode(Cs) ->
+ Tab = Cs#cstruct.name,
+ lists:foreach(fun(N) -> add_active_replica(Tab, N, Cs) end,
+ val({Tab, active_replicas})).
+
+%% node To now has tab loaded, but this must be undone
+%% This code is rpc:call'ed from the tab_copier process
+%% when it has *not* released it's table lock
+unannounce_add_table_copy(Tab, To) ->
+ del_active_replica(Tab, To),
+ case val({Tab , where_to_read}) of
+ To ->
+ mnesia_lib:set_remote_where_to_read(Tab);
+ _ ->
+ ignore
+ end.
+
+user_sync_tab(Tab) ->
+ case val(debug) of
+ trace ->
+ mnesia_subscr:subscribe(whereis(mnesia_event), {table, Tab});
+ _ ->
+ ignore
+ end,
+
+ case erase({sync_tab, Tab}) of
+ undefined ->
+ ok;
+ Pids ->
+ lists:foreach(fun(Pid) -> sync_reply(Pid, Tab) end, Pids)
+ end.
+
+i_have_tab(Tab) ->
+ case val({Tab, local_content}) of
+ true ->
+ mnesia_lib:set_local_content_whereabouts(Tab);
+ false ->
+ set({Tab, where_to_read}, node())
+ end,
+ add_active_replica(Tab, node()).
+
+sync_and_block_table_whereabouts(Tab, ToNode, RemoteS, AccessMode) when Tab /= schema ->
+ Current = val({current, db_nodes}),
+ Ns =
+ case lists:member(ToNode, Current) of
+ true -> Current -- [ToNode];
+ false -> Current
+ end,
+ remote_call(ToNode, block_table, [Tab]),
+ [remote_call(Node, add_active_replica, [Tab, ToNode, RemoteS, AccessMode]) ||
+ Node <- [ToNode | Ns]],
+ ok.
+
+sync_del_table_copy_whereabouts(Tab, ToNode) when Tab /= schema ->
+ Current = val({current, db_nodes}),
+ Ns =
+ case lists:member(ToNode, Current) of
+ true -> Current;
+ false -> [ToNode | Current]
+ end,
+ Args = [Tab, ToNode],
+ [remote_call(Node, unannounce_add_table_copy, Args) || Node <- Ns],
+ ok.
+
+get_info(Timeout) ->
+ case whereis(?SERVER_NAME) of
+ undefined ->
+ {timeout, Timeout};
+ Pid ->
+ Pid ! {self(), get_state},
+ receive
+ {?SERVER_NAME, State} when record(State, state) ->
+ {info,State}
+ after Timeout ->
+ {timeout, Timeout}
+ end
+ end.
+
+get_workers(Timeout) ->
+ case whereis(?SERVER_NAME) of
+ undefined ->
+ {timeout, Timeout};
+ Pid ->
+ Pid ! {self(), get_state},
+ receive
+ {?SERVER_NAME, State} when record(State, state) ->
+ {workers, State#state.loader_pid, State#state.sender_pid, State#state.dumper_pid}
+ after Timeout ->
+ {timeout, Timeout}
+ end
+ end.
+
+info() ->
+ Tabs = mnesia_lib:local_active_tables(),
+ io:format( "---> Active tables <--- ~n", []),
+ info(Tabs).
+
+info([Tab | Tail]) ->
+ case val({Tab, storage_type}) of
+ disc_only_copies ->
+ info_format(Tab,
+ dets:info(Tab, size),
+ dets:info(Tab, file_size),
+ "bytes on disc");
+ _ ->
+ info_format(Tab,
+ ?ets_info(Tab, size),
+ ?ets_info(Tab, memory),
+ "words of mem")
+ end,
+ info(Tail);
+info([]) -> ok;
+info(Tab) -> info([Tab]).
+
+info_format(Tab, Size, Mem, Media) ->
+ StrT = mnesia_lib:pad_name(atom_to_list(Tab), 15, []),
+ StrS = mnesia_lib:pad_name(integer_to_list(Size), 8, []),
+ StrM = mnesia_lib:pad_name(integer_to_list(Mem), 8, []),
+ io:format("~s: with ~s records occupying ~s ~s~n",
+ [StrT, StrS, StrM, Media]).
+
+%% Handle early arrived messages
+handle_early_msgs([Msg | Msgs], State) ->
+ %% The messages are in reverse order
+ case handle_early_msg(Msg, State) of
+ {stop, Reason, Reply, State2} ->
+ {stop, Reason, Reply, State2};
+ {stop, Reason, State2} ->
+ {stop, Reason, State2};
+ {noreply, State2} ->
+ handle_early_msgs(Msgs, State2);
+ {noreply, State2, _Timeout} ->
+ handle_early_msgs(Msgs, State2);
+ Else ->
+ dbg_out("handle_early_msgs case clause ~p ~n", [Else]),
+ erlang:error(Else, [[Msg | Msgs], State])
+ end;
+handle_early_msgs([], State) ->
+ noreply(State).
+
+handle_early_msg({call, Msg, From}, State) ->
+ handle_call(Msg, From, State);
+handle_early_msg({cast, Msg}, State) ->
+ handle_cast(Msg, State);
+handle_early_msg({info, Msg}, State) ->
+ handle_info(Msg, State).
+
+noreply(State) ->
+ {noreply, State}.
+
+reply(undefined, Reply) ->
+ Reply;
+reply(ReplyTo, Reply) ->
+ gen_server:reply(ReplyTo, Reply),
+ Reply.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Worker management
+
+%% Returns new State
+add_worker(Worker, State) when record(Worker, dump_log) ->
+ InitBy = Worker#dump_log.initiated_by,
+ Queue = State#state.dumper_queue,
+ case lists:keymember(InitBy, #dump_log.initiated_by, Queue) of
+ false ->
+ ignore;
+ true when Worker#dump_log.opt_reply_to == undefined ->
+ %% The same threshold has been exceeded again,
+ %% before we have had the possibility to
+ %% process the older one.
+ DetectedBy = {dump_log, InitBy},
+ Event = {mnesia_overload, DetectedBy},
+ mnesia_lib:report_system_event(Event)
+ end,
+ Queue2 = Queue ++ [Worker],
+ State2 = State#state{dumper_queue = Queue2},
+ opt_start_worker(State2);
+add_worker(Worker, State) when record(Worker, schema_commit_lock) ->
+ Queue = State#state.dumper_queue,
+ Queue2 = Queue ++ [Worker],
+ State2 = State#state{dumper_queue = Queue2},
+ opt_start_worker(State2);
+add_worker(Worker, State) when record(Worker, net_load) ->
+ Queue = State#state.loader_queue,
+ State2 = State#state{loader_queue = Queue ++ [Worker]},
+ opt_start_worker(State2);
+add_worker(Worker, State) when record(Worker, send_table) ->
+ Queue = State#state.sender_queue,
+ State2 = State#state{sender_queue = Queue ++ [Worker]},
+ opt_start_worker(State2);
+add_worker(Worker, State) when record(Worker, disc_load) ->
+ Queue = State#state.loader_queue,
+ State2 = State#state{loader_queue = Queue ++ [Worker]},
+ opt_start_worker(State2);
+% Block controller should be used for upgrading mnesia.
+add_worker(Worker, State) when record(Worker, block_controller) ->
+ Queue = State#state.dumper_queue,
+ Queue2 = [Worker | Queue],
+ State2 = State#state{dumper_queue = Queue2},
+ opt_start_worker(State2).
+
+%% Optionally start a worker
+%%
+%% Dumpers and loaders may run simultaneously
+%% but neither of them may run during schema commit.
+%% Loaders may not start if a schema commit is enqueued.
+opt_start_worker(State) when State#state.is_stopping == true ->
+ State;
+opt_start_worker(State) ->
+ %% Prioritize dumper and schema commit
+ %% by checking them first
+ case State#state.dumper_queue of
+ [Worker | _Rest] when State#state.dumper_pid == undefined ->
+ %% Great, a worker in queue and neither
+ %% a schema transaction is being
+ %% committed and nor a dumper is running
+
+ %% Start worker but keep him in the queue
+ if
+ record(Worker, schema_commit_lock) ->
+ ReplyTo = Worker#schema_commit_lock.owner,
+ reply(ReplyTo, granted),
+ {Owner, _Tag} = ReplyTo,
+ State#state{dumper_pid = Owner};
+
+ record(Worker, dump_log) ->
+ Pid = spawn_link(?MODULE, dump_and_reply, [self(), Worker]),
+ State2 = State#state{dumper_pid = Pid},
+
+ %% If the worker was a dumper we may
+ %% possibly be able to start a loader
+ %% or sender
+ State3 = opt_start_sender(State2),
+ opt_start_loader(State3);
+
+ record(Worker, block_controller) ->
+ case {State#state.sender_pid, State#state.loader_pid} of
+ {undefined, undefined} ->
+ ReplyTo = Worker#block_controller.owner,
+ reply(ReplyTo, granted),
+ {Owner, _Tag} = ReplyTo,
+ State#state{dumper_pid = Owner};
+ _ ->
+ State
+ end
+ end;
+ _ ->
+ %% Bad luck, try with a loader or sender instead
+ State2 = opt_start_sender(State),
+ opt_start_loader(State2)
+ end.
+
+opt_start_sender(State) ->
+ case State#state.sender_queue of
+ []->
+ %% No need
+ State;
+
+ _ when State#state.sender_pid /= undefined ->
+ %% Bad luck, a sender is already running
+ State;
+
+ [Sender | _SenderRest] ->
+ case State#state.loader_queue of
+ [Loader | _LoaderRest]
+ when State#state.loader_pid /= undefined,
+ Loader#net_load.table == Sender#send_table.table ->
+ %% A conflicting loader is running
+ State;
+ _ ->
+ SchemaQueue = State#state.dumper_queue,
+ case lists:keymember(schema_commit, 1, SchemaQueue) of
+ false ->
+
+ %% Start worker but keep him in the queue
+ Pid = spawn_link(?MODULE, send_and_reply,
+ [self(), Sender]),
+ State#state{sender_pid = Pid};
+ true ->
+ %% Bad luck, we must wait for the schema commit
+ State
+ end
+ end
+ end.
+
+opt_start_loader(State) ->
+ LoaderQueue = State#state.loader_queue,
+ if
+ LoaderQueue == [] ->
+ %% No need
+ State;
+
+ State#state.loader_pid /= undefined ->
+ %% Bad luck, an loader is already running
+ State;
+
+ true ->
+ SchemaQueue = State#state.dumper_queue,
+ case lists:keymember(schema_commit, 1, SchemaQueue) of
+ false ->
+ {Worker, Rest} = pick_next(LoaderQueue),
+
+ %% Start worker but keep him in the queue
+ Pid = spawn_link(?MODULE, load_and_reply, [self(), Worker]),
+ State#state{loader_pid = Pid,
+ loader_queue = [Worker | Rest]};
+ true ->
+ %% Bad luck, we must wait for the schema commit
+ State
+ end
+ end.
+
+start_remote_sender(Node, Tab, Receiver, Storage) ->
+ Msg = #send_table{table = Tab,
+ receiver_pid = Receiver,
+ remote_storage = Storage},
+ gen_server:cast({?SERVER_NAME, Node}, Msg).
+
+dump_and_reply(ReplyTo, Worker) ->
+ %% No trap_exit, die intentionally instead
+ Res = mnesia_dumper:opt_dump_log(Worker#dump_log.initiated_by),
+ ReplyTo ! #dumper_done{worker_pid = self(),
+ worker_res = Res},
+ unlink(ReplyTo),
+ exit(normal).
+
+send_and_reply(ReplyTo, Worker) ->
+ %% No trap_exit, die intentionally instead
+ Res = mnesia_loader:send_table(Worker#send_table.receiver_pid,
+ Worker#send_table.table,
+ Worker#send_table.remote_storage),
+ ReplyTo ! #sender_done{worker_pid = self(),
+ worker_res = Res},
+ unlink(ReplyTo),
+ exit(normal).
+
+
+load_and_reply(ReplyTo, Worker) ->
+ process_flag(trap_exit, true),
+ Done = load_table(Worker),
+ ReplyTo ! Done#loader_done{worker_pid = self()},
+ unlink(ReplyTo),
+ exit(normal).
+
+%% Now it is time to load the table
+%% but first we must check if it still is neccessary
+load_table(Load) when record(Load, net_load) ->
+ Tab = Load#net_load.table,
+ ReplyTo = Load#net_load.opt_reply_to,
+ Reason = Load#net_load.reason,
+ LocalC = val({Tab, local_content}),
+ AccessMode = val({Tab, access_mode}),
+ ReadNode = val({Tab, where_to_read}),
+ Active = filter_active(Tab),
+ Done = #loader_done{is_loaded = true,
+ table_name = Tab,
+ needs_announce = false,
+ needs_sync = false,
+ needs_reply = true,
+ reply_to = ReplyTo,
+ reply = {loaded, ok}
+ },
+ if
+ ReadNode == node() ->
+ %% Already loaded locally
+ Done;
+ LocalC == true ->
+ Res = mnesia_loader:disc_load_table(Tab, load_local_content),
+ Done#loader_done{reply = Res, needs_announce = true, needs_sync = true};
+ AccessMode == read_only ->
+ disc_load_table(Tab, Reason, ReplyTo);
+ true ->
+ %% Either we cannot read the table yet
+ %% or someone is moving a replica between
+ %% two nodes
+ Cs = Load#net_load.cstruct,
+ Res = mnesia_loader:net_load_table(Tab, Reason, Active, Cs),
+ case Res of
+ {loaded, ok} ->
+ Done#loader_done{needs_sync = true,
+ reply = Res};
+ {not_loaded, storage_unknown} ->
+ Done#loader_done{reply = Res};
+ {not_loaded, _} ->
+ Done#loader_done{is_loaded = false,
+ needs_reply = false,
+ reply = Res}
+ end
+ end;
+
+load_table(Load) when record(Load, disc_load) ->
+ Tab = Load#disc_load.table,
+ Reason = Load#disc_load.reason,
+ ReplyTo = Load#disc_load.opt_reply_to,
+ ReadNode = val({Tab, where_to_read}),
+ Active = filter_active(Tab),
+ Done = #loader_done{is_loaded = true,
+ table_name = Tab,
+ needs_announce = false,
+ needs_sync = false,
+ needs_reply = false
+ },
+ if
+ Active == [], ReadNode == nowhere ->
+ %% Not loaded anywhere, lets load it from disc
+ disc_load_table(Tab, Reason, ReplyTo);
+ ReadNode == nowhere ->
+ %% Already loaded on other node, lets get it
+ Cs = val({Tab, cstruct}),
+ case mnesia_loader:net_load_table(Tab, Reason, Active, Cs) of
+ {loaded, ok} ->
+ Done#loader_done{needs_sync = true};
+ {not_loaded, storage_unknown} ->
+ Done#loader_done{is_loaded = false};
+ {not_loaded, ErrReason} ->
+ Done#loader_done{is_loaded = false,
+ reply = {not_loaded,ErrReason}}
+ end;
+ true ->
+ %% Already readable, do not worry be happy
+ Done
+ end.
+
+disc_load_table(Tab, Reason, ReplyTo) ->
+ Done = #loader_done{is_loaded = true,
+ table_name = Tab,
+ needs_announce = false,
+ needs_sync = false,
+ needs_reply = true,
+ reply_to = ReplyTo,
+ reply = {loaded, ok}
+ },
+ Res = mnesia_loader:disc_load_table(Tab, Reason),
+ if
+ Res == {loaded, ok} ->
+ Done#loader_done{needs_announce = true,
+ needs_sync = true,
+ reply = Res};
+ ReplyTo /= undefined ->
+ Done#loader_done{is_loaded = false,
+ reply = Res};
+ true ->
+ fatal("Cannot load table ~p from disc: ~p~n", [Tab, Res])
+ end.
+
+filter_active(Tab) ->
+ ByForce = val({Tab, load_by_force}),
+ Active = val({Tab, active_replicas}),
+ Masters = mnesia_recover:get_master_nodes(Tab),
+ do_filter_active(ByForce, Active, Masters).
+
+do_filter_active(true, Active, _Masters) ->
+ Active;
+do_filter_active(false, Active, []) ->
+ Active;
+do_filter_active(false, Active, Masters) ->
+ mnesia_lib:intersect(Active, Masters).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_dumper.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_dumper.erl
new file mode 100644
index 0000000000..116823a779
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_dumper.erl
@@ -0,0 +1,1092 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_dumper.erl,v 1.1 2008/12/17 09:53:38 mikpe Exp $
+%%
+-module(mnesia_dumper).
+
+%% The InitBy arg may be one of the following:
+%% scan_decisions Initial scan for decisions
+%% startup Initial dump during startup
+%% schema_prepare Dump initiated during schema transaction preparation
+%% schema_update Dump initiated during schema transaction commit
+%% fast_schema_update A schema_update, but ignores the log file
+%% user Dump initiated by user
+%% write_threshold Automatic dump caused by too many log writes
+%% time_threshold Automatic dump caused by timeout
+
+%% Public interface
+-export([
+ get_log_writes/0,
+ incr_log_writes/0,
+ raw_dump_table/2,
+ raw_named_dump_table/2,
+ start_regulator/0,
+ opt_dump_log/1,
+ update/3
+ ]).
+
+ %% Internal stuff
+-export([regulator_init/1]).
+
+-include("mnesia.hrl").
+-include_lib("kernel/include/file.hrl").
+
+-import(mnesia_lib, [fatal/2, dbg_out/2]).
+
+-define(REGULATOR_NAME, mnesia_dumper_load_regulator).
+-define(DumpToEtsMultiplier, 4).
+
+-record(state, {initiated_by = nobody,
+ dumper = nopid,
+ regulator_pid,
+ supervisor_pid,
+ queue = [],
+ timeout}).
+
+get_log_writes() ->
+ Max = mnesia_monitor:get_env(dump_log_write_threshold),
+ Prev = mnesia_lib:read_counter(trans_log_writes),
+ Left = mnesia_lib:read_counter(trans_log_writes_left),
+ Diff = Max - Left,
+ Prev + Diff.
+
+incr_log_writes() ->
+ Left = mnesia_lib:incr_counter(trans_log_writes_left, -1),
+ if
+ Left > 0 ->
+ ignore;
+ true ->
+ adjust_log_writes(true)
+ end.
+
+adjust_log_writes(DoCast) ->
+ Token = {mnesia_adjust_log_writes, self()},
+ case global:set_lock(Token, [node()], 1) of
+ false ->
+ ignore; %% Somebody else is sending a dump request
+ true ->
+ case DoCast of
+ false ->
+ ignore;
+ true ->
+ mnesia_controller:async_dump_log(write_threshold)
+ end,
+ Max = mnesia_monitor:get_env(dump_log_write_threshold),
+ Left = mnesia_lib:read_counter(trans_log_writes_left),
+ %% Don't care if we lost a few writes
+ mnesia_lib:set_counter(trans_log_writes_left, Max),
+ Diff = Max - Left,
+ mnesia_lib:incr_counter(trans_log_writes, Diff),
+ global:del_lock(Token, [node()])
+ end.
+
+%% Returns 'ok' or exits
+opt_dump_log(InitBy) ->
+ Reg = case whereis(?REGULATOR_NAME) of
+ undefined ->
+ nopid;
+ Pid when pid(Pid) ->
+ Pid
+ end,
+ perform_dump(InitBy, Reg).
+
+%% Scan for decisions
+perform_dump(InitBy, Regulator) when InitBy == scan_decisions ->
+ ?eval_debug_fun({?MODULE, perform_dump}, [InitBy]),
+
+ dbg_out("Transaction log dump initiated by ~w~n", [InitBy]),
+ scan_decisions(mnesia_log:previous_log_file(), InitBy, Regulator),
+ scan_decisions(mnesia_log:latest_log_file(), InitBy, Regulator);
+
+%% Propagate the log into the DAT-files
+perform_dump(InitBy, Regulator) ->
+ ?eval_debug_fun({?MODULE, perform_dump}, [InitBy]),
+ LogState = mnesia_log:prepare_log_dump(InitBy),
+ dbg_out("Transaction log dump initiated by ~w: ~w~n",
+ [InitBy, LogState]),
+ adjust_log_writes(false),
+ mnesia_recover:allow_garb(),
+ case LogState of
+ already_dumped ->
+ dumped;
+ {needs_dump, Diff} ->
+ U = mnesia_monitor:get_env(dump_log_update_in_place),
+ Cont = mnesia_log:init_log_dump(),
+ case catch do_perform_dump(Cont, U, InitBy, Regulator, undefined) of
+ ok ->
+ ?eval_debug_fun({?MODULE, post_dump}, [InitBy]),
+ case mnesia_monitor:use_dir() of
+ true ->
+ mnesia_recover:dump_decision_tab();
+ false ->
+ mnesia_log:purge_some_logs()
+ end,
+ %% And now to the crucial point...
+ mnesia_log:confirm_log_dump(Diff);
+ {error, Reason} ->
+ {error, Reason};
+ {'EXIT', {Desc, Reason}} ->
+ case mnesia_monitor:get_env(auto_repair) of
+ true ->
+ mnesia_lib:important(Desc, Reason),
+ %% Ignore rest of the log
+ mnesia_log:confirm_log_dump(Diff);
+ false ->
+ fatal(Desc, Reason)
+ end
+ end;
+ {error, Reason} ->
+ {error, {"Cannot prepare log dump", Reason}}
+ end.
+
+scan_decisions(Fname, InitBy, Regulator) ->
+ Exists = mnesia_lib:exists(Fname),
+ case Exists of
+ false ->
+ ok;
+ true ->
+ Header = mnesia_log:trans_log_header(),
+ Name = previous_log,
+ mnesia_log:open_log(Name, Header, Fname, Exists,
+ mnesia_monitor:get_env(auto_repair), read_only),
+ Cont = start,
+ Res = (catch do_perform_dump(Cont, false, InitBy, Regulator, undefined)),
+ mnesia_log:close_log(Name),
+ case Res of
+ ok -> ok;
+ {'EXIT', Reason} -> {error, Reason}
+ end
+ end.
+
+do_perform_dump(Cont, InPlace, InitBy, Regulator, OldVersion) ->
+ case mnesia_log:chunk_log(Cont) of
+ {C2, Recs} ->
+ case catch insert_recs(Recs, InPlace, InitBy, Regulator, OldVersion) of
+ {'EXIT', R} ->
+ Reason = {"Transaction log dump error: ~p~n", [R]},
+ close_files(InPlace, {error, Reason}, InitBy),
+ exit(Reason);
+ Version ->
+ do_perform_dump(C2, InPlace, InitBy, Regulator, Version)
+ end;
+ eof ->
+ close_files(InPlace, ok, InitBy),
+ ok
+ end.
+
+insert_recs([Rec | Recs], InPlace, InitBy, Regulator, LogV) ->
+ regulate(Regulator),
+ case insert_rec(Rec, InPlace, InitBy, LogV) of
+ LogH when record(LogH, log_header) ->
+ insert_recs(Recs, InPlace, InitBy, Regulator, LogH#log_header.log_version);
+ _ ->
+ insert_recs(Recs, InPlace, InitBy, Regulator, LogV)
+ end;
+
+insert_recs([], _InPlace, _InitBy, _Regulator, Version) ->
+ Version.
+
+insert_rec(Rec, _InPlace, scan_decisions, _LogV) ->
+ if
+ record(Rec, commit) ->
+ ignore;
+ record(Rec, log_header) ->
+ ignore;
+ true ->
+ mnesia_recover:note_log_decision(Rec, scan_decisions)
+ end;
+insert_rec(Rec, InPlace, InitBy, LogV) when record(Rec, commit) ->
+ %% Determine the Outcome of the transaction and recover it
+ D = Rec#commit.decision,
+ case mnesia_recover:wait_for_decision(D, InitBy) of
+ {Tid, committed} ->
+ do_insert_rec(Tid, Rec, InPlace, InitBy, LogV);
+ {Tid, aborted} ->
+ mnesia_schema:undo_prepare_commit(Tid, Rec)
+ end;
+insert_rec(H, _InPlace, _InitBy, _LogV) when record(H, log_header) ->
+ CurrentVersion = mnesia_log:version(),
+ if
+ H#log_header.log_kind /= trans_log ->
+ exit({"Bad kind of transaction log", H});
+ H#log_header.log_version == CurrentVersion ->
+ ok;
+ H#log_header.log_version == "4.2" ->
+ ok;
+ H#log_header.log_version == "4.1" ->
+ ok;
+ H#log_header.log_version == "4.0" ->
+ ok;
+ true ->
+ fatal("Bad version of transaction log: ~p~n", [H])
+ end,
+ H;
+
+insert_rec(_Rec, _InPlace, _InitBy, _LogV) ->
+ ok.
+
+do_insert_rec(Tid, Rec, InPlace, InitBy, LogV) ->
+ case Rec#commit.schema_ops of
+ [] ->
+ ignore;
+ SchemaOps ->
+ case val({schema, storage_type}) of
+ ram_copies ->
+ insert_ops(Tid, schema_ops, SchemaOps, InPlace, InitBy, LogV);
+ Storage ->
+ true = open_files(schema, Storage, InPlace, InitBy),
+ insert_ops(Tid, schema_ops, SchemaOps, InPlace, InitBy, LogV)
+ end
+ end,
+ D = Rec#commit.disc_copies,
+ insert_ops(Tid, disc_copies, D, InPlace, InitBy, LogV),
+ case InitBy of
+ startup ->
+ DO = Rec#commit.disc_only_copies,
+ insert_ops(Tid, disc_only_copies, DO, InPlace, InitBy, LogV);
+ _ ->
+ ignore
+ end.
+
+
+update(_Tid, [], _DumperMode) ->
+ dumped;
+update(Tid, SchemaOps, DumperMode) ->
+ UseDir = mnesia_monitor:use_dir(),
+ Res = perform_update(Tid, SchemaOps, DumperMode, UseDir),
+ mnesia_controller:release_schema_commit_lock(),
+ Res.
+
+perform_update(_Tid, _SchemaOps, mandatory, true) ->
+ %% Force a dump of the transaction log in order to let the
+ %% dumper perform needed updates
+
+ InitBy = schema_update,
+ ?eval_debug_fun({?MODULE, dump_schema_op}, [InitBy]),
+ opt_dump_log(InitBy);
+perform_update(Tid, SchemaOps, _DumperMode, _UseDir) ->
+ %% No need for a full transaction log dump.
+ %% Ignore the log file and perform only perform
+ %% the corresponding updates.
+
+ InitBy = fast_schema_update,
+ InPlace = mnesia_monitor:get_env(dump_log_update_in_place),
+ ?eval_debug_fun({?MODULE, dump_schema_op}, [InitBy]),
+ case catch insert_ops(Tid, schema_ops, SchemaOps, InPlace, InitBy,
+ mnesia_log:version()) of
+ {'EXIT', Reason} ->
+ Error = {error, {"Schema update error", Reason}},
+ close_files(InPlace, Error, InitBy),
+ fatal("Schema update error ~p ~p", [Reason, SchemaOps]);
+ _ ->
+ ?eval_debug_fun({?MODULE, post_dump}, [InitBy]),
+ close_files(InPlace, ok, InitBy),
+ ok
+ end.
+
+insert_ops(_Tid, _Storage, [], _InPlace, _InitBy, _) -> ok;
+insert_ops(Tid, Storage, [Op], InPlace, InitBy, Ver) when Ver >= "4.3"->
+ insert_op(Tid, Storage, Op, InPlace, InitBy),
+ ok;
+insert_ops(Tid, Storage, [Op | Ops], InPlace, InitBy, Ver) when Ver >= "4.3"->
+ insert_op(Tid, Storage, Op, InPlace, InitBy),
+ insert_ops(Tid, Storage, Ops, InPlace, InitBy, Ver);
+insert_ops(Tid, Storage, [Op | Ops], InPlace, InitBy, Ver) when Ver < "4.3" ->
+ insert_ops(Tid, Storage, Ops, InPlace, InitBy, Ver),
+ insert_op(Tid, Storage, Op, InPlace, InitBy).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Normal ops
+
+disc_insert(_Tid, Storage, Tab, Key, Val, Op, InPlace, InitBy) ->
+ case open_files(Tab, Storage, InPlace, InitBy) of
+ true ->
+ case Storage of
+ disc_copies when Tab /= schema ->
+ mnesia_log:append({?MODULE,Tab}, {{Tab, Key}, Val, Op}),
+ ok;
+ _ ->
+ case Op of
+ write ->
+ ok = dets:insert(Tab, Val);
+ delete ->
+ ok = dets:delete(Tab, Key);
+ update_counter ->
+ {RecName, Incr} = Val,
+ case catch dets:update_counter(Tab, Key, Incr) of
+ CounterVal when integer(CounterVal) ->
+ ok;
+ _ ->
+ Zero = {RecName, Key, 0},
+ ok = dets:insert(Tab, Zero)
+ end;
+ delete_object ->
+ ok = dets:delete_object(Tab, Val);
+ clear_table ->
+ ok = dets:match_delete(Tab, '_')
+ end
+ end;
+ false ->
+ ignore
+ end.
+
+insert(Tid, Storage, Tab, Key, [Val | Tail], Op, InPlace, InitBy) ->
+ insert(Tid, Storage, Tab, Key, Val, Op, InPlace, InitBy),
+ insert(Tid, Storage, Tab, Key, Tail, Op, InPlace, InitBy);
+
+insert(_Tid, _Storage, _Tab, _Key, [], _Op, _InPlace, _InitBy) ->
+ ok;
+
+insert(Tid, Storage, Tab, Key, Val, Op, InPlace, InitBy) ->
+ Item = {{Tab, Key}, Val, Op},
+ case InitBy of
+ startup ->
+ disc_insert(Tid, Storage, Tab, Key, Val, Op, InPlace, InitBy);
+
+ _ when Storage == ram_copies ->
+ mnesia_tm:do_update_op(Tid, Storage, Item),
+ Snmp = mnesia_tm:prepare_snmp(Tab, Key, [Item]),
+ mnesia_tm:do_snmp(Tid, Snmp);
+
+ _ when Storage == disc_copies ->
+ disc_insert(Tid, Storage, Tab, Key, Val, Op, InPlace, InitBy),
+ mnesia_tm:do_update_op(Tid, Storage, Item),
+ Snmp = mnesia_tm:prepare_snmp(Tab, Key, [Item]),
+ mnesia_tm:do_snmp(Tid, Snmp);
+
+ _ when Storage == disc_only_copies ->
+ mnesia_tm:do_update_op(Tid, Storage, Item),
+ Snmp = mnesia_tm:prepare_snmp(Tab, Key, [Item]),
+ mnesia_tm:do_snmp(Tid, Snmp);
+
+ _ when Storage == unknown ->
+ ignore
+ end.
+
+disc_delete_table(Tab, Storage) ->
+ case mnesia_monitor:use_dir() of
+ true ->
+ if
+ Storage == disc_only_copies; Tab == schema ->
+ mnesia_monitor:unsafe_close_dets(Tab),
+ Dat = mnesia_lib:tab2dat(Tab),
+ file:delete(Dat);
+ true ->
+ DclFile = mnesia_lib:tab2dcl(Tab),
+ case get({?MODULE,Tab}) of
+ {opened_dumper, dcl} ->
+ del_opened_tab(Tab),
+ mnesia_log:unsafe_close_log(Tab);
+ _ ->
+ ok
+ end,
+ file:delete(DclFile),
+ DcdFile = mnesia_lib:tab2dcd(Tab),
+ file:delete(DcdFile),
+ ok
+ end,
+ erase({?MODULE, Tab});
+ false ->
+ ignore
+ end.
+
+disc_delete_indecies(_Tab, _Cs, Storage) when Storage /= disc_only_copies ->
+ ignore;
+disc_delete_indecies(Tab, Cs, disc_only_copies) ->
+ Indecies = Cs#cstruct.index,
+ mnesia_index:del_transient(Tab, Indecies, disc_only_copies).
+
+insert_op(Tid, Storage, {{Tab, Key}, Val, Op}, InPlace, InitBy) ->
+ %% Propagate to disc only
+ disc_insert(Tid, Storage, Tab, Key, Val, Op, InPlace, InitBy);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% NOTE that all operations below will only
+%% be performed if the dump is initiated by
+%% startup or fast_schema_update
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+insert_op(_Tid, schema_ops, _OP, _InPlace, Initby)
+ when Initby /= startup,
+ Initby /= fast_schema_update,
+ Initby /= schema_update ->
+ ignore;
+
+insert_op(Tid, _, {op, rec, Storage, Item}, InPlace, InitBy) ->
+ {{Tab, Key}, ValList, Op} = Item,
+ insert(Tid, Storage, Tab, Key, ValList, Op, InPlace, InitBy);
+
+insert_op(Tid, _, {op, change_table_copy_type, N, FromS, ToS, TabDef}, InPlace, InitBy) ->
+ Cs = mnesia_schema:list2cs(TabDef),
+ Val = mnesia_schema:insert_cstruct(Tid, Cs, true), % Update ram only
+ {schema, Tab, _} = Val,
+ if
+ InitBy /= startup ->
+ mnesia_controller:add_active_replica(Tab, N, Cs);
+ true ->
+ ignore
+ end,
+ if
+ N == node() ->
+ Dmp = mnesia_lib:tab2dmp(Tab),
+ Dat = mnesia_lib:tab2dat(Tab),
+ Dcd = mnesia_lib:tab2dcd(Tab),
+ Dcl = mnesia_lib:tab2dcl(Tab),
+ case {FromS, ToS} of
+ {ram_copies, disc_copies} when Tab == schema ->
+ ok = ensure_rename(Dmp, Dat);
+ {ram_copies, disc_copies} ->
+ file:delete(Dcl),
+ ok = ensure_rename(Dmp, Dcd);
+ {disc_copies, ram_copies} when Tab == schema ->
+ mnesia_lib:set(use_dir, false),
+ mnesia_monitor:unsafe_close_dets(Tab),
+ file:delete(Dat);
+ {disc_copies, ram_copies} ->
+ file:delete(Dcl),
+ file:delete(Dcd);
+ {ram_copies, disc_only_copies} ->
+ ok = ensure_rename(Dmp, Dat),
+ true = open_files(Tab, disc_only_copies, InPlace, InitBy),
+ %% ram_delete_table must be done before init_indecies,
+ %% it uses info which is reset in init_indecies,
+ %% it doesn't matter, because init_indecies don't use
+ %% the ram replica of the table when creating the disc
+ %% index; Could be improved :)
+ mnesia_schema:ram_delete_table(Tab, FromS),
+ PosList = Cs#cstruct.index,
+ mnesia_index:init_indecies(Tab, disc_only_copies, PosList);
+ {disc_only_copies, ram_copies} ->
+ mnesia_monitor:unsafe_close_dets(Tab),
+ disc_delete_indecies(Tab, Cs, disc_only_copies),
+ case InitBy of
+ startup ->
+ ignore;
+ _ ->
+ mnesia_controller:get_disc_copy(Tab)
+ end,
+ disc_delete_table(Tab, disc_only_copies);
+ {disc_copies, disc_only_copies} ->
+ ok = ensure_rename(Dmp, Dat),
+ true = open_files(Tab, disc_only_copies, InPlace, InitBy),
+ mnesia_schema:ram_delete_table(Tab, FromS),
+ PosList = Cs#cstruct.index,
+ mnesia_index:init_indecies(Tab, disc_only_copies, PosList),
+ file:delete(Dcl),
+ file:delete(Dcd);
+ {disc_only_copies, disc_copies} ->
+ mnesia_monitor:unsafe_close_dets(Tab),
+ disc_delete_indecies(Tab, Cs, disc_only_copies),
+ case InitBy of
+ startup ->
+ ignore;
+ _ ->
+ mnesia_log:ets2dcd(Tab),
+ mnesia_controller:get_disc_copy(Tab),
+ disc_delete_table(Tab, disc_only_copies)
+ end
+ end;
+ true ->
+ ignore
+ end,
+ S = val({schema, storage_type}),
+ disc_insert(Tid, S, schema, Tab, Val, write, InPlace, InitBy);
+
+insert_op(Tid, _, {op, transform, _Fun, TabDef}, InPlace, InitBy) ->
+ Cs = mnesia_schema:list2cs(TabDef),
+ case mnesia_lib:cs_to_storage_type(node(), Cs) of
+ disc_copies ->
+ open_dcl(Cs#cstruct.name);
+ _ ->
+ ignore
+ end,
+ insert_cstruct(Tid, Cs, true, InPlace, InitBy);
+
+%%% Operations below this are handled without using the logg.
+
+insert_op(Tid, _, {op, restore_recreate, TabDef}, InPlace, InitBy) ->
+ Cs = mnesia_schema:list2cs(TabDef),
+ Tab = Cs#cstruct.name,
+ Type = Cs#cstruct.type,
+ Storage = mnesia_lib:cs_to_storage_type(node(), Cs),
+ %% Delete all possbibly existing files and tables
+ disc_delete_table(Tab, Storage),
+ disc_delete_indecies(Tab, Cs, Storage),
+ case InitBy of
+ startup ->
+ ignore;
+ _ ->
+ mnesia_schema:ram_delete_table(Tab, Storage),
+ mnesia_checkpoint:tm_del_copy(Tab, node())
+ end,
+ %% delete_cstruct(Tid, Cs, InPlace, InitBy),
+ %% And create new ones..
+ if
+ (InitBy == startup) or (Storage == unknown) ->
+ ignore;
+ Storage == ram_copies ->
+ Args = [{keypos, 2}, public, named_table, Type],
+ mnesia_monitor:mktab(Tab, Args);
+ Storage == disc_copies ->
+ Args = [{keypos, 2}, public, named_table, Type],
+ mnesia_monitor:mktab(Tab, Args),
+ File = mnesia_lib:tab2dcd(Tab),
+ FArg = [{file, File}, {name, {mnesia,create}},
+ {repair, false}, {mode, read_write}],
+ {ok, Log} = mnesia_monitor:open_log(FArg),
+ mnesia_monitor:unsafe_close_log(Log);
+ Storage == disc_only_copies ->
+ File = mnesia_lib:tab2dat(Tab),
+ file:delete(File),
+ Args = [{file, mnesia_lib:tab2dat(Tab)},
+ {type, mnesia_lib:disk_type(Tab, Type)},
+ {keypos, 2},
+ {repair, mnesia_monitor:get_env(auto_repair)}],
+ mnesia_monitor:open_dets(Tab, Args)
+ end,
+ insert_op(Tid, ignore, {op, create_table, TabDef}, InPlace, InitBy);
+
+insert_op(Tid, _, {op, create_table, TabDef}, InPlace, InitBy) ->
+ Cs = mnesia_schema:list2cs(TabDef),
+ insert_cstruct(Tid, Cs, false, InPlace, InitBy),
+ Tab = Cs#cstruct.name,
+ Storage = mnesia_lib:cs_to_storage_type(node(), Cs),
+ case InitBy of
+ startup ->
+ case Storage of
+ unknown ->
+ ignore;
+ ram_copies ->
+ ignore;
+ disc_copies ->
+ Dcd = mnesia_lib:tab2dcd(Tab),
+ case mnesia_lib:exists(Dcd) of
+ true -> ignore;
+ false ->
+ mnesia_log:open_log(temp,
+ mnesia_log:dcl_log_header(),
+ Dcd,
+ false,
+ false,
+ read_write),
+ mnesia_log:unsafe_close_log(temp)
+ end;
+ _ ->
+ Args = [{file, mnesia_lib:tab2dat(Tab)},
+ {type, mnesia_lib:disk_type(Tab, Cs#cstruct.type)},
+ {keypos, 2},
+ {repair, mnesia_monitor:get_env(auto_repair)}],
+ case mnesia_monitor:open_dets(Tab, Args) of
+ {ok, _} ->
+ mnesia_monitor:unsafe_close_dets(Tab);
+ {error, Error} ->
+ exit({"Failed to create dets table", Error})
+ end
+ end;
+ _ ->
+ Copies = mnesia_lib:copy_holders(Cs),
+ Active = mnesia_lib:intersect(Copies, val({current, db_nodes})),
+ [mnesia_controller:add_active_replica(Tab, N, Cs) || N <- Active],
+
+ case Storage of
+ unknown ->
+ case Cs#cstruct.local_content of
+ true ->
+ ignore;
+ false ->
+ mnesia_lib:set_remote_where_to_read(Tab)
+ end;
+ _ ->
+ case Cs#cstruct.local_content of
+ true ->
+ mnesia_lib:set_local_content_whereabouts(Tab);
+ false ->
+ mnesia_lib:set({Tab, where_to_read}, node())
+ end,
+ case Storage of
+ ram_copies ->
+ ignore;
+ _ ->
+ %% Indecies are still created by loader
+ disc_delete_indecies(Tab, Cs, Storage)
+ %% disc_delete_table(Tab, Storage)
+ end,
+
+ %% Update whereabouts and create table
+ mnesia_controller:create_table(Tab)
+ end
+ end;
+
+insert_op(_Tid, _, {op, dump_table, Size, TabDef}, _InPlace, _InitBy) ->
+ case Size of
+ unknown ->
+ ignore;
+ _ ->
+ Cs = mnesia_schema:list2cs(TabDef),
+ Tab = Cs#cstruct.name,
+ Dmp = mnesia_lib:tab2dmp(Tab),
+ Dat = mnesia_lib:tab2dcd(Tab),
+ case Size of
+ 0 ->
+ %% Assume that table files already are closed
+ file:delete(Dmp),
+ file:delete(Dat);
+ _ ->
+ ok = ensure_rename(Dmp, Dat)
+ end
+ end;
+
+insert_op(Tid, _, {op, delete_table, TabDef}, InPlace, InitBy) ->
+ Cs = mnesia_schema:list2cs(TabDef),
+ Tab = Cs#cstruct.name,
+ case mnesia_lib:cs_to_storage_type(node(), Cs) of
+ unknown ->
+ ignore;
+ Storage ->
+ disc_delete_table(Tab, Storage),
+ disc_delete_indecies(Tab, Cs, Storage),
+ case InitBy of
+ startup ->
+ ignore;
+ _ ->
+ mnesia_schema:ram_delete_table(Tab, Storage),
+ mnesia_checkpoint:tm_del_copy(Tab, node())
+ end
+ end,
+ delete_cstruct(Tid, Cs, InPlace, InitBy);
+
+insert_op(Tid, _, {op, clear_table, TabDef}, InPlace, InitBy) ->
+ Cs = mnesia_schema:list2cs(TabDef),
+ Tab = Cs#cstruct.name,
+ case mnesia_lib:cs_to_storage_type(node(), Cs) of
+ unknown ->
+ ignore;
+ Storage ->
+ Oid = '_', %%val({Tab, wild_pattern}),
+ if Storage == disc_copies ->
+ open_dcl(Cs#cstruct.name);
+ true ->
+ ignore
+ end,
+ insert(Tid, Storage, Tab, '_', Oid, clear_table, InPlace, InitBy)
+ end;
+
+insert_op(Tid, _, {op, merge_schema, TabDef}, InPlace, InitBy) ->
+ Cs = mnesia_schema:list2cs(TabDef),
+ insert_cstruct(Tid, Cs, false, InPlace, InitBy);
+
+insert_op(Tid, _, {op, del_table_copy, Storage, Node, TabDef}, InPlace, InitBy) ->
+ Cs = mnesia_schema:list2cs(TabDef),
+ Tab = Cs#cstruct.name,
+ if
+ Tab == schema, Storage == ram_copies ->
+ insert_cstruct(Tid, Cs, true, InPlace, InitBy);
+ Tab /= schema ->
+ mnesia_controller:del_active_replica(Tab, Node),
+ mnesia_lib:del({Tab, Storage}, Node),
+ if
+ Node == node() ->
+ case Cs#cstruct.local_content of
+ true -> mnesia_lib:set({Tab, where_to_read}, nowhere);
+ false -> mnesia_lib:set_remote_where_to_read(Tab)
+ end,
+ mnesia_lib:del({schema, local_tables}, Tab),
+ mnesia_lib:set({Tab, storage_type}, unknown),
+ insert_cstruct(Tid, Cs, true, InPlace, InitBy),
+ disc_delete_table(Tab, Storage),
+ disc_delete_indecies(Tab, Cs, Storage),
+ mnesia_schema:ram_delete_table(Tab, Storage),
+ mnesia_checkpoint:tm_del_copy(Tab, Node);
+ true ->
+ case val({Tab, where_to_read}) of
+ Node ->
+ mnesia_lib:set_remote_where_to_read(Tab);
+ _ ->
+ ignore
+ end,
+ insert_cstruct(Tid, Cs, true, InPlace, InitBy)
+ end
+ end;
+
+insert_op(Tid, _, {op, add_table_copy, _Storage, _Node, TabDef}, InPlace, InitBy) ->
+ %% During prepare commit, the files was created
+ %% and the replica was announced
+ Cs = mnesia_schema:list2cs(TabDef),
+ insert_cstruct(Tid, Cs, true, InPlace, InitBy);
+
+insert_op(Tid, _, {op, add_snmp, _Us, TabDef}, InPlace, InitBy) ->
+ Cs = mnesia_schema:list2cs(TabDef),
+ insert_cstruct(Tid, Cs, true, InPlace, InitBy);
+
+insert_op(Tid, _, {op, del_snmp, TabDef}, InPlace, InitBy) ->
+ Cs = mnesia_schema:list2cs(TabDef),
+ Tab = Cs#cstruct.name,
+ Storage = mnesia_lib:cs_to_storage_type(node(), Cs),
+ if
+ InitBy /= startup,
+ Storage /= unknown ->
+ case ?catch_val({Tab, {index, snmp}}) of
+ {'EXIT', _} ->
+ ignore;
+ Stab ->
+ mnesia_snmp_hook:delete_table(Tab, Stab),
+ mnesia_lib:unset({Tab, {index, snmp}})
+ end;
+ true ->
+ ignore
+ end,
+ insert_cstruct(Tid, Cs, true, InPlace, InitBy);
+
+insert_op(Tid, _, {op, add_index, Pos, TabDef}, InPlace, InitBy) ->
+ Cs = mnesia_schema:list2cs(TabDef),
+ Tab = insert_cstruct(Tid, Cs, true, InPlace, InitBy),
+ Storage = mnesia_lib:cs_to_storage_type(node(), Cs),
+ case InitBy of
+ startup when Storage == disc_only_copies ->
+ mnesia_index:init_indecies(Tab, Storage, [Pos]);
+ startup ->
+ ignore;
+ _ ->
+ mnesia_index:init_indecies(Tab, Storage, [Pos])
+ end;
+
+insert_op(Tid, _, {op, del_index, Pos, TabDef}, InPlace, InitBy) ->
+ Cs = mnesia_schema:list2cs(TabDef),
+ Tab = Cs#cstruct.name,
+ Storage = mnesia_lib:cs_to_storage_type(node(), Cs),
+ case InitBy of
+ startup when Storage == disc_only_copies ->
+ mnesia_index:del_index_table(Tab, Storage, Pos);
+ startup ->
+ ignore;
+ _ ->
+ mnesia_index:del_index_table(Tab, Storage, Pos)
+ end,
+ insert_cstruct(Tid, Cs, true, InPlace, InitBy);
+
+insert_op(Tid, _, {op, change_table_access_mode,TabDef, _OldAccess, _Access}, InPlace, InitBy) ->
+ Cs = mnesia_schema:list2cs(TabDef),
+ case InitBy of
+ startup -> ignore;
+ _ -> mnesia_controller:change_table_access_mode(Cs)
+ end,
+ insert_cstruct(Tid, Cs, true, InPlace, InitBy);
+
+insert_op(Tid, _, {op, change_table_load_order, TabDef, _OldLevel, _Level}, InPlace, InitBy) ->
+ Cs = mnesia_schema:list2cs(TabDef),
+ insert_cstruct(Tid, Cs, true, InPlace, InitBy);
+
+insert_op(Tid, _, {op, delete_property, TabDef, PropKey}, InPlace, InitBy) ->
+ Cs = mnesia_schema:list2cs(TabDef),
+ Tab = Cs#cstruct.name,
+ mnesia_lib:unset({Tab, user_property, PropKey}),
+ insert_cstruct(Tid, Cs, true, InPlace, InitBy);
+
+insert_op(Tid, _, {op, write_property, TabDef, _Prop}, InPlace, InitBy) ->
+ Cs = mnesia_schema:list2cs(TabDef),
+ insert_cstruct(Tid, Cs, true, InPlace, InitBy);
+
+insert_op(Tid, _, {op, change_table_frag, _Change, TabDef}, InPlace, InitBy) ->
+ Cs = mnesia_schema:list2cs(TabDef),
+ insert_cstruct(Tid, Cs, true, InPlace, InitBy).
+
+open_files(Tab, Storage, UpdateInPlace, InitBy)
+ when Storage /= unknown, Storage /= ram_copies ->
+ case get({?MODULE, Tab}) of
+ undefined ->
+ case ?catch_val({Tab, setorbag}) of
+ {'EXIT', _} ->
+ false;
+ Type ->
+ case Storage of
+ disc_copies when Tab /= schema ->
+ Bool = open_disc_copies(Tab, InitBy),
+ Bool;
+ _ ->
+ Fname = prepare_open(Tab, UpdateInPlace),
+ Args = [{file, Fname},
+ {keypos, 2},
+ {repair, mnesia_monitor:get_env(auto_repair)},
+ {type, mnesia_lib:disk_type(Tab, Type)}],
+ {ok, _} = mnesia_monitor:open_dets(Tab, Args),
+ put({?MODULE, Tab}, {opened_dumper, dat}),
+ true
+ end
+ end;
+ already_dumped ->
+ false;
+ {opened_dumper, _} ->
+ true
+ end;
+open_files(_Tab, _Storage, _UpdateInPlace, _InitBy) ->
+ false.
+
+open_disc_copies(Tab, InitBy) ->
+ DclF = mnesia_lib:tab2dcl(Tab),
+ DumpEts =
+ case file:read_file_info(DclF) of
+ {error, enoent} ->
+ false;
+ {ok, DclInfo} ->
+ DcdF = mnesia_lib:tab2dcd(Tab),
+ case file:read_file_info(DcdF) of
+ {error, Reason} ->
+ mnesia_lib:dbg_out("File ~p info_error ~p ~n",
+ [DcdF, Reason]),
+ true;
+ {ok, DcdInfo} ->
+ DcdInfo#file_info.size =<
+ (DclInfo#file_info.size *
+ ?DumpToEtsMultiplier)
+ end
+ end,
+ if
+ DumpEts == false; InitBy == startup ->
+ mnesia_log:open_log({?MODULE,Tab},
+ mnesia_log:dcl_log_header(),
+ DclF,
+ mnesia_lib:exists(DclF),
+ mnesia_monitor:get_env(auto_repair),
+ read_write),
+ put({?MODULE, Tab}, {opened_dumper, dcl}),
+ true;
+ true ->
+ mnesia_log:ets2dcd(Tab),
+ put({?MODULE, Tab}, already_dumped),
+ false
+ end.
+
+%% Always opens the dcl file for writing overriding already_dumped
+%% mechanismen, used for schema transactions.
+open_dcl(Tab) ->
+ case get({?MODULE, Tab}) of
+ {opened_dumper, _} ->
+ true;
+ _ -> %% undefined or already_dumped
+ DclF = mnesia_lib:tab2dcl(Tab),
+ mnesia_log:open_log({?MODULE,Tab},
+ mnesia_log:dcl_log_header(),
+ DclF,
+ mnesia_lib:exists(DclF),
+ mnesia_monitor:get_env(auto_repair),
+ read_write),
+ put({?MODULE, Tab}, {opened_dumper, dcl}),
+ true
+ end.
+
+prepare_open(Tab, UpdateInPlace) ->
+ Dat = mnesia_lib:tab2dat(Tab),
+ case UpdateInPlace of
+ true ->
+ Dat;
+ false ->
+ Tmp = mnesia_lib:tab2tmp(Tab),
+ case catch mnesia_lib:copy_file(Dat, Tmp) of
+ ok ->
+ Tmp;
+ Error ->
+ fatal("Cannot copy dets file ~p to ~p: ~p~n",
+ [Dat, Tmp, Error])
+ end
+ end.
+
+del_opened_tab(Tab) ->
+ erase({?MODULE, Tab}).
+
+close_files(UpdateInPlace, Outcome, InitBy) -> % Update in place
+ close_files(UpdateInPlace, Outcome, InitBy, get()).
+
+close_files(InPlace, Outcome, InitBy, [{{?MODULE, Tab}, already_dumped} | Tail]) ->
+ erase({?MODULE, Tab}),
+ close_files(InPlace, Outcome, InitBy, Tail);
+close_files(InPlace, Outcome, InitBy, [{{?MODULE, Tab}, {opened_dumper, Type}} | Tail]) ->
+ erase({?MODULE, Tab}),
+ case val({Tab, storage_type}) of
+ disc_only_copies when InitBy /= startup ->
+ ignore;
+ disc_copies when Tab /= schema ->
+ mnesia_log:close_log({?MODULE,Tab});
+ Storage ->
+ do_close(InPlace, Outcome, Tab, Type, Storage)
+ end,
+ close_files(InPlace, Outcome, InitBy, Tail);
+
+close_files(InPlace, Outcome, InitBy, [_ | Tail]) ->
+ close_files(InPlace, Outcome, InitBy, Tail);
+close_files(_, _, _InitBy, []) ->
+ ok.
+
+%% If storage is unknown during close clean up files, this can happen if timing
+%% is right and dirty_write conflicts with schema operations.
+do_close(_, _, Tab, dcl, unknown) ->
+ mnesia_log:close_log({?MODULE,Tab}),
+ file:delete(mnesia_lib:tab2dcl(Tab));
+do_close(_, _, Tab, dcl, _) -> %% To be safe, can it happen?
+ mnesia_log:close_log({?MODULE,Tab});
+
+do_close(InPlace, Outcome, Tab, dat, Storage) ->
+ mnesia_monitor:close_dets(Tab),
+ if
+ Storage == unknown, InPlace == true ->
+ file:delete(mnesia_lib:tab2dat(Tab));
+ InPlace == true ->
+ %% Update in place
+ ok;
+ Outcome == ok, Storage /= unknown ->
+ %% Success: swap tmp files with dat files
+ TabDat = mnesia_lib:tab2dat(Tab),
+ ok = file:rename(mnesia_lib:tab2tmp(Tab), TabDat);
+ true ->
+ file:delete(mnesia_lib:tab2tmp(Tab))
+ end.
+
+
+ensure_rename(From, To) ->
+ case mnesia_lib:exists(From) of
+ true ->
+ file:rename(From, To);
+ false ->
+ case mnesia_lib:exists(To) of
+ true ->
+ ok;
+ false ->
+ {error, {rename_failed, From, To}}
+ end
+ end.
+
+insert_cstruct(Tid, Cs, KeepWhereabouts, InPlace, InitBy) ->
+ Val = mnesia_schema:insert_cstruct(Tid, Cs, KeepWhereabouts),
+ {schema, Tab, _} = Val,
+ S = val({schema, storage_type}),
+ disc_insert(Tid, S, schema, Tab, Val, write, InPlace, InitBy),
+ Tab.
+
+delete_cstruct(Tid, Cs, InPlace, InitBy) ->
+ Val = mnesia_schema:delete_cstruct(Tid, Cs),
+ {schema, Tab, _} = Val,
+ S = val({schema, storage_type}),
+ disc_insert(Tid, S, schema, Tab, Val, delete, InPlace, InitBy),
+ Tab.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Raw dump of table. Dumper must have unique access to the ets table.
+
+raw_named_dump_table(Tab, Ftype) ->
+ case mnesia_monitor:use_dir() of
+ true ->
+ mnesia_lib:lock_table(Tab),
+ TmpFname = mnesia_lib:tab2tmp(Tab),
+ Fname =
+ case Ftype of
+ dat -> mnesia_lib:tab2dat(Tab);
+ dmp -> mnesia_lib:tab2dmp(Tab)
+ end,
+ file:delete(TmpFname),
+ file:delete(Fname),
+ TabSize = ?ets_info(Tab, size),
+ TabRef = Tab,
+ DiskType = mnesia_lib:disk_type(Tab),
+ Args = [{file, TmpFname},
+ {keypos, 2},
+ %% {ram_file, true},
+ {estimated_no_objects, TabSize + 256},
+ {repair, mnesia_monitor:get_env(auto_repair)},
+ {type, DiskType}],
+ case mnesia_lib:dets_sync_open(TabRef, Args) of
+ {ok, TabRef} ->
+ Storage = ram_copies,
+ mnesia_lib:db_fixtable(Storage, Tab, true),
+
+ case catch raw_dump_table(TabRef, Tab) of
+ {'EXIT', Reason} ->
+ mnesia_lib:db_fixtable(Storage, Tab, false),
+ mnesia_lib:dets_sync_close(Tab),
+ file:delete(TmpFname),
+ mnesia_lib:unlock_table(Tab),
+ exit({"Dump of table to disc failed", Reason});
+ ok ->
+ mnesia_lib:db_fixtable(Storage, Tab, false),
+ mnesia_lib:dets_sync_close(Tab),
+ mnesia_lib:unlock_table(Tab),
+ ok = file:rename(TmpFname, Fname)
+ end;
+ {error, Reason} ->
+ mnesia_lib:unlock_table(Tab),
+ exit({"Open of file before dump to disc failed", Reason})
+ end;
+ false ->
+ exit({has_no_disc, node()})
+ end.
+
+raw_dump_table(DetsRef, EtsRef) ->
+ dets:from_ets(DetsRef, EtsRef).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Load regulator
+%%
+%% This is a poor mans substitute for a fair scheduler algorithm
+%% in the Erlang emulator. The mnesia_dumper process performs many
+%% costly BIF invokations and must pay for this. But since the
+%% Emulator does not handle this properly we must compensate for
+%% this with some form of load regulation of ourselves in order to
+%% not steal all computation power in the Erlang Emulator ans make
+%% other processes starve. Hopefully this is a temporary solution.
+
+start_regulator() ->
+ case mnesia_monitor:get_env(dump_log_load_regulation) of
+ false ->
+ nopid;
+ true ->
+ N = ?REGULATOR_NAME,
+ case mnesia_monitor:start_proc(N, ?MODULE, regulator_init, [self()]) of
+ {ok, Pid} ->
+ Pid;
+ {error, Reason} ->
+ fatal("Failed to start ~n: ~p~n", [N, Reason])
+ end
+ end.
+
+regulator_init(Parent) ->
+ %% No need for trapping exits.
+ %% Using low priority causes the regulation
+ process_flag(priority, low),
+ register(?REGULATOR_NAME, self()),
+ proc_lib:init_ack(Parent, {ok, self()}),
+ regulator_loop().
+
+regulator_loop() ->
+ receive
+ {regulate, From} ->
+ From ! {regulated, self()},
+ regulator_loop();
+ {stop, From} ->
+ From ! {stopped, self()},
+ exit(normal)
+ end.
+
+regulate(nopid) ->
+ ok;
+regulate(RegulatorPid) ->
+ RegulatorPid ! {regulate, self()},
+ receive
+ {regulated, RegulatorPid} -> ok
+ end.
+
+val(Var) ->
+ case ?catch_val(Var) of
+ {'EXIT', Reason} -> mnesia_lib:other_val(Var, Reason);
+ Value -> Value
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_event.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_event.erl
new file mode 100644
index 0000000000..6053179194
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_event.erl
@@ -0,0 +1,260 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_event.erl,v 1.1 2008/12/17 09:53:38 mikpe Exp $
+%%
+-module(mnesia_event).
+
+-behaviour(gen_event).
+%-behaviour(mnesia_event).
+
+%% gen_event callback interface
+-export([init/1,
+ handle_event/2,
+ handle_call/2,
+ handle_info/2,
+ terminate/2,
+ code_change/3]).
+
+-record(state, {nodes = [],
+ dumped_core = false, %% only dump fatal core once
+ args}).
+
+%%%----------------------------------------------------------------
+%%% Callback functions from gen_server
+%%%----------------------------------------------------------------
+
+%%-----------------------------------------------------------------
+%% init(Args) ->
+%% {ok, State} | Error
+%%-----------------------------------------------------------------
+
+init(Args) ->
+ {ok, #state{args = Args}}.
+
+%%-----------------------------------------------------------------
+%% handle_event(Event, State) ->
+%% {ok, NewState} | remove_handler |
+%% {swap_handler, Args1, State1, Mod2, Args2}
+%%-----------------------------------------------------------------
+
+handle_event(Event, State) ->
+ handle_any_event(Event, State).
+
+%%-----------------------------------------------------------------
+%% handle_info(Msg, State) ->
+%% {ok, NewState} | remove_handler |
+%% {swap_handler, Args1, State1, Mod2, Args2}
+%%-----------------------------------------------------------------
+
+handle_info(Msg, State) ->
+ handle_any_event(Msg, State),
+ {ok, State}.
+
+%%-----------------------------------------------------------------
+%% handle_call(Event, State) ->
+%% {ok, Reply, NewState} | {remove_handler, Reply} |
+%% {swap_handler, Reply, Args1, State1, Mod2, Args2}
+%%-----------------------------------------------------------------
+
+handle_call(Msg, State) ->
+ Reply = ok,
+ case handle_any_event(Msg, State) of
+ {ok, NewState} ->
+ {ok, Reply, NewState};
+ remove_handler ->
+ {remove_handler, Reply};
+ {swap_handler,Args1, State1, Mod2, Args2} ->
+ {swap_handler, Reply, Args1, State1, Mod2, Args2}
+ end.
+
+%%-----------------------------------------------------------------
+%% terminate(Reason, State) ->
+%% AnyVal
+%%-----------------------------------------------------------------
+
+terminate(_Reason, _State) ->
+ ok.
+
+%%----------------------------------------------------------------------
+%% Func: code_change/3
+%% Purpose: Upgrade process when its code is to be changed
+%% Returns: {ok, NewState}
+%%----------------------------------------------------------------------
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
+
+%%-----------------------------------------------------------------
+%% Internal functions
+%%-----------------------------------------------------------------
+
+handle_any_event({mnesia_system_event, Event}, State) ->
+ handle_system_event(Event, State);
+handle_any_event({mnesia_table_event, Event}, State) ->
+ handle_table_event(Event, State);
+handle_any_event(Msg, State) ->
+ report_error("~p got unexpected event: ~p~n", [?MODULE, Msg]),
+ {ok, State}.
+
+handle_table_event({Oper, Record, TransId}, State) ->
+ report_info("~p performed by ~p on record:~n\t~p~n",
+ [Oper, TransId, Record]),
+ {ok, State}.
+
+handle_system_event({mnesia_checkpoint_activated, _Checkpoint}, State) ->
+ {ok, State};
+
+handle_system_event({mnesia_checkpoint_deactivated, _Checkpoint}, State) ->
+ {ok, State};
+
+handle_system_event({mnesia_up, Node}, State) ->
+ Nodes = [Node | State#state.nodes],
+ {ok, State#state{nodes = Nodes}};
+
+handle_system_event({mnesia_down, Node}, State) ->
+ case mnesia:system_info(fallback_activated) of
+ true ->
+ case mnesia_monitor:get_env(fallback_error_function) of
+ {mnesia, lkill} ->
+ Msg = "A fallback is installed and Mnesia "
+ "must be restarted. Forcing shutdown "
+ "after mnesia_down from ~p...~n",
+ report_fatal(Msg, [Node], nocore, State#state.dumped_core),
+ mnesia:lkill(),
+ exit(fatal);
+ {UserMod, UserFunc} ->
+ Msg = "Warning: A fallback is installed and Mnesia got mnesia_down "
+ "from ~p. ~n",
+ report_info(Msg, [Node]),
+ case catch apply(UserMod, UserFunc, [Node]) of
+ {'EXIT', {undef, _Reason}} ->
+ %% Backward compatibility
+ apply(UserMod, UserFunc, []);
+ {'EXIT', Reason} ->
+ exit(Reason);
+ _ ->
+ ok
+ end,
+ Nodes = lists:delete(Node, State#state.nodes),
+ {ok, State#state{nodes = Nodes}}
+ end;
+ false ->
+ Nodes = lists:delete(Node, State#state.nodes),
+ {ok, State#state{nodes = Nodes}}
+ end;
+
+handle_system_event({mnesia_overload, Details}, State) ->
+ report_warning("Mnesia is overloaded: ~p~n", [Details]),
+ {ok, State};
+
+handle_system_event({mnesia_info, Format, Args}, State) ->
+ report_info(Format, Args),
+ {ok, State};
+
+handle_system_event({mnesia_warning, Format, Args}, State) ->
+ report_warning(Format, Args),
+ {ok, State};
+
+handle_system_event({mnesia_error, Format, Args}, State) ->
+ report_error(Format, Args),
+ {ok, State};
+
+handle_system_event({mnesia_fatal, Format, Args, BinaryCore}, State) ->
+ report_fatal(Format, Args, BinaryCore, State#state.dumped_core),
+ {ok, State#state{dumped_core = true}};
+
+handle_system_event({inconsistent_database, Reason, Node}, State) ->
+ report_error("mnesia_event got {inconsistent_database, ~w, ~w}~n",
+ [Reason, Node]),
+ {ok, State};
+
+handle_system_event({mnesia_user, Event}, State) ->
+ report_info("User event: ~p~n", [Event]),
+ {ok, State};
+
+handle_system_event(Msg, State) ->
+ report_error("mnesia_event got unexpected system event: ~p~n", [Msg]),
+ {ok, State}.
+
+report_info(Format0, Args0) ->
+ Format = "Mnesia(~p): " ++ Format0,
+ Args = [node() | Args0],
+ case global:whereis_name(mnesia_global_logger) of
+ undefined ->
+ io:format(Format, Args);
+ Pid ->
+ io:format(Pid, Format, Args)
+ end.
+
+report_warning(Format0, Args0) ->
+ Format = "Mnesia(~p): ** WARNING ** " ++ Format0,
+ Args = [node() | Args0],
+ case erlang:function_exported(error_logger, warning_msg, 2) of
+ true ->
+ error_logger:warning_msg(Format, Args);
+ false ->
+ error_logger:format(Format, Args)
+ end,
+ case global:whereis_name(mnesia_global_logger) of
+ undefined ->
+ ok;
+ Pid ->
+ io:format(Pid, Format, Args)
+ end.
+
+report_error(Format0, Args0) ->
+ Format = "Mnesia(~p): ** ERROR ** " ++ Format0,
+ Args = [node() | Args0],
+ error_logger:format(Format, Args),
+ case global:whereis_name(mnesia_global_logger) of
+ undefined ->
+ ok;
+ Pid ->
+ io:format(Pid, Format, Args)
+ end.
+
+report_fatal(Format, Args, BinaryCore, CoreDumped) ->
+ UseDir = mnesia_monitor:use_dir(),
+ CoreDir = mnesia_monitor:get_env(core_dir),
+ if
+ list(CoreDir),CoreDumped == false,binary(BinaryCore) ->
+ core_file(CoreDir,BinaryCore,Format,Args);
+ (UseDir == true),CoreDumped == false,binary(BinaryCore) ->
+ core_file(CoreDir,BinaryCore,Format,Args);
+ true ->
+ report_error("(ignoring core) ** FATAL ** " ++ Format, Args)
+ end.
+
+core_file(CoreDir,BinaryCore,Format,Args) ->
+ %% Integers = tuple_to_list(date()) ++ tuple_to_list(time()),
+ Integers = tuple_to_list(now()),
+ Fun = fun(I) when I < 10 -> ["_0",I];
+ (I) -> ["_",I]
+ end,
+ List = lists:append([Fun(I) || I <- Integers]),
+ CoreFile = if list(CoreDir) ->
+ filename:absname(lists:concat(["MnesiaCore.", node()] ++ List),
+ CoreDir);
+ true ->
+ filename:absname(lists:concat(["MnesiaCore.", node()] ++ List))
+ end,
+ case file:write_file(CoreFile, BinaryCore) of
+ ok ->
+ report_error("(core dumped to file: ~p)~n ** FATAL ** " ++ Format,
+ [CoreFile] ++ Args);
+ {error, Reason} ->
+ report_error("(could not write core file: ~p)~n ** FATAL ** " ++ Format,
+ [Reason] ++ Args)
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_frag.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_frag.erl
new file mode 100644
index 0000000000..92ac51a0dc
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_frag.erl
@@ -0,0 +1,1201 @@
+%%% ``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 via the world wide web 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.
+%%%
+%%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%%% AB. All Rights Reserved.''
+%%%
+%%% $Id: mnesia_frag.erl,v 1.1 2008/12/17 09:53:38 mikpe Exp $
+%%%
+%%%----------------------------------------------------------------------
+%%% Purpose : Support tables so large that they need
+%%% to be divided into several fragments.
+%%%----------------------------------------------------------------------
+
+%header_doc_include
+
+-module(mnesia_frag).
+-behaviour(mnesia_access).
+
+%% Callback functions when accessed within an activity
+-export([
+ lock/4,
+ write/5, delete/5, delete_object/5,
+ read/5, match_object/5, all_keys/4,
+ select/5,
+ index_match_object/6, index_read/6,
+ foldl/6, foldr/6,
+ table_info/4
+ ]).
+
+%header_doc_include
+
+-export([
+ change_table_frag/2,
+ remove_node/2,
+ expand_cstruct/1,
+ lookup_frag_hash/1,
+ lookup_foreigners/1,
+ frag_names/1,
+ set_frag_hash/2,
+ local_select/4,
+ remote_select/4
+ ]).
+
+-include("mnesia.hrl").
+
+-define(OLD_HASH_MOD, mnesia_frag_old_hash).
+-define(DEFAULT_HASH_MOD, mnesia_frag_hash).
+%%-define(DEFAULT_HASH_MOD, ?OLD_HASH_MOD). %% BUGBUG: New should be default
+
+-record(frag_state,
+ {foreign_key,
+ n_fragments,
+ hash_module,
+ hash_state}).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Access functions
+
+%impl_doc_include
+
+%% Callback functions which provides transparent
+%% access of fragmented tables from any activity
+%% access context.
+
+lock(ActivityId, Opaque, {table , Tab}, LockKind) ->
+ case frag_names(Tab) of
+ [Tab] ->
+ mnesia:lock(ActivityId, Opaque, {table, Tab}, LockKind);
+ Frags ->
+ DeepNs = [mnesia:lock(ActivityId, Opaque, {table, F}, LockKind) ||
+ F <- Frags],
+ mnesia_lib:uniq(lists:append(DeepNs))
+ end;
+
+lock(ActivityId, Opaque, LockItem, LockKind) ->
+ mnesia:lock(ActivityId, Opaque, LockItem, LockKind).
+
+write(ActivityId, Opaque, Tab, Rec, LockKind) ->
+ Frag = record_to_frag_name(Tab, Rec),
+ mnesia:write(ActivityId, Opaque, Frag, Rec, LockKind).
+
+delete(ActivityId, Opaque, Tab, Key, LockKind) ->
+ Frag = key_to_frag_name(Tab, Key),
+ mnesia:delete(ActivityId, Opaque, Frag, Key, LockKind).
+
+delete_object(ActivityId, Opaque, Tab, Rec, LockKind) ->
+ Frag = record_to_frag_name(Tab, Rec),
+ mnesia:delete_object(ActivityId, Opaque, Frag, Rec, LockKind).
+
+read(ActivityId, Opaque, Tab, Key, LockKind) ->
+ Frag = key_to_frag_name(Tab, Key),
+ mnesia:read(ActivityId, Opaque, Frag, Key, LockKind).
+
+match_object(ActivityId, Opaque, Tab, HeadPat, LockKind) ->
+ MatchSpec = [{HeadPat, [], ['$_']}],
+ select(ActivityId, Opaque, Tab, MatchSpec, LockKind).
+
+select(ActivityId, Opaque, Tab, MatchSpec, LockKind) ->
+ do_select(ActivityId, Opaque, Tab, MatchSpec, LockKind).
+
+all_keys(ActivityId, Opaque, Tab, LockKind) ->
+ Match = [mnesia:all_keys(ActivityId, Opaque, Frag, LockKind)
+ || Frag <- frag_names(Tab)],
+ lists:append(Match).
+
+index_match_object(ActivityId, Opaque, Tab, Pat, Attr, LockKind) ->
+ Match =
+ [mnesia:index_match_object(ActivityId, Opaque, Frag, Pat, Attr, LockKind)
+ || Frag <- frag_names(Tab)],
+ lists:append(Match).
+
+index_read(ActivityId, Opaque, Tab, Key, Attr, LockKind) ->
+ Match =
+ [mnesia:index_read(ActivityId, Opaque, Frag, Key, Attr, LockKind)
+ || Frag <- frag_names(Tab)],
+ lists:append(Match).
+
+foldl(ActivityId, Opaque, Fun, Acc, Tab, LockKind) ->
+ Fun2 = fun(Frag, A) ->
+ mnesia:foldl(ActivityId, Opaque, Fun, A, Frag, LockKind)
+ end,
+ lists:foldl(Fun2, Acc, frag_names(Tab)).
+
+foldr(ActivityId, Opaque, Fun, Acc, Tab, LockKind) ->
+ Fun2 = fun(Frag, A) ->
+ mnesia:foldr(ActivityId, Opaque, Fun, A, Frag, LockKind)
+ end,
+ lists:foldr(Fun2, Acc, frag_names(Tab)).
+
+table_info(ActivityId, Opaque, {Tab, Key}, Item) ->
+ Frag = key_to_frag_name(Tab, Key),
+ table_info2(ActivityId, Opaque, Tab, Frag, Item);
+table_info(ActivityId, Opaque, Tab, Item) ->
+ table_info2(ActivityId, Opaque, Tab, Tab, Item).
+
+table_info2(ActivityId, Opaque, Tab, Frag, Item) ->
+ case Item of
+ size ->
+ SumFun = fun({_, Size}, Acc) -> Acc + Size end,
+ lists:foldl(SumFun, 0, frag_size(ActivityId, Opaque, Tab));
+ memory ->
+ SumFun = fun({_, Size}, Acc) -> Acc + Size end,
+ lists:foldl(SumFun, 0, frag_memory(ActivityId, Opaque, Tab));
+ base_table ->
+ lookup_prop(Tab, base_table);
+ node_pool ->
+ lookup_prop(Tab, node_pool);
+ n_fragments ->
+ FH = lookup_frag_hash(Tab),
+ FH#frag_state.n_fragments;
+ foreign_key ->
+ FH = lookup_frag_hash(Tab),
+ FH#frag_state.foreign_key;
+ foreigners ->
+ lookup_foreigners(Tab);
+ n_ram_copies ->
+ length(val({Tab, ram_copies}));
+ n_disc_copies ->
+ length(val({Tab, disc_copies}));
+ n_disc_only_copies ->
+ length(val({Tab, disc_only_copies}));
+
+ frag_names ->
+ frag_names(Tab);
+ frag_dist ->
+ frag_dist(Tab);
+ frag_size ->
+ frag_size(ActivityId, Opaque, Tab);
+ frag_memory ->
+ frag_memory(ActivityId, Opaque, Tab);
+ _ ->
+ mnesia:table_info(ActivityId, Opaque, Frag, Item)
+ end.
+%impl_doc_include
+
+frag_size(ActivityId, Opaque, Tab) ->
+ [{F, remote_table_info(ActivityId, Opaque, F, size)} || F <- frag_names(Tab)].
+
+frag_memory(ActivityId, Opaque, Tab) ->
+ [{F, remote_table_info(ActivityId, Opaque, F, memory)} || F <- frag_names(Tab)].
+
+
+
+remote_table_info(ActivityId, Opaque, Tab, Item) ->
+ N = val({Tab, where_to_read}),
+ case rpc:call(N, mnesia, table_info, [ActivityId, Opaque, Tab, Item]) of
+ {badrpc, _} ->
+ mnesia:abort({no_exists, Tab, Item});
+ Info ->
+ Info
+ end.
+
+do_select(ActivityId, Opaque, Tab, MatchSpec, LockKind) ->
+ case ?catch_val({Tab, frag_hash}) of
+ {'EXIT', _} ->
+ mnesia:select(ActivityId, Opaque, Tab, MatchSpec, LockKind);
+ FH ->
+ HashState = FH#frag_state.hash_state,
+ FragNumbers =
+ case FH#frag_state.hash_module of
+ HashMod when HashMod == ?DEFAULT_HASH_MOD ->
+ ?DEFAULT_HASH_MOD:match_spec_to_frag_numbers(HashState, MatchSpec);
+ HashMod ->
+ HashMod:match_spec_to_frag_numbers(HashState, MatchSpec)
+ end,
+ N = FH#frag_state.n_fragments,
+ VerifyFun = fun(F) when integer(F), F >= 1, F =< N -> false;
+ (_F) -> true
+ end,
+ case catch lists:filter(VerifyFun, FragNumbers) of
+ [] ->
+ Fun = fun(Num) ->
+ Name = n_to_frag_name(Tab, Num),
+ Node = val({Name, where_to_read}),
+ mnesia:lock(ActivityId, Opaque, {table, Name}, LockKind),
+ {Name, Node}
+ end,
+ NameNodes = lists:map(Fun, FragNumbers),
+ SelectAllFun =
+ fun(PatchedMatchSpec) ->
+ Match = [mnesia:dirty_select(Name, PatchedMatchSpec)
+ || {Name, _Node} <- NameNodes],
+ lists:append(Match)
+ end,
+ case [{Name, Node} || {Name, Node} <- NameNodes, Node /= node()] of
+ [] ->
+ %% All fragments are local
+ mnesia:fun_select(ActivityId, Opaque, Tab, MatchSpec, none, '_', SelectAllFun);
+ RemoteNameNodes ->
+ SelectFun =
+ fun(PatchedMatchSpec) ->
+ Ref = make_ref(),
+ Args = [self(), Ref, RemoteNameNodes, PatchedMatchSpec],
+ Pid = spawn_link(?MODULE, local_select, Args),
+ LocalMatch = [mnesia:dirty_select(Name, PatchedMatchSpec)
+ || {Name, Node} <- NameNodes, Node == node()],
+ OldSelectFun = fun() -> SelectAllFun(PatchedMatchSpec) end,
+ local_collect(Ref, Pid, lists:append(LocalMatch), OldSelectFun)
+ end,
+ mnesia:fun_select(ActivityId, Opaque, Tab, MatchSpec, none, '_', SelectFun)
+ end;
+ BadFrags ->
+ mnesia:abort({"match_spec_to_frag_numbers: Fragment numbers out of range",
+ BadFrags, {range, 1, N}})
+ end
+ end.
+
+local_select(ReplyTo, Ref, RemoteNameNodes, MatchSpec) ->
+ RemoteNodes = mnesia_lib:uniq([Node || {_Name, Node} <- RemoteNameNodes]),
+ Args = [ReplyTo, Ref, RemoteNameNodes, MatchSpec],
+ {Replies, BadNodes} = rpc:multicall(RemoteNodes, ?MODULE, remote_select, Args),
+ case mnesia_lib:uniq(Replies) -- [ok] of
+ [] when BadNodes == [] ->
+ ReplyTo ! {local_select, Ref, ok};
+ _ when BadNodes /= [] ->
+ ReplyTo ! {local_select, Ref, {error, {node_not_running, hd(BadNodes)}}};
+ [{badrpc, {'EXIT', Reason}} | _] ->
+ ReplyTo ! {local_select, Ref, {error, Reason}};
+ [Reason | _] ->
+ ReplyTo ! {local_select, Ref, {error, Reason}}
+ end,
+ unlink(ReplyTo),
+ exit(normal).
+
+remote_select(ReplyTo, Ref, NameNodes, MatchSpec) ->
+ do_remote_select(ReplyTo, Ref, NameNodes, MatchSpec).
+
+do_remote_select(ReplyTo, Ref, [{Name, Node} | NameNodes], MatchSpec) ->
+ if
+ Node == node() ->
+ Res = (catch {ok, mnesia:dirty_select(Name, MatchSpec)}),
+ ReplyTo ! {remote_select, Ref, Node, Res},
+ do_remote_select(ReplyTo, Ref, NameNodes, MatchSpec);
+ true ->
+ do_remote_select(ReplyTo, Ref, NameNodes, MatchSpec)
+ end;
+do_remote_select(_ReplyTo, _Ref, [], _MatchSpec) ->
+ ok.
+
+local_collect(Ref, Pid, LocalMatch, OldSelectFun) ->
+ receive
+ {local_select, Ref, LocalRes} ->
+ remote_collect(Ref, LocalRes, LocalMatch, OldSelectFun);
+ {'EXIT', Pid, Reason} ->
+ remote_collect(Ref, {error, Reason}, [], OldSelectFun)
+ end.
+
+remote_collect(Ref, LocalRes = ok, Acc, OldSelectFun) ->
+ receive
+ {remote_select, Ref, Node, RemoteRes} ->
+ case RemoteRes of
+ {ok, RemoteMatch} ->
+ remote_collect(Ref, LocalRes, RemoteMatch ++ Acc, OldSelectFun);
+ _ ->
+ remote_collect(Ref, {error, {node_not_running, Node}}, [], OldSelectFun)
+ end
+ after 0 ->
+ Acc
+ end;
+remote_collect(Ref, LocalRes = {error, Reason}, _Acc, OldSelectFun) ->
+ receive
+ {remote_select, Ref, _Node, _RemoteRes} ->
+ remote_collect(Ref, LocalRes, [], OldSelectFun)
+ after 0 ->
+ mnesia:abort(Reason)
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Returns a list of cstructs
+
+expand_cstruct(Cs) ->
+ expand_cstruct(Cs, create).
+
+expand_cstruct(Cs, Mode) ->
+ Tab = Cs#cstruct.name,
+ Props = Cs#cstruct.frag_properties,
+ mnesia_schema:verify({alt, [nil, list]}, mnesia_lib:etype(Props),
+ {badarg, Tab, Props}),
+ %% Verify keys
+ ValidKeys = [foreign_key, n_fragments, node_pool,
+ n_ram_copies, n_disc_copies, n_disc_only_copies,
+ hash_module, hash_state],
+ Keys = mnesia_schema:check_keys(Tab, Props, ValidKeys),
+ mnesia_schema:check_duplicates(Tab, Keys),
+
+ %% Pick fragmentation props
+ ForeignKey = mnesia_schema:pick(Tab, foreign_key, Props, undefined),
+ {ForeignKey2, N, Pool, DefaultNR, DefaultND, DefaultNDO} =
+ pick_props(Tab, Cs, ForeignKey),
+
+ %% Verify node_pool
+ BadPool = {bad_type, Tab, {node_pool, Pool}},
+ mnesia_schema:verify(list, mnesia_lib:etype(Pool), BadPool),
+ NotAtom = fun(A) when atom(A) -> false;
+ (_A) -> true
+ end,
+ mnesia_schema:verify([], [P || P <- Pool, NotAtom(P)], BadPool),
+
+ NR = mnesia_schema:pick(Tab, n_ram_copies, Props, 0),
+ ND = mnesia_schema:pick(Tab, n_disc_copies, Props, 0),
+ NDO = mnesia_schema:pick(Tab, n_disc_only_copies, Props, 0),
+
+ PosInt = fun(I) when integer(I), I >= 0 -> true;
+ (_I) -> false
+ end,
+ mnesia_schema:verify(true, PosInt(NR),
+ {bad_type, Tab, {n_ram_copies, NR}}),
+ mnesia_schema:verify(true, PosInt(ND),
+ {bad_type, Tab, {n_disc_copies, ND}}),
+ mnesia_schema:verify(true, PosInt(NDO),
+ {bad_type, Tab, {n_disc_only_copies, NDO}}),
+
+ %% Verify n_fragments
+ Cs2 = verify_n_fragments(N, Cs, Mode),
+
+ %% Verify hash callback
+ HashMod = mnesia_schema:pick(Tab, hash_module, Props, ?DEFAULT_HASH_MOD),
+ HashState = mnesia_schema:pick(Tab, hash_state, Props, undefined),
+ HashState2 = HashMod:init_state(Tab, HashState), %% BUGBUG: Catch?
+
+ FH = #frag_state{foreign_key = ForeignKey2,
+ n_fragments = 1,
+ hash_module = HashMod,
+ hash_state = HashState2},
+ if
+ NR == 0, ND == 0, NDO == 0 ->
+ do_expand_cstruct(Cs2, FH, N, Pool, DefaultNR, DefaultND, DefaultNDO, Mode);
+ true ->
+ do_expand_cstruct(Cs2, FH, N, Pool, NR, ND, NDO, Mode)
+ end.
+
+do_expand_cstruct(Cs, FH, N, Pool, NR, ND, NDO, Mode) ->
+ Tab = Cs#cstruct.name,
+
+ LC = Cs#cstruct.local_content,
+ mnesia_schema:verify(false, LC,
+ {combine_error, Tab, {local_content, LC}}),
+
+ Snmp = Cs#cstruct.snmp,
+ mnesia_schema:verify([], Snmp,
+ {combine_error, Tab, {snmp, Snmp}}),
+
+ %% Add empty fragments
+ CommonProps = [{base_table, Tab}],
+ Cs2 = Cs#cstruct{frag_properties = lists:sort(CommonProps)},
+ expand_frag_cstructs(N, NR, ND, NDO, Cs2, Pool, Pool, FH, Mode).
+
+verify_n_fragments(N, Cs, Mode) when integer(N), N >= 1 ->
+ case Mode of
+ create ->
+ Cs#cstruct{ram_copies = [],
+ disc_copies = [],
+ disc_only_copies = []};
+ activate ->
+ Reason = {combine_error, Cs#cstruct.name, {n_fragments, N}},
+ mnesia_schema:verify(1, N, Reason),
+ Cs
+ end;
+verify_n_fragments(N, Cs, _Mode) ->
+ mnesia:abort({bad_type, Cs#cstruct.name, {n_fragments, N}}).
+
+pick_props(Tab, Cs, {ForeignTab, Attr}) ->
+ mnesia_schema:verify(true, ForeignTab /= Tab,
+ {combine_error, Tab, {ForeignTab, Attr}}),
+ Props = Cs#cstruct.frag_properties,
+ Attrs = Cs#cstruct.attributes,
+
+ ForeignKey = lookup_prop(ForeignTab, foreign_key),
+ ForeignN = lookup_prop(ForeignTab, n_fragments),
+ ForeignPool = lookup_prop(ForeignTab, node_pool),
+ N = mnesia_schema:pick(Tab, n_fragments, Props, ForeignN),
+ Pool = mnesia_schema:pick(Tab, node_pool, Props, ForeignPool),
+
+ mnesia_schema:verify(ForeignN, N,
+ {combine_error, Tab, {n_fragments, N},
+ ForeignTab, {n_fragments, ForeignN}}),
+
+ mnesia_schema:verify(ForeignPool, Pool,
+ {combine_error, Tab, {node_pool, Pool},
+ ForeignTab, {node_pool, ForeignPool}}),
+
+ mnesia_schema:verify(undefined, ForeignKey,
+ {combine_error, Tab,
+ "Multiple levels of foreign_key dependencies",
+ {ForeignTab, Attr}, ForeignKey}),
+
+ Key = {ForeignTab, mnesia_schema:attr_to_pos(Attr, Attrs)},
+ DefaultNR = length(val({ForeignTab, ram_copies})),
+ DefaultND = length(val({ForeignTab, disc_copies})),
+ DefaultNDO = length(val({ForeignTab, disc_only_copies})),
+ {Key, N, Pool, DefaultNR, DefaultND, DefaultNDO};
+pick_props(Tab, Cs, undefined) ->
+ Props = Cs#cstruct.frag_properties,
+ DefaultN = 1,
+ DefaultPool = mnesia:system_info(db_nodes),
+ N = mnesia_schema:pick(Tab, n_fragments, Props, DefaultN),
+ Pool = mnesia_schema:pick(Tab, node_pool, Props, DefaultPool),
+ DefaultNR = 1,
+ DefaultND = 0,
+ DefaultNDO = 0,
+ {undefined, N, Pool, DefaultNR, DefaultND, DefaultNDO};
+pick_props(Tab, _Cs, BadKey) ->
+ mnesia:abort({bad_type, Tab, {foreign_key, BadKey}}).
+
+expand_frag_cstructs(N, NR, ND, NDO, CommonCs, Dist, Pool, FH, Mode)
+ when N > 1, Mode == create ->
+ Frag = n_to_frag_name(CommonCs#cstruct.name, N),
+ Cs = CommonCs#cstruct{name = Frag},
+ {Cs2, RevModDist, RestDist} = set_frag_nodes(NR, ND, NDO, Cs, Dist, []),
+ ModDist = lists:reverse(RevModDist),
+ Dist2 = rearrange_dist(Cs, ModDist, RestDist, Pool),
+ %% Adjusts backwards, but it doesn't matter.
+ {FH2, _FromFrags, _AdditionalWriteFrags} = adjust_before_split(FH),
+ CsList = expand_frag_cstructs(N - 1, NR, ND, NDO, CommonCs, Dist2, Pool, FH2, Mode),
+ [Cs2 | CsList];
+expand_frag_cstructs(1, NR, ND, NDO, CommonCs, Dist, Pool, FH, Mode) ->
+ BaseProps = CommonCs#cstruct.frag_properties ++
+ [{foreign_key, FH#frag_state.foreign_key},
+ {hash_module, FH#frag_state.hash_module},
+ {hash_state, FH#frag_state.hash_state},
+ {n_fragments, FH#frag_state.n_fragments},
+ {node_pool, Pool}
+ ],
+ BaseCs = CommonCs#cstruct{frag_properties = lists:sort(BaseProps)},
+ case Mode of
+ activate ->
+ [BaseCs];
+ create ->
+ {BaseCs2, _, _} = set_frag_nodes(NR, ND, NDO, BaseCs, Dist, []),
+ [BaseCs2]
+ end.
+
+set_frag_nodes(NR, ND, NDO, Cs, [Head | Tail], Acc) when NR > 0 ->
+ Pos = #cstruct.ram_copies,
+ {Cs2, Head2} = set_frag_node(Cs, Pos, Head),
+ set_frag_nodes(NR - 1, ND, NDO, Cs2, Tail, [Head2 | Acc]);
+set_frag_nodes(NR, ND, NDO, Cs, [Head | Tail], Acc) when ND > 0 ->
+ Pos = #cstruct.disc_copies,
+ {Cs2, Head2} = set_frag_node(Cs, Pos, Head),
+ set_frag_nodes(NR, ND - 1, NDO, Cs2, Tail, [Head2 | Acc]);
+set_frag_nodes(NR, ND, NDO, Cs, [Head | Tail], Acc) when NDO > 0 ->
+ Pos = #cstruct.disc_only_copies,
+ {Cs2, Head2} = set_frag_node(Cs, Pos, Head),
+ set_frag_nodes(NR, ND, NDO - 1, Cs2, Tail, [Head2 | Acc]);
+set_frag_nodes(0, 0, 0, Cs, RestDist, ModDist) ->
+ {Cs, ModDist, RestDist};
+set_frag_nodes(_, _, _, Cs, [], _) ->
+ mnesia:abort({combine_error, Cs#cstruct.name, "Too few nodes in node_pool"}).
+
+set_frag_node(Cs, Pos, Head) ->
+ Ns = element(Pos, Cs),
+ {Node, Count2} =
+ case Head of
+ {N, Count} when atom(N), integer(Count), Count >= 0 ->
+ {N, Count + 1};
+ N when atom(N) ->
+ {N, 1};
+ BadNode ->
+ mnesia:abort({bad_type, Cs#cstruct.name, BadNode})
+ end,
+ Cs2 = setelement(Pos, Cs, [Node | Ns]),
+ {Cs2, {Node, Count2}}.
+
+rearrange_dist(Cs, [{Node, Count} | ModDist], Dist, Pool) ->
+ Dist2 = insert_dist(Cs, Node, Count, Dist, Pool),
+ rearrange_dist(Cs, ModDist, Dist2, Pool);
+rearrange_dist(_Cs, [], Dist, _) ->
+ Dist.
+
+insert_dist(Cs, Node, Count, [Head | Tail], Pool) ->
+ case Head of
+ {Node2, Count2} when atom(Node2), integer(Count2), Count2 >= 0 ->
+ case node_diff(Node, Count, Node2, Count2, Pool) of
+ less ->
+ [{Node, Count}, Head | Tail];
+ greater ->
+ [Head | insert_dist(Cs, Node, Count, Tail, Pool)]
+ end;
+ Node2 when atom(Node2) ->
+ insert_dist(Cs, Node, Count, [{Node2, 0} | Tail], Pool);
+ BadNode ->
+ mnesia:abort({bad_type, Cs#cstruct.name, BadNode})
+ end;
+insert_dist(_Cs, Node, Count, [], _Pool) ->
+ [{Node, Count}];
+insert_dist(_Cs, _Node, _Count, Dist, _Pool) ->
+ mnesia:abort({bad_type, Dist}).
+
+node_diff(_Node, Count, _Node2, Count2, _Pool) when Count < Count2 ->
+ less;
+node_diff(Node, Count, Node2, Count2, Pool) when Count == Count2 ->
+ Pos = list_pos(Node, Pool, 1),
+ Pos2 = list_pos(Node2, Pool, 1),
+ if
+ Pos < Pos2 ->
+ less;
+ Pos > Pos2 ->
+ greater
+ end;
+node_diff(_Node, Count, _Node2, Count2, _Pool) when Count > Count2 ->
+ greater.
+
+%% Returns position of element in list
+list_pos(H, [H | _T], Pos) ->
+ Pos;
+list_pos(E, [_H | T], Pos) ->
+ list_pos(E, T, Pos + 1).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Switch function for changing of table fragmentation
+%%
+%% Returns a list of lists of schema ops
+
+change_table_frag(Tab, {activate, FragProps}) ->
+ make_activate(Tab, FragProps);
+change_table_frag(Tab, deactivate) ->
+ make_deactivate(Tab);
+change_table_frag(Tab, {add_frag, SortedNodes}) ->
+ make_multi_add_frag(Tab, SortedNodes);
+change_table_frag(Tab, del_frag) ->
+ make_multi_del_frag(Tab);
+change_table_frag(Tab, {add_node, Node}) ->
+ make_multi_add_node(Tab, Node);
+change_table_frag(Tab, {del_node, Node}) ->
+ make_multi_del_node(Tab, Node);
+change_table_frag(Tab, Change) ->
+ mnesia:abort({bad_type, Tab, Change}).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Turn a normal table into a fragmented table
+%%
+%% The storage type must be the same on all nodes
+
+make_activate(Tab, Props) ->
+ Cs = mnesia_schema:incr_version(val({Tab, cstruct})),
+ mnesia_schema:ensure_active(Cs),
+ case Cs#cstruct.frag_properties of
+ [] ->
+ Cs2 = Cs#cstruct{frag_properties = Props},
+ [Cs3] = expand_cstruct(Cs2, activate),
+ TabDef = mnesia_schema:cs2list(Cs3),
+ Op = {op, change_table_frag, activate, TabDef},
+ [[Op]];
+ BadProps ->
+ mnesia:abort({already_exists, Tab, {frag_properties, BadProps}})
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Turn a table into a normal defragmented table
+
+make_deactivate(Tab) ->
+ Cs = mnesia_schema:incr_version(val({Tab, cstruct})),
+ mnesia_schema:ensure_active(Cs),
+ Foreigners = lookup_foreigners(Tab),
+ BaseTab = lookup_prop(Tab, base_table),
+ FH = lookup_frag_hash(Tab),
+ if
+ BaseTab /= Tab ->
+ mnesia:abort({combine_error, Tab, "Not a base table"});
+ Foreigners /= [] ->
+ mnesia:abort({combine_error, Tab, "Too many foreigners", Foreigners});
+ FH#frag_state.n_fragments > 1 ->
+ mnesia:abort({combine_error, Tab, "Too many fragments"});
+ true ->
+ Cs2 = Cs#cstruct{frag_properties = []},
+ TabDef = mnesia_schema:cs2list(Cs2),
+ Op = {op, change_table_frag, deactivate, TabDef},
+ [[Op]]
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Add a fragment to a fragmented table and fill it with half of
+%% the records from one of the old fragments
+
+make_multi_add_frag(Tab, SortedNs) when list(SortedNs) ->
+ verify_multi(Tab),
+ Ops = make_add_frag(Tab, SortedNs),
+
+ %% Propagate to foreigners
+ MoreOps = [make_add_frag(T, SortedNs) || T <- lookup_foreigners(Tab)],
+ [Ops | MoreOps];
+make_multi_add_frag(Tab, SortedNs) ->
+ mnesia:abort({bad_type, Tab, SortedNs}).
+
+verify_multi(Tab) ->
+ FH = lookup_frag_hash(Tab),
+ ForeignKey = FH#frag_state.foreign_key,
+ mnesia_schema:verify(undefined, ForeignKey,
+ {combine_error, Tab,
+ "Op only allowed via foreign table",
+ {foreign_key, ForeignKey}}).
+
+make_frag_names_and_acquire_locks(Tab, N, FragIndecies, DoNotLockN) ->
+ mnesia_schema:get_tid_ts_and_lock(Tab, write),
+ Fun = fun(Index, FN) ->
+ if
+ DoNotLockN == true, Index == N ->
+ Name = n_to_frag_name(Tab, Index),
+ setelement(Index, FN, Name);
+ true ->
+ Name = n_to_frag_name(Tab, Index),
+ mnesia_schema:get_tid_ts_and_lock(Name, write),
+ setelement(Index , FN, Name)
+ end
+ end,
+ FragNames = erlang:make_tuple(N, undefined),
+ lists:foldl(Fun, FragNames, FragIndecies).
+
+make_add_frag(Tab, SortedNs) ->
+ Cs = mnesia_schema:incr_version(val({Tab, cstruct})),
+ mnesia_schema:ensure_active(Cs),
+ FH = lookup_frag_hash(Tab),
+ {FH2, FromIndecies, WriteIndecies} = adjust_before_split(FH),
+ N = FH2#frag_state.n_fragments,
+ FragNames = make_frag_names_and_acquire_locks(Tab, N, WriteIndecies, true),
+ NewFrag = element(N, FragNames),
+
+ NR = length(Cs#cstruct.ram_copies),
+ ND = length(Cs#cstruct.disc_copies),
+ NDO = length(Cs#cstruct.disc_only_copies),
+ NewCs = Cs#cstruct{name = NewFrag,
+ frag_properties = [{base_table, Tab}],
+ ram_copies = [],
+ disc_copies = [],
+ disc_only_copies = []},
+ {NewCs2, _, _} = set_frag_nodes(NR, ND, NDO, NewCs, SortedNs, []),
+ [NewOp] = mnesia_schema:make_create_table(NewCs2),
+
+ SplitOps = split(Tab, FH2, FromIndecies, FragNames, []),
+
+ Cs2 = replace_frag_hash(Cs, FH2),
+ TabDef = mnesia_schema:cs2list(Cs2),
+ BaseOp = {op, change_table_frag, {add_frag, SortedNs}, TabDef},
+
+ [BaseOp, NewOp | SplitOps].
+
+replace_frag_hash(Cs, FH) when record(FH, frag_state) ->
+ Fun = fun(Prop) ->
+ case Prop of
+ {n_fragments, _} ->
+ {true, {n_fragments, FH#frag_state.n_fragments}};
+ {hash_module, _} ->
+ {true, {hash_module, FH#frag_state.hash_module}};
+ {hash_state, _} ->
+ {true, {hash_state, FH#frag_state.hash_state}};
+ {next_n_to_split, _} ->
+ false;
+ {n_doubles, _} ->
+ false;
+ _ ->
+ true
+ end
+ end,
+ Props = lists:zf(Fun, Cs#cstruct.frag_properties),
+ Cs#cstruct{frag_properties = Props}.
+
+%% Adjust table info before split
+adjust_before_split(FH) ->
+ HashState = FH#frag_state.hash_state,
+ {HashState2, FromFrags, AdditionalWriteFrags} =
+ case FH#frag_state.hash_module of
+ HashMod when HashMod == ?DEFAULT_HASH_MOD ->
+ ?DEFAULT_HASH_MOD:add_frag(HashState);
+ HashMod ->
+ HashMod:add_frag(HashState)
+ end,
+ N = FH#frag_state.n_fragments + 1,
+ FromFrags2 = (catch lists:sort(FromFrags)),
+ UnionFrags = (catch lists:merge(FromFrags2, lists:sort(AdditionalWriteFrags))),
+ VerifyFun = fun(F) when integer(F), F >= 1, F =< N -> false;
+ (_F) -> true
+ end,
+ case catch lists:filter(VerifyFun, UnionFrags) of
+ [] ->
+ FH2 = FH#frag_state{n_fragments = N,
+ hash_state = HashState2},
+ {FH2, FromFrags2, UnionFrags};
+ BadFrags ->
+ mnesia:abort({"add_frag: Fragment numbers out of range",
+ BadFrags, {range, 1, N}})
+ end.
+
+split(Tab, FH, [SplitN | SplitNs], FragNames, Ops) ->
+ SplitFrag = element(SplitN, FragNames),
+ Pat = mnesia:table_info(SplitFrag, wild_pattern),
+ {_Mod, Tid, Ts} = mnesia_schema:get_tid_ts_and_lock(Tab, none),
+ Recs = mnesia:match_object(Tid, Ts, SplitFrag, Pat, read),
+ Ops2 = do_split(FH, SplitN, FragNames, Recs, Ops),
+ split(Tab, FH, SplitNs, FragNames, Ops2);
+split(_Tab, _FH, [], _FragNames, Ops) ->
+ Ops.
+
+%% Perform the split of the table
+do_split(FH, OldN, FragNames, [Rec | Recs], Ops) ->
+ Pos = key_pos(FH),
+ HashKey = element(Pos, Rec),
+ case key_to_n(FH, HashKey) of
+ NewN when NewN == OldN ->
+ %% Keep record in the same fragment. No need to move it.
+ do_split(FH, OldN, FragNames, Recs, Ops);
+ NewN ->
+ case element(NewN, FragNames) of
+ NewFrag when NewFrag /= undefined ->
+ OldFrag = element(OldN, FragNames),
+ Key = element(2, Rec),
+ NewOid = {NewFrag, Key},
+ OldOid = {OldFrag, Key},
+ Ops2 = [{op, rec, unknown, {NewOid, [Rec], write}},
+ {op, rec, unknown, {OldOid, [OldOid], delete}} | Ops],
+ do_split(FH, OldN, FragNames, Recs, Ops2);
+ _NewFrag ->
+ %% Tried to move record to fragment that not is locked
+ mnesia:abort({"add_frag: Fragment not locked", NewN})
+ end
+ end;
+do_split(_FH, _OldN, _FragNames, [], Ops) ->
+ Ops.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Delete a fragment from a fragmented table
+%% and merge its records with an other fragment
+
+make_multi_del_frag(Tab) ->
+ verify_multi(Tab),
+ Ops = make_del_frag(Tab),
+
+ %% Propagate to foreigners
+ MoreOps = [make_del_frag(T) || T <- lookup_foreigners(Tab)],
+ [Ops | MoreOps].
+
+make_del_frag(Tab) ->
+ FH = lookup_frag_hash(Tab),
+ case FH#frag_state.n_fragments of
+ N when N > 1 ->
+ Cs = mnesia_schema:incr_version(val({Tab, cstruct})),
+ mnesia_schema:ensure_active(Cs),
+ {FH2, FromIndecies, WriteIndecies} = adjust_before_merge(FH),
+ FragNames = make_frag_names_and_acquire_locks(Tab, N, WriteIndecies, false),
+
+ MergeOps = merge(Tab, FH2, FromIndecies, FragNames, []),
+ LastFrag = element(N, FragNames),
+ [LastOp] = mnesia_schema:make_delete_table(LastFrag, single_frag),
+ Cs2 = replace_frag_hash(Cs, FH2),
+ TabDef = mnesia_schema:cs2list(Cs2),
+ BaseOp = {op, change_table_frag, del_frag, TabDef},
+ [BaseOp, LastOp | MergeOps];
+ _ ->
+ %% Cannot remove the last fragment
+ mnesia:abort({no_exists, Tab})
+ end.
+
+%% Adjust tab info before merge
+adjust_before_merge(FH) ->
+ HashState = FH#frag_state.hash_state,
+ {HashState2, FromFrags, AdditionalWriteFrags} =
+ case FH#frag_state.hash_module of
+ HashMod when HashMod == ?DEFAULT_HASH_MOD ->
+ ?DEFAULT_HASH_MOD:del_frag(HashState);
+ HashMod ->
+ HashMod:del_frag(HashState)
+ end,
+ N = FH#frag_state.n_fragments,
+ FromFrags2 = (catch lists:sort(FromFrags)),
+ UnionFrags = (catch lists:merge(FromFrags2, lists:sort(AdditionalWriteFrags))),
+ VerifyFun = fun(F) when integer(F), F >= 1, F =< N -> false;
+ (_F) -> true
+ end,
+ case catch lists:filter(VerifyFun, UnionFrags) of
+ [] ->
+ case lists:member(N, FromFrags2) of
+ true ->
+ FH2 = FH#frag_state{n_fragments = N - 1,
+ hash_state = HashState2},
+ {FH2, FromFrags2, UnionFrags};
+ false ->
+ mnesia:abort({"del_frag: Last fragment number not included", N})
+ end;
+ BadFrags ->
+ mnesia:abort({"del_frag: Fragment numbers out of range",
+ BadFrags, {range, 1, N}})
+ end.
+
+merge(Tab, FH, [FromN | FromNs], FragNames, Ops) ->
+ FromFrag = element(FromN, FragNames),
+ Pat = mnesia:table_info(FromFrag, wild_pattern),
+ {_Mod, Tid, Ts} = mnesia_schema:get_tid_ts_and_lock(Tab, none),
+ Recs = mnesia:match_object(Tid, Ts, FromFrag, Pat, read),
+ Ops2 = do_merge(FH, FromN, FragNames, Recs, Ops),
+ merge(Tab, FH, FromNs, FragNames, Ops2);
+merge(_Tab, _FH, [], _FragNames, Ops) ->
+ Ops.
+
+%% Perform the merge of the table
+do_merge(FH, OldN, FragNames, [Rec | Recs], Ops) ->
+ Pos = key_pos(FH),
+ LastN = FH#frag_state.n_fragments + 1,
+ HashKey = element(Pos, Rec),
+ case key_to_n(FH, HashKey) of
+ NewN when NewN == LastN ->
+ %% Tried to leave a record in the fragment that is to be deleted
+ mnesia:abort({"del_frag: Fragment number out of range",
+ NewN, {range, 1, LastN}});
+ NewN when NewN == OldN ->
+ %% Keep record in the same fragment. No need to move it.
+ do_merge(FH, OldN, FragNames, Recs, Ops);
+ NewN when OldN == LastN ->
+ %% Move record from the fragment that is to be deleted
+ %% No need to create a delete op for each record.
+ case element(NewN, FragNames) of
+ NewFrag when NewFrag /= undefined ->
+ Key = element(2, Rec),
+ NewOid = {NewFrag, Key},
+ Ops2 = [{op, rec, unknown, {NewOid, [Rec], write}} | Ops],
+ do_merge(FH, OldN, FragNames, Recs, Ops2);
+ _NewFrag ->
+ %% Tried to move record to fragment that not is locked
+ mnesia:abort({"del_frag: Fragment not locked", NewN})
+ end;
+ NewN ->
+ case element(NewN, FragNames) of
+ NewFrag when NewFrag /= undefined ->
+ OldFrag = element(OldN, FragNames),
+ Key = element(2, Rec),
+ NewOid = {NewFrag, Key},
+ OldOid = {OldFrag, Key},
+ Ops2 = [{op, rec, unknown, {NewOid, [Rec], write}},
+ {op, rec, unknown, {OldOid, [OldOid], delete}} | Ops],
+ do_merge(FH, OldN, FragNames, Recs, Ops2);
+ _NewFrag ->
+ %% Tried to move record to fragment that not is locked
+ mnesia:abort({"del_frag: Fragment not locked", NewN})
+ end
+ end;
+ do_merge(_FH, _OldN, _FragNames, [], Ops) ->
+ Ops.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Add a node to the node pool of a fragmented table
+
+make_multi_add_node(Tab, Node) ->
+ verify_multi(Tab),
+ Ops = make_add_node(Tab, Node),
+
+ %% Propagate to foreigners
+ MoreOps = [make_add_node(T, Node) || T <- lookup_foreigners(Tab)],
+ [Ops | MoreOps].
+
+make_add_node(Tab, Node) when atom(Node) ->
+ Pool = lookup_prop(Tab, node_pool),
+ case lists:member(Node, Pool) of
+ false ->
+ Cs = mnesia_schema:incr_version(val({Tab, cstruct})),
+ Pool2 = Pool ++ [Node],
+ Props = Cs#cstruct.frag_properties,
+ Props2 = lists:keyreplace(node_pool, 1, Props, {node_pool, Pool2}),
+ Cs2 = Cs#cstruct{frag_properties = Props2},
+ TabDef = mnesia_schema:cs2list(Cs2),
+ Op = {op, change_table_frag, {add_node, Node}, TabDef},
+ [Op];
+ true ->
+ mnesia:abort({already_exists, Tab, Node})
+ end;
+make_add_node(Tab, Node) ->
+ mnesia:abort({bad_type, Tab, Node}).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Delet a node from the node pool of a fragmented table
+
+make_multi_del_node(Tab, Node) ->
+ verify_multi(Tab),
+ Ops = make_del_node(Tab, Node),
+
+ %% Propagate to foreigners
+ MoreOps = [make_del_node(T, Node) || T <- lookup_foreigners(Tab)],
+ [Ops | MoreOps].
+
+make_del_node(Tab, Node) when atom(Node) ->
+ Cs = mnesia_schema:incr_version(val({Tab, cstruct})),
+ mnesia_schema:ensure_active(Cs),
+ Pool = lookup_prop(Tab, node_pool),
+ case lists:member(Node, Pool) of
+ true ->
+ Pool2 = Pool -- [Node],
+ Props = lists:keyreplace(node_pool, 1, Cs#cstruct.frag_properties, {node_pool, Pool2}),
+ Cs2 = Cs#cstruct{frag_properties = Props},
+ TabDef = mnesia_schema:cs2list(Cs2),
+ Op = {op, change_table_frag, {del_node, Node}, TabDef},
+ [Op];
+ false ->
+ mnesia:abort({no_exists, Tab, Node})
+ end;
+make_del_node(Tab, Node) ->
+ mnesia:abort({bad_type, Tab, Node}).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Special case used to remove all references to a node during
+%% mnesia:del_table_copy(schema, Node)
+
+remove_node(Node, Cs) ->
+ Tab = Cs#cstruct.name,
+ case is_top_frag(Tab) of
+ false ->
+ {Cs, false};
+ true ->
+ Pool = lookup_prop(Tab, node_pool),
+ case lists:member(Node, Pool) of
+ true ->
+ Pool2 = Pool -- [Node],
+ Props = lists:keyreplace(node_pool, 1,
+ Cs#cstruct.frag_properties,
+ {node_pool, Pool2}),
+ {Cs#cstruct{frag_properties = Props}, true};
+ false ->
+ {Cs, false}
+ end
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Helpers
+
+val(Var) ->
+ case ?catch_val(Var) of
+ {'EXIT', Reason} -> mnesia_lib:other_val(Var, Reason);
+ Value -> Value
+ end.
+
+set_frag_hash(Tab, Props) ->
+ case props_to_frag_hash(Tab, Props) of
+ FH when record(FH, frag_state) ->
+ mnesia_lib:set({Tab, frag_hash}, FH);
+ no_hash ->
+ mnesia_lib:unset({Tab, frag_hash})
+ end.
+
+props_to_frag_hash(_Tab, []) ->
+ no_hash;
+props_to_frag_hash(Tab, Props) ->
+ case mnesia_schema:pick(Tab, base_table, Props, undefined) of
+ T when T == Tab ->
+ Foreign = mnesia_schema:pick(Tab, foreign_key, Props, must),
+ N = mnesia_schema:pick(Tab, n_fragments, Props, must),
+
+ case mnesia_schema:pick(Tab, hash_module, Props, undefined) of
+ undefined ->
+ Split = mnesia_schema:pick(Tab, next_n_to_split, Props, must),
+ Doubles = mnesia_schema:pick(Tab, n_doubles, Props, must),
+ FH = {frag_hash, Foreign, N, Split, Doubles},
+ HashState = ?OLD_HASH_MOD:init_state(Tab, FH),
+ #frag_state{foreign_key = Foreign,
+ n_fragments = N,
+ hash_module = ?OLD_HASH_MOD,
+ hash_state = HashState};
+ HashMod ->
+ HashState = mnesia_schema:pick(Tab, hash_state, Props, must),
+ #frag_state{foreign_key = Foreign,
+ n_fragments = N,
+ hash_module = HashMod,
+ hash_state = HashState}
+ %% Old style. Kept for backwards compatibility.
+ end;
+ _ ->
+ no_hash
+ end.
+
+lookup_prop(Tab, Prop) ->
+ Props = val({Tab, frag_properties}),
+ case lists:keysearch(Prop, 1, Props) of
+ {value, {Prop, Val}} ->
+ Val;
+ false ->
+ mnesia:abort({no_exists, Tab, Prop, {frag_properties, Props}})
+ end.
+
+lookup_frag_hash(Tab) ->
+ case ?catch_val({Tab, frag_hash}) of
+ FH when record(FH, frag_state) ->
+ FH;
+ {frag_hash, K, N, _S, _D} = FH ->
+ %% Old style. Kept for backwards compatibility.
+ HashState = ?OLD_HASH_MOD:init_state(Tab, FH),
+ #frag_state{foreign_key = K,
+ n_fragments = N,
+ hash_module = ?OLD_HASH_MOD,
+ hash_state = HashState};
+ {'EXIT', _} ->
+ mnesia:abort({no_exists, Tab, frag_properties, frag_hash})
+ end.
+
+is_top_frag(Tab) ->
+ case ?catch_val({Tab, frag_hash}) of
+ {'EXIT', _} ->
+ false;
+ _ ->
+ [] == lookup_foreigners(Tab)
+ end.
+
+%% Returns a list of tables
+lookup_foreigners(Tab) ->
+ %% First field in HashPat is either frag_hash or frag_state
+ HashPat = {'_', {Tab, '_'}, '_', '_', '_'},
+ [T || [T] <- ?ets_match(mnesia_gvar, {{'$1', frag_hash}, HashPat})].
+
+%% Returns name of fragment table
+record_to_frag_name(Tab, Rec) ->
+ case ?catch_val({Tab, frag_hash}) of
+ {'EXIT', _} ->
+ Tab;
+ FH ->
+ Pos = key_pos(FH),
+ Key = element(Pos, Rec),
+ N = key_to_n(FH, Key),
+ n_to_frag_name(Tab, N)
+ end.
+
+key_pos(FH) ->
+ case FH#frag_state.foreign_key of
+ undefined ->
+ 2;
+ {_ForeignTab, Pos} ->
+ Pos
+ end.
+
+%% Returns name of fragment table
+key_to_frag_name({BaseTab, _} = Tab, Key) ->
+ N = key_to_frag_number(Tab, Key),
+ n_to_frag_name(BaseTab, N);
+key_to_frag_name(Tab, Key) ->
+ N = key_to_frag_number(Tab, Key),
+ n_to_frag_name(Tab, N).
+
+%% Returns name of fragment table
+n_to_frag_name(Tab, 1) ->
+ Tab;
+n_to_frag_name(Tab, N) when atom(Tab), integer(N) ->
+ list_to_atom(atom_to_list(Tab) ++ "_frag" ++ integer_to_list(N));
+n_to_frag_name(Tab, N) ->
+ mnesia:abort({bad_type, Tab, N}).
+
+%% Returns name of fragment table
+key_to_frag_number({Tab, ForeignKey}, _Key) ->
+ FH = val({Tab, frag_hash}),
+ case FH#frag_state.foreign_key of
+ {_ForeignTab, _Pos} ->
+ key_to_n(FH, ForeignKey);
+ undefined ->
+ mnesia:abort({combine_error, Tab, frag_properties,
+ {foreign_key, undefined}})
+ end;
+key_to_frag_number(Tab, Key) ->
+ case ?catch_val({Tab, frag_hash}) of
+ {'EXIT', _} ->
+ 1;
+ FH ->
+ key_to_n(FH, Key)
+ end.
+
+%% Returns fragment number
+key_to_n(FH, Key) ->
+ HashState = FH#frag_state.hash_state,
+ N =
+ case FH#frag_state.hash_module of
+ HashMod when HashMod == ?DEFAULT_HASH_MOD ->
+ ?DEFAULT_HASH_MOD:key_to_frag_number(HashState, Key);
+ HashMod ->
+ HashMod:key_to_frag_number(HashState, Key)
+ end,
+ if
+ integer(N), N >= 1, N =< FH#frag_state.n_fragments ->
+ N;
+ true ->
+ mnesia:abort({"key_to_frag_number: Fragment number out of range",
+ N, {range, 1, FH#frag_state.n_fragments}})
+ end.
+
+%% Returns a list of frament table names
+frag_names(Tab) ->
+ case ?catch_val({Tab, frag_hash}) of
+ {'EXIT', _} ->
+ [Tab];
+ FH ->
+ N = FH#frag_state.n_fragments,
+ frag_names(Tab, N, [])
+ end.
+
+frag_names(Tab, 1, Acc) ->
+ [Tab | Acc];
+frag_names(Tab, N, Acc) ->
+ Frag = n_to_frag_name(Tab, N),
+ frag_names(Tab, N - 1, [Frag | Acc]).
+
+%% Returns a list of {Node, FragCount} tuples
+%% sorted on FragCounts
+frag_dist(Tab) ->
+ Pool = lookup_prop(Tab, node_pool),
+ Dist = [{good, Node, 0} || Node <- Pool],
+ Dist2 = count_frag(frag_names(Tab), Dist),
+ sort_dist(Dist2).
+
+count_frag([Frag | Frags], Dist) ->
+ Dist2 = incr_nodes(val({Frag, ram_copies}), Dist),
+ Dist3 = incr_nodes(val({Frag, disc_copies}), Dist2),
+ Dist4 = incr_nodes(val({Frag, disc_only_copies}), Dist3),
+ count_frag(Frags, Dist4);
+count_frag([], Dist) ->
+ Dist.
+
+incr_nodes([Node | Nodes], Dist) ->
+ Dist2 = incr_node(Node, Dist),
+ incr_nodes(Nodes, Dist2);
+incr_nodes([], Dist) ->
+ Dist.
+
+incr_node(Node, [{Kind, Node, Count} | Tail]) ->
+ [{Kind, Node, Count + 1} | Tail];
+incr_node(Node, [Head | Tail]) ->
+ [Head | incr_node(Node, Tail)];
+incr_node(Node, []) ->
+ [{bad, Node, 1}].
+
+%% Sorts dist according in decreasing count order
+sort_dist(Dist) ->
+ Dist2 = deep_dist(Dist, []),
+ Dist3 = lists:keysort(1, Dist2),
+ shallow_dist(Dist3).
+
+deep_dist([Head | Tail], Deep) ->
+ {Kind, _Node, Count} = Head,
+ {Tag, Same, Other} = pick_count(Kind, Count, [Head | Tail]),
+ deep_dist(Other, [{Tag, Same} | Deep]);
+deep_dist([], Deep) ->
+ Deep.
+
+pick_count(Kind, Count, [{Kind2, Node2, Count2} | Tail]) ->
+ Head = {Node2, Count2},
+ {_, Same, Other} = pick_count(Kind, Count, Tail),
+ if
+ Kind == bad ->
+ {bad, [Head | Same], Other};
+ Kind2 == bad ->
+ {Count, Same, [{Kind2, Node2, Count2} | Other]};
+ Count == Count2 ->
+ {Count, [Head | Same], Other};
+ true ->
+ {Count, Same, [{Kind2, Node2, Count2} | Other]}
+ end;
+pick_count(_Kind, Count, []) ->
+ {Count, [], []}.
+
+shallow_dist([{_Tag, Shallow} | Deep]) ->
+ Shallow ++ shallow_dist(Deep);
+shallow_dist([]) ->
+ [].
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_frag_hash.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_frag_hash.erl
new file mode 100644
index 0000000000..591f2ce9c8
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_frag_hash.erl
@@ -0,0 +1,118 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_frag_hash.erl,v 1.1 2008/12/17 09:53:38 mikpe Exp $
+%%
+%%%----------------------------------------------------------------------
+%%% Purpose : Implements hashing functionality for fragmented tables
+%%%----------------------------------------------------------------------
+
+%header_doc_include
+-module(mnesia_frag_hash).
+-behaviour(mnesia_frag_hash).
+
+%% Fragmented Table Hashing callback functions
+-export([
+ init_state/2,
+ add_frag/1,
+ del_frag/1,
+ key_to_frag_number/2,
+ match_spec_to_frag_numbers/2
+ ]).
+
+%header_doc_include
+
+%impl_doc_include
+-record(hash_state, {n_fragments, next_n_to_split, n_doubles}).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+init_state(_Tab, State) when State == undefined ->
+ #hash_state{n_fragments = 1,
+ next_n_to_split = 1,
+ n_doubles = 0}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+add_frag(State) when record(State, hash_state) ->
+ SplitN = State#hash_state.next_n_to_split,
+ P = SplitN + 1,
+ L = State#hash_state.n_doubles,
+ NewN = State#hash_state.n_fragments + 1,
+ State2 = case trunc(math:pow(2, L)) + 1 of
+ P2 when P2 == P ->
+ State#hash_state{n_fragments = NewN,
+ n_doubles = L + 1,
+ next_n_to_split = 1};
+ _ ->
+ State#hash_state{n_fragments = NewN,
+ next_n_to_split = P}
+ end,
+ {State2, [SplitN], [NewN]}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+del_frag(State) when record(State, hash_state) ->
+ P = State#hash_state.next_n_to_split - 1,
+ L = State#hash_state.n_doubles,
+ N = State#hash_state.n_fragments,
+ if
+ P < 1 ->
+ L2 = L - 1,
+ MergeN = trunc(math:pow(2, L2)),
+ State2 = State#hash_state{n_fragments = N - 1,
+ next_n_to_split = MergeN,
+ n_doubles = L2},
+ {State2, [N], [MergeN]};
+ true ->
+ MergeN = P,
+ State2 = State#hash_state{n_fragments = N - 1,
+ next_n_to_split = MergeN},
+ {State2, [N], [MergeN]}
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+key_to_frag_number(State, Key) when record(State, hash_state) ->
+ L = State#hash_state.n_doubles,
+ A = erlang:phash(Key, trunc(math:pow(2, L))),
+ P = State#hash_state.next_n_to_split,
+ if
+ A < P ->
+ erlang:phash(Key, trunc(math:pow(2, L + 1)));
+ true ->
+ A
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+match_spec_to_frag_numbers(State, MatchSpec) when record(State, hash_state) ->
+ case MatchSpec of
+ [{HeadPat, _, _}] when tuple(HeadPat), size(HeadPat) > 2 ->
+ KeyPat = element(2, HeadPat),
+ case has_var(KeyPat) of
+ false ->
+ [key_to_frag_number(State, KeyPat)];
+ true ->
+ lists:seq(1, State#hash_state.n_fragments)
+ end;
+ _ ->
+ lists:seq(1, State#hash_state.n_fragments)
+ end.
+
+%impl_doc_include
+
+has_var(Pat) ->
+ mnesia:has_var(Pat).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_frag_old_hash.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_frag_old_hash.erl
new file mode 100644
index 0000000000..8dc128a42e
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_frag_old_hash.erl
@@ -0,0 +1,127 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_frag_old_hash.erl,v 1.1 2008/12/17 09:53:38 mikpe Exp $
+%%
+%%%----------------------------------------------------------------------
+%%% Purpose : Implements hashing functionality for fragmented tables
+%%%----------------------------------------------------------------------
+
+-module(mnesia_frag_old_hash).
+-behaviour(mnesia_frag_hash).
+
+%% Hashing callback functions
+-export([
+ init_state/2,
+ add_frag/1,
+ del_frag/1,
+ key_to_frag_number/2,
+ match_spec_to_frag_numbers/2
+ ]).
+
+-record(old_hash_state,
+ {n_fragments,
+ next_n_to_split,
+ n_doubles}).
+
+%% Old style. Kept for backwards compatibility.
+-record(frag_hash,
+ {foreign_key,
+ n_fragments,
+ next_n_to_split,
+ n_doubles}).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+init_state(_Tab, InitialState) when InitialState == undefined ->
+ #old_hash_state{n_fragments = 1,
+ next_n_to_split = 1,
+ n_doubles = 0};
+init_state(_Tab, FH) when record(FH, frag_hash) ->
+ %% Old style. Kept for backwards compatibility.
+ #old_hash_state{n_fragments = FH#frag_hash.n_fragments,
+ next_n_to_split = FH#frag_hash.next_n_to_split,
+ n_doubles = FH#frag_hash.n_doubles}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+add_frag(State) when record(State, old_hash_state) ->
+ SplitN = State#old_hash_state.next_n_to_split,
+ P = SplitN + 1,
+ L = State#old_hash_state.n_doubles,
+ NewN = State#old_hash_state.n_fragments + 1,
+ State2 = case trunc(math:pow(2, L)) + 1 of
+ P2 when P2 == P ->
+ State#old_hash_state{n_fragments = NewN,
+ next_n_to_split = 1,
+ n_doubles = L + 1};
+ _ ->
+ State#old_hash_state{n_fragments = NewN,
+ next_n_to_split = P}
+ end,
+ {State2, [SplitN], [NewN]}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+del_frag(State) when record(State, old_hash_state) ->
+ P = State#old_hash_state.next_n_to_split - 1,
+ L = State#old_hash_state.n_doubles,
+ N = State#old_hash_state.n_fragments,
+ if
+ P < 1 ->
+ L2 = L - 1,
+ MergeN = trunc(math:pow(2, L2)),
+ State2 = State#old_hash_state{n_fragments = N - 1,
+ next_n_to_split = MergeN,
+ n_doubles = L2},
+ {State2, [N], [MergeN]};
+ true ->
+ MergeN = P,
+ State2 = State#old_hash_state{n_fragments = N - 1,
+ next_n_to_split = MergeN},
+ {State2, [N], [MergeN]}
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+key_to_frag_number(State, Key) when record(State, old_hash_state) ->
+ L = State#old_hash_state.n_doubles,
+ A = erlang:hash(Key, trunc(math:pow(2, L))),
+ P = State#old_hash_state.next_n_to_split,
+ if
+ A < P ->
+ erlang:hash(Key, trunc(math:pow(2, L + 1)));
+ true ->
+ A
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+match_spec_to_frag_numbers(State, MatchSpec) when record(State, old_hash_state) ->
+ case MatchSpec of
+ [{HeadPat, _, _}] when tuple(HeadPat), size(HeadPat) > 2 ->
+ KeyPat = element(2, HeadPat),
+ case has_var(KeyPat) of
+ false ->
+ [key_to_frag_number(State, KeyPat)];
+ true ->
+ lists:seq(1, State#old_hash_state.n_fragments)
+ end;
+ _ ->
+ lists:seq(1, State#old_hash_state.n_fragments)
+ end.
+
+has_var(Pat) ->
+ mnesia:has_var(Pat).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_index.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_index.erl
new file mode 100644
index 0000000000..650a2d1d3c
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_index.erl
@@ -0,0 +1,379 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_index.erl,v 1.1 2008/12/17 09:53:38 mikpe Exp $
+%%
+%% Purpose: Handles index functionality in mnesia
+
+-module(mnesia_index).
+-export([read/5,
+ add_index/5,
+ delete_index/3,
+ del_object_index/5,
+ clear_index/4,
+ dirty_match_object/3,
+ dirty_select/3,
+ dirty_read/3,
+ dirty_read2/3,
+
+ db_put/2,
+ db_get/2,
+ db_match_erase/2,
+ get_index_table/2,
+ get_index_table/3,
+
+ tab2filename/2,
+ tab2tmp_filename/2,
+ init_index/2,
+ init_indecies/3,
+ del_transient/2,
+ del_transient/3,
+ del_index_table/3]).
+
+-import(mnesia_lib, [verbose/2]).
+-include("mnesia.hrl").
+
+-record(index, {setorbag, pos_list}).
+
+val(Var) ->
+ case ?catch_val(Var) of
+ {'EXIT', _ReASoN_} -> mnesia_lib:other_val(Var, _ReASoN_);
+ _VaLuE_ -> _VaLuE_
+ end.
+
+%% read an object list throuh its index table
+%% we assume that table Tab has index on attribute number Pos
+
+read(Tid, Store, Tab, IxKey, Pos) ->
+ ResList = mnesia_locker:ixrlock(Tid, Store, Tab, IxKey, Pos),
+ %% Remove all tuples which don't include Ixkey, happens when Tab is a bag
+ case val({Tab, setorbag}) of
+ bag ->
+ mnesia_lib:key_search_all(IxKey, Pos, ResList);
+ _ ->
+ ResList
+ end.
+
+add_index(Index, Tab, Key, Obj, Old) ->
+ add_index2(Index#index.pos_list, Index#index.setorbag, Tab, Key, Obj, Old).
+
+add_index2([{Pos, Ixt} |Tail], bag, Tab, K, Obj, OldRecs) ->
+ db_put(Ixt, {element(Pos, Obj), K}),
+ add_index2(Tail, bag, Tab, K, Obj, OldRecs);
+add_index2([{Pos, Ixt} |Tail], Type, Tab, K, Obj, OldRecs) ->
+ %% Remove old tuples in index if Tab is updated
+ case OldRecs of
+ undefined ->
+ Old = mnesia_lib:db_get(Tab, K),
+ del_ixes(Ixt, Old, Pos, K);
+ Old ->
+ del_ixes(Ixt, Old, Pos, K)
+ end,
+ db_put(Ixt, {element(Pos, Obj), K}),
+ add_index2(Tail, Type, Tab, K, Obj, OldRecs);
+add_index2([], _, _Tab, _K, _Obj, _) -> ok.
+
+delete_index(Index, Tab, K) ->
+ delete_index2(Index#index.pos_list, Tab, K).
+
+delete_index2([{Pos, Ixt} | Tail], Tab, K) ->
+ DelObjs = mnesia_lib:db_get(Tab, K),
+ del_ixes(Ixt, DelObjs, Pos, K),
+ delete_index2(Tail, Tab, K);
+delete_index2([], _Tab, _K) -> ok.
+
+
+del_ixes(_Ixt, [], _Pos, _L) -> ok;
+del_ixes(Ixt, [Obj | Tail], Pos, Key) ->
+ db_match_erase(Ixt, {element(Pos, Obj), Key}),
+ del_ixes(Ixt, Tail, Pos, Key).
+
+del_object_index(Index, Tab, K, Obj, Old) ->
+ del_object_index2(Index#index.pos_list, Index#index.setorbag, Tab, K, Obj, Old).
+
+del_object_index2([], _, _Tab, _K, _Obj, _Old) -> ok;
+del_object_index2([{Pos, Ixt} | Tail], SoB, Tab, K, Obj, Old) ->
+ case SoB of
+ bag ->
+ del_object_bag(Tab, K, Obj, Pos, Ixt, Old);
+ _ -> %% If set remove the tuple in index table
+ del_ixes(Ixt, [Obj], Pos, K)
+ end,
+ del_object_index2(Tail, SoB, Tab, K, Obj, Old).
+
+del_object_bag(Tab, Key, Obj, Pos, Ixt, undefined) ->
+ Old = mnesia_lib:db_get(Tab, Key),
+ del_object_bag(Tab, Key, Obj, Pos, Ixt, Old);
+%% If Tab type is bag we need remove index identifier if Tab
+%% contains less than 2 elements.
+del_object_bag(_Tab, Key, Obj, Pos, Ixt, Old) when length(Old) < 2 ->
+ del_ixes(Ixt, [Obj], Pos, Key);
+del_object_bag(_Tab, _Key, _Obj, _Pos, _Ixt, _Old) -> ok.
+
+clear_index(Index, Tab, K, Obj) ->
+ clear_index2(Index#index.pos_list, Tab, K, Obj).
+
+clear_index2([], _Tab, _K, _Obj) -> ok;
+clear_index2([{_Pos, Ixt} | Tail], Tab, K, Obj) ->
+ db_match_erase(Ixt, Obj),
+ clear_index2(Tail, Tab, K, Obj).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+dirty_match_object(Tab, Pat, Pos) ->
+ %% Assume that we are on the node where the replica is
+ case element(2, Pat) of
+ '_' ->
+ IxKey = element(Pos, Pat),
+ RealKeys = realkeys(Tab, Pos, IxKey),
+ merge(RealKeys, Tab, Pat, []);
+ _Else ->
+ mnesia_lib:db_match_object(Tab, Pat)
+ end.
+
+merge([{_IxKey, RealKey} | Tail], Tab, Pat, Ack) ->
+ %% Assume that we are on the node where the replica is
+ Pat2 = setelement(2, Pat, RealKey),
+ Recs = mnesia_lib:db_match_object(Tab, Pat2),
+ merge(Tail, Tab, Pat, Recs ++ Ack);
+merge([], _, _, Ack) ->
+ Ack.
+
+realkeys(Tab, Pos, IxKey) ->
+ Index = get_index_table(Tab, Pos),
+ db_get(Index, IxKey). % a list on the form [{IxKey, RealKey1} , ....
+
+dirty_select(Tab, Spec, Pos) ->
+ %% Assume that we are on the node where the replica is
+ %% Returns the records without applying the match spec
+ %% The actual filtering is handled by the caller
+ IxKey = element(Pos, Spec),
+ RealKeys = realkeys(Tab, Pos, IxKey),
+ StorageType = val({Tab, storage_type}),
+ lists:append([mnesia_lib:db_get(StorageType, Tab, Key) || Key <- RealKeys]).
+
+dirty_read(Tab, IxKey, Pos) ->
+ ResList = mnesia:dirty_rpc(Tab, ?MODULE, dirty_read2,
+ [Tab, IxKey, Pos]),
+ case val({Tab, setorbag}) of
+ bag ->
+ %% Remove all tuples which don't include Ixkey
+ mnesia_lib:key_search_all(IxKey, Pos, ResList);
+ _ ->
+ ResList
+ end.
+
+dirty_read2(Tab, IxKey, Pos) ->
+ Ix = get_index_table(Tab, Pos),
+ Keys = db_match(Ix, {IxKey, '$1'}),
+ r_keys(Keys, Tab, []).
+
+r_keys([[H]|T],Tab,Ack) ->
+ V = mnesia_lib:db_get(Tab, H),
+ r_keys(T, Tab, V ++ Ack);
+r_keys([], _, Ack) ->
+ Ack.
+
+
+%%%%%%% Creation, Init and deletion routines for index tables
+%% We can have several indexes on the same table
+%% this can be a fairly costly operation if table is *very* large
+
+tab2filename(Tab, Pos) ->
+ mnesia_lib:dir(Tab) ++ "_" ++ integer_to_list(Pos) ++ ".DAT".
+
+tab2tmp_filename(Tab, Pos) ->
+ mnesia_lib:dir(Tab) ++ "_" ++ integer_to_list(Pos) ++ ".TMP".
+
+init_index(Tab, Storage) ->
+ PosList = val({Tab, index}),
+ init_indecies(Tab, Storage, PosList).
+
+init_indecies(Tab, Storage, PosList) ->
+ case Storage of
+ unknown ->
+ ignore;
+ disc_only_copies ->
+ init_disc_index(Tab, PosList);
+ ram_copies ->
+ make_ram_index(Tab, PosList);
+ disc_copies ->
+ make_ram_index(Tab, PosList)
+ end.
+
+%% works for both ram and disc indexes
+
+del_index_table(_, unknown, _) ->
+ ignore;
+del_index_table(Tab, Storage, Pos) ->
+ delete_transient_index(Tab, Pos, Storage),
+ mnesia_lib:del({Tab, index}, Pos).
+
+del_transient(Tab, Storage) ->
+ PosList = val({Tab, index}),
+ del_transient(Tab, PosList, Storage).
+
+del_transient(_, [], _) -> done;
+del_transient(Tab, [Pos | Tail], Storage) ->
+ delete_transient_index(Tab, Pos, Storage),
+ del_transient(Tab, Tail, Storage).
+
+delete_transient_index(Tab, Pos, disc_only_copies) ->
+ Tag = {Tab, index, Pos},
+ mnesia_monitor:unsafe_close_dets(Tag),
+ file:delete(tab2filename(Tab, Pos)),
+ del_index_info(Tab, Pos), %% Uses val(..)
+ mnesia_lib:unset({Tab, {index, Pos}});
+
+delete_transient_index(Tab, Pos, _Storage) ->
+ Ixt = val({Tab, {index, Pos}}),
+ ?ets_delete_table(Ixt),
+ del_index_info(Tab, Pos),
+ mnesia_lib:unset({Tab, {index, Pos}}).
+
+%%%%% misc functions for the index create/init/delete functions above
+
+%% assuming that the file exists.
+init_disc_index(_Tab, []) ->
+ done;
+init_disc_index(Tab, [Pos | Tail]) when integer(Pos) ->
+ Fn = tab2filename(Tab, Pos),
+ IxTag = {Tab, index, Pos},
+ file:delete(Fn),
+ Args = [{file, Fn}, {keypos, 1}, {type, bag}],
+ mnesia_monitor:open_dets(IxTag, Args),
+ Storage = disc_only_copies,
+ Key = mnesia_lib:db_first(Storage, Tab),
+ Recs = mnesia_lib:db_get(Storage, Tab, Key),
+ BinSize = size(term_to_binary(Recs)),
+ KeysPerChunk = (4000 div BinSize) + 1,
+ Init = {start, KeysPerChunk},
+ mnesia_lib:db_fixtable(Storage, Tab, true),
+ ok = dets:init_table(IxTag, create_fun(Init, Tab, Pos)),
+ mnesia_lib:db_fixtable(Storage, Tab, false),
+ mnesia_lib:set({Tab, {index, Pos}}, IxTag),
+ add_index_info(Tab, val({Tab, setorbag}), {Pos, {dets, IxTag}}),
+ init_disc_index(Tab, Tail).
+
+create_fun(Cont, Tab, Pos) ->
+ fun(read) ->
+ Data =
+ case Cont of
+ {start, KeysPerChunk} ->
+ mnesia_lib:db_init_chunk(disc_only_copies, Tab, KeysPerChunk);
+ '$end_of_table' ->
+ '$end_of_table';
+ _Else ->
+ mnesia_lib:db_chunk(disc_only_copies, Cont)
+ end,
+ case Data of
+ '$end_of_table' ->
+ end_of_input;
+ {Recs, Next} ->
+ IdxElems = [{element(Pos, Obj), element(2, Obj)} || Obj <- Recs],
+ {IdxElems, create_fun(Next, Tab, Pos)}
+ end;
+ (close) ->
+ ok
+ end.
+
+make_ram_index(_, []) ->
+ done;
+make_ram_index(Tab, [Pos | Tail]) ->
+ add_ram_index(Tab, Pos),
+ make_ram_index(Tab, Tail).
+
+add_ram_index(Tab, Pos) when integer(Pos) ->
+ verbose("Creating index for ~w ~n", [Tab]),
+ Index = mnesia_monitor:mktab(mnesia_index, [bag, public]),
+ Insert = fun(Rec, _Acc) ->
+ true = ?ets_insert(Index, {element(Pos, Rec), element(2, Rec)})
+ end,
+ mnesia_lib:db_fixtable(ram_copies, Tab, true),
+ true = ets:foldl(Insert, true, Tab),
+ mnesia_lib:db_fixtable(ram_copies, Tab, false),
+ mnesia_lib:set({Tab, {index, Pos}}, Index),
+ add_index_info(Tab, val({Tab, setorbag}), {Pos, {ram, Index}});
+add_ram_index(_Tab, snmp) ->
+ ok.
+
+add_index_info(Tab, Type, IxElem) ->
+ Commit = val({Tab, commit_work}),
+ case lists:keysearch(index, 1, Commit) of
+ false ->
+ Index = #index{setorbag = Type,
+ pos_list = [IxElem]},
+ %% Check later if mnesia_tm is sensative about the order
+ mnesia_lib:set({Tab, commit_work},
+ mnesia_lib:sort_commit([Index | Commit]));
+ {value, Old} ->
+ %% We could check for consistency here
+ Index = Old#index{pos_list = [IxElem | Old#index.pos_list]},
+ NewC = lists:keyreplace(index, 1, Commit, Index),
+ mnesia_lib:set({Tab, commit_work},
+ mnesia_lib:sort_commit(NewC))
+ end.
+
+del_index_info(Tab, Pos) ->
+ Commit = val({Tab, commit_work}),
+ case lists:keysearch(index, 1, Commit) of
+ false ->
+ %% Something is wrong ignore
+ skip;
+ {value, Old} ->
+ case lists:keydelete(Pos, 1, Old#index.pos_list) of
+ [] ->
+ NewC = lists:keydelete(index, 1, Commit),
+ mnesia_lib:set({Tab, commit_work},
+ mnesia_lib:sort_commit(NewC));
+ New ->
+ Index = Old#index{pos_list = New},
+ NewC = lists:keyreplace(index, 1, Commit, Index),
+ mnesia_lib:set({Tab, commit_work},
+ mnesia_lib:sort_commit(NewC))
+ end
+ end.
+
+db_put({ram, Ixt}, V) ->
+ true = ?ets_insert(Ixt, V);
+db_put({dets, Ixt}, V) ->
+ ok = dets:insert(Ixt, V).
+
+db_get({ram, Ixt}, K) ->
+ ?ets_lookup(Ixt, K);
+db_get({dets, Ixt}, K) ->
+ dets:lookup(Ixt, K).
+
+db_match_erase({ram, Ixt}, Pat) ->
+ true = ?ets_match_delete(Ixt, Pat);
+db_match_erase({dets, Ixt}, Pat) ->
+ ok = dets:match_delete(Ixt, Pat).
+
+db_match({ram, Ixt}, Pat) ->
+ ?ets_match(Ixt, Pat);
+db_match({dets, Ixt}, Pat) ->
+ dets:match(Ixt, Pat).
+
+get_index_table(Tab, Pos) ->
+ get_index_table(Tab, val({Tab, storage_type}), Pos).
+
+get_index_table(Tab, ram_copies, Pos) ->
+ {ram, val({Tab, {index, Pos}})};
+get_index_table(Tab, disc_copies, Pos) ->
+ {ram, val({Tab, {index, Pos}})};
+get_index_table(Tab, disc_only_copies, Pos) ->
+ {dets, val({Tab, {index, Pos}})};
+get_index_table(_Tab, unknown, _Pos) ->
+ unknown.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_kernel_sup.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_kernel_sup.erl
new file mode 100644
index 0000000000..015a42c749
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_kernel_sup.erl
@@ -0,0 +1,60 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_kernel_sup.erl,v 1.1 2008/12/17 09:53:38 mikpe Exp $
+%%
+-module(mnesia_kernel_sup).
+
+-behaviour(supervisor).
+
+-export([start/0, init/1, supervisor_timeout/1]).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% top supervisor callback functions
+
+start() ->
+ supervisor:start_link({local, mnesia_kernel_sup}, ?MODULE, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% sub supervisor callback functions
+
+init([]) ->
+ ProcLib = [mnesia_monitor, proc_lib],
+ Flags = {one_for_all, 0, timer:hours(24)}, % Trust the top supervisor
+ Workers = [worker_spec(mnesia_monitor, timer:seconds(3), [gen_server]),
+ worker_spec(mnesia_subscr, timer:seconds(3), [gen_server]),
+ worker_spec(mnesia_locker, timer:seconds(3), ProcLib),
+ worker_spec(mnesia_recover, timer:minutes(3), [gen_server]),
+ worker_spec(mnesia_tm, timer:seconds(30), ProcLib),
+ supervisor_spec(mnesia_checkpoint_sup),
+ supervisor_spec(mnesia_snmp_sup),
+ worker_spec(mnesia_controller, timer:seconds(3), [gen_server]),
+ worker_spec(mnesia_late_loader, timer:seconds(3), ProcLib)
+ ],
+ {ok, {Flags, Workers}}.
+
+worker_spec(Name, KillAfter, Modules) ->
+ KA = supervisor_timeout(KillAfter),
+ {Name, {Name, start, []}, permanent, KA, worker, [Name] ++ Modules}.
+
+supervisor_spec(Name) ->
+ {Name, {Name, start, []}, permanent, infinity, supervisor,
+ [Name, supervisor]}.
+
+-ifdef(debug_shutdown).
+supervisor_timeout(_KillAfter) -> timer:hours(24).
+-else.
+supervisor_timeout(KillAfter) -> KillAfter.
+-endif.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_late_loader.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_late_loader.erl
new file mode 100644
index 0000000000..b49cf22fd9
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_late_loader.erl
@@ -0,0 +1,95 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_late_loader.erl,v 1.1 2008/12/17 09:53:38 mikpe Exp $
+%%
+-module(mnesia_late_loader).
+
+-export([
+ async_late_disc_load/3,
+ maybe_async_late_disc_load/3,
+ init/1,
+ start/0
+ ]).
+
+%% sys callback functions
+-export([
+ system_continue/3,
+ system_terminate/4,
+ system_code_change/4
+ ]).
+
+-define(SERVER_NAME, ?MODULE).
+
+-record(state, {supervisor}).
+
+async_late_disc_load(Node, Tabs, Reason) ->
+ Msg = {async_late_disc_load, Tabs, Reason},
+ catch ({?SERVER_NAME, Node} ! {self(), Msg}).
+
+maybe_async_late_disc_load(Node, Tabs, Reason) ->
+ Msg = {maybe_async_late_disc_load, Tabs, Reason},
+ catch ({?SERVER_NAME, Node} ! {self(), Msg}).
+
+start() ->
+ mnesia_monitor:start_proc(?SERVER_NAME, ?MODULE, init, [self()]).
+
+init(Parent) ->
+ %% Trap exit omitted intentionally
+ register(?SERVER_NAME, self()),
+ link(whereis(mnesia_controller)), %% We may not hang
+ mnesia_controller:merge_schema(),
+ unlink(whereis(mnesia_controller)),
+ mnesia_lib:set(mnesia_status, running),
+ proc_lib:init_ack(Parent, {ok, self()}),
+ loop(#state{supervisor = Parent}).
+
+loop(State) ->
+ receive
+ {_From, {async_late_disc_load, Tabs, Reason}} ->
+ mnesia_controller:schedule_late_disc_load(Tabs, Reason),
+ loop(State);
+
+ {_From, {maybe_async_late_disc_load, Tabs, Reason}} ->
+ GoodTabs =
+ [T || T <- Tabs,
+ lists:member(node(),
+ mnesia_recover:get_master_nodes(T))],
+ mnesia_controller:schedule_late_disc_load(GoodTabs, Reason),
+ loop(State);
+
+ {system, From, Msg} ->
+ mnesia_lib:dbg_out("~p got {system, ~p, ~p}~n",
+ [?SERVER_NAME, From, Msg]),
+ Parent = State#state.supervisor,
+ sys:handle_system_msg(Msg, From, Parent, ?MODULE, [], State);
+
+ Msg ->
+ mnesia_lib:error("~p got unexpected message: ~p~n",
+ [?SERVER_NAME, Msg]),
+ loop(State)
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% System upgrade
+
+system_continue(_Parent, _Debug, State) ->
+ loop(State).
+
+system_terminate(Reason, _Parent, _Debug, _State) ->
+ exit(Reason).
+
+system_code_change(State, _Module, _OldVsn, _Extra) ->
+ {ok, State}.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_lib.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_lib.erl
new file mode 100644
index 0000000000..29a54936d4
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_lib.erl
@@ -0,0 +1,1276 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_lib.erl,v 1.3 2009/07/01 15:45:40 kostis Exp $
+%%
+%% This module contains all sorts of various which doesn't fit
+%% anywhere else. Basically everything is exported.
+
+-module(mnesia_lib).
+
+-include("mnesia.hrl").
+-include_lib("kernel/include/file.hrl").
+
+-export([core_file/0]).
+
+-export([
+ active_tables/0,
+ add/2,
+ add_list/2,
+ all_nodes/0,
+%% catch_val/1,
+ cleanup_tmp_files/1,
+ copy_file/2,
+ copy_holders/1,
+ coredump/0,
+ coredump/1,
+ create_counter/1,
+ cs_to_nodes/1,
+ cs_to_storage_type/2,
+ dets_to_ets/6,
+ db_chunk/2,
+ db_init_chunk/1,
+ db_init_chunk/2,
+ db_init_chunk/3,
+ db_erase/2,
+ db_erase/3,
+ db_erase_tab/1,
+ db_erase_tab/2,
+ db_first/1,
+ db_first/2,
+ db_last/1,
+ db_last/2,
+ db_fixtable/3,
+ db_get/2,
+ db_get/3,
+ db_match_erase/2,
+ db_match_erase/3,
+ db_match_object/2,
+ db_match_object/3,
+ db_next_key/2,
+ db_next_key/3,
+ db_prev_key/2,
+ db_prev_key/3,
+ db_put/2,
+ db_put/3,
+ db_select/2,
+ db_select/3,
+ db_slot/2,
+ db_slot/3,
+ db_update_counter/3,
+ db_update_counter/4,
+ dbg_out/2,
+ del/2,
+ dets_sync_close/1,
+ dets_sync_open/2,
+ dets_sync_open/3,
+ dir/0,
+ dir/1,
+ dir_info/0,
+ dirty_rpc_error_tag/1,
+ dist_coredump/0,
+ disk_type/1,
+ disk_type/2,
+ elems/2,
+ ensure_loaded/1,
+ error/2,
+ error_desc/1,
+ etype/1,
+ exists/1,
+ fatal/2,
+ get_node_number/0,
+ fix_error/1,
+ important/2,
+ incr_counter/1,
+ incr_counter/2,
+ intersect/2,
+ is_running/0,
+ is_running/1,
+ is_running_remote/0,
+ is_string/1,
+ key_search_delete/3,
+ key_search_all/3,
+ last_error/0,
+ local_active_tables/0,
+ lock_table/1,
+ mkcore/1,
+ not_active_here/1,
+ other_val/2,
+ pad_name/3,
+ random_time/2,
+ read_counter/1,
+ readable_indecies/1,
+ remote_copy_holders/1,
+ report_fatal/2,
+ report_system_event/1,
+ running_nodes/0,
+ running_nodes/1,
+ schema_cs_to_storage_type/2,
+ search_delete/2,
+ set/2,
+ set_counter/2,
+ set_local_content_whereabouts/1,
+ set_remote_where_to_read/1,
+ set_remote_where_to_read/2,
+ show/1,
+ show/2,
+ sort_commit/1,
+ storage_type_at_node/2,
+ swap_tmp_files/1,
+ tab2dat/1,
+ tab2dmp/1,
+ tab2tmp/1,
+ tab2dcd/1,
+ tab2dcl/1,
+ to_list/1,
+ union/2,
+ uniq/1,
+ unlock_table/1,
+ unset/1,
+ update_counter/2,
+ val/1,
+ vcore/0,
+ vcore/1,
+ verbose/2,
+ view/0,
+ view/1,
+ view/2,
+ warning/2,
+
+ is_debug_compiled/0,
+ activate_debug_fun/5,
+ deactivate_debug_fun/3,
+ eval_debug_fun/4,
+ scratch_debug_fun/0
+ ]).
+
+
+search_delete(Obj, List) ->
+ search_delete(Obj, List, [], none).
+search_delete(Obj, [Obj|Tail], Ack, _Res) ->
+ search_delete(Obj, Tail, Ack, Obj);
+search_delete(Obj, [H|T], Ack, Res) ->
+ search_delete(Obj, T, [H|Ack], Res);
+search_delete(_, [], Ack, Res) ->
+ {Res, Ack}.
+
+key_search_delete(Key, Pos, TupleList) ->
+ key_search_delete(Key, Pos, TupleList, none, []).
+key_search_delete(Key, Pos, [H|T], _Obj, Ack) when element(Pos, H) == Key ->
+ key_search_delete(Key, Pos, T, H, Ack);
+key_search_delete(Key, Pos, [H|T], Obj, Ack) ->
+ key_search_delete(Key, Pos, T, Obj, [H|Ack]);
+key_search_delete(_, _, [], Obj, Ack) ->
+ {Obj, Ack}.
+
+key_search_all(Key, Pos, TupleList) ->
+ key_search_all(Key, Pos, TupleList, []).
+key_search_all(Key, N, [H|T], Ack) when element(N, H) == Key ->
+ key_search_all(Key, N, T, [H|Ack]);
+key_search_all(Key, N, [_|T], Ack) ->
+ key_search_all(Key, N, T, Ack);
+key_search_all(_, _, [], Ack) -> Ack.
+
+intersect(L1, L2) ->
+ L2 -- (L2 -- L1).
+
+elems(I, [H|T]) ->
+ [element(I, H) | elems(I, T)];
+elems(_, []) ->
+ [].
+
+%% sort_commit see to that checkpoint info is always first in
+%% commit_work structure the other info don't need to be sorted.
+sort_commit(List) ->
+ sort_commit2(List, []).
+
+sort_commit2([{checkpoints, ChkpL}| Rest], Acc) ->
+ [{checkpoints, ChkpL}| Rest] ++ Acc;
+sort_commit2([H | R], Acc) ->
+ sort_commit2(R, [H | Acc]);
+sort_commit2([], Acc) -> Acc.
+
+is_string([H|T]) ->
+ if
+ 0 =< H, H < 256, integer(H) -> is_string(T);
+ true -> false
+ end;
+is_string([]) -> true.
+
+%%%
+
+union([H|L1], L2) ->
+ case lists:member(H, L2) of
+ true -> union(L1, L2);
+ false -> [H | union(L1, L2)]
+ end;
+union([], L2) -> L2.
+
+uniq([]) ->
+ [];
+uniq(List) ->
+ [H|T] = lists:sort(List),
+ uniq1(H, T, []).
+
+uniq1(H, [H|R], Ack) ->
+ uniq1(H, R, Ack);
+uniq1(Old, [H|R], Ack) ->
+ uniq1(H, R, [Old|Ack]);
+uniq1(Old, [], Ack) ->
+ [Old| Ack].
+
+to_list(X) when list(X) -> X;
+to_list(X) -> atom_to_list(X).
+
+all_nodes() ->
+ Ns = mnesia:system_info(db_nodes) ++
+ mnesia:system_info(extra_db_nodes),
+ mnesia_lib:uniq(Ns).
+
+running_nodes() ->
+ running_nodes(all_nodes()).
+
+running_nodes(Ns) ->
+ {Replies, _BadNs} = rpc:multicall(Ns, ?MODULE, is_running_remote, []),
+ [N || {GoodState, N} <- Replies, GoodState == true].
+
+is_running_remote() ->
+ IsRunning = is_running(),
+ {IsRunning == yes, node()}.
+
+is_running(Node) when atom(Node) ->
+ case rpc:call(Node, ?MODULE, is_running, []) of
+ {badrpc, _} -> no;
+ X -> X
+ end.
+
+is_running() ->
+ case ?catch_val(mnesia_status) of
+ {'EXIT', _} -> no;
+ running -> yes;
+ starting -> starting;
+ stopping -> stopping
+ end.
+
+show(X) ->
+ show(X, []).
+show(F, A) ->
+ io:format(user, F, A).
+
+
+pad_name([Char | Chars], Len, Tail) ->
+ [Char | pad_name(Chars, Len - 1, Tail)];
+pad_name([], Len, Tail) when Len =< 0 ->
+ Tail;
+pad_name([], Len, Tail) ->
+ [$ | pad_name([], Len - 1, Tail)].
+
+%% Some utility functions .....
+active_here(Tab) ->
+ case val({Tab, where_to_read}) of
+ Node when Node == node() -> true;
+ _ -> false
+ end.
+
+not_active_here(Tab) ->
+ not active_here(Tab).
+
+exists(Fname) ->
+ case file:open(Fname, [raw,read]) of
+ {ok, F} ->file:close(F), true;
+ _ -> false
+ end.
+
+dir() -> mnesia_monitor:get_env(dir).
+
+dir(Fname) ->
+ filename:join([dir(), to_list(Fname)]).
+
+tab2dat(Tab) -> %% DETS files
+ dir(lists:concat([Tab, ".DAT"])).
+
+tab2tmp(Tab) ->
+ dir(lists:concat([Tab, ".TMP"])).
+
+tab2dmp(Tab) -> %% Dumped ets tables
+ dir(lists:concat([Tab, ".DMP"])).
+
+tab2dcd(Tab) -> %% Disc copies data
+ dir(lists:concat([Tab, ".DCD"])).
+
+tab2dcl(Tab) -> %% Disc copies log
+ dir(lists:concat([Tab, ".DCL"])).
+
+storage_type_at_node(Node, Tab) ->
+ search_key(Node, [{disc_copies, val({Tab, disc_copies})},
+ {ram_copies, val({Tab, ram_copies})},
+ {disc_only_copies, val({Tab, disc_only_copies})}]).
+
+cs_to_storage_type(Node, Cs) ->
+ search_key(Node, [{disc_copies, Cs#cstruct.disc_copies},
+ {ram_copies, Cs#cstruct.ram_copies},
+ {disc_only_copies, Cs#cstruct.disc_only_copies}]).
+
+schema_cs_to_storage_type(Node, Cs) ->
+ case cs_to_storage_type(Node, Cs) of
+ unknown when Cs#cstruct.name == schema -> ram_copies;
+ Other -> Other
+ end.
+
+
+search_key(Key, [{Val, List} | Tail]) ->
+ case lists:member(Key, List) of
+ true -> Val;
+ false -> search_key(Key, Tail)
+ end;
+search_key(_Key, []) ->
+ unknown.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% ops, we've got some global variables here :-)
+
+%% They are
+%%
+%% {Tab, setorbag}, -> set | bag
+%% {Tab, storage_type} -> disc_copies |ram_copies | unknown (**)
+%% {Tab, disc_copies} -> node list (from schema)
+%% {Tab, ram_copies}, -> node list (from schema)
+%% {Tab, arity}, -> number
+%% {Tab, attributes}, -> atom list
+%% {Tab, wild_pattern}, -> record tuple with '_'s
+%% {Tab, {index, Pos}} -> ets table
+%% {Tab, index} -> integer list
+%% {Tab, cstruct} -> cstruct structure
+%%
+
+%% The following fields are dynamic according to the
+%% the current node/table situation
+
+%% {Tab, where_to_write} -> node list
+%% {Tab, where_to_read} -> node | nowhere
+%%
+%% {schema, tables} -> tab list
+%% {schema, local_tables} -> tab list (**)
+%%
+%% {current, db_nodes} -> node list
+%%
+%% dir -> directory path (**)
+%% mnesia_status -> status | running | stopping (**)
+%% (**) == (Different on all nodes)
+%%
+
+val(Var) ->
+ case ?catch_val(Var) of
+ {'EXIT', _ReASoN_} -> mnesia_lib:other_val(Var, _ReASoN_);
+ _VaLuE_ -> _VaLuE_
+ end.
+
+set(Var, Val) ->
+ ?ets_insert(mnesia_gvar, {Var, Val}).
+
+unset(Var) ->
+ ?ets_delete(mnesia_gvar, Var).
+
+other_val(Var, Other) ->
+ case Var of
+ {_, where_to_read} -> nowhere;
+ {_, where_to_write} -> [];
+ {_, active_replicas} -> [];
+ _ ->
+ pr_other(Var, Other)
+ end.
+
+pr_other(Var, Other) ->
+ Why =
+ case is_running() of
+ no -> {node_not_running, node()};
+ _ -> {no_exists, Var}
+ end,
+ verbose("~p (~p) val(mnesia_gvar, ~w) -> ~p ~p ~n",
+ [self(), process_info(self(), registered_name),
+ Var, Other, Why]),
+ case Other of
+ {badarg, [{ets, lookup_element, _}|_]} ->
+ exit(Why);
+ _ ->
+ erlang:error(Why)
+ end.
+
+%% Some functions for list valued variables
+add(Var, Val) ->
+ L = val(Var),
+ set(Var, [Val | lists:delete(Val, L)]).
+
+add_list(Var, List) ->
+ L = val(Var),
+ set(Var, union(L, List)).
+
+del(Var, Val) ->
+ L = val(Var),
+ set(Var, lists:delete(Val, L)).
+
+%% This function is needed due to the fact
+%% that the application_controller enters
+%% a deadlock now and then. ac is implemented
+%% as a rather naive server.
+ensure_loaded(Appl) ->
+ case application_controller:get_loaded(Appl) of
+ {true, _} ->
+ ok;
+ false ->
+ case application:load(Appl) of
+ ok ->
+ ok;
+ {error, {already_loaded, Appl}} ->
+ ok;
+ {error, Reason} ->
+ {error, {application_load_error, Reason}}
+ end
+ end.
+
+local_active_tables() ->
+ Tabs = val({schema, local_tables}),
+ lists:zf(fun(Tab) -> active_here(Tab) end, Tabs).
+
+active_tables() ->
+ Tabs = val({schema, tables}),
+ F = fun(Tab) ->
+ case val({Tab, where_to_read}) of
+ nowhere -> false;
+ _ -> {true, Tab}
+ end
+ end,
+ lists:zf(F, Tabs).
+
+etype(X) when integer(X) -> integer;
+etype([]) -> nil;
+etype(X) when list(X) -> list;
+etype(X) when tuple(X) -> tuple;
+etype(X) when atom(X) -> atom;
+etype(_) -> othertype.
+
+remote_copy_holders(Cs) ->
+ copy_holders(Cs) -- [node()].
+
+copy_holders(Cs) when Cs#cstruct.local_content == false ->
+ cs_to_nodes(Cs);
+copy_holders(Cs) when Cs#cstruct.local_content == true ->
+ case lists:member(node(), cs_to_nodes(Cs)) of
+ true -> [node()];
+ false -> []
+ end.
+
+
+set_remote_where_to_read(Tab) ->
+ set_remote_where_to_read(Tab, []).
+
+set_remote_where_to_read(Tab, Ignore) ->
+ Active = val({Tab, active_replicas}),
+ Valid =
+ case mnesia_recover:get_master_nodes(Tab) of
+ [] -> Active;
+ Masters -> mnesia_lib:intersect(Masters, Active)
+ end,
+ Available = mnesia_lib:intersect(val({current, db_nodes}), Valid -- Ignore),
+ DiscOnlyC = val({Tab, disc_only_copies}),
+ Prefered = Available -- DiscOnlyC,
+ if
+ Prefered /= [] ->
+ set({Tab, where_to_read}, hd(Prefered));
+ Available /= [] ->
+ set({Tab, where_to_read}, hd(Available));
+ true ->
+ set({Tab, where_to_read}, nowhere)
+ end.
+
+%%% Local only
+set_local_content_whereabouts(Tab) ->
+ add({schema, local_tables}, Tab),
+ add({Tab, active_replicas}, node()),
+ set({Tab, where_to_write}, [node()]),
+ set({Tab, where_to_read}, node()).
+
+%%% counter routines
+
+create_counter(Name) ->
+ set_counter(Name, 0).
+
+set_counter(Name, Val) ->
+ ?ets_insert(mnesia_gvar, {Name, Val}).
+
+incr_counter(Name) ->
+ ?ets_update_counter(mnesia_gvar, Name, 1).
+
+incr_counter(Name, I) ->
+ ?ets_update_counter(mnesia_gvar, Name, I).
+
+update_counter(Name, Val) ->
+ ?ets_update_counter(mnesia_gvar, Name, Val).
+
+read_counter(Name) ->
+ ?ets_lookup_element(mnesia_gvar, Name, 2).
+
+cs_to_nodes(Cs) ->
+ Cs#cstruct.disc_only_copies ++
+ Cs#cstruct.disc_copies ++
+ Cs#cstruct.ram_copies.
+
+dist_coredump() ->
+ dist_coredump(all_nodes()).
+dist_coredump(Ns) ->
+ {Replies, _} = rpc:multicall(Ns, ?MODULE, coredump, []),
+ Replies.
+
+coredump() ->
+ coredump({crashinfo, {"user initiated~n", []}}).
+coredump(CrashInfo) ->
+ Core = mkcore(CrashInfo),
+ Out = core_file(),
+ important("Writing Mnesia core to file: ~p...~p~n", [Out, CrashInfo]),
+ file:write_file(Out, Core),
+ Out.
+
+core_file() ->
+ Integers = tuple_to_list(date()) ++ tuple_to_list(time()),
+ Fun = fun(I) when I < 10 -> ["_0", I];
+ (I) -> ["_", I]
+ end,
+ List = lists:append([Fun(I) || I <- Integers]),
+ filename:absname(lists:concat(["MnesiaCore.", node()] ++ List)).
+
+mkcore(CrashInfo) ->
+% dbg_out("Making a Mnesia core dump...~p~n", [CrashInfo]),
+ Nodes = [node() |nodes()],
+ TidLocks = (catch ets:tab2list(mnesia_tid_locks)),
+ Core = [
+ CrashInfo,
+ {time, {date(), time()}},
+ {self, catch process_info(self())},
+ {nodes, catch rpc:multicall(Nodes, ?MODULE, get_node_number, [])},
+ {applications, catch lists:sort(application:loaded_applications())},
+ {flags, catch init:get_arguments()},
+ {code_path, catch code:get_path()},
+ {code_loaded, catch lists:sort(code:all_loaded())},
+ {etsinfo, catch ets_info(ets:all())},
+
+ {version, catch mnesia:system_info(version)},
+ {schema, catch ets:tab2list(schema)},
+ {gvar, catch ets:tab2list(mnesia_gvar)},
+ {master_nodes, catch mnesia_recover:get_master_node_info()},
+
+ {processes, catch procs()},
+ {relatives, catch relatives()},
+ {workers, catch workers(mnesia_controller:get_workers(2000))},
+ {locking_procs, catch locking_procs(TidLocks)},
+
+ {held_locks, catch mnesia:system_info(held_locks)},
+ {tid_locks, TidLocks},
+ {lock_queue, catch mnesia:system_info(lock_queue)},
+ {load_info, catch mnesia_controller:get_info(2000)},
+ {trans_info, catch mnesia_tm:get_info(2000)},
+
+ {schema_file, catch file:read_file(tab2dat(schema))},
+ {dir_info, catch dir_info()},
+ {logfile, catch {ok, read_log_files()}}
+ ],
+ term_to_binary(Core).
+
+procs() ->
+ Fun = fun(P) -> {P, (catch lists:zf(fun proc_info/1, process_info(P)))} end,
+ lists:map(Fun, processes()).
+
+proc_info({registered_name, Val}) -> {true, Val};
+proc_info({message_queue_len, Val}) -> {true, Val};
+proc_info({status, Val}) -> {true, Val};
+proc_info({current_function, Val}) -> {true, Val};
+proc_info(_) -> false.
+
+get_node_number() ->
+ {node(), self()}.
+
+read_log_files() ->
+ [{F, catch file:read_file(F)} || F <- mnesia_log:log_files()].
+
+dir_info() ->
+ {ok, Cwd} = file:get_cwd(),
+ Dir = dir(),
+ [{cwd, Cwd, file:read_file_info(Cwd)},
+ {mnesia_dir, Dir, file:read_file_info(Dir)}] ++
+ case file:list_dir(Dir) of
+ {ok, Files} ->
+ [{mnesia_file, F, catch file:read_file_info(dir(F))} || F <- Files];
+ Other ->
+ [Other]
+ end.
+
+ets_info([H|T]) ->
+ [{table, H, ets:info(H)} | ets_info(T)];
+ets_info([]) -> [].
+
+relatives() ->
+ Info = fun(Name) ->
+ case whereis(Name) of
+ undefined -> false;
+ Pid -> {true, {Name, Pid, catch process_info(Pid)}}
+ end
+ end,
+ lists:zf(Info, mnesia:ms()).
+
+workers({workers, Loader, Sender, Dumper}) ->
+ Info = fun({Name, Pid}) ->
+ case Pid of
+ undefined -> false;
+ Pid -> {true, {Name, Pid, catch process_info(Pid)}}
+ end
+ end,
+ lists:zf(Info, [{loader, Loader}, {sender, Sender}, {dumper, Dumper}]).
+
+locking_procs(LockList) when list(LockList) ->
+ Tids = [element(1, Lock) || Lock <- LockList],
+ UT = uniq(Tids),
+ Info = fun(Tid) ->
+ Pid = Tid#tid.pid,
+ case node(Pid) == node() of
+ true ->
+ {true, {Pid, catch process_info(Pid)}};
+ _ ->
+ false
+ end
+ end,
+ lists:zf(Info, UT).
+
+view() ->
+ Bin = mkcore({crashinfo, {"view only~n", []}}),
+ vcore(Bin).
+
+%% Displays a Mnesia file on the tty. The file may be repaired.
+view(File) ->
+ case suffix([".DAT", ".RET", ".DMP", ".TMP"], File) of
+ true ->
+ view(File, dat);
+ false ->
+ case suffix([".LOG", ".BUP", ".ETS"], File) of
+ true ->
+ view(File, log);
+ false ->
+ case lists:prefix("MnesiaCore.", File) of
+ true ->
+ view(File, core);
+ false ->
+ {error, "Unknown file name"}
+ end
+ end
+ end.
+
+view(File, dat) ->
+ dets:view(File);
+view(File, log) ->
+ mnesia_log:view(File);
+view(File, core) ->
+ vcore(File).
+
+suffix(Suffixes, File) ->
+ Fun = fun(S) -> lists:suffix(S, File) end,
+ lists:any(Fun, Suffixes).
+
+%% View a core file
+
+vcore() ->
+ Prefix = lists:concat(["MnesiaCore.", node()]),
+ Filter = fun(F) -> lists:prefix(Prefix, F) end,
+ {ok, Cwd} = file:get_cwd(),
+ case file:list_dir(Cwd) of
+ {ok, Files}->
+ CoreFiles = lists:sort(lists:zf(Filter, Files)),
+ show("Mnesia core files: ~p~n", [CoreFiles]),
+ vcore(lists:last(CoreFiles));
+ Error ->
+ Error
+ end.
+
+vcore(Bin) when binary(Bin) ->
+ Core = binary_to_term(Bin),
+ Fun = fun({Item, Info}) ->
+ show("***** ~p *****~n", [Item]),
+ case catch vcore_elem({Item, Info}) of
+ {'EXIT', Reason} ->
+ show("{'EXIT', ~p}~n", [Reason]);
+ _ -> ok
+ end
+ end,
+ lists:foreach(Fun, Core);
+
+vcore(File) ->
+ show("~n***** Mnesia core: ~p *****~n", [File]),
+ case file:read_file(File) of
+ {ok, Bin} ->
+ vcore(Bin);
+ _ ->
+ nocore
+ end.
+
+vcore_elem({schema_file, {ok, B}}) ->
+ Fname = "/tmp/schema.DAT",
+ file:write_file(Fname, B),
+ dets:view(Fname),
+ file:delete(Fname);
+
+vcore_elem({logfile, {ok, BinList}}) ->
+ Fun = fun({F, Info}) ->
+ show("----- logfile: ~p -----~n", [F]),
+ case Info of
+ {ok, B} ->
+ Fname = "/tmp/mnesia_vcore_elem.TMP",
+ file:write_file(Fname, B),
+ mnesia_log:view(Fname),
+ file:delete(Fname);
+ _ ->
+ show("~p~n", [Info])
+ end
+ end,
+ lists:foreach(Fun, BinList);
+
+vcore_elem({crashinfo, {Format, Args}}) ->
+ show(Format, Args);
+vcore_elem({gvar, L}) ->
+ show("~p~n", [lists:sort(L)]);
+vcore_elem({transactions, Info}) ->
+ mnesia_tm:display_info(user, Info);
+
+vcore_elem({_Item, Info}) ->
+ show("~p~n", [Info]).
+
+fix_error(X) ->
+ set(last_error, X), %% for debugabililty
+ case X of
+ {aborted, Reason} -> Reason;
+ {abort, Reason} -> Reason;
+ Y when atom(Y) -> Y;
+ {'EXIT', {_Reason, {Mod, _, _}}} when atom(Mod) ->
+ save(X),
+ case atom_to_list(Mod) of
+ [$m, $n, $e|_] -> badarg;
+ _ -> X
+ end;
+ _ -> X
+ end.
+
+last_error() ->
+ val(last_error).
+
+%% The following is a list of possible mnesia errors and what they
+%% actually mean
+
+error_desc(nested_transaction) -> "Nested transactions are not allowed";
+error_desc(badarg) -> "Bad or invalid argument, possibly bad type";
+error_desc(no_transaction) -> "Operation not allowed outside transactions";
+error_desc(combine_error) -> "Table options were ilegally combined";
+error_desc(bad_index) -> "Index already exists or was out of bounds";
+error_desc(already_exists) -> "Some schema option we try to set is already on";
+error_desc(index_exists)-> "Some ops can not be performed on tabs with index";
+error_desc(no_exists)-> "Tried to perform op on non-existing (non alive) item";
+error_desc(system_limit) -> "Some system_limit was exhausted";
+error_desc(mnesia_down) -> "A transaction involving objects at some remote "
+ "node which died while transaction was executing"
+ "*and* object(s) are no longer available elsewhere"
+ "in the network";
+error_desc(not_a_db_node) -> "A node which is non existant in "
+ "the schema was mentioned";
+error_desc(bad_type) -> "Bad type on some provided arguments";
+error_desc(node_not_running) -> "Node not running";
+error_desc(truncated_binary_file) -> "Truncated binary in file";
+error_desc(active) -> "Some delete ops require that "
+ "all active objects are removed";
+error_desc(illegal) -> "Operation not supported on object";
+error_desc({'EXIT', Reason}) ->
+ error_desc(Reason);
+error_desc({error, Reason}) ->
+ error_desc(Reason);
+error_desc({aborted, Reason}) ->
+ error_desc(Reason);
+error_desc(Reason) when tuple(Reason), size(Reason) > 0 ->
+ setelement(1, Reason, error_desc(element(1, Reason)));
+error_desc(Reason) ->
+ Reason.
+
+dirty_rpc_error_tag(Reason) ->
+ case Reason of
+ {'EXIT', _} -> badarg;
+ no_variable -> badarg;
+ _ -> no_exists
+ end.
+
+fatal(Format, Args) ->
+ catch set(mnesia_status, stopping),
+ Core = mkcore({crashinfo, {Format, Args}}),
+ report_fatal(Format, Args, Core),
+ timer:sleep(10000), % Enough to write the core dump to disc?
+ mnesia:lkill(),
+ exit(fatal).
+
+report_fatal(Format, Args) ->
+ report_fatal(Format, Args, nocore).
+
+report_fatal(Format, Args, Core) ->
+ report_system_event({mnesia_fatal, Format, Args, Core}),
+ catch exit(whereis(mnesia_monitor), fatal).
+
+%% We sleep longer and longer the more we try
+%% Made some testing and came up with the following constants
+random_time(Retries, _Counter0) ->
+% UpperLimit = 2000,
+% MaxIntv = trunc(UpperLimit * (1-(4/((Retries*Retries)+4)))),
+ UpperLimit = 500,
+ Dup = Retries * Retries,
+ MaxIntv = trunc(UpperLimit * (1-(50/((Dup)+50)))),
+
+ case get(random_seed) of
+ undefined ->
+ {X, Y, Z} = erlang:now(), %% time()
+ random:seed(X, Y, Z),
+ Time = Dup + random:uniform(MaxIntv),
+ %% dbg_out("---random_test rs ~w max ~w val ~w---~n", [Retries, MaxIntv, Time]),
+ Time;
+ _ ->
+ Time = Dup + random:uniform(MaxIntv),
+ %% dbg_out("---random_test rs ~w max ~w val ~w---~n", [Retries, MaxIntv, Time]),
+ Time
+ end.
+
+report_system_event(Event0) ->
+ Event = {mnesia_system_event, Event0},
+ report_system_event(catch_notify(Event), Event),
+ case ?catch_val(subscribers) of
+ {'EXIT', _} -> ignore;
+ Pids -> lists:foreach(fun(Pid) -> Pid ! Event end, Pids)
+ end,
+ ok.
+
+catch_notify(Event) ->
+ case whereis(mnesia_event) of
+ undefined ->
+ {'EXIT', {badarg, {mnesia_event, Event}}};
+ Pid ->
+ gen_event:notify(Pid, Event)
+ end.
+
+report_system_event({'EXIT', Reason}, Event) ->
+ Mod = mnesia_monitor:get_env(event_module),
+ case mnesia_sup:start_event() of
+ {ok, Pid} ->
+ link(Pid),
+ gen_event:call(mnesia_event, Mod, Event, infinity),
+ unlink(Pid),
+
+ %% We get an exit signal if server dies
+ receive
+ {'EXIT', Pid, _Reason} ->
+ {error, {node_not_running, node()}}
+ after 0 ->
+ gen_event:stop(mnesia_event),
+ ok
+ end;
+
+ Error ->
+ Msg = "Mnesia(~p): Cannot report event ~p: ~p (~p)~n",
+ error_logger:format(Msg, [node(), Event, Reason, Error])
+ end;
+report_system_event(_Res, _Event) ->
+ ignore.
+
+%% important messages are reported regardless of debug level
+important(Format, Args) ->
+ save({Format, Args}),
+ report_system_event({mnesia_info, Format, Args}).
+
+%% Warning messages are reported regardless of debug level
+warning(Format, Args) ->
+ save({Format, Args}),
+ report_system_event({mnesia_warning, Format, Args}).
+
+%% error messages are reported regardless of debug level
+error(Format, Args) ->
+ save({Format, Args}),
+ report_system_event({mnesia_error, Format, Args}).
+
+%% verbose messages are reported if debug level == debug or verbose
+verbose(Format, Args) ->
+ case mnesia_monitor:get_env(debug) of
+ none -> save({Format, Args});
+ verbose -> important(Format, Args);
+ debug -> important(Format, Args);
+ trace -> important(Format, Args)
+ end.
+
+%% debug message are display if debug level == 2
+dbg_out(Format, Args) ->
+ case mnesia_monitor:get_env(debug) of
+ none -> ignore;
+ verbose -> save({Format, Args});
+ _ -> report_system_event({mnesia_info, Format, Args})
+ end.
+
+%% Keep the last 10 debug print outs
+save(DbgInfo) ->
+ catch save2(DbgInfo).
+
+save2(DbgInfo) ->
+ Key = {'$$$_report', current_pos},
+ P =
+ case ?ets_lookup_element(mnesia_gvar, Key, 2) of
+ 30 -> -1;
+ I -> I
+ end,
+ set({'$$$_report', current_pos}, P+1),
+ set({'$$$_report', P+1}, {date(), time(), DbgInfo}).
+
+copy_file(From, To) ->
+ case file:open(From, [raw, binary, read]) of
+ {ok, F} ->
+ case file:open(To, [raw, binary, write]) of
+ {ok, T} ->
+ Res = copy_file_loop(F, T, 8000),
+ file:close(F),
+ file:close(T),
+ Res;
+ {error, Reason} ->
+ {error, Reason}
+ end;
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+copy_file_loop(F, T, ChunkSize) ->
+ case file:read(F, ChunkSize) of
+ {ok, {0, _}} ->
+ ok;
+ {ok, {_, Bin}} ->
+ file:write(T, Bin),
+ copy_file_loop(F, T, ChunkSize);
+ {ok, Bin} ->
+ file:write(T, Bin),
+ copy_file_loop(F, T, ChunkSize);
+ eof ->
+ ok;
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+
+%%%%%%%%%%%%
+%% versions of all the lowlevel db funcs that determine whether we
+%% shall go to disc or ram to do the actual operation.
+
+db_get(Tab, Key) ->
+ db_get(val({Tab, storage_type}), Tab, Key).
+db_get(ram_copies, Tab, Key) -> ?ets_lookup(Tab, Key);
+db_get(disc_copies, Tab, Key) -> ?ets_lookup(Tab, Key);
+db_get(disc_only_copies, Tab, Key) -> dets:lookup(Tab, Key).
+
+db_init_chunk(Tab) ->
+ db_init_chunk(val({Tab, storage_type}), Tab, 1000).
+db_init_chunk(Tab, N) ->
+ db_init_chunk(val({Tab, storage_type}), Tab, N).
+
+db_init_chunk(disc_only_copies, Tab, N) ->
+ dets:select(Tab, [{'_', [], ['$_']}], N);
+db_init_chunk(_, Tab, N) ->
+ ets:select(Tab, [{'_', [], ['$_']}], N).
+
+db_chunk(disc_only_copies, State) ->
+ dets:select(State);
+db_chunk(_, State) ->
+ ets:select(State).
+
+db_put(Tab, Val) ->
+ db_put(val({Tab, storage_type}), Tab, Val).
+
+db_put(ram_copies, Tab, Val) -> ?ets_insert(Tab, Val), ok;
+db_put(disc_copies, Tab, Val) -> ?ets_insert(Tab, Val), ok;
+db_put(disc_only_copies, Tab, Val) -> dets:insert(Tab, Val).
+
+db_match_object(Tab, Pat) ->
+ db_match_object(val({Tab, storage_type}), Tab, Pat).
+db_match_object(Storage, Tab, Pat) ->
+ db_fixtable(Storage, Tab, true),
+ Res = catch_match_object(Storage, Tab, Pat),
+ db_fixtable(Storage, Tab, false),
+ case Res of
+ {'EXIT', Reason} -> exit(Reason);
+ _ -> Res
+ end.
+
+catch_match_object(disc_only_copies, Tab, Pat) ->
+ catch dets:match_object(Tab, Pat);
+catch_match_object(_, Tab, Pat) ->
+ catch ets:match_object(Tab, Pat).
+
+db_select(Tab, Pat) ->
+ db_select(val({Tab, storage_type}), Tab, Pat).
+
+db_select(Storage, Tab, Pat) ->
+ db_fixtable(Storage, Tab, true),
+ Res = catch_select(Storage, Tab, Pat),
+ db_fixtable(Storage, Tab, false),
+ case Res of
+ {'EXIT', Reason} -> exit(Reason);
+ _ -> Res
+ end.
+
+catch_select(disc_only_copies, Tab, Pat) ->
+ dets:select(Tab, Pat);
+catch_select(_, Tab, Pat) ->
+ ets:select(Tab, Pat).
+
+db_fixtable(ets, Tab, Bool) ->
+ ets:safe_fixtable(Tab, Bool);
+db_fixtable(ram_copies, Tab, Bool) ->
+ ets:safe_fixtable(Tab, Bool);
+db_fixtable(disc_copies, Tab, Bool) ->
+ ets:safe_fixtable(Tab, Bool);
+db_fixtable(dets, Tab, Bool) ->
+ dets:safe_fixtable(Tab, Bool);
+db_fixtable(disc_only_copies, Tab, Bool) ->
+ dets:safe_fixtable(Tab, Bool).
+
+db_erase(Tab, Key) ->
+ db_erase(val({Tab, storage_type}), Tab, Key).
+db_erase(ram_copies, Tab, Key) -> ?ets_delete(Tab, Key), ok;
+db_erase(disc_copies, Tab, Key) -> ?ets_delete(Tab, Key), ok;
+db_erase(disc_only_copies, Tab, Key) -> dets:delete(Tab, Key).
+
+db_match_erase(Tab, Pat) ->
+ db_match_erase(val({Tab, storage_type}), Tab, Pat).
+db_match_erase(ram_copies, Tab, Pat) -> ?ets_match_delete(Tab, Pat), ok;
+db_match_erase(disc_copies, Tab, Pat) -> ?ets_match_delete(Tab, Pat), ok;
+db_match_erase(disc_only_copies, Tab, Pat) -> dets:match_delete(Tab, Pat).
+
+db_first(Tab) ->
+ db_first(val({Tab, storage_type}), Tab).
+db_first(ram_copies, Tab) -> ?ets_first(Tab);
+db_first(disc_copies, Tab) -> ?ets_first(Tab);
+db_first(disc_only_copies, Tab) -> dets:first(Tab).
+
+db_next_key(Tab, Key) ->
+ db_next_key(val({Tab, storage_type}), Tab, Key).
+db_next_key(ram_copies, Tab, Key) -> ?ets_next(Tab, Key);
+db_next_key(disc_copies, Tab, Key) -> ?ets_next(Tab, Key);
+db_next_key(disc_only_copies, Tab, Key) -> dets:next(Tab, Key).
+
+db_last(Tab) ->
+ db_last(val({Tab, storage_type}), Tab).
+db_last(ram_copies, Tab) -> ?ets_last(Tab);
+db_last(disc_copies, Tab) -> ?ets_last(Tab);
+db_last(disc_only_copies, Tab) -> dets:first(Tab). %% Dets don't have order
+
+db_prev_key(Tab, Key) ->
+ db_prev_key(val({Tab, storage_type}), Tab, Key).
+db_prev_key(ram_copies, Tab, Key) -> ?ets_prev(Tab, Key);
+db_prev_key(disc_copies, Tab, Key) -> ?ets_prev(Tab, Key);
+db_prev_key(disc_only_copies, Tab, Key) -> dets:next(Tab, Key). %% Dets don't have order
+
+db_slot(Tab, Pos) ->
+ db_slot(val({Tab, storage_type}), Tab, Pos).
+db_slot(ram_copies, Tab, Pos) -> ?ets_slot(Tab, Pos);
+db_slot(disc_copies, Tab, Pos) -> ?ets_slot(Tab, Pos);
+db_slot(disc_only_copies, Tab, Pos) -> dets:slot(Tab, Pos).
+
+db_update_counter(Tab, C, Val) ->
+ db_update_counter(val({Tab, storage_type}), Tab, C, Val).
+db_update_counter(ram_copies, Tab, C, Val) ->
+ ?ets_update_counter(Tab, C, Val);
+db_update_counter(disc_copies, Tab, C, Val) ->
+ ?ets_update_counter(Tab, C, Val);
+db_update_counter(disc_only_copies, Tab, C, Val) ->
+ dets:update_counter(Tab, C, Val).
+
+db_erase_tab(Tab) ->
+ db_erase_tab(val({Tab, storage_type}), Tab).
+db_erase_tab(ram_copies, Tab) -> ?ets_delete_table(Tab);
+db_erase_tab(disc_copies, Tab) -> ?ets_delete_table(Tab);
+db_erase_tab(disc_only_copies, _Tab) -> ignore.
+
+%% assuming that Tab is a valid ets-table
+dets_to_ets(Tabname, Tab, File, Type, Rep, Lock) ->
+ {Open, Close} = mkfuns(Lock),
+ case Open(Tabname, [{file, File}, {type, disk_type(Tab, Type)},
+ {keypos, 2}, {repair, Rep}]) of
+ {ok, Tabname} ->
+ Res = dets:to_ets(Tabname, Tab),
+ Close(Tabname),
+ trav_ret(Res, Tab);
+ Other ->
+ Other
+ end.
+
+trav_ret(Tabname, Tabname) -> loaded;
+trav_ret(Other, _Tabname) -> Other.
+
+mkfuns(yes) ->
+ {fun(Tab, Args) -> dets_sync_open(Tab, Args) end,
+ fun(Tab) -> dets_sync_close(Tab) end};
+mkfuns(no) ->
+ {fun(Tab, Args) -> dets:open_file(Tab, Args) end,
+ fun(Tab) -> dets:close(Tab) end}.
+
+disk_type(Tab) ->
+ disk_type(Tab, val({Tab, setorbag})).
+
+disk_type(_Tab, ordered_set) ->
+ set;
+disk_type(_, Type) ->
+ Type.
+
+dets_sync_open(Tab, Ref, File) ->
+ Args = [{file, File},
+ {keypos, 2},
+ {repair, mnesia_monitor:get_env(auto_repair)},
+ {type, disk_type(Tab)}],
+ dets_sync_open(Ref, Args).
+
+lock_table(Tab) ->
+ global:set_lock({{mnesia_table_lock, Tab}, self()}, [node()], infinity).
+% dbg_out("dets_sync_open: ~p ~p~n", [T, self()]),
+
+unlock_table(Tab) ->
+ global:del_lock({{mnesia_table_lock, Tab}, self()}, [node()]).
+% dbg_out("unlock_table: ~p ~p~n", [T, self()]),
+
+dets_sync_open(Tab, Args) ->
+ lock_table(Tab),
+ case dets:open_file(Tab, Args) of
+ {ok, Tab} ->
+ {ok, Tab};
+ Other ->
+ dets_sync_close(Tab),
+ Other
+ end.
+
+dets_sync_close(Tab) ->
+ catch dets:close(Tab),
+ unlock_table(Tab),
+ ok.
+
+cleanup_tmp_files([Tab | Tabs]) ->
+ dets_sync_close(Tab),
+ file:delete(tab2tmp(Tab)),
+ cleanup_tmp_files(Tabs);
+cleanup_tmp_files([]) ->
+ ok.
+
+%% Returns a list of bad tables
+swap_tmp_files([Tab | Tabs]) ->
+ dets_sync_close(Tab),
+ Tmp = tab2tmp(Tab),
+ Dat = tab2dat(Tab),
+ case file:rename(Tmp, Dat) of
+ ok ->
+ swap_tmp_files(Tabs);
+ _ ->
+ file:delete(Tmp),
+ [Tab | swap_tmp_files(Tabs)]
+ end;
+swap_tmp_files([]) ->
+ [].
+
+readable_indecies(Tab) ->
+ val({Tab, index}).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Managing conditional debug functions
+%%
+%% The main idea with the debug_fun's is to allow test programs
+%% to control the internal behaviour of Mnesia. This is needed
+%% to make the test programs independent of system load, swapping
+%% and other circumstances that may affect the behaviour of Mnesia.
+%%
+%% First should calls to ?eval_debug_fun be inserted at well
+%% defined places in Mnesia's code. E.g. in critical situations
+%% of startup, transaction commit, backups etc.
+%%
+%% Then compile Mnesia with the compiler option 'debug'.
+%%
+%% In test programs ?activate_debug_fun should be called
+%% in order to bind a fun to the debug identifier stated
+%% in the call to ?eval_debug_fun.
+%%
+%% If eval_debug_fun finds that the fun is activated it
+%% invokes the fun as NewContext = Fun(PreviousContext, EvalContext)
+%% and replaces the PreviousContext with the NewContext.
+%% The initial context of a debug_fun is given as argument to
+%% activate_debug_fun.
+
+-define(DEBUG_TAB, mnesia_debug).
+-record(debug_info, {id, function, context, file, line}).
+
+scratch_debug_fun() ->
+ dbg_out("scratch_debug_fun(): ~p~n", [?DEBUG_TAB]),
+ (catch ?ets_delete_table(?DEBUG_TAB)),
+ ?ets_new_table(?DEBUG_TAB, [set, public, named_table, {keypos, 2}]).
+
+activate_debug_fun(FunId, Fun, InitialContext, File, Line) ->
+ Info = #debug_info{id = FunId,
+ function = Fun,
+ context = InitialContext,
+ file = File,
+ line = Line
+ },
+ update_debug_info(Info).
+
+update_debug_info(Info) ->
+ case catch ?ets_insert(?DEBUG_TAB, Info) of
+ {'EXIT', _} ->
+ scratch_debug_fun(),
+ ?ets_insert(?DEBUG_TAB, Info);
+ _ ->
+ ok
+ end,
+ dbg_out("update_debug_info(~p)~n", [Info]),
+ ok.
+
+deactivate_debug_fun(FunId, _File, _Line) ->
+ catch ?ets_delete(?DEBUG_TAB, FunId),
+ ok.
+
+eval_debug_fun(FunId, EvalContext, EvalFile, EvalLine) ->
+ case catch ?ets_lookup(?DEBUG_TAB, FunId) of
+ [] ->
+ ok;
+ [Info] ->
+ OldContext = Info#debug_info.context,
+ dbg_out("~s(~p): ~w "
+ "activated in ~s(~p)~n "
+ "eval_debug_fun(~w, ~w)~n",
+ [filename:basename(EvalFile), EvalLine, Info#debug_info.id,
+ filename:basename(Info#debug_info.file), Info#debug_info.line,
+ OldContext, EvalContext]),
+ Fun = Info#debug_info.function,
+ NewContext = Fun(OldContext, EvalContext),
+
+ case catch ?ets_lookup(?DEBUG_TAB, FunId) of
+ [Info] when NewContext /= OldContext ->
+ NewInfo = Info#debug_info{context = NewContext},
+ update_debug_info(NewInfo);
+ _ ->
+ ok
+ end;
+ {'EXIT', _} -> ok
+ end.
+
+-ifdef(debug).
+ is_debug_compiled() -> true.
+-else.
+ is_debug_compiled() -> false.
+-endif.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_loader.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_loader.erl
new file mode 100644
index 0000000000..f21a8240aa
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_loader.erl
@@ -0,0 +1,805 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_loader.erl,v 1.2 2010/03/04 13:54:19 maria Exp $
+%%
+%%% Purpose : Loads tables from local disc or from remote node
+
+-module(mnesia_loader).
+
+%% Mnesia internal stuff
+-export([disc_load_table/2,
+ net_load_table/4,
+ send_table/3]).
+
+-export([old_node_init_table/6]). %% Spawned old node protocol conversion hack
+-export([spawned_receiver/8]). %% Spawned lock taking process
+
+-import(mnesia_lib, [set/2, fatal/2, verbose/2, dbg_out/2]).
+
+-include("mnesia.hrl").
+
+val(Var) ->
+ case ?catch_val(Var) of
+ {'EXIT', Reason} -> mnesia_lib:other_val(Var, Reason);
+ Value -> Value
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Load a table from local disc
+
+disc_load_table(Tab, Reason) ->
+ Storage = val({Tab, storage_type}),
+ Type = val({Tab, setorbag}),
+ dbg_out("Getting table ~p (~p) from disc: ~p~n",
+ [Tab, Storage, Reason]),
+ ?eval_debug_fun({?MODULE, do_get_disc_copy},
+ [{tab, Tab},
+ {reason, Reason},
+ {storage, Storage},
+ {type, Type}]),
+ do_get_disc_copy2(Tab, Reason, Storage, Type).
+
+do_get_disc_copy2(Tab, _Reason, Storage, _Type) when Storage == unknown ->
+ verbose("Local table copy of ~p has recently been deleted, ignored.~n",
+ [Tab]),
+ {loaded, ok}; %% ?
+do_get_disc_copy2(Tab, Reason, Storage, Type) when Storage == disc_copies ->
+ %% NOW we create the actual table
+ Repair = mnesia_monitor:get_env(auto_repair),
+ Args = [{keypos, 2}, public, named_table, Type],
+ case Reason of
+ {dumper, _} -> %% Resources allready allocated
+ ignore;
+ _ ->
+ mnesia_monitor:mktab(Tab, Args),
+ Count = mnesia_log:dcd2ets(Tab, Repair),
+ case ets:info(Tab, size) of
+ X when X < Count * 4 ->
+ ok = mnesia_log:ets2dcd(Tab);
+ _ ->
+ ignore
+ end
+ end,
+ mnesia_index:init_index(Tab, Storage),
+ snmpify(Tab, Storage),
+ set({Tab, load_node}, node()),
+ set({Tab, load_reason}, Reason),
+ {loaded, ok};
+
+do_get_disc_copy2(Tab, Reason, Storage, Type) when Storage == ram_copies ->
+ Args = [{keypos, 2}, public, named_table, Type],
+ case Reason of
+ {dumper, _} -> %% Resources allready allocated
+ ignore;
+ _ ->
+ mnesia_monitor:mktab(Tab, Args),
+ Fname = mnesia_lib:tab2dcd(Tab),
+ Datname = mnesia_lib:tab2dat(Tab),
+ Repair = mnesia_monitor:get_env(auto_repair),
+ case mnesia_monitor:use_dir() of
+ true ->
+ case mnesia_lib:exists(Fname) of
+ true -> mnesia_log:dcd2ets(Tab, Repair);
+ false ->
+ case mnesia_lib:exists(Datname) of
+ true ->
+ mnesia_lib:dets_to_ets(Tab, Tab, Datname,
+ Type, Repair, no);
+ false ->
+ false
+ end
+ end;
+ false ->
+ false
+ end
+ end,
+ mnesia_index:init_index(Tab, Storage),
+ snmpify(Tab, Storage),
+ set({Tab, load_node}, node()),
+ set({Tab, load_reason}, Reason),
+ {loaded, ok};
+
+do_get_disc_copy2(Tab, Reason, Storage, Type) when Storage == disc_only_copies ->
+ Args = [{file, mnesia_lib:tab2dat(Tab)},
+ {type, mnesia_lib:disk_type(Tab, Type)},
+ {keypos, 2},
+ {repair, mnesia_monitor:get_env(auto_repair)}],
+ case Reason of
+ {dumper, _} ->
+ mnesia_index:init_index(Tab, Storage),
+ snmpify(Tab, Storage),
+ set({Tab, load_node}, node()),
+ set({Tab, load_reason}, Reason),
+ {loaded, ok};
+ _ ->
+ case mnesia_monitor:open_dets(Tab, Args) of
+ {ok, _} ->
+ mnesia_index:init_index(Tab, Storage),
+ snmpify(Tab, Storage),
+ set({Tab, load_node}, node()),
+ set({Tab, load_reason}, Reason),
+ {loaded, ok};
+ {error, Error} ->
+ {not_loaded, {"Failed to create dets table", Error}}
+ end
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Load a table from a remote node
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Receiver Sender
+%% -------- ------
+%% Grab schema lock on table
+%% Determine table size
+%% Create empty pre-grown table
+%% Grab read lock on table
+%% Let receiver subscribe on updates done on sender node
+%% Disable rehashing of table
+%% Release read lock on table
+%% Send table to receiver in chunks
+%%
+%% Grab read lock on table
+%% Block dirty updates
+%% Update wherabouts
+%%
+%% Cancel the update subscription
+%% Process the subscription events
+%% Optionally dump to disc
+%% Unblock dirty updates
+%% Release read lock on table
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-define(MAX_TRANSFER_SIZE, 7500).
+-define(MAX_RAM_FILE_SIZE, 1000000).
+-define(MAX_RAM_TRANSFERS, (?MAX_RAM_FILE_SIZE div ?MAX_TRANSFER_SIZE) + 1).
+-define(MAX_NOPACKETS, 20).
+
+net_load_table(Tab, Reason, Ns, Cs)
+ when Reason == {dumper,add_table_copy} ->
+ try_net_load_table(Tab, Reason, Ns, Cs);
+net_load_table(Tab, Reason, Ns, _Cs) ->
+ try_net_load_table(Tab, Reason, Ns, val({Tab, cstruct})).
+
+try_net_load_table(Tab, _Reason, [], _Cs) ->
+ verbose("Copy failed. No active replicas of ~p are available.~n", [Tab]),
+ {not_loaded, none_active};
+try_net_load_table(Tab, Reason, Ns, Cs) ->
+ Storage = mnesia_lib:cs_to_storage_type(node(), Cs),
+ do_get_network_copy(Tab, Reason, Ns, Storage, Cs).
+
+do_get_network_copy(Tab, _Reason, _Ns, unknown, _Cs) ->
+ verbose("Local table copy of ~p has recently been deleted, ignored.~n", [Tab]),
+ {not_loaded, storage_unknown};
+do_get_network_copy(Tab, Reason, Ns, Storage, Cs) ->
+ [Node | Tail] = Ns,
+ dbg_out("Getting table ~p (~p) from node ~p: ~p~n",
+ [Tab, Storage, Node, Reason]),
+ ?eval_debug_fun({?MODULE, do_get_network_copy},
+ [{tab, Tab}, {reason, Reason},
+ {nodes, Ns}, {storage, Storage}]),
+ mnesia_controller:start_remote_sender(Node, Tab, self(), Storage),
+ put(mnesia_table_sender_node, {Tab, Node}),
+ case init_receiver(Node, Tab, Storage, Cs, Reason) of
+ ok ->
+ set({Tab, load_node}, Node),
+ set({Tab, load_reason}, Reason),
+ mnesia_controller:i_have_tab(Tab),
+ dbg_out("Table ~p copied from ~p to ~p~n", [Tab, Node, node()]),
+ {loaded, ok};
+ Err = {error, _} when element(1, Reason) == dumper ->
+ {not_loaded,Err};
+ restart ->
+ try_net_load_table(Tab, Reason, Tail, Cs);
+ down ->
+ try_net_load_table(Tab, Reason, Tail, Cs)
+ end.
+
+snmpify(Tab, Storage) ->
+ do_snmpify(Tab, val({Tab, snmp}), Storage).
+
+do_snmpify(_Tab, [], _Storage) ->
+ ignore;
+do_snmpify(Tab, Us, Storage) ->
+ Snmp = mnesia_snmp_hook:create_table(Us, Tab, Storage),
+ set({Tab, {index, snmp}}, Snmp).
+
+%% Start the recieiver
+%% Sender should be started first, so we don't have the schema-read
+%% lock to long (or get stuck in a deadlock)
+init_receiver(Node, Tab, Storage, Cs, Reason) ->
+ receive
+ {SenderPid, {first, TabSize}} ->
+ spawn_receiver(Tab,Storage,Cs,SenderPid,
+ TabSize,false,Reason);
+ {SenderPid, {first, TabSize, DetsData}} ->
+ spawn_receiver(Tab,Storage,Cs,SenderPid,
+ TabSize,DetsData,Reason);
+ %% Protocol conversion hack
+ {copier_done, Node} ->
+ dbg_out("Sender of table ~p crashed on node ~p ~n", [Tab, Node]),
+ down(Tab, Storage)
+ end.
+
+
+table_init_fun(SenderPid) ->
+ PConv = mnesia_monitor:needs_protocol_conversion(node(SenderPid)),
+ MeMyselfAndI = self(),
+ fun(read) ->
+ Receiver =
+ if
+ PConv == true ->
+ MeMyselfAndI ! {actual_tabrec, self()},
+ MeMyselfAndI; %% Old mnesia
+ PConv == false -> self()
+ end,
+ SenderPid ! {Receiver, more},
+ get_data(SenderPid, Receiver)
+ end.
+
+
+%% Add_table_copy get's it's own locks.
+spawn_receiver(Tab,Storage,Cs,SenderPid,TabSize,DetsData,{dumper,add_table_copy}) ->
+ Init = table_init_fun(SenderPid),
+ case do_init_table(Tab,Storage,Cs,SenderPid,TabSize,DetsData,self(), Init) of
+ Err = {error, _} ->
+ SenderPid ! {copier_done, node()},
+ Err;
+ Else ->
+ Else
+ end;
+
+spawn_receiver(Tab,Storage,Cs,SenderPid,
+ TabSize,DetsData,Reason) ->
+ %% Grab a schema lock to avoid deadlock between table_loader and schema_commit dumping.
+ %% Both may grab tables-locks in different order.
+ Load = fun() ->
+ {_,Tid,Ts} = get(mnesia_activity_state),
+ mnesia_locker:rlock(Tid, Ts#tidstore.store,
+ {schema, Tab}),
+ Init = table_init_fun(SenderPid),
+ Pid = spawn_link(?MODULE, spawned_receiver,
+ [self(),Tab,Storage,Cs,
+ SenderPid,TabSize,DetsData,
+ Init]),
+ put(mnesia_real_loader, Pid),
+ wait_on_load_complete(Pid)
+ end,
+ Res = case mnesia:transaction(Load, 20) of
+ {'atomic', {error,Result}} when element(1,Reason) == dumper ->
+ SenderPid ! {copier_done, node()},
+ {error,Result};
+ {'atomic', {error,Result}} ->
+ SenderPid ! {copier_done, node()},
+ fatal("Cannot create table ~p: ~p~n",
+ [[Tab, Storage], Result]);
+ {'atomic', Result} -> Result;
+ {aborted, nomore} ->
+ SenderPid ! {copier_done, node()},
+ restart;
+ {aborted, _ } ->
+ SenderPid ! {copier_done, node()},
+ down %% either this node or sender is dying
+ end,
+ unlink(whereis(mnesia_tm)), %% Avoid late unlink from tm
+ Res.
+
+spawned_receiver(ReplyTo,Tab,Storage,Cs,
+ SenderPid,TabSize,DetsData, Init) ->
+ process_flag(trap_exit, true),
+ Done = do_init_table(Tab,Storage,Cs,
+ SenderPid,TabSize,DetsData,
+ ReplyTo, Init),
+ ReplyTo ! {self(),Done},
+ unlink(ReplyTo),
+ unlink(whereis(mnesia_controller)),
+ exit(normal).
+
+wait_on_load_complete(Pid) ->
+ receive
+ {Pid, Res} ->
+ Res;
+ {'EXIT', Pid, Reason} ->
+ exit(Reason);
+ Else ->
+ Pid ! Else,
+ wait_on_load_complete(Pid)
+ end.
+
+tab_receiver(Node, Tab, Storage, Cs, PConv, OrigTabRec) ->
+ receive
+ {SenderPid, {no_more, DatBin}} when PConv == false ->
+ finish_copy(Storage,Tab,Cs,SenderPid,DatBin,OrigTabRec);
+
+ %% Protocol conversion hack
+ {SenderPid, {no_more, DatBin}} when pid(PConv) ->
+ PConv ! {SenderPid, no_more},
+ receive
+ {old_init_table_complete, ok} ->
+ finish_copy(Storage, Tab, Cs, SenderPid, DatBin,OrigTabRec);
+ {old_init_table_complete, Reason} ->
+ Msg = "OLD: [d]ets:init table failed",
+ dbg_out("~s: ~p: ~p~n", [Msg, Tab, Reason]),
+ down(Tab, Storage)
+ end;
+
+ {actual_tabrec, Pid} ->
+ tab_receiver(Node, Tab, Storage, Cs, Pid,OrigTabRec);
+
+ {SenderPid, {more, [Recs]}} when pid(PConv) ->
+ PConv ! {SenderPid, {more, Recs}}, %% Forward Msg to OldNodes
+ tab_receiver(Node, Tab, Storage, Cs, PConv,OrigTabRec);
+
+ {'EXIT', PConv, Reason} -> %% [d]ets:init process crashed
+ Msg = "Receiver crashed",
+ dbg_out("~s: ~p: ~p~n", [Msg, Tab, Reason]),
+ down(Tab, Storage);
+
+ %% Protocol conversion hack
+ {copier_done, Node} ->
+ dbg_out("Sender of table ~p crashed on node ~p ~n", [Tab, Node]),
+ down(Tab, Storage);
+
+ {'EXIT', Pid, Reason} ->
+ handle_exit(Pid, Reason),
+ tab_receiver(Node, Tab, Storage, Cs, PConv,OrigTabRec)
+ end.
+
+create_table(Tab, TabSize, Storage, Cs) ->
+ if
+ Storage == disc_only_copies ->
+ mnesia_lib:lock_table(Tab),
+ Tmp = mnesia_lib:tab2tmp(Tab),
+ Size = lists:max([TabSize, 256]),
+ Args = [{file, Tmp},
+ {keypos, 2},
+%% {ram_file, true},
+ {estimated_no_objects, Size},
+ {repair, mnesia_monitor:get_env(auto_repair)},
+ {type, mnesia_lib:disk_type(Tab, Cs#cstruct.type)}],
+ file:delete(Tmp),
+ case mnesia_lib:dets_sync_open(Tab, Args) of
+ {ok, _} ->
+ mnesia_lib:unlock_table(Tab),
+ {Storage, Tab};
+ Else ->
+ mnesia_lib:unlock_table(Tab),
+ Else
+ end;
+ (Storage == ram_copies) or (Storage == disc_copies) ->
+ Args = [{keypos, 2}, public, named_table, Cs#cstruct.type],
+ case mnesia_monitor:unsafe_mktab(Tab, Args) of
+ Tab ->
+ {Storage, Tab};
+ Else ->
+ Else
+ end
+ end.
+
+do_init_table(Tab,Storage,Cs,SenderPid,
+ TabSize,DetsInfo,OrigTabRec,Init) ->
+ case create_table(Tab, TabSize, Storage, Cs) of
+ {Storage,Tab} ->
+ %% Debug info
+ Node = node(SenderPid),
+ put(mnesia_table_receiver, {Tab, Node, SenderPid}),
+ mnesia_tm:block_tab(Tab),
+ PConv = mnesia_monitor:needs_protocol_conversion(Node),
+
+ case init_table(Tab,Storage,Init,PConv,DetsInfo,SenderPid) of
+ ok ->
+ tab_receiver(Node,Tab,Storage,Cs,PConv,OrigTabRec);
+ Reason ->
+ Msg = "[d]ets:init table failed",
+ dbg_out("~s: ~p: ~p~n", [Msg, Tab, Reason]),
+ down(Tab, Storage)
+ end;
+ Error ->
+ Error
+ end.
+
+make_table_fun(Pid, TabRec) ->
+ fun(close) ->
+ ok;
+ (read) ->
+ get_data(Pid, TabRec)
+ end.
+
+get_data(Pid, TabRec) ->
+ receive
+ {Pid, {more, Recs}} ->
+ Pid ! {TabRec, more},
+ {Recs, make_table_fun(Pid,TabRec)};
+ {Pid, no_more} ->
+ end_of_input;
+ {copier_done, Node} ->
+ case node(Pid) of
+ Node ->
+ {copier_done, Node};
+ _ ->
+ get_data(Pid, TabRec)
+ end;
+ {'EXIT', Pid, Reason} ->
+ handle_exit(Pid, Reason),
+ get_data(Pid, TabRec)
+ end.
+
+init_table(Tab, disc_only_copies, Fun, false, DetsInfo,Sender) ->
+ ErtsVer = erlang:system_info(version),
+ case DetsInfo of
+ {ErtsVer, DetsData} ->
+ Res = (catch dets:is_compatible_bchunk_format(Tab, DetsData)),
+ case Res of
+ {'EXIT',{undef,[{dets,_,_}|_]}} ->
+ Sender ! {self(), {old_protocol, Tab}},
+ dets:init_table(Tab, Fun); %% Old dets version
+ {'EXIT', What} ->
+ exit(What);
+ false ->
+ Sender ! {self(), {old_protocol, Tab}},
+ dets:init_table(Tab, Fun); %% Old dets version
+ true ->
+ dets:init_table(Tab, Fun, [{format, bchunk}])
+ end;
+ Old when Old /= false ->
+ Sender ! {self(), {old_protocol, Tab}},
+ dets:init_table(Tab, Fun); %% Old dets version
+ _ ->
+ dets:init_table(Tab, Fun)
+ end;
+init_table(Tab, _, Fun, false, _DetsInfo,_) ->
+ case catch ets:init_table(Tab, Fun) of
+ true ->
+ ok;
+ {'EXIT', Else} -> Else
+ end;
+init_table(Tab, Storage, Fun, true, _DetsInfo, Sender) -> %% Old Nodes
+ spawn_link(?MODULE, old_node_init_table,
+ [Tab, Storage, Fun, self(), false, Sender]),
+ ok.
+
+old_node_init_table(Tab, Storage, Fun, TabReceiver, DetsInfo,Sender) ->
+ Res = init_table(Tab, Storage, Fun, false, DetsInfo,Sender),
+ TabReceiver ! {old_init_table_complete, Res},
+ unlink(TabReceiver),
+ ok.
+
+finish_copy(Storage,Tab,Cs,SenderPid,DatBin,OrigTabRec) ->
+ TabRef = {Storage, Tab},
+ subscr_receiver(TabRef, Cs#cstruct.record_name),
+ case handle_last(TabRef, Cs#cstruct.type, DatBin) of
+ ok ->
+ mnesia_index:init_index(Tab, Storage),
+ snmpify(Tab, Storage),
+ %% OrigTabRec must not be the spawned tab-receiver
+ %% due to old protocol.
+ SenderPid ! {OrigTabRec, no_more},
+ mnesia_tm:unblock_tab(Tab),
+ ok;
+ {error, Reason} ->
+ Msg = "Failed to handle last",
+ dbg_out("~s: ~p: ~p~n", [Msg, Tab, Reason]),
+ down(Tab, Storage)
+ end.
+
+subscr_receiver(TabRef = {_, Tab}, RecName) ->
+ receive
+ {mnesia_table_event, {Op, Val, _Tid}} ->
+ if
+ Tab == RecName ->
+ handle_event(TabRef, Op, Val);
+ true ->
+ handle_event(TabRef, Op, setelement(1, Val, RecName))
+ end,
+ subscr_receiver(TabRef, RecName);
+
+ {'EXIT', Pid, Reason} ->
+ handle_exit(Pid, Reason),
+ subscr_receiver(TabRef, RecName)
+ after 0 ->
+ ok
+ end.
+
+handle_event(TabRef, write, Rec) ->
+ db_put(TabRef, Rec);
+handle_event(TabRef, delete, {_Tab, Key}) ->
+ db_erase(TabRef, Key);
+handle_event(TabRef, delete_object, OldRec) ->
+ db_match_erase(TabRef, OldRec);
+handle_event(TabRef, clear_table, {_Tab, _Key}) ->
+ db_match_erase(TabRef, '_').
+
+handle_last({disc_copies, Tab}, _Type, nobin) ->
+ Ret = mnesia_log:ets2dcd(Tab),
+ Fname = mnesia_lib:tab2dat(Tab),
+ case mnesia_lib:exists(Fname) of
+ true -> %% Remove old .DAT files.
+ file:delete(Fname);
+ false ->
+ ok
+ end,
+ Ret;
+
+handle_last({disc_only_copies, Tab}, Type, nobin) ->
+ case mnesia_lib:swap_tmp_files([Tab]) of
+ [] ->
+ Args = [{file, mnesia_lib:tab2dat(Tab)},
+ {type, mnesia_lib:disk_type(Tab, Type)},
+ {keypos, 2},
+ {repair, mnesia_monitor:get_env(auto_repair)}],
+ mnesia_monitor:open_dets(Tab, Args),
+ ok;
+ L when list(L) ->
+ {error, {"Cannot swap tmp files", Tab, L}}
+ end;
+
+handle_last({ram_copies, _Tab}, _Type, nobin) ->
+ ok;
+handle_last({ram_copies, Tab}, _Type, DatBin) ->
+ case mnesia_monitor:use_dir() of
+ true ->
+ mnesia_lib:lock_table(Tab),
+ Tmp = mnesia_lib:tab2tmp(Tab),
+ ok = file:write_file(Tmp, DatBin),
+ ok = file:rename(Tmp, mnesia_lib:tab2dcd(Tab)),
+ mnesia_lib:unlock_table(Tab),
+ ok;
+ false ->
+ ok
+ end.
+
+down(Tab, Storage) ->
+ case Storage of
+ ram_copies ->
+ catch ?ets_delete_table(Tab);
+ disc_copies ->
+ catch ?ets_delete_table(Tab);
+ disc_only_copies ->
+ mnesia_lib:cleanup_tmp_files([Tab])
+ end,
+ mnesia_checkpoint:tm_del_copy(Tab, node()),
+ mnesia_controller:sync_del_table_copy_whereabouts(Tab, node()),
+ mnesia_tm:unblock_tab(Tab),
+ flush_subcrs(),
+ down.
+
+flush_subcrs() ->
+ receive
+ {mnesia_table_event, _} ->
+ flush_subcrs();
+
+ {'EXIT', Pid, Reason} ->
+ handle_exit(Pid, Reason),
+ flush_subcrs()
+ after 0 ->
+ done
+ end.
+
+db_erase({ram_copies, Tab}, Key) ->
+ true = ?ets_delete(Tab, Key);
+db_erase({disc_copies, Tab}, Key) ->
+ true = ?ets_delete(Tab, Key);
+db_erase({disc_only_copies, Tab}, Key) ->
+ ok = dets:delete(Tab, Key).
+
+db_match_erase({ram_copies, Tab} , Pat) ->
+ true = ?ets_match_delete(Tab, Pat);
+db_match_erase({disc_copies, Tab} , Pat) ->
+ true = ?ets_match_delete(Tab, Pat);
+db_match_erase({disc_only_copies, Tab}, Pat) ->
+ ok = dets:match_delete(Tab, Pat).
+
+db_put({ram_copies, Tab}, Val) ->
+ true = ?ets_insert(Tab, Val);
+db_put({disc_copies, Tab}, Val) ->
+ true = ?ets_insert(Tab, Val);
+db_put({disc_only_copies, Tab}, Val) ->
+ ok = dets:insert(Tab, Val).
+
+%% This code executes at the remote site where the data is
+%% executes in a special copier process.
+
+calc_nokeys(Storage, Tab) ->
+ %% Calculate #keys per transfer
+ Key = mnesia_lib:db_first(Storage, Tab),
+ Recs = mnesia_lib:db_get(Storage, Tab, Key),
+ BinSize = size(term_to_binary(Recs)),
+ (?MAX_TRANSFER_SIZE div BinSize) + 1.
+
+send_table(Pid, Tab, RemoteS) ->
+ case ?catch_val({Tab, storage_type}) of
+ {'EXIT', _} ->
+ {error, {no_exists, Tab}};
+ unknown ->
+ {error, {no_exists, Tab}};
+ Storage ->
+ %% Send first
+ TabSize = mnesia:table_info(Tab, size),
+ Pconvert = mnesia_monitor:needs_protocol_conversion(node(Pid)),
+ KeysPerTransfer = calc_nokeys(Storage, Tab),
+ ChunkData = dets:info(Tab, bchunk_format),
+
+ UseDetsChunk =
+ Storage == RemoteS andalso
+ Storage == disc_only_copies andalso
+ ChunkData /= undefined andalso
+ Pconvert == false,
+ if
+ UseDetsChunk == true ->
+ DetsInfo = erlang:system_info(version),
+ Pid ! {self(), {first, TabSize, {DetsInfo, ChunkData}}};
+ true ->
+ Pid ! {self(), {first, TabSize}}
+ end,
+
+ %% Debug info
+ put(mnesia_table_sender, {Tab, node(Pid), Pid}),
+ {Init, Chunk} = reader_funcs(UseDetsChunk, Tab, Storage, KeysPerTransfer),
+
+ SendIt = fun() ->
+ prepare_copy(Pid, Tab, Storage),
+ send_more(Pid, 1, Chunk, Init(), Tab, Pconvert),
+ finish_copy(Pid, Tab, Storage, RemoteS)
+ end,
+
+ case catch SendIt() of
+ receiver_died ->
+ cleanup_tab_copier(Pid, Storage, Tab),
+ unlink(whereis(mnesia_tm)),
+ ok;
+ {_, receiver_died} ->
+ unlink(whereis(mnesia_tm)),
+ ok;
+ {'atomic', no_more} ->
+ unlink(whereis(mnesia_tm)),
+ ok;
+ Reason ->
+ cleanup_tab_copier(Pid, Storage, Tab),
+ unlink(whereis(mnesia_tm)),
+ {error, Reason}
+ end
+ end.
+
+prepare_copy(Pid, Tab, Storage) ->
+ Trans =
+ fun() ->
+ mnesia:write_lock_table(Tab),
+ mnesia_subscr:subscribe(Pid, {table, Tab}),
+ update_where_to_write(Tab, node(Pid)),
+ mnesia_lib:db_fixtable(Storage, Tab, true),
+ ok
+ end,
+ case mnesia:transaction(Trans) of
+ {'atomic', ok} ->
+ ok;
+ {aborted, Reason} ->
+ exit({tab_copier_prepare, Tab, Reason})
+ end.
+
+update_where_to_write(Tab, Node) ->
+ case val({Tab, access_mode}) of
+ read_only ->
+ ignore;
+ read_write ->
+ Current = val({current, db_nodes}),
+ Ns =
+ case lists:member(Node, Current) of
+ true -> Current;
+ false -> [Node | Current]
+ end,
+ update_where_to_write(Ns, Tab, Node)
+ end.
+
+update_where_to_write([], _, _) ->
+ ok;
+update_where_to_write([H|T], Tab, AddNode) ->
+ rpc:call(H, mnesia_controller, call,
+ [{update_where_to_write, [add, Tab, AddNode], self()}]),
+ update_where_to_write(T, Tab, AddNode).
+
+send_more(Pid, N, Chunk, DataState, Tab, OldNode) ->
+ receive
+ {NewPid, more} ->
+ case send_packet(N - 1, NewPid, Chunk, DataState, OldNode) of
+ New when integer(New) ->
+ New - 1;
+ NewData ->
+ send_more(NewPid, ?MAX_NOPACKETS, Chunk, NewData, Tab, OldNode)
+ end;
+ {_NewPid, {old_protocol, Tab}} ->
+ Storage = val({Tab, storage_type}),
+ {Init, NewChunk} =
+ reader_funcs(false, Tab, Storage, calc_nokeys(Storage, Tab)),
+ send_more(Pid, 1, NewChunk, Init(), Tab, OldNode);
+
+ {copier_done, Node} when Node == node(Pid)->
+ verbose("Receiver of table ~p crashed on ~p (more)~n", [Tab, Node]),
+ throw(receiver_died)
+ end.
+
+reader_funcs(UseDetsChunk, Tab, Storage, KeysPerTransfer) ->
+ case UseDetsChunk of
+ false ->
+ {fun() -> mnesia_lib:db_init_chunk(Storage, Tab, KeysPerTransfer) end,
+ fun(Cont) -> mnesia_lib:db_chunk(Storage, Cont) end};
+ true ->
+ {fun() -> dets_bchunk(Tab, start) end,
+ fun(Cont) -> dets_bchunk(Tab, Cont) end}
+ end.
+
+dets_bchunk(Tab, Chunk) -> %% Arrg
+ case dets:bchunk(Tab, Chunk) of
+ {Cont, Data} -> {Data, Cont};
+ Else -> Else
+ end.
+
+send_packet(N, Pid, _Chunk, '$end_of_table', OldNode) ->
+ case OldNode of
+ true -> ignore; %% Old nodes can't handle the new no_more
+ false -> Pid ! {self(), no_more}
+ end,
+ N;
+send_packet(N, Pid, Chunk, {[], Cont}, OldNode) ->
+ send_packet(N, Pid, Chunk, Chunk(Cont), OldNode);
+send_packet(N, Pid, Chunk, {Recs, Cont}, OldNode) when N < ?MAX_NOPACKETS ->
+ case OldNode of
+ true -> Pid ! {self(), {more, [Recs]}}; %% Old need's wrapping list
+ false -> Pid ! {self(), {more, Recs}}
+ end,
+ send_packet(N+1, Pid, Chunk, Chunk(Cont), OldNode);
+send_packet(_N, _Pid, _Chunk, DataState, _OldNode) ->
+ DataState.
+
+finish_copy(Pid, Tab, Storage, RemoteS) ->
+ RecNode = node(Pid),
+ DatBin = dat2bin(Tab, Storage, RemoteS),
+ Trans =
+ fun() ->
+ mnesia:read_lock_table(Tab),
+ A = val({Tab, access_mode}),
+ mnesia_controller:sync_and_block_table_whereabouts(Tab, RecNode, RemoteS, A),
+ cleanup_tab_copier(Pid, Storage, Tab),
+ mnesia_checkpoint:tm_add_copy(Tab, RecNode),
+ Pid ! {self(), {no_more, DatBin}},
+ receive
+ {Pid, no_more} -> % Dont bother about the spurious 'more' message
+ no_more;
+ {copier_done, Node} when Node == node(Pid)->
+ verbose("Tab receiver ~p crashed (more): ~p~n", [Tab, Node]),
+ receiver_died
+ end
+ end,
+ mnesia:transaction(Trans).
+
+cleanup_tab_copier(Pid, Storage, Tab) ->
+ mnesia_lib:db_fixtable(Storage, Tab, false),
+ mnesia_subscr:unsubscribe(Pid, {table, Tab}).
+
+dat2bin(Tab, ram_copies, ram_copies) ->
+ mnesia_lib:lock_table(Tab),
+ Res = file:read_file(mnesia_lib:tab2dcd(Tab)),
+ mnesia_lib:unlock_table(Tab),
+ case Res of
+ {ok, DatBin} -> DatBin;
+ _ -> nobin
+ end;
+dat2bin(_Tab, _LocalS, _RemoteS) ->
+ nobin.
+
+handle_exit(Pid, Reason) when node(Pid) == node() ->
+ exit(Reason);
+handle_exit(_Pid, _Reason) -> %% Not from our node, this will be handled by
+ ignore. %% mnesia_down soon.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_locker.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_locker.erl
new file mode 100644
index 0000000000..c24ccc5518
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_locker.erl
@@ -0,0 +1,1021 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_locker.erl,v 1.2 2009/07/01 15:45:40 kostis Exp $
+%%
+-module(mnesia_locker).
+
+-export([
+ get_held_locks/0,
+ get_lock_queue/0,
+ global_lock/5,
+ ixrlock/5,
+ init/1,
+ mnesia_down/2,
+ release_tid/1,
+ async_release_tid/2,
+ send_release_tid/2,
+ receive_release_tid_acc/2,
+ rlock/3,
+ rlock_table/3,
+ rwlock/3,
+ sticky_rwlock/3,
+ start/0,
+ sticky_wlock/3,
+ sticky_wlock_table/3,
+ wlock/3,
+ wlock_no_exist/4,
+ wlock_table/3
+ ]).
+
+%% sys callback functions
+-export([system_continue/3,
+ system_terminate/4,
+ system_code_change/4
+ ]).
+
+-include("mnesia.hrl").
+-import(mnesia_lib, [dbg_out/2, error/2, verbose/2]).
+
+-define(dbg(S,V), ok).
+%-define(dbg(S,V), dbg_out("~p:~p: " ++ S, [?MODULE, ?LINE] ++ V)).
+
+-define(ALL, '______WHOLETABLE_____').
+-define(STICK, '______STICK_____').
+-define(GLOBAL, '______GLOBAL_____').
+
+-record(state, {supervisor}).
+
+-record(queue, {oid, tid, op, pid, lucky}).
+
+%% mnesia_held_locks: contain {Oid, Op, Tid} entries (bag)
+-define(match_oid_held_locks(Oid), {Oid, '_', '_'}).
+%% mnesia_tid_locks: contain {Tid, Oid, Op} entries (bag)
+-define(match_oid_tid_locks(Tid), {Tid, '_', '_'}).
+%% mnesia_sticky_locks: contain {Oid, Node} entries and {Tab, Node} entries (set)
+-define(match_oid_sticky_locks(Oid),{Oid, '_'}).
+%% mnesia_lock_queue: contain {queue, Oid, Tid, Op, ReplyTo, WaitForTid} entries (ordered_set)
+-define(match_oid_lock_queue(Oid), #queue{oid=Oid, tid='_', op = '_', pid = '_', lucky = '_'}).
+%% mnesia_lock_counter: {{write, Tab}, Number} &&
+%% {{read, Tab}, Number} entries (set)
+
+start() ->
+ mnesia_monitor:start_proc(?MODULE, ?MODULE, init, [self()]).
+
+init(Parent) ->
+ register(?MODULE, self()),
+ process_flag(trap_exit, true),
+ proc_lib:init_ack(Parent, {ok, self()}),
+ loop(#state{supervisor = Parent}).
+
+val(Var) ->
+ case ?catch_val(Var) of
+ {'EXIT', _ReASoN_} -> mnesia_lib:other_val(Var, _ReASoN_);
+ _VaLuE_ -> _VaLuE_
+ end.
+
+reply(From, R) ->
+ From ! {?MODULE, node(), R}.
+
+l_request(Node, X, Store) ->
+ {?MODULE, Node} ! {self(), X},
+ l_req_rec(Node, Store).
+
+l_req_rec(Node, Store) ->
+ ?ets_insert(Store, {nodes, Node}),
+ receive
+ {?MODULE, Node, {switch, Node2, Req}} ->
+ ?ets_insert(Store, {nodes, Node2}),
+ {?MODULE, Node2} ! Req,
+ {switch, Node2, Req};
+ {?MODULE, Node, Reply} ->
+ Reply;
+ {mnesia_down, Node} ->
+ {not_granted, {node_not_running, Node}}
+ end.
+
+release_tid(Tid) ->
+ ?MODULE ! {release_tid, Tid}.
+
+async_release_tid(Nodes, Tid) ->
+ rpc:abcast(Nodes, ?MODULE, {release_tid, Tid}).
+
+send_release_tid(Nodes, Tid) ->
+ rpc:abcast(Nodes, ?MODULE, {self(), {sync_release_tid, Tid}}).
+
+receive_release_tid_acc([Node | Nodes], Tid) ->
+ receive
+ {?MODULE, Node, {tid_released, Tid}} ->
+ receive_release_tid_acc(Nodes, Tid);
+ {mnesia_down, Node} ->
+ receive_release_tid_acc(Nodes, Tid)
+ end;
+receive_release_tid_acc([], _Tid) ->
+ ok.
+
+loop(State) ->
+ receive
+ {From, {write, Tid, Oid}} ->
+ try_sticky_lock(Tid, write, From, Oid),
+ loop(State);
+
+ %% If Key == ?ALL it's a request to lock the entire table
+ %%
+
+ {From, {read, Tid, Oid}} ->
+ try_sticky_lock(Tid, read, From, Oid),
+ loop(State);
+
+ %% Really do a read, but get hold of a write lock
+ %% used by mnesia:wread(Oid).
+
+ {From, {read_write, Tid, Oid}} ->
+ try_sticky_lock(Tid, read_write, From, Oid),
+ loop(State);
+
+ %% Tid has somehow terminated, clear up everything
+ %% and pass locks on to queued processes.
+ %% This is the purpose of the mnesia_tid_locks table
+
+ {release_tid, Tid} ->
+ do_release_tid(Tid),
+ loop(State);
+
+ %% stick lock, first tries this to the where_to_read Node
+ {From, {test_set_sticky, Tid, {Tab, _} = Oid, Lock}} ->
+ case ?ets_lookup(mnesia_sticky_locks, Tab) of
+ [] ->
+ reply(From, not_stuck),
+ loop(State);
+ [{_,Node}] when Node == node() ->
+ %% Lock is stuck here, see now if we can just set
+ %% a regular write lock
+ try_lock(Tid, Lock, From, Oid),
+ loop(State);
+ [{_,Node}] ->
+ reply(From, {stuck_elsewhere, Node}),
+ loop(State)
+ end;
+
+ %% If test_set_sticky fails, we send this to all nodes
+ %% after aquiring a real write lock on Oid
+
+ {stick, {Tab, _}, N} ->
+ ?ets_insert(mnesia_sticky_locks, {Tab, N}),
+ loop(State);
+
+ %% The caller which sends this message, must have first
+ %% aquired a write lock on the entire table
+ {unstick, Tab} ->
+ ?ets_delete(mnesia_sticky_locks, Tab),
+ loop(State);
+
+ {From, {ix_read, Tid, Tab, IxKey, Pos}} ->
+ case catch mnesia_index:get_index_table(Tab, Pos) of
+ {'EXIT', _} ->
+ reply(From, {not_granted, {no_exists, Tab, {index, [Pos]}}}),
+ loop(State);
+ Index ->
+ Rk = mnesia_lib:elems(2,mnesia_index:db_get(Index, IxKey)),
+ %% list of real keys
+ case ?ets_lookup(mnesia_sticky_locks, Tab) of
+ [] ->
+ set_read_lock_on_all_keys(Tid, From,Tab,Rk,Rk,
+ []),
+ loop(State);
+ [{_,N}] when N == node() ->
+ set_read_lock_on_all_keys(Tid, From,Tab,Rk,Rk,
+ []),
+ loop(State);
+ [{_,N}] ->
+ Req = {From, {ix_read, Tid, Tab, IxKey, Pos}},
+ From ! {?MODULE, node(), {switch, N, Req}},
+ loop(State)
+ end
+ end;
+
+ {From, {sync_release_tid, Tid}} ->
+ do_release_tid(Tid),
+ reply(From, {tid_released, Tid}),
+ loop(State);
+
+ {release_remote_non_pending, Node, Pending} ->
+ release_remote_non_pending(Node, Pending),
+ mnesia_monitor:mnesia_down(?MODULE, Node),
+ loop(State);
+
+ {'EXIT', Pid, _} when Pid == State#state.supervisor ->
+ do_stop();
+
+ {system, From, Msg} ->
+ verbose("~p got {system, ~p, ~p}~n", [?MODULE, From, Msg]),
+ Parent = State#state.supervisor,
+ sys:handle_system_msg(Msg, From, Parent, ?MODULE, [], State);
+
+ Msg ->
+ error("~p got unexpected message: ~p~n", [?MODULE, Msg]),
+ loop(State)
+ end.
+
+set_lock(Tid, Oid, Op) ->
+ ?dbg("Granted ~p ~p ~p~n", [Tid,Oid,Op]),
+ ?ets_insert(mnesia_held_locks, {Oid, Op, Tid}),
+ ?ets_insert(mnesia_tid_locks, {Tid, Oid, Op}).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Acquire locks
+
+try_sticky_lock(Tid, Op, Pid, {Tab, _} = Oid) ->
+ case ?ets_lookup(mnesia_sticky_locks, Tab) of
+ [] ->
+ try_lock(Tid, Op, Pid, Oid);
+ [{_,N}] when N == node() ->
+ try_lock(Tid, Op, Pid, Oid);
+ [{_,N}] ->
+ Req = {Pid, {Op, Tid, Oid}},
+ Pid ! {?MODULE, node(), {switch, N, Req}}
+ end.
+
+try_lock(Tid, read_write, Pid, Oid) ->
+ try_lock(Tid, read_write, read, write, Pid, Oid);
+try_lock(Tid, Op, Pid, Oid) ->
+ try_lock(Tid, Op, Op, Op, Pid, Oid).
+
+try_lock(Tid, Op, SimpleOp, Lock, Pid, Oid) ->
+ case can_lock(Tid, Lock, Oid, {no, bad_luck}) of
+ yes ->
+ Reply = grant_lock(Tid, SimpleOp, Lock, Oid),
+ reply(Pid, Reply);
+ {no, Lucky} ->
+ C = #cyclic{op = SimpleOp, lock = Lock, oid = Oid, lucky = Lucky},
+ ?dbg("Rejected ~p ~p ~p ~p ~n", [Tid, Oid, Lock, Lucky]),
+ reply(Pid, {not_granted, C});
+ {queue, Lucky} ->
+ ?dbg("Queued ~p ~p ~p ~p ~n", [Tid, Oid, Lock, Lucky]),
+ %% Append to queue: Nice place for trace output
+ ?ets_insert(mnesia_lock_queue,
+ #queue{oid = Oid, tid = Tid, op = Op,
+ pid = Pid, lucky = Lucky}),
+ ?ets_insert(mnesia_tid_locks, {Tid, Oid, {queued, Op}})
+ end.
+
+grant_lock(Tid, read, Lock, {Tab, Key})
+ when Key /= ?ALL, Tab /= ?GLOBAL ->
+ case node(Tid#tid.pid) == node() of
+ true ->
+ set_lock(Tid, {Tab, Key}, Lock),
+ {granted, lookup_in_client};
+ false ->
+ case catch mnesia_lib:db_get(Tab, Key) of %% lookup as well
+ {'EXIT', _Reason} ->
+ %% Table has been deleted from this node,
+ %% restart the transaction.
+ C = #cyclic{op = read, lock = Lock, oid = {Tab, Key},
+ lucky = nowhere},
+ {not_granted, C};
+ Val ->
+ set_lock(Tid, {Tab, Key}, Lock),
+ {granted, Val}
+ end
+ end;
+grant_lock(Tid, read, Lock, Oid) ->
+ set_lock(Tid, Oid, Lock),
+ {granted, ok};
+grant_lock(Tid, write, Lock, Oid) ->
+ set_lock(Tid, Oid, Lock),
+ granted.
+
+%% 1) Impose an ordering on all transactions favour old (low tid) transactions
+%% newer (higher tid) transactions may never wait on older ones,
+%% 2) When releasing the tids from the queue always begin with youngest (high tid)
+%% because of 1) it will avoid the deadlocks.
+%% 3) TabLocks is the problem :-) They should not starve and not deadlock
+%% handle tablocks in queue as they had locks on unlocked records.
+
+can_lock(Tid, read, {Tab, Key}, AlreadyQ) when Key /= ?ALL ->
+ %% The key is bound, no need for the other BIF
+ Oid = {Tab, Key},
+ ObjLocks = ?ets_match_object(mnesia_held_locks, {Oid, write, '_'}),
+ TabLocks = ?ets_match_object(mnesia_held_locks, {{Tab, ?ALL}, write, '_'}),
+ check_lock(Tid, Oid, ObjLocks, TabLocks, yes, AlreadyQ, read);
+
+can_lock(Tid, read, Oid, AlreadyQ) -> % Whole tab
+ Tab = element(1, Oid),
+ ObjLocks = ?ets_match_object(mnesia_held_locks, {{Tab, '_'}, write, '_'}),
+ check_lock(Tid, Oid, ObjLocks, [], yes, AlreadyQ, read);
+
+can_lock(Tid, write, {Tab, Key}, AlreadyQ) when Key /= ?ALL ->
+ Oid = {Tab, Key},
+ ObjLocks = ?ets_lookup(mnesia_held_locks, Oid),
+ TabLocks = ?ets_lookup(mnesia_held_locks, {Tab, ?ALL}),
+ check_lock(Tid, Oid, ObjLocks, TabLocks, yes, AlreadyQ, write);
+
+can_lock(Tid, write, Oid, AlreadyQ) -> % Whole tab
+ Tab = element(1, Oid),
+ ObjLocks = ?ets_match_object(mnesia_held_locks, ?match_oid_held_locks({Tab, '_'})),
+ check_lock(Tid, Oid, ObjLocks, [], yes, AlreadyQ, write).
+
+%% Check held locks for conflicting locks
+check_lock(Tid, Oid, [Lock | Locks], TabLocks, X, AlreadyQ, Type) ->
+ case element(3, Lock) of
+ Tid ->
+ check_lock(Tid, Oid, Locks, TabLocks, X, AlreadyQ, Type);
+ WaitForTid when WaitForTid > Tid -> % Important order
+ check_lock(Tid, Oid, Locks, TabLocks, {queue, WaitForTid}, AlreadyQ, Type);
+ WaitForTid when Tid#tid.pid == WaitForTid#tid.pid ->
+ dbg_out("Spurious lock conflict ~w ~w: ~w -> ~w~n",
+ [Oid, Lock, Tid, WaitForTid]),
+%% check_lock(Tid, Oid, Locks, TabLocks, {queue, WaitForTid}, AlreadyQ);
+ %% BUGBUG Fix this if possible
+ {no, WaitForTid};
+ WaitForTid ->
+ {no, WaitForTid}
+ end;
+
+check_lock(_, _, [], [], X, {queue, bad_luck}, _) ->
+ X; %% The queue should be correct already no need to check it again
+
+check_lock(_, _, [], [], X = {queue, _Tid}, _AlreadyQ, _) ->
+ X;
+
+check_lock(Tid, Oid, [], [], X, AlreadyQ, Type) ->
+ {Tab, Key} = Oid,
+ if
+ Type == write ->
+ check_queue(Tid, Tab, X, AlreadyQ);
+ Key == ?ALL ->
+ %% hmm should be solvable by a clever select expr but not today...
+ check_queue(Tid, Tab, X, AlreadyQ);
+ true ->
+ %% If there is a queue on that object, read_lock shouldn't be granted
+ ObjLocks = ets:lookup(mnesia_lock_queue, Oid),
+ Greatest = max(ObjLocks),
+ case Greatest of
+ empty ->
+ check_queue(Tid, Tab, X, AlreadyQ);
+ ObjL when Tid > ObjL ->
+ {no, ObjL}; %% Starvation Preemption (write waits for read)
+ ObjL ->
+ check_queue(Tid, Tab, {queue, ObjL}, AlreadyQ)
+ end
+ end;
+
+check_lock(Tid, Oid, [], TabLocks, X, AlreadyQ, Type) ->
+ check_lock(Tid, Oid, TabLocks, [], X, AlreadyQ, Type).
+
+%% Check queue for conflicting locks
+%% Assume that all queued locks belongs to other tid's
+
+check_queue(Tid, Tab, X, AlreadyQ) ->
+ TabLocks = ets:lookup(mnesia_lock_queue, {Tab,?ALL}),
+ Greatest = max(TabLocks),
+ case Greatest of
+ empty ->
+ X;
+ Tid ->
+ X;
+ WaitForTid when WaitForTid#queue.tid > Tid -> % Important order
+ {queue, WaitForTid};
+ WaitForTid ->
+ case AlreadyQ of
+ {no, bad_luck} -> {no, WaitForTid};
+ _ ->
+ erlang:error({mnesia_locker, assert, AlreadyQ})
+ end
+ end.
+
+max([]) ->
+ empty;
+max([H|R]) ->
+ max(R, H#queue.tid).
+
+max([H|R], Tid) when H#queue.tid > Tid ->
+ max(R, H#queue.tid);
+max([_|R], Tid) ->
+ max(R, Tid);
+max([], Tid) ->
+ Tid.
+
+%% We can't queue the ixlock requests since it
+%% becomes to complivated for little me :-)
+%% If we encounter an object with a wlock we reject the
+%% entire lock request
+%%
+%% BUGBUG: this is actually a bug since we may starve
+
+set_read_lock_on_all_keys(Tid, From, Tab, [RealKey | Tail], Orig, Ack) ->
+ Oid = {Tab, RealKey},
+ case can_lock(Tid, read, Oid, {no, bad_luck}) of
+ yes ->
+ {granted, Val} = grant_lock(Tid, read, read, Oid),
+ case opt_lookup_in_client(Val, Oid, read) of % Ought to be invoked
+ C when record(C, cyclic) -> % in the client
+ reply(From, {not_granted, C});
+ Val2 ->
+ Ack2 = lists:append(Val2, Ack),
+ set_read_lock_on_all_keys(Tid, From, Tab, Tail, Orig, Ack2)
+ end;
+ {no, Lucky} ->
+ C = #cyclic{op = read, lock = read, oid = Oid, lucky = Lucky},
+ reply(From, {not_granted, C});
+ {queue, Lucky} ->
+ C = #cyclic{op = read, lock = read, oid = Oid, lucky = Lucky},
+ reply(From, {not_granted, C})
+ end;
+set_read_lock_on_all_keys(_Tid, From, _Tab, [], Orig, Ack) ->
+ reply(From, {granted, Ack, Orig}).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Release of locks
+
+%% Release remote non-pending nodes
+release_remote_non_pending(Node, Pending) ->
+ %% Clear the mnesia_sticky_locks table first, to avoid
+ %% unnecessary requests to the failing node
+ ?ets_match_delete(mnesia_sticky_locks, {'_' , Node}),
+
+ %% Then we have to release all locks held by processes
+ %% running at the failed node and also simply remove all
+ %% queue'd requests back to the failed node
+
+ AllTids = ?ets_match(mnesia_tid_locks, {'$1', '_', '_'}),
+ Tids = [T || [T] <- AllTids, Node == node(T#tid.pid), not lists:member(T, Pending)],
+ do_release_tids(Tids).
+
+do_release_tids([Tid | Tids]) ->
+ do_release_tid(Tid),
+ do_release_tids(Tids);
+do_release_tids([]) ->
+ ok.
+
+do_release_tid(Tid) ->
+ Locks = ?ets_lookup(mnesia_tid_locks, Tid),
+ ?dbg("Release ~p ~p ~n", [Tid, Locks]),
+ ?ets_delete(mnesia_tid_locks, Tid),
+ release_locks(Locks),
+ %% Removed queued locks which has had locks
+ UniqueLocks = keyunique(lists:sort(Locks),[]),
+ rearrange_queue(UniqueLocks).
+
+keyunique([{_Tid, Oid, _Op}|R], Acc = [{_, Oid, _}|_]) ->
+ keyunique(R, Acc);
+keyunique([H|R], Acc) ->
+ keyunique(R, [H|Acc]);
+keyunique([], Acc) ->
+ Acc.
+
+release_locks([Lock | Locks]) ->
+ release_lock(Lock),
+ release_locks(Locks);
+release_locks([]) ->
+ ok.
+
+release_lock({Tid, Oid, {queued, _}}) ->
+ ?ets_match_delete(mnesia_lock_queue,
+ #queue{oid=Oid, tid = Tid, op = '_',
+ pid = '_', lucky = '_'});
+release_lock({Tid, Oid, Op}) ->
+ if
+ Op == write ->
+ ?ets_delete(mnesia_held_locks, Oid);
+ Op == read ->
+ ?ets_match_delete(mnesia_held_locks, {Oid, Op, Tid})
+ end.
+
+rearrange_queue([{_Tid, {Tab, Key}, _} | Locks]) ->
+ if
+ Key /= ?ALL->
+ Queue =
+ ets:lookup(mnesia_lock_queue, {Tab, ?ALL}) ++
+ ets:lookup(mnesia_lock_queue, {Tab, Key}),
+ case Queue of
+ [] ->
+ ok;
+ _ ->
+ Sorted = lists:reverse(lists:keysort(#queue.tid, Queue)),
+ try_waiters_obj(Sorted)
+ end;
+ true ->
+ Pat = ?match_oid_lock_queue({Tab, '_'}),
+ Queue = ?ets_match_object(mnesia_lock_queue, Pat),
+ Sorted = lists:reverse(lists:keysort(#queue.tid, Queue)),
+ try_waiters_tab(Sorted)
+ end,
+ ?dbg("RearrQ ~p~n", [Queue]),
+ rearrange_queue(Locks);
+rearrange_queue([]) ->
+ ok.
+
+try_waiters_obj([W | Waiters]) ->
+ case try_waiter(W) of
+ queued ->
+ no;
+ _ ->
+ try_waiters_obj(Waiters)
+ end;
+try_waiters_obj([]) ->
+ ok.
+
+try_waiters_tab([W | Waiters]) ->
+ case W#queue.oid of
+ {_Tab, ?ALL} ->
+ case try_waiter(W) of
+ queued ->
+ no;
+ _ ->
+ try_waiters_tab(Waiters)
+ end;
+ Oid ->
+ case try_waiter(W) of
+ queued ->
+ Rest = key_delete_all(Oid, #queue.oid, Waiters),
+ try_waiters_tab(Rest);
+ _ ->
+ try_waiters_tab(Waiters)
+ end
+ end;
+try_waiters_tab([]) ->
+ ok.
+
+try_waiter({queue, Oid, Tid, read_write, ReplyTo, _}) ->
+ try_waiter(Oid, read_write, read, write, ReplyTo, Tid);
+try_waiter({queue, Oid, Tid, Op, ReplyTo, _}) ->
+ try_waiter(Oid, Op, Op, Op, ReplyTo, Tid).
+
+try_waiter(Oid, Op, SimpleOp, Lock, ReplyTo, Tid) ->
+ case can_lock(Tid, Lock, Oid, {queue, bad_luck}) of
+ yes ->
+ %% Delete from queue: Nice place for trace output
+ ?ets_match_delete(mnesia_lock_queue,
+ #queue{oid=Oid, tid = Tid, op = Op,
+ pid = ReplyTo, lucky = '_'}),
+ Reply = grant_lock(Tid, SimpleOp, Lock, Oid),
+ ReplyTo ! {?MODULE, node(), Reply},
+ locked;
+ {queue, _Why} ->
+ ?dbg("Keep ~p ~p ~p ~p~n", [Tid, Oid, Lock, _Why]),
+ queued; % Keep waiter in queue
+ {no, Lucky} ->
+ C = #cyclic{op = SimpleOp, lock = Lock, oid = Oid, lucky = Lucky},
+ verbose("** WARNING ** Restarted transaction, possible deadlock in lock queue ~w: cyclic = ~w~n",
+ [Tid, C]),
+ ?ets_match_delete(mnesia_lock_queue,
+ #queue{oid=Oid, tid = Tid, op = Op,
+ pid = ReplyTo, lucky = '_'}),
+ Reply = {not_granted, C},
+ ReplyTo ! {?MODULE, node(), Reply},
+ removed
+ end.
+
+key_delete_all(Key, Pos, TupleList) ->
+ key_delete_all(Key, Pos, TupleList, []).
+key_delete_all(Key, Pos, [H|T], Ack) when element(Pos, H) == Key ->
+ key_delete_all(Key, Pos, T, Ack);
+key_delete_all(Key, Pos, [H|T], Ack) ->
+ key_delete_all(Key, Pos, T, [H|Ack]);
+key_delete_all(_, _, [], Ack) ->
+ lists:reverse(Ack).
+
+
+%% ********************* end server code ********************
+%% The following code executes at the client side of a transactions
+
+mnesia_down(N, Pending) ->
+ case whereis(?MODULE) of
+ undefined ->
+ %% Takes care of mnesia_down's in early startup
+ mnesia_monitor:mnesia_down(?MODULE, N);
+ Pid ->
+ %% Syncronously call needed in order to avoid
+ %% race with mnesia_tm's coordinator processes
+ %% that may restart and acquire new locks.
+ %% mnesia_monitor ensures the sync.
+ Pid ! {release_remote_non_pending, N, Pending}
+ end.
+
+%% Aquire a write lock, but do a read, used by
+%% mnesia:wread/1
+
+rwlock(Tid, Store, Oid) ->
+ {Tab, Key} = Oid,
+ case val({Tab, where_to_read}) of
+ nowhere ->
+ mnesia:abort({no_exists, Tab});
+ Node ->
+ Lock = write,
+ case need_lock(Store, Tab, Key, Lock) of
+ yes ->
+ Ns = w_nodes(Tab),
+ Res = get_rwlocks_on_nodes(Ns, Ns, Node, Store, Tid, Oid),
+ ?ets_insert(Store, {{locks, Tab, Key}, Lock}),
+ Res;
+ no ->
+ if
+ Key == ?ALL ->
+ w_nodes(Tab);
+ Tab == ?GLOBAL ->
+ w_nodes(Tab);
+ true ->
+ dirty_rpc(Node, Tab, Key, Lock)
+ end
+ end
+ end.
+
+get_rwlocks_on_nodes([Node | Tail], Orig, Node, Store, Tid, Oid) ->
+ Op = {self(), {read_write, Tid, Oid}},
+ {?MODULE, Node} ! Op,
+ ?ets_insert(Store, {nodes, Node}),
+ add_debug(Node),
+ get_rwlocks_on_nodes(Tail, Orig, Node, Store, Tid, Oid);
+get_rwlocks_on_nodes([Node | Tail], Orig, OtherNode, Store, Tid, Oid) ->
+ Op = {self(), {write, Tid, Oid}},
+ {?MODULE, Node} ! Op,
+ add_debug(Node),
+ ?ets_insert(Store, {nodes, Node}),
+ get_rwlocks_on_nodes(Tail, Orig, OtherNode, Store, Tid, Oid);
+get_rwlocks_on_nodes([], Orig, _Node, Store, _Tid, Oid) ->
+ receive_wlocks(Orig, read_write_lock, Store, Oid).
+
+%% Return a list of nodes or abort transaction
+%% WE also insert any additional where_to_write nodes
+%% in the local store under the key == nodes
+
+w_nodes(Tab) ->
+ Nodes = ?catch_val({Tab, where_to_write}),
+ case Nodes of
+ [_ | _] -> Nodes;
+ _ -> mnesia:abort({no_exists, Tab})
+ end.
+
+%% aquire a sticky wlock, a sticky lock is a lock
+%% which remains at this node after the termination of the
+%% transaction.
+
+sticky_wlock(Tid, Store, Oid) ->
+ sticky_lock(Tid, Store, Oid, write).
+
+sticky_rwlock(Tid, Store, Oid) ->
+ sticky_lock(Tid, Store, Oid, read_write).
+
+sticky_lock(Tid, Store, {Tab, Key} = Oid, Lock) ->
+ N = val({Tab, where_to_read}),
+ if
+ node() == N ->
+ case need_lock(Store, Tab, Key, write) of
+ yes ->
+ do_sticky_lock(Tid, Store, Oid, Lock);
+ no ->
+ dirty_sticky_lock(Tab, Key, [N], Lock)
+ end;
+ true ->
+ mnesia:abort({not_local, Tab})
+ end.
+
+do_sticky_lock(Tid, Store, {Tab, Key} = Oid, Lock) ->
+ ?MODULE ! {self(), {test_set_sticky, Tid, Oid, Lock}},
+ receive
+ {?MODULE, _N, granted} ->
+ ?ets_insert(Store, {{locks, Tab, Key}, write}),
+ granted;
+ {?MODULE, _N, {granted, Val}} -> %% for rwlocks
+ case opt_lookup_in_client(Val, Oid, write) of
+ C when record(C, cyclic) ->
+ exit({aborted, C});
+ Val2 ->
+ ?ets_insert(Store, {{locks, Tab, Key}, write}),
+ Val2
+ end;
+ {?MODULE, _N, {not_granted, Reason}} ->
+ exit({aborted, Reason});
+ {?MODULE, N, not_stuck} ->
+ not_stuck(Tid, Store, Tab, Key, Oid, Lock, N),
+ dirty_sticky_lock(Tab, Key, [N], Lock);
+ {mnesia_down, N} ->
+ exit({aborted, {node_not_running, N}});
+ {?MODULE, N, {stuck_elsewhere, _N2}} ->
+ stuck_elsewhere(Tid, Store, Tab, Key, Oid, Lock),
+ dirty_sticky_lock(Tab, Key, [N], Lock)
+ end.
+
+not_stuck(Tid, Store, Tab, _Key, Oid, _Lock, N) ->
+ rlock(Tid, Store, {Tab, ?ALL}), %% needed?
+ wlock(Tid, Store, Oid), %% perfect sync
+ wlock(Tid, Store, {Tab, ?STICK}), %% max one sticker/table
+ Ns = val({Tab, where_to_write}),
+ rpc:abcast(Ns, ?MODULE, {stick, Oid, N}).
+
+stuck_elsewhere(Tid, Store, Tab, _Key, Oid, _Lock) ->
+ rlock(Tid, Store, {Tab, ?ALL}), %% needed?
+ wlock(Tid, Store, Oid), %% perfect sync
+ wlock(Tid, Store, {Tab, ?STICK}), %% max one sticker/table
+ Ns = val({Tab, where_to_write}),
+ rpc:abcast(Ns, ?MODULE, {unstick, Tab}).
+
+dirty_sticky_lock(Tab, Key, Nodes, Lock) ->
+ if
+ Lock == read_write ->
+ mnesia_lib:db_get(Tab, Key);
+ Key == ?ALL ->
+ Nodes;
+ Tab == ?GLOBAL ->
+ Nodes;
+ true ->
+ ok
+ end.
+
+sticky_wlock_table(Tid, Store, Tab) ->
+ sticky_lock(Tid, Store, {Tab, ?ALL}, write).
+
+%% aquire a wlock on Oid
+%% We store a {Tabname, write, Tid} in all locktables
+%% on all nodes containing a copy of Tabname
+%% We also store an item {{locks, Tab, Key}, write} in the
+%% local store when we have aquired the lock.
+%%
+wlock(Tid, Store, Oid) ->
+ {Tab, Key} = Oid,
+ case need_lock(Store, Tab, Key, write) of
+ yes ->
+ Ns = w_nodes(Tab),
+ Op = {self(), {write, Tid, Oid}},
+ ?ets_insert(Store, {{locks, Tab, Key}, write}),
+ get_wlocks_on_nodes(Ns, Ns, Store, Op, Oid);
+ no when Key /= ?ALL, Tab /= ?GLOBAL ->
+ [];
+ no ->
+ w_nodes(Tab)
+ end.
+
+wlock_table(Tid, Store, Tab) ->
+ wlock(Tid, Store, {Tab, ?ALL}).
+
+%% Write lock even if the table does not exist
+
+wlock_no_exist(Tid, Store, Tab, Ns) ->
+ Oid = {Tab, ?ALL},
+ Op = {self(), {write, Tid, Oid}},
+ get_wlocks_on_nodes(Ns, Ns, Store, Op, Oid).
+
+need_lock(Store, Tab, Key, LockPattern) ->
+ TabL = ?ets_match_object(Store, {{locks, Tab, ?ALL}, LockPattern}),
+ if
+ TabL == [] ->
+ KeyL = ?ets_match_object(Store, {{locks, Tab, Key}, LockPattern}),
+ if
+ KeyL == [] ->
+ yes;
+ true ->
+ no
+ end;
+ true ->
+ no
+ end.
+
+add_debug(Node) -> % Use process dictionary for debug info
+ case get(mnesia_wlock_nodes) of
+ undefined ->
+ put(mnesia_wlock_nodes, [Node]);
+ NodeList ->
+ put(mnesia_wlock_nodes, [Node|NodeList])
+ end.
+
+del_debug(Node) ->
+ case get(mnesia_wlock_nodes) of
+ undefined -> % Shouldn't happen
+ ignore;
+ [Node] ->
+ erase(mnesia_wlock_nodes);
+ List ->
+ put(mnesia_wlock_nodes, lists:delete(Node, List))
+ end.
+
+%% We first send lock requests to the lockmanagers on all
+%% nodes holding a copy of the table
+
+get_wlocks_on_nodes([Node | Tail], Orig, Store, Request, Oid) ->
+ {?MODULE, Node} ! Request,
+ ?ets_insert(Store, {nodes, Node}),
+ add_debug(Node),
+ get_wlocks_on_nodes(Tail, Orig, Store, Request, Oid);
+get_wlocks_on_nodes([], Orig, Store, _Request, Oid) ->
+ receive_wlocks(Orig, Orig, Store, Oid).
+
+receive_wlocks([Node | Tail], Res, Store, Oid) ->
+ receive
+ {?MODULE, Node, granted} ->
+ del_debug(Node),
+ receive_wlocks(Tail, Res, Store, Oid);
+ {?MODULE, Node, {granted, Val}} -> %% for rwlocks
+ del_debug(Node),
+ case opt_lookup_in_client(Val, Oid, write) of
+ C when record(C, cyclic) ->
+ flush_remaining(Tail, Node, {aborted, C});
+ Val2 ->
+ receive_wlocks(Tail, Val2, Store, Oid)
+ end;
+ {?MODULE, Node, {not_granted, Reason}} ->
+ del_debug(Node),
+ Reason1 = {aborted, Reason},
+ flush_remaining(Tail, Node, Reason1);
+ {mnesia_down, Node} ->
+ del_debug(Node),
+ Reason1 = {aborted, {node_not_running, Node}},
+ flush_remaining(Tail, Node, Reason1);
+ {?MODULE, Node, {switch, Node2, Req}} -> %% for rwlocks
+ del_debug(Node),
+ add_debug(Node2),
+ ?ets_insert(Store, {nodes, Node2}),
+ {?MODULE, Node2} ! Req,
+ receive_wlocks([Node2 | Tail], Res, Store, Oid)
+ end;
+
+receive_wlocks([], Res, _Store, _Oid) ->
+ Res.
+
+flush_remaining([], _SkipNode, Res) ->
+ exit(Res);
+flush_remaining([SkipNode | Tail ], SkipNode, Res) ->
+ del_debug(SkipNode),
+ flush_remaining(Tail, SkipNode, Res);
+flush_remaining([Node | Tail], SkipNode, Res) ->
+ receive
+ {?MODULE, Node, _} ->
+ del_debug(Node),
+ flush_remaining(Tail, SkipNode, Res);
+ {mnesia_down, Node} ->
+ del_debug(Node),
+ flush_remaining(Tail, SkipNode, {aborted, {node_not_running, Node}})
+ end.
+
+opt_lookup_in_client(lookup_in_client, Oid, Lock) ->
+ {Tab, Key} = Oid,
+ case catch mnesia_lib:db_get(Tab, Key) of
+ {'EXIT', _} ->
+ %% Table has been deleted from this node,
+ %% restart the transaction.
+ #cyclic{op = read, lock = Lock, oid = Oid, lucky = nowhere};
+ Val ->
+ Val
+ end;
+opt_lookup_in_client(Val, _Oid, _Lock) ->
+ Val.
+
+return_granted_or_nodes({_, ?ALL} , Nodes) -> Nodes;
+return_granted_or_nodes({?GLOBAL, _}, Nodes) -> Nodes;
+return_granted_or_nodes(_ , _Nodes) -> granted.
+
+%% We store a {Tab, read, From} item in the
+%% locks table on the node where we actually do pick up the object
+%% and we also store an item {lock, Oid, read} in our local store
+%% so that we can release any locks we hold when we commit.
+%% This function not only aquires a read lock, but also reads the object
+
+%% Oid's are always {Tab, Key} tuples
+rlock(Tid, Store, Oid) ->
+ {Tab, Key} = Oid,
+ case val({Tab, where_to_read}) of
+ nowhere ->
+ mnesia:abort({no_exists, Tab});
+ Node ->
+ case need_lock(Store, Tab, Key, '_') of
+ yes ->
+ R = l_request(Node, {read, Tid, Oid}, Store),
+ rlock_get_reply(Node, Store, Oid, R);
+ no ->
+ if
+ Key == ?ALL ->
+ [Node];
+ Tab == ?GLOBAL ->
+ [Node];
+ true ->
+ dirty_rpc(Node, Tab, Key, read)
+ end
+ end
+ end.
+
+dirty_rpc(nowhere, Tab, Key, _Lock) ->
+ mnesia:abort({no_exists, {Tab, Key}});
+dirty_rpc(Node, _Tab, ?ALL, _Lock) ->
+ [Node];
+dirty_rpc(Node, ?GLOBAL, _Key, _Lock) ->
+ [Node];
+dirty_rpc(Node, Tab, Key, Lock) ->
+ Args = [Tab, Key],
+ case rpc:call(Node, mnesia_lib, db_get, Args) of
+ {badrpc, Reason} ->
+ case val({Tab, where_to_read}) of
+ Node ->
+ ErrorTag = mnesia_lib:dirty_rpc_error_tag(Reason),
+ mnesia:abort({ErrorTag, Args});
+ _NewNode ->
+ %% Table has been deleted from the node,
+ %% restart the transaction.
+ C = #cyclic{op = read, lock = Lock, oid = {Tab, Key}, lucky = nowhere},
+ exit({aborted, C})
+ end;
+ Other ->
+ Other
+ end.
+
+rlock_get_reply(Node, Store, Oid, {granted, V}) ->
+ {Tab, Key} = Oid,
+ ?ets_insert(Store, {{locks, Tab, Key}, read}),
+ ?ets_insert(Store, {nodes, Node}),
+ case opt_lookup_in_client(V, Oid, read) of
+ C when record(C, cyclic) ->
+ mnesia:abort(C);
+ Val ->
+ Val
+ end;
+rlock_get_reply(Node, Store, Oid, granted) ->
+ {Tab, Key} = Oid,
+ ?ets_insert(Store, {{locks, Tab, Key}, read}),
+ ?ets_insert(Store, {nodes, Node}),
+ return_granted_or_nodes(Oid, [Node]);
+rlock_get_reply(Node, Store, Tab, {granted, V, RealKeys}) ->
+ L = fun(K) -> ?ets_insert(Store, {{locks, Tab, K}, read}) end,
+ lists:foreach(L, RealKeys),
+ ?ets_insert(Store, {nodes, Node}),
+ V;
+rlock_get_reply(_Node, _Store, _Oid, {not_granted , Reason}) ->
+ exit({aborted, Reason});
+
+rlock_get_reply(_Node, Store, Oid, {switch, N2, Req}) ->
+ ?ets_insert(Store, {nodes, N2}),
+ {?MODULE, N2} ! Req,
+ rlock_get_reply(N2, Store, Oid, l_req_rec(N2, Store)).
+
+
+rlock_table(Tid, Store, Tab) ->
+ rlock(Tid, Store, {Tab, ?ALL}).
+
+ixrlock(Tid, Store, Tab, IxKey, Pos) ->
+ case val({Tab, where_to_read}) of
+ nowhere ->
+ mnesia:abort({no_exists, Tab});
+ Node ->
+ R = l_request(Node, {ix_read, Tid, Tab, IxKey, Pos}, Store),
+ rlock_get_reply(Node, Store, Tab, R)
+ end.
+
+%% Grabs the locks or exits
+global_lock(Tid, Store, Item, write, Ns) ->
+ Oid = {?GLOBAL, Item},
+ Op = {self(), {write, Tid, Oid}},
+ get_wlocks_on_nodes(Ns, Ns, Store, Op, Oid);
+global_lock(Tid, Store, Item, read, Ns) ->
+ Oid = {?GLOBAL, Item},
+ send_requests(Ns, {read, Tid, Oid}),
+ rec_requests(Ns, Oid, Store),
+ Ns.
+
+send_requests([Node | Nodes], X) ->
+ {?MODULE, Node} ! {self(), X},
+ send_requests(Nodes, X);
+send_requests([], _X) ->
+ ok.
+
+rec_requests([Node | Nodes], Oid, Store) ->
+ Res = l_req_rec(Node, Store),
+ case catch rlock_get_reply(Node, Store, Oid, Res) of
+ {'EXIT', Reason} ->
+ flush_remaining(Nodes, Node, Reason);
+ _ ->
+ rec_requests(Nodes, Oid, Store)
+ end;
+rec_requests([], _Oid, _Store) ->
+ ok.
+
+get_held_locks() ->
+ ?ets_match_object(mnesia_held_locks, '_').
+
+get_lock_queue() ->
+ Q = ?ets_match_object(mnesia_lock_queue, '_'),
+ [{Oid, Op, Pid, Tid, WFT} || {queue, Oid, Tid, Op, Pid, WFT} <- Q].
+
+do_stop() ->
+ exit(shutdown).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% System upgrade
+
+system_continue(_Parent, _Debug, State) ->
+ loop(State).
+
+system_terminate(_Reason, _Parent, _Debug, _State) ->
+ do_stop().
+
+system_code_change(State, _Module, _OldVsn, _Extra) ->
+ {ok, State}.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_log.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_log.erl
new file mode 100644
index 0000000000..47e8be32c0
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_log.erl
@@ -0,0 +1,1019 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_log.erl,v 1.2 2009/07/01 15:45:40 kostis Exp $
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% This module administers three kinds of log files:
+%%
+%% 1 The transaction log
+%% mnesia_tm appends to the log (via mnesia_log) at the
+%% end of each transaction (or dirty write) and
+%% mnesia_dumper reads the log and performs the ops in
+%% the dat files. The dump_log is done at startup and
+%% at intervals controlled by the user.
+%%
+%% 2 The mnesia_down log
+%% mnesia_tm appends to the log (via mnesia_log) when it
+%% realizes that mnesia goes up or down on another node.
+%% mnesia_init reads the log (via mnesia_log) at startup.
+%%
+%% 3 The backup log
+%% mnesia_schema produces one tiny log when the schema is
+%% initially created. mnesia_schema also reads the log
+%% when the user wants tables (possibly incl the schema)
+%% to be restored. mnesia_log appends to the log when the
+%% user wants to produce a real backup.
+%%
+%% The actual access to the backup media is performed via the
+%% mnesia_backup module for both read and write. mnesia_backup
+%% uses the disk_log (*), BUT the user may write an own module
+%% with the same interface as mnesia_backup and configure
+%% Mnesia so the alternate module performs the actual accesses
+%% to the backup media. This means that the user may put the
+%% backup on medias that Mnesia does not know about possibly on
+%% hosts where Erlang is not running.
+%%
+%% All these logs have to some extent a common structure.
+%% They are all using the disk_log module (*) for the basic
+%% file structure. The disk_log has a repair feature that
+%% can be used to skip erroneous log records if one comes to
+%% the conclusion that it is more important to reuse some
+%% of the log records than the risque of obtaining inconsistent
+%% data. If the data becomes inconsistent it is solely up to the
+%% application to make it consistent again. The automatic
+%% reparation of the disk_log is very powerful, but use it
+%% with extreme care.
+%%
+%% First in all Mnesia's log file is a mnesia log header.
+%% It contains a list with a log_header record as single
+%% element. The structure of the log_header may never be
+%% changed since it may be written to very old backup files.
+%% By holding this record definition stable we can be
+%% able to comprahend backups from timepoint 0. It also
+%% allows us to use the backup format as an interchange
+%% format between Mnesia releases.
+%%
+%% An op-list is a list of tuples with arity 3. Each tuple
+%% has this structure: {Oid, Recs, Op} where Oid is the tuple
+%% {Tab, Key}, Recs is a (possibly empty) list of records and
+%% Op is an atom.
+%%
+%% The log file structure for the transaction log is as follows.
+%%
+%% After the mnesia log section follows an extended record section
+%% containing op-lists. There are several values that Op may
+%% have, such as write, delete, update_counter, delete_object,
+%% and replace. There is no special end of section marker.
+%%
+%% +-----------------+
+%% | mnesia log head |
+%% +-----------------+
+%% | extended record |
+%% | section |
+%% +-----------------+
+%%
+%% The log file structure for the mnesia_down log is as follows.
+%%
+%% After the mnesia log section follows a mnesia_down section
+%% containg lists with yoyo records as single element.
+%%
+%% +-----------------+
+%% | mnesia log head |
+%% +-----------------+
+%% | mnesia_down |
+%% | section |
+%% +-----------------+
+%%
+%% The log file structure for the backup log is as follows.
+%%
+%% After the mnesia log section follows a schema section
+%% containing record lists. A record list is a list of tuples
+%% where {schema, Tab} is interpreted as a delete_table(Tab) and
+%% {schema, Tab, CreateList} are interpreted as create_table.
+%%
+%% The record section also contains record lists. In this section
+%% {Tab, Key} is interpreted as delete({Tab, Key}) and other tuples
+%% as write(Tuple). There is no special end of section marker.
+%%
+%% +-----------------+
+%% | mnesia log head |
+%% +-----------------+
+%% | schema section |
+%% +-----------------+
+%% | record section |
+%% +-----------------+
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-module(mnesia_log).
+
+-export([
+ append/2,
+ backup/1,
+ backup/2,
+ backup_checkpoint/2,
+ backup_checkpoint/3,
+ backup_log_header/0,
+ backup_master/2,
+ chunk_decision_log/1,
+ chunk_decision_tab/1,
+ chunk_log/1,
+ chunk_log/2,
+ close_decision_log/0,
+ close_decision_tab/0,
+ close_log/1,
+ unsafe_close_log/1,
+ confirm_log_dump/1,
+ confirm_decision_log_dump/0,
+ previous_log_file/0,
+ previous_decision_log_file/0,
+ latest_log_file/0,
+ decision_log_version/0,
+ decision_log_file/0,
+ decision_tab_file/0,
+ decision_tab_version/0,
+ dcl_version/0,
+ dcd_version/0,
+ ets2dcd/1,
+ ets2dcd/2,
+ dcd2ets/1,
+ dcd2ets/2,
+ init/0,
+ init_log_dump/0,
+ log/1,
+ slog/1,
+ log_decision/1,
+ log_files/0,
+ open_decision_log/0,
+ trans_log_header/0,
+ open_decision_tab/0,
+ dcl_log_header/0,
+ dcd_log_header/0,
+ open_log/4,
+ open_log/6,
+ prepare_decision_log_dump/0,
+ prepare_log_dump/1,
+ save_decision_tab/1,
+ purge_all_logs/0,
+ purge_some_logs/0,
+ stop/0,
+ tab_copier/3,
+ version/0,
+ view/0,
+ view/1,
+ write_trans_log_header/0
+ ]).
+
+
+-include("mnesia.hrl").
+-import(mnesia_lib, [val/1, dir/1]).
+-import(mnesia_lib, [exists/1, fatal/2, error/2, dbg_out/2]).
+
+trans_log_header() -> log_header(trans_log, version()).
+backup_log_header() -> log_header(backup_log, "1.2").
+decision_log_header() -> log_header(decision_log, decision_log_version()).
+decision_tab_header() -> log_header(decision_tab, decision_tab_version()).
+dcl_log_header() -> log_header(dcl_log, dcl_version()).
+dcd_log_header() -> log_header(dcd_log, dcd_version()).
+
+log_header(Kind, Version) ->
+ #log_header{log_version=Version,
+ log_kind=Kind,
+ mnesia_version=mnesia:system_info(version),
+ node=node(),
+ now=now()}.
+
+version() -> "4.3".
+
+decision_log_version() -> "3.0".
+
+decision_tab_version() -> "1.0".
+
+dcl_version() -> "1.0".
+dcd_version() -> "1.0".
+
+append(Log, Bin) when binary(Bin) ->
+ disk_log:balog(Log, Bin);
+append(Log, Term) ->
+ disk_log:alog(Log, Term).
+
+%% Synced append
+sappend(Log, Bin) when binary(Bin) ->
+ ok = disk_log:blog(Log, Bin);
+sappend(Log, Term) ->
+ ok = disk_log:log(Log, Term).
+
+%% Write commit records to the latest_log
+log(C) when C#commit.disc_copies == [],
+ C#commit.disc_only_copies == [],
+ C#commit.schema_ops == [] ->
+ ignore;
+log(C) ->
+ case mnesia_monitor:use_dir() of
+ true ->
+ if
+ record(C, commit) ->
+ C2 = C#commit{ram_copies = [], snmp = []},
+ append(latest_log, C2);
+ true ->
+ %% Either a commit record as binary
+ %% or some decision related info
+ append(latest_log, C)
+ end,
+ mnesia_dumper:incr_log_writes();
+ false ->
+ ignore
+ end.
+
+%% Synced
+
+slog(C) when C#commit.disc_copies == [],
+ C#commit.disc_only_copies == [],
+ C#commit.schema_ops == [] ->
+ ignore;
+slog(C) ->
+ case mnesia_monitor:use_dir() of
+ true ->
+ if
+ record(C, commit) ->
+ C2 = C#commit{ram_copies = [], snmp = []},
+ sappend(latest_log, C2);
+ true ->
+ %% Either a commit record as binary
+ %% or some decision related info
+ sappend(latest_log, C)
+ end,
+ mnesia_dumper:incr_log_writes();
+ false ->
+ ignore
+ end.
+
+
+%% Stuff related to the file LOG
+
+%% Returns a list of logfiles. The oldest is first.
+log_files() -> [previous_log_file(),
+ latest_log_file(),
+ decision_tab_file()
+ ].
+
+latest_log_file() -> dir(latest_log_name()).
+
+previous_log_file() -> dir("PREVIOUS.LOG").
+
+decision_log_file() -> dir(decision_log_name()).
+
+decision_tab_file() -> dir(decision_tab_name()).
+
+previous_decision_log_file() -> dir("PDECISION.LOG").
+
+latest_log_name() -> "LATEST.LOG".
+
+decision_log_name() -> "DECISION.LOG".
+
+decision_tab_name() -> "DECISION_TAB.LOG".
+
+init() ->
+ case mnesia_monitor:use_dir() of
+ true ->
+ Prev = previous_log_file(),
+ verify_no_exists(Prev),
+
+ Latest = latest_log_file(),
+ verify_no_exists(Latest),
+
+ Header = trans_log_header(),
+ open_log(latest_log, Header, Latest);
+ false ->
+ ok
+ end.
+
+verify_no_exists(Fname) ->
+ case exists(Fname) of
+ false ->
+ ok;
+ true ->
+ fatal("Log file exists: ~p~n", [Fname])
+ end.
+
+open_log(Name, Header, Fname) ->
+ Exists = exists(Fname),
+ open_log(Name, Header, Fname, Exists).
+
+open_log(Name, Header, Fname, Exists) ->
+ Repair = mnesia_monitor:get_env(auto_repair),
+ open_log(Name, Header, Fname, Exists, Repair).
+
+open_log(Name, Header, Fname, Exists, Repair) ->
+ case Name == previous_log of
+ true ->
+ open_log(Name, Header, Fname, Exists, Repair, read_only);
+ false ->
+ open_log(Name, Header, Fname, Exists, Repair, read_write)
+ end.
+
+open_log(Name, Header, Fname, Exists, Repair, Mode) ->
+ Args = [{file, Fname}, {name, Name}, {repair, Repair}, {mode, Mode}],
+%% io:format("~p:open_log: ~p ~p~n", [?MODULE, Name, Fname]),
+ case mnesia_monitor:open_log(Args) of
+ {ok, Log} when Exists == true ->
+ Log;
+ {ok, Log} ->
+ write_header(Log, Header),
+ Log;
+ {repaired, Log, _, {badbytes, 0}} when Exists == true ->
+ Log;
+ {repaired, Log, _, {badbytes, 0}} ->
+ write_header(Log, Header),
+ Log;
+ {repaired, Log, _Recover, BadBytes} ->
+ mnesia_lib:important("Data may be missing, log ~p repaired: Lost ~p bytes~n",
+ [Fname, BadBytes]),
+ Log;
+ {error, Reason} when Repair == true ->
+ file:delete(Fname),
+ mnesia_lib:important("Data may be missing, Corrupt logfile deleted: ~p, ~p ~n",
+ [Fname, Reason]),
+ %% Create a new
+ open_log(Name, Header, Fname, false, false, read_write);
+ {error, Reason} ->
+ fatal("Cannot open log file ~p: ~p~n", [Fname, Reason])
+ end.
+
+write_header(Log, Header) ->
+ append(Log, Header).
+
+write_trans_log_header() ->
+ write_header(latest_log, trans_log_header()).
+
+stop() ->
+ case mnesia_monitor:use_dir() of
+ true ->
+ close_log(latest_log);
+ false ->
+ ok
+ end.
+
+close_log(Log) ->
+%% io:format("mnesia_log:close_log ~p~n", [Log]),
+%% io:format("mnesia_log:close_log ~p~n", [Log]),
+ case disk_log:sync(Log) of
+ ok -> ok;
+ {error, {read_only_mode, Log}} ->
+ ok;
+ {error, Reason} ->
+ mnesia_lib:important("Failed syncing ~p to_disk reason ~p ~n",
+ [Log, Reason])
+ end,
+ mnesia_monitor:close_log(Log).
+
+unsafe_close_log(Log) ->
+%% io:format("mnesia_log:close_log ~p~n", [Log]),
+ mnesia_monitor:unsafe_close_log(Log).
+
+
+purge_some_logs() ->
+ mnesia_monitor:unsafe_close_log(latest_log),
+ file:delete(latest_log_file()),
+ file:delete(decision_tab_file()).
+
+purge_all_logs() ->
+ file:delete(previous_log_file()),
+ file:delete(latest_log_file()),
+ file:delete(decision_tab_file()).
+
+%% Prepare dump by renaming the open logfile if possible
+%% Returns a tuple on the following format: {Res, OpenLog}
+%% where OpenLog is the file descriptor to log file, ready for append
+%% and Res is one of the following: already_dumped, needs_dump or {error, Reason}
+prepare_log_dump(InitBy) ->
+ Diff = mnesia_dumper:get_log_writes() -
+ mnesia_lib:read_counter(trans_log_writes_prev),
+ if
+ Diff == 0, InitBy /= startup ->
+ already_dumped;
+ true ->
+ case mnesia_monitor:use_dir() of
+ true ->
+ Prev = previous_log_file(),
+ prepare_prev(Diff, InitBy, Prev, exists(Prev));
+ false ->
+ already_dumped
+ end
+ end.
+
+prepare_prev(Diff, _, _, true) ->
+ {needs_dump, Diff};
+prepare_prev(Diff, startup, Prev, false) ->
+ Latest = latest_log_file(),
+ case exists(Latest) of
+ true ->
+ case file:rename(Latest, Prev) of
+ ok ->
+ {needs_dump, Diff};
+ {error, Reason} ->
+ {error, Reason}
+ end;
+ false ->
+ already_dumped
+ end;
+prepare_prev(Diff, _InitBy, Prev, false) ->
+ Head = trans_log_header(),
+ case mnesia_monitor:reopen_log(latest_log, Prev, Head) of
+ ok ->
+ {needs_dump, Diff};
+ {error, Reason} ->
+ Latest = latest_log_file(),
+ {error, {"Cannot rename log file",
+ [Latest, Prev, Reason]}}
+ end.
+
+%% Init dump and return PrevLogFileDesc or exit.
+init_log_dump() ->
+ Fname = previous_log_file(),
+ open_log(previous_log, trans_log_header(), Fname),
+ start.
+
+
+chunk_log(Cont) ->
+ chunk_log(previous_log, Cont).
+
+chunk_log(_Log, eof) ->
+ eof;
+chunk_log(Log, Cont) ->
+ case catch disk_log:chunk(Log, Cont) of
+ {error, Reason} ->
+ fatal("Possibly truncated ~p file: ~p~n",
+ [Log, Reason]);
+ {C2, Chunk, _BadBytes} ->
+ %% Read_only case, should we warn about the bad log file?
+ %% BUGBUG Should we crash if Repair == false ??
+ %% We got to check this !!
+ mnesia_lib:important("~p repaired, lost ~p bad bytes~n", [Log, _BadBytes]),
+ {C2, Chunk};
+ Other ->
+ Other
+ end.
+
+%% Confirms the dump by closing prev log and delete the file
+confirm_log_dump(Updates) ->
+ case mnesia_monitor:close_log(previous_log) of
+ ok ->
+ file:delete(previous_log_file()),
+ mnesia_lib:incr_counter(trans_log_writes_prev, Updates),
+ dumped;
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Decision log
+
+open_decision_log() ->
+ Latest = decision_log_file(),
+ open_log(decision_log, decision_log_header(), Latest),
+ start.
+
+prepare_decision_log_dump() ->
+ Prev = previous_decision_log_file(),
+ prepare_decision_log_dump(exists(Prev), Prev).
+
+prepare_decision_log_dump(false, Prev) ->
+ Head = decision_log_header(),
+ case mnesia_monitor:reopen_log(decision_log, Prev, Head) of
+ ok ->
+ prepare_decision_log_dump(true, Prev);
+ {error, Reason} ->
+ fatal("Cannot rename decision log file ~p -> ~p: ~p~n",
+ [decision_log_file(), Prev, Reason])
+ end;
+prepare_decision_log_dump(true, Prev) ->
+ open_log(previous_decision_log, decision_log_header(), Prev),
+ start.
+
+chunk_decision_log(Cont) ->
+ %% dbg_out("chunk log ~p~n", [Cont]),
+ chunk_log(previous_decision_log, Cont).
+
+%% Confirms dump of the decision log
+confirm_decision_log_dump() ->
+ case mnesia_monitor:close_log(previous_decision_log) of
+ ok ->
+ file:delete(previous_decision_log_file());
+ {error, Reason} ->
+ fatal("Cannot confirm decision log dump: ~p~n",
+ [Reason])
+ end.
+
+save_decision_tab(Decisions) ->
+ Log = decision_tab,
+ Tmp = mnesia_lib:dir("DECISION_TAB.TMP"),
+ file:delete(Tmp),
+ open_log(Log, decision_tab_header(), Tmp),
+ append(Log, Decisions),
+ close_log(Log),
+ TabFile = decision_tab_file(),
+ ok = file:rename(Tmp, TabFile).
+
+open_decision_tab() ->
+ TabFile = decision_tab_file(),
+ open_log(decision_tab, decision_tab_header(), TabFile),
+ start.
+
+close_decision_tab() ->
+ close_log(decision_tab).
+
+chunk_decision_tab(Cont) ->
+ %% dbg_out("chunk tab ~p~n", [Cont]),
+ chunk_log(decision_tab, Cont).
+
+close_decision_log() ->
+ close_log(decision_log).
+
+log_decision(Decision) ->
+ append(decision_log, Decision).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Debug functions
+
+view() ->
+ lists:foreach(fun(F) -> view(F) end, log_files()).
+
+view(File) ->
+ mnesia_lib:show("***** ~p ***** ~n", [File]),
+ case exists(File) of
+ false ->
+ nolog;
+ true ->
+ N = view_only,
+ Args = [{file, File}, {name, N}, {mode, read_only}],
+ case disk_log:open(Args) of
+ {ok, N} ->
+ view_file(start, N);
+ {repaired, _, _, _} ->
+ view_file(start, N);
+ {error, Reason} ->
+ error("Cannot open log ~p: ~p~n", [File, Reason])
+ end
+ end.
+
+view_file(C, Log) ->
+ case disk_log:chunk(Log, C) of
+ {error, Reason} ->
+ error("** Possibly truncated FILE ~p~n", [Reason]),
+ error;
+ eof ->
+ disk_log:close(Log),
+ eof;
+ {C2, Terms, _BadBytes} ->
+ dbg_out("Lost ~p bytes in ~p ~n", [_BadBytes, Log]),
+ lists:foreach(fun(X) -> mnesia_lib:show("~p~n", [X]) end,
+ Terms),
+ view_file(C2, Log);
+ {C2, Terms} ->
+ lists:foreach(fun(X) -> mnesia_lib:show("~p~n", [X]) end,
+ Terms),
+ view_file(C2, Log)
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Backup
+
+-record(backup_args, {name, module, opaque, scope, prev_name, tables, cookie}).
+
+backup(Opaque) ->
+ backup(Opaque, []).
+
+backup(Opaque, Mod) when atom(Mod) ->
+ backup(Opaque, [{module, Mod}]);
+backup(Opaque, Args) when list(Args) ->
+ %% Backup all tables with max redundancy
+ CpArgs = [{ram_overrides_dump, false}, {max, val({schema, tables})}],
+ case mnesia_checkpoint:activate(CpArgs) of
+ {ok, Name, _Nodes} ->
+ Res = backup_checkpoint(Name, Opaque, Args),
+ mnesia_checkpoint:deactivate(Name),
+ Res;
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+backup_checkpoint(Name, Opaque) ->
+ backup_checkpoint(Name, Opaque, []).
+
+backup_checkpoint(Name, Opaque, Mod) when atom(Mod) ->
+ backup_checkpoint(Name, Opaque, [{module, Mod}]);
+backup_checkpoint(Name, Opaque, Args) when list(Args) ->
+ DefaultMod = mnesia_monitor:get_env(backup_module),
+ B = #backup_args{name = Name,
+ module = DefaultMod,
+ opaque = Opaque,
+ scope = global,
+ tables = all,
+ prev_name = Name},
+ case check_backup_args(Args, B) of
+ {ok, B2} ->
+ %% Decentralized backup
+ %% Incremental
+
+ Self = self(),
+ Pid = spawn_link(?MODULE, backup_master, [Self, B2]),
+ receive
+ {Pid, Self, Res} -> Res
+ end;
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+check_backup_args([Arg | Tail], B) ->
+ case catch check_backup_arg_type(Arg, B) of
+ {'EXIT', _Reason} ->
+ {error, {badarg, Arg}};
+ B2 ->
+ check_backup_args(Tail, B2)
+ end;
+
+check_backup_args([], B) ->
+ {ok, B}.
+
+check_backup_arg_type(Arg, B) ->
+ case Arg of
+ {scope, global} ->
+ B#backup_args{scope = global};
+ {scope, local} ->
+ B#backup_args{scope = local};
+ {module, Mod} ->
+ Mod2 = mnesia_monitor:do_check_type(backup_module, Mod),
+ B#backup_args{module = Mod2};
+ {incremental, Name} ->
+ B#backup_args{prev_name = Name};
+ {tables, Tabs} when list(Tabs) ->
+ B#backup_args{tables = Tabs}
+ end.
+
+backup_master(ClientPid, B) ->
+ process_flag(trap_exit, true),
+ case catch do_backup_master(B) of
+ {'EXIT', Reason} ->
+ ClientPid ! {self(), ClientPid, {error, {'EXIT', Reason}}};
+ Res ->
+ ClientPid ! {self(), ClientPid, Res}
+ end,
+ unlink(ClientPid),
+ exit(normal).
+
+do_backup_master(B) ->
+ Name = B#backup_args.name,
+ B2 = safe_apply(B, open_write, [B#backup_args.opaque]),
+ B3 = safe_write(B2, [backup_log_header()]),
+ case mnesia_checkpoint:tables_and_cookie(Name) of
+ {ok, AllTabs, Cookie} ->
+ Tabs = select_tables(AllTabs, B3),
+ B4 = B3#backup_args{cookie = Cookie},
+ %% Always put schema first in backup file
+ B5 = backup_schema(B4, Tabs),
+ B6 = lists:foldl(fun backup_tab/2, B5, Tabs -- [schema]),
+ safe_apply(B6, commit_write, [B6#backup_args.opaque]),
+ ok;
+ {error, Reason} ->
+ abort_write(B3, {?MODULE, backup_master}, [B], {error, Reason})
+ end.
+
+select_tables(AllTabs, B) ->
+ Tabs =
+ case B#backup_args.tables of
+ all -> AllTabs;
+ SomeTabs when list(SomeTabs) -> SomeTabs
+ end,
+ case B#backup_args.scope of
+ global ->
+ Tabs;
+ local ->
+ Name = B#backup_args.name,
+ [T || T <- Tabs, mnesia_checkpoint:most_local_node(Name, T) == node()]
+ end.
+
+safe_write(B, []) ->
+ B;
+safe_write(B, Recs) ->
+ safe_apply(B, write, [B#backup_args.opaque, Recs]).
+
+backup_schema(B, Tabs) ->
+ case lists:member(schema, Tabs) of
+ true ->
+ backup_tab(schema, B);
+ false ->
+ Defs = [{schema, T, mnesia_schema:get_create_list(T)} || T <- Tabs],
+ safe_write(B, Defs)
+ end.
+
+safe_apply(B, write, [_, Items]) when Items == [] ->
+ B;
+safe_apply(B, What, Args) ->
+ Abort = fun(R) -> abort_write(B, What, Args, R) end,
+ receive
+ {'EXIT', Pid, R} -> Abort({'EXIT', Pid, R})
+ after 0 ->
+ Mod = B#backup_args.module,
+ case catch apply(Mod, What, Args) of
+ {ok, Opaque} -> B#backup_args{opaque=Opaque};
+ {error, R} -> Abort(R);
+ R -> Abort(R)
+ end
+ end.
+
+abort_write(B, What, Args, Reason) ->
+ Mod = B#backup_args.module,
+ Opaque = B#backup_args.opaque,
+ dbg_out("Failed to perform backup. M=~p:F=~p:A=~p -> ~p~n",
+ [Mod, What, Args, Reason]),
+ case catch apply(Mod, abort_write, [Opaque]) of
+ {ok, _Res} ->
+ throw({error, Reason});
+ Other ->
+ error("Failed to abort backup. ~p:~p~p -> ~p~n",
+ [Mod, abort_write, [Opaque], Other]),
+ throw({error, Reason})
+ end.
+
+backup_tab(Tab, B) ->
+ Name = B#backup_args.name,
+ case mnesia_checkpoint:most_local_node(Name, Tab) of
+ {ok, Node} when Node == node() ->
+ tab_copier(self(), B, Tab);
+ {ok, Node} ->
+ RemoteB = B,
+ Pid = spawn_link(Node, ?MODULE, tab_copier, [self(), RemoteB, Tab]),
+ RecName = val({Tab, record_name}),
+ tab_receiver(Pid, B, Tab, RecName, 0);
+ {error, Reason} ->
+ abort_write(B, {?MODULE, backup_tab}, [Tab, B], {error, Reason})
+ end.
+
+tab_copier(Pid, B, Tab) when record(B, backup_args) ->
+ %% Intentional crash at exit
+ Name = B#backup_args.name,
+ PrevName = B#backup_args.prev_name,
+ {FirstName, FirstSource} = select_source(Tab, Name, PrevName),
+
+ ?eval_debug_fun({?MODULE, tab_copier, pre}, [{name, Name}, {tab, Tab}]),
+ Res = handle_more(Pid, B, Tab, FirstName, FirstSource, Name),
+ ?eval_debug_fun({?MODULE, tab_copier, post}, [{name, Name}, {tab, Tab}]),
+
+ handle_last(Pid, Res).
+
+select_source(Tab, Name, PrevName) ->
+ if
+ Tab == schema ->
+ %% Always full backup of schema
+ {Name, table};
+ Name == PrevName ->
+ %% Full backup
+ {Name, table};
+ true ->
+ %% Wants incremental backup
+ case mnesia_checkpoint:most_local_node(PrevName, Tab) of
+ {ok, Node} when Node == node() ->
+ %% Accept incremental backup
+ {PrevName, retainer};
+ _ ->
+ %% Do a full backup anyway
+ dbg_out("Incremental backup escalated to full backup: ~p~n", [Tab]),
+ {Name, table}
+ end
+ end.
+
+handle_more(Pid, B, Tab, FirstName, FirstSource, Name) ->
+ Acc = {0, B},
+ case {mnesia_checkpoint:really_retain(Name, Tab),
+ mnesia_checkpoint:really_retain(FirstName, Tab)} of
+ {true, true} ->
+ Acc2 = iterate(B, FirstName, Tab, Pid, FirstSource, latest, first, Acc),
+ iterate(B, Name, Tab, Pid, retainer, checkpoint, last, Acc2);
+ {false, false}->
+ %% Put the dumped file in the backup
+ %% instead of the ram table. Does
+ %% only apply to ram_copies.
+ iterate(B, Name, Tab, Pid, retainer, checkpoint, last, Acc);
+ Bad ->
+ Reason = {"Checkpoints for incremental backup must have same "
+ "setting of ram_overrides_dump",
+ Tab, Name, FirstName, Bad},
+ abort_write(B, {?MODULE, backup_tab}, [Tab, B], {error, Reason})
+ end.
+
+handle_last(Pid, {_Count, B}) when Pid == self() ->
+ B;
+handle_last(Pid, _Acc) ->
+ unlink(Pid),
+ Pid ! {self(), {last, {ok, dummy}}},
+ exit(normal).
+
+iterate(B, Name, Tab, Pid, Source, Age, Pass, Acc) ->
+ Fun =
+ if
+ Pid == self() ->
+ RecName = val({Tab, record_name}),
+ fun(Recs, A) -> copy_records(RecName, Tab, Recs, A) end;
+ true ->
+ fun(Recs, A) -> send_records(Pid, Tab, Recs, Pass, A) end
+ end,
+ case mnesia_checkpoint:iterate(Name, Tab, Fun, Acc, Source, Age) of
+ {ok, Acc2} ->
+ Acc2;
+ {error, Reason} ->
+ R = {error, {"Tab copier iteration failed", Reason}},
+ abort_write(B, {?MODULE, iterate}, [self(), B, Tab], R)
+ end.
+
+copy_records(_RecName, _Tab, [], Acc) ->
+ Acc;
+copy_records(RecName, Tab, Recs, {Count, B}) ->
+ Recs2 = rec_filter(B, Tab, RecName, Recs),
+ B2 = safe_write(B, Recs2),
+ {Count + 1, B2}.
+
+send_records(Pid, Tab, Recs, Pass, {Count, B}) ->
+ receive
+ {Pid, more, Count} ->
+ if
+ Pass == last, Recs == [] ->
+ {Count, B};
+ true ->
+ Next = Count + 1,
+ Pid ! {self(), {more, Next, Recs}},
+ {Next, B}
+ end;
+ Msg ->
+ exit({send_records_unexpected_msg, Tab, Msg})
+ end.
+
+tab_receiver(Pid, B, Tab, RecName, Slot) ->
+ Pid ! {self(), more, Slot},
+ receive
+ {Pid, {more, Next, Recs}} ->
+ Recs2 = rec_filter(B, Tab, RecName, Recs),
+ B2 = safe_write(B, Recs2),
+ tab_receiver(Pid, B2, Tab, RecName, Next);
+
+ {Pid, {last, {ok,_}}} ->
+ B;
+
+ {'EXIT', Pid, {error, R}} ->
+ Reason = {error, {"Tab copier crashed", R}},
+ abort_write(B, {?MODULE, remote_tab_sender}, [self(), B, Tab], Reason);
+ {'EXIT', Pid, R} ->
+ Reason = {error, {"Tab copier crashed", {'EXIT', R}}},
+ abort_write(B, {?MODULE, remote_tab_sender}, [self(), B, Tab], Reason);
+ Msg ->
+ R = {error, {"Tab receiver got unexpected msg", Msg}},
+ abort_write(B, {?MODULE, remote_tab_sender}, [self(), B, Tab], R)
+ end.
+
+rec_filter(B, schema, _RecName, Recs) ->
+ case catch mnesia_bup:refresh_cookie(Recs, B#backup_args.cookie) of
+ Recs2 when list(Recs2) ->
+ Recs2;
+ {error, _Reason} ->
+ %% No schema table cookie
+ Recs
+ end;
+rec_filter(_B, Tab, Tab, Recs) ->
+ Recs;
+rec_filter(_B, Tab, _RecName, Recs) ->
+ [setelement(1, Rec, Tab) || Rec <- Recs].
+
+ets2dcd(Tab) ->
+ ets2dcd(Tab, dcd).
+
+ets2dcd(Tab, Ftype) ->
+ Fname =
+ case Ftype of
+ dcd -> mnesia_lib:tab2dcd(Tab);
+ dmp -> mnesia_lib:tab2dmp(Tab)
+ end,
+ TmpF = mnesia_lib:tab2tmp(Tab),
+ file:delete(TmpF),
+ Log = open_log({Tab, ets2dcd}, dcd_log_header(), TmpF, false),
+ mnesia_lib:db_fixtable(ram_copies, Tab, true),
+ ok = ets2dcd(mnesia_lib:db_init_chunk(ram_copies, Tab, 1000), Tab, Log),
+ mnesia_lib:db_fixtable(ram_copies, Tab, false),
+ close_log(Log),
+ ok = file:rename(TmpF, Fname),
+ %% Remove old log data which is now in the new dcd.
+ %% No one else should be accessing this file!
+ file:delete(mnesia_lib:tab2dcl(Tab)),
+ ok.
+
+ets2dcd('$end_of_table', _Tab, _Log) ->
+ ok;
+ets2dcd({Recs, Cont}, Tab, Log) ->
+ ok = disk_log:alog_terms(Log, Recs),
+ ets2dcd(mnesia_lib:db_chunk(ram_copies, Cont), Tab, Log).
+
+dcd2ets(Tab) ->
+ dcd2ets(Tab, mnesia_monitor:get_env(auto_repair)).
+
+dcd2ets(Tab, Rep) ->
+ Dcd = mnesia_lib:tab2dcd(Tab),
+ case mnesia_lib:exists(Dcd) of
+ true ->
+ Log = open_log({Tab, dcd2ets}, dcd_log_header(), Dcd,
+ true, Rep, read_only),
+ Data = chunk_log(Log, start),
+ ok = insert_dcdchunk(Data, Log, Tab),
+ close_log(Log),
+ load_dcl(Tab, Rep);
+ false -> %% Handle old dets files, and conversion from disc_only to disc.
+ Fname = mnesia_lib:tab2dat(Tab),
+ Type = val({Tab, setorbag}),
+ case mnesia_lib:dets_to_ets(Tab, Tab, Fname, Type, Rep, yes) of
+ loaded ->
+ ets2dcd(Tab),
+ file:delete(Fname),
+ 0;
+ {error, Error} ->
+ erlang:error({"Failed to load table from disc", [Tab, Error]})
+ end
+ end.
+
+insert_dcdchunk({Cont, [LogH | Rest]}, Log, Tab)
+ when record(LogH, log_header),
+ LogH#log_header.log_kind == dcd_log,
+ LogH#log_header.log_version >= "1.0" ->
+ insert_dcdchunk({Cont, Rest}, Log, Tab);
+
+insert_dcdchunk({Cont, Recs}, Log, Tab) ->
+ true = ets:insert(Tab, Recs),
+ insert_dcdchunk(chunk_log(Log, Cont), Log, Tab);
+insert_dcdchunk(eof, _Log, _Tab) ->
+ ok.
+
+load_dcl(Tab, Rep) ->
+ FName = mnesia_lib:tab2dcl(Tab),
+ case mnesia_lib:exists(FName) of
+ true ->
+ Name = {load_dcl,Tab},
+ open_log(Name,
+ dcl_log_header(),
+ FName,
+ true,
+ Rep,
+ read_only),
+ FirstChunk = chunk_log(Name, start),
+ N = insert_logchunk(FirstChunk, Name, 0),
+ close_log(Name),
+ N;
+ false ->
+ 0
+ end.
+
+insert_logchunk({C2, Recs}, Tab, C) ->
+ N = add_recs(Recs, C),
+ insert_logchunk(chunk_log(Tab, C2), Tab, C+N);
+insert_logchunk(eof, _Tab, C) ->
+ C.
+
+add_recs([{{Tab, _Key}, Val, write} | Rest], N) ->
+ true = ets:insert(Tab, Val),
+ add_recs(Rest, N+1);
+add_recs([{{Tab, Key}, _Val, delete} | Rest], N) ->
+ true = ets:delete(Tab, Key),
+ add_recs(Rest, N+1);
+add_recs([{{Tab, _Key}, Val, delete_object} | Rest], N) ->
+ true = ets:match_delete(Tab, Val),
+ add_recs(Rest, N+1);
+add_recs([{{Tab, Key}, Val, update_counter} | Rest], N) ->
+ {RecName, Incr} = Val,
+ case catch ets:update_counter(Tab, Key, Incr) of
+ CounterVal when integer(CounterVal) ->
+ ok;
+ _ ->
+ Zero = {RecName, Key, 0},
+ true = ets:insert(Tab, Zero)
+ end,
+ add_recs(Rest, N+1);
+add_recs([LogH|Rest], N)
+ when record(LogH, log_header),
+ LogH#log_header.log_kind == dcl_log,
+ LogH#log_header.log_version >= "1.0" ->
+ add_recs(Rest, N);
+add_recs([{{Tab, _Key}, _Val, clear_table} | Rest], N) ->
+ true = ets:match_delete(Tab, '_'),
+ add_recs(Rest, N+ets:info(Tab, size));
+add_recs([], N) ->
+ N.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_monitor.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_monitor.erl
new file mode 100644
index 0000000000..b64419d5a8
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_monitor.erl
@@ -0,0 +1,776 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_monitor.erl,v 1.1 2008/12/17 09:53:38 mikpe Exp $
+%%
+-module(mnesia_monitor).
+
+-behaviour(gen_server).
+
+%% Public exports
+-export([
+ close_dets/1,
+ close_log/1,
+ detect_inconcistency/2,
+ get_env/1,
+ init/0,
+ mktab/2,
+ unsafe_mktab/2,
+ mnesia_down/2,
+ needs_protocol_conversion/1,
+ negotiate_protocol/1,
+ disconnect/1,
+ open_dets/2,
+ unsafe_open_dets/2,
+ open_log/1,
+ patch_env/2,
+ protocol_version/0,
+ reopen_log/3,
+ set_env/2,
+ start/0,
+ start_proc/4,
+ terminate_proc/3,
+ unsafe_close_dets/1,
+ unsafe_close_log/1,
+ use_dir/0,
+ do_check_type/2
+ ]).
+
+%% gen_server callbacks
+-export([
+ init/1,
+ handle_call/3,
+ handle_cast/2,
+ handle_info/2,
+ terminate/2,
+ code_change/3
+ ]).
+
+%% Internal exports
+-export([
+ call/1,
+ cast/1,
+ detect_partitioned_network/2,
+ has_remote_mnesia_down/1
+ ]).
+
+-import(mnesia_lib, [dbg_out/2, verbose/2, error/2, fatal/2, set/2]).
+
+-include("mnesia.hrl").
+
+-record(state, {supervisor, pending_negotiators = [],
+ going_down = [], tm_started = false, early_connects = []}).
+
+-define(current_protocol_version, {7,6}).
+
+-define(previous_protocol_version, {7,5}).
+
+start() ->
+ gen_server:start_link({local, ?MODULE}, ?MODULE,
+ [self()], [{timeout, infinity}
+ %% ,{debug, [trace]}
+ ]).
+
+init() ->
+ call(init).
+
+mnesia_down(From, Node) ->
+ cast({mnesia_down, From, Node}).
+
+mktab(Tab, Args) ->
+ unsafe_call({mktab, Tab, Args}).
+unsafe_mktab(Tab, Args) ->
+ unsafe_call({unsafe_mktab, Tab, Args}).
+
+open_dets(Tab, Args) ->
+ unsafe_call({open_dets, Tab, Args}).
+unsafe_open_dets(Tab, Args) ->
+ unsafe_call({unsafe_open_dets, Tab, Args}).
+
+close_dets(Tab) ->
+ unsafe_call({close_dets, Tab}).
+
+unsafe_close_dets(Name) ->
+ unsafe_call({unsafe_close_dets, Name}).
+
+open_log(Args) ->
+ unsafe_call({open_log, Args}).
+
+reopen_log(Name, Fname, Head) ->
+ unsafe_call({reopen_log, Name, Fname, Head}).
+
+close_log(Name) ->
+ unsafe_call({close_log, Name}).
+
+unsafe_close_log(Name) ->
+ unsafe_call({unsafe_close_log, Name}).
+
+
+disconnect(Node) ->
+ cast({disconnect, Node}).
+
+%% Returns GoodNoodes
+%% Creates a link to each compatible monitor and
+%% protocol_version to agreed version upon success
+
+negotiate_protocol(Nodes) ->
+ Version = mnesia:system_info(version),
+ Protocols = acceptable_protocol_versions(),
+ MonitorPid = whereis(?MODULE),
+ Msg = {negotiate_protocol, MonitorPid, Version, Protocols},
+ {Replies, _BadNodes} = multicall(Nodes, Msg),
+ check_protocol(Replies, Protocols).
+
+check_protocol([{Node, {accept, Mon, _Version, Protocol}} | Tail], Protocols) ->
+ case lists:member(Protocol, Protocols) of
+ true ->
+ case Protocol == protocol_version() of
+ true ->
+ set({protocol, Node}, {Protocol, false});
+ false ->
+ set({protocol, Node}, {Protocol, true})
+ end,
+ [node(Mon) | check_protocol(Tail, Protocols)];
+ false ->
+ unlink(Mon), % Get rid of unneccessary link
+ check_protocol(Tail, Protocols)
+ end;
+check_protocol([{Node, {reject, _Mon, Version, Protocol}} | Tail], Protocols) ->
+ verbose("Failed to connect with ~p. ~p protocols rejected. "
+ "expected version = ~p, expected protocol = ~p~n",
+ [Node, Protocols, Version, Protocol]),
+ check_protocol(Tail, Protocols);
+check_protocol([{error, _Reason} | Tail], Protocols) ->
+ check_protocol(Tail, Protocols);
+check_protocol([{badrpc, _Reason} | Tail], Protocols) ->
+ check_protocol(Tail, Protocols);
+check_protocol([], [Protocol | _Protocols]) ->
+ set(protocol_version, Protocol),
+ [];
+check_protocol([], []) ->
+ set(protocol_version, protocol_version()),
+ [].
+
+protocol_version() ->
+ case ?catch_val(protocol_version) of
+ {'EXIT', _} -> ?current_protocol_version;
+ Version -> Version
+ end.
+
+%% A sorted list of acceptable protocols the
+%% preferred protocols are first in the list
+acceptable_protocol_versions() ->
+ [protocol_version(), ?previous_protocol_version].
+
+needs_protocol_conversion(Node) ->
+ case {?catch_val({protocol, Node}), protocol_version()} of
+ {{'EXIT', _}, _} ->
+ false;
+ {{_, Bool}, ?current_protocol_version} ->
+ Bool;
+ {{_, Bool}, _} ->
+ not Bool
+ end.
+
+cast(Msg) ->
+ case whereis(?MODULE) of
+ undefined -> ignore;
+ Pid -> gen_server:cast(Pid, Msg)
+ end.
+
+unsafe_call(Msg) ->
+ case whereis(?MODULE) of
+ undefined -> {error, {node_not_running, node()}};
+ Pid -> gen_server:call(Pid, Msg, infinity)
+ end.
+
+call(Msg) ->
+ case whereis(?MODULE) of
+ undefined ->
+ {error, {node_not_running, node()}};
+ Pid ->
+ link(Pid),
+ Res = gen_server:call(Pid, Msg, infinity),
+ unlink(Pid),
+
+ %% We get an exit signal if server dies
+ receive
+ {'EXIT', Pid, _Reason} ->
+ {error, {node_not_running, node()}}
+ after 0 ->
+ ignore
+ end,
+ Res
+ end.
+
+multicall(Nodes, Msg) ->
+ rpc:multicall(Nodes, ?MODULE, call, [Msg]).
+
+start_proc(Who, Mod, Fun, Args) ->
+ Args2 = [Who, Mod, Fun, Args],
+ proc_lib:start_link(mnesia_sp, init_proc, Args2, infinity).
+
+terminate_proc(Who, R, State) when R /= shutdown, R /= killed ->
+ fatal("~p crashed: ~p state: ~p~n", [Who, R, State]);
+
+terminate_proc(Who, Reason, _State) ->
+ mnesia_lib:verbose("~p terminated: ~p~n", [Who, Reason]),
+ ok.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% Callback functions from gen_server
+
+%%----------------------------------------------------------------------
+%% Func: init/1
+%% Returns: {ok, State} |
+%% {ok, State, Timeout} |
+%% {stop, Reason}
+%%----------------------------------------------------------------------
+init([Parent]) ->
+ process_flag(trap_exit, true),
+ ?ets_new_table(mnesia_gvar, [set, public, named_table]),
+ set(subscribers, []),
+ mnesia_lib:verbose("~p starting: ~p~n", [?MODULE, self()]),
+ Version = mnesia:system_info(version),
+ set(version, Version),
+ dbg_out("Version: ~p~n", [Version]),
+
+ case catch process_config_args(env()) of
+ ok ->
+ mnesia_lib:set({'$$$_report', current_pos}, 0),
+ Level = mnesia_lib:val(debug),
+ mnesia_lib:verbose("Mnesia debug level set to ~p\n", [Level]),
+ set(mnesia_status, starting), %% set start status
+ set({current, db_nodes}, [node()]),
+ set(use_dir, use_dir()),
+ mnesia_lib:create_counter(trans_aborts),
+ mnesia_lib:create_counter(trans_commits),
+ mnesia_lib:create_counter(trans_log_writes),
+ Left = get_env(dump_log_write_threshold),
+ mnesia_lib:set_counter(trans_log_writes_left, Left),
+ mnesia_lib:create_counter(trans_log_writes_prev),
+ mnesia_lib:create_counter(trans_restarts),
+ mnesia_lib:create_counter(trans_failures),
+ ?ets_new_table(mnesia_held_locks, [bag, public, named_table]),
+ ?ets_new_table(mnesia_tid_locks, [bag, public, named_table]),
+ ?ets_new_table(mnesia_sticky_locks, [set, public, named_table]),
+ ?ets_new_table(mnesia_lock_queue,
+ [bag, public, named_table, {keypos, 2}]),
+ ?ets_new_table(mnesia_lock_counter, [set, public, named_table]),
+ set(checkpoints, []),
+ set(pending_checkpoints, []),
+ set(pending_checkpoint_pids, []),
+
+ {ok, #state{supervisor = Parent}};
+ {'EXIT', Reason} ->
+ mnesia_lib:report_fatal("Bad configuration: ~p~n", [Reason]),
+ {stop, {bad_config, Reason}}
+ end.
+
+use_dir() ->
+ case ?catch_val(use_dir) of
+ {'EXIT', _} ->
+ case get_env(schema_location) of
+ disc -> true;
+ opt_disc -> non_empty_dir();
+ ram -> false
+ end;
+ Bool ->
+ Bool
+ end.
+
+%% Returns true if the Mnesia directory contains
+%% important files
+non_empty_dir() ->
+ mnesia_lib:exists(mnesia_bup:fallback_bup()) or
+ mnesia_lib:exists(mnesia_lib:tab2dmp(schema)) or
+ mnesia_lib:exists(mnesia_lib:tab2dat(schema)).
+
+%%----------------------------------------------------------------------
+%% Func: handle_call/3
+%% Returns: {reply, Reply, State} |
+%% {reply, Reply, State, Timeout} |
+%% {noreply, State} |
+%% {noreply, State, Timeout} |
+%% {stop, Reason, Reply, State} | (terminate/2 is called)
+%%----------------------------------------------------------------------
+
+handle_call({mktab, Tab, Args}, _From, State) ->
+ case catch ?ets_new_table(Tab, Args) of
+ {'EXIT', ExitReason} ->
+ Msg = "Cannot create ets table",
+ Reason = {system_limit, Msg, Tab, Args, ExitReason},
+ fatal("~p~n", [Reason]),
+ {noreply, State};
+ Reply ->
+ {reply, Reply, State}
+ end;
+
+handle_call({unsafe_mktab, Tab, Args}, _From, State) ->
+ case catch ?ets_new_table(Tab, Args) of
+ {'EXIT', ExitReason} ->
+ {reply, {error, ExitReason}, State};
+ Reply ->
+ {reply, Reply, State}
+ end;
+
+
+handle_call({open_dets, Tab, Args}, _From, State) ->
+ case mnesia_lib:dets_sync_open(Tab, Args) of
+ {ok, Tab} ->
+ {reply, {ok, Tab}, State};
+
+ {error, Reason} ->
+ Msg = "Cannot open dets table",
+ Error = {error, {Msg, Tab, Args, Reason}},
+ fatal("~p~n", [Error]),
+ {noreply, State}
+ end;
+
+handle_call({unsafe_open_dets, Tab, Args}, _From, State) ->
+ case mnesia_lib:dets_sync_open(Tab, Args) of
+ {ok, Tab} ->
+ {reply, {ok, Tab}, State};
+ {error, Reason} ->
+ {reply, {error,Reason}, State}
+ end;
+
+handle_call({close_dets, Tab}, _From, State) ->
+ case mnesia_lib:dets_sync_close(Tab) of
+ ok ->
+ {reply, ok, State};
+ {error, Reason} ->
+ Msg = "Cannot close dets table",
+ Error = {error, {Msg, Tab, Reason}},
+ fatal("~p~n", [Error]),
+ {noreply, State}
+ end;
+
+handle_call({unsafe_close_dets, Tab}, _From, State) ->
+ mnesia_lib:dets_sync_close(Tab),
+ {reply, ok, State};
+
+handle_call({open_log, Args}, _From, State) ->
+ Res = disk_log:open([{notify, true}|Args]),
+ {reply, Res, State};
+
+handle_call({reopen_log, Name, Fname, Head}, _From, State) ->
+ case disk_log:reopen(Name, Fname, Head) of
+ ok ->
+ {reply, ok, State};
+
+ {error, Reason} ->
+ Msg = "Cannot rename disk_log file",
+ Error = {error, {Msg, Name, Fname, Head, Reason}},
+ fatal("~p~n", [Error]),
+ {noreply, State}
+ end;
+
+handle_call({close_log, Name}, _From, State) ->
+ case disk_log:close(Name) of
+ ok ->
+ {reply, ok, State};
+
+ {error, Reason} ->
+ Msg = "Cannot close disk_log file",
+ Error = {error, {Msg, Name, Reason}},
+ fatal("~p~n", [Error]),
+ {noreply, State}
+ end;
+
+handle_call({unsafe_close_log, Name}, _From, State) ->
+ disk_log:close(Name),
+ {reply, ok, State};
+
+handle_call({negotiate_protocol, Mon, _Version, _Protocols}, _From, State)
+ when State#state.tm_started == false ->
+ State2 = State#state{early_connects = [node(Mon) | State#state.early_connects]},
+ {reply, {node(), {reject, self(), uninitialized, uninitialized}}, State2};
+
+handle_call({negotiate_protocol, Mon, Version, Protocols}, From, State)
+ when node(Mon) /= node() ->
+ Protocol = protocol_version(),
+ MyVersion = mnesia:system_info(version),
+ case lists:member(Protocol, Protocols) of
+ true ->
+ accept_protocol(Mon, MyVersion, Protocol, From, State);
+ false ->
+ %% in this release we should be able to handle the previous
+ %% protocol
+ case hd(Protocols) of
+ ?previous_protocol_version ->
+ accept_protocol(Mon, MyVersion, ?previous_protocol_version, From, State);
+ _ ->
+ verbose("Connection with ~p rejected. "
+ "version = ~p, protocols = ~p, "
+ "expected version = ~p, expected protocol = ~p~n",
+ [node(Mon), Version, Protocols, MyVersion, Protocol]),
+ {reply, {node(), {reject, self(), MyVersion, Protocol}}, State}
+ end
+ end;
+
+handle_call(init, _From, State) ->
+ net_kernel:monitor_nodes(true),
+ EarlyNodes = State#state.early_connects,
+ State2 = State#state{tm_started = true},
+ {reply, EarlyNodes, State2};
+
+handle_call(Msg, _From, State) ->
+ error("~p got unexpected call: ~p~n", [?MODULE, Msg]),
+ {noreply, State}.
+
+accept_protocol(Mon, Version, Protocol, From, State) ->
+ Reply = {node(), {accept, self(), Version, Protocol}},
+ Node = node(Mon),
+ Pending0 = State#state.pending_negotiators,
+ Pending = lists:keydelete(Node, 1, Pending0),
+ case lists:member(Node, State#state.going_down) of
+ true ->
+ %% Wait for the mnesia_down to be processed,
+ %% before we reply
+ P = Pending ++ [{Node, Mon, From, Reply}],
+ {noreply, State#state{pending_negotiators = P}};
+ false ->
+ %% No need for wait
+ link(Mon), %% link to remote Monitor
+ case Protocol == protocol_version() of
+ true ->
+ set({protocol, Node}, {Protocol, false});
+ false ->
+ set({protocol, Node}, {Protocol, true})
+ end,
+ {reply, Reply, State#state{pending_negotiators = Pending}}
+ end.
+
+%%----------------------------------------------------------------------
+%% Func: handle_cast/2
+%% Returns: {noreply, State} |
+%% {noreply, State, Timeout} |
+%% {stop, Reason, State} (terminate/2 is called)
+%%----------------------------------------------------------------------
+
+handle_cast({mnesia_down, mnesia_controller, Node}, State) ->
+ mnesia_tm:mnesia_down(Node),
+ {noreply, State};
+
+handle_cast({mnesia_down, mnesia_tm, {Node, Pending}}, State) ->
+ mnesia_locker:mnesia_down(Node, Pending),
+ {noreply, State};
+
+handle_cast({mnesia_down, mnesia_locker, Node}, State) ->
+ Down = {mnesia_down, Node},
+ mnesia_lib:report_system_event(Down),
+ GoingDown = lists:delete(Node, State#state.going_down),
+ State2 = State#state{going_down = GoingDown},
+ Pending = State#state.pending_negotiators,
+ case lists:keysearch(Node, 1, Pending) of
+ {value, {Node, Mon, ReplyTo, Reply}} ->
+ %% Late reply to remote monitor
+ link(Mon), %% link to remote Monitor
+ gen_server:reply(ReplyTo, Reply),
+ P2 = lists:keydelete(Node, 1,Pending),
+ State3 = State2#state{pending_negotiators = P2},
+ {noreply, State3};
+ false ->
+ %% No pending remote monitors
+ {noreply, State2}
+ end;
+
+handle_cast({disconnect, Node}, State) ->
+ case rpc:call(Node, erlang, whereis, [?MODULE]) of
+ {badrpc, _} ->
+ ignore;
+ RemoteMon when pid(RemoteMon) ->
+ unlink(RemoteMon)
+ end,
+ {noreply, State};
+
+handle_cast({inconsistent_database, Context, Node}, State) ->
+ Msg = {inconsistent_database, Context, Node},
+ mnesia_lib:report_system_event(Msg),
+ {noreply, State};
+
+handle_cast(Msg, State) ->
+ error("~p got unexpected cast: ~p~n", [?MODULE, Msg]),
+ {noreply, State}.
+
+%%----------------------------------------------------------------------
+%% Func: handle_info/2
+%% Returns: {noreply, State} |
+%% {noreply, State, Timeout} |
+%% {stop, Reason, State} (terminate/2 is called)
+%%----------------------------------------------------------------------
+
+handle_info({'EXIT', Pid, R}, State) when Pid == State#state.supervisor ->
+ dbg_out("~p was ~p by supervisor~n",[?MODULE, R]),
+ {stop, R, State};
+
+handle_info({'EXIT', Pid, fatal}, State) when node(Pid) == node() ->
+ dbg_out("~p got FATAL ERROR from: ~p~n",[?MODULE, Pid]),
+ exit(State#state.supervisor, shutdown),
+ {noreply, State};
+
+handle_info({'EXIT', Pid, Reason}, State) ->
+ Node = node(Pid),
+ if
+ Node /= node() ->
+ %% Remotly linked process died, assume that it was a mnesia_monitor
+ mnesia_recover:mnesia_down(Node),
+ mnesia_controller:mnesia_down(Node),
+ {noreply, State#state{going_down = [Node | State#state.going_down]}};
+ true ->
+ %% We have probably got an exit signal from from
+ %% disk_log or dets
+ Hint = "Hint: check that the disk still is writable",
+ Msg = {'EXIT', Pid, Reason},
+ fatal("~p got unexpected info: ~p; ~p~n",
+ [?MODULE, Msg, Hint])
+ end;
+
+handle_info({nodeup, Node}, State) ->
+ %% Ok, we are connected to yet another Erlang node
+ %% Let's check if Mnesia is running there in order
+ %% to detect if the network has been partitioned
+ %% due to communication failure.
+
+ HasDown = mnesia_recover:has_mnesia_down(Node),
+ ImRunning = mnesia_lib:is_running(),
+
+ if
+ %% If I'm not running the test will be made later.
+ HasDown == true, ImRunning == yes ->
+ spawn_link(?MODULE, detect_partitioned_network, [self(), Node]);
+ true ->
+ ignore
+ end,
+ {noreply, State};
+
+handle_info({nodedown, _Node}, State) ->
+ %% Ignore, we are only caring about nodeup's
+ {noreply, State};
+
+handle_info({disk_log, _Node, Log, Info}, State) ->
+ case Info of
+ {truncated, _No} ->
+ ok;
+ _ ->
+ mnesia_lib:important("Warning Log file ~p error reason ~s~n",
+ [Log, disk_log:format_error(Info)])
+ end,
+ {noreply, State};
+
+handle_info(Msg, State) ->
+ error("~p got unexpected info (~p): ~p~n", [?MODULE, State, Msg]).
+
+%%----------------------------------------------------------------------
+%% Func: terminate/2
+%% Purpose: Shutdown the server
+%% Returns: any (ignored by gen_server)
+%%----------------------------------------------------------------------
+terminate(Reason, State) ->
+ terminate_proc(?MODULE, Reason, State).
+
+%%----------------------------------------------------------------------
+%% Func: code_change/3
+%% Purpose: Upgrade process when its code is to be changed
+%% Returns: {ok, NewState}
+%%----------------------------------------------------------------------
+
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
+
+%%%----------------------------------------------------------------------
+%%% Internal functions
+%%%----------------------------------------------------------------------
+
+process_config_args([]) ->
+ ok;
+process_config_args([C|T]) ->
+ V = get_env(C),
+ dbg_out("Env ~p: ~p~n", [C, V]),
+ mnesia_lib:set(C, V),
+ process_config_args(T).
+
+set_env(E,Val) ->
+ mnesia_lib:set(E, check_type(E,Val)),
+ ok.
+
+get_env(E) ->
+ case ?catch_val(E) of
+ {'EXIT', _} ->
+ case application:get_env(mnesia, E) of
+ {ok, Val} ->
+ check_type(E, Val);
+ undefined ->
+ check_type(E, default_env(E))
+ end;
+ Val ->
+ Val
+ end.
+
+env() ->
+ [
+ access_module,
+ auto_repair,
+ backup_module,
+ debug,
+ dir,
+ dump_log_load_regulation,
+ dump_log_time_threshold,
+ dump_log_update_in_place,
+ dump_log_write_threshold,
+ embedded_mnemosyne,
+ event_module,
+ extra_db_nodes,
+ ignore_fallback_at_startup,
+ fallback_error_function,
+ max_wait_for_decision,
+ schema_location,
+ core_dir
+ ].
+
+default_env(access_module) ->
+ mnesia;
+default_env(auto_repair) ->
+ true;
+default_env(backup_module) ->
+ mnesia_backup;
+default_env(debug) ->
+ none;
+default_env(dir) ->
+ Name = lists:concat(["Mnesia.", node()]),
+ filename:absname(Name);
+default_env(dump_log_load_regulation) ->
+ false;
+default_env(dump_log_time_threshold) ->
+ timer:minutes(3);
+default_env(dump_log_update_in_place) ->
+ true;
+default_env(dump_log_write_threshold) ->
+ 1000;
+default_env(embedded_mnemosyne) ->
+ false;
+default_env(event_module) ->
+ mnesia_event;
+default_env(extra_db_nodes) ->
+ [];
+default_env(ignore_fallback_at_startup) ->
+ false;
+default_env(fallback_error_function) ->
+ {mnesia, lkill};
+default_env(max_wait_for_decision) ->
+ infinity;
+default_env(schema_location) ->
+ opt_disc;
+default_env(core_dir) ->
+ false.
+
+check_type(Env, Val) ->
+ case catch do_check_type(Env, Val) of
+ {'EXIT', _Reason} ->
+ exit({bad_config, Env, Val});
+ NewVal ->
+ NewVal
+ end.
+
+do_check_type(access_module, A) when atom(A) -> A;
+do_check_type(auto_repair, B) -> bool(B);
+do_check_type(backup_module, B) when atom(B) -> B;
+do_check_type(debug, debug) -> debug;
+do_check_type(debug, false) -> none;
+do_check_type(debug, none) -> none;
+do_check_type(debug, trace) -> trace;
+do_check_type(debug, true) -> debug;
+do_check_type(debug, verbose) -> verbose;
+do_check_type(dir, V) -> filename:absname(V);
+do_check_type(dump_log_load_regulation, B) -> bool(B);
+do_check_type(dump_log_time_threshold, I) when integer(I), I > 0 -> I;
+do_check_type(dump_log_update_in_place, B) -> bool(B);
+do_check_type(dump_log_write_threshold, I) when integer(I), I > 0 -> I;
+do_check_type(event_module, A) when atom(A) -> A;
+do_check_type(ignore_fallback_at_startup, B) -> bool(B);
+do_check_type(fallback_error_function, {Mod, Func})
+ when atom(Mod), atom(Func) -> {Mod, Func};
+do_check_type(embedded_mnemosyne, B) -> bool(B);
+do_check_type(extra_db_nodes, L) when list(L) ->
+ Fun = fun(N) when N == node() -> false;
+ (A) when atom(A) -> true
+ end,
+ lists:filter(Fun, L);
+do_check_type(max_wait_for_decision, infinity) -> infinity;
+do_check_type(max_wait_for_decision, I) when integer(I), I > 0 -> I;
+do_check_type(schema_location, M) -> media(M);
+do_check_type(core_dir, "false") -> false;
+do_check_type(core_dir, false) -> false;
+do_check_type(core_dir, Dir) when list(Dir) -> Dir.
+
+
+bool(true) -> true;
+bool(false) -> false.
+
+media(disc) -> disc;
+media(opt_disc) -> opt_disc;
+media(ram) -> ram.
+
+patch_env(Env, Val) ->
+ case catch do_check_type(Env, Val) of
+ {'EXIT', _Reason} ->
+ {error, {bad_type, Env, Val}};
+ NewVal ->
+ application_controller:set_env(mnesia, Env, NewVal),
+ NewVal
+ end.
+
+detect_partitioned_network(Mon, Node) ->
+ GoodNodes = negotiate_protocol([Node]),
+ detect_inconcistency(GoodNodes, running_partitioned_network),
+ unlink(Mon),
+ exit(normal).
+
+detect_inconcistency([], _Context) ->
+ ok;
+detect_inconcistency(Nodes, Context) ->
+ Downs = [N || N <- Nodes, mnesia_recover:has_mnesia_down(N)],
+ {Replies, _BadNodes} =
+ rpc:multicall(Downs, ?MODULE, has_remote_mnesia_down, [node()]),
+ report_inconsistency(Replies, Context, ok).
+
+has_remote_mnesia_down(Node) ->
+ HasDown = mnesia_recover:has_mnesia_down(Node),
+ Master = mnesia_recover:get_master_nodes(schema),
+ if
+ HasDown == true, Master == [] ->
+ {true, node()};
+ true ->
+ {false, node()}
+ end.
+
+report_inconsistency([{true, Node} | Replies], Context, _Status) ->
+ %% Oops, Mnesia is already running on the
+ %% other node AND we both regard each
+ %% other as down. The database is
+ %% potentially inconsistent and we has to
+ %% do tell the applications about it, so
+ %% they may perform some clever recovery
+ %% action.
+ Msg = {inconsistent_database, Context, Node},
+ mnesia_lib:report_system_event(Msg),
+ report_inconsistency(Replies, Context, inconsistent_database);
+report_inconsistency([{false, _Node} | Replies], Context, Status) ->
+ report_inconsistency(Replies, Context, Status);
+report_inconsistency([{badrpc, _Reason} | Replies], Context, Status) ->
+ report_inconsistency(Replies, Context, Status);
+report_inconsistency([], _Context, Status) ->
+ Status.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_recover.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_recover.erl
new file mode 100644
index 0000000000..cbb110fa6c
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_recover.erl
@@ -0,0 +1,1174 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_recover.erl,v 1.1 2008/12/17 09:53:39 mikpe Exp $
+%%
+-module(mnesia_recover).
+
+-behaviour(gen_server).
+
+-export([
+ allow_garb/0,
+ call/1,
+ connect_nodes/1,
+ disconnect/1,
+ dump_decision_tab/0,
+ get_master_node_info/0,
+ get_master_node_tables/0,
+ get_master_nodes/1,
+ get_mnesia_downs/0,
+ has_mnesia_down/1,
+ incr_trans_tid_serial/0,
+ init/0,
+ log_decision/1,
+ log_master_nodes/3,
+ log_mnesia_down/1,
+ log_mnesia_up/1,
+ mnesia_down/1,
+ note_decision/2,
+ note_log_decision/2,
+ outcome/2,
+ start/0,
+ start_garb/0,
+ still_pending/1,
+ sync_trans_tid_serial/1,
+ wait_for_decision/2,
+ what_happened/3
+ ]).
+
+%% gen_server callbacks
+-export([init/1,
+ handle_call/3,
+ handle_cast/2,
+ handle_info/2,
+ terminate/2,
+ code_change/3
+ ]).
+
+
+-include("mnesia.hrl").
+-import(mnesia_lib, [set/2, verbose/2, error/2, fatal/2]).
+
+-record(state, {supervisor,
+ unclear_pid,
+ unclear_decision,
+ unclear_waitfor,
+ tm_queue_len = 0,
+ initiated = false,
+ early_msgs = []
+ }).
+
+%%-define(DBG(F, A), mnesia:report_event(list_to_atom(lists:flatten(io_lib:format(F, A))))).
+%%-define(DBG(F, A), io:format("DBG: " ++ F, A)).
+
+-record(transient_decision, {tid, outcome}).
+
+start() ->
+ gen_server:start_link({local, ?MODULE}, ?MODULE, [self()],
+ [{timeout, infinity}
+ %%, {debug, [trace]}
+ ]).
+
+init() ->
+ call(init).
+
+start_garb() ->
+ Pid = whereis(mnesia_recover),
+ {ok, _} = timer:send_interval(timer:minutes(2), Pid, garb_decisions),
+ {ok, _} = timer:send_interval(timer:seconds(10), Pid, check_overload).
+
+allow_garb() ->
+ cast(allow_garb).
+
+
+%% The transaction log has either been swiched (latest -> previous) or
+%% there is nothing to be dumped. This means that the previous
+%% transaction log only may contain commit records which refers to
+%% transactions noted in the last two of the 'Prev' tables. All other
+%% tables may now be garbed by 'garb_decisions' (after 2 minutes).
+%% Max 10 tables are kept.
+do_allow_garb() ->
+ %% The order of the following stuff is important!
+ Curr = val(latest_transient_decision),
+ Old = val(previous_transient_decisions),
+ Next = create_transient_decision(),
+ {Prev, ReallyOld} = sublist([Curr | Old], 10, []),
+ [?ets_delete_table(Tab) || Tab <- ReallyOld],
+ set(previous_transient_decisions, Prev),
+ set(latest_transient_decision, Next).
+
+sublist([H|R], N, Acc) when N > 0 ->
+ sublist(R, N-1, [H| Acc]);
+sublist(List, _N, Acc) ->
+ {lists:reverse(Acc), List}.
+
+do_garb_decisions() ->
+ case val(previous_transient_decisions) of
+ [First, Second | Rest] ->
+ set(previous_transient_decisions, [First, Second]),
+ [?ets_delete_table(Tab) || Tab <- Rest];
+ _ ->
+ ignore
+ end.
+
+connect_nodes([]) ->
+ [];
+connect_nodes(Ns) ->
+ %% Determine which nodes we should try to connect
+ AlreadyConnected = val(recover_nodes),
+ {_, Nodes} = mnesia_lib:search_delete(node(), Ns),
+ Check = Nodes -- AlreadyConnected,
+ GoodNodes = mnesia_monitor:negotiate_protocol(Check),
+ if
+ GoodNodes == [] ->
+ %% No good noodes to connect to
+ ignore;
+ true ->
+ %% Now we have agreed upon a protocol with some new nodes
+ %% and we may use them when we recover transactions
+ mnesia_lib:add_list(recover_nodes, GoodNodes),
+ cast({announce_all, GoodNodes}),
+ case get_master_nodes(schema) of
+ [] ->
+ Context = starting_partitioned_network,
+ mnesia_monitor:detect_inconcistency(GoodNodes, Context);
+ _ -> %% If master_nodes is set ignore old inconsistencies
+ ignore
+ end
+ end,
+ {GoodNodes, AlreadyConnected}.
+
+disconnect(Node) ->
+ mnesia_monitor:disconnect(Node),
+ mnesia_lib:del(recover_nodes, Node).
+
+val(Var) ->
+ case ?catch_val(Var) of
+ {'EXIT', Reason} -> mnesia_lib:other_val(Var, Reason);
+ Value -> Value
+ end.
+
+call(Msg) ->
+ Pid = whereis(?MODULE),
+ case Pid of
+ undefined ->
+ {error, {node_not_running, node()}};
+ Pid ->
+ link(Pid),
+ Res = gen_server:call(Pid, Msg, infinity),
+ unlink(Pid),
+
+ %% We get an exit signal if server dies
+ receive
+ {'EXIT', Pid, _Reason} ->
+ {error, {node_not_running, node()}}
+ after 0 ->
+ ignore
+ end,
+ Res
+ end.
+
+multicall(Nodes, Msg) ->
+ rpc:multicall(Nodes, ?MODULE, call, [Msg]).
+
+cast(Msg) ->
+ case whereis(?MODULE) of
+ undefined -> ignore;
+ Pid -> gen_server:cast(Pid, Msg)
+ end.
+
+abcast(Nodes, Msg) ->
+ gen_server:abcast(Nodes, ?MODULE, Msg).
+
+note_decision(Tid, Outcome) ->
+ Tab = val(latest_transient_decision),
+ ?ets_insert(Tab, #transient_decision{tid = Tid, outcome = Outcome}).
+
+note_up(Node, _Date, _Time) ->
+ ?ets_delete(mnesia_decision, Node).
+
+note_down(Node, Date, Time) ->
+ ?ets_insert(mnesia_decision, {mnesia_down, Node, Date, Time}).
+
+note_master_nodes(Tab, []) ->
+ ?ets_delete(mnesia_decision, Tab);
+note_master_nodes(Tab, Nodes) when list(Nodes) ->
+ Master = {master_nodes, Tab, Nodes},
+ ?ets_insert(mnesia_decision, Master).
+
+note_outcome(D) when D#decision.disc_nodes == [] ->
+%% ?DBG("~w: note_tmp_decision: ~w~n", [node(), D]),
+ note_decision(D#decision.tid, filter_outcome(D#decision.outcome)),
+ ?ets_delete(mnesia_decision, D#decision.tid);
+note_outcome(D) when D#decision.disc_nodes /= [] ->
+%% ?DBG("~w: note_decision: ~w~n", [node(), D]),
+ ?ets_insert(mnesia_decision, D).
+
+log_decision(D) when D#decision.outcome /= unclear ->
+ OldD = decision(D#decision.tid),
+ MergedD = merge_decisions(node(), OldD, D),
+ do_log_decision(MergedD, true);
+log_decision(D) ->
+ do_log_decision(D, false).
+
+do_log_decision(D, DoTell) ->
+ RamNs = D#decision.ram_nodes,
+ DiscNs = D#decision.disc_nodes -- [node()],
+ Outcome = D#decision.outcome,
+ D2 =
+ case Outcome of
+ aborted -> D#decision{disc_nodes = DiscNs};
+ committed -> D#decision{disc_nodes = DiscNs};
+ _ -> D
+ end,
+ note_outcome(D2),
+ case mnesia_monitor:use_dir() of
+ true ->
+ mnesia_log:append(latest_log, D2),
+ if
+ DoTell == true, Outcome /= unclear ->
+ tell_im_certain(DiscNs, D2),
+ tell_im_certain(RamNs, D2);
+ true ->
+ ignore
+ end;
+ false ->
+ ignore
+ end.
+
+tell_im_certain([], _D) ->
+ ignore;
+tell_im_certain(Nodes, D) ->
+ Msg = {im_certain, node(), D},
+%% ?DBG("~w: ~w: tell: ~w~n", [node(), Msg, Nodes]),
+ abcast(Nodes, Msg).
+
+log_mnesia_up(Node) ->
+ call({log_mnesia_up, Node}).
+
+log_mnesia_down(Node) ->
+ call({log_mnesia_down, Node}).
+
+get_mnesia_downs() ->
+ Tab = mnesia_decision,
+ Pat = {mnesia_down, '_', '_', '_'},
+ Downs = ?ets_match_object(Tab, Pat),
+ [Node || {mnesia_down, Node, _Date, _Time} <- Downs].
+
+%% Check if we have got a mnesia_down from Node
+has_mnesia_down(Node) ->
+ case ?ets_lookup(mnesia_decision, Node) of
+ [{mnesia_down, Node, _Date, _Time}] ->
+ true;
+ [] ->
+ false
+ end.
+
+mnesia_down(Node) ->
+ case ?catch_val(recover_nodes) of
+ {'EXIT', _} ->
+ %% Not started yet
+ ignore;
+ _ ->
+ mnesia_lib:del(recover_nodes, Node),
+ cast({mnesia_down, Node})
+ end.
+
+log_master_nodes(Args, UseDir, IsRunning) ->
+ if
+ IsRunning == yes ->
+ log_master_nodes2(Args, UseDir, IsRunning, ok);
+ UseDir == false ->
+ ok;
+ true ->
+ Name = latest_log,
+ Fname = mnesia_log:latest_log_file(),
+ Exists = mnesia_lib:exists(Fname),
+ Repair = mnesia:system_info(auto_repair),
+ OpenArgs = [{file, Fname}, {name, Name}, {repair, Repair}],
+ case disk_log:open(OpenArgs) of
+ {ok, Name} ->
+ log_master_nodes2(Args, UseDir, IsRunning, ok);
+ {repaired, Name, {recovered, _R}, {badbytes, _B}}
+ when Exists == true ->
+ log_master_nodes2(Args, UseDir, IsRunning, ok);
+ {repaired, Name, {recovered, _R}, {badbytes, _B}}
+ when Exists == false ->
+ mnesia_log:write_trans_log_header(),
+ log_master_nodes2(Args, UseDir, IsRunning, ok);
+ {error, Reason} ->
+ {error, Reason}
+ end
+ end.
+
+log_master_nodes2([{Tab, Nodes} | Tail], UseDir, IsRunning, WorstRes) ->
+ Res =
+ case IsRunning of
+ yes ->
+ R = call({log_master_nodes, Tab, Nodes, UseDir, IsRunning}),
+ mnesia_controller:master_nodes_updated(Tab, Nodes),
+ R;
+ _ ->
+ do_log_master_nodes(Tab, Nodes, UseDir, IsRunning)
+ end,
+ case Res of
+ ok ->
+ log_master_nodes2(Tail, UseDir, IsRunning, WorstRes);
+ {error, Reason} ->
+ log_master_nodes2(Tail, UseDir, IsRunning, {error, Reason})
+ end;
+log_master_nodes2([], _UseDir, IsRunning, WorstRes) ->
+ case IsRunning of
+ yes ->
+ WorstRes;
+ _ ->
+ disk_log:close(latest_log),
+ WorstRes
+ end.
+
+get_master_node_info() ->
+ Tab = mnesia_decision,
+ Pat = {master_nodes, '_', '_'},
+ case catch mnesia_lib:db_match_object(ram_copies,Tab, Pat) of
+ {'EXIT', _} ->
+ [];
+ Masters ->
+ Masters
+ end.
+
+get_master_node_tables() ->
+ Masters = get_master_node_info(),
+ [Tab || {master_nodes, Tab, _Nodes} <- Masters].
+
+get_master_nodes(Tab) ->
+ case catch ?ets_lookup_element(mnesia_decision, Tab, 3) of
+ {'EXIT', _} -> [];
+ Nodes -> Nodes
+ end.
+
+%% Determine what has happened to the transaction
+what_happened(Tid, Protocol, Nodes) ->
+ Default =
+ case Protocol of
+ asym_trans -> aborted;
+ _ -> unclear %% sym_trans and sync_sym_trans
+ end,
+ This = node(),
+ case lists:member(This, Nodes) of
+ true ->
+ {ok, Outcome} = call({what_happened, Default, Tid}),
+ Others = Nodes -- [This],
+ case filter_outcome(Outcome) of
+ unclear -> what_happened_remotely(Tid, Default, Others);
+ aborted -> aborted;
+ committed -> committed
+ end;
+ false ->
+ what_happened_remotely(Tid, Default, Nodes)
+ end.
+
+what_happened_remotely(Tid, Default, Nodes) ->
+ {Replies, _} = multicall(Nodes, {what_happened, Default, Tid}),
+ check_what_happened(Replies, 0, 0).
+
+check_what_happened([H | T], Aborts, Commits) ->
+ case H of
+ {ok, R} ->
+ case filter_outcome(R) of
+ committed ->
+ check_what_happened(T, Aborts, Commits + 1);
+ aborted ->
+ check_what_happened(T, Aborts + 1, Commits);
+ unclear ->
+ check_what_happened(T, Aborts, Commits)
+ end;
+ {error, _} ->
+ check_what_happened(T, Aborts, Commits);
+ {badrpc, _} ->
+ check_what_happened(T, Aborts, Commits)
+ end;
+check_what_happened([], Aborts, Commits) ->
+ if
+ Aborts == 0, Commits == 0 -> aborted; % None of the active nodes knows
+ Aborts > 0 -> aborted; % Someody has aborted
+ Aborts == 0, Commits > 0 -> committed % All has committed
+ end.
+
+%% Determine what has happened to the transaction
+%% and possibly wait forever for the decision.
+wait_for_decision(presume_commit, _InitBy) ->
+ %% sym_trans
+ {{presume_commit, self()}, committed};
+
+wait_for_decision(D, InitBy) when D#decision.outcome == presume_abort ->
+ %% asym_trans
+ Tid = D#decision.tid,
+ Outcome = filter_outcome(outcome(Tid, D#decision.outcome)),
+ if
+ Outcome /= unclear ->
+ {Tid, Outcome};
+
+ InitBy /= startup ->
+ %% Wait a while for active transactions
+ %% to end and try again
+ timer:sleep(200),
+ wait_for_decision(D, InitBy);
+
+ InitBy == startup ->
+ {ok, Res} = call({wait_for_decision, D}),
+ {Tid, Res}
+ end.
+
+still_pending([Tid | Pending]) ->
+ case filter_outcome(outcome(Tid, unclear)) of
+ unclear -> [Tid | still_pending(Pending)];
+ _ -> still_pending(Pending)
+ end;
+still_pending([]) ->
+ [].
+
+load_decision_tab() ->
+ Cont = mnesia_log:open_decision_tab(),
+ load_decision_tab(Cont, load_decision_tab),
+ mnesia_log:close_decision_tab().
+
+load_decision_tab(eof, _InitBy) ->
+ ok;
+load_decision_tab(Cont, InitBy) ->
+ case mnesia_log:chunk_decision_tab(Cont) of
+ {Cont2, Decisions} ->
+ note_log_decisions(Decisions, InitBy),
+ load_decision_tab(Cont2, InitBy);
+ eof ->
+ ok
+ end.
+
+%% Dumps DECISION.LOG and PDECISION.LOG and removes them.
+%% From now on all decisions are logged in the transaction log file
+convert_old() ->
+ HasOldStuff =
+ mnesia_lib:exists(mnesia_log:previous_decision_log_file()) or
+ mnesia_lib:exists(mnesia_log:decision_log_file()),
+ case HasOldStuff of
+ true ->
+ mnesia_log:open_decision_log(),
+ dump_decision_log(startup),
+ dump_decision_log(startup),
+ mnesia_log:close_decision_log(),
+ Latest = mnesia_log:decision_log_file(),
+ ok = file:delete(Latest);
+ false ->
+ ignore
+ end.
+
+dump_decision_log(InitBy) ->
+ %% Assumed to be run in transaction log dumper process
+ Cont = mnesia_log:prepare_decision_log_dump(),
+ perform_dump_decision_log(Cont, InitBy).
+
+perform_dump_decision_log(eof, _InitBy) ->
+ confirm_decision_log_dump();
+perform_dump_decision_log(Cont, InitBy) when InitBy == startup ->
+ case mnesia_log:chunk_decision_log(Cont) of
+ {Cont2, Decisions} ->
+ note_log_decisions(Decisions, InitBy),
+ perform_dump_decision_log(Cont2, InitBy);
+ eof ->
+ confirm_decision_log_dump()
+ end;
+perform_dump_decision_log(_Cont, _InitBy) ->
+ confirm_decision_log_dump().
+
+confirm_decision_log_dump() ->
+ dump_decision_tab(),
+ mnesia_log:confirm_decision_log_dump().
+
+dump_decision_tab() ->
+ Tab = mnesia_decision,
+ All = mnesia_lib:db_match_object(ram_copies,Tab, '_'),
+ mnesia_log:save_decision_tab({decision_list, All}).
+
+note_log_decisions([What | Tail], InitBy) ->
+ note_log_decision(What, InitBy),
+ note_log_decisions(Tail, InitBy);
+note_log_decisions([], _InitBy) ->
+ ok.
+
+note_log_decision(NewD, InitBy) when NewD#decision.outcome == pre_commit ->
+ note_log_decision(NewD#decision{outcome = unclear}, InitBy);
+
+note_log_decision(NewD, _InitBy) when record(NewD, decision) ->
+ Tid = NewD#decision.tid,
+ sync_trans_tid_serial(Tid),
+ OldD = decision(Tid),
+ MergedD = merge_decisions(node(), OldD, NewD),
+ note_outcome(MergedD);
+
+note_log_decision({trans_tid, serial, _Serial}, startup) ->
+ ignore;
+
+note_log_decision({trans_tid, serial, Serial}, _InitBy) ->
+ sync_trans_tid_serial(Serial);
+
+note_log_decision({mnesia_up, Node, Date, Time}, _InitBy) ->
+ note_up(Node, Date, Time);
+
+note_log_decision({mnesia_down, Node, Date, Time}, _InitBy) ->
+ note_down(Node, Date, Time);
+
+note_log_decision({master_nodes, Tab, Nodes}, _InitBy) ->
+ note_master_nodes(Tab, Nodes);
+
+note_log_decision(H, _InitBy) when H#log_header.log_kind == decision_log ->
+ V = mnesia_log:decision_log_version(),
+ if
+ H#log_header.log_version == V->
+ ok;
+ H#log_header.log_version == "2.0" ->
+ verbose("Accepting an old version format of decision log: ~p~n",
+ [V]),
+ ok;
+ true ->
+ fatal("Bad version of decision log: ~p~n", [H])
+ end;
+
+note_log_decision(H, _InitBy) when H#log_header.log_kind == decision_tab ->
+ V = mnesia_log:decision_tab_version(),
+ if
+ V == H#log_header.log_version ->
+ ok;
+ true ->
+ fatal("Bad version of decision tab: ~p~n", [H])
+ end;
+note_log_decision({decision_list, ItemList}, InitBy) ->
+ note_log_decisions(ItemList, InitBy);
+note_log_decision(BadItem, InitBy) ->
+ exit({"Bad decision log item", BadItem, InitBy}).
+
+trans_tid_serial() ->
+ ?ets_lookup_element(mnesia_decision, serial, 3).
+
+set_trans_tid_serial(Val) ->
+ ?ets_insert(mnesia_decision, {trans_tid, serial, Val}).
+
+incr_trans_tid_serial() ->
+ ?ets_update_counter(mnesia_decision, serial, 1).
+
+sync_trans_tid_serial(ThatCounter) when integer(ThatCounter) ->
+ ThisCounter = trans_tid_serial(),
+ if
+ ThatCounter > ThisCounter ->
+ set_trans_tid_serial(ThatCounter + 1);
+ true ->
+ ignore
+ end;
+sync_trans_tid_serial(Tid) ->
+ sync_trans_tid_serial(Tid#tid.counter).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% Callback functions from gen_server
+
+%%----------------------------------------------------------------------
+%% Func: init/1
+%% Returns: {ok, State} |
+%% {ok, State, Timeout} |
+%% {stop, Reason}
+%%----------------------------------------------------------------------
+init([Parent]) ->
+ process_flag(trap_exit, true),
+ mnesia_lib:verbose("~p starting: ~p~n", [?MODULE, self()]),
+ set(latest_transient_decision, create_transient_decision()),
+ set(previous_transient_decisions, []),
+ set(recover_nodes, []),
+ State = #state{supervisor = Parent},
+ {ok, State}.
+
+create_transient_decision() ->
+ ?ets_new_table(mnesia_transient_decision, [{keypos, 2}, set, public]).
+
+%%----------------------------------------------------------------------
+%% Func: handle_call/3
+%% Returns: {reply, Reply, State} |
+%% {reply, Reply, State, Timeout} |
+%% {noreply, State} |
+%% {noreply, State, Timeout} |
+%% {stop, Reason, Reply, State} | (terminate/2 is called)
+%%----------------------------------------------------------------------
+
+handle_call(init, From, State) when State#state.initiated == false ->
+ Args = [{keypos, 2}, set, public, named_table],
+ case mnesia_monitor:use_dir() of
+ true ->
+ ?ets_new_table(mnesia_decision, Args),
+ set_trans_tid_serial(0),
+ TabFile = mnesia_log:decision_tab_file(),
+ case mnesia_lib:exists(TabFile) of
+ true ->
+ load_decision_tab();
+ false ->
+ ignore
+ end,
+ convert_old(),
+ mnesia_dumper:opt_dump_log(scan_decisions);
+ false ->
+ ?ets_new_table(mnesia_decision, Args),
+ set_trans_tid_serial(0)
+ end,
+ handle_early_msgs(State, From);
+
+handle_call(Msg, From, State) when State#state.initiated == false ->
+ %% Buffer early messages
+ Msgs = State#state.early_msgs,
+ {noreply, State#state{early_msgs = [{call, Msg, From} | Msgs]}};
+
+handle_call({what_happened, Default, Tid}, _From, State) ->
+ sync_trans_tid_serial(Tid),
+ Outcome = outcome(Tid, Default),
+ {reply, {ok, Outcome}, State};
+
+handle_call({wait_for_decision, D}, From, State) ->
+ Recov = val(recover_nodes),
+ AliveRam = (mnesia_lib:intersect(D#decision.ram_nodes, Recov) -- [node()]),
+ RemoteDisc = D#decision.disc_nodes -- [node()],
+ if
+ AliveRam == [], RemoteDisc == [] ->
+ %% No more else to wait for and we may safely abort
+ {reply, {ok, aborted}, State};
+ true ->
+ verbose("Transaction ~p is unclear. "
+ "Wait for disc nodes: ~w ram: ~w~n",
+ [D#decision.tid, RemoteDisc, AliveRam]),
+ AliveDisc = mnesia_lib:intersect(RemoteDisc, Recov),
+ Msg = {what_decision, node(), D},
+ abcast(AliveRam, Msg),
+ abcast(AliveDisc, Msg),
+ case val(max_wait_for_decision) of
+ infinity ->
+ ignore;
+ MaxWait ->
+ ForceMsg = {force_decision, D#decision.tid},
+ {ok, _} = timer:send_after(MaxWait, ForceMsg)
+ end,
+ State2 = State#state{unclear_pid = From,
+ unclear_decision = D,
+ unclear_waitfor = (RemoteDisc ++ AliveRam)},
+ {noreply, State2}
+ end;
+
+handle_call({log_mnesia_up, Node}, _From, State) ->
+ do_log_mnesia_up(Node),
+ {reply, ok, State};
+
+handle_call({log_mnesia_down, Node}, _From, State) ->
+ do_log_mnesia_down(Node),
+ {reply, ok, State};
+
+handle_call({log_master_nodes, Tab, Nodes, UseDir, IsRunning}, _From, State) ->
+ do_log_master_nodes(Tab, Nodes, UseDir, IsRunning),
+ {reply, ok, State};
+
+handle_call(Msg, _From, State) ->
+ error("~p got unexpected call: ~p~n", [?MODULE, Msg]),
+ {noreply, State}.
+
+do_log_mnesia_up(Node) ->
+ Yoyo = {mnesia_up, Node, Date = date(), Time = time()},
+ case mnesia_monitor:use_dir() of
+ true ->
+ mnesia_log:append(latest_log, Yoyo),
+ disk_log:sync(latest_log);
+ false ->
+ ignore
+ end,
+ note_up(Node, Date, Time).
+
+do_log_mnesia_down(Node) ->
+ Yoyo = {mnesia_down, Node, Date = date(), Time = time()},
+ case mnesia_monitor:use_dir() of
+ true ->
+ mnesia_log:append(latest_log, Yoyo),
+ disk_log:sync(latest_log);
+ false ->
+ ignore
+ end,
+ note_down(Node, Date, Time).
+
+do_log_master_nodes(Tab, Nodes, UseDir, IsRunning) ->
+ Master = {master_nodes, Tab, Nodes},
+ Res =
+ case UseDir of
+ true ->
+ LogRes = mnesia_log:append(latest_log, Master),
+ disk_log:sync(latest_log),
+ LogRes;
+ false ->
+ ok
+ end,
+ case IsRunning of
+ yes ->
+ note_master_nodes(Tab, Nodes);
+ _NotRunning ->
+ ignore
+ end,
+ Res.
+
+%%----------------------------------------------------------------------
+%% Func: handle_cast/2
+%% Returns: {noreply, State} |
+%% {noreply, State, Timeout} |
+%% {stop, Reason, State} (terminate/2 is called)
+%%----------------------------------------------------------------------
+
+handle_cast(Msg, State) when State#state.initiated == false ->
+ %% Buffer early messages
+ Msgs = State#state.early_msgs,
+ {noreply, State#state{early_msgs = [{cast, Msg} | Msgs]}};
+
+handle_cast({im_certain, Node, NewD}, State) ->
+ OldD = decision(NewD#decision.tid),
+ MergedD = merge_decisions(Node, OldD, NewD),
+ do_log_decision(MergedD, false),
+ {noreply, State};
+
+handle_cast(allow_garb, State) ->
+ do_allow_garb(),
+ {noreply, State};
+
+handle_cast({decisions, Node, Decisions}, State) ->
+ mnesia_lib:add(recover_nodes, Node),
+ State2 = add_remote_decisions(Node, Decisions, State),
+ {noreply, State2};
+
+handle_cast({what_decision, Node, OtherD}, State) ->
+ Tid = OtherD#decision.tid,
+ sync_trans_tid_serial(Tid),
+ Decision =
+ case decision(Tid) of
+ no_decision -> OtherD;
+ MyD when record(MyD, decision) -> MyD
+ end,
+ announce([Node], [Decision], [], true),
+ {noreply, State};
+
+handle_cast({mnesia_down, Node}, State) ->
+ case State#state.unclear_decision of
+ undefined ->
+ {noreply, State};
+ D ->
+ case lists:member(Node, D#decision.ram_nodes) of
+ false ->
+ {noreply, State};
+ true ->
+ State2 = add_remote_decision(Node, D, State),
+ {noreply, State2}
+ end
+ end;
+
+handle_cast({announce_all, Nodes}, State) ->
+ announce_all(Nodes, tabs()),
+ {noreply, State};
+
+handle_cast(Msg, State) ->
+ error("~p got unexpected cast: ~p~n", [?MODULE, Msg]),
+ {noreply, State}.
+
+%%----------------------------------------------------------------------
+%% Func: handle_info/2
+%% Returns: {noreply, State} |
+%% {noreply, State, Timeout} |
+%% {stop, Reason, State} (terminate/2 is called)
+%%----------------------------------------------------------------------
+
+%% No need for buffering
+%% handle_info(Msg, State) when State#state.initiated == false ->
+%% %% Buffer early messages
+%% Msgs = State#state.early_msgs,
+%% {noreply, State#state{early_msgs = [{info, Msg} | Msgs]}};
+
+handle_info(check_overload, S) ->
+ %% Time to check if mnesia_tm is overloaded
+ case whereis(mnesia_tm) of
+ Pid when pid(Pid) ->
+
+ Threshold = 100,
+ Prev = S#state.tm_queue_len,
+ {message_queue_len, Len} =
+ process_info(Pid, message_queue_len),
+ if
+ Len > Threshold, Prev > Threshold ->
+ What = {mnesia_tm, message_queue_len, [Prev, Len]},
+ mnesia_lib:report_system_event({mnesia_overload, What}),
+ {noreply, S#state{tm_queue_len = 0}};
+
+ Len > Threshold ->
+ {noreply, S#state{tm_queue_len = Len}};
+
+ true ->
+ {noreply, S#state{tm_queue_len = 0}}
+ end;
+ undefined ->
+ {noreply, S}
+ end;
+
+handle_info(garb_decisions, State) ->
+ do_garb_decisions(),
+ {noreply, State};
+
+handle_info({force_decision, Tid}, State) ->
+ %% Enforce a transaction recovery decision,
+ %% if we still are waiting for the outcome
+
+ case State#state.unclear_decision of
+ U when U#decision.tid == Tid ->
+ verbose("Decided to abort transaction ~p since "
+ "max_wait_for_decision has been exceeded~n",
+ [Tid]),
+ D = U#decision{outcome = aborted},
+ State2 = add_remote_decision(node(), D, State),
+ {noreply, State2};
+ _ ->
+ {noreply, State}
+ end;
+
+handle_info({'EXIT', Pid, R}, State) when Pid == State#state.supervisor ->
+ mnesia_lib:dbg_out("~p was ~p~n",[?MODULE, R]),
+ {stop, shutdown, State};
+
+handle_info(Msg, State) ->
+ error("~p got unexpected info: ~p~n", [?MODULE, Msg]),
+ {noreply, State}.
+
+%%----------------------------------------------------------------------
+%% Func: terminate/2
+%% Purpose: Shutdown the server
+%% Returns: any (ignored by gen_server)
+%%----------------------------------------------------------------------
+
+terminate(Reason, State) ->
+ mnesia_monitor:terminate_proc(?MODULE, Reason, State).
+
+%%----------------------------------------------------------------------
+%% Func: code_change/3
+%% Purpose: Upgrade process when its code is to be changed
+%% Returns: {ok, NewState}
+%%----------------------------------------------------------------------
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
+
+%%%----------------------------------------------------------------------
+%%% Internal functions
+%%%----------------------------------------------------------------------
+
+handle_early_msgs(State, From) ->
+ Res = do_handle_early_msgs(State#state.early_msgs,
+ State#state{early_msgs = [],
+ initiated = true}),
+ gen_server:reply(From, ok),
+ Res.
+
+do_handle_early_msgs([Msg | Msgs], State) ->
+ %% The messages are in reverted order
+ case do_handle_early_msgs(Msgs, State) of
+ {stop, Reason, Reply, State2} ->
+ {stop, Reason, Reply, State2};
+ {stop, Reason, State2} ->
+ {stop, Reason, State2};
+ {noreply, State2} ->
+ handle_early_msg(Msg, State2)
+ end;
+
+do_handle_early_msgs([], State) ->
+ {noreply, State}.
+
+handle_early_msg({call, Msg, From}, State) ->
+ case handle_call(Msg, From, State) of
+ {reply, R, S} ->
+ gen_server:reply(From, R),
+ {noreply, S};
+ Other ->
+ Other
+ end;
+handle_early_msg({cast, Msg}, State) ->
+ handle_cast(Msg, State);
+handle_early_msg({info, Msg}, State) ->
+ handle_info(Msg, State).
+
+tabs() ->
+ Curr = val(latest_transient_decision), % Do not miss any trans even
+ Prev = val(previous_transient_decisions), % if the tabs are switched
+ [Curr, mnesia_decision | Prev]. % Ordered by hit probability
+
+decision(Tid) ->
+ decision(Tid, tabs()).
+
+decision(Tid, [Tab | Tabs]) ->
+ case catch ?ets_lookup(Tab, Tid) of
+ [D] when record(D, decision) ->
+ D;
+ [C] when record(C, transient_decision) ->
+ #decision{tid = C#transient_decision.tid,
+ outcome = C#transient_decision.outcome,
+ disc_nodes = [],
+ ram_nodes = []
+ };
+ [] ->
+ decision(Tid, Tabs);
+ {'EXIT', _} ->
+ %% Recently switched transient decision table
+ decision(Tid, Tabs)
+ end;
+decision(_Tid, []) ->
+ no_decision.
+
+outcome(Tid, Default) ->
+ outcome(Tid, Default, tabs()).
+
+outcome(Tid, Default, [Tab | Tabs]) ->
+ case catch ?ets_lookup_element(Tab, Tid, 3) of
+ {'EXIT', _} ->
+ outcome(Tid, Default, Tabs);
+ Val ->
+ Val
+ end;
+outcome(_Tid, Default, []) ->
+ Default.
+
+filter_outcome(Val) ->
+ case Val of
+ unclear -> unclear;
+ aborted -> aborted;
+ presume_abort -> aborted;
+ committed -> committed;
+ pre_commit -> unclear
+ end.
+
+filter_aborted(D) when D#decision.outcome == presume_abort ->
+ D#decision{outcome = aborted};
+filter_aborted(D) ->
+ D.
+
+%% Merge old decision D with new (probably remote) decision
+merge_decisions(Node, D, NewD0) ->
+ NewD = filter_aborted(NewD0),
+ if
+ D == no_decision, node() /= Node ->
+ %% We did not know anything about this txn
+ NewD#decision{disc_nodes = []};
+ D == no_decision ->
+ NewD;
+ record(D, decision) ->
+ DiscNs = D#decision.disc_nodes -- ([node(), Node]),
+ OldD = filter_aborted(D#decision{disc_nodes = DiscNs}),
+%% mnesia_lib:dbg_out("merge ~w: NewD = ~w~n D = ~w~n OldD = ~w~n",
+%% [Node, NewD, D, OldD]),
+ if
+ OldD#decision.outcome == unclear,
+ NewD#decision.outcome == unclear ->
+ D;
+
+ OldD#decision.outcome == NewD#decision.outcome ->
+ %% We have come to the same decision
+ OldD;
+
+ OldD#decision.outcome == committed,
+ NewD#decision.outcome == aborted ->
+ %% Interesting! We have already committed,
+ %% but someone else has aborted. Now we
+ %% have a nice little inconcistency. The
+ %% other guy (or some one else) has
+ %% enforced a recovery decision when
+ %% max_wait_for_decision was exceeded.
+ %% We will pretend that we have obeyed
+ %% the forced recovery decision, but we
+ %% will also generate an event in case the
+ %% application wants to do something clever.
+ Msg = {inconsistent_database, bad_decision, Node},
+ mnesia_lib:report_system_event(Msg),
+ OldD#decision{outcome = aborted};
+
+ OldD#decision.outcome == aborted ->
+ %% aborted overrrides anything
+ OldD#decision{outcome = aborted};
+
+ NewD#decision.outcome == aborted ->
+ %% aborted overrrides anything
+ OldD#decision{outcome = aborted};
+
+ OldD#decision.outcome == committed,
+ NewD#decision.outcome == unclear ->
+ %% committed overrides unclear
+ OldD#decision{outcome = committed};
+
+ OldD#decision.outcome == unclear,
+ NewD#decision.outcome == committed ->
+ %% committed overrides unclear
+ OldD#decision{outcome = committed}
+ end
+ end.
+
+add_remote_decisions(Node, [D | Tail], State) when record(D, decision) ->
+ State2 = add_remote_decision(Node, D, State),
+ add_remote_decisions(Node, Tail, State2);
+
+add_remote_decisions(Node, [C | Tail], State)
+ when record(C, transient_decision) ->
+ D = #decision{tid = C#transient_decision.tid,
+ outcome = C#transient_decision.outcome,
+ disc_nodes = [],
+ ram_nodes = []},
+ State2 = add_remote_decision(Node, D, State),
+ add_remote_decisions(Node, Tail, State2);
+
+add_remote_decisions(Node, [{mnesia_down, _, _, _} | Tail], State) ->
+ add_remote_decisions(Node, Tail, State);
+
+add_remote_decisions(Node, [{trans_tid, serial, Serial} | Tail], State) ->
+ sync_trans_tid_serial(Serial),
+ case State#state.unclear_decision of
+ undefined ->
+ ignored;
+ D ->
+ case lists:member(Node, D#decision.ram_nodes) of
+ true ->
+ ignore;
+ false ->
+ abcast([Node], {what_decision, node(), D})
+ end
+ end,
+ add_remote_decisions(Node, Tail, State);
+
+add_remote_decisions(_Node, [], State) ->
+ State.
+
+add_remote_decision(Node, NewD, State) ->
+ Tid = NewD#decision.tid,
+ OldD = decision(Tid),
+ D = merge_decisions(Node, OldD, NewD),
+ do_log_decision(D, false),
+ Outcome = D#decision.outcome,
+ if
+ OldD == no_decision ->
+ ignore;
+ Outcome == unclear ->
+ ignore;
+ true ->
+ case lists:member(node(), NewD#decision.disc_nodes) or
+ lists:member(node(), NewD#decision.ram_nodes) of
+ true ->
+ tell_im_certain([Node], D);
+ false ->
+ ignore
+ end
+ end,
+ case State#state.unclear_decision of
+ U when U#decision.tid == Tid ->
+ WaitFor = State#state.unclear_waitfor -- [Node],
+ if
+ Outcome == unclear, WaitFor == [] ->
+ %% Everybody are uncertain, lets abort
+ NewOutcome = aborted,
+ CertainD = D#decision{outcome = NewOutcome,
+ disc_nodes = [],
+ ram_nodes = []},
+ tell_im_certain(D#decision.disc_nodes, CertainD),
+ tell_im_certain(D#decision.ram_nodes, CertainD),
+ do_log_decision(CertainD, false),
+ verbose("Decided to abort transaction ~p "
+ "since everybody are uncertain ~p~n",
+ [Tid, CertainD]),
+ gen_server:reply(State#state.unclear_pid, {ok, NewOutcome}),
+ State#state{unclear_pid = undefined,
+ unclear_decision = undefined,
+ unclear_waitfor = undefined};
+ Outcome /= unclear ->
+ verbose("~p told us that transaction ~p was ~p~n",
+ [Node, Tid, Outcome]),
+ gen_server:reply(State#state.unclear_pid, {ok, Outcome}),
+ State#state{unclear_pid = undefined,
+ unclear_decision = undefined,
+ unclear_waitfor = undefined};
+ Outcome == unclear ->
+ State#state{unclear_waitfor = WaitFor}
+ end;
+ _ ->
+ State
+ end.
+
+announce_all([], _Tabs) ->
+ ok;
+announce_all(ToNodes, [Tab | Tabs]) ->
+ case catch mnesia_lib:db_match_object(ram_copies, Tab, '_') of
+ {'EXIT', _} ->
+ %% Oops, we are in the middle of a 'garb_decisions'
+ announce_all(ToNodes, Tabs);
+ List ->
+ announce(ToNodes, List, [], false),
+ announce_all(ToNodes, Tabs)
+ end;
+announce_all(_ToNodes, []) ->
+ ok.
+
+announce(ToNodes, [Head | Tail], Acc, ForceSend) ->
+ Acc2 = arrange(ToNodes, Head, Acc, ForceSend),
+ announce(ToNodes, Tail, Acc2, ForceSend);
+
+announce(_ToNodes, [], Acc, _ForceSend) ->
+ send_decisions(Acc).
+
+send_decisions([{Node, Decisions} | Tail]) ->
+ abcast([Node], {decisions, node(), Decisions}),
+ send_decisions(Tail);
+send_decisions([]) ->
+ ok.
+
+arrange([To | ToNodes], D, Acc, ForceSend) when record(D, decision) ->
+ NeedsAdd = (ForceSend or
+ lists:member(To, D#decision.disc_nodes) or
+ lists:member(To, D#decision.ram_nodes)),
+ case NeedsAdd of
+ true ->
+ Acc2 = add_decision(To, D, Acc),
+ arrange(ToNodes, D, Acc2, ForceSend);
+ false ->
+ arrange(ToNodes, D, Acc, ForceSend)
+ end;
+
+arrange([To | ToNodes], C, Acc, ForceSend) when record(C, transient_decision) ->
+ Acc2 = add_decision(To, C, Acc),
+ arrange(ToNodes, C, Acc2, ForceSend);
+
+arrange([_To | _ToNodes], {mnesia_down, _Node, _Date, _Time}, Acc, _ForceSend) ->
+ %% The others have their own info about this
+ Acc;
+
+arrange([_To | _ToNodes], {master_nodes, _Tab, _Nodes}, Acc, _ForceSend) ->
+ %% The others have their own info about this
+ Acc;
+
+arrange([To | ToNodes], {trans_tid, serial, Serial}, Acc, ForceSend) ->
+ %% Do the lamport thing plus release the others
+ %% from uncertainity.
+ Acc2 = add_decision(To, {trans_tid, serial, Serial}, Acc),
+ arrange(ToNodes, {trans_tid, serial, Serial}, Acc2, ForceSend);
+
+arrange([], _Decision, Acc, _ForceSend) ->
+ Acc.
+
+add_decision(Node, Decision, [{Node, Decisions} | Tail]) ->
+ [{Node, [Decision | Decisions]} | Tail];
+add_decision(Node, Decision, [Head | Tail]) ->
+ [Head | add_decision(Node, Decision, Tail)];
+add_decision(Node, Decision, []) ->
+ [{Node, [Decision]}].
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_registry.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_registry.erl
new file mode 100644
index 0000000000..a7e65506fa
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_registry.erl
@@ -0,0 +1,276 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_registry.erl,v 1.2 2010/03/04 13:54:19 maria Exp $
+%%
+-module(mnesia_registry).
+
+%%%----------------------------------------------------------------------
+%%% File : mnesia_registry.erl
+%%% Purpose : Support dump and restore of a registry on a C-node
+%%% This is an OTP internal module and is not public available.
+%%%
+%%% Example : Dump some hardcoded records into the Mnesia table Tab
+%%%
+%%% case rpc:call(Node, mnesia_registry, start_dump, [Tab, self()]) of
+%%% Pid when pid(Pid) ->
+%%% Pid ! {write, key1, key_size1, val_type1, val_size1, val1},
+%%% Pid ! {delete, key3},
+%%% Pid ! {write, key2, key_size2, val_type2, val_size2, val2},
+%%% Pid ! {write, key4, key_size4, val_type4, val_size4, val4},
+%%% Pid ! {commit, self()},
+%%% receive
+%%% {ok, Pid} ->
+%%% ok;
+%%% {'EXIT', Pid, Reason} ->
+%%% exit(Reason)
+%%% end;
+%%% {badrpc, Reason} ->
+%%% exit(Reason)
+%%% end.
+%%%
+%%% Example : Restore the corresponding Mnesia table Tab
+%%%
+%%% case rpc:call(Node, mnesia_registry, start_restore, [Tab, self()]) of
+%%% {size, Pid, N, LargestKey, LargestVal} ->
+%%% Pid ! {send_records, self()},
+%%% Fun = fun() ->
+%%% receive
+%%% {restore, KeySize, ValSize, ValType, Key, Val} ->
+%%% {Key, Val};
+%%% {'EXIT', Pid, Reason} ->
+%%% exit(Reason)
+%%% end
+%%% end,
+%%% lists:map(Fun, lists:seq(1, N));
+%%% {badrpc, Reason} ->
+%%% exit(Reason)
+%%% end.
+%%%
+%%%----------------------------------------------------------------------
+
+%% External exports
+-export([start_dump/2, start_restore/2]).
+-export([create_table/1, create_table/2]).
+
+%% Internal exports
+-export([init/4]).
+
+-record(state, {table, ops = [], link_to}).
+
+-record(registry_entry, {key, key_size, val_type, val_size, val}).
+
+-record(size, {pid = self(), n_values = 0, largest_key = 0, largest_val = 0}).
+
+%%%----------------------------------------------------------------------
+%%% Client
+%%%----------------------------------------------------------------------
+
+start(Type, Tab, LinkTo) ->
+ Starter = self(),
+ Args = [Type, Starter, LinkTo, Tab],
+ Pid = spawn_link(?MODULE, init, Args),
+ %% The receiver process may unlink the current process
+ receive
+ {ok, Res} ->
+ Res;
+ {'EXIT', Pid, Reason} when LinkTo == Starter ->
+ exit(Reason)
+ end.
+
+%% Starts a receiver process and optionally creates a Mnesia table
+%% with suitable default values. Returns the Pid of the receiver process
+%%
+%% The receiver process accumulates Mnesia operations and performs
+%% all operations or none at commit. The understood messages are:
+%%
+%% {write, Key, KeySize, ValType, ValSize, Val} ->
+%% accumulates mnesia:write({Tab, Key, KeySize, ValType, ValSize, Val})
+%% (no reply)
+%% {delete, Key} ->
+%% accumulates mnesia:delete({Tab, Key}) (no reply)
+%% {commit, ReplyTo} ->
+%% commits all accumulated operations
+%% and stops the process (replies {ok, Pid})
+%% abort ->
+%% stops the process (no reply)
+%%
+%% The receiver process is linked to the process with the process identifier
+%% LinkTo. If some error occurs the receiver process will invoke exit(Reason)
+%% and it is up to he LinkTo process to act properly when it receives an exit
+%% signal.
+
+start_dump(Tab, LinkTo) ->
+ start(dump, Tab, LinkTo).
+
+%% Starts a sender process which sends restore messages back to the
+%% LinkTo process. But first are some statistics about the table
+%% determined and returned as a 5-tuple:
+%%
+%% {size, SenderPid, N, LargestKeySize, LargestValSize}
+%%
+%% where N is the number of records in the table. Then the sender process
+%% waits for a 2-tuple message:
+%%
+%% {send_records, ReplyTo}
+%%
+%% At last N 6-tuple messages is sent to the ReplyTo process:
+%%
+%% ReplyTo ! {restore, KeySize, ValSize, ValType, Key, Val}
+%%
+%% If some error occurs the receiver process will invoke exit(Reason)
+%% and it is up to he LinkTo process to act properly when it receives an
+%% exit signal.
+
+start_restore(Tab, LinkTo) ->
+ start(restore, Tab, LinkTo).
+
+
+%% Optionally creates the Mnesia table Tab with suitable default values.
+%% Returns ok or EXIT's
+create_table(Tab) ->
+ Storage = mnesia:table_info(schema, storage_type),
+ create_table(Tab, [{Storage, [node()]}]).
+
+create_table(Tab, TabDef) ->
+ Attrs = record_info(fields, registry_entry),
+ case mnesia:create_table(Tab, [{attributes, Attrs} | TabDef]) of
+ {'atomic', ok} ->
+ ok;
+ {aborted, {already_exists, Tab}} ->
+ ok;
+ {aborted, Reason} ->
+ exit(Reason)
+ end.
+
+%%%----------------------------------------------------------------------
+%%% Server
+%%%----------------------------------------------------------------------
+
+init(Type, Starter, LinkTo, Tab) ->
+ if
+ LinkTo /= Starter ->
+ link(LinkTo),
+ unlink(Starter);
+ true ->
+ ignore
+ end,
+ case Type of
+ dump ->
+ Starter ! {ok, self()},
+ dump_loop(#state{table = Tab, link_to = LinkTo});
+ restore ->
+ restore_table(Tab, Starter, LinkTo)
+ end.
+
+%%%----------------------------------------------------------------------
+%%% Dump loop
+%%%----------------------------------------------------------------------
+
+dump_loop(S) ->
+ Tab = S#state.table,
+ Ops = S#state.ops,
+ receive
+ {write, Key, KeySize, ValType, ValSize, Val} ->
+ RE = #registry_entry{key = Key,
+ key_size = KeySize,
+ val_type = ValType,
+ val_size = ValSize,
+ val = Val},
+ dump_loop(S#state{ops = [{write, RE} | Ops]});
+ {delete, Key} ->
+ dump_loop(S#state{ops = [{delete, Key} | Ops]});
+ {commit, ReplyTo} ->
+ create_table(Tab),
+ RecName = mnesia:table_info(Tab, record_name),
+ %% The Ops are in reverse order, but there is no need
+ %% for reversing the list of accumulated operations
+ case mnesia:transaction(fun handle_ops/3, [Tab, RecName, Ops]) of
+ {'atomic', ok} ->
+ ReplyTo ! {ok, self()},
+ stop(S#state.link_to);
+ {aborted, Reason} ->
+ exit({aborted, Reason})
+ end;
+ abort ->
+ stop(S#state.link_to);
+ BadMsg ->
+ exit({bad_message, BadMsg})
+ end.
+
+stop(LinkTo) ->
+ unlink(LinkTo),
+ exit(normal).
+
+%% Grab a write lock for the entire table
+%% and iterate over all accumulated operations
+handle_ops(Tab, RecName, Ops) ->
+ mnesia:write_lock_table(Tab),
+ do_handle_ops(Tab, RecName, Ops).
+
+do_handle_ops(Tab, RecName, [{write, RegEntry} | Ops]) ->
+ Record = setelement(1, RegEntry, RecName),
+ mnesia:write(Tab, Record, write),
+ do_handle_ops(Tab, RecName, Ops);
+do_handle_ops(Tab, RecName, [{delete, Key} | Ops]) ->
+ mnesia:delete(Tab, Key, write),
+ do_handle_ops(Tab, RecName, Ops);
+do_handle_ops(_Tab, _RecName, []) ->
+ ok.
+
+%%%----------------------------------------------------------------------
+%%% Restore table
+%%%----------------------------------------------------------------------
+
+restore_table(Tab, Starter, LinkTo) ->
+ Pat = mnesia:table_info(Tab, wild_pattern),
+ Fun = fun() -> mnesia:match_object(Tab, Pat, read) end,
+ case mnesia:transaction(Fun) of
+ {'atomic', AllRecords} ->
+ Size = calc_size(AllRecords, #size{}),
+ Starter ! {ok, Size},
+ receive
+ {send_records, ReplyTo} ->
+ send_records(AllRecords, ReplyTo),
+ unlink(LinkTo),
+ exit(normal);
+ BadMsg ->
+ exit({bad_message, BadMsg})
+ end;
+ {aborted, Reason} ->
+ exit(Reason)
+ end.
+
+calc_size([H | T], S) ->
+ KeySize = max(element(#registry_entry.key_size, H), S#size.largest_key),
+ ValSize = max(element(#registry_entry.val_size, H), S#size.largest_val),
+ N = S#size.n_values + 1,
+ calc_size(T, S#size{n_values = N, largest_key = KeySize, largest_val = ValSize});
+calc_size([], Size) ->
+ Size.
+
+max(New, Old) when New > Old -> New;
+max(_New, Old) -> Old.
+
+send_records([H | T], ReplyTo) ->
+ KeySize = element(#registry_entry.key_size, H),
+ ValSize = element(#registry_entry.val_size, H),
+ ValType = element(#registry_entry.val_type, H),
+ Key = element(#registry_entry.key, H),
+ Val = element(#registry_entry.val, H),
+ ReplyTo ! {restore, KeySize, ValSize, ValType, Key, Val},
+ send_records(T, ReplyTo);
+send_records([], _ReplyTo) ->
+ ok.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_schema.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_schema.erl
new file mode 100644
index 0000000000..395532e91b
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_schema.erl
@@ -0,0 +1,2898 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_schema.erl,v 1.2 2010/03/04 13:54:20 maria Exp $
+%%
+%% In this module we provide a number of explicit functions
+%% to maninpulate the schema. All these functions are called
+%% within a special schema transaction.
+%%
+%% We also have an init/1 function defined here, this func is
+%% used by mnesia:start() to initialize the entire schema.
+
+-module(mnesia_schema).
+
+-export([
+ add_snmp/2,
+ add_table_copy/3,
+ add_table_index/2,
+ arrange_restore/3,
+ attr_tab_to_pos/2,
+ attr_to_pos/2,
+ change_table_copy_type/3,
+ change_table_access_mode/2,
+ change_table_load_order/2,
+ change_table_frag/2,
+ clear_table/1,
+ create_table/1,
+ cs2list/1,
+ del_snmp/1,
+ del_table_copy/2,
+ del_table_index/2,
+ delete_cstruct/2,
+ delete_schema/1,
+ delete_schema2/0,
+ delete_table/1,
+ delete_table_property/2,
+ dump_tables/1,
+ ensure_no_schema/1,
+ get_create_list/1,
+ get_initial_schema/2,
+ get_table_properties/1,
+ info/0,
+ info/1,
+ init/1,
+ insert_cstruct/3,
+ is_remote_member/1,
+ list2cs/1,
+ lock_schema/0,
+ lock_del_table/4, % Spawned
+ merge_schema/0,
+ move_table/3,
+ opt_create_dir/2,
+ prepare_commit/3,
+ purge_dir/2,
+ purge_tmp_files/0,
+ ram_delete_table/2,
+% ram_delete_table/3,
+ read_cstructs_from_disc/0,
+ read_nodes/0,
+ remote_read_schema/0,
+ restore/1,
+ restore/2,
+ restore/3,
+ schema_coordinator/3,
+ set_where_to_read/3,
+ transform_table/4,
+ undo_prepare_commit/2,
+ unlock_schema/0,
+ version/0,
+ write_table_property/2
+ ]).
+
+%% Exports for mnesia_frag
+-export([
+ get_tid_ts_and_lock/2,
+ make_create_table/1,
+ ensure_active/1,
+ pick/4,
+ verify/3,
+ incr_version/1,
+ check_keys/3,
+ check_duplicates/2,
+ make_delete_table/2
+ ]).
+
+%% Needed outside to be able to use/set table_properties
+%% from user (not supported)
+-export([schema_transaction/1,
+ insert_schema_ops/2,
+ do_create_table/1,
+ do_delete_table/1,
+ do_delete_table_property/2,
+ do_write_table_property/2]).
+
+-include("mnesia.hrl").
+-include_lib("kernel/include/file.hrl").
+
+-import(mnesia_lib, [set/2, del/2, verbose/2, dbg_out/2]).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Here comes the init function which also resides in
+%% this module, it is called upon by the trans server
+%% at startup of the system
+%%
+%% We have a meta table which looks like
+%% {table, schema,
+%% {type, set},
+%% {disc_copies, all},
+%% {arity, 2}
+%% {attributes, [key, val]}
+%%
+%% This means that we have a series of {schema, Name, Cs} tuples
+%% in a table called schema !!
+
+init(IgnoreFallback) ->
+ Res = read_schema(true, false, IgnoreFallback),
+ {ok, Source, _CreateList} = exit_on_error(Res),
+ verbose("Schema initiated from: ~p~n", [Source]),
+ set({schema, tables}, []),
+ set({schema, local_tables}, []),
+ Tabs = set_schema(?ets_first(schema)),
+ lists:foreach(fun(Tab) -> clear_whereabouts(Tab) end, Tabs),
+ set({schema, where_to_read}, node()),
+ set({schema, load_node}, node()),
+ set({schema, load_reason}, initial),
+ mnesia_controller:add_active_replica(schema, node()).
+
+exit_on_error({error, Reason}) ->
+ exit(Reason);
+exit_on_error(GoodRes) ->
+ GoodRes.
+
+val(Var) ->
+ case ?catch_val(Var) of
+ {'EXIT', Reason} -> mnesia_lib:other_val(Var, Reason);
+ Value -> Value
+ end.
+
+%% This function traverses all cstructs in the schema and
+%% sets all values in mnesia_gvar accordingly for each table/cstruct
+
+set_schema('$end_of_table') ->
+ [];
+set_schema(Tab) ->
+ do_set_schema(Tab),
+ [Tab | set_schema(?ets_next(schema, Tab))].
+
+get_create_list(Tab) ->
+ ?ets_lookup_element(schema, Tab, 3).
+
+do_set_schema(Tab) ->
+ List = get_create_list(Tab),
+ Cs = list2cs(List),
+ do_set_schema(Tab, Cs).
+
+do_set_schema(Tab, Cs) ->
+ Type = Cs#cstruct.type,
+ set({Tab, setorbag}, Type),
+ set({Tab, local_content}, Cs#cstruct.local_content),
+ set({Tab, ram_copies}, Cs#cstruct.ram_copies),
+ set({Tab, disc_copies}, Cs#cstruct.disc_copies),
+ set({Tab, disc_only_copies}, Cs#cstruct.disc_only_copies),
+ set({Tab, load_order}, Cs#cstruct.load_order),
+ set({Tab, access_mode}, Cs#cstruct.access_mode),
+ set({Tab, snmp}, Cs#cstruct.snmp),
+ set({Tab, user_properties}, Cs#cstruct.user_properties),
+ [set({Tab, user_property, element(1, P)}, P) || P <- Cs#cstruct.user_properties],
+ set({Tab, frag_properties}, Cs#cstruct.frag_properties),
+ mnesia_frag:set_frag_hash(Tab, Cs#cstruct.frag_properties),
+ set({Tab, attributes}, Cs#cstruct.attributes),
+ Arity = length(Cs#cstruct.attributes) + 1,
+ set({Tab, arity}, Arity),
+ RecName = Cs#cstruct.record_name,
+ set({Tab, record_name}, RecName),
+ set({Tab, record_validation}, {RecName, Arity, Type}),
+ set({Tab, wild_pattern}, wild(RecName, Arity)),
+ set({Tab, index}, Cs#cstruct.index),
+ %% create actual index tabs later
+ set({Tab, cookie}, Cs#cstruct.cookie),
+ set({Tab, version}, Cs#cstruct.version),
+ set({Tab, cstruct}, Cs),
+ Storage = mnesia_lib:schema_cs_to_storage_type(node(), Cs),
+ set({Tab, storage_type}, Storage),
+ mnesia_lib:add({schema, tables}, Tab),
+ Ns = mnesia_lib:cs_to_nodes(Cs),
+ case lists:member(node(), Ns) of
+ true ->
+ mnesia_lib:add({schema, local_tables}, Tab);
+ false when Tab == schema ->
+ mnesia_lib:add({schema, local_tables}, Tab);
+ false ->
+ ignore
+ end.
+
+wild(RecName, Arity) ->
+ Wp0 = list_to_tuple(lists:duplicate(Arity, '_')),
+ setelement(1, Wp0, RecName).
+
+%% Temporarily read the local schema and return a list
+%% of all nodes mentioned in the schema.DAT file
+read_nodes() ->
+ %% Ensure that we access the intended Mnesia
+ %% directory. This function may not be called
+ %% during startup since it will cause the
+ %% application_controller to get into deadlock
+ case mnesia_lib:ensure_loaded(?APPLICATION) of
+ ok ->
+ case read_schema(false, false) of
+ {ok, _Source, CreateList} ->
+ Cs = list2cs(CreateList),
+ {ok, Cs#cstruct.disc_copies ++ Cs#cstruct.ram_copies};
+ {error, Reason} ->
+ {error, Reason}
+ end;
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+%% Returns Version from the tuple {Version,MasterNodes}
+version() ->
+ case read_schema(false, false) of
+ {ok, Source, CreateList} when Source /= default ->
+ Cs = list2cs(CreateList),
+ {Version, _Details} = Cs#cstruct.version,
+ Version;
+ _ ->
+ case dir_exists(mnesia_lib:dir()) of
+ true -> {1,0};
+ false -> {0,0}
+ end
+ end.
+
+%% Calculate next table version from old cstruct
+incr_version(Cs) ->
+ {{Major, Minor}, _} = Cs#cstruct.version,
+ Nodes = mnesia_lib:intersect(val({schema, disc_copies}),
+ mnesia_lib:cs_to_nodes(Cs)),
+ V =
+ case Nodes -- val({Cs#cstruct.name, active_replicas}) of
+ [] -> {Major + 1, 0}; % All replicas are active
+ _ -> {Major, Minor + 1} % Some replicas are inactive
+ end,
+ Cs#cstruct{version = {V, {node(), now()}}}.
+
+%% Returns table name
+insert_cstruct(Tid, Cs, KeepWhereabouts) ->
+ Tab = Cs#cstruct.name,
+ TabDef = cs2list(Cs),
+ Val = {schema, Tab, TabDef},
+ mnesia_checkpoint:tm_retain(Tid, schema, Tab, write),
+ mnesia_subscr:report_table_event(schema, Tid, Val, write),
+ Active = val({Tab, active_replicas}),
+
+ case KeepWhereabouts of
+ true ->
+ ignore;
+ false when Active == [] ->
+ clear_whereabouts(Tab);
+ false ->
+ %% Someone else has initiated table
+ ignore
+ end,
+ set({Tab, cstruct}, Cs),
+ ?ets_insert(schema, Val),
+ do_set_schema(Tab, Cs),
+ Val.
+
+clear_whereabouts(Tab) ->
+ set({Tab, checkpoints}, []),
+ set({Tab, subscribers}, []),
+ set({Tab, where_to_read}, nowhere),
+ set({Tab, active_replicas}, []),
+ set({Tab, commit_work}, []),
+ set({Tab, where_to_write}, []),
+ set({Tab, where_to_commit}, []),
+ set({Tab, load_by_force}, false),
+ set({Tab, load_node}, unknown),
+ set({Tab, load_reason}, unknown).
+
+%% Returns table name
+delete_cstruct(Tid, Cs) ->
+ Tab = Cs#cstruct.name,
+ TabDef = cs2list(Cs),
+ Val = {schema, Tab, TabDef},
+ mnesia_checkpoint:tm_retain(Tid, schema, Tab, delete),
+ mnesia_subscr:report_table_event(schema, Tid, Val, delete),
+ ?ets_match_delete(mnesia_gvar, {{Tab, '_'}, '_'}),
+ ?ets_match_delete(mnesia_gvar, {{Tab, '_', '_'}, '_'}),
+ del({schema, local_tables}, Tab),
+ del({schema, tables}, Tab),
+ ?ets_delete(schema, Tab),
+ Val.
+
+%% Delete the Mnesia directory on all given nodes
+%% Requires that Mnesia is not running anywhere
+%% Returns ok | {error,Reason}
+delete_schema(Ns) when list(Ns), Ns /= [] ->
+ RunningNs = mnesia_lib:running_nodes(Ns),
+ Reason = "Cannot delete schema on all nodes",
+ if
+ RunningNs == [] ->
+ case rpc:multicall(Ns, ?MODULE, delete_schema2, []) of
+ {Replies, []} ->
+ case [R || R <- Replies, R /= ok] of
+ [] ->
+ ok;
+ BadReplies ->
+ verbose("~s: ~p~n", [Reason, BadReplies]),
+ {error, {"All nodes not running", BadReplies}}
+ end;
+ {_Replies, BadNs} ->
+ verbose("~s: ~p~n", [Reason, BadNs]),
+ {error, {"All nodes not running", BadNs}}
+ end;
+ true ->
+ verbose("~s: ~p~n", [Reason, RunningNs]),
+ {error, {"Mnesia is not stopped everywhere", RunningNs}}
+ end;
+delete_schema(Ns) ->
+ {error, {badarg, Ns}}.
+
+delete_schema2() ->
+ %% Ensure that we access the intended Mnesia
+ %% directory. This function may not be called
+ %% during startup since it will cause the
+ %% application_controller to get into deadlock
+ case mnesia_lib:ensure_loaded(?APPLICATION) of
+ ok ->
+ case mnesia_lib:is_running() of
+ no ->
+ Dir = mnesia_lib:dir(),
+ purge_dir(Dir, []),
+ ok;
+ _ ->
+ {error, {"Mnesia still running", node()}}
+ end;
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+ensure_no_schema([H|T]) when atom(H) ->
+ case rpc:call(H, ?MODULE, remote_read_schema, []) of
+ {badrpc, Reason} ->
+ {H, {"All nodes not running", H, Reason}};
+ {ok,Source, _} when Source /= default ->
+ {H, {already_exists, H}};
+ _ ->
+ ensure_no_schema(T)
+ end;
+ensure_no_schema([H|_]) ->
+ {error,{badarg, H}};
+ensure_no_schema([]) ->
+ ok.
+
+remote_read_schema() ->
+ %% Ensure that we access the intended Mnesia
+ %% directory. This function may not be called
+ %% during startup since it will cause the
+ %% application_controller to get into deadlock
+ case mnesia_lib:ensure_loaded(?APPLICATION) of
+ ok ->
+ case mnesia_monitor:get_env(schema_location) of
+ opt_disc ->
+ read_schema(false, true);
+ _ ->
+ read_schema(false, false)
+ end;
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+dir_exists(Dir) ->
+ dir_exists(Dir, mnesia_monitor:use_dir()).
+dir_exists(Dir, true) ->
+ case file:read_file_info(Dir) of
+ {ok, _} -> true;
+ _ -> false
+ end;
+dir_exists(_Dir, false) ->
+ false.
+
+opt_create_dir(UseDir, Dir) when UseDir == true->
+ case dir_exists(Dir, UseDir) of
+ true ->
+ check_can_write(Dir);
+ false ->
+ case file:make_dir(Dir) of
+ ok ->
+ verbose("Create Directory ~p~n", [Dir]),
+ ok;
+ {error, Reason} ->
+ verbose("Cannot create mnesia dir ~p~n", [Reason]),
+ {error, {"Cannot create Mnesia dir", Dir, Reason}}
+ end
+ end;
+opt_create_dir(false, _) ->
+ {error, {has_no_disc, node()}}.
+
+check_can_write(Dir) ->
+ case file:read_file_info(Dir) of
+ {ok, FI} when FI#file_info.type == directory,
+ FI#file_info.access == read_write ->
+ ok;
+ {ok, _} ->
+ {error, "Not allowed to write in Mnesia dir", Dir};
+ _ ->
+ {error, "Non existent Mnesia dir", Dir}
+ end.
+
+lock_schema() ->
+ mnesia_lib:lock_table(schema).
+
+unlock_schema() ->
+ mnesia_lib:unlock_table(schema).
+
+read_schema(Keep, _UseDirAnyway) ->
+ read_schema(Keep, false, false).
+
+%% The schema may be read for several reasons.
+%% If Mnesia is not already started the read intention
+%% we normally do not want the ets table named schema
+%% be left around.
+%% If Keep == true, the ets table schema is kept
+%% If Keep == false, the ets table schema is removed
+%%
+%% Returns {ok, Source, SchemaCstruct} or {error, Reason}
+%% Source may be: default | ram | disc | fallback
+
+read_schema(Keep, UseDirAnyway, IgnoreFallback) ->
+ lock_schema(),
+ Res =
+ case mnesia:system_info(is_running) of
+ yes ->
+ {ok, ram, get_create_list(schema)};
+ _IsRunning ->
+ case mnesia_monitor:use_dir() of
+ true ->
+ read_disc_schema(Keep, IgnoreFallback);
+ false when UseDirAnyway == true ->
+ read_disc_schema(Keep, IgnoreFallback);
+ false when Keep == true ->
+ Args = [{keypos, 2}, public, named_table, set],
+ mnesia_monitor:mktab(schema, Args),
+ CreateList = get_initial_schema(ram_copies, []),
+ ?ets_insert(schema,{schema, schema, CreateList}),
+ {ok, default, CreateList};
+ false when Keep == false ->
+ CreateList = get_initial_schema(ram_copies, []),
+ {ok, default, CreateList}
+ end
+ end,
+ unlock_schema(),
+ Res.
+
+read_disc_schema(Keep, IgnoreFallback) ->
+ Running = mnesia:system_info(is_running),
+ case mnesia_bup:fallback_exists() of
+ true when IgnoreFallback == false, Running /= yes ->
+ mnesia_bup:fallback_to_schema();
+ _ ->
+ %% If we're running, we read the schema file even
+ %% if fallback exists
+ Dat = mnesia_lib:tab2dat(schema),
+ case mnesia_lib:exists(Dat) of
+ true ->
+ do_read_disc_schema(Dat, Keep);
+ false ->
+ Dmp = mnesia_lib:tab2dmp(schema),
+ case mnesia_lib:exists(Dmp) of
+ true ->
+ %% May only happen when toggling of
+ %% schema storage type has been
+ %% interrupted
+ do_read_disc_schema(Dmp, Keep);
+ false ->
+ {error, "No schema file exists"}
+ end
+ end
+ end.
+
+do_read_disc_schema(Fname, Keep) ->
+ T =
+ case Keep of
+ false ->
+ Args = [{keypos, 2}, public, set],
+ ?ets_new_table(schema, Args);
+ true ->
+ Args = [{keypos, 2}, public, named_table, set],
+ mnesia_monitor:mktab(schema, Args)
+ end,
+ Repair = mnesia_monitor:get_env(auto_repair),
+ Res = % BUGBUG Fixa till dcl!
+ case mnesia_lib:dets_to_ets(schema, T, Fname, set, Repair, no) of
+ loaded -> {ok, disc, ?ets_lookup_element(T, schema, 3)};
+ Other -> {error, {"Cannot read schema", Fname, Other}}
+ end,
+ case Keep of
+ true -> ignore;
+ false -> ?ets_delete_table(T)
+ end,
+ Res.
+
+get_initial_schema(SchemaStorage, Nodes) ->
+ Cs = #cstruct{name = schema,
+ record_name = schema,
+ attributes = [table, cstruct]},
+ Cs2 =
+ case SchemaStorage of
+ ram_copies -> Cs#cstruct{ram_copies = Nodes};
+ disc_copies -> Cs#cstruct{disc_copies = Nodes}
+ end,
+ cs2list(Cs2).
+
+read_cstructs_from_disc() ->
+ %% Assumptions:
+ %% - local schema lock in global
+ %% - use_dir is true
+ %% - Mnesia is not running
+ %% - Ignore fallback
+
+ Fname = mnesia_lib:tab2dat(schema),
+ case mnesia_lib:exists(Fname) of
+ true ->
+ Args = [{file, Fname},
+ {keypos, 2},
+ {repair, mnesia_monitor:get_env(auto_repair)},
+ {type, set}],
+ case dets:open_file(make_ref(), Args) of
+ {ok, Tab} ->
+ Fun = fun({_, _, List}) ->
+ {continue, list2cs(List)}
+ end,
+ Cstructs = dets:traverse(Tab, Fun),
+ dets:close(Tab),
+ {ok, Cstructs};
+ {error, Reason} ->
+ {error, Reason}
+ end;
+ false ->
+ {error, "No schema file exists"}
+ end.
+
+%% We run a very special type of transactions when we
+%% we want to manipulate the schema.
+
+get_tid_ts_and_lock(Tab, Intent) ->
+ TidTs = get(mnesia_activity_state),
+ case TidTs of
+ {_Mod, Tid, Ts} when record(Ts, tidstore)->
+ Store = Ts#tidstore.store,
+ case Intent of
+ read -> mnesia_locker:rlock_table(Tid, Store, Tab);
+ write -> mnesia_locker:wlock_table(Tid, Store, Tab);
+ none -> ignore
+ end,
+ TidTs;
+ _ ->
+ mnesia:abort(no_transaction)
+ end.
+
+schema_transaction(Fun) ->
+ case get(mnesia_activity_state) of
+ undefined ->
+ Args = [self(), Fun, whereis(mnesia_controller)],
+ Pid = spawn_link(?MODULE, schema_coordinator, Args),
+ receive
+ {transaction_done, Res, Pid} -> Res;
+ {'EXIT', Pid, R} -> {aborted, {transaction_crashed, R}}
+ end;
+ _ ->
+ {aborted, nested_transaction}
+ end.
+
+%% This process may dump the transaction log, and should
+%% therefore not be run in an application process
+%%
+schema_coordinator(Client, _Fun, undefined) ->
+ Res = {aborted, {node_not_running, node()}},
+ Client ! {transaction_done, Res, self()},
+ unlink(Client);
+
+schema_coordinator(Client, Fun, Controller) when pid(Controller) ->
+ %% Do not trap exit in order to automatically die
+ %% when the controller dies
+
+ link(Controller),
+ unlink(Client),
+
+ %% Fulfull the transaction even if the client dies
+ Res = mnesia:transaction(Fun),
+ Client ! {transaction_done, Res, self()},
+ unlink(Controller), % Avoids spurious exit message
+ unlink(whereis(mnesia_tm)), % Avoids spurious exit message
+ exit(normal).
+
+%% The make* rotines return a list of ops, this function
+%% inserts em all in the Store and maintains the local order
+%% of ops.
+
+insert_schema_ops({_Mod, _Tid, Ts}, SchemaIOps) ->
+ do_insert_schema_ops(Ts#tidstore.store, SchemaIOps).
+
+do_insert_schema_ops(Store, [Head | Tail]) ->
+ ?ets_insert(Store, Head),
+ do_insert_schema_ops(Store, Tail);
+do_insert_schema_ops(_Store, []) ->
+ ok.
+
+cs2list(Cs) when record(Cs, cstruct) ->
+ Tags = record_info(fields, cstruct),
+ rec2list(Tags, 2, Cs);
+cs2list(CreateList) when list(CreateList) ->
+ CreateList.
+
+rec2list([Tag | Tags], Pos, Rec) ->
+ Val = element(Pos, Rec),
+ [{Tag, Val} | rec2list(Tags, Pos + 1, Rec)];
+rec2list([], _Pos, _Rec) ->
+ [].
+
+list2cs(List) when list(List) ->
+ Name = pick(unknown, name, List, must),
+ Type = pick(Name, type, List, set),
+ Rc0 = pick(Name, ram_copies, List, []),
+ Dc = pick(Name, disc_copies, List, []),
+ Doc = pick(Name, disc_only_copies, List, []),
+ Rc = case {Rc0, Dc, Doc} of
+ {[], [], []} -> [node()];
+ _ -> Rc0
+ end,
+ LC = pick(Name, local_content, List, false),
+ RecName = pick(Name, record_name, List, Name),
+ Attrs = pick(Name, attributes, List, [key, val]),
+ Snmp = pick(Name, snmp, List, []),
+ LoadOrder = pick(Name, load_order, List, 0),
+ AccessMode = pick(Name, access_mode, List, read_write),
+ UserProps = pick(Name, user_properties, List, []),
+ verify({alt, [nil, list]}, mnesia_lib:etype(UserProps),
+ {bad_type, Name, {user_properties, UserProps}}),
+ Cookie = pick(Name, cookie, List, ?unique_cookie),
+ Version = pick(Name, version, List, {{2, 0}, []}),
+ Ix = pick(Name, index, List, []),
+ verify({alt, [nil, list]}, mnesia_lib:etype(Ix),
+ {bad_type, Name, {index, [Ix]}}),
+ Ix2 = [attr_to_pos(I, Attrs) || I <- Ix],
+
+ Frag = pick(Name, frag_properties, List, []),
+ verify({alt, [nil, list]}, mnesia_lib:etype(Frag),
+ {badarg, Name, {frag_properties, Frag}}),
+
+ Keys = check_keys(Name, List, record_info(fields, cstruct)),
+ check_duplicates(Name, Keys),
+ #cstruct{name = Name,
+ ram_copies = Rc,
+ disc_copies = Dc,
+ disc_only_copies = Doc,
+ type = Type,
+ index = Ix2,
+ snmp = Snmp,
+ load_order = LoadOrder,
+ access_mode = AccessMode,
+ local_content = LC,
+ record_name = RecName,
+ attributes = Attrs,
+ user_properties = lists:sort(UserProps),
+ frag_properties = lists:sort(Frag),
+ cookie = Cookie,
+ version = Version};
+list2cs(Other) ->
+ mnesia:abort({badarg, Other}).
+
+pick(Tab, Key, List, Default) ->
+ case lists:keysearch(Key, 1, List) of
+ false when Default == must ->
+ mnesia:abort({badarg, Tab, "Missing key", Key, List});
+ false ->
+ Default;
+ {value, {Key, Value}} ->
+ Value;
+ {value, BadArg} ->
+ mnesia:abort({bad_type, Tab, BadArg})
+ end.
+
+%% Convert attribute name to integer if neccessary
+attr_tab_to_pos(_Tab, Pos) when integer(Pos) ->
+ Pos;
+attr_tab_to_pos(Tab, Attr) ->
+ attr_to_pos(Attr, val({Tab, attributes})).
+
+%% Convert attribute name to integer if neccessary
+attr_to_pos(Pos, _Attrs) when integer(Pos) ->
+ Pos;
+attr_to_pos(Attr, Attrs) when atom(Attr) ->
+ attr_to_pos(Attr, Attrs, 2);
+attr_to_pos(Attr, _) ->
+ mnesia:abort({bad_type, Attr}).
+
+attr_to_pos(Attr, [Attr | _Attrs], Pos) ->
+ Pos;
+attr_to_pos(Attr, [_ | Attrs], Pos) ->
+ attr_to_pos(Attr, Attrs, Pos + 1);
+attr_to_pos(Attr, _, _) ->
+ mnesia:abort({bad_type, Attr}).
+
+check_keys(Tab, [{Key, _Val} | Tail], Items) ->
+ case lists:member(Key, Items) of
+ true -> [Key | check_keys(Tab, Tail, Items)];
+ false -> mnesia:abort({badarg, Tab, Key})
+ end;
+check_keys(_, [], _) ->
+ [];
+check_keys(Tab, Arg, _) ->
+ mnesia:abort({badarg, Tab, Arg}).
+
+check_duplicates(Tab, Keys) ->
+ case has_duplicates(Keys) of
+ false -> ok;
+ true -> mnesia:abort({badarg, Tab, "Duplicate keys", Keys})
+ end.
+
+has_duplicates([H | T]) ->
+ case lists:member(H, T) of
+ true -> true;
+ false -> has_duplicates(T)
+ end;
+has_duplicates([]) ->
+ false.
+
+%% This is the only place where we check the validity of data
+verify_cstruct(Cs) when record(Cs, cstruct) ->
+ verify_nodes(Cs),
+
+ Tab = Cs#cstruct.name,
+ verify(atom, mnesia_lib:etype(Tab), {bad_type, Tab}),
+ Type = Cs#cstruct.type,
+ verify(true, lists:member(Type, [set, bag, ordered_set]),
+ {bad_type, Tab, {type, Type}}),
+
+ %% Currently ordered_set is not supported for disk_only_copies.
+ if
+ Type == ordered_set, Cs#cstruct.disc_only_copies /= [] ->
+ mnesia:abort({bad_type, Tab, {not_supported, Type, disc_only_copies}});
+ true ->
+ ok
+ end,
+
+ RecName = Cs#cstruct.record_name,
+ verify(atom, mnesia_lib:etype(RecName),
+ {bad_type, Tab, {record_name, RecName}}),
+
+ Attrs = Cs#cstruct.attributes,
+ verify(list, mnesia_lib:etype(Attrs),
+ {bad_type, Tab, {attributes, Attrs}}),
+
+ Arity = length(Attrs) + 1,
+ verify(true, Arity > 2, {bad_type, Tab, {attributes, Attrs}}),
+
+ lists:foldl(fun(Attr,_Other) when Attr == snmp ->
+ mnesia:abort({bad_type, Tab, {attributes, [Attr]}});
+ (Attr,Other) ->
+ verify(atom, mnesia_lib:etype(Attr),
+ {bad_type, Tab, {attributes, [Attr]}}),
+ verify(false, lists:member(Attr, Other),
+ {combine_error, Tab, {attributes, [Attr | Other]}}),
+ [Attr | Other]
+ end,
+ [],
+ Attrs),
+
+ Index = Cs#cstruct.index,
+ verify({alt, [nil, list]}, mnesia_lib:etype(Index),
+ {bad_type, Tab, {index, Index}}),
+
+ IxFun =
+ fun(Pos) ->
+ verify(true, fun() ->
+ if
+ integer(Pos),
+ Pos > 2,
+ Pos =< Arity ->
+ true;
+ true -> false
+ end
+ end,
+ {bad_type, Tab, {index, [Pos]}})
+ end,
+ lists:foreach(IxFun, Index),
+
+ LC = Cs#cstruct.local_content,
+ verify({alt, [true, false]}, LC,
+ {bad_type, Tab, {local_content, LC}}),
+ Access = Cs#cstruct.access_mode,
+ verify({alt, [read_write, read_only]}, Access,
+ {bad_type, Tab, {access_mode, Access}}),
+
+ Snmp = Cs#cstruct.snmp,
+ verify(true, mnesia_snmp_hook:check_ustruct(Snmp),
+ {badarg, Tab, {snmp, Snmp}}),
+
+ CheckProp = fun(Prop) when tuple(Prop), size(Prop) >= 1 -> ok;
+ (Prop) -> mnesia:abort({bad_type, Tab, {user_properties, [Prop]}})
+ end,
+ lists:foreach(CheckProp, Cs#cstruct.user_properties),
+
+ case Cs#cstruct.cookie of
+ {{MegaSecs, Secs, MicroSecs}, _Node}
+ when integer(MegaSecs), integer(Secs),
+ integer(MicroSecs), atom(node) ->
+ ok;
+ Cookie ->
+ mnesia:abort({bad_type, Tab, {cookie, Cookie}})
+ end,
+ case Cs#cstruct.version of
+ {{Major, Minor}, _Detail}
+ when integer(Major), integer(Minor) ->
+ ok;
+ Version ->
+ mnesia:abort({bad_type, Tab, {version, Version}})
+ end.
+
+verify_nodes(Cs) ->
+ Tab = Cs#cstruct.name,
+ Ram = Cs#cstruct.ram_copies,
+ Disc = Cs#cstruct.disc_copies,
+ DiscOnly = Cs#cstruct.disc_only_copies,
+ LoadOrder = Cs#cstruct.load_order,
+
+ verify({alt, [nil, list]}, mnesia_lib:etype(Ram),
+ {bad_type, Tab, {ram_copies, Ram}}),
+ verify({alt, [nil, list]}, mnesia_lib:etype(Disc),
+ {bad_type, Tab, {disc_copies, Disc}}),
+ case Tab of
+ schema ->
+ verify([], DiscOnly, {bad_type, Tab, {disc_only_copies, DiscOnly}});
+ _ ->
+ verify({alt, [nil, list]},
+ mnesia_lib:etype(DiscOnly),
+ {bad_type, Tab, {disc_only_copies, DiscOnly}})
+ end,
+ verify(integer, mnesia_lib:etype(LoadOrder),
+ {bad_type, Tab, {load_order, LoadOrder}}),
+
+ Nodes = Ram ++ Disc ++ DiscOnly,
+ verify(list, mnesia_lib:etype(Nodes),
+ {combine_error, Tab,
+ [{ram_copies, []}, {disc_copies, []}, {disc_only_copies, []}]}),
+ verify(false, has_duplicates(Nodes), {combine_error, Tab, Nodes}),
+ AtomCheck = fun(N) -> verify(atom, mnesia_lib:etype(N), {bad_type, Tab, N}) end,
+ lists:foreach(AtomCheck, Nodes).
+
+verify(Expected, Fun, Error) when function(Fun) ->
+ do_verify(Expected, catch Fun(), Error);
+verify(Expected, Actual, Error) ->
+ do_verify(Expected, Actual, Error).
+
+do_verify({alt, Values}, Value, Error) ->
+ case lists:member(Value, Values) of
+ true -> ok;
+ false -> mnesia:abort(Error)
+ end;
+do_verify(Value, Value, _) ->
+ ok;
+do_verify(_Value, _, Error) ->
+ mnesia:abort(Error).
+
+ensure_writable(Tab) ->
+ case val({Tab, where_to_write}) of
+ [] -> mnesia:abort({read_only, Tab});
+ _ -> ok
+ end.
+
+%% Ensure that all replicas on disk full nodes are active
+ensure_active(Cs) ->
+ ensure_active(Cs, active_replicas).
+
+ensure_active(Cs, What) ->
+ Tab = Cs#cstruct.name,
+ case val({Tab, What}) of
+ [] -> mnesia:abort({no_exists, Tab});
+ _ -> ok
+ end,
+ Nodes = mnesia_lib:intersect(val({schema, disc_copies}),
+ mnesia_lib:cs_to_nodes(Cs)),
+ W = {Tab, What},
+ case Nodes -- val(W) of
+ [] ->
+ ok;
+ Ns ->
+ Expl = "All replicas on diskfull nodes are not active yet",
+ case val({Tab, local_content}) of
+ true ->
+ case rpc:multicall(Ns, ?MODULE, is_remote_member, [W]) of
+ {Replies, []} ->
+ check_active(Replies, Expl, Tab);
+ {_Replies, BadNs} ->
+ mnesia:abort({not_active, Expl, Tab, BadNs})
+ end;
+ false ->
+ mnesia:abort({not_active, Expl, Tab, Ns})
+ end
+ end.
+
+ensure_not_active(schema, Node) ->
+ case lists:member(Node, val({schema, active_replicas})) of
+ false ->
+ ok;
+ true ->
+ Expl = "Mnesia is running",
+ mnesia:abort({active, Expl, Node})
+ end.
+
+is_remote_member(Key) ->
+ IsActive = lists:member(node(), val(Key)),
+ {IsActive, node()}.
+
+check_active([{true, _Node} | Replies], Expl, Tab) ->
+ check_active(Replies, Expl, Tab);
+check_active([{false, Node} | _Replies], Expl, Tab) ->
+ mnesia:abort({not_active, Expl, Tab, [Node]});
+check_active([{badrpc, Reason} | _Replies], Expl, Tab) ->
+ mnesia:abort({not_active, Expl, Tab, Reason});
+check_active([], _Expl, _Tab) ->
+ ok.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Here's the real interface function to create a table
+
+create_table(TabDef) ->
+ schema_transaction(fun() -> do_multi_create_table(TabDef) end).
+
+%% And the corresponding do routines ....
+
+do_multi_create_table(TabDef) ->
+ get_tid_ts_and_lock(schema, write),
+ ensure_writable(schema),
+ Cs = list2cs(TabDef),
+ case Cs#cstruct.frag_properties of
+ [] ->
+ do_create_table(Cs);
+ _Props ->
+ CsList = mnesia_frag:expand_cstruct(Cs),
+ lists:foreach(fun do_create_table/1, CsList)
+ end,
+ ok.
+
+do_create_table(Cs) ->
+ {_Mod, _Tid, Ts} = get_tid_ts_and_lock(schema, none),
+ Store = Ts#tidstore.store,
+ do_insert_schema_ops(Store, make_create_table(Cs)).
+
+make_create_table(Cs) ->
+ Tab = Cs#cstruct.name,
+ verify('EXIT', element(1, ?catch_val({Tab, cstruct})),
+ {already_exists, Tab}),
+ unsafe_make_create_table(Cs).
+
+% unsafe_do_create_table(Cs) ->
+% {_Mod, Tid, Ts} = get_tid_ts_and_lock(schema, none),
+% Store = Ts#tidstore.store,
+% do_insert_schema_ops(Store, unsafe_make_create_table(Cs)).
+
+unsafe_make_create_table(Cs) ->
+ {_Mod, Tid, Ts} = get_tid_ts_and_lock(schema, none),
+ verify_cstruct(Cs),
+ Tab = Cs#cstruct.name,
+
+ %% Check that we have all disc replica nodes running
+ DiscNodes = Cs#cstruct.disc_copies ++ Cs#cstruct.disc_only_copies,
+ RunningNodes = val({current, db_nodes}),
+ CheckDisc = fun(N) ->
+ verify(true, lists:member(N, RunningNodes),
+ {not_active, Tab, N})
+ end,
+ lists:foreach(CheckDisc, DiscNodes),
+
+ Nodes = mnesia_lib:intersect(mnesia_lib:cs_to_nodes(Cs), RunningNodes),
+ Store = Ts#tidstore.store,
+ mnesia_locker:wlock_no_exist(Tid, Store, Tab, Nodes),
+ [{op, create_table, cs2list(Cs)}].
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Delete a table entirely on all nodes.
+
+delete_table(Tab) ->
+ schema_transaction(fun() -> do_delete_table(Tab) end).
+
+do_delete_table(schema) ->
+ mnesia:abort({bad_type, schema});
+do_delete_table(Tab) ->
+ TidTs = get_tid_ts_and_lock(schema, write),
+ ensure_writable(schema),
+ insert_schema_ops(TidTs, make_delete_table(Tab, whole_table)).
+
+make_delete_table(Tab, Mode) ->
+ case Mode of
+ whole_table ->
+ case val({Tab, frag_properties}) of
+ [] ->
+ [make_delete_table2(Tab)];
+ _Props ->
+ %% Check if it is a base table
+ mnesia_frag:lookup_frag_hash(Tab),
+
+ %% Check for foreigners
+ F = mnesia_frag:lookup_foreigners(Tab),
+ verify([], F, {combine_error, Tab, "Too many foreigners", F}),
+ [make_delete_table2(T) || T <- mnesia_frag:frag_names(Tab)]
+ end;
+ single_frag ->
+ [make_delete_table2(Tab)]
+ end.
+
+make_delete_table2(Tab) ->
+ get_tid_ts_and_lock(Tab, write),
+ Cs = val({Tab, cstruct}),
+ ensure_active(Cs),
+ ensure_writable(Tab),
+ {op, delete_table, cs2list(Cs)}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Change fragmentation of a table
+
+change_table_frag(Tab, Change) ->
+ schema_transaction(fun() -> do_change_table_frag(Tab, Change) end).
+
+do_change_table_frag(Tab, Change) when atom(Tab), Tab /= schema ->
+ TidTs = get_tid_ts_and_lock(schema, write),
+ Ops = mnesia_frag:change_table_frag(Tab, Change),
+ [insert_schema_ops(TidTs, Op) || Op <- Ops],
+ ok;
+do_change_table_frag(Tab, _Change) ->
+ mnesia:abort({bad_type, Tab}).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Clear a table
+
+clear_table(Tab) ->
+ schema_transaction(fun() -> do_clear_table(Tab) end).
+
+do_clear_table(schema) ->
+ mnesia:abort({bad_type, schema});
+do_clear_table(Tab) ->
+ TidTs = get_tid_ts_and_lock(schema, write),
+ get_tid_ts_and_lock(Tab, write),
+ insert_schema_ops(TidTs, make_clear_table(Tab)).
+
+make_clear_table(Tab) ->
+ ensure_writable(schema),
+ Cs = val({Tab, cstruct}),
+ ensure_active(Cs),
+ ensure_writable(Tab),
+ [{op, clear_table, cs2list(Cs)}].
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+add_table_copy(Tab, Node, Storage) ->
+ schema_transaction(fun() -> do_add_table_copy(Tab, Node, Storage) end).
+
+do_add_table_copy(Tab, Node, Storage) when atom(Tab), atom(Node) ->
+ TidTs = get_tid_ts_and_lock(schema, write),
+ insert_schema_ops(TidTs, make_add_table_copy(Tab, Node, Storage));
+do_add_table_copy(Tab,Node,_) ->
+ mnesia:abort({badarg, Tab, Node}).
+
+make_add_table_copy(Tab, Node, Storage) ->
+ ensure_writable(schema),
+ Cs = incr_version(val({Tab, cstruct})),
+ Ns = mnesia_lib:cs_to_nodes(Cs),
+ verify(false, lists:member(Node, Ns), {already_exists, Tab, Node}),
+ Cs2 = new_cs(Cs, Node, Storage, add),
+ verify_cstruct(Cs2),
+
+ %% Check storage and if node is running
+ IsRunning = lists:member(Node, val({current, db_nodes})),
+ if
+ Storage == unknown ->
+ mnesia:abort({badarg, Tab, Storage});
+ Tab == schema ->
+ if
+ Storage /= ram_copies ->
+ mnesia:abort({badarg, Tab, Storage});
+ IsRunning == true ->
+ mnesia:abort({already_exists, Tab, Node});
+ true ->
+ ignore
+ end;
+ Storage == ram_copies ->
+ ignore;
+ IsRunning == true ->
+ ignore;
+ IsRunning == false ->
+ mnesia:abort({not_active, schema, Node})
+ end,
+ [{op, add_table_copy, Storage, Node, cs2list(Cs2)}].
+
+del_table_copy(Tab, Node) ->
+ schema_transaction(fun() -> do_del_table_copy(Tab, Node) end).
+
+do_del_table_copy(Tab, Node) when atom(Node) ->
+ TidTs = get_tid_ts_and_lock(schema, write),
+%% get_tid_ts_and_lock(Tab, write),
+ insert_schema_ops(TidTs, make_del_table_copy(Tab, Node));
+do_del_table_copy(Tab, Node) ->
+ mnesia:abort({badarg, Tab, Node}).
+
+make_del_table_copy(Tab, Node) ->
+ ensure_writable(schema),
+ Cs = incr_version(val({Tab, cstruct})),
+ Storage = mnesia_lib:schema_cs_to_storage_type(Node, Cs),
+ Cs2 = new_cs(Cs, Node, Storage, del),
+ case mnesia_lib:cs_to_nodes(Cs2) of
+ [] when Tab == schema ->
+ mnesia:abort({combine_error, Tab, "Last replica"});
+ [] ->
+ ensure_active(Cs),
+ dbg_out("Last replica deleted in table ~p~n", [Tab]),
+ make_delete_table(Tab, whole_table);
+ _ when Tab == schema ->
+ ensure_active(Cs2),
+ ensure_not_active(Tab, Node),
+ verify_cstruct(Cs2),
+ Ops = remove_node_from_tabs(val({schema, tables}), Node),
+ [{op, del_table_copy, ram_copies, Node, cs2list(Cs2)} | Ops];
+ _ ->
+ ensure_active(Cs),
+ verify_cstruct(Cs2),
+ [{op, del_table_copy, Storage, Node, cs2list(Cs2)}]
+ end.
+
+remove_node_from_tabs([], _Node) ->
+ [];
+remove_node_from_tabs([schema|Rest], Node) ->
+ remove_node_from_tabs(Rest, Node);
+remove_node_from_tabs([Tab|Rest], Node) ->
+ {Cs, IsFragModified} =
+ mnesia_frag:remove_node(Node, incr_version(val({Tab, cstruct}))),
+ case mnesia_lib:schema_cs_to_storage_type(Node, Cs) of
+ unknown ->
+ case IsFragModified of
+ true ->
+ [{op, change_table_frag, {del_node, Node}, cs2list(Cs)} |
+ remove_node_from_tabs(Rest, Node)];
+ false ->
+ remove_node_from_tabs(Rest, Node)
+ end;
+ Storage ->
+ Cs2 = new_cs(Cs, Node, Storage, del),
+ case mnesia_lib:cs_to_nodes(Cs2) of
+ [] ->
+ [{op, delete_table, cs2list(Cs)} |
+ remove_node_from_tabs(Rest, Node)];
+ _Ns ->
+ verify_cstruct(Cs2),
+ [{op, del_table_copy, ram_copies, Node, cs2list(Cs2)}|
+ remove_node_from_tabs(Rest, Node)]
+ end
+ end.
+
+new_cs(Cs, Node, ram_copies, add) ->
+ Cs#cstruct{ram_copies = opt_add(Node, Cs#cstruct.ram_copies)};
+new_cs(Cs, Node, disc_copies, add) ->
+ Cs#cstruct{disc_copies = opt_add(Node, Cs#cstruct.disc_copies)};
+new_cs(Cs, Node, disc_only_copies, add) ->
+ Cs#cstruct{disc_only_copies = opt_add(Node, Cs#cstruct.disc_only_copies)};
+new_cs(Cs, Node, ram_copies, del) ->
+ Cs#cstruct{ram_copies = lists:delete(Node , Cs#cstruct.ram_copies)};
+new_cs(Cs, Node, disc_copies, del) ->
+ Cs#cstruct{disc_copies = lists:delete(Node , Cs#cstruct.disc_copies)};
+new_cs(Cs, Node, disc_only_copies, del) ->
+ Cs#cstruct{disc_only_copies =
+ lists:delete(Node , Cs#cstruct.disc_only_copies)};
+new_cs(Cs, _Node, Storage, _Op) ->
+ mnesia:abort({badarg, Cs#cstruct.name, Storage}).
+
+
+opt_add(N, L) -> [N | lists:delete(N, L)].
+
+move_table(Tab, FromNode, ToNode) ->
+ schema_transaction(fun() -> do_move_table(Tab, FromNode, ToNode) end).
+
+do_move_table(schema, _FromNode, _ToNode) ->
+ mnesia:abort({bad_type, schema});
+do_move_table(Tab, FromNode, ToNode) when atom(FromNode), atom(ToNode) ->
+ TidTs = get_tid_ts_and_lock(schema, write),
+ insert_schema_ops(TidTs, make_move_table(Tab, FromNode, ToNode));
+do_move_table(Tab, FromNode, ToNode) ->
+ mnesia:abort({badarg, Tab, FromNode, ToNode}).
+
+make_move_table(Tab, FromNode, ToNode) ->
+ ensure_writable(schema),
+ Cs = incr_version(val({Tab, cstruct})),
+ Ns = mnesia_lib:cs_to_nodes(Cs),
+ verify(false, lists:member(ToNode, Ns), {already_exists, Tab, ToNode}),
+ verify(true, lists:member(FromNode, val({Tab, where_to_write})),
+ {not_active, Tab, FromNode}),
+ verify(false, val({Tab,local_content}),
+ {"Cannot move table with local content", Tab}),
+ ensure_active(Cs),
+ Running = val({current, db_nodes}),
+ Storage = mnesia_lib:schema_cs_to_storage_type(FromNode, Cs),
+ verify(true, lists:member(ToNode, Running), {not_active, schema, ToNode}),
+
+ Cs2 = new_cs(Cs, ToNode, Storage, add),
+ Cs3 = new_cs(Cs2, FromNode, Storage, del),
+ verify_cstruct(Cs3),
+ [{op, add_table_copy, Storage, ToNode, cs2list(Cs2)},
+ {op, sync_trans},
+ {op, del_table_copy, Storage, FromNode, cs2list(Cs3)}].
+
+%% end of functions to add and delete nodes to tables
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+
+change_table_copy_type(Tab, Node, ToS) ->
+ schema_transaction(fun() -> do_change_table_copy_type(Tab, Node, ToS) end).
+
+do_change_table_copy_type(Tab, Node, ToS) when atom(Node) ->
+ TidTs = get_tid_ts_and_lock(schema, write),
+ get_tid_ts_and_lock(Tab, write), % ensure global sync
+ %% get_tid_ts_and_lock(Tab, read),
+ insert_schema_ops(TidTs, make_change_table_copy_type(Tab, Node, ToS));
+do_change_table_copy_type(Tab, Node, _ToS) ->
+ mnesia:abort({badarg, Tab, Node}).
+
+make_change_table_copy_type(Tab, Node, unknown) ->
+ make_del_table_copy(Tab, Node);
+make_change_table_copy_type(Tab, Node, ToS) ->
+ ensure_writable(schema),
+ Cs = incr_version(val({Tab, cstruct})),
+ FromS = mnesia_lib:storage_type_at_node(Node, Tab),
+
+ case compare_storage_type(false, FromS, ToS) of
+ {same, _} ->
+ mnesia:abort({already_exists, Tab, Node, ToS});
+ {diff, _} ->
+ ignore;
+ incompatible ->
+ ensure_active(Cs)
+ end,
+
+ Cs2 = new_cs(Cs, Node, FromS, del),
+ Cs3 = new_cs(Cs2, Node, ToS, add),
+ verify_cstruct(Cs3),
+
+ if
+ FromS == unknown ->
+ make_add_table_copy(Tab, Node, ToS);
+ true ->
+ ignore
+ end,
+
+ [{op, change_table_copy_type, Node, FromS, ToS, cs2list(Cs3)}].
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% change index functions ....
+%% Pos is allready added by 1 in both of these functions
+
+add_table_index(Tab, Pos) ->
+ schema_transaction(fun() -> do_add_table_index(Tab, Pos) end).
+
+do_add_table_index(schema, _Attr) ->
+ mnesia:abort({bad_type, schema});
+do_add_table_index(Tab, Attr) ->
+ TidTs = get_tid_ts_and_lock(schema, write),
+ get_tid_ts_and_lock(Tab, read),
+ Pos = attr_tab_to_pos(Tab, Attr),
+ insert_schema_ops(TidTs, make_add_table_index(Tab, Pos)).
+
+make_add_table_index(Tab, Pos) ->
+ ensure_writable(schema),
+ Cs = incr_version(val({Tab, cstruct})),
+ ensure_active(Cs),
+ Ix = Cs#cstruct.index,
+ verify(false, lists:member(Pos, Ix), {already_exists, Tab, Pos}),
+ Ix2 = lists:sort([Pos | Ix]),
+ Cs2 = Cs#cstruct{index = Ix2},
+ verify_cstruct(Cs2),
+ [{op, add_index, Pos, cs2list(Cs2)}].
+
+del_table_index(Tab, Pos) ->
+ schema_transaction(fun() -> do_del_table_index(Tab, Pos) end).
+
+do_del_table_index(schema, _Attr) ->
+ mnesia:abort({bad_type, schema});
+do_del_table_index(Tab, Attr) ->
+ TidTs = get_tid_ts_and_lock(schema, write),
+ get_tid_ts_and_lock(Tab, read),
+ Pos = attr_tab_to_pos(Tab, Attr),
+ insert_schema_ops(TidTs, make_del_table_index(Tab, Pos)).
+
+make_del_table_index(Tab, Pos) ->
+ ensure_writable(schema),
+ Cs = incr_version(val({Tab, cstruct})),
+ ensure_active(Cs),
+ Ix = Cs#cstruct.index,
+ verify(true, lists:member(Pos, Ix), {no_exists, Tab, Pos}),
+ Cs2 = Cs#cstruct{index = lists:delete(Pos, Ix)},
+ verify_cstruct(Cs2),
+ [{op, del_index, Pos, cs2list(Cs2)}].
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+add_snmp(Tab, Ustruct) ->
+ schema_transaction(fun() -> do_add_snmp(Tab, Ustruct) end).
+
+do_add_snmp(schema, _Ustruct) ->
+ mnesia:abort({bad_type, schema});
+do_add_snmp(Tab, Ustruct) ->
+ TidTs = get_tid_ts_and_lock(schema, write),
+ get_tid_ts_and_lock(Tab, read),
+ insert_schema_ops(TidTs, make_add_snmp(Tab, Ustruct)).
+
+make_add_snmp(Tab, Ustruct) ->
+ ensure_writable(schema),
+ Cs = incr_version(val({Tab, cstruct})),
+ ensure_active(Cs),
+ verify([], Cs#cstruct.snmp, {already_exists, Tab, snmp}),
+ Error = {badarg, Tab, snmp, Ustruct},
+ verify(true, mnesia_snmp_hook:check_ustruct(Ustruct), Error),
+ Cs2 = Cs#cstruct{snmp = Ustruct},
+ verify_cstruct(Cs2),
+ [{op, add_snmp, Ustruct, cs2list(Cs2)}].
+
+del_snmp(Tab) ->
+ schema_transaction(fun() -> do_del_snmp(Tab) end).
+
+do_del_snmp(schema) ->
+ mnesia:abort({bad_type, schema});
+do_del_snmp(Tab) ->
+ TidTs = get_tid_ts_and_lock(schema, write),
+ get_tid_ts_and_lock(Tab, read),
+ insert_schema_ops(TidTs, make_del_snmp(Tab)).
+
+make_del_snmp(Tab) ->
+ ensure_writable(schema),
+ Cs = incr_version(val({Tab, cstruct})),
+ ensure_active(Cs),
+ Cs2 = Cs#cstruct{snmp = []},
+ verify_cstruct(Cs2),
+ [{op, del_snmp, cs2list(Cs2)}].
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+
+transform_table(Tab, Fun, NewAttrs, NewRecName)
+ when function(Fun), list(NewAttrs), atom(NewRecName) ->
+ schema_transaction(fun() -> do_transform_table(Tab, Fun, NewAttrs, NewRecName) end);
+
+transform_table(Tab, ignore, NewAttrs, NewRecName)
+ when list(NewAttrs), atom(NewRecName) ->
+ schema_transaction(fun() -> do_transform_table(Tab, ignore, NewAttrs, NewRecName) end);
+
+transform_table(Tab, Fun, NewAttrs, NewRecName) ->
+ {aborted,{bad_type, Tab, Fun, NewAttrs, NewRecName}}.
+
+do_transform_table(schema, _Fun, _NewAttrs, _NewRecName) ->
+ mnesia:abort({bad_type, schema});
+do_transform_table(Tab, Fun, NewAttrs, NewRecName) ->
+ TidTs = get_tid_ts_and_lock(schema, write),
+ get_tid_ts_and_lock(Tab, write),
+ insert_schema_ops(TidTs, make_transform(Tab, Fun, NewAttrs, NewRecName)).
+
+make_transform(Tab, Fun, NewAttrs, NewRecName) ->
+ ensure_writable(schema),
+ Cs = incr_version(val({Tab, cstruct})),
+ ensure_active(Cs),
+ ensure_writable(Tab),
+ case mnesia_lib:val({Tab, index}) of
+ [] ->
+ Cs2 = Cs#cstruct{attributes = NewAttrs, record_name = NewRecName},
+ verify_cstruct(Cs2),
+ [{op, transform, Fun, cs2list(Cs2)}];
+ PosList ->
+ DelIdx = fun(Pos, Ncs) ->
+ Ix = Ncs#cstruct.index,
+ Ncs1 = Ncs#cstruct{index = lists:delete(Pos, Ix)},
+ Op = {op, del_index, Pos, cs2list(Ncs1)},
+ {Op, Ncs1}
+ end,
+ AddIdx = fun(Pos, Ncs) ->
+ Ix = Ncs#cstruct.index,
+ Ix2 = lists:sort([Pos | Ix]),
+ Ncs1 = Ncs#cstruct{index = Ix2},
+ Op = {op, add_index, Pos, cs2list(Ncs1)},
+ {Op, Ncs1}
+ end,
+ {DelOps, Cs1} = lists:mapfoldl(DelIdx, Cs, PosList),
+ Cs2 = Cs1#cstruct{attributes = NewAttrs, record_name = NewRecName},
+ {AddOps, Cs3} = lists:mapfoldl(AddIdx, Cs2, PosList),
+ verify_cstruct(Cs3),
+ lists:flatten([DelOps, {op, transform, Fun, cs2list(Cs2)}, AddOps])
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+
+change_table_access_mode(Tab, Mode) ->
+ schema_transaction(fun() -> do_change_table_access_mode(Tab, Mode) end).
+
+do_change_table_access_mode(Tab, Mode) ->
+ {_Mod, Tid, Ts} = get_tid_ts_and_lock(schema, write),
+ Store = Ts#tidstore.store,
+ mnesia_locker:wlock_no_exist(Tid, Store, schema, val({schema, active_replicas})),
+ mnesia_locker:wlock_no_exist(Tid, Store, Tab, val({Tab, active_replicas})),
+ do_insert_schema_ops(Store, make_change_table_access_mode(Tab, Mode)).
+
+make_change_table_access_mode(Tab, Mode) ->
+ ensure_writable(schema),
+ Cs = incr_version(val({Tab, cstruct})),
+ ensure_active(Cs),
+ OldMode = Cs#cstruct.access_mode,
+ verify(false, OldMode == Mode, {already_exists, Tab, Mode}),
+ Cs2 = Cs#cstruct{access_mode = Mode},
+ verify_cstruct(Cs2),
+ [{op, change_table_access_mode, cs2list(Cs2), OldMode, Mode}].
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+change_table_load_order(Tab, LoadOrder) ->
+ schema_transaction(fun() -> do_change_table_load_order(Tab, LoadOrder) end).
+
+do_change_table_load_order(schema, _LoadOrder) ->
+ mnesia:abort({bad_type, schema});
+do_change_table_load_order(Tab, LoadOrder) ->
+ TidTs = get_tid_ts_and_lock(schema, write),
+ get_tid_ts_and_lock(Tab, none),
+ insert_schema_ops(TidTs, make_change_table_load_order(Tab, LoadOrder)).
+
+make_change_table_load_order(Tab, LoadOrder) ->
+ ensure_writable(schema),
+ Cs = incr_version(val({Tab, cstruct})),
+ ensure_active(Cs),
+ OldLoadOrder = Cs#cstruct.load_order,
+ Cs2 = Cs#cstruct{load_order = LoadOrder},
+ verify_cstruct(Cs2),
+ [{op, change_table_load_order, cs2list(Cs2), OldLoadOrder, LoadOrder}].
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+write_table_property(Tab, Prop) when tuple(Prop), size(Prop) >= 1 ->
+ schema_transaction(fun() -> do_write_table_property(Tab, Prop) end);
+write_table_property(Tab, Prop) ->
+ {aborted, {bad_type, Tab, Prop}}.
+do_write_table_property(Tab, Prop) ->
+ TidTs = get_tid_ts_and_lock(schema, write),
+ {_, _, Ts} = TidTs,
+ Store = Ts#tidstore.store,
+ case change_prop_in_existing_op(Tab, Prop, write_property, Store) of
+ true ->
+ dbg_out("change_prop_in_existing_op"
+ "(~p,~p,write_property,Store) -> true~n",
+ [Tab,Prop]),
+ %% we have merged the table prop into the create_table op
+ ok;
+ false ->
+ dbg_out("change_prop_in_existing_op"
+ "(~p,~p,write_property,Store) -> false~n",
+ [Tab,Prop]),
+ %% this must be an existing table
+ get_tid_ts_and_lock(Tab, none),
+ insert_schema_ops(TidTs, make_write_table_properties(Tab, [Prop]))
+ end.
+
+make_write_table_properties(Tab, Props) ->
+ ensure_writable(schema),
+ Cs = incr_version(val({Tab, cstruct})),
+ ensure_active(Cs),
+ make_write_table_properties(Tab, Props, Cs).
+
+make_write_table_properties(Tab, [Prop | Props], Cs) ->
+ OldProps = Cs#cstruct.user_properties,
+ PropKey = element(1, Prop),
+ DelProps = lists:keydelete(PropKey, 1, OldProps),
+ MergedProps = lists:merge(DelProps, [Prop]),
+ Cs2 = Cs#cstruct{user_properties = MergedProps},
+ verify_cstruct(Cs2),
+ [{op, write_property, cs2list(Cs2), Prop} |
+ make_write_table_properties(Tab, Props, Cs2)];
+make_write_table_properties(_Tab, [], _Cs) ->
+ [].
+
+change_prop_in_existing_op(Tab, Prop, How, Store) ->
+ Ops = ets:match_object(Store, '_'),
+ case update_existing_op(Ops, Tab, Prop, How, []) of
+ {true, Ops1} ->
+ ets:match_delete(Store, '_'),
+ [ets:insert(Store, Op) || Op <- Ops1],
+ true;
+ false ->
+ false
+ end.
+
+update_existing_op([{op, Op, L = [{name,Tab}|_], _OldProp}|Ops],
+ Tab, Prop, How, Acc) when Op == write_property;
+ Op == delete_property ->
+ %% Apparently, mnesia_dumper doesn't care about OldProp here -- just L,
+ %% so we will throw away OldProp (not that it matters...) and insert Prop.
+ %% as element 3.
+ L1 = insert_prop(Prop, L, How),
+ NewOp = {op, How, L1, Prop},
+ {true, lists:reverse(Acc) ++ [NewOp|Ops]};
+update_existing_op([Op = {op, create_table, L}|Ops], Tab, Prop, How, Acc) ->
+ case lists:keysearch(name, 1, L) of
+ {value, {_, Tab}} ->
+ %% Tab is being created here -- insert Prop into L
+ L1 = insert_prop(Prop, L, How),
+ {true, lists:reverse(Acc) ++ [{op, create_table, L1}|Ops]};
+ _ ->
+ update_existing_op(Ops, Tab, Prop, How, [Op|Acc])
+ end;
+update_existing_op([Op|Ops], Tab, Prop, How, Acc) ->
+ update_existing_op(Ops, Tab, Prop, How, [Op|Acc]);
+update_existing_op([], _, _, _, _) ->
+ false.
+
+%% perhaps a misnomer. How could also be delete_property... never mind.
+%% Returns the modified L.
+insert_prop(Prop, L, How) ->
+ Prev = find_props(L),
+ MergedProps = merge_with_previous(How, Prop, Prev),
+ replace_props(L, MergedProps).
+
+
+find_props([{user_properties, P}|_]) -> P;
+find_props([_H|T]) -> find_props(T).
+%% we shouldn't reach []
+
+replace_props([{user_properties, _}|T], P) -> [{user_properties, P}|T];
+replace_props([H|T], P) -> [H|replace_props(T, P)].
+%% again, we shouldn't reach []
+
+merge_with_previous(write_property, Prop, Prev) ->
+ Key = element(1, Prop),
+ Prev1 = lists:keydelete(Key, 1, Prev),
+ lists:sort([Prop|Prev1]);
+merge_with_previous(delete_property, PropKey, Prev) ->
+ lists:keydelete(PropKey, 1, Prev).
+
+delete_table_property(Tab, PropKey) ->
+ schema_transaction(fun() -> do_delete_table_property(Tab, PropKey) end).
+
+do_delete_table_property(Tab, PropKey) ->
+ TidTs = get_tid_ts_and_lock(schema, write),
+ {_, _, Ts} = TidTs,
+ Store = Ts#tidstore.store,
+ case change_prop_in_existing_op(Tab, PropKey, delete_property, Store) of
+ true ->
+ dbg_out("change_prop_in_existing_op"
+ "(~p,~p,delete_property,Store) -> true~n",
+ [Tab,PropKey]),
+ %% we have merged the table prop into the create_table op
+ ok;
+ false ->
+ dbg_out("change_prop_in_existing_op"
+ "(~p,~p,delete_property,Store) -> false~n",
+ [Tab,PropKey]),
+ %% this must be an existing table
+ get_tid_ts_and_lock(Tab, none),
+ insert_schema_ops(TidTs,
+ make_delete_table_properties(Tab, [PropKey]))
+ end.
+
+make_delete_table_properties(Tab, PropKeys) ->
+ ensure_writable(schema),
+ Cs = incr_version(val({Tab, cstruct})),
+ ensure_active(Cs),
+ make_delete_table_properties(Tab, PropKeys, Cs).
+
+make_delete_table_properties(Tab, [PropKey | PropKeys], Cs) ->
+ OldProps = Cs#cstruct.user_properties,
+ Props = lists:keydelete(PropKey, 1, OldProps),
+ Cs2 = Cs#cstruct{user_properties = Props},
+ verify_cstruct(Cs2),
+ [{op, delete_property, cs2list(Cs2), PropKey} |
+ make_delete_table_properties(Tab, PropKeys, Cs2)];
+make_delete_table_properties(_Tab, [], _Cs) ->
+ [].
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% Ensure that the transaction can be committed even
+%% if the node crashes and Mnesia is restarted
+prepare_commit(Tid, Commit, WaitFor) ->
+ case Commit#commit.schema_ops of
+ [] ->
+ {false, Commit, optional};
+ OrigOps ->
+ {Modified, Ops, DumperMode} =
+ prepare_ops(Tid, OrigOps, WaitFor, false, [], optional),
+ InitBy = schema_prepare,
+ GoodRes = {Modified,
+ Commit#commit{schema_ops = lists:reverse(Ops)},
+ DumperMode},
+ case DumperMode of
+ optional ->
+ dbg_out("Transaction log dump skipped (~p): ~w~n",
+ [DumperMode, InitBy]);
+ mandatory ->
+ case mnesia_controller:sync_dump_log(InitBy) of
+ dumped ->
+ GoodRes;
+ {error, Reason} ->
+ mnesia:abort(Reason)
+ end
+ end,
+ case Ops of
+ [] ->
+ ignore;
+ _ ->
+ %% We need to grab a dumper lock here, the log may not
+ %% be dumped by others, during the schema commit phase.
+ mnesia_controller:wait_for_schema_commit_lock()
+ end,
+ GoodRes
+ end.
+
+prepare_ops(Tid, [Op | Ops], WaitFor, Changed, Acc, DumperMode) ->
+ case prepare_op(Tid, Op, WaitFor) of
+ {true, mandatory} ->
+ prepare_ops(Tid, Ops, WaitFor, Changed, [Op | Acc], mandatory);
+ {true, optional} ->
+ prepare_ops(Tid, Ops, WaitFor, Changed, [Op | Acc], DumperMode);
+ {true, Ops2, mandatory} ->
+ prepare_ops(Tid, Ops, WaitFor, true, Ops2 ++ Acc, mandatory);
+ {true, Ops2, optional} ->
+ prepare_ops(Tid, Ops, WaitFor, true, Ops2 ++ Acc, DumperMode);
+ {false, mandatory} ->
+ prepare_ops(Tid, Ops, WaitFor, true, Acc, mandatory);
+ {false, optional} ->
+ prepare_ops(Tid, Ops, WaitFor, true, Acc, DumperMode)
+ end;
+prepare_ops(_Tid, [], _WaitFor, Changed, Acc, DumperMode) ->
+ {Changed, Acc, DumperMode}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Prepare for commit
+%% returns true if Op should be included, i.e. unmodified
+%% {true, Operation} if NewRecs should be included, i.e. modified
+%% false if Op should NOT be included, i.e. modified
+%%
+prepare_op(_Tid, {op, rec, unknown, Rec}, _WaitFor) ->
+ {{Tab, Key}, Items, _Op} = Rec,
+ case val({Tab, storage_type}) of
+ unknown ->
+ {false, optional};
+ Storage ->
+ mnesia_tm:prepare_snmp(Tab, Key, Items), % May exit
+ {true, [{op, rec, Storage, Rec}], optional}
+ end;
+
+prepare_op(_Tid, {op, announce_im_running, _Node, SchemaDef, Running, RemoteRunning}, _WaitFor) ->
+ SchemaCs = list2cs(SchemaDef),
+ case lists:member(node(), Running) of
+ true ->
+ announce_im_running(RemoteRunning -- Running, SchemaCs);
+ false ->
+ announce_im_running(Running -- RemoteRunning, SchemaCs)
+ end,
+ {false, optional};
+
+prepare_op(_Tid, {op, sync_trans}, {part, CoordPid}) ->
+ CoordPid ! {sync_trans, self()},
+ receive
+ {sync_trans, CoordPid} ->
+ {false, optional};
+ Else ->
+ mnesia_lib:verbose("sync_op terminated due to ~p~n", [Else]),
+ mnesia:abort(Else)
+ end;
+
+prepare_op(_Tid, {op, sync_trans}, {coord, Nodes}) ->
+ case receive_sync(Nodes, []) of
+ {abort, Reason} ->
+ mnesia_lib:verbose("sync_op terminated due to ~p~n", [Reason]),
+ mnesia:abort(Reason);
+ Pids ->
+ [Pid ! {sync_trans, self()} || Pid <- Pids],
+ {false, optional}
+ end;
+prepare_op(Tid, {op, create_table, TabDef}, _WaitFor) ->
+ Cs = list2cs(TabDef),
+ Storage = mnesia_lib:cs_to_storage_type(node(), Cs),
+ UseDir = mnesia_monitor:use_dir(),
+ Tab = Cs#cstruct.name,
+ case Storage of
+ disc_copies when UseDir == false ->
+ UseDirReason = {bad_type, Tab, Storage, node()},
+ mnesia:abort(UseDirReason);
+ disc_only_copies when UseDir == false ->
+ UseDirReason = {bad_type, Tab, Storage, node()},
+ mnesia:abort(UseDirReason);
+ ram_copies ->
+ create_ram_table(Tab, Cs#cstruct.type),
+ insert_cstruct(Tid, Cs, false),
+ {true, optional};
+ disc_copies ->
+ create_ram_table(Tab, Cs#cstruct.type),
+ create_disc_table(Tab),
+ insert_cstruct(Tid, Cs, false),
+ {true, optional};
+ disc_only_copies ->
+ create_disc_only_table(Tab,Cs#cstruct.type),
+ insert_cstruct(Tid, Cs, false),
+ {true, optional};
+ unknown -> %% No replica on this node
+ insert_cstruct(Tid, Cs, false),
+ {true, optional}
+ end;
+
+prepare_op(Tid, {op, add_table_copy, Storage, Node, TabDef}, _WaitFor) ->
+ Cs = list2cs(TabDef),
+ Tab = Cs#cstruct.name,
+
+ if
+ Tab == schema ->
+ {true, optional}; % Nothing to prepare
+ Node == node() ->
+ case mnesia_lib:val({schema, storage_type}) of
+ ram_copies when Storage /= ram_copies ->
+ Error = {combine_error, Tab, "has no disc", Node},
+ mnesia:abort(Error);
+ _ ->
+ ok
+ end,
+ %% Tables are created by mnesia_loader get_network code
+ insert_cstruct(Tid, Cs, true),
+ case mnesia_controller:get_network_copy(Tab, Cs) of
+ {loaded, ok} ->
+ {true, optional};
+ {not_loaded, ErrReason} ->
+ Reason = {system_limit, Tab, {Node, ErrReason}},
+ mnesia:abort(Reason)
+ end;
+ Node /= node() ->
+ %% Verify that ram table not has been dumped to disc
+ if
+ Storage /= ram_copies ->
+ case mnesia_lib:schema_cs_to_storage_type(node(), Cs) of
+ ram_copies ->
+ Dat = mnesia_lib:tab2dcd(Tab),
+ case mnesia_lib:exists(Dat) of
+ true ->
+ mnesia:abort({combine_error, Tab, Storage,
+ "Table dumped to disc", node()});
+ false ->
+ ok
+ end;
+ _ ->
+ ok
+ end;
+ true ->
+ ok
+ end,
+ insert_cstruct(Tid, Cs, true),
+ {true, optional}
+ end;
+
+prepare_op(Tid, {op, del_table_copy, _Storage, Node, TabDef}, _WaitFor) ->
+ Cs = list2cs(TabDef),
+ Tab = Cs#cstruct.name,
+
+ if
+ %% Schema table lock is always required to run a schema op.
+ %% No need to look it.
+ node(Tid#tid.pid) == node(), Tab /= schema ->
+ Pid = spawn_link(?MODULE, lock_del_table, [Tab, Node, Cs, self()]),
+ receive
+ {Pid, updated} ->
+ {true, optional};
+ {Pid, FailReason} ->
+ mnesia:abort(FailReason);
+ {'EXIT', Pid, Reason} ->
+ mnesia:abort(Reason)
+ end;
+ true ->
+ {true, optional}
+ end;
+
+prepare_op(_Tid, {op, change_table_copy_type, N, FromS, ToS, TabDef}, _WaitFor)
+ when N == node() ->
+ Cs = list2cs(TabDef),
+ Tab = Cs#cstruct.name,
+
+ NotActive = mnesia_lib:not_active_here(Tab),
+
+ if
+ NotActive == true ->
+ mnesia:abort({not_active, Tab, node()});
+
+ Tab == schema ->
+ case {FromS, ToS} of
+ {ram_copies, disc_copies} ->
+ case mnesia:system_info(schema_location) of
+ opt_disc ->
+ ignore;
+ _ ->
+ mnesia:abort({combine_error, Tab, node(),
+ "schema_location must be opt_disc"})
+ end,
+ Dir = mnesia_lib:dir(),
+ case opt_create_dir(true, Dir) of
+ ok ->
+ purge_dir(Dir, []),
+ mnesia_log:purge_all_logs(),
+ set(use_dir, true),
+ mnesia_log:init(),
+ Ns = val({current, db_nodes}), %mnesia_lib:running_nodes(),
+ F = fun(U) -> mnesia_recover:log_mnesia_up(U) end,
+ lists:foreach(F, Ns),
+
+ mnesia_dumper:raw_named_dump_table(Tab, dmp),
+ mnesia_checkpoint:tm_change_table_copy_type(Tab, FromS, ToS);
+ {error, Reason} ->
+ mnesia:abort(Reason)
+ end;
+ {disc_copies, ram_copies} ->
+ Ltabs = val({schema, local_tables}) -- [schema],
+ Dtabs = [L || L <- Ltabs,
+ val({L, storage_type}) /= ram_copies],
+ verify([], Dtabs, {"Disc resident tables", Dtabs, N});
+ _ ->
+ mnesia:abort({combine_error, Tab, ToS})
+ end;
+
+ FromS == ram_copies ->
+ case mnesia_monitor:use_dir() of
+ true ->
+ Dat = mnesia_lib:tab2dcd(Tab),
+ case mnesia_lib:exists(Dat) of
+ true ->
+ mnesia:abort({combine_error, Tab, node(),
+ "Table dump exists"});
+ false ->
+ case ToS of
+ disc_copies ->
+ mnesia_log:ets2dcd(Tab, dmp);
+ disc_only_copies ->
+ mnesia_dumper:raw_named_dump_table(Tab, dmp)
+ end,
+ mnesia_checkpoint:tm_change_table_copy_type(Tab, FromS, ToS)
+ end;
+ false ->
+ mnesia:abort({has_no_disc, node()})
+ end;
+
+ FromS == disc_copies, ToS == disc_only_copies ->
+ mnesia_dumper:raw_named_dump_table(Tab, dmp);
+ FromS == disc_only_copies ->
+ Type = Cs#cstruct.type,
+ create_ram_table(Tab, Type),
+ Datname = mnesia_lib:tab2dat(Tab),
+ Repair = mnesia_monitor:get_env(auto_repair),
+ case mnesia_lib:dets_to_ets(Tab, Tab, Datname, Type, Repair, no) of
+ loaded -> ok;
+ Reason ->
+ Err = "Failed to copy disc data to ram",
+ mnesia:abort({system_limit, Tab, {Err,Reason}})
+ end;
+ true ->
+ ignore
+ end,
+ {true, mandatory};
+
+prepare_op(_Tid, {op, change_table_copy_type, N, _FromS, _ToS, _TabDef}, _WaitFor)
+ when N /= node() ->
+ {true, mandatory};
+
+prepare_op(_Tid, {op, delete_table, _TabDef}, _WaitFor) ->
+ {true, mandatory};
+
+prepare_op(_Tid, {op, dump_table, unknown, TabDef}, _WaitFor) ->
+ Cs = list2cs(TabDef),
+ Tab = Cs#cstruct.name,
+ case lists:member(node(), Cs#cstruct.ram_copies) of
+ true ->
+ case mnesia_monitor:use_dir() of
+ true ->
+ mnesia_log:ets2dcd(Tab, dmp),
+ Size = mnesia:table_info(Tab, size),
+ {true, [{op, dump_table, Size, TabDef}], optional};
+ false ->
+ mnesia:abort({has_no_disc, node()})
+ end;
+ false ->
+ {false, optional}
+ end;
+
+prepare_op(_Tid, {op, add_snmp, Ustruct, TabDef}, _WaitFor) ->
+ Cs = list2cs(TabDef),
+ case mnesia_lib:cs_to_storage_type(node(), Cs) of
+ unknown ->
+ {true, optional};
+ Storage ->
+ Tab = Cs#cstruct.name,
+ Stab = mnesia_snmp_hook:create_table(Ustruct, Tab, Storage),
+ mnesia_lib:set({Tab, {index, snmp}}, Stab),
+ {true, optional}
+ end;
+
+prepare_op(_Tid, {op, transform, ignore, _TabDef}, _WaitFor) ->
+ {true, mandatory}; %% Apply schema changes only.
+prepare_op(_Tid, {op, transform, Fun, TabDef}, _WaitFor) ->
+ Cs = list2cs(TabDef),
+ case mnesia_lib:cs_to_storage_type(node(), Cs) of
+ unknown ->
+ {true, mandatory};
+ Storage ->
+ Tab = Cs#cstruct.name,
+ RecName = Cs#cstruct.record_name,
+ Type = Cs#cstruct.type,
+ NewArity = length(Cs#cstruct.attributes) + 1,
+ mnesia_lib:db_fixtable(Storage, Tab, true),
+ Key = mnesia_lib:db_first(Tab),
+ Op = {op, transform, Fun, TabDef},
+ case catch transform_objs(Fun, Tab, RecName,
+ Key, NewArity, Storage, Type, [Op]) of
+ {'EXIT', Reason} ->
+ mnesia_lib:db_fixtable(Storage, Tab, false),
+ exit({"Bad transform function", Tab, Fun, node(), Reason});
+ Objs ->
+ mnesia_lib:db_fixtable(Storage, Tab, false),
+ {true, Objs, mandatory}
+ end
+ end;
+
+prepare_op(_Tid, _Op, _WaitFor) ->
+ {true, optional}.
+
+
+create_ram_table(Tab, Type) ->
+ Args = [{keypos, 2}, public, named_table, Type],
+ case mnesia_monitor:unsafe_mktab(Tab, Args) of
+ Tab ->
+ ok;
+ {error,Reason} ->
+ Err = "Failed to create ets table",
+ mnesia:abort({system_limit, Tab, {Err,Reason}})
+ end.
+create_disc_table(Tab) ->
+ File = mnesia_lib:tab2dcd(Tab),
+ file:delete(File),
+ FArg = [{file, File}, {name, {mnesia,create}},
+ {repair, false}, {mode, read_write}],
+ case mnesia_monitor:open_log(FArg) of
+ {ok,Log} ->
+ mnesia_monitor:unsafe_close_log(Log),
+ ok;
+ {error,Reason} ->
+ Err = "Failed to create disc table",
+ mnesia:abort({system_limit, Tab, {Err,Reason}})
+ end.
+create_disc_only_table(Tab,Type) ->
+ File = mnesia_lib:tab2dat(Tab),
+ file:delete(File),
+ Args = [{file, mnesia_lib:tab2dat(Tab)},
+ {type, mnesia_lib:disk_type(Tab, Type)},
+ {keypos, 2},
+ {repair, mnesia_monitor:get_env(auto_repair)}],
+ case mnesia_monitor:unsafe_open_dets(Tab, Args) of
+ {ok, _} ->
+ ok;
+ {error,Reason} ->
+ Err = "Failed to create disc table",
+ mnesia:abort({system_limit, Tab, {Err,Reason}})
+ end.
+
+
+receive_sync([], Pids) ->
+ Pids;
+receive_sync(Nodes, Pids) ->
+ receive
+ {sync_trans, Pid} ->
+ Node = node(Pid),
+ receive_sync(lists:delete(Node, Nodes), [Pid | Pids]);
+ Else ->
+ {abort, Else}
+ end.
+
+lock_del_table(Tab, Node, Cs, Father) ->
+ Ns = val({schema, active_replicas}),
+ Lock = fun() ->
+ mnesia:write_lock_table(Tab),
+ {Res, []} = rpc:multicall(Ns, ?MODULE, set_where_to_read, [Tab, Node, Cs]),
+ Filter = fun(ok) ->
+ false;
+ ({badrpc, {'EXIT', {undef, _}}}) ->
+ %% This will be the case we talks with elder nodes
+ %% than 3.8.2, they will set where_to_read without
+ %% getting a lock.
+ false;
+ (_) ->
+ true
+ end,
+ [] = lists:filter(Filter, Res),
+ ok
+ end,
+ case mnesia:transaction(Lock) of
+ {'atomic', ok} ->
+ Father ! {self(), updated};
+ {aborted, R} ->
+ Father ! {self(), R}
+ end,
+ unlink(Father),
+ exit(normal).
+
+set_where_to_read(Tab, Node, Cs) ->
+ case mnesia_lib:val({Tab, where_to_read}) of
+ Node ->
+ case Cs#cstruct.local_content of
+ true ->
+ ok;
+ false ->
+ mnesia_lib:set_remote_where_to_read(Tab, [Node]),
+ ok
+ end;
+ _ ->
+ ok
+ end.
+
+%% Build up the list in reverse order.
+transform_objs(_Fun, _Tab, _RT, '$end_of_table', _NewArity, _Storage, _Type, Acc) ->
+ Acc;
+transform_objs(Fun, Tab, RecName, Key, A, Storage, Type, Acc) ->
+ Objs = mnesia_lib:db_get(Tab, Key),
+ NextKey = mnesia_lib:db_next_key(Tab, Key),
+ Oid = {Tab, Key},
+ NewObjs = {Ws, Ds} = transform_obj(Tab, RecName, Key, Fun, Objs, A, Type, [], []),
+ if
+ NewObjs == {[], []} ->
+ transform_objs(Fun, Tab, RecName, NextKey, A, Storage, Type, Acc);
+ Type == bag ->
+ transform_objs(Fun, Tab, RecName, NextKey, A, Storage, Type,
+ [{op, rec, Storage, {Oid, Ws, write}},
+ {op, rec, Storage, {Oid, [Oid], delete}} | Acc]);
+ Ds == [] ->
+ %% Type is set or ordered_set, no need to delete the record first
+ transform_objs(Fun, Tab, RecName, NextKey, A, Storage, Type,
+ [{op, rec, Storage, {Oid, Ws, write}} | Acc]);
+ Ws == [] ->
+ transform_objs(Fun, Tab, RecName, NextKey, A, Storage, Type,
+ [{op, rec, Storage, {Oid, Ds, write}} | Acc]);
+ true ->
+ transform_objs(Fun, Tab, RecName, NextKey, A, Storage, Type,
+ [{op, rec, Storage, {Oid, Ws, write}},
+ {op, rec, Storage, {Oid, Ds, delete}} | Acc])
+ end.
+
+transform_obj(Tab, RecName, Key, Fun, [Obj|Rest], NewArity, Type, Ws, Ds) ->
+ NewObj = Fun(Obj),
+ if
+ size(NewObj) /= NewArity ->
+ exit({"Bad arity", Obj, NewObj});
+ NewObj == Obj ->
+ transform_obj(Tab, RecName, Key, Fun, Rest, NewArity, Type, Ws, Ds);
+ RecName == element(1, NewObj), Key == element(2, NewObj) ->
+ transform_obj(Tab, RecName, Key, Fun, Rest, NewArity,
+ Type, [NewObj | Ws], Ds);
+ NewObj == delete ->
+ case Type of
+ bag -> %% Just don't write that object
+ transform_obj(Tab, RecName, Key, Fun, Rest,
+ NewArity, Type, Ws, Ds);
+ _ ->
+ transform_obj(Tab, RecName, Key, Fun, Rest, NewArity,
+ Type, Ws, [NewObj | Ds])
+ end;
+ true ->
+ exit({"Bad key or Record Name", Obj, NewObj})
+ end;
+transform_obj(_Tab, _RecName, _Key, _Fun, [], _NewArity, _Type, Ws, Ds) ->
+ {lists:reverse(Ws), lists:reverse(Ds)}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Undo prepare of commit
+undo_prepare_commit(Tid, Commit) ->
+ case Commit#commit.schema_ops of
+ [] ->
+ ignore;
+ Ops ->
+ %% Catch to allow failure mnesia_controller may not be started
+ catch mnesia_controller:release_schema_commit_lock(),
+ undo_prepare_ops(Tid, Ops)
+ end,
+ Commit.
+
+%% Undo in reverse order
+undo_prepare_ops(Tid, [Op | Ops]) ->
+ case element(1, Op) of
+ TheOp when TheOp /= op, TheOp /= restore_op ->
+ undo_prepare_ops(Tid, Ops);
+ _ ->
+ undo_prepare_ops(Tid, Ops),
+ undo_prepare_op(Tid, Op)
+ end;
+undo_prepare_ops(_Tid, []) ->
+ [].
+
+undo_prepare_op(_Tid, {op, announce_im_running, _, _, Running, RemoteRunning}) ->
+ case lists:member(node(), Running) of
+ true ->
+ unannounce_im_running(RemoteRunning -- Running);
+ false ->
+ unannounce_im_running(Running -- RemoteRunning)
+ end;
+
+undo_prepare_op(_Tid, {op, sync_trans}) ->
+ ok;
+
+undo_prepare_op(Tid, {op, create_table, TabDef}) ->
+ Cs = list2cs(TabDef),
+ Tab = Cs#cstruct.name,
+ mnesia_lib:unset({Tab, create_table}),
+ delete_cstruct(Tid, Cs),
+ case mnesia_lib:cs_to_storage_type(node(), Cs) of
+ unknown ->
+ ok;
+ ram_copies ->
+ ram_delete_table(Tab, ram_copies);
+ disc_copies ->
+ ram_delete_table(Tab, disc_copies),
+ DcdFile = mnesia_lib:tab2dcd(Tab),
+ %% disc_delete_table(Tab, Storage),
+ file:delete(DcdFile);
+ disc_only_copies ->
+ mnesia_monitor:unsafe_close_dets(Tab),
+ Dat = mnesia_lib:tab2dat(Tab),
+ %% disc_delete_table(Tab, Storage),
+ file:delete(Dat)
+ end;
+
+undo_prepare_op(Tid, {op, add_table_copy, Storage, Node, TabDef}) ->
+ Cs = list2cs(TabDef),
+ Tab = Cs#cstruct.name,
+ if
+ Tab == schema ->
+ true; % Nothing to prepare
+ Node == node() ->
+ mnesia_checkpoint:tm_del_copy(Tab, Node),
+ mnesia_controller:unannounce_add_table_copy(Tab, Node),
+ if
+ Storage == disc_only_copies; Tab == schema ->
+ mnesia_monitor:close_dets(Tab),
+ file:delete(mnesia_lib:tab2dat(Tab));
+ true ->
+ file:delete(mnesia_lib:tab2dcd(Tab))
+ end,
+ ram_delete_table(Tab, Storage),
+ Cs2 = new_cs(Cs, Node, Storage, del),
+ insert_cstruct(Tid, Cs2, true); % Don't care about the version
+ Node /= node() ->
+ mnesia_controller:unannounce_add_table_copy(Tab, Node),
+ Cs2 = new_cs(Cs, Node, Storage, del),
+ insert_cstruct(Tid, Cs2, true) % Don't care about the version
+ end;
+
+undo_prepare_op(_Tid, {op, del_table_copy, _, Node, TabDef})
+ when Node == node() ->
+ Cs = list2cs(TabDef),
+ Tab = Cs#cstruct.name,
+ mnesia_lib:set({Tab, where_to_read}, Node);
+
+
+undo_prepare_op(_Tid, {op, change_table_copy_type, N, FromS, ToS, TabDef})
+ when N == node() ->
+ Cs = list2cs(TabDef),
+ Tab = Cs#cstruct.name,
+ mnesia_checkpoint:tm_change_table_copy_type(Tab, ToS, FromS),
+ Dmp = mnesia_lib:tab2dmp(Tab),
+
+ case {FromS, ToS} of
+ {ram_copies, disc_copies} when Tab == schema ->
+ file:delete(Dmp),
+ mnesia_log:purge_some_logs(),
+ set(use_dir, false);
+ {ram_copies, disc_copies} ->
+ file:delete(Dmp);
+ {ram_copies, disc_only_copies} ->
+ file:delete(Dmp);
+ {disc_only_copies, _} ->
+ ram_delete_table(Tab, ram_copies);
+ _ ->
+ ignore
+ end;
+
+undo_prepare_op(_Tid, {op, dump_table, _Size, TabDef}) ->
+ Cs = list2cs(TabDef),
+ case lists:member(node(), Cs#cstruct.ram_copies) of
+ true ->
+ Tab = Cs#cstruct.name,
+ Dmp = mnesia_lib:tab2dmp(Tab),
+ file:delete(Dmp);
+ false ->
+ ignore
+ end;
+
+undo_prepare_op(_Tid, {op, add_snmp, _Ustruct, TabDef}) ->
+ Cs = list2cs(TabDef),
+ case mnesia_lib:cs_to_storage_type(node(), Cs) of
+ unknown ->
+ true;
+ _Storage ->
+ Tab = Cs#cstruct.name,
+ case ?catch_val({Tab, {index, snmp}}) of
+ {'EXIT',_} ->
+ ignore;
+ Stab ->
+ mnesia_snmp_hook:delete_table(Tab, Stab),
+ mnesia_lib:unset({Tab, {index, snmp}})
+ end
+ end;
+
+undo_prepare_op(_Tid, _Op) ->
+ ignore.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ram_delete_table(Tab, Storage) ->
+ case Storage of
+ unknown ->
+ ignore;
+ disc_only_copies ->
+ ignore;
+ _Else ->
+ %% delete possible index files and data .....
+ %% Got to catch this since if no info has been set in the
+ %% mnesia_gvar it will crash
+ catch mnesia_index:del_transient(Tab, Storage),
+ case ?catch_val({Tab, {index, snmp}}) of
+ {'EXIT', _} ->
+ ignore;
+ Etab ->
+ catch mnesia_snmp_hook:delete_table(Tab, Etab)
+ end,
+ catch ?ets_delete_table(Tab)
+ end.
+
+purge_dir(Dir, KeepFiles) ->
+ Suffixes = known_suffixes(),
+ purge_dir(Dir, KeepFiles, Suffixes).
+
+purge_dir(Dir, KeepFiles, Suffixes) ->
+ case dir_exists(Dir) of
+ true ->
+ {ok, AllFiles} = file:list_dir(Dir),
+ purge_known_files(AllFiles, KeepFiles, Dir, Suffixes);
+ false ->
+ ok
+ end.
+
+purge_tmp_files() ->
+ case mnesia_monitor:use_dir() of
+ true ->
+ Dir = mnesia_lib:dir(),
+ KeepFiles = [],
+ Exists = mnesia_lib:exists(mnesia_lib:tab2dat(schema)),
+ case Exists of
+ true ->
+ Suffixes = tmp_suffixes(),
+ purge_dir(Dir, KeepFiles, Suffixes);
+ false ->
+ %% Interrupted change of storage type
+ %% for schema table
+ Suffixes = known_suffixes(),
+ purge_dir(Dir, KeepFiles, Suffixes),
+ mnesia_lib:set(use_dir, false)
+ end;
+
+ false ->
+ ok
+ end.
+
+purge_known_files([File | Tail], KeepFiles, Dir, Suffixes) ->
+ case lists:member(File, KeepFiles) of
+ true ->
+ ignore;
+ false ->
+ case has_known_suffix(File, Suffixes, false) of
+ false ->
+ ignore;
+ true ->
+ AbsFile = filename:join([Dir, File]),
+ file:delete(AbsFile)
+ end
+ end,
+ purge_known_files(Tail, KeepFiles, Dir, Suffixes);
+purge_known_files([], _KeepFiles, _Dir, _Suffixes) ->
+ ok.
+
+has_known_suffix(_File, _Suffixes, true) ->
+ true;
+has_known_suffix(File, [Suffix | Tail], false) ->
+ has_known_suffix(File, Tail, lists:suffix(Suffix, File));
+has_known_suffix(_File, [], Bool) ->
+ Bool.
+
+known_suffixes() -> real_suffixes() ++ tmp_suffixes().
+
+real_suffixes() -> [".DAT", ".LOG", ".BUP", ".DCL", ".DCD"].
+
+tmp_suffixes() -> [".TMP", ".BUPTMP", ".RET", ".DMP"].
+
+info() ->
+ Tabs = lists:sort(val({schema, tables})),
+ lists:foreach(fun(T) -> info(T) end, Tabs),
+ ok.
+
+info(Tab) ->
+ Props = get_table_properties(Tab),
+ io:format("-- Properties for ~w table --- ~n",[Tab]),
+ info2(Tab, Props).
+info2(Tab, [{cstruct, _V} | Tail]) -> % Ignore cstruct
+ info2(Tab, Tail);
+info2(Tab, [{frag_hash, _V} | Tail]) -> % Ignore frag_hash
+ info2(Tab, Tail);
+info2(Tab, [{P, V} | Tail]) ->
+ io:format("~-20w -> ~p~n",[P,V]),
+ info2(Tab, Tail);
+info2(_, []) ->
+ io:format("~n", []).
+
+get_table_properties(Tab) ->
+ case catch mnesia_lib:db_match_object(ram_copies,
+ mnesia_gvar, {{Tab, '_'}, '_'}) of
+ {'EXIT', _} ->
+ mnesia:abort({no_exists, Tab, all});
+ RawGvar ->
+ case [{Item, Val} || {{_Tab, Item}, Val} <- RawGvar] of
+ [] ->
+ [];
+ Gvar ->
+ Size = {size, mnesia:table_info(Tab, size)},
+ Memory = {memory, mnesia:table_info(Tab, memory)},
+ Master = {master_nodes, mnesia:table_info(Tab, master_nodes)},
+ lists:sort([Size, Memory, Master | Gvar])
+ end
+ end.
+
+%%%%%%%%%%% RESTORE %%%%%%%%%%%
+
+-record(r, {iter = schema,
+ module,
+ table_options = [],
+ default_op = clear_tables,
+ tables = [],
+ opaque,
+ insert_op = error_fun,
+ recs = error_recs
+ }).
+
+restore(Opaque) ->
+ restore(Opaque, [], mnesia_monitor:get_env(backup_module)).
+restore(Opaque, Args) when list(Args) ->
+ restore(Opaque, Args, mnesia_monitor:get_env(backup_module));
+restore(_Opaque, BadArg) ->
+ {aborted, {badarg, BadArg}}.
+restore(Opaque, Args, Module) when list(Args), atom(Module) ->
+ InitR = #r{opaque = Opaque, module = Module},
+ case catch lists:foldl(fun check_restore_arg/2, InitR, Args) of
+ R when record(R, r) ->
+ case mnesia_bup:read_schema(Module, Opaque) of
+ {error, Reason} ->
+ {aborted, Reason};
+ BupSchema ->
+ schema_transaction(fun() -> do_restore(R, BupSchema) end)
+ end;
+ {'EXIT', Reason} ->
+ {aborted, Reason}
+ end;
+restore(_Opaque, Args, Module) ->
+ {aborted, {badarg, Args, Module}}.
+
+check_restore_arg({module, Mod}, R) when atom(Mod) ->
+ R#r{module = Mod};
+
+check_restore_arg({clear_tables, List}, R) when list(List) ->
+ case lists:member(schema, List) of
+ false ->
+ TableList = [{Tab, clear_tables} || Tab <- List],
+ R#r{table_options = R#r.table_options ++ TableList};
+ true ->
+ exit({badarg, {clear_tables, schema}})
+ end;
+check_restore_arg({recreate_tables, List}, R) when list(List) ->
+ case lists:member(schema, List) of
+ false ->
+ TableList = [{Tab, recreate_tables} || Tab <- List],
+ R#r{table_options = R#r.table_options ++ TableList};
+ true ->
+ exit({badarg, {recreate_tables, schema}})
+ end;
+check_restore_arg({keep_tables, List}, R) when list(List) ->
+ TableList = [{Tab, keep_tables} || Tab <- List],
+ R#r{table_options = R#r.table_options ++ TableList};
+check_restore_arg({skip_tables, List}, R) when list(List) ->
+ TableList = [{Tab, skip_tables} || Tab <- List],
+ R#r{table_options = R#r.table_options ++ TableList};
+check_restore_arg({default_op, Op}, R) ->
+ case Op of
+ clear_tables -> ok;
+ recreate_tables -> ok;
+ keep_tables -> ok;
+ skip_tables -> ok;
+ Else ->
+ exit({badarg, {bad_default_op, Else}})
+ end,
+ R#r{default_op = Op};
+
+check_restore_arg(BadArg,_) ->
+ exit({badarg, BadArg}).
+
+do_restore(R, BupSchema) ->
+ TidTs = get_tid_ts_and_lock(schema, write),
+ R2 = restore_schema(BupSchema, R),
+ insert_schema_ops(TidTs, [{restore_op, R2}]),
+ [element(1, TabStruct) || TabStruct <- R2#r.tables].
+
+arrange_restore(R, Fun, Recs) ->
+ R2 = R#r{insert_op = Fun, recs = Recs},
+ case mnesia_bup:iterate(R#r.module, fun restore_items/4, R#r.opaque, R2) of
+ {ok, R3} -> R3#r.recs;
+ {error, Reason} -> mnesia:abort(Reason);
+ Reason -> mnesia:abort(Reason)
+ end.
+
+restore_items([Rec | Recs], Header, Schema, R) ->
+ Tab = element(1, Rec),
+ case lists:keysearch(Tab, 1, R#r.tables) of
+ {value, {Tab, Where, Snmp, RecName}} ->
+ {Rest, NRecs} =
+ restore_tab_items([Rec | Recs], Tab, RecName, Where, Snmp,
+ R#r.recs, R#r.insert_op),
+ restore_items(Rest, Header, Schema, R#r{recs = NRecs});
+ false ->
+ Rest = skip_tab_items(Recs, Tab),
+ restore_items(Rest, Header, Schema, R)
+ end;
+
+restore_items([], _Header, _Schema, R) ->
+ R.
+
+restore_func(Tab, R) ->
+ case lists:keysearch(Tab, 1, R#r.table_options) of
+ {value, {Tab, OP}} ->
+ OP;
+ false ->
+ R#r.default_op
+ end.
+
+where_to_commit(Tab, CsList) ->
+ Ram = [{N, ram_copies} || N <- pick(Tab, ram_copies, CsList, [])],
+ Disc = [{N, disc_copies} || N <- pick(Tab, disc_copies, CsList, [])],
+ DiscO = [{N, disc_only_copies} || N <- pick(Tab, disc_only_copies, CsList, [])],
+ Ram ++ Disc ++ DiscO.
+
+%% Changes of the Meta info of schema itself is not allowed
+restore_schema([{schema, schema, _List} | Schema], R) ->
+ restore_schema(Schema, R);
+restore_schema([{schema, Tab, List} | Schema], R) ->
+ case restore_func(Tab, R) of
+ clear_tables ->
+ do_clear_table(Tab),
+ Where = val({Tab, where_to_commit}),
+ Snmp = val({Tab, snmp}),
+ RecName = val({Tab, record_name}),
+ R2 = R#r{tables = [{Tab, Where, Snmp, RecName} | R#r.tables]},
+ restore_schema(Schema, R2);
+ recreate_tables ->
+ TidTs = get_tid_ts_and_lock(Tab, write),
+ NC = {cookie, ?unique_cookie},
+ List2 = lists:keyreplace(cookie, 1, List, NC),
+ Where = where_to_commit(Tab, List2),
+ Snmp = pick(Tab, snmp, List2, []),
+ RecName = pick(Tab, record_name, List2, Tab),
+% case ?catch_val({Tab, cstruct}) of
+% {'EXIT', _} ->
+% ignore;
+% OldCs when record(OldCs, cstruct) ->
+% do_delete_table(Tab)
+% end,
+% unsafe_do_create_table(list2cs(List2)),
+ insert_schema_ops(TidTs, [{op, restore_recreate, List2}]),
+ R2 = R#r{tables = [{Tab, Where, Snmp, RecName} | R#r.tables]},
+ restore_schema(Schema, R2);
+ keep_tables ->
+ get_tid_ts_and_lock(Tab, write),
+ Where = val({Tab, where_to_commit}),
+ Snmp = val({Tab, snmp}),
+ RecName = val({Tab, record_name}),
+ R2 = R#r{tables = [{Tab, Where, Snmp, RecName} | R#r.tables]},
+ restore_schema(Schema, R2);
+ skip_tables ->
+ restore_schema(Schema, R)
+ end;
+
+restore_schema([{schema, Tab} | Schema], R) ->
+ do_delete_table(Tab),
+ Tabs = lists:delete(Tab,R#r.tables),
+ restore_schema(Schema, R#r{tables = Tabs});
+restore_schema([], R) ->
+ R.
+
+restore_tab_items([Rec | Rest], Tab, RecName, Where, Snmp, Recs, Op)
+ when element(1, Rec) == Tab ->
+ NewRecs = Op(Rec, Recs, RecName, Where, Snmp),
+ restore_tab_items(Rest, Tab, RecName, Where, Snmp, NewRecs, Op);
+
+restore_tab_items(Rest, _Tab, _RecName, _Where, _Snmp, Recs, _Op) ->
+ {Rest, Recs}.
+
+skip_tab_items([Rec| Rest], Tab)
+ when element(1, Rec) == Tab ->
+ skip_tab_items(Rest, Tab);
+skip_tab_items(Recs, _) ->
+ Recs.
+
+%%%%%%%%% Dump tables %%%%%%%%%%%%%
+dump_tables(Tabs) when list(Tabs) ->
+ schema_transaction(fun() -> do_dump_tables(Tabs) end);
+dump_tables(Tabs) ->
+ {aborted, {bad_type, Tabs}}.
+
+do_dump_tables(Tabs) ->
+ TidTs = get_tid_ts_and_lock(schema, write),
+ insert_schema_ops(TidTs, make_dump_tables(Tabs)).
+
+make_dump_tables([schema | _Tabs]) ->
+ mnesia:abort({bad_type, schema});
+make_dump_tables([Tab | Tabs]) ->
+ get_tid_ts_and_lock(Tab, read),
+ TabDef = get_create_list(Tab),
+ DiscResident = val({Tab, disc_copies}) ++ val({Tab, disc_only_copies}),
+ verify([], DiscResident,
+ {"Only allowed on ram_copies", Tab, DiscResident}),
+ [{op, dump_table, unknown, TabDef} | make_dump_tables(Tabs)];
+make_dump_tables([]) ->
+ [].
+
+%% Merge the local schema with the schema on other nodes
+merge_schema() ->
+ schema_transaction(fun() -> do_merge_schema() end).
+
+do_merge_schema() ->
+ {_Mod, Tid, Ts} = get_tid_ts_and_lock(schema, write),
+ Connected = val(recover_nodes),
+ Running = val({current, db_nodes}),
+ Store = Ts#tidstore.store,
+ case Connected -- Running of
+ [Node | _] ->
+ %% Time for a schema merging party!
+ mnesia_locker:wlock_no_exist(Tid, Store, schema, [Node]),
+
+ case rpc:call(Node, mnesia_controller, get_cstructs, []) of
+ {cstructs, Cstructs, RemoteRunning1} ->
+ LockedAlready = Running ++ [Node],
+ {New, Old} = mnesia_recover:connect_nodes(RemoteRunning1),
+ RemoteRunning = mnesia_lib:intersect(New ++ Old, RemoteRunning1),
+ if
+ RemoteRunning /= RemoteRunning1 ->
+ mnesia_lib:error("Mnesia on ~p could not connect to node(s) ~p~n",
+ [node(), RemoteRunning1 -- RemoteRunning]);
+ true -> ok
+ end,
+ NeedsLock = RemoteRunning -- LockedAlready,
+ mnesia_locker:wlock_no_exist(Tid, Store, schema, NeedsLock),
+
+ {value, SchemaCs} =
+ lists:keysearch(schema, #cstruct.name, Cstructs),
+
+ %% Announce that Node is running
+ A = [{op, announce_im_running, node(),
+ cs2list(SchemaCs), Running, RemoteRunning}],
+ do_insert_schema_ops(Store, A),
+
+ %% Introduce remote tables to local node
+ do_insert_schema_ops(Store, make_merge_schema(Node, Cstructs)),
+
+ %% Introduce local tables to remote nodes
+ Tabs = val({schema, tables}),
+ Ops = [{op, merge_schema, get_create_list(T)}
+ || T <- Tabs,
+ not lists:keymember(T, #cstruct.name, Cstructs)],
+ do_insert_schema_ops(Store, Ops),
+
+ %% Ensure that the txn will be committed on all nodes
+ announce_im_running(RemoteRunning, SchemaCs),
+ {merged, Running, RemoteRunning};
+ {error, Reason} ->
+ {"Cannot get cstructs", Node, Reason};
+ {badrpc, Reason} ->
+ {"Cannot get cstructs", Node, {badrpc, Reason}}
+ end;
+ [] ->
+ %% No more nodes to merge schema with
+ not_merged
+ end.
+
+make_merge_schema(Node, [Cs | Cstructs]) ->
+ Ops = do_make_merge_schema(Node, Cs),
+ Ops ++ make_merge_schema(Node, Cstructs);
+make_merge_schema(_Node, []) ->
+ [].
+
+%% Merge definitions of schema table
+do_make_merge_schema(Node, RemoteCs)
+ when RemoteCs#cstruct.name == schema ->
+ Cs = val({schema, cstruct}),
+ Masters = mnesia_recover:get_master_nodes(schema),
+ HasRemoteMaster = lists:member(Node, Masters),
+ HasLocalMaster = lists:member(node(), Masters),
+ Force = HasLocalMaster or HasRemoteMaster,
+ %% What is the storage types opinions?
+ StCsLocal = mnesia_lib:cs_to_storage_type(node(), Cs),
+ StRcsLocal = mnesia_lib:cs_to_storage_type(node(), RemoteCs),
+ StCsRemote = mnesia_lib:cs_to_storage_type(Node, Cs),
+ StRcsRemote = mnesia_lib:cs_to_storage_type(Node, RemoteCs),
+
+ if
+ Cs#cstruct.cookie == RemoteCs#cstruct.cookie,
+ Cs#cstruct.version == RemoteCs#cstruct.version ->
+ %% Great, we have the same cookie and version
+ %% and do not need to merge cstructs
+ [];
+
+ Cs#cstruct.cookie /= RemoteCs#cstruct.cookie,
+ Cs#cstruct.disc_copies /= [],
+ RemoteCs#cstruct.disc_copies /= [] ->
+ %% Both cstructs involves disc nodes
+ %% and we cannot merge them
+ if
+ HasLocalMaster == true,
+ HasRemoteMaster == false ->
+ %% Choose local cstruct,
+ %% since it's the master
+ [{op, merge_schema, cs2list(Cs)}];
+
+ HasRemoteMaster == true,
+ HasLocalMaster == false ->
+ %% Choose remote cstruct,
+ %% since it's the master
+ [{op, merge_schema, cs2list(RemoteCs)}];
+
+ true ->
+ Str = io_lib:format("Incompatible schema cookies. "
+ "Please, restart from old backup."
+ "~w = ~w, ~w = ~w~n",
+ [Node, cs2list(RemoteCs), node(), cs2list(Cs)]),
+ throw(Str)
+ end;
+
+ StCsLocal /= StRcsLocal, StRcsLocal /= unknown ->
+ Str = io_lib:format("Incompatible schema storage types. "
+ "on ~w storage ~w, on ~w storage ~w~n",
+ [node(), StCsLocal, Node, StRcsLocal]),
+ throw(Str);
+ StCsRemote /= StRcsRemote, StCsRemote /= unknown ->
+ Str = io_lib:format("Incompatible schema storage types. "
+ "on ~w storage ~w, on ~w storage ~w~n",
+ [node(), StCsRemote, Node, StRcsRemote]),
+ throw(Str);
+
+ Cs#cstruct.disc_copies /= [] ->
+ %% Choose local cstruct,
+ %% since it involves disc nodes
+ MergedCs = merge_cstructs(Cs, RemoteCs, Force),
+ [{op, merge_schema, cs2list(MergedCs)}];
+
+ RemoteCs#cstruct.disc_copies /= [] ->
+ %% Choose remote cstruct,
+ %% since it involves disc nodes
+ MergedCs = merge_cstructs(RemoteCs, Cs, Force),
+ [{op, merge_schema, cs2list(MergedCs)}];
+
+ Cs > RemoteCs ->
+ %% Choose remote cstruct
+ MergedCs = merge_cstructs(RemoteCs, Cs, Force),
+ [{op, merge_schema, cs2list(MergedCs)}];
+
+ true ->
+ %% Choose local cstruct
+ MergedCs = merge_cstructs(Cs, RemoteCs, Force),
+ [{op, merge_schema, cs2list(MergedCs)}]
+ end;
+
+%% Merge definitions of normal table
+do_make_merge_schema(Node, RemoteCs) ->
+ Tab = RemoteCs#cstruct.name,
+ Masters = mnesia_recover:get_master_nodes(schema),
+ HasRemoteMaster = lists:member(Node, Masters),
+ HasLocalMaster = lists:member(node(), Masters),
+ Force = HasLocalMaster or HasRemoteMaster,
+ case ?catch_val({Tab, cstruct}) of
+ {'EXIT', _} ->
+ %% A completely new table, created while Node was down
+ [{op, merge_schema, cs2list(RemoteCs)}];
+ Cs when Cs#cstruct.cookie == RemoteCs#cstruct.cookie ->
+ if
+ Cs#cstruct.version == RemoteCs#cstruct.version ->
+ %% We have exactly the same version of the
+ %% table def
+ [];
+
+ Cs#cstruct.version > RemoteCs#cstruct.version ->
+ %% Oops, we have different versions
+ %% of the table def, lets merge them.
+ %% The only changes that may have occurred
+ %% is that new replicas may have been added.
+ MergedCs = merge_cstructs(Cs, RemoteCs, Force),
+ [{op, merge_schema, cs2list(MergedCs)}];
+
+ Cs#cstruct.version < RemoteCs#cstruct.version ->
+ %% Oops, we have different versions
+ %% of the table def, lets merge them
+ MergedCs = merge_cstructs(RemoteCs, Cs, Force),
+ [{op, merge_schema, cs2list(MergedCs)}]
+ end;
+ Cs ->
+ %% Different cookies, not possible to merge
+ if
+ HasLocalMaster == true,
+ HasRemoteMaster == false ->
+ %% Choose local cstruct,
+ %% since it's the master
+ [{op, merge_schema, cs2list(Cs)}];
+
+ HasRemoteMaster == true,
+ HasLocalMaster == false ->
+ %% Choose remote cstruct,
+ %% since it's the master
+ [{op, merge_schema, cs2list(RemoteCs)}];
+
+ true ->
+ Str = io_lib:format("Bad cookie in table definition"
+ " ~w: ~w = ~w, ~w = ~w~n",
+ [Tab, node(), Cs, Node, RemoteCs]),
+ throw(Str)
+ end
+ end.
+
+%% Change of table definitions (cstructs) requires all replicas
+%% of the table to be active. New replicas, db_nodes and tables
+%% may however be added even if some replica is inactive. These
+%% invariants must be enforced in order to allow merge of cstructs.
+%%
+%% Returns a new cstruct or issues a fatal error
+merge_cstructs(Cs, RemoteCs, Force) ->
+ verify_cstruct(Cs),
+ case catch do_merge_cstructs(Cs, RemoteCs, Force) of
+ {'EXIT', {aborted, _Reason}} when Force == true ->
+ Cs;
+ {'EXIT', Reason} ->
+ exit(Reason);
+ MergedCs when record(MergedCs, cstruct) ->
+ MergedCs;
+ Other ->
+ throw(Other)
+ end.
+
+do_merge_cstructs(Cs, RemoteCs, Force) ->
+ verify_cstruct(RemoteCs),
+ Ns = mnesia_lib:uniq(mnesia_lib:cs_to_nodes(Cs) ++
+ mnesia_lib:cs_to_nodes(RemoteCs)),
+ {AnythingNew, MergedCs} =
+ merge_storage_type(Ns, false, Cs, RemoteCs, Force),
+ MergedCs2 = merge_versions(AnythingNew, MergedCs, RemoteCs, Force),
+ verify_cstruct(MergedCs2),
+ MergedCs2.
+
+merge_storage_type([N | Ns], AnythingNew, Cs, RemoteCs, Force) ->
+ Local = mnesia_lib:cs_to_storage_type(N, Cs),
+ Remote = mnesia_lib:cs_to_storage_type(N, RemoteCs),
+ case compare_storage_type(true, Local, Remote) of
+ {same, _Storage} ->
+ merge_storage_type(Ns, AnythingNew, Cs, RemoteCs, Force);
+ {diff, Storage} ->
+ Cs2 = change_storage_type(N, Storage, Cs),
+ merge_storage_type(Ns, true, Cs2, RemoteCs, Force);
+ incompatible when Force == true ->
+ merge_storage_type(Ns, AnythingNew, Cs, RemoteCs, Force);
+ Other ->
+ Str = io_lib:format("Cannot merge storage type for node ~w "
+ "in cstruct ~w with remote cstruct ~w (~w)~n",
+ [N, Cs, RemoteCs, Other]),
+ throw(Str)
+ end;
+merge_storage_type([], AnythingNew, MergedCs, _RemoteCs, _Force) ->
+ {AnythingNew, MergedCs}.
+
+compare_storage_type(_Retry, Any, Any) ->
+ {same, Any};
+compare_storage_type(_Retry, unknown, Any) ->
+ {diff, Any};
+compare_storage_type(_Retry, ram_copies, disc_copies) ->
+ {diff, disc_copies};
+compare_storage_type(_Retry, disc_copies, disc_only_copies) ->
+ {diff, disc_only_copies};
+compare_storage_type(true, One, Another) ->
+ compare_storage_type(false, Another, One);
+compare_storage_type(false, _One, _Another) ->
+ incompatible.
+
+change_storage_type(N, ram_copies, Cs) ->
+ Nodes = [N | Cs#cstruct.ram_copies],
+ Cs#cstruct{ram_copies = mnesia_lib:uniq(Nodes)};
+change_storage_type(N, disc_copies, Cs) ->
+ Nodes = [N | Cs#cstruct.disc_copies],
+ Cs#cstruct{disc_copies = mnesia_lib:uniq(Nodes)};
+change_storage_type(N, disc_only_copies, Cs) ->
+ Nodes = [N | Cs#cstruct.disc_only_copies],
+ Cs#cstruct{disc_only_copies = mnesia_lib:uniq(Nodes)}.
+
+%% BUGBUG: Verify match of frag info; equalit demanded for all but add_node
+
+merge_versions(AnythingNew, Cs, RemoteCs, Force) ->
+ if
+ Cs#cstruct.name == schema ->
+ ok;
+ Cs#cstruct.name /= schema,
+ Cs#cstruct.cookie == RemoteCs#cstruct.cookie ->
+ ok;
+ Force == true ->
+ ok;
+ true ->
+ Str = io_lib:format("Bad cookies. Cannot merge definitions of "
+ "table ~w. Local = ~w, Remote = ~w~n",
+ [Cs#cstruct.name, Cs, RemoteCs]),
+ throw(Str)
+ end,
+ if
+ Cs#cstruct.name == RemoteCs#cstruct.name,
+ Cs#cstruct.type == RemoteCs#cstruct.type,
+ Cs#cstruct.local_content == RemoteCs#cstruct.local_content,
+ Cs#cstruct.attributes == RemoteCs#cstruct.attributes,
+ Cs#cstruct.index == RemoteCs#cstruct.index,
+ Cs#cstruct.snmp == RemoteCs#cstruct.snmp,
+ Cs#cstruct.access_mode == RemoteCs#cstruct.access_mode,
+ Cs#cstruct.load_order == RemoteCs#cstruct.load_order,
+ Cs#cstruct.user_properties == RemoteCs#cstruct.user_properties ->
+ do_merge_versions(AnythingNew, Cs, RemoteCs);
+ Force == true ->
+ do_merge_versions(AnythingNew, Cs, RemoteCs);
+ true ->
+ Str1 = io_lib:format("Cannot merge definitions of "
+ "table ~w. Local = ~w, Remote = ~w~n",
+ [Cs#cstruct.name, Cs, RemoteCs]),
+ throw(Str1)
+ end.
+
+do_merge_versions(AnythingNew, MergedCs, RemoteCs) ->
+ {{Major1, Minor1}, _Detail1} = MergedCs#cstruct.version,
+ {{Major2, Minor2}, _Detail2} = RemoteCs#cstruct.version,
+ if
+ MergedCs#cstruct.version == RemoteCs#cstruct.version ->
+ MergedCs;
+ AnythingNew == false ->
+ MergedCs;
+ Major1 == Major2 ->
+ Minor = lists:max([Minor1, Minor2]),
+ V = {{Major1, Minor}, dummy},
+ incr_version(MergedCs#cstruct{version = V});
+ Major1 /= Major2 ->
+ Major = lists:max([Major1, Major2]),
+ V = {{Major, 0}, dummy},
+ incr_version(MergedCs#cstruct{version = V})
+ end.
+
+announce_im_running([N | Ns], SchemaCs) ->
+ {L1, L2} = mnesia_recover:connect_nodes([N]),
+ case lists:member(N, L1) or lists:member(N, L2) of
+ true ->
+%% dbg_out("Adding ~p to {current db_nodes} ~n", [N]), %% qqqq
+ mnesia_lib:add({current, db_nodes}, N),
+ mnesia_controller:add_active_replica(schema, N, SchemaCs);
+ false ->
+ ignore
+ end,
+ announce_im_running(Ns, SchemaCs);
+announce_im_running([], _) ->
+ [].
+
+unannounce_im_running([N | Ns]) ->
+ mnesia_lib:del({current, db_nodes}, N),
+ mnesia_controller:del_active_replica(schema, N),
+ mnesia_recover:disconnect(N),
+ unannounce_im_running(Ns);
+unannounce_im_running([]) ->
+ [].
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_snmp_hook.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_snmp_hook.erl
new file mode 100644
index 0000000000..ad88bc6e6a
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_snmp_hook.erl
@@ -0,0 +1,271 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_snmp_hook.erl,v 1.1 2008/12/17 09:53:39 mikpe Exp $
+%%
+-module(mnesia_snmp_hook).
+
+%% Hooks (called from mnesia)
+-export([check_ustruct/1, create_table/3, delete_table/2,
+ key_to_oid/3, update/1, start/2,
+ get_row/2, get_next_index/2, get_mnesia_key/2]).
+
+%% sys callback functions
+-export([system_continue/3,
+ system_terminate/4,
+ system_code_change/4
+ ]).
+
+%% Internal exports
+-export([b_init/2]).
+
+check_ustruct([]) ->
+ true; %% default value, not SNMP'ified
+check_ustruct([{key, Types}]) ->
+ is_snmp_type(to_list(Types));
+check_ustruct(_) -> false.
+
+to_list(Tuple) when tuple(Tuple) -> tuple_to_list(Tuple);
+to_list(X) -> [X].
+
+is_snmp_type([integer | T]) -> is_snmp_type(T);
+is_snmp_type([string | T]) -> is_snmp_type(T);
+is_snmp_type([fix_string | T]) -> is_snmp_type(T);
+is_snmp_type([]) -> true;
+is_snmp_type(_) -> false.
+
+create_table([], MnesiaTab, _Storage) ->
+ mnesia:abort({badarg, MnesiaTab, {snmp, empty_snmpstruct}});
+
+create_table([{key, Us}], MnesiaTab, Storage) ->
+ Tree = b_new(MnesiaTab, Us),
+ mnesia_lib:db_fixtable(Storage, MnesiaTab, true),
+ First = mnesia_lib:db_first(Storage, MnesiaTab),
+ build_table(First, MnesiaTab, Tree, Us, Storage),
+ mnesia_lib:db_fixtable(Storage, MnesiaTab, false),
+ Tree.
+
+build_table(MnesiaKey, MnesiaTab, Tree, Us, Storage)
+ when MnesiaKey /= '$end_of_table' ->
+%% SnmpKey = key_to_oid(MnesiaTab, MnesiaKey, Us),
+%% update(write, Tree, MnesiaKey, SnmpKey),
+ update(write, Tree, MnesiaKey, MnesiaKey),
+ Next = mnesia_lib:db_next_key(Storage, MnesiaTab, MnesiaKey),
+ build_table(Next, MnesiaTab, Tree, Us, Storage);
+build_table('$end_of_table', _MnesiaTab, _Tree, _Us, _Storage) ->
+ ok.
+
+delete_table(_MnesiaTab, Tree) ->
+ exit(Tree, shutdown),
+ ok.
+
+%%-----------------------------------------------------------------
+%% update({Op, MnesiaTab, MnesiaKey, SnmpKey})
+%%-----------------------------------------------------------------
+
+update({clear_table, MnesiaTab}) ->
+ Tree = mnesia_lib:val({MnesiaTab, {index, snmp}}),
+ b_clear(Tree);
+
+update({Op, MnesiaTab, MnesiaKey, SnmpKey}) ->
+ Tree = mnesia_lib:val({MnesiaTab, {index, snmp}}),
+ update(Op, Tree, MnesiaKey, SnmpKey).
+
+update(Op, Tree, MnesiaKey, _) ->
+ case Op of
+ write ->
+ b_insert(Tree, MnesiaKey, MnesiaKey);
+ update_counter ->
+ ignore;
+ delete ->
+ b_delete(Tree, MnesiaKey);
+ delete_object ->
+ b_delete(Tree, MnesiaKey)
+ end,
+ ok.
+
+%%-----------------------------------------------------------------
+%% Func: key_to_oid(Tab, Key, Ustruct)
+%% Args: Key ::= key()
+%% key() ::= int() | string() | {int() | string()}
+%% Type ::= {fix_string | term()}
+%% Make an OBJECT IDENTIFIER out of it.
+%% Variable length objects are prepended by their length.
+%% Ex. Key = {"pelle", 42} AND Type = {string, integer} =>
+%% OID [5, $p, $e, $l, $l, $e, 42]
+%% Key = {"pelle", 42} AND Type = {fix_string, integer} =>
+%% OID [$p, $e, $l, $l, $e, 42]
+%%-----------------------------------------------------------------
+key_to_oid(Tab, Key, [{key, Types}]) ->
+ MnesiaOid = {Tab, Key},
+ if
+ tuple(Key), tuple(Types) ->
+ case {size(Key), size(Types)} of
+ {Size, Size} ->
+ keys_to_oid(MnesiaOid, Size, Key, [], Types);
+ _ ->
+ exit({bad_snmp_key, MnesiaOid})
+ end;
+ true ->
+ key_to_oid_i(MnesiaOid, Key, Types)
+ end.
+
+key_to_oid_i(_MnesiaOid, Key, integer) when integer(Key) -> [Key];
+key_to_oid_i(_MnesiaOid, Key, fix_string) when list(Key) -> Key;
+key_to_oid_i(_MnesiaOid, Key, string) when list(Key) -> [length(Key) | Key];
+key_to_oid_i(MnesiaOid, Key, Type) ->
+ exit({bad_snmp_key, [MnesiaOid, Key, Type]}).
+
+keys_to_oid(_MnesiaOid, 0, _Key, Oid, _Types) -> Oid;
+keys_to_oid(MnesiaOid, N, Key, Oid, Types) ->
+ Type = element(N, Types),
+ KeyPart = element(N, Key),
+ Oid2 = key_to_oid_i(MnesiaOid, KeyPart, Type) ++ Oid,
+ keys_to_oid(MnesiaOid, N-1, Key, Oid2, Types).
+
+%%-----------------------------------------------------------------
+%% Func: get_row/2
+%% Args: Name is the name of the table (atom)
+%% RowIndex is an Oid
+%% Returns: {ok, Row} | undefined
+%% Note that the Row returned might contain columns that
+%% are not visible via SNMP. e.g. the first column may be
+%% ifIndex, and the last MFA ({ifIndex, col1, col2, MFA}).
+%% where ifIndex is used only as index (not as a real col),
+%% and MFA as extra info, used by the application.
+%%-----------------------------------------------------------------
+get_row(Name, RowIndex) ->
+ Tree = mnesia_lib:val({Name, {index, snmp}}),
+ case b_lookup(Tree, RowIndex) of
+ {ok, {_RowIndex, Key}} ->
+ [Row] = mnesia:dirty_read({Name, Key}),
+ {ok, Row};
+ _ ->
+ undefined
+ end.
+
+%%-----------------------------------------------------------------
+%% Func: get_next_index/2
+%% Args: Name is the name of the table (atom)
+%% RowIndex is an Oid
+%% Returns: {ok, NextIndex} | endOfTable
+%%-----------------------------------------------------------------
+get_next_index(Name, RowIndex) ->
+ Tree = mnesia_lib:val({Name, {index, snmp}}),
+ case b_lookup_next(Tree, RowIndex) of
+ {ok, {NextIndex, _Key}} ->
+ {ok, NextIndex};
+ _ ->
+ endOfTable
+ end.
+
+%%-----------------------------------------------------------------
+%% Func: get_mnesia_key/2
+%% Purpose: Get the mnesia key corresponding to the RowIndex.
+%% Args: Name is the name of the table (atom)
+%% RowIndex is an Oid
+%% Returns: {ok, Key} | undefiend
+%%-----------------------------------------------------------------
+get_mnesia_key(Name, RowIndex) ->
+ Tree = mnesia_lib:val({Name, {index, snmp}}),
+ case b_lookup(Tree, RowIndex) of
+ {ok, {_RowIndex, Key}} ->
+ {ok, Key};
+ _ ->
+ undefined
+ end.
+
+%%-----------------------------------------------------------------
+%% Encapsulate a bplus_tree in a process.
+%%-----------------------------------------------------------------
+
+b_new(MnesiaTab, Us) ->
+ case supervisor:start_child(mnesia_snmp_sup, [MnesiaTab, Us]) of
+ {ok, Tree} ->
+ Tree;
+ {error, Reason} ->
+ exit({badsnmp, MnesiaTab, Reason})
+ end.
+
+start(MnesiaTab, Us) ->
+ Name = {mnesia_snmp, MnesiaTab},
+ mnesia_monitor:start_proc(Name, ?MODULE, b_init, [self(), Us]).
+
+b_insert(Tree, Key, Val) -> Tree ! {insert, Key, Val}.
+b_delete(Tree, Key) -> Tree ! {delete, Key}.
+b_lookup(Tree, Key) ->
+ Tree ! {lookup, self(), Key},
+ receive
+ {bplus_res, Res} ->
+ Res
+ end.
+b_lookup_next(Tree, Key) ->
+ Tree ! {lookup_next, self(), Key},
+ receive
+ {bplus_res, Res} ->
+ Res
+ end.
+
+b_clear(Tree) ->
+ Tree ! clear,
+ ok.
+
+b_init(Parent, Us) ->
+ %% Do not trap exit
+ Tree = snmp_index:new(Us),
+ proc_lib:init_ack(Parent, {ok, self()}),
+ b_loop(Parent, Tree, Us).
+
+b_loop(Parent, Tree, Us) ->
+ receive
+ {insert, Key, Val} ->
+ NTree = snmp_index:insert(Tree, Key, Val),
+ b_loop(Parent, NTree, Us);
+ {delete, Key} ->
+ NTree = snmp_index:delete(Tree, Key),
+ b_loop(Parent, NTree, Us);
+ {lookup, From, Key} ->
+ Res = snmp_index:get(Tree, Key),
+ From ! {bplus_res, Res},
+ b_loop(Parent, Tree, Us);
+ {lookup_next, From, Key} ->
+ Res = snmp_index:get_next(Tree, Key),
+ From ! {bplus_res, Res},
+ b_loop(Parent, Tree, Us);
+ clear ->
+ catch snmp_index:delete(Tree), %% Catch because delete/1 is not
+ NewTree = snmp_index:new(Us), %% available in old snmp (before R5)
+ b_loop(Parent, NewTree, Us);
+
+ {'EXIT', Parent, Reason} ->
+ exit(Reason);
+
+ {system, From, Msg} ->
+ mnesia_lib:dbg_out("~p got {system, ~p, ~p}~n", [?MODULE, From, Msg]),
+ sys:handle_system_msg(Msg, From, Parent, ?MODULE, [], {Tree, Us})
+
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% System upgrade
+
+system_continue(Parent, _Debug, {Tree, Us}) ->
+ b_loop(Parent, Tree, Us).
+
+system_terminate(Reason, _Parent, _Debug, _Tree) ->
+ exit(Reason).
+
+system_code_change(State, _Module, _OldVsn, _Extra) ->
+ {ok, State}.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_snmp_sup.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_snmp_sup.erl
new file mode 100644
index 0000000000..227eec060f
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_snmp_sup.erl
@@ -0,0 +1,39 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_snmp_sup.erl,v 1.1 2008/12/17 09:53:39 mikpe Exp $
+%%
+-module(mnesia_snmp_sup).
+
+-behaviour(supervisor).
+
+-export([start/0, init/1]).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% top supervisor callback functions
+
+start() ->
+ supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% sub supervisor callback functions
+
+init([]) ->
+ Flags = {simple_one_for_one, 0, timer:hours(24)}, % Trust the top supervisor
+ MFA = {mnesia_snmp_hook, start, []},
+ Modules = [?MODULE, mnesia_snmp_hook, supervisor],
+ KillAfter = mnesia_kernel_sup:supervisor_timeout(timer:seconds(3)),
+ Workers = [{?MODULE, MFA, transient, KillAfter, worker, Modules}],
+ {ok, {Flags, Workers}}.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_sp.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_sp.erl
new file mode 100644
index 0000000000..bc52ad7f84
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_sp.erl
@@ -0,0 +1,35 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_sp.erl,v 1.1 2008/12/17 09:53:39 mikpe Exp $
+%%
+
+%% To able to generate nice crash reports we need a catch on the highest level.
+%% This code can't be purged so a code change is not possible.
+%% And hence this a simple module.
+
+-module(mnesia_sp).
+
+-export([init_proc/4]).
+
+init_proc(Who, Mod, Fun, Args) ->
+ mnesia_lib:verbose("~p starting: ~p~n", [Who, self()]),
+ case catch apply(Mod, Fun, Args) of
+ {'EXIT', Reason} ->
+ mnesia_monitor:terminate_proc(Who, Reason, Args),
+ exit(Reason);
+ Other ->
+ Other
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_subscr.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_subscr.erl
new file mode 100644
index 0000000000..dc66451206
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_subscr.erl
@@ -0,0 +1,491 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_subscr.erl,v 1.1 2008/12/17 09:53:39 mikpe Exp $
+%%
+-module(mnesia_subscr).
+
+-behaviour(gen_server).
+
+-export([start/0,
+ set_debug_level/1,
+ subscribe/2,
+ unsubscribe/2,
+ unsubscribe_table/1,
+ subscribers/0,
+ report_table_event/4,
+ report_table_event/5,
+ report_table_event/6
+ ]).
+
+%% gen_server callbacks
+-export([init/1,
+ handle_call/3,
+ handle_cast/2,
+ handle_info/2,
+ terminate/2,
+ code_change/3
+ ]).
+
+-include("mnesia.hrl").
+
+-import(mnesia_lib, [error/2]).
+-record(state, {supervisor, pid_tab}).
+
+start() ->
+ gen_server:start_link({local, ?MODULE}, ?MODULE, [self()],
+ [{timeout, infinity}]).
+
+set_debug_level(Level) ->
+ OldEnv = application:get_env(mnesia, debug),
+ case mnesia_monitor:patch_env(debug, Level) of
+ {error, Reason} ->
+ {error, Reason};
+ NewLevel ->
+ set_debug_level(NewLevel, OldEnv)
+ end.
+
+set_debug_level(Level, OldEnv) ->
+ case mnesia:system_info(is_running) of
+ no when OldEnv == undefined ->
+ none;
+ no ->
+ {ok, E} = OldEnv,
+ E;
+ _ ->
+ Old = mnesia_lib:val(debug),
+ Local = mnesia:system_info(local_tables),
+ E = whereis(mnesia_event),
+ Sub = fun(Tab) -> subscribe(E, {table, Tab}) end,
+ UnSub = fun(Tab) -> unsubscribe(E, {table, Tab}) end,
+
+ case Level of
+ none ->
+ lists:foreach(UnSub, Local);
+ verbose ->
+ lists:foreach(UnSub, Local);
+ debug ->
+ lists:foreach(UnSub, Local -- [schema]),
+ Sub(schema);
+ trace ->
+ lists:foreach(Sub, Local)
+ end,
+ mnesia_lib:set(debug, Level),
+ Old
+ end.
+
+subscribe(ClientPid, system) ->
+ change_subscr(activate, ClientPid, system);
+subscribe(ClientPid, {table, Tab}) ->
+ change_subscr(activate, ClientPid, {table, Tab, simple});
+subscribe(ClientPid, {table, Tab, simple}) ->
+ change_subscr(activate, ClientPid, {table, Tab, simple});
+subscribe(ClientPid, {table, Tab, detailed}) ->
+ change_subscr(activate, ClientPid, {table, Tab, detailed});
+subscribe(_ClientPid, What) ->
+ {error, {badarg, What}}.
+
+unsubscribe(ClientPid, system) ->
+ change_subscr(deactivate, ClientPid, system);
+unsubscribe(ClientPid, {table, Tab}) ->
+ change_subscr(deactivate, ClientPid, {table, Tab, simple});
+unsubscribe(ClientPid, {table, Tab, simple}) ->
+ change_subscr(deactivate, ClientPid, {table, Tab, simple});
+unsubscribe(ClientPid, {table, Tab, detailed}) ->
+ change_subscr(deactivate, ClientPid, {table, Tab, detailed});
+unsubscribe(_ClientPid, What) ->
+ {error, {badarg, What}}.
+
+unsubscribe_table(Tab) ->
+ call({change, {deactivate_table, Tab}}).
+
+change_subscr(Kind, ClientPid, What) ->
+ call({change, {Kind, ClientPid, What}}).
+
+subscribers() ->
+ [whereis(mnesia_event) | mnesia_lib:val(subscribers)].
+
+report_table_event(Tab, Tid, Obj, Op) ->
+ case ?catch_val({Tab, commit_work}) of
+ {'EXIT', _} -> ok;
+ Commit ->
+ case lists:keysearch(subscribers, 1, Commit) of
+ false -> ok;
+ {value, Subs} ->
+ report_table_event(Subs, Tab, Tid, Obj, Op, undefined)
+ end
+ end.
+
+%% Backwards compatible for the moment when mnesia_tm get's updated!
+report_table_event(Subscr, Tab, Tid, Obj, Op) ->
+ report_table_event(Subscr, Tab, Tid, Obj, Op, undefined).
+
+report_table_event({subscribers, S1, S2}, Tab, Tid, _Obj, clear_table, _Old) ->
+ What = {delete, {schema, Tab}, Tid},
+ deliver(S1, {mnesia_table_event, What}),
+ TabDef = mnesia_schema:cs2list(?catch_val({Tab, cstruct})),
+ What2 = {write, {schema, Tab, TabDef}, Tid},
+ deliver(S1, {mnesia_table_event, What2}),
+ What3 = {delete, schema, {schema, Tab}, [{schema, Tab, TabDef}], Tid},
+ deliver(S2, {mnesia_table_event, What3}),
+ What4 = {write, schema, {schema, Tab, TabDef}, [], Tid},
+ deliver(S2, {mnesia_table_event, What4});
+
+report_table_event({subscribers, Subscr, []}, Tab, Tid, Obj, Op, _Old) ->
+ What = {Op, patch_record(Tab, Obj), Tid},
+ deliver(Subscr, {mnesia_table_event, What});
+
+report_table_event({subscribers, S1, S2}, Tab, Tid, Obj, Op, Old) ->
+ Standard = {Op, patch_record(Tab, Obj), Tid},
+ deliver(S1, {mnesia_table_event, Standard}),
+ Extended = what(Tab, Tid, Obj, Op, Old),
+ deliver(S2, Extended);
+
+%% Backwards compatible for the moment when mnesia_tm get's updated!
+report_table_event({subscribers, Subscr}, Tab, Tid, Obj, Op, Old) ->
+ report_table_event({subscribers, Subscr, []}, Tab, Tid, Obj, Op, Old).
+
+
+patch_record(Tab, Obj) ->
+ case Tab == element(1, Obj) of
+ true ->
+ Obj;
+ false ->
+ setelement(1, Obj, Tab)
+ end.
+
+what(Tab, Tid, {RecName, Key}, delete, undefined) ->
+ case catch mnesia_lib:db_get(Tab, Key) of
+ Old when list(Old) -> %% Op only allowed for set table.
+ {mnesia_table_event, {delete, Tab, {RecName, Key}, Old, Tid}};
+ _ ->
+ %% Record just deleted by a dirty_op or
+ %% the whole table has been deleted
+ ignore
+ end;
+what(Tab, Tid, Obj, delete, Old) ->
+ {mnesia_table_event, {delete, Tab, Obj, Old, Tid}};
+what(Tab, Tid, Obj, delete_object, _Old) ->
+ {mnesia_table_event, {delete, Tab, Obj, [Obj], Tid}};
+what(Tab, Tid, Obj, write, undefined) ->
+ case catch mnesia_lib:db_get(Tab, element(2, Obj)) of
+ Old when list(Old) ->
+ {mnesia_table_event, {write, Tab, Obj, Old, Tid}};
+ {'EXIT', _} ->
+ ignore
+ end.
+
+deliver(_, ignore) ->
+ ok;
+deliver([Pid | Pids], Msg) ->
+ Pid ! Msg,
+ deliver(Pids, Msg);
+deliver([], _Msg) ->
+ ok.
+
+call(Msg) ->
+ Pid = whereis(?MODULE),
+ case Pid of
+ undefined ->
+ {error, {node_not_running, node()}};
+ Pid ->
+ Res = gen_server:call(Pid, Msg, infinity),
+ %% We get an exit signal if server dies
+ receive
+ {'EXIT', _Pid, _Reason} ->
+ {error, {node_not_running, node()}}
+ after 0 ->
+ ignore
+ end,
+ Res
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% Callback functions from gen_server
+
+%%----------------------------------------------------------------------
+%% Func: init/1
+%% Returns: {ok, State} |
+%% {ok, State, Timeout} |
+%% {stop, Reason}
+%%----------------------------------------------------------------------
+init([Parent]) ->
+ process_flag(trap_exit, true),
+ ClientPid = whereis(mnesia_event),
+ link(ClientPid),
+ mnesia_lib:verbose("~p starting: ~p~n", [?MODULE, self()]),
+ Tab = ?ets_new_table(mnesia_subscr, [duplicate_bag, private]),
+ ?ets_insert(Tab, {ClientPid, system}),
+ {ok, #state{supervisor = Parent, pid_tab = Tab}}.
+
+%%----------------------------------------------------------------------
+%% Func: handle_call/3
+%% Returns: {reply, Reply, State} |
+%% {reply, Reply, State, Timeout} |
+%% {noreply, State} |
+%% {noreply, State, Timeout} |
+%% {stop, Reason, Reply, State} | (terminate/2 is called)
+%%----------------------------------------------------------------------
+handle_call({change, How}, _From, State) ->
+ Reply = do_change(How, State#state.pid_tab),
+ {reply, Reply, State};
+
+handle_call(Msg, _From, State) ->
+ error("~p got unexpected call: ~p~n", [?MODULE, Msg]),
+ {noreply, State}.
+
+%%----------------------------------------------------------------------
+%% Func: handle_cast/2
+%% Returns: {noreply, State} |
+%% {noreply, State, Timeout} |
+%% {stop, Reason, State} (terminate/2 is called)
+%%----------------------------------------------------------------------
+handle_cast(Msg, State) ->
+ error("~p got unexpected cast: ~p~n", [?MODULE, Msg]),
+ {noreply, State}.
+
+%%----------------------------------------------------------------------
+%% Func: handle_info/2
+%% Returns: {noreply, State} |
+%% {noreply, State, Timeout} |
+%% {stop, Reason, State} (terminate/2 is called)
+%%----------------------------------------------------------------------
+
+handle_info({'EXIT', Pid, _R}, State) when Pid == State#state.supervisor ->
+ {stop, shutdown, State};
+
+handle_info({'EXIT', Pid, _Reason}, State) ->
+ handle_exit(Pid, State#state.pid_tab),
+ {noreply, State};
+
+handle_info(Msg, State) ->
+ error("~p got unexpected info: ~p~n", [?MODULE, Msg]),
+ {noreply, State}.
+
+%%----------------------------------------------------------------------
+%% Func: terminate/2
+%% Purpose: Shutdown the server
+%% Returns: any (ignored by gen_server)
+%%----------------------------------------------------------------------
+terminate(Reason, State) ->
+ prepare_stop(State#state.pid_tab),
+ mnesia_monitor:terminate_proc(?MODULE, Reason, State).
+
+%%----------------------------------------------------------------------
+%% Func: code_change/3
+%% Purpose: Upgrade process when its code is to be changed
+%% Returns: {ok, NewState}
+%%----------------------------------------------------------------------
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
+
+%%%----------------------------------------------------------------------
+%%% Internal functions
+%%%----------------------------------------------------------------------
+
+do_change({activate, ClientPid, system}, SubscrTab) when pid(ClientPid) ->
+ Var = subscribers,
+ activate(ClientPid, system, Var, subscribers(), SubscrTab);
+do_change({activate, ClientPid, {table, Tab, How}}, SubscrTab) when pid(ClientPid) ->
+ case ?catch_val({Tab, where_to_read}) of
+ Node when Node == node() ->
+ Var = {Tab, commit_work},
+ activate(ClientPid, {table, Tab, How}, Var, mnesia_lib:val(Var), SubscrTab);
+ {'EXIT', _} ->
+ {error, {no_exists, Tab}};
+ _Node ->
+ {error, {not_active_local, Tab}}
+ end;
+do_change({deactivate, ClientPid, system}, SubscrTab) ->
+ Var = subscribers,
+ deactivate(ClientPid, system, Var, SubscrTab);
+do_change({deactivate, ClientPid, {table, Tab, How}}, SubscrTab) ->
+ Var = {Tab, commit_work},
+ deactivate(ClientPid, {table, Tab, How}, Var, SubscrTab);
+do_change({deactivate_table, Tab}, SubscrTab) ->
+ Var = {Tab, commit_work},
+ case ?catch_val(Var) of
+ {'EXIT', _} ->
+ {error, {no_exists, Tab}};
+ CommitWork ->
+ case lists:keysearch(subscribers, 1, CommitWork) of
+ false ->
+ ok;
+ {value, Subs} ->
+ Simple = {table, Tab, simple},
+ Detailed = {table, Tab, detailed},
+ Fs = fun(C) -> deactivate(C, Simple, Var, SubscrTab) end,
+ Fd = fun(C) -> deactivate(C, Detailed, Var, SubscrTab) end,
+ case Subs of
+ {subscribers, L1, L2} ->
+ lists:foreach(Fs, L1),
+ lists:foreach(Fd, L2);
+ {subscribers, L1} ->
+ lists:foreach(Fs, L1)
+ end
+ end,
+ {ok, node()}
+ end;
+do_change(_, _) ->
+ {error, badarg}.
+
+activate(ClientPid, What, Var, OldSubscribers, SubscrTab) ->
+ Old =
+ if Var == subscribers ->
+ OldSubscribers;
+ true ->
+ case lists:keysearch(subscribers, 1, OldSubscribers) of
+ false -> [];
+ {value, Subs} ->
+ case Subs of
+ {subscribers, L1, L2} ->
+ L1 ++ L2;
+ {subscribers, L1} ->
+ L1
+ end
+ end
+ end,
+ case lists:member(ClientPid, Old) of
+ false ->
+ %% Don't care about checking old links
+ case catch link(ClientPid) of
+ true ->
+ ?ets_insert(SubscrTab, {ClientPid, What}),
+ add_subscr(Var, What, ClientPid),
+ {ok, node()};
+ {'EXIT', _Reason} ->
+ {error, {no_exists, ClientPid}}
+ end;
+ true ->
+ {error, {already_exists, What}}
+ end.
+
+%%-record(subscribers, {pids = []}). Old subscriber record removed
+%% To solve backward compatibility, this code is a cludge..
+add_subscr(subscribers, _What, Pid) ->
+ mnesia_lib:add(subscribers, Pid),
+ {ok, node()};
+add_subscr({Tab, commit_work}, What, Pid) ->
+ Commit = mnesia_lib:val({Tab, commit_work}),
+ case lists:keysearch(subscribers, 1, Commit) of
+ false ->
+ Subscr =
+ case What of
+ {table, _, simple} ->
+ {subscribers, [Pid], []};
+ {table, _, detailed} ->
+ {subscribers, [], [Pid]}
+ end,
+ mnesia_lib:add({Tab, subscribers}, Pid),
+ mnesia_lib:set({Tab, commit_work},
+ mnesia_lib:sort_commit([Subscr | Commit]));
+ {value, Old} ->
+ {L1, L2} =
+ case Old of
+ {subscribers, L} -> %% Old Way
+ {L, []};
+ {subscribers, SL1, SL2} ->
+ {SL1, SL2}
+ end,
+ Subscr =
+ case What of
+ {table, _, simple} ->
+ {subscribers, [Pid | L1], L2};
+ {table, _, detailed} ->
+ {subscribers, L1, [Pid | L2]}
+ end,
+ NewC = lists:keyreplace(subscribers, 1, Commit, Subscr),
+ mnesia_lib:set({Tab, commit_work},
+ mnesia_lib:sort_commit(NewC)),
+ mnesia_lib:add({Tab, subscribers}, Pid)
+ end.
+
+deactivate(ClientPid, What, Var, SubscrTab) ->
+ ?ets_match_delete(SubscrTab, {ClientPid, What}),
+ case catch ?ets_lookup_element(SubscrTab, ClientPid, 1) of
+ List when list(List) ->
+ ignore;
+ {'EXIT', _} ->
+ unlink(ClientPid)
+ end,
+ del_subscr(Var, What, ClientPid),
+ {ok, node()}.
+
+del_subscr(subscribers, _What, Pid) ->
+ mnesia_lib:del(subscribers, Pid);
+del_subscr({Tab, commit_work}, What, Pid) ->
+ Commit = mnesia_lib:val({Tab, commit_work}),
+ case lists:keysearch(subscribers, 1, Commit) of
+ false ->
+ false;
+ {value, Old} ->
+ {L1, L2} =
+ case Old of
+ {subscribers, L} -> %% Old Way
+ {L, []};
+ {subscribers, SL1, SL2} ->
+ {SL1, SL2}
+ end,
+ Subscr =
+ case What of %% Ignore user error delete subscr from any list
+ {table, _, simple} ->
+ NewL1 = lists:delete(Pid, L1),
+ NewL2 = lists:delete(Pid, L2),
+ {subscribers, NewL1, NewL2};
+ {table, _, detailed} ->
+ NewL1 = lists:delete(Pid, L1),
+ NewL2 = lists:delete(Pid, L2),
+ {subscribers, NewL1, NewL2}
+ end,
+ case Subscr of
+ {subscribers, [], []} ->
+ NewC = lists:keydelete(subscribers, 1, Commit),
+ mnesia_lib:del({Tab, subscribers}, Pid),
+ mnesia_lib:set({Tab, commit_work},
+ mnesia_lib:sort_commit(NewC));
+ _ ->
+ NewC = lists:keyreplace(subscribers, 1, Commit, Subscr),
+ mnesia_lib:del({Tab, subscribers}, Pid),
+ mnesia_lib:set({Tab, commit_work},
+ mnesia_lib:sort_commit(NewC))
+ end
+ end.
+
+handle_exit(ClientPid, SubscrTab) ->
+ do_handle_exit(?ets_lookup(SubscrTab, ClientPid)),
+ ?ets_delete(SubscrTab, ClientPid).
+
+do_handle_exit([{ClientPid, What} | Tail]) ->
+ case What of
+ system ->
+ del_subscr(subscribers, What, ClientPid);
+ {_, Tab, _Level} ->
+ del_subscr({Tab, commit_work}, What, ClientPid)
+ end,
+ do_handle_exit(Tail);
+do_handle_exit([]) ->
+ ok.
+
+prepare_stop(SubscrTab) ->
+ mnesia_lib:report_system_event({mnesia_down, node()}),
+ do_prepare_stop(?ets_first(SubscrTab), SubscrTab).
+
+do_prepare_stop('$end_of_table', _SubscrTab) ->
+ ok;
+do_prepare_stop(ClientPid, SubscrTab) ->
+ Next = ?ets_next(SubscrTab, ClientPid),
+ handle_exit(ClientPid, SubscrTab),
+ unlink(ClientPid),
+ do_prepare_stop(Next, SubscrTab).
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_sup.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_sup.erl
new file mode 100644
index 0000000000..78609ffdde
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_sup.erl
@@ -0,0 +1,136 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_sup.erl,v 1.1 2008/12/17 09:53:39 mikpe Exp $
+%%
+%% Supervisor for the entire Mnesia application
+
+-module(mnesia_sup).
+
+-behaviour(application).
+-behaviour(supervisor).
+
+-export([start/0, start/2, init/1, stop/1, start_event/0, kill/0]).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% application and suprvisor callback functions
+
+start(normal, Args) ->
+ SupName = {local,?MODULE},
+ case supervisor:start_link(SupName, ?MODULE, [Args]) of
+ {ok, Pid} ->
+ {ok, Pid, {normal, Args}};
+ Error ->
+ Error
+ end;
+start(_, _) ->
+ {error, badarg}.
+
+start() ->
+ SupName = {local,?MODULE},
+ supervisor:start_link(SupName, ?MODULE, []).
+
+stop(_StartArgs) ->
+ ok.
+
+init([]) -> % Supervisor
+ init();
+init([[]]) -> % Application
+ init();
+init(BadArg) ->
+ {error, {badarg, BadArg}}.
+
+init() ->
+ Flags = {one_for_all, 0, 3600}, % Should be rest_for_one policy
+
+ Event = event_procs(),
+ Kernel = kernel_procs(),
+ Mnemosyne = mnemosyne_procs(),
+
+ {ok, {Flags, Event ++ Kernel ++ Mnemosyne}}.
+
+event_procs() ->
+ KillAfter = timer:seconds(30),
+ KA = mnesia_kernel_sup:supervisor_timeout(KillAfter),
+ E = mnesia_event,
+ [{E, {?MODULE, start_event, []}, permanent, KA, worker, [E, gen_event]}].
+
+kernel_procs() ->
+ K = mnesia_kernel_sup,
+ KA = infinity,
+ [{K, {K, start, []}, permanent, KA, supervisor, [K, supervisor]}].
+
+mnemosyne_procs() ->
+ case mnesia_monitor:get_env(embedded_mnemosyne) of
+ true ->
+ Q = mnemosyne_sup,
+ KA = infinity,
+ [{Q, {Q, start, []}, permanent, KA, supervisor, [Q, supervisor]}];
+ false ->
+ []
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% event handler
+
+start_event() ->
+ case gen_event:start_link({local, mnesia_event}) of
+ {ok, Pid} ->
+ case add_event_handler() of
+ ok ->
+ {ok, Pid};
+ Error ->
+ Error
+ end;
+ Error ->
+ Error
+ end.
+
+add_event_handler() ->
+ Handler = mnesia_monitor:get_env(event_module),
+ gen_event:add_handler(mnesia_event, Handler, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% debug functions
+
+kill() ->
+ Mnesia = [mnesia_fallback | mnesia:ms()],
+ Mnemosyne = mnemosyne_ms(),
+ Kill = fun(Name) -> catch exit(whereis(Name), kill) end,
+ lists:foreach(Kill, Mnemosyne),
+ lists:foreach(Kill, Mnesia),
+ lists:foreach(fun ensure_dead/1, Mnemosyne),
+ lists:foreach(fun ensure_dead/1, Mnesia),
+ timer:sleep(10),
+ case lists:keymember(mnesia, 1, application:which_applications()) of
+ true -> kill();
+ false -> ok
+ end.
+
+ensure_dead(Name) ->
+ case whereis(Name) of
+ undefined ->
+ ok;
+ Pid when pid(Pid) ->
+ exit(Pid, kill),
+ timer:sleep(10),
+ ensure_dead(Name)
+ end.
+
+mnemosyne_ms() ->
+ case mnesia_monitor:get_env(embedded_mnemosyne) of
+ true -> mnemosyne:ms();
+ false -> []
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_text.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_text.erl
new file mode 100644
index 0000000000..d74f3bf07b
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_text.erl
@@ -0,0 +1,189 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_text.erl,v 1.2 2010/03/04 13:54:20 maria Exp $
+%%
+-module(mnesia_text).
+
+-export([parse/1, file/1, load_textfile/1, dump_to_textfile/1]).
+
+load_textfile(File) ->
+ ensure_started(),
+ case parse(File) of
+ {ok, {Tabs, Data}} ->
+ Badtabs = make_tabs(lists:map(fun validate_tab/1, Tabs)),
+ load_data(del_data(Badtabs, Data, []));
+ Other ->
+ Other
+ end.
+
+dump_to_textfile(File) ->
+ dump_to_textfile(mnesia_lib:is_running(), file:open(File, [write])).
+dump_to_textfile(yes, {ok, F}) ->
+ Tabs = lists:delete(schema, mnesia_lib:local_active_tables()),
+ Defs = lists:map(fun(T) -> {T, [{record_name, mnesia_lib:val({T, record_name})},
+ {attributes, mnesia_lib:val({T, attributes})}]}
+ end,
+ Tabs),
+ io:format(F, "~p.~n", [{tables, Defs}]),
+ lists:foreach(fun(T) -> dump_tab(F, T) end, Tabs),
+ file:close(F);
+dump_to_textfile(_,_) -> error.
+
+
+dump_tab(F, T) ->
+ W = mnesia_lib:val({T, wild_pattern}),
+ {'atomic',All} = mnesia:transaction(fun() -> mnesia:match_object(T, W, read) end),
+ lists:foreach(fun(Term) -> io:format(F,"~p.~n", [setelement(1, Term, T)]) end, All).
+
+
+ensure_started() ->
+ case mnesia_lib:is_running() of
+ yes ->
+ yes;
+ no ->
+ case mnesia_lib:exists(mnesia_lib:dir("schema.DAT")) of
+ true ->
+ mnesia:start();
+ false ->
+ mnesia:create_schema([node()]),
+ mnesia:start()
+ end
+ end.
+
+del_data(Bad, [H|T], Ack) ->
+ case lists:member(element(1, H), Bad) of
+ true -> del_data(Bad, T, Ack);
+ false -> del_data(Bad, T, [H|Ack])
+ end;
+del_data(_Bad, [], Ack) ->
+ lists:reverse(Ack).
+
+%% Tis the place to call the validate func in mnesia_schema
+validate_tab({Tabname, List}) ->
+ {Tabname, List};
+validate_tab({Tabname, RecName, List}) ->
+ {Tabname, RecName, List};
+validate_tab(_) -> error(badtab).
+
+make_tabs([{Tab, Def} | Tail]) ->
+ case catch mnesia:table_info(Tab, where_to_read) of
+ {'EXIT', _} -> %% non-existing table
+ case mnesia:create_table(Tab, Def) of
+ {aborted, Reason} ->
+ io:format("** Failed to create table ~w ~n"
+ "** Reason = ~w, Args = ~p~n",
+ [Tab, Reason, Def]),
+ [Tab | make_tabs(Tail)];
+ _ ->
+ io:format("New table ~w~n", [Tab]),
+ make_tabs(Tail)
+ end;
+ Node ->
+ io:format("** Table ~w already exists on ~p, just entering data~n",
+ [Tab, Node]),
+ make_tabs(Tail)
+ end;
+
+make_tabs([]) ->
+ [].
+
+load_data(L) ->
+ mnesia:transaction(fun() ->
+ F = fun(X) ->
+ Tab = element(1, X),
+ RN = mnesia:table_info(Tab, record_name),
+ Rec = setelement(1, X, RN),
+ mnesia:write(Tab, Rec, write) end,
+ lists:foreach(F, L)
+ end).
+
+parse(File) ->
+ case file(File) of
+ {ok, Terms} ->
+ case catch collect(Terms) of
+ {error, X} ->
+ {error, X};
+ Other ->
+ {ok, Other}
+ end;
+ Other ->
+ Other
+ end.
+
+collect([{_, {tables, Tabs}}|L]) ->
+ {Tabs, collect_data(Tabs, L)};
+
+collect(_) ->
+ io:format("No tables found\n", []),
+ error(bad_header).
+
+collect_data(Tabs, [{Line, Term} | Tail]) when tuple(Term) ->
+ case lists:keysearch(element(1, Term), 1, Tabs) of
+ {value, _} ->
+ [Term | collect_data(Tabs, Tail)];
+ _Other ->
+ io:format("Object:~p at line ~w unknown\n", [Term,Line]),
+ error(undefined_object)
+ end;
+collect_data(_Tabs, []) -> [];
+collect_data(_Tabs, [H|_T]) ->
+ io:format("Object:~p unknown\n", [H]),
+ error(undefined_object).
+
+error(What) -> throw({error, What}).
+
+file(File) ->
+ case file:open(File, [read]) of
+ {ok, Stream} ->
+ Res = read_terms(Stream, File, 1, []),
+ file:close(Stream),
+ Res;
+ _Other ->
+ {error, open}
+ end.
+
+read_terms(Stream, File, Line, L) ->
+ case read_term_from_stream(Stream, File, Line) of
+ {ok, Term, NextLine} ->
+ read_terms(Stream, File, NextLine, [Term|L]);
+ error ->
+ {error, read};
+ eof ->
+ {ok, lists:reverse(L)}
+ end.
+
+read_term_from_stream(Stream, File, Line) ->
+ R = io:request(Stream, {get_until,'',erl_scan,tokens,[Line]}),
+ case R of
+ {ok,Toks,EndLine} ->
+ case erl_parse:parse_term(Toks) of
+ {ok, Term} ->
+ {ok, {Line, Term}, EndLine};
+ {error, {NewLine,Mod,What}} ->
+ Str = Mod:format_error(What),
+ io:format("Error in line:~p of:~p ~s\n",
+ [NewLine, File, Str]),
+ error;
+ T ->
+ io:format("Error2 **~p~n",[T]),
+ error
+ end;
+ {eof,_EndLine} ->
+ eof;
+ Other ->
+ io:format("Error1 **~p~n",[Other]),
+ error
+ end.
diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_tm.erl b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_tm.erl
new file mode 100644
index 0000000000..ac11087fa0
--- /dev/null
+++ b/lib/dialyzer/test/r9c_SUITE_data/src/mnesia/mnesia_tm.erl
@@ -0,0 +1,2173 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: mnesia_tm.erl,v 1.2 2010/03/04 13:54:20 maria Exp $
+%%
+-module(mnesia_tm).
+
+-export([
+ start/0,
+ init/1,
+ non_transaction/5,
+ transaction/6,
+ commit_participant/5,
+ dirty/2,
+ display_info/2,
+ do_update_op/3,
+ get_info/1,
+ get_transactions/0,
+ info/1,
+ mnesia_down/1,
+ prepare_checkpoint/2,
+ prepare_checkpoint/1, % Internal
+ prepare_snmp/3,
+ do_snmp/2,
+ put_activity_id/1,
+ block_tab/1,
+ unblock_tab/1
+ ]).
+
+%% sys callback functions
+-export([system_continue/3,
+ system_terminate/4,
+ system_code_change/4
+ ]).
+
+-include("mnesia.hrl").
+-import(mnesia_lib, [set/2]).
+-import(mnesia_lib, [fatal/2, verbose/2, dbg_out/2]).
+
+-record(state, {coordinators = [], participants = [], supervisor,
+ blocked_tabs = [], dirty_queue = []}).
+%% Format on coordinators is [{Tid, EtsTabList} .....
+
+-record(prep, {protocol = sym_trans,
+ %% async_dirty | sync_dirty | sym_trans | sync_sym_trans | asym_trans
+ records = [],
+ prev_tab = [], % initiate to a non valid table name
+ prev_types,
+ prev_snmp,
+ types
+ }).
+
+-record(participant, {tid, pid, commit, disc_nodes = [],
+ ram_nodes = [], protocol = sym_trans}).
+
+start() ->
+ mnesia_monitor:start_proc(?MODULE, ?MODULE, init, [self()]).
+
+init(Parent) ->
+ register(?MODULE, self()),
+ process_flag(trap_exit, true),
+
+ %% Initialize the schema
+ IgnoreFallback = mnesia_monitor:get_env(ignore_fallback_at_startup),
+ mnesia_bup:tm_fallback_start(IgnoreFallback),
+ mnesia_schema:init(IgnoreFallback),
+
+ %% Handshake and initialize transaction recovery
+ mnesia_recover:init(),
+ Early = mnesia_monitor:init(),
+ AllOthers = mnesia_lib:uniq(Early ++ mnesia_lib:all_nodes()) -- [node()],
+ set(original_nodes, AllOthers),
+ mnesia_recover:connect_nodes(AllOthers),
+
+ %% Recover transactions, may wait for decision
+ case mnesia_monitor:use_dir() of
+ true ->
+ P = mnesia_dumper:opt_dump_log(startup), % previous log
+ L = mnesia_dumper:opt_dump_log(startup), % latest log
+ Msg = "Initial dump of log during startup: ~p~n",
+ mnesia_lib:verbose(Msg, [[P, L]]),
+ mnesia_log:init();
+ false ->
+ ignore
+ end,
+
+ mnesia_schema:purge_tmp_files(),
+ mnesia_recover:start_garb(),
+
+ ?eval_debug_fun({?MODULE, init}, [{nodes, AllOthers}]),
+
+ case val(debug) of
+ Debug when Debug /= debug, Debug /= trace ->
+ ignore;
+ _ ->
+ mnesia_subscr:subscribe(whereis(mnesia_event), {table, schema})
+ end,
+ proc_lib:init_ack(Parent, {ok, self()}),
+ doit_loop(#state{supervisor = Parent}).
+
+val(Var) ->
+ case ?catch_val(Var) of
+ {'EXIT', _ReASoN_} -> mnesia_lib:other_val(Var, _ReASoN_);
+ _VaLuE_ -> _VaLuE_
+ end.
+
+reply({From,Ref}, R) ->
+ From ! {?MODULE, Ref, R};
+reply(From, R) ->
+ From ! {?MODULE, node(), R}.
+
+reply(From, R, State) ->
+ reply(From, R),
+ doit_loop(State).
+
+req(R) ->
+ case whereis(?MODULE) of
+ undefined ->
+ {error, {node_not_running, node()}};
+ Pid ->
+ Ref = make_ref(),
+ Pid ! {{self(), Ref}, R},
+ rec(Pid, Ref)
+ end.
+
+rec() ->
+ rec(whereis(?MODULE)).
+
+rec(Pid) when pid(Pid) ->
+ receive
+ {?MODULE, _, Reply} ->
+ Reply;
+
+ {'EXIT', Pid, _} ->
+ {error, {node_not_running, node()}}
+ end;
+rec(undefined) ->
+ {error, {node_not_running, node()}}.
+
+rec(Pid, Ref) ->
+ receive
+ {?MODULE, Ref, Reply} ->
+ Reply;
+ {'EXIT', Pid, _} ->
+ {error, {node_not_running, node()}}
+ end.
+
+tmlink({From, Ref}) when reference(Ref) ->
+ link(From);
+tmlink(From) ->
+ link(From).
+tmpid({Pid, _Ref}) when pid(Pid) ->
+ Pid;
+tmpid(Pid) ->
+ Pid.
+
+%% Returns a list of participant transaction Tid's
+mnesia_down(Node) ->
+ %% Syncronously call needed in order to avoid
+ %% race with mnesia_tm's coordinator processes
+ %% that may restart and acquire new locks.
+ %% mnesia_monitor takes care of the sync
+ case whereis(?MODULE) of
+ undefined ->
+ mnesia_monitor:mnesia_down(?MODULE, {Node, []});
+ Pid ->
+ Pid ! {mnesia_down, Node}
+ end.
+
+prepare_checkpoint(Nodes, Cp) ->
+ rpc:multicall(Nodes, ?MODULE, prepare_checkpoint, [Cp]).
+
+prepare_checkpoint(Cp) ->
+ req({prepare_checkpoint,Cp}).
+
+block_tab(Tab) ->
+ req({block_tab, Tab}).
+
+unblock_tab(Tab) ->
+ req({unblock_tab, Tab}).
+
+doit_loop(#state{coordinators = Coordinators, participants = Participants, supervisor = Sup}
+ = State) ->
+ receive
+ {_From, {async_dirty, Tid, Commit, Tab}} ->
+ case lists:member(Tab, State#state.blocked_tabs) of
+ false ->
+ do_async_dirty(Tid, Commit, Tab),
+ doit_loop(State);
+ true ->
+ Item = {async_dirty, Tid, Commit, Tab},
+ State2 = State#state{dirty_queue = [Item | State#state.dirty_queue]},
+ doit_loop(State2)
+ end;
+
+ {From, {sync_dirty, Tid, Commit, Tab}} ->
+ case lists:member(Tab, State#state.blocked_tabs) of
+ false ->
+ do_sync_dirty(From, Tid, Commit, Tab),
+ doit_loop(State);
+ true ->
+ Item = {sync_dirty, From, Tid, Commit, Tab},
+ State2 = State#state{dirty_queue = [Item | State#state.dirty_queue]},
+ doit_loop(State2)
+ end;
+
+ {From, start_outer} -> %% Create and associate ets_tab with Tid
+ case catch ?ets_new_table(mnesia_trans_store, [bag, public]) of
+ {'EXIT', Reason} -> %% system limit
+ Msg = "Cannot create an ets table for the "
+ "local transaction store",
+ reply(From, {error, {system_limit, Msg, Reason}}, State);
+ Etab ->
+ tmlink(From),
+ C = mnesia_recover:incr_trans_tid_serial(),
+ ?ets_insert(Etab, {nodes, node()}),
+ Tid = #tid{pid = tmpid(From), counter = C},
+ A2 = [{Tid , [Etab]} | Coordinators],
+ S2 = State#state{coordinators = A2},
+ reply(From, {new_tid, Tid, Etab}, S2)
+ end;
+
+ {From, {ask_commit, Protocol, Tid, Commit, DiscNs, RamNs}} ->
+ ?eval_debug_fun({?MODULE, doit_ask_commit},
+ [{tid, Tid}, {prot, Protocol}]),
+ mnesia_checkpoint:tm_enter_pending(Tid, DiscNs, RamNs),
+ Pid =
+ case Protocol of
+ asym_trans when node(Tid#tid.pid) /= node() ->
+ Args = [tmpid(From), Tid, Commit, DiscNs, RamNs],
+ spawn_link(?MODULE, commit_participant, Args);
+ _ when node(Tid#tid.pid) /= node() -> %% *_sym_trans
+ reply(From, {vote_yes, Tid}),
+ nopid
+ end,
+ P = #participant{tid = Tid,
+ pid = Pid,
+ commit = Commit,
+ disc_nodes = DiscNs,
+ ram_nodes = RamNs,
+ protocol = Protocol},
+ State2 = State#state{participants = [P | Participants]},
+ doit_loop(State2);
+
+ {Tid, do_commit} ->
+ case mnesia_lib:key_search_delete(Tid, #participant.tid, Participants) of
+ {none, _} ->
+ verbose("Tried to commit a non participant transaction ~p~n",
+ [Tid]),
+ doit_loop(State);
+ {P, Participants2} ->
+ ?eval_debug_fun({?MODULE, do_commit, pre},
+ [{tid, Tid}, {participant, P}]),
+ case P#participant.pid of
+ nopid ->
+ Commit = P#participant.commit,
+ Member = lists:member(node(), P#participant.disc_nodes),
+ if Member == false ->
+ ignore;
+ P#participant.protocol == sym_trans ->
+ mnesia_log:log(Commit);
+ P#participant.protocol == sync_sym_trans ->
+ mnesia_log:slog(Commit)
+ end,
+ mnesia_recover:note_decision(Tid, committed),
+ do_commit(Tid, Commit),
+ if
+ P#participant.protocol == sync_sym_trans ->
+ Tid#tid.pid ! {?MODULE, node(), {committed, Tid}};
+ true ->
+ ignore
+ end,
+ mnesia_locker:release_tid(Tid),
+ transaction_terminated(Tid),
+ ?eval_debug_fun({?MODULE, do_commit, post}, [{tid, Tid}, {pid, nopid}]),
+ doit_loop(State#state{participants = Participants2});
+ Pid when pid(Pid) ->
+ Pid ! {Tid, committed},
+ ?eval_debug_fun({?MODULE, do_commit, post}, [{tid, Tid}, {pid, Pid}]),
+ doit_loop(State)
+ end
+ end;
+
+ {Tid, simple_commit} ->
+ mnesia_recover:note_decision(Tid, committed),
+ mnesia_locker:release_tid(Tid),
+ transaction_terminated(Tid),
+ doit_loop(State);
+
+ {Tid, {do_abort, Reason}} ->
+ ?eval_debug_fun({?MODULE, do_abort, pre}, [{tid, Tid}]),
+ mnesia_locker:release_tid(Tid),
+ case mnesia_lib:key_search_delete(Tid, #participant.tid, Participants) of
+ {none, _} ->
+ verbose("Tried to abort a non participant transaction ~p: ~p~n",
+ [Tid, Reason]),
+ doit_loop(State);
+ {P, Participants2} ->
+ case P#participant.pid of
+ nopid ->
+ Commit = P#participant.commit,
+ mnesia_recover:note_decision(Tid, aborted),
+ do_abort(Tid, Commit),
+ if
+ P#participant.protocol == sync_sym_trans ->
+ Tid#tid.pid ! {?MODULE, node(), {aborted, Tid}};
+ true ->
+ ignore
+ end,
+ transaction_terminated(Tid),
+ ?eval_debug_fun({?MODULE, do_abort, post}, [{tid, Tid}, {pid, nopid}]),
+ doit_loop(State#state{participants = Participants2});
+ Pid when pid(Pid) ->
+ Pid ! {Tid, {do_abort, Reason}},
+ ?eval_debug_fun({?MODULE, do_abort, post},
+ [{tid, Tid}, {pid, Pid}]),
+ doit_loop(State)
+ end
+ end;
+
+ {From, {add_store, Tid}} -> %% new store for nested transaction
+ case catch ?ets_new_table(mnesia_trans_store, [bag, public]) of
+ {'EXIT', Reason} -> %% system limit
+ Msg = "Cannot create an ets table for a nested "
+ "local transaction store",
+ reply(From, {error, {system_limit, Msg, Reason}}, State);
+ Etab ->
+ A2 = add_coord_store(Coordinators, Tid, Etab),
+ reply(From, {new_store, Etab},
+ State#state{coordinators = A2})
+ end;
+
+ {From, {del_store, Tid, Current, Obsolete, PropagateStore}} ->
+ opt_propagate_store(Current, Obsolete, PropagateStore),
+ A2 = del_coord_store(Coordinators, Tid, Current, Obsolete),
+ reply(From, store_erased, State#state{coordinators = A2});
+
+ {'EXIT', Pid, Reason} ->
+ handle_exit(Pid, Reason, State);
+
+ {From, {restart, Tid, Store}} ->
+ A2 = restore_stores(Coordinators, Tid, Store),
+ ?ets_match_delete(Store, '_'),
+ ?ets_insert(Store, {nodes, node()}),
+ reply(From, {restarted, Tid}, State#state{coordinators = A2});
+
+ {delete_transaction, Tid} ->
+ %% used to clear transactions which are committed
+ %% in coordinator or participant processes
+ case mnesia_lib:key_search_delete(Tid, #participant.tid, Participants) of
+ {none, _} ->
+ case mnesia_lib:key_search_delete(Tid, 1, Coordinators) of
+ {none, _} ->
+ verbose("** ERROR ** Tried to delete a non transaction ~p~n",
+ [Tid]),
+ doit_loop(State);
+ {{_Tid, Etabs}, A2} ->
+ erase_ets_tabs(Etabs),
+ transaction_terminated(Tid),
+ doit_loop(State#state{coordinators = A2})
+ end;
+ {_P, Participants2} ->
+ transaction_terminated(Tid),
+ State2 = State#state{participants = Participants2},
+ doit_loop(State2)
+ end;
+
+ {sync_trans_serial, Tid} ->
+ %% Do the Lamport thing here
+ mnesia_recover:sync_trans_tid_serial(Tid),
+ doit_loop(State);
+
+ {From, info} ->
+ reply(From, {info, Participants, Coordinators}, State);
+
+ {mnesia_down, N} ->
+ verbose("Got mnesia_down from ~p, reconfiguring...~n", [N]),
+ reconfigure_coordinators(N, Coordinators),
+
+ Tids = [P#participant.tid || P <- Participants],
+ reconfigure_participants(N, Participants),
+ mnesia_monitor:mnesia_down(?MODULE, {N, Tids}),
+ doit_loop(State);
+
+ {From, {unblock_me, Tab}} ->
+ case lists:member(Tab, State#state.blocked_tabs) of
+ false ->
+ verbose("Wrong dirty Op blocked on ~p ~p ~p",
+ [node(), Tab, From]),
+ reply(From, unblocked),
+ doit_loop(State);
+ true ->
+ Item = {Tab, unblock_me, From},
+ State2 = State#state{dirty_queue = [Item | State#state.dirty_queue]},
+ doit_loop(State2)
+ end;
+
+ {From, {block_tab, Tab}} ->
+ State2 = State#state{blocked_tabs = [Tab | State#state.blocked_tabs]},
+ reply(From, ok, State2);
+
+ {From, {unblock_tab, Tab}} ->
+ BlockedTabs2 = State#state.blocked_tabs -- [Tab],
+ case lists:member(Tab, BlockedTabs2) of
+ false ->
+ mnesia_controller:unblock_table(Tab),
+ Queue = process_dirty_queue(Tab, State#state.dirty_queue),
+ State2 = State#state{blocked_tabs = BlockedTabs2,
+ dirty_queue = Queue},
+ reply(From, ok, State2);
+ true ->
+ State2 = State#state{blocked_tabs = BlockedTabs2},
+ reply(From, ok, State2)
+ end;
+
+ {From, {prepare_checkpoint, Cp}} ->
+ Res = mnesia_checkpoint:tm_prepare(Cp),
+ case Res of
+ {ok, _Name, IgnoreNew, _Node} ->
+ prepare_pending_coordinators(Coordinators, IgnoreNew),
+ prepare_pending_participants(Participants, IgnoreNew);
+ {error, _Reason} ->
+ ignore
+ end,
+ reply(From, Res, State);
+
+ {system, From, Msg} ->
+ dbg_out("~p got {system, ~p, ~p}~n", [?MODULE, From, Msg]),
+ sys:handle_system_msg(Msg, From, Sup, ?MODULE, [], State);
+
+ Msg ->
+ verbose("** ERROR ** ~p got unexpected message: ~p~n", [?MODULE, Msg]),
+ doit_loop(State)
+ end.
+
+do_sync_dirty(From, Tid, Commit, _Tab) ->
+ ?eval_debug_fun({?MODULE, sync_dirty, pre}, [{tid, Tid}]),
+ Res = (catch do_dirty(Tid, Commit)),
+ ?eval_debug_fun({?MODULE, sync_dirty, post}, [{tid, Tid}]),
+ From ! {?MODULE, node(), {dirty_res, Res}}.
+
+do_async_dirty(Tid, Commit, _Tab) ->
+ ?eval_debug_fun({?MODULE, async_dirty, pre}, [{tid, Tid}]),
+ catch do_dirty(Tid, Commit),
+ ?eval_debug_fun({?MODULE, async_dirty, post}, [{tid, Tid}]).
+
+%% Process items in fifo order
+process_dirty_queue(Tab, [Item | Queue]) ->
+ Queue2 = process_dirty_queue(Tab, Queue),
+ case Item of
+ {async_dirty, Tid, Commit, Tab} ->
+ do_async_dirty(Tid, Commit, Tab),
+ Queue2;
+ {sync_dirty, From, Tid, Commit, Tab} ->
+ do_sync_dirty(From, Tid, Commit, Tab),
+ Queue2;
+ {Tab, unblock_me, From} ->
+ reply(From, unblocked),
+ Queue2;
+ _ ->
+ [Item | Queue2]
+ end;
+process_dirty_queue(_Tab, []) ->
+ [].
+
+prepare_pending_coordinators([{Tid, [Store | _Etabs]} | Coords], IgnoreNew) ->
+ case catch ?ets_lookup(Store, pending) of
+ [] ->
+ prepare_pending_coordinators(Coords, IgnoreNew);
+ [Pending] ->
+ case lists:member(Tid, IgnoreNew) of
+ false ->
+ mnesia_checkpoint:tm_enter_pending(Pending);
+ true ->
+ ignore
+ end,
+ prepare_pending_coordinators(Coords, IgnoreNew);
+ {'EXIT', _} ->
+ prepare_pending_coordinators(Coords, IgnoreNew)
+ end;
+prepare_pending_coordinators([], _IgnoreNew) ->
+ ok.
+
+prepare_pending_participants([Part | Parts], IgnoreNew) ->
+ Tid = Part#participant.tid,
+ D = Part#participant.disc_nodes,
+ R = Part#participant.ram_nodes,
+ case lists:member(Tid, IgnoreNew) of
+ false ->
+ mnesia_checkpoint:tm_enter_pending(Tid, D, R);
+ true ->
+ ignore
+ end,
+ prepare_pending_participants(Parts, IgnoreNew);
+prepare_pending_participants([], _IgnoreNew) ->
+ ok.
+
+handle_exit(Pid, Reason, State) when node(Pid) /= node() ->
+ %% We got exit from a remote fool
+ dbg_out("~p got remote EXIT from unknown ~p~n",
+ [?MODULE, {Pid, Reason}]),
+ doit_loop(State);
+
+handle_exit(Pid, _Reason, State) when Pid == State#state.supervisor ->
+ %% Our supervisor has died, time to stop
+ do_stop(State);
+
+handle_exit(Pid, Reason, State) ->
+ %% Check if it is a coordinator
+ case pid_search_delete(Pid, State#state.coordinators) of
+ {none, _} ->
+ %% Check if it is a participant
+ case mnesia_lib:key_search_delete(Pid, #participant.pid, State#state.participants) of
+ {none, _} ->
+ %% We got exit from a local fool
+ verbose("** ERROR ** ~p got local EXIT from unknown process: ~p~n",
+ [?MODULE, {Pid, Reason}]),
+ doit_loop(State);
+
+ {P, RestP} when record(P, participant) ->
+ fatal("Participant ~p in transaction ~p died ~p~n",
+ [P#participant.pid, P#participant.tid, Reason]),
+ doit_loop(State#state{participants = RestP})
+ end;
+
+ {{Tid, Etabs}, RestC} ->
+ %% A local coordinator has died and
+ %% we must determine the outcome of the
+ %% transaction and tell mnesia_tm on the
+ %% other nodes about it and then recover
+ %% locally.
+ recover_coordinator(Tid, Etabs),
+ doit_loop(State#state{coordinators = RestC})
+ end.
+
+recover_coordinator(Tid, Etabs) ->
+ verbose("Coordinator ~p in transaction ~p died.~n", [Tid#tid.pid, Tid]),
+
+ Store = hd(Etabs),
+ CheckNodes = get_nodes(Store),
+ TellNodes = CheckNodes -- [node()],
+ case catch arrange(Tid, Store, async) of
+ {'EXIT', Reason} ->
+ dbg_out("Recovery of coordinator ~p failed:~n", [Tid, Reason]),
+ Protocol = asym_trans,
+ tell_outcome(Tid, Protocol, node(), CheckNodes, TellNodes);
+ {_N, Prep} ->
+ %% Tell the participants about the outcome
+ Protocol = Prep#prep.protocol,
+ Outcome = tell_outcome(Tid, Protocol, node(), CheckNodes, TellNodes),
+
+ %% Recover locally
+ CR = Prep#prep.records,
+ {DiscNs, RamNs} = commit_nodes(CR, [], []),
+ {value, Local} = lists:keysearch(node(), #commit.node, CR),
+
+ ?eval_debug_fun({?MODULE, recover_coordinator, pre},
+ [{tid, Tid}, {outcome, Outcome}, {prot, Protocol}]),
+ recover_coordinator(Tid, Protocol, Outcome, Local, DiscNs, RamNs),
+ ?eval_debug_fun({?MODULE, recover_coordinator, post},
+ [{tid, Tid}, {outcome, Outcome}, {prot, Protocol}])
+
+ end,
+ erase_ets_tabs(Etabs),
+ transaction_terminated(Tid),
+ mnesia_locker:release_tid(Tid).
+
+recover_coordinator(Tid, sym_trans, committed, Local, _, _) ->
+ mnesia_recover:note_decision(Tid, committed),
+ do_dirty(Tid, Local);
+recover_coordinator(Tid, sym_trans, aborted, _Local, _, _) ->
+ mnesia_recover:note_decision(Tid, aborted);
+recover_coordinator(Tid, sync_sym_trans, committed, Local, _, _) ->
+ mnesia_recover:note_decision(Tid, committed),
+ do_dirty(Tid, Local);
+recover_coordinator(Tid, sync_sym_trans, aborted, _Local, _, _) ->
+ mnesia_recover:note_decision(Tid, aborted);
+
+recover_coordinator(Tid, asym_trans, committed, Local, DiscNs, RamNs) ->
+ D = #decision{tid = Tid, outcome = committed,
+ disc_nodes = DiscNs, ram_nodes = RamNs},
+ mnesia_recover:log_decision(D),
+ do_commit(Tid, Local);
+recover_coordinator(Tid, asym_trans, aborted, Local, DiscNs, RamNs) ->
+ D = #decision{tid = Tid, outcome = aborted,
+ disc_nodes = DiscNs, ram_nodes = RamNs},
+ mnesia_recover:log_decision(D),
+ do_abort(Tid, Local).
+
+restore_stores([{Tid, Etstabs} | Tail], Tid, Store) ->
+ Remaining = lists:delete(Store, Etstabs),
+ erase_ets_tabs(Remaining),
+ [{Tid, [Store]} | Tail];
+restore_stores([H | T], Tid, Store) ->
+ [H | restore_stores(T, Tid, Store)].
+%% No NIL case on purpose
+
+add_coord_store([{Tid, Stores} | Coordinators], Tid, Etab) ->
+ [{Tid, [Etab | Stores]} | Coordinators];
+add_coord_store([H | T], Tid, Etab) ->
+ [H | add_coord_store(T, Tid, Etab)].
+%% no NIL case on purpose
+
+del_coord_store([{Tid, Stores} | Coordinators], Tid, Current, Obsolete) ->
+ Rest =
+ case Stores of
+ [Obsolete, Current | Tail] -> Tail;
+ [Current, Obsolete | Tail] -> Tail
+ end,
+ ?ets_delete_table(Obsolete),
+ [{Tid, [Current | Rest]} | Coordinators];
+del_coord_store([H | T], Tid, Current, Obsolete) ->
+ [H | del_coord_store(T, Tid, Current, Obsolete)].
+%% no NIL case on purpose
+
+erase_ets_tabs([H | T]) ->
+ ?ets_delete_table(H),
+ erase_ets_tabs(T);
+erase_ets_tabs([]) ->
+ ok.
+
+%% Deletes a pid from a list of participants
+%% or from a list of coordinators and returns
+%% {none, All} or {Tr, Rest}
+pid_search_delete(Pid, Trs) ->
+ pid_search_delete(Pid, Trs, none, []).
+pid_search_delete(Pid, [Tr = {Tid, _Ts} | Trs], _Val, Ack) when Tid#tid.pid == Pid ->
+ pid_search_delete(Pid, Trs, Tr, Ack);
+pid_search_delete(Pid, [Tr | Trs], Val, Ack) ->
+ pid_search_delete(Pid, Trs, Val, [Tr | Ack]);
+
+pid_search_delete(_Pid, [], Val, Ack) ->
+ {Val, Ack}.
+
+%% When TM gets an EXIT sig, we must also check to see
+%% if the crashing transaction is in the Participant list
+%%
+%% search_participant_for_pid([Participant | Tail], Pid) ->
+%% Tid = Participant#participant.tid,
+%% if
+%% Tid#tid.pid == Pid ->
+%% {coordinator, Participant};
+%% Participant#participant.pid == Pid ->
+%% {participant, Participant};
+%% true ->
+%% search_participant_for_pid(Tail, Pid)
+%% end;
+%% search_participant_for_pid([], _) ->
+%% fool.
+
+transaction_terminated(Tid) ->
+ mnesia_checkpoint:tm_exit_pending(Tid),
+ Pid = Tid#tid.pid,
+ if
+ node(Pid) == node() ->
+ unlink(Pid);
+ true -> %% Do the Lamport thing here
+ mnesia_recover:sync_trans_tid_serial(Tid)
+ end.
+
+non_transaction(OldState, Fun, Args, ActivityKind, Mod) ->
+ Id = {ActivityKind, self()},
+ NewState = {Mod, Id, non_transaction},
+ put(mnesia_activity_state, NewState),
+ %% I Want something uniqe here, references are expensive
+ Ref = mNeSia_nOn_TrAnSacTioN,
+ RefRes = (catch {Ref, apply(Fun, Args)}),
+ case OldState of
+ undefined -> erase(mnesia_activity_state);
+ _ -> put(mnesia_activity_state, OldState)
+ end,
+ case RefRes of
+ {Ref, Res} ->
+ case Res of
+ {'EXIT', Reason} -> exit(Reason);
+ {aborted, Reason} -> mnesia:abort(Reason);
+ _ -> Res
+ end;
+ {'EXIT', Reason} ->
+ exit(Reason);
+ Throw ->
+ throw(Throw)
+ end.
+
+transaction(OldTidTs, Fun, Args, Retries, Mod, Type) ->
+ Factor = 1,
+ case OldTidTs of
+ undefined -> % Outer
+ execute_outer(Mod, Fun, Args, Factor, Retries, Type);
+ {_OldMod, Tid, Ts} -> % Nested
+ execute_inner(Mod, Tid, Ts, Fun, Args, Factor, Retries, Type);
+ _ -> % Bad nesting
+ {aborted, nested_transaction}
+ end.
+
+execute_outer(Mod, Fun, Args, Factor, Retries, Type) ->
+ case req(start_outer) of
+ {error, Reason} ->
+ {aborted, Reason};
+ {new_tid, Tid, Store} ->
+ Ts = #tidstore{store = Store},
+ NewTidTs = {Mod, Tid, Ts},
+ put(mnesia_activity_state, NewTidTs),
+ execute_transaction(Fun, Args, Factor, Retries, Type)
+ end.
+
+execute_inner(Mod, Tid, Ts, Fun, Args, Factor, Retries, Type) ->
+ case req({add_store, Tid}) of
+ {error, Reason} ->
+ {aborted, Reason};
+ {new_store, Ets} ->
+ copy_ets(Ts#tidstore.store, Ets),
+ Up = [Ts#tidstore.store | Ts#tidstore.up_stores],
+ NewTs = Ts#tidstore{level = 1 + Ts#tidstore.level,
+ store = Ets,
+ up_stores = Up},
+ NewTidTs = {Mod, Tid, NewTs},
+ put(mnesia_activity_state, NewTidTs),
+ execute_transaction(Fun, Args, Factor, Retries, Type)
+ end.
+
+copy_ets(From, To) ->
+ do_copy_ets(?ets_first(From), From, To).
+do_copy_ets('$end_of_table', _,_) ->
+ ok;
+do_copy_ets(K, From, To) ->
+ Objs = ?ets_lookup(From, K),
+ insert_objs(Objs, To),
+ do_copy_ets(?ets_next(From, K), From, To).
+
+insert_objs([H|T], Tab) ->
+ ?ets_insert(Tab, H),
+ insert_objs(T, Tab);
+insert_objs([], _Tab) ->
+ ok.
+
+execute_transaction(Fun, Args, Factor, Retries, Type) ->
+ case catch apply_fun(Fun, Args, Type) of
+ {'EXIT', Reason} ->
+ check_exit(Fun, Args, Factor, Retries, Reason, Type);
+ {'atomic', Value} ->
+ mnesia_lib:incr_counter(trans_commits),
+ erase(mnesia_activity_state),
+ %% no need to clear locks, already done by commit ...
+ %% Flush any un processed mnesia_down messages we might have
+ flush_downs(),
+ {'atomic', Value};
+ {nested_atomic, Value} ->
+ mnesia_lib:incr_counter(trans_commits),
+ {'atomic', Value};
+ Value -> %% User called throw
+ Reason = {aborted, {throw, Value}},
+ return_abort(Fun, Args, Reason)
+ end.
+
+apply_fun(Fun, Args, Type) ->
+ Result = apply(Fun, Args),
+ case t_commit(Type) of
+ do_commit ->
+ {'atomic', Result};
+ do_commit_nested ->
+ {nested_atomic, Result};
+ {do_abort, {aborted, Reason}} ->
+ {'EXIT', {aborted, Reason}};
+ {do_abort, Reason} ->
+ {'EXIT', {aborted, Reason}}
+ end.
+
+check_exit(Fun, Args, Factor, Retries, Reason, Type) ->
+ case Reason of
+ {aborted, C} when record(C, cyclic) ->
+ maybe_restart(Fun, Args, Factor, Retries, Type, C);
+ {aborted, {node_not_running, N}} ->
+ maybe_restart(Fun, Args, Factor, Retries, Type, {node_not_running, N});
+ {aborted, {bad_commit, N}} ->
+ maybe_restart(Fun, Args, Factor, Retries, Type, {bad_commit, N});
+ _ ->
+ return_abort(Fun, Args, Reason)
+ end.
+
+maybe_restart(Fun, Args, Factor, Retries, Type, Why) ->
+ {Mod, Tid, Ts} = get(mnesia_activity_state),
+ case try_again(Retries) of
+ yes when Ts#tidstore.level == 1 ->
+ restart(Mod, Tid, Ts, Fun, Args, Factor, Retries, Type, Why);
+ yes ->
+ return_abort(Fun, Args, Why);
+ no ->
+ return_abort(Fun, Args, {aborted, nomore})
+ end.
+
+try_again(infinity) -> yes;
+try_again(X) when number(X) , X > 1 -> yes;
+try_again(_) -> no.
+
+%% We can only restart toplevel transactions.
+%% If a deadlock situation occurs in a nested transaction
+%% The whole thing including all nested transactions need to be
+%% restarted. The stack is thus popped by a consequtive series of
+%% exit({aborted, #cyclic{}}) calls
+
+restart(Mod, Tid, Ts, Fun, Args, Factor0, Retries0, Type, Why) ->
+ mnesia_lib:incr_counter(trans_restarts),
+ Retries = decr(Retries0),
+ case Why of
+ {bad_commit, _N} ->
+ return_abort(Fun, Args, Why),
+ Factor = 1,
+ SleepTime = mnesia_lib:random_time(Factor, Tid#tid.counter),
+ dbg_out("Restarting transaction ~w: in ~wms ~w~n", [Tid, SleepTime, Why]),
+ timer:sleep(SleepTime),
+ execute_outer(Mod, Fun, Args, Factor, Retries, Type);
+ {node_not_running, _N} -> %% Avoids hanging in receive_release_tid_ack
+ return_abort(Fun, Args, Why),
+ Factor = 1,
+ SleepTime = mnesia_lib:random_time(Factor, Tid#tid.counter),
+ dbg_out("Restarting transaction ~w: in ~wms ~w~n", [Tid, SleepTime, Why]),
+ timer:sleep(SleepTime),
+ execute_outer(Mod, Fun, Args, Factor, Retries, Type);
+ _ ->
+ SleepTime = mnesia_lib:random_time(Factor0, Tid#tid.counter),
+ dbg_out("Restarting transaction ~w: in ~wms ~w~n", [Tid, SleepTime, Why]),
+
+ if
+ Factor0 /= 10 ->
+ ignore;
+ true ->
+ %% Our serial may be much larger than other nodes ditto
+ AllNodes = val({current, db_nodes}),
+ verbose("Sync serial ~p~n", [Tid]),
+ rpc:abcast(AllNodes, ?MODULE, {sync_trans_serial, Tid})
+ end,
+ intercept_friends(Tid, Ts),
+ Store = Ts#tidstore.store,
+ Nodes = get_nodes(Store),
+ ?MODULE ! {self(), {restart, Tid, Store}},
+ mnesia_locker:send_release_tid(Nodes, Tid),
+ timer:sleep(SleepTime),
+ mnesia_locker:receive_release_tid_acc(Nodes, Tid),
+ case rec() of
+ {restarted, Tid} ->
+ execute_transaction(Fun, Args, Factor0 + 1,
+ Retries, Type);
+ {error, Reason} ->
+ mnesia:abort(Reason)
+ end
+ end.
+
+decr(infinity) -> infinity;
+decr(X) when integer(X), X > 1 -> X - 1;
+decr(_X) -> 0.
+
+return_abort(Fun, Args, Reason) ->
+ {Mod, Tid, Ts} = get(mnesia_activity_state),
+ OldStore = Ts#tidstore.store,
+ Nodes = get_nodes(OldStore),
+ intercept_friends(Tid, Ts),
+ catch mnesia_lib:incr_counter(trans_failures),
+ Level = Ts#tidstore.level,
+ if
+ Level == 1 ->
+ mnesia_locker:async_release_tid(Nodes, Tid),
+ ?MODULE ! {delete_transaction, Tid},
+ erase(mnesia_activity_state),
+ dbg_out("Transaction ~p calling ~p with ~p, failed ~p~n",
+ [Tid, Fun, Args, Reason]),
+ flush_downs(),
+ {aborted, mnesia_lib:fix_error(Reason)};
+ true ->
+ %% Nested transaction
+ [NewStore | Tail] = Ts#tidstore.up_stores,
+ req({del_store, Tid, NewStore, OldStore, true}),
+ Ts2 = Ts#tidstore{store = NewStore,
+ up_stores = Tail,
+ level = Level - 1},
+ NewTidTs = {Mod, Tid, Ts2},
+ put(mnesia_activity_state, NewTidTs),
+ case Reason of
+ #cyclic{} ->
+ exit({aborted, Reason});
+ {node_not_running, _N} ->
+ exit({aborted, Reason});
+ {bad_commit, _N}->
+ exit({aborted, Reason});
+ _ ->
+ {aborted, mnesia_lib:fix_error(Reason)}
+ end
+ end.
+
+flush_downs() ->
+ receive
+ {?MODULE, _, _} -> flush_downs(); % Votes
+ {mnesia_down, _} -> flush_downs()
+ after 0 -> flushed
+ end.
+
+put_activity_id(undefined) ->
+ erase_activity_id();
+put_activity_id({Mod, Tid, Ts}) when record(Tid, tid), record(Ts, tidstore) ->
+ flush_downs(),
+ Store = Ts#tidstore.store,
+ ?ets_insert(Store, {friends, self()}),
+ NewTidTs = {Mod, Tid, Ts},
+ put(mnesia_activity_state, NewTidTs);
+put_activity_id(SimpleState) ->
+ put(mnesia_activity_state, SimpleState).
+
+erase_activity_id() ->
+ flush_downs(),
+ erase(mnesia_activity_state).
+
+get_nodes(Store) ->
+ case catch ?ets_lookup_element(Store, nodes, 2) of
+ {'EXIT', _} -> [node()];
+ Nodes -> Nodes
+ end.
+
+get_friends(Store) ->
+ case catch ?ets_lookup_element(Store, friends, 2) of
+ {'EXIT', _} -> [];
+ Friends -> Friends
+ end.
+
+opt_propagate_store(_Current, _Obsolete, false) ->
+ ok;
+opt_propagate_store(Current, Obsolete, true) ->
+ propagate_store(Current, nodes, get_nodes(Obsolete)),
+ propagate_store(Current, friends, get_friends(Obsolete)).
+
+propagate_store(Store, Var, [Val | Vals]) ->
+ ?ets_insert(Store, {Var, Val}),
+ propagate_store(Store, Var, Vals);
+propagate_store(_Store, _Var, []) ->
+ ok.
+
+%% Tell all processes that are cooperating with the current transaction
+intercept_friends(_Tid, Ts) ->
+ Friends = get_friends(Ts#tidstore.store),
+ Message = {activity_ended, undefined, self()},
+ intercept_best_friend(Friends, Message).
+
+intercept_best_friend([], _Message) ->
+ ok;
+intercept_best_friend([Pid | _], Message) ->
+ Pid ! Message,
+ wait_for_best_friend(Pid, 0).
+
+wait_for_best_friend(Pid, Timeout) ->
+ receive
+ {'EXIT', Pid, _} -> ok;
+ {activity_ended, _, Pid} -> ok
+ after Timeout ->
+ case my_process_is_alive(Pid) of
+ true -> wait_for_best_friend(Pid, 1000);
+ false -> ok
+ end
+ end.
+
+my_process_is_alive(Pid) ->
+ case catch erlang:is_process_alive(Pid) of % New BIF in R5
+ true ->
+ true;
+ false ->
+ false;
+ {'EXIT', _} -> % Pre R5 backward compatibility
+ case process_info(Pid, message_queue_len) of
+ undefined -> false;
+ _ -> true
+ end
+ end.
+
+dirty(Protocol, Item) ->
+ {{Tab, Key}, _Val, _Op} = Item,
+ Tid = {dirty, self()},
+ Prep = prepare_items(Tid, Tab, Key, [Item], #prep{protocol= Protocol}),
+ CR = Prep#prep.records,
+ case Protocol of
+ async_dirty ->
+ %% Send commit records to the other involved nodes,
+ %% but do only wait for one node to complete.
+ %% Preferrably, the local node if possible.
+
+ ReadNode = val({Tab, where_to_read}),
+ {WaitFor, FirstRes} = async_send_dirty(Tid, CR, Tab, ReadNode),
+ rec_dirty(WaitFor, FirstRes);
+
+ sync_dirty ->
+ %% Send commit records to the other involved nodes,
+ %% and wait for all nodes to complete
+ {WaitFor, FirstRes} = sync_send_dirty(Tid, CR, Tab, []),
+ rec_dirty(WaitFor, FirstRes);
+ _ ->
+ mnesia:abort({bad_activity, Protocol})
+ end.
+
+%% This is the commit function, The first thing it does,
+%% is to find out which nodes that have been participating
+%% in this particular transaction, all of the mnesia_locker:lock*
+%% functions insert the names of the nodes where it aquires locks
+%% into the local shadow Store
+%% This function exacutes in the context of the user process
+t_commit(Type) ->
+ {Mod, Tid, Ts} = get(mnesia_activity_state),
+ Store = Ts#tidstore.store,
+ if
+ Ts#tidstore.level == 1 ->
+ intercept_friends(Tid, Ts),
+ %% N is number of updates
+ case arrange(Tid, Store, Type) of
+ {N, Prep} when N > 0 ->
+ multi_commit(Prep#prep.protocol,
+ Tid, Prep#prep.records, Store);
+ {0, Prep} ->
+ multi_commit(read_only, Tid, Prep#prep.records, Store)
+ end;
+ true ->
+ %% nested commit
+ Level = Ts#tidstore.level,
+ [Obsolete | Tail] = Ts#tidstore.up_stores,
+ req({del_store, Tid, Store, Obsolete, false}),
+ NewTs = Ts#tidstore{store = Store,
+ up_stores = Tail,
+ level = Level - 1},
+ NewTidTs = {Mod, Tid, NewTs},
+ put(mnesia_activity_state, NewTidTs),
+ do_commit_nested
+ end.
+
+%% This function arranges for all objects we shall write in S to be
+%% in a list of {Node, CommitRecord}
+%% Important function for the performance of mnesia.
+
+arrange(Tid, Store, Type) ->
+ %% The local node is always included
+ Nodes = get_nodes(Store),
+ Recs = prep_recs(Nodes, []),
+ Key = ?ets_first(Store),
+ N = 0,
+ Prep =
+ case Type of
+ async -> #prep{protocol = sym_trans, records = Recs};
+ sync -> #prep{protocol = sync_sym_trans, records = Recs}
+ end,
+ case catch do_arrange(Tid, Store, Key, Prep, N) of
+ {'EXIT', Reason} ->
+ dbg_out("do_arrange failed ~p ~p~n", [Reason, Tid]),
+ case Reason of
+ {aborted, R} ->
+ mnesia:abort(R);
+ _ ->
+ mnesia:abort(Reason)
+ end;
+ {New, Prepared} ->
+ {New, Prepared#prep{records = reverse(Prepared#prep.records)}}
+ end.
+
+reverse([]) ->
+ [];
+reverse([H|R]) when record(H, commit) ->
+ [
+ H#commit{
+ ram_copies = lists:reverse(H#commit.ram_copies),
+ disc_copies = lists:reverse(H#commit.disc_copies),
+ disc_only_copies = lists:reverse(H#commit.disc_only_copies),
+ snmp = lists:reverse(H#commit.snmp)
+ }
+ | reverse(R)].
+
+prep_recs([N | Nodes], Recs) ->
+ prep_recs(Nodes, [#commit{decision = presume_commit, node = N} | Recs]);
+prep_recs([], Recs) ->
+ Recs.
+
+%% storage_types is a list of {Node, Storage} tuples
+%% where each tuple represents an active replica
+do_arrange(Tid, Store, {Tab, Key}, Prep, N) ->
+ Oid = {Tab, Key},
+ Items = ?ets_lookup(Store, Oid), %% Store is a bag
+ P2 = prepare_items(Tid, Tab, Key, Items, Prep),
+ do_arrange(Tid, Store, ?ets_next(Store, Oid), P2, N + 1);
+do_arrange(Tid, Store, SchemaKey, Prep, N) when SchemaKey == op ->
+ Items = ?ets_lookup(Store, SchemaKey), %% Store is a bag
+ P2 = prepare_schema_items(Tid, Items, Prep),
+ do_arrange(Tid, Store, ?ets_next(Store, SchemaKey), P2, N + 1);
+do_arrange(Tid, Store, RestoreKey, Prep, N) when RestoreKey == restore_op ->
+ [{restore_op, R}] = ?ets_lookup(Store, RestoreKey),
+ Fun = fun({Tab, Key}, CommitRecs, _RecName, Where, Snmp) ->
+ Item = [{{Tab, Key}, {Tab, Key}, delete}],
+ do_prepare_items(Tid, Tab, Key, Where, Snmp, Item, CommitRecs);
+ (BupRec, CommitRecs, RecName, Where, Snmp) ->
+ Tab = element(1, BupRec),
+ Key = element(2, BupRec),
+ Item =
+ if
+ Tab == RecName ->
+ [{{Tab, Key}, BupRec, write}];
+ true ->
+ BupRec2 = setelement(1, BupRec, RecName),
+ [{{Tab, Key}, BupRec2, write}]
+ end,
+ do_prepare_items(Tid, Tab, Key, Where, Snmp, Item, CommitRecs)
+ end,
+ Recs2 = mnesia_schema:arrange_restore(R, Fun, Prep#prep.records),
+ P2 = Prep#prep{protocol = asym_trans, records = Recs2},
+ do_arrange(Tid, Store, ?ets_next(Store, RestoreKey), P2, N + 1);
+do_arrange(_Tid, _Store, '$end_of_table', Prep, N) ->
+ {N, Prep};
+do_arrange(Tid, Store, IgnoredKey, Prep, N) -> %% locks, nodes ... local atoms...
+ do_arrange(Tid, Store, ?ets_next(Store, IgnoredKey), Prep, N).
+
+%% Returns a prep record with all items in reverse order
+prepare_schema_items(Tid, Items, Prep) ->
+ Types = [{N, schema_ops} || N <- val({current, db_nodes})],
+ Recs = prepare_nodes(Tid, Types, Items, Prep#prep.records, schema),
+ Prep#prep{protocol = asym_trans, records = Recs}.
+
+%% Returns a prep record with all items in reverse order
+prepare_items(Tid, Tab, Key, Items, Prep) when Prep#prep.prev_tab == Tab ->
+ Types = Prep#prep.prev_types,
+ Snmp = Prep#prep.prev_snmp,
+ Recs = Prep#prep.records,
+ Recs2 = do_prepare_items(Tid, Tab, Key, Types, Snmp, Items, Recs),
+ Prep#prep{records = Recs2};
+
+prepare_items(Tid, Tab, Key, Items, Prep) ->
+ Types = val({Tab, where_to_commit}),
+ case Types of
+ [] -> mnesia:abort({no_exists, Tab});
+ {blocked, _} ->
+ unblocked = req({unblock_me, Tab}),
+ prepare_items(Tid, Tab, Key, Items, Prep);
+ _ ->
+ Snmp = val({Tab, snmp}),
+ Recs2 = do_prepare_items(Tid, Tab, Key, Types,
+ Snmp, Items, Prep#prep.records),
+ Prep2 = Prep#prep{records = Recs2, prev_tab = Tab,
+ prev_types = Types, prev_snmp = Snmp},
+ check_prep(Prep2, Types)
+ end.
+
+do_prepare_items(Tid, Tab, Key, Types, Snmp, Items, Recs) ->
+ Recs2 = prepare_snmp(Tid, Tab, Key, Types, Snmp, Items, Recs), % May exit
+ prepare_nodes(Tid, Types, Items, Recs2, normal).
+
+prepare_snmp(Tab, Key, Items) ->
+ case val({Tab, snmp}) of
+ [] ->
+ [];
+ Ustruct when Key /= '_' ->
+ {_Oid, _Val, Op} = hd(Items),
+ %% Still making snmp oid (not used) because we want to catch errors here
+ %% And also it keeps backwards comp. with old nodes.
+ SnmpOid = mnesia_snmp_hook:key_to_oid(Tab, Key, Ustruct), % May exit
+ [{Op, Tab, Key, SnmpOid}];
+ _ ->
+ [{clear_table, Tab}]
+ end.
+
+prepare_snmp(_Tid, _Tab, _Key, _Types, [], _Items, Recs) ->
+ Recs;
+
+prepare_snmp(Tid, Tab, Key, Types, Us, Items, Recs) ->
+ if Key /= '_' ->
+ {_Oid, _Val, Op} = hd(Items),
+ SnmpOid = mnesia_snmp_hook:key_to_oid(Tab, Key, Us), % May exit
+ prepare_nodes(Tid, Types, [{Op, Tab, Key, SnmpOid}], Recs, snmp);
+ Key == '_' ->
+ prepare_nodes(Tid, Types, [{clear_table, Tab}], Recs, snmp)
+ end.
+
+check_prep(Prep, Types) when Prep#prep.types == Types ->
+ Prep;
+check_prep(Prep, Types) when Prep#prep.types == undefined ->
+ Prep#prep{types = Types};
+check_prep(Prep, _Types) ->
+ Prep#prep{protocol = asym_trans}.
+
+%% Returns a list of commit records
+prepare_nodes(Tid, [{Node, Storage} | Rest], Items, C, Kind) ->
+ {Rec, C2} = pick_node(Tid, Node, C, []),
+ Rec2 = prepare_node(Node, Storage, Items, Rec, Kind),
+ [Rec2 | prepare_nodes(Tid, Rest, Items, C2, Kind)];
+prepare_nodes(_Tid, [], _Items, CommitRecords, _Kind) ->
+ CommitRecords.
+
+pick_node(Tid, Node, [Rec | Rest], Done) ->
+ if
+ Rec#commit.node == Node ->
+ {Rec, Done ++ Rest};
+ true ->
+ pick_node(Tid, Node, Rest, [Rec | Done])
+ end;
+pick_node(_Tid, Node, [], Done) ->
+ {#commit{decision = presume_commit, node = Node}, Done}.
+
+prepare_node(Node, Storage, [Item | Items], Rec, Kind) when Kind == snmp ->
+ Rec2 = Rec#commit{snmp = [Item | Rec#commit.snmp]},
+ prepare_node(Node, Storage, Items, Rec2, Kind);
+prepare_node(Node, Storage, [Item | Items], Rec, Kind) when Kind /= schema ->
+ Rec2 =
+ case Storage of
+ ram_copies ->
+ Rec#commit{ram_copies = [Item | Rec#commit.ram_copies]};
+ disc_copies ->
+ Rec#commit{disc_copies = [Item | Rec#commit.disc_copies]};
+ disc_only_copies ->
+ Rec#commit{disc_only_copies =
+ [Item | Rec#commit.disc_only_copies]}
+ end,
+ prepare_node(Node, Storage, Items, Rec2, Kind);
+prepare_node(_Node, _Storage, Items, Rec, Kind)
+ when Kind == schema, Rec#commit.schema_ops == [] ->
+ Rec#commit{schema_ops = Items};
+prepare_node(_Node, _Storage, [], Rec, _Kind) ->
+ Rec.
+
+%% multi_commit((Protocol, Tid, CommitRecords, Store)
+%% Local work is always performed in users process
+multi_commit(read_only, Tid, CR, _Store) ->
+ %% This featherweight commit protocol is used when no
+ %% updates has been performed in the transaction.
+
+ {DiscNs, RamNs} = commit_nodes(CR, [], []),
+ Msg = {Tid, simple_commit},
+ rpc:abcast(DiscNs -- [node()], ?MODULE, Msg),
+ rpc:abcast(RamNs -- [node()], ?MODULE, Msg),
+ mnesia_recover:note_decision(Tid, committed),
+ mnesia_locker:release_tid(Tid),
+ ?MODULE ! {delete_transaction, Tid},
+ do_commit;
+
+multi_commit(sym_trans, Tid, CR, Store) ->
+ %% This lightweight commit protocol is used when all
+ %% the involved tables are replicated symetrically.
+ %% Their storage types must match on each node.
+ %%
+ %% 1 Ask the other involved nodes if they want to commit
+ %% All involved nodes votes yes if they are up
+ %% 2a Somebody has voted no
+ %% Tell all yes voters to do_abort
+ %% 2b Everybody has voted yes
+ %% Tell everybody to do_commit. I.e. that they should
+ %% prepare the commit, log the commit record and
+ %% perform the updates.
+ %%
+ %% The outcome is kept 3 minutes in the transient decision table.
+ %%
+ %% Recovery:
+ %% If somebody dies before the coordinator has
+ %% broadcasted do_commit, the transaction is aborted.
+ %%
+ %% If a participant dies, the table load algorithm
+ %% ensures that the contents of the involved tables
+ %% are picked from another node.
+ %%
+ %% If the coordinator dies, each participants checks
+ %% the outcome with all the others. If all are uncertain
+ %% about the outcome, the transaction is aborted. If
+ %% somebody knows the outcome the others will follow.
+
+ {DiscNs, RamNs} = commit_nodes(CR, [], []),
+ Pending = mnesia_checkpoint:tm_enter_pending(Tid, DiscNs, RamNs),
+ ?ets_insert(Store, Pending),
+
+ {WaitFor, Local} = ask_commit(sym_trans, Tid, CR, DiscNs, RamNs),
+ {Outcome, []} = rec_all(WaitFor, Tid, do_commit, []),
+ ?eval_debug_fun({?MODULE, multi_commit_sym},
+ [{tid, Tid}, {outcome, Outcome}]),
+ rpc:abcast(DiscNs -- [node()], ?MODULE, {Tid, Outcome}),
+ rpc:abcast(RamNs -- [node()], ?MODULE, {Tid, Outcome}),
+ case Outcome of
+ do_commit ->
+ mnesia_recover:note_decision(Tid, committed),
+ do_dirty(Tid, Local),
+ mnesia_locker:release_tid(Tid),
+ ?MODULE ! {delete_transaction, Tid};
+ {do_abort, _Reason} ->
+ mnesia_recover:note_decision(Tid, aborted)
+ end,
+ ?eval_debug_fun({?MODULE, multi_commit_sym, post},
+ [{tid, Tid}, {outcome, Outcome}]),
+ Outcome;
+
+multi_commit(sync_sym_trans, Tid, CR, Store) ->
+ %% This protocol is the same as sym_trans except that it
+ %% uses syncronized calls to disk_log and syncronized commits
+ %% when several nodes are involved.
+
+ {DiscNs, RamNs} = commit_nodes(CR, [], []),
+ Pending = mnesia_checkpoint:tm_enter_pending(Tid, DiscNs, RamNs),
+ ?ets_insert(Store, Pending),
+
+ {WaitFor, Local} = ask_commit(sync_sym_trans, Tid, CR, DiscNs, RamNs),
+ {Outcome, []} = rec_all(WaitFor, Tid, do_commit, []),
+ ?eval_debug_fun({?MODULE, multi_commit_sym_sync},
+ [{tid, Tid}, {outcome, Outcome}]),
+ rpc:abcast(DiscNs -- [node()], ?MODULE, {Tid, Outcome}),
+ rpc:abcast(RamNs -- [node()], ?MODULE, {Tid, Outcome}),
+ case Outcome of
+ do_commit ->
+ mnesia_recover:note_decision(Tid, committed),
+ mnesia_log:slog(Local),
+ do_commit(Tid, Local),
+ %% Just wait for completion result is ignore.
+ rec_all(WaitFor, Tid, ignore, []),
+ mnesia_locker:release_tid(Tid),
+ ?MODULE ! {delete_transaction, Tid};
+ {do_abort, _Reason} ->
+ mnesia_recover:note_decision(Tid, aborted)
+ end,
+ ?eval_debug_fun({?MODULE, multi_commit_sym, post},
+ [{tid, Tid}, {outcome, Outcome}]),
+ Outcome;
+
+multi_commit(asym_trans, Tid, CR, Store) ->
+ %% This more expensive commit protocol is used when
+ %% table definitions are changed (schema transactions).
+ %% It is also used when the involved tables are
+ %% replicated asymetrically. If the storage type differs
+ %% on at least one node this protocol is used.
+ %%
+ %% 1 Ask the other involved nodes if they want to commit.
+ %% All involved nodes prepares the commit, logs a presume_abort
+ %% commit record and votes yes or no depending of the
+ %% outcome of the prepare. The preparation is also performed
+ %% by the coordinator.
+ %%
+ %% 2a Somebody has died or voted no
+ %% Tell all yes voters to do_abort
+ %% 2b Everybody has voted yes
+ %% Put a unclear marker in the log.
+ %% Tell the others to pre_commit. I.e. that they should
+ %% put a unclear marker in the log and reply
+ %% acc_pre_commit when they are done.
+ %%
+ %% 3a Somebody died
+ %% Tell the remaining participants to do_abort
+ %% 3b Everybody has replied acc_pre_commit
+ %% Tell everybody to committed. I.e that they should
+ %% put a committed marker in the log, perform the updates
+ %% and reply done_commit when they are done. The coordinator
+ %% must wait with putting his committed marker inte the log
+ %% until the committed has been sent to all the others.
+ %% Then he performs local commit before collecting replies.
+ %%
+ %% 4 Everybody has either died or replied done_commit
+ %% Return to the caller.
+ %%
+ %% Recovery:
+ %% If the coordinator dies, the participants (and
+ %% the coordinator when he starts again) must do
+ %% the following:
+ %%
+ %% If we have no unclear marker in the log we may
+ %% safely abort, since we know that nobody may have
+ %% decided to commit yet.
+ %%
+ %% If we have a committed marker in the log we may
+ %% safely commit since we know that everybody else
+ %% also will come to this conclusion.
+ %%
+ %% If we have a unclear marker but no committed
+ %% in the log we are uncertain about the real outcome
+ %% of the transaction and must ask the others before
+ %% we can decide what to do. If someone knows the
+ %% outcome we will do the same. If nobody knows, we
+ %% will wait for the remaining involved nodes to come
+ %% up. When all involved nodes are up and uncertain,
+ %% we decide to commit (first put a committed marker
+ %% in the log, then do the updates).
+
+ D = #decision{tid = Tid, outcome = presume_abort},
+ {D2, CR2} = commit_decision(D, CR, [], []),
+ DiscNs = D2#decision.disc_nodes,
+ RamNs = D2#decision.ram_nodes,
+ Pending = mnesia_checkpoint:tm_enter_pending(Tid, DiscNs, RamNs),
+ ?ets_insert(Store, Pending),
+ {WaitFor, Local} = ask_commit(asym_trans, Tid, CR2, DiscNs, RamNs),
+ SchemaPrep = (catch mnesia_schema:prepare_commit(Tid, Local, {coord, WaitFor})),
+ {Votes, Pids} = rec_all(WaitFor, Tid, do_commit, []),
+
+ ?eval_debug_fun({?MODULE, multi_commit_asym_got_votes},
+ [{tid, Tid}, {votes, Votes}]),
+ case Votes of
+ do_commit ->
+ case SchemaPrep of
+ {_Modified, C, DumperMode} when record(C, commit) ->
+ mnesia_log:log(C), % C is not a binary
+ ?eval_debug_fun({?MODULE, multi_commit_asym_log_commit_rec},
+ [{tid, Tid}]),
+
+ D3 = C#commit.decision,
+ D4 = D3#decision{outcome = unclear},
+ mnesia_recover:log_decision(D4),
+ ?eval_debug_fun({?MODULE, multi_commit_asym_log_commit_dec},
+ [{tid, Tid}]),
+ tell_participants(Pids, {Tid, pre_commit}),
+ %% Now we are uncertain and we do not know
+ %% if all participants have logged that
+ %% they are uncertain or not
+ rec_acc_pre_commit(Pids, Tid, Store, C,
+ do_commit, DumperMode, [], []);
+ {'EXIT', Reason} ->
+ %% The others have logged the commit
+ %% record but they are not uncertain
+ mnesia_recover:note_decision(Tid, aborted),
+ ?eval_debug_fun({?MODULE, multi_commit_asym_prepare_exit},
+ [{tid, Tid}]),
+ tell_participants(Pids, {Tid, {do_abort, Reason}}),
+ do_abort(Tid, Local),
+ {do_abort, Reason}
+ end;
+
+ {do_abort, Reason} ->
+ %% The others have logged the commit
+ %% record but they are not uncertain
+ mnesia_recover:note_decision(Tid, aborted),
+ ?eval_debug_fun({?MODULE, multi_commit_asym_do_abort}, [{tid, Tid}]),
+ tell_participants(Pids, {Tid, {do_abort, Reason}}),
+ do_abort(Tid, Local),
+ {do_abort, Reason}
+ end.
+
+%% Returns do_commit or {do_abort, Reason}
+rec_acc_pre_commit([Pid | Tail], Tid, Store, Commit, Res, DumperMode,
+ GoodPids, SchemaAckPids) ->
+ receive
+ {?MODULE, _, {acc_pre_commit, Tid, Pid, true}} ->
+ rec_acc_pre_commit(Tail, Tid, Store, Commit, Res, DumperMode,
+ [Pid | GoodPids], [Pid | SchemaAckPids]);
+
+ {?MODULE, _, {acc_pre_commit, Tid, Pid, false}} ->
+ rec_acc_pre_commit(Tail, Tid, Store, Commit, Res, DumperMode,
+ [Pid | GoodPids], SchemaAckPids);
+
+ {?MODULE, _, {acc_pre_commit, Tid, Pid}} ->
+ %% Kept for backwards compatibility. Remove after Mnesia 4.x
+ rec_acc_pre_commit(Tail, Tid, Store, Commit, Res, DumperMode,
+ [Pid | GoodPids], [Pid | SchemaAckPids]);
+
+ {mnesia_down, Node} when Node == node(Pid) ->
+ AbortRes = {do_abort, {bad_commit, Node}},
+ rec_acc_pre_commit(Tail, Tid, Store, Commit, AbortRes, DumperMode,
+ GoodPids, SchemaAckPids)
+ end;
+rec_acc_pre_commit([], Tid, Store, Commit, Res, DumperMode, GoodPids, SchemaAckPids) ->
+ D = Commit#commit.decision,
+ case Res of
+ do_commit ->
+ %% Now everybody knows that the others
+ %% has voted yes. We also know that
+ %% everybody are uncertain.
+ prepare_sync_schema_commit(Store, SchemaAckPids),
+ tell_participants(GoodPids, {Tid, committed}),
+ D2 = D#decision{outcome = committed},
+ mnesia_recover:log_decision(D2),
+ ?eval_debug_fun({?MODULE, rec_acc_pre_commit_log_commit},
+ [{tid, Tid}]),
+
+ %% Now we have safely logged committed
+ %% and we can recover without asking others
+ do_commit(Tid, Commit, DumperMode),
+ ?eval_debug_fun({?MODULE, rec_acc_pre_commit_done_commit},
+ [{tid, Tid}]),
+ sync_schema_commit(Tid, Store, SchemaAckPids),
+ mnesia_locker:release_tid(Tid),
+ ?MODULE ! {delete_transaction, Tid};
+
+ {do_abort, Reason} ->
+ tell_participants(GoodPids, {Tid, {do_abort, Reason}}),
+ D2 = D#decision{outcome = aborted},
+ mnesia_recover:log_decision(D2),
+ ?eval_debug_fun({?MODULE, rec_acc_pre_commit_log_abort},
+ [{tid, Tid}]),
+ do_abort(Tid, Commit),
+ ?eval_debug_fun({?MODULE, rec_acc_pre_commit_done_abort},
+ [{tid, Tid}])
+ end,
+ Res.
+
+%% Note all nodes in case of mnesia_down mgt
+prepare_sync_schema_commit(_Store, []) ->
+ ok;
+prepare_sync_schema_commit(Store, [Pid | Pids]) ->
+ ?ets_insert(Store, {waiting_for_commit_ack, node(Pid)}),
+ prepare_sync_schema_commit(Store, Pids).
+
+sync_schema_commit(_Tid, _Store, []) ->
+ ok;
+sync_schema_commit(Tid, Store, [Pid | Tail]) ->
+ receive
+ {?MODULE, _, {schema_commit, Tid, Pid}} ->
+ ?ets_match_delete(Store, {waiting_for_commit_ack, node(Pid)}),
+ sync_schema_commit(Tid, Store, Tail);
+
+ {mnesia_down, Node} when Node == node(Pid) ->
+ ?ets_match_delete(Store, {waiting_for_commit_ack, Node}),
+ sync_schema_commit(Tid, Store, Tail)
+ end.
+
+tell_participants([Pid | Pids], Msg) ->
+ Pid ! Msg,
+ tell_participants(Pids, Msg);
+tell_participants([], _Msg) ->
+ ok.
+
+%% No need for trapping exits. We are only linked
+%% to mnesia_tm and if it dies we should also die.
+%% The same goes for disk_log and dets.
+commit_participant(Coord, Tid, Bin, DiscNs, RamNs) when binary(Bin) ->
+ Commit = binary_to_term(Bin),
+ commit_participant(Coord, Tid, Bin, Commit, DiscNs, RamNs);
+commit_participant(Coord, Tid, C, DiscNs, RamNs) when record(C, commit) ->
+ commit_participant(Coord, Tid, C, C, DiscNs, RamNs).
+
+commit_participant(Coord, Tid, Bin, C0, DiscNs, _RamNs) ->
+ ?eval_debug_fun({?MODULE, commit_participant, pre}, [{tid, Tid}]),
+ case catch mnesia_schema:prepare_commit(Tid, C0, {part, Coord}) of
+ {Modified, C, DumperMode} when record(C, commit) ->
+ %% If we can not find any local unclear decision
+ %% we should presume abort at startup recovery
+ case lists:member(node(), DiscNs) of
+ false ->
+ ignore;
+ true ->
+ case Modified of
+ false -> mnesia_log:log(Bin);
+ true -> mnesia_log:log(C)
+ end
+ end,
+ ?eval_debug_fun({?MODULE, commit_participant, vote_yes},
+ [{tid, Tid}]),
+ reply(Coord, {vote_yes, Tid, self()}),
+
+ receive
+ {Tid, pre_commit} ->
+ D = C#commit.decision,
+ mnesia_recover:log_decision(D#decision{outcome = unclear}),
+ ?eval_debug_fun({?MODULE, commit_participant, pre_commit},
+ [{tid, Tid}]),
+ Expect_schema_ack = C#commit.schema_ops /= [],
+ reply(Coord, {acc_pre_commit, Tid, self(), Expect_schema_ack}),
+
+ %% Now we are vulnerable for failures, since
+ %% we cannot decide without asking others
+ receive
+ {Tid, committed} ->
+ mnesia_recover:log_decision(D#decision{outcome = committed}),
+ ?eval_debug_fun({?MODULE, commit_participant, log_commit},
+ [{tid, Tid}]),
+ do_commit(Tid, C, DumperMode),
+ case Expect_schema_ack of
+ false -> ignore;
+ true -> reply(Coord, {schema_commit, Tid, self()})
+ end,
+ ?eval_debug_fun({?MODULE, commit_participant, do_commit},
+ [{tid, Tid}]);
+
+ {Tid, {do_abort, _Reason}} ->
+ mnesia_recover:log_decision(D#decision{outcome = aborted}),
+ ?eval_debug_fun({?MODULE, commit_participant, log_abort},
+ [{tid, Tid}]),
+ mnesia_schema:undo_prepare_commit(Tid, C),
+ ?eval_debug_fun({?MODULE, commit_participant, undo_prepare},
+ [{tid, Tid}]);
+
+ {'EXIT', _, _} ->
+ mnesia_recover:log_decision(D#decision{outcome = aborted}),
+ ?eval_debug_fun({?MODULE, commit_participant, exit_log_abort},
+ [{tid, Tid}]),
+ mnesia_schema:undo_prepare_commit(Tid, C),
+ ?eval_debug_fun({?MODULE, commit_participant, exit_undo_prepare},
+ [{tid, Tid}]);
+
+ Msg ->
+ verbose("** ERROR ** commit_participant ~p, got unexpected msg: ~p~n",
+ [Tid, Msg])
+ end;
+ {Tid, {do_abort, _Reason}} ->
+ mnesia_schema:undo_prepare_commit(Tid, C),
+ ?eval_debug_fun({?MODULE, commit_participant, pre_commit_undo_prepare},
+ [{tid, Tid}]);
+
+ {'EXIT', _, _} ->
+ mnesia_schema:undo_prepare_commit(Tid, C),
+ ?eval_debug_fun({?MODULE, commit_participant, pre_commit_undo_prepare}, [{tid, Tid}]);
+
+ Msg ->
+ verbose("** ERROR ** commit_participant ~p, got unexpected msg: ~p~n",
+ [Tid, Msg])
+ end;
+
+ {'EXIT', Reason} ->
+ ?eval_debug_fun({?MODULE, commit_participant, vote_no},
+ [{tid, Tid}]),
+ reply(Coord, {vote_no, Tid, Reason}),
+ mnesia_schema:undo_prepare_commit(Tid, C0)
+ end,
+ mnesia_locker:release_tid(Tid),
+ ?MODULE ! {delete_transaction, Tid},
+ unlink(whereis(?MODULE)),
+ exit(normal).
+
+do_abort(Tid, Bin) when binary(Bin) ->
+ %% Possible optimization:
+ %% If we want we could pass arround a flag
+ %% that tells us whether the binary contains
+ %% schema ops or not. Only if the binary
+ %% contains schema ops there are meningful
+ %% unpack the binary and perform
+ %% mnesia_schema:undo_prepare_commit/1.
+ do_abort(Tid, binary_to_term(Bin));
+do_abort(Tid, Commit) ->
+ mnesia_schema:undo_prepare_commit(Tid, Commit),
+ Commit.
+
+do_dirty(Tid, Commit) when Commit#commit.schema_ops == [] ->
+ mnesia_log:log(Commit),
+ do_commit(Tid, Commit).
+
+%% do_commit(Tid, CommitRecord)
+do_commit(Tid, Bin) when binary(Bin) ->
+ do_commit(Tid, binary_to_term(Bin));
+do_commit(Tid, C) ->
+ do_commit(Tid, C, optional).
+do_commit(Tid, Bin, DumperMode) when binary(Bin) ->
+ do_commit(Tid, binary_to_term(Bin), DumperMode);
+do_commit(Tid, C, DumperMode) ->
+ mnesia_dumper:update(Tid, C#commit.schema_ops, DumperMode),
+ R = do_snmp(Tid, C#commit.snmp),
+ R2 = do_update(Tid, ram_copies, C#commit.ram_copies, R),
+ R3 = do_update(Tid, disc_copies, C#commit.disc_copies, R2),
+ do_update(Tid, disc_only_copies, C#commit.disc_only_copies, R3).
+
+%% Update the items
+do_update(Tid, Storage, [Op | Ops], OldRes) ->
+ case catch do_update_op(Tid, Storage, Op) of
+ ok ->
+ do_update(Tid, Storage, Ops, OldRes);
+ {'EXIT', Reason} ->
+ %% This may only happen when we recently have
+ %% deleted our local replica, changed storage_type
+ %% or transformed table
+ %% BUGBUG: Updates may be lost if storage_type is changed.
+ %% Determine actual storage type and try again.
+ %% BUGBUG: Updates may be lost if table is transformed.
+
+ verbose("do_update in ~w failed: ~p -> {'EXIT', ~p}~n",
+ [Tid, Op, Reason]),
+ do_update(Tid, Storage, Ops, OldRes);
+ NewRes ->
+ do_update(Tid, Storage, Ops, NewRes)
+ end;
+do_update(_Tid, _Storage, [], Res) ->
+ Res.
+
+do_update_op(Tid, Storage, {{Tab, K}, Obj, write}) ->
+ commit_write(?catch_val({Tab, commit_work}), Tid,
+ Tab, K, Obj, undefined),
+ mnesia_lib:db_put(Storage, Tab, Obj);
+
+do_update_op(Tid, Storage, {{Tab, K}, Val, delete}) ->
+ commit_delete(?catch_val({Tab, commit_work}), Tid, Tab, K, Val, undefined),
+ mnesia_lib:db_erase(Storage, Tab, K);
+
+do_update_op(Tid, Storage, {{Tab, K}, {RecName, Incr}, update_counter}) ->
+ {NewObj, OldObjs} =
+ case catch mnesia_lib:db_update_counter(Storage, Tab, K, Incr) of
+ NewVal when integer(NewVal), NewVal >= 0 ->
+ {{RecName, K, NewVal}, [{RecName, K, NewVal - Incr}]};
+ _ ->
+ Zero = {RecName, K, 0},
+ mnesia_lib:db_put(Storage, Tab, Zero),
+ {Zero, []}
+ end,
+ commit_update(?catch_val({Tab, commit_work}), Tid, Tab,
+ K, NewObj, OldObjs),
+ element(3, NewObj);
+
+do_update_op(Tid, Storage, {{Tab, Key}, Obj, delete_object}) ->
+ commit_del_object(?catch_val({Tab, commit_work}),
+ Tid, Tab, Key, Obj, undefined),
+ mnesia_lib:db_match_erase(Storage, Tab, Obj);
+
+do_update_op(Tid, Storage, {{Tab, Key}, Obj, clear_table}) ->
+ commit_clear(?catch_val({Tab, commit_work}), Tid, Tab, Key, Obj),
+ mnesia_lib:db_match_erase(Storage, Tab, Obj).
+
+commit_write([], _, _, _, _, _) -> ok;
+commit_write([{checkpoints, CpList}|R], Tid, Tab, K, Obj, Old) ->
+ mnesia_checkpoint:tm_retain(Tid, Tab, K, write, CpList),
+ commit_write(R, Tid, Tab, K, Obj, Old);
+commit_write([H|R], Tid, Tab, K, Obj, Old)
+ when element(1, H) == subscribers ->
+ mnesia_subscr:report_table_event(H, Tab, Tid, Obj, write, Old),
+ commit_write(R, Tid, Tab, K, Obj, Old);
+commit_write([H|R], Tid, Tab, K, Obj, Old)
+ when element(1, H) == index ->
+ mnesia_index:add_index(H, Tab, K, Obj, Old),
+ commit_write(R, Tid, Tab, K, Obj, Old).
+
+commit_update([], _, _, _, _, _) -> ok;
+commit_update([{checkpoints, CpList}|R], Tid, Tab, K, Obj, _) ->
+ Old = mnesia_checkpoint:tm_retain(Tid, Tab, K, write, CpList),
+ commit_update(R, Tid, Tab, K, Obj, Old);
+commit_update([H|R], Tid, Tab, K, Obj, Old)
+ when element(1, H) == subscribers ->
+ mnesia_subscr:report_table_event(H, Tab, Tid, Obj, write, Old),
+ commit_update(R, Tid, Tab, K, Obj, Old);
+commit_update([H|R], Tid, Tab, K, Obj, Old)
+ when element(1, H) == index ->
+ mnesia_index:add_index(H, Tab, K, Obj, Old),
+ commit_update(R, Tid, Tab, K, Obj, Old).
+
+commit_delete([], _, _, _, _, _) -> ok;
+commit_delete([{checkpoints, CpList}|R], Tid, Tab, K, Obj, _) ->
+ Old = mnesia_checkpoint:tm_retain(Tid, Tab, K, delete, CpList),
+ commit_delete(R, Tid, Tab, K, Obj, Old);
+commit_delete([H|R], Tid, Tab, K, Obj, Old)
+ when element(1, H) == subscribers ->
+ mnesia_subscr:report_table_event(H, Tab, Tid, Obj, delete, Old),
+ commit_delete(R, Tid, Tab, K, Obj, Old);
+commit_delete([H|R], Tid, Tab, K, Obj, Old)
+ when element(1, H) == index ->
+ mnesia_index:delete_index(H, Tab, K),
+ commit_delete(R, Tid, Tab, K, Obj, Old).
+
+commit_del_object([], _, _, _, _, _) -> ok;
+commit_del_object([{checkpoints, CpList}|R], Tid, Tab, K, Obj, _) ->
+ Old = mnesia_checkpoint:tm_retain(Tid, Tab, K, delete_object, CpList),
+ commit_del_object(R, Tid, Tab, K, Obj, Old);
+commit_del_object([H|R], Tid, Tab, K, Obj, Old)
+ when element(1, H) == subscribers ->
+ mnesia_subscr:report_table_event(H, Tab, Tid, Obj, delete_object, Old),
+ commit_del_object(R, Tid, Tab, K, Obj, Old);
+commit_del_object([H|R], Tid, Tab, K, Obj, Old)
+ when element(1, H) == index ->
+ mnesia_index:del_object_index(H, Tab, K, Obj, Old),
+ commit_del_object(R, Tid, Tab, K, Obj, Old).
+
+commit_clear([], _, _, _, _) -> ok;
+commit_clear([{checkpoints, CpList}|R], Tid, Tab, K, Obj) ->
+ mnesia_checkpoint:tm_retain(Tid, Tab, K, clear_table, CpList),
+ commit_clear(R, Tid, Tab, K, Obj);
+commit_clear([H|R], Tid, Tab, K, Obj)
+ when element(1, H) == subscribers ->
+ mnesia_subscr:report_table_event(H, Tab, Tid, Obj, clear_table, undefined),
+ commit_clear(R, Tid, Tab, K, Obj);
+commit_clear([H|R], Tid, Tab, K, Obj)
+ when element(1, H) == index ->
+ mnesia_index:clear_index(H, Tab, K, Obj),
+ commit_clear(R, Tid, Tab, K, Obj).
+
+do_snmp(_, []) -> ok;
+do_snmp(Tid, [Head | Tail]) ->
+ case catch mnesia_snmp_hook:update(Head) of
+ {'EXIT', Reason} ->
+ %% This should only happen when we recently have
+ %% deleted our local replica or recently deattached
+ %% the snmp table
+
+ verbose("do_snmp in ~w failed: ~p -> {'EXIT', ~p}~n",
+ [Tid, Head, Reason]);
+ ok ->
+ ignore
+ end,
+ do_snmp(Tid, Tail).
+
+commit_nodes([C | Tail], AccD, AccR)
+ when C#commit.disc_copies == [],
+ C#commit.disc_only_copies == [],
+ C#commit.schema_ops == [] ->
+ commit_nodes(Tail, AccD, [C#commit.node | AccR]);
+commit_nodes([C | Tail], AccD, AccR) ->
+ commit_nodes(Tail, [C#commit.node | AccD], AccR);
+commit_nodes([], AccD, AccR) ->
+ {AccD, AccR}.
+
+commit_decision(D, [C | Tail], AccD, AccR) ->
+ N = C#commit.node,
+ {D2, Tail2} =
+ case C#commit.schema_ops of
+ [] when C#commit.disc_copies == [],
+ C#commit.disc_only_copies == [] ->
+ commit_decision(D, Tail, AccD, [N | AccR]);
+ [] ->
+ commit_decision(D, Tail, [N | AccD], AccR);
+ Ops ->
+ case ram_only_ops(N, Ops) of
+ true ->
+ commit_decision(D, Tail, AccD, [N | AccR]);
+ false ->
+ commit_decision(D, Tail, [N | AccD], AccR)
+ end
+ end,
+ {D2, [C#commit{decision = D2} | Tail2]};
+commit_decision(D, [], AccD, AccR) ->
+ {D#decision{disc_nodes = AccD, ram_nodes = AccR}, []}.
+
+ram_only_ops(N, [{op, change_table_copy_type, N, _FromS, _ToS, Cs} | _Ops ]) ->
+ case lists:member({name, schema}, Cs) of
+ true ->
+ %% We always use disk if change type of the schema
+ false;
+ false ->
+ not lists:member(N, val({schema, disc_copies}))
+ end;
+
+ram_only_ops(N, _Ops) ->
+ not lists:member(N, val({schema, disc_copies})).
+
+%% Returns {WaitFor, Res}
+sync_send_dirty(Tid, [Head | Tail], Tab, WaitFor) ->
+ Node = Head#commit.node,
+ if
+ Node == node() ->
+ {WF, _} = sync_send_dirty(Tid, Tail, Tab, WaitFor),
+ Res = do_dirty(Tid, Head),
+ {WF, Res};
+ true ->
+ {?MODULE, Node} ! {self(), {sync_dirty, Tid, Head, Tab}},
+ sync_send_dirty(Tid, Tail, Tab, [Node | WaitFor])
+ end;
+sync_send_dirty(_Tid, [], _Tab, WaitFor) ->
+ {WaitFor, {'EXIT', {aborted, {node_not_running, WaitFor}}}}.
+
+%% Returns {WaitFor, Res}
+async_send_dirty(_Tid, _Nodes, Tab, nowhere) ->
+ {[], {'EXIT', {aborted, {no_exists, Tab}}}};
+async_send_dirty(Tid, Nodes, Tab, ReadNode) ->
+ async_send_dirty(Tid, Nodes, Tab, ReadNode, [], ok).
+
+async_send_dirty(Tid, [Head | Tail], Tab, ReadNode, WaitFor, Res) ->
+ Node = Head#commit.node,
+ if
+ ReadNode == Node, Node == node() ->
+ NewRes = do_dirty(Tid, Head),
+ async_send_dirty(Tid, Tail, Tab, ReadNode, WaitFor, NewRes);
+ ReadNode == Node ->
+ {?MODULE, Node} ! {self(), {sync_dirty, Tid, Head, Tab}},
+ NewRes = {'EXIT', {aborted, {node_not_running, Node}}},
+ async_send_dirty(Tid, Tail, Tab, ReadNode, [Node | WaitFor], NewRes);
+ true ->
+ {?MODULE, Node} ! {self(), {async_dirty, Tid, Head, Tab}},
+ async_send_dirty(Tid, Tail, Tab, ReadNode, WaitFor, Res)
+ end;
+async_send_dirty(_Tid, [], _Tab, _ReadNode, WaitFor, Res) ->
+ {WaitFor, Res}.
+
+rec_dirty([Node | Tail], Res) when Node /= node() ->
+ NewRes = get_dirty_reply(Node, Res),
+ rec_dirty(Tail, NewRes);
+rec_dirty([], Res) ->
+ Res.
+
+get_dirty_reply(Node, Res) ->
+ receive
+ {?MODULE, Node, {'EXIT', Reason}} ->
+ {'EXIT', {aborted, {badarg, Reason}}};
+ {?MODULE, Node, {dirty_res, ok}} ->
+ case Res of
+ {'EXIT', {aborted, {node_not_running, _Node}}} ->
+ ok;
+ _ ->
+ %% Prioritize bad results, but node_not_running
+ Res
+ end;
+ {?MODULE, Node, {dirty_res, Reply}} ->
+ Reply;
+ {mnesia_down, Node} ->
+ %% It's ok to ignore mnesia_down's
+ %% since we will make the replicas
+ %% consistent again when Node is started
+ Res
+ after 1000 ->
+ case lists:member(Node, val({current, db_nodes})) of
+ true ->
+ get_dirty_reply(Node, Res);
+ false ->
+ Res
+ end
+ end.
+
+%% Assume that CommitRecord is no binary
+%% Return {Res, Pids}
+ask_commit(Protocol, Tid, CR, DiscNs, RamNs) ->
+ ask_commit(Protocol, Tid, CR, DiscNs, RamNs, [], no_local).
+
+ask_commit(Protocol, Tid, [Head | Tail], DiscNs, RamNs, WaitFor, Local) ->
+ Node = Head#commit.node,
+ if
+ Node == node() ->
+ ask_commit(Protocol, Tid, Tail, DiscNs, RamNs, WaitFor, Head);
+ true ->
+ Bin = opt_term_to_binary(Protocol, Head, DiscNs++RamNs),
+ Msg = {ask_commit, Protocol, Tid, Bin, DiscNs, RamNs},
+ {?MODULE, Node} ! {self(), Msg},
+ ask_commit(Protocol, Tid, Tail, DiscNs, RamNs, [Node | WaitFor], Local)
+ end;
+ask_commit(_Protocol, _Tid, [], _DiscNs, _RamNs, WaitFor, Local) ->
+ {WaitFor, Local}.
+
+opt_term_to_binary(asym_trans, Head, Nodes) ->
+ opt_term_to_binary(Nodes, Head);
+opt_term_to_binary(_Protocol, Head, _Nodes) ->
+ Head.
+
+opt_term_to_binary([], Head) ->
+ term_to_binary(Head);
+opt_term_to_binary([H|R], Head) ->
+ case mnesia_monitor:needs_protocol_conversion(H) of
+ true -> Head;
+ false ->
+ opt_term_to_binary(R, Head)
+ end.
+
+rec_all([Node | Tail], Tid, Res, Pids) ->
+ receive
+ {?MODULE, Node, {vote_yes, Tid}} ->
+ rec_all(Tail, Tid, Res, Pids);
+ {?MODULE, Node, {vote_yes, Tid, Pid}} ->
+ rec_all(Tail, Tid, Res, [Pid | Pids]);
+ {?MODULE, Node, {vote_no, Tid, Reason}} ->
+ rec_all(Tail, Tid, {do_abort, Reason}, Pids);
+ {?MODULE, Node, {committed, Tid}} ->
+ rec_all(Tail, Tid, Res, Pids);
+ {?MODULE, Node, {aborted, Tid}} ->
+ rec_all(Tail, Tid, Res, Pids);
+
+ {mnesia_down, Node} ->
+ rec_all(Tail, Tid, {do_abort, {bad_commit, Node}}, Pids)
+ end;
+rec_all([], _Tid, Res, Pids) ->
+ {Res, Pids}.
+
+get_transactions() ->
+ {info, Participant, Coordinator} = req(info),
+ lists:map(fun({Tid, _Tabs}) ->
+ Status = tr_status(Tid,Participant),
+ {Tid#tid.counter, Tid#tid.pid, Status}
+ end,Coordinator).
+
+tr_status(Tid,Participant) ->
+ case lists:keymember(Tid, 1, Participant) of
+ true -> participant;
+ false -> coordinator
+ end.
+
+get_info(Timeout) ->
+ case whereis(?MODULE) of
+ undefined ->
+ {timeout, Timeout};
+ Pid ->
+ Pid ! {self(), info},
+ receive
+ {?MODULE, _, {info, Part, Coord}} ->
+ {info, Part, Coord}
+ after Timeout ->
+ {timeout, Timeout}
+ end
+ end.
+
+display_info(Stream, {timeout, T}) ->
+ io:format(Stream, "---> No info about coordinator and participant transactions, "
+ "timeout ~p <--- ~n", [T]);
+
+display_info(Stream, {info, Part, Coord}) ->
+ io:format(Stream, "---> Participant transactions <--- ~n", []),
+ lists:foreach(fun(P) -> pr_participant(Stream, P) end, Part),
+ io:format(Stream, "---> Coordinator transactions <---~n", []),
+ lists:foreach(fun({Tid, _Tabs}) -> pr_tid(Stream, Tid) end, Coord).
+
+pr_participant(Stream, P) ->
+ Commit0 = P#participant.commit,
+ Commit =
+ if
+ binary(Commit0) -> binary_to_term(Commit0);
+ true -> Commit0
+ end,
+ pr_tid(Stream, P#participant.tid),
+ io:format(Stream, "with participant objects ~p~n", [Commit]).
+
+
+pr_tid(Stream, Tid) ->
+ io:format(Stream, "Tid: ~p (owned by ~p) ~n",
+ [Tid#tid.counter, Tid#tid.pid]).
+
+info(Serial) ->
+ io:format( "Info about transaction with serial == ~p~n", [Serial]),
+ {info, Participant, Trs} = req(info),
+ search_pr_participant(Serial, Participant),
+ search_pr_coordinator(Serial, Trs).
+
+
+search_pr_coordinator(_S, []) -> no;
+search_pr_coordinator(S, [{Tid, _Ts}|Tail]) ->
+ case Tid#tid.counter of
+ S ->
+ io:format( "Tid is coordinator, owner == \n", []),
+ display_pid_info(Tid#tid.pid),
+ search_pr_coordinator(S, Tail);
+ _ ->
+ search_pr_coordinator(S, Tail)
+ end.
+
+search_pr_participant(_S, []) ->
+ false;
+search_pr_participant(S, [ P | Tail]) ->
+ Tid = P#participant.tid,
+ Commit0 = P#participant.commit,
+ if
+ Tid#tid.counter == S ->
+ io:format( "Tid is participant to commit, owner == \n", []),
+ Pid = Tid#tid.pid,
+ display_pid_info(Pid),
+ io:format( "Tid wants to write objects \n",[]),
+ Commit =
+ if
+ binary(Commit0) -> binary_to_term(Commit0);
+ true -> Commit0
+ end,
+
+ io:format("~p~n", [Commit]),
+ search_pr_participant(S,Tail); %% !!!!!
+ true ->
+ search_pr_participant(S, Tail)
+ end.
+
+display_pid_info(Pid) ->
+ case rpc:pinfo(Pid) of
+ undefined ->
+ io:format( "Dead process \n");
+ Info ->
+ Call = fetch(initial_call, Info),
+ Curr = case fetch(current_function, Info) of
+ {Mod,F,Args} when list(Args) ->
+ {Mod,F,length(Args)};
+ Other ->
+ Other
+ end,
+ Reds = fetch(reductions, Info),
+ LM = length(fetch(messages, Info)),
+ pformat(io_lib:format("~p", [Pid]),
+ io_lib:format("~p", [Call]),
+ io_lib:format("~p", [Curr]), Reds, LM)
+ end.
+
+pformat(A1, A2, A3, A4, A5) ->
+ io:format( "~-12s ~-21s ~-21s ~9w ~4w~n", [A1,A2,A3,A4,A5]).
+
+fetch(Key, Info) ->
+ case lists:keysearch(Key, 1, Info) of
+ {value, {_, Val}} ->
+ Val;
+ _ ->
+ 0
+ end.
+
+
+%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%% reconfigure stuff comes here ......
+%%%%%%%%%%%%%%%%%%%%%
+
+reconfigure_coordinators(N, [{Tid, [Store | _]} | Coordinators]) ->
+ case mnesia_recover:outcome(Tid, unknown) of
+ committed ->
+ WaitingNodes = ?ets_lookup(Store, waiting_for_commit_ack),
+ case lists:keymember(N, 2, WaitingNodes) of
+ false ->
+ ignore; % avoid spurious mnesia_down messages
+ true ->
+ send_mnesia_down(Tid, Store, N)
+ end;
+ aborted ->
+ ignore; % avoid spurious mnesia_down messages
+ _ ->
+ %% Tell the coordinator about the mnesia_down
+ send_mnesia_down(Tid, Store, N)
+ end,
+ reconfigure_coordinators(N, Coordinators);
+reconfigure_coordinators(_N, []) ->
+ ok.
+
+send_mnesia_down(Tid, Store, Node) ->
+ Msg = {mnesia_down, Node},
+ send_to_pids([Tid#tid.pid | get_friends(Store)], Msg).
+
+send_to_pids([Pid | Pids], Msg) ->
+ Pid ! Msg,
+ send_to_pids(Pids, Msg);
+send_to_pids([], _Msg) ->
+ ok.
+
+reconfigure_participants(N, [P | Tail]) ->
+ case lists:member(N, P#participant.disc_nodes) or
+ lists:member(N, P#participant.ram_nodes) of
+ false ->
+ %% Ignore, since we are not a participant
+ %% in the transaction.
+ reconfigure_participants(N, Tail);
+
+ true ->
+ %% We are on a participant node, lets
+ %% check if the dead one was a
+ %% participant or a coordinator.
+ Tid = P#participant.tid,
+ if
+ node(Tid#tid.pid) /= N ->
+ %% Another participant node died. Ignore.
+ reconfigure_participants(N, Tail);
+
+ true ->
+ %% The coordinator node has died and
+ %% we must determine the outcome of the
+ %% transaction and tell mnesia_tm on all
+ %% nodes (including the local node) about it
+ verbose("Coordinator ~p in transaction ~p died~n",
+ [Tid#tid.pid, Tid]),
+
+ Nodes = P#participant.disc_nodes ++
+ P#participant.ram_nodes,
+ AliveNodes = Nodes -- [N],
+ Protocol = P#participant.protocol,
+ tell_outcome(Tid, Protocol, N, AliveNodes, AliveNodes),
+ reconfigure_participants(N, Tail)
+ end
+ end;
+reconfigure_participants(_, []) ->
+ [].
+
+%% We need to determine the outcome of the transaction and
+%% tell mnesia_tm on all involved nodes (including the local node)
+%% about the outcome.
+tell_outcome(Tid, Protocol, Node, CheckNodes, TellNodes) ->
+ Outcome = mnesia_recover:what_happened(Tid, Protocol, CheckNodes),
+ case Outcome of
+ aborted ->
+ rpc:abcast(TellNodes, ?MODULE, {Tid,{do_abort, {mnesia_down, Node}}});
+ committed ->
+ rpc:abcast(TellNodes, ?MODULE, {Tid, do_commit})
+ end,
+ Outcome.
+
+do_stop(#state{coordinators = Coordinators}) ->
+ Msg = {mnesia_down, node()},
+ lists:foreach(fun({Tid, _}) -> Tid#tid.pid ! Msg end, Coordinators),
+ mnesia_checkpoint:stop(),
+ mnesia_log:stop(),
+ exit(shutdown).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% System upgrade
+
+system_continue(_Parent, _Debug, State) ->
+ doit_loop(State).
+
+system_terminate(_Reason, _Parent, _Debug, State) ->
+ do_stop(State).
+
+system_code_change(State, _Module, _OldVsn, _Extra) ->
+ {ok, State}.
diff --git a/lib/dialyzer/test/race_SUITE_data/dialyzer_options b/lib/dialyzer/test/race_SUITE_data/dialyzer_options
new file mode 100644
index 0000000000..44e1720715
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/dialyzer_options
@@ -0,0 +1 @@
+{dialyzer_options, [{warnings, [race_conditions]}]}.
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args1 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args1
new file mode 100644
index 0000000000..3bbe99d4af
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args1
@@ -0,0 +1,2 @@
+
+ets_insert_args1.erl:9: The call ets:insert(T::'foo',[{'counter',number()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(T::'foo','counter') call in ets_insert_args1.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args2 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args2
new file mode 100644
index 0000000000..34176c66ac
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args2
@@ -0,0 +1,2 @@
+
+ets_insert_args2.erl:9: The call ets:insert(T::'foo',[{'counter',number()} | {'kostis',number()} | {'maria',number()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(T::'foo','counter') call in ets_insert_args2.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args3 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args3
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args3
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args4 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args4
new file mode 100644
index 0000000000..8c45de08c2
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args4
@@ -0,0 +1,2 @@
+
+ets_insert_args4.erl:9: The call ets:insert(T::'foo',{'counter',number()}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(T::'foo','counter') call in ets_insert_args4.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args5 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args5
new file mode 100644
index 0000000000..a4a0c021c2
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args5
@@ -0,0 +1,2 @@
+
+ets_insert_args5.erl:9: The call ets:insert(T::'foo',{'counter',number(),number()}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(T::'foo','counter') call in ets_insert_args5.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args6 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args6
new file mode 100644
index 0000000000..10fa4c27e3
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args6
@@ -0,0 +1,2 @@
+
+ets_insert_args6.erl:9: The call ets:insert(T::'foo',[{'counter',number(),number()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(T::'foo','counter') call in ets_insert_args6.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args7 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args7
new file mode 100644
index 0000000000..af43145c17
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args7
@@ -0,0 +1,2 @@
+
+ets_insert_args7.erl:17: The call ets:insert(Table::'foo',[{'counter',number()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Tab::'foo','counter') call in ets_insert_args7.erl on line 13
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args8 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args8
new file mode 100644
index 0000000000..5a2b41ed8c
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args8
@@ -0,0 +1,2 @@
+
+ets_insert_args8.erl:16: The call ets:insert(Table::atom(),[{'counter',number()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Tab::atom(),'counter') call in ets_insert_args8.erl on line 12
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow1 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow1
new file mode 100644
index 0000000000..d7df214939
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow1
@@ -0,0 +1,2 @@
+
+ets_insert_control_flow1.erl:15: The call ets:insert('foo',{'random',integer()}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('foo','random') call in ets_insert_control_flow1.erl on line 10
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow2 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow2
new file mode 100644
index 0000000000..cdaeafb0ed
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow2
@@ -0,0 +1,3 @@
+
+ets_insert_control_flow2.erl:15: The call ets:insert('foo',[{'pass',[pos_integer()]} | {'random',integer()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('foo','random') call in ets_insert_control_flow2.erl on line 10
+ets_insert_control_flow2.erl:19: The call ets:insert('foo',[{'pass',[pos_integer()]} | {'random',integer()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('foo','random') call in ets_insert_control_flow2.erl on line 10
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow3 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow3
new file mode 100644
index 0000000000..d640f564cd
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow3
@@ -0,0 +1,3 @@
+
+ets_insert_control_flow3.erl:21: The call ets:insert(Table::atom() | tid(),{'root',[pos_integer()]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | tid(),'root') call in ets_insert_control_flow3.erl on line 12
+ets_insert_control_flow3.erl:23: The call ets:insert(Table::atom() | tid(),{'user',[pos_integer()]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | tid(),'user') call in ets_insert_control_flow3.erl on line 13
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow4 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow4
new file mode 100644
index 0000000000..6f34e75902
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow4
@@ -0,0 +1,3 @@
+
+ets_insert_control_flow4.erl:21: The call ets:insert(Table::atom() | tid(),{'pass',[pos_integer()]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | tid(),'pass') call in ets_insert_control_flow4.erl on line 12, the ets:lookup(Table::atom() | tid(),'pass') call in ets_insert_control_flow4.erl on line 13
+ets_insert_control_flow4.erl:23: The call ets:insert(Table::atom() | tid(),{'pass',[pos_integer()]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | tid(),'pass') call in ets_insert_control_flow4.erl on line 12, the ets:lookup(Table::atom() | tid(),'pass') call in ets_insert_control_flow4.erl on line 13
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow5 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow5
new file mode 100644
index 0000000000..5af592f43f
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow5
@@ -0,0 +1,5 @@
+
+ets_insert_control_flow5.erl:22: The call ets:insert(Table::atom() | tid(),{'welcome_msg',[any(),...]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | tid(),'welcome_msg') call in ets_insert_control_flow5.erl on line 16
+ets_insert_control_flow5.erl:23: The call ets:insert(Table::atom() | tid(),{'pass',[pos_integer()]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | tid(),'pass') call in ets_insert_control_flow5.erl on line 12, the ets:lookup(Table::atom() | tid(),'pass') call in ets_insert_control_flow5.erl on line 13
+ets_insert_control_flow5.erl:25: The call ets:insert(Table::atom() | tid(),{'welcome_msg',[any(),...]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | tid(),'welcome_msg') call in ets_insert_control_flow5.erl on line 16
+ets_insert_control_flow5.erl:26: The call ets:insert(Table::atom() | tid(),{'pass',[pos_integer()]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | tid(),'pass') call in ets_insert_control_flow5.erl on line 12, the ets:lookup(Table::atom() | tid(),'pass') call in ets_insert_control_flow5.erl on line 13
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race1 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race1
new file mode 100644
index 0000000000..98ccf34e7d
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race1
@@ -0,0 +1,2 @@
+
+ets_insert_diff_atoms_race1.erl:22: The call ets:insert(Table::'bar' | 'foo',[{'counter',number()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Tab::'foo','counter') call in ets_insert_diff_atoms_race1.erl on line 13
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race2 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race2
new file mode 100644
index 0000000000..b6af99b4cc
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race2
@@ -0,0 +1,2 @@
+
+ets_insert_diff_atoms_race2.erl:22: The call ets:insert(Table::'bar' | 'foo',[{'counter',number()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Tab::'foo',Counter::'counter') call in ets_insert_diff_atoms_race2.erl on line 13
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race3 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race3
new file mode 100644
index 0000000000..d79182c289
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race3
@@ -0,0 +1,2 @@
+
+ets_insert_diff_atoms_race3.erl:22: The call ets:insert(Table::'bar' | 'foo',{'counter',number()}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Tab::'foo','counter') call in ets_insert_diff_atoms_race3.erl on line 13
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race4 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race4
new file mode 100644
index 0000000000..5bb1b9f781
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race4
@@ -0,0 +1,2 @@
+
+ets_insert_diff_atoms_race4.erl:22: The call ets:insert(Table::'bar' | 'foo',{'counter',number()}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Tab::'foo',Counter::'counter') call in ets_insert_diff_atoms_race4.erl on line 13
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race5 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race5
new file mode 100644
index 0000000000..7db320e758
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race5
@@ -0,0 +1,2 @@
+
+ets_insert_diff_atoms_race5.erl:22: The call ets:insert(Table::'foo',[{'counter',number()} | {'index',number()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Tab::'foo',Counter::'counter') call in ets_insert_diff_atoms_race5.erl on line 13
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race6 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race6
new file mode 100644
index 0000000000..c029f79ed5
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race6
@@ -0,0 +1,2 @@
+
+ets_insert_diff_atoms_race6.erl:22: The call ets:insert(Table::'foo',{'counter',number()} | {'index',number()}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Tab::'foo',Counter::'counter') call in ets_insert_diff_atoms_race6.erl on line 13
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_double1 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_double1
new file mode 100644
index 0000000000..b640b91271
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_double1
@@ -0,0 +1,4 @@
+
+ets_insert_double1.erl:15: The call ets:insert('foo',[{'pass',[number()]} | {'random',integer()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('foo','random') call in ets_insert_double1.erl on line 10, the ets:lookup('foo','pass') call in ets_insert_double1.erl on line 27
+ets_insert_double1.erl:19: The call ets:insert('foo',[{'pass',[number()]} | {'random',integer()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('foo','random') call in ets_insert_double1.erl on line 10, the ets:lookup('foo','pass') call in ets_insert_double1.erl on line 27
+ets_insert_double1.erl:24: The call ets:insert('foo',{'pass','empty'}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('foo','pass') call in ets_insert_double1.erl on line 22
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_double2 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_double2
new file mode 100644
index 0000000000..cf61cb5ec3
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_double2
@@ -0,0 +1,4 @@
+
+ets_insert_double2.erl:15: The call ets:insert('foo',[{_,[number()] | integer()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('foo',Random::any()) call in ets_insert_double2.erl on line 10, the ets:lookup('foo',Pass::any()) call in ets_insert_double2.erl on line 27
+ets_insert_double2.erl:19: The call ets:insert('foo',[{_,[number()] | integer()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('foo',Random::any()) call in ets_insert_double2.erl on line 10, the ets:lookup('foo',Pass::any()) call in ets_insert_double2.erl on line 27
+ets_insert_double2.erl:24: The call ets:insert('foo',{_,'empty'}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('foo',Pass::any()) call in ets_insert_double2.erl on line 22
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_funs1 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_funs1
new file mode 100644
index 0000000000..540a0cf388
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_funs1
@@ -0,0 +1,2 @@
+
+ets_insert_funs1.erl:15: The call ets:insert('foo',[{'counter',number()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(T::'foo','counter') call in ets_insert_funs1.erl on line 9
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_funs2 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_funs2
new file mode 100644
index 0000000000..6b618f72b6
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_funs2
@@ -0,0 +1,2 @@
+
+ets_insert_funs2.erl:9: The call ets:insert(T::'foo',[{'counter',number()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('foo','counter') call in ets_insert_funs2.erl on line 14
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_new b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_new
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_new
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_param b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_param
new file mode 100644
index 0000000000..58f934a190
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_param
@@ -0,0 +1,5 @@
+
+ets_insert_param.erl:13: The call ets:insert(Table::atom() | tid(),{'welcome_msg',[any(),...]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | tid(),'welcome_msg') call in ets_insert_param.erl on line 10
+ets_insert_param.erl:14: The call ets:insert(Table::atom() | tid(),{'pass',[pos_integer()]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | tid(),'pass') call in ets_insert_param.erl on line 14, the ets:lookup(Table::atom() | tid(),'pass') call in ets_insert_param.erl on line 15
+ets_insert_param.erl:17: The call ets:insert(Table::atom() | tid(),{'welcome_msg',[any(),...]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | tid(),'welcome_msg') call in ets_insert_param.erl on line 10
+ets_insert_param.erl:18: The call ets:insert(Table::atom() | tid(),{'pass',[pos_integer()]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | tid(),'pass') call in ets_insert_param.erl on line 18
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_public b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_public
new file mode 100644
index 0000000000..d091ce3b50
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_public
@@ -0,0 +1,2 @@
+
+ets_insert_public.erl:14: The call ets:insert(Foo::atom(),{'counter',number()}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Foo::atom(),'counter') call in ets_insert_public.erl on line 12
diff --git a/lib/dialyzer/test/race_SUITE_data/results/extract_translations b/lib/dialyzer/test/race_SUITE_data/results/extract_translations
new file mode 100644
index 0000000000..f7d5abc6f5
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/extract_translations
@@ -0,0 +1,5 @@
+
+extract_translations.erl:140: The call ets:insert('files',{atom() | binary() | [atom() | binary() | [atom() | binary() | [any()] | char()] | char()]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('files',File::atom() | binary() | [atom() | binary() | [atom() | binary() | [any()] | char()] | char()]) call in extract_translations.erl on line 135
+extract_translations.erl:146: The call ets:insert('translations',{_,[]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('translations',Str::any()) call in extract_translations.erl on line 126
+extract_translations.erl:152: The call ets:insert('files',{atom() | binary() | [atom() | binary() | [atom() | binary() | [any()] | char()] | char()]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('files',File::atom() | binary() | [atom() | binary() | [atom() | binary() | [any()] | char()] | char()]) call in extract_translations.erl on line 148
+extract_translations.erl:154: The call ets:insert('translations',{_,[]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('translations',Str::any()) call in extract_translations.erl on line 126
diff --git a/lib/dialyzer/test/race_SUITE_data/results/mnesia_diff_atoms_race1 b/lib/dialyzer/test/race_SUITE_data/results/mnesia_diff_atoms_race1
new file mode 100644
index 0000000000..f5e544dc2a
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/mnesia_diff_atoms_race1
@@ -0,0 +1,2 @@
+
+mnesia_diff_atoms_race1.erl:33: The call mnesia:dirty_write(Table::'employee' | 'employer',Record::#employee{salary::number()}) might have an unintended effect due to a possible race condition caused by its combination with the mnesia:dirty_read(Tab::'employee',Eno::any()) call in mnesia_diff_atoms_race1.erl on line 19
diff --git a/lib/dialyzer/test/race_SUITE_data/results/mnesia_diff_atoms_race2 b/lib/dialyzer/test/race_SUITE_data/results/mnesia_diff_atoms_race2
new file mode 100644
index 0000000000..0ad0bc0afd
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/mnesia_diff_atoms_race2
@@ -0,0 +1,2 @@
+
+mnesia_diff_atoms_race2.erl:37: The call mnesia:dirty_write(Record::#employee{salary::number()} | #employer{}) might have an unintended effect due to a possible race condition caused by its combination with the mnesia:dirty_read(Tab::'employee',Eno::any()) call in mnesia_diff_atoms_race2.erl on line 26
diff --git a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_one_write_two b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_one_write_two
new file mode 100644
index 0000000000..a4f3c269f1
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_one_write_two
@@ -0,0 +1,2 @@
+
+mnesia_dirty_read_one_write_two.erl:20: The call mnesia:dirty_write('employee',New::#employee{salary::number()}) might have an unintended effect due to a possible race condition caused by its combination with the mnesia:dirty_read({'employee',_}) call in mnesia_dirty_read_one_write_two.erl on line 17
diff --git a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_two_write_one b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_two_write_one
new file mode 100644
index 0000000000..6e666d755f
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_two_write_one
@@ -0,0 +1,2 @@
+
+mnesia_dirty_read_two_write_one.erl:20: The call mnesia:dirty_write(New::#employee{salary::number()}) might have an unintended effect due to a possible race condition caused by its combination with the mnesia:dirty_read('employee',Eno::any()) call in mnesia_dirty_read_two_write_one.erl on line 17
diff --git a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double1 b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double1
new file mode 100644
index 0000000000..e953c6948b
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double1
@@ -0,0 +1,2 @@
+
+mnesia_dirty_read_write_double1.erl:20: The call mnesia:dirty_write('employee',New::#employee{salary::number()}) might have an unintended effect due to a possible race condition caused by its combination with the mnesia:dirty_read('employee',Eno::any()) call in mnesia_dirty_read_write_double1.erl on line 17
diff --git a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double2 b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double2
new file mode 100644
index 0000000000..2a0b4eddd0
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double2
@@ -0,0 +1,2 @@
+
+mnesia_dirty_read_write_double2.erl:20: The call mnesia:dirty_write(New::#employee{salary::number()}) might have an unintended effect due to a possible race condition caused by its combination with the mnesia:dirty_read({'employee',_}) call in mnesia_dirty_read_write_double2.erl on line 17
diff --git a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double3 b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double3
new file mode 100644
index 0000000000..fe51a5e838
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double3
@@ -0,0 +1,2 @@
+
+mnesia_dirty_read_write_double3.erl:20: The call mnesia:dirty_write('employee',New::#employee{salary::number()}) might have an unintended effect due to a possible race condition caused by its combination with the mnesia:dirty_read({'employee',_}) call in mnesia_dirty_read_write_double3.erl on line 17
diff --git a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double4 b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double4
new file mode 100644
index 0000000000..d6a60d847a
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double4
@@ -0,0 +1,2 @@
+
+mnesia_dirty_read_write_double4.erl:20: The call mnesia:dirty_write(New::#employee{salary::number()}) might have an unintended effect due to a possible race condition caused by its combination with the mnesia:dirty_read('employee',Eno::any()) call in mnesia_dirty_read_write_double4.erl on line 17
diff --git a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_one b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_one
new file mode 100644
index 0000000000..b47f66eb79
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_one
@@ -0,0 +1,2 @@
+
+mnesia_dirty_read_write_one.erl:20: The call mnesia:dirty_write(New::#employee{salary::number()}) might have an unintended effect due to a possible race condition caused by its combination with the mnesia:dirty_read({'employee',_}) call in mnesia_dirty_read_write_one.erl on line 17
diff --git a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_two b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_two
new file mode 100644
index 0000000000..2faf55fe72
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_two
@@ -0,0 +1,2 @@
+
+mnesia_dirty_read_write_two.erl:20: The call mnesia:dirty_write('employee',New::#employee{salary::number()}) might have an unintended effect due to a possible race condition caused by its combination with the mnesia:dirty_read('employee',Eno::any()) call in mnesia_dirty_read_write_two.erl on line 17
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow1 b/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow1
new file mode 100644
index 0000000000..0fcf13c50a
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow1
@@ -0,0 +1,2 @@
+
+whereis_control_flow1.erl:13: The call erlang:register(AnAtom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_control_flow1.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow2 b/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow2
new file mode 100644
index 0000000000..d0c048701d
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow2
@@ -0,0 +1,3 @@
+
+whereis_control_flow2.erl:14: The call erlang:register(AnAtom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_control_flow2.erl on line 8
+whereis_control_flow2.erl:15: The call erlang:register(AnAtom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_control_flow2.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow3 b/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow3
new file mode 100644
index 0000000000..0d93428758
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow3
@@ -0,0 +1,2 @@
+
+whereis_control_flow3.erl:25: The call erlang:register(AnAtom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_control_flow3.erl on line 11, the erlang:whereis(AnAtom::any()) call in whereis_control_flow3.erl on line 18
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow4 b/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow4
new file mode 100644
index 0000000000..f0ce12d0a4
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow4
@@ -0,0 +1,3 @@
+
+whereis_control_flow4.erl:18: The call erlang:register('maria',Pid1::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis('maria') call in whereis_control_flow4.erl on line 8
+whereis_control_flow4.erl:19: The call erlang:register('kostis',Pid2::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis('kostis') call in whereis_control_flow4.erl on line 13
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow5 b/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow5
new file mode 100644
index 0000000000..fd809139e4
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow5
@@ -0,0 +1,2 @@
+
+whereis_control_flow5.erl:11: The call erlang:unregister(AnAtom::atom()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_control_flow5.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow6 b/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow6
new file mode 100644
index 0000000000..ba89cc5624
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow6
@@ -0,0 +1,2 @@
+
+whereis_control_flow6.erl:11: The call erlang:unregister('kostis') might fail due to a possible race condition caused by its combination with the erlang:whereis('kostis') call in whereis_control_flow6.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_atoms_no_race b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_atoms_no_race
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_atoms_no_race
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_atoms_race b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_atoms_race
new file mode 100644
index 0000000000..76c746e2f4
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_atoms_race
@@ -0,0 +1,2 @@
+
+whereis_diff_atoms_race.erl:34: The call erlang:register(Atom::'kostis' | 'maria',Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::'maria') call in whereis_diff_atoms_race.erl on line 14
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1 b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1
new file mode 100644
index 0000000000..14c157885f
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1
@@ -0,0 +1,3 @@
+
+whereis_diff_functions1.erl:10: The call erlang:register('master',pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis('master') call in whereis_diff_functions1.erl on line 8
+whereis_diff_functions1.erl:18: The call erlang:register(AnAtom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_functions1.erl on line 15
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_nested b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_nested
new file mode 100644
index 0000000000..c791d4b347
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_nested
@@ -0,0 +1,2 @@
+
+whereis_diff_functions1_nested.erl:23: The call erlang:register(Atom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_functions1_nested.erl on line 11
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_pathsens b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_pathsens
new file mode 100644
index 0000000000..d22e696196
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_pathsens
@@ -0,0 +1,2 @@
+
+whereis_diff_functions1_pathsens.erl:32: The call erlang:register(Atom::'kostis',Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::'kostis') call in whereis_diff_functions1_pathsens.erl on line 15, the erlang:whereis(AnAtom::'kostis') call in whereis_diff_functions1_pathsens.erl on line 22
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_twice b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_twice
new file mode 100644
index 0000000000..3024c77d91
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_twice
@@ -0,0 +1,3 @@
+
+whereis_diff_functions1_twice.erl:27: The call erlang:register(Atom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_functions1_twice.erl on line 11
+whereis_diff_functions1_twice.erl:30: The call erlang:register(Atom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::atom()) call in whereis_diff_functions1_twice.erl on line 15
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2 b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2
new file mode 100644
index 0000000000..9a22eb7e17
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2
@@ -0,0 +1,2 @@
+
+whereis_diff_functions2.erl:25: The call erlang:register(Atom::'kostis',Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::'kostis') call in whereis_diff_functions2.erl on line 13
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_nested b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_nested
new file mode 100644
index 0000000000..0e757fbccc
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_nested
@@ -0,0 +1,2 @@
+
+whereis_diff_functions2_nested.erl:20: The call erlang:register(Atom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_functions2_nested.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_pathsens b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_pathsens
new file mode 100644
index 0000000000..c102b39243
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_pathsens
@@ -0,0 +1,2 @@
+
+whereis_diff_functions2_pathsens.erl:29: The call erlang:register(Atom::atom(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_functions2_pathsens.erl on line 12, the erlang:whereis(AnAtom::any()) call in whereis_diff_functions2_pathsens.erl on line 19
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_twice b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_twice
new file mode 100644
index 0000000000..b048bc6bed
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_twice
@@ -0,0 +1,3 @@
+
+whereis_diff_functions2_twice.erl:24: The call erlang:register(Atom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_functions2_twice.erl on line 8
+whereis_diff_functions2_twice.erl:27: The call erlang:register(Atom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::atom()) call in whereis_diff_functions2_twice.erl on line 12
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions3 b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions3
new file mode 100644
index 0000000000..6d5154b411
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions3
@@ -0,0 +1,2 @@
+
+whereis_diff_functions3.erl:8: The call erlang:register(AnAtom::atom(),'undefined' | pid() | port()) might fail due to a possible race condition caused by its combination with the erlang:whereis(Atom::any()) call in whereis_diff_functions3.erl on line 11
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions3_nested b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions3_nested
new file mode 100644
index 0000000000..298c4c7178
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions3_nested
@@ -0,0 +1,2 @@
+
+whereis_diff_functions3_nested.erl:21: The call erlang:unregister(Atom::atom()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_functions3_nested.erl on line 11
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions3_pathsens b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions3_pathsens
new file mode 100644
index 0000000000..5d1ea5bda5
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions3_pathsens
@@ -0,0 +1,2 @@
+
+whereis_diff_functions3_pathsens.erl:29: The call erlang:register(Atom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_functions3_pathsens.erl on line 12, the erlang:whereis(AnAtom::any()) call in whereis_diff_functions3_pathsens.erl on line 19
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions4 b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions4
new file mode 100644
index 0000000000..cb51301f1e
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions4
@@ -0,0 +1,2 @@
+
+whereis_diff_functions4.erl:32: The call erlang:register(Atom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_functions4.erl on line 13, the erlang:whereis(AnAtom::atom()) call in whereis_diff_functions4.erl on line 17
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions5 b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions5
new file mode 100644
index 0000000000..34c477e05a
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions5
@@ -0,0 +1,2 @@
+
+whereis_diff_functions5.erl:22: The call erlang:register(Atom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_functions5.erl on line 10
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions6 b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions6
new file mode 100644
index 0000000000..8840ef4ca7
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions6
@@ -0,0 +1,2 @@
+
+whereis_diff_functions6.erl:29: The call erlang:register(Atom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_functions6.erl on line 10, the erlang:whereis(AnAtom::atom()) call in whereis_diff_functions6.erl on line 14
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules1 b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules1
new file mode 100644
index 0000000000..8f7d0b7a17
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules1
@@ -0,0 +1,2 @@
+
+whereis_diff_modules2.erl:11: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_modules1.erl on line 10
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules1_pathsens b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules1_pathsens
new file mode 100644
index 0000000000..40d36eb7d2
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules1_pathsens
@@ -0,0 +1,2 @@
+
+whereis_diff_modules2_pathsens.erl:12: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_modules1_pathsens.erl on line 12, the erlang:whereis(AnAtom::any()) call in whereis_diff_modules1_pathsens.erl on line 19
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules1_rec b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules1_rec
new file mode 100644
index 0000000000..278b679aba
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules1_rec
@@ -0,0 +1,2 @@
+
+whereis_diff_modules1_rec.erl:10: The call erlang:register(AnAtom::any(),Id::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(NextAtom::any()) call in whereis_diff_modules1_rec.erl on line 12
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules2 b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules2
new file mode 100644
index 0000000000..a4e5a000e2
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules2
@@ -0,0 +1,2 @@
+
+whereis_diff_modules3.erl:8: The call erlang:register(AnAtom::atom(),'undefined' | pid() | port()) might fail due to a possible race condition caused by its combination with the erlang:whereis(Atom::any()) call in whereis_diff_modules4.erl on line 11
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules2_pathsens b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules2_pathsens
new file mode 100644
index 0000000000..cc93133019
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules2_pathsens
@@ -0,0 +1,2 @@
+
+whereis_diff_modules4_pathsens.erl:13: The call erlang:register(Atom::atom(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_modules3_pathsens.erl on line 12, the erlang:whereis(AnAtom::any()) call in whereis_diff_modules3_pathsens.erl on line 19
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules2_rec b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules2_rec
new file mode 100644
index 0000000000..8874ab3553
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules2_rec
@@ -0,0 +1,2 @@
+
+whereis_diff_modules3_rec.erl:13: The call erlang:register(AnAtom::any(),Id::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(NextAtom::any()) call in whereis_diff_modules3_rec.erl on line 15
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules3 b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules3
new file mode 100644
index 0000000000..8e839a53dc
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules3
@@ -0,0 +1,2 @@
+
+whereis_diff_modules6.erl:11: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_modules5.erl on line 10, the erlang:whereis(AnAtom::atom()) call in whereis_diff_modules5.erl on line 14
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules_nested b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules_nested
new file mode 100644
index 0000000000..9192dc0708
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules_nested
@@ -0,0 +1,2 @@
+
+whereis_diff_modules3_nested.erl:11: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_modules1_nested.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules_twice b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules_twice
new file mode 100644
index 0000000000..3758347255
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules_twice
@@ -0,0 +1,3 @@
+
+whereis_diff_modules2_twice.erl:11: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::atom()) call in whereis_diff_modules1_twice.erl on line 12
+whereis_diff_modules2_twice.erl:8: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_modules1_twice.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_vars_no_race b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_vars_no_race
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_vars_no_race
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_vars_race b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_vars_race
new file mode 100644
index 0000000000..e34b4d2138
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_vars_race
@@ -0,0 +1,2 @@
+
+whereis_diff_vars_race.erl:16: The call erlang:register(Atom2::any(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(Atom1::any()) call in whereis_diff_vars_race.erl on line 13
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module1 b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module1
new file mode 100644
index 0000000000..3ed6f50d8d
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module1
@@ -0,0 +1,2 @@
+
+whereis_intra_inter_module2.erl:11: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_intra_inter_module1.erl on line 10
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module2 b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module2
new file mode 100644
index 0000000000..737054fe67
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module2
@@ -0,0 +1,2 @@
+
+whereis_intra_inter_module4.erl:14: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_intra_inter_module3.erl on line 10
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module3 b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module3
new file mode 100644
index 0000000000..4111498efe
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module3
@@ -0,0 +1,2 @@
+
+whereis_intra_inter_module6.erl:14: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_intra_inter_module5.erl on line 10
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module4 b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module4
new file mode 100644
index 0000000000..4e70a8efa1
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module4
@@ -0,0 +1,2 @@
+
+whereis_intra_inter_module7.erl:8: The call erlang:register(AnAtom::atom(),pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_intra_inter_module8.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module5 b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module5
new file mode 100644
index 0000000000..f6a10f52fd
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module5
@@ -0,0 +1,2 @@
+
+whereis_intra_inter_module9.erl:8: The call erlang:register(AnAtom::atom(),pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_intra_inter_module10.erl on line 11
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module6 b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module6
new file mode 100644
index 0000000000..a8623ee985
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module6
@@ -0,0 +1,2 @@
+
+whereis_intra_inter_module12.erl:14: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_intra_inter_module11.erl on line 10, the erlang:whereis(AnAtom::any()) call in whereis_intra_inter_module11.erl on line 21
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module7 b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module7
new file mode 100644
index 0000000000..e39d630c75
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module7
@@ -0,0 +1,2 @@
+
+whereis_intra_inter_module14.erl:11: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_intra_inter_module13.erl on line 10, the erlang:whereis(AnAtom::any()) call in whereis_intra_inter_module14.erl on line 16
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module8 b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module8
new file mode 100644
index 0000000000..58ae498bd4
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module8
@@ -0,0 +1,2 @@
+
+whereis_intra_inter_module16.erl:11: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_intra_inter_module15.erl on line 10, the erlang:whereis(AnAtom::any()) call in whereis_intra_inter_module16.erl on line 16
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_param b/lib/dialyzer/test/race_SUITE_data/results/whereis_param
new file mode 100644
index 0000000000..fb7563b1c7
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_param
@@ -0,0 +1,2 @@
+
+whereis_param.erl:8: The call erlang:register(AnAtom::atom(),pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_param.erl on line 11
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_param_inter_module b/lib/dialyzer/test/race_SUITE_data/results/whereis_param_inter_module
new file mode 100644
index 0000000000..fc3e9ca59d
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_param_inter_module
@@ -0,0 +1,2 @@
+
+whereis_param_inter_module1.erl:8: The call erlang:register(AnAtom::atom(),pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_param_inter_module2.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function1 b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function1
new file mode 100644
index 0000000000..2cf1960d65
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function1
@@ -0,0 +1,2 @@
+
+whereis_rec_function1.erl:14: The call erlang:register(AnAtom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_rec_function1.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function2 b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function2
new file mode 100644
index 0000000000..4b55bc61ad
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function2
@@ -0,0 +1,2 @@
+
+whereis_rec_function2.erl:13: The call erlang:register(AnAtom::atom(),Id::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(NextAtom::any()) call in whereis_rec_function2.erl on line 15
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function3 b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function3
new file mode 100644
index 0000000000..638e9b0f4b
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function3
@@ -0,0 +1,2 @@
+
+whereis_rec_function3.erl:13: The call erlang:register(AnAtom::atom(),Id::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(NextAtom::any()) call in whereis_rec_function3.erl on line 16, the erlang:whereis(NextAtom::atom()) call in whereis_rec_function3.erl on line 20
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function4 b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function4
new file mode 100644
index 0000000000..f255cb8170
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function4
@@ -0,0 +1,2 @@
+
+whereis_rec_function4.erl:13: The call erlang:register(AnAtom::atom(),Id::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(NextAtom::any()) call in whereis_rec_function4.erl on line 15
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function5 b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function5
new file mode 100644
index 0000000000..78d81b9a57
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function5
@@ -0,0 +1,2 @@
+
+whereis_rec_function5.erl:10: The call erlang:register(AnAtom::any(),Id::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(NextAtom::any()) call in whereis_rec_function5.erl on line 12
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function6 b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function6
new file mode 100644
index 0000000000..6df6de1922
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function6
@@ -0,0 +1,2 @@
+
+whereis_rec_function6.erl:10: The call erlang:register(AnAtom::any(),Id::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(NextAtom::any()) call in whereis_rec_function6.erl on line 12
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function7 b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function7
new file mode 100644
index 0000000000..f3ddb0b537
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function7
@@ -0,0 +1,2 @@
+
+whereis_rec_function7.erl:15: The call erlang:register(AnAtom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_rec_function7.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function8 b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function8
new file mode 100644
index 0000000000..9d731ada29
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function8
@@ -0,0 +1,2 @@
+
+whereis_rec_function8.erl:18: The call erlang:register(AnAtom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_rec_function8.erl on line 11
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_try_catch b/lib/dialyzer/test/race_SUITE_data/results/whereis_try_catch
new file mode 100644
index 0000000000..fecb0756bd
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_try_catch
@@ -0,0 +1,3 @@
+
+whereis_try_catch.erl:13: The call erlang:register('master',Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis('master') call in whereis_try_catch.erl on line 8
+whereis_try_catch.erl:21: The call erlang:register('master',Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis('master') call in whereis_try_catch.erl on line 18
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars1 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars1
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars1
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars10 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars10
new file mode 100644
index 0000000000..36a59096e0
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars10
@@ -0,0 +1,2 @@
+
+whereis_vars10.erl:17: The call erlang:register(OtherAtom::'kostis',Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars10.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars11 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars11
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars11
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars12 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars12
new file mode 100644
index 0000000000..d34e1b1c7e
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars12
@@ -0,0 +1,2 @@
+
+whereis_vars12.erl:16: The call erlang:register(OtherAtom::'kostis',Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars12.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars13 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars13
new file mode 100644
index 0000000000..e6ae40cee0
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars13
@@ -0,0 +1,2 @@
+
+whereis_vars13.erl:16: The call erlang:register(OtherAtom::'kostis',APid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars13.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars14 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars14
new file mode 100644
index 0000000000..cdd23a7471
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars14
@@ -0,0 +1,2 @@
+
+whereis_vars14.erl:16: The call erlang:register(OtherAtom::'kostis',APid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars14.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars15 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars15
new file mode 100644
index 0000000000..7f79852978
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars15
@@ -0,0 +1,2 @@
+
+whereis_vars15.erl:17: The call erlang:register(OtherAtom::'kostis',Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars15.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars16 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars16
new file mode 100644
index 0000000000..0f28dff25d
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars16
@@ -0,0 +1,2 @@
+
+whereis_vars16.erl:17: The call erlang:register(OtherAtom::any(),APid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars16.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars17 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars17
new file mode 100644
index 0000000000..3681c1aa9f
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars17
@@ -0,0 +1,2 @@
+
+whereis_vars17.erl:17: The call erlang:register(OtherAtom::any(),APid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars17.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars18 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars18
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars18
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars19 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars19
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars19
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars2 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars2
new file mode 100644
index 0000000000..1636a6e908
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars2
@@ -0,0 +1,2 @@
+
+whereis_vars2.erl:14: The call erlang:register(OtherAtom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars2.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars20 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars20
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars20
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars21 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars21
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars21
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars22 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars22
new file mode 100644
index 0000000000..0f258cc097
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars22
@@ -0,0 +1,2 @@
+
+whereis_vars22.erl:21: The call erlang:register(OtherAtom::'kostis',Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars22.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars3 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars3
new file mode 100644
index 0000000000..4f43b9adca
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars3
@@ -0,0 +1,2 @@
+
+whereis_vars3.erl:14: The call erlang:register(OtherAtom::atom(),APid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars3.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars4 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars4
new file mode 100644
index 0000000000..9eb833c42a
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars4
@@ -0,0 +1,2 @@
+
+whereis_vars4.erl:14: The call erlang:register(OtherAtom::atom() | pid(),APid::atom() | pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars4.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars5 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars5
new file mode 100644
index 0000000000..b1c269c020
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars5
@@ -0,0 +1,2 @@
+
+whereis_vars5.erl:16: The call erlang:register(OtherAtom::'kostis',Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars5.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars6 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars6
new file mode 100644
index 0000000000..88c58cfdf2
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars6
@@ -0,0 +1,2 @@
+
+whereis_vars6.erl:16: The call erlang:register(OtherAtom::'kostis',APid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars6.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars7 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars7
new file mode 100644
index 0000000000..8924869634
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars7
@@ -0,0 +1,2 @@
+
+whereis_vars7.erl:16: The call erlang:register(OtherAtom::'kostis',APid::atom() | pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars7.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars8 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars8
new file mode 100644
index 0000000000..d9d8f3872f
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars8
@@ -0,0 +1,2 @@
+
+whereis_vars8.erl:16: The call erlang:register(OtherAtom::'kostis',Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars8.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars9 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars9
new file mode 100644
index 0000000000..da52ca1f82
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars9
@@ -0,0 +1,2 @@
+
+whereis_vars9.erl:16: The call erlang:register(OtherAtom::'kostis',Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars9.erl on line 8
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args1.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args1.erl
new file mode 100644
index 0000000000..0039195e0a
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args1.erl
@@ -0,0 +1,17 @@
+%% This tests the presence of possible races due to an ets:lookup/ets:insert
+%% combination. It takes into account the argument types of the calls.
+
+-module(ets_insert_args1).
+-export([start/0]).
+
+start() ->
+ F = fun(T) -> [{_, N}] = ets:lookup(T, counter),
+ ets:insert(T, [{counter, N+1}])
+ end,
+ io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
+ ets:insert(foo, {counter, 0}),
+ io:format("Inserted ~w\n", [{counter, 0}]),
+ F(foo),
+ io:format("Update complete\n", []),
+ ObjectList = ets:lookup(foo, counter),
+ io:format("Counter: ~w\n", [ObjectList]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args2.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args2.erl
new file mode 100644
index 0000000000..c1857eb58b
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args2.erl
@@ -0,0 +1,17 @@
+%% This tests the presence of possible races due to an ets:lookup/ets:insert
+%% combination. It takes into account the argument types of the calls.
+
+-module(ets_insert_args2).
+-export([start/0]).
+
+start() ->
+ F = fun(T)-> [{_, N}] = ets:lookup(T, counter),
+ ets:insert(T, [{counter, N+1}, {maria, N+1}, {kostis, N+1}])
+ end,
+ io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
+ ets:insert(foo, {counter, 0}),
+ io:format("Inserted ~w\n", [{counter, 0}]),
+ F(foo),
+ io:format("Update complete\n", []),
+ ObjectList = ets:lookup(foo, counter),
+ io:format("Counter: ~w\n", [ObjectList]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args3.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args3.erl
new file mode 100644
index 0000000000..74401b76fd
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args3.erl
@@ -0,0 +1,17 @@
+%% This tests the presence of possible races due to an ets:lookup/ets:insert
+%% combination. It takes into account the argument types of the calls.
+
+-module(ets_insert_args3).
+-export([start/0]).
+
+start() ->
+ F = fun(T)-> [{_, N}] = ets:lookup(T, counter),
+ ets:insert(T, [{maria, N+1}, {kostis, N+1}])
+ end,
+ io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
+ ets:insert(foo, {counter, 0}),
+ io:format("Inserted ~w\n", [{counter, 0}]),
+ F(foo),
+ io:format("Update complete\n", []),
+ ObjectList = ets:lookup(foo, counter),
+ io:format("Counter: ~w\n", [ObjectList]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args4.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args4.erl
new file mode 100644
index 0000000000..2c892074ec
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args4.erl
@@ -0,0 +1,17 @@
+%% This tests the presence of possible races due to an ets:lookup/ets:insert
+%% combination. It takes into account the argument types of the calls.
+
+-module(ets_insert_args4).
+-export([start/0]).
+
+start() ->
+ F = fun(T)-> [{_, N}] = ets:lookup(T, counter),
+ ets:insert(T, {counter, N+1})
+ end,
+ io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
+ ets:insert(foo, {counter, 0}),
+ io:format("Inserted ~w\n", [{counter, 0}]),
+ F(foo),
+ io:format("Update complete\n", []),
+ ObjectList = ets:lookup(foo, counter),
+ io:format("Counter: ~w\n", [ObjectList]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args5.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args5.erl
new file mode 100644
index 0000000000..156f555a7c
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args5.erl
@@ -0,0 +1,17 @@
+%% This tests the presence of possible races due to an ets:lookup/ets:insert
+%% combination. It takes into account the argument types of the calls.
+
+-module(ets_insert_args5).
+-export([start/0]).
+
+start() ->
+ F = fun(T)-> [{_, N}] = ets:lookup(T, counter),
+ ets:insert(T, {counter, N+1, N+2})
+ end,
+ io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
+ ets:insert(foo, {counter, 0, 0}),
+ io:format("Inserted ~w\n", [{counter, 0, 0}]),
+ F(foo),
+ io:format("Update complete\n", []),
+ ObjectList = ets:lookup(foo, counter),
+ io:format("Counter: ~w\n", [ObjectList]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args6.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args6.erl
new file mode 100644
index 0000000000..1e5887f76d
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args6.erl
@@ -0,0 +1,17 @@
+%% This tests the presence of possible races due to an ets:lookup/ets:insert
+%% combination. It takes into account the argument types of the calls.
+
+-module(ets_insert_args6).
+-export([start/0]).
+
+start() ->
+ F = fun(T)-> [{_, N}] = ets:lookup(T, counter),
+ ets:insert(T, [{counter, N+1, N+2}])
+ end,
+ io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
+ ets:insert(foo, {counter, 0, 0}),
+ io:format("Inserted ~w\n", [{counter, 0, 0}]),
+ F(foo),
+ io:format("Update complete\n", []),
+ ObjectList = ets:lookup(foo, counter),
+ io:format("Counter: ~w\n", [ObjectList]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args7.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args7.erl
new file mode 100644
index 0000000000..912bbf7073
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args7.erl
@@ -0,0 +1,17 @@
+%% This tests the presence of possible races due to an ets:lookup/ets:insert
+%% combination. It takes into account the argument types of the calls.
+
+-module(ets_insert_args7).
+-export([test/0]).
+
+test() ->
+ Foo = foo,
+ ets:new(Foo, [named_table, public]),
+ race(Foo).
+
+race(Tab) ->
+ [{_, N}] = ets:lookup(Tab, counter),
+ aux(Tab, N).
+
+aux(Table, N) ->
+ ets:insert(Table, [{counter, N+1}]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args8.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args8.erl
new file mode 100644
index 0000000000..275cf0291c
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args8.erl
@@ -0,0 +1,16 @@
+%% This tests the presence of possible races due to an ets:lookup/ets:insert
+%% combination. It takes into account the argument types of the calls.
+
+-module(ets_insert_args8).
+-export([test/1]).
+
+test(Foo) ->
+ ets:new(Foo, [named_table, public]),
+ race(Foo).
+
+race(Tab) ->
+ [{_, N}] = ets:lookup(Tab, counter),
+ aux(Tab, N).
+
+aux(Table, N) ->
+ ets:insert(Table, [{counter, N+1}]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow1.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow1.erl
new file mode 100644
index 0000000000..cfe0b2b727
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow1.erl
@@ -0,0 +1,20 @@
+%% This tests the presence of possible races due to an ets:lookup/ets:insert
+%% combination. It takes into account control flow that might exist.
+
+-module(ets_insert_control_flow1).
+-export([start/0]).
+
+start() ->
+ io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
+ ets:insert(foo, {random, random:uniform(maria:get_int())}),
+ io:format("Inserted ~w\n", [{_, N}] = ets:lookup(foo, random)),
+ case (N rem 2 == 0) of
+ true ->
+ io:format("\nInserted an even number\n", []),
+ io:format("\nWill make it odd\n", []),
+ ets:insert(foo, {random, N+1});
+ false -> ok
+ end,
+ io:format("Update complete\n", []),
+ ObjectList = ets:lookup(foo, random),
+ io:format("Random odd integer: ~w\n", [ObjectList]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow2.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow2.erl
new file mode 100644
index 0000000000..d160418bdb
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow2.erl
@@ -0,0 +1,26 @@
+%% This tests the presence of possible races due to an ets:lookup/ets:insert
+%% combination. It takes into account control flow that might exist.
+
+-module(ets_insert_control_flow2).
+-export([start/0]).
+
+start() ->
+ io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
+ ets:insert(foo, {random, random:uniform(150)}),
+ io:format("Inserted ~w\n", [{_, N}] = ets:lookup(foo, random)),
+ case (N rem 2 == 0) of
+ true ->
+ io:format("\nInserted an even integer\n", []),
+ io:format("\nWill make it odd and generate password\n", []),
+ ets:insert(foo, [{random, N+1}, {pass, generate_password(N)}]);
+ false ->
+ io:format("\nInserted an odd integer\n", []),
+ io:format("\nWill make it even and generate password\n", []),
+ ets:insert(foo, [{random, N+1}, {pass, generate_password(N)}])
+ end,
+ io:format("Update complete\n", []),
+ ObjectList = ets:lookup(foo, pass),
+ io:format("New password: ~w\n", [ObjectList]).
+
+generate_password(N) ->
+ lists:map(fun (_) -> random:uniform(90)+$\s+1 end, lists:seq(1,N)).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow3.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow3.erl
new file mode 100644
index 0000000000..9c6a22eb05
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow3.erl
@@ -0,0 +1,31 @@
+%% This tests the presence of possible races due to an ets:lookup/ets:insert
+%% combination. It takes into account control flow that might exist.
+
+-module(ets_insert_control_flow3).
+-export([start/1]).
+
+start(User) ->
+ Table = ets:new(table, [public]),
+ mod:process(Table),
+ [{_, N}] =
+ case User of
+ root -> ets:lookup(Table, root);
+ user -> ets:lookup(Table, user);
+ Other -> [{undefined, -1}]
+ end,
+ case N of
+ -1 -> io:format("\nUnknown User\n", []);
+ 0 ->
+ case User of
+ root ->
+ ets:insert(Table, {User, Pass = generate_password(N) ++ generate_password(N+1)});
+ user ->
+ ets:insert(Table, {User, Pass = generate_password(N)})
+ end,
+ io:format("\nYour new pass is ~w\n", [Pass]);
+ P ->
+ io:format("\nYour pass is ~w\n", [P])
+ end.
+
+generate_password(N) ->
+ lists:map(fun (_) -> random:uniform(90)+$\s+1 end, lists:seq(1,N)).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow4.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow4.erl
new file mode 100644
index 0000000000..caa3804614
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow4.erl
@@ -0,0 +1,31 @@
+%% This tests the presence of possible races due to an ets:lookup/ets:insert
+%% combination. It takes into account control flow that might exist.
+
+-module(ets_insert_control_flow4).
+-export([start/1]).
+
+start(User) ->
+ Table = ets:new(table, [public]),
+ mod:process(Table),
+ [{_, N}] =
+ case User of
+ root -> ets:lookup(Table, pass);
+ user -> ets:lookup(Table, pass);
+ _Other -> [{undefined, -1}]
+ end,
+ case N of
+ -1 -> io:format("\nUnknown User\n", []);
+ 0 ->
+ case User of
+ root ->
+ ets:insert(Table, {pass, Pass = generate_password(N) ++ generate_password(N+1)});
+ user ->
+ ets:insert(Table, {pass, Pass = generate_password(N)})
+ end,
+ io:format("\nYour new pass is ~w\n", [Pass]);
+ P ->
+ io:format("\nYour pass is ~w\n", [P])
+ end.
+
+generate_password(N) ->
+ lists:map(fun (_) -> random:uniform(90)+$\s+1 end, lists:seq(1,N)).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow5.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow5.erl
new file mode 100644
index 0000000000..b19fd776ec
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow5.erl
@@ -0,0 +1,34 @@
+%% This tests the presence of possible races due to an ets:lookup/ets:insert
+%% combination. It takes into account control flow that might exist.
+
+-module(ets_insert_control_flow5).
+-export([start/1]).
+
+start(User) ->
+ Table = ets:new(table, [public]),
+ mod:process(Table),
+ [{_, N}] =
+ case User of
+ root -> ets:lookup(Table, pass);
+ user -> ets:lookup(Table, pass);
+ Other -> [{undefined, -1}]
+ end,
+ [{_, Msg}] = ets:lookup(Table, welcome_msg),
+ case N of
+ -1 -> io:format("\nUnknown User\n", []);
+ 0 ->
+ case User of
+ root ->
+ ets:insert(Table, {welcome_msg, Msg ++ "root"}),
+ ets:insert(Table, {pass, Pass = generate_password(N) ++ generate_password(N+1)});
+ user ->
+ ets:insert(Table, {welcome_msg, Msg ++ "user"}),
+ ets:insert(Table, {pass, Pass = generate_password(N)})
+ end,
+ io:format("\nYour new pass is ~w\n", [Pass]);
+ P ->
+ io:format("\nYour pass is ~w\n", [P])
+ end.
+
+generate_password(N) ->
+ lists:map(fun (_) -> random:uniform(90)+$\s+1 end, lists:seq(1,N)).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race1.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race1.erl
new file mode 100644
index 0000000000..7b2dbb8eff
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race1.erl
@@ -0,0 +1,22 @@
+%% This tests that the race condition detection between ets:lookup/
+%% ets:insert is robust even when the functions are called with
+%% different atoms as arguments.
+
+-module(ets_insert_diff_atoms_race1).
+-export([test/0]).
+
+test() ->
+ ets:new(foo, [named_table, public]),
+ {race(foo), no_race(foo)}.
+
+race(Tab) ->
+ [{_, N}] = ets:lookup(Tab, counter),
+ aux(Tab, N).
+
+no_race(Tab) ->
+ [{_, N}] = ets:lookup(Tab, counter),
+ AnotherTab = bar,
+ aux(AnotherTab, N).
+
+aux(Table, N) ->
+ ets:insert(Table, [{counter, N+1}]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race2.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race2.erl
new file mode 100644
index 0000000000..d7afc79d07
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race2.erl
@@ -0,0 +1,22 @@
+%% This tests that the race condition detection between ets:lookup/
+%% ets:insert is robust even when the functions are called with
+%% different atoms as arguments.
+
+-module(ets_insert_diff_atoms_race2).
+-export([test/0]).
+
+test() ->
+ ets:new(foo, [named_table, public]),
+ {race(foo, counter), no_race(foo, counter)}.
+
+race(Tab, Counter) ->
+ [{_, N}] = ets:lookup(Tab, Counter),
+ aux(Tab, Counter, N).
+
+no_race(Tab, Counter) ->
+ [{_, N}] = ets:lookup(Tab, Counter),
+ AnotherTab = bar,
+ aux(AnotherTab, Counter, N).
+
+aux(Table, Counter, N) ->
+ ets:insert(Table, [{Counter, N+1}]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race3.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race3.erl
new file mode 100644
index 0000000000..e05e9be54b
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race3.erl
@@ -0,0 +1,22 @@
+%% This tests that the race condition detection between ets:lookup/
+%% ets:insert is robust even when the functions are called with
+%% different atoms as arguments.
+
+-module(ets_insert_diff_atoms_race3).
+-export([test/0]).
+
+test() ->
+ ets:new(foo, [named_table, public]),
+ {race(foo), no_race(foo)}.
+
+race(Tab) ->
+ [{_, N}] = ets:lookup(Tab, counter),
+ aux(Tab, N).
+
+no_race(Tab) ->
+ [{_, N}] = ets:lookup(Tab, counter),
+ AnotherTab = bar,
+ aux(AnotherTab, N).
+
+aux(Table, N) ->
+ ets:insert(Table, {counter, N+1}).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race4.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race4.erl
new file mode 100644
index 0000000000..e2a3588f41
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race4.erl
@@ -0,0 +1,22 @@
+%% This tests that the race condition detection between ets:lookup/
+%% ets:insert is robust even when the functions are called with
+%% different atoms as arguments.
+
+-module(ets_insert_diff_atoms_race4).
+-export([test/0]).
+
+test() ->
+ ets:new(foo, [named_table, public]),
+ {race(foo, counter), no_race(foo, counter)}.
+
+race(Tab, Counter) ->
+ [{_, N}] = ets:lookup(Tab, Counter),
+ aux(Tab, Counter, N).
+
+no_race(Tab, Counter) ->
+ [{_, N}] = ets:lookup(Tab, Counter),
+ AnotherTab = bar,
+ aux(AnotherTab, Counter, N).
+
+aux(Table, Counter, N) ->
+ ets:insert(Table, {Counter, N+1}).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race5.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race5.erl
new file mode 100644
index 0000000000..dd53387c11
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race5.erl
@@ -0,0 +1,22 @@
+%% This tests that the race condition detection between ets:lookup/
+%% ets:insert is robust even when the functions are called with
+%% different atoms as arguments.
+
+-module(ets_insert_diff_atoms_race5).
+-export([test/0]).
+
+test() ->
+ ets:new(foo, [named_table, public]),
+ {race(foo, counter), no_race(foo, counter)}.
+
+race(Tab, Counter) ->
+ [{_, N}] = ets:lookup(Tab, Counter),
+ aux(Tab, Counter, N).
+
+no_race(Tab, Counter) ->
+ [{_, N}] = ets:lookup(Tab, Counter),
+ AnotherCounter = index,
+ aux(Tab, AnotherCounter, N).
+
+aux(Table, Counter, N) ->
+ ets:insert(Table, [{Counter, N+1}]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race6.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race6.erl
new file mode 100644
index 0000000000..ec0a0eaadf
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race6.erl
@@ -0,0 +1,22 @@
+%% This tests that the race condition detection between ets:lookup/
+%% ets:insert is robust even when the functions are called with
+%% different atoms as arguments.
+
+-module(ets_insert_diff_atoms_race6).
+-export([test/0]).
+
+test() ->
+ ets:new(foo, [named_table, public]),
+ {race(foo, counter), no_race(foo, counter)}.
+
+race(Tab, Counter) ->
+ [{_, N}] = ets:lookup(Tab, Counter),
+ aux(Tab, Counter, N).
+
+no_race(Tab, Counter) ->
+ [{_, N}] = ets:lookup(Tab, Counter),
+ AnotherCounter = index,
+ aux(Tab, AnotherCounter, N).
+
+aux(Table, Counter, N) ->
+ ets:insert(Table, {Counter, N+1}).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_double1.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_double1.erl
new file mode 100644
index 0000000000..d5b6689eb1
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_double1.erl
@@ -0,0 +1,28 @@
+%% This tests the presence of possible races due to an ets:lookup/ets:insert
+%% combination. It takes into account multiple ets:inserts that might exist.
+
+-module(ets_insert_double1).
+-export([start/0]).
+
+start() ->
+ io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
+ ets:insert(foo, {random, random:uniform(150)}),
+ io:format("Inserted ~w\n", [{_, N}] = ets:lookup(foo, random)),
+ case (N rem 2 == 0) of
+ true ->
+ io:format("\nInserted an even integer\n", []),
+ io:format("\nWill make it odd and generate new password\n", []),
+ ets:insert(foo, [{random, N+1}, {pass, generate_password(N)}]);
+ false ->
+ io:format("\nInserted an odd integer\n", []),
+ io:format("\nWill make it even and generate new password\n", []),
+ ets:insert(foo, [{random, N+1}, {pass, generate_password(N)}])
+ end,
+ io:format("Update complete\n", []),
+ ObjectList = ets:lookup(foo, pass),
+ io:format("New password: ~w\n", [ObjectList]),
+ ets:insert(foo, {pass, 'empty'}).
+
+generate_password(N) ->
+ [{_, P}] = ets:lookup(foo, pass),
+ lists:map(fun (_) -> random:uniform(90)+P+$\s+1 end, lists:seq(1,N)).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_double2.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_double2.erl
new file mode 100644
index 0000000000..fa653e3090
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_double2.erl
@@ -0,0 +1,28 @@
+%% This tests the presence of possible races due to an ets:lookup/ets:insert
+%% combination. It takes into account multiple ets:inserts that might exist.
+
+-module(ets_insert_double2).
+-export([start/2]).
+
+start(Random, Pass) ->
+ io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
+ ets:insert(foo, {Random, random:uniform(150)}),
+ io:format("Inserted ~w\n", [{_, N}] = ets:lookup(foo, Random)),
+ case (N rem 2 == 0) of
+ true ->
+ io:format("\nInserted an even integer\n", []),
+ io:format("\nWill make it odd and generate new password\n", []),
+ ets:insert(foo, [{Random, N+1}, {Pass, generate_password(Pass, N)}]);
+ false ->
+ io:format("\nInserted an odd integer\n", []),
+ io:format("\nWill make it even and generate new password\n", []),
+ ets:insert(foo, [{Random, N+1}, {Pass, generate_password(Pass, N)}])
+ end,
+ io:format("Update complete\n", []),
+ ObjectList = ets:lookup(foo, Pass),
+ io:format("New password: ~w\n", [ObjectList]),
+ ets:insert(foo, {Pass, 'empty'}).
+
+generate_password(Pass, N) ->
+ [{_, P}] = ets:lookup(foo, Pass),
+ lists:map(fun (_) -> random:uniform(90)+P+$\s+1 end, lists:seq(1,N)).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_funs1.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_funs1.erl
new file mode 100644
index 0000000000..b6b258fd21
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_funs1.erl
@@ -0,0 +1,18 @@
+%% This tests the presence of possible races due to an ets:lookup/ets:insert
+%% combination. It takes into account the anonymous functions.
+
+-module(ets_insert_funs1).
+-export([start/0]).
+
+start() ->
+ F = fun(T) ->
+ ets:lookup(T, counter)
+ end,
+ io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
+ ets:insert(foo, {counter, 0}),
+ io:format("Inserted ~w\n", [{counter, 0}]),
+ [{_, N}] = F(foo),
+ ets:insert(foo, [{counter, N+1}]),
+ io:format("Update complete\n", []),
+ ObjectList = ets:lookup(foo, counter),
+ io:format("Counter: ~w\n", [ObjectList]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_funs2.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_funs2.erl
new file mode 100644
index 0000000000..6b9518f314
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_funs2.erl
@@ -0,0 +1,18 @@
+%% This tests the presence of possible races due to an ets:lookup/ets:insert
+%% combination. It takes into account the anonymous functions.
+
+-module(ets_insert_funs2).
+-export([start/0]).
+
+start() ->
+ F = fun(T, N) ->
+ ets:insert(T, [{counter, N+1}])
+ end,
+ io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
+ ets:insert(foo, {counter, 0}),
+ io:format("Inserted ~w\n", [{counter, 0}]),
+ [{_, N}] = ets:lookup(foo, counter),
+ F(foo, N),
+ io:format("Update complete\n", []),
+ ObjectList = ets:lookup(foo, counter),
+ io:format("Counter: ~w\n", [ObjectList]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_new.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_new.erl
new file mode 100644
index 0000000000..63f3272912
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_new.erl
@@ -0,0 +1,15 @@
+%% This tests the presence of possible races due to an ets:lookup/ets:insert
+%% combination. It takes into account multiple ets:new calls that might exist.
+
+-module(ets_insert_new).
+-export([test/0]).
+
+test() ->
+ T1 = ets:new(foo, [public]),
+ T2 = ets:new(bar, []),
+ ets:lookup(T2, counter),
+ aux(T1),
+ aux(T2).
+
+aux(Tab) ->
+ ets:insert(Tab, {counter, 1}).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_param.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_param.erl
new file mode 100644
index 0000000000..a479a31792
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_param.erl
@@ -0,0 +1,26 @@
+%% This tests the presence of possible races due to an ets:lookup/ets:insert
+%% combination in higher order functions.
+
+-module(ets_insert_param).
+-export([start/1]).
+
+start(User) ->
+ Table = ets:new(table, [public]),
+ mod:process(Table),
+ [{_, Msg}] = ets:lookup(Table, welcome_msg),
+ case User of
+ root ->
+ ets:insert(Table, {welcome_msg, Msg ++ "root"}),
+ ets:insert(Table, {pass, Pass = generate_password(ets:lookup(Table, pass))
+ ++ generate_strong_password(ets:lookup(Table, pass))});
+ user ->
+ ets:insert(Table, {welcome_msg, Msg ++ "user"}),
+ ets:insert(Table, {pass, Pass = generate_password(ets:lookup(Table, pass))})
+ end,
+ io:format("\nYour new pass is ~w\n", [Pass]).
+
+generate_password([{_, N}]) ->
+ lists:map(fun (_) -> random:uniform(90)+$\s+1 end, lists:seq(1,N)).
+
+generate_strong_password([{_, N}]) ->
+ lists:map(fun (_) -> random:uniform(90)+$\s+1 end, lists:seq(1,(N rem 2) * 5)).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_public.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_public.erl
new file mode 100644
index 0000000000..4caa9fe8a0
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_public.erl
@@ -0,0 +1,23 @@
+%% This tests the presence of possible races due to an ets:lookup/ets:insert
+%% combination. It takes into account any public ETS tables that might exist.
+
+-module(ets_insert_public).
+
+-export([main/1]).
+
+%% Main
+main(Foo) ->
+ make_table(Foo),
+ ets:insert(Foo, {counter, 0}),
+ [{_, N}] = ets:lookup(Foo, counter),
+ NewN = N + 1,
+ ets:insert(Foo, {counter, NewN}),
+ NewN.
+
+make_table(Foo) ->
+ init(Foo).
+
+init(Foo) ->
+ ets:new(Foo, [named_table, public]),
+ ets:insert(Foo, {counter, 0}),
+ {ok, feeling_good}.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/extract_translations.erl b/lib/dialyzer/test/race_SUITE_data/src/extract_translations.erl
new file mode 100644
index 0000000000..76ffca4676
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/extract_translations.erl
@@ -0,0 +1,293 @@
+%%%----------------------------------------------------------------------
+%%% File : extract_translations.erl
+%%% Author : Sergei Golovan <[email protected]>
+%%% Purpose : Auxiliary tool for interface/messages translators
+%%% Created : 23 Apr 2005 by Sergei Golovan <[email protected]>
+%%% Id : $Id: extract_translations.erl,v 1.1 2009/08/17 09:18:59 maria Exp $
+%%%----------------------------------------------------------------------
+
+-module(extract_translations).
+-author('[email protected]').
+
+-export([start/0]).
+
+-define(STATUS_SUCCESS, 0).
+-define(STATUS_ERROR, 1).
+-define(STATUS_USAGE, 2).
+
+-include_lib("kernel/include/file.hrl").
+
+
+start() ->
+ ets:new(translations, [named_table, public]),
+ ets:new(translations_obsolete, [named_table, public]),
+ ets:new(files, [named_table, public]),
+ ets:new(vars, [named_table, public]),
+ case init:get_plain_arguments() of
+ ["-srcmsg2po", Dir, File] ->
+ print_po_header(File),
+ Status = process(Dir, File, srcmsg2po),
+ halt(Status);
+ ["-unused", Dir, File] ->
+ Status = process(Dir, File, unused),
+ halt(Status);
+ [Dir, File] ->
+ Status = process(Dir, File, used),
+ halt(Status);
+ _ ->
+ print_usage(),
+ halt(?STATUS_USAGE)
+ end.
+
+
+process(Dir, File, Used) ->
+ case load_file(File) of
+ {error, Reason} ->
+ io:format("~s: ~s~n", [File, file:format_error(Reason)]),
+ ?STATUS_ERROR;
+ _ ->
+ FileList = find_src_files(Dir),
+ lists:foreach(
+ fun(F) ->
+ parse_file(Dir, F, Used)
+ end, FileList),
+ case Used of
+ unused ->
+ ets:foldl(fun({Key, _}, _) ->
+ io:format("~p~n", [Key])
+ end, ok, translations);
+ srcmsg2po ->
+ ets:foldl(fun({Key, Trans}, _) ->
+ print_translation_obsolete(Key, Trans)
+ end, ok, translations_obsolete);
+ _ ->
+ ok
+ end,
+ ?STATUS_SUCCESS
+ end.
+
+parse_file(Dir, File, Used) ->
+ ets:delete_all_objects(vars),
+ case epp:parse_file(File, [Dir, filename:dirname(File) | code:get_path()], []) of
+ {ok, Forms} ->
+ lists:foreach(
+ fun(F) ->
+ parse_form(Dir, File, F, Used)
+ end, Forms);
+ _ ->
+ ok
+ end.
+
+parse_form(Dir, File, Form, Used) ->
+ case Form of
+ %%{undefined, Something} ->
+ %% io:format("Undefined: ~p~n", [Something]);
+ {call,
+ _,
+ {remote, _, {atom, _, translate}, {atom, _, translate}},
+ [_, {string, Line, Str}]
+ } ->
+ process_string(Dir, File, Line, Str, Used);
+ {call,
+ _,
+ {remote, _, {atom, _, translate}, {atom, _, translate}},
+ [_, {var, _, Name}]
+ } ->
+ case ets:lookup(vars, Name) of
+ [{_Name, Value, Line}] ->
+ process_string(Dir, File, Line, Value, Used);
+ _ ->
+ ok
+ end;
+ {match,
+ _,
+ {var, _, Name},
+ {string, Line, Value}
+ } ->
+ ets:insert(vars, {Name, Value, Line});
+ L when is_list(L) ->
+ lists:foreach(
+ fun(F) ->
+ parse_form(Dir, File, F, Used)
+ end, L);
+ T when is_tuple(T) ->
+ lists:foreach(
+ fun(F) ->
+ parse_form(Dir, File, F, Used)
+ end, tuple_to_list(T));
+ _ ->
+ ok
+ end.
+
+process_string(_Dir, _File, _Line, "", _Used) ->
+ ok;
+
+process_string(_Dir, File, Line, Str, Used) ->
+ case {ets:lookup(translations, Str), Used} of
+ {[{_Key, _Trans}], unused} ->
+ ets:delete(translations, Str);
+ {[{_Key, _Trans}], used} ->
+ ok;
+ {[{_Key, Trans}], srcmsg2po} ->
+ ets:delete(translations_obsolete, Str),
+ print_translation(File, Line, Str, Trans);
+ {_, used} ->
+ case ets:lookup(files, File) of
+ [{_}] ->
+ ok;
+ _ ->
+ io:format("~n% ~s~n", [File]),
+ ets:insert(files, {File})
+ end,
+ case Str of
+ [] -> ok;
+ _ -> io:format("{~p, \"\"}.~n", [Str])
+ end,
+ ets:insert(translations, {Str, ""});
+ {_, srcmsg2po} ->
+ case ets:lookup(files, File) of
+ [{_}] ->
+ ok;
+ _ ->
+ ets:insert(files, {File})
+ end,
+ ets:insert(translations, {Str, ""}),
+ print_translation(File, Line, Str, "");
+ _ ->
+ ok
+ end.
+
+load_file(File) ->
+ case file:consult(File) of
+ {ok, Terms} ->
+ lists:foreach(
+ fun({Orig, Trans}) ->
+ case Trans of
+ "" ->
+ ok;
+ _ ->
+ ets:insert(translations, {Orig, Trans}),
+ ets:insert(translations_obsolete, {Orig, Trans})
+ end
+ end, Terms);
+ Err ->
+ Err
+ end.
+
+find_src_files(Dir) ->
+ case file:list_dir(Dir) of
+ {ok, FileList} ->
+ recurse_filelist(
+ lists:map(
+ fun(F) ->
+ filename:join(Dir, F)
+ end, FileList));
+ _ ->
+ []
+ end.
+
+recurse_filelist(FileList) ->
+ recurse_filelist(FileList, []).
+
+recurse_filelist([], Acc) ->
+ lists:reverse(Acc);
+
+recurse_filelist([H | T], Acc) ->
+ case file:read_file_info(H) of
+ {ok, #file_info{type = directory}} ->
+ recurse_filelist(T, lists:reverse(find_src_files(H)) ++ Acc);
+ {ok, #file_info{type = regular}} ->
+ case string:substr(H, string:len(H) - 3) of
+ ".erl" ->
+ recurse_filelist(T, [H | Acc]);
+ ".hrl" ->
+ recurse_filelist(T, [H | Acc]);
+ _ ->
+ recurse_filelist(T, Acc)
+ end;
+ _ ->
+ recurse_filelist(T, Acc)
+ end.
+
+
+print_usage() ->
+ io:format(
+ "Usage: extract_translations [-unused] dir file~n"
+ "~n"
+ "Example:~n"
+ " extract_translations . ./msgs/ru.msg~n"
+ ).
+
+
+%%%
+%%% Gettext
+%%%
+
+print_po_header(File) ->
+ MsgProps = get_msg_header_props(File),
+ {Language, [LastT | AddT]} = prepare_props(MsgProps),
+ application:load(ejabberd),
+ {ok, Version} = application:get_key(ejabberd, vsn),
+ print_po_header(Version, Language, LastT, AddT).
+
+get_msg_header_props(File) ->
+ {ok, F} = file:open(File, [read]),
+ Lines = get_msg_header_props(F, []),
+ file:close(F),
+ Lines.
+
+get_msg_header_props(F, Lines) ->
+ String = io:get_line(F, ""),
+ case io_lib:fread("% ", String) of
+ {ok, [], RemString} ->
+ case io_lib:fread("~s", RemString) of
+ {ok, [Key], Value} when Value /= "\n" ->
+ %% The first character in Value is a blankspace:
+ %% And the last characters are 'slash n'
+ ValueClean = string:substr(Value, 2, string:len(Value)-2),
+ get_msg_header_props(F, Lines ++ [{Key, ValueClean}]);
+ _ ->
+ get_msg_header_props(F, Lines)
+ end;
+ _ ->
+ Lines
+ end.
+
+prepare_props(MsgProps) ->
+ Language = proplists:get_value("Language:", MsgProps),
+ Authors = proplists:get_all_values("Author:", MsgProps),
+ {Language, Authors}.
+
+print_po_header(Version, Language, LastTranslator, AdditionalTranslatorsList) ->
+ AdditionalTranslatorsString = build_additional_translators(AdditionalTranslatorsList),
+ HeaderString =
+ "msgid \"\"\n"
+ "msgstr \"\"\n"
+ "\"Project-Id-Version: " ++ Version ++ "\\n\"\n"
+ ++ "\"X-Language: " ++ Language ++ "\\n\"\n"
+ "\"Last-Translator: " ++ LastTranslator ++ "\\n\"\n"
+ ++ AdditionalTranslatorsString ++
+ "\"MIME-Version: 1.0\\n\"\n"
+ "\"Content-Type: text/plain; charset=UTF-8\\n\"\n"
+ "\"Content-Transfer-Encoding: 8bit\\n\"\n",
+ io:format("~s~n", [HeaderString]).
+
+build_additional_translators(List) ->
+ lists:foldl(
+ fun(T, Str) ->
+ Str ++ "\"X-Additional-Translator: " ++ T ++ "\\n\"\n"
+ end,
+ "",
+ List).
+
+print_translation(File, Line, Str, StrT) ->
+ {ok, StrQ, _} = regexp:gsub(Str, "\"", "\\\""),
+ {ok, StrTQ, _} = regexp:gsub(StrT, "\"", "\\\""),
+ io:format("#: ~s:~p~nmsgid \"~s\"~nmsgstr \"~s\"~n~n", [File, Line, StrQ, StrTQ]).
+
+print_translation_obsolete(Str, StrT) ->
+ File = "unknown.erl",
+ Line = 1,
+ {ok, StrQ, _} = regexp:gsub(Str, "\"", "\\\""),
+ {ok, StrTQ, _} = regexp:gsub(StrT, "\"", "\\\""),
+ io:format("#: ~s:~p~n#~~ msgid \"~s\"~n#~~ msgstr \"~s\"~n~n", [File, Line, StrQ, StrTQ]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/mnesia_diff_atoms_race1.erl b/lib/dialyzer/test/race_SUITE_data/src/mnesia_diff_atoms_race1.erl
new file mode 100644
index 0000000000..2f499208a2
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/mnesia_diff_atoms_race1.erl
@@ -0,0 +1,33 @@
+%% This tests that the race condition detection between mnesia:dirty_read/
+%% mnesia:dirty_write is robust even when the functions are called with
+%% different atoms as arguments.
+
+-module(mnesia_diff_atoms_race1).
+-export([test/2]).
+
+-record(employee, {emp_no,
+ name,
+ salary,
+ sex,
+ phone,
+ room_no}).
+
+test(Eno, Raise) ->
+ {race(employee, Eno, Raise), no_race(employee, Eno, Raise)}.
+
+race(Tab, Eno, Raise) ->
+ [E] = mnesia:dirty_read(Tab, Eno),
+ Salary = E#employee.salary + Raise,
+ New = E#employee{salary = Salary},
+ aux(Tab, New).
+
+no_race(Tab, Eno, Raise) ->
+ [E] = mnesia:dirty_read(Tab, Eno),
+ Salary = E#employee.salary + Raise,
+ New = E#employee{salary = Salary},
+ AnotherTab = employer,
+ aux(AnotherTab, New).
+
+
+aux(Table, Record) ->
+ mnesia:dirty_write(Table, Record).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/mnesia_diff_atoms_race2.erl b/lib/dialyzer/test/race_SUITE_data/src/mnesia_diff_atoms_race2.erl
new file mode 100644
index 0000000000..c1dcfbd8f5
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/mnesia_diff_atoms_race2.erl
@@ -0,0 +1,37 @@
+%% This tests that the race condition detection between mnesia:dirty_read/
+%% mnesia:dirty_write is robust even when the functions are called with
+%% different atoms as arguments.
+
+-module(mnesia_diff_atoms_race2).
+-export([test/2]).
+
+-record(employee, {emp_no,
+ name,
+ salary,
+ sex,
+ phone,
+ room_no}).
+
+-record(employer, {emp_no,
+ name,
+ salary,
+ sex,
+ phone,
+ room_no}).
+
+test(Eno, Raise) ->
+ {race(employee, Eno, Raise), no_race(employee, Eno, Raise)}.
+
+race(Tab, Eno, Raise) ->
+ [E] = mnesia:dirty_read(Tab, Eno),
+ Salary = E#employee.salary + Raise,
+ New = E#employee{salary = Salary},
+ aux(New).
+
+no_race(Tab, Eno, Raise) ->
+ [E] = mnesia:dirty_read(Tab, Eno),
+ AnotherRecord = #employer{},
+ aux(AnotherRecord).
+
+aux(Record) ->
+ mnesia:dirty_write(Record).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_one_write_two.erl b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_one_write_two.erl
new file mode 100644
index 0000000000..4ca62deedc
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_one_write_two.erl
@@ -0,0 +1,20 @@
+%% This tests the presence of possible races due to an mnesia:dirty_read/
+%% mnesia:dirty_write combination. It takes into account the argument types
+%% of the calls.
+
+-module(mnesia_dirty_read_one_write_two).
+-export([raise/2]).
+
+-record(employee, {emp_no,
+ name,
+ salary,
+ sex,
+ phone,
+ room_no}).
+
+
+raise(Eno, Raise) ->
+ [E] = mnesia:dirty_read({employee, Eno}),
+ Salary = E#employee.salary + Raise,
+ New = E#employee{salary = Salary},
+ mnesia:dirty_write(employee, New).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_two_write_one.erl b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_two_write_one.erl
new file mode 100644
index 0000000000..e523a03789
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_two_write_one.erl
@@ -0,0 +1,20 @@
+%% This tests the presence of possible races due to an mnesia:dirty_read/
+%% mnesia:dirty_write combination. It takes into account the argument types
+%% of the calls.
+
+-module(mnesia_dirty_read_two_write_one).
+-export([raise/2]).
+
+-record(employee, {emp_no,
+ name,
+ salary,
+ sex,
+ phone,
+ room_no}).
+
+
+raise(Eno, Raise) ->
+ [E] = mnesia:dirty_read(employee, Eno),
+ Salary = E#employee.salary + Raise,
+ New = E#employee{salary = Salary},
+ mnesia:dirty_write(New).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double1.erl b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double1.erl
new file mode 100644
index 0000000000..2bd18e4772
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double1.erl
@@ -0,0 +1,25 @@
+%% This tests the presence of possible races due to an mnesia:dirty_read/
+%% mnesia:dirty_write combination. It takes into account multiple
+%% mnesia:dirty_writes that might exist.
+
+-module(mnesia_dirty_read_write_double1).
+-export([raise/3]).
+
+-record(employee, {emp_no,
+ name,
+ salary,
+ sex,
+ phone,
+ room_no}).
+
+
+raise(Eno, Raise, Room) ->
+ [E] = mnesia:dirty_read(employee, Eno),
+ Salary = E#employee.salary + Raise,
+ New = E#employee{salary = Salary},
+ mnesia:dirty_write(employee, New),
+ move(E, Room).
+
+move(E, Room) ->
+ New = E#employee{room_no = Room},
+ mnesia:dirty_write(employee, New).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double2.erl b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double2.erl
new file mode 100644
index 0000000000..cdbfdc700a
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double2.erl
@@ -0,0 +1,25 @@
+%% This tests the presence of possible races due to an mnesia:dirty_read/
+%% mnesia:dirty_write combination. It takes into account multiple
+%% mnesia:dirty_writes that might exist.
+
+-module(mnesia_dirty_read_write_double2).
+-export([raise/3]).
+
+-record(employee, {emp_no,
+ name,
+ salary,
+ sex,
+ phone,
+ room_no}).
+
+
+raise(Eno, Raise, Room) ->
+ [E] = mnesia:dirty_read({employee, Eno}),
+ Salary = E#employee.salary + Raise,
+ New = E#employee{salary = Salary},
+ mnesia:dirty_write(New),
+ move(E, Room).
+
+move(E, Room) ->
+ New = E#employee{room_no = Room},
+ mnesia:dirty_write(New).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double3.erl b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double3.erl
new file mode 100644
index 0000000000..051524917e
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double3.erl
@@ -0,0 +1,25 @@
+%% This tests the presence of possible races due to an mnesia:dirty_read/
+%% mnesia:dirty_write combination. It takes into account multiple
+%% mnesia:dirty_writes that might exist.
+
+-module(mnesia_dirty_read_write_double3).
+-export([raise/3]).
+
+-record(employee, {emp_no,
+ name,
+ salary,
+ sex,
+ phone,
+ room_no}).
+
+
+raise(Eno, Raise, Room) ->
+ [E] = mnesia:dirty_read({employee, Eno}),
+ Salary = E#employee.salary + Raise,
+ New = E#employee{salary = Salary},
+ mnesia:dirty_write(employee, New),
+ move(E, Room).
+
+move(E, Room) ->
+ New = E#employee{room_no = Room},
+ mnesia:dirty_write(employee, New).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double4.erl b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double4.erl
new file mode 100644
index 0000000000..96752a6045
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double4.erl
@@ -0,0 +1,25 @@
+%% This tests the presence of possible races due to an mnesia:dirty_read/
+%% mnesia:dirty_write combination. It takes into account multiple
+%% mnesia:dirty_writes that might exist.
+
+-module(mnesia_dirty_read_write_double4).
+-export([raise/3]).
+
+-record(employee, {emp_no,
+ name,
+ salary,
+ sex,
+ phone,
+ room_no}).
+
+
+raise(Eno, Raise, Room) ->
+ [E] = mnesia:dirty_read(employee, Eno),
+ Salary = E#employee.salary + Raise,
+ New = E#employee{salary = Salary},
+ mnesia:dirty_write(New),
+ move(E, Room).
+
+move(E, Room) ->
+ New = E#employee{room_no = Room},
+ mnesia:dirty_write(New).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_one.erl b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_one.erl
new file mode 100644
index 0000000000..aee6433736
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_one.erl
@@ -0,0 +1,20 @@
+%% This tests the presence of possible races due to an mnesia:dirty_read/
+%% mnesia:dirty_write combination. It takes into account the argument types
+%% of the calls.
+
+-module(mnesia_dirty_read_write_one).
+-export([raise/2]).
+
+-record(employee, {emp_no,
+ name,
+ salary,
+ sex,
+ phone,
+ room_no}).
+
+
+raise(Eno, Raise) ->
+ [E] = mnesia:dirty_read({employee, Eno}),
+ Salary = E#employee.salary + Raise,
+ New = E#employee{salary = Salary},
+ mnesia:dirty_write(New).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_two.erl b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_two.erl
new file mode 100644
index 0000000000..037aeddafd
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_two.erl
@@ -0,0 +1,20 @@
+%% This tests the presence of possible races due to an mnesia:dirty_read/
+%% mnesia:dirty_write combination. It takes into account the argument types
+%% of the calls.
+
+-module(mnesia_dirty_read_write_two).
+-export([raise/2]).
+
+-record(employee, {emp_no,
+ name,
+ salary,
+ sex,
+ phone,
+ room_no}).
+
+
+raise(Eno, Raise) ->
+ [E] = mnesia:dirty_read(employee, Eno),
+ Salary = E#employee.salary + Raise,
+ New = E#employee{salary = Salary},
+ mnesia:dirty_write(employee, New).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow1.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow1.erl
new file mode 100644
index 0000000000..e65f6c3e23
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow1.erl
@@ -0,0 +1,17 @@
+%% This tests the presence of possible races due to a whereis/register
+%% combination. It takes into account control flow that might exist.
+
+-module(whereis_control_flow1).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ case Pid =:= self() of
+ true -> ok;
+ false -> register(AnAtom, Pid)
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow2.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow2.erl
new file mode 100644
index 0000000000..41039482c9
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow2.erl
@@ -0,0 +1,19 @@
+%% This tests the presence of possible races due to a whereis/register
+%% combination. It takes into account control flow that might exist.
+
+-module(whereis_control_flow2).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ case Pid =:= self() of
+ true ->
+ io:format("self",[]),
+ register(AnAtom, Pid);
+ false -> register(AnAtom, Pid)
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow3.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow3.erl
new file mode 100644
index 0000000000..94f8445fad
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow3.erl
@@ -0,0 +1,25 @@
+%% This tests the presence of possible races due to a whereis/register
+%% combination. It takes into account control flow that might exist.
+
+-module(whereis_control_flow3).
+-export([start/3]).
+
+start(AnAtom, Fun, FunName) ->
+ Pid =
+ case FunName of
+ master ->
+ case whereis(AnAtom) of
+ undefined ->
+ spawn(Fun);
+ P when is_pid(P) ->
+ P
+ end;
+ slave ->
+ case whereis(AnAtom) of
+ undefined ->
+ spawn(Fun);
+ P when is_pid(P) ->
+ P
+ end
+ end,
+ register(AnAtom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow4.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow4.erl
new file mode 100644
index 0000000000..2a59760789
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow4.erl
@@ -0,0 +1,29 @@
+%% This tests the presence of possible races due to a whereis/register
+%% combination. It takes into account control flow that might exist.
+
+-module(whereis_control_flow4).
+-export([start/1]).
+
+start(Fun) ->
+ case whereis(maria) of
+ undefined ->
+ Pid1 = spawn(Fun),
+ case Pid1 =:= self() of
+ true ->
+ case whereis(kostis) of
+ undefined ->
+ Pid2 = spawn(Fun),
+ case Pid2 =:= self() of
+ true ->
+ register(maria, Pid1),
+ register(kostis, Pid2);
+ false -> ok
+ end;
+ P when is_pid(P) ->
+ ok
+ end;
+ false -> ok
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow5.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow5.erl
new file mode 100644
index 0000000000..8de9cb2dad
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow5.erl
@@ -0,0 +1,12 @@
+%% This tests the presence of possible races due to a whereis/unregister
+%% combination. It takes into account control flow that might exist.
+
+-module(whereis_control_flow5).
+-export([start/1]).
+
+start(AnAtom) ->
+ case whereis(AnAtom) of
+ undefined -> ok;
+ P when is_pid(P) ->
+ unregister(AnAtom)
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow6.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow6.erl
new file mode 100644
index 0000000000..03c5095a50
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow6.erl
@@ -0,0 +1,12 @@
+%% This tests the presence of possible races due to a whereis/unregister
+%% combination. It takes into account control flow that might exist.
+
+-module(whereis_control_flow6).
+-export([start/0]).
+
+start() ->
+ case whereis(kostis) of
+ undefined -> ok;
+ P when is_pid(P) ->
+ unregister(kostis)
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_atoms_no_race.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_atoms_no_race.erl
new file mode 100644
index 0000000000..704ee6015d
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_atoms_no_race.erl
@@ -0,0 +1,23 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust even when the functions are called with different atoms
+%% as arguments.
+
+-module(whereis_diff_atoms_no_race).
+-export([test/0]).
+
+test() ->
+ Fun = fun () -> foo end,
+ {no_race(maria, Fun)}.
+
+no_race(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ AnotherAtom = kostis,
+ aux(AnotherAtom, Pid);
+ P when is_pid(P) ->
+ ok
+ end.
+
+aux(Atom, Pid) ->
+ register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_atoms_race.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_atoms_race.erl
new file mode 100644
index 0000000000..6c834caa0c
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_atoms_race.erl
@@ -0,0 +1,34 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust even when the functions are called with different atoms
+%% as arguments.
+
+-module(whereis_diff_atoms_race).
+-export([test/0]). %, race/1, no_race/1]).
+
+test() ->
+ Fun = fun () -> foo end,
+ {race(maria, Fun), no_race(maria, Fun)}.
+
+race(AnAtom, Fun) ->
+ %AnAtom = maria,
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ aux(AnAtom, Pid);
+ P when is_pid(P) ->
+ ok
+ end.
+
+no_race(AnAtom, Fun) ->
+ %AnAtom = maria,
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ AnotherAtom = kostis,
+ aux(AnotherAtom, Pid);
+ P when is_pid(P) ->
+ ok
+ end.
+
+aux(Atom, Pid) ->
+ register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1.erl
new file mode 100644
index 0000000000..6a1c197c06
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1.erl
@@ -0,0 +1,22 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions.
+
+-module(whereis_diff_functions1).
+-export([start/2]).
+
+continue(Fun) ->
+ case whereis(master) of
+ undefined ->
+ register(master, spawn(Fun));
+ _ -> ok
+ end.
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ register(AnAtom, Pid);
+ _ ->
+ ok
+ end,
+ continue(Fun).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_nested.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_nested.erl
new file mode 100644
index 0000000000..4967dec133
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_nested.erl
@@ -0,0 +1,23 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions.
+
+-module(whereis_diff_functions1_nested).
+-export([test/2]).
+
+test(AnAtom, Fun) ->
+ start(AnAtom, Fun).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ race1(AnAtom, Pid);
+ P when is_pid(P) ->
+ true
+ end.
+
+race1(Atom, Pid) ->
+ race2(Atom, Pid).
+
+race2(Atom, Pid) ->
+ register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_pathsens.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_pathsens.erl
new file mode 100644
index 0000000000..ff6506eee8
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_pathsens.erl
@@ -0,0 +1,32 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions.
+%% It takes into account control flow that might exist.
+
+-module(whereis_diff_functions1_pathsens).
+-export([test/1]).
+
+test(FunName) ->
+ start(kostis, mod:function(), FunName).
+
+start(AnAtom, Fun, FunName) ->
+ Pid =
+ case FunName of
+ master ->
+ case whereis(AnAtom) of
+ undefined ->
+ spawn(Fun);
+ P when is_pid(P) ->
+ P
+ end;
+ slave ->
+ case whereis(AnAtom) of
+ undefined ->
+ spawn(Fun);
+ P when is_pid(P) ->
+ P
+ end
+ end,
+ race(AnAtom, Pid).
+
+race(Atom, Pid) ->
+ register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_twice.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_twice.erl
new file mode 100644
index 0000000000..dd395bb6d8
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_twice.erl
@@ -0,0 +1,30 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having multiple calls in separate functions.
+
+-module(whereis_diff_functions1_twice).
+-export([test/2]).
+
+test(AnAtom, Fun) ->
+ start(AnAtom, Fun).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid1 = spawn(Fun),
+ race(AnAtom, Pid1),
+ case whereis(AnAtom) of
+ undefined ->
+ Pid2 = spawn(Fun),
+ race_again(AnAtom, Pid2);
+ P when is_pid(P) ->
+ true
+ end;
+ P when is_pid(P) ->
+ true
+ end.
+
+race(Atom, Pid) ->
+ register(Atom, Pid).
+
+race_again(Atom, Pid) ->
+ register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2.erl
new file mode 100644
index 0000000000..eaf98291ed
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2.erl
@@ -0,0 +1,25 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions.
+
+-module(whereis_diff_functions2).
+-export([test/0]).
+
+test() ->
+ start(kostis, mod:function()).
+
+start(AnAtom, Fun) ->
+ Pid1 = spawn(Fun),
+ no_race(Pid1),
+ case whereis(AnAtom) of
+ undefined ->
+ Pid2 = spawn(Fun),
+ race(AnAtom, Pid2);
+ P when is_pid(P) ->
+ true
+ end.
+
+no_race(Pid) ->
+ register(master, Pid).
+
+race(Atom, Pid) ->
+ register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_nested.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_nested.erl
new file mode 100644
index 0000000000..5ae8784389
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_nested.erl
@@ -0,0 +1,20 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions.
+
+-module(whereis_diff_functions2_nested).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ race1(AnAtom, Pid);
+ P when is_pid(P) ->
+ true
+ end.
+
+race1(Atom, Pid) ->
+ race2(Atom, Pid).
+
+race2(Atom, Pid) ->
+ register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_pathsens.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_pathsens.erl
new file mode 100644
index 0000000000..e9ce4bc48e
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_pathsens.erl
@@ -0,0 +1,29 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions.
+%% It takes into account control flow that might exist.
+
+-module(whereis_diff_functions2_pathsens).
+-export([race/4]).
+
+start(AnAtom, Fun, FunName) ->
+ Pid =
+ case FunName of
+ master ->
+ case whereis(AnAtom) of
+ undefined ->
+ spawn(Fun);
+ P when is_pid(P) ->
+ P
+ end;
+ slave ->
+ case whereis(AnAtom) of
+ undefined ->
+ spawn(Fun);
+ P when is_pid(P) ->
+ P
+ end
+ end.
+
+race(Atom, Fun, FunName, Pid) ->
+ start(Atom, Fun, FunName),
+ register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_twice.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_twice.erl
new file mode 100644
index 0000000000..d5efe631b8
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_twice.erl
@@ -0,0 +1,27 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having multiple calls in separate functions.
+
+-module(whereis_diff_functions2_twice).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid1 = spawn(Fun),
+ race(AnAtom, Pid1),
+ case whereis(AnAtom) of
+ undefined ->
+ Pid2 = spawn(Fun),
+ race_again(AnAtom, Pid2);
+ P when is_pid(P) ->
+ true
+ end;
+ P when is_pid(P) ->
+ true
+ end.
+
+race(Atom, Pid) ->
+ register(Atom, Pid).
+
+race_again(Atom, Pid) ->
+ register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3.erl
new file mode 100644
index 0000000000..093f02a06f
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3.erl
@@ -0,0 +1,11 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions.
+
+-module(whereis_diff_functions3).
+-export([start/1]).
+
+start(AnAtom) ->
+ register(AnAtom, race(AnAtom)).
+
+race(Atom) ->
+ whereis(Atom).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3_nested.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3_nested.erl
new file mode 100644
index 0000000000..5c28fc74f6
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3_nested.erl
@@ -0,0 +1,21 @@
+%% This tests that the race condition detection between whereis/unregister
+%% is robust w.r.t. having the calls in separate functions.
+
+-module(whereis_diff_functions3_nested).
+-export([test/1]).
+
+test(AnAtom) ->
+ start(AnAtom).
+
+start(AnAtom) ->
+ case whereis(AnAtom) of
+ undefined -> true;
+ P when is_pid(P) ->
+ race1(AnAtom)
+ end.
+
+race1(Atom) ->
+ race2(Atom).
+
+race2(Atom) ->
+ unregister(Atom).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3_pathsens.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3_pathsens.erl
new file mode 100644
index 0000000000..a3a245b9ea
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3_pathsens.erl
@@ -0,0 +1,29 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions.
+%% It takes into account control flow that might exist.
+
+-module(whereis_diff_functions3_pathsens).
+-export([start/3]).
+
+start(AnAtom, Fun, FunName) ->
+ Pid =
+ case FunName of
+ master ->
+ case whereis(AnAtom) of
+ undefined ->
+ spawn(Fun);
+ P when is_pid(P) ->
+ P
+ end;
+ slave ->
+ case whereis(AnAtom) of
+ undefined ->
+ spawn(Fun);
+ P when is_pid(P) ->
+ P
+ end
+ end,
+ race(AnAtom, Pid).
+
+race(Atom, Pid) ->
+ register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions4.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions4.erl
new file mode 100644
index 0000000000..e40483d487
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions4.erl
@@ -0,0 +1,32 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions.
+
+-module(whereis_diff_functions4).
+-export([test/2]).
+
+test(AnAtom, Fun) ->
+ start(AnAtom, Fun).
+
+start(AnAtom, Fun) ->
+ Pid1 = spawn(Fun),
+ no_race(Pid1),
+ case whereis(AnAtom) of
+ undefined ->
+ Pid2 = spawn(Fun),
+ race(AnAtom, Pid2),
+ case whereis(AnAtom) of
+ undefined ->
+ Pid3 = spawn(Fun),
+ race(AnAtom, Pid3);
+ P when is_pid(P) ->
+ true
+ end;
+ P when is_pid(P) ->
+ true
+ end.
+
+no_race(Pid) ->
+ register(master, Pid).
+
+race(Atom, Pid) ->
+ register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions5.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions5.erl
new file mode 100644
index 0000000000..a2c4352803
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions5.erl
@@ -0,0 +1,22 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions.
+
+-module(whereis_diff_functions5).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ Pid1 = spawn(Fun),
+ no_race(Pid1),
+ case whereis(AnAtom) of
+ undefined ->
+ Pid2 = spawn(Fun),
+ race(AnAtom, Pid2);
+ P when is_pid(P) ->
+ true
+ end.
+
+no_race(Pid) ->
+ register(master, Pid).
+
+race(Atom, Pid) ->
+ register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions6.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions6.erl
new file mode 100644
index 0000000000..f016d79533
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions6.erl
@@ -0,0 +1,29 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions.
+
+-module(whereis_diff_functions6).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ Pid1 = spawn(Fun),
+ no_race(Pid1),
+ case whereis(AnAtom) of
+ undefined ->
+ Pid2 = spawn(Fun),
+ race(AnAtom, Pid2),
+ case whereis(AnAtom) of
+ undefined ->
+ Pid3 = spawn(Fun),
+ race(AnAtom, Pid3);
+ P when is_pid(P) ->
+ true
+ end;
+ P when is_pid(P) ->
+ true
+ end.
+
+no_race(Pid) ->
+ register(master, Pid).
+
+race(Atom, Pid) ->
+ register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1/whereis_diff_modules1.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1/whereis_diff_modules1.erl
new file mode 100644
index 0000000000..00cb29cec0
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1/whereis_diff_modules1.erl
@@ -0,0 +1,16 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate modules.
+
+-module(whereis_diff_modules1).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ Pid1 = spawn(Fun),
+ whereis_diff_modules2:no_race(Pid1),
+ case whereis(AnAtom) of
+ undefined ->
+ Pid2 = spawn(Fun),
+ whereis_diff_modules2:race(AnAtom, Pid2);
+ P when is_pid(P) ->
+ true
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1/whereis_diff_modules2.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1/whereis_diff_modules2.erl
new file mode 100644
index 0000000000..e5f6fdeb7b
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1/whereis_diff_modules2.erl
@@ -0,0 +1,11 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate modules.
+
+-module(whereis_diff_modules2).
+-export([no_race/1, race/2]).
+
+no_race(Pid) ->
+ register(master, Pid).
+
+race(Atom, Pid) ->
+ register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_pathsens/whereis_diff_modules1_pathsens.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_pathsens/whereis_diff_modules1_pathsens.erl
new file mode 100644
index 0000000000..a5f1d4d3c7
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_pathsens/whereis_diff_modules1_pathsens.erl
@@ -0,0 +1,26 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate modules (backward analysis).
+%% It takes into account control flow that might exist.
+
+-module(whereis_diff_modules1_pathsens).
+-export([start/3]).
+
+start(AnAtom, Fun, FunName) ->
+ Pid =
+ case FunName of
+ master ->
+ case whereis(AnAtom) of
+ undefined ->
+ spawn(Fun);
+ P when is_pid(P) ->
+ P
+ end;
+ slave ->
+ case whereis(AnAtom) of
+ undefined ->
+ spawn(Fun);
+ P when is_pid(P) ->
+ P
+ end
+ end,
+ whereis_diff_modules2_pathsens:race(AnAtom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_pathsens/whereis_diff_modules2_pathsens.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_pathsens/whereis_diff_modules2_pathsens.erl
new file mode 100644
index 0000000000..d24d13976b
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_pathsens/whereis_diff_modules2_pathsens.erl
@@ -0,0 +1,12 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate modules (backward analysis).
+%% It takes into account control flow that might exist.
+
+-module(whereis_diff_modules2_pathsens).
+-export([no_race/1, race/2]).
+
+no_race(Pid) ->
+ register(master, Pid).
+
+race(Atom, Pid) ->
+ register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_rec/whereis_diff_modules1_rec.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_rec/whereis_diff_modules1_rec.erl
new file mode 100644
index 0000000000..a397954eea
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_rec/whereis_diff_modules1_rec.erl
@@ -0,0 +1,22 @@
+%% This tests the presence of possible races due to a register/whereis
+%% combination in an indirectly recursive inter-modular function.
+
+-module(whereis_diff_modules1_rec).
+-export([start/4]).
+
+start(AnAtom, NextAtom, Fun, Id) ->
+ case AnAtom of
+ undefined -> register(start, Id);
+ _ -> register(AnAtom, Id)
+ end,
+ case whereis(NextAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ case Pid =:= self() of
+ true -> ok;
+ false ->
+ whereis_diff_modules2_rec:continue(NextAtom, mod:next(), Pid, Id)
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_rec/whereis_diff_modules2_rec.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_rec/whereis_diff_modules2_rec.erl
new file mode 100644
index 0000000000..4b46b4a8e5
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_rec/whereis_diff_modules2_rec.erl
@@ -0,0 +1,8 @@
+%% This tests the presence of possible races due to a register/whereis
+%% combination in a recursive function.
+
+-module(whereis_diff_modules2_rec).
+-export([continue/4]).
+
+continue(Atom, NextAtom, Fun, Id) ->
+ whereis_diff_modules1_rec:start(Atom, NextAtom, Fun, Id).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2/whereis_diff_modules3.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2/whereis_diff_modules3.erl
new file mode 100644
index 0000000000..60b5a1d378
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2/whereis_diff_modules3.erl
@@ -0,0 +1,8 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate modules.
+
+-module(whereis_diff_modules3).
+-export([start/1]).
+
+start(AnAtom) ->
+ register(AnAtom, whereis_diff_modules4:race(AnAtom)).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2/whereis_diff_modules4.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2/whereis_diff_modules4.erl
new file mode 100644
index 0000000000..1ab4fbf8d8
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2/whereis_diff_modules4.erl
@@ -0,0 +1,11 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate modules.
+
+-module(whereis_diff_modules4).
+-export([no_race/1, race/1]).
+
+no_race(Pid) ->
+ register(master, Pid).
+
+race(Atom) ->
+ whereis(Atom).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_pathsens/whereis_diff_modules3_pathsens.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_pathsens/whereis_diff_modules3_pathsens.erl
new file mode 100644
index 0000000000..cb2f85a103
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_pathsens/whereis_diff_modules3_pathsens.erl
@@ -0,0 +1,25 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate modules (forward analysis).
+%% It takes into account control flow that might exist.
+
+-module(whereis_diff_modules3_pathsens).
+-export([start/3]).
+
+start(AnAtom, Fun, FunName) ->
+ Pid =
+ case FunName of
+ master ->
+ case whereis(AnAtom) of
+ undefined ->
+ spawn(Fun);
+ P when is_pid(P) ->
+ P
+ end;
+ slave ->
+ case whereis(AnAtom) of
+ undefined ->
+ spawn(Fun);
+ P when is_pid(P) ->
+ P
+ end
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_pathsens/whereis_diff_modules4_pathsens.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_pathsens/whereis_diff_modules4_pathsens.erl
new file mode 100644
index 0000000000..952f9312f4
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_pathsens/whereis_diff_modules4_pathsens.erl
@@ -0,0 +1,13 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate modules (forward analysis).
+%% It takes into account control flow that might exist.
+
+-module(whereis_diff_modules4_pathsens).
+-export([no_race/1, race/4]).
+
+no_race(Pid) ->
+ register(master, Pid).
+
+race(Atom, Fun, FunName, Pid) ->
+ whereis_diff_modules3_pathsens:start(Atom, Fun, FunName),
+ register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_rec/whereis_diff_modules3_rec.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_rec/whereis_diff_modules3_rec.erl
new file mode 100644
index 0000000000..0320140768
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_rec/whereis_diff_modules3_rec.erl
@@ -0,0 +1,25 @@
+%% This tests the presence of possible races due to a register/whereis
+%% combination in an indirectly recursive inter-modular function.
+
+-module(whereis_diff_modules3_rec).
+-export([test/0, start/4]).
+
+test() ->
+ start(undefined, second, mod:f(), self()).
+
+start(AnAtom, NextAtom, Fun, Id) ->
+ case AnAtom of
+ undefined -> register(start, Id);
+ _ -> register(AnAtom, Id)
+ end,
+ case whereis(NextAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ case Pid =:= self() of
+ true -> ok;
+ false ->
+ whereis_diff_modules4_rec:continue(NextAtom, mod:next(), Pid, Id)
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_rec/whereis_diff_modules4_rec.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_rec/whereis_diff_modules4_rec.erl
new file mode 100644
index 0000000000..d49c59ed5c
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_rec/whereis_diff_modules4_rec.erl
@@ -0,0 +1,8 @@
+%% This tests the presence of possible races due to a register/whereis
+%% combination in a recursive function.
+
+-module(whereis_diff_modules4_rec).
+-export([continue/4]).
+
+continue(Atom, NextAtom, Fun, Id) ->
+ whereis_diff_modules3_rec:start(Atom, NextAtom, Fun, Id).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules3/whereis_diff_modules5.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules3/whereis_diff_modules5.erl
new file mode 100644
index 0000000000..591732aa31
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules3/whereis_diff_modules5.erl
@@ -0,0 +1,23 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate modules.
+
+-module(whereis_diff_modules5).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ Pid1 = spawn(Fun),
+ whereis_diff_modules6:no_race(Pid1),
+ case whereis(AnAtom) of
+ undefined ->
+ Pid2 = spawn(Fun),
+ whereis_diff_modules6:race(AnAtom, Pid2),
+ case whereis(AnAtom) of
+ undefined ->
+ Pid3 = spawn(Fun),
+ whereis_diff_modules6:race(AnAtom, Pid3);
+ P when is_pid(P) ->
+ true
+ end;
+ P when is_pid(P) ->
+ true
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules3/whereis_diff_modules6.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules3/whereis_diff_modules6.erl
new file mode 100644
index 0000000000..159d96cfc5
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules3/whereis_diff_modules6.erl
@@ -0,0 +1,11 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate modules.
+
+-module(whereis_diff_modules6).
+-export([no_race/1, race/2]).
+
+no_race(Pid) ->
+ register(master, Pid).
+
+race(Atom, Pid) ->
+ register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules1_nested.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules1_nested.erl
new file mode 100644
index 0000000000..a25d2f8784
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules1_nested.erl
@@ -0,0 +1,14 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate modules.
+
+-module(whereis_diff_modules1_nested).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ whereis_diff_modules2_nested:race(AnAtom, Pid);
+ P when is_pid(P) ->
+ true
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules2_nested.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules2_nested.erl
new file mode 100644
index 0000000000..32a55e731a
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules2_nested.erl
@@ -0,0 +1,11 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate modules.
+
+-module(whereis_diff_modules2_nested).
+-export([no_race/1, race/2]).
+
+no_race(Pid) ->
+ register(master, Pid).
+
+race(Atom, Pid) ->
+ whereis_diff_modules3_nested:race(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules3_nested.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules3_nested.erl
new file mode 100644
index 0000000000..414129611f
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules3_nested.erl
@@ -0,0 +1,11 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate modules.
+
+-module(whereis_diff_modules3_nested).
+-export([no_race/1, race/2]).
+
+no_race(Pid) ->
+ register(master, Pid).
+
+race(Atom, Pid) ->
+ register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_twice/whereis_diff_modules1_twice.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_twice/whereis_diff_modules1_twice.erl
new file mode 100644
index 0000000000..92f2cb1fbc
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_twice/whereis_diff_modules1_twice.erl
@@ -0,0 +1,21 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having multiple calls in separate modules.
+
+-module(whereis_diff_modules1_twice).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid1 = spawn(Fun),
+ whereis_diff_modules2_twice:race(AnAtom, Pid1),
+ case whereis(AnAtom) of
+ undefined ->
+ Pid2 = spawn(Fun),
+ whereis_diff_modules2_twice:race_again(AnAtom, Pid2);
+ P when is_pid(P) ->
+ true
+ end;
+ P when is_pid(P) ->
+ true
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_twice/whereis_diff_modules2_twice.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_twice/whereis_diff_modules2_twice.erl
new file mode 100644
index 0000000000..390c0dcc94
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_twice/whereis_diff_modules2_twice.erl
@@ -0,0 +1,11 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate modules.
+
+-module(whereis_diff_modules2_twice).
+-export([race/2, race_again/2]).
+
+race(Atom, Pid) ->
+ register(Atom, Pid).
+
+race_again(Atom, Pid) ->
+ register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_vars_no_race.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_vars_no_race.erl
new file mode 100644
index 0000000000..8466004ce4
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_vars_no_race.erl
@@ -0,0 +1,13 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust even when the functions are called with different variables
+%% as arguments.
+
+-module(whereis_diff_vars_no_race).
+-export([test/3]).
+
+test(AnAtom, AnotherAtom, Pid) ->
+ {aux(AnAtom, Pid), aux(AnotherAtom, Pid)}.
+
+aux(Atom, Pid) ->
+ register(Atom, Pid),
+ whereis(Atom).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_vars_race.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_vars_race.erl
new file mode 100644
index 0000000000..90791de1b2
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_vars_race.erl
@@ -0,0 +1,19 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust even when the functions are called with different variables
+%% as arguments.
+
+-module(whereis_diff_vars_race).
+-export([test/2]).
+
+test(AnAtom, AnotherAtom) ->
+ Fun = fun () -> foo end,
+ {aux(AnAtom, AnotherAtom, Fun), aux(AnotherAtom, AnAtom, Fun)}.
+
+aux(Atom1, Atom2, Fun) ->
+ case whereis(Atom1) of
+ undefined ->
+ Pid = spawn(Fun),
+ register(Atom2, Pid);
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module1/whereis_intra_inter_module1.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module1/whereis_intra_inter_module1.erl
new file mode 100644
index 0000000000..677551c99d
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module1/whereis_intra_inter_module1.erl
@@ -0,0 +1,19 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions and modules.
+
+-module(whereis_intra_inter_module1).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ Pid1 = spawn(Fun),
+ whereis_intra_inter_module2:no_race(Pid1),
+ case whereis(AnAtom) of
+ undefined ->
+ Pid2 = spawn(Fun),
+ continue(AnAtom, Pid2);
+ P when is_pid(P) ->
+ true
+ end.
+
+continue(Atom, Pid) ->
+ whereis_intra_inter_module2:race(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module1/whereis_intra_inter_module2.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module1/whereis_intra_inter_module2.erl
new file mode 100644
index 0000000000..e7acee0cfd
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module1/whereis_intra_inter_module2.erl
@@ -0,0 +1,11 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions and modules.
+
+-module(whereis_intra_inter_module2).
+-export([no_race/1, race/2]).
+
+no_race(Pid) ->
+ register(master, Pid).
+
+race(Atom, Pid) ->
+ register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module2/whereis_intra_inter_module3.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module2/whereis_intra_inter_module3.erl
new file mode 100644
index 0000000000..c8103db122
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module2/whereis_intra_inter_module3.erl
@@ -0,0 +1,16 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions and modules.
+
+-module(whereis_intra_inter_module3).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ Pid1 = spawn(Fun),
+ whereis_intra_inter_module4:no_race(Pid1),
+ case whereis(AnAtom) of
+ undefined ->
+ Pid2 = spawn(Fun),
+ whereis_intra_inter_module4:race(AnAtom, Pid2);
+ P when is_pid(P) ->
+ true
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module2/whereis_intra_inter_module4.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module2/whereis_intra_inter_module4.erl
new file mode 100644
index 0000000000..4094a95223
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module2/whereis_intra_inter_module4.erl
@@ -0,0 +1,14 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions and modules.
+
+-module(whereis_intra_inter_module4).
+-export([no_race/1, race/2]).
+
+no_race(Pid) ->
+ register(master, Pid).
+
+race(Atom, Pid) ->
+ continue(Atom, Pid).
+
+continue(Atom, Pid) ->
+ register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module3/whereis_intra_inter_module5.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module3/whereis_intra_inter_module5.erl
new file mode 100644
index 0000000000..2a29779153
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module3/whereis_intra_inter_module5.erl
@@ -0,0 +1,19 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions and modules.
+
+-module(whereis_intra_inter_module5).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ Pid1 = spawn(Fun),
+ whereis_intra_inter_module6:no_race(Pid1),
+ case whereis(AnAtom) of
+ undefined ->
+ Pid2 = spawn(Fun),
+ continue(AnAtom, Pid2);
+ P when is_pid(P) ->
+ true
+ end.
+
+continue(Atom, Pid) ->
+ whereis_intra_inter_module6:race(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module3/whereis_intra_inter_module6.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module3/whereis_intra_inter_module6.erl
new file mode 100644
index 0000000000..cd05431cd5
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module3/whereis_intra_inter_module6.erl
@@ -0,0 +1,14 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions and modules.
+
+-module(whereis_intra_inter_module6).
+-export([no_race/1, race/2]).
+
+no_race(Pid) ->
+ register(master, Pid).
+
+race(Atom, Pid) ->
+ continue(Atom, Pid).
+
+continue(Atom, Pid) ->
+ register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module4/whereis_intra_inter_module7.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module4/whereis_intra_inter_module7.erl
new file mode 100644
index 0000000000..1f702e7af3
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module4/whereis_intra_inter_module7.erl
@@ -0,0 +1,11 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions and modules.
+
+-module(whereis_intra_inter_module7).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ register(AnAtom, continue(AnAtom, Fun)).
+
+continue(AnAtom, Fun) ->
+ whereis_intra_inter_module8:continue(AnAtom, Fun).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module4/whereis_intra_inter_module8.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module4/whereis_intra_inter_module8.erl
new file mode 100644
index 0000000000..581817308b
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module4/whereis_intra_inter_module8.erl
@@ -0,0 +1,13 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions and modules.
+
+-module(whereis_intra_inter_module8).
+-export([continue/2]).
+
+continue(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun);
+ P when is_pid(P) ->
+ P
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module5/whereis_intra_inter_module10.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module5/whereis_intra_inter_module10.erl
new file mode 100644
index 0000000000..7ed50ea742
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module5/whereis_intra_inter_module10.erl
@@ -0,0 +1,16 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions and modules.
+
+-module(whereis_intra_inter_module10).
+-export([continue/2]).
+
+continue(AnAtom, Fun) ->
+ aux(AnAtom, Fun).
+
+aux(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun);
+ P when is_pid(P) ->
+ P
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module5/whereis_intra_inter_module9.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module5/whereis_intra_inter_module9.erl
new file mode 100644
index 0000000000..5c5d92b770
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module5/whereis_intra_inter_module9.erl
@@ -0,0 +1,11 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions and modules.
+
+-module(whereis_intra_inter_module9).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ register(AnAtom, continue(AnAtom, Fun)).
+
+continue(AnAtom, Fun) ->
+ whereis_intra_inter_module10:continue(AnAtom, Fun).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module6/whereis_intra_inter_module11.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module6/whereis_intra_inter_module11.erl
new file mode 100644
index 0000000000..82abe2f4a8
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module6/whereis_intra_inter_module11.erl
@@ -0,0 +1,27 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions and modules.
+
+-module(whereis_intra_inter_module11).
+-export([start/2, start_again/2]).
+
+start(AnAtom, Fun) ->
+ Pid1 = spawn(Fun),
+ whereis_intra_inter_module12:no_race(Pid1),
+ case whereis(AnAtom) of
+ undefined ->
+ Pid2 = spawn(Fun),
+ whereis_intra_inter_module12:race(AnAtom, Pid2);
+ P when is_pid(P) ->
+ true
+ end.
+
+start_again(AnAtom, Fun) ->
+ Pid1 = spawn(Fun),
+ whereis_intra_inter_module12:no_race(Pid1),
+ case whereis(AnAtom) of
+ undefined ->
+ Pid2 = spawn(Fun),
+ whereis_intra_inter_module12:continue(AnAtom, Pid2);
+ P when is_pid(P) ->
+ true
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module6/whereis_intra_inter_module12.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module6/whereis_intra_inter_module12.erl
new file mode 100644
index 0000000000..c2f5d560a0
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module6/whereis_intra_inter_module12.erl
@@ -0,0 +1,14 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions and modules.
+
+-module(whereis_intra_inter_module12).
+-export([no_race/1, race/2, continue/2]).
+
+no_race(Pid) ->
+ register(master, Pid).
+
+race(Atom, Pid) ->
+ continue(Atom, Pid).
+
+continue(Atom, Pid) ->
+ register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module7/whereis_intra_inter_module13.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module7/whereis_intra_inter_module13.erl
new file mode 100644
index 0000000000..3cd5cc6fa6
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module7/whereis_intra_inter_module13.erl
@@ -0,0 +1,19 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions and modules.
+
+-module(whereis_intra_inter_module13).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ Pid1 = spawn(Fun),
+ whereis_intra_inter_module14:no_race(Pid1),
+ case whereis(AnAtom) of
+ undefined ->
+ Pid2 = spawn(Fun),
+ continue(AnAtom, Pid2);
+ P when is_pid(P) ->
+ true
+ end.
+
+continue(Atom, Pid) ->
+ whereis_intra_inter_module14:race(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module7/whereis_intra_inter_module14.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module7/whereis_intra_inter_module14.erl
new file mode 100644
index 0000000000..6b6a982055
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module7/whereis_intra_inter_module14.erl
@@ -0,0 +1,22 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions and modules.
+
+-module(whereis_intra_inter_module14).
+-export([no_race/1, race/2, start/2]).
+
+no_race(Pid) ->
+ register(master, Pid).
+
+race(Atom, Pid) ->
+ register(Atom, Pid).
+
+start(AnAtom, Fun) ->
+ Pid1 = spawn(Fun),
+ no_race(Pid1),
+ case whereis(AnAtom) of
+ undefined ->
+ Pid2 = spawn(Fun),
+ race(AnAtom, Pid2);
+ P when is_pid(P) ->
+ true
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module8/whereis_intra_inter_module15.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module8/whereis_intra_inter_module15.erl
new file mode 100644
index 0000000000..c60d166fa9
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module8/whereis_intra_inter_module15.erl
@@ -0,0 +1,19 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions and modules.
+
+-module(whereis_intra_inter_module15).
+-export([start/2, continue/2]).
+
+start(AnAtom, Fun) ->
+ Pid1 = spawn(Fun),
+ whereis_intra_inter_module16:no_race(Pid1),
+ case whereis(AnAtom) of
+ undefined ->
+ Pid2 = spawn(Fun),
+ continue(AnAtom, Pid2);
+ P when is_pid(P) ->
+ true
+ end.
+
+continue(Atom, Pid) ->
+ whereis_intra_inter_module16:race(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module8/whereis_intra_inter_module16.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module8/whereis_intra_inter_module16.erl
new file mode 100644
index 0000000000..279e633d66
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module8/whereis_intra_inter_module16.erl
@@ -0,0 +1,22 @@
+%% This tests that the race condition detection between whereis/register
+%% is robust w.r.t. having the calls in separate functions and modules.
+
+-module(whereis_intra_inter_module16).
+-export([no_race/1, race/2, start/2]).
+
+no_race(Pid) ->
+ register(master, Pid).
+
+race(Atom, Pid) ->
+ register(Atom, Pid).
+
+start(AnAtom, Fun) ->
+ Pid1 = spawn(Fun),
+ no_race(Pid1),
+ case whereis(AnAtom) of
+ undefined ->
+ Pid2 = spawn(Fun),
+ whereis_intra_inter_module15:continue(AnAtom, Pid2);
+ P when is_pid(P) ->
+ true
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_param.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_param.erl
new file mode 100644
index 0000000000..7bcde321a1
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_param.erl
@@ -0,0 +1,16 @@
+%% This tests the presence of possible races due to a whereis/register
+%% combination in higher order functions.
+
+-module(whereis_param).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ register(AnAtom, continue(AnAtom, Fun)).
+
+continue(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun);
+ P when is_pid(P) ->
+ P
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_param_inter_module/whereis_param_inter_module1.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_param_inter_module/whereis_param_inter_module1.erl
new file mode 100644
index 0000000000..8bac0326a5
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_param_inter_module/whereis_param_inter_module1.erl
@@ -0,0 +1,8 @@
+%% This tests the presence of possible races due to a whereis/register
+%% combination in higher order functions and inter-module calls.
+
+-module(whereis_param_inter_module1).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ register(AnAtom, whereis_param_inter_module2:continue(AnAtom, Fun)).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_param_inter_module/whereis_param_inter_module2.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_param_inter_module/whereis_param_inter_module2.erl
new file mode 100644
index 0000000000..61252add9a
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_param_inter_module/whereis_param_inter_module2.erl
@@ -0,0 +1,13 @@
+%% This tests the presence of possible races due to a whereis/register
+%% combination in higher order functions and inter-module calls.
+
+-module(whereis_param_inter_module2).
+-export([continue/2]).
+
+continue(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun);
+ P when is_pid(P) ->
+ P
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function1.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function1.erl
new file mode 100644
index 0000000000..c8095fbf4c
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function1.erl
@@ -0,0 +1,19 @@
+%% This tests the presence of possible races due to a whereis/register
+%% combination in a recursive function.
+
+-module(whereis_rec_function1).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ case Pid =:= self() of
+ true -> ok;
+ false ->
+ register(AnAtom, Pid),
+ start(AnAtom, Fun)
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function2.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function2.erl
new file mode 100644
index 0000000000..2721c9e19c
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function2.erl
@@ -0,0 +1,24 @@
+%% This tests the presence of possible races due to a register/whereis
+%% combination in a recursive function.
+
+-module(whereis_rec_function2).
+-export([test/0]).
+
+test() ->
+ start(undefined, second, mod:f(), self()).
+
+start(AnAtom, NextAtom, Fun, Id) ->
+ case AnAtom of
+ undefined -> register(start, Id);
+ _ -> register(AnAtom, Id)
+ end,
+ case whereis(NextAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ case Pid =:= self() of
+ true -> ok;
+ false -> start(NextAtom, mod:next(), Pid, Id)
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function3.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function3.erl
new file mode 100644
index 0000000000..e101f34fba
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function3.erl
@@ -0,0 +1,27 @@
+%% This tests the presence of possible races due to a register/whereis
+%% combination in a recursive function.
+
+-module(whereis_rec_function3).
+-export([test/0]).
+
+test() ->
+ start(undefined, second, mod:f(), self()).
+
+start(AnAtom, NextAtom, Fun, Id) ->
+ case AnAtom of
+ undefined -> register(start, Id);
+ _ -> register(AnAtom, Id)
+ end,
+ Pid =
+ case whereis(NextAtom) of
+ undefined -> spawn(Fun);
+ P1 when is_pid(P1) -> P1
+ end,
+ case whereis(NextAtom) of
+ undefined ->
+ case Pid =:= self() of
+ true -> ok;
+ false -> start(NextAtom, mod:next(), Pid, Id), io:format("", [])
+ end;
+ P2 when is_pid(P2) -> ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function4.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function4.erl
new file mode 100644
index 0000000000..4894d3397b
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function4.erl
@@ -0,0 +1,27 @@
+%% This tests the presence of possible races due to a register/whereis
+%% combination in an indirectly recursive function.
+
+-module(whereis_rec_function4).
+-export([test/0]).
+
+test() ->
+ start(undefined, second, mod:f(), self()).
+
+start(AnAtom, NextAtom, Fun, Id) ->
+ case AnAtom of
+ undefined -> register(start, Id);
+ _ -> register(AnAtom, Id)
+ end,
+ case whereis(NextAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ case Pid =:= self() of
+ true -> ok;
+ false -> continue(NextAtom, mod:next(), Pid, Id)
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
+
+continue(Atom, NextAtom, Fun, Id) ->
+ start(Atom, NextAtom, Fun, Id).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function5.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function5.erl
new file mode 100644
index 0000000000..d821f829a2
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function5.erl
@@ -0,0 +1,21 @@
+%% This tests the presence of possible races due to a register/whereis
+%% combination in a recursive function.
+
+-module(whereis_rec_function5).
+-export([start/4]).
+
+start(AnAtom, NextAtom, Fun, Id) ->
+ case AnAtom of
+ undefined -> register(start, Id);
+ _ -> register(AnAtom, Id)
+ end,
+ case whereis(NextAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ case Pid =:= self() of
+ true -> ok;
+ false -> start(NextAtom, mod:next(), Pid, Id)
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function6.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function6.erl
new file mode 100644
index 0000000000..4ec4baf0be
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function6.erl
@@ -0,0 +1,24 @@
+%% This tests the presence of possible races due to a register/whereis
+%% combination in an indirectly recursive function.
+
+-module(whereis_rec_function6).
+-export([start/4]).
+
+start(AnAtom, NextAtom, Fun, Id) ->
+ case AnAtom of
+ undefined -> register(start, Id);
+ _ -> register(AnAtom, Id)
+ end,
+ case whereis(NextAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ case Pid =:= self() of
+ true -> ok;
+ false -> continue(NextAtom, mod:next(), Pid, Id)
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
+
+continue(Atom, NextAtom, Fun, Id) ->
+ start(Atom, NextAtom, Fun, Id).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function7.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function7.erl
new file mode 100644
index 0000000000..7667443117
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function7.erl
@@ -0,0 +1,19 @@
+%% This tests the presence of possible races due to a whereis/register
+%% combination in a recursive function.
+
+-module(whereis_rec_function7).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ case Pid =:= self() of
+ true -> ok;
+ false ->
+ start(AnAtom, Fun),
+ register(AnAtom, Pid)
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function8.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function8.erl
new file mode 100644
index 0000000000..a06fb75f64
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function8.erl
@@ -0,0 +1,22 @@
+%% This tests the presence of possible races due to a whereis/register
+%% combination in a recursive function.
+
+-module(whereis_rec_function8).
+-export([test/2]).
+
+test(AnAtom, Fun) ->
+ start(AnAtom, Fun).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ case Pid =:= self() of
+ true -> ok;
+ false ->
+ start(AnAtom, Fun),
+ register(AnAtom, Pid)
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_try_catch.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_try_catch.erl
new file mode 100644
index 0000000000..39bb440f56
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_try_catch.erl
@@ -0,0 +1,25 @@
+% This tests that warnings do appear when a whereis/register combination
+% is handled by try/catch.
+
+-module(whereis_try_catch).
+-export([race/1, no_race/1]).
+
+race(Pid) ->
+ case whereis(master) of
+ undefined ->
+ try
+ io:format("exception", [])
+ catch
+ _ -> register(master, Pid)
+ end
+ end.
+
+no_race(Pid) ->
+ case whereis(master) of
+ undefined ->
+ try
+ register(master, Pid)
+ catch
+ _ -> io:format("exception", [])
+ end
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars1.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars1.erl
new file mode 100644
index 0000000000..9b249e72be
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars1.erl
@@ -0,0 +1,17 @@
+%% This tests that no warnings appear when there is no specific
+%% information about the types and the variables are not bound.
+
+-module(whereis_vars1).
+-export([start/3]).
+
+start(AnAtom, OtherAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ case Pid =:= self() of
+ true -> ok;
+ false -> register(OtherAtom, Pid)
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars10.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars10.erl
new file mode 100644
index 0000000000..5c1896d6b4
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars10.erl
@@ -0,0 +1,22 @@
+%% This tests that warnings do appear when there is no specific
+%% information about the types and the variables are bound.
+
+-module(whereis_vars10).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ OtherAtom = kostis,
+ case Pid =:= self() of
+ true -> ok;
+ false ->
+ case AnAtom =/= OtherAtom of
+ true -> ok;
+ false -> register(OtherAtom, Pid)
+ end
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars11.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars11.erl
new file mode 100644
index 0000000000..dc8551b3f2
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars11.erl
@@ -0,0 +1,22 @@
+%% This tests that no warnings appear when there is no specific
+%% information about the types and the variables are not bound.
+
+-module(whereis_vars11).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ OtherAtom = kostis,
+ case Pid =:= self() of
+ true -> ok;
+ false ->
+ case AnAtom of
+ OtherAtom -> ok;
+ _Other -> register(OtherAtom, Pid)
+ end
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars12.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars12.erl
new file mode 100644
index 0000000000..38b0dc5d04
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars12.erl
@@ -0,0 +1,22 @@
+%% This tests that warnings do appear when there is no specific
+%% information about the types and the variables are bound.
+
+-module(whereis_vars12).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ OtherAtom = kostis,
+ case Pid =:= self() of
+ true -> ok;
+ false ->
+ if
+ AnAtom =:= OtherAtom -> register(OtherAtom, Pid);
+ AnAtom =/= OtherAtom -> ok
+ end
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars13.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars13.erl
new file mode 100644
index 0000000000..3a04bba02f
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars13.erl
@@ -0,0 +1,22 @@
+%% This tests that warnings do appear when there is no specific
+%% information about the types and the variables are bound.
+
+-module(whereis_vars13).
+-export([start/3]).
+
+start(AnAtom, APid, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ OtherAtom = kostis,
+ case Pid =:= self() of
+ true -> ok;
+ false ->
+ if
+ {AnAtom, Pid} =:= {OtherAtom, APid} -> register(OtherAtom, APid);
+ {AnAtom, Pid} =/= {OtherAtom, APid} -> ok
+ end
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars14.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars14.erl
new file mode 100644
index 0000000000..c688847551
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars14.erl
@@ -0,0 +1,22 @@
+%% This tests that warnings do appear when there is no specific
+%% information about the types and the variables are bound.
+
+-module(whereis_vars14).
+-export([start/3]).
+
+start(AnAtom, APid, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ OtherAtom = kostis,
+ case Pid =:= self() of
+ true -> ok;
+ false ->
+ if
+ [AnAtom, Pid] =:= [OtherAtom, APid] -> register(OtherAtom, APid);
+ [AnAtom, Pid] =/= [OtherAtom, APid] -> ok
+ end
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars15.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars15.erl
new file mode 100644
index 0000000000..4b3a72537e
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars15.erl
@@ -0,0 +1,23 @@
+%% This tests that warnings do appear when there is no specific
+%% information about the types and the variables are bound.
+
+-module(whereis_vars15).
+-export([start/3]).
+
+start(AnAtom, OtherAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ case Pid =:= self() of
+ true -> ok;
+ false ->
+ case AnAtom of
+ maria -> ok;
+ kostis when AnAtom =:= OtherAtom ->
+ register(OtherAtom, Pid);
+ _Other -> ok
+ end
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars16.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars16.erl
new file mode 100644
index 0000000000..7badb8df22
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars16.erl
@@ -0,0 +1,23 @@
+%% This tests that warnings do appear when there is no specific
+%% information about the types and the variables are bound.
+
+-module(whereis_vars16).
+-export([start/4]).
+
+start(AnAtom, OtherAtom, APid, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ case Pid =:= self() of
+ true -> ok;
+ false ->
+ case AnAtom of
+ maria -> ok;
+ kostis when {AnAtom, Pid} =:= {OtherAtom, APid} ->
+ register(OtherAtom, APid);
+ _Other -> ok
+ end
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars17.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars17.erl
new file mode 100644
index 0000000000..bc7ef5e980
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars17.erl
@@ -0,0 +1,23 @@
+%% This tests that warnings do appear when there is no specific
+%% information about the types and the variables are bound.
+
+-module(whereis_vars17).
+-export([start/4]).
+
+start(AnAtom, OtherAtom, APid, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ case Pid =:= self() of
+ true -> ok;
+ false ->
+ case AnAtom of
+ maria -> ok;
+ kostis when [AnAtom, Pid] =:= [OtherAtom, APid] ->
+ register(OtherAtom, APid);
+ _Other -> ok
+ end
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars18.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars18.erl
new file mode 100644
index 0000000000..06416fa987
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars18.erl
@@ -0,0 +1,22 @@
+%% This tests that no warnings appear when there is no specific
+%% information about the types and the variables are not bound.
+
+-module(whereis_vars18).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ OtherAtom = kostis,
+ case Pid =:= self() of
+ true -> ok;
+ false ->
+ case AnAtom =:= OtherAtom of
+ true -> ok;
+ false -> register(OtherAtom, Pid)
+ end
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars19.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars19.erl
new file mode 100644
index 0000000000..ae5b28e42d
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars19.erl
@@ -0,0 +1,23 @@
+%% This tests that no warnings appear when there is no specific
+%% information about the types and the variables are not bound.
+
+-module(whereis_vars19).
+-export([start/3]).
+
+start(AnAtom, OtherAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ case Pid =:= self() of
+ true -> ok;
+ false ->
+ case AnAtom of
+ maria -> ok;
+ kostis when AnAtom =/= OtherAtom ->
+ register(OtherAtom, Pid);
+ _Other -> ok
+ end
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars2.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars2.erl
new file mode 100644
index 0000000000..bafb5d4644
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars2.erl
@@ -0,0 +1,18 @@
+%% This tests that warnings do appear when there is no specific
+%% information about the types and the variables are bound.
+
+-module(whereis_vars2).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ OtherAtom = AnAtom,
+ case Pid =:= self() of
+ true -> ok;
+ false -> register(OtherAtom, Pid)
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars20.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars20.erl
new file mode 100644
index 0000000000..87c6caadf0
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars20.erl
@@ -0,0 +1,22 @@
+%% This tests that no warnings appear when there is no specific
+%% information about the types and the variables are not bound.
+
+-module(whereis_vars20).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ OtherAtom = kostis,
+ case Pid =:= self() of
+ true -> ok;
+ false ->
+ if
+ AnAtom =:= OtherAtom -> ok;
+ AnAtom =/= OtherAtom -> register(OtherAtom, Pid)
+ end
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars21.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars21.erl
new file mode 100644
index 0000000000..73d22d3467
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars21.erl
@@ -0,0 +1,23 @@
+%% This tests that no warnings appear when there is no specific
+%% information about the types and the variables are not bound.
+
+-module(whereis_vars21).
+-export([start/3]).
+
+start(AnAtom, OtherAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ case Pid =:= self() of
+ true -> ok;
+ false ->
+ case AnAtom of
+ maria when AnAtom =/= OtherAtom -> ok;
+ kostis when AnAtom =/= OtherAtom ->
+ register(OtherAtom, Pid);
+ _Other -> ok
+ end
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars22.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars22.erl
new file mode 100644
index 0000000000..dd16928e33
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars22.erl
@@ -0,0 +1,27 @@
+%% This tests that warnings do appear when there is no specific
+%% information about the types and the variables are bound.
+
+-module(whereis_vars22).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ OtherAtom = kostis,
+ case Pid =:= self() of
+ true -> ok;
+ false ->
+ Same =
+ case AnAtom of
+ OtherAtom -> true;
+ _Other -> false
+ end,
+ case Same of
+ true -> register(OtherAtom, Pid);
+ false -> ok
+ end
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars3.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars3.erl
new file mode 100644
index 0000000000..16c9a6c8bc
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars3.erl
@@ -0,0 +1,18 @@
+%% This tests that warnings do appear when there is no specific
+%% information about the types and the variables are bound.
+
+-module(whereis_vars3).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ {OtherAtom, APid} = {AnAtom, Pid},
+ case Pid =:= self() of
+ true -> ok;
+ false -> register(OtherAtom, APid)
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars4.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars4.erl
new file mode 100644
index 0000000000..da5b329ca9
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars4.erl
@@ -0,0 +1,18 @@
+%% This tests that warnings do appear when there is no specific
+%% information about the types and the variables are bound.
+
+-module(whereis_vars4).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ [OtherAtom, APid] = [AnAtom, Pid],
+ case Pid =:= self() of
+ true -> ok;
+ false -> register(OtherAtom, APid)
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars5.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars5.erl
new file mode 100644
index 0000000000..dff8646ea8
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars5.erl
@@ -0,0 +1,22 @@
+%% This tests that warnings do appear when there is no specific
+%% information about the types and the variables are bound.
+
+-module(whereis_vars5).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ OtherAtom = kostis,
+ case Pid =:= self() of
+ true -> ok;
+ false ->
+ case AnAtom of
+ OtherAtom -> register(OtherAtom, Pid);
+ _Other -> ok
+ end
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars6.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars6.erl
new file mode 100644
index 0000000000..cf22ab1883
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars6.erl
@@ -0,0 +1,22 @@
+%% This tests that warnings do appear when there is no specific
+%% information about the types and the variables are bound.
+
+-module(whereis_vars6).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ OtherAtom = kostis,
+ case Pid =:= self() of
+ true -> ok;
+ false ->
+ case {AnAtom, Pid} of
+ {OtherAtom, APid} -> register(OtherAtom, APid);
+ _Other -> ok
+ end
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars7.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars7.erl
new file mode 100644
index 0000000000..4bce53982a
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars7.erl
@@ -0,0 +1,22 @@
+%% This tests that warnings do appear when there is no specific
+%% information about the types and the variables are bound.
+
+-module(whereis_vars7).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ OtherAtom = kostis,
+ case Pid =:= self() of
+ true -> ok;
+ false ->
+ case [AnAtom, Pid] of
+ [OtherAtom, APid] -> register(OtherAtom, APid);
+ _Other -> ok
+ end
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars8.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars8.erl
new file mode 100644
index 0000000000..937b83cf02
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars8.erl
@@ -0,0 +1,22 @@
+%% This tests that warnings do appear when there is no specific
+%% information about the types and the variables are bound.
+
+-module(whereis_vars8).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ OtherAtom = kostis,
+ case Pid =:= self() of
+ true -> ok;
+ false ->
+ case AnAtom =:= OtherAtom of
+ true -> register(OtherAtom, Pid);
+ false -> ok
+ end
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars9.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars9.erl
new file mode 100644
index 0000000000..9beb67ca38
--- /dev/null
+++ b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars9.erl
@@ -0,0 +1,22 @@
+%% This tests that warnings do appear when there is no specific
+%% information about the types and the variables are bound.
+
+-module(whereis_vars9).
+-export([start/2]).
+
+start(AnAtom, Fun) ->
+ case whereis(AnAtom) of
+ undefined ->
+ Pid = spawn(Fun),
+ OtherAtom = kostis,
+ case Pid =:= self() of
+ true -> ok;
+ false ->
+ case AnAtom == OtherAtom of
+ true -> register(OtherAtom, Pid);
+ false -> ok
+ end
+ end;
+ P when is_pid(P) ->
+ ok
+ end.
diff --git a/lib/dialyzer/test/small_SUITE_data/dialyzer_options b/lib/dialyzer/test/small_SUITE_data/dialyzer_options
new file mode 100644
index 0000000000..50991c9bc5
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/dialyzer_options
@@ -0,0 +1 @@
+{dialyzer_options, []}.
diff --git a/lib/dialyzer/test/small_SUITE_data/results/andalso_test b/lib/dialyzer/test/small_SUITE_data/results/andalso_test
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/andalso_test
diff --git a/lib/dialyzer/test/small_SUITE_data/results/app_call b/lib/dialyzer/test/small_SUITE_data/results/app_call
new file mode 100644
index 0000000000..cc1a63f944
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/app_call
@@ -0,0 +1,3 @@
+
+app_call.erl:6: The call M:'foo'() requires that M is of type atom() | tuple() not 42
+app_call.erl:9: The call 'mod':F() requires that F is of type atom() not {'gazonk',[]}
diff --git a/lib/dialyzer/test/small_SUITE_data/results/appmon_place b/lib/dialyzer/test/small_SUITE_data/results/appmon_place
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/appmon_place
diff --git a/lib/dialyzer/test/small_SUITE_data/results/areq b/lib/dialyzer/test/small_SUITE_data/results/areq
new file mode 100644
index 0000000000..dd91f2d2bf
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/areq
@@ -0,0 +1,2 @@
+
+areq.erl:11: The test float() =:= 3 can never evaluate to 'true'
diff --git a/lib/dialyzer/test/small_SUITE_data/results/atom_call b/lib/dialyzer/test/small_SUITE_data/results/atom_call
new file mode 100644
index 0000000000..851bb7ab12
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/atom_call
@@ -0,0 +1,3 @@
+
+atom_call.erl:14: Fun application will fail since F :: 'f' is not a function of arity 0
+atom_call.erl:14: Function g/0 has no local return
diff --git a/lib/dialyzer/test/small_SUITE_data/results/atom_widen b/lib/dialyzer/test/small_SUITE_data/results/atom_widen
new file mode 100644
index 0000000000..6d0a7b2737
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/atom_widen
@@ -0,0 +1,3 @@
+
+atom_widen.erl:10: The call atom_widen:foo('z') will never return since it differs in the 1st argument from the success typing arguments: ('a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'k' | 'l' | 'm' | 'n')
+atom_widen.erl:9: Function test/0 has no local return
diff --git a/lib/dialyzer/test/small_SUITE_data/results/blame_contract_range b/lib/dialyzer/test/small_SUITE_data/results/blame_contract_range
new file mode 100644
index 0000000000..0c1c58ac8e
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/blame_contract_range
@@ -0,0 +1,4 @@
+
+blame_contract_range.erl:11: Function foo/0 has no local return
+blame_contract_range.erl:14: The contract blame_contract_range:bar(atom()) -> 'a' cannot be right because the inferred return for bar('b') on line 12 is 'b'
+blame_contract_range.erl:15: The pattern 'a' can never match the type 'b'
diff --git a/lib/dialyzer/test/small_SUITE_data/results/bs_fail_constr b/lib/dialyzer/test/small_SUITE_data/results/bs_fail_constr
new file mode 100644
index 0000000000..dbc8241971
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/bs_fail_constr
@@ -0,0 +1,9 @@
+
+bs_fail_constr.erl:11: Function w3/1 has no local return
+bs_fail_constr.erl:12: Binary construction will fail since the size field S in segment 42:S/integer-unit:1 has type neg_integer()
+bs_fail_constr.erl:14: Function w4/1 has no local return
+bs_fail_constr.erl:15: Binary construction will fail since the value field V in segment V/utf32 has type float()
+bs_fail_constr.erl:5: Function w1/1 has no local return
+bs_fail_constr.erl:6: Binary construction will fail since the value field V in segment V:8/integer-unit:1 has type float()
+bs_fail_constr.erl:8: Function w2/1 has no local return
+bs_fail_constr.erl:9: Binary construction will fail since the value field V in segment V/binary-unit:8 has type atom()
diff --git a/lib/dialyzer/test/small_SUITE_data/results/bs_utf8 b/lib/dialyzer/test/small_SUITE_data/results/bs_utf8
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/bs_utf8
diff --git a/lib/dialyzer/test/small_SUITE_data/results/cerl_hipeify b/lib/dialyzer/test/small_SUITE_data/results/cerl_hipeify
new file mode 100644
index 0000000000..87bf6f309f
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/cerl_hipeify
@@ -0,0 +1,4 @@
+
+cerl_hipeify.erl:370: Function will never be called
+cerl_hipeify.erl:370: Guard test fun((none()) -> none()) =:= F::{_,_,_} | {_,_,_,_} | {_,_,_,_,_} | {_,_,_,_,_,_} | {_,_,_,_,_,_,_} can never succeed
+cerl_hipeify.erl:641: Function env__new_function_name/2 will never be called
diff --git a/lib/dialyzer/test/small_SUITE_data/results/comm_layer b/lib/dialyzer/test/small_SUITE_data/results/comm_layer
new file mode 100644
index 0000000000..cb4bf14eb4
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/comm_layer
@@ -0,0 +1,2 @@
+
+comm_layer.erl:76: Invalid type specification for function 'comm_layer_dir.comm_layer':this/0. The success typing is () -> {_,integer(),pid()}
diff --git a/lib/dialyzer/test/small_SUITE_data/results/compare1 b/lib/dialyzer/test/small_SUITE_data/results/compare1
new file mode 100644
index 0000000000..f0d696ffcb
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/compare1
@@ -0,0 +1,4 @@
+
+compare1.erl:15: Guard test X::42 > 42 can never succeed
+compare1.erl:17: Guard test X::42 < 42 can never succeed
+compare1.erl:19: Guard test X::42 =/= 42 can never succeed
diff --git a/lib/dialyzer/test/small_SUITE_data/results/confusing_record_warning b/lib/dialyzer/test/small_SUITE_data/results/confusing_record_warning
new file mode 100644
index 0000000000..ac3d89b02b
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/confusing_record_warning
@@ -0,0 +1,3 @@
+
+confusing_record_warning.erl:18: Function test/1 has no local return
+confusing_record_warning.erl:18: Matching of pattern {'r', [_]} tagged with a record name violates the declared type of #r{field::'binary' | 'undefined'}
diff --git a/lib/dialyzer/test/small_SUITE_data/results/confusing_warning b/lib/dialyzer/test/small_SUITE_data/results/confusing_warning
new file mode 100644
index 0000000000..d2d0c91fff
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/confusing_warning
@@ -0,0 +1,2 @@
+
+confusing_warning.erl:16: The pattern {'a', {_, L}} can never match the type {'b','aaa' | 'bbb'}
diff --git a/lib/dialyzer/test/small_SUITE_data/results/contract1 b/lib/dialyzer/test/small_SUITE_data/results/contract1
new file mode 100644
index 0000000000..fb8ba5f72b
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/contract1
@@ -0,0 +1,3 @@
+
+contract1.erl:23: Function test/0 has no local return
+contract1.erl:24: The pattern 42 can never match the type 'a' | 'b' | 'c'
diff --git a/lib/dialyzer/test/small_SUITE_data/results/contract2 b/lib/dialyzer/test/small_SUITE_data/results/contract2
new file mode 100644
index 0000000000..6809e528c4
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/contract2
@@ -0,0 +1,2 @@
+
+contract2.erl:13: The call contract2:test(T::any(),nonempty_maybe_improper_list()) will never return since it differs in the 2nd argument from the success typing arguments: (['true'],[])
diff --git a/lib/dialyzer/test/small_SUITE_data/results/contract3 b/lib/dialyzer/test/small_SUITE_data/results/contract3
new file mode 100644
index 0000000000..44b49e745a
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/contract3
@@ -0,0 +1,3 @@
+
+contract3.erl:17: Overloaded contract has overlapping domains; such contracts are currently unsupported and are simply ignored
+contract3.erl:29: Overloaded contract has overlapping domains; such contracts are currently unsupported and are simply ignored
diff --git a/lib/dialyzer/test/small_SUITE_data/results/contract5 b/lib/dialyzer/test/small_SUITE_data/results/contract5
new file mode 100644
index 0000000000..116c4f4d4d
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/contract5
@@ -0,0 +1,2 @@
+
+contract5.erl:13: Invalid type specification for function contract5:t/0. The success typing is () -> #bar{baz::'not_a_boolean'}
diff --git a/lib/dialyzer/test/small_SUITE_data/results/eqeq b/lib/dialyzer/test/small_SUITE_data/results/eqeq
new file mode 100644
index 0000000000..dabd38ebe3
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/eqeq
@@ -0,0 +1,2 @@
+
+eqeq.erl:15: The test float() =:= 'foo' can never evaluate to 'true'
diff --git a/lib/dialyzer/test/small_SUITE_data/results/ets_select b/lib/dialyzer/test/small_SUITE_data/results/ets_select
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/ets_select
diff --git a/lib/dialyzer/test/small_SUITE_data/results/exhaust_case b/lib/dialyzer/test/small_SUITE_data/results/exhaust_case
new file mode 100644
index 0000000000..45cdd80b64
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/exhaust_case
@@ -0,0 +1,3 @@
+
+exhaust_case.erl:17: The pattern 42 can never match the type 'bar' | 'foo'
+exhaust_case.erl:18: The variable _other can never match since previous clauses completely covered the type 'bar' | 'foo'
diff --git a/lib/dialyzer/test/small_SUITE_data/results/failing_guard1 b/lib/dialyzer/test/small_SUITE_data/results/failing_guard1
new file mode 100644
index 0000000000..5bdd13093a
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/failing_guard1
@@ -0,0 +1,4 @@
+
+failing_guard1.erl:12: Guard test float() =:= 2 can never succeed
+failing_guard1.erl:13: Guard test integer() =:= float() can never succeed
+failing_guard1.erl:14: Guard test -2 | -1 | 0 | 1 | 2 =:= float() can never succeed
diff --git a/lib/dialyzer/test/small_SUITE_data/results/flatten b/lib/dialyzer/test/small_SUITE_data/results/flatten
new file mode 100644
index 0000000000..4571214e49
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/flatten
@@ -0,0 +1,2 @@
+
+flatten.erl:17: The call lists:flatten(nonempty_improper_list(atom() | binary() | [any()] | char(),atom())) will never return since it differs in the 1st argument from the success typing arguments: ([any()])
diff --git a/lib/dialyzer/test/small_SUITE_data/results/fun_app b/lib/dialyzer/test/small_SUITE_data/results/fun_app
new file mode 100644
index 0000000000..b28baad43b
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/fun_app
@@ -0,0 +1,7 @@
+
+fun_app.erl:37: Fun application will fail since F :: fun((_,_,_) -> 'ok' | 'true') is not a function of arity 1
+fun_app.erl:37: The created fun has no local return
+fun_app.erl:38: Fun application will fail since F :: fun((_,_,_) -> 'ok' | 'true') is not a function of arity 2
+fun_app.erl:38: The created fun has no local return
+fun_app.erl:40: Fun application will fail since F :: fun((_,_,_) -> 'ok' | 'true') is not a function of arity 4
+fun_app.erl:40: The created fun has no local return
diff --git a/lib/dialyzer/test/small_SUITE_data/results/fun_ref_match b/lib/dialyzer/test/small_SUITE_data/results/fun_ref_match
new file mode 100644
index 0000000000..60b34530b4
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/fun_ref_match
@@ -0,0 +1,2 @@
+
+fun_ref_match.erl:14: Function will never be called
diff --git a/lib/dialyzer/test/small_SUITE_data/results/gencall b/lib/dialyzer/test/small_SUITE_data/results/gencall
new file mode 100644
index 0000000000..d0479ed738
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/gencall
@@ -0,0 +1,4 @@
+
+gencall.erl:11: Call to missing or unexported function gencall:foo/0
+gencall.erl:12: Call to missing or unexported function gen_server:handle_cast/2
+gencall.erl:9: Call to missing or unexported function ets:lookup/3
diff --git a/lib/dialyzer/test/small_SUITE_data/results/gs_make b/lib/dialyzer/test/small_SUITE_data/results/gs_make
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/gs_make
diff --git a/lib/dialyzer/test/small_SUITE_data/results/guard_warnings b/lib/dialyzer/test/small_SUITE_data/results/guard_warnings
new file mode 100644
index 0000000000..0ff998bf50
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/guard_warnings
@@ -0,0 +1,97 @@
+
+guard_warnings.erl:100: Function test45/0 has no local return
+guard_warnings.erl:100: Guard test 'not'('true') can never succeed
+guard_warnings.erl:102: Function test46/1 has no local return
+guard_warnings.erl:102: Guard test X::'true' =:= 'false' can never succeed
+guard_warnings.erl:104: Function test47/1 has no local return
+guard_warnings.erl:104: Guard test X::'true' == 'false' can never succeed
+guard_warnings.erl:106: Function test48/1 has no local return
+guard_warnings.erl:106: Guard test X::'true' =/= 'true' can never succeed
+guard_warnings.erl:114: Function test52_w/1 has no local return
+guard_warnings.erl:118: Function test54_w/1 has no local return
+guard_warnings.erl:12: Function test1/1 has no local return
+guard_warnings.erl:12: Guard test X::'true' =:= 'false' can never succeed
+guard_warnings.erl:14: Function test2/1 has no local return
+guard_warnings.erl:14: Guard test X::'false' =:= 'true' can never succeed
+guard_warnings.erl:16: Function test3/1 has no local return
+guard_warnings.erl:16: Guard test 'not'(X::'true') can never succeed
+guard_warnings.erl:18: Function test4/1 has no local return
+guard_warnings.erl:18: Guard test 'and'('true',X::none()) can never succeed
+guard_warnings.erl:20: Function test5/1 has no local return
+guard_warnings.erl:20: Guard test 'not'(X::'true') can never succeed
+guard_warnings.erl:22: Function test6/1 has no local return
+guard_warnings.erl:22: Guard test 'and'('true',X::none()) can never succeed
+guard_warnings.erl:24: Function test7_w/1 has no local return
+guard_warnings.erl:26: Function test8_w/1 has no local return
+guard_warnings.erl:28: Function test9/1 has no local return
+guard_warnings.erl:28: Guard test not('not'(X::'false')) can never succeed
+guard_warnings.erl:30: Function test10/1 has no local return
+guard_warnings.erl:30: Guard test not('or'('false',X::none())) can never succeed
+guard_warnings.erl:32: Function test11/1 has no local return
+guard_warnings.erl:32: Guard test not('not'(X::'false')) can never succeed
+guard_warnings.erl:34: Function test12/1 has no local return
+guard_warnings.erl:34: Guard test not('or'('false',X::none())) can never succeed
+guard_warnings.erl:36: Function test13/1 has no local return
+guard_warnings.erl:36: Guard test 'and'('true','false') can never succeed
+guard_warnings.erl:38: Function test14/1 has no local return
+guard_warnings.erl:38: Guard test 'and'('false',any()) can never succeed
+guard_warnings.erl:40: Function test15/1 has no local return
+guard_warnings.erl:40: Guard test 'and'(X::'true','false') can never succeed
+guard_warnings.erl:42: Function test16/1 has no local return
+guard_warnings.erl:42: Guard test 'and'('false',X::any()) can never succeed
+guard_warnings.erl:44: Function test17/1 has no local return
+guard_warnings.erl:44: Guard test 'and'(X::'true','false') can never succeed
+guard_warnings.erl:46: Function test18/1 has no local return
+guard_warnings.erl:46: Guard test 'and'('false',X::any()) can never succeed
+guard_warnings.erl:48: Function test19/1 has no local return
+guard_warnings.erl:48: Guard test not('or'('true',any())) can never succeed
+guard_warnings.erl:50: Function test20/1 has no local return
+guard_warnings.erl:50: Guard test not('or'('false','true')) can never succeed
+guard_warnings.erl:52: Function test21/1 has no local return
+guard_warnings.erl:52: Guard test not('or'('true',X::any())) can never succeed
+guard_warnings.erl:54: Function test22/1 has no local return
+guard_warnings.erl:54: Guard test not('or'(X::'false','true')) can never succeed
+guard_warnings.erl:56: Function test23/1 has no local return
+guard_warnings.erl:56: Guard test not('or'('true',X::any())) can never succeed
+guard_warnings.erl:58: Function test24/1 has no local return
+guard_warnings.erl:58: Guard test not('or'(X::'false','true')) can never succeed
+guard_warnings.erl:60: Function test25/1 has no local return
+guard_warnings.erl:60: Guard test 'and'('false',any()) can never succeed
+guard_warnings.erl:62: Function test26/1 has no local return
+guard_warnings.erl:62: Guard test 'and'('true','false') can never succeed
+guard_warnings.erl:64: Function test27/1 has no local return
+guard_warnings.erl:64: Guard test 'and'('false',X::any()) can never succeed
+guard_warnings.erl:66: Function test28/1 has no local return
+guard_warnings.erl:66: Guard test 'and'(X::'true','false') can never succeed
+guard_warnings.erl:68: Function test29/1 has no local return
+guard_warnings.erl:68: Guard test 'and'('false',X::any()) can never succeed
+guard_warnings.erl:70: Function test30/1 has no local return
+guard_warnings.erl:70: Guard test 'and'(X::'true','false') can never succeed
+guard_warnings.erl:72: Function test31/0 has no local return
+guard_warnings.erl:72: Guard test 'and'('false',any()) can never succeed
+guard_warnings.erl:74: Function test32/0 has no local return
+guard_warnings.erl:74: Guard test 'and'('false',any()) can never succeed
+guard_warnings.erl:76: Function test33/0 has no local return
+guard_warnings.erl:76: Guard test not('and'('true','true')) can never succeed
+guard_warnings.erl:78: Function test34/0 has no local return
+guard_warnings.erl:78: Guard test 'and'('false',any()) can never succeed
+guard_warnings.erl:80: Function test35/0 has no local return
+guard_warnings.erl:80: Guard test not('and'('true','true')) can never succeed
+guard_warnings.erl:82: Function test36/0 has no local return
+guard_warnings.erl:82: Guard test 'or'('false','false') can never succeed
+guard_warnings.erl:84: Function test37/0 has no local return
+guard_warnings.erl:84: Guard test 'or'('false','false') can never succeed
+guard_warnings.erl:86: Function test38/0 has no local return
+guard_warnings.erl:86: Guard test 'or'('false','false') can never succeed
+guard_warnings.erl:88: Function test39/0 has no local return
+guard_warnings.erl:88: Guard test 'or'('false','false') can never succeed
+guard_warnings.erl:90: Function test40/0 has no local return
+guard_warnings.erl:90: Guard test 'or'('false','false') can never succeed
+guard_warnings.erl:92: Function test41/0 has no local return
+guard_warnings.erl:92: Guard test 'true' =:= 'false' can never succeed
+guard_warnings.erl:94: Function test42/0 has no local return
+guard_warnings.erl:94: Guard test 'true' == 'false' can never succeed
+guard_warnings.erl:96: Function test43/0 has no local return
+guard_warnings.erl:96: Guard test 'true' =:= 'false' can never succeed
+guard_warnings.erl:98: Function test44/0 has no local return
+guard_warnings.erl:98: Guard test not('true' == 'true') can never succeed
diff --git a/lib/dialyzer/test/small_SUITE_data/results/guards b/lib/dialyzer/test/small_SUITE_data/results/guards
new file mode 100644
index 0000000000..824a7cfa24
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/guards
@@ -0,0 +1,17 @@
+
+guards.erl:100: The variable _ can never match since previous clauses completely covered the type {'true','true'}
+guards.erl:111: The pattern {_, _} can never match since previous clauses completely covered the type {'false',boolean()} | {'true',boolean()}
+guards.erl:122: The pattern {_, _} can never match since previous clauses completely covered the type {'false',boolean()} | {'true',boolean()}
+guards.erl:129: Function t15_a/0 has no local return
+guards.erl:129: The call guards:t15('a') will never return since it differs in the 1st argument from the success typing arguments: ('b')
+guards.erl:129: The call guards:t15('c') will never return since it differs in the 1st argument from the success typing arguments: ('b')
+guards.erl:136: Function t16_a/0 has no local return
+guards.erl:136: The call guards:t16('a') will never return since it differs in the 1st argument from the success typing arguments: ('b')
+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: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/results/inf_loop2 b/lib/dialyzer/test/small_SUITE_data/results/inf_loop2
new file mode 100644
index 0000000000..7e9972ad98
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/inf_loop2
@@ -0,0 +1,4 @@
+
+inf_loop2.erl:18: Function test/0 has no local return
+inf_loop2.erl:19: The call lists:reverse('gazonk') will never return since it differs in the 1st argument from the success typing arguments: ([any()])
+inf_loop2.erl:22: Function loop/0 has no local return
diff --git a/lib/dialyzer/test/small_SUITE_data/results/invalid_specs b/lib/dialyzer/test/small_SUITE_data/results/invalid_specs
new file mode 100644
index 0000000000..c95c0ff1f8
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/invalid_specs
@@ -0,0 +1,3 @@
+
+invalid_spec1.erl:5: Invalid type specification for function invalid_spec1:get_plan_dirty/1. The success typing is ([string()]) -> {maybe_improper_list(),[atom()]}
+invalid_spec2.erl:5: Function foo/0 has no local return
diff --git a/lib/dialyzer/test/small_SUITE_data/results/letrec1 b/lib/dialyzer/test/small_SUITE_data/results/letrec1
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/letrec1
diff --git a/lib/dialyzer/test/small_SUITE_data/results/list_match b/lib/dialyzer/test/small_SUITE_data/results/list_match
new file mode 100644
index 0000000000..95007da604
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/list_match
@@ -0,0 +1,2 @@
+
+list_match.erl:19: The pattern [_ | T] can never match since previous clauses completely covered the type [1 | 2 | 3 | 4]
diff --git a/lib/dialyzer/test/small_SUITE_data/results/lzip b/lib/dialyzer/test/small_SUITE_data/results/lzip
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/lzip
diff --git a/lib/dialyzer/test/small_SUITE_data/results/make_tuple b/lib/dialyzer/test/small_SUITE_data/results/make_tuple
new file mode 100644
index 0000000000..4d51586e35
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/make_tuple
@@ -0,0 +1,3 @@
+
+make_tuple.erl:4: Function test/0 has no local return
+make_tuple.erl:5: The pattern {_, _} can never match the type {_,_,_}
diff --git a/lib/dialyzer/test/small_SUITE_data/results/minus_minus b/lib/dialyzer/test/small_SUITE_data/results/minus_minus
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/minus_minus
diff --git a/lib/dialyzer/test/small_SUITE_data/results/mod_info b/lib/dialyzer/test/small_SUITE_data/results/mod_info
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/mod_info
diff --git a/lib/dialyzer/test/small_SUITE_data/results/my_filter b/lib/dialyzer/test/small_SUITE_data/results/my_filter
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/my_filter
diff --git a/lib/dialyzer/test/small_SUITE_data/results/my_sofs b/lib/dialyzer/test/small_SUITE_data/results/my_sofs
new file mode 100644
index 0000000000..bfee0bce0d
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/my_sofs
@@ -0,0 +1,3 @@
+
+my_sofs.erl:34: The pattern {'Set', _, _} can never match the type #OrdSet{}
+my_sofs.erl:54: The pattern {'Set', _, _} can never match the type #OrdSet{}
diff --git a/lib/dialyzer/test/small_SUITE_data/results/no_match b/lib/dialyzer/test/small_SUITE_data/results/no_match
new file mode 100644
index 0000000000..9760b980a2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/no_match
@@ -0,0 +1,4 @@
+
+no_match.erl:5: Function t1/1 has no clauses that will ever match
+no_match.erl:7: Function t2/1 has no clauses that will ever match
+no_match.erl:9: Function t3/1 has no local return
diff --git a/lib/dialyzer/test/small_SUITE_data/results/no_unused_fun b/lib/dialyzer/test/small_SUITE_data/results/no_unused_fun
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/no_unused_fun
diff --git a/lib/dialyzer/test/small_SUITE_data/results/no_unused_fun2 b/lib/dialyzer/test/small_SUITE_data/results/no_unused_fun2
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/no_unused_fun2
diff --git a/lib/dialyzer/test/small_SUITE_data/results/non_existing b/lib/dialyzer/test/small_SUITE_data/results/non_existing
new file mode 100644
index 0000000000..58da2bfc8b
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/non_existing
@@ -0,0 +1,2 @@
+
+non_existing.erl:9: Call to missing or unexported function lists:non_existing_call/1
diff --git a/lib/dialyzer/test/small_SUITE_data/results/none_scc_inf_loop b/lib/dialyzer/test/small_SUITE_data/results/none_scc_inf_loop
new file mode 100644
index 0000000000..3b1b204708
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/none_scc_inf_loop
@@ -0,0 +1,5 @@
+
+none_scc_inf_loop.erl:10: Function foo/0 has no local return
+none_scc_inf_loop.erl:13: Function foo/1 has no local return
+none_scc_inf_loop.erl:13: The pattern 0 can never match the type 1 | 3
+none_scc_inf_loop.erl:18: Function bar/1 has no local return
diff --git a/lib/dialyzer/test/small_SUITE_data/results/not_bogus_warning b/lib/dialyzer/test/small_SUITE_data/results/not_bogus_warning
new file mode 100644
index 0000000000..e3a7f6b444
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/not_bogus_warning
@@ -0,0 +1,3 @@
+
+not_bogus_warning.erl:11: Guard test not(is_atom(A::'bar' | 'foo')) can never succeed
+not_bogus_warning.erl:24: Guard test not(is_integer(X::42)) can never succeed
diff --git a/lib/dialyzer/test/small_SUITE_data/results/not_guard_crash b/lib/dialyzer/test/small_SUITE_data/results/not_guard_crash
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/not_guard_crash
diff --git a/lib/dialyzer/test/small_SUITE_data/results/or_bug b/lib/dialyzer/test/small_SUITE_data/results/or_bug
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/or_bug
diff --git a/lib/dialyzer/test/small_SUITE_data/results/orelsebug b/lib/dialyzer/test/small_SUITE_data/results/orelsebug
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/orelsebug
diff --git a/lib/dialyzer/test/small_SUITE_data/results/orelsebug2 b/lib/dialyzer/test/small_SUITE_data/results/orelsebug2
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/orelsebug2
diff --git a/lib/dialyzer/test/small_SUITE_data/results/overloaded1 b/lib/dialyzer/test/small_SUITE_data/results/overloaded1
new file mode 100644
index 0000000000..ab57ec03ff
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/overloaded1
@@ -0,0 +1,3 @@
+
+overloaded1.erl:10: The pattern {'ok', 'gazonk'} can never match the type {'error',_} | {'ok',{atom(),atom(),byte()}}
+overloaded1.erl:9: Function test1/0 has no local return
diff --git a/lib/dialyzer/test/small_SUITE_data/results/port_info_test b/lib/dialyzer/test/small_SUITE_data/results/port_info_test
new file mode 100644
index 0000000000..9ee863f9eb
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/port_info_test
@@ -0,0 +1,6 @@
+
+port_info_test.erl:10: The pattern {'connected', 42} can never match the type 'undefined' | {'connected',pid()}
+port_info_test.erl:14: The pattern {'registered_name', "42"} can never match the type 'undefined' | {'registered_name',atom()}
+port_info_test.erl:19: The pattern {'output', 42} can never match the type 'undefined' | {'connected',pid()}
+port_info_test.erl:24: Guard test 'links' =:= Atom::'connected' can never succeed
+port_info_test.erl:28: The pattern {'gazonk', _} can never match the type 'undefined' | {'connected' | 'id' | 'input' | 'links' | 'name' | 'output' | 'registered_name',atom() | pid() | [pid() | char()] | integer()}
diff --git a/lib/dialyzer/test/small_SUITE_data/results/process_info_test b/lib/dialyzer/test/small_SUITE_data/results/process_info_test
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/process_info_test
diff --git a/lib/dialyzer/test/small_SUITE_data/results/pubsub b/lib/dialyzer/test/small_SUITE_data/results/pubsub
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/pubsub
diff --git a/lib/dialyzer/test/small_SUITE_data/results/receive1 b/lib/dialyzer/test/small_SUITE_data/results/receive1
new file mode 100644
index 0000000000..abf6eec0ca
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/receive1
@@ -0,0 +1,2 @@
+
+receive1.erl:12: Function t/1 has no local return
diff --git a/lib/dialyzer/test/small_SUITE_data/results/record_construct b/lib/dialyzer/test/small_SUITE_data/results/record_construct
new file mode 100644
index 0000000000..c0110b144f
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/record_construct
@@ -0,0 +1,7 @@
+
+record_construct.erl:15: Function t_opa/0 has no local return
+record_construct.erl:16: Record construction #r_opa{b::gb_set(),c::42,e::'false'} violates the declared type of field c::boolean()
+record_construct.erl:20: Function t_rem/0 has no local return
+record_construct.erl:21: Record construction #r_rem{a::'gazonk'} violates the declared type of field a::string()
+record_construct.erl:6: Function t_loc/0 has no local return
+record_construct.erl:7: Record construction #r_loc{a::'gazonk',b::42} violates the declared type of field a::integer() and b::atom()
diff --git a/lib/dialyzer/test/small_SUITE_data/results/record_pat b/lib/dialyzer/test/small_SUITE_data/results/record_pat
new file mode 100644
index 0000000000..9a3f925e42
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/record_pat
@@ -0,0 +1,2 @@
+
+record_pat.erl:14: The pattern {'foo', 'baz'} violates the declared type for #foo{}
diff --git a/lib/dialyzer/test/small_SUITE_data/results/record_send_test b/lib/dialyzer/test/small_SUITE_data/results/record_send_test
new file mode 100644
index 0000000000..6a08d44179
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/record_send_test
@@ -0,0 +1,2 @@
+
+record_send_test.erl:30: The call erlang:'!'(Rec1::#rec1{a::'a',b::'b',c::'c'},'hello_again') will never return since it differs in the 1st argument from the success typing arguments: (atom() | pid() | port() | {atom(),atom()},any())
diff --git a/lib/dialyzer/test/small_SUITE_data/results/record_test b/lib/dialyzer/test/small_SUITE_data/results/record_test
new file mode 100644
index 0000000000..9715f0dcfb
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/record_test
@@ -0,0 +1,3 @@
+
+record_test.erl:19: The pattern {'foo', _} can never match the type 'foo'
+record_test.erl:21: The variable _ can never match since previous clauses completely covered the type 'foo'
diff --git a/lib/dialyzer/test/small_SUITE_data/results/recursive_types1 b/lib/dialyzer/test/small_SUITE_data/results/recursive_types1
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/recursive_types1
diff --git a/lib/dialyzer/test/small_SUITE_data/results/recursive_types2 b/lib/dialyzer/test/small_SUITE_data/results/recursive_types2
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/recursive_types2
diff --git a/lib/dialyzer/test/small_SUITE_data/results/recursive_types3 b/lib/dialyzer/test/small_SUITE_data/results/recursive_types3
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/recursive_types3
diff --git a/lib/dialyzer/test/small_SUITE_data/results/recursive_types4 b/lib/dialyzer/test/small_SUITE_data/results/recursive_types4
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/recursive_types4
diff --git a/lib/dialyzer/test/small_SUITE_data/results/recursive_types5 b/lib/dialyzer/test/small_SUITE_data/results/recursive_types5
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/recursive_types5
diff --git a/lib/dialyzer/test/small_SUITE_data/results/recursive_types6 b/lib/dialyzer/test/small_SUITE_data/results/recursive_types6
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/recursive_types6
diff --git a/lib/dialyzer/test/small_SUITE_data/results/recursive_types7 b/lib/dialyzer/test/small_SUITE_data/results/recursive_types7
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/recursive_types7
diff --git a/lib/dialyzer/test/small_SUITE_data/results/refine_failing b/lib/dialyzer/test/small_SUITE_data/results/refine_failing
new file mode 100644
index 0000000000..2bf67c9d81
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/refine_failing
@@ -0,0 +1,2 @@
+
+refine_failing.erl:25: The call refine_failing:update_one(F::any(),Ds::{_,non_neg_integer()},[{_,non_neg_integer()},...]) will never return since it differs in the 2nd argument from the success typing arguments: (any(),[{_,non_neg_integer()}],[{_,non_neg_integer()}])
diff --git a/lib/dialyzer/test/small_SUITE_data/results/toth b/lib/dialyzer/test/small_SUITE_data/results/toth
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/toth
diff --git a/lib/dialyzer/test/small_SUITE_data/results/trec b/lib/dialyzer/test/small_SUITE_data/results/trec
new file mode 100644
index 0000000000..01ccc63761
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/trec
@@ -0,0 +1,7 @@
+
+trec.erl:26: Function test/0 has no local return
+trec.erl:27: The call trec:mk_foo_loc(42,any()) will never return since it differs in the 1st argument from the success typing arguments: ('undefined',atom())
+trec.erl:29: Function mk_foo_loc/2 has no local return
+trec.erl:30: Record construction violates the declared type for #foo{} since variable A cannot be of type atom()
+trec.erl:36: Function mk_foo_exp/2 has no local return
+trec.erl:37: Record construction violates the declared type for #foo{} since variable A cannot be of type atom()
diff --git a/lib/dialyzer/test/small_SUITE_data/results/try1 b/lib/dialyzer/test/small_SUITE_data/results/try1
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/try1
diff --git a/lib/dialyzer/test/small_SUITE_data/results/tuple1 b/lib/dialyzer/test/small_SUITE_data/results/tuple1
new file mode 100644
index 0000000000..1b5ed49b56
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/tuple1
@@ -0,0 +1,5 @@
+
+tuple1.erl:13: Function t1/2 has no local return
+tuple1.erl:14: The call lists:mapfoldl(fun((_,_) -> 'a' | 'b'),X::any(),List::nonempty_maybe_improper_list()) will never return since the success typing arguments are (fun((_,_) -> {_,_}),any(),[any()])
+tuple1.erl:19: Function t3/2 has no local return
+tuple1.erl:20: The call lists:mapfoldl(fun((_) -> 1),X::any(),List::nonempty_maybe_improper_list()) will never return since it differs in the 1st argument from the success typing arguments: (fun((_,_) -> {_,_}),any(),[any()])
diff --git a/lib/dialyzer/test/small_SUITE_data/results/tuple_set_crash b/lib/dialyzer/test/small_SUITE_data/results/tuple_set_crash
new file mode 100644
index 0000000000..191d3d4173
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/tuple_set_crash
@@ -0,0 +1,15 @@
+
+tuple_set_crash.erl:103: Invalid type specification for function tuple_set_crash:parse_device_properties/1. The success typing is (<<_:48>>) -> [{'controller_description',binary()} | {'controller_name',binary()} | {'controller_status',byte()} | {'fw_version',<<_:24>>}]
+tuple_set_crash.erl:123: Invalid type specification for function tuple_set_crash:parse_video_target_info/1. The success typing is (<<_:48>>) -> [{'status',byte()} | {'target_id',non_neg_integer()},...]
+tuple_set_crash.erl:127: Invalid type specification for function tuple_set_crash:parse_audio_target_info/1. The success typing is (<<_:48>>) -> [{'master_volume',char()} | {'status',byte()} | {'target_id',non_neg_integer()},...]
+tuple_set_crash.erl:138: Invalid type specification for function tuple_set_crash:parse_av_device_info/1. The success typing is (<<_:48>>) -> [{'address',byte()} | {'device_id',non_neg_integer()} | {'model',binary()} | {'status',byte()},...]
+tuple_set_crash.erl:143: The pattern <<TargetId:32/integer-little-unit:1,Rest1/binary-unit:8>> can never match the type <<_:8>>
+tuple_set_crash.erl:155: Invalid type specification for function tuple_set_crash:parse_video_output_info/1. The success typing is (<<_:48>>) -> [{'audio_volume',char()} | {'display_type',binary()} | {'output_id',non_neg_integer()},...]
+tuple_set_crash.erl:160: The pattern <<DeviceId:32/integer-little-unit:1,Rest1/binary-unit:8>> can never match the type <<_:8>>
+tuple_set_crash.erl:171: Invalid type specification for function tuple_set_crash:parse_audio_output_info/1. The success typing is (<<_:48>>) -> [{'output_id',non_neg_integer()},...]
+tuple_set_crash.erl:176: The pattern <<DeviceId:32/integer-little-unit:1,Rest1/binary-unit:8>> can never match the type <<_:8>>
+tuple_set_crash.erl:179: The pattern <<AudioVolume:16/integer-little-unit:1,Rest2/binary-unit:8>> can never match the type <<_:8>>
+tuple_set_crash.erl:182: The pattern <<Delay:16/integer-little-unit:1,_Padding/binary-unit:8>> can never match the type <<_:8>>
+tuple_set_crash.erl:62: The pattern {'play_list', _Playlist} can never match the type 'ok' | {'device_properties',[{atom(),_}]} | {'error',[{atom(),_}]}
+tuple_set_crash.erl:64: The pattern {'error', 17} can never match the type 'ok' | {'device_properties',[{atom(),_}]} | {'error',[{atom(),_}]}
+tuple_set_crash.erl:83: The specification for tuple_set_crash:parse_message/1 states that the function might also return {'media_item_url_reply',integer(),binary()} but the inferred return is 'ok' | {'audio_device_info' | 'audio_output_info' | 'audio_target_info' | 'device_properties' | 'error' | 'video_device_info' | 'video_output_info' | 'video_target_info',[{'address' | 'audio_volume' | 'controller_description' | 'controller_name' | 'controller_status' | 'device_id' | 'display_type' | 'fw_version' | 'master_volume' | 'model' | 'output_id' | 'status' | 'target_id',binary() | non_neg_integer()}] | 1..255}
diff --git a/lib/dialyzer/test/small_SUITE_data/results/unsafe_beamcode_bug b/lib/dialyzer/test/small_SUITE_data/results/unsafe_beamcode_bug
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/unsafe_beamcode_bug
diff --git a/lib/dialyzer/test/small_SUITE_data/results/unused_cases b/lib/dialyzer/test/small_SUITE_data/results/unused_cases
new file mode 100644
index 0000000000..cafe1c042b
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/unused_cases
@@ -0,0 +1,4 @@
+
+unused_cases.erl:21: The variable OTHER can never match since previous clauses completely covered the type {42,42}
+unused_cases.erl:27: The pattern 'weird' can never match the type 'false'
+unused_cases.erl:35: The variable OTHER can never match since previous clauses completely covered the type boolean()
diff --git a/lib/dialyzer/test/small_SUITE_data/results/unused_clauses b/lib/dialyzer/test/small_SUITE_data/results/unused_clauses
new file mode 100644
index 0000000000..4603e888c1
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/unused_clauses
@@ -0,0 +1,3 @@
+
+unused_clauses.erl:16: Guard test is_integer(X::{42}) can never succeed
+unused_clauses.erl:18: The variable X can never match since previous clauses completely covered the type 'atom' | {42}
diff --git a/lib/dialyzer/test/small_SUITE_data/results/zero_tuple b/lib/dialyzer/test/small_SUITE_data/results/zero_tuple
new file mode 100644
index 0000000000..bf5ec5cd6e
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/zero_tuple
@@ -0,0 +1,5 @@
+
+zero_tuple.erl:4: Function t1/0 has no local return
+zero_tuple.erl:5: The pattern {} can never match the type 'a'
+zero_tuple.erl:8: Function t2/0 has no local return
+zero_tuple.erl:9: The pattern 'b' can never match the type 'a'
diff --git a/lib/dialyzer/test/small_SUITE_data/src/app_call.erl b/lib/dialyzer/test/small_SUITE_data/src/app_call.erl
new file mode 100644
index 0000000000..54d178d29a
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/app_call.erl
@@ -0,0 +1,17 @@
+-module(app_call).
+-export([test/1]).
+
+test(m) ->
+ M = get_mod(),
+ M:foo();
+test(f) ->
+ F = get_fun(),
+ mod:F();
+test(_) ->
+ ok.
+
+get_mod() ->
+ 42.
+
+get_fun() ->
+ {gazonk, []}.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/appmon_place.erl b/lib/dialyzer/test/small_SUITE_data/src/appmon_place.erl
new file mode 100644
index 0000000000..60ffbe818f
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/appmon_place.erl
@@ -0,0 +1,70 @@
+%%---------------------------------------------------------------------
+%% This is added as a test because it was giving a false positive
+%% (function move/4 will nevr be called) due to the strange use of
+%% self-recursive fun construction in placex/3.
+%%
+%% The analysis was getting confused that the foldl call will never
+%% terminate (due to a wrong hard-coded type for foldl) and inferred
+%% that the remaining calls in the body of placex/3 will not be
+%% reached. Fixed 11 March 2005.
+%%---------------------------------------------------------------------
+
+-module(appmon_place).
+-export([place/2]).
+
+place(DG, Root) ->
+ case appmon_dg:get(data, DG, Root) of
+ false -> [0];
+ _Other ->
+ placey(DG, Root, 1),
+ placex(DG, Root, [])
+ end.
+
+placey(DG, V, Y) ->
+ appmon_dg:set(y, DG, V, Y),
+ Y1 = Y+1,
+ lists:foreach(fun(C) -> placey(DG, C, Y1) end, appmon_dg:get(out, DG, V)).
+
+placex(DG, V, LastX) ->
+ Ch = appmon_dg:get(out, DG, V),
+ ChLX = lists:foldl(fun(C, Accu) -> placex(DG, C, Accu) end,
+ tll(LastX),
+ Ch),
+ Width = appmon_dg:get(w, DG, V),
+ MyX = calc_mid(DG, Width, Ch),
+ DeltaX = calc_delta(MyX, hdd(LastX)+20),
+ appmon_dg:set(x, DG, V, MyX),
+ move(DG, V, [MyX+Width | ChLX], DeltaX).
+
+move(_DG, _L, LastX, 0) -> LastX;
+move(DG, V, LastX, DeltaX) -> move2(DG, V, LastX, DeltaX).
+
+move2(DG, V, LastX, DeltaX) ->
+ NewX = appmon_dg:get(x, DG, V)+DeltaX,
+ appmon_dg:set(x, DG, V, NewX),
+ ChLX = lists:foldl(fun(C, LX) -> move2(DG, C, LX, DeltaX) end,
+ tll(LastX),
+ appmon_dg:get(out, DG, V)),
+ [max(NewX+appmon_dg:get(w, DG, V), hdd(LastX)) | ChLX].
+
+max(A, B) when A>B -> A;
+max(_, B) -> B.
+
+calc_mid(_DG, _Width, []) -> 0;
+calc_mid(DG, Width, ChList) ->
+ LeftMostX = appmon_dg:get(x, DG, hd(ChList)),
+ Z2 = lists:last(ChList),
+ RightMostX = appmon_dg:get(x, DG, Z2)+appmon_dg:get(w, DG, Z2),
+ trunc((LeftMostX+RightMostX)/2)-trunc(Width/2).
+
+calc_delta(Mid, Right) ->
+ if Right>Mid -> Right-Mid;
+ true -> 0
+ end.
+
+%% Special head and tail
+%% Handles empty list in a non-standard way
+tll([]) -> [];
+tll([_|T]) -> T.
+hdd([]) -> 0;
+hdd([H|_]) -> H.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/areq.erl b/lib/dialyzer/test/small_SUITE_data/src/areq.erl
new file mode 100644
index 0000000000..66bb30491c
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/areq.erl
@@ -0,0 +1,11 @@
+-module(areq).
+
+-export([t/0]).
+
+t() ->
+ ar_comp(3.0, 3),
+ ex_comp(3.0, 3).
+
+ar_comp(X, Y) -> X == Y.
+
+ex_comp(X, Y) -> X =:= Y.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/atom_call.erl b/lib/dialyzer/test/small_SUITE_data/src/atom_call.erl
new file mode 100644
index 0000000000..2b70503144
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/atom_call.erl
@@ -0,0 +1,14 @@
+%%%-------------------------------------------------------------------
+%%% File : atom_call.erl
+%%% Author : Tobias Lindahl <[email protected]>
+%%% Description :
+%%%
+%%% Created : 10 Dec 2007 by Tobias Lindahl <[email protected]>
+%%%-------------------------------------------------------------------
+-module(atom_call).
+
+-export([f/0,g/0]).
+
+f() -> ok.
+
+g() -> F = f, F().
diff --git a/lib/dialyzer/test/small_SUITE_data/src/atom_guard.erl b/lib/dialyzer/test/small_SUITE_data/src/atom_guard.erl
new file mode 100644
index 0000000000..95581b339a
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/atom_guard.erl
@@ -0,0 +1,8 @@
+-module(atom_guard).
+-export([test/0]).
+
+test() ->
+ foo(42).
+
+foo(X) when is_atom(x) ->
+ X.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/atom_widen.erl b/lib/dialyzer/test/small_SUITE_data/src/atom_widen.erl
new file mode 100644
index 0000000000..81bfac9d56
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/atom_widen.erl
@@ -0,0 +1,24 @@
+%%---------------------------------------------------------------------
+%% Tests that the set widening limit is at least as big as 13,
+%% which allows for the following discrepancy to be detected.
+%%---------------------------------------------------------------------
+
+-module(atom_widen).
+-export([test/0, foo/1]).
+
+test() ->
+ foo(z).
+
+foo(a) -> 1;
+foo(b) -> 2;
+foo(c) -> 3;
+foo(d) -> 4;
+foo(e) -> 5;
+foo(f) -> 6;
+foo(g) -> 7;
+foo(h) -> 8;
+foo(i) -> 9;
+foo(k) -> 10;
+foo(l) -> 11;
+foo(m) -> 12;
+foo(n) -> 13.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/bin_compr.erl b/lib/dialyzer/test/small_SUITE_data/src/bin_compr.erl
new file mode 100644
index 0000000000..8c2497ed21
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/bin_compr.erl
@@ -0,0 +1,16 @@
+%%% -*- erlang-indent-level: 2 -*-
+%%%------------------------------------------------------------------------
+%%% File : bin_compr.erl
+%%% Purpose : Test case which crashes in dialyzer_dataflow:bind_bin_segs/5.
+%%%------------------------------------------------------------------------
+
+-module(bin_compr).
+
+-export([bc/1]).
+
+%% The binary comprehension below is stupid: it consumes the whole
+%% bitstr in one go and produces a [666] result provided Bits is a
+%% bitstr of at least 8 bits. Still, this is a valid Erlang program
+%% and dialyzer's analysis should not crash on it.
+bc(Bits) ->
+ [666 || <<_:8/integer, _/bits>> <= Bits].
diff --git a/lib/dialyzer/test/small_SUITE_data/src/blame_contract_range.erl b/lib/dialyzer/test/small_SUITE_data/src/blame_contract_range.erl
new file mode 100644
index 0000000000..efd3332b44
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/blame_contract_range.erl
@@ -0,0 +1,16 @@
+%%-----------------------------------------------------------------------
+%% A test where the contract is wrongly specified by the programmer;
+%% however, this is found only by refinement.
+%% Dialyzer in R14B01 and prior gave a confusing (if not bogus) warning
+%% for this case. Corrected in R14B02.
+%%-----------------------------------------------------------------------
+-module(blame_contract_range).
+
+-export([foo/0]).
+
+foo() ->
+ bar(b).
+
+-spec bar(atom()) -> a.
+bar(a) -> a;
+bar(b) -> b.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/bs_fail_constr.erl b/lib/dialyzer/test/small_SUITE_data/src/bs_fail_constr.erl
new file mode 100644
index 0000000000..8c1f8c009a
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/bs_fail_constr.erl
@@ -0,0 +1,15 @@
+-module(bs_fail_constr).
+
+-export([w1/1, w2/1, w3/1, w4/1]).
+
+w1(V) when is_float(V) ->
+ <<V/integer>>.
+
+w2(V) when is_atom(V) ->
+ <<V/binary>>.
+
+w3(S) when is_integer(S), S < 0 ->
+ <<42:S/integer>>.
+
+w4(V) when is_float(V) ->
+ <<V/utf32>>.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/bs_utf8.erl b/lib/dialyzer/test/small_SUITE_data/src/bs_utf8.erl
new file mode 100644
index 0000000000..5fe28f1da1
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/bs_utf8.erl
@@ -0,0 +1,27 @@
+%%--------------------------------------------------------------------
+%% Test case that exposed a bug (bogus warning) in dialyzer_dataflow
+%% when refining binaries containing UTF-based segments. Reported by
+%% Patrik Nyblom on 4/3/2009 and fixed by Kostis Sagonas on 31/3/2009.
+%%--------------------------------------------------------------------
+
+-module(bs_utf8).
+
+-export([doit/2]).
+
+doit(N, Bin) when is_integer(N), N > 0 ->
+ count_and_find(Bin, N).
+
+count_and_find(Bin, N) when is_binary(Bin) ->
+ cafu(Bin, N, 0, 0, no_pos).
+
+cafu(<<>>, _N, Count, _ByteCount, SavePos) ->
+ {Count, SavePos};
+cafu(<<_/utf8, Rest/binary>>, 0, Count, ByteCount, _SavePos) ->
+ cafu(Rest, -1, Count+1, 0, ByteCount);
+cafu(<<_/utf8, Rest/binary>>, N, Count, _ByteCount, SavePos) when N < 0 ->
+ cafu(Rest, -1, Count+1, 0, SavePos);
+cafu(<<_/utf8, Rest/binary>> = Whole, N, Count, ByteCount, SavePos) ->
+ Delta = byte_size(Whole) - byte_size(Rest),
+ cafu(Rest, N-1, Count+1, ByteCount+Delta, SavePos);
+cafu(_Other, _N, Count, ByteCount, _SavePos) -> % Non Unicode character at end
+ {Count, ByteCount}.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/cerl_hipeify.erl b/lib/dialyzer/test/small_SUITE_data/src/cerl_hipeify.erl
new file mode 100644
index 0000000000..b7883e7b49
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/cerl_hipeify.erl
@@ -0,0 +1,684 @@
+%% =====================================================================
+%% This library is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU Lesser General Public License as
+%% published by the Free Software Foundation; either version 2 of the
+%% License, or (at your option) any later version.
+%%
+%% This library is distributed in the hope that it will be useful, but
+%% WITHOUT ANY WARRANTY; without even the implied warranty of
+%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+%% Lesser General Public License for more details.
+%%
+%% 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
+%% USA
+%%
+%% $Id: cerl_hipeify.erl,v 1.1 2008/12/17 09:53:49 mikpe Exp $
+%%
+%% @author Richard Carlsson <[email protected]>
+%% @copyright 2000-2004 Richard Carlsson
+%% @doc HiPE-ification of Core Erlang code. Prepares Core Erlang code
+%% for translation to ICode.
+%% @see cerl_to_icode
+
+-module(cerl_hipeify).
+
+-export([transform/2]).
+
+-define(PRIMOP_IDENTITY, identity). % arity 1
+-define(PRIMOP_NOT, 'not'). % arity 1
+-define(PRIMOP_AND, 'and'). % arity 2
+-define(PRIMOP_OR, 'or'). % arity 2
+-define(PRIMOP_XOR, 'xor'). % arity 2
+-define(PRIMOP_ADD, '+'). % arity 2
+-define(PRIMOP_SUB, '-'). % arity 2
+-define(PRIMOP_NEG, neg). % arity 1
+-define(PRIMOP_MUL, '*'). % arity 2
+-define(PRIMOP_DIV, '/'). % arity 2
+-define(PRIMOP_INTDIV, 'div'). % arity 2
+-define(PRIMOP_REM, 'rem'). % arity 2
+-define(PRIMOP_BAND, 'band'). % arity 2
+-define(PRIMOP_BOR, 'bor'). % arity 2
+-define(PRIMOP_BXOR, 'bxor'). % arity 2
+-define(PRIMOP_BNOT, 'bnot'). % arity 1
+-define(PRIMOP_BSL, 'bsl'). % arity 2
+-define(PRIMOP_BSR, 'bsr'). % arity 2
+-define(PRIMOP_EQ, '=='). % arity 2
+-define(PRIMOP_NE, '/='). % arity 2
+-define(PRIMOP_EXACT_EQ, '=:='). % arity 2
+-define(PRIMOP_EXACT_NE, '=/='). % arity 2
+-define(PRIMOP_LT, '<'). % arity 2
+-define(PRIMOP_GT, '>'). % arity 2
+-define(PRIMOP_LE, '=<'). % arity 2
+-define(PRIMOP_GE, '>='). % arity 2
+-define(PRIMOP_IS_ATOM, 'is_atom'). % arity 1
+-define(PRIMOP_IS_BIGNUM, 'is_bignum'). % arity 1
+-define(PRIMOP_IS_BINARY, 'is_binary'). % arity 1
+-define(PRIMOP_IS_CONSTANT, 'is_constant'). % arity 1
+-define(PRIMOP_IS_FIXNUM, 'is_fixnum'). % arity 1
+-define(PRIMOP_IS_FLOAT, 'is_float'). % arity 1
+-define(PRIMOP_IS_FUNCTION, 'is_function'). % arity 1
+-define(PRIMOP_IS_INTEGER, 'is_integer'). % arity 1
+-define(PRIMOP_IS_LIST, 'is_list'). % arity 1
+-define(PRIMOP_IS_NUMBER, 'is_number'). % arity 1
+-define(PRIMOP_IS_PID, 'is_pid'). % arity 1
+-define(PRIMOP_IS_PORT, 'is_port'). % arity 1
+-define(PRIMOP_IS_REFERENCE, 'is_reference'). % arity 1
+-define(PRIMOP_IS_TUPLE, 'is_tuple'). % arity 1
+-define(PRIMOP_IS_RECORD, 'is_record'). % arity 3
+-define(PRIMOP_EXIT, exit). % arity 1
+-define(PRIMOP_THROW, throw). % arity 1
+-define(PRIMOP_ERROR, error). % arity 1,2
+-define(PRIMOP_RETHROW, raise). % arity 2
+-define(PRIMOP_RECEIVE_SELECT, receive_select). % arity 0
+-define(PRIMOP_RECEIVE_NEXT, receive_next). % arity 0
+-define(PRIMOP_ELEMENT, element). % arity 2
+-define(PRIMOP_DSETELEMENT, dsetelement). % arity 3
+-define(PRIMOP_MAKE_FUN, make_fun). % arity 6
+-define(PRIMOP_APPLY_FUN, apply_fun). % arity 2
+-define(PRIMOP_FUN_ELEMENT, closure_element). % arity 2
+-define(PRIMOP_SET_LABEL, set_label). % arity 1
+-define(PRIMOP_GOTO_LABEL, goto_label). % arity 1
+-define(PRIMOP_REDUCTION_TEST, reduction_test). % arity 0
+
+-record(ctxt, {class = expr}).
+
+
+%% @spec transform(Module::cerl(), Options::[term()]) -> cerl()
+%%
+%% cerl() = cerl:cerl()
+%%
+%% @doc Rewrites a Core Erlang module to a form suitable for further
+%% translation to HiPE Icode. See module <code>cerl_to_icode</code> for
+%% details.
+%%
+%% @see cerl_to_icode
+%% @see cerl_cconv
+
+transform(E, Opts) ->
+ %% Start by closure converting the code
+ module(cerl_cconv:transform(E, Opts), Opts).
+
+module(E, Opts) ->
+ {Ds, Env, Ren} = add_defs(cerl:module_defs(E), env__new(),
+ ren__new()),
+ M = cerl:module_name(E),
+ S0 = s__new(cerl:atom_val(M)),
+ S = s__set_pmatch(proplists:get_value(pmatch, Opts), S0),
+ {Ds1, _} = defs(Ds, true, Env, Ren, S),
+ cerl:update_c_module(E, M, cerl:module_exports(E),
+ cerl:module_attrs(E), Ds1).
+
+%% Note that the environment is defined on the renamed variables.
+
+expr(E0, Env, Ren, Ctxt, S0) ->
+ %% Do peephole optimizations as we traverse the code.
+ E = cerl_lib:reduce_expr(E0),
+ case cerl:type(E) of
+ literal ->
+ {E, S0};
+ var ->
+ variable(E, Env, Ren, Ctxt, S0);
+ values ->
+ {Es, S1} = expr_list(cerl:values_es(E), Env, Ren, Ctxt, S0),
+ {cerl:update_c_values(E, Es), S1};
+ cons ->
+ {E1, S1} = expr(cerl:cons_hd(E), Env, Ren, Ctxt, S0),
+ {E2, S2} = expr(cerl:cons_tl(E), Env, Ren, Ctxt, S1),
+ {cerl:update_c_cons(E, E1, E2), S2};
+ tuple ->
+ {Es, S1} = expr_list(cerl:tuple_es(E), Env, Ren, Ctxt, S0),
+ {cerl:update_c_tuple(E, Es), S1};
+ 'let' ->
+ let_expr(E, Env, Ren, Ctxt, S0);
+ seq ->
+ {A, S1} = expr(cerl:seq_arg(E), Env, Ren, Ctxt, S0),
+ {B, S2} = expr(cerl:seq_body(E), Env, Ren, Ctxt, S1),
+ {cerl:update_c_seq(E, A, B), S2};
+ apply ->
+ {Op, S1} = expr(cerl:apply_op(E), Env, Ren, Ctxt, S0),
+ {As, S2} = expr_list(cerl:apply_args(E), Env, Ren, Ctxt, S1),
+ {cerl:update_c_apply(E, Op, As), S2};
+ call ->
+ {M, S1} = expr(cerl:call_module(E), Env, Ren, Ctxt, S0),
+ {N, S2} = expr(cerl:call_name(E), Env, Ren, Ctxt, S1),
+ {As, S3} = expr_list(cerl:call_args(E), Env, Ren, Ctxt, S2),
+ {rewrite_call(E, M, N, As, S3), S3};
+ primop ->
+ {As, S1} = expr_list(cerl:primop_args(E), Env, Ren, Ctxt, S0),
+ N = cerl:primop_name(E),
+ {rewrite_primop(E, N, As, S1), S1};
+ 'case' ->
+ {A, S1} = expr(cerl:case_arg(E), Env, Ren, Ctxt, S0),
+ {E1, Vs, S2} = clauses(cerl:case_clauses(E), Env, Ren, Ctxt, S1),
+ {cerl:c_let(Vs, A, E1), S2};
+ 'fun' ->
+ Vs = cerl:fun_vars(E),
+ {Vs1, Env1, Ren1} = add_vars(Vs, Env, Ren),
+ {B, S1} = expr(cerl:fun_body(E), Env1, Ren1, Ctxt, S0),
+ {cerl:update_c_fun(E, Vs1, B), S1};
+ 'receive' ->
+ receive_expr(E, Env, Ren, Ctxt, S0);
+ 'try' ->
+ {A, S1} = expr(cerl:try_arg(E), Env, Ren, Ctxt, S0),
+ Vs = cerl:try_vars(E),
+ {Vs1, Env1, Ren1} = add_vars(Vs, Env, Ren),
+ {B, S2} = expr(cerl:try_body(E), Env1, Ren1, Ctxt, S1),
+ Evs = cerl:try_evars(E),
+ {Evs1, Env2, Ren2} = add_vars(Evs, Env, Ren),
+ {H, S3} = expr(cerl:try_handler(E), Env2, Ren2, Ctxt, S2),
+ {cerl:update_c_try(E, A, Vs1, B, Evs1, H), S3};
+ 'catch' ->
+ catch_expr(E, Env, Ren, Ctxt, S0);
+ letrec ->
+ {Ds, Env1, Ren1} = add_defs(cerl:letrec_defs(E), Env, Ren),
+ {Ds1, S1} = defs(Ds, false, Env1, Ren1, S0),
+ {B, S2} = expr(cerl:letrec_body(E), Env1, Ren1, Ctxt, S1),
+ {cerl:update_c_letrec(E, Ds1, B), S2};
+ binary ->
+ {Segs, S1}=expr_list(cerl:binary_segments(E), Env, Ren,
+ Ctxt, S0),
+ {cerl:update_c_binary(E, Segs), S1};
+ bitstr ->
+ {E1,S1} = expr(cerl:bitstr_val(E), Env, Ren, Ctxt, S0),
+ {E2,S2} = expr(cerl:bitstr_size(E), Env, Ren, Ctxt, S1),
+ E3 = cerl:bitstr_unit(E),
+ E4 = cerl:bitstr_type(E),
+ E5 = cerl:bitstr_flags(E),
+ {cerl:update_c_bitstr(E, E1, E2, E3, E4, E5), S2}
+ end.
+
+guard_expr(E, Env, Ren, Ctxt, S) ->
+ expr(E, Env, Ren, Ctxt#ctxt{class = guard}, S).
+
+expr_list(Es, Env, Ren, Ctxt, S0) ->
+ list(Es, Env, Ren, Ctxt, S0, fun expr/5).
+
+list([E | Es], Env, Ren, Ctxt, S0, F) ->
+ {E1, S1} = F(E, Env, Ren, Ctxt, S0),
+ {Es1, S2} = list(Es, Env, Ren, Ctxt, S1, F),
+ {[E1 | Es1], S2};
+list([], _, _, _, S, _) ->
+ {[], S}.
+
+pattern(E, Env, Ren) ->
+ case cerl:type(E) of
+ literal ->
+ E;
+ var ->
+ cerl:update_c_var(E, ren__map(cerl:var_name(E), Ren));
+ values ->
+ Es = pattern_list(cerl:values_es(E), Env, Ren),
+ cerl:update_c_values(E, Es);
+ cons ->
+ E1 = pattern(cerl:cons_hd(E), Env, Ren),
+ E2 = pattern(cerl:cons_tl(E), Env, Ren),
+ cerl:update_c_cons(E, E1, E2);
+ tuple ->
+ Es = pattern_list(cerl:tuple_es(E), Env, Ren),
+ cerl:update_c_tuple(E, Es);
+ alias ->
+ V = pattern(cerl:alias_var(E), Env, Ren),
+ P = pattern(cerl:alias_pat(E), Env, Ren),
+ cerl:update_c_alias(E, V, P);
+ binary ->
+ Segs=pattern_list(cerl:binary_segments(E), Env, Ren),
+ cerl:update_c_binary(E, Segs);
+ bitstr ->
+ E1 = pattern(cerl:bitstr_val(E), Env, Ren),
+ E2 = pattern(cerl:bitstr_size(E), Env, Ren),
+ E3 = cerl:bitstr_unit(E),
+ E4 = cerl:bitstr_type(E),
+ E5 = cerl:bitstr_flags(E),
+ cerl:update_c_bitstr(E, E1, E2, E3, E4, E5)
+ end.
+
+
+
+pattern_list([E | Es], Env, Ren) ->
+ [pattern(E, Env, Ren) | pattern_list(Es, Env, Ren)];
+pattern_list([], _, _) ->
+ [].
+
+%% Visit the function body of each definition. We insert an explicit
+%% reduction test at the start of each function.
+
+defs(Ds, Top, Env, Ren, S) ->
+ defs(Ds, [], Top, Env, Ren, S).
+
+defs([{V, F} | Ds], Ds1, Top, Env, Ren, S0) ->
+ S1 = case Top of
+ true -> s__enter_function(cerl:var_name(V), S0);
+ false -> S0
+ end,
+ {B, S2} = expr(cerl:fun_body(F), Env, Ren, #ctxt{}, S1),
+ B1 = cerl:c_seq(cerl:c_primop(cerl:c_atom(?PRIMOP_REDUCTION_TEST),
+ []),
+ B),
+ F1 = cerl:update_c_fun(F, cerl:fun_vars(F), B1),
+ defs(Ds, [{V, F1} | Ds1], Top, Env, Ren, S2);
+defs([], Ds, _Top, _Env, _Ren, S) ->
+ {lists:reverse(Ds), S}.
+
+clauses([C|_]=Cs, Env, Ren, Ctxt, S) ->
+ {Cs1, S1} = clause_list(Cs, Env, Ren, Ctxt, S),
+ %% Perform pattern matching compilation on the clauses.
+ {E, Vs} = case s__get_pmatch(S) of
+ true ->
+ cerl_pmatch:clauses(Cs1, Env);
+ no_duplicates ->
+ put('cerl_pmatch_duplicate_code', never),
+ cerl_pmatch:clauses(Cs1, Env);
+ duplicate_all ->
+ put('cerl_pmatch_duplicate_code', always),
+ cerl_pmatch:clauses(Cs1, Env);
+ Other when Other == false; Other == undefined ->
+ Vs0 = new_vars(cerl:clause_arity(C), Env),
+ {cerl:c_case(cerl:c_values(Vs0), Cs1), Vs0}
+ end,
+ %% We must make sure that we also visit any clause guards generated
+ %% by the pattern matching compilation. We pass an empty renaming,
+ %% so we do not rename any variables twice.
+ {E1, S2} = revisit_expr(E, Env, ren__new(), Ctxt, S1),
+ {E1, Vs, S2}.
+
+clause_list(Cs, Env, Ren, Ctxt, S) ->
+ list(Cs, Env, Ren, Ctxt, S, fun clause/5).
+
+clause(E, Env, Ren, Ctxt, S0) ->
+ Vs = cerl:clause_vars(E),
+ {_, Env1, Ren1} = add_vars(Vs, Env, Ren),
+ %% Visit patterns to rename variables.
+ Ps = pattern_list(cerl:clause_pats(E), Env1, Ren1),
+ {G, S1} = guard_expr(cerl:clause_guard(E), Env1, Ren1, Ctxt, S0),
+ {B, S2} = expr(cerl:clause_body(E), Env1, Ren1, Ctxt, S1),
+ {cerl:update_c_clause(E, Ps, G, B), S2}.
+
+%% This does what 'expr' does, but only recurses into clause guard
+%% expressions, 'case'-expressions, and the bodies of lets and letrecs.
+%% Note that revisiting should not add further renamings, and we simply
+%% ignore making any bindings at all at this level.
+
+revisit_expr(E, Env, Ren, Ctxt, S0) ->
+ %% Also enable peephole optimizations here.
+ revisit_expr_1(cerl_lib:reduce_expr(E), Env, Ren, Ctxt, S0).
+
+revisit_expr_1(E, Env, Ren, Ctxt, S0) ->
+ case cerl:type(E) of
+ 'case' ->
+ {Cs, S1} = revisit_clause_list(cerl:case_clauses(E), Env,
+ Ren, Ctxt, S0),
+ {cerl:update_c_case(E, cerl:case_arg(E), Cs), S1};
+ 'let' ->
+ {B, S1} = revisit_expr(cerl:let_body(E), Env, Ren, Ctxt, S0),
+ {cerl:update_c_let(E, cerl:let_vars(E), cerl:let_arg(E), B),
+ S1};
+ 'letrec' ->
+ {B, S1} = revisit_expr(cerl:letrec_body(E), Env, Ren, Ctxt, S0),
+ {cerl:update_c_letrec(E, cerl:letrec_defs(E), B), S1};
+ _ ->
+ {E, S0}
+ end.
+
+revisit_clause_list(Cs, Env, Ren, Ctxt, S) ->
+ list(Cs, Env, Ren, Ctxt, S, fun revisit_clause/5).
+
+revisit_clause(E, Env, Ren, Ctxt, S0) ->
+ %% Ignore the bindings.
+ {G, S1} = guard_expr(cerl:clause_guard(E), Env, Ren, Ctxt, S0),
+ {B, S2} = revisit_expr(cerl:clause_body(E), Env, Ren, Ctxt, S1),
+ {cerl:update_c_clause(E, cerl:clause_pats(E), G, B), S2}.
+
+%% We use the no-shadowing strategy, renaming variables on the fly and
+%% only when necessary to uphold the invariant.
+
+add_vars(Vs, Env, Ren) ->
+ add_vars(Vs, [], Env, Ren).
+
+add_vars([V | Vs], Vs1, Env, Ren) ->
+ Name = cerl:var_name(V),
+ {Name1, Ren1} = rename(Name, Env, Ren),
+ add_vars(Vs, [cerl:update_c_var(V, Name1) | Vs1],
+ env__bind(Name1, variable, Env), Ren1);
+add_vars([], Vs, Env, Ren) ->
+ {lists:reverse(Vs), Env, Ren}.
+
+rename(Name, Env, Ren) ->
+ case env__is_defined(Name, Env) of
+ false ->
+ {Name, Ren};
+ true ->
+ New = env__new_name(Env),
+ {New, ren__add(Name, New, Ren)}
+ end.
+
+%% Setting up the environment for a list of letrec-bound definitions.
+
+add_defs(Ds, Env, Ren) ->
+ add_defs(Ds, [], Env, Ren).
+
+add_defs([{V, F} | Ds], Ds1, Env, Ren) ->
+ Name = cerl:var_name(V),
+ {Name1, Ren1} =
+ case env__is_defined(Name, Env) of
+ false ->
+ {Name, Ren};
+ true ->
+ {N, A} = Name,
+ S = atom_to_list(N) ++ "_",
+ F = fun (Num) -> %% XXX: BUG: This should be F1
+ {list_to_atom(S ++ integer_to_list(Num)), A}
+ end,
+ New = env__new_function_name(F, Env),
+ {New, ren__add(Name, New, Ren)}
+ end,
+ add_defs(Ds, [{cerl:update_c_var(V, Name1), F} | Ds1],
+ env__bind(Name1, function, Env), Ren1);
+add_defs([], Ds, Env, Ren) ->
+ {lists:reverse(Ds), Env, Ren}.
+
+%% We change remote calls to important built-in functions into primop
+%% calls. In some cases (e.g., for the boolean operators), this is
+%% mainly to allow the cerl_to_icode module to handle them more
+%% straightforwardly. In most cases however, it is simply because they
+%% are supposed to be represented as primop calls on the Icode level.
+
+rewrite_call(E, M, F, As, S) ->
+ case cerl:is_c_atom(M) and cerl:is_c_atom(F) of
+ true ->
+ case call_to_primop(cerl:atom_val(M),
+ cerl:atom_val(F),
+ length(As))
+ of
+ {yes, N} ->
+ %% The primop might need further handling
+ N1 = cerl:c_atom(N),
+ E1 = cerl:update_c_primop(E, N1, As),
+ rewrite_primop(E1, N1, As, S);
+ no ->
+ cerl:update_c_call(E, M, F, As)
+ end;
+ false ->
+ cerl:update_c_call(E, M, F, As)
+ end.
+
+call_to_primop(erlang, 'not', 1) -> {yes, ?PRIMOP_NOT};
+call_to_primop(erlang, 'and', 2) -> {yes, ?PRIMOP_AND};
+call_to_primop(erlang, 'or', 2) -> {yes, ?PRIMOP_OR};
+call_to_primop(erlang, 'xor', 2) -> {yes, ?PRIMOP_XOR};
+call_to_primop(erlang, '+', 2) -> {yes, ?PRIMOP_ADD};
+call_to_primop(erlang, '+', 1) -> {yes, ?PRIMOP_IDENTITY};
+call_to_primop(erlang, '-', 2) -> {yes, ?PRIMOP_SUB};
+call_to_primop(erlang, '-', 1) -> {yes, ?PRIMOP_NEG};
+call_to_primop(erlang, '*', 2) -> {yes, ?PRIMOP_MUL};
+call_to_primop(erlang, '/', 2) -> {yes, ?PRIMOP_DIV};
+call_to_primop(erlang, 'div', 2) -> {yes, ?PRIMOP_INTDIV};
+call_to_primop(erlang, 'rem', 2) -> {yes, ?PRIMOP_REM};
+call_to_primop(erlang, 'band', 2) -> {yes, ?PRIMOP_BAND};
+call_to_primop(erlang, 'bor', 2) -> {yes, ?PRIMOP_BOR};
+call_to_primop(erlang, 'bxor', 2) -> {yes, ?PRIMOP_BXOR};
+call_to_primop(erlang, 'bnot', 1) -> {yes, ?PRIMOP_BNOT};
+call_to_primop(erlang, 'bsl', 2) -> {yes, ?PRIMOP_BSL};
+call_to_primop(erlang, 'bsr', 2) -> {yes, ?PRIMOP_BSR};
+call_to_primop(erlang, '==', 2) -> {yes, ?PRIMOP_EQ};
+call_to_primop(erlang, '/=', 2) -> {yes, ?PRIMOP_NE};
+call_to_primop(erlang, '=:=', 2) -> {yes, ?PRIMOP_EXACT_EQ};
+call_to_primop(erlang, '=/=', 2) -> {yes, ?PRIMOP_EXACT_NE};
+call_to_primop(erlang, '<', 2) -> {yes, ?PRIMOP_LT};
+call_to_primop(erlang, '>', 2) -> {yes, ?PRIMOP_GT};
+call_to_primop(erlang, '=<', 2) -> {yes, ?PRIMOP_LE};
+call_to_primop(erlang, '>=', 2) -> {yes, ?PRIMOP_GE};
+call_to_primop(erlang, is_atom, 1) -> {yes, ?PRIMOP_IS_ATOM};
+call_to_primop(erlang, is_binary, 1) -> {yes, ?PRIMOP_IS_BINARY};
+call_to_primop(erlang, is_constant, 1) -> {yes, ?PRIMOP_IS_CONSTANT};
+call_to_primop(erlang, is_float, 1) -> {yes, ?PRIMOP_IS_FLOAT};
+call_to_primop(erlang, is_function, 1) -> {yes, ?PRIMOP_IS_FUNCTION};
+call_to_primop(erlang, is_integer, 1) -> {yes, ?PRIMOP_IS_INTEGER};
+call_to_primop(erlang, is_list, 1) -> {yes, ?PRIMOP_IS_LIST};
+call_to_primop(erlang, is_number, 1) -> {yes, ?PRIMOP_IS_NUMBER};
+call_to_primop(erlang, is_pid, 1) -> {yes, ?PRIMOP_IS_PID};
+call_to_primop(erlang, is_port, 1) -> {yes, ?PRIMOP_IS_PORT};
+call_to_primop(erlang, is_reference, 1) -> {yes, ?PRIMOP_IS_REFERENCE};
+call_to_primop(erlang, is_tuple, 1) -> {yes, ?PRIMOP_IS_TUPLE};
+call_to_primop(erlang, internal_is_record, 3) -> {yes, ?PRIMOP_IS_RECORD};
+call_to_primop(erlang, element, 2) -> {yes, ?PRIMOP_ELEMENT};
+call_to_primop(erlang, exit, 1) -> {yes, ?PRIMOP_EXIT};
+call_to_primop(erlang, throw, 1) -> {yes, ?PRIMOP_THROW};
+call_to_primop(erlang, error, 1) -> {yes, ?PRIMOP_ERROR};
+call_to_primop(erlang, error, 2) -> {yes, ?PRIMOP_ERROR};
+call_to_primop(erlang, fault, 1) -> {yes, ?PRIMOP_ERROR};
+call_to_primop(erlang, fault, 2) -> {yes, ?PRIMOP_ERROR};
+call_to_primop(_, _, _) -> no.
+
+%% Also, some primops (introduced by Erlang to Core Erlang translation
+%% and possibly other stages) must be recognized and rewritten.
+
+rewrite_primop(E, N, As, S) ->
+ case {cerl:atom_val(N), As} of
+ {match_fail, [R]} ->
+ M = s__get_module_name(S),
+ {F, A} = s__get_function_name(S),
+ Stack = cerl:abstract([{M, F, A}]),
+ case cerl:type(R) of
+ tuple ->
+ %% Function clause failures have a special encoding
+ %% as '{function_clause, Arg1, ..., ArgN}'.
+ case cerl:tuple_es(R) of
+ [X | Xs] ->
+ case cerl:is_c_atom(X) of
+ true ->
+ case cerl:atom_val(X) of
+ function_clause ->
+ FStack = cerl:make_list(
+ [cerl:c_tuple(
+ [cerl:c_atom(M),
+ cerl:c_atom(F),
+ cerl:make_list(Xs)])]),
+ match_fail(E, X, FStack);
+ _ ->
+ match_fail(E, R, Stack)
+ end;
+ false ->
+ match_fail(E, R, Stack)
+ end;
+ _ ->
+ match_fail(E, R, Stack)
+ end;
+ _ ->
+ match_fail(E, R, Stack)
+ end;
+ _ ->
+ cerl:update_c_primop(E, N, As)
+ end.
+
+match_fail(E, R, Stack) ->
+ cerl:update_c_primop(E, cerl:c_atom(?PRIMOP_ERROR), [R, Stack]).
+
+%% Simple let-definitions (of degree 1) in guard context are always
+%% inline expanded. This is allowable, since they cannot have side
+%% effects, and it makes it easy to generate good code for boolean
+%% expressions. It could cause repeated evaluations, but typically,
+%% local definitions within guards are used exactly once.
+
+let_expr(E, Env, Ren, Ctxt, S) ->
+ if Ctxt#ctxt.class == guard ->
+ case cerl:let_vars(E) of
+ [V] ->
+ {Name, Ren1} = rename(cerl:var_name(V), Env, Ren),
+ Env1 = env__bind(Name, {expr, cerl:let_arg(E)}, Env),
+ expr(cerl:let_body(E), Env1, Ren1, Ctxt, S);
+ _ ->
+ let_expr_1(E, Env, Ren, Ctxt, S)
+ end;
+ true ->
+ let_expr_1(E, Env, Ren, Ctxt, S)
+ end.
+
+let_expr_1(E, Env, Ren, Ctxt, S0) ->
+ {A, S1} = expr(cerl:let_arg(E), Env, Ren, Ctxt, S0),
+ Vs = cerl:let_vars(E),
+ {Vs1, Env1, Ren1} = add_vars(Vs, Env, Ren),
+ {B, S2} = expr(cerl:let_body(E), Env1, Ren1, Ctxt, S1),
+ {cerl:update_c_let(E, Vs1, A, B), S2}.
+
+variable(E, Env, Ren, Ctxt, S) ->
+ V = ren__map(cerl:var_name(E), Ren),
+ if Ctxt#ctxt.class == guard ->
+ case env__lookup(V, Env) of
+ {ok, {expr, E1}} ->
+ expr(E1, Env, Ren, Ctxt, S); % inline
+ _ ->
+ %% Since we don't track all bindings when we revisit
+ %% guards, some names will not be in the environment.
+ variable_1(E, V, S)
+ end;
+ true ->
+ variable_1(E, V, S)
+ end.
+
+variable_1(E, V, S) ->
+ {cerl:update_c_var(E, V), S}.
+
+%% A catch-expression 'catch Expr' is rewritten as:
+%%
+%% try Expr
+%% of (V) -> V
+%% catch (T, V, E) ->
+%% letrec 'wrap'/1 = fun (V) -> {'EXIT', V}
+%% in case T of
+%% 'throw' when 'true' -> V
+%% 'exit' when 'true' -> 'wrap'/1(V)
+%% V when 'true' ->
+%% 'wrap'/1({V, erlang:get_stacktrace()})
+%% end
+
+catch_expr(E, Env, Ren, Ctxt, S) ->
+ T = cerl:c_var('T'),
+ V = cerl:c_var('V'),
+ X = cerl:c_var('X'),
+ W = cerl:c_var({wrap,1}),
+ G = cerl:c_call(cerl:c_atom('erlang'),cerl:c_atom('get_stacktrace'),[]),
+ Cs = [cerl:c_clause([cerl:c_atom('throw')], V),
+ cerl:c_clause([cerl:c_atom('exit')], cerl:c_apply(W, [V])),
+ cerl:c_clause([T], cerl:c_apply(W, [cerl:c_tuple([V,G])]))
+ ],
+ C = cerl:c_case(T, Cs),
+ F = cerl:c_fun([V], cerl:c_tuple([cerl:c_atom('EXIT'), V])),
+ H = cerl:c_letrec([{W,F}], C),
+ As = cerl:get_ann(E),
+ {B, S1} = expr(cerl:catch_body(E),Env, Ren, Ctxt, S),
+ {cerl:ann_c_try(As, B, [V], V, [T,V,X], H), S1}.
+
+%% Receive-expressions are rewritten as follows:
+%%
+%% receive
+%% P1 when G1 -> B1
+%% ...
+%% Pn when Gn -> Bn
+%% after T -> A end
+%% becomes:
+%% receive
+%% M when 'true' ->
+%% case M of
+%% P1 when G1 -> do primop RECEIVE_SELECT B1
+%% ...
+%% Pn when Gn -> do primop RECEIVE_SELECT Bn
+%% Pn+1 when 'true' -> primop RECEIVE_NEXT()
+%% end
+%% after T -> A end
+
+receive_expr(E, Env, Ren, Ctxt, S0) ->
+ Cs = cerl:receive_clauses(E),
+ {B, Vs, S1} = clauses(receive_clauses(Cs), Env, Ren, Ctxt, S0),
+ {T, S2} = expr(cerl:receive_timeout(E), Env, Ren, Ctxt, S1),
+ {A, S3} = expr(cerl:receive_action(E), Env, Ren, Ctxt, S2),
+ Cs1 = [cerl:c_clause(Vs, B)],
+ {cerl:update_c_receive(E, Cs1, T, A), S3}.
+
+receive_clauses([C | Cs]) ->
+ Call = cerl:c_primop(cerl:c_atom(?PRIMOP_RECEIVE_SELECT),
+ []),
+ B = cerl:c_seq(Call, cerl:clause_body(C)),
+ C1 = cerl:update_c_clause(C, cerl:clause_pats(C),
+ cerl:clause_guard(C), B),
+ [C1 | receive_clauses(Cs)];
+receive_clauses([]) ->
+ Call = cerl:c_primop(cerl:c_atom(?PRIMOP_RECEIVE_NEXT),
+ []),
+ V = cerl:c_var('X'), % any name is ok
+ [cerl:c_clause([V], Call)].
+
+
+new_vars(N, Env) ->
+ [cerl:c_var(V) || V <- env__new_names(N, Env)].
+
+
+%% ---------------------------------------------------------------------
+%% Environment
+
+env__new() ->
+ rec_env:empty().
+
+env__bind(Key, Value, Env) ->
+ rec_env:bind(Key, Value, Env).
+
+%% env__get(Key, Env) ->
+%% rec_env:get(Key, Env).
+
+env__lookup(Key, Env) ->
+ rec_env:lookup(Key, Env).
+
+env__is_defined(Key, Env) ->
+ rec_env:is_defined(Key, Env).
+
+env__new_name(Env) ->
+ rec_env:new_key(Env).
+
+env__new_names(N, Env) ->
+ rec_env:new_keys(N, Env).
+
+env__new_function_name(F, Env) ->
+ rec_env:new_key(F, Env).
+
+
+%% ---------------------------------------------------------------------
+%% Renaming
+
+ren__new() ->
+ dict:new().
+
+ren__add(Key, Value, Ren) ->
+ dict:store(Key, Value, Ren).
+
+ren__map(Key, Ren) ->
+ case dict:find(Key, Ren) of
+ {ok, Value} ->
+ Value;
+ error ->
+ Key
+ end.
+
+
+%% ---------------------------------------------------------------------
+%% State
+
+-record(state, {module, function, pmatch=true}).
+
+s__new(Module) ->
+ #state{module = Module}.
+
+s__get_module_name(S) ->
+ S#state.module.
+
+s__enter_function(F, S) ->
+ S#state{function = F}.
+
+s__get_function_name(S) ->
+ S#state.function.
+
+s__set_pmatch(V, S) ->
+ S#state{pmatch = V}.
+
+s__get_pmatch(S) ->
+ S#state.pmatch.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_acceptor.erl b/lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_acceptor.erl
new file mode 100644
index 0000000000..2ca1468911
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_acceptor.erl
@@ -0,0 +1,119 @@
+% Copyright 2008 Konrad-Zuse-Zentrum für Informationstechnik Berlin
+%
+% 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.
+%%%-------------------------------------------------------------------
+%%% File : comm_acceptor.erl
+%%% Author : Thorsten Schuett <[email protected]>
+%%% Description : Acceptor
+%%% This module accepts new connections and starts corresponding
+%%% comm_connection processes.
+%%%
+%%% Created : 18 Apr 2008 by Thorsten Schuett <[email protected]>
+%%%-------------------------------------------------------------------
+%% @author Thorsten Schuett <[email protected]>
+%% @copyright 2008 Konrad-Zuse-Zentrum für Informationstechnik Berlin
+%% @version $Id $
+-module(comm_layer_dir.comm_acceptor).
+
+-export([start_link/1, init/2]).
+
+-import(config).
+-import(gen_tcp).
+-import(inet).
+-import(log).
+-import(lists).
+-import(process_dictionary).
+
+start_link(InstanceId) ->
+ Pid = spawn_link(comm_layer_dir.comm_acceptor, init, [InstanceId, self()]),
+ receive
+ {started} ->
+ {ok, Pid}
+ end.
+
+init(InstanceId, Supervisor) ->
+ process_dictionary:register_process(InstanceId, acceptor, self()),
+ erlang:register(comm_layer_acceptor, self()),
+ log:log(info,"[ CC ] listening on ~p:~p", [config:listenIP(), config:listenPort()]),
+ LS = case config:listenIP() of
+ undefined ->
+ open_listen_port(config:listenPort(), first_ip());
+ _ ->
+ open_listen_port(config:listenPort(), config:listenIP())
+ end,
+ {ok, {_LocalAddress, LocalPort}} = inet:sockname(LS),
+ comm_port:set_local_address(undefined, LocalPort),
+ %io:format("this() == ~w~n", [{LocalAddress, LocalPort}]),
+ Supervisor ! {started},
+ server(LS).
+
+server(LS) ->
+ case gen_tcp:accept(LS) of
+ {ok, S} ->
+ case comm_port:get_local_address_port() of
+ {undefined, LocalPort} ->
+ {ok, {MyIP, _LocalPort}} = inet:sockname(S),
+ comm_port:set_local_address(MyIP, LocalPort);
+ _ ->
+ ok
+ end,
+ receive
+ {tcp, S, Msg} ->
+ {endpoint, Address, Port} = binary_to_term(Msg),
+ % auto determine remote address, when not sent correctly
+ NewAddress = if Address =:= {0,0,0,0} orelse Address =:= {127,0,0,1} ->
+ case inet:peername(S) of
+ {ok, {PeerAddress, _Port}} ->
+ % io:format("Sent Address ~p\n",[Address]),
+ % io:format("Peername is ~p\n",[PeerAddress]),
+ PeerAddress;
+ {error, _Why} ->
+ % io:format("Peername error ~p\n",[Why]).
+ Address
+ end;
+ true ->
+ % io:format("Address is ~p\n",[Address]),
+ Address
+ end,
+ NewPid = comm_connection:new(NewAddress, Port, S),
+ gen_tcp:controlling_process(S, NewPid),
+ inet:setopts(S, [{active, once}, {send_timeout, config:read(tcp_send_timeout)}]),
+ comm_port:register_connection(NewAddress, Port, NewPid, S)
+ end,
+ server(LS);
+ Other ->
+ log:log(warn,"[ CC ] unknown message ~p", [Other])
+ end.
+
+open_listen_port({From, To}, IP) ->
+ open_listen_port(lists:seq(From, To), IP);
+open_listen_port([Port | Rest], IP) ->
+ case gen_tcp:listen(Port, [binary, {packet, 4}, {reuseaddr, true},
+ {active, once}, {ip, IP}]) of
+ {ok, Socket} ->
+ Socket;
+ {error, Reason} ->
+ log:log(error,"[ CC ] can't listen on ~p: ~p~n", [Port, Reason]),
+ open_listen_port(Rest, IP)
+ end;
+open_listen_port([], _) ->
+ abort;
+open_listen_port(Port, IP) ->
+ open_listen_port([Port], IP).
+
+-include_lib("kernel/include/inet.hrl").
+
+first_ip() ->
+ {ok, Hostname} = inet:gethostname(),
+ {ok, HostEntry} = inet:gethostbyname(Hostname),
+ erlang:hd(HostEntry#hostent.h_addr_list).
diff --git a/lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_connection.erl b/lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_connection.erl
new file mode 100644
index 0000000000..48cc50ae21
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_connection.erl
@@ -0,0 +1,206 @@
+% Copyright 2008 Konrad-Zuse-Zentrum f�r Informationstechnik Berlin
+%
+% 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.
+%%%-------------------------------------------------------------------
+%%% File : comm_connection.erl
+%%% Author : Thorsten Schuett <[email protected]>
+%%% Description : creates and destroys connections and represents the
+%%% endpoint of a connection where messages are received and
+%% send from/to the network.
+%%%
+%%% Created : 18 Apr 2008 by Thorsten Schuett <[email protected]>
+%%%-------------------------------------------------------------------
+%% @author Thorsten Schuett <[email protected]>
+%% @copyright 2008 Konrad-Zuse-Zentrum f�r Informationstechnik Berlin
+%% @version $Id $
+-module(comm_layer_dir.comm_connection).
+
+-export([send/3, open_new/4, new/3, open_new_async/4]).
+
+-import(config).
+-import(gen_tcp).
+-import(inet).
+-import(io).
+-import(io_lib).
+-import(log).
+-import(timer).
+
+-include("comm_layer.hrl").
+
+%% @doc new accepted connection. called by comm_acceptor
+%% @spec new(inet:ip_address(), int(), socket()) -> pid()
+new(Address, Port, Socket) ->
+ spawn(fun () -> loop(Socket, Address, Port) end).
+
+%% @doc open new connection
+%% @spec open_new(inet:ip_address(), int(), inet:ip_address(), int()) ->
+%% {local_ip, inet:ip_address(), int(), pid(), inet:socket()}
+%% | fail
+%% | {connection, pid(), inet:socket()}
+open_new(Address, Port, undefined, MyPort) ->
+ Myself = self(),
+ LocalPid = spawn(fun () ->
+ case new_connection(Address, Port, MyPort) of
+ fail ->
+ Myself ! {new_connection_failed};
+ Socket ->
+ {ok, {MyIP, _MyPort}} = inet:sockname(Socket),
+ Myself ! {new_connection_started, MyIP, MyPort, Socket},
+ loop(Socket, Address, Port)
+ end
+ end),
+ receive
+ {new_connection_failed} ->
+ fail;
+ {new_connection_started, MyIP, MyPort, S} ->
+ {local_ip, MyIP, MyPort, LocalPid, S}
+ end;
+open_new(Address, Port, _MyAddress, MyPort) ->
+ Owner = self(),
+ LocalPid = spawn(fun () ->
+ case new_connection(Address, Port, MyPort) of
+ fail ->
+ Owner ! {new_connection_failed};
+ Socket ->
+ Owner ! {new_connection_started, Socket},
+ loop(Socket, Address, Port)
+ end
+ end),
+ receive
+ {new_connection_failed} ->
+ fail;
+ {new_connection_started, Socket} ->
+ {connection, LocalPid, Socket}
+ end.
+
+% ===============================================================================
+% @doc open a new connection asynchronously
+% ===============================================================================
+-spec(open_new_async/4 :: (any(), any(), any(), any()) -> pid()).
+open_new_async(Address, Port, _MyAddr, MyPort) ->
+ Pid = spawn(fun () ->
+ case new_connection(Address, Port, MyPort) of
+ fail ->
+ comm_port:unregister_connection(Address, Port),
+ ok;
+ Socket ->
+ loop(Socket, Address, Port)
+ end
+ end),
+ Pid.
+
+
+send({Address, Port, Socket}, Pid, Message) ->
+ BinaryMessage = term_to_binary({deliver, Pid, Message}),
+ SendTimeout = config:read(tcp_send_timeout),
+ {Time, Result} = timer:tc(gen_tcp, send, [Socket, BinaryMessage]),
+ if
+ Time > 1200 * SendTimeout ->
+ log:log(error,"[ CC ] send to ~p took ~p: ~p",
+ [Address, Time, inet:getopts(Socket, [keep_alive, send_timeout])]);
+ true ->
+ ok
+ end,
+ case Result of
+ ok ->
+ ?LOG_MESSAGE(erlang:element(1, Message), byte_size(BinaryMessage)),
+ ok;
+ {error, closed} ->
+ comm_port:unregister_connection(Address, Port),
+ close_connection(Socket);
+ {error, _Reason} ->
+ %log:log(error,"[ CC ] couldn't send to ~p:~p (~p)", [Address, Port, Reason]),
+ comm_port:unregister_connection(Address, Port),
+ close_connection(Socket)
+ end.
+
+loop(fail, Address, Port) ->
+ comm_port:unregister_connection(Address, Port),
+ ok;
+loop(Socket, Address, Port) ->
+ receive
+ {send, Pid, Message} ->
+ case send({Address, Port, Socket}, Pid, Message) of
+ ok -> loop(Socket, Address, Port);
+ _ -> ok
+ end;
+ {tcp_closed, Socket} ->
+ comm_port:unregister_connection(Address, Port),
+ gen_tcp:close(Socket);
+ {tcp, Socket, Data} ->
+ case binary_to_term(Data) of
+ {deliver, Process, Message} ->
+ Process ! Message,
+ inet:setopts(Socket, [{active, once}]),
+ loop(Socket, Address, Port);
+ {user_close} ->
+ comm_port:unregister_connection(Address, Port),
+ gen_tcp:close(Socket);
+ {youare, _Address, _Port} ->
+ %% @TODO what do we get from this information?
+ inet:setopts(Socket, [{active, once}]),
+ loop(Socket, Address, Port);
+ Unknown ->
+ log:log(warn,"[ CC ] unknown message ~p", [Unknown]),
+ inet:setopts(Socket, [{active, once}]),
+ loop(Socket, Address, Port)
+ end;
+
+ {youare, _IP, _Port} ->
+ loop(Socket, Address, Port);
+
+ Unknown ->
+ log:log(warn,"[ CC ] unknown message2 ~p", [Unknown]) ,
+ loop(Socket, Address, Port)
+ end.
+
+% ===============================================================================
+
+-spec(new_connection(inet:ip_address(), integer(), integer()) -> inet:socket() | fail).
+new_connection(Address, Port, MyPort) ->
+ case gen_tcp:connect(Address, Port, [binary, {packet, 4}, {nodelay, true}, {active, once},
+ {send_timeout, config:read(tcp_send_timeout)}],
+ config:read(tcp_connect_timeout)) of
+ {ok, Socket} ->
+ % send end point data
+ case inet:sockname(Socket) of
+ {ok, {MyAddress, _MyPort}} ->
+ Message = term_to_binary({endpoint, MyAddress, MyPort}),
+ gen_tcp:send(Socket, Message),
+ case inet:peername(Socket) of
+ {ok, {RemoteIP, RemotePort}} ->
+ YouAre = term_to_binary({youare, RemoteIP, RemotePort}),
+ gen_tcp:send(Socket, YouAre),
+ Socket;
+ {error, _Reason} ->
+ %log:log(error,"[ CC ] reconnect to ~p because socket is ~p",
+ % [Address, Reason]),
+ close_connection(Socket),
+ new_connection(Address, Port, MyPort)
+ end;
+ {error, _Reason} ->
+ %log:log(error,"[ CC ] reconnect to ~p because socket is ~p",
+ % [Address, Reason]),
+ close_connection(Socket),
+ new_connection(Address, Port, MyPort)
+ end;
+ {error, _Reason} ->
+ %log:log(error,"[ CC ] couldn't connect to ~p:~p (~p)",
+ %[Address, Port, Reason]),
+ fail
+ end.
+
+close_connection(Socket) ->
+ spawn( fun () ->
+ gen_tcp:close(Socket)
+ end ).
diff --git a/lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_layer.erl b/lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_layer.erl
new file mode 100644
index 0000000000..b7fdd183e1
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_layer.erl
@@ -0,0 +1,83 @@
+% Copyright 2008 Konrad-Zuse-Zentrum für Informationstechnik Berlin
+%
+% 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.
+%%%-------------------------------------------------------------------
+%%% File : comm_layer.erl
+%%% Author : Thorsten Schuett <[email protected]>
+%%% Description : Public interface to Communication Layer.
+%%% Generic functions to send messages.
+%%% Distinguishes on runtime whether the destination is in the
+%%% same Erlang virtual machine (use ! for sending) or on a remote
+%%% site (use comm_port:send()).
+%%%
+%%% Created : 04 Feb 2008 by Thorsten Schuett <[email protected]>
+%%%-------------------------------------------------------------------
+%% @author Thorsten Schuett <[email protected]>
+%% @copyright 2008 Konrad-Zuse-Zentrum für Informationstechnik Berlin
+%% @version $Id $
+-module(comm_layer_dir.comm_layer).
+
+-author('[email protected]').
+-vsn('$Id: comm_layer.erl,v 1.1 2009/11/06 12:41:36 maria Exp $ ').
+
+-export([start_link/0, send/2, this/0, here/1]).
+
+-import(io).
+-import(util).
+-import(log).
+
+-include("comm_layer.hrl").
+
+
+% @TODO: should be ip
+-type(process_id() :: {any(), integer(), pid()}).
+%%====================================================================
+%% public functions
+%%====================================================================
+
+%% @doc starts the communication port (for supervisor)
+%% @spec start_link() -> {ok,Pid} | ignore | {error,Error}
+start_link() ->
+ comm_port_sup:start_link().
+
+%% @doc a process descriptor has to specify the erlang vm
+%% + the process inside. {IP address, port, pid}
+%% @type process_id() = {inet:ip_address(), int(), pid()}.
+%% @spec send(process_id(), term()) -> ok
+
+send({{_IP1, _IP2, _IP3, _IP4} = _IP, _Port, _Pid} = Target, Message) ->
+ {MyIP,MyPort} = comm_port:get_local_address_port(),
+ %io:format("send: ~p:~p -> ~p:~p(~p) : ~p\n", [MyIP, MyPort, _IP, _Port, _Pid, Message]),
+ IsLocal = (MyIP == _IP) and (MyPort == _Port),
+ if
+ IsLocal ->
+ ?LOG_MESSAGE(erlang:element(1, Message), byte_size(term_to_binary(Message))),
+ _Pid ! Message;
+ true ->
+ comm_port:send(Target, Message)
+ end;
+
+send(Target, Message) ->
+ log:log(error,"[ CC ] wrong call to cs_send:send: ~w ! ~w", [Target, Message]),
+ log:log(error,"[ CC ] stacktrace: ~w", [util:get_stacktrace()]),
+ ok.
+
+%% @doc returns process descriptor for the calling process
+-spec(this/0 :: () -> atom()).%process_id()).
+this() ->
+ here(self()).
+
+-spec(here/1 :: (pid()) -> process_id()).
+here(Pid) ->
+ {LocalIP, LocalPort} = comm_port:get_local_address_port(),
+ {LocalIP, LocalPort, Pid}.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_layer.hrl b/lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_layer.hrl
new file mode 100644
index 0000000000..54f31b7c55
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_layer.hrl
@@ -0,0 +1,29 @@
+% Copyright 2008 Konrad-Zuse-Zentrum für Informationstechnik Berlin
+%
+% 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.
+%%%-------------------------------------------------------------------
+%%% File : comm_layer.hrl
+%%% Author : Thorsten Schuett <[email protected]>
+%%% Description :
+%%%
+%%% Created : 31 Jul 2008 by Thorsten Schuett <[email protected]>
+%%%-------------------------------------------------------------------
+%% @author Thorsten Schuett <[email protected]>
+%% @copyright 2008 Konrad-Zuse-Zentrum für Informationstechnik Berlin
+%% @version $Id: comm_layer.hrl,v 1.1 2009/11/06 12:41:36 maria Exp $
+-author('[email protected]').
+-vsn('$Id: comm_layer.hrl,v 1.1 2009/11/06 12:41:36 maria Exp $ ').
+
+% enable logging of message statistics
+%-define(LOG_MESSAGE(TAG, SIZE), comm_layer.comm_logger:log(TAG, SIZE)).
+-define(LOG_MESSAGE(TAG, SIZE), ok).
diff --git a/lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_logger.erl b/lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_logger.erl
new file mode 100644
index 0000000000..b8882758af
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_logger.erl
@@ -0,0 +1,143 @@
+% Copyright 2008 Konrad-Zuse-Zentrum für Informationstechnik Berlin
+%
+% 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.
+%%%-------------------------------------------------------------------
+%%% File : comm_logger.erl
+%%% Author : Thorsten Schuett <[email protected]>
+%%% Description :
+%%%
+%%% Created : 31 Jul 2008 by Thorsten Schuett <[email protected]>
+%%%-------------------------------------------------------------------
+%% @author Thorsten Schuett <[email protected]>
+%% @copyright 2008 Konrad-Zuse-Zentrum für Informationstechnik Berlin
+%% @version $Id: comm_logger.erl,v 1.1 2009/11/06 12:41:36 maria Exp $
+-module(comm_layer_dir.comm_logger).
+
+-author('[email protected]').
+-vsn('$Id: comm_logger.erl,v 1.1 2009/11/06 12:41:36 maria Exp $ ').
+
+-behaviour(gen_server).
+
+-import(gb_trees).
+-import(gen_server).
+
+%% API
+-export([start_link/0]).
+
+-export([log/2, dump/0]).
+
+%% gen_server callbacks
+-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
+ terminate/2, code_change/3]).
+
+-record(state, {start, map}).
+
+%%====================================================================
+%% API
+%%====================================================================
+%%--------------------------------------------------------------------
+%% Function: start_link() -> {ok,Pid} | ignore | {error,Error}
+%% Description: Starts the server
+%%--------------------------------------------------------------------
+start_link() ->
+ gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
+
+%%--------------------------------------------------------------------
+%% Function: log(Tag, Size) -> ok
+%% Description: logs a message type with its size
+%%--------------------------------------------------------------------
+log(Tag, Size) ->
+ gen_server:cast(?MODULE, {log, Tag, Size}).
+
+%%--------------------------------------------------------------------
+%% Function: dump() -> {gb_tree:gb_trees(), {Date, Time}}
+%% Description: gets the logging state
+%%--------------------------------------------------------------------
+dump() ->
+ gen_server:call(?MODULE, {dump}).
+
+%%====================================================================
+%% gen_server callbacks
+%%====================================================================
+
+%%--------------------------------------------------------------------
+%% Function: init(Args) -> {ok, State} |
+%% {ok, State, Timeout} |
+%% ignore |
+%% {stop, Reason}
+%% Description: Initiates the server
+%%--------------------------------------------------------------------
+init([]) ->
+ {ok, #state{start=erlang:now(), map=gb_trees:empty()}}.
+
+%%--------------------------------------------------------------------
+%% Function: %% handle_call(Request, From, State) -> {reply, Reply, State} |
+%% {reply, Reply, State, Timeout} |
+%% {noreply, State} |
+%% {noreply, State, Timeout} |
+%% {stop, Reason, Reply, State} |
+%% {stop, Reason, State}
+%% Description: Handling call messages
+%%--------------------------------------------------------------------
+handle_call({dump}, _From, State) ->
+ Reply = {State#state.map, State#state.start},
+ {reply, Reply, State};
+handle_call(_Request, _From, State) ->
+ Reply = ok,
+ {reply, Reply, State}.
+
+%%--------------------------------------------------------------------
+%% Function: handle_cast(Msg, State) -> {noreply, State} |
+%% {noreply, State, Timeout} |
+%% {stop, Reason, State}
+%% Description: Handling cast messages
+%%--------------------------------------------------------------------
+handle_cast({log, Tag, Size}, State) ->
+ case gb_trees:lookup(Tag, State#state.map) of
+ none ->
+ {noreply, State#state{map=gb_trees:insert(Tag, {Size, 1}, State#state.map)}};
+ {value, {OldSize, OldCount}} ->
+ {noreply, State#state{map=gb_trees:update(Tag, {Size + OldSize, OldCount + 1}, State#state.map)}}
+ end;
+handle_cast(_Msg, State) ->
+ {noreply, State}.
+
+%%--------------------------------------------------------------------
+%% Function: handle_info(Info, State) -> {noreply, State} |
+%% {noreply, State, Timeout} |
+%% {stop, Reason, State}
+%% Description: Handling all non call/cast messages
+%%--------------------------------------------------------------------
+handle_info(_Info, State) ->
+ {noreply, State}.
+
+%%--------------------------------------------------------------------
+%% Function: terminate(Reason, State) -> void()
+%% Description: This function is called by a gen_server when it is about to
+%% terminate. It should be the opposite of Module:init/1 and do any necessary
+%% cleaning up. When it returns, the gen_server terminates with Reason.
+%% The return value is ignored.
+%%--------------------------------------------------------------------
+terminate(_Reason, _State) ->
+ ok.
+
+%%--------------------------------------------------------------------
+%% Func: code_change(OldVsn, State, Extra) -> {ok, NewState}
+%% Description: Convert process state when code is changed
+%%--------------------------------------------------------------------
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
+
+%%--------------------------------------------------------------------
+%%% Internal functions
+%%--------------------------------------------------------------------
diff --git a/lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_port.erl b/lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_port.erl
new file mode 100644
index 0000000000..e8169b4673
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_port.erl
@@ -0,0 +1,240 @@
+% Copyright 2008 Konrad-Zuse-Zentrum f�r Informationstechnik Berlin
+%
+% 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.
+%%%-------------------------------------------------------------------
+%%% File : comm_port.erl
+%%% Author : Thorsten Schuett <[email protected]>
+%%% Description : Main CommLayer Interface
+%%% Maps remote addresses to comm_connection PIDs.
+%%%
+%%% Created : 18 Apr 2008 by Thorsten Schuett <[email protected]>
+%%%-------------------------------------------------------------------
+%% @author Thorsten Schuett <[email protected]>
+%% @copyright 2008 Konrad-Zuse-Zentrum f�r Informationstechnik Berlin
+%% @version $Id $
+-module(comm_layer_dir.comm_port).
+
+-author('[email protected]').
+-vsn('$Id: comm_port.erl,v 1.1 2009/11/06 12:41:36 maria Exp $ ').
+
+-behaviour(gen_server).
+
+-import(ets).
+-import(gen_server).
+-import(io).
+-import(log).
+
+-define(ASYNC, true).
+%-define(SYNC, true).
+
+%% API
+-export([start_link/0,
+ send/2,
+ unregister_connection/2, register_connection/4,
+ set_local_address/2, get_local_address_port/0]).
+
+%% gen_server callbacks
+-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
+ terminate/2, code_change/3]).
+
+%%====================================================================
+%% API
+%%====================================================================
+
+%% @doc
+%% @spec send({inet:ip_address(), int(), pid()}, term()) -> ok
+-ifdef(ASYNC).
+send({Address, Port, Pid}, Message) ->
+ gen_server:call(?MODULE, {send, Address, Port, Pid, Message}, 20000).
+-endif.
+-ifdef(SYNC).
+send({Address, Port, Pid}, Message) ->
+ case ets:lookup(?MODULE, {Address, Port}) of
+ [{{Address, Port}, {_LPid, Socket}}] ->
+ comm_connection:send({Address, Port, Socket}, Pid, Message),
+ ok;
+ [] ->
+ gen_server:call(?MODULE, {send, Address, Port, Pid, Message}, 20000)
+ end.
+-endif.
+
+
+%% @doc
+%% @spec unregister_connection(inet:ip_address(), int()) -> ok
+unregister_connection(Adress, Port) ->
+ gen_server:call(?MODULE, {unregister_conn, Adress, Port}, 20000).
+
+%% @doc
+%% @spec register_connection(inet:ip_address(), int(), pid(), gen_tcp:socket()) -> ok | duplicate
+register_connection(Adress, Port, Pid, Socket) ->
+ gen_server:call(?MODULE, {register_conn, Adress, Port, Pid, Socket}, 20000).
+
+%% @doc
+%% @spec set_local_address(inet:ip_address(), int()) -> ok
+set_local_address(Address, Port) ->
+ gen_server:call(?MODULE, {set_local_address, Address, Port}, 20000).
+
+
+%% @doc
+%% @spec get_local_address_port() -> {inet:ip_address(),int()}
+get_local_address_port() ->
+ case ets:lookup(?MODULE, local_address_port) of
+ [{local_address_port, Value}] ->
+ Value;
+ [] ->
+ undefined
+ end.
+
+%%--------------------------------------------------------------------
+%% Function: start_link() -> {ok,Pid} | ignore | {error,Error}
+%% Description: Starts the server
+%%--------------------------------------------------------------------
+start_link() ->
+ gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
+
+%%====================================================================
+%% gen_server callbacks
+%%====================================================================
+
+%%--------------------------------------------------------------------
+%% Function: init(Args) -> {ok, State} |
+%% {ok, State, Timeout} |
+%% ignore |
+%% {stop, Reason}
+%% Description: Initiates the server
+%%--------------------------------------------------------------------
+init([]) ->
+ ets:new(?MODULE, [set, protected, named_table]),
+ {ok, ok}. % empty state.
+
+%%--------------------------------------------------------------------
+%% Function: %% handle_call(Request, From, State) -> {reply, Reply, State} |
+%% {reply, Reply, State, Timeout} |
+%% {noreply, State} |
+%% {noreply, State, Timeout} |
+%% {stop, Reason, Reply, State} |
+%% {stop, Reason, State}
+%% Description: Handling call messages
+%%--------------------------------------------------------------------
+handle_call({send, Address, Port, Pid, Message}, _From, State) ->
+ send(Address, Port, Pid, Message, State);
+
+handle_call({unregister_conn, Address, Port}, _From, State) ->
+ ets:delete(?MODULE, {Address, Port}),
+ {reply, ok, State};
+
+handle_call({register_conn, Address, Port, Pid, Socket}, _From, State) ->
+ case ets:lookup(?MODULE, {Address, Port}) of
+ [{{Address, Port}, _}] ->
+ {reply, duplicate, State};
+ [] ->
+ ets:insert(?MODULE, {{Address, Port}, {Pid, Socket}}),
+ {reply, ok, State}
+ end;
+
+handle_call({set_local_address, Address, Port}, _From, State) ->
+ ets:insert(?MODULE, {local_address_port, {Address,Port}}),
+ {reply, ok, State}.
+
+%%--------------------------------------------------------------------
+%% Function: handle_cast(Msg, State) -> {noreply, State} |
+%% {noreply, State, Timeout} |
+%% {stop, Reason, State}
+%% Description: Handling cast messages
+%%--------------------------------------------------------------------
+handle_cast(_Msg, State) ->
+ {noreply, State}.
+
+%%--------------------------------------------------------------------
+%% Function: handle_info(Info, State) -> {noreply, State} |
+%% {noreply, State, Timeout} |
+%% {stop, Reason, State}
+%% Description: Handling all non call/cast messages
+%%--------------------------------------------------------------------
+handle_info(_Info, State) ->
+ {noreply, State}.
+
+%%--------------------------------------------------------------------
+%% Function: terminate(Reason, State) -> void()
+%% Description: This function is called by a gen_server when it is about to
+%% terminate. It should be the opposite of Module:init/1 and do any necessary
+%% cleaning up. When it returns, the gen_server terminates with Reason.
+%% The return value is ignored.
+%%--------------------------------------------------------------------
+terminate(_Reason, _State) ->
+ ok.
+
+%%--------------------------------------------------------------------
+%% Func: code_change(OldVsn, State, Extra) -> {ok, NewState}
+%% Description: Convert process state when code is changed
+%%--------------------------------------------------------------------
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
+
+%%--------------------------------------------------------------------
+%%% Internal functions
+%%--------------------------------------------------------------------
+
+-ifdef(ASYNC).
+send(Address, Port, Pid, Message, State) ->
+ {DepAddr,DepPort} = get_local_address_port(),
+ if
+ DepAddr == undefined ->
+ open_sync_connection(Address, Port, Pid, Message, State);
+ true ->
+ case ets:lookup(?MODULE, {Address, Port}) of
+ [{{Address, Port}, {ConnPid, _Socket}}] ->
+ ConnPid ! {send, Pid, Message},
+ {reply, ok, State};
+ [] ->
+ ConnPid = comm_connection:open_new_async(Address, Port,
+ DepAddr, DepPort),
+ ets:insert(?MODULE, {{Address, Port}, {ConnPid, undef}}),
+ ConnPid ! {send, Pid, Message},
+ {reply, ok, State}
+ end
+ end.
+-endif.
+
+-ifdef(SYNC).
+send(Address, Port, Pid, Message, State) ->
+ case ets:lookup(?MODULE, {Address, Port}) of
+ [{{Address, Port}, {_LPid, Socket}}] ->
+ comm_connection:send({Address, Port, Socket}, Pid, Message),
+ {reply, ok, State};
+ [] ->
+ open_sync_connection(Address, Port, Pid, Message, State)
+ end.
+-endif.
+
+
+open_sync_connection(Address, Port, Pid, Message, State) ->
+ {DepAddr,DepPort} = get_local_address_port(),
+ case comm_connection:open_new(Address, Port, DepAddr, DepPort) of
+ {local_ip, MyIP, MyPort, MyPid, MySocket} ->
+ comm_connection:send({Address, Port, MySocket}, Pid, Message),
+ log:log(info,"[ CC ] this() == ~w", [{MyIP, MyPort}]),
+ % set_local_address(t, {MyIP,MyPort}}),
+ % register_connection(Address, Port, MyPid, MySocket),
+ ets:insert(?MODULE, {local_address_port, {MyIP,MyPort}}),
+ ets:insert(?MODULE, {{Address, Port}, {MyPid, MySocket}}),
+ {reply, ok, State};
+ fail ->
+ % drop message (remote node not reachable, failure detector will notice)
+ {reply, ok, State};
+ {connection, LocalPid, NewSocket} ->
+ comm_connection:send({Address, Port, NewSocket}, Pid, Message),
+ ets:insert(?MODULE, {{Address, Port}, {LocalPid, NewSocket}}),
+ % register_connection(Address, Port, LPid, NewSocket),
+ {reply, ok, State}
+ end.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_port_sup.erl b/lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_port_sup.erl
new file mode 100644
index 0000000000..d7a25b14ab
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/comm_layer/comm_port_sup.erl
@@ -0,0 +1,88 @@
+% Copyright 2008 Konrad-Zuse-Zentrum für Informationstechnik Berlin
+%
+% 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.
+%%%-------------------------------------------------------------------
+%%% File : comm_port_sup.erl
+%%% Author : Thorsten Schuett <[email protected]>
+%%% Description :
+%%%
+%%% Created : 04 Feb 2008 by Thorsten Schuett <[email protected]>
+%%%-------------------------------------------------------------------
+%% @author Thorsten Schuett <[email protected]>
+%% @copyright 2008 Konrad-Zuse-Zentrum für Informationstechnik Berlin
+%% @version $Id: comm_port_sup.erl,v 1.1 2009/11/06 12:41:36 maria Exp $
+-module(comm_layer_dir.comm_port_sup).
+
+-author('[email protected]').
+-vsn('$Id: comm_port_sup.erl,v 1.1 2009/11/06 12:41:36 maria Exp $ ').
+
+-behaviour(supervisor).
+
+-import(supervisor).
+-import(randoms).
+-import(string).
+-import(config).
+
+-export([start_link/0, init/1]).
+
+%%====================================================================
+%% API functions
+%%====================================================================
+%%--------------------------------------------------------------------
+%% Function: start_link() -> {ok,Pid} | ignore | {error,Error}
+%% Description: Starts the supervisor
+%%--------------------------------------------------------------------
+start_link() ->
+ supervisor:start_link(?MODULE, []).
+
+%%====================================================================
+%% Supervisor callbacks
+%%====================================================================
+%%--------------------------------------------------------------------
+%% Func: init(Args) -> {ok, {SupFlags, [ChildSpec]}} |
+%% ignore |
+%% {error, Reason}
+%% Description: Whenever a supervisor is started using
+%% supervisor:start_link/[2,3], this function is called by the new process
+%% to find out about restart strategy, maximum restart frequency and child
+%% specifications.
+%%--------------------------------------------------------------------
+init([]) ->
+ InstanceId = string:concat("comm_port_", randoms:getRandomId()),
+ CommPort =
+ {comm_port,
+ {comm_layer_dir.comm_port, start_link, []},
+ permanent,
+ brutal_kill,
+ worker,
+ []},
+ CommAcceptor =
+ {comm_acceptor,
+ {comm_layer_dir.comm_acceptor, start_link, [InstanceId]},
+ permanent,
+ brutal_kill,
+ worker,
+ []},
+ CommLogger =
+ {comm_logger,
+ {comm_layer_dir.comm_logger, start_link, []},
+ permanent,
+ brutal_kill,
+ worker,
+ []},
+ {ok, {{one_for_all, 10, 1},
+ [
+ CommPort,
+ CommLogger,
+ CommAcceptor
+ ]}}.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/compare1.erl b/lib/dialyzer/test/small_SUITE_data/src/compare1.erl
new file mode 100644
index 0000000000..915ae7621c
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/compare1.erl
@@ -0,0 +1,21 @@
+%%%-------------------------------------------------------------------
+%%% File : compare1.erl
+%%% Author : Tobias Lindahl <[email protected]>
+%%% Description :
+%%%
+%%% Created : 20 Apr 2007 by Tobias Lindahl <[email protected]>
+%%%-------------------------------------------------------------------
+-module(compare1).
+
+-export([t/0]).
+
+t() ->
+ t(42).
+
+t(X) when X > 42 ->
+ error;
+t(X) when X < 42 ->
+ error;
+t(X) when X =/= 42 ->
+ error;
+t(X) -> ok.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/confusing_record_warning.erl b/lib/dialyzer/test/small_SUITE_data/src/confusing_record_warning.erl
new file mode 100644
index 0000000000..8af74e0914
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/confusing_record_warning.erl
@@ -0,0 +1,19 @@
+%%---------------------------------------------------------------------
+%% A user complained that dialyzer produces a weird warning for the
+%% following program. I explained to him that there is an implicit
+%% assumption that when a record is typed one cannot have types of
+%% the same size which are tagged by the record name whose elements
+%% have different types than the ones declared in the record.
+%%
+%% But the warning from dialyzer was weird nonetheless:
+%% The pattern {'r', [_]} can never match the type any()
+%% We should clearly give some less confusing warning in this case.
+%%---------------------------------------------------------------------
+-module(confusing_record_warning).
+
+-export([test/1]).
+
+-record(r, {field :: binary}).
+
+test({r, [_]}) ->
+ #r{field = <<42>>}.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/confusing_warning.erl b/lib/dialyzer/test/small_SUITE_data/src/confusing_warning.erl
new file mode 100644
index 0000000000..c82df0f056
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/confusing_warning.erl
@@ -0,0 +1,22 @@
+%% Test case that results in a confusing warning -- created from a
+%% very stripped down actual application. The second case clause of
+%% test/1 cannot possibly match because all a-pairs match with the
+%% first clause. Dialyzer complains that the second argument of the
+%% second 2-tuple has type 'aaa' | 'bbb'. This is mucho confusing
+%% since there is no 'a'-pair whose second element is 'aaa' | 'bbb'.
+%% Pattern matching compilation is of course what's to blame here.
+
+-module(confusing_warning).
+-export([test/1]).
+
+test(N) when is_integer(N) ->
+ case foo(N) of
+ {a, I} when is_integer(I) ->
+ I;
+ {a, {_, L}} -> % this clause cannot possibly match
+ L
+ end.
+
+foo(1) -> {a, 42};
+foo(2) -> {b, aaa}; % this is really unused
+foo(3) -> {b, bbb}. % this is really unused
diff --git a/lib/dialyzer/test/small_SUITE_data/src/contract2.erl b/lib/dialyzer/test/small_SUITE_data/src/contract2.erl
new file mode 100644
index 0000000000..211de7f009
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/contract2.erl
@@ -0,0 +1,18 @@
+-module(contract2).
+-export([test/2]).
+
+-spec test(list(), list()) -> ok.
+
+test([], []) ->
+ ok;
+test([], L) ->
+ raise(L);
+test([H|T], L) ->
+ case H of
+ true -> test(T, L);
+ false -> test(T, [H|L])
+ end.
+
+-spec raise(_) -> no_return().
+raise(X) ->
+ throw(X).
diff --git a/lib/dialyzer/test/small_SUITE_data/src/contract3.erl b/lib/dialyzer/test/small_SUITE_data/src/contract3.erl
new file mode 100644
index 0000000000..5b0bee9694
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/contract3.erl
@@ -0,0 +1,33 @@
+%%%-------------------------------------------------------------------
+%%% File : contract3.erl
+%%% Author : Tobias Lindahl <[email protected]>
+%%% Description : Check overloaded domains
+%%%
+%%% Created : 2 Nov 2007 by Tobias Lindahl <[email protected]>
+%%%-------------------------------------------------------------------
+-module(contract3).
+
+-export([t/3]).
+
+t(X, Y, Z) ->
+ t1(X),
+ t2(X, Y),
+ t3(X, Y, Z).
+
+-spec t1(atom()|integer()) -> integer();
+ (atom()|list()) -> atom().
+
+t1(X) ->
+ foo:bar(X).
+
+-spec t2(atom(), integer()) -> integer();
+ (atom(), list()) -> atom().
+
+t2(X, Y) ->
+ foo:bar(X, Y).
+
+-spec t3(atom(), integer(), list()) -> integer();
+ (X, integer(), list()) -> X.
+
+t3(X, Y, Z) ->
+ X.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/contract5.erl b/lib/dialyzer/test/small_SUITE_data/src/contract5.erl
new file mode 100644
index 0000000000..c4c9ac9ebf
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/contract5.erl
@@ -0,0 +1,15 @@
+%%%-------------------------------------------------------------------
+%%% File : contract5.erl
+%%% Author : Tobias Lindahl <[email protected]>
+%%% Description : Excercise modified record types.
+%%%
+%%% Created : 15 Apr 2008 by Tobias Lindahl <[email protected]>
+%%%-------------------------------------------------------------------
+-module(contract5).
+-export([t/0]).
+
+-record(bar, {baz}).
+
+-spec t() -> #bar{baz :: boolean()}.
+
+t() -> #bar{baz = not_a_boolean}.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/disj_norm_form.erl b/lib/dialyzer/test/small_SUITE_data/src/disj_norm_form.erl
new file mode 100644
index 0000000000..fedac566ea
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/disj_norm_form.erl
@@ -0,0 +1,23 @@
+%%%-------------------------------------------------------------------
+%%% File : disj_norm_form.erl
+%%% Author : Tobias Lindahl <[email protected]>
+%%% Description : Exposes a bad behavior in expansion to
+%%% disjunctive normal form of guards.
+%%%
+%%% Created : 24 Aug 2007 by Tobias Lindahl <[email protected]>
+%%%-------------------------------------------------------------------
+-module(disj_norm_form).
+
+-export([t/1]).
+
+-record(foo, {bar}).
+
+t(R) ->
+ if R#foo.bar =:= 1;
+ R#foo.bar =:= 2;
+ R#foo.bar =:= 3;
+ R#foo.bar =:= 4;
+ R#foo.bar =:= 5;
+ R#foo.bar =:= 6 -> ok;
+ true -> error
+ end.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/eqeq.erl b/lib/dialyzer/test/small_SUITE_data/src/eqeq.erl
new file mode 100644
index 0000000000..f8989185d4
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/eqeq.erl
@@ -0,0 +1,15 @@
+%%%-------------------------------------------------------------------
+%%% File : eqeq.erl
+%%% Author : Tobias Lindahl <[email protected]>
+%%% Description :
+%%%
+%%% Created : 12 Nov 2007 by Tobias Lindahl <[email protected]>
+%%%-------------------------------------------------------------------
+-module(eqeq).
+
+-export([t/0]).
+
+t() ->
+ comp(3.14, foo).
+
+comp(X, Y) -> X =:= Y.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/ets_select.erl b/lib/dialyzer/test/small_SUITE_data/src/ets_select.erl
new file mode 100644
index 0000000000..17bfb5c8bc
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/ets_select.erl
@@ -0,0 +1,11 @@
+-module(ets_select).
+-export([test/0]).
+
+test() ->
+ Table = ets:new(table, [set,{keypos,1}]),
+ ets:insert(Table, {foo, bar, baz}),
+ foo(Table). % ets:select(Table, [{{'_', '$1', '$2'}, [], ['$$']}]).
+
+foo(Table) ->
+ Tuples = ets:select(Table, [{{'_', '$1', '$2'}, [], ['$$']}]),
+ [list_to_tuple(Tuple) || Tuple <- Tuples].
diff --git a/lib/dialyzer/test/small_SUITE_data/src/ets_update_counter.erl b/lib/dialyzer/test/small_SUITE_data/src/ets_update_counter.erl
new file mode 100644
index 0000000000..057748cfb4
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/ets_update_counter.erl
@@ -0,0 +1,25 @@
+-module(ets_update_counter).
+
+-export([ti/2, tl/2, tn/2, tt/2, tu/3, tmix/3]).
+
+ti(T, K) ->
+ ets:update_counter(T, K, 42).
+
+tl(T, K) ->
+ ets:update_counter(T, K, [{2,1}, {3,2}]).
+
+tn(T, K) ->
+ ets:update_counter(T, K, []).
+
+tt(T, K) ->
+ ets:update_counter(T, K, {4,2}).
+
+tu(T, K, Op) ->
+ ets:update_counter(T, K, Op).
+
+tmix(T, K, Choice) ->
+ Op = get_op(Choice),
+ ets:update_counter(T, K, Op).
+
+get_op(i) -> 42;
+get_op(t) -> {4,2}.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/exhaust_case.erl b/lib/dialyzer/test/small_SUITE_data/src/exhaust_case.erl
new file mode 100644
index 0000000000..4b2c16f8a2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/exhaust_case.erl
@@ -0,0 +1,23 @@
+%%-------------------------------------------------------------------
+%% File : exhaust_case.erl
+%% Author : Kostis Sagonas <[email protected]>
+%% Description : Tests that Dialyzer warns when it finds an unreachable
+%% case clause (independently of whether ground vs. var).
+%%
+%% Created : 15 Dec 2004 by Kostis Sagonas <[email protected]>
+%%-------------------------------------------------------------------
+
+-module(exhaust_case).
+-export([t/1]).
+
+t(X) when is_integer(X) ->
+ case ret(X) of
+ foo -> ok;
+ bar -> ok;
+ 42 -> ok;
+ _other -> error %% unreachable clause (currently no warning)
+ %% other -> error %% but contrast this with this clause... hmm
+ end.
+
+ret(1) -> foo;
+ret(2) -> bar.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/failing_guard1.erl b/lib/dialyzer/test/small_SUITE_data/src/failing_guard1.erl
new file mode 100644
index 0000000000..9e39975105
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/failing_guard1.erl
@@ -0,0 +1,15 @@
+%%-----------------------------------------------------------------------
+%% Author: Kostis Sagonas (Wed Aug 23 14:54:25 CEST 2006)
+%%
+%% Program to test failing arithmetic comparisons with a number of the
+%% wrong type. The first case is handled properly; the second one is not.
+%% Why?
+%%-----------------------------------------------------------------------
+
+-module(failing_guard1).
+-export([n/1]).
+
+n(N) when (N / 2) =:= 2 -> multiple_of_four;
+n(N) when (N div 3) =:= 2.0 -> multiple_of_six;
+n(N) when (N rem 3) =:= 2.0 -> multiple_of_six;
+n(N) when is_number(N) -> other_number.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/false_false.erl b/lib/dialyzer/test/small_SUITE_data/src/false_false.erl
new file mode 100644
index 0000000000..e8efc42868
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/false_false.erl
@@ -0,0 +1,32 @@
+%%----------------------------------------------------------------------------
+%% Mail from user (username: sauron!) via Dan Gudmundsson (17 Dec 2010).
+%%
+%% tried this on:
+%% Erlang R14B (erts-5.8.1.2) [smp:2:2] [rq:2] [async-threads:0] ...
+%% and got funny diagnostics from dialyzer
+%%
+%% false_false.erl:20: Function false_or/0 has no local return
+%% false_false.erl:25: The variable _ can never match since previous
+%% clauses completely covered the type 'ok'
+%%
+%% Problem in the handling of 'or' with constant 'false' arguments
+%% fixed by Stavros Aronis and Maria Christakis on the same day.
+%%----------------------------------------------------------------------------
+-module(false_false).
+
+-export([false_or/0, wips/0]).
+
+false_or() ->
+ false or false.
+
+wips() ->
+ case new_execute_cmd(random:uniform(2)) of
+ ok -> mostly_good;
+ _ -> and_here_we_are
+ end.
+
+new_execute_cmd(1) ->
+ ok;
+new_execute_cmd(2) ->
+ io:format("Surprise result is: ~p~n", [false or false]),
+ false.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/file_open_encoding.erl b/lib/dialyzer/test/small_SUITE_data/src/file_open_encoding.erl
new file mode 100644
index 0000000000..4f1268eba8
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/file_open_encoding.erl
@@ -0,0 +1,26 @@
+%%-----------------------------------------------------------------------
+%% Program that gave erroneous warnings due to missing information about
+%% the {encoding, latin1 | unicode | utf8 | ...} option of file:open/3.
+%%-----------------------------------------------------------------------
+-module(file_open_encoding).
+
+-export([parse/1]).
+
+-type proplist() :: [{atom(), any()}].
+
+-spec parse(string()) -> proplist().
+parse(FileName) ->
+ {ok, IoDevice} = file:open(FileName, [read, binary, {encoding, utf8}]),
+ do_parse(IoDevice, []).
+
+do_parse(IoDevice, ResultSoFar) ->
+ case io:get_line(IoDevice, "") of
+ eof ->
+ file:close(IoDevice),
+ ResultSoFar;
+ <<"--"/utf8, _Comment/binary>> ->
+ do_parse(IoDevice, ResultSoFar);
+ Line ->
+ [Key, Value] = binary:split(Line, [<<": ">>, <<"\n">>], [global, trim]),
+ do_parse(IoDevice, [{binary_to_atom(Key, utf8), Value} | ResultSoFar])
+ end.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/flatten.erl b/lib/dialyzer/test/small_SUITE_data/src/flatten.erl
new file mode 100644
index 0000000000..e424d5404c
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/flatten.erl
@@ -0,0 +1,18 @@
+%%%-------------------------------------------------------------------
+%%% File : flatten.erl
+%%% Author : Tobias Lindahl <[email protected]>
+%%% Description :
+%%%
+%%% Created : 4 Nov 2007 by Tobias Lindahl <[email protected]>
+%%%-------------------------------------------------------------------
+-module(flatten).
+
+-export([t/1]).
+
+t(Dir) ->
+ case file:list_dir(Dir) of
+ {ok,FileList} ->
+ FileList;
+ {error,Reason} ->
+ {error,lists:flatten("Can't open directory "++Dir++": "++Reason)}
+ end.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/fun_app.erl b/lib/dialyzer/test/small_SUITE_data/src/fun_app.erl
new file mode 100644
index 0000000000..20b6138d26
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/fun_app.erl
@@ -0,0 +1,41 @@
+%% This is taken from the code of distel.
+
+-module(fun_app).
+-export([html_index/2]). % , lines/3, curry/2]).
+
+html_index(file,Dir) ->
+ fold_file(curry(fun lines/3,Dir),[],filename:join([Dir,"doc","man_index.html"])).
+
+fold_file(Fun,Acc0,File) ->
+ {ok, FD} = file:open(File, [read]),
+ Acc = fold_file_lines(FD,Fun,Acc0),
+ file:close(FD),
+ Acc.
+
+fold_file_lines(FD,Fun,Acc) ->
+ case io:get_line(FD, "") of
+ eof -> Acc;
+ Line -> fold_file_lines(FD,Fun,Fun(trim_nl(Line),Acc))
+ end.
+
+trim_nl(Str) -> lists:reverse(tl(lists:reverse(Str))).
+
+lines(Line,_,Dir) ->
+ case string:tokens(Line, "<> \"") of
+ ["TD", "A", "HREF=", "../"++Href, M|_] ->
+ case filename:basename(Href, ".html") of
+ "index" -> ok;
+ M -> e_set({file,M}, filename:join([Dir,Href]))
+ end;
+ _ -> ok
+ end.
+
+e_set(Key,Val) -> ets:insert(?MODULE, {Key,Val}).
+
+curry(F, Arg) ->
+ case erlang:fun_info(F,arity) of
+ {_,1} -> fun() -> F(Arg) end;
+ {_,2} -> fun(A) -> F(A,Arg) end;
+ {_,3} -> fun(A,B) -> F(A,B,Arg) end;
+ {_,4} -> fun(A,B,C) -> F(A,B,C,Arg) end
+ end.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/fun_ref_match.erl b/lib/dialyzer/test/small_SUITE_data/src/fun_ref_match.erl
new file mode 100644
index 0000000000..31e6bdfb47
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/fun_ref_match.erl
@@ -0,0 +1,21 @@
+%%%-------------------------------------------------------------------
+%%% File : fun_ref_match.erl
+%%% Author : Tobias Lindahl <[email protected]>
+%%% Description : Find that newly created funs and references cannot
+%%% match on earlier bound variables.
+%%%
+%%% Created : 10 Mar 2005 by Tobias Lindahl <[email protected]>
+%%%-------------------------------------------------------------------
+-module(fun_ref_match).
+
+-export([t1/1, t2/1]).
+
+t1(X) ->
+ X = fun(Y) -> Y end,
+ ok.
+
+t2(X) ->
+ case make_ref() of
+ X -> error;
+ _ -> ok
+ end.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/fun_ref_record.erl b/lib/dialyzer/test/small_SUITE_data/src/fun_ref_record.erl
new file mode 100644
index 0000000000..eace7a4332
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/fun_ref_record.erl
@@ -0,0 +1,17 @@
+%%%-------------------------------------------------------------------
+%%% File : fun_ref_record.erl
+%%% Author : Tobias Lindahl <[email protected]>
+%%% Description : Exposes a bug when referring to a fun in a record.
+%%%
+%%% Created : 25 Sep 2007 by Tobias Lindahl <[email protected]>
+%%%-------------------------------------------------------------------
+-module(fun_ref_record).
+
+-export([t1/0, t2/0]).
+
+-record(foo, {bar}).
+
+t1() ->
+ #foo{bar=fun t2/0}.
+
+t2() -> ok.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/gencall.erl b/lib/dialyzer/test/small_SUITE_data/src/gencall.erl
new file mode 100644
index 0000000000..d2875c9df1
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/gencall.erl
@@ -0,0 +1,12 @@
+%% Error: gen_server:handle_cast/2 is not logged as an unexported func
+%% but unknown function.
+-module(gencall).
+
+-export([f/0]).
+
+f() ->
+ gen_server:call(1,2,3),
+ ets:lookup(1,2,3),
+ gencall2:foo(),
+ gencall:foo(),
+ gen_server:handle_cast(1,2).
diff --git a/lib/dialyzer/test/small_SUITE_data/src/gs_make.erl b/lib/dialyzer/test/small_SUITE_data/src/gs_make.erl
new file mode 100644
index 0000000000..2842e773c4
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/gs_make.erl
@@ -0,0 +1,260 @@
+%% ``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 via the world wide web 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.
+%%
+%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+%% AB. All Rights Reserved.''
+%%
+%% $Id: gs_make.erl,v 1.1 2008/12/17 09:53:50 mikpe Exp $
+%%
+-module(gs_make).
+
+-export([start/0]).
+
+start() ->
+ Terms = the_config(),
+ DB=fill_ets(Terms),
+ {ok,OutFd} = file:open("gstk_generic.hrl", [write]),
+ put(stdout,OutFd),
+% io:format("terms: ~p ~n ets:~p~n",[Terms,ets:tab2list(DB)]),
+ p("% Don't edit this file. It was generated by gs_make:start/0 "),
+ p("at ~p-~p-~p, ~p:~p:~p.\n\n",
+ lists:append(tuple_to_list(date()),tuple_to_list(time()))),
+ gen_out_opts(DB),
+ gen_read(DB),
+ file:close(OutFd),
+ {ok,"gstk_generic.hrl",DB}.
+
+fill_ets(Terms) ->
+ DB = ets:new(gs_mapping,[bag,public]),
+ fill_ets(DB,Terms).
+
+fill_ets(DB,[]) -> DB;
+fill_ets(DB,[{Objs,Opt,Fun,Access}|Terms]) ->
+ fill_ets(DB,lists:flatten(Objs),Opt,Fun,Access),
+ fill_ets(DB,Terms).
+
+fill_ets(_DB,[],_,_,_) -> done;
+fill_ets(DB,[Obj|Objs],Opt,Fun,rw) ->
+ ets:insert(DB,{Obj,Opt,Fun,read}),
+ ets:insert(DB,{Obj,Opt,Fun,write}),
+ fill_ets(DB,Objs,Opt,Fun,rw);
+fill_ets(DB,[Obj|Objs],Opt,Fun,r) ->
+ ets:insert(DB,{Obj,Opt,Fun,read}),
+ fill_ets(DB,Objs,Opt,Fun,r);
+fill_ets(DB,[Obj|Objs],Opt,Fun,w) ->
+ ets:insert(DB,{Obj,Opt,Fun,write}),
+ fill_ets(DB,Objs,Opt,Fun,w).
+
+
+
+gen_out_opts(DB) ->
+ ObjTypes = lists:flatten(ordsets:from_list(ets:match(DB,{'$1','_','_',write}))),
+ p("out_opts([Option|Options],Gstkid,TkW,DB,ExtraArg,S,P,C) ->\n"),
+ p(" {Opt,Val} =\n"),
+ p(" case Option of \n"),
+ p(" {{default,Cat,Key},V} -> {default,{Cat,{Key,V}}};\n"),
+ p(" {_Key,_V} -> Option;\n"),
+ p(" {default,Cat,Opti} -> {default,{Cat,Opti}};\n"),
+ p(" Atom when atom(Atom) -> {Atom,undefined};\n"),
+ p(" _ -> {error, {invalid_option,Option}}\n"),
+ p(" end,\n"),
+ p(" case Gstkid#gstkid.objtype of\n"),
+ gen_out_type_case_clauses(merge_types(ObjTypes),DB),
+ p(" Q -> exit({internal_error,unknown_objtype,Q})\n"),
+ p(" end;\n"),
+ p("out_opts([],_Gstkid,_TkW,_DB,_ExtraArg,S,P,C) -> \n"),
+ p(" {S,P,C}.\n").
+
+
+gen_out_type_case_clauses([],_DB) -> done;
+gen_out_type_case_clauses([Objtype|Objtypes],DB) ->
+ OptsFuns = lists:map(fun (L) -> list_to_tuple(L) end,
+ ets:match(DB,{Objtype,'$1','$2',write})),
+ p(" ~p -> \ncase Opt of\n",[Objtype]),
+ gen_opt_case_clauses(merge_opts(opt_prio(),OptsFuns)),
+ p(" _ -> \n"),
+ p(" handle_external_opt_call([Option|Options],Gstkid,TkW,DB,ExtraArg,"
+ " gstk_~p:option(Option,Gstkid,TkW,DB,ExtraArg),S,P,C)\n",
+ [Objtype]),
+ p(" end;\n"),
+ gen_out_type_case_clauses(Objtypes,DB).
+
+gen_opt_case_clauses([]) ->
+ done;
+gen_opt_case_clauses([{Opt,Fun}|OptFuncs]) ->
+ p(" ~p ->\n",[Opt]),
+ p(" ~p(Val,Options,Gstkid,TkW,DB,ExtraArg,S,P,C);\n",[Fun]),
+ gen_opt_case_clauses(OptFuncs).
+
+gen_read(DB) ->
+ ObjTypes = lists:flatten(ordsets:from_list(ets:match(DB,{'$1','_','_',read}))),
+ p("read_option(DB,Gstkid,TkW,Option,ExtraArg) ->\n"),
+ p(" Key = case Option of\n"),
+ p(" Atom when atom(Atom) -> Atom;\n"),
+ p(" Opt when tuple(Opt) -> element(1,Opt)\n"),
+ p(" end,\n"),
+ p(" case Gstkid#gstkid.objtype of\n"),
+ gen_read_type_clauses(merge_types(ObjTypes),DB),
+ p(" Q -> exit({internal_error,unknown_objtype,Q})\n"),
+ p(" end.\n").
+
+
+gen_read_type_clauses([],_) -> done;
+gen_read_type_clauses([Objtype|Objtypes],DB) ->
+ OptsFuns = lists:map(fun (L) -> list_to_tuple(L) end,
+ ets:match(DB,{Objtype,'$1','$2',read})),
+ p(" ~p -> \ncase Key of\n",[Objtype]),
+ gen_readopt_case_clauses(merge_opts(opt_prio(),OptsFuns)),
+ p(" _ -> \nhandle_external_read(gstk_~p:read_option(Option,Gstkid,TkW,DB,ExtraArg))\n",[Objtype]),
+ p(" end;\n"),
+ gen_read_type_clauses(Objtypes,DB).
+
+gen_readopt_case_clauses([]) ->
+ done;
+gen_readopt_case_clauses([{Opt,Fun}|OptFuncs]) ->
+ p(" ~p -> \n~p(Option,Gstkid,TkW,DB,ExtraArg);\n",[Opt,Fun]),
+ gen_readopt_case_clauses(OptFuncs).
+
+
+p(Str) ->
+ ok = io:format(get(stdout),Str,[]).
+
+p(Format,Data) ->
+ ok = io:format(get(stdout),Format,Data).
+
+%%----------------------------------------------------------------------
+%% There items should be placed early in a case statement.
+%%----------------------------------------------------------------------
+obj_prio() -> [rectangle,line,gridline,image,button,canvas,checkbutton,radiobutton].
+opt_prio() -> [x,y,width,height,move,coords,data].
+
+merge_types(Types) ->
+ T2 = ordsets:from_list(Types),
+ P2 = ordsets:from_list(obj_prio()),
+ obj_prio() ++ ordsets:subtract(T2, P2).
+
+merge_opts([],L) -> L;
+merge_opts([Opt|Opts],Dict) ->
+ case gs:assq(Opt,Dict) of
+ {value,V} -> [{Opt,V}|merge_opts(Opts,lists:keydelete(Opt,1,Dict))];
+ false -> merge_opts(Opts,Dict)
+ end.
+
+the_config() ->
+ Buttons=[button,checkbutton,radiobutton],
+ AllPureTk = [Buttons,canvas,editor,entry,frame,label,listbox,
+ menubar,menubutton,scale,window],
+ CanvasObj = [arc,image,line,oval,polygon,rectangle,text],
+ All = [AllPureTk,CanvasObj,grid,gridline,menu,menuitem,gs],
+ Containers = [canvas,frame,grid,menu,menubar,menubutton,menuitem,window],
+ Ob1 = [Buttons,canvas,grid,frame,label,entry,editor,listbox,scale],
+ Ob2 = [button,checkbutton,radiobutton,label,menubutton],
+ Ob3 = [Buttons,frame,label,entry,editor,listbox,scale,menubutton,
+ menubar,menu],
+ Ob4 = [canvas,editor,listbox],
+ [{[Buttons,entry,scale,menubutton],enable,gen_enable,rw},
+ {[Buttons,label,entry,scale,menubutton,menu],fg,gen_fg,rw},
+ {[Buttons,label,entry,scale,menubutton,menu],bg,gen_bg,rw},
+ {Ob1,anchor,gen_anchor,rw},
+ {Ob1,height,gen_height,r},
+ {Ob1--[frame],height,gen_height,w},
+ {Ob1,width,gen_width,r},
+ {Ob1--[frame],width,gen_width,w},
+ {Ob1,pack_x,gen_pack_x,rw},
+ {Ob1,pack_y,gen_pack_y,rw},
+ {Ob1,pack_xy,gen_pack_xy,w},
+ {Ob1,x,gen_x,rw},
+ {Ob1,y,gen_y,rw},
+ {Ob1,raise,gen_raise,w},
+ {Ob1,lower,gen_lower,w},
+ {Ob2,align,gen_align,rw},
+ {Ob2,font,gen_font,rw},
+ {Ob2,justify,gen_justify,rw},
+ {Ob2,padx,gen_padx,rw},
+ {Ob2,pady,gen_pady,rw},
+ {Containers,default,gen_default,w},
+ {[AllPureTk,menu],relief,gen_relief,rw},
+ {[AllPureTk,menu],bw,gen_bw,rw},
+ {[Buttons,canvas,frame,label,entry,scale,menubutton,menu,menubar],
+ setfocus,gen_setfocus,rw},
+ {Ob3,buttonpress,gen_buttonpress,rw},
+ {Ob3,buttonrelease,gen_buttonrelease,rw},
+ {Ob3,configure,gen_configure,rw},
+ {[Ob3,window],destroy,gen_destroy,rw},
+ {[Ob3,window],enter,gen_enter,rw},
+ {[Ob3,window],leave,gen_leave,rw},
+ {[Ob3,window],focus,gen_focus_ev,rw},
+ {[Ob3,window],keypress,gen_keypress,rw},
+ {[Ob3,window],keyrelease,gen_keyrelease,rw},
+ {Ob3,motion,gen_motion,rw},
+ %% events containing x,y are special
+ {[window],buttonpress,gen_buttonpress,r},
+ {[window],buttonrelease,gen_buttonrelease,r},
+ {[window],motion,gen_motion,r},
+ {All,font_wh,gen_font_wh,r},
+ {All,choose_font,gen_choose_font,r},
+ {All,data,gen_data,rw},
+ {All,children,gen_children,r},
+ {All,id,gen_id,r},
+ {All,parent,gen_parent,r},
+ {All,type,gen_type,r},
+ {All,beep,gen_beep,w},
+ {All,keep_opt,gen_keep_opt,w},
+ {All,flush,gen_flush,rw},
+ {AllPureTk,highlightbw,gen_highlightbw,rw},
+ {AllPureTk,highlightbg,gen_highlightbg,rw},
+ {AllPureTk,highlightfg,gen_highlightfg,rw},
+ {AllPureTk,cursor,gen_cursor,rw}, % bug
+ {[Buttons,label,menubutton],label,gen_label,rw},
+ {[Buttons,menubutton,menu],activebg,gen_activebg,rw},
+ {[Buttons,menubutton,menu],activefg,gen_activefg,rw},
+ {[entry],selectbg,gen_selectbg,rw},
+ {[entry],selectbw,gen_selectbw,rw},
+ {[entry],selectfg,gen_selectfg,rw},
+ {Ob4,activebg,gen_so_activebg,rw},
+ {Ob4,bc,gen_so_bc,rw},
+ {Ob4,bg,gen_so_bg,rw},
+ {Ob4,hscroll,gen_so_hscroll,r},
+ {Ob4,scrollbg,gen_so_scrollbg,rw},
+ {Ob4,scrollfg,gen_so_scrollfg,rw},
+ {Ob4,scrolls,gen_so_scrolls,w},
+ {Ob4,selectbg,gen_so_selectbg,rw},
+ {Ob4,selectbg,gen_so_selectbg,rw},
+ {Ob4,selectbw,gen_so_selectbw,rw},
+ {Ob4,selectbw,gen_so_selectbw,rw},
+ {Ob4,selectfg,gen_so_selectfg,rw},
+ {Ob4,selectfg,gen_so_selectfg,rw},
+ {Ob4,vscroll,gen_so_vscroll,r},
+ {CanvasObj,coords,gen_citem_coords,rw},
+ {CanvasObj,lower,gen_citem_lower,w},
+ {CanvasObj,raise,gen_citem_raise,w},
+ {CanvasObj,move,gen_citem_move,w},
+ {CanvasObj,setfocus,gen_citem_setfocus,rw},
+ {CanvasObj,buttonpress,gen_citem_buttonpress,w}, % should be rw
+ {CanvasObj,buttonrelease,gen_citem_buttonrelease,w},
+ {CanvasObj,enter,gen_citem_enter,w},
+ {CanvasObj,focus,gen_citem_setfocus,w},
+ {CanvasObj,keypress,gen_citem_keypress,w},
+ {CanvasObj,keyrelease,gen_citem_keyrelease,w},
+ {CanvasObj,leave,gen_citem_leave,w},
+ {CanvasObj,motion,gen_citem_motion,w},
+ {CanvasObj,buttonpress,gen_buttonpress,r},
+ {CanvasObj,buttonrelease,gen_buttonrelease,r},
+ {CanvasObj,configure,gen_configure,r},
+ {CanvasObj,destroy,gen_destroy,r},
+ {CanvasObj,enter,gen_enter,r},
+ {CanvasObj,leave,gen_leave,r},
+ {CanvasObj,focus,gen_focus_ev,r},
+ {CanvasObj,keypress,gen_keypress,r},
+ {CanvasObj,keyrelease,gen_keyrelease,r},
+ {CanvasObj,motion,gen_motion,r},
+ {[arc,oval,polygon,rectangle],fill,gen_citem_fill,rw}].
diff --git a/lib/dialyzer/test/small_SUITE_data/src/guard_warnings.erl b/lib/dialyzer/test/small_SUITE_data/src/guard_warnings.erl
new file mode 100644
index 0000000000..6ab13eef9a
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/guard_warnings.erl
@@ -0,0 +1,118 @@
+%%
+%% A couple of tests for booleans in guards.
+%% Tests with suffix w have incomplete results due to weak dataflow.
+%% Tests with suffix ww have incomplete results due to weak dialyzer.
+%% Tests with suffix x should not give warnings.
+%%
+
+-module(and_bug).
+
+-compile(export_all).
+
+test1(X) when X and not X -> never.
+
+test2(X) when not X and X -> never.
+
+test3(X) when (X and not X) =:= true -> never.
+
+test4(X) when (not X and X) =:= true -> never.
+
+test5(X) when (X and not X) == true -> never.
+
+test6(X) when (not X and X) == true -> never.
+
+test7_w(X) when not (X or not X) -> never.
+
+test8_w(X) when not (not X or X) -> never.
+
+test9(X) when (X or not X) =:= false -> never.
+
+test10(X) when (not X or X) =:= false -> never.
+
+test11(X) when (X or not X) == false -> never.
+
+test12(X) when (not X or X) == false -> never.
+
+test13(X) when X and false -> never.
+
+test14(X) when false and X -> never.
+
+test15(X) when (X and false) =:= true -> never.
+
+test16(X) when (false and X) =:= true -> never.
+
+test17(X) when (X and false) == true -> never.
+
+test18(X) when (false and X) == true -> never.
+
+test19(X) when not (true or X) -> never.
+
+test20(X) when not (X or true) -> never.
+
+test21(X) when (true or X) =:= false -> never.
+
+test22(X) when (X or true) =:= false -> never.
+
+test23(X) when (true or X) == false -> never.
+
+test24(X) when (X or true) == false -> never.
+
+test25(X) when (false and X) -> never.
+
+test26(X) when (X and false) -> never.
+
+test27(X) when (false and X) =:= true -> never.
+
+test28(X) when (X and false) =:= true -> never.
+
+test29(X) when (false and X) == true -> never.
+
+test30(X) when (X and false) == true -> never.
+
+test31() when false and false -> never.
+
+test32() when (false and false) =:= true -> never.
+
+test33() when not (true and true) =:= true -> never.
+
+test34() when (false and false) == true -> never.
+
+test35() when not (true and true) == true -> never.
+
+test36() when false or false -> never.
+
+test37() when (false or false) =:= true -> never.
+
+test38() when not (false or false) =:= false -> never.
+
+test39() when (false or false) == true -> never.
+
+test40() when not (false or false) == false -> never.
+
+test41() when true =:= false -> never.
+
+test42() when true == false -> never.
+
+test43() when not (true =:= true) -> never.
+
+test44() when not (true == true) -> never.
+
+test45() when not (not (not (not (not (not (not true)))))) -> never.
+
+test46(X) when (X =:= true) and (X =:= false) -> never.
+
+test47(X) when (X == true) and (X == false) -> never.
+
+test48(X) when is_boolean(X) and (X =:= true) and (X =/= true) -> never.
+
+test49_x(X) when not (X or X) -> maybe.
+
+test50_x(X) when not (X and X) -> maybe.
+
+test51_x(X) when not (not X) -> maybe.
+
+test52_w(X) when is_boolean(X) and (X =/= true) and (X =:= true) -> never.
+
+test53_ww(X) when is_boolean(X) and (X =/= true) and (X =/= false) -> never.
+
+test54_w(X) when is_boolean(X) and not ((X =:= true) or (X =:= false)) -> never.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/guards.erl b/lib/dialyzer/test/small_SUITE_data/src/guards.erl
new file mode 100644
index 0000000000..34c43d6d12
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/guards.erl
@@ -0,0 +1,136 @@
+-module(guards).
+
+-compile([export_all]).
+
+-record(r, {f}).
+
+%% This is the reduced original test (no warnings)
+
+-define(g1(A), ((A#r.f =:= a) orelse (A#r.f =:= b))).
+
+t1(A) when ?g1(A) -> ok;
+t1(A) when not ?g1(A) -> ko.
+
+%% This should emit a warning
+
+t1_s(A) when ?g1(A) -> ok.
+
+t1_s_a() ->
+ t1_s(#r{f=c}).
+
+%% Same as t1 with 'or' instead of 'orelse' (no warnings)
+
+-define(g2(A), ((A#r.f =:= a) or (A#r.f =:= b))).
+
+t2(A) when ?g2(A) -> ok;
+t2(A) when not ?g2(A) -> ko.
+
+%% This should emit a warning
+
+t2_s(A) when ?g2(A) -> ok.
+
+t2_s_a() ->
+ t2_s(#r{f=c}).
+
+%% This could probably give a warning
+
+-define(g3(A), (A#r.f =:= a orelse is_atom(A))).
+
+t3(A) when ?g3(A) -> ok;
+t3(A) when not ?g3(A) -> ko.
+
+%% This could probably give a warning as well
+
+-define(g4(A), ((A#r.f =:= a) or is_atom(A))).
+
+t4(A) when ?g4(A) -> ok;
+t4(A) when not ?g4(A) -> ko.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Some shots in the dark on guard abuse %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% Should give a warning
+
+t5(A) when is_atom(A) and is_integer(A) -> never.
+
+%% Should give the same warning as t5
+
+t6(A) when is_atom(A) andalso is_integer(A) -> never.
+
+%% Should give a warning
+
+t7(A) when is_atom(A) or is_integer(A) -> ok.
+
+at7(42) -> t7(42);
+at7('a') -> t7('a');
+at7({42}) -> t7({42}).
+
+%% Should give a warning
+
+t8(A) when is_atom(A) orelse is_integer(A) -> ok.
+
+at8(42) -> t8(42);
+at8('a') -> t8('a');
+at8({42}) -> t8({42}).
+
+%% Should give a warning
+
+t9(A) when is_atom(A) orelse is_integer(A) -> ok;
+t9(A) when is_atom(A) -> redundant.
+
+%% Should give a warning
+
+t10(A) when is_atom(A) or is_integer(A) -> ok;
+t10(A) when is_atom(A) -> redundant.
+
+%% Should give a warning
+
+t11(A, B) when is_atom(A) and is_atom(B) ->
+ case {is_atom(A), is_atom(B)} of
+ {true, true} -> ok;
+ _ -> redundant
+ end.
+
+%% Should give a warning
+
+t12(A, B) when is_atom(A) andalso is_atom(B) ->
+ case {is_atom(A), is_atom(B)} of
+ {true, true} -> ok;
+ _ -> redundant
+ end.
+
+%% Should give two warnings
+
+t13(A, B) when is_atom(A) or is_atom(B) ->
+ case {is_atom(A), is_atom(B)} of
+ {true , true } -> ok;
+ {true , false} -> ok;
+ {false, true } -> ok;
+ {false, false} -> never;
+ {_ , _ } -> even_more_never
+ end.
+
+%% Should give two warnings
+
+t14(A, B) when is_atom(A) orelse is_atom(B) ->
+ case {is_atom(A), is_atom(B)} of
+ {true , true } -> ok;
+ {true , false} -> ok;
+ {false, true } -> ok;
+ {false, false} -> never;
+ {_ , _ } -> even_more_never
+ end.
+
+%% Should give two warnings
+
+t15(A) when ((A =:= a) or (A =:= b)) and ((A =:= b) or (A =:= c)) -> ok.
+
+t15_a() -> t15(a), t15(b), t15(c).
+
+%% Should give two warnings
+
+t16(A) when ((A =:= a) orelse (A =:= b)) andalso
+ ((A =:= b) orelse (A =:= c)) -> ok.
+
+t16_a() -> t16(a), t16(b), t16(c).
diff --git a/lib/dialyzer/test/small_SUITE_data/src/inf_loop2.erl b/lib/dialyzer/test/small_SUITE_data/src/inf_loop2.erl
new file mode 100644
index 0000000000..6ac29116a5
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/inf_loop2.erl
@@ -0,0 +1,23 @@
+%%---------------------------------------------------------------------
+%% Module that went into an infinite loop when trying to assign types.
+%%
+%% What was happening is that for functions which are in an SCC but all
+%% return none(), a second chance was given to them by the analysis to
+%% see whether they return none() because they are involved in an loop
+%% (presumably server-related) and could be assigned the type unit()
+%% instead. The problem is that when the really return none() for some
+%% other reason (an error such in this case) then we will again find
+%% none() and try again for unit(), thereby entering an infinite loop.
+%% The issue was resolved on May 17th by adding an appropriate boolean
+%% parameter to dialyzer_typesig:solve_scc() function.
+%%---------------------------------------------------------------------
+-module(inf_loop2).
+
+-export([test/0]).
+
+test() ->
+ lists:reverse(gazonk),
+ loop().
+
+loop() ->
+ test().
diff --git a/lib/dialyzer/test/small_SUITE_data/src/invalid_specs/invalid_spec1.erl b/lib/dialyzer/test/small_SUITE_data/src/invalid_specs/invalid_spec1.erl
new file mode 100644
index 0000000000..06ab2f9a22
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/invalid_specs/invalid_spec1.erl
@@ -0,0 +1,28 @@
+-module(invalid_spec1).
+
+-export([get_plan_dirty/1]).
+
+-spec get_plan_dirty([string()]) -> {{atom(), any()}, [atom()]}.
+
+get_plan_dirty(ClassL) ->
+ get_plan_dirty(ClassL, [], []).
+
+get_plan_dirty([], Res, FoundClassList) ->
+ {Res,FoundClassList};
+get_plan_dirty([Class|ClassL], Res, FoundClassList) ->
+ ClassPlan = list_to_atom(Class ++ "_plan"),
+ case catch mnesia:dirty_all_keys(ClassPlan) of
+ {'EXIT',_} ->
+ get_plan_dirty(ClassL, Res, FoundClassList);
+ [] ->
+ get_plan_dirty(ClassL, Res, FoundClassList);
+ KeyL ->
+ ClassAtom = list_to_atom(Class),
+ Res2 =
+ lists:foldl(fun(Key, Acc) ->
+ [{ClassAtom,Key}|Acc]
+ end,
+ Res,
+ KeyL),
+ get_plan_dirty(ClassL, Res2, [ClassAtom|FoundClassList])
+ end.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/invalid_specs/invalid_spec2.erl b/lib/dialyzer/test/small_SUITE_data/src/invalid_specs/invalid_spec2.erl
new file mode 100644
index 0000000000..e49f73d014
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/invalid_specs/invalid_spec2.erl
@@ -0,0 +1,11 @@
+-module(invalid_spec2).
+
+-export([foo/0]).
+
+foo() ->
+ case
+ invalid_spec1:get_plan_dirty(mnesia:dirty_all_keys(cmClassInfo))
+ of
+ {[],[]} -> foo;
+ { _, _} -> bar
+ end.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/letrec1.erl b/lib/dialyzer/test/small_SUITE_data/src/letrec1.erl
new file mode 100644
index 0000000000..eeea671bcc
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/letrec1.erl
@@ -0,0 +1,13 @@
+%%%-------------------------------------------------------------------
+%%% File : letrec1.erl
+%%% Author : Tobias Lindahl <[email protected]>
+%%% Description :
+%%%
+%%% Created : 9 Mar 2007 by Tobias Lindahl <[email protected]>
+%%%-------------------------------------------------------------------
+-module(letrec1).
+
+-export([t/1]).
+
+t(Opts) ->
+ [Opt || Opt <- Opts, Opt =/= compressed].
diff --git a/lib/dialyzer/test/small_SUITE_data/src/list_match.erl b/lib/dialyzer/test/small_SUITE_data/src/list_match.erl
new file mode 100644
index 0000000000..38ef6ef976
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/list_match.erl
@@ -0,0 +1,20 @@
+%%%-------------------------------------------------------------------
+%%% File : list_match.erl
+%%% Author : Tobias Lindahl <[email protected]>
+%%% Description :
+%%%
+%%% Created : 12 Mar 2007 by Tobias Lindahl <[email protected]>
+%%%-------------------------------------------------------------------
+-module(list_match).
+
+-export([t/0]).
+
+t() ->
+ t([1,2,3,4]).
+
+t([]) ->
+ ok;
+t([H|T]) when is_integer(H) ->
+ t(T);
+t([_|T]) ->
+ t(T).
diff --git a/lib/dialyzer/test/small_SUITE_data/src/lzip.erl b/lib/dialyzer/test/small_SUITE_data/src/lzip.erl
new file mode 100644
index 0000000000..753d2939d8
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/lzip.erl
@@ -0,0 +1,8 @@
+-module(lzip).
+-export([test/0, test/1]).
+
+test() ->
+ lists:zip([],[]).
+
+test(L) ->
+ lists:zip(L, []).
diff --git a/lib/dialyzer/test/small_SUITE_data/src/make_tuple.erl b/lib/dialyzer/test/small_SUITE_data/src/make_tuple.erl
new file mode 100644
index 0000000000..0a5edf8c24
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/make_tuple.erl
@@ -0,0 +1,5 @@
+-module(make_tuple).
+-export([test/0]).
+
+test() ->
+ {_,_} = erlang:make_tuple(3, []).
diff --git a/lib/dialyzer/test/small_SUITE_data/src/minus_minus.erl b/lib/dialyzer/test/small_SUITE_data/src/minus_minus.erl
new file mode 100644
index 0000000000..f1e9483c40
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/minus_minus.erl
@@ -0,0 +1,8 @@
+%%------------------------------------------------------------------------
+%% Test file which gave a bogus warning when analyzed with Dialyzer 1.6.1.
+%%------------------------------------------------------------------------
+-module(minus_minus).
+-export([test/0]).
+
+test() ->
+ [] -- [].
diff --git a/lib/dialyzer/test/small_SUITE_data/src/mod_info.erl b/lib/dialyzer/test/small_SUITE_data/src/mod_info.erl
new file mode 100644
index 0000000000..a24e4276ad
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/mod_info.erl
@@ -0,0 +1,5 @@
+-module(mod_info).
+-export([test/0]).
+
+test() ->
+ {module_info(), module_info(compile)}.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/my_filter.erl b/lib/dialyzer/test/small_SUITE_data/src/my_filter.erl
new file mode 100644
index 0000000000..ecb2827eb4
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/my_filter.erl
@@ -0,0 +1,17 @@
+-module(my_filter).
+-export([test/0]).
+
+test() ->
+ filter(fun mystery/1, [1,2,3,4]).
+
+filter(Pred, List) when is_function(Pred, 1) ->
+ [ E || E <- List, Pred(E) ].
+
+mystery(X) ->
+ case (X rem 3) of
+ 0 -> true;
+ 1 -> false;
+ 2 -> gazonk
+ end.
+
+%% mystery(_X,_Y) -> true.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/my_sofs.erl b/lib/dialyzer/test/small_SUITE_data/src/my_sofs.erl
new file mode 100644
index 0000000000..e3ae99ebbc
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/my_sofs.erl
@@ -0,0 +1,83 @@
+%% Program showing the problems with record field accesses.
+
+-module(my_sofs).
+-export([ordset_of_sets/3, is_equal/2]).
+
+-define(TAG, 'Set').
+-define(ORDTAG, 'OrdSet').
+
+-record(?TAG, {data = [], type = type}).
+-record(?ORDTAG, {orddata = {}, ordtype = type}).
+
+-define(LIST(S), (S)#?TAG.data).
+-define(TYPE(S), (S)#?TAG.type).
+-define(SET(L, T), #?TAG{data = L, type = T}).
+-define(IS_SET(S), record(S, ?TAG)).
+
+%% Ordered sets and atoms:
+-define(ORDDATA(S), (S)#?ORDTAG.orddata).
+-define(ORDTYPE(S), (S)#?ORDTAG.ordtype).
+-define(ORDSET(L, T), #?ORDTAG{orddata = L, ordtype = T}).
+-define(IS_ORDSET(S), record(S, ?ORDTAG)).
+
+%% When IS_SET is true:
+-define(ANYTYPE, '_').
+-define(REL_TYPE(I, R), element(I, R)).
+-define(SET_OF(X), [X]).
+
+is_equal(S1, S2) when ?IS_SET(S1), ?IS_SET(S2) ->
+ case match_types(?TYPE(S1), ?TYPE(S2)) of
+ true -> ?LIST(S1) == ?LIST(S2);
+ false -> erlang:error(type_mismatch, [S1, S2])
+ end;
+is_equal(S1, S2) when ?IS_ORDSET(S1), ?IS_ORDSET(S2) ->
+ case match_types(?TYPE(S1), ?TYPE(S2)) of
+ true -> ?ORDDATA(S1) == ?ORDDATA(S2);
+ false -> erlang:error(type_mismatch, [S1, S2])
+ end;
+is_equal(S1, S2) when ?IS_SET(S1), ?IS_ORDSET(S2) ->
+ erlang:error(type_mismatch, [S1, S2]);
+is_equal(S1, S2) when ?IS_ORDSET(S1), ?IS_SET(S2) ->
+ erlang:error(type_mismatch, [S1, S2]).
+
+%% Type = OrderedSetType
+%% | SetType
+%% | atom() except '_'
+%% OrderedSetType = {Type, ..., Type}
+%% SetType = [ElementType] % list of exactly one element
+%% ElementType = '_' % any type (implies empty set)
+%% | Type
+
+ordset_of_sets([S | Ss], L, T) when ?IS_SET(S) ->
+ ordset_of_sets(Ss, [?LIST(S) | L], [[?TYPE(S)] | T]);
+ordset_of_sets([S | Ss], L, T) when ?IS_ORDSET(S) ->
+ ordset_of_sets(Ss, [?LIST(S) | L], [?ORDTYPE(S) | T]);
+ordset_of_sets([], L, T) ->
+ ?ORDSET(list_to_tuple(lists:reverse(L)), list_to_tuple(lists:reverse(T)));
+ordset_of_sets(_, _L, _T) ->
+ error.
+
+%% inlined.
+match_types(T, T) -> true;
+match_types(Type1, Type2) -> match_types1(Type1, Type2).
+
+match_types1(Atom, Atom) when is_atom(Atom) ->
+ true;
+match_types1(?ANYTYPE, _) ->
+ true;
+match_types1(_, ?ANYTYPE) ->
+ true;
+match_types1(?SET_OF(Type1), ?SET_OF(Type2)) ->
+ match_types1(Type1, Type2);
+match_types1(T1, T2) when tuple(T1), tuple(T2), size(T1) =:= size(T2) ->
+ match_typesl(size(T1), T1, T2);
+match_types1(_T1, _T2) ->
+ false.
+
+match_typesl(0, _T1, _T2) ->
+ true;
+match_typesl(N, T1, T2) ->
+ case match_types1(?REL_TYPE(N, T1), ?REL_TYPE(N, T2)) of
+ true -> match_typesl(N-1, T1, T2);
+ false -> false
+ end.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/no_match.erl b/lib/dialyzer/test/small_SUITE_data/src/no_match.erl
new file mode 100644
index 0000000000..e3e7a4b2d1
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/no_match.erl
@@ -0,0 +1,9 @@
+-module(no_match).
+-export([t1/1, t2/1, t3/1]).
+-record(rec, {field}).
+
+t1(#rec{} = {_}) -> no_match1.
+
+t2(42 = gazonk) -> no_match2.
+
+t3(X) when false -> X.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/no_unused_fun.erl b/lib/dialyzer/test/small_SUITE_data/src/no_unused_fun.erl
new file mode 100644
index 0000000000..0bd8ba402c
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/no_unused_fun.erl
@@ -0,0 +1,20 @@
+-module(no_unused_fun).
+-export([main/2]).
+
+main(X, Bool) ->
+ case Bool of
+ true ->
+ F = fun foo/1;
+ false ->
+ F = fun foobar/1
+ end,
+ calc(X, F).
+
+calc(X, Fun) ->
+ Fun(X).
+
+foo(A) ->
+ A+42.
+
+foobar(A) ->
+ A-42.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/no_unused_fun2.erl b/lib/dialyzer/test/small_SUITE_data/src/no_unused_fun2.erl
new file mode 100644
index 0000000000..e287c4de5f
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/no_unused_fun2.erl
@@ -0,0 +1,20 @@
+-module(no_unused_fun2).
+-export([main/2]).
+
+main(X, Bool) ->
+ case Bool of
+ true ->
+ F = fun foo/1;
+ false ->
+ F = fun foobar/1
+ end,
+ spawn(fun()->calc(X, F)end).
+
+calc(X, Fun) ->
+ Fun(X).
+
+foo(A) ->
+ A+42.
+
+foobar(A) ->
+ A-42.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/non_existing.erl b/lib/dialyzer/test/small_SUITE_data/src/non_existing.erl
new file mode 100644
index 0000000000..5701b8a745
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/non_existing.erl
@@ -0,0 +1,13 @@
+%%--------------------------------------------------------------------------
+%% Module which contains direct and indirect calls to remote functions
+%% which do not exist. Their treatment should be the same.
+%%--------------------------------------------------------------------------
+-module(non_existing).
+-export([t_call/0, t_fun/0]).
+
+t_call() ->
+ lists:non_existing_call(42).
+
+t_fun() ->
+ Fun = fun lists:non_existing_fun/1,
+ Fun(42).
diff --git a/lib/dialyzer/test/small_SUITE_data/src/none_scc_inf_loop.erl b/lib/dialyzer/test/small_SUITE_data/src/none_scc_inf_loop.erl
new file mode 100644
index 0000000000..111758965c
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/none_scc_inf_loop.erl
@@ -0,0 +1,21 @@
+%%===========================================================================
+%% Test that made dialyzer go into an infinite loop. The reason was that
+%% t_inf(t_unit(), t_none()) returned t_unit() instead of t_none() as it
+%% should. The issue was identified and fixed by Stavros Aronis on 5/11/2010.
+%%===========================================================================
+-module(none_scc_inf_loop).
+
+-export([foo/0]).
+
+foo() ->
+ foo(3).
+
+foo(0) ->
+ exit(foo);
+foo(N) ->
+ bar(N-1).
+
+bar(0) ->
+ exit(foo);
+bar(N) ->
+ foo(N-1).
diff --git a/lib/dialyzer/test/small_SUITE_data/src/not_bogus_warning.erl b/lib/dialyzer/test/small_SUITE_data/src/not_bogus_warning.erl
new file mode 100644
index 0000000000..53f7e934e4
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/not_bogus_warning.erl
@@ -0,0 +1,25 @@
+%%-----------------------------------------------------------------------------
+%% Test which produces an erroneous warning:
+%% Guard test is_atom(A::'bar' | 'foo') can never succeed
+%% due to the handling of not which of course succeeds when its argument fails
+%%-----------------------------------------------------------------------------
+-module(not_bogus_warning).
+
+-export([t1/0, t2/0, t3/0, t4/0]).
+
+t1() ->
+ [A || A <- [foo, bar], not is_atom(A)].
+
+t2() ->
+ [A || A <- [foo, bar], not is_integer(A)].
+
+t3() ->
+ should_we_warn_here(42).
+
+should_we_warn_here(X) when is_integer(X) -> int.
+
+t4() ->
+ should_we_warn_or_not(42).
+
+should_we_warn_or_not(X) when not is_integer(X) -> not_int;
+should_we_warn_or_not(X) -> int.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/not_guard_crash.erl b/lib/dialyzer/test/small_SUITE_data/src/not_guard_crash.erl
new file mode 100644
index 0000000000..75bcffc2bc
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/not_guard_crash.erl
@@ -0,0 +1,49 @@
+%% From: Matthias Radestock <[email protected]>
+%% Date: 19 August 2007
+%%
+%% when I run dialyzer on my code it throws the following error:
+%%
+%% Analysis failed with error report:
+%% {{case_clause,any},
+%% [{dialyzer_dataflow,bind_guard,5},
+%% {dialyzer_dataflow,bind_guard_case_clauses,6},
+%% {dialyzer_dataflow,bind_guard,5},
+%% {dialyzer_dataflow,bind_guard_case_clauses,6},
+%% {dialyzer_dataflow,bind_guard,5},
+%% {dialyzer_dataflow,bind_eqeq_guard_lit_other,6},
+%% {dialyzer_dataflow,bind_guard,...},
+%% {dialyzer_dataflow,...}]}
+%%
+%% This is happening with the R11B-5 version of dialyzer when
+%% analyzing the attached file.
+%%--------------------------------------------------------------------
+
+-module(not_guard_crash).
+
+-export([match_ticket/2]).
+
+-record(ticket, {passive_flag, active_flag, write_flag, read_flag}).
+
+%%--------------------------------------------------------------------
+
+match_ticket(#ticket{passive_flag = PP,
+ active_flag = PA,
+ write_flag = PW,
+ read_flag = PR},
+ #ticket{passive_flag = TP,
+ active_flag = TA,
+ write_flag = TW,
+ read_flag = TR}) ->
+ if
+ %% Matches if either we're not requesting passive access, or
+ %% passive access is permitted, and ...
+ (not(TP) orelse PP) andalso
+ (not(TA) orelse PA) andalso
+ (not(TW) orelse PW) andalso
+ (not(TR) orelse PR) ->
+ match;
+ true ->
+ no_match
+ end.
+
+%%--------------------------------------------------------------------
diff --git a/lib/dialyzer/test/small_SUITE_data/src/or_bug.erl b/lib/dialyzer/test/small_SUITE_data/src/or_bug.erl
new file mode 100644
index 0000000000..fb8f6558b8
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/or_bug.erl
@@ -0,0 +1,24 @@
+%%---------------------------------------------------------------------------
+%% From: Per Hedeland <[email protected]>
+%% Date: 11 Feb 2010
+%%
+%% The code below demonstrates a bug in dialyzer - it produces the warning:
+%% Clause guard cannot succeed.
+%% The variable Cs was matched against the type any()
+%% for the first test/1 clause, but of course the claim can easily be easily
+%% refuted by calling test(#cs{}).
+%%---------------------------------------------------------------------------
+
+-module(or_bug).
+
+-export([test/1]).
+
+-record(cs, {children = [], actions = []}).
+
+-define(is_internal(X), ((X#cs.children =/= []) or
+ (X#cs.actions =/= []))).
+-define(has_children(X), (X#cs.children /= [])).
+
+test(Cs) when not ?is_internal(Cs) -> foo;
+test(Cs) when not ?has_children(Cs) -> bar;
+test(Cs) when Cs#cs.children =/= [] -> baz.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/orelsebug.erl b/lib/dialyzer/test/small_SUITE_data/src/orelsebug.erl
new file mode 100644
index 0000000000..8479fc33cc
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/orelsebug.erl
@@ -0,0 +1,16 @@
+%%%-------------------------------------------------------------------
+%%% File : orelsebug.erl
+%%% Author : Tobias Lindahl <[email protected]>
+%%% Description :
+%%%
+%%% Created : 14 Nov 2006 by Tobias Lindahl <[email protected]>
+%%%-------------------------------------------------------------------
+-module(orelsebug).
+
+-export([t/1, t1/1]).
+
+t(Format) when is_list(Format) ->
+ t1(Format).
+
+t1(Format) when is_list(Format) orelse is_binary(Format) ->
+ Format.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/orelsebug2.erl b/lib/dialyzer/test/small_SUITE_data/src/orelsebug2.erl
new file mode 100644
index 0000000000..60e0c47384
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/orelsebug2.erl
@@ -0,0 +1,23 @@
+%%%-------------------------------------------------------------------
+%%% File : orelsebug2.erl
+%%% Author : Tobias Lindahl <[email protected]>
+%%% Description :
+%%%
+%%% Created : 21 Nov 2006 by Tobias Lindahl <[email protected]>
+%%%-------------------------------------------------------------------
+-module(orelsebug2).
+
+-export([t/1]).
+
+-record(eventdata, {
+ expires
+ }).
+
+t(L) ->
+ L2 = [E1 || E1 <- L, E1#eventdata.expires == x
+ orelse E1#eventdata.expires == y],
+
+ case L2 of
+ [_E] -> x;
+ [] -> y
+ end.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/overloaded1.erl b/lib/dialyzer/test/small_SUITE_data/src/overloaded1.erl
new file mode 100644
index 0000000000..0af4f7446f
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/overloaded1.erl
@@ -0,0 +1,31 @@
+%%-----------------------------------------------------------------------------
+%% Test that tests overloaded contratcs.
+%% In December 2008 it works as far as intersection types are concerned (test1)
+%% However, it does NOT work as far as type variables are concerned (test2)
+%%-----------------------------------------------------------------------------
+-module(overloaded1).
+-export([test1/0, test2/0, foo/2]).
+
+test1() ->
+ {ok, gazonk} = foo({a,b,1}, atom_to_list(gazonk)),
+ ok.
+
+test2() ->
+ {ok, gazonk} = foo(baz, []),
+ ok.
+
+-type mod() :: atom().
+
+-spec foo(ATM, list()) -> {'ok', ATM} | {'error', _} when is_subtype(ATM, mod())
+ ; (MFA, list()) -> {'ok', MFA} | {'error', _} when is_subtype(MFA, mfa()).
+
+foo(F, _) when is_atom(F) ->
+ case atom_to_list(F) of
+ [42|_] -> {ok, F};
+ _Other -> {error, mod:bar(F)}
+ end;
+foo({M,F,A}, _) ->
+ case A =:= 0 of
+ false -> {ok, {M,F,A}};
+ true -> {error, M}
+ end.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/param_types_crash.erl b/lib/dialyzer/test/small_SUITE_data/src/param_types_crash.erl
new file mode 100644
index 0000000000..52d52cc9a9
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/param_types_crash.erl
@@ -0,0 +1,77 @@
+%%---------------------------------------------------------------------------
+%% From: Nicolas Tranger <[email protected]>
+%% Date: 10/11/2110
+%%
+%% After adding spec statements to my module, Dialyzer failed on execution
+%% though. I've been trying to create a minimal reproducible case and
+%% reduced the code to something similar of about 80 LOC. As noted in the
+%% comments, commenting out some lines makes Dialyzer parse and analyze
+%% the file correctly. The code executes correctly and as expected.
+%%
+%% I'm not sure what causes the issue. parse_result is polymorphic in its
+%% return type, but statically typed based on the type of the 3th argument
+%% (well, that's how I see things from a Haskell background).
+%%---------------------------------------------------------------------------
+%% This was a bug in erl_types:t_subtract/2 which was not handling the case
+%% of free variables in prameterized types. Fixed 15/10/2010.
+%%---------------------------------------------------------------------------
+-module(param_types_crash).
+
+-export([test/0]).
+
+-type socket_error() :: 'connection_closed' | 'timeout'.
+-type app_error() :: 'no_magic' | 'unknown_failure'.
+
+-type resulthandler_result(T) :: {'ok', T} | socket_error() | app_error().
+-type resulthandler(T) :: fun((binary()) -> resulthandler_result(T)).
+
+test() ->
+ Data = <<0:32/little-unsigned, 1:8/little, 1:8/little-unsigned>>,
+ case parse_result(Data, get_option(fun get_bool/1)) of
+ %% Removing the next 2 lines makes
+ %% dialyzer param_types_crash.erl -Wunmatched_returns -Wunderspecs
+ %% succeed. With these lines, it fails.
+ {ok, none} -> none;
+ {ok, {some, Value}} -> Value;
+ Reply -> {error, Reply}
+ end.
+
+-spec parse_result(binary(), resulthandler(T)) -> resulthandler_result(T).
+parse_result(<<ResultCode:32/little-unsigned, Rest/binary>>, ResultHandler) ->
+ case ResultCode of
+ 0 -> ResultHandler(Rest);
+ 1 -> no_magic;
+ 2 -> unknown_failure
+ end.
+
+-spec get_bool(binary()) -> {'ok', boolean()} | socket_error().
+get_bool(Data) ->
+ case get_data(Data, 1, size(Data)) of
+ {<<Value:8/little-unsigned>>, <<>>} -> {ok, (Value =:= 1)};
+ Other -> Other
+ end.
+
+-spec get_option(resulthandler(T)) -> resulthandler('none' | {'some', T}).
+get_option(Fun) ->
+ fun(Data) ->
+ case get_data(Data, 1, size(Data)) of
+ {<<HasValue:8/little>>, Rest} ->
+ case HasValue of
+ 0 -> {ok, none};
+ 1 -> {ok, Value} = Fun(Rest),
+ {ok, {some, Value}}
+ end;
+ Other -> Other
+ end
+ end.
+
+-spec get_data(binary(), non_neg_integer(), non_neg_integer()) ->
+ {binary(), binary()} | socket_error().
+get_data(Data, Length, Received) when Length > Received ->
+ case Data of
+ <<>> -> connection_closed;
+ _ -> timeout
+ end;
+get_data(Data, Length, _) ->
+ <<Bin:Length/binary, Rest/binary>> = Data,
+ {Bin, Rest}.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/port_info_test.erl b/lib/dialyzer/test/small_SUITE_data/src/port_info_test.erl
new file mode 100644
index 0000000000..2ee9a3a6e2
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/port_info_test.erl
@@ -0,0 +1,33 @@
+%%
+%% Tests hardcoded dependent type info
+%% and the quality of the warnings that Dialyzer spits out
+%%
+-module(port_info_test).
+-export([t1/1, t2/1, t3/1, t4/1, t5/2, buggy/1]).
+
+%% The following errors are correctly caught, but the messages are a bit weird
+t1(X) when is_port(X) ->
+ {connected, 42} = erlang:port_info(X, connected);
+t1(_) -> ok.
+
+t2(X) when is_port(X) ->
+ {registered_name, "42"} = erlang:port_info(X, registered_name);
+t2(_) -> ok.
+
+%% Here only one od the two errors is reported...
+t3(X) when is_atom(X) ->
+ {output, 42} = erlang:port_info(X, connected);
+t3(_) -> ok.
+
+t4(X) when is_atom(X) ->
+ {Atom, _} = erlang:port_info(X, connected),
+ Atom = links;
+t4(_) -> ok.
+
+t5(X, Atom) when is_port(X) ->
+ {gazonk, _} = erlang:port_info(X, Atom);
+t5(_, _) -> ok.
+
+%% The type system is not strong enough to catch the following errors
+buggy(X) when is_atom(X) ->
+ {links, X} = erlang:port_info(foo, X).
diff --git a/lib/dialyzer/test/small_SUITE_data/src/process_info_test.erl b/lib/dialyzer/test/small_SUITE_data/src/process_info_test.erl
new file mode 100644
index 0000000000..2c24ae597f
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/process_info_test.erl
@@ -0,0 +1,20 @@
+%%
+%% Tests hardcoded dependent type info for process_info/1
+%%
+-module(process_info_test).
+-export([pinfo/1]).
+
+pinfo(P) when node(P) == node() -> % On same node
+ case process_info(P) of
+ undefined ->
+ exit(dead);
+ Info -> Info
+ end;
+pinfo(P) -> % On different node
+ case rpc:call(node(P), erlang, process_info, [P]) of
+ {badrpc, _} ->
+ exit(badrpc);
+ undefined -> % This does happen
+ exit(dead);
+ Info -> Info
+ end.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/pubsub/pubsub_api.erl b/lib/dialyzer/test/small_SUITE_data/src/pubsub/pubsub_api.erl
new file mode 100644
index 0000000000..85ea292077
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/pubsub/pubsub_api.erl
@@ -0,0 +1,99 @@
+% Copyright 2007-2008 Konrad-Zuse-Zentrum für Informationstechnik Berlin
+%
+% 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.
+%%%-------------------------------------------------------------------
+%%% File : pubsub_api.erl
+%%% Author : Thorsten Schuett <[email protected]>
+%%% Description : Publish API function
+%%%
+%%% Created : 17 Sep 2007 by Thorsten Schuett <[email protected]>
+%%%-------------------------------------------------------------------
+%% @author Thorsten Schuett <[email protected]>
+%% @copyright 2007-2008 Konrad-Zuse-Zentrum für Informationstechnik Berlin
+%% @version $Id $
+-module(pubsub_dir.pubsub_api).
+
+-author('[email protected]').
+-vsn('$Id: pubsub_api.erl,v 1.1 2009/11/06 12:39:55 maria Exp $ ').
+
+-export([publish/2, subscribe/2, unsubscribe/2, get_subscribers/1]).
+
+-import(transstore.transaction_api).
+-import(io).
+-import(lists).
+
+%%====================================================================
+%% public functions
+%%====================================================================
+
+%% @doc publishs an event under a given topic.
+%% called e.g. from the java-interface
+%% @spec publish(string(), string()) -> ok
+publish(Topic, Content) ->
+ Subscribers = get_subscribers(Topic),
+ io:format("calling subscribers ~p~n", [Subscribers]),
+ lists:foreach(fun (Subscriber) ->
+ io:format("calling ~p~n", [Subscriber]),
+ pubsub_publish:publish(Subscriber, Topic, Content)
+ end,
+ Subscribers),
+ ok.
+
+%% @doc subscribes a url for a topic.
+%% called e.g. from the java-interface
+%% @spec subscribe(string(), string()) -> ok | {fail, term()}
+subscribe(Topic, URL) ->
+ TFun = fun(TransLog) ->
+ {{Success, _ValueOrReason} = Result, TransLog1} = transaction_api:read(Topic, TransLog),
+ {Result2, TransLog2} = if
+ Success == fail ->
+ transaction_api:write(Topic, [URL], TransLog); %obacht: muss TransLog sein!
+ true ->
+ {value, Subscribers} = Result,
+ transaction_api:write(Topic, [URL | Subscribers], TransLog1)
+ end,
+ if
+ Result2 == ok ->
+ {{ok, ok}, TransLog2};
+ true ->
+ {Result2, TransLog2}
+ end
+ end,
+ transaction_api:do_transaction(TFun, fun (_) -> ok end, fun (X) -> {fail, X} end).
+
+%% @doc unsubscribes a url for a topic.
+-spec(unsubscribe/2 :: (string(), string()) -> ok | {fail, any()}).
+unsubscribe(Topic, URL) ->
+ TFun = fun(TransLog) ->
+ {Subscribers, TransLog1} = transaction_api:read2(TransLog, Topic),
+ case lists:member(URL, Subscribers) of
+ true ->
+ NewSubscribers = lists:delete(URL, Subscribers),
+ TransLog2 = transaction_api:write2(TransLog1, Topic, NewSubscribers),
+ {{ok, ok}, TransLog2};
+ false ->
+ {{fail, not_found}, TransLog}
+ end
+ end,
+ transaction_api:do_transaction(TFun, fun (_) -> ok end, fun (X) -> {fail, X} end).
+
+%% @doc queries the subscribers of a query
+%% @spec get_subscribers(string()) -> [string()]
+get_subscribers(Topic) ->
+ {Fl, _Value} = transaction_api:quorum_read(Topic),
+ if
+ Fl == fail -> %% Fl is either Fail or the Value/Subscribers
+ [];
+ true ->
+ Fl
+ end.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/pubsub/pubsub_publish.erl b/lib/dialyzer/test/small_SUITE_data/src/pubsub/pubsub_publish.erl
new file mode 100644
index 0000000000..601dbad74b
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/pubsub/pubsub_publish.erl
@@ -0,0 +1,49 @@
+% Copyright 2008 Konrad-Zuse-Zentrum für Informationstechnik Berlin
+%
+% 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.
+%%%-------------------------------------------------------------------
+%%% File : pubsub_publish.erl
+%%% Author : Thorsten Schuett <[email protected]>
+%%% Description : Publish function
+%%%
+%%% Created : 26 Mar 2008 by Thorsten Schuett <[email protected]>
+%%%-------------------------------------------------------------------
+%% @author Thorsten Schuett <[email protected]>
+%% @copyright 2008 Konrad-Zuse-Zentrum für Informationstechnik Berlin
+%% @version $Id $
+-module(pubsub_dir.pubsub_publish).
+
+-author('[email protected]').
+-vsn('$Id: pubsub_publish.erl,v 1.1 2009/11/06 12:39:55 maria Exp $ ').
+
+-export([publish/3, publish_internal/3]).
+
+-import(json).
+-import(io).
+-import(http).
+-import(jsonrpc).
+
+%%====================================================================
+%% public functions
+%%====================================================================
+
+%% @doc publishs an event to a given url.
+%% @spec publish(string(), string(), string()) -> ok
+%% @todo use pool:pspawn
+publish(URL, Topic, Content) ->
+ spawn(fun () -> pubsub_publish:publish_internal(URL, Topic, Content) end),
+ ok.
+
+publish_internal(URL, Topic, Content) ->
+ Res = jsonrpc:call(URL, [], {call, notify, [Topic, Content]}),
+ io:format("~p ~p~n", [Res, URL]).
diff --git a/lib/dialyzer/test/small_SUITE_data/src/receive1.erl b/lib/dialyzer/test/small_SUITE_data/src/receive1.erl
new file mode 100644
index 0000000000..96fdf54e4d
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/receive1.erl
@@ -0,0 +1,16 @@
+%%%-------------------------------------------------------------------
+%%% File : receive1.erl
+%%% Author : Tobias Lindahl <[email protected]>
+%%% Description :
+%%%
+%%% Created : 27 Mar 2007 by Tobias Lindahl <[email protected]>
+%%%-------------------------------------------------------------------
+-module(receive1).
+
+-export([t/1]).
+
+t(X) ->
+ receive
+ after
+ infinity -> X
+ end.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/record_construct.erl b/lib/dialyzer/test/small_SUITE_data/src/record_construct.erl
new file mode 100644
index 0000000000..54cc2601bd
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/record_construct.erl
@@ -0,0 +1,21 @@
+-module(record_construct).
+-export([t_loc/0, t_opa/0, t_rem/0]).
+
+-record(r_loc, {a = gazonk :: integer(), b = 42 :: atom()}).
+
+t_loc() ->
+ #r_loc{}.
+
+-record(r_opa, {a :: atom(),
+ b = gb_sets:new() :: gb_set(),
+ c = 42 :: boolean(),
+ d, % untyped on purpose
+ e = false :: boolean()}).
+
+t_opa() ->
+ #r_opa{}.
+
+-record(r_rem, {a = gazonk :: string()}).
+
+t_rem() ->
+ #r_rem{}.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/record_pat.erl b/lib/dialyzer/test/small_SUITE_data/src/record_pat.erl
new file mode 100644
index 0000000000..3308641571
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/record_pat.erl
@@ -0,0 +1,15 @@
+%%%-------------------------------------------------------------------
+%%% File : record_pat.erl
+%%% Author : Tobias Lindahl <>
+%%% Description : Emit warning if a pattern violates the record type
+%%%
+%%% Created : 21 Oct 2008 by Tobias Lindahl <>
+%%%-------------------------------------------------------------------
+-module(record_pat).
+
+-export([t/1]).
+
+-record(foo, {bar :: integer()}).
+
+t(#foo{bar=baz}) -> no_way;
+t(#foo{bar=1}) -> ok.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/record_send_test.erl b/lib/dialyzer/test/small_SUITE_data/src/record_send_test.erl
new file mode 100644
index 0000000000..87cd97bd85
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/record_send_test.erl
@@ -0,0 +1,32 @@
+%%-------------------------------------------------------------------
+%% File : record_send_test.erl
+%% Author : Kostis Sagonas <[email protected]>
+%% Description : A test inspired by a post of Mkcael Remond to the
+%% Erlang mailing list suggesting thst Dialyzer should
+%% be reporting sends to records rather than to pids.
+%% Dialyzer v1.3.0 indeed reports one of the dicrepancies
+%% (the one with the 4-tuple) but not the one where the
+%% message is sent to a pair which is a record.
+%% This should be fixed.
+%%
+%% Created : 10 Apr 2005 by Kostis Sagonas <[email protected]>
+%%-------------------------------------------------------------------
+-module(record_send_test).
+
+-export([t/0]).
+
+-record(rec1, {a=a, b=b, c=c}).
+-record(rec2, {a}).
+
+t() ->
+ t(#rec1{}).
+
+t(Rec1 = #rec1{b=B}) ->
+ Rec2 = some_mod:some_function(),
+ if
+ is_record(Rec2, rec2) ->
+ Rec2 ! hello; %% currently this one is not found
+ true ->
+ Rec1 ! hello_again
+ end,
+ B.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/record_test.erl b/lib/dialyzer/test/small_SUITE_data/src/record_test.erl
new file mode 100644
index 0000000000..48a00b172e
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/record_test.erl
@@ -0,0 +1,22 @@
+%%%-------------------------------------------------------------------
+%%% File : record_test.erl
+%%% Author : Tobias Lindahl <[email protected]>
+%%% Description :
+%%%
+%%% Created : 22 Oct 2004 by Tobias Lindahl <[email protected]>
+%%%-------------------------------------------------------------------
+-module(record_test).
+
+-export([t/0]).
+
+-record(foo, {bar}).
+
+t() ->
+ doit(foo).
+
+doit(X) ->
+ case X of
+ #foo{} -> error1;
+ foo -> ok;
+ _ -> error2
+ end.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/recursive_types1.erl b/lib/dialyzer/test/small_SUITE_data/src/recursive_types1.erl
new file mode 100644
index 0000000000..657d11653b
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/recursive_types1.erl
@@ -0,0 +1,10 @@
+-module(recursive_types1).
+
+-export([test/0]).
+
+-type tree() :: 'nil' | {non_neg_integer(), tree(), tree()}.
+
+-spec test() -> {42, tree(), tree()}.
+
+test() ->
+ {42, {42, nil, nil}, {42, {42, nil, nil}, {42, nil, nil}}}.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/recursive_types2.erl b/lib/dialyzer/test/small_SUITE_data/src/recursive_types2.erl
new file mode 100644
index 0000000000..7985d5fb4b
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/recursive_types2.erl
@@ -0,0 +1,12 @@
+-module(recursive_types2).
+
+-export([test/0]).
+
+-type tree() :: 'nil' | {non_neg_integer(), subtree(), subtree()}.
+
+-type subtree() :: tree().
+
+-spec test() -> {42, tree(), tree()}.
+
+test() ->
+ {42, {42, nil, nil}, {42, {42, nil, nil}, {42, nil, nil}}}.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/recursive_types3.erl b/lib/dialyzer/test/small_SUITE_data/src/recursive_types3.erl
new file mode 100644
index 0000000000..997678ac92
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/recursive_types3.erl
@@ -0,0 +1,15 @@
+-module(recursive_types3).
+
+-export([test/1]).
+
+-record(tree, {node :: atom(),
+ kid = nil :: 'nil' | tree()}).
+
+-type tree() :: #tree{}.
+
+-spec test(tree()) -> tree().
+
+test(Tree) ->
+ case Tree of
+ #tree{node = root, kid=#tree{}} -> Tree
+ end.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/recursive_types4.erl b/lib/dialyzer/test/small_SUITE_data/src/recursive_types4.erl
new file mode 100644
index 0000000000..f6b5f87e04
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/recursive_types4.erl
@@ -0,0 +1,13 @@
+-module(recursive_types4).
+
+-export([test/0]).
+
+-record(tree, {node :: atom(),
+ kid = nil :: 'nil' | tree()}).
+
+-type tree() :: #tree{}.
+
+-spec test() -> tree().
+
+test() ->
+ #tree{node = root, kid = #tree{}}.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/recursive_types5.erl b/lib/dialyzer/test/small_SUITE_data/src/recursive_types5.erl
new file mode 100644
index 0000000000..cd1cd5ede9
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/recursive_types5.erl
@@ -0,0 +1,13 @@
+-module(recursive_types5).
+
+-export([test/0]).
+
+-type tree() :: 'nil' | {non_neg_integer(), tree(), tree()}.
+
+-record(tree, {node :: atom(),
+ kid = 'nil' :: tree()}).
+
+-spec test() -> #tree{}.
+
+test() ->
+ #tree{node = root, kid = {42, {42, nil, nil}, {42, nil, nil}}}.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/recursive_types6.erl b/lib/dialyzer/test/small_SUITE_data/src/recursive_types6.erl
new file mode 100644
index 0000000000..ff61976736
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/recursive_types6.erl
@@ -0,0 +1,17 @@
+-module(recursive_types6).
+
+-export([test/0]).
+
+-record(tree, {node :: non_neg_integer(),
+ kid = nil :: child()}).
+
+-type tree() :: #tree{}.
+
+-record(child, {tree :: 'nil' | tree()}).
+
+-type child() :: #child{}.
+
+-spec test() -> tree().
+
+test() ->
+ #tree{node = 42, kid = #child{tree = #tree{node = 42, kid = #child{tree = nil}}}}.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/recursive_types7.erl b/lib/dialyzer/test/small_SUITE_data/src/recursive_types7.erl
new file mode 100644
index 0000000000..92106e9694
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/recursive_types7.erl
@@ -0,0 +1,13 @@
+-module(recursive_types7).
+
+-export([test/0]).
+
+-type tree() :: 'nil' | {non_neg_integer(), recursive_types7:tree(),
+ recursive_types7:tree()}.
+
+-export_type([tree/0]).
+
+-spec test() -> {42, tree(), tree()}.
+
+test() ->
+ {42, {42, nil, nil}, {42, {42, nil, nil}, {42, nil, nil}}}.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/refine_bug1.erl b/lib/dialyzer/test/small_SUITE_data/src/refine_bug1.erl
new file mode 100644
index 0000000000..1b299e782a
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/refine_bug1.erl
@@ -0,0 +1,11 @@
+-module(refine_bug1).
+-export([f/1]).
+
+f(gazonk = X) ->
+ foo(X), % this call is currently not considered when refining foo's
+ throw(error); % type since it appears in a clause that throws an exception
+f(foo = X) ->
+ foo(X).
+
+foo(X) ->
+ X.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/refine_failing.erl b/lib/dialyzer/test/small_SUITE_data/src/refine_failing.erl
new file mode 100644
index 0000000000..243f4806e6
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/refine_failing.erl
@@ -0,0 +1,26 @@
+%% This testcase shows why it's a bad idea to block refinement (by forwarding
+%% any() to all arguments) when a failing call is encountered. The initial
+%% success typing for update_one allows anything to be an element of the list in
+%% the second argument. This will be refined during dataflow by the result from
+%% add_counters to just a list of tuples. This will cause the call in the second
+%% clause of update_one to fail correctly and identify the discrepancy. It could
+%% be a better idea to refuse to add the failing calls but this may lead to a
+%% ton of unused functions,
+%%
+%% by Stavros Aronis<[email protected]>
+
+-module(refine_failing).
+
+-export([foo/2]).
+
+foo(A, B) -> update_all(add_counters(A, []), B).
+
+add_counters( [], Acc) -> Acc;
+add_counters([H|T], Acc) -> add_counters(T, [{H, 0}|Acc]).
+
+update_all(Ds, []) -> Ds;
+update_all(Ds, [F|Fs]) -> update_all(update_one(F, Ds, []), Fs).
+
+update_one(_F, [], Acc) -> Acc;
+update_one( F, [{F, Cr},Ds], Acc) -> update_one(F, Ds, [{F,Cr+1}|Acc]);
+update_one( F, [ D|Ds], Acc) -> update_one(F, Ds, [ D|Acc]).
diff --git a/lib/dialyzer/test/small_SUITE_data/src/toth.erl b/lib/dialyzer/test/small_SUITE_data/src/toth.erl
new file mode 100644
index 0000000000..bae22be4f1
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/toth.erl
@@ -0,0 +1,99 @@
+-module(toth).
+-export([sys_table_view/1]).
+
+%%% Constants
+-define(sysTabETS,1).
+-define(sysTabMnesia,2).
+-define(sysTabBoth,3).
+
+sys_table_view([CpId,{match,Pattern},TableType, ViewType]) ->
+ AllTableList =
+ case TableType of
+ ?sysTabMnesia ->
+ lists:sort(mnesia:system_info(tables));
+ ?sysTabBoth ->
+ lists:sort(rpc:call(CpId,ets,all,[]));
+ ?sysTabETS ->
+ lists:sort(rpc:call(CpId,ets,all,[]) --
+ mnesia:system_info(tables));
+ _ -> %%% Happens at registration only
+ [ok]
+ end,
+ %% Filter the matching table names, skip unnamed tables first:
+ NamedTableList = lists:filter(fun (X) -> is_atom(X) end, AllTableList),
+ TablesShown =
+ case Pattern of
+ "" ->
+ NamedTableList;
+ _ ->
+ %% Filter the ones whose name begins with the Pattern:
+ Filter = fun(T) ->
+ lists:prefix(Pattern, atom_to_list(T))
+ end,
+ lists:filter(Filter, NamedTableList)
+ end,
+
+ Fields = [{text, [{value,"CpId: " ++ atom_to_list(CpId)}]},
+ {text, [{value,"TabSpec=" ++ Pattern},
+ {value_format, term}]},
+ {text, [{value,"Table type: " ++ formatTableType(TableType)},
+ {value_format, term}]}],
+
+ Template = [[{type, index},
+ {link, {?MODULE, sys_table_browse,
+ [{"CpId",CpId},{"TableType",TableType},
+ {"View", ViewType},
+ {"FirstKey",1}, {"KeyPattern",""}]}}],
+
+ [{type, data},
+ {title, "Table name"},
+ {display_value, {erlang, atom_to_list}}], %%% else crash
+
+ [{type,data},
+ {title, "No of rows"},
+ {display_value, term}],
+
+ [{type,data},
+ {title, "Memory"},
+ {display_value, term}]
+ ],
+
+ TableAttr = [{rows, [[T,T|tableSize(T,TableType,CpId)] ||
+ T <- TablesShown]},
+ {template,Template}],
+
+ Page = [{header, {"Filter tables", "Selected tables"}},
+ {buttons, [reload, back]},
+ {layout, [{form, Fields},
+ {table, TableAttr}]}
+ ],
+ Page.
+
+%%--------------------------------------------------------------------
+%% tableSize/3
+%% @spec tableSize(T::atom(),TableType::integer(),CpId::atom()) ->
+%% list(integer())
+%% @doc Return the table size and memory size of the table.
+%% @end
+%%---------------------------------------------------------------------
+
+tableSize(T, TableType, CpId) ->
+ case TableType of
+ ?sysTabETS ->
+ [rpc:call(CpId, ets, info, [T, size]),
+ rpc:call(CpId, ets, info, [T, memory])];
+ ?sysTabMnesia ->
+ [mnesia:table_info(T, size),mnesia:table_info(T, memory)];
+ _ -> %%% Registration
+ [0,0]
+ end.
+
+formatTableType(T) ->
+ case T of
+ ?sysTabETS ->
+ "ETS";
+ ?sysTabMnesia ->
+ "mnesia";
+ _ -> %%% Registration !
+ "ETS + mnesia"
+ end.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/trec.erl b/lib/dialyzer/test/small_SUITE_data/src/trec.erl
new file mode 100644
index 0000000000..ba50c3b401
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/trec.erl
@@ -0,0 +1,37 @@
+%%
+%% The current treatment of typed records leaves much to be desired.
+%% These are not made up examples; I have cases like that the branch
+%% of the HiPE compiler with types in records. I get very confusing
+%% warnings which require a lot of effort to find their cause and why
+%% a function has no local return.
+%%
+-module(trec).
+-export([test/0, mk_foo_exp/2]).
+
+-record(foo, {a :: integer(), b :: [atom()]}).
+
+%%
+%% For these functions we currently get the following warnings:
+%% 1. Function test/0 has no local return
+%% 2. The call trec:mk_foo_loc(42,any()) will fail since it differs
+%% in argument position 1 from the success typing arguments:
+%% ('undefined',atom())
+%% 3. Function mk_foo_loc/2 has no local return
+%%
+%% Arguably, the second warning is not what most users have in mind
+%% when they wrote the type declarations in the 'foo' record, so no
+%% doubt they'll find it confusing. But note that it is also inconsistent!
+%% How come there is a success typing for a function that has no local return?
+%%
+test() ->
+ mk_foo_loc(42, bar:f()).
+
+mk_foo_loc(A, B) ->
+ #foo{a = A, b = [A,B]}.
+
+%%
+%% For this function we currently get "has no local return" but we get
+%% no reason; I want us to get a reason.
+%%
+mk_foo_exp(A, B) when is_integer(A) ->
+ #foo{a = A, b = [A,B]}.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/try1.erl b/lib/dialyzer/test/small_SUITE_data/src/try1.erl
new file mode 100644
index 0000000000..05963a16af
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/try1.erl
@@ -0,0 +1,26 @@
+%%%-------------------------------------------------------------------
+%%% File : try1.erl
+%%% Author : <[email protected]>
+%%% Description :
+%%%
+%%% Created : 23 Aug 2005 by <[email protected]>
+%%%-------------------------------------------------------------------
+-module(try1).
+
+-export([t/1]).
+
+t(X) ->
+ case wierd_is_bool(X) of
+ true -> ok;
+ false -> ok
+ end.
+
+wierd_is_bool(X) ->
+ try bool(X) of
+ Y -> Y
+ catch
+ _:_ -> false
+ end.
+
+bool(true) -> true;
+bool(false) -> true.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/tuple1.erl b/lib/dialyzer/test/small_SUITE_data/src/tuple1.erl
new file mode 100644
index 0000000000..d608275efe
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/tuple1.erl
@@ -0,0 +1,29 @@
+%%%-------------------------------------------------------------------
+%%% File : tuple1.erl
+%%% Author : Tobias Lindahl <[email protected]>
+%%% Description : Exposed two bugs in the analysis;
+%%% one supressed warning and one crash.
+%%%
+%%% Created : 13 Nov 2006 by Tobias Lindahl <[email protected]>
+%%%-------------------------------------------------------------------
+-module(tuple1).
+
+-export([t1/2, t2/2, t3/2, bar/2]).
+
+t1(List = [_|_], X) ->
+ lists:mapfoldl(fun foo/2, X, List).
+
+t2(List = [_|_], X) ->
+ lists:mapfoldl(fun bar/2, X, List).
+
+t3(List = [_|_], X) ->
+ lists:mapfoldl(fun baz/1, X, List).
+
+
+foo(1, 1) -> a;
+foo(a, 1) -> b.
+
+bar(1, 1) -> {b, b};
+bar(a, 1) -> {a, a}.
+
+baz(1) -> 1.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/tuple_set_crash.erl b/lib/dialyzer/test/small_SUITE_data/src/tuple_set_crash.erl
new file mode 100644
index 0000000000..5503f39412
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/tuple_set_crash.erl
@@ -0,0 +1,207 @@
+%% ====================================================================
+%% Program which resulted in an erl_types crash due to incomplete
+%% handling of tuple_sets in function inf_tuples_in_sets/4.
+%% Reported by Alexey Romanov on 10/10/2010 and fixed 16/10/2010.
+%% Stavros Aronis provided a better fix of the issue on 8/11/2010.
+%% ====================================================================
+
+-module(tuple_set_crash).
+-export([test/5]).
+
+%% ====================================================================
+
+-define(PREPEND_IF_BIT_SET(BitMap, Bit,
+ PatternInBinary, PatternInList,
+ OldRestVar, NewRestVar,
+ OldAccVar, NewAccVar),
+ case byteset:contains(Bit, BitMap) of
+ true ->
+ <<PatternInBinary, NewRestVar/binary>> = OldRestVar,
+ NewAccVar = [PatternInList | OldAccVar];
+ false ->
+ NewRestVar = OldRestVar,
+ NewAccVar = OldAccVar
+ end).
+
+%% ====================================================================
+
+%% Types used in parsing binaries
+-define(BITMAP1, 8/integer-big-unsigned).
+-define(BYTE, 8/integer-little-unsigned).
+-define(WORD, 16/integer-little-unsigned).
+-define(DWORD, 32/integer-little-unsigned).
+-define(DATE, 16/integer-little-signed).
+-define(TIME, 32/float-little-unsigned).
+-define(TINY_STRING_M(Var, Size), Size:?BYTE, Var:Size/binary).
+-define(SMALL_STRING_M(Var, Size), Size:?WORD, Var:Size/binary).
+
+-type config_change() ::
+ {device_properties |
+ video_target |
+ audio_target |
+ video_device |
+ audio_device |
+ video_output |
+ audio_output, [{atom(), any()}]}.
+
+-type message_from_server() ::
+ ok |
+ {error, atom()} |
+ config_change() |
+ {media_item_url_reply, integer(), binary()}.
+
+%% ====================================================================
+
+-spec test(integer(), [integer()], binary(), binary(), binary()) -> {binary(), binary()}.
+test(_TargetId, [], _Key, IVT, IVF) ->
+ {IVT, IVF};
+test(TargetId, [Date | DateTail], Key, IVT, IVF) ->
+ PlayListRequest = play_list_request(TargetId, Date),
+ {ok, Reply, IVT1, IVF1} = culprit(PlayListRequest, Key, IVT, IVF),
+ case Reply of
+ {play_list, _Playlist} ->
+ test(TargetId, DateTail, Key, IVT1, IVF1);
+ {error, 16#11} ->
+ {IVT1, IVF1} %% we can finish early
+ end.
+
+-spec culprit(binary(), binary(), binary(), binary()) ->
+ {ok, message_from_server(), binary(), binary()}.
+culprit(Message, Key, IVecToServer, IVecFromServer) ->
+ {Packet, NewIVecToServer} = message_to_packet(Message, Key, IVecToServer),
+ Message = crypto:aes_cbc_128_decrypt(Key, IVecFromServer, Packet),
+ NewIVecFromServer = crypto:aes_cbc_ivec(Packet),
+ ParsedMessage = parse_message(Message),
+ {ok, ParsedMessage, NewIVecToServer, NewIVecFromServer}.
+
+%% ====================================================================
+
+-spec play_list_request(integer(), integer()) -> binary().
+play_list_request(TargetId, Date) ->
+ <<16#06:?WORD, TargetId:?DWORD, Date:?DATE>>.
+
+-spec parse_message(binary()) -> message_from_server().
+parse_message(<<MessageID:?WORD, Rest/binary>>) ->
+ case MessageID of
+ 16#00 -> parse_error_code(Rest);
+ 16#22 -> {device_properties, parse_device_properties(Rest)};
+ 16#24 -> {video_target_info, parse_video_target_info(Rest)};
+ 16#25 -> {audio_target_info, parse_audio_target_info(Rest)};
+ 16#26 -> {video_device_info, parse_av_device_info(Rest)};
+ 16#27 -> {audio_device_info, parse_av_device_info(Rest)};
+ 16#28 -> {video_output_info, parse_video_output_info(Rest)};
+ 16#29 -> {audio_output_info, parse_audio_output_info(Rest)}
+ end.
+
+-spec parse_error_code(binary()) -> ok | {error, integer()}.
+parse_error_code(<<ErrorCode:?BYTE, _Padding/binary>>) ->
+ case ErrorCode of
+ 0 -> ok;
+ _ -> {error, ErrorCode}
+ end.
+
+-spec parse_device_properties(binary()) -> config_change().
+parse_device_properties(<<BitMap:?BITMAP1, Rest/binary>>) ->
+ Acc0 = [],
+ ?PREPEND_IF_BIT_SET(BitMap, 0,
+ FwVersion:3/binary, {fw_version, FwVersion},
+ Rest, Rest1, Acc0, Acc1),
+ ?PREPEND_IF_BIT_SET(BitMap, 1,
+ ?TINY_STRING_M(ControllerName, _S1),
+ {controller_name, ControllerName},
+ Rest1, Rest2, Acc1, Acc2),
+ ?PREPEND_IF_BIT_SET(BitMap, 2,
+ ?SMALL_STRING_M(ControllerDescription, _S2),
+ {controller_description, ControllerDescription},
+ Rest2, Rest3, Acc2, Acc3),
+ ?PREPEND_IF_BIT_SET(BitMap, 3,
+ ControllerStatus:?BYTE,
+ {controller_status, ControllerStatus},
+ Rest3, _Padding, Acc3, Acc4),
+ Acc4.
+
+-spec parse_video_target_info(binary()) -> config_change().
+parse_video_target_info(<<TargetId:?DWORD, Status:?BYTE, _Padding/binary>>) ->
+ [{target_id, TargetId}, {status, Status}].
+
+-spec parse_audio_target_info(binary()) -> [config_change()].
+parse_audio_target_info(<<TargetId:?DWORD, BitMap:?BITMAP1, Rest/binary>>) ->
+ Acc0 = [{target_id, TargetId}],
+ ?PREPEND_IF_BIT_SET(BitMap, 0,
+ Status:?BYTE, {status, Status},
+ Rest, Rest1, Acc0, Acc1),
+ ?PREPEND_IF_BIT_SET(BitMap, 1,
+ MasterVolume:?WORD, {master_volume, MasterVolume},
+ Rest1, _Padding, Acc1, Acc2),
+ Acc2.
+
+-spec parse_av_device_info(binary()) -> [config_change()].
+parse_av_device_info(<<DeviceId:?DWORD, BitMap:?BITMAP1, Rest/binary>>) ->
+ Acc0 = [{device_id, DeviceId}],
+ ?PREPEND_IF_BIT_SET(BitMap, 0,
+ TargetId:?DWORD, {target_id, TargetId},
+ Rest, Rest1, Acc0, Acc1),
+ ?PREPEND_IF_BIT_SET(BitMap, 1,
+ ?TINY_STRING_M(Model, _S1), {model, Model},
+ Rest1, Rest2, Acc1, Acc2),
+ ?PREPEND_IF_BIT_SET(BitMap, 2,
+ Address:?BYTE, {address, Address},
+ Rest2, Rest3, Acc2, Acc3),
+ ?PREPEND_IF_BIT_SET(BitMap, 3,
+ Status:?BYTE, {status, Status},
+ Rest3, _Padding, Acc3, Acc4),
+ Acc4.
+
+-spec parse_video_output_info(binary()) -> [config_change()].
+parse_video_output_info(<<Output:?DWORD, BitMap:?BITMAP1, Rest/binary>>) ->
+ Acc0 = [{output_id, Output}],
+ ?PREPEND_IF_BIT_SET(BitMap, 0,
+ DeviceId:?DWORD, {device_id, DeviceId},
+ Rest, Rest1, Acc0, Acc1),
+ ?PREPEND_IF_BIT_SET(BitMap, 1,
+ ?TINY_STRING_M(DisplayType, _S1),
+ {display_type, DisplayType},
+ Rest1, Rest2, Acc1, Acc2),
+ ?PREPEND_IF_BIT_SET(BitMap, 2,
+ AudioVolume:?WORD,
+ {audio_volume, AudioVolume},
+ Rest2, _Padding, Acc2, Acc3),
+ Acc3.
+
+-spec parse_audio_output_info(binary()) -> [config_change()].
+parse_audio_output_info(<<Output:?DWORD, BitMap:?BITMAP1, Rest/binary>>) ->
+ Acc0 = [{output_id, Output}],
+ ?PREPEND_IF_BIT_SET(BitMap, 0,
+ DeviceId:?DWORD, {device_id, DeviceId},
+ Rest, Rest1, Acc0, Acc1),
+ ?PREPEND_IF_BIT_SET(BitMap, 1,
+ AudioVolume:?WORD, {audio_volume, AudioVolume},
+ Rest1, Rest2, Acc1, Acc2),
+ ?PREPEND_IF_BIT_SET(BitMap, 2,
+ Delay:?WORD, {delay, Delay},
+ Rest2, _Padding, Acc2, Acc3),
+ Acc3.
+
+-spec message_to_packet(binary(), binary(), binary()) -> {binary(), binary()}.
+message_to_packet(Message, Key, IVec) ->
+ PaddedMessage = pad_pkcs5(Message),
+ Packet = crypto:aes_cbc_128_encrypt(Key, IVec, PaddedMessage),
+ TotalSize = byte_size(Packet),
+ NewIVec = crypto:aes_cbc_ivec(Packet),
+ {<<TotalSize:?WORD, Packet/binary>>, NewIVec}.
+
+-spec pad_pkcs5(binary()) -> binary().
+pad_pkcs5(Message) ->
+ Size = byte_size(Message),
+ PaddingSize = case Size rem 16 of
+ 0 -> 0;
+ Rem -> 16 - Rem
+ end,
+ pad_pkcs5(Message, PaddingSize, PaddingSize).
+
+-spec pad_pkcs5(binary(), integer(), integer()) -> binary().
+pad_pkcs5(Message, _PaddingSize, 0) ->
+ Message;
+pad_pkcs5(Message, PaddingSize, PaddingSizeRemaining) ->
+ pad_pkcs5(<<Message/binary, PaddingSize:?BYTE>>,
+ PaddingSize, PaddingSizeRemaining - 1).
diff --git a/lib/dialyzer/test/small_SUITE_data/src/unsafe_beamcode_bug.erl b/lib/dialyzer/test/small_SUITE_data/src/unsafe_beamcode_bug.erl
new file mode 100644
index 0000000000..071b4a53c1
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/unsafe_beamcode_bug.erl
@@ -0,0 +1,14 @@
+-module(unsafe_beamcode_bug).
+-export([test/1]).
+
+test(N) -> i(r(N)).
+
+%% this function cannot be exported, or the error does not occur
+i({one}) -> ok1;
+i({two, _}) -> ok2;
+i({three, {_,R}, _}) -> R.
+
+r(1) -> {one};
+r(2) -> {two, 2};
+r(42)-> {dummy, 42}; % without this clause, no problem ... hmm
+r(3) -> {three, {rec,ok3}, 2}.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/unused_cases.erl b/lib/dialyzer/test/small_SUITE_data/src/unused_cases.erl
new file mode 100644
index 0000000000..e6e6693963
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/unused_cases.erl
@@ -0,0 +1,41 @@
+%%-------------------------------------------------------------------
+%% File : unused_cases.erl
+%% Author : Kostis Sagonas <[email protected]>
+%% Description : Tests that Dialyzer warns whenever it finds unused
+%% case clauses -- even those that are catch all.
+%%
+%% Created : 21 Jan 2007 by Kostis Sagonas <[email protected]>
+%%-------------------------------------------------------------------
+
+-module(unused_cases).
+-export([test/0]).
+
+test() -> % dummy function to avoid exporting stuff
+ ok = unreachable_catchall(42),
+ ok = unreachable_middle(42),
+ ok = unreachable_final(42).
+
+unreachable_catchall(X) ->
+ case mk_pair(X) of
+ {_,_} -> ok;
+ OTHER -> {unreachable_catchall, OTHER}
+ end.
+
+unreachable_middle(X) ->
+ case is_positive(X) of
+ true -> ok;
+ weird -> {unreachable_middle, weird};
+ false -> ok
+ end.
+
+unreachable_final(X) ->
+ case is_positive(X) of
+ true -> ok;
+ false -> ok;
+ OTHER-> {unreachable_final, OTHER}
+ end.
+
+mk_pair(X) -> {X, X}.
+
+is_positive(X) when is_integer(X), X > 0 -> true;
+is_positive(X) when is_integer(X) -> false.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/unused_clauses.erl b/lib/dialyzer/test/small_SUITE_data/src/unused_clauses.erl
new file mode 100644
index 0000000000..a98b227a6b
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/unused_clauses.erl
@@ -0,0 +1,18 @@
+%%-------------------------------------------------------------------
+%% File : unused_clauses.erl
+%% Author : Kostis Sagonas <[email protected]>
+%% Description : Tests that Dialyzer warns when it finds an unused
+%% clause.
+%%
+%% Created : 16 Mar 2006 by Kostis Sagonas <[email protected]>
+%%-------------------------------------------------------------------
+
+-module(unused_clauses).
+-export([test/0]).
+
+test() -> {t(atom), t({42})}.
+
+t(X) when is_atom(X) -> X;
+t(X) when is_integer(X) -> X;
+t(X) when is_tuple(X) -> element(1, X);
+t(X) when is_binary(X) -> X.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/zero_tuple.erl b/lib/dialyzer/test/small_SUITE_data/src/zero_tuple.erl
new file mode 100644
index 0000000000..7c790e5658
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/zero_tuple.erl
@@ -0,0 +1,12 @@
+-module(zero_tuple).
+-export([t1/0, t2/0]).
+
+t1() ->
+ {} = a(),
+ ok.
+
+t2() ->
+ b = a(),
+ ok.
+
+a() -> a.
diff --git a/lib/dialyzer/test/user_SUITE_data/dialyzer_options b/lib/dialyzer/test/user_SUITE_data/dialyzer_options
new file mode 100644
index 0000000000..513ed7752b
--- /dev/null
+++ b/lib/dialyzer/test/user_SUITE_data/dialyzer_options
@@ -0,0 +1,2 @@
+{dialyzer_options, []}.
+{time_limit, 3}. \ No newline at end of file
diff --git a/lib/dialyzer/test/user_SUITE_data/results/broken_dialyzer b/lib/dialyzer/test/user_SUITE_data/results/broken_dialyzer
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/user_SUITE_data/results/broken_dialyzer
diff --git a/lib/dialyzer/test/user_SUITE_data/results/gcpFlowControl b/lib/dialyzer/test/user_SUITE_data/results/gcpFlowControl
new file mode 100644
index 0000000000..7938c53fc6
--- /dev/null
+++ b/lib/dialyzer/test/user_SUITE_data/results/gcpFlowControl
@@ -0,0 +1,2 @@
+
+gcpFlowControl.erl:171: The pattern <Key, 'errors', X> can never match the type <_,'available' | 'bucket' | 'rejectable' | 'rejects' | 'window',0 | 1 | 20>
diff --git a/lib/dialyzer/test/user_SUITE_data/results/qlc_error b/lib/dialyzer/test/user_SUITE_data/results/qlc_error
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/dialyzer/test/user_SUITE_data/results/qlc_error
diff --git a/lib/dialyzer/test/user_SUITE_data/results/spvcOrig b/lib/dialyzer/test/user_SUITE_data/results/spvcOrig
new file mode 100644
index 0000000000..8c57358af0
--- /dev/null
+++ b/lib/dialyzer/test/user_SUITE_data/results/spvcOrig
@@ -0,0 +1,193 @@
+
+spvcOrig.erl:1238: Guard test is_record(Spvc::[] | #spvcObj{},'spvcVcc',25) can never succeed
+spvcOrig.erl:1241: Guard test is_record(Spvc::[] | #spvcObj{},'spvcVpc',20) can never succeed
+spvcOrig.erl:1244: Guard test is_record(Spvc::[] | #spvcObj{},'spvcVpcPerm',12) can never succeed
+spvcOrig.erl:1247: Guard test is_record(Spvc::[] | #spvcObj{},'spvcVccPerm',17) can never succeed
+spvcOrig.erl:1250: Guard test is_record(Spvc::[] | #spvcObj{},'spvcTargetVc',6) can never succeed
+spvcOrig.erl:1253: Guard test is_record(Spvc::[] | #spvcObj{},'spvcTargetVp',6) can never succeed
+spvcOrig.erl:1256: Guard test is_record(Spvc::[] | #spvcObj{},'pchVc',32) can never succeed
+spvcOrig.erl:1259: Guard test is_record(Spvc::[] | #spvcObj{},'pchVp',33) can never succeed
+spvcOrig.erl:1262: Guard test is_record(Spvc::[] | #spvcObj{},'spvcFr',21) can never succeed
+spvcOrig.erl:1265: Guard test is_record(Spvc::[] | #spvcObj{},'spvcFrPerm',6) can never succeed
+spvcOrig.erl:1268: The pattern {If_Value, _, _, _} can never match the type [] | #spvcObj{}
+spvcOrig.erl:1270: The pattern {If_Value, _, _} can never match the type [] | #spvcObj{}
+spvcOrig.erl:1272: The pattern {If_Value, _} can never match the type [] | #spvcObj{}
+spvcOrig.erl:1274: The pattern [If_Value | _] can never match the type [] | #spvcObj{}
+spvcOrig.erl:1380: The variable _ can never match since previous clauses completely covered the type any()
+spvcOrig.erl:1389: The variable _ can never match since previous clauses completely covered the type any()
+spvcOrig.erl:1576: Guard test is_record(Row::[any(),...],'spvcObj',24) can never succeed
+spvcOrig.erl:1583: Guard test is_record(Row::[any(),...],'spvcVcc',25) can never succeed
+spvcOrig.erl:1586: Guard test is_record(Row::[any(),...],'spvcVpc',20) can never succeed
+spvcOrig.erl:1589: Guard test is_record(Row::[any(),...],'spvcVpcPerm',12) can never succeed
+spvcOrig.erl:1592: Guard test is_record(Row::[any(),...],'spvcVccPerm',17) can never succeed
+spvcOrig.erl:1595: Guard test is_record(Row::[any(),...],'spvcTargetVc',6) can never succeed
+spvcOrig.erl:1598: Guard test is_record(Row::[any(),...],'spvcTargetVp',6) can never succeed
+spvcOrig.erl:1601: Guard test is_record(Row::[any(),...],'pchVc',32) can never succeed
+spvcOrig.erl:1604: Guard test is_record(Row::[any(),...],'pchVp',33) can never succeed
+spvcOrig.erl:1607: Guard test is_record(Row::[any(),...],'spvcFr',21) can never succeed
+spvcOrig.erl:1610: Guard test is_record(Row::[any(),...],'spvcFrPerm',6) can never succeed
+spvcOrig.erl:1613: The pattern {If_Value, _, _, _} can never match the type [any(),...]
+spvcOrig.erl:1615: The pattern {If_Value, _, _} can never match the type [any(),...]
+spvcOrig.erl:1617: The pattern {If_Value, _} can never match the type [any(),...]
+spvcOrig.erl:1621: The variable _ can never match since previous clauses completely covered the type [any(),...]
+spvcOrig.erl:1731: The pattern [_, _, _, _] can never match the type tuple()
+spvcOrig.erl:1733: The pattern [_, _, _] can never match the type tuple()
+spvcOrig.erl:1735: The pattern [_, _] can never match the type tuple()
+spvcOrig.erl:264: The pattern {If_Value, Vpi_Value} can never match the type {_,_,_}
+spvcOrig.erl:271: Guard test is_integer(Vci_Value::'no_vc') can never succeed
+spvcOrig.erl:275: The pattern {If_Value, Vpi_Value} can never match the type {_,_,'no_vc'}
+spvcOrig.erl:305: The pattern {'spvcVcc', 'targetAddress'} can never match the type {'spvcFr','rowStatus'} | {'spvcVcc','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:307: The pattern {'spvcVcc', 'selectType'} can never match the type {'spvcFr','rowStatus'} | {'spvcVcc','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:309: The pattern {'spvcVcc', 'targetVpi'} can never match the type {'spvcFr','rowStatus'} | {'spvcVcc','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:311: The pattern {'spvcVcc', 'targetVci'} can never match the type {'spvcFr','rowStatus'} | {'spvcVcc','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:313: The pattern {'spvcVcc', 'releaseCause'} can never match the type {'spvcFr','rowStatus'} | {'spvcVcc','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:315: The pattern {'spvcVcc', 'releaseDiagnostic'} can never match the type {'spvcFr','rowStatus'} | {'spvcVcc','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:317: The pattern {'spvcVcc', 'retryInterval'} can never match the type {'spvcFr','rowStatus'} | {'spvcVcc','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:319: The pattern {'spvcVcc', 'retryTimer'} can never match the type {'spvcFr','rowStatus'} | {'spvcVcc','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:321: The pattern {'spvcVcc', 'retryThreshold'} can never match the type {'spvcFr','rowStatus'} | {'spvcVcc','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:323: The pattern {'spvcVcc', 'retryFailures'} can never match the type {'spvcFr','rowStatus'} | {'spvcVcc','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:325: The pattern {'spvcVcc', 'retryLimit'} can never match the type {'spvcFr','rowStatus'} | {'spvcVcc','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:329: The pattern {'spvcVcc', 'restart'} can never match the type {'spvcFr','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:331: The pattern {'spvcVcc', 'targetSelectType_any'} can never match the type {'spvcFr','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:333: The pattern {'spvcVcc', 'targetSelectType_required'} can never match the type {'spvcFr','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:335: The pattern {'spvcVpc', 'targetAddress'} can never match the type {'spvcFr','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:337: The pattern {'spvcVpc', 'selectType'} can never match the type {'spvcFr','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:339: The pattern {'spvcVpc', 'targetVpi'} can never match the type {'spvcFr','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:341: The pattern {'spvcVpc', 'releaseCause'} can never match the type {'spvcFr','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:343: The pattern {'spvcVpc', 'releaseDiagnostic'} can never match the type {'spvcFr','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:345: The pattern {'spvcVpc', 'retryInterval'} can never match the type {'spvcFr','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:347: The pattern {'spvcVpc', 'retryTimer'} can never match the type {'spvcFr','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:349: The pattern {'spvcVpc', 'retryThreshold'} can never match the type {'spvcFr','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:351: The pattern {'spvcVpc', 'retryFailures'} can never match the type {'spvcFr','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:353: The pattern {'spvcVpc', 'retryLimit'} can never match the type {'spvcFr','rowStatus'} | {'spvcVpc','rowStatus'}
+spvcOrig.erl:357: The pattern {'spvcVpc', 'restart'} can never match the type {'spvcFr','rowStatus'}
+spvcOrig.erl:359: The pattern {'spvcVpc', 'targetSelectType_any'} can never match the type {'spvcFr','rowStatus'}
+spvcOrig.erl:361: The pattern {'spvcVpc', 'targetSelectType_required'} can never match the type {'spvcFr','rowStatus'}
+spvcOrig.erl:363: The pattern {'spvcFr', 'targetAddress'} can never match the type {'spvcFr','rowStatus'}
+spvcOrig.erl:365: The pattern {'spvcFr', 'selectType'} can never match the type {'spvcFr','rowStatus'}
+spvcOrig.erl:367: The pattern {'spvcFr', 'identifier'} can never match the type {'spvcFr','rowStatus'}
+spvcOrig.erl:369: The pattern {'spvcFr', 'targetVpi'} can never match the type {'spvcFr','rowStatus'}
+spvcOrig.erl:371: The pattern {'spvcFr', 'targetVci'} can never match the type {'spvcFr','rowStatus'}
+spvcOrig.erl:373: The pattern {'spvcFr', 'translation'} can never match the type {'spvcFr','rowStatus'}
+spvcOrig.erl:375: The pattern {'spvcFr', 'releaseCause'} can never match the type {'spvcFr','rowStatus'}
+spvcOrig.erl:377: The pattern {'spvcFr', 'releaseDiagnostic'} can never match the type {'spvcFr','rowStatus'}
+spvcOrig.erl:379: The pattern {'spvcFr', 'operStatus'} can never match the type {'spvcFr','rowStatus'}
+spvcOrig.erl:381: The pattern {'spvcFr', 'adminStatus'} can never match the type {'spvcFr','rowStatus'}
+spvcOrig.erl:383: The pattern {'spvcFr', 'restart'} can never match the type {'spvcFr','rowStatus'}
+spvcOrig.erl:385: The pattern {'spvcFr', 'retryInterval'} can never match the type {'spvcFr','rowStatus'}
+spvcOrig.erl:387: The pattern {'spvcFr', 'retryTimer'} can never match the type {'spvcFr','rowStatus'}
+spvcOrig.erl:389: The pattern {'spvcFr', 'retryThreshold'} can never match the type {'spvcFr','rowStatus'}
+spvcOrig.erl:391: The pattern {'spvcFr', 'retryFailures'} can never match the type {'spvcFr','rowStatus'}
+spvcOrig.erl:393: The pattern {'spvcFr', 'retryLimit'} can never match the type {'spvcFr','rowStatus'}
+spvcOrig.erl:395: The pattern {'spvcFr', 'lastChange'} can never match the type {'spvcFr','rowStatus'}
+spvcOrig.erl:404: Guard test is_record(Row::[any(),...],'spvcObj',24) can never succeed
+spvcOrig.erl:411: Guard test is_record(Row::[any(),...],'spvcVcc',25) can never succeed
+spvcOrig.erl:414: Guard test is_record(Row::[any(),...],'spvcVpc',20) can never succeed
+spvcOrig.erl:417: Guard test is_record(Row::[any(),...],'spvcVpcPerm',12) can never succeed
+spvcOrig.erl:420: Guard test is_record(Row::[any(),...],'spvcVccPerm',17) can never succeed
+spvcOrig.erl:423: Guard test is_record(Row::[any(),...],'spvcTargetVc',6) can never succeed
+spvcOrig.erl:426: Guard test is_record(Row::[any(),...],'spvcTargetVp',6) can never succeed
+spvcOrig.erl:429: Guard test is_record(Row::[any(),...],'pchVc',32) can never succeed
+spvcOrig.erl:432: Guard test is_record(Row::[any(),...],'pchVp',33) can never succeed
+spvcOrig.erl:435: Guard test is_record(Row::[any(),...],'spvcFr',21) can never succeed
+spvcOrig.erl:438: Guard test is_record(Row::[any(),...],'spvcFrPerm',6) can never succeed
+spvcOrig.erl:441: The pattern {If_Value, _, _, _} can never match the type [any(),...]
+spvcOrig.erl:443: The pattern {If_Value, _, _} can never match the type [any(),...]
+spvcOrig.erl:445: The pattern {If_Value, _} can never match the type [any(),...]
+spvcOrig.erl:449: The variable _ can never match since previous clauses completely covered the type [any(),...]
+spvcOrig.erl:468: Guard test is_record(Row::[any(),...],'spvcObj',24) can never succeed
+spvcOrig.erl:475: Guard test is_record(Row::[any(),...],'spvcVcc',25) can never succeed
+spvcOrig.erl:478: Guard test is_record(Row::[any(),...],'spvcVpc',20) can never succeed
+spvcOrig.erl:481: Guard test is_record(Row::[any(),...],'spvcVpcPerm',12) can never succeed
+spvcOrig.erl:484: Guard test is_record(Row::[any(),...],'spvcVccPerm',17) can never succeed
+spvcOrig.erl:487: Guard test is_record(Row::[any(),...],'spvcTargetVc',6) can never succeed
+spvcOrig.erl:490: Guard test is_record(Row::[any(),...],'spvcTargetVp',6) can never succeed
+spvcOrig.erl:493: Guard test is_record(Row::[any(),...],'pchVc',32) can never succeed
+spvcOrig.erl:496: Guard test is_record(Row::[any(),...],'pchVp',33) can never succeed
+spvcOrig.erl:499: Guard test is_record(Row::[any(),...],'spvcFr',21) can never succeed
+spvcOrig.erl:502: Guard test is_record(Row::[any(),...],'spvcFrPerm',6) can never succeed
+spvcOrig.erl:505: The pattern {If_Value, _, _, _} can never match the type [any(),...]
+spvcOrig.erl:507: The pattern {If_Value, _, _} can never match the type [any(),...]
+spvcOrig.erl:509: The pattern {If_Value, _} can never match the type [any(),...]
+spvcOrig.erl:513: The variable _ can never match since previous clauses completely covered the type [any(),...]
+spvcOrig.erl:546: The pattern {_, _, _, _} can never match the type [any(),...]
+spvcOrig.erl:548: The pattern {_, _, _} can never match the type [any(),...]
+spvcOrig.erl:550: The pattern {_, _} can never match the type [any(),...]
+spvcOrig.erl:559: The pattern {'spvcVcc', 'targetAddress'} can never match the type {'spvcFr','restart'} | {'spvcVcc','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:561: The pattern {'spvcVcc', 'selectType'} can never match the type {'spvcFr','restart'} | {'spvcVcc','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:563: The pattern {'spvcVcc', 'targetVpi'} can never match the type {'spvcFr','restart'} | {'spvcVcc','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:565: The pattern {'spvcVcc', 'targetVci'} can never match the type {'spvcFr','restart'} | {'spvcVcc','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:567: The pattern {'spvcVcc', 'releaseCause'} can never match the type {'spvcFr','restart'} | {'spvcVcc','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:569: The pattern {'spvcVcc', 'releaseDiagnostic'} can never match the type {'spvcFr','restart'} | {'spvcVcc','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:571: The pattern {'spvcVcc', 'retryInterval'} can never match the type {'spvcFr','restart'} | {'spvcVcc','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:573: The pattern {'spvcVcc', 'retryTimer'} can never match the type {'spvcFr','restart'} | {'spvcVcc','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:575: The pattern {'spvcVcc', 'retryThreshold'} can never match the type {'spvcFr','restart'} | {'spvcVcc','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:577: The pattern {'spvcVcc', 'retryFailures'} can never match the type {'spvcFr','restart'} | {'spvcVcc','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:579: The pattern {'spvcVcc', 'retryLimit'} can never match the type {'spvcFr','restart'} | {'spvcVcc','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:581: The pattern {'spvcVcc', 'rowStatus'} can never match the type {'spvcFr','restart'} | {'spvcVcc','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:585: The pattern {'spvcVcc', 'targetSelectType_any'} can never match the type {'spvcFr','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:587: The pattern {'spvcVcc', 'targetSelectType_required'} can never match the type {'spvcFr','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:589: The pattern {'spvcVpc', 'targetAddress'} can never match the type {'spvcFr','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:591: The pattern {'spvcVpc', 'selectType'} can never match the type {'spvcFr','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:593: The pattern {'spvcVpc', 'targetVpi'} can never match the type {'spvcFr','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:595: The pattern {'spvcVpc', 'releaseCause'} can never match the type {'spvcFr','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:597: The pattern {'spvcVpc', 'releaseDiagnostic'} can never match the type {'spvcFr','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:599: The pattern {'spvcVpc', 'retryInterval'} can never match the type {'spvcFr','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:601: The pattern {'spvcVpc', 'retryTimer'} can never match the type {'spvcFr','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:603: The pattern {'spvcVpc', 'retryThreshold'} can never match the type {'spvcFr','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:605: The pattern {'spvcVpc', 'retryFailures'} can never match the type {'spvcFr','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:607: The pattern {'spvcVpc', 'retryLimit'} can never match the type {'spvcFr','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:609: The pattern {'spvcVpc', 'rowStatus'} can never match the type {'spvcFr','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:613: The pattern {'spvcVpc', 'targetSelectType_any'} can never match the type {'spvcFr','restart'}
+spvcOrig.erl:615: The pattern {'spvcVpc', 'targetSelectType_required'} can never match the type {'spvcFr','restart'}
+spvcOrig.erl:617: The pattern {'spvcFr', 'targetAddress'} can never match the type {'spvcFr','restart'}
+spvcOrig.erl:619: The pattern {'spvcFr', 'selectType'} can never match the type {'spvcFr','restart'}
+spvcOrig.erl:621: The pattern {'spvcFr', 'identifier'} can never match the type {'spvcFr','restart'}
+spvcOrig.erl:623: The pattern {'spvcFr', 'targetVpi'} can never match the type {'spvcFr','restart'}
+spvcOrig.erl:625: The pattern {'spvcFr', 'targetVci'} can never match the type {'spvcFr','restart'}
+spvcOrig.erl:627: The pattern {'spvcFr', 'translation'} can never match the type {'spvcFr','restart'}
+spvcOrig.erl:629: The pattern {'spvcFr', 'releaseCause'} can never match the type {'spvcFr','restart'}
+spvcOrig.erl:631: The pattern {'spvcFr', 'releaseDiagnostic'} can never match the type {'spvcFr','restart'}
+spvcOrig.erl:633: The pattern {'spvcFr', 'operStatus'} can never match the type {'spvcFr','restart'}
+spvcOrig.erl:635: The pattern {'spvcFr', 'adminStatus'} can never match the type {'spvcFr','restart'}
+spvcOrig.erl:639: The pattern {'spvcFr', 'retryInterval'} can never match the type {'spvcFr','restart'} | {'spvcVcc','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:641: The pattern {'spvcFr', 'retryTimer'} can never match the type {'spvcFr','restart'} | {'spvcVcc','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:643: The pattern {'spvcFr', 'retryThreshold'} can never match the type {'spvcFr','restart'} | {'spvcVcc','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:645: The pattern {'spvcFr', 'retryFailures'} can never match the type {'spvcFr','restart'} | {'spvcVcc','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:647: The pattern {'spvcFr', 'retryLimit'} can never match the type {'spvcFr','restart'} | {'spvcVcc','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:649: The pattern {'spvcFr', 'lastChange'} can never match the type {'spvcFr','restart'} | {'spvcVcc','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:651: The pattern {'spvcFr', 'rowStatus'} can never match the type {'spvcFr','restart'} | {'spvcVcc','restart'} | {'spvcVpc','restart'}
+spvcOrig.erl:730: Guard test is_record(Spvc::[] | #spvcObj{},'spvcVcc',25) can never succeed
+spvcOrig.erl:733: Guard test is_record(Spvc::[] | #spvcObj{},'spvcVpc',20) can never succeed
+spvcOrig.erl:736: Guard test is_record(Spvc::[] | #spvcObj{},'spvcVpcPerm',12) can never succeed
+spvcOrig.erl:739: Guard test is_record(Spvc::[] | #spvcObj{},'spvcVccPerm',17) can never succeed
+spvcOrig.erl:742: Guard test is_record(Spvc::[] | #spvcObj{},'spvcTargetVc',6) can never succeed
+spvcOrig.erl:745: Guard test is_record(Spvc::[] | #spvcObj{},'spvcTargetVp',6) can never succeed
+spvcOrig.erl:748: Guard test is_record(Spvc::[] | #spvcObj{},'pchVc',32) can never succeed
+spvcOrig.erl:751: Guard test is_record(Spvc::[] | #spvcObj{},'pchVp',33) can never succeed
+spvcOrig.erl:754: Guard test is_record(Spvc::[] | #spvcObj{},'spvcFr',21) can never succeed
+spvcOrig.erl:757: Guard test is_record(Spvc::[] | #spvcObj{},'spvcFrPerm',6) can never succeed
+spvcOrig.erl:760: The pattern {If_Value, _, _, _} can never match the type [] | #spvcObj{}
+spvcOrig.erl:762: The pattern {If_Value, _, _} can never match the type [] | #spvcObj{}
+spvcOrig.erl:764: The pattern {If_Value, _} can never match the type [] | #spvcObj{}
+spvcOrig.erl:766: The pattern [If_Value | _] can never match the type [] | #spvcObj{}
+spvcOrig.erl:802: Guard test is_record(Spvc::[] | #spvcObj{},'spvcVcc',25) can never succeed
+spvcOrig.erl:805: Guard test is_record(Spvc::[] | #spvcObj{},'spvcVpc',20) can never succeed
+spvcOrig.erl:808: Guard test is_record(Spvc::[] | #spvcObj{},'spvcVpcPerm',12) can never succeed
+spvcOrig.erl:811: Guard test is_record(Spvc::[] | #spvcObj{},'spvcVccPerm',17) can never succeed
+spvcOrig.erl:814: Guard test is_record(Spvc::[] | #spvcObj{},'spvcTargetVc',6) can never succeed
+spvcOrig.erl:817: Guard test is_record(Spvc::[] | #spvcObj{},'spvcTargetVp',6) can never succeed
+spvcOrig.erl:820: Guard test is_record(Spvc::[] | #spvcObj{},'pchVc',32) can never succeed
+spvcOrig.erl:823: Guard test is_record(Spvc::[] | #spvcObj{},'pchVp',33) can never succeed
+spvcOrig.erl:826: Guard test is_record(Spvc::[] | #spvcObj{},'spvcFr',21) can never succeed
+spvcOrig.erl:829: Guard test is_record(Spvc::[] | #spvcObj{},'spvcFrPerm',6) can never succeed
+spvcOrig.erl:832: The pattern {If_Value, _, _, _} can never match the type [] | #spvcObj{}
+spvcOrig.erl:834: The pattern {If_Value, _, _} can never match the type [] | #spvcObj{}
+spvcOrig.erl:836: The pattern {If_Value, _} can never match the type [] | #spvcObj{}
+spvcOrig.erl:838: The pattern [If_Value | _] can never match the type [] | #spvcObj{}
+spvcOrig.erl:951: The pattern [IfIndex_Value, Vpi_Value, Vci_Value, _] can never match the type tuple()
+spvcOrig.erl:953: The pattern [IfIndex_Value, Vpi_Value, _] can never match the type tuple()
+spvcOrig.erl:974: The pattern [IfIndex_Value, Vpi_Value, Vci_Value, _] can never match the type tuple()
+spvcOrig.erl:976: The pattern [IfIndex_Value, Vpi_Value, _] can never match the type tuple()
+spvcOrig.erl:996: The pattern [IfIndex_Value, Vpi_Value, Vci_Value, _] can never match the type tuple()
+spvcOrig.erl:998: The pattern [IfIndex_Value, Vpi_Value, _] can never match the type tuple()
diff --git a/lib/dialyzer/test/user_SUITE_data/results/wsp_pdu b/lib/dialyzer/test/user_SUITE_data/results/wsp_pdu
new file mode 100644
index 0000000000..a47b1f1f2c
--- /dev/null
+++ b/lib/dialyzer/test/user_SUITE_data/results/wsp_pdu
@@ -0,0 +1,25 @@
+
+wsp_pdu.erl:1063: The pattern [H | Hs] can never match the type []
+wsp_pdu.erl:1162: The call wsp_pdu:parse_push_flag(Value::[any()]) will never return since it differs in the 1st argument from the success typing arguments: (integer())
+wsp_pdu.erl:2400: Function decode_retry_after/2 has no local return
+wsp_pdu.erl:2403: The call wsp_pdu:d_date(Data1::binary()) will never return since it differs in the 1st argument from the success typing arguments: (integer() | {'short',binary()})
+wsp_pdu.erl:2406: Guard test is_integer(Sec::{[byte()] | byte() | {'long',binary()} | {'short',binary()},binary()}) can never succeed
+wsp_pdu.erl:2408: The pattern {'short', Data2} can never match the type {[byte()] | byte() | {'long',binary()} | {'short',binary()},binary()}
+wsp_pdu.erl:2755: Function parse_push_flag/1 has no local return
+wsp_pdu.erl:2756: The call erlang:integer_to_list(Value::[any()]) will never return since it differs in the 1st argument from the success typing arguments: (integer())
+wsp_pdu.erl:2875: The call wsp_pdu:d_text_string(Data::byte()) will never return since it differs in the 1st argument from the success typing arguments: (binary())
+wsp_pdu.erl:2976: The call wsp_pdu:d_q_value(QData::byte()) will never return since it differs in the 1st argument from the success typing arguments: (<<_:8,_:_*8>>)
+wsp_pdu.erl:3336: The call wsp_pdu:encode_typed_field(Ver::any(),'Q-value',ParamValue::any()) will never return since it differs in the 2nd argument from the success typing arguments: (any(),'Constrained-encoding' | 'Date-value' | 'No-value' | 'Short-integer' | 'Text-string' | 'Text-value' | 'Well-known-charset',any())
+wsp_pdu.erl:3342: The call wsp_pdu:encode_typed_field(Ver::any(),'Ver-value',ParamValue::any()) will never return since it differs in the 2nd argument from the success typing arguments: (any(),'Constrained-encoding' | 'Date-value' | 'No-value' | 'Short-integer' | 'Text-string' | 'Text-value' | 'Well-known-charset',any())
+wsp_pdu.erl:3349: The call wsp_pdu:encode_typed_field(Ver::any(),'Integer-value',ParamValue::any()) will never return since it differs in the 2nd argument from the success typing arguments: (any(),'Constrained-encoding' | 'Date-value' | 'No-value' | 'Short-integer' | 'Text-string' | 'Text-value' | 'Well-known-charset',any())
+wsp_pdu.erl:3367: The call wsp_pdu:encode_typed_field(Ver::any(),'Field-name',ParamValue::any()) will never return since it differs in the 2nd argument from the success typing arguments: (any(),'Constrained-encoding' | 'Date-value' | 'No-value' | 'Short-integer' | 'Text-string' | 'Text-value' | 'Well-known-charset',any())
+wsp_pdu.erl:3405: The call wsp_pdu:encode_typed_field(Ver::any(),'Delta-seconds-value',ParamValue::any()) will never return since it differs in the 2nd argument from the success typing arguments: (any(),'Constrained-encoding' | 'Date-value' | 'No-value' | 'Short-integer' | 'Text-string' | 'Text-value' | 'Well-known-charset',any())
+wsp_pdu.erl:3437: The call wsp_pdu:encode_typed_field(Ver::any(),'Integer-value',ParamValue::any()) will never return since it differs in the 2nd argument from the success typing arguments: (any(),'Constrained-encoding' | 'Date-value' | 'No-value' | 'Short-integer' | 'Text-string' | 'Text-value' | 'Well-known-charset',any())
+wsp_pdu.erl:3455: The call wsp_pdu:decode_typed_field('Version-value',Data::binary(),Version::any()) will never return since it differs in the 1st argument from the success typing arguments: ('Constrained-encoding' | 'Date-value' | 'Delta-seconds-value' | 'Field-name' | 'No-value' | 'Q-value' | 'Short-integer' | 'Text-string' | 'Text-value' | 'Well-known-charset',binary(),any())
+wsp_pdu.erl:3459: The call wsp_pdu:decode_typed_field('Integer-value',Data::binary(),Version::any()) will never return since it differs in the 1st argument from the success typing arguments: ('Constrained-encoding' | 'Date-value' | 'Delta-seconds-value' | 'Field-name' | 'No-value' | 'Q-value' | 'Short-integer' | 'Text-string' | 'Text-value' | 'Well-known-charset',binary(),any())
+wsp_pdu.erl:3531: The call wsp_pdu:decode_typed_field('Integer-value',Data::binary(),Version::any()) will never return since it differs in the 1st argument from the success typing arguments: ('Constrained-encoding' | 'Date-value' | 'Delta-seconds-value' | 'Field-name' | 'No-value' | 'Q-value' | 'Short-integer' | 'Text-string' | 'Text-value' | 'Well-known-charset',binary(),any())
+wsp_pdu.erl:3593: The pattern 'Delta-Seconds-value' can never match the type 'Delta-seconds-value' | 'Field-name' | 'Integer-value' | 'No-value' | 'Q-value' | 'Ver-value'
+wsp_pdu.erl:4844: The call wsp_pdu:d_long('data') will never return since it differs in the 1st argument from the success typing arguments: (binary())
+wsp_pdu.erl:510: The variable _ can never match since previous clauses completely covered the type 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
+wsp_pdu.erl:512: The variable _ can never match since previous clauses completely covered the type 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
+wsp_pdu.erl:5265: Call to missing or unexported function inet:ip_to_bytes/1
diff --git a/lib/dialyzer/test/user_SUITE_data/src/broken_dialyzer.erl b/lib/dialyzer/test/user_SUITE_data/src/broken_dialyzer.erl
new file mode 100644
index 0000000000..1e0612a345
--- /dev/null
+++ b/lib/dialyzer/test/user_SUITE_data/src/broken_dialyzer.erl
@@ -0,0 +1,130 @@
+-module(broken_dialyzer).
+
+-export([do_move_next/1]).
+
+-define(ap_indices, 512).
+-define(dp_indices, 504).
+
+
+-record(apR,{a,c=[],n=[],nc=0,nn=0,nl=[]}).
+-define(apL(L), [#apR{a=A} || A <- L]).
+
+-define(gr, get(my_return_value)).
+-define(pr(PR), put(my_return_value, PR)).
+-record(bit,{i,c,n,s}). % index, current, next, state
+
+
+do_move_next({BL,AL}) ->
+ Max = max(length(BL), length(AL)),
+ Max2 = max(length(BL)*2, length(AL)),
+ MoveTo = [A || A <- AL, A#apR.nn < Max, A#apR.nn+A#apR.nc < Max2],
+ MoveFrom = [A || A <- AL,
+ (A#apR.nn > Max) orelse (A#apR.nn+A#apR.nc > Max2)],
+ Unchanged = (AL--MoveTo)--MoveFrom,
+ {BL1,{AL1,{AL2,AL3}}} =
+ lists:mapfoldl(
+ fun(B=#bit{i=I,c=C,s=S,n=Next}, {From,{To,FilledUp}})
+ when S==ok;S==lost_replica;S==moved_replica ->
+ case lists:keysearch(Next,#apR.a,From) of
+ {value, F=#apR{n=N1,nn=NN1,nc=NC1}}
+ when (NN1>Max) or (NN1+NC1>Max2) ->
+ case C of
+ [] ->
+ {B, {From,{To,FilledUp}}};
+ ShortList ->
+ T=#apR{a=NewNext,n=N2,nn=NN2} =
+ find_next(Next,ShortList),
+ {value, {C,NL_from}} =
+ lists:keysearch(C,1,F#apR.nl),
+ {value, {C,NL_to}} =
+ lists:keysearch(C,1,T#apR.nl),
+ NewNL_from = lists:keyreplace(
+ C,1,F#apR.nl,{C,NL_from--[I]}),
+ NewNL_to = lists:keyreplace(
+ C,1,T#apR.nl,{C,[I|NL_to]}),
+
+ NewT = T#apR{n=[I|N2],nn=NN2+1,
+ nl=NewNL_to},
+
+ {B#bit{n=NewNext,
+ s = if
+ S == lost_replica ->
+ lost_replica;
+ true ->
+ moved_replica
+ end},
+ {lists:keyreplace(
+ Next,#apR.a,From,
+ F#apR{n=N1--[I],nn=NN1-1,nl=NewNL_from}),
+ if
+ (NewT#apR.nn+NewT#apR.nc >= Max2)
+ or (NewT#apR.nn >= Max) ->
+ {lists:keydelete(NewNext,#apR.a,To),
+ [NewT|FilledUp]};
+ true ->
+ {lists:keyreplace(
+ NewNext,#apR.a,To,NewT),
+ FilledUp}
+ end}}
+ end;
+ _ ->
+ {B, {From,{To,FilledUp}}}
+ end;
+ (B, A) ->
+ {B, A}
+ end, {MoveFrom,{MoveTo,[]}},BL),
+ {BL1,Unchanged++AL1++AL2++AL3}.
+
+%%% -----------------------------------------------------------------
+%%% find_next/2
+%%%
+%%% ------------------------------------------------------------------
+
+find_next(Ap,L) ->
+ hd(catch
+ lists:foreach(
+ fun(SelVal) ->
+ case [ApR ||
+ ApR <- L,
+ begin
+ {value,{Ap,NL}} =
+ lists:keysearch(Ap,1,ApR#apR.nl),
+ length(NL) =< SelVal
+ end] of
+ [] ->
+ ok;
+ ShortList ->
+ throw(ShortList)
+ end
+ end,
+ lists:seq(0,?ap_indices))).
+
+%%% -----------------------------------------------------------------
+%%% max/2
+%%%
+%%% Calculates max number of indices per AP, given number of indices
+%%% and number of APs.
+%%% -----------------------------------------------------------------
+max(F,S) ->
+ (F div S) + if
+ (F rem S) == 0 ->
+ 0;
+ true ->
+ 1
+ end.
+
+%%% ==============================================================
+%%% ADMINISTRATIVE INFORMATION
+%%% ==============================================================
+%%% #Copyright (C) 2005
+%%% by ERICSSON TELECOM AB
+%%% S - 125 26 STOCKHOLM
+%%% SWEDEN, tel int + 46 8 719 0000
+%%%
+%%% The program may be used and/or copied only with the written
+%%% permission from ERICSSON TELECOM AB, or in accordance with
+%%% the terms and conditions stipulated in the agreement/contract
+%%% under which the program has been supplied.
+%%%
+%%% All rights reserved
+%%%
diff --git a/lib/dialyzer/test/user_SUITE_data/src/gcp.hrl b/lib/dialyzer/test/user_SUITE_data/src/gcp.hrl
new file mode 100644
index 0000000000..0b0f1246b5
--- /dev/null
+++ b/lib/dialyzer/test/user_SUITE_data/src/gcp.hrl
@@ -0,0 +1,166 @@
+%%% #0. BASIC INFORMATION
+%%% ----------------------------------------------------------
+%%% %CCaseFile: gcp.hrl %
+%%% Author: EAB/UPD/AV
+%%% Description: Internal include file.
+%%% ----------------------------------------------------------
+-hrl_id('9/190 55-CNA 113 033 Ux').
+-hrl_vsn('/main/R1A/21').
+-hrl_date('2005-05-31').
+-hrl_author('uabasve').
+%%% %CCaseTemplateFile: module.hrl %
+%%% %CCaseTemplateId: 17/002 01-FEA 202 714 Ux, Rev: /main/4 %
+%%%
+%%% Copyright (C) 2000-2005 by Ericsson Telecom AB
+%%% SE-126 25 STOCKHOLM
+%%% SWEDEN, tel int + 46 8 719 0000
+%%%
+%%% The program may be used and/or copied only with the written
+%%% permission from Ericsson Telecom AB, or in accordance with
+%%% the terms and conditions stipulated in the agreement/contract
+%%% under which the program has been supplied.
+%%%
+%%% All rights reserved
+%%%
+%%% ----------------------------------------------------------
+%%% #1. REVISION LOG
+%%% ----------------------------------------------------------
+%%% Rev Date Name What
+%%% ----- ------- -------- ------------------------
+%%% R1A/1 05-02-07 uabasve Copied from EAS R7A/9
+%%% R1A/2 05-02-08 ejojmjn Removed SAAL
+%%% R1A/3- 05-03-18 uabasve Clean.
+%%% ----------------------------------------------------------
+%%%
+%%% #2. CODE
+%%% #---------------------------------------------------------
+%%% #2.1 DEFINITION OF CONSTANTS
+%%% #---------------------------------------------------------
+
+%% Keys into gcpVariables for various options/values.
+-define(TRAFFIC_DESCRIPTOR_KEY, traffic_descriptor).
+
+%% H.248 version at link creation.
+-define(INITIAL_H248_VERSION, 1).
+
+%% Exceptions for use within a module. ?MODULE is just extra protection
+%% against catching something unexpected.
+-define(THROW(Reason), throw({error, ?MODULE, ?LINE, Reason})).
+-define(CATCH(Expr), try Expr
+ catch throw: ?FAILURE(Reason) -> {error, Reason}
+ end).
+-define(FAILURE(T), {error, ?MODULE, _, T}).
+
+%% The SendHandle used by a GCP transport process must be a tuple
+%% of length >= 2 whose first two elements are the pid of the
+%% transport process and index (aka #gcpLinkTable.key) of the link
+%% upon which incoming data has arrived.
+-define(SH_PID(SendHandle), element(1, SendHandle)).
+-define(SH_LINK(SendHandle), element(2, SendHandle)).
+-define(SH_SET_PID(SendHandle, Pid), setelement(1, SendHandle, Pid)).
+
+%% Megaco process that CH and OM servers monitor. This needs to be
+%% replaced by a documented method.
+-define(MEGACO_APP, megaco_config).
+
+%% The message that gcpI:send_reply sends to the process that's waiting
+%% for an action reply.
+-define(ACTION_REPLY_MESSAGE(ActionReplies, Result),
+ {reply, ActionReplies, Result}).
+
+%%% #---------------------------------------------------------
+%%% #2.2 DEFINITION OF RECORDS
+%%% #---------------------------------------------------------
+
+-record(mg, {pref}).
+-record(mgc, {mgid}).
+
+%% User configuration that gets mapped into megaco user info by
+%% gcpLib:make_user_info/1. GCP exposes only a subset of what's
+%% possible to set in megaco.
+-record(user_config,
+ {reply_timer = 30000, %% ms to wait for reply ack
+ %% Incoming transactions:
+ pending_timer = 10000, %% ms until outgoing transaction pending
+ sent_pending_limit = 5, %% nr of outgoing pendings before 506
+ %% Outgoing transactions:
+ recv_pending_limit = infinity,%% nr of incoming pendings before fail
+ request_timer = 3000, %% ms to wait for response before resend
+ request_retries = 5, %% nr unanswered sends before fail
+ long_request_timer = 15000, %% ms to wait for reply after pending
+ long_request_retries = 5}). %% nr of pendings/timeouts before fail
+
+%% Record passed into transport implementations at transport start.
+%% Expected to be passed back to gcpTransportI.
+-record(receive_handle,
+ {megaco_receive_handle, %% passed to megaco:receive_message
+ receive_message}). %% gcpLinkTable.receive_message
+
+%%% ---------------------------------------------------------------------------
+%%% # gcpRegistrationTable
+%%%
+%%% Record containing defined MGC's/MG's (aka megaco users).
+%%% ---------------------------------------------------------------------------
+
+-record(gcpRegistrationTable,
+ {key, %% user reference (aka MG/MGC id)
+ role, %% mg | mgc
+ mid, %% H.248 mid of the MGC/MG
+ version, %% of H.248
+ callback, %% {Module, ExtraArgs}
+ config = #user_config{}}).
+
+%%% ----------------------------------------------------------
+%%% # gcpLinkTable
+%%% ----------------------------------------------------------
+
+-record(gcpLinkTable,
+ {key, %% link reference
+ endpoint, %% #mgc{} | #mg{}
+ user, %% registration table key
+ chid, %% call handler of transport
+ admin_state, %% up | down
+ op_state, %% up | down | pending | disabled
+ restart = auto, %% auto | user
+ encoding_mod, %% module implementing megaco_encoder
+ encoding_config, %% as passed to encoding_mod
+ transport_start, %% {M,F,ExtraArgs} for transport start
+ transport_data, %% arbitrary, passed to transport_mod
+ send_message, %% {default|sysrpc|transport|module, Module}
+ receive_message, %% local | {M,F,ExtraArgs} for decode node
+ tried = false, %% Only for links owned by a MG.
+ %% Used to indicate that a setup attempt
+ %% has been performed on this link.
+ t95_period = 350000}).
+
+%%% ----------------------------------------------------------
+%%% # gcpActiveLinkTable
+%%% ----------------------------------------------------------
+
+-record(gcpActiveLinkTable,
+ {key, %% {mg|mgc, MgId}
+ link, %% link reference
+ chid, %% CH the link is tied to
+ node, %% node the link is on
+ conn_handle, %% record megaco_conn_handle
+ send_handle, %% {TransportPid, LinkIdx, ...}
+ version = ?INITIAL_H248_VERSION}).
+
+%%% ----------------------------------------------------------
+%%% # gcpVariables
+%%% ----------------------------------------------------------
+
+-record(gcpVariables,
+ {key,
+ value}).
+
+%%% ----------------------------------------------------------
+%%% # gcpReplyData
+%%% ----------------------------------------------------------
+
+-record(gcpReplyData,
+ {callback, %% {Module, Args}
+ mgid,
+ user_data, %% As passed by the user on send
+ prio,
+ timestamp}).
diff --git a/lib/dialyzer/test/user_SUITE_data/src/gcpFlowControl.erl b/lib/dialyzer/test/user_SUITE_data/src/gcpFlowControl.erl
new file mode 100644
index 0000000000..8598efb5d1
--- /dev/null
+++ b/lib/dialyzer/test/user_SUITE_data/src/gcpFlowControl.erl
@@ -0,0 +1,397 @@
+%%%-------------------------------------------------------------------
+%%% File : gcpFlowControl.erl
+%%% Author : EAB/UPD/AV
+%%% Description : Implements overload protection.
+%%%-------------------------------------------------------------------
+-module(gcpFlowControl).
+-id('24/190 55-CNA 113 033 Ux').
+-vsn('/main/R1A/14').
+-date('2005-05-04').
+-author('uabasve').
+%%% ----------------------------------------------------------
+%%% %CCaseTemplateFile: module.erl %
+%%% %CCaseTemplateId: 16/002 01-FEA 202 714 Ux, Rev: /main/4 %
+%%%
+%%% Copyright (C) 2001-2005 by Ericsson Telecom AB
+%%% SE-126 25 STOCKHOLM
+%%% SWEDEN, tel int + 46 8 719 0000
+%%%
+%%% The program may be used and/or copied only with the written
+%%% permission from Ericsson Telecom AB, or in accordance with
+%%% the terms and conditions stipulated in the agreement/contract
+%%% under which the program has been supplied.
+%%%
+%%% All rights reserved
+%%%
+%%%
+%%% ----------------------------------------------------------
+%%% #1. REVISION LOG
+%%% ----------------------------------------------------------
+%%% Rev Date Name What
+%%% -------- -------- -------- ------------------------
+%%% R1A/1-2 05-02-07 ejojmjn Copied from EAS R7A/11.
+%%% R1A/3-14 05-03-14 uabasve Clean.
+%%%--------------------------------------------------------------------
+
+-include_lib("megaco/include/megaco.hrl").
+-include_lib("megaco/include/megaco_message_v1.hrl").
+-include("gcp.hrl").
+
+-export([send_request/4, %% user send from gcpInterface
+ receive_reply/2, %% from callback in gcpTransaction
+ init_ets_tables/1,
+ init_data/2]).
+
+-define(PRIO_INFINITY, 16).
+-define(MIN_WINDOW, 10).
+-define(MAX_WINDOW, 100).
+
+-define(BUCKET_MAX, 100).
+-define(BUCKET_THRESH_HIGH, 80).
+-define(BUCKET_THRESH_LOW, 20).
+
+-define(ALLOW_TIMEOUT, 1000).
+
+%% Holds counters for flow control in GCP
+-record(gcpFlowControlTable,
+ {key,
+ window = 50,
+ available = 50,
+ bucket = 0,
+ q = 0,
+ sent = 0, %% Counts all attempts
+ rejectable = 0, %% Counts rejectable attempts
+ t95,
+ errors = 0,
+ rejects = 0,
+ replies = 0}).
+
+-record(gcpFlowControlBitmap,
+ {key,
+ count = 0}).
+
+%%====================================================================
+%% External functions
+%%====================================================================
+
+%%--------------------------------------------------------------------
+%% Function: send_request/4
+%%
+%% Output: ok | {error, Reason}
+%%--------------------------------------------------------------------
+
+send_request(ActiveLink, TimerOptions, ActionRequests, UserData) ->
+ #gcpActiveLinkTable{key = Key,
+ conn_handle = ConnHandle}
+ = ActiveLink,
+ Prio = prio(ActionRequests),
+ incr(Key, sent),
+ case allow(Key, Prio) of
+ {true, Timestamp} ->
+ grant_request(user_data(ConnHandle),
+ Key,
+ Prio,
+ Timestamp,
+ ConnHandle,
+ TimerOptions,
+ ActionRequests,
+ UserData);
+ false ->
+ {error, rejected}
+ end.
+
+%%--------------------------------------------------------------------
+%% Function: receive_reply/2
+%% Description:
+%%--------------------------------------------------------------------
+
+receive_reply(Key, Timestamp) ->
+ incr(Key, available),
+ incr(Key, replies),
+ release(Key),
+ report_time(Key, Timestamp).
+
+%%--------------------------------------------------------------------
+%% Func: init_ets_tables/1
+%%
+%% Returns: ok
+%%--------------------------------------------------------------------
+
+init_ets_tables(Role) ->
+ create_ets(Role, gcpFlowControlTable, #gcpFlowControlTable.key),
+ create_ets(Role, gcpFlowControlBitmap, #gcpFlowControlBitmap.key),
+ ok.
+
+create_ets(Role, Table, Pos) when integer(Pos) ->
+ create_ets(Role,
+ Table,
+ [named_table, ordered_set, public, {keypos, Pos}]);
+
+create_ets(test, Table, ArgList) ->
+ ets:new(Table, ArgList);
+create_ets(Role, Table, ArgList) ->
+ case ets:info(Table) of
+ undefined ->
+ sysCmd:ets_new(Table, ArgList);
+ _ when Role == ch ->
+ sysCmd:inherit_tables([Table]);
+ _ when Role == om ->
+ ok
+ end.
+
+%%--------------------------------------------------------------------
+%% Func: init_data/2
+%%--------------------------------------------------------------------
+
+init_data(Key, T95) ->
+ ets:insert(gcpFlowControlTable, #gcpFlowControlTable{key = Key,
+ t95 = T95}).
+
+%%--------------------------------------------------------------------
+%%% Internal functions
+%%--------------------------------------------------------------------
+
+%%% ----------------------------------------------------------
+%%% incr
+%%% ----------------------------------------------------------
+
+cntr(Key, Field) ->
+ incr(Key, Field, 0).
+
+incr(Key, Field) ->
+ incr(Key, Field, 1).
+
+-define(INCR(Field),
+ incr(Key, Field, X) -> upd_c(Key, {#gcpFlowControlTable.Field, X})).
+
+?INCR(sent);
+?INCR(replies);
+?INCR(q);
+?INCR(t95);
+?INCR(errors);
+?INCR(rejects);
+?INCR(rejectable);
+?INCR(window);
+?INCR(available);
+
+incr(Key, bucket, X)->
+ upd_c(Key, {#gcpFlowControlTable.bucket, X, ?BUCKET_MAX, ?BUCKET_MAX}).
+
+upd_c(Key, N) ->
+ ets:update_counter(gcpFlowControlTable, Key, N).
+
+%%% ----------------------------------------------------------
+%%% decr
+%%%
+%%% Beware that decr is implemented as incr, care has to be taken
+%%% not to bungle things when max/min values are used.
+%%% ----------------------------------------------------------
+
+decr(Key, available, X) ->
+ upd_c(Key, {#gcpFlowControlTable.available, -X});
+decr(Key, window, X) ->
+ upd_c(Key, {#gcpFlowControlTable.window, -X});
+decr(Key, bucket, X) ->
+ upd_c(Key, {#gcpFlowControlTable.bucket, -X, 0, 0}).
+
+decr(Key, Field) ->
+ decr(Key, Field, 1).
+
+%%% ----------------------------------------------------------
+%%% allow
+%%% ----------------------------------------------------------
+
+allow(Key, ?PRIO_INFINITY) ->
+ decr(Key, available),
+ {true, now()};
+
+allow(Key, Prio) ->
+ incr(Key, rejectable),
+ case decr(Key, available) of
+ N when N > 0 ->
+ {true, no_stamp};
+ _ ->
+ %% We did not send it, therefore incr available again
+ incr(Key, available),
+ queue(Key, Prio)
+ end.
+
+%%% ----------------------------------------------------------
+%%% queue
+%%% ----------------------------------------------------------
+
+queue(Key, Prio) ->
+ incr(Key, q),
+ T = {Key, Prio, now(), self()},
+ ets:insert(gcpFlowControlBitmap, #gcpFlowControlBitmap{key = T}),
+ wait(T).
+
+%%% ----------------------------------------------------------
+%%% wait
+%%% ----------------------------------------------------------
+
+wait({Key, _Prio, _When, _Self} = T) ->
+ receive
+ allow ->
+ ets:delete(gcpFlowControlBitmap, T),
+ decr(Key, available),
+ {true, no_stamp}
+ after ?ALLOW_TIMEOUT ->
+ timeout(T),
+ adjust_window(Key),
+ incr(Key, rejects),
+ false
+ end.
+
+timeout(T) ->
+ case ets:update_counter(gcpFlowControlBitmap, T, 1) of
+ 1 ->
+ %% Got the lock: no one has released Key and sent 'allow'.
+ ets:delete(gcpFlowControlBitmap, T),
+ ok;
+ _ ->
+ %% A releasing process got the lock: 'allow' has been
+ %% sent. Try to remove the message before proceeding.
+ %% (This is to keep mdisp from complaining apparently.)
+ ets:delete(gcpFlowControlBitmap, T),
+ receive
+ allow ->
+ ok
+ after ?ALLOW_TIMEOUT ->
+ io:format("~p: errant allow: ~p~n", [?MODULE, T])
+ end
+ end.
+
+%% Now, if we reject and our general response time is low
+%% (i.e. low bucket) then we increase the window size.
+adjust_window(Key) ->
+ adjust_window(Key,
+ cntr(Key, bucket) < ?BUCKET_THRESH_LOW
+ andalso cntr(Key, window) < ?MAX_WINDOW).
+
+adjust_window(Key, true) ->
+ incr(Key, window),
+ incr(Key, available),
+ incr(Key, bucket, 20);
+adjust_window(_, false) ->
+ ok.
+
+%%--------------------------------------------------------------------
+%% Func: report_time/2
+%%--------------------------------------------------------------------
+
+report_time(_, no_stamp) ->
+ ok;
+report_time(Key, {MS, S, Ms})->
+ {MegaSecs, Secs, MicroSecs} = now(),
+ p(Key,
+ MicroSecs - Ms + 1000000*(Secs - S + 1000000*(MegaSecs - MS)),
+ cntr(Key, t95)).
+
+%%% ----------------------------------------------------------
+%%% p
+%%% ----------------------------------------------------------
+
+p(Key, Time, T95) when Time =< T95 ->
+ decr(Key, bucket);
+p(Key, _Time, _T95) ->
+ %% If we have a long response time, then increase the leaky
+ %% bucket. If the bucket is over the high watermark and the window
+ %% is not already at its minimum size, then decrease the window
+ %% and available.
+ case {cntr(Key, window), incr(Key, bucket, 20)} of
+ {Window, Bucket} when Window > ?MIN_WINDOW,
+ Bucket > ?BUCKET_THRESH_HIGH ->
+ decr(Key, window),
+ decr(Key, available);
+ _ ->
+ ok
+ end.
+
+%%% ----------------------------------------------------------
+%%% release
+%%% ----------------------------------------------------------
+
+release(Key) ->
+ %% The choice of the key below will cause ets:prev/2 to return
+ %% the key with the highest priority which was queued most
+ %% recently. This relies on the fact that integers sort before
+ %% atoms, the atom 'prio' in this case. The atoms 'queued' and
+ %% 'pid' are of no significance.
+ release(Key, {Key, prio, queued, pid}).
+
+%% This isn't a (FIFO) queue within each priority, but a (LIFO) stack.
+
+release(Key, T) ->
+ release(Key, cntr(Key, available), ets:prev(gcpFlowControlBitmap, T)).
+
+%% Note that only keys on the same Key are matched.
+release(Key, N, {Key, _Prio, _When, Pid} = T) when N > 0 ->
+ case catch ets:update_counter(gcpFlowControlBitmap, T, 1) of
+ 1 ->
+ Pid ! allow;
+ _ ->
+ %% Another process has released this key.
+ release(Key, T)
+ end;
+
+release(_, _, _)->
+ ok.
+
+%%% ----------------------------------------------------------
+%%% user_data
+%%% ----------------------------------------------------------
+
+user_data(ConnHandle) ->
+ case catch megaco:conn_info(ConnHandle, reply_data) of
+ {'EXIT', _Reason} ->
+ false;
+ Rec ->
+ {value, Rec}
+ end.
+
+%%% ----------------------------------------------------------
+%%% grant_request
+%%% ----------------------------------------------------------
+
+grant_request({value, Rec},
+ Key, Prio, Time,
+ ConnHandle, Options, ActionRequests, UserData) ->
+ ReplyData = Rec#gcpReplyData{user_data = UserData,
+ prio = Prio,
+ timestamp = Time},
+ cast_rc(megaco:cast(ConnHandle,
+ ActionRequests,
+ [{reply_data, ReplyData} | Options]),
+ Key,
+ ActionRequests);
+
+grant_request(false, Key, _, _, _, _, _, _) ->
+ incr(Key, available),
+ {error, reply_data}.
+
+cast_rc(ok = Ok, _, _) ->
+ Ok;
+cast_rc({error, Reason}, Key, ActionRequests) ->
+ incr(Key, available),
+ gcpLib:error_report(?MODULE, send_request, [ActionRequests],
+ "send failed",
+ Reason),
+ {error, {encode, Reason}}.
+
+%%--------------------------------------------------------------------
+%% Func: prio/1
+%% Returns: The priority of the request
+%%--------------------------------------------------------------------
+
+prio([ActionRequest | _]) ->
+ #'ActionRequest'{contextId = ContextId,
+ contextRequest = ContextRequest}
+ = ActionRequest,
+ prio(ContextId, ContextRequest).
+
+prio(?megaco_choose_context_id, #'ContextRequest'{priority = Prio})
+ when integer(Prio) ->
+ Prio;
+prio(_, _) ->
+ ?PRIO_INFINITY.
diff --git a/lib/dialyzer/test/user_SUITE_data/src/qlc_error.erl b/lib/dialyzer/test/user_SUITE_data/src/qlc_error.erl
new file mode 100644
index 0000000000..04e621dd4b
--- /dev/null
+++ b/lib/dialyzer/test/user_SUITE_data/src/qlc_error.erl
@@ -0,0 +1,15 @@
+%% -*- erlang-indent-level: 2 -*-
+%% $Id: qlc_error.erl,v 1.1 2008/12/17 09:53:52 mikpe Exp $
+
+%% @author Daniel Luna <[email protected]>
+%% @copyright 2006 Daniel Luna
+%%
+%% @doc
+%%
+
+-module(qlc_error).
+-export([fix/0]).
+-include_lib("stdlib/include/qlc.hrl").
+
+fix() ->
+ qlc:eval(qlc:q([I || I <- []])).
diff --git a/lib/dialyzer/test/user_SUITE_data/src/spvcOrig.erl b/lib/dialyzer/test/user_SUITE_data/src/spvcOrig.erl
new file mode 100644
index 0000000000..279caffdde
--- /dev/null
+++ b/lib/dialyzer/test/user_SUITE_data/src/spvcOrig.erl
@@ -0,0 +1,3520 @@
+%%%=======================================================================
+%%%
+%%% Test from Mats Cronqvist <[email protected]>. The
+%%% analysis crasched due to the handling of tuples-as-funs in
+%%% hipe_icode_type.erl, and it also exposed a bug when a control flow
+%%% path is first analyzed and then shown to be infeasible.
+%%%
+
+-file("./spvcOrig.erl", 1).
+
+-module(spvcOrig).
+
+-author(qamarma).
+
+-id('3/190 55-CNA 121 64').
+
+-vsn('/main/Inc4/R2A/R4A/R6A/R7A/R7D/R8B/R10A/R11A/2').
+
+-date('2004-10-26').
+
+-export([gen_set/3,gen_set/4,connect/3,release_comp_nu/3,release_nu/3,timeout/2,restart_spvc/1,restart_multi_spvcs/1,forced_release/1,error_handler/3,get_backoff_table/2,timeout_event/1]).
+
+-export([release_incumbent/2,switch_over/2]).
+
+-export([call_failure/1,get_backoff_table/2]).
+
+-file("/export/localhome/locmacr/wrk/axd_r11/ATS_CRA12002/SPVC_CNA12164/src/../../../inc/pchTables.hrl", 1).
+
+-hrl_id('2/190 55-CNA 121 08').
+
+-hrl_vsn('/main/Inc3/Inc4/R2A/R3A/R3B/R5A/R6A/R7A/R7D/R8B/13').
+
+-hrl_date('2003-01-24').
+
+-file("/export/localhome/locmacr/wrk/axd_r11/ATS_CRA12002/SPVC_CNA12164/src/../../../derived_hrl/mib/AXD301-PCH-MIB.hrl", 1).
+
+-file("/export/localhome/locmacr/wrk/axd_r11/ATS_CRA12002/SPVC_CNA12164/src/../../../inc/pchTables.hrl", 58).
+
+-record(pchVp, {vplEntry,
+ vplLastChange,
+ vplReceiveTrafficDescrIndex = 0,
+ vplTransmitTrafficDescrIndex = 0,
+ vplCcIdentifier,
+ vplConnId,
+ vplMpId,
+ vplLeafId,
+ vplChargingIndicator = 1,
+ vplRemoteChargingInd = 1,
+ vplChargablePartyIdentifier,
+ vplSegmentEndPoint = 2,
+ vplRowStatus,
+ vplCastType = 1,
+ vplConnKind = 1,
+ vplServiceType = 2,
+ vplEndPointData,
+ vplContinuityCheck = 1,
+ vplUpcNpcMode = 2,
+ vplPreventInbandCc = 1,
+ vplMonAisRdi = 2,
+ vpcAdminStatus = 2,
+ vplSpvcAutoTarget = 2,
+ vplSchedulingFlag = 2,
+ vplApplication,
+ vplRemoteData,
+ vpccAdminStatus = 2,
+ vplContCheckSearch = 1,
+ vplPmSearch = 1,
+ vplLastBuffFlagRead,
+ vplShapingMode = 1,
+ vplGroupShapingId}).
+
+-record(pchVpDb, {vplEntry,
+ vplLastChange,
+ vplReceiveTrafficDescrIndex = 0,
+ vplTransmitTrafficDescrIndex = 0,
+ vplCcIdentifier,
+ vplConnId,
+ vplMpId,
+ vplLeafId,
+ vplAttributes,
+ vplChargablePartyIdentifier,
+ vplRowStatus,
+ vplEndPointData,
+ vplApplication,
+ vplRemoteData,
+ vplLastBuffFlagRead,
+ vplShapingMode,
+ vplGroupShapingId}).
+
+-record(pchVpExt, {vplExtEntry,
+ vplExtReceiveTdIndex,
+ vplExtTransmitTdIndex,
+ vplExtUserName = [],
+ vplExtProviderName = [],
+ vplExtUserOperator}).
+
+-record(pchVc, {vclEntry,
+ vclLastChange,
+ vclReceiveTrafficDescrIndex = 0,
+ vclTransmitTrafficDescrIndex = 0,
+ vclCcIdentifier,
+ vclConnId,
+ vclMpId,
+ vclLeafId,
+ vclChargingIndicator = 1,
+ vclRemoteChargingInd = 1,
+ vclChargablePartyIdentifier,
+ vclPacketDiscard = 2,
+ vclSegmentEndPoint = 2,
+ vclRowStatus,
+ vclCastType = 1,
+ vclConnKind = 1,
+ vclContinuityCheck = 1,
+ vclUpcNpcMode = 2,
+ vclEndPointData,
+ vclPreventInbandCc = 1,
+ vclMonAisRdi = 2,
+ vclSpvcAutoTarget = 2,
+ vclSchedulingFlag = 2,
+ vclApplication,
+ vclRemoteData,
+ vcccAdminStatus = 2,
+ vclContCheckSearch = 1,
+ vclPmSearch = 1,
+ vclLastBuffFlagRead,
+ vclChargingIfChanid,
+ vclShapingMode = 1}).
+
+-record(pchVcDb, {vclEntry,
+ vclLastChange,
+ vclReceiveTrafficDescrIndex = 0,
+ vclTransmitTrafficDescrIndex = 0,
+ vclCcIdentifier,
+ vclConnId,
+ vclMpId,
+ vclLeafId,
+ vclAttributes,
+ vclChargablePartyIdentifier,
+ vclRowStatus,
+ vclEndPointData,
+ vclApplication,
+ vclRemoteData,
+ vclLastBuffFlagRead,
+ vclChargingIfChanid,
+ vclShapingMode}).
+
+-record(pchAtd, {tdIndex,
+ tdType,
+ tdParam1 = 0,
+ tdParam2 = 0,
+ tdParam3 = 0,
+ tdParam4 = 0,
+ tdParam5 = 0,
+ tdTrafficQoSClass = 0,
+ tdRowStatus = 1,
+ tdServiceCategory = 6,
+ tdVcCapability = 1,
+ tdName = [],
+ tdUserCounter = 0,
+ tdUser = []}).
+
+-record(pchAbr, {abrIndex,
+ abrIcr,
+ abrTbe = 16277215,
+ abrFrtt = 0,
+ abrRdf = 11,
+ abrRif = 11,
+ abrNrm = 4,
+ abrTrm = 7,
+ abrCdf = 3,
+ abrAdtf = 50,
+ abrRowStatus = 1}).
+
+-record(pchIndexNext, {key,
+ tdIndexNext,
+ vpccIndexNext,
+ vcccIndexNext,
+ scheduledVpCcIndexNext,
+ scheduledVcCcIndexNext}).
+
+-record(pchSchedVpCc, {schedVpCcIndex,
+ schedVpCcTarget,
+ schedVpCcReceiveTdIndex,
+ schedVpCcTransmitTdIndex,
+ schedVpCcOpTime,
+ schedVpCcOpInd,
+ schedVpCcOpStatus,
+ schedVpCcTimerRef,
+ schedVpCcRowStatus,
+ schedVpCcErrorCode,
+ schedVpCcUserName = [],
+ schedVpCcProviderName = []}).
+
+-record(pchVpCc, {vpccId,
+ vpccUserName = [],
+ vpccAdminStatus,
+ vpccApplication,
+ vpccProviderName = []}).
+
+-record(pchSchedVcCc, {schedVcCcIndex,
+ schedVcCcTarget,
+ schedVcCcReceiveTdIndex,
+ schedVcCcTransmitTdIndex,
+ schedVcCcOpTime,
+ schedVcCcOpInd,
+ schedVcCcOpStatus,
+ schedVcCcTimerRef,
+ schedVcCcRowStatus,
+ schedVcCcErrorCode,
+ schedVcCcUserName = [],
+ schedVcCcProviderName = []}).
+
+-record(pchVcCc, {vcccId,
+ vcccUserName = [],
+ vcccAdminStatus,
+ vcccApplication,
+ vcccProviderName = []}).
+
+-record(pchSigChannels, {et_entry,
+ cp_entry,
+ sb_cp_entry,
+ membership,
+ status,
+ sb_status,
+ application = {0,[]}}).
+
+-record(pchSigChannelExt, {et_entry,
+ user_name,
+ provider_name}).
+
+-record(pchApplication, {key,
+ application,
+ rights}).
+
+-record(pchCurrAlarm, {key,
+ type_of_fault,
+ fault_id}).
+
+-record(pchIfAddress, {ifAddressEntry,
+ ifAddressRowStatus}).
+
+-record(pchAddressToIf, {address,
+ if_index}).
+
+-record(pchPreferences, {key,
+ if_format}).
+
+-record(pchSigChannelCallback, {key,
+ callback,
+ function,
+ args,
+ data}).
+
+-record(pchTermHcId, {hcId,
+ vclEntry}).
+
+-record(pchChg, {chgEntry,
+ chgStatus}).
+
+-record(pchCommState, {key,
+ ccid,
+ request,
+ low_cp_state,
+ high_cp_state,
+ et_side,
+ application,
+ data,
+ timestamp,
+ timer_id,
+ callback}).
+
+-record(pchBufferedCmd, {key,
+ resource,
+ module,
+ function,
+ arguments,
+ data}).
+
+-record(pchAnswerCh, {conn_id,
+ chg_data,
+ call_back_cp,
+ old_rtd,
+ old_ttd,
+ old_EpData,
+ action,
+ resource,
+ data,
+ fail_cause}).
+
+-record(pchAnswerOm, {conn_id}).
+
+-record(ccPch, {rowInd,
+ admState = 2}).
+
+-record(pchIf, {ilmiVpi = 0,
+ ilmiVci = 0,
+ ilmiS = 1,
+ ilmiT = 5,
+ ilmiK = 4,
+ neighborIfName = [],
+ neighborIpAddr = [0,0,0,0],
+ maxVciSvc,
+ overbookingFactor = {0,0},
+ shapingMode = 0,
+ maxVpiSvc,
+ cdvtMultFactor = 100,
+ scBandwidth1 = 0,
+ scBandwidth2 = 0,
+ scBandwidth3 = 0,
+ scBandwidth4 = 0}).
+
+-record(pchMpTemp, {key,
+ data}).
+
+-record(pchLatestErrorCode, {key,
+ errorCode}).
+
+-record(pchRangeTable, {node,
+ tdIndexRange,
+ vpccIndexRange,
+ vcccIndexRange}).
+
+-record(pchIndexBitmaps, {key,
+ available,
+ bitmap}).
+
+-record(pchLinkState, {key,
+ op_state,
+ last_change}).
+
+-record(pchFailedVpl, {vplEntry,
+ vplLastChange}).
+
+-record(pchFailedVcl, {vclEntry,
+ vclLastChange}).
+
+-record(pchStatCounters, {key,
+ ingress,
+ egress}).
+
+-record(pchEtStatTable, {index,
+ value = 0}).
+
+-record(pchAuditResult, {key,
+ passed,
+ not_passed,
+ sizes,
+ obj_keys}).
+
+-record(pch_fault_reqc, {fault_type,
+ fault_location}).
+
+-record(pch_cid, {conn_id,
+ mp_id,
+ leaf_id}).
+
+-file("./spvcOrig.erl", 207).
+
+-file("/export/localhome/locmacr/wrk/axd_r11/ATS_CRA12002/SPVC_CNA12164/src/../../../inc/pchI.hrl", 1).
+
+-hrl_id('52/190 55-CNA 121 08 Ux').
+
+-hrl_vsn('/main/R6A/R7A/R7D/R8B/3').
+
+-hrl_date('2002-10-14').
+
+-hrl_author(uabdomo).
+
+-record(pch_vc_rec, {ifIndex,
+ vpi,
+ vci,
+ application}).
+
+-record(pch_vp_rec, {ifIndex,
+ vpi}).
+
+-record(pch_td_index, {rtd_index,
+ ttd_index}).
+
+-record(pch_td, {service_cat,
+ pcr,
+ scr,
+ mbs,
+ mcr,
+ cdvt,
+ tagging,
+ clp_significance}).
+
+-record(pch_call_back_req, {module,
+ function,
+ user_data}).
+
+-record(pch_chg_rec, {chg_type,
+ chg_interface,
+ chg_chan_id,
+ chg_party_name}).
+
+-record(pch_polic_rec, {policing,
+ packet_discard}).
+
+-record(pch_user_name_rec, {user_name}).
+
+-record(pch_shaping_rec, {shaping}).
+
+-record(pch_audit_callback, {mod,
+ arg}).
+
+-file("./spvcOrig.erl", 208).
+
+-file("/export/localhome/locmacr/wrk/axd_r11/ATS_CRA12002/SPVC_CNA12164/src/../../../inc/plc.hrl", 1).
+
+-hrl_id('12/190 55-CNA 121 45 Ux').
+
+-hrl_vsn('/main/R6A/R6B/R7A/R7D/R8B/R9A/R11A/4').
+
+-hrl_date('2004-12-07').
+
+-hrl_author(ethrba).
+
+-record(plcQueues, {name,
+ type,
+ weight,
+ maxlength,
+ owner}).
+
+-record(plcSettings, {flag,
+ value}).
+
+-record(plcAlarm, {flag,
+ value}).
+
+-file("./spvcOrig.erl", 209).
+
+-file("/export/localhome/locmacr/wrk/axd_r11/ATS_CRA12002/SPVC_CNA12164/src/../../../inc/spvcTables.hrl", 1).
+
+-hrl_id('10/190 55-CNA 121 64').
+
+-hrl_vsn('/main/Inc4/R2A/R3A/R3B/R5A/R6A/R7A/R7D/R8B/4').
+
+-hrl_date('2003-02-12').
+
+-hrl_author(etxovp).
+
+-record(spvcVpc, {spvcVpcEntry,
+ spvcVpcTargetAddress,
+ spvcVpcTargetSelectType,
+ spvcVpcTargetVpi,
+ spvcVpcLastReleaseCause,
+ spvcVpcLastReleaseDiagnostic,
+ spvcVpcRetryInterval = 1000,
+ spvcVpcRetryTimer = 0,
+ spvcVpcRetryThreshold = 1,
+ spvcVpcRetryFailures = 0,
+ spvcVpcRetryLimit = 15,
+ spvcVpcRowStatus,
+ spvcVpcUserName = [],
+ spvcVpcProviderName = [],
+ currentState,
+ crankBackCounter = 0,
+ spvcVpcApplication,
+ spvcRerCap = false,
+ spvcRerStatus = false}).
+
+-record(spvcVpcOpState, {state,
+ timeOfChange}).
+
+-record(spvcVpcPerm, {spvcVpcEntry,
+ spvcVpcTargetAddress,
+ spvcVpcTargetSelectType,
+ spvcVpcTargetVpi,
+ spvcVpcRetryInterval = 1000,
+ spvcVpcRetryThreshold = 1,
+ spvcVpcRetryLimit = 15,
+ spvcVpcRowStatus,
+ spvcVpcUserName,
+ spvcVpcProviderName,
+ spvcVpcApplication}).
+
+-record(spvcVpcDyn, {spvcVpcEntry,
+ spvcVpcLastReleaseCause,
+ spvcVpcLastReleaseDiagnostic,
+ spvcVpcRetryTimer = 0,
+ spvcVpcRetryFailures = 0,
+ currentState,
+ crankBackCounter = 0}).
+
+-record(spvcVcc, {spvcVccEntry,
+ spvcVccTargetAddress,
+ spvcVccTargetSelectType,
+ spvcVccTargetVpi,
+ spvcVccTargetVci,
+ spvcVccLastReleaseCause,
+ spvcVccLastReleaseDiagnostic,
+ spvcVccRetryInterval = 1000,
+ spvcVccRetryTimer = 0,
+ spvcVccRetryThreshold = 1,
+ spvcVccRetryFailures = 0,
+ spvcVccRetryLimit = 15,
+ spvcVccRowStatus,
+ spvcVccUserName = [],
+ spvcVccProviderName = [],
+ currentState,
+ crankBackCounter = 0,
+ spvcVccTargetDlci,
+ spvcVccTargetType,
+ spvcVccApplication,
+ spvcVccFrKey,
+ spvcVccTranslationMode,
+ spvcRerCap = false,
+ spvcRerStatus = false}).
+
+-record(spvcVccOpState, {state,
+ timeOfChange}).
+
+-record(spvcVccPerm, {spvcVccEntry,
+ spvcVccTargetAddress,
+ spvcVccTargetSelectType,
+ spvcVccTargetVpi,
+ spvcVccTargetVci,
+ spvcVccRetryInterval = 1000,
+ spvcVccRetryThreshold = 1,
+ spvcVccRetryLimit = 15,
+ spvcVccRowStatus,
+ spvcVccUserName,
+ spvcVccProviderName,
+ spvcVccTargetDlci,
+ spvcVccTargetType,
+ spvcVccApplication,
+ spvcVccFrKey,
+ spvcVccTranslationMode = 2}).
+
+-record(spvcVccDyn, {spvcVccEntry,
+ spvcVccLastReleaseCause,
+ spvcVccLastReleaseDiagnostic,
+ spvcVccRetryTimer = 0,
+ spvcVccRetryFailures = 0,
+ currentState,
+ crankBackCounter = 0}).
+
+-record(spvcFailures, {dummy_key,
+ spvcCallFailuresTrapEnable = 2,
+ spvcNotificationInterval = 30,
+ backoff_interval = 0.100000,
+ delay_factor = 2,
+ max_delay = 200000}).
+
+-record(spvcCounters, {key,
+ value}).
+
+-record(spvcEventIndicator, {dummy_key,
+ spvcTimerInd = 2,
+ spvcSendEventInd = 2}).
+
+-record(spvcIndexNext, {dummy_key,
+ schedVccIndexNext = 1,
+ schedVpcIndexNext = 1}).
+
+-record(spvcHcIdToTp, {hcId,
+ tpEntry}).
+
+-record(spvcTpToHcId, {tpEntry,
+ hcId,
+ orig_number,
+ orig_vpi,
+ orig_vci,
+ orig_dlci,
+ frKey}).
+
+-record(spvcSchedVpc, {schedVpcIndex,
+ schedVpcSource,
+ schedVpcTargetAddr,
+ schedVpcTargetSelType,
+ schedVpcTargetVpi,
+ schedVpcRetryInt,
+ schedVpcRetryThres,
+ schedVpcRetryLimit,
+ schedVpcOpTime,
+ schedVpcOpInd,
+ schedVpcOpStatus,
+ schedVpcTimerRef,
+ schedVpcRowStatus,
+ schedVpcUserName,
+ schedVpcProviderName,
+ schedVpcFaultCause,
+ schedVpcRerCap = false}).
+
+-record(spvcSchedVcc, {schedVccIndex,
+ schedVccSource,
+ schedVccTargetAddr,
+ schedVccTargetSelType,
+ schedVccTargetVpi,
+ schedVccTargetVci,
+ schedVccRetryInt,
+ schedVccRetryThres,
+ schedVccRetryLimit,
+ schedVccOpTime,
+ schedVccOpInd,
+ schedVccOpStatus,
+ schedVccTimerRef,
+ schedVccRowStatus,
+ schedVccUserName,
+ schedVccProviderName,
+ schedVccFaultCause,
+ schedVccRerCap = false}).
+
+-record(spvcCurrAlarm, {key,
+ fault_id,
+ data}).
+
+-record(spvcChg, {key,
+ data}).
+
+-record(spvcBackoff, {key,
+ delay_time,
+ flag}).
+
+-record(spvcAutoVp, {entry,
+ lastChange,
+ receiveTrafficDescrIndex,
+ transmitTrafficDescrIndex,
+ ccIdentifier,
+ connId,
+ mpId,
+ leafId,
+ chargingIndicator = 1,
+ remoteChargingInd = 1,
+ chargablePartyIdentifier,
+ segmentEndPoint = 2,
+ rowStatus,
+ castType = 1,
+ connKind,
+ serviceType = 2,
+ endPointData,
+ continuityCheck = 1,
+ upcNpcMode = 2,
+ preventInbandCc = 1,
+ monAisRdi = 2,
+ adminStatus,
+ autoTarget = 1,
+ schedulingFlag = 2,
+ application = [],
+ remoteData,
+ vpccAdminStatus = 2,
+ contCheckSearch = 1,
+ pmSearch = 1,
+ lastBuffFlagRead,
+ shapingMode = 1,
+ groupShapingId}).
+
+-record(spvcAutoVc, {entry,
+ lastChange,
+ receiveTrafficDescrIndex,
+ transmitTrafficDescrIndex,
+ ccIdentifier,
+ connId,
+ mpId,
+ leafId,
+ chargingIndicator = 1,
+ remoteChargingInd = 1,
+ chargablePartyIdentifier,
+ packetDiscard = 2,
+ segmentEndPoint = 2,
+ rowStatus,
+ castType = 1,
+ connKind,
+ continuityCheck = 1,
+ upcNpcMode = 2,
+ endPointData,
+ preventInbandCc = 1,
+ monAisRdi = 2,
+ autoTarget = 1,
+ schedulingFlag = 2,
+ application = [],
+ remoteData,
+ vcccAdminStatus = 2,
+ contCheckSearch = 1,
+ pmSearch = 1,
+ lastBuffFlagRead,
+ chargingIfChanid,
+ shapingMode = 1}).
+
+-record(spvcAutoAtd, {index,
+ type,
+ param1 = 0,
+ param2 = 0,
+ param3 = 0,
+ param4 = 0,
+ param5 = 0,
+ trafficQoSClass = 0,
+ rowStatus = 1,
+ serviceCategory = 6,
+ vcCapability = 1,
+ name = [],
+ userCounter = 0}).
+
+-record(spvcAutoAbr, {index,
+ icr,
+ tbe = 16277215,
+ frtt = 0,
+ rdf = 11,
+ rif = 11,
+ nrm = 4,
+ trm = 7,
+ cdf = 3,
+ adtf = 50,
+ rowStatus = 1}).
+
+-record(spvcLatestErrorCode, {key,
+ errorCode}).
+
+-record(spvcVcDyn, {vclEntry,
+ vclCcIdentifier,
+ vclConnId,
+ vclMpId,
+ vclLeafId}).
+
+-record(spvcVpDyn, {vplEntry,
+ vplCcIdentifier,
+ vplConnId,
+ vplMpId,
+ vplLeafId}).
+
+-record(spvcObj, {spvcEntry,
+ spvcTargetAddress,
+ spvcTargetSelectType,
+ spvcTargetVpi,
+ spvcTargetVci,
+ spvcLastReleaseCause,
+ spvcLastReleaseDiagnostic,
+ spvcRetryInterval = 1000,
+ spvcRetryTimer = 0,
+ spvcRetryThreshold = 1,
+ spvcRetryFailures = 0,
+ spvcRetryLimit = 15,
+ spvcRowStatus,
+ spvcUserName,
+ spvcProviderName,
+ currentState,
+ spvcTargetDlci,
+ spvcTargetType,
+ spvcApplication,
+ spvcFrKey,
+ spvcVccTranslationMode = 2,
+ spvcRerCap = false,
+ spvcRerStatus = false}).
+
+-record(spvcTargetVc, {entry,
+ userName = [],
+ providerName = [],
+ opState,
+ rowStatus}).
+
+-record(spvcTargetVp, {entry,
+ userName = [],
+ providerName = [],
+ opState,
+ rowStatus}).
+
+-record(spvcReestablishTimer, {time,
+ timer_id,
+ module,
+ function,
+ args}).
+
+-record(spvcRerVp, {entry,
+ rerCap,
+ rerData}).
+
+-record(spvcRerVc, {entry,
+ rerCap,
+ rerData}).
+
+-record(spvcHcEtStat, {key,
+ counter = 0}).
+
+-record(spvcSaEtStat, {key,
+ counter = 0}).
+
+-file("./spvcOrig.erl", 210).
+
+-file("/export/localhome/locmacr/wrk/axd_r11/ATS_CRA12002/SPVC_CNA12164/src/../../../inc/spvcDefines.hrl", 1).
+
+-hrl_id('41/190 55-CNA 121 64 Ux').
+
+-hrl_vsn('/main/R6A/R7A/R7D/R8B/3').
+
+-hrl_date('2003-02-21').
+
+-hrl_author(etxhebl).
+
+-file("./spvcOrig.erl", 211).
+
+-file("/export/localhome/locmacr/wrk/axd_r11/ATS_CRA12002/SPVC_CNA12164/src/../../../inc/spvcFr.hrl", 1).
+
+-hrl_id('48/190 55-CNA 121 64 Ux').
+
+-hrl_vsn('/main/R7A/R7D/2').
+
+-hrl_date('2001-12-06').
+
+-hrl_author(etxhtb).
+
+-record(spvcFr, {spvcFrEntry,
+ spvcFrAtmEntry,
+ spvcFrTargetAddress,
+ spvcFrTargetSelectType,
+ spvcFrTargetIdentifier,
+ spvcFrTargetVpi,
+ spvcFrTargetVci,
+ spvcFrAtmTranslation,
+ spvcFrLastReleaseCause,
+ spvcFrLastReleaseDiagnostic,
+ spvcFrAdminStatus,
+ spvcFrRetryInterval = 1000,
+ spvcFrRetryTimer = 0,
+ spvcFrRetryThreshold = 1,
+ spvcFrRetryFailures = 0,
+ spvcFrRetryLimit = 15,
+ spvcFrRowStatus,
+ spvcFrUserName,
+ spvcFrProviderName,
+ currentState}).
+
+-record(spvcFrPerm, {spvcFrEntry,
+ spvcFrAtmEntry,
+ spvcFrAtmTranslation,
+ spvcFrAdminStatus,
+ spvcFrConnect}).
+
+-record(spvcFrAddress, {addressEntry,
+ addressRowStatus}).
+
+-record(spvcFrAddressToIf, {address,
+ if_index}).
+
+-record(fr_end_point, {ifIndex,
+ dlci}).
+
+-record(fr_atm_translation, {routedIp = off,
+ routedOsi = off,
+ otherRouted = off,
+ arpTranslation = off}).
+
+-record(link_layer_core_parameters, {outgoing_max_ifs,
+ incoming_max_ifs}).
+
+-record(priority_and_service_class, {outgoing_transfer_priority,
+ incoming_transfer_priority,
+ outgoing_discard_priority,
+ incoming_discard_priority}).
+
+-file("./spvcOrig.erl", 212).
+
+-file("/export/localhome/locmacr/wrk/axd_r11/ATS_CRA12002/SPVC_CNA12164/src/../../../derived_hrl/mib/AXD301-PCH-MIB.hrl", 1).
+
+-file("./spvcOrig.erl", 213).
+
+-file("/export/localhome/locmacr/wrk/axd_r11/ATS_CRA12002/SPVC_CNA12164/src/../../../derived_hrl/mib/AXD301-SPVC-MIB.hrl", 1).
+
+-file("./spvcOrig.erl", 214).
+
+-file("/export/localhome/locmacr/wrk/axd_r11/ATS_CRA12002/SPVC_CNA12164/src/../../../derived_hrl/mib/AXD301-FRSPVC-MIB.hrl", 1).
+
+-file("./spvcOrig.erl", 215).
+
+-file("/export/localhome/locmacr/wrk/axd_r11/ATS_CRA12002/SPVC_CNA12164/src/../../../inc/sysDefines.hrl", 1).
+
+-hrl_id('3/190 55-CNA 121 70').
+
+-hrl_vsn('/main/Inc3/Inc4/Inc5/R3B/R4A/R5B/R6A/R7A/R8B/2').
+
+-hrl_date('2002-06-07').
+
+-hrl_author(etxjotj).
+
+-file("./spvcOrig.erl", 216).
+
+-file("/export/localhome/locmacr/wrk/axd_r11/ATS_CRA12002/SPVC_CNA12164/src/../../../inc/hciMsg.hrl", 1).
+
+-hrl_id('4/190 55-CNA 121 159 Ux').
+
+-hrl_vsn('/main/R7A/R8B/10').
+
+-hrl_date('2003-02-21').
+
+-hrl_author(etxmexa).
+
+-file("/export/localhome/locmacr/wrk/axd_r11/ATS_CRA12002/SPVC_CNA12164/src/../../../inc/hciComp.hrl", 1).
+
+-hrl_id('3/190 55-CNA 121 159 Ux').
+
+-hrl_vsn('/main/R7A/1').
+
+-hrl_date('00-03-22').
+
+-hrl_author(etxmexa).
+
+-record(hci_comp_info, {required_FC = 0,
+ desired_FC = 0}).
+
+-record(hci_comp_res, {not_supported_required_FCs,
+ not_supported_desired_FCs,
+ all_supported_FCs}).
+
+-file("/export/localhome/locmacr/wrk/axd_r11/ATS_CRA12002/SPVC_CNA12164/src/../../../inc/hciMsg.hrl", 14).
+
+-record(hci_add_party, {hci_cpn,
+ hci_aal,
+ hci_bhli,
+ hci_blli,
+ hci_blli_bici,
+ hci_bsco,
+ hci_epr,
+ hci_e2etd,
+ hci_noti,
+ hci_cpsa,
+ hci_clpn,
+ hci_clpsa,
+ hci_cpn_soft,
+ hci_clpn_soft,
+ hci_geidt_list = [],
+ hci_dtl_bin_list = [],
+ hci_pa_list = [],
+ hci_gat_list = [],
+ hci_data,
+ hci_prot_comp}).
+
+-record(hci_add_party_ack, {hci_epr,
+ hci_aal,
+ hci_blli,
+ hci_blli_bici,
+ hci_e2etd,
+ hci_noti,
+ hci_cpn_soft,
+ hci_cnosa,
+ hci_cno,
+ hci_geidt_list = [],
+ hci_pa_list = [],
+ hci_gat_list = [],
+ hci_data,
+ hci_prot_comp}).
+
+-record(hci_add_party_rej, {hci_cause,
+ hci_epr,
+ hci_geidt_list = [],
+ hci_cb,
+ hci_pa_list = [],
+ hci_internal_rel_info,
+ hci_gat_list = [],
+ hci_data,
+ hci_prot_comp}).
+
+-record(hci_alerting, {hci_mci,
+ hci_unrps,
+ hci_cdpi,
+ hci_epr,
+ hci_prog_list = [],
+ hci_nbc,
+ hci_nbhlc,
+ hci_noti,
+ hci_geidt_list = [],
+ hci_pa_list = [],
+ hci_gat_list = [],
+ hci_ssie,
+ hci_data,
+ hci_prot_comp}).
+
+-record(hci_b_resources, {hci_rem_dataB,
+ hci_vpiB,
+ hci_vciB,
+ hci_data,
+ hci_prot_comp}).
+
+-record(hci_connect, {hci_mci,
+ hci_unrps,
+ hci_aal,
+ hci_blli,
+ hci_blli_bici,
+ hci_epr,
+ hci_atd,
+ hci_e2etd,
+ hci_noti,
+ hci_abrs,
+ hci_abra,
+ hci_nbc,
+ hci_nbhlc,
+ hci_nbllc,
+ hci_prog_list = [],
+ hci_geidt_list = [],
+ hci_eqos,
+ hci_cpn_soft,
+ hci_cnosa,
+ hci_cno,
+ hci_pa_list = [],
+ hci_gat_list = [],
+ hci_rem_dataB,
+ hci_con_dir = both,
+ hci_ssie,
+ hci_rer_services,
+ hci_rer,
+ hci_opt_traf,
+ hci_data,
+ hci_prot_comp}).
+
+-record(hci_drop_party, {hci_cause,
+ hci_epr,
+ hci_noti,
+ hci_geidt_list = [],
+ hci_pa_list = [],
+ hci_internal_rel_info,
+ hci_gat_list = [],
+ hci_data,
+ hci_prot_comp}).
+
+-record(hci_local_connect, {hci_rem_data,
+ hci_con_dir,
+ hci_data,
+ hci_prot_comp}).
+
+-record(hci_local_connected, {hci_rem_data,
+ hci_con_dir,
+ hci_data,
+ hci_prot_comp}).
+
+-record(hci_local_disconnect, {hci_discon_dir,
+ hci_data,
+ hci_prot_comp}).
+
+-record(hci_local_disconnected, {hci_data,
+ hci_prot_comp}).
+
+-record(hci_notify, {hci_epr,
+ hci_noti,
+ hci_pa_list = [],
+ hci_gat_list = [],
+ hci_data,
+ hci_prot_comp}).
+
+-record(hci_party_alerting, {hci_epr,
+ hci_noti,
+ hci_geidt_list = [],
+ hci_pa_list = [],
+ hci_gat_list = [],
+ hci_data,
+ hci_prot_comp}).
+
+-record(hci_progress, {hci_mci,
+ hci_unrps,
+ hci_cdpi,
+ hci_prog_list = [],
+ hci_nbc,
+ hci_nbhlc,
+ hci_noti,
+ hci_pa_list = [],
+ hci_gat_list = [],
+ hci_data,
+ hci_prot_comp}).
+
+-record(hci_release, {hci_mci,
+ hci_unrps,
+ hci_cause_list = [],
+ hci_noti,
+ hci_prog_list = [],
+ hci_geidt_list = [],
+ hci_cb,
+ hci_pa_list = [],
+ hci_internal_rel_info,
+ hci_gat_list = [],
+ hci_ssie,
+ hci_rer_cause,
+ hci_data,
+ hci_prot_comp,
+ hci_internal_dbg_cc,
+ hci_internal_dbg_l3}).
+
+-record(hci_setup, {hci_mci,
+ hci_unrps,
+ hci_atd,
+ hci_bbc,
+ hci_qos,
+ hci_cpn,
+ hci_aal,
+ hci_bhli,
+ hci_blli_brep,
+ hci_blli_bici,
+ hci_bsco,
+ hci_epr,
+ hci_lpt,
+ hci_e2etd,
+ hci_noti,
+ hci_abrs,
+ hci_abra,
+ hci_prog_list = [],
+ hci_eqos,
+ hci_cpsa_list = [],
+ hci_clpn,
+ hci_bici_clpn,
+ hci_clpsa_list = [],
+ hci_cgpc,
+ hci_nbc_brep,
+ hci_nbhlc_list = [],
+ hci_nbllc_brep,
+ hci_conss,
+ hci_geidt_list = [],
+ hci_cpn_soft,
+ hci_clpn_soft,
+ hci_dtl_bin_list = [],
+ hci_pa_list = [],
+ hci_ncci,
+ hci_routing_address,
+ hci_protocol_internal_info,
+ hci_gat_list = [],
+ hci_con_dir = both,
+ hci_ssie,
+ hci_rer_services,
+ hci_rer,
+ hci_opt_traf,
+ hci_data_setup,
+ hci_prot_comp}).
+
+-record(hci_setup_ack, {hci_assign,
+ hci_rem_dataB,
+ hci_con_dir = both,
+ hci_vpiB,
+ hci_vciB,
+ hci_data,
+ hci_prot_comp}).
+
+-record(hci_status, {hci_state,
+ hci_data,
+ hci_prot_comp}).
+
+-record(hci_status_enq, {hci_state,
+ hci_data,
+ hci_prot_comp}).
+
+-record(hci_remote_data, {hci_prot_type,
+ hci_data,
+ hci_dummy1,
+ hci_dummy2}).
+
+-record(hci_unrec, {hci_mci,
+ hci_head,
+ hci_binary,
+ hci_data,
+ hci_prot_comp}).
+
+-record(hci_atd, {hci_pci,
+ hci_apci,
+ hci_fwd_pcr_clp_0,
+ hci_bwd_pcr_clp_0,
+ hci_fwd_pcr_clp_0_1,
+ hci_bwd_pcr_clp_0_1,
+ hci_fwd_scr_clp_0,
+ hci_bwd_scr_clp_0,
+ hci_fwd_scr_clp_0_1,
+ hci_bwd_scr_clp_0_1,
+ hci_fwd_mbs_clp_0,
+ hci_bwd_mbs_clp_0,
+ hci_fwd_mbs_clp_0_1,
+ hci_bwd_mbs_clp_0_1,
+ hci_best_effort_ind = 0,
+ hci_fwd_frame_discard = 0,
+ hci_bwd_frame_discard = 0,
+ hci_tagging_bwd = 0,
+ hci_tagging_fwd = 0,
+ hci_fwd_abr_mcr,
+ hci_bwd_abr_mcr,
+ hci_binary}).
+
+-record(hci_bbc, {hci_pci,
+ hci_bearer_class,
+ hci_atm_transfer_capability,
+ hci_user_plane_connection_configuration,
+ hci_susceptibility_to_clipping,
+ hci_binary}).
+
+-record(hci_cause, {hci_pci,
+ hci_location,
+ hci_cause_value,
+ hci_diagnostics_list = [],
+ hci_binary}).
+
+-record(hci_cpn, {hci_pci,
+ hci_type_of_number,
+ hci_intern_netw_numb_indic,
+ hci_numbering_plan_indicator,
+ hci_number_digits,
+ hci_orig_native = false}).
+
+-record(hci_clpn, {hci_pci,
+ hci_type_of_number,
+ hci_numbering_plan_indicator,
+ hci_presentation_indicator,
+ hci_screening_indicator,
+ hci_number_digits,
+ hci_incomplete_indicator = 0,
+ hci_binary}).
+
+-record(hci_cno, {hci_type_of_number,
+ hci_numbering_plan_indicator,
+ hci_presentation_indicator,
+ hci_screening_indicator,
+ hci_number_digits,
+ hci_binary}).
+
+-record(hci_cnosa, {hci_binary}).
+
+-record(hci_cpn_soft, {hci_select_type,
+ hci_soft_vpi,
+ hci_soft_vci,
+ hci_soft_dlci,
+ hci_binary}).
+
+-record(hci_clpn_soft, {hci_soft_vpi,
+ hci_soft_vci,
+ hci_soft_dlci,
+ hci_binary}).
+
+-record(hci_rer_services, {hci_inter_req_hard,
+ hci_inter_cap_hard,
+ hci_intra_req_soft,
+ hci_intra_req_hard,
+ hci_intra_cap_asym,
+ hci_intra_cap_sym,
+ hci_intra_cap_hard,
+ hci_binary}).
+
+-record(hci_rer, {hci_func_addr,
+ hci_endpoint_key,
+ hci_switchover,
+ hci_incarnation,
+ hci_pnni_cumul_fw_max_cell_td,
+ hci_cumul_fw_p2p_cdv,
+ hci_cumul_bw_p2p_cdv,
+ hci_binary}).
+
+-record(hci_rer_cause, {hci_rer_rel_cause,
+ hci_binary}).
+
+-record(hci_opt_traf, {hci_origin,
+ hci_cumul_fw_aw,
+ hci_cumul_bw_aw,
+ hci_binary}).
+
+-record(hci_qos, {hci_pci,
+ hci_qos_class_fwd,
+ hci_qos_class_bwd,
+ hci_binary}).
+
+-record(hci_aal, {hci_pci,
+ hci_binary}).
+
+-record(hci_bhli, {hci_pci,
+ hci_binary}).
+
+-record(hci_blli_brep, {hci_brep,
+ hci_blli_list = []}).
+
+-record(hci_blli, {hci_binary}).
+
+-record(hci_blli_bici, {hci_repeated,
+ hci_priority,
+ hci_pci,
+ hci_binary}).
+
+-record(hci_cpsa, {hci_pci,
+ hci_binary}).
+
+-record(hci_clpsa, {hci_pci,
+ hci_binary}).
+
+-record(hci_gat, {hci_binary}).
+
+-record(hci_epr, {hci_epr_type,
+ hci_epr_value,
+ hci_epr_flag,
+ hci_binary}).
+
+-record(hci_eqos, {hci_origin,
+ hci_acc_fwd_p2p_cdv,
+ hci_acc_bwd_p2p_cdv,
+ hci_cum_fwd_p2p_cdv,
+ hci_cum_bwd_p2p_cdv,
+ hci_acc_fwd_clr,
+ hci_acc_bwd_clr,
+ hci_binary}).
+
+-record(hci_brep, {hci_binary}).
+
+-record(hci_bsco, {hci_binary}).
+
+-record(hci_noti, {hci_binary}).
+
+-record(hci_abrs, {hci_fwd_abr_icr,
+ hci_bwd_abr_icr,
+ hci_fwd_abr_tbe,
+ hci_bwd_abr_tbe,
+ hci_cum_rm_fix_round_trip,
+ hci_fwd_rif,
+ hci_bwd_rif,
+ hci_fwd_rdf,
+ hci_bwd_rdf,
+ hci_binary}).
+
+-record(hci_abra, {hci_fwd_nrm,
+ hci_fwd_trm,
+ hci_fwd_cdf,
+ hci_fwd_atdf,
+ hci_bwd_nrm,
+ hci_bwd_trm,
+ hci_bwd_cdf,
+ hci_bwd_atdf,
+ hci_binary}).
+
+-record(hci_prog, {hci_coding_std,
+ hci_location,
+ hci_prog_desc,
+ hci_binary}).
+
+-record(hci_nbc_brep, {hci_brep,
+ hci_nbc_list = []}).
+
+-record(hci_nbc, {hci_binary}).
+
+-record(hci_nbhlc, {hci_binary}).
+
+-record(hci_nbllc_brep, {hci_brep,
+ hci_nbllc_list = []}).
+
+-record(hci_nbllc, {hci_binary}).
+
+-record(hci_geidt, {hci_binary}).
+
+-record(hci_conss, {hci_type_of_conn_scope,
+ hci_conn_scope,
+ hci_binary}).
+
+-record(hci_e2etd, {hci_pci,
+ hci_cumul_td,
+ hci_max_td,
+ hci_pnni_cumul_td,
+ hci_pnni_accept_fwd_max_td,
+ hci_netw_gen}).
+
+-record(hci_cdpi, {hci_pci,
+ hci_cdpci,
+ hci_cdpsi,
+ hci_binary}).
+
+-record(hci_cgpc, {hci_pci,
+ hci_binary}).
+
+-record(hci_lpt, {hci_pci,
+ hci_ptype}).
+
+-record(hci_cb, {hci_cb_level,
+ hci_bl_transit_type,
+ hci_bl_node_id,
+ hci_bl_link_proc_node_id,
+ hci_bl_link_port_id,
+ hci_bl_link_succ_node_id,
+ cause_value,
+ hci_cb_diagnostics,
+ hci_binary}).
+
+-record(hci_pa, {hci_ie_id,
+ hci_coding,
+ hci_action,
+ hci_length,
+ hci_binary,
+ hci_error_type}).
+
+-record(hci_ncci, {hci_pci,
+ hci_ni,
+ hci_point_code,
+ hci_call_id}).
+
+-record(hci_ssie, {hci_ssie_sas = [],
+ hci_binary}).
+
+-record(hci_sas, {hci_sas_vsn,
+ hci_sas_transp_ind,
+ hci_sas_flow_ind,
+ hci_sas_discard,
+ hci_sas_scope,
+ hci_sas_relative_id,
+ hci_binary}).
+
+-record(hci_data, {hci_hcid,
+ hci_sender_ifindex,
+ hci_sender_hcid}).
+
+-record(hci_data_setup, {hci_hcidA,
+ hci_pidA,
+ hci_protA,
+ hci_protB,
+ hci_portB,
+ hci_hcidB,
+ hci_rem_dataA,
+ hci_assign,
+ hci_ifindexB,
+ hci_node_id,
+ hci_succ_node_id,
+ hci_ifindexA,
+ hci_vpiA,
+ hci_vciA,
+ hci_cpA,
+ hci_cpB}).
+
+-record(hci_prot_comp, {hci_requiredFC = 0,
+ hci_desiredFC = 0}).
+
+-file("./spvcOrig.erl", 217).
+
+-file("/export/localhome/locmacr/wrk/axd_r11/ATS_CRA12002/SPVC_CNA12164/src/../../../inc/ccCd.hrl", 1).
+
+-hrl_id('13/190 55-CNA 121 101 Ux').
+
+-hrl_vsn('/main/R6A/R7A/R8A/R8B/8').
+
+-hrl_date('2003-02-21').
+
+-hrl_author(etxmexa).
+
+-record(ccCdRR, {hcid,
+ vpi,
+ vci,
+ ifindexA,
+ call_type,
+ spvc = false,
+ reserve = yes,
+ etA,
+ destdata,
+ leafdata,
+ loopdata,
+ l3,
+ l3_loop,
+ cc}).
+
+-record(ccCdRD, {destid,
+ loopdata,
+ cc}).
+
+-record(ccCdRL, {leafid,
+ protTypeB,
+ loopdata,
+ l3,
+ l3_loop,
+ cc}).
+
+-record(ccCdDD, {hcid,
+ hcidA,
+ vpi,
+ vci,
+ ifindexB,
+ portB,
+ call_type,
+ spvc = false,
+ reserve = yes,
+ protTypeA,
+ etB,
+ leafdata,
+ loopdata,
+ l3,
+ l3_loop,
+ cc}).
+
+-record(ccCdDL, {leafid,
+ loopdata,
+ l3,
+ l3_loop,
+ cc}).
+
+-record(ccRR, {protTypeA,
+ remote_dataA,
+ remote_dataB,
+ chg_counters,
+ sc,
+ chg_decision = on,
+ cc_loop}).
+
+-record(ccRL, {hcidB,
+ charging,
+ cc_loop}).
+
+-record(ccRD, {portB,
+ ifindexB,
+ cpB,
+ vpiB,
+ vciB,
+ cc_loop}).
+
+-record(ccDD, {protTypeB,
+ remote_dataA,
+ remote_dataB,
+ ifindexA,
+ cpA,
+ vpiA,
+ vciA,
+ chg_counters,
+ sc,
+ chg_decision = on,
+ cc_loop}).
+
+-record(ccDL, {cc_loop}).
+
+-record(loopRR, {vpList,
+ nodeid,
+ succ_nodeid,
+ connection_type,
+ policing,
+ delay_contrib,
+ charging = on,
+ prev_routing_data}).
+
+-record(loopRD, {}).
+
+-record(loopRL, {msg_rec,
+ providerName,
+ userName,
+ partyId,
+ serviceIfA,
+ serviceIdA,
+ serviceIfB,
+ serviceIdB,
+ estAw,
+ dtlLevels}).
+
+-record(loopDD, {nodeid,
+ succ_nodeid,
+ vpList,
+ connection_type,
+ policing,
+ assign,
+ delay_contrib,
+ charging = on}).
+
+-record(loopDL, {msg_rec,
+ providerName,
+ userName,
+ partyId,
+ serviceIfA,
+ serviceIdA,
+ serviceIfB,
+ serviceIdB}).
+
+-record(ccLoopRR, {pidB,
+ qos,
+ atd,
+ bbc,
+ cscope,
+ e2etd,
+ eqos,
+ con_state = none,
+ con_order = both,
+ mr_flag,
+ catch_up_id,
+ cpA}).
+
+-record(ccLoopRD, {}).
+
+-record(ccLoopRL, {route,
+ linklist,
+ routelist,
+ failurelist = [],
+ nodeidlist,
+ cb,
+ cpn,
+ dtl,
+ routing_state,
+ assign,
+ timer_counter = 0,
+ timer_ref,
+ status_enq_ind,
+ link_CB,
+ node_CB,
+ pnnir_rlp,
+ pnni_only}).
+
+-record(ccLoopDD, {pidA,
+ con_state = none,
+ con_order = both,
+ mr_flag,
+ catch_up_id,
+ cpB}).
+
+-record(ccLoopDL, {timer_counter = 0,
+ timer_ref,
+ status_enq_ind}).
+
+-file("./spvcOrig.erl", 218).
+
+-file("/export/localhome/locmacr/built/lib/erlang/lib/snmp-4.1.2/include/STANDARD-MIB.hrl", 1).
+
+-file("./spvcOrig.erl", 219).
+
+error_handler({From,Tag},{M,F,Args},EXITReason) ->
+ spvcLib:do_report(sccm,M,F,Args,"",EXITReason).
+
+connect(HcId,Connect,Key) ->
+ debug_disabled,
+ Obj = spvcDataBase:db_read({spvcObj,Key}),
+ orig_state_machine(Obj#spvcObj.currentState,connect_nu,Obj,[HcId,Connect]).
+
+release_nu(HcId,Release,Key) ->
+ debug_disabled,
+ Obj = spvcDataBase:db_read({spvcObj,Key}),
+ spvcDataBase:db_delete({spvcHcIdToTp,HcId}),
+ orig_state_machine(Obj#spvcObj.currentState,release_nu,Obj,[HcId,Release]).
+
+release_comp_nu(HcId,Release_comp,Key) ->
+ debug_disabled,
+ Obj = spvcDataBase:db_read({spvcObj,Key}),
+ spvcDataBase:db_delete({spvcHcIdToTp,HcId}),
+ orig_state_machine(Obj#spvcObj.currentState,release_comp_nu,Obj,[HcId,Release_comp]).
+
+release_incumbent(HcId,Release) ->
+ debug_disabled,
+ release_incumbent2(spvcDataBase:db_read({spvcHcIdToTp,HcId}),Release).
+
+release_incumbent2(SpvcHcIdToTp,Release) ->
+ release_incumbent3(SpvcHcIdToTp#spvcHcIdToTp.tpEntry,Release).
+
+release_incumbent3({orig,If,Vpi,Vci,Leaf},Release) ->
+ release_incumbent4({If,Vpi,Vci,Leaf},Release);
+release_incumbent3({orig,If,Vpi,Leaf},Release) ->
+ release_incumbent4({If,Vpi,Leaf},Release).
+
+release_incumbent4(TpKey,Release) ->
+ Spvc = spvcDataBase:db_read({spvcObj,TpKey}),
+ active = Spvc#spvcObj.currentState,
+ orig_state_machine(active,release_incumbent,Spvc,[Release]).
+
+switch_over(HcId,{If,Vpi,Vci}) ->
+ Key = case {If,Vpi,Vci} of
+ {If_Value,Vpi_Value,Vci_Value} when integer(Vci_Value) ->
+ {If_Value,Vpi_Value,Vci_Value,1};
+ {If_Value,Vpi_Value,_} ->
+ {If_Value,Vpi_Value,1};
+ {If_Value,Vpi_Value} ->
+ {If_Value,Vpi_Value,1}
+ end,
+ Spvc = spvcDataBase:db_read({spvcObj,Key}),
+ do_switch_over(HcId,Spvc);
+switch_over(HcId,{If,Vpi}) ->
+ Key = case {If,Vpi,no_vc} of
+ {If_Value,Vpi_Value,Vci_Value} when integer(Vci_Value) ->
+ {If_Value,Vpi_Value,Vci_Value,1};
+ {If_Value,Vpi_Value,_} ->
+ {If_Value,Vpi_Value,1};
+ {If_Value,Vpi_Value} ->
+ {If_Value,Vpi_Value,1}
+ end,
+ Spvc = spvcDataBase:db_read({spvcObj,Key}),
+ do_switch_over(HcId,Spvc).
+
+do_switch_over(HcId,Spvc) ->
+ State = Spvc#spvcObj.currentState,
+ orig_state_machine(State,switch_over,Spvc,[HcId]).
+
+gen_set(Type,Row,Cols) ->
+ debug_disabled,
+ gen_set(Type,Row,Cols,undefined).
+
+gen_set(Type,Row,Cols,FrKey) ->
+ debug_disabled,
+ case lists:keysearch(case {case Row of
+ {_,_,_,_} ->
+ spvcVcc;
+ {_,_,_} ->
+ spvcVpc;
+ {_,_} ->
+ spvcFr;
+ [_,_,_,_] ->
+ spvcVcc;
+ [_,_,_] ->
+ spvcVpc;
+ [_,_] ->
+ spvcFr
+ end,rowStatus} of
+ {spvcVcc,targetAddress} ->
+ 2;
+ {spvcVcc,selectType} ->
+ 3;
+ {spvcVcc,targetVpi} ->
+ 18;
+ {spvcVcc,targetVci} ->
+ 5;
+ {spvcVcc,releaseCause} ->
+ 6;
+ {spvcVcc,releaseDiagnostic} ->
+ 7;
+ {spvcVcc,retryInterval} ->
+ 10;
+ {spvcVcc,retryTimer} ->
+ 11;
+ {spvcVcc,retryThreshold} ->
+ 12;
+ {spvcVcc,retryFailures} ->
+ 13;
+ {spvcVcc,retryLimit} ->
+ 14;
+ {spvcVcc,rowStatus} ->
+ 15;
+ {spvcVcc,restart} ->
+ 9;
+ {spvcVcc,targetSelectType_any} ->
+ 2;
+ {spvcVcc,targetSelectType_required} ->
+ 1;
+ {spvcVpc,targetAddress} ->
+ 2;
+ {spvcVpc,selectType} ->
+ 3;
+ {spvcVpc,targetVpi} ->
+ 15;
+ {spvcVpc,releaseCause} ->
+ 5;
+ {spvcVpc,releaseDiagnostic} ->
+ 6;
+ {spvcVpc,retryInterval} ->
+ 9;
+ {spvcVpc,retryTimer} ->
+ 10;
+ {spvcVpc,retryThreshold} ->
+ 11;
+ {spvcVpc,retryFailures} ->
+ 12;
+ {spvcVpc,retryLimit} ->
+ 13;
+ {spvcVpc,rowStatus} ->
+ 14;
+ {spvcVpc,restart} ->
+ 8;
+ {spvcVpc,targetSelectType_any} ->
+ 2;
+ {spvcVpc,targetSelectType_required} ->
+ 1;
+ {spvcFr,targetAddress} ->
+ 3;
+ {spvcFr,selectType} ->
+ 5;
+ {spvcFr,identifier} ->
+ 6;
+ {spvcFr,targetVpi} ->
+ 7;
+ {spvcFr,targetVci} ->
+ 8;
+ {spvcFr,translation} ->
+ 9;
+ {spvcFr,releaseCause} ->
+ 10;
+ {spvcFr,releaseDiagnostic} ->
+ 11;
+ {spvcFr,operStatus} ->
+ 12;
+ {spvcFr,adminStatus} ->
+ 13;
+ {spvcFr,restart} ->
+ 14;
+ {spvcFr,retryInterval} ->
+ 15;
+ {spvcFr,retryTimer} ->
+ 16;
+ {spvcFr,retryThreshold} ->
+ 17;
+ {spvcFr,retryFailures} ->
+ 18;
+ {spvcFr,retryLimit} ->
+ 19;
+ {spvcFr,lastChange} ->
+ 20;
+ {spvcFr,rowStatus} ->
+ 21
+ end,1,Cols) of
+ {value,{_,4}} ->
+ debug_disabled,
+ mnesia:dirty_update_counter(spvcHcEtStat,spvcLib:get_board(hd(Row)),1),
+ case get_link_state(case Row of
+ Row when record(Row,spvcObj) ->
+ case Row#spvcObj.spvcEntry of
+ {If_Value,_,_,_} ->
+ If_Value;
+ {If_Value,_,_} ->
+ If_Value
+ end;
+ Row when record(Row,spvcVcc) ->
+ {If_Value,_,_,_} = Row#spvcVcc.spvcVccEntry,
+ If_Value;
+ Row when record(Row,spvcVpc) ->
+ {If_Value,_,_} = Row#spvcVpc.spvcVpcEntry,
+ If_Value;
+ Row when record(Row,spvcVpcPerm) ->
+ {If_Value,_,_} = Row#spvcVpcPerm.spvcVpcEntry,
+ If_Value;
+ Row when record(Row,spvcVccPerm) ->
+ {If_Value,_,_,_} = Row#spvcVccPerm.spvcVccEntry,
+ If_Value;
+ Row when record(Row,spvcTargetVc) ->
+ {If_Value,_,_} = Row#spvcTargetVc.entry,
+ If_Value;
+ Row when record(Row,spvcTargetVp) ->
+ {If_Value,_} = Row#spvcTargetVp.entry,
+ If_Value;
+ Row when record(Row,pchVc) ->
+ {If_Value,_,_} = Row#pchVc.vclEntry,
+ If_Value;
+ Row when record(Row,pchVp) ->
+ {If_Value,_} = Row#pchVp.vplEntry,
+ If_Value;
+ Row when record(Row,spvcFr) ->
+ {If_Value,_} = Row#spvcFr.spvcFrEntry,
+ If_Value;
+ Row when record(Row,spvcFrPerm) ->
+ {If_Value,_} = Row#spvcFrPerm.spvcFrEntry,
+ If_Value;
+ {If_Value,_,_,_} ->
+ If_Value;
+ {If_Value,_,_} ->
+ If_Value;
+ {If_Value,_} ->
+ If_Value;
+ [If_Value|_] ->
+ If_Value;
+ _ ->
+ error
+ end) of
+ disabled ->
+ orig_state_machine(null,createAndGo_disabled,[],[Row,Cols,Type,FrKey]);
+ enabled ->
+ orig_state_machine(null,createAndGo_enabled,[],[Row,Cols,Type,FrKey])
+ end;
+ {value,{_,5}} ->
+ debug_disabled,
+ mnesia:dirty_update_counter(spvcHcEtStat,spvcLib:get_board(hd(Row)),1),
+ orig_state_machine(null,createAndWait,[],[Row,Cols,Type,FrKey]);
+ {value,{_,1}} ->
+ debug_disabled,
+ case spvcDataBase:db_read({spvcObj,list_to_tuple(Row)}) of
+ [] ->
+ ok;
+ Spvc ->
+ case get_link_state(case Row of
+ Row when record(Row,spvcObj) ->
+ case Row#spvcObj.spvcEntry of
+ {If_Value,_,_,_} ->
+ If_Value;
+ {If_Value,_,_} ->
+ If_Value
+ end;
+ Row when record(Row,spvcVcc) ->
+ {If_Value,_,_,_} = Row#spvcVcc.spvcVccEntry,
+ If_Value;
+ Row when record(Row,spvcVpc) ->
+ {If_Value,_,_} = Row#spvcVpc.spvcVpcEntry,
+ If_Value;
+ Row when record(Row,spvcVpcPerm) ->
+ {If_Value,_,_} = Row#spvcVpcPerm.spvcVpcEntry,
+ If_Value;
+ Row when record(Row,spvcVccPerm) ->
+ {If_Value,_,_,_} = Row#spvcVccPerm.spvcVccEntry,
+ If_Value;
+ Row when record(Row,spvcTargetVc) ->
+ {If_Value,_,_} = Row#spvcTargetVc.entry,
+ If_Value;
+ Row when record(Row,spvcTargetVp) ->
+ {If_Value,_} = Row#spvcTargetVp.entry,
+ If_Value;
+ Row when record(Row,pchVc) ->
+ {If_Value,_,_} = Row#pchVc.vclEntry,
+ If_Value;
+ Row when record(Row,pchVp) ->
+ {If_Value,_} = Row#pchVp.vplEntry,
+ If_Value;
+ Row when record(Row,spvcFr) ->
+ {If_Value,_} = Row#spvcFr.spvcFrEntry,
+ If_Value;
+ Row when record(Row,spvcFrPerm) ->
+ {If_Value,_} = Row#spvcFrPerm.spvcFrEntry,
+ If_Value;
+ {If_Value,_,_,_} ->
+ If_Value;
+ {If_Value,_,_} ->
+ If_Value;
+ {If_Value,_} ->
+ If_Value;
+ [If_Value|_] ->
+ If_Value;
+ _ ->
+ error
+ end) of
+ disabled ->
+ orig_state_machine(Spvc#spvcObj.currentState,activate_disabled,Spvc,Cols);
+ enabled ->
+ orig_state_machine(Spvc#spvcObj.currentState,activate_enabled,Spvc,Cols)
+ end
+ end;
+ {value,{_,6}} ->
+ debug_disabled,
+ case spvcDataBase:db_read({spvcObj,list_to_tuple(Row)}) of
+ [] ->
+ ok;
+ Spvc ->
+ mnesia:dirty_update_counter(spvcHcEtStat,spvcLib:get_board(hd(Row)),- 1),
+ orig_state_machine(Spvc#spvcObj.currentState,destroy,Spvc,Cols)
+ end;
+ {value,{_,2}} ->
+ debug_disabled,
+ case spvcDataBase:db_read({spvcObj,list_to_tuple(Row)}) of
+ [] ->
+ mnesia:dirty_update_counter(spvcHcEtStat,spvcLib:get_board(hd(Row)),1),
+ ok;
+ Spvc ->
+ orig_state_machine(Spvc#spvcObj.currentState,not_in_service,Spvc,Cols)
+ end;
+ false ->
+ debug_disabled,
+ Spvc = spvcDataBase:db_read({spvcObj,list_to_tuple(Row)}),
+ CurrentState = Spvc#spvcObj.currentState,
+ NewSpvc = set_attrs(Spvc,Cols),
+ Restart = case {case Row of
+ {_,_,_,_} ->
+ spvcVcc;
+ {_,_,_} ->
+ spvcVpc;
+ {_,_} ->
+ spvcFr;
+ [_,_,_,_] ->
+ spvcVcc;
+ [_,_,_] ->
+ spvcVpc;
+ [_,_] ->
+ spvcFr
+ end,restart} of
+ {spvcVcc,targetAddress} ->
+ 2;
+ {spvcVcc,selectType} ->
+ 3;
+ {spvcVcc,targetVpi} ->
+ 18;
+ {spvcVcc,targetVci} ->
+ 5;
+ {spvcVcc,releaseCause} ->
+ 6;
+ {spvcVcc,releaseDiagnostic} ->
+ 7;
+ {spvcVcc,retryInterval} ->
+ 10;
+ {spvcVcc,retryTimer} ->
+ 11;
+ {spvcVcc,retryThreshold} ->
+ 12;
+ {spvcVcc,retryFailures} ->
+ 13;
+ {spvcVcc,retryLimit} ->
+ 14;
+ {spvcVcc,rowStatus} ->
+ 15;
+ {spvcVcc,restart} ->
+ 9;
+ {spvcVcc,targetSelectType_any} ->
+ 2;
+ {spvcVcc,targetSelectType_required} ->
+ 1;
+ {spvcVpc,targetAddress} ->
+ 2;
+ {spvcVpc,selectType} ->
+ 3;
+ {spvcVpc,targetVpi} ->
+ 15;
+ {spvcVpc,releaseCause} ->
+ 5;
+ {spvcVpc,releaseDiagnostic} ->
+ 6;
+ {spvcVpc,retryInterval} ->
+ 9;
+ {spvcVpc,retryTimer} ->
+ 10;
+ {spvcVpc,retryThreshold} ->
+ 11;
+ {spvcVpc,retryFailures} ->
+ 12;
+ {spvcVpc,retryLimit} ->
+ 13;
+ {spvcVpc,rowStatus} ->
+ 14;
+ {spvcVpc,restart} ->
+ 8;
+ {spvcVpc,targetSelectType_any} ->
+ 2;
+ {spvcVpc,targetSelectType_required} ->
+ 1;
+ {spvcFr,targetAddress} ->
+ 3;
+ {spvcFr,selectType} ->
+ 5;
+ {spvcFr,identifier} ->
+ 6;
+ {spvcFr,targetVpi} ->
+ 7;
+ {spvcFr,targetVci} ->
+ 8;
+ {spvcFr,translation} ->
+ 9;
+ {spvcFr,releaseCause} ->
+ 10;
+ {spvcFr,releaseDiagnostic} ->
+ 11;
+ {spvcFr,operStatus} ->
+ 12;
+ {spvcFr,adminStatus} ->
+ 13;
+ {spvcFr,restart} ->
+ 14;
+ {spvcFr,retryInterval} ->
+ 15;
+ {spvcFr,retryTimer} ->
+ 16;
+ {spvcFr,retryThreshold} ->
+ 17;
+ {spvcFr,retryFailures} ->
+ 18;
+ {spvcFr,retryLimit} ->
+ 19;
+ {spvcFr,lastChange} ->
+ 20;
+ {spvcFr,rowStatus} ->
+ 21
+ end,
+ case lists:keysearch(Restart,1,Cols) of
+ {value,{Restart,1}} ->
+ orig_state_machine(CurrentState,restart,NewSpvc,Cols);
+ _ ->
+ spvcDataBase:db_write(NewSpvc),
+ ok
+ end
+ end,
+ {noError,0}.
+
+restart_spvc(Key) ->
+ debug_disabled,
+ Spvc = spvcDataBase:db_read({spvcObj,Key}),
+ handle_restart_spvc(Spvc#spvcObj.currentState,Spvc),
+ ok.
+
+handle_restart_spvc(rest_in_peace,Spvc) ->
+ debug_disabled,
+ rest_in_peace(restart,Spvc,undefined);
+handle_restart_spvc(_,_) ->
+ ok.
+
+restart_multi_spvcs(Key) ->
+ debug_disabled,
+ Spvc = spvcDataBase:db_read({spvcObj,Key}),
+ handle_restart_multi_spvcs(Spvc#spvcObj.currentState,Spvc),
+ ok.
+
+handle_restart_multi_spvcs(rest_in_peace,Spvc) ->
+ debug_disabled,
+ handle_restart_spvc(rest_in_peace,Spvc);
+handle_restart_multi_spvcs(active,Spvc) ->
+ debug_disabled,
+ active(restart,Spvc,undefined);
+handle_restart_multi_spvcs(outgoing_callproceeding,Spvc) ->
+ debug_disabled,
+ outgoing_callproceeding(restart,Spvc,undefined);
+handle_restart_multi_spvcs(release_at_restart,Spvc) ->
+ debug_disabled,
+ release_at_restart(restart,Spvc,undefined);
+handle_restart_multi_spvcs(wait,Spvc) ->
+ debug_disabled,
+ wait(restart,Spvc,undefined);
+handle_restart_multi_spvcs(rest_in_peace,Spvc) ->
+ debug_disabled,
+ rest_in_peace(restart,Spvc,undefined);
+handle_restart_multi_spvcs(_,_) ->
+ ok.
+
+orig_state_machine(null,createAndGo_enabled,Spvc,Attrs) ->
+ null(createAndGo_enabled,Spvc,Attrs);
+orig_state_machine(null,createAndGo_disabled,Spvc,Attrs) ->
+ null(createAndGo_disabled,Spvc,Attrs);
+orig_state_machine(null,createAndWait,Spvc,Attrs) ->
+ null(createAndWait,Spvc,Attrs);
+orig_state_machine(created,activate_disabled,Spvc,Attrs) ->
+ created(activate_disabled,Spvc,Attrs);
+orig_state_machine(created,activate_enabled,Spvc,Attrs) ->
+ created(activate_enabled,Spvc,Attrs);
+orig_state_machine(created,destroy,Spvc,Attrs) ->
+ created(destroy,Spvc,Attrs);
+orig_state_machine(outgoing_callproceeding,connect_nu,Spvc,Attrs) ->
+ outgoing_callproceeding(connect_nu,Spvc,Attrs);
+orig_state_machine(outgoing_callproceeding,destroy,Spvc,Attrs) ->
+ outgoing_callproceeding(destroy,Spvc,Attrs);
+orig_state_machine(outgoing_callproceeding,restart,Spvc,Attrs) ->
+ outgoing_callproceeding(restart,Spvc,Attrs);
+orig_state_machine(outgoing_callproceeding,release_nu,Spvc,Attrs) ->
+ case get_link_state_intf(case Spvc of
+ Spvc when record(Spvc,spvcObj) ->
+ case Spvc#spvcObj.spvcEntry of
+ {If_Value,_,_,_} ->
+ If_Value;
+ {If_Value,_,_} ->
+ If_Value
+ end;
+ Spvc when record(Spvc,spvcVcc) ->
+ {If_Value,_,_,_} = Spvc#spvcVcc.spvcVccEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcVpc) ->
+ {If_Value,_,_} = Spvc#spvcVpc.spvcVpcEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcVpcPerm) ->
+ {If_Value,_,_} = Spvc#spvcVpcPerm.spvcVpcEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcVccPerm) ->
+ {If_Value,_,_,_} = Spvc#spvcVccPerm.spvcVccEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcTargetVc) ->
+ {If_Value,_,_} = Spvc#spvcTargetVc.entry,
+ If_Value;
+ Spvc when record(Spvc,spvcTargetVp) ->
+ {If_Value,_} = Spvc#spvcTargetVp.entry,
+ If_Value;
+ Spvc when record(Spvc,pchVc) ->
+ {If_Value,_,_} = Spvc#pchVc.vclEntry,
+ If_Value;
+ Spvc when record(Spvc,pchVp) ->
+ {If_Value,_} = Spvc#pchVp.vplEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcFr) ->
+ {If_Value,_} = Spvc#spvcFr.spvcFrEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcFrPerm) ->
+ {If_Value,_} = Spvc#spvcFrPerm.spvcFrEntry,
+ If_Value;
+ {If_Value,_,_,_} ->
+ If_Value;
+ {If_Value,_,_} ->
+ If_Value;
+ {If_Value,_} ->
+ If_Value;
+ [If_Value|_] ->
+ If_Value;
+ _ ->
+ error
+ end,release_nu) of
+ disabled ->
+ outgoing_callproceeding(release_nu_disabled,Spvc,Attrs);
+ enabled ->
+ outgoing_callproceeding(release_nu_enabled,Spvc,Attrs)
+ end;
+orig_state_machine(outgoing_callproceeding,release_comp_nu,Spvc,Attrs) ->
+ case get_link_state_intf(tuple_to_list(Spvc#spvcObj.spvcEntry),release_comp_nu) of
+ disabled ->
+ outgoing_callproceeding(release_comp_nu_disabled,Spvc,Attrs);
+ enabled ->
+ outgoing_callproceeding(release_comp_nu_enabled,Spvc,Attrs)
+ end;
+orig_state_machine(outgoing_callproceeding,not_in_service,Spvc,Attrs) ->
+ outgoing_callproceeding(not_in_service,Spvc,Attrs);
+orig_state_machine(outgoing_callproceeding,activate_enabled,Spvc,Attrs) ->
+ ok;
+orig_state_machine(outgoing_callproceeding,activate_disabled,Spvc,Attrs) ->
+ ok;
+orig_state_machine(active,destroy,Spvc,Attrs) ->
+ active(destroy,Spvc,Attrs);
+orig_state_machine(active,restart,Spvc,Attrs) ->
+ active(restart,Spvc,Attrs);
+orig_state_machine(active,release_nu,Spvc,Attrs) ->
+ case cnhChi:get_link_opstate(case Spvc of
+ Spvc when record(Spvc,spvcObj) ->
+ case Spvc#spvcObj.spvcEntry of
+ {If_Value,_,_,_} ->
+ If_Value;
+ {If_Value,_,_} ->
+ If_Value
+ end;
+ Spvc when record(Spvc,spvcVcc) ->
+ {If_Value,_,_,_} = Spvc#spvcVcc.spvcVccEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcVpc) ->
+ {If_Value,_,_} = Spvc#spvcVpc.spvcVpcEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcVpcPerm) ->
+ {If_Value,_,_} = Spvc#spvcVpcPerm.spvcVpcEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcVccPerm) ->
+ {If_Value,_,_,_} = Spvc#spvcVccPerm.spvcVccEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcTargetVc) ->
+ {If_Value,_,_} = Spvc#spvcTargetVc.entry,
+ If_Value;
+ Spvc when record(Spvc,spvcTargetVp) ->
+ {If_Value,_} = Spvc#spvcTargetVp.entry,
+ If_Value;
+ Spvc when record(Spvc,pchVc) ->
+ {If_Value,_,_} = Spvc#pchVc.vclEntry,
+ If_Value;
+ Spvc when record(Spvc,pchVp) ->
+ {If_Value,_} = Spvc#pchVp.vplEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcFr) ->
+ {If_Value,_} = Spvc#spvcFr.spvcFrEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcFrPerm) ->
+ {If_Value,_} = Spvc#spvcFrPerm.spvcFrEntry,
+ If_Value;
+ {If_Value,_,_,_} ->
+ If_Value;
+ {If_Value,_,_} ->
+ If_Value;
+ {If_Value,_} ->
+ If_Value;
+ [If_Value|_] ->
+ If_Value;
+ _ ->
+ error
+ end) of
+ disabled ->
+ active(release_nu_disabled,Spvc,Attrs);
+ enabled ->
+ active(release_nu_enabled,Spvc,Attrs)
+ end;
+orig_state_machine(active,release_comp_nu,Spvc,Attrs) ->
+ release_at_restart(release_comp_nu,Spvc,Attrs);
+orig_state_machine(active,not_in_service,Spvc,Attrs) ->
+ active(not_in_service,Spvc,Attrs);
+orig_state_machine(active,activate_enabled,Spvc,Attrs) ->
+ ok;
+orig_state_machine(active,activate_disabled,Spvc,Attrs) ->
+ ok;
+orig_state_machine(active,release_incumbent,Spvc,Attrs) ->
+ active(release_incumbent,Spvc,Attrs);
+orig_state_machine(wait,destroy,Spvc,Attrs) ->
+ wait(destroy,Spvc,Attrs);
+orig_state_machine(wait,timeout,Spvc,Attrs) ->
+ wait(timeout,Spvc,Attrs);
+orig_state_machine(wait,restart,Spvc,Attrs) ->
+ wait(restart,Spvc,Attrs);
+orig_state_machine(wait,release_nu,Spvc,Attrs) ->
+ ok;
+orig_state_machine(wait,not_in_service,Spvc,Attrs) ->
+ wait(not_in_service,Spvc,Attrs);
+orig_state_machine(wait,activate_enabled,Spvc,Attrs) ->
+ wait(timeout,Spvc,Attrs);
+orig_state_machine(wait,activate_disabled,Spvc,Attrs) ->
+ ok;
+orig_state_machine(release_at_restart,release_comp_nu,Spvc,Attrs) ->
+ release_at_restart(release_comp_nu,Spvc,Attrs);
+orig_state_machine(release_at_restart,release_nu,Spvc,Attrs) ->
+ release_at_restart(release_nu,Spvc,Attrs);
+orig_state_machine(release_at_restart,connect_nu,Spvc,Attrs) ->
+ release_at_restart(connect_nu,Spvc,Attrs);
+orig_state_machine(release_at_restart,destroy,Spvc,Attrs) ->
+ release_at_restart(destroy,Spvc,Attrs);
+orig_state_machine(release_at_restart,not_in_service,Spvc,Attrs) ->
+ release_at_restart(not_in_service,Spvc,Attrs);
+orig_state_machine(release_at_restart,activate_enabled,Spvc,Attrs) ->
+ ok;
+orig_state_machine(release_at_restart,activate_disabled,Spvc,Attrs) ->
+ ok;
+orig_state_machine(release_request,release_comp_nu,Spvc,Attrs) ->
+ release_request(release_comp_nu,Spvc,Attrs);
+orig_state_machine(release_request,release_nu,Spvc,Attrs) ->
+ release_request(release_nu,Spvc,Attrs);
+orig_state_machine(release_request,destroy,Spvc,Attrs) ->
+ release_request(destroy,Spvc,Attrs);
+orig_state_machine(release_request,not_in_service,Spvc,Attrs) ->
+ release_request(not_in_service,Spvc,Attrs);
+orig_state_machine(release_request,activate_enabled,Spvc,Attrs) ->
+ ok;
+orig_state_machine(release_request,activate_disabled,Spvc,Attrs) ->
+ ok;
+orig_state_machine(rest_in_peace,restart,Spvc,Attrs) ->
+ rest_in_peace(restart,Spvc,Attrs);
+orig_state_machine(rest_in_peace,destroy,Spvc,Attrs) ->
+ rest_in_peace(destroy,Spvc,Attrs);
+orig_state_machine(rest_in_peace,not_in_service,Spvc,Attrs) ->
+ rest_in_peace(not_in_service,Spvc,Attrs);
+orig_state_machine(rest_in_peace,connect_nu,Spvc,Attrs) ->
+ rest_in_peace(connect_nu,Spvc,Attrs);
+orig_state_machine(rest_in_peace,activate_enabled,Spvc,Attrs) ->
+ rest_in_peace(restart,Spvc,Attrs);
+orig_state_machine(rest_in_peace,activate_disabled,Spvc,Attrs) ->
+ ok;
+orig_state_machine(rest_in_peace,release_nu,Spvc,Attrs) ->
+ ok;
+orig_state_machine(rest_in_peace,release_comp_nu,Spvc,Attrs) ->
+ ok;
+orig_state_machine(not_in_service,activate_enabled,Spvc,Attrs) ->
+ not_in_service(activate_enabled,Spvc,Attrs);
+orig_state_machine(not_in_service,activate_disabled,Spvc,Attrs) ->
+ not_in_service(activate_disabled,Spvc,Attrs);
+orig_state_machine(not_in_service,destroy,Spvc,Attrs) ->
+ not_in_service(destroy,Spvc,Attrs);
+orig_state_machine(not_in_service,connect_nu,Spvc,Attrs) ->
+ not_in_service(connect_nu,Spvc,Attrs);
+orig_state_machine(not_in_service,_,Spvc,Attrs) ->
+ ok;
+orig_state_machine(awaiting_switch_over,switch_over,Spvc,[HcId]) ->
+ awaiting_switch_over(switch_over,Spvc,[HcId]);
+orig_state_machine(awaiting_switch_over,activate_disabled,Spvc,Attrs) ->
+ awaiting_switch_over(activate_disabled,Spvc,Attrs);
+orig_state_machine(awaiting_switch_over,destroy,Spvc,Attrs) ->
+ awaiting_switch_over(destroy,Spvc,Attrs);
+orig_state_machine(awaiting_switch_over,restart,Spvc,Attrs) ->
+ awaiting_switch_over(restart,Spvc,Attrs);
+orig_state_machine(awaiting_switch_over,_,Spvc,Attrs) ->
+ ok;
+orig_state_machine(undefined,destroy,Spvc,Attrs) ->
+ rest_in_peace(destroy,Spvc,Attrs).
+
+null(createAndGo_enabled,[],[Row,Cols,Type,FrKey]) ->
+ debug_disabled,
+ Key = list_to_tuple(Row),
+ Spvc = #spvcObj{spvcEntry = Key,
+ spvcApplication = Type,
+ spvcRowStatus = 1,
+ spvcFrKey = FrKey},
+ Spvc1 = set_attrs(Spvc,Cols),
+ {Spvc2,HcId,Setup} = new_state_outgoing_call_proceeding(Spvc1),
+ pchTpUpdate(case Key of
+ {IfIndex_Value,Vpi_Value,Vci_Value,_} ->
+ {IfIndex_Value,Vpi_Value,Vci_Value};
+ {IfIndex_Value,Vpi_Value,_} ->
+ {IfIndex_Value,Vpi_Value};
+ [IfIndex_Value,Vpi_Value,Vci_Value,_] ->
+ [IfIndex_Value,Vpi_Value,Vci_Value];
+ [IfIndex_Value,Vpi_Value,_] ->
+ [IfIndex_Value,Vpi_Value]
+ end),
+ spvcDataBase:db_write(Spvc2),
+ setup(HcId,Setup,Spvc2);
+null(createAndGo_disabled,[],[Row,Cols,Type,FrKey]) ->
+ debug_disabled,
+ case get_link_state_intf(Row,null_createAndGo_disabled) of
+ disabled ->
+ Key = list_to_tuple(Row),
+ Spvc = #spvcObj{spvcEntry = Key,
+ spvcRowStatus = 1,
+ currentState = rest_in_peace,
+ spvcApplication = Type,
+ spvcFrKey = FrKey},
+ Spvc1 = set_attrs(Spvc,Cols),
+ pchTpUpdate(case Key of
+ {IfIndex_Value,Vpi_Value,Vci_Value,_} ->
+ {IfIndex_Value,Vpi_Value,Vci_Value};
+ {IfIndex_Value,Vpi_Value,_} ->
+ {IfIndex_Value,Vpi_Value};
+ [IfIndex_Value,Vpi_Value,Vci_Value,_] ->
+ [IfIndex_Value,Vpi_Value,Vci_Value];
+ [IfIndex_Value,Vpi_Value,_] ->
+ [IfIndex_Value,Vpi_Value]
+ end),
+ set_call_failure_data_and_send_spvcFailingAlarm(Key),
+ spvcDataBase:db_write(Spvc1);
+ enabled ->
+ null(createAndGo_enabled,[],[Row,Cols,Type,FrKey])
+ end;
+null(createAndWait,[],[Row,Cols,Type,FrKey]) ->
+ debug_disabled,
+ Key = list_to_tuple(Row),
+ Spvc = #spvcObj{spvcEntry = Key,
+ spvcApplication = Type,
+ spvcFrKey = FrKey},
+ Spvc1 = new_state_created(Spvc,Cols),
+ pchTpUpdate(case Key of
+ {IfIndex_Value,Vpi_Value,Vci_Value,_} ->
+ {IfIndex_Value,Vpi_Value,Vci_Value};
+ {IfIndex_Value,Vpi_Value,_} ->
+ {IfIndex_Value,Vpi_Value};
+ [IfIndex_Value,Vpi_Value,Vci_Value,_] ->
+ [IfIndex_Value,Vpi_Value,Vci_Value];
+ [IfIndex_Value,Vpi_Value,_] ->
+ [IfIndex_Value,Vpi_Value]
+ end),
+ spvcDataBase:db_write(Spvc1).
+
+pchTpUpdate({If,Vpi,Vci}) ->
+ spvcDataBase:db_write(#spvcVcDyn{vclEntry = {If,Vpi,Vci},
+ vclCcIdentifier = 0});
+pchTpUpdate({If,Vpi}) ->
+ spvcDataBase:db_write(#spvcVpDyn{vplEntry = {If,Vpi},
+ vplCcIdentifier = 0}).
+
+created(activate_enabled,Spvc,Attrs) ->
+ debug_disabled,
+ Spvc1 = set_attrs(Spvc,Attrs),
+ Spvc2 = Spvc1#spvcObj{spvcRowStatus = 1},
+ {Spvc3,HcId,HciMsg} = new_state_outgoing_call_proceeding(Spvc1),
+ spvcDataBase:db_write(Spvc3),
+ setup(HcId,HciMsg,Spvc3);
+created(activate_disabled,Spvc,Attrs) ->
+ debug_disabled,
+ Spvc1 = set_attrs(Spvc,Attrs),
+ Spvc2 = Spvc1#spvcObj{currentState = rest_in_peace,
+ spvcRowStatus = 1},
+ update_state(Spvc,4),
+ spvcDataBase:db_write(Spvc2);
+created(destroy,Spvc,Attrs) ->
+ debug_disabled,
+ clear(Spvc).
+
+outgoing_callproceeding(connect_nu,Spvc,[HcId,Connect]) ->
+ debug_disabled,
+ Spvc1 = new_state_active(Spvc),
+ case Spvc#spvcObj.spvcTargetSelectType of
+ 2 ->
+ Cpn = Connect#hci_connect.hci_cpn_soft,
+ TargetVpi = Cpn#hci_cpn_soft.hci_soft_vpi,
+ TargetVci = Cpn#hci_cpn_soft.hci_soft_vci,
+ TargetDlci = Cpn#hci_cpn_soft.hci_soft_dlci,
+ Spvc2 = Spvc1#spvcObj{spvcTargetSelectType = 1,
+ spvcTargetVpi = TargetVpi,
+ spvcTargetVci = TargetVci,
+ spvcTargetDlci = TargetDlci},
+ spvcDataBase:db_write(Spvc2);
+ 1 ->
+ spvcDataBase:db_write(ets,Spvc1);
+ 2 ->
+ Cpn = Connect#hci_connect.hci_cpn_soft,
+ TargetVpi = Cpn#hci_cpn_soft.hci_soft_vpi,
+ TargetDlci = Cpn#hci_cpn_soft.hci_soft_dlci,
+ Spvc2 = Spvc1#spvcObj{spvcTargetSelectType = 1,
+ spvcTargetVpi = TargetVpi,
+ spvcTargetDlci = TargetDlci},
+ spvcDataBase:db_write(Spvc2);
+ 1 ->
+ spvcDataBase:db_write(ets,Spvc1)
+ end,
+ Key = Spvc#spvcObj.spvcEntry,
+ PchKey = case Key of
+ {IfIndex_Value,Vpi_Value,Vci_Value,_} ->
+ {IfIndex_Value,Vpi_Value,Vci_Value};
+ {IfIndex_Value,Vpi_Value,_} ->
+ {IfIndex_Value,Vpi_Value};
+ [IfIndex_Value,Vpi_Value,Vci_Value,_] ->
+ [IfIndex_Value,Vpi_Value,Vci_Value];
+ [IfIndex_Value,Vpi_Value,_] ->
+ [IfIndex_Value,Vpi_Value]
+ end,
+ SpvcDyn = case PchKey of
+ {_,_,_} ->
+ case spvcDataBase:db_read({spvcVcDyn,PchKey}) of
+ [] ->
+ #spvcVcDyn{vclEntry = PchKey,
+ vclCcIdentifier = 0,
+ vclConnId = HcId};
+ SpvcVcDyn ->
+ SpvcVcDyn#spvcVcDyn{vclEntry = PchKey,
+ vclConnId = HcId}
+ end;
+ {_,_} ->
+ case spvcDataBase:db_read({spvcVpDyn,PchKey}) of
+ [] ->
+ #spvcVpDyn{vplEntry = PchKey,
+ vplCcIdentifier = 0,
+ vplConnId = HcId};
+ SpvcVpDyn ->
+ SpvcVpDyn#spvcVpDyn{vplEntry = PchKey,
+ vplConnId = HcId}
+ end
+ end,
+ spvcDataBase:db_write(SpvcDyn),
+ CbCValue = get(no_of_rerouting),
+ CbC = case CbCValue of
+ undefined ->
+ debug_disabled,
+ 0;
+ _ ->
+ CbCValue
+ end,
+ SpvcDyn2 = case Key of
+ {_,_,_,_} ->
+ case spvcDataBase:db_read({spvcVccDyn,Key}) of
+ [] ->
+ #spvcVccDyn{spvcVccEntry = Key,
+ crankBackCounter = CbC};
+ SpvcVccDyn ->
+ SpvcVccDyn#spvcVccDyn{spvcVccEntry = Key,
+ crankBackCounter = CbC}
+ end;
+ {_,_,_} ->
+ case spvcDataBase:db_read({spvcVpcDyn,Key}) of
+ [] ->
+ #spvcVpcDyn{spvcVpcEntry = Key,
+ crankBackCounter = CbC};
+ SpvcVpcDyn ->
+ SpvcVpcDyn#spvcVpcDyn{spvcVpcEntry = Key,
+ crankBackCounter = CbC}
+ end
+ end,
+ spvcDataBase:db_write(SpvcDyn2),
+ NewPch = spvcDataBase:db_read({pch,PchKey}),
+ spvcLib:clear_spvcStillTryingAlarm(Key),
+ case Spvc#spvcObj.spvcFrKey of
+ undefined ->
+ spvcLib:ilmi_change(PchKey,1),
+ ok;
+ FrEndPoint ->
+ SpvcFrObj = spvcDataBase:db_read({spvcFrPerm,FrEndPoint}),
+ NewSpvcFrObj = SpvcFrObj#spvcFrPerm{spvcFrConnect = 3},
+ spvcDataBase:db_write(NewSpvcFrObj),
+ spvcLib:ilmi_change(PchKey,1),
+ set_fr_atm_iw_admin_state(FrEndPoint,up,Spvc)
+ end;
+outgoing_callproceeding(restart,Spvc,_) ->
+ Key = Spvc#spvcObj.spvcEntry,
+ debug_disabled,
+ Spvc1 = new_state_release_at_restart(Spvc),
+ spvcDataBase:db_write(ets,Spvc1),
+ spvcLib:clear_spvcStillTryingAlarm(Key);
+outgoing_callproceeding(release_nu_enabled,Spvc,[HcId,HciMsg]) ->
+ debug_disabled,
+ Spvc1 = new_state_rest_in_peace_or_wait(Spvc,[HcId,HciMsg]),
+ [CcCause|_] = HciMsg#hci_release.hci_cause_list,
+ Spvc2 = Spvc1#spvcObj{spvcLastReleaseCause = CcCause#hci_cause.hci_cause_value,
+ spvcLastReleaseDiagnostic = CcCause#hci_cause.hci_diagnostics_list},
+ spvcDataBase:db_write(ets,Spvc2);
+outgoing_callproceeding(release_nu_disabled,Spvc,[HcId,Release]) ->
+ debug_disabled,
+ Spvc1 = new_state_rest_in_peace(Spvc),
+ [CcCause|_] = Release#hci_release.hci_cause_list,
+ Spvc2 = Spvc1#spvcObj{spvcLastReleaseCause = CcCause#hci_cause.hci_cause_value,
+ spvcLastReleaseDiagnostic = CcCause#hci_cause.hci_diagnostics_list},
+ spvcDataBase:db_write(ets,Spvc2),
+ spvcLib:clear_spvcStillTryingAlarm(Spvc#spvcObj.spvcEntry);
+outgoing_callproceeding(release_comp_nu_enabled,Spvc,[HcId,Release_complete]) ->
+ debug_disabled,
+ Spvc1 = new_state_rest_in_peace_or_wait(Spvc,[HcId,Release_complete]),
+ spvcDataBase:db_write(ets,Spvc1);
+outgoing_callproceeding(release_comp_nu_disabled,Spvc,[HcId,Release_complete]) ->
+ debug_disabled,
+ Key = Spvc#spvcObj.spvcEntry,
+ Spvc1 = new_state_rest_in_peace(Spvc),
+ spvcDataBase:db_write(ets,Spvc1),
+ spvcLib:clear_spvcStillTryingAlarm(Key);
+outgoing_callproceeding(destroy,Spvc,_) ->
+ debug_disabled,
+ Key = Spvc#spvcObj.spvcEntry,
+ Spvc1 = new_state_release_request(Spvc),
+ spvcDataBase:db_write(ets,Spvc1),
+ SpvcTpToHcId = read_spvcTpToHcId(Key),
+ Release = spvcEncode:encode_cc_release(31),
+ spvcManager:release_un(a_side,SpvcTpToHcId#spvcTpToHcId.hcId,Release,Spvc1),
+ spvcLib:clear_spvcStillTryingAlarm(Key);
+outgoing_callproceeding(not_in_service,Spvc,_) ->
+ debug_disabled,
+ Key = Spvc#spvcObj.spvcEntry,
+ Spvc1 = new_state_not_in_service(Spvc),
+ spvcDataBase:db_write(Spvc1),
+ SpvcTpToHcId = read_spvcTpToHcId(Key),
+ Release = spvcEncode:encode_cc_release(31),
+ spvcManager:release_un(a_side,SpvcTpToHcId#spvcTpToHcId.hcId,Release,Spvc1),
+ spvcLib:clear_spvcStillTryingAlarm(Key).
+
+active(restart,Spvc,_) ->
+ debug_disabled,
+ Key = Spvc#spvcObj.spvcEntry,
+ Spvc1 = new_state_release_at_restart(Spvc),
+ spvcDataBase:db_write(ets,Spvc1),
+ PchKey = case Key of
+ {IfIndex_Value,Vpi_Value,Vci_Value,_} ->
+ {IfIndex_Value,Vpi_Value,Vci_Value};
+ {IfIndex_Value,Vpi_Value,_} ->
+ {IfIndex_Value,Vpi_Value};
+ [IfIndex_Value,Vpi_Value,Vci_Value,_] ->
+ [IfIndex_Value,Vpi_Value,Vci_Value];
+ [IfIndex_Value,Vpi_Value,_] ->
+ [IfIndex_Value,Vpi_Value]
+ end,
+ spvcLib:ilmi_change(PchKey,2),
+ case Spvc#spvcObj.spvcFrKey of
+ undefined ->
+ ok;
+ FrEndPoint ->
+ set_fr_atm_iw_admin_state(FrEndPoint,down,Spvc)
+ end;
+active(release_nu_enabled,Spvc,[HcId,Release]) ->
+ debug_disabled,
+ Key = Spvc#spvcObj.spvcEntry,
+ Spvc1 = new_state_rest_in_peace_or_wait(Spvc,[HcId,Release]),
+ [CcCause|_] = Release#hci_release.hci_cause_list,
+ Spvc2 = Spvc1#spvcObj{spvcLastReleaseCause = CcCause#hci_cause.hci_cause_value,
+ spvcLastReleaseDiagnostic = CcCause#hci_cause.hci_diagnostics_list},
+ spvcDataBase:db_write(ets,Spvc2),
+ PchKey = case Key of
+ {IfIndex_Value,Vpi_Value,Vci_Value,_} ->
+ {IfIndex_Value,Vpi_Value,Vci_Value};
+ {IfIndex_Value,Vpi_Value,_} ->
+ {IfIndex_Value,Vpi_Value};
+ [IfIndex_Value,Vpi_Value,Vci_Value,_] ->
+ [IfIndex_Value,Vpi_Value,Vci_Value];
+ [IfIndex_Value,Vpi_Value,_] ->
+ [IfIndex_Value,Vpi_Value]
+ end,
+ spvcLib:ilmi_change(PchKey,2),
+ case Spvc#spvcObj.spvcFrKey of
+ undefined ->
+ ok;
+ FrEndPoint ->
+ set_fr_atm_iw_admin_state(FrEndPoint,down,Spvc)
+ end;
+active(release_nu_disabled,Spvc,[HcId,Release]) ->
+ debug_disabled,
+ case get_link_state_intf(case Spvc of
+ Spvc when record(Spvc,spvcObj) ->
+ case Spvc#spvcObj.spvcEntry of
+ {If_Value,_,_,_} ->
+ If_Value;
+ {If_Value,_,_} ->
+ If_Value
+ end;
+ Spvc when record(Spvc,spvcVcc) ->
+ {If_Value,_,_,_} = Spvc#spvcVcc.spvcVccEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcVpc) ->
+ {If_Value,_,_} = Spvc#spvcVpc.spvcVpcEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcVpcPerm) ->
+ {If_Value,_,_} = Spvc#spvcVpcPerm.spvcVpcEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcVccPerm) ->
+ {If_Value,_,_,_} = Spvc#spvcVccPerm.spvcVccEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcTargetVc) ->
+ {If_Value,_,_} = Spvc#spvcTargetVc.entry,
+ If_Value;
+ Spvc when record(Spvc,spvcTargetVp) ->
+ {If_Value,_} = Spvc#spvcTargetVp.entry,
+ If_Value;
+ Spvc when record(Spvc,pchVc) ->
+ {If_Value,_,_} = Spvc#pchVc.vclEntry,
+ If_Value;
+ Spvc when record(Spvc,pchVp) ->
+ {If_Value,_} = Spvc#pchVp.vplEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcFr) ->
+ {If_Value,_} = Spvc#spvcFr.spvcFrEntry,
+ If_Value;
+ Spvc when record(Spvc,spvcFrPerm) ->
+ {If_Value,_} = Spvc#spvcFrPerm.spvcFrEntry,
+ If_Value;
+ {If_Value,_,_,_} ->
+ If_Value;
+ {If_Value,_,_} ->
+ If_Value;
+ {If_Value,_} ->
+ If_Value;
+ [If_Value|_] ->
+ If_Value;
+ _ ->
+ error
+ end,active_release_nu_disabled) of
+ disabled ->
+ debug_disabled,
+ Key = Spvc#spvcObj.spvcEntry,
+ Spvc1 = Spvc#spvcObj{currentState = rest_in_peace},
+ [CcCause|_] = Release#hci_release.hci_cause_list,
+ Spvc2 = Spvc1#spvcObj{spvcLastReleaseCause = CcCause#hci_cause.hci_cause_value,
+ spvcLastReleaseDiagnostic = CcCause#hci_cause.hci_diagnostics_list},
+ PchKey = case Key of
+ {IfIndex_Value,Vpi_Value,Vci_Value,_} ->
+ {IfIndex_Value,Vpi_Value,Vci_Value};
+ {IfIndex_Value,Vpi_Value,_} ->
+ {IfIndex_Value,Vpi_Value};
+ [IfIndex_Value,Vpi_Value,Vci_Value,_] ->
+ [IfIndex_Value,Vpi_Value,Vci_Value];
+ [IfIndex_Value,Vpi_Value,_] ->
+ [IfIndex_Value,Vpi_Value]
+ end,
+ spvcLib:ilmi_change(PchKey,2),
+ update_state(Spvc,4),
+ spvcDataBase:db_write(ets,Spvc2),
+ case Spvc#spvcObj.spvcFrKey of
+ undefined ->
+ ok;
+ FrEndPoint ->
+ set_fr_atm_iw_admin_state(FrEndPoint,down,Spvc)
+ end;
+ enabled ->
+ active(release_nu_enabled,Spvc,[HcId,Release])
+ end;
+active(destroy,Spvc,_) ->
+ debug_disabled,
+ Key = Spvc#spvcObj.spvcEntry,
+ Spvc1 = new_state_release_request(Spvc),
+ spvcDataBase:db_write(ets,Spvc1),
+ PchKey = case Key of
+ {IfIndex_Value,Vpi_Value,Vci_Value,_} ->
+ {IfIndex_Value,Vpi_Value,Vci_Value};
+ {IfIndex_Value,Vpi_Value,_} ->
+ {IfIndex_Value,Vpi_Value};
+ [IfIndex_Value,Vpi_Value,Vci_Value,_] ->
+ [IfIndex_Value,Vpi_Value,Vci_Value];
+ [IfIndex_Value,Vpi_Value,_] ->
+ [IfIndex_Value,Vpi_Value]
+ end,
+ spvcLib:ilmi_change(PchKey,2),
+ SpvcTpToHcId = read_spvcTpToHcId(Key),
+ Release = spvcEncode:encode_cc_release(31),
+ spvcManager:release_un(a_side,SpvcTpToHcId#spvcTpToHcId.hcId,Release,Spvc);
+active(not_in_service,Spvc,_) ->
+ debug_disabled,
+ Key = Spvc#spvcObj.spvcEntry,
+ Spvc1 = new_state_not_in_service(Spvc),
+ spvcDataBase:db_write(Spvc1),
+ PchKey = case Key of
+ {IfIndex_Value,Vpi_Value,Vci_Value,_} ->
+ {IfIndex_Value,Vpi_Value,Vci_Value};
+ {IfIndex_Value,Vpi_Value,_} ->
+ {IfIndex_Value,Vpi_Value};
+ [IfIndex_Value,Vpi_Value,Vci_Value,_] ->
+ [IfIndex_Value,Vpi_Value,Vci_Value];
+ [IfIndex_Value,Vpi_Value,_] ->
+ [IfIndex_Value,Vpi_Value]
+ end,
+ spvcLib:ilmi_change(PchKey,2),
+ SpvcTpToHcId = read_spvcTpToHcId(Key),
+ Release = spvcEncode:encode_cc_release(31),
+ spvcManager:release_un(a_side,SpvcTpToHcId#spvcTpToHcId.hcId,Release,Spvc1),
+ case Spvc#spvcObj.spvcFrKey of
+ undefined ->
+ ok;
+ FrEndPoint ->
+ set_fr_atm_iw_admin_state(FrEndPoint,down,Spvc)
+ end;
+active(release_incumbent,Spvc,[Release]) ->
+ debug_disabled,
+ Key = Spvc#spvcObj.spvcEntry,
+ Spvc1 = new_state_awaiting_switch_over(Spvc),
+ spvcDataBase:db_write(Spvc1),
+ SpvcTpToHcId = read_spvcTpToHcId(Key),
+ spvcManager:release_un(a_side,SpvcTpToHcId#spvcTpToHcId.hcId,Release,Spvc1).
+
+read_spvcTpToHcId({If,Vpi,Vci,Leaf}) ->
+ spvcDataBase:db_read({spvcTpToHcId,{orig,If,Vpi,Vci,Leaf}});
+read_spvcTpToHcId({If,Vpi,Leaf}) ->
+ spvcDataBase:db_read({spvcTpToHcId,{orig,If,Vpi,Leaf}}).
+
+release_request(release_nu,Spvc,[HcId,Release]) ->
+ debug_disabled,
+ clear(Spvc);
+release_request(release_comp_nu,Spvc,[HcId,Release_comp]) ->
+ debug_disabled,
+ clear(Spvc);
+release_request(destroy,Spvc,_) ->
+ debug_disabled,
+ case Spvc#spvcObj.spvcEntry of
+ {If,Vpi,Vci,Leaf} ->
+ case spvcDataBase:db_read({spvcTpToHcId,{orig,If,Vpi,Vci,Leaf}}) of
+ SpvcTpToHcId ->
+ Release = spvcEncode:encode_cc_release(31),
+ spvcManager:release_un(a_side,SpvcTpToHcId#spvcTpToHcId.hcId,Release,Spvc),
+ clear(Spvc);
+ _ ->
+ ok
+ end;
+ {If,Vpi,Leaf} ->
+ case spvcDataBase:db_read({spvcTpToHcId,{orig,If,Vpi,Leaf}}) of
+ SpvcTpToHcId ->
+ Release = spvcEncode:encode_cc_release(31),
+ spvcManager:release_un(a_side,SpvcTpToHcId#spvcTpToHcId.hcId,Release,Spvc),
+ clear(Spvc);
+ _ ->
+ ok
+ end
+ end,
+ ok;
+release_request(not_in_service,Spvc,_) ->
+ debug_disabled,
+ ok.
+
+release_at_restart(release_nu,Spvc,[HcId,Release]) ->
+ debug_disabled,
+ {Spvc1,NewHcId,Setup} = new_state_outgoing_call_proceeding(Spvc),
+ [CcCause|_] = Release#hci_release.hci_cause_list,
+ Spvc2 = Spvc1#spvcObj{spvcLastReleaseCause = CcCause#hci_cause.hci_cause_value,
+ spvcLastReleaseDiagnostic = CcCause#hci_cause.hci_diagnostics_list},
+ spvcDataBase:db_write(ets,Spvc2),
+ timer:sleep(500),
+ setup(NewHcId,Setup,Spvc2);
+release_at_restart(release_comp_nu,Spvc,[HcId,Release_complete]) ->
+ debug_disabled,
+ {Spvc1,NewHcId,Setup} = new_state_outgoing_call_proceeding(Spvc),
+ Spvc2 = Spvc1#spvcObj{spvcLastReleaseCause = 31,
+ spvcLastReleaseDiagnostic = []},
+ spvcDataBase:db_write(ets,Spvc2),
+ timer:sleep(500),
+ setup(NewHcId,Setup,Spvc1);
+release_at_restart(connect_nu,Spvc,_) ->
+ debug_disabled,
+ ok;
+release_at_restart(destroy,Spvc,_) ->
+ debug_disabled,
+ Spvc1 = new_state_release_request(Spvc),
+ spvcDataBase:db_write(ets,Spvc1);
+release_at_restart(restart,Spvc,_) ->
+ debug_disabled,
+ Spvc1 = new_state_release_at_restart(Spvc);
+release_at_restart(not_in_service,Spvc,_) ->
+ debug_disabled,
+ Spvc1 = new_state_not_in_service(Spvc),
+ spvcDataBase:db_write(Spvc1).
+
+wait(timeout,Spvc,_) ->
+ debug_disabled,
+ {Spvc1,HcId,Setup} = new_state_outgoing_call_proceeding(Spvc),
+ spvcDataBase:db_write(ets,Spvc1),
+ setup(HcId,Setup,Spvc1);
+wait(destroy,Spvc,_) ->
+ debug_disabled,
+ spvcLib:clear_spvcStillTryingAlarm(Spvc#spvcObj.spvcEntry),
+ clear(Spvc);
+wait(restart,Spvc,_) ->
+ debug_disabled,
+ {Spvc1,HcId,Setup} = new_state_outgoing_call_proceeding(Spvc#spvcObj{spvcRetryFailures = 0}),
+ spvcDataBase:db_write(ets,Spvc1),
+ spvcReestablishTimer:cancel(Spvc#spvcObj.spvcEntry),
+ spvcLib:clear_spvcStillTryingAlarm(Spvc#spvcObj.spvcEntry),
+ setup(HcId,Setup,Spvc1);
+wait(not_in_service,Spvc,_) ->
+ debug_disabled,
+ Spvc1 = new_state_not_in_service(Spvc),
+ spvcDataBase:db_write(Spvc1),
+ spvcLib:clear_spvcStillTryingAlarm(Spvc#spvcObj.spvcEntry).
+
+rest_in_peace(restart,Spvc,_) ->
+ debug_disabled,
+ {Spvc1,HcId,Setup} = new_state_outgoing_call_proceeding(Spvc#spvcObj{spvcRetryFailures = 0}),
+ spvcDataBase:db_write(ets,Spvc1),
+ setup(HcId,Setup,Spvc1),
+ sccmManager:cast_to_sccm(spvcLib:get_cp(om_node),spvcLib,clear_spvcFailingAlarm,[spvcLib:get_membership(node())]);
+rest_in_peace(destroy,Spvc,_) ->
+ debug_disabled,
+ sccmManager:cast_to_sccm(spvcLib:get_cp(om_node),spvcLib,clear_spvcFailingAlarm,[spvcLib:get_membership(node())]),
+ clear(Spvc);
+rest_in_peace(connect_nu,Spvc,_) ->
+ debug_disabled,
+ Key = Spvc#spvcObj.spvcEntry,
+ SpvcTpToHcId = read_spvcTpToHcId(Key),
+ Release = spvcEncode:encode_cc_release(31),
+ spvcManager:release_un(b_side,SpvcTpToHcId#spvcTpToHcId.hcId,Release,Spvc);
+rest_in_peace(not_in_service,Spvc,_) ->
+ debug_disabled,
+ Spvc1 = new_state_not_in_service(Spvc),
+ spvcDataBase:db_write(Spvc1),
+ sccmManager:cast_to_sccm(spvcLib:get_cp(om_node),spvcLib,clear_spvcFailingAlarm,[spvcLib:get_membership(node())]).
+
+not_in_service(activate_enabled,Spvc,_) ->
+ debug_disabled,
+ {Spvc1,HcId,Setup} = new_state_outgoing_call_proceeding(Spvc#spvcObj{spvcRetryFailures = 0}),
+ spvcDataBase:db_write(Spvc1#spvcObj{spvcRowStatus = 1}),
+ setup(HcId,Setup,Spvc1);
+not_in_service(activate_disabled,Spvc,_) ->
+ debug_disabled,
+ Spvc1 = new_state_rest_in_peace(Spvc),
+ spvcDataBase:db_write(Spvc1#spvcObj{spvcRowStatus = 1});
+not_in_service(connect_nu,Spvc,_) ->
+ debug_disabled,
+ Spvc1 = new_state_rest_in_peace(Spvc),
+ spvcDataBase:db_write(Spvc1#spvcObj{spvcRowStatus = 1}),
+ Key = Spvc#spvcObj.spvcEntry,
+ SpvcTpToHcId = read_spvcTpToHcId(Key),
+ Release = spvcEncode:encode_cc_release(31),
+ spvcManager:release_un(b_side,SpvcTpToHcId#spvcTpToHcId.hcId,Release,Spvc1);
+not_in_service(destroy,Spvc,_) ->
+ debug_disabled,
+ clear(Spvc).
+
+awaiting_switch_over(switch_over,Spvc,[HcId]) ->
+ debug_disabled,
+ Spvc1 = Spvc#spvcObj{currentState = active},
+ Index = Spvc#spvcObj.spvcEntry,
+ TpIndex = create_tp_index(Index),
+ spvcDataBase:db_write(Spvc1),
+ ets:insert(spvcTpToHcId,#spvcTpToHcId{tpEntry = TpIndex,
+ hcId = HcId}),
+ ets:insert(spvcHcIdToTp,#spvcHcIdToTp{tpEntry = TpIndex,
+ hcId = HcId}),
+ update_dyn_table_hcid(Index,HcId),
+ ok;
+awaiting_switch_over(activate_disabled,Spvc,Attrs) ->
+ Spvc1 = new_state_rest_in_peace(Spvc),
+ spvcDataBase:db_write(Spvc1),
+ ok;
+awaiting_switch_over(restart,Spvc,Attrs) ->
+ debug_disabled,
+ Key = Spvc#spvcObj.spvcEntry,
+ Spvc1 = new_state_release_at_restart(Spvc),
+ spvcDataBase:db_write(ets,Spvc1),
+ PchKey = case Key of
+ {IfIndex_Value,Vpi_Value,Vci_Value,_} ->
+ {IfIndex_Value,Vpi_Value,Vci_Value};
+ {IfIndex_Value,Vpi_Value,_} ->
+ {IfIndex_Value,Vpi_Value};
+ [IfIndex_Value,Vpi_Value,Vci_Value,_] ->
+ [IfIndex_Value,Vpi_Value,Vci_Value];
+ [IfIndex_Value,Vpi_Value,_] ->
+ [IfIndex_Value,Vpi_Value]
+ end,
+ spvcLib:ilmi_change(PchKey,2),
+ case Spvc#spvcObj.spvcFrKey of
+ undefined ->
+ ok;
+ FrEndPoint ->
+ set_fr_atm_iw_admin_state(FrEndPoint,down,Spvc)
+ end;
+awaiting_switch_over(destroy,Spvc,Attrs) ->
+ clear(Spvc).
+
+create_tp_index({If,Vpi,Vci,Leaf}) ->
+ list_to_tuple([orig,If,Vpi,Vci,Leaf]);
+create_tp_index({If,Vpi,Leaf}) ->
+ list_to_tuple([orig,If,Vpi,Leaf]).
+
+update_dyn_table_hcid({If,Vpi,Vci,Leaf},HcId) ->
+ [VcDyn] = ets:lookup(spvcVcDyn,{If,Vpi,Vci}),
+ ets:insert(spvcVcDyn,VcDyn#spvcVcDyn{vclConnId = HcId});
+update_dyn_table_hcid({If,Vpi,Leaf},HcId) ->
+ [VpDyn] = ets:lookup(spvcVpDyn,{If,Vpi}),
+ ets:insert(spvcVpDyn,VpDyn#spvcVpDyn{vplConnId = HcId}).
+
+new_state_outgoing_call_proceeding(Spvc) ->
+ debug_disabled,
+ Spvc1 = Spvc#spvcObj{spvcRowStatus = 1,
+ currentState = outgoing_callproceeding},
+ Key = Spvc1#spvcObj.spvcEntry,
+ update_state(Spvc,outgoing_callproceeding),
+ PchKey = case Key of
+ {IfIndex_Value,Vpi_Value,Vci_Value,_} ->
+ {IfIndex_Value,Vpi_Value,Vci_Value};
+ {IfIndex_Value,Vpi_Value,_} ->
+ {IfIndex_Value,Vpi_Value};
+ [IfIndex_Value,Vpi_Value,Vci_Value,_] ->
+ [IfIndex_Value,Vpi_Value,Vci_Value];
+ [IfIndex_Value,Vpi_Value,_] ->
+ [IfIndex_Value,Vpi_Value]
+ end,
+ {FwdAtdIndex,BwdAtdIndex} = case PchKey of
+ {_,_,_} ->
+ Vc = spvcDataBase:db_read({pchVc,PchKey}),
+ {Vc#pchVc.vclReceiveTrafficDescrIndex,Vc#pchVc.vclTransmitTrafficDescrIndex};
+ {_,_} ->
+ Vp = spvcDataBase:db_read({pchVp,PchKey}),
+ {Vp#pchVp.vplReceiveTrafficDescrIndex,Vp#pchVp.vplTransmitTrafficDescrIndex}
+ end,
+ FwdPchAtd = spvcDataBase:db_read({pchAtd,FwdAtdIndex}),
+ BwdPchAtd = spvcDataBase:db_read({pchAtd,BwdAtdIndex}),
+ Row = tuple_to_list(Key),
+ HcId = spvcLib:create_hcid(Row,case Row of
+ Row when record(Row,spvcObj) ->
+ case Row#spvcObj.spvcEntry of
+ {If_Value,_,_,_} ->
+ If_Value;
+ {If_Value,_,_} ->
+ If_Value
+ end;
+ Row when record(Row,spvcVcc) ->
+ {If_Value,_,_,_} = Row#spvcVcc.spvcVccEntry,
+ If_Value;
+ Row when record(Row,spvcVpc) ->
+ {If_Value,_,_} = Row#spvcVpc.spvcVpcEntry,
+ If_Value;
+ Row when record(Row,spvcVpcPerm) ->
+ {If_Value,_,_} = Row#spvcVpcPerm.spvcVpcEntry,
+ If_Value;
+ Row when record(Row,spvcVccPerm) ->
+ {If_Value,_,_,_} = Row#spvcVccPerm.spvcVccEntry,
+ If_Value;
+ Row when record(Row,spvcTargetVc) ->
+ {If_Value,_,_} = Row#spvcTargetVc.entry,
+ If_Value;
+ Row when record(Row,spvcTargetVp) ->
+ {If_Value,_} = Row#spvcTargetVp.entry,
+ If_Value;
+ Row when record(Row,pchVc) ->
+ {If_Value,_,_} = Row#pchVc.vclEntry,
+ If_Value;
+ Row when record(Row,pchVp) ->
+ {If_Value,_} = Row#pchVp.vplEntry,
+ If_Value;
+ Row when record(Row,spvcFr) ->
+ {If_Value,_} = Row#spvcFr.spvcFrEntry,
+ If_Value;
+ Row when record(Row,spvcFrPerm) ->
+ {If_Value,_} = Row#spvcFrPerm.spvcFrEntry,
+ If_Value;
+ {If_Value,_,_,_} ->
+ If_Value;
+ {If_Value,_,_} ->
+ If_Value;
+ {If_Value,_} ->
+ If_Value;
+ [If_Value|_] ->
+ If_Value;
+ _ ->
+ error
+ end),
+ Setup = spvcEncode:encode_cc_setup(Row,Spvc1,FwdPchAtd,BwdPchAtd),
+ debug_disabled,
+ debug_disabled,
+ debug_disabled,
+ {Spvc1,HcId,Setup}.
+
+new_state_release_request(Spvc) ->
+ debug_disabled,
+ update_state(Spvc,release_request),
+ Spvc#spvcObj{currentState = release_request}.
+
+new_state_release_at_restart(Spvc) ->
+ debug_disabled,
+ Spvc1 = Spvc#spvcObj{spvcRetryFailures = 0,
+ currentState = release_at_restart},
+ update_state(Spvc,release_at_restart),
+ HcId = spvcEncode:encode_cc_hcid(Spvc1#spvcObj.spvcEntry),
+ Release = spvcEncode:encode_cc_release(31),
+ spvcManager:release_un(a_side,HcId,Release,Spvc1),
+ Spvc1.
+
+new_state_rest_in_peace_or_wait(Spvc,[HcId,HciMsg]) ->
+ debug_disabled,
+ Spvc1 = Spvc#spvcObj{spvcRetryFailures = Spvc#spvcObj.spvcRetryFailures + 1},
+ case check_limits(Spvc1) of
+ {ok,ok,no_retries} ->
+ send_spvcFailingAlarm(Spvc#spvcObj.spvcEntry),
+ update_state(Spvc,4),
+ spvcLib:clear_spvcStillTryingAlarm(Spvc#spvcObj.spvcEntry),
+ Spvc1#spvcObj{currentState = rest_in_peace};
+ {ok,ok,_} ->
+ Spvc2 = Spvc1#spvcObj{spvcRetryTimer = time(),
+ currentState = wait},
+ update_state(Spvc,wait),
+ start_timer(wait,Spvc2),
+ Spvc2;
+ {retry_threshold,ok,no_retries} ->
+ Spvc2 = Spvc1#spvcObj{currentState = rest_in_peace},
+ update_state(Spvc,4),
+ send_call_failure(Spvc),
+ send_spvcFailingAlarm(Spvc#spvcObj.spvcEntry),
+ spvcLib:clear_spvcStillTryingAlarm(Spvc#spvcObj.spvcEntry),
+ Spvc2;
+ {retry_threshold,ok,_} ->
+ Spvc2 = Spvc1#spvcObj{spvcRetryTimer = time(),
+ currentState = wait},
+ update_state(Spvc,wait),
+ send_call_failure(Spvc2),
+ start_timer(wait,Spvc2),
+ Spvc2;
+ {ok,retry_limit,_} ->
+ send_spvcFailingAlarm(Spvc#spvcObj.spvcEntry),
+ update_state(Spvc,4),
+ spvcLib:clear_spvcStillTryingAlarm(Spvc#spvcObj.spvcEntry),
+ Spvc1#spvcObj{currentState = rest_in_peace};
+ {retry_threshold,retry_limit,_} ->
+ Spvc2 = Spvc1#spvcObj{currentState = rest_in_peace},
+ update_state(Spvc,4),
+ send_call_failure(Spvc2),
+ send_spvcFailingAlarm(Spvc#spvcObj.spvcEntry),
+ spvcLib:clear_spvcStillTryingAlarm(Spvc#spvcObj.spvcEntry),
+ Spvc2
+ end.
+
+send_call_failure(Spvc) ->
+ case Spvc#spvcObj.spvcRetryThreshold of
+ 0 ->
+ ok;
+ _ ->
+ sccmManager:cast_to_sccm(spvcLib:get_cp(om_node),spvcOrig,call_failure,[Spvc])
+ end.
+
+new_state_rest_in_peace(Spvc) ->
+ debug_disabled,
+ update_state(Spvc,4),
+ Spvc1 = Spvc#spvcObj{spvcRetryFailures = Spvc#spvcObj.spvcRetryFailures + 1},
+ send_spvcFailingAlarm(Spvc#spvcObj.spvcEntry),
+ case check_limits(Spvc1) of
+ {ok,_,_} ->
+ Spvc1#spvcObj{currentState = rest_in_peace};
+ {retry_threshold,_,_} ->
+ Spvc2 = Spvc1#spvcObj{currentState = rest_in_peace},
+ case Spvc2#spvcObj.spvcRetryThreshold of
+ 0 ->
+ ok;
+ _ ->
+ sccmManager:cast_to_sccm(spvcLib:get_cp(om_node),spvcOrig,call_failure,[Spvc2])
+ end,
+ Spvc2
+ end.
+
+new_state_active(Spvc) ->
+ debug_disabled,
+ update_state(Spvc,3),
+ Spvc#spvcObj{spvcRetryFailures = 0,
+ currentState = active}.
+
+new_state_created(Spvc,SetCols) ->
+ debug_disabled,
+ update_state(Spvc,created),
+ case spvcSNMP:is_all_values(case Spvc#spvcObj.spvcEntry of
+ {_,_,_,_} ->
+ spvcVcc;
+ {_,_,_} ->
+ spvcVpc;
+ {_,_} ->
+ spvcFr;
+ [_,_,_,_] ->
+ spvcVcc;
+ [_,_,_] ->
+ spvcVpc;
+ [_,_] ->
+ spvcFr
+ end,SetCols) of
+ true ->
+ Spvc1 = Spvc#spvcObj{spvcRowStatus = 2,
+ currentState = created},
+ set_attrs(Spvc1,SetCols);
+ false ->
+ Spvc1 = Spvc#spvcObj{spvcRowStatus = 3,
+ currentState = created},
+ set_attrs(Spvc1,SetCols)
+ end.
+
+new_state_not_in_service(Spvc) ->
+ debug_disabled,
+ update_state(Spvc,not_in_service),
+ Spvc#spvcObj{currentState = not_in_service,
+ spvcRowStatus = 2}.
+
+new_state_awaiting_switch_over(Spvc) ->
+ debug_disabled,
+ Spvc#spvcObj{currentState = awaiting_switch_over}.
+
+update_state(Spvc,NewState) ->
+ State = Spvc#spvcObj.currentState,
+ SpvcEntry = Spvc#spvcObj.spvcEntry,
+ debug_disabled,
+ spvcLib:update_state({State,SpvcEntry},NewState).
+
+send_spvcFailingAlarm(Key) ->
+ debug_disabled,
+ rpc:cast(spvcLib:get_cp(om_node),spvcLib,send_spvcFailingAlarm,[Key]).
+
+set_call_failure_data_and_send_spvcFailingAlarm({If,Vpi,Leaf}) ->
+ debug_disabled,
+ Spvc = spvcDataBase:db_read({spvcObj,{If,Vpi,Leaf}}),
+ if
+ Spvc == [] ->
+ ok;
+ true ->
+ spvcLib:update_state({Spvc#spvcObj.currentState,{If,Vpi,Leaf}},4)
+ end;
+set_call_failure_data_and_send_spvcFailingAlarm({If,Vpi,Vci,Leaf}) ->
+ debug_disabled,
+ Spvc = spvcDataBase:db_read({spvcObj,{If,Vpi,Vci,Leaf}}),
+ if
+ Spvc == [] ->
+ ok;
+ true ->
+ spvcLib:update_state({Spvc#spvcObj.currentState,{If,Vpi,Vci,Leaf}},4)
+ end.
+
+set_attrs(Spvc,SetCols) ->
+ case Spvc#spvcObj.spvcEntry of
+ {_,_,_,_} ->
+ set_attrs_spvcc(Spvc,SetCols);
+ {_,_,_} ->
+ set_attrs_spvpc(Spvc,SetCols)
+ end.
+
+set_attrs_spvcc(Spvc,[{2,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcTargetAddress = Value},
+ set_attrs_spvcc(Spvc1,T);
+set_attrs_spvcc(Spvc,[{3,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcTargetSelectType = Value},
+ set_attrs_spvcc(Spvc1,T);
+set_attrs_spvcc(Spvc,[{18,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcTargetVpi = Value},
+ set_attrs_spvcc(Spvc1,T);
+set_attrs_spvcc(Spvc,[{4,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcTargetVpi = Value},
+ set_attrs_spvcc(Spvc1,T);
+set_attrs_spvcc(Spvc,[{5,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcTargetVci = Value},
+ set_attrs_spvcc(Spvc1,T);
+set_attrs_spvcc(Spvc,[{6,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcLastReleaseCause = Value},
+ set_attrs_spvcc(Spvc1,T);
+set_attrs_spvcc(Spvc,[{7,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcLastReleaseDiagnostic = Value},
+ set_attrs_spvcc(Spvc1,T);
+set_attrs_spvcc(Spvc,[{10,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcRetryInterval = Value},
+ set_attrs_spvcc(Spvc1,T);
+set_attrs_spvcc(Spvc,[{11,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcRetryTimer = Value},
+ set_attrs_spvcc(Spvc1,T);
+set_attrs_spvcc(Spvc,[{12,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcRetryThreshold = Value},
+ set_attrs_spvcc(Spvc1,T);
+set_attrs_spvcc(Spvc,[{13,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcRetryFailures = Value},
+ set_attrs_spvcc(Spvc1,T);
+set_attrs_spvcc(Spvc,[{14,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcRetryLimit = Value},
+ set_attrs_spvcc(Spvc1,T);
+set_attrs_spvcc(Spvc,[{16,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcTargetDlci = Value},
+ set_attrs_spvcc(Spvc1,T);
+set_attrs_spvcc(Spvc,[{17,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcTargetType = Value},
+ set_attrs_spvcc(Spvc1,T);
+set_attrs_spvcc(Spvc,[_|T]) ->
+ set_attrs_spvcc(Spvc,T);
+set_attrs_spvcc(Spvc,[]) ->
+ debug_disabled,
+ Spvc.
+
+set_attrs_spvpc(Spvc,[{2,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcTargetAddress = Value},
+ set_attrs_spvpc(Spvc1,T);
+set_attrs_spvpc(Spvc,[{3,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcTargetSelectType = Value},
+ set_attrs_spvpc(Spvc1,T);
+set_attrs_spvpc(Spvc,[{15,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcTargetVpi = Value},
+ set_attrs_spvpc(Spvc1,T);
+set_attrs_spvpc(Spvc,[{4,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcTargetVpi = Value},
+ set_attrs_spvpc(Spvc1,T);
+set_attrs_spvpc(Spvc,[{5,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcLastReleaseCause = Value},
+ set_attrs_spvpc(Spvc1,T);
+set_attrs_spvpc(Spvc,[{6,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcLastReleaseDiagnostic = Value},
+ set_attrs_spvpc(Spvc1,T);
+set_attrs_spvpc(Spvc,[{9,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcRetryInterval = Value},
+ set_attrs_spvpc(Spvc1,T);
+set_attrs_spvpc(Spvc,[{10,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcRetryTimer = Value},
+ set_attrs_spvpc(Spvc1,T);
+set_attrs_spvpc(Spvc,[{11,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcRetryThreshold = Value},
+ set_attrs_spvpc(Spvc1,T);
+set_attrs_spvpc(Spvc,[{12,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcRetryFailures = Value},
+ set_attrs_spvpc(Spvc1,T);
+set_attrs_spvpc(Spvc,[{13,Value}|T]) ->
+ Spvc1 = Spvc#spvcObj{spvcRetryLimit = Value},
+ set_attrs_spvpc(Spvc1,T);
+set_attrs_spvpc(Spvc,[_|T]) ->
+ set_attrs_spvpc(Spvc,T);
+set_attrs_spvpc(Spvc,[]) ->
+ Spvc.
+
+call_failure(Spvc) ->
+ debug_disabled,
+ Key = case Spvc#spvcObj.spvcFrKey of
+ undefined ->
+ spvcLib:update_counter(callFailures,1,spvcLib:get_membership(node())),
+ atm_spvc;
+ _ ->
+ spvcLib:update_counter(callFrFailures,1,spvcLib:get_membership(node())),
+ fr_spvc
+ end,
+ Obj = spvcDataBase:db_read({spvcFailures,Key}),
+ case Obj#spvcFailures.spvcCallFailuresTrapEnable of
+ 1 ->
+ EventIndObj = spvcDataBase:db_read({spvcEventIndicator,Key}),
+ case EventIndObj#spvcEventIndicator.spvcTimerInd of
+ 1 ->
+ spvcDataBase:db_write(EventIndObj#spvcEventIndicator{spvcSendEventInd = 1}),
+ NI = Obj#spvcFailures.spvcNotificationInterval,
+ sysTimer:apply_after(1000 * NI,spvcOrig,timeout_event,[EventIndObj]);
+ _ ->
+ spvcManager:send_event(Key),
+ NI = Obj#spvcFailures.spvcNotificationInterval,
+ sysTimer:apply_after(1000 * NI,spvcManager,timeout,[Key]),
+ spvcDataBase:db_write(EventIndObj#spvcEventIndicator{spvcTimerInd = 1,
+ spvcSendEventInd = 2})
+ end;
+ _ ->
+ ok
+ end.
+
+timeout_event(EventIndObj) ->
+ spvcDataBase:db_write(EventIndObj#spvcEventIndicator{spvcTimerInd = 2}).
+
+check_limits(Spvc) ->
+ debug_disabled,
+ T = Spvc#spvcObj.spvcRetryThreshold,
+ L = Spvc#spvcObj.spvcRetryLimit,
+ F = Spvc#spvcObj.spvcRetryFailures,
+ I = Spvc#spvcObj.spvcRetryInterval,
+ {check_threshold(F,T),check_limit(F,L),check_interval(I)}.
+
+check_threshold(Failures,Threshold) when Failures == Threshold ->
+ debug_disabled,
+ retry_threshold;
+check_threshold(Failures,Threshold) ->
+ debug_disabled,
+ ok.
+
+check_limit(Failures,0) ->
+ debug_disabled,
+ ok;
+check_limit(Failures,Limit) when Failures < Limit ->
+ debug_disabled,
+ ok;
+check_limit(Failures,Limit) ->
+ debug_disabled,
+ retry_limit.
+
+check_interval(0) ->
+ no_retries;
+check_interval(I) ->
+ I.
+
+start_timer(wait,Spvc) ->
+ debug_disabled,
+ Key = Spvc#spvcObj.spvcEntry,
+ Id = spvcReestablishTimer:apply_after(backoff_delay(Key),spvcServer,cast_to_spvc,[node(),spvcOrig,timeout,[wait,Key]]).
+
+timeout(wait,Key) ->
+ debug_disabled,
+ case spvcDataBase:db_read({spvcObj,Key}) of
+ [] ->
+ debug_disabled,
+ ok;
+ Spvc ->
+ case Spvc#spvcObj.currentState of
+ wait ->
+ IfIndex = element(1,Key),
+ case spvcOam:is_reassign_et_in_progress(IfIndex) of
+ true ->
+ ok;
+ _ ->
+ orig_state_machine(wait,timeout,Spvc,[])
+ end;
+ _ ->
+ ok
+ end
+ end;
+timeout(X,Y) ->
+ debug_disabled,
+ ok.
+
+clear(Spvc) ->
+ debug_disabled,
+ Key = Spvc#spvcObj.spvcEntry,
+ PchKey = case Key of
+ {IfIndex_Value,Vpi_Value,Vci_Value,_} ->
+ {IfIndex_Value,Vpi_Value,Vci_Value};
+ {IfIndex_Value,Vpi_Value,_} ->
+ {IfIndex_Value,Vpi_Value};
+ [IfIndex_Value,Vpi_Value,Vci_Value,_] ->
+ [IfIndex_Value,Vpi_Value,Vci_Value];
+ [IfIndex_Value,Vpi_Value,_] ->
+ [IfIndex_Value,Vpi_Value]
+ end,
+ spvcEndPoint:free_tp_spvc(PchKey),
+ spvcDataBase:db_delete({spvcObj,Key}),
+ update_state(Spvc,clear),
+ OrigKey = list_to_tuple([orig] ++ tuple_to_list(Key)),
+ case Spvc#spvcObj.currentState of
+ created ->
+ ok;
+ _ ->
+ case spvcDataBase:db_read({spvcTpToHcId,OrigKey}) of
+ [] ->
+ ok;
+ #spvcTpToHcId{hcId = HcId} ->
+ spvcDataBase:db_delete({spvcHcIdToTp,HcId})
+ end,
+ ets:delete(spvcTpToHcId,OrigKey),
+ spvcReestablishTimer:cancel(Key),
+ ets:delete(spvcBackoff,Spvc#spvcObj.spvcEntry)
+ end,
+ case Spvc#spvcObj.spvcFrKey of
+ undefined ->
+ sccmManager:cast_to_sccm(spvcLib:get_cp(om_node),spvcEndPoint,remove_tp,[tuple_to_list(PchKey)]);
+ FrKey ->
+ spvcFr:clean_up(FrKey)
+ end,
+ case {Spvc#spvcObj.spvcRerCap,Spvc#spvcObj.spvcEntry} of
+ {false,_} ->
+ ok;
+ {true,Entry} when size(Entry) == 3 ->
+ spvcDataBase:db_delete({spvcRerVp,Entry});
+ {true,Entry} when size(Entry) == 4 ->
+ spvcDataBase:db_delete({spvcRerVc,Entry})
+ end.
+
+get_link_state(If) when integer(If) ->
+ debug_disabled,
+ cnhChi:get_link_opstate(If);
+get_link_state(Other) ->
+ debug_disabled,
+ disabled.
+
+get_link_state_intf(If,Msg) when integer(If) ->
+ debug_disabled,
+ case cnhChi:get_link_opstate(If) of
+ enabled ->
+ enabled;
+ _ ->
+ Om_Node = spvcLib:get_cp(om_node),
+ case rpc:call(Om_Node,intfI,get_link_op_state,[If]) of
+ {ok,enabled} ->
+ enabled;
+ Result ->
+ disabled
+ end
+ end;
+get_link_state_intf(Other,Msg) ->
+ debug_disabled,
+ disabled.
+
+setup(HcId,Setup,Spvc) ->
+ case spvcDataBase:db_read({spvcObj,Spvc#spvcObj.spvcEntry}) of
+ [] ->
+ ok;
+ Spvc1 ->
+ case Spvc#spvcObj.currentState == Spvc1#spvcObj.currentState of
+ true ->
+ spvcLib:increase_counter(spvcSaEtStat,Spvc),
+ case Spvc#spvcObj.spvcFrKey of
+ undefined ->
+ do_setup(HcId,Setup,Spvc#spvcObj.spvcRerCap);
+ FrKey ->
+ do_setup(HcId,Setup,FrKey)
+ end;
+ _ ->
+ ok
+ end
+ end.
+
+do_setup(HcId,Setup,Type) when Type == undefined; Type == false ->
+ debug_disabled,
+ ReturnData = {0,HcId},
+ L3Data = {0,[HcId,Setup]},
+ mdisp:msg(node(),{plcOperator,1,infinity},{HcId,{spvcI,ReturnData}},{ccI,l3_msg,[HcId,spvcI,L3Data]});
+do_setup(HcId,Setup,true) ->
+ debug_disabled,
+ ReturnData = {0,HcId},
+ L3Data = {0,[HcId,Setup]},
+ mdisp:msg(node(),{plcOperator,1,infinity},{HcId,{spvcRerI,ReturnData}},{ccI,l3_msg,[HcId,spvcRerI,L3Data]});
+do_setup(HcId,Setup,FrKey) ->
+ debug_disabled,
+ ReturnData = {0,HcId},
+ L3Data = {0,[HcId,Setup]},
+ mdisp:msg(node(),{plcOperator,1,infinity},{HcId,{spvcFrI,ReturnData}},{ccI,l3_msg,[HcId,spvcFrI,L3Data]}).
+
+backoff_delay(Key) ->
+ debug_disabled,
+ Obj = spvcDataBase:db_read({spvcObj,Key}),
+ Var = spvcDataBase:db_read({spvcFailures,atm_spvc}),
+ {Delay,Flag} = case Obj#spvcObj.spvcRetryFailures of
+ 0 ->
+ {100,no_alarm};
+ 1 ->
+ {Obj#spvcObj.spvcRetryInterval,no_alarm};
+ _ ->
+ Table = get_backoff_table(Key,Obj),
+ Max_Delay = Var#spvcFailures.max_delay,
+ case Var#spvcFailures.delay_factor * Table#spvcBackoff.delay_time of
+ DelayValue when DelayValue < Max_Delay ->
+ {DelayValue,no_alarm};
+ _ ->
+ Org_Retry_Interval = Obj#spvcObj.spvcRetryInterval,
+ if
+ Org_Retry_Interval < Max_Delay ->
+ spvcLib:send_spvcStillTryingAlarm(Key,Table#spvcBackoff.flag),
+ {Max_Delay,alarm};
+ true ->
+ spvcLib:send_spvcStillTryingAlarm(Key,Table#spvcBackoff.flag),
+ {Org_Retry_Interval,alarm}
+ end
+ end
+ end,
+ ets:insert(spvcBackoff,#spvcBackoff{key = Key,
+ delay_time = Delay,
+ flag = Flag}),
+ round(Delay).
+
+get_backoff_table(Index,Spvc) ->
+ case ets:lookup(spvcBackoff,Index) of
+ [Obj] ->
+ Obj;
+ _ ->
+ #spvcBackoff{key = Spvc#spvcObj.spvcEntry,
+ delay_time = Spvc#spvcObj.spvcRetryInterval,
+ flag = no_alarm}
+ end.
+
+set_fr_atm_iw_admin_state(FrEndPoint,up,Spvc) ->
+ ok;
+set_fr_atm_iw_admin_state(FrEndPoint,NewStatus,Spvc) ->
+ ok.
+
+forced_release(FrEndPoint) ->
+ FrPerm = spvcDataBase:db_read({spvcFr,FrEndPoint}),
+ case FrPerm of
+ [] ->
+ {error,no_fr_spvc};
+ _ ->
+ Key = FrPerm#spvcFr.spvcFrAtmEntry,
+ Spvc = spvcDataBase:db_read({spvcObj,Key}),
+ SpvcFrObj = spvcDataBase:db_read({spvcFrPerm,FrEndPoint}),
+ case SpvcFrObj#spvcFrPerm.spvcFrConnect of
+ 3 ->
+ SpvcTpToHcId = read_spvcTpToHcId(Key),
+ Release = spvcEncode:encode_cc_release(31),
+ spvcManager:release_un(b_side,SpvcTpToHcId#spvcTpToHcId.hcId,Release,Spvc);
+ _ ->
+ {error,target_not_owned_by_this_connection}
+ end
+ end.
diff --git a/lib/dialyzer/test/user_SUITE_data/src/wdp.hrl b/lib/dialyzer/test/user_SUITE_data/src/wdp.hrl
new file mode 100644
index 0000000000..767e4d84c3
--- /dev/null
+++ b/lib/dialyzer/test/user_SUITE_data/src/wdp.hrl
@@ -0,0 +1,96 @@
+
+%%
+%% WAP Port Number Definitions (WDP Appendix B.)
+%%
+
+-define(WAP_PORT_WTA_CL_SEC, 2805).
+-define(WAP_PORT_WTA_CO_SEC, 2923).
+-define(WAP_PORT_PUSH_CL, 2948).
+-define(WAP_PORT_PUSH_CL_SEC, 2949).
+
+-define(WAP_PORT_CL, 9200).
+-define(WAP_PORT_CO, 9201).
+-define(WAP_PORT_CL_SEC, 9202).
+-define(WAP_PORT_CO_SEC, 9203).
+-define(WAP_PORT_VCARD, 9204).
+-define(WAP_PORT_VCAL, 9205).
+-define(WAP_PORT_VCARD_SEC, 9206).
+-define(WAP_PORT_VCAL_SEC, 9207).
+
+-define(WAP_PORT_RINGTONE, 5505).
+-define(WAP_PORT_OPER_LOGO, 5506).
+-define(WAP_PORT_CLI_LOGO, 5507).
+
+%%
+%% WDP Bearer Type Assignments (WDP Appendix C.)
+%%
+
+%%
+%% Names after the tag WAP_BEARER_ is [network]_[bearer_type]_[address_type]
+%%
+-define(WAP_BEARER_ANY_ANY_IPV4, 16#00).
+-define(WAP_BEARER_ANY_ANY_IPV6, 16#01).
+-define(WAP_BEARER_GSM_USSD_ANY, 16#02).
+-define(WAP_BEARER_GSM_SMS_GSMMSISDN, 16#03).
+-define(WAP_BEARER_ANSI136_GUTS_ANSI136MSISDN, 16#04).
+-define(WAP_BEARER_IS95CDMA_SMS_IS637MSISDN, 16#05).
+-define(WAP_BEARER_IS95CDMA_CSD_IPV4, 16#06).
+-define(WAP_BEARER_IS95CDMA_PACKETDATA_IPV4, 16#07).
+-define(WAP_BEARER_ANSI136_CSD_IPV4, 16#08).
+-define(WAP_BEARER_ANSI136_PACKETDATA_IPV4, 16#09).
+-define(WAP_BEARER_GSM_CSD_IPV4, 16#0a).
+-define(WAP_BEARER_GSM_GPRS_IPV4, 16#0b).
+-define(WAP_BEARER_GSM_USSD_IPV4, 16#0c).
+-define(WAP_BEARER_AMPS_CDPD_IPV4, 16#0d).
+-define(WAP_BEARER_PDC_CSD_IPV4, 16#0e).
+-define(WAP_BEARER_PDC_PACKETDATA_IPV4, 16#0f).
+-define(WAP_BEARER_IDEN_SMS_IDENMSISDN, 16#10).
+-define(WAP_BEARER_IDEN_CSD_IPV4, 16#11).
+-define(WAP_BEARER_IDEN_PACKETDATA_IPV4, 16#12).
+-define(WAP_BEARER_PAGINGNETWORK_FLEX_FLEXMSISDN, 16#13).
+-define(WAP_BEARER_PHS_SMS_PHSMSISDN, 16#14).
+-define(WAP_BEARER_PHS_CSD_IPV4, 16#15).
+-define(WAP_BEARER_GSM_USSD_GSMSERVICECODE, 16#16).
+-define(WAP_BEARER_TETRA_SDS_TETRAITSI, 16#17).
+-define(WAP_BEARER_TETRA_SDS_TETRAMSISDN, 16#18).
+-define(WAP_BEARER_TETRA_PACKETDATA_IPV4, 16#19).
+-define(WAP_BEARER_PAGINGNETWORK_REFLEX_REFLEXMSISDN, 16#1a).
+-define(WAP_BEARER_GSM_USSD_GSMMSISDN, 16#1b).
+-define(WAP_BEARER_MOBITEX_MPAK_MAN, 16#1c).
+-define(WAP_BEARER_ANSI136_GHOST_GSMMSISDN, 16#1d).
+
+-record(wdp_address,
+ {
+ bearer,
+ address,
+ portnum
+ }).
+
+-record(wdp_sap_info,
+ {
+ mtu, %% max transmission unit (bytes)
+ mru %% max receive unit (bytes)
+ }).
+
+%%
+%% Source and destination address are wdp_addresses
+%%
+-record(wdp_socket_pair,
+ {
+ source,
+ destination
+ }).
+
+-record(wdp_local_port,
+ {
+ port, %% wdp "socket"
+ sap, %% source address
+ user, %% WDP user process
+ monitor %% monitor on WDP user
+ }).
+
+-record(wdp_local_sap,
+ {
+ sap, %% source address
+ port %% wdp "socket"
+ }).
diff --git a/lib/dialyzer/test/user_SUITE_data/src/wsp.hrl b/lib/dialyzer/test/user_SUITE_data/src/wsp.hrl
new file mode 100644
index 0000000000..0adcc13874
--- /dev/null
+++ b/lib/dialyzer/test/user_SUITE_data/src/wsp.hrl
@@ -0,0 +1,239 @@
+
+%% WSP Table 34. PDU Type Assignments
+%%
+
+-define(WSP_Connect, 16#01).
+-define(WSP_ConnectReply, 16#02).
+-define(WSP_Redirect, 16#03).
+-define(WSP_Reply, 16#04).
+-define(WSP_Disconnect, 16#05).
+-define(WSP_Push, 16#06).
+-define(WSP_ConfirmedPush, 16#07).
+-define(WSP_Suspend, 16#08).
+-define(WSP_Resume, 16#09).
+
+-define(WSP_Get, 16#40).
+-define(WSP_Options, 16#41).
+-define(WSP_Head, 16#42).
+-define(WSP_Delete, 16#43).
+-define(WSP_Trace, 16#44).
+
+-define(WSP_Post, 16#60).
+-define(WSP_Put, 16#61).
+
+-define(WSP_DataFragmentPDU, 16#80).
+
+%%
+%% WSP Table 37. Capability Assignments
+%%
+
+-define(WSP_CAP_CLIENT_SDU_SIZE, 16#00).
+-define(WSP_CAP_SERVER_SDU_SIZE, 16#01).
+-define(WSP_CAP_PROTOCOL_OPTIONS, 16#02).
+-define(WSP_CAP_METHOD_MOR, 16#03).
+-define(WSP_CAP_PUSH_MOR, 16#04).
+-define(WSP_CAP_EXTENDED_METHODS, 16#05).
+-define(WSP_CAP_HEADER_CODE_PAGES, 16#06).
+-define(WSP_CAP_ALIASES, 16#07).
+-define(WSP_CAP_CLIENT_MESSAGE_SIZE, 16#08).
+-define(WSP_CAP_SERVER_MESSAGE_SIZE, 16#09).
+
+-define(WSP_CODEPAGE_1, 1).
+-define(WSP_DEFAULT_CODEPAGE, ?WSP_CODEPAGE_1).
+
+-define(ANY_LANGUAGE,128).
+
+-define(WSP_10, {1,0}).
+-define(WSP_11, {1,1}).
+-define(WSP_12, {1,2}).
+-define(WSP_13, {1,3}).
+-define(WSP_14, {1,4}).
+-define(WSP_15, {1,5}).
+
+-define(WSP_COMPLIENT_VERSION, ?WSP_15).
+-define(WSP_DEFAULT_VERSION, ?WSP_12).
+
+-define(WSP_STATUS_CONTINUE, 100).
+-define(WSP_STATUS_SWITCHING_PROTOCOLS, 101).
+-define(WSP_STATUS_OK, 200).
+-define(WSP_STATUS_CREATED, 201).
+-define(WSP_STATUS_ACCEPTED, 202).
+-define(WSP_STATUS_NON_AUTHORITATIVE_INFORMATION, 203).
+-define(WSP_STATUS_NO_CONTENT, 204).
+-define(WSP_STATUS_RESET_CONTENT, 205).
+-define(WSP_STATUS_PARTIAL_CONTENT, 206).
+-define(WSP_STATUS_MULTIPLE_CHOICES, 300).
+-define(WSP_STATUS_MOVED_PERMANENTLY, 301).
+-define(WSP_STATUS_MOVED_TEMPORARILY, 302).
+-define(WSP_STATUS_SEE_OTHER, 303).
+-define(WSP_STATUS_NOT_MODIFIED, 304).
+-define(WSP_STATUS_USE_PROXY, 305).
+-define(WSP_STATUS_RESERVED, 306).
+-define(WSP_STATUS_TEMPORARY_REDIRECT, 307).
+-define(WSP_STATUS_BAD_REQUEST, 400).
+-define(WSP_STATUS_UNAUTHORIZED, 401).
+-define(WSP_STATUS_PAYMENT_REQUIRED, 402).
+-define(WSP_STATUS_FORBIDDEN, 403).
+-define(WSP_STATUS_NOT_FOUND, 404).
+-define(WSP_STATUS_METHOD_NOT_ALLOWED, 405).
+-define(WSP_STATUS_NOT_ACCEPTABLE, 406).
+-define(WSP_STATUS_PROXY_AUTHENTICATION_REQUIRED, 407).
+-define(WSP_STATUS_REQUEST_TIMEOUT, 408).
+-define(WSP_STATUS_CONFLICT, 409).
+-define(WSP_STATUS_GONE, 410).
+-define(WSP_STATUS_LENGTH_REQUIRED, 411).
+-define(WSP_STATUS_PRECONDITION_FAILED, 412).
+-define(WSP_STATUS_REQUEST_ENTITY_TOO_LARGE, 413).
+-define(WSP_STATUS_REQUEST_URI_TOO_LARGE, 414).
+-define(WSP_STATUS_UNSUPPORTED_MEDIA_TYPE, 415).
+-define(WSP_STATUS_REQUESTED_RANGE_NOT_SATISFIABLE, 416).
+-define(WSP_STATUS_EXPECTATION_FAILED, 417).
+-define(WSP_STATUS_INTERNAL_SERVER_ERROR, 500).
+-define(WSP_STATUS_NOT_IMPLEMENTED, 501).
+-define(WSP_STATUS_BAD_GATEWAY, 502).
+-define(WSP_STATUS_SERVICE_UNAVAILABLE, 503).
+-define(WSP_STATUS_GATEWAY_TIMEOUT, 504).
+-define(WSP_STATUS_HTTP_VERSION_NOT_SUPPORTED, 505).
+
+-define(ENCODE_SHORT(X), <<1:1, (X):7>>).
+
+-define(ENCODE_LONG(X),
+ if (X) =< 16#ff -> <<1, (X):8>>;
+ (X) =< 16#ffff -> <<2, (X):16>>;
+ (X) =< 16#ffffff -> <<3, (X):24>>;
+ (X) =< 16#ffffffff -> <<4, (X):32>>;
+ true -> encode_long1(X)
+ end).
+
+
+-record(wsp_session,
+ {
+ id, %% uniq session id
+ ref, %% address quadruple (socketpair)
+ state=null, %% connected, suspended
+ version, %% encoding version to use
+ capabilities, %% client capabilities
+ headers %% client hop-by-hop headers!!!
+ }).
+
+-record(wsp_header,
+ {
+ name, %% field name
+ value, %% field value (binary value)
+ params=[] %% field params [{Name,Value} | Value]
+ }).
+
+-record(wsp_multipart_entry,
+ {
+ content_type, %% #wsp_header
+ headers=[],
+ data=(<<>>)
+ }).
+
+-record(wsp_capabilities,
+ {
+ aliases=[], %% [#wdp_address]
+ client_sdu_size=1400,
+ extended_methods=[], %% [{PduType, Name}]
+ header_code_pages=[], %% [{Page,Name}] | [Page]
+ protocol_options=[], %% [push,confirmed_push,resume,
+ %% acknowledgement_headers]
+ method_mor = 10, %% 1?
+ push_mor = 10, %% 1?
+ server_sdu_size=1400,
+ client_message_size,
+ server_message_size,
+ unknown=[]
+ }).
+
+%% WSP PDU records
+
+-record(wsp_connect,
+ {
+ version, %% protocol version, not wsp version?
+ capabilities,
+ headers
+ }).
+
+-record(wsp_connect_reply,
+ {
+ server_session_id,
+ capabilities,
+ headers=[]
+ }).
+
+-define(WSP_PERMANENT_REDIRECT, 16#80).
+-define(WSP_REUSE_SECURITY, 16#40).
+
+-record(wsp_redirect,
+ {
+ flags=[],
+ addresses=[]
+ }).
+
+-record(wsp_disconnect,
+ {
+ server_session_id
+ }).
+
+-record(wsp_get,
+ {
+ type,
+ uri,
+ headers=[]
+ }).
+
+-record(wsp_post,
+ {
+ type,
+ uri,
+ content_type, %% #wsp_header
+ headers=[],
+ data
+ }).
+
+-record(wsp_reply,
+ {
+ status,
+ content_type, %% #wsp_header
+ headers=[],
+ data
+ }).
+
+-record(wsp_data_fragment_pdu,
+ {
+ headers=[],
+ data
+ }).
+
+-record(wsp_push,
+ {
+ type = push,
+ content_type, %% #wsp_header
+ headers=[],
+ data
+ }).
+
+-record(wsp_suspend,
+ {
+ session_id
+ }).
+
+-record(wsp_resume,
+ {
+ session_id,
+ capabilities,
+ headers
+ }).
+
+%% NOTE: not a real pdu
+-record(wsp_acknowledgement_headers,
+ {
+ headers=[]
+ }).
+
+-record(wsp_unknown_pdu,
+ {
+ type, %% integer
+ data %% the payload
+ }).
diff --git a/lib/dialyzer/test/user_SUITE_data/src/wsp_pdu.erl b/lib/dialyzer/test/user_SUITE_data/src/wsp_pdu.erl
new file mode 100644
index 0000000000..e5b387478f
--- /dev/null
+++ b/lib/dialyzer/test/user_SUITE_data/src/wsp_pdu.erl
@@ -0,0 +1,5423 @@
+%%%=======================================================================
+%%% File : wsp_pdu.erl
+%%% Author : Tony Rogvall <[email protected]>
+%%% Description : WSP PDU
+%%% Created : 18 Aug 2003 by <[email protected]>
+%%%=======================================================================
+%%%
+%%% There are a couple of bugs in this file. Some are detected by
+%%% Dialyzer v1.1 starting both from byte code and from source, some
+%%% other ones are detected only starting from sourse, while some
+%%% others go unnoticed (these are identified by "BUG" below). It is
+%%% expected that at least some of them are detected when the new type
+%%% analysis is integrated into Dialyzer. Some other ones, like the
+%%% one with the unused _Acc argument are harder to detect and might
+%%% require different techniques.
+%%%
+%%%=======================================================================
+
+-module(wsp_pdu).
+-export([encode/1, encode/2, decode/1, decode/2]).
+
+%% The following is just to suppress unused function warnings
+-export([decode_address/1, decode_header/2,
+ decode_headers/1, decode_mms_version/1, decode_multipart/1,
+ encode_headers/1, encode_mms_version/1, encode_multipart/1,
+ encode_language/1, encode_short_integer/1,
+ fmt_current_date/0,
+ format_header/1, format_headers/1,
+ parse_header/1, format/1]).
+
+-include("wsp.hrl").
+-include("wdp.hrl").
+
+-ifdef(debug).
+-define(dbg(Fmt,Args), io:format(Fmt, Args)).
+-else.
+-define(dbg(Fmt,Args), ok).
+-endif.
+
+-define(WARN(Cond, Message),
+ if (Cond) ->
+ io:format("Warning: ~s\n", [(Message)]);
+ true ->
+ ok
+ end).
+
+
+format(Pdu) ->
+ if record(Pdu, wsp_connect) ->
+ fmt(Pdu, record_info(fields, wsp_connect));
+ record(Pdu, wsp_connect_reply) ->
+ fmt(Pdu, record_info(fields, wsp_connect_reply));
+ record(Pdu, wsp_redirect) ->
+ fmt(Pdu, record_info(fields, wsp_redirect));
+ record(Pdu, wsp_disconnect) ->
+ fmt(Pdu, record_info(fields, wsp_disconnect));
+ record(Pdu, wsp_get) ->
+ fmt(Pdu, record_info(fields, wsp_get));
+ record(Pdu, wsp_post) ->
+ fmt(Pdu, record_info(fields, wsp_post));
+ record(Pdu,wsp_reply) ->
+ fmt(Pdu, record_info(fields, wsp_reply));
+ record(Pdu,wsp_data_fragment_pdu) ->
+ fmt(Pdu, record_info(fields, wsp_data_fragment_pdu));
+ record(Pdu,wsp_push) ->
+ fmt(Pdu, record_info(fields, wsp_push));
+ record(Pdu, wsp_suspend) ->
+ fmt(Pdu, record_info(fields, wsp_suspend));
+ record(Pdu, wsp_resume) ->
+ fmt(Pdu, record_info(fields, wsp_resume));
+ record(Pdu, wsp_unknown_pdu) ->
+ fmt(Pdu, record_info(fields, wsp_unknown_pdu))
+ end.
+
+fmt(Pdu, Fs) ->
+ [Name | Vs] = tuple_to_list(Pdu),
+ lists:flatten(["\n",atom_to_list(Name)," {\n" , fmt1(Fs, Vs), "\n}"]).
+
+fmt1([F|Fs],[V|Vs]) ->
+ [io_lib:format(" ~s: ~s;\n", [F,fmt_value(V)]) | fmt1(Fs, Vs)];
+fmt1([], []) ->
+ "".
+
+fmt_value(V) when binary(V) -> "#Bin";
+fmt_value(V) -> lists:flatten(io_lib:format("~p",[V])).
+
+
+%%
+%% Wsp pdu encoder
+%%
+encode(Pdu) ->
+ encode(Pdu, ?WSP_DEFAULT_VERSION).
+
+encode(Pdu, Version) ->
+ ?dbg("encode pdu using encoding version ~p\n", [Version]),
+ Enc = encode1(Pdu, Version),
+ ?dbg("pdu: ~p\nreversed pdu: ~p\n",
+ [Pdu, decode(Enc, Version)]),
+ Enc.
+
+
+encode1(Pdu, Version) ->
+ case Pdu of
+ #wsp_connect_reply {server_session_id=ServerSessionId,
+ capabilities=Capabilities,
+ headers=Headers} ->
+ EncServerSessionId = e_uintvar(ServerSessionId),
+ EncCapabilities = encode_capabilities(Capabilities),
+ EncCapabilitiesLength = e_uintvar(size(EncCapabilities)),
+ EncHeaders = encode_headers(Headers,Version),
+ EncHeadersLength = e_uintvar(size(EncHeaders)),
+ <<?WSP_ConnectReply,
+ EncServerSessionId/binary,
+ EncCapabilitiesLength/binary, EncHeadersLength/binary,
+ EncCapabilities/binary, EncHeaders/binary>>;
+
+ #wsp_reply{ status=Status,
+ content_type=ContentType,
+ headers=Headers,
+ data=Data} ->
+ EncStatus = encode_status_code(Status),
+ EncContentType = encode_content_type(ContentType,Version),
+ EncHeaders = encode_headers(Headers,Version),
+ EncHeadersLength = e_uintvar(size(EncContentType)+
+ size(EncHeaders)),
+ <<?WSP_Reply,
+ EncStatus:8,
+ EncHeadersLength/binary,
+ EncContentType/binary,
+ EncHeaders/binary,
+ Data/binary>>;
+
+ #wsp_post{type=Type, uri=URI, content_type=ContentType,
+ headers=Headers, data=Data} ->
+ %% WSP_Post, WSP_Put
+ PDUType = encode_pdu_type(Type),
+ UriLength = e_uintvar(length(URI)),
+ EncContentType = encode_content_type(ContentType,Version),
+ EncHeaders = encode_headers(Headers,Version),
+ EncHeadersLength = e_uintvar(size(EncContentType)+
+ size(EncHeaders)),
+ %% FIXME
+ <<PDUType:8,
+ UriLength/binary,
+ EncHeadersLength/binary,
+ (list_to_binary(URI))/binary,
+ EncContentType/binary,
+ EncHeaders/binary,
+ Data/binary>>;
+
+ #wsp_push{type=Type, content_type=ContentType,
+ headers=Headers, data=Data} ->
+ %% WSP_Push, WSP_ConfirmedPush
+ PDUType = encode_pdu_type(Type),
+ EncContentType = encode_content_type(ContentType,Version),
+ EncHeaders = encode_headers(Headers,Version),
+ ?dbg("Version ~p Headers ~p", [Version, Headers]),
+ ?dbg("EncHeaders ~p", [EncHeaders]),
+ EncHeadersLength = e_uintvar(size(EncContentType)+
+ size(EncHeaders)),
+ ?dbg("EncCT = ~w ~w", [ContentType, EncContentType]),
+ ?dbg("EncHL = ~w", [EncHeadersLength]),
+ <<PDUType:8,
+ EncHeadersLength/binary,
+ EncContentType/binary,
+ EncHeaders/binary,
+ Data/binary>>;
+
+ #wsp_get{type=Type, uri=URI, headers=Headers} ->
+ %% WSP_Get, WSP_Options, WSP_Head, WSP_Delete, WSP_Trace
+ PDUType = encode_pdu_type(Type),
+ UriLength = length(URI),
+ EncHeaders = encode_headers(Headers,Version),
+ <<PDUType:8,
+ (e_uintvar(UriLength))/binary,
+ (list_to_binary(URI))/binary,
+ EncHeaders/binary>>;
+
+ #wsp_redirect { flags = Flags, addresses = Addrs } ->
+ Flg = lists:foldl(fun(permanent,F) ->
+ ?WSP_PERMANENT_REDIRECT bor F;
+ (resue, F) ->
+ ?WSP_REUSE_SECURITY bor F
+ end, 0, Flags),
+ EncAddr = encode_addresses(Addrs),
+ <<?WSP_Redirect, Flg:8, EncAddr/binary >>;
+
+
+ #wsp_data_fragment_pdu { headers=Headers, data=Data } ->
+ EncHeaders = encode_headers(Headers,Version),
+ << ?WSP_DataFragmentPDU, EncHeaders/binary, Data/binary >>
+ end.
+
+decode(Data) ->
+ decode(Data, ?WSP_COMPLIENT_VERSION).
+
+decode(Data0, Version) ->
+ case Data0 of
+ <<?WSP_Connect:8,PduVersion:8,D0/binary>> ->
+ %% 8.2.2.1
+ {CapabilitiesLen,D1} = d_uintvar(D0),
+ {HeadersLen,D2} = d_uintvar(D1),
+ {Capabilities,D3} = split_binary(D2, CapabilitiesLen),
+ Caps = decode_capabilities(Capabilities,#wsp_capabilities{}),
+ {Headers,D4} = split_binary(D3, HeadersLen),
+ DecHeaders = decode_headers(Headers, Version),
+ ?WARN(D4 =/= <<>>, "Connect pdu contains trailing data"),
+ %% FIXME: warn when D4 is not <<>>
+ #wsp_connect{ version = PduVersion,
+ capabilities=Caps,
+ headers = DecHeaders };
+
+ <<?WSP_ConnectReply:8,D0/binary>> ->
+ %% 8.2.2.2
+ {ServerSessionId,D1} = d_uintvar(D0),
+ {CapabilitiesLen,D2} = d_uintvar(D1),
+ {HeadersLen,D3} = d_uintvar(D2),
+ {Capabilities,D4} = split_binary(D3, CapabilitiesLen),
+ Caps = decode_capabilities(Capabilities,#wsp_capabilities{}),
+ {Headers,D5} = split_binary(D4, HeadersLen),
+ DecHeaders = decode_headers(Headers, Version),
+ ?WARN(D5 =/= <<>>, "ConnectReply pdu contains trailing data"),
+ #wsp_connect_reply{server_session_id=ServerSessionId,
+ capabilities=Caps,
+ headers=DecHeaders};
+
+ <<?WSP_Redirect:8,Flg:8,D0/binary>> ->
+ Flags =
+ if Flg band ?WSP_PERMANENT_REDIRECT =/= 0 -> [permanent];
+ true -> []
+ end ++
+ if Flg band ?WSP_REUSE_SECURITY =/= 0 -> [security];
+ true -> []
+ end,
+ Addrs = decode_addresses(D0),
+ %% 8.2.2.3 Redirect
+ #wsp_redirect{flags=Flags,addresses=Addrs};
+
+
+ <<?WSP_Disconnect:8,D0/binary>> ->
+ %% 8.2.2.4 Disconnect
+ {ServerSessionId,_D1} = d_uintvar(D0),
+ #wsp_disconnect{server_session_id=ServerSessionId};
+
+ <<?WSP_Get:8,D0/binary>> ->
+ {URILength, D1} = d_uintvar(D0),
+ <<UriData:URILength/binary,D2/binary>> = D1,
+ Hs = decode_headers(D2, Version),
+ #wsp_get{type='GET',uri=binary_to_list(UriData),headers=Hs };
+
+ <<?WSP_Options:8,D0/binary>> ->
+ {URILength, D1} = d_uintvar(D0),
+ <<UriData:URILength/binary,D2/binary>> = D1,
+ Hs = decode_headers(D2, Version),
+ #wsp_get{type='OPTIONS',uri=binary_to_list(UriData),headers=Hs };
+
+ <<?WSP_Head:8,D0/binary>> ->
+ {URILength, D1} = d_uintvar(D0),
+ <<UriData:URILength/binary,D2/binary>> = D1,
+ Hs = decode_headers(D2, Version),
+ #wsp_get{type='HEAD',uri=binary_to_list(UriData),headers=Hs };
+
+ <<?WSP_Delete:8,D0/binary>> ->
+ {URILength, D1} = d_uintvar(D0),
+ <<UriData:URILength/binary,D2/binary>> = D1,
+ Hs = decode_headers(D2, Version),
+ #wsp_get{type='DELETE',uri=binary_to_list(UriData),headers=Hs };
+
+ <<?WSP_Trace:8,D0/binary>> ->
+ {URILength, D1} = d_uintvar(D0),
+ <<UriData:URILength/binary,D2/binary>> = D1,
+ Hs = decode_headers(D2, Version),
+ #wsp_get{type='TRACE',uri=binary_to_list(UriData),headers=Hs };
+
+ %% 8.2.3.2 Post
+ <<?WSP_Post:8,D0/binary>> ->
+ {URILen, D1} = d_uintvar(D0),
+ {HL0, D2} = d_uintvar(D1),
+ <<UriData:URILen/binary,D3/binary>> = D2,
+ {FieldData,D4} = scan_header_data(D3),
+ HL1 = (HL0-(size(D3)-size(D4))),
+ <<D5:HL1/binary,Data/binary>> = D4,
+ ContentType = decode_content_type(FieldData, Version),
+ Headers = decode_headers(D5, Version),
+ #wsp_post{ type='POST', uri=binary_to_list(UriData),
+ content_type=ContentType, headers=Headers, data=Data};
+
+ <<?WSP_Put:8,D0/binary>> ->
+ {URILen, D1} = d_uintvar(D0),
+ {HL0, D2} = d_uintvar(D1),
+ <<UriData:URILen/binary,D3/binary>> = D2,
+ {FieldData,D4} = scan_header_data(D3),
+ HL1 = (HL0-(size(D3)-size(D4))),
+ <<D5:HL1/binary,Data/binary>> = D4,
+ ContentType = decode_content_type(FieldData, Version),
+ Headers = decode_headers(D5, Version),
+ #wsp_post{ type='PUT', uri=binary_to_list(UriData),
+ content_type=ContentType, headers=Headers, data=Data};
+
+ <<?WSP_Reply:8,StatusCode:8,D0/binary>> ->
+ %% 8.2.3.3 Reply
+ Status = decode_status_code(StatusCode),
+ {HL0, D1} = d_uintvar(D0),
+ {FieldData, D2} = scan_header_data(D1),
+ ContentType = decode_content_type(FieldData, Version),
+ %% Headers are headersLength - binary size of content type
+ HL1 = (HL0-(size(D1)-size(D2))),
+ <<D3:HL1/binary,Data/binary>> = D2,
+ Hs = decode_headers(D3, Version),
+ #wsp_reply{status=Status, content_type=ContentType,
+ headers=Hs, data=Data};
+
+ <<?WSP_DataFragmentPDU:8,D0/binary>> ->
+ %% 8.2.3.4 Data Fragment PDU
+ {HL0, D1} = d_uintvar(D0),
+ <<D2:HL0/binary,Data/binary>> = D1,
+ Hs = decode_headers(D2, Version),
+ #wsp_data_fragment_pdu{headers=Hs, data=Data};
+
+ %% 8.2.4.1 Push or ConfirmedPush
+ <<?WSP_Push:8,D0/binary>> ->
+ {HeadersLength, T200} = d_uintvar(D0),
+ {FieldData, T300} = scan_header_data(T200),
+ ContentType = decode_content_type(FieldData, Version),
+ RealHeadersLength = (HeadersLength-(size(T200)-size(T300))),
+ <<T400:RealHeadersLength/binary,Data/binary>> = T300,
+ Headers = decode_headers(T400, Version),
+ #wsp_push{type=push,content_type=ContentType,
+ headers=Headers,data=Data};
+
+ <<?WSP_ConfirmedPush:8,D0/binary>> ->
+ {HeadersLength, T200} = d_uintvar(D0),
+ {FieldData, T300} = scan_header_data(T200),
+ ContentType = decode_content_type(FieldData, Version),
+ RealHeadersLength = (HeadersLength-(size(T200)-size(T300))),
+ <<T400:RealHeadersLength/binary,Data/binary>> = T300,
+ Headers = decode_headers(T400, Version),
+ #wsp_push{type=confirmed_push,
+ content_type=ContentType,
+ headers=Headers,data=Data};
+
+ <<PDUType:8,T100/binary>> ->
+ #wsp_unknown_pdu { type = PDUType, data = T100 }
+ end.
+
+
+encode_pdu_type(connect) -> ?WSP_Connect;
+encode_pdu_type(connect_reply) -> ?WSP_ConnectReply;
+encode_pdu_type(redirect) -> ?WSP_Redirect;
+encode_pdu_type(reply) -> ?WSP_Reply;
+encode_pdu_type(disconnect) -> ?WSP_Disconnect;
+encode_pdu_type(push) -> ?WSP_Push;
+encode_pdu_type(confirmed_push) -> ?WSP_ConfirmedPush;
+encode_pdu_type(suspend) -> ?WSP_Suspend;
+encode_pdu_type(resume) -> ?WSP_Resume;
+encode_pdu_type(data_fragment_pdu) -> ?WSP_DataFragmentPDU;
+encode_pdu_type('GET') -> ?WSP_Get;
+encode_pdu_type('OPTIONS') -> ?WSP_Options;
+encode_pdu_type('HEAD') -> ?WSP_Head;
+encode_pdu_type('DELETE') -> ?WSP_Delete;
+encode_pdu_type('TRACE') -> ?WSP_Trace;
+encode_pdu_type('POST') -> ?WSP_Post;
+encode_pdu_type('PUT') -> ?WSP_Put;
+encode_pdu_type(Type) when integer(Type) -> Type.
+
+
+decode_pdu_type(?WSP_Connect) -> connect;
+decode_pdu_type(?WSP_ConnectReply) -> connect_reply;
+decode_pdu_type(?WSP_Redirect) -> redirect;
+decode_pdu_type(?WSP_Reply) -> reply;
+decode_pdu_type(?WSP_Disconnect) -> disconnect;
+decode_pdu_type(?WSP_Push) -> push;
+decode_pdu_type(?WSP_ConfirmedPush) -> confirmed_push;
+decode_pdu_type(?WSP_Suspend) -> suspend;
+decode_pdu_type(?WSP_Resume) -> resume;
+decode_pdu_type(?WSP_DataFragmentPDU) -> data_fragment_pdu;
+decode_pdu_type(?WSP_Get) -> 'GET';
+decode_pdu_type(?WSP_Options) -> 'OPTIONS';
+decode_pdu_type(?WSP_Head) -> 'HEAD';
+decode_pdu_type(?WSP_Delete) -> 'DELETE';
+decode_pdu_type(?WSP_Trace) -> 'TRACE';
+decode_pdu_type(?WSP_Post) -> 'POST';
+decode_pdu_type(?WSP_Put) -> 'PUT';
+decode_pdu_type(Type) -> Type. %% allow unknown pdu types.
+
+
+%% Convert various data types to list
+
+to_list(I) when integer(I) ->
+ integer_to_list(I);
+to_list(A) when atom(A) ->
+ atom_to_list(A);
+to_list(Version={X,Y}) when integer(X), integer(Y) ->
+ format_version(Version);
+to_list(DateTime={{_,_,_},{_,_,_}}) ->
+ fmt_date(DateTime);
+to_list(L) when list(L) ->
+ L.
+
+
+
+encode_capabilities(Capa) ->
+ encode_capabilities(Capa,#wsp_capabilities{}).
+
+encode_capabilities(Cap,Def) ->
+ Known =
+ [encode_capability(?WSP_CAP_ALIASES,
+ Cap#wsp_capabilities.aliases,
+ Def#wsp_capabilities.aliases),
+ encode_capability(?WSP_CAP_CLIENT_SDU_SIZE,
+ Cap#wsp_capabilities.client_sdu_size,
+ Def#wsp_capabilities.client_sdu_size),
+ encode_capability(?WSP_CAP_SERVER_SDU_SIZE,
+ Cap#wsp_capabilities.server_sdu_size,
+ Def#wsp_capabilities.server_sdu_size),
+ encode_capability(?WSP_CAP_PROTOCOL_OPTIONS,
+ Cap#wsp_capabilities.protocol_options,
+ Def#wsp_capabilities.protocol_options),
+ encode_capability(?WSP_CAP_METHOD_MOR,
+ Cap#wsp_capabilities.method_mor,
+ Def#wsp_capabilities.method_mor),
+ encode_capability(?WSP_CAP_PUSH_MOR,
+ Cap#wsp_capabilities.push_mor,
+ Def#wsp_capabilities.push_mor),
+ encode_capability(?WSP_CAP_EXTENDED_METHODS,
+ Cap#wsp_capabilities.extended_methods,
+ Def#wsp_capabilities.extended_methods),
+ encode_capability(?WSP_CAP_HEADER_CODE_PAGES,
+ Cap#wsp_capabilities.header_code_pages,
+ Def#wsp_capabilities.header_code_pages),
+ encode_capability(?WSP_CAP_CLIENT_MESSAGE_SIZE,
+ Cap#wsp_capabilities.client_message_size,
+ Def#wsp_capabilities.client_message_size),
+ encode_capability(?WSP_CAP_SERVER_MESSAGE_SIZE,
+ Cap#wsp_capabilities.server_message_size,
+ Def#wsp_capabilities.server_message_size)],
+ Unknown =
+ lists:map(fun({Id, Data}) when integer(Id) ->
+ <<1:1, Id:7, Data/binary>>;
+ ({Id,Data}) ->
+ <<(encode_text_string(Id))/binary, Data/binary>>
+ end, Cap#wsp_capabilities.unknown),
+ list_to_binary(
+ lists:map(fun(<<>>) -> [];
+ (Bin) ->
+ [e_uintvar(size(Bin)), Bin]
+ end, Known ++ Unknown)).
+
+
+
+
+encode_capability(_Capa, Default, Default) ->
+ <<>>;
+encode_capability(Capa, Value, _) ->
+ case Capa of
+ ?WSP_CAP_ALIASES ->
+ <<1:1, ?WSP_CAP_ALIASES:7, (encode_addresses(Value))/binary>>;
+
+ ?WSP_CAP_CLIENT_SDU_SIZE ->
+ <<1:1, ?WSP_CAP_CLIENT_SDU_SIZE:7, (e_uintvar(Value))/binary>>;
+
+ ?WSP_CAP_SERVER_SDU_SIZE ->
+ <<1:1, ?WSP_CAP_SERVER_SDU_SIZE:7, (e_uintvar(Value))/binary>>;
+
+ ?WSP_CAP_PROTOCOL_OPTIONS ->
+ Opts = case lists:member(confirmed_push, Value) of
+ true -> 16#80;
+ false -> 0
+ end bor
+ case lists:member(push, Value) of
+ true -> 16#40;
+ false -> 0
+ end bor
+ case lists:member(resume, Value) of
+ true -> 16#20;
+ false -> 0
+ end bor
+ case lists:member(acknowledgement_headers, Value) of
+ true -> 16#10;
+ false -> 0
+ end,
+ %% FIXME: symbolic encode/decode of options
+ <<1:1, ?WSP_CAP_PROTOCOL_OPTIONS:7, Opts>>;
+
+ ?WSP_CAP_METHOD_MOR ->
+ <<1:1, ?WSP_CAP_METHOD_MOR:7, (e_uintvar(Value))/binary>>;
+
+ ?WSP_CAP_PUSH_MOR ->
+ <<1:1, ?WSP_CAP_PUSH_MOR:7, (e_uintvar(Value))/binary>>;
+
+ ?WSP_CAP_EXTENDED_METHODS ->
+ <<1:1, ?WSP_CAP_EXTENDED_METHODS:7,
+ (encode_extended_methods(Value))/binary>>;
+
+ ?WSP_CAP_HEADER_CODE_PAGES ->
+ Data = list_to_binary(
+ lists:map(fun(Page) when integer(Page) -> Page;
+ ({Page,Name}) ->
+ [Page, encode_text_string(Name)]
+ end, Value)),
+ <<1:1, ?WSP_CAP_HEADER_CODE_PAGES:7, Data/binary>>;
+
+ ?WSP_CAP_CLIENT_MESSAGE_SIZE ->
+ <<1:1, ?WSP_CAP_CLIENT_MESSAGE_SIZE:7,
+ (e_uintvar(Value))/binary>>;
+
+ ?WSP_CAP_SERVER_MESSAGE_SIZE ->
+ <<1:1, ?WSP_CAP_SERVER_MESSAGE_SIZE:7,
+ (e_uintvar(Value))/binary>>;
+ _ when integer(Capa) ->
+ <<1:1, Capa:7, Value/binary>>;
+ _ when list(Capa) ->
+ <<(encode_text_string(Capa))/binary, Value/binary>>
+ end.
+
+
+decode_capabilities(<<>>, WspCaps) ->
+ WspCaps;
+decode_capabilities(D0,WspCaps) ->
+ {Len, D1} = d_uintvar(D0),
+ <<Capa:Len/binary, D2/binary>> = D1,
+ WspCaps1 =
+ case Capa of
+ <<1:1, Id:7, Data/binary>> ->
+ decode_capa(Id, Data, WspCaps);
+ _ ->
+ {Id,Data} = d_text_string(Capa),
+ decode_capa(Id, Data, WspCaps)
+ end,
+ decode_capabilities(D2, WspCaps1).
+
+
+
+decode_capa(Id,Data, WspCaps) ->
+ case Id of
+ ?WSP_CAP_SERVER_SDU_SIZE ->
+ {Val,_} = d_uintvar(Data),
+ WspCaps#wsp_capabilities{server_sdu_size=Val};
+
+ ?WSP_CAP_CLIENT_SDU_SIZE ->
+ {Val,_} = d_uintvar(Data),
+ WspCaps#wsp_capabilities{client_sdu_size=Val};
+
+ ?WSP_CAP_PROTOCOL_OPTIONS ->
+ <<POP,_/binary>> = Data,
+ Opts =
+ if POP band 16#80 == 16#80 -> [confirmed_push];
+ true -> []
+ end ++
+ if POP band 16#40 == 16#40 -> [push];
+ true -> []
+ end ++
+ if POP band 16#20 == 16#20 -> [resume];
+ true -> []
+ end ++
+ if POP band 16#10 == 16#10 -> [acknowledgement_headers];
+ true -> []
+ end,
+ WspCaps#wsp_capabilities{protocol_options=Opts};
+
+ ?WSP_CAP_METHOD_MOR ->
+ {Val,_} = d_uintvar(Data),
+ WspCaps#wsp_capabilities{method_mor=Val};
+
+ ?WSP_CAP_PUSH_MOR ->
+ {Val,_} = d_uintvar(Data),
+ WspCaps#wsp_capabilities{push_mor=Val};
+
+ ?WSP_CAP_EXTENDED_METHODS ->
+ Extended = decode_extended_methods(Data),
+ WspCaps#wsp_capabilities { extended_methods = Extended };
+
+ ?WSP_CAP_HEADER_CODE_PAGES ->
+ %% Client send [Code(uint8) Name(text-string)]*
+ %% Server send [Code(uint8)]*
+ io:format("FIXME: Header Code Pages = ~p\n",[Data]),
+ WspCaps;
+
+ ?WSP_CAP_ALIASES ->
+ Aliases = decode_addresses(Data),
+ WspCaps#wsp_capabilities { aliases = Aliases };
+
+ ?WSP_CAP_CLIENT_MESSAGE_SIZE ->
+ {Val,_} = d_uintvar(Data),
+ WspCaps#wsp_capabilities{client_message_size=Val};
+
+ ?WSP_CAP_SERVER_MESSAGE_SIZE ->
+ {Val,_} = d_uintvar(Data),
+ WspCaps#wsp_capabilities{server_message_size=Val};
+ _ ->
+ Unknown = [{Id, Data} | WspCaps#wsp_capabilities.unknown],
+ io:format("WARNING: ignoring unknown capability ~p\n",
+ [Unknown]),
+ WspCaps#wsp_capabilities{unknown = Unknown}
+ end.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Headers = [ Header ]
+%% Header = {FieldName, FieldValue}
+%% FieldName = atom()
+%% FieldValue = {Value, Params}
+%% | Value
+%%
+%% Params = [{Param,Value} | Param]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-define(WH(Name,Value,Params),
+ #wsp_header { name = (Name), value = (Value), params = Params}).
+
+encode_headers(Headers) ->
+ encode_headers(Headers, ?WSP_DEFAULT_VERSION).
+
+encode_headers(Headers, Version) ->
+ encode_headers(Headers, Version, []).
+
+encode_headers([H|T], Version, Acc) ->
+ encode_headers(T, Version, [encode_header(H, Version)|Acc]);
+encode_headers([], _, Acc) ->
+ list_to_binary(lists:reverse(Acc)).
+
+
+decode_headers(Bin) ->
+ decode_headers(Bin, ?WSP_DEFAULT_VERSION).
+
+decode_headers(<<>>, _Version) ->
+ [];
+decode_headers(Data, Version) ->
+ decode_headers(Data, [], Version, ?WSP_DEFAULT_CODEPAGE).
+
+
+decode_headers(<<1:1,Code:7,Data/binary>>,Acc,Version,CP) ->
+ FieldName = lookup_field_name(Code),
+ {FieldData,Data1} = scan_header_data(Data),
+ H = decode_header(FieldName, FieldData,Version,CP),
+ ?dbg("header: ~p, field data=~p, header=~p\n",
+ [FieldName, FieldData, H]),
+ if H#wsp_header.name == 'Encoding-Version' ->
+ Version1 = H#wsp_header.value,
+ ?dbg("Version switch from ~w to ~w\n", [Version, Version1]),
+ decode_headers(Data1,[H|Acc],Version1, CP);
+ true ->
+ decode_headers(Data1,[H|Acc],Version, CP)
+ end;
+decode_headers(Data = <<Code,_/binary>>,Acc,Version,CP)
+ when Code >= 32, Code < 127->
+ {TmpField,Data1} = d_text_string(Data),
+ FieldName = normalise_field_name(TmpField),
+ {FieldData,Data2} = scan_header_data(Data1),
+ H = decode_header(FieldName,FieldData,Version,CP),
+ ?dbg("header: ~p, field data=~p, header=~p\n",
+ [FieldName, FieldData, H]),
+ if H#wsp_header.name == 'Encoding-Version' ->
+ Version1 = H#wsp_header.value,
+ ?dbg("Version switch from ~w to ~w\n", [Version, Version1]),
+ decode_headers(Data2,[H|Acc],Version1, CP);
+ true ->
+ decode_headers(Data2,[H|Acc],Version, CP)
+ end;
+decode_headers(<<CP1,Data/binary>>,Acc,Version,_CP) when CP1 >= 1, CP1 =< 31 ->
+ ?dbg("decode_headers: codpage changed form ~w -> ~w\n",[_CP,CP1]),
+ decode_headers(Data,Acc,Version,CP1);
+decode_headers(<<16#7f,CP1,Data/binary>>,Acc,Version,_CP) ->
+ ?dbg("decode_headers: codpage changed form ~w -> ~w\n",[_CP,CP1]),
+ decode_headers(Data,Acc,Version,CP1);
+
+decode_headers(<<>>, Acc, _Version, _CP) ->
+ lists:reverse(Acc).
+
+%%
+%% Retrive the header data
+%% (this makes it possible to skip unknown encoding)
+%%
+scan_header_data(Data = <<N,Data0/binary>>) ->
+ if N >= 0, N =< 30 ->
+ <<Value:N/binary, Data1/binary>> = Data0,
+ {{short,Value}, Data1};
+ N == 31 ->
+ {N1, Data1} = d_uintvar(Data0),
+ <<Value:N1/binary, Data2/binary>> = Data1,
+ {{long,Value}, Data2};
+ N >= 32, N =< 127 ->
+ d_text_string(Data);
+ true ->
+ { N band 16#7f, Data0}
+ end.
+
+%%
+%% Decode header: return #wsp_header
+%%
+decode_header(Field, Value) ->
+ decode_header(Field, Value,
+ ?WSP_DEFAULT_VERSION,
+ ?WSP_DEFAULT_CODEPAGE).
+
+decode_header(Field, Value, Version, 1) ->
+ case Field of
+ 'Accept' ->
+ decode_accept(Value, Version);
+
+ 'Accept-Charset' when Version >= ?WSP_13 ->
+ decode_accept_charset(Value, Version);
+ 'Accept-Charset' ->
+ decode_accept_charset(Value, Version);
+
+ 'Accept-Encoding' when Version >= ?WSP_13 ->
+ decode_accept_encoding(Value, Version);
+ 'Accept-Encoding' ->
+ decode_accept_encoding(Value, Version);
+
+ 'Accept-Language' ->
+ decode_accept_language(Value, Version);
+ 'Accept-Ranges' ->
+ decode_accept_ranges(Value, Version);
+ 'Age' ->
+ decode_age(Value,Version);
+ 'Allow' ->
+ decode_allow(Value,Version);
+ 'Authorization' ->
+ decode_authorization(Value,Version);
+
+ 'Cache-Control' when Version >= ?WSP_14 ->
+ decode_cache_control(Value,Version);
+ 'Cache-Control' when Version >= ?WSP_13 ->
+ decode_cache_control(Value,Version);
+ 'Cache-Control' ->
+ decode_cache_control(Value,Version);
+
+ 'Connection' ->
+ decode_connection(Value,Version);
+ 'Content-Base' ->
+ decode_content_base(Value,Version);
+ 'Content-Encoding' ->
+ decode_content_encoding(Value,Version);
+ 'Content-Language' ->
+ decode_content_language(Value,Version);
+ 'Content-Length' ->
+ decode_content_length(Value,Version);
+ 'Content-Location' ->
+ decode_content_location(Value,Version);
+ 'Content-Md5' ->
+ decode_content_md5(Value,Version);
+
+ 'Content-Range' when Version >= ?WSP_13 ->
+ decode_content_range(Value,Version);
+ 'Content-Range' ->
+ decode_content_range(Value,Version);
+
+ 'Content-Type' ->
+ decode_content_type(Value,Version);
+ 'Date' ->
+ decode_date(Value, Version);
+ 'Etag' ->
+ decode_etag(Value,Version);
+ 'Expires' ->
+ decode_expires(Value,Version);
+ 'From' ->
+ decode_from(Value,Version);
+ 'Host' ->
+ decode_host(Value,Version);
+ 'If-Modified-Since' ->
+ decode_if_modified_since(Value,Version);
+ 'If-Match' ->
+ decode_if_match(Value,Version);
+ 'If-None-Match' ->
+ decode_if_none_match(Value,Version);
+ 'If-Range' ->
+ decode_if_range(Value,Version);
+ 'If-Unmodified-Since' ->
+ decode_if_unmodified_since(Value,Version);
+ 'Location' ->
+ decode_location(Value,Version);
+ 'Last-Modified' ->
+ decode_last_modified(Value,Version);
+ 'Max-Forwards' ->
+ decode_max_forwards(Value,Version);
+ 'Pragma' ->
+ decode_pragma(Value,Version);
+ 'Proxy-Authenticate' ->
+ decode_proxy_authenticate(Value,Version);
+ 'Proxy-Authorization' ->
+ decode_proxy_authorization(Value,Version);
+ 'Public' ->
+ decode_public(Value,Version);
+ 'Range' ->
+ decode_range(Value,Version);
+ 'Referer' ->
+ decode_referer(Value,Version);
+ 'Retry-After' ->
+ decode_retry_after(Value,Version);
+ 'Server' ->
+ decode_server(Value,Version);
+ 'Transfer-Encoding' ->
+ decode_transfer_encoding(Value,Version);
+ 'Upgrade' ->
+ decode_upgrade(Value,Version);
+ 'User-Agent' ->
+ decode_user_agent(Value,Version);
+ 'Vary' ->
+ decode_vary(Value,Version);
+ 'Via' ->
+ decode_via(Value,Version);
+ 'Warning' ->
+ decode_warning(Value,Version);
+ 'Www-Authenticate' ->
+ decode_www_authenticate(Value,Version);
+
+ 'Content-Disposition' when Version >= ?WSP_14 ->
+ decode_content_disposition(Value,Version);
+ 'Content-Disposition' ->
+ decode_content_disposition(Value,Version);
+
+ 'X-Wap-Application-Id' when Version >= ?WSP_12 ->
+ decode_x_wap_application_id(Value,Version);
+
+ 'X-Wap-Content-Uri' when Version >= ?WSP_12 ->
+ decode_x_wap_content_uri(Value,Version);
+
+ 'X-Wap-Initiator-Uri' when Version >= ?WSP_12 ->
+ decode_x_wap_initiator_uri(Value,Version);
+
+ 'Accept-Application' when Version >= ?WSP_12 ->
+ decode_accept_application(Value,Version);
+
+ 'Bearer-Indication' when Version >= ?WSP_12 ->
+ decode_bearer_indication(Value,Version);
+
+ 'Push-Flag' when Version >= ?WSP_12 ->
+ decode_push_flag(Value,Version);
+
+ 'Profile' when Version >= ?WSP_12 ->
+ decode_profile(Value,Version);
+
+ 'Profile-Diff' when Version >= ?WSP_12 ->
+ decode_profile_diff(Value,Version);
+
+ 'Profile-Warning' when Version >= ?WSP_12 ->
+ decode_profile_warning(Value,Version);
+
+ 'Expect' when Version >= ?WSP_15 ->
+ decode_expect(Value,Version);
+ 'Expect' when Version >= ?WSP_13 ->
+ decode_expect(Value,Version);
+
+ 'Te' when Version >= ?WSP_13 ->
+ decode_te(Value,Version);
+ 'Trailer' when Version >= ?WSP_13 ->
+ decode_trailer(Value,Version);
+
+ 'X-Wap-Tod' when Version >= ?WSP_13 ->
+ decode_x_wap_tod(Value,Version);
+ 'X-Wap.tod' when Version >= ?WSP_13 ->
+ decode_x_wap_tod(Value,Version);
+
+ 'Content-Id' when Version >= ?WSP_13 ->
+ decode_content_id(Value,Version);
+ 'Set-Cookie' when Version >= ?WSP_13 ->
+ decode_set_cookie(Value,Version);
+ 'Cookie' when Version >= ?WSP_13 ->
+ decode_cookie(Value,Version);
+
+ 'Encoding-Version' when Version >= ?WSP_13 ->
+ decode_encoding_version(Value,Version);
+ 'Profile-Warning' when Version >= ?WSP_14 ->
+ decode_profile_warning(Value,Version);
+
+ 'X-Wap-Security' when Version >= ?WSP_14 ->
+ decode_x_wap_security(Value,Version);
+ 'X-Wap-Loc-Invocation' when Version >= ?WSP_15 ->
+ decode_x_wap_loc_invocation(Value,Version); %% ???
+ 'X-Wap-Loc-Delivery' when Version >= ?WSP_15 ->
+ decode_x_wap_loc_delivery(Value,Version); %% ???
+ _ ->
+ ?dbg("Warning: none standard field ~p in version ~p codepage=1\n",
+ [Field, Version]),
+ ?WH(Field, Value, [])
+ end;
+decode_header(Field, Value, _Version, _CP) ->
+ ?dbg("Warning: none standard field ~p in version ~p codepage=~w\n",
+ [Field, _Version, _CP]),
+ ?WH(Field, Value, []).
+
+%%
+%% Encode field and value according to version
+%% FIXME: spilt multiple header values (i.e Via) into multiple
+%% headers
+%%
+encode_header(H, Version) ->
+ case H#wsp_header.name of
+ 'Accept' ->
+ [16#80, encode_accept(H, Version)];
+ 'Accept-Charset' when Version >= ?WSP_13 ->
+ [16#bb, encode_accept_charset(H, Version)];
+ 'Accept-Charset' ->
+ [16#81, encode_accept_charset(H, Version)];
+ 'Accept-Encoding' when Version >= ?WSP_13 ->
+ [16#bc, encode_accept_encoding(H, Version)];
+ 'Accept-Encoding' ->
+ [16#82, encode_accept_encoding(H, Version)];
+ 'Accept-Language' ->
+ [16#83, encode_accept_language(H, Version)];
+ 'Accept-Ranges' ->
+ [16#84, encode_accept_ranges(H, Version)];
+ 'Accept-Application' when Version >= ?WSP_12 ->
+ [16#b2, encode_accept_application(H,Version)];
+ 'Age' ->
+ [16#85, encode_age(H, Version)];
+ 'Allow' ->
+ [16#86, encode_allow(H, Version)];
+ 'Authorization' ->
+ [16#87, encode_authorization(H, Version)];
+ 'Cache-Control' when Version >= ?WSP_14 ->
+ [16#c7, encode_cache_control(H, Version)];
+ 'Cache-Control' when Version >= ?WSP_13 ->
+ [16#bd, encode_cache_control(H, Version)];
+ 'Cache-Control' ->
+ [16#88, encode_cache_control(H, Version)];
+ 'Connection' ->
+ [16#89, encode_connection(H, Version)];
+ 'Content-Base' ->
+ [16#8a, encode_content_base(H, Version)];
+ 'Content-Encoding' ->
+ [16#8b, encode_content_encoding(H, Version)];
+
+ 'Content-Language' ->
+ [16#8c, encode_content_language(H,Version)];
+ 'Content-Length' ->
+ [16#8d, encode_content_length(H,Version)];
+ 'Content-Location' ->
+ [16#8e, encode_content_location(H,Version)];
+ 'Content-Md5' ->
+ [16#8f, encode_content_md5(H,Version)];
+ 'Content-Range' when Version >= ?WSP_13 ->
+ [16#be, encode_content_range(H,Version)];
+ 'Content-Range' ->
+ [16#90, encode_content_range(H,Version)];
+ 'Content-Type' ->
+ [16#91, encode_content_type(H,Version)];
+ 'Date' ->
+ [16#92, encode_date(H,Version)];
+ 'Etag' ->
+ [16#93, encode_etag(H,Version)];
+ 'Expires' ->
+ [16#94, encode_expires(H,Version)];
+ 'From' ->
+ [16#95, encode_from(H,Version)];
+ 'Host' ->
+ [16#96, encode_host(H,Version)];
+ 'If-Modified-Since' ->
+ [16#97, encode_if_modified_since(H,Version)];
+ 'If-Match' ->
+ [16#98, encode_if_match(H,Version)];
+ 'If-None-Match' ->
+ [16#99, encode_if_none_match(H,Version)];
+ 'If-Range' ->
+ [16#9a, encode_if_range(H,Version)];
+ 'If-Unmodified-Since' ->
+ [16#9b, encode_if_unmodified_since(H,Version)];
+ 'Location' ->
+ [16#9c, encode_location(H,Version)];
+ 'Last-Modified' ->
+ [16#9d, encode_last_modified(H,Version)];
+ 'Max-Forwards' ->
+ [16#9e, encode_max_forwards(H,Version)];
+ 'Pragma' ->
+ [16#9f, encode_pragma(H,Version)];
+ 'Proxy-Authenticate' ->
+ [16#a0, encode_proxy_authenticate(H,Version)];
+ 'Proxy-Authorization' ->
+ [16#a1, encode_proxy_authorization(H,Version)];
+ 'Public' ->
+ [16#a2, encode_public(H,Version)];
+ 'Range' ->
+ [16#a3, encode_range(H,Version)];
+ 'Referer' ->
+ [16#a4, encode_referer(H,Version)];
+ 'Retry-After' ->
+ [16#a5, encode_retry_after(H,Version)];
+ 'Server' ->
+ [16#a6, encode_server(H,Version)];
+ 'Transfer-Encoding' ->
+ [16#a7, encode_transfer_encoding(H,Version)];
+ 'Upgrade' ->
+ [16#a8, encode_upgrade(H,Version)];
+ 'User-Agent' ->
+ [16#a9, encode_user_agent(H,Version)];
+ 'Vary' ->
+ [16#aa, encode_vary(H,Version)];
+ 'Via' ->
+ [16#ab, encode_via(H,Version)];
+ 'Warning' ->
+ [16#ac, encode_warning(H,Version)];
+ 'Www-Authenticate' ->
+ [16#ad, encode_www_authenticate(H,Version)];
+
+ 'Content-Disposition' when Version >= ?WSP_14 ->
+ [16#c5, encode_content_disposition(H,Version)];
+ 'Content-Disposition' ->
+ [16#ae, encode_content_disposition(H,Version)];
+
+
+ 'X-Wap-Application-Id' when Version >= ?WSP_12 ->
+ [16#af, encode_x_wap_application_id(H,Version)];
+ 'X-Wap-Content-Uri' when Version >= ?WSP_12 ->
+ [16#b0, encode_x_wap_content_uri(H,Version)];
+ 'X-Wap-Initiator-Uri' when Version >= ?WSP_12 ->
+ [16#b1, encode_x_wap_initiator_uri(H,Version)];
+
+ 'Bearer-Indication' when Version >= ?WSP_12 ->
+ [16#b3, encode_bearer_indication(H,Version)];
+ 'Push-Flag' when Version >= ?WSP_12 ->
+ [16#b4, encode_push_flag(H,Version)];
+
+ 'Profile' when Version >= ?WSP_12 ->
+ [16#b5, encode_profile(H,Version)];
+ 'Profile-Diff' when Version >= ?WSP_12 ->
+ [16#b6, encode_profile_diff(H,Version)];
+ 'Profile-Warning' when Version >= ?WSP_14 ->
+ [16#c4, encode_profile_warning(H,Version)];
+ 'Profile-Warning' when Version >= ?WSP_12 ->
+ [16#b7, encode_profile_warning(H,Version)];
+
+ 'Expect' when Version >= ?WSP_15 ->
+ [16#c8, encode_expect(H,Version)];
+ 'Expect' when Version >= ?WSP_13 ->
+ [16#b8, encode_expect(H,Version)];
+ 'Te' when Version >= ?WSP_13 ->
+ [16#b9, encode_te(H,Version)];
+ 'Trailer' when Version >= ?WSP_13 ->
+ [16#ba, encode_trailer(H,Version)];
+ 'X-Wap-Tod' when Version >= ?WSP_13 ->
+ [16#bf, encode_x_wap_tod(H,Version)];
+ 'Content-Id' when Version >= ?WSP_13 ->
+ [16#c0, encode_content_id(H,Version)];
+ 'Set-Cookie' when Version >= ?WSP_13 ->
+ [16#c1, encode_set_cookie(H,Version)];
+ 'Cookie' when Version >= ?WSP_13 ->
+ [16#c2, encode_cookie(H,Version)];
+ 'Encoding-Version' when Version >= ?WSP_13 ->
+ [16#c3, encode_encoding_version(H,Version)];
+ 'Encoding-Version' when Version < ?WSP_13 ->
+ [encode_text_string("Encoding-Version"),
+ encode_text_string(lists:flatten(format_version(H#wsp_header.value)))];
+
+ 'X-Wap-Security' when Version >= ?WSP_14 ->
+ [16#c6, encode_x_wap_security(H,Version)];
+ 'X-Wap-Loc-Invocation' when Version >= ?WSP_15 ->
+ [16#c9, encode_x_wap_loc_invocation(H,Version)];
+ 'X-Wap-Loc-Delivery' when Version >= ?WSP_15 ->
+ [16#ca, encode_x_wap_loc_delivery(H,Version)];
+ Field when atom(Field) ->
+ [encode_text_string(atom_to_list(Field)),
+ encode_text_string(H#wsp_header.value)];
+ Field when list(Field) ->
+ [encode_text_string(Field),
+ encode_text_string(H#wsp_header.value)]
+ end.
+
+%%
+%% Convert HTTP headers into WSP headers
+%%
+parse_headers([H | Hs]) ->
+ parse_header(H, Hs);
+parse_headers([]) ->
+ [].
+
+parse_header(H) ->
+ parse_header(H, []).
+
+parse_header({FieldName,FieldValue}, Hs) ->
+ case single_comma_field(FieldName) of
+ true ->
+ io:format("parse: ~s: ~s\n", [FieldName, FieldValue]),
+ H = parse_hdr(FieldName,FieldValue),
+ io:format("header: ~p\n", [H]),
+ [H | parse_headers(Hs)];
+ false ->
+ Values = string:tokens(FieldValue, ","),
+ parse_header(FieldName, Values, Hs)
+ end.
+
+parse_header(FieldName, [Value|Vs], Hs) ->
+ io:format("parse: ~s: ~s\n", [FieldName, Value]),
+ H = parse_hdr(FieldName, Value),
+ io:format("header: ~p\n", [H]),
+ [H | parse_header(FieldName, Vs, Hs)];
+parse_header(_FieldName, [], Hs) ->
+ parse_headers(Hs).
+
+
+single_comma_field(Field) ->
+ case Field of
+ 'Set-Cookie' -> true; %% FIXME (Is multiple!)
+ 'Date' -> true;
+ 'Expires' -> true;
+ 'If-Modified-Since' -> true;
+ 'If-Range' -> true;
+ 'If-Unmodified-Since' -> true;
+ 'Last-Modified' -> true;
+ 'Retry-After' -> true;
+ 'X-Wap-Tod' -> true;
+ _ -> false
+ end.
+
+
+parse_hdr(Field, Value0) ->
+ Value = trim(Value0),
+ case Field of
+ 'Accept' -> parse_accept(Value);
+ 'Accept-Charset' -> parse_accept_charset(Value);
+ 'Accept-Encoding' -> parse_accept_encoding(Value);
+ 'Accept-Language' -> parse_accept_language(Value);
+ 'Accept-Ranges' -> parse_accept_ranges(Value);
+ 'Age' -> parse_age(Value);
+ 'Allow' -> parse_allow(Value);
+ 'Authorization' -> parse_authorization(Value);
+ 'Cache-Control' -> parse_cache_control(Value);
+ 'Connection' -> parse_connection(Value);
+ 'Content-Base' -> parse_content_base(Value);
+ 'Content-Encoding' -> parse_content_encoding(Value);
+ 'Content-Language' -> parse_content_language(Value);
+ 'Content-Length' -> parse_content_length(Value);
+ 'Content-Location' -> parse_content_location(Value);
+ 'Content-Md5' -> parse_content_md5(Value);
+ 'Content-Range' -> parse_content_range(Value);
+ 'Content-Type' -> parse_content_type(Value);
+ 'Date' -> parse_date(Value);
+ 'Etag' -> parse_etag(Value);
+ 'Expires' -> parse_expires(Value);
+ 'From' -> parse_from(Value);
+ 'Host' -> parse_host(Value);
+ 'If-Modified-Since' -> parse_if_modified_since(Value);
+ 'If-Match' -> parse_if_match(Value);
+ 'If-None-Match' -> parse_if_none_match(Value);
+ 'If-Range' -> parse_if_range(Value);
+ 'If-Unmodified-Since' -> parse_if_unmodified_since(Value);
+ 'Location' -> parse_location(Value);
+ 'Last-Modified' -> parse_last_modified(Value);
+ 'Max-Forwards' -> parse_max_forwards(Value);
+ 'Pragma' -> parse_pragma(Value);
+ 'Proxy-Authenticate' -> parse_proxy_authenticate(Value);
+ 'Proxy-Authorization' -> parse_proxy_authorization(Value);
+ 'Public' -> parse_public(Value);
+ 'Range' -> parse_range(Value);
+ 'Referer' -> parse_referer(Value);
+ 'Retry-After' -> parse_retry_after(Value);
+ 'Server' -> parse_server(Value);
+ 'Transfer-Encoding' -> parse_transfer_encoding(Value);
+ 'Upgrade' -> parse_upgrade(Value);
+ 'User-Agent' -> parse_user_agent(Value);
+ 'Vary' -> parse_vary(Value);
+ 'Via' -> parse_via(Value);
+ 'Warning' -> parse_warning(Value);
+ 'Www-Authenticate' -> parse_www_authenticate(Value);
+ 'Content-Disposition' -> parse_content_disposition(Value);
+ 'X-Wap-Application-Id' -> parse_x_wap_application_id(Value);
+ 'X-Wap-Content-Uri' -> parse_x_wap_content_uri(Value);
+ 'X-Wap-Initiator-Uri' -> parse_x_wap_initiator_uri(Value);
+ 'Accept-Application' -> parse_accept_application(Value);
+ 'Bearer-Indication' -> parse_bearer_indication(Value);
+ 'Push-Flag' -> parse_push_flag(Value);
+ 'Profile' -> parse_profile(Value);
+ 'Profile-Diff' -> parse_profile_diff(Value);
+ 'Profile-Warning' -> parse_profile_warning(Value);
+ 'Expect' -> parse_expect(Value);
+ 'Te' -> parse_te(Value);
+ 'Trailer' -> parse_trailer(Value);
+ 'X-Wap-Tod' -> parse_x_wap_tod(Value);
+ 'Content-Id' -> parse_content_id(Value);
+ 'Set-Cookie' -> parse_set_cookie(Value);
+ 'Cookie' -> parse_cookie(Value);
+ 'Encoding-Version' -> parse_encoding_version(Value);
+ 'X-Wap-Security' -> parse_x_wap_security(Value);
+ 'X-Wap-Loc-Invocation' -> parse_x_wap_loc_invocation(Value);
+ 'X-Wap-Loc-Delivery' -> parse_x_wap_loc_delivery(Value);
+ _ ->
+ ?dbg("Warning: header field ~p not recognissed\n",[Field]),
+ #wsp_header { name = Field, value = Value}
+ end.
+
+%%
+%% Format headers, will combine multiple headers into one
+%% FIXME: if length is < MAX_HTTP_HEADER_LENGTH
+%%
+format_headers(Hs) ->
+ format_hdrs(lists:keysort(#wsp_header.name,Hs), []).
+
+format_hdrs([H | Hs], Acc) ->
+ V1 = format_value(H),
+ format_hdrs(Hs, H#wsp_header.name, V1, Acc);
+format_hdrs([], Acc) ->
+ lists:reverse(Acc).
+
+format_hdrs([H|Hs], FieldName, FieldValue, Acc)
+ when FieldName == H#wsp_header.name ->
+ V1 = format_value(H),
+ format_hdrs(Hs, FieldName, [FieldValue,",",V1], Acc);
+format_hdrs(Hs, FieldName, FieldValue, Acc) ->
+ format_hdrs(Hs, [{FieldName, lists:flatten(FieldValue)} | Acc]).
+
+
+%%
+%% Format header: #wsp_header => {FieldName, Value}
+%%
+
+format_header(H) ->
+ {H#wsp_header.name, format_value(H)}.
+
+format_value(H) ->
+ case H#wsp_header.name of
+ 'Accept' -> format_accept(H);
+ 'Accept-Charset' -> format_accept_charset(H);
+ 'Accept-Encoding' -> format_accept_encoding(H);
+ 'Accept-Language' -> format_accept_language(H);
+ 'Accept-Ranges' -> format_accept_ranges(H);
+ 'Age' -> format_age(H);
+ 'Allow' -> format_allow(H);
+ 'Authorization' -> format_authorization(H);
+ 'Cache-Control' -> format_cache_control(H);
+ 'Connection' -> format_connection(H);
+ 'Content-Base' -> format_content_base(H);
+ 'Content-Encoding' -> format_content_encoding(H);
+ 'Content-Language' -> format_content_language(H);
+ 'Content-Length' -> format_content_length(H);
+ 'Content-Location' -> format_content_location(H);
+ 'Content-Md5' -> format_content_md5(H);
+ 'Content-Range' -> format_content_range(H);
+ 'Content-Type' -> format_content_type(H);
+ 'Date' -> format_date(H);
+ 'Etag' -> format_etag(H);
+ 'Expires' -> format_expires(H);
+ 'From' -> format_from(H);
+ 'Host' -> format_host(H);
+ 'If-Modified-Since' -> format_if_modified_since(H);
+ 'If-Match' -> format_if_match(H);
+ 'If-None-Match' -> format_if_none_match(H);
+ 'If-Range' -> format_if_range(H);
+ 'If-Unmodified-Since' -> format_if_unmodified_since(H);
+ 'Location' -> format_location(H);
+ 'Last-Modified' -> format_last_modified(H);
+ 'Max-Forwards' -> format_max_forwards(H);
+ 'Pragma' -> format_pragma(H);
+ 'Proxy-Authenticate' -> format_proxy_authenticate(H);
+ 'Proxy-Authorization' -> format_proxy_authorization(H);
+ 'Public' -> format_public(H);
+ 'Range' -> format_range(H);
+ 'Referer' -> format_referer(H);
+ 'Retry-After' -> format_retry_after(H);
+ 'Server' -> format_server(H);
+ 'Transfer-Encoding' -> format_transfer_encoding(H);
+ 'Upgrade' -> format_upgrade(H);
+ 'User-Agent' -> format_user_agent(H);
+ 'Vary' -> format_vary(H);
+ 'Via' -> format_via(H);
+ 'Warning' -> format_warning(H);
+ 'Www-Authenticate' -> format_www_authenticate(H);
+ 'Content-Disposition' -> format_content_disposition(H);
+ 'X-Wap-Application-Id' -> format_x_wap_application_id(H);
+ 'X-Wap-Content-Uri' -> format_x_wap_content_uri(H);
+ 'X-Wap-Initiator-Uri' -> format_x_wap_initiator_uri(H);
+ 'Accept-Application' -> format_accept_application(H);
+ 'Bearer-Indication' -> format_bearer_indication(H);
+ 'Push-Flag' -> format_push_flag(H);
+ 'Profile' -> format_profile(H);
+ 'Profile-Diff' -> format_profile_diff(H);
+ 'Profile-Warning' -> format_profile_warning(H);
+ 'Expect' -> format_expect(H);
+ 'Te' -> format_te(H);
+ 'Trailer' -> format_trailer(H);
+ 'X-Wap-Tod' -> format_x_wap_tod(H);
+ 'Content-Id' -> format_content_id(H);
+ 'Set-Cookie' -> format_set_cookie(H);
+ 'Cookie' -> format_cookie(H);
+ 'Encoding-Version' -> format_encoding_version(H);
+ 'X-Wap-Security' -> format_x_wap_security(H);
+ 'X-Wap-Loc-Invocation' -> format_x_wap_loc_invocation(H);
+ 'X-Wap-Loc-Delivery' -> format_x_wap_loc_delivery(H);
+ _Field ->
+ ?dbg("Warning: header field ~s not recognissed\n",[_Field]),
+ to_list(H#wsp_header.value)
+ end.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Encode of field values
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Accept: <content-type> [q=<q-value>] [params]
+%% Type: Multiple
+%% Ref: 8.4.2.7
+%%
+%% Accept-value = Constrained-media | Accept-general-form
+%%
+%% Accept-general-form = Value-length Media-range [Accept-parameters]
+%% Media-range = (Well-known-media | Extension-media) *(Parameter)
+%% Accept-parameters = Q-token Q-value *(Accept-extension)
+%% Accept-extension = Parameter
+%% Constrain-media = Constrained-encoding
+%% Well-known-media = Integer-value
+%% Constrained-encoding = Short-Integer | Extension-media
+%% Q-token = <Octet 128>
+%%
+parse_accept(String) ->
+ %% FIXME
+ ?WH('Accept',String,[]).
+
+format_accept(H) ->
+ [H#wsp_header.value, format_params(H#wsp_header.params)].
+
+encode_accept(H, Version) ->
+ case encode_params(H#wsp_header.params,Version) of
+ <<>> ->
+ encode_well_known_media(H#wsp_header.value, Version);
+ Params ->
+ Media = encode_well_known_media(H#wsp_header.value, Version),
+ e_value(Media, Params)
+ end.
+
+decode_accept(Value, Version) when integer(Value) ->
+ %% Constrained-encoding: Short-Integer
+ ?WH('Accept',decode_well_known_media(Value, Version),[]);
+decode_accept(Value, Version) when list(Value) ->
+ ?WH('Accept',decode_well_known_media(Value,Version),[]);
+decode_accept({_,Data}, Version) ->
+ %% Accept-general-form
+ {Value,QData} = scan_header_data(Data),
+ Media_Range = decode_well_known_media(Value,Version),
+ Params = decode_params(QData, Version),
+ ?WH('Accept',Media_Range,Params).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Accept-Charset: <charset> | * [q=<q-value>]
+%% Type: Multiple
+%% Ref: 8.4.2.8
+%% Note that the definition of this one is a mess!!!!
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_accept_charset(String) ->
+ %% FIXME
+ ?WH('Accept-Charset',String,[]).
+
+format_accept_charset(H) ->
+ [H#wsp_header.value, format_params(H#wsp_header.params)].
+
+encode_accept_charset(H, _Version) ->
+ %% FIXME
+ encode_text_string(H#wsp_header.value).
+
+decode_accept_charset(0, _Version) ->
+ ?WH('Accept-Charset',"*",[]);
+decode_accept_charset(Value, _Version) when integer(Value) ->
+ ?WH('Accept-Charset', decode_charset(Value),[]);
+decode_accept_charset(Value, _Version) when list(Value) ->
+ ?WH('Accept-Charset',Value,[]);
+decode_accept_charset({short,Data}, _Version) ->
+ %% Me guessing that the short form SHOULD be mulit octet integer!!!
+ Value = d_long(Data),
+ ?WH('Accept-Charset', decode_charset(Value),[]);
+decode_accept_charset({long,Value}, _Version) ->
+ {Data1, QData} = scan_header_data(Value),
+ CharSet = case Data1 of
+ 0 ->
+ "*";
+ Value1 when integer(Value1) ->
+ decode_charset(Value1);
+ Value1 when list(Value1) ->
+ Value1;
+ {short,Value1} ->
+ Value2 = d_long(Value1),
+ decode_charset(Value2)
+ end,
+ Params = if QData == <<>> ->
+ [];
+ true ->
+ {QValue,_} = d_q_value(QData),
+ {CharSet,[{q, QValue}]}
+ end,
+ ?WH('Accept-Charset',CharSet, Params).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Accept-Encoding: gzip | compress | deflate | * [q=<q-value>]
+%% Ref:
+%% Type: Multiple
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+parse_accept_encoding(String) ->
+ ?WH('Accept-Encoding',String,[]).
+
+format_accept_encoding(H) ->
+ [H#wsp_header.value, format_params(H#wsp_header.params)].
+
+encode_accept_encoding(H, _Version) ->
+ %% FIXME general form
+ case H#wsp_header.value of
+ "gzip" -> ?ENCODE_SHORT(0);
+ "compress" -> ?ENCODE_SHORT(1);
+ "deflate" -> ?ENCODE_SHORT(2);
+ Value -> encode_text_string(Value)
+ end.
+
+decode_accept_encoding(0, _Version) ->
+ ?WH('Accept-Encoding',"gzip",[]);
+decode_accept_encoding(1, _Version) ->
+ ?WH('Accept-Encoding',"compress",[]);
+decode_accept_encoding(2, _Version) ->
+ ?WH('Accept-Encoding',"deflate",[]);
+decode_accept_encoding(Value, Version) when list(Version) ->
+ ?WH('Accept-Encoding',Value,[]);
+decode_accept_encoding({_,Data}, _Version) when binary(Data) ->
+ {Enc, Data1} = scan_header_data(Data),
+ Params = if Data1 == <<>> ->
+ [];
+ true ->
+ {QVal,_} = d_q_value(Data1),
+ [{q, QVal}]
+ end,
+ case Enc of
+ 0 -> ?WH('Accept-Encoding',"gzip",Params);
+ 1 -> ?WH('Accept-Encoding',"compress",Params);
+ 2 -> ?WH('Accept-Encoding',"deflate",Params);
+ 3 -> ?WH('Accept-Encoding',"*",Params);
+ _ when list(Enc) ->
+ ?WH('Accept-Encoding',Enc,Params)
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%
+%% Accept-Language: * | <lang> [q=<q-value>]
+%% Type: Multiple
+%% Ref: 8.4.2.10
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+parse_accept_language(Value) ->
+ ?WH('Accept-Language',Value,[]).
+
+format_accept_language(H) ->
+ [H#wsp_header.value, format_params(H#wsp_header.params)].
+
+encode_accept_language(H, _Version) ->
+ case H#wsp_header.value of
+ "*" -> ?ENCODE_SHORT(0);
+ Lang -> case catch encode_lang(Lang) of
+ {'EXIT', _} -> encode_text_string(Lang);
+ Code -> encode_integer(Code)
+ end
+ end.
+
+decode_accept_language(0, _Version) ->
+ ?WH('Accept-Language',"*",[]);
+decode_accept_language(Value, _Version) when integer(Value) ->
+ ?WH('Accept-Language',decode_lang(Value),[]);
+decode_accept_language(Value, _Version) when list(Value) ->
+ ?WH('Accept-Language',Value,[]);
+decode_accept_language({_,Data}, _Version) ->
+ {Data1, QData} = scan_header_data(Data),
+ Charset = case Data1 of
+ 0 ->
+ "*";
+ Value1 when integer(Value1) ->
+ decode_lang(Value1);
+ Value1 when list(Value1) ->
+ Value1;
+ {short,Data2} ->
+ decode_lang(d_long(Data2))
+ end,
+ Params =
+ if QData == <<>> ->
+ [];
+ true ->
+ {QVal,_} = d_q_value(QData),
+ [{q, QVal}]
+ end,
+ ?WH('Accept-Language',Charset,Params).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Accept-Ranges: none | bytes | <extension>
+%% Type: single
+%% Ref:
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+parse_accept_ranges(Value) ->
+ ?WH('Accept-Ranges', Value, []).
+
+format_accept_ranges(H) ->
+ H#wsp_header.value.
+
+encode_accept_ranges(H, _Version) ->
+ case H#wsp_header.value of
+ "none" -> ?ENCODE_SHORT(0);
+ "bytes" -> ?ENCODE_SHORT(1);
+ Value -> encode_text_string(Value)
+ end.
+
+decode_accept_ranges(0, _Version) ->
+ ?WH('Accept-Ranges', "none", []);
+decode_accept_ranges(1, _Version) ->
+ ?WH('Accept-Ranges', "bytes", []);
+decode_accept_ranges(Value, _Version) when list(Value) ->
+ ?WH('Accept-Ranges', Value, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Age: <delta-seconds>
+%% Type: single
+%% Ref:
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+parse_age(Value) ->
+ %% FIXME
+ ?WH('Age', Value, []).
+
+format_age(H) ->
+ integer_to_list(H#wsp_header.value).
+
+encode_age(H, _Version) ->
+ e_delta_seconds(H#wsp_header.value).
+
+decode_age(Value, _Version) when integer(Value) ->
+ ?WH('Age', Value, []);
+decode_age({short,Data}, _Version) ->
+ ?WH('Age', d_long(Data), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Allow: <well-known-method>
+%% Type: multiple
+%% Ref:
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_allow(Value) ->
+ ?WH('Allow', parse_well_known_method(Value), []).
+
+format_allow(H) ->
+ atom_to_list(H#wsp_header.value).
+
+encode_allow(H, Version) ->
+ encode_well_known_method(H#wsp_header.value, Version).
+
+decode_allow(Value, Version) ->
+ ?WH('Allow', decode_well_known_method(Value,Version), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Authorization:
+%% Ref: 8.4.2.14
+%% Type: server-to-client
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_authorization(Value) ->
+ parse_credentials('Authorization', Value).
+
+format_authorization(H) ->
+ format_credentials(H#wsp_header.value, H#wsp_header.params).
+
+encode_authorization(H, Version) ->
+ encode_credentials(H#wsp_header.value, H#wsp_header.params, Version).
+
+decode_authorization({_,Data}, Version) ->
+ decode_credentials('Authorization', Data, Version).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%%
+%% Cache-Control:
+%% 8.4.2.15
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_cache_control(Value) ->
+ case Value of
+ "no-cache" -> ?WH('Cache-Control',Value,[]);
+ "no-store" -> ?WH('Cache-Control',Value,[]);
+ "max-stale" -> ?WH('Cache-Control',Value,[]);
+ "only-if-cached" -> ?WH('Cache-Control',Value,[]);
+ "private" -> ?WH('Cache-Control',Value,[]);
+ "public" -> ?WH('Cache-Control',Value,[]);
+ "no-transform" -> ?WH('Cache-Control',Value,[]);
+ "must-revalidate" -> ?WH('Cache-Control',Value,[]);
+ "proxy-revalidate" -> ?WH('Cache-Control',Value,[]);
+ _ ->
+ Params = parse_params([Value]),
+ ?WH('Cache-Control',"",Params)
+ end.
+
+format_cache_control(H) ->
+ if H#wsp_header.value == "" ->
+ format_params0(H#wsp_header.params);
+ true ->
+ [H#wsp_header.value, format_params(H#wsp_header.params)]
+ end.
+
+
+
+encode_cache_control(H, Version) ->
+ case H#wsp_header.value of
+ "no-cache" -> ?ENCODE_SHORT(0);
+ "no-store" -> ?ENCODE_SHORT(1);
+ "max-stale" -> ?ENCODE_SHORT(3);
+ "only-if-cached" -> ?ENCODE_SHORT(5);
+ "private" -> ?ENCODE_SHORT(7);
+ "public" -> ?ENCODE_SHORT(6);
+ "no-transform" -> ?ENCODE_SHORT(8);
+ "must-revalidate" -> ?ENCODE_SHORT(9);
+ "proxy-revalidate" -> ?ENCODE_SHORT(10);
+ "" ->
+ case H#wsp_header.params of
+ [{'no-cache',Field}] ->
+ e_value(?ENCODE_SHORT(0),
+ e_field_name(Field,Version));
+ [{'max-age',Sec}] ->
+ e_value(?ENCODE_SHORT(2),
+ e_delta_seconds(Sec));
+ [{'max-fresh',Sec}] ->
+ e_value(?ENCODE_SHORT(4),
+ e_delta_seconds(Sec));
+ [{'private',Field}] ->
+ e_value(?ENCODE_SHORT(7),
+ e_field_name(Field,Version));
+ [{'s-maxage',Sec}] ->
+ e_value(?ENCODE_SHORT(11),
+ e_delta_seconds(Sec))
+ end;
+ Ext ->
+ [Param] = H#wsp_header.params,
+ e_value(encode_text_string(Ext),
+ encode_parameter(Param, Version))
+ end.
+
+
+decode_cache_control(Value, _Version) when integer(Value) ->
+ case Value of
+ 0 -> ?WH('Cache-Control',"no-cache",[]);
+ 1 -> ?WH('Cache-Control',"no-store",[]);
+ 3 -> ?WH('Cache-Control',"max-stale",[]);
+ 5 -> ?WH('Cache-Control',"only-if-cached",[]);
+ 7 -> ?WH('Cache-Control',"private",[]);
+ 6 -> ?WH('Cache-Control',"public",[]);
+ 8 -> ?WH('Cache-Control',"no-transform",[]);
+ 9 -> ?WH('Cache-Control',"must-revalidate",[]);
+ 10 -> ?WH('Cache-Control',"proxy-revalidate",[])
+ end;
+decode_cache_control(Value, _Version) when list(Value) ->
+ ?WH('Cache-Control',Value,[]);
+decode_cache_control({_,Data},Version) ->
+ {CacheDir, Data1} = scan_header_data(Data),
+ case CacheDir of
+ 0 ->
+ {Field,_} = d_field_name(Data1),
+ ?WH('Cache-Control',"",[{'no-cache',Field}]);
+ 2 ->
+ {Sec,_} = d_integer_value(Data1),
+ ?WH('Cache-Control',"",[{'max-age',Sec}]);
+ 4 ->
+ {Sec,_} = d_integer_value(Data1),
+ ?WH('Cache-Control',"",[{'max-fresh',Sec}]);
+ 7 ->
+ {Field,_} = d_field_name(Data1),
+ ?WH('Cache-Control',"",[{private,Field}]);
+ 11 ->
+ {Sec,_} = d_integer_value(Data1),
+ ?WH('Cache-Control',"",[{'s-maxage',Sec}]);
+ Ext when list(Ext) ->
+ {Param,_} = decode_parameter(Data1, Version),
+ ?WH('Cache-Control',Ext,[Param])
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Connection: close | Ext
+%% Type: single
+%% Ref: 8.4.2.16
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+parse_connection(Value) ->
+ ?WH('Connection', Value, []).
+
+format_connection(H) ->
+ H#wsp_header.value.
+
+encode_connection(H, _Version) ->
+ case H#wsp_header.value of
+ "close" -> ?ENCODE_SHORT(0);
+ Value -> encode_text_string(Value)
+ end.
+
+decode_connection(0, _Version) ->
+ ?WH('Connection', "close", []);
+decode_connection(Value, _Version) when list(Value) ->
+ ?WH('Connection', Value, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Content-Base: <uri>
+%% Type: single
+%% Ref:
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+parse_content_base(Value) ->
+ ?WH('Content-Base', Value, []).
+
+format_content_base(H) ->
+ H#wsp_header.value.
+
+encode_content_base(H, _Version) ->
+ encode_uri_value(H#wsp_header.value).
+
+decode_content_base(Value, _Version) when list(Value) ->
+ ?WH('Content-Base', Value, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Content-Encoding:
+%% Ref: 8.4.2.18
+%% Type: single
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_content_encoding(Value) ->
+ ?WH('Content-Encoding', tolower(Value), []).
+
+format_content_encoding(H) ->
+ H#wsp_header.value.
+
+encode_content_encoding(H, _Version) ->
+ case H#wsp_header.value of
+ "gzip" -> ?ENCODE_SHORT(0);
+ "compress" -> ?ENCODE_SHORT(1);
+ "deflate" -> ?ENCODE_SHORT(2);
+ Value -> encode_text_string(Value)
+ end.
+
+decode_content_encoding(0, _Version) ->
+ ?WH('Content-Encoding', "gzip", []);
+decode_content_encoding(1, _Version) ->
+ ?WH('Content-Encoding', "compress", []);
+decode_content_encoding(2, _Version) ->
+ ?WH('Content-Encoding',"deflate", []);
+decode_content_encoding(Value, _Version) when list(Value) ->
+ ?WH('Content-Encoding', Value, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Content-Language:
+%% Ref: 8.4.2.19
+%% Type: single
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_content_language(Value) ->
+ ?WH('Content-Language', Value, []).
+
+format_content_language(H) ->
+ H#wsp_header.value.
+
+encode_content_language(H, _Version) ->
+ case H#wsp_header.value of
+ "*" -> ?ENCODE_SHORT(0);
+ Lang -> case catch encode_lang(Lang) of
+ {'EXIT', _} -> encode_text_string(Lang);
+ Code -> encode_integer(Code)
+ end
+ end.
+
+decode_content_language(0, _Version) ->
+ ?WH('Content-Language',"*",[]);
+decode_content_language(Value, _Version) when integer(Value) ->
+ ?WH('Content-Language',decode_lang(Value),[]);
+decode_content_language(Value, _Version) when list(Value) ->
+ ?WH('Content-Language',Value,[]);
+decode_content_language({short,Data}, _Version) ->
+ Value = d_long(Data),
+ ?WH('Content-Language',decode_lang(Value),[]);
+decode_content_language(Value, _Version) when list(Value) ->
+ ?WH('Content-Language',Value,[]).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Content-Length: <integer-value>
+%% Ref: 8.4.2.20
+%% Type: single
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+parse_content_length(Value) ->
+ ?WH('Content-Length', list_to_integer(Value), []).
+
+format_content_length(H) ->
+ integer_to_list(H#wsp_header.value).
+
+encode_content_length(H, _Version) ->
+ encode_integer(H#wsp_header.value).
+
+decode_content_length(Value, _Version) when integer(Value) ->
+ ?WH('Content-Length', Value, []);
+decode_content_length({short,Data}, _Version) ->
+ Value = d_long(Data),
+ ?WH('Content-Length', Value, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Content-Location: <uri-value>
+%% Ref: 8.4.2.21
+%% Type: single
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+parse_content_location(Value) ->
+ ?WH('Content-Location', Value, []).
+
+format_content_location(H) ->
+ H#wsp_header.value.
+
+encode_content_location(H, _Version) ->
+ encode_uri_value(H#wsp_header.value).
+
+decode_content_location(Value, _Version) when list(Value) ->
+ ?WH('Content-Location', decode_uri_value(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Content-Md5: <value-length> <digest>
+%% Ref: 8.4.2.22
+%% Type: single, end-to-end
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+parse_content_md5(Value) ->
+ ?WH('Content-Md5', base64:decode(Value), []).
+
+format_content_md5(H) ->
+ base64:encode(H#wsp_header.value).
+
+encode_content_md5(H, _Version) ->
+ e_value(H#wsp_header.value).
+
+decode_content_md5({_,Data}, _Version) ->
+ ?WH('Content-Md5', Data, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Content-Range: <first-byte-pos> <entity-len>
+%% Ref: 8.4.2.23
+%% Type: single
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_content_range(Value) ->
+ %% FIXME:
+ ?WH('Content-Range', Value, []).
+
+format_content_range(H) ->
+ {Pos,Len} = H#wsp_header.value,
+ if Len == "*" ->
+ ["bytes ", integer_to_list(Pos), "-*/*"];
+ true ->
+ ["bytes ", integer_to_list(Pos),"-",integer_to_list(Len-1),
+ "/", integer_to_list(Len)]
+ end.
+
+encode_content_range(H, _Version) ->
+ case H#wsp_header.value of
+ {Pos, "*"} ->
+ e_value(e_uintvar(Pos), <<128>>);
+ {Pos, Len} ->
+ e_value(e_uintvar(Pos), e_uintvar(Len))
+ end.
+
+decode_content_range({_, Data}, _Version) ->
+ {Pos, Data1} = d_uintvar(Data),
+ Len =
+ case Data1 of
+ <<128>> -> "*";
+ _ ->
+ {L, _} = d_uintvar(Data1),
+ L
+ end,
+ ?WH('Content-Range', {Pos,Len}, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Content-Type:
+%% Ref: 8.4.2.24
+%% Type: single, end-to-end
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+parse_content_type(Value) ->
+ case string:tokens(Value, ";") of
+ [Type | Ps] ->
+ Params = parse_params(Ps),
+ ?WH('Content-Type', Type, Params);
+ [] ->
+ ?WH('Content-Type', Value, [])
+ end.
+
+format_content_type(H) ->
+ [H#wsp_header.value, format_params(H#wsp_header.params)].
+
+encode_content_type(H, Version) ->
+ case encode_params(H#wsp_header.params,Version) of
+ <<>> ->
+ encode_well_known_media(H#wsp_header.value, Version);
+ Params ->
+ Media = encode_well_known_media(H#wsp_header.value, Version),
+ e_value(Media, Params)
+ end.
+
+decode_content_type(Value,Version) when integer(Value) ->
+ ?WH('Content-Type', decode_well_known_media(Value,Version), []);
+decode_content_type(Value,Version) when list(Value) ->
+ ?WH('Content-Type', decode_well_known_media(Value,Version), []);
+decode_content_type({_, Data}, Version) ->
+ {Value,Data1} = scan_header_data(Data),
+ ContentType = if integer(Value) ->
+ decode_well_known_media(Value,Version);
+ list(Value) ->
+ decode_well_known_media(Value,Version);
+ true ->
+ {_,Data2} = Value,
+ decode_well_known_media(d_long(Data2),Version)
+ end,
+ Params = decode_params(Data1, Version),
+ ?WH('Content-Type', ContentType, Params).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Date: <http-date>
+%% Ref: 8.2.4.25
+%% Type: single, end-to-end
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_date(String) ->
+ {DateTime, _} = parse_http_date(String),
+ ?WH('Date', DateTime, []).
+
+format_date(H) ->
+ fmt_date(H#wsp_header.value).
+
+encode_date(H, _Version) ->
+ e_date(H#wsp_header.value).
+
+decode_date(Value, _Version) ->
+ ?WH('Date', d_date(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Etag: <text-string>
+%% Ref: 8.2.4.26
+%% Type: single, end-to-end
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+parse_etag(Value) ->
+ ?WH('Etag', Value, []).
+
+format_etag(H) ->
+ H#wsp_header.value.
+
+encode_etag(H, _Version) ->
+ encode_text_string(H#wsp_header.value).
+
+decode_etag(Value, _Version) ->
+ ?WH('Etag', decode_text_string(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Expires: <date-value>
+%% Ref: 8.4.2.27
+%% Type: single, end-to-end, server-to-client
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_expires(String) ->
+ {DateTime, _} = parse_http_date(String),
+ ?WH('Expires', DateTime, []).
+
+format_expires(H) ->
+ fmt_date(H#wsp_header.value).
+
+encode_expires(H, _Version) ->
+ e_date(H#wsp_header.value).
+
+decode_expires(Value, _Version) ->
+ ?WH('Expires', d_date(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% From: <text-string>
+%% Ref: 8.4.2.28
+%% Type: single,
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+parse_from(Value) ->
+ ?WH('From', Value, []).
+
+format_from(H) ->
+ H#wsp_header.value.
+
+encode_from(H, _Version) ->
+ encode_text_string(H#wsp_header.value).
+
+decode_from(Value, _Version) ->
+ ?WH('From', decode_text_string(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Host: <text-string>
+%% Ref: 8.4.2.29
+%% Type: single, end-to-end, client-to-server
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_host(Value) ->
+ ?WH('Host', Value, []).
+
+format_host(H) ->
+ H#wsp_header.value.
+
+encode_host(H, _Version) ->
+ encode_text_string(H#wsp_header.value).
+
+decode_host(Value, _Version) ->
+ ?WH('Host', decode_text_string(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% If-Modified-Since: <date-value>
+%% Ref: 8.4.2.30
+%% Type: single, end-to-end, client-to-server
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_if_modified_since(String) ->
+ {DateTime, _} = parse_http_date(String),
+ ?WH('If-Modified-Since', DateTime, []).
+
+format_if_modified_since(H) ->
+ fmt_date(H#wsp_header.value).
+
+encode_if_modified_since(H, _Version) ->
+ e_date(H#wsp_header.value).
+
+decode_if_modified_since(Value, _Version) ->
+ ?WH('If-Modified-Since', d_date(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% If-Match: <text-string>
+%% Ref: 8.4.2.31
+%% Type: end-to-end, client-to-server
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_if_match(Value) ->
+ ?WH('If-Match', Value, []).
+
+format_if_match(H) ->
+ H#wsp_header.value.
+
+encode_if_match(H, _Version) ->
+ encode_text_string(H#wsp_header.value).
+
+decode_if_match(Value, _Version) ->
+ ?WH('If-Match', decode_text_string(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% If-None-Match: <text-string>
+%% Ref: 8.4.2.32
+%% Type: end-to-end, client-to-server
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_if_none_match(Value) ->
+ ?WH('If-None-Match', Value, []).
+
+format_if_none_match(H) ->
+ H#wsp_header.value.
+
+encode_if_none_match(H, _Version) ->
+ encode_text_string(H#wsp_header.value).
+
+decode_if_none_match(Value, _Version) ->
+ ?WH('If-None-Match', decode_text_string(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% If-Range: Text | Date
+%% Ref: 8.4.2.33
+%% Type: end-to-end, client-to-server
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_if_range(Value) ->
+ case catch parse_http_date(Value) of
+ {'EXIT', _} ->
+ ?WH('If-Range', Value, []);
+ {DateTime,_} ->
+ ?WH('If-Range', DateTime, [])
+ end.
+
+
+format_if_range(H) ->
+ case H#wsp_header.value of
+ Value when list(Value) -> Value;
+ DateTime -> fmt_date(DateTime)
+ end.
+
+encode_if_range(H, _Version) ->
+ case H#wsp_header.value of
+ Value when list(Value) ->
+ encode_text_string(Value);
+ DateTime ->
+ e_date(DateTime)
+ end.
+
+decode_if_range(Value, _Version) when list(Value) ->
+ ?WH('If-Range', decode_text_string(Value), []);
+decode_if_range(Value, _Version) ->
+ ?WH('If-Range', d_date(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% If-Unmodified-Since: <date-value>
+%% Ref: 8.4.2.34
+%% Type: single, end-to-end, client-to-server
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_if_unmodified_since(String) ->
+ {DateTime, _} = parse_http_date(String),
+ ?WH('If-Unmodified-Since', DateTime, []).
+
+format_if_unmodified_since(H) ->
+ fmt_date(H#wsp_header.value).
+
+encode_if_unmodified_since(H, _Version) ->
+ e_date(H#wsp_header.value).
+
+decode_if_unmodified_since(Value, _Version) ->
+ ?WH('If-Unmodified-Since', d_date(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Location: <uri-value>
+%% Ref: 8.4.2.36
+%% Type: single, end-to-end, server-to-client
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_location(Value) ->
+ ?WH('Location', Value, []).
+
+format_location(H) ->
+ H#wsp_header.value.
+
+encode_location(H, _Version) ->
+ encode_uri_value(H#wsp_header.value).
+
+decode_location(Value, _Version) when list(Value) ->
+ ?WH('Location', decode_uri_value(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Last-Modified: <date-value>
+%% Ref: 8.4.2.35
+%% Type: single, end-to-end, server-to-client
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_last_modified(String) ->
+ {DateTime, _} = parse_http_date(String),
+ ?WH('Last-Modified', DateTime, []).
+
+format_last_modified(H) ->
+ fmt_date(H#wsp_header.value).
+
+encode_last_modified(H, _Version) ->
+ e_date(H#wsp_header.value).
+
+decode_last_modified(Value, _Version) ->
+ ?WH('Last-Modified', d_date(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Max-Forwards: <integer-value>
+%% Ref: 8.4.2.37
+%% Type: single, end-to-end, server-to-client
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_max_forwards(String) ->
+ ?WH('Max-Forwards', list_to_integer(String), []).
+
+format_max_forwards(H) ->
+ integer_to_list(H#wsp_header.value).
+
+encode_max_forwards(H, _Version) ->
+ encode_integer(H#wsp_header.value).
+
+decode_max_forwards(Value, _Version) ->
+ decode_integer(Value).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Pragma: No-Cache | value-length Parameter
+%% Ref:
+%% Type:
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_pragma(Value) ->
+ ?WH('Pragma',Value,[]).
+
+format_pragma(H) ->
+ case H#wsp_header.value of
+ "" -> format_params(H#wsp_header.params);
+ Value -> Value
+ end.
+
+encode_pragma(H, Version) ->
+ case H#wsp_header.value of
+ "no-cache" -> ?ENCODE_SHORT(0);
+ "" ->
+ encode_parameter(hd(H#wsp_header.params), Version)
+ end.
+
+decode_pragma(0, _Version) ->
+ ?WH('Pragma',"no-cache",[]);
+decode_pragma({_,Data}, Version) ->
+ {Param,_} = decode_parameter(Data, Version),
+ ?WH('Pragma',"",[Param]).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Proxy-Authenticate:
+%% Ref: 8.4.2.39
+%% Type: single?, client-to-proxy
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_proxy_authenticate(Value) ->
+ parse_challenge('Proxy-Authenticate', Value).
+
+format_proxy_authenticate(H) ->
+ format_challenge(H#wsp_header.value, H#wsp_header.params).
+
+encode_proxy_authenticate(H, Version) ->
+ encode_challenge(H#wsp_header.value,
+ H#wsp_header.params, Version).
+
+decode_proxy_authenticate({_, Data}, Version) ->
+ decode_challenge('Proxy-Authenticate', Data, Version).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Proxy-authorization:
+%% Ref: 8.4.2.40
+%% Type: single?, proxy-to-client
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_proxy_authorization(Value) ->
+ parse_credentials('Proxy-Authorization', Value).
+
+format_proxy_authorization(H) ->
+ format_credentials(H#wsp_header.value, H#wsp_header.params).
+
+encode_proxy_authorization(H, Version) ->
+ encode_credentials(H#wsp_header.value, H#wsp_header.params, Version).
+
+decode_proxy_authorization({_,Data}, Version) ->
+ decode_credentials('Proxy-Authorization', Data, Version).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Public: <well-known-method> | Token-Text
+%% Ref: 8.4.2.41
+%% Type:
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_public(Value) ->
+ ?WH('Public', parse_well_known_method(Value), []).
+
+format_public(H) ->
+ if atom(H#wsp_header.value) ->
+ atom_to_list(H#wsp_header.value);
+ list(H#wsp_header.value) ->
+ H#wsp_header.value
+ end.
+
+encode_public(H, Version) ->
+ if atom(H#wsp_header.value) ->
+ encode_well_known_method(H#wsp_header.value,Version);
+ list(H#wsp_header.value) ->
+ encode_text_string(H#wsp_header.value)
+ end.
+
+decode_public(Value, _Version) when list(Value) ->
+ ?WH('Public', Value, []);
+decode_public(Value, Version) ->
+ ?WH('Public', decode_well_known_method(Value,Version), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Range:
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+parse_range(Value) ->
+ %% FIXME:
+ ?WH('Range', Value, []).
+
+format_range(H) ->
+ case H#wsp_header.value of
+ {First,undefined} ->
+ ["bytes=", integer_to_list(First), "-"];
+ {First,Last} ->
+ ["bytes=", integer_to_list(First), "-", integer_to_list(Last)];
+ Len when integer(Len) ->
+ ["bytes=-", integer_to_list(Len)]
+ end.
+
+encode_range(H, _Version) ->
+ case H#wsp_header.value of
+ {First,undefined} ->
+ e_value(?ENCODE_SHORT(0),
+ e_uintvar(First));
+ {First,Last} ->
+ e_value(?ENCODE_SHORT(0),
+ e_uintvar(First),
+ e_uintvar(Last));
+ Len when integer(Len) ->
+ e_value(?ENCODE_SHORT(1),
+ e_uintvar(Len))
+ end.
+
+decode_range({_,Data}, _Version) ->
+ case scan_header_data(Data) of
+ {0, Data1} ->
+ case d_uintvar(Data1) of
+ {First, <<>>} ->
+ ?WH('Range', {First, undefined},[]);
+ {First, Data2} ->
+ {Last, _} = d_uintvar(Data2),
+ ?WH('Range', {First, Last}, [])
+ end;
+ {1, Data1} ->
+ {Len, _} =d_uintvar(Data1),
+ ?WH('Range', Len, [])
+ end.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Referer: <uri-value>
+%% Ref: 8.4.2.43
+%% Type: single
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_referer(Value) ->
+ ?WH('Referer', Value, []).
+
+format_referer(H) ->
+ H#wsp_header.value.
+
+encode_referer(H, _Version) ->
+ encode_uri_value(H#wsp_header.value).
+
+decode_referer(Value, _Version) when list(Value) ->
+ ?WH('Referer', decode_uri_value(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Retry-After: Value-length (Retry-date-value | Retry-delta-seconds)
+%% Ref: 8.4.2.44
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_retry_after(Value) ->
+ case catch parse_http_date(Value) of
+ {'EXIT', _} ->
+ ?WH('Retry-After', list_to_integer(Value), []);
+ {DateTime,_} ->
+ ?WH('Retry-After', DateTime, [])
+ end.
+
+format_retry_after(H) ->
+ Value = H#wsp_header.value,
+ if integer(Value) ->
+ integer_to_list(Value);
+ true ->
+ fmt_date(Value)
+ end.
+
+encode_retry_after(H, _Version) ->
+ Value = H#wsp_header.value,
+ if integer(Value) ->
+ e_value(?ENCODE_SHORT(1),
+ e_delta_seconds(Value));
+ true ->
+ e_value(?ENCODE_SHORT(0),
+ e_date(Value))
+ end.
+
+decode_retry_after({_,Data}, _Version) ->
+ case scan_header_data(Data) of
+ {0, Data1} ->
+ ?WH('Retry-After', d_date(Data1), []);
+ {1, Data1} ->
+ case scan_header_data(Data1) of
+ Sec when integer(Sec) ->
+ ?WH('Retry-After', Sec, []);
+ {short,Data2} ->
+ ?WH('Retry-After', d_long(Data2), [])
+ end
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Server: <text-string>
+%% Ref: 8.4.2.45
+%% Type: server-to-client
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_server(Value) ->
+ ?WH('Server', Value, []).
+
+format_server(H) ->
+ H#wsp_header.value.
+
+encode_server(H, _Version) ->
+ encode_text_string(H#wsp_header.value).
+
+decode_server(Value, _Version) ->
+ ?WH('Server', decode_text_string(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Transfer-Encoding:
+%% Ref: 8.4.2.46
+%% Type: hop-by-hop
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_transfer_encoding(Value) ->
+ ?WH('Transfer-Encoding', Value, []).
+
+format_transfer_encoding(H) ->
+ H#wsp_header.value.
+
+encode_transfer_encoding(H, _Version) ->
+ case H#wsp_header.value of
+ "chunked" -> ?ENCODE_SHORT(0);
+ Value -> encode_text_string(Value)
+ end.
+
+decode_transfer_encoding(0, _Version) ->
+ ?WH('Transfer-Encoding', "chunked", []);
+decode_transfer_encoding(Value, _Version) when list(Value)->
+ ?WH('Transfer-Encoding', Value, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Upgrade: Text-String
+%% Ref: 8.4.2.47
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_upgrade(Value) ->
+ ?WH('Upgrade', Value, []).
+
+format_upgrade(H) ->
+ H#wsp_header.value.
+
+encode_upgrade(H, _Version) ->
+ encode_text_string(H#wsp_header.value).
+
+decode_upgrade(Value, _Version) when list(Value) ->
+ ?WH('Upgrade', Value, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% User-Agent:
+%% Ref: 8.4.2.48
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_user_agent(Value) ->
+ ?WH('User-Agent', Value, []).
+
+format_user_agent(H) ->
+ H#wsp_header.value.
+
+encode_user_agent(H, _Version) ->
+ encode_text_string(H#wsp_header.value).
+
+decode_user_agent(Value, _Version) ->
+ ?WH('User-Agent', Value, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Vary: Well-known-header-field | Token-text
+%% Ref: 8.4.2.49
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_vary(Value) ->
+ ?WH('Vary', normalise_field_name(Value), []).
+
+format_vary(H) ->
+ to_list(H#wsp_header.value).
+
+encode_vary(H, Version) ->
+ e_field_name(H#wsp_header.value, Version).
+
+decode_vary(Value, _Version) when integer(Value) ->
+ ?WH('Vary', lookup_field_name(Value), []);
+decode_vary(Value, _Version) when list(Value) ->
+ ?WH('Vary', Value, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Via: <text-string>
+%% Ref: 8.4.2.50
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_via(Value) ->
+ ?WH('Via', Value, []).
+
+format_via(H) ->
+ H#wsp_header.value.
+
+encode_via(H, _Version) ->
+ encode_text_string(H#wsp_header.value).
+
+decode_via(Value, _Version) when list(Value) ->
+ ?WH('Via', Value, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Warning: Warn-Code | Warning-value
+%% Ref: 8.4.2.51
+%% Type: general, multiple
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_warning(Value) ->
+ case string:tokens(Value, " ") of
+ [Code] ->
+ ?WH('Warning', {list_to_integer(Code),"",""}, []);
+ [Code,Agent,Text] ->
+ ?WH('Warning', {list_to_integer(Code), Agent, Text}, [])
+ end.
+
+format_warning(H) ->
+ case H#wsp_header.value of
+ {Code, "", ""} ->
+ integer_to_list(Code);
+ {Code, Agent, Text} ->
+ [integer_to_list(Code), " ", Agent, " ", Text]
+ end.
+
+encode_warning(H, _Version) ->
+ case H#wsp_header.value of
+ {Code,"",""} ->
+ ?ENCODE_SHORT(Code);
+ {Code, Agent, Text} ->
+ e_value(?ENCODE_SHORT(Code),
+ encode_text_string(Agent),
+ encode_text_string(Text))
+ end.
+
+decode_warning(Value, _Version) when integer(Value) ->
+ ?WH('Warning', {Value, "", ""}, []);
+decode_warning({_, Data}, _Version) ->
+ {Code,Data1}= scan_header_data(Data),
+ {Agent,Data2} = d_text_string(Data1),
+ {Text,_Data3} = d_text_string(Data2),
+ ?WH('Warning', {Code,Agent,Text}, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% WWW-Authenticate: challenge
+%% Ref: 8.4.2.52
+%% Type: single? client-to-server
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_www_authenticate(Value) ->
+ parse_challenge('Www-Authenticate', Value).
+
+format_www_authenticate(H) ->
+ format_challenge(H#wsp_header.value, H#wsp_header.params).
+
+encode_www_authenticate(H, Version) ->
+ encode_challenge(H#wsp_header.value,
+ H#wsp_header.params, Version).
+
+decode_www_authenticate({_, Data}, Version) ->
+ decode_challenge('Www-Authenticate', Data, Version).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Content-Disposition: "form-data" | "attachment" [<param>]*
+%% Ref: 8.4.2.53
+%% Type: single
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_content_disposition(Value) ->
+ ?WH('Content-Disposition', Value, []).
+
+format_content_disposition(H) ->
+ [H#wsp_header.value, format_params(H#wsp_header.params)].
+
+encode_content_disposition(H, Version) ->
+ case H#wsp_header.value of
+ "form-data" ->
+ e_value(?ENCODE_SHORT(0),
+ encode_params(H#wsp_header.params, Version));
+ "attachment" ->
+ e_value(?ENCODE_SHORT(1),
+ encode_params(H#wsp_header.params, Version))
+ end.
+
+decode_content_disposition({_,Data}, Version) when binary(Data) ->
+ case scan_header_data(Data) of
+ {0, Data1} ->
+ Params = decode_params(Data1, Version),
+ ?WH('Content-Disposition', "form-data", Params);
+ {1, Data1} ->
+ Params = decode_params(Data1, Version),
+ ?WH('Content-Disposition', "attachment", Params)
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% X-Wap-Application-Id:
+%% Ref: 8.4.2.54
+%% Type:
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_x_wap_application_id(Value) ->
+ ?WH('X-Wap-Application-Id', Value, []).
+
+format_x_wap_application_id(H) ->
+ H#wsp_header.value.
+
+encode_x_wap_application_id(H, _Version) ->
+ encode_push_application(H#wsp_header.value).
+
+decode_x_wap_application_id(Value, _Version) ->
+ ?WH('X-Wap-Application-Id', decode_push_application(Value),[]).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% X-Wap-Content-Uri: <uri-value>
+%% Ref: 8.4.2.55
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_x_wap_content_uri(Value) ->
+ ?WH('X-Wap-Content-Uri', Value, []).
+
+format_x_wap_content_uri(H) ->
+ H#wsp_header.value.
+
+encode_x_wap_content_uri(H, _Version) ->
+ encode_uri_value(H#wsp_header.value).
+
+decode_x_wap_content_uri(Value, _Version) when list(Value) ->
+ ?WH('X-Wap-Content-Uri', decode_uri_value(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% X-Wap-Initiator-Uri: <uri-value>
+%% Ref: 8.4.2.56
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_x_wap_initiator_uri(Value) ->
+ ?WH('X-Wap-Initiator-Uri', Value, []).
+
+format_x_wap_initiator_uri(H) ->
+ H#wsp_header.value.
+
+encode_x_wap_initiator_uri(H, _Version) ->
+ encode_uri_value(H#wsp_header.value).
+
+decode_x_wap_initiator_uri(Value, _Version) when list(Value) ->
+ ?WH('X-Wap-Initiator-Uri', decode_uri_value(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Accept-Application: Any-Application | Appication-Id-Value
+%% Ref: 8.4.2.57
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_accept_application(Value) ->
+ ?WH('Accept-Application', Value, []).
+
+format_accept_application(H) ->
+ H#wsp_header.value.
+
+
+encode_accept_application(H, _Version) ->
+ case H#wsp_header.value of
+ "*" -> ?ENCODE_SHORT(0);
+ Value ->
+ case catch encode_push_application(Value) of
+ {'EXIT',_} ->
+ encode_uri_value(Value);
+ App ->
+ encode_integer(App)
+ end
+ end.
+
+decode_accept_application(0, _Version) ->
+ ?WH('Accept-Application', "*", []);
+decode_accept_application(Value, _Version) when integer(Value) ->
+ ?WH('Accept-Application', decode_push_application(Value), []);
+decode_accept_application({short,Data}, _Version) ->
+ Value = d_long(Data),
+ ?WH('Accept-Application', decode_push_application(Value), []);
+decode_accept_application(Value, _Version) when list(Value) ->
+ ?WH('Accept-Application', decode_uri_value(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Bearer-Indication: <integer-value>
+%% Type: sinlge
+%% Ref: 8.4.2.58
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_bearer_indication(Value) ->
+ ?WH('Bearer-Indication', Value, []).
+
+format_bearer_indication(H) ->
+ integer_to_list(H#wsp_header.value).
+
+encode_bearer_indication(H, _Version) ->
+ encode_integer(H#wsp_header.value).
+
+decode_bearer_indication(Value, _Version) when integer(Value) ->
+ ?WH('Bearer-Indication', Value, []);
+decode_bearer_indication({short,Data}, _Version) ->
+ Value = d_long(Data),
+ ?WH('Bearer-Indication', Value, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Push-Flag: Short-Integer
+%% Type: single
+%% Ref: 8.4.2.59
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_push_flag(Value) ->
+ ?WH('Push-Flag', integer_to_list(Value), []).
+
+format_push_flag(H) ->
+ integer_to_list(H#wsp_header.value).
+
+encode_push_flag(H, _Version) ->
+ ?ENCODE_SHORT(H#wsp_header.value).
+
+decode_push_flag(Value, _Version) when integer(Value) ->
+ ?WH('Push-Flag', Value, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Profile: <uri-value>
+%% Ref: 8.4.2.60
+%% Type: single, hop-by-hop, client-to-proxy
+%%
+%% Note: Normally transfered as 'X-Wap-Profile'
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_profile(Value) ->
+ ?WH('Profile', Value, []).
+
+format_profile(H) ->
+ H#wsp_header.value.
+
+encode_profile(H, _Version) ->
+ encode_uri_value(H#wsp_header.value).
+
+decode_profile(Value, _Version) ->
+ ?WH('Profile', decode_uri_value(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Profile-Diff: Value-Length Octets
+%% Ref: 8.4.2.61
+%% Type: single, hop-by-hop, client-to-proxy
+%%
+%% Value is WBXML encoded profile diff information
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_profile_diff(Value) ->
+ %% FIXME parse XML code?
+ ?WH('Profile-Diff', Value, []).
+
+format_profile_diff(_H) ->
+ %% FIXME emit ???
+ "WBXML".
+
+encode_profile_diff(H, _Version) ->
+ e_value(H#wsp_header.value).
+
+decode_profile_diff({_,Value}, _Version) ->
+ ?WH('Profile-Diff', Value, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Profile-Warning: Code
+%% Ref: 8.4.2.62
+%% Type: single
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_profile_warning(Value) ->
+ ?WH('Profile-Warning', {Value,"",undefined}, []).
+
+format_profile_warning(H) ->
+ {Code,Target,Date} = H#wsp_header.value,
+ CodeData = integer_to_list(Code),
+ if Target == "", Date == undefined ->
+ CodeData;
+ Date == undefined ->
+ [CodeData," ",Target];
+ true ->
+ [CodeData," ",Target," ",format_date(Date)]
+ end.
+
+
+encode_profile_warning(H, _Version) ->
+ {Code,Target,Date} = H#wsp_header.value,
+ CodeData = case Code of
+ 100 -> ?ENCODE_SHORT(16#10);
+ 101 -> ?ENCODE_SHORT(16#11);
+ 102 -> ?ENCODE_SHORT(16#12);
+ 200 -> ?ENCODE_SHORT(16#20);
+ 201 -> ?ENCODE_SHORT(16#21);
+ 202 -> ?ENCODE_SHORT(16#22);
+ 203 -> ?ENCODE_SHORT(16#23)
+ end,
+ if Target == "", Date == undefined ->
+ CodeData;
+ Date == undefined ->
+ e_value(CodeData, encode_text_string(Target));
+ true ->
+ e_value(CodeData, encode_text_string(Target), e_date(Date))
+ end.
+
+
+decode_profile_warning(Value, _Version) when integer(Value) ->
+ Code = case Value of
+ 16#10 -> 100;
+ 16#11 -> 101;
+ 16#12 -> 102;
+ 16#20 -> 200;
+ 16#21 -> 201;
+ 16#22 -> 202;
+ 16#23 -> 203
+ end,
+ ?WH('Profile-Warning', {Code,"",undefined}, []);
+decode_profile_warning({_, <<1:1, Value:7, Data>>}, _Version) ->
+ Code = case Value of
+ 16#10 -> 100;
+ 16#11 -> 101;
+ 16#12 -> 102;
+ 16#20 -> 200;
+ 16#21 -> 201;
+ 16#22 -> 202;
+ 16#23 -> 203
+ end,
+ {Target,Data1} = d_text_string(Data),
+ Date =
+ if Data1 == <<>> ->
+ undefined;
+ true ->
+ {DateValue,_} = scan_header_data(Data1),
+ d_date(DateValue)
+ end,
+ ?WH('Profile-Warning', {Code,Target,Date}, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Expect: 100-contine | Expect-expression
+%% Ref: 8.4.2.63
+%% Type: client-to-server
+%% Note: Bug in the spec value-length is missing !!!
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_expect(Value) ->
+ ?WH('Expect', Value, []).
+
+format_expect(H) ->
+ case H#wsp_header.value of
+ {Var,Val} ->
+ [Var,"=",Val, format_params(H#wsp_header.params)];
+ Val when list(Val) ->
+ Val
+ end.
+
+encode_expect(H, Version) ->
+ case H#wsp_header.value of
+ "100-continue" ->
+ ?ENCODE_SHORT(0);
+ {Var,Val} ->
+ e_value(encode_text_string(Var),
+ encode_text_string(Val),
+ encode_params(H#wsp_header.params,Version))
+ end.
+
+decode_expect(0, _Version) ->
+ ?WH('Expect', "100-continue", []);
+decode_expect({_, Data}, Version) ->
+ {Var, Data1} = d_text_string(Data),
+ {Val, Data2} = d_text_string(Data1),
+ Params = decode_params(Data2, Version),
+ ?WH('Expect', {decode_text_string(Var),
+ decode_text_string(Val)}, Params).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Te: Trailers | TE-General-From
+%% Ref: 8.4.2.64
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_te(Value) ->
+ ?WH('Te', Value, []).
+
+format_te(H) ->
+ [H#wsp_header.value, format_params(H#wsp_header.params)].
+
+encode_te(H, Version) ->
+ case H#wsp_header.value of
+ "trailers" -> ?ENCODE_SHORT(1);
+ "chunked" ->
+ e_value(?ENCODE_SHORT(2),
+ encode_params(H#wsp_header.params,Version));
+ "identity" ->
+ e_value(?ENCODE_SHORT(3),
+ encode_params(H#wsp_header.params,Version));
+ "gzip" ->
+ e_value(?ENCODE_SHORT(4),
+ encode_params(H#wsp_header.params,Version));
+ "compress" ->
+ e_value(?ENCODE_SHORT(5),
+ encode_params(H#wsp_header.params,Version));
+ "deflate" ->
+ e_value(?ENCODE_SHORT(6),
+ encode_params(H#wsp_header.params,Version));
+ Value ->
+ e_value(encode_text_string(Value),
+ encode_params(H#wsp_header.params,Version))
+ end.
+
+decode_te(1, _Version) ->
+ ?WH('Te', "trailers", []);
+decode_te({_, Data}, _Version) ->
+ {Val, Data1} = scan_header_data(Data),
+ Value =
+ case Val of
+ 2 -> "chunked";
+ 3 -> "identity";
+ 4 -> "gzip";
+ 5 -> "compress";
+ 6 -> "deflate";
+ V when list(V) -> V
+ end,
+ Params = case Data1 of
+ <<>> -> [];
+ <<128, QData>> ->
+ {QValue, _} = d_q_value(QData),
+ [{q, QValue}]
+ end,
+ ?WH('Te', Value, Params).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Trailer: Well-known-header-field | Token-text
+%% Ref: 8.4.2.65
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_trailer(Value) ->
+ ?WH('Trailer', normalise_field_name(Value), []).
+
+format_trailer(H) ->
+ to_list(H#wsp_header.value).
+
+encode_trailer(H, Version) ->
+ e_field_name(H#wsp_header.value, Version).
+
+decode_trailer(Value, _Version) when integer(Value) ->
+ ?WH('Trailer', lookup_field_name(Value), []);
+decode_trailer(Value, _Version) when list(Value) ->
+ ?WH('Trailer', Value, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% X-Wap-Tod:
+%% Ref: 8.4.2.66
+%% Type: hop-by-hop
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_x_wap_tod(String) ->
+ {DateTime, _} = parse_http_date(String),
+ ?WH('X-Wap-Tod', DateTime, []).
+
+format_x_wap_tod(H) ->
+ fmt_date(H#wsp_header.value).
+
+encode_x_wap_tod(H, _Version) ->
+ e_date(H#wsp_header.value).
+
+decode_x_wap_tod(Value, _Version) ->
+ ?WH('X-Wap-Tod', d_date(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Content-Id: <quoted-string>
+%% Type:
+%% Ref: 8.4.2.67
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_content_id(Value) ->
+ ?WH('Content-Id', Value, []).
+
+format_content_id(H) ->
+ [$", H#wsp_header.value, $"].
+
+encode_content_id(H, _Version) ->
+ encode_quoted_string(H#wsp_header.value).
+
+decode_content_id(Value, _Version) when list(Value) ->
+ ?WH('Content-Id', decode_quoted_string(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Set-Cookie: <len> <cookie-version> <cookie-name> <cokie-value> <parm>*
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_set_cookie(String) ->
+ %% MEGA FIXME; Cookie-value may be a quoted string and
+ %% contain both ,=; etc Fix several cookies on same line!!
+ case string:tokens(String, ";") of
+ [Cookie | Ps] ->
+ case string:tokens(Cookie, "=") of
+ [Name,Value] ->
+ Params = parse_params(Ps),
+ ?WH('Set-Cookie', {{1,0}, Name, Value}, Params);
+ [Name] ->
+ Params = parse_params(Ps),
+ ?WH('Set-Cookie', {{1,0}, Name, ""}, Params)
+ end;
+ [] ->
+ ?WH('Set-Cookie', {{1,0}, String, ""}, [])
+ end.
+
+format_set_cookie(H) ->
+ case H#wsp_header.value of
+ {{1,0},Name,Value} ->
+ [Name, "=", Value,format_params(H#wsp_header.params)];
+ {Version,Name,Value} ->
+ [format_version(Version)," ",
+ Name, "=", Value,
+ format_params(H#wsp_header.params)]
+ end.
+
+encode_set_cookie(H, Version) ->
+ {CookieVersion,Name,Value} = H#wsp_header.value,
+ e_value(encode_version(CookieVersion),
+ encode_text_string(Name),
+ encode_text_string(Value),
+ encode_params(H#wsp_header.params, Version)).
+
+decode_set_cookie({_, Data}, Version) ->
+ {CookieVersion, Data1} = scan_header_data(Data),
+ {CookieName, Data2} = scan_header_data(Data1),
+ {CookieValue, Data3} = scan_header_data(Data2),
+ Params = decode_params(Data3, Version),
+ ?WH('Set-Cookie', {decode_version(CookieVersion),
+ decode_text_string(CookieName),
+ decode_text_string(CookieValue)}, Params).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Cookie:
+%% Ref: 8.4.2.69
+%% Type: single?, client-to-server
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_cookie(Value) ->
+ %% FIXME parse cookie version etc
+ ?WH('Cookie', {{1,0},Value}, []).
+
+format_cookie(H) ->
+ case H#wsp_header.value of
+ {{1,0}, Cookies} ->
+ lists:map(fun({Name,Value,Ps}) ->
+ [Name,"=",Value, format_params(Ps)]
+ end, Cookies);
+ {Version, Cookies} ->
+ [format_version(Version)," ",
+ lists:map(fun({Name,Value,Ps}) ->
+ [Name,"=",Value, format_params(Ps)]
+ end, Cookies)]
+ end.
+
+encode_cookie(H, Version) ->
+ {Version, Cookies} = H#wsp_header.value,
+ e_value(encode_version(Version),
+ encode_cookies(Cookies, [])).
+
+encode_cookies([{Name,Value,Ps} | Cs], Acc) ->
+ List =
+ [encode_text_string(Name),
+ encode_text_string(Value) |
+ case Ps of
+ [{path,P},{domain,D}] ->
+ [encode_text_string(P), encode_text_string(D)];
+ [{domain,D},{path,P}] ->
+ [encode_text_string(P), encode_text_string(D)];
+ [{path,P}] ->
+ [encode_text_string(P)];
+ [{domain,D}] ->
+ [encode_text_string(""), encode_text_string(D)];
+ [] ->
+ []
+ end],
+ Sz = lists:sum(lists:map(fun(B) -> size(B) end, List)),
+ encode_cookies(Cs, [[e_uintvar(Sz) | List] | Acc]);
+encode_cookies([], Acc) ->
+ list_to_binary(lists:reverse(Acc)).
+
+
+decode_cookie({_, Data}, _Version) ->
+ {CookieVersion, Data1} = scan_header_data(Data),
+ Cookies = decode_cookies(Data1, []),
+ ?WH('Cookie', {decode_version(CookieVersion), Cookies}, []).
+
+decode_cookies(<<>>, Acc) ->
+ lists:reverse(Acc);
+decode_cookies(Data0, _Acc) -> %% IS IGNORING Acc A BUG OR NOT ?
+ {Len, Data1} = d_uintvar(Data0),
+ <<C0:Len/binary, Data2/binary>> = Data1,
+ {Name, C1} = scan_header_data(C0),
+ {Value, C2} = scan_header_data(C1),
+ {Ps1, C3} =
+ case d_text_string(C2) of
+ {"", C21} -> {[], C21};
+ {Path,C21} -> {[{path,Path}], C21}
+ end,
+ {Ps2, _} =
+ case C3 of
+ <<>> -> {[], <<>>};
+ _ ->
+ {Domain,C4} = d_text_string(C3),
+ {[{domain,Domain}], C4}
+ end,
+ decode_cookies(Data2, [{decode_text_string(Name),
+ decode_text_string(Value),
+ Ps1++Ps2}]).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Encoding-Version: Version-Value | Value-length Code-Page [Version-Value]
+%% Ref: 8.4.2.70
+%% Type: single, hop-by-hop, client-and-proxys
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_encoding_version(Value) ->
+ ?WH('Encoding-Version', parse_version(Value), []).
+
+format_encoding_version(H) ->
+ format_version(H#wsp_header.value).
+
+encode_encoding_version(H, _Version) ->
+ encode_version(H#wsp_header.value).
+
+decode_encoding_version(Value, _Version) when integer(Value) ->
+ ?WH('Encoding-Version', decode_version(Value), []);
+decode_encoding_version(Value, _Version) when list(Value) ->
+ %% Note: in this case we parse the Value since we
+ %% Must know the Encoding version
+ ?WH('Encoding-Version', parse_version(Value), []);
+decode_encoding_version({_,<<_:1,_CodePage:7>>}, _Version) ->
+ %% ??? FIXME
+ ?WH('Encoding-Version', "", []);
+decode_encoding_version({_,<<_:1,_CodePage:7, Data1/binary>>}, _Version) ->
+ {Value,_Data2} = scan_header_data(Data1),
+ %% FIXME CodePage
+ ?WH('Encoding-Version', decode_version(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% X-Wap-Security:
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_x_wap_security(Value) ->
+ ?WH('X-Wap-Security', Value, []).
+
+format_x_wap_security(H) ->
+ H#wsp_header.value.
+
+encode_x_wap_security(H, _Version) ->
+ encode_text_string(H#wsp_header.value).
+
+decode_x_wap_security(Value, _Version) ->
+ ?WH('X-Wap-Security', decode_text_string(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% X-Wap-Loc-Invocation:
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_x_wap_loc_invocation(Value) ->
+ ?WH('X-Wap-Loc-Invocation', Value, []).
+
+format_x_wap_loc_invocation(H) ->
+ H#wsp_header.value.
+
+encode_x_wap_loc_invocation(H, _Version) ->
+ encode_text_string(H#wsp_header.value).
+
+decode_x_wap_loc_invocation(Value, _Version) ->
+ ?WH('X-Wap-Loc-Invocation', decode_text_string(Value), []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% X-Wap-Loc-Delivery:
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+parse_x_wap_loc_delivery(Value) ->
+ ?WH('X-Wap-Loc-Delivery', Value, []).
+
+format_x_wap_loc_delivery(H) ->
+ H#wsp_header.value.
+
+encode_x_wap_loc_delivery(H, _Value) ->
+ encode_text_string(H#wsp_header.value).
+
+decode_x_wap_loc_delivery(Value, _Version) ->
+ ?WH('X-Wap-Loc-Delivery', decode_text_string(Value), []).
+
+
+%%
+%% Header Field parameters
+%%
+
+parse_params([Param|Ps]) ->
+ case string:tokens(Param, "=") of
+ [Name,Value0] ->
+ Val = trim(Value0),
+ P = case trim(tolower(Name)) of
+ "q" ->{q,Val};
+ "charset" -> {charset,Val};
+ "level" -> {level,Val};
+ "type" -> {type,Val};
+ "name" -> {name,Val};
+ "filename" -> {filename,Val};
+ "differences" -> {differences,Val};
+ "padding" -> {padding,Val};
+ "start" -> {start,Val};
+ "start-info" -> {'start-info',Val};
+ "comment" -> {comment,Val};
+ "domain" -> {domain,Val};
+ "max-age" -> {'max-age',Val};
+ "path" -> {path,Val};
+ "secure" -> {secure,no_value};
+ "sec" -> {sec, Val};
+ "mac" -> {mac, Val};
+ "creation-date" -> {'creation-date', Val};
+ "modification-date" -> {'modification-date', Val};
+ "read-date" -> {'read-date', Val};
+ "size" -> {size, Val};
+ Nm -> {Nm, Val}
+ end,
+ [P | parse_params(Ps)];
+ _ ->
+ parse_params(Ps)
+ end;
+parse_params([]) ->
+ [].
+
+%% format Params without leading ";"
+format_params0([{Param,no_value}|Ps]) ->
+ [to_list(Param) | format_params(Ps)];
+format_params0([{Param,Value}|Ps]) ->
+ [to_list(Param),"=",to_list(Value) | format_params(Ps)].
+
+format_params(Ps) ->
+ lists:map(fun({Param,no_value}) ->
+ ["; ", to_list(Param)];
+ ({Param,Value})->
+ ["; ", to_list(Param),"=",to_list(Value)]
+ end, Ps).
+
+
+encode_params(Params, Version) ->
+ list_to_binary(encode_params1(Params,Version)).
+
+encode_params1([Param|Ps], Version) ->
+ [ encode_parameter(Param, Version) | encode_params1(Ps, Version)];
+encode_params1([], _Version) ->
+ [].
+
+
+decode_params(Data, Version) ->
+ decode_params(Data, [], Version).
+
+decode_params(<<>>, Ps, _Version) ->
+ lists:reverse(Ps);
+decode_params(Data, Ps, Version) ->
+ {ParamVal, Data1} = decode_parameter(Data, Version),
+ decode_params(Data1, [ParamVal | Ps], Version).
+
+
+
+
+encode_parameter({ParamName, ParamValue}, Ver) ->
+ case ParamName of
+ q when Ver >= 16#01 ->
+ <<1:1, 16#00:7,
+ (encode_typed_field(Ver,'Q-value', ParamValue))/binary>>;
+ charset when Ver >= 16#01 ->
+ <<1:1, 16#01:7,
+ (encode_typed_field(Ver,'Well-known-charset',ParamValue))/binary>>;
+ level when Ver >= 16#01 ->
+ <<1:1, 16#02:7,
+ (encode_typed_field(Ver,'Ver-value',ParamValue))/binary>>;
+
+ type when Ver >= ?WSP_12 ->
+ <<1:1, 16#09:7,
+ (encode_typed_field(Ver,'Constrained-encoding',ParamValue))/binary>>;
+ type when Ver >= 16#01 ->
+ <<1:1, 16#03:7,
+ (encode_typed_field(Ver,'Integer-value',ParamValue))/binary>>;
+
+ name when Ver >= ?WSP_14 ->
+ <<1:1, 16#17:7,
+ (encode_typed_field(Ver,'Text-value',ParamValue))/binary>>;
+ name when Ver >= 16#01 ->
+ <<1:1, 16#05:7,
+ (encode_typed_field(Ver,'Text-string',ParamValue))/binary>>;
+
+ filename when Ver >= ?WSP_14 ->
+ <<1:1, 16#18:7,
+ (encode_typed_field(Ver,'Text-value',ParamValue))/binary>>;
+ filename when Ver >= 16#01 ->
+ <<1:1, 16#06:7,
+ (encode_typed_field(Ver,'Text-string',ParamValue))/binary>>;
+
+ differences when Ver >= 16#01 ->
+ <<1:1, 16#07:7,
+ (encode_typed_field(Ver,'Field-name',ParamValue))/binary>>;
+
+ padding when Ver >= 16#01 ->
+ <<1:1, 16#08:7,
+ (encode_typed_field(Ver,'Short-integer',ParamValue))/binary>>;
+
+
+ start when Ver >= ?WSP_14 ->
+ <<1:1, 16#19:7,
+ (encode_typed_field(Ver,'Text-value',ParamValue))/binary>>;
+ start when Ver >= ?WSP_12 ->
+ <<1:1, 16#0A:7,
+ (encode_typed_field(Ver,'Text-string',ParamValue))/binary>>;
+
+
+ 'start-info' when Ver >= ?WSP_14 ->
+ <<1:1, 16#1A:7,
+ (encode_typed_field(Ver,'Text-value',ParamValue))/binary>>;
+ 'start-info' when Ver >= ?WSP_12 ->
+ <<1:1, 16#0B:7,
+ (encode_typed_field(Ver,'Text-string',ParamValue))/binary>>;
+
+ comment when Ver >= ?WSP_14 ->
+ <<1:1, 16#1B:7,
+ (encode_typed_field(Ver,'Text-value',ParamValue))/binary>>;
+ comment when Ver >= ?WSP_13 ->
+ <<1:1, 16#0C:7,
+ (encode_typed_field(Ver,'Text-string',ParamValue))/binary>>;
+
+ domain when Ver >= ?WSP_14 ->
+ <<1:1, 16#1C:7,
+ (encode_typed_field(Ver,'Text-value',ParamValue))/binary>>;
+ domain when Ver >= ?WSP_13 ->
+ <<1:1, 16#0D:7,
+ (encode_typed_field(Ver,'Text-string',ParamValue))/binary>>;
+
+ 'max-age' when Ver >= ?WSP_13 ->
+ <<1:1, 16#0E:7,
+ (encode_typed_field(Ver,'Delta-seconds-value',ParamValue))/binary>>;
+
+ path when Ver >= ?WSP_14 ->
+ <<1:1, 16#1D:7,
+ (encode_typed_field(Ver,'Text-value',ParamValue))/binary>>;
+ path when Ver >= ?WSP_13 ->
+ <<1:1, 16#0F:7,
+ (encode_typed_field(Ver,'Text-string',ParamValue))/binary>>;
+
+ secure when Ver >= ?WSP_13 ->
+ <<1:1, 16#10:7,
+ (encode_typed_field(Ver,'No-value',ParamValue))/binary>>;
+ %% NOTE: "sec" and "mac" are really 1.4 features but used by 1.3 client provisioning
+ %"sec" when Ver >= ?WSP_14 ->
+ sec when Ver >= ?WSP_13 ->
+ <<1:1, 16#11:7,
+ (encode_typed_field(Ver,'Short-integer',ParamValue))/binary>>;
+ %"mac" when Ver >= ?WSP_14 ->
+ mac when Ver >= ?WSP_13 ->
+ <<1:1, 16#12:7,
+ (encode_typed_field(Ver,'Text-value',ParamValue))/binary>>;
+ 'creation-date' when Ver >= ?WSP_14 ->
+ <<1:1, 16#13:7,
+ (encode_typed_field(Ver,'Date-value',ParamValue))/binary>>;
+ 'modification-date' when Ver >= ?WSP_14 ->
+ <<1:1, 16#14:7,
+ (encode_typed_field(Ver,'Date-value',ParamValue))/binary>>;
+ 'read-date' when Ver >= ?WSP_14 ->
+ <<1:1, 16#15:7,
+ (encode_typed_field(Ver,'Date-value',ParamValue))/binary>>;
+ size when Ver >= ?WSP_14 ->
+ <<1:1, 16#16:7,
+ (encode_typed_field(Ver,'Integer-value',ParamValue))/binary>>;
+ _ ->
+ <<(encode_text_string(ParamName))/binary,
+ (encode_text_string(ParamValue))/binary >>
+ end.
+
+%% decode_parameter: return {ParameterName, ParamterValue}
+decode_parameter(<<1:1,Code:7,Data/binary>>, Version) ->
+ case Code of
+ 16#00 ->
+ {Val,Data1} = decode_typed_field('Q-value', Data, Version),
+ {{ q, Val}, Data1};
+
+ 16#01 ->
+ {Val,Data1} = decode_typed_field('Well-known-charset',Data,Version),
+ {{charset, Val}, Data1};
+
+ 16#02 ->
+ {Val,Data1} = decode_typed_field('Version-value',Data,Version),
+ {{level, Val}, Data1};
+
+ 16#03 ->
+ {Val,Data1} = decode_typed_field('Integer-value', Data,Version),
+ {{type, Val}, Data1};
+
+ 16#05 ->
+ {Val,Data1} = decode_typed_field('Text-string', Data,Version),
+ {{name, Val}, Data1};
+
+ 16#06 ->
+ {Val,Data1} = decode_typed_field('Text-string', Data,Version),
+ {{filename, Val}, Data1};
+
+ 16#07 ->
+ {Val,Data1} = decode_typed_field('Field-name', Data,Version),
+ {{differences, Val}, Data1};
+
+ 16#08 ->
+ {Val,Data1} = decode_typed_field('Short-integer', Data,Version),
+ {{padding, Val}, Data1};
+
+ 16#09 ->
+ {Val,Data1} = decode_typed_field('Constrained-encoding', Data,Version),
+ {{type, Val}, Data1};
+
+ 16#0A ->
+ {Val,Data1} = decode_typed_field('Text-string', Data,Version),
+ {{start, Val}, Data1};
+
+ 16#0B ->
+ {Val,Data1} = decode_typed_field('Text-string', Data,Version),
+ {{'start-info', Val}, Data1};
+
+ 16#0C ->
+ {Val,Data1} = decode_typed_field('Text-string', Data,Version),
+ {{comment, Val}, Data1};
+
+ 16#0D ->
+ {Val,Data1} = decode_typed_field('Text-string', Data,Version),
+ {{domain, Val}, Data1};
+
+ 16#0E ->
+ {Val,Data1} = decode_typed_field('Delta-seconds-value', Data,Version),
+ {{'max-age', Val}, Data1};
+
+ 16#0F ->
+ {Val,Data1} = decode_typed_field('Text-string', Data,Version),
+ {{path, Val}, Data1};
+
+ 16#10 ->
+ {Val,Data1} = decode_typed_field('No-value', Data,Version),
+ {{secure, Val}, Data1};
+
+ 16#11 ->
+ {Val,Data1} = decode_typed_field('Short-integer', Data,Version),
+ {{sec, Val}, Data1};
+
+ 16#12 ->
+ {Val,Data1} = decode_typed_field('Text-value', Data,Version),
+ {{mac, Val}, Data1};
+
+ 16#13 ->
+ {Val,Data1} = decode_typed_field('Date-value', Data,Version),
+ {{'creation-date', Val}, Data1};
+
+ 16#14 ->
+ {Val,Data1} = decode_typed_field('Date-value', Data,Version),
+ {{'modification-date', Val}, Data1};
+
+ 16#15 ->
+ {Val,Data1} = decode_typed_field('Date-value', Data,Version),
+ {{'read-date', Val}, Data1};
+
+ 16#16 ->
+ {Val,Data1} = decode_typed_field('Integer-value', Data,Version),
+ {{size, Val}, Data1};
+
+ 16#17 ->
+ {Val,Data1} = decode_typed_field('Text-value', Data,Version),
+ {{name, Val}, Data1};
+
+ 16#18 ->
+ {Val,Data1} = decode_typed_field('Text-value', Data,Version),
+ {{filename, Val}, Data1};
+
+ 16#19 ->
+ {Val,Data1} = decode_typed_field('Text-value', Data,Version),
+ {{start, Val}, Data1};
+
+ 16#1A ->
+ {Val,Data1} = decode_typed_field('Text-value', Data,Version),
+ {{'start-info', Val}, Data1};
+
+ 16#1B ->
+ {Val,Data1} = decode_typed_field('Text-value', Data,Version),
+ {{comment, Val}, Data1};
+
+ 16#1C ->
+ {Val,Data1} = decode_typed_field('Text-value', Data,Version),
+ {{domain, Val}, Data1};
+
+ 16#1D ->
+ {Val,Data1} = decode_typed_field('Text-value', Data,Version),
+ {{path, Val}, Data1};
+ _ ->
+ exit({error, unknown_parameter})
+ end;
+decode_parameter(Data, _Version) ->
+ %% Untyped-parameter: Token-Text Untype-value
+ {ParamName,Data1} = d_text_string(Data),
+ %% Untype-value: Integer-Value | Text-Value!
+ {ParamValue, Data2} = decode_untyped_value(Data1),
+ {{ParamName,ParamValue}, Data2}.
+
+
+encode_typed_field(Ver,Type,Value) ->
+ case Type of
+ 'Well-known-charset' ->
+ MIBenum = encode_charset(Value),
+ encode_integer(MIBenum);
+
+ 'Constrained-encoding' ->
+ encode_constrained_media(Value, Ver);
+
+ 'Text-string' ->
+ encode_text_string(Value);
+
+ 'Text-value' ->
+ encode_text_value(Value);
+
+ 'Short-integer' ->
+ ?ENCODE_SHORT(Value);
+
+ 'Date-value' ->
+ e_date(Value);
+
+ 'Delta-Seconds-value' ->
+ e_delta_seconds(Value);
+
+ 'No-value' ->
+ e_no_value(Value);
+
+ _ ->
+ io:format("FIXME: encode_typed_field unsupported type = ~p\n",
+ [Type]),
+ exit({error,badtype})
+ end.
+
+
+decode_typed_field(Type, Data, Version) ->
+ case Type of
+ 'Q-value' ->
+ d_q_value(Data);
+
+ 'Well-known-charset' ->
+ {MIBenum, T100} = d_integer_value(Data),
+ {decode_charset(MIBenum), T100};
+
+ 'Constrained-encoding' ->
+ {Value, Data1} = scan_header_data(Data),
+ {decode_constrained_media(Value,Version), Data1};
+
+ 'Text-string' ->
+ d_text_string(Data);
+
+ 'Text-value' ->
+ d_text_value(Data);
+
+ 'Short-integer' ->
+ decode_short_integer(Data);
+
+ 'Delta-seconds-value' ->
+ d_integer_value(Data);
+
+ 'Date-value' ->
+ {Val, Data1} = decode_long_integer(Data),
+ {d_date(Val), Data1};
+
+ 'Field-name' ->
+ d_field_name(Data);
+
+ 'No-value' ->
+ d_no_value(Data);
+
+ _ ->
+ io:format("FIXME: unsupported type = ~p\n",[Type]),
+ exit({error,badtype})
+ end.
+
+
+%% Integer-Value | Text-Value
+%% return as {Value, Tail}
+decode_untyped_value(<<1:1, Short:7, Tail/binary>>) ->
+ {Short, Tail};
+decode_untyped_value(<<0:3, Len:5, Data/binary>>) when Len =/= 31 ->
+ Sz = Len*8,
+ <<Long:Sz, Tail/binary>> = Data,
+ {Long, Tail};
+decode_untyped_value(Data) ->
+ d_text_string(Data).
+
+
+e_field_name(Value, Version) ->
+ case normalise_field_name(Value) of
+ 'Accept' -> <<16#80>>;
+ 'Accept-Charset' when Version >= ?WSP_13 -> <<16#bb>>;
+ 'Accept-Charset' -> <<16#81>>;
+ 'Accept-Encoding' when Version >= ?WSP_13 -> <<16#bc>>;
+ 'Accept-Encoding' -> <<16#82>>;
+ 'Accept-Language' -> <<16#83>>;
+ 'Accept-Ranges' -> <<16#84>>;
+ 'Age' -> <<16#85>>;
+ 'Allow' -> <<16#86>>;
+ 'Authorization' -> <<16#87>>;
+ 'Cache-Control' when Version >= ?WSP_14 -> <<16#c7>>;
+ 'Cache-Control' when Version >= ?WSP_13 -> <<16#bd>>;
+ 'Cache-Control' -> <<16#88>>;
+ 'Connection' -> <<16#89>>;
+ 'Content-Base' -> <<16#8a>>;
+ 'Content-Encoding' -> <<16#8b>>;
+ 'Content-Language' -> <<16#8c>>;
+ 'Content-Length' -> <<16#8d>>;
+ 'Content-Location' -> <<16#8e>>;
+ 'Content-Md5' -> <<16#8f>>;
+ 'Content-Range' when Version >= ?WSP_13 -> <<16#be>>;
+ 'Content-Range' -> <<16#90>>;
+ 'Content-Type' -> <<16#91>>;
+ 'Date' -> <<16#92>>;
+ 'Etag' -> <<16#93>>;
+ 'Expires' -> <<16#94>>;
+ 'From' -> <<16#95>>;
+ 'Host' -> <<16#96>>;
+ 'If-Modified-Since' -> <<16#97>>;
+ 'If-Match' -> <<16#98>>;
+ 'If-None-Match' -> <<16#99>>;
+ 'If-Range' -> <<16#9a>>;
+ 'If-Unmodified-Since' -> <<16#9b>>;
+ 'Location' -> <<16#9c>>;
+ 'Last-Modified' -> <<16#9d>>;
+ 'Max-Forwards' -> <<16#9e>>;
+ 'Pragma' -> <<16#9f>>;
+ 'Proxy-Authenticate' -> <<16#a0>>;
+ 'Proxy-Authorization' -> <<16#a1>>;
+ 'Public' -> <<16#a2>>;
+ 'Range' -> <<16#a3>>;
+ 'Referer' -> <<16#a4>>;
+ 'Retry-After' -> <<16#a5>>;
+ 'Server' -> <<16#a6>>;
+ 'Transfer-Encoding' -> <<16#a7>>;
+ 'Upgrade' -> <<16#a8>>;
+ 'User-Agent' -> <<16#a9>>;
+ 'Vary' -> <<16#aa>>;
+ 'Via' -> <<16#ab>>;
+ 'Warning' -> <<16#ac>>;
+ 'Www-Authenticate' -> <<16#ad>>;
+ 'Content-Disposition' when Version >= ?WSP_14 -> <<16#c5>>;
+ 'Content-Disposition' -> <<16#ae>>;
+ %% VERSION > 1.1
+ 'X-Wap-Application-Id' when Version >= ?WSP_12 -> <<16#af>>;
+ 'X-Wap-Content-Uri' when Version >= ?WSP_12 -> <<16#b0>>;
+ 'X-Wap-Initiator-Uri' when Version >= ?WSP_12 -> <<16#b1>>;
+ 'Accept-Application' when Version >= ?WSP_12 -> <<16#b2>>;
+ 'Bearer-Indication' when Version >= ?WSP_12 -> <<16#b3>>;
+ 'Push-Flag' when Version >= ?WSP_12 -> <<16#b4>>;
+ 'Profile' when Version >= ?WSP_12 -> <<16#b5>>;
+ 'Profile-Diff' when Version >= ?WSP_12 -> <<16#b6>>;
+ 'Profile-Warning' when Version >= ?WSP_12 -> <<16#b7>>;
+ 'Expect' when Version >= ?WSP_15 -> <<16#c8>>;
+ 'Expect' when Version >= ?WSP_13 -> <<16#b8>>;
+ 'Te' when Version >= ?WSP_13 -> <<16#b9>>;
+ 'Trailer' when Version >= ?WSP_13 -> <<16#ba>>;
+ 'X-Wap-Tod' when Version >= ?WSP_13 -> <<16#bf>>;
+ 'Content-Id' when Version >= ?WSP_13 -> <<16#c0>>;
+ 'Set-Cookie' when Version >= ?WSP_13 -> <<16#c1>>;
+ 'Cookie' when Version >= ?WSP_13 -> <<16#c2>>;
+ 'Encoding-Version' when Version >= ?WSP_13 -> <<16#c3>>;
+ 'Profile-Warning' when Version >= ?WSP_14 -> <<16#c4>>;
+ 'X-Wap-Security' when Version >= ?WSP_14 -> <<16#c6>>;
+ 'X-Wap-Loc-Invocation' when Version >= ?WSP_15 -> <<16#c9>>;
+ 'X-Wap-Loc-Delivery' when Version >= ?WSP_15 -> <<16#ca>>;
+ Field -> encode_text_string(atom_to_list(Field))
+ end.
+
+
+%%
+%% decode and normalise on form list_to_atom("Ulll-Ulll-Ull")
+%%
+normalise_field_name(Cs) when atom(Cs) ->
+ Cs;
+normalise_field_name(Cs) ->
+ list_to_atom(normalise_fieldU(Cs)).
+
+normalise_fieldU([C|Cs]) when C >= $a, C =< $z ->
+ [(C-$a)+$A | normalise_fieldL(Cs)];
+normalise_fieldU([C|Cs]) -> [ C | normalise_fieldL(Cs)];
+normalise_fieldU([]) -> [].
+
+normalise_fieldL([C|Cs]) when C >= $A, C =< $Z ->
+ [(C-$A)+$a | normalise_fieldL(Cs)];
+normalise_fieldL([$-|Cs]) -> [$- | normalise_fieldU(Cs)];
+normalise_fieldL([C|Cs]) -> [C | normalise_fieldL(Cs)];
+normalise_fieldL([]) -> [].
+
+
+tolower([C|Cs]) when C >= $A, C =< $Z ->
+ [(C-$A)+$a | tolower(Cs)];
+tolower([C|Cs]) -> [C|tolower(Cs)];
+tolower([]) -> [].
+
+trim(Cs) ->
+ lists:reverse(trim1(lists:reverse(trim1(Cs)))).
+
+trim1([$\s|Cs]) -> trim1(Cs);
+trim1([$\t|Cs]) -> trim1(Cs);
+trim1([$\r|Cs]) -> trim1(Cs);
+trim1([$\n|Cs]) -> trim1(Cs);
+trim1(Cs) -> Cs.
+
+
+d_field_name(Data) ->
+ case scan_header_data(Data) of
+ {Code, Data1} when integer(Code) ->
+ {lookup_field_name(Code), Data1};
+ {TmpField,Data1} when list(TmpField) ->
+ {normalise_field_name(TmpField), Data1}
+ end.
+
+d_no_value(<<0, Data/binary>>) ->
+ {no_value, Data}.
+
+e_no_value(_) ->
+ <<0>>.
+
+
+lookup_field_name(Code) ->
+ case Code of
+%%% Version 1.1
+ 16#00 -> 'Accept';
+ 16#01 -> 'Accept-Charset';
+ 16#02 -> 'Accept-Encoding';
+ 16#03 -> 'Accept-Language';
+ 16#04 -> 'Accept-Ranges';
+ 16#05 -> 'Age';
+ 16#06 -> 'Allow';
+ 16#07 -> 'Authorization';
+ 16#08 -> 'Cache-Control';
+ 16#09 -> 'Connection';
+ 16#0a -> 'Content-Base';
+ 16#0b -> 'Content-Encoding';
+ 16#0c -> 'Content-Language';
+ 16#0d -> 'Content-Length';
+ 16#0e -> 'Content-Location';
+ 16#0f -> 'Content-Md5';
+ 16#10 -> 'Content-Range';
+ 16#11 -> 'Content-Type';
+ 16#12 -> 'Date';
+ 16#13 -> 'Etag';
+ 16#14 -> 'Expires';
+ 16#15 -> 'From';
+ 16#16 -> 'Host';
+ 16#17 -> 'If-Modified-Since';
+ 16#18 -> 'If-Match';
+ 16#19 -> 'If-None-Match';
+ 16#1a -> 'If-Range';
+ 16#1b -> 'If-Unmodified-Since';
+ 16#1c -> 'Location';
+ 16#1d -> 'Last-Modified';
+ 16#1e -> 'Max-Forwards';
+ 16#1f -> 'Pragma';
+ 16#20 -> 'Proxy-Authenticate';
+ 16#21 -> 'Proxy-Authorization';
+ 16#22 -> 'Public';
+ 16#23 -> 'Range';
+ 16#24 -> 'Referer';
+ 16#25 -> 'Retry-After';
+ 16#26 -> 'Server';
+ 16#27 -> 'Transfer-Encoding';
+ 16#28 -> 'Upgrade';
+ 16#29 -> 'User-Agent';
+ 16#2a -> 'Vary';
+ 16#2b -> 'Via';
+ 16#2c -> 'Warning';
+ 16#2d -> 'Www-Authenticate';
+ 16#2e -> 'Content-Disposition';
+%%% Version 1.2
+ 16#2f -> 'X-Wap-Application-Id';
+ 16#30 -> 'X-Wap-Content-Uri';
+ 16#31 -> 'X-Wap-Initiator-Uri';
+ 16#32 -> 'Accept-Application';
+ 16#33 -> 'Bearer-Indication';
+ 16#34 -> 'Push-Flag';
+ 16#35 -> 'Profile';
+ 16#36 -> 'Profile-Diff';
+ 16#37 -> 'Profile-Warning';
+%%% Version 1.3
+ 16#38 -> 'Expect';
+ 16#39 -> 'Te';
+ 16#3a -> 'Trailer';
+ 16#3b -> 'Accept-Charset';
+ 16#3c -> 'Accept-Encoding';
+ 16#3d -> 'Cache-Control';
+ 16#3e -> 'Content-Range';
+ 16#3f -> 'X-Wap-Tod';
+ 16#40 -> 'Content-Id';
+ 16#41 -> 'Set-Cookie';
+ 16#42 -> 'Cookie';
+ 16#43 -> 'Encoding-Version';
+%%% Version 1.4
+ 16#44 -> 'Profile-Warning';
+ 16#45 -> 'Content-Disposition';
+ 16#46 -> 'X-Wap-Security';
+ 16#47 -> 'Cache-Control';
+%%% Version 1.5
+ 16#48 -> 'Expect';
+ 16#49 -> 'X-Wap-Loc-Invocation';
+ 16#4a -> 'X-Wap-Loc-Delivery';
+%% Unknown
+ _ ->
+ list_to_atom("X-Unknown-"++erlang:integer_to_list(Code, 16))
+ end.
+
+
+encode_charset(Charset) ->
+ %% FIXME: we should really resolve aliases as well
+ %% charset:from_aliases(Charset)
+ case charset:from_mime_name(Charset) of
+ 0 -> exit({error, unknown_charset});
+ MIBenum -> MIBenum
+ end.
+
+encode_language(Language) ->
+ Code = encode_lang(tolower(Language)),
+ <<Code>>.
+
+
+
+decode_charset(MIBenum) ->
+ case charset:to_mime_name(MIBenum) of
+ undefined ->
+ exit({error, unknown_charset});
+ Preferred ->
+ Preferred
+ end.
+
+%% ISO 639 Language Assignments, Appendix A, Table 41, Page 102-103
+decode_lang(Code) ->
+ case lookup_language(Code) of
+ [L|_] -> atom_to_list(L);
+ [] -> ""
+ end.
+
+
+lookup_language(Code) ->
+ case Code of
+ 16#01 -> ['aa','afar'];
+ 16#02 -> ['ab','abkhazian'];
+ 16#03 -> ['af','afrikans'];
+ 16#04 -> ['am','amharic'];
+ 16#05 -> ['ar','arabic'];
+ 16#06 -> ['as','assamese'];
+ 16#07 -> ['ay','aymara'];
+ 16#08 -> ['az','azerbaijani'];
+ 16#09 -> ['ba','bashkir'];
+ 16#0a -> ['be','byelorussian'];
+ 16#0b -> ['bg','bulgarian'];
+ 16#0c -> ['bh','bihari'];
+ 16#0d -> ['bi','bislama'];
+ 16#0e -> ['bn','bangla','bengali'];
+ 16#0f -> ['bo','tibetan'];
+ 16#10 -> ['br','breton'];
+ 16#11 -> ['ca','catalan'];
+ 16#12 -> ['co','corsican'];
+ 16#13 -> ['cs','czech'];
+ 16#14 -> ['cy','welsh'];
+ 16#15 -> ['da','danish'];
+ 16#16 -> ['de','german'];
+ 16#17 -> ['dz','bhutani'];
+ 16#18 -> ['el','greek'];
+ 16#19 -> ['en','english'];
+ 16#1a -> ['eo','esperanto'];
+ 16#1b -> ['es','spanish'];
+ 16#1c -> ['et','estonian'];
+ 16#1d -> ['eu','basque'];
+ 16#1e -> ['fa','persian'];
+ 16#1f -> ['fi','finnish'];
+ 16#20 -> ['fj','fiji'];
+ 16#82 -> ['fo','faeroese'];
+ 16#22 -> ['fr','french'];
+ 16#83 -> ['fy','frisian'];
+ 16#24 -> ['ga','irish'];
+ 16#25 -> ['gd','scots-gaelic'];
+ 16#26 -> ['gl','galician'];
+ 16#27 -> ['gn','guarani'];
+ 16#28 -> ['gu','gujarati'];
+ 16#29 -> ['ha','hausa'];
+ 16#2a -> ['he','hebrew'];
+ 16#2b -> ['hi','hindi'];
+ 16#2c -> ['hr','croatian'];
+ 16#2d -> ['hu','hungarian'];
+ 16#2e -> ['hy','armenian'];
+ 16#84 -> ['ia','interlingua'];
+ 16#30 -> ['id','indonesian'];
+ 16#86 -> ['ie','interlingue'];
+ 16#87 -> ['ik','inupiak'];
+ 16#33 -> ['is','icelandic'];
+ 16#34 -> ['it','italian'];
+ 16#89 -> ['iu','inuktitut'];
+ 16#36 -> ['ja','japanese'];
+ 16#37 -> ['jw','javanese'];
+ 16#38 -> ['ka','georgian'];
+ 16#39 -> ['kk','kazakh'];
+ 16#8a -> ['kl','greenlandic'];
+ 16#3b -> ['km','cambodian'];
+ 16#3c -> ['kn','kannada'];
+ 16#3d -> ['ko','korean'];
+ 16#3e -> ['ks','kashmiri'];
+ 16#3f -> ['ku','kurdish'];
+ 16#40 -> ['ky','kirghiz'];
+ 16#8b -> ['la','latin'];
+ 16#42 -> ['ln','lingala'];
+ 16#43 -> ['lo','laothian'];
+ 16#44 -> ['lt','lithuanian'];
+ 16#45 -> ['lv','lettish','latvian'];
+ 16#46 -> ['mg','malagese'];
+ 16#47 -> ['mi','maori'];
+ 16#48 -> ['mk','macedonian'];
+ 16#49 -> ['ml','malayalam'];
+ 16#4a -> ['mn','mongolian'];
+ 16#4b -> ['mo','moldavian'];
+ 16#4c -> ['mr','marathi'];
+ 16#4d -> ['ms','malay'];
+ 16#4e -> ['mt','maltese'];
+ 16#4f -> ['my','burmese'];
+ 16#81 -> ['na','nauru'];
+ 16#51 -> ['ne','nepali'];
+ 16#52 -> ['nl','dutch'];
+ 16#53 -> ['no','norwegian'];
+ 16#54 -> ['oc','occitan'];
+ 16#55 -> ['om','oromo'];
+ 16#56 -> ['or','oriya'];
+ 16#57 -> ['pa','punjabi'];
+ 16#58 -> ['po','polish'];
+ 16#59 -> ['ps','pushto','pashto'];
+ 16#5a -> ['pt','portugese'];
+ 16#5b -> ['qu','quechua'];
+ 16#8c -> ['rm','rhaeto-romance'];
+ 16#5d -> ['rn','kirundi'];
+ 16#5e -> ['ro','romanian'];
+ 16#5f -> ['ru','russian'];
+ 16#60 -> ['rw','kinyarwanda'];
+ 16#61 -> ['sa','sanskrit'];
+ 16#62 -> ['sd','sindhi'];
+ 16#63 -> ['sg','sangho'];
+ 16#64 -> ['sh','serbo-croatian'];
+ 16#65 -> ['si','sinhalese'];
+ 16#66 -> ['sk','slovak'];
+ 16#67 -> ['sl','slovenian'];
+ 16#68 -> ['sm','samoan'];
+ 16#69 -> ['sn','shona'];
+ 16#6a -> ['so','somali'];
+ 16#6b -> ['sq','albanian'];
+ 16#6c -> ['sr','serbian'];
+ 16#6d -> ['ss','siswati'];
+ 16#6e -> ['st','seshoto'];
+ 16#6f -> ['su','sundanese'];
+ 16#70 -> ['sv','swedish'];
+ 16#71 -> ['sw','swahili'];
+ 16#72 -> ['ta','tamil'];
+ 16#73 -> ['te','telugu'];
+ 16#74 -> ['tg','tajik'];
+ 16#75 -> ['th','thai'];
+ 16#76 -> ['ti','tigrinya'];
+ 16#77 -> ['tk','turkmen'];
+ 16#78 -> ['tl','tagalog'];
+ 16#79 -> ['tn','setswana'];
+ 16#7a -> ['to','tonga'];
+ 16#7b -> ['tr','turkish'];
+ 16#7c -> ['ts','tsonga'];
+ 16#7d -> ['tt','tatar'];
+ 16#7e -> ['tw','twi'];
+ 16#7f -> ['ug','uighur'];
+ 16#50 -> ['uk','ukrainian'];
+ 16#21 -> ['ur','urdu'];
+ 16#23 -> ['uz','uzbek'];
+ 16#2f -> ['vi','vietnamese'];
+ 16#85 -> ['vo','volapuk'];
+ 16#31 -> ['wo','wolof'];
+ 16#32 -> ['xh','xhosa'];
+ 16#88 -> ['yi','yiddish'];
+ 16#35 -> ['yo','yoruba'];
+ 16#3a -> ['za','zhuang'];
+ 16#41 -> ['zh','chinese'];
+ 16#5c -> ['zu','zulu'];
+ _ -> []
+ end.
+
+encode_lang(Language) ->
+ case tolower(Language) of
+ "aa" -> 16#01;
+ "afar" -> 16#01;
+ "ab" -> 16#02;
+ "abkhazian" -> 16#02;
+ "af" -> 16#03;
+ "afrikans" -> 16#03;
+ "am" -> 16#04;
+ "amharic" -> 16#04;
+ "ar" -> 16#05;
+ "arabic" -> 16#05;
+ "as" -> 16#06;
+ "assamese" -> 16#06;
+ "ay" -> 16#07;
+ "aymara" -> 16#07;
+ "az" -> 16#08;
+ "azerbaijani" -> 16#08;
+ "ba" -> 16#09;
+ "bashkir" -> 16#09;
+ "be" -> 16#0a;
+ "byelorussian" -> 16#0a;
+ "bg" -> 16#0b;
+ "bulgarian" -> 16#0b;
+ "bh" -> 16#0c;
+ "bihari" -> 16#0c;
+ "bi" -> 16#0d;
+ "bislama" -> 16#0d;
+ "bn" -> 16#0e;
+ "bangla" -> 16#0e;
+ "bengali" -> 16#0e;
+ "bo" -> 16#0f;
+ "tibetan" -> 16#0f;
+ "br" -> 16#10;
+ "breton" -> 16#10;
+ "ca" -> 16#11;
+ "catalan" -> 16#11;
+ "co" -> 16#12;
+ "corsican" -> 16#12;
+ "cs" -> 16#13;
+ "czech" -> 16#13;
+ "cy" -> 16#14;
+ "welsh" -> 16#14;
+ "da" -> 16#15;
+ "danish" -> 16#15;
+ "de" -> 16#16;
+ "german" -> 16#16;
+ "dz" -> 16#17;
+ "bhutani" -> 16#17;
+ "el" -> 16#18;
+ "greek" -> 16#18;
+ "en" -> 16#19;
+ "english" -> 16#19;
+ "eo" -> 16#1a;
+ "esperanto" -> 16#1a;
+ "es" -> 16#1b;
+ "spanish" -> 16#1b;
+ "et" -> 16#1c;
+ "estonian" -> 16#1c;
+ "eu" -> 16#1d;
+ "basque" -> 16#1d;
+ "fa" -> 16#1e;
+ "persian" -> 16#1e;
+ "fi" -> 16#1f;
+ "finnish" -> 16#1f;
+ "fj" -> 16#20;
+ "fiji" -> 16#20;
+ "fo" -> 16#82;
+ "faeroese" -> 16#82;
+ "fr" -> 16#22;
+ "french" -> 16#22;
+ "fy" -> 16#83;
+ "frisian" -> 16#83;
+ "ga" -> 16#24;
+ "irish" -> 16#24;
+ "gd" -> 16#25;
+ "scots-gaelic" -> 16#25;
+ "gl" -> 16#26;
+ "galician" -> 16#26;
+ "gn" -> 16#27;
+ "guarani" -> 16#27;
+ "gu" -> 16#28;
+ "gujarati" -> 16#28;
+ "ha" -> 16#29;
+ "hausa" -> 16#29;
+ "he" -> 16#2a;
+ "hebrew" -> 16#2a;
+ "hi" -> 16#2b;
+ "hindi" -> 16#2b;
+ "hr" -> 16#2c;
+ "croatian" -> 16#2c;
+ "hu" -> 16#2d;
+ "hungarian" -> 16#2d;
+ "hy" -> 16#2e;
+ "armenian" -> 16#2e;
+ "ia" -> 16#84;
+ "interlingua" -> 16#84;
+ "id" -> 16#30;
+ "indonesian" -> 16#30;
+ "ie" -> 16#86;
+ "interlingue" -> 16#86;
+ "ik" -> 16#87;
+ "inupiak" -> 16#87;
+ "is" -> 16#33;
+ "icelandic" -> 16#33;
+ "it" -> 16#34;
+ "italian" -> 16#34;
+ "iu" -> 16#89;
+ "inuktitut" -> 16#89;
+ "ja" -> 16#36;
+ "japanese" -> 16#36;
+ "jw" -> 16#37;
+ "javanese" -> 16#37;
+ "ka" -> 16#38;
+ "georgian" -> 16#38;
+ "kk" -> 16#39;
+ "kazakh" -> 16#39;
+ "kl" -> 16#8a;
+ "greenlandic" -> 16#8a;
+ "km" -> 16#3b;
+ "cambodian" -> 16#3b;
+ "kn" -> 16#3c;
+ "kannada" -> 16#3c;
+ "ko" -> 16#3d;
+ "korean" -> 16#3d;
+ "ks" -> 16#3e;
+ "kashmiri" -> 16#3e;
+ "ku" -> 16#3f;
+ "kurdish" -> 16#3f;
+ "ky" -> 16#40;
+ "kirghiz" -> 16#40;
+ "la" -> 16#8b;
+ "latin" -> 16#8b;
+ "ln" -> 16#42;
+ "lingala" -> 16#42;
+ "lo" -> 16#43;
+ "laothian" -> 16#43;
+ "lt" -> 16#44;
+ "lithuanian" -> 16#44;
+ "lv" -> 16#45;
+ "lettish" -> 16#45;
+ "latvian" -> 16#45;
+ "mg" -> 16#46;
+ "malagese" -> 16#46;
+ "mi" -> 16#47;
+ "maori" -> 16#47;
+ "mk" -> 16#48;
+ "macedonian" -> 16#48;
+ "ml" -> 16#49;
+ "malayalam" -> 16#49;
+ "mn" -> 16#4a;
+ "mongolian" -> 16#4a;
+ "mo" -> 16#4b;
+ "moldavian" -> 16#4b;
+ "mr" -> 16#4c;
+ "marathi" -> 16#4c;
+ "ms" -> 16#4d;
+ "malay" -> 16#4d;
+ "mt" -> 16#4e;
+ "maltese" -> 16#4e;
+ "my" -> 16#4f;
+ "burmese" -> 16#4f;
+ "na" -> 16#81;
+ "nauru" -> 16#81;
+ "ne" -> 16#51;
+ "nepali" -> 16#51;
+ "nl" -> 16#52;
+ "dutch" -> 16#52;
+ "no" -> 16#53;
+ "norwegian" -> 16#53;
+ "oc" -> 16#54;
+ "occitan" -> 16#54;
+ "om" -> 16#55;
+ "oromo" -> 16#55;
+ "or" -> 16#56;
+ "oriya" -> 16#56;
+ "pa" -> 16#57;
+ "punjabi" -> 16#57;
+ "po" -> 16#58;
+ "polish" -> 16#58;
+ "ps" -> 16#59;
+ "pushto" -> 16#59;
+ "pt" -> 16#5a;
+ "portugese" -> 16#5a;
+ "qu" -> 16#5b;
+ "quechua" -> 16#5b;
+ "rm" -> 16#8c;
+ "rhaeto-romance" -> 16#8c;
+ "rn" -> 16#5d;
+ "kirundi" -> 16#5d;
+ "ro" -> 16#5e;
+ "romanian" -> 16#5e;
+ "ru" -> 16#5f;
+ "russian" -> 16#5f;
+ "rw" -> 16#60;
+ "kinyarwanda" -> 16#60;
+ "sa" -> 16#61;
+ "sanskrit" -> 16#61;
+ "sd" -> 16#62;
+ "sindhi" -> 16#62;
+ "sg" -> 16#63;
+ "sangho" -> 16#63;
+ "sh" -> 16#64;
+ "serbo-croatian" -> 16#64;
+ "si" -> 16#65;
+ "sinhalese" -> 16#65;
+ "sk" -> 16#66;
+ "slovak" -> 16#66;
+ "sl" -> 16#67;
+ "slovenian" -> 16#67;
+ "sm" -> 16#68;
+ "samoan" -> 16#68;
+ "sn" -> 16#69;
+ "shona" -> 16#69;
+ "so" -> 16#6a;
+ "somali" -> 16#6a;
+ "sq" -> 16#6b;
+ "albanian" -> 16#6b;
+ "sr" -> 16#6c;
+ "serbian" -> 16#6c;
+ "ss" -> 16#6d;
+ "siswati" -> 16#6d;
+ "st" -> 16#6e;
+ "seshoto" -> 16#6e;
+ "su" -> 16#6f;
+ "sundanese" -> 16#6f;
+ "sv" -> 16#70;
+ "swedish" -> 16#70;
+ "sw" -> 16#71;
+ "swahili" -> 16#71;
+ "ta" -> 16#72;
+ "tamil" -> 16#72;
+ "te" -> 16#73;
+ "telugu" -> 16#73;
+ "tg" -> 16#74;
+ "tajik" -> 16#74;
+ "th" -> 16#75;
+ "thai" -> 16#75;
+ "ti" -> 16#76;
+ "tigrinya" -> 16#76;
+ "tk" -> 16#77;
+ "turkmen" -> 16#77;
+ "tl" -> 16#78;
+ "tagalog" -> 16#78;
+ "tn" -> 16#79;
+ "setswana" -> 16#79;
+ "to" -> 16#7a;
+ "tonga" -> 16#7a;
+ "tr" -> 16#7b;
+ "turkish" -> 16#7b;
+ "ts" -> 16#7c;
+ "tsonga" -> 16#7c;
+ "tt" -> 16#7d;
+ "tatar" -> 16#7d;
+ "tw" -> 16#7e;
+ "twi" -> 16#7e;
+ "ug" -> 16#7f;
+ "uighur" -> 16#7f;
+ "uk" -> 16#50;
+ "ukrainian" -> 16#50;
+ "ur" -> 16#21;
+ "urdu" -> 16#21;
+ "uz" -> 16#23;
+ "uzbek" -> 16#23;
+ "vi" -> 16#2f;
+ "vietnamese" -> 16#2f;
+ "vo" -> 16#85;
+ "volapuk" -> 16#85;
+ "wo" -> 16#31;
+ "wolof" -> 16#31;
+ "xh" -> 16#32;
+ "xhosa" -> 16#32;
+ "yi" -> 16#88;
+ "yiddish" -> 16#88;
+ "yo" -> 16#35;
+ "yoruba" -> 16#35;
+ "za" -> 16#3a;
+ "zhuang" -> 16#3a;
+ "zh" -> 16#41;
+ "chinese" -> 16#41;
+ "zu" -> 16#5c;
+ "zulu" -> 16#5c
+ end.
+
+
+%% Push Application ID Assignments
+%%
+%% Assingment are found at http://www.wapforum.org/wina/push-app-id.htm
+%%
+decode_push_application({short,Data}) ->
+ decode_push_application(d_long(Data));
+
+decode_push_application(Code) when integer(Code) ->
+ case Code of
+ 16#00 -> "x-wap-application:*";
+ 16#01 -> "x-wap-application:push.sia";
+ 16#02 -> "x-wap-application:wml.ua";
+ 16#03 -> "x-wap-application:wta.ua";
+ 16#04 -> "x-wap-application:mms.ua";
+ 16#05 -> "x-wap-application:push.syncml";
+ 16#06 -> "x-wap-application:loc.ua";
+ 16#07 -> "x-wap-application:syncml.dm";
+ 16#08 -> "x-wap-application:drm.ua";
+ 16#09 -> "x-wap-application:emn.ua";
+ 16#0A -> "x-wap-application:wv.ua";
+ 16#8000 -> "x-wap-microsoft:localcontent.ua";
+ 16#8001 -> "x-wap-microsoft:IMclient.ua";
+ 16#8002 -> "x-wap-docomo:imode.mail.ua";
+ 16#8003 -> "x-wap-docomo:imode.mr.ua";
+ 16#8004 -> "x-wap-docomo:imode.mf.ua";
+ 16#8005 -> "x-motorola:location.ua";
+ 16#8006 -> "x-motorola:now.ua";
+ 16#8007 -> "x-motorola:otaprov.ua";
+ 16#8008 -> "x-motorola:browser.ua";
+ 16#8009 -> "x-motorola:splash.ua";
+ 16#800B -> "x-wap-nai:mvsw.command";
+ 16#8010 -> "x-wap-openwave:iota.ua"
+ end;
+decode_push_application(App) when list(App) ->
+ App.
+
+
+
+encode_push_application(App) ->
+ case App of
+ "x-wap-application:*" -> ?ENCODE_SHORT(16#00);
+ "x-wap-application:push.sia" -> ?ENCODE_SHORT(16#01);
+ "x-wap-application:wml.ua" -> ?ENCODE_SHORT(16#02);
+ "x-wap-application:wta.ua" -> ?ENCODE_SHORT(16#03);
+ "x-wap-application:mms.ua" -> ?ENCODE_SHORT(16#04);
+ "x-wap-application:push.syncml" -> ?ENCODE_SHORT(16#05);
+ "x-wap-application:loc.ua" -> ?ENCODE_SHORT(16#06);
+ "x-wap-application:syncml.dm" -> ?ENCODE_SHORT(16#07);
+ "x-wap-application:drm.ua" -> ?ENCODE_SHORT(16#08);
+ "x-wap-application:emn.ua" -> ?ENCODE_SHORT(16#09);
+ "x-wap-application:wv.ua" -> ?ENCODE_SHORT(16#0A);
+ "x-wap-microsoft:localcontent.ua" -> encode_integer(16#8000);
+ "x-wap-microsoft:IMclient.ua" -> encode_integer(16#8001);
+ "x-wap-docomo:imode.mail.ua" -> encode_integer(16#8002);
+ "x-wap-docomo:imode.mr.ua" -> encode_integer(16#8003);
+ "x-wap-docomo:imode.mf.ua" -> encode_integer(16#8004);
+ "x-motorola:location.ua" -> encode_integer(16#8005);
+ "x-motorola:now.ua" -> encode_integer(16#8006);
+ "x-motorola:otaprov.ua" -> encode_integer(16#8007);
+ "x-motorola:browser.ua" -> encode_integer(16#8008);
+ "x-motorola:splash.ua" -> encode_integer(16#8009);
+ "x-wap-nai:mvsw.command" -> encode_integer(16#800B);
+ "x-wap-openwave:iota.ua" -> encode_integer(16#8010);
+ _ -> encode_uri_value(App)
+ end.
+
+
+
+
+%% WSP 8.5 Multipart handling
+
+encode_multipart(Entries) ->
+ encode_multipart(Entries, ?WSP_DEFAULT_VERSION).
+
+encode_multipart([], _Version) ->
+ <<>>;
+encode_multipart(Entries, Version) ->
+ EncEntries = encode_multipart_entries(Entries, Version),
+ <<(e_uintvar(length(Entries)))/binary, EncEntries/binary >>.
+
+encode_multipart_entries(Entries, Version) ->
+ encode_multipart_entries(Entries, Version, []).
+
+encode_multipart_entries([], _Version, Acc) ->
+ list_to_binary(lists:reverse(Acc));
+encode_multipart_entries([Entry|T], Version, Acc) ->
+ EncEntry = encode_multipart_entry(Entry, Version),
+ encode_multipart_entries(T, Version, [EncEntry | Acc]).
+
+encode_multipart_entry(Entry, Version) ->
+ #wsp_multipart_entry { content_type = ContentType,
+ headers = Headers,
+ data = Data } = Entry,
+ EncContentType = encode_content_type(ContentType,Version),
+ EncHeaders = encode_headers(Headers, Version),
+ EncHeadersLength = e_uintvar(size(EncContentType)+size(EncHeaders)),
+ DataLen = e_uintvar(size(Data)),
+ <<EncHeadersLength/binary,
+ DataLen/binary,
+ EncContentType/binary,
+ EncHeaders/binary,
+ Data/binary>>.
+
+
+decode_multipart(Data) ->
+ decode_multipart(Data, ?WSP_DEFAULT_VERSION).
+
+decode_multipart(<<>>, _Version) ->
+ {[], <<>>};
+decode_multipart(Data, Version) ->
+ {Entries, Data1} = d_uintvar(Data),
+ decode_multipart_entries(Entries, Data1, Version).
+
+decode_multipart_entries(Entries, Data, Version) ->
+ decode_multipart_entries(Entries, Data, Version, []).
+
+decode_multipart_entries(0, Data, _Version, Acc) ->
+ {lists:reverse(Acc), Data};
+decode_multipart_entries(Entries, Data, Version, Acc) ->
+ {MultiPartEntry, Data1} = decode_multipart_entry(Data,Version),
+ decode_multipart_entries(Entries-1, Data1, Version, [MultiPartEntry|Acc]).
+
+decode_multipart_entry(Data, Version) ->
+ {HeadersLen, Data1} = d_uintvar(Data),
+ {DataLen, Data2} = d_uintvar(Data1),
+ {FieldData,Data3} = scan_header_data(Data2),
+ ContentType = decode_content_type(FieldData, Version),
+ BinHeadersLen = (HeadersLen-(size(Data2)-size(Data3))),
+ <<BinHeaders:BinHeadersLen/binary,Data4/binary>> = Data3,
+ Headers = decode_headers(BinHeaders, Version),
+ <<ValueData:DataLen/binary, Data5/binary>> = Data4,
+ {#wsp_multipart_entry{content_type=ContentType,
+ headers=Headers,
+ data=ValueData},Data5}.
+
+
+parse_credentials(Field, Value) ->
+ %% FIXME
+ ?WH(Field, Value, []).
+
+format_credentials("basic", [User,Password]) ->
+ ["Basic ", base64:encode(User++":"++Password)];
+format_credentials(Scheme, Params) ->
+ [Scheme, format_params(Params)].
+
+encode_credentials("basic", [User,Password], _Version) ->
+ e_value(?ENCODE_SHORT(0),
+ encode_text_string(User),
+ encode_text_string(Password));
+encode_credentials(Scheme, Params, Version) ->
+ e_value(encode_text_string(Scheme), encode_params(Params, Version)).
+
+decode_credentials(Field, Data, Version) ->
+ case scan_header_data(Data) of
+ {0, Data0} ->
+ {User,Data1} = d_text_string(Data0),
+ {Password,_Data2} = d_text_string(Data1),
+ ?WH(Field, "basic", [User,Password]);
+ {Scheme, Data0} when list(Scheme) ->
+ Params = decode_params(Data0, Version),
+ ?WH(Field, Scheme, Params)
+ end.
+
+%%
+%% Challenge: Basic Realm-value | Auth-Scheme Realm *Auth-Params
+%%
+
+parse_challenge(Field, Value) ->
+ %% FIXME
+ ?WH(Field, Value, []).
+
+format_challenge({"basic",Realm}, []) ->
+ ["Basic ", Realm];
+format_challenge({Scheme,Realm}, Params) ->
+ [Scheme," ",Realm, format_params(Params)].
+
+encode_challenge({"basic",Realm}, [], _Version) ->
+ e_value(?ENCODE_SHORT(0),
+ encode_text_string(Realm));
+encode_challenge({Scheme,Realm}, Params, Version) ->
+ e_value(encode_text_string(Scheme),
+ encode_text_string(Realm),
+ encode_params(Params, Version)).
+
+decode_challenge(Field, Data, Version) ->
+ case scan_header_data(Data) of
+ {0, Data0} ->
+ {Realm,_} = d_text_string(Data0),
+ ?WH(Field, {"basic", Realm}, []);
+ {Scheme, Data0} when list(Scheme) ->
+ {Realm,_} = d_text_string(Data0),
+ Params = decode_params(Data0, Version),
+ ?WH(Field, {Scheme,Realm}, Params)
+ end.
+
+
+parse_well_known_method(Value) ->
+ case Value of
+ "GET" -> 'GET';
+ "OPTIONS" -> 'OPTIONS';
+ "HEAD" -> 'HEAD';
+ "DELETE" -> 'DELETE';
+ "TRACE" -> 'TRACE';
+ "POST" -> 'POST';
+ "PUT" -> 'PUT'
+ end.
+
+encode_well_known_method(Value, _Version) ->
+ case Value of
+ 'GET' -> ?ENCODE_SHORT(16#40);
+ 'OPTIONS' -> ?ENCODE_SHORT(16#41);
+ 'HEAD' -> ?ENCODE_SHORT(16#42);
+ 'DELETE' -> ?ENCODE_SHORT(16#43);
+ 'TRACE' -> ?ENCODE_SHORT(16#44);
+ 'POST' -> ?ENCODE_SHORT(16#60);
+ 'PUT' -> ?ENCODE_SHORT(16#61)
+ end.
+
+decode_well_known_method(Value, _Version) ->
+ case Value of
+ 16#40 -> 'GET';
+ 16#41 -> 'OPTIONS';
+ 16#42 -> 'HEAD';
+ 16#43 -> 'DELETE';
+ 16#44 -> 'TRACE';
+ 16#60 -> 'POST';
+ 16#61 -> 'PUT'
+ end.
+
+
+
+%%
+%% WSP Table 36. Status Code Assignments
+%%
+
+encode_status_code(Status) ->
+ case Status of
+ 100 -> 16#10; %% 'Continue'
+ 101 -> 16#11; %% 'Switching Protocols'
+ 200 -> 16#20; %% 'OK, Success'
+ 201 -> 16#21; %% 'Created'
+ 202 -> 16#22; %% 'Accepted'
+ 203 -> 16#23; %% 'Non-Authoritative Information'
+ 204 -> 16#24; %% 'No Content'
+ 205 -> 16#25; %% 'Reset Content'
+ 206 -> 16#26; %% 'Partial Content'
+ 300 -> 16#30; %% 'Multiple Choices'
+ 301 -> 16#31; %% 'Moved Permanently'
+ 302 -> 16#32; %% 'Moved temporarily'
+ 303 -> 16#33; %% 'See Other'
+ 304 -> 16#34; %% 'Not modified'
+ 305 -> 16#35; %% 'Use Proxy'
+ 306 -> 16#36; %% '(reserved)'
+ 307 -> 16#37; %% 'Temporary Redirect'
+ 400 -> 16#40; %% 'Bad Request - server could not understand request'
+ 401 -> 16#41; %% 'Unauthorized'
+ 402 -> 16#42; %% 'Payment required'
+ 403 -> 16#43; %% 'Forbidden operation is understood but refused'
+ 404 -> 16#44; %% 'Not Found'
+ 405 -> 16#45; %% 'Method not allowed'
+ 406 -> 16#46; %% 'Not Acceptable'
+ 407 -> 16#47; %% 'Proxy Authentication required'
+ 408 -> 16#48; %% 'Request Timeout'
+ 409 -> 16#49; %% 'Conflict'
+ 410 -> 16#4A; %% 'Gone'
+ 411 -> 16#4B; %% 'Length Required'
+ 412 -> 16#4C; %% 'Precondition failed'
+ 413 -> 16#4D; %% 'Request entity too large'
+ 414 -> 16#4E; %% 'Request-URI too large'
+ 415 -> 16#4F; %% 'Unsupported media type'
+ 416 -> 16#50; %% 'Requested Range Not Satisfiable'
+ 417 -> 16#51; %% 'Expectation Failed'
+ 500 -> 16#60; %% 'Internal Server Error'
+ 501 -> 16#61; %% 'Not Implemented'
+ 502 -> 16#62; %% 'Bad Gateway'
+ 503 -> 16#63; %% 'Service Unavailable'
+ 504 -> 16#64; %% 'Gateway Timeout'
+ 505 -> 16#65 %% 'HTTP version not supported'
+ end.
+
+
+decode_status_code(StatusCode) ->
+ case StatusCode of
+ 16#10 -> 100; %% 'Continue'
+ 16#11 -> 101; %% 'Switching Protocols'
+ 16#20 -> 200; %% 'OK, Success'
+ 16#21 -> 201; %% 'Created'
+ 16#22 -> 202; %% 'Accepted'
+ 16#23 -> 203; %% 'Non-Authoritative Information'
+ 16#24 -> 204; %% 'No Content'
+ 16#25 -> 205; %% 'Reset Content'
+ 16#26 -> 206; %% 'Partial Content'
+ 16#30 -> 300; %% 'Multiple Choices'
+ 16#31 -> 301; %% 'Moved Permanently'
+ 16#32 -> 302; %% 'Moved temporarily'
+ 16#33 -> 303; %% 'See Other'
+ 16#34 -> 304; %% 'Not modified'
+ 16#35 -> 305; %% 'Use Proxy'
+ 16#36 -> 306; %% '(reserved)'
+ 16#37 -> 307; %% 'Temporary Redirect'
+ 16#40 -> 400; %% 'Bad Request - server could not understand request'
+ 16#41 -> 401; %% 'Unauthorized'
+ 16#42 -> 402; %% 'Payment required'
+ 16#43 -> 403; %% 'Forbidden operation is understood but refused'
+ 16#44 -> 404; %% 'Not Found'
+ 16#45 -> 405; %% 'Method not allowed'
+ 16#46 -> 406; %% 'Not Acceptable'
+ 16#47 -> 407; %% 'Proxy Authentication required'
+ 16#48 -> 408; %% 'Request Timeout'
+ 16#49 -> 409; %% 'Conflict'
+ 16#4A -> 410; %% 'Gone'
+ 16#4B -> 411; %% 'Length Required'
+ 16#4C -> 412; %% 'Precondition failed'
+ 16#4D -> 413; %% 'Request entity too large'
+ 16#4E -> 414; %% 'Request-URI too large'
+ 16#4F -> 415; %% 'Unsupported media type'
+ 16#50 -> 416; %% 'Requested Range Not Satisfiable'
+ 16#51 -> 417; %% 'Expectation Failed'
+ 16#60 -> 500; %% 'Internal Server Error'
+ 16#61 -> 501; %% 'Not Implemented'
+ 16#62 -> 502; %% 'Bad Gateway'
+ 16#63 -> 503; %% 'Service Unavailable'
+ 16#64 -> 504; %% 'Gateway Timeout'
+ 16#65 -> 505 %% 'HTTP version not supported'
+ end.
+
+
+%%
+%% Content Type Assignments
+%%
+%% Assingment are found at http://www.wapforum.org/wina/wsp-content-type.htm
+%%
+%%
+%% string(Version, ContentType) -> Code
+%%
+encode_well_known_media(ContentType, Version) ->
+ case ContentType of
+ %% WSP_REGISTERED_CONTENT_TYPES
+ "application/vnd.uplanet.cacheop-wbxml" ->
+ encode_integer(16#0201);
+ "application/vnd.uplanet.signal" ->
+ encode_integer(16#0202);
+ "application/vnd.uplanet.alert-wbxml" ->
+ encode_integer(16#0203);
+ "application/vnd.uplanet.list-wbxml" ->
+ encode_integer(16#0204);
+ "application/vnd.uplanet.listcmd-wbxml" ->
+ encode_integer(16#0205);
+ "application/vnd.uplanet.channel-wbxml" ->
+ encode_integer(16#0206);
+ "application/vnd.uplanet.provisioning-status-uri" ->
+ encode_integer(16#0207);
+ "x-wap.multipart/vnd.uplanet.header-set" ->
+ encode_integer(16#0208);
+ "application/vnd.uplanet.bearer-choice-wbxml" ->
+ encode_integer(16#0209);
+ "application/vnd.phonecom.mmc-wbxml" ->
+ encode_integer(16#020A);
+ "application/vnd.nokia.syncset+wbxml" ->
+ encode_integer(16#020B);
+ "image/x-up-wpng" ->
+ encode_integer(16#020C);
+ _ ->
+ encode_constrained_media(ContentType, Version)
+ end.
+
+
+encode_constrained_media(ContentType, Version) ->
+ case ContentType of
+ "*/*" -> ?ENCODE_SHORT(16#00);
+ "text/*" -> ?ENCODE_SHORT(16#01);
+ "text/html" -> ?ENCODE_SHORT(16#02);
+ "text/plain" -> ?ENCODE_SHORT(16#03);
+ "text/x-hdml" -> ?ENCODE_SHORT(16#04);
+ "text/x-ttml" -> ?ENCODE_SHORT(16#05);
+ "text/x-vcalendar" -> ?ENCODE_SHORT(16#06);
+ "text/x-vcard" -> ?ENCODE_SHORT(16#07);
+ "text/vnd.wap.wml" -> ?ENCODE_SHORT(16#08);
+ "text/vnd.wap.wmlscript" -> ?ENCODE_SHORT(16#09);
+ "text/vnd.wap.wta-event" -> ?ENCODE_SHORT(16#0A);
+ "multipart/*" -> ?ENCODE_SHORT(16#0B);
+ "multipart/mixed" -> ?ENCODE_SHORT(16#0C);
+ "multipart/form-data" -> ?ENCODE_SHORT(16#0D);
+ "multipart/byterantes" -> ?ENCODE_SHORT(16#0E);
+ "multipart/alternative" -> ?ENCODE_SHORT(16#0F);
+ "application/*" -> ?ENCODE_SHORT(16#10);
+ "application/java-vm" -> ?ENCODE_SHORT(16#11);
+ "application/x-www-form-urlencoded" -> ?ENCODE_SHORT(16#12);
+ "application/x-hdmlc" -> ?ENCODE_SHORT(16#13);
+ "application/vnd.wap.wmlc" -> ?ENCODE_SHORT(16#14);
+ "application/vnd.wap.wmlscriptc" -> ?ENCODE_SHORT(16#15);
+ "application/vnd.wap.wta-eventc" -> ?ENCODE_SHORT(16#16);
+ "application/vnd.wap.uaprof" -> ?ENCODE_SHORT(16#17);
+ "application/vnd.wap.wtls-ca-certificate" -> ?ENCODE_SHORT(16#18);
+ "application/vnd.wap.wtls-user-certificate" -> ?ENCODE_SHORT(16#19);
+ "application/x-x509-ca-cert" -> ?ENCODE_SHORT(16#1A);
+ "application/x-x509-user-cert" -> ?ENCODE_SHORT(16#1B);
+ "image/*" -> ?ENCODE_SHORT(16#1C);
+ "image/gif" -> ?ENCODE_SHORT(16#1D);
+ "image/jpeg" -> ?ENCODE_SHORT(16#1E);
+ "image/tiff" -> ?ENCODE_SHORT(16#1F);
+ "image/png" -> ?ENCODE_SHORT(16#20);
+ "image/vnd.wap.wbmp" -> ?ENCODE_SHORT(16#21);
+ "application/vnd.wap.multipart.*" -> ?ENCODE_SHORT(16#22);
+ "application/vnd.wap.multipart.mixed" -> ?ENCODE_SHORT(16#23);
+ "application/vnd.wap.multipart.form-data" -> ?ENCODE_SHORT(16#24);
+ "application/vnd.wap.multipart.byteranges" -> ?ENCODE_SHORT(16#25);
+ "application/vnd.wap.multipart.alternative" -> ?ENCODE_SHORT(16#26);
+ "application/xml" -> ?ENCODE_SHORT(16#27);
+ "text/xml" -> ?ENCODE_SHORT(16#28);
+ "application/vnd.wap.wbxml" -> ?ENCODE_SHORT(16#29);
+ "application/x-x968-cross-cert" -> ?ENCODE_SHORT(16#2A);
+ "application/x-x968-ca-cert" -> ?ENCODE_SHORT(16#2B);
+ "application/x-x968-user-cert" -> ?ENCODE_SHORT(16#2C);
+
+ %% WAP Version 1.2
+ "text/vnd.wap.si" when Version >= ?WSP_12 ->
+ ?ENCODE_SHORT(16#2D);
+ "application/vnd.wap.sic" when Version >= ?WSP_12 ->
+ ?ENCODE_SHORT(16#2E);
+ "text/vnd.wap.sl" when Version >= ?WSP_12 ->
+ ?ENCODE_SHORT(16#2F);
+ "application/vnd.wap.slc" when Version >= ?WSP_12 ->
+ ?ENCODE_SHORT(16#30);
+ "text/vnd.wap.co" when Version >= ?WSP_12 ->
+ ?ENCODE_SHORT(16#31);
+ "application/vnd.wap.coc" when Version >= ?WSP_12 ->
+ ?ENCODE_SHORT(16#32);
+ "application/vnd.wap.multipart.related" when Version >= ?WSP_12 ->
+ ?ENCODE_SHORT(16#33);
+ "application/vnd.wap.sia" when Version >= ?WSP_12 ->
+ ?ENCODE_SHORT(16#34);
+ %% WAP Version 1.3
+ "text/vnd.wap.connectivity-xml" when Version >= ?WSP_13 ->
+ ?ENCODE_SHORT(16#35);
+ "application/vnd.wap.connectivity-wbxml" when Version >= ?WSP_13 ->
+ ?ENCODE_SHORT(16#36);
+ %% WAP Version 1.4
+ "application/pkcs7-mime" when Version >= ?WSP_14 ->
+ ?ENCODE_SHORT(16#37);
+ "application/vnd.wap.hashed-certificate" when Version >= ?WSP_14 ->
+ ?ENCODE_SHORT(16#38);
+ "application/vnd.wap.signed-certificate" when Version >= ?WSP_14 ->
+ ?ENCODE_SHORT(16#39);
+ "application/vnd.wap.cert-response" when Version >= ?WSP_14 ->
+ ?ENCODE_SHORT(16#3A);
+ "application/xhtml+xml" when Version >= ?WSP_14 ->
+ ?ENCODE_SHORT(16#3B);
+ "application/wml+xml" when Version >= ?WSP_14 ->
+ ?ENCODE_SHORT(16#3C);
+ "text/css" when Version >= ?WSP_14 ->
+ ?ENCODE_SHORT(16#3D);
+ "application/vnd.wap.mms-message" when Version >= ?WSP_14 ->
+ ?ENCODE_SHORT(16#3E);
+ "application/vnd.wap.rollover-certificate" when Version >= ?WSP_14 ->
+ ?ENCODE_SHORT(16#3F);
+ %% WAP Version 1.5
+ "application/vnd.wap.locc+wbxml" when Version >= ?WSP_15 ->
+ ?ENCODE_SHORT(16#40);
+ "application/vnd.wap.loc+xml" when Version >= ?WSP_15 ->
+ ?ENCODE_SHORT(16#41);
+ "application/vnd.syncml.dm+wbxml" when Version >= ?WSP_15 ->
+ ?ENCODE_SHORT(16#42);
+ "application/vnd.syncml.dm+xml" when Version >= ?WSP_15 ->
+ ?ENCODE_SHORT(16#43);
+ "application/vnd.syncml.notification" when Version >= ?WSP_15 ->
+ ?ENCODE_SHORT(16#44);
+ "application/vnd.wap.xhtml+xml" when Version >= ?WSP_15 ->
+ ?ENCODE_SHORT(16#45);
+ "application/vnd.wv.csp.cir" when Version >= ?WSP_15 ->
+ ?ENCODE_SHORT(16#46);
+ "application/vnd.oma.dd+xml" when Version >= ?WSP_15 ->
+ ?ENCODE_SHORT(16#47);
+ "application/vnd.oma.drm.message" when Version >= ?WSP_15 ->
+ ?ENCODE_SHORT(16#48);
+ "application/vnd.oma.drm.content" when Version >= ?WSP_15 ->
+ ?ENCODE_SHORT(16#49);
+ "application/vnd.oma.drm.rights+xml" when Version >= ?WSP_15 ->
+ ?ENCODE_SHORT(16#4A);
+ "application/vnd.oma.drm.rights+wbxml" when Version >= ?WSP_15 ->
+ ?ENCODE_SHORT(16#4B);
+ _ ->
+ encode_text_string(ContentType)
+ end.
+
+
+decode_well_known_media(Code, Version) when integer(Code) ->
+ case Code of
+ %% WSP_REGISTERED_CONTENT_TYPES
+ 16#0201 -> "application/vnd.uplanet.cacheop-wbxml";
+ 16#0202 -> "application/vnd.uplanet.signal";
+ 16#0203 -> "application/vnd.uplanet.alert-wbxml";
+ 16#0204 -> "application/vnd.uplanet.list-wbxml";
+ 16#0205 -> "application/vnd.uplanet.listcmd-wbxml";
+ 16#0206 -> "application/vnd.uplanet.channel-wbxml";
+ 16#0207 -> "application/vnd.uplanet.provisioning-status-uri";
+ 16#0208 -> "x-wap.multipart/vnd.uplanet.header-set";
+ 16#0209 -> "application/vnd.uplanet.bearer-choice-wbxml";
+ 16#020A -> "application/vnd.phonecom.mmc-wbxml";
+ 16#020B -> "application/vnd.nokia.syncset+wbxml";
+ 16#020C -> "image/x-up-wpng";
+ _ -> decode_constrained_media(Code, Version)
+ end;
+decode_well_known_media(Media, _Version) when list(Media) ->
+ Media;
+decode_well_known_media({short,_Data}, Version) ->
+ decode_well_known_media(d_long(data), Version). %% BUG HERE: Data
+
+
+decode_constrained_media(Code, _Version) when integer(Code) ->
+ case Code of
+ 16#00 -> "*/*";
+ 16#01 -> "text/*";
+ 16#02 -> "text/html";
+ 16#03 -> "text/plain";
+ 16#04 -> "text/x-hdml";
+ 16#05 -> "text/x-ttml";
+ 16#06 -> "text/x-vcalendar";
+ 16#07 -> "text/x-vcard";
+ 16#08 -> "text/vnd.wap.wml";
+ 16#09 -> "text/vnd.wap.wmlscript";
+ 16#0A -> "text/vnd.wap.wta-event";
+ 16#0B -> "multipart/*";
+ 16#0C -> "multipart/mixed";
+ 16#0D -> "multipart/form-data";
+ 16#0E -> "multipart/byterantes";
+ 16#0F -> "multipart/alternative";
+ 16#10 -> "application/*";
+ 16#11 -> "application/java-vm";
+ 16#12 -> "application/x-www-form-urlencoded";
+ 16#13 -> "application/x-hdmlc";
+ 16#14 -> "application/vnd.wap.wmlc";
+ 16#15 -> "application/vnd.wap.wmlscriptc";
+ 16#16 -> "application/vnd.wap.wta-eventc";
+ 16#17 -> "application/vnd.wap.uaprof";
+ 16#18 -> "application/vnd.wap.wtls-ca-certificate";
+ 16#19 -> "application/vnd.wap.wtls-user-certificate";
+ 16#1A -> "application/x-x509-ca-cert";
+ 16#1B -> "application/x-x509-user-cert";
+ 16#1C -> "image/*";
+ 16#1D -> "image/gif";
+ 16#1E -> "image/jpeg";
+ 16#1F -> "image/tiff";
+ 16#20 -> "image/png";
+ 16#21 -> "image/vnd.wap.wbmp";
+ 16#22 -> "application/vnd.wap.multipart.*";
+ 16#23 -> "application/vnd.wap.multipart.mixed";
+ 16#24 -> "application/vnd.wap.multipart.form-data";
+ 16#25 -> "application/vnd.wap.multipart.byteranges";
+ 16#26 -> "application/vnd.wap.multipart.alternative";
+ 16#27 -> "application/xml";
+ 16#28 -> "text/xml";
+ 16#29 -> "application/vnd.wap.wbxml";
+ 16#2A -> "application/x-x968-cross-cert";
+ 16#2B -> "application/x-x968-ca-cert";
+ 16#2C -> "application/x-x968-user-cert";
+ %% WAP Version 1.2
+ 16#2D -> "text/vnd.wap.si";
+ 16#2E -> "application/vnd.wap.sic";
+ 16#2F -> "text/vnd.wap.sl";
+ 16#30 -> "application/vnd.wap.slc";
+ 16#31 -> "text/vnd.wap.co";
+ 16#32 -> "application/vnd.wap.coc";
+ 16#33 -> "application/vnd.wap.multipart.related";
+ 16#34 -> "application/vnd.wap.sia";
+ %% WAP Version 1.3
+ 16#35 -> "text/vnd.wap.connectivity-xml";
+ 16#36 -> "application/vnd.wap.connectivity-wbxml";
+ %% WAP Version 1.4
+ 16#37 -> "application/pkcs7-mime";
+ 16#38 -> "application/vnd.wap.hashed-certificate";
+ 16#39 -> "application/vnd.wap.signed-certificate";
+ 16#3A -> "application/vnd.wap.cert-response";
+ 16#3B -> "application/xhtml+xml";
+ 16#3C -> "application/wml+xml";
+ 16#3D -> "text/css";
+ 16#3E -> "application/vnd.wap.mms-message";
+ 16#3F -> "application/vnd.wap.rollover-certificate";
+ %% WAP Version 1.5
+ 16#40 -> "application/vnd.wap.locc+wbxml";
+ 16#41 -> "application/vnd.wap.loc+xml";
+ 16#42 -> "application/vnd.syncml.dm+wbxml";
+ 16#43 -> "application/vnd.syncml.dm+xml";
+ 16#44 -> "application/vnd.syncml.notification";
+ 16#45 -> "application/vnd.wap.xhtml+xml";
+ 16#46 -> "application/vnd.wv.csp.cir";
+ 16#47 -> "application/vnd.oma.dd+xml";
+ 16#48 -> "application/vnd.oma.drm.message";
+ 16#49 -> "application/vnd.oma.drm.content";
+ 16#4A -> "application/vnd.oma.drm.rights+xml";
+ 16#4B -> "application/vnd.oma.drm.rights+wbxml"
+ end;
+decode_constrained_media(Media, _Version) when list(Media) ->
+ Media.
+
+
+%% Parse <integer> or <integer>.<integer>
+
+parse_version(Value) ->
+ case string:tokens(Value, ".") of
+ [Major,Minor] ->
+ {list_to_integer(Major), list_to_integer(Minor)};
+ [Major] ->
+ case catch list_to_integer(Major) of
+ {'EXIT', _} ->
+ Value;
+ V -> V
+ end
+ end.
+
+format_version({Major,Minor}) ->
+ [integer_to_list(Major),".",integer_to_list(Minor)];
+format_version(Major) when integer(Major) ->
+ integer_to_list(Major);
+format_version(Version) when list(Version) ->
+ Version.
+
+encode_version({Major,Minor}) ->
+ Ver = (((Major-1) band 16#7) bsl 4) bor (Minor band 16#f),
+ ?ENCODE_SHORT(Ver);
+encode_version(Major) when integer(Major) ->
+ Ver = ((Major band 16#7) bsl 4) bor 16#f,
+ ?ENCODE_SHORT(Ver);
+encode_version(Value) when list(Value) ->
+ encode_text_string(Value).
+
+
+decode_version(Value) when integer(Value) ->
+ Major = (Value bsr 4) band 16#7,
+ Minor = Value band 16#f,
+ if Minor == 16#f ->
+ Major;
+ true ->
+ {Major+1,Minor}
+ end;
+decode_version(Value) when list(Value) ->
+ Value.
+
+
+encode_mms_version({Major,Minor}) ->
+ Ver = ((Major band 16#7) bsl 4) bor (Minor band 16#f),
+ ?ENCODE_SHORT(Ver);
+encode_mms_version(Major) when integer(Major) ->
+ Ver = ((Major band 16#7) bsl 4) bor 16#f,
+ ?ENCODE_SHORT(Ver);
+encode_mms_version(Value) when list(Value) ->
+ encode_text_string(Value).
+
+
+decode_mms_version(Value) when integer(Value) ->
+ Major = (Value bsr 4) band 16#7,
+ Minor = Value band 16#f,
+ if Minor == 16#f ->
+ Major;
+ true ->
+ {Major,Minor}
+ end;
+decode_mms_version(Value) when list(Value) ->
+ Value.
+
+
+%%%
+%%% Basic data types
+%%%
+
+e_delta_seconds(Value) ->
+ encode_integer(Value).
+
+
+encode_integer(I) when integer(I), I >= 0 , I < 127 ->
+ ?ENCODE_SHORT(I);
+encode_integer(I) when integer(I) ->
+ encode_long_integer(I);
+encode_integer(List) when list(List) ->
+ encode_integer(list_to_integer(List)).
+
+decode_integer(Value) when integer(Value) ->
+ Value;
+decode_integer({short,Data}) ->
+ Sz = size(Data)*8,
+ <<Value:Sz>> = Data,
+ Value.
+
+encode_short_integer(I) ->
+ ?ENCODE_SHORT(I).
+
+encode_long_integer(I) when I >= 0 ->
+ MOInt = encode_multioctet_integer(I, []),
+ MOIntLen = length(MOInt),
+ list_to_binary([MOIntLen band 16#1f | MOInt]).
+
+encode_multioctet_integer(I,Acc) when I < 256 ->
+ [I | Acc];
+encode_multioctet_integer(I,Acc) ->
+ encode_multioctet_integer(I bsr 8, [(I band 16#ff) | Acc]).
+
+
+%% Integer-Value: Short-Integer | Long-Integer
+%% Short-Integer: <<1:Short:7>>
+%% Long-Integer: <<0-30, X:0-30>>
+%% return {Integer,Tail}
+d_integer_value(<<1:1,Integer:7,Tail/binary>>) ->
+ {Integer, Tail};
+d_integer_value(<<0:3,Len:5,Data/binary>>) when Len =/= 31 ->
+ Sz = Len*8,
+ <<Integer:Sz, Tail/binary>> = Data,
+ {Integer, Tail}.
+
+decode_short_integer(<<1:1,Septet:7,T100/binary>>) ->
+ {Septet, T100}.
+
+decode_long_integer(<<0:3,Len:5,Data/binary>>) when Len =/= 31 ->
+ Sz = Len*8,
+ <<Val:Sz, Tail/binary>> = Data,
+ {Val, Tail}.
+
+d_long(Data) ->
+ Sz = size(Data)*8,
+ <<Value:Sz>> = Data,
+ Value.
+
+
+encode_uri_value(Data) ->
+ encode_text_string(Data).
+
+decode_uri_value(Data) when list(Data) ->
+ Data.
+
+%% parse quoted string
+decode_quoted_string([$" | List]) ->
+ List.
+
+encode_quoted_string([$" | Value]) ->
+ case lists:reverse(Value) of
+ [$" | Value1] ->
+ <<$", (list_to_binary(lists:reverse(Value1)))/binary, 0>>;
+ _ ->
+ <<$", (list_to_binary(Value))/binary, 0>>
+ end;
+encode_quoted_string(Value) ->
+ <<$", (list_to_binary(Value))/binary, 0>>.
+
+
+
+decode_text_string(List) when list(List) ->
+ List;
+decode_text_string(Bin) when binary(Bin) ->
+ binary_to_list(Bin).
+
+
+
+encode_text_string(A) when atom(A) ->
+ encode_text_string(atom_to_list(A));
+encode_text_string([H|T]) when H >= 128 ->
+ <<(list_to_binary([127,H|T]))/binary,0>>;
+encode_text_string(S) ->
+ <<(list_to_binary(S))/binary,0>>.
+
+
+encode_text_value(undefined) ->
+ <<0>>;
+encode_text_value([$"|T]) ->
+ %% remove ending quote ?
+ <<34,(list_to_binary(T))/binary>>;
+encode_text_value(L) ->
+ encode_text_string(L).
+
+
+d_text_value(<<0,T100/binary>>) ->
+ { "", T100};
+d_text_value(<<34,_Tail/binary>>=Data) ->
+ d_text_string(Data);
+d_text_value(Data) ->
+ d_text_string(Data).
+
+
+d_text_string(<<127,Data/binary>>) -> %% Remove quote
+ d_text_string(Data,[]);
+d_text_string(Data) ->
+ d_text_string(Data,[]).
+
+d_text_string(<<0,Tail/binary>>,A) ->
+ {lists:reverse(A), Tail};
+d_text_string(<<C,Tail/binary>>,A) ->
+ d_text_string(Tail,[C|A]);
+d_text_string(<<>>, A) ->
+ {lists:reverse(A), <<>>}.
+
+
+d_q_value(<<0:1,Q:7,Tail/binary>>) ->
+ QVal =
+ if Q >= 1, Q =< 100 ->
+ lists:flatten(io_lib:format("0.~2..0w", [Q-1]));
+ Q >= 101, Q =< 1099 ->
+ lists:flatten(io_lib:format("0.~3..0w", [Q-100]));
+ true ->
+ io:format("Q-value to big ~w\n", [Q]),
+ "***"
+ end,
+ {QVal, Tail};
+d_q_value(<<1:1,Q1:7,0:1,Q0:7,Tail/binary>>) ->
+ Q = (Q1 bsl 7) bor Q0,
+ QVal =
+ if Q >= 1, Q =< 100 ->
+ lists:flatten(io_lib:format("0.~2..0w", [Q-1]));
+ Q >= 101, Q =< 1099 ->
+ lists:flatten(io_lib:format("0.~3..0w", [Q-100]));
+ true ->
+ io:format("Q-value to big ~w\n", [Q]),
+ "***"
+ end,
+ {QVal, Tail}.
+
+
+%%
+%% Decode uintvar
+%%
+d_uintvar(<<0:1,S0:7,T100/binary>>) ->
+ {S0, T100};
+d_uintvar(<<1:1,S1:7,0:1,S0:7,T100/binary>>) ->
+ {(S1 bsl 7) bor S0, T100};
+d_uintvar(<<1:1,S2:7,1:1,S1:7,0:1,S0:7,T100/binary>>) ->
+ {(S2 bsl 14) bor (S1 bsl 7) bor S0, T100};
+d_uintvar(<<1:1,S3:7,1:1,S2:7,1:1,S1:7,0:1,S0:7,T100/binary>>) ->
+ {(S3 bsl 21) bor (S2 bsl 14) bor (S1 bsl 7) bor S0, T100};
+d_uintvar(<<1:1,S4:7,1:1,S3:7,1:1,S2:7,1:1,S1:7,0:1,S0:7,T100/binary>>) ->
+ {(S4 bsl 28) bor (S3 bsl 21) bor (S2 bsl 14) bor (S1 bsl 7) bor S0, T100}.
+
+
+e_uintvar(I) when I < 128 -> <<I>>;
+e_uintvar(I) -> e_uintvar(I,[]).
+
+e_uintvar(0,Acc) ->
+ list_to_binary(Acc);
+e_uintvar(I,[]) ->
+ e_uintvar(I bsr 7, [I band 16#7f]);
+e_uintvar(I,Acc) ->
+ e_uintvar(I bsr 7, [16#80 bor (I band 16#7f) | Acc]).
+
+
+e_value(B) ->
+ Sz = size(B),
+ if Sz =< 30 ->
+ <<Sz:8, B/binary>>;
+ true ->
+ <<31:8, (e_uintvar(Sz))/binary, B/binary >>
+ end.
+
+e_value(B1,B2) ->
+ Sz = size(B1)+size(B2),
+ if Sz =< 30 ->
+ <<Sz:8, B1/binary, B2/binary>>;
+ true ->
+ <<31:8, (e_uintvar(Sz))/binary, B1/binary, B2/binary >>
+ end.
+
+e_value(B1,B2,B3) ->
+ Sz = size(B1)+size(B2)+size(B3),
+ if Sz =< 30 ->
+ <<Sz:8, B1/binary,B2/binary,B3/binary>>;
+ true ->
+ <<31:8,(e_uintvar(Sz))/binary,B1/binary,B2/binary,B3/binary>>
+ end.
+
+e_value(B1,B2,B3,B4) ->
+ Sz = size(B1)+size(B2)+size(B3)+size(B4),
+ if Sz =< 30 ->
+ <<Sz:8, B1/binary,B2/binary,B3/binary,B4/binary>>;
+ true ->
+ <<31:8,(e_uintvar(Sz))/binary,B1/binary,
+ B2/binary,B3/binary,B4/binary>>
+ end.
+
+%%
+%% Extened methods
+%%
+decode_extended_methods(<<PduType:8, Data/binary>>) ->
+ Type = decode_pdu_type(PduType),
+ {Method, Data1} = d_text_string(Data),
+ [{Type,Method} | decode_extended_methods(Data1)];
+decode_extended_methods(<<>>) ->
+ [].
+
+encode_extended_methods(Ms) ->
+ list_to_binary(encode_ext_methods(Ms)).
+
+encode_ext_methods([{Type,Method} | T]) ->
+ [ encode_pdu_type(Type), encode_text_string(Method) |
+ encode_ext_methods(T)];
+encode_ext_methods([]) ->
+ [].
+
+%%
+%% Address lists used by redirect-pdu and aliases-capability
+%%
+decode_address(D0) ->
+ [A] = decode_addresses(D0),
+ A.
+
+decode_addresses(D0) ->
+ case D0 of
+ <<1:1, 1:1,Len:6,B:8,P:16,Addr:Len/binary,D1/binary>> ->
+ [#wdp_address { bearer = B, address = Addr, portnum=P } |
+ decode_addresses(D1)];
+ <<1:1, 0:1,Len:6,B:8,Addr:Len/binary,D1/binary>> ->
+ [#wdp_address { bearer = B, address = Addr } |
+ decode_addresses(D1)];
+ <<0:1, 1:1,Len:6,P:16,Addr:Len/binary,D1/binary>> ->
+ [#wdp_address { portnum=P, address=Addr } |
+ decode_addresses(D1)];
+ <<0:1, 0:1,Len:6,Addr:Len/binary,D1/binary>> ->
+ [#wdp_address { address=Addr } |
+ decode_addresses(D1)];
+ <<>> ->
+ []
+ end.
+
+encode_addresses(As) ->
+ encode_addresses(As, []).
+
+encode_addresses([A|As], Acc) ->
+ encode_addresses(As, [encode_address(A)|Acc]);
+encode_addresses([], Acc) ->
+ list_to_binary(lists:reverse(Acc)).
+
+encode_address(#wdp_address { bearer = B, address = Addr, portnum = P }) ->
+ BAddr = if tuple(Addr) ->
+ list_to_binary(inet:ip_to_bytes(Addr));
+ binary(Addr) ->
+ Addr
+ end,
+ Len = size(BAddr),
+ if B == undefined, P == undefined ->
+ <<0:1, 0:1, Len:6, BAddr/binary>>;
+ B == undefined ->
+ <<0:1, 1:1, Len:6, P:16, BAddr/binary>>;
+ P == undefined ->
+ <<1:1, 0:1, Len:6, B:8, BAddr/binary>>;
+ true ->
+ <<1:1, 1:1, Len:6, B:8, P:16, BAddr/binary>>
+ end.
+
+
+
+
+-define(UNIX_TIME_OFFSET, 62167219200).
+
+d_date(Val) when integer(Val) ->
+ calendar:gregorian_seconds_to_datetime(Val+?UNIX_TIME_OFFSET);
+d_date({short,Data}) ->
+ Sz = size(Data)*8,
+ <<Sec:Sz>> = Data,
+ calendar:gregorian_seconds_to_datetime(Sec+?UNIX_TIME_OFFSET).
+
+e_date(DateTime) ->
+ Sec = calendar:datetime_to_gregorian_seconds(DateTime),
+ encode_long_integer(Sec - ?UNIX_TIME_OFFSET).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% decode http-date (RFC 2068). (MUST be send in RFC1123 date format)
+%% HTTP-date = rfc1123-date | rfc850-date | asctime-date
+%% rfc1123-date = wkday "," SP date1 SP time SP "GMT"
+%% rfc850-date = weekday "," SP date2 SP time SP "GMT"
+%% asctime-date = wkday SP date3 SP time SP 4DIGIT
+%%
+%% date1 = 2DIGIT SP month SP 4DIGIT
+%% ; day month year (e.g., 02 Jun 1982)
+%% date2 = 2DIGIT "-" month "-" 2DIGIT
+%% ; day-month-year (e.g., 02-Jun-82)
+%% date3 = month SP ( 2DIGIT | ( SP 1DIGIT ))
+%% ; month day (e.g., Jun 2)
+%%
+%% time = 2DIGIT ":" 2DIGIT ":" 2DIGIT
+%% ; 00:00:00 - 23:59:59
+%%
+%% wkday = "Mon" | "Tue" | "Wed"
+%% | "Thu" | "Fri" | "Sat" | "Sun"
+%%
+%%
+%% weekday = "Monday" | "Tuesday" | "Wednesday"
+%% | "Thursday" | "Friday" | "Saturday" | "Sunday"
+%%
+%% month = "Jan" | "Feb" | "Mar" | "Apr"
+%% | "May" | "Jun" | "Jul" | "Aug"
+%% | "Sep" | "Oct" | "Nov" | "Dec"
+%%
+%% decode date or crash!
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+parse_http_date(Date) ->
+ parse_hdate(tolower(Date)).
+
+parse_hdate([$m,$o,$n,$d,$a,$y,$ | Cs]) -> date2(Cs);
+parse_hdate([$t,$u,$e,$s,$d,$a,$y,$ | Cs]) -> date2(Cs);
+parse_hdate([$w,$e,$d,$n,$s,$d,$a,$y,$ | Cs]) -> date2(Cs);
+parse_hdate([$t,$h,$u,$r,$s,$d,$a,$y,$ | Cs]) -> date2(Cs);
+parse_hdate([$f,$r,$i,$d,$a,$y,$ | Cs]) -> date2(Cs);
+parse_hdate([$s,$a,$t,$u,$r,$d,$a,$y,$ | Cs]) -> date2(Cs);
+parse_hdate([$s,$u,$n,$d,$a,$y,$ | Cs]) -> date2(Cs);
+parse_hdate([$m,$o,$n,X | Cs]) -> date13(X,Cs);
+parse_hdate([$t,$u,$e,X | Cs]) -> date13(X,Cs);
+parse_hdate([$w,$e,$d,X | Cs]) -> date13(X,Cs);
+parse_hdate([$t,$h,$u,X | Cs]) -> date13(X,Cs);
+parse_hdate([$f,$r,$i,X | Cs]) -> date13(X,Cs);
+parse_hdate([$s,$a,$t,X | Cs]) -> date13(X,Cs);
+parse_hdate([$s,$u,$n,X | Cs]) -> date13(X,Cs).
+
+date13($ , Cs) -> date3(Cs);
+date13($,, [$ |Cs]) -> date1(Cs).
+
+%% date1
+date1([D1,D2,$ ,M1,M2,M3,$ ,Y1,Y2,Y3,Y4,$ | Cs]) ->
+ M = parse_month([M1,M2,M3]),
+ D = list_to_integer([D1,D2]),
+ Y = list_to_integer([Y1,Y2,Y3,Y4]),
+ {Time,[$ ,$g,$m,$t|Cs1]} = parse_time(Cs),
+ { {{Y,M,D},Time}, Cs1}.
+
+%% date2
+date2([D1,D2,$-,M1,M2,M3,$-,Y1,Y2 | Cs]) ->
+ M = parse_month([M1,M2,M3]),
+ D = list_to_integer([D1,D2]),
+ Y = 1900 + list_to_integer([Y1,Y2]),
+ {Time, [$ ,$g,$m,$t|Cs1]} = parse_time(Cs),
+ {{{Y,M,D}, Time}, Cs1}.
+
+%% date3
+date3([M1,M2,M3,$ ,D1,D2,$ | Cs]) ->
+ M = parse_month([M1,M2,M3]),
+ D = if D1 == $ -> list_to_integer([D2]);
+ true -> list_to_integer([D1,D2])
+ end,
+ {Time,[$ ,Y1,Y2,Y3,Y4|Cs1]} = parse_time(Cs),
+ Y = list_to_integer([Y1,Y2,Y3,Y4]),
+ { {{Y,M,D}, Time}, Cs1 }.
+
+%% decode lowercase month
+parse_month("jan") -> 1;
+parse_month("feb") -> 2;
+parse_month("mar") -> 3;
+parse_month("apr") -> 4;
+parse_month("may") -> 5;
+parse_month("jun") -> 6;
+parse_month("jul") -> 7;
+parse_month("aug") -> 8;
+parse_month("sep") -> 9;
+parse_month("oct") -> 10;
+parse_month("nov") -> 11;
+parse_month("dec") -> 12.
+
+%% decode time HH:MM:SS
+parse_time([H1,H2,$:,M1,M2,$:,S1,S2|Cs]) ->
+ { {list_to_integer([H1,H2]),
+ list_to_integer([M1,M2]),
+ list_to_integer([S1,S2]) }, Cs}.
+
+%% encode date into rfc1123-date (must be a GMT time!!!)
+fmt_date({{Y,M,D},{TH,TM,TS}}) ->
+ WkDay = case calendar:day_of_the_week({Y,M,D}) of
+ 1 -> "Mon";
+ 2 -> "Tue";
+ 3 -> "Wed";
+ 4 -> "Thu";
+ 5 -> "Fri";
+ 6 -> "Sat";
+ 7 -> "Sun"
+ end,
+ lists:flatten(io_lib:format("~s, ~2..0w ~s ~4..0w "
+ "~2..0w:~2..0w:~2..0w GMT",
+ [WkDay, D, fmt_month(M), Y, TH, TM, TS])).
+
+fmt_current_date() ->
+ fmt_date(calendar:universal_time()).
+
+%% decode lowercase month
+fmt_month(1) -> "Jan";
+fmt_month(2) -> "Feb";
+fmt_month(3) -> "Mar";
+fmt_month(4) -> "Apr";
+fmt_month(5) -> "May";
+fmt_month(6) -> "Jun";
+fmt_month(7) -> "Jul";
+fmt_month(8) -> "Aug";
+fmt_month(9) -> "Sep";
+fmt_month(10) -> "Oct";
+fmt_month(11) -> "Nov";
+fmt_month(12) -> "Dec".
diff --git a/lib/dialyzer/vsn.mk b/lib/dialyzer/vsn.mk
index b2902e95ed..53b6f8c553 100644
--- a/lib/dialyzer/vsn.mk
+++ b/lib/dialyzer/vsn.mk
@@ -1 +1 @@
-DIALYZER_VSN = 2.4.0
+DIALYZER_VSN = 2.4.2
diff --git a/lib/docbuilder/doc/src/character_entities.xml b/lib/docbuilder/doc/src/character_entities.xml
index e78cf0ebec..0a4ae17fb5 100644
--- a/lib/docbuilder/doc/src/character_entities.xml
+++ b/lib/docbuilder/doc/src/character_entities.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>1997</year><year>2009</year>
+ <year>1997</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -125,7 +125,7 @@
<cell align="left" valign="middle">not sign</cell>
</row>
<row>
- <cell align="left" valign="middle">&shy;</cell>
+ <cell align="left" valign="middle"></cell> <!-- a space is used instead of &shy; due to bug in fop 1.0 -->
<cell align="left" valign="middle">&amp;shy;</cell>
<cell align="left" valign="middle">soft hyphen</cell>
</row>
diff --git a/lib/docbuilder/doc/src/docb_gen.xml b/lib/docbuilder/doc/src/docb_gen.xml
index 49eb79ae24..d4ebfd0f84 100644
--- a/lib/docbuilder/doc/src/docb_gen.xml
+++ b/lib/docbuilder/doc/src/docb_gen.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1999</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/docbuilder/doc/src/docb_transform.xml b/lib/docbuilder/doc/src/docb_transform.xml
index b8975e2698..06a04c8c02 100644
--- a/lib/docbuilder/doc/src/docb_transform.xml
+++ b/lib/docbuilder/doc/src/docb_transform.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2001</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/docbuilder/doc/src/docb_xml_check.xml b/lib/docbuilder/doc/src/docb_xml_check.xml
index 7ec456c014..eff4fc4342 100644
--- a/lib/docbuilder/doc/src/docb_xml_check.xml
+++ b/lib/docbuilder/doc/src/docb_xml_check.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2007</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/docbuilder/doc/src/docbuilder_app.xml b/lib/docbuilder/doc/src/docbuilder_app.xml
index a1df496258..58b8daf598 100644
--- a/lib/docbuilder/doc/src/docbuilder_app.xml
+++ b/lib/docbuilder/doc/src/docbuilder_app.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2007</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/docbuilder/doc/src/inline_tags.xml b/lib/docbuilder/doc/src/inline_tags.xml
index 10afbf143f..5bcca54c05 100644
--- a/lib/docbuilder/doc/src/inline_tags.xml
+++ b/lib/docbuilder/doc/src/inline_tags.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>1997</year><year>2010</year>
+ <year>1997</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -246,7 +246,10 @@
bibliography file. Example:</p>
<pre>
[...,
- {"erlbook","Concurrent Programming in ERLANG","J. Armstrong, R. Virding, C. Wikstr&ouml;m, M. Williams, Concurrent Programming in ERLANG, Prentice Hall, 1996, ISBN 0-13-508301-X","jocke"},
+ {"erlbook",
+ "Concurrent Programming in ERLANG","J. Armstrong, R. Virding, C. Wikstr&ouml;m, "
+ "M. Williams, Concurrent Programming in ERLANG, Prentice Hall, 1996, ISBN 0-13-508301-X",
+ "jocke"},
...].
</pre>
</section>
diff --git a/lib/docbuilder/test/Makefile b/lib/docbuilder/test/Makefile
index 080479ee71..53dff193dc 100644
--- a/lib/docbuilder/test/Makefile
+++ b/lib/docbuilder/test/Makefile
@@ -71,8 +71,8 @@ release_spec: opt
release_tests_spec: make_emakefile
$(INSTALL_DIR) $(RELSYSDIR)
- $(INSTALL_DATA) $(SPEC_FILES) $(EMAKEFILE) $(ERL_FILES) $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ $(INSTALL_DATA) $(SPEC_FILES) docb.cover $(EMAKEFILE) $(ERL_FILES) $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
@tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
release_docs_spec:
diff --git a/lib/docbuilder/test/docb.cover b/lib/docbuilder/test/docb.cover
new file mode 100644
index 0000000000..80bab6eba7
--- /dev/null
+++ b/lib/docbuilder/test/docb.cover
@@ -0,0 +1,2 @@
+{incl_app,docbuilder,details}
+
diff --git a/lib/docbuilder/test/docb_SUITE.erl b/lib/docbuilder/test/docb_SUITE.erl
index c871130521..d286824539 100644
--- a/lib/docbuilder/test/docb_SUITE.erl
+++ b/lib/docbuilder/test/docb_SUITE.erl
@@ -17,13 +17,32 @@
%%
-module(docb_SUITE).
--export([all/1,html/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, init_per_group/2,end_per_group/2,html/1]).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include_lib("kernel/include/file.hrl").
-all(suite) -> [html].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+[html].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
html(suite) -> [];
html(Config) when is_list(Config) ->
diff --git a/lib/edoc/doc/overview.edoc b/lib/edoc/doc/overview.edoc
index 9b25c17b1f..bd603b7a13 100644
--- a/lib/edoc/doc/overview.edoc
+++ b/lib/edoc/doc/overview.edoc
@@ -205,8 +205,12 @@ The following tags can be used anywhere within a module:
the text. See {@section Type specifications} for syntax and
examples.
All data type descriptions are placed in a separate section of
- the documentation, regardless of where the tags occur.</dd>
+ the documentation, regardless of where the tags occur.
+ Instead of specifying the complete type alias in an EDoc
+ documentation comment, type definitions from the actual
+ Erlang code can be re-used for documentation.
+ See {@section Type specifications} for examples.</dd>
</dl>
@@ -405,7 +409,12 @@ The following tags can be used before a function definition:
included in the specification, it must match the name in the
actual code. When parameter names are not given in the
specification, suitable names will be taken from the source
- code if possible, and otherwise synthesized.</dd>
+ code if possible, and otherwise synthesized.
+
+ Instead of specifying the complete function type in an EDoc
+ documentation comment, specifications from the actual
+ Erlang code can be re-used for documentation.
+ See {@section Type specifications} for examples.</dd>
<dt><a name="ftag-throws">`@throws'</a></dt>
<dd>Specifies which types of terms may be thrown by the
@@ -763,6 +772,17 @@ following escape sequences may be used: <dl>
=== Function specifications ===
+<note>Although the syntax described in the following can still be used
+for specifying functions we recommend that Erlang specifications as
+described in <seealso marker="doc/reference_manual:typespec"> Types
+and Function Specification</seealso> should be added to the source
+code instead. This way the analyses of <seealso
+marker="dialyzer:dialyzer">Dialyzer</seealso>'s can be utilized in the
+process of keeping the documentation consistent and up-to-date.
+Erlang specifications will be used unless there is also a function
+specification (a `@spec' tag followed by a type) with the same name.
+</note>
+
The following grammar describes the form of the specifications following
a `@spec' tag. A '`?'' suffix implies that the element is optional.
Function types have higher precedence than union types; e.g., "`(atom())
@@ -818,16 +838,51 @@ not as `(atom()) -> (atom() | integer())'.
<br/>| Atom
<br/>| Integer
<br/>| Float
+ <br/>| Integer ".." Integer
<br/>| FunType
+ <br/>| "fun(" FunType ")"
+ <br/>| "fun(...)"
<br/>| "{" UnionTypes? "}"
+ <br/>| "#" Atom "{" Fields? "}"
<br/>| "[" "]"
<br/>| "[" UnionType "]"
+ <br/>| "[" UnionType "," "..." "]"
<br/>| "(" UnionType ")"
+ <br/>| BinType
<br/>| TypeName "(" UnionTypes? ")"
<br/>| ModuleName ":" TypeName "(" UnionTypes? ")"
<br/>| "//" AppName "/" ModuleName ":" TypeName "(" UnionTypes? ")"</code></td>
</tr>
<tr>
+ <td><code>Fields</code></td>
+ <td>::=</td>
+ <td><code>Field
+ <br/>| Fields "," Fields</code></td>
+ </tr>
+ <tr>
+ <td><code>Field</code></td>
+ <td>::=</td>
+ <td><code>Atom "=" UnionList</code></td>
+ </tr>
+ <tr>
+ <td><code>BinType</code></td>
+ <td>::=</td>
+ <td><code>"&lt;&lt;&gt;&gt;"
+ <br/>| "&lt;&lt;" BaseType "&gt;&gt;"
+ <br/>| "&lt;&lt;" UnitType "&gt;&gt;"
+ <br/>| "&lt;&lt;" BaseType "," UnitType "&gt;&gt;"</code></td>
+ </tr>
+ <tr>
+ <td><code>BaseType</code></td>
+ <td>::=</td>
+ <td><code>"_" ":" Integer</code></td>
+ </tr>
+ <tr>
+ <td><code>UnitType</code></td>
+ <td>::=</td>
+ <td><code>"_" ":" "_" "*" Integer</code></td>
+ </tr>
+ <tr>
<td><code>TypeVariable</code></td>
<td>::=</td>
<td><code>Variable</code></td>
@@ -858,7 +913,7 @@ not as `(atom()) -> (atom() | integer())'.
<tr>
<td><code>Def</code></td>
<td>::=</td>
- <td><code>TypeVariable "=" UnionType
+ <td><code>TypeVariable "=" UnionList
<br/>| TypeName "(" TypeVariables? ")" "=" UnionType</code></td>
</tr>
<tr>
@@ -873,6 +928,9 @@ not as `(atom()) -> (atom() | integer())'.
Examples:
```
+ -spec my_function(X :: integer()) -> integer().
+ %% @doc Creates ...'''
+```
%% @spec my_function(X::integer()) -> integer()'''
```
%% @spec (X::integer()) -> integer()'''
@@ -895,6 +953,8 @@ Examples:
```
%% @spec close(graphics:window()) -> ok'''
+The first example shows the recommended way of specifying functions.
+
In the above examples, `X', `A', `B',
and `File' are parameter names, used for referring to the
parameters from the documentation text. The <em>type variables</em>
@@ -930,6 +990,13 @@ contain any annotations at all.
=== Type definitions ===
+<note>Although the syntax described in the following can still be used
+for specifying types we recommend that Erlang types as described in
+<seealso marker="doc/reference_manual:typespec"> Types and Function
+Specification</seealso> should be added to the source code instead.
+Erlang types will be used unless there is a type alias with the same
+name.</note>
+
The following grammar (see above for auxiliary definitions) describes
the form of the definitions that may follow a `@type' tag:
@@ -939,7 +1006,7 @@ the form of the definitions that may follow a `@type' tag:
<td><code>Typedef</code></td>
<td>::=</td>
<td><code>TypeName "(" TypeVariables? ")" DefList?
- <br/>| TypeName "(" TypeVariables? ")" "=" UnionType DefList?</code></td>
+ <br/>| TypeName "(" TypeVariables? ")" "=" UnionList DefList?</code></td>
</tr>
</tbody>
</table>
@@ -947,6 +1014,11 @@ the form of the definitions that may follow a `@type' tag:
(For a truly abstract data type, no equivalence is specified.) The main
definition may be followed by additional local definitions. Examples:
```
+ -type my_list(X) :: [X]. %% A special kind of lists ...'''
+```
+ -opaque another_list(X) :: [X].
+ %% another_list() is a kind of list...'''
+```
%% @type myList(X). A special kind of lists ...'''
```
%% @type filename() = string(). Atoms not allowed!'''
@@ -955,6 +1027,7 @@ definition may be followed by additional local definitions. Examples:
%% A = term().
%% A kind of wrapper type thingy.'''
+The first two examples show the recommended way of specifying types.
=== Pre-defined data types ===
@@ -962,24 +1035,42 @@ The following data types are predefined by EDoc, and may not be
redefined:
```
any()
+ arity()
atom()
binary()
- bool()
+ bitstring()
+ bool() (allowed, but use boolean() instead)
+ boolean()
+ byte()
char()
cons()
deep_string()
float()
function()
integer()
+ iodata()
+ iolist()
list()
+ maybe_improper_list()
+ mfa()
+ module()
nil()
+ neg_integer()
+ node()
+ non_neg_integer()
+ nonempty_improper_list()
+ nonempty_list()
+ nonempty_maybe_improper_list()
+ nonempty_string()
none()
number()
pid()
port()
+ pos_integer()
reference()
string()
term()
+ timeout()
tuple()
'''
Details:
@@ -991,7 +1082,7 @@ Details:
`integer()', `pid()', `port()'
and `reference()' are primitive data types of
the Erlang programming language.</li>
- <li>`bool()' is the subset of `atom()' consisting
+ <li>`boolean()' is the subset of `atom()' consisting
of the atoms `true' and `false'.</li>
<li>`char()' is a subset of
`integer()' representing character codes.</li>
diff --git a/lib/edoc/doc/src/Makefile b/lib/edoc/doc/src/Makefile
index 748691d173..5ee0096f0f 100644
--- a/lib/edoc/doc/src/Makefile
+++ b/lib/edoc/doc/src/Makefile
@@ -105,7 +105,7 @@ man: $(MAN3_FILES)
$(XML_REF3_FILES):
escript $(DOCGEN)/priv/bin/xml_from_edoc.escript -def vsn $(EDOC_VSN) -i $(ERL_TOP)/lib/edoc/include $(SRC_DIR)/$(@:%.xml=%.erl)
-$(XML_CHAPTER_FILES):
+$(XML_CHAPTER_FILES): ../overview.edoc
escript $(DOCGEN)/priv/bin/xml_from_edoc.escript -def vsn $(EDOC_VSN) -chapter ../overview.edoc
gifs: $(GIF_FILES:%=$(HTMLDIR)/%)
diff --git a/lib/edoc/doc/src/notes.xml b/lib/edoc/doc/src/notes.xml
index afcccf22b5..c18a126264 100644
--- a/lib/edoc/doc/src/notes.xml
+++ b/lib/edoc/doc/src/notes.xml
@@ -31,6 +31,61 @@
<p>This document describes the changes made to the EDoc
application.</p>
+<section><title>Edoc 0.7.7</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p> Add encoding when parsing Wiki text. EDoc used to
+ fail on strings such as "���". (Thanks to Richard
+ Carlsson.) </p>
+ <p>
+ Own Id: OTP-9109</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p> It is now possible to use Erlang specifications and
+ types in EDoc documentation. Erlang specifications and
+ types will be used unless there is also a function
+ specification (<c>@spec</c>) or a type alias
+ (<c>@type</c>) with the same name. In the current
+ implementation the placement of <c>-spec</c> matters: it
+ should be placed where the <c>@spec</c> would otherwise
+ have been placed. </p>
+ <p>Not all Erlang types are included in the
+ documentation, but only those exported by some
+ <c>export_type</c> declaration or used by some documented
+ Erlang specification (<c>-spec</c>). </p>
+ <p> There is currently no support for overloaded Erlang
+ specifications. </p>
+ <p> The syntax definitions of EDoc have been augmented to
+ cope with most of the Erlang types. (But we recommend
+ that Erlang types should be used instead.) </p>
+ <p> <c>edoc:read_source()</c> takes one new option,
+ <c>report_missing_types</c>. <c>edoc_layout:module()</c>
+ takes one new option, <c>pretty_printer</c>. </p>
+ <p>
+ Own Id: OTP-8525</p>
+ </item>
+ <item>
+ <p> The <c>edoc_lib</c> module is meant to be private,
+ but since it is referred to from other man pages it has
+ been included in the OTP documentation. The modifications
+ introduced in this ticket make all functions private
+ except those referred to from other pages. </p>
+ <p>
+ Own Id: OTP-9110</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Edoc 0.7.6.8</title>
<section><title>Improvements and New Features</title>
diff --git a/lib/edoc/doc/src/ref_man.xml b/lib/edoc/doc/src/ref_man.xml
index 619fbaa7ca..a9af8740b9 100644
--- a/lib/edoc/doc/src/ref_man.xml
+++ b/lib/edoc/doc/src/ref_man.xml
@@ -4,7 +4,7 @@
<application xmlns:xi="http://www.w3.org/2001/XInclude">
<header>
<copyright>
- <year>2006</year><year>2009</year>
+ <year>2006</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
diff --git a/lib/edoc/src/Makefile b/lib/edoc/src/Makefile
index ca95c4cdad..9c5a9d30d1 100644
--- a/lib/edoc/src/Makefile
+++ b/lib/edoc/src/Makefile
@@ -29,7 +29,8 @@ SOURCES= \
edoc.erl edoc_data.erl edoc_doclet.erl edoc_extract.erl \
edoc_layout.erl edoc_lib.erl edoc_macros.erl edoc_parser.erl \
edoc_refs.erl edoc_report.erl edoc_run.erl edoc_scanner.erl \
- edoc_tags.erl edoc_types.erl edoc_wiki.erl otpsgml_layout.erl
+ edoc_specs.erl edoc_tags.erl edoc_types.erl edoc_wiki.erl \
+ otpsgml_layout.erl
OBJECTS=$(SOURCES:%.erl=$(EBIN)/%.$(EMULATOR)) $(APP_TARGET) $(APPUP_TARGET)
diff --git a/lib/edoc/src/edoc.app.src b/lib/edoc/src/edoc.app.src
index 2177533441..0c8d5b85f8 100644
--- a/lib/edoc/src/edoc.app.src
+++ b/lib/edoc/src/edoc.app.src
@@ -15,6 +15,7 @@
edoc_report,
edoc_run,
edoc_scanner,
+ edoc_specs,
edoc_tags,
edoc_types,
edoc_wiki,
diff --git a/lib/edoc/src/edoc.erl b/lib/edoc/src/edoc.erl
index 75b3bb451a..360f2dbc9e 100644
--- a/lib/edoc/src/edoc.erl
+++ b/lib/edoc/src/edoc.erl
@@ -258,6 +258,7 @@ opt_defaults() ->
opt_negations() ->
[{no_preprocess, preprocess},
{no_subpackages, subpackages},
+ {no_report_missing_types, report_missing_types},
{no_packages, packages}].
%% @spec run(Packages::[package()],
@@ -310,13 +311,13 @@ opt_negations() ->
%% <dd>Specifies the suffix used for output files. The default value is
%% `".html"'. Note that this also affects generated references.
%% </dd>
-%% <dt>{@type {new, bool()@}}
+%% <dt>{@type {new, boolean()@}}
%% </dt>
%% <dd>If the value is `true', any existing `edoc-info' file in the
%% target directory will be ignored and overwritten. The default
%% value is `false'.
%% </dd>
-%% <dt>{@type {packages, bool()@}}
+%% <dt>{@type {packages, boolean()@}}
%% </dt>
%% <dd>If the value is `true', it it assumed that packages (module
%% namespaces) are being used, and that the source code directory
@@ -342,7 +343,7 @@ opt_negations() ->
%% <dd>Specifies the expected suffix of input files. The default
%% value is `".erl"'.
%% </dd>
-%% <dt>{@type {subpackages, bool()@}}
+%% <dt>{@type {subpackages, boolean()@}}
%% </dt>
%% <dd>If the value is `true', all subpackages of specified packages
%% will also be included in the documentation. The default value is
@@ -578,6 +579,12 @@ layout(Doc, Opts) ->
%% @spec (File) -> [comment()]
+%% @type comment() = {Line, Column, Indentation, Text}
+%% where
+%% Line = integer(),
+%% Column = integer(),
+%% Indentation = integer(),
+%% Text = [string()]
%% @equiv read_comments(File, [])
read_comments(File) ->
@@ -585,12 +592,6 @@ read_comments(File) ->
%% @spec read_comments(File::filename(), Options::proplist()) ->
%% [comment()]
-%% where
-%% comment() = {Line, Column, Indentation, Text},
-%% Line = integer(),
-%% Column = integer(),
-%% Indentation = integer(),
-%% Text = [string()]
%%
%% @doc Extracts comments from an Erlang source code file. See the
%% module {@link //syntax_tools/erl_comment_scan} for details on the
@@ -616,7 +617,7 @@ read_source(Name) ->
%%
%% Options:
%% <dl>
-%% <dt>{@type {preprocess, bool()@}}
+%% <dt>{@type {preprocess, boolean()@}}
%% </dt>
%% <dd>If the value is `true', the source file will be read via the
%% Erlang preprocessor (`epp'). The default value is `false'.
@@ -642,6 +643,13 @@ read_source(Name) ->
%% macro definitions, used if the `preprocess' option is turned on.
%% The default value is the empty list.</dd>
%% </dl>
+%% <dt>{@type {report_missing_types, boolean()@}}
+%% </dt>
+%% <dd>If the value is `true', warnings are issued for missing types.
+%% The default value is `false'.
+%% `no_report_missing_types' is an alias for
+%% `{report_missing_types, false}'.
+%% </dd>
%%
%% @see get_doc/2
%% @see //syntax_tools/erl_syntax
@@ -724,17 +732,17 @@ get_doc(File) ->
%% <a href="overview-summary.html#Macro_expansion">Inline macro expansion</a>
%% for details.
%% </dd>
-%% <dt>{@type {hidden, bool()@}}
+%% <dt>{@type {hidden, boolean()@}}
%% </dt>
%% <dd>If the value is `true', documentation of hidden functions will
%% also be included. The default value is `false'.
%% </dd>
-%% <dt>{@type {private, bool()@}}
+%% <dt>{@type {private, boolean()@}}
%% </dt>
%% <dd>If the value is `true', documentation of private functions will
%% also be included. The default value is `false'.
%% </dd>
-%% <dt>{@type {todo, bool()@}}
+%% <dt>{@type {todo, boolean()@}}
%% </dt>
%% <dd>If the value is `true', To-Do notes written using `@todo' or
%% `@TODO' tags will be included in the documentation. The default
diff --git a/lib/edoc/src/edoc.hrl b/lib/edoc/src/edoc.hrl
index 71cc1a52b9..43657b3b8f 100644
--- a/lib/edoc/src/edoc.hrl
+++ b/lib/edoc/src/edoc.hrl
@@ -37,6 +37,7 @@
-define(SOURCE_DIR, "src").
-define(EBIN_DIR, "ebin").
-define(EDOC_DIR, "doc").
+-define(REPORT_MISSING_TYPE, false).
-include("edoc_doclet.hrl").
@@ -83,10 +84,11 @@
%% Module Entries (one per function, plus module header and footer)
-%% @type entry() = #entry{name = atom(),
-%% args = [string()],
+%% @type entry() = #entry{{atom(), integer()} % function
+%% | name = atom(), % other
+%% args = [atom()],
%% line = integer(),
-%% export = bool(),
+%% export = boolean(),
%% data = term()}
-record(entry, {name, args = [], line = 0, export, data}).
@@ -95,6 +97,7 @@
%% @type tag() = #tag{name = atom(),
%% line = integer(),
+%% origin = comment | code,
%% data = term()}
--record(tag, {name, line = 0, data}).
+-record(tag, {name, line = 0, origin = comment, data}).
diff --git a/lib/edoc/src/edoc_data.erl b/lib/edoc/src/edoc_data.erl
index 124f8eb9a1..27f43dca5a 100644
--- a/lib/edoc/src/edoc_data.erl
+++ b/lib/edoc/src/edoc_data.erl
@@ -20,7 +20,7 @@
%% @copyright 2003 Richard Carlsson
%% @author Richard Carlsson <[email protected]>
%% @see edoc
-%% @end
+%% @end
%% =====================================================================
%% @doc Building the EDoc external data structure. See the file
@@ -30,9 +30,10 @@
-export([module/4, package/4, overview/4, type/2]).
+-export([hidden_filter/2, get_all_tags/1]).
+
-include("edoc.hrl").
-%% TODO: report multiple definitions of the same type in the same module.
%% TODO: check that variables in @equiv are found in the signature
%% TODO: copy types from target (if missing) when using @equiv
@@ -139,6 +140,15 @@ functions(Es, Env, Opts) ->
|| #entry{name = {_,_}=N, args = As, export = Export, data = Ts}
<- Es].
+hidden_filter(Es, Opts) ->
+ Private = proplists:get_bool(private, Opts),
+ Hidden = proplists:get_bool(hidden, Opts),
+ [E || E <- Es,
+ case E#entry.name of
+ {_, _} -> function_filter(E, Private, Hidden);
+ _ -> true
+ end].
+
function_filter(Es, Opts) ->
Private = proplists:get_bool(private, Opts),
Hidden = proplists:get_bool(hidden, Opts),
@@ -298,7 +308,7 @@ get_deprecated(Ts, F, A, Env) ->
case otp_internal:obsolete(M, F, A) of
{Tag, Text} when Tag =:= deprecated; Tag =:= removed ->
deprecated([Text]);
- {Tag, Repl, _Rel} when Tag =:= deprecated; Tag =:= removed ->
+ {Tag, Repl, _Rel} when Tag =:= deprecated; Tag =:= removed ->
deprecated(Repl, Env);
_ ->
[]
diff --git a/lib/edoc/src/edoc_doclet.erl b/lib/edoc/src/edoc_doclet.erl
index f1d876d593..30eef3e63a 100644
--- a/lib/edoc/src/edoc_doclet.erl
+++ b/lib/edoc/src/edoc_doclet.erl
@@ -76,7 +76,7 @@
%% <dd>Specifies the suffix used for output files. The default value is
%% `".html"'.
%% </dd>
-%% <dt>{@type {hidden, bool()@}}
+%% <dt>{@type {hidden, boolean()@}}
%% </dt>
%% <dd>If the value is `true', documentation of hidden modules and
%% functions will also be included. The default value is `false'.
@@ -86,7 +86,7 @@
%% <dd>Specifies the name of the overview-file. By default, this doclet
%% looks for a file `"overview.edoc"' in the target directory.
%% </dd>
-%% <dt>{@type {private, bool()@}}
+%% <dt>{@type {private, boolean()@}}
%% </dt>
%% <dd>If the value is `true', documentation of private modules and
%% functions will also be included. The default value is `false'.
diff --git a/lib/edoc/src/edoc_extract.erl b/lib/edoc/src/edoc_extract.erl
index ea2755f7aa..5e28762c53 100644
--- a/lib/edoc/src/edoc_extract.erl
+++ b/lib/edoc/src/edoc_extract.erl
@@ -14,7 +14,7 @@
%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
%% USA
%%
-%% $Id$
+%% $Id: $
%%
%% @copyright 2001-2003 Richard Carlsson
%% @author Richard Carlsson <[email protected]>
@@ -34,10 +34,12 @@
%% %% @headerfile "edoc.hrl" (disabled until it can be made private)
-include("edoc.hrl").
-%% @type filename() = file:filename()
+%% @type filename() = file:filename().
+%% @type proplist() = proplists:property().
+%% @type syntaxTree() = erl_syntax:syntaxTree().
%% @spec source(File::filename(), Env::edoc_env(), Options::proplist())
-%% -> {ModuleName, edoc_module()}
+%% -> {ModuleName, edoc:edoc_module()}
%% ModuleName = atom()
%% proplist() = [term()]
%%
@@ -53,16 +55,11 @@ source(File, Env, Opts) ->
Comments = edoc:read_comments(File, Opts),
source(Forms, Comments, File, Env, Opts).
-%% @spec source(Forms, Comments::[comment()], File::filename(),
+%% @spec source(Forms, Comments::[edoc:comment()], File::filename(),
%% Env::edoc_env(), Options::proplist()) ->
-%% {ModuleName, edoc_module()}
+%% {ModuleName, edoc:edoc_module()}
%%
%% Forms = syntaxTree() | [syntaxTree()]
-%% comment() = {Line, Column, Indentation, Text}
-%% Line = integer()
-%% Column = integer()
-%% Indentation = integer()
-%% Text = [string()]
%% ModuleName = atom()
%%
%% @doc Like {@link source/4}, but first inserts the given comments in
@@ -80,15 +77,15 @@ source(Forms, Comments, File, Env, Opts) when is_list(Forms) ->
source(Forms1, Comments, File, Env, Opts);
source(Forms, Comments, File, Env, Opts) ->
Tree = erl_recomment:quick_recomment_forms(Forms, Comments),
- source(Tree, File, Env, Opts).
+ TypeDocs = find_type_docs(Forms, Comments),
+ source1(Tree, File, Env, Opts, TypeDocs).
%% @spec source(Forms, File::filename(), Env::edoc_env(),
%% Options::proplist()) ->
-%% {ModuleName, edoc_module()}
+%% {ModuleName, edoc:edoc_module()}
%%
%% Forms = syntaxTree() | [syntaxTree()]
%% ModuleName = atom()
-%% edoc_module() = edoc:edoc_module()
%% @type edoc_env() = edoc_lib:edoc_env()
%%
%% @doc Extracts EDoc documentation from commented source code syntax
@@ -116,6 +113,11 @@ source(Forms, Comments, File, Env, Opts) ->
source(Forms, File, Env, Opts) when is_list(Forms) ->
source(erl_syntax:form_list(Forms), File, Env, Opts);
source(Tree, File0, Env, Opts) ->
+ TypeDocs = find_type_docs(Tree, []),
+ source1(Tree, File0, Env, Opts, TypeDocs).
+
+%% Forms0 and Comments is used for extracting Erlang type documentation.
+source1(Tree, File0, Env, Opts, TypeDocs) ->
Forms = preprocess_forms(Tree),
File = edoc_lib:filename(File0),
Module = get_module_info(Tree, File),
@@ -126,11 +128,12 @@ source(Tree, File0, Env, Opts) ->
package = Package,
root = edoc_refs:relative_package_path('', Package)},
Env2 = add_macro_defs(module_macros(Env1), Opts, Env1),
- Entries1 = get_tags([Header, Footer | Entries], Env2, File),
- Data = edoc_data:module(Module, Entries1, Env2, Opts),
+ Entries1 = get_tags([Header, Footer | Entries], Env2, File, TypeDocs),
+ Entries2 = edoc_specs:add_data(Entries1, Opts, File, Module),
+ edoc_tags:check_types(Entries2, Opts, File),
+ Data = edoc_data:module(Module, Entries2, Env2, Opts),
{Name, Data}.
-
%% @spec header(File::filename(), Env::edoc_env(), Options::proplist())
%% -> {ok, Tags} | {error, Reason}
%% Tags = [term()]
@@ -148,7 +151,7 @@ header(File, Env, Opts) ->
Comments = edoc:read_comments(File),
header(Forms, Comments, File, Env, Opts).
-%% @spec header(Forms, Comments::[comment()], File::filename(),
+%% @spec header(Forms, Comments::[edoc:comment()], File::filename(),
%% Env::edoc_env(), Options::proplist()) ->
%% {ok, Tags} | {error, Reason}
%% Forms = syntaxTree() | [syntaxTree()]
@@ -196,7 +199,7 @@ header(Tree, File0, Env, _Opts) ->
%% kill all the information above it up to that point. Then we call
%% this the 'header' to make error reports make better sense.
{Header, Footer, Entries} = collect(Forms, Module),
- if Header#entry.data /= [] ->
+ if Header#entry.data /= {[],[],[]} ->
warning(File, "documentation before module declaration is ignored by @headerfile", []);
true -> ok
end,
@@ -215,7 +218,6 @@ add_macro_defs(Defs0, Opts, Env) ->
edoc_macros:check_defs(Defs),
Env#env{macros = Defs ++ Defs0 ++ Env#env.macros}.
-
%% @spec file(File::filename(), Context, Env::edoc_env(),
%% Options::proplist()) -> {ok, Tags} | {error, Reason}
%% Context = overview | package
@@ -276,7 +278,7 @@ text(Text, Context, Env, Opts, Where) ->
end.
-%% @spec (Forms::[syntaxTree()], File::filename()) -> moduleInfo()
+%% @spec (Forms::[syntaxTree()], File::filename()) -> module()
%% @doc Initialises a module-info record with data about the module
%% represented by the list of forms. Exports are guaranteed to exist in
%% the set of defined names.
@@ -351,6 +353,13 @@ preprocess_forms_2(F, Fs) ->
[F | preprocess_forms_1(Fs)];
text ->
[F | preprocess_forms_1(Fs)];
+ {attribute, {N, _}} ->
+ case edoc_specs:is_tag(N) of
+ true ->
+ [F | preprocess_forms_1(Fs)];
+ false ->
+ preprocess_forms_1(Fs)
+ end;
_ ->
preprocess_forms_1(Fs)
end.
@@ -362,42 +371,55 @@ preprocess_forms_2(F, Fs) ->
%% in the list.
collect(Fs, Mod) ->
- collect(Fs, [], [], undefined, Mod).
+ collect(Fs, [], [], [], [], undefined, Mod).
-collect([F | Fs], Cs, As, Header, Mod) ->
+collect([F | Fs], Cs, Ss, Ts, As, Header, Mod) ->
case erl_syntax_lib:analyze_form(F) of
comment ->
- collect(Fs, [F | Cs], As, Header, Mod);
+ collect(Fs, [F | Cs], Ss, Ts, As, Header, Mod);
{function, Name} ->
L = erl_syntax:get_pos(F),
Export = ordsets:is_element(Name, Mod#module.exports),
Args = parameters(erl_syntax:function_clauses(F)),
- collect(Fs, [], [#entry{name = Name, args = Args, line = L,
- export = Export,
- data = comment_text(Cs)} | As],
+ collect(Fs, [], [], [],
+ [#entry{name = Name, args = Args, line = L,
+ export = Export,
+ data = {comment_text(Cs),Ss,Ts}} | As],
Header, Mod);
{rule, Name} ->
L = erl_syntax:get_pos(F),
Export = ordsets:is_element(Name, Mod#module.exports),
Args = parameters(erl_syntax:rule_clauses(F)),
- collect(Fs, [], [#entry{name = Name, args = Args, line = L,
- export = Export,
- data = comment_text(Cs)} | As],
+ collect(Fs, [], [], [],
+ [#entry{name = Name, args = Args, line = L,
+ export = Export,
+ data = {comment_text(Cs),Ss,Ts}} | As],
Header, Mod);
{attribute, {module, _}} when Header =:= undefined ->
L = erl_syntax:get_pos(F),
- collect(Fs, [], As, #entry{name = module, line = L,
- data = comment_text(Cs)},
+ collect(Fs, [], [], [], As,
+ #entry{name = module, line = L,
+ data = {comment_text(Cs),Ss,Ts}},
Mod);
+ {attribute, {N, _}} ->
+ case edoc_specs:tag(N) of
+ spec ->
+ collect(Fs, Cs, [F | Ss], Ts, As, Header, Mod);
+ type ->
+ collect(Fs, Cs, Ss, [F | Ts], As, Header, Mod);
+ unknown ->
+ %% Drop current seen comments.
+ collect(Fs, [], [], [], As, Header, Mod)
+ end;
_ ->
%% Drop current seen comments.
- collect(Fs, [], As, Header, Mod)
+ collect(Fs, [], [], [], As, Header, Mod)
end;
-collect([], Cs, As, Header, _Mod) ->
- Footer = #entry{name = footer, data = comment_text(Cs)},
+collect([], Cs, Ss, Ts, As, Header, _Mod) ->
+ Footer = #entry{name = footer, data = {comment_text(Cs),Ss,Ts}},
As1 = lists:reverse(As),
if Header =:= undefined ->
- {#entry{name = module, data = []}, Footer, As1};
+ {#entry{name = module, data = {[],[],[]}}, Footer, As1};
true ->
{Header, Footer, As1}
end.
@@ -475,7 +497,7 @@ select_names([Ns | Ls], As, S) ->
select_names([], As, _) ->
lists:reverse(As).
-select_name([A | Ns], S) ->
+select_name([A | Ns], S) ->
case sets:is_element(A, S) of
true ->
select_name(Ns, S);
@@ -522,6 +544,9 @@ capitalize(Cs) -> Cs.
-record(tags, {names,single,module,function,footer}).
get_tags(Es, Env, File) ->
+ get_tags(Es, Env, File, dict:new()).
+
+get_tags(Es, Env, File, TypeDocs) ->
%% Cache this stuff for quick lookups.
Tags = #tags{names = sets:from_list(edoc_tags:tag_names()),
single = sets:from_list(edoc_tags:tags(single)),
@@ -529,17 +554,20 @@ get_tags(Es, Env, File) ->
footer = sets:from_list(edoc_tags:tags(footer)),
function = sets:from_list(edoc_tags:tags(function))},
How = dict:from_list(edoc_tags:tag_parsers()),
- get_tags(Es, Tags, Env, How, File).
+ get_tags(Es, Tags, Env, How, File, TypeDocs).
-get_tags([#entry{name = Name, data = Cs} = E | Es], Tags, Env,
- How, File) ->
+get_tags([#entry{name = Name, data = {Cs,Specs,Types}} = E | Es], Tags, Env,
+ How, File, TypeDocs) ->
Where = {File, Name},
Ts0 = scan_tags(Cs),
- Ts1 = check_tags(Ts0, Tags, Where),
- Ts2 = edoc_macros:expand_tags(Ts1, Env, Where),
- Ts = edoc_tags:parse_tags(Ts2, How, Env, Where),
- [E#entry{data = Ts} | get_tags(Es, Tags, Env, How, File)];
-get_tags([], _, _, _, _) ->
+ {Ts1,Specs1} = select_spec(Ts0, Where, Specs),
+ Ts2 = check_tags(Ts1, Tags, Where),
+ Ts3 = edoc_macros:expand_tags(Ts2, Env, Where),
+ Ts4 = edoc_tags:parse_tags(Ts3, How, Env, Where),
+ Ts = selected_specs(Specs1, Ts4),
+ ETypes = [edoc_specs:type(Type, TypeDocs) || Type <- Types],
+ [E#entry{data = Ts++ETypes} | get_tags(Es, Tags, Env, How, File, TypeDocs)];
+get_tags([], _, _, _, _, _) ->
[].
%% Scanning a list of separate comments for tags.
@@ -572,6 +600,22 @@ check_tags_1(Ts, Tags, Where) ->
Single = Tags#tags.single,
edoc_tags:check_tags(Ts, Allow, Single, Where).
+select_spec(Ts, {_, {_F, _A}}, Specs) ->
+ case edoc_tags:filter_tags(Ts, sets:from_list([spec])) of
+ [] ->
+ %% Just a dummy to get us through check_tags()
+ {[edoc_specs:dummy_spec(S) || S <- Specs] ++ Ts, Specs};
+ _ ->
+ {Ts,[]}
+ end;
+select_spec(Ts, _Where, _Specs) ->
+ {Ts,[]}.
+
+selected_specs([], Ts) ->
+ Ts;
+selected_specs([F], [_ | Ts]) ->
+ [edoc_specs:spec(F, _Clause=1) | Ts].
+
%% Macros for modules
module_macros(Env) ->
@@ -582,3 +626,25 @@ module_macros(Env) ->
file_macros(_Context, Env) ->
edoc_macros:std_macros(Env).
+
+%% @doc Extracts what will be documentation of Erlang types.
+%% Returns a dict of {Name, Doc} where Name is {TypeName, Arity}.
+%%
+%% The idea is to mimic how the @type tag works.
+%% Using @type:
+%% @type t() = t1(). Some docs of t/0;
+%% Further docs of t/0.
+%% The same thing using -type:
+%% -type t() :: t1(). % Some docs of t/0;
+%% Further docs of t/0.
+find_type_docs(Forms0, Comments) ->
+ Tree = erl_recomment:recomment_forms(Forms0, Comments),
+ Forms = preprocess_forms(Tree),
+ edoc_specs:docs(Forms, fun find_fun/2).
+
+find_fun(C0, Line) ->
+ C1 = comment_text(C0),
+ Text = lists:append([C#comment.text || C <- C1]),
+ Comm = #comment{line = Line, text = Text},
+ [Tag | _] = scan_tags([Comm]),
+ Tag.
diff --git a/lib/edoc/src/edoc_layout.erl b/lib/edoc/src/edoc_layout.erl
index 6cc2f5cd9b..3ec87b7060 100644
--- a/lib/edoc/src/edoc_layout.erl
+++ b/lib/edoc/src/edoc_layout.erl
@@ -14,7 +14,7 @@
%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
%% USA
%%
-%% $Id$
+%% $Id: $
%%
%% @author Richard Carlsson <[email protected]>
%% @copyright 2001-2006 Richard Carlsson
@@ -49,7 +49,6 @@
-define(FUNCTIONS_TITLE, "Function Details").
-define(FUNCTIONS_LABEL, "functions").
-
%% @doc The layout function.
%%
%% Options to the standard layout:
@@ -59,13 +58,20 @@
%% <dd>Specifies the number of column pairs used for the function
%% index tables. The default value is 1.
%% </dd>
+%% <dt>{@type {pretty_printer, atom()@}}
+%% </dt>
+%% <dd>Specifies how types and specifications are pretty printed.
+%% If the value `erl_pp' is specified the Erlang pretty printer
+%% (the module `erl_pp') will be used. The default is to do
+%% no pretty printing which implies that lines can be very long.
+%% </dd>
%% <dt>{@type {stylesheet, string()@}}
%% </dt>
%% <dd>Specifies the URI used for referencing the stylesheet. The
%% default value is `"stylesheet.css"'. If an empty string is
%% specified, no stylesheet reference will be generated.
%% </dd>
-%% <dt>{@type {sort_functions, bool()@}}
+%% <dt>{@type {sort_functions, boolean()@}}
%% </dt>
%% <dd>If `true', the detailed function descriptions are listed by
%% name, otherwise they are listed in the order of occurrence in
@@ -96,14 +102,20 @@ module(Element, Options) ->
%% % stylesheet = string(),
%% % index_columns = integer()}
--record(opts, {root, stylesheet, index_columns, sort_functions}).
+-record(opts, {root,
+ stylesheet,
+ index_columns,
+ sort_functions,
+ pretty_printer}).
init_opts(Element, Options) ->
R = #opts{root = get_attrval(root, Element),
index_columns = proplists:get_value(index_columns,
Options, 1),
sort_functions = proplists:get_value(sort_functions,
- Options, true)
+ Options, true),
+ pretty_printer = proplists:get_value(pretty_printer,
+ Options, '')
},
case proplists:get_value(stylesheet, Options) of
undefined ->
@@ -112,7 +124,7 @@ init_opts(Element, Options) ->
"" ->
R; % don't use any stylesheet
S when is_list(S) ->
- R#opts{stylesheet = S};
+ R#opts{stylesheet = S};
_ ->
report("bad value for option `stylesheet'.", []),
exit(error)
@@ -192,10 +204,10 @@ layout_module(#xmlElement{name = module, content = Es}=E, Opts) ->
["Description"]}]}
| FullDesc]
end
- ++ types(lists:sort(Types))
+ ++ types(lists:sort(Types), Opts)
++ function_index(SortedFs, Opts#opts.index_columns)
- ++ if Opts#opts.sort_functions -> functions(SortedFs);
- true -> functions(Functions)
+ ++ if Opts#opts.sort_functions -> functions(SortedFs, Opts);
+ true -> functions(Functions, Opts)
end
++ [hr, ?NL]
++ navigation("bottom")
@@ -218,7 +230,7 @@ timestamp() ->
edoc_lib:timestr(time())])
]}]},
?NL].
-
+
stylesheet(Opts) ->
case Opts#opts.stylesheet of
undefined ->
@@ -335,8 +347,8 @@ label_href(Content, F) ->
%% <!ELEMENT equiv (expr, see?)>
%% <!ELEMENT expr (#PCDATA)>
-functions(Fs) ->
- Es = lists:flatmap(fun ({Name, E}) -> function(Name, E) end, Fs),
+functions(Fs, Opts) ->
+ Es = lists:flatmap(fun ({Name, E}) -> function(Name, E, Opts) end, Fs),
if Es == [] -> [];
true ->
[?NL,
@@ -344,7 +356,7 @@ functions(Fs) ->
?NL | Es]
end.
-function(Name, E=#xmlElement{content = Es}) ->
+function(Name, E=#xmlElement{content = Es}, Opts) ->
([?NL,
{h3, [{class, "function"}],
label_anchor(function_header(Name, E, " *"), E)},
@@ -352,7 +364,7 @@ function(Name, E=#xmlElement{content = Es}) ->
++ [{'div', [{class, "spec"}],
[?NL,
{p,
- case typespec(get_content(typespec, Es)) of
+ case typespec(get_content(typespec, Es), Opts) of
[] ->
signature(get_content(args, Es),
get_attrval(name, E));
@@ -367,7 +379,7 @@ function(Name, E=#xmlElement{content = Es}) ->
[] -> [];
Rs -> [{p, Rs}, ?NL]
end}]
- ++ throws(Es)
+ ++ throws(Es, Opts)
++ equiv_p(Es)
++ deprecated(Es, "function")
++ fulldesc(Es)
@@ -402,7 +414,7 @@ label_anchor(Content, E) ->
%% This is currently only done for functions without type spec.
-signature(Es, Name) ->
+signature(Es, Name) ->
[{tt, [Name, "("] ++ seq(fun arg/1, Es) ++ [") -> any()"]}].
arg(#xmlElement{content = Es}) ->
@@ -432,66 +444,168 @@ returns(Es) ->
%% <!ELEMENT throws (type, localdef*)>
-throws(Es) ->
+throws(Es, Opts) ->
case get_content(throws, Es) of
[] -> [];
Es1 ->
+ %% Doesn't use format_type; keep it short!
[{p, (["throws ", {tt, t_utype(get_elem(type, Es1))}]
- ++ local_defs(get_elem(localdef, Es1)))},
+ ++ local_defs(get_elem(localdef, Es1), Opts))},
?NL]
end.
%% <!ELEMENT typespec (erlangName, type, localdef*)>
-typespec([]) -> [];
-typespec(Es) ->
- [{tt, ([t_name(get_elem(erlangName, Es))]
- ++ t_utype(get_elem(type, Es)))}]
- ++ local_defs(get_elem(localdef, Es)).
+typespec([], _Opts) -> [];
+typespec(Es, Opts) ->
+ Name = t_name(get_elem(erlangName, Es)),
+ Defs = get_elem(localdef, Es),
+ [Type] = get_elem(type, Es),
+ format_spec(Name, Type, Defs, Opts) ++ local_defs(Defs, Opts).
%% <!ELEMENT typedecl (typedef, description?)>
%% <!ELEMENT typedef (erlangName, argtypes, type?, localdef*)>
-types([]) -> [];
-types(Ts) ->
- Es = lists:flatmap(fun ({Name, E}) -> typedecl(Name, E) end, Ts),
+types([], _Opts) -> [];
+types(Ts, Opts) ->
+ Es = lists:flatmap(fun ({Name, E}) -> typedecl(Name, E, Opts) end, Ts),
[?NL,
{h2, [{a, [{name, ?DATA_TYPES_LABEL}],
[?DATA_TYPES_TITLE]}]},
?NL | Es].
-typedecl(Name, E=#xmlElement{content = Es}) ->
+typedecl(Name, E=#xmlElement{content = Es}, Opts) ->
([?NL, {h3, [{class, "typedecl"}], label_anchor([Name, "()"], E)}, ?NL]
- ++ [{p, typedef(get_content(typedef, Es))}, ?NL]
+ ++ [{p, typedef(get_content(typedef, Es), Opts)}, ?NL]
++ fulldesc(Es)).
type_name(#xmlElement{content = Es}) ->
t_name(get_elem(erlangName, get_content(typedef, Es))).
-typedef(Es) ->
+typedef(Es, Opts) ->
Name = ([t_name(get_elem(erlangName, Es)), "("]
- ++ seq(fun t_utype_elem/1, get_content(argtypes, Es), [")"])),
+ ++ seq(fun t_utype_elem/1, get_content(argtypes, Es), [")"])),
(case get_elem(type, Es) of
[] -> [{b, ["abstract datatype"]}, ": ", {tt, Name}];
- Type ->
- [{tt, Name ++ [" = "] ++ t_utype(Type)}]
+ Type -> format_type(Name, Name, Type, [], Opts)
end
- ++ local_defs(get_elem(localdef, Es))).
+ ++ local_defs(get_elem(localdef, Es), Opts)).
-local_defs([]) -> [];
-local_defs(Es) ->
+local_defs(Es, Opts) ->
+ local_defs(Es, [], Opts).
+
+local_defs([], _, _Opts) -> [];
+local_defs(Es0, Last, Opts) ->
+ [E | Es] = lists:reverse(Es0),
[?NL,
{ul, [{class, "definitions"}],
- lists:append([[{li, [{tt, localdef(E)}]}, ?NL] || E <- Es])}].
-
-localdef(E = #xmlElement{content = Es}) ->
- (case get_elem(typevar, Es) of
- [] ->
- label_anchor(t_abstype(get_content(abstype, Es)), E);
- [V] ->
- t_var(V)
- end
- ++ [" = "] ++ t_utype(get_elem(type, Es))).
+ lists:reverse(lists:append([localdef(E1, [], Opts) || E1 <- Es]),
+ localdef(E, Last, Opts))}].
+
+localdef(E = #xmlElement{content = Es}, Last, Opts) ->
+ Name = case get_elem(typevar, Es) of
+ [] ->
+ label_anchor(N0 = t_abstype(get_content(abstype, Es)), E);
+ [V] ->
+ N0 = t_var(V)
+ end,
+ [{li, format_type(Name, N0, get_elem(type, Es), Last, Opts)}].
+
+%% Use the default formatting of EDoc, which creates references, and
+%% then insert newlines and indentation according to erl_pp (the
+%% (fast) Erlang pretty printer).
+format_spec(Name, Type, Defs, #opts{pretty_printer = erl_pp}=Opts) ->
+ try
+ L = t_clause(Name, Type),
+ O = pp_clause(Name, Type),
+ {R, ".\n"} = etypef(L, O),
+ [{pre, R}]
+ catch _:_ ->
+ %% Example: "@spec ... -> record(a)"
+ format_spec(Name, Type, Defs, Opts#opts{pretty_printer=''})
+ end;
+format_spec(Sep, Type, Defs, _Opts) ->
+ %% Very limited formatting.
+ Br = if Defs =:= [] -> br; true -> [] end,
+ [{tt, t_clause(Sep, Type)}, Br].
+
+t_clause(Name, Type) ->
+ #xmlElement{content = [#xmlElement{name = 'fun', content = C}]} = Type,
+ [Name] ++ t_fun(C).
+
+pp_clause(Pre, Type) ->
+ Types = ot_utype([Type]),
+ Atom = lists:duplicate(iolist_size(Pre), $a),
+ L1 = erl_pp:attribute({attribute,0,spec,{{list_to_atom(Atom),0},[Types]}}),
+ "-spec " ++ L2 = lists:flatten(L1),
+ L3 = Pre ++ lists:nthtail(length(Atom), L2),
+ re:replace(L3, "\n ", "\n", [{return,list},global]).
+
+format_type(Prefix, Name, Type, Last, #opts{pretty_printer = erl_pp}=Opts) ->
+ try
+ L = t_utype(Type),
+ O = pp_type(Name, Type),
+ {R, ".\n"} = etypef(L, O),
+ [{pre, Prefix ++ [" = "] ++ R ++ Last}]
+ catch _:_ ->
+ %% Example: "t() = record(a)."
+ format_type(Prefix, Name, Type, Last, Opts#opts{pretty_printer =''})
+ end;
+format_type(Prefix, _Name, Type, Last, _Opts) ->
+ [{tt, Prefix ++ [" = "] ++ t_utype(Type) ++ Last}].
+
+pp_type(Prefix, Type) ->
+ Atom = list_to_atom(lists:duplicate(iolist_size(Prefix), $a)),
+ L1 = erl_pp:attribute({attribute,0,type,{Atom,ot_utype(Type),[]}}),
+ {L2,N} = case lists:dropwhile(fun(C) -> C =/= $: end, lists:flatten(L1)) of
+ ":: " ++ L3 -> {L3,9}; % compensation for extra "()" and ":"
+ "::\n" ++ L3 -> {"\n"++L3,6}
+ end,
+ Ss = lists:duplicate(N, $\s),
+ re:replace(L2, "\n"++Ss, "\n", [{return,list},global]).
+
+etypef(L, O0) ->
+ {R, O} = etypef(L, [], O0, []),
+ {lists:reverse(R), O}.
+
+etypef([C | L], St, [C | O], R) ->
+ etypef(L, St, O, [[C] | R]);
+etypef(" "++L, St, O, R) ->
+ etypef(L, St, O, R);
+etypef("", [Cs | St], O, R) ->
+ etypef(Cs, St, O, R);
+etypef("", [], O, R) ->
+ {R, O};
+etypef(L, St, " "++O, R) ->
+ etypef(L, St, O, [" " | R]);
+etypef(L, St, "\n"++O, R) ->
+ Ss = lists:takewhile(fun(C) -> C =:= $\s end, O),
+ etypef(L, St, lists:nthtail(length(Ss), O), ["\n"++Ss | R]);
+etypef([{a, HRef, S0} | L], St, O0, R) ->
+ {S, O} = etypef(S0, app_fix(O0)),
+ etypef(L, St, O, [{a, HRef, S} | R]);
+etypef("="++L, St, "::"++O, R) ->
+ %% EDoc uses "=" for record field types; Erlang types use "::".
+ %% Maybe there should be an option for this, possibly affecting
+ %% other similar discrepancies.
+ etypef(L, St, O, ["=" | R]);
+etypef([Cs | L], St, O, R) ->
+ etypef(Cs, [L | St], O, R).
+
+app_fix(L) ->
+ try
+ {"//" ++ R1,L2} = app_fix(L, 1),
+ [App, Mod] = string:tokens(R1, "/"),
+ "//" ++ atom(App) ++ "/" ++ atom(Mod) ++ L2
+ catch _:_ -> L
+ end.
+
+app_fix(L, I) -> % a bit slow
+ {L1, L2} = lists:split(I, L),
+ case erl_scan:tokens([], L1 ++ ". ", 1) of
+ {done, {ok,[{atom,_,Atom}|_],_}, _} -> {atom_to_list(Atom), L2};
+ _ -> app_fix(L, I+1)
+ end.
fulldesc(Es) ->
case get_content(fullDescription, get_content(description, Es)) of
@@ -702,21 +816,28 @@ t_type([E=#xmlElement{name = atom}]) ->
t_atom(E);
t_type([E=#xmlElement{name = integer}]) ->
t_integer(E);
+t_type([E=#xmlElement{name = range}]) ->
+ t_range(E);
+t_type([E=#xmlElement{name = binary}]) ->
+ t_binary(E);
t_type([E=#xmlElement{name = float}]) ->
t_float(E);
t_type([#xmlElement{name = nil}]) ->
t_nil();
+t_type([#xmlElement{name = paren, content = Es}]) ->
+ t_paren(Es);
t_type([#xmlElement{name = list, content = Es}]) ->
t_list(Es);
+t_type([#xmlElement{name = nonempty_list, content = Es}]) ->
+ t_nonempty_list(Es);
t_type([#xmlElement{name = tuple, content = Es}]) ->
t_tuple(Es);
t_type([#xmlElement{name = 'fun', content = Es}]) ->
- t_fun(Es);
-t_type([#xmlElement{name = record, content = Es}]) ->
- t_record(Es);
+ ["fun("] ++ t_fun(Es) ++ [")"];
+t_type([E = #xmlElement{name = record, content = Es}]) ->
+ t_record(E, Es);
t_type([E = #xmlElement{name = abstype, content = Es}]) ->
- T = t_abstype(Es),
- see(E, T);
+ t_abstype(E, Es);
t_type([#xmlElement{name = union, content = Es}]) ->
t_union(Es).
@@ -729,15 +850,27 @@ t_atom(E) ->
t_integer(E) ->
[get_attrval(value, E)].
+t_range(E) ->
+ [get_attrval(value, E)].
+
+t_binary(E) ->
+ [get_attrval(value, E)].
+
t_float(E) ->
[get_attrval(value, E)].
t_nil() ->
["[]"].
+t_paren(Es) ->
+ ["("] ++ t_utype(get_elem(type, Es)) ++ [")"].
+
t_list(Es) ->
["["] ++ t_utype(get_elem(type, Es)) ++ ["]"].
+t_nonempty_list(Es) ->
+ ["["] ++ t_utype(get_elem(type, Es)) ++ [", ...]"].
+
t_tuple(Es) ->
["{"] ++ seq(fun t_utype_elem/1, Es, ["}"]).
@@ -745,13 +878,27 @@ t_fun(Es) ->
["("] ++ seq(fun t_utype_elem/1, get_content(argtypes, Es),
[") -> "] ++ t_utype(get_elem(type, Es))).
-t_record(Es) ->
- ["#"] ++ t_type(get_elem(atom, Es)) ++ ["{"]
- ++ seq(fun t_field/1, get_elem(field, Es), ["}"]).
+t_record(E, Es) ->
+ Name = ["#"] ++ t_type(get_elem(atom, Es)),
+ case get_elem(field, Es) of
+ [] ->
+ see(E, [Name, "{}"]);
+ Fs ->
+ see(E, Name) ++ ["{"] ++ seq(fun t_field/1, Fs, ["}"])
+ end.
t_field(#xmlElement{content = Es}) ->
t_type(get_elem(atom, Es)) ++ [" = "] ++ t_utype(get_elem(type, Es)).
+t_abstype(E, Es) ->
+ Name = t_name(get_elem(erlangName, Es)),
+ case get_elem(type, Es) of
+ [] ->
+ see(E, [Name, "()"]);
+ Ts ->
+ see(E, [Name]) ++ ["("] ++ seq(fun t_utype_elem/1, Ts, [")"])
+ end.
+
t_abstype(Es) ->
([t_name(get_elem(erlangName, Es)), "("]
++ seq(fun t_utype_elem/1, get_elem(type, Es), [")"])).
@@ -827,7 +974,8 @@ type(E) ->
type(E, []).
type(E, Ds) ->
- xmerl:export_simple_content(t_utype_elem(E) ++ local_defs(Ds),
+ Opts = [],
+ xmerl:export_simple_content(t_utype_elem(E) ++ local_defs(Ds, Opts),
?HTML_EXPORT).
package(E=#xmlElement{name = package, content = Es}, Options) ->
@@ -873,3 +1021,142 @@ overview(E=#xmlElement{name = overview, content = Es}, Options) ->
++ timestamp()),
XML = xhtml(Title, stylesheet(Opts), Body),
xmerl:export_simple(XML, ?HTML_EXPORT, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% NYTT
+
+ot_utype([E]) ->
+ ot_utype_elem(E).
+
+ot_utype_elem(E=#xmlElement{content = Es}) ->
+ case get_attrval(name, E) of
+ "" -> ot_type(Es);
+ N ->
+ Name = {var,0,list_to_atom(N)},
+ T = ot_type(Es),
+ case T of
+ Name -> T;
+ T -> {ann_type,0,[Name, T]}
+ end
+ end.
+
+ot_type([E=#xmlElement{name = typevar}]) ->
+ ot_var(E);
+ot_type([E=#xmlElement{name = atom}]) ->
+ ot_atom(E);
+ot_type([E=#xmlElement{name = integer}]) ->
+ ot_integer(E);
+ot_type([E=#xmlElement{name = range}]) ->
+ ot_range(E);
+ot_type([E=#xmlElement{name = binary}]) ->
+ ot_binary(E);
+ot_type([E=#xmlElement{name = float}]) ->
+ ot_float(E);
+ot_type([#xmlElement{name = nil}]) ->
+ ot_nil();
+ot_type([#xmlElement{name = paren, content = Es}]) ->
+ ot_paren(Es);
+ot_type([#xmlElement{name = list, content = Es}]) ->
+ ot_list(Es);
+ot_type([#xmlElement{name = nonempty_list, content = Es}]) ->
+ ot_nonempty_list(Es);
+ot_type([#xmlElement{name = tuple, content = Es}]) ->
+ ot_tuple(Es);
+ot_type([#xmlElement{name = 'fun', content = Es}]) ->
+ ot_fun(Es);
+ot_type([#xmlElement{name = record, content = Es}]) ->
+ ot_record(Es);
+ot_type([#xmlElement{name = abstype, content = Es}]) ->
+ ot_abstype(Es);
+ot_type([#xmlElement{name = union, content = Es}]) ->
+ ot_union(Es).
+
+ot_var(E) ->
+ {var,0,list_to_atom(get_attrval(name, E))}.
+
+ot_atom(E) ->
+ {ok, [Atom], _} = erl_scan:string(get_attrval(value, E), 0),
+ Atom.
+
+ot_integer(E) ->
+ {integer,0,list_to_integer(get_attrval(value, E))}.
+
+ot_range(E) ->
+ [I1, I2] = string:tokens(get_attrval(value, E), "."),
+ {type,0,range,[{integer,0,list_to_integer(I1)},
+ {integer,0,list_to_integer(I2)}]}.
+
+ot_binary(E) ->
+ {Base, Unit} =
+ case string:tokens(get_attrval(value, E), ",:*><") of
+ [] ->
+ {0, 0};
+ ["_",B] ->
+ {list_to_integer(B), 0};
+ ["_","_",U] ->
+ {0, list_to_integer(U)};
+ ["_",B,_,"_",U] ->
+ {list_to_integer(B), list_to_integer(U)}
+ end,
+ {type,0,binary,[{integer,0,Base},{integer,0,Unit}]}.
+
+ot_float(E) ->
+ {float,0,list_to_float(get_attrval(value, E))}.
+
+ot_nil() ->
+ {nil,0}.
+
+ot_paren(Es) ->
+ {paren_type,0,[ot_utype(get_elem(type, Es))]}.
+
+ot_list(Es) ->
+ {type,0,list,[ot_utype(get_elem(type, Es))]}.
+
+ot_nonempty_list(Es) ->
+ {type,0,nonempty_list,[ot_utype(get_elem(type, Es))]}.
+
+ot_tuple(Es) ->
+ {type,0,tuple,[ot_utype_elem(E) || E <- Es]}.
+
+ot_fun(Es) ->
+ Range = ot_utype(get_elem(type, Es)),
+ Args = [ot_utype_elem(A) || A <- get_content(argtypes, Es)],
+ {type,0,'fun',[{type,0,product,Args},Range]}.
+
+ot_record(Es) ->
+ {type,0,record,[ot_type(get_elem(atom, Es)) |
+ [ot_field(F) || F <- get_elem(field, Es)]]}.
+
+ot_field(#xmlElement{content = Es}) ->
+ {type,0,field_type,
+ [ot_type(get_elem(atom, Es)), ot_utype(get_elem(type, Es))]}.
+
+ot_abstype(Es) ->
+ ot_name(get_elem(erlangName, Es),
+ [ot_utype_elem(Elem) || Elem <- get_elem(type, Es)]).
+
+ot_union(Es) ->
+ {type,0,union,[ot_utype_elem(E) || E <- Es]}.
+
+ot_name(Es, T) ->
+ case ot_name(Es) of
+ [Mod, ":", Atom] ->
+ {remote_type,0,[{atom,0,list_to_atom(Mod)},
+ {atom,0,list_to_atom(Atom)},T]};
+ "tuple" when T =:= [] ->
+ {type,0,tuple,any};
+ Atom ->
+ {type,0,list_to_atom(Atom),T}
+ end.
+
+ot_name([E]) ->
+ Atom = get_attrval(name, E),
+ case get_attrval(module, E) of
+ "" -> Atom;
+ M ->
+ case get_attrval(app, E) of
+ "" ->
+ [M, ":", Atom];
+ A ->
+ ["//"++A++"/" ++ M, ":", Atom] % EDoc only!
+ end
+ end.
diff --git a/lib/edoc/src/edoc_lib.erl b/lib/edoc/src/edoc_lib.erl
index c1f95a7a67..585e30a2d2 100644
--- a/lib/edoc/src/edoc_lib.erl
+++ b/lib/edoc/src/edoc_lib.erl
@@ -16,7 +16,6 @@
%%
%% $Id$
%%
-%% @private
%% @copyright 2001-2003 Richard Carlsson
%% @author Richard Carlsson <[email protected]>
%% @see edoc
@@ -49,14 +48,17 @@
%% ---------------------------------------------------------------------
%% List and string utilities
+%% @private
timestr({H,M,Sec}) ->
lists:flatten(io_lib:fwrite("~2.2.0w:~2.2.0w:~2.2.0w",[H,M,Sec])).
+%% @private
datestr({Y,M,D}) ->
Ms = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep",
"Oct", "Nov", "Dec"],
lists:flatten(io_lib:fwrite("~s ~w ~w",[lists:nth(M, Ms),D,Y])).
+%% @private
count(X, Xs) ->
count(X, Xs, 0).
@@ -67,6 +69,7 @@ count(X, [_ | Xs], N) ->
count(_X, [], N) ->
N.
+%% @private
lines(Cs) ->
lines(Cs, [], []).
@@ -77,6 +80,7 @@ lines([C | Cs], As, Ls) ->
lines([], As, Ls) ->
lists:reverse([lists:reverse(As) | Ls]).
+%% @private
split_at(Cs, K) ->
split_at(Cs, K, []).
@@ -87,6 +91,7 @@ split_at([C | Cs], K, As) ->
split_at([], _K, As) ->
{lists:reverse(As), []}.
+%% @private
split_at_stop(Cs) ->
split_at_stop(Cs, []).
@@ -103,6 +108,7 @@ split_at_stop([C | Cs], As) ->
split_at_stop([], As) ->
{lists:reverse(As), []}.
+%% @private
split_at_space(Cs) ->
split_at_space(Cs, []).
@@ -117,17 +123,20 @@ split_at_space([C | Cs], As) ->
split_at_space([], As) ->
{lists:reverse(As), []}.
+%% @private
is_space([$\s | Cs]) -> is_space(Cs);
is_space([$\t | Cs]) -> is_space(Cs);
is_space([$\n | Cs]) -> is_space(Cs);
is_space([_C | _Cs]) -> false;
is_space([]) -> true.
+%% @private
strip_space([$\s | Cs]) -> strip_space(Cs);
strip_space([$\t | Cs]) -> strip_space(Cs);
strip_space([$\n | Cs]) -> strip_space(Cs);
strip_space(Cs) -> Cs.
+%% @private
segment(Es, N) ->
segment(Es, [], [], 0, N).
@@ -140,6 +149,7 @@ segment([], [], Cs, _N, _M) ->
segment([], As, Cs, _N, _M) ->
lists:reverse([lists:reverse(As) | Cs]).
+%% @private
transpose([]) -> [];
transpose([[] | Xss]) -> transpose(Xss);
transpose([[X | Xs] | Xss]) ->
@@ -151,6 +161,7 @@ transpose([[X | Xs] | Xss]) ->
%% end of the summary sentence only if it is also the last segment in
%% the list, or is followed by a 'p' or 'br' ("whitespace") element.
+%% @private
get_first_sentence([#xmlElement{name = p, content = Es} | _]) ->
%% Descend into initial paragraph.
get_first_sentence_1(Es);
@@ -230,6 +241,7 @@ end_of_sentence_1(_, false, _) ->
%% Names must begin with a lowercase letter and contain only
%% alphanumerics and underscores.
+%% @private
is_name([C | Cs]) when C >= $a, C =< $z ->
is_name_1(Cs);
is_name([C | Cs]) when C >= $\337, C =< $\377, C =/= $\367 ->
@@ -252,6 +264,7 @@ is_name_1(_) -> false.
to_atom(A) when is_atom(A) -> A;
to_atom(S) when is_list(S) -> list_to_atom(S).
+%% @private
unique([X | Xs]) -> [X | unique(Xs, X)];
unique([]) -> [].
@@ -267,6 +280,7 @@ unique([], _) -> [].
%% content of <a href="overview-summary.html#ftag-equiv">`@equiv'</a>
%% tags, and strings denoting file names, e.g. in @headerfile. Also used
%% by {@link edoc_run}.
+%% @private
parse_expr(S, L) ->
case erl_scan:string(S ++ ".", L) of
@@ -287,10 +301,11 @@ parse_expr(S, L) ->
%% @doc EDoc "contact information" parsing. This is the type of the
%% content in e.g.
%% <a href="overview-summary.html#mtag-author">`@author'</a> tags.
+%% @private
-%% @type info() = #info{name = string(),
-%% email = string(),
-%% uri = string()}
+%% % @type info() = #info{name = string(),
+%% % email = string(),
+%% % uri = string()}
-record(info, {name = "" :: string(),
email = "" :: string(),
@@ -367,6 +382,7 @@ strip_and_reverse(As) ->
%%
%% TODO: general utf-8 encoding for all of Unicode (0-16#10ffff)
+%% @private
escape_uri([C | Cs]) when C >= $a, C =< $z ->
[C | escape_uri(Cs)];
escape_uri([C | Cs]) when C >= $A, C =< $Z ->
@@ -409,6 +425,7 @@ hex_octet(N) ->
%% Please note that URI are *not* file names. Don't use the stdlib
%% 'filename' module for operations on (any parts of) URI.
+%% @private
join_uri(Base, "") ->
Base;
join_uri("", Path) ->
@@ -418,6 +435,7 @@ join_uri(Base, Path) ->
%% Check for relative URI; "network paths" ("//...") not included!
+%% @private
is_relative_uri([$: | _]) ->
false;
is_relative_uri([$/, $/ | _]) ->
@@ -433,6 +451,7 @@ is_relative_uri([_ | Cs]) ->
is_relative_uri([]) ->
true.
+%% @private
uri_get("file:///" ++ Path) ->
uri_get_file(Path);
uri_get("file://localhost/" ++ Path) ->
@@ -532,6 +551,7 @@ uri_get_ftp(URI) ->
Msg = io_lib:format("cannot access ftp scheme yet: '~s'.", [URI]),
{error, Msg}.
+%% @private
to_label([$\s | Cs]) ->
to_label(Cs);
to_label([$\t | Cs]) ->
@@ -564,6 +584,7 @@ to_label_2(Cs) ->
%% ---------------------------------------------------------------------
%% Files
+%% @private
filename([C | T]) when is_integer(C), C > 0 ->
[C | filename(T)];
filename([H|T]) ->
@@ -576,6 +597,7 @@ filename(N) ->
report("bad filename: `~P'.", [N, 25]),
exit(error).
+%% @private
copy_file(From, To) ->
case file:copy(From, To) of
{ok, _} -> ok;
@@ -600,6 +622,7 @@ list_dir(Dir, Error) ->
F("could not read directory '~s': ~s.", [filename(Dir), R1])
end.
+%% @private
simplify_path(P) ->
case filename:basename(P) of
"." ->
@@ -636,6 +659,7 @@ simplify_path(P) ->
%% exit(error)
%% end.
+%% @private
try_subdir(Dir, Subdir) ->
D = filename:join(Dir, Subdir),
case filelib:is_dir(D) of
@@ -648,6 +672,7 @@ try_subdir(Dir, Subdir) ->
%%
%% @doc Write the given `Text' to the file named by `Name' in directory
%% `Dir'. If the target directory does not exist, it will be created.
+%% @private
write_file(Text, Dir, Name) ->
write_file(Text, Dir, Name, '').
@@ -657,6 +682,7 @@ write_file(Text, Dir, Name) ->
%% Name::edoc:filename(), Package::atom()|string()) -> ok
%% @doc Like {@link write_file/3}, but adds path components to the target
%% directory corresponding to the specified package.
+%% @private
write_file(Text, Dir, Name, Package) ->
Dir1 = filename:join([Dir | packages:split(Package)]),
@@ -672,6 +698,7 @@ write_file(Text, Dir, Name, Package) ->
exit(error)
end.
+%% @private
write_info_file(App, Packages, Modules, Dir) ->
Ts = [{packages, Packages},
{modules, Modules}],
@@ -703,6 +730,7 @@ info_file_data(Ts) ->
%% Local file access - don't complain if file does not exist.
+%% @private
read_info_file(Dir) ->
File = filename:join(Dir, ?INFO_FILE),
case filelib:is_file(File) of
@@ -769,11 +797,13 @@ parse_terms_1([], _As, _Vs) ->
%% ---------------------------------------------------------------------
%% Source files and packages
+%% @private
find_sources(Path, Opts) ->
find_sources(Path, "", Opts).
%% @doc See {@link edoc:run/3} for a description of the options
%% `subpackages', `source_suffix' and `exclude_packages'.
+%% @private
%% NEW-OPTIONS: subpackages, source_suffix, exclude_packages
%% DEFER-OPTIONS: edoc:run/3
@@ -827,6 +857,7 @@ is_package_dir(Name, Dir) ->
is_name(filename:rootname(filename:basename(Name)))
andalso filelib:is_dir(filename:join(Dir, Name)).
+%% @private
find_file([P | Ps], Pkg, Name) ->
Dir = filename:join(P, filename:join(packages:split(Pkg))),
File = filename:join(Dir, Name),
@@ -839,6 +870,7 @@ find_file([P | Ps], Pkg, Name) ->
find_file([], _Pkg, _Name) ->
"".
+%% @private
find_doc_dirs() ->
find_doc_dirs(code:get_path()).
@@ -904,6 +936,7 @@ add_new(K, V, D) ->
%% @spec (Options::proplist()) -> edoc_env()
%% @equiv get_doc_env([], [], [], Opts)
+%% @private
get_doc_env(Opts) ->
get_doc_env([], [], [], Opts).
@@ -914,6 +947,7 @@ get_doc_env(Opts) ->
%% Modules = [atom()]
%% proplist() = [term()]
%%
+%% @type proplist() = proplists:property().
%% @type edoc_env(). Environment information needed by EDoc for
%% generating references. The data representation is not documented.
%%
@@ -952,6 +986,7 @@ get_doc_env(App, Packages, Modules, Opts) ->
%% NEW-OPTIONS: doclet
%% DEFER-OPTIONS: edoc:run/3
+%% @private
run_doclet(Fun, Opts) ->
run_plugin(doclet, ?DEFAULT_DOCLET, Fun, Opts).
@@ -961,6 +996,7 @@ run_doclet(Fun, Opts) ->
%% NEW-OPTIONS: layout
%% DEFER-OPTIONS: edoc:layout/2
+%% @private
run_layout(Fun, Opts) ->
run_plugin(layout, ?DEFAULT_LAYOUT, Fun, Opts).
diff --git a/lib/edoc/src/edoc_parser.yrl b/lib/edoc/src/edoc_parser.yrl
index 91ee5a1b2b..6943f1bdb8 100644
--- a/lib/edoc/src/edoc_parser.yrl
+++ b/lib/edoc/src/edoc_parser.yrl
@@ -24,21 +24,22 @@
%%
%% Author contact: [email protected]
%%
-%% $Id$
+%% $Id $
%%
%% =====================================================================
Nonterminals
start spec func_type utype_list utype_tuple utypes utype ptypes ptype
-nutype function_name where_defs defs def typedef etype throws qname ref
-aref mref lref pref var_list vars fields field.
+nutype function_name where_defs defs defs2 def typedef etype
+throws qname ref aref mref lref pref var_list vars fields field
+futype_list bin_base_type bin_unit_type.
Terminals
-atom float integer var string start_spec start_typedef start_throws
+atom float integer var an_var string start_spec start_typedef start_throws
start_ref
'(' ')' ',' '.' '->' '{' '}' '[' ']' '|' '+' ':' '::' '=' '/' '//' '*'
-'#' 'where'.
+'#' 'where' '<<' '>>' '..' '...'.
Rootsymbol start.
@@ -52,9 +53,9 @@ qname -> atom: [tok_val('$1')].
qname -> qname '.' atom: [tok_val('$3') | '$1'].
spec -> func_type where_defs:
- #t_spec{type = '$1', defs = lists:reverse('$2')}.
+ #t_spec{type = '$1', defs = '$2'}.
spec -> function_name func_type where_defs:
- #t_spec{name = '$1', type = '$2', defs = lists:reverse('$3')}.
+ #t_spec{name = '$1', type = '$2', defs = '$3'}.
where_defs -> 'where' defs: '$2'.
where_defs -> defs: '$1'.
@@ -66,13 +67,15 @@ func_type -> utype_list '->' utype:
%% Paired with line number, for later error reporting
-utype_list -> '(' ')' : {[], tok_line('$1')}.
utype_list -> '(' utypes ')' : {lists:reverse('$2'), tok_line('$1')}.
-utype_tuple -> '{' '}' : [].
+futype_list -> utype_list : '$1'.
+futype_list -> '(' '...' ')' : {[#t_var{name = '...'}], tok_line('$1')}.
+
utype_tuple -> '{' utypes '}' : lists:reverse('$2').
%% Produced in reverse order.
+utypes -> '$empty' : [].
utypes -> utype : ['$1'].
utypes -> utypes ',' utype : ['$3' | '$1'].
@@ -90,20 +93,25 @@ ptypes -> ptypes '|' ptype : ['$3' | '$1'].
ptype -> var : #t_var{name = tok_val('$1')}.
ptype -> atom : #t_atom{val = tok_val('$1')}.
ptype -> integer: #t_integer{val = tok_val('$1')}.
+ptype -> integer '..' integer: #t_integer_range{from = tok_val('$1'),
+ to = tok_val('$3')}.
ptype -> float: #t_float{val = tok_val('$1')}.
ptype -> utype_tuple : #t_tuple{types = '$1'}.
ptype -> '[' ']' : #t_nil{}.
ptype -> '[' utype ']' : #t_list{type = '$2'}.
+ptype -> '[' utype ',' '...' ']' : #t_nonempty_list{type = '$2'}.
ptype -> utype_list:
- if length(element(1, '$1')) == 1 ->
+ if length(element(1, '$1')) == 1 ->
%% there must be exactly one utype in the list
hd(element(1, '$1'));
+ %% Replace last line when releasing next major release:
+ %% #t_paren{type = hd(element(1, '$1'))};
length(element(1, '$1')) == 0 ->
return_error(element(2, '$1'), "syntax error before: ')'");
true ->
return_error(element(2, '$1'), "syntax error before: ','")
end.
-ptype -> utype_list '->' ptype:
+ptype -> futype_list '->' ptype:
#t_fun{args = element(1, '$1'), range = '$3'}.
ptype -> '#' atom '{' '}' :
#t_record{name = #t_atom{val = tok_val('$2')}}.
@@ -111,17 +119,45 @@ ptype -> '#' atom '{' fields '}' :
#t_record{name = #t_atom{val = tok_val('$2')},
fields = lists:reverse('$4')}.
ptype -> atom utype_list:
- #t_type{name = #t_name{name = tok_val('$1')},
- args = element(1, '$2')}.
-ptype -> qname ':' atom utype_list :
+ case {tok_val('$1'), element(1, '$2')} of
+ {nil, []} ->
+ %% Prefer '[]' before 'nil(). Due to
+ %% compatibility with Erlang types, which do not
+ %% separate '[]' from 'nil()'.
+ #t_nil{};
+ {list, [T]} ->
+ %% Prefer '[T]' before 'list(T). Due to
+ %% compatibility with Erlang types, which do not
+ %% separate '[T]' from 'list(T)'.
+ #t_list{type = T};
+ {'fun', [#t_fun{}=Fun]} ->
+ %% An incompatible change as compared to EDOc 0.7.6.6.
+ %% Due to compatibility with Erlang types.
+ Fun;
+ {'fun', []} ->
+ #t_type{name = #t_name{name = function}};
+ {Name, Args} ->
+ #t_type{name = #t_name{name = Name},
+ args = Args}
+ end.
+ptype -> qname ':' atom utype_list :
#t_type{name = #t_name{module = qname('$1'),
name = tok_val('$3')},
args = element(1, '$4')}.
-ptype -> '//' atom '/' qname ':' atom utype_list :
+ptype -> '//' atom '/' qname ':' atom utype_list :
#t_type{name = #t_name{app = tok_val('$2'),
module = qname('$4'),
name = tok_val('$6')},
args = element(1, '$7')}.
+ptype -> '<<' '>>' : #t_binary{}.
+ptype -> '<<' bin_base_type '>>' : #t_binary{base_size = '$2'}.
+ptype -> '<<' bin_unit_type '>>' : #t_binary{unit_size = '$2'}.
+ptype -> '<<' bin_base_type ',' bin_unit_type '>>' :
+ #t_binary{base_size = '$2', unit_size = '$4'}.
+
+bin_base_type -> an_var ':' integer: tok_val('$3').
+
+bin_unit_type -> an_var ':' an_var '*' integer : tok_val('$5').
%% Produced in reverse order.
fields -> field : ['$1'].
@@ -130,18 +166,19 @@ fields -> fields ',' field : ['$3' | '$1'].
field -> atom '=' utype :
#t_field{name = #t_atom{val = tok_val('$1')}, type = '$3'}.
-%% Produced in reverse order.
defs -> '$empty' : [].
-defs -> defs def : ['$2' | '$1'].
-defs -> defs ',' def : ['$3' | '$1'].
+defs -> def defs2 : ['$1' | lists:reverse('$2')].
+
+%% Produced in reverse order.
+defs2 -> '$empty' : [].
+defs2 -> defs2 def : ['$2' | '$1'].
+defs2 -> defs2 ',' def : ['$3' | '$1'].
def -> var '=' utype:
#t_def{name = #t_var{name = tok_val('$1')},
type = '$3'}.
-def -> atom var_list '=' utype:
- #t_def{name = #t_type{name = #t_name{name = tok_val('$1')},
- args = '$2'},
- type = '$4'}.
+def -> atom '(' utypes ')' '=' utype:
+ build_def(tok_val('$1'), '$2', '$3', '$6').
var_list -> '(' ')' : [].
var_list -> '(' vars ')' : lists:reverse('$2').
@@ -153,12 +190,12 @@ vars -> vars ',' var : [#t_var{name = tok_val('$3')} | '$1'].
typedef -> atom var_list where_defs:
#t_typedef{name = #t_name{name = tok_val('$1')},
args = '$2',
- defs = lists:reverse('$3')}.
+ defs = '$3'}.
typedef -> atom var_list '=' utype where_defs:
#t_typedef{name = #t_name{name = tok_val('$1')},
args = '$2',
type = '$4',
- defs = lists:reverse('$5')}.
+ defs = '$5'}.
%% References
@@ -195,7 +232,7 @@ etype -> utype: '$1'.
throws -> etype where_defs:
#t_throws{type = '$1',
- defs = lists:reverse('$2')}.
+ defs = '$2'}.
%% (commented out for now)
%% Header
@@ -297,7 +334,22 @@ union(Ts) ->
end.
annotate(T, A) -> ?add_t_ann(T, A).
-
+
+build_def(S, P, As, T) ->
+ case all_vars(As) of
+ true ->
+ #t_def{name = #t_type{name = #t_name{name = S},
+ args = lists:reverse(As)},
+ type = T};
+ false ->
+ return_error(element(2, P), "variable expected after '('")
+ end.
+
+all_vars([#t_var{} | As]) ->
+ all_vars(As);
+all_vars(As) ->
+ As =:= [].
+
%% ---------------------------------------------------------------------
%% @doc EDoc type specification parsing. Parses the content of
@@ -379,7 +431,7 @@ parse_param(S, L) ->
{S1, S2} = edoc_lib:split_at_space(edoc_lib:strip_space(S)),
case edoc_lib:strip_space(S1) of
"" -> throw_error(parse_param, L);
- Name ->
+ Name ->
Text = edoc_lib:strip_space(S2),
{list_to_atom(Name), edoc_wiki:parse_xml(Text, L)}
end.
diff --git a/lib/edoc/src/edoc_refs.erl b/lib/edoc/src/edoc_refs.erl
index edc30674c0..b974cf77c1 100644
--- a/lib/edoc/src/edoc_refs.erl
+++ b/lib/edoc/src/edoc_refs.erl
@@ -19,7 +19,7 @@
%% @author Richard Carlsson <[email protected]>
%% @see edoc
%% @see edoc_parse_ref
-%% @end
+%% @end
%% =====================================================================
%% @doc Representation and handling of EDoc object references. See
diff --git a/lib/edoc/src/edoc_scanner.erl b/lib/edoc/src/edoc_scanner.erl
index d3dff64682..9d2e6f3aed 100644
--- a/lib/edoc/src/edoc_scanner.erl
+++ b/lib/edoc/src/edoc_scanner.erl
@@ -3,24 +3,24 @@
%% 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 via the world wide web 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.
-%%
+%%
%% The Initial Developer of the Original Code is Ericsson Utvecklings
%% AB. Portions created by Ericsson are Copyright 1999, Ericsson
%% Utvecklings AB. All Rights Reserved.''
%%
-%% $Id$
+%% $Id: $
%%
%% @private
%% @copyright Richard Carlsson 2001-2003. Portions created by Ericsson
%% are Copyright 1999, Ericsson Utvecklings AB. All Rights Reserved.
%% @author Richard Carlsson <[email protected]>
%% @see edoc
-%% @end
+%% @end
%% @doc Tokeniser for EDoc. Based on the Erlang standard library module
%% {@link //stdlib/erl_scan}.
@@ -139,13 +139,21 @@ scan1([$"|Cs0], Toks, Pos) -> % String
scan_error({illegal, string}, Pos)
end;
%% Punctuation characters and operators, first recognise multiples.
+scan1([$<,$<|Cs], Toks, Pos) ->
+ scan1(Cs, [{'<<',Pos}|Toks], Pos);
+scan1([$>,$>|Cs], Toks, Pos) ->
+ scan1(Cs, [{'>>',Pos}|Toks], Pos);
scan1([$-,$>|Cs], Toks, Pos) ->
scan1(Cs, [{'->',Pos}|Toks], Pos);
scan1([$:,$:|Cs], Toks, Pos) ->
scan1(Cs, [{'::',Pos}|Toks], Pos);
scan1([$/,$/|Cs], Toks, Pos) ->
scan1(Cs, [{'//',Pos}|Toks], Pos);
-scan1([C|Cs], Toks, Pos) -> % Punctuation character
+scan1([$.,$.,$.|Cs], Toks, Pos) ->
+ scan1(Cs, [{'...',Pos}|Toks], Pos);
+scan1([$.,$.|Cs], Toks, Pos) ->
+ scan1(Cs, [{'..',Pos}|Toks], Pos);
+scan1([C|Cs], Toks, Pos) -> % Punctuation character
P = list_to_atom([C]),
scan1(Cs, [{P,Pos}|Toks], Pos);
scan1([], Toks0, _Pos) ->
@@ -158,7 +166,7 @@ scan_variable(C, Cs, Toks, Pos) ->
W = [C|reverse(Wcs)],
case W of
"_" ->
- scan_error({illegal,token}, Pos);
+ scan1(Cs1, [{an_var,Pos,'_'}|Toks], Pos);
_ ->
case catch list_to_atom(W) of
A when is_atom(A) ->
@@ -318,7 +326,7 @@ scan_integer(Cs, Stack, Pos) ->
scan_after_int([$.,C|Cs0], Ncs0, Toks, SPos, CPos) when C >= $0, C =< $9 ->
{Ncs,Cs,CPos1} = scan_integer(Cs0, [C,$.|Ncs0], CPos),
- scan_after_fraction(Cs, Ncs, Toks, SPos, CPos1);
+ scan_after_fraction(Cs, Ncs, Toks, SPos, CPos1);
scan_after_int(Cs, Ncs, Toks, SPos, CPos) ->
N = list_to_integer(reverse(Ncs)),
scan1(Cs, [{integer,SPos,N}|Toks], CPos).
diff --git a/lib/edoc/src/edoc_specs.erl b/lib/edoc/src/edoc_specs.erl
new file mode 100644
index 0000000000..45016ef85a
--- /dev/null
+++ b/lib/edoc/src/edoc_specs.erl
@@ -0,0 +1,603 @@
+%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1996-2011. 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%
+
+%% @doc EDoc interface to Erlang specifications and types.
+
+-module(edoc_specs).
+
+-export([type/2, spec/2, dummy_spec/1, docs/2]).
+
+-export([add_data/4, tag/1, is_tag/1]).
+
+-include("edoc.hrl").
+-include("edoc_types.hrl").
+
+-type proplist() :: [proplists:property()].
+-type syntaxTree() :: erl_syntax:syntaxTree().
+
+-define(TOP_TYPE, term).
+
+%%
+%% Exported functions
+%%
+
+-spec type(Form::syntaxTree(), TypeDocs::dict()) -> #tag{}.
+
+%% @doc Convert an Erlang type to EDoc representation.
+%% TypeDocs is a dict of {Name, Doc}.
+%% Note: #t_typedef.name is set to {record, R} for record types.
+type(Form, TypeDocs) ->
+ {Name, Data0} = erl_syntax_lib:analyze_wild_attribute(Form),
+ type = tag(Name),
+ {TypeName, Type, Args, Doc} =
+ case Data0 of
+ {{record, R}, Fs, []} ->
+ L = erl_syntax:get_pos(Form),
+ {{record, R}, {type, L, record, [{atom,L,R} | Fs]}, [], ""};
+ {N,T,As} ->
+ Doc0 =
+ case dict:find({N, length(As)}, TypeDocs) of
+ {ok, Doc1} ->
+ Doc1;
+ error ->
+ ""
+ end,
+ {#t_name{name = N}, T, As, Doc0}
+ end,
+ #tag{name = type, line = element(2, Type),
+ origin = code,
+ data = {#t_typedef{name = TypeName,
+ args = d2e(Args),
+ type = d2e(opaque2abstr(Name, Type))},
+ Doc}}.
+
+-spec spec(Form::syntaxTree(), ClauseN::pos_integer()) -> #tag{}.
+
+%% @doc Convert an Erlang spec to EDoc representation.
+spec(Form, Clause) ->
+ {Name, _Arity, TypeSpecs} = get_spec(Form),
+ TypeSpec = lists:nth(Clause, TypeSpecs),
+ #tag{name = spec, line = element(2, TypeSpec),
+ origin = code,
+ data = aspec(d2e(TypeSpec), Name)}.
+
+-spec dummy_spec(Form::syntaxTree()) -> #tag{}.
+
+%% @doc Create a #tag{} record where data is a string with the name of
+%% the given Erlang spec and an empty list of arguments.
+dummy_spec(Form) ->
+ {#t_name{name = Name}, Arity, TypeSpecs} = get_spec(Form),
+ As = string:join(lists:duplicate(Arity, "_X"), ","),
+ S = lists:flatten(io_lib:format("~p(~s) -> true\n", [Name, As])),
+ #tag{name = spec, line = element(2, hd(TypeSpecs)),
+ origin = code, data = S}.
+
+-spec docs(Forms::[syntaxTree()], CommentFun) -> dict() when
+ CommentFun :: fun(([syntaxTree()], Line :: term()) -> #tag{}).
+
+%% @doc Find comments after -type/-opaque declarations.
+%% Postcomments "inside" the type are skipped.
+docs(Forms, CommentFun) ->
+ find_type_docs(Forms, [], CommentFun).
+
+-type entry() :: #entry{}.
+-type module_info() :: #module{}.
+-type entries() :: [entry()].
+-spec add_data(Entries::entries(), Options::proplist(),
+ File::file:filename(), Module::module_info()) -> entries().
+
+%% @doc Create tags a la EDoc for Erlang specifications and types.
+%% Exported types and types used (indirectly) by Erlang specs are
+%% added to the entries.
+add_data(Entries, Opts, File, Module) ->
+ TypeDefs0 = espec_types(Entries),
+ TypeTable = ets:new(etypes, [ordered_set]),
+ Es1 = expand_records(Entries, TypeDefs0, TypeTable, Opts, File, Module),
+ Es = [use_tags(E, TypeTable) || E <- Es1],
+ true = ets:delete(TypeTable),
+ Es.
+
+%%
+%% Local functions
+%%
+
+aspec(#t_spec{}=Spec, Name) ->
+ Spec#t_spec{name = Name};
+aspec(Type, Name) ->
+ #t_spec{name = Name, type = Type}.
+
+get_spec(Form) ->
+ {spec, Data0} = erl_syntax_lib:analyze_wild_attribute(Form),
+ case Data0 of
+ {{F,A}, D} ->
+ {#t_name{name = F}, A, D};
+ {{M,F,A}, D} ->
+ {#t_name{module = M, name = F}, A, D}
+ end.
+
+find_type_docs([], Cs, _Fun) ->
+ dict:from_list(Cs);
+find_type_docs([F | Fs], Cs, Fun) ->
+ try get_name_and_last_line(F) of
+ {Name, LastTypeLine} ->
+ C0 = erl_syntax:comment(["% @type f(). "]),
+ C1 = erl_syntax:set_pos(C0, LastTypeLine),
+ %% Postcomments before the dot after the typespec are ignored.
+ C2 = [C1 | [C ||
+ C <- erl_syntax:get_postcomments(F),
+ get_line(erl_syntax:get_pos(C)) >= LastTypeLine]],
+ C3 = collect_comments(Fs, LastTypeLine),
+ #tag{data = Doc0} = Fun(lists:reverse(C2 ++ C3), LastTypeLine),
+ case strip(Doc0) of % Strip away "f(). \n"
+ "" ->
+ find_type_docs(Fs, Cs, Fun);
+ Doc ->
+ W = edoc_wiki:parse_xml(Doc, LastTypeLine),
+ find_type_docs(Fs, [{Name, W}|Cs], Fun)
+ end
+ catch _:_ ->
+ find_type_docs(Fs, Cs, Fun)
+ end.
+
+collect_comments([], _Line) ->
+ [];
+collect_comments([F | Fs], Line) ->
+ L1 = get_line(erl_syntax:get_pos(F)),
+ if
+ L1 =:= Line + 1;
+ L1 =:= Line -> % a separate postcomment
+ case is_comment(F) of
+ true ->
+ [F | collect_comments(Fs, L1)];
+ false ->
+ []
+ end;
+ true ->
+ []
+ end.
+%% Note: there is a creepy bug concerning an include file terminated
+%% by a -type attribute and the include statement is followed by a
+%% comment (which is not meant to be documentation of the type).
+
+is_comment(F) ->
+ erl_syntax_lib:analyze_form(F) =:= comment.
+
+strip("") ->
+ "";
+strip([$\n | S]) ->
+ S;
+strip([_ | S]) ->
+ strip(S).
+
+%% Find the type name and the greatest line number of a type spec.
+%% Should use syntax_tools but this has to do for now.
+get_name_and_last_line(F) ->
+ {Name, Data} = erl_syntax_lib:analyze_wild_attribute(F),
+ type = edoc_specs:tag(Name),
+ Attr = {attribute, erl_syntax:get_pos(F), Name, Data},
+ Ref = make_ref(),
+ Fun = fun(L) -> {Ref, get_line(L)} end,
+ TypeName = case Data of
+ {N, _T, As} when is_atom(N) -> % skip records
+ {N, length(As)}
+ end,
+ Line = gll(erl_lint:modify_line(Attr, Fun), Ref),
+ {TypeName, Line}.
+
+gll({Ref, Line}, Ref) ->
+ Line;
+gll([], _Ref) ->
+ 0;
+gll(List, Ref) when is_list(List) ->
+ lists:max([gll(E, Ref) || E <- List]);
+gll(Tuple, Ref) when is_tuple(Tuple) ->
+ gll(tuple_to_list(Tuple), Ref);
+gll(_, _) ->
+ 0.
+
+get_line(Pos) ->
+ {line, Line} = erl_scan:attributes_info(Pos, line),
+ Line.
+
+%% Collect all Erlang types. Types in comments (@type) shadow Erlang
+%% types (-spec/-opaque).
+espec_types(Entries) ->
+ Tags = get_all_tags(Entries),
+ CommTs = [type_name(T) ||
+ #tag{name = type, origin = comment}=T <- Tags],
+ CT = sets:from_list(CommTs),
+ [T || #tag{name = Name, origin = code}=T <- Tags,
+ tag(Name) =:= type,
+ not sets:is_element(type_name(T), CT)].
+
+get_all_tags(Es) ->
+ lists:flatmap(fun (#entry{data = Ts}) -> Ts end, Es).
+
+%% Turns an opaque type into an abstract datatype.
+%% Note: top level annotation is ignored.
+opaque2abstr(opaque, _T) -> undefined;
+opaque2abstr(type, T) -> T.
+
+%% Replaces the parameters extracted from the source (by
+%% edoc_extract:parameters/1) by annotations and variable names, using
+%% the source parameters as default values
+%% Selects seen types (exported types, types used by specs),
+%% skips records and unused types.
+use_tags(#entry{data = Ts}=E, TypeTable) ->
+ use_tags(Ts, E, TypeTable, []).
+
+use_tags([], E, _TypeTable, NTs) ->
+ E#entry{data = lists:reverse(NTs)};
+use_tags([#tag{origin = code}=T | Ts], E, TypeTable, NTs) ->
+ case tag(T#tag.name) of
+ spec ->
+ Args = params(T, E#entry.args),
+ use_tags(Ts, E#entry{args = Args}, TypeTable, [T | NTs]);
+ type ->
+ TypeName = type_name(T),
+ case ets:lookup(TypeTable, TypeName) of
+ [{{{record,_},_},_,_}] ->
+ use_tags(Ts, E, TypeTable, NTs);
+ [{_,_,not_seen}] ->
+ use_tags(Ts, E, TypeTable, NTs);
+ [] ->
+ use_tags(Ts, E, TypeTable, NTs);
+ [{TypeName, Tag, seen}] ->
+ use_tags(Ts, E, TypeTable, [Tag | NTs])
+ end
+ end;
+use_tags([T | Ts], E, TypeTable, NTs) ->
+ use_tags(Ts, E, TypeTable, [T | NTs]).
+
+params(#tag{name = spec, data=#t_spec{type = #t_fun{args = As}}}, Default) ->
+ parms(As, Default).
+
+parms([], []) ->
+ [];
+parms([A | As], [D | Ds]) ->
+ [param(A, D) | parms(As, Ds)].
+
+param(#t_list{type = Type}, Default) ->
+ param(Type, Default);
+param(#t_paren{type = Type}, Default) ->
+ param(Type, Default);
+param(#t_nonempty_list{type = Type}, Default) ->
+ param(Type, Default);
+param(#t_record{name = #t_atom{val = Name}}, _Default) ->
+ list_to_atom(capitalize(atom_to_list(Name)));
+param(T, Default) ->
+ arg_name(?t_ann(T), Default).
+
+capitalize([C | Cs]) when C >= $a, C =< $z -> [C - 32 | Cs];
+capitalize(Cs) -> Cs.
+
+%% Like edoc_types:arg_name/1
+arg_name([], Default) ->
+ Default;
+arg_name([A | As], Default) ->
+ case is_name(A) of
+ true -> A;
+ false -> arg_name(As, Default)
+ end.
+
+is_name(A) ->
+ is_atom(A).
+
+d2e({ann_type,_,[V, T0]}) ->
+ %% Note: the -spec/-type syntax allows annotations everywhere, but
+ %% EDoc does not. The fact that the annotation is added to the
+ %% type here does not necessarily mean that it will be used by the
+ %% layout module.
+ T = d2e(T0),
+ ?add_t_ann(T, element(3, V));
+d2e({type,_,no_return,[]}) ->
+ #t_type{name = #t_name{name = none}};
+d2e({remote_type,_,[{atom,_,M},{atom,_,F},Ts0]}) ->
+ Ts = d2e(Ts0),
+ typevar_anno(#t_type{name = #t_name{module = M, name = F}, args = Ts}, Ts);
+d2e({type,_,'fun',[{type,_,product,As0},Ran0]}) ->
+ Ts = [Ran|As] = d2e([Ran0|As0]),
+ %% Assume that the linter has checked type variables.
+ typevar_anno(#t_fun{args = As, range = Ran}, Ts);
+d2e({type,_,'fun',[A0={type,_,any},Ran0]}) ->
+ Ts = [A, Ran] = d2e([A0, Ran0]),
+ typevar_anno(#t_fun{args = [A], range = Ran}, Ts);
+d2e({type,_,'fun',[]}) ->
+ #t_type{name = #t_name{name = function}, args = []};
+d2e({type,_,any}) ->
+ #t_var{name = '...'}; % Kludge... not a type variable!
+d2e({type,_,nil,[]}) ->
+ #t_nil{};
+d2e({paren_type,_,[T]}) ->
+ #t_paren{type = d2e(T)};
+d2e({type,_,list,[T0]}) ->
+ T = d2e(T0),
+ typevar_anno(#t_list{type = T}, [T]);
+d2e({type,_,nonempty_list,[T0]}) ->
+ T = d2e(T0),
+ typevar_anno(#t_nonempty_list{type = T}, [T]);
+d2e({type,_,bounded_fun,[T,Gs]}) ->
+ [F0|Defs] = d2e([T|Gs]),
+ F = ?set_t_ann(F0, lists:keydelete(type_variables, 1, ?t_ann(F0))),
+ %% Assume that the linter has checked type variables.
+ #t_spec{type = typevar_anno(F, [F0]), defs = Defs};
+d2e({type,_,range,[V1,V2]}) ->
+ {integer,_,I1} = erl_eval:partial_eval(V1),
+ {integer,_,I2} = erl_eval:partial_eval(V2),
+ #t_integer_range{from = I1, to = I2};
+d2e({type,_,constraint,[Sub,Ts0]}) ->
+ case {Sub,Ts0} of
+ {{atom,_,is_subtype},[{var,_,N},T0]} ->
+ Ts = [T] = d2e([T0]),
+ #t_def{name = #t_var{name = N}, type = typevar_anno(T, Ts)};
+ {{atom,_,is_subtype},[ST0,T0]} ->
+ %% Should not happen.
+ Ts = [ST,T] = d2e([ST0,T0]),
+ #t_def{name = ST, type = typevar_anno(T, Ts)};
+ _ ->
+ throw_error(element(2, Sub), "cannot handle guard", [])
+ end;
+d2e({type,_,union,Ts0}) ->
+ Ts = d2e(Ts0),
+ typevar_anno(#t_union{types = Ts}, Ts);
+d2e({type,_,tuple,any}) ->
+ #t_type{name = #t_name{name = tuple}, args = []};
+d2e({type,_,binary,[Base,Unit]}) ->
+ #t_binary{base_size = element(3, Base),
+ unit_size = element(3, Unit)};
+d2e({type,_,tuple,Ts0}) ->
+ Ts = d2e(Ts0),
+ typevar_anno(#t_tuple{types = Ts}, Ts);
+d2e({type,_,record,[Name|Fs0]}) ->
+ Atom = #t_atom{val = element(3, Name)},
+ Fs = d2e(Fs0),
+ typevar_anno(#t_record{name = Atom, fields = Fs}, Fs);
+d2e({type,_,field_type,[Name,Type0]}) ->
+ Type = d2e(Type0),
+ typevar_anno(#t_field{name = #t_atom{val = element(3, Name)}, type = Type},
+ [Type]);
+d2e({typed_record_field,{record_field,L,Name},Type}) ->
+ d2e({type,L,field_type,[Name,Type]});
+d2e({typed_record_field,{record_field,L,Name,_E},Type}) ->
+ d2e({type,L,field_type,[Name,Type]});
+d2e({record_field,L,_Name,_E}=F) ->
+ d2e({typed_record_field,F,{type,L,any,[]}}); % Maybe skip...
+d2e({record_field,L,_Name}=F) ->
+ d2e({typed_record_field,F,{type,L,any,[]}}); % Maybe skip...
+d2e({type,_,Name,Types0}) ->
+ Types = d2e(Types0),
+ typevar_anno(#t_type{name = #t_name{name = Name}, args = Types}, Types);
+d2e({var,_,'_'}) ->
+ #t_type{name = #t_name{name = ?TOP_TYPE}};
+d2e({var,_,TypeName}) ->
+ TypeVar = ordsets:from_list([TypeName]),
+ T = #t_var{name = TypeName},
+ %% Annotate type variables with the name of the variable.
+ %% Doing so will stop edoc_layout (and possibly other layout modules)
+ %% from using the argument name from the source or to invent a new name.
+ T1 = ?add_t_ann(T, {type_variables, TypeVar}),
+ ?add_t_ann(T1, TypeName);
+d2e(L) when is_list(L) ->
+ [d2e(T) || T <- L];
+d2e({atom,_,A}) ->
+ #t_atom{val = A};
+d2e(undefined = U) -> % opaque
+ U;
+d2e(Expr) ->
+ {integer,_,I} = erl_eval:partial_eval(Expr),
+ #t_integer{val = I}.
+
+%% A type annotation (a tuple; neither an atom nor a list).
+typevar_anno(Type, Ts) ->
+ Vs = typevars(Ts),
+ case ordsets:to_list(Vs) of
+ [] -> Type;
+ _ -> ?add_t_ann(Type, {type_variables, Vs})
+ end.
+
+typevars(Ts) ->
+ ordsets:union(get_typevars(Ts)).
+
+get_typevars(Ts) ->
+ [Vs || T <- Ts, T =/= undefined, {type_variables, Vs} <- ?t_ann(T)].
+
+-record(parms, {tab, warn, file, line}).
+
+%% Expands record references. Explicitly given record fields are kept,
+%% but otherwise the fields from the record definition are substituted
+%% for the reference. The reason is that there are no record types.
+%% It is recommended to introduce types like "r() :: r{}" and then use
+%% r() everywhere. The right hand side, r{}, is expanded in order to
+%% show all fields.
+%% Returns updated types in the ETS table DT.
+expand_records(Entries, TypeDefs, DT, Opts, File, Module) ->
+ TypeList = [{type_name(T), T, not_seen} || T <- TypeDefs],
+ true = ets:insert(DT, TypeList),
+ Warn = proplists:get_value(report_missing_type, Opts,
+ ?REPORT_MISSING_TYPE) =:= true,
+ P = #parms{tab = DT, warn = Warn, file = File, line = 0},
+ ExportedTypes = [Name ||
+ {export_type,Ts} <- Module#module.attributes,
+ is_list(Ts),
+ {N,I} <- Ts,
+ ets:member(DT, Name = {#t_name{name = N}, I})],
+ _ = lists:foreach(fun({N,A}) -> true = seen_type(N, A, P)
+ end, ExportedTypes),
+ entries(Entries, P, Opts).
+
+entries([E0 | Es], P, Opts) ->
+ E = case edoc_data:hidden_filter([E0], Opts) of
+ [] ->
+ E0;
+ [_] ->
+ E0#entry{data = specs(E0#entry.data, P)}
+ end,
+ [E | entries(Es, P, Opts)];
+entries([], _P, _Opts) ->
+ [].
+
+specs([#tag{line = L, name = spec, origin = code, data = Spec}=Tag0 | Tags],
+ P0) ->
+ #t_spec{type = Type0, defs = Defs0} = Spec,
+ P = P0#parms{line = L},
+ Type = xrecs(Type0, P),
+ Defs = xrecs(Defs0, P),
+ Tag = Tag0#tag{data = Spec#t_spec{type = Type, defs = Defs}},
+ [Tag | specs(Tags, P)];
+specs([Tag | Tags], P) ->
+ [Tag | specs(Tags, P)];
+specs([], _P) ->
+ [].
+
+xrecs(#t_def{type = Type0}=T, P) ->
+ Type = xrecs(Type0, P),
+ T#t_def{type = Type};
+xrecs(#t_type{name = Name, args = Args0}=T, P) ->
+ Args = xrecs(Args0, P),
+ NArgs = length(Args),
+ true = seen_type(Name, NArgs, P),
+ T#t_type{args = Args};
+xrecs(#t_var{}=T, _P) ->
+ T;
+xrecs(#t_fun{args = Args0, range = Range0}=T, P) ->
+ Args = xrecs(Args0, P),
+ Range = xrecs(Range0, P),
+ T#t_fun{args = Args, range = Range};
+xrecs(#t_tuple{types = Types0}=T, P) ->
+ Types = xrecs(Types0, P),
+ T#t_tuple{types = Types};
+xrecs(#t_list{type = Type0}=T, P) ->
+ Type = xrecs(Type0, P),
+ T#t_list{type = Type};
+xrecs(#t_nil{}=T, _P) ->
+ T;
+xrecs(#t_paren{type = Type0}=T, P) ->
+ Type = xrecs(Type0, P),
+ T#t_paren{type = Type};
+xrecs(#t_nonempty_list{type = Type0}=T, P) ->
+ Type = xrecs(Type0, P),
+ T#t_nonempty_list{type = Type};
+xrecs(#t_atom{}=T, _P) ->
+ T;
+xrecs(#t_integer{}=T, _P) ->
+ T;
+xrecs(#t_integer_range{}=T, _P) ->
+ T;
+xrecs(#t_binary{}=T, _P) ->
+ T;
+xrecs(#t_float{}=T, _P) ->
+ T;
+xrecs(#t_union{types = Types0}=T, P) ->
+ Types = xrecs(Types0, P),
+ T#t_union{types = Types};
+xrecs(#t_record{fields = Fields0}=T, P) ->
+ Fields1 = xrecs(Fields0, P),
+ #t_record{name = #t_atom{val = Name}} = T,
+ RName = {record, Name},
+ true = seen_type(RName, 0, P),
+ Fields = select_fields(Fields1, RName, P#parms.tab),
+ T#t_record{fields = Fields};
+xrecs(#t_field{type = Type0}=T, P) ->
+ Type = xrecs(Type0, P),
+ T#t_field{type = Type};
+xrecs(undefined=T, _P) -> % opaque
+ T;
+xrecs([]=T, _P) ->
+ T;
+xrecs([E0 | Es0], P) ->
+ [xrecs(E0, P) | xrecs(Es0, P)].
+
+seen_type(N, NArgs, P) ->
+ TypeName = {N, NArgs},
+ #parms{tab = DT} = P,
+ case {ets:lookup(DT, TypeName), N} of
+ {[{TypeName, _, seen}], _} ->
+ true;
+ {[{TypeName, TagType, not_seen}], _} when N#t_name.module =:= [] ->
+ expand_datatype(TagType, proper_type, DT, P);
+ {[{TypeName, TagType, not_seen}], {record, _}} ->
+ expand_datatype(TagType, record_type, DT, P);
+ {[], {record, R}} ->
+ #parms{warn = W, line = L, file = File} = P,
+ [edoc_report:warning(L, File, "reference to untyped record ~w",
+ [R]) || W],
+ ets:insert(DT, {TypeName, fake, seen});
+ {[], _} -> % External type or missing type.
+ true
+ end.
+
+expand_datatype(Tag0, Kind, DT, P0) ->
+ #tag{line = L, data = {T0, Doc}} = Tag0,
+ #t_typedef{type = Type0, defs = []} = T0,
+ TypeName = type_name(Tag0),
+ true = ets:update_element(DT, TypeName, {3, seen}),
+ P = P0#parms{line = L},
+ Type = case Kind of
+ record_type ->
+ #t_record{fields = Fields0} = Type0,
+ Fields = xrecs(Fields0, P),
+ Type0#t_record{fields = Fields};
+ proper_type ->
+ xrecs(Type0, P)
+ end,
+ Tag = Tag0#tag{data={T0#t_typedef{type=Type}, Doc}},
+ ets:insert(DT, {TypeName, Tag, seen}).
+
+select_fields(Fields, Name, DT) ->
+ RecordName = {Name, 0},
+ case ets:lookup(DT, RecordName) of
+ [{RecordName, fake, seen}] ->
+ Fields;
+ [{RecordName, #tag{data = {T, _Doc}}, seen}] ->
+ #t_typedef{args = [], type = #t_record{fields = Fs}, defs = []}=T,
+ [find_field(F, Fields) || F <- Fs]
+ end.
+
+find_field(F, Fs) ->
+ case lists:keyfind(F#t_field.name, #t_field.name, Fs) of
+ false -> F;
+ NF -> NF
+ end.
+
+type_name(#tag{name = type,
+ data = {#t_typedef{name = Name, args = As},_}}) ->
+ {Name, length(As)}.
+
+%% @doc Return `true' if `Tag' is one of the specification and type
+%% attribute tags recognized by the Erlang compiler.
+
+-spec is_tag(Tag::atom()) -> boolean().
+
+is_tag(opaque) -> true;
+is_tag(spec) -> true;
+is_tag(type) -> true;
+is_tag(_) -> false.
+
+%% @doc Return the kind of the attribute tag.
+
+-type tag_kind() :: 'type' | 'spec' | 'unknown'.
+-spec tag(Tag::atom()) -> tag_kind().
+
+tag(opaque) -> type;
+tag(spec) -> spec;
+tag(type) -> type;
+tag(_) -> unknown.
+
+throw_error(Line, S, A) ->
+ edoc_report:error(Line, "", io_lib:format(S, A)),
+ throw(error).
diff --git a/lib/edoc/src/edoc_tags.erl b/lib/edoc/src/edoc_tags.erl
index c0b861e08a..def39ee34c 100644
--- a/lib/edoc/src/edoc_tags.erl
+++ b/lib/edoc/src/edoc_tags.erl
@@ -31,7 +31,8 @@
-module(edoc_tags).
-export([tags/0, tags/1, tag_names/0, tag_parsers/0, scan_lines/2,
- filter_tags/3, check_tags/4, parse_tags/4]).
+ filter_tags/2, filter_tags/3, check_tags/4, parse_tags/4,
+ check_types/3]).
-import(edoc_report, [report/4, warning/4, error/3]).
@@ -201,6 +202,9 @@ append_lines([]) -> [].
%% Filtering out unknown tags.
+filter_tags(Ts, Tags) ->
+ filter_tags(Ts, Tags, no).
+
filter_tags(Ts, Tags, Where) ->
filter_tags(Ts, Tags, Where, []).
@@ -211,7 +215,8 @@ filter_tags([#tag{name = N, line = L} = T | Ts], Tags, Where, Ts1) ->
true ->
filter_tags(Ts, Tags, Where, [T | Ts1]);
false ->
- warning(L, Where, "tag @~s not recognized.", [N]),
+ [warning(L, Where, "tag @~s not recognized.", [N]) ||
+ Where =/= no],
filter_tags(Ts, Tags, Where, Ts1)
end;
filter_tags([], _, _, Ts) ->
@@ -320,12 +325,24 @@ parse_contact(Data, Line, _Env, _Where) ->
Info
end.
-parse_typedef(Data, Line, _Env, _Where) ->
+parse_typedef(Data, Line, _Env, Where) ->
Def = edoc_parser:parse_typedef(Data, Line),
- {#t_typedef{name = #t_name{name = T}}, _} = Def,
- case edoc_types:is_predefined(T) of
+ {#t_typedef{name = #t_name{name = T}, args = As}, _} = Def,
+ NAs = length(As),
+ case edoc_types:is_predefined(T, NAs) of
true ->
- throw_error(Line, {"redefining built-in type '~w'.", [T]});
+ case
+ edoc_types:is_new_predefined(T, NAs)
+ orelse edoc_types:is_predefined_otp_type(T, NAs)
+ of
+ false ->
+ throw_error(Line, {"redefining built-in type '~w'.",
+ [T]});
+ true ->
+ warning(Line, Where, "redefining built-in type '~w'.",
+ [T]),
+ Def
+ end;
false ->
Def
end.
@@ -384,3 +401,107 @@ throw_error(L, file_not_string) ->
throw_error(L, "expected file name as a string");
throw_error(L, D) ->
throw({error, L, D}).
+
+%% Checks local types.
+
+-record(parms, {tab, warn, file, line}).
+
+check_types(Entries0, Opts, File) ->
+ Entries = edoc_data:hidden_filter(Entries0, Opts),
+ Tags = edoc_data:get_all_tags(Entries),
+ DT = ets:new(types, [bag]),
+ _ = [add_type(DT, Name, As, File, Line) ||
+ #tag{line = Line,
+ data = {#t_typedef{name = Name, args = As},_}} <- Tags],
+ Warn = proplists:get_value(report_missing_type, Opts,
+ ?REPORT_MISSING_TYPE) =:= true,
+ P = #parms{tab = DT, warn = Warn, file = File, line = 0},
+ try check_types(Tags, P)
+ after true = ets:delete(DT)
+ end.
+
+add_type(DT, Name, Args, File, Line) ->
+ NArgs = length(Args),
+ TypeName = {Name, NArgs},
+ case lists:member(TypeName, ets:lookup(DT, Name)) of
+ true ->
+ #t_name{name = N} = Name,
+ type_warning(Line, File, "duplicated type", N, NArgs);
+ false ->
+ ets:insert(DT, {Name, NArgs})
+ end.
+
+check_types([], _P)->
+ ok;
+check_types([Tag | Tags], P) ->
+ check_type(Tag, P, Tags).
+
+check_type(#tag{line = L, data = Data}, P0, Ts) ->
+ P = P0#parms{line = L},
+ case Data of
+ {#t_typedef{type = Type, defs = Defs},_} ->
+ check_type(Type, P, Defs++Ts);
+ #t_spec{type = Type, defs = Defs} ->
+ check_type(Type, P, Defs++Ts);
+ _->
+ check_types(Ts, P0)
+ end;
+check_type(#t_def{type = Type}, P, Ts) ->
+ check_type(Type, P, Ts);
+check_type(#t_type{name = Name, args = Args}, P, Ts) ->
+ check_used_type(Name, Args, P),
+ check_types(Args++Ts, P);
+check_type(#t_var{}, P, Ts) ->
+ check_types(Ts, P);
+check_type(#t_fun{args = Args, range = Range}, P, Ts) ->
+ check_type(Range, P, Args++Ts);
+check_type(#t_tuple{types = Types}, P, Ts) ->
+ check_types(Types ++Ts, P);
+check_type(#t_list{type = Type}, P, Ts) ->
+ check_type(Type, P, Ts);
+check_type(#t_nil{}, P, Ts) ->
+ check_types(Ts, P);
+check_type(#t_paren{type = Type}, P, Ts) ->
+ check_type(Type, P, Ts);
+check_type(#t_nonempty_list{type = Type}, P, Ts) ->
+ check_type(Type, P, Ts);
+check_type(#t_atom{}, P, Ts) ->
+ check_types(Ts, P);
+check_type(#t_integer{}, P, Ts) ->
+ check_types(Ts, P);
+check_type(#t_integer_range{}, P, Ts) ->
+ check_types(Ts, P);
+check_type(#t_binary{}, P, Ts) ->
+ check_types(Ts, P);
+check_type(#t_float{}, P, Ts) ->
+ check_types(Ts, P);
+check_type(#t_union{types = Types}, P, Ts) ->
+ check_types(Types++Ts, P);
+check_type(#t_record{fields = Fields}, P, Ts) ->
+ check_types(Fields++Ts, P);
+check_type(#t_field{type = Type}, P, Ts) ->
+ check_type(Type, P, Ts);
+check_type(undefined, P, Ts) ->
+ check_types(Ts, P).
+
+check_used_type(#t_name{name = N, module = Mod}=Name, Args, P) ->
+ NArgs = length(Args),
+ TypeName = {Name, NArgs},
+ DT = P#parms.tab,
+ case
+ Mod =/= []
+ orelse lists:member(TypeName, ets:lookup(DT, Name))
+ orelse edoc_types:is_predefined(N, NArgs)
+ orelse edoc_types:is_predefined_otp_type(N, NArgs)
+ of
+ true ->
+ ok;
+ false ->
+ #parms{warn = W, line = L, file = File} = P,
+ %% true = ets:insert(DT, TypeName),
+ [type_warning(L, File, "missing type", N, NArgs) || W]
+ end.
+
+type_warning(Line, File, S, N, NArgs) ->
+ AS = ["/"++integer_to_list(NArgs) || NArgs > 0],
+ warning(Line, File, S++" ~w~s", [N, AS]).
diff --git a/lib/edoc/src/edoc_types.erl b/lib/edoc/src/edoc_types.erl
index b0255f793d..1ded63dffe 100644
--- a/lib/edoc/src/edoc_types.erl
+++ b/lib/edoc/src/edoc_types.erl
@@ -14,6 +14,8 @@
%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
%% USA
%%
+%% $Id$
+%%
%% @private
%% @copyright 2001-2003 Richard Carlsson
%% @author Richard Carlsson <[email protected]>
@@ -25,8 +27,9 @@
-module(edoc_types).
--export([is_predefined/1, to_ref/1, to_xml/2, to_label/1, arg_names/1,
- set_arg_names/2, arg_descs/1, range_desc/1]).
+-export([is_predefined/2, is_new_predefined/2, is_predefined_otp_type/2,
+ to_ref/1, to_xml/2, to_label/1, arg_names/1, set_arg_names/2,
+ arg_descs/1, range_desc/1]).
%% @headerfile "edoc_types.hrl"
@@ -34,27 +37,63 @@
-include("xmerl.hrl").
-is_predefined(any) -> true;
-is_predefined(atom) -> true;
-is_predefined(binary) -> true;
-is_predefined(bool) -> true;
-is_predefined(char) -> true;
-is_predefined(cons) -> true;
-is_predefined(deep_string) -> true;
-is_predefined(float) -> true;
-is_predefined(function) -> true;
-is_predefined(integer) -> true;
-is_predefined(list) -> true;
-is_predefined(nil) -> true;
-is_predefined(none) -> true;
-is_predefined(number) -> true;
-is_predefined(pid) -> true;
-is_predefined(port) -> true;
-is_predefined(reference) -> true;
-is_predefined(string) -> true;
-is_predefined(term) -> true;
-is_predefined(tuple) -> true;
-is_predefined(_) -> false.
+is_predefined(any, 0) -> true;
+is_predefined(atom, 0) -> true;
+is_predefined(binary, 0) -> true;
+is_predefined(bool, 0) -> true;
+is_predefined(char, 0) -> true;
+is_predefined(cons, 2) -> true;
+is_predefined(deep_string, 0) -> true;
+is_predefined(float, 0) -> true;
+is_predefined(function, 0) -> true;
+is_predefined(integer, 0) -> true;
+is_predefined(list, 0) -> true;
+is_predefined(list, 1) -> true;
+is_predefined(nil, 0) -> true;
+is_predefined(none, 0) -> true;
+is_predefined(number, 0) -> true;
+is_predefined(pid, 0) -> true;
+is_predefined(port, 0) -> true;
+is_predefined(reference, 0) -> true;
+is_predefined(string, 0) -> true;
+is_predefined(term, 0) -> true;
+is_predefined(tuple, 0) -> true;
+is_predefined(F, A) -> is_new_predefined(F, A).
+
+%% Should eventually be coalesced with is_predefined/2.
+is_new_predefined(arity, 0) -> true;
+is_new_predefined(bitstring, 0) -> true;
+is_new_predefined(boolean, 0) -> true;
+is_new_predefined(byte, 0) -> true;
+is_new_predefined(iodata, 0) -> true;
+is_new_predefined(iolist, 0) -> true;
+is_new_predefined(maybe_improper_list, 0) -> true;
+is_new_predefined(maybe_improper_list, 2) -> true;
+is_new_predefined(mfa, 0) -> true;
+is_new_predefined(module, 0) -> true;
+is_new_predefined(neg_integer, 0) -> true;
+is_new_predefined(node, 0) -> true;
+is_new_predefined(non_neg_integer, 0) -> true;
+is_new_predefined(nonempty_improper_list, 2) -> true;
+is_new_predefined(nonempty_list, 0) -> true;
+is_new_predefined(nonempty_list, 1) -> true;
+is_new_predefined(nonempty_maybe_improper_list, 0) -> true;
+is_new_predefined(nonempty_maybe_improper_list, 2) -> true;
+is_new_predefined(nonempty_string, 0) -> true;
+is_new_predefined(pos_integer, 0) -> true;
+is_new_predefined(timeout, 0) -> true;
+is_new_predefined(_, _) -> false.
+
+%% The following types will be removed later, but they are currently
+%% kind of built-in.
+is_predefined_otp_type(array, 0) -> true;
+is_predefined_otp_type(dict, 0) -> true;
+is_predefined_otp_type(digraph, 0) -> true;
+is_predefined_otp_type(gb_set, 0) -> true;
+is_predefined_otp_type(gb_tree, 0) -> true;
+is_predefined_otp_type(queue, 0) -> true;
+is_predefined_otp_type(set, 0) -> true;
+is_predefined_otp_type(_, _) -> false.
to_ref(#t_typedef{name = N}) ->
to_ref(N);
@@ -89,7 +128,9 @@ to_xml(#t_name{app = A, module = M, name = N}, _Env) ->
to_xml(#t_type{name = N, args = As}, Env) ->
Predef = case N of
#t_name{module = [], name = T} ->
- is_predefined(T);
+ NArgs = length(As),
+ (is_predefined(T, NArgs)
+ orelse is_predefined_otp_type(T, NArgs));
_ ->
false
end,
@@ -107,14 +148,30 @@ to_xml(#t_list{type = T}, Env) ->
{list, [wrap_utype(T, Env)]};
to_xml(#t_nil{}, _Env) ->
nil;
+to_xml(#t_paren{type = T}, Env) ->
+ {paren, [wrap_utype(T, Env)]};
+to_xml(#t_nonempty_list{type = T}, Env) ->
+ {nonempty_list, [wrap_utype(T, Env)]};
to_xml(#t_atom{val = V}, _Env) ->
{atom, [{value, io_lib:write(V)}], []};
to_xml(#t_integer{val = V}, _Env) ->
{integer, [{value, integer_to_list(V)}], []};
+to_xml(#t_integer_range{from = From, to = To}, _Env) ->
+ {range, [{value, integer_to_list(From)++".."++integer_to_list(To)}], []};
+to_xml(#t_binary{base_size = 0, unit_size = 0}, _Ens) ->
+ {binary, [{value, "<<>>"}], []};
+to_xml(#t_binary{base_size = B, unit_size = 0}, _Ens) ->
+ {binary, [{value, io_lib:fwrite("<<_:~w>>", [B])}], []};
+%to_xml(#t_binary{base_size = 0, unit_size = 8}, _Ens) ->
+% {binary, [{value, "binary()"}], []};
+to_xml(#t_binary{base_size = 0, unit_size = U}, _Ens) ->
+ {binary, [{value, io_lib:fwrite("<<_:_*~w>>", [U])}], []};
+to_xml(#t_binary{base_size = B, unit_size = U}, _Ens) ->
+ {binary, [{value, io_lib:fwrite("<<_:~w, _:_*~w>>", [B, U])}], []};
to_xml(#t_float{val = V}, _Env) ->
{float, [{value, io_lib:write(V)}], []};
to_xml(#t_union{types = Ts}, Env) ->
- {union, map(fun wrap_type/2, Ts, Env)};
+ {union, map(fun wrap_utype/2, Ts, Env)};
to_xml(#t_record{name = N = #t_atom{}, fields = Fs}, Env) ->
{record, [to_xml(N, Env) | map(fun to_xml/2, Fs, Env)]};
to_xml(#t_field{name = N = #t_atom{}, type = T}, Env) ->
diff --git a/lib/edoc/src/edoc_types.hrl b/lib/edoc/src/edoc_types.hrl
index 1dcbdd9493..1353bfb93a 100644
--- a/lib/edoc/src/edoc_types.hrl
+++ b/lib/edoc/src/edoc_types.hrl
@@ -1,6 +1,6 @@
%% =====================================================================
%% Header file for EDoc Type Representations
-%%
+%%
%% Copyright (C) 2001-2005 Richard Carlsson
%%
%% This library is free software; you can redistribute it and/or modify
@@ -29,13 +29,15 @@
-record(t_spec, {name, type, defs=[]}). % function specification
-%% @type type() = t_atom() | t_fun() | t_integer() | t_list() | t_nil()
-%% | t_tuple() | t_type() | t_union() | t_var()
+%% @type type() = t_atom() | t_binary() | t_float() | t_fun() | t_integer()
+%% | t_integer_range() | t_list() | t_nil()| t_nonempty_list()
+%% | t_record() | t_tuple() | t_type() | t_union() | t_var()
+%% | t_paren()
%% @type t_typedef() = #t_typedef{name = t_name(),
%% args = [type()],
-%% type = type(),
-%% defs = [t_def()]}
+%% type = type() | undefined,
+%% defs = [t_def()]}.
-record(t_typedef, {name, args, type,
defs=[]}). % type declaration/definition
@@ -45,7 +47,7 @@
-record(t_throws, {type, defs=[]}). % exception declaration
-%% @type t_def() = #t_def{name = t_name(),
+%% @type t_def() = #t_def{name = t_type() | t_var(),
%% type = type()}
-record(t_def, {name, type}). % local definition 'name = type'
@@ -75,7 +77,9 @@
%% name = t_name(),
%% args = [type()]}
--record(t_type, {a=[], name, args = []}). % abstract type 'name(...)'
+-record(t_type, {a=[], % abstract type 'name(...)'
+ name,
+ args = []}).
%% @type t_union() = #t_union{a = list(),
%% types = [type()]}
@@ -102,6 +106,11 @@
-record(t_nil, {a=[]}). % empty-list constant '[]'
+%% @type t_nonempty_list() = #t_nonempty_list{a = list(),
+%% type = type()}
+
+-record(t_nonempty_list, {a=[], type}). % list type '[type, ...]'
+
%% @type t_atom() = #t_atom{a = list(),
%% val = atom()}
@@ -112,19 +121,37 @@
-record(t_integer, {a=[], val}). % integer constant
+%% @type t_integer_range() = #t_integer_range{a = list(),
+%% from = integer(),
+%% to = integer()}
+
+-record(t_integer_range, {a=[], from, to}).
+
+%% @type t_binary() = #t_binary{a = list(),
+%% base_size = integer(),
+%% unit_size = integer()}
+
+-record(t_binary, {a=[], base_size = 0, unit_size = 0}).
+
%% @type t_float() = #t_float{a = list(),
%% val = float()}
-record(t_float, {a=[], val}). % floating-point constant
%% @type t_record() = #t_list{a = list(),
-%% name = type(),
+%% name = t_atom(),
%% fields = [field()]}
--record(t_record, {a=[], name, fields = []}). % record type '#r{f1,...,fN}'
+-record(t_record, {a=[], % record "type" '#r{f1,...,fN}'
+ name,
+ fields = []}).
%% @type t_field() = #t_field{a = list(),
%% name = type(),
%% type = type()}
-record(t_field, {a=[], name, type}). % named field 'n1=t1'
+
+%% @type t_paren() = #t_paren{a = list(), type = type()}
+
+-record(t_paren, {a=[], type}). % parentheses
diff --git a/lib/edoc/src/edoc_wiki.erl b/lib/edoc/src/edoc_wiki.erl
index e4a3d74734..9a31bc9a82 100644
--- a/lib/edoc/src/edoc_wiki.erl
+++ b/lib/edoc/src/edoc_wiki.erl
@@ -82,7 +82,8 @@ parse_xml(Data, Line) ->
parse_xml_1(Text, Line) ->
Text1 = "<doc>" ++ Text ++ "</doc>",
- case catch {ok, xmerl_scan:string(Text1, [{line, Line}])} of
+ Options = [{line, Line}, {encoding, "iso-8859-1"}],
+ case catch {ok, xmerl_scan:string(Text1, Options)} of
{ok, {E, _}} ->
E#xmlElement.content;
{'EXIT', {fatal, {Reason, L, _C}}} ->
@@ -295,6 +296,8 @@ push_uri(Us, Ss, As) ->
strip_empty_lines(Cs) ->
strip_empty_lines(Cs, 0).
+strip_empty_lines([], N) ->
+ {[], N}; % reached the end of input
strip_empty_lines(Cs, N) ->
{Cs1, Cs2} = edoc_lib:split_at(Cs, $\n),
case edoc_lib:is_space(Cs1) of
diff --git a/lib/edoc/test/Makefile b/lib/edoc/test/Makefile
index 4ce9799f6d..2dbdb77eff 100644
--- a/lib/edoc/test/Makefile
+++ b/lib/edoc/test/Makefile
@@ -59,8 +59,8 @@ release_spec: opt
release_tests_spec: make_emakefile
$(INSTALL_DIR) $(RELSYSDIR)
$(INSTALL_DATA) $(EMAKEFILE) $(ERL_FILES) $(RELSYSDIR)
- $(INSTALL_DATA) edoc.spec $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ $(INSTALL_DATA) edoc.spec edoc.cover $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
@tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
release_docs_spec:
diff --git a/lib/edoc/test/edoc.cover b/lib/edoc/test/edoc.cover
new file mode 100644
index 0000000000..50140fafde
--- /dev/null
+++ b/lib/edoc/test/edoc.cover
@@ -0,0 +1,2 @@
+{incl_app,edoc,details}.
+
diff --git a/lib/edoc/test/edoc.spec b/lib/edoc/test/edoc.spec
index 8443a28028..8371427270 100644
--- a/lib/edoc/test/edoc.spec
+++ b/lib/edoc/test/edoc.spec
@@ -1 +1 @@
-{topcase, {dir, "../edoc_test"}}.
+{suites,"../edoc_test",all}.
diff --git a/lib/edoc/test/edoc_SUITE.erl b/lib/edoc/test/edoc_SUITE.erl
index ea833f89b2..0d57591e3e 100644
--- a/lib/edoc/test/edoc_SUITE.erl
+++ b/lib/edoc/test/edoc_SUITE.erl
@@ -17,17 +17,36 @@
%%
-module(edoc_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% Test server specific exports
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
%% Test cases
-export([build_std/1]).
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[build_std].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
build_std(suite) ->
[];
build_std(doc) ->
diff --git a/lib/edoc/vsn.mk b/lib/edoc/vsn.mk
index e030174862..febac9cc42 100644
--- a/lib/edoc/vsn.mk
+++ b/lib/edoc/vsn.mk
@@ -1 +1 @@
-EDOC_VSN = 0.7.6.8
+EDOC_VSN = 0.7.7
diff --git a/lib/erl_docgen/doc/src/notes.xml b/lib/erl_docgen/doc/src/notes.xml
index c7a7926c40..7c8a2c8208 100644
--- a/lib/erl_docgen/doc/src/notes.xml
+++ b/lib/erl_docgen/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2004</year><year>2009</year>
+ <year>2004</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -29,7 +29,22 @@
<file>notes.xml</file>
</header>
<p>This document describes the changes made to the erl_docgen application.</p>
- <section><title>Erl_Docgen 0.2.3</title>
+
+ <section><title>erl_docgen 0.2.4</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>Subsections below level 2 where not handled correct when generating html and pdf.</p>
+ <p>
+ Own Id: OTP-90730</p>
+ </item>
+ </list>
+ </section>
+
+ </section>
+
+ <section><title>erl_docgen 0.2.3</title>
<section><title>Fixed Bugs and Malfunctions</title>
<list>
@@ -56,9 +71,9 @@
</list>
</section>
-</section>
+ </section>
-<section><title>Erl_Docgen 0.2.2</title>
+ <section><title>erl_docgen 0.2.2</title>
<section><title>Fixed Bugs and Malfunctions</title>
<list>
@@ -71,9 +86,9 @@
</list>
</section>
-</section>
+ </section>
-<section><title>erl_docgen 0.2.1</title>
+ <section><title>erl_docgen 0.2.1</title>
<section><title>Fixed Bugs and Malfunctions</title>
<list>
diff --git a/lib/erl_docgen/priv/bin/xref_mod_app.escript b/lib/erl_docgen/priv/bin/xref_mod_app.escript
index fcc3a96ada..13671ef2f8 100755
--- a/lib/erl_docgen/priv/bin/xref_mod_app.escript
+++ b/lib/erl_docgen/priv/bin/xref_mod_app.escript
@@ -2,7 +2,7 @@
%% -*- erlang -*-
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2011. 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
@@ -86,8 +86,6 @@ appmods(D) ->
end,
{App, [filename:basename(EF, ".erl") || EF <- ErlFiles]}.
--include_lib("xmerl/include/xmerl.hrl").
-
-define(IND(N), lists:duplicate(N, $\s)).
-define(NL, "\n").
diff --git a/lib/erl_docgen/priv/xsl/db_eix.xsl b/lib/erl_docgen/priv/xsl/db_eix.xsl
index 970b85ccb9..4545322bc2 100644
--- a/lib/erl_docgen/priv/xsl/db_eix.xsl
+++ b/lib/erl_docgen/priv/xsl/db_eix.xsl
@@ -3,7 +3,7 @@
#
# %CopyrightBegin%
#
- # Copyright Ericsson AB 2009. All Rights Reserved.
+ # Copyright Ericsson AB 2009-2011. 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
diff --git a/lib/erl_docgen/priv/xsl/db_html.xsl b/lib/erl_docgen/priv/xsl/db_html.xsl
index 732560e303..c6375ea621 100644
--- a/lib/erl_docgen/priv/xsl/db_html.xsl
+++ b/lib/erl_docgen/priv/xsl/db_html.xsl
@@ -3,7 +3,7 @@
#
# %CopyrightBegin%
#
- # Copyright Ericsson AB 2009-2010. All Rights Reserved.
+ # Copyright Ericsson AB 2009-2011. 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
@@ -556,8 +556,8 @@
</xsl:apply-templates>
</xsl:template>
- <!-- Chapter/Subsection -->
- <xsl:template match="chapter/section/section">
+ <!-- Subsections lvl 3 and ... -->
+ <xsl:template match="section/section">
<xsl:param name="chapnum"/>
<xsl:param name="sectnum"/>
<h4>
@@ -569,8 +569,6 @@
</xsl:apply-templates>
</xsl:template>
-
-
<!-- *ref/Section -->
<xsl:template match="erlref/section|cref/section|comref/section|fileref/section|appref/section">
<xsl:param name="chapnum"/>
diff --git a/lib/erl_docgen/priv/xsl/db_pdf.xsl b/lib/erl_docgen/priv/xsl/db_pdf.xsl
index 1e80c360b8..f500cd3fee 100644
--- a/lib/erl_docgen/priv/xsl/db_pdf.xsl
+++ b/lib/erl_docgen/priv/xsl/db_pdf.xsl
@@ -3,7 +3,7 @@
#
# %CopyrightBegin%
#
- # Copyright Ericsson AB 2009-2010. All Rights Reserved.
+ # Copyright Ericsson AB 2009-2011. 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
@@ -827,7 +827,7 @@
</xsl:template>
- <!-- Chapter/Subsection -->
+ <!-- Chapter/Subsection -->
<xsl:template match="chapter/section/section">
<xsl:param name="partnum"/>
<xsl:param name="chapnum"/>
@@ -844,6 +844,22 @@
</xsl:template>
+ <!-- Subsection below level 2 -->
+ <xsl:template match="section/section/section">
+ <xsl:param name="partnum"/>
+ <xsl:param name="chapnum"/>
+ <xsl:param name="sectnum"/>
+ <fo:block xsl:use-attribute-sets="h5" id="{generate-id(title)}">
+ <!-- xsl:value-of select="$partnum"/>.<xsl:value-of select="$chapnum"/>.<xsl:value-of select="$sectnum"/>.<xsl:number/ -->
+ <xsl:value-of select="title"/>
+ </fo:block>
+ <xsl:apply-templates>
+ <xsl:with-param name="partnum" select="$partnum"/>
+ <xsl:with-param name="chapnum" select="$chapnum"/>
+ <xsl:with-param name="sectnum" select="$sectnum"/>
+ </xsl:apply-templates>
+ </xsl:template>
+
<!-- *ref/Section -->
<xsl:template match="erlref/section|comref/section|cref/section|fileref/section|appref/section">
diff --git a/lib/erl_docgen/vsn.mk b/lib/erl_docgen/vsn.mk
index fb0f5ca0cd..29585d8520 100644
--- a/lib/erl_docgen/vsn.mk
+++ b/lib/erl_docgen/vsn.mk
@@ -1 +1,2 @@
-ERL_DOCGEN_VSN = 0.2.3
+ERL_DOCGEN_VSN = 0.2.4
+
diff --git a/lib/erl_interface/doc/src/ei.xml b/lib/erl_interface/doc/src/ei.xml
index d7af7a1b67..de4e4b4301 100644
--- a/lib/erl_interface/doc/src/ei.xml
+++ b/lib/erl_interface/doc/src/ei.xml
@@ -641,12 +641,14 @@ ei_x_encode_empty_list(&amp;x);
<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>
<pre>
diff --git a/lib/erl_interface/doc/src/notes.xml b/lib/erl_interface/doc/src/notes.xml
index de5ba61938..784ba78d3e 100644
--- a/lib/erl_interface/doc/src/notes.xml
+++ b/lib/erl_interface/doc/src/notes.xml
@@ -30,6 +30,49 @@
</header>
<p>This document describes the changes made to the Erl_interface application.</p>
+<section><title>Erl_Interface 3.7.3</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Some malformed distribution messages could cause VM to
+ crash, this is now corrected.</p>
+ <p>
+ Own Id: OTP-8993</p>
+ </item>
+ <item>
+ <p>
+ Strengthen string copy check (Thanks to Michael Santos).</p>
+ <p>
+ Own Id: OTP-9071</p>
+ </item>
+ <item>
+ <p>
+ Strengthen atom length check when decoding atoms (Thanks
+ to Michael Santos).</p>
+ <p>
+ Own Id: OTP-9072</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>Fix global registration. C node needed
+ DFLAG_DIST_MONITOR_FLAT set when connecting. Fix list
+ compare in erl_compare_ext to return correct result.
+ (Thanks to Vitaliy Batichko and Evgeny Khirin)</p>
+ <p>
+ Own Id: OTP-9015</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Erl_Interface 3.7.2</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/erl_interface/include/ei.h b/lib/erl_interface/include/ei.h
index 466d84bb99..ae815b414a 100644
--- a/lib/erl_interface/include/ei.h
+++ b/lib/erl_interface/include/ei.h
@@ -80,21 +80,24 @@
#define ERL_NO_TIMEOUT -1
/* these are the control message types */
-#define ERL_LINK 1
-#define ERL_SEND 2
-#define ERL_EXIT 3
-#define ERL_UNLINK 4
-#define ERL_NODE_LINK 5
-#define ERL_REG_SEND 6
-#define ERL_GROUP_LEADER 7
-#define ERL_EXIT2 8
-#define ERL_PASS_THROUGH 'p'
+#define ERL_LINK 1
+#define ERL_SEND 2
+#define ERL_EXIT 3
+#define ERL_UNLINK 4
+#define ERL_NODE_LINK 5
+#define ERL_REG_SEND 6
+#define ERL_GROUP_LEADER 7
+#define ERL_EXIT2 8
+#define ERL_PASS_THROUGH 'p'
/* new ones for tracing, from Kenneth */
-#define ERL_SEND_TT 12
-#define ERL_EXIT_TT 13
-#define ERL_REG_SEND_TT 16
-#define ERL_EXIT2_TT 18
+#define ERL_SEND_TT 12
+#define ERL_EXIT_TT 13
+#define ERL_REG_SEND_TT 16
+#define ERL_EXIT2_TT 18
+#define ERL_MONITOR_P 19
+#define ERL_DEMONITOR_P 20
+#define ERL_MONITOR_P_EXIT 21
/* -------------------------------------------------------------------- */
diff --git a/lib/erl_interface/src/connect/ei_connect.c b/lib/erl_interface/src/connect/ei_connect.c
index 99ccba0686..34362b4b9f 100644
--- a/lib/erl_interface/src/connect/ei_connect.c
+++ b/lib/erl_interface/src/connect/ei_connect.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2000-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2000-2011. 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
@@ -938,7 +938,7 @@ int ei_do_receive_msg(int fd, int staticbuffer_p,
return ERL_ERROR;
}
x->index = x->buffsz;
- switch (msg->msgtype) { /* FIXME are these all? */
+ switch (msg->msgtype) { /* FIXME does not handle trace tokens and monitors */
case ERL_SEND:
case ERL_REG_SEND:
case ERL_LINK:
@@ -946,7 +946,6 @@ int ei_do_receive_msg(int fd, int staticbuffer_p,
case ERL_GROUP_LEADER:
case ERL_EXIT:
case ERL_EXIT2:
- case ERL_NODE_LINK:
return ERL_MSG;
default:
@@ -1198,7 +1197,7 @@ static char *hex(char digest[16], char buff[33])
char *p = buff;
int i;
- for (i = 0; i < sizeof(digest); ++i) {
+ for (i = 0; i < 16; ++i) {
*p++ = tab[(int)((*d) >> 4)];
*p++ = tab[(int)((*d++) & 0xF)];
}
@@ -1329,6 +1328,7 @@ static int send_name_or_challenge(int fd, char *nodename,
put8(s, 'n');
put16be(s, version);
put32be(s, (DFLAG_EXTENDED_REFERENCES
+ | DFLAG_DIST_MONITOR
| DFLAG_EXTENDED_PIDS_PORTS
| DFLAG_FUN_TAGS
| DFLAG_NEW_FUN_TAGS
diff --git a/lib/erl_interface/src/connect/ei_resolve.c b/lib/erl_interface/src/connect/ei_resolve.c
index 24a030c468..50c5a4161d 100644
--- a/lib/erl_interface/src/connect/ei_resolve.c
+++ b/lib/erl_interface/src/connect/ei_resolve.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1997-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1997-2011. 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
diff --git a/lib/erl_interface/src/connect/eirecv.c b/lib/erl_interface/src/connect/eirecv.c
index 7d72ddeeae..86852f947d 100644
--- a/lib/erl_interface/src/connect/eirecv.c
+++ b/lib/erl_interface/src/connect/eirecv.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2010. 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
@@ -196,10 +196,6 @@ ei_recv_internal (int fd,
ei_trace(1,&msg->token); /* turn on tracing */
break;
- case ERL_NODE_LINK: /* { NODE_LINK } */
- if (ei_tracelevel >= 4) show_this_msg = 1;
- break;
-
default:
/* unknown type, just put any remaining bytes into buffer */
break;
diff --git a/lib/erl_interface/src/connect/send.c b/lib/erl_interface/src/connect/send.c
index 57e32903cf..2fb487d7e8 100644
--- a/lib/erl_interface/src/connect/send.c
+++ b/lib/erl_interface/src/connect/send.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2011. 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
diff --git a/lib/erl_interface/src/connect/send_exit.c b/lib/erl_interface/src/connect/send_exit.c
index d4e6605a2c..c5beb358b0 100644
--- a/lib/erl_interface/src/connect/send_exit.c
+++ b/lib/erl_interface/src/connect/send_exit.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2011. 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
diff --git a/lib/erl_interface/src/connect/send_reg.c b/lib/erl_interface/src/connect/send_reg.c
index 779b1b8359..b011142e76 100644
--- a/lib/erl_interface/src/connect/send_reg.c
+++ b/lib/erl_interface/src/connect/send_reg.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2011. 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
diff --git a/lib/erl_interface/src/decode/decode_atom.c b/lib/erl_interface/src/decode/decode_atom.c
index b247bd4e17..c2e6a0426e 100644
--- a/lib/erl_interface/src/decode/decode_atom.c
+++ b/lib/erl_interface/src/decode/decode_atom.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2011. 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
@@ -31,6 +31,8 @@ int ei_decode_atom(const char *buf, int *index, char *p)
len = get16be(s);
+ if (len > MAXATOMLEN) return -1;
+
if (p) {
memmove(p,s,len);
p[len] = (char)0;
diff --git a/lib/erl_interface/src/decode/decode_big.c b/lib/erl_interface/src/decode/decode_big.c
index b5e9b45a3b..b54ac85be2 100644
--- a/lib/erl_interface/src/decode/decode_big.c
+++ b/lib/erl_interface/src/decode/decode_big.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2002-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2002-2011. 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
diff --git a/lib/erl_interface/src/decode/decode_pid.c b/lib/erl_interface/src/decode/decode_pid.c
index 5f2aec3b44..9ed1c36db6 100644
--- a/lib/erl_interface/src/decode/decode_pid.c
+++ b/lib/erl_interface/src/decode/decode_pid.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2011. 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
@@ -33,6 +33,8 @@ int ei_decode_pid(const char *buf, int *index, erlang_pid *p)
if (get8(s) != ERL_ATOM_EXT) return -1;
len = get16be(s);
+
+ if (len > MAXATOMLEN) return -1;
if (p) {
memmove(p->node, s, len);
diff --git a/lib/erl_interface/src/decode/decode_port.c b/lib/erl_interface/src/decode/decode_port.c
index 7fb7d8d414..28abed801a 100644
--- a/lib/erl_interface/src/decode/decode_port.c
+++ b/lib/erl_interface/src/decode/decode_port.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2011. 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
@@ -34,6 +34,8 @@ int ei_decode_port(const char *buf, int *index, erlang_port *p)
len = get16be(s);
+ if (len > MAXATOMLEN) return -1;
+
if (p) {
memmove(p->node, s, len);
p->node[len] = (char)0;
diff --git a/lib/erl_interface/src/decode/decode_ref.c b/lib/erl_interface/src/decode/decode_ref.c
index 6fc2cd6533..7b15808bc5 100644
--- a/lib/erl_interface/src/decode/decode_ref.c
+++ b/lib/erl_interface/src/decode/decode_ref.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2011. 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
@@ -35,6 +35,8 @@ int ei_decode_ref(const char *buf, int *index, erlang_ref *p)
len = get16be(s);
+ if (len > MAXATOMLEN) return -1;
+
if (p) {
memmove(p->node, s, len);
p->node[len] = (char)0;
@@ -62,6 +64,7 @@ int ei_decode_ref(const char *buf, int *index, erlang_ref *p)
/* then the nodename */
if (get8(s) != ERL_ATOM_EXT) return -1;
len = get16be(s);
+ if (len > MAXATOMLEN) return -1;
if (p) {
memmove(p->node, s, len);
diff --git a/lib/erl_interface/src/epmd/epmd_unpublish.c b/lib/erl_interface/src/epmd/epmd_unpublish.c
index 495cbab44c..3afa89ab1d 100644
--- a/lib/erl_interface/src/epmd/epmd_unpublish.c
+++ b/lib/erl_interface/src/epmd/epmd_unpublish.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2011. 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
diff --git a/lib/erl_interface/src/legacy/erl_connect.c b/lib/erl_interface/src/legacy/erl_connect.c
index 3c8c946506..41d4fa3138 100644
--- a/lib/erl_interface/src/legacy/erl_connect.c
+++ b/lib/erl_interface/src/legacy/erl_connect.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -180,9 +180,7 @@ int erl_xconnect(Erl_IpAddr addr, char *alivename)
*
* Close a connection. FIXME call ei_close_connection() later.
*
- * Returns valid file descriptor on success and < 0 on failure.
- * Set erl_errno to EHOSTUNREACH, ENOMEM, EIO or errno from socket(2)
- * or connect(2).
+ * Returns 0 on success and -1 on failure.
*
***************************************************************************/
@@ -250,7 +248,8 @@ int erl_send(int fd, ETERM *to ,ETERM *msg)
return -1;
}
- strcpy(topid.node, (char *)ERL_PID_NODE(to));
+ strncpy(topid.node, (char *)ERL_PID_NODE(to), sizeof(topid.node));
+ topid.node[sizeof(topid.node)-1] = '\0';
topid.num = ERL_PID_NUMBER(to);
topid.serial = ERL_PID_SERIAL(to);
topid.creation = ERL_PID_CREATION(to);
@@ -294,8 +293,13 @@ static int erl_do_receive_msg(int fd, ei_x_buff* x, ErlMessage* emsg)
emsg->msg = NULL;
if (msg.from.node[0] != '\0')
emsg->from = erl_mk_pid(msg.from.node, msg.from.num, msg.from.serial, msg.from.creation);
+ else
+ emsg->from = NULL;
if (msg.to.node[0] != '\0')
emsg->to = erl_mk_pid(msg.to.node, msg.to.num, msg.to.serial, msg.to.creation);
+ else
+ emsg->to = NULL;
+ memcpy(emsg->to_name, msg.toname, MAXATOMLEN+1);
return r;
}
diff --git a/lib/erl_interface/src/legacy/erl_format.c b/lib/erl_interface/src/legacy/erl_format.c
index 9848e9296a..dc85806c36 100644
--- a/lib/erl_interface/src/legacy/erl_format.c
+++ b/lib/erl_interface/src/legacy/erl_format.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -116,7 +116,7 @@ static lvar *lvar_alloc(void)
lvar *tmp;
if ((tmp = ef.idle) == NULL) {
- tmp = (lvar *) malloc(sizeof(lvar)); /* FIXME check result */
+ tmp = (lvar *) erl_malloc(sizeof(lvar));
}
else {
tmp = ef.idle;
diff --git a/lib/erl_interface/src/legacy/erl_marshal.c b/lib/erl_interface/src/legacy/erl_marshal.c
index a6c2f64dd0..dad715c762 100644
--- a/lib/erl_interface/src/legacy/erl_marshal.c
+++ b/lib/erl_interface/src/legacy/erl_marshal.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
@@ -662,7 +662,7 @@ len = i
#define STATIC_NODE_BUF_SZ 30
#define SET_NODE(node,node_buf,cp,len) \
-if (len >= STATIC_NODE_BUF_SZ) node = malloc(len+1); \
+if (len >= STATIC_NODE_BUF_SZ) node = erl_malloc(len+1); \
else node = node_buf; \
memcpy(node, cp, len); \
node[len] = '\0'
@@ -1534,7 +1534,7 @@ static int cmp_string_list(unsigned char **e1, unsigned char **e2) {
if ( e1_len < 256 ) {
bp = buf;
} else {
- bp = malloc(5+(2*e1_len)+1);
+ bp = erl_malloc(5+(2*e1_len)+1);
}
bp[0] = ERL_LIST_EXT;
@@ -1646,11 +1646,14 @@ static int cmp_exe2(unsigned char **e1, unsigned char **e2)
min = (i < j) ? i : j;
k = 0;
while (1) {
- if (k++ == min)
- return compare_top_ext(e1 , e2);
- if ((ret = compare_top_ext(e1 , e2)) == 0)
- continue;
- return ret;
+ if (k++ == min){
+ if (i == j) return 0;
+ if (i < j) return -1;
+ return 1;
+ }
+ if ((ret = compare_top_ext(e1 , e2)) == 0)
+ continue;
+ return ret;
}
case ERL_STRING_EXT:
i = (**e1 << 8) | ((*e1)[1]);
diff --git a/lib/erl_interface/src/legacy/erl_timeout.c b/lib/erl_interface/src/legacy/erl_timeout.c
index af1a4a1f3a..146a106e7c 100644
--- a/lib/erl_interface/src/legacy/erl_timeout.c
+++ b/lib/erl_interface/src/legacy/erl_timeout.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1997-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1997-2011. 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
@@ -43,6 +43,7 @@
# endif
#endif
+#include "erl_interface.h"
#include "erl_timeout.h"
typedef struct jmp_s {
@@ -74,7 +75,7 @@ jmp_buf *timeout_setup(int ms)
t.it_value.tv_usec = (ms % 1000) * 1000;
/* get a jump buffer and save it */
- j = malloc(sizeof(*j)); /* FIXME check result */
+ j = erl_malloc(sizeof(*j));
j->siginfo = s;
push(j);
diff --git a/lib/erl_interface/src/legacy/global_register.c b/lib/erl_interface/src/legacy/global_register.c
index 3a4de8b08e..cce60f25da 100644
--- a/lib/erl_interface/src/legacy/global_register.c
+++ b/lib/erl_interface/src/legacy/global_register.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2011. 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
@@ -31,7 +31,7 @@ int erl_global_register(int fd, const char *name, ETERM *pid)
int index = 0;
erlang_pid self;
erlang_msg msg;
- int needlink, needatom;
+ int needlink, needatom, needmonitor;
int arity;
int version;
int msglen;
@@ -65,7 +65,7 @@ int erl_global_register(int fd, const char *name, ETERM *pid)
if (ei_send_reg_encoded(fd,&self,"rex",buf,index)) return -1;
/* get the reply: expect link and an atom, or just an atom */
- needlink = needatom = 1;
+ needlink = needatom = needmonitor = 1;
while (1) {
/* get message */
while (1) {
@@ -78,9 +78,15 @@ int erl_global_register(int fd, const char *name, ETERM *pid)
case ERL_LINK:
/* got link */
if (!needlink) return -1;
- needlink = 0;
+ needlink = 0;
break;
+ case ERL_MONITOR_P-10:
+ /* got monitor */
+ if (!needmonitor) { return -1;}
+ needmonitor = 0;
+ break;
+
case ERL_SEND:
/* got message - does it contain our atom? */
if (!needatom) return -1;
diff --git a/lib/erl_interface/src/legacy/global_unregister.c b/lib/erl_interface/src/legacy/global_unregister.c
index 514dbc3c68..593a8a7860 100644
--- a/lib/erl_interface/src/legacy/global_unregister.c
+++ b/lib/erl_interface/src/legacy/global_unregister.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2011. 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
@@ -37,7 +37,7 @@ int erl_global_unregister(int fd, const char *name)
erlang_msg msg;
int i;
int version,arity,msglen;
- int needunlink, needatom;
+ int needunlink, needatom, needdemonitor;
/* make a self pid */
self->num = fd;
@@ -57,7 +57,7 @@ int erl_global_unregister(int fd, const char *name)
if (ei_send_reg_encoded(fd,self,"rex",buf,index)) return -1;
/* get the reply: expect unlink and an atom, or just an atom */
- needunlink = needatom = 1;
+ needunlink = needatom = needdemonitor = 1;
while (1) {
/* get message */
while (1) {
@@ -68,11 +68,17 @@ int erl_global_unregister(int fd, const char *name)
switch (i) {
case ERL_UNLINK:
- /* got link */
+ /* got unlink */
if (!needunlink) return -1;
needunlink = 0;
break;
+ case ERL_DEMONITOR_P-10:
+ /* got demonitor */
+ if (!needdemonitor) return -1;
+ needdemonitor = 0;
+ break;
+
case ERL_SEND:
/* got message - does it contain our atom? */
if (!needatom) return -1;
diff --git a/lib/erl_interface/src/misc/ei_decode_term.c b/lib/erl_interface/src/misc/ei_decode_term.c
index 75c5dc9460..bfb4571337 100644
--- a/lib/erl_interface/src/misc/ei_decode_term.c
+++ b/lib/erl_interface/src/misc/ei_decode_term.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2001-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2001-2011. 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
@@ -49,6 +49,7 @@ int ei_decode_ei_term(const char* buf, int* index, ei_term* term)
return ei_decode_double(buf, index, &term->value.d_val);
case ERL_ATOM_EXT:
len = get16be(s);
+ if (len > MAXATOMLEN) return -1;
memcpy(term->value.atom_name, s, len);
term->value.atom_name[len] = '\0';
s += len;
@@ -57,6 +58,7 @@ int ei_decode_ei_term(const char* buf, int* index, ei_term* term)
/* first the nodename */
if (get8(s) != ERL_ATOM_EXT) return -1;
len = get16be(s);
+ if (len > MAXATOMLEN) return -1;
memcpy(term->value.ref.node, s, len);
term->value.ref.node[len] = '\0';
s += len;
@@ -71,6 +73,7 @@ int ei_decode_ei_term(const char* buf, int* index, ei_term* term)
/* then the nodename */
if (get8(s) != ERL_ATOM_EXT) return -1;
len = get16be(s);
+ if (len > MAXATOMLEN) return -1;
memcpy(term->value.ref.node, s, len);
term->value.ref.node[len] = '\0';
s += len;
@@ -87,6 +90,7 @@ int ei_decode_ei_term(const char* buf, int* index, ei_term* term)
case ERL_PORT_EXT:
if (get8(s) != ERL_ATOM_EXT) return -1;
len = get16be(s);
+ if (len > MAXATOMLEN) return -1;
memcpy(term->value.port.node, s, len);
term->value.port.node[len] = '\0';
term->value.port.id = get32be(s) & 0x0fffffff; /* 28 bits */;
@@ -96,6 +100,7 @@ int ei_decode_ei_term(const char* buf, int* index, ei_term* term)
if (get8(s) != ERL_ATOM_EXT) return -1;
/* name first */
len = get16be(s);
+ if (len > MAXATOMLEN) return -1;
memcpy(term->value.pid.node, s, len);
term->value.pid.node[len] = '\0';
s += len;
diff --git a/lib/erl_interface/src/misc/ei_format.c b/lib/erl_interface/src/misc/ei_format.c
index b35421d4b2..cf50f12451 100644
--- a/lib/erl_interface/src/misc/ei_format.c
+++ b/lib/erl_interface/src/misc/ei_format.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2001-2011. 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
@@ -47,10 +47,12 @@
* array of unions.
*/
union arg {
+ char c;
char* s;
long l;
unsigned long u;
double d;
+ erlang_pid* pid;
};
static int eiformat(const char** s, union arg** args, ei_x_buff* x);
@@ -224,12 +226,14 @@ static int pquotedatom(const char** fmt, ei_x_buff* x)
/*
* The format letters are:
* a - An atom
+ * c - A character
* s - A string
* i - An integer
* l - A long integer
* u - An unsigned long integer
* f - A float
* d - A double float
+ * p - An Erlang PID
*/
static int pformat(const char** fmt, union arg** args, ei_x_buff* x)
{
@@ -240,6 +244,10 @@ static int pformat(const char** fmt, union arg** args, ei_x_buff* x)
res = ei_x_encode_atom(x, (*args)->s);
(*args)++;
break;
+ case 'c':
+ res = ei_x_encode_char(x, (*args)->c);
+ (*args)++;
+ break;
case 's':
res = ei_x_encode_string(x, (*args)->s);
(*args)++;
@@ -261,6 +269,10 @@ static int pformat(const char** fmt, union arg** args, ei_x_buff* x)
res = ei_x_encode_double(x, (*args)->d);
(*args)++;
break;
+ case 'p':
+ res = ei_x_encode_pid(x, (*args)->pid);
+ (*args)++;
+ break;
default:
res = -1;
break;
@@ -396,6 +408,9 @@ static int read_args(const char* fmt, va_list ap, union arg **argp)
return -1; /* Error, string not complete */
}
switch (*p++) {
+ case 'c':
+ args[i++].c = (char) va_arg(ap, int);
+ break;
case 'a':
case 's':
args[i++].s = va_arg(ap, char*);
@@ -415,6 +430,9 @@ static int read_args(const char* fmt, va_list ap, union arg **argp)
case 'd':
args[i++].d = va_arg(ap, double);
break;
+ case 'p':
+ args[i++].pid = va_arg(ap, erlang_pid*);
+ break;
default:
ei_free(args); /* Invalid specifier */
return -1;
diff --git a/lib/erl_interface/src/misc/ei_portio.c b/lib/erl_interface/src/misc/ei_portio.c
index a3f6f63fff..f879c4e2f9 100644
--- a/lib/erl_interface/src/misc/ei_portio.c
+++ b/lib/erl_interface/src/misc/ei_portio.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
diff --git a/lib/erl_interface/src/misc/show_msg.c b/lib/erl_interface/src/misc/show_msg.c
index 14bea5e01f..194296798b 100644
--- a/lib/erl_interface/src/misc/show_msg.c
+++ b/lib/erl_interface/src/misc/show_msg.c
@@ -181,11 +181,6 @@ int ei_show_sendmsg(FILE *stream, const char *header, const char *msgbuf)
mbuf = header;
break;
- case ERL_NODE_LINK:
- /* nothing to do */
- mbuf = header;
- break;
-
default:
break;
}
@@ -241,10 +236,6 @@ static void show_msg(FILE *stream, int direction, const erlang_msg *msg,
show_pid(stream,&msg->to);
break;
- case ERL_NODE_LINK:
- fprintf(stream,"NODE_LINK");
- break;
-
case ERL_REG_SEND:
fprintf(stream,"REG_SEND From: ");
show_pid(stream,&msg->from);
diff --git a/lib/erl_interface/src/prog/erl_call.c b/lib/erl_interface/src/prog/erl_call.c
index 33ff6da7c9..4182ab2d5e 100644
--- a/lib/erl_interface/src/prog/erl_call.c
+++ b/lib/erl_interface/src/prog/erl_call.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2011. 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
diff --git a/lib/erl_interface/src/registry/reg_dump.c b/lib/erl_interface/src/registry/reg_dump.c
index dfec96b43c..1e640fb506 100644
--- a/lib/erl_interface/src/registry/reg_dump.c
+++ b/lib/erl_interface/src/registry/reg_dump.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2011. 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
diff --git a/lib/erl_interface/src/registry/reg_restore.c b/lib/erl_interface/src/registry/reg_restore.c
index aeb33c784a..765c3f4314 100644
--- a/lib/erl_interface/src/registry/reg_restore.c
+++ b/lib/erl_interface/src/registry/reg_restore.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2011. 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
diff --git a/lib/erl_interface/test/Makefile b/lib/erl_interface/test/Makefile
index b7a1a4e4d8..4faf89c0d6 100644
--- a/lib/erl_interface/test/Makefile
+++ b/lib/erl_interface/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2009. All Rights Reserved.
+# Copyright Ericsson AB 1997-2011. 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
@@ -33,6 +33,7 @@ MODULES= \
ei_print_SUITE \
ei_tmo_SUITE \
erl_connect_SUITE \
+ erl_global_SUITE \
erl_eterm_SUITE \
erl_ext_SUITE \
erl_format_SUITE \
@@ -41,9 +42,9 @@ MODULES= \
runner
SPEC_FILES = \
- erl_interface.spec \
- erl_interface.dynspec \
- erl_interface.spec.vxworks
+ erl_interface.spec
+
+COVER_FILE = erl_interface.cover
ERL_FILES = $(MODULES:%=%.erl)
@@ -71,8 +72,8 @@ release_spec:
release_tests_spec: opt
$(INSTALL_DIR) $(RELSYSDIR)
- $(INSTALL_DATA) $(SPEC_FILES) $(ERL_FILES) $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ $(INSTALL_DATA) $(SPEC_FILES) $(COVER_FILE) $(ERL_FILES) $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
@tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
release_docs_spec:
diff --git a/lib/erl_interface/test/ei_accept_SUITE.erl b/lib/erl_interface/test/ei_accept_SUITE.erl
index a97c874e5f..48469e68dc 100644
--- a/lib/erl_interface/test/ei_accept_SUITE.erl
+++ b/lib/erl_interface/test/ei_accept_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -20,21 +20,42 @@
%%
-module(ei_accept_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("ei_accept_SUITE_data/ei_accept_test_cases.hrl").
--export([all/1, init_per_testcase/2, fin_per_testcase/2,
+-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,
ei_accept/1, ei_threaded_accept/1]).
-import(runner, [get_term/1,send_term/2]).
-all(suite) -> [ei_accept, ei_threaded_accept].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [ei_accept, ei_threaded_accept].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Case, Config) ->
Dog = ?t:timetrap(?t:seconds(30)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/erl_interface/test/ei_connect_SUITE.erl b/lib/erl_interface/test/ei_connect_SUITE.erl
index fe82a73ef9..432437d3b8 100644
--- a/lib/erl_interface/test/ei_connect_SUITE.erl
+++ b/lib/erl_interface/test/ei_connect_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -20,37 +20,53 @@
%%
-module(ei_connect_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("ei_connect_SUITE_data/ei_connect_test_cases.hrl").
-export([
- all/1,
- init_per_testcase/2,
- fin_per_testcase/2,
-
- ei_send/1,
- ei_reg_send/1,
- ei_rpc/1,
- rpc_test/1,
- ei_send_funs/1,
- ei_threaded_send/1,
- ei_set_get_tracelevel/1
+ 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,
+
+ ei_send/1,
+ ei_reg_send/1,
+ ei_format_pid/1,
+ ei_rpc/1,
+ rpc_test/1,
+ ei_send_funs/1,
+ ei_threaded_send/1,
+ ei_set_get_tracelevel/1
]).
-import(runner, [get_term/1,send_term/2]).
-all(suite) -> [ ei_send,
- ei_reg_send,
- ei_rpc,
- ei_send_funs,
- ei_threaded_send,
- ei_set_get_tracelevel].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [ei_send, ei_reg_send, ei_rpc, ei_format_pid, ei_send_funs,
+ ei_threaded_send, ei_set_get_tracelevel].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
init_per_testcase(_Case, Config) ->
Dog = ?t:timetrap(?t:minutes(0.25)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
@@ -67,6 +83,19 @@ ei_send(Config) when is_list(Config) ->
?line runner:recv_eot(P),
ok.
+ei_format_pid(Config) when is_list(Config) ->
+ ?line S = self(),
+ ?line P = runner:start(?interpret),
+ ?line 0 = ei_connect_init(P, 42, erlang:get_cookie(), 0),
+ ?line {ok,Fd} = ei_connect(P, node()),
+
+ ?line ok = ei_format_pid(P, Fd, S),
+ ?line receive S -> ok end,
+
+ ?line runner:send_eot(P),
+ ?line runner:recv_eot(P),
+ ok.
+
ei_send_funs(Config) when is_list(Config) ->
?line P = runner:start(?interpret),
?line 0 = ei_connect_init(P, 42, erlang:get_cookie(), 0),
@@ -189,6 +218,10 @@ ei_send(P, Fd, To, Msg) ->
send_command(P, ei_send, [Fd,To,Msg]),
get_send_result(P).
+ei_format_pid(P, Fd, To) ->
+ send_command(P, ei_format_pid, [Fd, To]),
+ get_send_result(P).
+
ei_send_funs(P, Fd, To, Msg) ->
send_command(P, ei_send_funs, [Fd,To,Msg]),
get_send_result(P).
diff --git a/lib/erl_interface/test/ei_connect_SUITE_data/ei_connect_test.c b/lib/erl_interface/test/ei_connect_SUITE_data/ei_connect_test.c
index debd3e789b..88a9950994 100644
--- a/lib/erl_interface/test/ei_connect_SUITE_data/ei_connect_test.c
+++ b/lib/erl_interface/test/ei_connect_SUITE_data/ei_connect_test.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2001-2011. 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
@@ -35,6 +35,7 @@
static void cmd_ei_connect_init(char* buf, int len);
static void cmd_ei_connect(char* buf, int len);
static void cmd_ei_send(char* buf, int len);
+static void cmd_ei_format_pid(char* buf, int len);
static void cmd_ei_send_funs(char* buf, int len);
static void cmd_ei_reg_send(char* buf, int len);
static void cmd_ei_rpc(char* buf, int len);
@@ -57,6 +58,7 @@ static struct {
"ei_reg_send", 3, cmd_ei_reg_send,
"ei_rpc", 4, cmd_ei_rpc,
"ei_set_get_tracelevel", 1, cmd_ei_set_get_tracelevel,
+ "ei_format_pid", 2, cmd_ei_format_pid,
};
@@ -111,7 +113,7 @@ static void cmd_ei_connect_init(char* buf, int len)
ei_x_buff res;
if (ei_decode_long(buf, &index, &l) < 0)
fail("expected int");
- sprintf(b, "c%d", l);
+ sprintf(b, "c%ld", l);
/* FIXME don't use internal and maybe use skip?! */
ei_get_type_internal(buf, &index, &type, &size);
if (ei_decode_atom(buf, &index, cookie) < 0)
@@ -183,6 +185,25 @@ static void cmd_ei_send(char* buf, int len)
ei_x_free(&x);
}
+static void cmd_ei_format_pid(char* buf, int len)
+{
+ int index = 0;
+ long fd;
+ erlang_pid pid;
+ ei_x_buff x;
+
+ if (ei_decode_long(buf, &index, &fd) < 0)
+ fail("expected long");
+ if (ei_decode_pid(buf, &index, &pid) < 0)
+ fail("expected pid (node)");
+ if (ei_x_new_with_version(&x) < 0)
+ fail("ei_x_new_with_version");
+ if (ei_x_format_wo_ver(&x, "~p", &pid) < 0)
+ fail("ei_x_format_wo_ver");
+ send_errno_result(ei_send(fd, &pid, x.buff, x.index));
+ ei_x_free(&x);
+}
+
static void cmd_ei_send_funs(char* buf, int len)
{
int index = 0, n;
diff --git a/lib/erl_interface/test/ei_decode_SUITE.erl b/lib/erl_interface/test/ei_decode_SUITE.erl
index 524a04a3b4..bb44b78854 100644
--- a/lib/erl_interface/test/ei_decode_SUITE.erl
+++ b/lib/erl_interface/test/ei_decode_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -20,12 +20,13 @@
%%
-module(ei_decode_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("ei_decode_SUITE_data/ei_decode_test_cases.hrl").
-export(
[
- all/1,
+ all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
test_ei_decode_long/1,
test_ei_decode_ulong/1,
test_ei_decode_longlong/1,
@@ -35,16 +36,29 @@
test_ei_decode_misc/1
]).
-all(suite) ->
- [
- test_ei_decode_long,
- test_ei_decode_ulong,
- test_ei_decode_longlong,
- test_ei_decode_ulonglong,
- test_ei_decode_char,
- test_ei_decode_nonoptimal,
- test_ei_decode_misc
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [test_ei_decode_long, test_ei_decode_ulong,
+ test_ei_decode_longlong, test_ei_decode_ulonglong,
+ test_ei_decode_char, test_ei_decode_nonoptimal,
+ test_ei_decode_misc].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% ---------------------------------------------------------------------------
diff --git a/lib/erl_interface/test/ei_decode_encode_SUITE.erl b/lib/erl_interface/test/ei_decode_encode_SUITE.erl
index c19c1d0887..85cb62239b 100644
--- a/lib/erl_interface/test/ei_decode_encode_SUITE.erl
+++ b/lib/erl_interface/test/ei_decode_encode_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -20,19 +20,36 @@
%%
-module(ei_decode_encode_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("ei_decode_encode_SUITE_data/ei_decode_encode_test_cases.hrl").
-export(
[
- all/1,
+ all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
test_ei_decode_encode/1
]).
-all(suite) ->
- [
- test_ei_decode_encode
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [test_ei_decode_encode].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% ---------------------------------------------------------------------------
diff --git a/lib/erl_interface/test/ei_encode_SUITE.erl b/lib/erl_interface/test/ei_encode_SUITE.erl
index 6b9de4f093..cefd33e5f6 100644
--- a/lib/erl_interface/test/ei_encode_SUITE.erl
+++ b/lib/erl_interface/test/ei_encode_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -20,12 +20,13 @@
%%
-module(ei_encode_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("ei_encode_SUITE_data/ei_encode_test_cases.hrl").
-export(
[
- all/1,
+ all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
test_ei_encode_long/1,
test_ei_encode_ulong/1,
test_ei_encode_longlong/1,
@@ -35,16 +36,29 @@
test_ei_encode_fails/1
]).
-all(suite) ->
- [
- test_ei_encode_long,
- test_ei_encode_ulong,
- test_ei_encode_longlong,
- test_ei_encode_ulonglong,
- test_ei_encode_char,
- test_ei_encode_misc,
- test_ei_encode_fails
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [test_ei_encode_long, test_ei_encode_ulong,
+ test_ei_encode_longlong, test_ei_encode_ulonglong,
+ test_ei_encode_char, test_ei_encode_misc,
+ test_ei_encode_fails].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% ---------------------------------------------------------------------------
diff --git a/lib/erl_interface/test/ei_format_SUITE.erl b/lib/erl_interface/test/ei_format_SUITE.erl
index cbe9fa52d7..2a26ed142b 100644
--- a/lib/erl_interface/test/ei_format_SUITE.erl
+++ b/lib/erl_interface/test/ei_format_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -20,15 +20,17 @@
%%
-module(ei_format_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("ei_format_SUITE_data/ei_format_test_cases.hrl").
-export([
- format_wo_ver/1,
- all/1,
- atoms/1,
- tuples/1,
- lists/1
+ format_wo_ver/1,
+ all/0, suite/0,groups/0,
+ init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ atoms/1,
+ tuples/1,
+ lists/1
]).
-import(runner, [get_term/1]).
@@ -36,12 +38,26 @@
%% This test suite test the erl_format() function.
%% It uses the port program "ei_format_test".
-all(suite) -> [
- format_wo_ver,
- atoms,
- tuples,
- lists
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [format_wo_ver, atoms, tuples, lists].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% Tests formatting various atoms.
@@ -155,7 +171,7 @@ format_wo_ver(suite) -> [];
format_wo_ver(Config) when is_list(Config) ->
?line P = runner:start(?format_wo_ver),
- ?line {term, [-1, 2, {a, "b"}, {c, 10}]} = get_term(P),
+ ?line {term, [-1, 2, $c, {a, "b"}, {c, 10}]} = get_term(P),
?line runner:recv_eot(P),
ok.
diff --git a/lib/erl_interface/test/ei_format_SUITE_data/ei_format_test.c b/lib/erl_interface/test/ei_format_SUITE_data/ei_format_test.c
index ecdce402f5..4f6c15ba9c 100644
--- a/lib/erl_interface/test/ei_format_SUITE_data/ei_format_test.c
+++ b/lib/erl_interface/test/ei_format_SUITE_data/ei_format_test.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2001-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2001-2011. 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
@@ -176,7 +176,7 @@ TESTCASE(format_wo_ver) {
ei_x_buff x;
ei_x_new (&x);
- ei_x_format(&x, "[-1, +2, {~a,~s},{~a,~i}]", "a", "b", "c", 10);
+ ei_x_format(&x, "[-1, +2, ~c, {~a,~s},{~a,~i}]", 'c', "a", "b", "c", 10);
send_bin_term(&x);
free(x.buff);
diff --git a/lib/erl_interface/test/ei_print_SUITE.erl b/lib/erl_interface/test/ei_print_SUITE.erl
index a0f15338c6..2a3ed81f53 100644
--- a/lib/erl_interface/test/ei_print_SUITE.erl
+++ b/lib/erl_interface/test/ei_print_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -20,17 +20,38 @@
%%
-module(ei_print_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("ei_print_SUITE_data/ei_print_test_cases.hrl").
--export([all/1, atoms/1, tuples/1, lists/1, strings/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ atoms/1, tuples/1, lists/1, strings/1]).
-import(runner, [get_term/1]).
%% This test suite test the ei_print() function.
%% It uses the port program "ei_format_test".
-all(suite) -> [atoms, tuples, lists, strings].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [atoms, tuples, lists, strings].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% Tests formatting various atoms.
diff --git a/lib/erl_interface/test/ei_tmo_SUITE.erl b/lib/erl_interface/test/ei_tmo_SUITE.erl
index e7a2465421..7ff8c08280 100644
--- a/lib/erl_interface/test/ei_tmo_SUITE.erl
+++ b/lib/erl_interface/test/ei_tmo_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -20,18 +20,39 @@
%%
-module(ei_tmo_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("kernel/include/inet.hrl").
-include("ei_tmo_SUITE_data/ei_tmo_test_cases.hrl").
-define(dummy_host,test01).
--export([all/1, init_per_testcase/2, fin_per_testcase/2,
+-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,
framework_check/1, ei_accept_tmo/1, ei_connect_tmo/1, ei_send_tmo/1,
ei_recv_tmo/1]).
-all(suite) -> [framework_check,ei_accept_tmo,ei_connect_tmo,
- ei_send_tmo,ei_recv_tmo].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [framework_check, ei_accept_tmo, ei_connect_tmo,
+ ei_send_tmo, ei_recv_tmo].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Case, Config) ->
Dog = ?t:timetrap(?t:minutes(1)),
@@ -43,7 +64,7 @@ init_per_testcase(_Case, Config) ->
end,
[{vxsim,Bool},{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/erl_interface/test/erl_connect_SUITE.erl b/lib/erl_interface/test/erl_connect_SUITE.erl
index 0d6539d98f..bd54013402 100644
--- a/lib/erl_interface/test/erl_connect_SUITE.erl
+++ b/lib/erl_interface/test/erl_connect_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -20,22 +20,42 @@
%%
-module(erl_connect_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("erl_connect_SUITE_data/erl_connect_test_cases.hrl").
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
erl_send/1,erl_reg_send/1, erl_send_cookie_file/1]).
-import(runner, [get_term/1,send_term/2]).
-all(suite) ->
- [erl_send,erl_reg_send,erl_send_cookie_file].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [erl_send, erl_reg_send, erl_send_cookie_file].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Case, Config) ->
Dog = ?t:timetrap(?t:minutes(0.25)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/erl_interface/test/erl_eterm_SUITE.erl b/lib/erl_interface/test/erl_eterm_SUITE.erl
index 634e2f9aa0..10a27e48e3 100644
--- a/lib/erl_interface/test/erl_eterm_SUITE.erl
+++ b/lib/erl_interface/test/erl_eterm_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -20,7 +20,7 @@
%%
-module(erl_eterm_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("erl_eterm_SUITE_data/eterm_test_cases.hrl").
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -33,7 +33,9 @@
%%% 5. Miscellanous functions.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--export([all/1, build_terms/1, round_trip_conversion/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ build_terms/1, round_trip_conversion/1,
decode_terms/1, decode_float/1,
t_erl_mk_int/1, t_erl_mk_list/1,
basic_copy/1,
@@ -73,38 +75,38 @@
%% This test suite controls the running of the C language functions
%% in eterm_test.c and print_term.c.
-all(suite) -> [build_terms, round_trip_conversion,
- decode_terms, decode_float,
- t_erl_mk_int, t_erl_mk_list,
- basic_copy,
- t_erl_mk_atom,
- t_erl_mk_binary,
- t_erl_mk_empty_list,
- t_erl_mk_float,
- t_erl_mk_pid,
- t_erl_mk_xpid,
- t_erl_mk_port,
- t_erl_mk_xport,
- t_erl_mk_ref,
- t_erl_mk_long_ref,
- t_erl_mk_string,
- t_erl_mk_estring,
- t_erl_mk_tuple,
- t_erl_mk_uint,
- t_erl_mk_var,
- t_erl_size,
- t_erl_var_content,
- t_erl_element,
- t_erl_cons,
- t_erl_length, t_erl_hd, t_erl_tl,
- type_checks, extractor_macros,
- t_erl_iolist_length, t_erl_iolist_to_binary,
- t_erl_iolist_to_string,
- erl_print_term, print_string,
- t_erl_free_compound,
- high_chaparal,
- broken_data,
- cnode_1].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [build_terms, round_trip_conversion, decode_terms,
+ decode_float, t_erl_mk_int, t_erl_mk_list, basic_copy,
+ t_erl_mk_atom, t_erl_mk_binary, t_erl_mk_empty_list,
+ t_erl_mk_float, t_erl_mk_pid, t_erl_mk_xpid,
+ t_erl_mk_port, t_erl_mk_xport, t_erl_mk_ref,
+ t_erl_mk_long_ref, t_erl_mk_string, t_erl_mk_estring,
+ t_erl_mk_tuple, t_erl_mk_uint, t_erl_mk_var, t_erl_size,
+ t_erl_var_content, t_erl_element, t_erl_cons,
+ t_erl_length, t_erl_hd, t_erl_tl, type_checks,
+ extractor_macros, t_erl_iolist_length,
+ t_erl_iolist_to_binary, t_erl_iolist_to_string,
+ erl_print_term, print_string, t_erl_free_compound,
+ high_chaparal, broken_data, cnode_1].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/erl_interface/test/erl_ext_SUITE.erl b/lib/erl_interface/test/erl_ext_SUITE.erl
index dbafea0e39..fc3e823d42 100644
--- a/lib/erl_interface/test/erl_ext_SUITE.erl
+++ b/lib/erl_interface/test/erl_ext_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
@@ -20,27 +20,42 @@
%%
-module(erl_ext_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("erl_ext_SUITE_data/ext_test_cases.hrl").
-export([
- all/1,
- compare_tuple/1,
- compare_list/1,
- compare_string/1,
- compare_list_string/1,
- compare_nc_ext/1
+ all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ compare_tuple/1,
+ compare_list/1,
+ compare_string/1,
+ compare_list_string/1,
+ compare_nc_ext/1
]).
-import(runner, [get_term/1]).
-all(suite) -> [
- compare_tuple,
- compare_list,
- compare_string,
- compare_list_string,
- compare_nc_ext
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [compare_tuple, compare_list, compare_string,
+ compare_list_string, compare_nc_ext].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
compare_tuple(suite) -> [];
compare_tuple(doc) -> [];
diff --git a/lib/erl_interface/test/erl_ext_SUITE_data/ext_test.c b/lib/erl_interface/test/erl_ext_SUITE_data/ext_test.c
index ba1a6c66da..a4a8da6347 100644
--- a/lib/erl_interface/test/erl_ext_SUITE_data/ext_test.c
+++ b/lib/erl_interface/test/erl_ext_SUITE_data/ext_test.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2002-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2002-2011. 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
@@ -82,6 +82,11 @@ TESTCASE(compare_list) {
// erlang:term_to_binary([34,{a,n},a,erlang])
unsigned char term2[] = {131,108,0,0,0,4,97,34,104,2,100,0,1,97,100,0,1,110,100,0,1,97,100,0,6,101,114,108,97,110,103,106};
+ // erlang:term_to_binary([0])
+ unsigned char term3[] = {131,107,0,1,0};
+ // erlang:term_to_binary([0, 1000])
+ unsigned char term4[] = {131,108,0,0,0,2,97,0,98,0,0,3,232,106};
+
erl_init(NULL, 0);
start_a = term1;
start_b = term2;
@@ -90,6 +95,13 @@ TESTCASE(compare_list) {
test_compare_ext("lists", start_a, end_a, start_b, end_b, 1);
+ start_a = term3;
+ start_b = term4;
+ end_a = term3 + sizeof(term3);
+ end_b = term4 + sizeof(term4);
+
+ test_compare_ext("lists1", start_a, end_a, start_b, end_b, -1);
+
report(1);
}
diff --git a/lib/erl_interface/test/erl_format_SUITE.erl b/lib/erl_interface/test/erl_format_SUITE.erl
index 81a0bca80f..c722bd050f 100644
--- a/lib/erl_interface/test/erl_format_SUITE.erl
+++ b/lib/erl_interface/test/erl_format_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -20,17 +20,37 @@
%%
-module(erl_format_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("erl_format_SUITE_data/format_test_cases.hrl").
--export([all/1, atoms/1, tuples/1, lists/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, atoms/1, tuples/1, lists/1]).
-import(runner, [get_term/1]).
%% This test suite test the erl_format() function.
%% It uses the port program "format_test".
-all(suite) -> [atoms, tuples, lists].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [atoms, tuples, lists].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% Tests formatting various atoms.
diff --git a/lib/erl_interface/test/erl_global_SUITE.erl b/lib/erl_interface/test/erl_global_SUITE.erl
new file mode 100644
index 0000000000..a27cb0664c
--- /dev/null
+++ b/lib/erl_interface/test/erl_global_SUITE.erl
@@ -0,0 +1,142 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2000-2011. 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(erl_global_SUITE).
+
+-include_lib("test_server/include/test_server.hrl").
+-include("erl_global_SUITE_data/erl_global_test_cases.hrl").
+
+-export([all/0,suite/0,init_per_suite/1,end_per_suite/1,
+ init_per_testcase/2,end_per_testcase/2,
+ erl_global_registration/1, erl_global_whereis/1, erl_global_names/1]).
+
+-import(runner, [get_term/1,send_term/2]).
+
+-define(GLOBAL_NAME, global_register_node_test).
+
+all() ->
+ [erl_global_registration, erl_global_whereis, erl_global_names].
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_testcase(_Case, Config) ->
+ Dog = ?t:timetrap(?t:minutes(0.25)),
+ [{watchdog, Dog}|Config].
+
+end_per_testcase(_Case, Config) ->
+ Dog = ?config(watchdog, Config),
+ test_server:timetrap_cancel(Dog),
+ ok.
+
+erl_global_registration(Config) when is_list(Config) ->
+ ?line P = runner:start(?interpret),
+ ?line {ok, Fd} = erl_connect(P, node(), 42, erlang:get_cookie(), 0),
+
+ ?line ok = erl_global_register(P, Fd, ?GLOBAL_NAME),
+ ?line ok = erl_global_unregister(P, Fd, ?GLOBAL_NAME),
+
+ ?line 0 = erl_close_connection(P,Fd),
+ ?line runner:send_eot(P),
+ ?line runner:recv_eot(P),
+ ok.
+
+erl_global_whereis(Config) when is_list(Config) ->
+ ?line P = runner:start(?interpret),
+ ?line {ok, Fd} = erl_connect(P, node(), 42, erlang:get_cookie(), 0),
+
+ ?line Self = self(),
+ ?line yes = global:register_name(?GLOBAL_NAME, Self),
+ ?line Self = erl_global_whereis(P, Fd, ?GLOBAL_NAME),
+ ?line global:unregister_name(?GLOBAL_NAME),
+ ?line 0 = erl_close_connection(P, Fd),
+ ?line runner:send_eot(P),
+ ?line runner:recv_eot(P),
+ ok.
+
+erl_global_names(Config) when is_list(Config) ->
+ ?line P = runner:start(?interpret),
+ ?line {ok, Fd} = erl_connect(P, node(), 42, erlang:get_cookie(), 0),
+
+ ?line Self = self(),
+ ?line global:register_name(?GLOBAL_NAME, Self),
+ ?line {Names1, _N1} = erl_global_names(P, Fd),
+ ?line true = lists:member(atom_to_list(?GLOBAL_NAME), Names1),
+ ?line global:unregister_name(?GLOBAL_NAME),
+ ?line {Names2, _N2} = erl_global_names(P, Fd),
+ ?line false = lists:member(atom_to_list(?GLOBAL_NAME), Names2),
+ ?line 0 = erl_close_connection(P, Fd),
+ ?line runner:send_eot(P),
+ ?line runner:recv_eot(P),
+ ok.
+
+%%% Interface functions for erl_interface functions.
+
+erl_connect(P, Node, Num, Cookie, Creation) ->
+ send_command(P, erl_connect, [Num, Node, Cookie, Creation]),
+ case get_term(P) of
+ {term,{Fd,_}} when Fd >= 0 -> {ok,Fd};
+ {term,{-1,Errno}} -> {error,Errno}
+ end.
+
+erl_close_connection(P, FD) ->
+ send_command(P, erl_close_connection, [FD]),
+ case get_term(P) of
+ {term,Int} when is_integer(Int) -> Int
+ end.
+
+erl_global_register(P, Fd, Name) ->
+ send_command(P, erl_global_register, [Fd,Name]),
+ get_send_result(P).
+
+erl_global_whereis(P, Fd, Name) ->
+ send_command(P, erl_global_whereis, [Fd,Name]),
+ case get_term(P) of
+ {term, What} ->
+ What
+ end.
+
+erl_global_names(P, Fd) ->
+ send_command(P, erl_global_names, [Fd]),
+ case get_term(P) of
+ {term, What} ->
+ What
+ end.
+
+erl_global_unregister(P, Fd, Name) ->
+ send_command(P, erl_global_unregister, [Fd,Name]),
+ get_send_result(P).
+
+get_send_result(P) ->
+ case get_term(P) of
+ {term,{1,_}} -> ok;
+ {term,{0, 0}} -> ok;
+ {term,{-1, Errno}} -> {error,Errno};
+ {term,{_,_}}->
+ ?t:fail(bad_return_value)
+ end.
+
+send_command(P, Name, Args) ->
+ runner:send_term(P, {Name,list_to_tuple(Args)}).
diff --git a/lib/erl_interface/test/erl_global_SUITE_data/Makefile.first b/lib/erl_interface/test/erl_global_SUITE_data/Makefile.first
new file mode 100644
index 0000000000..8e3fcb924e
--- /dev/null
+++ b/lib/erl_interface/test/erl_global_SUITE_data/Makefile.first
@@ -0,0 +1,21 @@
+#
+# %CopyrightBegin%
+#
+# Copyright Ericsson AB 2001-2010. 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%
+#
+
+erl_global_test_decl.c: erl_global_test.c
+ erl -noinput -pa ../all_SUITE_data -s init_tc run erl_global_test -s erlang halt
diff --git a/lib/erl_interface/test/erl_global_SUITE_data/Makefile.src b/lib/erl_interface/test/erl_global_SUITE_data/Makefile.src
new file mode 100644
index 0000000000..ef846bc440
--- /dev/null
+++ b/lib/erl_interface/test/erl_global_SUITE_data/Makefile.src
@@ -0,0 +1,41 @@
+#
+# %CopyrightBegin%
+#
+# Copyright Ericsson AB 2000-2010. 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%
+#
+
+include @erl_interface_mk_include@@[email protected]
+
+CC0 = @CC@
+CC = ..@DS@all_SUITE_data@DS@gccifier@exe@ -CC"$(CC0)"
+LD = @LD@
+LIBPATH = @erl_interface_libpath@
+LIBERL = $(LIBPATH)/@erl_interface_lib@
+LIBEI = $(LIBPATH)/@erl_interface_eilib@
+LIBFLAGS = ../all_SUITE_data/runner@obj@ \
+ $(LIBERL) $(LIBEI) @LIBS@ @erl_interface_sock_libs@ \
+ @erl_interface_threadlib@
+CFLAGS = @EI_CFLAGS@ $(THR_DEFS) -I@erl_interface_include@ -I../all_SUITE_data
+OBJS = erl_global_test@obj@ erl_global_test_decl@obj@
+
+all: erl_global_test@exe@
+
+erl_global_test@exe@: $(OBJS) $(LIBERL) $(LIBEI)
+ $(LD) @CROSSLDFLAGS@ -o $@ $(OBJS) $(LIBFLAGS)
+
+clean:
+ $(RM) $(OBJS)
+ $(RM) erl_global_test@exe@
diff --git a/lib/erl_interface/test/erl_global_SUITE_data/erl_global_test.c b/lib/erl_interface/test/erl_global_SUITE_data/erl_global_test.c
new file mode 100644
index 0000000000..dc0d8a0091
--- /dev/null
+++ b/lib/erl_interface/test/erl_global_SUITE_data/erl_global_test.c
@@ -0,0 +1,263 @@
+/*
+ * %CopyrightBegin%
+ *
+ * Copyright Ericsson AB 2000-2010. 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%
+ */
+
+/*
+ * Purpose: Tests the functions in erl_global.c.
+ *
+ * See the erl_global_SUITE.erl file for a "table of contents".
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "runner.h"
+
+static void cmd_erl_connect(ETERM* args);
+static void cmd_erl_global_register(ETERM *args);
+static void cmd_erl_global_whereis(ETERM *args);
+static void cmd_erl_global_names(ETERM *args);
+static void cmd_erl_global_unregister(ETERM *args);
+static void cmd_erl_close_connection(ETERM *args);
+
+static void send_errno_result(int value);
+
+static struct {
+ char* name;
+ int num_args; /* Number of arguments. */
+ void (*func)(ETERM* args);
+} commands[] = {
+ "erl_connect", 4, cmd_erl_connect,
+ "erl_close_connection", 1, cmd_erl_close_connection,
+ "erl_global_register", 2, cmd_erl_global_register,
+ "erl_global_whereis", 2, cmd_erl_global_whereis,
+ "erl_global_names", 1, cmd_erl_global_names,
+ "erl_global_unregister", 2, cmd_erl_global_unregister,
+};
+
+
+/*
+ * Sends a list contaning all data types to the Erlang side.
+ */
+
+TESTCASE(interpret)
+{
+ ETERM* term;
+
+ erl_init(NULL, 0);
+
+ outer_loop:
+
+ term = get_term();
+
+ if (term == NULL) {
+ report(1);
+ return;
+ } else {
+ ETERM* Func;
+ ETERM* Args;
+ int i;
+
+ if (!ERL_IS_TUPLE(term) || ERL_TUPLE_SIZE(term) != 2) {
+ fail("term should be a tuple of size 2");
+ }
+
+ Func = erl_element(1, term);
+ if (!ERL_IS_ATOM(Func)) {
+ fail("function name should be an atom");
+ }
+ Args = erl_element(2, term);
+ if (!ERL_IS_TUPLE(Args)) {
+ fail("function arguments should be a tuple");
+ }
+ erl_free_term(term);
+ for (i = 0; i < sizeof(commands)/sizeof(commands[0]); i++) {
+ int n = strlen(commands[i].name);
+ if (ERL_ATOM_SIZE(Func) != n) {
+ continue;
+ }
+ if (memcmp(ERL_ATOM_PTR(Func), commands[i].name, n) == 0) {
+ erl_free_term(Func);
+ if (ERL_TUPLE_SIZE(Args) != commands[i].num_args) {
+ fail("wrong number of arguments");
+ }
+ commands[i].func(Args);
+ erl_free_term(Args);
+ goto outer_loop;
+ }
+ }
+ fail("bad command");
+ }
+}
+
+#define VERIFY_TYPE(Test, Term) \
+if (!Test(Term)) { \
+ fail("wrong type for " #Term); \
+} else { \
+}
+
+static void
+cmd_erl_connect(ETERM* args)
+{
+ ETERM* number;
+ ETERM* node;
+ ETERM* cookie;
+
+ int res;
+ char buffer[256];
+
+ number = ERL_TUPLE_ELEMENT(args, 0);
+ VERIFY_TYPE(ERL_IS_INTEGER, number);
+ node = ERL_TUPLE_ELEMENT(args, 1);
+ VERIFY_TYPE(ERL_IS_ATOM, node);
+ cookie = ERL_TUPLE_ELEMENT(args, 2);
+ VERIFY_TYPE(ERL_IS_ATOM, cookie);
+
+ if (ERL_ATOM_SIZE(cookie) == 0) {
+ res = erl_connect_init(ERL_INT_VALUE(number), 0, 0);
+ } else {
+ memcpy(buffer, ERL_ATOM_PTR(cookie), ERL_ATOM_SIZE(cookie));
+ buffer[ERL_ATOM_SIZE(cookie)] = '\0';
+ res = erl_connect_init(ERL_INT_VALUE(number), buffer, 0);
+ }
+
+ if(!res) {
+ send_errno_result(res);
+ return;
+ }
+
+ memcpy(buffer, ERL_ATOM_PTR(node), ERL_ATOM_SIZE(node));
+ buffer[ERL_ATOM_SIZE(node)] = '\0';
+ send_errno_result(erl_connect(buffer));
+}
+
+static void
+cmd_erl_close_connection(ETERM* args)
+{
+ ETERM* number;
+ ETERM* res;
+
+ number = ERL_TUPLE_ELEMENT(args, 0);
+ VERIFY_TYPE(ERL_IS_INTEGER, number);
+ res = erl_mk_int(erl_close_connection(ERL_INT_VALUE(number)));
+ send_term(res);
+ erl_free_term(res);
+}
+
+static void
+cmd_erl_global_register(ETERM* args)
+{
+ ETERM* fd_term = ERL_TUPLE_ELEMENT(args, 0);
+ ETERM* name = ERL_TUPLE_ELEMENT(args, 1);
+ ETERM* pid = erl_mk_pid(erl_thisnodename(), 14, 0, 0);
+
+ char buffer[256];
+
+ VERIFY_TYPE(ERL_IS_INTEGER, fd_term);
+ VERIFY_TYPE(ERL_IS_ATOM, name);
+
+ memcpy(buffer, ERL_ATOM_PTR(name), ERL_ATOM_SIZE(name));
+ buffer[ERL_ATOM_SIZE(name)] = '\0';
+
+ send_errno_result(erl_global_register(ERL_INT_VALUE(fd_term), buffer, pid));
+ erl_free_term(pid);
+}
+
+static void
+cmd_erl_global_whereis(ETERM* args)
+{
+ ETERM* fd_term = ERL_TUPLE_ELEMENT(args, 0);
+ ETERM* name = ERL_TUPLE_ELEMENT(args, 1);
+ ETERM* pid = NULL;
+
+ char buffer[256];
+
+ VERIFY_TYPE(ERL_IS_INTEGER, fd_term);
+ VERIFY_TYPE(ERL_IS_ATOM, name);
+
+ memcpy(buffer, ERL_ATOM_PTR(name), ERL_ATOM_SIZE(name));
+ buffer[ERL_ATOM_SIZE(name)] = '\0';
+
+ pid = erl_global_whereis(ERL_INT_VALUE(fd_term), buffer, NULL);
+ send_term(pid);
+ erl_free_term(pid);
+}
+
+static void
+cmd_erl_global_names(ETERM* args)
+{
+ ETERM* fd_term = ERL_TUPLE_ELEMENT(args, 0);
+
+ ETERM* res_array[2], *res_tuple, *name;
+ char** names = NULL;
+ int count = 0, i;
+
+ VERIFY_TYPE(ERL_IS_INTEGER, fd_term);
+
+ names = erl_global_names(ERL_INT_VALUE(fd_term), &count);
+
+ res_array[0] = erl_mk_empty_list();
+ for(i=0; i<count; i++) {
+ name = erl_mk_string(names[i]);
+ res_array[0] = erl_cons(name, res_array[0]);
+ }
+
+ free(names);
+
+ res_array[1] = erl_mk_int(count);
+ res_tuple = erl_mk_tuple(res_array, 2);
+
+ send_term(res_tuple);
+
+ erl_free_compound(res_array[0]);
+ erl_free_term(res_array[1]);
+ erl_free_term(res_tuple);
+}
+
+static void
+cmd_erl_global_unregister(ETERM* args)
+{
+ ETERM* fd_term = ERL_TUPLE_ELEMENT(args, 0);
+ ETERM* name = ERL_TUPLE_ELEMENT(args, 1);
+
+ char buffer[256];
+
+ VERIFY_TYPE(ERL_IS_INTEGER, fd_term);
+ VERIFY_TYPE(ERL_IS_ATOM, name);
+
+ memcpy(buffer, ERL_ATOM_PTR(name), ERL_ATOM_SIZE(name));
+ buffer[ERL_ATOM_SIZE(name)] = '\0';
+
+ send_errno_result(erl_global_unregister(ERL_INT_VALUE(fd_term), buffer));
+}
+
+static void
+send_errno_result(int value)
+{
+ ETERM* res_array[2];
+ ETERM* res_tuple;
+
+ res_array[0] = erl_mk_int(value);
+ res_array[1] = erl_mk_int(erl_errno);
+ res_tuple = erl_mk_tuple(res_array, 2);
+ send_term(res_tuple);
+ erl_free_term(res_array[0]);
+ erl_free_term(res_array[1]);
+ erl_free_term(res_tuple);
+}
diff --git a/lib/erl_interface/test/erl_interface.cover b/lib/erl_interface/test/erl_interface.cover
new file mode 100644
index 0000000000..879201a3cd
--- /dev/null
+++ b/lib/erl_interface/test/erl_interface.cover
@@ -0,0 +1,2 @@
+{incl_app,erl_interface,details}.
+
diff --git a/lib/erl_interface/test/erl_interface.spec b/lib/erl_interface/test/erl_interface.spec
index 2789bd3e2c..a0a7acfa50 100644
--- a/lib/erl_interface/test/erl_interface.spec
+++ b/lib/erl_interface/test/erl_interface.spec
@@ -1,2 +1 @@
-{topcase, {dir, "../erl_interface_test"}}.
-
+{suites,"../erl_interface_test",all}.
diff --git a/lib/erl_interface/test/erl_match_SUITE.erl b/lib/erl_interface/test/erl_match_SUITE.erl
index f506638544..e019fecca8 100644
--- a/lib/erl_interface/test/erl_match_SUITE.erl
+++ b/lib/erl_interface/test/erl_match_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -20,10 +20,12 @@
%%
-module(erl_match_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("erl_match_SUITE_data/match_test_cases.hrl").
--export([all/1, atoms/1, lists/1, tuples/1, references/1, pids/1, ports/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ atoms/1, lists/1, tuples/1, references/1, pids/1, ports/1,
bind/1, integers/1, floats/1, binaries/1, strings/1]).
%% For interactive running of matcher.
@@ -31,8 +33,27 @@
%% This test suite tests the erl_match() function.
-all(suite) -> [atoms, lists, tuples, references, pids, ports, bind,
- integers, floats, binaries, strings].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [atoms, lists, tuples, references, pids, ports, bind,
+ integers, floats, binaries, strings].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
atoms(suite) -> [];
atoms(Config) when is_list(Config) ->
diff --git a/lib/erl_interface/test/port_call_SUITE.erl b/lib/erl_interface/test/port_call_SUITE.erl
index 895e29ad2e..1ce5b0b748 100644
--- a/lib/erl_interface/test/port_call_SUITE.erl
+++ b/lib/erl_interface/test/port_call_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -31,17 +31,37 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--export([all/1, basic/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, init_per_group/2,end_per_group/2, basic/1]).
% Private exports
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
- [basic].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+[basic].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
basic(suite) -> [];
basic(Config) when is_list(Config) ->
case os:type() of
+ {unix, linux} ->
+ do_basic(Config);
{unix, sunos} ->
do_basic(Config);
{win32,_} ->
diff --git a/lib/erl_interface/test/runner.erl b/lib/erl_interface/test/runner.erl
index b72723c6a5..e41440708a 100644
--- a/lib/erl_interface/test/runner.erl
+++ b/lib/erl_interface/test/runner.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2010. 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
diff --git a/lib/erl_interface/vsn.mk b/lib/erl_interface/vsn.mk
index ffda886553..0317462106 100644
--- a/lib/erl_interface/vsn.mk
+++ b/lib/erl_interface/vsn.mk
@@ -1 +1 @@
-EI_VSN = 3.7.2
+EI_VSN = 3.7.3
diff --git a/lib/et/doc/src/et_tutorial.xmlsrc b/lib/et/doc/src/et_tutorial.xmlsrc
index b0e2bf4af6..1337af76d1 100644
--- a/lib/et/doc/src/et_tutorial.xmlsrc
+++ b/lib/et/doc/src/et_tutorial.xmlsrc
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2009</year><year>2009</year>
+ <year>2009</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
diff --git a/lib/et/src/et_wx_contents_viewer.erl b/lib/et/src/et_wx_contents_viewer.erl
index 8a8d9ef1ee..86f46f25d0 100644
--- a/lib/et/src/et_wx_contents_viewer.erl
+++ b/lib/et/src/et_wx_contents_viewer.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -464,7 +464,8 @@ create_window(S) ->
wxFrame:setMenuBar(Frame,Bar),
create_file_menu(Bar),
Editor = wxTextCtrl:new(Panel, ?wxID_ANY, [{style, 0
- bor ?wxDEFAULT
+ bor ?wxDEFAULT
+ bor ?wxTE_RICH2 %% Needed on Windows
bor ?wxTE_MULTILINE
bor ?wxTE_READONLY
bor ?wxTE_DONTWRAP}]),
@@ -483,6 +484,7 @@ create_window(S) ->
wxFrame:connect(Frame, close_window, [{skip,true}]),
wxFrame:setFocus(Frame),
wxPanel:setSizer(Panel, Sizer),
+ wxSizer:fit(Sizer, Panel),
wxFrame:show(Frame),
S2#state{menu_data = HideData++SearchData++FilterData, editor = Editor, frame = Frame}.
diff --git a/lib/et/src/et_wx_viewer.erl b/lib/et/src/et_wx_viewer.erl
index d42f8c0c86..7d4286ed9d 100644
--- a/lib/et/src/et_wx_viewer.erl
+++ b/lib/et/src/et_wx_viewer.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -846,9 +846,6 @@ handle_info(#wx{event = #wxSize{size = {OldW, OldH}}} = Wx, S) ->
refresh_main_window(S4)
end,
noreply(S6);
-handle_info(#wx{event = #wxFocus{}}, S) ->
- wxWindow:setFocus(S#state.canvas), % Get keyboard focus
- noreply(S);
handle_info(#wx{event = #wxMouse{type = enter_window}}, S) ->
wxWindow:setFocus(S#state.canvas), % Get keyboard focus
noreply(S);
@@ -1252,7 +1249,6 @@ create_main_window(S) ->
Self ! Ev
end}]),
wxPanel:connect(Canvas, key_down),
- wxPanel:connect(Canvas, kill_focus),
wxPanel:connect(Canvas, enter_window, [{skip, true}]),
wxFrame:connect(Frame, command_menu_selected),
wxFrame:connect(Frame, close_window),
diff --git a/lib/et/test/Makefile b/lib/et/test/Makefile
index 7227ae8fd8..e10a2a1587 100644
--- a/lib/et/test/Makefile
+++ b/lib/et/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2009-2010. All Rights Reserved.
+# Copyright Ericsson AB 2009-2011. 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
@@ -71,10 +71,10 @@ release_spec: opt
release_tests_spec: opt
$(INSTALL_DIR) $(RELSYSDIR)
- $(INSTALL_DATA) et.spec $(ERL_FILES) $(HRL_FILES) $(RELSYSDIR)
+ $(INSTALL_DATA) et.spec et.cover $(ERL_FILES) $(HRL_FILES) $(RELSYSDIR)
$(INSTALL_SCRIPT) ett $(RELSYSDIR)
$(INSTALL_DATA) $(INSTALL_PROGS) $(RELSYSDIR)
-# chmod -f -R u+w $(RELSYSDIR)
+# chmod -R u+w $(RELSYSDIR)
# @tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
release_docs_spec:
diff --git a/lib/et/test/et.cover b/lib/et/test/et.cover
new file mode 100644
index 0000000000..471e6d985d
--- /dev/null
+++ b/lib/et/test/et.cover
@@ -0,0 +1,2 @@
+{incl_app,et,details}.
+
diff --git a/lib/et/test/et.spec b/lib/et/test/et.spec
index 69cd8d7582..09993a217a 100644
--- a/lib/et/test/et.spec
+++ b/lib/et/test/et.spec
@@ -1,2 +1 @@
-{topcase, {dir, "../et_test"}}.
-
+{suites,"../et_test",all}.
diff --git a/lib/et/test/et_test_lib.erl b/lib/et/test/et_test_lib.erl
index b91b63786c..c1bfeb9fc0 100644
--- a/lib/et/test/et_test_lib.erl
+++ b/lib/et/test/et_test_lib.erl
@@ -95,7 +95,7 @@ wx_init_per_suite(Config) ->
exit({skipped, "Can not test on MacOSX"});
{unix, _} ->
io:format("DISPLAY ~s~n", [os:getenv("DISPLAY")]),
- case proplists:get_value(xserver, Config, none) of
+ case ct:get_config(xserver, none) of
none -> ignore;
Server -> os:putenv("DISPLAY", Server)
end;
@@ -295,7 +295,7 @@ eval_test_case(Mod, Fun, Config) ->
test_case_evaluator(Mod, Fun, [Config]) ->
NewConfig = Mod:init_per_testcase(Fun, Config),
R = apply(Mod, Fun, [NewConfig]),
- Mod:fin_per_testcase(Fun, NewConfig),
+ Mod:end_per_testcase(Fun, NewConfig),
exit({test_case_ok, R}).
wait_for_evaluator(Pid, Mod, Fun, Config) ->
@@ -311,12 +311,12 @@ wait_for_evaluator(Pid, Mod, Fun, Config) ->
{'EXIT', Pid, {skipped, Reason}} ->
log("<WARNING> Test case ~w skipped, because ~p~n",
[{Mod, Fun}, Reason]),
- Mod:fin_per_testcase(Fun, Config),
+ Mod:end_per_testcase(Fun, Config),
{skip, {Mod, Fun}, Reason};
{'EXIT', Pid, Reason} ->
log("<ERROR> Eval process ~w exited, because\n\t~p~n",
[{Mod, Fun}, Reason]),
- Mod:fin_per_testcase(Fun, Config),
+ Mod:end_per_testcase(Fun, Config),
{crash, {Mod, Fun}, Reason}
end.
diff --git a/lib/et/test/et_wx_SUITE.erl b/lib/et/test/et_wx_SUITE.erl
index 1a16ca69a3..b5f98f8616 100644
--- a/lib/et/test/et_wx_SUITE.erl
+++ b/lib/et/test/et_wx_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
@@ -18,8 +18,9 @@
-module(et_wx_SUITE).
--export([all/0, init_per_suite/1, end_per_suite/1,
- init_per_testcase/2, fin_per_testcase/2, end_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_suite/1, end_per_suite/1,
+ init_per_testcase/2, end_per_testcase/2]).
-compile(export_all).
@@ -36,16 +37,22 @@ init_per_testcase(Func,Config) ->
et_test_lib:init_per_testcase(Func,Config).
end_per_testcase(Func,Config) ->
et_test_lib:end_per_testcase(Func,Config).
-fin_per_testcase(Func,Config) -> %% For test_server
- et_test_lib:end_per_testcase(Func,Config).
%% SUITE specification
-all() ->
- all(suite).
-all(suite) ->
- [
- start_all_windows
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [start_all_windows].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% The test cases
diff --git a/lib/eunit/doc/src/book.xml b/lib/eunit/doc/src/book.xml
index 4444b1dd7a..eb044c1a66 100644
--- a/lib/eunit/doc/src/book.xml
+++ b/lib/eunit/doc/src/book.xml
@@ -5,7 +5,7 @@
<header titlestyle="normal">
<copyright>
<year>2008</year>
- <year>2008</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/eunit/doc/src/notes.xml b/lib/eunit/doc/src/notes.xml
index 1717dd7988..a9960153e5 100644
--- a/lib/eunit/doc/src/notes.xml
+++ b/lib/eunit/doc/src/notes.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2008</year>
- <year>2008</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/eunit/doc/src/part.xml b/lib/eunit/doc/src/part.xml
index e31a8d1b78..84e5aec039 100644
--- a/lib/eunit/doc/src/part.xml
+++ b/lib/eunit/doc/src/part.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2008</year>
- <year>2008</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/eunit/doc/src/part_notes.xml b/lib/eunit/doc/src/part_notes.xml
index 28644f961b..191d69b915 100644
--- a/lib/eunit/doc/src/part_notes.xml
+++ b/lib/eunit/doc/src/part_notes.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2008</year>
- <year>2008</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/eunit/doc/src/ref_man.xml b/lib/eunit/doc/src/ref_man.xml
index 02feef5e97..eb46ceda1e 100644
--- a/lib/eunit/doc/src/ref_man.xml
+++ b/lib/eunit/doc/src/ref_man.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2008</year>
- <year>2008</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/eunit/src/eunit.erl b/lib/eunit/src/eunit.erl
index 4a86a108cf..da35c5c2ec 100644
--- a/lib/eunit/src/eunit.erl
+++ b/lib/eunit/src/eunit.erl
@@ -157,6 +157,7 @@ test_run(Reference, Listeners) ->
receive
{done, Reference} ->
cast(Listeners, {stop, Reference, self()}),
+ wait_until_listeners_have_terminated(Listeners),
receive
{result, Reference, Result} ->
Result
@@ -169,6 +170,15 @@ cast([P | Ps], Msg) ->
cast([], _Msg) ->
ok.
+wait_until_listeners_have_terminated([P | Ps]) ->
+ MRef = erlang:monitor(process, P),
+ receive
+ {'DOWN', MRef, process, P, _} ->
+ wait_until_listeners_have_terminated(Ps)
+ end;
+wait_until_listeners_have_terminated([]) ->
+ ok.
+
%% TODO: functions that run tests on a given node, not a given server
%% TODO: maybe some functions could check for a globally registered server?
%% TODO: some synchronous but completely quiet interface function
diff --git a/lib/eunit/src/eunit_lib.erl b/lib/eunit/src/eunit_lib.erl
index 4751f1094a..45d2387e7b 100644
--- a/lib/eunit/src/eunit_lib.erl
+++ b/lib/eunit/src/eunit_lib.erl
@@ -33,7 +33,7 @@
-export([dlist_next/1, uniq/1, fun_parent/1, is_string/1, command/1,
command/2, command/3, trie_new/0, trie_store/2, trie_match/2,
split_node/1, consult_file/1, list_dir/1, format_exit_term/1,
- format_exception/1, format_error/1]).
+ format_exception/1, format_exception/2, format_error/1]).
%% Type definitions for describing exceptions
@@ -55,21 +55,23 @@
%% ---------------------------------------------------------------------
%% Formatting of error descriptors
+format_exception(Exception) ->
+ format_exception(Exception, 20).
-format_exception({Class,Term,Trace})
+format_exception({Class,Term,Trace}, Depth)
when is_atom(Class), is_list(Trace) ->
case is_stacktrace(Trace) of
true ->
io_lib:format("~w:~P\n~s",
- [Class, Term, 20, format_stacktrace(Trace)]);
+ [Class, Term, Depth, format_stacktrace(Trace)]);
false ->
- format_term(Term)
+ format_term(Term, Depth)
end;
-format_exception(Term) ->
- format_term(Term).
+format_exception(Term, Depth) ->
+ format_term(Term, Depth).
-format_term(Term) ->
- io_lib:format("~P\n", [Term, 15]).
+format_term(Term, Depth) ->
+ io_lib:format("~P\n", [Term, Depth]).
format_exit_term(Term) ->
{Reason, Trace} = analyze_exit_term(Term),
diff --git a/lib/eunit/src/eunit_surefire.erl b/lib/eunit/src/eunit_surefire.erl
index eb994a990a..dfb08c90b2 100644
--- a/lib/eunit/src/eunit_surefire.erl
+++ b/lib/eunit/src/eunit_surefire.erl
@@ -100,16 +100,10 @@ terminate({ok, _Data}, St) ->
XmlDir = St#state.xmldir,
write_report(TestSuite, XmlDir),
ok;
-terminate({error, Reason}, _St) ->
- io:fwrite("Internal error: ~P.\n", [Reason, 25]),
- sync_end(error).
-
-sync_end(Result) ->
- receive
- {stop, Reference, ReplyTo} ->
- ReplyTo ! {result, Reference, Result},
- ok
- end.
+terminate({error, _Reason}, _St) ->
+ %% Don't report any errors here, since eunit_tty takes care of that.
+ %% Just terminate.
+ ok.
handle_begin(group, Data, St) ->
NewId = proplists:get_value(id, Data),
@@ -323,7 +317,7 @@ write_testcase(
format_testcase_result(ok) -> [<<>>];
format_testcase_result({failed, {error, {Type, _}, _} = Exception}) when is_atom(Type) ->
[?INDENT, ?INDENT, <<"<failure type=\"">>, escape_attr(atom_to_list(Type)), <<"\">">>, ?NEWLINE,
- <<"::">>, escape_text(eunit_lib:format_exception(Exception)),
+ <<"::">>, escape_text(eunit_lib:format_exception(Exception, 100)),
?INDENT, ?INDENT, <<"</failure>">>, ?NEWLINE];
format_testcase_result({failed, Term}) ->
[?INDENT, ?INDENT, <<"<failure type=\"unknown\">">>, ?NEWLINE,
@@ -331,7 +325,7 @@ format_testcase_result({failed, Term}) ->
?INDENT, ?INDENT, <<"</failure>">>, ?NEWLINE];
format_testcase_result({aborted, {Class, _Term, _Trace} = Exception}) when is_atom(Class) ->
[?INDENT, ?INDENT, <<"<error type=\"">>, escape_attr(atom_to_list(Class)), <<"\">">>, ?NEWLINE,
- <<"::">>, escape_text(eunit_lib:format_exception(Exception)),
+ <<"::">>, escape_text(eunit_lib:format_exception(Exception, 100)),
?INDENT, ?INDENT, <<"</error>">>, ?NEWLINE];
format_testcase_result({aborted, Term}) ->
[?INDENT, ?INDENT, <<"<error type=\"unknown\">">>, ?NEWLINE,
diff --git a/lib/eunit/test/Makefile b/lib/eunit/test/Makefile
index 74d485d1cc..a2d276f619 100644
--- a/lib/eunit/test/Makefile
+++ b/lib/eunit/test/Makefile
@@ -75,7 +75,7 @@ release_spec: opt
release_tests_spec: make_emakefile
$(INSTALL_DIR) $(RELSYSDIR)
- $(INSTALL_DATA) eunit.dynspec $(EMAKEFILE) \
+ $(INSTALL_DATA) eunit.spec $(EMAKEFILE) \
$(COVERFILE) $(ERL_FILES) \
$(RELSYSDIR)
diff --git a/lib/eunit/test/eunit.cover b/lib/eunit/test/eunit.cover
index d1eaf770b6..00c09127a8 100644
--- a/lib/eunit/test/eunit.cover
+++ b/lib/eunit/test/eunit.cover
@@ -1,3 +1,5 @@
+{incl_app,eunit,details}.
+
%% -*- erlang -*-
-{exclude,[eunit_test]}.
+{excl_mods,eunit,[eunit_test]}.
diff --git a/lib/eunit/test/eunit.dynspec b/lib/eunit/test/eunit.dynspec
deleted file mode 100644
index c1d345ac14..0000000000
--- a/lib/eunit/test/eunit.dynspec
+++ /dev/null
@@ -1,6 +0,0 @@
-%% -*- erlang -*-
-%% You can test this file using this command.
-%% file:script("eunit.dynspec", [{'Os',"Unix"}]).
-
-[].
-
diff --git a/lib/eunit/test/eunit.spec b/lib/eunit/test/eunit.spec
new file mode 100644
index 0000000000..2db7731a7e
--- /dev/null
+++ b/lib/eunit/test/eunit.spec
@@ -0,0 +1,3 @@
+%% -*- erlang -*-
+{suites,"../eunit_test",all}.
+
diff --git a/lib/eunit/test/eunit_SUITE.erl b/lib/eunit/test/eunit_SUITE.erl
index 4ebcec6f5d..47c2435d63 100644
--- a/lib/eunit/test/eunit_SUITE.erl
+++ b/lib/eunit/test/eunit_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2011. 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
@@ -18,13 +18,32 @@
%%
-module(eunit_SUITE).
--export([all/1,eunit_test/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,eunit_test/1]).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[eunit_test].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
eunit_test(Config) when is_list(Config) ->
ok = file:set_cwd(code:lib_dir(eunit)),
ok = eunit:test(eunit).
diff --git a/lib/hipe/cerl/erl_bif_types.erl b/lib/hipe/cerl/erl_bif_types.erl
index ed5bf03804..c009164f4c 100644
--- a/lib/hipe/cerl/erl_bif_types.erl
+++ b/lib/hipe/cerl/erl_bif_types.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -45,9 +45,11 @@
t_atom_vals/1,
t_binary/0,
t_bitstr/0,
+ t_bitstrlist/0,
t_boolean/0,
t_byte/0,
t_char/0,
+ t_charlist/0,
t_cons/0,
t_cons/2,
t_cons_hd/1,
@@ -124,7 +126,8 @@
t_tuple/1,
t_tuple_args/1,
t_tuple_size/1,
- t_tuple_subtypes/1
+ t_tuple_subtypes/1,
+ t_unicode_string/0
]).
-ifdef(DO_ERL_BIF_TYPES_TEST).
@@ -189,127 +192,19 @@ type(binary, referenced_byte_size, 1, Xs) ->
strict(arg_types(binary, referenced_byte_size, 1), Xs,
fun(_) -> t_non_neg_integer() end);
%%-- code ---------------------------------------------------------------------
-type(code, add_path, 1, Xs) ->
- strict(arg_types(code, add_path, 1), Xs,
- fun (_) ->
- t_sup(t_atom('true'),
- t_tuple([t_atom('error'), t_atom('bad_directory')]))
- end);
-type(code, add_patha, 1, Xs) ->
- type(code, add_path, 1, Xs);
-type(code, add_paths, 1, Xs) ->
- strict(arg_types(code, add_paths, 1), Xs, fun(_) -> t_atom('ok') end);
-type(code, add_pathsa, 1, Xs) ->
- type(code, add_paths, 1, Xs);
-type(code, add_pathsz, 1, Xs) ->
- type(code, add_paths, 1, Xs);
-type(code, add_pathz, 1, Xs) ->
- type(code, add_path, 1, Xs);
-type(code, all_loaded, 0, _) ->
- t_list(t_tuple([t_atom(), t_code_loaded_fname_or_status()]));
-type(code, compiler_dir, 0, _) ->
- t_string();
-type(code, del_path, 1, Xs) ->
- strict(arg_types(code, del_path, 1), Xs,
- fun (_) ->
- t_sup(t_boolean(),
- t_tuple([t_atom('error'), t_atom('bad_name')]))
- end);
-type(code, delete, 1, Xs) ->
- strict(arg_types(code, delete, 1), Xs, fun (_) -> t_boolean() end);
-type(code, ensure_loaded, 1, Xs) ->
- type(code, load_file, 1, Xs);
type(code, get_chunk, 2, Xs) ->
strict(arg_types(code, get_chunk, 2), Xs,
fun (_) -> t_sup(t_binary(), t_atom('undefined')) end);
-type(code, get_object_code, 1, Xs) ->
- strict(arg_types(code, get_object_code, 1), Xs,
- fun (_) ->
- t_sup(t_tuple([t_atom(), t_binary(), t_string()]),
- t_atom('error'))
- end);
-type(code, get_path, 0, _) ->
- t_list(t_string());
-type(code, is_loaded, 1, Xs) ->
- strict(arg_types(code, is_loaded, 1), Xs,
- fun (_) ->
- t_sup([t_tuple([t_atom('file'), t_code_loaded_fname_or_status()]),
- t_atom('false')])
- end);
-type(code, is_sticky, 1, Xs) ->
- strict(arg_types(code, is_sticky, 1), Xs, fun (_) -> t_boolean() end);
type(code, is_module_native, 1, Xs) ->
strict(arg_types(code, is_module_native, 1), Xs,
fun (_) -> t_sup(t_boolean(), t_atom('undefined')) end);
-type(code, lib_dir, 0, _) ->
- t_string();
-type(code, lib_dir, 1, Xs) ->
- strict(arg_types(code, lib_dir, 1), Xs,
- fun (_) ->
- t_sup(t_string(),
- t_tuple([t_atom('error'), t_atom('bad_name')]))
- end);
-type(code, load_abs, 1, Xs) ->
- strict(arg_types(code, load_abs, 1), Xs,
- fun ([_File]) -> t_code_load_return(t_atom()) end); % XXX: cheating
-type(code, load_abs, 2, Xs) ->
- strict(arg_types(code, load_abs, 2), Xs,
- fun ([_File,Mod]) -> t_code_load_return(Mod) end);
-type(code, load_binary, 3, Xs) ->
- strict(arg_types(code, load_binary, 3), Xs,
- fun ([Mod,_File,_Bin]) -> t_code_load_return(Mod) end);
-type(code, load_file, 1, Xs) ->
- strict(arg_types(code, load_file, 1), Xs,
- fun ([Mod]) -> t_code_load_return(Mod) end);
-type(code, load_native_partial, 2, Xs) ->
- strict(arg_types(code, load_native_partial, 2), Xs,
- fun ([Mod,_Bin]) -> t_code_load_return(Mod) end);
-type(code, load_native_sticky, 3, Xs) ->
- strict(arg_types(code, load_native_sticky, 3), Xs,
- fun ([Mod,_Bin,_]) -> t_code_load_return(Mod) end);
type(code, module_md5, 1, Xs) ->
strict(arg_types(code, module_md5, 1), Xs,
fun (_) -> t_sup(t_binary(), t_atom('undefined')) end);
type(code, make_stub_module, 3, Xs) ->
strict(arg_types(code, make_stub_module, 3), Xs, fun ([Mod,_,_]) -> Mod end);
-type(code, priv_dir, 1, Xs) ->
- strict(arg_types(code, priv_dir, 1), Xs,
- fun (_) ->
- t_sup(t_string(), t_tuple([t_atom('error'), t_atom('bad_name')]))
- end);
-type(code, purge, 1, Xs) ->
- type(code, delete, 1, Xs);
-type(code, rehash, 0, _) -> t_atom('ok');
-type(code, replace_path, 2, Xs) ->
- strict(arg_types(code, replace_path, 2), Xs,
- fun (_) ->
- t_sup([t_atom('true'),
- t_tuple([t_atom('error'), t_atom('bad_name')]),
- t_tuple([t_atom('error'), t_atom('bad_directory')]),
- t_tuple([t_atom('error'),
- t_tuple([t_atom('badarg'), t_any()])])])
- end);
-type(code, root_dir, 0, _) ->
- t_string();
-type(code, set_path, 1, Xs) ->
- strict(arg_types(code, set_path, 1), Xs,
- fun (_) ->
- t_sup([t_atom('true'),
- t_tuple([t_atom('error'), t_atom('bad_path')]),
- t_tuple([t_atom('error'), t_atom('bad_directory')])])
- end);
-type(code, soft_purge, 1, Xs) ->
- type(code, delete, 1, Xs);
-type(code, stick_mod, 1, Xs) ->
- strict(arg_types(code, stick_mod, 1), Xs, fun (_) -> t_atom('true') end);
-type(code, unstick_mod, 1, Xs) ->
- type(code, stick_mod, 1, Xs);
-type(code, which, 1, Xs) ->
- strict(arg_types(code, which, 1), Xs,
- fun (_) ->
- t_sup([t_code_loaded_fname_or_status(),
- t_atom('non_existing')])
- end);
+type(code, rehash, 0, _) ->
+ t_atom('ok');
%%-- erl_ddll -----------------------------------------------------------------
type(erl_ddll, demonitor, 1, Xs) ->
type(erlang, demonitor, 1, Xs);
@@ -1865,6 +1760,8 @@ type(erts_debug, flat_size, 1, Xs) ->
strict(arg_types(erts_debug, flat_size, 1), Xs, fun (_) -> t_integer() end);
type(erts_debug, get_internal_state, 1, _) ->
t_any();
+type(erts_debug, instructions, 0, _) ->
+ t_list(t_list(t_byte()));
type(erts_debug, lock_counters, 1, Xs) ->
strict(arg_types(erts_debug, lock_counters, 1), Xs,
fun ([Arg]) ->
@@ -3330,80 +3227,16 @@ arg_types(binary, part, 3) ->
arg_types(binary, referenced_byte_size, 1) ->
[t_binary()];
%%------- code ----------------------------------------------------------------
-arg_types(code, add_path, 1) ->
- [t_string()];
-arg_types(code, add_patha, 1) ->
- arg_types(code, add_path, 1);
-arg_types(code, add_paths, 1) ->
- [t_list(t_string())];
-arg_types(code, add_pathsa, 1) ->
- arg_types(code, add_paths, 1);
-arg_types(code, add_pathsz, 1) ->
- arg_types(code, add_paths, 1);
-arg_types(code, add_pathz, 1) ->
- arg_types(code, add_path, 1);
-arg_types(code, all_loaded, 0) ->
- [];
-arg_types(code, compiler_dir, 0) ->
- [];
-arg_types(code, del_path, 1) ->
- [t_sup(t_string(), t_atom())]; % OBS: differs from add_path/1
-arg_types(code, delete, 1) ->
- [t_atom()];
-arg_types(code, ensure_loaded, 1) ->
- arg_types(code, load_file, 1);
arg_types(code, get_chunk, 2) ->
[t_binary(), t_string()];
-arg_types(code, get_object_code, 1) ->
- [t_atom()];
-arg_types(code, get_path, 0) ->
- [];
-arg_types(code, is_loaded, 1) ->
- [t_atom()];
-arg_types(code, is_sticky, 1) ->
- [t_atom()];
arg_types(code, is_module_native, 1) ->
[t_atom()];
-arg_types(code, lib_dir, 0) ->
- [];
-arg_types(code, lib_dir, 1) ->
- [t_atom()];
-arg_types(code, load_abs, 1) ->
- [t_string()];
-arg_types(code, load_abs, 2) ->
- [t_code_loaded_fname_or_status(), t_atom()];
-arg_types(code, load_binary, 3) ->
- [t_atom(), t_code_loaded_fname_or_status(), t_binary()];
-arg_types(code, load_file, 1) ->
- [t_atom()];
-arg_types(code, load_native_partial, 2) ->
- [t_atom(), t_binary()];
-arg_types(code, load_native_sticky, 3) ->
- [t_atom(), t_binary(), t_sup(t_binary(), t_atom('false'))];
arg_types(code, module_md5, 1) ->
[t_binary()];
arg_types(code, make_stub_module, 3) ->
[t_atom(), t_binary(), t_tuple([t_list(), t_list()])];
-arg_types(code, priv_dir, 1) ->
- [t_atom()];
-arg_types(code, purge, 1) ->
- arg_types(code, delete, 1);
arg_types(code, rehash, 0) ->
[];
-arg_types(code, replace_path, 2) ->
- [t_atom(), t_string()];
-arg_types(code, root_dir, 0) ->
- [];
-arg_types(code, set_path, 1) ->
- [t_list(t_string())];
-arg_types(code, soft_purge, 1) ->
- arg_types(code, delete, 1);
-arg_types(code, stick_mod, 1) ->
- [t_atom()];
-arg_types(code, unstick_mod, 1) ->
- arg_types(code, stick_mod, 1);
-arg_types(code, which, 1) ->
- [t_atom()];
%%------- erl_ddll ------------------------------------------------------------
arg_types(erl_ddll, demonitor, 1) ->
arg_types(erlang, demonitor, 1);
@@ -3532,9 +3365,9 @@ arg_types(erlang, atom_to_binary, 2) ->
arg_types(erlang, atom_to_list, 1) ->
[t_atom()];
arg_types(erlang, binary_part, 2) ->
- [t_binary(), t_tuple([t_integer(),t_integer()])];
+ [t_binary(), t_tuple([t_non_neg_integer(), t_integer()])];
arg_types(erlang, binary_part, 3) ->
- [t_binary(), t_integer(), t_integer()];
+ [t_binary(), t_non_neg_integer(), t_integer()];
arg_types(erlang, binary_to_atom, 2) ->
[t_binary(), t_encoding_a2b()];
arg_types(erlang, binary_to_existing_atom, 2) ->
@@ -3720,7 +3553,7 @@ arg_types(erlang, list_to_binary, 1) ->
arg_types(erlang, list_to_bitstr, 1) -> % XXX: TAKE OUT
arg_types(erlang, list_to_bitstring, 1);
arg_types(erlang, list_to_bitstring, 1) ->
- [t_iolist()];
+ [t_bitstrlist()];
arg_types(erlang, list_to_existing_atom, 1) ->
[t_string()];
arg_types(erlang, list_to_float, 1) ->
@@ -3797,9 +3630,10 @@ arg_types(erlang, nodes, 1) ->
arg_types(erlang, now, 0) ->
[];
arg_types(erlang, open_port, 2) ->
+ ArgT = t_sup(t_unicode_string(), t_binary()),
[t_sup(t_atom(), t_sup([t_tuple([t_atom('spawn'), t_string()]),
t_tuple([t_atom('spawn_driver'), t_string()]),
- t_tuple([t_atom('spawn_executable'), t_string()]),
+ t_tuple([t_atom('spawn_executable'), ArgT]),
t_tuple([t_atom('fd'), t_integer(), t_integer()])])),
t_list(t_sup(t_sup([t_atom('stream'),
t_atom('exit_status'),
@@ -3815,8 +3649,8 @@ arg_types(erlang, open_port, 2) ->
t_tuple([t_atom('line'), t_integer()]),
t_tuple([t_atom('cd'), t_string()]),
t_tuple([t_atom('env'), t_list(t_tuple(2))]), % XXX: More
- t_tuple([t_atom('args'), t_list(t_string())]),
- t_tuple([t_atom('arg0'), t_string()])])))];
+ t_tuple([t_atom('args'), t_list(ArgT)]),
+ t_tuple([t_atom('arg0'), ArgT])])))];
arg_types(erlang, phash, 2) ->
[t_any(), t_pos_integer()];
arg_types(erlang, phash2, 1) ->
@@ -4091,6 +3925,8 @@ arg_types(erts_debug, flat_size, 1) ->
[t_any()];
arg_types(erts_debug, get_internal_state, 1) ->
[t_any()];
+arg_types(erts_debug, instructions, 0) ->
+ [];
arg_types(erts_debug, lock_counters, 1) ->
[t_sup([t_atom(enabled),
t_atom(info),
@@ -4517,11 +4353,11 @@ arg_types(os, timestamp, 0) ->
arg_types(re, compile, 1) ->
[t_iodata()];
arg_types(re, compile, 2) ->
- [t_iodata(), t_list(t_re_compile_option())];
+ [t_sup(t_iodata(), t_charlist()), t_list(t_re_compile_option())];
arg_types(re, run, 2) ->
- [t_iodata(), t_re_RE()];
+ [t_sup(t_iodata(), t_charlist()), t_re_RE()];
arg_types(re, run, 3) ->
- [t_iodata(), t_re_RE(), t_list(t_re_run_option())];
+ [t_sup(t_iodata(), t_charlist()), t_re_RE(), t_list(t_re_run_option())];
%%------- string --------------------------------------------------------------
arg_types(string, chars, 2) ->
[t_char(), t_non_neg_integer()];
@@ -4637,10 +4473,10 @@ t_endian() ->
%% =====================================================================
t_binary_part() ->
- t_tuple([t_non_neg_integer(),t_integer()]).
+ t_tuple([t_non_neg_integer(), t_integer()]).
t_binary_canonical_part() ->
- t_tuple([t_non_neg_integer(),t_non_neg_integer()]).
+ t_tuple([t_non_neg_integer(), t_non_neg_integer()]).
t_binary_pattern() ->
t_sup([t_binary(),
@@ -4648,10 +4484,10 @@ t_binary_pattern() ->
t_binary_compiled_pattern()]).
t_binary_compiled_pattern() ->
- t_tuple([t_atom('cp'),t_binary()]).
+ t_tuple([t_atom('cp'), t_binary()]).
t_binary_options() ->
- t_list(t_tuple([t_atom('scope'),t_binary_part()])).
+ t_list(t_tuple([t_atom('scope'), t_binary_part()])).
%% =====================================================================
%% HTTP types documented in R12B-4
@@ -4801,7 +4637,8 @@ t_process_priority_level() ->
t_sup([t_atom('max'), t_atom('high'), t_atom('normal'), t_atom('low')]).
t_process_status() ->
- t_sup([t_atom('runnable'), t_atom('running'),
+ t_sup([t_atom('exiting'), t_atom('garbage_collecting'),
+ t_atom('runnable'), t_atom('running'),
t_atom('suspended'), t_atom('waiting')]).
t_raise_errorclass() ->
@@ -4940,10 +4777,11 @@ t_matchres() ->
%% From the 'ets' documentation
%%-----------------------------
%% Option = Type | Access | named_table | {keypos,Pos}
-%% | {heir,pid(),HeirData} | {heir,none}
-%% | {write_concurrency,boolean()}
+%% | {heir,pid(),HeirData} | {heir,none} | Tweaks
%% Type = set | ordered_set | bag | duplicate_bag
%% Access = public | protected | private
+%% Tweaks = {write_concurrency,boolean()}
+%% | {read_concurrency,boolean()} | compressed
%% Pos = integer()
%% HeirData = term()
t_ets_new_options() ->
@@ -4955,10 +4793,12 @@ t_ets_new_options() ->
t_atom('protected'),
t_atom('private'),
t_atom('named_table'),
+ t_tuple([t_atom('keypos'), t_integer()]),
t_tuple([t_atom('heir'), t_pid(), t_any()]),
t_tuple([t_atom('heir'), t_atom('none')]),
- t_tuple([t_atom('keypos'), t_integer()]),
- t_tuple([t_atom('write_concurrency'), t_boolean()])])).
+ t_tuple([t_atom('write_concurrency'), t_boolean()]),
+ t_tuple([t_atom('read_concurrency'), t_boolean()]),
+ t_atom('compressed')])).
t_ets_info_items() ->
t_sup([t_atom('fixed'),
@@ -4978,8 +4818,7 @@ t_ets_info_items() ->
%% =====================================================================
t_prim_file_name() ->
- t_sup([t_string(),
- t_binary()]).
+ t_sup(t_unicode_string(), t_binary()).
%% =====================================================================
%% These are used for the built-in functions of 'gen_tcp'
@@ -5136,13 +4975,14 @@ t_re_MP() -> %% it's supposed to be an opaque data type
t_tuple([t_atom('re_pattern'), t_integer(), t_integer(), t_binary()]).
t_re_RE() ->
- t_sup(t_re_MP(), t_iodata()).
+ t_sup([t_re_MP(), t_iodata(), t_charlist()]).
t_re_compile_option() ->
- t_sup([t_atoms(['anchored', 'caseless', 'dollar_endonly', 'dotall',
- 'extended', 'firstline', 'multiline', 'no_auto_capture',
- 'dupnames', 'ungreedy']),
- t_tuple([t_atom('newline'), t_re_NLSpec()])]).
+ t_sup([t_atoms(['unicode', 'anchored', 'caseless', 'dollar_endonly',
+ 'dotall', 'extended', 'firstline', 'multiline',
+ 'no_auto_capture', 'dupnames', 'ungreedy']),
+ t_tuple([t_atom('newline'), t_re_NLSpec()]),
+ t_atoms(['bsr_anycrlf', 'bsr_unicode'])]).
t_re_run_option() ->
t_sup([t_atoms(['anchored', 'global', 'notbol', 'noteol', 'notempty']),
@@ -5159,7 +4999,7 @@ t_re_Type() ->
t_atoms(['index', 'list', 'binary']).
t_re_NLSpec() ->
- t_atoms(['cr', 'crlf', 'lf', 'anycrlf']).
+ t_atoms(['cr', 'crlf', 'lf', 'anycrlf', 'any']).
t_re_ValueSpec() ->
t_sup(t_atoms(['all', 'all_but_first', 'first', 'none']), t_re_ValueList()).
diff --git a/lib/hipe/cerl/erl_types.erl b/lib/hipe/cerl/erl_types.erl
index 1ed85af172..1748c1cc16 100644
--- a/lib/hipe/cerl/erl_types.erl
+++ b/lib/hipe/cerl/erl_types.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -59,9 +59,11 @@
t_bitstr_concat/2,
t_bitstr_match/2,
t_bitstr_unit/1,
+ t_bitstrlist/0,
t_boolean/0,
t_byte/0,
t_char/0,
+ t_charlist/0,
t_collect_vars/1,
t_cons/0,
t_cons/2,
@@ -195,6 +197,7 @@
t_tuple_size/1,
t_tuple_sizes/1,
t_tuple_subtypes/1,
+ t_unicode_string/0,
t_unify/2,
t_unify/3,
t_unit/0,
@@ -1455,6 +1458,26 @@ t_is_tuple(_) -> false.
%% Non-primitive types, including some handy syntactic sugar types
%%
+-spec t_bitstrlist() -> erl_type().
+
+t_bitstrlist() ->
+ t_iolist(1, t_bitstr()).
+
+-spec t_charlist() -> erl_type().
+
+t_charlist() ->
+ t_charlist(1).
+
+-spec t_charlist(non_neg_integer()) -> erl_type().
+
+t_charlist(N) when N > 0 ->
+ t_maybe_improper_list(t_sup([t_unicode_char(),
+ t_unicode_binary(),
+ t_charlist(N-1)]),
+ t_sup(t_unicode_binary(), t_nil()));
+t_charlist(0) ->
+ t_maybe_improper_list(t_any(), t_sup(t_unicode_binary(), t_nil())).
+
-spec t_constant() -> erl_type().
t_constant() ->
@@ -1529,15 +1552,16 @@ t_iodata() ->
-spec t_iolist() -> erl_type().
t_iolist() ->
- t_iolist(1).
+ t_iolist(1, t_binary()).
--spec t_iolist(non_neg_integer()) -> erl_type().
+%% Added a second argument which currently is t_binary() | t_bitstr()
+-spec t_iolist(non_neg_integer(), erl_type()) -> erl_type().
-t_iolist(N) when N > 0 ->
- t_maybe_improper_list(t_sup([t_iolist(N-1), t_binary(), t_byte()]),
- t_sup(t_binary(), t_nil()));
-t_iolist(0) ->
- t_maybe_improper_list(t_any(), t_sup(t_binary(), t_nil())).
+t_iolist(N, T) when N > 0 ->
+ t_maybe_improper_list(t_sup([t_iolist(N-1, T), T, t_byte()]),
+ t_sup(T, t_nil()));
+t_iolist(0, T) ->
+ t_maybe_improper_list(t_any(), t_sup(T, t_nil())).
-spec t_parameterized_module() -> erl_type().
@@ -1549,6 +1573,21 @@ t_parameterized_module() ->
t_timeout() ->
t_sup(t_non_neg_integer(), t_atom('infinity')).
+-spec t_unicode_binary() -> erl_type().
+
+t_unicode_binary() ->
+ t_binary(). % with characters encoded in UTF-8 coding standard
+
+-spec t_unicode_char() -> erl_type().
+
+t_unicode_char() ->
+ t_integer(). % representing a valid unicode codepoint
+
+-spec t_unicode_string() -> erl_type().
+
+t_unicode_string() ->
+ t_list(t_unicode_char()).
+
%%-----------------------------------------------------------------------------
%% Some built-in opaque types
%%
@@ -2825,7 +2864,7 @@ t_subtract(?list(Contents1, Termination1, Size1) = T,
true ->
case {Size1, Size2} of
{?nonempty_qual, ?unknown_qual} -> ?none;
- {?unknown_qual, ?nonempty_qual} -> Termination1;
+ {?unknown_qual, ?nonempty_qual} -> ?nil;
{S, S} -> ?none
end;
false ->
@@ -3188,16 +3227,16 @@ t_to_string(?atom(Set), _RecDict) ->
_ ->
set_to_string(Set)
end;
-t_to_string(?bitstr(8, 0), _RecDict) ->
- "binary()";
t_to_string(?bitstr(0, 0), _RecDict) ->
"<<>>";
+t_to_string(?bitstr(8, 0), _RecDict) ->
+ "binary()";
t_to_string(?bitstr(0, B), _RecDict) ->
- io_lib:format("<<_:~w>>", [B]);
+ lists:flatten(io_lib:format("<<_:~w>>", [B]));
t_to_string(?bitstr(U, 0), _RecDict) ->
- io_lib:format("<<_:_*~w>>", [U]);
+ lists:flatten(io_lib:format("<<_:_*~w>>", [U]));
t_to_string(?bitstr(U, B), _RecDict) ->
- io_lib:format("<<_:~w,_:_*~w>>", [B, U]);
+ lists:flatten(io_lib:format("<<_:~w,_:_*~w>>", [B, U]));
t_to_string(?function(?any, ?any), _RecDict) ->
"fun()";
t_to_string(?function(?any, Range), RecDict) ->
@@ -3206,16 +3245,18 @@ t_to_string(?function(?product(ArgList), Range), RecDict) ->
"fun((" ++ comma_sequence(ArgList, RecDict) ++ ") -> "
++ t_to_string(Range, RecDict) ++ ")";
t_to_string(?identifier(Set), _RecDict) ->
- if Set =:= ?any -> "identifier()";
- true -> sequence([io_lib:format("~w()", [T])
- || T <- set_to_list(Set)], [], " | ")
+ case Set of
+ ?any -> "identifier()";
+ _ ->
+ string:join([io_lib:format("~w()", [T]) || T <- set_to_list(Set)], " | ")
end;
t_to_string(?opaque(Set), _RecDict) ->
- sequence([case is_opaque_builtin(Mod, Name) of
- true -> io_lib:format("~w()", [Name]);
- false -> io_lib:format("~w:~w()", [Mod, Name])
- end
- || #opaque{mod = Mod, name = Name} <- set_to_list(Set)], [], " | ");
+ string:join([case is_opaque_builtin(Mod, Name) of
+ true -> io_lib:format("~w()", [Name]);
+ false -> io_lib:format("~w:~w()", [Mod, Name])
+ end
+ || #opaque{mod = Mod, name = Name} <- set_to_list(Set)],
+ " | ");
t_to_string(?matchstate(Pres, Slots), RecDict) ->
io_lib:format("ms(~s,~s)", [t_to_string(Pres, RecDict),
t_to_string(Slots,RecDict)]);
@@ -3289,14 +3330,15 @@ t_to_string(?number(?any, ?unknown_qual), _RecDict) -> "number()";
t_to_string(?product(List), RecDict) ->
"<" ++ comma_sequence(List, RecDict) ++ ">";
t_to_string(?remote(Set), RecDict) ->
- sequence([case Args =:= [] of
- true -> io_lib:format("~w:~w()", [Mod, Name]);
- false ->
- ArgString = comma_sequence(Args, RecDict),
- io_lib:format("~w:~w(~s)", [Mod, Name, ArgString])
- end
- || #remote{mod = Mod, name = Name, args = Args} <- set_to_list(Set)],
- [], " | ");
+ string:join([case Args =:= [] of
+ true -> io_lib:format("~w:~w()", [Mod, Name]);
+ false ->
+ ArgString = comma_sequence(Args, RecDict),
+ io_lib:format("~w:~w(~s)", [Mod, Name, ArgString])
+ end
+ || #remote{mod = Mod, name = Name, args = Args} <-
+ set_to_list(Set)],
+ " | ");
t_to_string(?tuple(?any, ?any, ?any), _RecDict) -> "tuple()";
t_to_string(?tuple(Elements, _Arity, ?any), RecDict) ->
"{" ++ comma_sequence(Elements, RecDict) ++ "}";
@@ -3318,7 +3360,7 @@ t_to_string(?var(Id), _RecDict) when is_integer(Id) ->
record_to_string(Tag, [_|Fields], FieldNames, RecDict) ->
FieldStrings = record_fields_to_string(Fields, FieldNames, RecDict, []),
- "#" ++ atom_to_list(Tag) ++ "{" ++ sequence(FieldStrings, [], ",") ++ "}".
+ "#" ++ atom_to_list(Tag) ++ "{" ++ string:join(FieldStrings, ",") ++ "}".
record_fields_to_string([F|Fs], [{FName, _DefType}|FDefs], RecDict, Acc) ->
NewAcc =
@@ -3344,7 +3386,7 @@ record_field_diffs_to_string(?tuple([_|Fs], Arity, Tag), RecDict) ->
{ok, FieldNames} = lookup_record(TagAtom, Arity-1, RecDict),
%% io:format("RecCElems = ~p\nRecTypes = ~p\n", [Fs, FieldNames]),
FieldDiffs = field_diffs(Fs, FieldNames, RecDict, []),
- sequence(FieldDiffs, [], " and ").
+ string:join(FieldDiffs, " and ").
field_diffs([F|Fs], [{FName, DefType}|FDefs], RecDict, Acc) ->
NewAcc =
@@ -3363,21 +3405,11 @@ comma_sequence(Types, RecDict) ->
true -> "_";
false -> t_to_string(T, RecDict)
end || T <- Types],
- sequence(List, ",").
+ string:join(List, ",").
union_sequence(Types, RecDict) ->
List = [t_to_string(T, RecDict) || T <- Types],
- sequence(List, " | ").
-
-sequence(List, Delimiter) ->
- sequence(List, [], Delimiter).
-
-sequence([], [], _Delimiter) ->
- [];
-sequence([T], Acc, _Delimiter) ->
- lists:flatten(lists:reverse([T|Acc]));
-sequence([T|Ts], Acc, Delimiter) ->
- sequence(Ts, [T ++ Delimiter|Acc], Delimiter).
+ string:join(List, " | ").
%%=============================================================================
%%
@@ -3458,10 +3490,8 @@ t_from_form({type, _L, binary, []}, _TypeNames, _InOpaque, _RecDict,
t_from_form({type, _L, binary, [Base, Unit]} = Type,
_TypeNames, _InOpaque, _RecDict, _VarDict) ->
case {erl_eval:partial_eval(Base), erl_eval:partial_eval(Unit)} of
- {{integer, _, BaseVal},
- {integer, _, UnitVal}}
- when BaseVal >= 0, UnitVal >= 0 ->
- {t_bitstr(UnitVal, BaseVal), []};
+ {{integer, _, B}, {integer, _, U}} when B >= 0, U >= 0 ->
+ {t_bitstr(U, B), []};
_ -> throw({error, io_lib:format("Unable to evaluate type ~w\n", [Type])})
end;
t_from_form({type, _L, bitstring, []}, _TypeNames, _InOpaque, _RecDict,
@@ -3807,26 +3837,40 @@ t_form_to_string({integer, _L, Int}) -> integer_to_list(Int);
t_form_to_string({op, _L, _Op, _Arg} = Op) ->
case erl_eval:partial_eval(Op) of
{integer, _, _} = Int -> t_form_to_string(Int);
- _ -> io_lib:format("Bad formed type ~w",[Op])
+ _ -> io_lib:format("Badly formed type ~w", [Op])
end;
t_form_to_string({op, _L, _Op, _Arg1, _Arg2} = Op) ->
case erl_eval:partial_eval(Op) of
{integer, _, _} = Int -> t_form_to_string(Int);
- _ -> io_lib:format("Bad formed type ~w",[Op])
+ _ -> io_lib:format("Badly formed type ~w", [Op])
end;
t_form_to_string({ann_type, _L, [Var, Type]}) ->
t_form_to_string(Var) ++ "::" ++ t_form_to_string(Type);
t_form_to_string({paren_type, _L, [Type]}) ->
io_lib:format("(~s)", [t_form_to_string(Type)]);
t_form_to_string({remote_type, _L, [{atom, _, Mod}, {atom, _, Name}, Args]}) ->
- ArgString = "(" ++ sequence(t_form_to_string_list(Args), ",") ++ ")",
+ ArgString = "(" ++ string:join(t_form_to_string_list(Args), ",") ++ ")",
io_lib:format("~w:~w", [Mod, Name]) ++ ArgString;
t_form_to_string({type, _L, arity, []}) -> "arity()";
+t_form_to_string({type, _L, binary, []}) -> "binary()";
+t_form_to_string({type, _L, binary, [Base, Unit]} = Type) ->
+ case {erl_eval:partial_eval(Base), erl_eval:partial_eval(Unit)} of
+ {{integer, _, B}, {integer, _, U}} ->
+ %% the following mirrors the clauses of t_to_string/2
+ case {U, B} of
+ {0, 0} -> "<<>>";
+ {8, 0} -> "binary()";
+ {0, B} -> lists:flatten(io_lib:format("<<_:~w>>", [B]));
+ {U, 0} -> lists:flatten(io_lib:format("<<_:_*~w>>", [U]));
+ {U, B} -> lists:flatten(io_lib:format("<<_:~w,_:_*~w>>", [B, U]))
+ end;
+ _ -> io_lib:format("Badly formed bitstr type ~w", [Type])
+ end;
t_form_to_string({type, _L, 'fun', []}) -> "fun()";
t_form_to_string({type, _L, 'fun', [{type, _, any, []}, Range]}) ->
"fun(...) -> " ++ t_form_to_string(Range);
t_form_to_string({type, _L, 'fun', [{type, _, product, Domain}, Range]}) ->
- "fun((" ++ sequence(t_form_to_string_list(Domain), ",") ++ ") -> "
+ "fun((" ++ string:join(t_form_to_string_list(Domain), ",") ++ ") -> "
++ t_form_to_string(Range) ++ ")";
t_form_to_string({type, _L, iodata, []}) -> "iodata()";
t_form_to_string({type, _L, iolist, []}) -> "iolist()";
@@ -3839,7 +3883,7 @@ t_form_to_string({type, _L, nonempty_list, [Type]}) ->
"[" ++ t_form_to_string(Type) ++ ",...]";
t_form_to_string({type, _L, nonempty_string, []}) -> "nonempty_string()";
t_form_to_string({type, _L, product, Elements}) ->
- "<" ++ sequence(t_form_to_string_list(Elements), ",") ++ ">";
+ "<" ++ string:join(t_form_to_string_list(Elements), ",") ++ ">";
t_form_to_string({type, _L, range, [From, To]} = Type) ->
case {erl_eval:partial_eval(From), erl_eval:partial_eval(To)} of
{{integer, _, FromVal}, {integer, _, ToVal}} ->
@@ -3849,7 +3893,7 @@ t_form_to_string({type, _L, range, [From, To]} = Type) ->
t_form_to_string({type, _L, record, [{atom, _, Name}]}) ->
io_lib:format("#~w{}", [Name]);
t_form_to_string({type, _L, record, [{atom, _, Name}|Fields]}) ->
- FieldString = sequence(t_form_to_string_list(Fields), ","),
+ FieldString = string:join(t_form_to_string_list(Fields), ","),
io_lib:format("#~w{~s}", [Name, FieldString]);
t_form_to_string({type, _L, field_type, [{atom, _, Name}, Type]}) ->
io_lib:format("~w::~s", [Name, t_form_to_string(Type)]);
@@ -3857,27 +3901,16 @@ t_form_to_string({type, _L, term, []}) -> "term()";
t_form_to_string({type, _L, timeout, []}) -> "timeout()";
t_form_to_string({type, _L, tuple, any}) -> "tuple()";
t_form_to_string({type, _L, tuple, Args}) ->
- "{" ++ sequence(t_form_to_string_list(Args), ",") ++ "}";
+ "{" ++ string:join(t_form_to_string_list(Args), ",") ++ "}";
t_form_to_string({type, _L, union, Args}) ->
- sequence(t_form_to_string_list(Args), " | ");
+ string:join(t_form_to_string_list(Args), " | ");
t_form_to_string({type, _L, Name, []} = T) ->
try t_to_string(t_from_form(T))
catch throw:{error, _} -> atom_to_list(Name) ++ "()"
end;
-t_form_to_string({type, _L, binary, [X,Y]} = Type) ->
- case {erl_eval:partial_eval(X), erl_eval:partial_eval(Y)} of
- {{integer, _, XVal}, {integer, _, YVal}} ->
- case YVal of
- 0 ->
- case XVal of
- 0 -> "<<>>";
- _ -> io_lib:format("<<_:~w>>", [XVal])
- end
- end;
- _ -> io_lib:format("Bad formed type ~w",[Type])
- end;
t_form_to_string({type, _L, Name, List}) ->
- io_lib:format("~w(~s)", [Name, sequence(t_form_to_string_list(List), ",")]).
+ io_lib:format("~w(~s)",
+ [Name, string:join(t_form_to_string_list(List), ",")]).
t_form_to_string_list(List) ->
t_form_to_string_list(List, []).
@@ -3885,8 +3918,8 @@ t_form_to_string_list(List) ->
t_form_to_string_list([H|T], Acc) ->
t_form_to_string_list(T, [t_form_to_string(H)|Acc]);
t_form_to_string_list([], Acc) ->
- lists:reverse(Acc).
-
+ lists:reverse(Acc).
+
%%=============================================================================
%%
%% Utilities
@@ -4025,7 +4058,7 @@ set_to_string(Set) ->
true -> io_lib:write_string(atom_to_list(X), $'); % stupid emacs '
false -> io_lib:format("~w", [X])
end || X <- set_to_list(Set)],
- sequence(L, [], " | ").
+ string:join(L, " | ").
set_min([H|_]) -> H.
diff --git a/lib/hipe/doc/src/notes.xml b/lib/hipe/doc/src/notes.xml
index c188db483d..434bfac64c 100644
--- a/lib/hipe/doc/src/notes.xml
+++ b/lib/hipe/doc/src/notes.xml
@@ -30,6 +30,118 @@
</header>
<p>This document describes the changes made to HiPE.</p>
+<section><title>Hipe 3.7.9</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Fix erroneous fail info of a hipe_bs_primop</p>
+ <p>
+ Own Id: OTP-9036</p>
+ </item>
+ <item>
+ <p>
+ The change fixes a bug in the translation of 'bs_add'
+ BEAM instruction to HiPE's Icode representation. When
+ these instructions appeared in a guard context the
+ previous translation was obviously buggy.</p>
+ <p>
+ Own Id: OTP-9044</p>
+ </item>
+ <item>
+ <p>
+ Sanitize the specs of the code module</p>
+ <p>
+ After the addition of unicode_binary() to the
+ file:filename() type, dialyzer started complaining about
+ erroneous or incomplete specs in some functions of the
+ 'code' module. The culprit was hard-coded information in
+ erl_bif_types for functions of this module, which were
+ not updated. Since these functions have proper specs
+ these days and code duplication (pun intended) is never a
+ good idea, their type information was removed from
+ erl_bif_types.</p>
+ <p>
+ While doing this, some erroneous comments were fixed in
+ the code module and also made sure that the code now runs
+ without dialyzer warnings even when the
+ -Wunmatched_returns option is used.</p>
+ <p>
+ Some cleanups were applied to erl_bif_types too.</p>
+ <p>
+ Own Id: OTP-9100</p>
+ </item>
+ <item>
+ <p>
+ Fix bug in the simplification of inexact comparisons</p>
+ <p>
+ On 31/1/2011 Paul Guyot reported a bug in the native code
+ compilation of inexact equality/inequality tests between
+ floats and integers. The relevant test was:</p>
+ <p>
+ f(X) -&gt; Y = X / 2, Y == 0.</p>
+ <p>
+ and hipe erroneously evaluated the calls f(0) and f(0.0)
+ to 'false'.</p>
+ <p>
+ The culprit was in the simplification code of the Icode
+ range analysis which used an erroneous test (lists:any/1
+ instead of lists:all/1).</p>
+ <p>
+ Own Id: OTP-9101</p>
+ </item>
+ <item>
+ <p>
+ Document exiting and garbage_collecting process statuses</p>
+ <p>
+ Own Id: OTP-9102</p>
+ </item>
+ <item>
+ <p>
+ Remove hipe constants pool</p>
+ <p>
+ Hipe constants used to be allocated within a single,
+ fixed-size pool for interaction with the garbage
+ collector. However, the garbage collector no longer
+ depends on constants being allocated within a single
+ pool, and the fixed size of the pool both meant
+ unnecessary allocations on most deployments and crashes
+ on deployments requiring more constants.</p>
+ <p>
+ The code was simplified to directly invoke erts_alloc.
+ Debugging and undocumented function
+ hipe_bifs:show_literals/0 was removed (it returned true
+ and output text to the console), and debugging and
+ undocumented function hipe_bifs:constants_size/0 was
+ rewritten with a global to count the size of allocated
+ constants.</p>
+ <p>
+ Own Id: OTP-9128</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>Hipe 3.7.8.1</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Several type specifications for standard libraries were
+ wrong in the R14B01 release. This is now corrected. The
+ corrections concern types in re,io,filename and the
+ module erlang itself.</p>
+ <p>
+ Own Id: OTP-9008</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Hipe 3.7.8</title>
<section><title>Improvements and New Features</title>
diff --git a/lib/hipe/doc/src/ref_man.xml b/lib/hipe/doc/src/ref_man.xml
index 09d10147ee..bdafb61d08 100644
--- a/lib/hipe/doc/src/ref_man.xml
+++ b/lib/hipe/doc/src/ref_man.xml
@@ -4,7 +4,7 @@
<application xmlns:xi="http://www.w3.org/2001/XInclude">
<header>
<copyright>
- <year>1996</year><year>2009</year>
+ <year>1996</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
diff --git a/lib/hipe/icode/hipe_beam_to_icode.erl b/lib/hipe/icode/hipe_beam_to_icode.erl
index 920c94d85c..d7eb035551 100644
--- a/lib/hipe/icode/hipe_beam_to_icode.erl
+++ b/lib/hipe/icode/hipe_beam_to_icode.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -918,7 +918,7 @@ trans_fun([{bs_add, {f,Lbl}, [Old,New,Unit], Res}|Instructions], Env) ->
Succ = mk_label(new),
[hipe_icode:mk_primop([Temp], '*',
[NewVar, hipe_icode:mk_const(Unit)],
- hipe_icode:label_name(Succ), Lbl),
+ hipe_icode:label_name(Succ), map_label(Lbl)),
Succ]
end
end,
@@ -930,7 +930,7 @@ trans_fun([{bs_add, {f,Lbl}, [Old,New,Unit], Res}|Instructions], Env) ->
[FailLbl,
hipe_icode:mk_fail([hipe_icode:mk_const(badarg)], error)]};
true ->
- {Lbl, []}
+ {map_label(Lbl), []}
end,
IsPos =
[hipe_icode:mk_if('>=', [Temp, hipe_icode:mk_const(0)],
diff --git a/lib/hipe/icode/hipe_icode_callgraph.erl b/lib/hipe/icode/hipe_icode_callgraph.erl
index 3dba8e1071..ae4b5785c4 100644
--- a/lib/hipe/icode/hipe_icode_callgraph.erl
+++ b/lib/hipe/icode/hipe_icode_callgraph.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
diff --git a/lib/hipe/icode/hipe_icode_exceptions.erl b/lib/hipe/icode/hipe_icode_exceptions.erl
index 3c8f7b5712..00caffb24b 100644
--- a/lib/hipe/icode/hipe_icode_exceptions.erl
+++ b/lib/hipe/icode/hipe_icode_exceptions.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
diff --git a/lib/hipe/icode/hipe_icode_primops.erl b/lib/hipe/icode/hipe_icode_primops.erl
index b0fe7eb708..a413531c07 100644
--- a/lib/hipe/icode/hipe_icode_primops.erl
+++ b/lib/hipe/icode/hipe_icode_primops.erl
@@ -2,19 +2,19 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
-%%
+%% Copyright Ericsson AB 2001-2011. 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%
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -26,9 +26,6 @@
%% Notes :
%% History : * 2001-06-13 Erik Johansson ([email protected]):
%% Created.
-%%
-%% $Id$
-%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-module(hipe_icode_primops).
@@ -197,7 +194,7 @@ fails(#element{}) -> true;
%% fails(#gc_test{}) -> ???
fails({hipe_bs_primop, {bs_start_match, _}}) -> true;
fails({hipe_bs_primop, {{bs_start_match, bitstr}, _}}) -> true;
-fails({hipe_bs_primop, {{bs_start_match, ok_matchstate}, _}}) -> false;
+fails({hipe_bs_primop, {{bs_start_match, ok_matchstate}, _}}) -> true;
fails({hipe_bs_primop, {bs_get_binary, _, _}}) -> true;
fails({hipe_bs_primop, {bs_get_binary_all, _, _}}) -> true;
fails({hipe_bs_primop, {bs_get_binary_all_2, _, _}}) -> true;
diff --git a/lib/hipe/icode/hipe_icode_range.erl b/lib/hipe/icode/hipe_icode_range.erl
index c7e6a451af..c222e8a5d5 100644
--- a/lib/hipe/icode/hipe_icode_range.erl
+++ b/lib/hipe/icode/hipe_icode_range.erl
@@ -1,20 +1,20 @@
%% -*- erlang-indent-level: 2 -*-
%%
%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
-%%
+%%
+%% Copyright Ericsson AB 2007-2011. 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%
%%
%%%-------------------------------------------------------------------
@@ -59,15 +59,17 @@
-record(range, {range :: range_rep(),
other :: boolean()}).
+-type range() :: #range{}.
--record(ann, {range :: #range{},
+-record(ann, {range :: range(),
type :: erl_types:erl_type(),
count :: integer()}).
+-type ann() :: #ann{}.
--type range_anno() :: {range_anno, #ann{}, fun((#ann{}) -> string())}.
--type args_fun() :: fun((mfa(),cfg()) -> [#range{}]).
--type call_fun() :: fun((mfa(),[#range{}]) -> #range{}).
--type final_fun() :: fun((mfa(),[#range{}]) -> ok).
+-type range_anno() :: {'range_anno', ann(), fun((ann()) -> string())}.
+-type args_fun() :: fun((mfa(), cfg()) -> [range()]).
+-type call_fun() :: fun((mfa(), [range()]) -> range()).
+-type final_fun() :: fun((mfa(), [range()]) -> 'ok').
-type data() :: {mfa(), args_fun(), call_fun(), final_fun()}.
-type label() :: non_neg_integer().
-type info() :: gb_tree().
@@ -75,15 +77,15 @@
-type variable() :: #icode_variable{}.
-type annotated_variable() :: #icode_variable{}.
-type argument() :: #icode_const{} | variable().
--type three_range_fun() :: fun((#range{},#range{},#range{}) -> #range{}).
+-type three_range_fun() :: fun((range(),range(),range()) -> range()).
-type instr_split_info() :: {icode_instr(), [{label(),info()}]}.
--type last_instr_return() :: {instr_split_info(), #range{}}.
+-type last_instr_return() :: {instr_split_info(), range()}.
-record(state, {info_map = gb_trees:empty() :: info(),
counter = dict:new() :: dict(),
cfg :: cfg(),
liveness = gb_trees:empty() :: gb_tree(),
- ret_type :: #range{},
+ ret_type :: range(),
lookup_fun :: call_fun(),
result_action :: final_fun()}).
@@ -108,8 +110,8 @@ cfg(Cfg, MFA, Options, Servers) ->
-spec concurrent_cfg(cfg(), mfa(), pid()) -> cfg().
concurrent_cfg(Cfg, MFA, CompServer) ->
- CompServer ! {ready, {MFA,self()}},
- {ArgsFun,CallFun,FinalFun} = do_analysis(Cfg, MFA),
+ CompServer ! {ready, {MFA, self()}},
+ {ArgsFun, CallFun, FinalFun} = do_analysis(Cfg, MFA),
Ans = do_rewrite(Cfg, MFA, ArgsFun, CallFun, FinalFun),
CompServer ! {done_rewrite, MFA},
Ans.
@@ -227,7 +229,7 @@ analyse_block(Label, Info, State, Rewrite) ->
state__update_info(State2, InfoList, Rewrite).
-spec analyse_BB([icode_instr()], info(), [icode_instr()], boolean(), call_fun()) ->
- {[icode_instr()], [{label(),info()}], #range{}}.
+ {[icode_instr()], [{label(),info()}], range()}.
analyse_BB([Last], Info, Code, Rewrite, LookupFun) ->
{{NewI, LabelInfoList}, RetType} =
@@ -266,9 +268,9 @@ handle_args(I, Info, WidenFun) ->
%% io:format("Uses: ~p~nRanges: ~p~n", [Uses, PresentRanges]),
JoinFun = fun(Var, Range) -> update_info(Var, Range, WidenFun) end,
NewUses = lists:zipwith(JoinFun, Uses, PresentRanges),
- hipe_icode:subst_uses(lists:zip(Uses, NewUses),I).
+ hipe_icode:subst_uses(lists:zip(Uses, NewUses), I).
--spec join_info(#ann{}, #range{}, three_range_fun()) -> #ann{}.
+-spec join_info(ann(), range(), three_range_fun()) -> ann().
join_info(Ann = #ann{range = R1, type = Type, count = ?WIDEN}, R2, Fun) ->
Ann#ann{range = Fun(R1, R2, range_from_simple_type(Type))};
@@ -278,17 +280,17 @@ join_info(Ann = #ann{range = R1, type = Type, count = C}, R2, _Fun) when C < ?WI
NewR -> Ann#ann{range = NewR, count = C+1}
end.
--spec join_three(#range{}, #range{}, #range{}) -> #range{}.
+-spec join_three(range(), range(), range()) -> range().
join_three(R1, R2, R3) ->
inf(sup(R1, R2), R3).
--spec update_info(variable(), #range{}) -> annotated_variable().
+-spec update_info(variable(), range()) -> annotated_variable().
update_info(Var, Range) ->
update_info(Var, Range, fun update_three/3).
--spec update_info(variable(), #range{}, three_range_fun()) -> annotated_variable().
+-spec update_info(variable(), range(), three_range_fun()) -> annotated_variable().
update_info(Arg, R, Fun) ->
case hipe_icode:is_annotated_variable(Arg) of
@@ -299,7 +301,7 @@ update_info(Arg, R, Fun) ->
Arg
end.
--spec update_info1(any(), #range{}, three_range_fun()) -> range_anno().
+-spec update_info1(any(), range(), three_range_fun()) -> range_anno().
update_info1({range_anno, Ann, _}, R2, Fun) ->
make_range_anno(update_ann(Ann,R2,Fun));
@@ -314,71 +316,71 @@ update_ann(Ann = #ann{range = R1, type = Type, count = C}, R2, _Fun) ->
NewR -> Ann#ann{range = NewR, count = C+1}
end.
--spec type_to_ann(erl_types:erl_type()) -> #ann{}.
+-spec type_to_ann(erl_types:erl_type()) -> ann().
type_to_ann(Type) ->
- #ann{range = range_from_simple_type(Type), type = t_limit(Type,1), count=1}.
+ #ann{range = range_from_simple_type(Type), type = t_limit(Type,1), count = 1}.
--spec make_range_anno(#ann{}) -> range_anno().
+-spec make_range_anno(ann()) -> range_anno().
make_range_anno(Ann) ->
{range_anno, Ann, fun pp_ann/1}.
--spec update_three(#range{}, #range{}, #range{}) -> #range{}.
+-spec update_three(range(), range(), range()) -> range().
update_three(_R1, R2, R3) ->
inf(R2, R3).
--spec safe_widen(#range{}, #range{}, #range{}) -> #range{}.
+-spec safe_widen(range(), range(), range()) -> range().
safe_widen(#range{range=Old}, #range{range=New}, T = #range{range=Wide}) ->
ResRange =
- case {Old,New,Wide} of
- {{Min,Max1},{Min,Max2},{_,Max}} ->
- case inf_geq(OMax = next_up_limit(inf_max([Max1,Max2])),Max) of
+ case {Old, New, Wide} of
+ {{Min,Max1}, {Min,Max2}, {_,Max}} ->
+ case inf_geq(OMax = next_up_limit(inf_max([Max1, Max2])), Max) of
true -> {Min,Max};
false -> {Min,OMax}
end;
- {{Min1,Max},{Min2,Max},{Min,_}} ->
- case inf_geq(Min, OMin = next_down_limit(inf_min([Min1,Min2]))) of
+ {{Min1,Max}, {Min2,Max}, {Min,_}} ->
+ case inf_geq(Min, OMin = next_down_limit(inf_min([Min1, Min2]))) of
true -> {Min,Max};
false -> {OMin,Max}
end;
- {{Min1,Max1},{Min2,Max2},{Min,Max}} ->
+ {{Min1,Max1}, {Min2,Max2}, {Min,Max}} ->
RealMax =
- case inf_geq(OMax = next_up_limit(inf_max([Max1,Max2])),Max) of
+ case inf_geq(OMax = next_up_limit(inf_max([Max1, Max2])), Max) of
true -> Max;
false -> OMax
end,
RealMin =
- case inf_geq(Min, OMin = next_down_limit(inf_min([Min1,Min2]))) of
+ case inf_geq(Min, OMin = next_down_limit(inf_min([Min1, Min2]))) of
true -> Min;
false -> OMin
end,
- {RealMin,RealMax};
+ {RealMin, RealMax};
_ ->
Wide
end,
- T#range{range=ResRange}.
+ T#range{range = ResRange}.
--spec widen(#range{}, #range{}, #range{}) -> #range{}.
+-spec widen(range(), range(), range()) -> range().
widen(#range{range=Old}, #range{range=New}, T = #range{range=Wide}) ->
ResRange =
- case {Old,New,Wide} of
- {{Min,_},{Min,Max2},{_,Max}} ->
- case inf_geq(OMax = next_up_limit(Max2),Max) of
+ case {Old, New, Wide} of
+ {{Min,_}, {Min,Max2}, {_,Max}} ->
+ case inf_geq(OMax = next_up_limit(Max2), Max) of
true -> {Min,Max};
false -> {Min,OMax}
end;
- {{_,Max},{Min2,Max},{Min,_}} ->
+ {{_,Max}, {Min2,Max}, {Min,_}} ->
case inf_geq(Min, OMin = next_down_limit(Min2)) of
true -> {Min,Max};
false -> {OMin,Max}
end;
- {_,{Min2,Max2},{Min,Max}} ->
+ {_, {Min2,Max2}, {Min,Max}} ->
RealMax =
- case inf_geq(OMax = next_up_limit(Max2),Max) of
+ case inf_geq(OMax = next_up_limit(Max2), Max) of
true -> Max;
false -> OMax
end,
@@ -387,11 +389,11 @@ widen(#range{range=Old}, #range{range=New}, T = #range{range=Wide}) ->
true -> Min;
false -> OMin
end,
- {RealMin,RealMax};
+ {RealMin, RealMax};
_ ->
Wide
end,
- T#range{range=ResRange}.
+ T#range{range = ResRange}.
-spec analyse_call(#icode_call{}, call_fun()) -> #icode_call{}.
@@ -421,7 +423,7 @@ analyse_move(Move) ->
analyse_begin_handler(Handler) ->
SubstList =
- [{Dst,update_info(Dst,any_type())} ||
+ [{Dst, update_info(Dst, any_type())} ||
Dst <- hipe_icode:begin_handler_dstlist(Handler)],
hipe_icode:subst_defines(SubstList, Handler).
@@ -494,14 +496,14 @@ analyse_switch_val(Switch, Info, Rewrite) ->
end
end.
--spec update_infos(argument(), info(), [{#range{},label()}]) -> [{label(),info()}].
+-spec update_infos(argument(), info(), [{range(),label()}]) -> [{label(),info()}].
update_infos(Arg, Info, [{Range, Label}|Rest]) ->
- [{Label,enter_define({Arg,Range},Info)} | update_infos(Arg,Info,Rest)];
+ [{Label,enter_define({Arg,Range},Info)} | update_infos(Arg, Info, Rest)];
update_infos(_, _, []) -> [].
--spec get_range_label_list([{argument(),label()}], #range{}, [{#range{},label()}]) ->
- {#range{},[{#range{},label()}]}.
+-spec get_range_label_list([{argument(),label()}], range(), [{range(),label()}]) ->
+ {range(),[{range(),label()}]}.
get_range_label_list([{Val,Label}|Cases], SRange, Acc) ->
VRange = get_range_from_arg(Val),
@@ -516,7 +518,7 @@ get_range_label_list([], SRange, Acc) ->
{PointTypes, _} = lists:unzip(Acc),
{remove_point_types(SRange, PointTypes), Acc}.
--spec update_switch(#icode_switch_val{}, [{#range{},label()}], boolean()) ->
+-spec update_switch(#icode_switch_val{}, [{range(),label()}], boolean()) ->
#icode_switch_val{}.
update_switch(Switch, LabelRangeList, KeepFail) ->
@@ -524,14 +526,14 @@ update_switch(Switch, LabelRangeList, KeepFail) ->
case label_range_list_to_cases(LabelRangeList, []) of
no_update ->
Switch;
- Cases ->
+ Cases ->
hipe_icode:switch_val_cases_update(Switch, Cases)
end,
if KeepFail -> S2;
true -> S2
end.
--spec label_range_list_to_cases([{#range{},label()}], [{#icode_const{},label()}]) ->
+-spec label_range_list_to_cases([{range(),label()}], [{#icode_const{},label()}]) ->
'no_update' | [{#icode_const{},label()}].
label_range_list_to_cases([{#range{range={C,C},other=false},Label}|Rest],
@@ -586,9 +588,9 @@ analyse_last_call(Call, Info, LookupFun) ->
NewInfo = enter_vals(NewI, Info),
case hipe_icode:call_fail_label(Call) of
[] ->
- {NewI, [{Continuation,NewInfo}]};
+ {NewI, [{Continuation, NewInfo}]};
Fail ->
- {NewI, [{Continuation,NewInfo}, {Fail,Info}]}
+ {NewI, [{Continuation, NewInfo}, {Fail, Info}]}
end.
-spec analyse_if(#icode_if{}, info(), boolean()) ->
@@ -596,16 +598,16 @@ analyse_last_call(Call, Info, LookupFun) ->
analyse_if(If, Info, Rewrite) ->
case hipe_icode:if_args(If) of
- Args = [_,_] ->
+ [_, _] = Args ->
analyse_sane_if(If, Info, Args, get_range_from_args(Args), Rewrite);
_ ->
TrueLabel = hipe_icode:if_true_label(If),
FalseLabel = hipe_icode:if_false_label(If),
- {If, [{TrueLabel,Info},{FalseLabel,Info}]}
+ {If, [{TrueLabel, Info}, {FalseLabel, Info}]}
end.
-spec analyse_sane_if(#icode_if{}, info(), [argument(),...],
- [#range{},...], boolean()) ->
+ [range(),...], boolean()) ->
{#icode_goto{} | #icode_if{}, [{label(), info()}]}.
analyse_sane_if(If, Info, [Arg1, Arg2], [Range1, Range2], Rewrite) ->
@@ -613,59 +615,61 @@ analyse_sane_if(If, Info, [Arg1, Arg2], [Range1, Range2], Rewrite) ->
'>' ->
{TrueRange2, TrueRange1, FalseRange2, FalseRange1} =
range_inequality_propagation(Range2, Range1);
- '==' ->
- {TempTrueRange1, TempTrueRange2, FalseRange1, FalseRange2}=
- range_equality_propagation(Range1, Range2),
- TrueRange1 = set_other(TempTrueRange1,other(Range1)),
- TrueRange2 = set_other(TempTrueRange2,other(Range2));
'<' ->
- {TrueRange1, TrueRange2, FalseRange1, FalseRange2} =
+ {TrueRange1, TrueRange2, FalseRange1, FalseRange2} =
range_inequality_propagation(Range1, Range2);
'>=' ->
{FalseRange1, FalseRange2, TrueRange1, TrueRange2} =
range_inequality_propagation(Range1, Range2);
'=<' ->
- {FalseRange2, FalseRange1, TrueRange2, TrueRange1} =
+ {FalseRange2, FalseRange1, TrueRange2, TrueRange1} =
range_inequality_propagation(Range2, Range1);
'=:=' ->
- {TrueRange1, TrueRange2, FalseRange1, FalseRange2}=
+ {TrueRange1, TrueRange2, FalseRange1, FalseRange2} =
range_equality_propagation(Range1, Range2);
'=/=' ->
{FalseRange1, FalseRange2, TrueRange1, TrueRange2} =
range_equality_propagation(Range1, Range2);
+ '==' ->
+ {TempTrueRange1, TempTrueRange2, FalseRange1, FalseRange2} =
+ range_equality_propagation(Range1, Range2),
+ TrueRange1 = set_other(TempTrueRange1, other(Range1)),
+ TrueRange2 = set_other(TempTrueRange2, other(Range2));
'/=' ->
- {TempFalseRange1, TempFalseRange2, TrueRange1, TrueRange2}=
+ {TempFalseRange1, TempFalseRange2, TrueRange1, TrueRange2} =
range_equality_propagation(Range1, Range2),
- FalseRange1 = set_other(TempFalseRange1,other(Range1)),
- FalseRange2 = set_other(TempFalseRange2,other(Range2))
+ FalseRange1 = set_other(TempFalseRange1, other(Range1)),
+ FalseRange2 = set_other(TempFalseRange2, other(Range2))
end,
- TrueLabel = hipe_icode:if_true_label(If),
- FalseLabel = hipe_icode:if_false_label(If),
- TrueInfo =
- enter_defines([{Arg1,TrueRange1}, {Arg2,TrueRange2}],Info),
- FalseInfo =
- enter_defines([{Arg1,FalseRange1}, {Arg2,FalseRange2}],Info),
- True =
- case lists:any(fun range__is_none/1,[TrueRange1,TrueRange2]) of
+ %% io:format("TR1 = ~w\nTR2 = ~w\n", [TrueRange1, TrueRange2]),
+ True =
+ case lists:all(fun range__is_none/1, [TrueRange1, TrueRange2]) of
true -> [];
- false -> [{TrueLabel,TrueInfo}]
+ false ->
+ TrueLabel = hipe_icode:if_true_label(If),
+ TrueArgRanges = [{Arg1, TrueRange1}, {Arg2, TrueRange2}],
+ TrueInfo = enter_defines(TrueArgRanges, Info),
+ [{TrueLabel, TrueInfo}]
end,
- False =
- case lists:any(fun range__is_none/1, [FalseRange1,FalseRange2]) of
+ %% io:format("FR1 = ~w\nFR2 = ~w\n", [FalseRange1, FalseRange2]),
+ False =
+ case lists:all(fun range__is_none/1, [FalseRange1, FalseRange2]) of
true -> [];
- false -> [{FalseLabel,FalseInfo}]
+ false ->
+ FalseLabel = hipe_icode:if_false_label(If),
+ FalseArgRanges = [{Arg1, FalseRange1}, {Arg2, FalseRange2}],
+ FalseInfo = enter_defines(FalseArgRanges, Info),
+ [{FalseLabel, FalseInfo}]
end,
- UpdateInfo = True++False,
+ UpdateInfo = True ++ False,
NewIF =
if Rewrite ->
- %%io:format("~w~n~w~n", [{Arg1,FalseRange1},{Arg2,FalseRange2}]),
- %%io:format("Any none: ~w~n", [lists:any(fun range__is_none/1,[FalseRange1,FalseRange2])]),
case UpdateInfo of
- [] -> %%This is weird
+ [] -> %% This is weird
If;
- [{Label,_Info}] ->
+ [{Label, _Info}] ->
hipe_icode:mk_goto(Label);
- [_,_] ->
+ [_, _] ->
If
end;
true ->
@@ -686,13 +690,13 @@ normalize_name(Name) ->
Name -> Name
end.
--spec range_equality_propagation(#range{}, #range{}) ->
- {#range{}, #range{}, #range{}, #range{}}.
+-spec range_equality_propagation(range(), range()) ->
+ {range(), range(), range(), range()}.
range_equality_propagation(Range_1, Range_2) ->
True_range = inf(Range_1, Range_2),
case {range(Range_1), range(Range_2)} of
- {{N,N},{ N,N}} ->
+ {{N,N}, {N,N}} ->
False_range_1 = none_range(),
False_range_2 = none_range();
{{N1,N1}, {N2,N2}} ->
@@ -710,8 +714,8 @@ range_equality_propagation(Range_1, Range_2) ->
end,
{True_range, True_range, False_range_1, False_range_2}.
--spec range_inequality_propagation(#range{}, #range{}) ->
- {#range{}, #range{}, #range{}, #range{}}.
+-spec range_inequality_propagation(range(), range()) ->
+ {range(), range(), range(), range()}.
%% Range1 < Range2
range_inequality_propagation(Range1, Range2) ->
@@ -781,26 +785,24 @@ analyse_type(Type, Info, Rewrite) ->
TrueRange = inf(any_range(), OldVarRange),
FalseRange = inf(none_range(), OldVarRange);
_ ->
- TrueRange = inf(none_range(),OldVarRange),
+ TrueRange = inf(none_range(), OldVarRange),
FalseRange = OldVarRange
end,
TrueLabel = hipe_icode:type_true_label(Type),
FalseLabel = hipe_icode:type_false_label(Type),
- TrueInfo =
- enter_define({Arg,TrueRange},Info),
- FalseInfo =
- enter_define({Arg,FalseRange},Info),
- True =
+ TrueInfo = enter_define({Arg, TrueRange}, Info),
+ FalseInfo = enter_define({Arg, FalseRange}, Info),
+ True =
case range__is_none(TrueRange) of
true -> [];
- false -> [{TrueLabel,TrueInfo}]
+ false -> [{TrueLabel, TrueInfo}]
end,
- False =
+ False =
case range__is_none(FalseRange) of
true -> [];
- false -> [{FalseLabel,FalseInfo}]
+ false -> [{FalseLabel, FalseInfo}]
end,
- UpdateInfo = True++False,
+ UpdateInfo = True ++ False,
NewType =
if Rewrite ->
case UpdateInfo of
@@ -808,15 +810,15 @@ analyse_type(Type, Info, Rewrite) ->
Type;
[{Label,_Info}] ->
hipe_icode:mk_goto(Label);
- [_,_] ->
+ [_, _] ->
Type
end;
true ->
Type
end,
- {NewType,True ++ False}.
+ {NewType, True ++ False}.
--spec compare_with_integer(integer(), #range{}) -> {#range{}, #range{}}.
+-spec compare_with_integer(integer(), range()) -> {range(), range()}.
compare_with_integer(N, OldVarRange) ->
TestRange = range_init({N, N}, false),
@@ -843,13 +845,13 @@ compare_with_integer(N, OldVarRange) ->
%%== Ranges ==================================================================
--spec pp_ann(#ann{} | erl_types:erl_type()) -> string().
+-spec pp_ann(ann() | erl_types:erl_type()) -> string().
-pp_ann(#ann{range=#range{range=R, other=false}}) ->
+pp_ann(#ann{range = #range{range = R, other = false}}) ->
pp_range(R);
-pp_ann(#ann{range=#range{range=empty, other=true}, type=Type}) ->
+pp_ann(#ann{range = #range{range = empty, other = true}, type = Type}) ->
t_to_string(Type);
-pp_ann(#ann{range=#range{range=R, other=true}, type=Type}) ->
+pp_ann(#ann{range = #range{range = R, other = true}, type = Type}) ->
pp_range(R) ++ " | " ++ t_to_string(Type);
pp_ann(Type) ->
t_to_string(Type).
@@ -867,12 +869,12 @@ val_to_string(pos_inf) -> "inf";
val_to_string(neg_inf) -> "-inf";
val_to_string(X) when is_integer(X) -> integer_to_list(X).
--spec range_from_type(erl_types:erl_type()) -> [#range{}].
+-spec range_from_type(erl_types:erl_type()) -> [range()].
range_from_type(Type) ->
[range_from_simple_type(T) || T <- t_to_tlist(Type)].
--spec range_from_simple_type(erl_types:erl_type()) -> #range{}.
+-spec range_from_simple_type(erl_types:erl_type()) -> range().
range_from_simple_type(Type) ->
None = t_none(),
@@ -887,7 +889,7 @@ range_from_simple_type(Type) ->
#range{range = Range, other = true}
end.
--spec range_init(range_rep(), boolean()) -> #range{}.
+-spec range_init(range_rep(), boolean()) -> range().
range_init({Min, Max} = Range, Other) ->
case inf_geq(Max, Min) of
@@ -899,39 +901,39 @@ range_init({Min, Max} = Range, Other) ->
range_init(empty, Other) ->
#range{range = empty, other = Other}.
--spec range(#range{}) -> range_rep().
+-spec range(range()) -> range_rep().
range(#range{range = R}) -> R.
--spec other(#range{}) -> boolean().
+-spec other(range()) -> boolean().
other(#range{other = O}) -> O.
--spec set_other(#range{}, boolean()) -> #range{}.
+-spec set_other(range(), boolean()) -> range().
set_other(R, O) -> R#range{other = O}.
--spec range__min(#range{}) -> 'empty' | 'neg_inf' | integer().
+-spec range__min(range()) -> 'empty' | 'neg_inf' | integer().
-range__min(#range{range=empty}) -> empty;
-range__min(#range{range={Min,_}}) -> Min.
+range__min(#range{range = empty}) -> empty;
+range__min(#range{range = {Min,_}}) -> Min.
--spec range__max(#range{}) -> 'empty' | 'pos_inf' | integer().
+-spec range__max(range()) -> 'empty' | 'pos_inf' | integer().
-range__max(#range{range=empty}) -> empty;
-range__max(#range{range={_,Max}}) -> Max.
+range__max(#range{range = empty}) -> empty;
+range__max(#range{range = {_,Max}}) -> Max.
--spec range__is_none(#range{}) -> boolean().
+-spec range__is_none(range()) -> boolean().
-range__is_none(#range{range=empty, other=false}) -> true;
+range__is_none(#range{range = empty, other = false}) -> true;
range__is_none(#range{}) -> false.
--spec range__is_empty(#range{}) -> boolean().
+-spec range__is_empty(range()) -> boolean().
-range__is_empty(#range{range=empty}) -> true;
-range__is_empty(#range{range={_,_}}) -> false.
+range__is_empty(#range{range = empty}) -> true;
+range__is_empty(#range{range = {_,_}}) -> false.
--spec remove_point_types(#range{}, [#range{}]) -> #range{}.
+-spec remove_point_types(range(), [range()]) -> range().
remove_point_types(Range, Ranges) ->
Sorted = lists:sort(Ranges),
@@ -939,35 +941,35 @@ remove_point_types(Range, Ranges) ->
Range1 = lists:foldl(FoldFun, Range, Sorted),
lists:foldl(FoldFun, Range1, lists:reverse(Sorted)).
--spec range__remove_constant(#range{}, #range{}) -> #range{}.
+-spec range__remove_constant(range(), range()) -> range().
-range__remove_constant(R = #range{range={C,C}}, #range{range={C,C}}) ->
- R#range{range=empty};
-range__remove_constant(R = #range{range={C,H}}, #range{range={C,C}}) ->
- R#range{range={C+1,H}};
-range__remove_constant(R = #range{range={L,C}}, #range{range={C,C}}) ->
- R#range{range={L,C-1}};
-range__remove_constant(R = #range{}, #range{range={C,C}}) ->
+range__remove_constant(#range{range = {C, C}} = R, #range{range = {C, C}}) ->
+ R#range{range = empty};
+range__remove_constant(#range{range = {C, H}} = R, #range{range = {C, C}}) ->
+ R#range{range = {C+1, H}};
+range__remove_constant(#range{range = {L, C}} = R, #range{range = {C, C}}) ->
+ R#range{range = {L, C-1}};
+range__remove_constant(#range{} = R, #range{range = {C,C}}) ->
R;
-range__remove_constant(R = #range{}, _) ->
+range__remove_constant(#range{} = R, _) ->
R.
--spec any_type() -> #range{}.
+-spec any_type() -> range().
any_type() ->
- #range{range=any_r(), other=true}.
+ #range{range = any_r(), other = true}.
--spec any_range() -> #range{}.
+-spec any_range() -> range().
any_range() ->
- #range{range=any_r(), other=false}.
+ #range{range = any_r(), other = false}.
--spec none_range() -> #range{}.
+-spec none_range() -> range().
none_range() ->
- #range{range=empty, other=true}.
+ #range{range = empty, other = true}.
--spec none_type() -> #range{}.
+-spec none_type() -> range().
none_type() ->
#range{range = empty, other = false}.
@@ -976,12 +978,12 @@ none_type() ->
any_r() -> {neg_inf, pos_inf}.
--spec get_range_from_args([argument()]) -> [#range{}].
+-spec get_range_from_args([argument()]) -> [range()].
get_range_from_args(Args) ->
[get_range_from_arg(Arg) || Arg <- Args].
--spec get_range_from_arg(argument()) -> #range{}.
+-spec get_range_from_arg(argument()) -> range().
get_range_from_arg(Arg) ->
case hipe_icode:is_const(Arg) of
@@ -989,15 +991,15 @@ get_range_from_arg(Arg) ->
Value = hipe_icode:const_value(Arg),
case is_integer(Value) of
true ->
- #range{range={Value,Value}, other=false};
+ #range{range = {Value, Value}, other = false};
false ->
- #range{range=empty, other=true}
+ #range{range = empty, other = true}
end;
false ->
case hipe_icode:is_annotated_variable(Arg) of
true ->
case hipe_icode:variable_annotation(Arg) of
- {range_anno, #ann{range=Range}, _} ->
+ {range_anno, #ann{range = Range}, _} ->
Range;
{type_anno, Type, _} ->
range_from_simple_type(Type)
@@ -1012,7 +1014,7 @@ get_range_from_arg(Arg) ->
%% inf([R1,R2|Rest]) ->
%% inf([inf(R1,R2)|Rest]).
--spec inf(#range{}, #range{}) -> #range{}.
+-spec inf(range(), range()) -> range().
inf(#range{range=R1, other=O1}, #range{range=R2, other=O2}) ->
#range{range=range_inf(R1,R2), other=other_inf(O1,O2)}.
@@ -1022,8 +1024,8 @@ inf(#range{range=R1, other=O1}, #range{range=R2, other=O2}) ->
range_inf(empty, _) -> empty;
range_inf(_, empty) -> empty;
range_inf({Min1,Max1}, {Min2,Max2}) ->
- NewMin = inf_max([Min1,Min2]),
- NewMax = inf_min([Max1,Max2]),
+ NewMin = inf_max([Min1, Min2]),
+ NewMax = inf_min([Max1, Max2]),
case inf_geq(NewMax, NewMin) of
true ->
{NewMin, NewMax};
@@ -1035,14 +1037,14 @@ range_inf({Min1,Max1}, {Min2,Max2}) ->
other_inf(O1, O2) -> O1 and O2.
--spec sup([#range{},...]) -> #range{}.
+-spec sup([range(),...]) -> range().
sup([R]) ->
R;
sup([R1,R2|Rest]) ->
sup([sup(R1, R2)|Rest]).
--spec sup(#range{}, #range{}) -> #range{}.
+-spec sup(range(), range()) -> range().
sup(#range{range=R1,other=O1}, #range{range=R2,other=O2}) ->
#range{range=range_sup(R1,R2), other=other_sup(O1,O2)}.
@@ -1063,7 +1065,7 @@ other_sup(O1, O2) -> O1 or O2.
%%== Call Support =============================================================
-spec analyse_call_or_enter_fun(fun_name(), [argument()],
- icode_call_type(), call_fun()) -> [#range{}].
+ icode_call_type(), call_fun()) -> [range()].
analyse_call_or_enter_fun(Fun, Args, CallType, LookupFun) ->
%%io:format("Fun: ~p~n Args: ~p~n CT: ~p~n LF: ~p~n", [Fun, Args, CallType, LookupFun]),
@@ -1105,19 +1107,19 @@ analyse_call_or_enter_fun(Fun, Args, CallType, LookupFun) ->
[any_type()];
{hipe_bs_primop, {bs_get_integer, Size, Flags}} ->
{Min, Max} = analyse_bs_get_integer(Size, Flags, length(Args) =:= 1),
- [#range{range={Min, Max}, other=false}, any_type()];
+ [#range{range = {Min, Max}, other = false}, any_type()];
{hipe_bs_primop, _} = Primop ->
Type = hipe_icode_primops:type(Primop),
range_from_type(Type)
end.
--type bin_operation() :: fun((#range{},#range{}) -> #range{}).
--type unary_operation() :: fun((#range{}) -> #range{}).
+-type bin_operation() :: fun((range(), range()) -> range()).
+-type unary_operation() :: fun((range()) -> range()).
-spec basic_type(fun_name()) -> 'not_int' | 'not_analysed'
- | {bin, bin_operation()}
- | {unary, unary_operation()}
- | {fcall, mfa()} | {hipe_bs_primop, _}.
+ | {'bin', bin_operation()}
+ | {'unary', unary_operation()}
+ | {'fcall', mfa()} | {'hipe_bs_primop', _}.
%% Arithmetic operations
basic_type('+') -> {bin, fun(R1, R2) -> range_add(R1, R2) end};
@@ -1214,7 +1216,7 @@ analyse_bs_get_integer(Size, Flags, false) when is_integer(Size),
%% Arithmetic
--spec range_add(#range{}, #range{}) -> #range{}.
+-spec range_add(range(), range()) -> range().
range_add(Range1, Range2) ->
NewMin = inf_add(range__min(Range1), range__min(Range2)),
@@ -1222,7 +1224,7 @@ range_add(Range1, Range2) ->
Other = other(Range1) orelse other(Range2),
range_init({NewMin, NewMax}, Other).
--spec range_sub(#range{}, #range{}) -> #range{}.
+-spec range_sub(range(), range()) -> range().
range_sub(Range1, Range2) ->
Min_sub = inf_min([inf_inv(range__max(Range2)),
@@ -1234,7 +1236,7 @@ range_sub(Range1, Range2) ->
Other = other(Range1) orelse other(Range2),
range_init({NewMin, NewMax}, Other).
--spec range_mult(#range{}, #range{}) -> #range{}.
+-spec range_mult(range(), range()) -> range().
range_mult(#range{range=empty, other=true}, _Range2) ->
range_init(empty, true);
@@ -1274,7 +1276,7 @@ range_mult(Range1, Range2) ->
Other = other(Range1) orelse other(Range2),
range_init(Range, Other).
--spec extreme_divisors(#range{}) -> range_tuple().
+-spec extreme_divisors(range()) -> range_tuple().
extreme_divisors(#range{range={0,0}}) -> {0,0};
extreme_divisors(#range{range={0,Max}}) -> {1,Max};
@@ -1289,7 +1291,7 @@ extreme_divisors(#range{range={Min,Max}}) ->
end
end.
--spec range_div(#range{}, #range{}) -> #range{}.
+-spec range_div(range(), range()) -> range().
%% this is div, not /.
range_div(_, #range{range={0,0}}) ->
@@ -1306,7 +1308,7 @@ range_div(Range1, Den) ->
inf_div(Max1, Min2), inf_div(Max1, Max2)],
range_init({inf_min(Min_max_list), inf_max(Min_max_list)}, false).
--spec range_rem(#range{}, #range{}) -> #range{}.
+-spec range_rem(range(), range()) -> range().
range_rem(Range1, Range2) ->
%% Range1 desides the sign of the answer.
@@ -1332,7 +1334,7 @@ range_rem(Range1, Range2) ->
%%--- Bit operations ----------------------------
--spec range_bsr(#range{}, #range{}) -> #range{}.
+-spec range_bsr(range(), range()) -> range().
range_bsr(Range1, Range2=#range{range={Min, Max}}) ->
New_Range2 = range_init({inf_inv(Max), inf_inv(Min)}, other(Range2)),
@@ -1340,7 +1342,7 @@ range_bsr(Range1, Range2=#range{range={Min, Max}}) ->
%% io:format("bsr res:~w~nInput:= ~w~n", [Ans, {Range1,Range2}]),
Ans.
--spec range_bsl(#range{}, #range{}) -> #range{}.
+-spec range_bsl(range(), range()) -> range().
range_bsl(Range1, Range2) ->
Min1 = range__min(Range1),
@@ -1359,7 +1361,7 @@ range_bsl(Range1, Range2) ->
end,
range_init(MinMax, false).
--spec range_bnot(#range{}) -> #range{}.
+-spec range_bnot(range()) -> range().
range_bnot(Range) ->
Minus_one = range_init({-1,-1}, false),
@@ -1389,7 +1391,7 @@ negwidth(X, N) ->
false -> negwidth(X, N+1)
end.
--spec range_band(#range{}, #range{}) -> #range{}.
+-spec range_band(range(), range()) -> range().
range_band(R1, R2) ->
{_Min1, Max1} = MM1 = range(R1),
@@ -1423,7 +1425,7 @@ range_band(R1, R2) ->
end,
range_init(Range, false).
--spec range_bor(#range{}, #range{}) -> #range{}.
+-spec range_bor(range(), range()) -> range().
range_bor(R1, R2) ->
{Min1, _Max1} = MM1 = range(R1),
@@ -1457,7 +1459,7 @@ range_bor(R1, R2) ->
end,
range_init(Range, false).
--spec classify_range(#range{}) -> 'minus_minus' | 'minus_plus' | 'plus_plus'.
+-spec classify_range(range()) -> 'minus_minus' | 'minus_plus' | 'plus_plus'.
classify_range(Range) ->
case range(Range) of
@@ -1480,7 +1482,7 @@ classify_int_range(_Number1, Number2) when Number2 < 0 ->
classify_int_range(_Number1, _Number2) ->
minus_plus.
--spec range_bxor(#range{}, #range{}) -> #range{}.
+-spec range_bxor(range(), range()) -> range().
range_bxor(R1, R2) ->
{Min1, Max1} = MM1 = range(R1),
@@ -1895,7 +1897,7 @@ convert_ann_to_types(#ann{range=#range{other=true}, type=Type}) ->
%% Icode Coordinator Callbacks
%%=====================================================================
--spec replace_nones([#range{}]) -> [#range{}].
+-spec replace_nones([range()]) -> [range()].
replace_nones(Args) ->
[replace_none(Arg) || Arg <- Args].
@@ -1905,7 +1907,7 @@ replace_none(Arg) ->
false -> Arg
end.
--spec update__info([#range{}], [#range{}]) -> {boolean(), [#ann{}]}.
+-spec update__info([range()], [range()]) -> {boolean(), [ann()]}.
update__info(NewRanges, OldRanges) ->
SupFun = fun (Ann, Range) ->
join_info(Ann, Range, fun safe_widen/3)
@@ -1915,19 +1917,19 @@ update__info(NewRanges, OldRanges) ->
Change = lists:zipwith(EqFun, ResRanges, OldRanges),
{lists:all(fun (X) -> X end, Change), ResRanges}.
--spec new__info/1 :: ([#range{}]) -> [#ann{}].
+-spec new__info([range()]) -> [ann()].
new__info(NewRanges) ->
[#ann{range=Range,count=1,type=t_any()} || Range <- NewRanges].
--spec return__info/1 :: ([#ann{}]) -> [#range{}].
+-spec return__info([ann()]) -> [range()].
return__info(Ranges) ->
[Range || #ann{range=Range} <- Ranges].
--spec return_none/0 :: () -> [#range{},...].
+-spec return_none() -> [range(),...].
return_none() ->
[none_type()].
--spec return_none_args/2 :: (#cfg{}, mfa()) -> [#range{}].
+-spec return_none_args(cfg(), mfa()) -> [range()].
return_none_args(Cfg, {_M,_F,A}) ->
NoArgs =
case hipe_icode_cfg:is_closure(Cfg) of
@@ -1936,7 +1938,7 @@ return_none_args(Cfg, {_M,_F,A}) ->
end,
lists:duplicate(NoArgs, none_type()).
--spec return_any_args/2 :: (#cfg{}, mfa()) -> [#range{}].
+-spec return_any_args(cfg(), mfa()) -> [range()].
return_any_args(Cfg, {_M,_F,A}) ->
NoArgs =
case hipe_icode_cfg:is_closure(Cfg) of
diff --git a/lib/hipe/main/hipe_main.erl b/lib/hipe/main/hipe_main.erl
index e81642fb33..99028cc3c1 100644
--- a/lib/hipe/main/hipe_main.erl
+++ b/lib/hipe/main/hipe_main.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -313,7 +313,7 @@ icode_ssa_struct_reuse(IcodeSSA, Options) ->
icode_ssa_type_info(IcodeSSA, MFA, Options, Servers) ->
?option_time(hipe_icode_type:cfg(IcodeSSA, MFA, Options, Servers),
- "Icode SSA type info", Options).
+ io_lib:format("Icode SSA type info for ~p", [MFA]), Options).
icode_range_analysis(IcodeSSA, MFA, Options, Servers) ->
case proplists:get_bool(icode_range, Options) of
@@ -527,6 +527,8 @@ rtl_to_native(MFA, LinearRTL, Options, DebugState) ->
hipe_sparc_main:rtl_to_sparc(MFA, LinearRTL, Options);
powerpc ->
hipe_ppc_main:rtl_to_ppc(MFA, LinearRTL, Options);
+ ppc64 ->
+ hipe_ppc_main:rtl_to_ppc(MFA, LinearRTL, Options);
arm ->
hipe_arm_main:rtl_to_arm(MFA, LinearRTL, Options);
x86 ->
diff --git a/lib/hipe/ppc/hipe_ppc.erl b/lib/hipe/ppc/hipe_ppc.erl
index 047e86c45b..4014fc1561 100644
--- a/lib/hipe/ppc/hipe_ppc.erl
+++ b/lib/hipe/ppc/hipe_ppc.erl
@@ -1,20 +1,20 @@
%% -*- erlang-indent-level: 2 -*-
%%
%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
-%%
+%%
+%% Copyright Ericsson AB 2004-2011. 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%
%%
@@ -58,6 +58,10 @@
mk_blr/0,
mk_cmp/3,
+ cmpop_word/0,
+ cmpiop_word/0,
+ cmplop_word/0,
+ cmpliop_word/0,
mk_comment/1,
@@ -73,6 +77,8 @@
mk_loadx/4,
mk_load/6,
ldop_to_ldxop/1,
+ ldop_word/0,
+ ldop_wordx/0,
mk_mfspr/2,
@@ -110,6 +116,8 @@
mk_storex/4,
mk_store/6,
stop_to_stxop/1,
+ stop_word/0,
+ stop_wordx/0,
mk_unary/3,
@@ -189,6 +197,31 @@ mk_blr() -> #blr{}.
mk_cmp(CmpOp, Src1, Src2) -> #cmp{cmpop=CmpOp, src1=Src1, src2=Src2}.
+cmpop_word() ->
+ case get(hipe_target_arch) of
+ powerpc -> 'cmp';
+ ppc64 -> 'cmpd'
+ end.
+
+cmpiop_word() ->
+ case get(hipe_target_arch) of
+ powerpc -> 'cmpi';
+ ppc64 -> 'cmpdi'
+ end.
+
+cmplop_word() ->
+ case get(hipe_target_arch) of
+ powerpc -> 'cmpl';
+ ppc64 -> 'cmpld'
+ end.
+
+cmpliop_word() ->
+ case get(hipe_target_arch) of
+ powerpc -> 'cmpli';
+ ppc64 -> 'cmpldi'
+ end.
+
+
mk_comment(Term) -> #comment{term=Term}.
mk_label(Label) -> #label{label=Label}.
@@ -198,9 +231,50 @@ label_label(#label{label=Label}) -> Label.
%%% Load an integer constant into a register.
mk_li(Dst, Value) -> mk_li(Dst, Value, []).
-mk_li(Dst, Value, Tail) ->
+mk_li(Dst, Value, Tail) -> % Dst can be R0
R0 = mk_temp(0, 'untagged'),
- mk_addi(Dst, R0, Value, Tail).
+ %% Check if immediate can fit in the 32 bits, this is obviously a
+ %% sufficient check for PPC32
+ if Value >= -16#80000000,
+ Value =< 16#7FFFFFFF ->
+ mk_li32(Dst, R0, Value, Tail);
+ true ->
+ Highest = (Value bsr 48), % Value@highest
+ Higher = (Value bsr 32) band 16#FFFF, % Value@higher
+ High = (Value bsr 16) band 16#FFFF, % Value@h
+ Low = Value band 16#FFFF, % Value@l
+ LdLo =
+ case Low of
+ 0 -> Tail;
+ _ -> [mk_alu('ori', Dst, Dst, mk_uimm16(Low)) | Tail]
+ end,
+ Ld32bits =
+ case High of
+ 0 -> LdLo;
+ _ -> [mk_alu('oris', Dst, Dst, mk_uimm16(High)) | LdLo]
+ end,
+ [mk_alu('addis', Dst, R0, mk_simm16(Highest)),
+ mk_alu('ori', Dst, Dst, mk_uimm16(Higher)),
+ mk_alu('sldi', Dst, Dst, mk_uimm16(32)) |
+ Ld32bits]
+ end.
+
+mk_li32(Dst, R0, Value, Tail) ->
+ case at_ha(Value) of
+ 0 ->
+ %% Value[31:16] are the sign-extension of Value[15].
+ %% Use a single addi to load and sign-extend 16 bits.
+ [mk_alu('addi', Dst, R0, mk_simm16(at_l(Value))) | Tail];
+ _ ->
+ %% Use addis to load the high 16 bits, followed by an
+ %% optional ori to load non sign-extended low 16 bits.
+ High = simm16sext((Value bsr 16) band 16#FFFF),
+ [mk_alu('addis', Dst, R0, mk_simm16(High)) |
+ case (Value band 16#FFFF) of
+ 0 -> Tail;
+ Low -> [mk_alu('ori', Dst, Dst, mk_uimm16(Low)) | Tail]
+ end]
+ end.
mk_addi(Dst, R0, Value, Tail) ->
Low = at_l(Value),
@@ -232,27 +306,6 @@ simm16sext(Value) ->
true -> Value
end.
-mk_li_new(Dst, Value, Tail) -> % Dst may be R0
- R0 = mk_temp(0, 'untagged'),
- case at_ha(Value) of
- 0 ->
- %% Value[31:16] are the sign-extension of Value[15].
- %% Use a single addi to load and sign-extend 16 bits.
- [mk_alu('addi', Dst, R0, mk_simm16(at_l(Value))) |
- Tail];
- _ ->
- %% Use addis to load the high 16 bits, followed by an
- %% optional ori to load non sign-extended low 16 bits.
- High = simm16sext((Value bsr 16) band 16#FFFF),
- [mk_alu('addis', Dst, R0, mk_simm16(High)) |
- case (Value band 16#FFFF) of
- 0 -> Tail;
- Low ->
- [mk_alu('ori', Dst, Dst, mk_uimm16(Low)) |
- Tail]
- end]
- end.
-
mk_load(LDop, Dst, Disp, Base) ->
#load{ldop=LDop, dst=Dst, disp=Disp, base=Base}.
@@ -260,8 +313,15 @@ mk_loadx(LdxOp, Dst, Base1, Base2) ->
#loadx{ldxop=LdxOp, dst=Dst, base1=Base1, base2=Base2}.
mk_load(LdOp, Dst, Offset, Base, Scratch, Rest) when is_integer(Offset) ->
- if Offset >= -32768, Offset =< 32767 ->
- [mk_load(LdOp, Dst, Offset, Base) | Rest];
+ RequireAlignment =
+ case LdOp of
+ 'ld' -> true;
+ 'ldx' -> true;
+ _ -> false
+ end,
+ if Offset >= -32768, Offset =< 32767,
+ not RequireAlignment orelse Offset band 3 =:= 0 ->
+ [mk_load(LdOp, Dst, Offset, Base) | Rest];
true ->
LdxOp = ldop_to_ldxop(LdOp),
Index =
@@ -272,8 +332,8 @@ mk_load(LdOp, Dst, Offset, Base, Scratch, Rest) when is_integer(Offset) ->
true -> mk_scratch(Scratch)
end
end,
- mk_li_new(Index, Offset,
- [mk_loadx(LdxOp, Dst, Base, Index) | Rest])
+ mk_li(Index, Offset,
+ [mk_loadx(LdxOp, Dst, Base, Index) | Rest])
end.
ldop_to_ldxop(LdOp) ->
@@ -281,7 +341,21 @@ ldop_to_ldxop(LdOp) ->
'lbz' -> 'lbzx';
'lha' -> 'lhax';
'lhz' -> 'lhzx';
- 'lwz' -> 'lwzx'
+ 'lwa' -> 'lwax';
+ 'lwz' -> 'lwzx';
+ 'ld' -> 'ldx'
+ end.
+
+ldop_word() ->
+ case get(hipe_target_arch) of
+ powerpc -> 'lwz';
+ ppc64 -> 'ld'
+ end.
+
+ldop_wordx() ->
+ case get(hipe_target_arch) of
+ powerpc -> 'lwzx';
+ ppc64 -> 'ldx'
end.
mk_scratch(Scratch) ->
@@ -354,20 +428,40 @@ mk_storex(StxOp, Src, Base1, Base2) ->
#storex{stxop=StxOp, src=Src, base1=Base1, base2=Base2}.
mk_store(StOp, Src, Offset, Base, Scratch, Rest)when is_integer(Offset) ->
- if Offset >= -32768, Offset =< 32767 ->
+ RequireAlignment =
+ case StOp of
+ 'std' -> true;
+ 'stdx' -> true;
+ _ -> false
+ end,
+ if Offset >= -32768, Offset =< 32767,
+ not RequireAlignment orelse Offset band 3 =:= 0 ->
[mk_store(StOp, Src, Offset, Base) | Rest];
true ->
StxOp = stop_to_stxop(StOp),
Index = mk_scratch(Scratch),
- mk_li_new(Index, Offset,
- [mk_storex(StxOp, Src, Base, Index) | Rest])
+ mk_li(Index, Offset,
+ [mk_storex(StxOp, Src, Base, Index) | Rest])
end.
stop_to_stxop(StOp) ->
case StOp of
'stb' -> 'stbx';
'sth' -> 'sthx';
- 'stw' -> 'stwx'
+ 'stw' -> 'stwx';
+ 'std' -> 'stdx'
+ end.
+
+stop_word() ->
+ case get(hipe_target_arch) of
+ powerpc -> 'stw';
+ ppc64 -> 'std'
+ end.
+
+stop_wordx() ->
+ case get(hipe_target_arch) of
+ powerpc -> 'stwx';
+ ppc64 -> 'stdx'
end.
mk_unary(UnOp, Dst, Src) -> #unary{unop=UnOp, dst=Dst, src=Src}.
@@ -379,7 +473,7 @@ mk_fload(Dst, Offset, Base, Scratch) when is_integer(Offset) ->
[mk_lfd(Dst, Offset, Base)];
true ->
Index = mk_scratch(Scratch),
- mk_li_new(Index, Offset, [mk_lfdx(Dst, Base, Index)])
+ mk_li(Index, Offset, [mk_lfdx(Dst, Base, Index)])
end.
mk_stfd(Src, Disp, Base) -> #stfd{src=Src, disp=Disp, base=Base}.
@@ -389,7 +483,7 @@ mk_fstore(Src, Offset, Base, Scratch) when is_integer(Offset) ->
[mk_stfd(Src, Offset, Base)];
true ->
Index = mk_scratch(Scratch),
- mk_li_new(Index, Offset, [mk_stfdx(Src, Base, Index)])
+ mk_li(Index, Offset, [mk_stfdx(Src, Base, Index)])
end.
mk_fp_binary(FpBinOp, Dst, Src1, Src2) ->
diff --git a/lib/hipe/ppc/hipe_ppc_assemble.erl b/lib/hipe/ppc/hipe_ppc_assemble.erl
index 6f06f8b841..b2fd50517b 100644
--- a/lib/hipe/ppc/hipe_ppc_assemble.erl
+++ b/lib/hipe/ppc/hipe_ppc_assemble.erl
@@ -1,20 +1,20 @@
%% -*- erlang-indent-level: 2 -*-
%%
%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
-%%
+%%
+%% Copyright Ericsson AB 2004-2011. 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%
%%
@@ -39,7 +39,7 @@ assemble(CompiledCode, Closures, Exports, Options) ->
|| {MFA, Defun} <- CompiledCode],
%%
{ConstAlign,ConstSize,ConstMap,RefsFromConsts} =
- hipe_pack_constants:pack_constants(Code, 4),
+ hipe_pack_constants:pack_constants(Code, hipe_rtl_arch:word_size()),
%%
{CodeSize,CodeBinary,AccRefs,LabelMap,ExportMap} =
encode(translate(Code, ConstMap), Options),
@@ -159,6 +159,13 @@ do_alu(I) ->
'srwi.' -> {'rlwinm.', do_srwi_opnds(NewDst, NewSrc1, NewSrc2)};
'srawi' -> {'srawi', {NewDst,NewSrc1,do_srawi_src2(NewSrc2)}};
'srawi.' -> {'srawi.', {NewDst,NewSrc1,do_srawi_src2(NewSrc2)}};
+ %ppc64 extension
+ 'sldi' -> {'rldicr', do_sldi_opnds(NewDst, NewSrc1, NewSrc2)};
+ 'sldi.' -> {'rldicr.', do_sldi_opnds(NewDst, NewSrc1, NewSrc2)};
+ 'srdi' -> {'rldicl', do_srdi_opnds(NewDst, NewSrc1, NewSrc2)};
+ 'srdi.' -> {'rldicl.', do_srdi_opnds(NewDst, NewSrc1, NewSrc2)};
+ 'sradi' -> {'sradi', {NewDst,NewSrc1,do_sradi_src2(NewSrc2)}};
+ 'sradi.' -> {'sradi.', {NewDst,NewSrc1,do_sradi_src2(NewSrc2)}};
_ -> {AluOp, {NewDst,NewSrc1,NewSrc2}}
end,
[{NewI, NewOpnds, I}].
@@ -171,6 +178,15 @@ do_srwi_opnds(Dst, Src1, {uimm,N}) when is_integer(N), 0 =< N, N < 32 ->
do_srawi_src2({uimm,N}) when is_integer(N), 0 =< N, N < 32 -> {sh,N}.
+%% ppc64 extension
+do_sldi_opnds(Dst, Src1, {uimm,N}) when is_integer(N), 0 =< N, N < 64 ->
+ {Dst, Src1, {sh6,N}, {me6,63-N}}.
+
+do_srdi_opnds(Dst, Src1, {uimm,N}) when is_integer(N), 0 =< N, N < 64 ->
+ {Dst, Src1, {sh6,64-N}, {mb6,N}}.
+
+do_sradi_src2({uimm,N}) when is_integer(N), 0 =< N, N < 64 -> {sh6,N}.
+
do_b_fun(I) ->
#b_fun{'fun'=Fun,linkage=Linkage} = I,
[{'.reloc', {b_fun,Fun,Linkage}, #comment{term='fun'}},
@@ -205,7 +221,18 @@ do_cmp(I) ->
#cmp{cmpop=CmpOp,src1=Src1,src2=Src2} = I,
NewSrc1 = do_reg(Src1),
NewSrc2 = do_reg_or_imm(Src2),
- [{CmpOp, {{crf,0},0,NewSrc1,NewSrc2}, I}].
+ {RealOp,L} =
+ case CmpOp of
+ 'cmpd' -> {'cmp',1};
+ 'cmpdi' -> {'cmpi',1};
+ 'cmpld' -> {'cmpl',1};
+ 'cmpldi' -> {'cmpli',1};
+ 'cmp' -> {CmpOp,0};
+ 'cmpi' -> {CmpOp,0};
+ 'cmpl' -> {CmpOp,0};
+ 'cmpli' -> {CmpOp,0}
+ end,
+ [{RealOp, {{crf,0},L,NewSrc1,NewSrc2}, I}].
do_label(I) ->
#label{label=Label} = I,
@@ -214,7 +241,12 @@ do_label(I) ->
do_load(I) ->
#load{ldop=LdOp,dst=Dst,disp=Disp,base=Base} = I,
NewDst = do_reg(Dst),
- NewDisp = do_disp(Disp),
+ NewDisp =
+ case LdOp of
+ 'ld' -> do_disp_ds(Disp);
+ 'ldu' -> do_disp_ds(Disp);
+ _ -> do_disp(Disp)
+ end,
NewBase = do_reg(Base),
[{LdOp, {NewDst,NewDisp,NewBase}, I}].
@@ -265,14 +297,30 @@ do_pseudo_li(I, MFA, ConstMap) ->
end,
NewDst = do_reg(Dst),
Simm0 = {simm,0},
- [{'.reloc', RelocData, #comment{term=reloc}},
- {addi, {NewDst,{r,0},Simm0}, I},
- {addis, {NewDst,NewDst,Simm0}, I}].
+ Uimm0 = {uimm,0},
+ case get(hipe_target_arch) of
+ powerpc ->
+ [{'.reloc', RelocData, #comment{term=reloc}},
+ {addi, {NewDst,{r,0},Simm0}, I},
+ {addis, {NewDst,NewDst,Simm0}, I}];
+ ppc64 ->
+ [{'.reloc', RelocData, #comment{term=reloc}},
+ {addis, {NewDst,{r,0},Simm0}, I}, % @highest
+ {ori, {NewDst,NewDst,Uimm0}, I}, % @higher
+ {rldicr, {NewDst,NewDst,{sh6,32},{me6,31}}, I},
+ {oris, {NewDst,NewDst,Uimm0}, I}, % @h
+ {ori, {NewDst,NewDst,Uimm0}, I}] % @l
+ end.
do_store(I) ->
#store{stop=StOp,src=Src,disp=Disp,base=Base} = I,
NewSrc = do_reg(Src),
- NewDisp = do_disp(Disp),
+ NewDisp =
+ case StOp of
+ 'std' -> do_disp_ds(Disp);
+ 'stdu' -> do_disp_ds(Disp);
+ _ -> do_disp(Disp)
+ end,
NewBase = do_reg(Base),
[{StOp, {NewSrc,NewDisp,NewBase}, I}].
@@ -344,6 +392,10 @@ do_reg_or_imm(Src) ->
do_disp(Disp) when is_integer(Disp), -32768 =< Disp, Disp =< 32767 ->
{d, Disp band 16#ffff}.
+do_disp_ds(Disp) when is_integer(Disp),
+ -32768 =< Disp, Disp =< 32767, Disp band 3 =:= 0 ->
+ {ds, (Disp band 16#ffff) bsr 2}.
+
do_spr(SPR) ->
SPR_NR =
case SPR of
diff --git a/lib/hipe/ppc/hipe_ppc_frame.erl b/lib/hipe/ppc/hipe_ppc_frame.erl
index 158009872f..8a4d1906c0 100644
--- a/lib/hipe/ppc/hipe_ppc_frame.erl
+++ b/lib/hipe/ppc/hipe_ppc_frame.erl
@@ -1,20 +1,20 @@
%% -*- erlang-indent-level: 2 -*-
%%
%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
-%%
+%%
+%% Copyright Ericsson AB 2004-2011. 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%
%%
@@ -103,12 +103,12 @@ do_pseudo_move(I, Context, FPoff) ->
case temp_is_pseudo(Dst) of
true ->
Offset = pseudo_offset(Dst, FPoff, Context),
- mk_store('stw', Src, Offset, mk_sp(), []);
+ mk_store(hipe_ppc:stop_word(), Src, Offset, mk_sp(), []);
_ ->
case temp_is_pseudo(Src) of
true ->
Offset = pseudo_offset(Src, FPoff, Context),
- mk_load('lwz', Dst, Offset, mk_sp(), []);
+ mk_load(hipe_ppc:ldop_word(), Dst, Offset, mk_sp(), []);
_ ->
[hipe_ppc:mk_alu('or', Dst, Src, Src)]
end
@@ -152,7 +152,7 @@ restore_lr(FPoff, Context, Rest) ->
false -> Rest;
true ->
Temp = mk_temp1(),
- mk_load('lwz', Temp, FPoff - word_size(), mk_sp(),
+ mk_load(hipe_ppc:ldop_word(), Temp, FPoff - word_size(), mk_sp(),
[hipe_ppc:mk_mtspr('lr', Temp) |
Rest])
end.
@@ -324,8 +324,8 @@ simple_moves([{SrcOff,DstOff,Type}|Moves], FPoff, TempReg, Rest) ->
LoadOff = FPoff+SrcOff,
StoreOff = FPoff+DstOff,
simple_moves(Moves, FPoff, TempReg,
- mk_load('lwz', Temp, LoadOff, SP,
- mk_store('stw', Temp, StoreOff, SP,
+ mk_load(hipe_ppc:ldop_word(), Temp, LoadOff, SP,
+ mk_store(hipe_ppc:stop_word(), Temp, StoreOff, SP,
Rest)));
simple_moves([], _, _, Rest) ->
Rest.
@@ -343,7 +343,8 @@ store_moves([{Src,DstOff}|Moves], FPoff, TempReg, Rest) ->
{Temp, hipe_ppc:mk_li(Temp, Src)}
end,
store_moves(Moves, FPoff, TempReg,
- FixSrc ++ mk_store('stw', NewSrc, StoreOff, SP, Rest));
+ FixSrc ++ mk_store(hipe_ppc:stop_word(), NewSrc,
+ StoreOff, SP, Rest));
store_moves([], _, _, Rest) ->
Rest.
@@ -400,7 +401,7 @@ mk_temp_map(Formals, ClobbersLR, Temps) ->
enter_vars([V|Vs], PrevOff, Map) ->
Off =
case hipe_ppc:temp_type(V) of
- 'double' -> PrevOff - 2*word_size();
+ 'double' -> PrevOff - 8;
_ -> PrevOff - word_size()
end,
enter_vars(Vs, Off, tmap_bind(Map, V, Off));
@@ -454,7 +455,8 @@ do_prologue(CFG, Context) ->
AllocFrameCodeTail =
case ClobbersLR of
false -> GotoOldStartCode;
- true -> mk_store('stw', Temp1, FrameSize-word_size(), SP, GotoOldStartCode)
+ true -> mk_store(hipe_ppc:stop_word(), Temp1,
+ FrameSize-word_size(), SP, GotoOldStartCode)
end,
%%
Arity = context_arity(Context),
@@ -484,7 +486,7 @@ do_prologue(CFG, Context) ->
true -> [hipe_ppc:mk_mfspr(Temp1, 'lr') | NewStartCodeTail2]
end,
NewStartCode0 =
- [hipe_ppc:mk_load('lwz', Temp1, ?P_NSP_LIMIT, P) |
+ [hipe_ppc:mk_load(hipe_ppc:ldop_word(), Temp1, ?P_NSP_LIMIT, P) |
hipe_ppc:mk_addi(Temp2, SP, -MaxStack,
[hipe_ppc:mk_cmp('cmpl', Temp2, Temp1) |
NewStartCodeTail1])],
diff --git a/lib/hipe/ppc/hipe_rtl_to_ppc.erl b/lib/hipe/ppc/hipe_rtl_to_ppc.erl
index 458af250de..7dfa56df29 100644
--- a/lib/hipe/ppc/hipe_rtl_to_ppc.erl
+++ b/lib/hipe/ppc/hipe_rtl_to_ppc.erl
@@ -1,20 +1,20 @@
%%% -*- erlang-indent-level: 2 -*-
%%%
%%% %CopyrightBegin%
-%%%
-%%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
-%%%
+%%%
+%%% Copyright Ericsson AB 2004-2011. 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%
%%%
%%% The PowerPC instruction set is quite irregular.
@@ -110,20 +110,27 @@ conv_fconv(I, Map, Data) ->
mk_fconv(Dst, Src) ->
CSP = hipe_ppc:mk_temp(1, 'untagged'),
- R0 = hipe_ppc:mk_temp(0, 'untagged'),
- RTmp1 = hipe_ppc:mk_new_temp('untagged'),
- RTmp2 = hipe_ppc:mk_new_temp('untagged'),
- RTmp3 = hipe_ppc:mk_new_temp('untagged'),
- FTmp1 = hipe_ppc:mk_new_temp('double'),
- FTmp2 = hipe_ppc:mk_new_temp('double'),
- [hipe_ppc:mk_pseudo_li(RTmp1, {fconv_constant,c_const}),
- hipe_ppc:mk_lfd(FTmp1, 0, RTmp1),
- hipe_ppc:mk_alu('xoris', RTmp2, Src, hipe_ppc:mk_uimm16(16#8000)),
- hipe_ppc:mk_store('stw', RTmp2, 28, CSP),
- hipe_ppc:mk_alu('addis', RTmp3, R0, hipe_ppc:mk_simm16(16#4330)),
- hipe_ppc:mk_store('stw', RTmp3, 24, CSP),
- hipe_ppc:mk_lfd(FTmp2, 24, CSP),
- hipe_ppc:mk_fp_binary('fsub', Dst, FTmp2, FTmp1)].
+ case get(hipe_target_arch) of
+ powerpc ->
+ R0 = hipe_ppc:mk_temp(0, 'untagged'),
+ RTmp1 = hipe_ppc:mk_new_temp('untagged'),
+ RTmp2 = hipe_ppc:mk_new_temp('untagged'),
+ RTmp3 = hipe_ppc:mk_new_temp('untagged'),
+ FTmp1 = hipe_ppc:mk_new_temp('double'),
+ FTmp2 = hipe_ppc:mk_new_temp('double'),
+ [hipe_ppc:mk_pseudo_li(RTmp1, {fconv_constant,c_const}),
+ hipe_ppc:mk_lfd(FTmp1, 0, RTmp1),
+ hipe_ppc:mk_alu('xoris', RTmp2, Src, hipe_ppc:mk_uimm16(16#8000)),
+ hipe_ppc:mk_store('stw', RTmp2, 28, CSP),
+ hipe_ppc:mk_alu('addis', RTmp3, R0, hipe_ppc:mk_simm16(16#4330)),
+ hipe_ppc:mk_store('stw', RTmp3, 24, CSP),
+ hipe_ppc:mk_lfd(FTmp2, 24, CSP),
+ hipe_ppc:mk_fp_binary('fsub', Dst, FTmp2, FTmp1)];
+ ppc64 ->
+ [hipe_ppc:mk_store('std', Src, 24, CSP),
+ hipe_ppc:mk_lfd(Dst, 24, CSP),
+ hipe_ppc:mk_fp_unary('fcfid', Dst, Dst)]
+ end.
conv_fmove(I, Map, Data) ->
%% Dst := Src, where both Dst and Src are FP regs
@@ -280,10 +287,14 @@ mk_alu_ri(Dst, Src1, RtlAluOp, Src2) ->
'mul' -> % 'mulli' has a 16-bit simm operand
mk_alu_ri_simm16(Dst, Src1, RtlAluOp, 'mulli', Src2);
'and' -> % 'andi.' has a 16-bit uimm operand
- case rlwinm_mask(Src2) of
- {MB,ME} ->
- [hipe_ppc:mk_unary({'rlwinm',0,MB,ME}, Dst, Src1)];
- _ ->
+ if Src2 band (bnot 16#ffffffff) =:= 0 ->
+ case rlwinm_mask(Src2) of
+ {MB,ME} ->
+ [hipe_ppc:mk_unary({'rlwinm',0,MB,ME}, Dst, Src1)];
+ _ ->
+ mk_alu_ri_bitop(Dst, Src1, RtlAluOp, 'andi.', Src2)
+ end;
+ true ->
mk_alu_ri_bitop(Dst, Src1, RtlAluOp, 'andi.', Src2)
end;
'or' -> % 'ori' has a 16-bit uimm operand
@@ -360,17 +371,33 @@ mk_alu_ri_bitop(Dst, Src1, RtlAluOp, AluOp, Src2) ->
end.
mk_alu_ri_shift(Dst, Src1, RtlAluOp, Src2) ->
- if Src2 < 32, Src2 >= 0 ->
- AluOp =
- case RtlAluOp of
- 'sll' -> 'slwi'; % alias for rlwinm
- 'srl' -> 'srwi'; % alias for rlwinm
- 'sra' -> 'srawi'
- end,
- [hipe_ppc:mk_alu(AluOp, Dst, Src1,
- hipe_ppc:mk_uimm16(Src2))];
- true ->
- mk_alu_ri_rr(Dst, Src1, RtlAluOp, Src2)
+ case get(hipe_target_arch) of
+ ppc64 ->
+ if Src2 < 64, Src2 >= 0 ->
+ AluOp =
+ case RtlAluOp of
+ 'sll' -> 'sldi'; % alias for rldimi %%% buggy
+ 'srl' -> 'srdi'; % alias for rldimi %%% buggy
+ 'sra' -> 'sradi' %%% buggy
+ end,
+ [hipe_ppc:mk_alu(AluOp, Dst, Src1,
+ hipe_ppc:mk_uimm16(Src2))];
+ true ->
+ mk_alu_ri_rr(Dst, Src1, RtlAluOp, Src2)
+ end;
+ powerpc ->
+ if Src2 < 32, Src2 >= 0 ->
+ AluOp =
+ case RtlAluOp of
+ 'sll' -> 'slwi'; % alias for rlwinm
+ 'srl' -> 'srwi'; % alias for rlwinm
+ 'sra' -> 'srawi'
+ end,
+ [hipe_ppc:mk_alu(AluOp, Dst, Src1,
+ hipe_ppc:mk_uimm16(Src2))];
+ true ->
+ mk_alu_ri_rr(Dst, Src1, RtlAluOp, Src2)
+ end
end.
mk_alu_ri_rr(Dst, Src1, RtlAluOp, Src2) ->
@@ -384,15 +411,21 @@ mk_alu_rr(Dst, Src1, RtlAluOp, Src2) ->
[hipe_ppc:mk_alu('subf', Dst, Src2, Src1)];
_ ->
AluOp =
- case RtlAluOp of
- 'add' -> 'add';
- 'mul' -> 'mullw';
- 'or' -> 'or';
- 'and' -> 'and';
- 'xor' -> 'xor';
- 'sll' -> 'slw';
- 'srl' -> 'srw';
- 'sra' -> 'sraw'
+ case {get(hipe_target_arch), RtlAluOp} of
+ {_, 'add'} -> 'add';
+ {_, 'or'} -> 'or';
+ {_, 'and'} -> 'and';
+ {_, 'xor'} -> 'xor';
+
+ {powerpc, 'mul'} -> 'mullw';
+ {powerpc, 'sll'} -> 'slw';
+ {powerpc, 'srl'} -> 'srw';
+ {powerpc, 'sra'} -> 'sraw';
+
+ {ppc64, 'mul'} -> 'mulld';
+ {ppc64, 'sll'} -> 'sld';
+ {ppc64, 'srl'} -> 'srd';
+ {ppc64, 'sra'} -> 'srad'
end,
[hipe_ppc:mk_alu(AluOp, Dst, Src1, Src2)]
end.
@@ -431,16 +464,22 @@ conv_alub(I, Map, Data) ->
{I1 ++ I2, Map2, Data}.
conv_alub_op(RtlAluOp) ->
- case RtlAluOp of
- 'add' -> 'add';
- 'sub' -> 'subf'; % XXX: must swap operands
- 'mul' -> 'mullw';
- 'or' -> 'or';
- 'and' -> 'and';
- 'xor' -> 'xor';
- 'sll' -> 'slw';
- 'srl' -> 'srw';
- 'sra' -> 'sraw'
+ case {get(hipe_target_arch), RtlAluOp} of
+ {_, 'add'} -> 'add';
+ {_, 'sub'} -> 'subf'; % XXX: must swap operands
+ {_, 'or'} -> 'or';
+ {_, 'and'} -> 'and';
+ {_, 'xor'} -> 'xor';
+
+ {powerpc, 'mul'} -> 'mullw';
+ {powerpc, 'sll'} -> 'slw';
+ {powerpc, 'srl'} -> 'srw';
+ {powerpc, 'sra'} -> 'sraw';
+
+ {ppc64, 'mul'} -> 'mulld';
+ {ppc64, 'sll'} -> 'sld';
+ {ppc64, 'srl'} -> 'srd';
+ {ppc64, 'sra'} -> 'srad'
end.
aluop_commutes(AluOp) ->
@@ -454,7 +493,11 @@ aluop_commutes(AluOp) ->
'xor' -> true;
'slw' -> false;
'srw' -> false;
- 'sraw' -> false
+ 'sraw' -> false;
+ 'mulld' -> true; % ppc64
+ 'sld' -> false; % ppc64
+ 'srd' -> false; % ppc64
+ 'srad' -> false % ppc64
end.
conv_alub_cond(Cond) -> % only signed
@@ -528,17 +571,24 @@ mk_alub_ri_Rc(Dst, Src1, AluOp, Src2) ->
mk_alub_ri_Rc_addi(Dst, Src1, Src2, 'addic.', 'add.');
'addc' -> % 'addic' has a 16-bit simm operand
mk_alub_ri_Rc_addi(Dst, Src1, Src2, 'addic', 'addc');
- 'mullw' -> % there is no 'mulli.'
+ 'mullw' -> % there is no 'mulli.'
mk_alub_ri_Rc_rr(Dst, Src1, 'mullw.', Src2);
+ 'mulld' -> % there is no 'mulli.'
+ mk_alub_ri_Rc_rr(Dst, Src1, 'mulld.', Src2);
'or' -> % there is no 'ori.'
mk_alub_ri_Rc_rr(Dst, Src1, 'or.', Src2);
'xor' -> % there is no 'xori.'
mk_alub_ri_Rc_rr(Dst, Src1, 'xor.', Src2);
'and' -> % 'andi.' has a 16-bit uimm operand
- case rlwinm_mask(Src2) of
- {MB,ME} ->
- [hipe_ppc:mk_unary({'rlwinm.',0,MB,ME}, Dst, Src1)];
- _ ->
+ if
+ Src2 band (bnot 16#ffffffff) =:= 0 ->
+ case rlwinm_mask(Src2) of
+ {MB,ME} ->
+ [hipe_ppc:mk_unary({'rlwinm.',0,MB,ME}, Dst, Src1)];
+ _ ->
+ mk_alub_ri_Rc_andi(Dst, Src1, Src2)
+ end;
+ true ->
mk_alub_ri_Rc_andi(Dst, Src1, Src2)
end;
_ -> % shift ops have 5-bit uimm operands
@@ -562,13 +612,16 @@ mk_alub_ri_Rc_andi(Dst, Src1, Src2) ->
end.
mk_alub_ri_Rc_shift(Dst, Src1, AluOp, Src2) ->
- if Src2 < 32, Src2 >= 0 ->
- AluOpIDot =
- case AluOp of
- 'slw' -> 'slwi.'; % alias for rlwinm.
- 'srw' -> 'srwi.'; % alias for rlwinm.
- 'sraw' -> 'srawi.'
- end,
+ {AluOpIDot, MaxIShift} =
+ case AluOp of
+ 'slw' -> {'slwi.', 32}; % alias for rlwinm.
+ 'srw' -> {'srwi.', 32}; % alias for rlwinm.
+ 'sraw' -> {'srawi.', 32};
+ 'sld' -> {'sldi.', 64};
+ 'srd' -> {'srdi.', 64};
+ 'srad' -> {'sradi.', 64}
+ end,
+ if Src2 < MaxIShift, Src2 >= 0 ->
[hipe_ppc:mk_alu(AluOpIDot, Dst, Src1,
hipe_ppc:mk_uimm16(Src2))];
true ->
@@ -576,7 +629,10 @@ mk_alub_ri_Rc_shift(Dst, Src1, AluOp, Src2) ->
case AluOp of
'slw' -> 'slw.';
'srw' -> 'srw.';
- 'sraw' -> 'sraw.'
+ 'sraw' -> 'sraw.';
+ 'sld' -> 'sld.';
+ 'srd' -> 'srd.';
+ 'srad' -> 'srad.'
end,
mk_alub_ri_Rc_rr(Dst, Src1, AluOpDot, Src2)
end.
@@ -598,8 +654,9 @@ mk_alub_rr_OE(Dst, Src1, AluOp, Src2) ->
case AluOp of
'subf' -> 'subfo.';
'add' -> 'addo.';
- 'mullw' -> 'mullwo.'
- %% fail for addc, or, and, xor, slw, srw, sraw
+ 'mullw' -> 'mullwo.';
+ 'mulld' -> 'mulldo.'
+ %% fail for addc, or, and, xor, slw, srw, sraw
end,
[hipe_ppc:mk_alu(AluOpODot, Dst, Src1, Src2)].
@@ -610,12 +667,16 @@ mk_alub_rr_Rc(Dst, Src1, AluOp, Src2) ->
'add' -> 'add.';
'addc' -> 'addc'; % only interested in CA, no Rc needed
'mullw' -> 'mullw.';
+ 'mulld' -> 'mulld.';
'or' -> 'or.';
'and' -> 'and.';
'xor' -> 'xor.';
'slw' -> 'slw.';
+ 'sld' -> 'sld.';
'srw' -> 'srw.';
- 'sraw' -> 'sraw.'
+ 'srd' -> 'srd.';
+ 'sraw' -> 'sraw.';
+ 'srad' -> 'srad.'
end,
[hipe_ppc:mk_alu(AluOpDot, Dst, Src1, Src2)].
@@ -682,17 +743,17 @@ mk_branch_ri(Src1, BCond, Sign, Src2, TrueLab, FalseLab, Pred) ->
case Sign of
'signed' ->
if is_integer(Src2), -32768 =< Src2, Src2 < 32768 ->
- {[], hipe_ppc:mk_simm16(Src2), 'cmpi'};
+ {[], hipe_ppc:mk_simm16(Src2), hipe_ppc:cmpiop_word()};
true ->
Tmp = new_untagged_temp(),
- {mk_li(Tmp, Src2), Tmp, 'cmp'}
+ {mk_li(Tmp, Src2), Tmp, hipe_ppc:cmpop_word()}
end;
'unsigned' ->
if is_integer(Src2), 0 =< Src2, Src2 < 65536 ->
- {[], hipe_ppc:mk_uimm16(Src2), 'cmpli'};
+ {[], hipe_ppc:mk_uimm16(Src2), hipe_ppc:cmpliop_word()};
true ->
Tmp = new_untagged_temp(),
- {mk_li(Tmp, Src2), Tmp, 'cmpl'}
+ {mk_li(Tmp, Src2), Tmp, hipe_ppc:cmplop_word()}
end
end,
FixSrc2 ++
@@ -701,8 +762,8 @@ mk_branch_ri(Src1, BCond, Sign, Src2, TrueLab, FalseLab, Pred) ->
mk_branch_rr(Src1, BCond, Sign, Src2, TrueLab, FalseLab, Pred) ->
CmpOp =
case Sign of
- 'signed' -> 'cmp';
- 'unsigned' -> 'cmpl'
+ 'signed' -> hipe_ppc:cmpop_word();
+ 'unsigned' -> hipe_ppc:cmplop_word()
end,
mk_cmp_bc(CmpOp, Src1, Src2, BCond, TrueLab, FalseLab, Pred).
@@ -841,7 +902,7 @@ mk_store_args([Arg|Args], PrevOffset, Tail) ->
Tmp = new_tagged_temp(),
{Tmp, mk_li(Tmp, Arg)}
end,
- Store = hipe_ppc:mk_store('stw', Src, Offset, mk_sp()),
+ Store = hipe_ppc:mk_store(hipe_ppc:stop_word(), Src, Offset, mk_sp()),
mk_store_args(Args, Offset, FixSrc ++ [Store | Tail]);
mk_store_args([], _, Tail) ->
Tail.
@@ -883,25 +944,19 @@ conv_load(I, Map, Data) ->
{I2, Map2, Data}.
mk_load(Dst, Base1, Base2, LoadSize, LoadSign) ->
- Rest =
- case LoadSize of
- byte ->
- case LoadSign of
- signed -> [hipe_ppc:mk_unary('extsb', Dst, Dst)];
- _ -> []
+ {LdOp, Rest} =
+ case {LoadSize, LoadSign} of
+ {byte, signed} -> {'lbz', [hipe_ppc:mk_unary('extsb', Dst, Dst)]};
+ {byte, unsigned} -> {'lbz', []};
+ {int16, signed} -> {'lha', []};
+ {int16, unsigned} -> {'lhz', []};
+ {int32, signed} ->
+ case get(hipe_target_arch) of
+ powerpc -> {'lwz', []};
+ ppc64 -> {'lwa', []}
end;
- _ -> []
- end,
- LdOp =
- case LoadSize of
- byte -> 'lbz';
- int32 -> 'lwz';
- word -> 'lwz';
- int16 ->
- case LoadSign of
- signed -> 'lha';
- unsigned -> 'lhz'
- end
+ {int32, unsigned} -> {'lwz', []};
+ {word, _} -> {hipe_ppc:ldop_word(), []}
end,
case hipe_ppc:is_temp(Base1) of
true ->
@@ -980,7 +1035,7 @@ mk_store(Src, Base1, Base2, StoreSize) ->
byte -> 'stb';
int16 -> 'sth';
int32 -> 'stw';
- word -> 'stw'
+ word -> hipe_ppc:stop_word()
end,
case hipe_ppc:is_temp(Src) of
true ->
@@ -1022,10 +1077,16 @@ conv_switch(I, Map, Data) ->
JTabR = new_untagged_temp(),
OffsetR = new_untagged_temp(),
DestR = new_untagged_temp(),
+ ShiftInstruction =
+ case get(hipe_target_arch) of
+ powerpc -> 'slwi';
+ ppc64 -> 'sldi'
+ end,
I2 =
[hipe_ppc:mk_pseudo_li(JTabR, {JTabLab,constant}),
- hipe_ppc:mk_alu('slwi', OffsetR, IndexR, hipe_ppc:mk_uimm16(2)),
- hipe_ppc:mk_loadx('lwzx', DestR, JTabR, OffsetR),
+ hipe_ppc:mk_alu(ShiftInstruction, OffsetR, IndexR,
+ hipe_ppc:mk_uimm16(log2_word_size())),
+ hipe_ppc:mk_loadx(hipe_ppc:ldop_wordx(), DestR, JTabR, OffsetR),
hipe_ppc:mk_mtspr('ctr', DestR),
hipe_ppc:mk_bctr(Labels)],
{I2, Map1, NewData}.
@@ -1247,3 +1308,6 @@ vmap_bind(Map, Key, Val) ->
word_size() ->
hipe_rtl_arch:word_size().
+
+log2_word_size() ->
+ hipe_rtl_arch:log2_word_size().
diff --git a/lib/hipe/regalloc/hipe_graph_coloring_regalloc.erl b/lib/hipe/regalloc/hipe_graph_coloring_regalloc.erl
index ce33af453a..6ba4ac814e 100644
--- a/lib/hipe/regalloc/hipe_graph_coloring_regalloc.erl
+++ b/lib/hipe/regalloc/hipe_graph_coloring_regalloc.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
diff --git a/lib/hipe/rtl/hipe_rtl.erl b/lib/hipe/rtl/hipe_rtl.erl
index d93f423f0c..29e9c8c8fe 100644
--- a/lib/hipe/rtl/hipe_rtl.erl
+++ b/lib/hipe/rtl/hipe_rtl.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
diff --git a/lib/hipe/rtl/hipe_rtl_arch.erl b/lib/hipe/rtl/hipe_rtl_arch.erl
index 2afdf4eb6b..22cda57a3a 100644
--- a/lib/hipe/rtl/hipe_rtl_arch.erl
+++ b/lib/hipe/rtl/hipe_rtl_arch.erl
@@ -1,20 +1,20 @@
%% -*- erlang-indent-level: 2 -*-
%%
%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
-%%
+%%
+%% Copyright Ericsson AB 2001-2011. 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%
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -86,6 +86,8 @@ first_virtual_reg() ->
hipe_sparc_registers:first_virtual();
powerpc ->
hipe_ppc_registers:first_virtual();
+ ppc64 ->
+ hipe_ppc_registers:first_virtual();
arm ->
hipe_arm_registers:first_virtual();
x86 ->
@@ -100,6 +102,8 @@ heap_pointer() -> % {GetHPInsn, HPReg, PutHPInsn}
heap_pointer_from_reg(hipe_sparc_registers:heap_pointer());
powerpc ->
heap_pointer_from_reg(hipe_ppc_registers:heap_pointer());
+ ppc64 ->
+ heap_pointer_from_reg(hipe_ppc_registers:heap_pointer());
arm ->
heap_pointer_from_reg(hipe_arm_registers:heap_pointer());
x86 ->
@@ -143,6 +147,8 @@ heap_limit() -> % {GetHLIMITInsn, HLIMITReg}
heap_limit_from_pcb();
powerpc ->
heap_limit_from_pcb();
+ ppc64 ->
+ heap_limit_from_pcb();
arm ->
heap_limit_from_pcb();
x86 ->
@@ -165,6 +171,8 @@ fcalls() -> % {GetFCallsInsn, FCallsReg, PutFCallsInsn}
fcalls_from_pcb();
powerpc ->
fcalls_from_pcb();
+ ppc64 ->
+ fcalls_from_pcb();
arm ->
fcalls_from_pcb();
x86 ->
@@ -188,6 +196,8 @@ reg_name(Reg) ->
hipe_sparc_registers:reg_name_gpr(Reg);
powerpc ->
hipe_ppc_registers:reg_name_gpr(Reg);
+ ppc64 ->
+ hipe_ppc_registers:reg_name_gpr(Reg);
arm ->
hipe_arm_registers:reg_name_gpr(Reg);
x86 ->
@@ -215,6 +225,8 @@ is_precolored_regnum(RegNum) ->
hipe_sparc_registers:is_precoloured_gpr(RegNum);
powerpc ->
hipe_ppc_registers:is_precoloured_gpr(RegNum);
+ ppc64 ->
+ hipe_ppc_registers:is_precoloured_gpr(RegNum);
arm ->
hipe_arm_registers:is_precoloured_gpr(RegNum);
x86 ->
@@ -243,6 +255,9 @@ live_at_return() ->
powerpc ->
ordsets:from_list([hipe_rtl:mk_reg(R)
|| {R,_} <- hipe_ppc_registers:live_at_return()]);
+ ppc64 ->
+ ordsets:from_list([hipe_rtl:mk_reg(R)
+ || {R,_} <- hipe_ppc_registers:live_at_return()]);
arm ->
ordsets:from_list([hipe_rtl:mk_reg(R)
|| {R,_} <- hipe_arm_registers:live_at_return()]);
@@ -262,6 +277,7 @@ word_size() ->
case get(hipe_target_arch) of
ultrasparc -> 4;
powerpc -> 4;
+ ppc64 -> 8;
arm -> 4;
x86 -> 4;
amd64 -> 8
@@ -284,6 +300,7 @@ log2_word_size() ->
case get(hipe_target_arch) of
ultrasparc -> 2;
powerpc -> 2;
+ ppc64 -> 3;
arm -> 2;
x86 -> 2;
amd64 -> 3
@@ -297,6 +314,7 @@ endianess() ->
case get(hipe_target_arch) of
ultrasparc -> big;
powerpc -> big;
+ ppc64 -> big;
x86 -> little;
amd64 -> little;
arm -> ?ARM_ENDIANESS
@@ -313,6 +331,8 @@ load_big_2(Dst, Base, Offset, Signedness) ->
case get(hipe_target_arch) of
powerpc ->
load_2_directly(Dst, Base, Offset, Signedness);
+ ppc64 ->
+ load_2_directly(Dst, Base, Offset, Signedness);
%% Note: x86 could use a "load;xchgb" or "load;rol $8,<16-bit reg>"
%% sequence here. This has been implemented, but unfortunately didn't
%% make consistent improvements to our benchmarks.
@@ -333,6 +353,13 @@ load_little_2(Dst, Base, Offset, Signedness) ->
unsigned -> [];
signed -> [hipe_rtl:mk_call([Dst], 'extsh', [Dst], [], [], not_remote)]
end];
+ ppc64 ->
+ [hipe_rtl:mk_call([Dst], 'lhbrx', [Base,Offset], [], [], not_remote),
+ hipe_rtl:mk_alu(Offset, Offset, add, hipe_rtl:mk_imm(2)) |
+ case Signedness of
+ unsigned -> [];
+ signed -> [hipe_rtl:mk_call([Dst], 'extsh', [Dst], [], [], not_remote)]
+ end];
_ ->
load_little_2_in_pieces(Dst, Base, Offset, Signedness)
end.
@@ -365,6 +392,8 @@ load_big_4(Dst, Base, Offset, Signedness) ->
case get(hipe_target_arch) of
powerpc ->
load_4_directly(Dst, Base, Offset, Signedness);
+ ppc64 ->
+ load_4_directly(Dst, Base, Offset, Signedness);
%% Note: x86 could use a "load;bswap" sequence here.
%% This has been implemented, but unfortunately didn't
%% make any noticeable improvements in our benchmarks.
@@ -386,6 +415,13 @@ load_little_4(Dst, Base, Offset, Signedness) ->
powerpc ->
[hipe_rtl:mk_call([Dst], 'lwbrx', [Base,Offset], [], [], not_remote),
hipe_rtl:mk_alu(Offset, Offset, add, hipe_rtl:mk_imm(4))];
+ ppc64 ->
+ [hipe_rtl:mk_call([Dst], 'lwbrx', [Base,Offset], [], [], not_remote),
+ hipe_rtl:mk_alu(Offset, Offset, add, hipe_rtl:mk_imm(4)) |
+ case Signedness of
+ unsigned -> [];
+ signed -> [hipe_rtl:mk_call([Dst], 'extsw', [Dst], [], [], not_remote)]
+ end];
arm ->
%% When loading 4 bytes into a 32-bit register, the
%% signedness of the high-order byte doesn't matter.
@@ -396,7 +432,7 @@ load_little_4(Dst, Base, Offset, Signedness) ->
end.
load_4_directly(Dst, Base, Offset, Signedness) ->
- [hipe_rtl:mk_load(Dst, Base, Offset, word, Signedness),
+ [hipe_rtl:mk_load(Dst, Base, Offset, int32, Signedness),
hipe_rtl:mk_alu(Offset, Offset, add, hipe_rtl:mk_imm(4))].
load_big_4_in_pieces(Dst, Base, Offset, Signedness) ->
@@ -440,6 +476,8 @@ store_4(Base, Offset, Src) ->
store_4_directly(Base, Offset, Src);
powerpc ->
store_4_directly(Base, Offset, Src);
+ ppc64 ->
+ store_4_directly(Base, Offset, Src);
arm ->
store_big_4_in_pieces(Base, Offset, Src);
ultrasparc ->
@@ -525,6 +563,7 @@ fwait() ->
amd64 -> [hipe_rtl:mk_call([], 'fwait', [], [], [], not_remote)];
arm -> [];
powerpc -> [];
+ ppc64 -> [];
ultrasparc -> []
end.
@@ -549,6 +588,8 @@ handle_fp_exception() ->
[];
powerpc ->
[];
+ ppc64 ->
+ [];
ultrasparc ->
[]
end.
@@ -577,6 +618,8 @@ proc_pointer() -> % must not be exported
hipe_rtl:mk_reg_gcsafe(hipe_sparc_registers:proc_pointer());
powerpc ->
hipe_rtl:mk_reg_gcsafe(hipe_ppc_registers:proc_pointer());
+ ppc64 ->
+ hipe_rtl:mk_reg_gcsafe(hipe_ppc_registers:proc_pointer());
arm ->
hipe_rtl:mk_reg_gcsafe(hipe_arm_registers:proc_pointer());
x86 ->
@@ -601,6 +644,8 @@ nr_of_return_regs() ->
%% hipe_sparc_registers:nr_rets();
powerpc ->
1;
+ ppc64 ->
+ 1;
%% hipe_ppc_registers:nr_rets();
arm ->
1;
diff --git a/lib/hipe/rtl/hipe_rtl_arith.inc b/lib/hipe/rtl/hipe_rtl_arith.inc
index 9e80fa5e13..e608506234 100644
--- a/lib/hipe/rtl/hipe_rtl_arith.inc
+++ b/lib/hipe/rtl/hipe_rtl_arith.inc
@@ -3,7 +3,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
diff --git a/lib/hipe/rtl/hipe_rtl_primops.erl b/lib/hipe/rtl/hipe_rtl_primops.erl
index 0361053676..5f273d8251 100644
--- a/lib/hipe/rtl/hipe_rtl_primops.erl
+++ b/lib/hipe/rtl/hipe_rtl_primops.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
diff --git a/lib/hipe/rtl/hipe_rtl_ssa_const_prop.erl b/lib/hipe/rtl/hipe_rtl_ssa_const_prop.erl
index 64d723d15d..194cf29b64 100644
--- a/lib/hipe/rtl/hipe_rtl_ssa_const_prop.erl
+++ b/lib/hipe/rtl/hipe_rtl_ssa_const_prop.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
diff --git a/lib/hipe/rtl/hipe_tagscheme.erl b/lib/hipe/rtl/hipe_tagscheme.erl
index c0b6dfad8a..0cc6c2deec 100644
--- a/lib/hipe/rtl/hipe_tagscheme.erl
+++ b/lib/hipe/rtl/hipe_tagscheme.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -1045,7 +1045,7 @@ convert_matchstate(Ms) ->
build_sub_binary(Ms, ByteSize, ByteOffset, BitSize, BitOffset,
hipe_rtl:mk_imm(0), Orig),
size_from_header(SizeInWords, Header),
- hipe_rtl:mk_alu(Hole, SizeInWords, sub, hipe_rtl:mk_imm(?SUB_BIN_WORDSIZE-1)),
+ hipe_rtl:mk_alu(Hole, SizeInWords, sub, hipe_rtl:mk_imm(?SUB_BIN_WORDSIZE)),
mk_var_header(BigIntHeader, Hole, ?TAG_HEADER_POS_BIG),
hipe_rtl:mk_store(Ms, hipe_rtl:mk_imm(?SUB_BIN_WORDSIZE*WordSize-?TAG_PRIMARY_BOXED),
BigIntHeader)].
diff --git a/lib/hipe/vsn.mk b/lib/hipe/vsn.mk
index fa9dc91ff0..6ba9009a24 100644
--- a/lib/hipe/vsn.mk
+++ b/lib/hipe/vsn.mk
@@ -1 +1 @@
-HIPE_VSN = 3.7.8
+HIPE_VSN = 3.7.9
diff --git a/lib/ic/doc/src/notes.xml b/lib/ic/doc/src/notes.xml
index 6684547572..5f6c31069c 100644
--- a/lib/ic/doc/src/notes.xml
+++ b/lib/ic/doc/src/notes.xml
@@ -31,6 +31,26 @@
</header>
<section>
+ <title>IC 4.2.26</title>
+
+ <section>
+ <title>Improvements and New Features</title>
+ <list type="bulleted">
+ <item>
+ <p>
+ Partial support for recursive structs and unions. Only available
+ for the erl_corba backend and requires that Light IFR is used.
+ I.e. the IC option {light_ifr, true} and that Orber is configured
+ in such a way that Light IFR is activated. Recursive TypeCode is
+ currently not supported.</p>
+ <p>
+ Own Id: OTP-8868 Aux Id: seq11633</p>
+ </item>
+ </list>
+ </section>
+ </section>
+
+ <section>
<title>IC 4.2.25</title>
<section>
diff --git a/lib/ic/src/ic_forms.erl b/lib/ic/src/ic_forms.erl
index 7409ddeb7b..fc46a2ed40 100644
--- a/lib/ic/src/ic_forms.erl
+++ b/lib/ic/src/ic_forms.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2010. 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
@@ -65,6 +65,7 @@ get_line(X) when is_record(X, scoped_id) -> X#scoped_id.line;
get_line(X) when is_record(X, module) -> get_line(X#module.id);
get_line(X) when is_record(X, interface) -> get_line(X#interface.id);
get_line(X) when is_record(X, forward) -> get_line(X#forward.id);
+get_line(X) when is_record(X, constr_forward) -> get_line(X#constr_forward.id);
get_line(X) when is_record(X, const) -> get_line(X#const.id);
get_line(X) when is_record(X, typedef) -> get_line(X#typedef.id);
get_line(X) when is_record(X, struct) -> get_line(X#struct.id);
@@ -114,6 +115,7 @@ get_line(_) -> -1.
get_id2(X) when is_record(X, module) -> get_id(X#module.id);
get_id2(X) when is_record(X, interface) -> get_id(X#interface.id);
get_id2(X) when is_record(X, forward) -> get_id(X#forward.id);
+get_id2(X) when is_record(X, constr_forward) -> get_id(X#constr_forward.id);
get_id2(X) when is_record(X, const) -> get_id(X#const.id);
get_id2(X) when is_record(X, typedef) -> get_id(hd(X#typedef.id));
get_id2(X) when is_record(X, struct) -> get_id(X#struct.id);
@@ -156,6 +158,7 @@ get_type(X) when is_record(X, param) -> X#param.type.
%% Temporary place
get_tk(X) when is_record(X, interface) -> X#interface.tk;
get_tk(X) when is_record(X, forward) -> X#forward.tk;
+get_tk(X) when is_record(X, constr_forward) -> X#constr_forward.tk;
get_tk(X) when is_record(X, const) -> X#const.tk;
get_tk(X) when is_record(X, type_dcl) -> X#type_dcl.tk;
get_tk(X) when is_record(X, typedef) -> X#typedef.tk;
@@ -228,6 +231,7 @@ clean_up_scope([N|Ns],Found) ->
get_type_code2(_, _, X) when is_record(X, interface) -> X#interface.tk;
get_type_code2(_, _, X) when is_record(X, forward) -> X#forward.tk;
+get_type_code2(_, _, X) when is_record(X, constr_forward) -> X#constr_forward.tk;
get_type_code2(_, _, X) when is_record(X, const) -> X#const.tk;
get_type_code2(_, _, X) when is_record(X, type_dcl) -> X#type_dcl.tk;
get_type_code2(_, _, X) when is_record(X, typedef) ->
diff --git a/lib/ic/src/ic_pragma.erl b/lib/ic/src/ic_pragma.erl
index 9165e3b03b..45cb64c9c8 100644
--- a/lib/ic/src/ic_pragma.erl
+++ b/lib/ic/src/ic_pragma.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2010. 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
@@ -60,7 +60,7 @@ pragma_reg(G,X) ->
init_pragma_status(S),
registerOptions(G,S),
pragma_reg_all(G, S, [], X),
- denote_specific_code_opts(G), %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ denote_specific_code_opts(G),
case get_pragma_compilation_status(S) of
true ->
%% Remove ugly pragmas from form
@@ -132,6 +132,7 @@ applyCodeOpt(G) ->
%% This removes all pragma records from the form.
%% When debugged, it can be enbodied in pragma_reg_all.
+cleanup(undefined,C) -> C;
cleanup([],C) -> C;
cleanup([X|Xs],CSF) ->
cleanup(Xs, CSF++cleanup(X)).
@@ -279,7 +280,12 @@ pragma_reg(G, S, N, X) when is_record(X, union) ->
pragma_reg(G, S, N, X) when is_record(X, struct) ->
mk_ref(G,[get_id2(X) | N],struct_ref),
mk_file_data(G,X,N,struct),
- pragma_reg_all(G, S, N, X#struct.body);
+ case X#struct.body of
+ undefined ->
+ ok;
+ _ ->
+ pragma_reg_all(G, S, N, X#struct.body)
+ end;
pragma_reg(G, _S, N, X) when is_record(X, attr) ->
XX = #id_of{type=X},
diff --git a/lib/ic/src/ic_symtab.erl b/lib/ic/src/ic_symtab.erl
index 889c75e3a2..d710154a5d 100644
--- a/lib/ic/src/ic_symtab.erl
+++ b/lib/ic/src/ic_symtab.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2010. 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
@@ -69,6 +69,8 @@ store(G, N, X) ->
ets:insert(G#genobj.symtab, {Name, X});
{ok, Y} when is_record(Y, forward) ->
ets:insert(G#genobj.symtab, {Name, X});
+ {ok, Y} when is_record(Y, constr_forward) ->
+ ets:insert(G#genobj.symtab, {Name, X});
{ok, _Y} ->
ic_error:error(G, {multiply_defined, X})
end.
diff --git a/lib/ic/src/icforms.hrl b/lib/ic/src/icforms.hrl
index d1869e6330..1b394a11b4 100644
--- a/lib/ic/src/icforms.hrl
+++ b/lib/ic/src/icforms.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2010. 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
@@ -34,6 +34,7 @@
-record(module, {id, body}).
-record(interface, {id, inherit, body, inherit_body, tk}).
-record(forward, {id, tk}).
+-record(constr_forward, {id, tk}).
-record(const, {type, id, val, tk}).
-record(type_dcl, {type, tk}).
-record(typedef, {type, id, tk}).
diff --git a/lib/ic/src/icparse.yrl b/lib/ic/src/icparse.yrl
index 25b0f452e7..d0dd6cde4c 100644
--- a/lib/ic/src/icparse.yrl
+++ b/lib/ic/src/icparse.yrl
@@ -1,21 +1,20 @@
-%%<copyright>
-%% <year>1997-2007</year>
-%% <holder>Ericsson AB, All Rights Reserved</holder>
-%%</copyright>
-%%<legalnotice>
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2010. 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.
-%%
-%% The Initial Developer of the Original Code is Ericsson AB.
-%%</legalnotice>
+%%
+%% %CopyrightEnd%
%%
%%------------------------------------------------------------
%% Yecc spec for IDL
@@ -150,6 +149,7 @@ Nonterminals
'ZorM_<integer_literal>'
'<fixed_pt_type>'
'<fixed_pt_const_type>'
+ '<constr_forward_decl>'
.
@@ -473,6 +473,7 @@ OE_preproc -> '#' '<integer_literal>' '<string_literal>'
'<type_dcl>' -> '<struct_type>' : '$1' .
'<type_dcl>' -> '<union_type>' : '$1' .
'<type_dcl>' -> '<enum_type>' : '$1' .
+'<type_dcl>' -> '<constr_forward_decl>' : '$1' .
%% (28) NIY multiple declarators (FIXED)
'<type_declarator>' -> '<type_spec>' '<declarators>'
@@ -832,6 +833,9 @@ OE_preproc -> '#' '<integer_literal>' '<string_literal>'
'<fixed_pt_type>' -> 'fixed' '<' '<positive_int_const>' ',' '<positive_int_const>' '>'
: #fixed{digits='$3',scale='$5'} .
+%% (99)
+'<constr_forward_decl>' -> 'struct' '<identifier>' : #constr_forward{id='$2', tk=tk_struct} .
+'<constr_forward_decl>' -> 'union' '<identifier>' : #constr_forward{id='$2', tk=tk_union} .
%% Added clause
'ZorM_<string_literal>' -> '$empty' : [] .
diff --git a/lib/ic/src/ictype.erl b/lib/ic/src/ictype.erl
index 4704191bee..9e20801464 100644
--- a/lib/ic/src/ictype.erl
+++ b/lib/ic/src/ictype.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2010. 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
@@ -407,6 +407,18 @@ check(G, S, N, X) when is_record(X, forward) ->
tktab_add(G, S, N, X, {tk_objref, ictk:get_IR_ID(G, N, X), ic_forms:get_id2(X)}),
X;
+check(G, S, N, #constr_forward{tk = tk_struct} = X) ->
+ ?STDDBG,
+ ID = ic_forms:get_id2(X),
+ Module = list_to_atom(string:join(lists:reverse([ID|N]), "_")),
+ tktab_add(G, S, N, X, {tk_struct, ictk:get_IR_ID(G, N, X), ID, Module}),
+ X;
+check(G, S, N, #constr_forward{tk = tk_union} = X) ->
+ ?STDDBG,
+ ID = ic_forms:get_id2(X),
+ Module = list_to_atom(string:join(lists:reverse([ID|N]), "_")),
+ tktab_add(G, S, N, X, {tk_union, ictk:get_IR_ID(G, N, X), ID, [], [], Module}),
+ X;
check(G, S, N, X) when is_record(X, const) ->
?STDDBG,
@@ -427,21 +439,6 @@ check(G, S, N, X) when is_record(X, const) ->
end
end;
-check(G, S, N, X) when is_record(X, const) ->
- ?STDDBG,
- case tk_base(G, S, N, ic_forms:get_type(X)) of
- Err when element(1, Err) == error -> X;
- TK ->
- check_const_tk(G, S, N, X, TK),
- case iceval:eval_const(G, S, N, TK, X#const.val) of
- Err when element(1, Err) == error -> X;
- Val ->
- V = iceval:get_val(Val),
- tktab_add(G, S, N, X, TK, V),
- X#const{val=V, tk=TK}
- end
- end;
-
check(G, S, N, X) when is_record(X, except) ->
?STDDBG,
TK = tk(G, S, N, X),
@@ -795,9 +792,15 @@ tktab_add_id(G, S, N, X, Id, TK, Aux) ->
Name = [Id | N],
UName = mk_uppercase(Name),
case ets:lookup(S, Name) of
- [{_, forward, _, _}] when is_record(X, interface) -> ok;
- [XX] when is_record(X, forward) andalso element(2, XX)==interface -> ok;
- [_] -> ic_error:error(G, {multiply_defined, X});
+ [{_, forward, _, _}] when is_record(X, interface) ->
+ ok;
+ [{_, constr_forward, _, _}] when is_record(X, union) orelse
+ is_record(X, struct) ->
+ ok;
+ [XX] when is_record(X, forward) andalso element(2, XX)==interface ->
+ ok;
+ [_] ->
+ ic_error:error(G, {multiply_defined, X});
[] ->
case ets:lookup(S, UName) of
[] -> ok;
diff --git a/lib/ic/test/Makefile b/lib/ic/test/Makefile
index 1142159d19..1d90a1bc17 100644
--- a/lib/ic/test/Makefile
+++ b/lib/ic/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1998-2010. All Rights Reserved.
+# Copyright Ericsson AB 1998-2011. 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
@@ -33,7 +33,7 @@ RELSYSDIR = $(RELEASE_PATH)/ic_test
# ----------------------------------------------------
# Target Specs
# ----------------------------------------------------
-TEST_SPEC_FILE = ic.spec ic.spec.vxworks
+TEST_SPEC_FILE = ic.spec
IDL_FILES =
@@ -251,7 +251,7 @@ release_tests_spec: tests
$(INSTALL_DIR) $(RELSYSDIR)/erl_client_c_server_SUITE_data
$(INSTALL_DIR) $(RELSYSDIR)/erl_client_c_server_proto_SUITE_data
$(INSTALL_DIR) $(RELSYSDIR)/java_client_erl_server_SUITE_data
- $(INSTALL_DATA) $(IDL_FILES) $(TEST_SPEC_FILE) $(ERL_FILES) \
+ $(INSTALL_DATA) $(IDL_FILES) ic.cover $(TEST_SPEC_FILE) $(ERL_FILES) \
$(RELSYSDIR)
$(INSTALL_DATA) $(COMPILER_TEST_FILES) $(RELSYSDIR)/ic_SUITE_data
$(INSTALL_DATA) $(COMPILER_TEST_FILES2) \
diff --git a/lib/ic/test/c_client_erl_server_SUITE.erl b/lib/ic/test/c_client_erl_server_SUITE.erl
index 40c1395d10..9f43d28f4d 100644
--- a/lib/ic/test/c_client_erl_server_SUITE.erl
+++ b/lib/ic/test/c_client_erl_server_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -24,10 +24,12 @@
-module(c_client_erl_server_SUITE).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
--export([init_per_testcase/2, fin_per_testcase/2,
- all/1, void_test/1, long_test/1, long_long_test/1,
+-export([init_per_testcase/2, end_per_testcase/2,
+ all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ void_test/1, long_test/1, long_long_test/1,
unsigned_short_test/1, unsigned_long_test/1,
unsigned_long_long_test/1, double_test/1, char_test/1,
wchar_test/1, octet_test/1, bool_test/1, struct_test/1,
@@ -57,25 +59,40 @@ init_per_testcase(_Case, Config) ->
WatchDog = test_server:timetrap(?DEFAULT_TIMEOUT),
[{watchdog, WatchDog}| Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
DataDir = ?config(data_dir, Config),
code:del_path(DataDir),
WatchDog = ?config(watchdog, Config),
test_server:timetrap_cancel(WatchDog).
-all(doc) ->
- "Test of IC with a C-client and an Erlang generic server. "
- "The communication is via Erlang distribution.";
-all(suite) ->
- [void_test, long_test, long_long_test, unsigned_short_test,
- unsigned_long_test, unsigned_long_long_test, double_test,
- char_test, wchar_test, octet_test, bool_test, struct_test,
- struct2_test, seq1_test, seq2_test, seq3_test, seq4_test,
- seq5_test, array1_test, array2_test, enum_test, string1_test,
- string2_test, string3_test, string4_test, pid_test, port_test,
- ref_test, term_test, typedef_test, inline_sequence_test,
- term_sequence_test, term_struct_test, wstring1_test].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+all() ->
+ [void_test, long_test, long_long_test,
+ unsigned_short_test, unsigned_long_test,
+ unsigned_long_long_test, double_test, char_test,
+ wchar_test, octet_test, bool_test, struct_test,
+ struct2_test, seq1_test, seq2_test, seq3_test,
+ seq4_test, seq5_test, array1_test, array2_test,
+ enum_test, string1_test, string2_test, string3_test,
+ string4_test, pid_test, port_test, ref_test, term_test,
+ typedef_test, inline_sequence_test, term_sequence_test,
+ term_struct_test, wstring1_test].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
array1_test(doc) -> "";
array1_test(suite) -> [];
diff --git a/lib/ic/test/c_client_erl_server_SUITE_data/Makefile.src b/lib/ic/test/c_client_erl_server_SUITE_data/Makefile.src
index 6516e699bd..d5277eb256 100644
--- a/lib/ic/test/c_client_erl_server_SUITE_data/Makefile.src
+++ b/lib/ic/test/c_client_erl_server_SUITE_data/Makefile.src
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2001-2009. All Rights Reserved.
+# Copyright Ericsson AB 2001-2011. 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
diff --git a/lib/ic/test/c_client_erl_server_SUITE_data/erl_server.erl b/lib/ic/test/c_client_erl_server_SUITE_data/erl_server.erl
index dffbbb059c..8ccb00aa4d 100644
--- a/lib/ic/test/c_client_erl_server_SUITE_data/erl_server.erl
+++ b/lib/ic/test/c_client_erl_server_SUITE_data/erl_server.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
diff --git a/lib/ic/test/c_client_erl_server_SUITE_data/m_i_impl.erl b/lib/ic/test/c_client_erl_server_SUITE_data/m_i_impl.erl
index cfcaa793a5..9bb29bba16 100644
--- a/lib/ic/test/c_client_erl_server_SUITE_data/m_i_impl.erl
+++ b/lib/ic/test/c_client_erl_server_SUITE_data/m_i_impl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
diff --git a/lib/ic/test/c_client_erl_server_proto_SUITE.erl b/lib/ic/test/c_client_erl_server_proto_SUITE.erl
index 58309a2221..de643ee8cc 100644
--- a/lib/ic/test/c_client_erl_server_proto_SUITE.erl
+++ b/lib/ic/test/c_client_erl_server_proto_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -23,10 +23,12 @@
%%----------------------------------------------------------------------
-module(c_client_erl_server_proto_SUITE).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
--export([init_per_testcase/2, fin_per_testcase/2,
- all/1, void_test/1, long_test/1, long_long_test/1,
+-export([init_per_testcase/2, end_per_testcase/2,
+ all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ void_test/1, long_test/1, long_long_test/1,
unsigned_short_test/1, unsigned_long_test/1,
unsigned_long_long_test/1, double_test/1, char_test/1,
wchar_test/1, octet_test/1, bool_test/1, struct_test/1,
@@ -56,25 +58,40 @@ init_per_testcase(_Case, Config) ->
WatchDog = test_server:timetrap(?DEFAULT_TIMEOUT),
[{watchdog, WatchDog}| Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
DataDir = ?config(data_dir, Config),
code:del_path(DataDir),
WatchDog = ?config(watchdog, Config),
test_server:timetrap_cancel(WatchDog).
-all(doc) ->
- "Test of IC with a C-client and an Erlang generic server. "
- "The communication is via Erlang distribution.";
-all(suite) ->
- [void_test, long_test, long_long_test, unsigned_short_test,
- unsigned_long_test, unsigned_long_long_test, double_test,
- char_test, wchar_test, octet_test, bool_test, struct_test,
- struct2_test, seq1_test, seq2_test, seq3_test, seq4_test,
- seq5_test, array1_test, array2_test, enum_test, string1_test,
- string2_test, string3_test, string4_test, pid_test, port_test,
- ref_test, term_test, typedef_test, inline_sequence_test,
- term_sequence_test, term_struct_test, wstring1_test].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+all() ->
+ [void_test, long_test, long_long_test,
+ unsigned_short_test, unsigned_long_test,
+ unsigned_long_long_test, double_test, char_test,
+ wchar_test, octet_test, bool_test, struct_test,
+ struct2_test, seq1_test, seq2_test, seq3_test,
+ seq4_test, seq5_test, array1_test, array2_test,
+ enum_test, string1_test, string2_test, string3_test,
+ string4_test, pid_test, port_test, ref_test, term_test,
+ typedef_test, inline_sequence_test, term_sequence_test,
+ term_struct_test, wstring1_test].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
array1_test(doc) -> "";
array1_test(suite) -> [];
diff --git a/lib/ic/test/c_client_erl_server_proto_SUITE_data/Makefile.src b/lib/ic/test/c_client_erl_server_proto_SUITE_data/Makefile.src
index 3dcd1d9387..8bc1a907a7 100644
--- a/lib/ic/test/c_client_erl_server_proto_SUITE_data/Makefile.src
+++ b/lib/ic/test/c_client_erl_server_proto_SUITE_data/Makefile.src
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2003-2009. All Rights Reserved.
+# Copyright Ericsson AB 2003-2011. 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
diff --git a/lib/ic/test/c_client_erl_server_proto_SUITE_data/erl_server.erl b/lib/ic/test/c_client_erl_server_proto_SUITE_data/erl_server.erl
index 09358b7cf9..ec0757bfab 100644
--- a/lib/ic/test/c_client_erl_server_proto_SUITE_data/erl_server.erl
+++ b/lib/ic/test/c_client_erl_server_proto_SUITE_data/erl_server.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
diff --git a/lib/ic/test/c_client_erl_server_proto_SUITE_data/m_i_impl.erl b/lib/ic/test/c_client_erl_server_proto_SUITE_data/m_i_impl.erl
index 9f231de856..1eb792cb6d 100644
--- a/lib/ic/test/c_client_erl_server_proto_SUITE_data/m_i_impl.erl
+++ b/lib/ic/test/c_client_erl_server_proto_SUITE_data/m_i_impl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
diff --git a/lib/ic/test/c_client_erl_server_proto_SUITE_data/my.c b/lib/ic/test/c_client_erl_server_proto_SUITE_data/my.c
index f8a3b28cc2..103066a795 100644
--- a/lib/ic/test/c_client_erl_server_proto_SUITE_data/my.c
+++ b/lib/ic/test/c_client_erl_server_proto_SUITE_data/my.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2004-2011. 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
diff --git a/lib/ic/test/c_client_erl_server_proto_tmo_SUITE.erl b/lib/ic/test/c_client_erl_server_proto_tmo_SUITE.erl
index 595c5bf483..1a2d885867 100644
--- a/lib/ic/test/c_client_erl_server_proto_tmo_SUITE.erl
+++ b/lib/ic/test/c_client_erl_server_proto_tmo_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -23,10 +23,12 @@
%%----------------------------------------------------------------------
-module(c_client_erl_server_proto_tmo_SUITE).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
--export([init_per_testcase/2, fin_per_testcase/2,
- all/1, void_test/1, long_test/1, long_long_test/1,
+-export([init_per_testcase/2, end_per_testcase/2,
+ all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ void_test/1, long_test/1, long_long_test/1,
unsigned_short_test/1, unsigned_long_test/1,
unsigned_long_long_test/1, double_test/1, char_test/1,
wchar_test/1, octet_test/1, bool_test/1, struct_test/1,
@@ -56,24 +58,41 @@ init_per_testcase(_Case, Config) ->
WatchDog = test_server:timetrap(?DEFAULT_TIMEOUT),
[{watchdog, WatchDog}| Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
DataDir = ?config(data_dir, Config),
code:del_path(DataDir),
WatchDog = ?config(watchdog, Config),
test_server:timetrap_cancel(WatchDog).
-all(doc) ->
- "Test of IC with a C-client and an Erlang generic server. "
- "The communication is via Erlang distribution.";
-all(suite) ->
- [void_test, long_test, long_long_test, unsigned_short_test,
- unsigned_long_test, unsigned_long_long_test, double_test,
- char_test, wchar_test, octet_test, bool_test, struct_test,
- struct2_test, seq1_test, seq2_test, seq3_test, seq4_test,
- seq5_test, array1_test, array2_test, enum_test, string1_test,
- string2_test, string3_test, string4_test, pid_test, port_test,
- ref_test, term_test, typedef_test, inline_sequence_test,
- term_sequence_test, term_struct_test, wstring1_test].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [void_test, long_test, long_long_test,
+ unsigned_short_test, unsigned_long_test,
+ unsigned_long_long_test, double_test, char_test,
+ wchar_test, octet_test, bool_test, struct_test,
+ struct2_test, seq1_test, seq2_test, seq3_test,
+ seq4_test, seq5_test, array1_test, array2_test,
+ enum_test, string1_test, string2_test, string3_test,
+ string4_test, pid_test, port_test, ref_test, term_test,
+ typedef_test, inline_sequence_test, term_sequence_test,
+ term_struct_test, wstring1_test].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
array1_test(doc) -> "";
diff --git a/lib/ic/test/c_client_erl_server_proto_tmo_SUITE_data/Makefile.src b/lib/ic/test/c_client_erl_server_proto_tmo_SUITE_data/Makefile.src
index 62672e0b95..2585341791 100644
--- a/lib/ic/test/c_client_erl_server_proto_tmo_SUITE_data/Makefile.src
+++ b/lib/ic/test/c_client_erl_server_proto_tmo_SUITE_data/Makefile.src
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2004-2009. All Rights Reserved.
+# Copyright Ericsson AB 2004-2011. 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
diff --git a/lib/ic/test/c_client_erl_server_proto_tmo_SUITE_data/erl_server.erl b/lib/ic/test/c_client_erl_server_proto_tmo_SUITE_data/erl_server.erl
index 2e624ec5c0..06b39b8c35 100644
--- a/lib/ic/test/c_client_erl_server_proto_tmo_SUITE_data/erl_server.erl
+++ b/lib/ic/test/c_client_erl_server_proto_tmo_SUITE_data/erl_server.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
diff --git a/lib/ic/test/c_client_erl_server_proto_tmo_SUITE_data/m_i_impl.erl b/lib/ic/test/c_client_erl_server_proto_tmo_SUITE_data/m_i_impl.erl
index 0c96fb9edf..094855c27f 100644
--- a/lib/ic/test/c_client_erl_server_proto_tmo_SUITE_data/m_i_impl.erl
+++ b/lib/ic/test/c_client_erl_server_proto_tmo_SUITE_data/m_i_impl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
diff --git a/lib/ic/test/c_client_erl_server_proto_tmo_SUITE_data/my.c b/lib/ic/test/c_client_erl_server_proto_tmo_SUITE_data/my.c
index 4e0be3fec1..9567635742 100644
--- a/lib/ic/test/c_client_erl_server_proto_tmo_SUITE_data/my.c
+++ b/lib/ic/test/c_client_erl_server_proto_tmo_SUITE_data/my.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2004-2011. 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
diff --git a/lib/ic/test/erl_client_c_server_SUITE.erl b/lib/ic/test/erl_client_c_server_SUITE.erl
index c5f5b6a218..9bd9d4a46d 100644
--- a/lib/ic/test/erl_client_c_server_SUITE.erl
+++ b/lib/ic/test/erl_client_c_server_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
@@ -24,9 +24,9 @@
-module(erl_client_c_server_SUITE).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
--export([init_per_testcase/2, fin_per_testcase/2, all/1, void_test/1,
+-export([init_per_testcase/2, end_per_testcase/2,all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, init_per_group/2,end_per_group/2, void_test/1,
long_test/1, longlong_test/1, ushort_test/1, ulong_test/1,
ulonglong_test/1, double_test/1, char_test/1, wchar_test/1,
octet_test/1, bool_test/1, struct_test/1, struct2_test/1,
@@ -57,24 +57,40 @@ init_per_testcase(_Case, Config) ->
WatchDog = test_server:timetrap(?DEFAULT_TIMEOUT),
[{watchdog, WatchDog}| Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
DataDir = ?config(data_dir, Config),
code:del_path(DataDir),
WatchDog = ?config(watchdog, Config),
test_server:timetrap_cancel(WatchDog).
-all(doc) ->
- "Test of IC with an Erlang client and a C server. "
- "The communication is via Erlang distribution.";
-all(suite) ->
- [void_test, long_test, longlong_test, ushort_test,
- ulong_test, ulonglong_test, double_test,
- char_test, wchar_test, octet_test, bool_test, struct_test,
- struct2_test, seq1_test, seq2_test, seq3_test, seq4_test,
- seq5_test, array1_test, array2_test, enum_test, string1_test,
- string2_test, string3_test, string4_test, pid_test, port_test,
- ref_test, term_test, typedef_test, inline_sequence_test,
- term_sequence_test, term_struct_test, wstring1_test].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+[void_test, long_test, longlong_test, ushort_test,
+ ulong_test, ulonglong_test, double_test, char_test,
+ wchar_test, octet_test, bool_test, struct_test,
+ struct2_test, seq1_test, seq2_test, seq3_test,
+ seq4_test, seq5_test, array1_test, array2_test,
+ enum_test, string1_test, string2_test, string3_test,
+ string4_test, pid_test, port_test, ref_test, term_test,
+ typedef_test, inline_sequence_test, term_sequence_test,
+ term_struct_test, wstring1_test].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
array1_test(doc) -> "";
diff --git a/lib/ic/test/erl_client_c_server_SUITE_data/Makefile.src b/lib/ic/test/erl_client_c_server_SUITE_data/Makefile.src
index cd34d2b247..50cf9d4445 100644
--- a/lib/ic/test/erl_client_c_server_SUITE_data/Makefile.src
+++ b/lib/ic/test/erl_client_c_server_SUITE_data/Makefile.src
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2002-2009. All Rights Reserved.
+# Copyright Ericsson AB 2002-2011. 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
diff --git a/lib/ic/test/erl_client_c_server_SUITE_data/c_server.c b/lib/ic/test/erl_client_c_server_SUITE_data/c_server.c
index acdeff80fe..74f29f59f9 100644
--- a/lib/ic/test/erl_client_c_server_SUITE_data/c_server.c
+++ b/lib/ic/test/erl_client_c_server_SUITE_data/c_server.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2002-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2002-2011. 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
diff --git a/lib/ic/test/erl_client_c_server_SUITE_data/callbacks.c b/lib/ic/test/erl_client_c_server_SUITE_data/callbacks.c
index d6b28b619d..305017ae85 100644
--- a/lib/ic/test/erl_client_c_server_SUITE_data/callbacks.c
+++ b/lib/ic/test/erl_client_c_server_SUITE_data/callbacks.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2002-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2002-2011. 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
diff --git a/lib/ic/test/erl_client_c_server_proto_SUITE.erl b/lib/ic/test/erl_client_c_server_proto_SUITE.erl
index d75feb621a..f4a06b0f16 100644
--- a/lib/ic/test/erl_client_c_server_proto_SUITE.erl
+++ b/lib/ic/test/erl_client_c_server_proto_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -24,9 +24,9 @@
-module(erl_client_c_server_proto_SUITE).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
--export([init_per_testcase/2, fin_per_testcase/2, all/1, void_test/1,
+-export([init_per_testcase/2, end_per_testcase/2,all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, init_per_group/2,end_per_group/2, void_test/1,
long_test/1, longlong_test/1, ushort_test/1, ulong_test/1,
ulonglong_test/1, double_test/1, char_test/1, wchar_test/1,
octet_test/1, bool_test/1, struct_test/1, struct2_test/1,
@@ -57,24 +57,40 @@ init_per_testcase(_Case, Config) ->
WatchDog = test_server:timetrap(?DEFAULT_TIMEOUT),
[{watchdog, WatchDog}| Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
DataDir = ?config(data_dir, Config),
code:del_path(DataDir),
WatchDog = ?config(watchdog, Config),
test_server:timetrap_cancel(WatchDog).
-all(doc) ->
- "Test of IC with an Erlang client and a C server. "
- "The communication is via Erlang distribution.";
-all(suite) ->
- [void_test, long_test, longlong_test, ushort_test,
- ulong_test, ulonglong_test, double_test,
- char_test, wchar_test, octet_test, bool_test, struct_test,
- struct2_test, seq1_test, seq2_test, seq3_test, seq4_test,
- seq5_test, array1_test, array2_test, enum_test, string1_test,
- string2_test, string3_test, string4_test, pid_test, port_test,
- ref_test, term_test, typedef_test, inline_sequence_test,
- term_sequence_test, term_struct_test, wstring1_test].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+[void_test, long_test, longlong_test, ushort_test,
+ ulong_test, ulonglong_test, double_test, char_test,
+ wchar_test, octet_test, bool_test, struct_test,
+ struct2_test, seq1_test, seq2_test, seq3_test,
+ seq4_test, seq5_test, array1_test, array2_test,
+ enum_test, string1_test, string2_test, string3_test,
+ string4_test, pid_test, port_test, ref_test, term_test,
+ typedef_test, inline_sequence_test, term_sequence_test,
+ term_struct_test, wstring1_test].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
array1_test(doc) -> "";
diff --git a/lib/ic/test/erl_client_c_server_proto_SUITE_data/Makefile.src b/lib/ic/test/erl_client_c_server_proto_SUITE_data/Makefile.src
index b7e7ee77d0..6c7701ca50 100644
--- a/lib/ic/test/erl_client_c_server_proto_SUITE_data/Makefile.src
+++ b/lib/ic/test/erl_client_c_server_proto_SUITE_data/Makefile.src
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2004-2009. All Rights Reserved.
+# Copyright Ericsson AB 2004-2011. 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
diff --git a/lib/ic/test/erl_client_c_server_proto_SUITE_data/c_server.c b/lib/ic/test/erl_client_c_server_proto_SUITE_data/c_server.c
index 329f444112..8192341548 100644
--- a/lib/ic/test/erl_client_c_server_proto_SUITE_data/c_server.c
+++ b/lib/ic/test/erl_client_c_server_proto_SUITE_data/c_server.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2004-2011. 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
diff --git a/lib/ic/test/erl_client_c_server_proto_SUITE_data/callbacks.c b/lib/ic/test/erl_client_c_server_proto_SUITE_data/callbacks.c
index b029bcc63c..c423a9e51c 100644
--- a/lib/ic/test/erl_client_c_server_proto_SUITE_data/callbacks.c
+++ b/lib/ic/test/erl_client_c_server_proto_SUITE_data/callbacks.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2004-2011. 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
diff --git a/lib/ic/test/erl_client_c_server_proto_SUITE_data/erl_client.erl b/lib/ic/test/erl_client_c_server_proto_SUITE_data/erl_client.erl
index b5ee7af199..f204896aee 100644
--- a/lib/ic/test/erl_client_c_server_proto_SUITE_data/erl_client.erl
+++ b/lib/ic/test/erl_client_c_server_proto_SUITE_data/erl_client.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
diff --git a/lib/ic/test/erl_client_c_server_proto_SUITE_data/my.c b/lib/ic/test/erl_client_c_server_proto_SUITE_data/my.c
index c0401b2621..88417ef498 100644
--- a/lib/ic/test/erl_client_c_server_proto_SUITE_data/my.c
+++ b/lib/ic/test/erl_client_c_server_proto_SUITE_data/my.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2004-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2004-2011. 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
diff --git a/lib/ic/test/ic.cover b/lib/ic/test/ic.cover
new file mode 100644
index 0000000000..5a679c8b6f
--- /dev/null
+++ b/lib/ic/test/ic.cover
@@ -0,0 +1,2 @@
+{incl_app,ic,details}.
+
diff --git a/lib/ic/test/ic.spec b/lib/ic/test/ic.spec
index 280c2aba47..22905dcee4 100644
--- a/lib/ic/test/ic.spec
+++ b/lib/ic/test/ic.spec
@@ -1 +1 @@
-{topcase, {dir, "../ic_test"}}.
+{suites,"../ic_test",all}.
diff --git a/lib/ic/test/ic_SUITE.erl b/lib/ic/test/ic_SUITE.erl
index 6682c82f01..c30d6485ad 100644
--- a/lib/ic/test/ic_SUITE.erl
+++ b/lib/ic/test/ic_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -22,9 +22,10 @@
%%%----------------------------------------------------------------------
-module(ic_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
-include_lib("orber/src/orber_ifr.hrl").
@@ -33,36 +34,36 @@
%% The type cases
--export([type/1, type_norm/1]).
+-export([ type_norm/1]).
%% The syntax case
--export([syntax/1]).
+-export([]).
-export([syntax1/1, syntax2/1, syntax3/1, syntax4/1, syntax5/1, syntax6/1]).
%% The constant cases
--export([const/1]).
+-export([]).
-export([const_norm/1, const_bad_tk/1, const_bad_type/1]).
-export([const_bad_comb/1]).
%% The union cases
--export([union/1]).
+-export([]).
-export([union_norm/1, union_type/1, union_mult_err/1, union_case_mult/1]).
-export([union_default/1]).
%% The enum cases
--export([enum/1]).
+-export([]).
-export([enum_norm/1]).
%% The struct cases
--export([struct/1]).
+-export([]).
-export([struct_norm/1]).
%% The oneway cases
--export([oneway/1]).
+-export([]).
-export([oneway_norm/1, oneway_raises/1, oneway_out/1, oneway_void/1, oneway_followed/1]).
%% The attributes cases
--export([attr/1]).
+-export([]).
-export([attr_norm/1]).
%% The raises registration case
@@ -72,12 +73,12 @@
%% The typeID case
%% general stuff
--export([general/1]).
+-export([]).
-export([typeid/1, undef_id/1, dir/1, nasty_names/1, coss/1, mult_ids/1]).
-export([forward/1, include/1, app_test/1]).
%% inheritance stuff
--export([inherit/1, inherit_norm/1, inherit_warn/1, inherit_err/1]).
+-export([ inherit_norm/1, inherit_warn/1, inherit_err/1]).
%% Standard options to the ic compiler, NOTE unholy use of OutDir
@@ -86,10 +87,46 @@
%% Top of cases
-all(doc) ->
- [];
-all(suite) -> [app_test, const, union, enum, attr, type, struct, general, inherit,
- oneway, syntax, raises_reg].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [app_test, {group, const}, {group, union},
+ {group, enum}, {group, attr}, {group, type},
+ {group, struct}, {group, general}, {group, inherit},
+ {group, oneway}, {group, syntax}, raises_reg].
+
+groups() ->
+ [{const, [],
+ [const_norm, const_bad_tk, const_bad_type,
+ const_bad_comb]},
+ {union, [],
+ [union_norm, union_type, union_mult_err,
+ union_case_mult, union_default]},
+ {enum, [], [enum_norm]}, {struct, [], [struct_norm]},
+ {general, [],
+ [typeid, undef_id, mult_ids, forward, include,
+ nasty_names]},
+ {inherit, [],
+ [inherit_norm, inherit_warn, inherit_err]},
+ {oneway, [],
+ [oneway_norm, oneway_out, oneway_raises, oneway_void,
+ oneway_followed]},
+ {attr, [], [attr_norm]}, {type, [], [type_norm]},
+ {syntax, [],
+ [syntax1, syntax2, syntax3, syntax4, syntax5, syntax6]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
app_test(doc) -> [];
@@ -103,7 +140,6 @@ app_test(_Config) ->
%% Test of constant expressions.
%%
-const(suite) -> [const_norm, const_bad_tk, const_bad_type, const_bad_comb].
const_norm(doc) ->
@@ -159,10 +195,6 @@ const_bad_comb(Config) when is_list(Config) ->
-union(suite) -> [union_norm, union_type, union_mult_err, union_case_mult,
- union_default];
-union(doc) ->
- ["Checks allowed usage of the union as well as the illegal cases"].
union_norm(doc) ->
@@ -277,9 +309,6 @@ union_case_mult(Config) when is_list(Config) ->
%% Enum cases
%%
-enum(suite) -> [enum_norm];
-enum(doc) ->
- ["Checks allowed usage of the enum as well as the illegal cases"].
enum_norm(doc) ->
["Checks that normal enum declarations works."];
@@ -300,9 +329,6 @@ enum_norm(Config) when is_list(Config) ->
%% Struct cases
%%
-struct(suite) -> [struct_norm];
-struct(doc) ->
- ["Checks allowed usage of the struct as well as the illegal cases"].
struct_norm(doc) ->
["Checks that normal struct declarations works."];
@@ -331,10 +357,6 @@ struct_norm(Config) when is_list(Config) ->
%% General cases
%%
-general(doc) ->
- ["Check general things like directories and type identifier",
- "detection."];
-general(suite) -> [typeid, undef_id, mult_ids, forward, include, nasty_names].
%% coss (add sometimes, takes 440 seconds!)
typeid(doc) ->
@@ -490,9 +512,6 @@ include(Config) when is_list(Config) ->
%% Inhertit cases
%%
-inherit(doc) ->
- ["Check the inheritance mechanism."];
-inherit(suite) -> [inherit_norm, inherit_warn, inherit_err].
inherit_norm(doc) ->
["Checks that normal inheritance works."];
@@ -547,9 +566,6 @@ inherit_err(Config) when is_list(Config) ->
ok.
-oneway(doc) ->
- ["Check the oneway operation mechanism."];
-oneway(suite) -> [oneway_norm, oneway_out, oneway_raises, oneway_void, oneway_followed ].
oneway_norm(doc) ->
["Checks that normal oneway operations works."];
@@ -618,9 +634,6 @@ oneway_followed(Config) when is_list(Config) ->
?line ok = compile(OutDir, oneway_followed_files(), [load]),
ok.
-attr(doc) ->
- ["Check that attributes work."];
-attr(suite) -> [attr_norm].
attr_norm(doc) ->
["Checks that normal attr operations works."];
@@ -636,9 +649,6 @@ attr_norm(Config) when is_list(Config) ->
?line ok = compile(OutDir, attr_norm_files(), [load]),
ok.
-type(doc) ->
- ["Check that typeibutes work."];
-type(suite) -> [type_norm].
type_norm(doc) ->
["Checks all types are handled."];
@@ -655,9 +665,6 @@ type_norm(Config) when is_list(Config) ->
ok.
-syntax(doc) ->
- ["Check that syntax errors are discovered."];
-syntax(suite) -> [syntax1, syntax2, syntax3, syntax4, syntax5, syntax6].
syntax1(suite) -> [];
syntax1(Config) when is_list(Config) ->
diff --git a/lib/ic/test/ic_be_SUITE.erl b/lib/ic/test/ic_be_SUITE.erl
index e3caf7bdff..5a213ebd5f 100644
--- a/lib/ic/test/ic_be_SUITE.erl
+++ b/lib/ic/test/ic_be_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -22,10 +22,11 @@
%%%----------------------------------------------------------------------
-module(ic_be_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,plain/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,plain/1]).
-define(OUT(X), filename:join([?config(priv_dir, Config), gen, to_list(X)])).
@@ -33,7 +34,26 @@
%% Top of cases
-all(suite) -> [plain].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [plain].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
diff --git a/lib/ic/test/ic_pp_SUITE.erl b/lib/ic/test/ic_pp_SUITE.erl
index d68242bf3a..571c37c3da 100644
--- a/lib/ic/test/ic_pp_SUITE.erl
+++ b/lib/ic/test/ic_pp_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -22,7 +22,7 @@
%%----------------------------------------------------------------------
-module(ic_pp_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
@@ -32,50 +32,57 @@
-define(GCC, "g++").
-define(GCC_VER, "2.95.3").
--export([all/1]).
--export([arg/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]).
-export([arg_norm/1]).
--export([cascade/1]).
-export([cascade_norm/1]).
--export([comment/1]).
-export([comment_norm/1]).
--export([concat/1]).
-export([concat_norm/1]).
--export([define/1]).
-export([define_norm/1]).
--export(['if'/1]).
-export([if_norm/1]).
-export([if_zero/1]).
--export([misc/1]).
-export([misc_norm/1]).
--export([improp_nest_constr/1]).
-export([improp_nest_constr_norm/1]).
--export([inc/1]).
-export([inc_norm/1]).
--export([line/1]).
-export([line_norm/1]).
--export([nopara/1]).
-export([nopara_norm/1]).
--export([predef/1]).
-export([predef_norm/1]).
--export([predef_time/1]).
-export([predef_time_norm/1]).
--export([self_ref/1]).
-export([self_ref_norm/1]).
--export([separate/1]).
-export([separate_norm/1]).
--export([swallow_sc/1]).
-export([swallow_sc_norm/1]).
--export([unintended_grp/1]).
-export([unintended_grp_norm/1]).
--export([cases/0, init_all/1, finish_all/1]).
+-export([cases/0, init_per_suite/1, end_per_suite/1]).
-all(doc) -> ["Preprocessing tests for IC"];
-all(suite) ->
- {req, [], {conf, init_all, cases(), finish_all}}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
-init_all(Config) ->
+all() ->
+ cases().
+
+groups() ->
+ [{arg, [], [arg_norm]}, {cascade, [], [cascade_norm]},
+ {comment, [], [comment_norm]},
+ {concat, [], [concat_norm]},
+ {define, [], [define_norm]}, {inc, [], [inc_norm]},
+ {improp_nest_constr, [], [improp_nest_constr_norm]},
+ {misc, [], [misc_norm]}, {line, [], [line_norm]},
+ {nopara, [], [nopara_norm]},
+ {predef, [], [predef_norm]},
+ {predef_time, [], [predef_time_norm]},
+ {self_ref, [], [self_ref_norm]},
+ {separate, [], [separate_norm]},
+ {swallow_sc, [], [swallow_sc_norm]},
+ {unintended_grp, [], [unintended_grp_norm]},
+ {'if', [],[if_norm, if_zero]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+init_per_suite(Config) ->
if
is_list(Config) ->
case os:type() of
@@ -120,14 +127,18 @@ skip_white([$\t|T]) -> skip_white(T);
skip_white(L) -> L.
-finish_all(Config) ->
+end_per_suite(Config) ->
Config.
-cases() ->
- [arg, cascade, comment, concat, define, misc, 'if', improp_nest_constr, inc,
- line, nopara, predef, predef_time, self_ref, separate, swallow_sc,
- unintended_grp].
+cases() ->
+ [{group, arg}, {group, cascade}, {group, comment},
+ {group, concat}, {group, define}, {group, misc}, {group, 'if'},
+ {group, improp_nest_constr}, {group, inc},
+ {group, line}, {group, nopara}, {group, predef},
+ {group, predef_time}, {group, self_ref},
+ {group, separate}, {group, swallow_sc},
+ {group, unintended_grp}].
@@ -135,8 +146,6 @@ cases() ->
%% arg
%%--------------------------------------------------------------------
-arg(suite) -> [arg_norm];
-arg(doc) -> ["Check #define with some arguments"].
arg_norm(doc) -> ["Checks arguments for #define."];
arg_norm(suite) -> [];
@@ -153,8 +162,6 @@ arg_norm(Config) when is_list(Config) ->
%% cascade
%%--------------------------------------------------------------------
-cascade(suite) -> [cascade_norm];
-cascade(doc) -> ["Check cascade #define"].
cascade_norm(doc) -> ["Check cascade #define."];
cascade_norm(suite) -> [];
@@ -171,8 +178,6 @@ cascade_norm(Config) when is_list(Config) ->
%% comment
%%--------------------------------------------------------------------
-comment(suite) -> [comment_norm];
-comment(doc) -> ["Check comments"].
comment_norm(doc) -> ["Check comments."];
comment_norm(suite) -> [];
@@ -189,8 +194,6 @@ comment_norm(Config) when is_list(Config) ->
%% concat
%%--------------------------------------------------------------------
-concat(suite) -> [concat_norm];
-concat(doc) -> ["Check concatinations, i.e ## "].
concat_norm(doc) -> ["Check concatinations, i.e ## ."];
concat_norm(suite) -> [];
@@ -207,8 +210,6 @@ concat_norm(Config) when is_list(Config) ->
%% define
%%--------------------------------------------------------------------
-define(suite) -> [define_norm];
-define(doc) -> ["Check misceleaneous #define"].
define_norm(doc) -> ["Check misceleaneous #define."];
define_norm(suite) -> [];
@@ -225,10 +226,6 @@ define_norm(Config) when is_list(Config) ->
%% if
%%--------------------------------------------------------------------
-'if'(suite) -> [if_norm, if_zero];
-'if'(doc) -> ["Check #if, #elif, and #endif. Note these are not implementen and will ~n
- result in an error message from internal_pp"].
-
if_norm(doc) -> ["Check #if, #elif, and #endif. ."];
if_norm(suite) -> [];
if_norm(Config) when is_list(Config) ->
@@ -254,8 +251,6 @@ if_zero(Config) when is_list(Config) ->
%% inc
%%--------------------------------------------------------------------
-inc(suite) -> [inc_norm];
-inc(doc) -> ["Check #include"].
inc_norm(doc) -> ["Check #include."];
inc_norm(suite) -> [];
@@ -273,8 +268,6 @@ inc_norm(Config) when is_list(Config) ->
%% improp_nest_constr
%%--------------------------------------------------------------------
-improp_nest_constr(suite) -> [improp_nest_constr_norm];
-improp_nest_constr(doc) -> ["Check improperly nested constructs"].
improp_nest_constr_norm(doc) -> ["Check improperly nested constructs."];
improp_nest_constr_norm(suite) -> [];
@@ -291,8 +284,6 @@ improp_nest_constr_norm(Config) when is_list(Config) ->
%% misc
%%--------------------------------------------------------------------
-misc(suite) -> [misc_norm];
-misc(doc) -> ["Misceleaneous checks"].
misc_norm(doc) -> ["Misceleaneous checks."];
misc_norm(suite) -> [];
@@ -309,8 +300,6 @@ misc_norm(Config) when is_list(Config) ->
%% line
%%--------------------------------------------------------------------
-line(suite) -> [line_norm];
-line(doc) -> ["Checks #line"].
line_norm(doc) -> ["Checks #line."];
line_norm(suite) -> [];
@@ -327,8 +316,6 @@ line_norm(Config) when is_list(Config) ->
%% nopara
%%--------------------------------------------------------------------
-nopara(suite) -> [nopara_norm];
-nopara(doc) -> ["Checks #define with no parameters"].
nopara_norm(doc) -> ["Checks #define with no parameters."];
nopara_norm(suite) -> [];
@@ -345,8 +332,6 @@ nopara_norm(Config) when is_list(Config) ->
%% predef
%%--------------------------------------------------------------------
-predef(suite) -> [predef_norm];
-predef(doc) -> ["Checks predefined macros. Note: not __TIME__ and __DATE__"].
predef_norm(doc) -> ["Checks predefined macros. Note: not __TIME__ and __DATE__."];
predef_norm(suite) -> [];
@@ -363,8 +348,6 @@ predef_norm(Config) when is_list(Config) ->
%% predef_time
%%--------------------------------------------------------------------
-predef_time(suite) -> [predef_time_norm];
-predef_time(doc) -> ["Checks the predefined macros __TIME__ and __DATE__"].
predef_time_norm(doc) -> ["Checks the predefined macros __TIME__ and __DATE__."];
predef_time_norm(suite) -> [];
@@ -381,8 +364,6 @@ predef_time_norm(Config) when is_list(Config) ->
%% self_ref
%%--------------------------------------------------------------------
-self_ref(suite) -> [self_ref_norm];
-self_ref(doc) -> ["Checks self referring macros"].
self_ref_norm(doc) -> ["Checks self referring macros."];
self_ref_norm(suite) -> [];
@@ -399,8 +380,6 @@ self_ref_norm(Config) when is_list(Config) ->
%% separate
%%--------------------------------------------------------------------
-separate(suite) -> [separate_norm];
-separate(doc) -> ["Checks separete expansion of macro arguments"].
separate_norm(doc) -> ["Checks separete expansion of macro arguments."];
separate_norm(suite) -> [];
@@ -417,8 +396,6 @@ separate_norm(Config) when is_list(Config) ->
%% swallow_sc
%%--------------------------------------------------------------------
-swallow_sc(suite) -> [swallow_sc_norm];
-swallow_sc(doc) -> ["Checks swallowing an undesirable semicolon"].
swallow_sc_norm(doc) -> ["Checks swallowing an undesirable semicolon."];
swallow_sc_norm(suite) -> [];
@@ -435,8 +412,6 @@ swallow_sc_norm(Config) when is_list(Config) ->
%% unintended_grp
%%--------------------------------------------------------------------
-unintended_grp(suite) -> [unintended_grp_norm];
-unintended_grp(doc) -> ["Checks unintended grouping of arithmetic"].
unintended_grp_norm(doc) -> ["Checks unintended grouping of arithmetic."];
unintended_grp_norm(suite) -> [];
diff --git a/lib/ic/test/ic_pragma_SUITE.erl b/lib/ic/test/ic_pragma_SUITE.erl
index 0edb5d4717..6919af78b5 100644
--- a/lib/ic/test/ic_pragma_SUITE.erl
+++ b/lib/ic/test/ic_pragma_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -27,12 +27,13 @@
%%-----------------------------------------------------------------
-module(ic_pragma_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1, init_all/1, finish_all/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_suite/1, end_per_suite/1]).
-export([ifr_pragma_reg/1, pragma_error/1, uggly_pragmas/1]).
@@ -53,18 +54,28 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["Description", "more description"];
-all(suite) -> {req,
- [mnesia],
- {conf, init_all, cases(), finish_all}}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
-cases() ->
- [ifr_pragma_reg,pragma_error,uggly_pragmas].
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
+ [ifr_pragma_reg, pragma_error, uggly_pragmas].
%%-----------------------------------------------------------------
%% Init and cleanup functions.
%%-----------------------------------------------------------------
-init_all(Config) ->
+init_per_suite(Config) ->
io:format("Setting up.....~n"),
mnesia:stop(),
mnesia:delete_schema([node()]),
@@ -79,7 +90,7 @@ init_all(Config) ->
exit("Config not a list")
end.
-finish_all(Config) ->
+end_per_suite(Config) ->
io:format("Setting down.....~n"),
orber:stop(),
orber:uninstall(),
diff --git a/lib/ic/test/ic_register_SUITE.erl b/lib/ic/test/ic_register_SUITE.erl
index ae7578199a..c3a9464a10 100644
--- a/lib/ic/test/ic_register_SUITE.erl
+++ b/lib/ic/test/ic_register_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -26,12 +26,13 @@
%%-----------------------------------------------------------------
-module(ic_register_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1, init_all/1, finish_all/1, ifr_reg_unreg/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_suite/1, end_per_suite/1, ifr_reg_unreg/1]).
-export([ifr_inheritence_reg/1,ifr_reg_unreg_with_inheritence/1]).
-export([ifr_reg_unreg_with_inheritence_bad_order/1]).
@@ -57,20 +58,31 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["Description", "more description"];
-all(suite) -> {req,
- [mnesia],
- {conf, init_all, cases(), finish_all}}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
-cases() ->
- [ifr_reg_unreg,ifr_reg_unreg_with_inheritence,
- ifr_reg_unreg_with_inheritence_bad_order,ifr_inheritence_reg].
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
+ [ifr_reg_unreg, ifr_reg_unreg_with_inheritence,
+ ifr_reg_unreg_with_inheritence_bad_order,
+ ifr_inheritence_reg].
%%-----------------------------------------------------------------
%% Init and cleanup functions.
%%-----------------------------------------------------------------
-init_all(Config) ->
+init_per_suite(Config) ->
io:format("Setting up.....~n"),
mnesia:stop(),
mnesia:delete_schema([node()]),
@@ -85,7 +97,7 @@ init_all(Config) ->
exit("Config not a list")
end.
-finish_all(Config) ->
+end_per_suite(Config) ->
io:format("Setting down.....~n"),
orber:stop(),
orber:uninstall(),
diff --git a/lib/ic/test/java_client_erl_server_SUITE.erl b/lib/ic/test/java_client_erl_server_SUITE.erl
index ee77ef0c4e..407c3d2d44 100644
--- a/lib/ic/test/java_client_erl_server_SUITE.erl
+++ b/lib/ic/test/java_client_erl_server_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -22,10 +22,12 @@
%%%----------------------------------------------------------------------
-module(java_client_erl_server_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,init_all/1,finish_all/1,init_per_testcase/2,fin_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_suite/1,end_per_suite/1,
+ init_per_testcase/2,end_per_testcase/2]).
-export([marshal_ll/1,marshal_ull/1,
marshal_l/1,marshal_ul/1,
marshal_s/1,marshal_us/1,
@@ -36,19 +38,27 @@
%% Top of cases
-all(doc) ->
- "Test of IC with a Java-client and an Erlang generic server. "
- "The communication is via Erlang distribution.";
-all(suite) -> {conf,init_all,cases(),finish_all}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
-cases() -> [marshal_ll,marshal_ull,
- marshal_l,marshal_ul,
- marshal_s,marshal_us,
- marshal_c,marshal_wc,
- marshal_str,
- marshal_any_3,marshal_any_2].
+all() ->
+ cases().
-init_all(Config) when is_list(Config) ->
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
+ [marshal_ll, marshal_ull, marshal_l, marshal_ul,
+ marshal_s, marshal_us, marshal_c, marshal_wc,
+ marshal_str, marshal_any_3, marshal_any_2].
+
+init_per_suite(Config) when is_list(Config) ->
case case code:priv_dir(jinterface) of
{error,bad_name} ->
false;
@@ -76,7 +86,7 @@ find_executable([E|T]) ->
Path -> Path
end.
-finish_all(Config) -> Config.
+end_per_suite(Config) -> Config.
@@ -98,7 +108,7 @@ init_per_testcase(_Case, Config) ->
WatchDog = test_server:timetrap(test_server:seconds(20)),
[{watchdog, WatchDog}| Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
DataDir = ?config(data_dir, Config),
code:del_path(DataDir),
WatchDog = ?config(watchdog, Config),
diff --git a/lib/ic/test/java_client_erl_server_SUITE_data/JavaClient.java b/lib/ic/test/java_client_erl_server_SUITE_data/JavaClient.java
index 1881279ac8..7da5a99c03 100644
--- a/lib/ic/test/java_client_erl_server_SUITE_data/JavaClient.java
+++ b/lib/ic/test/java_client_erl_server_SUITE_data/JavaClient.java
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2003-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2003-2011. 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
diff --git a/lib/ic/test/java_client_erl_server_SUITE_data/Makefile.src b/lib/ic/test/java_client_erl_server_SUITE_data/Makefile.src
index de1503401c..5e190fe1a5 100644
--- a/lib/ic/test/java_client_erl_server_SUITE_data/Makefile.src
+++ b/lib/ic/test/java_client_erl_server_SUITE_data/Makefile.src
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2003-2009. All Rights Reserved.
+# Copyright Ericsson AB 2003-2011. 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
diff --git a/lib/ic/test/java_client_erl_server_SUITE_data/m_i_impl.erl b/lib/ic/test/java_client_erl_server_SUITE_data/m_i_impl.erl
index 77e532288f..20959b549d 100644
--- a/lib/ic/test/java_client_erl_server_SUITE_data/m_i_impl.erl
+++ b/lib/ic/test/java_client_erl_server_SUITE_data/m_i_impl.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
diff --git a/lib/ic/vsn.mk b/lib/ic/vsn.mk
index 074d0b3d39..6d6c7fa625 100644
--- a/lib/ic/vsn.mk
+++ b/lib/ic/vsn.mk
@@ -1 +1 @@
-IC_VSN = 4.2.25
+IC_VSN = 4.2.26
diff --git a/lib/inets/doc/src/http_client.xml b/lib/inets/doc/src/http_client.xml
index 672ea3fa98..4542211d71 100644
--- a/lib/inets/doc/src/http_client.xml
+++ b/lib/inets/doc/src/http_client.xml
@@ -42,10 +42,10 @@
dynamically in runtime. Each client profile will spawn a new
process to handle each request unless there is a possibility to use
a persistent connection with or without pipelining.
- The client will add a host header and an empty
- te header if there are no such headers present in the request.</p>
+ The client will add a <c>host</c> header and an empty
+ <c>te</c> header if there are no such headers present in the request.</p>
- <p>The clients supports ipv6 as long as the underlying mechanisms also do
+ <p>The client supports ipv6 as long as the underlying mechanisms also do
so.</p>
</section>
@@ -87,7 +87,7 @@
httpc:request("http://www.erlang.org").
</code>
<p>An ordinary asynchronous request. The result will be sent
- to the calling process on the form {http, {ReqestId, Result}}</p>
+ to the calling process in the form <c>{http, {ReqestId, Result}}</c></p>
<code type="erl">
5 > {ok, RequestId} =
httpc:request(get, {"http://www.erlang.org", []}, [], [{sync, false}]).
diff --git a/lib/inets/doc/src/http_server.xml b/lib/inets/doc/src/http_server.xml
index 68dfd1add0..959386e471 100644
--- a/lib/inets/doc/src/http_server.xml
+++ b/lib/inets/doc/src/http_server.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="latin1" ?>
+<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE chapter SYSTEM "chapter.dtd">
<chapter>
@@ -63,9 +63,9 @@
technologies such as SOAP.</p>
<p>Allmost all server functionality has been implemented using an
- especially crafted server API, it is described in the Erlang Web
- Server API. This API can be used to advantage by all who wants
- to enhance the server core functionality, for example custom
+ especially crafted server API which is described in the Erlang Web
+ Server API. This API can be used to advantage by all who wish
+ to enhance the core server functionality, for example with custom
logging and authentication.</p>
<marker id="config"></marker>
@@ -472,7 +472,7 @@ http://your.server.org/eval?httpd_example:print(atom_to_list(apply(erlang,halt,[
<tag><em>bytes</em></tag>
<item>The content-length of the document transferred. </item>
</taglist>
- <p>Internal server errors are recorde in the error log file. The
+ <p>Internal server errors are recorded in the error log file. The
format of this file is a more ad hoc format than the logs using
Common Logfile Format, but conforms to the following syntax:
</p>
@@ -766,7 +766,7 @@ http://your.server.org/eval?httpd_example:print(atom_to_list(apply(erlang,halt,[
<code>
-module(mnesia_test).
-export([start/0,load_data/0]).
--include("mod_auth.hrl").
+-include_lib("mod_auth.hrl").
first_start() ->
mnesia:create_schema([node()]),
diff --git a/lib/inets/doc/src/httpc.xml b/lib/inets/doc/src/httpc.xml
index c20358178b..8f68087871 100644
--- a/lib/inets/doc/src/httpc.xml
+++ b/lib/inets/doc/src/httpc.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2004</year><year>2010</year>
+ <year>2004</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -36,7 +36,7 @@
<note>
<p>When starting the Inets application a manager process for the
default profile will be started. The functions in this API
- that does not explicitly use a profile will accesses the
+ that do not explicitly use a profile will access the
default profile. A profile keeps track of proxy options,
cookies and other options that can be applied to more than one
request. </p>
@@ -117,7 +117,7 @@ ssl_options() = {verify, code()} |
application or started dynamically in runtime by calling the
inets application API <c>inets:start(httpc, ServiceConfig)</c>, or
<c>inets:start(httpc, ServiceConfig, How)</c>
- see <seealso marker="inets">inets(3)</seealso> Below follows a
+ see <seealso marker="inets">inets(3)</seealso>. Below follows a
description of the available configuration options.</p>
<taglist>
<tag>{profile, profile()}</tag>
@@ -129,8 +129,8 @@ ssl_options() = {verify, code()} |
as session cookies.</item>
</taglist>
- <p>The client can be stopped using inets:stop(httpc, Pid) or
- inets:stop(httpc, Profile).</p>
+ <p>The client can be stopped using <c>inets:stop(httpc, Pid)</c> or
+ <c>inets:stop(httpc, Profile)</c>.</p>
<marker id="request1"></marker>
</section>
@@ -148,7 +148,7 @@ ssl_options() = {verify, code()} |
<v>Reason = term() </v>
</type>
<desc>
- <p>Equivalent to httpc:request(get, {Url, []}, [], []).</p>
+ <p>Equivalent to <c>httpc:request(get, {Url, []}, [], [])</c>.</p>
<marker id="request2"></marker>
</desc>
@@ -201,7 +201,7 @@ ssl_options() = {verify, code()} |
<desc>
<p>Sends a HTTP-request. The function can be both synchronous
and asynchronous. In the later case the function will return
- {ok, RequestId} and later on the information will be delivered
+ <c>{ok, RequestId}</c> and later on the information will be delivered
to the <c>receiver</c> depending on that value. </p>
<p>Http option (<c>http_option()</c>) details: </p>
@@ -209,7 +209,7 @@ ssl_options() = {verify, code()} |
<tag><c><![CDATA[timeout]]></c></tag>
<item>
<p>Timeout time for the request. </p>
- <p>The clock start ticking as soon as the request has been
+ <p>The clock starts ticking as soon as the request has been
sent. </p>
<p>Time is in milliseconds. </p>
<p>Defaults to <c>infinity</c>. </p>
@@ -246,11 +246,11 @@ ssl_options() = {verify, code()} |
<tag><c><![CDATA[autoredirect]]></c></tag>
<item>
- <p>Should the client automatically retreive the information
+ <p>Should the client automatically retrieve the information
from the new URI and return that as the result instead
of a 30X-result code. </p>
<p>Note that for some 30X-result codes automatic redirect
- is not allowed in these cases the 30X-result will always
+ is not allowed. In these cases the 30X-result will always
be returned. </p>
<p>Defaults to <c>true</c>. </p>
</item>
@@ -267,12 +267,12 @@ ssl_options() = {verify, code()} |
<c>HTTP/0.9</c> client. By default this is an <c>HTTP/1.1</c>
client. When using <c>HTTP/1.0</c> persistent connections will
not be used. </p>
- <p>Defaults to the trsing <c>"HTTP/1.1"</c>. </p>
+ <p>Defaults to the string <c>"HTTP/1.1"</c>. </p>
</item>
<tag><c><![CDATA[relaxed]]></c></tag>
<item>
- <p>If set to true workarounds for known server deviations from
+ <p>If set to <c>true</c> workarounds for known server deviations from
the HTTP-standard are enabled. </p>
<p>Defaults to <c>false</c>. </p>
</item>
@@ -296,21 +296,21 @@ ssl_options() = {verify, code()} |
<item>
<p>Streams the body of a 200 or 206 response to the calling
process or to a file. When streaming to the calling process
- using the option <c>self</c> the the following stream messages
- will be sent to that process: {http, {RequestId,
+ using the option <c>self</c> the following stream messages
+ will be sent to that process: <c>{http, {RequestId,
stream_start, Headers}, {http, {RequestId, stream,
- BinBodyPart}, {http, {RequestId, stream_end, Headers}. When
+ BinBodyPart}, {http, {RequestId, stream_end, Headers}</c>. When
streaming to to the calling processes using the option
<c>{self, once}</c> the first message will have an additional
- element e.i. {http, {RequestId, stream_start, Headers, Pid},
+ element e.i. <c>{http, {RequestId, stream_start, Headers, Pid}</c>,
this is the process id that should be used as an argument to
- http:stream_next/1 to trigger the next message to be sent to
+ <c>http:stream_next/1</c> to trigger the next message to be sent to
the calling process. </p>
<p>Note that it is possible that chunked encoding will add
- headers so that there are more headers in the stream_end
- message than in the stream_start.
+ headers so that there are more headers in the <c>stream_end</c>
+ message than in the <c>stream_start</c>.
When streaming to a file and the request is asynchronous the
- message {http, {RequestId, saved_to_file}} will be sent. </p>
+ message <c>{http, {RequestId, saved_to_file}}</c> will be sent. </p>
<p>Defaults to <c>none</c>. </p>
</item>
@@ -338,7 +338,7 @@ ssl_options() = {verify, code()} |
case insenstive. This feature should only be used if there is
no other way to communicate with the server or for testing
purpose. Also note that when this option is used no headers
- will be automatically added, all necessary headers has to be
+ will be automatically added, all necessary headers have to be
provided by the user. </p>
<p>Defaults to <c>false</c>. </p>
</item>
@@ -353,17 +353,17 @@ ssl_options() = {verify, code()} |
<p>Note that the validity of the options are <em>not</em>
checked in any way. </p>
<p>Note that this may change the socket behaviour
- (see <seealso marker="kernel:inet#setopts">inet:setopts/2</seealso>)
- for an already existing, and therefor already connected
+ (see <seealso marker="kernel:inet#setopts/2">inet:setopts/2</seealso>)
+ for an already existing one, and therefore an already connected
request handler. </p>
- <p>By defaults the socket options set by the
+ <p>By default the socket options set by the
<seealso marker="#set_options">set_options/1,2</seealso>
- function is used when establishing connection. </p>
+ function are used when establishing a connection. </p>
</item>
<tag><c><![CDATA[receiver]]></c></tag>
<item>
- <p>Defines how the client will deliver the result for a
+ <p>Defines how the client will deliver the result of an
asynchroneous request (<c>sync</c> has the value
<c>false</c>). </p>
@@ -395,7 +395,7 @@ apply(Module, Function, [ReplyInfo | Args])
</item>
</taglist>
- <p>In all cases above, <c>ReplyInfo</c> has the following
+ <p>In all of the above cases, <c>ReplyInfo</c> has the following
structure: </p>
<pre>
@@ -470,46 +470,46 @@ apply(Module, Function, [ReplyInfo | Args])
<v>IpDesc = string()</v>
<d>ex: "134.138" or "[FEDC:BA98" (all IP-addresses starting with 134.138 or FEDC:BA98), "66.35.250.150" or "[2010:836B:4179::836B:4179]" (a complete IP-address).</d>
<v>MaxSessions = integer() </v>
- <d>Default is <em>2</em>.
+ <d>Default is <c>2</c>.
Maximum number of persistent connections to a host.</d>
<v>MaxKeepAlive = integer() </v>
- <d>Default is <em>5</em>.
+ <d>Default is <c>5</c>.
Maximum number of outstanding requests on the same connection to
a host.</d>
<v>KeepAliveTimeout = integer() </v>
- <d>Default is <em>120000</em> (= 2 min).
+ <d>Default is <c>120000</c> (= 2 min).
If a persistent connection is idle longer than the
- keep_alive_timeout the client will close the connection.
- The server may also have a such a time out but you should
+ <c>keep_alive_timeout</c> the client will close the connection.
+ The server may also have such a time out but you should
not count on it!</d>
<v>MaxPipeline = integer() </v>
- <d>Default is <em>2</em>.
+ <d>Default is <c>2</c>.
Maximum number of outstanding requests on a pipelined connection to a host.</d>
<v>PipelineTimeout = integer() </v>
- <d>Default is <em>0</em>,
+ <d>Default is <c>0</c>,
which will result in pipelining not being used.
If a persistent connection is idle longer than the
- pipeline_timeout the client will close the connection. </d>
+ <c>pipeline_timeout</c> the client will close the connection. </d>
<v>CookieMode = enabled | disabled | verify </v>
- <d>Default is <em>disabled</em>.
+ <d>Default is <c>disabled</c>.
If Cookies are enabled all valid cookies will automatically be
saved in the client manager's cookie database.
- If the option verify is used the function http:verify_cookie/2
- has to be called for the cookie to be saved.</d>
+ If the option <c>verify</c> is used the function <c>store_cookies/2</c>
+ has to be called for the cookies to be saved.</d>
<v>IpFamily = inet | inet6 | inet6fb4 </v>
- <d>By default <em>inet</em>.
+ <d>By default <c>inet</c>.
When it is set to <c>inet6fb4</c> you can use both ipv4 and ipv6.
It first tries <c>inet6</c> and if that does not works falls back to <c>inet</c>.
The option is here to provide a workaround for buggy ipv6 stacks to ensure that
ipv4 will always work.</d>
<v>IpAddress = ip_address() </v>
<d>If the host has several network interfaces, this option specifies which one to use.
- See gen_tcp:connect/3,4 for more info. </d>
+ See <seealso marker="kernel:gen_tcp#connect">gen_tcp:connect/3,4</seealso> for more info. </d>
<v>Port = integer() </v>
<d>Specify which local port number to use.
- See gen_tcp:connect/3,4 for more info. </d>
+ See <seealso marker="kernel:gen_tcp#connect">gen_tcp:connect/3,4</seealso> for more info. </d>
<v>VerboseMode = false | verbose | debug | trace </v>
- <d>Default is <em>false</em>.
+ <d>Default is <c>false</c>.
This option is used to switch on (or off)
different levels of erlang trace on the client.
It is a debug feature.</d>
@@ -523,14 +523,14 @@ apply(Module, Function, [ReplyInfo | Args])
alive and use persistent connections
with or without pipeline depending on configuration
and current circumstances. The HTTP/1.1 specification does not
- provide a guideline for how many requests that would be
+ provide a guideline for how many requests would be
ideal to be sent on a persistent connection,
this very much depends on the
application. Note that a very long queue of requests may cause a
- user perceived delays as earlier request may take a long time
+ user perceived delay as earlier requests may take a long time
to complete. The HTTP/1.1 specification does suggest a
limit of 2 persistent connections per server, which is the
- default value of the max_sessions option. </p>
+ default value of the <c>max_sessions</c> option. </p>
</note>
<marker id="stream_next"></marker>
@@ -549,14 +549,14 @@ apply(Module, Function, [ReplyInfo | Args])
<p>Triggers the next message to be streamed, e.i.
same behavior as active once for sockets.</p>
- <marker id="verify_cookie"></marker>
- <marker id="store_cookie"></marker>
+ <marker id="verify_cookies"></marker>
+ <marker id="store_cookies"></marker>
</desc>
</func>
<func>
- <name>store_cookie(SetCookieHeaders, Url) -> </name>
- <name>store_cookie(SetCookieHeaders, Url, Profile) -> ok | {error, Reason}</name>
+ <name>store_cookies(SetCookieHeaders, Url) -> </name>
+ <name>store_cookies(SetCookieHeaders, Url, Profile) -> ok | {error, Reason}</name>
<fsummary>Saves the cookies defined in SetCookieHeaders in the client profile's cookie database.</fsummary>
<type>
<v>SetCookieHeaders = headers() - where field = "set-cookie"</v>
@@ -566,7 +566,7 @@ apply(Module, Function, [ReplyInfo | Args])
<desc>
<p>Saves the cookies defined in SetCookieHeaders
in the client profile's cookie database. You need to
- call this function if you set the option cookies to <c>verify</c>.
+ call this function if you have set the option <c>cookies</c> to <c>verify</c>.
If no profile is specified the default profile will be used.
</p>
@@ -576,16 +576,16 @@ apply(Module, Function, [ReplyInfo | Args])
<func>
<name>cookie_header(Url) -> </name>
- <name>cookie_header(Url, Profile) -> header() | {error, Rason}</name>
+ <name>cookie_header(Url, Profile) -> header() | {error, Reason}</name>
<fsummary>Returns the cookie header that would be sent when
- making a request to Url using the profile Profile.</fsummary>
+ making a request to Url using the profile <c>Profile</c>.</fsummary>
<type>
<v>Url = url()</v>
<v>Profile = profile()</v>
</type>
<desc>
<p>Returns the cookie header that would be sent
- when making a request to Url using the profile Profile.
+ when making a request to <c>Url</c> using the profile <c>Profile</c>.
If no profile is specified the default profile will be used.
</p>
@@ -602,7 +602,7 @@ apply(Module, Function, [ReplyInfo | Args])
<v>Profile = profile()</v>
</type>
<desc>
- <p>Resets (clears) the cookie database for the specified Profile.
+ <p>Resets (clears) the cookie database for the specified <c>Profile</c>.
If no profile is specified the default profile will be used.
</p>
</desc>
diff --git a/lib/inets/doc/src/httpd.xml b/lib/inets/doc/src/httpd.xml
index 62f4e18f82..6470b6fac7 100644
--- a/lib/inets/doc/src/httpd.xml
+++ b/lib/inets/doc/src/httpd.xml
@@ -525,12 +525,13 @@ bytes
scheme scripts. A matching URL is mapped into a specific module
and function. For example:
- <code>{erl_script_alias, {"/cgi-bin/example" [httpd_example]}
+ <code>{erl_script_alias, {"/cgi-bin/example", [httpd_example]}
</code>
and a request to
http://your.server.org/cgi-bin/example/httpd_example:yahoo
- would refer to httpd_example:yahoo/2 and
+ would refer to httpd_example:yahoo/3 or, if that did not exist,
+ httpd_example:yahoo/2 and
http://your.server.org/cgi-bin/example/other:yahoo would
not be allowed to execute.
</item>
diff --git a/lib/inets/doc/src/mod_auth.xml b/lib/inets/doc/src/mod_auth.xml
index 9503add2e0..42c49e9c35 100644
--- a/lib/inets/doc/src/mod_auth.xml
+++ b/lib/inets/doc/src/mod_auth.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1997</year><year>2009</year>
+ <year>1997</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
diff --git a/lib/inets/doc/src/mod_esi.xml b/lib/inets/doc/src/mod_esi.xml
index 3c473d3f94..e81308a502 100644
--- a/lib/inets/doc/src/mod_esi.xml
+++ b/lib/inets/doc/src/mod_esi.xml
@@ -78,24 +78,24 @@
</type>
<desc>
<p>The <c>Module</c> must be found in the code path and export
- <c>Function</c> with an arity of two. An erlScriptAlias must
+ <c>Function</c> with an arity of three. An erlScriptAlias must
also be set up in the configuration file for the Web server.</p>
- <p>If the HTTP request is a post request and a body is sent
+ <p>If the HTTP request is a 'post' request and a body is sent
then content_length will be the length of the posted
- data. If get is used query_string will be the data after
+ data. If 'get' is used query_string will be the data after
<em>?</em> in the url.</p>
<p>ParsedHeader is the HTTP request as a key value tuple
list. The keys in parsed header will be the in lower case.</p>
<p>SessionID is a identifier
- the server use when <c>deliver/2</c> is called, do not
- assume any-thing about the datatype.</p>
+ the server uses when <c>deliver/2</c> is called; do not
+ assume anything about the datatype.</p>
<p>Use this callback function to dynamically generate dynamic web
content. when a part of the page is generated send the
data back to the client through <c>deliver/2</c>. Note
that the first chunk of data sent to the client must at
least contain all HTTP header fields that the response
- will generate. If the first chunk not contains
- <em>End of HTTP header</em> that is <c>"\r\n\r\n"</c>
+ will generate. If the first chunk does not contain the
+ <em>End of HTTP the header</em>, that is <c>"\r\n\r\n",</c>
the server will
assume that no HTTP header fields will be generated.</p>
</desc>
@@ -106,11 +106,12 @@
<type>
<v>Env = [EnvironmentDirectives] ++ ParsedHeader</v>
<v>EnvironmentDirectives = {Key,Value}</v>
- <v>Key = query_string | content_length | server_software | gateway_interface | server_protocol | server_port | request_method | remote_addr | script_name. &lt;v>Input = string()</v>
+ <v>Key = query_string | content_length | server_software | gateway_interface | server_protocol | server_port | request_method | remote_addr | script_name.</v>
+ <v>Input = string()</v>
<v>Response = string()</v>
</type>
<desc>
- <p>This callback format consumes quite much memory since the
+ <p>This callback format consumes a lot of memory since the
whole response must be generated before it is sent to the
user. This functions is deprecated and only keept for backwards
compatibility.
diff --git a/lib/inets/doc/src/notes.xml b/lib/inets/doc/src/notes.xml
index 11b0af4310..5da9d98002 100644
--- a/lib/inets/doc/src/notes.xml
+++ b/lib/inets/doc/src/notes.xml
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="latin1" ?>
+<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE chapter SYSTEM "chapter.dtd">
<chapter>
<header>
<copyright>
- <year>2002</year><year>2010</year>
+ <year>2002</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -32,50 +32,78 @@
<file>notes.xml</file>
</header>
- <section><title>Inets 5.5.1</title>
+ <section><title>Inets 5.5.2</title>
- <section><title>Fixed Bugs and Malfunctions</title>
+ <section><title>Improvements and New Features</title>
+ <p>-</p>
+
+<!--
<list>
<item>
- <p> Fix format_man_pages so it handles all man sections
- and remove warnings/errors in various man pages. </p>
<p>
- Own Id: OTP-8600</p>
+ Miscellaneous inet6 related problems.</p>
+ <p>Own Id: OTP-8927</p>
</item>
+ </list>
+-->
+
+ </section>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
<item>
- <p>
- [httpc] Pipelined and queued requests not processed when
- connection closed remotelly.</p>
- <p>
- Own Id: OTP-8906</p>
+ <p>[httpd] httpd_response:send_chunk handles empty list and
+ empty binary - i.e. no chunk is sent, but it does
+ not handle a list with an empty binary [&lt;&lt;&gt;&gt;].
+ This will be sent as an empty chunk - which in turn
+ will be encoded by http_chunk to the same as a final
+ chunk, which will make the http client believe that
+ the end of the page is reached.</p>
+ <p>Own Id: OTP-8906</p>
</item>
</list>
</section>
+ </section> <!-- 5.5.2 -->
+
+
+ <section><title>Inets 5.5.1</title>
<section><title>Improvements and New Features</title>
<list>
<item>
- <p>
- Miscellaneous inet6 related problems.</p>
- <p>
- Own Id: OTP-8927</p>
+ <p>Miscellaneous inet6 related problems.</p>
+ <p>Own Id: OTP-8927</p>
</item>
<item>
- <p>
- Updated http-server to make sure URLs in error-messages
- are URL-encoded. Added support in http-client to use
- URL-encoding. Also added the missing include directory
- for the inets application.</p>
- <p>
- Own Id: OTP-8940 Aux Id: seq11735 </p>
+ <p>Updated http-server to make sure URLs in error-messages
+ are URL-encoded. Added support in http-client to use
+ URL-encoding. Also added the missing include directory
+ for the inets application.</p>
+ <p>Own Id: OTP-8940 Aux Id: seq11735 </p>
</item>
</list>
</section>
-</section>
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>Fix format_man_pages so it handles all man sections
+ and remove warnings/errors in various man pages. </p>
+ <p>Own Id: OTP-8600</p>
+ </item>
+ <item>
+ <p>[httpc] Pipelined and queued requests not processed when
+ connection closed remotelly.</p>
+ <p>Own Id: OTP-8906</p>
+ </item>
+ </list>
+ </section>
-<section><title>Inets 5.5</title>
+ </section> <!-- 5.5.1 -->
+
+
+ <section><title>Inets 5.5</title>
<section><title>Fixed Bugs and Malfunctions</title>
<list>
@@ -120,9 +148,10 @@
</list>
</section>
-</section>
+ </section> <!-- 5.5 -->
+
-<section><title>Inets 5.4</title>
+ <section><title>Inets 5.4</title>
<section><title>Improvements and New Features</title>
<!--
diff --git a/lib/inets/include/mod_auth.hrl b/lib/inets/include/mod_auth.hrl
new file mode 100644
index 0000000000..cf931e681a
--- /dev/null
+++ b/lib/inets/include/mod_auth.hrl
@@ -0,0 +1,33 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1998-2010. 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%
+%%
+%%
+
+-ifndef(mod_auth_hrl).
+-define(mod_auth_hrl, true).
+
+-record(httpd_user,
+ {username,
+ password,
+ user_data}).
+
+-record(httpd_group,
+ {name,
+ userlist}).
+
+-endif. % -ifdef(mod_auth_hrl).
diff --git a/lib/inets/src/http_client/httpc.erl b/lib/inets/src/http_client/httpc.erl
index ae754fab94..04fae13b20 100644
--- a/lib/inets/src/http_client/httpc.erl
+++ b/lib/inets/src/http_client/httpc.erl
@@ -252,7 +252,7 @@ set_option(Key, Value, Profile) ->
%% Description: Store the cookies from <SetCookieHeaders>
%% in the cookie database
%% for the profile <Profile>. This function shall be used when the option
-%% cookie is set to verify.
+%% cookies is set to verify.
%%-------------------------------------------------------------------------
store_cookies(SetCookieHeaders, Url) ->
store_cookies(SetCookieHeaders, Url, default_profile()).
diff --git a/lib/inets/src/http_lib/http_chunk.erl b/lib/inets/src/http_lib/http_chunk.erl
index 621bc68eae..57647438e9 100644
--- a/lib/inets/src/http_lib/http_chunk.erl
+++ b/lib/inets/src/http_lib/http_chunk.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -17,7 +17,8 @@
%% %CopyrightEnd%
%%
%% Description: Implements chunked transfer encoding see RFC2616 section
-%% 3.6.1
+%% 3.6.1
+
-module(http_chunk).
-include("http_internal.hrl").
@@ -28,6 +29,7 @@
%% little at a time on a socket.
-export([decode_size/1, ignore_extensions/1, decode_data/1, decode_trailer/1]).
+
%%%=========================================================================
%%% API
%%%=========================================================================
@@ -81,6 +83,9 @@ encode(Chunk) when is_binary(Chunk)->
HEXSize = list_to_binary(http_util:integer_to_hexlist(size(Chunk))),
<<HEXSize/binary, ?CR, ?LF, Chunk/binary, ?CR, ?LF>>;
+encode([<<>>]) ->
+ [];
+
encode(Chunk) when is_list(Chunk)->
HEXSize = http_util:integer_to_hexlist(erlang:iolist_size(Chunk)),
[HEXSize, ?CR, ?LF, Chunk, ?CR, ?LF].
@@ -88,6 +93,7 @@ encode(Chunk) when is_list(Chunk)->
encode_last() ->
<<$0, ?CR, ?LF, ?CR, ?LF >>.
+
%%-------------------------------------------------------------------------
%% handle_headers(HeaderRecord, ChunkedHeaders) -> NewHeaderRecord
%%
diff --git a/lib/inets/src/http_server/Makefile b/lib/inets/src/http_server/Makefile
index bdd8c5ee3c..55cc68dede 100644
--- a/lib/inets/src/http_server/Makefile
+++ b/lib/inets/src/http_server/Makefile
@@ -82,9 +82,7 @@ MODULES = \
mod_security \
mod_security_server
-INCLUDE = ../../include
-
-HRL_FILES = $(INCLUDE)/httpd.hrl httpd_internal.hrl mod_auth.hrl
+HRL_FILES = httpd.hrl httpd_internal.hrl mod_auth.hrl
ERL_FILES = $(MODULES:%=%.erl)
@@ -100,7 +98,6 @@ include ../inets_app/inets.mk
ERL_COMPILE_FLAGS += \
$(INETS_FLAGS) \
$(INETS_ERL_COMPILE_FLAGS) \
- -I$(INCLUDE) \
-I../inets_app \
-I../http_lib \
diff --git a/lib/inets/src/http_server/httpd.hrl b/lib/inets/src/http_server/httpd.hrl
new file mode 100644
index 0000000000..4eba833e2c
--- /dev/null
+++ b/lib/inets/src/http_server/httpd.hrl
@@ -0,0 +1,27 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2010. 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%
+%%
+%% This is a simple wrapper for code that has not been updated to
+%% handle the move of this file to the include dir.
+
+-ifndef(src_httpd_hrl).
+-define(src_httpd_hrl, true).
+
+-include_lib("inets/include/httpd.hrl").
+
+-endif. % -ifdef(src_httpd_hrl).
diff --git a/lib/inets/src/http_server/mod_auth.hrl b/lib/inets/src/http_server/mod_auth.hrl
index 9b316cecc4..674e6d1652 100644
--- a/lib/inets/src/http_server/mod_auth.hrl
+++ b/lib/inets/src/http_server/mod_auth.hrl
@@ -1,29 +1,27 @@
%%
%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
-%%
+%%
+%% Copyright Ericsson AB 1997-2010. 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%
%%
+%% %CopyrightEnd%
%%
+%% This is a simple wrapper for code that has not been updated to
+%% handle the move of this file to the include dir.
+
+-ifndef(src_mod_auth_hrl).
+-define(src_mod_auth_hrl, true).
--record(httpd_user,
- {username,
- password,
- user_data}).
+-include_lib("inets/include/mod_auth.hrl").
--record(httpd_group,
- {name,
- userlist}).
-
+-endif. % -ifdef(src_mod_auth_hrl).
diff --git a/lib/inets/src/inets_app/Makefile b/lib/inets/src/inets_app/Makefile
index 4632ff3b68..20e22917e2 100644
--- a/lib/inets/src/inets_app/Makefile
+++ b/lib/inets/src/inets_app/Makefile
@@ -47,7 +47,9 @@ MODULES = \
inets_sup \
inets_regexp
-HRL_FILES = inets_internal.hrl
+INTERNAL_HRL_FILES = inets_internal.hrl
+EXTERNAL_HRL_FILES = ../../include/httpd.hrl \
+ ../../include/mod_auth.hrl
ERL_FILES = $(MODULES:%=%.erl)
@@ -74,8 +76,7 @@ include inets.mk
ERL_COMPILE_FLAGS += \
$(INETS_FLAGS) \
- $(INETS_ERL_COMPILE_FLAGS) \
- -I../../include
+ $(INETS_ERL_COMPILE_FLAGS)
# ----------------------------------------------------
@@ -110,7 +111,9 @@ include $(ERL_TOP)/make/otp_release_targets.mk
release_spec: opt
$(INSTALL_DIR) $(RELSYSDIR)/src
$(INSTALL_DIR) $(RELSYSDIR)/src/inets_app
- $(INSTALL_DATA) $(HRL_FILES) $(ERL_FILES) $(RELSYSDIR)/src/inets_app
+ $(INSTALL_DATA) $(INTERNAL_HRL_FILES) $(ERL_FILES) $(RELSYSDIR)/src/inets_app
+ $(INSTALL_DIR) $(RELSYSDIR)/include
+ $(INSTALL_DATA) $(EXTERNAL_HRL_FILES) $(RELSYSDIR)/include
$(INSTALL_DIR) $(RELSYSDIR)/ebin
$(INSTALL_DATA) $(TARGET_FILES) $(RELSYSDIR)/ebin
diff --git a/lib/inets/src/inets_app/inets.appup.src b/lib/inets/src/inets_app/inets.appup.src
index 0194c65db9..07da8ca961 100644
--- a/lib/inets/src/inets_app/inets.appup.src
+++ b/lib/inets/src/inets_app/inets.appup.src
@@ -1,7 +1,7 @@
%% This is an -*- erlang -*- file.
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -18,6 +18,11 @@
{"%VSN%",
[
+ {"5.5.1",
+ [
+ {load_module, http_chunk, soft_purge, soft_purge, []}
+ ]
+ },
{"5.5",
[
{restart_application, inets}
@@ -30,7 +35,12 @@
}
],
[
- {"5.4",
+ {"5.5.1",
+ [
+ {load_module, http_chunk, soft_purge, soft_purge, []}
+ ]
+ },
+ {"5.5",
[
{restart_application, inets}
]
diff --git a/lib/inets/test/Makefile b/lib/inets/test/Makefile
index 0492d33eab..87ca60e4b3 100644
--- a/lib/inets/test/Makefile
+++ b/lib/inets/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2010. All Rights Reserved.
+# Copyright Ericsson AB 1997-2011. 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
@@ -200,7 +200,8 @@ SOURCE = $(ERL_FILES) $(HRL_FILES)
TARGET_FILES = $(MODULES:%=$(EBIN)/%.$(EMULATOR))
-INETS_SPECS = inets.spec inets.spec.vxworks
+INETS_SPECS = inets.spec
+COVER_FILE = inets.cover
INETS_FILES = inets.config $(INETS_SPECS)
# SUB_SUITES = \
@@ -222,10 +223,10 @@ MAKE_EMAKE = $(wildcard $(ERL_TOP)/make/make_emakefile)
ifeq ($(MAKE_EMAKE),)
BUILDTARGET = $(TARGET_FILES)
-RELTEST_FILES = $(INETS_SPECS) $(SOURCE)
+RELTEST_FILES = $(COVER_FILE) $(INETS_SPECS) $(SOURCE)
else
BUILDTARGET = emakebuild
-RELTEST_FILES = $(EMAKEFILE) $(INETS_SPECS) $(SOURCE)
+RELTEST_FILES = $(EMAKEFILE) $(COVER_FILE) $(INETS_SPECS) $(SOURCE)
endif
@@ -307,11 +308,11 @@ release_spec: opt
release_tests_spec: opt
$(INSTALL_DIR) $(RELTESTSYSDIR)
$(INSTALL_DATA) $(RELTEST_FILES) $(RELTESTSYSDIR)
- chmod -f -R u+w $(RELTESTSYSDIR)
+ chmod -R u+w $(RELTESTSYSDIR)
tar chf - $(DATADIRS) | (cd $(RELTESTSYSDIR); tar xf -)
$(INSTALL_DIR) $(RELTESTSYSALLDATADIR)
$(INSTALL_DIR) $(RELTESTSYSBINDIR)
- chmod -f -R +x $(RELTESTSYSBINDIR)
+ chmod -R +x $(RELTESTSYSBINDIR)
$(INSTALL_DIR) $(RELTESTSYSALLDATADIR)/win32/lib
release_docs_spec:
diff --git a/lib/inets/test/ftp_SUITE.erl b/lib/inets/test/ftp_SUITE.erl
index e7404f945b..4bafdbfef8 100644
--- a/lib/inets/test/ftp_SUITE.erl
+++ b/lib/inets/test/ftp_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -20,29 +20,14 @@
-module(ftp_SUITE).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include("test_server_line.hrl").
%% Test server specific exports
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]).
% -export([init_per_testcase/2, end_per_testcase/2]).
-export([init_per_suite/1, end_per_suite/1]).
-%% Test cases must be exported.
--export([solaris8_test/1,
- solaris9_test/1,
- solaris10_test/1,
- linux_x86_test/1,
- linux_ppc_test/1,
- macosx_x86_test/1,
- macosx_ppc_test/1,
- openbsd_test/1,
- freebsd_test/1,
- netbsd_test/1,
- windows_xp_test/1,
- windows_2003_server_test/1,
- ticket_tests/1]).
-
-define(FTP_USER, "anonymous").
-define(FTP_PASS, passwd()).
-define(FTP_PORT, 21).
@@ -72,52 +57,44 @@
%% Description: Returns documentation/test cases in this test suite
%% or a skip tuple if the platform is not supported.
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test the ftp client in the inets application."];
-all(suite) ->
- [
- solaris8_test,
- solaris9_test,
- solaris10_test,
- linux_x86_test,
- linux_ppc_test,
- macosx_x86_test,
- macosx_ppc_test,
- openbsd_test,
- freebsd_test,
- netbsd_test,
- windows_xp_test,
- windows_2003_server_test,
- ticket_tests
- ].
-
-solaris8_test(suite) ->
- [{ftp_solaris8_sparc_test,all}].
-solaris9_test(suite) ->
- [{ftp_solaris9_sparc_test,all}].
-solaris10_test(suite) ->
- [{ftp_solaris10_sparc_test,all}, {ftp_solaris10_x86_test,all}].
-linux_x86_test(suite) ->
- [{ftp_linux_x86_test,all}].
-linux_ppc_test(suite) ->
- [{ftp_linux_ppc_test,all}].
-macosx_x86_test(suite) ->
- [{ftp_macosx_x86_test,all}].
-macosx_ppc_test(suite) ->
- [{ftp_macosx_ppc_test,all}].
-openbsd_test(suite) ->
- [{ftp_openbsd_x86_test,all}].
-freebsd_test(suite) ->
- [{ftp_freebsd_x86_test,all}].
-netbsd_test(suite) ->
- [{ftp_netbsd_x86_test,all}].
-windows_xp_test(suite) ->
- [{ftp_windows_xp_test,all}].
-windows_2003_server_test(suite) ->
- [{ftp_windows_2003_server_test,all}].
-
-ticket_tests(suite) ->
- [{ftp_ticket_test, all}].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, solaris8_test}, {group, solaris9_test},
+ {group, solaris10_test}, {group, linux_x86_test},
+ {group, linux_ppc_test}, {group, macosx_x86_test},
+ {group, macosx_ppc_test}, {group, openbsd_test},
+ {group, freebsd_test}, {group, netbsd_test},
+ {group, windows_xp_test},
+ {group, windows_2003_server_test},
+ {group, ticket_tests}].
+
+groups() ->
+ [{solaris8_test, [], [{ftp_solaris8_sparc_test, all}]},
+ {solaris9_test, [], [{ftp_solaris9_sparc_test, all}]},
+ {solaris10_test, [],
+ [{ftp_solaris10_sparc_test, all},
+ {ftp_solaris10_x86_test, all}]},
+ {linux_x86_test, [], [{ftp_linux_x86_test, all}]},
+ {linux_ppc_test, [], [{ftp_linux_ppc_test, all}]},
+ {macosx_x86_test, [], [{ftp_macosx_x86_test, all}]},
+ {macosx_ppc_test, [], [{ftp_macosx_ppc_test, all}]},
+ {openbsd_test, [], [{ftp_openbsd_x86_test, all}]},
+ {freebsd_test, [], [{ftp_freebsd_x86_test, all}]},
+ {netbsd_test, [], [{ftp_netbsd_x86_test, all}]},
+ {windows_xp_test, [], [{ftp_windows_xp_test, all}]},
+ {windows_2003_server_test, [],
+ [{ftp_windows_2003_server_test, all}]},
+ {ticket_tests, [], [{ftp_ticket_test, all}]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+
%%--------------------------------------------------------------------
%% Function: init_per_suite(Config) -> Config
diff --git a/lib/inets/test/ftp_format_SUITE.erl b/lib/inets/test/ftp_format_SUITE.erl
index 9ca6575b2d..cbc1b04bbb 100644
--- a/lib/inets/test/ftp_format_SUITE.erl
+++ b/lib/inets/test/ftp_format_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -20,23 +20,44 @@
-module(ftp_format_SUITE).
-author('[email protected]').
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include("test_server_line.hrl").
-include("ftp_internal.hrl").
%% Test server specific exports
--export([all/1, init_per_testcase/2, end_per_testcase/2]).
+-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]).
%% Test cases must be exported.
--export([ftp_response/1, ftp_150/1,
- ftp_200/1, ftp_220/1, ftp_226/1, ftp_257/1, ftp_331/1, ftp_425/1,
- ftp_other_status_codes/1, ftp_multiple_lines/1,
- ftp_multipel_ctrl_messages/1, format_error/1]).
+-export([ ftp_150/1,
+ ftp_200/1, ftp_220/1, ftp_226/1, ftp_257/1, ftp_331/1, ftp_425/1,
+ ftp_other_status_codes/1, ftp_multiple_lines/1,
+ ftp_multipel_ctrl_messages/1, format_error/1]).
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, ftp_response}, format_error].
+
+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]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(doc) ->
- ["Test library functions for the ftp client."];
-all(suite) ->
- [ftp_response, format_error].
init_per_testcase(_, Config) ->
Dog = test_server:timetrap(?t:minutes(1)),
@@ -51,14 +72,6 @@ end_per_testcase(_, Config) ->
%%-------------------------------------------------------------------------
%% Test cases starts here.
%%-------------------------------------------------------------------------
-ftp_response(doc) ->
- ["Test ftp_response:parse_lines/3 and ftp_response:interpret/1."
- " This test case will simulate that the "
- "message will be recived a little at the time on a socket and the "
- "package may be broken up into smaller parts at arbitrary point."];
-ftp_response(suite) ->
- [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_150(doc) ->
["Especially check that respons can be devided in a random place."];
diff --git a/lib/inets/test/ftp_freebsd_x86_test.erl b/lib/inets/test/ftp_freebsd_x86_test.erl
index 457e18ffbe..1d66779882 100644
--- a/lib/inets/test/ftp_freebsd_x86_test.erl
+++ b/lib/inets/test/ftp_freebsd_x86_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
@@ -22,7 +22,7 @@
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-define(LIB_MOD,ftp_suite_lib).
-define(CASE_WRAPPER(_A_,_B_,_C_),?LIB_MOD:wrapper(_A_,_B_,_C_)).
@@ -86,23 +86,30 @@ end_per_testcase(Case, Config) ->
%% Name of a test case.
%% Description: Returns a list of all test cases in this test suite
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test ftp client"];
+all() ->
+ [open, open_port, {group, passive}, {group, active},
+ api_missuse, not_owner, {group, progress_report}].
+
+groups() ->
+ [{passive, [], ftp_suite_lib:passive(suite)},
+ {active, [], ftp_suite_lib:active(suite)},
+ {progress_report, [],
+ ftp_suite_lib:progress_report(suite)}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [open, open_port, passive, active, api_missuse,
- not_owner, progress_report].
%% Test cases starts here.
%%--------------------------------------------------------------------
open(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open/1).
open_port(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open_port/1).
-passive(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:passive/1).
-active(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:active/1).
api_missuse(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:api_missuse/1).
not_owner(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:not_owner/1).
-progress_report(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:progress_report/1).
passive_user(X) -> ?LIB_MOD:passive_user(X).
passive_pwd(X) -> ?LIB_MOD:passive_pwd(X).
diff --git a/lib/inets/test/ftp_linux_ppc_test.erl b/lib/inets/test/ftp_linux_ppc_test.erl
index ad38137678..bba97237f1 100644
--- a/lib/inets/test/ftp_linux_ppc_test.erl
+++ b/lib/inets/test/ftp_linux_ppc_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
@@ -23,7 +23,7 @@
%% Note: This directive should only be used in test suites.
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-define(LIB_MOD,ftp_suite_lib).
-define(CASE_WRAPPER(_A_,_B_,_C_),?LIB_MOD:wrapper(_A_,_B_,_C_)).
@@ -87,23 +87,30 @@ end_per_testcase(Case, Config) ->
%% Name of a test case.
%% Description: Returns a list of all test cases in this test suite
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test ftp client"];
+all() ->
+ [open, open_port, {group, passive}, {group, active},
+ api_missuse, not_owner, {group, progress_report}].
+
+groups() ->
+ [{passive, [], ftp_suite_lib:passive(suite)},
+ {active, [], ftp_suite_lib:active(suite)},
+ {progress_report, [],
+ ftp_suite_lib:progress_report(suite)}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [open, open_port, passive, active, api_missuse,
- not_owner, progress_report].
%% Test cases starts here.
%%--------------------------------------------------------------------
open(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open/1).
open_port(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open_port/1).
-passive(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:passive/1).
-active(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:active/1).
api_missuse(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:api_missuse/1).
not_owner(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:not_owner/1).
-progress_report(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:progress_report/1).
passive_user(X) -> ?LIB_MOD:passive_user(X).
passive_pwd(X) -> ?LIB_MOD:passive_pwd(X).
diff --git a/lib/inets/test/ftp_linux_x86_test.erl b/lib/inets/test/ftp_linux_x86_test.erl
index b9c88d121a..bbefd8231e 100644
--- a/lib/inets/test/ftp_linux_x86_test.erl
+++ b/lib/inets/test/ftp_linux_x86_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
@@ -22,7 +22,7 @@
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-define(LIB_MOD,ftp_suite_lib).
-define(CASE_WRAPPER(_A_,_B_,_C_),?LIB_MOD:wrapper(_A_,_B_,_C_)).
@@ -86,30 +86,30 @@ end_per_testcase(Case, Config) ->
%% Name of a test case.
%% Description: Returns a list of all test cases in this test suite
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test ftp client"];
-
-all(suite) ->
- [
- open,
- open_port,
- passive,
- active,
- api_missuse,
- not_owner,
- progress_report
- ].
+all() ->
+ [open, open_port, {group, passive}, {group, active},
+ api_missuse, not_owner, {group, progress_report}].
+
+groups() ->
+ [{passive, [], ftp_suite_lib:passive(suite)},
+ {active, [], ftp_suite_lib:active(suite)},
+ {progress_report, [],
+ ftp_suite_lib:progress_report(suite)}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% Test cases starts here.
%%--------------------------------------------------------------------
open(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open/1).
open_port(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open_port/1).
-passive(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:passive/1).
-active(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:active/1).
api_missuse(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:api_missuse/1).
not_owner(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:not_owner/1).
-progress_report(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:progress_report/1).
passive_user(X) -> ?LIB_MOD:passive_user(X).
passive_pwd(X) -> ?LIB_MOD:passive_pwd(X).
diff --git a/lib/inets/test/ftp_macosx_ppc_test.erl b/lib/inets/test/ftp_macosx_ppc_test.erl
index cf548a73c0..c9f33b8beb 100644
--- a/lib/inets/test/ftp_macosx_ppc_test.erl
+++ b/lib/inets/test/ftp_macosx_ppc_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
@@ -22,7 +22,7 @@
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-define(LIB_MOD,ftp_suite_lib).
-define(CASE_WRAPPER(_A_,_B_,_C_),?LIB_MOD:wrapper(_A_,_B_,_C_)).
@@ -87,21 +87,28 @@ end_per_testcase(Case, Config) ->
%% Name of a test case.
%% Description: Returns a list of all test cases in this test suite
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test ftp client"];
+all() ->
+[open, open_port, {group, passive}, {group, active},
+ api_missuse, not_owner, {group, progress_report}].
+
+groups() ->
+ [{passive, [], ftp_suite_lib:passive(suite)},
+ {active, [], ftp_suite_lib:active(suite)},
+ {progress_report, [],
+ ftp_suite_lib:progress_report(suite)}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [open, open_port, passive, active, api_missuse,
- not_owner, progress_report].
open(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open/1).
open_port(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open_port/1).
-passive(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:passive/1).
-active(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:active/1).
api_missuse(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:api_missuse/1).
not_owner(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:not_owner/1).
-progress_report(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:progress_report/1).
passive_user(X) -> ?LIB_MOD:passive_user(X).
passive_pwd(X) -> ?LIB_MOD:passive_pwd(X).
diff --git a/lib/inets/test/ftp_macosx_x86_test.erl b/lib/inets/test/ftp_macosx_x86_test.erl
index 5566d4feaa..17b7160b95 100644
--- a/lib/inets/test/ftp_macosx_x86_test.erl
+++ b/lib/inets/test/ftp_macosx_x86_test.erl
@@ -22,7 +22,7 @@
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-define(LIB_MOD,ftp_suite_lib).
-define(CASE_WRAPPER(_A_,_B_,_C_),?LIB_MOD:wrapper(_A_,_B_,_C_)).
@@ -86,22 +86,29 @@ end_per_testcase(Case, Config) ->
%% Name of a test case.
%% Description: Returns a list of all test cases in this test suite
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test ftp client"];
+all() ->
+[open, open_port, {group, passive}, {group, active},
+ api_missuse, not_owner, {group, progress_report}].
+
+groups() ->
+ [{passive, [], ftp_suite_lib:passive(suite)},
+ {active, [], ftp_suite_lib:active(suite)},
+ {progress_report, [],
+ ftp_suite_lib:progress_report(suite)}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [open, open_port, passive, active, api_missuse,
- not_owner, progress_report].
%% Test cases starts here.
%%--------------------------------------------------------------------
open(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open/1).
open_port(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open_port/1).
-passive(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:passive/1).
-active(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:active/1).
api_missuse(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:api_missuse/1).
not_owner(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:not_owner/1).
-progress_report(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:progress_report/1).
passive_user(X) -> ?LIB_MOD:passive_user(X).
passive_pwd(X) -> ?LIB_MOD:passive_pwd(X).
diff --git a/lib/inets/test/ftp_netbsd_x86_test.erl b/lib/inets/test/ftp_netbsd_x86_test.erl
index a5711b7bde..bb474852c5 100644
--- a/lib/inets/test/ftp_netbsd_x86_test.erl
+++ b/lib/inets/test/ftp_netbsd_x86_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
@@ -22,7 +22,7 @@
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-define(LIB_MOD,ftp_suite_lib).
-define(CASE_WRAPPER(_A_,_B_,_C_),?LIB_MOD:wrapper(_A_,_B_,_C_)).
@@ -86,22 +86,29 @@ end_per_testcase(Case, Config) ->
%% Name of a test case.
%% Description: Returns a list of all test cases in this test suite
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test ftp client"];
+all() ->
+ [open, open_port, {group, passive}, {group, active},
+ api_missuse, not_owner, {group, progress_report}].
+
+groups() ->
+ [{passive, [], ftp_suite_lib:passive(suite)},
+ {active, [], ftp_suite_lib:active(suite)},
+ {progress_report, [],
+ ftp_suite_lib:progress_report(suite)}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [open, open_port, passive, active, api_missuse,
- not_owner, progress_report].
%% Test cases starts here.
%%--------------------------------------------------------------------
open(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open/1).
open_port(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open_port/1).
-passive(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:passive/1).
-active(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:active/1).
api_missuse(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:api_missuse/1).
not_owner(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:not_owner/1).
-progress_report(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:progress_report/1).
passive_user(X) -> ?LIB_MOD:passive_user(X).
passive_pwd(X) -> ?LIB_MOD:passive_pwd(X).
diff --git a/lib/inets/test/ftp_openbsd_x86_test.erl b/lib/inets/test/ftp_openbsd_x86_test.erl
index 4833b6332b..54fce702a0 100644
--- a/lib/inets/test/ftp_openbsd_x86_test.erl
+++ b/lib/inets/test/ftp_openbsd_x86_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
@@ -23,7 +23,7 @@
%% Note: This directive should only be used in test suites.
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-define(LIB_MOD,ftp_suite_lib).
-define(CASE_WRAPPER(_A_,_B_,_C_),?LIB_MOD:wrapper(_A_,_B_,_C_)).
@@ -87,23 +87,30 @@ end_per_testcase(Case, Config) ->
%% Name of a test case.
%% Description: Returns a list of all test cases in this test suite
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test ftp client"];
+all() ->
+ [open, open_port, {group, passive}, {group, active},
+ api_missuse, not_owner, {group, progress_report}].
+
+groups() ->
+ [{passive, [], ftp_suite_lib:passive(suite)},
+ {active, [], ftp_suite_lib:active(suite)},
+ {progress_report, [],
+ ftp_suite_lib:progress_report(suite)}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [open, open_port, passive, active, api_missuse,
- not_owner, progress_report].
%% Test cases starts here.
%%--------------------------------------------------------------------
open(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open/1).
open_port(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open_port/1).
-passive(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:passive/1).
-active(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:active/1).
api_missuse(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:api_missuse/1).
not_owner(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:not_owner/1).
-progress_report(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:progress_report/1).
passive_user(X) -> ?LIB_MOD:passive_user(X).
passive_pwd(X) -> ?LIB_MOD:passive_pwd(X).
diff --git a/lib/inets/test/ftp_solaris10_sparc_test.erl b/lib/inets/test/ftp_solaris10_sparc_test.erl
index 6066195f9b..0da50dc91b 100644
--- a/lib/inets/test/ftp_solaris10_sparc_test.erl
+++ b/lib/inets/test/ftp_solaris10_sparc_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
@@ -22,7 +22,7 @@
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-define(LIB_MOD,ftp_suite_lib).
-define(CASE_WRAPPER(_A_,_B_,_C_),?LIB_MOD:wrapper(_A_,_B_,_C_)).
@@ -87,23 +87,30 @@ end_per_testcase(Case, Config) ->
%% Name of a test case.
%% Description: Returns a list of all test cases in this test suite
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test ftp client"];
+all() ->
+ [open, open_port, {group, passive}, {group, active},
+ api_missuse, not_owner, {group, progress_report}].
+
+groups() ->
+ [{passive, [], ftp_suite_lib:passive(suite)},
+ {active, [], ftp_suite_lib:active(suite)},
+ {progress_report, [],
+ ftp_suite_lib:progress_report(suite)}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [open, open_port, passive, active, api_missuse,
- not_owner, progress_report].
%% Test cases starts here.
%%--------------------------------------------------------------------
open(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open/1).
open_port(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open_port/1).
-passive(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:passive/1).
-active(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:active/1).
api_missuse(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:api_missuse/1).
not_owner(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:not_owner/1).
-progress_report(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:progress_report/1).
passive_user(X) -> ?LIB_MOD:passive_user(X).
passive_pwd(X) -> ?LIB_MOD:passive_pwd(X).
diff --git a/lib/inets/test/ftp_solaris10_x86_test.erl b/lib/inets/test/ftp_solaris10_x86_test.erl
index 3bd99fc3f2..3e7045bb4d 100644
--- a/lib/inets/test/ftp_solaris10_x86_test.erl
+++ b/lib/inets/test/ftp_solaris10_x86_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009. All Rights Reserved.
+%% Copyright Ericsson AB 2010. 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
@@ -22,7 +22,7 @@
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-define(LIB_MOD, ftp_suite_lib).
-define(CASE_WRAPPER(_A_,_B_,_C_), ?LIB_MOD:wrapper(_A_,_B_,_C_)).
@@ -88,23 +88,30 @@ end_per_testcase(Case, Config) ->
%% Name of a test case.
%% Description: Returns a list of all test cases in this test suite
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test ftp client"];
+all() ->
+ [open, open_port, {group, passive}, {group, active},
+ api_missuse, not_owner, {group, progress_report}].
+
+groups() ->
+ [{passive, [], ftp_suite_lib:passive(suite)},
+ {active, [], ftp_suite_lib:active(suite)},
+ {progress_report, [],
+ ftp_suite_lib:progress_report(suite)}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [open, open_port, passive, active, api_missuse,
- not_owner, progress_report].
%% Test cases starts here.
%%--------------------------------------------------------------------
open(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open/1).
open_port(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open_port/1).
-passive(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:passive/1).
-active(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:active/1).
api_missuse(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:api_missuse/1).
not_owner(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:not_owner/1).
-progress_report(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:progress_report/1).
passive_user(X) -> ?LIB_MOD:passive_user(X).
passive_pwd(X) -> ?LIB_MOD:passive_pwd(X).
diff --git a/lib/inets/test/ftp_solaris8_sparc_test.erl b/lib/inets/test/ftp_solaris8_sparc_test.erl
index 9764071cd9..23dbfc8fe3 100644
--- a/lib/inets/test/ftp_solaris8_sparc_test.erl
+++ b/lib/inets/test/ftp_solaris8_sparc_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
@@ -22,7 +22,7 @@
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-define(LIB_MOD,ftp_suite_lib).
-define(CASE_WRAPPER(_A_,_B_,_C_),?LIB_MOD:wrapper(_A_,_B_,_C_)).
@@ -86,22 +86,29 @@ end_per_testcase(Case, Config) ->
%% Name of a test case.
%% Description: Returns a list of all test cases in this test suite
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test ftp client"];
+all() ->
+ [open, open_port, {group, passive}, {group, active},
+ api_missuse, not_owner, {group, progress_report}].
+
+groups() ->
+ [{passive, [], ftp_suite_lib:passive(suite)},
+ {active, [], ftp_suite_lib:active(suite)},
+ {progress_report, [],
+ ftp_suite_lib:progress_report(suite)}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [open, open_port, passive, active, api_missuse,
- not_owner, progress_report].
%% Test cases starts here.
open(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open/1).
open_port(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open_port/1).
-passive(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:passive/1).
-active(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:active/1).
api_missuse(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:api_missuse/1).
not_owner(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:not_owner/1).
-progress_report(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:progress_report/1).
passive_user(X) -> ?LIB_MOD:passive_user(X).
passive_pwd(X) -> ?LIB_MOD:passive_pwd(X).
diff --git a/lib/inets/test/ftp_solaris9_sparc_test.erl b/lib/inets/test/ftp_solaris9_sparc_test.erl
index a9f77bbdac..896e2f497f 100644
--- a/lib/inets/test/ftp_solaris9_sparc_test.erl
+++ b/lib/inets/test/ftp_solaris9_sparc_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
@@ -22,7 +22,7 @@
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-define(LIB_MOD,ftp_suite_lib).
-define(CASE_WRAPPER(_A_,_B_,_C_),?LIB_MOD:wrapper(_A_,_B_,_C_)).
@@ -85,22 +85,29 @@ end_per_testcase(Case, Config) ->
%% Name of a test case.
%% Description: Returns a list of all test cases in this test suite
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test ftp client"];
+all() ->
+ [open, open_port, {group, passive}, {group, active},
+ api_missuse, not_owner, {group, progress_report}].
+
+groups() ->
+ [{passive, [], ftp_suite_lib:passive(suite)},
+ {active, [], ftp_suite_lib:active(suite)},
+ {progress_report, [],
+ ftp_suite_lib:progress_report(suite)}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [open, open_port, passive, active, api_missuse,
- not_owner, progress_report].
%% Test cases starts here.
open(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open/1).
open_port(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open_port/1).
-passive(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:passive/1).
-active(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:active/1).
api_missuse(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:api_missuse/1).
not_owner(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:not_owner/1).
-progress_report(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:progress_report/1).
passive_user(X) -> ?LIB_MOD:passive_user(X).
passive_pwd(X) -> ?LIB_MOD:passive_pwd(X).
diff --git a/lib/inets/test/ftp_suite_lib.erl b/lib/inets/test/ftp_suite_lib.erl
index c539b7c17c..d0d07a8358 100644
--- a/lib/inets/test/ftp_suite_lib.erl
+++ b/lib/inets/test/ftp_suite_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -21,8 +21,8 @@
-module(ftp_suite_lib).
--include("test_server.hrl").
--include("test_server_line.hrl").
+-include_lib("test_server/include/test_server.hrl").
+-include_lib("test_server/include/test_server_line.hrl").
-include("inets_test_lib.hrl").
%% Test server specific exports
@@ -74,7 +74,7 @@ tickets(suite) ->
ftpd_init(FtpdTag, Config) ->
%% Get the host name(s) of FTP server
Hosts =
- case ?config(ftpd_hosts, Config) of
+ case ct:get_config(ftpd_hosts) of
undefined ->
ftpd_hosts(data_dir(Config));
H ->
@@ -129,7 +129,7 @@ get_ftpd_host([Host|Hosts]) ->
dirty_select_ftpd_host(Config) ->
Hosts =
- case ?config(ftpd_hosts, Config) of
+ case ct:get_config(ftpd_hosts) of
undefined ->
ftpd_hosts(data_dir(Config));
H ->
diff --git a/lib/inets/test/ftp_ticket_test.erl b/lib/inets/test/ftp_ticket_test.erl
index 6748df03bb..fe4ab35728 100644
--- a/lib/inets/test/ftp_ticket_test.erl
+++ b/lib/inets/test/ftp_ticket_test.erl
@@ -35,17 +35,27 @@ end_per_testcase(Case, Config) ->
ftp_suite_lib:end_per_testcase(Case, Config).
-all(suite) ->
- {conf,init,tickets(),fin}.
+all() ->
+ tickets().
-init(Config) ->
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+init_per_suite(Config) ->
?LIB_MOD:ftpd_init(ticket_test, Config).
-tickets() ->
+tickets() ->
[ticket_6035].
-fin(Config) ->
+end_per_suite(Config) ->
?LIB_MOD:ftpd_fin(Config).
ticket_6035(X) -> ?LIB_MOD:ticket_6035(X).
diff --git a/lib/inets/test/ftp_windows_2003_server_test.erl b/lib/inets/test/ftp_windows_2003_server_test.erl
index d24318d04f..57f1ae8358 100644
--- a/lib/inets/test/ftp_windows_2003_server_test.erl
+++ b/lib/inets/test/ftp_windows_2003_server_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
@@ -22,7 +22,7 @@
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-define(LIB_MOD,ftp_suite_lib).
-define(CASE_WRAPPER(_A_,_B_,_C_),?LIB_MOD:wrapper(_A_,_B_,_C_)).
@@ -86,22 +86,29 @@ end_per_testcase(Case, Config) ->
%% Name of a test case.
%% Description: Returns a list of all test cases in this test suite
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test ftp client"];
+all() ->
+ [open, open_port, {group, passive}, {group, active},
+ api_missuse, not_owner, {group, progress_report}].
+
+groups() ->
+ [{passive, [], ftp_suite_lib:passive(suite)},
+ {active, [], ftp_suite_lib:active(suite)},
+ {progress_report, [],
+ ftp_suite_lib:progress_report(suite)}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [open, open_port, passive, active, api_missuse,
- not_owner, progress_report].
%% Test cases starts here.
open(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open/1).
open_port(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open_port/1).
-passive(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:passive/1).
-active(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:active/1).
api_missuse(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:api_missuse/1).
not_owner(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:not_owner/1).
-progress_report(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:progress_report/1).
passive_user(X) -> ?LIB_MOD:passive_user(X).
passive_pwd(X) -> ?LIB_MOD:passive_pwd(X).
diff --git a/lib/inets/test/ftp_windows_xp_test.erl b/lib/inets/test/ftp_windows_xp_test.erl
index bc161e4f6a..06d919ba00 100644
--- a/lib/inets/test/ftp_windows_xp_test.erl
+++ b/lib/inets/test/ftp_windows_xp_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
@@ -22,7 +22,7 @@
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-define(LIB_MOD,ftp_suite_lib).
-define(CASE_WRAPPER(_A_,_B_,_C_),?LIB_MOD:wrapper(_A_,_B_,_C_)).
@@ -86,20 +86,27 @@ end_per_testcase(Case, Config) ->
%% Name of a test case.
%% Description: Returns a list of all test cases in this test suite
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test ftp client"];
+all() ->
+ [open, open_port, {group, passive}, {group, active},
+ api_missuse, not_owner, {group, progress_report}].
+
+groups() ->
+ [{passive, [], ftp_suite_lib:passive(suite)},
+ {active, [], ftp_suite_lib:active(suite)},
+ {progress_report, [],
+ ftp_suite_lib:progress_report(suite)}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [open, open_port, passive, active, api_missuse,
- not_owner, progress_report].
open(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open/1).
open_port(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:open_port/1).
-passive(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:passive/1).
-active(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:active/1).
api_missuse(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:api_missuse/1).
not_owner(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:not_owner/1).
-progress_report(X) -> ?CASE_WRAPPER(?PLATFORM,X,fun ?LIB_MOD:progress_report/1).
passive_user(X) -> ?LIB_MOD:passive_user(X).
passive_pwd(X) -> ?LIB_MOD:passive_pwd(X).
diff --git a/lib/inets/test/http_format_SUITE.erl b/lib/inets/test/http_format_SUITE.erl
index 79945f0f4d..931ac6e024 100644
--- a/lib/inets/test/http_format_SUITE.erl
+++ b/lib/inets/test/http_format_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -21,28 +21,49 @@
-module(http_format_SUITE).
-author('[email protected]').
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include("test_server_line.hrl").
-include("http_internal.hrl").
%% Test server specific exports
--export([all/1, init_per_testcase/2, end_per_testcase/2]).
+-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]).
%% Test cases must be exported.
--export([chunk/1, chunk_decode/1, chunk_encode/1,
- chunk_extensions_otp_6005/1, chunk_decode_otp_6264/1,
- chunk_decode_empty_chunk_otp_6511/1,
- chunk_decode_trailer/1,
- http_response/1, http_request/1, validate_request_line/1, script/1,
- esi_parse_headers/1, cgi_parse_headers/1,
- is_absolut_uri/1, convert_netscapecookie_date/1]).
-
-all(doc) ->
- ["Test library functions to the http client and server."];
-all(suite) ->
- [chunk,
- http_response, http_request, validate_request_line,
- script, is_absolut_uri, convert_netscapecookie_date].
+-export([ chunk_decode/1, chunk_encode/1,
+ chunk_extensions_otp_6005/1, chunk_decode_otp_6264/1,
+ chunk_decode_empty_chunk_otp_6511/1,
+ chunk_decode_trailer/1,
+ http_response/1, http_request/1, validate_request_line/1,
+ esi_parse_headers/1, cgi_parse_headers/1,
+ is_absolut_uri/1, convert_netscapecookie_date/1]).
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, chunk}, http_response, http_request,
+ validate_request_line, {group, script}, is_absolut_uri,
+ convert_netscapecookie_date].
+
+groups() ->
+ [{script, [], [esi_parse_headers, cgi_parse_headers]},
+ {chunk, [],
+ [chunk_decode, chunk_encode, chunk_extensions_otp_6005,
+ chunk_decode_otp_6264,
+ chunk_decode_empty_chunk_otp_6511,
+ chunk_decode_trailer]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_, Config) ->
Dog = test_server:timetrap(?t:minutes(1)),
@@ -57,17 +78,7 @@ end_per_testcase(_, Config) ->
%%-------------------------------------------------------------------------
%% Test cases starts here.
%%-------------------------------------------------------------------------
-script(doc) ->
- ["Test header parsing in esi/cgi functionality."];
-script(suite) ->
- [esi_parse_headers, cgi_parse_headers].
-
-chunk(doc) ->
- ["Test chunk encoding"];
-chunk(suite) ->
- [chunk_decode, chunk_encode, chunk_extensions_otp_6005,
- chunk_decode_otp_6264, chunk_decode_empty_chunk_otp_6511,
- chunk_decode_trailer].
+
%%-------------------------------------------------------------------------
chunk_decode(doc) ->
diff --git a/lib/inets/test/httpc_SUITE.erl b/lib/inets/test/httpc_SUITE.erl
index 94d5a48ef6..2c8febf5ed 100644
--- a/lib/inets/test/httpc_SUITE.erl
+++ b/lib/inets/test/httpc_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -24,7 +24,7 @@
-module(httpc_SUITE).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include("test_server_line.hrl").
-include_lib("kernel/include/file.hrl").
@@ -59,64 +59,47 @@
%% or a skip tuple if the platform is not supported.
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test the http client in the intes application."];
-all(suite) ->
- [
- proxy_options,
- proxy_head,
- proxy_get,
- proxy_trace,
- proxy_post,
- proxy_put,
- proxy_delete,
- proxy_auth,
- proxy_headers,
- proxy_emulate_lower_versions,
- http_options,
- http_head,
- http_get,
- http_post,
- http_dummy_pipe,
- http_inets_pipe,
- http_trace,
- http_async,
- http_save_to_file,
- http_save_to_file_async,
- http_headers,
- http_headers_dummy,
- http_bad_response,
- ssl_head,
- ossl_head,
- essl_head,
- ssl_get,
- ossl_get,
- essl_get,
- ssl_trace,
- ossl_trace,
- essl_trace,
- http_redirect,
- http_redirect_loop,
- http_internal_server_error,
- http_userinfo,
- http_cookie,
- http_server_does_not_exist,
- http_invalid_http,
- http_emulate_lower_versions,
- http_relaxed,
- page_does_not_exist,
- proxy_page_does_not_exist,
- proxy_https_not_supported,
- http_stream,
- http_stream_once,
- proxy_stream,
- parse_url,
- options,
- ipv6,
- headers_as_is,
- tickets
- ].
-
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [proxy_options, proxy_head, proxy_get, proxy_trace,
+ proxy_post, proxy_put, proxy_delete, proxy_auth,
+ proxy_headers, proxy_emulate_lower_versions,
+ http_options, http_head, http_get, http_post,
+ http_dummy_pipe, http_inets_pipe, http_trace,
+ http_async, http_save_to_file, http_save_to_file_async,
+ http_headers, http_headers_dummy, http_bad_response,
+ ssl_head, ossl_head, essl_head, ssl_get, ossl_get,
+ essl_get, ssl_trace, ossl_trace, essl_trace,
+ http_redirect, http_redirect_loop,
+ http_internal_server_error, http_userinfo, http_cookie,
+ http_server_does_not_exist, http_invalid_http,
+ http_emulate_lower_versions, http_relaxed,
+ page_does_not_exist, proxy_page_does_not_exist,
+ proxy_https_not_supported, http_stream,
+ http_stream_once, proxy_stream, parse_url, options,
+ ipv6, headers_as_is, {group, tickets}].
+
+groups() ->
+ [{tickets, [],
+ [hexed_query_otp_6191, empty_body_otp_6243,
+ empty_response_header_otp_6830,
+ transfer_encoding_otp_6807, proxy_not_modified_otp_6821,
+ no_content_204_otp_6982, missing_CR_otp_7304,
+ {group, otp_7883}, {group, otp_8154}, {group, otp_8106},
+ otp_8056, otp_8352, otp_8371, otp_8739]},
+ {otp_7883, [], [otp_7883_1, otp_7883_2]},
+ {otp_8154, [], [otp_8154_1]},
+ {otp_8106, [],
+ [otp_8106_pid, otp_8106_fun, otp_8106_mfa]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%--------------------------------------------------------------------
%% Function: init_per_suite(Config) -> Config
%% Config - [tuple()]
@@ -228,6 +211,8 @@ init_per_testcase(Case, Timeout, Config) ->
tsp("init_per_testcase -> [proxy case] start inets"),
inets:start(),
tsp("init_per_testcase -> [proxy case] start ssl"),
+ application:start(crypto),
+ application:start(public_key),
case (catch application:start(ssl)) of
ok ->
[{watchdog, Dog} | TmpConfig];
@@ -295,25 +280,6 @@ finish(Config) ->
%% Test cases starts here.
%%-------------------------------------------------------------------------
-tickets(doc) ->
- ["."];
-tickets(suite) ->
- [
- hexed_query_otp_6191,
- empty_body_otp_6243,
- empty_response_header_otp_6830,
- transfer_encoding_otp_6807,
- proxy_not_modified_otp_6821,
- no_content_204_otp_6982,
- missing_CR_otp_7304,
- otp_7883,
- otp_8154,
- otp_8106,
- otp_8056,
- otp_8352,
- otp_8371,
- otp_8739
- ].
%%-------------------------------------------------------------------------
@@ -1771,6 +1737,8 @@ parse_url(Config) when is_list(Config) ->
%%-------------------------------------------------------------------------
+ipv6() ->
+ [{require,ipv6_hosts}].
ipv6(doc) ->
["Test ipv6."];
ipv6(suite) ->
@@ -1779,7 +1747,7 @@ ipv6(Config) when is_list(Config) ->
{ok, Hostname} = inet:gethostname(),
case lists:member(list_to_atom(Hostname),
- ?config(ipv6_hosts, Config)) of
+ ct:get_config(ipv6_hosts)) of
true ->
{DummyServerPid, Port} = dummy_server(self(), ipv6),
@@ -1979,8 +1947,6 @@ missing_CR_otp_7304(Config) when is_list(Config) ->
%%-------------------------------------------------------------------------
-otp_7883(suite) ->
- [otp_7883_1, otp_7883_2].
otp_7883_1(doc) ->
["OTP-7883-sync"];
@@ -2028,8 +1994,6 @@ otp_7883_2(Config) when is_list(Config) ->
%%-------------------------------------------------------------------------
-otp_8154(suite) ->
- [otp_8154_1].
otp_8154_1(doc) ->
["OTP-8154"];
@@ -2309,12 +2273,6 @@ f(F, A) -> lists:flatten(io_lib:format(F,A)).
%%-------------------------------------------------------------------------
-otp_8106(suite) ->
- [
- otp_8106_pid,
- otp_8106_fun,
- otp_8106_mfa
- ].
otp_8106_pid(doc) ->
diff --git a/lib/inets/test/httpc_cookie_SUITE.erl b/lib/inets/test/httpc_cookie_SUITE.erl
index ad5df656c6..feef5f1eea 100644
--- a/lib/inets/test/httpc_cookie_SUITE.erl
+++ b/lib/inets/test/httpc_cookie_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -19,11 +19,11 @@
%%
-module(httpc_cookie_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("stdlib/include/ms_transform.hrl").
%% Test server specific exports
--export([all/1, init_per_testcase/2, end_per_testcase/2]).
+-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]).
%% Test cases must be exported.
-export([session_cookies_only/1, netscape_cookies/1,
@@ -116,22 +116,29 @@ end_per_testcase(Case, Config) ->
%% Name of a test case.
%% Description: Returns a list of all test cases in this test suite
%%--------------------------------------------------------------------
-all(doc) ->
- ["Describe the main purpose of this suite"];
-
-all(suite) ->
- [
- session_cookies_only,
- netscape_cookies,
- cookie_cancel,
- cookie_expires,
- persistent_cookie,
- domain_cookie,
- secure_cookie,
- update_cookie,
- update_cookie_session,
- cookie_attributes
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [session_cookies_only, netscape_cookies, cookie_cancel,
+ cookie_expires, persistent_cookie, domain_cookie,
+ secure_cookie, update_cookie, update_cookie_session,
+ cookie_attributes].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% Test cases starts here.
%%--------------------------------------------------------------------
diff --git a/lib/inets/test/httpd_1_1.erl b/lib/inets/test/httpd_1_1.erl
index 055d034bec..2a6110e3ea 100644
--- a/lib/inets/test/httpd_1_1.erl
+++ b/lib/inets/test/httpd_1_1.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
diff --git a/lib/inets/test/httpd_SUITE.erl b/lib/inets/test/httpd_SUITE.erl
index 3255cbec06..fde5178879 100644
--- a/lib/inets/test/httpd_SUITE.erl
+++ b/lib/inets/test/httpd_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -20,28 +20,17 @@
-module(httpd_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("test_server_line.hrl").
-include("inets_test_lib.hrl").
-include_lib("kernel/include/file.hrl").
%% Test server specific exports
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]).
-export([init_per_testcase/2, end_per_testcase/2,
init_per_suite/1, end_per_suite/1]).
-%% Test cases must be exported.
--export([
- ip/1,
- ssl/1, pssl/1, ossl/1, essl/1,
- http_1_1_ip/1,
- http_1_0_ip/1,
- http_0_9_ip/1,
- ipv6/1,
- tickets/1
- ]).
-
%% Core Server tests
-export([
ip_mod_alias/1,
@@ -249,19 +238,109 @@
%% Description: Returns documentation/test cases in this test suite
%% or a skip tuple if the platform is not supported.
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test the http server in the intes application."];
-all(suite) ->
- [
- ip,
- ssl,
- http_1_1_ip,
- http_1_0_ip,
- http_0_9_ip,
- %% ipv6,
- tickets
- ].
-
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, ip}, {group, ssl}, {group, http_1_1_ip},
+ {group, http_1_0_ip}, {group, http_0_9_ip},
+ {group, tickets}].
+
+groups() ->
+ [{ip, [],
+ [ip_mod_alias, ip_mod_actions, ip_mod_security,
+ ip_mod_auth, ip_mod_auth_api, ip_mod_auth_mnesia_api,
+ ip_mod_htaccess, ip_mod_cgi, ip_mod_esi, ip_mod_get,
+ ip_mod_head, ip_mod_all, ip_load_light, ip_load_medium,
+ ip_load_heavy, ip_dos_hostname, ip_time_test,
+ ip_restart_no_block, ip_restart_disturbing_block,
+ ip_restart_non_disturbing_block,
+ ip_block_disturbing_idle, ip_block_non_disturbing_idle,
+ ip_block_503, ip_block_disturbing_active,
+ ip_block_non_disturbing_active,
+ ip_block_disturbing_active_timeout_not_released,
+ ip_block_disturbing_active_timeout_released,
+ ip_block_non_disturbing_active_timeout_not_released,
+ ip_block_non_disturbing_active_timeout_released,
+ ip_block_disturbing_blocker_dies,
+ ip_block_non_disturbing_blocker_dies]},
+ {ssl, [],
+ [{group, pssl}, {group, ossl}, {group, essl}]},
+ {pssl, [],
+ [pssl_mod_alias, pssl_mod_actions, pssl_mod_security,
+ pssl_mod_auth, pssl_mod_auth_api,
+ pssl_mod_auth_mnesia_api, pssl_mod_htaccess,
+ pssl_mod_cgi, pssl_mod_esi, pssl_mod_get, pssl_mod_head,
+ pssl_mod_all, pssl_load_light, pssl_load_medium,
+ pssl_load_heavy, pssl_dos_hostname, pssl_time_test,
+ pssl_restart_no_block, pssl_restart_disturbing_block,
+ pssl_restart_non_disturbing_block,
+ pssl_block_disturbing_idle,
+ pssl_block_non_disturbing_idle, pssl_block_503,
+ pssl_block_disturbing_active,
+ pssl_block_non_disturbing_active,
+ pssl_block_disturbing_active_timeout_not_released,
+ pssl_block_disturbing_active_timeout_released,
+ pssl_block_non_disturbing_active_timeout_not_released,
+ pssl_block_non_disturbing_active_timeout_released,
+ pssl_block_disturbing_blocker_dies,
+ pssl_block_non_disturbing_blocker_dies]},
+ {ossl, [],
+ [ossl_mod_alias, ossl_mod_actions, ossl_mod_security,
+ ossl_mod_auth, ossl_mod_auth_api,
+ ossl_mod_auth_mnesia_api, ossl_mod_htaccess,
+ ossl_mod_cgi, ossl_mod_esi, ossl_mod_get, ossl_mod_head,
+ ossl_mod_all, ossl_load_light, ossl_load_medium,
+ ossl_load_heavy, ossl_dos_hostname, ossl_time_test,
+ ossl_restart_no_block, ossl_restart_disturbing_block,
+ ossl_restart_non_disturbing_block,
+ ossl_block_disturbing_idle,
+ ossl_block_non_disturbing_idle, ossl_block_503,
+ ossl_block_disturbing_active,
+ ossl_block_non_disturbing_active,
+ ossl_block_disturbing_active_timeout_not_released,
+ ossl_block_disturbing_active_timeout_released,
+ ossl_block_non_disturbing_active_timeout_not_released,
+ ossl_block_non_disturbing_active_timeout_released,
+ ossl_block_disturbing_blocker_dies,
+ ossl_block_non_disturbing_blocker_dies]},
+ {essl, [],
+ [essl_mod_alias, essl_mod_actions, essl_mod_security,
+ essl_mod_auth, essl_mod_auth_api,
+ essl_mod_auth_mnesia_api, essl_mod_htaccess,
+ essl_mod_cgi, essl_mod_esi, essl_mod_get, essl_mod_head,
+ essl_mod_all, essl_load_light, essl_load_medium,
+ essl_load_heavy, essl_dos_hostname, essl_time_test,
+ essl_restart_no_block, essl_restart_disturbing_block,
+ essl_restart_non_disturbing_block,
+ essl_block_disturbing_idle,
+ essl_block_non_disturbing_idle, essl_block_503,
+ essl_block_disturbing_active,
+ essl_block_non_disturbing_active,
+ essl_block_disturbing_active_timeout_not_released,
+ essl_block_disturbing_active_timeout_released,
+ essl_block_non_disturbing_active_timeout_not_released,
+ essl_block_non_disturbing_active_timeout_released,
+ essl_block_disturbing_blocker_dies,
+ essl_block_non_disturbing_blocker_dies]},
+ {http_1_1_ip, [],
+ [ip_host, ip_chunked, ip_expect, ip_range, ip_if_test,
+ ip_http_trace, ip_http1_1_head,
+ ip_mod_cgi_chunked_encoding_test]},
+ {http_1_0_ip, [],
+ [ip_head_1_0, ip_get_1_0, ip_post_1_0]},
+ {http_0_9_ip, [], [ip_get_0_9]},
+ {ipv6, [], [ipv6_hostname, ipv6_address]},
+ {tickets, [],
+ [ticket_5775, ticket_5865, ticket_5913, ticket_6003,
+ ticket_7304]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%--------------------------------------------------------------------
%% Function: init_per_suite(Config) -> Config
%% Config - [tuple()]
@@ -615,219 +694,23 @@ end_per_testcase2(Case, Config) ->
%%-------------------------------------------------------------------------
%% Test cases starts here.
%%-------------------------------------------------------------------------
-ip(doc) ->
- ["HTTP tests using TCP/IP"];
-ip(suite) ->
- [
- ip_mod_alias,
- ip_mod_actions,
- ip_mod_security,
- ip_mod_auth,
- ip_mod_auth_api,
- ip_mod_auth_mnesia_api,
- ip_mod_htaccess,
- ip_mod_cgi,
- ip_mod_esi,
- ip_mod_get,
- ip_mod_head,
- ip_mod_all,
- ip_load_light,
- ip_load_medium,
- ip_load_heavy,
- ip_dos_hostname,
- ip_time_test,
- ip_restart_no_block,
- ip_restart_disturbing_block,
- ip_restart_non_disturbing_block,
- ip_block_disturbing_idle,
- ip_block_non_disturbing_idle,
- ip_block_503,
- ip_block_disturbing_active,
- ip_block_non_disturbing_active,
- ip_block_disturbing_active_timeout_not_released,
- ip_block_disturbing_active_timeout_released,
- ip_block_non_disturbing_active_timeout_not_released,
- ip_block_non_disturbing_active_timeout_released,
- ip_block_disturbing_blocker_dies,
- ip_block_non_disturbing_blocker_dies
- ].
%%-------------------------------------------------------------------------
-ssl(doc) ->
- ["HTTP test using SSL"];
-ssl(suite) ->
- [
- pssl,
- ossl,
- essl
- ].
-pssl(doc) ->
- ["HTTP test using SSL - using old way of configuring SSL"];
-pssl(suite) ->
- [
- pssl_mod_alias,
- pssl_mod_actions,
- pssl_mod_security,
- pssl_mod_auth,
- pssl_mod_auth_api,
- pssl_mod_auth_mnesia_api,
- pssl_mod_htaccess,
- pssl_mod_cgi,
- pssl_mod_esi,
- pssl_mod_get,
- pssl_mod_head,
- pssl_mod_all,
- pssl_load_light,
- pssl_load_medium,
- pssl_load_heavy,
- pssl_dos_hostname,
- pssl_time_test,
- pssl_restart_no_block,
- pssl_restart_disturbing_block,
- pssl_restart_non_disturbing_block,
- pssl_block_disturbing_idle,
- pssl_block_non_disturbing_idle,
- pssl_block_503,
- pssl_block_disturbing_active,
- pssl_block_non_disturbing_active,
- pssl_block_disturbing_active_timeout_not_released,
- pssl_block_disturbing_active_timeout_released,
- pssl_block_non_disturbing_active_timeout_not_released,
- pssl_block_non_disturbing_active_timeout_released,
- pssl_block_disturbing_blocker_dies,
- pssl_block_non_disturbing_blocker_dies
- ].
-ossl(doc) ->
- ["HTTP test using SSL - using new way of configuring usage of old SSL"];
-ossl(suite) ->
- [
- ossl_mod_alias,
- ossl_mod_actions,
- ossl_mod_security,
- ossl_mod_auth,
- ossl_mod_auth_api,
- ossl_mod_auth_mnesia_api,
- ossl_mod_htaccess,
- ossl_mod_cgi,
- ossl_mod_esi,
- ossl_mod_get,
- ossl_mod_head,
- ossl_mod_all,
- ossl_load_light,
- ossl_load_medium,
- ossl_load_heavy,
- ossl_dos_hostname,
- ossl_time_test,
- ossl_restart_no_block,
- ossl_restart_disturbing_block,
- ossl_restart_non_disturbing_block,
- ossl_block_disturbing_idle,
- ossl_block_non_disturbing_idle,
- ossl_block_503,
- ossl_block_disturbing_active,
- ossl_block_non_disturbing_active,
- ossl_block_disturbing_active_timeout_not_released,
- ossl_block_disturbing_active_timeout_released,
- ossl_block_non_disturbing_active_timeout_not_released,
- ossl_block_non_disturbing_active_timeout_released,
- ossl_block_disturbing_blocker_dies,
- ossl_block_non_disturbing_blocker_dies
- ].
-essl(doc) ->
- ["HTTP test using SSL - using new way of configuring usage of new SSL"];
-essl(suite) ->
- [
- essl_mod_alias,
- essl_mod_actions,
- essl_mod_security,
- essl_mod_auth,
- essl_mod_auth_api,
- essl_mod_auth_mnesia_api,
- essl_mod_htaccess,
- essl_mod_cgi,
- essl_mod_esi,
- essl_mod_get,
- essl_mod_head,
- essl_mod_all,
- essl_load_light,
- essl_load_medium,
- essl_load_heavy,
- essl_dos_hostname,
- essl_time_test,
- essl_restart_no_block,
- essl_restart_disturbing_block,
- essl_restart_non_disturbing_block,
- essl_block_disturbing_idle,
- essl_block_non_disturbing_idle,
- essl_block_503,
- essl_block_disturbing_active,
- essl_block_non_disturbing_active,
- essl_block_disturbing_active_timeout_not_released,
- essl_block_disturbing_active_timeout_released,
- essl_block_non_disturbing_active_timeout_not_released,
- essl_block_non_disturbing_active_timeout_released,
- essl_block_disturbing_blocker_dies,
- essl_block_non_disturbing_blocker_dies
- ].
%%-------------------------------------------------------------------------
-http_1_1_ip(doc) ->
- ["HTTP/1.1"];
-http_1_1_ip(suite) ->
- [
- ip_host,
- ip_chunked,
- ip_expect,
- ip_range,
- ip_if_test,
- ip_http_trace,
- ip_http1_1_head,
- ip_mod_cgi_chunked_encoding_test
- ].
%%-------------------------------------------------------------------------
-http_1_0_ip(doc) ->
- ["HTTP/1.0"];
-http_1_0_ip(suite) ->
- [
- ip_head_1_0,
- ip_get_1_0,
- ip_post_1_0
- ].
%%-------------------------------------------------------------------------
-http_0_9_ip(doc) ->
- ["HTTP/0.9"];
-http_0_9_ip(suite) ->
- [
- ip_get_0_9
- ].
%%-------------------------------------------------------------------------
-ipv6(doc) ->
- ["Tests ipv6 functionality."];
-ipv6(suite) ->
- [
- ipv6_hostname,
- ipv6_address
- ].
%%-------------------------------------------------------------------------
-tickets(doc) ->
- ["Test cases for reported bugs."];
-tickets(suite) ->
- [
- ticket_5775,
- ticket_5865,
- ticket_5913,
- ticket_6003,
- ticket_7304
- ].
%%-------------------------------------------------------------------------
ip_mod_alias(doc) ->
diff --git a/lib/inets/test/httpd_SUITE_data/server_root/conf/httpd.conf b/lib/inets/test/httpd_SUITE_data/server_root/conf/httpd.conf
index 8a74ed1afd..ceb94237d2 100644
--- a/lib/inets/test/httpd_SUITE_data/server_root/conf/httpd.conf
+++ b/lib/inets/test/httpd_SUITE_data/server_root/conf/httpd.conf
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2009. All Rights Reserved.
+# Copyright Ericsson AB 1997-2011. 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
diff --git a/lib/inets/test/httpd_basic_SUITE.erl b/lib/inets/test/httpd_basic_SUITE.erl
index 9ba2e73942..3e29b68283 100644
--- a/lib/inets/test/httpd_basic_SUITE.erl
+++ b/lib/inets/test/httpd_basic_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -19,23 +19,26 @@
%%
-module(httpd_basic_SUITE).
--include("test_server.hrl").
--include("test_server_line.hrl").
+-include_lib("common_test/include/ct.hrl").
%% Note: This directive should only be used in test suites.
-compile(export_all).
-define(URL_START, "http://localhost:").
-all(doc) ->
- ["Basic test of httpd."];
+suite() -> [{ct_hooks,[ts_install_cth]}].
-all(suite) ->
- [
- uri_too_long_414,
- header_too_long_413,
- escaped_url_in_error_body
- ].
+all() ->
+ [uri_too_long_414, header_too_long_413, escaped_url_in_error_body].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
%%--------------------------------------------------------------------
%% Function: init_per_suite(Config) -> Config
diff --git a/lib/inets/test/httpd_load.erl b/lib/inets/test/httpd_load.erl
index 9bb9f9f94e..83520033dc 100644
--- a/lib/inets/test/httpd_load.erl
+++ b/lib/inets/test/httpd_load.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
diff --git a/lib/inets/test/httpd_test_data/server_root/conf/httpd.conf b/lib/inets/test/httpd_test_data/server_root/conf/httpd.conf
index 8a74ed1afd..ceb94237d2 100644
--- a/lib/inets/test/httpd_test_data/server_root/conf/httpd.conf
+++ b/lib/inets/test/httpd_test_data/server_root/conf/httpd.conf
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2009. All Rights Reserved.
+# Copyright Ericsson AB 1997-2011. 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
diff --git a/lib/inets/test/inets.cover b/lib/inets/test/inets.cover
new file mode 100644
index 0000000000..fd0ca41db3
--- /dev/null
+++ b/lib/inets/test/inets.cover
@@ -0,0 +1,2 @@
+{incl_app,inets,details}.
+
diff --git a/lib/inets/test/inets.spec b/lib/inets/test/inets.spec
index a9b4524295..ed102f8219 100644
--- a/lib/inets/test/inets.spec
+++ b/lib/inets/test/inets.spec
@@ -1,2 +1 @@
-{topcase, {dir, "../inets_test"}}.
-{hosts, ["tuor"]}.
+{suites,"../inets_test",all}.
diff --git a/lib/inets/test/inets_SUITE.erl b/lib/inets/test/inets_SUITE.erl
index 56983caace..6fa0f44d77 100644
--- a/lib/inets/test/inets_SUITE.erl
+++ b/lib/inets/test/inets_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -19,7 +19,7 @@
%%
-module(inets_SUITE).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include("test_server_line.hrl").
-include("inets_test_lib.hrl").
@@ -28,25 +28,26 @@
-define(NUM_DEFAULT_SERVICES, 1).
-all(doc) ->
- ["Test suites for the inets application."];
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, app_test}, {group, appup_test},
+ {group, services_test}, httpd_reload].
+
+groups() ->
+ [{services_test, [],
+ [start_inets, start_httpc, start_httpd, start_ftpc,
+ start_tftpd]},
+ {app_test, [], [{inets_app_test, all}]},
+ {appup_test, [], [{inets_appup_test, all}]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [
- app_test,
- appup_test,
- services_test,
- httpd_reload
- ].
-services_test(suite) ->
- [
- start_inets,
- start_httpc,
- start_httpd,
- start_ftpc,
- start_tftpd
- ].
%%--------------------------------------------------------------------
@@ -100,11 +101,7 @@ end_per_testcase(_, Config) ->
%%-------------------------------------------------------------------------
%% Test cases starts here.
%%-------------------------------------------------------------------------
-app_test(suite) ->
- [{inets_app_test, all}].
-appup_test(suite) ->
- [{inets_appup_test, all}].
%%-------------------------------------------------------------------------
diff --git a/lib/inets/test/inets_app_test.erl b/lib/inets/test/inets_app_test.erl
index 6bdb9bb308..11b507fa26 100644
--- a/lib/inets/test/inets_app_test.erl
+++ b/lib/inets/test/inets_app_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2010. 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
@@ -39,28 +39,31 @@ init_per_testcase(undef_funcs, Config) ->
init_per_testcase(_, Config) ->
Config.
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Config.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) ->
- Cases =
- [
- fields,
- modules,
- exportall,
- app_depend,
- undef_funcs
- ],
- {req, [], {conf, app_init, Cases, app_fin}}.
+all() ->
+ [fields, modules, exportall, app_depend,
+ undef_funcs].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-app_init(suite) -> [];
-app_init(doc) -> [];
-app_init(Config) when is_list(Config) ->
+init_per_suite(suite) -> [];
+init_per_suite(doc) -> [];
+init_per_suite(Config) when is_list(Config) ->
case is_app(inets) of
{ok, AppFile} ->
io:format("AppFile: ~n~p~n", [AppFile]),
@@ -81,9 +84,9 @@ is_app(App) ->
end.
-app_fin(suite) -> [];
-app_fin(doc) -> [];
-app_fin(Config) when is_list(Config) ->
+end_per_suite(suite) -> [];
+end_per_suite(doc) -> [];
+end_per_suite(Config) when is_list(Config) ->
Config.
diff --git a/lib/inets/test/inets_appup_test.erl b/lib/inets/test/inets_appup_test.erl
index 2c9c687c91..7ed237243e 100644
--- a/lib/inets/test/inets_appup_test.erl
+++ b/lib/inets/test/inets_appup_test.erl
@@ -28,31 +28,37 @@
-include("inets_test_lib.hrl").
-% t() -> megaco_test_lib:t(?MODULE).
-% t(Case) -> megaco_test_lib:t({?MODULE, Case}).
+ % t() -> megaco_test_lib:t(?MODULE).
+ % t(Case) -> megaco_test_lib:t({?MODULE, Case}).
%% Test server callbacks
init_per_testcase(_Case, Config) ->
Config.
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Config.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) ->
- Cases =
- [
- appup
- ],
- {req, [], {conf, appup_init, Cases, appup_fin}}.
+all() ->
+ [appup].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-appup_init(suite) -> [];
-appup_init(doc) -> [];
-appup_init(Config) when is_list(Config) ->
+init_per_suite(suite) -> [];
+init_per_suite(doc) -> [];
+init_per_suite(Config) when is_list(Config) ->
AppFile = file_name(inets, ".app"),
AppupFile = file_name(inets, ".appup"),
[{app_file, AppFile}, {appup_file, AppupFile}|Config].
@@ -63,9 +69,9 @@ file_name(App, Ext) ->
filename:join([LibDir, "ebin", atom_to_list(App) ++ Ext]).
-appup_fin(suite) -> [];
-appup_fin(doc) -> [];
-appup_fin(Config) when is_list(Config) ->
+end_per_suite(suite) -> [];
+end_per_suite(doc) -> [];
+end_per_suite(Config) when is_list(Config) ->
Config.
diff --git a/lib/inets/test/inets_sup_SUITE.erl b/lib/inets/test/inets_sup_SUITE.erl
index 1e701bc074..1d262a2739 100644
--- a/lib/inets/test/inets_sup_SUITE.erl
+++ b/lib/inets/test/inets_sup_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -20,22 +20,27 @@
-module(inets_sup_SUITE).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include("test_server_line.hrl").
%% Note: This directive should only be used in test suites.
-compile(export_all).
-all(doc) ->
- ["Test that the inets supervisorstructur is the expected one."];
-all(suite) ->
- [
- default_tree,
- ftpc_worker,
- tftpd_worker,
- httpd_subtree,
- httpc_subtree
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [default_tree, ftpc_worker, tftpd_worker, httpd_subtree,
+ httpc_subtree].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%--------------------------------------------------------------------
%% Function: init_per_suite(Config) -> Config
diff --git a/lib/inets/test/tftp_SUITE.erl b/lib/inets/test/tftp_SUITE.erl
index 5768fff88b..59fb644667 100644
--- a/lib/inets/test/tftp_SUITE.erl
+++ b/lib/inets/test/tftp_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -64,24 +64,34 @@ default_config() ->
init_per_testcase(Case, Config) ->
tftp_test_lib:init_per_testcase(Case, Config).
-fin_per_testcase(Case, Config) when is_list(Config) ->
- tftp_test_lib:fin_per_testcase(Case, Config).
+end_per_testcase(Case, Config) when is_list(Config) ->
+ tftp_test_lib:end_per_testcase(Case, Config).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Top test case
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(doc) ->
- ["Test suites for TFTP."];
-
-all(suite) ->
- [
- simple,
- extra,
- reuse_connection,
- resend_client,
- resend_server
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [simple, extra, reuse_connection, resend_client,
+ resend_server].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Simple
diff --git a/lib/inets/test/tftp_test_lib.erl b/lib/inets/test/tftp_test_lib.erl
index 3729309b0e..e9b691828f 100644
--- a/lib/inets/test/tftp_test_lib.erl
+++ b/lib/inets/test/tftp_test_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2010. 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
@@ -32,7 +32,7 @@ init_per_testcase(_Case, Config) when is_list(Config) ->
?IGNORE(application:stop(inets)),
Config.
-fin_per_testcase(_Case, Config) when is_list(Config) ->
+end_per_testcase(_Case, Config) when is_list(Config) ->
?IGNORE(application:stop(inets)),
Config.
@@ -143,7 +143,7 @@ eval(Mod, Fun, Config) ->
Config2 = Mod:init_per_testcase(Fun, Config),
Pid = spawn_link(?MODULE, do_eval, [self(), Mod, Fun, Config2]),
R = wait_for_evaluator(Pid, Mod, Fun, Config2, []),
- Mod:fin_per_testcase(Fun, Config2),
+ Mod:end_per_testcase(Fun, Config2),
global:unregister_name(tftp_test_case_sup),
process_flag(trap_exit, Flag),
R.
diff --git a/lib/inets/test/tftp_test_lib.hrl b/lib/inets/test/tftp_test_lib.hrl
index da4b065976..bef024720a 100644
--- a/lib/inets/test/tftp_test_lib.hrl
+++ b/lib/inets/test/tftp_test_lib.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
diff --git a/lib/inets/vsn.mk b/lib/inets/vsn.mk
index f462290a99..b1de3fef43 100644
--- a/lib/inets/vsn.mk
+++ b/lib/inets/vsn.mk
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2001-2010. All Rights Reserved.
+# Copyright Ericsson AB 2001-2011. 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
@@ -18,7 +18,7 @@
# %CopyrightEnd%
APPLICATION = inets
-INETS_VSN = 5.5.1
+INETS_VSN = 5.5.2
PRE_VSN =
APP_VSN = "$(APPLICATION)-$(INETS_VSN)$(PRE_VSN)"
diff --git a/lib/inviso/doc/src/inviso_as_lib.xml b/lib/inviso/doc/src/inviso_as_lib.xml
index 80694efd67..1f4961166c 100644
--- a/lib/inviso/doc/src/inviso_as_lib.xml
+++ b/lib/inviso/doc/src/inviso_as_lib.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2006</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/inviso/doc/src/inviso_lfm.xml b/lib/inviso/doc/src/inviso_lfm.xml
index 02e012f2ea..70207d0b58 100644
--- a/lib/inviso/doc/src/inviso_lfm.xml
+++ b/lib/inviso/doc/src/inviso_lfm.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2006</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/inviso/doc/src/inviso_lfm_tpfreader.xml b/lib/inviso/doc/src/inviso_lfm_tpfreader.xml
index eba3e63e2e..bae40522a3 100644
--- a/lib/inviso/doc/src/inviso_lfm_tpfreader.xml
+++ b/lib/inviso/doc/src/inviso_lfm_tpfreader.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2006</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/inviso/doc/src/inviso_rt.xml b/lib/inviso/doc/src/inviso_rt.xml
index 1579c873a3..3a8e77f65c 100644
--- a/lib/inviso/doc/src/inviso_rt.xml
+++ b/lib/inviso/doc/src/inviso_rt.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2006</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/inviso/doc/src/notes.xml b/lib/inviso/doc/src/notes.xml
index 48a71e314c..7c2c3c3bde 100644
--- a/lib/inviso/doc/src/notes.xml
+++ b/lib/inviso/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2006</year><year>2009</year>
+ <year>2006</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
diff --git a/lib/inviso/src/inviso_tool.erl b/lib/inviso/src/inviso_tool.erl
index 05158f58fe..7d3cfb9da0 100644
--- a/lib/inviso/src/inviso_tool.erl
+++ b/lib/inviso/src/inviso_tool.erl
@@ -1,3324 +1,3255 @@
-% ``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 via the world wide web 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.
-%%
-%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
-%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
-%% AB. All Rights Reserved.''
-%%
-%% $Id$
-%%
-%% Description:
-%% The inviso_tool implementation. A tool that uses inviso.
-%%
-%% Authors:
-%% Lennart �hman, [email protected]
-%% -----------------------------------------------------------------------------
-
--module(inviso_tool).
-
-
-%% This is the inviso tool, which is a tool using the inviso trace application.
-%% It is developed to make tracing using trace cases possible in an environment
-%% of distributed Erlang nodes.
-%% A current restriction is that the Erlang nodes are supposed to have the same
-%% code. This since inviso tool can at this point not handle subsets of nodes.
-%% Instead all participating Erlang nodes are treated the same.
-%%
-%% The main functionality of the inviso tool are:
-%%
-%% (1) Handles start and stop of tracing at participating nodes.
-%% (2) Interprets trace-case files at a distributed network level.
-%% (The inviso runtime component is responsible for interpreting
-%% trace cases at a local level, if run in an autostart).
-%% (3) Keeps a command history log from which:
-%% (a) Sequences easily can be repeated.
-%% (b) Autostart configuration files can be created (understood by the
-%% default inviso autostart mechanism).
-%% (4) Performs reactivation in case tracing is suspended (manually or by
-%% an overload mechanism).
-%% (5) Can reconnect crashed nodes and by using the history bringing them
-%% up to speed.
-
-%% Distributed Erlang
-%% ------------------
-%% Inviso is built to run in a distributed environment.
-%% The inviso tool can also be used in a non distributed environment.
-
-%% Short description
-%% -----------------
-%% Start-up of the inviso tool
-%% During the start-up of the tool, the tool starts runtime components at
-%% all participating nodes. A runtime component can already be running at
-%% a particular node and will then simply be adopted.
-%%
-%% Session
-%% A session is said to start when tracing is initiated, and ends when
-%% made to stop by the user. When a session is stopped, tracing is stopped
-%% at all participating nodes. Note that participating nodes may come and
-%% go though the time-frame of a session. That means that if a node is
-%% reconnected it may resume its tracing in the current session through
-%% a 'restart_session'. A runtime component that is already tracing at the
-%% time start-session will simply be part of the session without its
-%% ingoing tracing being changed.
-%%
-%% Reactivation
-%% A node that is suspended can be reactivated to resume tracing. Note that
-%% tracing has in this situation never been stopped at the node in question.
-%% The inviso tool resumes the node and applies the history to it.
-%%
-%% Reconnect
-%% A node that is "down" from the inviso tool's perspective can be
-%% reconnected. During reconnection the tool restarts the runtime component
-%% at that node but does not (re)initiate tracing. The latter is called
-%% restart_session and must be done explicitly, unless the node in question
-%% is in fact already tracing. If the node is already tracing (due to an autostart
-%% for instance), it automatically becomes part of the ongoing session (if
-%% there is an ongoing session).
-%%
-%% Restart Session
-%% A node that has been down and has been reconnected can be made to
-%% initialize and resume its tracing. This is done by starting the session
-%% at the node in question and redoing the current history.
-
-%% Trace files within a session
-%% Since it is possible to init-tracing (from an inviso perspective) several
-%% times within the same session, a session may leave several trace log files
-%% behind. This must be resolved by the tracer data generator function
-%% (user supplied) by marking filenames in a chronological order but still
-%% making them possible to identify as part of the same session
-
-
-
-%% -----------------------------------------------------------------------------
-%% API exports.
-%% -----------------------------------------------------------------------------
-
--export([start/0,start/1,stop/0,stop/1]).
--export([reconnect_nodes/0,reconnect_nodes/1,
- start_session/0,start_session/1,
- reinitiate_session/0,reinitiate_session/1,
- restore_session/0,restore_session/1,restore_session/2,
- stop_session/0,
- reset_nodes/0,reset_nodes/1,
- atc/3,sync_atc/3,sync_atc/4,
- sync_rtc/2,sync_rtc/3,
- dtc/2,sync_dtc/2,sync_dtc/3,
- inviso/2]).
--export([reactivate/0,reactivate/1,
- save_history/1,
- get_autostart_data/1,get_autostart_data/2,
- get_activities/0,get_node_status/0,get_node_status/1,get_session_data/0]).
--export([flush/0,flush/1]).
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% Debug exports.
-%% -----------------------------------------------------------------------------
-
--export([get_loopdata/0]).
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% OTP exports and call backs.
-%% -----------------------------------------------------------------------------
-
--export([init/1,handle_call/3,handle_cast/2,handle_info/2,terminate/2]).
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% Internal exports.
-%% -----------------------------------------------------------------------------
-
--export([tc_executer/4,reactivator_executer/6]).
--export([std_options_generator/1]).
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% Constants.
-%% -----------------------------------------------------------------------------
-
-%% Defines the inviso function calls that shall be possible to do through the
-%% inviso API in this tool.
--define(INVISO_CMDS,
- [{tp,5},{tp,4},{tp,1},{tpl,5},{tpl,4},{tpl,1},
- {ctp,1},{ctp,2},{ctp,3},{ctpl,1},{ctpl,2},{ctpl,3},
- {tf,2},{tf,1},{ctf,2},{ctf,1},{ctf_all,0},
- {init_tpm,4},{init_tpm,7},
- {tpm,4},{tpm,5},{tpm,8},
- {tpm_tracer,4},{tpm_tracer,5},{init_tpm,8},
- {tpm_ms,5},{tpm_ms_tracer,5},
- {ctpm_ms,4},{ctpm,3},
- {tpm_localnames,0},{ctpm_localnames,0},
- {tpm_globalnames,0},{ctpm_globalnames,0},
- {ctp_all,0},
- {suspend,1},{cancel_suspension,0}]).
-%% -----------------------------------------------------------------------------
-
-%% These inviso functions shall be included in the command history log. Others
-%% are not relevant to be redone during a recactivation, a restart session or
-%% exported to an autostart file.
--define(INVISO_CMD_HISTORY,
- [{tp,5},{tp,4},{tp,1},{tpl,5},{tpl,4},{tpl,1},
- {ctp,1},{ctp,2},{ctp,3},{ctpl,1},{ctpl,2},{ctpl,3},
- {tf,2},{tf,1},{ctf,2},{ctf,1},{ctf_all,0},
- {init_tpm,4},{init_tpm,7},
- {tpm,4},{tpm,5},{tpm,8},
- {tpm_tracer,4},{tpm_tracer,5},{init_tpm,8},
- {tpm_ms,5},{tpm_ms_tracer,5},
- {ctpm_ms,4},{ctpm,3},
- {tpm_localnames,0},{ctpm_localnames,0},
- {tpm_globalnames,0},{ctpm_globalnames,0},
- {ctp_all,0}]).
-%% -----------------------------------------------------------------------------
-
-%% Since many function calls to inviso may take long time, especially if they
-%% involve difficult and many trace patterns to set, the default gen_server:call
-%% time out can not be used. We just do not want to get stuck for ever if some
-%% error occurs.
--define(CALL_TIMEOUT,60000).
-
-%% Default max time to wait for a trace case called synchronously to return.
--define(SYNC_TC_TIMEOUT,10000).
-
-%% Runtime components shall terminate when the tool terminates.
--define(DEFAULT_DEPENDENCY,{dependency,0}).
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% Record definitions.
-%% -----------------------------------------------------------------------------
-
-%% The loopdata record.
--record(ld,{
- dir=".", % Working dir of the tool.
- nodes=down, % The nodesD database, defaults to non-distr.
- c_node, % Location of inviso_c.
- c_pid, % The inviso control component.
- regexp_node, % Node for regexp expansions.
- tc_dict, % Trace case definition db.
- chl, % Command history log.
- session_state=passive, % passive | tracing
- tdg={inviso_tool_lib,std_tdg,[]}, % Tracer data generator func.
- tracer_data, % Current session nr and TDGargs.
- reactivators=[], % Pids of now running reactivators.
- tc_def_file, % Trace case definition file.
- optg={?MODULE,std_options_generator,[]}, % Generates options to add_nodes/3.
- initial_tcs=[], % Initial trace cases.
- started_initial_tcs=[], % Cases that must be stopped when stop_tracing.
- history_dir, % File path for history file.
- keep_nodes=[], % Nodes that shall not be cleared when stopping.
- debug=false % Internal debug mode
- }).
-%% -----------------------------------------------------------------------------
-
-
-%% =============================================================================
-%% API
-%% =============================================================================
-
-%% start()={ok,Pid} | {error,{already_started,pid()}}
-%% start(Config)
-%% Config=[{Opt,Value},...], list of tuple options.
-%% Opt=dir|nodes|c_node|regexp_node|tdg|tc_def_file|optg|initial_tcs|
-%% history_dir|keep_nodes
-%% Starts the inviso_tool process. Options in Config are the same as those
-%% which are kept in the #ld structure.
-start() ->
- start([]).
-start(Config) ->
- gen_server:start({local,?MODULE},?MODULE,Config,[]).
-%% -----------------------------------------------------------------------------
-
-%% stop(UntouchedNodes)=
-%% stop()={ok,NodeResults} | NodeResult | {error,Reason}
-%% UntouchedNodes=list(), nodes where any trace patterns shall not be removed.
-%% NodeResults=[{Node,NodeResult},...]
-%% NodeResult=ok | {error,Reason} | patterns_untouched
-%% Stops the inviso tool and the inviso control component. Runtime components are
-%% stopped by them selves depending on their dependcy of the control component.
-%% All runtime components that are not marked as to be kept will have their
-%% trace patterns cleared before the inviso control component is shutdown.
-%% The NodeResults indicates which nodes were successfullt handled.
-stop() ->
- stop([]).
-stop(UntouchedNodes) ->
- gen_server:call(?MODULE,{stop,UntouchedNodes},?CALL_TIMEOUT).
-%% -----------------------------------------------------------------------------
-
-%% reconnect_nodes()=NodeResult; function for the nod-distributed case.
-%% reconnect_nodes(Nodes)={ok,NodesResults}
-%% NodesResults=[{Node,NodeResult},...]
-%% NodeResult={ok,{State,Status}} | {error,NReason}
-%% State=tracing | inactive
-%% Status=running | suspended
-%% NReason=unknown_node | already_connected | down
-%% (Re)starts the inviso runtime components at Nodes. Depending on its state
-%% (new,idle or tracing) and if the tool is running a session or not, it becomes
-%% part of the tool's ongoing session. If the newly reconnected node is not
-%% tracing but the tool runs a session, the node must be reinitiated to become
-%% tracing.
-reconnect_nodes() ->
- gen_server:call(?MODULE,{reconnect_nodes,local_runtime},?CALL_TIMEOUT).
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2005-2011. 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%
+%%
+%% Description:
+%% The inviso_tool implementation. A tool that uses inviso.
+%%
+%% Authors:
+%% Lennart Öhman, [email protected]
+%% -----------------------------------------------------------------------------
+
+-module(inviso_tool).
+
+
+%% This is the inviso tool, which is a tool using the inviso trace application.
+%% It is developed to make tracing using trace cases possible in an environment
+%% of distributed Erlang nodes.
+%% A current restriction is that the Erlang nodes are supposed to have the same
+%% code. This since inviso tool can at this point not handle subsets of nodes.
+%% Instead all participating Erlang nodes are treated the same.
+%%
+%% The main functionality of the inviso tool are:
+%%
+%% (1) Handles start and stop of tracing at participating nodes.
+%% (2) Interprets trace-case files at a distributed network level.
+%% (The inviso runtime component is responsible for interpreting
+%% trace cases at a local level, if run in an autostart).
+%% (3) Keeps a command history log from which:
+%% (a) Sequences easily can be repeated.
+%% (b) Autostart configuration files can be created (understood by the
+%% default inviso autostart mechanism).
+%% (4) Performs reactivation in case tracing is suspended (manually or by
+%% an overload mechanism).
+%% (5) Can reconnect crashed nodes and by using the history bringing them
+%% up to speed.
+
+%% Distributed Erlang
+%% ------------------
+%% Inviso is built to run in a distributed environment.
+%% The inviso tool can also be used in a non distributed environment.
+
+%% Short description
+%% -----------------
+%% Start-up of the inviso tool
+%% During the start-up of the tool, the tool starts runtime components at
+%% all participating nodes. A runtime component can already be running at
+%% a particular node and will then simply be adopted.
+%%
+%% Session
+%% A session is said to start when tracing is initiated, and ends when
+%% made to stop by the user. When a session is stopped, tracing is stopped
+%% at all participating nodes. Note that participating nodes may come and
+%% go though the time-frame of a session. That means that if a node is
+%% reconnected it may resume its tracing in the current session through
+%% a 'restart_session'. A runtime component that is already tracing at the
+%% time start-session will simply be part of the session without its
+%% ingoing tracing being changed.
+%%
+%% Reactivation
+%% A node that is suspended can be reactivated to resume tracing. Note that
+%% tracing has in this situation never been stopped at the node in question.
+%% The inviso tool resumes the node and applies the history to it.
+%%
+%% Reconnect
+%% A node that is "down" from the inviso tool's perspective can be
+%% reconnected. During reconnection the tool restarts the runtime component
+%% at that node but does not (re)initiate tracing. The latter is called
+%% restart_session and must be done explicitly, unless the node in question
+%% is in fact already tracing. If the node is already tracing (due to an autostart
+%% for instance), it automatically becomes part of the ongoing session (if
+%% there is an ongoing session).
+%%
+%% Restart Session
+%% A node that has been down and has been reconnected can be made to
+%% initialize and resume its tracing. This is done by starting the session
+%% at the node in question and redoing the current history.
+
+%% Trace files within a session
+%% Since it is possible to init-tracing (from an inviso perspective) several
+%% times within the same session, a session may leave several trace log files
+%% behind. This must be resolved by the tracer data generator function
+%% (user supplied) by marking filenames in a chronological order but still
+%% making them possible to identify as part of the same session
+
+
+
+%% -----------------------------------------------------------------------------
+%% API exports.
+%% -----------------------------------------------------------------------------
+
+-export([start/0,start/1,stop/0,stop/1]).
+-export([reconnect_nodes/0,reconnect_nodes/1,
+ start_session/0,start_session/1,
+ reinitiate_session/0,reinitiate_session/1,
+ restore_session/0,restore_session/1,restore_session/2,
+ stop_session/0,
+ reset_nodes/0,reset_nodes/1,
+ atc/3,sync_atc/3,sync_atc/4,
+ sync_rtc/2,sync_rtc/3,
+ dtc/2,sync_dtc/2,sync_dtc/3,
+ inviso/2]).
+-export([reactivate/0,reactivate/1,
+ save_history/1,
+ get_autostart_data/1,get_autostart_data/2,
+ get_activities/0,get_node_status/0,get_node_status/1,get_session_data/0]).
+-export([flush/0,flush/1]).
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% Debug exports.
+%% -----------------------------------------------------------------------------
+
+-export([get_loopdata/0]).
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% OTP exports and call backs.
+%% -----------------------------------------------------------------------------
+
+-export([init/1,handle_call/3,handle_cast/2,handle_info/2,terminate/2]).
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% Internal exports.
+%% -----------------------------------------------------------------------------
+
+-export([tc_executer/4,reactivator_executer/6]).
+-export([std_options_generator/1]).
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% Constants.
+%% -----------------------------------------------------------------------------
+
+%% Defines the inviso function calls that shall be possible to do through the
+%% inviso API in this tool.
+-define(INVISO_CMDS,
+ [{tp,5},{tp,4},{tp,1},{tpl,5},{tpl,4},{tpl,1},
+ {ctp,1},{ctp,2},{ctp,3},{ctpl,1},{ctpl,2},{ctpl,3},
+ {tf,2},{tf,1},{ctf,2},{ctf,1},{ctf_all,0},
+ {init_tpm,4},{init_tpm,7},
+ {tpm,4},{tpm,5},{tpm,8},
+ {tpm_tracer,4},{tpm_tracer,5},{init_tpm,8},
+ {tpm_ms,5},{tpm_ms_tracer,5},
+ {ctpm_ms,4},{ctpm,3},
+ {tpm_localnames,0},{ctpm_localnames,0},
+ {tpm_globalnames,0},{ctpm_globalnames,0},
+ {ctp_all,0},
+ {suspend,1},{cancel_suspension,0}]).
+%% -----------------------------------------------------------------------------
+
+%% These inviso functions shall be included in the command history log. Others
+%% are not relevant to be redone during a recactivation, a restart session or
+%% exported to an autostart file.
+-define(INVISO_CMD_HISTORY,
+ [{tp,5},{tp,4},{tp,1},{tpl,5},{tpl,4},{tpl,1},
+ {ctp,1},{ctp,2},{ctp,3},{ctpl,1},{ctpl,2},{ctpl,3},
+ {tf,2},{tf,1},{ctf,2},{ctf,1},{ctf_all,0},
+ {init_tpm,4},{init_tpm,7},
+ {tpm,4},{tpm,5},{tpm,8},
+ {tpm_tracer,4},{tpm_tracer,5},{init_tpm,8},
+ {tpm_ms,5},{tpm_ms_tracer,5},
+ {ctpm_ms,4},{ctpm,3},
+ {tpm_localnames,0},{ctpm_localnames,0},
+ {tpm_globalnames,0},{ctpm_globalnames,0},
+ {ctp_all,0}]).
+%% -----------------------------------------------------------------------------
+
+%% Since many function calls to inviso may take long time, especially if they
+%% involve difficult and many trace patterns to set, the default gen_server:call
+%% time out can not be used. We just do not want to get stuck for ever if some
+%% error occurs.
+-define(CALL_TIMEOUT,60000).
+
+%% Default max time to wait for a trace case called synchronously to return.
+-define(SYNC_TC_TIMEOUT,10000).
+
+%% Runtime components shall terminate when the tool terminates.
+-define(DEFAULT_DEPENDENCY,{dependency,0}).
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% Record definitions.
+%% -----------------------------------------------------------------------------
+
+%% The loopdata record.
+-record(ld,{
+ dir=".", % Working dir of the tool.
+ nodes=down, % The nodesD database, defaults to non-distr.
+ c_node, % Location of inviso_c.
+ c_pid, % The inviso control component.
+ regexp_node, % Node for regexp expansions.
+ tc_dict, % Trace case definition db.
+ chl, % Command history log.
+ session_state=passive, % passive | tracing
+ tdg={inviso_tool_lib,std_tdg,[]}, % Tracer data generator func.
+ tracer_data, % Current session nr and TDGargs.
+ reactivators=[], % Pids of now running reactivators.
+ tc_def_file, % Trace case definition file.
+ optg={?MODULE,std_options_generator,[]}, % Generates options to add_nodes/3.
+ initial_tcs=[], % Initial trace cases.
+ started_initial_tcs=[], % Cases that must be stopped when stop_tracing.
+ history_dir, % File path for history file.
+ keep_nodes=[], % Nodes that shall not be cleared when stopping.
+ debug=false % Internal debug mode
+ }).
+%% -----------------------------------------------------------------------------
+
+
+%% =============================================================================
+%% API
+%% =============================================================================
+
+%% start()={ok,Pid} | {error,{already_started,pid()}}
+%% start(Config)
+%% Config=[{Opt,Value},...], list of tuple options.
+%% Opt=dir|nodes|c_node|regexp_node|tdg|tc_def_file|optg|initial_tcs|
+%% history_dir|keep_nodes
+%% Starts the inviso_tool process. Options in Config are the same as those
+%% which are kept in the #ld structure.
+start() ->
+ start([]).
+start(Config) ->
+ gen_server:start({local,?MODULE},?MODULE,Config,[]).
+%% -----------------------------------------------------------------------------
+
+%% stop(UntouchedNodes)=
+%% stop()={ok,NodeResults} | NodeResult | {error,Reason}
+%% UntouchedNodes=list(), nodes where any trace patterns shall not be removed.
+%% NodeResults=[{Node,NodeResult},...]
+%% NodeResult=ok | {error,Reason} | patterns_untouched
+%% Stops the inviso tool and the inviso control component. Runtime components are
+%% stopped by them selves depending on their dependcy of the control component.
+%% All runtime components that are not marked as to be kept will have their
+%% trace patterns cleared before the inviso control component is shutdown.
+%% The NodeResults indicates which nodes were successfullt handled.
+stop() ->
+ stop([]).
+stop(UntouchedNodes) ->
+ gen_server:call(?MODULE,{stop,UntouchedNodes},?CALL_TIMEOUT).
+%% -----------------------------------------------------------------------------
+
+%% reconnect_nodes()=NodeResult; function for the nod-distributed case.
+%% reconnect_nodes(Nodes)={ok,NodesResults}
+%% NodesResults=[{Node,NodeResult},...]
+%% NodeResult={ok,{State,Status}} | {error,NReason}
+%% State=tracing | inactive
+%% Status=running | suspended
+%% NReason=unknown_node | already_connected | down
+%% (Re)starts the inviso runtime components at Nodes. Depending on its state
+%% (new,idle or tracing) and if the tool is running a session or not, it becomes
+%% part of the tool's ongoing session. If the newly reconnected node is not
+%% tracing but the tool runs a session, the node must be reinitiated to become
+%% tracing.
+reconnect_nodes() ->
+ gen_server:call(?MODULE,{reconnect_nodes,local_runtime},?CALL_TIMEOUT).
reconnect_nodes(Node) when is_atom(Node) ->
- reconnect_nodes([Node]);
+ reconnect_nodes([Node]);
reconnect_nodes(Nodes) when is_list(Nodes) ->
- gen_server:call(?MODULE,{reconnect_nodes,Nodes},?CALL_TIMEOUT).
-%% -----------------------------------------------------------------------------
-
-%% start_session()={ok,{SessionNr,InvisoReturn}} | {error,Reason}
-%% start_session(MoreTDGargs)=
-%% MoreTDGargs=list(), prepended to the fixed list of args used when calling the
-%% tracer data generator function.
-%% SessionNr=integer(), trace sessions are numbered by the tool.
-%% InvisoReturn=If successful inviso call, the returnvalue from inviso.
-%% Note that individual nodes may be unsuccessful. See inviso:init_tracing/1
-%% Initiates tracing at all participating nodes.
-start_session() ->
- start_session([]).
-start_session(MoreTDGargs) ->
- gen_server:call(?MODULE,{start_session,MoreTDGargs},?CALL_TIMEOUT).
-%% -----------------------------------------------------------------------------
-
-%% reinitiate_session(Nodes)={ok,InvisoReturn} | {error,Reason}
-%% InvisoReturn=If successful inviso call, the returnvalue from inviso:init_tracing/1.
-%% Note that individual nodes may be unsuccessful. Mentioned nodes not part
-%% of the tool or not in state inactive will be marked as failing by the
-%% tool in the InvisoReturn.
-%% To reinitate a node means to (inviso) init tracing at it according to saved
-%% tracer data generator arguments for the current session and then redo the current
-%% history to bring it up to speed. Note that the tool must be running a session
-%% for reinitiate to work.
-reinitiate_session() ->
- gen_server:call(?MODULE,{reinitiate_session,local_runtime},?CALL_TIMEOUT).
-reinitiate_session(Nodes) ->
- gen_server:call(?MODULE,{reinitiate_session,Nodes},?CALL_TIMEOUT).
-%% -----------------------------------------------------------------------------
-
-%% restore_session()=
-%% restore_session(MoreTDGargs)=
-%% restore_session(FileName)=
-%% restore_session(FileName,MoreTDGargs)={ok,{SessionNr,InvisoReturn}} | {error,Reason}
-%% The two first clauses will start a new session using the last history. This
-%% implies that there must have been a session running prior.
-%% The two last clauses starts a session and reads a history file and executes the
-%% tracecases in it at all inactive nodes.
-%% In both cases the reused or read history becomes the current histoy, just if the
-%% session had been initiated manually. The tool may not
-%% have a session ongoing, and nodes already tracing (nodes which were adopted)
-%% are not effected. Just like when starting a session manually.
-restore_session() ->
- restore_session([]).
-restore_session([]) -> % This cant be a filename.
- gen_server:call(?MODULE,{restore_session,[]},?CALL_TIMEOUT);
-restore_session(FileNameOrMoreTDGargs) ->
- case is_string(FileNameOrMoreTDGargs) of
- true -> % Interpret it as a filename.
- restore_session(FileNameOrMoreTDGargs,[]);
- false -> % The we want to use last session history!
- gen_server:call(?MODULE,{restore_session,FileNameOrMoreTDGargs},?CALL_TIMEOUT)
- end.
-restore_session(FileName,MoreTDGargs) ->
- gen_server:call(?MODULE,{restore_session,{FileName,MoreTDGargs}},?CALL_TIMEOUT).
-%% -----------------------------------------------------------------------------
-
-%% stop_session()={ok,{SessionNr,Result}} | {error,Reason}
-%% SessionNr=integer()
-%% Result=[{Node,NodeResult},...] | NonDistributedNodeResult
-%% NodeResult=ok | {error,Reason}
-%% NonDistributedNodeResult=[ok] | []
-%% Stops inviso tracing at all participating nodes. The inviso runtime components
-%% will go to state idle. It is now time to fetch the logfiles. Will most often
-%% succeed. Will only return an error if the entire inviso call returned an
-%% error. Not if an individual node failed stop tracing successfully.
-%% Any running trace case, including reactivator processes will be terminated.
-stop_session() ->
- gen_server:call(?MODULE,stop_session,?CALL_TIMEOUT).
-%% -----------------------------------------------------------------------------
-
-%% reset_nodes()=NodeResult | {error,Reason}
-%% reset_nodes(Nodes)={ok,NodeResults} | {error,Reason}
-%% NodeResults and NodeResult as returned by inviso:clear/1 and /0.
-%% Clear nodes from trace flags, trace patterns and meta trace patterns. The tool
-%% must not be having a running session.
-reset_nodes() ->
- gen_server:call(?MODULE,{reset_nodes,local_runtime},?CALL_TIMEOUT).
-reset_nodes(Nodes) ->
- gen_server:call(?MODULE,{reset_nodes,Nodes},?CALL_TIMEOUT).
-%% -----------------------------------------------------------------------------
-
-%% atc(TC,Id,Vars)=ok | {error,Reason}
-%% TC=atom(), name of the trace case.
-%% Id=term(), given name of this usage of TC.
-%% Vars=list(), list of variable bindings [{Var,Value},...], Var=atom(),Value=term().
-%% Function activating a trace case. The trace case must be defined in the
-%% trace case dictionary. The 'ok' return value is only a signal that the
-%% trace case has started successfully. It may then run for as long as it is
-%% programmed to run. An erroneous return value does not necessarily mean that
-%% the trace case has not been executed. It rather means that is undetermined
-%% what happend.
-atc(TC,Id,Vars) ->
- gen_server:call(?MODULE,{atc,{TC,Id,Vars}},?CALL_TIMEOUT).
-%% -----------------------------------------------------------------------------
-
-%% sync_atc(TC,Id,Vars)=Result | {error,Reason}
-%% sync_atc(TC,Id,Vars,TimeOut)=
-%% Result=term(), what ever is returned be the last expression in the trace case.
-%% TimeOut=interger() | infinity, the max wait time for the trace case to finnish.
-%% As atc/3 but waits for the trace case to finish.
-sync_atc(TC,Id,Vars) ->
- gen_server:call(?MODULE,{sync_atc,{TC,Id,Vars,?SYNC_TC_TIMEOUT}},?CALL_TIMEOUT).
-sync_atc(TC,Id,Vars,TimeOut) ->
- gen_server:call(?MODULE,{sync_atc,{TC,Id,Vars,TimeOut}},?CALL_TIMEOUT).
-%% -----------------------------------------------------------------------------
-
-%% sync_rtc(TC,Vars)=Result | {error,Reason}
-%% sync_rtc(TC,Vars,TimeOut)=
-%% Result=term(), what ever is returned be the last expression in the trace case.
-%% TimeOut=interger() | infinity, the max wait time for the trace case to finnish.
-%% As sync_atc/3 but the trace case is not marked as activated. It is mearly placed
-%% in the history. Hence with sync_rtc a trace case can be "activated" multiple time.
-sync_rtc(TC,Vars) ->
- gen_server:call(?MODULE,{sync_rtc,{TC,Vars,?SYNC_TC_TIMEOUT}},?CALL_TIMEOUT).
-sync_rtc(TC,Vars,TimeOut) ->
- gen_server:call(?MODULE,{sync_rtc,{TC,Vars,TimeOut}},?CALL_TIMEOUT).
-%% -----------------------------------------------------------------------------
-
-%% dtc(TC,Id)=ok | {error,Reason}
-%% Deactivates a previosly activated trace case. This function can only be used
-%% on trace cases that has a deactivation defined in the trace case dictionary.
-%% There is of course really no difference between a file containing an activation
-%% compared to a deactivation. But to be able cancelling activations out from the
-%% history log, a defined deactivation is essential.
-%% As with activation, the returned 'ok' simply indicates the start of the trace
-%% case.
-dtc(TC,Id) ->
- gen_server:call(?MODULE,{dtc,{TC,Id}},?CALL_TIMEOUT).
-%% -----------------------------------------------------------------------------
-
-%% sync_dtc(TC,Id)=Result | {error,Reason}
-%% sync_dtc(TC,Id,TimeOut)=
-%% Synchronous deactivation of trace case. See dtc/2 and sync_atc/3 for
-%% parameters.
-sync_dtc(TC,Id) ->
- gen_server:call(?MODULE,{sync_dtc,{TC,Id,?SYNC_TC_TIMEOUT}},?CALL_TIMEOUT).
-sync_dtc(TC,Id,TimeOut) ->
- gen_server:call(?MODULE,{sync_dtc,{TC,Id,TimeOut}},?CALL_TIMEOUT).
-%% -----------------------------------------------------------------------------
-
-%% inviso(Cmd,Args)=Result
-%% Cmd=atom(), the (inviso) function name that shall be called.
-%% Args=list(), the arguments to Cmd.
-%% Result=term(), the result from the inviso function call.
-%% This function executes a Cmd in the inviso tool context. The inviso call will
-%% be logged in history log and thereby repeated in case of a reactivation.
-%% Note that this function is intended for use with inviso function API without
-%% specifying any nodes, since the function call is supposed to be carried out on
-%% all nodes.
-%% When these functions are written to an autostart config file by the tool there
-%% is supposed to be a translation to inviso_rt functions.
-inviso(Cmd,Args) ->
- gen_server:call(?MODULE,{inviso,{Cmd,Args}},?CALL_TIMEOUT).
-%% -----------------------------------------------------------------------------
-
-%% reactivate()=ok | {error,Reason}
-%% reactivate(Node)=ok | {error,Reason}
-%% Moves a runtime component from suspended to the state running. This can be
-%% done for both tracing and inactive nodes. The later is necessary since you
-%% may have stopped tracing with a node suspended.
-%% In case the node is tracing, commands in the command history log are redone at
-%% the node in questions.
-%% Note that this function returns 'ok' before the node is running. This because the
-%% the reactivated history is done by a separate process and there is no guarantee
-%% when it will be ready. The reactivated node will not be marked as running in
-%% the tool until done reactivating.
-%% Further it is important to understand that if there are "ongoing" tracecases
-%% (i.e tracecase scripts that are currently executing) and this node was running
-%% at the time that tracecase script started to execute, the list of nodes bound
-%% to the Nodes variable in that script executer includes this node. Making it
-%% no longer suspended makes it start executing inviso commands from where ever
-%% such are called. Hence the reactivation may be interferred by that tracecase.
-reactivate() -> % Non-distributed API.
- reactivate(node()).
-reactivate(Node) ->
- gen_server:call(?MODULE,{reactivate,Node},?CALL_TIMEOUT).
-%% -----------------------------------------------------------------------------
-
-%% save_history(FileName)={ok,AbsFileName} | {error,Reason}
-%% Saves the currently collected command history log to a file. The file will
-%% be a binary-file. If FileName is an absolute path, it will be saved to that
-%% file. Otherwise the history dir will be used. If no history dir was specified
-%% the tool dir will be used, prepended to FileName.
-save_history(FileName) ->
- gen_server:call(?MODULE,{save_history,FileName},?CALL_TIMEOUT).
-%% -----------------------------------------------------------------------------
-
-%% get_autostart_data(Nodes,Dependency)={ok,{AutoStartData,NodeResults} |
-%% {ok,{AutoStartData,NodeResult}} | {error,Reason}
-%% Dependency=inviso dependency parameter which will be used for every
-%% autostarted runtime component (included in Options).
-%% NodeResults=[{Node,NodeResult},...]
-%% NodeResult={ok,{Options,{tdg,{M,F,CompleteTDGargs}}}} | {error,Reason}
-%% Options=add_nodes options to the inviso runtime component.
-%% M,F=atom(), the module and function for tracerdata generation.
-%% CompleteTDGargs=list(), all arguments as they are given to the tracer
-%% data generator function.
-%% AutostartData=[CaseSpec,...]
-%% CaseSpec={file,{FileName,Bindings}} | {mfa,{M,F,Args}}
-%% FileName=string(), pointing out the trace case file. Note that this
-%% is the same as the path used by the tool.
-%% Bindings=Var bindings used according to the history for the
-%% invocation.
-%% M,F=atom(), the function that shall be called (normally some inviso).
-%% Args=list(), the actual arguments. Note that this may contain things
-%% which can not be written to file (ports, pids,...).
-%% Function returning information on how to autostart a node to make it trace
-%% according to the current history. The inviso_tool does not know how to write
-%% the necessary files at the nodes in question. That must be done by the user
-%% of the tool, guided by the return value from this function.
-%% Note that there will be two types of trace case files. Regular trace case
-%% files and binaries returned from this function. The latter contains the
-%% inviso commands which have been executed. Note that the order amongst the
-%% trace cases and binaries is of importance (otherwise they will be redone in
-%% an incorrect order).
-get_autostart_data(Dependency) ->
- gen_server:call(?MODULE,{get_autostart_data,Dependency},?CALL_TIMEOUT).
-get_autostart_data(Nodes,Dependency) ->
- gen_server:call(?MODULE,{get_autostart_data,{Nodes,Dependency}},?CALL_TIMEOUT).
-%% -----------------------------------------------------------------------------
-
-%% get_activities()={ok,Ongoing} | {error,Reason}
-%% Ongoing=list(); [ [TraceCases] [,Reactivators] ]
-%% TraceCases={tracecases,TraceCaseList}
-%% TraceCaseList=[{{TCname,Id},Phase},...]
-%% Phase=activating | deactivating
-%% Reactivators={reactivating_nodes,ReactivatingNodes}
-%% ReactivatingNodes=[Node,...]
-%% Returns a list of assynchronous tracecases and nodes doing reactivation at
-%% this momement. This can be useful to implement "home brewn" synchronization,
-%% waiting for the runtime components to reach a certain state.
-get_activities() ->
- gen_server:call(?MODULE,get_activities,?CALL_TIMEOUT).
-%% -----------------------------------------------------------------------------
-
-%% get_status(Node)={ok,StateStatus} | {error,Reason}
-%% StateStatus={State,Status} | reactivating | down
-%% State=tracing | inactive | trace_failure
-%% Status=running | suspended
-get_node_status() ->
- get_node_status(local_runtime).
-get_node_status(Node) ->
- gen_server:call(?MODULE,{get_node_status,Node},?CALL_TIMEOUT).
-%% -----------------------------------------------------------------------------
-
-%% get_session_data()={ok,{Status,SessionNr,TDGargs}} | {error,Reason}
-%% Status=tracing | not_tracing, info about current/last session.
-%% SessionNr=integer()
-%% TDGargs=list(), list of the arguments that will be given to the tracer data
-%% generator function (not including the leading Nodes list).
-%% Returns data about the current or last session.
-get_session_data() ->
- gen_server:call(?MODULE,get_session_data,?CALL_TIMEOUT).
-%% -----------------------------------------------------------------------------
-
-%% flush()={ok,NodeResults} | NodeResult | {error,Reason}
-%% flush(Nodes)={ok,NodesResults} | {error,Reason}
-%% NodeResults=[{Node,NodeResult},...]
-%% NodeResult=ok | {error,Reason}
-%% Makes runtime components flush their trace ports.
-flush() ->
- gen_server:call(?MODULE,flush,?CALL_TIMEOUT).
-flush(Nodes) ->
- gen_server:call(?MODULE,{flush,Nodes},?CALL_TIMEOUT).
-%% -----------------------------------------------------------------------------
-
-%% get_loopdata()=#ld
-%% Debug API returning the internal loopdata structure. See #ld above for details.
-get_loopdata() ->
- gen_server:call(?MODULE,get_loopdata,?CALL_TIMEOUT).
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% Internal APIs.
-%% -----------------------------------------------------------------------------
-
-%% tc_executer_reply(To,Reply)=nothing significant
-%% To=pid()
-%% Reply=term()
-%% Internal API used by a trace case executer process to signal its completion.
-tc_executer_reply(To,Reply) ->
- gen_server:cast(To,{tc_executer_reply,Reply}).
-%% -----------------------------------------------------------------------------
-
-%% Internal API used by a reactivator process indicating it is done with the
-%% history log it has got so far.
-%% Timeout set to infinity since the tool may be busy, then the reactivator just
-%% have to wait. If the tool crashes the reactivator will be go down too automatically.
-reactivator_reply(TPid,Counter) ->
- gen_server:call(TPid,{reactivator_reply,{Counter,self()}},infinity).
-%% -----------------------------------------------------------------------------
-
-
-%% =============================================================================
-%% gen_server implementation.
-%% =============================================================================
-
-init(Config) ->
- case fetch_configuration(Config) of % From conf-file and Config.
+ gen_server:call(?MODULE,{reconnect_nodes,Nodes},?CALL_TIMEOUT).
+%% -----------------------------------------------------------------------------
+
+%% start_session()={ok,{SessionNr,InvisoReturn}} | {error,Reason}
+%% start_session(MoreTDGargs)=
+%% MoreTDGargs=list(), prepended to the fixed list of args used when calling the
+%% tracer data generator function.
+%% SessionNr=integer(), trace sessions are numbered by the tool.
+%% InvisoReturn=If successful inviso call, the returnvalue from inviso.
+%% Note that individual nodes may be unsuccessful. See inviso:init_tracing/1
+%% Initiates tracing at all participating nodes.
+start_session() ->
+ start_session([]).
+start_session(MoreTDGargs) ->
+ gen_server:call(?MODULE,{start_session,MoreTDGargs},?CALL_TIMEOUT).
+%% -----------------------------------------------------------------------------
+
+%% reinitiate_session(Nodes)={ok,InvisoReturn} | {error,Reason}
+%% InvisoReturn=If successful inviso call, the returnvalue from inviso:init_tracing/1.
+%% Note that individual nodes may be unsuccessful. Mentioned nodes not part
+%% of the tool or not in state inactive will be marked as failing by the
+%% tool in the InvisoReturn.
+%% To reinitate a node means to (inviso) init tracing at it according to saved
+%% tracer data generator arguments for the current session and then redo the current
+%% history to bring it up to speed. Note that the tool must be running a session
+%% for reinitiate to work.
+reinitiate_session() ->
+ gen_server:call(?MODULE,{reinitiate_session,local_runtime},?CALL_TIMEOUT).
+reinitiate_session(Nodes) ->
+ gen_server:call(?MODULE,{reinitiate_session,Nodes},?CALL_TIMEOUT).
+%% -----------------------------------------------------------------------------
+
+%% restore_session()=
+%% restore_session(MoreTDGargs)=
+%% restore_session(FileName)=
+%% restore_session(FileName,MoreTDGargs)={ok,{SessionNr,InvisoReturn}} | {error,Reason}
+%% The two first clauses will start a new session using the last history. This
+%% implies that there must have been a session running prior.
+%% The two last clauses starts a session and reads a history file and executes the
+%% tracecases in it at all inactive nodes.
+%% In both cases the reused or read history becomes the current histoy, just if the
+%% session had been initiated manually. The tool may not
+%% have a session ongoing, and nodes already tracing (nodes which were adopted)
+%% are not effected. Just like when starting a session manually.
+restore_session() ->
+ restore_session([]).
+restore_session([]) -> % This cant be a filename.
+ gen_server:call(?MODULE,{restore_session,[]},?CALL_TIMEOUT);
+restore_session(FileNameOrMoreTDGargs) ->
+ case is_string(FileNameOrMoreTDGargs) of
+ true -> % Interpret it as a filename.
+ restore_session(FileNameOrMoreTDGargs,[]);
+ false -> % The we want to use last session history!
+ gen_server:call(?MODULE,{restore_session,FileNameOrMoreTDGargs},?CALL_TIMEOUT)
+ end.
+restore_session(FileName,MoreTDGargs) ->
+ gen_server:call(?MODULE,{restore_session,{FileName,MoreTDGargs}},?CALL_TIMEOUT).
+%% -----------------------------------------------------------------------------
+
+%% stop_session()={ok,{SessionNr,Result}} | {error,Reason}
+%% SessionNr=integer()
+%% Result=[{Node,NodeResult},...] | NonDistributedNodeResult
+%% NodeResult=ok | {error,Reason}
+%% NonDistributedNodeResult=[ok] | []
+%% Stops inviso tracing at all participating nodes. The inviso runtime components
+%% will go to state idle. It is now time to fetch the logfiles. Will most often
+%% succeed. Will only return an error if the entire inviso call returned an
+%% error. Not if an individual node failed stop tracing successfully.
+%% Any running trace case, including reactivator processes will be terminated.
+stop_session() ->
+ gen_server:call(?MODULE,stop_session,?CALL_TIMEOUT).
+%% -----------------------------------------------------------------------------
+
+%% reset_nodes()=NodeResult | {error,Reason}
+%% reset_nodes(Nodes)={ok,NodeResults} | {error,Reason}
+%% NodeResults and NodeResult as returned by inviso:clear/1 and /0.
+%% Clear nodes from trace flags, trace patterns and meta trace patterns. The tool
+%% must not be having a running session.
+reset_nodes() ->
+ gen_server:call(?MODULE,{reset_nodes,local_runtime},?CALL_TIMEOUT).
+reset_nodes(Nodes) ->
+ gen_server:call(?MODULE,{reset_nodes,Nodes},?CALL_TIMEOUT).
+%% -----------------------------------------------------------------------------
+
+%% atc(TC,Id,Vars)=ok | {error,Reason}
+%% TC=atom(), name of the trace case.
+%% Id=term(), given name of this usage of TC.
+%% Vars=list(), list of variable bindings [{Var,Value},...], Var=atom(),Value=term().
+%% Function activating a trace case. The trace case must be defined in the
+%% trace case dictionary. The 'ok' return value is only a signal that the
+%% trace case has started successfully. It may then run for as long as it is
+%% programmed to run. An erroneous return value does not necessarily mean that
+%% the trace case has not been executed. It rather means that is undetermined
+%% what happend.
+atc(TC,Id,Vars) ->
+ gen_server:call(?MODULE,{atc,{TC,Id,Vars}},?CALL_TIMEOUT).
+%% -----------------------------------------------------------------------------
+
+%% sync_atc(TC,Id,Vars)=Result | {error,Reason}
+%% sync_atc(TC,Id,Vars,TimeOut)=
+%% Result=term(), what ever is returned be the last expression in the trace case.
+%% TimeOut=interger() | infinity, the max wait time for the trace case to finnish.
+%% As atc/3 but waits for the trace case to finish.
+sync_atc(TC,Id,Vars) ->
+ gen_server:call(?MODULE,{sync_atc,{TC,Id,Vars,?SYNC_TC_TIMEOUT}},?CALL_TIMEOUT).
+sync_atc(TC,Id,Vars,TimeOut) ->
+ gen_server:call(?MODULE,{sync_atc,{TC,Id,Vars,TimeOut}},?CALL_TIMEOUT).
+%% -----------------------------------------------------------------------------
+
+%% sync_rtc(TC,Vars)=Result | {error,Reason}
+%% sync_rtc(TC,Vars,TimeOut)=
+%% Result=term(), what ever is returned be the last expression in the trace case.
+%% TimeOut=interger() | infinity, the max wait time for the trace case to finnish.
+%% As sync_atc/3 but the trace case is not marked as activated. It is mearly placed
+%% in the history. Hence with sync_rtc a trace case can be "activated" multiple time.
+sync_rtc(TC,Vars) ->
+ gen_server:call(?MODULE,{sync_rtc,{TC,Vars,?SYNC_TC_TIMEOUT}},?CALL_TIMEOUT).
+sync_rtc(TC,Vars,TimeOut) ->
+ gen_server:call(?MODULE,{sync_rtc,{TC,Vars,TimeOut}},?CALL_TIMEOUT).
+%% -----------------------------------------------------------------------------
+
+%% dtc(TC,Id)=ok | {error,Reason}
+%% Deactivates a previosly activated trace case. This function can only be used
+%% on trace cases that has a deactivation defined in the trace case dictionary.
+%% There is of course really no difference between a file containing an activation
+%% compared to a deactivation. But to be able cancelling activations out from the
+%% history log, a defined deactivation is essential.
+%% As with activation, the returned 'ok' simply indicates the start of the trace
+%% case.
+dtc(TC,Id) ->
+ gen_server:call(?MODULE,{dtc,{TC,Id}},?CALL_TIMEOUT).
+%% -----------------------------------------------------------------------------
+
+%% sync_dtc(TC,Id)=Result | {error,Reason}
+%% sync_dtc(TC,Id,TimeOut)=
+%% Synchronous deactivation of trace case. See dtc/2 and sync_atc/3 for
+%% parameters.
+sync_dtc(TC,Id) ->
+ gen_server:call(?MODULE,{sync_dtc,{TC,Id,?SYNC_TC_TIMEOUT}},?CALL_TIMEOUT).
+sync_dtc(TC,Id,TimeOut) ->
+ gen_server:call(?MODULE,{sync_dtc,{TC,Id,TimeOut}},?CALL_TIMEOUT).
+%% -----------------------------------------------------------------------------
+
+%% inviso(Cmd,Args)=Result
+%% Cmd=atom(), the (inviso) function name that shall be called.
+%% Args=list(), the arguments to Cmd.
+%% Result=term(), the result from the inviso function call.
+%% This function executes a Cmd in the inviso tool context. The inviso call will
+%% be logged in history log and thereby repeated in case of a reactivation.
+%% Note that this function is intended for use with inviso function API without
+%% specifying any nodes, since the function call is supposed to be carried out on
+%% all nodes.
+%% When these functions are written to an autostart config file by the tool there
+%% is supposed to be a translation to inviso_rt functions.
+inviso(Cmd,Args) ->
+ gen_server:call(?MODULE,{inviso,{Cmd,Args}},?CALL_TIMEOUT).
+%% -----------------------------------------------------------------------------
+
+%% reactivate()=ok | {error,Reason}
+%% reactivate(Node)=ok | {error,Reason}
+%% Moves a runtime component from suspended to the state running. This can be
+%% done for both tracing and inactive nodes. The later is necessary since you
+%% may have stopped tracing with a node suspended.
+%% In case the node is tracing, commands in the command history log are redone at
+%% the node in questions.
+%% Note that this function returns 'ok' before the node is running. This because the
+%% the reactivated history is done by a separate process and there is no guarantee
+%% when it will be ready. The reactivated node will not be marked as running in
+%% the tool until done reactivating.
+%% Further it is important to understand that if there are "ongoing" tracecases
+%% (i.e tracecase scripts that are currently executing) and this node was running
+%% at the time that tracecase script started to execute, the list of nodes bound
+%% to the Nodes variable in that script executer includes this node. Making it
+%% no longer suspended makes it start executing inviso commands from where ever
+%% such are called. Hence the reactivation may be interferred by that tracecase.
+reactivate() -> % Non-distributed API.
+ reactivate(node()).
+reactivate(Node) ->
+ gen_server:call(?MODULE,{reactivate,Node},?CALL_TIMEOUT).
+%% -----------------------------------------------------------------------------
+
+%% save_history(FileName)={ok,AbsFileName} | {error,Reason}
+%% Saves the currently collected command history log to a file. The file will
+%% be a binary-file. If FileName is an absolute path, it will be saved to that
+%% file. Otherwise the history dir will be used. If no history dir was specified
+%% the tool dir will be used, prepended to FileName.
+save_history(FileName) ->
+ gen_server:call(?MODULE,{save_history,FileName},?CALL_TIMEOUT).
+%% -----------------------------------------------------------------------------
+
+%% get_autostart_data(Nodes,Dependency)={ok,{AutoStartData,NodeResults} |
+%% {ok,{AutoStartData,NodeResult}} | {error,Reason}
+%% Dependency=inviso dependency parameter which will be used for every
+%% autostarted runtime component (included in Options).
+%% NodeResults=[{Node,NodeResult},...]
+%% NodeResult={ok,{Options,{tdg,{M,F,CompleteTDGargs}}}} | {error,Reason}
+%% Options=add_nodes options to the inviso runtime component.
+%% M,F=atom(), the module and function for tracerdata generation.
+%% CompleteTDGargs=list(), all arguments as they are given to the tracer
+%% data generator function.
+%% AutostartData=[CaseSpec,...]
+%% CaseSpec={file,{FileName,Bindings}} | {mfa,{M,F,Args}}
+%% FileName=string(), pointing out the trace case file. Note that this
+%% is the same as the path used by the tool.
+%% Bindings=Var bindings used according to the history for the
+%% invocation.
+%% M,F=atom(), the function that shall be called (normally some inviso).
+%% Args=list(), the actual arguments. Note that this may contain things
+%% which can not be written to file (ports, pids,...).
+%% Function returning information on how to autostart a node to make it trace
+%% according to the current history. The inviso_tool does not know how to write
+%% the necessary files at the nodes in question. That must be done by the user
+%% of the tool, guided by the return value from this function.
+%% Note that there will be two types of trace case files. Regular trace case
+%% files and binaries returned from this function. The latter contains the
+%% inviso commands which have been executed. Note that the order amongst the
+%% trace cases and binaries is of importance (otherwise they will be redone in
+%% an incorrect order).
+get_autostart_data(Dependency) ->
+ gen_server:call(?MODULE,{get_autostart_data,Dependency},?CALL_TIMEOUT).
+get_autostart_data(Nodes,Dependency) ->
+ gen_server:call(?MODULE,{get_autostart_data,{Nodes,Dependency}},?CALL_TIMEOUT).
+%% -----------------------------------------------------------------------------
+
+%% get_activities()={ok,Ongoing} | {error,Reason}
+%% Ongoing=list(); [ [TraceCases] [,Reactivators] ]
+%% TraceCases={tracecases,TraceCaseList}
+%% TraceCaseList=[{{TCname,Id},Phase},...]
+%% Phase=activating | deactivating
+%% Reactivators={reactivating_nodes,ReactivatingNodes}
+%% ReactivatingNodes=[Node,...]
+%% Returns a list of assynchronous tracecases and nodes doing reactivation at
+%% this momement. This can be useful to implement "home brewn" synchronization,
+%% waiting for the runtime components to reach a certain state.
+get_activities() ->
+ gen_server:call(?MODULE,get_activities,?CALL_TIMEOUT).
+%% -----------------------------------------------------------------------------
+
+%% get_status(Node)={ok,StateStatus} | {error,Reason}
+%% StateStatus={State,Status} | reactivating | down
+%% State=tracing | inactive | trace_failure
+%% Status=running | suspended
+get_node_status() ->
+ get_node_status(local_runtime).
+get_node_status(Node) ->
+ gen_server:call(?MODULE,{get_node_status,Node},?CALL_TIMEOUT).
+%% -----------------------------------------------------------------------------
+
+%% get_session_data()={ok,{Status,SessionNr,TDGargs}} | {error,Reason}
+%% Status=tracing | not_tracing, info about current/last session.
+%% SessionNr=integer()
+%% TDGargs=list(), list of the arguments that will be given to the tracer data
+%% generator function (not including the leading Nodes list).
+%% Returns data about the current or last session.
+get_session_data() ->
+ gen_server:call(?MODULE,get_session_data,?CALL_TIMEOUT).
+%% -----------------------------------------------------------------------------
+
+%% flush()={ok,NodeResults} | NodeResult | {error,Reason}
+%% flush(Nodes)={ok,NodesResults} | {error,Reason}
+%% NodeResults=[{Node,NodeResult},...]
+%% NodeResult=ok | {error,Reason}
+%% Makes runtime components flush their trace ports.
+flush() ->
+ gen_server:call(?MODULE,flush,?CALL_TIMEOUT).
+flush(Nodes) ->
+ gen_server:call(?MODULE,{flush,Nodes},?CALL_TIMEOUT).
+%% -----------------------------------------------------------------------------
+
+%% get_loopdata()=#ld
+%% Debug API returning the internal loopdata structure. See #ld above for details.
+get_loopdata() ->
+ gen_server:call(?MODULE,get_loopdata,?CALL_TIMEOUT).
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% Internal APIs.
+%% -----------------------------------------------------------------------------
+
+%% tc_executer_reply(To,Reply)=nothing significant
+%% To=pid()
+%% Reply=term()
+%% Internal API used by a trace case executer process to signal its completion.
+tc_executer_reply(To,Reply) ->
+ gen_server:cast(To,{tc_executer_reply,Reply}).
+%% -----------------------------------------------------------------------------
+
+%% Internal API used by a reactivator process indicating it is done with the
+%% history log it has got so far.
+%% Timeout set to infinity since the tool may be busy, then the reactivator just
+%% have to wait. If the tool crashes the reactivator will be go down too automatically.
+reactivator_reply(TPid,Counter) ->
+ gen_server:call(TPid,{reactivator_reply,{Counter,self()}},infinity).
+%% -----------------------------------------------------------------------------
+
+
+%% =============================================================================
+%% gen_server implementation.
+%% =============================================================================
+
+init(Config) ->
+ case fetch_configuration(Config) of % From conf-file and Config.
{ok,LD} when is_record(LD,ld) ->
- case start_inviso_at_c_node(LD) of
- {ok,CPid} ->
- LD2=start_runtime_components(LD),
- LD3=read_trace_case_definitions(LD2),
- process_flag(trap_exit,true),
- start_subscribe_inviso_events(LD3#ld.c_node),
- {ok,LD3#ld{c_pid=CPid}};
- {error,Reason} -> % Most likely already running.
- {stop,{error,Reason}}
- end;
- {error,Reason} ->
- {stop,{error,{start_up,Reason}}}
- end.
-%% -----------------------------------------------------------------------------
-
-%% Help function starting the inviso control component at node c_node, or "here"
-%% if it is not a distributed network.
-start_inviso_at_c_node(#ld{c_node=undefined}) -> % Non distributed case.
- case inviso:start() of
- {ok,Pid} ->
- {ok,Pid};
- {error,Reason} ->
- {error,Reason}
- end;
-start_inviso_at_c_node(#ld{c_node=CNode}) ->
- case rpc:call(CNode,inviso,start,[]) of
- {ok,Pid} ->
- {ok,Pid};
- {error,{already_started,_}} -> % A control component already started.
- {error,{inviso_control_already_running,CNode}};
- {error,Reason} ->
- {error,Reason};
- {badrpc,Reason} ->
- {error,{inviso_control_node_error,Reason}}
- end.
-%% -----------------------------------------------------------------------------
-
-%% Help function starting the runtime components at all particapting nodes.
-%% It also updates the nodes structure in the #ld to indicate which nodes where
-%% successfully started. Returns a new #ld.
-%% Note that a runtime component may actually be running at one or several nodes.
-%% This is supposed to be the result of an (wanted) autostart. Meaning that the
-%% inviso tool can not handle the situation if a runtime component is not doing
-%% what it is supposed to do. In case a runtime component is already running it
-%% will be adopted and therefore marked as running.
-start_runtime_components(LD=#ld{c_node=undefined}) ->
- start_runtime_components_2(local_runtime,undefined,LD);
-start_runtime_components(LD=#ld{c_node=CNode,nodes=NodesD}) ->
- start_runtime_components_2(get_all_nodenames_nodes(NodesD),CNode,LD).
-start_runtime_components(Nodes,LD=#ld{c_node=CNode}) ->
- start_runtime_components_2(Nodes,CNode,LD).
-
-start_runtime_components_2(local_runtime,CNode,LD=#ld{optg=OptG}) ->
- Opts=start_runtime_components_mk_opts(local_runtime,OptG),
- case inviso:add_node(mk_rt_tag(),Opts) of
- {ok,NAnsw} -> % Should be more clever really!
- NewNodesD=update_added_nodes(CNode,{ok,NAnsw},LD#ld.nodes),
- LD#ld{nodes=NewNodesD};
- {error,_Reason} ->
- LD
- end;
-start_runtime_components_2([Node|Rest],CNode,LD=#ld{optg=OptG}) ->
- Opts=start_runtime_components_mk_opts(Node,OptG),
- case rpc:call(CNode,inviso,add_nodes,[[Node],mk_rt_tag(),Opts]) of
- {ok,NodeResults} ->
- NewNodesD=update_added_nodes(CNode,NodeResults,LD#ld.nodes),
- start_runtime_components_2(Rest,CNode,LD#ld{nodes=NewNodesD});
- {error,_Reason} ->
- start_runtime_components_2(Rest,CNode,LD);
- {badrpc,_Reason} ->
- start_runtime_components_2(Rest,CNode,LD)
- end;
-start_runtime_components_2([],_,LD) ->
- LD.
-
-start_runtime_components_mk_opts(Node,{M,F,Args}) ->
- case catch apply(M,F,[Node|Args]) of
+ case start_inviso_at_c_node(LD) of
+ {ok,CPid} ->
+ LD2=start_runtime_components(LD),
+ LD3=read_trace_case_definitions(LD2),
+ process_flag(trap_exit,true),
+ start_subscribe_inviso_events(LD3#ld.c_node),
+ {ok,LD3#ld{c_pid=CPid}};
+ {error,Reason} -> % Most likely already running.
+ {stop,{error,Reason}}
+ end;
+ {error,Reason} ->
+ {stop,{error,{start_up,Reason}}}
+ end.
+%% -----------------------------------------------------------------------------
+
+%% Help function starting the inviso control component at node c_node, or "here"
+%% if it is not a distributed network.
+start_inviso_at_c_node(#ld{c_node=undefined}) -> % Non distributed case.
+ case inviso:start() of
+ {ok,Pid} ->
+ {ok,Pid};
+ {error,Reason} ->
+ {error,Reason}
+ end;
+start_inviso_at_c_node(#ld{c_node=CNode}) ->
+ case rpc:call(CNode,inviso,start,[]) of
+ {ok,Pid} ->
+ {ok,Pid};
+ {error,{already_started,_}} -> % A control component already started.
+ {error,{inviso_control_already_running,CNode}};
+ {error,Reason} ->
+ {error,Reason};
+ {badrpc,Reason} ->
+ {error,{inviso_control_node_error,Reason}}
+ end.
+%% -----------------------------------------------------------------------------
+
+%% Help function starting the runtime components at all particapting nodes.
+%% It also updates the nodes structure in the #ld to indicate which nodes where
+%% successfully started. Returns a new #ld.
+%% Note that a runtime component may actually be running at one or several nodes.
+%% This is supposed to be the result of an (wanted) autostart. Meaning that the
+%% inviso tool can not handle the situation if a runtime component is not doing
+%% what it is supposed to do. In case a runtime component is already running it
+%% will be adopted and therefore marked as running.
+start_runtime_components(LD=#ld{c_node=undefined}) ->
+ start_runtime_components_2(local_runtime,undefined,LD);
+start_runtime_components(LD=#ld{c_node=CNode,nodes=NodesD}) ->
+ start_runtime_components_2(get_all_nodenames_nodes(NodesD),CNode,LD).
+start_runtime_components(Nodes,LD=#ld{c_node=CNode}) ->
+ start_runtime_components_2(Nodes,CNode,LD).
+
+start_runtime_components_2(local_runtime,CNode,LD=#ld{optg=OptG}) ->
+ Opts=start_runtime_components_mk_opts(local_runtime,OptG),
+ case inviso:add_node(mk_rt_tag(),Opts) of
+ {ok,NAnsw} -> % Should be more clever really!
+ NewNodesD=update_added_nodes(CNode,{ok,NAnsw},LD#ld.nodes),
+ LD#ld{nodes=NewNodesD};
+ {error,_Reason} ->
+ LD
+ end;
+start_runtime_components_2([Node|Rest],CNode,LD=#ld{optg=OptG}) ->
+ Opts=start_runtime_components_mk_opts(Node,OptG),
+ case rpc:call(CNode,inviso,add_nodes,[[Node],mk_rt_tag(),Opts]) of
+ {ok,NodeResults} ->
+ NewNodesD=update_added_nodes(CNode,NodeResults,LD#ld.nodes),
+ start_runtime_components_2(Rest,CNode,LD#ld{nodes=NewNodesD});
+ {error,_Reason} ->
+ start_runtime_components_2(Rest,CNode,LD);
+ {badrpc,_Reason} ->
+ start_runtime_components_2(Rest,CNode,LD)
+ end;
+start_runtime_components_2([],_,LD) ->
+ LD.
+
+start_runtime_components_mk_opts(Node,{M,F,Args}) ->
+ case catch apply(M,F,[Node|Args]) of
{ok,Opts} when is_list(Opts) ->
- start_runtime_component_mk_opts_add_dependency(Opts);
- _ ->
- [?DEFAULT_DEPENDENCY]
- end.
-
-%% The options generator is not supposed to generate the dependency. Hence this
-%% function adds and if necessary removes an incorrectly added dependency tag.
-start_runtime_component_mk_opts_add_dependency(Opts) ->
- case lists:keysearch(dependency,1,Opts) of
- {value,_} -> % Not allowed!!!
- [?DEFAULT_DEPENDENCY|lists:keydelete(dependecy,1,Opts)];
- false ->
- [?DEFAULT_DEPENDENCY|Opts]
- end.
-%% -----------------------------------------------------------------------------
-
-%% Help function subscribing to inviso events from the inviso controller. This
-%% will make it possible to follow runtime components going down.
-start_subscribe_inviso_events(undefined) ->
- inviso:subscribe();
-start_subscribe_inviso_events(CNode) ->
- rpc:call(CNode,inviso,subscribe,[self()]). % Don't want the rpc-proc to subscribe!
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% gen_server handle call back functions.
-%% -----------------------------------------------------------------------------
-
-handle_call({stop,UntouchedNodes},_From,LD=#ld{nodes=NodesD,c_node=CNode,keep_nodes=KeepNodes})
- when is_list(UntouchedNodes) ->
- {stop,
- normal,
- remove_all_trace_patterns(CNode,
- UntouchedNodes++KeepNodes,
- get_available_nodes(NodesD)),
- LD};
-handle_call({stop,BadArg},_From,LD) ->
- {reply,{error,{badarg,BadArg}},LD};
-
-handle_call({reconnect_nodes,Nodes},_From,LD) ->
- case h_reconnect_nodes(Nodes,LD) of
- {ok,{Nodes2,NodesErr,NewLD}} ->
- if
- Nodes==local_runtime ->
- {reply,
- build_reconnect_nodes_reply(Nodes,Nodes2,NodesErr,NewLD#ld.nodes),
- NewLD};
+ start_runtime_component_mk_opts_add_dependency(Opts);
+ _ ->
+ [?DEFAULT_DEPENDENCY]
+ end.
+
+%% The options generator is not supposed to generate the dependency. Hence this
+%% function adds and if necessary removes an incorrectly added dependency tag.
+start_runtime_component_mk_opts_add_dependency(Opts) ->
+ case lists:keysearch(dependency,1,Opts) of
+ {value,_} -> % Not allowed!!!
+ [?DEFAULT_DEPENDENCY|lists:keydelete(dependecy,1,Opts)];
+ false ->
+ [?DEFAULT_DEPENDENCY|Opts]
+ end.
+%% -----------------------------------------------------------------------------
+
+%% Help function subscribing to inviso events from the inviso controller. This
+%% will make it possible to follow runtime components going down.
+start_subscribe_inviso_events(undefined) ->
+ inviso:subscribe();
+start_subscribe_inviso_events(CNode) ->
+ rpc:call(CNode,inviso,subscribe,[self()]). % Don't want the rpc-proc to subscribe!
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% gen_server handle call back functions.
+%% -----------------------------------------------------------------------------
+
+handle_call({stop,UntouchedNodes},_From,LD=#ld{nodes=NodesD,c_node=CNode,keep_nodes=KeepNodes})
+ when is_list(UntouchedNodes) ->
+ {stop,
+ normal,
+ remove_all_trace_patterns(CNode,
+ UntouchedNodes++KeepNodes,
+ get_available_nodes(NodesD)),
+ LD};
+handle_call({stop,BadArg},_From,LD) ->
+ {reply,{error,{badarg,BadArg}},LD};
+
+handle_call({reconnect_nodes,Nodes},_From,LD) ->
+ case h_reconnect_nodes(Nodes,LD) of
+ {ok,{Nodes2,NodesErr,NewLD}} ->
+ if
+ Nodes==local_runtime ->
+ {reply,
+ build_reconnect_nodes_reply(Nodes,Nodes2,NodesErr,NewLD#ld.nodes),
+ NewLD};
is_list(Nodes) ->
- {reply,
- {ok,build_reconnect_nodes_reply(Nodes,Nodes2,NodesErr,NewLD#ld.nodes)},
- NewLD}
- end;
- {error,Reason} ->
- {reply,{error,Reason},LD}
- end;
-
-handle_call({start_session,MoreTDGargs},_From,LD=#ld{session_state=SState}) ->
- case is_tracing(SState) of
- false -> % No session running.
- if
+ {reply,
+ {ok,build_reconnect_nodes_reply(Nodes,Nodes2,NodesErr,NewLD#ld.nodes)},
+ NewLD}
+ end;
+ {error,Reason} ->
+ {reply,{error,Reason},LD}
+ end;
+
+handle_call({start_session,MoreTDGargs},_From,LD=#ld{session_state=SState}) ->
+ case is_tracing(SState) of
+ false -> % No session running.
+ if
is_list(MoreTDGargs) ->
- DateTime=calendar:universal_time(),
- {M,F,Args}=LD#ld.tdg,
- TDGargs=inviso_tool_lib:mk_tdg_args(DateTime,MoreTDGargs++Args),
- case h_start_session(M,F,TDGargs,LD) of
- {ok,{SessionNr,ReturnVal,NewLD}} -> % No nodes to initiate.
- NewLD2=add_initial_tcs_to_history(NewLD#ld.initial_tcs,
- NewLD#ld{chl=mk_chl(LD#ld.chl)}),
- {reply,
- {ok,{SessionNr,ReturnVal}},
- NewLD2#ld{session_state=tracing_sessionstate()}};
- {ok,{SessionNr,ReturnVal,Nodes2,NewLD}} ->
- NewLD2=do_initial_tcs(NewLD#ld.initial_tcs,
- Nodes2,
- NewLD#ld{chl=mk_chl(LD#ld.chl)}),
- {reply,
- {ok,{SessionNr,ReturnVal}},
- NewLD2#ld{session_state=tracing_sessionstate()}};
- {error,Reason} ->
- {reply,{error,Reason},LD}
- end;
- true -> % Faulty TDGargs.
- {reply,{error,{badarg,MoreTDGargs}},LD}
- end;
- true ->
- {reply,{error,session_already_started},LD}
- end;
-
-handle_call({reinitiate_session,Nodes},_From,LD=#ld{session_state=SState}) ->
- case is_tracing(SState) of
- true -> % The tool must be tracing.
- {M,F,_Args}=LD#ld.tdg,
- TDGargs=get_latest_tdgargs_tracer_data(LD#ld.tracer_data),
- case h_reinitiate_session(Nodes,M,F,TDGargs,LD) of
- {ok,{NodesErr,ReturnVal,NewLD}} ->
- {reply,
- {ok,build_reinitiate_session_reply(Nodes,NodesErr,ReturnVal)},
- NewLD};
- {error,Reason} ->
- {reply,{error,Reason},LD}
- end;
- false -> % Must have a running session!
- {reply,{error,no_session},LD}
- end;
-
-handle_call({restore_session,{FileName,MoreTDGargs}},_From,LD=#ld{chl=OldCHL})
+ DateTime=calendar:universal_time(),
+ {M,F,Args}=LD#ld.tdg,
+ TDGargs=inviso_tool_lib:mk_tdg_args(DateTime,MoreTDGargs++Args),
+ case h_start_session(M,F,TDGargs,LD) of
+ {ok,{SessionNr,ReturnVal,NewLD}} -> % No nodes to initiate.
+ NewLD2=add_initial_tcs_to_history(NewLD#ld.initial_tcs,
+ NewLD#ld{chl=mk_chl(LD#ld.chl)}),
+ {reply,
+ {ok,{SessionNr,ReturnVal}},
+ NewLD2#ld{session_state=tracing_sessionstate()}};
+ {ok,{SessionNr,ReturnVal,Nodes2,NewLD}} ->
+ NewLD2=do_initial_tcs(NewLD#ld.initial_tcs,
+ Nodes2,
+ NewLD#ld{chl=mk_chl(LD#ld.chl)}),
+ {reply,
+ {ok,{SessionNr,ReturnVal}},
+ NewLD2#ld{session_state=tracing_sessionstate()}};
+ {error,Reason} ->
+ {reply,{error,Reason},LD}
+ end;
+ true -> % Faulty TDGargs.
+ {reply,{error,{badarg,MoreTDGargs}},LD}
+ end;
+ true ->
+ {reply,{error,session_already_started},LD}
+ end;
+
+handle_call({reinitiate_session,Nodes},_From,LD=#ld{session_state=SState}) ->
+ case is_tracing(SState) of
+ true -> % The tool must be tracing.
+ {M,F,_Args}=LD#ld.tdg,
+ TDGargs=get_latest_tdgargs_tracer_data(LD#ld.tracer_data),
+ case h_reinitiate_session(Nodes,M,F,TDGargs,LD) of
+ {ok,{NodesErr,ReturnVal,NewLD}} ->
+ {reply,
+ {ok,build_reinitiate_session_reply(Nodes,NodesErr,ReturnVal)},
+ NewLD};
+ {error,Reason} ->
+ {reply,{error,Reason},LD}
+ end;
+ false -> % Must have a running session!
+ {reply,{error,no_session},LD}
+ end;
+
+handle_call({restore_session,{FileName,MoreTDGargs}},_From,LD=#ld{chl=OldCHL})
when is_list(MoreTDGargs) ->
- case is_tracing(LD#ld.session_state) of
- false ->
- case catch make_absolute_path(FileName,LD#ld.dir) of
+ case is_tracing(LD#ld.session_state) of
+ false ->
+ case catch make_absolute_path(FileName,LD#ld.dir) of
AbsFileName when is_list(AbsFileName) ->
- case file:read_file(AbsFileName) of
- {ok,Bin} ->
- if
+ case file:read_file(AbsFileName) of
+ {ok,Bin} ->
+ if
is_list(MoreTDGargs) ->
- case catch replace_history_chl(OldCHL,
- binary_to_term(Bin)) of
- {ok,CHL} -> % The file was well formatted.
- case h_restore_session(MoreTDGargs,
- LD#ld{chl=CHL}) of
- {ok,{SessionNr,ReturnVal,NewLD}} ->
- {reply,
- {ok,{SessionNr,ReturnVal}},
- NewLD#ld{session_state=
- tracing_sessionstate()}};
- {error,Reason} ->
- {reply,{error,Reason},LD}
- end;
- Error -> % Badly formatted file.
- {reply,
- {error,{bad_file,{AbsFileName,Error}}},
- LD}
- end;
- true ->
- {reply,{error,{badarg,MoreTDGargs}},LD}
- end;
- {error,Reason} ->
- {reply,{error,{read_file,Reason}},LD}
- end;
- Error ->
- {reply,{error,{bad_filename,{FileName,Error}}},LD}
- end;
- true ->
- {reply,{error,session_already_started},LD}
- end;
-%% This is doing restore session on the current history.
-handle_call({restore_session,MoreTDGargs},_From,LD=#ld{chl=CHL}) ->
- case is_tracing(LD#ld.session_state) of
- false ->
- case history_exists_chl(CHL) of
- true -> % There is a history to redo.
- if
+ case catch replace_history_chl(OldCHL,
+ binary_to_term(Bin)) of
+ {ok,CHL} -> % The file was well formatted.
+ case h_restore_session(MoreTDGargs,
+ LD#ld{chl=CHL}) of
+ {ok,{SessionNr,ReturnVal,NewLD}} ->
+ {reply,
+ {ok,{SessionNr,ReturnVal}},
+ NewLD#ld{session_state=
+ tracing_sessionstate()}};
+ {error,Reason} ->
+ {reply,{error,Reason},LD}
+ end;
+ Error -> % Badly formatted file.
+ {reply,
+ {error,{bad_file,{AbsFileName,Error}}},
+ LD}
+ end;
+ true ->
+ {reply,{error,{badarg,MoreTDGargs}},LD}
+ end;
+ {error,Reason} ->
+ {reply,{error,{read_file,Reason}},LD}
+ end;
+ Error ->
+ {reply,{error,{bad_filename,{FileName,Error}}},LD}
+ end;
+ true ->
+ {reply,{error,session_already_started},LD}
+ end;
+%% This is doing restore session on the current history.
+handle_call({restore_session,MoreTDGargs},_From,LD=#ld{chl=CHL}) ->
+ case is_tracing(LD#ld.session_state) of
+ false ->
+ case history_exists_chl(CHL) of
+ true -> % There is a history to redo.
+ if
is_list(MoreTDGargs) ->
- case h_restore_session(MoreTDGargs,LD) of
- {ok,{SessionNr,ReturnVal,NewLD}} ->
- {reply,
- {ok,{SessionNr,ReturnVal}},
- NewLD#ld{session_state=tracing_sessionstate()}};
- {error,Reason} ->
- {reply,{error,Reason},LD}
- end;
- true ->
- {reply,{error,{badarg,MoreTDGargs}},LD}
- end;
- false ->
- {reply,{error,no_history},LD}
- end;
- true ->
- {reply,{error,session_already_started},LD}
- end;
-
-%% To stop tracing means stop_tracing through the inviso API. But we must also
-%% remove any help processes executing inviso commands (trace case executers
-%% and reactivators).
-%% Note that to be really sure we should actually wait for EXIT-signals from those
-%% processes before returning a successful returnvalue to the caller. In theory
-%% those processes could issue an inviso call effecting a new trace session started
-%% with init_tracing shortly after the call to stop_tracing. But too complicated! :-)
-%% Further, stop-tracing is done on all nodes in our nodes structure. Regardless
-%% if the node is tracing or not
-handle_call(stop_session,_From,LD=#ld{session_state=SState,chl=CHL,reactivators=ReAct}) ->
- case is_tracing(SState) of
- true ->
- NewCHL=stop_all_tc_executer_chl(CHL), % Stop any running trace case proc.
- NewReAct=stop_all_reactivators(ReAct), % Stop any running reactivators.
- case h_stop_session(LD) of
- {ok,{SessionNr,Result}} ->
- NewNodesD=set_inactive_nodes(Result,LD#ld.nodes),
- {reply,
- {ok,{SessionNr,Result}},
- LD#ld{session_state=passive_sessionstate(),
- nodes=NewNodesD,
- chl=NewCHL,
- reactivators=NewReAct,
- started_initial_tcs=[]}};
- {error,Reason} -> % Now we're really in deep shit :-)
- {reply,{error,{unrecoverable,Reason}},LD}
- end;
- false ->
- {reply,{error,no_session},LD}
- end;
-
-handle_call({reset_nodes,Nodes},_From,LD=#ld{session_state=SState}) ->
- case is_tracing(SState) of
- false -> % We can not be in a session.
- {reply,h_reset_nodes(Nodes,LD#ld.c_node),LD};
- true ->
- {reply,{error,session_active},LD}
- end;
-
-%% Calling a trace-case, or "turning it on".
-handle_call({atc,{TC,Id,Vars}},_From,LD=#ld{session_state=SState}) ->
- case is_tracing(SState) of % Check that we are tracing now.
- true ->
- case h_atc(TC,Id,Vars,LD) of
- {ok,NewLD} -> % Trace case executed.
- {reply,ok,NewLD};
- {error,Reason} ->
- {reply,{error,Reason},LD}
- end;
- false -> % Can't activate if not tracing.
- {reply,{error,no_session},LD}
- end;
-
-handle_call({sync_atc,{TC,Id,Vars,TimeOut}},_From,LD=#ld{session_state=SState}) ->
- case is_tracing(SState) of
- true ->
- if
+ case h_restore_session(MoreTDGargs,LD) of
+ {ok,{SessionNr,ReturnVal,NewLD}} ->
+ {reply,
+ {ok,{SessionNr,ReturnVal}},
+ NewLD#ld{session_state=tracing_sessionstate()}};
+ {error,Reason} ->
+ {reply,{error,Reason},LD}
+ end;
+ true ->
+ {reply,{error,{badarg,MoreTDGargs}},LD}
+ end;
+ false ->
+ {reply,{error,no_history},LD}
+ end;
+ true ->
+ {reply,{error,session_already_started},LD}
+ end;
+
+%% To stop tracing means stop_tracing through the inviso API. But we must also
+%% remove any help processes executing inviso commands (trace case executers
+%% and reactivators).
+%% Note that to be really sure we should actually wait for EXIT-signals from those
+%% processes before returning a successful returnvalue to the caller. In theory
+%% those processes could issue an inviso call effecting a new trace session started
+%% with init_tracing shortly after the call to stop_tracing. But too complicated! :-)
+%% Further, stop-tracing is done on all nodes in our nodes structure. Regardless
+%% if the node is tracing or not
+handle_call(stop_session,_From,LD=#ld{session_state=SState,chl=CHL,reactivators=ReAct}) ->
+ case is_tracing(SState) of
+ true ->
+ NewCHL=stop_all_tc_executer_chl(CHL), % Stop any running trace case proc.
+ NewReAct=stop_all_reactivators(ReAct), % Stop any running reactivators.
+ case h_stop_session(LD) of
+ {ok,{SessionNr,Result}} ->
+ NewNodesD=set_inactive_nodes(Result,LD#ld.nodes),
+ {reply,
+ {ok,{SessionNr,Result}},
+ LD#ld{session_state=passive_sessionstate(),
+ nodes=NewNodesD,
+ chl=NewCHL,
+ reactivators=NewReAct,
+ started_initial_tcs=[]}};
+ {error,Reason} -> % Now we're really in deep shit :-)
+ {reply,{error,{unrecoverable,Reason}},LD}
+ end;
+ false ->
+ {reply,{error,no_session},LD}
+ end;
+
+handle_call({reset_nodes,Nodes},_From,LD=#ld{session_state=SState}) ->
+ case is_tracing(SState) of
+ false -> % We can not be in a session.
+ {reply,h_reset_nodes(Nodes,LD#ld.c_node),LD};
+ true ->
+ {reply,{error,session_active},LD}
+ end;
+
+%% Calling a trace-case, or "turning it on".
+handle_call({atc,{TC,Id,Vars}},_From,LD=#ld{session_state=SState}) ->
+ case is_tracing(SState) of % Check that we are tracing now.
+ true ->
+ case h_atc(TC,Id,Vars,LD) of
+ {ok,NewLD} -> % Trace case executed.
+ {reply,ok,NewLD};
+ {error,Reason} ->
+ {reply,{error,Reason},LD}
+ end;
+ false -> % Can't activate if not tracing.
+ {reply,{error,no_session},LD}
+ end;
+
+handle_call({sync_atc,{TC,Id,Vars,TimeOut}},_From,LD=#ld{session_state=SState}) ->
+ case is_tracing(SState) of
+ true ->
+ if
is_integer(TimeOut);TimeOut==infinity ->
- case h_sync_atc(TC,Id,Vars,TimeOut,LD) of
- {ok,NewLD,Result} ->
- {reply,Result,NewLD};
- {error,Reason} ->
- {reply,{error,Reason},LD}
- end;
- true ->
- {reply,{error,{badarg,TimeOut}},LD}
- end;
- false ->
- {reply,{error,no_session},LD}
- end;
-
-handle_call({sync_rtc,{TC,Vars,TimeOut}},_From,LD=#ld{session_state=SState}) ->
- case is_tracing(SState) of
- true ->
- if
+ case h_sync_atc(TC,Id,Vars,TimeOut,LD) of
+ {ok,NewLD,Result} ->
+ {reply,Result,NewLD};
+ {error,Reason} ->
+ {reply,{error,Reason},LD}
+ end;
+ true ->
+ {reply,{error,{badarg,TimeOut}},LD}
+ end;
+ false ->
+ {reply,{error,no_session},LD}
+ end;
+
+handle_call({sync_rtc,{TC,Vars,TimeOut}},_From,LD=#ld{session_state=SState}) ->
+ case is_tracing(SState) of
+ true ->
+ if
is_integer(TimeOut);TimeOut==infinity ->
- case h_sync_rtc(TC,Vars,TimeOut,LD) of
- {ok,NewLD,Result} ->
- {reply,Result,NewLD};
- {error,Reason} ->
- {reply,{error,Reason},LD}
- end;
- true ->
- {reply,{error,{badarg,TimeOut}},LD}
- end;
- false ->
- {reply,{error,no_session},LD}
- end;
-
-
-handle_call({dtc,{TC,Id}},_From,LD=#ld{session_state=SState}) ->
- case is_tracing(SState) of % Check that we are tracing now.
- true ->
- case h_dtc(TC,Id,LD) of
- {ok,NewLD} ->
- {reply,ok,NewLD};
- {error,Reason} ->
- {reply,{error,Reason},LD}
- end;
- false -> % Can't activate if not tracing.
- {reply,{error,no_session},LD}
- end;
-
-handle_call({sync_dtc,{TC,Id,TimeOut}},_From,LD=#ld{session_state=SState}) ->
- case is_tracing(SState) of % Check that we are tracing now.
- true ->
- if
+ case h_sync_rtc(TC,Vars,TimeOut,LD) of
+ {ok,NewLD,Result} ->
+ {reply,Result,NewLD};
+ {error,Reason} ->
+ {reply,{error,Reason},LD}
+ end;
+ true ->
+ {reply,{error,{badarg,TimeOut}},LD}
+ end;
+ false ->
+ {reply,{error,no_session},LD}
+ end;
+
+
+handle_call({dtc,{TC,Id}},_From,LD=#ld{session_state=SState}) ->
+ case is_tracing(SState) of % Check that we are tracing now.
+ true ->
+ case h_dtc(TC,Id,LD) of
+ {ok,NewLD} ->
+ {reply,ok,NewLD};
+ {error,Reason} ->
+ {reply,{error,Reason},LD}
+ end;
+ false -> % Can't activate if not tracing.
+ {reply,{error,no_session},LD}
+ end;
+
+handle_call({sync_dtc,{TC,Id,TimeOut}},_From,LD=#ld{session_state=SState}) ->
+ case is_tracing(SState) of % Check that we are tracing now.
+ true ->
+ if
is_integer(TimeOut);TimeOut==infinity ->
- case h_sync_dtc(TC,Id,TimeOut,LD) of
- {ok,NewLD,Result} ->
- {reply,Result,NewLD};
- {error,Reason} ->
- {reply,{error,Reason},LD}
- end;
- true ->
- {reply,{error,{badarg,TimeOut}},LD}
- end;
- false -> % Can't activate if not tracing.
- {reply,{error,no_session},LD}
- end;
-
-handle_call({inviso,{Cmd,Args}},_From,LD=#ld{session_state=SState}) ->
- case is_tracing(SState) of
- true ->
- if
+ case h_sync_dtc(TC,Id,TimeOut,LD) of
+ {ok,NewLD,Result} ->
+ {reply,Result,NewLD};
+ {error,Reason} ->
+ {reply,{error,Reason},LD}
+ end;
+ true ->
+ {reply,{error,{badarg,TimeOut}},LD}
+ end;
+ false -> % Can't activate if not tracing.
+ {reply,{error,no_session},LD}
+ end;
+
+handle_call({inviso,{Cmd,Args}},_From,LD=#ld{session_state=SState}) ->
+ case is_tracing(SState) of
+ true ->
+ if
is_list(Args) ->
- case h_inviso(Cmd,Args,LD) of
- {ok,{Reply,NewLD}} ->
- {reply,Reply,NewLD};
- {error,Reason} ->
- {reply,{error,Reason},LD}
- end;
- true ->
- {reply,{error,{badarg,Args}},LD}
- end;
- false -> % Can't do if not tracing.
- {reply,{error,no_session},LD}
- end;
-
-handle_call({reactivate,Node},_From,LD=#ld{nodes=NodesD,c_node=CNode}) ->
- case get_state_nodes(Node,NodesD) of
- {trace_failure,_} ->
- {reply,{error,trace_failure},LD};
- {State,suspended} -> % The node is infact suspended.
- case h_reactivate(Node,CNode) of
- ok ->
- case {State,is_tracing(LD#ld.session_state)} of
- {tracing,true} -> % Only then shall we redo cmds.
- {reply,ok,redo_cmd_history(Node,LD)};
- _ -> % All other just no longer suspended.
- {reply,ok,LD#ld{nodes=set_running_nodes(Node,NodesD)}}
- end;
- {error,Reason} ->
- {reply,{error,Reason},LD}
- end;
- reactivating ->
- {reply,{error,reactivating},LD};
- {_,running} ->
- {reply,{error,already_running},LD};
- down ->
- {reply,{error,not_available},LD};
- false ->
- {reply,{error,unknown_node},LD}
- end;
-
-handle_call({save_history,FileName},_From,LD=#ld{chl=CHL,dir=Dir,history_dir=HDir}) ->
- case lists:keysort(2,get_loglist_chl(CHL)) of
- [] -> % Empty history or no history.
- {reply,{error,no_history},LD};
- Log ->
- case h_save_history(HDir,Dir,FileName,Log) of
- {ok,AbsFileName} ->
- {reply,{ok,AbsFileName},LD};
- {error,Reason} ->
- {reply,{error,Reason},LD}
- end
- end;
-
-
-handle_call({get_autostart_data,{Nodes,Dependency}},_From,LD=#ld{chl=CHL}) ->
- case build_autostart_data(lists:keysort(2,get_loglist_chl(CHL)),LD#ld.tc_dict) of
- {ok,ASD} ->
- TDGargs=get_latest_tdgargs_tracer_data(LD#ld.tracer_data),
- {M,F,_}=LD#ld.tdg,
- OptsG=LD#ld.optg, % Addnodes options generator.
- {reply,
- h_get_autostart_data(Nodes,LD#ld.c_node,Dependency,ASD,M,F,TDGargs,OptsG),
- LD};
- {error,Reason} -> % Bad datatypes in command args.
- {reply,{error,Reason},LD}
- end;
-
-handle_call({get_autostart_data,Dependency},From,LD=#ld{c_node=undefined}) ->
- handle_call({get_autostart_data,{local_runtime,Dependency}},From,LD);
-handle_call({get_autostart_data,Dependency},From,LD=#ld{nodes=NodesD}) ->
- Nodes=get_all_nodenames_nodes(NodesD),
- handle_call({get_autostart_data,{local_runtime,{Nodes,Dependency}}},From,LD);
-
-handle_call(get_activities,_From,LD=#ld{chl=CHL,reactivators=Reactivators}) ->
- TraceCases=get_ongoing_chl(CHL),
- RNodes=get_all_nodes_reactivators(Reactivators),
- ReturnList1=
- if
- TraceCases==[] ->
- [];
- true ->
- [{tracecases,TraceCases}]
- end,
- ReturnList2=
- if
- RNodes==[] ->
- ReturnList1;
- true ->
- [{reactivating_nodes,RNodes}|ReturnList1]
- end,
- {reply,{ok,ReturnList2},LD};
-
-handle_call({get_node_status,Node},_Node,LD) ->
- case get_state_nodes(Node,LD#ld.nodes) of
- false ->
- {reply,{error,unknown_node},LD};
- StateStatus ->
- {reply,{ok,StateStatus},LD}
- end;
-
-handle_call(get_session_data,_From,LD=#ld{session_state=SState,tracer_data=TD}) ->
- case get_latest_session_nr_tracer_data(TD) of
- undefined ->
- {reply,{error,no_session},LD};
- SessionNr ->
- TDGargs=get_latest_tdgargs_tracer_data(TD),
- case is_tracing(SState) of
- true ->
- {reply,{ok,{tracing,SessionNr,TDGargs}},LD};
- false ->
- {reply,{ok,{not_tracing,SessionNr,TDGargs}},LD}
- end
- end;
-
-handle_call(flush,_From,LD=#ld{c_node=CNode,nodes=NodesD}) ->
- Nodes=get_tracing_nodes(NodesD),
- {reply,h_flush(CNode,Nodes),LD};
-handle_call({flush,Nodes},_From,LD=#ld{c_node=CNode}) ->
- {reply,h_flush(CNode,Nodes),LD};
-
-handle_call(get_loopdata,_From,LD) ->
- {reply,LD,LD};
-
-%% Internal handle_call callbacks.
-
-handle_call({reactivator_reply,{Counter,RPid}},_From,LD=#ld{chl=CHL}) ->
- HighestUsedCounter=get_highest_used_counter_chl(CHL),
- if
- HighestUsedCounter>Counter -> % There are now more log entries.
- NewUnsortedLog=get_loglist_chl(CHL),
- {reply,{more,NewUnsortedLog},LD};
- true -> % No Counter is youngest log entry.
- NodesD=LD#ld.nodes,
- Node=get_node_reactivators(RPid,LD#ld.reactivators),
- {reply,
- done,
- LD#ld{nodes=set_running_nodes(Node,NodesD),
- reactivators=del_reactivators(RPid,LD#ld.reactivators)}}
- end.
-%% -----------------------------------------------------------------------------
-
-%% Handling a notification from a trace case execution process. Receiving this
-%% indicated that this phase of the trace case is finnished.
-handle_cast({tc_executer_reply,{Phase,ProcH,Result}},LD) ->
- case Phase of
- activating -> % The trace case is running now.
- {ok,NewLD}=h_tc_activation_done(ProcH,Result,LD),
- {noreply,NewLD};
- stopping ->
- {ok,NewLD}=h_tc_stopping_done(ProcH,Result,LD),
- {noreply,NewLD};
- _ ->
- {noreply,LD}
- end;
-handle_cast(_,LD) ->
- {noreply,LD}.
-%% -----------------------------------------------------------------------------
-
-%% This is the case when a runtime component goes down. We stop all running
-%% reactivators for this node. Note that there can also be tracecases ongoing
-%% where this node is part of the Nodes variable. But there is not much we can
-%% do about that. Other then informing the user that it is unwise to reconnect
-%% this node before those tracecases have stopped being ongoing.
-handle_info({inviso_event,_CNode,_Time,{disconnected,Node,_}},LD) ->
- {noreply,LD#ld{nodes=set_down_nodes(Node,LD#ld.nodes),
- reactivators=stop_node_reactivators(Node,LD#ld.reactivators)}};
-
-%% This is the case when a runtime component gets suspended. Much of the same
-%% problem as described above applies.
-handle_info({inviso_event,_CNode,_Time,{state_change,Node,{_,{suspended,_}}}},LD) ->
- {noreply,LD#ld{nodes=set_suspended_nodes(Node,LD#ld.nodes),
- reactivators=stop_node_reactivators(Node,LD#ld.reactivators)}};
-
-handle_info(_,LD) ->
- {noreply,LD}.
-%% -----------------------------------------------------------------------------
-
-%% Called when the tool server stops. First clause, termination is initiated by
-%% our self and therefore controlled another way. In the second case we are
-%% stopping for some external reason, and we must then do more here in terminate/2.
-terminate(normal,#ld{c_node=CNode}) -> % This is when we are stopping our self.
- stop_inviso_at_c_node(CNode);
-terminate(_,#ld{c_node=CNode,nodes=NodesD,keep_nodes=KeepNodes}) ->
- remove_all_trace_patterns(CNode,KeepNodes,get_all_nodenames_nodes(NodesD)),
- stop_inviso_at_c_node(CNode).
-%% -----------------------------------------------------------------------------
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%% =============================================================================
-%% Handler first level help functions.
-%% =============================================================================
-
-%% -----------------------------------------------------------------------------
-%% reconnect_nodes
-%% -----------------------------------------------------------------------------
-
-%% Help function reconnecting the nodes in Nodes. Listed nodes must be part of
-%% the set of nodes handled by the tool. It is not possible to reconnect a node
-%% that is not marked as down. This partly because we otherwise risk losing the
-%% trace_failure state (which can not be rediscovered).
-h_reconnect_nodes(local_runtime,LD=#ld{nodes=NodesD}) -> % Non-distributed.
- case get_state_nodes(local_runtime,NodesD) of
- down ->
- {ok,{local_runtime,[],start_runtime_components(local_runtime,LD)}};
- _ -> % Allready connected!
- {ok,{[],{error,already_connected},LD}}
- end;
+ case h_inviso(Cmd,Args,LD) of
+ {ok,{Reply,NewLD}} ->
+ {reply,Reply,NewLD};
+ {error,Reason} ->
+ {reply,{error,Reason},LD}
+ end;
+ true ->
+ {reply,{error,{badarg,Args}},LD}
+ end;
+ false -> % Can't do if not tracing.
+ {reply,{error,no_session},LD}
+ end;
+
+handle_call({reactivate,Node},_From,LD=#ld{nodes=NodesD,c_node=CNode}) ->
+ case get_state_nodes(Node,NodesD) of
+ {trace_failure,_} ->
+ {reply,{error,trace_failure},LD};
+ {State,suspended} -> % The node is infact suspended.
+ case h_reactivate(Node,CNode) of
+ ok ->
+ case {State,is_tracing(LD#ld.session_state)} of
+ {tracing,true} -> % Only then shall we redo cmds.
+ {reply,ok,redo_cmd_history(Node,LD)};
+ _ -> % All other just no longer suspended.
+ {reply,ok,LD#ld{nodes=set_running_nodes(Node,NodesD)}}
+ end;
+ {error,Reason} ->
+ {reply,{error,Reason},LD}
+ end;
+ reactivating ->
+ {reply,{error,reactivating},LD};
+ {_,running} ->
+ {reply,{error,already_running},LD};
+ down ->
+ {reply,{error,not_available},LD};
+ false ->
+ {reply,{error,unknown_node},LD}
+ end;
+
+handle_call({save_history,FileName},_From,LD=#ld{chl=CHL,dir=Dir,history_dir=HDir}) ->
+ case lists:keysort(2,get_loglist_chl(CHL)) of
+ [] -> % Empty history or no history.
+ {reply,{error,no_history},LD};
+ Log ->
+ case h_save_history(HDir,Dir,FileName,Log) of
+ {ok,AbsFileName} ->
+ {reply,{ok,AbsFileName},LD};
+ {error,Reason} ->
+ {reply,{error,Reason},LD}
+ end
+ end;
+
+handle_call({get_autostart_data,{Nodes,Dependency}},_From,LD=#ld{chl=CHL}) ->
+ {ok,ASD} = build_autostart_data(lists:keysort(2,get_loglist_chl(CHL)),LD#ld.tc_dict),
+ TDGargs=get_latest_tdgargs_tracer_data(LD#ld.tracer_data),
+ {M,F,_}=LD#ld.tdg,
+ OptsG=LD#ld.optg, % Addnodes options generator.
+ {reply,
+ h_get_autostart_data(Nodes,LD#ld.c_node,Dependency,ASD,M,F,TDGargs,OptsG),
+ LD};
+
+handle_call({get_autostart_data,Dependency},From,LD=#ld{c_node=undefined}) ->
+ handle_call({get_autostart_data,{local_runtime,Dependency}},From,LD);
+handle_call({get_autostart_data,Dependency},From,LD=#ld{nodes=NodesD}) ->
+ Nodes=get_all_nodenames_nodes(NodesD),
+ handle_call({get_autostart_data,{local_runtime,{Nodes,Dependency}}},From,LD);
+
+handle_call(get_activities,_From,LD=#ld{chl=CHL,reactivators=Reactivators}) ->
+ TraceCases=get_ongoing_chl(CHL),
+ RNodes=get_all_nodes_reactivators(Reactivators),
+ ReturnList1=
+ if
+ TraceCases==[] ->
+ [];
+ true ->
+ [{tracecases,TraceCases}]
+ end,
+ ReturnList2=
+ if
+ RNodes==[] ->
+ ReturnList1;
+ true ->
+ [{reactivating_nodes,RNodes}|ReturnList1]
+ end,
+ {reply,{ok,ReturnList2},LD};
+
+handle_call({get_node_status,Node},_Node,LD) ->
+ case get_state_nodes(Node,LD#ld.nodes) of
+ false ->
+ {reply,{error,unknown_node},LD};
+ StateStatus ->
+ {reply,{ok,StateStatus},LD}
+ end;
+
+handle_call(get_session_data,_From,LD=#ld{session_state=SState,tracer_data=TD}) ->
+ case get_latest_session_nr_tracer_data(TD) of
+ undefined ->
+ {reply,{error,no_session},LD};
+ SessionNr ->
+ TDGargs=get_latest_tdgargs_tracer_data(TD),
+ case is_tracing(SState) of
+ true ->
+ {reply,{ok,{tracing,SessionNr,TDGargs}},LD};
+ false ->
+ {reply,{ok,{not_tracing,SessionNr,TDGargs}},LD}
+ end
+ end;
+
+handle_call(flush,_From,LD=#ld{c_node=CNode,nodes=NodesD}) ->
+ Nodes=get_tracing_nodes(NodesD),
+ {reply,h_flush(CNode,Nodes),LD};
+handle_call({flush,Nodes},_From,LD=#ld{c_node=CNode}) ->
+ {reply,h_flush(CNode,Nodes),LD};
+
+handle_call(get_loopdata,_From,LD) ->
+ {reply,LD,LD};
+
+%% Internal handle_call callbacks.
+
+handle_call({reactivator_reply,{Counter,RPid}},_From,LD=#ld{chl=CHL}) ->
+ HighestUsedCounter=get_highest_used_counter_chl(CHL),
+ if
+ HighestUsedCounter>Counter -> % There are now more log entries.
+ NewUnsortedLog=get_loglist_chl(CHL),
+ {reply,{more,NewUnsortedLog},LD};
+ true -> % No Counter is youngest log entry.
+ NodesD=LD#ld.nodes,
+ Node=get_node_reactivators(RPid,LD#ld.reactivators),
+ {reply,
+ done,
+ LD#ld{nodes=set_running_nodes(Node,NodesD),
+ reactivators=del_reactivators(RPid,LD#ld.reactivators)}}
+ end.
+%% -----------------------------------------------------------------------------
+
+%% Handling a notification from a trace case execution process. Receiving this
+%% indicated that this phase of the trace case is finnished.
+handle_cast({tc_executer_reply,{Phase,ProcH,Result}},LD) ->
+ case Phase of
+ activating -> % The trace case is running now.
+ {ok,NewLD}=h_tc_activation_done(ProcH,Result,LD),
+ {noreply,NewLD};
+ stopping ->
+ {ok,NewLD}=h_tc_stopping_done(ProcH,Result,LD),
+ {noreply,NewLD};
+ _ ->
+ {noreply,LD}
+ end;
+handle_cast(_,LD) ->
+ {noreply,LD}.
+%% -----------------------------------------------------------------------------
+
+%% This is the case when a runtime component goes down. We stop all running
+%% reactivators for this node. Note that there can also be tracecases ongoing
+%% where this node is part of the Nodes variable. But there is not much we can
+%% do about that. Other then informing the user that it is unwise to reconnect
+%% this node before those tracecases have stopped being ongoing.
+handle_info({inviso_event,_CNode,_Time,{disconnected,Node,_}},LD) ->
+ {noreply,LD#ld{nodes=set_down_nodes(Node,LD#ld.nodes),
+ reactivators=stop_node_reactivators(Node,LD#ld.reactivators)}};
+
+%% This is the case when a runtime component gets suspended. Much of the same
+%% problem as described above applies.
+handle_info({inviso_event,_CNode,_Time,{state_change,Node,{_,{suspended,_}}}},LD) ->
+ {noreply,LD#ld{nodes=set_suspended_nodes(Node,LD#ld.nodes),
+ reactivators=stop_node_reactivators(Node,LD#ld.reactivators)}};
+
+handle_info(_,LD) ->
+ {noreply,LD}.
+%% -----------------------------------------------------------------------------
+
+%% Called when the tool server stops. First clause, termination is initiated by
+%% our self and therefore controlled another way. In the second case we are
+%% stopping for some external reason, and we must then do more here in terminate/2.
+terminate(normal,#ld{c_node=CNode}) -> % This is when we are stopping our self.
+ stop_inviso_at_c_node(CNode);
+terminate(_,#ld{c_node=CNode,nodes=NodesD,keep_nodes=KeepNodes}) ->
+ remove_all_trace_patterns(CNode,KeepNodes,get_all_nodenames_nodes(NodesD)),
+ stop_inviso_at_c_node(CNode).
+%% -----------------------------------------------------------------------------
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% =============================================================================
+%% Handler first level help functions.
+%% =============================================================================
+
+%% -----------------------------------------------------------------------------
+%% reconnect_nodes
+%% -----------------------------------------------------------------------------
+
+%% Help function reconnecting the nodes in Nodes. Listed nodes must be part of
+%% the set of nodes handled by the tool. It is not possible to reconnect a node
+%% that is not marked as down. This partly because we otherwise risk losing the
+%% trace_failure state (which can not be rediscovered).
+h_reconnect_nodes(local_runtime,LD=#ld{nodes=NodesD}) -> % Non-distributed.
+ case get_state_nodes(local_runtime,NodesD) of
+ down ->
+ {ok,{local_runtime,[],start_runtime_components(local_runtime,LD)}};
+ _ -> % Allready connected!
+ {ok,{[],{error,already_connected},LD}}
+ end;
h_reconnect_nodes(Nodes,LD=#ld{nodes=NodesD}) when is_list(Nodes) ->
- {Nodes2,NodesErr}=
- lists:foldl(fun(N,{Nodes2,NodesErr})->
- case get_state_nodes(N,NodesD) of
- down -> % Yes this node can be reconnected.
- {[N|Nodes2],NodesErr};
- false -> % Not part of the node-set!
- {Nodes2,[{N,{error,unknown_node}}|NodesErr]};
- _ -> % Allready connected!
- {Nodes2,[{N,{error,already_connected}}|NodesErr]}
- end
- end,
- {[],[]},
- Nodes),
- LD2=start_runtime_components(Nodes2,LD), % Inpect the #ld.nodes for result.
- {ok,{Nodes2,NodesErr,LD2}};
-h_reconnect_nodes(Nodes,_LD) ->
- {error,{badarg,Nodes}}.
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% start_session
-%% -----------------------------------------------------------------------------
-
-%% Help function starting the tracing at all nodes. Note that the tracer data
-%% is calculated using a user defined function. This is how for instance the
-%% file names (of the log files) are determined.
-%% Before the nodes are initiated their (possibly remaining) trace patterns are
-%% cleared, both local and global.
-h_start_session(M,F,TDGargs,LD=#ld{c_node=CNode,nodes=NodesD,tracer_data=TDs}) ->
- case get_inactive_running_nodes(NodesD) of
- [] -> % There are no nodes to initiate!
- h_start_session_nonodes(TDGargs,LD,[]);
- Nodes -> % List of nodes or 'local_runtime'.
- case h_start_session_ctp_all(CNode,Nodes) of
- {ok,Errors,[]} -> % Now no nodes to initiate!
- h_start_session_nonodes(TDGargs,LD,Errors);
- {ok,Errors,Nodes2} -> % Now these nodes are fresh.
- case call_tracer_data_generator(CNode,M,F,TDGargs,Nodes2) of
- {ok,TracerList} -> % Generated our tracerdata.
- case h_start_session_2(CNode,TracerList,Errors) of
- {ok,ReturnValue} -> % Some nodes are initialized now.
- {NewNodesD,Nodes3}=
- set_tracing_running_nodes(CNode,ReturnValue,NodesD),
- {SessionNr,NewTDs}=insert_td_tracer_data(TDGargs,TDs),
- {ok,{SessionNr,
- ReturnValue,
- Nodes3, % The nodes that shall get initial tracases.
- LD#ld{nodes=NewNodesD,tracer_data=NewTDs}}};
- {error,Reason} ->
- {error,Reason}
- end;
- {error,Reason} -> % Faulty tracer data generator func.
- {error,{bad_tdg,Reason}}
- end;
- {error,Reason} -> % Error clearing patterns.
- {error,Reason}
- end
- end.
-
-h_start_session_nonodes(TDGargs,LD=#ld{c_node=CNode,tracer_data=TDs},Errors) ->
- {SessionNr,NewTDs}=insert_td_tracer_data(TDGargs,TDs),
- if
- CNode==undefined ->
- {ok,{SessionNr,[],LD#ld{tracer_data=NewTDs}}};
- true ->
- {ok,{SessionNr,{ok,Errors},LD#ld{tracer_data=NewTDs}}}
- end.
-
-%% Help function clearing all trace patterns on all nodes.
-h_start_session_ctp_all(CNode,Nodes) ->
- case remove_all_trace_patterns(CNode,[],Nodes) of
- ok -> % Non-distributed case1.
- {ok,[],local_runtime};
- {error,Reason} -> % Non-distributed case2 and general failure.
- {error,Reason};
- {ok,NodeResults} ->
- h_start_session_ctp_all_2(NodeResults,[],[])
- end.
-
-h_start_session_ctp_all_2([{Node,{error,Reason}}|Rest],Errors,Nodes) ->
- h_start_session_ctp_all_2(Rest,[{Node,{error,Reason}}|Errors],Nodes);
-h_start_session_ctp_all_2([{Node,_OkOrPatternsUntouched}|Rest],Errors,Nodes) ->
- h_start_session_ctp_all_2(Rest,Errors,[Node|Nodes]);
-h_start_session_ctp_all_2([],Errors,Nodes) ->
- {ok,Errors,Nodes}.
-
-%% Help function doing the actual init_tracing.
-h_start_session_2(undefined,TracerData,_Errors) -> % Non distributed case.
- case inviso:init_tracing(TracerData) of
+ {Nodes2,NodesErr}=
+ lists:foldl(fun(N,{Nodes2,NodesErr})->
+ case get_state_nodes(N,NodesD) of
+ down -> % Yes this node can be reconnected.
+ {[N|Nodes2],NodesErr};
+ false -> % Not part of the node-set!
+ {Nodes2,[{N,{error,unknown_node}}|NodesErr]};
+ _ -> % Allready connected!
+ {Nodes2,[{N,{error,already_connected}}|NodesErr]}
+ end
+ end,
+ {[],[]},
+ Nodes),
+ LD2=start_runtime_components(Nodes2,LD), % Inpect the #ld.nodes for result.
+ {ok,{Nodes2,NodesErr,LD2}};
+h_reconnect_nodes(Nodes,_LD) ->
+ {error,{badarg,Nodes}}.
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% start_session
+%% -----------------------------------------------------------------------------
+
+%% Help function starting the tracing at all nodes. Note that the tracer data
+%% is calculated using a user defined function. This is how for instance the
+%% file names (of the log files) are determined.
+%% Before the nodes are initiated their (possibly remaining) trace patterns are
+%% cleared, both local and global.
+h_start_session(M,F,TDGargs,LD=#ld{c_node=CNode,nodes=NodesD,tracer_data=TDs}) ->
+ case get_inactive_running_nodes(NodesD) of
+ [] -> % There are no nodes to initiate!
+ h_start_session_nonodes(TDGargs,LD,[]);
+ Nodes -> % List of nodes or 'local_runtime'.
+ case h_start_session_ctp_all(CNode,Nodes) of
+ {ok,Errors,[]} -> % Now no nodes to initiate!
+ h_start_session_nonodes(TDGargs,LD,Errors);
+ {ok,Errors,Nodes2} -> % Now these nodes are fresh.
+ case call_tracer_data_generator(CNode,M,F,TDGargs,Nodes2) of
+ {ok,TracerList} -> % Generated our tracerdata.
+ case h_start_session_2(CNode,TracerList,Errors) of
+ {ok,ReturnValue} -> % Some nodes are initialized now.
+ {NewNodesD,Nodes3}=
+ set_tracing_running_nodes(CNode,ReturnValue,NodesD),
+ {SessionNr,NewTDs}=insert_td_tracer_data(TDGargs,TDs),
+ {ok,{SessionNr,
+ ReturnValue,
+ Nodes3, % The nodes that shall get initial tracases.
+ LD#ld{nodes=NewNodesD,tracer_data=NewTDs}}};
+ {error,Reason} ->
+ {error,Reason}
+ end;
+ {error,Reason} -> % Faulty tracer data generator func.
+ {error,{bad_tdg,Reason}}
+ end;
+ {error,Reason} -> % Error clearing patterns.
+ {error,Reason}
+ end
+ end.
+
+h_start_session_nonodes(TDGargs,LD=#ld{c_node=CNode,tracer_data=TDs},Errors) ->
+ {SessionNr,NewTDs}=insert_td_tracer_data(TDGargs,TDs),
+ if
+ CNode==undefined ->
+ {ok,{SessionNr,[],LD#ld{tracer_data=NewTDs}}};
+ true ->
+ {ok,{SessionNr,{ok,Errors},LD#ld{tracer_data=NewTDs}}}
+ end.
+
+%% Help function clearing all trace patterns on all nodes.
+h_start_session_ctp_all(CNode,Nodes) ->
+ case remove_all_trace_patterns(CNode,[],Nodes) of
+ ok -> % Non-distributed case1.
+ {ok,[],local_runtime};
+ {error,Reason} -> % Non-distributed case2 and general failure.
+ {error,Reason};
+ {ok,NodeResults} ->
+ h_start_session_ctp_all_2(NodeResults,[],[])
+ end.
+
+h_start_session_ctp_all_2([{Node,{error,Reason}}|Rest],Errors,Nodes) ->
+ h_start_session_ctp_all_2(Rest,[{Node,{error,Reason}}|Errors],Nodes);
+h_start_session_ctp_all_2([{Node,_OkOrPatternsUntouched}|Rest],Errors,Nodes) ->
+ h_start_session_ctp_all_2(Rest,Errors,[Node|Nodes]);
+h_start_session_ctp_all_2([],Errors,Nodes) ->
+ {ok,Errors,Nodes}.
+
+%% Help function doing the actual init_tracing.
+h_start_session_2(undefined,TracerData,_Errors) -> % Non distributed case.
+ case inviso:init_tracing(TracerData) of
{ok,LogResult} when is_list(LogResult) ->
- {ok,{ok,LogResult}};
- {error,already_initated} -> % Perhaps adopted!?
- {ok,{error,already_initiated}}; % Not necessarily wrong.
- {error,Reason} ->
- {error,Reason}
- end;
-h_start_session_2(CNode,TracerList,Errors) ->
- case rpc:call(CNode,inviso,init_tracing,[TracerList]) of
- {ok,NodeResults} ->
- {ok,{ok,Errors++NodeResults}};
- {error,Reason} ->
- {error,Reason};
- {badrpc,Reason} ->
- {error,{inviso_control_node_error,Reason}}
- end.
-%% -----------------------------------------------------------------------------
-
-%% Help function starting all initial trace cases. They are actually handled
-%% the same way as user started trace cases. We actually only start initial
-%% tracecases at Nodes (if Nodes is a list of nodes). This because we may have
-%% adopted some nodes some already tracing nodes, and such are supposed to have
-%% the correct patterns and flags set.
-do_initial_tcs([{TC,Vars}|Rest],Nodes,LD) ->
- Id=make_ref(), % Trace case ID.
- case h_atc(TC,Id,Vars,LD,Nodes) of % Start using regular start methods.
- {ok,NewLD} -> % Trace case was successfully started.
- NewInitialTcs=add_initial_tcs(TC,Id,NewLD#ld.started_initial_tcs),
- do_initial_tcs(Rest,Nodes,NewLD#ld{started_initial_tcs=NewInitialTcs});
- {error,_Reason} ->
- do_initial_tcs(Rest,Nodes,LD)
- end;
-do_initial_tcs([_|Rest],Nodes,LD) ->
- do_initial_tcs(Rest,Nodes,LD);
-do_initial_tcs([],_Nodes,LD) ->
- LD.
-%% -----------------------------------------------------------------------------
-
-%% This help functio is used instead of do_initial_tcs/3 if there actually are no
-%% nodes to do the trace cases on. The reason we must have this function is that
-%% the tracecases must still be entered into the history with bindings and all.
-%% But we let them be marked as 'running' immediately (no need for the activator
-%% process).
-add_initial_tcs_to_history([{TC,Vars}|Rest],LD=#ld{tc_dict=TCdict,chl=CHL}) ->
- case get_tracecase_tc_dict(TC,TCdict) of
- {ok,TraceCase} ->
- case check_bindings(Vars,TraceCase) of
- {ok,Bindings} ->
- Id=make_ref(), % Trace case ID.
- FakeProcH=make_ref(), % Need something to enter as activator.
- NewCHL=set_activating_chl(TC,Id,CHL,Bindings,FakeProcH),
- NewCHL2=set_running_chl(FakeProcH,TC,Id,void,NewCHL), % Result=void.
- NewInitialTcs=add_initial_tcs(TC,Id,LD#ld.started_initial_tcs),
- add_initial_tcs_to_history(Rest,LD#ld{chl=NewCHL2,
- started_initial_tcs=NewInitialTcs});
- {error,_Reason} -> % Not much we can do about that.
- add_initial_tcs_to_history(Rest,LD)
- end;
- false ->
- add_initial_tcs_to_history(Rest,LD)
- end;
-add_initial_tcs_to_history([],LD) ->
- LD.
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% reinitiate_session
-%% -----------------------------------------------------------------------------
-
-%% Function doing the reinitiation. That means first do init_tracing at the nodes
-%% in question. Then redo the command history to bring them up to speed.
-%% But first the runtime component is cleared of all trace patterns.
-h_reinitiate_session(Nodes,M,F,TDGargs,LD=#ld{c_node=CNode,nodes=NodesD}) ->
- case h_reinitiate_session_2(Nodes,NodesD,CNode) of
- {ok,{[],NodesErr}} -> % No nodes to reinitiate.
- {ok,{NodesErr,{ok,[]},LD}};
- {ok,{Nodes2,NodesErr}} -> % List of nodes or local_runtime.
- case call_tracer_data_generator(CNode,M,F,TDGargs,Nodes2) of
- {ok,TracerList} ->
- case h_start_session_2(CNode,TracerList,[]) of % Borrow from start_session.
- {ok,ReturnValue} -> % Ok, now we must redo cmd history.
- {NewNodesD,_Nodes}=
- set_tracing_running_nodes(CNode,ReturnValue,NodesD),
- NewLD=h_reinitiate_session_chl(Nodes2,LD#ld{nodes=NewNodesD}),
- {ok,{NodesErr,ReturnValue,NewLD}};
- {error,Reason} ->
- {error,Reason}
- end;
- {error,Reason} ->
- {error,{bad_tdg,Reason}}
- end;
- {error,Reason} ->
- {error,Reason}
- end.
-
-%% Help function finding out which nodes in Nodes actually can be reinitiated.
-%% A node must be up, inactive and not suspended in order for this to work. All the
-%% rest is just a matter of how detailed error return values we want to generate.
-h_reinitiate_session_2(local_runtime,NodesD,undefined) -> % Non distributed case.
- case get_state_nodes(local_runtime,NodesD) of
- {inactive,running} -> % Only ok case.
- case inviso:ctp_all() of
- ok ->
- {ok,{local_runtime,[]}};
- {error,Reason} -> % This is strange.
- {error,Reason}
- end;
- {_,suspended} ->
- {ok,{[],{error,suspended}}};
- down ->
- {ok,{[],{error,down}}};
- _ ->
- {ok,{[],{error,already_in_session}}}
- end;
+ {ok,{ok,LogResult}};
+ {error,already_initated} -> % Perhaps adopted!?
+ {ok,{error,already_initiated}}; % Not necessarily wrong.
+ {error,Reason} ->
+ {error,Reason}
+ end;
+h_start_session_2(CNode,TracerList,Errors) ->
+ case rpc:call(CNode,inviso,init_tracing,[TracerList]) of
+ {ok,NodeResults} ->
+ {ok,{ok,Errors++NodeResults}};
+ {error,Reason} ->
+ {error,Reason};
+ {badrpc,Reason} ->
+ {error,{inviso_control_node_error,Reason}}
+ end.
+%% -----------------------------------------------------------------------------
+
+%% Help function starting all initial trace cases. They are actually handled
+%% the same way as user started trace cases. We actually only start initial
+%% tracecases at Nodes (if Nodes is a list of nodes). This because we may have
+%% adopted some nodes some already tracing nodes, and such are supposed to have
+%% the correct patterns and flags set.
+do_initial_tcs([{TC,Vars}|Rest],Nodes,LD) ->
+ Id=make_ref(), % Trace case ID.
+ case h_atc(TC,Id,Vars,LD,Nodes) of % Start using regular start methods.
+ {ok,NewLD} -> % Trace case was successfully started.
+ NewInitialTcs=add_initial_tcs(TC,Id,NewLD#ld.started_initial_tcs),
+ do_initial_tcs(Rest,Nodes,NewLD#ld{started_initial_tcs=NewInitialTcs});
+ {error,_Reason} ->
+ do_initial_tcs(Rest,Nodes,LD)
+ end;
+do_initial_tcs([_|Rest],Nodes,LD) ->
+ do_initial_tcs(Rest,Nodes,LD);
+do_initial_tcs([],_Nodes,LD) ->
+ LD.
+%% -----------------------------------------------------------------------------
+
+%% This help functio is used instead of do_initial_tcs/3 if there actually are no
+%% nodes to do the trace cases on. The reason we must have this function is that
+%% the tracecases must still be entered into the history with bindings and all.
+%% But we let them be marked as 'running' immediately (no need for the activator
+%% process).
+add_initial_tcs_to_history([{TC,Vars}|Rest],LD=#ld{tc_dict=TCdict,chl=CHL}) ->
+ case get_tracecase_tc_dict(TC,TCdict) of
+ {ok,TraceCase} ->
+ case check_bindings(Vars,TraceCase) of
+ {ok,Bindings} ->
+ Id=make_ref(), % Trace case ID.
+ FakeProcH=make_ref(), % Need something to enter as activator.
+ NewCHL=set_activating_chl(TC,Id,CHL,Bindings,FakeProcH),
+ NewCHL2=set_running_chl(FakeProcH,TC,Id,void,NewCHL), % Result=void.
+ NewInitialTcs=add_initial_tcs(TC,Id,LD#ld.started_initial_tcs),
+ add_initial_tcs_to_history(Rest,LD#ld{chl=NewCHL2,
+ started_initial_tcs=NewInitialTcs});
+ {error,_Reason} -> % Not much we can do about that.
+ add_initial_tcs_to_history(Rest,LD)
+ end;
+ false ->
+ add_initial_tcs_to_history(Rest,LD)
+ end;
+add_initial_tcs_to_history([],LD) ->
+ LD.
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% reinitiate_session
+%% -----------------------------------------------------------------------------
+
+%% Function doing the reinitiation. That means first do init_tracing at the nodes
+%% in question. Then redo the command history to bring them up to speed.
+%% But first the runtime component is cleared of all trace patterns.
+h_reinitiate_session(Nodes,M,F,TDGargs,LD=#ld{c_node=CNode,nodes=NodesD}) ->
+ case h_reinitiate_session_2(Nodes,NodesD,CNode) of
+ {ok,{[],NodesErr}} -> % No nodes to reinitiate.
+ {ok,{NodesErr,{ok,[]},LD}};
+ {ok,{Nodes2,NodesErr}} -> % List of nodes or local_runtime.
+ case call_tracer_data_generator(CNode,M,F,TDGargs,Nodes2) of
+ {ok,TracerList} ->
+ case h_start_session_2(CNode,TracerList,[]) of % Borrow from start_session.
+ {ok,ReturnValue} -> % Ok, now we must redo cmd history.
+ {NewNodesD,_Nodes}=
+ set_tracing_running_nodes(CNode,ReturnValue,NodesD),
+ NewLD=h_reinitiate_session_chl(Nodes2,LD#ld{nodes=NewNodesD}),
+ {ok,{NodesErr,ReturnValue,NewLD}};
+ {error,Reason} ->
+ {error,Reason}
+ end;
+ {error,Reason} ->
+ {error,{bad_tdg,Reason}}
+ end;
+ {error,Reason} ->
+ {error,Reason}
+ end.
+
+%% Help function finding out which nodes in Nodes actually can be reinitiated.
+%% A node must be up, inactive and not suspended in order for this to work. All the
+%% rest is just a matter of how detailed error return values we want to generate.
+h_reinitiate_session_2(local_runtime,NodesD,undefined) -> % Non distributed case.
+ case get_state_nodes(local_runtime,NodesD) of
+ {inactive,running} -> % Only ok case.
+ case inviso:ctp_all() of
+ ok ->
+ {ok,{local_runtime,[]}};
+ {error,Reason} -> % This is strange.
+ {error,Reason}
+ end;
+ {_,suspended} ->
+ {ok,{[],{error,suspended}}};
+ down ->
+ {ok,{[],{error,down}}};
+ _ ->
+ {ok,{[],{error,already_in_session}}}
+ end;
h_reinitiate_session_2(Nodes,NodesD,CNode) when is_list(Nodes) ->
- {ok,lists:foldl(fun(N,{Nodes2,NodesErr})->
- case get_state_nodes(N,NodesD) of
- {inactive,running} -> % Only ok case.
- case rpc:call(CNode,inviso,ctp_all,[[N]]) of
- {ok,[{N,ok}]} ->
- {[N|Nodes2],NodesErr};
- {ok,[{N,{error,Reason}}]} ->
- {Nodes2,[{N,{error,Reason}}|NodesErr]};
- {error,Reason} ->
- {Nodes2,[{N,{error,Reason}}|NodesErr]};
- {badrpc,Reason} ->
- {Nodes2,[{N,{error,{badrpc,Reason}}}|NodesErr]}
- end;
- {_,suspended} ->
- {Nodes2,[{N,{error,suspended}}|NodesErr]};
- down ->
- {Nodes2,[{N,{error,down}}|NodesErr]};
- false ->
- {Nodes2,[{N,{error,unknown_node}}|NodesErr]};
- _ ->
- {Nodes2,[{N,{error,already_in_session}}|NodesErr]}
- end
- end,
- {[],[]},
- Nodes)};
-h_reinitiate_session_2(Nodes,_NodesD,_CNode) ->
- {error,{badarg7,Nodes}}.
-
-%% Help function redoing the command history log at all nodes that actually
-%% started to trace. Note that we do not modify the return value which will be
-%% given to the caller just because we decide not to redo commands. The user
-%% must conclude him self from the inviso return value that commands were not
-%% redone at a particular node.
-h_reinitiate_session_chl(local_runtime,LD) ->
- h_reinitiate_session_chl([local_runtime],LD);
-h_reinitiate_session_chl([Node|Rest],LD=#ld{nodes=NodesD}) ->
- case get_state_nodes(Node,NodesD) of
- {tracing,running} -> % Only case when we shall redo!
- h_reinitiate_session_chl(Rest,redo_cmd_history(Node,LD));
- _ -> % No redo of chl in other cases.
- h_reinitiate_session_chl(Rest,LD)
- end;
-h_reinitiate_session_chl([],LD) ->
- LD.
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% restore_session
-%% -----------------------------------------------------------------------------
-
-%% Help function starting a session (init tracing) and redoes the history
-%% found in CHL.
-h_restore_session(MoreTDGargs,LD) ->
- DateTime=calendar:universal_time(),
- {M,F,Args}=LD#ld.tdg,
- TDGargs=inviso_tool_lib:mk_tdg_args(DateTime,MoreTDGargs++Args),
- case h_start_session(M,F,TDGargs,LD) of
- {ok,{SessionNr,ReturnVal,NewLD}} -> % There were no available nodes.
- {ok,{SessionNr,ReturnVal,NewLD}};
- {ok,{SessionNr,ReturnVal,Nodes2,NewLD}} ->
- NewLD2=h_reinitiate_session_chl(Nodes2,NewLD),
- {ok,{SessionNr,ReturnVal,NewLD2}};
- {error,Reason} -> % Risk of out of control.
- {error,Reason}
- end.
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% stop_session
-%% -----------------------------------------------------------------------------
-
-%% Help function stopping tracing at tracing nodes.
-h_stop_session(#ld{c_node=CNode,nodes=NodesD,tracer_data=TDs}) ->
- case h_stop_session_2(CNode,NodesD) of
- {ok,Result} ->
- {ok,{get_latest_session_nr_tracer_data(TDs),Result}};
- {error,Reason} ->
- {error,Reason}
- end.
-
-h_stop_session_2(undefined,NodesD) -> % The non distributed case.
- case get_tracing_nodes(NodesD) of
- {up,{inactive,_}} -> % Already not tracing!
- {ok,[]};
- {up,_} ->
- case inviso:stop_tracing() of
- {ok,_State} ->
- {ok,[ok]};
- {error,no_response} ->
- {ok,[]};
- {error,Reason} ->
- {error,Reason}
- end;
- down ->
- {ok,[]}
- end;
-h_stop_session_2(CNode,NodesD) ->
- Nodes=get_tracing_nodes(NodesD),
- case rpc:call(CNode,inviso,stop_tracing,[Nodes]) of
- {ok,NodeResults} ->
- {ok,lists:map(fun({N,{ok,_}})->{N,ok};
- (NodeError)->NodeError
- end,
- NodeResults)};
- {error,Reason} ->
- {error,Reason};
- {badrpc,Reason} ->
- {error,{inviso_control_node_error,Reason}}
- end.
-%% -----------------------------------------------------------------------------
-
-%% Help function removing any trace flags, trace patterns and meta trace patterns
-%% at Nodes. This will cause the nodes to become "fresh".
-h_reset_nodes(local_runtime,_CNode) ->
- inviso:clear([keep_log_files]);
-h_reset_nodes(Nodes,CNode) ->
- case inviso_tool_lib:inviso_cmd(CNode,clear,[Nodes,[keep_log_files]]) of
- {ok,NodeResults} ->
- {ok,NodeResults};
- {error,Reason} ->
- {error,Reason}
- end.
-%% -----------------------------------------------------------------------------
-
-
-%% -----------------------------------------------------------------------------
-%% atc
-%% -----------------------------------------------------------------------------
-
-%% Function handling ativating a trace case. Trace cases that do not have a
-%% particular on/off handling (but just on in some scense) are handled here too.
-%% The trace case is entered into the Command History Log.
-%% Note that the trace case can not be executed at this node but must be
-%% executed where the inviso control component is.
-%% Further it is possible to either activated the tracecase for all running and
-%% tracing nodes, or just for a specified list of nodes.
-%% TC=tracecase_name(),
-%% Id=term(), identifiying this usage so we can turn it off later.
-%% Vars=list(), list of variable-value bindnings.
-h_atc(TC,Id,Vars,LD) ->
- h_atc(TC,Id,Vars,LD,void). % For all running-tracing nodes.
-
-h_atc(TC,Id,Vars,LD=#ld{c_node=CNode,tc_dict=TCdict,chl=CHL},Nodes) ->
- case find_id_chl(TC,Id,CHL) of
- activating -> % Already started.
- {error,activating};
- stopping -> % Not yet stopped.
- {error,deactivating};
- false ->
- case get_tracecase_tc_dict(TC,TCdict) of
- {ok,TraceCase} -> % Such a trace case exists.
- case check_bindings(Vars,TraceCase) of
- {ok,Bindings} -> % Necessary vars exists in Vars.
- if
+ {ok,lists:foldl(fun(N,{Nodes2,NodesErr})->
+ case get_state_nodes(N,NodesD) of
+ {inactive,running} -> % Only ok case.
+ case rpc:call(CNode,inviso,ctp_all,[[N]]) of
+ {ok,[{N,ok}]} ->
+ {[N|Nodes2],NodesErr};
+ {ok,[{N,{error,Reason}}]} ->
+ {Nodes2,[{N,{error,Reason}}|NodesErr]};
+ {error,Reason} ->
+ {Nodes2,[{N,{error,Reason}}|NodesErr]};
+ {badrpc,Reason} ->
+ {Nodes2,[{N,{error,{badrpc,Reason}}}|NodesErr]}
+ end;
+ {_,suspended} ->
+ {Nodes2,[{N,{error,suspended}}|NodesErr]};
+ down ->
+ {Nodes2,[{N,{error,down}}|NodesErr]};
+ false ->
+ {Nodes2,[{N,{error,unknown_node}}|NodesErr]};
+ _ ->
+ {Nodes2,[{N,{error,already_in_session}}|NodesErr]}
+ end
+ end,
+ {[],[]},
+ Nodes)};
+h_reinitiate_session_2(Nodes,_NodesD,_CNode) ->
+ {error,{badarg7,Nodes}}.
+
+%% Help function redoing the command history log at all nodes that actually
+%% started to trace. Note that we do not modify the return value which will be
+%% given to the caller just because we decide not to redo commands. The user
+%% must conclude him self from the inviso return value that commands were not
+%% redone at a particular node.
+h_reinitiate_session_chl(local_runtime,LD) ->
+ h_reinitiate_session_chl([local_runtime],LD);
+h_reinitiate_session_chl([Node|Rest],LD=#ld{nodes=NodesD}) ->
+ case get_state_nodes(Node,NodesD) of
+ {tracing,running} -> % Only case when we shall redo!
+ h_reinitiate_session_chl(Rest,redo_cmd_history(Node,LD));
+ _ -> % No redo of chl in other cases.
+ h_reinitiate_session_chl(Rest,LD)
+ end;
+h_reinitiate_session_chl([],LD) ->
+ LD.
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% restore_session
+%% -----------------------------------------------------------------------------
+
+%% Help function starting a session (init tracing) and redoes the history
+%% found in CHL.
+h_restore_session(MoreTDGargs,LD) ->
+ DateTime=calendar:universal_time(),
+ {M,F,Args}=LD#ld.tdg,
+ TDGargs=inviso_tool_lib:mk_tdg_args(DateTime,MoreTDGargs++Args),
+ case h_start_session(M,F,TDGargs,LD) of
+ {ok,{SessionNr,ReturnVal,NewLD}} -> % There were no available nodes.
+ {ok,{SessionNr,ReturnVal,NewLD}};
+ {ok,{SessionNr,ReturnVal,Nodes2,NewLD}} ->
+ NewLD2=h_reinitiate_session_chl(Nodes2,NewLD),
+ {ok,{SessionNr,ReturnVal,NewLD2}};
+ {error,Reason} -> % Risk of out of control.
+ {error,Reason}
+ end.
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% stop_session
+%% -----------------------------------------------------------------------------
+
+%% Help function stopping tracing at tracing nodes.
+h_stop_session(#ld{c_node=CNode,nodes=NodesD,tracer_data=TDs}) ->
+ case h_stop_session_2(CNode,NodesD) of
+ {ok,Result} ->
+ {ok,{get_latest_session_nr_tracer_data(TDs),Result}};
+ {error,Reason} ->
+ {error,Reason}
+ end.
+
+h_stop_session_2(undefined,NodesD) -> % The non distributed case.
+ case get_tracing_nodes(NodesD) of
+ {up,{inactive,_}} -> % Already not tracing!
+ {ok,[]};
+ {up,_} ->
+ case inviso:stop_tracing() of
+ {ok,_State} ->
+ {ok,[ok]};
+ {error,no_response} ->
+ {ok,[]};
+ {error,Reason} ->
+ {error,Reason}
+ end;
+ down ->
+ {ok,[]}
+ end;
+h_stop_session_2(CNode,NodesD) ->
+ Nodes=get_tracing_nodes(NodesD),
+ case rpc:call(CNode,inviso,stop_tracing,[Nodes]) of
+ {ok,NodeResults} ->
+ {ok,lists:map(fun({N,{ok,_}})->{N,ok};
+ (NodeError)->NodeError
+ end,
+ NodeResults)};
+ {error,Reason} ->
+ {error,Reason};
+ {badrpc,Reason} ->
+ {error,{inviso_control_node_error,Reason}}
+ end.
+%% -----------------------------------------------------------------------------
+
+%% Help function removing any trace flags, trace patterns and meta trace patterns
+%% at Nodes. This will cause the nodes to become "fresh".
+h_reset_nodes(local_runtime,_CNode) ->
+ inviso:clear([keep_log_files]);
+h_reset_nodes(Nodes,CNode) ->
+ case inviso_tool_lib:inviso_cmd(CNode,clear,[Nodes,[keep_log_files]]) of
+ {ok,NodeResults} ->
+ {ok,NodeResults};
+ {error,Reason} ->
+ {error,Reason}
+ end.
+%% -----------------------------------------------------------------------------
+
+
+%% -----------------------------------------------------------------------------
+%% atc
+%% -----------------------------------------------------------------------------
+
+%% Function handling ativating a trace case. Trace cases that do not have a
+%% particular on/off handling (but just on in some scense) are handled here too.
+%% The trace case is entered into the Command History Log.
+%% Note that the trace case can not be executed at this node but must be
+%% executed where the inviso control component is.
+%% Further it is possible to either activated the tracecase for all running and
+%% tracing nodes, or just for a specified list of nodes.
+%% TC=tracecase_name(),
+%% Id=term(), identifiying this usage so we can turn it off later.
+%% Vars=list(), list of variable-value bindnings.
+h_atc(TC,Id,Vars,LD) ->
+ h_atc(TC,Id,Vars,LD,void). % For all running-tracing nodes.
+
+h_atc(TC,Id,Vars,LD=#ld{c_node=CNode,tc_dict=TCdict,chl=CHL},Nodes) ->
+ case find_id_chl(TC,Id,CHL) of
+ activating -> % Already started.
+ {error,activating};
+ stopping -> % Not yet stopped.
+ {error,deactivating};
+ false ->
+ case get_tracecase_tc_dict(TC,TCdict) of
+ {ok,TraceCase} -> % Such a trace case exists.
+ case check_bindings(Vars,TraceCase) of
+ {ok,Bindings} -> % Necessary vars exists in Vars.
+ if
is_list(Nodes) -> % Nodes predefined.
- h_atc_2(TC,Id,CNode,CHL,LD,TraceCase,Bindings,Nodes);
- true -> % Use all tracing and running nodes.
- Nodes1=get_nodenames_running_nodes(LD#ld.nodes),
- h_atc_2(TC,Id,CNode,CHL,LD,TraceCase,Bindings,Nodes1)
- end;
- {error,Reason} -> % Variable def missing.
- {error,Reason}
- end;
- false ->
- {error,unknown_tracecase}
- end;
- {ok,_Bindings} -> % Already activated and running.
- {error,already_started}
- end.
-
-h_atc_2(TC,Id,CNode,CHL,LD,TraceCase,Bindings,Nodes) ->
- case exec_trace_case_on(CNode,TraceCase,Bindings,Nodes) of
- {ok,ProcH} -> % Trace cases have no return values.
- NewCHL=set_activating_chl(TC,Id,CHL,Bindings,ProcH),
- {ok,LD#ld{chl=NewCHL}};
- {error,Reason} ->
- {error,Reason}
- end.
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% sync_atc
-%% -----------------------------------------------------------------------------
-
-h_sync_atc(TC,Id,Vars,TimeOut,LD=#ld{c_node=CNode,tc_dict=TCdict,chl=CHL}) ->
- case find_id_chl(TC,Id,CHL) of
- activating -> % Already started.
- {error,activating};
- stopping -> % Not yet stopped.
- {error,deactivating};
- false ->
- case get_tracecase_tc_dict(TC,TCdict) of
- {ok,TraceCase} -> % Such a trace case exists.
- case check_bindings(Vars,TraceCase) of
- {ok,Bindings} -> % Necessary vars exists in Vars.
- {ok,TcFName}=get_tc_activate_fname(TraceCase),
- Nodes=get_nodenames_running_nodes(LD#ld.nodes),
- Bindings2=erl_eval:add_binding('Nodes',Nodes,Bindings),
- RpcNode=get_rpc_nodename(CNode),
- case rpc:call(RpcNode,file,script,[TcFName,Bindings2],TimeOut) of
- {ok,Value} ->
- FakeProcH=make_ref(),
- NewCHL1=set_activating_chl(TC,Id,CHL,Bindings,FakeProcH),
- NewCHL2=set_running_chl(FakeProcH,TC,Id,Value,NewCHL1),
- {ok,LD#ld{chl=NewCHL2},Value};
- {error,Reason} ->
- {error,{faulty_tracecase,{TcFName,Reason}}};
- {badrpc,Reason} ->
- {error,{badrpc,Reason}}
- end;
- {error,Reason} -> % Variable def missing.
- {error,Reason}
- end;
- false ->
- {error,unknown_tracecase}
- end;
- {ok,_Bindings} -> % Already activated and running.
- {error,already_started}
- end.
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% rtc
-%% -----------------------------------------------------------------------------
-
-%% Function handling running a trace case without marking it as activated. It
-%% is in the history mearly indicated as activated
-h_sync_rtc(TC,Vars,TimeOut,LD=#ld{c_node=CNode,tc_dict=TCdict,chl=CHL}) ->
- case get_tracecase_tc_dict(TC,TCdict) of
- {ok,TraceCase} -> % Such a trace case exists.
- case check_bindings(Vars,TraceCase) of
- {ok,Bindings} -> % Necessary vars exists in Vars.
- {ok,TcFName}=get_tc_activate_fname(TraceCase),
- Nodes=get_nodenames_running_nodes(LD#ld.nodes),
- Bindings2=erl_eval:add_binding('Nodes',Nodes,Bindings),
- RpcNode=get_rpc_nodename(CNode),
- case rpc:call(RpcNode,file,script,[TcFName,Bindings2],TimeOut) of
- {ok,Value} ->
- {ok,LD#ld{chl=add_rtc_chl(TC,Bindings2,CHL)},Value};
- {error,Reason} ->
- {error,{faulty_tracecase,{TcFName,Reason}}};
- {badrpc,Reason} ->
- {error,{badrpc,Reason}}
- end;
- {error,Reason} -> % Variable def missing.
- {error,Reason}
- end;
- false ->
- {error,unknown_tracecase}
- end.
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% dtc
-%% -----------------------------------------------------------------------------
-
-%% Function handling turning a trace case off. The trace case must be registered
-%% as having an off mechanism. If it has an off mechanism and was previously entered
-%% into the Command History Log and is done with its activation phase, it will be
-%% executed and removed from the CHL.
-h_dtc(TC,Id,LD=#ld{c_node=CNode,tc_dict=TCdict,chl=CHL}) ->
- case find_id_chl(TC,Id,CHL) of
- {ok,Bindings} -> % Yes, we have turned it on before.
- case get_tracecase_tc_dict(TC,TCdict) of
- {ok,TraceCase} ->
- Nodes=get_nodenames_running_nodes(LD#ld.nodes),
- case exec_trace_case_off(CNode,TraceCase,Bindings,Nodes) of
- {ok,ProcH} ->
- NewCHL=set_stopping_chl(TC,Id,CHL,ProcH),
- {ok,LD#ld{chl=NewCHL}};
- {error,Reason} ->
- {error,Reason}
- end;
- false -> % Strange, Id ok but no such trace case.
- {error,unknown_tracecase}
- end;
- false -> % Not previously turned on.
- {error,unknown_id};
- activating ->
- {error,activating};
- stopping ->
- {error,already_deactivating}
- end.
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% sync_dtc
-%% -----------------------------------------------------------------------------
-
-h_sync_dtc(TC,Id,TimeOut,LD=#ld{c_node=CNode,tc_dict=TCdict,chl=CHL}) ->
- case find_id_chl(TC,Id,CHL) of
- {ok,Bindings} -> % Yes, we have turned it on before.
- case get_tracecase_tc_dict(TC,TCdict) of
- {ok,TraceCase} ->
- case get_tc_deactivate_fname(TraceCase) of
- {ok,TcFName} ->
- Nodes=get_nodenames_running_nodes(LD#ld.nodes),
- Bindings2=erl_eval:add_binding('Nodes',Nodes,Bindings),
- RpcNode=get_rpc_nodename(CNode),
- case rpc:call(RpcNode,file,script,[TcFName,Bindings2],TimeOut) of
- {ok,Value} ->
- FakeProcH=make_ref(),
- NewCHL1=set_stopping_chl(TC,Id,CHL,FakeProcH),
- NewCHL2=nullify_chl(FakeProcH,TC,Id,NewCHL1),
- {ok,LD#ld{chl=NewCHL2},Value};
- {error,Reason} -> % Script fault.
- {error,{faulty_tracecase,{TcFName,Reason}}};
- {badrpc,Reason} ->
- {error,{badrpc,Reason}}
- end;
- false ->
- {error,no_deactivation}
- end;
- false -> % Strange, Id ok but no such trace case.
- {error,unknown_tracecase}
- end;
- false -> % Not previously turned on.
- {error,unknown_id};
- activating ->
- {error,activating};
- stopping ->
- {error,already_deactivating}
- end.
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% inviso
-%% -----------------------------------------------------------------------------
-
-%% Function executing one inviso command. The returnvalue from the inviso
-%% function call will be the return value to the client. The command is
-%% entered into the history command log.
-%% Note that the inviso call may have to be done at another node, dictated
-%% by the c_node field. Further, if the module name is not an atom it is
-%% most likely a regexp, which must be expanded at the regexp_node. Note
-%% this is only relevant for tp and tpl.
-h_inviso(Cmd,Args,LD=#ld{c_node=CNode,regexp_node=RegExpNode,chl=CHL}) ->
- Arity=length(Args),
- case check_proper_inviso_call(Cmd,Arity) of
- {true,RegExpFlag} -> % Yes it is an inviso call.
- Nodes=get_nodenames_running_nodes(LD#ld.nodes),
- case h_inviso_2(Cmd,Args,CNode,RegExpNode,RegExpFlag,Nodes) of
- {ok,Result} ->
- case check_inviso_call_to_history(Cmd,Arity) of
- true -> % This function shall be added to chl.
- {ok,{Result,LD#ld{chl=add_inviso_call_chl(Cmd,Args,CHL)}}};
- false -> % Do not add it.
- {ok,{Result,LD}}
- end;
- {error,Reason} ->
- {error,Reason}
- end;
- false -> % Not an inviso function.
- {error,invalid_function_name}
- end.
-
-h_inviso_2(Cmd,Args,undefined,_,_,_) -> % A non distributed system.
- case catch apply(inviso,Cmd,Args) of % Regexp expansion only relevant when
- {'EXIT',Reason} -> % distributed, here let inviso_rt expand.
- {error,{'EXIT',Reason}};
- Result ->
- {ok,Result}
- end;
-h_inviso_2(Cmd,Args,CNode,RegExpNode,RegExpFlag,Nodes) ->
- case expand_module_regexps(Args,RegExpNode,Nodes,RegExpFlag) of
- {ok,NewArgs} ->
- case catch inviso_tool_lib:inviso_cmd(CNode,Cmd,[Nodes|NewArgs]) of
- {'EXIT',Reason} ->
- {error,{'EXIT',Reason}};
- {error,{badrpc,Reason}} -> % Includes runtime failure.
- {error,{badrpc,Reason}};
- Result ->
- {ok,Result}
- end;
- {error,Reason} ->
- {error,Reason}
- end.
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% reactivate
-%% -----------------------------------------------------------------------------
-
-h_reactivate(_Node,undefined) -> % The non-distributed case.
- case inviso:cancel_suspension() of
- ok ->
- ok;
- {error,Reason} ->
- {error,Reason}
- end;
-h_reactivate(Node,CNode) ->
- case inviso_tool_lib:inviso_cmd(CNode,cancel_suspension,[[Node]]) of
- {ok,[{Node,ok}]} ->
- ok;
- {ok,[{Node,{error,Reason}}]} ->
- {error,Reason};
- {error,Reason} ->
- {error,Reason}
- end.
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% save_history
-%% -----------------------------------------------------------------------------
-
-h_save_history(HDir,Dir,FileName,SortedLog) ->
- Dir0=
- if
+ h_atc_2(TC,Id,CNode,CHL,LD,TraceCase,Bindings,Nodes);
+ true -> % Use all tracing and running nodes.
+ Nodes1=get_nodenames_running_nodes(LD#ld.nodes),
+ h_atc_2(TC,Id,CNode,CHL,LD,TraceCase,Bindings,Nodes1)
+ end;
+ {error,Reason} -> % Variable def missing.
+ {error,Reason}
+ end;
+ false ->
+ {error,unknown_tracecase}
+ end;
+ {ok,_Bindings} -> % Already activated and running.
+ {error,already_started}
+ end.
+
+h_atc_2(TC,Id,CNode,CHL,LD,TraceCase,Bindings,Nodes) ->
+ {ok,ProcH} = exec_trace_case_on(CNode,TraceCase,Bindings,Nodes),
+ %% Trace cases have no return values.
+ NewCHL=set_activating_chl(TC,Id,CHL,Bindings,ProcH),
+ {ok,LD#ld{chl=NewCHL}}.
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% sync_atc
+%% -----------------------------------------------------------------------------
+
+h_sync_atc(TC,Id,Vars,TimeOut,LD=#ld{c_node=CNode,tc_dict=TCdict,chl=CHL}) ->
+ case find_id_chl(TC,Id,CHL) of
+ activating -> % Already started.
+ {error,activating};
+ stopping -> % Not yet stopped.
+ {error,deactivating};
+ false ->
+ case get_tracecase_tc_dict(TC,TCdict) of
+ {ok,TraceCase} -> % Such a trace case exists.
+ case check_bindings(Vars,TraceCase) of
+ {ok,Bindings} -> % Necessary vars exists in Vars.
+ {ok,TcFName}=get_tc_activate_fname(TraceCase),
+ Nodes=get_nodenames_running_nodes(LD#ld.nodes),
+ Bindings2=erl_eval:add_binding('Nodes',Nodes,Bindings),
+ RpcNode=get_rpc_nodename(CNode),
+ case rpc:call(RpcNode,file,script,[TcFName,Bindings2],TimeOut) of
+ {ok,Value} ->
+ FakeProcH=make_ref(),
+ NewCHL1=set_activating_chl(TC,Id,CHL,Bindings,FakeProcH),
+ NewCHL2=set_running_chl(FakeProcH,TC,Id,Value,NewCHL1),
+ {ok,LD#ld{chl=NewCHL2},Value};
+ {error,Reason} ->
+ {error,{faulty_tracecase,{TcFName,Reason}}};
+ {badrpc,Reason} ->
+ {error,{badrpc,Reason}}
+ end;
+ {error,Reason} -> % Variable def missing.
+ {error,Reason}
+ end;
+ false ->
+ {error,unknown_tracecase}
+ end;
+ {ok,_Bindings} -> % Already activated and running.
+ {error,already_started}
+ end.
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% rtc
+%% -----------------------------------------------------------------------------
+
+%% Function handling running a trace case without marking it as activated. It
+%% is in the history mearly indicated as activated
+h_sync_rtc(TC,Vars,TimeOut,LD=#ld{c_node=CNode,tc_dict=TCdict,chl=CHL}) ->
+ case get_tracecase_tc_dict(TC,TCdict) of
+ {ok,TraceCase} -> % Such a trace case exists.
+ case check_bindings(Vars,TraceCase) of
+ {ok,Bindings} -> % Necessary vars exists in Vars.
+ {ok,TcFName}=get_tc_activate_fname(TraceCase),
+ Nodes=get_nodenames_running_nodes(LD#ld.nodes),
+ Bindings2=erl_eval:add_binding('Nodes',Nodes,Bindings),
+ RpcNode=get_rpc_nodename(CNode),
+ case rpc:call(RpcNode,file,script,[TcFName,Bindings2],TimeOut) of
+ {ok,Value} ->
+ {ok,LD#ld{chl=add_rtc_chl(TC,Bindings2,CHL)},Value};
+ {error,Reason} ->
+ {error,{faulty_tracecase,{TcFName,Reason}}};
+ {badrpc,Reason} ->
+ {error,{badrpc,Reason}}
+ end;
+ {error,Reason} -> % Variable def missing.
+ {error,Reason}
+ end;
+ false ->
+ {error,unknown_tracecase}
+ end.
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% dtc
+%% -----------------------------------------------------------------------------
+
+%% Function handling turning a trace case off. The trace case must be registered
+%% as having an off mechanism. If it has an off mechanism and was previously entered
+%% into the Command History Log and is done with its activation phase, it will be
+%% executed and removed from the CHL.
+h_dtc(TC,Id,LD=#ld{c_node=CNode,tc_dict=TCdict,chl=CHL}) ->
+ case find_id_chl(TC,Id,CHL) of
+ {ok,Bindings} -> % Yes, we have turned it on before.
+ case get_tracecase_tc_dict(TC,TCdict) of
+ {ok,TraceCase} ->
+ Nodes=get_nodenames_running_nodes(LD#ld.nodes),
+ case exec_trace_case_off(CNode,TraceCase,Bindings,Nodes) of
+ {ok,ProcH} ->
+ NewCHL=set_stopping_chl(TC,Id,CHL,ProcH),
+ {ok,LD#ld{chl=NewCHL}};
+ {error,Reason} ->
+ {error,Reason}
+ end;
+ false -> % Strange, Id ok but no such trace case.
+ {error,unknown_tracecase}
+ end;
+ false -> % Not previously turned on.
+ {error,unknown_id};
+ activating ->
+ {error,activating};
+ stopping ->
+ {error,already_deactivating}
+ end.
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% sync_dtc
+%% -----------------------------------------------------------------------------
+
+h_sync_dtc(TC,Id,TimeOut,LD=#ld{c_node=CNode,tc_dict=TCdict,chl=CHL}) ->
+ case find_id_chl(TC,Id,CHL) of
+ {ok,Bindings} -> % Yes, we have turned it on before.
+ case get_tracecase_tc_dict(TC,TCdict) of
+ {ok,TraceCase} ->
+ case get_tc_deactivate_fname(TraceCase) of
+ {ok,TcFName} ->
+ Nodes=get_nodenames_running_nodes(LD#ld.nodes),
+ Bindings2=erl_eval:add_binding('Nodes',Nodes,Bindings),
+ RpcNode=get_rpc_nodename(CNode),
+ case rpc:call(RpcNode,file,script,[TcFName,Bindings2],TimeOut) of
+ {ok,Value} ->
+ FakeProcH=make_ref(),
+ NewCHL1=set_stopping_chl(TC,Id,CHL,FakeProcH),
+ NewCHL2=nullify_chl(FakeProcH,TC,Id,NewCHL1),
+ {ok,LD#ld{chl=NewCHL2},Value};
+ {error,Reason} -> % Script fault.
+ {error,{faulty_tracecase,{TcFName,Reason}}};
+ {badrpc,Reason} ->
+ {error,{badrpc,Reason}}
+ end;
+ false ->
+ {error,no_deactivation}
+ end;
+ false -> % Strange, Id ok but no such trace case.
+ {error,unknown_tracecase}
+ end;
+ false -> % Not previously turned on.
+ {error,unknown_id};
+ activating ->
+ {error,activating};
+ stopping ->
+ {error,already_deactivating}
+ end.
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% inviso
+%% -----------------------------------------------------------------------------
+
+%% Function executing one inviso command. The returnvalue from the inviso
+%% function call will be the return value to the client. The command is
+%% entered into the history command log.
+%% Note that the inviso call may have to be done at another node, dictated
+%% by the c_node field. Further, if the module name is not an atom it is
+%% most likely a regexp, which must be expanded at the regexp_node. Note
+%% this is only relevant for tp and tpl.
+h_inviso(Cmd,Args,LD=#ld{c_node=CNode,regexp_node=RegExpNode,chl=CHL}) ->
+ Arity=length(Args),
+ case check_proper_inviso_call(Cmd,Arity) of
+ {true,RegExpFlag} -> % Yes it is an inviso call.
+ Nodes=get_nodenames_running_nodes(LD#ld.nodes),
+ case h_inviso_2(Cmd,Args,CNode,RegExpNode,RegExpFlag,Nodes) of
+ {ok,Result} ->
+ case check_inviso_call_to_history(Cmd,Arity) of
+ true -> % This function shall be added to chl.
+ {ok,{Result,LD#ld{chl=add_inviso_call_chl(Cmd,Args,CHL)}}};
+ false -> % Do not add it.
+ {ok,{Result,LD}}
+ end;
+ {error,Reason} ->
+ {error,Reason}
+ end;
+ false -> % Not an inviso function.
+ {error,invalid_function_name}
+ end.
+
+h_inviso_2(Cmd,Args,undefined,_,_,_) -> % A non distributed system.
+ case catch apply(inviso,Cmd,Args) of % Regexp expansion only relevant when
+ {'EXIT',Reason} -> % distributed, here let inviso_rt expand.
+ {error,{'EXIT',Reason}};
+ Result ->
+ {ok,Result}
+ end;
+h_inviso_2(Cmd,Args,CNode,RegExpNode,RegExpFlag,Nodes) ->
+ case expand_module_regexps(Args,RegExpNode,Nodes,RegExpFlag) of
+ {ok,NewArgs} ->
+ case catch inviso_tool_lib:inviso_cmd(CNode,Cmd,[Nodes|NewArgs]) of
+ {'EXIT',Reason} ->
+ {error,{'EXIT',Reason}};
+ {error,{badrpc,Reason}} -> % Includes runtime failure.
+ {error,{badrpc,Reason}};
+ Result ->
+ {ok,Result}
+ end;
+ {error,Reason} ->
+ {error,Reason}
+ end.
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% reactivate
+%% -----------------------------------------------------------------------------
+
+h_reactivate(_Node,undefined) -> % The non-distributed case.
+ case inviso:cancel_suspension() of
+ ok ->
+ ok;
+ {error,Reason} ->
+ {error,Reason}
+ end;
+h_reactivate(Node,CNode) ->
+ case inviso_tool_lib:inviso_cmd(CNode,cancel_suspension,[[Node]]) of
+ {ok,[{Node,ok}]} ->
+ ok;
+ {ok,[{Node,{error,Reason}}]} ->
+ {error,Reason};
+ {error,Reason} ->
+ {error,Reason}
+ end.
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% save_history
+%% -----------------------------------------------------------------------------
+
+h_save_history(HDir,Dir,FileName,SortedLog) ->
+ Dir0=
+ if
is_list(HDir) -> % There is a history dir specified.
- HDir; % Use it then.
- true ->
- Dir % Else use the tool dir.
- end,
- case catch make_absolute_path(FileName,Dir0) of
+ HDir; % Use it then.
+ true ->
+ Dir % Else use the tool dir.
+ end,
+ case catch make_absolute_path(FileName,Dir0) of
AbsFileName when is_list(AbsFileName) ->
- Log2=build_saved_history_data(SortedLog), % Remove stopped tracecases.
- case file:write_file(AbsFileName,term_to_binary(Log2)) of
- ok ->
- {ok,AbsFileName};
- {error,Reason} ->
- {error,{write_file,Reason}}
- end;
- {'EXIT',_Reason} ->
- {error,{bad_filename,FileName}}
- end.
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% get_autostart_data
-%% -----------------------------------------------------------------------------
-
-%% Help function building the structures used when exporting autostart information
-%% from the tool. Note that we remove the tool-dependency and insert the one
-%% specify in the get_autostart_data call.
-h_get_autostart_data(local_runtime,_,Dependency,ASD,M,F,TDGargs,OptsG) ->
- CompleteTDGargs=call_tracer_data_generator_mkargs(local_runtime,TDGargs),
- Opts0=start_runtime_components_mk_opts(local_runtime,OptsG),
- Opts=[Dependency|lists:keydelete(dependency,1,Opts0)],
- {ok,{ASD,{ok,{Opts,{tdg,{M,F,CompleteTDGargs}}}}}};
-
+ Log2=build_saved_history_data(SortedLog), % Remove stopped tracecases.
+ case file:write_file(AbsFileName,term_to_binary(Log2)) of
+ ok ->
+ {ok,AbsFileName};
+ {error,Reason} ->
+ {error,{write_file,Reason}}
+ end;
+ {'EXIT',_Reason} ->
+ {error,{bad_filename,FileName}}
+ end.
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% get_autostart_data
+%% -----------------------------------------------------------------------------
+
+%% Help function building the structures used when exporting autostart information
+%% from the tool. Note that we remove the tool-dependency and insert the one
+%% specify in the get_autostart_data call.
+h_get_autostart_data(local_runtime,_,Dependency,ASD,M,F,TDGargs,OptsG) ->
+ CompleteTDGargs=call_tracer_data_generator_mkargs(local_runtime,TDGargs),
+ Opts0=start_runtime_components_mk_opts(local_runtime,OptsG),
+ Opts=[Dependency|lists:keydelete(dependency,1,Opts0)],
+ {ok,{ASD,{ok,{Opts,{tdg,{M,F,CompleteTDGargs}}}}}};
+
h_get_autostart_data(Nodes,CNode,Dependency,ASD,M,F,TDGargs,OptsG) when is_list(Nodes) ->
- {ok,{ASD,h_get_autostart_data_2(Nodes,CNode,Dependency,M,F,TDGargs,OptsG)}};
-h_get_autostart_data(Nodes,_CNode,_Dependency,_ASD,_M,_F,_TDGargs,_OptsG) ->
- {error,{badarg,Nodes}}.
-
-h_get_autostart_data_2([Node|Rest],CNode,Dependency,M,F,TDGargs,OptsG) ->
- CompleteTDGargs=call_tracer_data_generator_mkargs(Node,TDGargs),
- Opts0=start_runtime_components_mk_opts(Node,OptsG),
- Opts=[Dependency|lists:keydelete(dependency,1,Opts0)],
- [{Node,{ok,{Opts,{tdg,{M,F,CompleteTDGargs}}}}}|
- h_get_autostart_data_2(Rest,CNode,Dependency,M,F,TDGargs,OptsG)];
-h_get_autostart_data_2([],_CNode,_Dependency,_M,_F,_TDGargs,_OptsG) ->
- [].
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% flush
-%% -----------------------------------------------------------------------------
-
-h_flush(undefined,_Nodes) ->
- inviso:flush();
-h_flush(CNode,Nodes) ->
- inviso_tool_lib:inviso_cmd(CNode,flush,[Nodes]).
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% tc_executer_reply
-%% -----------------------------------------------------------------------------
-
-%% Function handling that a trace case has completed its activation phase and
-%% shall now be marked in the Command History Log as running.
-h_tc_activation_done(ProcH,Result,LD=#ld{chl=CHL}) ->
- case find_tc_executer_chl(ProcH,CHL) of
- {activating,{TC,Id}} ->
- case Result of
- {ok,Value} -> % The trace case is successful activated.
- {ok,LD#ld{chl=set_running_chl(ProcH,TC,Id,Value,CHL)}};
- {error,_} -> % Then pretend it never happend :-)
- {ok,LD#ld{chl=del_tc_chl(ProcH,TC,Id,CHL)}} % Remove it.
- end;
- _ -> % Where did this come from?
- {ok,LD} % Well just ignore it then.
- end.
-%% -----------------------------------------------------------------------------
-
-%% Function handling that a trace case has completed its stopping phase and
-%% shall now be nulled in the Command History Log (meaning that it will not
-%% be repeated in the event of a reactivation).
-h_tc_stopping_done(ProcH,Result,LD=#ld{chl=CHL}) ->
- case find_tc_executer_chl(ProcH,CHL) of
- {stopping,{TC,Id}} ->
- case Result of
- {ok,_Result} -> % _Result is returned from the tracecase.
- {ok,LD#ld{chl=nullify_chl(ProcH,TC,Id,CHL)}};
- {error,_} -> % This is difficult, is it still active?
- {ok,LD#ld{chl=nullify_chl(ProcH,TC,Id,CHL)}}
- end;
- _ -> % Strange.
- {ok,LD}
- end.
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% Terminate.
-%% -----------------------------------------------------------------------------
-
-%% Help function stopping the inviso control component. Does not return
-%% anything significant.
-stop_inviso_at_c_node(undefined) -> % Non distributed case.
- inviso:stop();
-stop_inviso_at_c_node(CNode) ->
- rpc:call(CNode,inviso,stop,[]).
-%% -----------------------------------------------------------------------------
-
-%% Help function that removes all trace patterns from the nodes that are not
-%% marked as such were patterns shall be left after stopping of inviso.
-%% Returns {ok,NodeResult} or {error,Reason}. In the non-distributed case
-%% 'ok' is returned incase of success, ot 'patterns_untouched'.
-remove_all_trace_patterns(undefined,KeepNodes,_Nodes) ->
- case KeepNodes of
- undefined -> % No, remove patterns from localruntime.
- inviso:ctp_all();
- _ ->
- patterns_untouched
- end;
-remove_all_trace_patterns(CNode,KeepNodes,Nodes) ->
- Nodes2=lists:filter(fun(N)->not(lists:member(N,KeepNodes)) end,Nodes),
- case inviso_tool_lib:inviso_cmd(CNode,ctp_all,[Nodes2]) of
- {ok,NodeResults} ->
- F=fun(N) ->
- case lists:member(N,KeepNodes) of
- true ->
- {N,patterns_untouched};
- false ->
- case lists:keysearch(N,1,NodeResults) of
- {value,Result} ->
- Result; % {Node,ok}
- false -> % Extremely strange.
- {N,{error,general_error}}
- end
- end
- end,
- {ok,lists:map(F,Nodes)};
- {error,{badrpc,Reason}} ->
- {error,{inviso_control_node_error,Reason}};
- {error,Reason} ->
- {error,Reason}
- end.
-%% -----------------------------------------------------------------------------
-
-%% =============================================================================
-%% Second level help functions.
-%% =============================================================================
-
-%% Help function building a reply to a reconnection call based on which nodes
-%% where asked to be reconnected and which of those are actually now working.
-%% We actually make an effort to serve the return value in the same order as the
-%% nodes were mentioned in the original call (Nodes).
-build_reconnect_nodes_reply(local_runtime,local_runtime,_NodesErr,NodesD) ->
- case get_state_nodes(local_runtime,NodesD) of
- down ->
- {error,down};
- {State,Status} ->
- {ok,{State,Status}}
- end;
-build_reconnect_nodes_reply(local_runtime,_,NodesErr,_NodesD) ->
- NodesErr;
-build_reconnect_nodes_reply([Node|Rest],Nodes2,NodesErr,NodesD) ->
- case lists:member(Node,Nodes2) of
- true -> % Ok, look in the #ld.nodes.
- case get_state_nodes(Node,NodesD) of
- down -> % Somekind of failure, still down.
- [{Node,{error,down}}|
- build_reconnect_nodes_reply(Rest,Nodes2,NodesErr,NodesD)];
- {State,Status} -> % {State,Status}
- [{Node,{ok,{State,Status}}}|
- build_reconnect_nodes_reply(Rest,Nodes2,NodesErr,NodesD)]
- end;
- false -> % Error already from the beginning.
- {value,{_,Error}}=lists:keysearch(Node,1,NodesErr),
- [{Node,Error}|build_reconnect_nodes_reply(Rest,Nodes2,NodesErr,NodesD)]
- end;
-build_reconnect_nodes_reply([],_,_,_) ->
- [].
-%% -----------------------------------------------------------------------------
-
-%% Help function building a return value to reinitiate_session. Nodes contains
-%% all involved nodes. If the node occurrs in NodesErr, we choose the error in
-%% NodesErr. Otherwise the returnvalue in ReturnVal is used.
-build_reinitiate_session_reply(Nodes,NodesErr,{ok,NodesResults}) ->
- {ok,build_reinitiate_session_reply_2(Nodes,NodesErr,NodesResults)};
-build_reinitiate_session_reply(local_runtime,[],NodeResult) ->
- NodeResult;
-build_reinitiate_session_reply(local_runtime,NodesErr,_NodeResult) ->
- NodesErr.
-build_reinitiate_session_reply_2([Node|Rest],NodesErr,NodeResults) ->
- case lists:keysearch(Node,1,NodesErr) of
- {value,{_,Error}} ->
- [{Node,Error}|build_reinitiate_session_reply_2(Rest,NodesErr,NodeResults)];
- false ->
- case lists:keysearch(Node,1,NodeResults) of
- {value,Value} ->
- [Value|build_reinitiate_session_reply_2(Rest,NodesErr,NodeResults)]
- end
- end;
-build_reinitiate_session_reply_2([],_NodesErr,_NodeResults) ->
- [].
-%% -----------------------------------------------------------------------------
-
-%% Help function returning a history log where stop and stopping entries have
-%% been removed. Further all tracecase log entries must be set to running since
-%% there can not be such a thing as an activating tracecase stored away in a
-%% saved historyfile!
-%% We must also take away any #Ref.
-build_saved_history_data(SortedLog) ->
- CleanedLog=
- lists:filter(fun({_,_,Stop,_}) when Stop==stop;Stop==stopping -> false;
- (_) -> true
- end,
- SortedLog),
- lists:map(fun({{TC,Id},C,activating,B}) -> {{TC,Id},C,running,B};
- ({{TC,Id},C,S,B}) -> {{TC,Id},C,S,B};
- ({{M,F,Args,_Ref},C}) -> {{M,F,Args},C};
- ({{TC,_Ref},C,B}) -> {TC,C,B} % An rtc.
- end,
- CleanedLog).
-%% -----------------------------------------------------------------------------
-
-%% This help function builds the AutoStartData structure which is returned from
-%% get_austostart_data. An AutoStartData structure is a list of trace-files and
-%% inviso commands. The order is significant since it is the idea that doing
-%% the trace case files and inviso commands in that order will bring a node to
-%% a certain state in a trace perspective.
-%% Returns {ok,AutoStartData} or {error,Reason}
-build_autostart_data(SortedLog,TCdict) ->
- build_autostart_data_2(SortedLog,TCdict,[]).
-
-build_autostart_data_2([{_,_C,Stop,_B}|Rest],TCdict,Accum) when Stop==stop;Stop==stopping->
- build_autostart_data_2(Rest,TCdict,Accum); % Simply skip deactivated/deativating.
-build_autostart_data_2([{{TCname,_},_C,activating,Bindings}|Rest],TCdict,Accum) ->
- build_autostart_data_tc(TCname,Bindings,TCdict,Rest,Accum);
-build_autostart_data_2([{{TCname,_},_C,running,Bindings}|Rest],TCdict,Accum) ->
- build_autostart_data_tc(TCname,Bindings,TCdict,Rest,Accum);
-build_autostart_data_2([{{TCname,_Ref},_C,Bindings}|Rest],TCdict,Accum) ->
- build_autostart_data_tc(TCname,Bindings,TCdict,Rest,Accum);
-build_autostart_data_2([{{M,F,Args,_Ref},_C}|Rest],TCdict,Accum) ->
- build_autostart_data_2(Rest,TCdict,[{mfa,{M,F,Args}}|Accum]);
-build_autostart_data_2([],_TCdict,Accum) ->
- {ok,lists:reverse(Accum)}.
-
-%% Help function placing the filename in the AutoStartData structure.
-build_autostart_data_tc(TCname,Bindings,TCdict,Rest,Accum) ->
- {ok,TC}=get_tracecase_tc_dict(TCname,TCdict),
- {ok,FName}=get_tc_activate_fname(TC),
- build_autostart_data_2(Rest,TCdict,[{file,{FName,Bindings}}|Accum]).
-%% -----------------------------------------------------------------------------
-
-%% Help function generating tracerdata to init inviso tracing. The generation
-%% is done by the TracerDataGenerator, TDG, function.
-%% Individual tracerdata is generated for each node in Nodes.
-%% Returns {ok,TracerData} or {error,Reason}.
-call_tracer_data_generator(undefined,M,F,TDGargs,_Nodes) -> % Non distributed.
- case catch call_tracer_data_generator_3(M,F,TDGargs,local_runtime) of
- {'EXIT',Reason} ->
- {error,{'EXIT',Reason}};
- TracerData ->
- {ok,TracerData}
- end;
-call_tracer_data_generator(_CNode,M,F,TDGargs,Nodes) ->
- case catch call_tracer_data_generator_2(M,F,TDGargs,Nodes) of
- {'EXIT',Reason} ->
- {error,{'EXIT',Reason}};
- TracerList ->
- {ok,TracerList}
- end.
-
-call_tracer_data_generator_2(M,F,TDGargs,[Node|Rest]) ->
- [{Node,call_tracer_data_generator_3(M,F,TDGargs,Node)}|
- call_tracer_data_generator_2(M,F,TDGargs,Rest)];
-call_tracer_data_generator_2(_,_,_,[]) ->
- [].
-
-call_tracer_data_generator_3(M,F,TDGargs,Node) ->
- apply(M,F,call_tracer_data_generator_mkargs(Node,TDGargs)).
-
-%% This function creates the arguments that the tracer data generator function
-%% accepts (in an apply call). The reason for making it a sepparate function is
-%% that the arguments are constructed in more situations than just when actually
-%% doing the apply. By having a function it will become obvious where to change
-%% should the arguments change.
-call_tracer_data_generator_mkargs(Node,TDGargs) ->
- inviso_tool_lib:mk_complete_tdg_args(Node,TDGargs).
-%% -----------------------------------------------------------------------------
-
-%% This function acts as standard options generator function. That is returning
-%% the options argument to inviso:add_node/3. Note that this function must not
-%% return the dependency part of that option.
-std_options_generator(_Node) ->
- []. % No particular options(!)
-%% -----------------------------------------------------------------------------
-
-
-%% Help function checking that Vars contains a binding for every variable
-%% listed in the VarNames field in TraceCase. Note that the special variable 'Nodes'
-%% is disregarded, since it is always added by the inviso_tool.
-%% Returns {ok,Bindings} or {error,Reason}. Where Bindings is a bindngs structure
-%% according to file:eval functionality.
-check_bindings(Vars,TraceCase) ->
- case catch check_bindings_2(Vars,
- get_tc_varnames(TraceCase),
- erl_eval:new_bindings()) of
- {'EXIT',_Reason} ->
- {error,variable_error};
- {error,Reason} -> % Missing a bindning.
- {error,Reason};
- {ok,Bindings} ->
- {ok,Bindings}
- end.
-
-check_bindings_2(Vars,['Nodes'|Rest],Bindings) ->
- check_bindings_2(Vars,Rest,Bindings); % Disregard Nodes since it is automatic.
-check_bindings_2(Vars,[VarName|Rest],Bindings) ->
- case lists:keysearch(VarName,1,Vars) of
- {value,{_,Val}} ->
- check_bindings_2(Vars,Rest,erl_eval:add_binding(VarName,Val,Bindings));
- false -> % Mandatory variable missing.
- {error,{missing_variable,VarName}} % Quite here then.
- end;
-check_bindings_2(_,[],Bindings) ->
- {ok,Bindings}.
-%% -----------------------------------------------------------------------------
-
-%% This help function checks that the command the user tries to do is amongst
-%% the inviso API. It at the same time returns what kind of command it is.
-%% {true,RegExpFlag} or 'false' where RegExpFlag indicates if this command
-%% needs to have its argument modified by module regexp expansion or not.
-check_proper_inviso_call(Cmd,Arity) ->
- case lists:member({Cmd,Arity},?INVISO_CMDS) of
- true -> % It is part of inviso API.
- {true,check_proper_inviso_call_regexp(Cmd,Arity)};
- false ->
- false
- end.
-
-%% Returns {Type,Arity,PlaceOfModuleSpec} or 'false'.
-check_proper_inviso_call_regexp(tp,5) -> {tp,5,1};
-check_proper_inviso_call_regexp(tp,4) -> {tp,4,1};
-check_proper_inviso_call_regexp(tp,1) -> {tp,1,1};
-check_proper_inviso_call_regexp(tpl,5) -> {tp,5,1};
-check_proper_inviso_call_regexp(tpl,4) -> {tp,4,1};
-check_proper_inviso_call_regexp(tpl,1) -> {tp,1,1};
-check_proper_inviso_call_regexp(ctp,3) -> {ctp,3,1};
-check_proper_inviso_call_regexp(ctp,1) -> {ctp,1,1};
-check_proper_inviso_call_regexp(ctpl,3) -> {ctp,3,1};
-check_proper_inviso_call_regexp(ctpl,1) -> {ctp,1,1};
-check_proper_inviso_call_regexp(_,_) -> % No regexp expansion.
- false.
-%% -----------------------------------------------------------------------------
-
-%% Help function checking if this inviso command shall be added to the command
-%% history log. Returns true or false.
-check_inviso_call_to_history(Cmd,Arity) ->
- case lists:member({Cmd,Arity},?INVISO_CMD_HISTORY) of
- true ->
- true;
- false ->
- false
- end.
-%% -----------------------------------------------------------------------------
-
-%% Help function traversing the arguments and expanding module names stated
-%% as regular expressions. This means that the resulting arguments may be longer
-%% than the orginal ones.
-%% When we run this function it has been determined that we are a distributed
-%% system.
-%% Also note that if there are no regexps in Args, no regexpansion will be
-%% made and RegExpNode may be 'undefined' (as it is if not set at start-up).
-%% If RegExpNode is unavailable the nodes found in Nodes will be used until
-%% one that works is found.
-expand_module_regexps(Args,_RegExpNode,_Nodes,false) ->
- {ok,Args};
-expand_module_regexps([PatternList],RegExpNode,Nodes,{tp,1,1}) ->
- case catch expand_module_regexps_tp(PatternList,RegExpNode,Nodes) of
+ {ok,{ASD,h_get_autostart_data_2(Nodes,CNode,Dependency,M,F,TDGargs,OptsG)}};
+h_get_autostart_data(Nodes,_CNode,_Dependency,_ASD,_M,_F,_TDGargs,_OptsG) ->
+ {error,{badarg,Nodes}}.
+
+h_get_autostart_data_2([Node|Rest],CNode,Dependency,M,F,TDGargs,OptsG) ->
+ CompleteTDGargs=call_tracer_data_generator_mkargs(Node,TDGargs),
+ Opts0=start_runtime_components_mk_opts(Node,OptsG),
+ Opts=[Dependency|lists:keydelete(dependency,1,Opts0)],
+ [{Node,{ok,{Opts,{tdg,{M,F,CompleteTDGargs}}}}}|
+ h_get_autostart_data_2(Rest,CNode,Dependency,M,F,TDGargs,OptsG)];
+h_get_autostart_data_2([],_CNode,_Dependency,_M,_F,_TDGargs,_OptsG) ->
+ [].
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% flush
+%% -----------------------------------------------------------------------------
+
+h_flush(undefined,_Nodes) ->
+ inviso:flush();
+h_flush(CNode,Nodes) ->
+ inviso_tool_lib:inviso_cmd(CNode,flush,[Nodes]).
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% tc_executer_reply
+%% -----------------------------------------------------------------------------
+
+%% Function handling that a trace case has completed its activation phase and
+%% shall now be marked in the Command History Log as running.
+h_tc_activation_done(ProcH,Result,LD=#ld{chl=CHL}) ->
+ case find_tc_executer_chl(ProcH,CHL) of
+ {activating,{TC,Id}} ->
+ case Result of
+ {ok,Value} -> % The trace case is successful activated.
+ {ok,LD#ld{chl=set_running_chl(ProcH,TC,Id,Value,CHL)}};
+ {error,_} -> % Then pretend it never happend :-)
+ {ok,LD#ld{chl=del_tc_chl(ProcH,TC,Id,CHL)}} % Remove it.
+ end;
+ _ -> % Where did this come from?
+ {ok,LD} % Well just ignore it then.
+ end.
+%% -----------------------------------------------------------------------------
+
+%% Function handling that a trace case has completed its stopping phase and
+%% shall now be nulled in the Command History Log (meaning that it will not
+%% be repeated in the event of a reactivation).
+h_tc_stopping_done(ProcH,Result,LD=#ld{chl=CHL}) ->
+ case find_tc_executer_chl(ProcH,CHL) of
+ {stopping,{TC,Id}} ->
+ case Result of
+ {ok,_Result} -> % _Result is returned from the tracecase.
+ {ok,LD#ld{chl=nullify_chl(ProcH,TC,Id,CHL)}};
+ {error,_} -> % This is difficult, is it still active?
+ {ok,LD#ld{chl=nullify_chl(ProcH,TC,Id,CHL)}}
+ end;
+ _ -> % Strange.
+ {ok,LD}
+ end.
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% Terminate.
+%% -----------------------------------------------------------------------------
+
+%% Help function stopping the inviso control component. Does not return
+%% anything significant.
+stop_inviso_at_c_node(undefined) -> % Non distributed case.
+ inviso:stop();
+stop_inviso_at_c_node(CNode) ->
+ rpc:call(CNode,inviso,stop,[]).
+%% -----------------------------------------------------------------------------
+
+%% Help function that removes all trace patterns from the nodes that are not
+%% marked as such were patterns shall be left after stopping of inviso.
+%% Returns {ok,NodeResult} or {error,Reason}. In the non-distributed case
+%% 'ok' is returned incase of success, ot 'patterns_untouched'.
+remove_all_trace_patterns(undefined,KeepNodes,_Nodes) ->
+ case KeepNodes of
+ undefined -> % No, remove patterns from localruntime.
+ inviso:ctp_all();
+ _ ->
+ patterns_untouched
+ end;
+remove_all_trace_patterns(CNode,KeepNodes,Nodes) ->
+ Nodes2=lists:filter(fun(N)->not(lists:member(N,KeepNodes)) end,Nodes),
+ case inviso_tool_lib:inviso_cmd(CNode,ctp_all,[Nodes2]) of
+ {ok,NodeResults} ->
+ F=fun(N) ->
+ case lists:member(N,KeepNodes) of
+ true ->
+ {N,patterns_untouched};
+ false ->
+ case lists:keysearch(N,1,NodeResults) of
+ {value,Result} ->
+ Result; % {Node,ok}
+ false -> % Extremely strange.
+ {N,{error,general_error}}
+ end
+ end
+ end,
+ {ok,lists:map(F,Nodes)};
+ {error,{badrpc,Reason}} ->
+ {error,{inviso_control_node_error,Reason}};
+ {error,Reason} ->
+ {error,Reason}
+ end.
+%% -----------------------------------------------------------------------------
+
+%% =============================================================================
+%% Second level help functions.
+%% =============================================================================
+
+%% Help function building a reply to a reconnection call based on which nodes
+%% where asked to be reconnected and which of those are actually now working.
+%% We actually make an effort to serve the return value in the same order as the
+%% nodes were mentioned in the original call (Nodes).
+build_reconnect_nodes_reply(local_runtime,local_runtime,_NodesErr,NodesD) ->
+ case get_state_nodes(local_runtime,NodesD) of
+ down ->
+ {error,down};
+ {State,Status} ->
+ {ok,{State,Status}}
+ end;
+build_reconnect_nodes_reply(local_runtime,_,NodesErr,_NodesD) ->
+ NodesErr;
+build_reconnect_nodes_reply([Node|Rest],Nodes2,NodesErr,NodesD) ->
+ case lists:member(Node,Nodes2) of
+ true -> % Ok, look in the #ld.nodes.
+ case get_state_nodes(Node,NodesD) of
+ down -> % Somekind of failure, still down.
+ [{Node,{error,down}}|
+ build_reconnect_nodes_reply(Rest,Nodes2,NodesErr,NodesD)];
+ {State,Status} -> % {State,Status}
+ [{Node,{ok,{State,Status}}}|
+ build_reconnect_nodes_reply(Rest,Nodes2,NodesErr,NodesD)]
+ end;
+ false -> % Error already from the beginning.
+ {value,{_,Error}}=lists:keysearch(Node,1,NodesErr),
+ [{Node,Error}|build_reconnect_nodes_reply(Rest,Nodes2,NodesErr,NodesD)]
+ end;
+build_reconnect_nodes_reply([],_,_,_) ->
+ [].
+%% -----------------------------------------------------------------------------
+
+%% Help function building a return value to reinitiate_session. Nodes contains
+%% all involved nodes. If the node occurrs in NodesErr, we choose the error in
+%% NodesErr. Otherwise the returnvalue in ReturnVal is used.
+build_reinitiate_session_reply(Nodes,NodesErr,{ok,NodesResults}) ->
+ {ok,build_reinitiate_session_reply_2(Nodes,NodesErr,NodesResults)};
+build_reinitiate_session_reply(local_runtime,[],NodeResult) ->
+ NodeResult;
+build_reinitiate_session_reply(local_runtime,NodesErr,_NodeResult) ->
+ NodesErr.
+build_reinitiate_session_reply_2([Node|Rest],NodesErr,NodeResults) ->
+ case lists:keysearch(Node,1,NodesErr) of
+ {value,{_,Error}} ->
+ [{Node,Error}|build_reinitiate_session_reply_2(Rest,NodesErr,NodeResults)];
+ false ->
+ case lists:keysearch(Node,1,NodeResults) of
+ {value,Value} ->
+ [Value|build_reinitiate_session_reply_2(Rest,NodesErr,NodeResults)]
+ end
+ end;
+build_reinitiate_session_reply_2([],_NodesErr,_NodeResults) ->
+ [].
+%% -----------------------------------------------------------------------------
+
+%% Help function returning a history log where stop and stopping entries have
+%% been removed. Further all tracecase log entries must be set to running since
+%% there can not be such a thing as an activating tracecase stored away in a
+%% saved historyfile!
+%% We must also take away any #Ref.
+build_saved_history_data(SortedLog) ->
+ CleanedLog=
+ lists:filter(fun({_,_,Stop,_}) when Stop==stop;Stop==stopping -> false;
+ (_) -> true
+ end,
+ SortedLog),
+ lists:map(fun({{TC,Id},C,activating,B}) -> {{TC,Id},C,running,B};
+ ({{TC,Id},C,S,B}) -> {{TC,Id},C,S,B};
+ ({{M,F,Args,_Ref},C}) -> {{M,F,Args},C};
+ ({{TC,_Ref},C,B}) -> {TC,C,B} % An rtc.
+ end,
+ CleanedLog).
+%% -----------------------------------------------------------------------------
+
+%% This help function builds the AutoStartData structure which is returned from
+%% get_austostart_data. An AutoStartData structure is a list of trace-files and
+%% inviso commands. The order is significant since it is the idea that doing
+%% the trace case files and inviso commands in that order will bring a node to
+%% a certain state in a trace perspective.
+%% Returns {ok,AutoStartData} or {error,Reason}
+build_autostart_data(SortedLog,TCdict) ->
+ build_autostart_data_2(SortedLog,TCdict,[]).
+
+build_autostart_data_2([{_,_C,Stop,_B}|Rest],TCdict,Accum) when Stop==stop;Stop==stopping->
+ build_autostart_data_2(Rest,TCdict,Accum); % Simply skip deactivated/deativating.
+build_autostart_data_2([{{TCname,_},_C,activating,Bindings}|Rest],TCdict,Accum) ->
+ build_autostart_data_tc(TCname,Bindings,TCdict,Rest,Accum);
+build_autostart_data_2([{{TCname,_},_C,running,Bindings}|Rest],TCdict,Accum) ->
+ build_autostart_data_tc(TCname,Bindings,TCdict,Rest,Accum);
+build_autostart_data_2([{{TCname,_Ref},_C,Bindings}|Rest],TCdict,Accum) ->
+ build_autostart_data_tc(TCname,Bindings,TCdict,Rest,Accum);
+build_autostart_data_2([{{M,F,Args,_Ref},_C}|Rest],TCdict,Accum) ->
+ build_autostart_data_2(Rest,TCdict,[{mfa,{M,F,Args}}|Accum]);
+build_autostart_data_2([],_TCdict,Accum) ->
+ {ok,lists:reverse(Accum)}.
+
+%% Help function placing the filename in the AutoStartData structure.
+build_autostart_data_tc(TCname,Bindings,TCdict,Rest,Accum) ->
+ {ok,TC}=get_tracecase_tc_dict(TCname,TCdict),
+ {ok,FName}=get_tc_activate_fname(TC),
+ build_autostart_data_2(Rest,TCdict,[{file,{FName,Bindings}}|Accum]).
+%% -----------------------------------------------------------------------------
+
+%% Help function generating tracerdata to init inviso tracing. The generation
+%% is done by the TracerDataGenerator, TDG, function.
+%% Individual tracerdata is generated for each node in Nodes.
+%% Returns {ok,TracerData} or {error,Reason}.
+call_tracer_data_generator(undefined,M,F,TDGargs,_Nodes) -> % Non distributed.
+ case catch call_tracer_data_generator_3(M,F,TDGargs,local_runtime) of
+ {'EXIT',Reason} ->
+ {error,{'EXIT',Reason}};
+ TracerData ->
+ {ok,TracerData}
+ end;
+call_tracer_data_generator(_CNode,M,F,TDGargs,Nodes) ->
+ case catch call_tracer_data_generator_2(M,F,TDGargs,Nodes) of
+ {'EXIT',Reason} ->
+ {error,{'EXIT',Reason}};
+ TracerList ->
+ {ok,TracerList}
+ end.
+
+call_tracer_data_generator_2(M,F,TDGargs,[Node|Rest]) ->
+ [{Node,call_tracer_data_generator_3(M,F,TDGargs,Node)}|
+ call_tracer_data_generator_2(M,F,TDGargs,Rest)];
+call_tracer_data_generator_2(_,_,_,[]) ->
+ [].
+
+call_tracer_data_generator_3(M,F,TDGargs,Node) ->
+ apply(M,F,call_tracer_data_generator_mkargs(Node,TDGargs)).
+
+%% This function creates the arguments that the tracer data generator function
+%% accepts (in an apply call). The reason for making it a sepparate function is
+%% that the arguments are constructed in more situations than just when actually
+%% doing the apply. By having a function it will become obvious where to change
+%% should the arguments change.
+call_tracer_data_generator_mkargs(Node,TDGargs) ->
+ inviso_tool_lib:mk_complete_tdg_args(Node,TDGargs).
+%% -----------------------------------------------------------------------------
+
+%% This function acts as standard options generator function. That is returning
+%% the options argument to inviso:add_node/3. Note that this function must not
+%% return the dependency part of that option.
+std_options_generator(_Node) ->
+ []. % No particular options(!)
+%% -----------------------------------------------------------------------------
+
+
+%% Help function checking that Vars contains a binding for every variable
+%% listed in the VarNames field in TraceCase. Note that the special variable 'Nodes'
+%% is disregarded, since it is always added by the inviso_tool.
+%% Returns {ok,Bindings} or {error,Reason}. Where Bindings is a bindngs structure
+%% according to file:eval functionality.
+check_bindings(Vars,TraceCase) ->
+ case catch check_bindings_2(Vars,
+ get_tc_varnames(TraceCase),
+ erl_eval:new_bindings()) of
+ {'EXIT',_Reason} ->
+ {error,variable_error};
+ {error,Reason} -> % Missing a bindning.
+ {error,Reason};
+ {ok,Bindings} ->
+ {ok,Bindings}
+ end.
+
+check_bindings_2(Vars,['Nodes'|Rest],Bindings) ->
+ check_bindings_2(Vars,Rest,Bindings); % Disregard Nodes since it is automatic.
+check_bindings_2(Vars,[VarName|Rest],Bindings) ->
+ case lists:keysearch(VarName,1,Vars) of
+ {value,{_,Val}} ->
+ check_bindings_2(Vars,Rest,erl_eval:add_binding(VarName,Val,Bindings));
+ false -> % Mandatory variable missing.
+ {error,{missing_variable,VarName}} % Quite here then.
+ end;
+check_bindings_2(_,[],Bindings) ->
+ {ok,Bindings}.
+%% -----------------------------------------------------------------------------
+
+%% This help function checks that the command the user tries to do is amongst
+%% the inviso API. It at the same time returns what kind of command it is.
+%% {true,RegExpFlag} or 'false' where RegExpFlag indicates if this command
+%% needs to have its argument modified by module regexp expansion or not.
+check_proper_inviso_call(Cmd,Arity) ->
+ case lists:member({Cmd,Arity},?INVISO_CMDS) of
+ true -> % It is part of inviso API.
+ {true,check_proper_inviso_call_regexp(Cmd,Arity)};
+ false ->
+ false
+ end.
+
+%% Returns {Type,Arity,PlaceOfModuleSpec} or 'false'.
+check_proper_inviso_call_regexp(tp,5) -> {tp,5,1};
+check_proper_inviso_call_regexp(tp,4) -> {tp,4,1};
+check_proper_inviso_call_regexp(tp,1) -> {tp,1,1};
+check_proper_inviso_call_regexp(tpl,5) -> {tp,5,1};
+check_proper_inviso_call_regexp(tpl,4) -> {tp,4,1};
+check_proper_inviso_call_regexp(tpl,1) -> {tp,1,1};
+check_proper_inviso_call_regexp(ctp,3) -> {ctp,3,1};
+check_proper_inviso_call_regexp(ctp,1) -> {ctp,1,1};
+check_proper_inviso_call_regexp(ctpl,3) -> {ctp,3,1};
+check_proper_inviso_call_regexp(ctpl,1) -> {ctp,1,1};
+check_proper_inviso_call_regexp(_,_) -> % No regexp expansion.
+ false.
+%% -----------------------------------------------------------------------------
+
+%% Help function checking if this inviso command shall be added to the command
+%% history log. Returns true or false.
+check_inviso_call_to_history(Cmd,Arity) ->
+ case lists:member({Cmd,Arity},?INVISO_CMD_HISTORY) of
+ true ->
+ true;
+ false ->
+ false
+ end.
+%% -----------------------------------------------------------------------------
+
+%% Help function traversing the arguments and expanding module names stated
+%% as regular expressions. This means that the resulting arguments may be longer
+%% than the orginal ones.
+%% When we run this function it has been determined that we are a distributed
+%% system.
+%% Also note that if there are no regexps in Args, no regexpansion will be
+%% made and RegExpNode may be 'undefined' (as it is if not set at start-up).
+%% If RegExpNode is unavailable the nodes found in Nodes will be used until
+%% one that works is found.
+expand_module_regexps(Args,_RegExpNode,_Nodes,false) ->
+ {ok,Args};
+expand_module_regexps([PatternList],RegExpNode,Nodes,{tp,1,1}) ->
+ case catch expand_module_regexps_tp(PatternList,RegExpNode,Nodes) of
NewPatternList when is_list(NewPatternList) ->
- {ok,[NewPatternList]};
- {error,Reason} ->
- {error,Reason}
- end;
-expand_module_regexps([PatternList],RegExpNode,Nodes,{ctp,1,1}) ->
- case catch expand_module_regexps_ctp(PatternList,RegExpNode,Nodes) of
+ {ok,[NewPatternList]};
+ {error,Reason} ->
+ {error,Reason}
+ end;
+expand_module_regexps([PatternList],RegExpNode,Nodes,{ctp,1,1}) ->
+ case catch expand_module_regexps_ctp(PatternList,RegExpNode,Nodes) of
NewPatternList when is_list(NewPatternList) ->
- {ok,[NewPatternList]};
- {error,Reason} ->
- {error,Reason}
- end;
-expand_module_regexps([M,F,Arity,MS,Opts],RegExpNode,Nodes,{tp,5,1}) ->
- expand_module_regexps([[{M,F,Arity,MS,Opts}]],RegExpNode,Nodes,{tp,1,1});
-expand_module_regexps([M,F,Arity,MS],RegExpNode,Nodes,{tp,4,1}) ->
- expand_module_regexps([[{M,F,Arity,MS,[]}]],RegExpNode,Nodes,{tp,1,1});
-expand_module_regexps([M,F,Arity],RegExpNode,Nodes,{ctp,3,1}) ->
- expand_module_regexps([[{M,F,Arity}]],RegExpNode,Nodes,{ctp,1,1}).
-
-
+ {ok,[NewPatternList]};
+ {error,Reason} ->
+ {error,Reason}
+ end;
+expand_module_regexps([M,F,Arity,MS,Opts],RegExpNode,Nodes,{tp,5,1}) ->
+ expand_module_regexps([[{M,F,Arity,MS,Opts}]],RegExpNode,Nodes,{tp,1,1});
+expand_module_regexps([M,F,Arity,MS],RegExpNode,Nodes,{tp,4,1}) ->
+ expand_module_regexps([[{M,F,Arity,MS,[]}]],RegExpNode,Nodes,{tp,1,1});
+expand_module_regexps([M,F,Arity],RegExpNode,Nodes,{ctp,3,1}) ->
+ expand_module_regexps([[{M,F,Arity}]],RegExpNode,Nodes,{ctp,1,1}).
+
+
expand_module_regexps_tp([E={M,_,_,_,_}|Rest],RegExpNode,Nodes) when is_atom(M) ->
- [E|expand_module_regexps_tp(Rest,RegExpNode,Nodes)];
+ [E|expand_module_regexps_tp(Rest,RegExpNode,Nodes)];
expand_module_regexps_tp([{M,F,Arity,MS,Opts}|Rest],RegExpNode,Nodes) when is_list(M);is_tuple(M) ->
- case inviso_tool_lib:expand_module_names([RegExpNode],
- M,
- [{expand_only_at,RegExpNode}]) of
- {singlenode_expansion,Modules} ->
- expand_module_regexps_tp_2(Modules,F,Arity,MS,Opts,Rest,RegExpNode,Nodes);
- {error,{faulty_node,RegExpNode}} -> % RegExpNode probably down.
- case Nodes of
- [NewRegExpNode|RestNodes] -> % Ok, just choose a node.
- expand_module_regexps_tp([{M,F,Arity,MS,Opts}|Rest],NewRegExpNode,RestNodes);
- [] -> % No more nodes to choose from.
- throw({error,no_available_regexpnode})
- end;
- {error,_Reason} ->
- expand_module_regexps_tp(Rest,RegExpNode,Nodes)
- end;
-expand_module_regexps_tp([_|Rest],RegExpNode,Nodes) ->
- expand_module_regexps_tp(Rest,RegExpNode,Nodes); % Skip faulty module specification.
-expand_module_regexps_tp([],_RegExpNodes,_Nodes) ->
- [].
-
-expand_module_regexps_tp_2([M|MRest],F,Arity,MS,Opts,Rest,RegExpNode,Nodes) ->
- [{M,F,Arity,MS,Opts}|
- expand_module_regexps_tp_2(MRest,F,Arity,MS,Opts,Rest,RegExpNode,Nodes)];
-expand_module_regexps_tp_2([],_,_,_,_,Rest,RegExpNode,Nodes) ->
- expand_module_regexps_tp(Rest,RegExpNode,Nodes).
-
+ case inviso_tool_lib:expand_module_names([RegExpNode],
+ M,
+ [{expand_only_at,RegExpNode}]) of
+ {singlenode_expansion,Modules} ->
+ expand_module_regexps_tp_2(Modules,F,Arity,MS,Opts,Rest,RegExpNode,Nodes);
+ {error,{faulty_node,RegExpNode}} -> % RegExpNode probably down.
+ case Nodes of
+ [NewRegExpNode|RestNodes] -> % Ok, just choose a node.
+ expand_module_regexps_tp([{M,F,Arity,MS,Opts}|Rest],NewRegExpNode,RestNodes);
+ [] -> % No more nodes to choose from.
+ throw({error,no_available_regexpnode})
+ end;
+ {error,_Reason} ->
+ expand_module_regexps_tp(Rest,RegExpNode,Nodes)
+ end;
+expand_module_regexps_tp([_|Rest],RegExpNode,Nodes) ->
+ expand_module_regexps_tp(Rest,RegExpNode,Nodes); % Skip faulty module specification.
+expand_module_regexps_tp([],_RegExpNodes,_Nodes) ->
+ [].
+
+expand_module_regexps_tp_2([M|MRest],F,Arity,MS,Opts,Rest,RegExpNode,Nodes) ->
+ [{M,F,Arity,MS,Opts}|
+ expand_module_regexps_tp_2(MRest,F,Arity,MS,Opts,Rest,RegExpNode,Nodes)];
+expand_module_regexps_tp_2([],_,_,_,_,Rest,RegExpNode,Nodes) ->
+ expand_module_regexps_tp(Rest,RegExpNode,Nodes).
+
expand_module_regexps_ctp([E={M,_,_}|Rest],RegExpNode,Nodes) when is_atom(M) ->
- [E|expand_module_regexps_ctp(Rest,RegExpNode,Nodes)];
+ [E|expand_module_regexps_ctp(Rest,RegExpNode,Nodes)];
expand_module_regexps_ctp([{M,F,Arity}|Rest],RegExpNode,Nodes) when is_list(M);is_tuple(M) ->
- case inviso_tool_lib:expand_module_names([RegExpNode],
- M,
- [{expand_only_at,RegExpNode}]) of
- {singlenode_expansion,badrpc} -> % RegExpNode probably down.
- case Nodes of
- [NewRegExpNode|RestNodes] -> % Ok, just choose a node.
- expand_module_regexps_ctp([{M,F,Arity}|Rest],NewRegExpNode,RestNodes);
- [] -> % No more nodes to choose from.
- throw({error,no_available_regexpnode})
- end;
- {singlenode_expansion,Modules} ->
- expand_module_regexps_ctp_2(Modules,F,Arity,Rest,RegExpNode,Nodes);
- {error,_Reason} ->
- expand_module_regexps_ctp(Rest,RegExpNode,Nodes)
- end;
-expand_module_regexps_ctp([_|Rest],RegExpNode,Nodes) ->
- expand_module_regexps_tp(Rest,RegExpNode,Nodes); % Skip faulty module specification.
-expand_module_regexps_ctp([],_RegExpNodes,_Nodes) ->
- [].
-
-expand_module_regexps_ctp_2([M|MRest],F,Arity,Rest,RegExpNode,Nodes) ->
- [{M,F,Arity}|expand_module_regexps_ctp_2(MRest,F,Arity,Rest,RegExpNode,Nodes)];
-expand_module_regexps_ctp_2([],_,_,Rest,RegExpNode,Nodes) ->
- expand_module_regexps_ctp(Rest,RegExpNode,Nodes).
-%% -----------------------------------------------------------------------------
-
-
-
-%% Help function running the activation of a trace case. Note that this must
-%% be done at the inviso control component's Erlang node *and* that it must be
-%% done in its own process since there is no telling for how long a trace case
-%% may run.
-%% Returns {ok,ActivationHandler}.
-exec_trace_case_on(CNode,TraceCase,Bindings,Nodes) ->
- {ok,TcFName}=get_tc_activate_fname(TraceCase),
- {ok,exec_trace_case_2(CNode,
- TcFName,
- erl_eval:add_binding('Nodes',Nodes,Bindings),
- activating)}.
-
-%% Help function running the deactivation of a trace case.
-exec_trace_case_off(CNode,TraceCase,Bindings,Nodes) ->
- case get_tc_deactivate_fname(TraceCase) of
- {ok,TcFName} -> % There is a deactivation.
- {ok,exec_trace_case_2(CNode,
- TcFName,
- erl_eval:add_binding('Nodes',Nodes,Bindings),
- stopping)};
- false ->
- {error,no_deactivation}
- end.
-
-exec_trace_case_2(CNode,TcFName,Bindings,Phase) ->
- if
- CNode==undefined -> % The non distributed case.
- spawn_link(?MODULE,tc_executer,[TcFName,Bindings,Phase,self()]);
- true ->
- spawn_link(CNode,?MODULE,tc_executer,[TcFName,Bindings,Phase,self()])
- end.
-
-%% This function is run in its own process and is responsible for executing
-%% the trace case.
-tc_executer(TcFName,Bindings,Phase,Parent) ->
- case catch file:script(TcFName,Bindings) of
- {ok,Value} ->
- tc_executer_reply(Parent,{Phase,self(),{ok,Value}});
- {'EXIT',Reason} ->
- tc_executer_reply(Parent,{Phase,self(),{error,{'EXIT',Reason}}});
- Error ->
- tc_executer_reply(Parent,{Phase,self(),Error})
- end.
-%% -----------------------------------------------------------------------------
-
-%% Help function which starts a reactivator process redoing command history at
-%% Node. It also updates the loopdata to indicate that Node is now in state
-%% reactivating. It is a good idea to only handle one node per reactivator process.
-%% This because if the node terminates and comes back up, the reactivator must be
-%% stopped.
-redo_cmd_history(Node,LD=#ld{c_node=CNode,tc_dict=TCdict,chl=CHL,nodes=NodesD}) ->
- P=start_reactivator(Node,CNode,TCdict,CHL),
- LD#ld{nodes=set_reactivating_nodes(Node,NodesD),
- reactivators=add_reactivators(Node,P,LD#ld.reactivators)}.
-
-%% Help function starting a reactivator process replaying the command history log.
-%% Returns a pid of the reactivator process.
-start_reactivator(Node,CNode,TCdict,CHL) ->
- UnsortedLog=get_loglist_chl(CHL), % Must fetch here, later on wrong node.
- if
- CNode==undefined -> % The non-distributed case.
- spawn_link(?MODULE,
- reactivator_executer,
- [Node,TCdict,UnsortedLog,self(),0,[]]);
- true ->
- spawn_link(CNode,
- ?MODULE,
- reactivator_executer,
- [Node,TCdict,UnsortedLog,self(),0,[]])
- end.
-
-%% The strategy is to traverse the CHL ETS table in Counter order, redoing the
-%% commands one by one. We wait until one command is finished until we do the
-%% next. Commands marked as nullified are not performed. In fact when a command
-%% is nullified only the stop will be found in the CHL. Its activation will be
-%% removed.
-reactivator_executer(Node,TCdict,UnsortedLog,TPid,StartCounter,DoneCases) ->
- SortedLog=lists:keysort(2,UnsortedLog), % Sort on Counter, oldest first.
- Log=reactivator_skip_log_entries(SortedLog,StartCounter),
- case reactivator_executer_2(Node,TCdict,TPid,StartCounter,DoneCases,Log) of
- done ->
- true; % Simply terminate the reactivator then.
- {more,{NewStartCounter,NewDoneCases,NewUnsortedLog}} ->
- reactivator_executer(Node,TCdict,NewUnsortedLog,TPid,NewStartCounter,NewDoneCases)
- end.
-
-reactivator_executer_2(Node,TCdict,TPid,_Counter,DoneCases,
- [{{TCname,Id},NextC,running,Bindings}|Rest]) ->
- reactivator_executer_3(Node,TCdict,TPid,DoneCases,Rest,TCname,Id,NextC,Bindings,Rest);
-reactivator_executer_2(Node,TCdict,TPid,_Counter,DoneCases,
- [{{TCname,_Ref},NextC,Bindings}|Rest]) ->
- reactivator_executer_rtc(Node,TCdict,TPid,DoneCases,Rest,TCname,NextC,Bindings,Rest);
-reactivator_executer_2(Node,TCdict,TPid,_Counter,DoneCases,
- [{{TCname,Id},NextC,activating,Bindings}|Rest]) ->
- reactivator_executer_3(Node,TCdict,TPid,DoneCases,Rest,TCname,Id,NextC,Bindings,Rest);
-reactivator_executer_2(Node,TCdict,TPid,_Counter,DoneCases,
- [{{M,F,Args,_Ref},NextC}|Rest]) ->
- reactivator_executer_cmd(Node,M,F,Args),
- reactivator_executer_2(Node,TCdict,TPid,NextC,DoneCases,Rest);
-reactivator_executer_2(Node,TCdict,TPid,_Counter,DoneCases,
- [{{_TCname,_Id},NextC,stopping,_Bindings}|Rest]) ->
- reactivator_executer_2(Node,TCdict,TPid,NextC,DoneCases,Rest);
-reactivator_executer_2(Node,TCdict,TPid,_Counter,DoneCases,
- [{{TCname,Id,_Ref},NextC,stop,Bindings}|Rest]) ->
- case lists:member({TCname,Id},DoneCases) of
- true -> % We have activated it, must stop then.
- case get_tracecase_tc_dict(TCname,TCdict) of
- {ok,{_,_,_,_,FNameOff}} ->
- reactivator_executer_tc(Node,Bindings,FNameOff),
- NewDoneCases=lists:delete({TCname,Id},DoneCases),
- reactivator_executer_2(Node,TCdict,TPid,NextC,NewDoneCases,Rest);
- {ok,_} -> % No stop-filename, strange!
- reactivator_executer_2(Node,TCdict,TPid,NextC,DoneCases,Rest);
- false -> % Even stranger, does not exist!?
- reactivator_executer_2(Node,TCdict,TPid,NextC,DoneCases,Rest)
- end;
- false -> % Never activated in the first place.
- reactivator_executer_2(Node,TCdict,TPid,NextC,DoneCases,Rest)
- end;
-%% Done all log entries found this lap. See if there are more entries by now.
-reactivator_executer_2(_Node,_TCdict,TPid,Counter,DoneCases,[]) ->
- case reactivator_reply(TPid,Counter) of % Ask the tool process for more entries.
- done -> % No more entries in the CHL.
- done;
- {more,NewUnsortedLog} -> % Repeat the procedure
- {more,{Counter+1,DoneCases,NewUnsortedLog}} % with log entries from Counter+1.
- end.
-
-%% This help function activates a tracecase.
-reactivator_executer_3(Node,TCdict,TPid,DoneCases,Rest,TCname,Id,NextC,Bindings,Rest) ->
- case get_tracecase_tc_dict(TCname,TCdict) of
- {ok,{_,_,_,FNameOn}} -> % A case with just on functionality.
- reactivator_executer_tc(Node,Bindings,FNameOn),
- reactivator_executer_2(Node,TCdict,TPid,NextC,[{TCname,Id}|DoneCases],Rest);
- {ok,{_,_,_,FNameOn,_}} ->
- reactivator_executer_tc(Node,Bindings,FNameOn),
- reactivator_executer_2(Node,TCdict,TPid,NextC,[{TCname,Id}|DoneCases],Rest);
- false -> % Strange, does not exist anylonger!?
- reactivator_executer_2(Node,TCdict,TPid,NextC,DoneCases,Rest)
- end.
-
-%% Help function executing a trace case in the reactivators context. Does not
-%% return anything significant.
-reactivator_executer_tc(Node,Bindings,FileName) ->
- catch file:eval(FileName,erl_eval:add_binding('Nodes',[Node],Bindings)).
-
-%% Help function handling trace case that are simply executed - rtc.
-reactivator_executer_rtc(Node,TCdict,TPid,DoneCases,Rest,TCname,NextC,Bindings,Rest) ->
- case get_tracecase_tc_dict(TCname,TCdict) of
- {ok,{_,_,_,FNameOn}} -> % A case with just on functionality.
- reactivator_executer_tc(Node,Bindings,FNameOn),
- reactivator_executer_2(Node,TCdict,TPid,NextC,DoneCases,Rest);
- {ok,{_,_,_,FNameOn,_}} ->
- reactivator_executer_tc(Node,Bindings,FNameOn),
- reactivator_executer_2(Node,TCdict,TPid,NextC,DoneCases,Rest);
- false -> % Strange, does not exist anylonger!?
- reactivator_executer_2(Node,TCdict,TPid,NextC,DoneCases,Rest)
- end.
-
-reactivator_executer_cmd(nonode@nohost,M,F,Args) ->
- catch apply(M,F,Args); % Non-distributed.
-reactivator_executer_cmd(Node,M,F,Args) ->
- catch apply(M,F,[[Node]|Args]).
-
-%% Help function returning a list of log entries missing the first entries
-%% having a counter less or equal to C1.
-reactivator_skip_log_entries([{_,C,_,_}|Rest],C1) when C<C1 ->
- reactivator_skip_log_entries(Rest,C1);
-reactivator_skip_log_entries([{_,C}|Rest],C1) when C<C1 ->
- reactivator_skip_log_entries(Rest,C1);
-reactivator_skip_log_entries(Log,_) ->
- Log.
-%% -----------------------------------------------------------------------------
-
-%% Help function returning the node name to use in an rpc call.
-get_rpc_nodename(undefined) ->
- node();
-get_rpc_nodename(CNode) ->
- CNode.
-%% -----------------------------------------------------------------------------
-
-mk_rt_tag() ->
- inviso_tool.
-%% -----------------------------------------------------------------------------
-
-is_string([C|Rest]) when C>=32, C=<255 ->
- is_string(Rest);
-is_string([]) ->
- true;
-is_string(_) ->
- false.
-%% -----------------------------------------------------------------------------
-
-
-%% -----------------------------------------------------------------------------
-%% Functions for handling the configuration file.
-%% -----------------------------------------------------------------------------
-
-%% The inviso tool is configured via start arguments and/or a configuration file.
-%% Start arguments will override any definitions in a configuration file.
-%% The configuration file is pointed out by either a start argument or the
-%% inviso application parameter 'inviso_tool_config_file'.
-
-%% Help function building the internal configuration structure. Configurations
-%% in the start argument will override parameters found in a configuration file.
-fetch_configuration(Config) ->
- case fetch_config_filename(Config) of
- {ok,FName} -> % We are supposed to use a conf-file.
- case read_config_file(FName) of
- {ok,LD} -> % Managed to open a file.
- NewLD=read_config_list(LD,Config),
- {ok,NewLD};
- {error,_Reason} -> % Problem finding/opening file.
- LD=read_config_list(#ld{},Config),
- {ok,LD}
- end;
- false -> % No filename specified.
- LD=read_config_list(#ld{},Config),
- {ok,LD}
- end.
-
-%% Help function determining the name of the file which shall be consulted as
-%% the main configuration file.
-%% Returns {ok,FileName} or 'false'. The latter if no name could be determined.
-fetch_config_filename(Config) ->
- case catch lists:keysearch(config_file,1,Config) of
+ case inviso_tool_lib:expand_module_names([RegExpNode],
+ M,
+ [{expand_only_at,RegExpNode}]) of
+ {singlenode_expansion,Modules} ->
+ expand_module_regexps_ctp_2(Modules,F,Arity,Rest,RegExpNode,Nodes);
+ {error,_Reason} ->
+ expand_module_regexps_ctp(Rest,RegExpNode,Nodes)
+ end;
+expand_module_regexps_ctp([_|Rest],RegExpNode,Nodes) ->
+ expand_module_regexps_tp(Rest,RegExpNode,Nodes); % Skip faulty module specification.
+expand_module_regexps_ctp([],_RegExpNodes,_Nodes) ->
+ [].
+
+expand_module_regexps_ctp_2([M|MRest],F,Arity,Rest,RegExpNode,Nodes) ->
+ [{M,F,Arity}|expand_module_regexps_ctp_2(MRest,F,Arity,Rest,RegExpNode,Nodes)];
+expand_module_regexps_ctp_2([],_,_,Rest,RegExpNode,Nodes) ->
+ expand_module_regexps_ctp(Rest,RegExpNode,Nodes).
+%% -----------------------------------------------------------------------------
+
+
+
+%% Help function running the activation of a trace case. Note that this must
+%% be done at the inviso control component's Erlang node *and* that it must be
+%% done in its own process since there is no telling for how long a trace case
+%% may run.
+%% Returns {ok,ActivationHandler}.
+exec_trace_case_on(CNode,TraceCase,Bindings,Nodes) ->
+ {ok,TcFName}=get_tc_activate_fname(TraceCase),
+ {ok,exec_trace_case_2(CNode,
+ TcFName,
+ erl_eval:add_binding('Nodes',Nodes,Bindings),
+ activating)}.
+
+%% Help function running the deactivation of a trace case.
+exec_trace_case_off(CNode,TraceCase,Bindings,Nodes) ->
+ case get_tc_deactivate_fname(TraceCase) of
+ {ok,TcFName} -> % There is a deactivation.
+ {ok,exec_trace_case_2(CNode,
+ TcFName,
+ erl_eval:add_binding('Nodes',Nodes,Bindings),
+ stopping)};
+ false ->
+ {error,no_deactivation}
+ end.
+
+exec_trace_case_2(CNode,TcFName,Bindings,Phase) ->
+ if
+ CNode==undefined -> % The non distributed case.
+ spawn_link(?MODULE,tc_executer,[TcFName,Bindings,Phase,self()]);
+ true ->
+ spawn_link(CNode,?MODULE,tc_executer,[TcFName,Bindings,Phase,self()])
+ end.
+
+%% This function is run in its own process and is responsible for executing
+%% the trace case.
+tc_executer(TcFName,Bindings,Phase,Parent) ->
+ case catch file:script(TcFName,Bindings) of
+ {ok,Value} ->
+ tc_executer_reply(Parent,{Phase,self(),{ok,Value}});
+ {'EXIT',Reason} ->
+ tc_executer_reply(Parent,{Phase,self(),{error,{'EXIT',Reason}}});
+ Error ->
+ tc_executer_reply(Parent,{Phase,self(),Error})
+ end.
+%% -----------------------------------------------------------------------------
+
+%% Help function which starts a reactivator process redoing command history at
+%% Node. It also updates the loopdata to indicate that Node is now in state
+%% reactivating. It is a good idea to only handle one node per reactivator process.
+%% This because if the node terminates and comes back up, the reactivator must be
+%% stopped.
+redo_cmd_history(Node,LD=#ld{c_node=CNode,tc_dict=TCdict,chl=CHL,nodes=NodesD}) ->
+ P=start_reactivator(Node,CNode,TCdict,CHL),
+ LD#ld{nodes=set_reactivating_nodes(Node,NodesD),
+ reactivators=add_reactivators(Node,P,LD#ld.reactivators)}.
+
+%% Help function starting a reactivator process replaying the command history log.
+%% Returns a pid of the reactivator process.
+start_reactivator(Node,CNode,TCdict,CHL) ->
+ UnsortedLog=get_loglist_chl(CHL), % Must fetch here, later on wrong node.
+ if
+ CNode==undefined -> % The non-distributed case.
+ spawn_link(?MODULE,
+ reactivator_executer,
+ [Node,TCdict,UnsortedLog,self(),0,[]]);
+ true ->
+ spawn_link(CNode,
+ ?MODULE,
+ reactivator_executer,
+ [Node,TCdict,UnsortedLog,self(),0,[]])
+ end.
+
+%% The strategy is to traverse the CHL ETS table in Counter order, redoing the
+%% commands one by one. We wait until one command is finished until we do the
+%% next. Commands marked as nullified are not performed. In fact when a command
+%% is nullified only the stop will be found in the CHL. Its activation will be
+%% removed.
+reactivator_executer(Node,TCdict,UnsortedLog,TPid,StartCounter,DoneCases) ->
+ SortedLog=lists:keysort(2,UnsortedLog), % Sort on Counter, oldest first.
+ Log=reactivator_skip_log_entries(SortedLog,StartCounter),
+ case reactivator_executer_2(Node,TCdict,TPid,StartCounter,DoneCases,Log) of
+ done ->
+ true; % Simply terminate the reactivator then.
+ {more,{NewStartCounter,NewDoneCases,NewUnsortedLog}} ->
+ reactivator_executer(Node,TCdict,NewUnsortedLog,TPid,NewStartCounter,NewDoneCases)
+ end.
+
+reactivator_executer_2(Node,TCdict,TPid,_Counter,DoneCases,
+ [{{TCname,Id},NextC,running,Bindings}|Rest]) ->
+ reactivator_executer_3(Node,TCdict,TPid,DoneCases,Rest,TCname,Id,NextC,Bindings,Rest);
+reactivator_executer_2(Node,TCdict,TPid,_Counter,DoneCases,
+ [{{TCname,_Ref},NextC,Bindings}|Rest]) ->
+ reactivator_executer_rtc(Node,TCdict,TPid,DoneCases,Rest,TCname,NextC,Bindings,Rest);
+reactivator_executer_2(Node,TCdict,TPid,_Counter,DoneCases,
+ [{{TCname,Id},NextC,activating,Bindings}|Rest]) ->
+ reactivator_executer_3(Node,TCdict,TPid,DoneCases,Rest,TCname,Id,NextC,Bindings,Rest);
+reactivator_executer_2(Node,TCdict,TPid,_Counter,DoneCases,
+ [{{M,F,Args,_Ref},NextC}|Rest]) ->
+ reactivator_executer_cmd(Node,M,F,Args),
+ reactivator_executer_2(Node,TCdict,TPid,NextC,DoneCases,Rest);
+reactivator_executer_2(Node,TCdict,TPid,_Counter,DoneCases,
+ [{{_TCname,_Id},NextC,stopping,_Bindings}|Rest]) ->
+ reactivator_executer_2(Node,TCdict,TPid,NextC,DoneCases,Rest);
+reactivator_executer_2(Node,TCdict,TPid,_Counter,DoneCases,
+ [{{TCname,Id,_Ref},NextC,stop,Bindings}|Rest]) ->
+ case lists:member({TCname,Id},DoneCases) of
+ true -> % We have activated it, must stop then.
+ case get_tracecase_tc_dict(TCname,TCdict) of
+ {ok,{_,_,_,_,FNameOff}} ->
+ reactivator_executer_tc(Node,Bindings,FNameOff),
+ NewDoneCases=lists:delete({TCname,Id},DoneCases),
+ reactivator_executer_2(Node,TCdict,TPid,NextC,NewDoneCases,Rest);
+ {ok,_} -> % No stop-filename, strange!
+ reactivator_executer_2(Node,TCdict,TPid,NextC,DoneCases,Rest);
+ false -> % Even stranger, does not exist!?
+ reactivator_executer_2(Node,TCdict,TPid,NextC,DoneCases,Rest)
+ end;
+ false -> % Never activated in the first place.
+ reactivator_executer_2(Node,TCdict,TPid,NextC,DoneCases,Rest)
+ end;
+%% Done all log entries found this lap. See if there are more entries by now.
+reactivator_executer_2(_Node,_TCdict,TPid,Counter,DoneCases,[]) ->
+ case reactivator_reply(TPid,Counter) of % Ask the tool process for more entries.
+ done -> % No more entries in the CHL.
+ done;
+ {more,NewUnsortedLog} -> % Repeat the procedure
+ {more,{Counter+1,DoneCases,NewUnsortedLog}} % with log entries from Counter+1.
+ end.
+
+%% This help function activates a tracecase.
+reactivator_executer_3(Node,TCdict,TPid,DoneCases,Rest,TCname,Id,NextC,Bindings,Rest) ->
+ case get_tracecase_tc_dict(TCname,TCdict) of
+ {ok,{_,_,_,FNameOn}} -> % A case with just on functionality.
+ reactivator_executer_tc(Node,Bindings,FNameOn),
+ reactivator_executer_2(Node,TCdict,TPid,NextC,[{TCname,Id}|DoneCases],Rest);
+ {ok,{_,_,_,FNameOn,_}} ->
+ reactivator_executer_tc(Node,Bindings,FNameOn),
+ reactivator_executer_2(Node,TCdict,TPid,NextC,[{TCname,Id}|DoneCases],Rest);
+ false -> % Strange, does not exist anylonger!?
+ reactivator_executer_2(Node,TCdict,TPid,NextC,DoneCases,Rest)
+ end.
+
+%% Help function executing a trace case in the reactivators context. Does not
+%% return anything significant.
+reactivator_executer_tc(Node,Bindings,FileName) ->
+ catch file:eval(FileName,erl_eval:add_binding('Nodes',[Node],Bindings)).
+
+%% Help function handling trace case that are simply executed - rtc.
+reactivator_executer_rtc(Node,TCdict,TPid,DoneCases,Rest,TCname,NextC,Bindings,Rest) ->
+ case get_tracecase_tc_dict(TCname,TCdict) of
+ {ok,{_,_,_,FNameOn}} -> % A case with just on functionality.
+ reactivator_executer_tc(Node,Bindings,FNameOn),
+ reactivator_executer_2(Node,TCdict,TPid,NextC,DoneCases,Rest);
+ {ok,{_,_,_,FNameOn,_}} ->
+ reactivator_executer_tc(Node,Bindings,FNameOn),
+ reactivator_executer_2(Node,TCdict,TPid,NextC,DoneCases,Rest);
+ false -> % Strange, does not exist anylonger!?
+ reactivator_executer_2(Node,TCdict,TPid,NextC,DoneCases,Rest)
+ end.
+
+reactivator_executer_cmd(nonode@nohost,M,F,Args) ->
+ catch apply(M,F,Args); % Non-distributed.
+reactivator_executer_cmd(Node,M,F,Args) ->
+ catch apply(M,F,[[Node]|Args]).
+
+%% Help function returning a list of log entries missing the first entries
+%% having a counter less or equal to C1.
+reactivator_skip_log_entries([{_,C,_,_}|Rest],C1) when C<C1 ->
+ reactivator_skip_log_entries(Rest,C1);
+reactivator_skip_log_entries([{_,C}|Rest],C1) when C<C1 ->
+ reactivator_skip_log_entries(Rest,C1);
+reactivator_skip_log_entries(Log,_) ->
+ Log.
+%% -----------------------------------------------------------------------------
+
+%% Help function returning the node name to use in an rpc call.
+get_rpc_nodename(undefined) ->
+ node();
+get_rpc_nodename(CNode) ->
+ CNode.
+%% -----------------------------------------------------------------------------
+
+mk_rt_tag() ->
+ inviso_tool.
+%% -----------------------------------------------------------------------------
+
+is_string([C|Rest]) when C>=32, C=<255 ->
+ is_string(Rest);
+is_string([]) ->
+ true;
+is_string(_) ->
+ false.
+%% -----------------------------------------------------------------------------
+
+
+%% -----------------------------------------------------------------------------
+%% Functions for handling the configuration file.
+%% -----------------------------------------------------------------------------
+
+%% The inviso tool is configured via start arguments and/or a configuration file.
+%% Start arguments will override any definitions in a configuration file.
+%% The configuration file is pointed out by either a start argument or the
+%% inviso application parameter 'inviso_tool_config_file'.
+
+%% Help function building the internal configuration structure. Configurations
+%% in the start argument will override parameters found in a configuration file.
+fetch_configuration(Config) ->
+ case fetch_config_filename(Config) of
+ {ok,FName} -> % We are supposed to use a conf-file.
+ case read_config_file(FName) of
+ {ok,LD} -> % Managed to open a file.
+ NewLD=read_config_list(LD,Config),
+ {ok,NewLD};
+ Error = {error,_Reason} -> % Problem finding/opening file.
+ Error
+ end;
+ false -> % No filename specified.
+ LD=read_config_list(#ld{},Config),
+ {ok,LD}
+ end.
+
+%% Help function determining the name of the file which shall be consulted as
+%% the main configuration file.
+%% Returns {ok,FileName} or 'false'. The latter if no name could be determined.
+fetch_config_filename(Config) ->
+ case catch lists:keysearch(config_file,1,Config) of
{value,{_,FName}} when is_list(FName) ->
- {ok,FName};
- _ -> % No filename in the start argument.
- fetch_config_filename_2()
- end.
-
-fetch_config_filename_2() ->
- case application:get_env(inviso_tool_config_file) of
+ {ok,FName};
+ _ -> % No filename in the start argument.
+ fetch_config_filename_2()
+ end.
+
+fetch_config_filename_2() ->
+ case application:get_env(inviso_tool_config_file) of
{ok,FName} when is_list(FName) ->
- {ok,FName};
- _ -> % Application parameter not specified.
- false % Means no config file will be used.
- end.
-
-%% Help function reading the configuration file. Returns a #conf or {error,Reason}.
-read_config_file(FName) ->
- case catch file:consult(FName) of
- {ok,Terms} ->
- {ok,read_config_list(#ld{},Terms)};
- {error,Reason} ->
- {error,{file_consult,Reason}};
- {'EXIT',Reason} ->
- {error,{failure,Reason}}
- end.
-
-%% Help function traversing the Terms list entering known tag-values into #ld.
-read_config_list(LD,Terms) ->
- LD1=read_config_list_2(LD,Terms,nodes),
- LD2=read_config_list_2(LD1,Terms,c_node),
- LD3=read_config_list_2(LD2,Terms,regexp_node),
- LD4=read_config_list_2(LD3,Terms,tc_def_file),
- LD6=read_config_list_2(LD4,Terms,tdg),
- LD8=read_config_list_2(LD6,Terms,debug),
- LD10=read_config_list_2(LD8,Terms,initial_tcs),
- LD11=read_config_list_2(LD10,Terms,dir),
- _LD12=read_config_list_2(LD11,Terms,optg).
-
-read_config_list_2(LD,Terms,Tag) ->
- case catch lists:keysearch(Tag,1,Terms) of
- {value,{_,Value}} ->
- update_ld_record(LD,Tag,Value);
- _ ->
- LD % Tag not found in Terms (or error!)
- end.
-%% -----------------------------------------------------------------------------
-
-%% Function updating a named field in a record. Returns a new record. Note that
-%% this function must be maintained due the fact that field names are removed
-%% at compile time.
-update_ld_record(LD,nodes,Value) when is_record(LD,ld) ->
- case mk_nodes(Value) of
- {ok,NodesD} ->
- LD#ld{nodes=NodesD};
- error ->
- LD
- end;
-update_ld_record(LD,Tag,Value) when is_record(LD,ld) ->
- Index=
- case Tag of
- c_node -> % atom()
- #ld.c_node;
- regexp_node -> % atom()
- #ld.regexp_node;
- tc_def_file -> % string()
- #ld.tc_def_file;
- initial_tcs -> % [{TCname,VarList},...]
- #ld.initial_tcs;
- history_dir -> % string()
- #ld.history_dir;
- debug -> % true | false
- #ld.debug;
- dir -> % string()
- #ld.dir;
- optg -> % {Mod,Func,Args}
- #ld.optg;
- tdg -> % {Mod,Func,Args}
- #ld.tdg;
- keep_nodes -> % [Nodes,...]
- #ld.keep_nodes
- end,
- setelement(Index,LD,Value). % Cheeting!
-%% -----------------------------------------------------------------------------
-
-
-%% Help function which, if it exists, consults the trace definition file. The
-%% idea behind the trace definition file is to point out which trace cases there
-%% are, where to find them and how to turn them on and off.
-%% Trace case definitions are:
-%% {TCname,Type,VariableNameList,ActivatioFileName} |
-%% {TCname,Type,VariableNameList,ActivationFileName,DeactivationFileName}
-%% TCname=atom()
-%% Type=on | on_off
-%% VariableNameList=[atom(),...]
-%% ActivationFileName=DeactivationFileName=string()
-read_trace_case_definitions(LD) ->
- case LD#ld.tc_def_file of
+ {ok,FName};
+ _ -> % Application parameter not specified.
+ false % Means no config file will be used.
+ end.
+
+%% Help function reading the configuration file. Returns a #conf or {error,Reason}.
+read_config_file(FName) ->
+ case catch file:consult(FName) of
+ {ok,Terms} ->
+ {ok,read_config_list(#ld{},Terms)};
+ {error,Reason} ->
+ {error,{file_consult,Reason}};
+ {'EXIT',Reason} ->
+ {error,{failure,Reason}}
+ end.
+
+%% Help function traversing the Terms list entering known tag-values into #ld.
+read_config_list(LD,Terms) ->
+ LD#ld{
+ nodes = case mk_nodes(proplists:get_value(nodes,Terms,LD#ld.nodes)) of
+ {ok,Nodes} -> Nodes;
+ _ -> LD#ld.nodes
+ end,
+ c_node = proplists:get_value(c_node,Terms,LD#ld.c_node), % atom8)
+ regexp_node = proplists:get_value(regexp_node,Terms,LD#ld.regexp_node), % atom()
+ tc_def_file = proplists:get_value(tc_def_file,Terms,LD#ld.tc_def_file),
+ tdg = proplists:get_value(tdg,Terms,LD#ld.tdg),
+ debug = proplists:get_value(debug,Terms,LD#ld.debug),
+ initial_tcs = proplists:get_value(initial_tcs,Terms,LD#ld.initial_tcs),
+ dir = proplists:get_value(dir,Terms,LD#ld.dir),
+ optg = proplists:get_value(optg,Terms,LD#ld.optg)
+ }.
+
+%% -----------------------------------------------------------------------------
+
+
+%% Help function which, if it exists, consults the trace definition file. The
+%% idea behind the trace definition file is to point out which trace cases there
+%% are, where to find them and how to turn them on and off.
+%% Trace case definitions are:
+%% {TCname,Type,VariableNameList,ActivatioFileName} |
+%% {TCname,Type,VariableNameList,ActivationFileName,DeactivationFileName}
+%% TCname=atom()
+%% Type=on | on_off
+%% VariableNameList=[atom(),...]
+%% ActivationFileName=DeactivationFileName=string()
+read_trace_case_definitions(LD) ->
+ case LD#ld.tc_def_file of
TCfileName when is_list(TCfileName) ->
- case catch file:consult(TCfileName) of
- {ok,Terms} ->
- Dir=LD#ld.dir, % The working directory of the tool.
- TCdict=read_trace_case_definitions_2(Terms,Dir,mk_tc_dict()),
- LD#ld{tc_dict=TCdict};
- _ ->
- LD
- end;
- _ ->
- LD
- end.
-
-read_trace_case_definitions_2([{TCname,on,VarNames,FName}|Rest],Dir,TCdict) ->
- FileName=make_absolute_path(FName,Dir),
- read_trace_case_definitions_2(Rest,
- Dir,
- insert_tracecase_tc_dict(TCname,
- on,
- VarNames,
- FileName,
- TCdict));
-read_trace_case_definitions_2([{TCname,on_off,VarNames,FNameOn,FNameOff}|Rest],Dir,TCdict) ->
- FileNameOn=make_absolute_path(FNameOn,Dir),
- FileNameOff=make_absolute_path(FNameOff,Dir),
- read_trace_case_definitions_2(Rest,
- Dir,
- insert_tracecase_tc_dict(TCname,
- on_off,
- VarNames,
- FileNameOn,
- FileNameOff,
- TCdict));
-read_trace_case_definitions_2([_|Rest],Dir,TCdict) ->
- read_trace_case_definitions_2(Rest,Dir,TCdict);
-read_trace_case_definitions_2([],_Dir,TCdict) ->
- TCdict.
-
-%% Help function returning an absolute path to FName if FName is not already
-%% absolute. Dir is the working dir of the tool and supposed to be absolute.
-make_absolute_path(FName,Dir) ->
- case filename:pathtype(FName) of
- absolute -> % Then do nothing, allready absolute.
- FName;
- _ ->
- filename:join(Dir,FName)
- end.
-%% -----------------------------------------------------------------------------
-
-get_status(undefined,_Node) ->
- inviso:get_status();
-get_status(CNode,Nodes) ->
- inviso_tool_lib:inviso_cmd(CNode,get_status,[Nodes]).
-%% -----------------------------------------------------------------------------
-
-
-%% =============================================================================
-%% Internal data structure functions.
-%% =============================================================================
-
-%% -----------------------------------------------------------------------------
-%% The nodes database structure.
-%% -----------------------------------------------------------------------------
-
-%% The purpose of the nodes database structure is to keep track of what runtime
-%% nodes we have, and their current status.
-%% Implementation:
-%% [{NodeName,AvailableStatus},...] or AvailableStatus in the
-%% non-distributed case.
-%% AvailableStatus={up,Status1} | down
-%% Status1={State,Status} | reactivating
-%% State=tracing | inactive | trace_failure
-%% Status=running | suspended
-%% reactivating=the node is now being brought up to date.
-%% inactive=not tracing, can be initiated and then reactivated.
-%% The following states can occure.
-%% {inactive,running}
-%% Mainly when we start the tool, before a session has been started.
-%% {tracing,running}
-%% When a trace session is on-going.
-%% {trace_failure,running}
-%% If init_tracing failed for some reason.
-%% {tracing,suspended}
-%% reactivating
-%% The node is tracing (has always been) but was suspended. It is now
-%% no longer suspended and the tool is redong commands.
-%% {inactive,suspended}
-%% We can end up here if a session is stopped with this node suspended.
-
-%% Returns a nodes database structure filled with the nodes Nodes.
+ case catch file:consult(TCfileName) of
+ {ok,Terms} ->
+ Dir=LD#ld.dir, % The working directory of the tool.
+ TCdict=read_trace_case_definitions_2(Terms,Dir,mk_tc_dict()),
+ LD#ld{tc_dict=TCdict};
+ _ ->
+ LD
+ end;
+ _ ->
+ LD
+ end.
+
+read_trace_case_definitions_2([{TCname,on,VarNames,FName}|Rest],Dir,TCdict) ->
+ FileName=make_absolute_path(FName,Dir),
+ read_trace_case_definitions_2(Rest,
+ Dir,
+ insert_tracecase_tc_dict(TCname,
+ on,
+ VarNames,
+ FileName,
+ TCdict));
+read_trace_case_definitions_2([{TCname,on_off,VarNames,FNameOn,FNameOff}|Rest],Dir,TCdict) ->
+ FileNameOn=make_absolute_path(FNameOn,Dir),
+ FileNameOff=make_absolute_path(FNameOff,Dir),
+ read_trace_case_definitions_2(Rest,
+ Dir,
+ insert_tracecase_tc_dict(TCname,
+ on_off,
+ VarNames,
+ FileNameOn,
+ FileNameOff,
+ TCdict));
+read_trace_case_definitions_2([_|Rest],Dir,TCdict) ->
+ read_trace_case_definitions_2(Rest,Dir,TCdict);
+read_trace_case_definitions_2([],_Dir,TCdict) ->
+ TCdict.
+
+%% Help function returning an absolute path to FName if FName is not already
+%% absolute. Dir is the working dir of the tool and supposed to be absolute.
+make_absolute_path(FName,Dir) ->
+ case filename:pathtype(FName) of
+ absolute -> % Then do nothing, allready absolute.
+ FName;
+ _ ->
+ filename:join(Dir,FName)
+ end.
+%% -----------------------------------------------------------------------------
+
+get_status(undefined,_Node) ->
+ inviso:get_status();
+get_status(CNode,Nodes) ->
+ inviso_tool_lib:inviso_cmd(CNode,get_status,[Nodes]).
+%% -----------------------------------------------------------------------------
+
+
+%% =============================================================================
+%% Internal data structure functions.
+%% =============================================================================
+
+%% -----------------------------------------------------------------------------
+%% The nodes database structure.
+%% -----------------------------------------------------------------------------
+
+%% The purpose of the nodes database structure is to keep track of what runtime
+%% nodes we have, and their current status.
+%% Implementation:
+%% [{NodeName,AvailableStatus},...] or AvailableStatus in the
+%% non-distributed case.
+%% AvailableStatus={up,Status1} | down
+%% Status1={State,Status} | reactivating
+%% State=tracing | inactive | trace_failure
+%% Status=running | suspended
+%% reactivating=the node is now being brought up to date.
+%% inactive=not tracing, can be initiated and then reactivated.
+%% The following states can occure.
+%% {inactive,running}
+%% Mainly when we start the tool, before a session has been started.
+%% {tracing,running}
+%% When a trace session is on-going.
+%% {trace_failure,running}
+%% If init_tracing failed for some reason.
+%% {tracing,suspended}
+%% reactivating
+%% The node is tracing (has always been) but was suspended. It is now
+%% no longer suspended and the tool is redong commands.
+%% {inactive,suspended}
+%% We can end up here if a session is stopped with this node suspended.
+
+%% Returns a nodes database structure filled with the nodes Nodes.
mk_nodes(Nodes) when is_list(Nodes) ->
{ok,lists:map(fun(N) when is_atom(N)->{N,down} end,Nodes)};
-mk_nodes(local_runtime) -> % The non-distributed case.
- down;
-mk_nodes(_Nodes) ->
- error.
-%% -----------------------------------------------------------------------------
-
-%% Updates the nodes database structure for each node that has been added.
-%% This is the case when we start the tool or reactivate a node. Note that a node
-%% may have become adopted instead of started.
-%% Returns a new nodes database structure.
-update_added_nodes(CNode,[{Node,NodeResult}|Rest],NodesD) ->
- case update_added_nodes_3(NodeResult) of
- already_added -> % Already added to the control component.
- case get_status(CNode,[Node]) of % Examine if it is tracing or not.
- {ok,[{Node,NodeResult2}]} ->
- Result=mk_nodes_state_from_status(NodeResult2),
- update_added_nodes_2(CNode,Node,Result,NodesD,Rest);
- {error,_Reason} -> % Strange, mark it as down now.
- update_added_nodes_2(CNode,Node,down,NodesD,Rest)
- end;
- Result ->
- update_added_nodes_2(CNode,Node,Result,NodesD,Rest)
- end;
-update_added_nodes(_CNode,[],NodesD) ->
- NodesD;
-update_added_nodes(_CNode,NodeResult,_NodesD) -> % Non distributed case.
- case update_added_nodes_3(NodeResult) of
- already_added -> % Already added, most likely autostart.
- mk_nodes_state_from_status(inviso:get_status());
- Result ->
- Result % Simply replace NodesD.
- end.
-
-update_added_nodes_2(CNode,Node,Result,NodesD,Rest) ->
- case lists:keysearch(Node,1,NodesD) of
- {value,_} -> % Node already exists, replace!
- update_added_nodes(CNode,Rest,lists:keyreplace(Node,1,NodesD,{Node,Result}));
- false -> % Strange, unknown node!
- update_added_nodes(CNode,Rest,NodesD)
- end.
-
-update_added_nodes_3({ok,{adopted,tracing,running,_Tag}}) ->
- {up,{tracing,running}};
-update_added_nodes_3({ok,{adopted,tracing,{suspended,_SReason},_Tag}}) ->
- {up,{tracing,suspended}};
-update_added_nodes_3({ok,{adopted,_,running,_Tag}}) ->
- {up,{inactive,running}};
-update_added_nodes_3({ok,{adopted,_,{suspended,_SReason},_Tag}}) ->
- {up,{inactive,suspended}};
-update_added_nodes_3({ok,new}) ->
- {up,{inactive,running}};
-update_added_nodes_3({ok,already_added}) ->
- already_added; % This is an error value!
-update_added_nodes_3({error,_Reason}) ->
- down.
-%% -----------------------------------------------------------------------------
-
-%% Function marking all nodes that, according to the returnvalue from init_tracing,
-%% now are successfully initiated as tracing and running. Note that nodes that
-%% does not fully respond 'ok' when init_tracing are marked as 'trace_failure'.
-%% Also note that we assume that the nodes must be running to have made it this far.
-%% A node can of course have become suspended in the process, but that node will
-%% be marked as suspended later when that inviso event message arrives to the tool.
-%% Returns {NewNodesD,Nodes} where Nodes are the nodes that actually got initiated
-%% as a result of the init_tracing call (judged from the LogResults).
-set_tracing_running_nodes(undefined,{ok,LogResults},_AvailableStatus) -> % Non-distr. case.
- case set_tracing_running_nodes_checkresult(LogResults) of
- ok ->
- {{up,{tracing,running}},local_runtime};
- error ->
- {down,[]}
- end;
-set_tracing_running_nodes(undefined,{error,already_initiated},_) -> % Non-distributed case.
- {mk_nodes_state_from_status(inviso:get_status()),[]}; % Ask it for its status.
-set_tracing_running_nodes(undefined,{error,_Reason},_) -> % Non-distributed case.
- {down,[]}; % This is questionable!
-set_tracing_running_nodes(CNode,{ok,NodeResults},NodesD) ->
- set_tracing_running_nodes_2(CNode,NodeResults,NodesD,[]).
-
-set_tracing_running_nodes_2(CNode,[{Node,{ok,LogResults}}|Rest],NodesD,Nodes) ->
- case set_tracing_running_nodes_checkresult(LogResults) of
- ok -> % The result is good.
- case lists:keysearch(Node,1,NodesD) of
- {value,_} ->
- NewNodesD=lists:keyreplace(Node,1,NodesD,{Node,{up,{tracing,running}}}),
- set_tracing_running_nodes_2(CNode,Rest,NewNodesD,[Node|Nodes]);
- false -> % Strange.
- set_tracing_running_nodes_2(CNode,Rest,NodesD,Nodes)
- end;
- error -> % This node is not tracing correctly.
- NewNodesD=lists:keyreplace(Node,1,NodesD,{Node,down}),
- set_tracing_running_nodes_2(CNode,Rest,NewNodesD,Nodes)
- end;
-set_tracing_running_nodes_2(CNode,[{Node,{error,already_initiated}}|Rest],NodesD,Nodes) ->
- case get_status(CNode,[Node]) of % Then we must ask what it is doing now.
- {ok,[{Node,NodeResult}]} ->
- Result=mk_nodes_state_from_status(NodeResult),
- NewNodesD=lists:keyreplace(Node,1,NodesD,{Node,Result}),
- set_tracing_running_nodes_2(CNode,Rest,NewNodesD,Nodes);
- {error,_Reason} -> % Strange, mark it as down.
- NewNodesD=lists:keyreplace(Node,1,NodesD,{Node,down}),
- set_tracing_running_nodes_2(CNode,Rest,NewNodesD,Nodes)
- end;
-set_tracing_running_nodes_2(CNode,[{Node,{error,_Reason}}|Rest],NodesD,Nodes) ->
- NewNodesD=lists:keyreplace(Node,1,NodesD,{Node,{up,{trace_failure,running}}}),
- set_tracing_running_nodes_2(CNode,Rest,NewNodesD,Nodes);
-set_tracing_running_nodes_2(_CNode,[],NodesD,Nodes) ->
- {NodesD,Nodes}. % New NodesD and nodes successfully initiated.
-
-%% Help function checking if a returnvalue from inviso:init_tracing really
-%% means that tracing has started as requested.
-set_tracing_running_nodes_checkresult(_LogResults) -> ok. % Should really be better!
-%% -----------------------------------------------------------------------------
-
-%% Function updating Node in the NodesD structure and sets it to 'down'.
-%% Returns a new nodes structure.
-set_down_nodes(Node,[{Node,_}|Rest]) ->
- [{Node,down}|Rest];
-set_down_nodes(Node,[NodeStruct|Rest]) ->
- [NodeStruct|set_down_nodes(Node,Rest)];
-set_down_nodes(_,[]) ->
- [];
-set_down_nodes(_,_) -> % Non-distributed case.
- down. % One can argue if this can happend.
-%% -----------------------------------------------------------------------------
-
-%% Function updating Node in NodesD to now be suspended. Note that if the node is
-%% reactivating it must be moved to state tracing because that is what is doing.
-set_suspended_nodes(Node,[{Node,{up,reactivating}}|Rest]) ->
- [{Node,{up,{tracing,suspended}}}|Rest];
-set_suspended_nodes(Node,[{Node,{up,{State,_}}}|Rest]) ->
- [{Node,{up,{State,suspended}}}|Rest];
-set_suspended_nodes(Node,[NodesData|Rest]) ->
- [NodesData|set_suspended_nodes(Node,Rest)];
-set_suspended_nodes(_Node,[]) -> % Hmm, strange why did we end up here?
- [];
-set_suspended_nodes(_,{up,reactivating}) -> % Non-distributed case.
- {up,{tracing,suspended}};
-set_suspended_nodes(_,{up,{State,_}}) ->
- {up,{State,suspended}}.
-%% -----------------------------------------------------------------------------
-
-%% This function is called when reactivation is completed. Hence it moves the
-%% node to no longer suspended. Note this can mean that the node is either
-%% tracing or inactive. Reactivation is not allowed for a node have trace_failure.
+mk_nodes(local_runtime) -> % The non-distributed case.
+ down;
+mk_nodes(_Nodes) ->
+ error.
+%% -----------------------------------------------------------------------------
+
+%% Updates the nodes database structure for each node that has been added.
+%% This is the case when we start the tool or reactivate a node. Note that a node
+%% may have become adopted instead of started.
+%% Returns a new nodes database structure.
+update_added_nodes(CNode,[{Node,NodeResult}|Rest],NodesD) ->
+ case update_added_nodes_3(NodeResult) of
+ already_added -> % Already added to the control component.
+ case get_status(CNode,[Node]) of % Examine if it is tracing or not.
+ {ok,[{Node,NodeResult2}]} ->
+ Result=mk_nodes_state_from_status(NodeResult2),
+ update_added_nodes_2(CNode,Node,Result,NodesD,Rest);
+ {error,_Reason} -> % Strange, mark it as down now.
+ update_added_nodes_2(CNode,Node,down,NodesD,Rest)
+ end;
+ Result ->
+ update_added_nodes_2(CNode,Node,Result,NodesD,Rest)
+ end;
+update_added_nodes(_CNode,[],NodesD) ->
+ NodesD;
+update_added_nodes(_CNode,NodeResult,_NodesD) -> % Non distributed case.
+ case update_added_nodes_3(NodeResult) of
+ already_added -> % Already added, most likely autostart.
+ mk_nodes_state_from_status(inviso:get_status());
+ Result ->
+ Result % Simply replace NodesD.
+ end.
+
+update_added_nodes_2(CNode,Node,Result,NodesD,Rest) ->
+ case lists:keysearch(Node,1,NodesD) of
+ {value,_} -> % Node already exists, replace!
+ update_added_nodes(CNode,Rest,lists:keyreplace(Node,1,NodesD,{Node,Result}));
+ false -> % Strange, unknown node!
+ update_added_nodes(CNode,Rest,NodesD)
+ end.
+
+update_added_nodes_3({ok,{adopted,tracing,running,_Tag}}) ->
+ {up,{tracing,running}};
+update_added_nodes_3({ok,{adopted,tracing,{suspended,_SReason},_Tag}}) ->
+ {up,{tracing,suspended}};
+update_added_nodes_3({ok,{adopted,_,running,_Tag}}) ->
+ {up,{inactive,running}};
+update_added_nodes_3({ok,{adopted,_,{suspended,_SReason},_Tag}}) ->
+ {up,{inactive,suspended}};
+update_added_nodes_3({ok,new}) ->
+ {up,{inactive,running}};
+update_added_nodes_3({ok,already_added}) ->
+ already_added; % This is an error value!
+update_added_nodes_3({error,_Reason}) ->
+ down.
+%% -----------------------------------------------------------------------------
+
+%% Function marking all nodes that, according to the returnvalue from init_tracing,
+%% now are successfully initiated as tracing and running. Note that nodes that
+%% does not fully respond 'ok' when init_tracing are marked as 'trace_failure'.
+%% Also note that we assume that the nodes must be running to have made it this far.
+%% A node can of course have become suspended in the process, but that node will
+%% be marked as suspended later when that inviso event message arrives to the tool.
+%% Returns {NewNodesD,Nodes} where Nodes are the nodes that actually got initiated
+%% as a result of the init_tracing call (judged from the LogResults).
+set_tracing_running_nodes(undefined,{ok,_LogResults},_AvailableStatus) -> % Non-distr. case.
+ {{up,{tracing,running}},local_runtime};
+set_tracing_running_nodes(undefined,{error,already_initiated},_) -> % Non-distributed case.
+ {mk_nodes_state_from_status(inviso:get_status()),[]}; % Ask it for its status.
+set_tracing_running_nodes(undefined,{error,_Reason},_) -> % Non-distributed case.
+ {down,[]}; % This is questionable!
+set_tracing_running_nodes(CNode,{ok,NodeResults},NodesD) ->
+ set_tracing_running_nodes_2(CNode,NodeResults,NodesD,[]).
+
+set_tracing_running_nodes_2(CNode,[{Node,{ok,_LogResults}}|Rest],NodesD,Nodes) ->
+ case lists:keysearch(Node,1,NodesD) of
+ {value,_} ->
+ NewNodesD=lists:keyreplace(Node,1,NodesD,{Node,{up,{tracing,running}}}),
+ set_tracing_running_nodes_2(CNode,Rest,NewNodesD,[Node|Nodes]);
+ false -> % Strange.
+ set_tracing_running_nodes_2(CNode,Rest,NodesD,Nodes)
+ end;
+set_tracing_running_nodes_2(CNode,[{Node,{error,already_initiated}}|Rest],NodesD,Nodes) ->
+ case get_status(CNode,[Node]) of % Then we must ask what it is doing now.
+ {ok,[{Node,NodeResult}]} ->
+ Result=mk_nodes_state_from_status(NodeResult),
+ NewNodesD=lists:keyreplace(Node,1,NodesD,{Node,Result}),
+ set_tracing_running_nodes_2(CNode,Rest,NewNodesD,Nodes);
+ {error,_Reason} -> % Strange, mark it as down.
+ NewNodesD=lists:keyreplace(Node,1,NodesD,{Node,down}),
+ set_tracing_running_nodes_2(CNode,Rest,NewNodesD,Nodes)
+ end;
+set_tracing_running_nodes_2(CNode,[{Node,{error,_Reason}}|Rest],NodesD,Nodes) ->
+ NewNodesD=lists:keyreplace(Node,1,NodesD,{Node,{up,{trace_failure,running}}}),
+ set_tracing_running_nodes_2(CNode,Rest,NewNodesD,Nodes);
+set_tracing_running_nodes_2(_CNode,[],NodesD,Nodes) ->
+ {NodesD,Nodes}. % New NodesD and nodes successfully initiated.
+
+%% -----------------------------------------------------------------------------
+
+%% Function updating Node in the NodesD structure and sets it to 'down'.
+%% Returns a new nodes structure.
+set_down_nodes(Node,[{Node,_}|Rest]) ->
+ [{Node,down}|Rest];
+set_down_nodes(Node,[NodeStruct|Rest]) ->
+ [NodeStruct|set_down_nodes(Node,Rest)];
+set_down_nodes(_,[]) ->
+ [];
+set_down_nodes(_,_) -> % Non-distributed case.
+ down. % One can argue if this can happend.
+%% -----------------------------------------------------------------------------
+
+%% Function updating Node in NodesD to now be suspended. Note that if the node is
+%% reactivating it must be moved to state tracing because that is what is doing.
+set_suspended_nodes(Node,[{Node,{up,reactivating}}|Rest]) ->
+ [{Node,{up,{tracing,suspended}}}|Rest];
+set_suspended_nodes(Node,[{Node,{up,{State,_}}}|Rest]) ->
+ [{Node,{up,{State,suspended}}}|Rest];
+set_suspended_nodes(Node,[NodesData|Rest]) ->
+ [NodesData|set_suspended_nodes(Node,Rest)];
+set_suspended_nodes(_Node,[]) -> % Hmm, strange why did we end up here?
+ [];
+set_suspended_nodes(_,{up,reactivating}) -> % Non-distributed case.
+ {up,{tracing,suspended}};
+set_suspended_nodes(_,{up,{State,_}}) ->
+ {up,{State,suspended}}.
+%% -----------------------------------------------------------------------------
+
+%% This function is called when reactivation is completed. Hence it moves the
+%% node to no longer suspended. Note this can mean that the node is either
+%% tracing or inactive. Reactivation is not allowed for a node have trace_failure.
set_running_nodes(Node,NodesD) when is_list(NodesD) ->
- case lists:keysearch(Node,1,NodesD) of
- {value,{_,AvailableStatus}} ->
- lists:keyreplace(Node,1,NodesD,{Node,set_running_nodes_2(AvailableStatus)});
- false -> % Very strange!
- NodesD
- end;
-set_running_nodes(_,NodesD) -> % The non-distributed case.
- set_running_nodes_2(NodesD).
-
-set_running_nodes_2({up,reactivating}) ->
- {up,{tracing,running}};
-set_running_nodes_2({up,{State,suspended}}) ->
- {up,{State,running}}.
-%% -----------------------------------------------------------------------------
-
-%% Function marking node as now reactivating. That means it is not suspended
-%% any longer (and tracing), but still not part of the set of nodes which shall
-%% get all commands. Returns a new NodesD.
-set_reactivating_nodes(Node,[{Node,_}|Rest]) ->
- [{Node,{up,reactivating}}|Rest];
-set_reactivating_nodes(Node,[NodesData|Rest]) ->
- [NodesData|set_reactivating_nodes(Node,Rest)];
-set_reactivating_nodes(_,[]) ->
- [];
-set_reactivating_nodes(_,{up,_}) -> % The non-distributed case.
- {up,reactivating}.
-%% -----------------------------------------------------------------------------
-
-%% Function called when stop-tracing is done. That is all nodes in Nodes shall
-%% be inactive now. Note that an inactive node can still be suspended.
-%% Returns a new NodesD.
-set_inactive_nodes(_,{up,reactivating}) -> % Non-distributed case.
- {up,{inactive,running}};
-set_inactive_nodes(_,{up,{_,Status}}) -> % Tracing or trace_failure.
- {up,{inactive,Status}};
-set_inactive_nodes(_,down) ->
- down;
-set_inactive_nodes([{Node,ok}|Rest],NodesD) ->
- case lists:keysearch(Node,1,NodesD) of
- {value,{_,{up,reactivating}}} ->
- set_inactive_nodes(Rest,lists:keyreplace(Node,1,NodesD,{Node,{up,{inactive,running}}}));
- {value,{_,{up,{_,Status}}}} -> % Tracing or trace_failure.
- set_inactive_nodes(Rest,lists:keyreplace(Node,1,NodesD,{Node,{up,{inactive,Status}}}));
- _ -> % This should not happend.
- set_inactive_nodes(Rest,NodesD)
- end;
-set_inactive_nodes([{_Node,_Error}|Rest],NodesD) ->
- set_inactive_nodes(Rest,NodesD);
-set_inactive_nodes([],NodesD) ->
- NodesD.
-%% -----------------------------------------------------------------------------
-
-%% Returns a list of all node names. Note that it can only be used in the
-%% distributed case.
-get_all_nodenames_nodes(NodesD) ->
- lists:map(fun({Node,_})->Node end,NodesD).
-%% -----------------------------------------------------------------------------
-
-%% Returns a list of all nodes that are up, tracing and running (not suspended),
-%% or 'void' in the non-distributed case. This is the list of nodes that shall get
-%% inviso commands.
-get_nodenames_running_nodes([{Node,{up,{tracing,running}}}|Rest]) ->
- [Node|get_nodenames_running_nodes(Rest)];
-get_nodenames_running_nodes([{_Node,_}|Rest]) ->
- get_nodenames_running_nodes(Rest);
-get_nodenames_running_nodes([]) ->
- [];
-get_nodenames_running_nodes(_) ->
- void. % When non distributed, N/A.
-%% -----------------------------------------------------------------------------
-
-%% Returns a list of nodes that can be made to initiate tracing.
-get_inactive_running_nodes({up,{inactive,running}}) ->
- local_runtime;
-get_inactive_running_nodes(NonDistributed) when not(is_list(NonDistributed)) ->
- [];
-get_inactive_running_nodes([{Node,{up,{inactive,running}}}|Rest]) ->
- [Node|get_inactive_running_nodes(Rest)];
-get_inactive_running_nodes([{_Node,_}|Rest]) ->
- get_inactive_running_nodes(Rest);
-get_inactive_running_nodes([]) ->
- [].
-%% -----------------------------------------------------------------------------
-
-%% Returns a list of nodes that are currently tracing (not necessarily running).
-%% In the non-distributed case the status of the runtime component will be
-%% returned.
-%% Note that nodes showing trace_failure will be included since we like to stop
-%% tracing at those nodes too.
-get_tracing_nodes([{Node,{up,{tracing,_}}}|Rest]) ->
- [Node|get_tracing_nodes(Rest)];
-get_tracing_nodes([{Node,{up,{trace_failure,_}}}|Rest]) ->
- [Node|get_tracing_nodes(Rest)];
-get_tracing_nodes([{Node,{up,reactivating}}|Rest]) ->
- [Node|get_tracing_nodes(Rest)];
-get_tracing_nodes([_|Rest]) ->
- get_tracing_nodes(Rest);
-get_tracing_nodes([]) ->
- [];
-get_tracing_nodes(AvailableStatus) ->
- AvailableStatus.
-%% -----------------------------------------------------------------------------
-
-%% Returns a list of all nodes that are currently up.
-get_available_nodes(down) ->
- undefined;
-get_available_nodes([{_Node,down}|Rest]) ->
- get_available_nodes(Rest);
-get_available_nodes([{Node,_}|Rest]) ->
- [Node|get_available_nodes(Rest)];
-get_available_nodes([]) ->
- [].
-%% -----------------------------------------------------------------------------
-
-%% Function returning the "state" of Node. Mainly used to check if the node is
-%% suspended or not.
-%% Returns {State,Status} | reactivating | down
-%% where
+ case lists:keysearch(Node,1,NodesD) of
+ {value,{_,AvailableStatus}} ->
+ lists:keyreplace(Node,1,NodesD,{Node,set_running_nodes_2(AvailableStatus)});
+ false -> % Very strange!
+ NodesD
+ end;
+set_running_nodes(_,NodesD) -> % The non-distributed case.
+ set_running_nodes_2(NodesD).
+
+set_running_nodes_2({up,reactivating}) ->
+ {up,{tracing,running}};
+set_running_nodes_2({up,{State,suspended}}) ->
+ {up,{State,running}}.
+%% -----------------------------------------------------------------------------
+
+%% Function marking node as now reactivating. That means it is not suspended
+%% any longer (and tracing), but still not part of the set of nodes which shall
+%% get all commands. Returns a new NodesD.
+set_reactivating_nodes(Node,[{Node,_}|Rest]) ->
+ [{Node,{up,reactivating}}|Rest];
+set_reactivating_nodes(Node,[NodesData|Rest]) ->
+ [NodesData|set_reactivating_nodes(Node,Rest)];
+set_reactivating_nodes(_,[]) ->
+ [];
+set_reactivating_nodes(_,{up,_}) -> % The non-distributed case.
+ {up,reactivating}.
+%% -----------------------------------------------------------------------------
+
+%% Function called when stop-tracing is done. That is all nodes in Nodes shall
+%% be inactive now. Note that an inactive node can still be suspended.
+%% Returns a new NodesD.
+set_inactive_nodes(_,{up,reactivating}) -> % Non-distributed case.
+ {up,{inactive,running}};
+set_inactive_nodes(_,{up,{_,Status}}) -> % Tracing or trace_failure.
+ {up,{inactive,Status}};
+set_inactive_nodes(_,down) ->
+ down;
+set_inactive_nodes([{Node,ok}|Rest],NodesD) ->
+ case lists:keysearch(Node,1,NodesD) of
+ {value,{_,{up,reactivating}}} ->
+ set_inactive_nodes(Rest,lists:keyreplace(Node,1,NodesD,{Node,{up,{inactive,running}}}));
+ {value,{_,{up,{_,Status}}}} -> % Tracing or trace_failure.
+ set_inactive_nodes(Rest,lists:keyreplace(Node,1,NodesD,{Node,{up,{inactive,Status}}}));
+ _ -> % This should not happend.
+ set_inactive_nodes(Rest,NodesD)
+ end;
+set_inactive_nodes([{_Node,_Error}|Rest],NodesD) ->
+ set_inactive_nodes(Rest,NodesD);
+set_inactive_nodes([],NodesD) ->
+ NodesD.
+%% -----------------------------------------------------------------------------
+
+%% Returns a list of all node names. Note that it can only be used in the
+%% distributed case.
+get_all_nodenames_nodes(NodesD) ->
+ lists:map(fun({Node,_})->Node end,NodesD).
+%% -----------------------------------------------------------------------------
+
+%% Returns a list of all nodes that are up, tracing and running (not suspended),
+%% or 'void' in the non-distributed case. This is the list of nodes that shall get
+%% inviso commands.
+get_nodenames_running_nodes([{Node,{up,{tracing,running}}}|Rest]) ->
+ [Node|get_nodenames_running_nodes(Rest)];
+get_nodenames_running_nodes([{_Node,_}|Rest]) ->
+ get_nodenames_running_nodes(Rest);
+get_nodenames_running_nodes([]) ->
+ [];
+get_nodenames_running_nodes(_) ->
+ void. % When non distributed, N/A.
+%% -----------------------------------------------------------------------------
+
+%% Returns a list of nodes that can be made to initiate tracing.
+get_inactive_running_nodes({up,{inactive,running}}) ->
+ local_runtime;
+get_inactive_running_nodes(NonDistributed) when not(is_list(NonDistributed)) ->
+ [];
+get_inactive_running_nodes([{Node,{up,{inactive,running}}}|Rest]) ->
+ [Node|get_inactive_running_nodes(Rest)];
+get_inactive_running_nodes([{_Node,_}|Rest]) ->
+ get_inactive_running_nodes(Rest);
+get_inactive_running_nodes([]) ->
+ [].
+%% -----------------------------------------------------------------------------
+
+%% Returns a list of nodes that are currently tracing (not necessarily running).
+%% In the non-distributed case the status of the runtime component will be
+%% returned.
+%% Note that nodes showing trace_failure will be included since we like to stop
+%% tracing at those nodes too.
+get_tracing_nodes([{Node,{up,{tracing,_}}}|Rest]) ->
+ [Node|get_tracing_nodes(Rest)];
+get_tracing_nodes([{Node,{up,{trace_failure,_}}}|Rest]) ->
+ [Node|get_tracing_nodes(Rest)];
+get_tracing_nodes([{Node,{up,reactivating}}|Rest]) ->
+ [Node|get_tracing_nodes(Rest)];
+get_tracing_nodes([_|Rest]) ->
+ get_tracing_nodes(Rest);
+get_tracing_nodes([]) ->
+ [];
+get_tracing_nodes(AvailableStatus) ->
+ AvailableStatus.
+%% -----------------------------------------------------------------------------
+
+%% Returns a list of all nodes that are currently up.
+get_available_nodes(down) ->
+ undefined;
+get_available_nodes([{_Node,down}|Rest]) ->
+ get_available_nodes(Rest);
+get_available_nodes([{Node,_}|Rest]) ->
+ [Node|get_available_nodes(Rest)];
+get_available_nodes([]) ->
+ [].
+%% -----------------------------------------------------------------------------
+
+%% Function returning the "state" of Node. Mainly used to check if the node is
+%% suspended or not.
+%% Returns {State,Status} | reactivating | down
+%% where
get_state_nodes(Node,NodesD) when is_list(NodesD) ->
- case lists:keysearch(Node,1,NodesD) of
- {value,{_,AvailableStatus}} ->
- get_state_nodes_2(AvailableStatus);
- false ->
- false
- end;
-get_state_nodes(_,NodesD) -> % Non distributed case.
- get_state_nodes_2(NodesD).
-
-get_state_nodes_2({up,{trace_failure,Status}}) ->
- {trace_failure,Status};
-get_state_nodes_2({up,{State,suspended}}) -> % {tracing|inactive,suspended}
- {State,suspended};
-get_state_nodes_2({up,reactivating}) ->
- reactivating;
-get_state_nodes_2({up,{State,running}}) ->
- {State,running};
-get_state_nodes_2(down) ->
- down.
-%% -----------------------------------------------------------------------------
-
-%% Help function in the case we need to consult the state/status of a runtime
-%% component. Returns a nodesD value that can be added to the nodes database.
-mk_nodes_state_from_status({ok,{tracing,running}}) ->
- {up,{tracing,running}};
-mk_nodes_state_from_status({ok,{tracing,{suspended,_SReason}}}) ->
- {up,{tracing,suspended}};
-mk_nodes_state_from_status({ok,{_,running}}) ->
- {up,{inactive,running}};
-mk_nodes_state_from_status({ok,{_,{suspended,_SReason}}}) ->
- {up,{inactive,suspended}};
-mk_nodes_state_from_status({error,_Reason}) ->
- down.
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% The session_state.
-%% -----------------------------------------------------------------------------
-
-%% The session state reflects if the inviso_tool is tracing or not.
-%% This means that if the tool is tracing a reconnected node can be made to
-%% restart_session.
-
-%% Returns the correct value indicating that we are tracing now.
-tracing_sessionstate() ->
- tracing.
-%% -----------------------------------------------------------------------------
-
-%% Returns true or false depending on if we are tracing now or not.
-is_tracing(tracing) ->
- true;
-is_tracing(_) ->
- false.
-%% -----------------------------------------------------------------------------
-
-%% Returns the correct value indicating that the tool is not tracing.
-passive_sessionstate() ->
- idle.
-%% -----------------------------------------------------------------------------
-
-%% -----------------------------------------------------------------------------
-%% The tracer_data datastructure.
-%% -----------------------------------------------------------------------------
-
-%% The tracer_data structure collects the tracer data arguments used to init tracing
-%% by this inviso tool. The args are saved per session. Each session has
-%% a number.
-%% Implementation:
-%% Sessions=[{SessionNr,TDGargs},...]
-%% SessionNr=integer()
-%% TDGargs=list(), args given to the tracer data generator
-%% minus the first argument which is the Node name.
-
-%% Function taking tracerdata args structure inserting yet another session.
-%% Returns {SessionNr,NewTDs}.
-insert_td_tracer_data(TDGargs,TDs=[{SNr,_}|_]) ->
- {SNr+1,[{SNr+1,TDGargs}|TDs]};
-insert_td_tracer_data(TDGargs,undefined) ->
- {1,[{1,TDGargs}]}.
-%% -----------------------------------------------------------------------------
-
-%% Returns the latest session nr.
-get_latest_session_nr_tracer_data(undefined) ->
- undefined;
-get_latest_session_nr_tracer_data([{SessionNr,_}|_]) ->
- SessionNr.
-%% -----------------------------------------------------------------------------
-
-%% Returns the tracer data arguments used when creating the trace data for the
-%% latest session.
-get_latest_tdgargs_tracer_data(undefined) ->
- undefined;
-get_latest_tdgargs_tracer_data([{_,TDGargs}|_]) ->
- TDGargs.
-%% -----------------------------------------------------------------------------
-
-
-%% -----------------------------------------------------------------------------
-%% The tc_dict or trace case dictionary datastructure.
-%% -----------------------------------------------------------------------------
-
-%% The tc_dict stores information about all available trace cases.
-%% Implementation:
-%% [{TCname,Type,VarNames,FNameOn [,FNameOff]},...]
-%% TCname=atom()
-%% Type=on | on_off
-%% VarNames=[atom(),...]
-%% FNameOn=FNameOff=string()
-
-%% Returns the empty trace case dictionary.
-mk_tc_dict() ->
- [].
-%% -----------------------------------------------------------------------------
-
-%% Function inserting a new trace case into the trace case dictionary.
-insert_tracecase_tc_dict(TCname,on,VarNames,FNameOn,TCdict) ->
- [{TCname,on,VarNames,FNameOn}|TCdict].
-insert_tracecase_tc_dict(TCname,on_off,VarNames,FNameOn,FNameOff,TCdict) ->
- [{TCname,on_off,VarNames,FNameOn,FNameOff}|TCdict].
-%% -----------------------------------------------------------------------------
-
-%% Function finding a trace case definition in the tc_dict structure.
-%% Returns {ok,{TCname,Type,VarNAmes,FNameOn [,FNameOff]}} or 'false'.
-get_tracecase_tc_dict(TCname,[Tuple|_]) when element(1,Tuple)==TCname ->
- {ok,Tuple};
-get_tracecase_tc_dict(TCname,[_|Rest]) ->
- get_tracecase_tc_dict(TCname,Rest);
-get_tracecase_tc_dict(_,[]) ->
- false;
-get_tracecase_tc_dict(_,_) -> % There are no trace cases!
- false.
-%% -----------------------------------------------------------------------------
-
-%% Function working on the trace case definition returned by get_tracecase_tc_dict/2
-%% function.
-%% Returning {ok,ActivationFileName}.
-get_tc_activate_fname({_TCname,_Type,_VarNames,FNameOn}) ->
- {ok,FNameOn};
-get_tc_activate_fname({_TCname,_Type,_VarNames,FNameOn,_FNameOff}) ->
- {ok,FNameOn}.
-
-get_tc_deactivate_fname({_TCname,_Type,_VarNames,_FNameOn,FNameOff}) ->
- {ok,FNameOff};
-get_tc_deactivate_fname(_) -> % Not a case with off function.
- false.
-
-get_tc_varnames({_TCname,_Type,VarNames,_FNameOn}) ->
- VarNames;
-get_tc_varnames({_TCname,_Type,VarNames,_FNameOn,_FNameOff}) ->
- VarNames.
-
-%% -----------------------------------------------------------------------------
-
-
-%% The Command History Log (CHL) stores commands to make it possible to
-%% reactivate suspended nodes, reconnect restarted nodes, and to make
-%% autostart files.
-%% Each time tracing is initiated (that is started) the CHL is cleared since
-%% it would not make scense to repeat commands from an earlier tracing at
-%% reactivation for instance.
-
-%% Implementation: {NextCounter,OnGoingList,ETStable}
-%% NextCounter=integer(), next command number - to be able to sort them in order.
-%% OnGoingList=[{ProcH,{TCname,ID}},...]
-%% ID=term(), instance id for this execution of this trace case.
-%% ETStable=tid() -> {{TCname,Id},Counter,State1,Bindings}
-%% ETStable=tid() -> {{TCname,Id},Counter,running,Bindings,Result} |
-%% {{TCname,Id,#Ref},Counter,stop,Bindings} |
-%% {{TCname,#Ref},Counter,Bindings} % An rtc
-%% {{M,F,Args,#Ref},Counter}
-%% Counter=integer(), the order-counter for this logged entry.
-%% State1=activating | stopping
-%% Where:
-%% activating: the activation file for the tracecase is running.
-%% running : activation is completed.
-%% stopping : set on the previously running ETS entry when deactivation
-%% file is currently executing.
-%% stop : entered with own Counter into the ETS table when
-%% deactivation file is executing. Remains after too.
-%% Result=term(), the result returned from the tr-case or inviso call.
-
-
-%% Returning an initial empty CHL.
-mk_chl(undefined) ->
- {1,[],ets:new(inviso_tool_chl,[set,protected])};
-mk_chl({_,_,TId}) ->
- ets:delete(TId),
- mk_chl(undefined).
-
-%% Help function returning 'true' if there is a current history.
-history_exists_chl(undefined) ->
- false;
-history_exists_chl({_,_,_}) ->
- true.
-
-%% Function looking up the state of this trace case.
-find_id_chl(TCname,Id,{_NextCounter,_OnGoingList,TId}) ->
- case ets:lookup(TId,{TCname,Id}) of
- [{_,_,running,Bindings,_Result}] -> % The trace case is tracing.
- {ok,Bindings};
- [{_,_,State,_}] -> % activating or stopping.
- State;
- [] ->
- false
- end.
-
-%% Function finding the Trace case associated with a process handle
-%% doing this trace case's activation or stopping.
-find_tc_executer_chl(ProcH,{_,OnGoingList,TId}) ->
- case lists:keysearch(ProcH,1,OnGoingList) of
- {value,{_,{TCname,Id}}} ->
- [{_,_,State,_}]=ets:lookup(TId,{TCname,Id}),
- {State,{TCname,Id}}; % Should be activating or stopping.
- false ->
- false
- end.
-
-%% Adds a Trace case to the CHL. This is done when it is turned on. Or when it
-%% is called for trace cases that do not have on/off functionality.
-set_activating_chl(TCname,Id,{Counter,OnGoingList,TId},Bindings,ProcH) ->
- ets:insert(TId,{{TCname,Id},Counter,activating,Bindings}),
- {Counter+1,[{ProcH,{TCname,Id}}|OnGoingList],TId}.
-
-%% Function marking a trace case as now running. That is the activation
-%% phase is completed. It is normaly completed when the process executing
-%% the trace case signals that it is done.
-set_running_chl(ProcH,TCname,Id,Result,{NextCounter,OnGoingList,TId}) ->
- [{_,Counter,_,Bindings}]=ets:lookup(TId,{TCname,Id}),
- ets:insert(TId,{{TCname,Id},Counter,running,Bindings,Result}),
- NewOnGoingList=lists:keydelete(ProcH,1,OnGoingList),
- {NextCounter,NewOnGoingList,TId}.
-
-%% Function marking trace case TCname with identifier Id as now in its stopping
-%% state. Where ProcH is the handler to the process running the stopping
-%% trace case.
-set_stopping_chl(TCname,Id,{NextCounter,OnGoingList,TId},ProcH)->
- [{_,Counter,_,Bindings,_}]=ets:lookup(TId,{TCname,Id}),
- ets:insert(TId,{{TCname,Id},Counter,stopping,Bindings}),
- ets:insert(TId,{{TCname,Id,make_ref()},NextCounter,stop,Bindings}),
- {NextCounter+1,[{ProcH,{TCname,Id}}|OnGoingList],TId}.
-
-%% Function removing a TCname-Id from the CHL. This is mostly used
-%% if activating the trace case failed for some reason. We do not then
-%% expect the user to stop the trace case. Hence it must be removed now.
-%% A reactivation process may have noticed the activating-entry and started
-%% to activate it. But since the general state reached after an unsuccessful
-%% activation can not easily be determined, we don't try to do much about it.
-del_tc_chl(ProcH,TCname,Id,{NextCounter,OnGoingList,TId}) ->
- ets:delete(TId,{TCname,Id}),
- NewOnGoingList=lists:keydelete(ProcH,1,OnGoingList),
- {NextCounter,NewOnGoingList,TId}.
-
-%% Function removing the entry TCname+Id from the CHL. This makes it
-%% possible to activate a tracecase with this id again. The entry was
-%% previously marked as stopping.
-nullify_chl(ProcH,TCname,Id,{NextCounter,OnGoingList,TId}) ->
- ets:delete(TId,{TCname,Id}),
- NewOnGoingList=lists:keydelete(ProcH,1,OnGoingList),
- {NextCounter+1,NewOnGoingList,TId}.
-
-%% Function stopping all processes saved as being now running tc executers.
-%% This is useful as cleanup during stop tracing for instance.
-%% Returns a new CHL which is not in all parts correct. Entries in the
-%% ETS table are for instance not properly state-changed. But the CHL will
-%% from now on only be used to create command files and similar.
-stop_all_tc_executer_chl({NextCounter,[{ProcH,_}|Rest],TId}) ->
- exit(ProcH,kill),
- stop_all_tc_executer_chl({NextCounter,Rest,TId});
-stop_all_tc_executer_chl({NextCounter,[],TId}) ->
- {NextCounter,[],TId}.
-
-%% Function adding a "plain" inviso call to the CHL.
-add_inviso_call_chl(Cmd,Args,{NextCounter,OnGoingList,TId}) ->
- ets:insert(TId,{{inviso,Cmd,Args,make_ref()},NextCounter}),
- {NextCounter+1,OnGoingList,TId}.
-
-%% Function adding a run trace case entry to the chl.
-add_rtc_chl(TCname,Bindings,{NextCounter,OnGoingList,TId}) ->
- ets:insert(TId,{{TCname,make_ref()},NextCounter,Bindings}),
- {NextCounter+1,OnGoingList,TId}.
-%% Returns the highest used counter number in the command history log.
-get_highest_used_counter_chl({NextCounter,_,_}) ->
- NextCounter-1.
-
-%% Help function returning a list of {{TCname,Id},Phase} for all ongoing
-%% assynchronous tracecases.
-get_ongoing_chl(undefined) ->
- [];
-get_ongoing_chl({_,OngoingList,TId}) ->
- get_ongoing_chl_2(OngoingList,TId).
-
-get_ongoing_chl_2([{_ProcH,{TCname,Id}}|Rest],TId) ->
- case ets:lookup(TId,{TCname,Id}) of
- [{_,_C,activating,_B}] ->
- [{{TCname,Id},activating}|get_ongoing_chl_2(Rest,TId)];
- [{_,_C,stopping,_B}] ->
- [{{TCname,Id},deactivating}|get_ongoing_chl_2(Rest,TId)]
- end;
-get_ongoing_chl_2([],_) ->
- [].
-
-%% Function returning a list of log entries. Note that the list is unsorted
-%% in respect to Counter.
-get_loglist_chl({_,_,TId}) ->
- L=ets:tab2list(TId),
- lists:map(fun({{TC,Id},C,S,B,_Result}) -> {{TC,Id},C,S,B}; % running
- (Tuple={{_TC,_Id},_C,_S,_B}) -> Tuple; % activating | stopping
- (Tuple={{_TC,_Id,_Ref},_C,_S,_B}) -> Tuple; % stop
- (Tuple={{_M,_F,_Args,_Ref},_C}) -> Tuple;
- (Tuple={{_TC,_Ref},_C,_B}) -> Tuple
- end,
- L);
-get_loglist_chl(_) -> % The history is not initiated, ever!
- [].
-
-%% Function returning a list of log entries, but only those which are not
-%% cancelled out by deactivations.
-% get_loglist_active_chl({_,_,TId}) ->
-% L=ets:tab2list(TId),
-% lists:zf(fun({{TC,Id},C,S,B,_Result}) -> {true,{{TC,Id},C,S,B}}; % running
-% (Tuple={{_TC,_Id},_C,_S,_B}) -> Tuple; % activating | stopping
-% (Tuple={{_TC,_Id,_Ref},_C,_S,_B}) -> Tuple; % stop
-% (Tuple={{_M,_F,_Args,_Ref},_C}) -> Tuple
-% end,
-% L);
-% get_loglist_chl(_) -> % The history is not initiated, ever!
-% [].
-
-
-%% This helpfunction recreates a history from a saved history list. This function
-%% is supposed to crash if the log is not well formatted. Note that we must restore
-%% the counter in order for the counter to work if new commands are added to the
-%% history.
-replace_history_chl(OldCHL,SortedLog) ->
- {_,Ongoing,TId}=mk_chl(OldCHL),
- {NewTId,Counter}=replace_history_chl_2(TId,SortedLog,0),
- {ok,{Counter+1,Ongoing,NewTId}}.
-
-replace_history_chl_2(TId,[{{TC,Id},C,running,B}|Rest],_Counter) ->
- ets:insert(TId,{{TC,Id},C,running,B,undefined}),
- replace_history_chl_2(TId,Rest,C);
-replace_history_chl_2(TId,[{{M,F,Args},C}|Rest],_Counter) ->
- ets:insert(TId,{{M,F,Args,make_ref()},C}),
- replace_history_chl_2(TId,Rest,C);
-replace_history_chl_2(TId,[{TC,C,B}|Rest],_Counter) ->
- ets:insert(TId,{{TC,make_ref()},C,B}),
- replace_history_chl_2(TId,Rest,C);
-replace_history_chl_2(TId,[],Counter) ->
- {TId,Counter}.
-%% -----------------------------------------------------------------------------
-
-
-%% -----------------------------------------------------------------------------
-%% Reactivators data structure.
-%% -----------------------------------------------------------------------------
-
-%% Function adding a new node-reactivatorpid pair to the reactivators structure.
-%% In this way we know which reactivators to remove if Node terminates, or when
-%% a node is fully updated when a reactivator is done.
-add_reactivators(Node,Pid,Reactivators) ->
- [{Node,Pid}|Reactivators].
-
-%% Function removing a reactivator entry from the reactivators structure.
-del_reactivators(RPid,[{_Node,RPid}|Rest]) ->
- Rest;
-del_reactivators(RPid,[Element|Rest]) ->
- [Element|del_reactivators(RPid,Rest)];
-del_reactivators(_,[]) -> % This should not happend.
- [].
-
-get_node_reactivators(RPid,Reactivators) ->
- case lists:keysearch(RPid,2,Reactivators) of
- {value,{Node,_}} ->
- Node;
- false -> % This should not happend.
- false
- end.
-
-%% Returns a list of list all nodes that are currently reactivating.
-get_all_nodes_reactivators([{Nodes,_Pid}|Rest]) ->
- [Nodes|get_all_nodes_reactivators(Rest)];
-get_all_nodes_reactivators([]) ->
- [].
-
-%% Function stopping all running reactivator processes. Returns a new empty
-%% reactivators structure. Note that this function does not set the state of
-%% Nodes. It must most often be set to running.
-stop_all_reactivators([{_Nodes,Pid}|Rest]) ->
- exit(Pid,kill),
- stop_all_reactivators(Rest);
-stop_all_reactivators([]) ->
- []. % Returns an empty reactivators.
-
-%% Help function stopping the reactivator (if any) that reactivates Node.
-%% Returns a new list of reactivators structure.
-stop_node_reactivators(Node,[{Node,Pid}|Rest]) ->
- exit(Pid,kill),
- Rest;
-stop_node_reactivators(Node,[NodePid|Rest]) ->
- [NodePid|stop_node_reactivators(Node,Rest)];
-stop_node_reactivators(_,[]) ->
- [].
-%% -----------------------------------------------------------------------------
-
-
-%% -----------------------------------------------------------------------------
-%% Started initial trace cases data structure.
-%% -----------------------------------------------------------------------------
-
-%% This datastructure keeps information about ongoing trace cases started
-%% automatically at init_tracing. These must be automatically stopped when calling
-%% stop_tracing.
-
-add_initial_tcs(TCname,Id,StartedInitialTcs) ->
- [{TCname,Id}|StartedInitialTcs].
-%% -----------------------------------------------------------------------------
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ case lists:keysearch(Node,1,NodesD) of
+ {value,{_,AvailableStatus}} ->
+ get_state_nodes_2(AvailableStatus);
+ false ->
+ false
+ end;
+get_state_nodes(_,NodesD) -> % Non distributed case.
+ get_state_nodes_2(NodesD).
+
+get_state_nodes_2({up,{trace_failure,Status}}) ->
+ {trace_failure,Status};
+get_state_nodes_2({up,{State,suspended}}) -> % {tracing|inactive,suspended}
+ {State,suspended};
+get_state_nodes_2({up,reactivating}) ->
+ reactivating;
+get_state_nodes_2({up,{State,running}}) ->
+ {State,running};
+get_state_nodes_2(down) ->
+ down.
+%% -----------------------------------------------------------------------------
+
+%% Help function in the case we need to consult the state/status of a runtime
+%% component. Returns a nodesD value that can be added to the nodes database.
+mk_nodes_state_from_status({ok,{tracing,running}}) ->
+ {up,{tracing,running}};
+mk_nodes_state_from_status({ok,{tracing,{suspended,_SReason}}}) ->
+ {up,{tracing,suspended}};
+mk_nodes_state_from_status({ok,{_,running}}) ->
+ {up,{inactive,running}};
+mk_nodes_state_from_status({ok,{_,{suspended,_SReason}}}) ->
+ {up,{inactive,suspended}};
+mk_nodes_state_from_status({error,_Reason}) ->
+ down.
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% The session_state.
+%% -----------------------------------------------------------------------------
+
+%% The session state reflects if the inviso_tool is tracing or not.
+%% This means that if the tool is tracing a reconnected node can be made to
+%% restart_session.
+
+%% Returns the correct value indicating that we are tracing now.
+tracing_sessionstate() ->
+ tracing.
+%% -----------------------------------------------------------------------------
+
+%% Returns true or false depending on if we are tracing now or not.
+is_tracing(tracing) ->
+ true;
+is_tracing(_) ->
+ false.
+%% -----------------------------------------------------------------------------
+
+%% Returns the correct value indicating that the tool is not tracing.
+passive_sessionstate() ->
+ idle.
+%% -----------------------------------------------------------------------------
+
+%% -----------------------------------------------------------------------------
+%% The tracer_data datastructure.
+%% -----------------------------------------------------------------------------
+
+%% The tracer_data structure collects the tracer data arguments used to init tracing
+%% by this inviso tool. The args are saved per session. Each session has
+%% a number.
+%% Implementation:
+%% Sessions=[{SessionNr,TDGargs},...]
+%% SessionNr=integer()
+%% TDGargs=list(), args given to the tracer data generator
+%% minus the first argument which is the Node name.
+
+%% Function taking tracerdata args structure inserting yet another session.
+%% Returns {SessionNr,NewTDs}.
+insert_td_tracer_data(TDGargs,TDs=[{SNr,_}|_]) ->
+ {SNr+1,[{SNr+1,TDGargs}|TDs]};
+insert_td_tracer_data(TDGargs,undefined) ->
+ {1,[{1,TDGargs}]}.
+%% -----------------------------------------------------------------------------
+
+%% Returns the latest session nr.
+get_latest_session_nr_tracer_data(undefined) ->
+ undefined;
+get_latest_session_nr_tracer_data([{SessionNr,_}|_]) ->
+ SessionNr.
+%% -----------------------------------------------------------------------------
+
+%% Returns the tracer data arguments used when creating the trace data for the
+%% latest session.
+get_latest_tdgargs_tracer_data(undefined) ->
+ undefined;
+get_latest_tdgargs_tracer_data([{_,TDGargs}|_]) ->
+ TDGargs.
+%% -----------------------------------------------------------------------------
+
+
+%% -----------------------------------------------------------------------------
+%% The tc_dict or trace case dictionary datastructure.
+%% -----------------------------------------------------------------------------
+
+%% The tc_dict stores information about all available trace cases.
+%% Implementation:
+%% [{TCname,Type,VarNames,FNameOn [,FNameOff]},...]
+%% TCname=atom()
+%% Type=on | on_off
+%% VarNames=[atom(),...]
+%% FNameOn=FNameOff=string()
+
+%% Returns the empty trace case dictionary.
+mk_tc_dict() ->
+ [].
+%% -----------------------------------------------------------------------------
+
+%% Function inserting a new trace case into the trace case dictionary.
+insert_tracecase_tc_dict(TCname,on,VarNames,FNameOn,TCdict) ->
+ [{TCname,on,VarNames,FNameOn}|TCdict].
+insert_tracecase_tc_dict(TCname,on_off,VarNames,FNameOn,FNameOff,TCdict) ->
+ [{TCname,on_off,VarNames,FNameOn,FNameOff}|TCdict].
+%% -----------------------------------------------------------------------------
+
+%% Function finding a trace case definition in the tc_dict structure.
+%% Returns {ok,{TCname,Type,VarNAmes,FNameOn [,FNameOff]}} or 'false'.
+get_tracecase_tc_dict(TCname,[Tuple|_]) when element(1,Tuple)==TCname ->
+ {ok,Tuple};
+get_tracecase_tc_dict(TCname,[_|Rest]) ->
+ get_tracecase_tc_dict(TCname,Rest);
+get_tracecase_tc_dict(_,[]) ->
+ false;
+get_tracecase_tc_dict(_,_) -> % There are no trace cases!
+ false.
+%% -----------------------------------------------------------------------------
+
+%% Function working on the trace case definition returned by get_tracecase_tc_dict/2
+%% function.
+%% Returning {ok,ActivationFileName}.
+get_tc_activate_fname({_TCname,_Type,_VarNames,FNameOn}) ->
+ {ok,FNameOn};
+get_tc_activate_fname({_TCname,_Type,_VarNames,FNameOn,_FNameOff}) ->
+ {ok,FNameOn}.
+
+get_tc_deactivate_fname({_TCname,_Type,_VarNames,_FNameOn,FNameOff}) ->
+ {ok,FNameOff};
+get_tc_deactivate_fname(_) -> % Not a case with off function.
+ false.
+
+get_tc_varnames({_TCname,_Type,VarNames,_FNameOn}) ->
+ VarNames;
+get_tc_varnames({_TCname,_Type,VarNames,_FNameOn,_FNameOff}) ->
+ VarNames.
+
+%% -----------------------------------------------------------------------------
+
+
+%% The Command History Log (CHL) stores commands to make it possible to
+%% reactivate suspended nodes, reconnect restarted nodes, and to make
+%% autostart files.
+%% Each time tracing is initiated (that is started) the CHL is cleared since
+%% it would not make scense to repeat commands from an earlier tracing at
+%% reactivation for instance.
+
+%% Implementation: {NextCounter,OnGoingList,ETStable}
+%% NextCounter=integer(), next command number - to be able to sort them in order.
+%% OnGoingList=[{ProcH,{TCname,ID}},...]
+%% ID=term(), instance id for this execution of this trace case.
+%% ETStable=tid() -> {{TCname,Id},Counter,State1,Bindings}
+%% ETStable=tid() -> {{TCname,Id},Counter,running,Bindings,Result} |
+%% {{TCname,Id,#Ref},Counter,stop,Bindings} |
+%% {{TCname,#Ref},Counter,Bindings} % An rtc
+%% {{M,F,Args,#Ref},Counter}
+%% Counter=integer(), the order-counter for this logged entry.
+%% State1=activating | stopping
+%% Where:
+%% activating: the activation file for the tracecase is running.
+%% running : activation is completed.
+%% stopping : set on the previously running ETS entry when deactivation
+%% file is currently executing.
+%% stop : entered with own Counter into the ETS table when
+%% deactivation file is executing. Remains after too.
+%% Result=term(), the result returned from the tr-case or inviso call.
+
+
+%% Returning an initial empty CHL.
+mk_chl(undefined) ->
+ {1,[],ets:new(inviso_tool_chl,[set,protected])};
+mk_chl({_,_,TId}) ->
+ ets:delete(TId),
+ mk_chl(undefined).
+
+%% Help function returning 'true' if there is a current history.
+history_exists_chl(undefined) ->
+ false;
+history_exists_chl({_,_,_}) ->
+ true.
+
+%% Function looking up the state of this trace case.
+find_id_chl(TCname,Id,{_NextCounter,_OnGoingList,TId}) ->
+ case ets:lookup(TId,{TCname,Id}) of
+ [{_,_,running,Bindings,_Result}] -> % The trace case is tracing.
+ {ok,Bindings};
+ [{_,_,State,_}] -> % activating or stopping.
+ State;
+ [] ->
+ false
+ end.
+
+%% Function finding the Trace case associated with a process handle
+%% doing this trace case's activation or stopping.
+find_tc_executer_chl(ProcH,{_,OnGoingList,TId}) ->
+ case lists:keysearch(ProcH,1,OnGoingList) of
+ {value,{_,{TCname,Id}}} ->
+ [{_,_,State,_}]=ets:lookup(TId,{TCname,Id}),
+ {State,{TCname,Id}}; % Should be activating or stopping.
+ false ->
+ false
+ end.
+
+%% Adds a Trace case to the CHL. This is done when it is turned on. Or when it
+%% is called for trace cases that do not have on/off functionality.
+set_activating_chl(TCname,Id,{Counter,OnGoingList,TId},Bindings,ProcH) ->
+ ets:insert(TId,{{TCname,Id},Counter,activating,Bindings}),
+ {Counter+1,[{ProcH,{TCname,Id}}|OnGoingList],TId}.
+
+%% Function marking a trace case as now running. That is the activation
+%% phase is completed. It is normaly completed when the process executing
+%% the trace case signals that it is done.
+set_running_chl(ProcH,TCname,Id,Result,{NextCounter,OnGoingList,TId}) ->
+ [{_,Counter,_,Bindings}]=ets:lookup(TId,{TCname,Id}),
+ ets:insert(TId,{{TCname,Id},Counter,running,Bindings,Result}),
+ NewOnGoingList=lists:keydelete(ProcH,1,OnGoingList),
+ {NextCounter,NewOnGoingList,TId}.
+
+%% Function marking trace case TCname with identifier Id as now in its stopping
+%% state. Where ProcH is the handler to the process running the stopping
+%% trace case.
+set_stopping_chl(TCname,Id,{NextCounter,OnGoingList,TId},ProcH)->
+ [{_,Counter,_,Bindings,_}]=ets:lookup(TId,{TCname,Id}),
+ ets:insert(TId,{{TCname,Id},Counter,stopping,Bindings}),
+ ets:insert(TId,{{TCname,Id,make_ref()},NextCounter,stop,Bindings}),
+ {NextCounter+1,[{ProcH,{TCname,Id}}|OnGoingList],TId}.
+
+%% Function removing a TCname-Id from the CHL. This is mostly used
+%% if activating the trace case failed for some reason. We do not then
+%% expect the user to stop the trace case. Hence it must be removed now.
+%% A reactivation process may have noticed the activating-entry and started
+%% to activate it. But since the general state reached after an unsuccessful
+%% activation can not easily be determined, we don't try to do much about it.
+del_tc_chl(ProcH,TCname,Id,{NextCounter,OnGoingList,TId}) ->
+ ets:delete(TId,{TCname,Id}),
+ NewOnGoingList=lists:keydelete(ProcH,1,OnGoingList),
+ {NextCounter,NewOnGoingList,TId}.
+
+%% Function removing the entry TCname+Id from the CHL. This makes it
+%% possible to activate a tracecase with this id again. The entry was
+%% previously marked as stopping.
+nullify_chl(ProcH,TCname,Id,{NextCounter,OnGoingList,TId}) ->
+ ets:delete(TId,{TCname,Id}),
+ NewOnGoingList=lists:keydelete(ProcH,1,OnGoingList),
+ {NextCounter+1,NewOnGoingList,TId}.
+
+%% Function stopping all processes saved as being now running tc executers.
+%% This is useful as cleanup during stop tracing for instance.
+%% Returns a new CHL which is not in all parts correct. Entries in the
+%% ETS table are for instance not properly state-changed. But the CHL will
+%% from now on only be used to create command files and similar.
+stop_all_tc_executer_chl({NextCounter,[{ProcH,_}|Rest],TId}) ->
+ exit(ProcH,kill),
+ stop_all_tc_executer_chl({NextCounter,Rest,TId});
+stop_all_tc_executer_chl({NextCounter,[],TId}) ->
+ {NextCounter,[],TId}.
+
+%% Function adding a "plain" inviso call to the CHL.
+add_inviso_call_chl(Cmd,Args,{NextCounter,OnGoingList,TId}) ->
+ ets:insert(TId,{{inviso,Cmd,Args,make_ref()},NextCounter}),
+ {NextCounter+1,OnGoingList,TId}.
+
+%% Function adding a run trace case entry to the chl.
+add_rtc_chl(TCname,Bindings,{NextCounter,OnGoingList,TId}) ->
+ ets:insert(TId,{{TCname,make_ref()},NextCounter,Bindings}),
+ {NextCounter+1,OnGoingList,TId}.
+%% Returns the highest used counter number in the command history log.
+get_highest_used_counter_chl({NextCounter,_,_}) ->
+ NextCounter-1.
+
+%% Help function returning a list of {{TCname,Id},Phase} for all ongoing
+%% assynchronous tracecases.
+get_ongoing_chl(undefined) ->
+ [];
+get_ongoing_chl({_,OngoingList,TId}) ->
+ get_ongoing_chl_2(OngoingList,TId).
+
+get_ongoing_chl_2([{_ProcH,{TCname,Id}}|Rest],TId) ->
+ case ets:lookup(TId,{TCname,Id}) of
+ [{_,_C,activating,_B}] ->
+ [{{TCname,Id},activating}|get_ongoing_chl_2(Rest,TId)];
+ [{_,_C,stopping,_B}] ->
+ [{{TCname,Id},deactivating}|get_ongoing_chl_2(Rest,TId)]
+ end;
+get_ongoing_chl_2([],_) ->
+ [].
+
+%% Function returning a list of log entries. Note that the list is unsorted
+%% in respect to Counter.
+get_loglist_chl({_,_,TId}) ->
+ L=ets:tab2list(TId),
+ lists:map(fun({{TC,Id},C,S,B,_Result}) -> {{TC,Id},C,S,B}; % running
+ (Tuple={{_TC,_Id},_C,_S,_B}) -> Tuple; % activating | stopping
+ (Tuple={{_TC,_Id,_Ref},_C,_S,_B}) -> Tuple; % stop
+ (Tuple={{_M,_F,_Args,_Ref},_C}) -> Tuple;
+ (Tuple={{_TC,_Ref},_C,_B}) -> Tuple
+ end,
+ L);
+get_loglist_chl(_) -> % The history is not initiated, ever!
+ [].
+
+%% Function returning a list of log entries, but only those which are not
+%% cancelled out by deactivations.
+% get_loglist_active_chl({_,_,TId}) ->
+% L=ets:tab2list(TId),
+% lists:zf(fun({{TC,Id},C,S,B,_Result}) -> {true,{{TC,Id},C,S,B}}; % running
+% (Tuple={{_TC,_Id},_C,_S,_B}) -> Tuple; % activating | stopping
+% (Tuple={{_TC,_Id,_Ref},_C,_S,_B}) -> Tuple; % stop
+% (Tuple={{_M,_F,_Args,_Ref},_C}) -> Tuple
+% end,
+% L);
+% get_loglist_chl(_) -> % The history is not initiated, ever!
+% [].
+
+
+%% This helpfunction recreates a history from a saved history list. This function
+%% is supposed to crash if the log is not well formatted. Note that we must restore
+%% the counter in order for the counter to work if new commands are added to the
+%% history.
+replace_history_chl(OldCHL,SortedLog) ->
+ {_,Ongoing,TId}=mk_chl(OldCHL),
+ {NewTId,Counter}=replace_history_chl_2(TId,SortedLog,0),
+ {ok,{Counter+1,Ongoing,NewTId}}.
+
+replace_history_chl_2(TId,[{{TC,Id},C,running,B}|Rest],_Counter) ->
+ ets:insert(TId,{{TC,Id},C,running,B,undefined}),
+ replace_history_chl_2(TId,Rest,C);
+replace_history_chl_2(TId,[{{M,F,Args},C}|Rest],_Counter) ->
+ ets:insert(TId,{{M,F,Args,make_ref()},C}),
+ replace_history_chl_2(TId,Rest,C);
+replace_history_chl_2(TId,[{TC,C,B}|Rest],_Counter) ->
+ ets:insert(TId,{{TC,make_ref()},C,B}),
+ replace_history_chl_2(TId,Rest,C);
+replace_history_chl_2(TId,[],Counter) ->
+ {TId,Counter}.
+%% -----------------------------------------------------------------------------
+
+
+%% -----------------------------------------------------------------------------
+%% Reactivators data structure.
+%% -----------------------------------------------------------------------------
+
+%% Function adding a new node-reactivatorpid pair to the reactivators structure.
+%% In this way we know which reactivators to remove if Node terminates, or when
+%% a node is fully updated when a reactivator is done.
+add_reactivators(Node,Pid,Reactivators) ->
+ [{Node,Pid}|Reactivators].
+
+%% Function removing a reactivator entry from the reactivators structure.
+del_reactivators(RPid,[{_Node,RPid}|Rest]) ->
+ Rest;
+del_reactivators(RPid,[Element|Rest]) ->
+ [Element|del_reactivators(RPid,Rest)];
+del_reactivators(_,[]) -> % This should not happend.
+ [].
+
+get_node_reactivators(RPid,Reactivators) ->
+ case lists:keysearch(RPid,2,Reactivators) of
+ {value,{Node,_}} ->
+ Node;
+ false -> % This should not happend.
+ false
+ end.
+
+%% Returns a list of list all nodes that are currently reactivating.
+get_all_nodes_reactivators([{Nodes,_Pid}|Rest]) ->
+ [Nodes|get_all_nodes_reactivators(Rest)];
+get_all_nodes_reactivators([]) ->
+ [].
+
+%% Function stopping all running reactivator processes. Returns a new empty
+%% reactivators structure. Note that this function does not set the state of
+%% Nodes. It must most often be set to running.
+stop_all_reactivators([{_Nodes,Pid}|Rest]) ->
+ exit(Pid,kill),
+ stop_all_reactivators(Rest);
+stop_all_reactivators([]) ->
+ []. % Returns an empty reactivators.
+
+%% Help function stopping the reactivator (if any) that reactivates Node.
+%% Returns a new list of reactivators structure.
+stop_node_reactivators(Node,[{Node,Pid}|Rest]) ->
+ exit(Pid,kill),
+ Rest;
+stop_node_reactivators(Node,[NodePid|Rest]) ->
+ [NodePid|stop_node_reactivators(Node,Rest)];
+stop_node_reactivators(_,[]) ->
+ [].
+%% -----------------------------------------------------------------------------
+
+
+%% -----------------------------------------------------------------------------
+%% Started initial trace cases data structure.
+%% -----------------------------------------------------------------------------
+
+%% This datastructure keeps information about ongoing trace cases started
+%% automatically at init_tracing. These must be automatically stopped when calling
+%% stop_tracing.
+
+add_initial_tcs(TCname,Id,StartedInitialTcs) ->
+ [{TCname,Id}|StartedInitialTcs].
+%% -----------------------------------------------------------------------------
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/inviso/src/inviso_tool_sh.erl b/lib/inviso/src/inviso_tool_sh.erl
index fe876b955a..b02f498c5b 100644
--- a/lib/inviso/src/inviso_tool_sh.erl
+++ b/lib/inviso/src/inviso_tool_sh.erl
@@ -1,1731 +1,1749 @@
-%%%------------------------------------------------------------------------------
-%%% File : inviso_tool_sh.erl
-%%% Author : Lennart �hman <[email protected]>
-%%% Description :
-%%%
-%%% Created : 24 Oct 2005 by Lennart �hman
-%%%------------------------------------------------------------------------------
--module(inviso_tool_sh).
-
-%% Inviso Session Handler.
-%% This is the code for the session handler process. Its purpose is that we have
-%% one session handler process for each trace session started through the
-%% start_session inviso tool API. The session handler process is responsible for:
-%%
-%% -Knowing the state/status of all participating runtime components.
-%% -Keeping storage of all tracerdata all our participants have used. This means
-%% also to find out the tracerdata of runtime components connecting by them
-%% selves.
-%%
-%% STORAGE STRATEGY
-%% ----------------
-%% The local information storage can be changed by two things. Either by executing
-%% commands issued through our APIs. Or by receiving trace_event from the control
-%% component. When we execute commands, a corresponding event will also follow.
-%% Meaning that in those situations we are informed twice.
-%% A simple strategy could be to wait for the event even when doing the changes
-%% to the runtime components our self (through commands). But that may result in
-%% a small time frame where someone might do yet another command and failing
-%% because the local information storage is not uptodate as it would have been
-%% expected to be. Therefore we always update the local storage when making changes
-%% to a runtime component our selves. There will eventually be a double update
-%% through an incoming event. But the storage must coop with that, preventing
-%% inconsitancies to happend. An example of a strategy is that the tracerdata table
-%% is a bag, not allowing for double entries of the same kind. Therefore a double
-%% update is harmless there.
-
-%% ------------------------------------------------------------------------------
-%% Module wide constants.
-%% ------------------------------------------------------------------------------
--define(LOCAL_RUNTIME,local_runtime). % Used as node name when non-disitrbuted.
--define(TRACING,tracing). % A state defined by the control component.
--define(RUNNING,running). % A status according to control componet.
-
--define(COPY_LOG_FROM,copy_log_from). % Common fileystem option.
-%% ------------------------------------------------------------------------------
-
-%% ------------------------------------------------------------------------------
-%% API exports.
-%% ------------------------------------------------------------------------------
--export([start_link/5,start_link/8]).
--export([cancel_session/1,stop_session/3]).
--export([reactivate/1,reactivate/2]).
--export([tpl/5,tpl/6,tpl/7,
- tf/2,tf/3,
- tpm_localnames/2,init_tpm/6,init_tpm/9,tpm/6,tpm/7,tpm/10,
- tpm_ms/7,ctpm_ms/6,ctpm/5
- ]).
-%% ------------------------------------------------------------------------------
-
-
-%% ------------------------------------------------------------------------------
-%% Internal exports.
-%% ------------------------------------------------------------------------------
--export([init/1,handle_call/3,handle_info/2,terminate/2]).
-
--export([get_loopdata/1]).
-%% ------------------------------------------------------------------------------
-
-
-%% ------------------------------------------------------------------------------
-%% Includes.
-%% ------------------------------------------------------------------------------
--include_lib("kernel/include/file.hrl"). % Necessary for file module.
-%% ------------------------------------------------------------------------------
-
-
-%% ==============================================================================
-%% Exported API functions.
-%% ==============================================================================
-
-%% start_link(From,NodeParams,CtrlNode,CtrlPid,SafetyCatches,NodesIn,NodesNotIn) =
-%% {ok,Pid} | {error,Reason}
-%% From= pid(), the initial client expecting the reply.
-%% NodeParams=[{Node,TracerData},{Node,TracerData,Opts}...]
-%% CtrlNode=atom() | 'void', the node where the trace control component is.
-%% CtrlPid=pid(), the pid of the trace control component.
-%% SafetyCatches=
-%% Dir=string(), where to place fetched logs and the merged log.
-%% Dbg=debug structure.
-%% NodesIn=[Node,...], list of nodes already in another session.
-%% NodesNotIn=[Node,...], list of nodes not in another session.
-%%
-%% Starts a session-handler. It keeps track of the the state and status of all
-%% participating runtime components. Note that there is a non-distributed case too.
-%% In the non-distributed case there is no things such as CtrlNode.
-start_link(From,TracerData,CtrlPid,SafetyCatches,Dbg) ->
- gen_server:start_link(?MODULE,
- {self(),From,TracerData,CtrlPid,SafetyCatches,Dbg},
- []).
-
-start_link(From,NodeParams,CtrlNode,CtrlPid,SafetyCatches,Dbg,NodesIn,NodesNotIn) ->
- gen_server:start_link(?MODULE,
- {self(),From,NodeParams,CtrlNode,CtrlPid,
- SafetyCatches,Dbg,NodesIn,NodesNotIn},
- []).
-%% ------------------------------------------------------------------------------
-
-%% Stops tracing where it is ongoing. Fetches all logfiles.
-stop_session(SID,Dir,Prefix) ->
- gen_server:call(SID,{stop_session,Dir,Prefix}).
-%% ------------------------------------------------------------------------------
-
-%% stop_session(SID) = ok
-%%
-%% Cancels the session brutaly. All runtime components are made to stop tracing,
-%% all local log files are removed using the tracerdata we know for them.
-cancel_session(SID) ->
- gen_server:call(SID,cancel_session).
-%% ------------------------------------------------------------------------------
-
-%% reactivate(SID) = {ok,
-%% reactivate(SID,Nodes) = {ok,NodeResults} | {error,Reason}.
-%% SID=session id, pid().
-%% Nodes=[Node,...]
-%% NodeResult=[{Node,Result},...]
-%% Result={Good,Bad}
-%% Good,Bad=integer(), the number of redone activities.
-%%
-%% Function which reactivates runtime components being suspended. This is done
-%% replaying all trace flags (in the correct order) to the corresponding nodes.
-%% Note that this may also mean turning flags off. Like first turning them on
-%% then off a split second later.
-reactivate(SID) ->
- gen_server:call(SID,reactivate). %% NOT IMPLEMENTED YET.
-reactivate(SID,Nodes) ->
- gen_server:call(SID,{reactivate,Nodes}).
-%% ------------------------------------------------------------------------------
-
-
-%% tpl(SessionID,Mod,Func,Arity,MS)=
-%% tpl(SessionID,Mod,Func,Arity,MS,Opts)={ok,N}|{error,Reason}.
-%% tpl(SessionID,Nodes,Mod,Func,Arity,MS)=
-%% tpl(SessionID,Nodes,Mod,Func,Arity,MS,Opts)={ok,Result}|{error,Reason}
-%% Mod='_' | ModuleName | ModRegExp | {DirRegExp,ModRegExp}
-%% ModRegExp=DirRegExp= string()
-%% Func='_' | FunctionName
-%% Arity='_' | integer()
-%% MS=[] | false | a match specification
-%% Opts=[Opts,...]
-%% Opt={arg,Arg}, disable_safety, {expand_regexp_at,NodeName}, only_loaded
-%% Nodes=[NodeName,...]
-tpl(SID,Mod,Func,Arity,MS) ->
- gen_server:call(SID,{tp,tpl,Mod,Func,Arity,MS,[]}).
-tpl(SID,Mod,Func,Arity,MS,Opts) when list(MS);MS==true;MS==false ->
- gen_server:call(SID,{tp,tpl,Mod,Func,Arity,MS,Opts});
-tpl(SID,Nodes,Mod,Func,Arity,MS) when integer(Arity);Arity=='_' ->
- gen_server:call(SID,{tp,tpl,Nodes,Mod,Func,Arity,MS,[]}).
-tpl(SID,Nodes,Mod,Func,Arity,MS,Opts) ->
- gen_server:call(SID,{tp,tpl,Nodes,Mod,Func,Arity,MS,Opts}).
-%% ------------------------------------------------------------------------------
-
-%% ctpl(SessionID,Nodes,Mod,Func,Arity)=
-%% See tpl/X for arguments.
-%%
-%% Removes local trace-patterns from functions.
-ctpl(SID,Nodes,Mod,Func,Arity) ->
- gen_server:call(SID,{ctp,ctpl,Nodes,Mod,Func,Arity}).
-%% ------------------------------------------------------------------------------
-
-
-tpm_localnames(SID,Nodes) ->
- gen_server:call(SID,{tpm_localnames,Nodes}).
-tpm_globalnames(SID,Nodes) ->
- gen_server:call(SID,{tpm_globalnames,Nodes}).
-
-init_tpm(SID,Nodes,Mod,Func,Arity,CallFunc) ->
- gen_server:call(SID,{init_tpm,Nodes,Mod,Func,Arity,CallFunc}).
-init_tpm(SID,Nodes,Mod,Func,Arity,InitFunc,CallFunc,ReturnFunc,RemoveFunc) ->
- gen_server:call(SID,
- {init_tpm,Nodes,Mod,Func,Arity,InitFunc,CallFunc,ReturnFunc,RemoveFunc}).
-tpm(SID,Nodes,Mod,Func,Arity,MS) ->
- gen_server:call(SID,{tpm,Nodes,Mod,Func,Arity,MS}).
-tpm(SID,Nodes,Mod,Func,Arity,MS,CallFunc) ->
- gen_server:call(SID,{tpm,Nodes,Mod,Func,Arity,MS,CallFunc}).
-tpm(SID,Nodes,Mod,Func,Arity,MS,InitFunc,CallFunc,ReturnFunc,RemoveFunc) ->
- gen_server:call(SID,{tpm,Nodes,Mod,Func,Arity,MS,InitFunc,CallFunc,ReturnFunc,RemoveFunc}).
-
-tpm_ms(SID,Nodes,Mod,Func,Arity,MSname,MS) ->
- gen_server:call(SID,{tpm_ms,Nodes,Mod,Func,Arity,MSname,MS}).
-
-ctpm_ms(SID,Nodes,Mod,Func,Arity,MSname) ->
- gen_server:call(SID,{tpm_ms,Nodes,Mod,Func,Arity,MSname}).
-
-ctpm(SID,Nodes,Mod,Func,Arity) ->
- gen_server:call(SID,{ctpm,Nodes,Mod,Func,Arity}).
-%% ------------------------------------------------------------------------------
-
-
-%% tf(SessionID,Nodes,TraceConfList)=
-%% TraceConfList=[{PidSpec,Flags},...]
-%% PidSpec=pid()|atom()|all|new|existing
-%% Flags=[Flag,...]
-tf(SID,TraceConfList) ->
- gen_server:call(SID,{tf,TraceConfList}).
-tf(SID,Nodes,TraceConfList) ->
- gen_server:call(SID,{tf,Nodes,TraceConfList}).
-%% ------------------------------------------------------------------------------
-
-
-get_loopdata(SID) ->
- gen_server:call(SID,get_loopdata).
-%% ------------------------------------------------------------------------------
-
-%% ==============================================================================
-%% Genserver call-backs.
-%% ==============================================================================
-
-%% Initial function for the session handler process. The nodes participating in
-%% the session must previously have been added to our control component by the tool.
-%% The session handler first finds out the state/status of the specified runtime
-%% components, then it tries to initiate tracing on those where it is applicable.
-%% Note that a reply to the initial (tool)client is done from here instead from
-%% the tool-server.
-init({Parent,From,TracerData,CtrlPid,SafetyCatches,Dbg}) -> % The non-distributed case.
- {ok,StateStatus}=init_rtcomponent_states([],void,CtrlPid,[?LOCAL_RUNTIME]),
- case is_tool_internal_tracerdata(TracerData) of
- false -> % We shall initiate local runtime.
- case inviso:init_tracing(TracerData) of
- ok ->
- gen_server:reply(From,{ok,{self(),ok}}),
- {ok,mk_ld(Parent,
- void,
- CtrlPid,
- to_rtstates([{?LOCAL_RUNTIME,{tracing,?RUNNING},[]}]),
- [{?LOCAL_RUNTIME,TracerData}],
- [],
- SafetyCatches,
- Dbg)};
- {error,Reason} -> % It might have become suspended?!
- gen_server:reply(From,{error,Reason}),
- {ok,mk_ld(Parent,
- void,
- CtrlPid,
- to_rtstates([{?LOCAL_RUNTIME,StateStatus,[]}]),
- [{?LOCAL_RUNTIME,TracerData}],
- [],
- SafetyCatches,
- Dbg)}
- end;
- true -> % We shall not pass this one on.
- gen_server:reply(From,{ok,{self(),ok}}), % Then it is ok.
- {ok,mk_ld(Parent,
- void,
- CtrlPid,
- to_rtstates([{?LOCAL_RUNTIME,StateStatus,[]}]),
- [],
- [?LOCAL_RUNTIME],
- SafetyCatches,
- Dbg)}
- end;
-init({Parent,From,NodeParams,CtrlNode,CtrlPid,SafetyCatches,Dbg,NodesIn,NodesNotIn}) ->
- case init_rtcomponent_states(NodeParams,CtrlNode,CtrlPid,NodesNotIn) of
- {ok,States} -> % A list of {Node,{State,Status},Opts}.
- {NodeParams2,Nodes2}=remove_nodeparams(NodesIn,NodeParams),
- case inviso_tool_lib:inviso_cmd(CtrlNode,init_tracing,[NodeParams2]) of
- {ok,Result} -> % Resulted in state changes!
- RTStates=set_tracing_rtstates(to_rtstates(States),Result),
- ReplyValue=init_fix_resultnodes(NodesIn,Nodes2,Result),
- gen_server:reply(From,{ok,{self(),ReplyValue}}),
- {ok,mk_ld(Parent,CtrlNode,CtrlPid,RTStates,
- NodeParams2,Nodes2,SafetyCatches,Dbg)};
- {error,Reason} -> % Some general failure.
- inviso_tool_lib:inviso_cmd(CtrlNode,unsubscribe,[]),
- gen_server:reply(From,{error,{init_tracing,Reason}}),
- {stop,{init_tracing,Reason}};
- What ->
- io:format("GOT:~n~w~n",[What]),
- exit(foo)
- end;
- {error,Reason} -> % Unable to get the state/status.
- inviso_tool_lib:inviso_cmd(CtrlNode,unsubscribe,[]),
- gen_server:reply(From,{error,Reason}),
- {stop,{error,Reason}};
- What ->
- io:format("GOT:~n~w~n",[What]),
- exit(foo)
- end.
-%% ------------------------------------------------------------------------------
-
-%% To stop a session means stop the tracing and remove all local files on the
-%% runtime nodes. We do have a table with all tracer data and that is how we are
-%% going to recreate what files to remove.
-%% Since runtime components may actually change state when this procedure is
-%% on-going, we do not care! It is the state in the session handling process at
-%% the time of start of this procedure which is used.
-handle_call(cancel_session,_From,LD) ->
- CtrlNode=get_ctrlnode_ld(LD),
- RTStates=get_rtstates_ld(LD),
- Dbg=get_dbg_ld(LD),
- TracingNodes=get_all_tracing_nodes_rtstates(RTStates),
- case stop_all_tracing(CtrlNode,Dbg,TracingNodes) of
- ok-> % Hopefully all nodes are stopped now.
- AvailableNodes=get_all_available_nodes_rtstates(RTStates),
- TRDstorage=get_trdstorage_ld(LD),
- remove_all_local_logs(CtrlNode,TRDstorage,AvailableNodes,Dbg),
- {stop,normal,ok,LD}; % LD actually not correct now!
- {error,Reason} -> % Some serious error when stop_tracing.
- {stop,normal,{error,Reason},LD}
- end;
-%% ------------------------------------------------------------------------------
-
-%% *Stop all tracing on runtime components still tracing.
-%% *Copy all local log files to the collection directory.
-handle_call({stop_session,Dir,Prefix},_From,LD) ->
- case check_directory_exists(Dir) of % Check that this directory exists here.
- true ->
- RTStates=get_rtstates_ld(LD),
- CtrlNode=get_ctrlnode_ld(LD),
- Dbg=get_dbg_ld(LD),
- TracingNodes=get_all_tracing_nodes_rtstates(RTStates),
- case stop_all_tracing(CtrlNode,Dbg,TracingNodes) of
- ok -> % Hopefully no node is still tracing now.
- TRDstorage=get_trdstorage_ld(LD),
- AvailableNodes=get_all_available_nodes_rtstates(RTStates),
- {FailedNodes,FetchedFiles}=
- transfer_logfiles(RTStates,CtrlNode,Dir,Prefix,
- TRDstorage,Dbg,AvailableNodes),
- RemoveNodes= % We only delete local logs where fetch ok.
- lists:filter(fun(N)->
- case lists:keysearch(N,1,FailedNodes) of
- {value,_} ->
- false;
- false ->
- true
- end
- end,
- AvailableNodes),
- remove_all_local_logs(CtrlNode,TRDstorage,RemoveNodes,Dbg),
- {stop,normal,{ok,{FailedNodes,FetchedFiles}},LD};
- {error,Reason} -> % Some general failure, quit.
- {stop,normal,{error,Reason},LD}
- end;
- false -> % You specified a non-existing directory!
- {reply,{error,{faulty_dir,Dir}},LD}
- end;
-%% ------------------------------------------------------------------------------
-
-handle_call({reactivate,Nodes},_From,LD) ->
- RTStates=get_rtstates_ld(LD),
- {OurNodes,OtherNodes}=
- remove_nodes_not_ours(Nodes,get_all_session_nodes_rtstates(RTStates)),
- CtrlNode=get_ctrlnode_ld(LD),
- ACTstorage=get_actstorage_ld(LD),
- case h_reactivate(CtrlNode,OurNodes,ACTstorage) of
- {ok,Results} -> % A list of {Node,Result}.
- if
- OtherNodes==[] -> % Normal case, no non-session nodes.
- {reply,{ok,Results},LD};
- true -> % Add error values for non-session nodes.
- {reply,
- {ok,
- lists:map(fun(N)->{N,{error,not_in_session}} end,OtherNodes)++
- Results},
- LD}
- end;
- {error,Reason} -> % Then this error takes presidence.
- {reply,{error,Reason},LD}
- end;
-%% ------------------------------------------------------------------------------
-
-%% Call-back for set trace-pattern for both global and local functions.
-handle_call({tp,PatternFunc,Mod,F,A,MS,Opts},_From,LD) ->
- Reply=h_tp(all,PatternFunc,Mod,F,A,MS,Opts,LD), % For all active nodes in the session.
- {reply,Reply,LD};
-handle_call({tp,PatternFunc,Nodes,Mod,F,A,MS,Opts},_From,LD) ->
- RTStates=get_rtstates_ld(LD),
- SNodes=get_all_session_nodes_rtstates(RTStates), % Notes belongoing to the session.
- {Nodes2,FaultyNodes}=remove_nodes_not_ours(Nodes,SNodes),
- Reply=h_tp(Nodes2,PatternFunc,Mod,F,A,MS,Opts,LD),
- ErrorReply=lists:map(fun(N)->{N,{error,not_in_session}} end,FaultyNodes),
- {reply,ErrorReply++Reply,LD};
-%% ------------------------------------------------------------------------------
-
-%% Call-back handling the removal of both local and global trace-patterns.
-%% NOT IMPLEMENTED YET.
-handle_call({ctp,PatternFunc,Nodes,Mod,F,A},_From,LD) ->
- Reply=h_ctp(Nodes,PatternFunc,Mod,F,A,LD),
- {reply,Reply,LD};
-%% ------------------------------------------------------------------------------
-
-handle_call({tpm_localnames,Nodes},_From,LD) ->
- RTStates=get_rtstates_ld(LD),
- OurNodes=get_all_session_nodes_rtstates(RTStates),
- {Nodes2,NotOurNodes}=remove_nodes_not_ours(Nodes,OurNodes),
- ACTstorage=get_actstorage_ld(LD),
- {Reply,NewACTstorage}=
- h_tpm_localnames(get_ctrlnode_ld(LD),Nodes2,RTStates,ACTstorage),
- ErrorReply=lists:map(fun(N)->{N,{error,not_in_session}} end,NotOurNodes),
- {reply,ErrorReply++Reply,put_actstorage_ld(NewACTstorage,LD)};
-
-handle_call({init_tpm,Nodes,Mod,Func,Arity,CallFunc},_From,LD) ->
- RTStates=get_rtstates_ld(LD),
- OurNodes=get_all_session_nodes_rtstates(RTStates),
- {Nodes2,NotOurNodes}=remove_nodes_not_ours(Nodes,OurNodes),
- ACTstorage=get_actstorage_ld(LD),
- {Reply,NewACTstorage}=
- h_all_tpm(get_ctrlnode_ld(LD),
- Nodes2,
- init_tpm,
- [Mod,Func,Arity,CallFunc],
- RTStates,
- ACTstorage),
- ErrorReply=lists:map(fun(N)->{N,{error,not_in_session}} end,NotOurNodes),
- {reply,ErrorReply++Reply,put_actstorage_ld(NewACTstorage,LD)};
-
-handle_call({init_tpm,Nodes,Mod,Func,Arity,InitFunc,CallFunc,ReturnFunc,RemoveFunc},_From,LD) ->
- RTStates=get_rtstates_ld(LD),
- OurNodes=get_all_session_nodes_rtstates(RTStates),
- {Nodes2,NotOurNodes}=remove_nodes_not_ours(Nodes,OurNodes),
- ACTstorage=get_actstorage_ld(LD),
- {Reply,NewACTstorage}=
- h_all_tpm(get_ctrlnode_ld(LD),
- Nodes2,
- init_tpm,
- [Mod,Func,Arity,InitFunc,CallFunc,ReturnFunc,RemoveFunc],
- RTStates,
- ACTstorage),
- ErrorReply=lists:map(fun(N)->{N,{error,not_in_session}} end,NotOurNodes),
- {reply,ErrorReply++Reply,put_actstorage_ld(NewACTstorage,LD)};
-
-handle_call({tpm,Nodes,Mod,Func,Arity,MS},_From,LD) ->
- RTStates=get_rtstates_ld(LD),
- OurNodes=get_all_session_nodes_rtstates(RTStates),
- {Nodes2,NotOurNodes}=remove_nodes_not_ours(Nodes,OurNodes),
- ACTstorage=get_actstorage_ld(LD),
- {Reply,NewACTstorage}=
- h_all_tpm(get_ctrlnode_ld(LD),Nodes2,tpm,[Mod,Func,Arity,MS],RTStates,ACTstorage),
- ErrorReply=lists:map(fun(N)->{N,{error,not_in_session}} end,NotOurNodes),
- {reply,ErrorReply++Reply,put_actstorage_ld(NewACTstorage,LD)};
-
-handle_call({tpm,Nodes,Mod,Func,Arity,MS,CallFunc},_From,LD) ->
- RTStates=get_rtstates_ld(LD),
- OurNodes=get_all_session_nodes_rtstates(RTStates),
- {Nodes2,NotOurNodes}=remove_nodes_not_ours(Nodes,OurNodes),
- ACTstorage=get_actstorage_ld(LD),
- {Reply,NewACTstorage}=
- h_all_tpm(get_ctrlnode_ld(LD),
- Nodes2,
- tpm,
- [Mod,Func,Arity,MS,CallFunc],
- RTStates,
- ACTstorage),
- ErrorReply=lists:map(fun(N)->{N,{error,not_in_session}} end,NotOurNodes),
- {reply,ErrorReply++Reply,put_actstorage_ld(NewACTstorage,LD)};
-
-handle_call({tpm,Nodes,Mod,Func,Arity,MS,InitFunc,CallFunc,ReturnFunc,RemoveFunc},_From,LD) ->
- RTStates=get_rtstates_ld(LD),
- OurNodes=get_all_session_nodes_rtstates(RTStates),
- {Nodes2,NotOurNodes}=remove_nodes_not_ours(Nodes,OurNodes),
- ACTstorage=get_actstorage_ld(LD),
- {Reply,NewACTstorage}=
- h_all_tpm(get_ctrlnode_ld(LD),
- Nodes2,
- tpm,
- [Mod,Func,Arity,MS,InitFunc,CallFunc,ReturnFunc,RemoveFunc],
- RTStates,
- ACTstorage),
- ErrorReply=lists:map(fun(N)->{N,{error,not_in_session}} end,NotOurNodes),
- {reply,ErrorReply++Reply,put_actstorage_ld(NewACTstorage,LD)};
-
-handle_call({tpm_ms,Nodes,Mod,Func,Arity,MSname,MS},_From,LD) ->
- RTStates=get_rtstates_ld(LD),
- OurNodes=get_all_session_nodes_rtstates(RTStates),
- {Nodes2,NotOurNodes}=remove_nodes_not_ours(Nodes,OurNodes),
- ACTstorage=get_actstorage_ld(LD),
- {Reply,NewACTstorage}=
- h_all_tpm(get_ctrlnode_ld(LD),
- Nodes2,
- tpm_ms,
- [Mod,Func,Arity,MSname,MS],
- RTStates,
- ACTstorage),
- ErrorReply=lists:map(fun(N)->{N,{error,not_in_session}} end,NotOurNodes),
- {reply,ErrorReply++Reply,put_actstorage_ld(NewACTstorage,LD)};
-
-handle_call({ctpm_ms,Nodes,Mod,Func,Arity,MSname},_From,LD) ->
- RTStates=get_rtstates_ld(LD),
- OurNodes=get_all_session_nodes_rtstates(RTStates),
- {Nodes2,NotOurNodes}=remove_nodes_not_ours(Nodes,OurNodes),
- ACTstorage=get_actstorage_ld(LD),
- {Reply,NewACTstorage}=
- h_all_tpm(get_ctrlnode_ld(LD),
- Nodes2,
- ctpm_ms,
- [Mod,Func,Arity,MSname],
- RTStates,
- ACTstorage),
- ErrorReply=lists:map(fun(N)->{N,{error,not_in_session}} end,NotOurNodes),
- {reply,ErrorReply++Reply,put_actstorage_ld(NewACTstorage,LD)};
-
-handle_call({ctpm,Nodes,Mod,Func,Arity},_From,LD) ->
- RTStates=get_rtstates_ld(LD),
- OurNodes=get_all_session_nodes_rtstates(RTStates),
- {Nodes2,NotOurNodes}=remove_nodes_not_ours(Nodes,OurNodes),
- ACTstorage=get_actstorage_ld(LD),
- {Reply,NewACTstorage}=
- h_all_tpm(get_ctrlnode_ld(LD),Nodes2,ctpm,[Mod,Func,Arity],RTStates,ACTstorage),
- ErrorReply=lists:map(fun(N)->{N,{error,not_in_session}} end,NotOurNodes),
- {reply,ErrorReply++Reply,put_actstorage_ld(NewACTstorage,LD)};
-%% ------------------------------------------------------------------------------
-
-%% Call-back for setting process trace-flags. Handles both distributed and non-
-%% distributed case.
-handle_call({tf,TraceConfList},From,LD) ->
- handle_call({tf,all,TraceConfList},From,LD);
-handle_call({tf,Nodes,TraceConfList},_From,LD) ->
- {Reply,NewACTstorage}=h_tf(get_ctrlnode_ld(LD),
- Nodes,
- TraceConfList,
- get_actstorage_ld(LD),
- get_rtstates_ld(LD)),
- {reply,Reply,put_actstorage_ld(NewACTstorage,LD)};
-%% ------------------------------------------------------------------------------
-
-
-
-handle_call(get_loopdata,_From,LD) ->
- io:format("The loopdata:~n~p~n",[LD]),
- {reply,ok,LD}.
-%% ------------------------------------------------------------------------------
-
-
-%% Clause handling an incomming state-change event from the control component.
-%% Note that it does not have to be one of our nodes since it is not possible
-%% to subscribe to certain node-events.
-%% We may very well get state-change events for state-changes we are the source
-%% to our selves. Those state-changes are already incorporated into the RTStates.
-%% There is however no harm in doing them again since we know that this event
-%% message will reach us before a reply to a potentially following state-change
-%% request will reach us. Hence we will do all state-changes in the correct order,
-%% even if sometimes done twice.
-handle_info({trace_event,CtrlPid,_Time,{state_change,Node,{State,Status}}},LD) ->
- case get_ctrlpid_ld(LD) of
- CtrlPid -> % It is from our control component.
- case {State,Status} of
- {?TRACING,?RUNNING} -> % This is the only case when new tracerdata!
- NewTracerData=add_current_tracerdata_ld(get_ctrlnode_ld(LD),
- Node,
- get_rtstates_ld(LD),
- get_trdstorage_ld(LD)),
- NewRTStates=statechange_rtstates(Node,State,Status,get_rtstates_ld(LD)),
- {noreply,put_trdstorage_ld(NewTracerData,
- put_rtstates_ld(NewRTStates,LD))};
- _ -> % In all other cases, just fix rtstates.
- NewRTStates=statechange_rtstates(Node,State,Status,get_rtstates_ld(LD)),
- {noreply,put_rtstates_ld(NewRTStates,LD)}
- end;
- _ ->
- {noreply,LD}
- end;
-%% If a new runtime component connects to our trace control component, and it is
-%% in our list of runtime components belonging to this session, we may update its
-%% state to now being present. Otherwise it does not belong to this session.
-%% Note that we avoid updating an already connected runtime component. This
-%% can happend if it connected by itself after we started the session handler,
-%% but before we managed to initiate tracing. Doing so or not will not result in
-%% any error in the long run, but during a short period of time we might be
-%% prevented from doing things with the runtime though it actually is tracing.
-handle_info({trace_event,CtrlPid,_Time,{connected,Node,{_Tag,{State,Status}}}},LD) ->
- case get_ctrlpid_ld(LD) of
- CtrlPid -> % It is from our control component.
- case get_statestatus_rtstates(Node,get_rtstates_ld(LD)) of
- {ok,unavailable} -> % This is the situation when we update!
- NewRTStates=statechange_rtstates(Node,State,Status,get_rtstates_ld(LD)),
- {noreply,put_rtstates_ld(NewRTStates,LD)};
- _ -> % In all other cases, let it be.
- {noreply,LD}
- end;
- _ -> % Not from our control component.
- {noreply,LD}
- end;
-%% If a runtime component disconnects we mark it as unavailable. We must also
-%% remove all saved trace-flags in order for them to not be accidently reactivated
-%% should the runtime component reconnect and then suspend.
-handle_info({trace_event,CtrlPid,_Time,{disconnected,Node,_}},LD) ->
- case get_ctrlpid_ld(LD) of
- CtrlPid -> % It is from our control component.
- NewRTStates=set_unavailable_rtstates(Node,get_rtstates_ld(LD)),
- NewACTstorage=del_node_actstorage(Node,get_actstorage_ld(LD)),
- {noreply,put_actstorage_ld(NewACTstorage,put_rtstates_ld(NewRTStates,LD))};
- _ ->
- {noreply,LD}
- end;
-handle_info(_,LD) ->
- {noreply,LD}.
-%% ------------------------------------------------------------------------------
-
-%% In terminate we cancel our subscription to event from the trace control component.
-%% That should actually not be necessary, but lets do it the correct way!
-terminate(_,LD) ->
- case get_ctrlnode_ld(LD) of
- void -> % Non-distributed.
- inviso:unsubscribe();
- Node ->
- inviso_tool_lib:inviso_cmd(Node,unsubscribe,[])
- end.
-%% ------------------------------------------------------------------------------
-
-
-
-%% ==============================================================================
-%% First level help functions to call-backs.
-%% ==============================================================================
-
-%% ------------------------------------------------------------------------------
-%% Help functions to init.
-%% ------------------------------------------------------------------------------
-
-%% Help function which find out the state/status of the runtime components.
-%% Note that since we have just started subscribe to state changes we must
-%% check our inqueue to see that we have no waiting messages for the nodes
-%% we learned the state/status of. If there is a waiting message we don't
-%% know whether that was a state change received before or after the state
-%% check was done. We will then redo the state-check.
-%% Returns {ok,States} or {error,Reason}.
-%% Where States is [{Node,{State,Status},Opts},...].
-%% Note that {error,Reason} can not occur in the non-distributed case.
-init_rtcomponent_states(NodeParams,void,CtrlPid,Nodes) -> % The non-distributed case.
- ok=inviso:subscribe(),
- init_rtcomponent_states_2(NodeParams,void,CtrlPid,Nodes,[]);
-init_rtcomponent_states(NodeParams,CtrlNode,CtrlPid,Nodes) ->
- ok=inviso_tool_lib:inviso_cmd(CtrlNode,subscribe,[]),
- init_rtcomponent_states_2(NodeParams,CtrlNode,CtrlPid,Nodes,[]).
-
-init_rtcomponent_states_2(_,_,_,[],States) ->
- {ok,States};
-init_rtcomponent_states_2(NodeParams,void,CtrlPid,_Nodes,States) ->
- case inviso:get_status() of
- {ok,StateStatus} -> % Got its state/status, now...
- {ProblemNodes,NewStates}=
- init_rtcomponent_states_3(NodeParams,CtrlPid,[{?LOCAL_RUNTIME,{ok,StateStatus}}],
- [],States),
- init_rtcomponent_states_2(NodeParams,void,CtrlPid,ProblemNodes,NewStates);
- {error,_Reason} -> % The runtime is not available!?
- {ok,[{?LOCAL_RUNTIME,unavailable,[]}]} % Create the return value immediately.
- end;
-init_rtcomponent_states_2(NodeParams,CtrlNode,CtrlPid,Nodes,States) ->
- case inviso_tool_lib:inviso_cmd(CtrlNode,get_status,[Nodes]) of
- {ok,NodeResult} ->
- {ProblemNodes,NewStates}=
- init_rtcomponent_states_3(NodeParams,CtrlPid,NodeResult,[],States),
- init_rtcomponent_states_2(NodeParams,CtrlNode,CtrlPid,ProblemNodes,NewStates);
- {error,Reason} -> % Severe problem, abort the session.
- {error,{get_status,Reason}}
- end.
-
-%% Traverses the list of returnvalues and checks that we do not have an event
-%% waiting in the message queue. If we do have, it is a problem. That node will
-%% be asked about its state again.
-%% Note that it is here we construct the RTStatesList.
-init_rtcomponent_states_3(NodeParams,CtrlPid,[{Node,{ok,{State,Status}}}|Rest],Problems,States) ->
- receive
- {trace_event,CtrlPid,_Time,{state_change,Node,_}} ->
- init_rtcomponent_states_3(NodeParams,CtrlPid,Rest,[Node|Problems],States)
- after
- 0 -> % Not in msg queue, then we're safe!
- RTState=case lists:keysearch(Node,1,NodeParams) of
- {value,{_Node,_TracerData,Opts}} ->
- {Node,{State,Status},Opts};
- _ -> % No option available, use [].
- {Node,{State,Status},[]}
- end,
- init_rtcomponent_states_3(NodeParams,CtrlPid,Rest,Problems,[RTState|States])
- end;
-init_rtcomponent_states_3(NodeParams,CtrlPid,[{Node,{error,_Reason}}|Rest],Problems,States) ->
- RTState=case lists:keysearch(Node,1,NodeParams) of
- {value,{_Node,_TracerData,Opts}} ->
- {Node,unavailable,Opts};
- _ -> % No option available, use [].
- {Node,unavailable,[]}
- end,
- init_rtcomponent_states_3(NodeParams,CtrlPid,Rest,Problems,[RTState|States]);
-init_rtcomponent_states_3(_,_,[],Problems,States) ->
- {Problems,States}.
-%% ------------------------------------------------------------------------------
-
-%% Help function removing nodes from NodeParams. The reason for this can either
-%% be that we are using a tool internal tracerdata that shall not be forwarded to
-%% the trace control component, or that the node is actually already part of
-%% another session.
-%% Returns {NewNodeParams,NodesWhichShallNotBeInitiated}.
-remove_nodeparams(Nodes,NodesParams) ->
- remove_nodeparams_2(Nodes,NodesParams,[],[]).
-
-remove_nodeparams_2(Nodes,[NodeParam|Rest],NPAcc,NAcc) when % NPAcc=NodeParamsAcc.
- (is_tuple(NodeParam) and ((size(NodeParam)==2) or (size(NodeParam)==3))) ->
- Node=element(1,NodeParam),
- Params=element(2,NodeParam), % This is tracerdata!
- case lists:member(Node,Nodes) of
- true -> % Remove this one, in another session.
- remove_nodeparams_2(Nodes,Rest,NPAcc,NAcc);
- false -> % Ok so far...
- case is_tool_internal_tracerdata(Params) of
- false -> % Then keep it and use it later!
- remove_nodeparams_2(Nodes,Rest,[{Node,Params}|NPAcc],NAcc);
- true -> % Since it is, remove it from the list.
- remove_nodeparams_2(Nodes,Rest,NPAcc,[Node|NAcc])
- end
- end;
-remove_nodeparams_2(Nodes,[_|Rest],NPAcc,NAcc) -> % Faulty NodeParam, skip it!
- remove_nodeparams_2(Nodes,Rest,NPAcc,NAcc);
-remove_nodeparams_2(_,[],NPAcc,NAcc) ->
- {lists:reverse(NPAcc),NAcc}.
-%% ------------------------------------------------------------------------------
-
-%% Help function which adds both the nodes which were already part of another
-%% session and the nodes that we actually did not issue any init_tracing for.
-%% Returns a new Result list of [{Node,NodeResult},...].
-init_fix_resultnodes(NodesOtherSes,NodesNotInit,Result) ->
- NewResult=init_fix_resultnodes_2(NodesOtherSes,{error,in_other_session},Result),
- init_fix_resultnodes_2(NodesNotInit,ok,NewResult).
-
-init_fix_resultnodes_2([Node|Rest],NodeResult,Result) ->
- [{Node,NodeResult}|init_fix_resultnodes_2(Rest,NodeResult,Result)];
-init_fix_resultnodes_2([],_,Result) ->
- Result. % Append Result to the end of the list.
-%% ------------------------------------------------------------------------------
-
-
-%% ------------------------------------------------------------------------------
-%% Help functions to reactivate.
-%% ------------------------------------------------------------------------------
-
-h_reactivate(CtrlNode,Nodes,ACTstorage) -> % Distributed case.
- case inviso_tool_lib:inviso_cmd(CtrlNode,cancel_suspension,[Nodes]) of
- {ok,CSuspResults} ->
- {GoodNodes,BadResults}= % Sort out nodes no longer suspended.
- lists:foldl(fun({Node,ok},{GoodNs,BadNs})->
- {[Node|GoodNs],BadNs};
- ({Node,{error,Reason}},{GoodNs,BadNs})->
- {GoodNs,[{Node,{error,{cancel_suspension,Reason}}}|BadNs]}
- end,
- {[],[]},
- CSuspResults),
- Results=h_reactivate_redo_activity(CtrlNode,GoodNodes,ACTstorage,[]),
- {ok,BadResults++Results};
- {error,Reason} -> % General failure cancelling suspend.
- {error,{cancel_suspension,Reason}}
- end.
-%% ------------------------------------------------------------------------------
-
-%% Help function which traverses the list of nodes known to be ours and have
-%% cancelled their suspend. If we fail redoing one of the activities associated
-%% with a node, the node will be reported in the return value as failed. From
-%% that point on its state must be considered unknown since we do not know how
-%% many of the activities were successfully redone.
-h_reactivate_redo_activity(CtrlNode,[Node|Rest],ACTstorage,Acc) ->
- case get_activities_actstorage(Node,ACTstorage) of
- {ok,Activities} -> % The node existed in activity storage.
- {Good,Bad}=h_reactivate_redo_activity_2(CtrlNode,Node,Activities,0,0),
- h_reactivate_redo_activity(CtrlNode,Rest,ACTstorage,[{Node,{Good,Bad}}|Acc]);
- false -> % Node not present in activity storage.
- h_reactivate_redo_activity(CtrlNode,Rest,ACTstorage,[{Node,{0,0}}|Acc])
- end;
-h_reactivate_redo_activity(_CtrlNode,[],_,Acc) ->
- lists:reverse(Acc).
-
-%% Help function actually redoing the activity. Note that there must be one
-%% clause here for every type of activity.
-%% Returns {NrGoodCmds,NrBadCmds}.
-%% The number of good or bad commands refers to inviso commands done. If any
-%% of the subparts of such a command returned an error, the command is concidered
-%% no good.
-h_reactivate_redo_activity_2(CtrlNode,Node,[{tf,{Op,TraceConfList}}|Rest],Good,Bad) ->
- case inviso_tool_lib:inviso_cmd(CtrlNode,Op,[[Node],TraceConfList]) of
- {ok,[{_Node,{ok,Answers}}]} ->
- case h_reactivate_redo_activity_check_tf(Answers) of
- ok ->
- h_reactivate_redo_activity_2(CtrlNode,Node,Rest,Good+1,Bad);
- error -> % At least oneReports the first encountered error.
- h_reactivate_redo_activity_2(CtrlNode,Node,Rest,Good,Bad+1)
- end;
- {ok,[{_Node,{error,_Reason}}]} ->
- h_reactivate_redo_activity_2(CtrlNode,Node,Rest,Good,Bad+1);
- {error,_Reason} -> % General error when doing cmd.
- h_reactivate_redo_activity_2(CtrlNode,Node,Rest,Good,Bad+1)
- end;
-h_reactivate_redo_activity_2(CtrlNode,Node,[{tpm,{Op,InvisoCmdParams}}|Rest],Good,Bad) ->
- case inviso_tool_lib:inviso_cmd(CtrlNode,Op,[[Node]|InvisoCmdParams]) of
- {ok,[{_Node,ok}]} ->
- h_reactivate_redo_activity_2(CtrlNode,Node,Rest,Good+1,Bad);
- {ok,[{_Node,{error,_Reason}}]} ->
- h_reactivate_redo_activity_2(CtrlNode,Node,Rest,Good,Bad+1);
- {error,_Reason} -> % General error when doing cmd.
- h_reactivate_redo_activity_2(CtrlNode,Node,Rest,Good,Bad+1)
- end;
-h_reactivate_redo_activity_2(_CtrlNode,_Node,[],Good,Bad) ->
- {Good,Bad}.
-
-%% Help function traversing a list of results from inviso:tf/2 or inviso:ctf/2
-%% to see if there were any errors.
-h_reactivate_redo_activity_check_tf([N|Rest]) when integer(N) ->
- h_reactivate_redo_activity_check_tf(Rest);
-h_reactivate_redo_activity_check_tf([{error,_Reason}|_]) ->
- error;
-h_reactivate_redo_activity_check_tf([]) ->
- ok.
-%% ------------------------------------------------------------------------------
-
-
-%% ------------------------------------------------------------------------------
-%% Help functions to tp (setting trace patterns, both local and global).
-%% ------------------------------------------------------------------------------
-
-%% Help function which handles both tpl and tp. Note that the non-distributed case
-%% handled with Nodes='all'.
-%% Returns what shall be the reply to the client.
-h_tp(all,PatternFunc,Mod,F,A,MS,Opts,LD) -> % All available runtime nodes.
- Nodes=get_all_available_nodes_rtstates(get_rtstates_ld(LD)),
- h_tp(Nodes,PatternFunc,Mod,F,A,MS,Opts,LD);
-h_tp(Nodes,PatternFunc,Mod,F,A,MS,Opts,LD) -> % Only certain nodes in the session.
- CtrlNode=get_ctrlnode_ld(LD),
- Dbg=get_dbg_ld(LD),
- SafetyCatches=get_safetycatches_ld(LD),
- case inviso_tool_lib:expand_module_names(Nodes,Mod,Opts) of % Take care of any reg-exps.
- {multinode_expansion,NodeMods} ->
- NodeTPs=inviso_tool_lib:make_patterns(SafetyCatches,Opts,Dbg,NodeMods,F,A,MS),
- h_tp_node_by_node(CtrlNode,PatternFunc,Dbg,NodeTPs,[]);
- {singlenode_expansion,Modules} ->
- TPs=inviso_tool_lib:make_patterns(SafetyCatches,Opts,Dbg,Modules,F,A,MS),
- h_tp_do_tps(CtrlNode,Nodes,TPs,PatternFunc,Dbg);
- module ->
- TPs=inviso_tool_lib:make_patterns(SafetyCatches,Opts,Dbg,[Mod],F,A,MS),
- h_tp_do_tps(CtrlNode,Nodes,TPs,PatternFunc,Dbg);
- wildcard -> % Means do for all modules, no safety.
- h_tp_do_tps(CtrlNode,Nodes,[{Mod,F,A,MS}],PatternFunc,Dbg);
- {error,Reason} ->
- {error,Reason}
- end.
-
-%% Note that this function can never be called in the non-distributed case.
-h_tp_node_by_node(CtrlNode,PatternFunc,Dbg,[{Node,TPs}|Rest],Accum) ->
- case h_tp_do_tps(CtrlNode,[Node],TPs,PatternFunc,Dbg) of
- {ok,[{Node,Result}]} ->
- h_tp_node_by_node(CtrlNode,PatternFunc,Dbg,Rest,[{Node,Result}|Accum]);
- {error,Reason} -> % Failure, but don't stop.
- h_tp_node_by_node(CtrlNode,PatternFunc,Dbg,Rest,[{Node,{error,Reason}}|Accum])
- end;
-h_tp_node_by_node(_,_,_,[],Accum) ->
- {ok,lists:reverse(Accum)}.
-
-%% Help function which does the actual call to the trace control component.
-%% Note that Nodes can be a list of nodes (including a single one) or
-%% ?LOCAL_RUNTIME if we are not distributed. The non-distributed case is otherwise
-%% detected by the 'void' CtrlNode.
-%% Returns {ok,[{Node,{ok,{NrOfFunctions,NrOfErrors}}},{Node,{error,Reason}},...]} or
-%% {error,Reason}. In the non-distributed case {ok,{NrOfFunctions,NrOfErros}} or
-%% {error,Reason}.
-h_tp_do_tps(void,_Nodes,TPs,PatternFunc,Dbg) -> % Non distributed case!
- inviso_tool_lib:debug(tp,Dbg,[TPs,PatternFunc]),
- case inviso:PatternFunc(TPs) of
- {ok,Result} -> % A list of [Nr1,Nr2,error,...].
- {ok,
- lists:foldl(fun(N,{AccNr,AccErr}) when integer(N) ->
- {AccNr+N,AccErr};
- (error,{AccNr,AccErr}) ->
- {AccNr,AccErr+1}
- end,
- {0,0},
- Result)};
- {error,Reason} ->
- {error,{PatternFunc,Reason}}
- end;
-h_tp_do_tps(CtrlNode,Nodes,TPs,PatternFunc,Dbg) ->
- inviso_tool_lib:debug(tp,Dbg,[Nodes,TPs,PatternFunc]),
- case inviso_tool_lib:inviso_cmd(CtrlNode,PatternFunc,[Nodes,TPs]) of
- {ok,Result} -> % Result is [{Node,Result},...].
- {ok,
- lists:map(fun({Node,{ok,Res}})->
- {Node,lists:foldl(fun(N,{ok,{AccNr,AccErr}}) when integer(N) ->
- {ok,{AccNr+N,AccErr}};
- (error,{AccNr,AccErr}) ->
- {ok,{AccNr,AccErr+1}}
- end,
- {ok,{0,0}},
- Res)};
- ({_Node,{error,Reason}})->
- {error,Reason}
- end,
- Result)};
- {error,Reason} ->
- {error,{PatternFunc,Reason}}
- end.
-%% ------------------------------------------------------------------------------
-
-%% ------------------------------------------------------------------------------
-%% Help functions for removing trace-patterns.
-%% ------------------------------------------------------------------------------
-
-%% NOT IMPLEMENTED YET.
-h_ctp(Node,PatternFunc,Mod,F,A,LD) ->
- tbd.
-%% ------------------------------------------------------------------------------
-
-
-%% ------------------------------------------------------------------------------
-%% Help functions for calling the trace information facility.
-%% ------------------------------------------------------------------------------
-
-
-%% Function handling the meta trace pattern for capturing registration of local
-%% process names.
-h_tpm_localnames(CtrlNode,Nodes,RTStates,ACTstorage) ->
- AvailableNodes=get_all_available_nodes_rtstates(RTStates),
- {Nodes3,FaultyNodes}=remove_nodes_not_ours(Nodes,AvailableNodes),
- case inviso_tool_lib:inviso_cmd(CtrlNode,tpm_localnames,[Nodes3]) of
- {ok,Result} -> % That good we want to modify tpmstorage!
- NewACTstorage=add_tpm_actstorage(Result,tpm_localnames,[],ACTstorage),
- ErrorResult=lists:map(fun(N)->{N,{error,not_available}} end,FaultyNodes),
- {{ok,ErrorResult++Result},NewACTstorage};
- {error,Reason} -> % If general failure, do not modify storage.
- {{error,Reason},ACTstorage}
- end.
-%% ------------------------------------------------------------------------------
-
-%% Functions calling meta trace functions for specified nodes. This function is
-%% intended for use with all tmp function calls, init_tpm,tpm,tpm_ms,ctpm_ms and
-%% ctpm.
-%% Note that we must store called meta trace functions and their parameters in the
-%% activity storage in order to be able to redo them in case of a reactivate.
-h_all_tpm(CtrlNode,Nodes,TpmCmd,InvisoCmdParams,RTStates,ACTstorage) ->
- AvailableNodes=get_all_available_nodes_rtstates(RTStates),
- {Nodes3,FaultyNodes}=remove_nodes_not_ours(Nodes,AvailableNodes),
- case inviso_tool_lib:inviso_cmd(CtrlNode,TpmCmd,[Nodes3|InvisoCmdParams]) of
- {ok,Result} -> % That good we want to modify tpmstorage!
- NewACTstorage=add_tpm_actstorage(Result,TpmCmd,InvisoCmdParams,ACTstorage),
- ErrorResult=lists:map(fun(N)->{N,{error,not_available}} end,FaultyNodes),
- {{ok,ErrorResult++Result},NewACTstorage};
- {error,Reason} -> % If general failure, do not modify storage.
- {{error,Reason},ACTstorage}
- end.
-%% ------------------------------------------------------------------------------
-
-
-%% ------------------------------------------------------------------------------
-%% Help functions for set trace flags.
-%% ------------------------------------------------------------------------------
-
-%% Help function which sets the tracepatterns in TraceConfList for all nodes
-%% mentioned in Nodes. Note that non-distributed case is handled with Nodes='all'.
-%% Returns {Reply,NewACTstorage} where Reply is whatever shall be returned to caller
-%% and NewACTstorage is traceflag storage modified with the flags added to the
-%% corresponding nodes.
-h_tf(void,_Nodes,TraceConfList,ACTstorage,_RTStates) -> % The non-distributed case.
- Reply=inviso:tf(TraceConfList),
- NewACTstorage=add_tf_actstorage([{?LOCAL_RUNTIME,Reply}],tf,TraceConfList,ACTstorage),
- {Reply,NewACTstorage};
-h_tf(CtrlNode,all,TraceConfList,ACTstorage,RTStates) ->
- AllNodes=get_all_session_nodes_rtstates(RTStates),
- h_tf(CtrlNode,AllNodes,TraceConfList,ACTstorage,RTStates);
-h_tf(CtrlNode,Nodes,TraceConfList,ACTstorage,_RTStates) ->
- case inviso_tool_lib:inviso_cmd(CtrlNode,tf,[Nodes,TraceConfList]) of
- {ok,Result} -> % That good we want to modify actstorage!
- NewACTstorage=add_tf_actstorage(Result,tf,TraceConfList,ACTstorage),
- {{ok,Result},NewACTstorage};
- {error,Reason} -> % If general failure, do not modify actstorage.
- {{error,Reason},ACTstorage}
- end.
-%% ------------------------------------------------------------------------------
-
-%% ------------------------------------------------------------------------------
-%% Help functions to stop_session.
-%% ------------------------------------------------------------------------------
-
-%% This function fetches all local log-files using our stored tracerdata. Note
-%% that there are two major ways of tranfering logfiles. Either via distributed
-%% Erlang or by common filesystem (like NFS). The default is distributed Erlang.
-%% But there may be info in the RTStates structure about a common file-system.
-%% Returns {FailedNodes,FetchedFileNames} where FailedNodes is a list of
-%% nodenames where problems occurred. Note that problems does not necessarily
-%% mean that no files were copied.
-%% FetchedFileNames contains one or two of the tuples {trace_log,Files} and/or
-%% {ti_log,Files}, listing all files successfully fetched. Note that the
-%% list of fetched files contains sublists of filenames. One for each node and
-%% tracerdata.
-%% In the non-distributed system we always use copy (since the files always
-%% resides locally).
-transfer_logfiles(RTStates,CtrlNode,Dir,Prefix,TRDstorage,Dbg,AvailableNodes) ->
- if
- CtrlNode==void -> % When non-distributed, always copy!
- fetch_logfiles_copy(CtrlNode,Dir,Prefix,TRDstorage,Dbg,[?LOCAL_RUNTIME]);
- true -> % The distributed case.
- {FetchNodes,CopyNodes}=find_logfile_transfer_methods(AvailableNodes,RTStates),
- {FailedFetchNodes,FetchedFiles}=
- case fetch_logfiles_distributed(CtrlNode,Dir,Prefix,TRDstorage,Dbg,FetchNodes) of
- {ok,Failed,Files} -> % So far no disasters.
- {Failed,Files};
- {error,Reason} -> % Means all fetch-nodes failed!
- inviso_tool_lib:debug(transfer_logfiles,Dbg,[FetchNodes,Reason]),
- {lists:map(fun(N)->{N,error} end,FetchNodes),[]}
- end,
- {FailedCopyNodes,CopiedFiles}=
- fetch_logfiles_copy(CtrlNode,Dir,Prefix,TRDstorage,Dbg,CopyNodes),
- {FailedFetchNodes++FailedCopyNodes,FetchedFiles++CopiedFiles}
- end.
-
-%% Help function which finds out which node we have a common file system with
-%% and from which we must make distributed erlang tranfere.
-%% Returns {DistributedNodes,CopyNodes} where CopyNode is [{Node,CopyFromDir},...].
-find_logfile_transfer_methods(Nodes,RTStates) ->
- find_logfile_transfer_methods_2(Nodes,RTStates,[],[]).
-
-find_logfile_transfer_methods_2([Node|Rest],RTStates,FetchAcc,CopyAcc) ->
- {ok,Opts}=get_opts_rtstates(Node,RTStates), % Node must be in RTStates!
- case lists:keysearch(?COPY_LOG_FROM,1,Opts) of
- {value,{_,FromDir}} when list(FromDir) -> % Node has common filesystem.
- find_logfile_transfer_methods_2(Rest,RTStates,FetchAcc,[{Node,FromDir}|CopyAcc]);
- {value,_} -> % Can't understand dir option.
- find_logfile_transfer_methods_2(Rest,RTStates,[Node|FetchAcc],CopyAcc);
- false -> % Then we want to use fetch instead.
- find_logfile_transfer_methods_2(Rest,RTStates,[Node|FetchAcc],CopyAcc)
- end;
-find_logfile_transfer_methods_2([],_,FetchAcc,CopyAcc) ->
- {FetchAcc,CopyAcc}.
-%% ------------------------------------------------------------------------------
-
-%% Help function which transferes all local logfiles according to the tracerdata
-%% stored for the nodes in Nodes.
-%% Returns {ok,FailedNodes,FileNodeSpecs} or {error,Reason}.
-%% FailedNodes is a list of nodes where fetching logs did not succeed, partially
-%% or not at all.
-%% FileNames is a list of list of actually fetched files (the name as it is here, including
-%% Dir). The sublists are files which belong together.
-fetch_logfiles_distributed(CtrlNode,Dir,Prefix,TRDstorage,Dbg,Nodes) ->
- LogSpecList=build_logspeclist(Nodes,TRDstorage),
- case inviso_fetch_log(inviso_tool_lib:inviso_cmd(CtrlNode,
- fetch_log,
- [LogSpecList,Dir,Prefix])) of
- {ok,Result} ->
- Files=get_all_filenames_fetchlog_result(Result,Dbg),
- FailedNodes=get_all_failednodes_fetchlog_result(Result),
- {ok,FailedNodes,Files};
- {error,Reason} -> % Some general failure!
- {error,{fetch_log,Reason}}
- end.
-
-%% Help function which constructs a list {Node,TracerData} for all nodes in Nodes.
-%% Note that there may be more than one tracerdata for a node, resulting in multiple
-%% tuples for that node.
-build_logspeclist(Nodes,TRDstorage) ->
- build_logspeclist_2(Nodes,TRDstorage,[]).
-
-build_logspeclist_2([Node|Rest],TRDstorage,Acc) ->
- TRDlist=find_tracerdata_for_node_trd(Node,TRDstorage), % A list of all tracerdata.
- build_logspeclist_2(Rest,
- TRDstorage,
- [lists:map(fun(TRD)->{Node,TRD} end,TRDlist)|Acc]);
-build_logspeclist_2([],_,Acc) ->
- lists:flatten(Acc).
-
-%% Help function which translates inviso:fetch_log return values to what I
-%% want!
-inviso_fetch_log({error,Reason}) ->
- {error,Reason};
-inviso_fetch_log({_Success,ResultList}) ->
- {ok,ResultList}.
-
-%% Help function which collects all filenames mentioned in a noderesult structure.
-%% The files may or may not be complete.
-%% Returns a list of list of filenames. Each sublist contains files which belong
-%% together, i.e because they are a wrap-set.
-get_all_filenames_fetchlog_result(NodeResult,Dbg) ->
- get_all_filenames_fetchlog_result_2(NodeResult,Dbg,[]).
-
-get_all_filenames_fetchlog_result_2([{Node,{Success,FileInfo}}|Rest],Dbg,Accum)
- when Success=/=error, list(FileInfo) ->
- SubAccum=get_all_filenames_fetchlog_result_3(FileInfo,[]),
- get_all_filenames_fetchlog_result_2(Rest,Dbg,[{Node,SubAccum}|Accum]);
-get_all_filenames_fetchlog_result_2([{Node,{error,FReason}}|Rest],Dbg,Accum) ->
- inviso_tool_lib:debug(fetch_files,Dbg,[Node,FReason]),
- get_all_filenames_fetchlog_result_2(Rest,Dbg,Accum);
-get_all_filenames_fetchlog_result_2([],_Dbg,Accum) ->
- Accum.
-
-get_all_filenames_fetchlog_result_3([{FType,Files}|Rest],SubAccum) ->
- FilesOnly=lists:foldl(fun({ok,FName},Acc)->[FName|Acc];(_,Acc)->Acc end,[],Files),
- get_all_filenames_fetchlog_result_3(Rest,[{FType,FilesOnly}|SubAccum]);
-get_all_filenames_fetchlog_result_3([],SubAccum) ->
- SubAccum.
-
-%% Help function which traverses a noderesult and builds a list as return
-%% value containing the nodenames of all nodes not being complete.
-%% Note that a node may occur multiple times since may have fetched logfiles
-%% for several tracerdata from the same node. Makes sure the list contains
-%% unique node names.
-%% Returns a list nodes.
-get_all_failednodes_fetchlog_result(NodeResult) ->
- get_all_failednodes_fetchlog_result_2(NodeResult,[]).
-
-get_all_failednodes_fetchlog_result_2([{_Node,{complete,_}}|Rest],Acc) ->
- get_all_failednodes_fetchlog_result_2(Rest,Acc);
-get_all_failednodes_fetchlog_result_2([{Node,{_Severity,_}}|Rest],Acc) ->
- case lists:member(Node,Acc) of
- true -> % Already in the list.
- get_all_failednodes_fetchlog_result_2(Rest,Acc);
- false -> % Not in Acc, add it!
- get_all_failednodes_fetchlog_result_2(Rest,[Node|Acc])
- end;
-get_all_failednodes_fetchlog_result_2([],Acc) ->
- Acc.
-%% ------------------------------------------------------------------------------
-
-%% Help function which copies files from one location to Dir and at the same time
-%% adds the Prefix to the filename. NodeSpecs contains full path to the files. The
-%% reason the node information is still part of NodeSpecs is that otherwise we can
-%% not report faulty nodes. Note that one node may occur multiple times since there
-%% may be more than one tracerdata for a node.
-%% Returns {FailedNodes,Files} where FailedNodes is a list of nodes where problems
-%% occurred. Files is a tuple list of [{Node,[{FType,FileNames},...]},...].
-fetch_logfiles_copy(CtrlNode,Dir,Prefix,TRDstorage,Dbg,NodeSpecs) ->
- CopySpecList=build_copylist(CtrlNode,Dbg,NodeSpecs,TRDstorage),
- fetch_logfiles_copy_2(Dir,Prefix,Dbg,CopySpecList,[],[]).
-
-fetch_logfiles_copy_2(Dir,Prefix,Dbg,[{Node,CopySpecs}|Rest],FailedNodes,Files) ->
- case fetch_logfiles_copy_3(Dir,Prefix,Dbg,CopySpecs,[],0) of
- {0,LocalFiles} -> % Copy went ok and zero errors.
- fetch_logfiles_copy_2(Dir,Prefix,Dbg,Rest,FailedNodes,[{Node,LocalFiles}|Files]);
- {_N,LocalFiles} -> % Copied files, but some went wrong.
- case lists:member(Node,FailedNodes) of
- true -> % Node already in FailedNodes.
- fetch_logfiles_copy_2(Dir,Prefix,Dbg,Rest,FailedNodes,
- [{Node,LocalFiles}|Files]);
- false -> % Node not marked as failed, yet.
- fetch_logfiles_copy_2(Dir,Prefix,Dbg,Rest,[Node|FailedNodes],
- [{Node,LocalFiles}|Files])
- end
- end;
-fetch_logfiles_copy_2(_,_,_,[],FailedNodes,Files) ->
- {FailedNodes,Files}. % The return value from fetch_logfiles_copy.
-
-fetch_logfiles_copy_3(Dir,Prefix,Dbg,[{FType,RemoteFiles}|Rest],Results,Errors) ->
- {Err,LocalFiles}=fetch_logfiles_copy_3_1(Dir,Prefix,Dbg,RemoteFiles,[],0),
- fetch_logfiles_copy_3(Dir,Prefix,Dbg,Rest,[{FType,LocalFiles}|Results],Errors+Err);
-fetch_logfiles_copy_3(_,_,_,[],Results,Errors) ->
- {Errors,Results}.
-
-%% For each file of one file-type (e.g. trace_log).
-fetch_logfiles_copy_3_1(Dir,Prefix,Dbg,[File|Rest],LocalFiles,Errors) ->
- DestName=Prefix++filename:basename(File),
- Destination=filename:join(Dir,DestName),
- case do_copy_file(File,Destination) of
- ok ->
- fetch_logfiles_copy_3_1(Dir,Prefix,Dbg,Rest,[DestName|LocalFiles],Errors);
- {error,Reason} ->
- inviso_tool_lib:debug(copy_files,Dbg,[File,Destination,Reason]),
- fetch_logfiles_copy_3_1(Dir,Prefix,Dbg,Rest,LocalFiles,Errors+1)
- end;
-fetch_logfiles_copy_3_1(_,_,_,[],LocalFiles,Errors) ->
- {Errors,LocalFiles}.
-
-%% Help function which builds a [{Node,[{Type,[ListOfRemoteFiles]}},...}]
-%% where Type describes trace_log or ti_log and each entry in ListOfRemoteFiles
-%% is a complete path to a file to be copied.
-build_copylist(CtrlNode,Dbg,NodeSpecList,TRDstorage) ->
- build_copylist_2(CtrlNode,Dbg,NodeSpecList,TRDstorage,[]).
-
-%% For each node specified in the NodeSpecList.
-build_copylist_2(CtrlNode,Dbg,[{Node,SourceDir}|Rest],TRDstorage,Acc) ->
- TRDlist=find_tracerdata_for_node_trd(Node,TRDstorage),
- CopySpecList=build_copylist_3(CtrlNode,Dbg,SourceDir,Node,TRDlist),
- build_copylist_2(CtrlNode,Dbg,Rest,TRDstorage,[CopySpecList|Acc]);
-build_copylist_2(_,_,[],_,Acc) ->
- lists:flatten(Acc).
-
-%% For each tracerdata found for the node.
-build_copylist_3(void,Dbg,SourceDir,Node,[TRD|Rest]) -> % The non-distributed case.
- case inviso:list_logs(TRD) of
- {ok,FileSpec} when list(FileSpec) -> % [{trace_log,Dir,Files},...]
- NewFileSpec=build_copylist_4(SourceDir,FileSpec,[]),
- [{Node,NewFileSpec}|build_copylist_3(void,Dbg,SourceDir,Node,Rest)];
- {ok,no_log} -> % This tracedata not associated with any log.
- build_copylist_3(void,Dbg,SourceDir,Node,Rest);
- {error,Reason} ->
- inviso_tool_lib:debug(list_logs,Dbg,[Node,TRD,Reason]),
- build_copylist_3(void,Dbg,SourceDir,Node,Rest)
- end;
-build_copylist_3(CtrlNode,Dbg,SourceDir,Node,[TRD|Rest]) -> % The distributed case.
- case inviso_tool_lib:inviso_cmd(CtrlNode,list_logs,[[{Node,TRD}]]) of
- {ok,[{Node,{ok,FileSpec}}]} when list(FileSpec) ->
- NewFileSpec=build_copylist_4(SourceDir,FileSpec,[]),
- [{Node,NewFileSpec}|build_copylist_3(CtrlNode,Dbg,SourceDir,Node,Rest)];
- {ok,[{Node,{ok,no_log}}]} -> % It relays to another node, no files!
- build_copylist_3(CtrlNode,Dbg,SourceDir,Node,Rest);
- {ok,[{Node,{error,Reason}}]} ->
- inviso_tool_lib:debug(list_logs,Dbg,[Node,TRD,Reason]),
- build_copylist_3(CtrlNode,Dbg,SourceDir,Node,Rest);
- {error,Reason} -> % Some general failure.
- inviso_tool_lib:debug(list_logs,Dbg,[Node,TRD,Reason]),
- build_copylist_3(CtrlNode,Dbg,SourceDir,Node,Rest)
- end;
-build_copylist_3(_,_,_,_,[]) ->
- [].
-
-%% Help function which makes a [{Type,Files},...] list where each file in Files
-%% is with full path as found from our file-system.
-build_copylist_4(SourceDir,[{Type,_Dir,Files}|Rest],Accum) ->
- NewFiles=
- lists:foldl(fun(FName,LocalAcc)->[filename:join(SourceDir,FName)|LocalAcc] end,
- [],
- Files),
- build_copylist_4(SourceDir,Rest,[{Type,NewFiles}|Accum]);
-build_copylist_4(_,[],Accum) ->
- Accum.
-
-
-%% Help function which copies a file using os:cmd.
-%% Returns 'ok' or {error,Reason}.
-do_copy_file(Source,Destination) ->
- case os:type() of
- {win32,_} ->
- os:cmd("copy "++Source++" "++Destination), % Perhaps a test on success?
- ok;
- {unix,_} ->
- os:cmd("cp "++Source++" "++Destination), % Perhaps a test on success?
- ok
- end.
-%% ------------------------------------------------------------------------------
-
-
-%% ------------------------------------------------------------------------------
-
-%% ==============================================================================
-%% Various help functions.
-%% ==============================================================================
-
-%% Help function going through the Nodes list and checking that only nodes
-%% mentioned in OurNodes gets returned. It also makes the nodes in the return
-%% value unique.
-remove_nodes_not_ours(Nodes,OurNodes) ->
- remove_nodes_not_ours_2(Nodes,OurNodes,[],[]).
-
-remove_nodes_not_ours_2([Node|Rest],OurNodes,OurAcc,OtherAcc) ->
- case lists:member(Node,OurNodes) of
- true -> % Ok it is one of our nodes.
- case lists:member(Node,OurAcc) of
- true -> % Already in the list, skip.
- remove_nodes_not_ours_2(Rest,OurNodes,OurAcc,OtherAcc);
- false ->
- remove_nodes_not_ours_2(Rest,OurNodes,[Node|OurAcc],OtherAcc)
- end;
- false ->
- case lists:member(Node,OtherAcc) of
- true ->
- remove_nodes_not_ours_2(Rest,OurNodes,OurAcc,OtherAcc);
- false ->
- remove_nodes_not_ours_2(Rest,OurNodes,OurAcc,[Node|OtherAcc])
- end
- end;
-remove_nodes_not_ours_2([],_,OurAcc,OtherAcc) ->
- {lists:reverse(OurAcc),lists:reverse(OtherAcc)}.
-%% ------------------------------------------------------------------------------
-
-%% Help function which returns 'true' or 'false' depending on if TracerData is
-%% meant to be used by the session handler (true) or if it supposed to be passed
-%% on to the trace system.
-is_tool_internal_tracerdata(_) -> % CURRENTLY NO INTERNAL TRACER DATA!
- false.
-%% ------------------------------------------------------------------------------
-
-%% Help function which checks that all nodes in the first list of nodes exists
-%% in the second list of nodes. Returns 'true' or 'false'. The latter if as much
-%% as one incorrect node was found.
-check_our_nodes([Node|Rest],AllNodes) ->
- case lists:member(Node,AllNodes) of
- true ->
- check_our_nodes(Rest,AllNodes);
- false -> % Then we can stop right here.
- false
- end;
-check_our_nodes([],_) ->
- true.
-%% ------------------------------------------------------------------------------
-
-%% Help function which checks that a directory actually exists. Returns 'true' or
-%% 'false'.
-check_directory_exists(Dir) ->
- case file:read_file_info(Dir) of
- {ok,#file_info{type=directory}} ->
- true;
- _ -> % In all other cases it is not valid.
- false
- end.
-%% ------------------------------------------------------------------------------
-
-%% This function stops the tracing on all nodes in Nodes. Preferably Nodes is a list
-%% of only tracing runtime components. Not that there will actually be any difference
-%% since the return value does not reflect how stopping the nodes went.
-%% Returns 'ok' or {error,Reason}, the latter only in case of general failure.
-stop_all_tracing(void,Dbg,[?LOCAL_RUNTIME]) -> % The non-distributed case, and is tracing.
- case inviso:stop_tracing() of
- {ok,_State} ->
- ok;
- {error,Reason} -> % We actually don't care.
- inviso_tool_lib:debug(stop_tracing,Dbg,[?LOCAL_RUNTIME,Reason]),
- ok
- end;
-stop_all_tracing(void,_,_) -> % There is no local runtime started.
- ok;
-stop_all_tracing(CtrlNode,Dbg,Nodes) ->
- case inviso_tool_lib:inviso_cmd(CtrlNode,stop_tracing,[Nodes]) of
- {ok,Result} -> % The result is only used for debug.
- Failed=lists:foldl(fun({N,{error,Reason}},Acc)->[{N,{error,Reason}}|Acc];
- (_,Acc)->Acc
- end,
- [],
- Result),
- if
- Failed==[] ->
- ok;
- true ->
- inviso_tool_lib:debug(stop_tracing,Dbg,[Nodes,Failed]),
- ok
- end;
- {error,Reason} ->
- {error,{stop_tracing,Reason}}
- end.
-%% ------------------------------------------------------------------------------
-
-%% Help function removing all local logs using the tracerdata to determine what
-%% logs to remove from where.
-%% There is no significant return value since it is not really clear what to do
-%% if removal went wrong. The function can make debug-reports thought.
-remove_all_local_logs(CtrlNode,TRDstorage,Nodes,Dbg) ->
- LogSpecList=build_logspeclist_remove_logs(Nodes,TRDstorage),
- case inviso_tool_lib:inviso_cmd(CtrlNode,delete_log,[LogSpecList]) of
- {ok,Results} ->
- case look_for_errors_resultlist(Results) of
- [] -> % No errors found in the result!
- true;
- Errors ->
- inviso_tool_lib:debug(remove_all_local_logs,Dbg,[Errors]),
- true
- end;
- {error,Reason} -> % Some general error.
- inviso_tool_lib:debug(remove_all_local_logs,Dbg,[{error,Reason}]),
- true
- end.
-
-%% Help function which puts together a list of {Node,Tracerdata} tuples. Note that
-%% we must build one tuple for each tracerdata for one node.
-build_logspeclist_remove_logs(Nodes,TRDstorage) ->
- [{Node,TracerData}||Node<-Nodes,TracerData<-find_tracerdata_for_node_trd(Node,TRDstorage)].
-%% ------------------------------------------------------------------------------
-
-%% Help function which traverses a resultlist from an inviso function. Such are
-%% built up as [{Node,SubResults},...] where SubResult is a list of tuples for each
-%% file-type (e.g trace_log) {FType,FileList} where a FileList is either {error,Reason}
-%% or {ok,FileName}.
-%% Returns a list of {Node,[{error,Reason},...]}.
-look_for_errors_resultlist([{Node,{error,Reason}}|Rest]) ->
- [{Node,{error,Reason}}|look_for_errors_resultlist(Rest)];
-look_for_errors_resultlist([{Node,{ok,NResults}}|Rest]) when list(NResults) ->
- case look_for_errors_resultlist_2(NResults,[]) of
- [] ->
- look_for_errors_resultlist(Rest);
- Errors -> % A list of lists.
- [{Node,lists:flatten(Errors)}|look_for_errors_resultlist(Rest)]
- end;
-look_for_errors_resultlist([_|Rest]) ->
- look_for_errors_resultlist(Rest);
-look_for_errors_resultlist([]) ->
- [].
-
-look_for_errors_resultlist_2([{_FType,NSubResult}|Rest],Accum) ->
- case lists:filter(fun({error,_Reason})->true;(_)->false end,NSubResult) of
- [] -> % No errors for this node.
- look_for_errors_resultlist_2(Rest,Accum);
- Errors -> % A list of at least one error.
- look_for_errors_resultlist_2(Rest,[Errors|Accum])
- end;
-look_for_errors_resultlist_2([],Accum) ->
- Accum.
-%% ------------------------------------------------------------------------------
-
-
-%% ------------------------------------------------------------------------------
-%% Functions working on the loopdata structure.
-%% Its main purpose is to store information about runtime components participating
-%% in the session and their current status.
-%% ------------------------------------------------------------------------------
-
--record(ld,{parent,
- ctrlnode,
- ctrlpid, % To where to send inviso cmd.
- rtstates,
- tracerdata,
- safetycatches,
- dbg,
- actstorage % Activity storage, for reactivate.
- }).
-
-%% Function creating the initial datastructure.
-%% The datastructure is [{Node,State},...].
-%%
-%% The tracerdata table is a bag simply for the reason that if we try to insert
-%% the same tracerdata for a node twice, we will end up with one tracerdata after
-%% all. This is useful when we insert tracerdata ourselves, the tracerdata will
-%% come as a state-change too.
-mk_ld(Parent,CtrlNode,CtrlPid,RTStates,NodeParams,OtherNodes,SafetyCatches,Dbg) ->
- TRDtableName=list_to_atom("inviso_tool_sh_trdstorage_"++pid_to_list(self())),
- TRDtid=ets:new(TRDtableName,[bag]),
- ACTtableName=list_to_atom("inviso_tool_sh_actstorage_"++pid_to_list(self())),
- ACTtid=ets:new(ACTtableName,[bag]),
- mk_ld_fill_tracerdata(CtrlNode,TRDtid,NodeParams,OtherNodes), % Fill the ETS table.
- #ld{parent=Parent, % The tool main process.
- ctrlnode=CtrlNode, % Node name where the control component is.
- ctrlpid=CtrlPid, % The process id of the control component.
- rtstates=RTStates, % All nodes and their state/status.
- tracerdata=TRDtid,
- safetycatches=SafetyCatches,
- dbg=Dbg,
- actstorage=ACTtid
- }.
-
-%% Help function which inserts tracer data for the nodes. Note that we can get
-%% tracer data either from the return value from init_tracing or by asking the
-%% node for it. The latter is necessary for the nodes which were marked not to
-%% be initiated by the session handler. This maybe because those nodes have
-%% autostarted.
-mk_ld_fill_tracerdata(CtrlNode,TId,NodeParams,OtherNodes) ->
- mk_ld_fill_tracerdata_nodeparams(TId,NodeParams),
- mk_ld_fill_tracerdata_othernodes(CtrlNode,TId,OtherNodes).
-
-mk_ld_fill_tracerdata_nodeparams(TId,[{Node,TracerData}|Rest]) ->
- ets:insert(TId,{Node,TracerData}),
- mk_ld_fill_tracerdata_nodeparams(TId,Rest);
-mk_ld_fill_tracerdata_nodeparams(_,[]) ->
- ok.
-
-mk_ld_fill_tracerdata_othernodes(_,_,[]) -> % Then not necessary to do anything.
- ok;
-mk_ld_fill_tracerdata_othernodes(void,TId,[Node]) -> % The non-distributed case.
- case inviso:get_tracerdata() of
- {error,_Reason} -> % Perhaps in state new or disconnected.
- ok; % Do nothing.
- {ok,TracerData} ->
- ets:insert(TId,{Node,TracerData})
- end;
-mk_ld_fill_tracerdata_othernodes(CtrlNode,TId,Nodes) ->
- case inviso_tool_lib:invisomd(CtrlNode,get_tracerdata,[Nodes]) of
- {ok,Results} ->
- mk_ld_fill_tracerdata_othernodes_2(TId,Results);
- {error,_Reason} -> % Strange, we will probably crash later.
- ok
- end.
-
-mk_ld_fill_tracerdata_othernodes_2(TId,[{_Node,{ok,no_tracerdata}}|Rest]) ->
- mk_ld_fill_tracerdata_othernodes_2(TId,Rest); % It was not initiated then!
-mk_ld_fill_tracerdata_othernodes_2(TId,[{Node,{ok,TracerData}}|Rest]) ->
- ets:insert(TId,{Node,TracerData}),
- mk_ld_fill_tracerdata_othernodes_2(TId,Rest);
-mk_ld_fill_tracerdata_othernodes_2(_,[]) ->
- ok.
-%% ------------------------------------------------------------------------------
-
-get_ctrlnode_ld(#ld{ctrlnode=CtrlNode}) ->
- CtrlNode.
-%% ------------------------------------------------------------------------------
-
-
-get_ctrlpid_ld(#ld{ctrlpid=CtrlPid}) ->
- CtrlPid.
-%% ------------------------------------------------------------------------------
-
-get_rtstates_ld(#ld{rtstates=RTStates}) ->
- RTStates.
-
-put_rtstates_ld(NewRTStates,LD) ->
- LD#ld{rtstates=NewRTStates}.
-%% ------------------------------------------------------------------------------
-
-get_trdstorage_ld(#ld{tracerdata=TId}) ->
- TId.
-
-put_trdstorage_ld(_NewTId,LD) ->
- LD.
-%% ------------------------------------------------------------------------------
-
-%% Help function which adds the current tracerdata of node Node to the tracerdata
-%% storage. We only want to add tracerdata we have not seen before. We therefore
-%% avoid adding it if the node already is in state ?TRACING.
-%% Returns a new tracerdata (what ever it is)!
-add_current_tracerdata_ld(CtrlNode,Node,RTStates,TId) ->
- case get_statestatus_rtstates(Node,RTStates) of
- {ok,{?TRACING,_}} -> % Then we have already added the tracerdata.
- TId; % Then do nothing.
- {ok,_} -> % Since we were not tracing before.
- case add_current_tracerdata_ld_fetchtracerdata(CtrlNode,Node) of
- {ok,TracerData} ->
- ets:insert(TId,{Node,TracerData});
- no_tracerdata -> % Strange, how could we become tracing
- ok;
- {error,_Reason} -> % The node perhaps disconnected!?
- ok
- end;
- false -> % Very strange, not our node!
- ok % Do nothing.
- end.
-
-add_current_tracerdata_ld_fetchtracerdata(void,_Node) ->
- case inviso:get_tracerdata() of
- {ok,TracerData} ->
- {ok,TracerData};
- {error,no_tracerdata} ->
- no_tracerdata;
- {error,Reason} ->
- {error,Reason}
- end;
-add_current_tracerdata_ld_fetchtracerdata(CtrlNode,Node) ->
- case inviso_tool_lib:inviso_cmd(CtrlNode,get_tracerdata,[[Node]]) of
- {ok,[{Node,{ok,TracerData}}]} ->
- {ok,TracerData};
- {ok,[{Node,{error,no_tracerdata}}]} ->
- no_tracerdata;
- {ok,[{Node,{error,Reason}}]} ->
- {error,Reason};
- {error,Reason} ->
- {error,Reason}
- end.
-%% ------------------------------------------------------------------------------
-
-
-get_safetycatches_ld(#ld{safetycatches=SCs}) ->
- SCs.
-%% ------------------------------------------------------------------------------
-
-get_dbg_ld(#ld{dbg=Dbg}) ->
- Dbg.
-%% ------------------------------------------------------------------------------
-
-get_actstorage_ld(#ld{actstorage=ACTstorage}) ->
- ACTstorage.
-
-put_actstorage_ld(_NewACTstorage,LD) ->
- LD.
-%% ------------------------------------------------------------------------------
-
-
-
-%% ------------------------------------------------------------------------------
-%% Functions working on the rtstates structure (which is a substructure of loopdata).
-%% It is either:
-%% [{Node,StateStatus,Opts},...]
-%% Node is either the node name of the runtime component erlang node or
-%% ?LOCAL_RUNTIME as returned from the trace control component.
-%% StateStatus is {State,Status}, 'unavailable' or 'unknown'.
-%% Status is the returnvalue from trace control component.
-%% i.e: running | {suspended,Reason}
-%% ------------------------------------------------------------------------------
-
-%% Function contructing an rtstates structure from a list of [{Node,StateStatus,Opts},...].
-to_rtstates(ListOfStates) when list(ListOfStates) ->
- ListOfStates.
-%% ------------------------------------------------------------------------------
-
-%% Function which takes a rtstates structure and returns a list of [{Node,StateStatus},...].
-from_rtstates(RTStates) ->
- RTStates.
-%% ------------------------------------------------------------------------------
-
-%% Function which takes an rtstates structure and a result as returned from
-%% init_tracing. The RTStates is modified for the nodes that changed state as a
-%% result of successful init_tracing.
-%% Returns a new RTStates.
-set_tracing_rtstates([E={Node,_StateStatus,Opts}|Rest],Result) ->
- case lists:keysearch(Node,1,Result) of
- {value,{_,ok}} -> % Means state-change to tracing!
- [{Node,{tracing,running},Opts}|set_tracing_rtstates(Rest,Result)];
- _ -> % Otherwise, leave it as is.
- [E|set_tracing_rtstates(Rest,Result)]
- end;
-set_tracing_rtstates([],_Result) ->
- [].
-%% ------------------------------------------------------------------------------
-
-%% Function updating the state/status for a certain runtime component.
-%% Returns a new RTStates structure. Note that Node must not necessarily be one
-%% of the nodes in the session. Meaning that Node shall not be added to RTStates
-%% should it not already be in there.
-statechange_rtstates(Node,State,Status,RTStates) when list(RTStates) ->
- case lists:keysearch(Node,1,RTStates) of
- {value,{_,_,Opts}} ->
- lists:keyreplace(Node,1,RTStates,{Node,{State,Status},Opts});
- _ -> % Then Node does not exist.
- RTStates % Just keep it as is, as keyreplace would have done.
- end.
-%% ------------------------------------------------------------------------------
-
-%% Function updating the state/status for a certain runtime component. The
-%% state/status is set to 'unavailable'.
-%% Returns a new RTStates structure.
-set_unavailable_rtstates(Node,RTStates) when list(RTStates) ->
- case lists:keysearch(Node,1,RTStates) of
- {value,{_,_,Opts}} ->
- lists:keyreplace(Node,1,RTStates,{Node,unavailable,Opts});
- _ -> % Then Node does not exist.
- RTStates % Just keep it as is, as keyreplace would have done.
- end.
-%% ------------------------------------------------------------------------------
-
-%% Function finding the statestatus associated with Node in the RTStates structure.
-%% Returns {ok,StateStatus} or 'false'.
-get_statestatus_rtstates(Node,RTStates) ->
- case lists:keysearch(Node,1,RTStates) of
- {value,{_,StateStatus,_}} ->
- {ok,StateStatus};
- false ->
- false
- end.
-%% ------------------------------------------------------------------------------
-
-%% Help function which returns a list of all nodes that are currently marked
-%% as available to us in the runtime state structure.
-get_all_available_nodes_rtstates(RTStates) ->
- get_all_session_nodes_rtstates(lists:filter(fun({_N,unavailable,_})->false;
- (_)->true
- end,
- RTStates)).
-%% ------------------------------------------------------------------------------
-
-%% Help function returning a list of all nodes belonging to this session.
-get_all_session_nodes_rtstates(RTStates) ->
- lists:map(fun({Node,_,_})->Node end,RTStates).
-%% ------------------------------------------------------------------------------
-
-%% Function which returns a list of nodes that are indicated as tracing in the
-%% RTStates structure.
-get_all_tracing_nodes_rtstates(RTStates) ->
- lists:map(fun({N,_,_})->N end,
- lists:filter(fun({_,{tracing,_},_})->true;(_)->false end,RTStates)).
-%% ------------------------------------------------------------------------------
-
-%% Returns the options associated with Node in the RTStates structure.
-get_opts_rtstates(Node,RTStates) ->
- case lists:keysearch(Node,1,RTStates) of
- {value,{_,_,Opts}} ->
- {ok,Opts};
- false ->
- false
- end.
-
-%% ------------------------------------------------------------------------------
-%% Functions working on the tracerdata structure, which is a part of the loopdata.
-%% The tracerdata structure is an ETS-table of type bag storing:
-%% {Node,TracerData}.
-%% Note that there can of course be multiple entries for a node.
-%% ------------------------------------------------------------------------------
-
-%% Help function which takes a tracerdata loopdata structure and returns a list
-%% of all stored tracerdata for a certain Node.
-find_tracerdata_for_node_trd(Node,TRD) ->
- case ets:lookup(TRD,Node) of
- Result when list(Result) ->
- lists:map(fun({_Node,TracerData})->TracerData end,Result);
- _ -> % Should probably never happend.
- []
- end.
-%% ------------------------------------------------------------------------------
-
-
-%% ------------------------------------------------------------------------------
-%% Functions working on the activity storage structure, which is part of the
-%% loopdata. It stores entries about things that needs to be "redone" in case
-%% of a reactivation of the node. The time order is also important.
-%% Note that for every ActivityType there must be a "handler" in the reactivation
-%% functionality.
-%%
-%% The structure is a bag of {Node,ActivityType,What}.
-%% ActivityType/What=tf/{Op,TraceConfList}|tpm/{Op,[Mod,Func,Arity,MS,CallFunc]}
-%% /{Op,[Mod,Func,Arity,MS,CallFunc,ReturnFunc]}
-%% /{Op,[]}
-%% TraceConfList=[{Proc,Flags},...]
-%% How=true|false
-%% ------------------------------------------------------------------------------
-
-%% Function that adds meta-pattern activities to the activity storage. Note
-%% that one of the parameters to the function is a return value from an
-%% inviso call. In that way we do not enter activities that were unsuccessful.
-%% Op can be either the setting or clearing of a meta pattern.
-%% Returns a new ACTstorage.
-add_tpm_actstorage([{Node,ok}|Rest],Op,InvisoCmdParams,ACTstorage) ->
- true=ets:insert(ACTstorage,{Node,tpm,{Op,InvisoCmdParams}}),
- add_tpm_actstorage(Rest,Op,InvisoCmdParams,ACTstorage);
-add_tpm_actstorage([_|Rest],Op,InvisoCmdParams,ACTstorage) ->
- add_tpm_actstorage(Rest,Op,InvisoCmdParams,ACTstorage);
-add_tpm_actstorage([],_,_,ACTstorage) ->
- ACTstorage.
-
-%% Function that adds process trace-flags to the activity storage. Note that one
-%% of the parameters is the return value from an inviso function. Meaning that
-%% if the flags failed in their entirety, no activity will be saved. If only
-%% some of the flags failed, we will not go through the effort of trying to find
-%% out exactly which.
-%% Returns a new activity storage structure.
-add_tf_actstorage([{_Node,{error,_Reason}}|Rest],Op,TraceConfList,ACTstorage) ->
- add_tf_actstorage(Rest,Op,TraceConfList,ACTstorage);
-add_tf_actstorage([{Node,_Result}|Rest],Op,TraceConfList,ACTstorage) ->
- true=ets:insert(ACTstorage,{Node,tf,{Op,TraceConfList}}),
- add_tf_actstorage(Rest,Op,TraceConfList,ACTstorage);
-add_tf_actstorage([],_,_,ACTstorage) ->
- ACTstorage.
-%% ------------------------------------------------------------------------------
-
-%% Finds all activities associated with Node. Returns a list of them in the
-%% same order as they were inserted.
-get_activities_actstorage(Node,ACTstorage) ->
- case ets:lookup(ACTstorage,Node) of
- [] ->
- false;
- Result when list(Result) ->
- {ok,lists:map(fun({_N,Type,What})->{Type,What} end,Result)}
- end.
-%% ------------------------------------------------------------------------------
-
-%% Function removing all activity entries associated with Node. This is useful
-%% if the Node disconnects for instance.
-del_node_actstorage(Node,ACTstorage) ->
- ets:delete(ACTstorage,Node),
- ACTstorage.
-%% ------------------------------------------------------------------------------
-
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2005-2011. 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%
+%%
+%% Description:
+%% The runtime component of the trace tool Inviso.
+%%
+%% Authors:
+%% Lennart �hman, [email protected]
+%% -----------------------------------------------------------------------------
+
+-module(inviso_tool_sh).
+
+%% Inviso Session Handler.
+%% This is the code for the session handler process. Its purpose is that we have
+%% one session handler process for each trace session started through the
+%% start_session inviso tool API. The session handler process is responsible for:
+%%
+%% -Knowing the state/status of all participating runtime components.
+%% -Keeping storage of all tracerdata all our participants have used. This means
+%% also to find out the tracerdata of runtime components connecting by them
+%% selves.
+%%
+%% STORAGE STRATEGY
+%% ----------------
+%% The local information storage can be changed by two things. Either by executing
+%% commands issued through our APIs. Or by receiving trace_event from the control
+%% component. When we execute commands, a corresponding event will also follow.
+%% Meaning that in those situations we are informed twice.
+%% A simple strategy could be to wait for the event even when doing the changes
+%% to the runtime components our self (through commands). But that may result in
+%% a small time frame where someone might do yet another command and failing
+%% because the local information storage is not uptodate as it would have been
+%% expected to be. Therefore we always update the local storage when making changes
+%% to a runtime component our selves. There will eventually be a double update
+%% through an incoming event. But the storage must coop with that, preventing
+%% inconsitancies to happend. An example of a strategy is that the tracerdata table
+%% is a bag, not allowing for double entries of the same kind. Therefore a double
+%% update is harmless there.
+
+%% ------------------------------------------------------------------------------
+%% Module wide constants.
+%% ------------------------------------------------------------------------------
+-define(LOCAL_RUNTIME,local_runtime). % Used as node name when non-disitrbuted.
+-define(TRACING,tracing). % A state defined by the control component.
+-define(RUNNING,running). % A status according to control componet.
+
+-define(COPY_LOG_FROM,copy_log_from). % Common fileystem option.
+%% ------------------------------------------------------------------------------
+
+%% ------------------------------------------------------------------------------
+%% API exports.
+%% ------------------------------------------------------------------------------
+-export([start_link/5,start_link/8]).
+-export([cancel_session/1,stop_session/3]).
+-export([reactivate/1,reactivate/2]).
+-export([ctpl/5,tpl/5,tpl/6,tpl/7,
+ tf/2,tf/3,
+ tpm_localnames/2,init_tpm/6,init_tpm/9,tpm/6,tpm/7,tpm/10,
+ tpm_ms/7,ctpm_ms/6,ctpm/5
+ ]).
+%% ------------------------------------------------------------------------------
+
+
+%% ------------------------------------------------------------------------------
+%% Internal exports.
+%% ------------------------------------------------------------------------------
+-export([init/1,handle_call/3,handle_info/2,terminate/2]).
+
+-export([get_loopdata/1]).
+%% ------------------------------------------------------------------------------
+
+
+%% ------------------------------------------------------------------------------
+%% Includes.
+%% ------------------------------------------------------------------------------
+-include_lib("kernel/include/file.hrl"). % Necessary for file module.
+%% ------------------------------------------------------------------------------
+
+
+%% ==============================================================================
+%% Exported API functions.
+%% ==============================================================================
+
+%% start_link(From,NodeParams,CtrlNode,CtrlPid,SafetyCatches,NodesIn,NodesNotIn) =
+%% {ok,Pid} | {error,Reason}
+%% From= pid(), the initial client expecting the reply.
+%% NodeParams=[{Node,TracerData},{Node,TracerData,Opts}...]
+%% CtrlNode=atom() | 'void', the node where the trace control component is.
+%% CtrlPid=pid(), the pid of the trace control component.
+%% SafetyCatches=
+%% Dir=string(), where to place fetched logs and the merged log.
+%% Dbg=debug structure.
+%% NodesIn=[Node,...], list of nodes already in another session.
+%% NodesNotIn=[Node,...], list of nodes not in another session.
+%%
+%% Starts a session-handler. It keeps track of the the state and status of all
+%% participating runtime components. Note that there is a non-distributed case too.
+%% In the non-distributed case there is no things such as CtrlNode.
+start_link(From,TracerData,CtrlPid,SafetyCatches,Dbg) ->
+ gen_server:start_link(?MODULE,
+ {self(),From,TracerData,CtrlPid,SafetyCatches,Dbg},
+ []).
+
+start_link(From,NodeParams,CtrlNode,CtrlPid,SafetyCatches,Dbg,NodesIn,NodesNotIn) ->
+ gen_server:start_link(?MODULE,
+ {self(),From,NodeParams,CtrlNode,CtrlPid,
+ SafetyCatches,Dbg,NodesIn,NodesNotIn},
+ []).
+%% ------------------------------------------------------------------------------
+
+%% Stops tracing where it is ongoing. Fetches all logfiles.
+stop_session(SID,Dir,Prefix) ->
+ gen_server:call(SID,{stop_session,Dir,Prefix}).
+%% ------------------------------------------------------------------------------
+
+%% stop_session(SID) = ok
+%%
+%% Cancels the session brutaly. All runtime components are made to stop tracing,
+%% all local log files are removed using the tracerdata we know for them.
+cancel_session(SID) ->
+ gen_server:call(SID,cancel_session).
+%% ------------------------------------------------------------------------------
+
+%% reactivate(SID) = {ok,
+%% reactivate(SID,Nodes) = {ok,NodeResults} | {error,Reason}.
+%% SID=session id, pid().
+%% Nodes=[Node,...]
+%% NodeResult=[{Node,Result},...]
+%% Result={Good,Bad}
+%% Good,Bad=integer(), the number of redone activities.
+%%
+%% Function which reactivates runtime components being suspended. This is done
+%% replaying all trace flags (in the correct order) to the corresponding nodes.
+%% Note that this may also mean turning flags off. Like first turning them on
+%% then off a split second later.
+reactivate(SID) ->
+ gen_server:call(SID,reactivate). %% NOT IMPLEMENTED YET.
+reactivate(SID,Nodes) ->
+ gen_server:call(SID,{reactivate,Nodes}).
+%% ------------------------------------------------------------------------------
+
+
+%% tpl(SessionID,Mod,Func,Arity,MS)=
+%% tpl(SessionID,Mod,Func,Arity,MS,Opts)={ok,N}|{error,Reason}.
+%% tpl(SessionID,Nodes,Mod,Func,Arity,MS)=
+%% tpl(SessionID,Nodes,Mod,Func,Arity,MS,Opts)={ok,Result}|{error,Reason}
+%% Mod='_' | ModuleName | ModRegExp | {DirRegExp,ModRegExp}
+%% ModRegExp=DirRegExp= string()
+%% Func='_' | FunctionName
+%% Arity='_' | integer()
+%% MS=[] | false | a match specification
+%% Opts=[Opts,...]
+%% Opt={arg,Arg}, disable_safety, {expand_regexp_at,NodeName}, only_loaded
+%% Nodes=[NodeName,...]
+tpl(SID,Mod,Func,Arity,MS) ->
+ gen_server:call(SID,{tp,tpl,Mod,Func,Arity,MS,[]}).
+tpl(SID,Mod,Func,Arity,MS,Opts) when list(MS);MS==true;MS==false ->
+ gen_server:call(SID,{tp,tpl,Mod,Func,Arity,MS,Opts});
+tpl(SID,Nodes,Mod,Func,Arity,MS) when integer(Arity);Arity=='_' ->
+ gen_server:call(SID,{tp,tpl,Nodes,Mod,Func,Arity,MS,[]}).
+tpl(SID,Nodes,Mod,Func,Arity,MS,Opts) ->
+ gen_server:call(SID,{tp,tpl,Nodes,Mod,Func,Arity,MS,Opts}).
+%% ------------------------------------------------------------------------------
+
+%% ctpl(SessionID,Nodes,Mod,Func,Arity)=
+%% See tpl/X for arguments.
+%%
+%% Removes local trace-patterns from functions.
+ctpl(SID,Nodes,Mod,Func,Arity) ->
+ gen_server:call(SID,{ctp,ctpl,Nodes,Mod,Func,Arity}).
+%% ------------------------------------------------------------------------------
+
+
+tpm_localnames(SID,Nodes) ->
+ gen_server:call(SID,{tpm_localnames,Nodes}).
+
+%% tpm_globalnames(SID,Nodes) ->
+%% gen_server:call(SID,{tpm_globalnames,Nodes}).
+
+init_tpm(SID,Nodes,Mod,Func,Arity,CallFunc) ->
+ gen_server:call(SID,{init_tpm,Nodes,Mod,Func,Arity,CallFunc}).
+init_tpm(SID,Nodes,Mod,Func,Arity,InitFunc,CallFunc,ReturnFunc,RemoveFunc) ->
+ gen_server:call(SID,
+ {init_tpm,Nodes,Mod,Func,Arity,InitFunc,CallFunc,ReturnFunc,RemoveFunc}).
+tpm(SID,Nodes,Mod,Func,Arity,MS) ->
+ gen_server:call(SID,{tpm,Nodes,Mod,Func,Arity,MS}).
+tpm(SID,Nodes,Mod,Func,Arity,MS,CallFunc) ->
+ gen_server:call(SID,{tpm,Nodes,Mod,Func,Arity,MS,CallFunc}).
+tpm(SID,Nodes,Mod,Func,Arity,MS,InitFunc,CallFunc,ReturnFunc,RemoveFunc) ->
+ gen_server:call(SID,{tpm,Nodes,Mod,Func,Arity,MS,InitFunc,CallFunc,ReturnFunc,RemoveFunc}).
+
+tpm_ms(SID,Nodes,Mod,Func,Arity,MSname,MS) ->
+ gen_server:call(SID,{tpm_ms,Nodes,Mod,Func,Arity,MSname,MS}).
+
+ctpm_ms(SID,Nodes,Mod,Func,Arity,MSname) ->
+ gen_server:call(SID,{tpm_ms,Nodes,Mod,Func,Arity,MSname}).
+
+ctpm(SID,Nodes,Mod,Func,Arity) ->
+ gen_server:call(SID,{ctpm,Nodes,Mod,Func,Arity}).
+%% ------------------------------------------------------------------------------
+
+
+%% tf(SessionID,Nodes,TraceConfList)=
+%% TraceConfList=[{PidSpec,Flags},...]
+%% PidSpec=pid()|atom()|all|new|existing
+%% Flags=[Flag,...]
+tf(SID,TraceConfList) ->
+ gen_server:call(SID,{tf,TraceConfList}).
+tf(SID,Nodes,TraceConfList) ->
+ gen_server:call(SID,{tf,Nodes,TraceConfList}).
+%% ------------------------------------------------------------------------------
+
+
+get_loopdata(SID) ->
+ gen_server:call(SID,get_loopdata).
+%% ------------------------------------------------------------------------------
+
+%% ==============================================================================
+%% Genserver call-backs.
+%% ==============================================================================
+
+%% Initial function for the session handler process. The nodes participating in
+%% the session must previously have been added to our control component by the tool.
+%% The session handler first finds out the state/status of the specified runtime
+%% components, then it tries to initiate tracing on those where it is applicable.
+%% Note that a reply to the initial (tool)client is done from here instead from
+%% the tool-server.
+init({Parent,From,TracerData,CtrlPid,SafetyCatches,Dbg}) -> % The non-distributed case.
+ {ok,StateStatus}=init_rtcomponent_states([],void,CtrlPid,[?LOCAL_RUNTIME]),
+ case is_tool_internal_tracerdata(TracerData) of
+ false -> % We shall initiate local runtime.
+ case inviso:init_tracing(TracerData) of
+ ok ->
+ gen_server:reply(From,{ok,{self(),ok}}),
+ {ok,mk_ld(Parent,
+ void,
+ CtrlPid,
+ to_rtstates([{?LOCAL_RUNTIME,{tracing,?RUNNING},[]}]),
+ [{?LOCAL_RUNTIME,TracerData}],
+ [],
+ SafetyCatches,
+ Dbg)};
+ {error,Reason} -> % It might have become suspended?!
+ gen_server:reply(From,{error,Reason}),
+ {ok,mk_ld(Parent,
+ void,
+ CtrlPid,
+ to_rtstates([{?LOCAL_RUNTIME,StateStatus,[]}]),
+ [{?LOCAL_RUNTIME,TracerData}],
+ [],
+ SafetyCatches,
+ Dbg)}
+ end;
+ true -> % We shall not pass this one on.
+ gen_server:reply(From,{ok,{self(),ok}}), % Then it is ok.
+ {ok,mk_ld(Parent,
+ void,
+ CtrlPid,
+ to_rtstates([{?LOCAL_RUNTIME,StateStatus,[]}]),
+ [],
+ [?LOCAL_RUNTIME],
+ SafetyCatches,
+ Dbg)}
+ end;
+init({Parent,From,NodeParams,CtrlNode,CtrlPid,SafetyCatches,Dbg,NodesIn,NodesNotIn}) ->
+ case init_rtcomponent_states(NodeParams,CtrlNode,CtrlPid,NodesNotIn) of
+ {ok,States} -> % A list of {Node,{State,Status},Opts}.
+ {NodeParams2,Nodes2}=remove_nodeparams(NodesIn,NodeParams),
+ case inviso_tool_lib:inviso_cmd(CtrlNode,init_tracing,[NodeParams2]) of
+ {ok,Result} -> % Resulted in state changes!
+ RTStates=set_tracing_rtstates(to_rtstates(States),Result),
+ ReplyValue=init_fix_resultnodes(NodesIn,Nodes2,Result),
+ gen_server:reply(From,{ok,{self(),ReplyValue}}),
+ {ok,mk_ld(Parent,CtrlNode,CtrlPid,RTStates,
+ NodeParams2,Nodes2,SafetyCatches,Dbg)};
+ {error,Reason} -> % Some general failure.
+ inviso_tool_lib:inviso_cmd(CtrlNode,unsubscribe,[]),
+ gen_server:reply(From,{error,{init_tracing,Reason}}),
+ {stop,{init_tracing,Reason}};
+ What ->
+ io:format("GOT:~n~w~n",[What]),
+ exit(foo)
+ end;
+ {error,Reason} -> % Unable to get the state/status.
+ inviso_tool_lib:inviso_cmd(CtrlNode,unsubscribe,[]),
+ gen_server:reply(From,{error,Reason}),
+ {stop,{error,Reason}};
+ What ->
+ io:format("GOT:~n~w~n",[What]),
+ exit(foo)
+ end.
+%% ------------------------------------------------------------------------------
+
+%% To stop a session means stop the tracing and remove all local files on the
+%% runtime nodes. We do have a table with all tracer data and that is how we are
+%% going to recreate what files to remove.
+%% Since runtime components may actually change state when this procedure is
+%% on-going, we do not care! It is the state in the session handling process at
+%% the time of start of this procedure which is used.
+handle_call(cancel_session,_From,LD) ->
+ CtrlNode=get_ctrlnode_ld(LD),
+ RTStates=get_rtstates_ld(LD),
+ Dbg=get_dbg_ld(LD),
+ TracingNodes=get_all_tracing_nodes_rtstates(RTStates),
+ case stop_all_tracing(CtrlNode,Dbg,TracingNodes) of
+ ok-> % Hopefully all nodes are stopped now.
+ AvailableNodes=get_all_available_nodes_rtstates(RTStates),
+ TRDstorage=get_trdstorage_ld(LD),
+ remove_all_local_logs(CtrlNode,TRDstorage,AvailableNodes,Dbg),
+ {stop,normal,ok,LD}; % LD actually not correct now!
+ {error,Reason} -> % Some serious error when stop_tracing.
+ {stop,normal,{error,Reason},LD}
+ end;
+%% ------------------------------------------------------------------------------
+
+%% *Stop all tracing on runtime components still tracing.
+%% *Copy all local log files to the collection directory.
+handle_call({stop_session,Dir,Prefix},_From,LD) ->
+ case check_directory_exists(Dir) of % Check that this directory exists here.
+ true ->
+ RTStates=get_rtstates_ld(LD),
+ CtrlNode=get_ctrlnode_ld(LD),
+ Dbg=get_dbg_ld(LD),
+ TracingNodes=get_all_tracing_nodes_rtstates(RTStates),
+ case stop_all_tracing(CtrlNode,Dbg,TracingNodes) of
+ ok -> % Hopefully no node is still tracing now.
+ TRDstorage=get_trdstorage_ld(LD),
+ AvailableNodes=get_all_available_nodes_rtstates(RTStates),
+ {FailedNodes,FetchedFiles}=
+ transfer_logfiles(RTStates,CtrlNode,Dir,Prefix,
+ TRDstorage,Dbg,AvailableNodes),
+ RemoveNodes= % We only delete local logs where fetch ok.
+ lists:filter(fun(N)->
+ case lists:keysearch(N,1,FailedNodes) of
+ {value,_} ->
+ false;
+ false ->
+ true
+ end
+ end,
+ AvailableNodes),
+ remove_all_local_logs(CtrlNode,TRDstorage,RemoveNodes,Dbg),
+ {stop,normal,{ok,{FailedNodes,FetchedFiles}},LD};
+ {error,Reason} -> % Some general failure, quit.
+ {stop,normal,{error,Reason},LD}
+ end;
+ false -> % You specified a non-existing directory!
+ {reply,{error,{faulty_dir,Dir}},LD}
+ end;
+%% ------------------------------------------------------------------------------
+
+handle_call({reactivate,Nodes},_From,LD) ->
+ RTStates=get_rtstates_ld(LD),
+ {OurNodes,OtherNodes}=
+ remove_nodes_not_ours(Nodes,get_all_session_nodes_rtstates(RTStates)),
+ CtrlNode=get_ctrlnode_ld(LD),
+ ACTstorage=get_actstorage_ld(LD),
+ case h_reactivate(CtrlNode,OurNodes,ACTstorage) of
+ {ok,Results} -> % A list of {Node,Result}.
+ if
+ OtherNodes==[] -> % Normal case, no non-session nodes.
+ {reply,{ok,Results},LD};
+ true -> % Add error values for non-session nodes.
+ {reply,
+ {ok,
+ lists:map(fun(N)->{N,{error,not_in_session}} end,OtherNodes)++
+ Results},
+ LD}
+ end;
+ {error,Reason} -> % Then this error takes presidence.
+ {reply,{error,Reason},LD}
+ end;
+%% ------------------------------------------------------------------------------
+
+%% Call-back for set trace-pattern for both global and local functions.
+handle_call({tp,PatternFunc,Mod,F,A,MS,Opts},_From,LD) ->
+ Reply=h_tp(all,PatternFunc,Mod,F,A,MS,Opts,LD), % For all active nodes in the session.
+ {reply,Reply,LD};
+handle_call({tp,PatternFunc,Nodes,Mod,F,A,MS,Opts},_From,LD) ->
+ RTStates=get_rtstates_ld(LD),
+ SNodes=get_all_session_nodes_rtstates(RTStates), % Notes belongoing to the session.
+ {Nodes2,FaultyNodes}=remove_nodes_not_ours(Nodes,SNodes),
+ Reply=h_tp(Nodes2,PatternFunc,Mod,F,A,MS,Opts,LD),
+ ErrorReply=lists:map(fun(N)->{N,{error,not_in_session}} end,FaultyNodes),
+ {reply,ErrorReply++Reply,LD};
+%% ------------------------------------------------------------------------------
+
+%% Call-back handling the removal of both local and global trace-patterns.
+%% NOT IMPLEMENTED YET.
+handle_call({ctp,PatternFunc,Nodes,Mod,F,A},_From,LD) ->
+ Reply=h_ctp(Nodes,PatternFunc,Mod,F,A,LD),
+ {reply,Reply,LD};
+%% ------------------------------------------------------------------------------
+
+handle_call({tpm_localnames,Nodes},_From,LD) ->
+ RTStates=get_rtstates_ld(LD),
+ OurNodes=get_all_session_nodes_rtstates(RTStates),
+ {Nodes2,NotOurNodes}=remove_nodes_not_ours(Nodes,OurNodes),
+ ACTstorage=get_actstorage_ld(LD),
+ {Reply,NewACTstorage}=
+ h_tpm_localnames(get_ctrlnode_ld(LD),Nodes2,RTStates,ACTstorage),
+ ErrorReply=lists:map(fun(N)->{N,{error,not_in_session}} end,NotOurNodes),
+ {reply,ErrorReply++Reply,put_actstorage_ld(NewACTstorage,LD)};
+
+handle_call({init_tpm,Nodes,Mod,Func,Arity,CallFunc},_From,LD) ->
+ RTStates=get_rtstates_ld(LD),
+ OurNodes=get_all_session_nodes_rtstates(RTStates),
+ {Nodes2,NotOurNodes}=remove_nodes_not_ours(Nodes,OurNodes),
+ ACTstorage=get_actstorage_ld(LD),
+ {Reply,NewACTstorage}=
+ h_all_tpm(get_ctrlnode_ld(LD),
+ Nodes2,
+ init_tpm,
+ [Mod,Func,Arity,CallFunc],
+ RTStates,
+ ACTstorage),
+ ErrorReply=lists:map(fun(N)->{N,{error,not_in_session}} end,NotOurNodes),
+ {reply,ErrorReply++Reply,put_actstorage_ld(NewACTstorage,LD)};
+
+handle_call({init_tpm,Nodes,Mod,Func,Arity,InitFunc,CallFunc,ReturnFunc,RemoveFunc},_From,LD) ->
+ RTStates=get_rtstates_ld(LD),
+ OurNodes=get_all_session_nodes_rtstates(RTStates),
+ {Nodes2,NotOurNodes}=remove_nodes_not_ours(Nodes,OurNodes),
+ ACTstorage=get_actstorage_ld(LD),
+ {Reply,NewACTstorage}=
+ h_all_tpm(get_ctrlnode_ld(LD),
+ Nodes2,
+ init_tpm,
+ [Mod,Func,Arity,InitFunc,CallFunc,ReturnFunc,RemoveFunc],
+ RTStates,
+ ACTstorage),
+ ErrorReply=lists:map(fun(N)->{N,{error,not_in_session}} end,NotOurNodes),
+ {reply,ErrorReply++Reply,put_actstorage_ld(NewACTstorage,LD)};
+
+handle_call({tpm,Nodes,Mod,Func,Arity,MS},_From,LD) ->
+ RTStates=get_rtstates_ld(LD),
+ OurNodes=get_all_session_nodes_rtstates(RTStates),
+ {Nodes2,NotOurNodes}=remove_nodes_not_ours(Nodes,OurNodes),
+ ACTstorage=get_actstorage_ld(LD),
+ {Reply,NewACTstorage}=
+ h_all_tpm(get_ctrlnode_ld(LD),Nodes2,tpm,[Mod,Func,Arity,MS],RTStates,ACTstorage),
+ ErrorReply=lists:map(fun(N)->{N,{error,not_in_session}} end,NotOurNodes),
+ {reply,ErrorReply++Reply,put_actstorage_ld(NewACTstorage,LD)};
+
+handle_call({tpm,Nodes,Mod,Func,Arity,MS,CallFunc},_From,LD) ->
+ RTStates=get_rtstates_ld(LD),
+ OurNodes=get_all_session_nodes_rtstates(RTStates),
+ {Nodes2,NotOurNodes}=remove_nodes_not_ours(Nodes,OurNodes),
+ ACTstorage=get_actstorage_ld(LD),
+ {Reply,NewACTstorage}=
+ h_all_tpm(get_ctrlnode_ld(LD),
+ Nodes2,
+ tpm,
+ [Mod,Func,Arity,MS,CallFunc],
+ RTStates,
+ ACTstorage),
+ ErrorReply=lists:map(fun(N)->{N,{error,not_in_session}} end,NotOurNodes),
+ {reply,ErrorReply++Reply,put_actstorage_ld(NewACTstorage,LD)};
+
+handle_call({tpm,Nodes,Mod,Func,Arity,MS,InitFunc,CallFunc,ReturnFunc,RemoveFunc},_From,LD) ->
+ RTStates=get_rtstates_ld(LD),
+ OurNodes=get_all_session_nodes_rtstates(RTStates),
+ {Nodes2,NotOurNodes}=remove_nodes_not_ours(Nodes,OurNodes),
+ ACTstorage=get_actstorage_ld(LD),
+ {Reply,NewACTstorage}=
+ h_all_tpm(get_ctrlnode_ld(LD),
+ Nodes2,
+ tpm,
+ [Mod,Func,Arity,MS,InitFunc,CallFunc,ReturnFunc,RemoveFunc],
+ RTStates,
+ ACTstorage),
+ ErrorReply=lists:map(fun(N)->{N,{error,not_in_session}} end,NotOurNodes),
+ {reply,ErrorReply++Reply,put_actstorage_ld(NewACTstorage,LD)};
+
+handle_call({tpm_ms,Nodes,Mod,Func,Arity,MSname,MS},_From,LD) ->
+ RTStates=get_rtstates_ld(LD),
+ OurNodes=get_all_session_nodes_rtstates(RTStates),
+ {Nodes2,NotOurNodes}=remove_nodes_not_ours(Nodes,OurNodes),
+ ACTstorage=get_actstorage_ld(LD),
+ {Reply,NewACTstorage}=
+ h_all_tpm(get_ctrlnode_ld(LD),
+ Nodes2,
+ tpm_ms,
+ [Mod,Func,Arity,MSname,MS],
+ RTStates,
+ ACTstorage),
+ ErrorReply=lists:map(fun(N)->{N,{error,not_in_session}} end,NotOurNodes),
+ {reply,ErrorReply++Reply,put_actstorage_ld(NewACTstorage,LD)};
+
+handle_call({ctpm_ms,Nodes,Mod,Func,Arity,MSname},_From,LD) ->
+ RTStates=get_rtstates_ld(LD),
+ OurNodes=get_all_session_nodes_rtstates(RTStates),
+ {Nodes2,NotOurNodes}=remove_nodes_not_ours(Nodes,OurNodes),
+ ACTstorage=get_actstorage_ld(LD),
+ {Reply,NewACTstorage}=
+ h_all_tpm(get_ctrlnode_ld(LD),
+ Nodes2,
+ ctpm_ms,
+ [Mod,Func,Arity,MSname],
+ RTStates,
+ ACTstorage),
+ ErrorReply=lists:map(fun(N)->{N,{error,not_in_session}} end,NotOurNodes),
+ {reply,ErrorReply++Reply,put_actstorage_ld(NewACTstorage,LD)};
+
+handle_call({ctpm,Nodes,Mod,Func,Arity},_From,LD) ->
+ RTStates=get_rtstates_ld(LD),
+ OurNodes=get_all_session_nodes_rtstates(RTStates),
+ {Nodes2,NotOurNodes}=remove_nodes_not_ours(Nodes,OurNodes),
+ ACTstorage=get_actstorage_ld(LD),
+ {Reply,NewACTstorage}=
+ h_all_tpm(get_ctrlnode_ld(LD),Nodes2,ctpm,[Mod,Func,Arity],RTStates,ACTstorage),
+ ErrorReply=lists:map(fun(N)->{N,{error,not_in_session}} end,NotOurNodes),
+ {reply,ErrorReply++Reply,put_actstorage_ld(NewACTstorage,LD)};
+%% ------------------------------------------------------------------------------
+
+%% Call-back for setting process trace-flags. Handles both distributed and non-
+%% distributed case.
+handle_call({tf,TraceConfList},From,LD) ->
+ handle_call({tf,all,TraceConfList},From,LD);
+handle_call({tf,Nodes,TraceConfList},_From,LD) ->
+ {Reply,NewACTstorage}=h_tf(get_ctrlnode_ld(LD),
+ Nodes,
+ TraceConfList,
+ get_actstorage_ld(LD),
+ get_rtstates_ld(LD)),
+ {reply,Reply,put_actstorage_ld(NewACTstorage,LD)};
+%% ------------------------------------------------------------------------------
+
+
+
+handle_call(get_loopdata,_From,LD) ->
+ io:format("The loopdata:~n~p~n",[LD]),
+ {reply,ok,LD}.
+%% ------------------------------------------------------------------------------
+
+
+%% Clause handling an incomming state-change event from the control component.
+%% Note that it does not have to be one of our nodes since it is not possible
+%% to subscribe to certain node-events.
+%% We may very well get state-change events for state-changes we are the source
+%% to our selves. Those state-changes are already incorporated into the RTStates.
+%% There is however no harm in doing them again since we know that this event
+%% message will reach us before a reply to a potentially following state-change
+%% request will reach us. Hence we will do all state-changes in the correct order,
+%% even if sometimes done twice.
+handle_info({trace_event,CtrlPid,_Time,{state_change,Node,{State,Status}}},LD) ->
+ case get_ctrlpid_ld(LD) of
+ CtrlPid -> % It is from our control component.
+ case {State,Status} of
+ {?TRACING,?RUNNING} -> % This is the only case when new tracerdata!
+ NewTracerData=add_current_tracerdata_ld(get_ctrlnode_ld(LD),
+ Node,
+ get_rtstates_ld(LD),
+ get_trdstorage_ld(LD)),
+ NewRTStates=statechange_rtstates(Node,State,Status,get_rtstates_ld(LD)),
+ {noreply,put_trdstorage_ld(NewTracerData,
+ put_rtstates_ld(NewRTStates,LD))};
+ _ -> % In all other cases, just fix rtstates.
+ NewRTStates=statechange_rtstates(Node,State,Status,get_rtstates_ld(LD)),
+ {noreply,put_rtstates_ld(NewRTStates,LD)}
+ end;
+ _ ->
+ {noreply,LD}
+ end;
+%% If a new runtime component connects to our trace control component, and it is
+%% in our list of runtime components belonging to this session, we may update its
+%% state to now being present. Otherwise it does not belong to this session.
+%% Note that we avoid updating an already connected runtime component. This
+%% can happend if it connected by itself after we started the session handler,
+%% but before we managed to initiate tracing. Doing so or not will not result in
+%% any error in the long run, but during a short period of time we might be
+%% prevented from doing things with the runtime though it actually is tracing.
+handle_info({trace_event,CtrlPid,_Time,{connected,Node,{_Tag,{State,Status}}}},LD) ->
+ case get_ctrlpid_ld(LD) of
+ CtrlPid -> % It is from our control component.
+ case get_statestatus_rtstates(Node,get_rtstates_ld(LD)) of
+ {ok,unavailable} -> % This is the situation when we update!
+ NewRTStates=statechange_rtstates(Node,State,Status,get_rtstates_ld(LD)),
+ {noreply,put_rtstates_ld(NewRTStates,LD)};
+ _ -> % In all other cases, let it be.
+ {noreply,LD}
+ end;
+ _ -> % Not from our control component.
+ {noreply,LD}
+ end;
+%% If a runtime component disconnects we mark it as unavailable. We must also
+%% remove all saved trace-flags in order for them to not be accidently reactivated
+%% should the runtime component reconnect and then suspend.
+handle_info({trace_event,CtrlPid,_Time,{disconnected,Node,_}},LD) ->
+ case get_ctrlpid_ld(LD) of
+ CtrlPid -> % It is from our control component.
+ NewRTStates=set_unavailable_rtstates(Node,get_rtstates_ld(LD)),
+ NewACTstorage=del_node_actstorage(Node,get_actstorage_ld(LD)),
+ {noreply,put_actstorage_ld(NewACTstorage,put_rtstates_ld(NewRTStates,LD))};
+ _ ->
+ {noreply,LD}
+ end;
+handle_info(_,LD) ->
+ {noreply,LD}.
+%% ------------------------------------------------------------------------------
+
+%% In terminate we cancel our subscription to event from the trace control component.
+%% That should actually not be necessary, but lets do it the correct way!
+terminate(_,LD) ->
+ case get_ctrlnode_ld(LD) of
+ void -> % Non-distributed.
+ inviso:unsubscribe();
+ Node ->
+ inviso_tool_lib:inviso_cmd(Node,unsubscribe,[])
+ end.
+%% ------------------------------------------------------------------------------
+
+
+
+%% ==============================================================================
+%% First level help functions to call-backs.
+%% ==============================================================================
+
+%% ------------------------------------------------------------------------------
+%% Help functions to init.
+%% ------------------------------------------------------------------------------
+
+%% Help function which find out the state/status of the runtime components.
+%% Note that since we have just started subscribe to state changes we must
+%% check our inqueue to see that we have no waiting messages for the nodes
+%% we learned the state/status of. If there is a waiting message we don't
+%% know whether that was a state change received before or after the state
+%% check was done. We will then redo the state-check.
+%% Returns {ok,States} or {error,Reason}.
+%% Where States is [{Node,{State,Status},Opts},...].
+%% Note that {error,Reason} can not occur in the non-distributed case.
+init_rtcomponent_states(NodeParams,void,CtrlPid,Nodes) -> % The non-distributed case.
+ ok=inviso:subscribe(),
+ init_rtcomponent_states_2(NodeParams,void,CtrlPid,Nodes,[]);
+init_rtcomponent_states(NodeParams,CtrlNode,CtrlPid,Nodes) ->
+ ok=inviso_tool_lib:inviso_cmd(CtrlNode,subscribe,[]),
+ init_rtcomponent_states_2(NodeParams,CtrlNode,CtrlPid,Nodes,[]).
+
+init_rtcomponent_states_2(_,_,_,[],States) ->
+ {ok,States};
+init_rtcomponent_states_2(NodeParams,void,CtrlPid,_Nodes,States) ->
+ case inviso:get_status() of
+ {ok,StateStatus} -> % Got its state/status, now...
+ {ProblemNodes,NewStates}=
+ init_rtcomponent_states_3(NodeParams,CtrlPid,[{?LOCAL_RUNTIME,{ok,StateStatus}}],
+ [],States),
+ init_rtcomponent_states_2(NodeParams,void,CtrlPid,ProblemNodes,NewStates);
+ {error,_Reason} -> % The runtime is not available!?
+ {ok,[{?LOCAL_RUNTIME,unavailable,[]}]} % Create the return value immediately.
+ end;
+init_rtcomponent_states_2(NodeParams,CtrlNode,CtrlPid,Nodes,States) ->
+ case inviso_tool_lib:inviso_cmd(CtrlNode,get_status,[Nodes]) of
+ {ok,NodeResult} ->
+ {ProblemNodes,NewStates}=
+ init_rtcomponent_states_3(NodeParams,CtrlPid,NodeResult,[],States),
+ init_rtcomponent_states_2(NodeParams,CtrlNode,CtrlPid,ProblemNodes,NewStates);
+ {error,Reason} -> % Severe problem, abort the session.
+ {error,{get_status,Reason}}
+ end.
+
+%% Traverses the list of returnvalues and checks that we do not have an event
+%% waiting in the message queue. If we do have, it is a problem. That node will
+%% be asked about its state again.
+%% Note that it is here we construct the RTStatesList.
+init_rtcomponent_states_3(NodeParams,CtrlPid,[{Node,{ok,{State,Status}}}|Rest],Problems,States) ->
+ receive
+ {trace_event,CtrlPid,_Time,{state_change,Node,_}} ->
+ init_rtcomponent_states_3(NodeParams,CtrlPid,Rest,[Node|Problems],States)
+ after
+ 0 -> % Not in msg queue, then we're safe!
+ RTState=case lists:keysearch(Node,1,NodeParams) of
+ {value,{_Node,_TracerData,Opts}} ->
+ {Node,{State,Status},Opts};
+ _ -> % No option available, use [].
+ {Node,{State,Status},[]}
+ end,
+ init_rtcomponent_states_3(NodeParams,CtrlPid,Rest,Problems,[RTState|States])
+ end;
+init_rtcomponent_states_3(NodeParams,CtrlPid,[{Node,{error,_Reason}}|Rest],Problems,States) ->
+ RTState=case lists:keysearch(Node,1,NodeParams) of
+ {value,{_Node,_TracerData,Opts}} ->
+ {Node,unavailable,Opts};
+ _ -> % No option available, use [].
+ {Node,unavailable,[]}
+ end,
+ init_rtcomponent_states_3(NodeParams,CtrlPid,Rest,Problems,[RTState|States]);
+init_rtcomponent_states_3(_,_,[],Problems,States) ->
+ {Problems,States}.
+%% ------------------------------------------------------------------------------
+
+%% Help function removing nodes from NodeParams. The reason for this can either
+%% be that we are using a tool internal tracerdata that shall not be forwarded to
+%% the trace control component, or that the node is actually already part of
+%% another session.
+%% Returns {NewNodeParams,NodesWhichShallNotBeInitiated}.
+remove_nodeparams(Nodes,NodesParams) ->
+ remove_nodeparams_2(Nodes,NodesParams,[],[]).
+
+remove_nodeparams_2(Nodes,[NodeParam|Rest],NPAcc,NAcc) when % NPAcc=NodeParamsAcc.
+ (is_tuple(NodeParam) and ((size(NodeParam)==2) or (size(NodeParam)==3))) ->
+ Node=element(1,NodeParam),
+ Params=element(2,NodeParam), % This is tracerdata!
+ case lists:member(Node,Nodes) of
+ true -> % Remove this one, in another session.
+ remove_nodeparams_2(Nodes,Rest,NPAcc,NAcc);
+ false -> % Ok so far...
+ case is_tool_internal_tracerdata(Params) of
+ false -> % Then keep it and use it later!
+ remove_nodeparams_2(Nodes,Rest,[{Node,Params}|NPAcc],NAcc);
+ true -> % Since it is, remove it from the list.
+ remove_nodeparams_2(Nodes,Rest,NPAcc,[Node|NAcc])
+ end
+ end;
+remove_nodeparams_2(Nodes,[_|Rest],NPAcc,NAcc) -> % Faulty NodeParam, skip it!
+ remove_nodeparams_2(Nodes,Rest,NPAcc,NAcc);
+remove_nodeparams_2(_,[],NPAcc,NAcc) ->
+ {lists:reverse(NPAcc),NAcc}.
+%% ------------------------------------------------------------------------------
+
+%% Help function which adds both the nodes which were already part of another
+%% session and the nodes that we actually did not issue any init_tracing for.
+%% Returns a new Result list of [{Node,NodeResult},...].
+init_fix_resultnodes(NodesOtherSes,NodesNotInit,Result) ->
+ NewResult=init_fix_resultnodes_2(NodesOtherSes,{error,in_other_session},Result),
+ init_fix_resultnodes_2(NodesNotInit,ok,NewResult).
+
+init_fix_resultnodes_2([Node|Rest],NodeResult,Result) ->
+ [{Node,NodeResult}|init_fix_resultnodes_2(Rest,NodeResult,Result)];
+init_fix_resultnodes_2([],_,Result) ->
+ Result. % Append Result to the end of the list.
+%% ------------------------------------------------------------------------------
+
+
+%% ------------------------------------------------------------------------------
+%% Help functions to reactivate.
+%% ------------------------------------------------------------------------------
+
+h_reactivate(CtrlNode,Nodes,ACTstorage) -> % Distributed case.
+ case inviso_tool_lib:inviso_cmd(CtrlNode,cancel_suspension,[Nodes]) of
+ {ok,CSuspResults} ->
+ {GoodNodes,BadResults}= % Sort out nodes no longer suspended.
+ lists:foldl(fun({Node,ok},{GoodNs,BadNs})->
+ {[Node|GoodNs],BadNs};
+ ({Node,{error,Reason}},{GoodNs,BadNs})->
+ {GoodNs,[{Node,{error,{cancel_suspension,Reason}}}|BadNs]}
+ end,
+ {[],[]},
+ CSuspResults),
+ Results=h_reactivate_redo_activity(CtrlNode,GoodNodes,ACTstorage,[]),
+ {ok,BadResults++Results};
+ {error,Reason} -> % General failure cancelling suspend.
+ {error,{cancel_suspension,Reason}}
+ end.
+%% ------------------------------------------------------------------------------
+
+%% Help function which traverses the list of nodes known to be ours and have
+%% cancelled their suspend. If we fail redoing one of the activities associated
+%% with a node, the node will be reported in the return value as failed. From
+%% that point on its state must be considered unknown since we do not know how
+%% many of the activities were successfully redone.
+h_reactivate_redo_activity(CtrlNode,[Node|Rest],ACTstorage,Acc) ->
+ case get_activities_actstorage(Node,ACTstorage) of
+ {ok,Activities} -> % The node existed in activity storage.
+ {Good,Bad}=h_reactivate_redo_activity_2(CtrlNode,Node,Activities,0,0),
+ h_reactivate_redo_activity(CtrlNode,Rest,ACTstorage,[{Node,{Good,Bad}}|Acc]);
+ false -> % Node not present in activity storage.
+ h_reactivate_redo_activity(CtrlNode,Rest,ACTstorage,[{Node,{0,0}}|Acc])
+ end;
+h_reactivate_redo_activity(_CtrlNode,[],_,Acc) ->
+ lists:reverse(Acc).
+
+%% Help function actually redoing the activity. Note that there must be one
+%% clause here for every type of activity.
+%% Returns {NrGoodCmds,NrBadCmds}.
+%% The number of good or bad commands refers to inviso commands done. If any
+%% of the subparts of such a command returned an error, the command is concidered
+%% no good.
+h_reactivate_redo_activity_2(CtrlNode,Node,[{tf,{Op,TraceConfList}}|Rest],Good,Bad) ->
+ case inviso_tool_lib:inviso_cmd(CtrlNode,Op,[[Node],TraceConfList]) of
+ {ok,[{_Node,{ok,Answers}}]} ->
+ case h_reactivate_redo_activity_check_tf(Answers) of
+ ok ->
+ h_reactivate_redo_activity_2(CtrlNode,Node,Rest,Good+1,Bad);
+ error -> % At least oneReports the first encountered error.
+ h_reactivate_redo_activity_2(CtrlNode,Node,Rest,Good,Bad+1)
+ end;
+ {ok,[{_Node,{error,_Reason}}]} ->
+ h_reactivate_redo_activity_2(CtrlNode,Node,Rest,Good,Bad+1);
+ {error,_Reason} -> % General error when doing cmd.
+ h_reactivate_redo_activity_2(CtrlNode,Node,Rest,Good,Bad+1)
+ end;
+h_reactivate_redo_activity_2(CtrlNode,Node,[{tpm,{Op,InvisoCmdParams}}|Rest],Good,Bad) ->
+ case inviso_tool_lib:inviso_cmd(CtrlNode,Op,[[Node]|InvisoCmdParams]) of
+ {ok,[{_Node,ok}]} ->
+ h_reactivate_redo_activity_2(CtrlNode,Node,Rest,Good+1,Bad);
+ {ok,[{_Node,{error,_Reason}}]} ->
+ h_reactivate_redo_activity_2(CtrlNode,Node,Rest,Good,Bad+1);
+ {error,_Reason} -> % General error when doing cmd.
+ h_reactivate_redo_activity_2(CtrlNode,Node,Rest,Good,Bad+1)
+ end;
+h_reactivate_redo_activity_2(_CtrlNode,_Node,[],Good,Bad) ->
+ {Good,Bad}.
+
+%% Help function traversing a list of results from inviso:tf/2 or inviso:ctf/2
+%% to see if there were any errors.
+h_reactivate_redo_activity_check_tf([N|Rest]) when integer(N) ->
+ h_reactivate_redo_activity_check_tf(Rest);
+h_reactivate_redo_activity_check_tf([{error,_Reason}|_]) ->
+ error;
+h_reactivate_redo_activity_check_tf([]) ->
+ ok.
+%% ------------------------------------------------------------------------------
+
+
+%% ------------------------------------------------------------------------------
+%% Help functions to tp (setting trace patterns, both local and global).
+%% ------------------------------------------------------------------------------
+
+%% Help function which handles both tpl and tp. Note that the non-distributed case
+%% handled with Nodes='all'.
+%% Returns what shall be the reply to the client.
+h_tp(all,PatternFunc,Mod,F,A,MS,Opts,LD) -> % All available runtime nodes.
+ Nodes=get_all_available_nodes_rtstates(get_rtstates_ld(LD)),
+ h_tp(Nodes,PatternFunc,Mod,F,A,MS,Opts,LD);
+h_tp(Nodes,PatternFunc,Mod,F,A,MS,Opts,LD) -> % Only certain nodes in the session.
+ CtrlNode=get_ctrlnode_ld(LD),
+ Dbg=get_dbg_ld(LD),
+ SafetyCatches=get_safetycatches_ld(LD),
+ case inviso_tool_lib:expand_module_names(Nodes,Mod,Opts) of % Take care of any reg-exps.
+ {multinode_expansion,NodeMods} ->
+ NodeTPs=inviso_tool_lib:make_patterns(SafetyCatches,Opts,Dbg,NodeMods,F,A,MS),
+ h_tp_node_by_node(CtrlNode,PatternFunc,Dbg,NodeTPs,[]);
+ {singlenode_expansion,Modules} ->
+ TPs=inviso_tool_lib:make_patterns(SafetyCatches,Opts,Dbg,Modules,F,A,MS),
+ h_tp_do_tps(CtrlNode,Nodes,TPs,PatternFunc,Dbg);
+ module ->
+ TPs=inviso_tool_lib:make_patterns(SafetyCatches,Opts,Dbg,[Mod],F,A,MS),
+ h_tp_do_tps(CtrlNode,Nodes,TPs,PatternFunc,Dbg);
+ wildcard -> % Means do for all modules, no safety.
+ h_tp_do_tps(CtrlNode,Nodes,[{Mod,F,A,MS}],PatternFunc,Dbg);
+ {error,Reason} ->
+ {error,Reason}
+ end.
+
+%% Note that this function can never be called in the non-distributed case.
+h_tp_node_by_node(CtrlNode,PatternFunc,Dbg,[{Node,TPs}|Rest],Accum) ->
+ case h_tp_do_tps(CtrlNode,[Node],TPs,PatternFunc,Dbg) of
+ {ok,[{Node,Result}]} ->
+ h_tp_node_by_node(CtrlNode,PatternFunc,Dbg,Rest,[{Node,Result}|Accum]);
+ {error,Reason} -> % Failure, but don't stop.
+ h_tp_node_by_node(CtrlNode,PatternFunc,Dbg,Rest,[{Node,{error,Reason}}|Accum])
+ end;
+h_tp_node_by_node(_,_,_,[],Accum) ->
+ {ok,lists:reverse(Accum)}.
+
+%% Help function which does the actual call to the trace control component.
+%% Note that Nodes can be a list of nodes (including a single one) or
+%% ?LOCAL_RUNTIME if we are not distributed. The non-distributed case is otherwise
+%% detected by the 'void' CtrlNode.
+%% Returns {ok,[{Node,{ok,{NrOfFunctions,NrOfErrors}}},{Node,{error,Reason}},...]} or
+%% {error,Reason}. In the non-distributed case {ok,{NrOfFunctions,NrOfErros}} or
+%% {error,Reason}.
+h_tp_do_tps(void,_Nodes,TPs,PatternFunc,Dbg) -> % Non distributed case!
+ inviso_tool_lib:debug(tp,Dbg,[TPs,PatternFunc]),
+ case inviso:PatternFunc(TPs) of
+ {ok,Result} -> % A list of [Nr1,Nr2,error,...].
+ {ok,
+ lists:foldl(fun(N,{AccNr,AccErr}) when integer(N) ->
+ {AccNr+N,AccErr};
+ (error,{AccNr,AccErr}) ->
+ {AccNr,AccErr+1}
+ end,
+ {0,0},
+ Result)};
+ {error,Reason} ->
+ {error,{PatternFunc,Reason}}
+ end;
+h_tp_do_tps(CtrlNode,Nodes,TPs,PatternFunc,Dbg) ->
+ inviso_tool_lib:debug(tp,Dbg,[Nodes,TPs,PatternFunc]),
+ case inviso_tool_lib:inviso_cmd(CtrlNode,PatternFunc,[Nodes,TPs]) of
+ {ok,Result} -> % Result is [{Node,Result},...].
+ {ok,
+ lists:map(fun({Node,{ok,Res}})->
+ {Node,lists:foldl(fun(N,{ok,{AccNr,AccErr}}) when integer(N) ->
+ {ok,{AccNr+N,AccErr}};
+ (error,{AccNr,AccErr}) ->
+ {ok,{AccNr,AccErr+1}}
+ end,
+ {ok,{0,0}},
+ Res)};
+ ({_Node,{error,Reason}})->
+ {error,Reason}
+ end,
+ Result)};
+ {error,Reason} ->
+ {error,{PatternFunc,Reason}}
+ end.
+%% ------------------------------------------------------------------------------
+
+%% ------------------------------------------------------------------------------
+%% Help functions for removing trace-patterns.
+%% ------------------------------------------------------------------------------
+
+%% NOT IMPLEMENTED YET.
+h_ctp(Node,PatternFunc,Mod,F,A,LD) ->
+ tbd.
+%% ------------------------------------------------------------------------------
+
+
+%% ------------------------------------------------------------------------------
+%% Help functions for calling the trace information facility.
+%% ------------------------------------------------------------------------------
+
+
+%% Function handling the meta trace pattern for capturing registration of local
+%% process names.
+h_tpm_localnames(CtrlNode,Nodes,RTStates,ACTstorage) ->
+ AvailableNodes=get_all_available_nodes_rtstates(RTStates),
+ {Nodes3,FaultyNodes}=remove_nodes_not_ours(Nodes,AvailableNodes),
+ case inviso_tool_lib:inviso_cmd(CtrlNode,tpm_localnames,[Nodes3]) of
+ {ok,Result} -> % That good we want to modify tpmstorage!
+ NewACTstorage=add_tpm_actstorage(Result,tpm_localnames,[],ACTstorage),
+ ErrorResult=lists:map(fun(N)->{N,{error,not_available}} end,FaultyNodes),
+ {{ok,ErrorResult++Result},NewACTstorage};
+ {error,Reason} -> % If general failure, do not modify storage.
+ {{error,Reason},ACTstorage}
+ end.
+%% ------------------------------------------------------------------------------
+
+%% Functions calling meta trace functions for specified nodes. This function is
+%% intended for use with all tmp function calls, init_tpm,tpm,tpm_ms,ctpm_ms and
+%% ctpm.
+%% Note that we must store called meta trace functions and their parameters in the
+%% activity storage in order to be able to redo them in case of a reactivate.
+h_all_tpm(CtrlNode,Nodes,TpmCmd,InvisoCmdParams,RTStates,ACTstorage) ->
+ AvailableNodes=get_all_available_nodes_rtstates(RTStates),
+ {Nodes3,FaultyNodes}=remove_nodes_not_ours(Nodes,AvailableNodes),
+ case inviso_tool_lib:inviso_cmd(CtrlNode,TpmCmd,[Nodes3|InvisoCmdParams]) of
+ {ok,Result} -> % That good we want to modify tpmstorage!
+ NewACTstorage=add_tpm_actstorage(Result,TpmCmd,InvisoCmdParams,ACTstorage),
+ ErrorResult=lists:map(fun(N)->{N,{error,not_available}} end,FaultyNodes),
+ {{ok,ErrorResult++Result},NewACTstorage};
+ {error,Reason} -> % If general failure, do not modify storage.
+ {{error,Reason},ACTstorage}
+ end.
+%% ------------------------------------------------------------------------------
+
+
+%% ------------------------------------------------------------------------------
+%% Help functions for set trace flags.
+%% ------------------------------------------------------------------------------
+
+%% Help function which sets the tracepatterns in TraceConfList for all nodes
+%% mentioned in Nodes. Note that non-distributed case is handled with Nodes='all'.
+%% Returns {Reply,NewACTstorage} where Reply is whatever shall be returned to caller
+%% and NewACTstorage is traceflag storage modified with the flags added to the
+%% corresponding nodes.
+h_tf(void,_Nodes,TraceConfList,ACTstorage,_RTStates) -> % The non-distributed case.
+ Reply=inviso:tf(TraceConfList),
+ NewACTstorage=add_tf_actstorage([{?LOCAL_RUNTIME,Reply}],tf,TraceConfList,ACTstorage),
+ {Reply,NewACTstorage};
+h_tf(CtrlNode,all,TraceConfList,ACTstorage,RTStates) ->
+ AllNodes=get_all_session_nodes_rtstates(RTStates),
+ h_tf(CtrlNode,AllNodes,TraceConfList,ACTstorage,RTStates);
+h_tf(CtrlNode,Nodes,TraceConfList,ACTstorage,_RTStates) ->
+ case inviso_tool_lib:inviso_cmd(CtrlNode,tf,[Nodes,TraceConfList]) of
+ {ok,Result} -> % That good we want to modify actstorage!
+ NewACTstorage=add_tf_actstorage(Result,tf,TraceConfList,ACTstorage),
+ {{ok,Result},NewACTstorage};
+ {error,Reason} -> % If general failure, do not modify actstorage.
+ {{error,Reason},ACTstorage}
+ end.
+%% ------------------------------------------------------------------------------
+
+%% ------------------------------------------------------------------------------
+%% Help functions to stop_session.
+%% ------------------------------------------------------------------------------
+
+%% This function fetches all local log-files using our stored tracerdata. Note
+%% that there are two major ways of tranfering logfiles. Either via distributed
+%% Erlang or by common filesystem (like NFS). The default is distributed Erlang.
+%% But there may be info in the RTStates structure about a common file-system.
+%% Returns {FailedNodes,FetchedFileNames} where FailedNodes is a list of
+%% nodenames where problems occurred. Note that problems does not necessarily
+%% mean that no files were copied.
+%% FetchedFileNames contains one or two of the tuples {trace_log,Files} and/or
+%% {ti_log,Files}, listing all files successfully fetched. Note that the
+%% list of fetched files contains sublists of filenames. One for each node and
+%% tracerdata.
+%% In the non-distributed system we always use copy (since the files always
+%% resides locally).
+transfer_logfiles(RTStates,CtrlNode,Dir,Prefix,TRDstorage,Dbg,AvailableNodes) ->
+ if
+ CtrlNode==void -> % When non-distributed, always copy!
+ fetch_logfiles_copy(CtrlNode,Dir,Prefix,TRDstorage,Dbg,[?LOCAL_RUNTIME]);
+ true -> % The distributed case.
+ {FetchNodes,CopyNodes}=find_logfile_transfer_methods(AvailableNodes,RTStates),
+ {FailedFetchNodes,FetchedFiles}=
+ case fetch_logfiles_distributed(CtrlNode,Dir,Prefix,TRDstorage,Dbg,FetchNodes) of
+ {ok,Failed,Files} -> % So far no disasters.
+ {Failed,Files};
+ {error,Reason} -> % Means all fetch-nodes failed!
+ inviso_tool_lib:debug(transfer_logfiles,Dbg,[FetchNodes,Reason]),
+ {lists:map(fun(N)->{N,error} end,FetchNodes),[]}
+ end,
+ {FailedCopyNodes,CopiedFiles}=
+ fetch_logfiles_copy(CtrlNode,Dir,Prefix,TRDstorage,Dbg,CopyNodes),
+ {FailedFetchNodes++FailedCopyNodes,FetchedFiles++CopiedFiles}
+ end.
+
+%% Help function which finds out which node we have a common file system with
+%% and from which we must make distributed erlang tranfere.
+%% Returns {DistributedNodes,CopyNodes} where CopyNode is [{Node,CopyFromDir},...].
+find_logfile_transfer_methods(Nodes,RTStates) ->
+ find_logfile_transfer_methods_2(Nodes,RTStates,[],[]).
+
+find_logfile_transfer_methods_2([Node|Rest],RTStates,FetchAcc,CopyAcc) ->
+ {ok,Opts}=get_opts_rtstates(Node,RTStates), % Node must be in RTStates!
+ case lists:keysearch(?COPY_LOG_FROM,1,Opts) of
+ {value,{_,FromDir}} when list(FromDir) -> % Node has common filesystem.
+ find_logfile_transfer_methods_2(Rest,RTStates,FetchAcc,[{Node,FromDir}|CopyAcc]);
+ {value,_} -> % Can't understand dir option.
+ find_logfile_transfer_methods_2(Rest,RTStates,[Node|FetchAcc],CopyAcc);
+ false -> % Then we want to use fetch instead.
+ find_logfile_transfer_methods_2(Rest,RTStates,[Node|FetchAcc],CopyAcc)
+ end;
+find_logfile_transfer_methods_2([],_,FetchAcc,CopyAcc) ->
+ {FetchAcc,CopyAcc}.
+%% ------------------------------------------------------------------------------
+
+%% Help function which transferes all local logfiles according to the tracerdata
+%% stored for the nodes in Nodes.
+%% Returns {ok,FailedNodes,FileNodeSpecs} or {error,Reason}.
+%% FailedNodes is a list of nodes where fetching logs did not succeed, partially
+%% or not at all.
+%% FileNames is a list of list of actually fetched files (the name as it is here, including
+%% Dir). The sublists are files which belong together.
+fetch_logfiles_distributed(CtrlNode,Dir,Prefix,TRDstorage,Dbg,Nodes) ->
+ LogSpecList=build_logspeclist(Nodes,TRDstorage),
+ case inviso_fetch_log(inviso_tool_lib:inviso_cmd(CtrlNode,
+ fetch_log,
+ [LogSpecList,Dir,Prefix])) of
+ {ok,Result} ->
+ Files=get_all_filenames_fetchlog_result(Result,Dbg),
+ FailedNodes=get_all_failednodes_fetchlog_result(Result),
+ {ok,FailedNodes,Files};
+ {error,Reason} -> % Some general failure!
+ {error,{fetch_log,Reason}}
+ end.
+
+%% Help function which constructs a list {Node,TracerData} for all nodes in Nodes.
+%% Note that there may be more than one tracerdata for a node, resulting in multiple
+%% tuples for that node.
+build_logspeclist(Nodes,TRDstorage) ->
+ build_logspeclist_2(Nodes,TRDstorage,[]).
+
+build_logspeclist_2([Node|Rest],TRDstorage,Acc) ->
+ TRDlist=find_tracerdata_for_node_trd(Node,TRDstorage), % A list of all tracerdata.
+ build_logspeclist_2(Rest,
+ TRDstorage,
+ [lists:map(fun(TRD)->{Node,TRD} end,TRDlist)|Acc]);
+build_logspeclist_2([],_,Acc) ->
+ lists:flatten(Acc).
+
+%% Help function which translates inviso:fetch_log return values to what I
+%% want!
+inviso_fetch_log({error,Reason}) ->
+ {error,Reason};
+inviso_fetch_log({_Success,ResultList}) ->
+ {ok,ResultList}.
+
+%% Help function which collects all filenames mentioned in a noderesult structure.
+%% The files may or may not be complete.
+%% Returns a list of list of filenames. Each sublist contains files which belong
+%% together, i.e because they are a wrap-set.
+get_all_filenames_fetchlog_result(NodeResult,Dbg) ->
+ get_all_filenames_fetchlog_result_2(NodeResult,Dbg,[]).
+
+get_all_filenames_fetchlog_result_2([{Node,{Success,FileInfo}}|Rest],Dbg,Accum)
+ when Success=/=error, list(FileInfo) ->
+ SubAccum=get_all_filenames_fetchlog_result_3(FileInfo,[]),
+ get_all_filenames_fetchlog_result_2(Rest,Dbg,[{Node,SubAccum}|Accum]);
+get_all_filenames_fetchlog_result_2([{Node,{error,FReason}}|Rest],Dbg,Accum) ->
+ inviso_tool_lib:debug(fetch_files,Dbg,[Node,FReason]),
+ get_all_filenames_fetchlog_result_2(Rest,Dbg,Accum);
+get_all_filenames_fetchlog_result_2([],_Dbg,Accum) ->
+ Accum.
+
+get_all_filenames_fetchlog_result_3([{FType,Files}|Rest],SubAccum) ->
+ FilesOnly=lists:foldl(fun({ok,FName},Acc)->[FName|Acc];(_,Acc)->Acc end,[],Files),
+ get_all_filenames_fetchlog_result_3(Rest,[{FType,FilesOnly}|SubAccum]);
+get_all_filenames_fetchlog_result_3([],SubAccum) ->
+ SubAccum.
+
+%% Help function which traverses a noderesult and builds a list as return
+%% value containing the nodenames of all nodes not being complete.
+%% Note that a node may occur multiple times since may have fetched logfiles
+%% for several tracerdata from the same node. Makes sure the list contains
+%% unique node names.
+%% Returns a list nodes.
+get_all_failednodes_fetchlog_result(NodeResult) ->
+ get_all_failednodes_fetchlog_result_2(NodeResult,[]).
+
+get_all_failednodes_fetchlog_result_2([{_Node,{complete,_}}|Rest],Acc) ->
+ get_all_failednodes_fetchlog_result_2(Rest,Acc);
+get_all_failednodes_fetchlog_result_2([{Node,{_Severity,_}}|Rest],Acc) ->
+ case lists:member(Node,Acc) of
+ true -> % Already in the list.
+ get_all_failednodes_fetchlog_result_2(Rest,Acc);
+ false -> % Not in Acc, add it!
+ get_all_failednodes_fetchlog_result_2(Rest,[Node|Acc])
+ end;
+get_all_failednodes_fetchlog_result_2([],Acc) ->
+ Acc.
+%% ------------------------------------------------------------------------------
+
+%% Help function which copies files from one location to Dir and at the same time
+%% adds the Prefix to the filename. NodeSpecs contains full path to the files. The
+%% reason the node information is still part of NodeSpecs is that otherwise we can
+%% not report faulty nodes. Note that one node may occur multiple times since there
+%% may be more than one tracerdata for a node.
+%% Returns {FailedNodes,Files} where FailedNodes is a list of nodes where problems
+%% occurred. Files is a tuple list of [{Node,[{FType,FileNames},...]},...].
+fetch_logfiles_copy(CtrlNode,Dir,Prefix,TRDstorage,Dbg,NodeSpecs) ->
+ CopySpecList=build_copylist(CtrlNode,Dbg,NodeSpecs,TRDstorage),
+ fetch_logfiles_copy_2(Dir,Prefix,Dbg,CopySpecList,[],[]).
+
+fetch_logfiles_copy_2(Dir,Prefix,Dbg,[{Node,CopySpecs}|Rest],FailedNodes,Files) ->
+ case fetch_logfiles_copy_3(Dir,Prefix,Dbg,CopySpecs,[],0) of
+ {0,LocalFiles} -> % Copy went ok and zero errors.
+ fetch_logfiles_copy_2(Dir,Prefix,Dbg,Rest,FailedNodes,[{Node,LocalFiles}|Files]);
+ {_N,LocalFiles} -> % Copied files, but some went wrong.
+ case lists:member(Node,FailedNodes) of
+ true -> % Node already in FailedNodes.
+ fetch_logfiles_copy_2(Dir,Prefix,Dbg,Rest,FailedNodes,
+ [{Node,LocalFiles}|Files]);
+ false -> % Node not marked as failed, yet.
+ fetch_logfiles_copy_2(Dir,Prefix,Dbg,Rest,[Node|FailedNodes],
+ [{Node,LocalFiles}|Files])
+ end
+ end;
+fetch_logfiles_copy_2(_,_,_,[],FailedNodes,Files) ->
+ {FailedNodes,Files}. % The return value from fetch_logfiles_copy.
+
+fetch_logfiles_copy_3(Dir,Prefix,Dbg,[{FType,RemoteFiles}|Rest],Results,Errors) ->
+ {Err,LocalFiles}=fetch_logfiles_copy_3_1(Dir,Prefix,Dbg,RemoteFiles,[],0),
+ fetch_logfiles_copy_3(Dir,Prefix,Dbg,Rest,[{FType,LocalFiles}|Results],Errors+Err);
+fetch_logfiles_copy_3(_,_,_,[],Results,Errors) ->
+ {Errors,Results}.
+
+%% For each file of one file-type (e.g. trace_log).
+fetch_logfiles_copy_3_1(Dir,Prefix,Dbg,[File|Rest],LocalFiles,Errors) ->
+ DestName=Prefix++filename:basename(File),
+ Destination=filename:join(Dir,DestName),
+ case do_copy_file(File,Destination) of
+ ok ->
+ fetch_logfiles_copy_3_1(Dir,Prefix,Dbg,Rest,[DestName|LocalFiles],Errors);
+ {error,Reason} ->
+ inviso_tool_lib:debug(copy_files,Dbg,[File,Destination,Reason]),
+ fetch_logfiles_copy_3_1(Dir,Prefix,Dbg,Rest,LocalFiles,Errors+1)
+ end;
+fetch_logfiles_copy_3_1(_,_,_,[],LocalFiles,Errors) ->
+ {Errors,LocalFiles}.
+
+%% Help function which builds a [{Node,[{Type,[ListOfRemoteFiles]}},...}]
+%% where Type describes trace_log or ti_log and each entry in ListOfRemoteFiles
+%% is a complete path to a file to be copied.
+build_copylist(CtrlNode,Dbg,NodeSpecList,TRDstorage) ->
+ build_copylist_2(CtrlNode,Dbg,NodeSpecList,TRDstorage,[]).
+
+%% For each node specified in the NodeSpecList.
+build_copylist_2(CtrlNode,Dbg,[{Node,SourceDir}|Rest],TRDstorage,Acc) ->
+ TRDlist=find_tracerdata_for_node_trd(Node,TRDstorage),
+ CopySpecList=build_copylist_3(CtrlNode,Dbg,SourceDir,Node,TRDlist),
+ build_copylist_2(CtrlNode,Dbg,Rest,TRDstorage,[CopySpecList|Acc]);
+build_copylist_2(_,_,[],_,Acc) ->
+ lists:flatten(Acc).
+
+%% For each tracerdata found for the node.
+build_copylist_3(void,Dbg,SourceDir,Node,[TRD|Rest]) -> % The non-distributed case.
+ case inviso:list_logs(TRD) of
+ {ok,FileSpec} when list(FileSpec) -> % [{trace_log,Dir,Files},...]
+ NewFileSpec=build_copylist_4(SourceDir,FileSpec,[]),
+ [{Node,NewFileSpec}|build_copylist_3(void,Dbg,SourceDir,Node,Rest)];
+ {ok,no_log} -> % This tracedata not associated with any log.
+ build_copylist_3(void,Dbg,SourceDir,Node,Rest);
+ {error,Reason} ->
+ inviso_tool_lib:debug(list_logs,Dbg,[Node,TRD,Reason]),
+ build_copylist_3(void,Dbg,SourceDir,Node,Rest)
+ end;
+build_copylist_3(CtrlNode,Dbg,SourceDir,Node,[TRD|Rest]) -> % The distributed case.
+ case inviso_tool_lib:inviso_cmd(CtrlNode,list_logs,[[{Node,TRD}]]) of
+ {ok,[{Node,{ok,FileSpec}}]} when list(FileSpec) ->
+ NewFileSpec=build_copylist_4(SourceDir,FileSpec,[]),
+ [{Node,NewFileSpec}|build_copylist_3(CtrlNode,Dbg,SourceDir,Node,Rest)];
+ {ok,[{Node,{ok,no_log}}]} -> % It relays to another node, no files!
+ build_copylist_3(CtrlNode,Dbg,SourceDir,Node,Rest);
+ {ok,[{Node,{error,Reason}}]} ->
+ inviso_tool_lib:debug(list_logs,Dbg,[Node,TRD,Reason]),
+ build_copylist_3(CtrlNode,Dbg,SourceDir,Node,Rest);
+ {error,Reason} -> % Some general failure.
+ inviso_tool_lib:debug(list_logs,Dbg,[Node,TRD,Reason]),
+ build_copylist_3(CtrlNode,Dbg,SourceDir,Node,Rest)
+ end;
+build_copylist_3(_,_,_,_,[]) ->
+ [].
+
+%% Help function which makes a [{Type,Files},...] list where each file in Files
+%% is with full path as found from our file-system.
+build_copylist_4(SourceDir,[{Type,_Dir,Files}|Rest],Accum) ->
+ NewFiles=
+ lists:foldl(fun(FName,LocalAcc)->[filename:join(SourceDir,FName)|LocalAcc] end,
+ [],
+ Files),
+ build_copylist_4(SourceDir,Rest,[{Type,NewFiles}|Accum]);
+build_copylist_4(_,[],Accum) ->
+ Accum.
+
+
+%% Help function which copies a file using os:cmd.
+%% Returns 'ok' or {error,Reason}.
+do_copy_file(Source,Destination) ->
+ case os:type() of
+ {win32,_} ->
+ os:cmd("copy "++Source++" "++Destination), % Perhaps a test on success?
+ ok;
+ {unix,_} ->
+ os:cmd("cp "++Source++" "++Destination), % Perhaps a test on success?
+ ok
+ end.
+%% ------------------------------------------------------------------------------
+
+
+%% ------------------------------------------------------------------------------
+
+%% ==============================================================================
+%% Various help functions.
+%% ==============================================================================
+
+%% Help function going through the Nodes list and checking that only nodes
+%% mentioned in OurNodes gets returned. It also makes the nodes in the return
+%% value unique.
+remove_nodes_not_ours(Nodes,OurNodes) ->
+ remove_nodes_not_ours_2(Nodes,OurNodes,[],[]).
+
+remove_nodes_not_ours_2([Node|Rest],OurNodes,OurAcc,OtherAcc) ->
+ case lists:member(Node,OurNodes) of
+ true -> % Ok it is one of our nodes.
+ case lists:member(Node,OurAcc) of
+ true -> % Already in the list, skip.
+ remove_nodes_not_ours_2(Rest,OurNodes,OurAcc,OtherAcc);
+ false ->
+ remove_nodes_not_ours_2(Rest,OurNodes,[Node|OurAcc],OtherAcc)
+ end;
+ false ->
+ case lists:member(Node,OtherAcc) of
+ true ->
+ remove_nodes_not_ours_2(Rest,OurNodes,OurAcc,OtherAcc);
+ false ->
+ remove_nodes_not_ours_2(Rest,OurNodes,OurAcc,[Node|OtherAcc])
+ end
+ end;
+remove_nodes_not_ours_2([],_,OurAcc,OtherAcc) ->
+ {lists:reverse(OurAcc),lists:reverse(OtherAcc)}.
+%% ------------------------------------------------------------------------------
+
+%% Help function which returns 'true' or 'false' depending on if TracerData is
+%% meant to be used by the session handler (true) or if it supposed to be passed
+%% on to the trace system.
+is_tool_internal_tracerdata(_) -> % CURRENTLY NO INTERNAL TRACER DATA!
+ false.
+%% ------------------------------------------------------------------------------
+
+%% Help function which checks that all nodes in the first list of nodes exists
+%% in the second list of nodes. Returns 'true' or 'false'. The latter if as much
+%% as one incorrect node was found.
+check_our_nodes([Node|Rest],AllNodes) ->
+ case lists:member(Node,AllNodes) of
+ true ->
+ check_our_nodes(Rest,AllNodes);
+ false -> % Then we can stop right here.
+ false
+ end;
+check_our_nodes([],_) ->
+ true.
+%% ------------------------------------------------------------------------------
+
+%% Help function which checks that a directory actually exists. Returns 'true' or
+%% 'false'.
+check_directory_exists(Dir) ->
+ case file:read_file_info(Dir) of
+ {ok,#file_info{type=directory}} ->
+ true;
+ _ -> % In all other cases it is not valid.
+ false
+ end.
+%% ------------------------------------------------------------------------------
+
+%% This function stops the tracing on all nodes in Nodes. Preferably Nodes is a list
+%% of only tracing runtime components. Not that there will actually be any difference
+%% since the return value does not reflect how stopping the nodes went.
+%% Returns 'ok' or {error,Reason}, the latter only in case of general failure.
+stop_all_tracing(void,Dbg,[?LOCAL_RUNTIME]) -> % The non-distributed case, and is tracing.
+ case inviso:stop_tracing() of
+ {ok,_State} ->
+ ok;
+ {error,Reason} -> % We actually don't care.
+ inviso_tool_lib:debug(stop_tracing,Dbg,[?LOCAL_RUNTIME,Reason]),
+ ok
+ end;
+stop_all_tracing(void,_,_) -> % There is no local runtime started.
+ ok;
+stop_all_tracing(CtrlNode,Dbg,Nodes) ->
+ case inviso_tool_lib:inviso_cmd(CtrlNode,stop_tracing,[Nodes]) of
+ {ok,Result} -> % The result is only used for debug.
+ Failed=lists:foldl(fun({N,{error,Reason}},Acc)->[{N,{error,Reason}}|Acc];
+ (_,Acc)->Acc
+ end,
+ [],
+ Result),
+ if
+ Failed==[] ->
+ ok;
+ true ->
+ inviso_tool_lib:debug(stop_tracing,Dbg,[Nodes,Failed]),
+ ok
+ end;
+ {error,Reason} ->
+ {error,{stop_tracing,Reason}}
+ end.
+%% ------------------------------------------------------------------------------
+
+%% Help function removing all local logs using the tracerdata to determine what
+%% logs to remove from where.
+%% There is no significant return value since it is not really clear what to do
+%% if removal went wrong. The function can make debug-reports thought.
+remove_all_local_logs(CtrlNode,TRDstorage,Nodes,Dbg) ->
+ LogSpecList=build_logspeclist_remove_logs(Nodes,TRDstorage),
+ case inviso_tool_lib:inviso_cmd(CtrlNode,delete_log,[LogSpecList]) of
+ {ok,Results} ->
+ case look_for_errors_resultlist(Results) of
+ [] -> % No errors found in the result!
+ true;
+ Errors ->
+ inviso_tool_lib:debug(remove_all_local_logs,Dbg,[Errors]),
+ true
+ end;
+ {error,Reason} -> % Some general error.
+ inviso_tool_lib:debug(remove_all_local_logs,Dbg,[{error,Reason}]),
+ true
+ end.
+
+%% Help function which puts together a list of {Node,Tracerdata} tuples. Note that
+%% we must build one tuple for each tracerdata for one node.
+build_logspeclist_remove_logs(Nodes,TRDstorage) ->
+ [{Node,TracerData}||Node<-Nodes,TracerData<-find_tracerdata_for_node_trd(Node,TRDstorage)].
+%% ------------------------------------------------------------------------------
+
+%% Help function which traverses a resultlist from an inviso function. Such are
+%% built up as [{Node,SubResults},...] where SubResult is a list of tuples for each
+%% file-type (e.g trace_log) {FType,FileList} where a FileList is either {error,Reason}
+%% or {ok,FileName}.
+%% Returns a list of {Node,[{error,Reason},...]}.
+look_for_errors_resultlist([{Node,{error,Reason}}|Rest]) ->
+ [{Node,{error,Reason}}|look_for_errors_resultlist(Rest)];
+look_for_errors_resultlist([{Node,{ok,NResults}}|Rest]) when list(NResults) ->
+ case look_for_errors_resultlist_2(NResults,[]) of
+ [] ->
+ look_for_errors_resultlist(Rest);
+ Errors -> % A list of lists.
+ [{Node,lists:flatten(Errors)}|look_for_errors_resultlist(Rest)]
+ end;
+look_for_errors_resultlist([_|Rest]) ->
+ look_for_errors_resultlist(Rest);
+look_for_errors_resultlist([]) ->
+ [].
+
+look_for_errors_resultlist_2([{_FType,NSubResult}|Rest],Accum) ->
+ case lists:filter(fun({error,_Reason})->true;(_)->false end,NSubResult) of
+ [] -> % No errors for this node.
+ look_for_errors_resultlist_2(Rest,Accum);
+ Errors -> % A list of at least one error.
+ look_for_errors_resultlist_2(Rest,[Errors|Accum])
+ end;
+look_for_errors_resultlist_2([],Accum) ->
+ Accum.
+%% ------------------------------------------------------------------------------
+
+
+%% ------------------------------------------------------------------------------
+%% Functions working on the loopdata structure.
+%% Its main purpose is to store information about runtime components participating
+%% in the session and their current status.
+%% ------------------------------------------------------------------------------
+
+-record(ld,{parent,
+ ctrlnode,
+ ctrlpid, % To where to send inviso cmd.
+ rtstates,
+ tracerdata,
+ safetycatches,
+ dbg,
+ actstorage % Activity storage, for reactivate.
+ }).
+
+%% Function creating the initial datastructure.
+%% The datastructure is [{Node,State},...].
+%%
+%% The tracerdata table is a bag simply for the reason that if we try to insert
+%% the same tracerdata for a node twice, we will end up with one tracerdata after
+%% all. This is useful when we insert tracerdata ourselves, the tracerdata will
+%% come as a state-change too.
+mk_ld(Parent,CtrlNode,CtrlPid,RTStates,NodeParams,OtherNodes,SafetyCatches,Dbg) ->
+ TRDtableName=list_to_atom("inviso_tool_sh_trdstorage_"++pid_to_list(self())),
+ TRDtid=ets:new(TRDtableName,[bag]),
+ ACTtableName=list_to_atom("inviso_tool_sh_actstorage_"++pid_to_list(self())),
+ ACTtid=ets:new(ACTtableName,[bag]),
+ mk_ld_fill_tracerdata(CtrlNode,TRDtid,NodeParams,OtherNodes), % Fill the ETS table.
+ #ld{parent=Parent, % The tool main process.
+ ctrlnode=CtrlNode, % Node name where the control component is.
+ ctrlpid=CtrlPid, % The process id of the control component.
+ rtstates=RTStates, % All nodes and their state/status.
+ tracerdata=TRDtid,
+ safetycatches=SafetyCatches,
+ dbg=Dbg,
+ actstorage=ACTtid
+ }.
+
+%% Help function which inserts tracer data for the nodes. Note that we can get
+%% tracer data either from the return value from init_tracing or by asking the
+%% node for it. The latter is necessary for the nodes which were marked not to
+%% be initiated by the session handler. This maybe because those nodes have
+%% autostarted.
+mk_ld_fill_tracerdata(CtrlNode,TId,NodeParams,OtherNodes) ->
+ mk_ld_fill_tracerdata_nodeparams(TId,NodeParams),
+ mk_ld_fill_tracerdata_othernodes(CtrlNode,TId,OtherNodes).
+
+mk_ld_fill_tracerdata_nodeparams(TId,[{Node,TracerData}|Rest]) ->
+ ets:insert(TId,{Node,TracerData}),
+ mk_ld_fill_tracerdata_nodeparams(TId,Rest);
+mk_ld_fill_tracerdata_nodeparams(_,[]) ->
+ ok.
+
+mk_ld_fill_tracerdata_othernodes(_,_,[]) -> % Then not necessary to do anything.
+ ok;
+mk_ld_fill_tracerdata_othernodes(void,TId,[Node]) -> % The non-distributed case.
+ case inviso:get_tracerdata() of
+ {error,_Reason} -> % Perhaps in state new or disconnected.
+ ok; % Do nothing.
+ {ok,TracerData} ->
+ ets:insert(TId,{Node,TracerData})
+ end;
+mk_ld_fill_tracerdata_othernodes(CtrlNode,TId,Nodes) ->
+ case inviso_tool_lib:invisomd(CtrlNode,get_tracerdata,[Nodes]) of
+ {ok,Results} ->
+ mk_ld_fill_tracerdata_othernodes_2(TId,Results);
+ {error,_Reason} -> % Strange, we will probably crash later.
+ ok
+ end.
+
+mk_ld_fill_tracerdata_othernodes_2(TId,[{_Node,{ok,no_tracerdata}}|Rest]) ->
+ mk_ld_fill_tracerdata_othernodes_2(TId,Rest); % It was not initiated then!
+mk_ld_fill_tracerdata_othernodes_2(TId,[{Node,{ok,TracerData}}|Rest]) ->
+ ets:insert(TId,{Node,TracerData}),
+ mk_ld_fill_tracerdata_othernodes_2(TId,Rest);
+mk_ld_fill_tracerdata_othernodes_2(_,[]) ->
+ ok.
+%% ------------------------------------------------------------------------------
+
+get_ctrlnode_ld(#ld{ctrlnode=CtrlNode}) ->
+ CtrlNode.
+%% ------------------------------------------------------------------------------
+
+
+get_ctrlpid_ld(#ld{ctrlpid=CtrlPid}) ->
+ CtrlPid.
+%% ------------------------------------------------------------------------------
+
+get_rtstates_ld(#ld{rtstates=RTStates}) ->
+ RTStates.
+
+put_rtstates_ld(NewRTStates,LD) ->
+ LD#ld{rtstates=NewRTStates}.
+%% ------------------------------------------------------------------------------
+
+get_trdstorage_ld(#ld{tracerdata=TId}) ->
+ TId.
+
+put_trdstorage_ld(_NewTId,LD) ->
+ LD.
+%% ------------------------------------------------------------------------------
+
+%% Help function which adds the current tracerdata of node Node to the tracerdata
+%% storage. We only want to add tracerdata we have not seen before. We therefore
+%% avoid adding it if the node already is in state ?TRACING.
+%% Returns a new tracerdata (what ever it is)!
+add_current_tracerdata_ld(CtrlNode,Node,RTStates,TId) ->
+ case get_statestatus_rtstates(Node,RTStates) of
+ {ok,{?TRACING,_}} -> % Then we have already added the tracerdata.
+ TId; % Then do nothing.
+ {ok,_} -> % Since we were not tracing before.
+ case add_current_tracerdata_ld_fetchtracerdata(CtrlNode,Node) of
+ {ok,TracerData} ->
+ ets:insert(TId,{Node,TracerData});
+ no_tracerdata -> % Strange, how could we become tracing
+ ok;
+ {error,_Reason} -> % The node perhaps disconnected!?
+ ok
+ end;
+ false -> % Very strange, not our node!
+ ok % Do nothing.
+ end.
+
+add_current_tracerdata_ld_fetchtracerdata(void,_Node) ->
+ case inviso:get_tracerdata() of
+ {ok,TracerData} ->
+ {ok,TracerData};
+ {error,no_tracerdata} ->
+ no_tracerdata;
+ {error,Reason} ->
+ {error,Reason}
+ end;
+add_current_tracerdata_ld_fetchtracerdata(CtrlNode,Node) ->
+ case inviso_tool_lib:inviso_cmd(CtrlNode,get_tracerdata,[[Node]]) of
+ {ok,[{Node,{ok,TracerData}}]} ->
+ {ok,TracerData};
+ {ok,[{Node,{error,no_tracerdata}}]} ->
+ no_tracerdata;
+ {ok,[{Node,{error,Reason}}]} ->
+ {error,Reason};
+ {error,Reason} ->
+ {error,Reason}
+ end.
+%% ------------------------------------------------------------------------------
+
+
+get_safetycatches_ld(#ld{safetycatches=SCs}) ->
+ SCs.
+%% ------------------------------------------------------------------------------
+
+get_dbg_ld(#ld{dbg=Dbg}) ->
+ Dbg.
+%% ------------------------------------------------------------------------------
+
+get_actstorage_ld(#ld{actstorage=ACTstorage}) ->
+ ACTstorage.
+
+put_actstorage_ld(_NewACTstorage,LD) ->
+ LD.
+%% ------------------------------------------------------------------------------
+
+
+
+%% ------------------------------------------------------------------------------
+%% Functions working on the rtstates structure (which is a substructure of loopdata).
+%% It is either:
+%% [{Node,StateStatus,Opts},...]
+%% Node is either the node name of the runtime component erlang node or
+%% ?LOCAL_RUNTIME as returned from the trace control component.
+%% StateStatus is {State,Status}, 'unavailable' or 'unknown'.
+%% Status is the returnvalue from trace control component.
+%% i.e: running | {suspended,Reason}
+%% ------------------------------------------------------------------------------
+
+%% Function contructing an rtstates structure from a list of [{Node,StateStatus,Opts},...].
+to_rtstates(ListOfStates) when list(ListOfStates) ->
+ ListOfStates.
+%% ------------------------------------------------------------------------------
+
+%% Function which takes a rtstates structure and returns a list of [{Node,StateStatus},...].
+from_rtstates(RTStates) ->
+ RTStates.
+%% ------------------------------------------------------------------------------
+
+%% Function which takes an rtstates structure and a result as returned from
+%% init_tracing. The RTStates is modified for the nodes that changed state as a
+%% result of successful init_tracing.
+%% Returns a new RTStates.
+set_tracing_rtstates([E={Node,_StateStatus,Opts}|Rest],Result) ->
+ case lists:keysearch(Node,1,Result) of
+ {value,{_,ok}} -> % Means state-change to tracing!
+ [{Node,{tracing,running},Opts}|set_tracing_rtstates(Rest,Result)];
+ _ -> % Otherwise, leave it as is.
+ [E|set_tracing_rtstates(Rest,Result)]
+ end;
+set_tracing_rtstates([],_Result) ->
+ [].
+%% ------------------------------------------------------------------------------
+
+%% Function updating the state/status for a certain runtime component.
+%% Returns a new RTStates structure. Note that Node must not necessarily be one
+%% of the nodes in the session. Meaning that Node shall not be added to RTStates
+%% should it not already be in there.
+statechange_rtstates(Node,State,Status,RTStates) when list(RTStates) ->
+ case lists:keysearch(Node,1,RTStates) of
+ {value,{_,_,Opts}} ->
+ lists:keyreplace(Node,1,RTStates,{Node,{State,Status},Opts});
+ _ -> % Then Node does not exist.
+ RTStates % Just keep it as is, as keyreplace would have done.
+ end.
+%% ------------------------------------------------------------------------------
+
+%% Function updating the state/status for a certain runtime component. The
+%% state/status is set to 'unavailable'.
+%% Returns a new RTStates structure.
+set_unavailable_rtstates(Node,RTStates) when list(RTStates) ->
+ case lists:keysearch(Node,1,RTStates) of
+ {value,{_,_,Opts}} ->
+ lists:keyreplace(Node,1,RTStates,{Node,unavailable,Opts});
+ _ -> % Then Node does not exist.
+ RTStates % Just keep it as is, as keyreplace would have done.
+ end.
+%% ------------------------------------------------------------------------------
+
+%% Function finding the statestatus associated with Node in the RTStates structure.
+%% Returns {ok,StateStatus} or 'false'.
+get_statestatus_rtstates(Node,RTStates) ->
+ case lists:keysearch(Node,1,RTStates) of
+ {value,{_,StateStatus,_}} ->
+ {ok,StateStatus};
+ false ->
+ false
+ end.
+%% ------------------------------------------------------------------------------
+
+%% Help function which returns a list of all nodes that are currently marked
+%% as available to us in the runtime state structure.
+get_all_available_nodes_rtstates(RTStates) ->
+ get_all_session_nodes_rtstates(lists:filter(fun({_N,unavailable,_})->false;
+ (_)->true
+ end,
+ RTStates)).
+%% ------------------------------------------------------------------------------
+
+%% Help function returning a list of all nodes belonging to this session.
+get_all_session_nodes_rtstates(RTStates) ->
+ lists:map(fun({Node,_,_})->Node end,RTStates).
+%% ------------------------------------------------------------------------------
+
+%% Function which returns a list of nodes that are indicated as tracing in the
+%% RTStates structure.
+get_all_tracing_nodes_rtstates(RTStates) ->
+ lists:map(fun({N,_,_})->N end,
+ lists:filter(fun({_,{tracing,_},_})->true;(_)->false end,RTStates)).
+%% ------------------------------------------------------------------------------
+
+%% Returns the options associated with Node in the RTStates structure.
+get_opts_rtstates(Node,RTStates) ->
+ case lists:keysearch(Node,1,RTStates) of
+ {value,{_,_,Opts}} ->
+ {ok,Opts};
+ false ->
+ false
+ end.
+
+%% ------------------------------------------------------------------------------
+%% Functions working on the tracerdata structure, which is a part of the loopdata.
+%% The tracerdata structure is an ETS-table of type bag storing:
+%% {Node,TracerData}.
+%% Note that there can of course be multiple entries for a node.
+%% ------------------------------------------------------------------------------
+
+%% Help function which takes a tracerdata loopdata structure and returns a list
+%% of all stored tracerdata for a certain Node.
+find_tracerdata_for_node_trd(Node,TRD) ->
+ case ets:lookup(TRD,Node) of
+ Result when list(Result) ->
+ lists:map(fun({_Node,TracerData})->TracerData end,Result);
+ _ -> % Should probably never happend.
+ []
+ end.
+%% ------------------------------------------------------------------------------
+
+
+%% ------------------------------------------------------------------------------
+%% Functions working on the activity storage structure, which is part of the
+%% loopdata. It stores entries about things that needs to be "redone" in case
+%% of a reactivation of the node. The time order is also important.
+%% Note that for every ActivityType there must be a "handler" in the reactivation
+%% functionality.
+%%
+%% The structure is a bag of {Node,ActivityType,What}.
+%% ActivityType/What=tf/{Op,TraceConfList}|tpm/{Op,[Mod,Func,Arity,MS,CallFunc]}
+%% /{Op,[Mod,Func,Arity,MS,CallFunc,ReturnFunc]}
+%% /{Op,[]}
+%% TraceConfList=[{Proc,Flags},...]
+%% How=true|false
+%% ------------------------------------------------------------------------------
+
+%% Function that adds meta-pattern activities to the activity storage. Note
+%% that one of the parameters to the function is a return value from an
+%% inviso call. In that way we do not enter activities that were unsuccessful.
+%% Op can be either the setting or clearing of a meta pattern.
+%% Returns a new ACTstorage.
+add_tpm_actstorage([{Node,ok}|Rest],Op,InvisoCmdParams,ACTstorage) ->
+ true=ets:insert(ACTstorage,{Node,tpm,{Op,InvisoCmdParams}}),
+ add_tpm_actstorage(Rest,Op,InvisoCmdParams,ACTstorage);
+add_tpm_actstorage([_|Rest],Op,InvisoCmdParams,ACTstorage) ->
+ add_tpm_actstorage(Rest,Op,InvisoCmdParams,ACTstorage);
+add_tpm_actstorage([],_,_,ACTstorage) ->
+ ACTstorage.
+
+%% Function that adds process trace-flags to the activity storage. Note that one
+%% of the parameters is the return value from an inviso function. Meaning that
+%% if the flags failed in their entirety, no activity will be saved. If only
+%% some of the flags failed, we will not go through the effort of trying to find
+%% out exactly which.
+%% Returns a new activity storage structure.
+add_tf_actstorage([{_Node,{error,_Reason}}|Rest],Op,TraceConfList,ACTstorage) ->
+ add_tf_actstorage(Rest,Op,TraceConfList,ACTstorage);
+add_tf_actstorage([{Node,_Result}|Rest],Op,TraceConfList,ACTstorage) ->
+ true=ets:insert(ACTstorage,{Node,tf,{Op,TraceConfList}}),
+ add_tf_actstorage(Rest,Op,TraceConfList,ACTstorage);
+add_tf_actstorage([],_,_,ACTstorage) ->
+ ACTstorage.
+%% ------------------------------------------------------------------------------
+
+%% Finds all activities associated with Node. Returns a list of them in the
+%% same order as they were inserted.
+get_activities_actstorage(Node,ACTstorage) ->
+ case ets:lookup(ACTstorage,Node) of
+ [] ->
+ false;
+ Result when list(Result) ->
+ {ok,lists:map(fun({_N,Type,What})->{Type,What} end,Result)}
+ end.
+%% ------------------------------------------------------------------------------
+
+%% Function removing all activity entries associated with Node. This is useful
+%% if the Node disconnects for instance.
+del_node_actstorage(Node,ACTstorage) ->
+ ets:delete(ACTstorage,Node),
+ ACTstorage.
+%% ------------------------------------------------------------------------------
+
diff --git a/lib/inviso/test/Makefile b/lib/inviso/test/Makefile
index 27fe99703a..c1df29d631 100644
--- a/lib/inviso/test/Makefile
+++ b/lib/inviso/test/Makefile
@@ -52,8 +52,8 @@ release_spec: opt
release_tests_spec: make_emakefile
$(INSTALL_DIR) $(RELSYSDIR)
- $(INSTALL_DATA) inviso.spec $(ERL_FILES) $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ $(INSTALL_DATA) inviso.spec inviso.cover $(ERL_FILES) $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
@tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
release_docs_spec:
diff --git a/lib/inviso/test/inviso.cover b/lib/inviso/test/inviso.cover
new file mode 100644
index 0000000000..e23b9fa59b
--- /dev/null
+++ b/lib/inviso/test/inviso.cover
@@ -0,0 +1,2 @@
+{incl_app,inviso,details}.
+
diff --git a/lib/inviso/test/inviso.spec b/lib/inviso/test/inviso.spec
index d655771d64..49f9b0b460 100644
--- a/lib/inviso/test/inviso.spec
+++ b/lib/inviso/test/inviso.spec
@@ -1 +1 @@
-{topcase, {dir, "../inviso_test"}}.
+{suites,"../inviso_test",all}.
diff --git a/lib/inviso/test/inviso_tool_SUITE.erl b/lib/inviso/test/inviso_tool_SUITE.erl
index 206e117c86..6b16e506eb 100644
--- a/lib/inviso/test/inviso_tool_SUITE.erl
+++ b/lib/inviso/test/inviso_tool_SUITE.erl
@@ -1,45 +1,54 @@
-% ``The contents of this file are subject to the Erlang Public License,
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2011. 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 via the world wide web at http://www.erlang.org/.
-%%
+%% 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.
-%%
-%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
-%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
-%% AB. All Rights Reserved.''
-%%
-%% $Id$
+%%
+%% %CopyrightEnd%
+%%
%%
%% Description:
%% Test suite for the inviso_tool. It is here assumed that inviso works
%% properly.
%%
%% Authors:
-%% Lennart �hman, [email protected]
+%% Lennart Öhman, [email protected]
%% -----------------------------------------------------------------------------
-module(inviso_tool_SUITE).
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include_lib("kernel/include/file.hrl").
-define(l,?line).
-all(suite) ->
- [
- dist_basic_1,
- dist_rtc,
- dist_reconnect,
- dist_adopt,
- dist_history,
- dist_start_session_special
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [dist_basic_1, dist_rtc, dist_reconnect, dist_adopt,
+ dist_history, dist_start_session_special].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%% -----------------------------------------------------------------------------
init_per_suite(Config) ->
@@ -89,26 +98,26 @@ init_per_testcase(_Case,Config) ->
insert_timetraphandle_config(TH,NewConfig2).
%% -----------------------------------------------------------------------------
-fin_per_testcase(_Case,Config) ->
+end_per_testcase(_Case,Config) ->
?l test_server:stop_node(get_remotenode_config(inviso1,Config)),
?l test_server:stop_node(get_remotenode_config(inviso2,Config)),
?l test_server:timetrap_cancel(get_timetraphandle_config(Config)),
?l case whereis(inviso_tool) of % In case inviso_tool did not stop.
- Pid when pid(Pid) ->
+ Pid when is_pid(Pid) ->
?l io:format("Had to kill inviso_tool!~n",[]),
?l exit(Pid,kill);
_ ->
true
end,
?l case whereis(inviso_rt) of % In case we ran a runtime here.
- Pid2 when pid(Pid2) ->
+ Pid2 when is_pid(Pid2) ->
?l io:format("Had to kill inviso_rt!~n",[]),
?l exit(Pid2,kill);
_ ->
true
end,
?l case whereis(inviso_c) of % In case we ran the controll component here.
- Pid3 when pid(Pid3) ->
+ Pid3 when is_pid(Pid3) ->
?l io:format("Had to kill inviso_c!~n",[]),
?l exit(Pid3,kill);
_ ->
@@ -187,7 +196,7 @@ fin_per_testcase(_Case,Config) ->
%% TEST CASE: Basic, distributed, start of inviso_tool with simple tracing.
dist_basic_1(doc) -> ["Simple test"];
dist_basic_1(suite) -> [];
-dist_basic_1(Config) when list(Config) ->
+dist_basic_1(Config) when is_list(Config) ->
RemoteNodes=get_remotenodes_config(Config),
[RegExpNode|_]=RemoteNodes,
CNode=node(),
@@ -220,6 +229,10 @@ dist_basic_1(Config) when list(Config) ->
Nodes),
%% Start a test process at every node with a runtime component.
?l lists:foreach(fun(N)->spawn(N,?MODULE,test_proc_init,[]) end,Nodes),
+
+ %% Let the processes start
+ timer:sleep(100),
+
%% Find the pids of the test processes.
?l TestProcs=lists:map(fun(N)->rpc:call(N,erlang,whereis,[inviso_tool_test_proc]) end,
Nodes),
@@ -312,7 +325,7 @@ dist_basic_1(Config) when list(Config) ->
inviso_tool:get_autostart_data(Nodes,{dependency,infinity}),
?l true=check_noderesults(Nodes,
fun({_N,{ok,{[{dependency,infinity}],{tdg,{_M,_F,TDlist}}}}})
- when list(TDlist)->
+ when is_list(TDlist)->
true;
(_) ->
false
@@ -500,6 +513,10 @@ dist_rtc(Config) when is_list(Config) ->
Nodes),
%% Start a test process at every node with a runtime component.
?l lists:foreach(fun(N)->spawn(N,?MODULE,test_proc_init,[]) end,Nodes),
+
+ %% Let the processes start
+ timer:sleep(100),
+
%% Find the pids of the test processes.
?l TestProcs=lists:map(fun(N)->rpc:call(N,erlang,whereis,[inviso_tool_test_proc]) end,
Nodes),
@@ -537,7 +554,7 @@ dist_rtc(Config) when is_list(Config) ->
%% This test case tests mainly that reconnect and reinitiations of a node works.
dist_reconnect(doc) -> [""];
dist_reconnect(suite) -> [];
-dist_reconnect(Config) when list(Config) ->
+dist_reconnect(Config) when is_list(Config) ->
RemoteNodes=get_remotenodes_config(Config),
[RegExpNode|OtherNodes]=RemoteNodes,
CNode=node(),
@@ -553,6 +570,10 @@ dist_reconnect(Config) when list(Config) ->
?l start_inviso_tool_session(CNode,[],1,Nodes),
%% Start a test process at every node with a runtime component.
?l lists:foreach(fun(N)->spawn(N,?MODULE,test_proc_init,[]) end,Nodes),
+
+ %% Let the processes start
+ timer:sleep(100),
+
%% Find the pids of the test processes.
?l TestProcs=lists:map(fun(N)->rpc:call(N,erlang,whereis,[inviso_tool_test_proc]) end,
Nodes),
@@ -574,7 +595,7 @@ dist_reconnect(Config) when list(Config) ->
%% than RexExpNode.
?l {ok,NodeResults1}=inviso_tool:inviso(tp,["application.*",module_info,0,[]]),
?l true=check_noderesults(OtherNodes,
- fun({_N,{ok,Ints}}) when list(Ints) ->
+ fun({_N,{ok,Ints}}) when is_list(Ints) ->
NrOfModules=lists:sum(Ints),
true;
(_) ->
@@ -589,9 +610,9 @@ dist_reconnect(Config) when list(Config) ->
%% Now it is time to restart the crashed node and reconnect it and then
%% finally reinitiate it.
- ?l RegExpNodeString=atom_to_list(RegExpNode),
- ?l {match,Pos,1}=regexp:first_match(RegExpNodeString,"@"),
- ?l RegExpNodeName=list_to_atom(lists:sublist(RegExpNodeString,Pos-1)),
+ ?l RegExpNodeString=atom_to_list(RegExpNode),
+ ?l [NodeNameString,_HostNameString] = string:tokens(RegExpNodeString,[$@]),
+ ?l RegExpNodeName=list_to_atom(NodeNameString),
?l test_server:start_node(RegExpNodeName,peer,[]),
?l ok=poll(net_adm,ping,[RegExpNode],pong,20),
?l SuiteDir=filename:dirname(code:which(?MODULE)),
@@ -605,7 +626,7 @@ dist_reconnect(Config) when list(Config) ->
?l ok=poll(rpc,
call,
[RegExpNode,erlang,whereis,[inviso_tool_test_proc]],
- fun(P) when pid(P) -> true;
+ fun(P) when is_pid(P) -> true;
(undefined) -> false
end,
10),
@@ -664,7 +685,7 @@ dist_reconnect(Config) when list(Config) ->
%% mark it as tracing-running.
dist_adopt(doc) -> [""];
dist_adopt(suite) -> [];
-dist_adopt(Config) when list(Config) ->
+dist_adopt(Config) when is_list(Config) ->
RemoteNodes=get_remotenodes_config(Config),
[RegExpNode|_]=RemoteNodes,
CNode=node(),
@@ -734,7 +755,7 @@ dist_adopt(Config) when list(Config) ->
%% This test tests that saving and restoring a history works.
dist_history(doc) -> [""];
dist_history(suite) -> [];
-dist_history(Config) when list(Config) ->
+dist_history(Config) when is_list(Config) ->
RemoteNodes=get_remotenodes_config(Config),
[RegExpNode|_]=RemoteNodes,
CNode=RegExpNode, % We use a remote control component.
@@ -883,7 +904,7 @@ dist_history(Config) when list(Config) ->
%% are no nodes that can be initiated or reinitiated.
dist_start_session_special(doc) -> [""];
dist_start_session_special(suite) -> [];
-dist_start_session_special(Config) when list(Config) ->
+dist_start_session_special(Config) when is_list(Config) ->
RemoteNodes=get_remotenodes_config(Config),
[RegExpNode|_]=RemoteNodes,
CNode=RegExpNode, % We use a remote control component.
@@ -998,7 +1019,7 @@ stop_inviso_tool_session(CNode,SessionNr,Nodes) ->
%% Help function checking that there is a Result for each node in Nodes.
%% Returns 'true' if successful.
-check_noderesults(Nodes,Fun,[{Node,Result}|Rest]) when function(Fun) ->
+check_noderesults(Nodes,Fun,[{Node,Result}|Rest]) when is_function(Fun) ->
case Fun({Node,Result}) of
true ->
case lists:member(Node,Nodes) of
@@ -1031,7 +1052,7 @@ poll(_,_,_,_,0) ->
error;
poll(M,F,Args,Result,Times) ->
try apply(M,F,Args) of
- What when function(Result) ->
+ What when is_function(Result) ->
case Result(What) of
true ->
ok;
diff --git a/lib/jinterface/doc/src/notes.xml b/lib/jinterface/doc/src/notes.xml
index 879634561b..962be63968 100644
--- a/lib/jinterface/doc/src/notes.xml
+++ b/lib/jinterface/doc/src/notes.xml
@@ -30,6 +30,22 @@
</header>
<p>This document describes the changes made to the Jinterface application.</p>
+<section><title>Jinterface 1.5.4</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Some malformed distribution messages could cause VM to
+ crash, this is now corrected.</p>
+ <p>
+ Own Id: OTP-8993</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Jinterface 1.5.3.2</title>
<section><title>Improvements and New Features</title>
diff --git a/lib/jinterface/java_src/Makefile b/lib/jinterface/java_src/Makefile
index 22c55328b8..755ef46a8b 100644
--- a/lib/jinterface/java_src/Makefile
+++ b/lib/jinterface/java_src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2000-2009. All Rights Reserved.
+# Copyright Ericsson AB 2000-2011. 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
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/AbstractConnection.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/AbstractConnection.java
index ab0b299bf9..9ba6a4a0ab 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/AbstractConnection.java
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/AbstractConnection.java
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2000-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2000-2010. 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
@@ -68,7 +68,6 @@ public abstract class AbstractConnection extends Thread {
protected static final int sendTag = 2;
protected static final int exitTag = 3;
protected static final int unlinkTag = 4;
- protected static final int nodeLinkTag = 5;
protected static final int regSendTag = 6;
protected static final int groupLeaderTag = 7;
protected static final int exit2Tag = 8;
@@ -697,7 +696,6 @@ public abstract class AbstractConnection extends Thread {
// absolutely no idea what to do with these, so we ignore
// them...
case groupLeaderTag: // { GROUPLEADER, FromPid, ToPid}
- case nodeLinkTag: // { NODELINK }
// (just show trace)
if (traceLevel >= ctrlThreshold) {
System.out.println("<- " + headerType(head) + " "
@@ -880,9 +878,6 @@ public abstract class AbstractConnection extends Thread {
case unlinkTag:
return "UNLINK";
- case nodeLinkTag:
- return "NODELINK";
-
case regSendTag:
return "REG_SEND";
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpMbox.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpMbox.java
index a9712aa2ba..71a419497a 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpMbox.java
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpMbox.java
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2000-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2000-2011. 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
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpMsg.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpMsg.java
index 80d8a5ccae..6f507bf4bb 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpMsg.java
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpMsg.java
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2000-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2000-2010. 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
@@ -54,7 +54,6 @@ public class OtpMsg {
public static final int sendTag = 2;
public static final int exitTag = 3;
public static final int unlinkTag = 4;
- /* public static final int nodeLinkTag = 5; */
public static final int regSendTag = 6;
/* public static final int groupLeaderTag = 7; */
public static final int exit2Tag = 8;
diff --git a/lib/jinterface/test/Makefile b/lib/jinterface/test/Makefile
index 36955d1e91..a85d0e7411 100644
--- a/lib/jinterface/test/Makefile
+++ b/lib/jinterface/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2004-2010. All Rights Reserved.
+# Copyright Ericsson AB 2004-2011. 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
@@ -32,7 +32,8 @@ RELSYSDIR = $(RELEASE_PATH)/jinterface_test
# ----------------------------------------------------
# Target Specs
# ----------------------------------------------------
-TEST_SPEC_FILE = jinterface.dynspec
+TEST_SPEC_FILE = jinterface.spec
+COVER_FILE = jinterface.cover
MODULES = nc_SUITE \
jinterface_SUITE
@@ -80,5 +81,5 @@ release_docs_spec:
release_tests_spec: tests
$(INSTALL_DIR) $(RELSYSDIR)
- $(INSTALL_DATA) $(TEST_SPEC_FILE) $(ERL_FILES) $(RELSYSDIR)
+ $(INSTALL_DATA) $(TEST_SPEC_FILE) $(COVER_FILE) $(ERL_FILES) $(RELSYSDIR)
@tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
diff --git a/lib/jinterface/test/jinterface.cover b/lib/jinterface/test/jinterface.cover
new file mode 100644
index 0000000000..d4edcd99d2
--- /dev/null
+++ b/lib/jinterface/test/jinterface.cover
@@ -0,0 +1,2 @@
+{incl_app,jinterface,details}.
+
diff --git a/lib/jinterface/test/jinterface.dynspec b/lib/jinterface/test/jinterface.spec
index 44712521df..99bc0f4005 100644
--- a/lib/jinterface/test/jinterface.dynspec
+++ b/lib/jinterface/test/jinterface.spec
@@ -17,16 +17,4 @@
%%
%% %CopyrightEnd%
%%
-%% You can test this file using this command.
-%% file:script("jinterface.dynspec", [{'Os',"Unix"}]).
-
-case case code:priv_dir(jinterface) of
- {error,bad_name} -> false;
- P -> filelib:is_dir(P) end of
- true ->
- [];
- false ->
- NoApp = "No jinterface application",
- [{skip,{nc_SUITE,NoApp}},
- {skip,{jinterface_SUITE,NoApp}}]
-end.
+{suites,"../jinterface_test",all}.
diff --git a/lib/jinterface/test/jinterface_SUITE.erl b/lib/jinterface/test/jinterface_SUITE.erl
index ea097680dd..82bc878112 100644
--- a/lib/jinterface/test/jinterface_SUITE.erl
+++ b/lib/jinterface/test/jinterface_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -18,7 +18,8 @@
%%
-module(jinterface_SUITE).
--export([all/1, init_per_suite/1, end_per_suite/1,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_suite/1, end_per_suite/1,
init_per_testcase/2, end_per_testcase/2]).
-export([nodename/1, register_and_whereis/1, get_names/1, boolean_atom/1,
@@ -31,13 +32,14 @@
erl_link_java_exit/1, java_link_erl_exit/1,
internal_link_linking_exits/1, internal_link_linked_exits/1,
internal_unlink_linking_exits/1, internal_unlink_linked_exits/1,
- normal_exit/1, kill_mbox/1, kill_erl_proc_from_java/1,
- kill_mbox_from_erlang/1, erl_exit_with_reason_any_term/1,
+ normal_exit/1, kill_mbox/1,kill_erl_proc_from_java/1,
+ kill_mbox_from_erlang/1,
+ erl_exit_with_reason_any_term/1,
java_exit_with_reason_any_term/1,
status_handler_localStatus/1, status_handler_remoteStatus/1,
status_handler_connAttempt/1]).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include("test_server_line.hrl").
-define(debug,true).
@@ -80,14 +82,21 @@
%%%-----------------------------------------------------------------
%%% INIT/END
%%%-----------------------------------------------------------------
-all(suite) ->
- lists:append([
- fundamental(),
- ping(),
- send_receive(),
- link_unlink(),
- status_handler()
- ]).
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ lists:append([fundamental(), ping(), send_receive(),
+ link_unlink(), status_handler()]).
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
fundamental() ->
[
@@ -154,11 +163,22 @@ status_handler() ->
init_per_suite(Config) when is_list(Config) ->
- jitu:init_all(Config).
+ case case code:priv_dir(jinterface) of
+ {error,bad_name} -> false;
+ P -> filelib:is_dir(P) end of
+ true ->
+ jitu:init_all(Config);
+ false ->
+ {skip,"No jinterface application"}
+ end.
end_per_suite(Config) when is_list(Config) ->
jitu:finish_all(Config).
+init_per_testcase(Case, _Config)
+ when Case =:= kill_mbox;
+ Case =:= kill_mbox_from_erlang ->
+ {skip, "Not yet implemented"};
init_per_testcase(_Case,Config) ->
Dog = ?t:timetrap({seconds,10}),
[{watch_dog,Dog}|Config].
diff --git a/lib/jinterface/test/nc_SUITE.erl b/lib/jinterface/test/nc_SUITE.erl
index 82dd3c2535..da54f5bf51 100644
--- a/lib/jinterface/test/nc_SUITE.erl
+++ b/lib/jinterface/test/nc_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -19,11 +19,11 @@
-module(nc_SUITE).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include("test_server_line.hrl").
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
init_per_suite/1,
end_per_suite/1,
init_per_testcase/2,
@@ -50,30 +50,34 @@
%% Top of cases
-all(doc) -> [];
-all(suite) -> [pid_roundtrip,
- port_roundtrip,
- ref_roundtrip,
- new_float,
- old_stuff,
- binary_roundtrip,
- decompress_roundtrip,
- compress_roundtrip,
- integer_roundtrip,
- fun_roundtrip,
- lists_roundtrip,
- lists_roundtrip_2,
- lists_iterator,
- unicode,
- unicode_list_to_string,
- unicode_string_to_list,
- connect].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+all() ->
+ [pid_roundtrip, port_roundtrip, ref_roundtrip,
+ new_float, old_stuff, binary_roundtrip,
+ decompress_roundtrip, compress_roundtrip,
+ integer_roundtrip, fun_roundtrip, lists_roundtrip,
+ lists_roundtrip_2, lists_iterator, unicode,
+ unicode_list_to_string, unicode_string_to_list, connect].
+groups() ->
+ [].
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
init_per_suite(Config) when is_list(Config) ->
- jitu:init_all(Config).
+ case case code:priv_dir(jinterface) of
+ {error,bad_name} -> false;
+ P -> filelib:is_dir(P) end of
+ true ->
+ jitu:init_all(Config);
+ false ->
+ {skip,"No jinterface application"}
+ end.
end_per_suite(Config) ->
jitu:finish_all(Config).
diff --git a/lib/jinterface/vsn.mk b/lib/jinterface/vsn.mk
index 24ffe7c5e6..9d75a653e3 100644
--- a/lib/jinterface/vsn.mk
+++ b/lib/jinterface/vsn.mk
@@ -1 +1 @@
-JINTERFACE_VSN = 1.5.3.2
+JINTERFACE_VSN = 1.5.4
diff --git a/lib/kernel/doc/src/code.xml b/lib/kernel/doc/src/code.xml
index b8db509fa8..4b8f934df1 100644
--- a/lib/kernel/doc/src/code.xml
+++ b/lib/kernel/doc/src/code.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1996</year><year>2009</year>
+ <year>1996</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
diff --git a/lib/kernel/doc/src/disk_log.xml b/lib/kernel/doc/src/disk_log.xml
index 07c1844485..324d4264cf 100644
--- a/lib/kernel/doc/src/disk_log.xml
+++ b/lib/kernel/doc/src/disk_log.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1997</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/kernel/doc/src/error_handler.xml b/lib/kernel/doc/src/error_handler.xml
index 94824688d1..7f78322472 100644
--- a/lib/kernel/doc/src/error_handler.xml
+++ b/lib/kernel/doc/src/error_handler.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1996</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/kernel/doc/src/file.xml b/lib/kernel/doc/src/file.xml
index d3441d3623..36fce464c5 100644
--- a/lib/kernel/doc/src/file.xml
+++ b/lib/kernel/doc/src/file.xml
@@ -660,10 +660,10 @@ f.txt: {person, "kalle", 25}.
</func>
<func>
<name>native_name_encoding() -> latin1 | utf8</name>
- <fsummary>Retunr the VMs configure filename encoding.</fsummary>
+ <fsummary>Return the VM's configured filename encoding.</fsummary>
<desc>
<p>This function returns the configured default file name encoding to use for raw file names. Generally an application supplying file names raw (as binaries), should obey the character encoding returned by this function.</p>
- <p>By default, the VM uses ISO-latin-1 file name encoding on filesystems and/or OSes that use completely transparent file naming. This includes all Unix versions except for MacOSX, where the vfs layer enforces UTF-8 file naming. By giving the experimental option <c>+fnu</c> when starting Erlang, UTF-8 translation of file names can be turned on even for those systems. If Unicode file name translation is in effect, the system behaves as usual as long as file names conform to the encoding, but will return file names that are not properly encoded in UTF-8 as raw file names (i.e. binaries).</p>
+ <p>By default, the VM uses ISO-latin-1 file name encoding on filesystems and/or OSes that use completely transparent file naming. This includes all Unix versions except MacOSX, where the vfs layer enforces UTF-8 file naming. By giving the experimental option <c>+fnu</c> when starting Erlang, UTF-8 translation of file names can be turned on even for those systems. If Unicode file name translation is in effect, the system behaves as usual as long as file names conform to the encoding, but will return file names that are not properly encoded in UTF-8 as raw file names (i.e. binaries).</p>
<p>On Windows, this function also returns <c>utf8</c> by default. The OS uses a pure Unicode naming scheme and file names are always possible to interpret as valid Unicode. The fact that the underlying Windows OS actually encodes file names using little endian UTF-16 can be ignored by the Erlang programmer. Windows and MacOSX are the only operating systems where the VM operates in Unicode file name mode by default.</p>
</desc>
</func>
diff --git a/lib/kernel/doc/src/gen_tcp.xml b/lib/kernel/doc/src/gen_tcp.xml
index 8e7192a496..aa171c77c2 100644
--- a/lib/kernel/doc/src/gen_tcp.xml
+++ b/lib/kernel/doc/src/gen_tcp.xml
@@ -74,6 +74,7 @@ posix()
socket()
as returned by accept/1,2 and connect/3,4</code>
+ <marker id="connect"></marker>
</section>
<funcs>
<func>
diff --git a/lib/kernel/doc/src/inet.xml b/lib/kernel/doc/src/inet.xml
index a22c0a8346..f05a224f33 100644
--- a/lib/kernel/doc/src/inet.xml
+++ b/lib/kernel/doc/src/inet.xml
@@ -432,7 +432,7 @@ fe80::204:acff:fe17:bf38
</desc>
</func>
<func>
- <name>port(Socket) -> {ok, Port}</name>
+ <name>port(Socket) -> {ok, Port} | {error, any()}</name>
<fsummary>Return the local port number for a socket</fsummary>
<type>
<v>Socket = socket()</v>
diff --git a/lib/kernel/doc/src/notes.xml b/lib/kernel/doc/src/notes.xml
index 29580a4cd1..065b24c53d 100644
--- a/lib/kernel/doc/src/notes.xml
+++ b/lib/kernel/doc/src/notes.xml
@@ -30,6 +30,65 @@
</header>
<p>This document describes the changes made to the Kernel application.</p>
+<section><title>Kernel 2.14.3</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ <c>os:find_executable/{1,2}</c> will no longer return the
+ path of a directory that happens to be in the PATH.</p>
+ <p>
+ Own Id: OTP-8983 Aux Id: seq11749 </p>
+ </item>
+ <item>
+ <p>
+ Fix -spec for file:write_file/3</p>
+ <p>
+ Change type for second parameter from binary() to
+ iodata(), since the function explicitly takes steps to
+ accept lists as well as binaries. (thanks to Magnus
+ Henoch).</p>
+ <p>
+ Own Id: OTP-9067</p>
+ </item>
+ <item>
+ <p>
+ Sanitize the specs of the code module</p>
+ <p>
+ After the addition of unicode_binary() to the
+ file:filename() type, dialyzer started complaining about
+ erroneous or incomplete specs in some functions of the
+ 'code' module. The culprit was hard-coded information in
+ erl_bif_types for functions of this module, which were
+ not updated. Since these functions have proper specs
+ these days and code duplication (pun intended) is never a
+ good idea, their type information was removed from
+ erl_bif_types.</p>
+ <p>
+ While doing this, some erroneous comments were fixed in
+ the code module and also made sure that the code now runs
+ without dialyzer warnings even when the
+ -Wunmatched_returns option is used.</p>
+ <p>
+ Some cleanups were applied to erl_bif_types too.</p>
+ <p>
+ Own Id: OTP-9100</p>
+ </item>
+ <item>
+ <p>
+ - Add spec for function that does not return - Strenghen
+ spec - Introduce types to avoid duplication in specs -
+ Add specs for functions that do not return - Add specs
+ for behaviour callbacks - Simplify two specs</p>
+ <p>
+ Own Id: OTP-9127</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Kernel 2.14.2</title>
<section><title>Improvements and New Features</title>
diff --git a/lib/kernel/doc/src/part_notes_history.xml b/lib/kernel/doc/src/part_notes_history.xml
index 07c7e4abea..a73cc911b8 100644
--- a/lib/kernel/doc/src/part_notes_history.xml
+++ b/lib/kernel/doc/src/part_notes_history.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2006</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/kernel/doc/src/rpc.xml b/lib/kernel/doc/src/rpc.xml
index 86c6ea9178..2b81de170d 100644
--- a/lib/kernel/doc/src/rpc.xml
+++ b/lib/kernel/doc/src/rpc.xml
@@ -454,7 +454,7 @@
</desc>
</func>
<func>
- <name>pmap({Module, Function}, ExtraArgs, List2) -> List1</name>
+ <name>pmap({Module, Function}, ExtraArgs, List1) -> List2</name>
<fsummary>Parallell evaluation of mapping a function over a list </fsummary>
<type>
<v>Module = Function = atom()</v>
diff --git a/lib/kernel/doc/src/user.xml b/lib/kernel/doc/src/user.xml
index d9de2f4b04..4d0f044321 100644
--- a/lib/kernel/doc/src/user.xml
+++ b/lib/kernel/doc/src/user.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1996</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/kernel/src/application.erl b/lib/kernel/src/application.erl
index d9db23d652..2a193affd4 100644
--- a/lib/kernel/src/application.erl
+++ b/lib/kernel/src/application.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -204,12 +204,12 @@ get_env(Key) ->
get_env(Application, Key) ->
application_controller:get_env(Application, Key).
--spec get_all_env() -> [] | [{atom(), any()}].
+-spec get_all_env() -> [{atom(), any()}].
get_all_env() ->
application_controller:get_pid_all_env(group_leader()).
--spec get_all_env(atom()) -> [] | [{atom(), any()}].
+-spec get_all_env(atom()) -> [{atom(), any()}].
get_all_env(Application) ->
application_controller:get_all_env(Application).
diff --git a/lib/kernel/src/code.erl b/lib/kernel/src/code.erl
index feb5131aad..b0f99305f2 100644
--- a/lib/kernel/src/code.erl
+++ b/lib/kernel/src/code.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -72,39 +72,42 @@
%% User interface.
%%
-%% objfile_extension() -> ".beam"
-%% set_path(Dir*) -> true
-%% get_path() -> Dir*
-%% add_path(Dir) -> true | {error, What}
-%% add_patha(Dir) -> true | {error, What}
-%% add_pathz(Dir) -> true | {error, What}
-%% add_paths(DirList) -> true | {error, What}
-%% add_pathsa(DirList) -> true | {error, What}
-%% add_pathsz(DirList) -> true | {error, What}
-%% del_path(Dir) -> true | {error, What}
-%% replace_path(Name,Dir) -> true | {error, What}
-%% load_file(File) -> {error,What} | {module, Mod}
-%% load_abs(File) -> {error,What} | {module, Mod}
-%% load_abs(File,Mod) -> {error,What} | {module, Mod}
-%% load_binary(Mod,File,Bin) -> {error,What} | {module,Mod}
-%% ensure_loaded(Module) -> {error,What} | {module, Mod}
-%% delete(Module)
-%% purge(Module) kills all procs running old code
-%% soft_purge(Module) -> true | false
-%% is_loaded(Module) -> {file, File} | false
-%% all_loaded() -> {Module, File}*
-%% get_object_code(Mod) -> error | {Mod, Bin, Filename}
-%% stop() -> true
-%% root_dir()
-%% compiler_dir()
-%% lib_dir()
-%% priv_dir(Name)
-%% stick_dir(Dir) -> ok | error
-%% unstick_dir(Dir) -> ok | error
-%% is_sticky(Module) -> true | false
-%% which(Module) -> Filename
-%% set_primary_archive((FileName, Bin, FileInfo) -> ok | {error, Reason}
-%% clash() -> -> print out
+%% objfile_extension() -> ".beam"
+%% get_path() -> [Dir]
+%% set_path([Dir]) -> true | {error, bad_directory | bad_path}
+%% add_path(Dir) -> true | {error, bad_directory}
+%% add_patha(Dir) -> true | {error, bad_directory}
+%% add_pathz(Dir) -> true | {error, bad_directory}
+%% add_paths([Dir]) -> ok
+%% add_pathsa([Dir]) -> ok
+%% add_pathsz([Dir]) -> ok
+%% del_path(Dir) -> boolean() | {error, bad_name}
+%% replace_path(Name, Dir) -> true | replace_path_error()
+%% load_file(Module) -> {module, Module} | {error, What :: atom()}
+%% load_abs(File) -> {module, Module} | {error, What :: atom()}
+%% load_abs(File, Module) -> {module, Module} | {error, What :: atom()}
+%% load_binary(Module, File, Bin)-> {module, Module} | {error, What :: atom()}
+%% ensure_loaded(Module) -> {module, Module} | {error, What :: atom()}
+%% delete(Module) -> boolean()
+%% purge(Module) -> boolean() kills all procs running old code
+%% soft_purge(Module) -> boolean()
+%% is_loaded(Module) -> {file, loaded_filename()} | false
+%% all_loaded() -> [{Module, loaded_filename()}]
+%% get_object_code(Module) -> {Module, Bin, Filename} | error
+%% stop() -> no_return()
+%% root_dir() -> Dir
+%% compiler_dir() -> Dir
+%% lib_dir() -> Dir
+%% lib_dir(Application) -> Dir | {error, bad_name}
+%% priv_dir(Application) -> Dir | {error, bad_name}
+%% stick_dir(Dir) -> ok | error
+%% unstick_dir(Dir) -> ok | error
+%% stick_mod(Module) -> true
+%% unstick_mod(Module) -> true
+%% is_sticky(Module) -> boolean()
+%% which(Module) -> Filename | loaded_ret_atoms() | non_existing
+%% set_primary_archive((FileName, Bin, FileInfo) -> ok | {error, Reason}
+%% clash() -> ok prints out number of clashes
%%----------------------------------------------------------------------------
%% Some types for basic exported functions of this module
@@ -120,7 +123,7 @@
%% User interface
%%----------------------------------------------------------------------------
--spec objfile_extension() -> file:filename().
+-spec objfile_extension() -> nonempty_string().
objfile_extension() ->
init:objfile_extension().
@@ -138,21 +141,21 @@ load_abs(File) when is_list(File); is_atom(File) -> call({load_abs,File,[]}).
%% XXX Filename is also an atom(), e.g. 'cover_compiled'
-spec load_abs(Filename :: loaded_filename(), Module :: atom()) -> load_ret().
-load_abs(File,M) when (is_list(File) orelse is_atom(File)), is_atom(M) ->
+load_abs(File, M) when (is_list(File) orelse is_atom(File)), is_atom(M) ->
call({load_abs,File,M}).
%% XXX Filename is also an atom(), e.g. 'cover_compiled'
-spec load_binary(Module :: atom(), Filename :: loaded_filename(), Binary :: binary()) -> load_ret().
-load_binary(Mod,File,Bin)
+load_binary(Mod, File, Bin)
when is_atom(Mod), (is_list(File) orelse is_atom(File)), is_binary(Bin) ->
call({load_binary,Mod,File,Bin}).
-spec load_native_partial(Module :: atom(), Binary :: binary()) -> load_ret().
-load_native_partial(Mod,Bin) when is_atom(Mod), is_binary(Bin) ->
+load_native_partial(Mod, Bin) when is_atom(Mod), is_binary(Bin) ->
call({load_native_partial,Mod,Bin}).
-spec load_native_sticky(Module :: atom(), Binary :: binary(), WholeModule :: 'false' | binary()) -> load_ret().
-load_native_sticky(Mod,Bin,WholeModule)
+load_native_sticky(Mod, Bin, WholeModule)
when is_atom(Mod), is_binary(Bin),
(is_binary(WholeModule) orelse WholeModule =:= false) ->
call({load_native_sticky,Mod,Bin,WholeModule}).
@@ -160,7 +163,7 @@ load_native_sticky(Mod,Bin,WholeModule)
-spec delete(Module :: atom()) -> boolean().
delete(Mod) when is_atom(Mod) -> call({delete,Mod}).
--spec purge/1 :: (Module :: atom()) -> boolean().
+-spec purge(Module :: atom()) -> boolean().
purge(Mod) when is_atom(Mod) -> call({purge,Mod}).
-spec soft_purge(Module :: atom()) -> boolean().
@@ -195,7 +198,7 @@ lib_dir(App, SubDir) when is_atom(App), is_atom(SubDir) -> call({dir,{lib_dir,Ap
compiler_dir() -> call({dir,compiler_dir}).
%% XXX is_list() is for backwards compatibility -- take out in future version
--spec priv_dir(Appl :: atom()) -> file:filename() | {'error', 'bad_name'}.
+-spec priv_dir(App :: atom()) -> file:filename() | {'error', 'bad_name'}.
priv_dir(App) when is_atom(App) ; is_list(App) -> call({dir,{priv_dir,App}}).
-spec stick_dir(Directory :: file:filename()) -> 'ok' | 'error'.
@@ -220,13 +223,14 @@ set_path(PathList) when is_list(PathList) -> call({set_path,PathList}).
-spec get_path() -> [file:filename()].
get_path() -> call(get_path).
--spec add_path(Directory :: file:filename()) -> 'true' | {'error', 'bad_directory'}.
+-type add_path_ret() :: 'true' | {'error', 'bad_directory'}.
+-spec add_path(Directory :: file:filename()) -> add_path_ret().
add_path(Dir) when is_list(Dir) -> call({add_path,last,Dir}).
--spec add_pathz(Directory :: file:filename()) -> 'true' | {'error', 'bad_directory'}.
+-spec add_pathz(Directory :: file:filename()) -> add_path_ret().
add_pathz(Dir) when is_list(Dir) -> call({add_path,last,Dir}).
--spec add_patha(Directory :: file:filename()) -> 'true' | {'error', 'bad_directory'}.
+-spec add_patha(Directory :: file:filename()) -> add_path_ret().
add_patha(Dir) when is_list(Dir) -> call({add_path,first,Dir}).
-spec add_paths(Directories :: [file:filename()]) -> 'ok'.
@@ -243,8 +247,8 @@ del_path(Name) when is_list(Name) ; is_atom(Name) -> call({del_path,Name}).
-type replace_path_error() :: {'error', 'bad_directory' | 'bad_name' | {'badarg',_}}.
-spec replace_path(Name:: atom(), Dir :: file:filename()) -> 'true' | replace_path_error().
-replace_path(Name, Dir) when (is_atom(Name) or is_list(Name)) and
- (is_atom(Dir) or is_list(Dir)) ->
+replace_path(Name, Dir) when (is_atom(Name) orelse is_list(Name)),
+ (is_atom(Dir) orelse is_list(Dir)) ->
call({replace_path,Name,Dir}).
-spec rehash() -> 'ok'.
@@ -275,21 +279,14 @@ start_link(Flags) ->
do_start(Flags) ->
%% The following module_info/1 calls are here to ensure
- %% that the modules are loaded prior to their use elsewhere in
+ %% that these modules are loaded prior to their use elsewhere in
%% the code_server.
%% Otherwise a deadlock may occur when the code_server is starting.
- code_server:module_info(module),
- packages:module_info(module),
+ code_server = code_server:module_info(module),
+ packages = packages:module_info(module),
catch hipe_unified_loader:load_hipe_modules(),
- gb_sets:module_info(module),
- gb_trees:module_info(module),
-
- ets:module_info(module),
- os:module_info(module),
- binary:module_info(module),
- unicode:module_info(module),
- filename:module_info(module),
- lists:module_info(module),
+ Modules2 = [gb_sets, gb_trees, ets, os, binary, unicode, filename, lists],
+ lists:foreach(fun (M) -> M = M:module_info(module) end, Modules2),
Mode = get_mode(Flags),
case init:get_argument(root) of
@@ -297,7 +294,7 @@ do_start(Flags) ->
Root = filename:join([Root0]), % Normalize. Use filename
case code_server:start_link([Root,Mode]) of
{ok,_Pid} = Ok2 ->
- if
+ if
Mode =:= interactive ->
case lists:member(stick, Flags) of
true -> do_stick_dirs();
@@ -306,14 +303,14 @@ do_start(Flags) ->
true ->
ok
end,
- % Quietly load the native code for all modules loaded so far.
+ %% Quietly load native code for all modules loaded so far
catch load_native_code_for_all_loaded(),
Ok2;
Other ->
Other
end;
Other ->
- error_logger:error_msg("Can not start code server ~w ~n",[Other]),
+ error_logger:error_msg("Can not start code server ~w ~n", [Other]),
{error, crash}
end.
@@ -330,7 +327,7 @@ do_s(Lib) ->
%% The return value is intentionally ignored. Missing
%% directories is not a fatal error. (In embedded systems,
%% there is usually no compiler directory.)
- stick_dir(filename:append(Dir, "ebin")),
+ _ = stick_dir(filename:append(Dir, "ebin")),
ok
end.
@@ -428,7 +425,7 @@ where_is_file(Path, File) when is_list(Path), is_list(File) ->
-spec set_primary_archive(ArchiveFile :: file:filename(),
ArchiveBin :: binary(),
- FileInfo :: #file_info{})
+ FileInfo :: file:file_info())
-> 'ok' | {'error', atom()}.
set_primary_archive(ArchiveFile0, ArchiveBin, #file_info{} = FileInfo)
@@ -485,13 +482,13 @@ filter(Ext, _, {ok,Files}) ->
filter2(Ext, length(Ext), Files).
filter2(_Ext, _Extlen, []) -> [];
-filter2(Ext, Extlen,[File|Tail]) ->
- case has_ext(Ext,Extlen, File) of
+filter2(Ext, Extlen, [File|Tail]) ->
+ case has_ext(Ext, Extlen, File) of
true -> [File | filter2(Ext, Extlen, Tail)];
false -> filter2(Ext, Extlen, Tail)
end.
-has_ext(Ext, Extlen,File) ->
+has_ext(Ext, Extlen, File) ->
L = length(File),
case catch lists:nthtail(L - Extlen, File) of
Ext -> true;
diff --git a/lib/kernel/src/disk_log_1.erl b/lib/kernel/src/disk_log_1.erl
index 8ccdb88d12..266df84a03 100644
--- a/lib/kernel/src/disk_log_1.erl
+++ b/lib/kernel/src/disk_log_1.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -581,11 +581,13 @@ done_scan(In, Out, OutName, FName, RecoveredTerms, BadChars) ->
file:delete(OutName),
throw(Error)
end.
-
+
+-spec repair_err(file:io_device(), #cache{}, file:filename(),
+ file:filename(), {'error', file:posix()}) -> no_return().
repair_err(In, Out, OutName, ErrFileName, Error) ->
file:close(In),
catch fclose(Out, OutName),
- % OutName is often the culprit, try to remove it anyway...
+ %% OutName is often the culprit, try to remove it anyway...
file:delete(OutName),
file_error(ErrFileName, Error).
diff --git a/lib/kernel/src/erl_ddll.erl b/lib/kernel/src/erl_ddll.erl
index 88f91de24f..ce64589a29 100644
--- a/lib/kernel/src/erl_ddll.erl
+++ b/lib/kernel/src/erl_ddll.erl
@@ -1,19 +1,19 @@
%%
%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
+%%
+%% Copyright Ericsson AB 1997-2011. 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%
%%
%% Dynamic Driver Loader and Linker
@@ -29,6 +29,11 @@
%%----------------------------------------------------------------------------
+-type path() :: string() | atom().
+-type driver() :: string() | atom().
+
+%%----------------------------------------------------------------------------
+
-spec start() -> {'error', {'already_started', 'undefined'}}.
start() ->
@@ -39,13 +44,13 @@ start() ->
stop() ->
ok.
--spec load_driver(Path :: string() | atom(), Driver :: string() | atom()) ->
+-spec load_driver(Path :: path(), Driver :: driver()) ->
'ok' | {'error', any()}.
load_driver(Path, Driver) ->
do_load_driver(Path, Driver, [{driver_options,[kill_ports]}]).
--spec load(Path :: string() | atom(), Driver :: string() | atom()) ->
+-spec load(Path :: path(), Driver :: driver()) ->
'ok' | {'error', any()}.
load(Path, Driver) ->
@@ -95,23 +100,23 @@ do_unload_driver(Driver,Flags) ->
end
end.
--spec unload_driver(Driver :: string() | atom()) -> 'ok' | {'error', any()}.
+-spec unload_driver(Driver :: driver()) -> 'ok' | {'error', any()}.
unload_driver(Driver) ->
do_unload_driver(Driver,[{monitor,pending_driver},kill_ports]).
--spec unload(Driver :: string() | atom()) -> 'ok' | {'error', any()}.
+-spec unload(Driver :: driver()) -> 'ok' | {'error', any()}.
unload(Driver) ->
do_unload_driver(Driver,[]).
--spec reload(Path :: string() | atom(), Driver :: string() | atom()) ->
+-spec reload(Path :: path(), Driver :: driver()) ->
'ok' | {'error', any()}.
reload(Path,Driver) ->
do_load_driver(Path, Driver, [{reload,pending_driver}]).
--spec reload_driver(Path :: string() | atom(), Driver :: string() | atom()) ->
+-spec reload_driver(Path :: path(), Driver :: driver()) ->
'ok' | {'error', any()}.
reload_driver(Path,Driver) ->
@@ -122,15 +127,15 @@ reload_driver(Path,Driver) ->
format_error(Code) ->
case Code of
- % This is the only error code returned only from erlang code...
- % 'permanent' has a translation in the emulator, even though the erlang code uses it to...
+ %% This is the only error code returned only from erlang code...
+ %% 'permanent' has a translation in the emulator, even though the erlang code uses it to...
load_cancelled ->
"Loading was cancelled from other process";
_ ->
erl_ddll:format_error_int(Code)
end.
--spec info(Driver :: string() | atom()) -> [{atom(), any()}].
+-spec info(Driver :: driver()) -> [{atom(), any()}, ...].
info(Driver) ->
[{processes, erl_ddll:info(Driver,processes)},
diff --git a/lib/kernel/src/error_handler.erl b/lib/kernel/src/error_handler.erl
index 885eeb2b0f..6f69f4ccb9 100644
--- a/lib/kernel/src/error_handler.erl
+++ b/lib/kernel/src/error_handler.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -80,9 +80,13 @@ int() -> int.
%%
%% Crash providing a beautiful stack backtrace.
%%
+-spec crash(atom(), [term()]) -> no_return().
+
crash(Fun, Args) ->
crash({Fun,Args}).
+-spec crash(atom(), atom(), arity()) -> no_return().
+
crash(M, F, A) ->
crash({M,F,A}).
diff --git a/lib/kernel/src/file.erl b/lib/kernel/src/file.erl
index bc95359986..88bcf9a9cc 100644
--- a/lib/kernel/src/file.erl
+++ b/lib/kernel/src/file.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -240,7 +240,7 @@ write_file(Name, Bin) ->
%% when it is time to change file server protocol again.
%% Meanwhile, it is implemented here, slightly less efficient.
--spec write_file(Name :: name(), Bin :: binary(), Modes :: [mode()]) ->
+-spec write_file(Name :: name(), Bin :: iodata(), Modes :: [mode()]) ->
'ok' | {'error', posix()}.
write_file(Name, Bin, ModeList) when is_list(ModeList) ->
diff --git a/lib/kernel/src/global.erl b/lib/kernel/src/global.erl
index 081e7e2f93..6343acd000 100644
--- a/lib/kernel/src/global.erl
+++ b/lib/kernel/src/global.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -113,8 +113,9 @@
syncers = [] :: [pid()],
node_name = node() :: node(),
the_locker, the_registrar, trace,
- global_lock_down = false
+ global_lock_down = false :: boolean()
}).
+-type state() :: #state{}.
%%% There are also ETS tables used for bookkeeping of locks and names
%%% (the first position is the key):
@@ -399,6 +400,9 @@ info() ->
%%%-----------------------------------------------------------------
%%% Call-back functions from gen_server
%%%-----------------------------------------------------------------
+
+-spec init([]) -> {'ok', state()}.
+
init([]) ->
process_flag(trap_exit, true),
_ = ets:new(global_locks, [set, named_table, protected]),
@@ -542,6 +546,11 @@ init([]) ->
%% sent by each node to all new nodes (Node becomes known to them)
%%-----------------------------------------------------------------
+-spec handle_call(term(), {pid(), term()}, state()) ->
+ {'noreply', state()} |
+ {'reply', term(), state()} |
+ {'stop', 'normal', 'stopped', state()}.
+
handle_call({whereis, Name}, From, S) ->
do_whereis(Name, From),
{noreply, S};
@@ -621,6 +630,9 @@ handle_call(Request, From, S) ->
%% init_connect
%%
%%========================================================================
+
+-spec handle_cast(term(), state()) -> {'noreply', state()}.
+
handle_cast({init_connect, Vsn, Node, InitMsg}, S) ->
%% Sent from global_name_server at Node.
?trace({'####', init_connect, {vsn, Vsn}, {node,Node},{initmsg,InitMsg}}),
@@ -782,6 +794,11 @@ handle_cast(Request, S) ->
"handle_cast(~p, _)\n", [Request]),
{noreply, S}.
+%%========================================================================
+
+-spec handle_info(term(), state()) ->
+ {'noreply', state()} | {'stop', term(), state()}.
+
handle_info({'EXIT', Locker, _Reason}=Exit, #state{the_locker=Locker}=S) ->
{stop, {locker_died,Exit}, S#state{the_locker=undefined}};
handle_info({'EXIT', Registrar, _}=Exit, #state{the_registrar=Registrar}=S) ->
@@ -1122,12 +1139,17 @@ do_whereis(Name, From) ->
send_again({whereis, Name, From})
end.
+-spec terminate(term(), state()) -> 'ok'.
+
terminate(_Reason, _S) ->
true = ets:delete(global_names),
true = ets:delete(global_names_ext),
true = ets:delete(global_locks),
true = ets:delete(global_pid_names),
- true = ets:delete(global_pid_ids).
+ true = ets:delete(global_pid_ids),
+ ok.
+
+-spec code_change(term(), state(), term()) -> {'ok', state()}.
code_change(_OldVsn, S, _Extra) ->
{ok, S}.
@@ -1955,7 +1977,7 @@ delete_lock(Ref, S0) ->
Locks = pid_locks(Ref),
F = fun({ResourceId, LockRequesterId, PidRefs}, S) ->
{Pid, _RPid, Ref} = lists:keyfind(Ref, 3, PidRefs),
- remove_lock(ResourceId, LockRequesterId, Pid, PidRefs, true,S)
+ remove_lock(ResourceId, LockRequesterId, Pid, PidRefs, true, S)
end,
lists:foldl(F, S0, Locks).
diff --git a/lib/kernel/src/hipe_unified_loader.erl b/lib/kernel/src/hipe_unified_loader.erl
index f289b8110d..1d3eb926ca 100644
--- a/lib/kernel/src/hipe_unified_loader.erl
+++ b/lib/kernel/src/hipe_unified_loader.erl
@@ -258,7 +258,7 @@ find_callee_mfas(Patches) when is_list(Patches) ->
amd64 -> [];
arm -> find_callee_mfas(Patches, gb_sets:empty(), false);
powerpc -> find_callee_mfas(Patches, gb_sets:empty(), true);
- %% ppc64 -> find_callee_mfas(Patches, gb_sets:empty(), true);
+ ppc64 -> find_callee_mfas(Patches, gb_sets:empty(), true);
ultrasparc -> [];
x86 -> []
end.
@@ -301,6 +301,7 @@ mk_trampoline_map(CalleeMFAs, Trampolines) ->
SizeofLong =
case erlang:system_info(hipe_architecture) of
amd64 -> 8;
+ ppc64 -> 8;
_ -> 4
end,
mk_trampoline_map(tuple_size(CalleeMFAs), CalleeMFAs,
@@ -625,15 +626,15 @@ patch_instr(Address, Value, Type) ->
%%
%% XXX: It appears this is used for inserting both code addresses
%% and other data. In HiPE, code addresses are still 32-bit on
-%% 64-bit machines.
+%% some 64-bit machines.
write_word(DataAddress, DataWord) ->
case erlang:system_info(hipe_architecture) of
amd64 ->
hipe_bifs:write_u64(DataAddress, DataWord),
DataAddress+8;
- %% ppc64 ->
- %% hipe_bifs:write_u64(DataAddress, DataWord),
- %% DataAddress+8;
+ ppc64 ->
+ hipe_bifs:write_u64(DataAddress, DataWord),
+ DataAddress+8;
_ ->
hipe_bifs:write_u32(DataAddress, DataWord),
DataAddress+4
diff --git a/lib/kernel/src/inet6_tcp_dist.erl b/lib/kernel/src/inet6_tcp_dist.erl
index fab00bbb9f..b9c4fa607c 100644
--- a/lib/kernel/src/inet6_tcp_dist.erl
+++ b/lib/kernel/src/inet6_tcp_dist.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -162,8 +162,8 @@ do_accept(Kernel, AcceptPid, Socket, MyNode, Allowed, SetupTime) ->
inet:getll(S)
end,
f_address = fun get_remote_id/2,
- mf_tick = {?MODULE, tick},
- mf_getstat = {?MODULE,getstat}
+ mf_tick = fun ?MODULE:tick/1,
+ mf_getstat = fun ?MODULE:getstat/1
},
dist_util:handshake_other_started(HSData);
{false,IP} ->
diff --git a/lib/kernel/src/inet_res.erl b/lib/kernel/src/inet_res.erl
index de0f23bf24..93563c6011 100644
--- a/lib/kernel/src/inet_res.erl
+++ b/lib/kernel/src/inet_res.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -539,27 +539,41 @@ udp_send(#sock{inet=I}, {A,B,C,D}=IP, Port, Buffer)
when ?ip(A,B,C,D), ?port(Port) ->
gen_udp:send(I, IP, Port, Buffer).
-udp_recv(#sock{inet6=I}, {A,B,C,D,E,F,G,H}=IP, Port, Timeout)
+udp_recv(#sock{inet6=I}, {A,B,C,D,E,F,G,H}=IP, Port, Timeout, Decode)
when ?ip6(A,B,C,D,E,F,G,H), ?port(Port) ->
- do_udp_recv(fun(T) -> gen_udp:recv(I, 0, T) end, IP, Port, Timeout);
-udp_recv(#sock{inet=I}, {A,B,C,D}=IP, Port, Timeout)
+ do_udp_recv(I, IP, Port, Timeout, Decode, erlang:now(), Timeout);
+udp_recv(#sock{inet=I}, {A,B,C,D}=IP, Port, Timeout, Decode)
when ?ip(A,B,C,D), ?port(Port) ->
- do_udp_recv(fun(T) -> gen_udp:recv(I, 0, T) end, IP, Port, Timeout).
-
-do_udp_recv(Recv, IP, Port, Timeout) ->
- do_udp_recv(Recv, IP, Port, Timeout,
- if Timeout =/= 0 -> erlang:now(); true -> undefined end).
-
-do_udp_recv(Recv, IP, Port, Timeout, Then) ->
- case Recv(Timeout) of
- {ok,{IP,Port,Answer}} ->
- {ok,Answer,erlang:max(0, Timeout - now_ms(erlang:now(), Then))};
- {ok,_} when Timeout =:= 0 ->
- {error,timeout};
- {ok,_} ->
- Now = erlang:now(),
- T = erlang:max(0, Timeout - now_ms(Now, Then)),
- do_udp_recv(Recv, IP, Port, T, Now);
+ do_udp_recv(I, IP, Port, Timeout, Decode, erlang:now(), Timeout).
+
+do_udp_recv(_I, _IP, _Port, 0, _Decode, _Start, _T) ->
+ timeout;
+do_udp_recv(I, IP, Port, Timeout, Decode, Start, T) ->
+ case gen_udp:recv(I, 0, T) of
+ {ok,Reply} ->
+ case Decode(Reply) of
+ false when T =:= 0 ->
+ %% This is a compromize between the hard way i.e
+ %% in the clause below if NewT becomes 0 bailout
+ %% immediately and risk that the right reply lies
+ %% ahead after some bad id replies, and the
+ %% forgiving way i.e go on with Timeout 0 until
+ %% the right reply comes or no reply (timeout)
+ %% which opens for a DOS attack by a malicious
+ %% DNS server flooding with bad id replies causing
+ %% an infinite loop here.
+ %%
+ %% Timeout is used as a sanity limit counter
+ %% just to put an end to the loop.
+ NewTimeout = erlang:max(0, Timeout - 50),
+ do_udp_recv(I, IP, Port, NewTimeout, Decode, Start, T);
+ false ->
+ Now = erlang:now(),
+ NewT = erlang:max(0, Timeout - now_ms(Now, Start)),
+ do_udp_recv(I, IP, Port, Timeout, Decode, Start, NewT);
+ Result ->
+ Result
+ end;
Error -> Error
end.
@@ -580,6 +594,17 @@ udp_close(#sock{inet=I,inet6=I6}) ->
%% end
%% end
%%
+%% But that man page also says dig always use num_servers = 1.
+%%
+%% Our man page says: timeout/retry, then double for next retry, i.e
+%% for i = 0 to retry - 1
+%% foreach nameserver
+%% send query
+%% wait((time * (2**i)) / retry)
+%% end
+%% end
+%%
+%% And that is what the code seems to do, now fixed, hopefully...
do_query(_Q, [], _Timer) ->
{error,nxdomain};
@@ -589,19 +614,16 @@ do_query(#q{options=#options{retry=Retry}}=Q, NSs, Timer) ->
query_retries(_Q, _NSs, _Timer, Retry, Retry, S) ->
udp_close(S),
{error,timeout};
+query_retries(_Q, [], _Timer, _Retry, _I, S) ->
+ udp_close(S),
+ {error,timeout};
query_retries(Q, NSs, Timer, Retry, I, S0) ->
- Num = length(NSs),
- if Num =:= 0 ->
- udp_close(S0),
- {error,timeout};
- true ->
- case query_nss(Q, NSs, Timer, Retry, I, S0, []) of
- {S,{noanswer,ErrNSs}} -> %% remove unreachable nameservers
- query_retries(Q, NSs--ErrNSs, Timer, Retry, I+1, S);
- {S,Result} ->
- udp_close(S),
- Result
- end
+ case query_nss(Q, NSs, Timer, Retry, I, S0, []) of
+ {S,{noanswer,ErrNSs}} -> %% remove unreachable nameservers
+ query_retries(Q, NSs--ErrNSs, Timer, Retry, I+1, S);
+ {S,Result} ->
+ udp_close(S),
+ Result
end.
query_nss(_Q, [], _Timer, _Retry, _I, S, ErrNSs) ->
@@ -611,13 +633,13 @@ query_nss(#q{edns=undefined}=Q, NSs, Timer, Retry, I, S, ErrNSs) ->
query_nss(Q, NSs, Timer, Retry, I, S, ErrNSs) ->
query_nss_edns(Q, NSs, Timer, Retry, I, S, ErrNSs).
-query_nss_edns(#q{options=#options{udp_payload_size=PSz}=Options,
- edns={Id,Buffer}}=Q,
- [{IP,Port}=NS|NSs]=NSs0, Timer, Retry, I, S0, ErrNSs) ->
- {S,Res}=Reply = query_ns(S0, Id, Buffer, IP, Port, Timer,
- Retry, I, Options, PSz),
+query_nss_edns(
+ #q{options=#options{udp_payload_size=PSz}=Options,edns={Id,Buffer}}=Q,
+ [{IP,Port}=NS|NSs]=NSs0, Timer, Retry, I, S0, ErrNSs) ->
+ {S,Res}=Reply =
+ query_ns(S0, Id, Buffer, IP, Port, Timer, Retry, I, Options, PSz),
case Res of
- timeout -> {S,{error,timeout}};
+ timeout -> {S,{error,timeout}}; % Bailout timeout
{ok,_} -> Reply;
{error,{nxdomain,_}} -> Reply;
{error,{E,_}} when E =:= qfmterror; E =:= notimp; E =:= servfail;
@@ -629,17 +651,19 @@ query_nss_edns(#q{options=#options{udp_payload_size=PSz}=Options,
query_nss(Q, NSs, Timer, Retry, I, S, ErrNSs)
end.
-query_nss_dns(#q{dns=Qdns}=Q0, [{IP,Port}=NS|NSs],
- Timer, Retry, I, S0, ErrNSs) ->
+query_nss_dns(
+ #q{dns=Qdns}=Q0,
+ [{IP,Port}=NS|NSs], Timer, Retry, I, S0, ErrNSs) ->
#q{options=Options,dns={Id,Buffer}}=Q =
if
is_function(Qdns, 0) -> Q0#q{dns=Qdns()};
true -> Q0
end,
- {S,Res}=Reply = query_ns(S0, Id, Buffer, IP, Port, Timer,
- Retry, I, Options, ?PACKETSZ),
+ {S,Res}=Reply =
+ query_ns(
+ S0, Id, Buffer, IP, Port, Timer, Retry, I, Options, ?PACKETSZ),
case Res of
- timeout -> {S,{error,timeout}};
+ timeout -> {S,{error,timeout}}; % Bailout timeout
{ok,_} -> Reply;
{error,{E,_}} when E =:= nxdomain; E =:= qfmterror -> Reply;
{error,E} when E =:= fmt; E =:= enetunreach; E =:= econnrefused ->
@@ -653,48 +677,66 @@ query_ns(S0, Id, Buffer, IP, Port, Timer, Retry, I,
PSz) ->
case UseVC orelse iolist_size(Buffer) > PSz of
true ->
- {S0,query_tcp(Tm, Id, Buffer, IP, Port, Timer, Verbose)};
+ TcpTimeout = inet:timeout(Tm*5, Timer),
+ {S0,query_tcp(TcpTimeout, Id, Buffer, IP, Port, Verbose)};
false ->
case udp_open(S0, IP) of
{ok,S} ->
- {S,case query_udp(S, Id, Buffer, IP, Port, Timer,
- Retry, I, Tm, Verbose) of
- {ok,#dns_rec{header=H}} when H#dns_header.tc ->
- query_tcp(Tm, Id, Buffer,
- IP, Port, Timer, Verbose);
- Reply -> Reply
- end};
+ Timeout =
+ inet:timeout( (Tm * (1 bsl I)) div Retry, Timer),
+ {S,
+ case query_udp(
+ S, Id, Buffer, IP, Port, Timeout, Verbose) of
+ {ok,#dns_rec{header=H}} when H#dns_header.tc ->
+ TcpTimeout = inet:timeout(Tm*5, Timer),
+ query_tcp(
+ TcpTimeout, Id, Buffer, IP, Port, Verbose);
+ Reply -> Reply
+ end};
Error ->
{S0,Error}
end
end.
-query_udp(S, Id, Buffer, IP, Port, Timer, Retry, I, Tm, Verbose) ->
- Timeout = inet:timeout( (Tm * (1 bsl I)) div Retry, Timer),
+query_udp(_S, _Id, _Buffer, _IP, _Port, 0, Verbose) ->
+ timeout;
+query_udp(S, Id, Buffer, IP, Port, Timeout, Verbose) ->
?verbose(Verbose, "Try UDP server : ~p:~p (timeout=~w)\n",
- [IP, Port, Timeout]),
- udp_connect(S, IP, Port),
- udp_send(S, IP, Port, Buffer),
- query_udp_recv(S, IP, Port, Id, Timeout, Verbose).
-
-query_udp_recv(S, IP, Port, Id, Timeout, Verbose) ->
- case udp_recv(S, IP, Port, Timeout) of
- {ok,Answer,T} ->
- case decode_answer(Answer, Id, Verbose) of
- {error, badid} ->
- query_udp_recv(S, IP, Port, Id, T, Verbose);
- Reply -> Reply
+ [IP,Port,Timeout]),
+ case
+ case udp_connect(S, IP, Port) of
+ ok ->
+ udp_send(S, IP, Port, Buffer);
+ E1 ->
+ E1 end of
+ ok ->
+ Decode =
+ fun ({RecIP,RecPort,Answer})
+ when RecIP =:= IP, RecPort =:= Port ->
+ case decode_answer(Answer, Id, Verbose) of
+ {error,badid} ->
+ false;
+ Reply ->
+ Reply
+ end;
+ ({_,_,_}) ->
+ false
+ end,
+ case udp_recv(S, IP, Port, Timeout, Decode) of
+ {ok,_}=Result ->
+ Result;
+ E2 ->
+ ?verbose(Verbose, "UDP server error: ~p\n", [E2]),
+ E2
end;
- {error, timeout} when Timeout =:= 0 ->
- ?verbose(Verbose, "UDP server timeout\n", []),
- timeout;
- Error ->
- ?verbose(Verbose, "UDP server error: ~p\n", [Error]),
- Error
+ E3 ->
+ ?verbose(Verbose, "UDP send failed: ~p\n", [E3]),
+ {error,econnrefused}
end.
-query_tcp(Tm, Id, Buffer, IP, Port, Timer, Verbose) ->
- Timeout = inet:timeout(Tm*5, Timer),
+query_tcp(0, _Id, _Buffer, _IP, _Port, Verbose) ->
+ timeout;
+query_tcp(Timeout, Id, Buffer, IP, Port, Verbose) ->
?verbose(Verbose, "Try TCP server : ~p:~p (timeout=~w)\n",
[IP, Port, Timeout]),
Family = case IP of
@@ -716,19 +758,10 @@ query_tcp(Tm, Id, Buffer, IP, Port, Timer, Verbose) ->
end;
Error ->
gen_tcp:close(S),
- case Error of
- {error, timeout} when Timeout =:= 0 ->
- ?verbose(Verbose, "TCP server recv timeout\n", []),
- timeout;
- _ ->
- ?verbose(Verbose, "TCP server recv error: ~p\n",
- [Error]),
- Error
- end
+ ?verbose(Verbose, "TCP server recv error: ~p\n",
+ [Error]),
+ Error
end;
- {error, timeout} when Timeout =:= 0 ->
- ?verbose(Verbose, "TCP server connect timeout\n", []),
- timeout;
Error ->
?verbose(Verbose, "TCP server error: ~p\n", [Error]),
Error
diff --git a/lib/kernel/src/net_kernel.erl b/lib/kernel/src/net_kernel.erl
index f5e2820bbe..5228d4fe01 100644
--- a/lib/kernel/src/net_kernel.erl
+++ b/lib/kernel/src/net_kernel.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -322,24 +322,19 @@ init({Name, LongOrShortNames, TickT}) ->
process_flag(priority, max),
Ticktime = to_integer(TickT),
Ticker = spawn_link(net_kernel, ticker, [self(), Ticktime]),
- case auth:get_cookie(Node) of
- Cookie when is_atom(Cookie) ->
- {ok, #state{name = Name,
- node = Node,
- type = LongOrShortNames,
- tick = #tick{ticker = Ticker, time = Ticktime},
- connecttime = connecttime(),
- connections =
- ets:new(sys_dist,[named_table,
- protected,
- {keypos, 2}]),
- listen = Listeners,
- allowed = [],
- verbose = 0
- }};
- _ELSE ->
- {stop, {error,{bad_cookie, Node}}}
- end;
+ {ok, #state{name = Name,
+ node = Node,
+ type = LongOrShortNames,
+ tick = #tick{ticker = Ticker, time = Ticktime},
+ connecttime = connecttime(),
+ connections =
+ ets:new(sys_dist,[named_table,
+ protected,
+ {keypos, 2}]),
+ listen = Listeners,
+ allowed = [],
+ verbose = 0
+ }};
Error ->
{stop, Error}
end.
@@ -1254,7 +1249,7 @@ protocol_childspecs([H|T]) ->
epmd_module() ->
case init:get_argument(epmd_module) of
{ok,[[Module]]} ->
- Module;
+ list_to_atom(Module);
_ ->
erl_epmd
end.
diff --git a/lib/kernel/src/os.erl b/lib/kernel/src/os.erl
index 75a11a8afd..d1feae771d 100644
--- a/lib/kernel/src/os.erl
+++ b/lib/kernel/src/os.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -82,8 +82,9 @@ verify_executable(Name0, [Ext|Rest], OrigExtensions) ->
end;
_ ->
case file:read_file_info(Name1) of
- {ok, #file_info{mode=Mode}} when Mode band 8#111 =/= 0 ->
- %% XXX This test for execution permission is not full-proof
+ {ok, #file_info{type=regular,mode=Mode}}
+ when Mode band 8#111 =/= 0 ->
+ %% XXX This test for execution permission is not fool-proof
%% on Unix, since we test if any execution bit is set.
{ok, Name1};
_ ->
@@ -136,7 +137,7 @@ reverse_element([$"|T]) -> %"
reverse_element(List) ->
lists:reverse(List).
--spec extensions() -> [string()].
+-spec extensions() -> [string(),...].
%% Extensions in lower case
extensions() ->
case type() of
@@ -230,9 +231,13 @@ start_port_srv(Request) ->
catch
error:_ -> false
end,
- start_port_srv_loop(Request, StayAlive).
+ start_port_srv_handle(Request),
+ case StayAlive of
+ true -> start_port_srv_loop();
+ false -> exiting
+ end.
-start_port_srv_loop({Ref,Client}, StayAlive) ->
+start_port_srv_handle({Ref,Client}) ->
Reply = try open_port({spawn, ?SHELL},[stream]) of
Port when is_port(Port) ->
(catch port_connect(Port, Client)),
@@ -242,20 +247,18 @@ start_port_srv_loop({Ref,Client}, StayAlive) ->
error:Reason ->
{Reason,erlang:get_stacktrace()}
end,
- Client ! {Ref,Reply},
- case StayAlive of
- true -> start_port_srv_loop(get_open_port_request(), true);
- false -> exiting
- end.
+ Client ! {Ref,Reply}.
-get_open_port_request() ->
+
+start_port_srv_loop() ->
receive
{Ref, Client} = Request when is_reference(Ref),
is_pid(Client) ->
- Request;
+ start_port_srv_handle(Request);
_Junk ->
- get_open_port_request()
- end.
+ ignore
+ end,
+ start_port_srv_loop().
%%
%% unix_get_data(Port) -> Result
diff --git a/lib/kernel/test/Makefile b/lib/kernel/test/Makefile
index f84b343de8..95517ffd6a 100644
--- a/lib/kernel/test/Makefile
+++ b/lib/kernel/test/Makefile
@@ -142,9 +142,9 @@ release_tests_spec: make_emakefile
$(INSTALL_DIR) $(RELSYSDIR)
$(INSTALL_DATA) $(ERL_FILES) $(RELSYSDIR)
$(INSTALL_DATA) $(APP_FILES) $(RELSYSDIR)
- $(INSTALL_DATA) kernel.dynspec $(EMAKEFILE)\
+ $(INSTALL_DATA) kernel.spec $(EMAKEFILE)\
$(COVERFILE) $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
@tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
release_docs_spec:
diff --git a/lib/kernel/test/appinc1.erl b/lib/kernel/test/appinc1.erl
index 8456b0eac2..343fefb25c 100644
--- a/lib/kernel/test/appinc1.erl
+++ b/lib/kernel/test/appinc1.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2010. 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
diff --git a/lib/kernel/test/appinc1x.erl b/lib/kernel/test/appinc1x.erl
index 2e177727f2..8c144676ac 100644
--- a/lib/kernel/test/appinc1x.erl
+++ b/lib/kernel/test/appinc1x.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2010. 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
diff --git a/lib/kernel/test/appinc2.erl b/lib/kernel/test/appinc2.erl
index e41d58bb71..d2e0305109 100644
--- a/lib/kernel/test/appinc2.erl
+++ b/lib/kernel/test/appinc2.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2010. 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
diff --git a/lib/kernel/test/appinc2A.erl b/lib/kernel/test/appinc2A.erl
index b51a1f5035..604e31e3d3 100644
--- a/lib/kernel/test/appinc2A.erl
+++ b/lib/kernel/test/appinc2A.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2010. 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
diff --git a/lib/kernel/test/appinc2B.erl b/lib/kernel/test/appinc2B.erl
index cafb061ae3..abb60010aa 100644
--- a/lib/kernel/test/appinc2B.erl
+++ b/lib/kernel/test/appinc2B.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2010. 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
diff --git a/lib/kernel/test/appinc2top.erl b/lib/kernel/test/appinc2top.erl
index 5bd19a59e7..5a8d0d6687 100644
--- a/lib/kernel/test/appinc2top.erl
+++ b/lib/kernel/test/appinc2top.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2010. 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
diff --git a/lib/kernel/test/application_SUITE.erl b/lib/kernel/test/application_SUITE.erl
index 313b50f976..4ae4151004 100644
--- a/lib/kernel/test/application_SUITE.erl
+++ b/lib/kernel/test/application_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -18,9 +18,11 @@
%%
-module(application_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1, failover/1, failover_comp/1, permissions/1, load/1, reported_bugs/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ failover/1, failover_comp/1, permissions/1, load/1,
load_use_cache/1,
otp_1586/1, otp_2078/1, otp_2012/1, otp_2718/1, otp_2973/1,
otp_3002/1, otp_3184/1, otp_4066/1, otp_4227/1, otp_5363/1,
@@ -30,23 +32,46 @@
nodedown_start/1, init2973/0, loop2973/0, loop5606/1]).
-export([config_change/1,
- distr_changed/1, distr_changed_tc1/1, distr_changed_tc2/1,
+ distr_changed_tc1/1, distr_changed_tc2/1,
shutdown_func/1, do_shutdown/1]).
-define(TESTCASE, testcase_name).
-define(testcase, ?config(?TESTCASE, Config)).
--export([init_per_testcase/2, fin_per_testcase/2, start_type/0,
+-export([init_per_testcase/2, end_per_testcase/2, start_type/0,
start_phase/0, conf_change/0]).
% Default timetrap timeout (set in init_per_testcase).
-define(default_timeout, ?t:minutes(2)).
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[failover, failover_comp, permissions, load,
- load_use_cache, reported_bugs,
- start_phases, script_start, nodedown_start,
- permit_false_start_local, permit_false_start_dist,
- get_key, distr_changed, config_change, shutdown_func].
+ load_use_cache, {group, reported_bugs}, start_phases,
+ script_start, nodedown_start, permit_false_start_local,
+ permit_false_start_dist, get_key,
+ {group, distr_changed}, config_change, shutdown_func].
+
+groups() ->
+ [{reported_bugs, [],
+ [otp_1586, otp_2078, otp_2012, otp_2718, otp_2973,
+ otp_3002, otp_3184, otp_4066, otp_4227, otp_5363,
+ otp_5606]},
+ {distr_changed, [],
+ [distr_changed_tc1, distr_changed_tc2]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(otp_2973=Case, Config) ->
@@ -57,12 +82,12 @@ init_per_testcase(Case, Config) ->
?line Dog = test_server:timetrap(?default_timeout),
[{?TESTCASE, Case}, {watchdog, Dog}|Config].
-fin_per_testcase(otp_2973, Config) ->
+end_per_testcase(otp_2973, Config) ->
code:del_path(?config(data_dir,Config)),
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok;
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
@@ -932,9 +957,6 @@ nodedown_start(Conf) when is_list(Conf) ->
%%%-----------------------------------------------------------------
%%% Testing of reported bugs and other tickets.
%%%-----------------------------------------------------------------
-reported_bugs(suite) -> [otp_1586, otp_2078, otp_2012, otp_2718,
- otp_2973, otp_3002, otp_3184, otp_4066,
- otp_4227, otp_5363, otp_5606].
%%-----------------------------------------------------------------
%% Ticket: OTP-1586
@@ -1589,7 +1611,6 @@ get_key(Conf) when is_list(Conf) ->
%%%-----------------------------------------------------------------
%%% Testing of change of distributed parameter.
%%%-----------------------------------------------------------------
-distr_changed(suite) -> [distr_changed_tc1, distr_changed_tc2].
distr_changed_tc1(suite) -> [];
distr_changed_tc1(doc) -> ["Test change of distributed parameter."];
diff --git a/lib/kernel/test/bif_SUITE.erl b/lib/kernel/test/bif_SUITE.erl
index ae2a3a08ff..6276270d20 100644
--- a/lib/kernel/test/bif_SUITE.erl
+++ b/lib/kernel/test/bif_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -17,15 +17,16 @@
%% %CopyrightEnd%
%%
-module(bif_SUITE).
--export([all/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([spawn_tests/1,
+-export([
spawn1/1, spawn2/1, spawn3/1, spawn4/1,
- spawn_link_tests/1,
+
spawn_link1/1, spawn_link2/1, spawn_link3/1, spawn_link4/1,
- spawn_opt_tests/1,
+
spawn_opt2/1, spawn_opt3/1, spawn_opt4/1, spawn_opt5/1,
spawn_failures/1,
@@ -33,9 +34,9 @@
run_fun/1,
wilderness/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
% Default timetrap timeout (set in init_per_testcase).
-define(default_timeout, ?t:minutes(1)).
@@ -43,25 +44,36 @@
init_per_testcase(_Case, Config) ->
?line Dog = ?t:timetrap(?default_timeout),
[{watchdog, Dog} | Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-all(suite) ->
- [spawn_tests, spawn_link_tests, spawn_opt_tests, spawn_failures, wilderness].
+suite() -> [{ct_hooks,[ts_install_cth]}].
-spawn_tests(doc) -> ["Test spawn"];
-spawn_tests(suite) ->
- [spawn1, spawn2, spawn3, spawn4].
+all() ->
+ [{group, spawn_tests}, {group, spawn_link_tests},
+ {group, spawn_opt_tests}, spawn_failures, wilderness].
-spawn_link_tests(doc) -> ["Test spawn_link"];
-spawn_link_tests(suite) ->
- [spawn_link1, spawn_link2, spawn_link3, spawn_link4].
+groups() ->
+ [{spawn_tests, [], [spawn1, spawn2, spawn3, spawn4]},
+ {spawn_link_tests, [],
+ [spawn_link1, spawn_link2, spawn_link3, spawn_link4]},
+ {spawn_opt_tests, [],
+ [spawn_opt2, spawn_opt3, spawn_opt4, spawn_opt5]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-spawn_opt_tests(doc) -> ["Test spawn_opt"];
-spawn_opt_tests(suite) ->
- [spawn_opt2, spawn_opt3, spawn_opt4, spawn_opt5].
spawn1(doc) -> ["Test spawn/1"];
spawn1(suite) ->
diff --git a/lib/kernel/test/ch.erl b/lib/kernel/test/ch.erl
index 25d1b4354c..25d6f6d200 100644
--- a/lib/kernel/test/ch.erl
+++ b/lib/kernel/test/ch.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2010. 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
diff --git a/lib/kernel/test/ch_sup.erl b/lib/kernel/test/ch_sup.erl
index 9d03628839..4c923b2909 100644
--- a/lib/kernel/test/ch_sup.erl
+++ b/lib/kernel/test/ch_sup.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2010. 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
diff --git a/lib/kernel/test/cleanup.erl b/lib/kernel/test/cleanup.erl
index 831ceba8f5..01db1e9124 100644
--- a/lib/kernel/test/cleanup.erl
+++ b/lib/kernel/test/cleanup.erl
@@ -18,11 +18,22 @@
%%
-module(cleanup).
--export([all/1, cleanup/1]).
+-export([all/0,groups/0,init_per_group/2,end_per_group/2, cleanup/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
+
+all() ->
+ [cleanup].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) -> {req, [kernel], [cleanup]}.
cleanup(suite) -> [];
cleanup(_) ->
diff --git a/lib/kernel/test/code_SUITE.erl b/lib/kernel/test/code_SUITE.erl
index e52f8a0e37..3ad49254f1 100644
--- a/lib/kernel/test/code_SUITE.erl
+++ b/lib/kernel/test/code_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -18,9 +18,9 @@
%%
-module(code_SUITE).
--include("test_server.hrl").
-%-compile(export_all).
--export([all/1]).
+-include_lib("test_server/include/test_server.hrl").
+
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]).
-export([set_path/1, get_path/1, add_path/1, add_paths/1, del_path/1,
replace_path/1, load_file/1, load_abs/1, ensure_loaded/1,
delete/1, purge/1, soft_purge/1, is_loaded/1, all_loaded/1,
@@ -34,7 +34,7 @@
big_boot_embedded/1,
on_load_embedded/1, on_load_errors/1, native_early_modules/1]).
--export([init_per_testcase/2, fin_per_testcase/2,
+-export([init_per_testcase/2, end_per_testcase/2,
init_per_suite/1, end_per_suite/1,
sticky_compiler/1]).
@@ -43,19 +43,29 @@
handle_event/2, handle_call/2, handle_info/2,
terminate/2]).
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[set_path, get_path, add_path, add_paths, del_path,
replace_path, load_file, load_abs, ensure_loaded,
delete, purge, soft_purge, is_loaded, all_loaded,
load_binary, dir_req, object_code, set_path_file,
- pa_pz_option, add_del_path,
- dir_disappeared, ext_mod_dep, clash,
- load_cached, start_node_with_cache, add_and_rehash,
- where_is_file_no_cache, where_is_file_cached,
- purge_stacktrace, mult_lib_roots, bad_erl_libs,
- code_archive, code_archive2, on_load, on_load_embedded,
- big_boot_embedded,
- on_load_errors, native_early_modules].
+ pa_pz_option, add_del_path, dir_disappeared,
+ ext_mod_dep, clash, load_cached, start_node_with_cache,
+ add_and_rehash, where_is_file_no_cache,
+ where_is_file_cached, purge_stacktrace, mult_lib_roots,
+ bad_erl_libs, code_archive, code_archive2, on_load,
+ on_load_embedded, big_boot_embedded, on_load_errors,
+ native_early_modules].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
init_per_suite(Config) ->
%% The compiler will no longer create a Beam file if
@@ -76,7 +86,18 @@ init_per_testcase(_Func, Config) ->
P=code:get_path(),
P=code:get_path(),
[{watchdog, Dog}, {code_path, P}|Config].
-fin_per_testcase(_Func, Config) ->
+
+end_per_testcase(TC, Config) when TC == mult_lib_roots;
+ TC == big_boot_embedded ->
+ {ok, HostName} = inet:gethostname(),
+ NodeName = list_to_atom(atom_to_list(TC)++"@"++HostName),
+ ?t:stop_node(NodeName),
+ end_per_testcase(Config);
+end_per_testcase(_Func, Config) ->
+ end_per_testcase(Config).
+
+end_per_testcase(Config) ->
+ code:purge(code_b_test),
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog),
P=?config(code_path, Config),
@@ -906,6 +927,8 @@ add_and_rehash(Config) when is_list(Config) ->
?line true = rpc:call(Node, code, add_path, [OkDir]),
?line {error,_} = rpc:call(Node, code, add_path, [BadDir]),
?line ok = rpc:call(Node, code, rehash, []),
+
+ ?t:stop_node(Node),
ok.
where_is_file_no_cache(suite) ->
@@ -1007,9 +1030,9 @@ mult_lib_roots(Config) when is_list(Config) ->
?t:start_node(mult_lib_roots, slave,
[{args,"-env ERL_LIBS "++ErlLibs}]),
- ?line {ok,Cwd} = file:get_cwd(),
+ ?line TSPath = filename:dirname(code:which(test_server)),
?line Path0 = rpc:call(Node, code, get_path, []),
- ?line [Cwd,"."|Path1] = Path0,
+ ?line [TSPath,"."|Path1] = Path0,
?line [Kernel|Path2] = Path1,
?line [Stdlib|Path3] = Path2,
?line mult_lib_verify_lib(Kernel, "kernel"),
@@ -1028,7 +1051,6 @@ mult_lib_roots(Config) when is_list(Config) ->
?line true = rpc:call(Node, code_SUITE_mult_root_module, works_fine, []),
- ?line ?t:stop_node(Node),
ok.
mult_lib_compile(Root, Last) ->
diff --git a/lib/kernel/test/code_a_test.erl b/lib/kernel/test/code_a_test.erl
index 745bbf032c..22830fff53 100644
--- a/lib/kernel/test/code_a_test.erl
+++ b/lib/kernel/test/code_a_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2010. 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
diff --git a/lib/kernel/test/code_b_test.erl b/lib/kernel/test/code_b_test.erl
index 0f0107a2b4..a8ff570e2e 100644
--- a/lib/kernel/test/code_b_test.erl
+++ b/lib/kernel/test/code_b_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2010. 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
diff --git a/lib/kernel/test/disk_log_SUITE.erl b/lib/kernel/test/disk_log_SUITE.erl
index 1bfe76f5ea..4ae47b4762 100644
--- a/lib/kernel/test/disk_log_SUITE.erl
+++ b/lib/kernel/test/disk_log_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -28,46 +28,47 @@
-define(config(X,Y), foo).
-define(t,test_server).
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(format(S, A), ok).
-define(privdir(Conf), ?config(priv_dir, Conf)).
-define(datadir(Conf), ?config(data_dir, Conf)).
-endif.
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
- halt_int/1, halt_int_inf/1, halt_int_sz/1,
+ halt_int_inf/1,
halt_int_sz_1/1, halt_int_sz_2/1,
- read_mode/1, halt_int_ro/1, halt_ext_ro/1, wrap_int_ro/1,
+ halt_int_ro/1, halt_ext_ro/1, wrap_int_ro/1,
wrap_ext_ro/1, halt_trunc/1, halt_misc/1, halt_ro_alog/1,
halt_ro_balog/1, halt_ro_crash/1,
- wrap_int/1, wrap_int_1/1, wrap_int_2/1, inc_wrap_file/1,
+ wrap_int_1/1, wrap_int_2/1, inc_wrap_file/1,
- halt_ext/1, halt_ext_inf/1,
+ halt_ext_inf/1,
- halt_ext_sz/1, halt_ext_sz_1/1, halt_ext_sz_2/1,
+ halt_ext_sz_1/1, halt_ext_sz_2/1,
- wrap_ext/1, wrap_ext_1/1, wrap_ext_2/1,
+ wrap_ext_1/1, wrap_ext_2/1,
- head/1, head_func/1, plain_head/1, one_header/1,
+ head_func/1, plain_head/1, one_header/1,
- notif/1, wrap_notif/1, full_notif/1, trunc_notif/1, blocked_notif/1,
+ wrap_notif/1, full_notif/1, trunc_notif/1, blocked_notif/1,
new_idx_vsn/1,
reopen/1,
- block/1, block_blocked/1, block_queue/1, block_queue2/1,
+ block_blocked/1, block_queue/1, block_queue2/1,
unblock/1,
- open/1, open_overwrite/1, open_size/1, open_truncate/1, open_error/1,
+ open_overwrite/1, open_size/1, open_truncate/1, open_error/1,
- close/1, close_race/1, close_block/1, close_deadlock/1,
+ close_race/1, close_block/1, close_deadlock/1,
- error/1, error_repair/1, error_log/1, error_index/1,
+ error_repair/1, error_log/1, error_index/1,
chunk/1,
@@ -75,15 +76,15 @@
many_users/1,
- info/1, info_current/1,
+ info_current/1,
- change_size/1, change_size_before/1, change_size_during/1,
+ change_size_before/1, change_size_during/1,
change_size_after/1, default_size/1, change_size2/1,
change_size_truncate/1,
change_attribute/1,
- distribution/1, dist_open/1, dist_error_open/1, dist_notify/1,
+ dist_open/1, dist_error_open/1, dist_notify/1,
dist_terminate/1, dist_accessible/1, dist_deadlock/1,
dist_open2/1, other_groups/1,
@@ -94,7 +95,7 @@
-export([head_fun/1, hf/0, lserv/1,
measure/0, init_m/1, xx/0, head_exit/0, slow_header/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
-export([try_unblock/1]).
@@ -142,8 +143,59 @@
change_size_after, default_size]).
-all(suite) ->
- ?ALL_TESTS.
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, halt_int}, {group, wrap_int},
+ {group, halt_ext}, {group, wrap_ext},
+ {group, read_mode}, {group, head}, {group, notif},
+ new_idx_vsn, reopen, {group, block}, unblock,
+ {group, open}, {group, close}, {group, error}, chunk,
+ truncate, many_users, {group, info},
+ {group, change_size}, change_attribute,
+ {group, distribution}, evil, otp_6278].
+
+groups() ->
+ [{halt_int, [], [halt_int_inf, {group, halt_int_sz}]},
+ {halt_int_sz, [], [halt_int_sz_1, halt_int_sz_2]},
+ {read_mode, [],
+ [halt_int_ro, halt_ext_ro, wrap_int_ro, wrap_ext_ro,
+ halt_trunc, halt_misc, halt_ro_alog, halt_ro_balog,
+ halt_ro_crash]},
+ {wrap_int, [], [wrap_int_1, wrap_int_2, inc_wrap_file]},
+ {halt_ext, [], [halt_ext_inf, {group, halt_ext_sz}]},
+ {halt_ext_sz, [], [halt_ext_sz_1, halt_ext_sz_2]},
+ {wrap_ext, [], [wrap_ext_1, wrap_ext_2]},
+ {head, [], [head_func, plain_head, one_header]},
+ {notif, [],
+ [wrap_notif, full_notif, trunc_notif, blocked_notif]},
+ {block, [], [block_blocked, block_queue, block_queue2]},
+ {open, [],
+ [open_overwrite, open_size, open_truncate, open_error]},
+ {close, [], [close_race, close_block, close_deadlock]},
+ {error, [], [error_repair, error_log, error_index]},
+ {info, [], [info_current]},
+ {change_size, [],
+ [change_size_before, change_size_during,
+ change_size_after, default_size, change_size2,
+ change_size_truncate]},
+ {distribution, [],
+ [dist_open, dist_error_open, dist_notify,
+ dist_terminate, dist_accessible, dist_deadlock,
+ dist_open2, other_groups]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(Case, Config) ->
@@ -167,12 +219,11 @@ init_per_testcase(Case, Config) ->
[{watchdog, Dog}|Config]
end.
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-halt_int(suite) -> [halt_int_inf, halt_int_sz].
halt_int_inf(suite) -> [];
halt_int_inf(doc) -> ["Test simple halt disk log, size infinity"];
@@ -187,7 +238,6 @@ halt_int_inf(Conf) when is_list(Conf) ->
?line ok = disk_log:close(a),
?line ok = file:delete(File).
-halt_int_sz(suite) -> [halt_int_sz_1, halt_int_sz_2].
halt_int_sz_1(suite) -> [];
halt_int_sz_1(doc) -> ["Test simple halt disk log, size defined"];
@@ -275,10 +325,6 @@ halt_int_sz_2(Conf) when is_list(Conf) ->
?line ok = file:delete(File3),
ok.
-read_mode(suite) -> [halt_int_ro, halt_ext_ro,
- wrap_int_ro, wrap_ext_ro,
- halt_trunc, halt_misc, halt_ro_alog, halt_ro_balog,
- halt_ro_crash].
halt_int_ro(suite) -> [];
halt_int_ro(doc) -> ["Test simple halt disk log, read only, internal"];
@@ -480,7 +526,6 @@ halt_ro_crash(Conf) when is_list(Conf) ->
-wrap_int(suite) -> [wrap_int_1, wrap_int_2, inc_wrap_file].
wrap_int_1(suite) -> [];
wrap_int_1(doc) -> ["Test wrap disk log, internal"];
@@ -628,7 +673,6 @@ inc_wrap_file(Conf) when is_list(Conf) ->
-halt_ext(suite) -> [halt_ext_inf, halt_ext_sz].
halt_ext_inf(suite) -> [];
halt_ext_inf(doc) -> ["Test halt disk log, external, infinity"];
@@ -642,7 +686,6 @@ halt_ext_inf(Conf) when is_list(Conf) ->
?line ok = disk_log:close(a),
?line ok = file:delete(File).
-halt_ext_sz(suite) -> [halt_ext_sz_1, halt_ext_sz_2].
halt_ext_sz_1(suite) -> [];
halt_ext_sz_1(doc) -> ["Test halt disk log, external, size defined"];
@@ -734,7 +777,6 @@ halt_ext_sz_2(Conf) when is_list(Conf) ->
?line ok = file:delete(File3),
ok.
-wrap_ext(suite) -> [wrap_ext_1, wrap_ext_2].
wrap_ext_1(suite) -> [];
wrap_ext_1(doc) -> ["Test wrap disk log, external, size defined"];
@@ -1147,7 +1189,6 @@ end_times({T1,W1}) ->
{W2, _} = statistics(wall_clock),
{T2-T1, W2-W1}.
-head(suite) -> [head_func, plain_head, one_header].
head_func(suite) -> [];
head_func(doc) -> ["Test head parameter"];
@@ -1327,8 +1368,6 @@ one_header(Conf) when is_list(Conf) ->
ok.
-notif(suite) -> [wrap_notif, full_notif, trunc_notif,
- blocked_notif].
wrap_notif(suite) -> [];
wrap_notif(doc) -> ["Test notify parameter, wrap"];
@@ -1553,7 +1592,6 @@ reopen(Conf) when is_list(Conf) ->
?line Q = qlen(),
ok.
-block(suite) -> [block_blocked, block_queue, block_queue2].
block_blocked(suite) -> [];
block_blocked(doc) ->
@@ -1826,8 +1864,6 @@ try_unblock(Log) ->
?line Error = {error, {not_blocked_by_pid, n}} = disk_log:unblock(Log),
?line "The disk log" ++ _ = format_error(Error).
-open(suite) -> [open_overwrite, open_size,
- open_truncate, open_error].
open_overwrite(suite) -> [];
open_overwrite(doc) ->
@@ -2075,7 +2111,6 @@ open_error(Conf) when is_list(Conf) ->
?line del(File, No).
-close(suite) -> [close_race, close_block, close_deadlock].
close_race(suite) -> [];
close_race(doc) ->
@@ -2497,7 +2532,6 @@ lserv(Log) ->
end,
lserv(Log).
-error(suite) -> [error_repair, error_log, error_index].
error_repair(suite) -> [];
error_repair(doc) ->
@@ -3215,7 +3249,6 @@ del_files(_Size, File) ->
-info(suite) -> [info_current].
info_current(suite) -> [];
info_current(doc) ->
@@ -3420,11 +3453,6 @@ info_current(Conf) when is_list(Conf) ->
ok.
-change_size(suite) -> [change_size_before,
- change_size_during,
- change_size_after,
- default_size, change_size2,
- change_size_truncate].
change_size_before(suite) -> [];
change_size_before(doc) ->
@@ -4094,13 +4122,6 @@ change_attribute(Conf) when is_list(Conf) ->
?line Q = qlen(),
?line del(File, No).
-distribution(suite) -> [dist_open, dist_error_open,
- dist_notify,
- dist_terminate,
- dist_accessible,
- dist_deadlock,
- dist_open2,
- other_groups].
dist_open(suite) -> [];
dist_open(doc) ->
diff --git a/lib/kernel/test/erl_boot_server_SUITE.erl b/lib/kernel/test/erl_boot_server_SUITE.erl
index 241d68fef4..cea3715ce4 100644
--- a/lib/kernel/test/erl_boot_server_SUITE.erl
+++ b/lib/kernel/test/erl_boot_server_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -18,9 +18,9 @@
%%
-module(erl_boot_server_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/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([start/1, start_link/1, stop/1, add/1, delete/1, responses/1]).
@@ -33,9 +33,27 @@
%% Changed for the new erl_boot_server for R3A by Bjorn Gustavsson.
%%-----------------------------------------------------------------
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[start, start_link, stop, add, delete, responses].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
-define(all_ones, {255, 255, 255, 255}).
start(doc) -> "Tests the erl_boot_server:start/1 function.";
diff --git a/lib/kernel/test/erl_distribution_SUITE.erl b/lib/kernel/test/erl_distribution_SUITE.erl
index 21a96f804a..9cccdab76b 100644
--- a/lib/kernel/test/erl_distribution_SUITE.erl
+++ b/lib/kernel/test/erl_distribution_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -19,13 +19,14 @@
-module(erl_distribution_SUITE).
%-define(line_trace, 1).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/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([tick/1, tick_change/1, illegal_nodenames/1, hidden_node/1,
table_waste/1, net_setuptime/1,
- monitor_nodes/1,
+
monitor_nodes_nodedown_reason/1,
monitor_nodes_complex_nodedown_reason/1,
monitor_nodes_node_type/1,
@@ -41,7 +42,7 @@
tick_serv_test/2, tick_serv_test1/1,
keep_conn/1, time_ping/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
-export([start_node/2]).
@@ -57,16 +58,39 @@
%% erl -sname master -rsh ctrsh
%%-----------------------------------------------------------------
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[tick, tick_change, illegal_nodenames, hidden_node,
- table_waste, net_setuptime,
- monitor_nodes].
+ table_waste, net_setuptime, {group, monitor_nodes}].
+
+groups() ->
+ [{monitor_nodes, [],
+ [monitor_nodes_nodedown_reason,
+ monitor_nodes_complex_nodedown_reason,
+ monitor_nodes_node_type, monitor_nodes_misc,
+ monitor_nodes_otp_6481, monitor_nodes_errors,
+ monitor_nodes_combinations, monitor_nodes_cleanup,
+ monitor_nodes_many]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog=?t:timetrap(?t:minutes(4)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog).
@@ -530,18 +554,6 @@ check_monitor_nodes_res(Pid, Node) ->
end.
-monitor_nodes(doc) ->
- [];
-monitor_nodes(suite) ->
- [monitor_nodes_nodedown_reason,
- monitor_nodes_complex_nodedown_reason,
- monitor_nodes_node_type,
- monitor_nodes_misc,
- monitor_nodes_otp_6481,
- monitor_nodes_errors,
- monitor_nodes_combinations,
- monitor_nodes_cleanup,
- monitor_nodes_many].
%%
%% Testcase:
@@ -845,13 +857,16 @@ monitor_nodes_otp_6481_test(Config, TestType) when is_list(Config) ->
?line {ok, Node} = start_node(Name, "", this),
?line receive {nodeup, Node} -> ok end,
- ?line spawn(Node,
+ ?line RemotePid = spawn(Node,
fun () ->
- receive after 1000 -> ok end,
- lists:foreach(fun (No) ->
- Me ! {NodeMsg, No}
- end,
- Seq),
+ receive after 1500 -> ok end,
+ % infinit loop of msgs
+ % we want an endless stream of messages and the kill
+ % the node mercilessly.
+ % We then want to ensure that the nodedown message arrives
+ % last ... without garbage after it.
+ _ = spawn(fun() -> node_loop_send(Me, NodeMsg, 1) end),
+ receive {Me, kill_it} -> ok end,
halt()
end),
@@ -860,9 +875,11 @@ monitor_nodes_otp_6481_test(Config, TestType) when is_list(Config) ->
%% Verify that '{nodeup, Node}' comes before '{NodeMsg, 1}' (the message
%% bringing up the connection).
- %%?line no_msgs(500), % Why wait? It fails test sometimes /sverker
+ ?line no_msgs(500),
?line {nodeup, Node} = receive Msg1 -> Msg1 end,
- ?line {NodeMsg, 1} = receive Msg2 -> Msg2 end,
+ ?line {NodeMsg, 1} = receive Msg2 -> Msg2 end,
+ % msg stream has begun, kill the node
+ ?line RemotePid ! {self(), kill_it},
%% Verify that '{nodedown, Node}' comes after the last '{NodeMsg, N}'
%% message.
@@ -883,6 +900,10 @@ flush_node_msgs(NodeMsg, No) ->
OtherMsg -> OtherMsg
end.
+node_loop_send(Pid, Msg, No) ->
+ Pid ! {Msg, No},
+ node_loop_send(Pid, Msg, No + 1).
+
monitor_nodes_errors(doc) ->
[];
monitor_nodes_errors(suite) ->
diff --git a/lib/kernel/test/erl_distribution_wb_SUITE.erl b/lib/kernel/test/erl_distribution_wb_SUITE.erl
index 627fed1fdd..3b8b2d9150 100644
--- a/lib/kernel/test/erl_distribution_wb_SUITE.erl
+++ b/lib/kernel/test/erl_distribution_wb_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -18,12 +18,13 @@
%%
-module(erl_distribution_wb_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("kernel/include/inet.hrl").
--export([all/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([init_per_testcase/2, fin_per_testcase/2, whitebox/1,
+-export([init_per_testcase/2, end_per_testcase/2, whitebox/1,
switch_options/1, missing_compulsory_dflags/1]).
%% 1)
@@ -77,14 +78,32 @@
-define(u32(X3,X2,X1,X0),
(((X3) bsl 24) bor ((X2) bsl 16) bor ((X1) bsl 8) bor (X0))).
-all(suite) ->
- [whitebox,switch_options,missing_compulsory_dflags].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [whitebox, switch_options, missing_compulsory_dflags].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog=?t:timetrap(?t:minutes(1)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog).
diff --git a/lib/kernel/test/erl_prim_loader_SUITE.erl b/lib/kernel/test/erl_prim_loader_SUITE.erl
index 19c84ab34c..f47c4603cf 100644
--- a/lib/kernel/test/erl_prim_loader_SUITE.erl
+++ b/lib/kernel/test/erl_prim_loader_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -19,9 +19,10 @@
-module(erl_prim_loader_SUITE).
-include_lib("kernel/include/file.hrl").
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/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([get_path/1, set_path/1, get_file/1,
inet_existing/1, inet_coming_up/1, inet_disconnects/1,
@@ -29,27 +30,41 @@
local_archive/1, remote_archive/1,
primary_archive/1, virtual_dir_in_archive/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
%%-----------------------------------------------------------------
%% Test suite for erl_prim_loader. (Most code is run during system start/stop.)
%%-----------------------------------------------------------------
-all(suite) ->
- [
- get_path, set_path, get_file,
- inet_existing, inet_coming_up,
- inet_disconnects, multiple_slaves,
- file_requests, local_archive,
- remote_archive, primary_archive,
- virtual_dir_in_archive
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [get_path, set_path, get_file, inet_existing,
+ inet_coming_up, inet_disconnects, multiple_slaves,
+ file_requests, local_archive, remote_archive,
+ primary_archive, virtual_dir_in_archive].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog=?t:timetrap(?t:minutes(3)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog).
@@ -291,7 +306,6 @@ wait_and_shutdown([], _) ->
ok.
-file_requests(suite) -> {req, [{local_slave_nodes, 1}, {time, 10}]};
file_requests(doc) -> ["Start a node using the 'inet' loading method, ",
"verify that the boot server responds to file requests."];
file_requests(Config) when is_list(Config) ->
@@ -300,9 +314,11 @@ file_requests(Config) when is_list(Config) ->
%% compare with results from file server calls (the
%% boot server uses the same file sys and cwd)
{ok,Files} = file:list_dir("."),
+ io:format("Files: ~p~n",[Files]),
?line {ok,Files} = rpc:call(Node, erl_prim_loader, list_dir, ["."]),
- {ok,Info} = file:read_file_info("test_server.beam"),
- ?line {ok,Info} = rpc:call(Node, erl_prim_loader, read_file_info, ["test_server.beam"]),
+ {ok,Info} = file:read_file_info(code:which(test_server)),
+ ?line {ok,Info} = rpc:call(Node, erl_prim_loader, read_file_info,
+ [code:which(test_server)]),
{ok,Cwd} = file:get_cwd(),
?line {ok,Cwd} = rpc:call(Node, erl_prim_loader, get_cwd, []),
case file:get_cwd("C:") of
diff --git a/lib/kernel/test/error_logger_SUITE.erl b/lib/kernel/test/error_logger_SUITE.erl
index eda86861d5..05bf5aae18 100644
--- a/lib/kernel/test/error_logger_SUITE.erl
+++ b/lib/kernel/test/error_logger_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -18,7 +18,7 @@
%%
-module(error_logger_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%%-----------------------------------------------------------------
%% We don't have to test the normal behaviour here, i.e. the tty
@@ -27,7 +27,9 @@
%% error_logger deliver the expected events.
%%-----------------------------------------------------------------
--export([all/1, error_report/1, info_report/1, error/1, info/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ error_report/1, info_report/1, error/1, info/1,
emulator/1, tty/1, logfile/1, add/1, delete/1]).
-export([generate_error/0]).
@@ -37,9 +39,27 @@
terminate/2]).
-all(suite) ->
- [error_report, info_report, error, info,
- emulator, tty, logfile, add, delete].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [error_report, info_report, error, info, emulator, tty,
+ logfile, add, delete].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%-----------------------------------------------------------------
diff --git a/lib/kernel/test/error_logger_warn_SUITE.erl b/lib/kernel/test/error_logger_warn_SUITE.erl
index 6629eca1ad..265e1ae4c8 100644
--- a/lib/kernel/test/error_logger_warn_SUITE.erl
+++ b/lib/kernel/test/error_logger_warn_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -18,7 +18,9 @@
%%
-module(error_logger_warn_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
basic/1,warnings_info/1,warnings_warnings/1,
rb_basic/1,rb_warnings_info/1,rb_warnings_warnings/1,
rb_trunc/1,rb_utc/1,file_utc/1]).
@@ -26,7 +28,7 @@
%% Internal exports.
-export([init/1,handle_event/2,handle_info/2,handle_call/2]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(EXPECT(Pattern),
(fun() ->
@@ -43,15 +45,33 @@
-define(default_timeout, ?t:minutes(1)).
-all(suite) ->
- [basic, warnings_info, warnings_warnings,
- rb_basic, rb_warnings_info, rb_warnings_warnings,
- rb_trunc,rb_utc, file_utc].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [basic, warnings_info, warnings_warnings, rb_basic,
+ rb_warnings_info, rb_warnings_warnings, rb_trunc,
+ rb_utc, file_utc].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Case, Config) ->
?line Dog = ?t:timetrap(?default_timeout),
[{watchdog, Dog} | Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/kernel/test/file_SUITE.erl b/lib/kernel/test/file_SUITE.erl
index 47592ddb14..2f73394c4e 100644
--- a/lib/kernel/test/file_SUITE.erl
+++ b/lib/kernel/test/file_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -40,29 +40,29 @@
-module(?FILE_SUITE).
--export([all/1,
- init/1, fini/1,
- init_per_testcase/2, fin_per_testcase/2,
- read_write_file/1, dirs/1, files/1, names/1]).
+-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,
+ read_write_file/1, names/1]).
-export([cur_dir_0/1, cur_dir_1/1, make_del_dir/1,
- pos/1, pos1/1, pos2/1]).
--export([close/1, consult/1, consult1/1, path_consult/1, delete/1]).
--export([eval/1, eval1/1, path_eval/1, script/1, script1/1, path_script/1,
- open/1, open1/1,
+ pos1/1, pos2/1]).
+-export([close/1, consult1/1, path_consult/1, delete/1]).
+-export([ eval1/1, path_eval/1, script1/1, path_script/1,
+ open1/1,
old_modes/1, new_modes/1, path_open/1, open_errors/1]).
--export([file_info/1, file_info_basic_file/1, file_info_basic_directory/1,
+-export([ file_info_basic_file/1, file_info_basic_directory/1,
file_info_bad/1, file_info_times/1, file_write_file_info/1]).
-export([rename/1, access/1, truncate/1, datasync/1, sync/1,
read_write/1, pread_write/1, append/1, exclusive/1]).
--export([errors/1, e_delete/1, e_rename/1, e_make_dir/1, e_del_dir/1]).
+-export([ e_delete/1, e_rename/1, e_make_dir/1, e_del_dir/1]).
-export([otp_5814/1]).
--export([compression/1, read_not_really_compressed/1,
+-export([ read_not_really_compressed/1,
read_compressed_cooked/1, read_compressed_cooked_binary/1,
read_cooked_tar_problem/1,
write_compressed/1, compress_errors/1, catenated_gzips/1]).
--export([links/1, make_link/1, read_link_info_for_non_link/1, symlinks/1]).
+-export([ make_link/1, read_link_info_for_non_link/1, symlinks/1]).
-export([copy/1]).
@@ -93,23 +93,56 @@
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("kernel/include/file.hrl").
-all(suite) ->
- {conf, init,
- [altname, read_write_file, dirs, files,
- delete, rename, names, errors,
- compression, links, copy,
- delayed_write, read_ahead, segment_read, segment_write,
- ipread, pid2name, interleaved_read_write,
- otp_5814, large_file, read_line_1, read_line_2, read_line_3, read_line_4,
- standard_io],
- fini}.
-
-init(Config) when is_list(Config) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [altname, read_write_file, {group, dirs},
+ {group, files}, delete, rename, names, {group, errors},
+ {group, compression}, {group, links}, copy,
+ delayed_write, read_ahead, segment_read, segment_write,
+ ipread, pid2name, interleaved_read_write, otp_5814,
+ large_file, read_line_1, read_line_2, read_line_3,
+ read_line_4, standard_io].
+
+groups() ->
+ [{dirs, [], [make_del_dir, cur_dir_0, cur_dir_1]},
+ {files, [],
+ [{group, open}, {group, pos}, {group, file_info},
+ {group, consult}, {group, eval}, {group, script},
+ truncate, sync, datasync, advise]},
+ {open, [],
+ [open1, old_modes, new_modes, path_open, close, access,
+ read_write, pread_write, append, open_errors,
+ exclusive]},
+ {pos, [], [pos1, pos2]},
+ {file_info, [],
+ [file_info_basic_file, file_info_basic_directory,
+ file_info_bad, file_info_times, file_write_file_info]},
+ {consult, [], [consult1, path_consult]},
+ {eval, [], [eval1, path_eval]},
+ {script, [], [script1, path_script]},
+ {errors, [],
+ [e_delete, e_rename, e_make_dir, e_del_dir]},
+ {compression, [],
+ [read_compressed_cooked, read_compressed_cooked_binary,
+ read_cooked_tar_problem, read_not_really_compressed,
+ write_compressed, compress_errors, catenated_gzips]},
+ {links, [],
+ [make_link, read_link_info_for_non_link, symlinks]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+init_per_suite(Config) when is_list(Config) ->
case os:type() of
{win32, _} ->
Priv = ?config(priv_dir, Config),
@@ -126,7 +159,7 @@ init(Config) when is_list(Config) ->
?FILE_INIT(Config)
end.
-fini(Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
case os:type() of
{win32, _} ->
os:cmd("subst z: /d");
@@ -139,7 +172,7 @@ init_per_testcase(_Func, Config) ->
%%error_logger:info_msg("~p:~p *****~n", [?MODULE, _Func]),
?FILE_INIT_PER_TESTCASE(Config).
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
%% error_logger:info_msg("~p:~p END *****~n", [?MODULE, _Func]),
?FILE_FIN_PER_TESTCASE(Config).
@@ -314,7 +347,6 @@ read_write_file(Config) when is_list(Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-dirs(suite) -> [make_del_dir, cur_dir_0, cur_dir_1].
make_del_dir(suite) -> [];
make_del_dir(doc) -> [];
@@ -461,12 +493,7 @@ win_cur_dir_1(_Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-files(suite) ->
- [open,pos,file_info,consult,eval,script,truncate,
- sync,datasync,advise].
-open(suite) -> [open1,old_modes,new_modes,path_open,close,access,read_write,
- pread_write,append,open_errors,exclusive].
open1(suite) -> [];
open1(doc) -> [];
@@ -858,7 +885,6 @@ exclusive(Config) when is_list(Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-pos(suite) -> [pos1,pos2].
pos1(suite) -> [];
pos1(doc) -> [];
@@ -950,8 +976,6 @@ pos2(Config) when is_list(Config) ->
?line test_server:timetrap_cancel(Dog),
ok.
-file_info(suite) -> [file_info_basic_file, file_info_basic_directory,
- file_info_bad, file_info_times, file_write_file_info].
file_info_basic_file(suite) -> [];
file_info_basic_file(doc) -> [];
@@ -1217,7 +1241,6 @@ file_write_file_info(Config) when is_list(Config) ->
get_good_directory(Config) ->
?line ?config(priv_dir, Config).
-consult(suite) -> [consult1, path_consult].
consult1(suite) -> [];
consult1(doc) -> [];
@@ -1278,7 +1301,6 @@ path_consult(Config) when is_list(Config) ->
?line test_server:timetrap_cancel(Dog),
ok.
-eval(suite) -> [eval1,path_eval].
eval1(suite) -> [];
eval1(doc) -> [];
@@ -1351,7 +1373,6 @@ path_eval(Config) when is_list(Config) ->
?line test_server:timetrap_cancel(Dog),
ok.
-script(suite) -> [script1,path_script].
script1(suite) -> [];
script1(doc) -> "";
@@ -1702,7 +1723,6 @@ names(Config) when is_list(Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-errors(suite) -> [e_delete, e_rename, e_make_dir, e_del_dir].
e_delete(suite) -> [];
e_delete(doc) -> [];
@@ -1959,12 +1979,6 @@ e_del_dir(Config) when is_list(Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-compression(suite) ->
- [read_compressed_cooked, read_compressed_cooked_binary,
- read_cooked_tar_problem,
- read_not_really_compressed,
- write_compressed, compress_errors,
- catenated_gzips].
%% Trying reading and positioning from a compressed file.
@@ -2041,6 +2055,10 @@ try_read_file_list(Fd) ->
?line Title = "Real Programmers Don't Use PASCAL</TITLE>\n",
?line Title = io:get_line(Fd, ''),
+ %% Seek past the end of the file.
+
+ ?line {ok, _} = ?FILE_MODULE:position(Fd, 25000),
+
%% Done.
?line ?FILE_MODULE:close(Fd),
@@ -2258,8 +2276,6 @@ altname(Config) when is_list(Config) ->
?line test_server:timetrap_cancel(Dog),
Result.
-links(doc) -> "Test the link functions.";
-links(suite) -> [make_link, read_link_info_for_non_link, symlinks].
make_link(doc) -> "Test creating a hard link.";
make_link(suite) -> [];
diff --git a/lib/kernel/test/file_name_SUITE.erl b/lib/kernel/test/file_name_SUITE.erl
index fea4df8539..53bcb1162d 100644
--- a/lib/kernel/test/file_name_SUITE.erl
+++ b/lib/kernel/test/file_name_SUITE.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -18,7 +18,7 @@
%% %CopyrightEnd%
%%
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("kernel/include/file.hrl").
%%
@@ -70,7 +70,10 @@
%% list_dir
%% read_link
--export([all/1,init_per_testcase/2, fin_per_testcase/2]).
+-export([all/0,groups/0,suite/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([normal/1,icky/1,very_icky/1,normalize/1]).
@@ -78,13 +81,29 @@ init_per_testcase(_Func, Config) ->
Dog = test_server:timetrap(test_server:seconds(60)),
[{watchdog,Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog).
+suite() -> [{ct_hooks,[ts_install_cth]}].
-all(suite) ->
- [normal,icky,very_icky,normalize].
+all() ->
+ [normal, icky, very_icky, normalize].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
normalize(suite) ->
[];
@@ -507,8 +526,16 @@ check_very_icky(Mod) ->
end,
?line {NumOK,NumNOK} = filelib:fold_files(".",".*",true,fun(_F,{N,M}) when is_list(_F) -> io:format("~ts~n",[_F]),{N+1,M}; (_F,{N,M}) -> io:format("~p~n",[_F]),{N,M+1} end,{0,0}),
?line ok = filelib:fold_files(".",[1076,1089,1072,124,46,42],true,fun(_F,_) -> ok end,false),
- ?line SF3 = unicode:characters_to_binary("���subfil3",file:native_name_encoding()),
- ?line Sorted = lists:sort([SF3,<<"���subfil2">>]),
+ ?line SF3 = unicode:characters_to_binary("���subfil3",
+ file:native_name_encoding()),
+ ?line SF2 = case treat_icky(<<"���subfil2">>) of
+ LF2 when is_list(LF2) ->
+ unicode:characters_to_binary(LF2,
+ file:native_name_encoding());
+ BF2 ->
+ BF2
+ end,
+ ?line Sorted = lists:sort([SF3,SF2]),
?line Sorted = lists:sort(filelib:wildcard("*",<<"���subdir2">>)),
ok
catch
diff --git a/lib/kernel/test/gen_sctp_SUITE.erl b/lib/kernel/test/gen_sctp_SUITE.erl
index 9aa94a0868..03e734445c 100644
--- a/lib/kernel/test/gen_sctp_SUITE.erl
+++ b/lib/kernel/test/gen_sctp_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -18,26 +18,58 @@
%%
-module(gen_sctp_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("kernel/include/inet_sctp.hrl").
%%-compile(export_all).
--export([all/1,init_per_testcase/2,fin_per_testcase/2]).
+-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(
[basic/1,
api_open_close/1,api_listen/1,api_connect_init/1,api_opts/1,
xfer_min/1,xfer_active/1,def_sndrcvinfo/1,implicit_inet6/1]).
-all(suite) ->
- [basic,
- api_open_close,api_listen,api_connect_init,api_opts,
- xfer_min,xfer_active,def_sndrcvinfo,implicit_inet6].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [basic, api_open_close, api_listen, api_connect_init,
+ api_opts, xfer_min, xfer_active, def_sndrcvinfo,
+ implicit_inet6].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ try gen_sctp:open() of
+ {ok,Socket} ->
+ gen_sctp:close(Socket),
+ [];
+ _ ->
+ []
+ catch
+ error:badarg ->
+ {skip,"SCTP not supported on this machine"};
+ _:_ ->
+ Config
+ end.
+
+end_per_suite(_Conifig) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Func, Config) ->
Dog = test_server:timetrap(test_server:seconds(15)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog).
diff --git a/lib/kernel/test/gen_tcp_api_SUITE.erl b/lib/kernel/test/gen_tcp_api_SUITE.erl
index 94637290a1..fd4685cdad 100644
--- a/lib/kernel/test/gen_tcp_api_SUITE.erl
+++ b/lib/kernel/test/gen_tcp_api_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -22,30 +22,52 @@
%% are not tested here, because they are tested indirectly in this and
%% and other test suites.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("kernel/include/inet.hrl").
--export([all/1, init_per_testcase/2, fin_per_testcase/2,
- t_accept/1, t_connect_timeout/1, t_accept_timeout/1,
- t_connect/1, t_connect_bad/1,
- t_recv/1, t_recv_timeout/1, t_recv_eof/1,
+-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,
+ t_connect_timeout/1, t_accept_timeout/1,
+ t_connect_bad/1,
+ t_recv_timeout/1, t_recv_eof/1,
t_shutdown_write/1, t_shutdown_both/1, t_shutdown_error/1,
t_fdopen/1, t_implicit_inet6/1]).
-all(suite) -> [t_accept, t_connect, t_recv, t_shutdown_write,
- t_shutdown_both, t_shutdown_error, t_fdopen,
- t_implicit_inet6].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, t_accept}, {group, t_connect}, {group, t_recv},
+ t_shutdown_write, t_shutdown_both, t_shutdown_error,
+ t_fdopen, t_implicit_inet6].
+
+groups() ->
+ [{t_accept, [], [t_accept_timeout]},
+ {t_connect, [], [t_connect_timeout, t_connect_bad]},
+ {t_recv, [], [t_recv_timeout, t_recv_eof]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Func, Config) ->
Dog = test_server:timetrap(test_server:seconds(60)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog).
%%% gen_tcp:accept/1,2
-t_accept(suite) -> [t_accept_timeout].
t_accept_timeout(doc) -> "Test that gen_tcp:accept/2 (with timeout) works.";
t_accept_timeout(suite) -> [];
@@ -55,7 +77,6 @@ t_accept_timeout(Config) when is_list(Config) ->
%%% gen_tcp:connect/X
-t_connect(suite) -> [t_connect_timeout, t_connect_bad].
t_connect_timeout(doc) -> "Test that gen_tcp:connect/4 (with timeout) works.";
t_connect_timeout(Config) when is_list(Config) ->
@@ -84,7 +105,6 @@ t_connect_bad(Config) when is_list(Config) ->
%%% gen_tcp:recv/X
-t_recv(suite) -> [t_recv_timeout, t_recv_eof].
t_recv_timeout(doc) -> "Test that gen_tcp:recv/3 (with timeout works).";
t_recv_timeout(suite) -> [];
@@ -160,34 +180,38 @@ t_fdopen(Config) when is_list(Config) ->
%%% implicit inet6 option to api functions
t_implicit_inet6(Config) when is_list(Config) ->
- ?line Hostname = ok(inet:gethostname()),
+ ?line Host = ok(inet:gethostname()),
+ ?line
+ case inet:getaddr(Host, inet6) of
+ {ok,Addr} ->
+ ?line t_implicit_inet6(Host, Addr);
+ {error,Reason} ->
+ {skip,
+ "Can not look up IPv6 address: "
+ ++atom_to_list(Reason)}
+ end.
+
+t_implicit_inet6(Host, Addr) ->
?line
case gen_tcp:listen(0, [inet6]) of
{ok,S1} ->
- ?line
- case inet:getaddr(Hostname, inet6) of
- {ok,Host} ->
- ?line Loopback = {0,0,0,0,0,0,0,1},
- ?line io:format("~s ~p~n", ["Loopback",Loopback]),
- ?line implicit_inet6(S1, Loopback),
- ?line ok = gen_tcp:close(S1),
- %%
- ?line Localhost =
- ok(inet:getaddr("localhost", inet6)),
- ?line io:format("~s ~p~n", ["localhost",Localhost]),
- ?line S2 = ok(gen_tcp:listen(0, [{ip,Localhost}])),
- ?line implicit_inet6(S2, Localhost),
- ?line ok = gen_tcp:close(S2),
- %%
- ?line io:format("~s ~p~n", [Hostname,Host]),
- ?line S3 = ok(gen_tcp:listen(0, [{ifaddr,Host}])),
- ?line implicit_inet6(S3, Host),
- ?line ok = gen_tcp:close(S1);
- {error,eafnosupport} ->
- ?line ok = gen_tcp:close(S1),
- {skip,"Can not look up IPv6 address"}
- end;
- _ ->
+ ?line Loopback = {0,0,0,0,0,0,0,1},
+ ?line io:format("~s ~p~n", ["::1",Loopback]),
+ ?line implicit_inet6(S1, Loopback),
+ ?line ok = gen_tcp:close(S1),
+ %%
+ ?line Localhost = "localhost",
+ ?line Localaddr = ok(inet:getaddr(Localhost, inet6)),
+ ?line io:format("~s ~p~n", [Localhost,Localaddr]),
+ ?line S2 = ok(gen_tcp:listen(0, [{ip,Localaddr}])),
+ ?line implicit_inet6(S2, Localaddr),
+ ?line ok = gen_tcp:close(S2),
+ %%
+ ?line io:format("~s ~p~n", [Host,Addr]),
+ ?line S3 = ok(gen_tcp:listen(0, [{ifaddr,Addr}])),
+ ?line implicit_inet6(S3, Addr),
+ ?line ok = gen_tcp:close(S3);
+ {error,_} ->
{skip,"IPv6 not supported"}
end.
diff --git a/lib/kernel/test/gen_tcp_echo_SUITE.erl b/lib/kernel/test/gen_tcp_echo_SUITE.erl
index a2e09877af..fffaaf4c45 100644
--- a/lib/kernel/test/gen_tcp_echo_SUITE.erl
+++ b/lib/kernel/test/gen_tcp_echo_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -18,11 +18,13 @@
%%
-module(gen_tcp_echo_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%%-compile(export_all).
--export([all/1, init_per_testcase/2, fin_per_testcase/2,
+-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,
active_echo/1, passive_echo/1, active_once_echo/1,
slow_active_echo/1, slow_passive_echo/1,
limit_active_echo/1, limit_passive_echo/1,
@@ -31,16 +33,34 @@
-define(TPKT_VRSN, 3).
-define(LINE_LENGTH, 1023). % (default value of gen_tcp option 'recbuf') - 1
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[active_echo, passive_echo, active_once_echo,
- slow_active_echo, slow_passive_echo,
- limit_active_echo, limit_passive_echo,
- large_limit_active_echo, large_limit_passive_echo].
+ slow_active_echo, slow_passive_echo, limit_active_echo,
+ limit_passive_echo, large_limit_active_echo,
+ large_limit_passive_echo].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Func, Config) ->
Dog = test_server:timetrap(test_server:minutes(5)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog).
diff --git a/lib/kernel/test/gen_tcp_misc_SUITE.erl b/lib/kernel/test/gen_tcp_misc_SUITE.erl
index d73c5fab56..b1ef8826d5 100644
--- a/lib/kernel/test/gen_tcp_misc_SUITE.erl
+++ b/lib/kernel/test/gen_tcp_misc_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -18,14 +18,16 @@
%%
-module(gen_tcp_misc_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%-compile(export_all).
--export([all/1, controlling_process/1, no_accept/1, close_with_pending_output/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ controlling_process/1, no_accept/1, close_with_pending_output/1,
data_before_close/1, iter_max_socks/1, get_status/1,
passive_sockets/1, accept_closed_by_other_process/1,
- init_per_testcase/2, fin_per_testcase/2,
+ init_per_testcase/2, end_per_testcase/2,
otp_3924/1, otp_3924_sender/4, closed_socket/1,
shutdown_active/1, shutdown_passive/1, shutdown_pending/1,
default_options/1, http_bad_packet/1,
@@ -34,39 +36,60 @@
partial_recv_and_close_2/1,partial_recv_and_close_3/1,so_priority/1,
% Accept tests
primitive_accept/1,multi_accept_close_listen/1,accept_timeout/1,
- accept_timeouts_in_order/1,accept_timeouts_in_order2/1,accept_timeouts_in_order3/1,
- accept_timeouts_mixed/1,
+ accept_timeouts_in_order/1,accept_timeouts_in_order2/1,
+ accept_timeouts_in_order3/1,accept_timeouts_mixed/1,
killing_acceptor/1,killing_multi_acceptors/1,killing_multi_acceptors2/1,
- several_accepts_in_one_go/1,active_once_closed/1, send_timeout/1, otp_7731/1,
- zombie_sockets/1, otp_7816/1, otp_8102/1]).
+ several_accepts_in_one_go/1,active_once_closed/1, send_timeout/1, send_timeout_active/1,
+ otp_7731/1, zombie_sockets/1, otp_7816/1, otp_8102/1]).
%% Internal exports.
--export([sender/3, not_owner/1, passive_sockets_server/2, priority_server/1, otp_7731_server/1, zombie_server/2]).
+-export([sender/3, not_owner/1, passive_sockets_server/2, priority_server/1,
+ otp_7731_server/1, zombie_server/2]).
init_per_testcase(_Func, Config) when is_list(Config) ->
Dog = test_server:timetrap(test_server:seconds(240)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog).
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[controlling_process, no_accept,
- close_with_pending_output,
- data_before_close, iter_max_socks, passive_sockets,
+ close_with_pending_output, data_before_close,
+ iter_max_socks, passive_sockets,
accept_closed_by_other_process, otp_3924, closed_socket,
shutdown_active, shutdown_passive, shutdown_pending,
- default_options, http_bad_packet,
- busy_send, busy_disconnect_passive, busy_disconnect_active,
- fill_sendq, partial_recv_and_close,
- partial_recv_and_close_2, partial_recv_and_close_3, so_priority,
- primitive_accept,multi_accept_close_listen,accept_timeout,
- accept_timeouts_in_order,accept_timeouts_in_order2,accept_timeouts_in_order3,
- accept_timeouts_mixed,
- killing_acceptor,killing_multi_acceptors,killing_multi_acceptors2,
- several_accepts_in_one_go, active_once_closed, send_timeout, otp_7731,
+ default_options, http_bad_packet, busy_send,
+ busy_disconnect_passive, busy_disconnect_active,
+ fill_sendq, partial_recv_and_close,
+ partial_recv_and_close_2, partial_recv_and_close_3,
+ so_priority, primitive_accept,
+ multi_accept_close_listen, accept_timeout,
+ accept_timeouts_in_order, accept_timeouts_in_order2,
+ accept_timeouts_in_order3, accept_timeouts_mixed,
+ killing_acceptor, killing_multi_acceptors,
+ killing_multi_acceptors2, several_accepts_in_one_go,
+ active_once_closed, send_timeout, send_timeout_active, otp_7731,
zombie_sockets, otp_7816, otp_8102].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
default_options(doc) ->
["Tests kernel application variables inet_default_listen_options and "
@@ -1934,6 +1957,60 @@ send_timeout(Config) when is_list(Config) ->
ParaFun(false),
ParaFun(true),
ok.
+mad_sender(S) ->
+ {_, _, USec} = now(),
+ case gen_tcp:send(S, integer_to_list(USec)) of
+ ok ->
+ mad_sender(S);
+ Err ->
+ Err
+ end.
+
+
+flush() ->
+ receive
+ _X ->
+ %erlang:display(_X),
+ flush()
+ after 0 ->
+ ok
+ end.
+
+send_timeout_active(suite) ->
+ [];
+send_timeout_active(doc) ->
+ ["Test the send_timeout socket option for active sockets"];
+send_timeout_active(Config) when is_list(Config) ->
+ Dog = test_server:timetrap(test_server:seconds(20)),
+ %% Basic
+ BasicFun =
+ fun(AutoClose) ->
+ ?line {Loop,A,RNode,C} = setup_active_timeout_sink(1, AutoClose),
+ inet:setopts(A, [{active, once}]),
+ ?line Mad = spawn_link(RNode,fun() -> mad_sender(C) end),
+ ?line {error,timeout} =
+ Loop(fun() ->
+ receive
+ {tcp, Sock, _Data} ->
+ inet:setopts(A, [{active, once}]),
+ Res = gen_tcp:send(A,lists:duplicate(1000, $a)),
+ %erlang:display(Res),
+ Res;
+ Err ->
+ io:format("sock closed: ~p~n", [Err]),
+ Err
+ end
+ end),
+ unlink(Mad),
+ exit(Mad,kill),
+ ?line test_server:stop_node(RNode)
+ end,
+ BasicFun(false),
+ flush(),
+ BasicFun(true),
+ flush(),
+ test_server:timetrap_cancel(Dog),
+ ok.
after_send_timeout(AutoClose) ->
case AutoClose of
@@ -2016,35 +2093,35 @@ setup_closed_ao() ->
{Loop,A}.
setup_timeout_sink(Timeout, AutoClose) ->
- Dir = filename:dirname(code:which(?MODULE)),
- {ok,R} = test_server:start_node(test_default_options_slave,slave,
+ ?line Dir = filename:dirname(code:which(?MODULE)),
+ ?line {ok,R} = test_server:start_node(test_default_options_slave,slave,
[{args,"-pa " ++ Dir}]),
- Host = list_to_atom(lists:nth(2,string:tokens(atom_to_list(node()),"@"))),
- {ok, L} = gen_tcp:listen(0, [{active,false},{packet,2},
+ ?line Host = list_to_atom(lists:nth(2,string:tokens(atom_to_list(node()),"@"))),
+ ?line {ok, L} = gen_tcp:listen(0, [{active,false},{packet,2},
{send_timeout,Timeout},
{send_timeout_close,AutoClose}]),
- Fun = fun(F) ->
+ ?line Fun = fun(F) ->
receive
{From,X} when is_function(X) ->
From ! {self(),X()}, F(F);
die -> ok
end
end,
- Pid = rpc:call(R,erlang,spawn,[fun() -> Fun(Fun) end]),
- {ok, Port} = inet:port(L),
- Remote = fun(Fu) ->
+ ?line Pid = rpc:call(R,erlang,spawn,[fun() -> Fun(Fun) end]),
+ ?line {ok, Port} = inet:port(L),
+ ?line Remote = fun(Fu) ->
Pid ! {self(), Fu},
receive {Pid,X} -> X
end
end,
- {ok, C} = Remote(fun() ->
+ ?line {ok, C} = Remote(fun() ->
gen_tcp:connect(Host,Port,
[{active,false},{packet,2}])
end),
- {ok,A} = gen_tcp:accept(L),
- gen_tcp:send(A,"Hello"),
- {ok, "Hello"} = Remote(fun() -> gen_tcp:recv(C,0) end),
- Loop2 = fun(_,_,0) ->
+ ?line {ok,A} = gen_tcp:accept(L),
+ ?line gen_tcp:send(A,"Hello"),
+ ?line {ok, "Hello"} = Remote(fun() -> gen_tcp:recv(C,0) end),
+ ?line Loop2 = fun(_,_,0) ->
{failure, timeout};
(L2,F2,N) ->
Ret = F2(),
@@ -2055,9 +2132,53 @@ setup_timeout_sink(Timeout, AutoClose) ->
Other -> Other
end
end,
- Loop = fun(F3) -> Loop2(Loop2,F3,1000) end,
+ ?line Loop = fun(F3) -> Loop2(Loop2,F3,1000) end,
{Loop,A,R}.
-
+
+setup_active_timeout_sink(Timeout, AutoClose) ->
+ ?line Dir = filename:dirname(code:which(?MODULE)),
+ ?line {ok,R} = test_server:start_node(test_default_options_slave,slave,
+ [{args,"-pa " ++ Dir}]),
+ ?line Host = list_to_atom(lists:nth(2,string:tokens(atom_to_list(node()),"@"))),
+ ?line {ok, L} = gen_tcp:listen(0, [binary,{active,false},{packet,0},{nodelay, true},{keepalive, true},
+ {send_timeout,Timeout},
+ {send_timeout_close,AutoClose}]),
+ ?line Fun = fun(F) ->
+ receive
+ {From,X} when is_function(X) ->
+ From ! {self(),X()}, F(F);
+ die -> ok
+ end
+ end,
+ ?line Pid = rpc:call(R,erlang,spawn,[fun() -> Fun(Fun) end]),
+ ?line {ok, Port} = inet:port(L),
+ ?line Remote = fun(Fu) ->
+ Pid ! {self(), Fu},
+ receive {Pid,X} -> X
+ end
+ end,
+ ?line {ok, C} = Remote(fun() ->
+ gen_tcp:connect(Host,Port,
+ [{active,false}])
+ end),
+ ?line {ok,A} = gen_tcp:accept(L),
+ ?line gen_tcp:send(A,"Hello"),
+ ?line {ok, "H"++_} = Remote(fun() -> gen_tcp:recv(C,0) end),
+ ?line Loop2 = fun(_,_,0) ->
+ {failure, timeout};
+ (L2,F2,N) ->
+ Ret = F2(),
+ io:format("~p~n",[Ret]),
+ case Ret of
+ ok -> receive after 1 -> ok end,
+ L2(L2,F2,N-1);
+ Other -> Other
+ end
+ end,
+ ?line Loop = fun(F3) -> Loop2(Loop2,F3,1000) end,
+ {Loop,A,R,C}.
+
+
millistamp() ->
{Mega, Secs, Micros} = erlang:now(),
(Micros div 1000) + Secs * 1000 + Mega * 1000000000.
diff --git a/lib/kernel/test/gen_udp_SUITE.erl b/lib/kernel/test/gen_udp_SUITE.erl
index 2ff1d7210a..d8a5519195 100644
--- a/lib/kernel/test/gen_udp_SUITE.erl
+++ b/lib/kernel/test/gen_udp_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -21,7 +21,7 @@
% because udp is not deterministic.
%
-module(gen_udp_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(default_timeout, ?t:minutes(1)).
@@ -29,23 +29,42 @@
% XXX - we should pick a port that we _know_ is closed. That's pretty hard.
-define(CLOSED_PORT, 6666).
--export([all/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
-export([send_to_closed/1,
buffer_size/1, binary_passive_recv/1, bad_address/1,
read_packets/1, open_fd/1, connect/1, implicit_inet6/1]).
-all(suite) ->
- [send_to_closed,
- buffer_size, binary_passive_recv, bad_address, read_packets,
- open_fd, connect, implicit_inet6].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [send_to_closed, buffer_size, binary_passive_recv,
+ bad_address, read_packets, open_fd, connect,
+ implicit_inet6].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Case, Config) ->
?line Dog=test_server:timetrap(?default_timeout),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
@@ -431,36 +450,38 @@ connect(Config) when is_list(Config) ->
ok.
implicit_inet6(Config) when is_list(Config) ->
- ?line Hostname = ok(inet:gethostname()),
+ ?line Host = ok(inet:gethostname()),
+ ?line
+ case inet:getaddr(Host, inet6) of
+ {ok,Addr} ->
+ ?line implicit_inet6(Host, Addr);
+ {error,Reason} ->
+ {skip,
+ "Can not look up IPv6 address: "
+ ++atom_to_list(Reason)}
+ end.
+
+implicit_inet6(Host, Addr) ->
?line Active = {active,false},
?line
case gen_udp:open(0, [inet6,Active]) of
{ok,S1} ->
- ?line
- case inet:getaddr(Hostname, inet6) of
- {ok,Host} ->
- ?line Loopback = {0,0,0,0,0,0,0,1},
- ?line io:format("~s ~p~n", ["Loopback",Loopback]),
- ?line implicit_inet6(S1, Active, Loopback),
- ?line ok = gen_udp:close(S1),
- %%
- ?line Localhost =
- ok(inet:getaddr("localhost", inet6)),
- ?line io:format("~s ~p~n", ["localhost",Localhost]),
- ?line S2 =
- ok(gen_udp:open(0, [{ip,Localhost},Active])),
- ?line implicit_inet6(S2, Active, Localhost),
- ?line ok = gen_udp:close(S2),
- %%
- ?line io:format("~s ~p~n", [Hostname,Host]),
- ?line S3 =
- ok(gen_udp:open(0, [{ifaddr,Host},Active])),
- ?line implicit_inet6(S3, Active, Host),
- ?line ok = gen_udp:close(S1);
- {error,eafnosupport} ->
- ?line ok = gen_udp:close(S1),
- {skip,"Can not look up IPv6 address"}
- end;
+ ?line Loopback = {0,0,0,0,0,0,0,1},
+ ?line io:format("~s ~p~n", ["::1",Loopback]),
+ ?line implicit_inet6(S1, Active, Loopback),
+ ?line ok = gen_udp:close(S1),
+ %%
+ ?line Localhost = "localhost",
+ ?line Localaddr = ok(inet:getaddr(Localhost, inet6)),
+ ?line io:format("~s ~p~n", [Localhost,Localaddr]),
+ ?line S2 = ok(gen_udp:open(0, [{ip,Localaddr},Active])),
+ ?line implicit_inet6(S2, Active, Localaddr),
+ ?line ok = gen_udp:close(S2),
+ %%
+ ?line io:format("~s ~p~n", [Host,Addr]),
+ ?line S3 = ok(gen_udp:open(0, [{ifaddr,Addr},Active])),
+ ?line implicit_inet6(S3, Active, Addr),
+ ?line ok = gen_udp:close(S3);
_ ->
{skip,"IPv6 not supported"}
end.
@@ -481,5 +502,4 @@ implicit_inet6(S1, Active, Addr) ->
?line {Addr,P2,"pong"} = ok(gen_udp:recv(S1, 1024)),
?line ok = gen_udp:close(S2).
-
ok({ok,V}) -> V.
diff --git a/lib/kernel/test/global_SUITE.erl b/lib/kernel/test/global_SUITE.erl
index 7a84ad5e75..1e7bcf1766 100644
--- a/lib/kernel/test/global_SUITE.erl
+++ b/lib/kernel/test/global_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -20,7 +20,8 @@
%-define(line_trace, 1).
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_suite/1, end_per_suite/1,
names/1, names_hidden/1, locks/1, locks_hidden/1,
bad_input/1, names_and_locks/1, lock_die/1, name_die/1,
basic_partition/1, basic_name_partition/1,
@@ -42,14 +43,14 @@
-export([global_load/3, lock_global/2, lock_global2/2]).
--export([ttt/1]).
+-export([]).
-export([mass_spawn/1]).
-export([start_tracer/0, stop_tracer/0, get_trace/0]).
-compile(export_all).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(NODES, [node()|nodes()]).
@@ -58,41 +59,62 @@
%% The resource used by the global module.
-define(GLOBAL_LOCK, global).
-ttt(suite) ->
- [
-%% 5&6: succeeds
-%% 4&5&6: succeeds
-%% 3&4&5&6: succeeds
-%% 1&2&3&6: fails
-%% 1&2&6: succeeds
-%% 3&6: succeeds
- names, names_hidden, locks, locks_hidden,
- bad_input,
- names_and_locks, lock_die, name_die, basic_partition,
-% advanced_partition, basic_name_partition,
-% stress_partition, simple_ring, simple_line,
- ring].
-
-all(suite) ->
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
case init:get_argument(ring_line) of
- {ok, _} ->
- [ring_line];
+ {ok, _} -> [ring_line];
_ ->
- [names, names_hidden, locks, locks_hidden,
- bad_input,
+ [names, names_hidden, locks, locks_hidden, bad_input,
names_and_locks, lock_die, name_die, basic_partition,
advanced_partition, basic_name_partition,
- stress_partition, simple_ring, simple_line,
- ring, line, global_lost_nodes, otp_1849,
- otp_3162, otp_5640, otp_5737, otp_6931,
- simple_disconnect, simple_resolve, simple_resolve2,
- simple_resolve3,
- leftover_name, re_register_name, name_exit,
- external_nodes, many_nodes, sync_0, global_groups_change,
- register_1, both_known_1, lost_unregister,
- mass_death, garbage_messages]
+ stress_partition, simple_ring, simple_line, ring, line,
+ global_lost_nodes, otp_1849, otp_3162, otp_5640,
+ otp_5737, otp_6931, simple_disconnect, simple_resolve,
+ simple_resolve2, simple_resolve3, leftover_name,
+ re_register_name, name_exit, external_nodes, many_nodes,
+ sync_0, global_groups_change, register_1, both_known_1,
+ lost_unregister, mass_death, garbage_messages]
end.
+groups() ->
+ [{ttt, [],
+ [names, names_hidden, locks, locks_hidden, bad_input,
+ names_and_locks, lock_die, name_die, basic_partition,
+ ring]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+init_per_suite(Config) ->
+
+ %% Copied from test_server_ctrl ln 647, we have to do this here as
+ %% the test_server only does this when run without common_test
+ global:sync(),
+ case global:whereis_name(test_server) of
+ undefined ->
+ io:format(user, "Registering test_server globally!~n",[]),
+ global:register_name(test_server, whereis(test_server_ctrl));
+ Pid ->
+ case node() of
+ N when N == node(Pid) ->
+ io:format(user, "Warning: test_server already running!\n", []),
+ global:re_register_name(test_server,self());
+ _ ->
+ ok
+ end
+ end,
+ Config.
+
+end_per_suite(_Config) ->
+ global:unregister_name(test_server),
+ ok.
+
+
-define(TESTCASE, testcase_name).
-define(testcase, ?config(?TESTCASE, Config)).
-define(nodes_tag, '$global_nodes').
@@ -100,9 +122,16 @@ all(suite) ->
init_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
ok = gen_server:call(global_name_server, high_level_trace_start,infinity),
+
+ %% Make sure that everything is dead and done. Otherwise there are problems
+ %% on platforms on which it takes a long time to shut down a node.
+ stop_nodes(nodes()),
+ timer:sleep(1000),
+
[{?TESTCASE, Case}, {registered, registered()} | Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
+ ct:log("Calling end_per_testcase!",[]),
?line write_high_level_trace(Config),
?line _ =
gen_server:call(global_name_server, high_level_trace_stop, infinity),
@@ -114,6 +143,7 @@ fin_per_testcase(_Case, Config) ->
{What, N} <- [{"Added", Registered -- InitRegistered},
{"Removed", InitRegistered -- Registered}],
N =/= []],
+
ok.
%%% General comments:
diff --git a/lib/kernel/test/global_group_SUITE.erl b/lib/kernel/test/global_group_SUITE.erl
index 430cc61267..13b2fd07b5 100644
--- a/lib/kernel/test/global_group_SUITE.erl
+++ b/lib/kernel/test/global_group_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -19,25 +19,61 @@
-module(global_group_SUITE).
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_suite/1, end_per_suite/1]).
-export([start_gg_proc/1, no_gg_proc/1, no_gg_proc_sync/1, compatible/1,
one_grp/1, one_grp_x/1, two_grp/1, hidden_groups/1, test_exit/1]).
-export([init/1, init/2, init2/2, start_proc/1, start_proc_rereg/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
%-compile(export_all).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(NODES, [node()|nodes()]).
-define(UNTIL(Seq), loop_until_true(fun() -> Seq end)).
-all(suite) ->
- [start_gg_proc, no_gg_proc, no_gg_proc_sync,
- compatible, one_grp, one_grp_x, two_grp, test_exit,
- hidden_groups].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [start_gg_proc, no_gg_proc, no_gg_proc_sync, compatible,
+ one_grp, one_grp_x, two_grp, test_exit, hidden_groups].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+init_per_suite(Config) ->
+
+ %% Copied from test_server_ctrl ln 647, we have to do this here as
+ %% the test_server only does this when run without common_test
+ global:sync(),
+ case global:whereis_name(test_server) of
+ undefined ->
+ io:format(user, "Registering test_server globally!~n",[]),
+ global:register_name(test_server, whereis(test_server_ctrl));
+ Pid ->
+ case node() of
+ N when N == node(Pid) ->
+ io:format(user, "Warning: test_server already running!\n", []),
+ global:re_register_name(test_server,self());
+ _ ->
+ ok
+ end
+ end,
+ Config.
+
+end_per_suite(_Config) ->
+ global:unregister_name(test_server),
+ ok.
-define(TESTCASE, testcase_name).
-define(testcase, ?config(?TESTCASE, Config)).
@@ -46,7 +82,7 @@ init_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
Dog=?t:timetrap(?t:minutes(5)),
[{?TESTCASE, Case}, {watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog).
@@ -164,8 +200,8 @@ no_gg_proc(Config) when is_list(Config) ->
?line Own_nodes_should = [node(), Cp1nn, Cp2nn, Cp3nn,
Cpxnn, Cpynn, Cpznn],
?line Own_nodes = rpc:call(Cp3, global_group, own_nodes, []),
- ?line true = (Own_nodes -- Own_nodes_should) =:= [],
- ?line true = (Own_nodes_should -- Own_nodes) =:= [],
+ ?line [] = (Own_nodes -- Own_nodes_should),
+ ?line [] = (Own_nodes_should -- Own_nodes),
?line Pid2 = rpc:call(Cp1, global_group, send, [test2, {ping, self()}]),
?line receive
@@ -339,8 +375,8 @@ no_gg_proc_sync(Config) when is_list(Config) ->
?line Own_nodes_should = [node(), Cp1nn, Cp2nn, Cp3nn,
Cpxnn, Cpynn, Cpznn],
?line Own_nodes = rpc:call(Cp3, global_group, own_nodes, []),
- ?line true = (Own_nodes -- Own_nodes_should) =:= [],
- ?line true = (Own_nodes_should -- Own_nodes) =:= [],
+ ?line [] = (Own_nodes -- Own_nodes_should),
+ ?line [] = (Own_nodes_should -- Own_nodes),
?line Pid2 = rpc:call(Cp1, global_group, send, [test2, {ping, self()}]),
?line receive
@@ -513,8 +549,8 @@ compatible(Config) when is_list(Config) ->
?line Own_nodes_should = [node(), Cp1nn, Cp2nn, Cp3nn,
Cpxnn, Cpynn, Cpznn],
?line Own_nodes = rpc:call(Cp3, global_group, own_nodes, []),
- ?line true = (Own_nodes -- Own_nodes_should) =:= [],
- ?line true = (Own_nodes_should -- Own_nodes) =:= [],
+ ?line [] = (Own_nodes -- Own_nodes_should),
+ ?line [] = (Own_nodes_should -- Own_nodes),
?line Pid2 = rpc:call(Cp1, global_group, send, [test2, {ping, self()}]),
?line receive
diff --git a/lib/kernel/test/heart_SUITE.erl b/lib/kernel/test/heart_SUITE.erl
index 0d0296238b..233e438dc9 100644
--- a/lib/kernel/test/heart_SUITE.erl
+++ b/lib/kernel/test/heart_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -18,12 +18,14 @@
%%
-module(heart_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1, ostype/1, start/1, restart/1, reboot/1, set_cmd/1, clear_cmd/1,
- dont_drop/1, kill_pid/1, fini/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, start/1, restart/1,
+ reboot/1, set_cmd/1, clear_cmd/1, get_cmd/1,
+ dont_drop/1, kill_pid/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
-export([start_heart_stress/1, mangle/1, suicide_by_heart/0]).
@@ -33,7 +35,7 @@ init_per_testcase(_Func, Config) ->
Dog=test_server:timetrap(test_server:seconds(?DEFAULT_TIMEOUT_SECS)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Nodes = nodes(),
lists:foreach(fun(X) ->
NNam = list_to_atom(hd(string:tokens(atom_to_list(X),"@"))),
@@ -53,18 +55,29 @@ fin_per_testcase(_Func, Config) ->
%% Should be started in a CC view with:
%% erl -sname master -rsh ctrsh
%%-----------------------------------------------------------------
-all(suite) ->
- [{conf, ostype, [start, restart, reboot,
- set_cmd, clear_cmd, kill_pid], fini}].
+suite() -> [{ct_hooks,[ts_install_cth]}].
-ostype(Config) when is_list(Config) ->
+all() ->
+ [start, restart, reboot, set_cmd, clear_cmd, get_cmd, kill_pid].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+init_per_suite(Config) when is_list(Config) ->
case os:type() of
{win32, windows} ->
{skipped, "No use to run on Windows 95/98"};
_ ->
Config
end.
-fini(Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
Config.
start_check(Type, Name) ->
@@ -233,6 +246,15 @@ clear_cmd(Config) when is_list(Config) ->
end,
ok.
+get_cmd(suite) -> [];
+get_cmd(Config) when is_list(Config) ->
+ ?line {ok, Node} = start_check(slave, heart_test),
+ Cmd = "test",
+ ?line ok = rpc:call(Node, heart, set_cmd, [Cmd]),
+ ?line {ok, Cmd} = rpc:call(Node, heart, get_cmd, []),
+ stop_node(Node),
+ ok.
+
dont_drop(suite) ->
%%% Removed as it may crash epmd/distribution in colourful
%%% ways. While we ARE finding out WHY, it would
diff --git a/lib/kernel/test/inet_SUITE.erl b/lib/kernel/test/inet_SUITE.erl
index ec05bf99b9..1bb173a3ac 100644
--- a/lib/kernel/test/inet_SUITE.erl
+++ b/lib/kernel/test/inet_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -18,29 +18,72 @@
%%
-module(inet_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("kernel/include/inet.hrl").
-include_lib("kernel/src/inet_dns.hrl").
--export([all/1, t_gethostbyaddr/1, t_getaddr/1, t_gethostbyname/1,
- t_gethostbyaddr_v6/1, t_getaddr_v6/1, t_gethostbyname_v6/1,
- ipv4_to_ipv6/1, host_and_addr/1, parse/1, t_gethostnative/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ t_gethostbyaddr/0, t_gethostbyaddr/1,
+ t_getaddr/0, t_getaddr/1,
+ t_gethostbyname/0, t_gethostbyname/1,
+ t_gethostbyaddr_v6/0, t_gethostbyaddr_v6/1,
+ t_getaddr_v6/0, t_getaddr_v6/1,
+ t_gethostbyname_v6/0, t_gethostbyname_v6/1,
+ ipv4_to_ipv6/0, ipv4_to_ipv6/1,
+ host_and_addr/0, host_and_addr/1,
+ t_gethostnative/1,
gethostnative_parallell/1, cname_loop/1,
- gethostnative_soft_restart/1,gethostnative_debug_level/1,getif/1,
- getif_ifr_name_overflow/1,getservbyname_overflow/1,getifaddrs/1]).
+ gethostnative_soft_restart/0, gethostnative_soft_restart/1,
+ gethostnative_debug_level/0, gethostnative_debug_level/1,
+ getif/1,
+ getif_ifr_name_overflow/1,getservbyname_overflow/1, getifaddrs/1]).
-export([get_hosts/1, get_ipv6_hosts/1, parse_hosts/1, parse_address/1,
kill_gethost/0, parallell_gethost/0]).
-export([init_per_testcase/2, end_per_testcase/2]).
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [t_gethostbyaddr, t_gethostbyname, t_getaddr,
+ t_gethostbyaddr_v6, t_gethostbyname_v6, t_getaddr_v6,
+ ipv4_to_ipv6, host_and_addr, {group, parse},
+ t_gethostnative, gethostnative_parallell, cname_loop,
+ gethostnative_debug_level, gethostnative_soft_restart,
+ getif, getif_ifr_name_overflow, getservbyname_overflow,
+ getifaddrs].
+
+groups() ->
+ [{parse, [], [parse_hosts, parse_address]}].
+
+%% Required configuaration
+required(v4) ->
+ [{require, test_host_ipv4_only},
+ {require, test_dummy_host}];
+required(v6) ->
+ [{require, test_host_ipv6_only},
+ {require, test_dummy_ipv6_host}];
+required(hosts) ->
+ case os:type() of
+ {OS, _} when OS =:= win32; OS =:= vxworks ->
+ [{require, hardcoded_hosts},
+ {require, hardcoded_ipv6_hosts}];
+ _Else ->
+ [{require, test_hosts}]
+ end.
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [t_gethostbyaddr, t_gethostbyname, t_getaddr,
- t_gethostbyaddr_v6, t_gethostbyname_v6, t_getaddr_v6,
- ipv4_to_ipv6, host_and_addr, parse,t_gethostnative,
- gethostnative_parallell, cname_loop,
- gethostnative_debug_level,gethostnative_soft_restart,
- getif,getif_ifr_name_overflow,getservbyname_overflow,getifaddrs].
+end_per_group(_GroupName, Config) ->
+ Config.
init_per_testcase(_Func, Config) ->
Dog = test_server:timetrap(test_server:seconds(60)),
@@ -50,10 +93,12 @@ end_per_testcase(_Func, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog).
-
+t_gethostbyaddr() ->
+ required(v4).
t_gethostbyaddr(doc) -> "Test the inet:gethostbyaddr/1 function.";
t_gethostbyaddr(Config) when is_list(Config) ->
- ?line {Name,FullName,IPStr,IP,Aliases,_,_} = ?config(test_host_ipv4_only, Config),
+ ?line {Name,FullName,IPStr,IP,Aliases,_,_} =
+ ct:get_config(test_host_ipv4_only),
?line {ok,HEnt} = inet:gethostbyaddr(IPStr),
?line {ok,HEnt} = inet:gethostbyaddr(IP),
?line {error,Error} = inet:gethostbyaddr(Name),
@@ -75,15 +120,16 @@ t_gethostbyaddr(Config) when is_list(Config) ->
end,
?line {_DName, _DFullName, DIPStr, DIP, _, _, _} =
- ?config(test_dummy_host, Config),
+ ct:get_config(test_dummy_host),
?line {error,nxdomain} = inet:gethostbyaddr(DIPStr),
?line {error,nxdomain} = inet:gethostbyaddr(DIP),
ok.
+t_gethostbyaddr_v6() -> required(v6).
t_gethostbyaddr_v6(doc) -> "Test the inet:gethostbyaddr/1 inet6 function.";
t_gethostbyaddr_v6(Config) when is_list(Config) ->
?line {Name6, FullName6, IPStr6, IP6, Aliases6} =
- ?config(test_host_ipv6_only, Config),
+ ct:get_config(test_host_ipv6_only),
?line case inet:gethostbyaddr(IPStr6) of
%% Even if IPv6 is not supported, the native resolver may succeed
@@ -103,27 +149,28 @@ t_gethostbyaddr_v6(Config) when is_list(Config) ->
{HEnt6#hostent.h_aliases,[[],Aliases6]}]),
?line {_DName6, _DFullName6, DIPStr6, DIP6, _} =
- ?config(test_dummy_ipv6_host, Config),
+ ct:get_config(test_dummy_ipv6_host),
?line {error,nxdomain} = inet:gethostbyaddr(DIPStr6),
?line {error,nxdomain} = inet:gethostbyaddr(DIP6),
ok
end.
+t_gethostbyname() -> required(v4).
t_gethostbyname(doc) -> "Test the inet:gethostbyname/1 function.";
t_gethostbyname(suite) -> [];
t_gethostbyname(Config) when is_list(Config) ->
?line {Name,FullName,IPStr,IP,Aliases,IP_46_Str,_} =
- ?config(test_host_ipv4_only, Config),
+ ct:get_config(test_host_ipv4_only),
?line {ok,_} = inet:gethostbyname(IPStr),
?line {ok,HEnt} = inet:gethostbyname(Name),
?line {ok,HEnt} = inet:gethostbyname(list_to_atom(Name)),
?line HEnt_ = HEnt#hostent{h_addrtype = inet,
h_length = 4,
h_addr_list = [IP]},
+
?line HEnt_ = HEnt,
?line check_elems([{HEnt#hostent.h_name,[Name,FullName]},
{HEnt#hostent.h_aliases,[[],Aliases]}]),
-
?line {ok,HEntF} = inet:gethostbyname(FullName),
?line HEntF_ = HEntF#hostent{h_name = FullName,
h_addrtype = inet,
@@ -133,15 +180,16 @@ t_gethostbyname(Config) when is_list(Config) ->
?line check_elems([{HEnt#hostent.h_aliases,[[],Aliases]}]),
?line {DName, _DFullName, _DIPStr, _DIP, _, _, _} =
- ?config(test_dummy_host, Config),
+ ct:get_config(test_dummy_host),
?line {error,nxdomain} = inet:gethostbyname(DName),
?line {error,nxdomain} = inet:gethostbyname(IP_46_Str).
+t_gethostbyname_v6() -> required(v6).
t_gethostbyname_v6(doc) -> "Test the inet:gethostbyname/1 inet6 function.";
t_gethostbyname_v6(suite) -> [];
t_gethostbyname_v6(Config) when is_list(Config) ->
?line {Name, _, _, _,Aliases,IP_46_Str,IP_46} =
- ?config(test_host_ipv4_only, Config),
+ ct:get_config(test_host_ipv4_only),
case {inet:gethostbyname(IP_46_Str, inet6),
inet:gethostbyname(Name, inet6)} of
@@ -154,7 +202,7 @@ t_gethostbyname_v6(Config) when is_list(Config) ->
?line check_elems([{HEnt46#hostent.h_aliases,[[],Aliases]}]),
?line {Name6, FullName6, IPStr6, IP6, Aliases6} =
- ?config(test_host_ipv6_only, Config),
+ ct:get_config(test_host_ipv6_only),
?line {ok,_} = inet:gethostbyname(IPStr6, inet6),
?line {ok,HEnt6} = inet:gethostbyname(Name6, inet6),
?line {ok,HEnt6} = inet:gethostbyname(list_to_atom(Name6), inet6),
@@ -200,7 +248,7 @@ t_gethostbyname_v6(Config) when is_list(Config) ->
end,
?line {DName6, _DFullName6, _DIPStr6, _DIP6, _} =
- ?config(test_dummy_ipv6_host, Config),
+ ct:get_config(test_dummy_ipv6_host),
?line {error,nxdomain} = inet:gethostbyname(DName6, inet6),
ok;
{_,_} ->
@@ -219,11 +267,12 @@ check_elem(Val, [], Tests0) ->
?t:fail({no_match,Val,Tests0}).
+t_getaddr() -> required(v4).
t_getaddr(doc) -> "Test the inet:getaddr/2 function.";
t_getaddr(suite) -> [];
t_getaddr(Config) when is_list(Config) ->
?line {Name,FullName,IPStr,IP,_,IP_46_Str,IP46} =
- ?config(test_host_ipv4_only, Config),
+ ct:get_config(test_host_ipv4_only),
?line {ok,IP} = inet:getaddr(list_to_atom(Name), inet),
?line {ok,IP} = inet:getaddr(Name, inet),
?line {ok,IP} = inet:getaddr(FullName, inet),
@@ -232,17 +281,18 @@ t_getaddr(Config) when is_list(Config) ->
?line {error,nxdomain} = inet:getaddr(IP_46_Str, inet),
?line {error,eafnosupport} = inet:getaddr(IP46, inet),
- ?line {DName, DFullName, DIPStr, DIP, _, _, _} = ?config(test_dummy_host, Config),
+ ?line {DName, DFullName, DIPStr, DIP, _, _, _} = ct:get_config(test_dummy_host),
?line {error,nxdomain} = inet:getaddr(DName, inet),
?line {error,nxdomain} = inet:getaddr(DFullName, inet),
?line {ok,DIP} = inet:getaddr(DIPStr, inet),
?line {ok,DIP} = inet:getaddr(DIP, inet).
+t_getaddr_v6() -> required(v4) ++ required(v6).
t_getaddr_v6(doc) -> "Test the inet:getaddr/2 function.";
t_getaddr_v6(suite) -> [];
t_getaddr_v6(Config) when is_list(Config) ->
?line {Name,FullName,IPStr,_IP,_,IP_46_Str,IP46} =
- ?config(test_host_ipv4_only, Config),
+ ct:get_config(test_host_ipv4_only),
case {inet:getaddr(IP_46_Str, inet6),inet:getaddr(Name, inet6)} of
{{ok,IP46},{ok,_}} ->
%% Since we suceeded in parsing an IPv6 address string and
@@ -261,7 +311,7 @@ t_getaddr_v6(Config) when is_list(Config) ->
%% inet_db:res_option(lookup))
%% end,
?line {Name6, FullName6, IPStr6, IP6, _} =
- ?config(test_host_ipv6_only, Config),
+ ct:get_config(test_host_ipv6_only),
?line {ok,_} = inet:getaddr(list_to_atom(Name6), inet6),
?line {ok,_} = inet:getaddr(Name6, inet6),
?line {ok,_} = inet:getaddr(FullName6, inet6),
@@ -269,7 +319,7 @@ t_getaddr_v6(Config) when is_list(Config) ->
?line {ok,IP6} = inet:getaddr(IPStr6, inet6),
?line {DName6, DFullName6, DIPStr6, DIP6, _} =
- ?config(test_dummy_ipv6_host, Config),
+ ct:get_config(test_dummy_ipv6_host),
?line {error,nxdomain} = inet:getaddr(DName6, inet6),
?line {error,nxdomain} = inet:getaddr(DFullName6, inet6),
?line {ok,DIP6} = inet:getaddr(DIPStr6, inet6),
@@ -279,6 +329,7 @@ t_getaddr_v6(Config) when is_list(Config) ->
{skip, "IPv6 is not supported on this host"}
end.
+ipv4_to_ipv6() -> required(v4).
ipv4_to_ipv6(doc) -> "Test if IPv4 address is converted to IPv6 address.";
ipv4_to_ipv6(suite) -> [];
ipv4_to_ipv6(Config) when is_list(Config) ->
@@ -287,7 +338,7 @@ ipv4_to_ipv6(Config) when is_list(Config) ->
%% address should be returned. If no IPv6 support on this host, an
%% error should beturned.
?line {_Name,_FullName,IPStr,_IP,Aliases,IP_46_Str,IP_46} =
- ?config(test_host_ipv4_only, Config),
+ ct:get_config(test_host_ipv4_only),
?line IP4to6Res =
case inet:getaddr(IPStr, inet6) of
{ok,IP_46} ->
@@ -314,6 +365,7 @@ ipv4_to_ipv6(Config) when is_list(Config) ->
end,
ok.
+host_and_addr() -> required(hosts).
host_and_addr(doc) -> ["Test looking up hosts and addresses. Use 'ypcat hosts' ",
"or the local eqivalent to find all hosts."];
host_and_addr(suite) -> [];
@@ -334,30 +386,30 @@ try_host({Ip0, Host}) ->
%% Get all hosts from the system using 'ypcat hosts' or the local
%% equvivalent.
-get_hosts(Config) ->
+get_hosts(_Config) ->
case os:type() of
{unix, _} ->
List = lists:map(fun(X) ->
atom_to_list(X)++" "
- end, ?config(test_hosts, Config)),
+ end, ct:get_config(test_hosts)),
Cmd = "ypmatch "++List++" hosts.byname",
HostFile = os:cmd(Cmd),
get_hosts(HostFile, [], [], []);
_ ->
- ?config(hardcoded_hosts, Config)
+ ct:get_config(hardcoded_hosts)
end.
-get_ipv6_hosts(Config) ->
+get_ipv6_hosts(_Config) ->
case os:type() of
{unix, _} ->
List = lists:map(fun(X) ->
atom_to_list(X)++" "
- end, ?config(test_hosts, Config)),
+ end, ct:get_config(ipv6_hosts)),
Cmd = "ypmatch "++List++" ipnodes.byname",
HostFile = os:cmd(Cmd),
get_hosts(HostFile, [], [], []);
_ ->
- ?config(hardcoded_ipv6_hosts, Config)
+ ct:get_config(hardcoded_ipv6_hosts)
end.
get_hosts([$\t|Rest], Cur, Ip, Result) when Ip /= [] ->
@@ -376,9 +428,6 @@ get_hosts([C|Rest], Cur, Ip, Result) ->
get_hosts([], _, _, Result) ->
Result.
-parse(suite) -> [parse_hosts, parse_address];
-parse(doc) -> ["Test that parsing of the hosts file or equivalent works,",
- "and that erroneous lines are skipped"].
parse_hosts(Config) when is_list(Config) ->
?line DataDir = ?config(data_dir,Config),
@@ -730,6 +779,7 @@ cname_loop(Config) when is_list(Config) ->
lookup_count=300,
lookup_processes=20}).
+gethostnative_soft_restart() -> required(hosts).
gethostnative_soft_restart(suite) ->
[];
gethostnative_soft_restart(doc) ->
@@ -740,6 +790,8 @@ gethostnative_soft_restart(Config) when is_list(Config) ->
#gethostnative_control{
control_seq=[soft_restart]}).
+
+gethostnative_debug_level() -> required(hosts).
gethostnative_debug_level(suite) ->
[];
gethostnative_debug_level(doc) ->
diff --git a/lib/kernel/test/inet_res_SUITE.erl b/lib/kernel/test/inet_res_SUITE.erl
index cc32d1f8f9..6064a9b2d9 100644
--- a/lib/kernel/test/inet_res_SUITE.erl
+++ b/lib/kernel/test/inet_res_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
@@ -18,35 +18,63 @@
%%
-module(inet_res_SUITE).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include("test_server_line.hrl").
-include_lib("kernel/include/inet.hrl").
-include_lib("kernel/src/inet_dns.hrl").
--export([all/1, init_per_testcase/2, end_per_testcase/2]).
--export([basic/1, resolve/1, edns0/1, txt_record/1, files_monitor/1]).
--export([gethostbyaddr/1, gethostbyaddr_v6/1,
- gethostbyname/1, gethostbyname_v6/1,
- getaddr/1, getaddr_v6/1, ipv4_to_ipv6/1, host_and_addr/1]).
+-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([basic/1, resolve/1, edns0/1, txt_record/1, files_monitor/1,
+ last_ms_answer/1]).
+-export([
+ gethostbyaddr/0, gethostbyaddr/1,
+ gethostbyaddr_v6/0, gethostbyaddr_v6/1,
+ gethostbyname/0, gethostbyname/1,
+ gethostbyname_v6/0, gethostbyname_v6/1,
+ getaddr/0, getaddr/1,
+ getaddr_v6/0, getaddr_v6/1,
+ ipv4_to_ipv6/0, ipv4_to_ipv6/1,
+ host_and_addr/0, host_and_addr/1
+ ]).
-define(RUN_NAMED, "run-named").
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[basic, resolve, edns0, txt_record, files_monitor,
- gethostbyaddr, gethostbyaddr_v6, gethostbyname, gethostbyname_v6,
- getaddr, getaddr_v6, ipv4_to_ipv6, host_and_addr].
-
-zone_dir(basic) ->
- otptest;
-zone_dir(resolve) ->
- otptest;
-zone_dir(edns0) ->
- otptest;
-zone_dir(files_monitor) ->
- otptest;
-zone_dir(_) ->
- undefined.
+ last_ms_answer,
+ gethostbyaddr, gethostbyaddr_v6, gethostbyname,
+ gethostbyname_v6, getaddr, getaddr_v6, ipv4_to_ipv6,
+ host_and_addr].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+zone_dir(TC) ->
+ case TC of
+ basic -> otptest;
+ resolve -> otptest;
+ edns0 -> otptest;
+ files_monitor -> otptest;
+ last_ms_answer -> otptest;
+ _ -> undefined
+ end.
init_per_testcase(Func, Config) ->
PrivDir = ?config(priv_dir, Config),
@@ -157,6 +185,88 @@ ns_printlog(Fname) ->
ok
end.
+%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Behaviour modifying nameserver proxy
+
+proxy_start(TC, {NS,P}) ->
+ Tag = make_ref(),
+ Parent = self(),
+ Pid =
+ spawn_link(
+ fun () ->
+ try proxy_start(TC, NS, P, Parent, Tag)
+ catch C:X ->
+ io:format(
+ "~w: ~w:~p ~p~n",
+ [self(),C,X,erlang:get_stacktrace()])
+ end
+ end),
+ receive {started,Tag,Port} ->
+ ProxyNS = {{127,0,0,1},Port},
+ {proxy,Pid,Tag,ProxyNS}
+ end.
+
+proxy_start(TC, NS, P, Parent, Tag) ->
+ {ok,Outbound} = gen_udp:open(0, [binary]),
+ ok = gen_udp:connect(Outbound, NS, P),
+ {ok,Inbound} = gen_udp:open(0, [binary]),
+ {ok,Port} = inet:port(Inbound),
+ Parent ! {started,Tag,Port},
+ proxy(TC, Outbound, NS, P, Inbound).
+
+
+%% To provoke the last_ms_answer bug (OTP-9221) the proxy
+%% * Relays the query to the right nameserver
+%% * Intercepts the reply but holds it until the timer that
+%% was started when receiving the query fires.
+%% * Repeats the reply with incorrect query ID a number of
+%% times with a short interval.
+%% * Sends the correct reply, to give a correct test result
+%% after bug correction.
+%%
+%% The repetition of an incorrect answer with tight interval will keep
+%% inet_res in an inner loop in the code that decrements the remaining
+%% time until it hits 0 which triggers a crash, if the outer timeout
+%% parameter to inet_res:resolve is so short that it runs out during
+%% these repetitions.
+proxy(last_ms_answer, Outbound, NS, P, Inbound) ->
+ receive
+ {udp,Inbound,SrcIP,SrcPort,Data} ->
+ Time =
+ inet_db:res_option(timeout) div inet_db:res_option(retry),
+ Tag = erlang:make_ref(),
+ erlang:send_after(Time - 10, self(), {time,Tag}),
+ ok = gen_udp:send(Outbound, NS, P, Data),
+ receive
+ {udp,Outbound,NS,P,Reply} ->
+ {ok,Msg} = inet_dns:decode(Reply),
+ Hdr = inet_dns:msg(Msg, header),
+ Id = inet_dns:header(Hdr, id),
+ BadHdr =
+ inet_dns:make_header(Hdr, id, (Id+1) band 16#ffff),
+ BadMsg = inet_dns:make_msg(Msg, header, BadHdr),
+ BadReply = inet_dns:encode(BadMsg),
+ receive
+ {time,Tag} ->
+ proxy__last_ms_answer(
+ Inbound, SrcIP, SrcPort, BadReply, Reply, 30)
+ end
+ end
+ end.
+
+proxy__last_ms_answer(Socket, IP, Port, _, Reply, 0) ->
+ ok = gen_udp:send(Socket, IP, Port, Reply);
+proxy__last_ms_answer(Socket, IP, Port, BadReply, Reply, N) ->
+ ok = gen_udp:send(Socket, IP, Port, BadReply),
+ receive after 1 -> ok end,
+ proxy__last_ms_answer(Socket, IP, Port, BadReply, Reply, N-1).
+
+proxy_wait({proxy,Pid,_,_}) ->
+ Mref = erlang:monitor(process, Pid),
+ receive {'DOWN',Mref,_,_,_} -> ok end.
+
+proxy_ns({proxy,_,_,ProxyNS}) -> ProxyNS.
+
%%
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -177,7 +287,7 @@ basic(Config) when is_list(Config) ->
{ok,Msg1} = inet_dns:decode(Bin1),
%%
%% resolve
- {ok,Msg2} = inet_res:resolve(Name, in, a, [{nameservers,[NS]}]),
+ {ok,Msg2} = inet_res:resolve(Name, in, a, [{nameservers,[NS]},verbose]),
io:format("~p~n", [Msg2]),
[RR2] = inet_dns:msg(Msg2, anlist),
IP = inet_dns:rr(RR2, data),
@@ -447,14 +557,42 @@ do_files_monitor(Config) ->
ok.
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+last_ms_answer(doc) ->
+ ["Answer just when timeout is triggered (OTP-9221)"];
+last_ms_answer(Config) when is_list(Config) ->
+ NS = ns(Config),
+ Name = "ns.otptest",
+ %%IP = {127,0,0,254},
+ Time = inet_db:res_option(timeout) div inet_db:res_option(retry),
+ PSpec = proxy_start(last_ms_answer, NS),
+ ProxyNS = proxy_ns(PSpec),
+ %%
+ %% resolve; whith short timeout to trigger Timeout =:= 0 in inet_res
+ {error,timeout} =
+ inet_res:resolve(
+ Name, in, a, [{nameservers,[ProxyNS]},verbose], Time + 10),
+ %%
+ proxy_wait(PSpec),
+ ok.
+
+%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Compatibility tests. Call the inet_SUITE tests, but with
%% lookup = [file,dns] instead of [native]
+gethostbyaddr() -> inet_SUITE:t_gethostbyaddr().
gethostbyaddr(Config) -> inet_SUITE:t_gethostbyaddr(Config).
+gethostbyaddr_v6() -> inet_SUITE:t_gethostbyaddr_v6().
gethostbyaddr_v6(Config) -> inet_SUITE:t_gethostbyaddr_v6(Config).
+gethostbyname() -> inet_SUITE:t_gethostbyname().
gethostbyname(Config) -> inet_SUITE:t_gethostbyname(Config).
+gethostbyname_v6() -> inet_SUITE:t_gethostbyname_v6().
gethostbyname_v6(Config) -> inet_SUITE:t_gethostbyname_v6(Config).
+getaddr() -> inet_SUITE:t_getaddr().
getaddr(Config) -> inet_SUITE:t_getaddr(Config).
+getaddr_v6() -> inet_SUITE:t_getaddr_v6().
getaddr_v6(Config) -> inet_SUITE:t_getaddr_v6(Config).
+ipv4_to_ipv6() -> inet_SUITE:ipv4_to_ipv6().
ipv4_to_ipv6(Config) -> inet_SUITE:ipv4_to_ipv6(Config).
+host_and_addr() -> inet_SUITE:host_and_addr().
host_and_addr(Config) -> inet_SUITE:host_and_addr(Config).
diff --git a/lib/kernel/test/inet_sockopt_SUITE.erl b/lib/kernel/test/inet_sockopt_SUITE.erl
index 0fa0226ccf..0c63a6d653 100644
--- a/lib/kernel/test/inet_sockopt_SUITE.erl
+++ b/lib/kernel/test/inet_sockopt_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -18,7 +18,7 @@
%%
-module(inet_sockopt_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(C_GET_IPPROTO_TCP,1).
@@ -48,7 +48,9 @@
-define(C_QUIT,99).
--export([all/1, simple/1, loop_all/1, simple_raw/1, simple_raw_getbin/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ simple/1, loop_all/1, simple_raw/1, simple_raw_getbin/1,
doc_examples_raw/1,doc_examples_raw_getbin/1,
large_raw/1,large_raw_getbin/1,combined/1,combined_getbin/1,
type_errors/1]).
@@ -56,10 +58,29 @@
-export([init_per_testcase/2, end_per_testcase/2]).
-all(suite) ->
- [simple,loop_all,simple_raw,simple_raw_getbin,
- doc_examples_raw, doc_examples_raw_getbin,
- large_raw,large_raw_getbin,combined,combined_getbin,type_errors].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [simple, loop_all, simple_raw, simple_raw_getbin,
+ doc_examples_raw, doc_examples_raw_getbin, large_raw,
+ large_raw_getbin, combined, combined_getbin,
+ type_errors].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Func, Config) ->
Dog = test_server:timetrap(test_server:seconds(60)),
diff --git a/lib/kernel/test/init_SUITE.erl b/lib/kernel/test/init_SUITE.erl
index bbd8261197..2db0f7dcb8 100644
--- a/lib/kernel/test/init_SUITE.erl
+++ b/lib/kernel/test/init_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -18,16 +18,18 @@
%%
-module(init_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/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([get_arguments/1, get_argument/1, boot_var/1, restart/1,
+ many_restarts/1,
get_plain_arguments/1,
- reboot/1, stop/1, get_status/1, script_id/1, boot/1]).
+ reboot/1, stop/1, get_status/1, script_id/1]).
-export([boot1/1, boot2/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
-export([init/1, fini/1]).
@@ -38,17 +40,35 @@
%% Should be started in a CC view with:
%% erl -sname master -rsh ctrsh
%%-----------------------------------------------------------------
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[get_arguments, get_argument, boot_var,
- get_plain_arguments,
- restart,
- get_status, script_id, boot].
+ many_restarts,
+ get_plain_arguments, restart, get_status, script_id,
+ {group, boot}].
+
+groups() ->
+ [{boot, [], [boot1, boot2]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog=?t:timetrap(?t:seconds(?DEFAULT_TIMEOUT_SEC)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog).
@@ -299,6 +319,73 @@ is_real_system(KernelVsn, StdlibVsn) ->
%% Therefore the slave process must be killed
%% before restart.
%% ------------------------------------------------
+many_restarts(doc) -> [];
+many_restarts(suite) ->
+ case ?t:os_type() of
+ {Fam, _} when Fam == unix; Fam == win32 ->
+ {req, [distribution, {local_slave_nodes, 1}, {time, 5}]};
+ _ ->
+ {skip, "Only run on unix and win32"}
+ end;
+
+many_restarts(Config) when is_list(Config) ->
+ ?line Dog = ?t:timetrap(?t:seconds(480)),
+ ?line {ok, Node} = loose_node:start(init_test, "", ?DEFAULT_TIMEOUT_SEC),
+ ?line loop_restart(30,Node,rpc:call(Node,erlang,whereis,[error_logger])),
+ ?line loose_node:stop(Node),
+ ?line ?t:timetrap_cancel(Dog),
+ ok.
+
+loop_restart(0,_,_) ->
+ ok;
+loop_restart(N,Node,EHPid) ->
+ ?line erlang:monitor_node(Node, true),
+ ?line ok = rpc:call(Node, init, restart, []),
+ ?line receive
+ {nodedown, Node} ->
+ ok
+ after 10000 ->
+ loose_node:stop(Node),
+ ?t:fail(not_stopping)
+ end,
+ ?line ok = wait_for(30, Node, EHPid),
+ ?line loop_restart(N-1,Node,rpc:call(Node,erlang,whereis,[error_logger])).
+
+wait_for(0,Node,_) ->
+ loose_node:stop(Node),
+ error;
+wait_for(N,Node,EHPid) ->
+ ?line case rpc:call(Node, erlang, whereis, [error_logger]) of
+ Pid when is_pid(Pid), Pid =/= EHPid ->
+ %% ?line erlang:display(ok),
+ ?line ok;
+ _X ->
+ %% ?line erlang:display(_X),
+ %% ?line Procs = rpc:call(Node, erlang, processes, []),
+ %% ?line erlang:display(Procs),
+ %% case is_list(Procs) of
+ %% true ->
+ %% ?line [(catch erlang:display(
+ %% rpc:call(Node,
+ %% erlang,
+ %% process_info,
+ %% [Y,registered_name])))
+ %% || Y <- Procs];
+ %% _ ->
+ %% ok
+ %% end,
+ receive
+ after 100 ->
+ ok
+ end,
+ ?line wait_for(N-1,Node,EHPid)
+ end.
+
+%% ------------------------------------------------
+%% Slave executes erlang:halt() on master nodedown.
+%% Therefore the slave process must be killed
+%% before restart.
+%% ------------------------------------------------
restart(doc) -> [];
restart(suite) ->
case ?t:os_type() of
@@ -488,7 +575,6 @@ script_id(Config) when is_list(Config) ->
%% ------------------------------------------------
%% Start the slave system with -boot flag.
%% ------------------------------------------------
-boot(suite) -> [boot1, boot2].
boot1(doc) -> [];
boot1(suite) -> {req, [distribution, {local_slave_nodes, 1}, {time, 35}]};
diff --git a/lib/kernel/test/interactive_shell_SUITE.erl b/lib/kernel/test/interactive_shell_SUITE.erl
index c0db292ba5..b2308dd321 100644
--- a/lib/kernel/test/interactive_shell_SUITE.erl
+++ b/lib/kernel/test/interactive_shell_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -17,8 +17,10 @@
%% %CopyrightEnd%
%%
-module(interactive_shell_SUITE).
--include("test_server.hrl").
--export([all/1, get_columns_and_rows/1, exit_initial/1, job_control_local/1,
+-include_lib("test_server/include/test_server.hrl").
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ get_columns_and_rows/1, exit_initial/1, job_control_local/1,
job_control_remote/1,
job_control_remote_noshell/1]).
@@ -44,10 +46,28 @@ end_per_testcase(_Func, Config) ->
test_server:timetrap_cancel(Dog).
-all(suite) ->
- [get_columns_and_rows, exit_initial, job_control_local,
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [get_columns_and_rows, exit_initial, job_control_local,
job_control_remote, job_control_remote_noshell].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%-define(DEBUG,1).
-ifdef(DEBUG).
-define(dbg(Data),erlang:display(Data)).
diff --git a/lib/kernel/test/kernel.cover b/lib/kernel/test/kernel.cover
index 228dafc565..f6967ca651 100644
--- a/lib/kernel/test/kernel.cover
+++ b/lib/kernel/test/kernel.cover
@@ -1,4 +1,3 @@
%% -*- erlang -*-
-{exclude,all}.
-{include,[gen_udp,inet6_udp,inet_res,inet_dns]}.
+{incl_mods,[gen_udp,inet6_udp,inet_res,inet_dns]}.
diff --git a/lib/kernel/test/kernel.dynspec b/lib/kernel/test/kernel.dynspec
deleted file mode 100644
index 297a7c71ea..0000000000
--- a/lib/kernel/test/kernel.dynspec
+++ /dev/null
@@ -1,57 +0,0 @@
-%% -*- erlang -*-
-%% You can test this file using this command.
-%% file:script("kernel.dynspec", [{'Os',"Unix"}]).
-
-case Os of
- "VxWorks" ->
- FsCantHandle = "VxWorks filesystem can't handle this",
- FsOverload = "VxWorks filesystem would overload",
- CantHandle = "VxWorks can't handle this",
- SlaveMisadaption = "Test not adopted to slaves on different machine",
- [{skip,{application_SUITE,
- "VxWorks: requires manual testing "++
- "(requires multiple nodes (OTP-1774))"}},
- {skip,{bif_SUITE, spawn_link_race1, "Known bug."}},
- {skip,{erl_distribution_SUITE, "VxWorks: More vx nodes needed"}},
- {skip,{file_SUITE,read_write_file,FsCantHandle}},
- {skip,{file_SUITE,cur_dir_0,FsCantHandle}},
- {skip,{file_SUITE,open1,FsCantHandle}},
- {skip,{file_SUITE,file_info_times,FsCantHandle}},
- {skip,{file_SUITE,file_write_file_info,FsCantHandle}},
- {skip,{file_SUITE,truncate,FsCantHandle}},
- {skip,{file_SUITE,rename,FsCantHandle}},
- {skip,{file_SUITE,e_delete,FsCantHandle}},
- {skip,{file_SUITE,e_rename,FsCantHandle}},
- {skip,{file_SUITE,delayed_write,FsCantHandle}},
- {skip,{file_SUITE,read_ahead,FsCantHandle}},
- {skip,{file_SUITE,segment_write,FsOverload}},
- {skip,{file_SUITE,segment_read,FsOverload}},
- {skip,{file_SUITE,compress_errors,FsCantHandle}},
- {skip,{global_SUITE,
- "To heavy on slavenodes for VxWorks (and more)."}},
- {skip,{global_group_SUITE, "To heavy on slavenodes for VxWorks."}},
- {skip,{heart_SUITE, "Not for VxWorks heart, it's special"}},
- {skip,{init_SUITE,restart,"Uses peer nodes"}},
- {skip,{kernel_config_SUITE, "VxWorks does not support slave nodes"}},
- {skip,{os_SUITE,space_in_cwd,CantHandle}},
- {skip,{os_SUITE,space_in_name,CantHandle}},
- {skip,{os_SUITE,quoting,CantHandle}},
- {skip,{prim_file_SUITE,open1,FsCantHandle}},
- {skip,{prim_file_SUITE,compress_errors,FsCantHandle}},
- {skip,{seq_trace_SUITE,distributed_recv,SlaveMisadaption}},
- {skip,{seq_trace_SUITE,distributed_exit,SlaveMisadaption}}];
- _ ->
- []
-end ++
-try gen_sctp:open() of
- {ok,Socket} ->
- gen_sctp:close(Socket),
- [];
- _ ->
- []
-catch
- error:badarg ->
- [{skip,{gen_sctp_SUITE,"SCTP not supported on this machine"}}];
- _:_ ->
- []
-end.
diff --git a/lib/kernel/test/kernel.spec b/lib/kernel/test/kernel.spec
new file mode 100644
index 0000000000..62afc9f97b
--- /dev/null
+++ b/lib/kernel/test/kernel.spec
@@ -0,0 +1,4 @@
+{config, "../test_server/ts.config"}.
+{config, "../test_server/ts.unix.config"}.
+
+{suites,"../kernel_test", all}.
diff --git a/lib/kernel/test/kernel.spec.wxworks b/lib/kernel/test/kernel.spec.wxworks
new file mode 100644
index 0000000000..370e474e64
--- /dev/null
+++ b/lib/kernel/test/kernel.spec.wxworks
@@ -0,0 +1,63 @@
+%% -*- erlang -*-
+{suites,"kernel_test",all}.
+{skip_cases,"kernel_test",bif_SUITE,[spawn_link_race1],"Known bug."}.
+{skip_cases,"kernel_test",file_SUITE,
+ [read_write_file],
+ "VxWorks filesystem can't handle this"}.
+{skip_cases,"kernel_test",file_SUITE,
+ [cur_dir_0],
+ "VxWorks filesystem can't handle this"}.
+{skip_cases,"kernel_test",file_SUITE,
+ [open1],
+ "VxWorks filesystem can't handle this"}.
+{skip_cases,"kernel_test",file_SUITE,
+ [file_info_times],
+ "VxWorks filesystem can't handle this"}.
+{skip_cases,"kernel_test",file_SUITE,
+ [file_write_file_info],
+ "VxWorks filesystem can't handle this"}.
+{skip_cases,"kernel_test",file_SUITE,
+ [truncate],
+ "VxWorks filesystem can't handle this"}.
+{skip_cases,"kernel_test",file_SUITE,
+ [rename],
+ "VxWorks filesystem can't handle this"}.
+{skip_cases,"kernel_test",file_SUITE,
+ [e_delete],
+ "VxWorks filesystem can't handle this"}.
+{skip_cases,"kernel_test",file_SUITE,
+ [e_rename],
+ "VxWorks filesystem can't handle this"}.
+{skip_cases,"kernel_test",file_SUITE,
+ [delayed_write],
+ "VxWorks filesystem can't handle this"}.
+{skip_cases,"kernel_test",file_SUITE,
+ [read_ahead],
+ "VxWorks filesystem can't handle this"}.
+{skip_cases,"kernel_test",file_SUITE,
+ [segment_write],
+ "VxWorks filesystem would overload"}.
+{skip_cases,"kernel_test",file_SUITE,
+ [segment_read],
+ "VxWorks filesystem would overload"}.
+{skip_cases,"kernel_test",file_SUITE,
+ [compress_errors],
+ "VxWorks filesystem can't handle this"}.
+{skip_cases,"kernel_test",init_SUITE,[restart],"Uses peer nodes"}.
+{skip_cases,"kernel_test",os_SUITE,[space_in_cwd],"VxWorks can't handle this"}.
+{skip_cases,"kernel_test",os_SUITE,
+ [space_in_name],
+ "VxWorks can't handle this"}.
+{skip_cases,"kernel_test",os_SUITE,[quoting],"VxWorks can't handle this"}.
+{skip_cases,"kernel_test",prim_file_SUITE,
+ [open1],
+ "VxWorks filesystem can't handle this"}.
+{skip_cases,"kernel_test",prim_file_SUITE,
+ [compress_errors],
+ "VxWorks filesystem can't handle this"}.
+{skip_cases,"kernel_test",seq_trace_SUITE,
+ [distributed_recv],
+ "Test not adopted to slaves on different machine"}.
+{skip_cases,"kernel_test",seq_trace_SUITE,
+ [distributed_exit],
+ "Test not adopted to slaves on different machine"}.
diff --git a/lib/kernel/test/kernel_SUITE.erl b/lib/kernel/test/kernel_SUITE.erl
index bb1d905de3..16b6c54939 100644
--- a/lib/kernel/test/kernel_SUITE.erl
+++ b/lib/kernel/test/kernel_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -20,15 +20,16 @@
%%% Kernel application test suite.
%%%-----------------------------------------------------------------
-module(kernel_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
% Default timetrap timeout (set in init_per_testcase).
-define(default_timeout, ?t:minutes(1)).
% Test server specific exports
--export([all/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
% Test cases must be exported.
-export([app_test/1]).
@@ -36,15 +37,31 @@
%%
%% all/1
%%
-all(doc) ->
- [];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[app_test].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
init_per_testcase(_Case, Config) ->
?line Dog=test_server:timetrap(?default_timeout),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/kernel/test/kernel_config_SUITE.erl b/lib/kernel/test/kernel_config_SUITE.erl
index c72fc3f02d..93bdb8657c 100644
--- a/lib/kernel/test/kernel_config_SUITE.erl
+++ b/lib/kernel/test/kernel_config_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -18,23 +18,35 @@
%%
-module(kernel_config_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1, sync/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2, sync/1]).
--export([init/1, fini/1]).
+-export([init_per_suite/1, end_per_suite/1]).
-all(suite) ->
- [{conf, init, [sync], fini}].
+suite() -> [{ct_hooks,[ts_install_cth]}].
-init(doc) -> [];
-init(suite) -> [];
-init(Config) when is_list(Config) ->
+all() ->
+ [sync].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+init_per_suite(doc) -> [];
+init_per_suite(suite) -> [];
+init_per_suite(Config) when is_list(Config) ->
Config.
-fini(doc) -> [];
-fini(suite) -> [];
-fini(Config) when is_list(Config) ->
+end_per_suite(doc) -> [];
+end_per_suite(suite) -> [];
+end_per_suite(Config) when is_list(Config) ->
stop_node(init_test),
Config.
diff --git a/lib/kernel/test/myApp.erl b/lib/kernel/test/myApp.erl
index 2b92046141..26dc74f91b 100644
--- a/lib/kernel/test/myApp.erl
+++ b/lib/kernel/test/myApp.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2010. 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
diff --git a/lib/kernel/test/os_SUITE.erl b/lib/kernel/test/os_SUITE.erl
index eacf3c7584..b08b12c978 100644
--- a/lib/kernel/test/os_SUITE.erl
+++ b/lib/kernel/test/os_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -18,15 +18,34 @@
%%
-module(os_SUITE).
--export([all/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([space_in_cwd/1, quoting/1, space_in_name/1, bad_command/1,
find_executable/1, unix_comment_in_command/1, evil/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [space_in_cwd, quoting, space_in_name, bad_command,
+ find_executable, unix_comment_in_command, evil].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [space_in_cwd, quoting, space_in_name, bad_command, find_executable,
- unix_comment_in_command, evil].
space_in_cwd(doc) ->
"Test that executing a command in a current working directory "
@@ -156,6 +175,21 @@ find_executable(Config) when is_list(Config) ->
?line find_exe(Current, "my_batch", ".bat", Path),
ok;
{unix, _} ->
+ DataDir = ?config(data_dir, Config),
+
+ %% Smoke test.
+ case lib:progname() of
+ erl ->
+ ?line ErlPath = os:find_executable("erl"),
+ ?line true = is_list(ErlPath),
+ ?line true = filelib:is_regular(ErlPath);
+ _ ->
+ %% Don't bother -- the progname could include options.
+ ok
+ end,
+
+ %% Never return a directory name.
+ ?line false = os:find_executable("unix", [DataDir]),
ok;
vxworks ->
ok
diff --git a/lib/kernel/test/pdict_SUITE.erl b/lib/kernel/test/pdict_SUITE.erl
index 87ee951a0c..8afdfc8a47 100644
--- a/lib/kernel/test/pdict_SUITE.erl
+++ b/lib/kernel/test/pdict_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -20,7 +20,7 @@
%% NB: The ?line macro cannot be used when testing the dictionary.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(M(A,B),m(A,B,?MODULE,?LINE)).
-ifdef(DEBUG).
@@ -29,22 +29,41 @@
-define(DEBUGF(A,B), noop).
-endif.
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
simple/1, complicated/1, heavy/1, info/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
-export([other_process/2]).
init_per_testcase(_Case, Config) ->
?line Dog = ?t:timetrap(test_server:minutes(10)),
[{watchdog, Dog} | Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[simple, complicated, heavy, info].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
simple(doc) ->
["Tests simple functionality in process dictionary."];
simple(suite) ->
diff --git a/lib/kernel/test/pg2_SUITE.erl b/lib/kernel/test/pg2_SUITE.erl
index df28dcf447..0ac34e735c 100644
--- a/lib/kernel/test/pg2_SUITE.erl
+++ b/lib/kernel/test/pg2_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -20,14 +20,16 @@
%%-----------------------------------------------------------------
-module(pg2_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(datadir, ?config(data_dir, Config)).
-define(privdir, ?config(priv_dir, Config)).
--export([all/1, init_per_testcase/2, fin_per_testcase/2]).
+-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([tickets/1,
- otp_7277/1, otp_8259/1, otp_8653/1,
+-export([
+ otp_7277/1, otp_8259/1, otp_8653/1,
compat/1, basic/1]).
% Default timetrap timeout (set in init_per_testcase).
@@ -44,16 +46,33 @@ init_per_testcase(Case, Config) ->
?line Dog = ?t:timetrap(?default_timeout),
[{?TESTCASE, Case}, {watchdog, Dog} | Config].
-fin_per_testcase(_Case, _Config) ->
+end_per_testcase(_Case, _Config) ->
Dog = ?config(watchdog, _Config),
test_server:timetrap_cancel(Dog),
ok.
-all(suite) ->
- [tickets].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, tickets}].
+
+groups() ->
+ [{tickets, [],
+ [otp_7277, otp_8259, otp_8653, compat, basic]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
-tickets(suite) ->
- [otp_7277, otp_8259, otp_8653, compat, basic].
otp_7277(doc) ->
"OTP-7277. Bugfix leave().";
diff --git a/lib/kernel/test/prim_file_SUITE.erl b/lib/kernel/test/prim_file_SUITE.erl
index 1688ec45ca..a04ea3cdcd 100644
--- a/lib/kernel/test/prim_file_SUITE.erl
+++ b/lib/kernel/test/prim_file_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -17,40 +17,40 @@
%% %CopyrightEnd%
%%
-module(prim_file_SUITE).
--export([all/1,
- init/1, fini/1,
- read_write_file/1, dirs/1, files/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ read_write_file/1]).
-export([cur_dir_0a/1, cur_dir_0b/1,
cur_dir_1a/1, cur_dir_1b/1,
make_del_dir_a/1, make_del_dir_b/1,
- pos/1, pos1/1, pos2/1]).
+ pos1/1, pos2/1]).
-export([close/1,
delete_a/1, delete_b/1]).
--export([open/1, open1/1, modes/1]).
--export([file_info/1,
- file_info_basic_file_a/1, file_info_basic_file_b/1,
- file_info_basic_directory_a/1, file_info_basic_directory_b/1,
- file_info_bad_a/1, file_info_bad_b/1,
- file_info_times_a/1, file_info_times_b/1,
- file_write_file_info_a/1, file_write_file_info_b/1]).
+-export([ open1/1, modes/1]).
+-export([
+ file_info_basic_file_a/1, file_info_basic_file_b/1,
+ file_info_basic_directory_a/1, file_info_basic_directory_b/1,
+ file_info_bad_a/1, file_info_bad_b/1,
+ file_info_times_a/1, file_info_times_b/1,
+ file_write_file_info_a/1, file_write_file_info_b/1]).
-export([rename_a/1, rename_b/1,
access/1, truncate/1, datasync/1, sync/1,
read_write/1, pread_write/1, append/1, exclusive/1]).
--export([errors/1, e_delete/1, e_rename/1, e_make_dir/1, e_del_dir/1]).
+-export([ e_delete/1, e_rename/1, e_make_dir/1, e_del_dir/1]).
--export([compression/1, read_not_really_compressed/1,
- read_compressed/1, write_compressed/1,
- compress_errors/1]).
+-export([ read_not_really_compressed/1,
+ read_compressed/1, write_compressed/1,
+ compress_errors/1]).
--export([links/1,
- make_link_a/1, make_link_b/1,
- read_link_info_for_non_link/1,
- symlinks_a/1, symlinks_b/1,
- list_dir_limit/1]).
+-export([
+ make_link_a/1, make_link_b/1,
+ read_link_info_for_non_link/1,
+ symlinks_a/1, symlinks_b/1,
+ list_dir_limit/1]).
-export([advise/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("kernel/include/file.hrl").
-define(PRIM_FILE, prim_file).
@@ -67,14 +67,47 @@
_ -> apply(?PRIM_FILE, F, [H | A])
end).
-all(suite) -> {req, [kernel],
- {conf, init,
- [read_write_file, dirs, files,
- delete_a, delete_b, rename_a, rename_b, errors,
- compression, links, list_dir_limit],
- fini}}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [read_write_file, {group, dirs}, {group, files},
+ delete_a, delete_b, rename_a, rename_b, {group, errors},
+ {group, compression}, {group, links}, list_dir_limit].
+
+groups() ->
+ [{dirs, [],
+ [make_del_dir_a, make_del_dir_b, cur_dir_0a, cur_dir_0b,
+ cur_dir_1a, cur_dir_1b]},
+ {files, [],
+ [{group, open}, {group, pos}, {group, file_info},
+ truncate, sync, datasync, advise]},
+ {open, [],
+ [open1, modes, close, access, read_write, pread_write,
+ append, exclusive]},
+ {pos, [], [pos1, pos2]},
+ {file_info, [],
+ [file_info_basic_file_a, file_info_basic_file_b,
+ file_info_basic_directory_a,
+ file_info_basic_directory_b, file_info_bad_a,
+ file_info_bad_b, file_info_times_a, file_info_times_b,
+ file_write_file_info_a, file_write_file_info_b]},
+ {errors, [],
+ [e_delete, e_rename, e_make_dir, e_del_dir]},
+ {compression, [],
+ [read_compressed, read_not_really_compressed,
+ write_compressed, compress_errors]},
+ {links, [],
+ [make_link_a, make_link_b, read_link_info_for_non_link,
+ symlinks_a, symlinks_b]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
-init(Config) when is_list(Config) ->
+init_per_suite(Config) when is_list(Config) ->
case os:type() of
{win32, _} ->
Priv = ?config(priv_dir, Config),
@@ -91,7 +124,7 @@ init(Config) when is_list(Config) ->
Config
end.
-fini(Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
case os:type() of
{win32, _} ->
os:cmd("subst z: /d");
@@ -190,9 +223,6 @@ read_write_file(Config) when is_list(Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-dirs(suite) -> [make_del_dir_a, make_del_dir_b,
- cur_dir_0a, cur_dir_0b,
- cur_dir_1a, cur_dir_1b].
make_del_dir_a(suite) -> [];
make_del_dir_a(doc) -> [];
@@ -382,10 +412,7 @@ win_cur_dir_1(_Config, Handle) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-files(suite) -> [open,pos,file_info,truncate,sync,datasync,advise].
-open(suite) -> [open1,modes,close,access,read_write,
- pread_write,append,exclusive].
open1(suite) -> [];
open1(doc) -> [];
@@ -628,7 +655,6 @@ exclusive(Config) when is_list(Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-pos(suite) -> [pos1,pos2].
pos1(suite) -> [];
pos1(doc) -> [];
@@ -716,12 +742,6 @@ pos2(Config) when is_list(Config) ->
?line test_server:timetrap_cancel(Dog),
ok.
-file_info(suite) -> [file_info_basic_file_a, file_info_basic_file_b,
- file_info_basic_directory_a,
- file_info_basic_directory_b,
- file_info_bad_a, file_info_bad_b,
- file_info_times_a, file_info_times_b,
- file_write_file_info_a, file_write_file_info_b].
file_info_basic_file_a(suite) -> [];
file_info_basic_file_a(doc) -> [];
@@ -1298,7 +1318,6 @@ rename(Config, Handle, Suffix) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-errors(suite) -> [e_delete, e_rename, e_make_dir, e_del_dir].
e_delete(suite) -> [];
e_delete(doc) -> [];
@@ -1550,8 +1569,6 @@ e_del_dir(Config) when is_list(Config) ->
?line test_server:timetrap_cancel(Dog),
ok.
-compression(suite) -> [read_compressed, read_not_really_compressed,
- write_compressed, compress_errors].
%% Trying reading and positioning from a compressed file.
@@ -1704,11 +1721,6 @@ compress_errors(Config) when is_list(Config) ->
?line test_server:timetrap_cancel(Dog),
ok.
-links(doc) -> "Test the link functions.";
-links(suite) ->
- [make_link_a, make_link_b,
- read_link_info_for_non_link,
- symlinks_a, symlinks_b].
make_link_a(doc) -> "Test creating a hard link.";
make_link_a(suite) -> [];
diff --git a/lib/kernel/test/ram_file_SUITE.erl b/lib/kernel/test/ram_file_SUITE.erl
index 798a37d3dc..9b3fbb91fc 100644
--- a/lib/kernel/test/ram_file_SUITE.erl
+++ b/lib/kernel/test/ram_file_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -19,14 +19,15 @@
-module(ram_file_SUITE).
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
%% init/1, fini/1,
- init_per_testcase/2, fin_per_testcase/2]).
+ init_per_testcase/2, end_per_testcase/2]).
-export([open_modes/1, open_old_modes/1, pread_pwrite/1, position/1,
truncate/1, sync/1, get_set_file/1, compress/1, uuencode/1,
large_file_errors/1, large_file_light/1, large_file_heavy/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("kernel/include/file.hrl").
-define(FILE_MODULE, file). % Name of module to test
@@ -34,11 +35,29 @@
%%--------------------------------------------------------------------------
-all(suite) ->
- [open_modes, open_old_modes, pread_pwrite, position,
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [open_modes, open_old_modes, pread_pwrite, position,
truncate, sync, get_set_file, compress, uuencode,
large_file_errors, large_file_light, large_file_heavy].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Time =
case Func of
@@ -51,7 +70,7 @@ init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
%% error_logger:info_msg("~p:~p *****~n", [?MODULE, Func]),
[{watchdog, Dog} | Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
%% error_logger:info_msg("~p:~p END *****~n", [?MODULE, Func]),
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog).
diff --git a/lib/kernel/test/rpc_SUITE.erl b/lib/kernel/test/rpc_SUITE.erl
index 2b7de40797..7adef49014 100644
--- a/lib/kernel/test/rpc_SUITE.erl
+++ b/lib/kernel/test/rpc_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -18,7 +18,8 @@
%%
-module(rpc_SUITE).
--export([all/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([call/1, block_call/1, multicall/1, multicall_timeout/1,
multicall_dies/1, multicall_node_dies/1,
called_dies/1, called_node_dies/1,
@@ -26,13 +27,31 @@
-export([suicide/2, suicide/3, f/0, f2/0]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [call, block_call, multicall, multicall_timeout,
+ multicall_dies, multicall_node_dies, called_dies,
+ called_node_dies, called_throws, call_benchmark,
+ async_call].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [call, block_call, multicall, multicall_timeout,
- multicall_dies, multicall_node_dies,
- called_dies, called_node_dies,
- called_throws, call_benchmark, async_call].
call(doc) -> "Test different rpc calls";
diff --git a/lib/kernel/test/seq_trace_SUITE.erl b/lib/kernel/test/seq_trace_SUITE.erl
index b557c7fb1e..47eeb4df4c 100644
--- a/lib/kernel/test/seq_trace_SUITE.erl
+++ b/lib/kernel/test/seq_trace_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -18,7 +18,9 @@
%%
-module(seq_trace_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2]).
+-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([token_set_get/1, tracer_set_get/1, print/1,
send/1, distributed_send/1, recv/1, distributed_recv/1,
trace_exit/1, distributed_exit/1, call/1, port/1,
@@ -29,21 +31,40 @@
start_tracer/0, stop_tracer/1,
do_match_set_seq_token/1, do_gc_seq_token/1, countdown_start/2]).
-%-define(line_trace, 1).
--include("test_server.hrl").
+ %-define(line_trace, 1).
+-include_lib("test_server/include/test_server.hrl").
-define(default_timeout, ?t:minutes(1)).
-all(suite) -> [token_set_get, tracer_set_get, print,
- send, distributed_send, recv, distributed_recv,
- trace_exit, distributed_exit, call, port,
- match_set_seq_token, gc_seq_token].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [token_set_get, tracer_set_get, print, send,
+ distributed_send, recv, distributed_recv, trace_exit,
+ distributed_exit, call, port, match_set_seq_token,
+ gc_seq_token].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Case, Config) ->
?line Dog = test_server:timetrap(?default_timeout),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/kernel/test/topApp.erl b/lib/kernel/test/topApp.erl
index acf98e6da0..f44e99f738 100644
--- a/lib/kernel/test/topApp.erl
+++ b/lib/kernel/test/topApp.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2010. 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
diff --git a/lib/kernel/test/topApp2.erl b/lib/kernel/test/topApp2.erl
index 4587910ff3..b791d4a914 100644
--- a/lib/kernel/test/topApp2.erl
+++ b/lib/kernel/test/topApp2.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2010. 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
diff --git a/lib/kernel/test/topApp3.erl b/lib/kernel/test/topApp3.erl
index 1bb6f2f31a..456ef5b2fb 100644
--- a/lib/kernel/test/topApp3.erl
+++ b/lib/kernel/test/topApp3.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2010. 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
diff --git a/lib/kernel/test/wrap_log_reader_SUITE.erl b/lib/kernel/test/wrap_log_reader_SUITE.erl
index ceac593e44..ffc8def626 100644
--- a/lib/kernel/test/wrap_log_reader_SUITE.erl
+++ b/lib/kernel/test/wrap_log_reader_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -28,31 +28,53 @@
-define(config(X,Y), foo).
-define(t,test_server).
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(format(S, A), ok).
-define(privdir(Conf), ?config(priv_dir, Conf)).
-endif.
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
no_file/1,
- one/1, one_empty/1, one_filled/1,
- two/1, two_filled/1,
- four/1, four_filled/1,
- wrap/1, wrap_filled/1,
+ one_empty/1, one_filled/1,
+ two_filled/1,
+ four_filled/1,
+ wrap_filled/1,
wrapping/1,
external/1,
error/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [no_file, {group, one}, {group, two}, {group, four},
+ {group, wrap}, wrapping, external, error].
+
+groups() ->
+ [{one, [], [one_empty, one_filled]},
+ {two, [], [two_filled]}, {four, [], [four_filled]},
+ {wrap, [], [wrap_filled]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [no_file, one, two, four, wrap, wrapping, external, error].
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
Dog=?t:timetrap(?t:seconds(60)),
[{watchdog, Dog} | Config].
-fin_per_testcase(_Func, _Config) ->
+end_per_testcase(_Func, _Config) ->
Dog=?config(watchdog, _Config),
?t:timetrap_cancel(Dog).
@@ -76,8 +98,6 @@ no_file(Conf) when is_list(Conf) ->
delete_files(File),
ok.
-one(suite) -> [one_empty, one_filled];
-one(doc) -> ["One index file"].
one_empty(suite) -> [];
one_empty(doc) -> ["One empty index file"];
@@ -139,8 +159,6 @@ test_one(File) ->
{chunk, 1, ["first round, two"]}, eof], wlt, ?LINE),
ok.
-two(suite) -> [two_filled];
-two(doc) -> ["Two index files"].
two_filled(suite) -> [];
two_filled(doc) -> ["Two filled index files"];
@@ -181,8 +199,6 @@ test_two(File) ->
{chunk, 2, ["first round, 12"]}, eof], wlt, ?LINE),
ok.
-four(suite) -> [four_filled];
-four(doc) -> ["Four index files"].
four_filled(suite) -> [];
four_filled(doc) -> ["Four filled index files"];
@@ -226,8 +242,6 @@ test_four(File) ->
{chunk, 2, ["first round, 42"]}, eof], wlt, ?LINE),
ok.
-wrap(suite) -> [wrap_filled];
-wrap(doc) -> ["Wrap index file, first wrapping"].
wrap_filled(suite) -> [];
wrap_filled(doc) -> ["First wrap, open, filled index file"];
diff --git a/lib/kernel/test/zlib_SUITE.erl b/lib/kernel/test/zlib_SUITE.erl
index f20c9a176b..9eb84c9167 100644
--- a/lib/kernel/test/zlib_SUITE.erl
+++ b/lib/kernel/test/zlib_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -19,7 +19,7 @@
-module(zlib_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-compile(export_all).
@@ -48,7 +48,7 @@
init_per_testcase(_Func, Config) ->
Dog = test_server:timetrap(test_server:seconds(60)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog).
@@ -69,33 +69,40 @@ error(Format, Args, File, Line) ->
%% end,
%% log("<>ERROR<>~n" ++ Format, Args, File, Line).
-all(suite) ->
- [api, examples, func, smp, otp_7359].
-
-api(doc) -> "Basic the api tests";
-api(suite) ->
- [api_open_close,
- api_deflateInit,
- api_deflateSetDictionary,
- api_deflateReset,
- api_deflateParams,
- api_deflate,
- api_deflateEnd,
- api_inflateInit,
- api_inflateSetDictionary,
- api_inflateSync,
- api_inflateReset,
- api_inflate,
- api_inflateEnd,
- api_setBufsz,
- api_getBufsz,
- api_crc32,
- api_adler32,
- api_getQSize,
- api_un_compress,
- api_un_zip,
-% api_g_un_zip_file,
- api_g_un_zip].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, api}, {group, examples}, {group, func}, smp,
+ otp_7359].
+
+groups() ->
+ [{api, [],
+ [api_open_close, api_deflateInit,
+ api_deflateSetDictionary, api_deflateReset,
+ api_deflateParams, api_deflate, api_deflateEnd,
+ api_inflateInit, api_inflateSetDictionary,
+ api_inflateSync, api_inflateReset, api_inflate,
+ api_inflateEnd, api_setBufsz, api_getBufsz, api_crc32,
+ api_adler32, api_getQSize, api_un_compress, api_un_zip,
+ api_g_un_zip]},
+ {examples, [], [intro]},
+ {func, [],
+ [zip_usage, gz_usage, gz_usage2, compress_usage,
+ dictionary_usage, large_deflate, crc, adler]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
api_open_close(doc) -> "Test open/0 and close/1";
api_open_close(suite) -> [];
@@ -517,11 +524,6 @@ bad_len_data() ->
%% zlib:zip(<<42>>), one byte changed.
<<31,139,8,0,0,0,0,0,0,3,211,2,0,91,38,185,9,2,0,0,0>>.
-examples(doc) -> "Test the doc examples";
-examples(suite) ->
- [
- intro
- ].
intro(suite) -> [];
intro(doc) -> "";
@@ -551,15 +553,6 @@ intro(Config) when is_list(Config) ->
Orig = list_to_binary(lists:duplicate(5, D)),
?m(Orig, zlib:uncompress(Res)).
-func(doc) -> "Test the functionality";
-func(suite) ->
- [zip_usage, gz_usage, gz_usage2, compress_usage,
- dictionary_usage,
- large_deflate,
- %% inflateSync,
- crc,
- adler
- ].
large_deflate(doc) -> "Test deflate large file, which had a bug reported on erlang-bugs";
large_deflate(suite) -> [];
diff --git a/lib/kernel/vsn.mk b/lib/kernel/vsn.mk
index e33b90a274..e7b71cc168 100644
--- a/lib/kernel/vsn.mk
+++ b/lib/kernel/vsn.mk
@@ -1 +1 @@
-KERNEL_VSN = 2.14.3
+KERNEL_VSN = 2.14.4
diff --git a/lib/megaco/Makefile b/lib/megaco/Makefile
index d4698eb558..10efaf667f 100644
--- a/lib/megaco/Makefile
+++ b/lib/megaco/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1999-2009. All Rights Reserved.
+# Copyright Ericsson AB 1999-2011. 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
@@ -97,12 +97,19 @@ endif
CONFIGURE_OPTS = $(FLEX_SCANNER_LINENO_ENABLER) $(FLEX_SCANNER_REENTRANT_ENABLER)
+MEGACO_DIA_PLT = ./priv/megaco.plt
+MEGACO_DIA_PLT_LOG = $(basename $(MEGACO_DIA_PLT)).dialyzer_plt_log
+MEGACO_DIA_LOG = $(basename $(MEGACO_DIA_PLT)).dialyzer_log
+
# ----------------------------------------------------
# Default Subdir Targets
# ----------------------------------------------------
include $(ERL_TOP)/make/otp_subdir.mk
+.PHONY: reconf conf dconf econf configure setup info version \
+ app_install dialyzer
+
reconf:
(cd $(ERL_TOP) && \
./otp_build autoconf && \
@@ -132,6 +139,10 @@ info:
@echo "APP_TAR_FILE: $(APP_TAR_FILE)"
@echo "OTP_INSTALL_DIR: $(OTP_INSTALL_DIR)"
@echo "APP_INSTALL_DIR: $(APP_INSTALL_DIR)"
+ @echo ""
+ @echo "MEGACO_PLT = $(MEGACO_PLT)"
+ @echo "MEGACO_DIA_LOG = $(MEGACO_DIA_LOG)"
+ @echo ""
version:
@echo "$(VSN)"
@@ -190,9 +201,18 @@ tar: $(APP_TAR_FILE)
$(APP_TAR_FILE): $(APP_DIR)
(cd $(APP_RELEASE_DIR); gtar zcf $(APP_TAR_FILE) $(DIR_NAME))
-dialyzer:
- (cd ./ebin; \
- dialyzer --build_plt \
- --output_plt ../priv/megaco.plt \
- -r ../../megaco/ebin \
- --verbose)
+dialyzer_plt: $(MEGACO_DIA_PLT)
+
+$(MEGACO_DIA_PLT):
+ @echo "Building megaco plt file"
+ @dialyzer --build_plt \
+ --output_plt $@ \
+ -r ../megaco/ebin \
+ -o $(MEGACO_DIA_PLT_LOG) \
+ --verbose
+
+dialyzer: $(MEGACO_DIA_PLT)
+ (dialyzer --plt $< \
+ -o $(MEGACO_DIA_LOG) \
+ ../megaco/ebin \
+ && (shell cat $(MEGACO_DIA_LOG)))
diff --git a/lib/megaco/doc/src/megaco_flex_scanner.xml b/lib/megaco/doc/src/megaco_flex_scanner.xml
index 18c40bb71a..b79b6384df 100644
--- a/lib/megaco/doc/src/megaco_flex_scanner.xml
+++ b/lib/megaco/doc/src/megaco_flex_scanner.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2001</year><year>2009</year>
+ <year>2001</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
diff --git a/lib/megaco/doc/src/notes.xml b/lib/megaco/doc/src/notes.xml
index 81c9305542..4f678a2a1b 100644
--- a/lib/megaco/doc/src/notes.xml
+++ b/lib/megaco/doc/src/notes.xml
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="latin1" ?>
+<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE chapter SYSTEM "chapter.dtd">
<chapter>
<header>
<copyright>
- <year>2000</year><year>2010</year>
+ <year>2000</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -35,22 +35,90 @@
thus constitutes one section in this document. The title of each
section is the version number of Megaco.</p>
+
+ <section><title>Megaco 3.15.1</title>
+
+ <p>Version 3.15.1 supports code replacement in runtime from/to
+ version 3.15, 3.14.1.1, 3.14.1 and 3.14.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+
+ <p>-</p>
+
+<!--
+ <list type="bulleted">
+ <item>
+ <p>Updated the
+ <seealso marker="megaco_performance">performance</seealso>
+ chapter. </p>
+ <p>Own Id: OTP-8696</p>
+ </item>
+
+ </list>
+-->
+
+ </section>
+
+ <section>
+ <title>Fixed bugs and malfunctions</title>
+
+<!--
+ <p>-</p>
+-->
+
+ <list type="bulleted">
+ <item>
+ <p>Fixing miscellaneous things detected by dialyzer. </p>
+ <p>Own Id: OTP-9075</p>
+ <!-- <p>Aux Id: Seq 11579</p> -->
+ </item>
+
+ </list>
+
+ </section>
+
+ </section> <!-- 3.15.1 -->
+
+
<section><title>Megaco 3.15</title>
<section><title>Improvements and New Features</title>
- <list>
+
+<!--
+ <p>-</p>
+-->
+
+ <list type="bulleted">
+ <item>
+ <p>Fixing auto-import issues.</p>
+ <p>Own Id: OTP-8842</p>
+ </item>
+ </list>
+ </section>
+
+ <section>
+ <title>Fixed bugs and malfunctions</title>
+ <p>-</p>
+
+<!--
+ <list type="bulleted">
<item>
- <p>
- Fixing auto-import issues.</p>
- <p>
- Own Id: OTP-8842</p>
+ <p>Eliminated a possible race condition while creating
+ pending counters. </p>
+ <p>Own Id: OTP-8634</p>
+ <p>Aux Id: Seq 11579</p>
</item>
+
</list>
+-->
+
</section>
-</section>
+ </section> <!-- 3.15 -->
-<section>
+
+ <section>
<title>Megaco 3.14.1.1</title>
<p>Version 3.14.1.1 supports code replacement in runtime from/to
diff --git a/lib/megaco/src/app/megaco.app.src b/lib/megaco/src/app/megaco.app.src
index 503fcd7176..c0d8218ac8 100644
--- a/lib/megaco/src/app/megaco.app.src
+++ b/lib/megaco/src/app/megaco.app.src
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -67,6 +67,7 @@
megaco_compact_text_encoder_prev3c,
megaco_compact_text_encoder_v3,
megaco_config,
+ megaco_config_misc,
megaco_digit_map,
megaco_encoder,
megaco_edist_compress,
diff --git a/lib/megaco/src/app/megaco.appup.src b/lib/megaco/src/app/megaco.appup.src
index 66068f650f..01b070d79f 100644
--- a/lib/megaco/src/app/megaco.appup.src
+++ b/lib/megaco/src/app/megaco.appup.src
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -133,50 +133,34 @@
%% |
%% v
%% 3.15
+%% |
+%% v
+%% 3.15.1
%%
%%
{"%VSN%",
[
- {"3.14.1.1",
+ {"3.15",
[
- {load_module, megaco_binary_transformer_prev3a, soft_purge, soft_purge, []},
- {load_module, megaco_binary_transformer_prev3b, soft_purge, soft_purge, []},
- {load_module, megaco_binary_transformer_prev3c, soft_purge, soft_purge, []},
+ {load_module, megaco_flex_scanner, soft_purge, soft_purge, []},
{load_module, megaco_sdp, soft_purge, soft_purge, []},
- {load_module, megaco_compact_text_encoder_v1, soft_purge, soft_purge, []},
- {load_module, megaco_pretty_text_encoder_v1, soft_purge, soft_purge, []},
- {load_module, megaco_compact_text_encoder_v2, soft_purge, soft_purge, []},
- {load_module, megaco_pretty_text_encoder_v2, soft_purge, soft_purge, []},
- {load_module, megaco_compact_text_encoder_prev3a, soft_purge, soft_purge, []},
- {load_module, megaco_pretty_text_encoder_prev3a, soft_purge, soft_purge, []},
- {load_module, megaco_compact_text_encoder_prev3b, soft_purge, soft_purge, []},
- {load_module, megaco_pretty_text_encoder_prev3b, soft_purge, soft_purge, []},
- {load_module, megaco_compact_text_encoder_prev3c, soft_purge, soft_purge, []},
- {load_module, megaco_pretty_text_encoder_prev3c, soft_purge, soft_purge, []},
- {load_module, megaco_compact_text_encoder_v3, soft_purge, soft_purge, []},
- {load_module, megaco_pretty_text_encoder_v3, soft_purge, soft_purge, []}
+ {load_module, megaco_filter, soft_purge, soft_purge, []},
+ {load_module, megaco_timer, soft_purge, soft_purge, [megaco_config_misc]},
+ {update, megaco_config, soft, soft_purge, soft_purge,
+ [megaco_timer, megaco_config_misc]},
+ {add_module, megaco_config_misc}
]
}
],
[
- {"3.14.1.1",
+ {"3.15",
[
- {load_module, megaco_binary_transformer_prev3a, soft_purge, soft_purge, []},
- {load_module, megaco_binary_transformer_prev3b, soft_purge, soft_purge, []},
- {load_module, megaco_binary_transformer_prev3c, soft_purge, soft_purge, []},
+ {load_module, megaco_flex_scanner, soft_purge, soft_purge, []},
{load_module, megaco_sdp, soft_purge, soft_purge, []},
- {load_module, megaco_compact_text_encoder_v1, soft_purge, soft_purge, []},
- {load_module, megaco_pretty_text_encoder_v1, soft_purge, soft_purge, []},
- {load_module, megaco_compact_text_encoder_v2, soft_purge, soft_purge, []},
- {load_module, megaco_pretty_text_encoder_v2, soft_purge, soft_purge, []},
- {load_module, megaco_compact_text_encoder_prev3a, soft_purge, soft_purge, []},
- {load_module, megaco_pretty_text_encoder_prev3a, soft_purge, soft_purge, []},
- {load_module, megaco_compact_text_encoder_prev3b, soft_purge, soft_purge, []},
- {load_module, megaco_pretty_text_encoder_prev3b, soft_purge, soft_purge, []},
- {load_module, megaco_compact_text_encoder_prev3c, soft_purge, soft_purge, []},
- {load_module, megaco_pretty_text_encoder_prev3c, soft_purge, soft_purge, []},
- {load_module, megaco_compact_text_encoder_v3, soft_purge, soft_purge, []},
- {load_module, megaco_pretty_text_encoder_v3, soft_purge, soft_purge, []}
+ {load_module, megaco_filter, soft_purge, soft_purge, []},
+ {load_module, megaco_timer, soft_purge, soft_purge, [megaco_config]},
+ {update, megaco_config, soft, soft_purge, soft_purge, []},
+ {remove, {megaco_config_misc, soft_purge, brutal_purge}}
]
}
]
diff --git a/lib/megaco/src/binary/megaco_binary_encoder_lib.erl b/lib/megaco/src/binary/megaco_binary_encoder_lib.erl
index 842d6b70d1..967ee93935 100644
--- a/lib/megaco/src/binary/megaco_binary_encoder_lib.erl
+++ b/lib/megaco/src/binary/megaco_binary_encoder_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -134,6 +134,12 @@ encode_transaction(EC, {Tag, _} = Trans, AsnMod, TransMod, Type)
encode_transaction(_EC, T, _AsnMod, _TransMod, _Type) ->
{error, {no_megaco_transaction, T}}.
+-spec do_encode_transaction(EC :: list(),
+ Trans :: tuple(),
+ AnsMod :: atom(),
+ TransMod :: atom(),
+ Type :: atom()) ->
+ {'ok', binary()} | {'error', any()}.
do_encode_transaction([native], _Trans, _AsnMod, _TransMod, binary) ->
%% asn1rt:encode(AsnMod, element(1, T), T);
{error, not_implemented};
@@ -160,6 +166,12 @@ do_encode_transaction(EC, _Trans, _AsnMod, _TransMod, _Type) ->
%% Convert a list of ActionRequest record's into a binary
%% Return {ok, DeepIoList} | {error, Reason}
%%----------------------------------------------------------------------
+-spec encode_action_requests(EC :: list(),
+ ARs :: list(),
+ AnsMod :: atom(),
+ TransMod :: atom(),
+ Type :: atom()) ->
+ {'ok', binary()} | {'error', any()}.
encode_action_requests([native], _ARs, _AsnMod, _TransMod, binary) ->
%% asn1rt:encode(AsnMod, element(1, T), T);
{error, not_implemented};
@@ -183,13 +195,20 @@ encode_action_requests(EC, _ARs, _AsnMod, _TransMod, _Type) ->
%% Convert a ActionRequest record into a binary
%% Return {ok, DeepIoList} | {error, Reason}
%%----------------------------------------------------------------------
-encode_action_request([native], _ARs, _AsnMod, _TransMod, binary) ->
+
+-spec encode_action_request(EC :: list(),
+ AR :: tuple(),
+ AnsMod :: atom(),
+ TransMod :: atom(),
+ Type :: atom()) ->
+ {'ok', binary()} | {'error', any()}.
+encode_action_request([native], _AR, _AsnMod, _TransMod, binary) ->
%% asn1rt:encode(AsnMod, element(1, T), T);
{error, not_implemented};
-encode_action_request(_EC, _ARs0, _AsnMod, _TransMod, binary) ->
+encode_action_request(_EC, _AR, _AsnMod, _TransMod, binary) ->
{error, not_implemented};
-encode_action_request(EC, ARs, AsnMod, TransMod, io_list) ->
- case encode_action_request(EC, ARs, AsnMod, TransMod, binary) of
+encode_action_request(EC, AR, AsnMod, TransMod, io_list) ->
+ case encode_action_request(EC, AR, AsnMod, TransMod, binary) of
{ok, Bin} when is_binary(Bin) ->
{ok, Bin};
{ok, DeepIoList} ->
@@ -198,7 +217,7 @@ encode_action_request(EC, ARs, AsnMod, TransMod, io_list) ->
{error, Reason} ->
{error, Reason}
end;
-encode_action_request(EC, _ARs, _AsnMod, _TransMod, _Type) ->
+encode_action_request(EC, _AR, _AsnMod, _TransMod, _Type) ->
{error, {bad_encoding_config, EC}}.
diff --git a/lib/megaco/src/engine/depend.mk b/lib/megaco/src/engine/depend.mk
index 8d8c83e923..935eb813e5 100644
--- a/lib/megaco/src/engine/depend.mk
+++ b/lib/megaco/src/engine/depend.mk
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2003-2009. All Rights Reserved.
+# Copyright Ericsson AB 2003-2011. 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
@@ -17,6 +17,8 @@
#
# %CopyrightEnd%
+$(EBIN)/megaco_config_misc.$(EMULATOR): megaco_config_misc.erl
+
$(EBIN)/megaco_config.$(EMULATOR): megaco_config.erl \
../../include/megaco.hrl \
../app/megaco_internal.hrl
diff --git a/lib/megaco/src/engine/megaco_config.erl b/lib/megaco/src/engine/megaco_config.erl
index 6805db790d..b65ddbe232 100644
--- a/lib/megaco/src/engine/megaco_config.erl
+++ b/lib/megaco/src/engine/megaco_config.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -46,10 +46,10 @@
%% Verification functions
verify_val/2,
- verify_strict_uint/1,
- verify_strict_int/1, verify_strict_int/2,
- verify_uint/1,
- verify_int/1, verify_int/2,
+%% verify_strict_uint/1,
+%% verify_strict_int/1, verify_strict_int/2,
+%% verify_uint/1,
+%% verify_int/1, verify_int/2,
%% Reply limit counter
@@ -1501,28 +1501,37 @@ verify_val(Item, Val) ->
mid -> true;
local_mid -> true;
remote_mid -> true;
- min_trans_id -> verify_strict_uint(Val, 4294967295); % uint32
- max_trans_id -> verify_uint(Val, 4294967295); % uint32
+ min_trans_id ->
+ megaco_config_misc:verify_strict_uint(Val, 4294967295); % uint32
+ max_trans_id ->
+ megaco_config_misc:verify_uint(Val, 4294967295); % uint32
request_timer -> verify_timer(Val);
long_request_timer -> verify_timer(Val);
- auto_ack -> verify_bool(Val);
+ auto_ack ->
+ megaco_config_misc:verify_bool(Val);
- trans_ack -> verify_bool(Val);
- trans_ack_maxcount -> verify_uint(Val);
+ trans_ack ->
+ megaco_config_misc:verify_bool(Val);
+ trans_ack_maxcount ->
+ megaco_config_misc:verify_uint(Val);
- trans_req -> verify_bool(Val);
- trans_req_maxcount -> verify_uint(Val);
- trans_req_maxsize -> verify_uint(Val);
+ trans_req ->
+ megaco_config_misc:verify_bool(Val);
+ trans_req_maxcount ->
+ megaco_config_misc:verify_uint(Val);
+ trans_req_maxsize ->
+ megaco_config_misc:verify_uint(Val);
- trans_timer -> verify_timer(Val) and (Val >= 0);
- trans_sender when Val == undefined -> true;
+ trans_timer ->
+ verify_timer(Val) and (Val >= 0);
+ trans_sender when Val =:= undefined -> true;
pending_timer -> verify_timer(Val);
- sent_pending_limit -> verify_uint(Val) andalso
- (Val > 0);
- recv_pending_limit -> verify_uint(Val) andalso
- (Val > 0);
+ sent_pending_limit ->
+ megaco_config_misc:verify_uint(Val) andalso (Val > 0);
+ recv_pending_limit ->
+ megaco_config_misc:verify_uint(Val) andalso (Val > 0);
reply_timer -> verify_timer(Val);
control_pid when is_pid(Val) -> true;
monitor_ref -> true; % Internal usage only
@@ -1530,110 +1539,43 @@ verify_val(Item, Val) ->
send_handle -> true;
encoding_mod when is_atom(Val) -> true;
encoding_config when is_list(Val) -> true;
- protocol_version -> verify_strict_uint(Val);
+ protocol_version ->
+ megaco_config_misc:verify_strict_uint(Val);
auth_data -> true;
user_mod when is_atom(Val) -> true;
user_args when is_list(Val) -> true;
reply_data -> true;
- threaded -> verify_bool(Val);
- strict_version -> verify_bool(Val);
- long_request_resend -> verify_bool(Val);
- call_proxy_gc_timeout -> verify_strict_uint(Val);
- cancel -> verify_bool(Val);
+ threaded ->
+ megaco_config_misc:verify_bool(Val);
+ strict_version ->
+ megaco_config_misc:verify_bool(Val);
+ long_request_resend ->
+ megaco_config_misc:verify_bool(Val);
+ call_proxy_gc_timeout ->
+ megaco_config_misc:verify_strict_uint(Val);
+ cancel ->
+ megaco_config_misc:verify_bool(Val);
resend_indication -> verify_resend_indication(Val);
- segment_reply_ind -> verify_bool(Val);
- segment_recv_acc -> verify_bool(Val);
+ segment_reply_ind ->
+ megaco_config_misc:verify_bool(Val);
+ segment_recv_acc ->
+ megaco_config_misc:verify_bool(Val);
segment_recv_timer -> verify_timer(Val);
segment_send -> verify_segmentation_window(Val);
segment_send_timer -> verify_timer(Val);
- max_pdu_size -> verify_int(Val) andalso (Val > 0);
+ max_pdu_size ->
+ megaco_config_misc:verify_int(Val) andalso (Val > 0);
request_keep_alive_timeout ->
- (verify_uint(Val) orelse (Val =:= plain));
+ (megaco_config_misc:verify_uint(Val) orelse (Val =:= plain));
_ -> false
end.
-verify_bool(true) -> true;
-verify_bool(false) -> true;
-verify_bool(_) -> false.
-
verify_resend_indication(flag) -> true;
-verify_resend_indication(Val) -> verify_bool(Val).
-
--spec verify_strict_int(Int :: integer()) -> boolean().
-verify_strict_int(Int) when is_integer(Int) -> true;
-verify_strict_int(_) -> false.
-
--spec verify_strict_int(Int :: integer(),
- Max :: integer() | 'infinity') -> boolean().
-verify_strict_int(Int, infinity) ->
- verify_strict_int(Int);
-verify_strict_int(Int, Max) ->
- verify_strict_int(Int) andalso verify_strict_int(Max) andalso (Int =< Max).
-
--spec verify_strict_uint(Int :: non_neg_integer()) -> boolean().
-verify_strict_uint(Int) when is_integer(Int) andalso (Int >= 0) -> true;
-verify_strict_uint(_) -> false.
-
--spec verify_strict_uint(Int :: non_neg_integer(),
- Max :: non_neg_integer() | 'infinity') -> boolean().
-verify_strict_uint(Int, infinity) ->
- verify_strict_uint(Int);
-verify_strict_uint(Int, Max) ->
- verify_strict_int(Int, 0, Max).
-
--spec verify_uint(Val :: non_neg_integer() | 'infinity') -> boolean().
-verify_uint(infinity) -> true;
-verify_uint(Val) -> verify_strict_uint(Val).
-
--spec verify_int(Val :: integer() | 'infinity') -> boolean().
-verify_int(infinity) -> true;
-verify_int(Val) -> verify_strict_int(Val).
-
--spec verify_int(Int :: integer() | 'infinity',
- Max :: integer() | 'infinity') -> boolean().
-verify_int(Int, infinity) ->
- verify_int(Int);
-verify_int(infinity, _Max) ->
- true;
-verify_int(Int, Max) ->
- verify_strict_int(Int) andalso verify_strict_int(Max) andalso (Int =< Max).
-
--spec verify_uint(Int :: non_neg_integer() | 'infinity',
- Max :: non_neg_integer() | 'infinity') -> boolean().
-verify_uint(Int, infinity) ->
- verify_uint(Int);
-verify_uint(infinity, _Max) ->
- true;
-verify_uint(Int, Max) ->
- verify_strict_int(Int, 0, Max).
-
--spec verify_strict_int(Int :: integer(),
- Min :: integer(),
- Max :: integer()) -> boolean().
-verify_strict_int(Val, Min, Max)
- when (is_integer(Val) andalso
- is_integer(Min) andalso
- is_integer(Max) andalso
- (Val >= Min) andalso
- (Val =< Max)) ->
- true;
-verify_strict_int(_Val, _Min, _Max) ->
- false.
-
--spec verify_int(Val :: integer() | 'infinity',
- Min :: integer(),
- Max :: integer() | 'infinity') -> boolean().
-verify_int(infinity, Min, infinity) ->
- verify_strict_int(Min);
-verify_int(Val, Min, infinity) ->
- verify_strict_int(Val) andalso
- verify_strict_int(Min) andalso (Val >= Min);
-verify_int(Int, Min, Max) ->
- verify_strict_int(Int, Min, Max).
+verify_resend_indication(Val) -> megaco_config_misc:verify_bool(Val).
verify_timer(Timer) ->
megaco_timer:verify(Timer).
@@ -1641,7 +1583,7 @@ verify_timer(Timer) ->
verify_segmentation_window(none) ->
true;
verify_segmentation_window(K) ->
- verify_int(K, 1, infinity).
+ megaco_config_misc:verify_int(K, 1, infinity).
handle_stop_user(UserMid) ->
case catch user_info(UserMid, mid) of
diff --git a/lib/megaco/src/engine/megaco_config_misc.erl b/lib/megaco/src/engine/megaco_config_misc.erl
new file mode 100644
index 0000000000..0a1601c766
--- /dev/null
+++ b/lib/megaco/src/engine/megaco_config_misc.erl
@@ -0,0 +1,113 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2011-2011. 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%
+%%
+
+%%
+%%----------------------------------------------------------------------
+%% Purpose: Utility module for megaco_config
+%%----------------------------------------------------------------------
+%%
+
+-module(megaco_config_misc).
+
+%% Application internal exports
+-export([
+ verify_bool/1,
+
+ verify_int/1, verify_int/2, verify_int/3,
+ verify_strict_int/1, verify_strict_int/2, verify_strict_int/3,
+
+ verify_uint/1, verify_uint/2,
+ verify_strict_uint/1, verify_strict_uint/2
+ ]).
+
+
+%%%----------------------------------------------------------------------
+%%% API
+%%%----------------------------------------------------------------------
+
+verify_bool(true) -> true;
+verify_bool(false) -> true;
+verify_bool(_) -> false.
+
+
+%% verify_int(Val) -> boolean()
+verify_int(infinity) -> true;
+verify_int(Val) -> verify_strict_int(Val).
+
+%% verify_int(Val, Max) -> boolean()
+verify_int(Int, infinity) ->
+ verify_int(Int);
+verify_int(infinity, _Max) ->
+ true;
+verify_int(Int, Max) ->
+ verify_strict_int(Int) andalso verify_strict_int(Max) andalso (Int =< Max).
+
+%% verify_int(Val, Min, Max) -> boolean()
+verify_int(infinity, Min, infinity) ->
+ verify_strict_int(Min);
+verify_int(Val, Min, infinity) ->
+ verify_strict_int(Val) andalso
+ verify_strict_int(Min) andalso (Val >= Min);
+verify_int(Int, Min, Max) ->
+ verify_strict_int(Int, Min, Max).
+
+%% verify_strict_int(Val) -> boolean()
+verify_strict_int(Int) when is_integer(Int) -> true;
+verify_strict_int(_) -> false.
+
+%% verify_strict_int(Val, Max) -> boolean()
+verify_strict_int(Int, infinity) ->
+ verify_strict_int(Int);
+verify_strict_int(Int, Max) ->
+ verify_strict_int(Int) andalso verify_strict_int(Max) andalso (Int =< Max).
+
+%% verify_strict_int(Val, Min, Max) -> boolean()
+verify_strict_int(Val, Min, Max)
+ when (is_integer(Val) andalso
+ is_integer(Min) andalso
+ is_integer(Max) andalso
+ (Val >= Min) andalso
+ (Val =< Max)) ->
+ true;
+verify_strict_int(_Val, _Min, _Max) ->
+ false.
+
+
+%% verify_uint(Val) -> boolean()
+verify_uint(infinity) -> true;
+verify_uint(Val) -> verify_strict_uint(Val).
+
+%% verify_uint(Val, Max) -> boolean()
+verify_uint(Int, infinity) ->
+ verify_uint(Int);
+verify_uint(infinity, _Max) ->
+ true;
+verify_uint(Int, Max) ->
+ verify_strict_int(Int, 0, Max).
+
+%% verify_strict_uint(Val) -> boolean()
+verify_strict_uint(Int) when is_integer(Int) andalso (Int >= 0) -> true;
+verify_strict_uint(_) -> false.
+
+%% verify_strict_uint(Val, Max) -> boolean()
+verify_strict_uint(Int, infinity) ->
+ verify_strict_uint(Int);
+verify_strict_uint(Int, Max) ->
+ verify_strict_int(Int, 0, Max).
+
diff --git a/lib/megaco/src/engine/megaco_filter.erl b/lib/megaco/src/engine/megaco_filter.erl
index 9df752789c..fb0c700a82 100644
--- a/lib/megaco/src/engine/megaco_filter.erl
+++ b/lib/megaco/src/engine/megaco_filter.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -21,6 +21,7 @@
%%----------------------------------------------------------------------
%% Purpose : Megaco/H.248 customization of the Event Tracer tool
%%----------------------------------------------------------------------
+%%
-module(megaco_filter).
@@ -33,6 +34,7 @@
-include_lib("megaco/src/app/megaco_internal.hrl").
-include_lib("et/include/et.hrl").
+
%%----------------------------------------------------------------------
%% BUGBUG: There are some opportunities for improvements:
%%
@@ -43,7 +45,8 @@
%% records that already are defined in megaco_message_{v1,v2,v3}.hrl.
%% * The records megaco_udp and megaco_tcp are copied from the files
%% megaco_udp.hrl and megaco_tcp.hrl respectively, as we cannot include
-%% both header files. They both defines the macros HEAP_SIZE and GC_MSG_LIMIT.
+%% both header files.
+%% They both defines the macros HEAP_SIZE and GC_MSG_LIMIT.
%%-include("megaco_message_internal.hrl").
-record('megaco_transaction_reply',
@@ -76,6 +79,8 @@
module = megaco,
serialize = false % false: Spawn a new process for each message
}).
+
+
%%----------------------------------------------------------------------
start() ->
@@ -360,28 +365,24 @@ pretty(_ConnData, MegaMsg) when is_record(MegaMsg, 'MegacoMessage') ->
{ok, Bin} = megaco_pretty_text_encoder:encode_message([], MegaMsg),
term_to_string(Bin);
pretty(_ConnData, CmdReq) when is_record(CmdReq, 'CommandRequest') ->
- {ok, IoList} = megaco_pretty_text_encoder:encode_command_request(CmdReq),
- term_to_string(lists:flatten(IoList));
+ {ok, Bin} = megaco_pretty_text_encoder:encode_command_request(CmdReq),
+ term_to_string(Bin);
pretty(_ConnData, {complete_success, ContextId, RepList}) ->
ActRep = #'ActionReply'{contextId = ContextId,
commandReply = RepList},
- {ok, IoList} = megaco_pretty_text_encoder:encode_action_reply(ActRep),
- term_to_string(lists:flatten(IoList));
+ {ok, Bin} = megaco_pretty_text_encoder:encode_action_reply(ActRep),
+ term_to_string(Bin);
pretty(_ConnData, AR) when is_record(AR, 'ActionReply') ->
- {ok, IoList} = megaco_pretty_text_encoder:encode_action_reply(AR),
- term_to_string(lists:flatten(IoList));
+ {ok, Bin} = megaco_pretty_text_encoder:encode_action_reply(AR),
+ term_to_string(Bin);
pretty(_ConnData, {partial_failure, ContextId, RepList}) ->
ActRep = #'ActionReply'{contextId = ContextId,
commandReply = RepList},
- {ok, IoList} = megaco_pretty_text_encoder:encode_action_reply(ActRep),
- term_to_string(lists:flatten(IoList));
+ {ok, Bin} = megaco_pretty_text_encoder:encode_action_reply(ActRep),
+ term_to_string(Bin);
pretty(_ConnData, {trans, Trans}) ->
- case megaco_pretty_text_encoder:encode_transaction(Trans) of
- {ok, Bin} when is_binary(Bin) ->
- term_to_string(binary_to_list(Bin));
- {ok, IoList} ->
- term_to_string(lists:flatten(IoList))
- end;
+ {ok, Bin} = megaco_pretty_text_encoder:encode_transaction(Trans),
+ term_to_string(Bin);
pretty(__ConnData, Other) ->
term_to_string(Other).
diff --git a/lib/megaco/src/engine/megaco_sdp.erl b/lib/megaco/src/engine/megaco_sdp.erl
index 37f28cac59..96732584fb 100644
--- a/lib/megaco/src/engine/megaco_sdp.erl
+++ b/lib/megaco/src/engine/megaco_sdp.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -877,9 +877,7 @@ decode_bandwidth_bwt("CT") ->
decode_bandwidth_bwt("AS") ->
as;
decode_bandwidth_bwt(BwType) when is_list(BwType) ->
- BwType;
-decode_bandwidth_bwt(BadBwType) ->
- error({invalid_bandwidth_bwtype, BadBwType}).
+ BwType.
encode_bandwidth_bwt(ct) ->
"CT";
diff --git a/lib/megaco/src/engine/megaco_timer.erl b/lib/megaco/src/engine/megaco_timer.erl
index 9f524523a8..1336be0b5b 100644
--- a/lib/megaco/src/engine/megaco_timer.erl
+++ b/lib/megaco/src/engine/megaco_timer.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -42,7 +42,7 @@
%% NewTimer = megaco_timer()
%% TimeoutTime = infinity | integer()
%%
-init(SingleWaitFor) when SingleWaitFor == infinity ->
+init(SingleWaitFor) when SingleWaitFor =:= infinity ->
{SingleWaitFor, timeout};
init(SingleWaitFor) when is_integer(SingleWaitFor) and (SingleWaitFor >= 0) ->
{SingleWaitFor, timeout};
@@ -76,17 +76,17 @@ verify(#megaco_incr_timer{wait_for = WaitFor,
factor = Factor,
incr = Incr,
max_retries = MaxRetries}) ->
- (megaco_config:verify_strict_uint(WaitFor) and
- megaco_config:verify_strict_uint(Factor) and
- megaco_config:verify_strict_int(Incr) and
+ (megaco_config_misc:verify_strict_uint(WaitFor) and
+ megaco_config_misc:verify_strict_uint(Factor) and
+ megaco_config_misc:verify_strict_int(Incr) and
verify_max_retries(MaxRetries));
verify(Timer) ->
- megaco_config:verify_uint(Timer).
+ megaco_config_misc:verify_uint(Timer).
verify_max_retries(infinity_restartable) ->
true;
verify_max_retries(Val) ->
- megaco_config:verify_uint(Val).
+ megaco_config_misc:verify_uint(Val).
%%-----------------------------------------------------------------
diff --git a/lib/megaco/src/engine/modules.mk b/lib/megaco/src/engine/modules.mk
index 44bcadc37b..4bc57cd63e 100644
--- a/lib/megaco/src/engine/modules.mk
+++ b/lib/megaco/src/engine/modules.mk
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2001-2009. All Rights Reserved.
+# Copyright Ericsson AB 2001-2011. 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
@@ -24,6 +24,7 @@ BEHAVIOUR_MODULES = \
MODULES = \
$(BEHAVIOUR_MODULES) \
+ megaco_config_misc \
megaco_config \
megaco_digit_map \
megaco_erl_dist_encoder \
diff --git a/lib/megaco/src/flex/megaco_flex_scanner.erl b/lib/megaco/src/flex/megaco_flex_scanner.erl
index e471412c13..508f8905e7 100644
--- a/lib/megaco/src/flex/megaco_flex_scanner.erl
+++ b/lib/megaco/src/flex/megaco_flex_scanner.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -30,21 +30,11 @@
-define(SCHED_ID(), erlang:system_info(scheduler_id)).
-define(SMP_SUPPORT_DEFAULT(), erlang:system_info(smp_support)).
-is_enabled() ->
- case ?ENABLE_MEGACO_FLEX_SCANNER of
- true ->
- true;
- _ ->
- false
- end.
+is_enabled() ->
+ (true =:= ?ENABLE_MEGACO_FLEX_SCANNER).
is_reentrant_enabled() ->
- case ?MEGACO_REENTRANT_FLEX_SCANNER of
- true ->
- true;
- _ ->
- false
- end.
+ (true =:= ?MEGACO_REENTRANT_FLEX_SCANNER).
is_scanner_port(Port, Port) when is_port(Port) ->
true;
diff --git a/lib/megaco/test/Makefile b/lib/megaco/test/Makefile
index 682b83d368..88f6f06e73 100644
--- a/lib/megaco/test/Makefile
+++ b/lib/megaco/test/Makefile
@@ -754,5 +754,5 @@ release_tests_spec: tests
# $(HRL_FILES) $(ERL_FILES) \
# $(RELSYSDIR)
#
- chmod -f -R u+w $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
diff --git a/lib/megaco/test/megaco.cover b/lib/megaco/test/megaco.cover
index e7764017d4..be21216c24 100644
--- a/lib/megaco/test/megaco.cover
+++ b/lib/megaco/test/megaco.cover
@@ -1,5 +1,7 @@
+{incl_app,megaco,details}.
+
%% -*- erlang -*-
-{exclude,
+{excl_mods, megaco,
[megaco_encoder,
megaco_edist_compress,
megaco_filter,
diff --git a/lib/megaco/test/megaco.spec b/lib/megaco/test/megaco.spec
index 7493bd5df8..cab8499835 100644
--- a/lib/megaco/test/megaco.spec
+++ b/lib/megaco/test/megaco.spec
@@ -1,5 +1,2 @@
-{topcase, {dir, "../megaco_test"}}.
-{require_nodenames, 1}.
-%{skip, {megaco_digit_map_test, all, "Not yet implemented"}}.
-{skip, {megaco_measure_test, all, "Not yet implemented"}}.
-%{skip, {M, F, "Not yet implemented"}}.
+{suites,"../megaco_test",all}.
+{skip_cases,"../megaco_test",megaco_measure_test,[all],"Not yet implemented"}.
diff --git a/lib/megaco/test/megaco_SUITE.erl b/lib/megaco/test/megaco_SUITE.erl
index 1bb3a570a4..007677ba4d 100644
--- a/lib/megaco/test/megaco_SUITE.erl
+++ b/lib/megaco/test/megaco_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -36,8 +36,8 @@ t(Case) -> megaco_test_lib:t({?MODULE, Case}).
init_per_testcase(Case, Config) ->
megaco_test_lib:init_per_testcase(Case, Config).
-fin_per_testcase(Case, Config) ->
- megaco_test_lib:fin_per_testcase(Case, Config).
+end_per_testcase(Case, Config) ->
+ megaco_test_lib:end_per_testcase(Case, Config).
init() ->
process_flag(trap_exit, true),
@@ -46,97 +46,86 @@ init() ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Top test case
-all(suite) ->
- [
- app_test,
- appup_test,
- config,
- flex,
- udp,
- tcp,
- examples,
- %% call_flow,
- digit_map,
- mess,
- measure,
- binary_term_id,
- codec,
- sdp,
- mib,
- trans,
- actions,
- load,
- pending_limit,
- segmented,
- timer
- ].
+suite() -> [{ct_hooks, [{ts_install_cth, [{nodenames,1}]}]}].
+
+all() ->
+ [{group, app_test},
+ {group, appup_test},
+ {group, config},
+ {group, flex},
+ {group, udp},
+ {group, tcp},
+ {group, examples},
+ {group, digit_map},
+ {group, mess},
+ {group, measure},
+ {group, binary_term_id},
+ {group, codec},
+ {group, sdp},
+ {group, mib},
+ {group, trans},
+ {group, actions},
+ {group, load},
+ {group, pending_limit},
+ {group, segmented},
+ {group, timer}].
+
+groups() ->
+ [{tickets, [], [{group, mess}, {group, codec}]},
+ {app_test, [], [{megaco_app_test, all}]},
+ {appup_test, [], [{megaco_appup_test, all}]},
+ {config, [], [{megaco_config_test, all}]},
+ {call_flow, [], [{megaco_call_flow_test, all}]},
+ {digit_map, [], [{megaco_digit_map_test, all}]},
+ {mess, [], [{megaco_mess_test, all}]},
+ {udp, [], [{megaco_udp_test, all}]},
+ {tcp, [], [{megaco_tcp_test, all}]},
+ {examples, [], [{megaco_examples_test, all}]},
+ {measure, [], [{megaco_measure_test, all}]},
+ {binary_term_id, [], [{megaco_binary_term_id_test, all}]},
+ {codec, [], [{megaco_codec_test, all}]},
+ {sdp, [], [{megaco_sdp_test, all}]},
+ {mib, [], [{megaco_mib_test, all}]},
+ {trans, [], [{megaco_trans_test, all}]},
+ {actions, [], [{megaco_actions_test, all}]},
+ {load, [], [{megaco_load_test, all}]},
+ {pending_limit, [], [{megaco_pending_limit_test, all}]},
+ {segmented, [], [{megaco_segment_test, all}]},
+ {timer, [], [{megaco_timer_test, all}]},
+ {flex, [], [{megaco_flex_test, all}]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
-tickets(suite) ->
- [
- mess,
- codec
- ].
-app_test(suite) ->
- [{megaco_app_test, all}].
-appup_test(suite) ->
- [{megaco_appup_test, all}].
-config(suite) ->
- [{megaco_config_test, all}].
-call_flow(suite) ->
- [{megaco_call_flow_test, all}].
-digit_map(suite) ->
- [{megaco_digit_map_test, all}].
-mess(suite) ->
- [{megaco_mess_test, all}].
-udp(suite) ->
- [{megaco_udp_test, all}].
-tcp(suite) ->
- [{megaco_tcp_test, all}].
-examples(suite) ->
- [{megaco_examples_test, all}].
-measure(suite) ->
- [{megaco_measure_test, all}].
-binary_term_id(suite) ->
- [{megaco_binary_term_id_test, all}].
-codec(suite) ->
- [{megaco_codec_test, all}].
-sdp(suite) ->
- [{megaco_sdp_test, all}].
-mib(suite) ->
- [{megaco_mib_test, all}].
-trans(suite) ->
- [{megaco_trans_test, all}].
-actions(suite) ->
- [{megaco_actions_test, all}].
-load(suite) ->
- [{megaco_load_test, all}].
-pending_limit(suite) ->
- [{megaco_pending_limit_test, all}].
-segmented(suite) ->
- [{megaco_segment_test, all}].
-timer(suite) ->
- [{megaco_timer_test, all}].
-flex(suite) ->
- [{megaco_flex_test, all}].
diff --git a/lib/megaco/test/megaco_actions_test.erl b/lib/megaco/test/megaco_actions_test.erl
index d493022ca1..2efb6e834a 100644
--- a/lib/megaco/test/megaco_actions_test.erl
+++ b/lib/megaco/test/megaco_actions_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2010. 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
@@ -72,28 +72,25 @@ init_per_testcase(Case, Config) ->
process_flag(trap_exit, true),
megaco_test_lib:init_per_testcase(Case, Config).
-fin_per_testcase(Case, Config) ->
+end_per_testcase(Case, Config) ->
process_flag(trap_exit, false),
- megaco_test_lib:fin_per_testcase(Case, Config).
+ megaco_test_lib:end_per_testcase(Case, Config).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) ->
- Cases =
- [
- pretty_text,
- flex_pretty_text,
- compact_text,
- flex_compact_text,
- erl_dist,
- erl_dist_mc,
- ber_bin,
- ber_bin_drv,
- ber_bin_native,
- ber_bin_drv_native
- ],
- Cases.
+all() ->
+ [pretty_text, flex_pretty_text, compact_text,
+ flex_compact_text, erl_dist, erl_dist_mc, ber_bin,
+ ber_bin_drv, ber_bin_native, ber_bin_drv_native].
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/megaco/test/megaco_app_test.erl b/lib/megaco/test/megaco_app_test.erl
index 597ec26338..00f7b7fb68 100644
--- a/lib/megaco/test/megaco_app_test.erl
+++ b/lib/megaco/test/megaco_app_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
@@ -39,28 +39,36 @@ init_per_testcase(undef_funcs = Case, Config) ->
init_per_testcase(Case, Config) ->
megaco_test_lib:init_per_testcase(Case, Config).
-fin_per_testcase(Case, Config) ->
- megaco_test_lib:fin_per_testcase(Case, Config).
+end_per_testcase(Case, Config) ->
+ megaco_test_lib:end_per_testcase(Case, Config).
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) ->
- Cases =
- [
- fields,
- modules,
- exportall,
- app_depend,
- undef_funcs
- ],
- {req, [], {conf, app_init, Cases, app_fin}}.
+all() ->
+ [
+ fields,
+ modules,
+ exportall,
+ app_depend,
+ undef_funcs
+ ].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-app_init(suite) -> [];
-app_init(doc) -> [];
-app_init(Config) when is_list(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]),
@@ -96,9 +104,9 @@ is_app(App) ->
end.
-app_fin(suite) -> [];
-app_fin(doc) -> [];
-app_fin(Config) when is_list(Config) ->
+end_per_suite(suite) -> [];
+end_per_suite(doc) -> [];
+end_per_suite(Config) when is_list(Config) ->
Config.
@@ -110,7 +118,7 @@ fields(doc) ->
[];
fields(Config) when is_list(Config) ->
AppFile = key1search(app_file, Config),
- Fields = [vsn, description, modules, registered, applications],
+ Fields = [vsn, description, modules, registered, applications],
case check_fields(Fields, AppFile, []) of
[] ->
ok;
diff --git a/lib/megaco/test/megaco_appup_mg.erl b/lib/megaco/test/megaco_appup_mg.erl
index f6060e406b..bb8b098f5d 100644
--- a/lib/megaco/test/megaco_appup_mg.erl
+++ b/lib/megaco/test/megaco_appup_mg.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2010. 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
diff --git a/lib/megaco/test/megaco_appup_mgc.erl b/lib/megaco/test/megaco_appup_mgc.erl
index b6e53655f8..49c5f24852 100644
--- a/lib/megaco/test/megaco_appup_mgc.erl
+++ b/lib/megaco/test/megaco_appup_mgc.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2010. 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
diff --git a/lib/megaco/test/megaco_appup_test.erl b/lib/megaco/test/megaco_appup_test.erl
index 09732c6a4d..40eebcae86 100644
--- a/lib/megaco/test/megaco_appup_test.erl
+++ b/lib/megaco/test/megaco_appup_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
@@ -24,6 +24,7 @@
-module(megaco_appup_test).
-compile(export_all).
+-compile({no_auto_import,[error/1]}).
-include("megaco_test_lib.hrl").
@@ -37,25 +38,31 @@ t(Case) -> megaco_test_lib:t({?MODULE, Case}).
init_per_testcase(Case, Config) ->
megaco_test_lib:init_per_testcase(Case, Config).
-fin_per_testcase(Case, Config) ->
- megaco_test_lib:fin_per_testcase(Case, Config).
+end_per_testcase(Case, Config) ->
+ megaco_test_lib:end_per_testcase(Case, Config).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) ->
- Cases =
- [
- appup
- ],
- {req, [], {conf, appup_init, Cases, appup_fin}}.
+all() ->
+ [appup].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-appup_init(suite) -> [];
-appup_init(doc) -> [];
-appup_init(Config) when is_list(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].
@@ -66,9 +73,9 @@ file_name(App, Ext) ->
filename:join([LibDir, "ebin", atom_to_list(App) ++ Ext]).
-appup_fin(suite) -> [];
-appup_fin(doc) -> [];
-appup_fin(Config) when is_list(Config) ->
+end_per_suite(suite) -> [];
+end_per_suite(doc) -> [];
+end_per_suite(Config) when is_list(Config) ->
Config.
diff --git a/lib/megaco/test/megaco_binary_term_id_test.erl b/lib/megaco/test/megaco_binary_term_id_test.erl
index da4e69c617..47a7a76c1c 100644
--- a/lib/megaco/test/megaco_binary_term_id_test.erl
+++ b/lib/megaco/test/megaco_binary_term_id_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2010. 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
@@ -37,8 +37,8 @@
-export([t/0]).
%% Test suite exports
--export([all/1, encode_first/1, decode_first/1,
- init_per_testcase/2, fin_per_testcase/2]).
+-export([all/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_testcase/2, end_per_testcase/2]).
%%----------------------------------------------------------------------
@@ -57,25 +57,25 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Top test case
-all(suite) ->
- [
- encode_first,
- decode_first
- ].
+all() ->
+ [{group, encode_first}, {group, decode_first}].
-encode_first(suite) ->
- encode_first_cases().
+groups() ->
+ [{encode_first, [], encode_first_cases()},
+ {decode_first, [], decode_first_cases()}].
-decode_first(suite) ->
- decode_first_cases().
+init_per_group(_GroupName, Config) ->
+ Config.
+end_per_group(_GroupName, Config) ->
+ Config.
%% Test server callbacks
init_per_testcase(Case, Config) ->
megaco_test_lib:init_per_testcase(Case, Config).
-fin_per_testcase(Case, Config) ->
- megaco_test_lib:fin_per_testcase(Case, Config).
+end_per_testcase(Case, Config) ->
+ megaco_test_lib:end_per_testcase(Case, Config).
%%======================================================================
@@ -89,11 +89,12 @@ t() ->
cases() -> encode_first_cases() ++ decode_first_cases().
-encode_first_cases() -> [te01,te02,te03,te04,te05,
- te06,te07,te08,te09,te10,
- te11,te12,te13,te14,te15,
- te16,te17,te18,te19].
-decode_first_cases() -> [td01,td02,td03,td04,td05,td06].
+encode_first_cases() ->
+[te01, te02, te03, te04, te05, te06, te07, te08, te09,
+ te10, te11, te12, te13, te14, te15, te16, te17, te18,
+ te19].
+decode_first_cases() ->
+[td01, td02, td03, td04, td05, td06].
do(Case) ->
case doc(Case) of
diff --git a/lib/megaco/test/megaco_call_flow_test.erl b/lib/megaco/test/megaco_call_flow_test.erl
index a25a7924e8..b9d64ca8b2 100644
--- a/lib/megaco/test/megaco_call_flow_test.erl
+++ b/lib/megaco/test/megaco_call_flow_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2010. 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
@@ -50,37 +50,25 @@ t(Case) -> megaco_test_lib:t({?MODULE, Case}).
init_per_testcase(Case, Config) ->
megaco_test_lib:init_per_testcase(Case, Config).
-fin_per_testcase(Case, Config) ->
- megaco_test_lib:fin_per_testcase(Case, Config).
+end_per_testcase(Case, Config) ->
+ megaco_test_lib:end_per_testcase(Case, Config).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Top test case
-all(suite) ->
- [
- text,
- binary
- ].
+all() ->
+ [{group, text}, {group, binary}].
-text(suite) ->
- [
- pretty,
- compact
- ].
+groups() ->
+ [{text, [], [pretty, compact]},
+ {flex, [], [pretty_flex, compact_flex]},
+ {binary, [], [bin, ber, ber_bin, per]}].
-flex(suite) ->
- [
- pretty_flex,
- compact_flex
- ].
+init_per_group(_GroupName, Config) ->
+ Config.
-binary(suite) ->
- [
- bin,
- ber,
- ber_bin,
- per
- ].
+end_per_group(_GroupName, Config) ->
+ Config.
pretty(suite) ->
[];
diff --git a/lib/megaco/test/megaco_codec_flex_lib.erl b/lib/megaco/test/megaco_codec_flex_lib.erl
index de76956711..93bc5d4bbc 100644
--- a/lib/megaco/test/megaco_codec_flex_lib.erl
+++ b/lib/megaco/test/megaco_codec_flex_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2010. 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
diff --git a/lib/megaco/test/megaco_codec_mini_test.erl b/lib/megaco/test/megaco_codec_mini_test.erl
index e509739bb1..ff0c154c7c 100644
--- a/lib/megaco/test/megaco_codec_mini_test.erl
+++ b/lib/megaco/test/megaco_codec_mini_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2010. 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
@@ -34,14 +34,14 @@
-export([t/0, t/1]).
--export([all/1,
+-export([all/0,groups/0,init_per_group/2,end_per_group/2,
tickets/0,
- tickets/1,
+
otp7672_msg01/1,
otp7672_msg02/1,
- init_per_testcase/2, fin_per_testcase/2]).
+ init_per_testcase/2, end_per_testcase/2]).
%% ----
@@ -49,31 +49,6 @@
-define(SET_DBG(S,D), begin put(severity, S), put(dbg, D) end).
-define(RESET_DBG(), begin erase(severity), erase(dbg) end).
-
-%% ----
-
-tickets() ->
- Flag = process_flag(trap_exit, true),
- Cases = expand(tickets),
- Fun = fun(Case) ->
- C = init_per_testcase(Case, [{tc_timeout,
- timer:minutes(10)}]),
- io:format("Eval ~w~n", [Case]),
- Result =
- case (catch apply(?MODULE, Case, [C])) of
- {'EXIT', Reason} ->
- io:format("~n~p exited:~n ~p~n",
- [Case, Reason]),
- {error, {Case, Reason}};
- Res ->
- Res
- end,
- fin_per_testcase(Case, C),
- Result
- end,
- process_flag(trap_exit, Flag),
- lists:map(Fun, Cases).
-
expand(RootCase) ->
expand([RootCase], []).
@@ -106,24 +81,51 @@ init_per_testcase(Case, Config) ->
end,
megaco_test_lib:init_per_testcase(Case, C).
-fin_per_testcase(Case, Config) ->
+end_per_testcase(Case, Config) ->
erase(verbosity),
- megaco_test_lib:fin_per_testcase(Case, Config).
+ megaco_test_lib:end_per_testcase(Case, Config).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Top test case
-all(suite) ->
- [
- tickets
- ].
+all() ->
+ [{group, tickets}].
+
+groups() ->
+ [{tickets, [], [otp7672_msg01, otp7672_msg02]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
-tickets(suite) ->
- [
- otp7672_msg01,
- otp7672_msg02
- ].
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+
+%% ----
+
+tickets() ->
+ Flag = process_flag(trap_exit, true),
+ Cases = expand(tickets),
+ Fun = fun(Case) ->
+ C = init_per_testcase(Case, [{tc_timeout,
+ timer:minutes(10)}]),
+ io:format("Eval ~w~n", [Case]),
+ Result =
+ case (catch apply(?MODULE, Case, [C])) of
+ {'EXIT', Reason} ->
+ io:format("~n~p exited:~n ~p~n",
+ [Case, Reason]),
+ {error, {Case, Reason}};
+ Res ->
+ Res
+ end,
+ end_per_testcase(Case, C),
+ Result
+ end,
+ process_flag(trap_exit, Flag),
+ lists:map(Fun, Cases).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/megaco/test/megaco_codec_prev3a_test.erl b/lib/megaco/test/megaco_codec_prev3a_test.erl
index 696a72343c..d50e72aef1 100644
--- a/lib/megaco/test/megaco_codec_prev3a_test.erl
+++ b/lib/megaco/test/megaco_codec_prev3a_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
@@ -36,22 +36,16 @@
-export([t/0, t/1]).
--export([all/1,
+-export([all/0,groups/0,init_per_group/2,end_per_group/2,
- text/1,
-
- pretty/1,
pretty_test_msgs/1,
-
- compact/1,
+
compact_test_msgs/1,
-
- flex_pretty/1,
+
flex_pretty_init/1,
flex_pretty_finish/1,
flex_pretty_test_msgs/1,
-
- flex_compact/1,
+
flex_compact_init/1,
flex_compact_finish/1,
flex_compact_test_msgs/1,
@@ -64,32 +58,21 @@
flex_compact_dm_timers6/1,
flex_compact_dm_timers7/1,
flex_compact_dm_timers8/1,
-
- binary/1,
- bin/1,
bin_test_msgs/1,
-
- ber/1,
+
ber_test_msgs/1,
-
- ber_bin/1,
+
ber_bin_test_msgs/1,
-
- per/1,
+
per_test_msgs/1,
-
- per_bin/1,
+
per_bin_test_msgs/1,
-
- erl_dist/1,
- erl_dist_m/1,
+
erl_dist_m_test_msgs/1,
tickets/0,
- tickets/1,
-
- compact_tickets/1,
+
compact_otp4011_msg1/1,
compact_otp4011_msg2/1,
compact_otp4011_msg3/1,
@@ -132,8 +115,7 @@
compact_otp6017_msg01/1,
compact_otp6017_msg02/1,
compact_otp6017_msg03/1,
-
- flex_compact_tickets/1,
+
flex_compact_otp7431_msg01/1,
flex_compact_otp7431_msg02/1,
flex_compact_otp7431_msg03/1,
@@ -141,8 +123,7 @@
flex_compact_otp7431_msg05/1,
flex_compact_otp7431_msg06/1,
flex_compact_otp7431_msg07/1,
-
- pretty_tickets/1,
+
pretty_otp4632_msg1/1,
pretty_otp4632_msg2/1,
pretty_otp4632_msg3/1,
@@ -185,8 +166,7 @@
pretty_otp7671_msg04/1,
pretty_otp7671_msg05/1,
pretty_otp8114_msg01/1,
-
- flex_pretty_tickets/1,
+
flex_pretty_otp5042_msg1/1,
flex_pretty_otp5085_msg1/1,
flex_pretty_otp5085_msg2/1,
@@ -208,7 +188,7 @@
flex_pretty_otp7431_msg06/1,
flex_pretty_otp7431_msg07/1,
- init_per_testcase/2, fin_per_testcase/2]).
+ init_per_testcase/2, end_per_testcase/2]).
-export([display_text_messages/0]).
@@ -263,30 +243,7 @@ expand([Case|Cases], Acc) ->
expand(Cases, [Case|Acc])
end.
-
-%% ----
-
-tickets() ->
- Flag = process_flag(trap_exit, true),
- Cases = expand(tickets),
- Fun = fun(Case) ->
- C = init_per_testcase(Case, [{tc_timeout,
- timer:minutes(10)}]),
- io:format("Eval ~w~n", [Case]),
- Result =
- case (catch apply(?MODULE, Case, [C])) of
- {'EXIT', Reason} ->
- io:format("~n~p exited:~n ~p~n",
- [Case, Reason]),
- {error, {Case, Reason}};
- Res ->
- Res
- end,
- fin_per_testcase(Case, C),
- Result
- end,
- process_flag(trap_exit, Flag),
- lists:map(Fun, Cases).
+
%% ----
@@ -306,268 +263,166 @@ init_per_testcase(Case, Config) ->
end,
megaco_test_lib:init_per_testcase(Case, C).
-fin_per_testcase(Case, Config) ->
+end_per_testcase(Case, Config) ->
erase(verbosity),
- megaco_test_lib:fin_per_testcase(Case, Config).
+ megaco_test_lib:end_per_testcase(Case, Config).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Top test case
-all(suite) ->
- [
- text,
- binary,
- erl_dist,
- tickets
- ].
-
-text(suite) ->
- [
- pretty,
- flex_pretty,
- compact,
- flex_compact
- ].
-
-binary(suite) ->
- [
- bin,
- ber,
- ber_bin,
- per,
- per_bin
- ].
-
-erl_dist(suite) ->
- [
- erl_dist_m
- ].
-
-pretty(suite) ->
- [
- pretty_test_msgs
- ].
-
-
-compact(suite) ->
- [
- compact_test_msgs
- ].
-
-
-flex_pretty(suite) ->
- {req, [],
- {conf, flex_pretty_init, flex_pretty_cases(), flex_pretty_finish}}.
-
-flex_pretty_cases() ->
- [
- flex_pretty_test_msgs
- ].
-
-flex_compact(suite) ->
- {req, [],
- {conf, flex_compact_init, flex_compact_cases(), flex_compact_finish}}.
-
-flex_compact_cases() ->
- [
- flex_compact_test_msgs,
- flex_compact_dm_timers1,
- flex_compact_dm_timers2,
- flex_compact_dm_timers3,
- flex_compact_dm_timers4,
- flex_compact_dm_timers5,
- flex_compact_dm_timers6,
- flex_compact_dm_timers7,
- flex_compact_dm_timers8
- ].
-
-
-bin(suite) ->
- [
- bin_test_msgs
- ].
-
-
-ber(suite) ->
- [
- ber_test_msgs
- ].
-
-
-ber_bin(suite) ->
- [
- ber_bin_test_msgs
- ].
-
-
-per(suite) ->
- [
- per_test_msgs
- ].
-
+all() ->
+ [{group, text}, {group, binary}, {group, erl_dist},
+ {group, tickets}].
+
+groups() ->
+ [{text, [],
+ [{group, pretty}, {group, flex_pretty},
+ {group, compact}, {group, flex_compact}]},
+ {binary, [],
+ [{group, bin}, {group, ber}, {group, ber_bin},
+ {group, per}, {group, per_bin}]},
+ {erl_dist, [], [{group, erl_dist_m}]},
+ {pretty, [], [pretty_test_msgs]},
+ {compact, [], [compact_test_msgs]},
+ {flex_pretty, [], flex_pretty_cases()},
+ {flex_compact, [], flex_compact_cases()},
+ {bin, [], [bin_test_msgs]}, {ber, [], [ber_test_msgs]},
+ {ber_bin, [], [ber_bin_test_msgs]},
+ {per, [], [per_test_msgs]},
+ {per_bin, [], [per_bin_test_msgs]},
+ {erl_dist_m, [], [erl_dist_m_test_msgs]},
+ {tickets, [],
+ [{group, compact_tickets},
+ {group, flex_compact_tickets}, {group, pretty_tickets},
+ {group, flex_pretty_tickets}]},
+ {compact_tickets, [],
+ [compact_otp4011_msg1, compact_otp4011_msg2,
+ compact_otp4011_msg3, compact_otp4013_msg1,
+ compact_otp4085_msg1, compact_otp4085_msg2,
+ compact_otp4280_msg1, compact_otp4299_msg1,
+ compact_otp4299_msg2, compact_otp4359_msg1,
+ compact_otp4920_msg0, compact_otp4920_msg1,
+ compact_otp4920_msg2, compact_otp4920_msg3,
+ compact_otp4920_msg4, compact_otp4920_msg5,
+ compact_otp4920_msg6, compact_otp4920_msg7,
+ compact_otp4920_msg8, compact_otp4920_msg9,
+ compact_otp4920_msg10, compact_otp4920_msg11,
+ compact_otp4920_msg12, compact_otp4920_msg20,
+ compact_otp4920_msg21, compact_otp4920_msg22,
+ compact_otp4920_msg23, compact_otp4920_msg24,
+ compact_otp4920_msg25, compact_otp5186_msg01,
+ compact_otp5186_msg02, compact_otp5186_msg03,
+ compact_otp5186_msg04, compact_otp5186_msg05,
+ compact_otp5186_msg06, compact_otp5793_msg01,
+ compact_otp5993_msg01, compact_otp5993_msg02,
+ compact_otp5993_msg03, compact_otp6017_msg01,
+ compact_otp6017_msg02, compact_otp6017_msg03]},
+ {flex_compact_tickets, [],
+ flex_compact_tickets_cases()},
+ {pretty_tickets, [],
+ [pretty_otp4632_msg1, pretty_otp4632_msg2,
+ pretty_otp4632_msg3, pretty_otp4632_msg4,
+ pretty_otp4710_msg1, pretty_otp4710_msg2,
+ pretty_otp4945_msg1, pretty_otp4945_msg2,
+ pretty_otp4945_msg3, pretty_otp4945_msg4,
+ pretty_otp4945_msg5, pretty_otp4945_msg6,
+ pretty_otp4949_msg1, pretty_otp4949_msg2,
+ pretty_otp4949_msg3, pretty_otp5042_msg1,
+ pretty_otp5068_msg1, pretty_otp5085_msg1,
+ pretty_otp5085_msg2, pretty_otp5085_msg3,
+ pretty_otp5085_msg4, pretty_otp5085_msg5,
+ pretty_otp5085_msg6, pretty_otp5085_msg7,
+ pretty_otp5085_msg8, pretty_otp5600_msg1,
+ pretty_otp5600_msg2, pretty_otp5601_msg1,
+ pretty_otp5793_msg01, pretty_otp5882_msg01,
+ pretty_otp6490_msg01, pretty_otp6490_msg02,
+ pretty_otp6490_msg03, pretty_otp6490_msg04,
+ pretty_otp6490_msg05, pretty_otp6490_msg06,
+ pretty_otp7671_msg01, pretty_otp7671_msg02,
+ pretty_otp7671_msg03, pretty_otp7671_msg04,
+ pretty_otp7671_msg05, pretty_otp8114_msg01]},
+ {flex_pretty_tickets, [], flex_pretty_tickets_cases()}].
+
+init_per_group(flex_pretty_tickets, Config) ->
+ flex_pretty_init(Config);
+init_per_group(flex_compact_tickets, Config) ->
+ flex_compact_init(Config);
+init_per_group(flex_compact, Config) ->
+ flex_compact_init(Config);
+init_per_group(flex_pretty, Config) ->
+ flex_pretty_init(Config);
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(flex_pretty_tickets, Config) ->
+ flex_pretty_finish(Config);
+end_per_group(flex_compact_tickets, Config) ->
+ flex_compact_finish(Config);
+end_per_group(flex_compact, Config) ->
+ flex_compact_finish(Config);
+end_per_group(flex_pretty, Config) ->
+ flex_pretty_finish(Config);
+end_per_group(_GroupName, Config) ->
+ Config.
+
+flex_pretty_cases() ->
+ [flex_pretty_test_msgs].
+
+
+flex_compact_cases() ->
+ [flex_compact_test_msgs, flex_compact_dm_timers1,
+ flex_compact_dm_timers2, flex_compact_dm_timers3,
+ flex_compact_dm_timers4, flex_compact_dm_timers5,
+ flex_compact_dm_timers6, flex_compact_dm_timers7,
+ flex_compact_dm_timers8].
%% Support for per_bin was added to ASN.1 as of version
%% 1.3.2 (R8). And later merged into 1.3.1.3 (R7). These
%% releases are identical (as far as I know).
%%
-per_bin(suite) ->
- [
- per_bin_test_msgs
- ].
-
-
-erl_dist_m(suite) ->
- [
- erl_dist_m_test_msgs
- ].
-
-tickets(suite) ->
- [
- compact_tickets,
- flex_compact_tickets,
- pretty_tickets,
- flex_pretty_tickets
- ].
-
-compact_tickets(suite) ->
- [
- compact_otp4011_msg1,
- compact_otp4011_msg2,
- compact_otp4011_msg3,
- compact_otp4013_msg1,
- compact_otp4085_msg1,
- compact_otp4085_msg2,
- compact_otp4280_msg1,
- compact_otp4299_msg1,
- compact_otp4299_msg2,
- compact_otp4359_msg1,
- compact_otp4920_msg0,
- compact_otp4920_msg1,
- compact_otp4920_msg2,
- compact_otp4920_msg3,
- compact_otp4920_msg4,
- compact_otp4920_msg5,
- compact_otp4920_msg6,
- compact_otp4920_msg7,
- compact_otp4920_msg8,
- compact_otp4920_msg9,
- compact_otp4920_msg10,
- compact_otp4920_msg11,
- compact_otp4920_msg12,
- compact_otp4920_msg20,
- compact_otp4920_msg21,
- compact_otp4920_msg22,
- compact_otp4920_msg23,
- compact_otp4920_msg24,
- compact_otp4920_msg25,
- compact_otp5186_msg01,
- compact_otp5186_msg02,
- compact_otp5186_msg03,
- compact_otp5186_msg04,
- compact_otp5186_msg05,
- compact_otp5186_msg06,
- compact_otp5793_msg01,
- compact_otp5993_msg01,
- compact_otp5993_msg02,
- compact_otp5993_msg03,
- compact_otp6017_msg01,
- compact_otp6017_msg02,
- compact_otp6017_msg03
- ].
-
-flex_compact_tickets(suite) ->
- {req, [],
- {conf, flex_compact_init, flex_compact_tickets_cases(),
- flex_compact_finish}}.
+flex_compact_tickets_cases() ->
+ [flex_compact_otp7431_msg01, flex_compact_otp7431_msg02,
+ flex_compact_otp7431_msg03, flex_compact_otp7431_msg04,
+ flex_compact_otp7431_msg05, flex_compact_otp7431_msg06,
+ flex_compact_otp7431_msg07].
+
+flex_pretty_tickets_cases() ->
+ [flex_pretty_otp5042_msg1, flex_pretty_otp5085_msg1,
+ flex_pretty_otp5085_msg2, flex_pretty_otp5085_msg3,
+ flex_pretty_otp5085_msg4, flex_pretty_otp5085_msg5,
+ flex_pretty_otp5085_msg6, flex_pretty_otp5085_msg7,
+ flex_pretty_otp5085_msg8, flex_pretty_otp5600_msg1,
+ flex_pretty_otp5600_msg2, flex_pretty_otp5601_msg1,
+ flex_pretty_otp5793_msg01, flex_pretty_otp7431_msg01,
+ flex_pretty_otp7431_msg02, flex_pretty_otp7431_msg03,
+ flex_pretty_otp7431_msg04, flex_pretty_otp7431_msg05,
+ flex_pretty_otp7431_msg06, flex_pretty_otp7431_msg07].
-flex_compact_tickets_cases() ->
- [
- flex_compact_otp7431_msg01,
- flex_compact_otp7431_msg02,
- flex_compact_otp7431_msg03,
- flex_compact_otp7431_msg04,
- flex_compact_otp7431_msg05,
- flex_compact_otp7431_msg06,
- flex_compact_otp7431_msg07
- ].
-
-
-pretty_tickets(suite) ->
- [
- pretty_otp4632_msg1,
- pretty_otp4632_msg2,
- pretty_otp4632_msg3,
- pretty_otp4632_msg4,
- pretty_otp4710_msg1,
- pretty_otp4710_msg2,
- pretty_otp4945_msg1,
- pretty_otp4945_msg2,
- pretty_otp4945_msg3,
- pretty_otp4945_msg4,
- pretty_otp4945_msg5,
- pretty_otp4945_msg6,
- pretty_otp4949_msg1,
- pretty_otp4949_msg2,
- pretty_otp4949_msg3,
- pretty_otp5042_msg1,
- pretty_otp5068_msg1,
- pretty_otp5085_msg1,
- pretty_otp5085_msg2,
- pretty_otp5085_msg3,
- pretty_otp5085_msg4,
- pretty_otp5085_msg5,
- pretty_otp5085_msg6,
- pretty_otp5085_msg7,
- pretty_otp5085_msg8,
- pretty_otp5600_msg1,
- pretty_otp5600_msg2,
- pretty_otp5601_msg1,
- pretty_otp5793_msg01,
- pretty_otp5882_msg01,
- pretty_otp6490_msg01,
- pretty_otp6490_msg02,
- pretty_otp6490_msg03,
- pretty_otp6490_msg04,
- pretty_otp6490_msg05,
- pretty_otp6490_msg06,
- pretty_otp7671_msg01,
- pretty_otp7671_msg02,
- pretty_otp7671_msg03,
- pretty_otp7671_msg04,
- pretty_otp7671_msg05,
- pretty_otp8114_msg01
- ].
+%% ----
-flex_pretty_tickets(suite) ->
- {req, [],
- {conf, flex_pretty_init, flex_pretty_tickets_cases(),
- flex_pretty_finish}}.
-
-flex_pretty_tickets_cases() ->
- [
- flex_pretty_otp5042_msg1,
- flex_pretty_otp5085_msg1,
- flex_pretty_otp5085_msg2,
- flex_pretty_otp5085_msg3,
- flex_pretty_otp5085_msg4,
- flex_pretty_otp5085_msg5,
- flex_pretty_otp5085_msg6,
- flex_pretty_otp5085_msg7,
- flex_pretty_otp5085_msg8,
- flex_pretty_otp5600_msg1,
- flex_pretty_otp5600_msg2,
- flex_pretty_otp5601_msg1,
- flex_pretty_otp5793_msg01,
- flex_pretty_otp7431_msg01,
- flex_pretty_otp7431_msg02,
- flex_pretty_otp7431_msg03,
- flex_pretty_otp7431_msg04,
- flex_pretty_otp7431_msg05,
- flex_pretty_otp7431_msg06,
- flex_pretty_otp7431_msg07
- ].
+tickets() ->
+ Flag = process_flag(trap_exit, true),
+ Cases = expand(tickets),
+ Fun = fun(Case) ->
+ C = init_per_testcase(Case, [{tc_timeout,
+ timer:minutes(10)}]),
+ io:format("Eval ~w~n", [Case]),
+ Result =
+ case (catch apply(?MODULE, Case, [C])) of
+ {'EXIT', Reason} ->
+ io:format("~n~p exited:~n ~p~n",
+ [Case, Reason]),
+ {error, {Case, Reason}};
+ Res ->
+ Res
+ end,
+ end_per_testcase(Case, C),
+ Result
+ end,
+ process_flag(trap_exit, Flag),
+ lists:map(Fun, Cases).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/megaco/test/megaco_codec_prev3b_test.erl b/lib/megaco/test/megaco_codec_prev3b_test.erl
index b5fe4d2038..eaab8f37c1 100644
--- a/lib/megaco/test/megaco_codec_prev3b_test.erl
+++ b/lib/megaco/test/megaco_codec_prev3b_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
@@ -36,22 +36,16 @@
-export([t/0, t/1]).
--export([all/1,
-
- text/1,
-
- pretty/1,
+-export([all/0,groups/0,init_per_group/2,end_per_group/2,
+
pretty_test_msgs/1,
-
- compact/1,
+
compact_test_msgs/1,
- flex_pretty/1,
flex_pretty_init/1,
flex_pretty_finish/1,
flex_pretty_test_msgs/1,
-
- flex_compact/1,
+
flex_compact_init/1,
flex_compact_finish/1,
flex_compact_test_msgs/1,
@@ -64,32 +58,21 @@
flex_compact_dm_timers6/1,
flex_compact_dm_timers7/1,
flex_compact_dm_timers8/1,
-
- binary/1,
- bin/1,
bin_test_msgs/1,
-
- ber/1,
+
ber_test_msgs/1,
-
- ber_bin/1,
+
ber_bin_test_msgs/1,
-
- per/1,
+
per_test_msgs/1,
-
- per_bin/1,
+
per_bin_test_msgs/1,
-
- erl_dist/1,
- erl_dist_m/1,
+
erl_dist_m_test_msgs/1,
tickets/0,
- tickets/1,
-
- compact_tickets/1,
+
compact_otp4011_msg1/1,
compact_otp4011_msg2/1,
compact_otp4011_msg3/1,
@@ -133,8 +116,7 @@
compact_otp6017_msg01/1,
compact_otp6017_msg02/1,
compact_otp6017_msg03/1,
-
- flex_compact_tickets/1,
+
flex_compact_otp7431_msg01/1,
flex_compact_otp7431_msg02/1,
flex_compact_otp7431_msg03/1,
@@ -142,8 +124,7 @@
flex_compact_otp7431_msg05/1,
flex_compact_otp7431_msg06/1,
flex_compact_otp7431_msg07/1,
-
- pretty_tickets/1,
+
pretty_otp4632_msg1/1,
pretty_otp4632_msg2/1,
pretty_otp4632_msg3/1,
@@ -190,8 +171,7 @@
pretty_otp7671_msg04/1,
pretty_otp7671_msg05/1,
pretty_otp8114_msg01/1,
-
- flex_pretty_tickets/1,
+
flex_pretty_otp5042_msg1/1,
flex_pretty_otp5085_msg1/1,
flex_pretty_otp5085_msg2/1,
@@ -217,7 +197,7 @@
flex_pretty_otp7431_msg06/1,
flex_pretty_otp7431_msg07/1,
- init_per_testcase/2, fin_per_testcase/2]).
+ init_per_testcase/2, end_per_testcase/2]).
-export([display_text_messages/0, generate_text_messages/0]).
@@ -281,31 +261,6 @@ expand([Case|Cases], Acc) ->
expand(Cases, [Case|Acc])
end.
-
-%% ----
-
-tickets() ->
- Flag = process_flag(trap_exit, true),
- Cases = expand(tickets),
- Fun = fun(Case) ->
- C = init_per_testcase(Case, [{tc_timeout,
- timer:minutes(10)}]),
- io:format("Eval ~w~n", [Case]),
- Result =
- case (catch apply(?MODULE, Case, [C])) of
- {'EXIT', Reason} ->
- io:format("~n~p exited:~n ~p~n",
- [Case, Reason]),
- {error, {Case, Reason}};
- Res ->
- Res
- end,
- fin_per_testcase(Case, C),
- Result
- end,
- process_flag(trap_exit, Flag),
- lists:map(Fun, Cases).
-
%% ----
@@ -324,276 +279,170 @@ init_per_testcase(Case, Config) ->
end,
megaco_test_lib:init_per_testcase(Case, C).
-fin_per_testcase(Case, Config) ->
+end_per_testcase(Case, Config) ->
erase(verbosity),
- megaco_test_lib:fin_per_testcase(Case, Config).
+ megaco_test_lib:end_per_testcase(Case, Config).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Top test case
-all(suite) ->
- [
- text,
- binary,
- erl_dist,
- tickets
- ].
-
-text(suite) ->
- [
- pretty,
- flex_pretty,
- compact,
- flex_compact
- ].
-
-binary(suite) ->
- [
- bin,
- ber,
- ber_bin,
- per,
- per_bin
- ].
-
-erl_dist(suite) ->
- [
- erl_dist_m
- ].
-
-pretty(suite) ->
- [
- pretty_test_msgs
- ].
-
-
-compact(suite) ->
- [
- compact_test_msgs
- ].
-
-
-flex_pretty(suite) ->
- {req, [],
- {conf, flex_pretty_init, flex_pretty_cases(), flex_pretty_finish}}.
-
-flex_pretty_cases() ->
- [
- flex_pretty_test_msgs
- ].
-
-flex_compact(suite) ->
- {req, [],
- {conf, flex_compact_init, flex_compact_cases(), flex_compact_finish}}.
-
-flex_compact_cases() ->
- [
- flex_compact_test_msgs,
- flex_compact_dm_timers1,
- flex_compact_dm_timers2,
- flex_compact_dm_timers3,
- flex_compact_dm_timers4,
- flex_compact_dm_timers5,
- flex_compact_dm_timers6,
- flex_compact_dm_timers7,
- flex_compact_dm_timers8
- ].
-
-
-bin(suite) ->
- [
- bin_test_msgs
- ].
-
-
-ber(suite) ->
- [
- ber_test_msgs
- ].
-
-
-ber_bin(suite) ->
- [
- ber_bin_test_msgs
- ].
-
-
-per(suite) ->
- [
- per_test_msgs
- ].
-
+all() ->
+ [{group, text}, {group, binary}, {group, erl_dist},
+ {group, tickets}].
+
+groups() ->
+ [{text, [],
+ [{group, pretty}, {group, flex_pretty},
+ {group, compact}, {group, flex_compact}]},
+ {binary, [],
+ [{group, bin}, {group, ber}, {group, ber_bin},
+ {group, per}, {group, per_bin}]},
+ {erl_dist, [], [{group, erl_dist_m}]},
+ {pretty, [], [pretty_test_msgs]},
+ {compact, [], [compact_test_msgs]},
+ {flex_pretty, [], flex_pretty_cases()},
+ {flex_compact, [], flex_compact_cases()},
+ {bin, [], [bin_test_msgs]}, {ber, [], [ber_test_msgs]},
+ {ber_bin, [], [ber_bin_test_msgs]},
+ {per, [], [per_test_msgs]},
+ {per_bin, [], [per_bin_test_msgs]},
+ {erl_dist_m, [], [erl_dist_m_test_msgs]},
+ {tickets, [],
+ [{group, compact_tickets},
+ {group, flex_compact_tickets}, {group, pretty_tickets},
+ {group, flex_pretty_tickets}]},
+ {compact_tickets, [],
+ [compact_otp4011_msg1, compact_otp4011_msg2,
+ compact_otp4011_msg3, compact_otp4013_msg1,
+ compact_otp4085_msg1, compact_otp4085_msg2,
+ compact_otp4280_msg1, compact_otp4299_msg1,
+ compact_otp4299_msg2, compact_otp4359_msg1,
+ compact_otp4920_msg0, compact_otp4920_msg1,
+ compact_otp4920_msg2, compact_otp4920_msg3,
+ compact_otp4920_msg4, compact_otp4920_msg5,
+ compact_otp4920_msg6, compact_otp4920_msg7,
+ compact_otp4920_msg8, compact_otp4920_msg9,
+ compact_otp4920_msg10, compact_otp4920_msg11,
+ compact_otp4920_msg12, compact_otp4920_msg20,
+ compact_otp4920_msg21, compact_otp4920_msg22,
+ compact_otp4920_msg23, compact_otp4920_msg24,
+ compact_otp4920_msg25, compact_otp5186_msg01,
+ compact_otp5186_msg02, compact_otp5186_msg03,
+ compact_otp5186_msg04, compact_otp5186_msg05,
+ compact_otp5186_msg06, compact_otp5793_msg01,
+ compact_otp5836_msg01, compact_otp5993_msg01,
+ compact_otp5993_msg02, compact_otp5993_msg03,
+ compact_otp6017_msg01, compact_otp6017_msg02,
+ compact_otp6017_msg03]},
+ {flex_compact_tickets, [],
+ flex_compact_tickets_cases()},
+ {pretty_tickets, [],
+ [pretty_otp4632_msg1, pretty_otp4632_msg2,
+ pretty_otp4632_msg3, pretty_otp4632_msg4,
+ pretty_otp4710_msg1, pretty_otp4710_msg2,
+ pretty_otp4945_msg1, pretty_otp4945_msg2,
+ pretty_otp4945_msg3, pretty_otp4945_msg4,
+ pretty_otp4945_msg5, pretty_otp4945_msg6,
+ pretty_otp4949_msg1, pretty_otp4949_msg2,
+ pretty_otp4949_msg3, pretty_otp5042_msg1,
+ pretty_otp5068_msg1, pretty_otp5085_msg1,
+ pretty_otp5085_msg2, pretty_otp5085_msg3,
+ pretty_otp5085_msg4, pretty_otp5085_msg5,
+ pretty_otp5085_msg6, pretty_otp5085_msg7,
+ pretty_otp5085_msg8, pretty_otp5600_msg1,
+ pretty_otp5600_msg2, pretty_otp5601_msg1,
+ pretty_otp5793_msg01, pretty_otp5803_msg01,
+ pretty_otp5803_msg02, pretty_otp5805_msg01,
+ pretty_otp5836_msg01, pretty_otp5882_msg01,
+ pretty_otp6490_msg01, pretty_otp6490_msg02,
+ pretty_otp6490_msg03, pretty_otp6490_msg04,
+ pretty_otp6490_msg05, pretty_otp6490_msg06,
+ pretty_otp7671_msg01, pretty_otp7671_msg02,
+ pretty_otp7671_msg03, pretty_otp7671_msg04,
+ pretty_otp7671_msg05, pretty_otp8114_msg01]},
+ {flex_pretty_tickets, [], flex_pretty_tickets_cases()}].
+
+init_per_group(flex_pretty_tickets, Config) ->
+ flex_pretty_init(Config);
+init_per_group(flex_compact_tickets, Config) ->
+ flex_compact_init(Config);
+init_per_group(flex_compact, Config) ->
+ flex_compact_init(Config);
+init_per_group(flex_pretty, Config) ->
+ flex_pretty_init(Config);
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(flex_pretty_tickets, Config) ->
+ flex_pretty_finish(Config);
+end_per_group(flex_compact_tickets, Config) ->
+ flex_compact_finish(Config);
+end_per_group(flex_compact, Config) ->
+ flex_compact_finish(Config);
+end_per_group(flex_pretty, Config) ->
+ flex_pretty_finish(Config);
+end_per_group(_GroupName, Config) ->
+ Config.
+
+flex_pretty_cases() ->
+ [flex_pretty_test_msgs].
+
+flex_compact_cases() ->
+ [flex_compact_test_msgs, flex_compact_dm_timers1,
+ flex_compact_dm_timers2, flex_compact_dm_timers3,
+ flex_compact_dm_timers4, flex_compact_dm_timers5,
+ flex_compact_dm_timers6, flex_compact_dm_timers7,
+ flex_compact_dm_timers8].
%% Support for per_bin was added to ASN.1 as of version
%% 1.3.2 (R8). And later merged into 1.3.1.3 (R7). These
%% releases are identical (as far as I know).
%%
-per_bin(suite) ->
- [
- per_bin_test_msgs
- ].
-
-
-erl_dist_m(suite) ->
- [
- erl_dist_m_test_msgs
- ].
-
-tickets(suite) ->
- [
- compact_tickets,
- flex_compact_tickets,
- pretty_tickets,
- flex_pretty_tickets
- ].
+flex_compact_tickets_cases() ->
+ [flex_compact_otp7431_msg01, flex_compact_otp7431_msg02,
+ flex_compact_otp7431_msg03, flex_compact_otp7431_msg04,
+ flex_compact_otp7431_msg05, flex_compact_otp7431_msg06,
+ flex_compact_otp7431_msg07].
+
+flex_pretty_tickets_cases() ->
+ [flex_pretty_otp5042_msg1, flex_pretty_otp5085_msg1,
+ flex_pretty_otp5085_msg2, flex_pretty_otp5085_msg3,
+ flex_pretty_otp5085_msg4, flex_pretty_otp5085_msg5,
+ flex_pretty_otp5085_msg6, flex_pretty_otp5085_msg7,
+ flex_pretty_otp5085_msg8, flex_pretty_otp5600_msg1,
+ flex_pretty_otp5600_msg2, flex_pretty_otp5601_msg1,
+ flex_pretty_otp5793_msg01, flex_pretty_otp5803_msg01,
+ flex_pretty_otp5803_msg02, flex_pretty_otp5805_msg01,
+ flex_pretty_otp5836_msg01, flex_pretty_otp7431_msg01,
+ flex_pretty_otp7431_msg02, flex_pretty_otp7431_msg03,
+ flex_pretty_otp7431_msg04, flex_pretty_otp7431_msg05,
+ flex_pretty_otp7431_msg06, flex_pretty_otp7431_msg07].
-compact_tickets(suite) ->
- [
- compact_otp4011_msg1,
- compact_otp4011_msg2,
- compact_otp4011_msg3,
- compact_otp4013_msg1,
- compact_otp4085_msg1,
- compact_otp4085_msg2,
- compact_otp4280_msg1,
- compact_otp4299_msg1,
- compact_otp4299_msg2,
- compact_otp4359_msg1,
- compact_otp4920_msg0,
- compact_otp4920_msg1,
- compact_otp4920_msg2,
- compact_otp4920_msg3,
- compact_otp4920_msg4,
- compact_otp4920_msg5,
- compact_otp4920_msg6,
- compact_otp4920_msg7,
- compact_otp4920_msg8,
- compact_otp4920_msg9,
- compact_otp4920_msg10,
- compact_otp4920_msg11,
- compact_otp4920_msg12,
- compact_otp4920_msg20,
- compact_otp4920_msg21,
- compact_otp4920_msg22,
- compact_otp4920_msg23,
- compact_otp4920_msg24,
- compact_otp4920_msg25,
- compact_otp5186_msg01,
- compact_otp5186_msg02,
- compact_otp5186_msg03,
- compact_otp5186_msg04,
- compact_otp5186_msg05,
- compact_otp5186_msg06,
- compact_otp5793_msg01,
- compact_otp5836_msg01,
- compact_otp5993_msg01,
- compact_otp5993_msg02,
- compact_otp5993_msg03,
- compact_otp6017_msg01,
- compact_otp6017_msg02,
- compact_otp6017_msg03
- ].
-
-flex_compact_tickets(suite) ->
- {req, [],
- {conf, flex_compact_init, flex_compact_tickets_cases(),
- flex_compact_finish}}.
-
-flex_compact_tickets_cases() ->
- [
- flex_compact_otp7431_msg01,
- flex_compact_otp7431_msg02,
- flex_compact_otp7431_msg03,
- flex_compact_otp7431_msg04,
- flex_compact_otp7431_msg05,
- flex_compact_otp7431_msg06,
- flex_compact_otp7431_msg07
- ].
-
-pretty_tickets(suite) ->
- [
- pretty_otp4632_msg1,
- pretty_otp4632_msg2,
- pretty_otp4632_msg3,
- pretty_otp4632_msg4,
- pretty_otp4710_msg1,
- pretty_otp4710_msg2,
- pretty_otp4945_msg1,
- pretty_otp4945_msg2,
- pretty_otp4945_msg3,
- pretty_otp4945_msg4,
- pretty_otp4945_msg5,
- pretty_otp4945_msg6,
- pretty_otp4949_msg1,
- pretty_otp4949_msg2,
- pretty_otp4949_msg3,
- pretty_otp5042_msg1,
- pretty_otp5068_msg1,
- pretty_otp5085_msg1,
- pretty_otp5085_msg2,
- pretty_otp5085_msg3,
- pretty_otp5085_msg4,
- pretty_otp5085_msg5,
- pretty_otp5085_msg6,
- pretty_otp5085_msg7,
- pretty_otp5085_msg8,
- pretty_otp5600_msg1,
- pretty_otp5600_msg2,
- pretty_otp5601_msg1,
- pretty_otp5793_msg01,
- pretty_otp5803_msg01,
- pretty_otp5803_msg02,
- pretty_otp5805_msg01,
- pretty_otp5836_msg01,
- pretty_otp5882_msg01,
- pretty_otp6490_msg01,
- pretty_otp6490_msg02,
- pretty_otp6490_msg03,
- pretty_otp6490_msg04,
- pretty_otp6490_msg05,
- pretty_otp6490_msg06,
- pretty_otp7671_msg01,
- pretty_otp7671_msg02,
- pretty_otp7671_msg03,
- pretty_otp7671_msg04,
- pretty_otp7671_msg05,
- pretty_otp8114_msg01
- ].
+%% ----
-flex_pretty_tickets(suite) ->
- {req, [],
- {conf, flex_pretty_init, flex_pretty_tickets_cases(),
- flex_pretty_finish}}.
-
-flex_pretty_tickets_cases() ->
- [
- flex_pretty_otp5042_msg1,
- flex_pretty_otp5085_msg1,
- flex_pretty_otp5085_msg2,
- flex_pretty_otp5085_msg3,
- flex_pretty_otp5085_msg4,
- flex_pretty_otp5085_msg5,
- flex_pretty_otp5085_msg6,
- flex_pretty_otp5085_msg7,
- flex_pretty_otp5085_msg8,
- flex_pretty_otp5600_msg1,
- flex_pretty_otp5600_msg2,
- flex_pretty_otp5601_msg1,
- flex_pretty_otp5793_msg01,
- flex_pretty_otp5803_msg01,
- flex_pretty_otp5803_msg02,
- flex_pretty_otp5805_msg01,
- flex_pretty_otp5836_msg01,
- flex_pretty_otp7431_msg01,
- flex_pretty_otp7431_msg02,
- flex_pretty_otp7431_msg03,
- flex_pretty_otp7431_msg04,
- flex_pretty_otp7431_msg05,
- flex_pretty_otp7431_msg06,
- flex_pretty_otp7431_msg07
- ].
+tickets() ->
+ Flag = process_flag(trap_exit, true),
+ Cases = expand(tickets),
+ Fun = fun(Case) ->
+ C = init_per_testcase(Case, [{tc_timeout,
+ timer:minutes(10)}]),
+ io:format("Eval ~w~n", [Case]),
+ Result =
+ case (catch apply(?MODULE, Case, [C])) of
+ {'EXIT', Reason} ->
+ io:format("~n~p exited:~n ~p~n",
+ [Case, Reason]),
+ {error, {Case, Reason}};
+ Res ->
+ Res
+ end,
+ end_per_testcase(Case, C),
+ Result
+ end,
+ process_flag(trap_exit, Flag),
+ lists:map(Fun, Cases).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/megaco/test/megaco_codec_prev3c_test.erl b/lib/megaco/test/megaco_codec_prev3c_test.erl
index 813d0cf57d..7f9c0fe4e7 100644
--- a/lib/megaco/test/megaco_codec_prev3c_test.erl
+++ b/lib/megaco/test/megaco_codec_prev3c_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2010. 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
@@ -37,22 +37,17 @@
-export([t/0, t/1]).
--export([all/1,
-
- text/1,
-
- pretty/1,
+-export([all/0,groups/0,init_per_group/2,end_per_group/2,
+
pretty_test_msgs/1,
-
- compact/1,
+
compact_test_msgs/1,
-
- flex_pretty/1,
+
flex_pretty_init/1,
flex_pretty_finish/1,
flex_pretty_test_msgs/1,
- flex_compact/1,
+
flex_compact_init/1,
flex_compact_finish/1,
flex_compact_test_msgs/1,
@@ -65,32 +60,21 @@
flex_compact_dm_timers6/1,
flex_compact_dm_timers7/1,
flex_compact_dm_timers8/1,
-
- binary/1,
- bin/1,
bin_test_msgs/1,
-
- ber/1,
+
ber_test_msgs/1,
-
- ber_bin/1,
+
ber_bin_test_msgs/1,
-
- per/1,
+
per_test_msgs/1,
-
- per_bin/1,
+
per_bin_test_msgs/1,
-
- erl_dist/1,
- erl_dist_m/1,
+
erl_dist_m_test_msgs/1,
tickets/0,
- tickets/1,
-
- compact_tickets/1,
+
compact_otp4011_msg1/1,
compact_otp4011_msg2/1,
compact_otp4011_msg3/1,
@@ -133,8 +117,7 @@
compact_otp6017_msg01/1,
compact_otp6017_msg02/1,
compact_otp6017_msg03/1,
-
- flex_compact_tickets/1,
+
flex_compact_otp4299_msg1/1,
flex_compact_otp7431_msg01/1,
flex_compact_otp7431_msg02/1,
@@ -143,8 +126,7 @@
flex_compact_otp7431_msg05/1,
flex_compact_otp7431_msg06/1,
flex_compact_otp7431_msg07/1,
-
- pretty_tickets/1,
+
pretty_otp4632_msg1/1,
pretty_otp4632_msg2/1,
pretty_otp4632_msg3/1,
@@ -191,8 +173,7 @@
pretty_otp7671_msg04/1,
pretty_otp7671_msg05/1,
pretty_otp8114_msg01/1,
-
- flex_pretty_tickets/1,
+
flex_pretty_otp5042_msg1/1,
flex_pretty_otp5085_msg1/1,
flex_pretty_otp5085_msg2/1,
@@ -218,7 +199,7 @@
flex_pretty_otp7431_msg06/1,
flex_pretty_otp7431_msg07/1,
- init_per_testcase/2, fin_per_testcase/2]).
+ init_per_testcase/2, end_per_testcase/2]).
-export([display_text_messages/0, generate_text_messages/0]).
@@ -286,32 +267,6 @@ expand([Case|Cases], Acc) ->
expand(Cases, [Case|Acc])
end.
-
-%% ----
-
-tickets() ->
- Flag = process_flag(trap_exit, true),
- Cases = expand(tickets),
- Fun = fun(Case) ->
- C = init_per_testcase(Case, [{tc_timeout,
- timer:minutes(10)}]),
- io:format("Eval ~w~n", [Case]),
- Result =
- case (catch apply(?MODULE, Case, [C])) of
- {'EXIT', Reason} ->
- io:format("~n~p exited:~n ~p~n",
- [Case, Reason]),
- {error, {Case, Reason}};
- Res ->
- Res
- end,
- fin_per_testcase(Case, C),
- Result
- end,
- process_flag(trap_exit, Flag),
- lists:map(Fun, Cases).
-
-
%% ----
t() -> megaco_test_lib:t(?MODULE).
@@ -329,279 +284,169 @@ init_per_testcase(Case, Config) ->
end,
megaco_test_lib:init_per_testcase(Case, C).
-fin_per_testcase(Case, Config) ->
+end_per_testcase(Case, Config) ->
erase(verbosity),
- megaco_test_lib:fin_per_testcase(Case, Config).
+ megaco_test_lib:end_per_testcase(Case, Config).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Top test case
-all(suite) ->
- [
- text,
- binary,
- erl_dist,
- tickets
- ].
-
-text(suite) ->
- [
- pretty,
- flex_pretty,
- compact,
- flex_compact
- ].
-
-binary(suite) ->
- [
- bin,
- ber,
- ber_bin,
- per,
- per_bin
- ].
-
-erl_dist(suite) ->
- [
- erl_dist_m
- ].
-
-pretty(suite) ->
- [
- pretty_test_msgs
- ].
-
-
-compact(suite) ->
- [
- compact_test_msgs
- ].
-
-
-flex_pretty(suite) ->
- {req, [],
- {conf, flex_pretty_init, flex_pretty_cases(), flex_pretty_finish}}.
-
-flex_pretty_cases() ->
- [
- flex_pretty_test_msgs
- ].
-
-flex_compact(suite) ->
- {req, [],
- {conf, flex_compact_init, flex_compact_cases(), flex_compact_finish}}.
-
-flex_compact_cases() ->
- [
- flex_compact_test_msgs,
- flex_compact_dm_timers1,
- flex_compact_dm_timers2,
- flex_compact_dm_timers3,
- flex_compact_dm_timers4,
- flex_compact_dm_timers5,
- flex_compact_dm_timers6,
- flex_compact_dm_timers7,
- flex_compact_dm_timers8
- ].
-
-
-bin(suite) ->
- [
- bin_test_msgs
- ].
-
-
-ber(suite) ->
- [
- ber_test_msgs
- ].
-
-
-ber_bin(suite) ->
- [
- ber_bin_test_msgs
- ].
-
-
-per(suite) ->
- [
- per_test_msgs
- ].
-
+all() ->
+ [{group, text}, {group, binary}, {group, erl_dist},
+ {group, tickets}].
+
+groups() ->
+ [{text, [],
+ [{group, pretty}, {group, flex_pretty},
+ {group, compact}, {group, flex_compact}]},
+ {binary, [],
+ [{group, bin}, {group, ber}, {group, ber_bin},
+ {group, per}, {group, per_bin}]},
+ {erl_dist, [], [{group, erl_dist_m}]},
+ {pretty, [], [pretty_test_msgs]},
+ {compact, [], [compact_test_msgs]},
+ {flex_pretty, [], flex_pretty_cases()},
+ {flex_compact, [], flex_compact_cases()},
+ {bin, [], [bin_test_msgs]}, {ber, [], [ber_test_msgs]},
+ {ber_bin, [], [ber_bin_test_msgs]},
+ {per, [], [per_test_msgs]},
+ {per_bin, [], [per_bin_test_msgs]},
+ {erl_dist_m, [], [erl_dist_m_test_msgs]},
+ {tickets, [],
+ [{group, compact_tickets},
+ {group, flex_compact_tickets}, {group, pretty_tickets},
+ {group, flex_pretty_tickets}]},
+ {compact_tickets, [],
+ [compact_otp4011_msg1, compact_otp4011_msg2,
+ compact_otp4011_msg3, compact_otp4013_msg1,
+ compact_otp4085_msg1, compact_otp4085_msg2,
+ compact_otp4280_msg1, compact_otp4299_msg1,
+ compact_otp4359_msg1, compact_otp4920_msg0,
+ compact_otp4920_msg1, compact_otp4920_msg2,
+ compact_otp4920_msg3, compact_otp4920_msg4,
+ compact_otp4920_msg5, compact_otp4920_msg6,
+ compact_otp4920_msg7, compact_otp4920_msg8,
+ compact_otp4920_msg9, compact_otp4920_msg10,
+ compact_otp4920_msg11, compact_otp4920_msg12,
+ compact_otp4920_msg20, compact_otp4920_msg21,
+ compact_otp4920_msg22, compact_otp4920_msg23,
+ compact_otp4920_msg24, compact_otp4920_msg25,
+ compact_otp5186_msg01, compact_otp5186_msg02,
+ compact_otp5186_msg03, compact_otp5186_msg04,
+ compact_otp5186_msg05, compact_otp5186_msg06,
+ compact_otp5793_msg01, compact_otp5836_msg01,
+ compact_otp5993_msg01, compact_otp5993_msg02,
+ compact_otp5993_msg03, compact_otp6017_msg01,
+ compact_otp6017_msg02, compact_otp6017_msg03]},
+ {flex_compact_tickets, [],
+ flex_compact_tickets_cases()},
+ {pretty_tickets, [],
+ [pretty_otp4632_msg1, pretty_otp4632_msg2,
+ pretty_otp4632_msg3, pretty_otp4632_msg4,
+ pretty_otp4710_msg1, pretty_otp4710_msg2,
+ pretty_otp4945_msg1, pretty_otp4945_msg2,
+ pretty_otp4945_msg3, pretty_otp4945_msg4,
+ pretty_otp4945_msg5, pretty_otp4945_msg6,
+ pretty_otp4949_msg1, pretty_otp4949_msg2,
+ pretty_otp4949_msg3, pretty_otp5042_msg1,
+ pretty_otp5068_msg1, pretty_otp5085_msg1,
+ pretty_otp5085_msg2, pretty_otp5085_msg3,
+ pretty_otp5085_msg4, pretty_otp5085_msg5,
+ pretty_otp5085_msg6, pretty_otp5085_msg7,
+ pretty_otp5085_msg8, pretty_otp5600_msg1,
+ pretty_otp5600_msg2, pretty_otp5601_msg1,
+ pretty_otp5793_msg01, pretty_otp5803_msg01,
+ pretty_otp5803_msg02, pretty_otp5805_msg01,
+ pretty_otp5836_msg01, pretty_otp5882_msg01,
+ pretty_otp6490_msg01, pretty_otp6490_msg02,
+ pretty_otp6490_msg03, pretty_otp6490_msg04,
+ pretty_otp6490_msg05, pretty_otp6490_msg06,
+ pretty_otp7671_msg01, pretty_otp7671_msg02,
+ pretty_otp7671_msg03, pretty_otp7671_msg04,
+ pretty_otp7671_msg05, pretty_otp8114_msg01]},
+ {flex_pretty_tickets, [], flex_pretty_tickets_cases()}].
+
+init_per_group(flex_pretty_tickets, Config) ->
+ flex_pretty_init(Config);
+init_per_group(flex_compact_tickets, Config) ->
+ flex_compact_init(Config);
+init_per_group(flex_compact, Config) ->
+ flex_compact_init(Config);
+init_per_group(flex_pretty, Config) ->
+ flex_pretty_init(Config);
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(flex_pretty_tickets, Config) ->
+ flex_pretty_finish(Config);
+end_per_group(flex_compact_tickets, Config) ->
+ flex_compact_finish(Config);
+end_per_group(flex_compact, Config) ->
+ flex_compact_finish(Config);
+end_per_group(flex_pretty, Config) ->
+ flex_pretty_finish(Config);
+end_per_group(_GroupName, Config) ->
+ Config.
+
+flex_pretty_cases() ->
+ [flex_pretty_test_msgs].
+
+flex_compact_cases() ->
+ [flex_compact_test_msgs, flex_compact_dm_timers1,
+ flex_compact_dm_timers2, flex_compact_dm_timers3,
+ flex_compact_dm_timers4, flex_compact_dm_timers5,
+ flex_compact_dm_timers6, flex_compact_dm_timers7,
+ flex_compact_dm_timers8].
%% Support for per_bin was added to ASN.1 as of version
%% 1.3.2 (R8). And later merged into 1.3.1.3 (R7). These
%% releases are identical (as far as I know).
%%
-per_bin(suite) ->
- [
- per_bin_test_msgs
- ].
-
-
-erl_dist_m(suite) ->
- [
- erl_dist_m_test_msgs
- ].
-
-tickets(suite) ->
- [
- compact_tickets,
- flex_compact_tickets,
- pretty_tickets,
- flex_pretty_tickets
- ].
-
-
-compact_tickets(suite) ->
- [
- compact_otp4011_msg1,
- compact_otp4011_msg2,
- compact_otp4011_msg3,
- compact_otp4013_msg1,
- compact_otp4085_msg1,
- compact_otp4085_msg2,
- compact_otp4280_msg1,
- compact_otp4299_msg1,
- compact_otp4359_msg1,
- compact_otp4920_msg0,
- compact_otp4920_msg1,
- compact_otp4920_msg2,
- compact_otp4920_msg3,
- compact_otp4920_msg4,
- compact_otp4920_msg5,
- compact_otp4920_msg6,
- compact_otp4920_msg7,
- compact_otp4920_msg8,
- compact_otp4920_msg9,
- compact_otp4920_msg10,
- compact_otp4920_msg11,
- compact_otp4920_msg12,
- compact_otp4920_msg20,
- compact_otp4920_msg21,
- compact_otp4920_msg22,
- compact_otp4920_msg23,
- compact_otp4920_msg24,
- compact_otp4920_msg25,
- compact_otp5186_msg01,
- compact_otp5186_msg02,
- compact_otp5186_msg03,
- compact_otp5186_msg04,
- compact_otp5186_msg05,
- compact_otp5186_msg06,
- compact_otp5793_msg01,
- compact_otp5836_msg01,
- compact_otp5993_msg01,
- compact_otp5993_msg02,
- compact_otp5993_msg03,
- compact_otp6017_msg01,
- compact_otp6017_msg02,
- compact_otp6017_msg03
- ].
-
-
-flex_compact_tickets(suite) ->
- {req, [],
- {conf, flex_compact_init, flex_compact_tickets_cases(),
- flex_compact_finish}}.
-flex_compact_tickets_cases() ->
- [
- flex_compact_otp4299_msg1,
- flex_compact_otp7431_msg01,
- flex_compact_otp7431_msg02,
- flex_compact_otp7431_msg03,
- flex_compact_otp7431_msg04,
- flex_compact_otp7431_msg05,
- flex_compact_otp7431_msg06,
- flex_compact_otp7431_msg07
- ].
-
-
-pretty_tickets(suite) ->
- [
- pretty_otp4632_msg1,
- pretty_otp4632_msg2,
- pretty_otp4632_msg3,
- pretty_otp4632_msg4,
- pretty_otp4710_msg1,
- pretty_otp4710_msg2,
- pretty_otp4945_msg1,
- pretty_otp4945_msg2,
- pretty_otp4945_msg3,
- pretty_otp4945_msg4,
- pretty_otp4945_msg5,
- pretty_otp4945_msg6,
- pretty_otp4949_msg1,
- pretty_otp4949_msg2,
- pretty_otp4949_msg3,
- pretty_otp5042_msg1,
- pretty_otp5068_msg1,
- pretty_otp5085_msg1,
- pretty_otp5085_msg2,
- pretty_otp5085_msg3,
- pretty_otp5085_msg4,
- pretty_otp5085_msg5,
- pretty_otp5085_msg6,
- pretty_otp5085_msg7,
- pretty_otp5085_msg8,
- pretty_otp5600_msg1,
- pretty_otp5600_msg2,
- pretty_otp5601_msg1,
- pretty_otp5793_msg01,
- pretty_otp5803_msg01,
- pretty_otp5803_msg02,
- pretty_otp5805_msg01,
- pretty_otp5836_msg01,
- pretty_otp5882_msg01,
- pretty_otp6490_msg01,
- pretty_otp6490_msg02,
- pretty_otp6490_msg03,
- pretty_otp6490_msg04,
- pretty_otp6490_msg05,
- pretty_otp6490_msg06,
- pretty_otp7671_msg01,
- pretty_otp7671_msg02,
- pretty_otp7671_msg03,
- pretty_otp7671_msg04,
- pretty_otp7671_msg05,
- pretty_otp8114_msg01
- ].
+flex_compact_tickets_cases() ->
+ [flex_compact_otp4299_msg1, flex_compact_otp7431_msg01,
+ flex_compact_otp7431_msg02, flex_compact_otp7431_msg03,
+ flex_compact_otp7431_msg04, flex_compact_otp7431_msg05,
+ flex_compact_otp7431_msg06, flex_compact_otp7431_msg07].
+
+flex_pretty_tickets_cases() ->
+ [flex_pretty_otp5042_msg1, flex_pretty_otp5085_msg1,
+ flex_pretty_otp5085_msg2, flex_pretty_otp5085_msg3,
+ flex_pretty_otp5085_msg4, flex_pretty_otp5085_msg5,
+ flex_pretty_otp5085_msg6, flex_pretty_otp5085_msg7,
+ flex_pretty_otp5085_msg8, flex_pretty_otp5600_msg1,
+ flex_pretty_otp5600_msg2, flex_pretty_otp5601_msg1,
+ flex_pretty_otp5793_msg01, flex_pretty_otp5803_msg01,
+ flex_pretty_otp5803_msg02, flex_pretty_otp5805_msg01,
+ flex_pretty_otp5836_msg01, flex_pretty_otp7431_msg01,
+ flex_pretty_otp7431_msg02, flex_pretty_otp7431_msg03,
+ flex_pretty_otp7431_msg04, flex_pretty_otp7431_msg05,
+ flex_pretty_otp7431_msg06, flex_pretty_otp7431_msg07].
+%% ----
-flex_pretty_tickets(suite) ->
- {req, [],
- {conf, flex_pretty_init, flex_pretty_tickets_cases(),
- flex_pretty_finish}}.
-
-flex_pretty_tickets_cases() ->
- [
- flex_pretty_otp5042_msg1,
- flex_pretty_otp5085_msg1,
- flex_pretty_otp5085_msg2,
- flex_pretty_otp5085_msg3,
- flex_pretty_otp5085_msg4,
- flex_pretty_otp5085_msg5,
- flex_pretty_otp5085_msg6,
- flex_pretty_otp5085_msg7,
- flex_pretty_otp5085_msg8,
- flex_pretty_otp5600_msg1,
- flex_pretty_otp5600_msg2,
- flex_pretty_otp5601_msg1,
- flex_pretty_otp5793_msg01,
- flex_pretty_otp5803_msg01,
- flex_pretty_otp5803_msg02,
- flex_pretty_otp5805_msg01,
- flex_pretty_otp5836_msg01,
- flex_pretty_otp7431_msg01,
- flex_pretty_otp7431_msg02,
- flex_pretty_otp7431_msg03,
- flex_pretty_otp7431_msg04,
- flex_pretty_otp7431_msg05,
- flex_pretty_otp7431_msg06,
- flex_pretty_otp7431_msg07
- ].
+tickets() ->
+ Flag = process_flag(trap_exit, true),
+ Cases = expand(tickets),
+ Fun = fun(Case) ->
+ C = init_per_testcase(Case, [{tc_timeout,
+ timer:minutes(10)}]),
+ io:format("Eval ~w~n", [Case]),
+ Result =
+ case (catch apply(?MODULE, Case, [C])) of
+ {'EXIT', Reason} ->
+ io:format("~n~p exited:~n ~p~n",
+ [Case, Reason]),
+ {error, {Case, Reason}};
+ Res ->
+ Res
+ end,
+ end_per_testcase(Case, C),
+ Result
+ end,
+ process_flag(trap_exit, Flag),
+ lists:map(Fun, Cases).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/megaco/test/megaco_codec_test.erl b/lib/megaco/test/megaco_codec_test.erl
index d247959cc5..8391024c3f 100644
--- a/lib/megaco/test/megaco_codec_test.erl
+++ b/lib/megaco/test/megaco_codec_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2010. 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
@@ -36,8 +36,8 @@ t(Case) -> megaco_test_lib:t({?MODULE, Case}).
init_per_testcase(Case, Config) ->
megaco_test_lib:init_per_testcase(Case, Config).
-fin_per_testcase(Case, Config) ->
- megaco_test_lib:fin_per_testcase(Case, Config).
+end_per_testcase(Case, Config) ->
+ megaco_test_lib:end_per_testcase(Case, Config).
init() ->
process_flag(trap_exit, true),
@@ -47,17 +47,24 @@ init() ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Top test case
-all(suite) ->
- [
- codec
- ].
-
-codec(suite) ->
- [{megaco_codec_mini_test, all},
- {megaco_codec_v1_test, all},
- {megaco_codec_v2_test, all},
- {megaco_codec_prev3a_test, all},
- {megaco_codec_prev3b_test, all},
- {megaco_codec_prev3c_test, all},
- {megaco_codec_v3_test, all}].
+all() ->
+ [{group, codec}].
+
+groups() ->
+ [{codec, [],
+ [{megaco_codec_mini_test, all},
+ {megaco_codec_v1_test, all},
+ {megaco_codec_v2_test, all},
+ {megaco_codec_prev3a_test, all},
+ {megaco_codec_prev3b_test, all},
+ {megaco_codec_prev3c_test, all},
+ {megaco_codec_v3_test, all}]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
diff --git a/lib/megaco/test/megaco_codec_test_lib.erl b/lib/megaco/test/megaco_codec_test_lib.erl
index 66e8a52a24..0a903f5617 100644
--- a/lib/megaco/test/megaco_codec_test_lib.erl
+++ b/lib/megaco/test/megaco_codec_test_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2010. 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
diff --git a/lib/megaco/test/megaco_codec_v1_test.erl b/lib/megaco/test/megaco_codec_v1_test.erl
index 7f2af37282..3a548c4d9e 100644
--- a/lib/megaco/test/megaco_codec_v1_test.erl
+++ b/lib/megaco/test/megaco_codec_v1_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -26,6 +26,10 @@
%% ----
+-compile({no_auto_import,[error/1]}).
+
+%% ----
+
-include_lib("megaco/include/megaco.hrl").
-include_lib("megaco/include/megaco_message_v1.hrl").
-include("megaco_test_lib.hrl").
@@ -38,22 +42,16 @@
-export([t/0, t/1]).
--export([all/1,
-
- text/1,
-
- pretty/1,
+-export([all/0,groups/0,init_per_group/2,end_per_group/2,
+
pretty_test_msgs/1,
-
- compact/1,
+
compact_test_msgs/1,
-
- flex_pretty/1,
+
flex_pretty_init/1,
flex_pretty_finish/1,
flex_pretty_test_msgs/1,
-
- flex_compact/1,
+
flex_compact_init/1,
flex_compact_finish/1,
flex_compact_test_msgs/1,
@@ -63,32 +61,21 @@
flex_compact_dm_timers4/1,
flex_compact_dm_timers5/1,
flex_compact_dm_timers6/1,
-
- binary/1,
- bin/1,
bin_test_msgs/1,
-
- ber/1,
+
ber_test_msgs/1,
-
- ber_bin/1,
+
ber_bin_test_msgs/1,
-
- per/1,
+
per_test_msgs/1,
-
- per_bin/1,
+
per_bin_test_msgs/1,
-
- erl_dist/1,
- erl_dist_m/1,
+
erl_dist_m_test_msgs/1,
tickets/0,
- tickets/1,
-
- compact_tickets/1,
+
compact_otp4011_msg1/1,
compact_otp4011_msg2/1,
compact_otp4011_msg3/1,
@@ -131,8 +118,7 @@
compact_otp6017_msg01/1,
compact_otp6017_msg02/1,
compact_otp6017_msg03/1,
-
- flex_compact_tickets/1,
+
flex_compact_otp7431_msg01a/1,
flex_compact_otp7431_msg01b/1,
flex_compact_otp7431_msg02/1,
@@ -141,8 +127,7 @@
flex_compact_otp7431_msg05/1,
flex_compact_otp7431_msg06/1,
flex_compact_otp7431_msg07/1,
-
- pretty_tickets/1,
+
pretty_otp4632_msg1/1,
pretty_otp4632_msg2/1,
pretty_otp4632_msg3/1,
@@ -184,7 +169,6 @@
pretty_otp7671_msg04/1,
pretty_otp7671_msg05/1,
- flex_pretty_tickets/1,
flex_pretty_otp5042_msg1/1,
flex_pretty_otp5085_msg1/1,
flex_pretty_otp5085_msg2/1,
@@ -205,7 +189,7 @@
flex_pretty_otp7431_msg06/1,
flex_pretty_otp7431_msg07/1,
- init_per_testcase/2, fin_per_testcase/2]).
+ init_per_testcase/2, end_per_testcase/2]).
-export([display_text_messages/0, generate_text_messages/0]).
@@ -451,31 +435,6 @@ expand([Case|Cases], Acc) ->
expand(Cases, [Case|Acc])
end.
-
-%% ----
-
-tickets() ->
- Flag = process_flag(trap_exit, true),
- Cases = expand(tickets),
- Fun = fun(Case) ->
- C = init_per_testcase(Case, [{tc_timeout,
- timer:minutes(10)}]),
- io:format("Eval ~w~n", [Case]),
- Result =
- case (catch apply(?MODULE, Case, [C])) of
- {'EXIT', Reason} ->
- io:format("~n~p exited:~n ~p~n",
- [Case, Reason]),
- {error, {Case, Reason}};
- Res ->
- Res
- end,
- fin_per_testcase(Case, C),
- Result
- end,
- process_flag(trap_exit, Flag),
- lists:map(Fun, Cases).
-
%% ----
@@ -494,265 +453,210 @@ init_per_testcase(Case, Config) ->
end,
megaco_test_lib:init_per_testcase(Case, C).
-fin_per_testcase(Case, Config) ->
+end_per_testcase(Case, Config) ->
erase(verbosity),
- megaco_test_lib:fin_per_testcase(Case, Config).
+ megaco_test_lib:end_per_testcase(Case, Config).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Top test case
-all(suite) ->
- [
- text,
- binary,
- erl_dist,
- tickets
- ].
-
-text(suite) ->
- [
- pretty,
- flex_pretty,
- compact,
- flex_compact
- ].
-
-binary(suite) ->
- [
- bin,
- ber,
- ber_bin,
- per,
- per_bin
- ].
-
-erl_dist(suite) ->
- [
- erl_dist_m
- ].
-
-pretty(suite) ->
- [
- pretty_test_msgs
- ].
-
-
-compact(suite) ->
- [
- compact_test_msgs
- ].
-
-
-flex_pretty(suite) ->
- {req, [],
- {conf, flex_pretty_init, flex_pretty_cases(), flex_pretty_finish}}.
-
-flex_pretty_cases() ->
- [
- flex_pretty_test_msgs
- ].
-
-
-flex_compact(suite) ->
- {req, [],
- {conf, flex_compact_init, flex_compact_cases(), flex_compact_finish}}.
-
-flex_compact_cases() ->
- [
- flex_compact_test_msgs,
-
- flex_compact_dm_timers1,
- flex_compact_dm_timers2,
- flex_compact_dm_timers3,
- flex_compact_dm_timers4,
- flex_compact_dm_timers5,
- flex_compact_dm_timers6
- ].
-
-
-bin(suite) ->
- [
- bin_test_msgs
- ].
-
-
-ber(suite) ->
+all() ->
[
- ber_test_msgs
- ].
-
-
-ber_bin(suite) ->
- [
- ber_bin_test_msgs
- ].
-
-
-per(suite) ->
- [
- per_test_msgs
+ {group, text},
+ {group, binary},
+ {group, erl_dist},
+ {group, tickets}
].
+groups() ->
+ [{text, [], [{group, pretty},
+ {group, flex_pretty},
+ {group, compact},
+ {group, flex_compact}]},
+ {binary, [], [{group, bin},
+ {group, ber},
+ {group, ber_bin},
+ {group, per},
+ {group, per_bin}]},
+ {erl_dist, [], [{group, erl_dist_m}]},
+ {pretty, [], [pretty_test_msgs]},
+ {compact, [], [compact_test_msgs]},
+ {flex_pretty, [], flex_pretty_cases()},
+ {flex_compact, [], flex_compact_cases()},
+ {bin, [], [bin_test_msgs]},
+ {ber, [], [ber_test_msgs]},
+ {ber_bin, [], [ber_bin_test_msgs]},
+ {per, [], [per_test_msgs]},
+ {per_bin, [], [per_bin_test_msgs]},
+ {erl_dist_m, [], [erl_dist_m_test_msgs]},
+ {tickets, [], [{group, compact_tickets},
+ {group, pretty_tickets},
+ {group, flex_compact_tickets},
+ {group, flex_pretty_tickets}]},
+ {compact_tickets, [], [compact_otp4011_msg1,
+ compact_otp4011_msg2,
+ compact_otp4011_msg3,
+ compact_otp4013_msg1,
+ compact_otp4085_msg1,
+ compact_otp4085_msg2,
+ compact_otp4280_msg1,
+ compact_otp4299_msg1,
+ compact_otp4299_msg2,
+ compact_otp4359_msg1,
+ compact_otp4920_msg0,
+ compact_otp4920_msg1,
+ compact_otp4920_msg2,
+ compact_otp4920_msg3,
+ compact_otp4920_msg4,
+ compact_otp4920_msg5,
+ compact_otp4920_msg6,
+ compact_otp4920_msg7,
+ compact_otp4920_msg8,
+ compact_otp4920_msg9,
+ compact_otp4920_msg10,
+ compact_otp4920_msg11,
+ compact_otp4920_msg12,
+ compact_otp4920_msg20,
+ compact_otp4920_msg21,
+ compact_otp4920_msg22,
+ compact_otp4920_msg23,
+ compact_otp4920_msg24,
+ compact_otp4920_msg25,
+ compact_otp5186_msg01,
+ compact_otp5186_msg02,
+ compact_otp5186_msg03,
+ compact_otp5186_msg04,
+ compact_otp5186_msg05,
+ compact_otp5186_msg06,
+ compact_otp5793_msg01,
+ compact_otp5993_msg01,
+ compact_otp5993_msg02,
+ compact_otp5993_msg03,
+ compact_otp6017_msg01,
+ compact_otp6017_msg02,
+ compact_otp6017_msg03]},
+ {flex_compact_tickets, [], flex_compact_tickets_cases()},
+ {pretty_tickets, [], [pretty_otp4632_msg1,
+ pretty_otp4632_msg2,
+ pretty_otp4632_msg3,
+ pretty_otp4632_msg4,
+ pretty_otp4710_msg1,
+ pretty_otp4710_msg2,
+ pretty_otp4945_msg1,
+ pretty_otp4945_msg2,
+ pretty_otp4945_msg3,
+ pretty_otp4945_msg4,
+ pretty_otp4945_msg5,
+ pretty_otp4945_msg6,
+ pretty_otp4949_msg1,
+ pretty_otp4949_msg2,
+ pretty_otp4949_msg3,
+ pretty_otp5042_msg1,
+ pretty_otp5068_msg1,
+ pretty_otp5085_msg1,
+ pretty_otp5085_msg2,
+ pretty_otp5085_msg3,
+ pretty_otp5085_msg4,
+ pretty_otp5085_msg5,
+ pretty_otp5085_msg6,
+ pretty_otp5085_msg7,
+ pretty_otp5600_msg1,
+ pretty_otp5600_msg2,
+ pretty_otp5601_msg1,
+ pretty_otp5793_msg01,
+ pretty_otp5882_msg01,
+ pretty_otp6490_msg01,
+ pretty_otp6490_msg02,
+ pretty_otp6490_msg03,
+ pretty_otp6490_msg04,
+ pretty_otp6490_msg05,
+ pretty_otp6490_msg06,
+ pretty_otp7671_msg01,
+ pretty_otp7671_msg02,
+ pretty_otp7671_msg03,
+ pretty_otp7671_msg04,
+ pretty_otp7671_msg05]},
+ {flex_pretty_tickets, [], flex_pretty_tickets_cases()}].
+
+init_per_group(flex_pretty_tickets, Config) ->
+ flex_pretty_init(Config);
+init_per_group(flex_compact_tickets, Config) ->
+ flex_compact_init(Config);
+init_per_group(flex_compact, Config) ->
+ flex_compact_init(Config);
+init_per_group(flex_pretty, Config) ->
+ flex_pretty_init(Config);
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(flex_pretty_tickets, Config) ->
+ flex_pretty_finish(Config);
+end_per_group(flex_compact_tickets, Config) ->
+ flex_compact_finish(Config);
+end_per_group(flex_compact, Config) ->
+ flex_compact_finish(Config);
+end_per_group(flex_pretty, Config) ->
+ flex_pretty_finish(Config);
+end_per_group(_GroupName, Config) ->
+ Config.
+
+flex_pretty_cases() ->
+ [flex_pretty_test_msgs].
+
+flex_compact_cases() ->
+ [flex_compact_test_msgs, flex_compact_dm_timers1,
+ flex_compact_dm_timers2, flex_compact_dm_timers3,
+ flex_compact_dm_timers4, flex_compact_dm_timers5,
+ flex_compact_dm_timers6].
%% Support for per_bin was added to ASN.1 as of version
%% 1.3.2 (R8). And later merged into 1.3.1.3 (R7). These
%% releases are identical (as far as I know).
%%
-per_bin(suite) ->
- [
- per_bin_test_msgs
- ].
-
-erl_dist_m(suite) ->
- [
- erl_dist_m_test_msgs
- ].
-tickets(suite) ->
- [
- compact_tickets,
- pretty_tickets,
- flex_compact_tickets,
- flex_pretty_tickets
- ].
+flex_compact_tickets_cases() ->
+ [flex_compact_otp7431_msg01a,
+ flex_compact_otp7431_msg01b, flex_compact_otp7431_msg02,
+ flex_compact_otp7431_msg03, flex_compact_otp7431_msg04,
+ flex_compact_otp7431_msg05, flex_compact_otp7431_msg06,
+ flex_compact_otp7431_msg07].
+
+flex_pretty_tickets_cases() ->
+ [flex_pretty_otp5042_msg1, flex_pretty_otp5085_msg1,
+ flex_pretty_otp5085_msg2, flex_pretty_otp5085_msg3,
+ flex_pretty_otp5085_msg4, flex_pretty_otp5085_msg5,
+ flex_pretty_otp5085_msg6, flex_pretty_otp5085_msg7,
+ flex_pretty_otp5600_msg1, flex_pretty_otp5600_msg2,
+ flex_pretty_otp5601_msg1, flex_pretty_otp5793_msg01,
+ flex_pretty_otp7431_msg01, flex_pretty_otp7431_msg02,
+ flex_pretty_otp7431_msg03, flex_pretty_otp7431_msg04,
+ flex_pretty_otp7431_msg05, flex_pretty_otp7431_msg06,
+ flex_pretty_otp7431_msg07].
+%% ----
-compact_tickets(suite) ->
- [
- compact_otp4011_msg1,
- compact_otp4011_msg2,
- compact_otp4011_msg3,
- compact_otp4013_msg1,
- compact_otp4085_msg1,
- compact_otp4085_msg2,
- compact_otp4280_msg1,
- compact_otp4299_msg1,
- compact_otp4299_msg2,
- compact_otp4359_msg1,
- compact_otp4920_msg0,
- compact_otp4920_msg1,
- compact_otp4920_msg2,
- compact_otp4920_msg3,
- compact_otp4920_msg4,
- compact_otp4920_msg5,
- compact_otp4920_msg6,
- compact_otp4920_msg7,
- compact_otp4920_msg8,
- compact_otp4920_msg9,
- compact_otp4920_msg10,
- compact_otp4920_msg11,
- compact_otp4920_msg12,
- compact_otp4920_msg20,
- compact_otp4920_msg21,
- compact_otp4920_msg22,
- compact_otp4920_msg23,
- compact_otp4920_msg24,
- compact_otp4920_msg25,
- compact_otp5186_msg01,
- compact_otp5186_msg02,
- compact_otp5186_msg03,
- compact_otp5186_msg04,
- compact_otp5186_msg05,
- compact_otp5186_msg06,
- compact_otp5793_msg01,
- compact_otp5993_msg01,
- compact_otp5993_msg02,
- compact_otp5993_msg03,
- compact_otp6017_msg01,
- compact_otp6017_msg02,
- compact_otp6017_msg03
- ].
-
-flex_compact_tickets(suite) ->
- {req, [],
- {conf, flex_compact_init, flex_compact_tickets_cases(),
- flex_compact_finish}}.
-
-flex_compact_tickets_cases() ->
- [
- flex_compact_otp7431_msg01a,
- flex_compact_otp7431_msg01b,
- flex_compact_otp7431_msg02,
- flex_compact_otp7431_msg03,
- flex_compact_otp7431_msg04,
- flex_compact_otp7431_msg05,
- flex_compact_otp7431_msg06,
- flex_compact_otp7431_msg07
- ].
-
-
-pretty_tickets(suite) ->
- [
- pretty_otp4632_msg1,
- pretty_otp4632_msg2,
- pretty_otp4632_msg3,
- pretty_otp4632_msg4,
- pretty_otp4710_msg1,
- pretty_otp4710_msg2,
- pretty_otp4945_msg1,
- pretty_otp4945_msg2,
- pretty_otp4945_msg3,
- pretty_otp4945_msg4,
- pretty_otp4945_msg5,
- pretty_otp4945_msg6,
- pretty_otp4949_msg1,
- pretty_otp4949_msg2,
- pretty_otp4949_msg3,
- pretty_otp5042_msg1,
- pretty_otp5068_msg1,
- pretty_otp5085_msg1,
- pretty_otp5085_msg2,
- pretty_otp5085_msg3,
- pretty_otp5085_msg4,
- pretty_otp5085_msg5,
- pretty_otp5085_msg6,
- pretty_otp5085_msg7,
- pretty_otp5600_msg1,
- pretty_otp5600_msg2,
- pretty_otp5601_msg1,
- pretty_otp5793_msg01,
- pretty_otp5882_msg01,
- pretty_otp6490_msg01,
- pretty_otp6490_msg02,
- pretty_otp6490_msg03,
- pretty_otp6490_msg04,
- pretty_otp6490_msg05,
- pretty_otp6490_msg06,
- pretty_otp7671_msg01,
- pretty_otp7671_msg02,
- pretty_otp7671_msg03,
- pretty_otp7671_msg04,
- pretty_otp7671_msg05
- ].
-
-flex_pretty_tickets(suite) ->
- {req, [],
- {conf, flex_pretty_init, flex_pretty_tickets_cases(),
- flex_pretty_finish}}.
-
-flex_pretty_tickets_cases() ->
- [
- flex_pretty_otp5042_msg1,
- flex_pretty_otp5085_msg1,
- flex_pretty_otp5085_msg2,
- flex_pretty_otp5085_msg3,
- flex_pretty_otp5085_msg4,
- flex_pretty_otp5085_msg5,
- flex_pretty_otp5085_msg6,
- flex_pretty_otp5085_msg7,
- flex_pretty_otp5600_msg1,
- flex_pretty_otp5600_msg2,
- flex_pretty_otp5601_msg1,
- flex_pretty_otp5793_msg01,
- flex_pretty_otp7431_msg01,
- flex_pretty_otp7431_msg02,
- flex_pretty_otp7431_msg03,
- flex_pretty_otp7431_msg04,
- flex_pretty_otp7431_msg05,
- flex_pretty_otp7431_msg06,
- flex_pretty_otp7431_msg07
- ].
+tickets() ->
+ Flag = process_flag(trap_exit, true),
+ Cases = expand(tickets),
+ Fun = fun(Case) ->
+ C = init_per_testcase(Case, [{tc_timeout,
+ timer:minutes(10)}]),
+ io:format("Eval ~w~n", [Case]),
+ Result =
+ case (catch apply(?MODULE, Case, [C])) of
+ {'EXIT', Reason} ->
+ io:format("~n~p exited:~n ~p~n",
+ [Case, Reason]),
+ {error, {Case, Reason}};
+ Res ->
+ Res
+ end,
+ end_per_testcase(Case, C),
+ Result
+ end,
+ process_flag(trap_exit, Flag),
+ lists:map(Fun, Cases).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/megaco/test/megaco_codec_v2_test.erl b/lib/megaco/test/megaco_codec_v2_test.erl
index 1df1c6c93b..c3a80febba 100644
--- a/lib/megaco/test/megaco_codec_v2_test.erl
+++ b/lib/megaco/test/megaco_codec_v2_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2010. 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
@@ -37,22 +37,16 @@
-export([t/0, t/1]).
--export([all/1,
+-export([all/0,groups/0,init_per_group/2,end_per_group/2,
- text/1,
-
- pretty/1,
pretty_test_msgs/1,
- compact/1,
compact_test_msgs/1,
-
- flex_pretty/1,
+
flex_pretty_init/1,
flex_pretty_finish/1,
flex_pretty_test_msgs/1,
-
- flex_compact/1,
+
flex_compact_init/1,
flex_compact_finish/1,
flex_compact_test_msgs/1,
@@ -65,32 +59,21 @@
flex_compact_dm_timers6/1,
flex_compact_dm_timers7/1,
flex_compact_dm_timers8/1,
-
- binary/1,
- bin/1,
bin_test_msgs/1,
- ber/1,
ber_test_msgs/1,
-
- ber_bin/1,
+
ber_bin_test_msgs/1,
-
- per/1,
+
per_test_msgs/1,
-
- per_bin/1,
+
per_bin_test_msgs/1,
-
- erl_dist/1,
- erl_dist_m/1,
+
erl_dist_m_test_msgs/1,
tickets/0,
- tickets/1,
-
- compact_tickets/1,
+
compact_otp4011_msg1/1,
compact_otp4011_msg2/1,
compact_otp4011_msg3/1,
@@ -143,8 +126,7 @@
compact_otp7534_msg01/1,
compact_otp7576_msg01/1,
compact_otp7671_msg01/1,
-
- flex_compact_tickets/1,
+
flex_compact_otp7138_msg01/1,
flex_compact_otp7138_msg02/1,
flex_compact_otp7431_msg01/1,
@@ -160,8 +142,7 @@
flex_compact_otp7534_msg01/1,
flex_compact_otp7573_msg01/1,
flex_compact_otp7576_msg01/1,
-
- pretty_tickets/1,
+
pretty_otp4632_msg1/1,
pretty_otp4632_msg2/1,
pretty_otp4632_msg3/1,
@@ -204,7 +185,6 @@
pretty_otp7671_msg04/1,
pretty_otp7671_msg05/1,
- flex_pretty_tickets/1,
flex_pretty_otp5042_msg1/1,
flex_pretty_otp5085_msg1/1,
flex_pretty_otp5085_msg2/1,
@@ -225,7 +205,7 @@
flex_pretty_otp7431_msg06/1,
flex_pretty_otp7431_msg07/1,
- init_per_testcase/2, fin_per_testcase/2]).
+ init_per_testcase/2, end_per_testcase/2]).
-export([display_text_messages/0, generate_text_messages/0]).
@@ -431,31 +411,7 @@ expand([Case|Cases], Acc) ->
expand(Cases, [Case|Acc])
end.
-
-%% ----
-
-tickets() ->
- Flag = process_flag(trap_exit, true),
- Cases = expand(tickets),
- Fun = fun(Case) ->
- C = init_per_testcase(Case, [{tc_timeout,
- timer:minutes(10)}]),
- io:format("Eval ~w~n", [Case]),
- Result =
- case (catch apply(?MODULE, Case, [C])) of
- {'EXIT', Reason} ->
- io:format("~n~p exited:~n ~p~n",
- [Case, Reason]),
- {error, {Case, Reason}};
- Res ->
- Res
- end,
- fin_per_testcase(Case, C),
- Result
- end,
- process_flag(trap_exit, Flag),
- lists:map(Fun, Cases).
-
+
%% ----
@@ -474,284 +430,202 @@ init_per_testcase(Case, Config) ->
end,
megaco_test_lib:init_per_testcase(Case, C).
-fin_per_testcase(Case, Config) ->
+end_per_testcase(Case, Config) ->
erase(verbosity),
- megaco_test_lib:fin_per_testcase(Case, Config).
+ megaco_test_lib:end_per_testcase(Case, Config).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Top test case
-all(suite) ->
- [
- text,
- binary,
- erl_dist,
- tickets
- ].
-
-text(suite) ->
- [
- pretty,
- flex_pretty,
- compact,
- flex_compact
- ].
-
-binary(suite) ->
- [
- bin,
- ber,
- ber_bin,
- per,
- per_bin
- ].
-
-erl_dist(suite) ->
- [
- erl_dist_m
- ].
-
-pretty(suite) ->
- [
- pretty_test_msgs
- ].
-
-
-compact(suite) ->
- [
- compact_test_msgs
- ].
+all() ->
+[{group, text}, {group, binary}, {group, erl_dist},
+ {group, tickets}].
+
+groups() ->
+ [{text, [],
+ [{group, pretty}, {group, flex_pretty},
+ {group, compact}, {group, flex_compact}]},
+ {binary, [],
+ [{group, bin}, {group, ber}, {group, ber_bin},
+ {group, per}, {group, per_bin}]},
+ {erl_dist, [], [{group, erl_dist_m}]},
+ {pretty, [], [pretty_test_msgs]},
+ {compact, [], [compact_test_msgs]},
+ {flex_pretty, [], flex_pretty_cases()},
+ {flex_compact, [], flex_compact_cases()},
+ {bin, [], [bin_test_msgs]}, {ber, [], [ber_test_msgs]},
+ {ber_bin, [], [ber_bin_test_msgs]},
+ {per, [], [per_test_msgs]},
+ {per_bin, [], [per_bin_test_msgs]},
+ {erl_dist_m, [], [erl_dist_m_test_msgs]},
+ {tickets, [],
+ [{group, compact_tickets}, {group, pretty_tickets},
+ {group, flex_compact_tickets},
+ {group, flex_pretty_tickets}]},
+ {compact_tickets, [],
+ [compact_otp4011_msg1, compact_otp4011_msg2,
+ compact_otp4011_msg3, compact_otp4013_msg1,
+ compact_otp4085_msg1, compact_otp4085_msg2,
+ compact_otp4280_msg1, compact_otp4299_msg1,
+ compact_otp4299_msg2, compact_otp4359_msg1,
+ compact_otp4920_msg0, compact_otp4920_msg1,
+ compact_otp4920_msg2, compact_otp4920_msg3,
+ compact_otp4920_msg4, compact_otp4920_msg5,
+ compact_otp4920_msg6, compact_otp4920_msg7,
+ compact_otp4920_msg8, compact_otp4920_msg9,
+ compact_otp4920_msg10, compact_otp4920_msg11,
+ compact_otp4920_msg12, compact_otp4920_msg20,
+ compact_otp4920_msg21, compact_otp4920_msg22,
+ compact_otp4920_msg23, compact_otp4920_msg24,
+ compact_otp4920_msg25, compact_otp5186_msg01,
+ compact_otp5186_msg02, compact_otp5186_msg03,
+ compact_otp5186_msg04, compact_otp5186_msg05,
+ compact_otp5186_msg06, compact_otp5290_msg01,
+ compact_otp5290_msg02, compact_otp5793_msg01,
+ compact_otp5993_msg01, compact_otp5993_msg02,
+ compact_otp5993_msg03, compact_otp6017_msg01,
+ compact_otp6017_msg02, compact_otp6017_msg03,
+ compact_otp7138_msg01, compact_otp7138_msg02,
+ compact_otp7457_msg01, compact_otp7457_msg02,
+ compact_otp7457_msg03, compact_otp7534_msg01,
+ compact_otp7576_msg01, compact_otp7671_msg01]},
+ {flex_compact_tickets, [],
+ flex_compact_tickets_cases()},
+ {pretty_tickets, [],
+ [pretty_otp4632_msg1, pretty_otp4632_msg2,
+ pretty_otp4632_msg3, pretty_otp4632_msg4,
+ pretty_otp4710_msg1, pretty_otp4710_msg2,
+ pretty_otp4945_msg1, pretty_otp4945_msg2,
+ pretty_otp4945_msg3, pretty_otp4945_msg4,
+ pretty_otp4945_msg5, pretty_otp4945_msg6,
+ pretty_otp4949_msg1, pretty_otp4949_msg2,
+ pretty_otp4949_msg3, pretty_otp5042_msg1,
+ pretty_otp5068_msg1, pretty_otp5085_msg1,
+ pretty_otp5085_msg2, pretty_otp5085_msg3,
+ pretty_otp5085_msg4, pretty_otp5085_msg5,
+ pretty_otp5085_msg6, pretty_otp5085_msg7,
+ pretty_otp5600_msg1, pretty_otp5600_msg2,
+ pretty_otp5601_msg1, pretty_otp5793_msg01,
+ pretty_otp5882_msg01, pretty_otp6490_msg01,
+ pretty_otp6490_msg02, pretty_otp6490_msg03,
+ pretty_otp6490_msg04, pretty_otp6490_msg05,
+ pretty_otp6490_msg06, pretty_otp7249_msg01,
+ pretty_otp7671_msg01, pretty_otp7671_msg02,
+ pretty_otp7671_msg03, pretty_otp7671_msg04,
+ pretty_otp7671_msg05]},
+ {flex_pretty_tickets, [], flex_pretty_tickets_cases()}].
+
+init_per_group(flex_pretty_tickets, Config) ->
+ flex_pretty_init(Config);
+init_per_group(flex_compact_tickets, Config) ->
+ flex_compact_init(Config);
+init_per_group(flex_compact, Config) ->
+ flex_compact_init(Config);
+init_per_group(flex_pretty, Config) ->
+ flex_pretty_init(Config);
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(flex_pretty_tickets, Config) ->
+ flex_pretty_finish(Config);
+end_per_group(flex_compact_tickets, Config) ->
+ flex_compact_finish(Config);
+end_per_group(flex_compact, Config) ->
+ flex_compact_finish(Config);
+end_per_group(flex_pretty, Config) ->
+ flex_pretty_finish(Config);
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+
+
+
+
+
+
+
+
+flex_pretty_cases() ->
+[flex_pretty_test_msgs].
+
+
+flex_compact_cases() ->
+[flex_compact_test_msgs, flex_compact_dm_timers1,
+ flex_compact_dm_timers2, flex_compact_dm_timers3,
+ flex_compact_dm_timers4, flex_compact_dm_timers5,
+ flex_compact_dm_timers6, flex_compact_dm_timers7,
+ flex_compact_dm_timers8].
-flex_pretty(suite) ->
- {req, [],
- {conf, flex_pretty_init, flex_pretty_cases(), flex_pretty_finish}}.
-flex_pretty_cases() ->
- [
- flex_pretty_test_msgs
- ].
-flex_compact(suite) ->
- {req, [],
- {conf, flex_compact_init, flex_compact_cases(), flex_compact_finish}}.
-flex_compact_cases() ->
- [
- flex_compact_test_msgs,
- flex_compact_dm_timers1,
- flex_compact_dm_timers2,
- flex_compact_dm_timers3,
- flex_compact_dm_timers4,
- flex_compact_dm_timers5,
- flex_compact_dm_timers6,
- flex_compact_dm_timers7,
- flex_compact_dm_timers8
- ].
-bin(suite) ->
- [
- bin_test_msgs
- ].
-ber(suite) ->
- [
- ber_test_msgs
- ].
-
-
-ber_bin(suite) ->
- [
- ber_bin_test_msgs
- ].
-
-
-per(suite) ->
- [
- per_test_msgs
- ].
-
%% Support for per_bin was added to ASN.1 as of version
%% 1.3.2 (R8). And later merged into 1.3.1.3 (R7). These
%% releases are identical (as far as I know).
%%
-per_bin(suite) ->
- [
- per_bin_test_msgs
- ].
-erl_dist_m(suite) ->
- [
- erl_dist_m_test_msgs
- ].
-tickets(suite) ->
- [
- compact_tickets,
- pretty_tickets,
- flex_compact_tickets,
- flex_pretty_tickets
- ].
-compact_tickets(suite) ->
- [
- compact_otp4011_msg1,
- compact_otp4011_msg2,
- compact_otp4011_msg3,
- compact_otp4013_msg1,
- compact_otp4085_msg1,
- compact_otp4085_msg2,
- compact_otp4280_msg1,
- compact_otp4299_msg1,
- compact_otp4299_msg2,
- compact_otp4359_msg1,
- compact_otp4920_msg0,
- compact_otp4920_msg1,
- compact_otp4920_msg2,
- compact_otp4920_msg3,
- compact_otp4920_msg4,
- compact_otp4920_msg5,
- compact_otp4920_msg6,
- compact_otp4920_msg7,
- compact_otp4920_msg8,
- compact_otp4920_msg9,
- compact_otp4920_msg10,
- compact_otp4920_msg11,
- compact_otp4920_msg12,
- compact_otp4920_msg20,
- compact_otp4920_msg21,
- compact_otp4920_msg22,
- compact_otp4920_msg23,
- compact_otp4920_msg24,
- compact_otp4920_msg25,
- compact_otp5186_msg01,
- compact_otp5186_msg02,
- compact_otp5186_msg03,
- compact_otp5186_msg04,
- compact_otp5186_msg05,
- compact_otp5186_msg06,
- compact_otp5290_msg01,
- compact_otp5290_msg02,
- compact_otp5793_msg01,
- compact_otp5993_msg01,
- compact_otp5993_msg02,
- compact_otp5993_msg03,
- compact_otp6017_msg01,
- compact_otp6017_msg02,
- compact_otp6017_msg03,
- compact_otp7138_msg01,
- compact_otp7138_msg02,
- compact_otp7457_msg01,
- compact_otp7457_msg02,
- compact_otp7457_msg03,
- compact_otp7534_msg01,
- compact_otp7576_msg01,
- compact_otp7671_msg01
- ].
-flex_compact_tickets(suite) ->
- {req, [],
- {conf, flex_compact_init, flex_compact_tickets_cases(),
- flex_compact_finish}}.
-flex_compact_tickets_cases() ->
- [
- flex_compact_otp7138_msg01,
- flex_compact_otp7138_msg02,
- flex_compact_otp7431_msg01,
- flex_compact_otp7431_msg02,
- flex_compact_otp7431_msg03,
- flex_compact_otp7431_msg04,
- flex_compact_otp7431_msg05,
- flex_compact_otp7431_msg06,
- flex_compact_otp7431_msg07,
- flex_compact_otp7138_msg02,
- flex_compact_otp7457_msg01,
- flex_compact_otp7457_msg02,
- flex_compact_otp7457_msg03,
- flex_compact_otp7534_msg01,
- flex_compact_otp7573_msg01,
- flex_compact_otp7576_msg01
- ].
+flex_compact_tickets_cases() ->
+[flex_compact_otp7138_msg01, flex_compact_otp7138_msg02,
+ flex_compact_otp7431_msg01, flex_compact_otp7431_msg02,
+ flex_compact_otp7431_msg03, flex_compact_otp7431_msg04,
+ flex_compact_otp7431_msg05, flex_compact_otp7431_msg06,
+ flex_compact_otp7431_msg07, flex_compact_otp7138_msg02,
+ flex_compact_otp7457_msg01, flex_compact_otp7457_msg02,
+ flex_compact_otp7457_msg03, flex_compact_otp7534_msg01,
+ flex_compact_otp7573_msg01, flex_compact_otp7576_msg01].
-pretty_tickets(suite) ->
- [
- pretty_otp4632_msg1,
- pretty_otp4632_msg2,
- pretty_otp4632_msg3,
- pretty_otp4632_msg4,
- pretty_otp4710_msg1,
- pretty_otp4710_msg2,
- pretty_otp4945_msg1,
- pretty_otp4945_msg2,
- pretty_otp4945_msg3,
- pretty_otp4945_msg4,
- pretty_otp4945_msg5,
- pretty_otp4945_msg6,
- pretty_otp4949_msg1,
- pretty_otp4949_msg2,
- pretty_otp4949_msg3,
- pretty_otp5042_msg1,
- pretty_otp5068_msg1,
- pretty_otp5085_msg1,
- pretty_otp5085_msg2,
- pretty_otp5085_msg3,
- pretty_otp5085_msg4,
- pretty_otp5085_msg5,
- pretty_otp5085_msg6,
- pretty_otp5085_msg7,
- pretty_otp5600_msg1,
- pretty_otp5600_msg2,
- pretty_otp5601_msg1,
- pretty_otp5793_msg01,
- pretty_otp5882_msg01,
- pretty_otp6490_msg01,
- pretty_otp6490_msg02,
- pretty_otp6490_msg03,
- pretty_otp6490_msg04,
- pretty_otp6490_msg05,
- pretty_otp6490_msg06,
- pretty_otp7249_msg01,
- pretty_otp7671_msg01,
- pretty_otp7671_msg02,
- pretty_otp7671_msg03,
- pretty_otp7671_msg04,
- pretty_otp7671_msg05
- ].
-flex_pretty_tickets(suite) ->
- {req, [],
- {conf, flex_pretty_init, flex_pretty_tickets_cases(),
- flex_pretty_finish}}.
-flex_pretty_tickets_cases() ->
- [
- flex_pretty_otp5042_msg1,
- flex_pretty_otp5085_msg1,
- flex_pretty_otp5085_msg2,
- flex_pretty_otp5085_msg3,
- flex_pretty_otp5085_msg4,
- flex_pretty_otp5085_msg5,
- flex_pretty_otp5085_msg6,
- flex_pretty_otp5085_msg7,
- flex_pretty_otp5600_msg1,
- flex_pretty_otp5600_msg2,
- flex_pretty_otp5601_msg1,
- flex_pretty_otp5793_msg01,
- flex_pretty_otp7431_msg01,
- flex_pretty_otp7431_msg02,
- flex_pretty_otp7431_msg03,
- flex_pretty_otp7431_msg04,
- flex_pretty_otp7431_msg05,
- flex_pretty_otp7431_msg06,
- flex_pretty_otp7431_msg07
- ].
+flex_pretty_tickets_cases() ->
+[flex_pretty_otp5042_msg1, flex_pretty_otp5085_msg1,
+ flex_pretty_otp5085_msg2, flex_pretty_otp5085_msg3,
+ flex_pretty_otp5085_msg4, flex_pretty_otp5085_msg5,
+ flex_pretty_otp5085_msg6, flex_pretty_otp5085_msg7,
+ flex_pretty_otp5600_msg1, flex_pretty_otp5600_msg2,
+ flex_pretty_otp5601_msg1, flex_pretty_otp5793_msg01,
+ flex_pretty_otp7431_msg01, flex_pretty_otp7431_msg02,
+ flex_pretty_otp7431_msg03, flex_pretty_otp7431_msg04,
+ flex_pretty_otp7431_msg05, flex_pretty_otp7431_msg06,
+ flex_pretty_otp7431_msg07].
+
+%% ----
+
+tickets() ->
+ Flag = process_flag(trap_exit, true),
+ Cases = expand(tickets),
+ Fun = fun(Case) ->
+ C = init_per_testcase(Case, [{tc_timeout,
+ timer:minutes(10)}]),
+ io:format("Eval ~w~n", [Case]),
+ Result =
+ case (catch apply(?MODULE, Case, [C])) of
+ {'EXIT', Reason} ->
+ io:format("~n~p exited:~n ~p~n",
+ [Case, Reason]),
+ {error, {Case, Reason}};
+ Res ->
+ Res
+ end,
+ end_per_testcase(Case, C),
+ Result
+ end,
+ process_flag(trap_exit, Flag),
+ lists:map(Fun, Cases).
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/megaco/test/megaco_codec_v3_test.erl b/lib/megaco/test/megaco_codec_v3_test.erl
index f49c3a677a..2c35ce13b3 100644
--- a/lib/megaco/test/megaco_codec_v3_test.erl
+++ b/lib/megaco/test/megaco_codec_v3_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2010. 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
@@ -37,26 +37,15 @@
-export([t/0, t/1]).
--export([all/1,
-
- text/1,
-
- pretty/1,
+-export([all/0,groups/0,init_per_group/2,end_per_group/2,
pretty_test_msgs/1,
-
- compact/1,
compact_test_msgs/1,
-
- flex_pretty/1,
flex_pretty_init/1,
flex_pretty_finish/1,
flex_pretty_test_msgs/1,
-
- flex_compact/1,
flex_compact_init/1,
flex_compact_finish/1,
flex_compact_test_msgs/1,
-
flex_compact_dm_timers1/1,
flex_compact_dm_timers2/1,
flex_compact_dm_timers3/1,
@@ -65,32 +54,15 @@
flex_compact_dm_timers6/1,
flex_compact_dm_timers7/1,
flex_compact_dm_timers8/1,
-
- binary/1,
-
- bin/1,
bin_test_msgs/1,
-
- ber/1,
ber_test_msgs/1,
-
- ber_bin/1,
ber_bin_test_msgs/1,
-
- per/1,
per_test_msgs/1,
-
- per_bin/1,
per_bin_test_msgs/1,
-
- erl_dist/1,
- erl_dist_m/1,
erl_dist_m_test_msgs/1,
tickets/0,
- tickets/1,
-
- compact_tickets/1,
+
compact_otp4011_msg1/1,
compact_otp4011_msg2/1,
compact_otp4011_msg3/1,
@@ -133,8 +105,7 @@
compact_otp6017_msg01/1,
compact_otp6017_msg02/1,
compact_otp6017_msg03/1,
-
- flex_compact_tickets/1,
+
flex_compact_otp4299_msg1/1,
flex_compact_otp7431_msg01/1,
flex_compact_otp7431_msg02/1,
@@ -143,9 +114,7 @@
flex_compact_otp7431_msg05/1,
flex_compact_otp7431_msg06/1,
flex_compact_otp7431_msg07/1,
-
-
- pretty_tickets/1,
+
pretty_otp4632_msg1/1,
pretty_otp4632_msg2/1,
pretty_otp4632_msg3/1,
@@ -192,8 +161,7 @@
pretty_otp7671_msg04/1,
pretty_otp7671_msg05/1,
pretty_otp8114_msg01/1,
-
- flex_pretty_tickets/1,
+
flex_pretty_otp5042_msg1/1,
flex_pretty_otp5085_msg1/1,
flex_pretty_otp5085_msg2/1,
@@ -219,7 +187,7 @@
flex_pretty_otp7431_msg06/1,
flex_pretty_otp7431_msg07/1,
- init_per_testcase/2, fin_per_testcase/2]).
+ init_per_testcase/2, end_per_testcase/2]).
-export([display_text_messages/0, generate_text_messages/0]).
@@ -285,31 +253,6 @@ expand([Case|Cases], Acc) ->
expand(Cases, [Case|Acc])
end.
-
-%% ----
-
-tickets() ->
- Flag = process_flag(trap_exit, true),
- Cases = expand(tickets),
- Fun = fun(Case) ->
- C = init_per_testcase(Case, [{tc_timeout,
- timer:minutes(10)}]),
- io:format("Eval ~w~n", [Case]),
- Result =
- case (catch apply(?MODULE, Case, [C])) of
- {'EXIT', Reason} ->
- io:format("~n~p exited:~n ~p~n",
- [Case, Reason]),
- {error, {Case, Reason}};
- Res ->
- Res
- end,
- fin_per_testcase(Case, C),
- Result
- end,
- process_flag(trap_exit, Flag),
- lists:map(Fun, Cases).
-
%% ----
@@ -328,279 +271,174 @@ init_per_testcase(Case, Config) ->
end,
megaco_test_lib:init_per_testcase(Case, C).
-fin_per_testcase(Case, Config) ->
+end_per_testcase(Case, Config) ->
erase(verbosity),
- megaco_test_lib:fin_per_testcase(Case, Config).
+ megaco_test_lib:end_per_testcase(Case, Config).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Top test case
-all(suite) ->
- [
- text,
- binary,
- erl_dist,
- tickets
- ].
-
-text(suite) ->
- [
- pretty,
- flex_pretty,
- compact,
- flex_compact
- ].
-
-binary(suite) ->
- [
- bin,
- ber,
- ber_bin,
- per,
- per_bin
- ].
-
-erl_dist(suite) ->
- [
- erl_dist_m
- ].
-
-pretty(suite) ->
- [
- pretty_test_msgs
- ].
-
-
-compact(suite) ->
- [
- compact_test_msgs
- ].
-
-
-flex_pretty(suite) ->
- {req, [],
- {conf, flex_pretty_init, flex_pretty_cases(), flex_pretty_finish}}.
+all() ->
+ [{group, text}, {group, binary}, {group, erl_dist},
+ {group, tickets}].
+
+groups() ->
+ [{text, [],
+ [{group, pretty}, {group, flex_pretty},
+ {group, compact}, {group, flex_compact}]},
+ {binary, [],
+ [{group, bin}, {group, ber}, {group, ber_bin},
+ {group, per}, {group, per_bin}]},
+ {erl_dist, [], [{group, erl_dist_m}]},
+ {pretty, [], [pretty_test_msgs]},
+ {compact, [], [compact_test_msgs]},
+ {flex_pretty, [], flex_pretty_cases()},
+ {flex_compact, [], flex_compact_cases()},
+ {bin, [], [bin_test_msgs]}, {ber, [], [ber_test_msgs]},
+ {ber_bin, [], [ber_bin_test_msgs]},
+ {per, [], [per_test_msgs]},
+ {per_bin, [], [per_bin_test_msgs]},
+ {erl_dist_m, [], [erl_dist_m_test_msgs]},
+ {tickets, [],
+ [{group, compact_tickets},
+ {group, flex_compact_tickets}, {group, pretty_tickets},
+ {group, flex_pretty_tickets}]},
+ {compact_tickets, [],
+ [compact_otp4011_msg1, compact_otp4011_msg2,
+ compact_otp4011_msg3, compact_otp4013_msg1,
+ compact_otp4085_msg1, compact_otp4085_msg2,
+ compact_otp4280_msg1, compact_otp4299_msg1,
+ compact_otp4359_msg1, compact_otp4920_msg0,
+ compact_otp4920_msg1, compact_otp4920_msg2,
+ compact_otp4920_msg3, compact_otp4920_msg4,
+ compact_otp4920_msg5, compact_otp4920_msg6,
+ compact_otp4920_msg7, compact_otp4920_msg8,
+ compact_otp4920_msg9, compact_otp4920_msg10,
+ compact_otp4920_msg11, compact_otp4920_msg12,
+ compact_otp4920_msg20, compact_otp4920_msg21,
+ compact_otp4920_msg22, compact_otp4920_msg23,
+ compact_otp4920_msg24, compact_otp4920_msg25,
+ compact_otp5186_msg01, compact_otp5186_msg02,
+ compact_otp5186_msg03, compact_otp5186_msg04,
+ compact_otp5186_msg05, compact_otp5186_msg06,
+ compact_otp5793_msg01, compact_otp5836_msg01,
+ compact_otp5993_msg01, compact_otp5993_msg02,
+ compact_otp5993_msg03, compact_otp6017_msg01,
+ compact_otp6017_msg02, compact_otp6017_msg03]},
+ {flex_compact_tickets, [],
+ flex_compact_tickets_cases()},
+ {pretty_tickets, [],
+ [pretty_otp4632_msg1, pretty_otp4632_msg2,
+ pretty_otp4632_msg3, pretty_otp4632_msg4,
+ pretty_otp4710_msg1, pretty_otp4710_msg2,
+ pretty_otp4945_msg1, pretty_otp4945_msg2,
+ pretty_otp4945_msg3, pretty_otp4945_msg4,
+ pretty_otp4945_msg5, pretty_otp4945_msg6,
+ pretty_otp4949_msg1, pretty_otp4949_msg2,
+ pretty_otp4949_msg3, pretty_otp5042_msg1,
+ pretty_otp5068_msg1, pretty_otp5085_msg1,
+ pretty_otp5085_msg2, pretty_otp5085_msg3,
+ pretty_otp5085_msg4, pretty_otp5085_msg5,
+ pretty_otp5085_msg6, pretty_otp5085_msg7,
+ pretty_otp5085_msg8, pretty_otp5600_msg1,
+ pretty_otp5600_msg2, pretty_otp5601_msg1,
+ pretty_otp5793_msg01, pretty_otp5803_msg01,
+ pretty_otp5803_msg02, pretty_otp5805_msg01,
+ pretty_otp5836_msg01, pretty_otp5882_msg01,
+ pretty_otp6490_msg01, pretty_otp6490_msg02,
+ pretty_otp6490_msg03, pretty_otp6490_msg04,
+ pretty_otp6490_msg05, pretty_otp6490_msg06,
+ pretty_otp7671_msg01, pretty_otp7671_msg02,
+ pretty_otp7671_msg03, pretty_otp7671_msg04,
+ pretty_otp7671_msg05, pretty_otp8114_msg01]},
+ {flex_pretty_tickets, [], flex_pretty_tickets_cases()}].
+
+init_per_group(flex_pretty_tickets, Config) ->
+ flex_pretty_init(Config);
+init_per_group(flex_compact_tickets, Config) ->
+ flex_compact_init(Config);
+init_per_group(flex_compact, Config) ->
+ flex_compact_init(Config);
+init_per_group(flex_pretty, Config) ->
+ flex_pretty_init(Config);
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(flex_pretty_tickets, Config) ->
+ flex_pretty_finish(Config);
+end_per_group(flex_compact_tickets, Config) ->
+ flex_compact_finish(Config);
+end_per_group(flex_compact, Config) ->
+ flex_compact_finish(Config);
+end_per_group(flex_pretty, Config) ->
+ flex_pretty_finish(Config);
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+flex_pretty_cases() ->
+ [flex_pretty_test_msgs].
+
+
+flex_compact_cases() ->
+ [flex_compact_test_msgs, flex_compact_dm_timers1,
+ flex_compact_dm_timers2, flex_compact_dm_timers3,
+ flex_compact_dm_timers4, flex_compact_dm_timers5,
+ flex_compact_dm_timers6, flex_compact_dm_timers7,
+ flex_compact_dm_timers8].
-flex_pretty_cases() ->
- [
- flex_pretty_test_msgs
- ].
-
-flex_compact(suite) ->
- {req, [],
- {conf, flex_compact_init, flex_compact_cases(), flex_compact_finish}}.
-
-flex_compact_cases() ->
- [
- flex_compact_test_msgs,
- flex_compact_dm_timers1,
- flex_compact_dm_timers2,
- flex_compact_dm_timers3,
- flex_compact_dm_timers4,
- flex_compact_dm_timers5,
- flex_compact_dm_timers6,
- flex_compact_dm_timers7,
- flex_compact_dm_timers8
- ].
-
-
-bin(suite) ->
- [
- bin_test_msgs
- ].
-
-
-ber(suite) ->
- [
- ber_test_msgs
- ].
-
-
-ber_bin(suite) ->
- [
- ber_bin_test_msgs
- ].
-
-
-per(suite) ->
- [
- per_test_msgs
- ].
%% Support for per_bin was added to ASN.1 as of version
%% 1.3.2 (R8). And later merged into 1.3.1.3 (R7). These
%% releases are identical (as far as I know).
%%
-per_bin(suite) ->
- [
- per_bin_test_msgs
- ].
-
-
-erl_dist_m(suite) ->
- [
- erl_dist_m_test_msgs
- ].
-
-tickets(suite) ->
- [
- compact_tickets,
- flex_compact_tickets,
- pretty_tickets,
- flex_pretty_tickets
- ].
-
-
-compact_tickets(suite) ->
- [
- compact_otp4011_msg1,
- compact_otp4011_msg2,
- compact_otp4011_msg3,
- compact_otp4013_msg1,
- compact_otp4085_msg1,
- compact_otp4085_msg2,
- compact_otp4280_msg1,
- compact_otp4299_msg1,
- compact_otp4359_msg1,
- compact_otp4920_msg0,
- compact_otp4920_msg1,
- compact_otp4920_msg2,
- compact_otp4920_msg3,
- compact_otp4920_msg4,
- compact_otp4920_msg5,
- compact_otp4920_msg6,
- compact_otp4920_msg7,
- compact_otp4920_msg8,
- compact_otp4920_msg9,
- compact_otp4920_msg10,
- compact_otp4920_msg11,
- compact_otp4920_msg12,
- compact_otp4920_msg20,
- compact_otp4920_msg21,
- compact_otp4920_msg22,
- compact_otp4920_msg23,
- compact_otp4920_msg24,
- compact_otp4920_msg25,
- compact_otp5186_msg01,
- compact_otp5186_msg02,
- compact_otp5186_msg03,
- compact_otp5186_msg04,
- compact_otp5186_msg05,
- compact_otp5186_msg06,
- compact_otp5793_msg01,
- compact_otp5836_msg01,
- compact_otp5993_msg01,
- compact_otp5993_msg02,
- compact_otp5993_msg03,
- compact_otp6017_msg01,
- compact_otp6017_msg02,
- compact_otp6017_msg03
- ].
-flex_compact_tickets(suite) ->
- {req, [],
- {conf, flex_compact_init, flex_compact_tickets_cases(),
- flex_compact_finish}}.
-
-flex_compact_tickets_cases() ->
- [
- flex_compact_otp4299_msg1,
- flex_compact_otp7431_msg01,
- flex_compact_otp7431_msg02,
- flex_compact_otp7431_msg03,
- flex_compact_otp7431_msg04,
- flex_compact_otp7431_msg05,
- flex_compact_otp7431_msg06,
- flex_compact_otp7431_msg07
- ].
-
-
-pretty_tickets(suite) ->
- [
- pretty_otp4632_msg1,
- pretty_otp4632_msg2,
- pretty_otp4632_msg3,
- pretty_otp4632_msg4,
- pretty_otp4710_msg1,
- pretty_otp4710_msg2,
- pretty_otp4945_msg1,
- pretty_otp4945_msg2,
- pretty_otp4945_msg3,
- pretty_otp4945_msg4,
- pretty_otp4945_msg5,
- pretty_otp4945_msg6,
- pretty_otp4949_msg1,
- pretty_otp4949_msg2,
- pretty_otp4949_msg3,
- pretty_otp5042_msg1,
- pretty_otp5068_msg1,
- pretty_otp5085_msg1,
- pretty_otp5085_msg2,
- pretty_otp5085_msg3,
- pretty_otp5085_msg4,
- pretty_otp5085_msg5,
- pretty_otp5085_msg6,
- pretty_otp5085_msg7,
- pretty_otp5085_msg8,
- pretty_otp5600_msg1,
- pretty_otp5600_msg2,
- pretty_otp5601_msg1,
- pretty_otp5793_msg01,
- pretty_otp5803_msg01,
- pretty_otp5803_msg02,
- pretty_otp5805_msg01,
- pretty_otp5836_msg01,
- pretty_otp5882_msg01,
- pretty_otp6490_msg01,
- pretty_otp6490_msg02,
- pretty_otp6490_msg03,
- pretty_otp6490_msg04,
- pretty_otp6490_msg05,
- pretty_otp6490_msg06,
- pretty_otp7671_msg01,
- pretty_otp7671_msg02,
- pretty_otp7671_msg03,
- pretty_otp7671_msg04,
- pretty_otp7671_msg05,
- pretty_otp8114_msg01
- ].
+flex_compact_tickets_cases() ->
+ [flex_compact_otp4299_msg1, flex_compact_otp7431_msg01,
+ flex_compact_otp7431_msg02, flex_compact_otp7431_msg03,
+ flex_compact_otp7431_msg04, flex_compact_otp7431_msg05,
+ flex_compact_otp7431_msg06, flex_compact_otp7431_msg07].
+
+flex_pretty_tickets_cases() ->
+ [flex_pretty_otp5042_msg1, flex_pretty_otp5085_msg1,
+ flex_pretty_otp5085_msg2, flex_pretty_otp5085_msg3,
+ flex_pretty_otp5085_msg4, flex_pretty_otp5085_msg5,
+ flex_pretty_otp5085_msg6, flex_pretty_otp5085_msg7,
+ flex_pretty_otp5085_msg8, flex_pretty_otp5600_msg1,
+ flex_pretty_otp5600_msg2, flex_pretty_otp5601_msg1,
+ flex_pretty_otp5793_msg01, flex_pretty_otp5803_msg01,
+ flex_pretty_otp5803_msg02, flex_pretty_otp5805_msg01,
+ flex_pretty_otp5836_msg01, flex_pretty_otp7431_msg01,
+ flex_pretty_otp7431_msg02, flex_pretty_otp7431_msg03,
+ flex_pretty_otp7431_msg04, flex_pretty_otp7431_msg05,
+ flex_pretty_otp7431_msg06, flex_pretty_otp7431_msg07].
+%% ----
-flex_pretty_tickets(suite) ->
- {req, [],
- {conf, flex_pretty_init, flex_pretty_tickets_cases(),
- flex_pretty_finish}}.
-
-flex_pretty_tickets_cases() ->
- [
- flex_pretty_otp5042_msg1,
- flex_pretty_otp5085_msg1,
- flex_pretty_otp5085_msg2,
- flex_pretty_otp5085_msg3,
- flex_pretty_otp5085_msg4,
- flex_pretty_otp5085_msg5,
- flex_pretty_otp5085_msg6,
- flex_pretty_otp5085_msg7,
- flex_pretty_otp5085_msg8,
- flex_pretty_otp5600_msg1,
- flex_pretty_otp5600_msg2,
- flex_pretty_otp5601_msg1,
- flex_pretty_otp5793_msg01,
- flex_pretty_otp5803_msg01,
- flex_pretty_otp5803_msg02,
- flex_pretty_otp5805_msg01,
- flex_pretty_otp5836_msg01,
- flex_pretty_otp7431_msg01,
- flex_pretty_otp7431_msg02,
- flex_pretty_otp7431_msg03,
- flex_pretty_otp7431_msg04,
- flex_pretty_otp7431_msg05,
- flex_pretty_otp7431_msg06,
- flex_pretty_otp7431_msg07
- ].
+tickets() ->
+ Flag = process_flag(trap_exit, true),
+ Cases = expand(tickets),
+ Fun = fun(Case) ->
+ C = init_per_testcase(Case, [{tc_timeout,
+ timer:minutes(10)}]),
+ io:format("Eval ~w~n", [Case]),
+ Result =
+ case (catch apply(?MODULE, Case, [C])) of
+ {'EXIT', Reason} ->
+ io:format("~n~p exited:~n ~p~n",
+ [Case, Reason]),
+ {error, {Case, Reason}};
+ Res ->
+ Res
+ end,
+ end_per_testcase(Case, C),
+ Result
+ end,
+ process_flag(trap_exit, Flag),
+ lists:map(Fun, Cases).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/megaco/test/megaco_config_test.erl b/lib/megaco/test/megaco_config_test.erl
index 9ab1a7d90d..1fc4d09d3b 100644
--- a/lib/megaco/test/megaco_config_test.erl
+++ b/lib/megaco/test/megaco_config_test.erl
@@ -44,9 +44,9 @@ do_init_per_testcase(Case, Config) ->
process_flag(trap_exit, true),
megaco_test_lib:init_per_testcase(Case, Config).
-fin_per_testcase(Case, Config) ->
+end_per_testcase(Case, Config) ->
process_flag(trap_exit, false),
- megaco_test_lib:fin_per_testcase(Case, Config).
+ megaco_test_lib:end_per_testcase(Case, Config).
-record(command, {id, desc, cmd, verify}).
@@ -58,25 +58,21 @@ fin_per_testcase(Case, Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Top test case
-all(suite) ->
- [
- config,
- transaction_id_counter,
- tickets
- ].
-
-transaction_id_counter(suite) ->
- [
- transaction_id_counter_mg,
- transaction_id_counter_mgc
- ].
-
-tickets(suite) ->
- [
- otp_7216,
- otp_8167,
- otp_8183
- ].
+all() ->
+ [config, {group, transaction_id_counter},
+ {group, tickets}].
+
+groups() ->
+ [{transaction_id_counter, [],
+ [transaction_id_counter_mg,
+ transaction_id_counter_mgc]},
+ {tickets, [], [otp_7216, otp_8167, otp_8183]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/megaco/test/megaco_digit_map_test.erl b/lib/megaco/test/megaco_digit_map_test.erl
index 22e115278f..d16fb679ae 100644
--- a/lib/megaco/test/megaco_digit_map_test.erl
+++ b/lib/megaco/test/megaco_digit_map_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
@@ -36,54 +36,39 @@ t(Case) -> megaco_test_lib:t({?MODULE, Case}).
init_per_testcase(Case, Config) ->
megaco_test_lib:init_per_testcase(Case, Config).
-fin_per_testcase(Case, Config) ->
- megaco_test_lib:fin_per_testcase(Case, Config).
+end_per_testcase(Case, Config) ->
+ megaco_test_lib:end_per_testcase(Case, Config).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) ->
- Cases =
- [
- tickets
- ],
- Cases.
+all() ->
+ [{group, tickets}].
+
+groups() ->
+ [{tickets, [],
+ [{group, otp_5750}, {group, otp_5799},
+ {group, otp_5826}, {group, otp_7449}]},
+ {otp_5750, [], [otp_5750_01, otp_5750_02]},
+ {otp_5799, [], [otp_5799_01]},
+ {otp_5826, [], [otp_5826_01, otp_5826_02, otp_5826_03]},
+ {otp_7449, [], [otp_7449_1, otp_7449_2]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-tickets(suite) ->
- [
- otp_5750,
- otp_5799,
- otp_5826,
- otp_7449
- ].
-
-
-otp_5750(suite) ->
- [
- otp_5750_01,
- otp_5750_02
- ].
-
-otp_5799(suite) ->
- [
- otp_5799_01
- ].
-
-otp_5826(suite) ->
- [
- otp_5826_01,
- otp_5826_02,
- otp_5826_03
- ].
-
-otp_7449(suite) ->
- [
- otp_7449_1,
- otp_7449_2
- ].
+
+
+
+
+
diff --git a/lib/megaco/test/megaco_examples_test.erl b/lib/megaco/test/megaco_examples_test.erl
index ef15cb1bde..528b61c2af 100644
--- a/lib/megaco/test/megaco_examples_test.erl
+++ b/lib/megaco/test/megaco_examples_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2010. 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
@@ -41,11 +41,11 @@ init_per_testcase(Case, Config) ->
megaco:enable_trace(max, io),
megaco_test_lib:init_per_testcase(Case, Config).
-fin_per_testcase(Case, Config) ->
+end_per_testcase(Case, Config) ->
purge_examples(),
erase(dbg),
megaco:disable_trace(),
- megaco_test_lib:fin_per_testcase(Case, Config).
+ megaco_test_lib:end_per_testcase(Case, Config).
example_modules() ->
[megaco_simple_mg, megaco_simple_mgc].
@@ -70,13 +70,18 @@ purge_examples() ->
%% Top test case
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(doc) ->
- ["Run all examples mentioned in the documentation",
- "Are really all examples covered?"];
-all(suite) ->
- [
- simple
- ].
+all() ->
+ [simple].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
simple(suite) ->
[];
diff --git a/lib/megaco/test/megaco_flex_test.erl b/lib/megaco/test/megaco_flex_test.erl
index 3dbcf53e7a..d7fc8eacb5 100644
--- a/lib/megaco/test/megaco_flex_test.erl
+++ b/lib/megaco/test/megaco_flex_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2010. 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
@@ -32,10 +32,10 @@
-export([
t/0, t/1,
- init_per_testcase/2, fin_per_testcase/2,
+ init_per_testcase/2, end_per_testcase/2,
- all/1,
- flex_init/1, flex_fin/1,
+ all/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_suite/1, end_per_suite/1,
plain/1,
port_exit/1,
@@ -55,26 +55,31 @@ t(Case) -> megaco_test_lib:t({?MODULE, Case}).
init_per_testcase(Case, Config) ->
megaco_test_lib:init_per_testcase(Case, Config).
-fin_per_testcase(Case, Config) ->
- megaco_test_lib:fin_per_testcase(Case, Config).
+end_per_testcase(Case, Config) ->
+ megaco_test_lib:end_per_testcase(Case, Config).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) ->
- Cases =
- [
- plain,
- port_exit,
- garbage_in
- ],
- {req, [], {conf, flex_init, Cases, flex_fin}}.
+all() ->
+ [plain, port_exit, garbage_in].
-flex_init(suite) ->
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+init_per_suite(suite) ->
[];
-flex_init(doc) ->
+init_per_suite(doc) ->
[];
-flex_init(Config) when is_list(Config) ->
+init_per_suite(Config) when is_list(Config) ->
case megaco_flex_scanner:is_enabled() of
true ->
Config;
@@ -82,9 +87,9 @@ flex_init(Config) when is_list(Config) ->
?SKIP(flex_scanner_not_enabled)
end.
-flex_fin(suite) -> [];
-flex_fin(doc) -> [];
-flex_fin(Config) when is_list(Config) ->
+end_per_suite(suite) -> [];
+end_per_suite(doc) -> [];
+end_per_suite(Config) when is_list(Config) ->
Config.
diff --git a/lib/megaco/test/megaco_load_test.erl b/lib/megaco/test/megaco_load_test.erl
index 5a22b7b4ee..5519ca15c6 100644
--- a/lib/megaco/test/megaco_load_test.erl
+++ b/lib/megaco/test/megaco_load_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2010. 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
@@ -99,26 +99,29 @@ do_init_per_testcase(Case, Config) ->
process_flag(trap_exit, true),
megaco_test_lib:init_per_testcase(Case, Config).
-fin_per_testcase(Case, Config) ->
+end_per_testcase(Case, Config) ->
process_flag(trap_exit, false),
- megaco_test_lib:fin_per_testcase(Case, Config).
+ megaco_test_lib:end_per_testcase(Case, Config).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) ->
- Cases =
- [
- single_user_light_load,
- single_user_medium_load,
- single_user_heavy_load,
- single_user_extreme_load,
- multi_user_light_load,
- multi_user_medium_load,
- multi_user_heavy_load,
- multi_user_extreme_load
- ],
- Cases.
+all() ->
+ [single_user_light_load,
+ single_user_medium_load, single_user_heavy_load,
+ single_user_extreme_load, multi_user_light_load,
+ multi_user_medium_load, multi_user_heavy_load,
+ multi_user_extreme_load].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/megaco/test/megaco_mess_otp8212_test.erl b/lib/megaco/test/megaco_mess_otp8212_test.erl
index 109886ebc4..e074e2f0b3 100644
--- a/lib/megaco/test/megaco_mess_otp8212_test.erl
+++ b/lib/megaco/test/megaco_mess_otp8212_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009. All Rights Reserved.
+%% Copyright Ericsson AB 2010. 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
diff --git a/lib/megaco/test/megaco_mess_test.erl b/lib/megaco/test/megaco_mess_test.erl
index 368800fa54..ded1506271 100644
--- a/lib/megaco/test/megaco_mess_test.erl
+++ b/lib/megaco/test/megaco_mess_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2010. 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
@@ -34,13 +34,13 @@
%% -compile(export_all).
-export([
- all/1,
+ all/0,groups/0,init_per_group/2,end_per_group/2,
init_per_testcase/2,
- fin_per_testcase/2,
+ end_per_testcase/2,
connect/1,
- request_and_reply/1,
+
request_and_reply_plain/1,
request_and_no_reply/1,
request_and_reply_pending_ack_no_pending/1,
@@ -52,13 +52,13 @@
request_and_reply_and_late_ack/1,
trans_req_and_reply_and_req/1,
- pending_ack/1,
+
pending_ack_plain/1,
request_and_pending_and_late_reply/1,
dist/1,
- tickets/1,
+
otp_4359/1,
otp_4836/1,
otp_5805/1,
@@ -67,18 +67,18 @@
otp_6253/1,
otp_6275/1,
otp_6276/1,
- otp_6442/1,
+
otp_6442_resend_request1/1,
otp_6442_resend_request2/1,
otp_6442_resend_reply1/1,
otp_6442_resend_reply2/1,
- otp_6865/1,
+
otp_6865_request_and_reply_plain_extra1/1,
otp_6865_request_and_reply_plain_extra2/1,
otp_7189/1,
otp_7259/1,
otp_7713/1,
- otp_8183/1,
+
otp_8183_request1/1,
otp_8212/1
]).
@@ -337,83 +337,50 @@ init_per_testcase(Case, Config) ->
C = lists:keydelete(tc_timeout, 1, Config),
megaco_test_lib:init_per_testcase(Case, [{tc_timeout, min(1)} |C]).
-% fin_per_testcase(pending_ack = Case, Config) ->
+% end_per_testcase(pending_ack = Case, Config) ->
% erase(dbg),
-% megaco_test_lib:fin_per_testcase(Case, Config);
-fin_per_testcase(Case, Config) ->
- megaco_test_lib:fin_per_testcase(Case, Config).
+% megaco_test_lib:end_per_testcase(Case, Config);
+end_per_testcase(Case, Config) ->
+ megaco_test_lib:end_per_testcase(Case, Config).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) ->
- [
- connect,
- request_and_reply,
- pending_ack,
- dist,
-
- %% Tickets last
- tickets
- ].
-
-request_and_reply(suite) ->
- [
- request_and_reply_plain,
- request_and_no_reply,
- request_and_reply_pending_ack_no_pending,
- request_and_reply_pending_ack_one_pending,
- single_trans_req_and_reply,
- single_trans_req_and_reply_sendopts,
- request_and_reply_and_ack,
- request_and_reply_and_no_ack,
- request_and_reply_and_late_ack,
- trans_req_and_reply_and_req
- ].
-
-pending_ack(suite) ->
- [
- pending_ack_plain,
- request_and_pending_and_late_reply
- ].
-
-tickets(suite) ->
- [
- otp_4359,
- otp_4836,
- otp_5805,
- otp_5881,
- otp_5887,
- otp_6253,
- otp_6275,
- otp_6276,
- otp_6442,
- otp_6865,
- otp_7189,
- otp_7259,
- otp_7713,
- otp_8183,
- otp_8212
- ].
-
-otp_6442(suite) ->
- [
- otp_6442_resend_request1,
- otp_6442_resend_request2,
- otp_6442_resend_reply1,
- otp_6442_resend_reply2
- ].
-
-otp_6865(suite) ->
- [
- otp_6865_request_and_reply_plain_extra1,
- otp_6865_request_and_reply_plain_extra2
- ].
-
-otp_8183(suite) ->
- [
- otp_8183_request1
- ].
+all() ->
+ [connect, {group, request_and_reply},
+ {group, pending_ack}, dist, {group, tickets}].
+
+groups() ->
+ [{request_and_reply, [],
+ [request_and_reply_plain, request_and_no_reply,
+ request_and_reply_pending_ack_no_pending,
+ request_and_reply_pending_ack_one_pending,
+ single_trans_req_and_reply,
+ single_trans_req_and_reply_sendopts,
+ request_and_reply_and_ack, request_and_reply_and_no_ack,
+ request_and_reply_and_late_ack,
+ trans_req_and_reply_and_req]},
+ {pending_ack, [],
+ [pending_ack_plain,
+ request_and_pending_and_late_reply]},
+ {tickets, [],
+ [otp_4359, otp_4836, otp_5805, otp_5881, otp_5887,
+ otp_6253, otp_6275, otp_6276, {group, otp_6442},
+ {group, otp_6865}, otp_7189, otp_7259, otp_7713,
+ {group, otp_8183}, otp_8212]},
+ {otp_6442, [],
+ [otp_6442_resend_request1, otp_6442_resend_request2,
+ otp_6442_resend_reply1, otp_6442_resend_reply2]},
+ {otp_6865, [],
+ [otp_6865_request_and_reply_plain_extra1,
+ otp_6865_request_and_reply_plain_extra2]},
+ {otp_8183, [], [otp_8183_request1]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/megaco/test/megaco_mess_user_test.erl b/lib/megaco/test/megaco_mess_user_test.erl
index 50284be549..ce682c167b 100644
--- a/lib/megaco/test/megaco_mess_user_test.erl
+++ b/lib/megaco/test/megaco_mess_user_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2010. 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
diff --git a/lib/megaco/test/megaco_mib_test.erl b/lib/megaco/test/megaco_mib_test.erl
index 2da6aa3bf3..52d99d1442 100644
--- a/lib/megaco/test/megaco_mib_test.erl
+++ b/lib/megaco/test/megaco_mib_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2010. 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
@@ -63,21 +63,25 @@ init_per_testcase(Case, Config) ->
megaco_test_lib:init_per_testcase(Case, Config)
end.
-fin_per_testcase(Case, Config) ->
+end_per_testcase(Case, Config) ->
process_flag(trap_exit, false),
- megaco_test_lib:fin_per_testcase(Case, Config).
+ megaco_test_lib:end_per_testcase(Case, Config).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) ->
- Cases =
- [
- plain,
- connect,
- traffic
- ],
- Cases.
+all() ->
+ [plain, connect, traffic].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/megaco/test/megaco_mreq_test.erl b/lib/megaco/test/megaco_mreq_test.erl
index 676acd8a12..1d3f38d50d 100644
--- a/lib/megaco/test/megaco_mreq_test.erl
+++ b/lib/megaco/test/megaco_mreq_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2010. 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
@@ -69,20 +69,24 @@ init_per_testcase(Case, Config) ->
process_flag(trap_exit, true),
megaco_test_lib:init_per_testcase(Case, Config).
-fin_per_testcase(Case, Config) ->
+end_per_testcase(Case, Config) ->
process_flag(trap_exit, false),
- megaco_test_lib:fin_per_testcase(Case, Config).
+ megaco_test_lib:end_per_testcase(Case, Config).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) ->
- Cases =
- [
- req_and_rep,
- req_and_pending,
- req_and_cancel
- ],
- Cases.
+all() ->
+ [req_and_rep, req_and_pending, req_and_cancel].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/megaco/test/megaco_pending_limit_test.erl b/lib/megaco/test/megaco_pending_limit_test.erl
index 1ca29c195c..233c22f4d2 100644
--- a/lib/megaco/test/megaco_pending_limit_test.erl
+++ b/lib/megaco/test/megaco_pending_limit_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2010. 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
@@ -26,22 +26,16 @@
-module(megaco_pending_limit_test).
-export([t/0, t/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
--export([all/1,
-
- sent/1,
+-export([init_per_testcase/2, end_per_testcase/2]).
+-export([all/0,groups/0,init_per_group/2,end_per_group/2,
sent_timer_late_reply/1,
sent_timer_exceeded/1,
sent_timer_exceeded_long/1,
sent_resend_late_reply/1,
sent_resend_exceeded/1,
sent_resend_exceeded_long/1,
-
- recv/1,
recv_limit_exceeded1/1,
recv_limit_exceeded2/1,
-
- tickets/1,
otp_4956/1,
otp_5310/1,
otp_5619/1
@@ -139,45 +133,29 @@ init_per_testcase(Case, Config) ->
process_flag(trap_exit, true),
megaco_test_lib:init_per_testcase(Case, Config).
-fin_per_testcase(Case, Config) ->
+end_per_testcase(Case, Config) ->
process_flag(trap_exit, false),
- megaco_test_lib:fin_per_testcase(Case, Config).
+ megaco_test_lib:end_per_testcase(Case, Config).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) ->
- [
- sent,
- recv,
-
- %% Tickets last
- tickets
- ].
-
-sent(suite) ->
- [
- sent_timer_late_reply,
- sent_timer_exceeded,
- sent_timer_exceeded_long,
- sent_resend_late_reply,
- sent_resend_exceeded,
- sent_resend_exceeded_long
-
- ].
+all() ->
+ [{group, sent}, {group, recv}, {group, tickets}].
-recv(suite) ->
- [
- recv_limit_exceeded1,
- recv_limit_exceeded2
- ].
+groups() ->
+ [{sent, [],
+ [sent_timer_late_reply, sent_timer_exceeded,
+ sent_timer_exceeded_long, sent_resend_late_reply,
+ sent_resend_exceeded, sent_resend_exceeded_long]},
+ {recv, [],
+ [recv_limit_exceeded1, recv_limit_exceeded2]},
+ {tickets, [], [otp_4956, otp_5310, otp_5619]}].
-tickets(suite) ->
- [
- otp_4956,
- otp_5310,
- otp_5619
- ].
+init_per_group(_GroupName, Config) ->
+ Config.
+end_per_group(_GroupName, Config) ->
+ Config.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% %%%
diff --git a/lib/megaco/test/megaco_profile.erl b/lib/megaco/test/megaco_profile.erl
index 01fa0b5a14..d0b62610e1 100644
--- a/lib/megaco/test/megaco_profile.erl
+++ b/lib/megaco/test/megaco_profile.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2010. 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
diff --git a/lib/megaco/test/megaco_sdp_test.erl b/lib/megaco/test/megaco_sdp_test.erl
index e9bd550518..796a956f23 100644
--- a/lib/megaco/test/megaco_sdp_test.erl
+++ b/lib/megaco/test/megaco_sdp_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2010. 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
@@ -24,13 +24,12 @@
-module(megaco_sdp_test).
--export([all/1,
+-export([all/0,groups/0,init_per_group/2,end_per_group/2,
decode_encode/1,
- tickets/1,
otp8123/1,
- init_per_testcase/2, fin_per_testcase/2,
+ init_per_testcase/2, end_per_testcase/2,
t/0, t/1]).
@@ -46,8 +45,8 @@ t(Case) -> megaco_test_lib:t({?MODULE, Case}).
init_per_testcase(Case, Config) ->
megaco_test_lib:init_per_testcase(Case, Config).
-fin_per_testcase(Case, Config) ->
- megaco_test_lib:fin_per_testcase(Case, Config).
+end_per_testcase(Case, Config) ->
+ megaco_test_lib:end_per_testcase(Case, Config).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -55,16 +54,19 @@ fin_per_testcase(Case, Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) ->
- [
- decode_encode,
- tickets
- ].
+all() ->
+ [decode_encode, {group, tickets}].
+
+groups() ->
+ [{tickets, [], [otp8123]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
-tickets(suite) ->
- [
- otp8123
- ].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/megaco/test/megaco_segment_test.erl b/lib/megaco/test/megaco_segment_test.erl
index ef07ee54b1..e4b568119d 100644
--- a/lib/megaco/test/megaco_segment_test.erl
+++ b/lib/megaco/test/megaco_segment_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2010. 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
@@ -24,10 +24,10 @@
-module(megaco_segment_test).
-export([t/0, t/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
--export([all/1,
+-export([init_per_testcase/2, end_per_testcase/2]).
+-export([all/0,groups/0,init_per_group/2,end_per_group/2,
- send/1,
+
send_segmented_msg_plain1/1,
send_segmented_msg_plain2/1,
send_segmented_msg_plain3/1,
@@ -36,13 +36,11 @@
send_segmented_msg_missing_seg_reply1/1,
send_segmented_msg_missing_seg_reply2/1,
- recv/1,
+
recv_segmented_msg_plain/1,
recv_segmented_msg_ooo_seg/1,
recv_segmented_msg_missing_seg1/1,
- recv_segmented_msg_missing_seg2/1,
-
- tickets/1
+ recv_segmented_msg_missing_seg2/1
]).
@@ -66,45 +64,33 @@ init_per_testcase(Case, Config) ->
process_flag(trap_exit, true),
megaco_test_lib:init_per_testcase(Case, Config).
-fin_per_testcase(Case, Config) ->
+end_per_testcase(Case, Config) ->
process_flag(trap_exit, false),
- megaco_test_lib:fin_per_testcase(Case, Config).
+ megaco_test_lib:end_per_testcase(Case, Config).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) ->
- [
- send,
- recv
-
- %% Tickets last
- %% tickets
- ].
-
-send(suite) ->
- [
- send_segmented_msg_plain1,
- send_segmented_msg_plain2,
- send_segmented_msg_plain3,
- send_segmented_msg_plain4,
- send_segmented_msg_ooo1,
- send_segmented_msg_missing_seg_reply1,
- send_segmented_msg_missing_seg_reply2
- ].
-
-recv(suite) ->
- [
- recv_segmented_msg_plain,
- recv_segmented_msg_ooo_seg,
- recv_segmented_msg_missing_seg1,
- recv_segmented_msg_missing_seg2
- ].
-
-tickets(suite) ->
- [
- ].
-
+all() ->
+ [{group, send}, {group, recv}].
+
+groups() ->
+ [{send, [],
+ [send_segmented_msg_plain1, send_segmented_msg_plain2,
+ send_segmented_msg_plain3, send_segmented_msg_plain4,
+ send_segmented_msg_ooo1,
+ send_segmented_msg_missing_seg_reply1,
+ send_segmented_msg_missing_seg_reply2]},
+ {recv, [],
+ [recv_segmented_msg_plain, recv_segmented_msg_ooo_seg,
+ recv_segmented_msg_missing_seg1,
+ recv_segmented_msg_missing_seg2]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/megaco/test/megaco_tc_controller.erl b/lib/megaco/test/megaco_tc_controller.erl
index dedf45e321..458bff55e8 100644
--- a/lib/megaco/test/megaco_tc_controller.erl
+++ b/lib/megaco/test/megaco_tc_controller.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2010. 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
diff --git a/lib/megaco/test/megaco_tcp_test.erl b/lib/megaco/test/megaco_tcp_test.erl
index 31c88489fe..013096c385 100644
--- a/lib/megaco/test/megaco_tcp_test.erl
+++ b/lib/megaco/test/megaco_tcp_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2010. 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
@@ -36,25 +36,19 @@
%% External exports
%%----------------------------------------------------------------------
-export([
- all/1,
-
- start/1,
+ all/0,groups/0,init_per_group/2,end_per_group/2,
start_normal/1,
start_invalid_opt/1,
start_and_stop/1,
-
- sending/1,
sendreceive/1,
block_unblock/1,
-
- errors/1,
socket_failure/1,
accept_process/1,
accept_supervisor/1,
connection_supervisor/1,
tcp_server/1,
- init_per_testcase/2, fin_per_testcase/2,
+ init_per_testcase/2, end_per_testcase/2,
t/0, t/1
]).
@@ -111,44 +105,32 @@ init_per_testcase(Case, Config) ->
%%----------------------------------------------------------------------
-%% Function: fin_per_testcase/2
+%% Function: end_per_testcase/2
%% Description:
%%----------------------------------------------------------------------
-fin_per_testcase(Case, Config) ->
- megaco_test_lib:fin_per_testcase(Case, Config).
+end_per_testcase(Case, Config) ->
+ megaco_test_lib:end_per_testcase(Case, Config).
%%======================================================================
%% Test case definitions
%%======================================================================
-all(suite) ->
- [
- start,
- sending,
- errors
- ].
-
-start(suite) ->
- [
- start_normal,
- start_invalid_opt,
- start_and_stop
- ].
-
-sending(suite) ->
- [
- sendreceive,
- block_unblock
- ].
-
-errors(suite) ->
- [
- socket_failure,
- accept_process,
- accept_supervisor,
- connection_supervisor,
- tcp_server
- ].
+all() ->
+ [{group, start}, {group, sending}, {group, errors}].
+
+groups() ->
+ [{start, [],
+ [start_normal, start_invalid_opt, start_and_stop]},
+ {sending, [], [sendreceive, block_unblock]},
+ {errors, [],
+ [socket_failure, accept_process, accept_supervisor,
+ connection_supervisor, tcp_server]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
%% ------------------ start ------------------------
diff --git a/lib/megaco/test/megaco_test_deliver.erl b/lib/megaco/test/megaco_test_deliver.erl
index 2d0f0c1cbe..ece0a48015 100644
--- a/lib/megaco/test/megaco_test_deliver.erl
+++ b/lib/megaco/test/megaco_test_deliver.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2010. 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
diff --git a/lib/megaco/test/megaco_test_generator.erl b/lib/megaco/test/megaco_test_generator.erl
index 8bbc60e6cd..4fbc86262e 100644
--- a/lib/megaco/test/megaco_test_generator.erl
+++ b/lib/megaco/test/megaco_test_generator.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -26,6 +26,10 @@
-behaviour(gen_server).
+-compile({no_auto_import,[error/2]}).
+
+%% ----
+
-export([
start_link/3,
start_link/4,
diff --git a/lib/megaco/test/megaco_test_generator_lib.erl b/lib/megaco/test/megaco_test_generator_lib.erl
index cf0dcaf722..1584605913 100644
--- a/lib/megaco/test/megaco_test_generator_lib.erl
+++ b/lib/megaco/test/megaco_test_generator_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2010. 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
diff --git a/lib/megaco/test/megaco_test_generic_transport.erl b/lib/megaco/test/megaco_test_generic_transport.erl
index 10afa45baa..7a3dbc5317 100644
--- a/lib/megaco/test/megaco_test_generic_transport.erl
+++ b/lib/megaco/test/megaco_test_generic_transport.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2010. 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
diff --git a/lib/megaco/test/megaco_test_lib.erl b/lib/megaco/test/megaco_test_lib.erl
index 03c04831e8..41f6c2c4cb 100644
--- a/lib/megaco/test/megaco_test_lib.erl
+++ b/lib/megaco/test/megaco_test_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -146,28 +146,28 @@ tickets(Mod, Func, Config) ->
end,
lists:map(Map, Cases);
- {req, _, {conf, Init, Cases, Finish}} ->
- case (catch Mod:Init(Config)) of
- Conf when is_list(Conf) ->
- io:format("Expand: ~p:~p ...~n", [Mod, Func]),
- Map = fun({M,_}) when is_atom(M) ->
- tickets(M, tickets, Config);
- (F) when is_atom(F) ->
- tickets(Mod, F, Config);
- (Case) -> Case
- end,
- Res = lists:map(Map, Cases),
- (catch Mod:Finish(Conf)),
- Res;
+%% {req, _, {conf, Init, Cases, Finish}} ->
+%% case (catch Mod:Init(Config)) of
+%% Conf when is_list(Conf) ->
+%% io:format("Expand: ~p:~p ...~n", [Mod, Func]),
+%% Map = fun({M,_}) when is_atom(M) ->
+%% tickets(M, tickets, Config);
+%% (F) when is_atom(F) ->
+%% tickets(Mod, F, Config);
+%% (Case) -> Case
+%% end,
+%% Res = lists:map(Map, Cases),
+%% (catch Mod:Finish(Conf)),
+%% Res;
- {'EXIT', {skipped, Reason}} ->
- io:format(" => skipping: ~p~n", [Reason]),
- [{skipped, {Mod, Func}, Reason}];
+%% {'EXIT', {skipped, Reason}} ->
+%% io:format(" => skipping: ~p~n", [Reason]),
+%% [{skipped, {Mod, Func}, Reason}];
- Error ->
- io:format(" => init failed: ~p~n", [Error]),
- [{failed, {Mod, Func}, Error}]
- end;
+%% Error ->
+%% io:format(" => init failed: ~p~n", [Error]),
+%% [{failed, {Mod, Func}, Error}]
+%% end;
{'EXIT', {undef, _}} ->
io:format("Undefined: ~p~n", [{Mod, Func}]),
@@ -252,6 +252,8 @@ alloc_instance_mem_info(Key, InstanceInfo) ->
end.
+t([Case]) when is_atom(Case) ->
+ t(Case);
t(Case) ->
process_flag(trap_exit, true),
MEM = fun() -> case (catch erlang:memory()) of
@@ -266,11 +268,65 @@ t(Case) ->
Res = lists:flatten(t(Case, default_config())),
Alloc2 = alloc_info(),
Mem2 = MEM(),
- %% io:format("Res: ~p~n", [Res]),
display_result(Res, Alloc1, Mem1, Alloc2, Mem2),
Res.
-t({Mod, Fun}, Config) when is_atom(Mod) andalso is_atom(Fun) ->
+
+groups(Mod) when is_atom(Mod) ->
+ try Mod:groups() of
+ Groups when is_list(Groups) ->
+ Groups;
+ BadGroups ->
+ exit({bad_groups, Mod, BadGroups})
+ catch
+ _:_ ->
+ []
+ end.
+
+init_suite(Mod, Config) ->
+ Mod:init_per_suite(Config).
+
+end_suite(Mod, Config) ->
+ Mod:end_per_suite(Config).
+
+init_group(Mod, Group, Config) ->
+ Mod:init_per_group(Group, Config).
+
+end_group(Mod, Group, Config) ->
+ Mod:init_per_group(Group, Config).
+
+%% This is for sub-SUITEs
+t({_Mod, {NewMod, all}, _Groups}, _Config) when is_atom(NewMod) ->
+ t(NewMod);
+t({Mod, {group, Name} = Group, Groups}, Config)
+ when is_atom(Mod) andalso is_atom(Name) andalso is_list(Groups) ->
+ case lists:keysearch(Name, 1, Groups) of
+ {value, {Name, _Props, GroupsAndCases}} ->
+ try init_group(Mod, Name, Config) of
+ Config2 when is_list(Config2) ->
+ Res = [t({Mod, Case, Groups}, Config2) ||
+ Case <- GroupsAndCases],
+ (catch end_group(Mod, Name, Config2)),
+ Res;
+ Error ->
+ io:format(" => group (~w) init failed: ~p~n",
+ [Name, Error]),
+ [{failed, {Mod, Group}, Error}]
+ catch
+ exit:{skipped, SkipReason} ->
+ io:format(" => skipping group: ~p~n", [SkipReason]),
+ [{skipped, {Mod, Group}, SkipReason, 0}];
+ exit:{undef, _} ->
+ [t({Mod, Case, Groups}, Config) ||
+ Case <- GroupsAndCases];
+ T:E ->
+ [{failed, {Mod, Group}, {T,E}, 0}]
+ end;
+ false ->
+ exit({unknown_group, Mod, Name, Groups})
+ end;
+t({Mod, Fun, _}, Config)
+ when is_atom(Mod) andalso is_atom(Fun) ->
case catch apply(Mod, Fun, [suite]) of
[] ->
io:format("Eval: ~p:", [{Mod, Fun}]),
@@ -286,26 +342,6 @@ t({Mod, Fun}, Config) when is_atom(Mod) andalso is_atom(Fun) ->
end,
t(lists:map(Map, Cases), Config);
- {req, _, {conf, Init, Cases, Finish}} ->
- case (catch apply(Mod, Init, [Config])) of
- Conf when is_list(Conf) ->
- io:format("Expand: ~p ...~n", [{Mod, Fun}]),
- Map = fun(Case) when is_atom(Case) -> {Mod, Case};
- (Case) -> Case
- end,
- Res = t(lists:map(Map, Cases), Conf),
- (catch apply(Mod, Finish, [Conf])),
- Res;
-
- {'EXIT', {skipped, Reason}} ->
- io:format(" => skipping: ~p~n", [Reason]),
- [{skipped, {Mod, Fun}, Reason, 0}];
-
- Error ->
- io:format(" => failed: ~p~n", [Error]),
- [{failed, {Mod, Fun}, Error, 0}]
- end;
-
{'EXIT', {undef, _}} ->
io:format("Undefined: ~p~n", [{Mod, Fun}]),
[{nyi, {Mod, Fun}, ok, 0}];
@@ -315,10 +351,38 @@ t({Mod, Fun}, Config) when is_atom(Mod) andalso is_atom(Fun) ->
[{failed, {Mod, Fun}, Error, 0}]
end;
t(Mod, Config) when is_atom(Mod) ->
- Res = t({Mod, all}, Config),
- Res;
-t(Cases, Config) when is_list(Cases) ->
- [t(Case, Config) || Case <- Cases];
+ %% This is assumed to be a test suite, so we start by calling
+ %% the top test suite function(s) (all/0 and groups/0).
+ case (catch Mod:all()) of
+ Cases when is_list(Cases) ->
+ %% The list may contain atoms (actual test cases) and
+ %% group-tuples (a tuple naming a group of test cases).
+ %% A group is defined by the (optional) groups/0 function.
+ Groups = groups(Mod),
+ try init_suite(Mod, Config) of
+ Config2 when is_list(Config2) ->
+ Res = [t({Mod, Case, Groups}, Config2) || Case <- Cases],
+ (catch end_suite(Mod, Config2)),
+ Res;
+ Error ->
+ io:format(" => suite init failed: ~p~n", [Error]),
+ [{failed, {Mod, init_per_suite}, Error}]
+ catch
+ exit:{skipped, SkipReason} ->
+ io:format(" => skipping suite: ~p~n", [SkipReason]),
+ [{skipped, {Mod, init_per_suite}, SkipReason, 0}];
+ exit:{undef, _} ->
+ [t({Mod, Case, Groups}, Config) || Case <- Cases];
+ T:E ->
+ [{failed, {Mod, init_per_suite}, {T,E}, 0}]
+ end;
+ {'EXIT', {undef, _}} ->
+ io:format("Undefined: ~p~n", [{Mod, all}]),
+ [{nyi, {Mod, all}, ok, 0}];
+
+ Crap ->
+ Crap
+ end;
t(Bad, _Config) ->
[{badarg, Bad, ok, 0}].
@@ -333,7 +397,7 @@ eval(Mod, Fun, Config) ->
Config2 = Mod:init_per_testcase(Fun, Config),
Pid = spawn_link(?MODULE, do_eval, [self(), Mod, Fun, Config2]),
R = wait_for_evaluator(Pid, Mod, Fun, Config2, []),
- Mod:fin_per_testcase(Fun, Config2),
+ Mod:end_per_testcase(Fun, Config2),
erase(megaco_test_server),
global:unregister_name(megaco_test_case_sup),
process_flag(trap_exit, Flag),
@@ -495,28 +559,56 @@ do_display_memory([{Key, Mem1}|MemInfo1], MemInfo2) ->
display_result([]) ->
io:format("OK~n", []);
display_result(Res) when is_list(Res) ->
- Ok = [{MF, Time} || {ok, MF, _, Time} <- Res],
- Nyi = [MF || {nyi, MF, _, _Time} <- Res],
- Skipped = [{MF, Reason} || {skipped, MF, Reason, _Time} <- Res],
- Failed = [{MF, Reason} || {failed, MF, Reason, _Time} <- Res],
- Crashed = [{MF, Reason} || {crashed, MF, Reason, _Time} <- Res],
- display_summery(Ok, Nyi, Skipped, Failed, Crashed),
+ Ok = [{MF, Time} || {ok, MF, _, Time} <- Res],
+ Nyi = [MF || {nyi, MF, _, _Time} <- Res],
+ SkippedGrps = [{{M,G}, Reason} ||
+ {skipped, {M, {group, G}}, Reason, _Time} <- Res],
+ SkippedCases = [{MF, Reason} ||
+ {skipped, {_M, F} = MF, Reason, _Time} <- Res,
+ is_atom(F)],
+ FailedGrps = [{{M,G}, Reason} ||
+ {failed, {M, {group, G}}, Reason, _Time} <- Res],
+ FailedCases = [{MF, Reason} ||
+ {failed, {_M, F} = MF, Reason, _Time} <- Res,
+ is_atom(F)],
+ Crashed = [{MF, Reason} || {crashed, MF, Reason, _Time} <- Res],
+ display_summery(Ok, Nyi,
+ SkippedGrps, SkippedCases,
+ FailedGrps, FailedCases,
+ Crashed),
display_ok(Ok),
- display_skipped(Skipped),
- display_failed(Failed),
+ display_skipped("groups", SkippedGrps),
+ display_skipped("test cases", SkippedCases),
+ display_failed("groups", FailedGrps),
+ display_failed("test cases", FailedCases),
display_crashed(Crashed).
-display_summery(Ok, Nyi, Skipped, Failed, Crashed) ->
+display_summery(Ok, Nyi,
+ SkippedGrps, SkippedCases,
+ FailedGrps, FailedCases,
+ Crashed) ->
io:format("~nTest case summery:~n", []),
- display_summery(Ok, "successfull"),
- display_summery(Nyi, "not yet implemented"),
- display_summery(Skipped, "skipped"),
- display_summery(Failed, "failed"),
- display_summery(Crashed, "crashed"),
+ display_summery(Ok, "test case", "successfull"),
+ display_summery(Nyi, "test case", "not yet implemented"),
+ display_summery(SkippedGrps, "group", "skipped"),
+ display_summery(SkippedCases, "test case", "skipped"),
+ display_summery(FailedGrps, "group", "failed"),
+ display_summery(FailedCases, "test case", "failed"),
+ display_summery(Crashed, "test case", "crashed"),
io:format("~n", []).
-display_summery(Res, Info) ->
- io:format(" ~w test cases ~s~n", [length(Res), Info]).
+
+display_summery(Res, Kind, Info) ->
+ Len = length(Res),
+ if
+ Len =:= 1 ->
+ display_summery(Len, Kind ++ " " ++ Info);
+ true ->
+ display_summery(Len, Kind ++ "s " ++ Info)
+ end.
+
+display_summery(Len, Info) ->
+ io:format(" ~w ~s~n", [Len, Info]).
display_ok([]) ->
ok;
@@ -528,20 +620,20 @@ display_ok(Ok) ->
lists:foreach(F, Ok),
io:format("~n", []).
-display_skipped([]) ->
+display_skipped(_, []) ->
ok;
-display_skipped(Skipped) ->
- io:format("Skipped test cases:~n", []),
- F = fun({MF, Reason}) -> io:format(" ~p => ~p~n", [MF, Reason]) end,
+display_skipped(Pre, Skipped) ->
+ io:format("Skipped ~s:~n", [Pre]),
+ F = fun({X, Reason}) -> io:format(" ~p => ~p~n", [X, Reason]) end,
lists:foreach(F, Skipped),
io:format("~n", []).
-display_failed([]) ->
+display_failed(_, []) ->
ok;
-display_failed(Failed) ->
- io:format("Failed test cases:~n", []),
- F = fun({MF, Reason}) -> io:format(" ~p => ~p~n", [MF, Reason]) end,
+display_failed(Pre, Failed) ->
+ io:format("Failed ~s:~n", [Pre]),
+ F = fun({X, Reason}) -> io:format(" ~p => ~p~n", [X, Reason]) end,
lists:foreach(F, Failed),
io:format("~n", []).
@@ -677,11 +769,11 @@ init_per_testcase(_Case, Config) ->
end,
set_kill_timer(Config).
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Name = megaco_global_logger,
case global:whereis_name(Name) of
undefined ->
- io:format("~w:fin_per_testcase -> already un-registered~n",
+ io:format("~w:end_per_testcase -> already un-registered~n",
[?MODULE]),
ok;
Pid when is_pid(Pid) ->
@@ -837,5 +929,5 @@ start_nodes([Node | Nodes], File, Line) ->
start_nodes([], _File, _Line) ->
ok.
-p(F,A) ->
- io:format("~p" ++ F ++ "~n", [self()|A]).
+p(F, A) ->
+ io:format("~p~w:" ++ F ++ "~n", [self(), ?MODULE |A]).
diff --git a/lib/megaco/test/megaco_test_megaco_generator.erl b/lib/megaco/test/megaco_test_megaco_generator.erl
index 5ff7162223..f0c723d2cf 100644
--- a/lib/megaco/test/megaco_test_megaco_generator.erl
+++ b/lib/megaco/test/megaco_test_megaco_generator.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -26,6 +26,8 @@
-behaviour(megaco_test_generator).
+-compile({no_auto_import,[error/1]}).
+
%% API
-export([
start_link/1, start_link/2,
diff --git a/lib/megaco/test/megaco_test_mg.erl b/lib/megaco/test/megaco_test_mg.erl
index 22b65a1ac6..ecb3cedc83 100644
--- a/lib/megaco/test/megaco_test_mg.erl
+++ b/lib/megaco/test/megaco_test_mg.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2010. 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
diff --git a/lib/megaco/test/megaco_test_mgc.erl b/lib/megaco/test/megaco_test_mgc.erl
index 05c482f1af..13c1cebe56 100644
--- a/lib/megaco/test/megaco_test_mgc.erl
+++ b/lib/megaco/test/megaco_test_mgc.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2010. 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
diff --git a/lib/megaco/test/megaco_test_msg_prev3a_lib.erl b/lib/megaco/test/megaco_test_msg_prev3a_lib.erl
index 5ce2ec302b..fad7f29831 100644
--- a/lib/megaco/test/megaco_test_msg_prev3a_lib.erl
+++ b/lib/megaco/test/megaco_test_msg_prev3a_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -26,6 +26,10 @@
%% ----
+-compile({no_auto_import,[error/1]}).
+
+%% ----
+
-include_lib("megaco/include/megaco_message_prev3a.hrl").
-include_lib("megaco/include/megaco.hrl").
diff --git a/lib/megaco/test/megaco_test_msg_prev3b_lib.erl b/lib/megaco/test/megaco_test_msg_prev3b_lib.erl
index be87dc9a41..2f1a093728 100644
--- a/lib/megaco/test/megaco_test_msg_prev3b_lib.erl
+++ b/lib/megaco/test/megaco_test_msg_prev3b_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -26,6 +26,10 @@
%% ----
+-compile({no_auto_import,[error/1]}).
+
+%% ----
+
-include_lib("megaco/include/megaco_message_prev3b.hrl").
-include_lib("megaco/include/megaco.hrl").
diff --git a/lib/megaco/test/megaco_test_msg_prev3c_lib.erl b/lib/megaco/test/megaco_test_msg_prev3c_lib.erl
index 74a05060d0..884e2f2bad 100644
--- a/lib/megaco/test/megaco_test_msg_prev3c_lib.erl
+++ b/lib/megaco/test/megaco_test_msg_prev3c_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -26,6 +26,10 @@
%% ----
+-compile({no_auto_import,[error/1]}).
+
+%% ----
+
-include_lib("megaco/include/megaco_message_prev3c.hrl").
-include_lib("megaco/include/megaco.hrl").
diff --git a/lib/megaco/test/megaco_test_msg_v1_lib.erl b/lib/megaco/test/megaco_test_msg_v1_lib.erl
index 638215e8c1..76665cb575 100644
--- a/lib/megaco/test/megaco_test_msg_v1_lib.erl
+++ b/lib/megaco/test/megaco_test_msg_v1_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -28,6 +28,10 @@
%% ----
+-compile({no_auto_import,[error/1]}).
+
+%% ----
+
-include_lib("megaco/include/megaco_message_v1.hrl").
-include_lib("megaco/include/megaco.hrl").
diff --git a/lib/megaco/test/megaco_test_msg_v2_lib.erl b/lib/megaco/test/megaco_test_msg_v2_lib.erl
index b680bc869a..66e423284a 100644
--- a/lib/megaco/test/megaco_test_msg_v2_lib.erl
+++ b/lib/megaco/test/megaco_test_msg_v2_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -26,6 +26,10 @@
%% ----
+-compile({no_auto_import,[error/1]}).
+
+%% ----
+
-include_lib("megaco/include/megaco_message_v2.hrl").
-include_lib("megaco/include/megaco.hrl").
diff --git a/lib/megaco/test/megaco_test_msg_v3_lib.erl b/lib/megaco/test/megaco_test_msg_v3_lib.erl
index 7b0d4f7d37..24492167ff 100644
--- a/lib/megaco/test/megaco_test_msg_v3_lib.erl
+++ b/lib/megaco/test/megaco_test_msg_v3_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -26,6 +26,10 @@
%% ----
+-compile({no_auto_import,[error/1]}).
+
+%% ----
+
-include_lib("megaco/include/megaco_message_v3.hrl").
-include_lib("megaco/include/megaco.hrl").
diff --git a/lib/megaco/test/megaco_test_tcp_generator.erl b/lib/megaco/test/megaco_test_tcp_generator.erl
index e4f27f32f5..3ed4c49bab 100644
--- a/lib/megaco/test/megaco_test_tcp_generator.erl
+++ b/lib/megaco/test/megaco_test_tcp_generator.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -26,6 +26,8 @@
-behaviour(megaco_test_generator).
+-compile({no_auto_import,[error/1]}).
+
%% API
-export([
start_link/1, start_link/2,
diff --git a/lib/megaco/test/megaco_timer_test.erl b/lib/megaco/test/megaco_timer_test.erl
index 8bcfc5a907..9b9103c40b 100644
--- a/lib/megaco/test/megaco_timer_test.erl
+++ b/lib/megaco/test/megaco_timer_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -23,22 +23,17 @@
%%----------------------------------------------------------------------
-module(megaco_timer_test).
+-compile({no_auto_import,[error/1]}).
+
-export([
t/0, t/1,
- init_per_testcase/2, fin_per_testcase/2,
-
- all/1,
-
- simple/1,
+ init_per_testcase/2, end_per_testcase/2,
+ all/0,groups/0,init_per_group/2,end_per_group/2,
simple_init/1,
simple_usage/1,
-
- integer_timer/1,
integer_timer_start_and_expire/1,
integer_timer_start_and_stop/1%% ,
-
%% incr_timer/1
-
]).
-export([
@@ -71,49 +66,39 @@ do_init_per_testcase(Case, Config) ->
{ok, _Pid} = megaco_monitor:start_link(),
megaco_test_lib:init_per_testcase(Case, [{monitor_running, true}|Config]).
-fin_per_testcase(Case, Config) ->
- io:format("fin_per_testcase -> entry with"
+end_per_testcase(Case, Config) ->
+ io:format("end_per_testcase -> entry with"
"~n Case: ~p"
"~n Config: ~p"
"~n", [Case, Config]),
process_flag(trap_exit, false),
case lists:keydelete(monitor_running, 1, Config) of
Config ->
- megaco_test_lib:fin_per_testcase(Case, Config);
+ megaco_test_lib:end_per_testcase(Case, Config);
Config2 ->
megaco_monitor:stop(),
- megaco_test_lib:fin_per_testcase(Case, Config2)
+ megaco_test_lib:end_per_testcase(Case, Config2)
end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) ->
- Cases =
- [
- simple,
- integer_timer%% ,
-%% incr_timer
- ],
- Cases.
-
-
-simple(suite) ->
- Cases =
- [
- simple_init,
- simple_usage
- ],
- Cases.
-
-
-integer_timer(suite) ->
- Cases =
- [
- integer_timer_start_and_expire,
- integer_timer_start_and_stop
- ],
- Cases.
+all() ->
+ [{group, simple}, {group, integer_timer}].
+
+groups() ->
+ [{simple, [],
+ [simple_init, simple_usage]},
+%, incr_timer
+ {integer_timer, [],
+ [integer_timer_start_and_expire,
+ integer_timer_start_and_stop]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
%% incr_timer(suite) ->
diff --git a/lib/megaco/test/megaco_trans_test.erl b/lib/megaco/test/megaco_trans_test.erl
index 44d4b3fff7..5f564e3bf6 100644
--- a/lib/megaco/test/megaco_trans_test.erl
+++ b/lib/megaco/test/megaco_trans_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2010. 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
@@ -95,78 +95,49 @@ init_per_testcase(Case, Config) ->
process_flag(trap_exit, true),
megaco_test_lib:init_per_testcase(Case, Config).
-fin_per_testcase(Case, Config) ->
+end_per_testcase(Case, Config) ->
process_flag(trap_exit, false),
- megaco_test_lib:fin_per_testcase(Case, Config).
+ megaco_test_lib:end_per_testcase(Case, Config).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) ->
- [
- ack,
- trans_req,
- trans_req_and_ack,
- pending,
- reply,
-
- tickets
- ].
-
-ack(suite) ->
- [
- single_ack,
- multi_ack_timeout,
- multi_ack_maxcount
- ].
-
-trans_req(suite) ->
- [
- single_trans_req,
- multi_trans_req_timeout,
- multi_trans_req_maxcount1,
- multi_trans_req_maxcount2,
- multi_trans_req_maxsize1,
- multi_trans_req_maxsize2
- ].
-
-trans_req_and_ack(suite) ->
- [
- single_trans_req_and_ack,
- multi_trans_req_and_ack_timeout,
- multi_trans_req_and_ack_ackmaxcount,
- multi_trans_req_and_ack_reqmaxcount,
- multi_trans_req_and_ack_maxsize1,
- multi_trans_req_and_ack_maxsize2
- ].
-
-pending(suite) ->
- [
- single_trans_req_and_pending,
- multi_trans_req_and_pending,
- multi_trans_req_and_ack_and_pending,
- multi_ack_and_pending
- ].
-
-reply(suite) ->
- [
- multi_trans_req_and_reply,
- multi_trans_req_and_ack_and_reply,
- multi_ack_and_reply
- ].
-
-tickets(suite) ->
- [
- otp_7192
- ].
-
-otp_7192(suite) ->
- [
- otp_7192_1,
- otp_7192_2,
- otp_7192_3
- ].
-
+all() ->
+ [{group, ack}, {group, trans_req},
+ {group, trans_req_and_ack}, {group, pending},
+ {group, reply}, {group, tickets}].
+
+groups() ->
+ [{ack, [],
+ [single_ack, multi_ack_timeout, multi_ack_maxcount]},
+ {trans_req, [],
+ [single_trans_req, multi_trans_req_timeout,
+ multi_trans_req_maxcount1, multi_trans_req_maxcount2,
+ multi_trans_req_maxsize1, multi_trans_req_maxsize2]},
+ {trans_req_and_ack, [],
+ [single_trans_req_and_ack,
+ multi_trans_req_and_ack_timeout,
+ multi_trans_req_and_ack_ackmaxcount,
+ multi_trans_req_and_ack_reqmaxcount,
+ multi_trans_req_and_ack_maxsize1,
+ multi_trans_req_and_ack_maxsize2]},
+ {pending, [],
+ [single_trans_req_and_pending,
+ multi_trans_req_and_pending,
+ multi_trans_req_and_ack_and_pending,
+ multi_ack_and_pending]},
+ {reply, [],
+ [multi_trans_req_and_reply,
+ multi_trans_req_and_ack_and_reply,
+ multi_ack_and_reply]},
+ {tickets, [], [{group, otp_7192}]},
+ {otp_7192, [], [otp_7192_1, otp_7192_2, otp_7192_3]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/megaco/test/megaco_udp_test.erl b/lib/megaco/test/megaco_udp_test.erl
index 2e2f5465dd..ffbff9b762 100644
--- a/lib/megaco/test/megaco_udp_test.erl
+++ b/lib/megaco/test/megaco_udp_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2010. 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
@@ -34,22 +34,14 @@
%% External exports
%%----------------------------------------------------------------------
-export([
- all/1,
-
- start/1,
+ all/0,groups/0,init_per_group/2,end_per_group/2,
start_normal/1,
start_invalid_opt/1,
start_and_stop/1,
-
- sending/1,
sendreceive/1,
block_unblock/1,
-
- errors/1,
socket_failure/1,
-
- init_per_testcase/2, fin_per_testcase/2,
-
+ init_per_testcase/2, end_per_testcase/2,
t/0, t/1
]).
@@ -104,42 +96,31 @@ init_per_testcase(Case, Config) ->
%%----------------------------------------------------------------------
-%% Function: fin_per_testcase/2
+%% Function: end_per_testcase/2
%% Description:
%%----------------------------------------------------------------------
-fin_per_testcase(Case, Config) ->
- megaco_test_lib:fin_per_testcase(Case, Config).
+end_per_testcase(Case, Config) ->
+ megaco_test_lib:end_per_testcase(Case, Config).
%%======================================================================
%% Test case definitions
%%======================================================================
-all(suite) ->
- [
- start,
- sending,
- errors
- ].
-
-start(suite) ->
- [
- start_normal,
- start_invalid_opt,
- start_and_stop
- ].
+all() ->
+ [{group, start}, {group, sending}, {group, errors}].
-sending(suite) ->
- [
- sendreceive,
- block_unblock
+groups() ->
+ [{start, [],
+ [start_normal, start_invalid_opt, start_and_stop]},
+ {sending, [], [sendreceive, block_unblock]},
+ {errors, [], [socket_failure]}].
- ].
+init_per_group(_GroupName, Config) ->
+ Config.
-errors(suite) ->
- [
- socket_failure
- ].
+end_per_group(_GroupName, Config) ->
+ Config.
%% =================================================
diff --git a/lib/megaco/vsn.mk b/lib/megaco/vsn.mk
index 9fc0e0f2fa..5f71712360 100644
--- a/lib/megaco/vsn.mk
+++ b/lib/megaco/vsn.mk
@@ -1,4 +1,23 @@
+#-*-makefile-*- ; force emacs to enter makefile-mode
+
+# %CopyrightBegin%
+#
+# Copyright Ericsson AB 1997-2011. 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%
+
APPLICATION = megaco
-MEGACO_VSN = 3.15
-PRE_VSN =
-APP_VSN = "$(APPLICATION)-$(MEGACO_VSN)$(PRE_VSN)"
+MEGACO_VSN = 3.15.1
+PRE_VSN =
+APP_VSN = "$(APPLICATION)-$(MEGACO_VSN)$(PRE_VSN)"
diff --git a/lib/mnesia/doc/src/Mnesia_chap2.xmlsrc b/lib/mnesia/doc/src/Mnesia_chap2.xmlsrc
index 2e2cc386b7..473b35b806 100644
--- a/lib/mnesia/doc/src/Mnesia_chap2.xmlsrc
+++ b/lib/mnesia/doc/src/Mnesia_chap2.xmlsrc
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>1997</year><year>2009</year>
+ <year>1997</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
diff --git a/lib/mnesia/doc/src/Mnesia_chap3.xml b/lib/mnesia/doc/src/Mnesia_chap3.xml
index 2db9af9cf7..5733aedbfd 100644
--- a/lib/mnesia/doc/src/Mnesia_chap3.xml
+++ b/lib/mnesia/doc/src/Mnesia_chap3.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>1997</year><year>2009</year>
+ <year>1997</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
diff --git a/lib/mnesia/doc/src/Mnesia_chap4.xmlsrc b/lib/mnesia/doc/src/Mnesia_chap4.xmlsrc
index 6e8055326b..7e57c7ac02 100644
--- a/lib/mnesia/doc/src/Mnesia_chap4.xmlsrc
+++ b/lib/mnesia/doc/src/Mnesia_chap4.xmlsrc
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>1997</year><year>2009</year>
+ <year>1997</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
diff --git a/lib/mnesia/doc/src/mnesia_frag_hash.xml b/lib/mnesia/doc/src/mnesia_frag_hash.xml
index ca03327994..73162c3974 100644
--- a/lib/mnesia/doc/src/mnesia_frag_hash.xml
+++ b/lib/mnesia/doc/src/mnesia_frag_hash.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2002</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/mnesia/doc/src/mnesia_registry.xml b/lib/mnesia/doc/src/mnesia_registry.xml
index 966134d508..e08f3a42fc 100644
--- a/lib/mnesia/doc/src/mnesia_registry.xml
+++ b/lib/mnesia/doc/src/mnesia_registry.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1998</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/mnesia/doc/src/notes.xml b/lib/mnesia/doc/src/notes.xml
index 5a6de05c8b..19574a1434 100644
--- a/lib/mnesia/doc/src/notes.xml
+++ b/lib/mnesia/doc/src/notes.xml
@@ -38,7 +38,71 @@
thus constitutes one section in this document. The title of each
section is the version number of Mnesia.</p>
- <section><title>Mnesia 4.4.16</title>
+ <section><title>Mnesia 4.4.18</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Call chmod without the "-f" flag</p>
+ <p>
+ "-f" is a non-standard chmod option which at least SGI
+ IRIX and HP UX do not support. As the only effect of the
+ "-f" flag is to suppress warning messages, it can be
+ safely omitted. (Thanks to Holger Wei�)</p>
+ <p>
+ Own Id: OTP-9170</p>
+ </item>
+ <item>
+ <p>
+ Mnesia sometimes failed to update meta-information in
+ large systems, which could cause table content to be
+ inconsistent between nodes.</p>
+ <p>
+ Own Id: OTP-9186 Aux Id: seq11728 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>Mnesia 4.4.17</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Calling mnesia:first/1 on empty fragmented table works.
+ Thanks Magnus Henoch.</p>
+ <p>
+ Own Id: OTP-9108</p>
+ </item>
+ <item>
+ <p>
+ If Mnesia detects that the network is not fully connected
+ during start, Mnesia will not start until all nodes are
+ reachable.</p>
+ <p>
+ Own Id: OTP-9115 Aux Id: seq-11728 </p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Fix issues reported by dialyzer.</p>
+ <p>
+ Own Id: OTP-9107</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>Mnesia 4.4.16</title>
<section><title>Fixed Bugs and Malfunctions</title>
<list>
diff --git a/lib/mnesia/doc/src/part_notes_history.xml b/lib/mnesia/doc/src/part_notes_history.xml
index 177738623c..e4621dbbf7 100644
--- a/lib/mnesia/doc/src/part_notes_history.xml
+++ b/lib/mnesia/doc/src/part_notes_history.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2004</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/mnesia/src/mnesia.appup.src b/lib/mnesia/src/mnesia.appup.src
index 22ef5178a7..7bad6c4ea6 100644
--- a/lib/mnesia/src/mnesia.appup.src
+++ b/lib/mnesia/src/mnesia.appup.src
@@ -1,13 +1,33 @@
%% -*- erlang -*-
{"%VSN%",
- [
- {"4.4.15",[
- {update, mnesia_dumper, soft, soft_purge, soft_purge, []}
- ]}
- ],
[
+ {"4.4.17",[
+ {update, mnesia_controller, soft, soft_purge, soft_purge, []}
+ ]},
+ {"4.4.16",[
+ {update, mnesia_controller, soft, soft_purge, soft_purge, []},
+ {update, mnesia_frag, soft, soft_purge, soft_purge, []},
+ {update, mnesia_schema, soft, soft_purge, soft_purge, []}
+ ]},
{"4.4.15",[
+ {update, mnesia_controller, soft, soft_purge, soft_purge, []},
+ {update, mnesia_frag, soft, soft_purge, soft_purge, []},
+ {update, mnesia, soft, soft_purge, soft_purge, []},
{update, mnesia_dumper, soft, soft_purge, soft_purge, []}
]}
- ]
+ ],
+ {"4.4.17",[
+ {update, mnesia_controller, soft, soft_purge, soft_purge, []}
+ ]},
+ {"4.4.16",[
+ {update, mnesia_controller, soft, soft_purge, soft_purge, []},
+ {update, mnesia_frag, soft, soft_purge, soft_purge, []},
+ {update, mnesia_schema, soft, soft_purge, soft_purge, []}
+ ]},
+ {"4.4.15",[
+ {update, mnesia_controller, soft, soft_purge, soft_purge, []},
+ {update, mnesia_frag, soft, soft_purge, soft_purge, []},
+ {update, mnesia, soft, soft_purge, soft_purge, []},
+ {update, mnesia_dumper, soft, soft_purge, soft_purge, []}
+ ]}
}.
diff --git a/lib/mnesia/src/mnesia.erl b/lib/mnesia/src/mnesia.erl
index fb29007780..025b32f506 100644
--- a/lib/mnesia/src/mnesia.erl
+++ b/lib/mnesia/src/mnesia.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -302,7 +302,7 @@ ms() ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Activity mgt
--spec(abort/1 :: (_) -> no_return()).
+-spec abort(_) -> no_return().
abort(Reason) ->
exit({aborted, Reason}).
@@ -1835,6 +1835,7 @@ do_dirty_rpc(Tab, Node, M, F, Args) ->
%% Info
%% Info about one table
+-spec table_info(atom(), any()) -> any().
table_info(Tab, Item) ->
case get(mnesia_activity_state) of
undefined ->
@@ -1868,7 +1869,7 @@ any_table_info(Tab, Item) when is_atom(Tab) ->
type ->
case ?catch_val({Tab, setorbag}) of
{'EXIT', _} ->
- bad_info_reply(Tab, Item);
+ abort({no_exists, Tab, Item});
Val ->
Val
end;
@@ -1886,7 +1887,7 @@ any_table_info(Tab, Item) when is_atom(Tab) ->
_ ->
case ?catch_val({Tab, Item}) of
{'EXIT', _} ->
- bad_info_reply(Tab, Item);
+ abort({no_exists, Tab, Item});
Val ->
Val
end
diff --git a/lib/mnesia/src/mnesia_bup.erl b/lib/mnesia/src/mnesia_bup.erl
index 37a8258d74..47dcdad7ac 100644
--- a/lib/mnesia/src/mnesia_bup.erl
+++ b/lib/mnesia/src/mnesia_bup.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -65,6 +65,8 @@
default_op = keep_tables
}).
+-type fallback_args() :: #fallback_args{}.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Backup iterator
@@ -108,6 +110,7 @@ iter(R, Header, Schema, Fun, Acc, BupItems) ->
Acc2 = Fun(BupItems, Header, Schema, Acc),
iter(R, Header, Schema, Fun, Acc2, []).
+-spec safe_apply(#restore{}, atom(), list()) -> tuple().
safe_apply(R, write, [_, Items]) when Items =:= [] ->
R;
safe_apply(R, What, Args) ->
@@ -570,6 +573,7 @@ fallback_bup() -> mnesia_lib:dir(fallback_name()).
fallback_tmp_name() -> "FALLBACK.TMP".
%% fallback_full_tmp_name() -> mnesia_lib:dir(fallback_tmp_name()).
+-spec fallback_receiver(pid(), fallback_args()) -> no_return().
fallback_receiver(Master, FA) ->
process_flag(trap_exit, true),
@@ -981,6 +985,7 @@ do_uninstall_fallback(FA) ->
{error, Reason}
end.
+-spec uninstall_fallback_master(pid(), fallback_args()) -> no_return().
uninstall_fallback_master(ClientPid, FA) ->
process_flag(trap_exit, true),
diff --git a/lib/mnesia/src/mnesia_controller.erl b/lib/mnesia/src/mnesia_controller.erl
index 021be8af2a..0254769758 100644
--- a/lib/mnesia/src/mnesia_controller.erl
+++ b/lib/mnesia/src/mnesia_controller.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -457,7 +457,7 @@ connect_nodes2(Father, Ns, UserFun) ->
New1 = mnesia_lib:intersect(Ns, Connected),
New = New1 -- Current,
process_flag(trap_exit, true),
- Res = try_merge_schema(New, UserFun),
+ Res = try_merge_schema(New, [], UserFun),
Msg = {schema_is_merged, [], late_merge, []},
multicall([node()|Ns], Msg),
After = val({current, db_nodes}),
@@ -471,7 +471,7 @@ connect_nodes2(Father, Ns, UserFun) ->
merge_schema() ->
AllNodes = mnesia_lib:all_nodes(),
- case try_merge_schema(AllNodes, fun default_merge/1) of
+ case try_merge_schema(AllNodes, [node()], fun default_merge/1) of
ok ->
schema_is_merged();
{aborted, {throw, Str}} when is_list(Str) ->
@@ -483,11 +483,17 @@ merge_schema() ->
default_merge(F) ->
F([]).
-try_merge_schema(Nodes, UserFun) ->
+try_merge_schema(Nodes, Told0, UserFun) ->
case mnesia_schema:merge_schema(UserFun) of
{atomic, not_merged} ->
%% No more nodes that we need to merge the schema with
- ok;
+ %% Ensure we have told everybody that we are running
+ case val({current,db_nodes}) -- mnesia_lib:uniq(Told0) of
+ [] -> ok;
+ Tell ->
+ im_running(Tell, [node()]),
+ ok
+ end;
{atomic, {merged, OldFriends, NewFriends}} ->
%% Check if new nodes has been added to the schema
Diff = mnesia_lib:all_nodes() -- [node() | Nodes],
@@ -496,12 +502,18 @@ try_merge_schema(Nodes, UserFun) ->
%% Tell everybody to adopt orphan tables
im_running(OldFriends, NewFriends),
im_running(NewFriends, OldFriends),
-
- try_merge_schema(Nodes, UserFun);
+ Told = case lists:member(node(), NewFriends) of
+ true -> Told0 ++ OldFriends;
+ false -> Told0 ++ NewFriends
+ end,
+ try_merge_schema(Nodes, Told, UserFun);
{atomic, {"Cannot get cstructs", Node, Reason}} ->
dbg_out("Cannot get cstructs, Node ~p ~p~n", [Node, Reason]),
- timer:sleep(1000), % Avoid a endless loop look alike
- try_merge_schema(Nodes, UserFun);
+ timer:sleep(300), % Avoid a endless loop look alike
+ try_merge_schema(Nodes, Told0, UserFun);
+ {aborted, {shutdown, _}} -> %% One of the nodes is going down
+ timer:sleep(300), % Avoid a endless loop look alike
+ try_merge_schema(Nodes, Told0, UserFun);
Other ->
Other
end.
@@ -915,6 +927,7 @@ handle_cast(unblock_controller, State) ->
handle_cast({mnesia_down, Node}, State) ->
maybe_log_mnesia_down(Node),
mnesia_lib:del({current, db_nodes}, Node),
+ mnesia_lib:unset({node_up, Node}),
mnesia_checkpoint:tm_mnesia_down(Node),
Alltabs = val({schema, tables}),
reconfigure_tables(Node, Alltabs),
@@ -977,11 +990,12 @@ handle_cast(Msg, State) when State#state.schema_is_merged /= true ->
%% This must be done after schema_is_merged otherwise adopt_orphan
%% might trigger a table load from wrong nodes as a result of that we don't
%% know which tables we can load safly first.
-handle_cast({im_running, _Node, NewFriends}, State) ->
+handle_cast({im_running, Node, NewFriends}, State) ->
LocalTabs = mnesia_lib:local_active_tables() -- [schema],
RemoveLocalOnly = fun(Tab) -> not val({Tab, local_content}) end,
Tabs = lists:filter(RemoveLocalOnly, LocalTabs),
- Ns = mnesia_lib:intersect(NewFriends, val({current, db_nodes})),
+ Nodes = mnesia_lib:union([Node],val({current, db_nodes})),
+ Ns = mnesia_lib:intersect(NewFriends, Nodes),
abcast(Ns, {adopt_orphans, node(), Tabs}),
noreply(State);
@@ -1042,30 +1056,33 @@ handle_cast({master_nodes_updated, Tab, Masters}, State) ->
end;
handle_cast({adopt_orphans, Node, Tabs}, State) ->
-
State2 = node_has_tabs(Tabs, Node, State),
- %% Register the other node as up and running
- mnesia_recover:log_mnesia_up(Node),
- verbose("Logging mnesia_up ~w~n",[Node]),
- mnesia_lib:report_system_event({mnesia_up, Node}),
-
- %% Load orphan tables
- LocalTabs = val({schema, local_tables}) -- [schema],
- Nodes = val({current, db_nodes}),
- {LocalOrphans, RemoteMasters} =
- orphan_tables(LocalTabs, Node, Nodes, [], []),
- Reason = {adopt_orphan, node()},
- mnesia_late_loader:async_late_disc_load(node(), LocalOrphans, Reason),
-
- Fun =
- fun(N) ->
- RemoteOrphans =
- [Tab || {Tab, Ns} <- RemoteMasters,
- lists:member(N, Ns)],
- mnesia_late_loader:maybe_async_late_disc_load(N, RemoteOrphans, Reason)
- end,
- lists:foreach(Fun, Nodes),
+ case ?catch_val({node_up,Node}) of
+ true -> ignore;
+ _ ->
+ %% Register the other node as up and running
+ set({node_up, Node}, true),
+ mnesia_recover:log_mnesia_up(Node),
+ verbose("Logging mnesia_up ~w~n",[Node]),
+ mnesia_lib:report_system_event({mnesia_up, Node}),
+ %% Load orphan tables
+ LocalTabs = val({schema, local_tables}) -- [schema],
+ Nodes = val({current, db_nodes}),
+ {LocalOrphans, RemoteMasters} =
+ orphan_tables(LocalTabs, Node, Nodes, [], []),
+ Reason = {adopt_orphan, node()},
+ mnesia_late_loader:async_late_disc_load(node(), LocalOrphans, Reason),
+
+ Fun =
+ fun(N) ->
+ RemoteOrphans =
+ [Tab || {Tab, Ns} <- RemoteMasters,
+ lists:member(N, Ns)],
+ mnesia_late_loader:maybe_async_late_disc_load(N, RemoteOrphans, Reason)
+ end,
+ lists:foreach(Fun, Nodes)
+ end,
noreply(State2);
handle_cast(Msg, State) ->
diff --git a/lib/mnesia/src/mnesia_frag.erl b/lib/mnesia/src/mnesia_frag.erl
index a2958ab461..9e77fe0b9f 100644
--- a/lib/mnesia/src/mnesia_frag.erl
+++ b/lib/mnesia/src/mnesia_frag.erl
@@ -1,7 +1,7 @@
%%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -209,7 +209,7 @@ first(ActivityId, Opaque, Tab) ->
end
end.
-search_first(ActivityId, Opaque, Tab, N, FH) when N =< FH#frag_state.n_fragments ->
+search_first(ActivityId, Opaque, Tab, N, FH) when N < FH#frag_state.n_fragments ->
NextN = N + 1,
NextFrag = n_to_frag_name(Tab, NextN),
case mnesia:first(ActivityId, Opaque, NextFrag) of
@@ -448,13 +448,15 @@ do_remote_select(_ReplyTo, _Ref, [], _MatchSpec) ->
local_collect(Ref, Pid, Type, LocalMatch, OldSelectFun) ->
receive
- {local_select, Ref, LocalRes} ->
- remote_collect(Ref, Type, LocalRes, LocalMatch, OldSelectFun);
+ {local_select, Ref, ok} ->
+ remote_collect_ok(Ref, Type, LocalMatch, OldSelectFun);
+ {local_select, Ref, {error, Reason}} ->
+ remote_collect_error(Ref, Type, Reason, OldSelectFun);
{'EXIT', Pid, Reason} ->
- remote_collect(Ref, Type, {error, Reason}, [], OldSelectFun)
+ remote_collect_error(Ref, Type, Reason, OldSelectFun)
end.
-remote_collect(Ref, Type, LocalRes = ok, Acc, OldSelectFun) ->
+remote_collect_ok(Ref, Type, Acc, OldSelectFun) ->
receive
{remote_select, Ref, Node, RemoteRes} ->
case RemoteRes of
@@ -463,19 +465,21 @@ remote_collect(Ref, Type, LocalRes = ok, Acc, OldSelectFun) ->
ordered_set -> lists:merge(RemoteMatch, Acc);
_ -> RemoteMatch ++ Acc
end,
- remote_collect(Ref, Type, LocalRes, Matches, OldSelectFun);
+ remote_collect_ok(Ref, Type, Matches, OldSelectFun);
_ ->
- remote_collect(Ref, Type, {error, {node_not_running, Node}}, [], OldSelectFun)
+ Reason = {node_not_running, Node},
+ remote_collect_error(Ref, Type, Reason, OldSelectFun)
end
after 0 ->
Acc
- end;
-remote_collect(Ref, Type, LocalRes = {error, Reason}, _Acc, OldSelectFun) ->
+ end.
+
+remote_collect_error(Ref, Type, Reason, OldSelectFun) ->
receive
{remote_select, Ref, _Node, _RemoteRes} ->
- remote_collect(Ref, Type, LocalRes, [], OldSelectFun)
+ remote_collect_error(Ref, Type, Reason, OldSelectFun)
after 0 ->
- mnesia:abort(Reason)
+ mnesia:abort({error, Reason})
end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/mnesia/src/mnesia_index.erl b/lib/mnesia/src/mnesia_index.erl
index 4e6e8a997c..61210d7e55 100644
--- a/lib/mnesia/src/mnesia_index.erl
+++ b/lib/mnesia/src/mnesia_index.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
diff --git a/lib/mnesia/src/mnesia_lib.erl b/lib/mnesia/src/mnesia_lib.erl
index 3da3dd2f5c..36bcfe8de9 100644
--- a/lib/mnesia/src/mnesia_lib.erl
+++ b/lib/mnesia/src/mnesia_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -399,7 +399,7 @@ other_val(Var, Other) ->
pr_other(Var, Other)
end.
--spec(pr_other/2 :: (_,_) -> no_return()).
+-spec pr_other(_,_) -> no_return().
pr_other(Var, Other) ->
Why =
diff --git a/lib/mnesia/src/mnesia_locker.erl b/lib/mnesia/src/mnesia_locker.erl
index 6b5770d91e..ca0cc79c45 100644
--- a/lib/mnesia/src/mnesia_locker.erl
+++ b/lib/mnesia/src/mnesia_locker.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -1104,6 +1104,7 @@ do_stop() ->
system_continue(_Parent, _Debug, State) ->
loop(State).
+-spec system_terminate(_, _, _, _) -> no_return().
system_terminate(_Reason, _Parent, _Debug, _State) ->
do_stop().
diff --git a/lib/mnesia/src/mnesia_log.erl b/lib/mnesia/src/mnesia_log.erl
index 11b792026e..9e804cc4c2 100644
--- a/lib/mnesia/src/mnesia_log.erl
+++ b/lib/mnesia/src/mnesia_log.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
diff --git a/lib/mnesia/src/mnesia_recover.erl b/lib/mnesia/src/mnesia_recover.erl
index 7435b6896a..b3eed1de6e 100644
--- a/lib/mnesia/src/mnesia_recover.erl
+++ b/lib/mnesia/src/mnesia_recover.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
diff --git a/lib/mnesia/src/mnesia_schema.erl b/lib/mnesia/src/mnesia_schema.erl
index 17e570b881..d1d892a387 100644
--- a/lib/mnesia/src/mnesia_schema.erl
+++ b/lib/mnesia/src/mnesia_schema.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -2686,7 +2686,8 @@ do_merge_schema(LockTabs0) ->
if
RemoteRunning /= RemoteRunning1 ->
mnesia_lib:error("Mnesia on ~p could not connect to node(s) ~p~n",
- [node(), RemoteRunning1 -- RemoteRunning]);
+ [node(), RemoteRunning1 -- RemoteRunning]),
+ mnesia:abort({node_not_running, RemoteRunning1 -- RemoteRunning});
true -> ok
end,
NeedsLock = RemoteRunning -- LockedAlready,
@@ -3029,7 +3030,9 @@ announce_im_running([N | Ns], SchemaCs) ->
mnesia_lib:add({current, db_nodes}, N),
mnesia_controller:add_active_replica(schema, N, SchemaCs);
false ->
- ignore
+ mnesia_lib:error("Mnesia on ~p could not connect to node ~p~n",
+ [node(), N]),
+ mnesia:abort({node_not_running, N})
end,
announce_im_running(Ns, SchemaCs);
announce_im_running([], _) ->
diff --git a/lib/mnesia/src/mnesia_snmp_hook.erl b/lib/mnesia/src/mnesia_snmp_hook.erl
index 8b4b5231e1..893b39f3c0 100644
--- a/lib/mnesia/src/mnesia_snmp_hook.erl
+++ b/lib/mnesia/src/mnesia_snmp_hook.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
diff --git a/lib/mnesia/src/mnesia_tm.erl b/lib/mnesia/src/mnesia_tm.erl
index f3ffac5493..bb8e788b40 100644
--- a/lib/mnesia/src/mnesia_tm.erl
+++ b/lib/mnesia/src/mnesia_tm.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -1604,6 +1604,7 @@ tell_participants([Pid | Pids], Msg) ->
tell_participants([], _Msg) ->
ok.
+-spec commit_participant(_, _, _, _, _) -> no_return().
%% Trap exit because we can get a shutdown from application manager
commit_participant(Coord, Tid, Bin, DiscNs, RamNs) when is_binary(Bin) ->
process_flag(trap_exit, true),
@@ -2279,6 +2280,7 @@ fixtable(Tab, Lock, Me) ->
system_continue(_Parent, _Debug, State) ->
doit_loop(State).
+-spec system_terminate(_, _, _, _) -> no_return().
system_terminate(_Reason, _Parent, _Debug, State) ->
do_stop(State).
diff --git a/lib/mnesia/test/Makefile b/lib/mnesia/test/Makefile
index 4f98efaed1..b165924ef2 100644
--- a/lib/mnesia/test/Makefile
+++ b/lib/mnesia/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2009. All Rights Reserved.
+# Copyright Ericsson AB 1996-2011. 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
@@ -108,9 +108,9 @@ release_spec: opt
release_tests_spec: opt
$(INSTALL_DIR) $(RELSYSDIR)
- $(INSTALL_DATA) mnesia.spec mnesia.spec.vxworks $(ERL_FILES) $(HRL_FILES) $(RELSYSDIR)
+ $(INSTALL_DATA) mnesia.spec mnesia.cover $(ERL_FILES) $(HRL_FILES) $(RELSYSDIR)
$(INSTALL_SCRIPT) mt $(INSTALL_PROGS) $(RELSYSDIR)
-# chmod -f -R u+w $(RELSYSDIR)
+# chmod -R u+w $(RELSYSDIR)
# @tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
release_docs_spec:
diff --git a/lib/mnesia/test/mnesia.cover b/lib/mnesia/test/mnesia.cover
new file mode 100644
index 0000000000..66ffc06e89
--- /dev/null
+++ b/lib/mnesia/test/mnesia.cover
@@ -0,0 +1,2 @@
+{incl_app,mnesia,details}.
+
diff --git a/lib/mnesia/test/mnesia.spec b/lib/mnesia/test/mnesia.spec
index 596f8b917d..204d1519cb 100644
--- a/lib/mnesia/test/mnesia.spec
+++ b/lib/mnesia/test/mnesia.spec
@@ -1,23 +1,76 @@
-{topcase, {dir, "../mnesia_test"}}.
-{require_nodenames, 2}.
-{skip, {mnesia_measure_test, ram_meter, "Takes to long time"}}.
-{skip, {mnesia_measure_test, disc_meter, "Takes to long time"}}.
-{skip, {mnesia_measure_test, disc_only_meter, "Takes to long time"}}.
-{skip, {mnesia_measure_test, cost, "Takes to long time"}}.
-{skip, {mnesia_measure_test, dbn_meters, "Takes to long time"}}.
-{skip, {mnesia_measure_test, tpcb, "Takes to long time"}}.
-{skip, {mnesia_measure_test, prediction, "Not yet implemented"}}.
-{skip, {mnesia_measure_test, consumption, "Not yet implemented"}}.
-{skip, {mnesia_measure_test, scalability, "Not yet implemented"}}.
-{skip, {mnesia_measure_test, tpcb, "Takes too much time and memory"}}.
-{skip, {mnesia_measure_test, measure_all_api_functions, "Not yet implemented"}}.
-{skip, {mnesia_measure_test, mnemosyne_vs_mnesia_kernel, "Not yet implemented"}}.
-{skip, {mnesia_examples_test, company, "Not yet implemented"}}.
-{skip, {mnesia_config_test, ignore_fallback_at_startup, "Not yet implemented"}}.
-{skip, {mnesia_evil_backup, local_backup_checkpoint, "Not yet implemented"}}.
-{skip, {mnesia_config_test, max_wait_for_decision, "Not yet implemented"}}.
-{skip, {mnesia_recovery_test, after_full_disc_partition, "Not yet implemented"}}.
-{skip, {mnesia_recovery_test, system_upgrade, "Not yet implemented"}}.
-{skip, {mnesia_consistency_test, consistency_after_change_table_copy_type, "Not yet implemented"}}.
-{skip, {mnesia_consistency_test, consistency_after_transform_table, "Not yet implemented"}}.
-{skip, {mnesia_consistency_test, consistency_after_rename_of_node, "Not yet implemented"}}.
+{suites,"../mnesia_test",all}.
+{skip_cases,"../mnesia_test",mnesia_measure_test,
+ [ram_meter],
+ "Takes to long time"}.
+{skip_cases,"../mnesia_test",mnesia_measure_test,
+ [disc_meter],
+ "Takes to long time"}.
+{skip_cases,"../mnesia_test",mnesia_measure_test,
+ [disc_only_meter],
+ "Takes to long time"}.
+{skip_cases,"../mnesia_test",mnesia_measure_test,[cost],"Takes to long time"}.
+{skip_cases,"../mnesia_test",mnesia_measure_test,
+ [dbn_meters],
+ "Takes to long time"}.
+{skip_cases,"../mnesia_test",mnesia_measure_test,
+ [ram_tpcb,disc_tpcb,disc_only_tpcb],
+ "Takes to long time"}.
+{skip_cases,"../mnesia_test",mnesia_measure_test,
+ [reader_disturbed_by_node_down,writer_disturbed_by_node_down,
+ reader_disturbed_by_node_up,writer_disturbed_by_node_up,
+ reader_disturbed_by_schema_ops,writer_disturbed_by_schema_ops,
+ reader_disturbed_by_checkpoint,writer_disturbed_by_checkpoint,
+ reader_disturbed_by_dump_log,writer_disturbed_by_dump_log,
+ reader_disturbed_by_backup,writer_disturbed_by_backup,
+ reader_disturbed_by_restore,writer_disturbed_by_restore,
+ reader_competing_with_reader,reader_competing_with_writer,
+ writer_competing_with_reader,writer_competing_with_writer],
+ "Not yet implemented"}.
+{skip_cases,"../mnesia_test",mnesia_measure_test,
+ [measure_resource_consumption,determine_resource_leakage],
+ "Not yet implemented"}.
+{skip_cases,"../mnesia_test",mnesia_measure_test,
+ [determine_system_limits,performance_at_min_config,
+ performance_at_max_config,performance_at_full_load,
+ resource_consumption_at_min_config,
+ resource_consumption_at_max_config,
+ resource_consumption_at_full_load],
+ "Not yet implemented"}.
+{skip_cases,"../mnesia_test",mnesia_measure_test,
+ [ram_tpcb,disc_tpcb,disc_only_tpcb],
+ "Takes too much time and memory"}.
+{skip_cases,"../mnesia_test",mnesia_measure_test,
+ [measure_all_api_functions],
+ "Not yet implemented"}.
+{skip_cases,"../mnesia_test",mnesia_measure_test,
+ [mnemosyne_vs_mnesia_kernel],
+ "Not yet implemented"}.
+{skip_cases,"../mnesia_test",mnesia_examples_test,
+ [company],
+ "Not yet implemented"}.
+{skip_cases,"../mnesia_test",mnesia_config_test,
+ [ignore_fallback_at_startup],
+ "Not yet implemented"}.
+{skip_cases,"../mnesia_test",mnesia_evil_backup,
+ [local_backup_checkpoint],
+ "Not yet implemented"}.
+{skip_cases,"../mnesia_test",mnesia_config_test,
+ [max_wait_for_decision],
+ "Not yet implemented"}.
+{skip_cases,"../mnesia_test",mnesia_recovery_test,
+ [after_full_disc_partition],
+ "Not yet implemented"}.
+{skip_cases,"../mnesia_test",mnesia_recovery_test,
+ [system_upgrade],
+ "Not yet implemented"}.
+{skip_cases,"../mnesia_test",mnesia_consistency_test,
+ [consistency_after_change_table_copy_type],
+ "Not yet implemented"}.
+{skip_cases,"../mnesia_test",mnesia_consistency_test,
+ [consistency_after_transform_table_ram,
+ consistency_after_transform_table_disc,
+ consistency_after_transform_table_disc_only],
+ "Not yet implemented"}.
+{skip_cases,"../mnesia_test",mnesia_consistency_test,
+ [consistency_after_rename_of_node],
+ "Not yet implemented"}.
diff --git a/lib/mnesia/test/mnesia_SUITE.erl b/lib/mnesia/test/mnesia_SUITE.erl
index b28deaf330..8ba8427213 100644
--- a/lib/mnesia/test/mnesia_SUITE.erl
+++ b/lib/mnesia/test/mnesia_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -26,135 +26,122 @@
init_per_testcase(Func, Conf) ->
mnesia_test_lib:init_per_testcase(Func, Conf).
-fin_per_testcase(Func, Conf) ->
- mnesia_test_lib:fin_per_testcase(Func, Conf).
+end_per_testcase(Func, Conf) ->
+ mnesia_test_lib:end_per_testcase(Func, Conf).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(doc) ->
- ["Verify that Mnesia really is a distributed real-time DBMS",
- "This is the test suite of the Mnesia DBMS. The test suite",
- "covers many aspects of usage and is indended to be developed",
- "incrementally. The test suite is divided into a hierarchy of test",
- "suites where the leafs actually implements the test cases.",
- "The intention of each test case and sub test suite can be",
- "read in comments where they are implemented or in worst cases",
- "from their long mnemonic names. ",
- "",
- "The most simple test case of them all is called 'silly'",
- "and is useful to run now and then, e.g. when some new fatal",
- "bug has been introduced. It may be run even if Mnesia is in",
- "such a bad shape that the test machinery cannot be used.",
- "NB! Invoke the function directly with mnesia_SUITE:silly()",
- "and do not involve the normal test machinery."];
-all(suite) ->
- [
- light,
- medium,
- heavy,
- clean_up_suite
- ].
+suite() -> [{ct_hooks,[{ts_install_cth,[{nodenames,2}]}]}].
+
+
+%% Verify that Mnesia really is a distributed real-time DBMS.
+%% This is the test suite of the Mnesia DBMS. The test suite
+%% covers many aspects of usage and is indended to be developed
+%% incrementally. The test suite is divided into a hierarchy of test
+%% suites where the leafs actually implements the test cases.
+%% The intention of each test case and sub test suite can be
+%% read in comments where they are implemented or in worst cases
+%% from their long mnemonic names.
+%%
+%% The most simple test case of them all is called 'silly'
+%% and is useful to run now and then, e.g. when some new fatal
+%% bug has been introduced. It may be run even if Mnesia is in
+%% such a bad shape that the test machinery cannot be used.
+%% NB! Invoke the function directly with mnesia_SUITE:silly()
+%% and do not involve the normal test machinery.
+
+all() ->
+ [{group, light}, {group, medium}, {group, heavy},
+ clean_up_suite].
+
+groups() ->
+ %% The 'light' test suite runs a selected set of test suites and is
+ %% intended to be the smallest test suite that is meaningful
+ %% to run. It starts with an installation test (which in essence is the
+ %% 'silly' test case) and then it covers all functions in the API in
+ %% various depths. All configuration parameters and examples are also
+ %% covered.
+ [{light, [],
+ [{group, install}, {group, nice}, {group, evil},
+ {group, mnesia_frag_test, light}, {group, qlc},
+ {group, registry}, {group, config}, {group, examples}]},
+ {install, [], [{mnesia_install_test, all}]},
+ {nice, [], [{mnesia_nice_coverage_test, all}]},
+ {evil, [], [{mnesia_evil_coverage_test, all}]},
+ {qlc, [], [{mnesia_qlc_test, all}]},
+ {registry, [], [{mnesia_registry_test, all}]},
+ {config, [], [{mnesia_config_test, all}]},
+ {examples, [], [{mnesia_examples_test, all}]},
+ %% The 'medium' test suite verfies the ACID (atomicity, consistency
+ %% isolation and durability) properties and various recovery scenarios
+ %% These tests may take quite while to run.
+ {medium, [],
+ [{group, install}, {group, atomicity},
+ {group, isolation}, {group, durability},
+ {group, recovery}, {group, consistency},
+ {group, mnesia_frag_test, medium}]},
+ {atomicity, [], [{mnesia_atomicity_test, all}]},
+ {isolation, [], [{mnesia_isolation_test, all}]},
+ {durability, [], [{mnesia_durability_test, all}]},
+ {recovery, [], [{mnesia_recovery_test, all}]},
+ {consistency, [], [{mnesia_consistency_test, all}]},
+ %% The 'heavy' test suite runs some resource consuming tests and
+ %% benchmarks
+ {heavy, [], [{group, measure}]},
+ {measure, [], [{mnesia_measure_test, all}]},
+ {prediction, [],
+ [{group, mnesia_measure_test, prediction}]},
+ {fairness, [],
+ [{group, mnesia_measure_test, fairness}]},
+ {benchmarks, [],
+ [{group, mnesia_measure_test, benchmarks}]},
+ {consumption, [],
+ [{group, mnesia_measure_test, consumption}]},
+ {scalability, [],
+ [{group, mnesia_measure_test, scalability}]},
+ %% This test suite is an extract of the grand Mnesia suite
+ %% it contains OTP R4B specific test cases
+ {otp_r4b, [],
+ [{mnesia_config_test, access_module},
+ {mnesia_config_test, dump_log_load_regulation},
+ {mnesia_config_test, embedded_mnemosyne},
+ {mnesia_config_test, ignore_fallback_at_startup},
+ {mnesia_config_test, max_wait_for_decision},
+ {mnesia_consistency_test, consistency_after_restore},
+ {mnesia_evil_backup, restore},
+ {mnesia_evil_coverage_test, offline_set_master_nodes},
+ {mnesia_evil_coverage_test, record_name},
+ {mnesia_evil_coverage_test, user_properties},
+ {mnesia_registry_test, all}, {group, otp_2363}]},
+ %% Index on disc only tables
+ {otp_2363, [],
+ [{mnesia_dirty_access_test,
+ dirty_index_match_object_disc_only},
+ {mnesia_dirty_access_test, dirty_index_read_disc_only},
+ {mnesia_dirty_access_test,
+ dirty_index_update_bag_disc_only},
+ {mnesia_dirty_access_test,
+ dirty_index_update_set_disc_only},
+ {mnesia_evil_coverage_test,
+ create_live_table_index_disc_only}]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
silly() ->
mnesia_install_test:silly().
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-light(doc) ->
- ["The 'light' test suite runs a selected set of test suites and is",
- "intended to be the smallest test suite that is meaningful",
- "to run. It starts with an installation test (which in essence is the",
- "'silly' test case) and then it covers all functions in the API in",
- "various depths. All configuration parameters and examples are also",
- "covered."];
-light(suite) ->
- [
- install,
- nice,
- evil,
- {mnesia_frag_test, light},
- qlc,
- registry,
- config,
- examples
- ].
-
-install(suite) ->
- [{mnesia_install_test, all}].
-
-nice(suite) ->
- [{mnesia_nice_coverage_test, all}].
-
-evil(suite) ->
- [{mnesia_evil_coverage_test, all}].
-
-qlc(suite) ->
- [{mnesia_qlc_test, all}].
-
-registry(suite) ->
- [{mnesia_registry_test, all}].
-
-config(suite) ->
- [{mnesia_config_test, all}].
-
-examples(suite) ->
- [{mnesia_examples_test, all}].
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-medium(doc) ->
- ["The 'medium' test suite verfies the ACID (atomicity, consistency",
- "isolation and durability) properties and various recovery scenarios",
- "These tests may take quite while to run."];
-medium(suite) ->
- [
- install,
- atomicity,
- isolation,
- durability,
- recovery,
- consistency,
- {mnesia_frag_test, medium}
- ].
-
-atomicity(suite) ->
- [{mnesia_atomicity_test, all}].
-
-isolation(suite) ->
- [{mnesia_isolation_test, all}].
-
-durability(suite) ->
- [{mnesia_durability_test, all}].
-
-recovery(suite) ->
- [{mnesia_recovery_test, all}].
-
-consistency(suite) ->
- [{mnesia_consistency_test, all}].
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-heavy(doc) ->
- ["The 'heavy' test suite runs some resource consuming tests and",
- "benchmarks"];
-heavy(suite) ->
- [measure].
-
-measure(suite) ->
- [{mnesia_measure_test, all}].
-
-prediction(suite) ->
- [{mnesia_measure_test, prediction}].
-
-fairness(suite) ->
- [{mnesia_measure_test, fairness}].
-
-benchmarks(suite) ->
- [{mnesia_measure_test, benchmarks}].
-
-consumption(suite) ->
- [{mnesia_measure_test, consumption}].
-
-scalability(suite) ->
- [{mnesia_measure_test, scalability}].
-
clean_up_suite(doc) -> ["Not a test case only kills mnesia and nodes, that where"
"started during the tests"];
@@ -169,35 +156,7 @@ clean_up_suite(Config) when is_list(Config)->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-otp_r4b(doc) ->
- ["This test suite is an extract of the grand Mnesia suite",
- "it contains OTP R4B specific test cases"];
-otp_r4b(suite) ->
- [
- {mnesia_config_test, access_module},
- {mnesia_config_test, dump_log_load_regulation},
- {mnesia_config_test, embedded_mnemosyne},
- {mnesia_config_test, ignore_fallback_at_startup},
- {mnesia_config_test, max_wait_for_decision},
- {mnesia_consistency_test, consistency_after_restore},
- {mnesia_evil_backup, restore},
- {mnesia_evil_coverage_test, offline_set_master_nodes},
- {mnesia_evil_coverage_test, record_name},
- {mnesia_evil_coverage_test, user_properties},
- {mnesia_registry_test, all},
- otp_2363
- ].
-
-otp_2363(doc) ->
- ["Index on disc only tables"];
-otp_2363(suite) ->
- [
- {mnesia_dirty_access_test, dirty_index_match_object_disc_only},
- {mnesia_dirty_access_test,dirty_index_read_disc_only},
- {mnesia_dirty_access_test,dirty_index_update_bag_disc_only},
- {mnesia_dirty_access_test,dirty_index_update_set_disc_only},
- {mnesia_evil_coverage_test, create_live_table_index_disc_only}
- ].
+
diff --git a/lib/mnesia/test/mnesia_atomicity_test.erl b/lib/mnesia/test/mnesia_atomicity_test.erl
index 645c203a91..cf878fc820 100644
--- a/lib/mnesia/test/mnesia_atomicity_test.erl
+++ b/lib/mnesia/test/mnesia_atomicity_test.erl
@@ -27,24 +27,46 @@
init_per_testcase(Func, Conf) ->
mnesia_test_lib:init_per_testcase(Func, Conf).
-fin_per_testcase(Func, Conf) ->
- mnesia_test_lib:fin_per_testcase(Func, Conf).
+end_per_testcase(Func, Conf) ->
+ mnesia_test_lib:end_per_testcase(Func, Conf).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(doc) ->
- ["Verify atomicity of transactions",
- "Verify that transactions are atomic, i.e. either all operations",
- "in a transaction will be performed or none of them. It must be",
- "assured that no partitially completed operations leaves any",
- "effects in the database."];
-all(suite) ->
- [
- explicit_abort_in_middle_of_trans,
+all() ->
+ [explicit_abort_in_middle_of_trans,
runtime_error_in_middle_of_trans,
- kill_self_in_middle_of_trans,
- throw_in_middle_of_trans,
- mnesia_down_in_middle_of_trans
- ].
+ kill_self_in_middle_of_trans, throw_in_middle_of_trans,
+ {group, mnesia_down_in_middle_of_trans}].
+
+groups() ->
+ [{mnesia_down_in_middle_of_trans, [],
+ [mnesia_down_during_infinite_trans,
+ {group, lock_waiter}, {group, restart_check}]},
+ {lock_waiter, [],
+ [lock_waiter_sw_r, lock_waiter_sw_rt, lock_waiter_sw_wt,
+ lock_waiter_wr_r, lock_waiter_srw_r, lock_waiter_sw_sw,
+ lock_waiter_sw_w, lock_waiter_sw_wr, lock_waiter_sw_srw,
+ lock_waiter_wr_wt, lock_waiter_srw_wt,
+ lock_waiter_wr_sw, lock_waiter_srw_sw, lock_waiter_wr_w,
+ lock_waiter_srw_w, lock_waiter_r_sw, lock_waiter_r_w,
+ lock_waiter_r_wt, lock_waiter_rt_sw, lock_waiter_rt_w,
+ lock_waiter_rt_wt, lock_waiter_wr_wr,
+ lock_waiter_srw_srw, lock_waiter_wt_r, lock_waiter_wt_w,
+ lock_waiter_wt_rt, lock_waiter_wt_wt, lock_waiter_wt_wr,
+ lock_waiter_wt_srw, lock_waiter_wt_sw, lock_waiter_w_wr,
+ lock_waiter_w_srw, lock_waiter_w_sw, lock_waiter_w_r,
+ lock_waiter_w_w, lock_waiter_w_rt, lock_waiter_w_wt]},
+ {restart_check, [],
+ [restart_r_one, restart_w_one, restart_rt_one,
+ restart_wt_one, restart_wr_one, restart_sw_one,
+ restart_r_two, restart_w_two, restart_rt_two,
+ restart_wt_two, restart_wr_two, restart_sw_two]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
explicit_abort_in_middle_of_trans(suite) -> [];
@@ -259,12 +281,6 @@ throw_in_middle_of_trans(Config) when is_list(Config) ->
?verify_mnesia(Nodes, []).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-mnesia_down_in_middle_of_trans(suite) ->
- [
- mnesia_down_during_infinite_trans,
- lock_waiter,
- restart_check
- ].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
mnesia_down_during_infinite_trans(suite) -> [];
@@ -304,56 +320,6 @@ mnesia_down_during_infinite_trans(Config) when is_list(Config) ->
?verify_mnesia([Node2], [Node1]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-lock_waiter(doc) ->
- ["The purpose of this test case is to test the following situation:",
- "process B locks an object, process A accesses that object as",
- "well, but A has to wait for the lock to be released. Then",
- "mnesia of B goes down. Question: will A get the lock ?",
- "important: the transaction of A is the oldest one !!! (= a little tricky)",
- "",
- "several different access operations shall be tested",
- "rt = read_lock_table, wt = write_lock_table, r = read,",
- "sw = s_write, w = write, wr = wread"];
-lock_waiter(suite) ->
- [
- lock_waiter_sw_r,
- lock_waiter_sw_rt,
- lock_waiter_sw_wt,
- lock_waiter_wr_r,
- lock_waiter_srw_r,
- lock_waiter_sw_sw,
- lock_waiter_sw_w,
- lock_waiter_sw_wr,
- lock_waiter_sw_srw,
- lock_waiter_wr_wt,
- lock_waiter_srw_wt,
- lock_waiter_wr_sw,
- lock_waiter_srw_sw,
- lock_waiter_wr_w,
- lock_waiter_srw_w,
- lock_waiter_r_sw,
- lock_waiter_r_w,
- lock_waiter_r_wt,
- lock_waiter_rt_sw,
- lock_waiter_rt_w,
- lock_waiter_rt_wt,
- lock_waiter_wr_wr,
- lock_waiter_srw_srw,
- lock_waiter_wt_r,
- lock_waiter_wt_w,
- lock_waiter_wt_rt,
- lock_waiter_wt_wt,
- lock_waiter_wt_wr,
- lock_waiter_wt_srw,
- lock_waiter_wt_sw,
- lock_waiter_w_wr,
- lock_waiter_w_srw,
- lock_waiter_w_sw,
- lock_waiter_w_r,
- lock_waiter_w_w,
- lock_waiter_w_rt,
- lock_waiter_w_wt
- ].
lock_waiter_sw_r(suite) -> [];
lock_waiter_sw_r(Config) when is_list(Config) ->
@@ -649,29 +615,6 @@ wait(Mseconds) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-restart_check (doc) ->
- [
- "test case:'A' performs a transaction on a table which",
- "is only replicated on node B. During that transaction",
- "mnesia on node B is killed. The transaction of A should",
- "be stopped, since there is no further replica",
- "rt = read_lock_table, wt = write_lock_table, r = read,",
- "sw = s_write, w = write, wr = wread,"];
-restart_check(suite) ->
- [
- restart_r_one,
- restart_w_one,
- restart_rt_one,
- restart_wt_one,
- restart_wr_one,
- restart_sw_one,
- restart_r_two,
- restart_w_two,
- restart_rt_two,
- restart_wt_two,
- restart_wr_two,
- restart_sw_two
- ].
restart_r_one(suite) -> [];
restart_r_one(Config) when is_list(Config) ->
diff --git a/lib/mnesia/test/mnesia_config_backup.erl b/lib/mnesia/test/mnesia_config_backup.erl
index a33ec6ac5c..0916e255e2 100644
--- a/lib/mnesia/test/mnesia_config_backup.erl
+++ b/lib/mnesia/test/mnesia_config_backup.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2010. 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
diff --git a/lib/mnesia/test/mnesia_config_event.erl b/lib/mnesia/test/mnesia_config_event.erl
index 6c1dea7ed5..832bf94eb9 100644
--- a/lib/mnesia/test/mnesia_config_event.erl
+++ b/lib/mnesia/test/mnesia_config_event.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2010. 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
diff --git a/lib/mnesia/test/mnesia_config_test.erl b/lib/mnesia/test/mnesia_config_test.erl
index 7b62c63a62..93510d539c 100644
--- a/lib/mnesia/test/mnesia_config_test.erl
+++ b/lib/mnesia/test/mnesia_config_test.erl
@@ -27,14 +27,14 @@
-record(test_table2,{i, b}).
-export([
- all/1,
+ all/0,groups/0,init_per_group/2,end_per_group/2,
access_module/1,
auto_repair/1,
backup_module/1,
debug/1,
dir/1,
dump_log_load_regulation/1,
- dump_log_thresholds/1,
+
dump_log_update_in_place/1,
embedded_mnemosyne/1,
event_module/1,
@@ -44,7 +44,7 @@
send_compressed/1,
app_test/1,
- schema_config/1,
+
schema_merge/1,
unknown_config/1,
@@ -56,13 +56,13 @@
start_first_one_disc_less_then_two_more_disc_less/1,
schema_location_and_extra_db_nodes_combinations/1,
table_load_to_disc_less_nodes/1,
- dynamic_connect/1,
+
dynamic_basic/1,
dynamic_ext/1,
dynamic_bad/1,
init_per_testcase/2,
- fin_per_testcase/2,
+ end_per_testcase/2,
c_nodes/0
]).
@@ -95,46 +95,40 @@
init_per_testcase(Func, Conf) ->
mnesia_test_lib:init_per_testcase(Func, Conf).
-fin_per_testcase(Func, Conf) ->
- mnesia_test_lib:fin_per_testcase(Func, Conf).
+end_per_testcase(Func, Conf) ->
+ mnesia_test_lib:end_per_testcase(Func, Conf).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(doc) ->
- [
- "Test all configuration parameters",
- "Perform an exhaustive test of all the various parameters that",
- "may be used to configure the Mnesia application.",
- "",
- "Hint: Check out the unofficial function mnesia:start/1.",
- " But be careful to cleanup all configuration parameters",
- " afterwards since the rest of the test suite may rely on",
- " these default configurations. Perhaps it is best to run",
- " these tests in a separate node which is dropped afterwards.",
- "Are really all configuration parameters covered?"];
-
-all(suite) ->
- [
- access_module,
- auto_repair,
- backup_module,
- debug,
- dir,
- dump_log_load_regulation,
- dump_log_thresholds,
- dump_log_update_in_place,
- embedded_mnemosyne,
- event_module,
- ignore_fallback_at_startup,
- inconsistent_database,
- max_wait_for_decision,
- send_compressed,
-
- app_test,
- schema_config,
- unknown_config
- ].
+all() ->
+ [access_module, auto_repair, backup_module, debug, dir,
+ dump_log_load_regulation, {group, dump_log_thresholds},
+ dump_log_update_in_place, embedded_mnemosyne,
+ event_module, ignore_fallback_at_startup,
+ inconsistent_database, max_wait_for_decision,
+ send_compressed, app_test, {group, schema_config},
+ unknown_config].
+
+groups() ->
+ [{dump_log_thresholds, [],
+ [dump_log_time_threshold, dump_log_write_threshold]},
+ {schema_config, [],
+ [start_one_disc_full_then_one_disc_less,
+ start_first_one_disc_less_then_one_disc_full,
+ start_first_one_disc_less_then_two_more_disc_less,
+ schema_location_and_extra_db_nodes_combinations,
+ table_load_to_disc_less_nodes, schema_merge,
+ {group, dynamic_connect}]},
+ {dynamic_connect, [],
+ [dynamic_basic, dynamic_ext, dynamic_bad]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -445,21 +439,6 @@ dump_log_update_in_place(Config) when is_list(Config) ->
ok.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-dump_log_thresholds(doc) ->
- ["Elaborate with various values of the dump log thresholds and how",
- "they affects each others. Both the dump_log_time_threshold and the",
- "dump_log_write_threshold must be covered. Do also check that both",
- "kinds of overload events are generated as expected.",
- "",
- "Logs are checked by first doing whatever has to be done to trigger ",
- "a dump, and then stopping Mnesia and then look in the ",
- "data files and see that the correct amount of transactions ",
- "have been done."];
-dump_log_thresholds(suite) ->
- [
- dump_log_time_threshold,
- dump_log_write_threshold
- ].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dump_log_write_threshold(doc)->
@@ -783,22 +762,6 @@ event_module(Config) when is_list(Config) ->
ok.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-schema_config(doc) ->
- ["Try many configurations with various schema_location's with and",
- "without explicit extra_db_nodes. Do also provoke various schema merge",
- "situations. Most of the other test suites focusses on tests where the",
- "schema is residing on disc. Now it is time to perform an exhaustive",
- "elaboration with various disc less configurations."];
-schema_config(suite) ->
- [
- start_one_disc_full_then_one_disc_less,
- start_first_one_disc_less_then_one_disc_full,
- start_first_one_disc_less_then_two_more_disc_less,
- schema_location_and_extra_db_nodes_combinations,
- table_load_to_disc_less_nodes,
- schema_merge,
- dynamic_connect
- ].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
start_one_disc_full_then_one_disc_less(doc)->
["Start a disk node and then a disk less one. Distribute some",
@@ -1160,15 +1123,6 @@ sort(NS) when is_list(NS) ->
lists:sort(NS).
-dynamic_connect(doc) ->
- ["Test the new functionality where we start mnesia first and then "
- "connect to the other mnesia nodes"];
-dynamic_connect(suite) ->
- [
- dynamic_basic,
- dynamic_ext,
- dynamic_bad
- ].
dynamic_basic(suite) -> [];
diff --git a/lib/mnesia/test/mnesia_consistency_test.erl b/lib/mnesia/test/mnesia_consistency_test.erl
index ffe8ab7ac3..f38e13f3a2 100644
--- a/lib/mnesia/test/mnesia_consistency_test.erl
+++ b/lib/mnesia/test/mnesia_consistency_test.erl
@@ -27,33 +27,121 @@
init_per_testcase(Func, Conf) ->
mnesia_test_lib:init_per_testcase(Func, Conf).
-fin_per_testcase(Func, Conf) ->
- mnesia_test_lib:fin_per_testcase(Func, Conf).
+end_per_testcase(Func, Conf) ->
+ mnesia_test_lib:end_per_testcase(Func, Conf).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(doc) ->
- ["Verify transaction consistency",
- "Consistency is the property of the application that requires any",
- "execution of the transaction to take the database from one",
- "consistent state to another. Verify that the database is",
- "consistent at any point in time.",
- "Verify for various configurations.",
- " Verify for both set and bag"];
-all(suite) ->
- [
- consistency_after_restart,
- consistency_after_dump_tables,
- consistency_after_add_replica,
- consistency_after_del_replica,
- consistency_after_move_replica,
- consistency_after_transform_table,
+all() ->
+ [{group, consistency_after_restart},
+ {group, consistency_after_dump_tables},
+ {group, consistency_after_add_replica},
+ {group, consistency_after_del_replica},
+ {group, consistency_after_move_replica},
+ {group, consistency_after_transform_table},
consistency_after_change_table_copy_type,
- consistency_after_fallback,
- consistency_after_restore,
+ {group, consistency_after_fallback},
+ {group, consistency_after_restore},
consistency_after_rename_of_node,
- checkpoint_retainer_consistency,
- backup_consistency
- ].
+ {group, checkpoint_retainer_consistency},
+ {group, backup_consistency}].
+
+groups() ->
+ [{consistency_after_restart, [],
+ [consistency_after_restart_1_ram,
+ consistency_after_restart_1_disc,
+ consistency_after_restart_1_disc_only,
+ consistency_after_restart_2_ram,
+ consistency_after_restart_2_disc,
+ consistency_after_restart_2_disc_only]},
+ {consistency_after_dump_tables, [],
+ [consistency_after_dump_tables_1_ram,
+ consistency_after_dump_tables_2_ram]},
+ {consistency_after_add_replica, [],
+ [consistency_after_add_replica_2_ram,
+ consistency_after_add_replica_2_disc,
+ consistency_after_add_replica_2_disc_only,
+ consistency_after_add_replica_3_ram,
+ consistency_after_add_replica_3_disc,
+ consistency_after_add_replica_3_disc_only]},
+ {consistency_after_del_replica, [],
+ [consistency_after_del_replica_2_ram,
+ consistency_after_del_replica_2_disc,
+ consistency_after_del_replica_2_disc_only,
+ consistency_after_del_replica_3_ram,
+ consistency_after_del_replica_3_disc,
+ consistency_after_del_replica_3_disc_only]},
+ {consistency_after_move_replica, [],
+ [consistency_after_move_replica_2_ram,
+ consistency_after_move_replica_2_disc,
+ consistency_after_move_replica_2_disc_only,
+ consistency_after_move_replica_3_ram,
+ consistency_after_move_replica_3_disc,
+ consistency_after_move_replica_3_disc_only]},
+ {consistency_after_transform_table, [],
+ [consistency_after_transform_table_ram,
+ consistency_after_transform_table_disc,
+ consistency_after_transform_table_disc_only]},
+ {consistency_after_fallback, [],
+ [consistency_after_fallback_2_ram,
+ consistency_after_fallback_2_disc,
+ consistency_after_fallback_2_disc_only,
+ consistency_after_fallback_3_ram,
+ consistency_after_fallback_3_disc,
+ consistency_after_fallback_3_disc_only]},
+ {consistency_after_restore, [],
+ [consistency_after_restore_clear_ram,
+ consistency_after_restore_clear_disc,
+ consistency_after_restore_clear_disc_only,
+ consistency_after_restore_recreate_ram,
+ consistency_after_restore_recreate_disc,
+ consistency_after_restore_recreate_disc_only]},
+ {checkpoint_retainer_consistency, [],
+ [{group, updates_during_checkpoint_activation},
+ {group, updates_during_checkpoint_iteration},
+ {group, load_table_with_activated_checkpoint},
+ {group,
+ add_table_copy_to_table_with_activated_checkpoint}]},
+ {updates_during_checkpoint_activation, [],
+ [updates_during_checkpoint_activation_2_ram,
+ updates_during_checkpoint_activation_2_disc,
+ updates_during_checkpoint_activation_2_disc_only,
+ updates_during_checkpoint_activation_3_ram,
+ updates_during_checkpoint_activation_3_disc,
+ updates_during_checkpoint_activation_3_disc_only]},
+ {updates_during_checkpoint_iteration, [],
+ [updates_during_checkpoint_iteration_2_ram,
+ updates_during_checkpoint_iteration_2_disc,
+ updates_during_checkpoint_iteration_2_disc_only]},
+ {load_table_with_activated_checkpoint, [],
+ [load_table_with_activated_checkpoint_ram,
+ load_table_with_activated_checkpoint_disc,
+ load_table_with_activated_checkpoint_disc_only]},
+ {add_table_copy_to_table_with_activated_checkpoint, [],
+ [add_table_copy_to_table_with_activated_checkpoint_ram,
+ add_table_copy_to_table_with_activated_checkpoint_disc,
+ add_table_copy_to_table_with_activated_checkpoint_disc_only]},
+ {backup_consistency, [],
+ [{group, interupted_install_fallback},
+ {group, interupted_uninstall_fallback},
+ {group, mnesia_down_during_backup_causes_switch},
+ {group, mnesia_down_during_backup_causes_abort},
+ {group, schema_transactions_during_backup}]},
+ {interupted_install_fallback, [],
+ [inst_fallback_process_dies, fatal_when_inconsistency]},
+ {interupted_uninstall_fallback, [], [after_delete]},
+ {mnesia_down_during_backup_causes_switch, [],
+ [cause_switch_before, cause_switch_after]},
+ {mnesia_down_during_backup_causes_abort, [],
+ [cause_abort_before, cause_abort_after]},
+ {schema_transactions_during_backup, [],
+ [change_schema_before, change_schema_after]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
@@ -185,15 +273,6 @@ receive_messages(ListOfMsgs) ->
end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-consistency_after_restart(suite) ->
- [
- consistency_after_restart_1_ram,
- consistency_after_restart_1_disc,
- consistency_after_restart_1_disc_only,
- consistency_after_restart_2_ram,
- consistency_after_restart_2_disc,
- consistency_after_restart_2_disc_only
- ].
consistency_after_restart_1_ram(suite) -> [];
consistency_after_restart_1_ram(Config) when is_list(Config) ->
@@ -237,11 +316,6 @@ consistency_after_restart(ReplicaType, NodeConfig, Config) ->
?verify_mnesia(Nodes, []).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-consistency_after_dump_tables(suite) ->
- [
- consistency_after_dump_tables_1_ram,
- consistency_after_dump_tables_2_ram
- ].
consistency_after_dump_tables_1_ram(suite) -> [];
consistency_after_dump_tables_1_ram(Config) when is_list(Config) ->
@@ -274,15 +348,6 @@ consistency_after_dump_tables(ReplicaType, NodeConfig, Config) ->
?verify_mnesia(Nodes, []).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-consistency_after_add_replica(suite) ->
- [
- consistency_after_add_replica_2_ram,
- consistency_after_add_replica_2_disc,
- consistency_after_add_replica_2_disc_only,
- consistency_after_add_replica_3_ram,
- consistency_after_add_replica_3_disc,
- consistency_after_add_replica_3_disc_only
- ].
consistency_after_add_replica_2_ram(suite) -> [];
consistency_after_add_replica_2_ram(Config) when is_list(Config) ->
@@ -326,15 +391,6 @@ consistency_after_add_replica(ReplicaType, NodeConfig, Config) ->
?verify_mnesia(Nodes0, []).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-consistency_after_del_replica(suite) ->
- [
- consistency_after_del_replica_2_ram,
- consistency_after_del_replica_2_disc,
- consistency_after_del_replica_2_disc_only,
- consistency_after_del_replica_3_ram,
- consistency_after_del_replica_3_disc,
- consistency_after_del_replica_3_disc_only
- ].
consistency_after_del_replica_2_ram(suite) -> [];
consistency_after_del_replica_2_ram(Config) when is_list(Config) ->
@@ -377,15 +433,6 @@ consistency_after_del_replica(ReplicaType, NodeConfig, Config) ->
?verify_mnesia(Nodes, []).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-consistency_after_move_replica(suite) ->
- [
- consistency_after_move_replica_2_ram,
- consistency_after_move_replica_2_disc,
- consistency_after_move_replica_2_disc_only,
- consistency_after_move_replica_3_ram,
- consistency_after_move_replica_3_disc,
- consistency_after_move_replica_3_disc_only
- ].
consistency_after_move_replica_2_ram(suite) -> [];
consistency_after_move_replica_2_ram(Config) when is_list(Config) ->
@@ -430,16 +477,6 @@ consistency_after_move_replica(ReplicaType, NodeConfig, Config) ->
?verify_mnesia(Nodes, []).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-consistency_after_transform_table(doc) ->
- ["Check that the database is consistent after transform_table.",
- " While applications are updating the involved tables. "];
-
-consistency_after_transform_table(suite) ->
- [
- consistency_after_transform_table_ram,
- consistency_after_transform_table_disc,
- consistency_after_transform_table_disc_only
- ].
consistency_after_transform_table_ram(suite) -> [];
@@ -498,20 +535,6 @@ consistency_after_change_table_copy_type(doc) ->
" While applications are updating the involved tables. "].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-consistency_after_fallback(doc) ->
- ["Check that installed fallbacks are consistent. Check this by starting ",
- "some nodes, run tpcb on them, take a backup at any time, install it ",
- "as a fallback, kill all nodes, start mnesia again and check for ",
- "any inconsistencies"];
-consistency_after_fallback(suite) ->
- [
- consistency_after_fallback_2_ram,
- consistency_after_fallback_2_disc,
- consistency_after_fallback_2_disc_only,
- consistency_after_fallback_3_ram,
- consistency_after_fallback_3_disc
- , consistency_after_fallback_3_disc_only
- ].
consistency_after_fallback_2_ram(suite) -> [];
consistency_after_fallback_2_ram(Config) when is_list(Config) ->
@@ -583,18 +606,6 @@ consistency_after_fallback(ReplicaType, NodeConfig, Config) ->
?verify_mnesia(Nodes, []).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-consistency_after_restore(doc) ->
- ["Verify consistency after restore operations."];
-
-consistency_after_restore(suite) ->
- [
- consistency_after_restore_clear_ram,
- consistency_after_restore_clear_disc,
- consistency_after_restore_clear_disc_only,
- consistency_after_restore_recreate_ram,
- consistency_after_restore_recreate_disc,
- consistency_after_restore_recreate_disc_only
- ].
consistency_after_restore_clear_ram(suite) -> [];
consistency_after_restore_clear_ram(Config) when is_list(Config) ->
@@ -716,32 +727,8 @@ consistency_after_rename_of_node(doc) ->
["Skipped because it is an unimportant case."].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-checkpoint_retainer_consistency(doc) ->
- ["Verify that the contents of a checkpoint retainer has the expected",
- "contents in various situations."];
-checkpoint_retainer_consistency(suite) ->
- [
- updates_during_checkpoint_activation,
- updates_during_checkpoint_iteration,
- load_table_with_activated_checkpoint,
- add_table_copy_to_table_with_activated_checkpoint
- ].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-updates_during_checkpoint_activation(doc) ->
- ["Perform updates while the checkpoint getting activated",
- "and verify that all checkpoint retainers associated with",
- "different replicas of the same table really has the same",
- "contents."];
-updates_during_checkpoint_activation(suite) ->
- [
- updates_during_checkpoint_activation_2_ram,
- updates_during_checkpoint_activation_2_disc,
- updates_during_checkpoint_activation_2_disc_only,
- updates_during_checkpoint_activation_3_ram,
- updates_during_checkpoint_activation_3_disc
- , updates_during_checkpoint_activation_3_disc_only
- ].
updates_during_checkpoint_activation_2_ram(suite) -> [];
updates_during_checkpoint_activation_2_ram(Config) when is_list(Config) ->
@@ -808,17 +795,6 @@ updates_during_checkpoint_activation(ReplicaType,NodeConfig,Config) ->
?verify_mnesia(Nodes, []).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-updates_during_checkpoint_iteration(doc) ->
- ["Perform updates while someone is iterating over a checkpoint",
- "and verify that the iterator really finds the expected data",
- "regardless of ongoing upates."];
-
-updates_during_checkpoint_iteration(suite) ->
- [
- updates_during_checkpoint_iteration_2_ram,
- updates_during_checkpoint_iteration_2_disc
- , updates_during_checkpoint_iteration_2_disc_only
- ].
updates_during_checkpoint_iteration_2_ram(suite) -> [];
updates_during_checkpoint_iteration_2_ram(Config) when is_list(Config) ->
@@ -890,17 +866,6 @@ loop_accounts(N_br, N_acc) when N_acc >= 1 ->
loop_accounts(_,_) -> done.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-load_table_with_activated_checkpoint(doc) ->
- ["Load a table with a checkpoint attached to it and verify that the",
- "newly loaded replica also gets a checkpoint retainer attached to it",
- "and that it is consistent with the original retainer."];
-
-load_table_with_activated_checkpoint(suite) ->
- [
- load_table_with_activated_checkpoint_ram,
- load_table_with_activated_checkpoint_disc,
- load_table_with_activated_checkpoint_disc_only
- ].
load_table_with_activated_checkpoint_ram(suite) -> [];
load_table_with_activated_checkpoint_ram(Config) when is_list(Config) ->
@@ -986,18 +951,6 @@ view(Source, Mod) ->
lists:sort(TabList).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-add_table_copy_to_table_with_activated_checkpoint(doc) ->
- ["Add a replica to a table with a checkpoint attached to it",
- "and verify that the new replica also gets a checkpoint",
- "retainer attached to it and that it is consistent with the",
- "original retainer."];
-
-add_table_copy_to_table_with_activated_checkpoint(suite) ->
- [
- add_table_copy_to_table_with_activated_checkpoint_ram,
- add_table_copy_to_table_with_activated_checkpoint_disc,
- add_table_copy_to_table_with_activated_checkpoint_disc_only
- ].
add_table_copy_to_table_with_activated_checkpoint_ram(suite) -> [];
add_table_copy_to_table_with_activated_checkpoint_ram(Config) when is_list(Config) ->
@@ -1070,25 +1023,8 @@ add_table_copy_to_table_with_activated_checkpoint(Type,Config) ->
?verify_mnesia(Nodes, []).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-backup_consistency(suite) ->
- [
- interupted_install_fallback,
- interupted_uninstall_fallback,
- mnesia_down_during_backup_causes_switch,
- mnesia_down_during_backup_causes_abort,
- schema_transactions_during_backup
- ].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-interupted_install_fallback(doc) ->
- ["Verify that a interrupted install_fallback really",
- "is performed on all nodes or none"];
-
-interupted_install_fallback(suite) ->
- [
- inst_fallback_process_dies,
- fatal_when_inconsistency
- ].
inst_fallback_process_dies(suite) ->
[];
@@ -1232,13 +1168,6 @@ is_running(Node, Shouldbe) ->
end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-interupted_uninstall_fallback(doc) ->
- ["Verify that a interrupted uninstall_fallback really",
- "is performed on all nodes or none"];
-interupted_uninstall_fallback(suite) ->
- [
- after_delete
- ].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -1371,17 +1300,6 @@ do_uninstall(Config,DebugPoint) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-mnesia_down_during_backup_causes_switch(doc) ->
- ["Verify that an ongoing backup is not disturbed",
- "even if the node hosting the replica that currently",
- "is being backup'ed is stopped. The backup utility",
- "is expected to switch over to another replica and",
- "fulfill the backup."];
-mnesia_down_during_backup_causes_switch(suite) ->
- [
- cause_switch_before,
- cause_switch_after
- ].
%%%%%%%%%%%%%%%
@@ -1401,16 +1319,6 @@ cause_switch_after(Config) when is_list(Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-mnesia_down_during_backup_causes_abort(doc) ->
- ["Verify that an ongoing backup is aborted nicely",
- "without leaving any backup file if the last replica",
- "of a table becomes unavailable due to a node down",
- "or some crash."];
-mnesia_down_during_backup_causes_abort(suite) ->
- [
- cause_abort_before,
- cause_abort_after
- ].
%%%%%%%%%%%%%%%%%%
@@ -1432,14 +1340,6 @@ cause_abort_after(Config) when is_list(Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-schema_transactions_during_backup(doc) ->
- ["Verify that an schema transactions does not",
- "affect an ongoing backup."];
-schema_transactions_during_backup(suite) ->
- [
- change_schema_before,
- change_schema_after
- ].
%%%%%%%%%%%%%
diff --git a/lib/mnesia/test/mnesia_cost.erl b/lib/mnesia/test/mnesia_cost.erl
index 54cb2b3064..3221f46f61 100644
--- a/lib/mnesia/test/mnesia_cost.erl
+++ b/lib/mnesia/test/mnesia_cost.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2010. 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
diff --git a/lib/mnesia/test/mnesia_dirty_access_test.erl b/lib/mnesia/test/mnesia_dirty_access_test.erl
index 5f9f2a9733..abbdab48c0 100644
--- a/lib/mnesia/test/mnesia_dirty_access_test.erl
+++ b/lib/mnesia/test/mnesia_dirty_access_test.erl
@@ -26,37 +26,72 @@
init_per_testcase(Func, Conf) ->
mnesia_test_lib:init_per_testcase(Func, Conf).
-fin_per_testcase(Func, Conf) ->
- mnesia_test_lib:fin_per_testcase(Func, Conf).
+end_per_testcase(Func, Conf) ->
+ mnesia_test_lib:end_per_testcase(Func, Conf).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(doc) ->
- ["Evil dirty access, regardless of transaction scope.",
- "Invoke all functions in the API and try to cover all legal uses",
- "cases as well the illegal dito. This is a complement to the",
- "other more explicit test cases."];
-all(suite) ->
- [
- dirty_write,
- dirty_read,
- dirty_update_counter,
- dirty_delete,
- dirty_delete_object,
- dirty_match_object,
- dirty_index,
- dirty_iter,
- admin_tests
- ].
+all() ->
+ [{group, dirty_write}, {group, dirty_read},
+ {group, dirty_update_counter}, {group, dirty_delete},
+ {group, dirty_delete_object},
+ {group, dirty_match_object}, {group, dirty_index},
+ {group, dirty_iter}, {group, admin_tests}].
+
+groups() ->
+ [{dirty_write, [],
+ [dirty_write_ram, dirty_write_disc,
+ dirty_write_disc_only]},
+ {dirty_read, [],
+ [dirty_read_ram, dirty_read_disc,
+ dirty_read_disc_only]},
+ {dirty_update_counter, [],
+ [dirty_update_counter_ram, dirty_update_counter_disc,
+ dirty_update_counter_disc_only]},
+ {dirty_delete, [],
+ [dirty_delete_ram, dirty_delete_disc,
+ dirty_delete_disc_only]},
+ {dirty_delete_object, [],
+ [dirty_delete_object_ram, dirty_delete_object_disc,
+ dirty_delete_object_disc_only]},
+ {dirty_match_object, [],
+ [dirty_match_object_ram, dirty_match_object_disc,
+ dirty_match_object_disc_only]},
+ {dirty_index, [],
+ [{group, dirty_index_match_object},
+ {group, dirty_index_read},
+ {group, dirty_index_update}]},
+ {dirty_index_match_object, [],
+ [dirty_index_match_object_ram,
+ dirty_index_match_object_disc,
+ dirty_index_match_object_disc_only]},
+ {dirty_index_read, [],
+ [dirty_index_read_ram, dirty_index_read_disc,
+ dirty_index_read_disc_only]},
+ {dirty_index_update, [],
+ [dirty_index_update_set_ram,
+ dirty_index_update_set_disc,
+ dirty_index_update_set_disc_only,
+ dirty_index_update_bag_ram, dirty_index_update_bag_disc,
+ dirty_index_update_bag_disc_only]},
+ {dirty_iter, [],
+ [dirty_iter_ram, dirty_iter_disc,
+ dirty_iter_disc_only]},
+ {admin_tests, [],
+ [del_table_copy_1, del_table_copy_2, del_table_copy_3,
+ add_table_copy_1, add_table_copy_2, add_table_copy_3,
+ add_table_copy_4, move_table_copy_1, move_table_copy_2,
+ move_table_copy_3, move_table_copy_4]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Write records dirty
-dirty_write(suite) ->
- [
- dirty_write_ram,
- dirty_write_disc,
- dirty_write_disc_only
- ].
dirty_write_ram(suite) -> [];
dirty_write_ram(Config) when is_list(Config) ->
@@ -88,12 +123,6 @@ dirty_write(Config, Storage) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Read records dirty
-dirty_read(suite) ->
- [
- dirty_read_ram,
- dirty_read_disc,
- dirty_read_disc_only
- ].
dirty_read_ram(suite) -> [];
dirty_read_ram(Config) when is_list(Config) ->
@@ -137,12 +166,6 @@ dirty_read(Config, Storage) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Update counter record dirty
-dirty_update_counter(suite) ->
- [
- dirty_update_counter_ram,
- dirty_update_counter_disc,
- dirty_update_counter_disc_only
- ].
dirty_update_counter_ram(suite) -> [];
dirty_update_counter_ram(Config) when is_list(Config) ->
@@ -180,12 +203,6 @@ dirty_update_counter(Config, Storage) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Delete record dirty
-dirty_delete(suite) ->
- [
- dirty_delete_ram,
- dirty_delete_disc,
- dirty_delete_disc_only
- ].
dirty_delete_ram(suite) -> [];
dirty_delete_ram(Config) when is_list(Config) ->
@@ -223,12 +240,6 @@ dirty_delete(Config, Storage) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Delete matching record dirty
-dirty_delete_object(suite) ->
- [
- dirty_delete_object_ram,
- dirty_delete_object_disc,
- dirty_delete_object_disc_only
- ].
dirty_delete_object_ram(suite) -> [];
dirty_delete_object_ram(Config) when is_list(Config) ->
@@ -272,12 +283,6 @@ dirty_delete_object(Config, Storage) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Read matching records dirty
-dirty_match_object(suite) ->
- [
- dirty_match_object_ram,
- dirty_match_object_disc,
- dirty_match_object_disc_only
- ].
dirty_match_object_ram(suite) -> [];
dirty_match_object_ram(Config) when is_list(Config) ->
@@ -311,22 +316,10 @@ dirty_match_object(Config, Storage) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-dirty_index(suite) ->
- [
- dirty_index_match_object,
- dirty_index_read,
- dirty_index_update
- ].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Dirty read matching records by using an index
-dirty_index_match_object(suite) ->
- [
- dirty_index_match_object_ram,
- dirty_index_match_object_disc,
- dirty_index_match_object_disc_only
- ].
dirty_index_match_object_ram(suite) -> [];
dirty_index_match_object_ram(Config) when is_list(Config) ->
@@ -364,12 +357,6 @@ dirty_index_match_object(Config, Storage) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Read records by using an index
-dirty_index_read(suite) ->
- [
- dirty_index_read_ram,
- dirty_index_read_disc,
- dirty_index_read_disc_only
- ].
dirty_index_read_ram(suite) -> [];
dirty_index_read_ram(Config) when is_list(Config) ->
@@ -413,19 +400,6 @@ dirty_index_read(Config, Storage) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-dirty_index_update(suite) ->
- [
- dirty_index_update_set_ram,
- dirty_index_update_set_disc,
- dirty_index_update_set_disc_only,
- dirty_index_update_bag_ram,
- dirty_index_update_bag_disc,
- dirty_index_update_bag_disc_only
- ];
-dirty_index_update(doc) ->
- ["See Ticket OTP-2083, verifies that a table with a index is "
- "update in the correct way i.e. the index finds the correct "
- "records after a update"].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dirty_index_update_set_ram(suite) -> [];
@@ -631,12 +605,6 @@ dirty_index_update_bag(Config, Storage) ->
%% Dirty iteration
%% dirty_slot, dirty_first, dirty_next
-dirty_iter(suite) ->
- [
- dirty_iter_ram,
- dirty_iter_disc,
- dirty_iter_disc_only
- ].
dirty_iter_ram(suite) -> [];
dirty_iter_ram(Config) when is_list(Config) ->
@@ -700,21 +668,6 @@ all_nexts(Tab, PrevKey) ->
[PrevKey] ++ all_nexts(Tab, Key).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-admin_tests(doc) ->
- ["Verifies that dirty operations work during schema operations"];
-
-admin_tests(suite) ->
- [del_table_copy_1,
- del_table_copy_2,
- del_table_copy_3,
- add_table_copy_1,
- add_table_copy_2,
- add_table_copy_3,
- add_table_copy_4,
- move_table_copy_1,
- move_table_copy_2,
- move_table_copy_3,
- move_table_copy_4].
update_trans(Tab, Key, Acc) ->
Update =
diff --git a/lib/mnesia/test/mnesia_durability_test.erl b/lib/mnesia/test/mnesia_durability_test.erl
index b917b0ca40..55205d1222 100644
--- a/lib/mnesia/test/mnesia_durability_test.erl
+++ b/lib/mnesia/test/mnesia_durability_test.erl
@@ -28,47 +28,54 @@
init_per_testcase(Func, Conf) ->
mnesia_test_lib:init_per_testcase(Func, Conf).
-fin_per_testcase(Func, Conf) ->
- mnesia_test_lib:fin_per_testcase(Func, Conf).
+end_per_testcase(Func, Conf) ->
+ mnesia_test_lib:end_per_testcase(Func, Conf).
-record(test_rec,{key,val}).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(doc) ->
- ["Verify durability",
- "Verify that the effects of committed transactions are durable.",
- "The content of the tables tables must be restored at startup."];
-all(suite) ->
- [
- load_tables,
- durability_of_dump_tables,
+all() ->
+ [{group, load_tables},
+ {group, durability_of_dump_tables},
durability_of_disc_copies,
- durability_of_disc_only_copies
- ].
+ durability_of_disc_only_copies].
+
+groups() ->
+ [{load_tables, [],
+ [load_latest_data, load_local_contents_directly,
+ load_directly_when_all_are_ram_copiesA,
+ load_directly_when_all_are_ram_copiesB,
+ {group, late_load_when_all_are_ram_copies_on_ram_nodes},
+ load_when_last_replica_becomes_available,
+ load_when_we_have_down_from_all_other_replica_nodes,
+ late_load_transforms_into_disc_load,
+ late_load_leads_to_hanging,
+ force_load_when_nobody_intents_to_load,
+ force_load_when_someone_has_decided_to_load,
+ force_load_when_someone_else_already_has_loaded,
+ force_load_when_we_has_loaded,
+ force_load_on_a_non_local_table,
+ force_load_when_the_table_does_not_exist,
+ {group, load_tables_with_master_tables}]},
+ {late_load_when_all_are_ram_copies_on_ram_nodes, [],
+ [late_load_when_all_are_ram_copies_on_ram_nodes1,
+ late_load_when_all_are_ram_copies_on_ram_nodes2]},
+ {load_tables_with_master_tables, [],
+ [master_nodes, starting_master_nodes,
+ master_on_non_local_tables,
+ remote_force_load_with_local_master_node]},
+ {durability_of_dump_tables, [],
+ [dump_ram_copies, dump_disc_copies, dump_disc_only]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-load_tables(doc) ->
- ["Try to provoke all kinds of table load scenarios."];
-load_tables(suite) ->
- [
- load_latest_data,
- load_local_contents_directly,
- load_directly_when_all_are_ram_copiesA,
- load_directly_when_all_are_ram_copiesB,
- late_load_when_all_are_ram_copies_on_ram_nodes,
- load_when_last_replica_becomes_available,
- load_when_we_have_down_from_all_other_replica_nodes,
- late_load_transforms_into_disc_load,
- late_load_leads_to_hanging,
- force_load_when_nobody_intents_to_load,
- force_load_when_someone_has_decided_to_load,
- force_load_when_someone_else_already_has_loaded,
- force_load_when_we_has_loaded,
- force_load_on_a_non_local_table,
- force_load_when_the_table_does_not_exist,
- load_tables_with_master_tables
- ].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
load_latest_data(doc) ->
@@ -284,13 +291,6 @@ load_directly_when_all_are_ram_copiesB(Config) when is_list(Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-late_load_when_all_are_ram_copies_on_ram_nodes(doc) ->
- ["Load of ram_copies tables when all replicas resides on disc less nodes"];
-late_load_when_all_are_ram_copies_on_ram_nodes(suite) ->
- [
- late_load_when_all_are_ram_copies_on_ram_nodes1,
- late_load_when_all_are_ram_copies_on_ram_nodes2
- ].
late_load_when_all_are_ram_copies_on_ram_nodes1(suite) -> [];
late_load_when_all_are_ram_copies_on_ram_nodes1(Config) when is_list(Config) ->
@@ -916,22 +916,6 @@ force_load_when_the_table_does_not_exist(Config) when is_list(Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-load_tables_with_master_tables(doc) ->
- ["Verifies the semantics of different master nodes settings",
- "The semantics should be:",
- "1. Mnesia downs, Normally decides from where mnesia should load tables",
- "2. Master tables (overrides mnesia downs) ",
- "3. Force load (overrides Master tables) ",
- "--- 1st from active master nodes",
- "--- 2nd from active nodes",
- "--- 3rd get local copy (if ram create new one)"
- ];
-
-load_tables_with_master_tables(suite) ->
- [master_nodes,
- starting_master_nodes,
- master_on_non_local_tables,
- remote_force_load_with_local_master_node].
-define(SDwrite(Tup), fun() -> mnesia:write(Tup) end).
@@ -1156,13 +1140,6 @@ remote_force_load_with_local_master_node(Config) when is_list(Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-durability_of_dump_tables(doc) ->
- [ "Verify that all tables contain the correct data when Mnesia",
- "is restarted and tables are loaded from disc to recover",
- " their previous contents. " ];
-durability_of_dump_tables(suite) -> [dump_ram_copies,
- dump_disc_copies,
- dump_disc_only].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/mnesia/test/mnesia_evil_backup.erl b/lib/mnesia/test/mnesia_evil_backup.erl
index bbbebeb02c..63f4146d98 100644
--- a/lib/mnesia/test/mnesia_evil_backup.erl
+++ b/lib/mnesia/test/mnesia_evil_backup.erl
@@ -35,31 +35,30 @@
init_per_testcase(Func, Conf) ->
mnesia_test_lib:init_per_testcase(Func, Conf).
-fin_per_testcase(Func, Conf) ->
- mnesia_test_lib:fin_per_testcase(Func, Conf).
+end_per_testcase(Func, Conf) ->
+ mnesia_test_lib:end_per_testcase(Func, Conf).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(doc) ->
- ["Checking all the functionality regarding ",
- "to the backup and different ",
- "kinds of restore and fallback interface"];
-
-all(suite) ->
- [
- backup,
- bad_backup,
- global_backup_checkpoint,
- restore_tables,
- traverse_backup,
+all() ->
+ [backup, bad_backup, global_backup_checkpoint,
+ {group, restore_tables}, traverse_backup,
selective_backup_checkpoint,
- incremental_backup_checkpoint,
-%% local_backup_checkpoint,
- install_fallback,
- uninstall_fallback,
- local_fallback,
- sops_with_checkpoint
- ].
+ incremental_backup_checkpoint, install_fallback,
+ uninstall_fallback, local_fallback,
+ sops_with_checkpoint].
+
+groups() ->
+ [{restore_tables, [],
+ [restore_errors, restore_clear, restore_keep,
+ restore_recreate, restore_clear_ram]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
backup(doc) -> ["Checking the interface to the function backup",
"We don't check that the backups can be used here",
@@ -132,17 +131,6 @@ global_backup_checkpoint(Config) when is_list(Config) ->
?match(ok, file:delete(File2)),
?verify_mnesia(Nodes, []).
-restore_tables(doc) ->
- ["Tests the interface of restore"];
-
-restore_tables(suite) ->
- [
- restore_errors,
- restore_clear,
- restore_keep,
- restore_recreate,
- restore_clear_ram
- ].
restore_errors(suite) -> [];
restore_errors(Config) when is_list(Config) ->
diff --git a/lib/mnesia/test/mnesia_evil_coverage_test.erl b/lib/mnesia/test/mnesia_evil_coverage_test.erl
index 4fbf1b4003..668eba176f 100644
--- a/lib/mnesia/test/mnesia_evil_coverage_test.erl
+++ b/lib/mnesia/test/mnesia_evil_coverage_test.erl
@@ -30,45 +30,54 @@
init_per_testcase(Func, Conf) ->
mnesia_test_lib:init_per_testcase(Func, Conf).
-fin_per_testcase(Func, Conf) ->
- mnesia_test_lib:fin_per_testcase(Func, Conf).
+end_per_testcase(Func, Conf) ->
+ mnesia_test_lib:end_per_testcase(Func, Conf).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(doc) ->
- ["Evil usage of the API.",
- "Invoke all functions in the API and try to cover all legal uses",
- "cases as well the illegal dito. This is a complement to the",
- "other more explicit test cases."];
-all(suite) ->
- [
- system_info,
- table_info,
- error_description,
- db_node_lifecycle,
- evil_delete_db_node,
- start_and_stop,
- checkpoint,
- table_lifecycle,
- add_copy_conflict,
- add_copy_when_going_down,
- replica_management,
- schema_availability,
- local_content,
- table_access_modifications,
- replica_location,
- table_sync,
- user_properties,
- unsupp_user_props,
- record_name,
- snmp_access,
- subscriptions,
- iteration,
- debug_support,
- sorted_ets,
+all() ->
+ [system_info, table_info, error_description,
+ db_node_lifecycle, evil_delete_db_node, start_and_stop,
+ checkpoint, table_lifecycle, add_copy_conflict,
+ add_copy_when_going_down, replica_management,
+ schema_availability, local_content,
+ {group, table_access_modifications}, replica_location,
+ {group, table_sync}, user_properties, unsupp_user_props,
+ {group, record_name}, {group, snmp_access},
+ {group, subscriptions}, {group, iteration},
+ {group, debug_support}, sorted_ets,
{mnesia_dirty_access_test, all},
{mnesia_trans_access_test, all},
- {mnesia_evil_backup, all}
- ].
+ {mnesia_evil_backup, all}].
+
+groups() ->
+ [{table_access_modifications, [],
+ [change_table_access_mode, change_table_load_order,
+ set_master_nodes, offline_set_master_nodes]},
+ {table_sync, [],
+ [dump_tables, dump_log, wait_for_tables,
+ force_load_table]},
+ {snmp_access, [],
+ [snmp_open_table, snmp_close_table, snmp_get_next_index,
+ snmp_get_row, snmp_get_mnesia_key, snmp_update_counter,
+ snmp_order]},
+ {subscriptions, [],
+ [subscribe_standard, subscribe_extended]},
+ {iteration, [], [foldl]},
+ {debug_support, [],
+ [info, schema_0, schema_1, view_0, view_1, view_2,
+ lkill, kill]},
+ {record_name, [], [{group, record_name_dirty_access}]},
+ {record_name_dirty_access, [],
+ [record_name_dirty_access_ram,
+ record_name_dirty_access_disc,
+ record_name_dirty_access_disc_only]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -910,13 +919,6 @@ local_content(Config) when is_list(Config) ->
?verify_mnesia(Nodes, []).
-table_access_modifications(suite) ->
- [
- change_table_access_mode,
- change_table_load_order,
- set_master_nodes,
- offline_set_master_nodes
- ].
change_table_access_mode(suite) -> [];
change_table_access_mode(Config) when is_list(Config) ->
@@ -1103,13 +1105,6 @@ offline_set_master_nodes(Config) when is_list(Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Syncronize table with log or disc
%%
-table_sync(suite) ->
- [
- dump_tables,
- dump_log,
- wait_for_tables,
- force_load_table
- ].
%% Dump ram tables on disc
dump_tables(suite) -> [];
@@ -1359,19 +1354,6 @@ unsupp_user_props(Config) when is_list(Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-snmp_access(doc) ->
- ["Make Mnesia table accessible via SNMP"];
-
-snmp_access(suite) ->
- [
- snmp_open_table,
- snmp_close_table,
- snmp_get_next_index,
- snmp_get_row,
- snmp_get_mnesia_key,
- snmp_update_counter,
- snmp_order
- ].
snmp_open_table(suite) -> [];
snmp_open_table(Config) when is_list(Config) ->
@@ -1779,11 +1761,6 @@ get_keys(Tab, Key) ->
-record(tab, {i, e1, e2}). % Simple test table
-subscriptions(doc) ->
- ["Test the event subscription mechanism"];
-subscriptions(suite) ->
- [subscribe_standard,
- subscribe_extended].
subscribe_extended(doc) ->
["Test the extended set of events, test with and without checkpoints. "];
@@ -2009,10 +1986,6 @@ recv_event() ->
end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-iteration(doc) ->
- ["Verify that the iteration functions works as expected"];
-iteration(suite) ->
- [foldl].
foldl(suite) ->
@@ -2074,19 +2047,6 @@ sort_res(Else) ->
Else.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-debug_support(doc) ->
- ["Check that the debug support has not decayed."];
-debug_support(suite) ->
- [
- info,
- schema_0,
- schema_1,
- view_0,
- view_1,
- view_2,
- lkill,
- kill
- ].
info(suite) -> [];
info(Config) when is_list(Config) ->
@@ -2173,21 +2133,7 @@ kill(Config) when is_list(Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-record_name(doc) ->
- ["Verify that record names may be differ from the name of ",
- "the hosting table. Check at least access, restore, "
- "registry, subscriptions and traveres_backup"];
-record_name(suite) ->
- [
- record_name_dirty_access
- ].
-
-record_name_dirty_access(suite) ->
- [
- record_name_dirty_access_ram,
- record_name_dirty_access_disc,
- record_name_dirty_access_disc_only
- ].
+
record_name_dirty_access_ram(suite) ->
[];
diff --git a/lib/mnesia/test/mnesia_examples_test.erl b/lib/mnesia/test/mnesia_examples_test.erl
index d1b1409c9d..373d47a05a 100644
--- a/lib/mnesia/test/mnesia_examples_test.erl
+++ b/lib/mnesia/test/mnesia_examples_test.erl
@@ -26,8 +26,8 @@
init_per_testcase(Func, Conf) ->
mnesia_test_lib:init_per_testcase(Func, Conf).
-fin_per_testcase(Func, Conf) ->
- mnesia_test_lib:fin_per_testcase(Func, Conf).
+end_per_testcase(Func, Conf) ->
+ mnesia_test_lib:end_per_testcase(Func, Conf).
-define(init(N, Config),
mnesia_test_lib:prepare_test_case([{init_test_case, [mnesia]},
@@ -61,16 +61,21 @@ opt_load(Mod) ->
end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(doc) ->
- ["Run all examples mentioned in the documentation",
- "Are really all examples covered?"];
-all(suite) ->
- [
- bup,
- company,
- meter,
- tpcb
- ].
+all() ->
+ [bup, company, meter, {group, tpcb}].
+
+groups() ->
+ [{tpcb, [],
+ [replica_test, sticky_replica_test, dist_test,
+ conflict_test, frag_test, frag2_test, remote_test,
+ remote_frag2_test]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
bup(doc) -> ["Run the backup examples in bup.erl"];
@@ -85,19 +90,6 @@ company(doc) ->
["Run the company examples in company.erl and company_o.erl"].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-tpcb(doc) ->
- ["Run the sample configurations of the stress tests in mnesia_tpcb.erl"];
-tpcb(suite) ->
- [
- replica_test,
- sticky_replica_test,
- dist_test,
- conflict_test,
- frag_test,
- frag2_test,
- remote_test,
- remote_frag2_test
- ].
replica_test(suite) -> [];
replica_test(Config) when is_list(Config) ->
diff --git a/lib/mnesia/test/mnesia_frag_test.erl b/lib/mnesia/test/mnesia_frag_test.erl
index 4add340254..d3f6762af7 100644
--- a/lib/mnesia/test/mnesia_frag_test.erl
+++ b/lib/mnesia/test/mnesia_frag_test.erl
@@ -27,8 +27,8 @@
init_per_testcase(Func, Conf) ->
mnesia_test_lib:init_per_testcase(Func, Conf).
-fin_per_testcase(Func, Conf) ->
- mnesia_test_lib:fin_per_testcase(Func, Conf).
+end_per_testcase(Func, Conf) ->
+ mnesia_test_lib:end_per_testcase(Func, Conf).
-define(match_dist(ExpectedRes, Expr),
case ?match(ExpectedRes, Expr) of
@@ -37,34 +37,29 @@ fin_per_testcase(Func, Conf) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(doc) ->
- ["Verify the functionality of fragmented tables"];
-all(suite) ->
- [
- light,
- medium
- ].
-
-light(suite) ->
- [
- nice,
- evil
- ].
-
-medium(suite) ->
- [
- consistency
- ].
+all() ->
+ [{group, light}, {group, medium}].
+
+groups() ->
+ [{light, [], [{group, nice}, {group, evil}]},
+ {medium, [], [consistency]},
+ {nice, [],
+ [nice_single, nice_multi, nice_access, iter_access]},
+ {evil, [],
+ [evil_create, evil_delete, evil_change, evil_combine,
+ evil_loop, evil_delete_db_node]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-nice(suite) ->
- [
- nice_single,
- nice_multi,
- nice_access,
- iter_access
- ].
nice_single(suite) -> [];
nice_single(Config) when is_list(Config) ->
@@ -503,17 +498,6 @@ consistency(Config) when is_list(Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-evil(doc) ->
- ["Evil coverage of fragmentation API."];
-evil(suite) ->
- [
- evil_create,
- evil_delete,
- evil_change,
- evil_combine,
- evil_loop,
- evil_delete_db_node
- ].
evil_create(suite) -> [];
evil_create(Config) when is_list(Config) ->
diff --git a/lib/mnesia/test/mnesia_inconsistent_database_test.erl b/lib/mnesia/test/mnesia_inconsistent_database_test.erl
index b19cd8e01b..c4b6257d5b 100644
--- a/lib/mnesia/test/mnesia_inconsistent_database_test.erl
+++ b/lib/mnesia/test/mnesia_inconsistent_database_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2010. 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
diff --git a/lib/mnesia/test/mnesia_install_test.erl b/lib/mnesia/test/mnesia_install_test.erl
index 42a2a19f37..5d55fcac0e 100644
--- a/lib/mnesia/test/mnesia_install_test.erl
+++ b/lib/mnesia/test/mnesia_install_test.erl
@@ -27,29 +27,22 @@
init_per_testcase(Func, Conf) ->
mnesia_test_lib:init_per_testcase(Func, Conf).
-fin_per_testcase(Func, Conf) ->
- mnesia_test_lib:fin_per_testcase(Func, Conf).
+end_per_testcase(Func, Conf) ->
+ mnesia_test_lib:end_per_testcase(Func, Conf).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(doc) ->
- ["Run some small but demanding test cases in order to verify",
- "that the basic functionality in Mnesia still works.",
- "",
- "Try some very simple things to begin with and increase the",
- "difficulty stepwise. This test suite should be run before",
- "all the others if you expect to find bugs.",
- "",
- "The function mnesia_install_test:silly() does not use the whole",
- "infra structure of the test suite. Invoke it on a single node to",
- "begin with. If that works, proceed with pong = net_adm:ping(SomeOtherNode)",
- "and rerun silly() in order to perform some distributed tests."];
-all(suite) ->
- [
- silly_durability,
- silly_move,
- silly_upgrade
- %,stress
- ].
+all() ->
+ [silly_durability, silly_move, silly_upgrade].
+
+groups() ->
+ [{stress, [], stress_cases()}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Stepwise of more and more advanced features
@@ -86,11 +79,11 @@ silly2(Config) when is_list(Config) ->
[schema])),
MoveRes = silly_move(Config),
UpgradeRes = silly_upgrade(Config),
- StressRes = [StressFun(F) || F <- stress(suite)],
+ StressRes = [StressFun(F) || F <- stress_cases()],
?verify_mnesia([Node2], []),
[Res, MoveRes, UpgradeRes] ++ StressRes;
_ ->
- StressRes = [StressFun(F) || F <- stress(suite)],
+ StressRes = [StressFun(F) || F <- stress_cases()],
?warning("Too few nodes. Perform net_adm:ping(OtherNode) "
"and rerun!!!~n", []),
[Res | StressRes]
@@ -286,13 +279,9 @@ transform_some_records(Tab1, _Tab2, Old) ->
lists:sort(lists:zf(Filter, Old)).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-stress(doc) ->
- ["Stress the system a little"];
-stress(suite) ->
- [
- conflict,
- dist
- ].
+
+stress_cases() ->
+[conflict, dist].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dist(doc) ->
diff --git a/lib/mnesia/test/mnesia_isolation_test.erl b/lib/mnesia/test/mnesia_isolation_test.erl
index 4fc6e8fe58..3273bc4d40 100644
--- a/lib/mnesia/test/mnesia_isolation_test.erl
+++ b/lib/mnesia/test/mnesia_isolation_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2010. 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
@@ -27,46 +27,53 @@
init_per_testcase(Func, Conf) ->
mnesia_test_lib:init_per_testcase(Func, Conf).
-fin_per_testcase(Func, Conf) ->
- mnesia_test_lib:fin_per_testcase(Func, Conf).
+end_per_testcase(Func, Conf) ->
+ mnesia_test_lib:end_per_testcase(Func, Conf).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(doc) ->
- ["Verify the isolation property.",
- "Operations of concurrent transactions must yield results which",
- "are indistinguishable from the results which would be obtained by",
- "forcing each transaction to be serially executed to completion in",
- "some order. This means that repeated reads of the same records",
- "within any committed transaction must have returned identical",
- "data when run concurrently with any mix of arbitary transactions.",
- "Updates in one transaction must not be visible in any other",
- "transaction before the transaction has been committed."];
-all(suite) ->
- [
- locking,
- visibility
- ].
+all() ->
+ [{group, locking}, {group, visibility}].
+
+groups() ->
+ [{locking, [],
+ [no_conflict, simple_queue_conflict,
+ advanced_queue_conflict, simple_deadlock_conflict,
+ advanced_deadlock_conflict, lock_burst,
+ {group, sticky_locks}, {group, unbound_locking},
+ {group, admin_conflict}, nasty]},
+ {sticky_locks, [], [basic_sticky_functionality]},
+ {unbound_locking, [], [unbound1, unbound2]},
+ {admin_conflict, [],
+ [create_table, delete_table, move_table_copy,
+ add_table_index, del_table_index, transform_table,
+ snmp_open_table, snmp_close_table,
+ change_table_copy_type, change_table_access,
+ add_table_copy, del_table_copy, dump_tables,
+ {group, extra_admin_tests}]},
+ {extra_admin_tests, [],
+ [del_table_copy_1, del_table_copy_2, del_table_copy_3,
+ add_table_copy_1, add_table_copy_2, add_table_copy_3,
+ add_table_copy_4, move_table_copy_1, move_table_copy_2,
+ move_table_copy_3, move_table_copy_4]},
+ {visibility, [],
+ [dirty_updates_visible_direct,
+ dirty_reads_regardless_of_trans,
+ trans_update_invisibible_outside_trans,
+ trans_update_visible_inside_trans, write_shadows,
+ delete_shadows, write_delete_shadows_bag,
+ write_delete_shadows_bag2, {group, iteration},
+ shadow_search, snmp_shadows]},
+ {removed_resources, [], [rr_kill_copy]},
+ {iteration, [], [foldl, first_next]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-locking(doc) ->
- ["Verify locking semantics for various configurations",
- " NoLock = lock_funs(no_lock, any_granularity)",
- " SharedLock = lock_funs(shared_lock, any_granularity)",
- " ExclusiveLock = lock_funs(exclusive_lock, any_granularity)",
- " AnyLock = lock_funs(any_lock, any_granularity)"];
-locking(suite) ->
- [no_conflict,
- simple_queue_conflict,
- advanced_queue_conflict,
- simple_deadlock_conflict,
- advanced_deadlock_conflict,
- lock_burst,
- sticky_locks,
- unbound_locking,
- admin_conflict,
-%% removed_resources,
- nasty
- ].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -431,14 +438,6 @@ burst_incr(Tab, Father) ->
Father ! burst_incr_done.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-sticky_locks(doc) ->
- ["Simple Tests of sticky locks"];
-
-sticky_locks(suite) ->
- [
- basic_sticky_functionality
- %% Needs to be expandand a little bit further
- ].
basic_sticky_functionality(suite) -> [];
basic_sticky_functionality(Config) when is_list(Config) ->
@@ -519,12 +518,6 @@ get_held() ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-unbound_locking(suite) ->
- [unbound1, unbound2];
-
-unbound_locking(doc) ->
- ["Check that mnesia handles unbound key variables, GPRS bug."
- "Ticket id: OTP-3342"].
unbound1(suite) -> [];
unbound1(Config) when is_list(Config) ->
@@ -637,25 +630,6 @@ receiver() ->
end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-admin_conflict(doc) ->
- ["Provoke lock conflicts with schema transactions and checkpoints."];
-admin_conflict(suite) ->
- [
- create_table,
- delete_table,
- move_table_copy,
- add_table_index,
- del_table_index,
- transform_table,
- snmp_open_table,
- snmp_close_table,
- change_table_copy_type,
- change_table_access,
- add_table_copy,
- del_table_copy,
- dump_tables,
- extra_admin_tests
- ].
create_table(suite) -> [];
create_table(Config) when is_list(Config) ->
@@ -1088,18 +1062,6 @@ insert(Tab, N) when N > 0 ->
ok = mnesia:sync_dirty(fun() -> mnesia:write({Tab, N, N, 0}) end),
insert(Tab, N-1).
-extra_admin_tests(suite) ->
- [del_table_copy_1,
- del_table_copy_2,
- del_table_copy_3,
- add_table_copy_1,
- add_table_copy_2,
- add_table_copy_3,
- add_table_copy_4,
- move_table_copy_1,
- move_table_copy_2,
- move_table_copy_3,
- move_table_copy_4].
update_own(Tab, Key, Acc) ->
Update =
@@ -1347,23 +1309,6 @@ move_table(CallFrom, FromNode, ToNode, [Node1, Node2, Node3], Def) ->
?verify_mnesia([Node1, Node2, Node3], []).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-visibility(doc) ->
- ["Verify the visibility semantics for various configurations"];
-visibility(suite) ->
- [
- dirty_updates_visible_direct,
- dirty_reads_regardless_of_trans,
- trans_update_invisibible_outside_trans,
- trans_update_visible_inside_trans,
- write_shadows,
- delete_shadows,
-%% delete_shadows2,
- write_delete_shadows_bag,
- write_delete_shadows_bag2,
- iteration,
- shadow_search,
- snmp_shadows
- ].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dirty_updates_visible_direct(doc) ->
@@ -1969,10 +1914,6 @@ shadow_search(Config) when is_list(Config) ->
?verify_mnesia([Node1], []).
-removed_resources(suite) ->
- [rr_kill_copy];
-removed_resources(doc) ->
- ["Verify that the locking behave when resources are removed"].
rr_kill_copy(suite) -> [];
rr_kill_copy(Config) when is_list(Config) ->
@@ -2138,11 +2079,6 @@ get_exit(Pid) ->
?error("Timeout EXIT ~p~n", [Pid])
end.
-iteration(doc) ->
- ["Verify that the updates before/during iteration are visable "
- "and that the order is preserved for ordered_set tables"];
-iteration(suite) ->
- [foldl,first_next].
foldl(doc) ->
[""];
diff --git a/lib/mnesia/test/mnesia_measure_test.erl b/lib/mnesia/test/mnesia_measure_test.erl
index fbf804dbec..e63689d83a 100644
--- a/lib/mnesia/test/mnesia_measure_test.erl
+++ b/lib/mnesia/test/mnesia_measure_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2010. 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
@@ -27,8 +27,8 @@
init_per_testcase(Func, Conf) ->
mnesia_test_lib:init_per_testcase(Func, Conf).
-fin_per_testcase(Func, Conf) ->
- mnesia_test_lib:fin_per_testcase(Func, Conf).
+end_per_testcase(Func, Conf) ->
+ mnesia_test_lib:end_per_testcase(Func, Conf).
-define(init(N, Config),
mnesia_test_lib:prepare_test_case([{init_test_case, [mnesia]},
@@ -37,101 +37,62 @@ fin_per_testcase(Func, Conf) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(doc) ->
- ["Measure various aspects of Mnesia",
- "Verify that Mnesia has predictable response times,",
- "that the transaction system has fair algoritms,",
- "resource consumption, scalabilitym system limits etc.",
- "Perform some benchmarks."];
-all(suite) ->
- [
- prediction,
- consumption,
- scalability,
- benchmarks
- ].
+all() ->
+ [{group, prediction}, {group, consumption},
+ {group, scalability}, {group, benchmarks}].
+
+groups() ->
+ [{prediction, [],
+ [reader_disturbed_by_node_down,
+ writer_disturbed_by_node_down,
+ reader_disturbed_by_node_up,
+ writer_disturbed_by_node_up,
+ reader_disturbed_by_schema_ops,
+ writer_disturbed_by_schema_ops,
+ reader_disturbed_by_checkpoint,
+ writer_disturbed_by_checkpoint,
+ reader_disturbed_by_dump_log,
+ writer_disturbed_by_dump_log,
+ reader_disturbed_by_backup, writer_disturbed_by_backup,
+ reader_disturbed_by_restore,
+ writer_disturbed_by_restore, {group, fairness}]},
+ {fairness, [],
+ [reader_competing_with_reader,
+ reader_competing_with_writer,
+ writer_competing_with_reader,
+ writer_competing_with_writer]},
+ {consumption, [],
+ [measure_resource_consumption,
+ determine_resource_leakage]},
+ {scalability, [],
+ [determine_system_limits, performance_at_min_config,
+ performance_at_max_config, performance_at_full_load,
+ resource_consumption_at_min_config,
+ resource_consumption_at_max_config,
+ resource_consumption_at_full_load]},
+ {benchmarks, [],
+ [{group, meter}, cost, dbn_meters,
+ measure_all_api_functions, {group, tpcb},
+ mnemosyne_vs_mnesia_kernel]},
+ {tpcb, [], [ram_tpcb, disc_tpcb, disc_only_tpcb]},
+ {meter, [], [ram_meter, disc_meter, disc_only_meter]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-prediction(doc) ->
- ["The system must have predictable response times.",
- "The maintenance of the system should not impact on the",
- "availability. Make sure that the response times does not vary too",
- "much from the undisturbed normal usage.",
- "Verify that deadlocks never occurs."];
-prediction(suite) ->
- [
- reader_disturbed_by_node_down,
- writer_disturbed_by_node_down,
- reader_disturbed_by_node_up,
- writer_disturbed_by_node_up,
- reader_disturbed_by_schema_ops,
- writer_disturbed_by_schema_ops,
- reader_disturbed_by_checkpoint,
- writer_disturbed_by_checkpoint,
- reader_disturbed_by_dump_log,
- writer_disturbed_by_dump_log,
- reader_disturbed_by_backup,
- writer_disturbed_by_backup,
- reader_disturbed_by_restore,
- writer_disturbed_by_restore,
- fairness
- ].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-fairness(doc) ->
- ["Verify that the transaction system behaves fair, even under intense",
- "stress. Combine different access patterns (transaction profiles)",
- "in order to verify that concurrent applications gets a fair share",
- "of the database resource. Verify that starvation never may occur."];
-fairness(suite) ->
- [
- reader_competing_with_reader,
- reader_competing_with_writer,
- writer_competing_with_reader,
- writer_competing_with_writer
- ].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-consumption(doc) ->
- ["Measure the resource consumption and publish the outcome. Make",
- "sure that resources are released after failures."];
-consumption(suite) ->
- [
- measure_resource_consumption,
- determine_resource_leakage
- ].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-scalability(doc) ->
- ["Try out where the system limits are. We must at least meet the",
- "documented system limits.",
- "Redo the performance meters for various configurations and load,",
- "especially near system limits."];
-scalability(suite) ->
- [
- determine_system_limits,
- performance_at_min_config,
- performance_at_max_config,
- performance_at_full_load,
- resource_consumption_at_min_config,
- resource_consumption_at_max_config,
- resource_consumption_at_full_load
- ].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-benchmarks(doc) ->
- ["Measure typical database operations and publish them. Try to",
- "verify that new releases of Mnesia always outperforms old",
- "releases, or at least that the meters does not get worse."];
-benchmarks(suite) ->
- [
- meter,
- cost,
- dbn_meters,
- measure_all_api_functions,
- tpcb,
- mnemosyne_vs_mnesia_kernel
- ].
dbn_meters(suite) -> [];
dbn_meters(Config) when is_list(Config) ->
@@ -139,12 +100,6 @@ dbn_meters(Config) when is_list(Config) ->
?match(ok, mnesia_dbn_meters:start()),
ok.
-tpcb(suite) ->
- [
- ram_tpcb,
- disc_tpcb,
- disc_only_tpcb
- ].
tpcb(ReplicaType, Config) ->
HarakiriDelay = {tc_timeout, timer:minutes(20)},
@@ -171,12 +126,6 @@ disc_only_tpcb(suite) -> [];
disc_only_tpcb(Config) when is_list(Config) ->
tpcb(disc_only_copies, Config).
-meter(suite) ->
- [
- ram_meter,
- disc_meter,
- disc_only_meter
- ].
ram_meter(suite) -> [];
ram_meter(Config) when is_list(Config) ->
diff --git a/lib/mnesia/test/mnesia_nice_coverage_test.erl b/lib/mnesia/test/mnesia_nice_coverage_test.erl
index aa9339f6b9..78eab67b11 100644
--- a/lib/mnesia/test/mnesia_nice_coverage_test.erl
+++ b/lib/mnesia/test/mnesia_nice_coverage_test.erl
@@ -28,16 +28,22 @@
init_per_testcase(Func, Conf) ->
mnesia_test_lib:init_per_testcase(Func, Conf).
-fin_per_testcase(Func, Conf) ->
- mnesia_test_lib:fin_per_testcase(Func, Conf).
+end_per_testcase(Func, Conf) ->
+ mnesia_test_lib:end_per_testcase(Func, Conf).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(doc) ->
- ["Test nice usage of the entire API",
- "Invoke all functions in the API, at least once.",
- "Try to verify that all functions exists and that they perform",
- "reasonable things when used in the most simple way."];
-all(suite) -> [nice].
+all() ->
+ [nice].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
nice(doc) -> [""];
nice(suite) -> [];
diff --git a/lib/mnesia/test/mnesia_qlc_test.erl b/lib/mnesia/test/mnesia_qlc_test.erl
index 1e4f776c7d..141de71d01 100644
--- a/lib/mnesia/test/mnesia_qlc_test.erl
+++ b/lib/mnesia/test/mnesia_qlc_test.erl
@@ -22,7 +22,7 @@
-compile(export_all).
--export([all/1]).
+-export([all/0,groups/0,init_per_group/2,end_per_group/2]).
-include("mnesia_test_lib.hrl").
-include_lib("stdlib/include/qlc.hrl").
@@ -31,20 +31,34 @@ init_per_testcase(Func, Conf) ->
setup(Conf),
mnesia_test_lib:init_per_testcase(Func, Conf).
-fin_per_testcase(Func, Conf) ->
- mnesia_test_lib:fin_per_testcase(Func, Conf).
+end_per_testcase(Func, Conf) ->
+ mnesia_test_lib:end_per_testcase(Func, Conf).
-all(doc) ->
- ["Test that the qlc mnesia interface works as expected."];
-all(suite) ->
+all() ->
case code:which(qlc) of
non_existing -> [];
- _ ->
- all_qlc()
+ _ -> all_qlc()
end.
-all_qlc() ->
- [dirty, trans, frag, info, mnesia_down].
+groups() ->
+ [{dirty, [],
+ [dirty_nice_ram_copies, dirty_nice_disc_copies,
+ dirty_nice_disc_only_copies]},
+ {trans, [],
+ [trans_nice_ram_copies, trans_nice_disc_copies,
+ trans_nice_disc_only_copies, {group, atomic}]},
+ {atomic, [], [atomic_eval]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+all_qlc() ->
+ [{group, dirty}, {group, trans}, frag, info,
+ mnesia_down].
init_testcases(Type,Config) ->
Nodes = [N1,N2] = ?acquire_nodes(2, Config),
@@ -59,10 +73,6 @@ init_testcases(Type,Config) ->
Nodes.
%% Test cases
-dirty(suite) ->
- [dirty_nice_ram_copies,
- dirty_nice_disc_copies,
- dirty_nice_disc_only_copies].
dirty_nice_ram_copies(Setup) -> dirty_nice(Setup,ram_copies).
dirty_nice_disc_copies(Setup) -> dirty_nice(Setup,disc_copies).
@@ -109,12 +119,6 @@ dirty_nice(Config, Type) when is_list(Config) ->
end,
?verify_mnesia(Ns, []).
-trans(suite) ->
- [trans_nice_ram_copies,
- trans_nice_disc_copies,
- trans_nice_disc_only_copies,
- atomic
- ].
trans_nice_ram_copies(Setup) -> trans_nice(Setup,ram_copies).
trans_nice_disc_copies(Setup) -> trans_nice(Setup,disc_copies).
@@ -182,9 +186,7 @@ recs() ->
"-record(b, {k,v}). "
"-record(k, {t,v}). "
>>.
-
-atomic(suite) -> [atomic_eval];
-atomic(doc) -> [].
+
atomic_eval(suite) -> [];
atomic_eval(doc) -> [];
diff --git a/lib/mnesia/test/mnesia_recovery_test.erl b/lib/mnesia/test/mnesia_recovery_test.erl
index f6ecf2ce2e..625e6e824c 100644
--- a/lib/mnesia/test/mnesia_recovery_test.erl
+++ b/lib/mnesia/test/mnesia_recovery_test.erl
@@ -28,8 +28,8 @@
init_per_testcase(Func, Conf) ->
mnesia_test_lib:init_per_testcase(Func, Conf).
-fin_per_testcase(Func, Conf) ->
- mnesia_test_lib:fin_per_testcase(Func, Conf).
+end_per_testcase(Func, Conf) ->
+ mnesia_test_lib:end_per_testcase(Func, Conf).
-define(receive_messages(Msgs), receive_messages(Msgs, ?FILE, ?LINE)).
@@ -42,34 +42,93 @@ fin_per_testcase(Func, Conf) ->
-endif.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(doc) ->
- ["Verify recoverability",
- "Verify that the effects of committed transactions are preserved",
- "after recovery from system failures. It must be possible to",
- "restore the tables to a consistent state on a node, from (any kind",
- "of) replica on other nodes as well as from local disk on the failed",
- "node. The system must also recover from instantaneous",
- "interruption causing disk files to not be completely synchronized."];
-
-all(suite) ->
- [
- mnesia_down,
- explicit_stop,
- coord_dies,
- schema_trans,
- async_dirty,
- sync_dirty,
- sym_trans,
- asym_trans,
- after_full_disc_partition,
- after_corrupt_files,
- disc_less,
- garb_decision,
- system_upgrade
- ].
-
-schema_trans(suite) ->
- [{mnesia_schema_recovery_test, all}].
+all() ->
+ [{group, mnesia_down}, {group, explicit_stop},
+ coord_dies, {group, schema_trans}, {group, async_dirty},
+ {group, sync_dirty}, {group, sym_trans},
+ {group, asym_trans}, after_full_disc_partition,
+ {group, after_corrupt_files}, disc_less, garb_decision,
+ system_upgrade].
+
+groups() ->
+ [{schema_trans, [],
+ [{mnesia_schema_recovery_test, all}]},
+ {mnesia_down, [],
+ [{group, mnesia_down_during_startup},
+ {group, master_node_tests}, {group, read_during_down},
+ {group, with_checkpoint}, delete_during_start]},
+ {master_node_tests, [],
+ [no_master_2, no_master_3, one_master_2, one_master_3,
+ two_master_2, two_master_3, all_master_2,
+ all_master_3]},
+ {read_during_down, [],
+ [dirty_read_during_down, trans_read_during_down]},
+ {mnesia_down_during_startup, [],
+ [mnesia_down_during_startup_disk_ram,
+ mnesia_down_during_startup_init_ram,
+ mnesia_down_during_startup_init_disc,
+ mnesia_down_during_startup_init_disc_only,
+ mnesia_down_during_startup_tm_ram,
+ mnesia_down_during_startup_tm_disc,
+ mnesia_down_during_startup_tm_disc_only]},
+ {with_checkpoint, [],
+ [with_checkpoint_same, with_checkpoint_other]},
+ {explicit_stop, [], [explicit_stop_during_snmp]},
+ {sym_trans, [],
+ [sym_trans_before_commit_kill_coord_node,
+ sym_trans_before_commit_kill_coord_pid,
+ sym_trans_before_commit_kill_part_after_ask,
+ sym_trans_before_commit_kill_part_before_ask,
+ sym_trans_after_commit_kill_coord_node,
+ sym_trans_after_commit_kill_coord_pid,
+ sym_trans_after_commit_kill_part_after_ask,
+ sym_trans_after_commit_kill_part_do_commit_pre,
+ sym_trans_after_commit_kill_part_do_commit_post]},
+ {sync_dirty, [],
+ [sync_dirty_pre_kill_part,
+ sync_dirty_pre_kill_coord_node,
+ sync_dirty_pre_kill_coord_pid,
+ sync_dirty_post_kill_part,
+ sync_dirty_post_kill_coord_node,
+ sync_dirty_post_kill_coord_pid]},
+ {async_dirty, [],
+ [async_dirty_pre_kill_part,
+ async_dirty_pre_kill_coord_node,
+ async_dirty_pre_kill_coord_pid,
+ async_dirty_post_kill_part,
+ async_dirty_post_kill_coord_node,
+ async_dirty_post_kill_coord_pid]},
+ {asym_trans, [],
+ [asym_trans_kill_part_ask,
+ asym_trans_kill_part_commit_vote,
+ asym_trans_kill_part_pre_commit,
+ asym_trans_kill_part_log_commit,
+ asym_trans_kill_part_do_commit,
+ asym_trans_kill_coord_got_votes,
+ asym_trans_kill_coord_pid_got_votes,
+ asym_trans_kill_coord_log_commit_rec,
+ asym_trans_kill_coord_pid_log_commit_rec,
+ asym_trans_kill_coord_log_commit_dec,
+ asym_trans_kill_coord_pid_log_commit_dec,
+ asym_trans_kill_coord_rec_acc_pre_commit_log_commit,
+ asym_trans_kill_coord_pid_rec_acc_pre_commit_log_commit,
+ asym_trans_kill_coord_rec_acc_pre_commit_done_commit,
+ asym_trans_kill_coord_pid_rec_acc_pre_commit_done_commit]},
+ {after_corrupt_files, [],
+ [after_corrupt_files_decision_log_head,
+ after_corrupt_files_decision_log_tail,
+ after_corrupt_files_latest_log_head,
+ after_corrupt_files_latest_log_tail,
+ after_corrupt_files_table_dat_head,
+ after_corrupt_files_table_dat_tail,
+ after_corrupt_files_schema_dat_head,
+ after_corrupt_files_schema_dat_tail]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
tpcb_config(ReplicaType, _NodeConfig, Nodes) ->
[{n_branches, 5},
@@ -83,30 +142,7 @@ tpcb_config(ReplicaType, _NodeConfig, Nodes) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-mnesia_down(doc) ->
- [" Various tests about recovery when mnesia goes down on one or several nodes."];
-mnesia_down(suite) ->
- [
- mnesia_down_during_startup,
- master_node_tests,
- read_during_down,
- with_checkpoint,
- delete_during_start
- ].
-
-master_node_tests(doc) ->
- ["Verify that mnesia loads the correct data after it has been down, regarding master node settings."];
-master_node_tests(suite) ->
- [
- no_master_2,
- no_master_3,
- one_master_2,
- one_master_3,
- two_master_2,
- two_master_3,
- all_master_2,
- all_master_3
- ].
+
no_master_2(suite) -> [];
no_master_2(Config) when is_list(Config) -> mnesia_down_2(no, Config).
@@ -251,13 +287,6 @@ mnesia_down_3(Masters, Config) ->
?verify_mnesia(Nodes, []).
-read_during_down(doc) ->
- ["Verify that read operation can continue to read when mnesia goes down"];
-read_during_down(suite) ->
- [
- dirty_read_during_down,
- trans_read_during_down
- ].
dirty_read_during_down(suite) ->
[];
@@ -325,20 +354,6 @@ loop_and_kill_mnesia(N, Node, Tabs) ->
timer:sleep(100),
loop_and_kill_mnesia(N-1, KN, Tabs).
-mnesia_down_during_startup(doc) ->
- ["Verify that mnesia can come back up again in a consistent state",
- "after it has gone down during startup (with different store and",
- "when it goes down in different situations"];
-mnesia_down_during_startup(suite) ->
- [
- mnesia_down_during_startup_disk_ram,
- mnesia_down_during_startup_init_ram,
- mnesia_down_during_startup_init_disc,
- mnesia_down_during_startup_init_disc_only,
- mnesia_down_during_startup_tm_ram,
- mnesia_down_during_startup_tm_disc,
- mnesia_down_during_startup_tm_disc_only
- ].
mnesia_down_during_startup_disk_ram(suite) -> [];
mnesia_down_during_startup_disk_ram(Config) when is_list(Config)->
@@ -433,10 +448,6 @@ mnesia_down_during_startup2(Config, ReplicaType, Debug_Point, _Father) ->
?verify_mnesia(Nodes, []).
-with_checkpoint(doc) ->
- ["Restart mnesia with checkpoint"];
-with_checkpoint(suite) ->
- [with_checkpoint_same, with_checkpoint_other].
with_checkpoint_same(suite) -> [];
with_checkpoint_same(Config) when is_list(Config) ->
@@ -581,10 +592,6 @@ verify_where2read([]) -> ok.
%%-------------------------------------------------------------------------------------------
-explicit_stop(doc) ->
- ["Stop Mnesia in different situations"];
-explicit_stop(suite) ->
- [explicit_stop_during_snmp].
%% This is a bad implementation, but at least gives a indication if something is wrong
explicit_stop_during_snmp(suite) -> [];
explicit_stop_during_snmp(Config) when is_list(Config) ->
@@ -700,21 +707,7 @@ coord_dies(Config) when is_list(Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-sym_trans(doc) ->
- ["Recovery of symmetrical transactions in a couple of different",
- "situations; when coordinator or participant or node dies"];
-
-sym_trans(suite) ->
- [sym_trans_before_commit_kill_coord_node, %% coordinator node dies
- sym_trans_before_commit_kill_coord_pid, %% coordinator process dies
- sym_trans_before_commit_kill_part_after_ask, %% participating node dies
- sym_trans_before_commit_kill_part_before_ask,
- sym_trans_after_commit_kill_coord_node,
- sym_trans_after_commit_kill_coord_pid,
- sym_trans_after_commit_kill_part_after_ask,
- sym_trans_after_commit_kill_part_do_commit_pre,
- sym_trans_after_commit_kill_part_do_commit_post].
+
%kill_after_debug_point(Config, TestCase, {Debug_node, Debug_Point}, TransFun, Tab)
@@ -828,17 +821,6 @@ do_sym_trans([Tab], _Fahter) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-sync_dirty(doc) ->
- ["Verify recovery of synchronously operations in a couple of different",
- "situations"];
-sync_dirty(suite) ->
- [sync_dirty_pre_kill_part,
- sync_dirty_pre_kill_coord_node,
- sync_dirty_pre_kill_coord_pid,
- sync_dirty_post_kill_part,
- sync_dirty_post_kill_coord_node,
- sync_dirty_post_kill_coord_pid
- ].
sync_dirty_pre_kill_part(suite) -> [];
sync_dirty_pre_kill_part(Config) when is_list(Config) ->
@@ -916,16 +898,6 @@ do_sync_dirty([Tab], _Father) ->
?dl("SYNC_DIRTY done: ~p ", [Res]),
ok.
-async_dirty(doc) ->
- ["Verify recovery of asynchronously dirty operations in a couple of different",
- "situations"];
-async_dirty(suite) ->
- [async_dirty_pre_kill_part,
- async_dirty_pre_kill_coord_node,
- async_dirty_pre_kill_coord_pid,
- async_dirty_post_kill_part,
- async_dirty_post_kill_coord_node,
- async_dirty_post_kill_coord_pid].
async_dirty_pre_kill_part(suite) -> [];
async_dirty_pre_kill_part(Config) when is_list(Config) ->
@@ -1005,29 +977,6 @@ do_async_dirty([Tab], _Fahter) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-asym_trans(doc) ->
- ["Recovery of asymmetrical transactions in a couple of different",
- "situations, currently the error cases are not covered, i.e. ",
- "not tested are the situations when we kill mnesia or a process",
- "during a recovery"];
-asym_trans(suite) ->
- [
- asym_trans_kill_part_ask,
- asym_trans_kill_part_commit_vote,
- asym_trans_kill_part_pre_commit,
- asym_trans_kill_part_log_commit,
- asym_trans_kill_part_do_commit,
- asym_trans_kill_coord_got_votes,
- asym_trans_kill_coord_pid_got_votes,
- asym_trans_kill_coord_log_commit_rec,
- asym_trans_kill_coord_pid_log_commit_rec,
- asym_trans_kill_coord_log_commit_dec,
- asym_trans_kill_coord_pid_log_commit_dec,
- asym_trans_kill_coord_rec_acc_pre_commit_log_commit,
- asym_trans_kill_coord_pid_rec_acc_pre_commit_log_commit,
- asym_trans_kill_coord_rec_acc_pre_commit_done_commit,
- asym_trans_kill_coord_pid_rec_acc_pre_commit_done_commit
- ].
asym_trans_kill_part_ask(suite) -> [];
asym_trans_kill_part_ask(Config) when is_list(Config) ->
@@ -1435,18 +1384,6 @@ after_full_disc_partition(doc) ->
%% interrupted_fallback_start
%% is implemented in consistency interupted_install_fallback!
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-after_corrupt_files(doc) ->
- ["Verify that mnesia (and dets) can handle corrupt files"];
-after_corrupt_files(suite) -> % cope with unsynced disks
- [after_corrupt_files_decision_log_head,
- after_corrupt_files_decision_log_tail,
- after_corrupt_files_latest_log_head,
- after_corrupt_files_latest_log_tail,
- after_corrupt_files_table_dat_head,
- after_corrupt_files_table_dat_tail,
- after_corrupt_files_schema_dat_head,
- after_corrupt_files_schema_dat_tail
- ].
after_corrupt_files_decision_log_head(suite) -> [];
after_corrupt_files_decision_log_head(Config) when is_list(Config) ->
diff --git a/lib/mnesia/test/mnesia_registry_test.erl b/lib/mnesia/test/mnesia_registry_test.erl
index 2305ef93b7..cf8da38632 100644
--- a/lib/mnesia/test/mnesia_registry_test.erl
+++ b/lib/mnesia/test/mnesia_registry_test.erl
@@ -26,17 +26,22 @@
init_per_testcase(Func, Conf) ->
mnesia_test_lib:init_per_testcase(Func, Conf).
-fin_per_testcase(Func, Conf) ->
- mnesia_test_lib:fin_per_testcase(Func, Conf).
+end_per_testcase(Func, Conf) ->
+ mnesia_test_lib:end_per_testcase(Func, Conf).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(doc) ->
- ["Test the mnesia_registry module"];
-all(suite) ->
- [
- good_dump,
- bad_dump
- ].
+all() ->
+ [good_dump, bad_dump].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
good_dump(doc) ->
diff --git a/lib/mnesia/test/mnesia_schema_recovery_test.erl b/lib/mnesia/test/mnesia_schema_recovery_test.erl
index 387238ae6b..0fe26efd0b 100644
--- a/lib/mnesia/test/mnesia_schema_recovery_test.erl
+++ b/lib/mnesia/test/mnesia_schema_recovery_test.erl
@@ -26,8 +26,8 @@
init_per_testcase(Func, Conf) ->
mnesia_test_lib:init_per_testcase(Func, Conf).
-fin_per_testcase(Func, Conf) ->
- mnesia_test_lib:fin_per_testcase(Func, Conf).
+end_per_testcase(Func, Conf) ->
+ mnesia_test_lib:end_per_testcase(Func, Conf).
-define(receive_messages(Msgs), receive_messages(Msgs, ?FILE, ?LINE)).
@@ -41,92 +41,82 @@ fin_per_testcase(Func, Conf) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(doc) ->
- ["Verify recoverabiliy of schema transactions.",
- " Verify that a schema transaction",
- " can be completed when it has been logged correctly and Mnesia",
- " crashed before the log has been dumped. Then the transaction ",
- " should be handled during the log dump at startup"
- ];
-all(suite) ->
- [interrupted_before_log_dump,
- interrupted_after_log_dump].
-
-interrupted_before_log_dump(suite) ->
- [interrupted_before_create_ram,
- interrupted_before_create_disc,
- interrupted_before_create_disc_only,
- interrupted_before_create_nostore,
- interrupted_before_delete_ram,
- interrupted_before_delete_disc,
- interrupted_before_delete_disc_only,
- interrupted_before_add_ram,
- interrupted_before_add_disc,
- interrupted_before_add_disc_only,
- interrupted_before_add_kill_copier,
- interrupted_before_move_ram,
- interrupted_before_move_disc,
- interrupted_before_move_disc_only,
- interrupted_before_move_kill_copier,
- interrupted_before_delcopy_ram,
- interrupted_before_delcopy_disc,
- interrupted_before_delcopy_disc_only,
- interrupted_before_delcopy_kill_copier,
- interrupted_before_addindex_ram,
- interrupted_before_addindex_disc,
- interrupted_before_addindex_disc_only,
- interrupted_before_delindex_ram,
- interrupted_before_delindex_disc,
- interrupted_before_delindex_disc_only,
- interrupted_before_change_type_ram2disc,
- interrupted_before_change_type_ram2disc_only,
- interrupted_before_change_type_disc2ram,
- interrupted_before_change_type_disc2disc_only,
- interrupted_before_change_type_disc_only2ram,
- interrupted_before_change_type_disc_only2disc,
- interrupted_before_change_type_other_node,
- interrupted_before_change_schema_type %% Change schema table copy type!!
- ].
-
-interrupted_after_log_dump(suite) ->
- [interrupted_after_create_ram,
- interrupted_after_create_disc,
- interrupted_after_create_disc_only,
- interrupted_after_create_nostore,
- interrupted_after_delete_ram,
- interrupted_after_delete_disc,
- interrupted_after_delete_disc_only,
- interrupted_after_add_ram,
- interrupted_after_add_disc,
- interrupted_after_add_disc_only,
- interrupted_after_add_kill_copier,
- interrupted_after_move_ram,
- interrupted_after_move_disc,
- interrupted_after_move_disc_only,
- interrupted_after_move_kill_copier,
- interrupted_after_delcopy_ram,
- interrupted_after_delcopy_disc,
- interrupted_after_delcopy_disc_only,
- interrupted_after_delcopy_kill_copier,
- interrupted_after_addindex_ram,
- interrupted_after_addindex_disc,
- interrupted_after_addindex_disc_only,
- interrupted_after_delindex_ram,
- interrupted_after_delindex_disc,
- interrupted_after_delindex_disc_only,
- interrupted_after_change_type_ram2disc,
- interrupted_after_change_type_ram2disc_only,
- interrupted_after_change_type_disc2ram,
- interrupted_after_change_type_disc2disc_only,
- interrupted_after_change_type_disc_only2ram,
- interrupted_after_change_type_disc_only2disc,
- interrupted_after_change_type_other_node,
- interrupted_after_change_schema_type %% Change schema table copy type!!
-
-% interrupted_before_change_access_mode,
-% interrupted_before_transform,
-% interrupted_before_restore,
- ].
+all() ->
+ [{group, interrupted_before_log_dump},
+ {group, interrupted_after_log_dump}].
+
+groups() ->
+ [{interrupted_before_log_dump, [],
+ [interrupted_before_create_ram,
+ interrupted_before_create_disc,
+ interrupted_before_create_disc_only,
+ interrupted_before_create_nostore,
+ interrupted_before_delete_ram,
+ interrupted_before_delete_disc,
+ interrupted_before_delete_disc_only,
+ interrupted_before_add_ram, interrupted_before_add_disc,
+ interrupted_before_add_disc_only,
+ interrupted_before_add_kill_copier,
+ interrupted_before_move_ram,
+ interrupted_before_move_disc,
+ interrupted_before_move_disc_only,
+ interrupted_before_move_kill_copier,
+ interrupted_before_delcopy_ram,
+ interrupted_before_delcopy_disc,
+ interrupted_before_delcopy_disc_only,
+ interrupted_before_delcopy_kill_copier,
+ interrupted_before_addindex_ram,
+ interrupted_before_addindex_disc,
+ interrupted_before_addindex_disc_only,
+ interrupted_before_delindex_ram,
+ interrupted_before_delindex_disc,
+ interrupted_before_delindex_disc_only,
+ interrupted_before_change_type_ram2disc,
+ interrupted_before_change_type_ram2disc_only,
+ interrupted_before_change_type_disc2ram,
+ interrupted_before_change_type_disc2disc_only,
+ interrupted_before_change_type_disc_only2ram,
+ interrupted_before_change_type_disc_only2disc,
+ interrupted_before_change_type_other_node,
+ interrupted_before_change_schema_type]},
+ {interrupted_after_log_dump, [],
+ [interrupted_after_create_ram,
+ interrupted_after_create_disc,
+ interrupted_after_create_disc_only,
+ interrupted_after_create_nostore,
+ interrupted_after_delete_ram,
+ interrupted_after_delete_disc,
+ interrupted_after_delete_disc_only,
+ interrupted_after_add_ram, interrupted_after_add_disc,
+ interrupted_after_add_disc_only,
+ interrupted_after_add_kill_copier,
+ interrupted_after_move_ram, interrupted_after_move_disc,
+ interrupted_after_move_disc_only,
+ interrupted_after_move_kill_copier,
+ interrupted_after_delcopy_ram,
+ interrupted_after_delcopy_disc,
+ interrupted_after_delcopy_disc_only,
+ interrupted_after_delcopy_kill_copier,
+ interrupted_after_addindex_ram,
+ interrupted_after_addindex_disc,
+ interrupted_after_addindex_disc_only,
+ interrupted_after_delindex_ram,
+ interrupted_after_delindex_disc,
+ interrupted_after_delindex_disc_only,
+ interrupted_after_change_type_ram2disc,
+ interrupted_after_change_type_ram2disc_only,
+ interrupted_after_change_type_disc2ram,
+ interrupted_after_change_type_disc2disc_only,
+ interrupted_after_change_type_disc_only2ram,
+ interrupted_after_change_type_disc_only2disc,
+ interrupted_after_change_type_other_node,
+ interrupted_after_change_schema_type]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
interrupted_before_create_ram(suite) -> [];
interrupted_before_create_ram(Config) when is_list(Config) ->
diff --git a/lib/mnesia/test/mnesia_test_lib.erl b/lib/mnesia/test/mnesia_test_lib.erl
index 1e98f017f7..182c240084 100644
--- a/lib/mnesia/test/mnesia_test_lib.erl
+++ b/lib/mnesia/test/mnesia_test_lib.erl
@@ -130,7 +130,7 @@
doc/1,
struct/1,
init_per_testcase/2,
- fin_per_testcase/2,
+ end_per_testcase/2,
kill_tc/2
]).
@@ -144,7 +144,7 @@ init_per_testcase(_Func, Config) ->
global:register_name(mnesia_global_logger, group_leader()),
Config.
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
global:unregister_name(mnesia_global_logger),
%% Nodes = select_nodes(all, Config, ?FILE, ?LINE),
%% rpc:multicall(Nodes, mnesia, lkill, []),
@@ -492,19 +492,19 @@ wait_for_evaluator(Pid, Mod, Fun, Config) ->
{'EXIT', Pid, {skipped, Reason}} ->
log("<WARNING> Test case ~w skipped, because ~p~n",
[{Mod, Fun}, Reason]),
- Mod:fin_per_testcase(Fun, Config),
+ Mod:end_per_testcase(Fun, Config),
{skip, {Mod, Fun}, Reason};
{'EXIT', Pid, Reason} ->
log("<>ERROR<> Eval process ~w exited, because ~p~n",
[{Mod, Fun}, Reason]),
- Mod:fin_per_testcase(Fun, Config),
+ Mod:end_per_testcase(Fun, Config),
{crash, {Mod, Fun}, Reason}
end.
test_case_evaluator(Mod, Fun, [Config]) ->
NewConfig = Mod:init_per_testcase(Fun, Config),
R = apply(Mod, Fun, [NewConfig]),
- Mod:fin_per_testcase(Fun, NewConfig),
+ Mod:end_per_testcase(Fun, NewConfig),
exit({test_case_ok, R}).
activity_evaluator(Coordinator) ->
diff --git a/lib/mnesia/test/mnesia_test_lib.hrl b/lib/mnesia/test/mnesia_test_lib.hrl
index 85f12200d4..fc377dbd2c 100644
--- a/lib/mnesia/test/mnesia_test_lib.hrl
+++ b/lib/mnesia/test/mnesia_test_lib.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
diff --git a/lib/mnesia/test/mnesia_tpcb.erl b/lib/mnesia/test/mnesia_tpcb.erl
index 903c53a21c..595412ff24 100644
--- a/lib/mnesia/test/mnesia_tpcb.erl
+++ b/lib/mnesia/test/mnesia_tpcb.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2010. 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
diff --git a/lib/mnesia/test/mnesia_trans_access_test.erl b/lib/mnesia/test/mnesia_trans_access_test.erl
index c67382e694..55ba4dd761 100644
--- a/lib/mnesia/test/mnesia_trans_access_test.erl
+++ b/lib/mnesia/test/mnesia_trans_access_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2010. 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
@@ -26,8 +26,8 @@
init_per_testcase(Func, Conf) ->
mnesia_test_lib:init_per_testcase(Func, Conf).
-fin_per_testcase(Func, Conf) ->
- mnesia_test_lib:fin_per_testcase(Func, Conf).
+end_per_testcase(Func, Conf) ->
+ mnesia_test_lib:end_per_testcase(Func, Conf).
-define(receive_messages(Msgs), mnesia_recovery_test:receive_messages(Msgs, ?FILE, ?LINE)).
@@ -40,18 +40,41 @@ fin_per_testcase(Func, Conf) ->
-endif.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(doc) ->
- ["Evil access of records in the scope of transactions",
- "Invoke all functions in the API and try to cover all legal uses",
- "cases as well the illegal dito. This is a complement to the",
- "other more explicit test cases."];
-all(suite) ->
- [
- write, read, wread, delete, delete_object,
- match_object, select, select14, all_keys,
- transaction, nested_activities,
- index_tabs, index_lifecycle
- ].
+all() ->
+ [write, read, wread, delete, delete_object,
+ match_object, select, select14, all_keys, transaction,
+ {group, nested_activities}, {group, index_tabs},
+ {group, index_lifecycle}].
+
+groups() ->
+ [{nested_activities, [],
+ [basic_nested, {group, nested_transactions},
+ mix_of_nested_activities]},
+ {nested_transactions, [],
+ [nested_trans_both_ok, nested_trans_child_dies,
+ nested_trans_parent_dies, nested_trans_both_dies]},
+ {index_tabs, [],
+ [index_match_object, index_read, {group, index_update},
+ index_write]},
+ {index_update, [],
+ [index_update_set, index_update_bag]},
+ {index_lifecycle, [],
+ [add_table_index_ram, add_table_index_disc,
+ add_table_index_disc_only, create_live_table_index_ram,
+ create_live_table_index_disc,
+ create_live_table_index_disc_only, del_table_index_ram,
+ del_table_index_disc, del_table_index_disc_only,
+ {group, idx_schema_changes}]},
+ {idx_schema_changes, [],
+ [idx_schema_changes_ram, idx_schema_changes_disc,
+ idx_schema_changes_disc_only]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% Write records
@@ -404,12 +427,6 @@ transaction(Config) when is_list(Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-nested_activities(suite) ->
- [
- basic_nested,
- nested_transactions,
- mix_of_nested_activities
- ].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -520,13 +537,6 @@ n_f4() ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-nested_transactions(doc) ->
- ["Verify that nested_transactions are handled as expected"];
-nested_transactions(suite) ->
- [nested_trans_both_ok,
- nested_trans_child_dies,
- nested_trans_parent_dies,
- nested_trans_both_dies].
nested_trans_both_ok(suite) -> [];
nested_trans_both_ok(Config) when is_list(Config) ->
@@ -671,13 +681,6 @@ read_op(Oid) ->
Ops
end.
-index_tabs(suite) ->
- [
- index_match_object,
- index_read,
- index_update,
- index_write
- ].
%% Read matching records by using an index
@@ -767,10 +770,6 @@ index_read(Config) when is_list(Config) ->
?match({'EXIT', {aborted, no_transaction}}, mnesia:index_read(Tab, 2, ValPos)),
?verify_mnesia(Nodes, []).
-index_update(suite) -> [index_update_set, index_update_bag];
-index_update(doc) -> ["See Ticket OTP-2083, verifies that a table with a index is "
- "update in the correct way i.e. the index finds the correct "
- "records after a update"].
index_update_set(suite) -> [];
index_update_set(Config)when is_list(Config) ->
[Node1] = Nodes = ?acquire_nodes(1, Config),
@@ -1046,19 +1045,6 @@ index_write(Config)when is_list(Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Add and drop indecies
-index_lifecycle(suite) ->
- [
- add_table_index_ram,
- add_table_index_disc,
- add_table_index_disc_only,
- create_live_table_index_ram,
- create_live_table_index_disc,
- create_live_table_index_disc_only,
- del_table_index_ram,
- del_table_index_disc,
- del_table_index_disc_only,
- idx_schema_changes
- ].
add_table_index_ram(suite) -> [];
add_table_index_ram(Config) when is_list(Config) ->
@@ -1171,13 +1157,6 @@ del_table_index(Config, Storage) ->
?match({atomic, ok}, mnesia:transaction(NestedFun)),
?verify_mnesia(Nodes, []).
-idx_schema_changes(suite) -> [idx_schema_changes_ram,
- idx_schema_changes_disc,
- idx_schema_changes_disc_only];
-idx_schema_changes(doc) ->
- ["Tests that index tables are handled correctly when schema changes.",
- "For example when a replica is deleted or inserted",
- "TICKET OTP-2XXX (ELVIRA)"].
idx_schema_changes_ram(suite) -> [];
idx_schema_changes_ram(Config) when is_list(Config) ->
diff --git a/lib/mnesia/vsn.mk b/lib/mnesia/vsn.mk
index 5b52bc6075..38e1a94545 100644
--- a/lib/mnesia/vsn.mk
+++ b/lib/mnesia/vsn.mk
@@ -1 +1 @@
-MNESIA_VSN = 4.4.16
+MNESIA_VSN = 4.4.18
diff --git a/lib/observer/doc/src/crashdump.xml b/lib/observer/doc/src/crashdump.xml
index f8d7641524..b6056c2ed1 100644
--- a/lib/observer/doc/src/crashdump.xml
+++ b/lib/observer/doc/src/crashdump.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2003</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
@@ -38,6 +38,10 @@
<description>
<p>The Crashdump Viewer is an HTML based tool for browsing Erlang
crashdumps. Crashdump Viewer runs under the WebTool application.</p>
+
+ <p>See the <seealso marker="crashdump_ug">user's guide</seealso>
+ for more information about how to get started with the Crashdump
+ Viewer.</p>
</description>
<funcs>
<func>
diff --git a/lib/observer/doc/src/crashdump_help.html b/lib/observer/doc/src/crashdump_help.html
index 736a024288..268b9495d6 100644
--- a/lib/observer/doc/src/crashdump_help.html
+++ b/lib/observer/doc/src/crashdump_help.html
@@ -131,7 +131,7 @@ SRC="min_head.gif"></a>
- <a NAME="ets_tables">
+ <a NAME="ets_tables"><a NAME="internal_ets_tables">
<h3>ETS tables</h3>
<p>The ETS table information page shows all ETS table
@@ -304,4 +304,4 @@ Copyright &copy; 1991-2003
</font>
</center>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/lib/observer/doc/src/crashdump_ug.xml b/lib/observer/doc/src/crashdump_ug.xml
index 9913b30e38..dc65fe5b39 100644
--- a/lib/observer/doc/src/crashdump_ug.xml
+++ b/lib/observer/doc/src/crashdump_ug.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2003</year><year>2009</year>
+ <year>2003</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -38,12 +38,31 @@
<section>
<title>Getting Started</title>
- <p>From an erlang node, start Crashdump Viewer by calling
- <c>crashdump_viewer:start()</c>. This will automatically start
- WebTool and display the web address where WebTool can be
- found. See the documentation for the WebTool application for
- further information about how to use WebTool.
- </p>
+
+ <p>The easiest way to start Crashdump Viewer is to use the
+ provided shell script named <c>cdv</c> with the full path to the
+ erlang crashdump as an argument. The script can be found in the
+ priv directory of the <c>observer</c> application. This starts
+ WebTool, Crashdump Viewer and a web browser, and loads the given
+ file. The browser should then display a page named General
+ Information which shows a short summary of the information in
+ the crashdump.</p>
+
+ <p>The default browser is Internet Explorer on Windows or else
+ Firefox. To use another browser, give the browser's start command
+ as the second argument to <c>cdv</c>. If the given browser name is
+ not known to Crashdump Viewer, the browser argument is executed as
+ a command with the start URL as the only argument.</p>
+
+ <p>Under Windows the batch file <c>cdv.bat</c> can be used.</p>
+
+ <p>It is also possible to start the Crashdump Viewer from within
+ an erlang node by calling <seealso
+ marker="crashdump_viewer#start/0">crashdump_viewer:start/0</seealso>. This
+ will automatically start WebTool and display the web address where
+ WebTool can be found. See the documentation for the WebTool
+ application for further information about how to use WebTool.</p>
+
<p>Point your web browser to the address displayed, and you should
now see the start page of WebTool. At the top of the page, you
will see a link to "CrashDumpViewer". Click this link to get to
@@ -52,15 +71,12 @@
connection to the internet, or you must set no proxy for
localhost.)
</p>
- <p>You can also start WebTool, Crashdump Viewer and a browser in
- one go by running the <c>start_webtool</c> script found in the
- <c>priv</c> directory of the WebTool application, e.g.
- <br></br>
-<c>>start_webtool crashdump_viewer</c></p>
<p>From the start page of Crashdump Viewer, push the "Load
Crashdump" button to load a crashdump into the tool. Then enter
- the filename of the crashdump in the entry field and push the "Ok"
- button.
+ the filename of the crashdump in the entry field and push the
+ "Ok" button. This will bring you to the General Information
+ page, i.e. the same page as the <c>cdv</c> script will open in
+ the browser.
</p>
<p>Crashdumps generated by OTP R9C and later are loaded directly
into the Crashdump Viewer, while dumps from earlier releases first
diff --git a/lib/observer/doc/src/etop.xml b/lib/observer/doc/src/etop.xml
index 1ea67e6864..78047caab3 100644
--- a/lib/observer/doc/src/etop.xml
+++ b/lib/observer/doc/src/etop.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2002</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
@@ -26,27 +26,33 @@
<title>etop</title>
<prepared>Siri hansen</prepared>
<responsible></responsible>
- <docno>1</docno>
+ <docno></docno>
<approved></approved>
<checked></checked>
- <date>2002-03-27</date>
- <rev>PA1</rev>
- <file>etop.sgml</file>
+ <date></date>
+ <rev></rev>
+ <file></file>
</header>
<module>etop</module>
<modulesummary>Erlang Top is a tool for presenting information about erlang processes similar to the information presented by "top" in UNIX.</modulesummary>
<description>
+
<p><c>etop</c> should be started with the provided scripts
<c>etop</c> and <c>getop</c> for text based and graphical
- presentation respectively. Under Windows the batch files
- <c>etop.bat</c> and <c>getop.bat</c> can be used.
- </p>
- <p>All interaction with <c>etop</c> when running the graphical
- presentation should happen via the menus. For the text based
- presentation the functions described below can be used.
- </p>
- <p>The following configuration parameters exist for <c>etop</c>.
- </p>
+ presentation respectively. This will start a hidden erlang node
+ which connects to the node to be measured. The measured node is
+ given with the <c>-node</c> option. If the measured node has a
+ different cookie than the default cookie for the user who
+ invokes the script, the cookie must be explicitly given witht
+ the <c>-setcookie</c> option.</p>
+
+ <p>Under Windows the batch files <c>etop.bat</c> and
+ <c>getop.bat</c> can be used.</p>
+
+ <p>The following configuration parameters exist for the
+ <c>etop</c> tool. When executing the <c>etop</c> or <c>getop</c>
+ scripts, these parameters can be given as command line options,
+ e.g. <c>getop -node testnode@myhost -setcookie MyCookie</c>.</p>
<taglist>
<tag>node</tag>
<item>The measured node.
@@ -96,6 +102,15 @@ Default: <c>runtime</c> (<c>reductions</c> if
Value: <c>on | off</c> <br></br>
Default: <c>on</c></item>
</taglist>
+
+ <p>All interaction with <c>etop</c> when running the graphical
+ presentation should happen via the menus. For the text based
+ presentation the functions described below can be used.
+ </p>
+
+ <p>See the <seealso marker="etop_ug">user's guide</seealso> for
+ more information about the <c>etop</c> tool.</p>
+
</description>
<funcs>
<func>
diff --git a/lib/observer/doc/src/notes.xml b/lib/observer/doc/src/notes.xml
index 76c13fb3ff..b3b9937f1c 100644
--- a/lib/observer/doc/src/notes.xml
+++ b/lib/observer/doc/src/notes.xml
@@ -31,6 +31,46 @@
<p>This document describes the changes made to the Observer
application.</p>
+<section><title>Observer 0.9.9</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ The time needed for loading a crashump into the crashdump
+ viewer would earlier grow exponentially with the size of
+ the crashdump file. Reading a file of 20M would take a
+ couple of minutes, and for a dump of 250M it would take
+ between 1 and 2 hours. This has been solved.</p>
+ <p>
+ Earlier, all processes, timers, funs or ets-tables would
+ be loaded into the memory of the crashdump viewer node
+ before sending it on to the web server. This has been
+ changed and the pages are now sent to the web server in
+ chunks.</p>
+ <p>
+ A security function in newer web browsers prevents a full
+ file path to be sent from an HTML file input field, i.e.
+ the field needed to implement the "Browse" button when
+ loading a file into the crashdump viewer. To overcome
+ this, the file input field is no longer used. Instead a
+ normal text input field is used, and the user needs to
+ manually insert the complete file path. For convenience,
+ a shell script and a batch file are added to the observer
+ application. These can be used to start the
+ crashdump_viewer and a browser and load a file - with the
+ file name given from the command line. The shell script
+ and batch file are called cdv and cdv.bat respectively,
+ and can be found in the priv dir of the observer
+ application.</p>
+ <p>
+ Own Id: OTP-9051 Aux Id: seq11789 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Observer 0.9.8.4</title>
<section><title>Improvements and New Features</title>
diff --git a/lib/observer/doc/src/notes_history.xml b/lib/observer/doc/src/notes_history.xml
index 8c350cd012..2300983131 100644
--- a/lib/observer/doc/src/notes_history.xml
+++ b/lib/observer/doc/src/notes_history.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2006</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/observer/doc/src/observer_app.xml b/lib/observer/doc/src/observer_app.xml
index aadc325745..e643568a39 100644
--- a/lib/observer/doc/src/observer_app.xml
+++ b/lib/observer/doc/src/observer_app.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2002</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/observer/doc/src/part_notes_history.xml b/lib/observer/doc/src/part_notes_history.xml
index 3f07c3ce20..1ba0875fec 100644
--- a/lib/observer/doc/src/part_notes_history.xml
+++ b/lib/observer/doc/src/part_notes_history.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2006</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/observer/doc/src/ttb.xml b/lib/observer/doc/src/ttb.xml
index fcaa1c2504..2c80891925 100644
--- a/lib/observer/doc/src/ttb.xml
+++ b/lib/observer/doc/src/ttb.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2002</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/observer/priv/bin/cdv b/lib/observer/priv/bin/cdv
new file mode 100755
index 0000000000..1c44785ac2
--- /dev/null
+++ b/lib/observer/priv/bin/cdv
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+erl -sname cdv -noinput -s crashdump_viewer script_start $@
+
diff --git a/lib/observer/priv/bin/cdv.bat b/lib/observer/priv/bin/cdv.bat
new file mode 100644
index 0000000000..efa8bf8687
--- /dev/null
+++ b/lib/observer/priv/bin/cdv.bat
@@ -0,0 +1,2 @@
+@ECHO OFF
+CALL werl -sname cdv -s crashdump_viewer script_start %*
diff --git a/lib/observer/src/Makefile b/lib/observer/src/Makefile
index b4eb518dd7..2d06cb6bc4 100644
--- a/lib/observer/src/Makefile
+++ b/lib/observer/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2002-2009. All Rights Reserved.
+# Copyright Ericsson AB 2002-2011. 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
@@ -59,8 +59,10 @@ BINDIR= $(PRIVDIR)/bin
EXECUTABLES= \
$(BINDIR)/etop \
$(BINDIR)/getop \
+ $(BINDIR)/cdv \
$(BINDIR)/etop.bat \
- $(BINDIR)/getop.bat
+ $(BINDIR)/getop.bat \
+ $(BINDIR)/cdv.bat
CDVDIR= $(PRIVDIR)/crashdump_viewer
GIF_FILES= \
$(CDVDIR)/collapsd.gif \
diff --git a/lib/observer/src/crashdump_viewer.erl b/lib/observer/src/crashdump_viewer.erl
index 978541e470..3b8d17c7d9 100644
--- a/lib/observer/src/crashdump_viewer.erl
+++ b/lib/observer/src/crashdump_viewer.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -23,7 +23,7 @@
%% the server started by webtool and the API for the crashdump viewer tool.
%%
%% All functions in the API except configData/0 and start_link/0 are
-%% called from HTML pages via erl_scheme.
+%% called from HTML pages via erl_scheme (mod_esi).
%%
%% Tables
%% ------
@@ -34,18 +34,21 @@
%%
%% cdv_dump_index_table: This table holds all tags read from the crashdump.
%% Each tag indicates where the information about a specific item starts.
-%% The table entry for a tag includes the start and end positions for
-%% this item-information. All tags start with a "=" at the beginning of
+%% The table entry for a tag includes the start position for this
+%% item-information. All tags start with a "=" at the beginning of
%% a line.
%%
%% Process state
%% -------------
%% file: The name of the crashdump currently viewed.
%% procs_summary: Process summary represented by a list of
-%% #proc records. This is used for efficiency reasons when sorting
-%% the process summary table instead of reading all processes from
-%% the dump again.
-%% sorted: atom(), indicated what item was last sorted in process summary.
+%% #proc records. This is used for efficiency reasons when sorting the
+%% process summary table instead of reading all processes from the
+%% dump again. Note that if the dump contains more than
+%% ?max_sort_process_num processes, the sort functionality is not
+%% available, and the procs_summary field in the state will have the
+%% value 'too_many'.
+%% sorted: string(), indicated what item was last sorted in process summary.
%% This is needed so reverse sorting can be done.
%% shared_heap: 'true' if crashdump comes from a system running shared heap,
%% else 'false'.
@@ -54,7 +57,7 @@
%%
%% User API
--export([start/0,stop/0]).
+-export([start/0,stop/0,script_start/0,script_start/1]).
%% Webtool API
-export([configData/0,
@@ -68,26 +71,27 @@
initial_info_frame/2,
toggle/2,
general_info/2,
- processes/2,
+ processes/3,
proc_details/2,
- ports/2,
- ets_tables/2,
- timers/2,
- fun_table/2,
- atoms/2,
+ port/2,
+ ports/3,
+ ets_tables/3,
+ internal_ets_tables/2,
+ timers/3,
+ fun_table/3,
+ atoms/3,
dist_info/2,
- loaded_modules/2,
+ loaded_modules/3,
loaded_mod_details/2,
memory/2,
allocated_areas/2,
allocator_info/2,
hash_tables/2,
index_tables/2,
- sort_procs/2,
+ sort_procs/3,
expand/2,
expand_binary/2,
- expand_memory/2,
- next/2]).
+ expand_memory/2]).
%% gen_server callbacks
@@ -113,24 +117,49 @@
% this, it must be explicitly expanded.
-define(max_display_binary_size,50). % max size of a binary that will be
% directly displayed.
+-define(max_sort_process_num,10000). % Max number of processes that allows
+ % sorting. If more than this number of
+ % processes exist, they will be displayed
+ % in the order they are found in the log.
+-define(items_chunk_size,?max_sort_process_num). % Number of items per chunk
+ % when page of many items
+ % is displayed, e.g. processes,
+ % timers, funs...
+ % Must be equal to
+ % ?max_sort_process_num!
+
+%% All possible tags - use macros in order to avoid misspelling in the code
+-define(allocated_areas,allocated_areas).
+-define(allocator,allocator).
+-define(atoms,atoms).
+-define(binary,binary).
+-define(debug_proc_dictionary,debug_proc_dictionary).
+-define(ende,ende).
+-define(erl_crash_dump,erl_crash_dump).
+-define(ets,ets).
+-define(fu,fu).
+-define(hash_table,hash_table).
+-define(hidden_node,hidden_node).
+-define(index_table,index_table).
+-define(instr_data,instr_data).
+-define(internal_ets,internal_ets).
+-define(loaded_modules,loaded_modules).
+-define(memory,memory).
+-define(mod,mod).
+-define(no_distribution,no_distribution).
+-define(node,node).
+-define(not_connected,not_connected).
+-define(num_atoms,num_atoms).
+-define(old_instr_data,old_instr_data).
+-define(port,port).
+-define(proc,proc).
+-define(proc_dictionary,proc_dictionary).
+-define(proc_heap,proc_heap).
+-define(proc_messages,proc_messages).
+-define(proc_stack,proc_stack).
+-define(timer,timer).
+-define(visible_node,visible_node).
--define(initial_proc_record(Pid),
- #proc{pid=Pid,
- %% msg_q_len, reds and stack_heap are integers because it must
- %% be possible to sort on them. All other fields are strings
- msg_q_len=0,reds=0,stack_heap=0,
- %% for old dumps start_time, parent and number of heap frament
- %% does not exist
- start_time="unknown",
- parent="unknown",
- num_heap_frag="unknown",
- %% current_func can be both "current function" and
- %% "last scheduled in for"
- current_func={"Current Function",?space},
- %% stack_dump, message queue and dictionaries should only be
- %% displayed as a link to "Expand" (if dump is from OTP R9B
- %% or newer)
- _=?space}).
-record(state,{file,procs_summary,sorted,shared_heap=false,
wordsize=4,num_atoms="unknown",binaries,bg_status}).
@@ -177,6 +206,85 @@ stop() ->
webtool:stop().
%%%-----------------------------------------------------------------
+%%% Start crashdump_viewer via the cdv script located in
+%%% $OBSERVER_PRIV_DIR/bin
+script_start() ->
+ usage().
+script_start([File]) ->
+ DefaultBrowser =
+ case os:type() of
+ {win32,_} -> iexplore;
+ _ -> firefox
+ end,
+ script_start([File,DefaultBrowser]);
+script_start([FileAtom,Browser]) ->
+ File = atom_to_list(FileAtom),
+ case filelib:is_regular(File) of
+ true ->
+ io:format("Starting crashdump_viewer...\n"),
+ start(),
+ io:format("Reading crashdump..."),
+ read_file(File),
+ redirect([],[]),
+ io:format("done\n"),
+ start_browser(Browser);
+ false ->
+ io:format("cdv error: the given file does not exist\n"),
+ usage()
+ end.
+
+start_browser(Browser) ->
+ PortStr = integer_to_list(gen_server:call(web_tool,get_port)),
+ Url = "http://localhost:" ++ PortStr ++ ?START_PAGE,
+ {OSType,_} = os:type(),
+ case Browser of
+ none ->
+ ok;
+ iexplore when OSType == win32->
+ io:format("Starting internet explorer...\n"),
+ {ok,R} = win32reg:open(""),
+ Key="\\local_machine\\SOFTWARE\\Microsoft\\IE Setup\\Setup",
+ win32reg:change_key(R,Key),
+ {ok,Val} = win32reg:value(R,"Path"),
+ IExplore=filename:join(win32reg:expand(Val),"iexplore.exe"),
+ os:cmd("\"" ++ IExplore ++ "\" " ++ Url);
+ _ when OSType == win32 ->
+ io:format("Starting ~w...\n",[Browser]),
+ os:cmd("\"" ++ atom_to_list(Browser) ++ "\" " ++ Url);
+ B when B==firefox; B==mozilla ->
+ io:format("Sending URL to ~w...",[Browser]),
+ BStr = atom_to_list(Browser),
+ SendCmd = BStr ++ " -raise -remote \'openUrl(" ++ Url ++ ")\'",
+ Port = open_port({spawn,SendCmd},[exit_status]),
+ receive
+ {Port,{exit_status,0}} ->
+ io:format("done\n");
+ {Port,{exit_status,_Error}} ->
+ io:format(" not running, starting ~w...\n",[Browser]),
+ os:cmd(BStr ++ " " ++ Url)
+ after 5000 ->
+ io:format(" failed, starting ~w...\n",[Browser]),
+ erlang:port_close(Port),
+ os:cmd(BStr ++ " " ++ Url)
+ end;
+ _ ->
+ io:format("Starting ~w...\n",[Browser]),
+ os:cmd(atom_to_list(Browser) ++ " " ++ Url)
+ end,
+ ok.
+
+usage() ->
+ io:format(
+ "\nusage: cdv file [ browser ]\n"
+ "\tThe \'file\' must be an existing erlang crash dump.\n"
+ "\tDefault browser is \'iexplore\' (Internet Explorer) on Windows\n"
+ "\tor else \'firefox\'.\n",
+ []).
+
+
+
+
+%%%-----------------------------------------------------------------
%%% Return config data used by webtool
configData() ->
Dir = filename:join(code:priv_dir(observer),"crashdump_viewer"),
@@ -266,22 +374,24 @@ toggle(_Env,Input) ->
%%% The following functions are called when menu items are clicked.
general_info(_Env,_Input) ->
call(general_info).
-processes(_Env,_Input) ->
- call(procs_summary).
-ports(_Env,Input) -> % this is also called when a link to a port is clicked
- call({ports,Input}).
-ets_tables(_Env,Input) ->
- call({ets_tables,Input}).
-timers(_Env,Input) ->
- call({timers,Input}).
-fun_table(_Env,_Input) ->
- call(funs).
-atoms(_Env,_Input) ->
- call(atoms).
+processes(SessionId,_Env,_Input) ->
+ call({procs_summary,SessionId}).
+ports(SessionId,_Env,_Input) ->
+ call({ports,SessionId}).
+ets_tables(SessionId,_Env,Input) ->
+ call({ets_tables,SessionId,Input}).
+internal_ets_tables(_Env,_Input) ->
+ call(internal_ets_tables).
+timers(SessionId,_Env,Input) ->
+ call({timers,SessionId,Input}).
+fun_table(SessionId,_Env,_Input) ->
+ call({funs,SessionId}).
+atoms(SessionId,_Env,_Input) ->
+ call({atoms,SessionId}).
dist_info(_Env,_Input) ->
call(dist_info).
-loaded_modules(_Env,_Input) ->
- call(loaded_mods).
+loaded_modules(SessionId,_Env,_Input) ->
+ call({loaded_mods,SessionId}).
loaded_mod_details(_Env,Input) ->
call({loaded_mod_details,Input}).
memory(_Env,_Input) ->
@@ -303,8 +413,13 @@ proc_details(_Env,Input) ->
%%%-----------------------------------------------------------------
%%% Called when one of the headings in the process summary table are
%%% clicked. It sorts the processes by the clicked heading.
-sort_procs(_Env,Input) ->
- call({sort_procs,Input}).
+sort_procs(SessionId,_Env,Input) ->
+ call({sort_procs,SessionId,Input}).
+
+%%%-----------------------------------------------------------------
+%%% Called when a link to a port is clicked.
+port(_Env,Input) ->
+ call({port,Input}).
%%%-----------------------------------------------------------------
%%% Called when the "Expand" link in a call stack (Last Calls) is
@@ -325,11 +440,6 @@ expand_binary(_Env,Input) ->
call({expand_binary,Input}).
%%%-----------------------------------------------------------------
-%%% Called when the "Next" link under atoms is clicked.
-next(_Env,Input) ->
- call({next,Input}).
-
-%%%-----------------------------------------------------------------
%%% Called on regular intervals while waiting for a dump to be read
redirect(_Env,_Input) ->
call(redirect).
@@ -348,7 +458,7 @@ redirect(_Env,_Input) ->
%%--------------------------------------------------------------------
init([]) ->
ets:new(cdv_menu_table,[set,named_table,{keypos,#menu_item.index},public]),
- ets:new(cdv_dump_index_table,[bag,named_table,public]),
+ ets:new(cdv_dump_index_table,[ordered_set,named_table,public]),
{ok, #state{}}.
%%--------------------------------------------------------------------
@@ -373,16 +483,7 @@ handle_call(start_page, _From, State) ->
Reply = crashdump_viewer_html:start_page(),
{reply,Reply,State};
handle_call({read_file,Input}, _From, _State) ->
- {ok,File0} = get_value("path",httpd:parse_query(Input)),
- File =
- case File0 of
- [$"|FileAndSome] ->
- %% Opera adds \"\" around the filename!
- [$"|Elif] = lists:reverse(FileAndSome),
- lists:reverse(Elif);
- _ ->
- File0
- end,
+ {ok,File} = get_value("path",httpd:parse_query(Input)),
spawn_link(fun() -> read_file(File) end),
Status = background_status(reading,File),
Reply = crashdump_viewer_html:redirect(Status),
@@ -399,8 +500,17 @@ handle_call(initial_info_frame,_From,State=#state{file=File}) ->
GenInfo = general_info(File),
NumAtoms = GenInfo#general_info.num_atoms,
{WS,SH} = parse_vsn_str(GenInfo#general_info.system_vsn,4,false),
+ NumProcs = list_to_integer(GenInfo#general_info.num_procs),
+ ProcsSummary =
+ if NumProcs > ?max_sort_process_num -> too_many;
+ true -> State#state.procs_summary
+ end,
+ NewState = State#state{shared_heap=SH,
+ wordsize=WS,
+ num_atoms=NumAtoms,
+ procs_summary=ProcsSummary},
Reply = crashdump_viewer_html:general_info(GenInfo),
- {reply,Reply,State#state{shared_heap=SH,wordsize=WS,num_atoms=NumAtoms}};
+ {reply,Reply,NewState};
handle_call({toggle,Input},_From,State) ->
{ok,Index} = get_value("index",httpd:parse_query(Input)),
do_toggle(list_to_integer(Index)),
@@ -429,7 +539,7 @@ handle_call({expand,Input},_From,State=#state{file=File}) ->
handle_call({expand_memory,Input},_From,State=#state{file=File,binaries=B}) ->
[{"pid",Pid},{"what",What}] = httpd:parse_query(Input),
Reply =
- case truncated_warning([{"=proc",Pid}]) of
+ case truncated_warning([{?proc,Pid}]) of
[] ->
Expanded = expand_memory(File,What,Pid,B),
crashdump_viewer_html:expanded_memory(What,Expanded);
@@ -450,149 +560,129 @@ handle_call({expand_binary,Input},_From,State=#state{file=File}) ->
close(Fd),
Reply=crashdump_viewer_html:expanded_binary(io_lib:format("~p",[Bin])),
{reply,Reply,State};
-handle_call({next,Input},_From,State=#state{file=File}) ->
- [{"pos",Pos},{"num",N},{"start",Start},{"what",What}] =
- httpd:parse_query(Input),
- Tags = related_tags(What),
- TW = truncated_warning(Tags),
- Next = get_next(File,list_to_integer(Pos),list_to_integer(N),
- list_to_integer(Start),What),
- Reply = crashdump_viewer_html:next(Next,TW),
- {reply,Reply,State};
handle_call(general_info,_From,State=#state{file=File}) ->
GenInfo=general_info(File),
Reply = crashdump_viewer_html:general_info(GenInfo),
{reply,Reply,State};
-handle_call(procs_summary,_From,State=#state{file=File,shared_heap=SH}) ->
- ProcsSummary =
- case State#state.procs_summary of
- undefined -> procs_summary(File);
- PS -> PS
- end,
- TW = truncated_warning(["=proc"]),
- Reply = crashdump_viewer_html:procs_summary("pid",ProcsSummary,TW,SH),
- {reply,Reply,State#state{procs_summary=ProcsSummary,sorted="pid"}};
-handle_call({sort_procs,Input}, _From, State=#state{shared_heap=SH}) ->
+handle_call({procs_summary,SessionId},_From,State) ->
+ TW = truncated_warning([?proc]),
+ NewState = procs_summary(SessionId,TW,"pid",State#state{sorted=undefined}),
+ {reply,ok,NewState};
+handle_call({sort_procs,SessionId,Input}, _From, State) ->
{ok,Sort} = get_value("sort",httpd:parse_query(Input)),
- {ProcsSummary,Sorted} = do_sort_procs(Sort,
- State#state.procs_summary,
- State#state.sorted),
- TW = truncated_warning(["=proc"]),
- Reply = crashdump_viewer_html:procs_summary(Sort,ProcsSummary,TW,SH),
- {reply,Reply,State#state{sorted=Sorted}};
+ TW = truncated_warning([?proc]),
+ NewState = procs_summary(SessionId,TW,Sort,State),
+ {reply,ok,NewState};
handle_call({proc_details,Input},_From,State=#state{file=File,shared_heap=SH}) ->
{ok,Pid} = get_value("pid",httpd:parse_query(Input)),
Reply =
case get_proc_details(File,Pid) of
{ok,Proc} ->
- TW = truncated_warning([{"=proc",Pid}]),
+ TW = truncated_warning([{?proc,Pid}]),
crashdump_viewer_html:proc_details(Pid,Proc,TW,SH);
{other_node,Node} ->
- TW = truncated_warning(["=visible_node",
- "=hidden_node",
- "=not_connected"]),
+ TW = truncated_warning([?visible_node,
+ ?hidden_node,
+ ?not_connected]),
crashdump_viewer_html:nods(Node,TW);
not_found ->
crashdump_viewer_html:info_page(["Could not find process: ",
Pid],?space)
end,
{reply, Reply, State};
-handle_call({ports,Input},_From,State=#state{file=File}) ->
+handle_call({port,Input},_From,State=#state{file=File}) ->
+ {ok,P} = get_value("port",httpd:parse_query(Input)),
+ Id = [$#|P],
Reply =
- case get_value("port",httpd:parse_query(Input)) of
- {ok,P} ->
- Id = [$#|P],
- case get_port(File,Id) of
- {ok,PortInfo} ->
- TW = truncated_warning([{"=port",Id}]),
- crashdump_viewer_html:ports(Id,[PortInfo],TW);
- {other_node,Node} ->
- TW = truncated_warning(["=visible_node",
- "=hidden_node",
- "=not_connected"]),
- crashdump_viewer_html:nods(Node,TW);
- not_found ->
- crashdump_viewer_html:info_page(
- ["Could not find port: ",Id],?space)
- end;
- error -> % no port identity in Input - get all ports
- Ports=get_ports(File),
- TW = truncated_warning(["=port"]),
- crashdump_viewer_html:ports("Port Information",Ports,TW)
+ case get_port(File,Id) of
+ {ok,PortInfo} ->
+ TW = truncated_warning([{?port,Id}]),
+ crashdump_viewer_html:port(Id,PortInfo,TW);
+ {other_node,Node} ->
+ TW = truncated_warning([?visible_node,
+ ?hidden_node,
+ ?not_connected]),
+ crashdump_viewer_html:nods(Node,TW);
+ not_found ->
+ crashdump_viewer_html:info_page(
+ ["Could not find port: ",Id],?space)
end,
{reply,Reply,State};
-handle_call({ets_tables,Input},_From,State=#state{file=File,wordsize=WS}) ->
- {Pid,Heading,InternalEts} =
+handle_call({ports,SessionId},_From,State=#state{file=File}) ->
+ TW = truncated_warning([?port]),
+ get_ports(SessionId,File,TW),
+ {reply,ok,State};
+handle_call({ets_tables,SessionId,Input},_From,State=#state{file=File,wordsize=WS}) ->
+ {Pid,Heading} =
case get_value("pid",httpd:parse_query(Input)) of
{ok,P} ->
- {P,["ETS Tables for Process ",P],[]};
+ {P,["ETS Tables for Process ",P]};
error ->
- I = get_internal_ets_tables(File,WS),
- {'_',"ETS Table Information",I}
+ {'$2',"ETS Table Information"}
end,
- EtsTables = get_ets_tables(File,Pid,WS),
- TW = truncated_warning(["=ets"]),
- Reply = crashdump_viewer_html:ets_tables(Heading,EtsTables,InternalEts,TW),
+ TW = truncated_warning([?ets]),
+ get_ets_tables(SessionId,File,Heading,TW,Pid,WS),
+ {reply,ok,State};
+handle_call(internal_ets_tables,_From,State=#state{file=File,wordsize=WS}) ->
+ InternalEts = get_internal_ets_tables(File,WS),
+ TW = truncated_warning([?internal_ets]),
+ Reply = crashdump_viewer_html:internal_ets_tables(InternalEts,TW),
{reply,Reply,State};
-handle_call({timers,Input},_From,State=#state{file=File}) ->
+handle_call({timers,SessionId,Input},_From,State=#state{file=File}) ->
{Pid,Heading} =
case get_value("pid",httpd:parse_query(Input)) of
{ok,P} -> {P,["Timers for Process ",P]};
- error -> {'_',"Timer Information"}
+ error -> {'$2',"Timer Information"}
end,
- Timers=get_timers(File,Pid),
- TW = truncated_warning(["=timer"]),
- Reply = crashdump_viewer_html:timers(Heading,Timers,TW),
- {reply,Reply,State};
+ TW = truncated_warning([?timer]),
+ get_timers(SessionId,File,Heading,TW,Pid),
+ {reply,ok,State};
handle_call(dist_info,_From,State=#state{file=File}) ->
Nods=nods(File),
- TW = truncated_warning(["=visible_node","=hidden_node","=not_connected"]),
+ TW = truncated_warning([?visible_node,?hidden_node,?not_connected]),
Reply = crashdump_viewer_html:nods(Nods,TW),
{reply,Reply,State};
-handle_call(loaded_mods,_From,State=#state{file=File}) ->
- LoadedMods=loaded_mods(File),
- TW = truncated_warning(["=mod"]),
- Reply = crashdump_viewer_html:loaded_mods(LoadedMods,TW),
- {reply,Reply,State};
+handle_call({loaded_mods,SessionId},_From,State=#state{file=File}) ->
+ TW = truncated_warning([?mod]),
+ loaded_mods(SessionId,File,TW),
+ {reply,ok,State};
handle_call({loaded_mod_details,Input},_From,State=#state{file=File}) ->
{ok,Mod} = get_value("mod",httpd:parse_query(Input)),
ModInfo = get_loaded_mod_details(File,Mod),
- TW = truncated_warning([{"=mod",Mod}]),
+ TW = truncated_warning([{?mod,Mod}]),
Reply = crashdump_viewer_html:loaded_mod_details(ModInfo,TW),
{reply,Reply,State};
-handle_call(funs,_From,State=#state{file=File}) ->
- Funs=funs(File),
- TW = truncated_warning(["=fun"]),
- Reply = crashdump_viewer_html:funs(Funs,TW),
- {reply,Reply,State};
-handle_call(atoms,_From,State=#state{file=File,num_atoms=Num}) ->
- Atoms=atoms(File),
- TW = truncated_warning(["=atoms","=num_atoms"]),
- Reply = crashdump_viewer_html:atoms(Atoms,Num,TW),
- {reply,Reply,State};
+handle_call({funs,SessionId},_From,State=#state{file=File}) ->
+ TW = truncated_warning([?fu]),
+ funs(SessionId,File,TW),
+ {reply,ok,State};
+handle_call({atoms,SessionId},_From,State=#state{file=File,num_atoms=Num}) ->
+ TW = truncated_warning([?atoms,?num_atoms]),
+ atoms(SessionId,File,TW,Num),
+ {reply,ok,State};
handle_call(memory,_From,State=#state{file=File}) ->
Memory=memory(File),
- TW = truncated_warning(["=memory"]),
+ TW = truncated_warning([?memory]),
Reply = crashdump_viewer_html:memory(Memory,TW),
{reply,Reply,State};
handle_call(allocated_areas,_From,State=#state{file=File}) ->
AllocatedAreas=allocated_areas(File),
- TW = truncated_warning(["=allocated_areas"]),
+ TW = truncated_warning([?allocated_areas]),
Reply = crashdump_viewer_html:allocated_areas(AllocatedAreas,TW),
{reply,Reply,State};
handle_call(allocator_info,_From,State=#state{file=File}) ->
SlAlloc=allocator_info(File),
- TW = truncated_warning(["=allocator"]),
+ TW = truncated_warning([?allocator]),
Reply = crashdump_viewer_html:allocator_info(SlAlloc,TW),
{reply,Reply,State};
handle_call(hash_tables,_From,State=#state{file=File}) ->
HashTables=hash_tables(File),
- TW = truncated_warning(["=hash_table","=index_table"]),
+ TW = truncated_warning([?hash_table,?index_table]),
Reply = crashdump_viewer_html:hash_tables(HashTables,TW),
{reply,Reply,State};
handle_call(index_tables,_From,State=#state{file=File}) ->
IndexTables=index_tables(File),
- TW = truncated_warning(["=hash_table","=index_table"]),
+ TW = truncated_warning([?hash_table,?index_table]),
Reply = crashdump_viewer_html:index_tables(IndexTables,TW),
{reply,Reply,State}.
@@ -682,9 +772,9 @@ truncated_here(Tag) ->
%% Check if the dump was truncated with the same tag, but earlier id.
-%% Eg if this is {"=proc","<0.30.0>"}, we should warn if the dump was
-%% truncated in {"=proc","<0.29.0>"} or earlier
-truncated_earlier({"=proc",Pid}) ->
+%% Eg if this is {?proc,"<0.30.0>"}, we should warn if the dump was
+%% truncated in {?proc,"<0.29.0>"} or earlier
+truncated_earlier({?proc,Pid}) ->
compare_pid(Pid,get(truncated_proc));
truncated_earlier(_Tag) ->
false.
@@ -718,9 +808,37 @@ open(File) ->
close(Fd) ->
erase(chunk),
file:close(Fd).
+
+%% Set position relative to beginning of file
+%% If position is within the already read Chunk, then adjust 'chunk'
+%% and 'pos' in process dictionary. Else set position in file.
pos_bof(Fd,Pos) ->
+ case get(pos) of
+ undefined ->
+ hard_pos_bof(Fd,Pos);
+ OldPos when Pos>=OldPos ->
+ case get(chunk) of
+ undefined ->
+ hard_pos_bof(Fd,Pos);
+ Chunk ->
+ ChunkSize = byte_size(Chunk),
+ ChunkEnd = OldPos+ChunkSize,
+ if Pos=<ChunkEnd ->
+ Diff = Pos-OldPos,
+ put(pos,Pos),
+ put(chunk,binary:part(Chunk,Diff,ChunkEnd-Pos));
+ true ->
+ hard_pos_bof(Fd,Pos)
+ end
+ end;
+ _ ->
+ hard_pos_bof(Fd,Pos)
+ end.
+
+hard_pos_bof(Fd,Pos) ->
reset_chunk(),
- file:position(Fd,{bof,Pos}).
+ file:position(Fd,{bof,Pos}).
+
get_chunk(Fd) ->
case erase(chunk) of
@@ -979,7 +1097,9 @@ initial_menu() ->
[menu_item(0, {"./general_info","General information"},0),
menu_item(0, {"./processes","Processes"}, 0),
menu_item(0, {"./ports","Ports"}, 0),
- menu_item(0, {"./ets_tables","ETS tables"}, 0),
+ menu_item(2, "ETS tables", 0),
+ menu_item(0, {"./ets_tables","ETS tables"}, 1),
+ menu_item(0, {"./internal_ets_tables","Internal ETS tables"}, 1),
menu_item(0, {"./timers","Timers"}, 0),
menu_item(0, {"./fun_table","Fun table"}, 0),
menu_item(0, {"./atoms","Atoms"}, 0),
@@ -1066,9 +1186,9 @@ read_file(File) ->
{ok,<<$=:8,TagAndRest/binary>>} ->
{Tag,Id,Rest,N1} = tag(Fd,TagAndRest,1),
case Tag of
- "=erl_crash_dump" ->
- ets:delete_all_objects(cdv_dump_index_table),
- ets:insert(cdv_dump_index_table,{Tag,Id,N1+1}),
+ ?erl_crash_dump ->
+ reset_index_table(),
+ insert_index(Tag,Id,N1+1),
put(last_tag,{Tag,""}),
Status = background_status(processing,File),
background_status(Status),
@@ -1107,34 +1227,35 @@ read_file(File) ->
background_done({R,undefined,undefined})
end.
-indexify(Fd,<<"\n=",TagAndRest/binary>>,N) ->
- {Tag,Id,Rest,N1} = tag(Fd,TagAndRest,N+2),
- ets:insert(cdv_dump_index_table,{Tag,Id,N1+1}), % +1 to get past newline
- put(last_tag,{Tag,Id}),
- indexify(Fd,Rest,N1);
-indexify(Fd,<<>>,N) ->
- case read(Fd) of
- {ok,Chunk} when is_binary(Chunk) ->
- indexify(Fd,Chunk,N);
- eof ->
- eof
- end;
-indexify(Fd,<<$\n>>,N) ->
- %% This clause is needed in case the chunk ends with a newline and
- %% the next chunk starts with a tag (i.e. "\n=....")
- case read(Fd) of
- {ok,Chunk} when is_binary(Chunk) ->
- indexify(Fd,<<$\n,Chunk/binary>>,N);
- eof ->
- eof
- end;
-indexify(Fd,<<_Char:8,Rest/binary>>,N) ->
- indexify(Fd,Rest,N+1).
+indexify(Fd,Bin,N) ->
+ case binary:match(Bin,<<"\n=">>) of
+ {Start,Len} ->
+ Pos = Start+Len,
+ <<_: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}),
+ indexify(Fd,Rest,N1);
+ nomatch ->
+ case read(Fd) of
+ {ok,Chunk0} when is_binary(Chunk0) ->
+ {Chunk,N1} =
+ case binary:last(Bin) of
+ $\n ->
+ {<<$\n,Chunk0/binary>>,N+byte_size(Bin)-1};
+ _ ->
+ {Chunk0,N+byte_size(Bin)}
+ end,
+ indexify(Fd,Chunk,N1);
+ eof ->
+ eof
+ end
+ end.
tag(Fd,Bin,N) ->
tag(Fd,Bin,N,[],[],tag).
tag(_Fd,<<$\n:8,_/binary>>=Rest,N,Gat,Di,_Now) ->
- {[$=|lists:reverse(Gat)],lists:reverse(Di),Rest,N};
+ {tag_to_atom(lists:reverse(Gat)),lists:reverse(Di),Rest,N};
tag(Fd,<<$\r:8,Rest/binary>>,N,Gat,Di,Now) ->
tag(Fd,Rest,N+1,Gat,Di,Now);
tag(Fd,<<$::8,IdAndRest/binary>>,N,Gat,Di,tag) ->
@@ -1148,12 +1269,12 @@ tag(Fd,<<>>,N,Gat,Di,Now) ->
{ok,Chunk} when is_binary(Chunk) ->
tag(Fd,Chunk,N,Gat,Di,Now);
eof ->
- {[$=|lists:reverse(Gat)],lists:reverse(Di),<<>>,N}
+ {tag_to_atom(lists:reverse(Gat)),lists:reverse(Di),<<>>,N}
end.
check_if_truncated() ->
case get(last_tag) of
- {"=end",_} ->
+ {?ende,_} ->
put(truncated,false),
put(truncated_proc,false);
TruncatedTag ->
@@ -1161,32 +1282,29 @@ check_if_truncated() ->
find_truncated_proc(TruncatedTag)
end.
-find_truncated_proc({"=atom",_Id}) ->
+find_truncated_proc({?atoms,_Id}) ->
put(truncated_proc,false);
find_truncated_proc({Tag,Pid}) ->
case is_proc_tag(Tag) of
true ->
put(truncated_proc,Pid);
false ->
- %% This means that the dump is truncated between "=proc" and
- %% "=proc_heap" => memory info is missing for all procs.
+ %% This means that the dump is truncated between ?proc and
+ %% ?proc_heap => memory info is missing for all procs.
put(truncated_proc,"<0.0.0>")
end.
-is_proc_tag(Tag) when Tag=="=proc";
- Tag=="=proc_dictionary";
- Tag=="=proc_messages";
- Tag=="=proc_dictionary";
- Tag=="=debug_proc_dictionary";
- Tag=="=proc_stack";
- Tag=="=proc_heap" ->
+is_proc_tag(Tag) when Tag==?proc;
+ Tag==?proc_dictionary;
+ Tag==?proc_messages;
+ Tag==?proc_dictionary;
+ Tag==?debug_proc_dictionary;
+ Tag==?proc_stack;
+ Tag==?proc_heap ->
true;
is_proc_tag(_) ->
false.
-related_tags("Atoms") ->
- ["=atoms","=num_atoms"].
-
%%% Inform the crashdump_viewer_server that a background job is completed.
background_done(Result) ->
Dict = get(),
@@ -1198,8 +1316,7 @@ background_status(Status) ->
%%%-----------------------------------------------------------------
%%% Functions for reading information from the dump
general_info(File) ->
- [{"=erl_crash_dump",_Id,Start}] =
- ets:lookup(cdv_dump_index_table,"=erl_crash_dump"),
+ [{_Id,Start}] = lookup_index(?erl_crash_dump),
Fd = open(File),
pos_bof(Fd,Start),
Created = case get_rest_of_line(Fd) of
@@ -1207,15 +1324,15 @@ general_info(File) ->
WholeLine -> WholeLine
end,
- GI0 = get_general_info(Fd,#general_info{created=Created,_=?space}),
+ GI0 = get_general_info(Fd,#general_info{created=Created}),
GI = case GI0#general_info.num_atoms of
?space -> GI0#general_info{num_atoms=get_num_atoms(Fd)};
_ -> GI0
end,
{MemTot,MemMax} =
- case ets:lookup(cdv_dump_index_table,"=memory") of
- [{"=memory",_,MemStart}] ->
+ case lookup_index(?memory) of
+ [{_,MemStart}] ->
pos_bof(Fd,MemStart),
Memory = get_meminfo(Fd,[]),
Tot = case lists:keysearch("total",1,Memory) of
@@ -1232,33 +1349,34 @@ general_info(File) ->
end,
close(Fd),
- {NumProcs,NumEts,NumFuns} = count(),
+ {NumProcs,NumEts,NumFuns,NumTimers} = count(),
NodeName =
- case ets:lookup(cdv_dump_index_table,"=node") of
- [{"=node",N,_Start}] ->
+ case lookup_index(?node) of
+ [{N,_Start}] ->
N;
[] ->
- case ets:lookup(cdv_dump_index_table,"=no_distribution") of
+ case lookup_index(?no_distribution) of
[_] -> "nonode@nohost";
[] -> "unknown"
end
end,
InstrInfo =
- case ets:member(cdv_dump_index_table,"=old_instr_data") of
- true ->
- old_instr_data;
- false ->
- case ets:member(cdv_dump_index_table,"=instr_data") of
- true ->
- instr_data;
- false ->
- false
- end
+ case lookup_index(?old_instr_data) of
+ [] ->
+ case lookup_index(?instr_data) of
+ [] ->
+ false;
+ _ ->
+ instr_data
+ end;
+ _ ->
+ old_instr_data
end,
GI#general_info{node_name=NodeName,
num_procs=integer_to_list(NumProcs),
num_ets=integer_to_list(NumEts),
+ num_timers=integer_to_list(NumTimers),
num_fun=integer_to_list(NumFuns),
mem_tot=MemTot,
mem_max=MemMax,
@@ -1285,8 +1403,8 @@ get_general_info(Fd,GenInfo) ->
end.
get_num_atoms(Fd) ->
- case ets:match(cdv_dump_index_table,{"=hash_table","atom_tab",'$1'}) of
- [[Pos]] ->
+ case lookup_index(?hash_table,"atom_tab") of
+ [{_,Pos}] ->
pos_bof(Fd,Pos),
skip_rest_of_line(Fd), % size
skip_rest_of_line(Fd), % used
@@ -1300,10 +1418,10 @@ get_num_atoms(Fd) ->
get_num_atoms2()
end.
get_num_atoms2() ->
- case ets:lookup(cdv_dump_index_table,"=num_atoms") of
+ case lookup_index(?num_atoms) of
[] ->
?space;
- [{"=num_atoms",NA,_Pos}] ->
+ [{NA,_Pos}] ->
%% If dump is translated this will exist
case get(truncated) of
true ->
@@ -1314,43 +1432,70 @@ get_num_atoms2() ->
end.
count() ->
- {ets:select_count(cdv_dump_index_table,count_ms("=proc")),
- ets:select_count(cdv_dump_index_table,count_ms("=ets")),
- ets:select_count(cdv_dump_index_table,count_ms("=fun"))}.
+ {count_index(?proc),count_index(?ets),count_index(?fu),count_index(?timer)}.
-count_ms(Tag) ->
- [{{Tag,'_','_'},[],[true]}].
+%%-----------------------------------------------------------------
+%% Page with all processes
+%%
+%% If there are less than ?max_sort_process_num processes in the dump,
+%% we will store the list of processes in the server state in order to
+%% allow sorting according to the different columns of the
+%% table. Since ?max_sort_process_num=:=?items_chunk_size, there will
+%% never be more than one chunk in this case.
+%%
+%% If there are more than ?max_sort_process_num processes in the dump,
+%% no sorting will be allowed, and the processes must be read (chunk
+%% by chunk) from the file each time the page is opened. This is to
+%% avoid really big data in the server state.
+procs_summary(SessionId,TW,_,State=#state{procs_summary=too_many}) ->
+ chunk_page(SessionId,State#state.file,TW,?proc,processes,
+ {no_sort,State#state.shared_heap},procs_summary_parsefun()),
+ State;
+procs_summary(SessionId,TW,SortOn,State) ->
+ ProcsSummary =
+ case State#state.procs_summary of
+ undefined -> % first time - read from file
+ Fd = open(State#state.file),
+ {PS,_}=lookup_and_parse_index_chunk(first_chunk_pointer(?proc),
+ Fd,procs_summary_parsefun()),
+ close(Fd),
+ PS;
+ PS ->
+ PS
+ end,
+ {SortedPS,NewSorted} = do_sort_procs(SortOn,ProcsSummary,State#state.sorted),
+ HtmlInfo =
+ crashdump_viewer_html:chunk_page(processes,SessionId,TW,
+ {SortOn,State#state.shared_heap},
+ SortedPS),
+ crashdump_viewer_html:chunk(SessionId,done,HtmlInfo),
+ State#state{procs_summary=ProcsSummary,sorted=NewSorted}.
-procs_summary(File) ->
- AllProcs = ets:lookup(cdv_dump_index_table,"=proc"),
- Fd = open(File),
- R = lists:map(fun({"=proc",Pid,Start}) ->
- pos_bof(Fd,Start),
- get_procinfo(Fd,fun main_procinfo/4,
- ?initial_proc_record(Pid))
- end,
- AllProcs),
- close(Fd),
- R.
+procs_summary_parsefun() ->
+ fun(Fd,Pid) ->
+ get_procinfo(Fd,fun main_procinfo/4,#proc{pid=Pid})
+ end.
+%%-----------------------------------------------------------------
+%% Page with one process
get_proc_details(File,Pid) ->
- DumpVsn = ets:lookup_element(cdv_dump_index_table,"=erl_crash_dump",2),
- case ets:match(cdv_dump_index_table,{"=proc",Pid,'$1'}) of
- [[Start]] ->
+ [{DumpVsn,_}] = lookup_index(?erl_crash_dump),
+ case lookup_index(?proc,Pid) of
+ [{_,Start}] ->
Fd = open(File),
pos_bof(Fd,Start),
Proc0 =
case DumpVsn of
"0.0" ->
%% Old version (translated)
- ?initial_proc_record(Pid);
+ #proc{pid=Pid};
_ ->
- (?initial_proc_record(Pid))#proc{
- stack_dump=if_exist("=proc_stack",Pid),
- msg_q=if_exist("=proc_messages",Pid),
- dict=if_exist("=proc_dictionary",Pid),
- debug_dict=if_exist("=debug_proc_dictionary",Pid)}
+ #proc{pid=Pid,
+ stack_dump=if_exist(?proc_stack,Pid),
+ msg_q=if_exist(?proc_messages,Pid),
+ dict=if_exist(?proc_dictionary,Pid),
+ debug_dict=if_exist(?debug_proc_dictionary,Pid)}
end,
Proc = get_procinfo(Fd,fun all_procinfo/4,Proc0),
close(Fd),
@@ -1368,11 +1513,11 @@ get_proc_details(File,Pid) ->
end.
if_exist(Tag,Key) ->
- case ets:select_count(cdv_dump_index_table,[{{Tag,Key,'_'},[],[true]}]) of
+ case count_index(Tag,Key) of
0 ->
Tag1 =
case is_proc_tag(Tag) of
- true -> "=proc";
+ true -> ?proc;
false -> Tag
end,
case truncated_here({Tag1,Key}) of
@@ -1523,13 +1668,14 @@ maybe_other_node(File,Id) ->
N
end,
Ms = ets:fun2ms(
- fun({Tag,Id,Start}) when Tag=:="=visible_node", Id=:=Channel ->
+ fun({{Tag,Start},Ch}) when Tag=:=?visible_node, Ch=:=Channel ->
{"Visible Node",Start};
- ({Tag,Id,Start}) when Tag=:="=hidden_node", Id=:=Channel ->
+ ({{Tag,Start},Ch}) when Tag=:=?hidden_node, Ch=:=Channel ->
{"Hidden Node",Start};
- ({Tag,Id,Start}) when Tag=:="=not_connected", Id=:=Channel ->
+ ({{Tag,Start},Ch}) when Tag=:=?not_connected, Ch=:=Channel ->
{"Not Connected Node",Start}
end),
+
case ets:select(cdv_dump_index_table,Ms) of
[] ->
not_found;
@@ -1540,6 +1686,7 @@ maybe_other_node(File,Id) ->
{other_node,Type,NodeInfo}
end.
+
expand_memory(File,What,Pid,Binaries) ->
Fd = open(File),
put(fd,Fd),
@@ -1548,8 +1695,8 @@ expand_memory(File,What,Pid,Binaries) ->
case What of
"StackDump" -> read_stack_dump(Fd,Pid,Dict);
"MsgQueue" -> read_messages(Fd,Pid,Dict);
- "Dictionary" -> read_dictionary(Fd,"=proc_dictionary",Pid,Dict);
- "DebugDictionary" -> read_dictionary(Fd,"=debug_proc_dictionary",Pid,Dict)
+ "Dictionary" -> read_dictionary(Fd,?proc_dictionary,Pid,Dict);
+ "DebugDictionary" -> read_dictionary(Fd,?debug_proc_dictionary,Pid,Dict)
end,
erase(fd),
close(Fd),
@@ -1559,10 +1706,10 @@ expand_memory(File,What,Pid,Binaries) ->
%%% Read binaries.
%%%
read_binaries(Fd) ->
- AllBinaries = ets:match(cdv_dump_index_table,{"=binary",'$1','$2'}),
+ AllBinaries = lookup_index(?binary),
read_binaries(Fd,AllBinaries, gb_trees:empty()).
-read_binaries(Fd,[[Addr0,Pos]|Bins],Dict0) ->
+read_binaries(Fd,[{Addr0,Pos}|Bins],Dict0) ->
pos_bof(Fd,Pos),
{Addr,_} = get_hex(Addr0),
Dict =
@@ -1603,15 +1750,15 @@ parse_binary(Addr, Line0, Dict) ->
%%%
read_stack_dump(Fd,Pid,Dict) ->
- case ets:match(cdv_dump_index_table,{"=proc_stack",Pid,'$1'}) of
- [[Start]] ->
+ case lookup_index(?proc_stack,Pid) of
+ [{_,Start}] ->
pos_bof(Fd,Start),
read_stack_dump1(Fd,Dict,[]);
[] ->
[]
end.
read_stack_dump1(Fd,Dict,Acc) ->
- %% This function is never called if the dump is truncated in "=proc_heap:Pid"
+ %% This function is never called if the dump is truncated in {?proc_heap,Pid}
case val(Fd) of
"=" ++ _next_tag ->
lists:reverse(Acc);
@@ -1631,15 +1778,15 @@ parse_top(Line0, D) ->
%%%
read_messages(Fd,Pid,Dict) ->
- case ets:match(cdv_dump_index_table,{"=proc_messages",Pid,'$1'}) of
- [[Start]] ->
+ case lookup_index(?proc_messages,Pid) of
+ [{_,Start}] ->
pos_bof(Fd,Start),
read_messages1(Fd,Dict,[]);
[] ->
[]
end.
read_messages1(Fd,Dict,Acc) ->
- %% This function is never called if the dump is truncated in "=proc_heap:Pid"
+ %% This function is never called if the dump is truncated in {?proc_heap,Pid}
case val(Fd) of
"=" ++ _next_tag ->
lists:reverse(Acc);
@@ -1659,15 +1806,15 @@ parse_message(Line0, D) ->
%%%
read_dictionary(Fd,Tag,Pid,Dict) ->
- case ets:match(cdv_dump_index_table,{Tag,Pid,'$1'}) of
- [[Start]] ->
+ case lookup_index(Tag,Pid) of
+ [{_,Start}] ->
pos_bof(Fd,Start),
read_dictionary1(Fd,Dict,[]);
[] ->
[]
end.
read_dictionary1(Fd,Dict,Acc) ->
- %% This function is never called if the dump is truncated in "=proc_heap:Pid"
+ %% This function is never called if the dump is truncated in {?proc_heap,Pid}
case val(Fd) of
"=" ++ _next_tag ->
lists:reverse(Acc);
@@ -1686,8 +1833,8 @@ parse_dictionary(Line0, D) ->
%%%
read_heap(Fd,Pid,Dict0) ->
- case ets:match(cdv_dump_index_table,{"=proc_heap",Pid,'$2'}) of
- [[Pos]] ->
+ case lookup_index(?proc_heap,Pid) of
+ [{_,Pos}] ->
pos_bof(Fd,Pos),
read_heap(Dict0);
[] ->
@@ -1695,7 +1842,7 @@ read_heap(Fd,Pid,Dict0) ->
end.
read_heap(Dict0) ->
- %% This function is never called if the dump is truncated in "=proc_heap:Pid"
+ %% This function is never called if the dump is truncated in {?proc_heap,Pid}
case get(fd) of
end_of_heap ->
Dict0;
@@ -1761,12 +1908,14 @@ do_sort_procs("name",Procs,Sorted) ->
_ -> {Result,"name"}
end.
-
+%%-----------------------------------------------------------------
+%% Page with one port
get_port(File,Port) ->
- case ets:match(cdv_dump_index_table,{"=port",Port,'$1'}) of
- [[Start]] ->
+ case lookup_index(?port,Port) of
+ [{_,Start}] ->
Fd = open(File),
- R = get_portinfo(Fd,Port,Start),
+ pos_bof(Fd,Start),
+ R = get_portinfo(Fd,#port{id=Port}),
close(Fd),
{ok,R};
[] ->
@@ -1781,18 +1930,11 @@ get_port(File,Port) ->
end
end.
-get_ports(File) ->
- Ports = ets:lookup(cdv_dump_index_table,"=port"),
- Fd = open(File),
- R = lists:map(fun({"=port",Id,Start}) -> get_portinfo(Fd,Id,Start) end,
- Ports),
- close(Fd),
- R.
-
-
-get_portinfo(Fd,Id,Start) ->
- pos_bof(Fd,Start),
- get_portinfo(Fd,#port{id=Id,_=?space}).
+%%-----------------------------------------------------------------
+%% Page with all ports
+get_ports(SessionId,File,TW) ->
+ ParseFun = fun(Fd,Id) -> get_portinfo(Fd,#port{id=Id}) end,
+ chunk_page(SessionId,File,TW,?port,ports,[],ParseFun).
get_portinfo(Fd,Port) ->
case line_head(Fd) of
@@ -1802,6 +1944,10 @@ get_portinfo(Fd,Port) ->
get_portinfo(Fd,Port#port{connected=val(Fd)});
"Links" ->
get_portinfo(Fd,Port#port{links=val(Fd)});
+ "Registered as" ->
+ get_portinfo(Fd,Port#port{name=val(Fd)});
+ "Monitors" ->
+ get_portinfo(Fd,Port#port{monitors=val(Fd)});
"Port controls linked-in driver" ->
get_portinfo(Fd,Port#port{controls=["Linked in driver: " |
val(Fd)]});
@@ -1820,30 +1966,12 @@ get_portinfo(Fd,Port) ->
Port
end.
-get_ets_tables(File,Pid,WS) ->
- EtsTables = ets:match_object(cdv_dump_index_table,{"=ets",Pid,'_'}),
- Fd = open(File),
- R = lists:map(fun({"=ets",P,Start}) ->
- get_etsinfo(Fd,P,Start,WS)
- end,
- EtsTables),
- close(Fd),
- R.
-get_internal_ets_tables(File,WS) ->
- InternalEts = ets:match_object(cdv_dump_index_table,
- {"=internal_ets",'_','_'}),
- Fd = open(File),
- R = lists:map(fun({"=internal_ets",Descr,Start}) ->
- {Descr,get_etsinfo(Fd,undefined,Start,WS)}
- end,
- InternalEts),
- close(Fd),
- R.
-
-get_etsinfo(Fd,Pid,Start,WS) ->
- pos_bof(Fd,Start),
- get_etsinfo(Fd,#ets_table{pid=Pid,type="hash",_=?space},WS).
+%%-----------------------------------------------------------------
+%% Page with external ets tables
+get_ets_tables(SessionId,File,Heading,TW,Pid,WS) ->
+ ParseFun = fun(Fd,Id) -> get_etsinfo(Fd,#ets_table{pid=Id},WS) end,
+ chunk_page(SessionId,File,TW,{?ets,Pid},ets_tables,Heading,ParseFun).
get_etsinfo(Fd,EtsTable,WS) ->
case line_head(Fd) of
@@ -1875,26 +2003,32 @@ get_etsinfo(Fd,EtsTable,WS) ->
EtsTable
end.
-get_timers(File,Pid) ->
- Timers = ets:match_object(cdv_dump_index_table,{"=timer",Pid,'$1'}),
+
+%% Internal ets table page
+get_internal_ets_tables(File,WS) ->
+ InternalEts = lookup_index(?internal_ets),
Fd = open(File),
- R = lists:map(fun({"=timer",P,Start}) ->
- get_timerinfo(Fd,P,Start)
- end,
- Timers),
+ R = lists:map(
+ fun({Descr,Start}) ->
+ pos_bof(Fd,Start),
+ {Descr,get_etsinfo(Fd,#ets_table{},WS)}
+ end,
+ InternalEts),
close(Fd),
R.
-get_timerinfo(Fd,Pid,Start) ->
- pos_bof(Fd,Start),
- get_timerinfo(Fd,#timer{pid=Pid,_=?space}).
+%%-----------------------------------------------------------------
+%% Page with list of all timers
+get_timers(SessionId,File,Heading,TW,Pid) ->
+ ParseFun = fun(Fd,Id) -> get_timerinfo_1(Fd,#timer{pid=Id}) end,
+ chunk_page(SessionId,File,TW,{?timer,Pid},timers,Heading,ParseFun).
-get_timerinfo(Fd,Timer) ->
+get_timerinfo_1(Fd,Timer) ->
case line_head(Fd) of
"Message" ->
- get_timerinfo(Fd,Timer#timer{msg=val(Fd)});
+ get_timerinfo_1(Fd,Timer#timer{msg=val(Fd)});
"Time left" ->
- get_timerinfo(Fd,Timer#timer{time=val(Fd)});
+ get_timerinfo_1(Fd,Timer#timer{time=val(Fd)});
"=" ++ _next_tag ->
Timer;
Other ->
@@ -1902,25 +2036,27 @@ get_timerinfo(Fd,Timer) ->
Timer
end.
+%%-----------------------------------------------------------------
+%% Page with information about the erlang distribution
nods(File) ->
- case ets:lookup(cdv_dump_index_table,"=no_distribution") of
+ case lookup_index(?no_distribution) of
[] ->
- V = ets:lookup(cdv_dump_index_table,"=visible_node"),
- H = ets:lookup(cdv_dump_index_table,"=hidden_node"),
- N = ets:lookup(cdv_dump_index_table,"=not_connected"),
+ V = lookup_index(?visible_node),
+ H = lookup_index(?hidden_node),
+ N = lookup_index(?not_connected),
Fd = open(File),
Visible = lists:map(
- fun({"=visible_node",Channel,Start}) ->
+ fun({Channel,Start}) ->
get_nodeinfo(Fd,Channel,Start)
end,
V),
Hidden = lists:map(
- fun({"=hidden_node",Channel,Start}) ->
+ fun({Channel,Start}) ->
get_nodeinfo(Fd,Channel,Start)
end,
H),
NotConnected = lists:map(
- fun({"=not_connected",Channel,Start}) ->
+ fun({Channel,Start}) ->
get_nodeinfo(Fd,Channel,Start)
end,
N),
@@ -1932,7 +2068,7 @@ nods(File) ->
get_nodeinfo(Fd,Channel,Start) ->
pos_bof(Fd,Start),
- get_nodeinfo(Fd,#nod{channel=Channel,_=?space}).
+ get_nodeinfo(Fd,#nod{channel=Channel}).
get_nodeinfo(Fd,Nod) ->
case line_head(Fd) of
@@ -1963,26 +2099,37 @@ get_nodeinfo(Fd,Nod) ->
Nod
end.
-loaded_mods(File) ->
- case ets:lookup(cdv_dump_index_table,"=loaded_modules") of
- [{"=loaded_modules",_,StartTotal}] ->
- Fd = open(File),
- pos_bof(Fd,StartTotal),
- {CC,OC} = get_loaded_mod_totals(Fd,{"unknown","unknown"}),
-
- Mods = ets:lookup(cdv_dump_index_table,"=mod"),
- LM = lists:map(fun({"=mod",M,Start}) ->
- pos_bof(Fd,Start),
- InitLM = #loaded_mod{mod=M,_=?space},
- get_loaded_mod_info(Fd,InitLM,
- fun main_modinfo/3)
- end,
- Mods),
- close(Fd),
- {CC,OC,LM};
- [] ->
- {"unknown","unknown",[]}
- end.
+%%-----------------------------------------------------------------
+%% Page with details about one loaded modules
+get_loaded_mod_details(File,Mod) ->
+ [{_,Start}] = lookup_index(?mod,Mod),
+ Fd = open(File),
+ pos_bof(Fd,Start),
+ InitLM = #loaded_mod{mod=Mod,old_size="No old code exists"},
+ ModInfo = get_loaded_mod_info(Fd,InitLM,fun all_modinfo/3),
+ close(Fd),
+ ModInfo.
+
+%%-----------------------------------------------------------------
+%% Page with list of all loaded modules
+loaded_mods(SessionId,File,TW) ->
+ ParseFun =
+ fun(Fd,Id) ->
+ get_loaded_mod_info(Fd,#loaded_mod{mod=Id},
+ fun main_modinfo/3)
+ end,
+ {CC,OC} =
+ case lookup_index(?loaded_modules) of
+ [{_,StartTotal}] ->
+ Fd = open(File),
+ pos_bof(Fd,StartTotal),
+ R = get_loaded_mod_totals(Fd,{"unknown","unknown"}),
+ close(Fd),
+ R;
+ [] ->
+ {"unknown","unknown"}
+ end,
+ chunk_page(SessionId,File,TW,?mod,loaded_mods,{CC,OC},ParseFun).
get_loaded_mod_totals(Fd,{CC,OC}) ->
case line_head(Fd) of
@@ -1997,16 +2144,6 @@ get_loaded_mod_totals(Fd,{CC,OC}) ->
{CC,OC} % truncated file
end.
-get_loaded_mod_details(File,Mod) ->
- [[Start]] = ets:match(cdv_dump_index_table,{"=mod",Mod,'$1'}),
- Fd = open(File),
- pos_bof(Fd,Start),
- InitLM = #loaded_mod{mod=Mod,old_size="No old code exists",
- _="No information available"},
- ModInfo = get_loaded_mod_info(Fd,InitLM,fun all_modinfo/3),
- close(Fd),
- ModInfo.
-
get_loaded_mod_info(Fd,LM,Fun) ->
case line_head(Fd) of
"Current size" ->
@@ -2073,39 +2210,26 @@ hex_to_dec("A") -> 10;
hex_to_dec(N) -> list_to_integer(N).
+%%-----------------------------------------------------------------
+%% Page with list of all funs
+funs(SessionId,File,TW) ->
+ ParseFun = fun(Fd,_Id) -> get_funinfo(Fd,#fu{}) end,
+ chunk_page(SessionId,File,TW,?fu,funs,[],ParseFun).
-funs(File) ->
- case ets:lookup(cdv_dump_index_table,"=fun") of
- [] ->
- [];
- AllFuns ->
- Fd = open(File),
- R = lists:map(fun({"=fun",_,Start}) ->
- get_funinfo(Fd,Start)
- end,
- AllFuns),
- close(Fd),
- R
- end.
-
-get_funinfo(Fd,Start) ->
- pos_bof(Fd,Start),
- get_funinfo1(Fd,#fu{_=?space}).
-
-get_funinfo1(Fd,Fu) ->
+get_funinfo(Fd,Fu) ->
case line_head(Fd) of
"Module" ->
- get_funinfo1(Fd,Fu#fu{module=val(Fd)});
+ get_funinfo(Fd,Fu#fu{module=val(Fd)});
"Uniq" ->
- get_funinfo1(Fd,Fu#fu{uniq=val(Fd)});
+ get_funinfo(Fd,Fu#fu{uniq=val(Fd)});
"Index" ->
- get_funinfo1(Fd,Fu#fu{index=val(Fd)});
+ get_funinfo(Fd,Fu#fu{index=val(Fd)});
"Address" ->
- get_funinfo1(Fd,Fu#fu{address=val(Fd)});
+ get_funinfo(Fd,Fu#fu{address=val(Fd)});
"Native_address" ->
- get_funinfo1(Fd,Fu#fu{native_address=val(Fd)});
+ get_funinfo(Fd,Fu#fu{native_address=val(Fd)});
"Refc" ->
- get_funinfo1(Fd,Fu#fu{refc=val(Fd)});
+ get_funinfo(Fd,Fu#fu{refc=val(Fd)});
"=" ++ _next_tag ->
Fu;
Other ->
@@ -2113,28 +2237,53 @@ get_funinfo1(Fd,Fu) ->
Fu
end.
-atoms(File) ->
- case ets:lookup(cdv_dump_index_table,"=atoms") of
- [{_atoms,_Id,Start}] ->
+%%-----------------------------------------------------------------
+%% Page with list of all atoms
+atoms(SessionId,File,TW,Num) ->
+ case lookup_index(?atoms) of
+ [{_Id,Start}] ->
Fd = open(File),
pos_bof(Fd,Start),
- R = case get_n_lines_of_tag(Fd,100) of
- {all,N,Lines} ->
- {n_lines,1,N,"Atoms",Lines};
- {part,100,Lines} ->
- {n_lines,1,100,"Atoms",Lines,get(pos)};
- empty ->
- []
- end,
- close(Fd),
- R;
+ case get_atoms(Fd,?items_chunk_size) of
+ {Atoms,Cont} ->
+ crashdump_viewer_html:atoms(SessionId,TW,Num,Atoms),
+ atoms_chunks(Fd,SessionId,Cont);
+ done ->
+ crashdump_viewer_html:atoms(SessionId,TW,Num,done)
+ end;
_ ->
- []
+ crashdump_viewer_html:atoms(SessionId,TW,Num,done)
+ end.
+
+get_atoms(Fd,Number) ->
+ case get_n_lines_of_tag(Fd,Number) of
+ {all,_,Lines} ->
+ close(Fd),
+ {Lines,done};
+ {part,_,Lines} ->
+ {Lines,Number};
+ empty ->
+ close(Fd),
+ done
end.
+atoms_chunks(_Fd,SessionId,done) ->
+ crashdump_viewer_html:atoms_chunk(SessionId,done);
+atoms_chunks(Fd,SessionId,Number) ->
+ case get_atoms(Fd,Number) of
+ {Atoms,Cont} ->
+ crashdump_viewer_html:atoms_chunk(SessionId,Atoms),
+ atoms_chunks(Fd,SessionId,Cont);
+ done ->
+ atoms_chunks(Fd,SessionId,done)
+ end.
+
+
+%%-----------------------------------------------------------------
+%% Page with memory information
memory(File) ->
- case ets:lookup(cdv_dump_index_table,"=memory") of
- [{"=memory",_,Start}] ->
+ case lookup_index(?memory) of
+ [{_,Start}] ->
Fd = open(File),
pos_bof(Fd,Start),
R = get_meminfo(Fd,[]),
@@ -2153,10 +2302,12 @@ get_meminfo(Fd,Acc) ->
Key ->
get_meminfo(Fd,[{Key,val(Fd)}|Acc])
end.
-
+
+%%-----------------------------------------------------------------
+%% Page with information about allocated areas
allocated_areas(File) ->
- case ets:lookup(cdv_dump_index_table,"=allocated_areas") of
- [{"=allocated_areas",_,Start}] ->
+ case lookup_index(?allocated_areas) of
+ [{_,Start}] ->
Fd = open(File),
pos_bof(Fd,Start),
R = get_allocareainfo(Fd,[]),
@@ -2183,14 +2334,16 @@ get_allocareainfo(Fd,Acc) ->
end,
get_allocareainfo(Fd,[AllocInfo|Acc])
end.
-
+
+%%-----------------------------------------------------------------
+%% Page with information about allocators
allocator_info(File) ->
- case ets:lookup(cdv_dump_index_table,"=allocator") of
+ case lookup_index(?allocator) of
[] ->
[];
AllAllocators ->
Fd = open(File),
- R = lists:map(fun({"=allocator",Heading,Start}) ->
+ R = lists:map(fun({Heading,Start}) ->
{Heading,get_allocatorinfo(Fd,Start)}
end,
AllAllocators),
@@ -2220,14 +2373,15 @@ get_all_vals([],Acc) ->
get_all_vals([Char|Rest],Acc) ->
get_all_vals(Rest,[Char|Acc]).
-
+%%-----------------------------------------------------------------
+%% Page with hash table information
hash_tables(File) ->
- case ets:lookup(cdv_dump_index_table,"=hash_table") of
+ case lookup_index(?hash_table) of
[] ->
[];
AllHashTables ->
Fd = open(File),
- R = lists:map(fun({"=hash_table",Name,Start}) ->
+ R = lists:map(fun({Name,Start}) ->
get_hashtableinfo(Fd,Name,Start)
end,
AllHashTables),
@@ -2237,7 +2391,7 @@ hash_tables(File) ->
get_hashtableinfo(Fd,Name,Start) ->
pos_bof(Fd,Start),
- get_hashtableinfo1(Fd,#hash_table{name=Name,_=?space}).
+ get_hashtableinfo1(Fd,#hash_table{name=Name}).
get_hashtableinfo1(Fd,HashTable) ->
case line_head(Fd) of
@@ -2256,13 +2410,15 @@ get_hashtableinfo1(Fd,HashTable) ->
HashTable
end.
+%%-----------------------------------------------------------------
+%% Page with index table information
index_tables(File) ->
- case ets:lookup(cdv_dump_index_table,"=index_table") of
+ case lookup_index(?index_table) of
[] ->
[];
AllIndexTables ->
Fd = open(File),
- R = lists:map(fun({"=index_table",Name,Start}) ->
+ R = lists:map(fun({Name,Start}) ->
get_indextableinfo(Fd,Name,Start)
end,
AllIndexTables),
@@ -2272,7 +2428,7 @@ index_tables(File) ->
get_indextableinfo(Fd,Name,Start) ->
pos_bof(Fd,Start),
- get_indextableinfo1(Fd,#index_table{name=Name,_=?space}).
+ get_indextableinfo1(Fd,#index_table{name=Name}).
get_indextableinfo1(Fd,IndexTable) ->
case line_head(Fd) of
@@ -2284,6 +2440,8 @@ get_indextableinfo1(Fd,IndexTable) ->
get_indextableinfo1(Fd,IndexTable#index_table{limit=val(Fd)});
"rate" ->
get_indextableinfo1(Fd,IndexTable#index_table{rate=val(Fd)});
+ "entries" ->
+ get_indextableinfo1(Fd,IndexTable#index_table{entries=val(Fd)});
"=" ++ _next_tag ->
IndexTable;
Other ->
@@ -2295,6 +2453,8 @@ get_indextableinfo1(Fd,IndexTable) ->
+%%-----------------------------------------------------------------
+%% Expand a set of data which was shown in a truncated form on
get_expanded(File,Pos,Size) ->
Fd = open(File),
R = case file:pread(Fd,Pos,Size) of
@@ -2307,20 +2467,6 @@ get_expanded(File,Pos,Size) ->
R.
-get_next(File,Pos,N0,Start,What) ->
- Fd = open(File),
- pos_bof(Fd,Pos),
- R = case get_n_lines_of_tag(Fd,N0) of
- {all,N,Lines} ->
- {n_lines,Start,N,What,Lines};
- {part,N,Lines} ->
- {n_lines,Start,N,What,Lines,get(pos)}
- end,
- close(Fd),
- R.
-
-
-
replace_all(From,To,[From|Rest],Acc) ->
replace_all(From,To,Rest,[To|Acc]);
replace_all(From,To,[Char|Rest],Acc) ->
@@ -2567,3 +2713,110 @@ get_binary(_N, [], _Acc) ->
cdvbin(Sz,Pos) ->
"#CDVBin<"++integer_to_list(Sz)++","++integer_to_list(Pos)++">".
+
+
+%%-----------------------------------------------------------------
+%% Functions for accessing the cdv_dump_index_table
+reset_index_table() ->
+ ets:delete_all_objects(cdv_dump_index_table).
+
+insert_index(Tag,Id,Pos) ->
+ ets:insert(cdv_dump_index_table,{{Tag,Pos},Id}).
+
+lookup_index(Tag) ->
+ lookup_index(Tag,'$2').
+lookup_index(Tag,Id) ->
+ ets:select(cdv_dump_index_table,[{{{Tag,'$1'},Id},[],[{{Id,'$1'}}]}]).
+
+lookup_index_chunk({'#CDVFirstChunk',Tag,Id}) ->
+ ets:select(cdv_dump_index_table,
+ [{{{Tag,'$1'},Id},[],[{{Id,'$1'}}]}],
+ ?items_chunk_size);
+lookup_index_chunk(Cont) ->
+ ets:select(Cont).
+
+%% Create a tag which can be used instead of an ets Continuation for
+%% the first call to lookup_index_chunk.
+first_chunk_pointer({Tag,Id}) ->
+ {'#CDVFirstChunk',Tag,Id};
+first_chunk_pointer(Tag) ->
+ first_chunk_pointer({Tag,'$2'}).
+
+count_index(Tag) ->
+ ets:select_count(cdv_dump_index_table,[{{{Tag,'_'},'_'},[],[true]}]).
+count_index(Tag,Id) ->
+ ets:select_count(cdv_dump_index_table,[{{{Tag,'_'},Id},[],[true]}]).
+
+
+%%-----------------------------------------------------------------
+%% Convert tags read from crashdump to atoms used as first part of key
+%% in cdv_dump_index_table
+tag_to_atom("allocated_areas") -> ?allocated_areas;
+tag_to_atom("allocator") -> ?allocator;
+tag_to_atom("atoms") -> ?atoms;
+tag_to_atom("binary") -> ?binary;
+tag_to_atom("debug_proc_dictionary") -> ?debug_proc_dictionary;
+tag_to_atom("end") -> ?ende;
+tag_to_atom("erl_crash_dump") -> ?erl_crash_dump;
+tag_to_atom("ets") -> ?ets;
+tag_to_atom("fun") -> ?fu;
+tag_to_atom("hash_table") -> ?hash_table;
+tag_to_atom("hidden_node") -> ?hidden_node;
+tag_to_atom("index_table") -> ?index_table;
+tag_to_atom("instr_data") -> ?instr_data;
+tag_to_atom("internal_ets") -> ?internal_ets;
+tag_to_atom("loaded_modules") -> ?loaded_modules;
+tag_to_atom("memory") -> ?memory;
+tag_to_atom("mod") -> ?mod;
+tag_to_atom("no_distribution") -> ?no_distribution;
+tag_to_atom("node") -> ?node;
+tag_to_atom("not_connected") -> ?not_connected;
+tag_to_atom("num_atoms") -> ?num_atoms;
+tag_to_atom("old_instr_data") -> ?old_instr_data;
+tag_to_atom("port") -> ?port;
+tag_to_atom("proc") -> ?proc;
+tag_to_atom("proc_dictionary") -> ?proc_dictionary;
+tag_to_atom("proc_heap") -> ?proc_heap;
+tag_to_atom("proc_messages") -> ?proc_messages;
+tag_to_atom("proc_stack") -> ?proc_stack;
+tag_to_atom("timer") -> ?timer;
+tag_to_atom("visible_node") -> ?visible_node;
+tag_to_atom(UnknownTag) ->
+ io:format("WARNING: Found unexpected tag:~s~n",[UnknownTag]),
+ list_to_atom(UnknownTag).
+
+%%%-----------------------------------------------------------------
+%%% Create a page by sending chunk by chunk to crashdump_viewer_html
+chunk_page(SessionId,File,TW,What,HtmlCB,HtmlExtra,ParseFun) ->
+ Fd = open(File),
+ case lookup_and_parse_index_chunk(first_chunk_pointer(What),Fd,ParseFun) of
+ done ->
+ crashdump_viewer_html:chunk_page(HtmlCB,SessionId,TW,HtmlExtra,done);
+ {Chunk,Cont} ->
+ HtmlInfo = crashdump_viewer_html:chunk_page(
+ HtmlCB,
+ SessionId,TW,HtmlExtra,Chunk),
+ chunk_page_1(Fd,HtmlInfo,SessionId,ParseFun,
+ lookup_and_parse_index_chunk(Cont,Fd,ParseFun))
+ end.
+
+chunk_page_1(_Fd,HtmlInfo,SessionId,_ParseFun,done) ->
+ crashdump_viewer_html:chunk(SessionId,done,HtmlInfo);
+chunk_page_1(Fd,HtmlInfo,SessionId,ParseFun,{Chunk,Cont}) ->
+ crashdump_viewer_html:chunk(SessionId,Chunk,HtmlInfo),
+ chunk_page_1(Fd,HtmlInfo,SessionId,ParseFun,
+ lookup_and_parse_index_chunk(Cont,Fd,ParseFun)).
+
+lookup_and_parse_index_chunk(Pointer,Fd,ParseFun) ->
+ case lookup_index_chunk(Pointer) of
+ '$end_of_table' ->
+ close(Fd),
+ done;
+ {Chunk,Cont} ->
+ R = lists:map(fun({Id,Start}) ->
+ pos_bof(Fd,Start),
+ ParseFun(Fd,Id)
+ end,
+ Chunk),
+ {R,Cont}
+ end.
diff --git a/lib/observer/src/crashdump_viewer.hrl b/lib/observer/src/crashdump_viewer.hrl
index 6ce727cd3e..466f33b63b 100644
--- a/lib/observer/src/crashdump_viewer.hrl
+++ b/lib/observer/src/crashdump_viewer.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -17,117 +17,136 @@
%% %CopyrightEnd%
%%
-define(space, "&nbsp;").
+-define(unknown, "unknown").
-record(menu_item,{index,picture,text,depth,children,state,target}).
-record(general_info,
{created,
- slogan,
- system_vsn,
- compile_time,
- taints,
- node_name,
- num_atoms,
- num_procs,
- num_ets,
- num_fun,
- mem_tot,
- mem_max,
- instr_info}).
+ slogan=?space,
+ system_vsn=?space,
+ compile_time=?space,
+ taints=?space,
+ node_name=?space,
+ num_atoms=?space,
+ num_procs=?space,
+ num_ets=?space,
+ num_timers=?space,
+ num_fun=?space,
+ mem_tot=?space,
+ mem_max=?space,
+ instr_info=?space}).
-record(proc,
+ %% Initial data according to the follwoing:
+ %%
+ %% msg_q_len, reds and stack_heap are integers because it must
+ %% be possible to sort on them. All other fields are strings
+ %%
+ %% for old dumps start_time, parent and number of heap frament
+ %% does not exist
+ %%
+ %% current_func can be both "current function" and
+ %% "last scheduled in for"
+ %%
+ %% stack_dump, message queue and dictionaries should only be
+ %% displayed as a link to "Expand" (if dump is from OTP R9B
+ %% or newer)
{pid,
- name,
- init_func,
- parent,
- start_time,
- state,
- current_func,
- msg_q_len,
- msg_q,
- last_calls,
- links,
- prog_count,
- cp,
- arity,
- dict,
- debug_dict,
- reds,
- num_heap_frag,
- heap_frag_data,
- stack_heap,
- old_heap,
- heap_unused,
- old_heap_unused,
- new_heap_start,
- new_heap_top,
- stack_top,
- stack_end,
- old_heap_start,
- old_heap_top,
- old_heap_end,
- stack_dump}).
+ name=?space,
+ init_func=?space,
+ parent=?unknown,
+ start_time=?unknown,
+ state=?space,
+ current_func={"Current Function",?space},
+ msg_q_len=0,
+ msg_q=?space,
+ last_calls=?space,
+ links=?space,
+ prog_count=?space,
+ cp=?space,
+ arity=?space,
+ dict=?space,
+ debug_dict=?space,
+ reds=0,
+ num_heap_frag=?unknown,
+ heap_frag_data=?space,
+ stack_heap=0,
+ old_heap=?space,
+ heap_unused=?space,
+ old_heap_unused=?space,
+ new_heap_start=?space,
+ new_heap_top=?space,
+ stack_top=?space,
+ stack_end=?space,
+ old_heap_start=?space,
+ old_heap_top=?space,
+ old_heap_end=?space,
+ stack_dump=?space}).
-record(port,
{id,
- slot,
- connected,
- links,
- controls}).
+ slot=?space,
+ connected=?space,
+ links=?space,
+ name=?space,
+ monitors=?space,
+ controls=?space}).
-record(ets_table,
{pid,
- slot,
- id,
- name,
- type,
- buckets,
- size,
- memory}).
+ slot=?space,
+ id=?space,
+ name=?space,
+ type="hash",
+ buckets=?space,
+ size=?space,
+ memory=?space}).
-record(timer,
{pid,
- msg,
- time}).
+ msg=?space,
+ time=?space}).
-record(fu,
- {module,
- uniq,
- index,
- address,
- native_address,
- refc}).
+ {module=?space,
+ uniq=?space,
+ index=?space,
+ address=?space,
+ native_address=?space,
+ refc=?space}).
-record(nod,
- {name,
+ {name=?space,
channel,
- controller,
- creation,
- remote_links,
- remote_mon,
- remote_mon_by,
- error}).
+ controller=?space,
+ creation=?space,
+ remote_links=?space,
+ remote_mon=?space,
+ remote_mon_by=?space,
+ error=?space}).
-record(loaded_mod,
{mod,
- current_size,
- current_attrib,
- current_comp_info,
- old_size,
- old_attrib,
- old_comp_info}).
+ current_size=?space,
+ current_attrib=?space,
+ current_comp_info=?space,
+ old_size=?space,
+ old_attrib=?space,
+ old_comp_info=?space}).
-record(hash_table,
{name,
- size,
- used,
- objs,
- depth}).
+ size=?space,
+ used=?space,
+ objs=?space,
+ depth=?space}).
-record(index_table,
{name,
- size,
- used,
- limit,
- rate}).
+ size=?space,
+ used=?space,
+ limit=?space,
+ rate=?space,
+ entries=?space}).
diff --git a/lib/observer/src/crashdump_viewer_html.erl b/lib/observer/src/crashdump_viewer_html.erl
index 5e7bbf62a0..24a80b1916 100644
--- a/lib/observer/src/crashdump_viewer_html.erl
+++ b/lib/observer/src/crashdump_viewer_html.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -32,25 +32,23 @@
general_info/1,
pretty_info_page/2,
info_page/2,
- procs_summary/4,
proc_details/4,
expanded_memory/2,
expanded_binary/1,
- next/2,
- ports/3,
- timers/3,
- ets_tables/4,
+ port/3,
+ internal_ets_tables/2,
nods/2,
- loaded_mods/2,
loaded_mod_details/2,
- funs/2,
- atoms/3,
+ atoms/4,
+ atoms_chunk/2,
memory/2,
allocated_areas/2,
allocator_info/2,
hash_tables/2,
index_tables/2,
- error/2]).
+ error/2,
+ chunk_page/5,
+ chunk/3]).
-include("crashdump_viewer.hrl").
@@ -79,23 +77,20 @@ read_file_frame() ->
read_file_frame_body() ->
- Entry =
- case webtool:is_localhost() of
- true -> [input("TYPE=file NAME=browse SIZE=40"),
- input("TYPE=hidden NAME=path")];
- false -> input("TYPE=text NAME=path SIZE=60")
- end,
+ %% Using a plain text input field instead of a file input field
+ %% (e.g. <INPUT TYPE=file NAME=pathj SIZE=40">) because most
+ %% browsers can not forward the full path from this dialog even if
+ %% the browser is running on localhost (Ref 'fakepath'-problem)
+ Entry = input("TYPE=text NAME=path SIZE=60"),
Form =
form(
- "NAME=read_file_form METHOD=post ACTION= \"./read_file\"",
+ "NAME=read_file_form METHOD=post ACTION=\"./read_file\"",
table(
"BORDER=0",
[tr(td("COLSPAN=2","Enter file to analyse")),
tr(
[td(Entry),
- td("ALIGN=center",
- input("TYPE=submit onClick=\"path.value=browse.value;\""
- "VALUE=Ok"))])])),
+ td("ALIGN=center",input("TYPE=submit VALUE=Ok"))])])),
table(
"WIDTH=100% HEIGHT=60%",
tr("VALIGN=middle",
@@ -235,6 +230,8 @@ general_info_body(Heading,GenInfo) ->
td(GenInfo#general_info.num_procs)]),
tr([th("ALIGN=left BGCOLOR=\"#8899AA\"","ETS tables"),
td(GenInfo#general_info.num_ets)]),
+ tr([th("ALIGN=left BGCOLOR=\"#8899AA\"","Timers"),
+ td(GenInfo#general_info.num_timers)]),
tr([th("ALIGN=left BGCOLOR=\"#8899AA\"","Funs"),
td(GenInfo#general_info.num_fun)])]),
case GenInfo#general_info.instr_info of
@@ -295,60 +292,6 @@ pretty_info_body(Heading,Info) ->
pre(pretty_format(Info))].
%%%-----------------------------------------------------------------
-%%% Make table with summary of process information
-procs_summary(Sorted,ProcsSummary,TW,SharedHeap) ->
- Heading = "Process Information",
- header(Heading,
- body(
- procs_summary_body(Heading,ProcsSummary,TW,Sorted,SharedHeap))).
-
-procs_summary_body(Heading,[],TW,_Sorted,_SharedHeap) ->
- [h1(Heading),
- warn(TW),
- "No processes were found\n"];
-procs_summary_body(Heading,ProcsSummary,TW,Sorted,SharedHeap) ->
- MemHeading =
- if SharedHeap ->
- "Stack";
- true ->
- "Stack+heap"
- end,
-
- [heading(Heading,"processes"),
- warn(TW),
- table(
- "BORDER=4 CELLPADDING=4",
- [tr(
- [summary_table_head("pid","Pid",Sorted),
- summary_table_head("name_func","Name/Spawned as",Sorted),
- summary_table_head("state","State",Sorted),
- summary_table_head("reds","Reductions",Sorted),
- summary_table_head("mem",MemHeading,Sorted),
- summary_table_head("msg_q_len","MsgQ Length",Sorted)]) |
- lists:map(fun(Proc) -> procs_summary_table(Proc) end,ProcsSummary)])].
-
-summary_table_head(Sorted,Text,Sorted) ->
- %% Mark the sorted column (bigger and italic)
- th(font("SIZE=\"+1\"",em(href("./sort_procs?sort="++Sorted,Text))));
-summary_table_head(SortOn,Text,_Sorted) ->
- th(href("./sort_procs?sort="++SortOn,Text)).
-
-procs_summary_table(Proc) ->
- #proc{pid=Pid,name=Name,state=State,
- reds=Reds,stack_heap=Mem0,msg_q_len=MsgQLen}=Proc,
- Mem = case Mem0 of
- -1 -> "unknown";
- _ -> integer_to_list(Mem0)
- end,
- tr(
- [td(href(["./proc_details?pid=",Pid],Pid)),
- td(Name),
- td(State),
- td("ALIGN=right",integer_to_list(Reds)),
- td("ALIGN=right",Mem),
- td("ALIGN=right",integer_to_list(MsgQLen))]).
-
-%%%-----------------------------------------------------------------
%%% Print details for one process
proc_details(Pid,Proc,TW,SharedHeap) ->
Script =
@@ -594,83 +537,33 @@ expanded_binary_body(Heading,Bin) ->
href("javascript:history.go(-1)","BACK")].
%%%-----------------------------------------------------------------
-%%% Print table of ports
-ports(Heading,Ports,TW) ->
- header(Heading,body(ports_body(Heading,Ports,TW))).
+%%% Print info for one port
+port(Heading,Port,TW) ->
+ header(Heading,body(port_body(Heading,Port,TW))).
-ports_body(Heading,[],TW) ->
- [h1(Heading),
- warn(TW),
- "No ports were found\n"];
-ports_body(Heading,Ports,TW) ->
+port_body(Heading,Port,TW) ->
[heading(Heading,"ports"),
warn(TW),
table(
"BORDER=4 CELLPADDING=4",
- [tr(
- [th("Id"),
- th("Slot"),
- th("Connected"),
- th("Links"),
- th("Controls")]) |
- lists:map(fun(Port) -> ports_table(Port) end, Ports)])].
+ [tr([th(Head) || Head <- port_table_head()]), ports_table(Port)])].
-ports_table(Port) ->
- #port{id=Id,slot=Slot,connected=Connected,links=Links,
- controls=Controls}=Port,
- tr(
- [td(Id),
- td("ALIGHT=right",Slot),
- td(href_proc_port(Connected)),
- td(href_proc_port(Links)),
- td(Controls)]).
-
%%%-----------------------------------------------------------------
-%%% Print table of ETS tables
-ets_tables(Heading,EtsTables,InternalEts,TW) ->
- header(Heading,body(ets_tables_body(Heading,EtsTables,InternalEts,TW))).
+%%% Print table of internal ETS tables
+internal_ets_tables(InternalEts,TW) ->
+ Heading = "Internal ETS tables",
+ header(Heading,body(internal_ets_tables_body(Heading,InternalEts,TW))).
-ets_tables_body(Heading,[],InternalEts,TW) ->
+internal_ets_tables_body(Heading,[],TW) ->
[h1(Heading),
warn(TW),
- "No ETS tables were found\n" |
- internal_ets_tables_table(InternalEts)];
-ets_tables_body(Heading,EtsTables,InternalEts,TW) ->
- [heading(Heading,"ets_tables"),
+ "No internal ETS tables were found\n"];
+internal_ets_tables_body(Heading,InternalEts,TW) ->
+ [heading(Heading,"internal_ets_tables"),
warn(TW),
table(
"BORDER=4 CELLPADDING=4",
[tr(
- [th("Owner"),
- th("Slot"),
- th("Id"),
- th("Name"),
- th("Type"),
- th("Buckets"),
- th("Objects"),
- th("Memory (bytes)")]) |
- lists:map(fun(EtsTable) -> ets_tables_table(EtsTable) end,
- EtsTables)]) |
- internal_ets_tables_table(InternalEts)].
-
-ets_tables_table(EtsTable) ->
- #ets_table{pid=Pid,slot=Slot,id=Id,name=Name,type=Type,
- buckets=Buckets,size=Size,memory=Memory} = EtsTable,
- tr(
- [td(href_proc_port(Pid)),
- td(Slot),
- td(Id),
- td(Name),
- td(Type),
- td("ALIGN=right",Buckets),
- td("ALIGN=right",Size),
- td("ALIGN=right",Memory)]).
-
-internal_ets_tables_table(InternalEtsTables) ->
- [h2("Internal ETS tables"),
- table(
- "BORDER=4 CELLPADDING=4",
- [tr(
[th("Description"),
th("Id"),
th("Name"),
@@ -681,7 +574,7 @@ internal_ets_tables_table(InternalEtsTables) ->
lists:map(fun(InternalEtsTable) ->
internal_ets_tables_table1(InternalEtsTable)
end,
- InternalEtsTables)])].
+ InternalEts)])].
internal_ets_tables_table1({Descr,InternalEtsTable}) ->
#ets_table{id=Id,name=Name,type=Type,buckets=Buckets,
@@ -696,33 +589,6 @@ internal_ets_tables_table1({Descr,InternalEtsTable}) ->
td("ALIGN=right",Memory)]).
%%%-----------------------------------------------------------------
-%%% Print table of timers
-timers(Heading,Timers,TW) ->
- header(Heading,body(timers_body(Heading,Timers,TW))).
-
-timers_body(Heading,[],TW) ->
- [h1(Heading),
- warn(TW),
- "No timers were found\n"];
-timers_body(Heading,Timers,TW) ->
- [heading(Heading,"timers"),
- warn(TW),
- table(
- "BORDER=4 CELLPADDING=4",
- [tr(
- [th("Owner"),
- th("Message"),
- th("Time left")]) |
- lists:map(fun(Timer) -> timers_table(Timer) end, Timers)])].
-
-timers_table(Timer) ->
- #timer{pid=Pid,msg=Msg,time=Time}=Timer,
- tr(
- [td(href_proc_port(Pid)),
- td(Msg),
- td("ALIGN=right",Time)]).
-
-%%%-----------------------------------------------------------------
%%% Print table of nodes in distribution
nods(Nods,TW) ->
header("Distribution Information",body(nodes_body(Nods,TW))).
@@ -826,33 +692,6 @@ format_extra_info(Error) ->
?space -> "";
_ -> font("COLOR=\"#FF0000\"",["ERROR: ",Error,"\n"])
end.
-%%%-----------------------------------------------------------------
-%%% Print loaded modules information
-loaded_mods({CC,OC,LM},TW) ->
- Heading = "Loaded Modules Information",
- header(Heading,body(loaded_mods_body(Heading,CC,OC,LM,TW))).
-
-loaded_mods_body(Heading,"unknown","unknown",[],TW) ->
- [h1(Heading),
- warn(TW),
- "No loaded modules information was found\n"];
-loaded_mods_body(Heading,CC,OC,LM,TW) ->
- [heading(Heading,"loaded_modules"),
- warn(TW),
- p([b("Current code: "),CC," bytes",br(),
- b("Old code: "),OC," bytes"]),
- table(
- "BORDER=4 CELLPADDING=4",
- [tr([th("Module"),
- th("Current size (bytes)"),
- th("Old size (bytes)")]) |
- lists:map(fun(Mod) -> loaded_mods_table(Mod) end,LM)])].
-
-loaded_mods_table(#loaded_mod{mod=Mod,current_size=CS,old_size=OS}) ->
- tr([td(href(["loaded_mod_details?mod=",Mod],Mod)),
- td("ALIGN=right",CS),
- td("ALIGN=right",OS)]).
-
%%%-----------------------------------------------------------------
%%% Print detailed information about one module
@@ -882,107 +721,33 @@ loaded_mod_details_body(ModInfo,TW) ->
%%%-----------------------------------------------------------------
-%%% Print table of funs
-funs(Funs,TW) ->
- Heading = "Fun Information",
- header(Heading,body(funs_body(Heading,Funs,TW))).
-
-funs_body(Heading,[],TW) ->
- [h1(Heading),
- warn(TW),
- "No Fun information was found\n"];
-funs_body(Heading,Funs,TW) ->
- [heading(Heading,"funs"),
- warn(TW),
- table(
- "BORDER=4 CELLPADDING=4",
- [tr(
- [th("Module"),
- th("Uniq"),
- th("Index"),
- th("Address"),
- th("Native_address"),
- th("Refc")]) |
- lists:map(fun(Fun) -> funs_table(Fun) end, Funs)])].
-
-funs_table(Fu) ->
- #fu{module=Module,uniq=Uniq,index=Index,address=Address,
- native_address=NativeAddress,refc=Refc}=Fu,
- tr(
- [td(Module),
- td("ALIGN=right",Uniq),
- td("ALIGN=right",Index),
- td(Address),
- td(NativeAddress),
- td("ALIGN=right",Refc)]).
-
-%%%-----------------------------------------------------------------
%%% Print atoms
-atoms(Atoms,Num,TW) ->
+atoms(SessionId,TW,Num,FirstChunk) ->
Heading = "Atoms",
- header(Heading,body(atoms_body(Heading,Atoms,Num,TW))).
-
-atoms_body(Heading,[],Num,TW) ->
- [h1(Heading),
- warn(TW),
- "No atoms were found in log",br(),
- "Total number of atoms in node was ", Num, br()];
-atoms_body(Heading,Atoms,Num,TW) ->
- [heading(Heading,"atoms"),
- warn(TW),
- "Total number of atoms in node was ", Num,
- br(),
- "The last created atom is shown first",
- br(),br() |
- n_first(Atoms)].
-
-n_first({n_lines,Start,N,What,Lines,Pos}) ->
- NextHref = next_href(N,What,Pos,Start),
- [What," number ",integer_to_list(Start),"-",integer_to_list(Start+N-1),
- br(),
- NextHref,
- pre(Lines),
- NextHref];
-n_first({n_lines,_Start,_N,_What,Lines}) ->
- [pre(Lines)].
-
-%%%-----------------------------------------------------------------
-%%% Print next N lines of "something"
-next(NLines,TW) ->
- header(element(4,NLines),body(next_body(NLines,TW))).
-
-next_body({n_lines,Start,N,What,Lines,Pos},TW) ->
- PrefHref = prev_href(),
- NextHref = next_href(N,What,Pos,Start),
- [warn(TW),
- What," number ",integer_to_list(Start),"-",integer_to_list(Start+N-1),
- br(),
- PrefHref,
- ?space,
- NextHref,
- pre(Lines),
- PrefHref,
- ?space,
- NextHref];
-next_body({n_lines,Start,N,What,Lines},TW) ->
- PrefHref = prev_href(),
- [warn(TW),
- What," number ",integer_to_list(Start),"-",integer_to_list(Start+N-1),
- br(),
- PrefHref,
- pre(Lines),
- PrefHref].
-
-
-prev_href() ->
- href("javascript:history.back()",["Previous"]).
-
-next_href(N,What,Pos,Start) ->
- href(["./next?pos=",integer_to_list(Pos),
- "&num=",integer_to_list(N),
- "&start=",integer_to_list(Start+N),
- "&what=",What],
- "Next").
+ case FirstChunk of
+ done ->
+ deliver_first(SessionId,[start_html_page(Heading),
+ h1(Heading),
+ warn(TW),
+ "No atoms were found in log",br(),
+ "Total number of atoms in node was ", Num,
+ br()]);
+ _ ->
+ deliver_first(SessionId,[start_html_page(Heading),
+ heading(Heading,"atoms"),
+ warn(TW),
+ "Total number of atoms in node was ", Num,
+ br(),
+ "The last created atom is shown first",
+ br(),
+ start_pre()]),
+ atoms_chunk(SessionId,FirstChunk)
+ end.
+
+atoms_chunk(SessionId,done) ->
+ deliver(SessionId,[stop_pre(),stop_html_page()]);
+atoms_chunk(SessionId,Atoms) ->
+ deliver(SessionId,Atoms).
%%%-----------------------------------------------------------------
%%% Print memory information
@@ -1120,52 +885,92 @@ index_tables_body(Heading,IndexTables,TW) ->
th("Size"),
th("Limit"),
th("Used"),
- th("Rate")]) |
+ th("Rate"),
+ th("Entries")]) |
lists:map(fun(IndexTable) -> index_tables_table(IndexTable) end,
IndexTables)])].
index_tables_table(IndexTable) ->
- #index_table{name=Name,size=Size,limit=Limit,used=Used,rate=Rate} =
- IndexTable,
+ #index_table{name=Name,size=Size,limit=Limit,used=Used,
+ rate=Rate,entries=Entries} = IndexTable,
tr(
[td(Name),
td("ALIGN=right",Size),
td("ALIGN=right",Limit),
td("ALIGN=right",Used),
- td("ALIGN=right",Rate)]).
+ td("ALIGN=right",Rate),
+ td("ALIGN=right",Entries)]).
%%%-----------------------------------------------------------------
%%% Internal library
+start_html_page(Title) ->
+ [only_http_header(),
+ start_html(),
+ only_html_header(Title),
+ start_html_body()].
+
+stop_html_page() ->
+ [stop_html_body(),
+ stop_html()].
+
+only_http_header() ->
+ ["Pragma:no-cache\r\n",
+ "Content-type: text/html\r\n\r\n"].
+
+only_html_header(Title) ->
+ only_html_header(Title,"").
+only_html_header(Title,JavaScript) ->
+ ["<HEAD>\n",
+ "<TITLE>", Title, "</TITLE>\n",
+ JavaScript,
+ "</HEAD>\n"].
+
+start_html() ->
+ "<HTML>\n".
+stop_html() ->
+ "</HTML>".
+start_html_body() ->
+ "<BODY BGCOLOR=\"#FFFFFF\">\n".
+stop_html_body() ->
+ "</BODY>\n".
+
header(Body) ->
header("","",Body).
header(Title,Body) ->
header(Title,"",Body).
header(Title,JavaScript,Body) ->
- ["Pragma:no-cache\r\n",
- "Content-type: text/html\r\n\r\n",
+ [only_http_header(),
html_header(Title,JavaScript,Body)].
html_header(Title,JavaScript,Body) ->
- ["<HTML>\n",
- "<HEAD>\n",
- "<TITLE>", Title, "</TITLE>\n",
- JavaScript,
- "</HEAD>\n",
+ [start_html(),
+ only_html_header(Title,JavaScript),
Body,
- "</HTML>"].
+ stop_html()].
body(Text) ->
- ["<BODY BGCOLOR=\"#FFFFFF\">\n",
+ [start_html_body(),
Text,
- "<\BODY>\n"].
+ stop_html_body()].
frameset(Args,Frames) ->
["<FRAMESET ",Args,">\n", Frames, "\n</FRAMESET>\n"].
frame(Args) ->
["<FRAME ",Args, ">\n"].
+start_visible_table() ->
+ start_table("BORDER=\"4\" CELLPADDING=\"4\"").
+start_visible_table(ColTitles) ->
+ [start_visible_table(),
+ tr([th(ColTitle) || ColTitle <- ColTitles])].
+
+start_table(Args) ->
+ ["<TABLE ", Args, ">\n"].
+stop_table() ->
+ "</TABLE>\n".
+
table(Args,Text) ->
- ["<TABLE ", Args, ">\n", Text, "\n</TABLE>\n"].
+ [start_table(Args), Text, stop_table()].
tr(Text) ->
["<TR>\n", Text, "\n</TR>\n"].
tr(Args,Text) ->
@@ -1183,8 +988,12 @@ b(Text) ->
["<B>",Text,"</B>"].
em(Text) ->
["<EM>",Text,"</EM>\n"].
+start_pre() ->
+ "<PRE>".
+stop_pre() ->
+ "</PRE>".
pre(Text) ->
- ["<PRE>",Text,"</PRE>"].
+ [start_pre(),Text,stop_pre()].
href(Link,Text) ->
["<A HREF=\"",Link,"\">",Text,"</A>"].
href(Args,Link,Text) ->
@@ -1199,8 +1008,6 @@ input(Args) ->
["<INPUT ", Args, ">\n"].
h1(Text) ->
["<H1>",Text,"</H1>\n"].
-h2(Text) ->
- ["<H2>",Text,"</H2>\n"].
font(Args,Text) ->
["<FONT ",Args,">\n",Text,"\n</FONT>\n"].
p(Text) ->
@@ -1223,7 +1030,7 @@ href_proc_port([$#,$F,$u,$n,$<|T],Acc) ->
href_proc_port([$#,$P,$o,$r,$t,$<|T],Acc) ->
{[$#|Port]=HashPort,Rest} = to_gt(T,[$;,$t,$l,$&,$t,$r,$o,$P,$#]),
href_proc_port(Rest,[href("TARGET=\"main\"",
- ["./ports?port=",Port],HashPort)|Acc]);
+ ["./port?port=",Port],HashPort)|Acc]);
href_proc_port([$<,$<|T],Acc) ->
%% No links to binaries
href_proc_port(T,[$;,$t,$l,$&,$;,$t,$l,$&|Acc]);
@@ -1243,7 +1050,7 @@ href_proc_port([$",$#,$C,$D,$V,$P,$o,$r,$t,$<|T],Acc) ->
%% Port written by crashdump_viewer:parse_term(...)
{[$#|Port]=HashPort,[$"|Rest]} = to_gt(T,[$;,$t,$l,$&,$t,$r,$o,$P,$#]),
href_proc_port(Rest,[href("TARGET=\"main\"",
- ["./ports?port=",Port],HashPort)|Acc]);
+ ["./port?port=",Port],HashPort)|Acc]);
href_proc_port([$",$#,$C,$D,$V,$P,$i,$d,$<|T],Acc) ->
%% Pid written by crashdump_viewer:parse_term(...)
{Pid,[$"|Rest]} = to_gt(T,[$;,$t,$l,$&]),
@@ -1422,7 +1229,7 @@ replace_insrt("'trsni$'"++Rest,[H|T],Acc) -> % the list is reversed here!
"&lt;" ++ _Pid ->
href("TARGET=\"main\"",["./proc_details?pid=",H],H);
"#Port&lt;" ++ Port ->
- href("TARGET=\"main\"",["./ports?port=","Port&lt;"++Port],H);
+ href("TARGET=\"main\"",["./port?port=","Port&lt;"++Port],H);
"#" ++ _other ->
H
end,
@@ -1431,3 +1238,173 @@ replace_insrt([H|T],Insrt,Acc) ->
replace_insrt(T,Insrt,[H|Acc]);
replace_insrt([],[],Acc) ->
Acc.
+
+%%%-----------------------------------------------------------------
+%%% Create a page with one table by delivering chunk by chunk to
+%%% inets. crashdump_viewer first calls chunk_page/5 once, then
+%%% chunk/3 multiple times until all data is delivered.
+chunk_page(processes,SessionId,TW,{Sorted,SharedHeap},FirstChunk) ->
+ Columns = procs_summary_table_head(Sorted,SharedHeap),
+ chunk_page(SessionId, "Process Information", TW, FirstChunk,
+ "processes", Columns, fun procs_summary_table/1);
+chunk_page(ports,SessionId,TW,_,FirstChunk) ->
+ chunk_page(SessionId, "Port Information", TW, FirstChunk,
+ "ports", port_table_head(), fun ports_table/1);
+chunk_page(ets_tables,SessionId,TW,Heading,FirstChunk) ->
+ Columns = ["Owner",
+ "Slot",
+ "Id",
+ "Name",
+ "Type",
+ "Buckets",
+ "Objects",
+ "Memory (bytes)"],
+ chunk_page(SessionId, Heading, TW, FirstChunk,
+ "ets_tables", Columns, fun ets_tables_table/1);
+chunk_page(timers,SessionId,TW,Heading,FirstChunk) ->
+ chunk_page(SessionId, Heading, TW, FirstChunk, "timers",
+ ["Owner","Message","Time left"], fun timers_table/1);
+chunk_page(loaded_mods,SessionId,TW,{CC,OC},FirstChunk) ->
+ TotalsInfo = p([b("Current code: "),CC," bytes",br(),
+ b("Old code: "),OC," bytes"]),
+ Columns = ["Module","Current size (bytes)","Old size (bytes)"],
+ chunk_page(SessionId, "Loaded Modules Information", TW, FirstChunk,
+ "loaded_modules", TotalsInfo,Columns, fun loaded_mods_table/1);
+chunk_page(funs,SessionId, TW, _, FirstChunk) ->
+ Columns = ["Module",
+ "Uniq",
+ "Index",
+ "Address",
+ "Native_address",
+ "Refc"],
+ chunk_page(SessionId, "Fun Information", TW, FirstChunk,
+ "funs", Columns, fun funs_table/1).
+
+chunk_page(SessionId,Heading,TW,FirstChunk,Type,TableColumns,TableFun) ->
+ chunk_page(SessionId,Heading,TW,FirstChunk,Type,[],TableColumns,TableFun).
+chunk_page(SessionId,Heading,TW,done,Type,_TotalsInfo,_TableColumns,_TableFun) ->
+ no_info_found(SessionId,Heading,TW,Type);
+chunk_page(SessionId,Heading,TW,FirstChunk,Type,TotalsInfo,TableColumns,TableFun) ->
+ deliver_first(SessionId,[start_html_page(Heading),
+ heading(Heading,Type),
+ warn(TW),
+ TotalsInfo,
+ start_visible_table(TableColumns)]),
+ chunk(SessionId,FirstChunk,TableFun),
+ TableFun.
+
+no_info_found(SessionId, Heading, TW, Type) ->
+ Info = ["No ", Type, " were found\n"],
+ deliver_first(SessionId,[start_html_page(Heading),
+ h1(Heading),
+ warn(TW),
+ Info,
+ stop_html_page()]).
+
+chunk(SessionId, done, _TableFun) ->
+ deliver(SessionId,[stop_table(),stop_html_page()]);
+chunk(SessionId, Items, TableFun) ->
+ deliver(SessionId, [lists:map(TableFun, Items),
+ stop_table(), %! Will produce an empty table at the end
+ start_visible_table()]). % of the page :(
+
+%%%-----------------------------------------------------------------
+%%% Deliver part of a page to inets
+%%% The first part, which includes the HTTP header, must always be
+%%% delivered as a string (i.e. no binaries). The rest of the page is
+%%% better delivered as binaries in order to avoid data copying.
+deliver_first(SessionId,String) ->
+ mod_esi:deliver(SessionId,String).
+deliver(SessionId,IoList) ->
+ mod_esi:deliver(SessionId,[list_to_binary(IoList)]).
+
+
+%%%-----------------------------------------------------------------
+%%% Page specific stuff for chunk pages
+procs_summary_table_head(Sorted,SharedHeap) ->
+ MemHeading =
+ if SharedHeap ->
+ "Stack";
+ true ->
+ "Stack+heap"
+ end,
+ [procs_summary_table_head("pid","Pid",Sorted),
+ procs_summary_table_head("name_func","Name/Spawned as",Sorted),
+ procs_summary_table_head("state","State",Sorted),
+ procs_summary_table_head("reds","Reductions",Sorted),
+ procs_summary_table_head("mem",MemHeading,Sorted),
+ procs_summary_table_head("msg_q_len","MsgQ Length",Sorted)].
+
+procs_summary_table_head(_,Text,no_sort) ->
+ Text;
+procs_summary_table_head(Sorted,Text,Sorted) ->
+ %% Mark the sorted column (bigger and italic)
+ font("SIZE=\"+1\"",em(href("./sort_procs?sort="++Sorted,Text)));
+procs_summary_table_head(SortOn,Text,_Sorted) ->
+ href("./sort_procs?sort="++SortOn,Text).
+
+procs_summary_table(Proc) ->
+ #proc{pid=Pid,name=Name,state=State,
+ reds=Reds,stack_heap=Mem0,msg_q_len=MsgQLen}=Proc,
+ Mem = case Mem0 of
+ -1 -> "unknown";
+ _ -> integer_to_list(Mem0)
+ end,
+ tr(
+ [td(href(["./proc_details?pid=",Pid],Pid)),
+ td(Name),
+ td(State),
+ td("ALIGN=right",integer_to_list(Reds)),
+ td("ALIGN=right",Mem),
+ td("ALIGN=right",integer_to_list(MsgQLen))]).
+
+port_table_head() ->
+ ["Id","Slot","Connected","Links","Name","Monitors","Controls"].
+
+ports_table(Port) ->
+ #port{id=Id,slot=Slot,connected=Connected,links=Links,name=Name,
+ monitors=Monitors,controls=Controls}=Port,
+ tr(
+ [td(Id),
+ td("ALIGN=right",Slot),
+ td(href_proc_port(Connected)),
+ td(href_proc_port(Links)),
+ td(Name),
+ td(href_proc_port(Monitors)),
+ td(Controls)]).
+
+ets_tables_table(EtsTable) ->
+ #ets_table{pid=Pid,slot=Slot,id=Id,name=Name,type=Type,
+ buckets=Buckets,size=Size,memory=Memory} = EtsTable,
+ tr(
+ [td(href_proc_port(Pid)),
+ td(Slot),
+ td(Id),
+ td(Name),
+ td(Type),
+ td("ALIGN=right",Buckets),
+ td("ALIGN=right",Size),
+ td("ALIGN=right",Memory)]).
+
+timers_table(Timer) ->
+ #timer{pid=Pid,msg=Msg,time=Time}=Timer,
+ tr(
+ [td(href_proc_port(Pid)),
+ td(Msg),
+ td("ALIGN=right",Time)]).
+
+loaded_mods_table(#loaded_mod{mod=Mod,current_size=CS,old_size=OS}) ->
+ tr([td(href(["loaded_mod_details?mod=",Mod],Mod)),
+ td("ALIGN=right",CS),
+ td("ALIGN=right",OS)]).
+
+funs_table(Fu) ->
+ #fu{module=Module,uniq=Uniq,index=Index,address=Address,
+ native_address=NativeAddress,refc=Refc}=Fu,
+ tr(
+ [td(Module),
+ td("ALIGN=right",Uniq),
+ td("ALIGN=right",Index),
+ td(Address),
+ td(NativeAddress),
+ td("ALIGN=right",Refc)]).
diff --git a/lib/observer/test/Makefile b/lib/observer/test/Makefile
index 6f1430b00a..6073e6ea00 100644
--- a/lib/observer/test/Makefile
+++ b/lib/observer/test/Makefile
@@ -53,7 +53,7 @@ EBIN = .
make_emakefile:
$(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) \
- $(MODULES) >> $(EMAKEFILE)
+ $(MODULES) > $(EMAKEFILE)
tests debug opt: make_emakefile
cd $(ERL_TOP)/lib/test_server/src && \
@@ -80,7 +80,7 @@ release_spec: opt
release_tests_spec: make_emakefile
$(INSTALL_DIR) $(RELSYSDIR)
- $(INSTALL_DATA) observer.spec observer.dynspec $(EMAKEFILE) \
+ $(INSTALL_DATA) observer.spec $(EMAKEFILE) \
$(COVERFILE) $(ERL_FILES) \
$(RELSYSDIR)
@tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
diff --git a/lib/observer/test/crashdump_helper.erl b/lib/observer/test/crashdump_helper.erl
index 43b3db738f..6e9d4727ec 100644
--- a/lib/observer/test/crashdump_helper.erl
+++ b/lib/observer/test/crashdump_helper.erl
@@ -19,7 +19,7 @@
-module(crashdump_helper).
-export([n1_proc/2,remote_proc/2]).
--compile(r11).
+-compile(r12).
-include("test_server.hrl").
n1_proc(N2,Creator) ->
diff --git a/lib/observer/test/crashdump_viewer_SUITE.erl b/lib/observer/test/crashdump_viewer_SUITE.erl
index fcf383dc2e..fdc4a2f1ff 100644
--- a/lib/observer/test/crashdump_viewer_SUITE.erl
+++ b/lib/observer/test/crashdump_viewer_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -20,12 +20,13 @@
-module(crashdump_viewer_SUITE).
%% Test functions
--export([all/1,translate/1,start/1,fini/1,load_file/1,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ translate/1,start/1,fini/1,load_file/1,
non_existing/1,not_a_crashdump/1,old_crashdump/1]).
-export([init_per_suite/1, end_per_suite/1]).
-export([init_per_testcase/2, end_per_testcase/2]).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include("test_server_line.hrl").
-include_lib("kernel/include/file.hrl").
@@ -46,16 +47,28 @@ end_per_testcase(_Case, Config) ->
?t:timetrap_cancel(Dog),
ok.
-all(suite) ->
- [translate,{conf,start,[load_file,non_existing,not_a_crashdump,
- old_crashdump],fini}].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [translate, load_file, non_existing, not_a_crashdump,
+ old_crashdump].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_suite(doc) ->
["Create a lot of crashdumps which can be used in the testcases below"];
init_per_suite(Config) when is_list(Config) ->
Dog = ?t:timetrap(?default_timeout),
application:start(inets), % will be using the http client later
- http:set_options([{ipv6,disabled}]),
+ httpc:set_options([{ipfamily,inet6fb4}]),
DataDir = ?config(data_dir,Config),
Rels = [R || R <- [r12b,r13b], ?t:is_release_available(R)] ++ [current],
io:format("Creating crash dumps for the following releases: ~p", [Rels]),
@@ -99,7 +112,7 @@ start(Config) when is_list(Config) ->
undefined = whereis(crashdump_viewer_server),
undefined = whereis(web_tool),
Url = cdv_url(Port,"start_page"),
- {error,_} = http:request(get,{Url,[]},[],[]),
+ {error,_} = httpc:request(Url),
% exit(whereis(httpc_manager),kill),
?t:timetrap_cancel(AngryDog),
ok.
@@ -233,7 +246,7 @@ cdv_url(Port,Link) ->
"http://localhost:" ++ Port ++ "/cdv_erl/crashdump_viewer/" ++ Link.
request_sync(Method,HTTPReqCont) ->
- case http:request(Method,
+ case httpc:request(Method,
HTTPReqCont,
[{timeout,30000}],
[{full_result, false}]) of
@@ -241,13 +254,13 @@ request_sync(Method,HTTPReqCont) ->
Html;
{ok,{Code,Html}} ->
io:format("~s\n", [Html]),
- io:format("Received ~w from http:request(...) with\nMethod=~w\n"
+ io:format("Received ~w from httpc:request(...) with\nMethod=~w\n"
"HTTPReqCont=~p\n",
[Code,Method,HTTPReqCont]),
?t:fail();
Other ->
io:format(
- "Received ~w from http:request(...) with\nMethod=~w\n"
+ "Received ~w from httpc:request(...) with\nMethod=~w\n"
"HTTPReqCont=~p\n",
[Other,Method,HTTPReqCont]),
?t:fail()
@@ -401,16 +414,17 @@ special(Port,File) ->
_ ->
ok
end;
- ".250atoms" ->
- Html1 = contents(Port,"atoms"),
- NextLink1 = next_link(Html1),
- "Atoms" = title(Html1),
- Html2 = contents(Port,NextLink1),
- NextLink2 = next_link(Html2),
- "Atoms" = title(Html2),
- Html3 = contents(Port,NextLink2),
- "" = next_link(Html3),
- "Atoms" = title(Html3);
+ %%! No longer needed - all atoms are shown on one page!!
+ %% ".250atoms" ->
+ %% Html1 = contents(Port,"atoms"),
+ %% NextLink1 = next_link(Html1),
+ %% "Atoms" = title(Html1),
+ %% Html2 = contents(Port,NextLink1),
+ %% NextLink2 = next_link(Html2),
+ %% "Atoms" = title(Html2),
+ %% Html3 = contents(Port,NextLink2),
+ %% "" = next_link(Html3),
+ %% "Atoms" = title(Html3);
_ ->
ok
end,
@@ -483,27 +497,27 @@ expand_binary_link(Html) ->
end.
-next_link(Html) ->
- case Html of
- "<A HREF=\"./next?pos=" ++ Rest ->
- "next?pos=" ++ string:sub_word(Rest,1,$");
- [_H|T] ->
- next_link(T);
- [] ->
- []
- end.
+%% next_link(Html) ->
+%% case Html of
+%% "<A HREF=\"./next?pos=" ++ Rest ->
+%% "next?pos=" ++ string:sub_word(Rest,1,$");
+%% [_H|T] ->
+%% next_link(T);
+%% [] ->
+%% []
+%% end.
toggle_menu(Port) ->
- Html = contents(Port,"toggle?index=10"),
+ Html = contents(Port,"toggle?index=4"),
check_toggle(Html).
check_toggle(Html) ->
case Html of
- "<A HREF=\"./toggle?index=10\"><IMG SRC=\"/crashdump_viewer/collapsd.gif\"" ++ _ ->
+ "<A HREF=\"./toggle?index=4\"><IMG SRC=\"/crashdump_viewer/collapsd.gif\"" ++ _ ->
collapsed;
- "<A HREF=\"./toggle?index=10\"><IMG SRC=\"/crashdump_viewer/exploded.gif\"" ++ _ ->
+ "<A HREF=\"./toggle?index=4\"><IMG SRC=\"/crashdump_viewer/exploded.gif\"" ++ _ ->
exploded;
[_H|T] ->
check_toggle(T)
@@ -530,10 +544,10 @@ expand_link(Html) ->
port_details(Port) ->
- Port1 = contents(Port,"ports?port=Port<0.1>"),
+ Port1 = contents(Port,"port?port=Port<0.1>"),
"#Port<0.1>" = title(Port1),
- Port0 = contents(Port,"ports?port=Port<0.0>"),
+ Port0 = contents(Port,"port?port=Port<0.0>"),
"Could not find port: #Port<0.0>" = title(Port0).
is_truncated(File) ->
@@ -655,7 +669,7 @@ rename(From,To) ->
end.
check_complete(File) ->
- check_complete1(File,5).
+ check_complete1(File,10).
check_complete1(_File,0) ->
{error,enoent};
diff --git a/lib/observer/test/etop_SUITE.erl b/lib/observer/test/etop_SUITE.erl
index 54f4a78e69..a0782ea809 100644
--- a/lib/observer/test/etop_SUITE.erl
+++ b/lib/observer/test/etop_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
@@ -20,22 +20,42 @@
-module(etop_SUITE).
%% Test functions
--export([all/1,text/1,text_tracing_off/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,text/1,text_tracing_off/1]).
+-export([init_per_testcase/2, end_per_testcase/2]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(default_timeout, ?t:minutes(1)).
init_per_testcase(_Case, Config) ->
?line Dog=test_server:timetrap(?default_timeout),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-all(suite) -> [text,text_tracing_off].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [text, text_tracing_off].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
text(suite) ->
[];
diff --git a/lib/observer/test/observer.cover b/lib/observer/test/observer.cover
index 47770ba839..fafb718840 100644
--- a/lib/observer/test/observer.cover
+++ b/lib/observer/test/observer.cover
@@ -1,2 +1,4 @@
-{exclude,[multitrace]}.
-{include,[observer_backend]}.
+{incl_app,observer,details}.
+
+{excl_mods,observer,[multitrace]}.
+{incl_mods,observer,[observer_backend]}.
diff --git a/lib/observer/test/observer.spec b/lib/observer/test/observer.spec
index 801eb80607..3b4b5da28c 100644
--- a/lib/observer/test/observer.spec
+++ b/lib/observer/test/observer.spec
@@ -1,2 +1 @@
-{topcase, {dir, "../observer_test"}}.
-
+{suites,"../observer_test",all}.
diff --git a/lib/observer/test/observer_SUITE.erl b/lib/observer/test/observer_SUITE.erl
index 3e9522c7a4..8dea0d8ea8 100644
--- a/lib/observer/test/observer_SUITE.erl
+++ b/lib/observer/test/observer_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -18,10 +18,11 @@
%%
-module(observer_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% Test server specific exports
--export([all/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([init_per_testcase/2, end_per_testcase/2]).
%% Test cases
@@ -39,9 +40,27 @@ end_per_testcase(_Case, Config) ->
?t:timetrap_cancel(Dog),
ok.
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[app_file].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
app_file(suite) ->
[];
app_file(doc) ->
diff --git a/lib/observer/test/ttb_SUITE.erl b/lib/observer/test/ttb_SUITE.erl
index 6da5e36b29..24b4a22aa9 100644
--- a/lib/observer/test/ttb_SUITE.erl
+++ b/lib/observer/test/ttb_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
@@ -21,14 +21,16 @@
-compile(export_all).
%% Test functions
--export([all/1,file/1,file_no_pi/1,file_fetch/1,wrap/1,wrap_merge/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ file/1,file_no_pi/1,file_fetch/1,wrap/1,wrap_merge/1,
wrap_merge_fetch_format/1,write_config1/1,write_config2/1,
write_config3/1,history/1,write_trace_info/1,seq_trace/1,
diskless/1,otp_4967_1/1,otp_4967_2/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
-export([foo/0]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(default_timeout, ?t:minutes(1)).
@@ -36,15 +38,34 @@ init_per_testcase(_Case, Config) ->
ttb:stop(),
?line Dog=test_server:timetrap(?default_timeout),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-all(suite) -> [file,file_no_pi,file_fetch,wrap,wrap_merge,
- wrap_merge_fetch_format,write_config1,write_config2,
- write_config3,history,write_trace_info,seq_trace,diskless,
- otp_4967_1,otp_4967_2].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [file, file_no_pi, file_fetch, wrap, wrap_merge,
+ wrap_merge_fetch_format, write_config1, write_config2,
+ write_config3, history, write_trace_info, seq_trace,
+ diskless, otp_4967_1, otp_4967_2].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
file(suite) ->
[];
diff --git a/lib/observer/vsn.mk b/lib/observer/vsn.mk
index 1b72d30eab..14c8f54ba3 100644
--- a/lib/observer/vsn.mk
+++ b/lib/observer/vsn.mk
@@ -1 +1 @@
-OBSERVER_VSN = 0.9.8.4
+OBSERVER_VSN = 0.9.9
diff --git a/lib/odbc/c_src/odbcserver.c b/lib/odbc/c_src/odbcserver.c
index 077d78bfe5..d61ce940c3 100644
--- a/lib/odbc/c_src/odbcserver.c
+++ b/lib/odbc/c_src/odbcserver.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1999-2010. All Rights Reserved.
+ * Copyright Ericsson AB 1999-2011. 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
@@ -472,7 +472,7 @@ static db_result_msg db_connect(byte *args, db_state *state)
&stringlength2ptr, SQL_DRIVER_NOPROMPT);
if (!sql_success(result)) {
- diagnos = get_diagnos(SQL_HANDLE_STMT, statement_handle(state));
+ diagnos = get_diagnos(SQL_HANDLE_DBC, connection_handle(state));
strcat((char *)diagnos.error_msg,
" Connection to database failed.");
msg = encode_error_message(diagnos.error_msg);
diff --git a/lib/odbc/doc/src/notes.xml b/lib/odbc/doc/src/notes.xml
index 7dece7c584..b88c7cf1cd 100644
--- a/lib/odbc/doc/src/notes.xml
+++ b/lib/odbc/doc/src/notes.xml
@@ -31,7 +31,22 @@
<p>This document describes the changes made to the odbc application.
</p>
- <section><title>ODBC 2.10.9</title>
+ <section><title>ODBC 2.10.10</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Better error messages for connection issues.</p>
+ <p>
+ Own Id: OTP-9111</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>ODBC 2.10.9</title>
<section><title>Improvements and New Features</title>
<list>
diff --git a/lib/odbc/src/odbc.appup.src b/lib/odbc/src/odbc.appup.src
index f1a370d925..2a6667ccd3 100644
--- a/lib/odbc/src/odbc.appup.src
+++ b/lib/odbc/src/odbc.appup.src
@@ -1,8 +1,8 @@
%% -*- erlang -*-
{"%VSN%",
[
- {"2.10.8", [{restart_application, ssl}]}
+ {"2.10.9", [{restart_application, ssl}]}
],
[
- {"2.10.8", [{restart_application, ssl}]}
+ {"2.10.9", [{restart_application, ssl}]}
]}.
diff --git a/lib/odbc/test/Makefile b/lib/odbc/test/Makefile
index 935ecbf5a7..ec2bcc67b5 100644
--- a/lib/odbc/test/Makefile
+++ b/lib/odbc/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1999-2009. All Rights Reserved.
+# Copyright Ericsson AB 1999-2011. 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
@@ -45,8 +45,8 @@ HRL_FILES= odbc_test.hrl\
TARGET_FILES= \
$(MODULES:%=$(EBIN)/%.$(EMULATOR))
-SPEC_FILES = odbc.spec odbc.dynspec \
- odbc.spec.win
+SPEC_FILES = odbc.spec
+COVER_FILE = odbc.cover
EMAKEFILE = Emakefile
MAKE_EMAKE = $(wildcard $(ERL_TOP)/make/make_emakefile)
@@ -101,7 +101,7 @@ release_spec: opt
release_tests_spec: opt
$(INSTALL_DIR) $(RELSYSDIR)
- $(INSTALL_DATA) $(SPEC_FILES) $(ERL_FILES) $(HRL_FILES) $(RELSYSDIR)
+ $(INSTALL_DATA) $(SPEC_FILES) $(COVER_FILE) $(ERL_FILES) $(HRL_FILES) $(RELSYSDIR)
release_docs_spec:
diff --git a/lib/odbc/test/odbc.cover b/lib/odbc/test/odbc.cover
new file mode 100644
index 0000000000..1acca281fb
--- /dev/null
+++ b/lib/odbc/test/odbc.cover
@@ -0,0 +1,2 @@
+{incl_app,odbc,details}.
+
diff --git a/lib/odbc/test/odbc.spec b/lib/odbc/test/odbc.spec
index acba9f8d98..edaf821c91 100644
--- a/lib/odbc/test/odbc.spec
+++ b/lib/odbc/test/odbc.spec
@@ -1,9 +1,25 @@
-{topcase, {dir, "../odbc_test"}}.
-{skip, {odbc_data_type_SUITE, varchar_upper_limit, "Known bug in database"}}.
-{skip, {odbc_data_type_SUITE, text_upper_limit, "Consumes too much resources"}}.
-{skip, {odbc_data_type_SUITE, bit_true , "Not supported by driver"}}.
-{skip, {odbc_data_type_SUITE, bit_false, "Not supported by driver"}}.
-{skip, {odbc_query_SUITE, multiple_select_result_sets,"Not supported by driver"}}.
-{skip, {odbc_query_SUITE, multiple_mix_result_sets, "Not supported by driver"}}.
-{skip, {odbc_query_SUITE, multiple_result_sets_error, "Not supported by driver"}}.
-{skip, {odbc_query_SUITE, param_insert_tiny_int, "Not supported by driver"}}. \ No newline at end of file
+{suites,"../odbc_test",all}.
+{skip_cases,"../odbc_test",odbc_data_type_SUITE,
+ [varchar_upper_limit],
+ "Known bug in database"}.
+{skip_cases,"../odbc_test",odbc_data_type_SUITE,
+ [text_upper_limit],
+ "Consumes too much resources"}.
+{skip_cases,"../odbc_test",odbc_data_type_SUITE,
+ [bit_true],
+ "Not supported by driver"}.
+{skip_cases,"../odbc_test",odbc_data_type_SUITE,
+ [bit_false],
+ "Not supported by driver"}.
+{skip_cases,"../odbc_test",odbc_query_SUITE,
+ [multiple_select_result_sets],
+ "Not supported by driver"}.
+{skip_cases,"../odbc_test",odbc_query_SUITE,
+ [multiple_mix_result_sets],
+ "Not supported by driver"}.
+{skip_cases,"../odbc_test",odbc_query_SUITE,
+ [multiple_result_sets_error],
+ "Not supported by driver"}.
+{skip_cases,"../odbc_test",odbc_query_SUITE,
+ [param_insert_tiny_int],
+ "Not supported by driver"}.
diff --git a/lib/odbc/test/odbc_connect_SUITE.erl b/lib/odbc/test/odbc_connect_SUITE.erl
index 4d37a8f543..6a2268f40e 100644
--- a/lib/odbc/test/odbc_connect_SUITE.erl
+++ b/lib/odbc/test/odbc_connect_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
@@ -24,7 +24,7 @@
%% Note: This directive should only be used in test suites.
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include("test_server_line.hrl").
-include("odbc_test.hrl").
@@ -40,20 +40,32 @@
%% Description: Returns documentation/test cases in this test suite
%% or a skip tuple if the platform is not supported.
%%--------------------------------------------------------------------
-all(doc) ->
- ["Tests the ability to connect and disconnet to/from the database"];
-all(suite) ->
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
case odbc_test_lib:odbc_check() of
- ok -> all();
+ ok ->
+ [not_exist_db, commit, rollback, not_explicit_commit,
+ no_c_node, port_dies, control_process_dies,
+ {group, client_dies}, connect_timeout, timeout,
+ many_timeouts, timeout_reset, disconnect_on_timeout,
+ connection_closed, disable_scrollable_cursors,
+ return_rows_as_lists, api_missuse];
Other -> {skip, Other}
- end.
+ end.
+
+groups() ->
+ [{client_dies, [],
+ [client_dies_normal, client_dies_timeout,
+ client_dies_error]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all() ->
- [not_exist_db, commit, rollback, not_explicit_commit,
- no_c_node, port_dies, control_process_dies, client_dies,
- connect_timeout, timeout, many_timeouts, timeout_reset,
- disconnect_on_timeout, connection_closed,
- disable_scrollable_cursors, return_rows_as_lists, api_missuse].
%%--------------------------------------------------------------------
%% Function: init_per_suite(Config) -> Config
@@ -66,7 +78,7 @@ all() ->
%%--------------------------------------------------------------------
init_per_suite(Config) ->
application:start(odbc),
- case odbc:connect(?RDBMS:connection_string(),
+ case catch odbc:connect(?RDBMS:connection_string(),
[{auto_commit, off}]) of
{ok, Ref} ->
odbc:disconnect(Ref),
@@ -283,11 +295,6 @@ control_process_dies(_Config) ->
ok.
%%-------------------------------------------------------------------------
-client_dies(doc) ->
- ["Test that the odbc process is terminated when the client process "
- "dies"];
-client_dies(suite) ->
- [client_dies_normal, client_dies_timeout, client_dies_error].
%%-------------------------------------------------------------------------
client_dies_normal(doc) ->
diff --git a/lib/odbc/test/odbc_data_type_SUITE.erl b/lib/odbc/test/odbc_data_type_SUITE.erl
index 7d4a0ca15f..bfb1e4b329 100644
--- a/lib/odbc/test/odbc_data_type_SUITE.erl
+++ b/lib/odbc/test/odbc_data_type_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
@@ -24,7 +24,7 @@
%% Note: This directive should only be used in test suites.
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include_lib("stdlib/include/ms_transform.hrl").
-include("test_server_line.hrl").
-include("odbc_test.hrl").
@@ -39,16 +39,48 @@
%% Description: Returns documentation/test cases in this test suite
%% or a skip tuple if the platform is not supported.
%%--------------------------------------------------------------------
-all(doc) ->
- ["Tests data types"];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
case odbc_test_lib:odbc_check() of
- ok -> all();
- Other -> {skip,Other}
- end.
+ ok ->
+ [{group, char}, {group, int}, {group, floats},
+ {group, dec_and_num}, timestamp];
+ Other -> {skip, Other}
+ end.
-all() ->
- [char, int, floats, dec_and_num, timestamp].
+groups() ->
+ [{char, [],
+ [char_fixed_lower_limit, char_fixed_upper_limit,
+ char_fixed_padding, varchar_lower_limit,
+ varchar_upper_limit, varchar_no_padding,
+ text_lower_limit, text_upper_limit, unicode]},
+ {binary_char, [],
+ [binary_char_fixed_lower_limit,
+ binary_char_fixed_upper_limit,
+ binary_char_fixed_padding, binary_varchar_lower_limit,
+ binary_varchar_upper_limit, binary_varchar_no_padding,
+ binary_text_lower_limit, binary_text_upper_limit,
+ unicode]},
+ {int, [],
+ [tiny_int_lower_limit, tiny_int_upper_limit,
+ small_int_lower_limit, small_int_upper_limit,
+ int_lower_limit, int_upper_limit, big_int_lower_limit,
+ big_int_upper_limit, bit_false, bit_true]},
+ {floats, [],
+ [float_lower_limit, float_upper_limit, float_zero,
+ real_zero]},
+ {dec_and_num, [],
+ [dec_long, dec_double, dec_bignum, num_long, num_double,
+ num_bignum]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%--------------------------------------------------------------------
%% Function: init_per_suite(Config) -> Config
@@ -124,14 +156,6 @@ end_per_testcase(_TestCase, Config) ->
%%-------------------------------------------------------------------------
%% Test cases starts here.
%%-------------------------------------------------------------------------
-char(doc) ->
- ["Tests char data types"];
-
-char(suite) ->
- [char_fixed_lower_limit, char_fixed_upper_limit,
- char_fixed_padding, varchar_lower_limit, varchar_upper_limit,
- varchar_no_padding, text_lower_limit, text_upper_limit, unicode
- ].
char_fixed_lower_limit(doc) ->
["Tests fixed length char data type lower boundaries."];
@@ -424,14 +448,6 @@ text_upper_limit(Config) when is_list(Config) ->
%% ok.
%%-------------------------------------------------------------------------
-binary_char(doc) ->
- ["Tests char data types returned as erlang binaries"];
-
-binary_char(suite) ->
- [binary_char_fixed_lower_limit, binary_char_fixed_upper_limit,
- binary_char_fixed_padding, binary_varchar_lower_limit, binary_varchar_upper_limit,
- binary_varchar_no_padding, binary_text_lower_limit, binary_text_upper_limit, unicode
- ].
binary_char_fixed_lower_limit(doc) ->
["Tests fixed length char data type lower boundaries."];
@@ -726,13 +742,6 @@ binary_text_upper_limit(Config) when is_list(Config) ->
%%-------------------------------------------------------------------------
-int(doc) ->
- ["Tests integer data types"];
-
-int(suite) ->
- [tiny_int_lower_limit, tiny_int_upper_limit, small_int_lower_limit,
- small_int_upper_limit, int_lower_limit, int_upper_limit,
- big_int_lower_limit, big_int_upper_limit, bit_false, bit_true].
%%-------------------------------------------------------------------------
@@ -1053,10 +1062,6 @@ bit_true(Config) when is_list(Config) ->
%%-------------------------------------------------------------------------
-floats(doc) ->
- ["Test the datatype float."];
-floats(suite) ->
- [float_lower_limit, float_upper_limit, float_zero, real_zero].
%%-------------------------------------------------------------------------
float_lower_limit(doc) ->
@@ -1184,10 +1189,6 @@ real_zero(Config) when is_list(Config) ->
ok
end.
%%-------------------------------------------------------------------------
-dec_and_num(doc) ->
- ["Tests decimal and numeric datatypes."];
-dec_and_num(suite) ->
- [dec_long, dec_double, dec_bignum, num_long, num_double, num_bignum].
%%------------------------------------------------------------------------
dec_long(doc) ->
[""];
diff --git a/lib/odbc/test/odbc_query_SUITE.erl b/lib/odbc/test/odbc_query_SUITE.erl
index 12b39be3b7..8b8d1e7a40 100644
--- a/lib/odbc/test/odbc_query_SUITE.erl
+++ b/lib/odbc/test/odbc_query_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
@@ -24,7 +24,7 @@
%% Note: This directive should only be used in test suites.
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include("test_server_line.hrl").
-include("odbc_test.hrl").
@@ -38,22 +38,47 @@
%% Description: Returns documentation/test cases in this test suite
%% or a skip tuple if the platform is not supported.
%%--------------------------------------------------------------------
-all(doc) ->
- ["Tests SQL queries"];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
case odbc_test_lib:odbc_check() of
- ok -> all();
+ ok ->
+ [sql_query, first, last, next, prev, select_count,
+ select_next, select_relative, select_absolute,
+ create_table_twice, delete_table_twice, duplicate_key,
+ not_connection_owner, no_result_set, query_error,
+ multiple_select_result_sets, multiple_mix_result_sets,
+ multiple_result_sets_error,
+ {group, parameterized_queries}, {group, describe_table},
+ delete_nonexisting_row];
Other -> {skip, Other}
- end.
+ end.
-all() ->
- [sql_query, first, last, next, prev, select_count,select_next,
- select_relative, select_absolute, create_table_twice,
- delete_table_twice, duplicate_key, not_connection_owner,
- no_result_set, query_error, multiple_select_result_sets,
- multiple_mix_result_sets, multiple_result_sets_error,
- parameterized_queries, describe_table,
- delete_nonexisting_row].
+groups() ->
+ [{parameterized_queries, [],
+ [{group, param_integers}, param_insert_decimal,
+ param_insert_numeric, {group, param_insert_string},
+ param_insert_float, param_insert_real,
+ param_insert_double, param_insert_mix, param_update,
+ param_delete, param_select]},
+ {param_integers, [],
+ [param_insert_tiny_int, param_insert_small_int,
+ param_insert_int, param_insert_integer]},
+ {param_insert_string, [],
+ [param_insert_char, param_insert_character,
+ param_insert_char_varying,
+ param_insert_character_varying]},
+ {describe_table, [],
+ [describe_integer, describe_string, describe_floating,
+ describe_dec_num, describe_no_such_table]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%--------------------------------------------------------------------
@@ -638,23 +663,8 @@ multiple_result_sets_error(Config) when is_list(Config) ->
end.
%%-------------------------------------------------------------------------
-parameterized_queries(doc)->
- ["Tests diffrent variants of parameterized queries."];
-parameterized_queries(suite) ->
- %% Note timestamps are inserted with param_query in odbc_data_type_SUITE
- %% so no need to test this again.
- [param_integers,
- param_insert_decimal, param_insert_numeric,
- param_insert_string,
- param_insert_float, param_insert_real, param_insert_double,
- param_insert_mix, param_update, param_delete, param_select].
%%-------------------------------------------------------------------------
-param_integers(doc)->
- ["Test insertion of integers by parameterized queries."];
-param_integers(suite) ->
- [param_insert_tiny_int,
- param_insert_small_int, param_insert_int, param_insert_integer].
%%-------------------------------------------------------------------------
param_insert_tiny_int(doc)->
["Test insertion of tiny ints by parameterized queries."];
@@ -891,11 +901,6 @@ param_insert_numeric(Config) when is_list(Config) ->
ok.
%%-------------------------------------------------------------------------
-param_insert_string(doc) ->
- ["Test insertion of strings by parameterized queries."];
-param_insert_string(suite) ->
- [param_insert_char, param_insert_character, param_insert_char_varying,
- param_insert_character_varying].
%%-------------------------------------------------------------------------
param_insert_char(doc)->
@@ -1320,11 +1325,6 @@ param_select(Config) when is_list(Config) ->
ok.
%%-------------------------------------------------------------------------
-describe_table(doc) ->
- ["Test describe_table/[2,3]"];
-describe_table(suite) ->
- [describe_integer, describe_string, describe_floating, describe_dec_num,
- describe_no_such_table].
%%-------------------------------------------------------------------------
describe_integer(doc) ->
diff --git a/lib/odbc/test/odbc_start_SUITE.erl b/lib/odbc/test/odbc_start_SUITE.erl
index 2cca8e4546..65b990133f 100644
--- a/lib/odbc/test/odbc_start_SUITE.erl
+++ b/lib/odbc/test/odbc_start_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -24,7 +24,7 @@
%% Note: This directive should only be used in test suites.
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include("test_server_line.hrl").
-include("odbc_test.hrl").
@@ -98,17 +98,23 @@ end_per_testcase(_TestCase, Config) ->
%% Name of a test case.
%% Description: Returns a list of all test cases in this test suite
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test start/stop of odbc"];
+suite() -> [{ct_hooks,[ts_install_cth]}].
-all(suite) ->
+all() ->
case odbc_test_lib:odbc_check() of
- ok -> all();
+ ok -> [start];
Other -> {skip, Other}
- end.
+ end.
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all() ->
- [start].
%% Test cases starts here.
diff --git a/lib/odbc/test/odbc_test_lib.erl b/lib/odbc/test/odbc_test_lib.erl
index 92e895eb87..012eb96e43 100644
--- a/lib/odbc/test/odbc_test_lib.erl
+++ b/lib/odbc/test/odbc_test_lib.erl
@@ -51,7 +51,7 @@ odbc_check() ->
[Other]))
end;
Other ->
- case test_server:os_type() of
+ case os:type() of
{unix, linux} ->
ok;
Platform ->
diff --git a/lib/odbc/vsn.mk b/lib/odbc/vsn.mk
index aacf3924db..42a51be33e 100644
--- a/lib/odbc/vsn.mk
+++ b/lib/odbc/vsn.mk
@@ -1 +1 @@
-ODBC_VSN = 2.10.9
+ODBC_VSN = 2.10.10
diff --git a/lib/orber/doc/src/CosNaming_BindingIterator.xml b/lib/orber/doc/src/CosNaming_BindingIterator.xml
index 83972a6009..2ae9871bb9 100644
--- a/lib/orber/doc/src/CosNaming_BindingIterator.xml
+++ b/lib/orber/doc/src/CosNaming_BindingIterator.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1997</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/orber/doc/src/CosNaming_NamingContextExt.xml b/lib/orber/doc/src/CosNaming_NamingContextExt.xml
index ef091bcd35..72e1f497ae 100644
--- a/lib/orber/doc/src/CosNaming_NamingContextExt.xml
+++ b/lib/orber/doc/src/CosNaming_NamingContextExt.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2000</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/orber/doc/src/Module_Interface.xml b/lib/orber/doc/src/Module_Interface.xml
index 85f19ccf49..7686419fdd 100644
--- a/lib/orber/doc/src/Module_Interface.xml
+++ b/lib/orber/doc/src/Module_Interface.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1999</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/orber/doc/src/any.xml b/lib/orber/doc/src/any.xml
index 6ba1a96561..390002669a 100644
--- a/lib/orber/doc/src/any.xml
+++ b/lib/orber/doc/src/any.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1998</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/orber/doc/src/ch_idl_to_erlang_mapping.xml b/lib/orber/doc/src/ch_idl_to_erlang_mapping.xml
index a97ad65f0e..964ae3e92d 100644
--- a/lib/orber/doc/src/ch_idl_to_erlang_mapping.xml
+++ b/lib/orber/doc/src/ch_idl_to_erlang_mapping.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>1997</year><year>2009</year>
+ <year>1997</year><year>2010</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -445,7 +445,19 @@ void op(in myEnum a);</cell>
<section>
<title>Struct Data Type</title>
<p>A <c>struct</c> may have Basic, Template, Scoped Names and Constructed
- types as members.</p>
+ types as members. By using forward declaration we can define a recursive struct:</p>
+ <code type="none"><![CDATA[
+struct myStruct; // Forward declaration
+typedef sequence<myStruct> myStructSeq;
+struct myStruct {
+ myStructSeq chain;
+};
+
+// Deprecated definition (anonymous) not supported by IC
+struct myStruct {
+ sequence<myStruct> chain;
+};
+ ]]></code>
</section>
<section>
@@ -510,6 +522,25 @@ union LongUnion2 switch(long) {
default: boolean DefaultValue;
};
</code>
+ <p>In the same way as structs, unions can be recursive if forward
+ declaration is used (anonymous types is deprecated and not supported):</p>
+ <code type="none"><![CDATA[
+// Forward declaration
+union myUnion;
+typedef sequence<myUnion>myUnionSeq;
+union myUnion switch (long) {
+ case 1 : myUnionSeq chain;
+ default: boolean DefaultValue;
+};
+ ]]></code>
+
+ <note>
+ <p>Recursive types (union and struct) require Light IFR. I.e. the
+ IC option {light_ifr, true} is used and that Orber is configured in such a way that
+ Light IFR is activated. Recursive TypeCode is currently not supported, which is
+ why these cannot be encapsulated in an any data type.</p>
+ </note>
+
</section>
<warning>
<p>Every field in, for example, a struct must be initiated. Otherwise
@@ -890,7 +921,7 @@ attribute long RWAttribute;
object internal state with its object reference. The object internal state is
an Erlang term which has a format defined by the user.</p>
<note>
- <p>It is is not always the case that the internal state will be the first parameter, as stubs can use their own object reference as the first parameter (see the IC documentation).</p>
+ <p>It is not always the case that the internal state will be the first parameter, as stubs can use their own object reference as the first parameter (see the IC documentation).</p>
</note>
<p>A function call will invoke an operation. The first
parameter of the function should be the object reference and then
diff --git a/lib/orber/doc/src/corba_object.xml b/lib/orber/doc/src/corba_object.xml
index 810f06dbba..e0f9a9f503 100644
--- a/lib/orber/doc/src/corba_object.xml
+++ b/lib/orber/doc/src/corba_object.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1997</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/orber/doc/src/fixed.xml b/lib/orber/doc/src/fixed.xml
index 7c59071b49..8f23a32c8f 100644
--- a/lib/orber/doc/src/fixed.xml
+++ b/lib/orber/doc/src/fixed.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2002</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/orber/doc/src/intro_part.xml b/lib/orber/doc/src/intro_part.xml
index 3f429eeb87..bd783331f2 100644
--- a/lib/orber/doc/src/intro_part.xml
+++ b/lib/orber/doc/src/intro_part.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2002</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/orber/doc/src/notes.xml b/lib/orber/doc/src/notes.xml
index 6eda16a517..589123ef73 100644
--- a/lib/orber/doc/src/notes.xml
+++ b/lib/orber/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>1997</year><year>2010</year>
+ <year>1997</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -33,6 +33,52 @@
</header>
<section>
+ <title>Orber 3.6.20</title>
+
+ <section>
+ <title>Improvements and New Features</title>
+ <list type="bulleted">
+ <item>
+ <p>
+ Eliminated Dialyzer warnings when using exit or throw.</p>
+ <p>
+ Own Id: OTP-9050 Aux Id:</p>
+ </item>
+ </list>
+ </section>
+ </section>
+
+ <section>
+ <title>Orber 3.6.19</title>
+
+ <section>
+ <title>Improvements and New Features</title>
+ <list type="bulleted">
+ <item>
+ <p>
+ Partial support for recursive structs and unions.
+ Only available for the erl_corba backend and requires
+ that Light IFR is used. I.e. the IC option {light_ifr, true}
+ and that Orber is configured in such a way that Light IFR
+ is activated. Recursive TypeCode is currently not supported.</p>
+ <p>
+ Own Id: OTP-8868 Aux Id: seq11633</p>
+ </item>
+ </list>
+ </section>
+ <section>
+ <title>Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>The SSL option {ssl_imp, old} was not used if ssl_generation was
+ set to 2. Only R14B was affected by this.</p>
+ <p>Own Id: OTP-8994 Aux Id: seq11747</p>
+ </item>
+ </list>
+ </section>
+ </section>
+
+ <section>
<title>Orber 3.6.18</title>
<section>
<title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/orber/doc/src/orber_acl.xml b/lib/orber/doc/src/orber_acl.xml
index 441001894a..c844b99702 100644
--- a/lib/orber/doc/src/orber_acl.xml
+++ b/lib/orber/doc/src/orber_acl.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2005</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/orber/doc/src/orber_tc.xml b/lib/orber/doc/src/orber_tc.xml
index 5d7f6368dd..a6141dd5bb 100644
--- a/lib/orber/doc/src/orber_tc.xml
+++ b/lib/orber/doc/src/orber_tc.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1998</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/orber/doc/src/tools_debugging_part.xml b/lib/orber/doc/src/tools_debugging_part.xml
index edab8ad0d4..9aae7bc06f 100644
--- a/lib/orber/doc/src/tools_debugging_part.xml
+++ b/lib/orber/doc/src/tools_debugging_part.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2002</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/orber/include/ifr_types.hrl b/lib/orber/include/ifr_types.hrl
index 144ec7f8a1..324b32bd4f 100644
--- a/lib/orber/include/ifr_types.hrl
+++ b/lib/orber/include/ifr_types.hrl
@@ -1,9 +1,9 @@
%%--------------------------------------------------------------------
%%
%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
-%%
+%%
+%% Copyright Ericsson AB 1997-2011. 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
diff --git a/lib/orber/src/cdr_decode.erl b/lib/orber/src/cdr_decode.erl
index 9d30098940..36ef6ce02f 100644
--- a/lib/orber/src/cdr_decode.erl
+++ b/lib/orber/src/cdr_decode.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2010. 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
@@ -898,9 +898,13 @@ dec_sequence_struct(Version, Message, N, TypeCodeList, Len, ByteOrder, Buff, C,
{Seq, Rest2, Len2, NewC2} = dec_sequence_struct(Version, Rest1, N - 1, TypeCodeList, Len1, ByteOrder,
Buff, NewC, Name),
{[list_to_tuple([Name |Struct]) | Seq], Rest2, Len2, NewC2}.
-dec_sequence_union(_, Message, 0, _DiscrTC, _Default, _ElementList, Len, _ByteOrder, _Buff, C, _Name) ->
+
+
+dec_sequence_union(_, Message, 0, _DiscrTC, _Default, _ElementList,
+ Len, _ByteOrder, _Buff, C, _Name) ->
{[], Message, Len, C};
-dec_sequence_union(Version, Message, N, DiscrTC, Default, ElementList, Len, ByteOrder, Buff, C, Name) ->
+dec_sequence_union(Version, Message, N, DiscrTC, Default, ElementList,
+ Len, ByteOrder, Buff, C, Name) when is_list(ElementList) ->
{Label, Rest1, Len1, NewC} = dec_type(DiscrTC, Version, Message, Len, ByteOrder, Buff, C),
Result = dec_union(Version, stringify_enum(DiscrTC, Label), ElementList, Default,
@@ -916,7 +920,20 @@ dec_sequence_union(Version, Message, N, DiscrTC, Default, ElementList, Len, Byte
DiscrTC, Default, ElementList,
Len2, ByteOrder,
Buff, NewC3, Name),
- {[{Name, Label, Value} | Seq], Rest3, Len3, NewC4}.
+ {[{Name, Label, Value} | Seq], Rest3, Len3, NewC4};
+dec_sequence_union(Version, Message, N, _DiscrTC, _Default, Module,
+ Len, ByteOrder, Buff, C, Name) when is_atom(Module) ->
+ case catch Module:tc() of
+ {tk_union, _, _, DiscrTC, Default, ElementList} ->
+ dec_sequence_union(Version, Message, N, DiscrTC, Default, ElementList,
+ Len, ByteOrder, Buff, C, Name);
+ What ->
+ orber:dbg("[~p] ~p:dec_sequence_union(~p). Union module doesn't exist or incorrect.",
+ [?LINE, ?MODULE, What], ?DEBUG_LEVEL),
+ corba:raise(#'MARSHAL'{completion_status=?COMPLETED_MAYBE})
+ end.
+
+
%% A special case; when something is encapsulated (i.e. sent as octet-sequence)
%% we sometimes don not want the result to be converted to a list.
@@ -993,14 +1010,16 @@ dec_wstring(Version, Message, Len, ByteOrder, Buff, C) ->
%% Func: dec_union/9
%%-----------------------------------------------------------------
%% ## NEW IIOP 1.2 ##
-dec_union(Version, ?SYSTEM_TYPE, Name, DiscrTC, Default, ElementList, Bytes, Len, ByteOrder, Buff, C) ->
+dec_union(Version, ?SYSTEM_TYPE, Name, DiscrTC, Default, ElementList, Bytes,
+ Len, ByteOrder, Buff, C) ->
{Label, Rest1, Len1, NewC} = dec_type(DiscrTC, Version, Bytes, Len, ByteOrder, Buff, C),
{Value, Rest2, Len2, NewC3} = dec_union(Version, Label, ElementList, Default,
Rest1, Len1, ByteOrder, Buff, NewC),
{{Name, Label, Value}, Rest2, Len2, NewC3};
-dec_union(Version, IFRId, _, DiscrTC, Default, ElementList, Bytes, Len, ByteOrder, Buff, C) ->
+dec_union(Version, IFRId, _, DiscrTC, Default, ElementList, Bytes, Len,
+ ByteOrder, Buff, C) when is_list(ElementList) ->
{Label, Rest1, Len1, NewC} = dec_type(DiscrTC, Version, Bytes, Len, ByteOrder, Buff, C),
Result = dec_union(Version, stringify_enum(DiscrTC, Label), ElementList, Default,
Rest1, Len1, ByteOrder, Buff, NewC),
@@ -1012,7 +1031,20 @@ dec_union(Version, IFRId, _, DiscrTC, Default, ElementList, Bytes, Len, ByteOrde
X
end,
Name = ifrid_to_name(IFRId, ?IFR_UnionDef),
- {{Name, Label, Value}, Rest2, Len2, NewC3}.
+ {{Name, Label, Value}, Rest2, Len2, NewC3};
+dec_union(Version, IFRId, _, _DiscrTC, _Default, Module, Bytes, Len,
+ ByteOrder, Buff, C) when is_atom(Module) ->
+ case catch Module:tc() of
+ {tk_union, _, Name, DiscrTC, Default, ElementList} ->
+ dec_union(Version, IFRId, Name, DiscrTC, Default, ElementList, Bytes, Len,
+ ByteOrder, Buff, C);
+ What ->
+ orber:dbg("[~p] ~p:dec_union(~p). Union module doesn't exist or incorrect.",
+ [?LINE, ?MODULE, What], ?DEBUG_LEVEL),
+ corba:raise(#'MARSHAL'{completion_status=?COMPLETED_MAYBE})
+ end.
+
+
dec_union(_, _, [], Default, Message, Len, _, _Buff, C) when Default < 0 ->
{undefined, Message, Len, C};
@@ -1047,7 +1079,16 @@ dec_struct1(_, [], Message, Len, _ByteOrder, _, C) ->
dec_struct1(Version, [{_ElemName, ElemType} | TypeCodeList], Message, Len, ByteOrder, Buff, C) ->
{Element, Rest, Len1, NewC} = dec_type(ElemType, Version, Message, Len, ByteOrder, Buff, C),
{Struct, Rest1, Len2, NewC2} = dec_struct1(Version, TypeCodeList, Rest, Len1, ByteOrder, Buff, NewC),
- {[Element |Struct], Rest1, Len2, NewC2}.
+ {[Element |Struct], Rest1, Len2, NewC2};
+dec_struct1(Version, Module, Message, Len, ByteOrder, Buff, C) ->
+ case catch Module:tc() of
+ {tk_struct, _, _, TypeCodeList} ->
+ dec_struct1(Version, TypeCodeList, Message, Len, ByteOrder, Buff, C);
+ What ->
+ orber:dbg("[~p] ~p:dec_struct1(~p). Struct module doesn't exist or incorrect.",
+ [?LINE, ?MODULE, What], ?DEBUG_LEVEL),
+ corba:raise(#'MARSHAL'{completion_status=?COMPLETED_MAYBE})
+ end.
ifrid_to_name([], Type) ->
orber:dbg("[~p] ~p:ifrid_to_name([], ~p). No Id supplied.",
@@ -1232,7 +1273,9 @@ get_user_exception_type(TypeId) ->
%%-----------------------------------------------------------------
dec_type_code(Version, Message, Len, ByteOrder, Buff, C) ->
{TypeNo, Message1, Len1, NewC} = dec_type('tk_ulong', Version, Message, Len, ByteOrder, Buff, C),
- dec_type_code(TypeNo, Version, Message1, Len1, ByteOrder, Buff, NewC).
+ TC = dec_type_code(TypeNo, Version, Message1, Len1, ByteOrder, Buff, NewC),
+ erase(orber_indirection),
+ TC.
%%-----------------------------------------------------------------
%% Func: dec_type_code/5
@@ -1441,13 +1484,22 @@ dec_type_code(33, Version, Message, Len, ByteOrder, Buff, C) ->
{"name", {'tk_string', 0}}]},
Version, Rest1, 1, ByteOrder1, Buff, C+1+Ex),
{{'tk_local_interface', RepId, Name}, Message1, Len1, NewC};
-dec_type_code(16#ffffffff, Version, Message, Len, ByteOrder, Buff, C) -> %% placeholder
+dec_type_code(16#ffffffff, Version, Message, Len, ByteOrder, Buff, C) ->
{Indirection, Message1, Len1, NewC} =
dec_type('tk_long', Version, Message, Len, ByteOrder, Buff, C),
Position = C+Indirection,
- <<_:Position/binary, SubBuff/binary>> = Buff,
- {TC, _, _, _} = dec_type_code(Version, SubBuff, Position, ByteOrder, Buff, Position),
- {TC, Message1, Len1, NewC};
+ case put(orber_indirection, Position) of
+ Position ->
+%% {{'none', Indirection}, Message1, Len1, NewC};
+ %% Recursive TypeCode. Break the loop.
+ orber:dbg("[~p] cdr_decode:dec_type_code(~p); Recursive TC not supported.",
+ [?LINE,Position], ?DEBUG_LEVEL),
+ corba:raise(#'MARSHAL'{completion_status=?COMPLETED_NO});
+ _ ->
+ <<_:Position/binary, SubBuff/binary>> = Buff,
+ {TC, _, _, _} = dec_type_code(Version, SubBuff, Position, ByteOrder, Buff, Position),
+ {TC, Message1, Len1, NewC}
+ end;
dec_type_code(Type, _, _, _, _, _, _) ->
orber:dbg("[~p] cdr_decode:dec_type_code(~p); No match.",
[?LINE, Type], ?DEBUG_LEVEL),
diff --git a/lib/orber/src/cdr_encode.erl b/lib/orber/src/cdr_encode.erl
index 3ecb8833f5..eaf3c5b7dc 100644
--- a/lib/orber/src/cdr_encode.erl
+++ b/lib/orber/src/cdr_encode.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2010. 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
@@ -815,11 +815,21 @@ enc_wstring(Env, String, MaxLength, Bytes, Len) ->
%%-----------------------------------------------------------------
%% Func: enc_union/5
%%-----------------------------------------------------------------
-enc_union(Env, {_, Label, Value}, DiscrTC, Default, TypeCodeList, Bytes, Len) ->
+enc_union(Env, {_, Label, Value}, DiscrTC, Default, TypeCodeList,
+ Bytes, Len) when is_list(TypeCodeList) ->
{ByteSequence, Len1} = enc_type(DiscrTC, Env, Label, Bytes, Len),
Label2 = stringify_enum(DiscrTC,Label),
enc_union2(Env, {Label2, Value},TypeCodeList, Default,
- ByteSequence, Len1, undefined).
+ ByteSequence, Len1, undefined);
+enc_union(Env, Value, _DiscrTC, _Default, Module, Bytes, Len) when is_atom(Module) ->
+ case catch Module:tc() of
+ {tk_union, _, _, DiscrTC, Default, ElementList} ->
+ enc_union(Env, Value, DiscrTC, Default, ElementList, Bytes, Len);
+ What ->
+ orber:dbg("[~p] ~p:enc_union(~p). Union module doesn't exist or incorrect.",
+ [?LINE, ?MODULE, What], ?DEBUG_LEVEL),
+ corba:raise(#'MARSHAL'{completion_status=?COMPLETED_MAYBE})
+ end.
enc_union2(_Env, _What, [], Default, Bytes, Len, _) when Default < 0 ->
{Bytes, Len};
@@ -840,9 +850,19 @@ stringify_enum(_, Label) ->
%%-----------------------------------------------------------------
%% Func: enc_struct/4
%%-----------------------------------------------------------------
-enc_struct(Env, Struct, TypeCodeList, Bytes, Len) ->
+enc_struct(Env, Struct, TypeCodeList, Bytes, Len) when is_list(TypeCodeList) ->
[_Name | StructList] = tuple_to_list(Struct),
- enc_struct1(Env, StructList, TypeCodeList, Bytes, Len).
+ enc_struct1(Env, StructList, TypeCodeList, Bytes, Len);
+enc_struct(Env, Struct, Module, Bytes, Len) ->
+ [Module | StructList] = tuple_to_list(Struct),
+ case catch Module:tc() of
+ {tk_struct, _, _, TypeCodeList} ->
+ enc_struct1(Env, StructList, TypeCodeList, Bytes, Len);
+ What ->
+ orber:dbg("[~p] ~p:enc_struct([], ~p). Struct module doesn't exist or incorrect.",
+ [?LINE, ?MODULE, What], ?DEBUG_LEVEL),
+ corba:raise(#'MARSHAL'{completion_status=?COMPLETED_MAYBE})
+ end.
enc_struct1(_Env, [], [], Bytes, Len) ->
{Bytes, Len};
diff --git a/lib/orber/src/corba.erl b/lib/orber/src/corba.erl
index ea1363742c..ecec768544 100644
--- a/lib/orber/src/corba.erl
+++ b/lib/orber/src/corba.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -620,6 +620,8 @@ get_pid(Objkey) ->
%% Returns : Throws the exception.
%% Description:
%%----------------------------------------------------------------------
+%% To avoid dialyzer warnings due to the use of exit/throw.
+-spec raise(term()) -> no_return().
raise(E) ->
throw({'EXCEPTION', E}).
@@ -629,6 +631,8 @@ raise(E) ->
%% Returns : Throws the exception.
%% Description:
%%----------------------------------------------------------------------
+%% To avoid dialyzer warnings due to the use of exit/throw.
+-spec raise_with_state(term(), term()) -> no_return().
raise_with_state(E, State) ->
throw({reply, {'EXCEPTION', E}, State}).
diff --git a/lib/orber/src/orber.app.src b/lib/orber/src/orber.app.src
index fe911d65a4..88df4162b6 100644
--- a/lib/orber/src/orber.app.src
+++ b/lib/orber/src/orber.app.src
@@ -101,7 +101,7 @@
orber_iiop_insup, orber_init, orber_reqno,
orber_objkeyserver, orber_iiop_socketsup,
orber_iiop_pm, orber_env]},
- {applications, [stdlib, kernel]},
+ {applications, [stdlib, kernel, mnesia]},
{env, []},
{mod, {orber, []}}
]}.
diff --git a/lib/orber/src/orber.erl b/lib/orber/src/orber.erl
index c3d37ad1fb..665b3cb383 100644
--- a/lib/orber/src/orber.erl
+++ b/lib/orber/src/orber.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -1027,12 +1027,18 @@ remove_node(Node) when is_atom(Node) ->
remove_tables(Tables, Node) ->
- remove_tables(Tables, Node, []).
+ case remove_tables(Tables, Node, []) of
+ ok ->
+ ok;
+ {error, Node, Failed} ->
+ ?EFORMAT("orber:remove_node(~p) failed. Unable to remove table(s): ~p",
+ [Node, Failed])
+ end.
-remove_tables([], _, []) -> ok;
+remove_tables([], _, []) ->
+ ok;
remove_tables([], Node, Failed) ->
- ?EFORMAT("orber:remove_node(~p) failed. Unable to remove table(s): ~p",
- [Node, Failed]);
+ {error, Node, Failed};
remove_tables([T1|Trest], Node, Failed) ->
case mnesia:del_table_copy(T1, Node) of
{atomic, ok} ->
@@ -1041,8 +1047,6 @@ remove_tables([T1|Trest], Node, Failed) ->
remove_tables(Trest, Node, [{T1, Reason}|Failed])
end.
-
-
%%-----------------------------------------------------------------
%% Internal interface functions
%%-----------------------------------------------------------------
diff --git a/lib/orber/src/orber_socket.erl b/lib/orber/src/orber_socket.erl
index af6df01b7d..ec2cf8f42a 100644
--- a/lib/orber/src/orber_socket.erl
+++ b/lib/orber/src/orber_socket.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -37,7 +37,7 @@
%%-----------------------------------------------------------------
-export([start/0, connect/4, listen/3, listen/4, accept/2, accept/3, write/3,
controlling_process/3, close/2, peername/2, sockname/2,
- peerdata/2, peercert/2, peercert/3, sockdata/2, setopts/3,
+ peerdata/2, peercert/2, sockdata/2, setopts/3,
clear/2, shutdown/3, post_accept/2, post_accept/3]).
%%-----------------------------------------------------------------
@@ -366,14 +366,6 @@ peercert(Type, _Socket) ->
[?LINE, Type], ?DEBUG_LEVEL),
{error, ebadsocket}.
-peercert(ssl, Socket, Opts) ->
- ssl:peercert(Socket, Opts);
-peercert(Type, _Socket, Opts) ->
- orber:dbg("[~p] orber_socket:peercert(~p, ~p);~n"
- "Only available for SSL sockets.",
- [?LINE, Type, Opts], ?DEBUG_LEVEL),
- {error, ebadsocket}.
-
%%-----------------------------------------------------------------
%% Get peerdata
%%
@@ -496,27 +488,17 @@ check_port(Port, _, _) ->
%%-----------------------------------------------------------------
%% Check Options.
-%% We need this as a work-around since the SSL-app doesn't allow us
-%% to pass 'inet' as an option. Also needed for R9B :-(
check_options(normal, Options, _Generation) ->
- case orber:ip_version() of
- inet ->
- Options;
- inet6 ->
- %% Necessary for R9B. Should be [orber:ip_version()|Options];
- [inet6|Options]
- end;
+ [orber:ip_version()|Options];
check_options(ssl, Options, Generation) ->
case orber:ip_version() of
inet when Generation > 2 ->
[{ssl_imp, new}|Options];
inet ->
- Options;
+ [{ssl_imp, old}|Options];
inet6 when Generation > 2 ->
[{ssl_imp, new}, inet6|Options];
inet6 ->
- %% Will fail until SSL supports this option.
- %% Note, we want this happen!
- [inet6|Options]
+ [{ssl_imp, old}, inet6|Options]
end.
diff --git a/lib/orber/test/Makefile b/lib/orber/test/Makefile
index 4601e84d2c..b682bcf24b 100644
--- a/lib/orber/test/Makefile
+++ b/lib/orber/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2010. All Rights Reserved.
+# Copyright Ericsson AB 1997-2011. 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
@@ -34,6 +34,7 @@ RELSYSDIR = $(RELEASE_PATH)/orber_test
# Target Specs
# ----------------------------------------------------
TEST_SPEC_FILE = orber.spec
+COVER_FILE = orber.cover
IDL_FILES = \
@@ -120,7 +121,11 @@ GEN_MOD_TEST_SERVER = \
orber_test_server_uni \
orber_test_server_uni_d \
orber_test_timeout_server \
- orber_parent_inherrit
+ orber_parent_inherrit \
+ orber_test_server_rec_struct \
+ orber_test_server_rec_struct_seq \
+ orber_test_server_rec_union \
+ orber_test_server_rec_union_seq
GEN_HRL_TEST_SERVER = \
oe_orber_test_server.hrl \
@@ -218,10 +223,10 @@ release_docs_spec:
release_tests_spec: tests
$(INSTALL_DIR) $(RELSYSDIR)
- $(INSTALL_DATA) $(IDL_FILES) $(TEST_SPEC_FILE) \
+ $(INSTALL_DATA) $(IDL_FILES) $(TEST_SPEC_FILE) $(COVER_FILE) \
$(ERL_FILES) $(RELSYSDIR)
$(INSTALL_DATA) $(SUITE_TARGET_FILES) $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
$(INSTALL_DIR) $(RELSYSDIR)/$(IDLOUTDIR)
$(INSTALL_DATA) $(GEN_TARGET_FILES) $(GEN_FILES) \
$(RELSYSDIR)/$(IDLOUTDIR)
diff --git a/lib/orber/test/cdrcoding_10_SUITE.erl b/lib/orber/test/cdrcoding_10_SUITE.erl
index d5d030538f..54ad92cf7e 100644
--- a/lib/orber/test/cdrcoding_10_SUITE.erl
+++ b/lib/orber/test/cdrcoding_10_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -27,7 +27,7 @@
-include("idl_output/Module.hrl").
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
-include_lib("orber/src/orber_iiop.hrl").
@@ -36,12 +36,11 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]).
%%-----------------------------------------------------------------
%% Internal exports
%%-----------------------------------------------------------------
--export([]).
-compile(export_all).
%%-----------------------------------------------------------------
@@ -49,13 +48,28 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["Description", "more description"];
-all(suite) -> {req,
- [mnesia],
- {conf, init_all, cases(), finish_all}}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
-cases() ->
- [types, reply, cancel_request, close_connection, message_error].
+all() ->
+ cases().
+
+groups() ->
+ [{types, [],
+ [do_register, null_type, void_type, principal_type,
+ objref_type, struct_type, union_type, string_type,
+ array_type, any_type, typecode_type, alias_type,
+ exception_type, do_unregister]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
+ [{group, types}, reply, cancel_request,
+ close_connection, message_error].
%% request, locate_request, locate_reply].
%%-----------------------------------------------------------------
@@ -69,14 +83,14 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Path = code:which(?MODULE),
code:del_path(filename:join(filename:dirname(Path), "idl_output")),
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-init_all(Config) when is_list(Config) ->
+init_per_suite(Config) when is_list(Config) ->
orber:jump_start(0),
if
is_list(Config) ->
@@ -85,7 +99,7 @@ init_all(Config) when is_list(Config) ->
exit("Config not a list")
end.
-finish_all(Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
orber:jump_stop(),
Config.
@@ -94,11 +108,6 @@ finish_all(Config) when is_list(Config) ->
%% Description: Just testing the complex types, the others are
%% tested in the cdrlib SUITE.
%%-----------------------------------------------------------------
-types(doc) -> ["Description", "more description"];
-types(suite) -> [do_register, null_type, void_type, principal_type,
- objref_type, struct_type, union_type, string_type,
- array_type, any_type, typecode_type, alias_type,
- exception_type, do_unregister].
%types(Config) when list(Config) ->
% 'oe_orber_test':'oe_register'(),
% null_type(),
diff --git a/lib/orber/test/cdrcoding_11_SUITE.erl b/lib/orber/test/cdrcoding_11_SUITE.erl
index d62fe6eb3a..29b3e33069 100644
--- a/lib/orber/test/cdrcoding_11_SUITE.erl
+++ b/lib/orber/test/cdrcoding_11_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -27,7 +27,7 @@
-include("idl_output/Module.hrl").
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
-include_lib("orber/src/orber_iiop.hrl").
@@ -36,12 +36,11 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]).
%%-----------------------------------------------------------------
%% Internal exports
%%-----------------------------------------------------------------
--export([]).
-compile(export_all).
%%-----------------------------------------------------------------
@@ -49,13 +48,28 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["Description", "more description"];
-all(suite) -> {req,
- [mnesia],
- {conf, init_all, cases(), finish_all}}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
-cases() ->
- [types, reply, cancel_request, close_connection, message_error].
+all() ->
+ cases().
+
+groups() ->
+ [{types, [],
+ [do_register, null_type, void_type, principal_type,
+ objref_type, struct_type, union_type, string_type,
+ array_type, any_type, typecode_type, alias_type,
+ exception_type, do_unregister]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
+ [{group, types}, reply, cancel_request,
+ close_connection, message_error].
%% request, locate_request, locate_reply].
%%-----------------------------------------------------------------
@@ -69,14 +83,14 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Path = code:which(?MODULE),
code:del_path(filename:join(filename:dirname(Path), "idl_output")),
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-init_all(Config) when is_list(Config) ->
+init_per_suite(Config) when is_list(Config) ->
orber:jump_start(0),
if
is_list(Config) ->
@@ -85,7 +99,7 @@ init_all(Config) when is_list(Config) ->
exit("Config not a list")
end.
-finish_all(Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
orber:jump_stop(),
Config.
@@ -94,11 +108,6 @@ finish_all(Config) when is_list(Config) ->
%% Description: Just testing the complex types, the others are
%% tested in the cdrlib SUITE.
%%-----------------------------------------------------------------
-types(doc) -> ["Description", "more description"];
-types(suite) -> [do_register, null_type, void_type, principal_type,
- objref_type, struct_type, union_type, string_type,
- array_type, any_type, typecode_type, alias_type,
- exception_type, do_unregister].
%types(Config) when list(Config) ->
% 'oe_orber_test':'oe_register'(),
% null_type(),
diff --git a/lib/orber/test/cdrcoding_12_SUITE.erl b/lib/orber/test/cdrcoding_12_SUITE.erl
index 18e8eaa08a..dd9b98434d 100644
--- a/lib/orber/test/cdrcoding_12_SUITE.erl
+++ b/lib/orber/test/cdrcoding_12_SUITE.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -28,7 +28,7 @@
-module(cdrcoding_12_SUITE).
-include("idl_output/Module.hrl").
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
-include_lib("orber/src/orber_iiop.hrl").
@@ -37,12 +37,11 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]).
%%-----------------------------------------------------------------
%% Internal exports
%%-----------------------------------------------------------------
--export([]).
-compile(export_all).
%%-----------------------------------------------------------------
@@ -50,13 +49,28 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["Description", "more description"];
-all(suite) -> {req,
- [mnesia],
- {conf, init_all, cases(), finish_all}}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
-cases() ->
- [types, reply, cancel_request, close_connection, message_error].
+all() ->
+ cases().
+
+groups() ->
+ [{types, [],
+ [do_register, null_type, void_type, principal_type,
+ objref_type, struct_type, union_type, string_type,
+ array_type, any_type, typecode_type, alias_type,
+ exception_type, do_unregister]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
+ [{group, types}, reply, cancel_request,
+ close_connection, message_error].
%% request, locate_request, locate_reply].
%%-----------------------------------------------------------------
@@ -70,14 +84,14 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Path = code:which(?MODULE),
code:del_path(filename:join(filename:dirname(Path), "idl_output")),
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-init_all(Config) when is_list(Config) ->
+init_per_suite(Config) when is_list(Config) ->
orber:jump_start(0),
if
is_list(Config) ->
@@ -86,7 +100,7 @@ init_all(Config) when is_list(Config) ->
exit("Config not a list")
end.
-finish_all(Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
orber:jump_stop(),
Config.
@@ -95,11 +109,6 @@ finish_all(Config) when is_list(Config) ->
%% Description: Just testing the complex types, the others are
%% tested in the cdrlib SUITE.
%%-----------------------------------------------------------------
-types(doc) -> ["Description", "more description"];
-types(suite) -> [do_register, null_type, void_type, principal_type,
- objref_type, struct_type, union_type, string_type,
- array_type, any_type, typecode_type, alias_type,
- exception_type, do_unregister].
do_register(doc) -> [];
do_register(suite) -> [];
diff --git a/lib/orber/test/cdrlib_SUITE.erl b/lib/orber/test/cdrlib_SUITE.erl
index fa2d7f2a30..012d76b786 100644
--- a/lib/orber/test/cdrlib_SUITE.erl
+++ b/lib/orber/test/cdrlib_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -25,19 +25,19 @@
%%-----------------------------------------------------------------
-module(cdrlib_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(default_timeout, ?t:minutes(3)).
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
%%-----------------------------------------------------------------
%% Internal exports
%%-----------------------------------------------------------------
--export([]).
-compile(export_all).
%%-----------------------------------------------------------------
@@ -45,10 +45,27 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["Description", "more description"];
-all(suite) ->
- [short, ushort, long, ulong, longlong, ulonglong, boolean, character, octet,
- float, double, enum].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [short, ushort, long, ulong, longlong, ulonglong,
+ boolean, character, octet, float, double, enum].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%-----------------------------------------------------------------
%% Init and cleanup functions.
@@ -59,7 +76,7 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/orber/test/corba_SUITE.erl b/lib/orber/test/corba_SUITE.erl
index dae8fcbefc..17a9f5fcdf 100644
--- a/lib/orber/test/corba_SUITE.erl
+++ b/lib/orber/test/corba_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -25,7 +25,7 @@
%%-----------------------------------------------------------------
-module(corba_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
-include_lib("orber/COSS/CosNaming/CosNaming.hrl").
-include_lib("orber/src/orber_iiop.hrl").
@@ -51,7 +51,7 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]).
%%-----------------------------------------------------------------
%% Internal exports
@@ -64,18 +64,29 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["API tests for the CORBA/BOA/Object/orber interfaces", ""];
-all(suite) -> {req,
- [mnesia],
- {conf, init_all, cases(), finish_all}}.
-
-cases() ->
- [exception_info_api, corba_api, object_api, orber_api,
- orber_objectkeys_api, orber_pseudo_objects, callback_ok_api,
- callback_arity_api, callback_module_api, callback_function_api,
- callback_precond_api, callback_postcond_api, callback_exit_api,
- callback_badarith_api, callback_case_clause_api,
- callback_function_clause_api].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
+ [exception_info_api, corba_api, object_api, orber_api,
+ orber_objectkeys_api, orber_pseudo_objects,
+ callback_ok_api, callback_arity_api,
+ callback_module_api, callback_function_api,
+ callback_precond_api, callback_postcond_api,
+ callback_exit_api, callback_badarith_api,
+ callback_case_clause_api, callback_function_clause_api].
%% boa_api, request, locate_request, locate_reply].
@@ -90,14 +101,14 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Path = code:which(?MODULE),
code:del_path(filename:join(filename:dirname(Path), "idl_output")),
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-init_all(Config) ->
+init_per_suite(Config) ->
corba:orb_init([{orber_debug_level, 10}, {giop_version, {1,2}},
{iiop_port, 0}]),
mnesia:delete_schema([node()]),
@@ -112,7 +123,7 @@ init_all(Config) ->
exit("Config not a list")
end.
-finish_all(Config) ->
+end_per_suite(Config) ->
application:stop(orber),
application:stop(mnesia),
mnesia:delete_schema([node()]),
diff --git a/lib/orber/test/csiv2_SUITE.erl b/lib/orber/test/csiv2_SUITE.erl
index 8103fd81ac..95cd8c56b3 100644
--- a/lib/orber/test/csiv2_SUITE.erl
+++ b/lib/orber/test/csiv2_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -20,7 +20,7 @@
-module(csiv2_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
-include_lib("orber/COSS/CosNaming/CosNaming.hrl").
-include_lib("orber/src/orber_iiop.hrl").
@@ -272,8 +272,9 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1, cases/0, init_all/1, finish_all/1,
- init_per_testcase/2, fin_per_testcase/2,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2, cases/0,
+ init_per_suite/1, end_per_suite/1,
+ init_per_testcase/2, end_per_testcase/2,
% code_CertificateChain_api/1,
% code_AttributeCertChain_api/1,
% code_VerifyingCertChain_api/1,
@@ -316,46 +317,26 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["API tests for multi orber interfaces using CSIv2"];
-all(suite) -> {req,
- [mnesia],
- {conf, init_all, cases(), finish_all}}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% NOTE - the fragment test cases must bu first since we explicitly set a request
%% id. Otherwise, the request-id counter would be increased and we cannot know
%% what it is.
-cases() ->
- [
-% code_CertificateChain_api,
-% code_AttributeCertChain_api,
-% code_VerifyingCertChain_api,
-% code_AttributeCertificate_api,
-% code_Certificate_api,
-% code_TBSCertificate_api,
-% code_CertificateSerialNumber_api,
-% code_Version_api,
-% code_AlgorithmIdentifier_api,
-% code_Name_api,
-% code_RDNSequence_api,
-% code_RelativeDistinguishedName_api,
-% code_AttributeTypeAndValue_api,
-% code_Attribute_api,
-% code_Validity_api,
-% code_SubjectPublicKeyInfo_api,
-% code_UniqueIdentifier_api,
-% code_Extensions_api,
-% code_Extension_api,
-% code_AttributeCertificateInfo_api,
-% code_AttCertVersion_api,
-% code_Holder_api,
-% code_AttCertIssuer_api,
-% code_AttCertValidityPeriod_api,
-% code_V2Form_api,
-% code_IssuerSerial_api,
-% code_ObjectDigestInfo_api,
-% code_OpenSSL509_api,
- ssl_server_peercert_api,
- ssl_client_peercert_api].
+cases() ->
+ [ssl_server_peercert_api, ssl_client_peercert_api].
%%-----------------------------------------------------------------
%% Init and cleanup functions.
@@ -370,7 +351,7 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
oe_orber_test_server:oe_unregister(),
orber:jump_stop(),
Path = code:which(?MODULE),
@@ -379,15 +360,15 @@ fin_per_testcase(_Case, Config) ->
test_server:timetrap_cancel(Dog),
ok.
-init_all(Config) ->
- if
- is_list(Config) ->
- Config;
- true ->
- exit("Config not a list")
+init_per_suite(Config) ->
+ case orber_test_lib:ssl_version() of
+ no_ssl ->
+ {skip,"SSL is not installed!"};
+ _ ->
+ Config
end.
-finish_all(Config) ->
+end_per_suite(Config) ->
Config.
%%-----------------------------------------------------------------
@@ -694,8 +675,8 @@ ssl_server_peercert_api(_Config) ->
{ok, Socket} =
?match({ok, _}, fake_client_ORB(ssl, ServerHost, ServerPort, SSLOptions)),
{ok, _PeerCert} = ?match({ok, _}, orber_socket:peercert(ssl, Socket)),
- ?match({ok, {rdnSequence, _}}, orber_socket:peercert(ssl, Socket, [pkix, subject])),
- ?match({ok, {rdnSequence, _}}, orber_socket:peercert(ssl, Socket, [ssl, subject])),
+%% ?match({ok, {rdnSequence, _}}, orber_socket:peercert(ssl, Socket, [pkix, subject])),
+%% ?match({ok, {rdnSequence, _}}, orber_socket:peercert(ssl, Socket, [ssl, subject])),
% ?match({ok, #'Certificate'{}},
% 'OrberCSIv2':decode('Certificate', PeerCert)),
destroy_fake_ORB(ssl, Socket),
@@ -734,8 +715,8 @@ ssl_client_peercert_api(_Config) ->
?match(ok, ssl:ssl_accept(Socket)),
{ok, _PeerCert} = ?match({ok, _}, orber_socket:peercert(ssl, Socket)),
- ?match({ok, {rdnSequence, _}}, orber_socket:peercert(ssl, Socket, [pkix, subject])),
- ?match({ok, {rdnSequence, _}}, orber_socket:peercert(ssl, Socket, [ssl, subject])),
+%% ?match({ok, {rdnSequence, _}}, orber_socket:peercert(ssl, Socket, [pkix, subject])),
+%% ?match({ok, {rdnSequence, _}}, orber_socket:peercert(ssl, Socket, [ssl, subject])),
% ?match({ok, #'Certificate'{}},
% 'OrberCSIv2':decode('Certificate', PeerCert)),
ssl:close(Socket),
diff --git a/lib/orber/test/data_types_SUITE.erl b/lib/orber/test/data_types_SUITE.erl
index 1feb0b3b58..9d436aaf1b 100644
--- a/lib/orber/test/data_types_SUITE.erl
+++ b/lib/orber/test/data_types_SUITE.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
@@ -25,7 +25,7 @@
-module(data_types_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
-define(default_timeout, ?t:minutes(3)).
@@ -48,12 +48,12 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
%%-----------------------------------------------------------------
%% Internal exports
%%-----------------------------------------------------------------
--export([]).
-compile(export_all).
%%-----------------------------------------------------------------
@@ -61,10 +61,27 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["This suite is for testing more or less complex data types"];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[fixed_type, any_type].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%-----------------------------------------------------------------
%% Init and cleanup functions.
%%-----------------------------------------------------------------
@@ -75,7 +92,7 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Path = code:which(?MODULE),
code:del_path(filename:join(filename:dirname(Path), "idl_output")),
Dog = ?config(watchdog, Config),
diff --git a/lib/orber/test/generated_SUITE.erl b/lib/orber/test/generated_SUITE.erl
index 1cd1674fc4..a6bcff88dc 100644
--- a/lib/orber/test/generated_SUITE.erl
+++ b/lib/orber/test/generated_SUITE.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -25,7 +25,7 @@
-module(generated_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
-define(default_timeout, ?t:minutes(3)).
@@ -71,7 +71,8 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
%%-----------------------------------------------------------------
%% Internal exports
@@ -84,16 +85,37 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["This suite is for testing IC generated files"];
-all(suite) ->
- ['OrberApp_IFR',
- erlang_binary, erlang_pid, erlang_port, erlang_ref,
- 'CosNaming_Binding', 'CosNaming_BindingList', 'CosNaming_Name',
- 'CosNaming_NameComponent', 'CosNaming_NamingContextExt_InvalidAddress',
- 'CosNaming_NamingContext_AlreadyBound', 'CosNaming_NamingContext_CannotProceed',
- 'CosNaming_NamingContext_InvalidName', 'CosNaming_NamingContext_NotEmpty',
- 'CosNaming_NamingContext_NotFound', 'CosNaming_BindingIterator',
- 'CosNaming_NamingContext', 'CosNaming_NamingContextExt'].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ ['OrberApp_IFR', erlang_binary, erlang_pid, erlang_port,
+ erlang_ref, 'CosNaming_Binding',
+ 'CosNaming_BindingList', 'CosNaming_Name',
+ 'CosNaming_NameComponent',
+ 'CosNaming_NamingContextExt_InvalidAddress',
+ 'CosNaming_NamingContext_AlreadyBound',
+ 'CosNaming_NamingContext_CannotProceed',
+ 'CosNaming_NamingContext_InvalidName',
+ 'CosNaming_NamingContext_NotEmpty',
+ 'CosNaming_NamingContext_NotFound',
+ 'CosNaming_BindingIterator', 'CosNaming_NamingContext',
+ 'CosNaming_NamingContextExt'].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%-----------------------------------------------------------------
%% Init and cleanup functions.
@@ -103,7 +125,7 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/orber/test/iiop_module_do_test_impl.erl b/lib/orber/test/iiop_module_do_test_impl.erl
index bf171a3097..54fcd8239a 100644
--- a/lib/orber/test/iiop_module_do_test_impl.erl
+++ b/lib/orber/test/iiop_module_do_test_impl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2010. 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
diff --git a/lib/orber/test/iiop_module_test_impl.erl b/lib/orber/test/iiop_module_test_impl.erl
index fe334e1b26..2096c14a23 100644
--- a/lib/orber/test/iiop_module_test_impl.erl
+++ b/lib/orber/test/iiop_module_test_impl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2010. 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
diff --git a/lib/orber/test/iiop_test_impl.erl b/lib/orber/test/iiop_test_impl.erl
index fd92109c09..234f7c5f73 100644
--- a/lib/orber/test/iiop_test_impl.erl
+++ b/lib/orber/test/iiop_test_impl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2010. 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
diff --git a/lib/orber/test/interceptors_SUITE.erl b/lib/orber/test/interceptors_SUITE.erl
index 27e23a9433..ade0183ddd 100644
--- a/lib/orber/test/interceptors_SUITE.erl
+++ b/lib/orber/test/interceptors_SUITE.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -25,7 +25,7 @@
-module(interceptors_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
-include_lib("orber/src/orber_iiop.hrl").
@@ -65,7 +65,8 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
%%-----------------------------------------------------------------
%% Internal exports
@@ -78,10 +79,27 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["This suite is for testing Orber Interceptors"];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[local_pseudo, local_default, local_local, local_global].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%-----------------------------------------------------------------
%% Init and cleanup functions.
%%-----------------------------------------------------------------
@@ -96,7 +114,7 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
oe_orber_test_server:oe_unregister(),
orber:jump_stop(),
Path = code:which(?MODULE),
diff --git a/lib/orber/test/iop_ior_10_SUITE.erl b/lib/orber/test/iop_ior_10_SUITE.erl
index 1000c7f113..58dd1b5dba 100644
--- a/lib/orber/test/iop_ior_10_SUITE.erl
+++ b/lib/orber/test/iop_ior_10_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -25,7 +25,7 @@
%%-----------------------------------------------------------------
-module(iop_ior_10_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/src/orber_iiop.hrl").
-define(default_timeout, ?t:minutes(3)).
@@ -33,7 +33,8 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
%%-----------------------------------------------------------------
%% Internal exports
@@ -46,10 +47,27 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["Description", "more description"];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[encoding, create_and_get_ops].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%-----------------------------------------------------------------
%% Init and cleanup functions.
%%-----------------------------------------------------------------
@@ -59,7 +77,7 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/orber/test/iop_ior_11_SUITE.erl b/lib/orber/test/iop_ior_11_SUITE.erl
index 35d01789ee..24b2f66357 100644
--- a/lib/orber/test/iop_ior_11_SUITE.erl
+++ b/lib/orber/test/iop_ior_11_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -25,7 +25,7 @@
%%-----------------------------------------------------------------
-module(iop_ior_11_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/src/orber_iiop.hrl").
-define(default_timeout, ?t:minutes(3)).
@@ -33,7 +33,8 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
%%-----------------------------------------------------------------
%% Internal exports
@@ -46,10 +47,27 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["Description", "more description"];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[encoding, create_and_get_ops].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%-----------------------------------------------------------------
%% Init and cleanup functions.
%%-----------------------------------------------------------------
@@ -59,7 +77,7 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/orber/test/iop_ior_12_SUITE.erl b/lib/orber/test/iop_ior_12_SUITE.erl
index 42db130e54..4c6e9ddb91 100644
--- a/lib/orber/test/iop_ior_12_SUITE.erl
+++ b/lib/orber/test/iop_ior_12_SUITE.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -26,7 +26,7 @@
-module(iop_ior_12_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/src/orber_iiop.hrl").
-define(default_timeout, ?t:minutes(3)).
@@ -34,7 +34,8 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
%%-----------------------------------------------------------------
%% Internal exports
@@ -47,10 +48,27 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["Description", "more description"];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[encoding, create_and_get_ops].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%-----------------------------------------------------------------
%% Init and cleanup functions.
%%-----------------------------------------------------------------
@@ -60,7 +78,7 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/orber/test/lname_SUITE.erl b/lib/orber/test/lname_SUITE.erl
index d1f0e7cf0e..6a3bc1fae2 100644
--- a/lib/orber/test/lname_SUITE.erl
+++ b/lib/orber/test/lname_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -25,7 +25,7 @@
%%-----------------------------------------------------------------
-module(lname_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/COSS/CosNaming/CosNaming.hrl").
-include_lib("orber/COSS/CosNaming/lname.hrl").
@@ -34,7 +34,8 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
%%-----------------------------------------------------------------
%% Internal exports
@@ -47,10 +48,27 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["Description", "more description"];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[lname_component, lname].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%-----------------------------------------------------------------
%% Init and cleanup functions.
%%-----------------------------------------------------------------
@@ -60,7 +78,7 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/orber/test/multi_ORB_SUITE.erl b/lib/orber/test/multi_ORB_SUITE.erl
index d1931f5393..608fb23f3e 100644
--- a/lib/orber/test/multi_ORB_SUITE.erl
+++ b/lib/orber/test/multi_ORB_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -20,7 +20,7 @@
-module(multi_ORB_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
-include_lib("orber/COSS/CosNaming/CosNaming.hrl").
-include_lib("orber/src/orber_iiop.hrl").
@@ -50,8 +50,9 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1, cases/0, init_all/1, finish_all/1, basic_PI_api/1, multi_orber_api/1,
- init_per_testcase/2, fin_per_testcase/2, multi_pseudo_orber_api/1,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2, cases/0,
+ init_per_suite/1, end_per_suite/1, basic_PI_api/1, multi_orber_api/1,
+ init_per_testcase/2, end_per_testcase/2, multi_pseudo_orber_api/1,
light_orber_api/1, light_orber2_api/1,
ssl_1_multi_orber_api/1, ssl_2_multi_orber_api/1, ssl_reconfigure_api/1,
iiop_timeout_api/1, iiop_timeout_added_api/1, setup_connection_timeout_api/1,
@@ -86,75 +87,93 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["API tests for multi orber interfaces",
- "This suite test intra-ORB communication. There are three scenarios:",
- "* No security at all (multi_orber_api)",
- "* Two secure orbs using ssl (ssl_multi_orb_api)",
- "* One secure and one orb with no security. (ssl_multi_orb_api)"];
-all(suite) -> {req,
- [mnesia],
- {conf, init_all, cases(), finish_all}}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% NOTE - the fragment test cases must be first since we explicitly set a request
%% id. Otherwise, the request-id counter would be increased and we cannot know
%% what it is.
-cases() ->
- [fragments_server_api,
- fragments_max_server_api,
- fragments_max_server_added_api,
- fragments_client_api,
- flags_added_api,
- bad_fragment_id_client_api,
- bad_giop_header_api,
- bad_id_cancel_request_api,
- implicit_context_api,
- pseudo_implicit_context_api,
+cases() ->
+ [fragments_server_api, fragments_max_server_api,
+ fragments_max_server_added_api, fragments_client_api,
+ flags_added_api, bad_fragment_id_client_api,
+ bad_giop_header_api, bad_id_cancel_request_api,
+ implicit_context_api, pseudo_implicit_context_api,
pseudo_two_implicit_context_api,
implicit_context_roundtrip_api,
- oneway_implicit_context_api,
+ oneway_implicit_context_api,
oneway_pseudo_implicit_context_api,
oneway_pseudo_two_implicit_context_api,
- proxy_interface_api,
- proxy_interface_ipv6_api,
- local_interface_api,
- local_interface_ctx_override_api,
- local_interface_acl_override_api,
- close_connections_api,
+ proxy_interface_api, proxy_interface_ipv6_api,
+ local_interface_api, local_interface_ctx_override_api,
+ local_interface_acl_override_api, close_connections_api,
close_connections_local_interface_api,
close_connections_local_interface_ctx_override_api,
close_connections_alt_iiop_addr_api,
close_connections_multiple_profiles_api,
- multiple_accept_api,
- max_requests_api,
- max_requests_added_api,
- max_connections_api,
- max_packet_size_exceeded_api,
- max_packet_size_ok_api,
- light_ifr_api,
- multi_pseudo_orber_api,
- multi_orber_api,
- light_orber_api,
- light_orber2_api,
- basic_PI_api,
- iiop_timeout_api,
- iiop_timeout_added_api,
- setup_connection_timeout_api,
- setup_multi_connection_timeout_api,
- setup_multi_connection_timeout_attempts_api,
- setup_multi_connection_timeout_random_api,
+ multiple_accept_api, max_requests_api,
+ max_requests_added_api, max_connections_api,
+ max_packet_size_exceeded_api, max_packet_size_ok_api,
+ light_ifr_api, multi_pseudo_orber_api, multi_orber_api,
+ light_orber_api, light_orber2_api, basic_PI_api,
+ iiop_timeout_api, iiop_timeout_added_api,
+ setup_connection_timeout_api,
+ setup_multi_connection_timeout_api,
+ setup_multi_connection_timeout_attempts_api,
+ setup_multi_connection_timeout_random_api,
ssl_1_multi_orber_api,
ssl_1_multi_orber_generation_3_api,
ssl_2_multi_orber_api,
ssl_2_multi_orber_generation_3_api,
- ssl_reconfigure_generation_3_api,
- ssl_reconfigure_api
- ].
+ ssl_reconfigure_generation_3_api, ssl_reconfigure_api].
%%-----------------------------------------------------------------
%% Init and cleanup functions.
%%-----------------------------------------------------------------
-
+init_per_testcase(TC,Config)
+ when TC =:= ssl_1_multi_orber_api;
+ TC =:= ssl_2_multi_orber_api;
+ TC =:= ssl_reconfigure_api ->
+ init_ssl(Config);
+init_per_testcase(TC,Config)
+ when TC =:= ssl_1_multi_orber_generation_3_api;
+ TC =:= ssl_2_multi_orber_generation_3_api;
+ TC =:= ssl_reconfigure_generation_3_api ->
+ init_ssl_3(Config);
init_per_testcase(_Case, Config) ->
+ init_all(Config).
+
+init_ssl(Config) ->
+ case orber_test_lib:ssl_version() of
+ no_ssl ->
+ {skip,"SSL is not installed!"};
+ _ ->
+ init_all(Config)
+ end.
+
+init_ssl_3(Config) ->
+ case orber_test_lib:ssl_version() of
+ 3 ->
+ init_all(Config);
+ 2 ->
+ {skip,"Could not find the correct SSL version!"};
+ no_ssl ->
+ {skip,"SSL is not installed!"}
+ end.
+
+init_all(Config) ->
Path = code:which(?MODULE),
code:add_pathz(filename:join(filename:dirname(Path), "idl_output")),
Dog=test_server:timetrap(?default_timeout),
@@ -163,7 +182,7 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
oe_orber_test_server:oe_unregister(),
orber:jump_stop(),
Path = code:which(?MODULE),
@@ -172,7 +191,7 @@ fin_per_testcase(_Case, Config) ->
test_server:timetrap_cancel(Dog),
ok.
-init_all(Config) ->
+init_per_suite(Config) ->
if
is_list(Config) ->
Config;
@@ -180,7 +199,7 @@ init_all(Config) ->
exit("Config not a list")
end.
-finish_all(Config) ->
+end_per_suite(Config) ->
Config.
%%-----------------------------------------------------------------
@@ -1372,7 +1391,7 @@ light_orber2_api(_Config) ->
LocalHost = net_adm:localhost(),
{ok, Node, _Host} =
?match({ok,_,_}, orber_test_lib:js_node([],
- {lightweigth, ["iiop://"++LocalHost++":"++integer_to_list(orber:iiop_port())]})),
+ {lightweight, ["iiop://"++LocalHost++":"++integer_to_list(orber:iiop_port())]})),
?match(ok, orber:info(io)),
?match([_], orber_test_lib:remote_apply(Node, orber_env, get_lightweight_nodes,[])),
@@ -1580,17 +1599,11 @@ ssl_1_multi_orber_api(doc) -> ["SECURE MULTI ORB API tests (SSL depth 1)",
"secure orbs which must raise a NO_PERMISSION exception."];
ssl_1_multi_orber_api(suite) -> [];
ssl_1_multi_orber_api(_Config) ->
- case os:type() of
- vxworks ->
- {skipped, "No SSL-support for VxWorks."};
- _ ->
- ServerOptions = orber_test_lib:get_options(iiop_ssl, server,
- 1, [{iiop_ssl_port, 0}]),
- ClientOptions = orber_test_lib:get_options(iiop_ssl, client,
- 1, [{iiop_ssl_port, 0}]),
- ssl_suite(ServerOptions, ClientOptions),
- ok
- end.
+ ServerOptions = orber_test_lib:get_options(iiop_ssl, server,
+ 1, [{iiop_ssl_port, 0}]),
+ ClientOptions = orber_test_lib:get_options(iiop_ssl, client,
+ 1, [{iiop_ssl_port, 0}]),
+ ssl_suite(ServerOptions, ClientOptions).
ssl_1_multi_orber_generation_3_api(doc) -> ["SECURE MULTI ORB API tests (SSL depth 1)",
"This case set up two secure orbs and test if they can",
@@ -1598,24 +1611,14 @@ ssl_1_multi_orber_generation_3_api(doc) -> ["SECURE MULTI ORB API tests (SSL dep
"secure orbs which must raise a NO_PERMISSION exception."];
ssl_1_multi_orber_generation_3_api(suite) -> [];
ssl_1_multi_orber_generation_3_api(_Config) ->
- case os:type() of
- vxworks ->
- {skipped, "No SSL-support for VxWorks."};
- _ ->
- case orber_test_lib:ssl_version() of
- 3 ->
- ServerOptions = orber_test_lib:get_options(iiop_ssl, server,
- 1, [{ssl_generation, 3},
- {iiop_ssl_port, 0}]),
- ClientOptions = orber_test_lib:get_options(iiop_ssl, client,
- 1, [{ssl_generation, 3},
- {iiop_ssl_port, 0}]),
- ssl_suite(ServerOptions, ClientOptions),
- ok;
- _ ->
- {skipped, "Required SSL generation not available"}
- end
- end.
+
+ ServerOptions = orber_test_lib:get_options(iiop_ssl, server,
+ 1, [{ssl_generation, 3},
+ {iiop_ssl_port, 0}]),
+ ClientOptions = orber_test_lib:get_options(iiop_ssl, client,
+ 1, [{ssl_generation, 3},
+ {iiop_ssl_port, 0}]),
+ ssl_suite(ServerOptions, ClientOptions).
%%-----------------------------------------------------------------
@@ -1628,17 +1631,12 @@ ssl_2_multi_orber_api(doc) -> ["SECURE MULTI ORB API tests (SSL depth 2)",
"secure orbs which must raise a NO_PERMISSION exception."];
ssl_2_multi_orber_api(suite) -> [];
ssl_2_multi_orber_api(_Config) ->
- case os:type() of
- vxworks ->
- {skipped, "No SSL-support for VxWorks."};
- _ ->
- ServerOptions = orber_test_lib:get_options(iiop_ssl, server,
- 2, [{iiop_ssl_port, 0}]),
- ClientOptions = orber_test_lib:get_options(iiop_ssl, client,
- 2, [{iiop_ssl_port, 0}]),
- ssl_suite(ServerOptions, ClientOptions),
- ok
- end.
+
+ ServerOptions = orber_test_lib:get_options(iiop_ssl, server,
+ 2, [{iiop_ssl_port, 0}]),
+ ClientOptions = orber_test_lib:get_options(iiop_ssl, client,
+ 2, [{iiop_ssl_port, 0}]),
+ ssl_suite(ServerOptions, ClientOptions).
ssl_2_multi_orber_generation_3_api(doc) -> ["SECURE MULTI ORB API tests (SSL depth 2)",
"This case set up two secure orbs and test if they can",
@@ -1646,24 +1644,14 @@ ssl_2_multi_orber_generation_3_api(doc) -> ["SECURE MULTI ORB API tests (SSL dep
"secure orbs which must raise a NO_PERMISSION exception."];
ssl_2_multi_orber_generation_3_api(suite) -> [];
ssl_2_multi_orber_generation_3_api(_Config) ->
- case os:type() of
- vxworks ->
- {skipped, "No SSL-support for VxWorks."};
- _ ->
- case orber_test_lib:ssl_version() of
- 3 ->
- ServerOptions = orber_test_lib:get_options(iiop_ssl, server,
- 2, [{ssl_generation, 3},
- {iiop_ssl_port, 0}]),
- ClientOptions = orber_test_lib:get_options(iiop_ssl, client,
- 2, [{ssl_generation, 3},
- {iiop_ssl_port, 0}]),
- ssl_suite(ServerOptions, ClientOptions),
- ok;
- _ ->
- {skipped, "Required SSL generation not available"}
- end
- end.
+
+ ServerOptions = orber_test_lib:get_options(iiop_ssl, server,
+ 2, [{ssl_generation, 3},
+ {iiop_ssl_port, 0}]),
+ ClientOptions = orber_test_lib:get_options(iiop_ssl, client,
+ 2, [{ssl_generation, 3},
+ {iiop_ssl_port, 0}]),
+ ssl_suite(ServerOptions, ClientOptions).
%%-----------------------------------------------------------------
%% API tests for ORB to ORB, ssl security depth 2
%%-----------------------------------------------------------------
@@ -1682,69 +1670,57 @@ ssl_reconfigure_generation_3_api(doc) -> ["SECURE MULTI ORB API tests (SSL depth
"secure orbs which must raise a NO_PERMISSION exception."];
ssl_reconfigure_generation_3_api(suite) -> [];
ssl_reconfigure_generation_3_api(_Config) ->
- case orber_test_lib:ssl_version() of
- 3 ->
- ssl_reconfigure([{ssl_generation, 3}]);
-
- _ ->
- {skipped, "Required SSL generation not available"}
- end.
+ ssl_reconfigure([{ssl_generation, 3}]).
ssl_reconfigure(ExtraSSLOptions) ->
- case os:type() of
- vxworks ->
- {skipped, "No SSL-support for VxWorks."};
- _ ->
- IP = orber_test_lib:get_host(),
- Loopback = orber_test_lib:get_loopback_interface(),
- {ok, ServerNode, _ServerHost} =
- ?match({ok,_,_},
- orber_test_lib:js_node([{iiop_port, 0},
- {flags, ?ORB_ENV_LOCAL_INTERFACE},
- {ip_address, IP}|ExtraSSLOptions])),
- orber_test_lib:remote_apply(ServerNode, ssl, start, []),
- orber_test_lib:remote_apply(ServerNode, crypto, start, []),
- orber_test_lib:remote_apply(ServerNode, ssl, seed, ["testing"]),
- ?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
- install_test_data,
- [ssl])),
- ?match({ok, _},
- orber_test_lib:remote_apply(ServerNode, orber,
- add_listen_interface,
- [Loopback, normal, [{iiop_port, 5648},
- {iiop_ssl_port, 5649},
- {interceptors, {native, [orber_iiop_tracer_silent]}}|ExtraSSLOptions]])),
- ServerOptions = orber_test_lib:get_options(iiop_ssl, server,
- 2, [{flags, ?ORB_ENV_LOCAL_INTERFACE},
- {iiop_port, 5648},
+
+ IP = orber_test_lib:get_host(),
+ Loopback = orber_test_lib:get_loopback_interface(),
+ {ok, ServerNode, _ServerHost} =
+ ?match({ok,_,_},
+ orber_test_lib:js_node([{iiop_port, 0},
+ {flags, ?ORB_ENV_LOCAL_INTERFACE},
+ {ip_address, IP}|ExtraSSLOptions])),
+ orber_test_lib:remote_apply(ServerNode, ssl, start, []),
+ orber_test_lib:remote_apply(ServerNode, crypto, start, []),
+ orber_test_lib:remote_apply(ServerNode, ssl, seed, ["testing"]),
+ ?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
+ install_test_data,
+ [ssl])),
+ ?match({ok, _},
+ orber_test_lib:remote_apply(ServerNode, orber,
+ add_listen_interface,
+ [Loopback, normal, [{iiop_port, 5648},
{iiop_ssl_port, 5649},
- {interceptors, {native, [orber_iiop_tracer_silent]}}|ExtraSSLOptions]),
- ?match({ok, _},
- orber_test_lib:remote_apply(ServerNode, orber,
- add_listen_interface,
- [Loopback, ssl, ServerOptions])),
-
- ClientOptions = orber_test_lib:get_options(iiop_ssl, client,
- 2, [{iiop_ssl_port, 0}|ExtraSSLOptions]),
- {ok, ClientNode, _ClientHost} =
- ?match({ok,_,_}, orber_test_lib:js_node(ClientOptions)),
-
- ?match(ok, orber_test_lib:remote_apply(ClientNode, orber_test_lib,
- install_test_data,
- [ssl])),
- orber_test_lib:remote_apply(ClientNode, ssl, start, []),
- orber_test_lib:remote_apply(ServerNode, crypto, start, []),
- orber_test_lib:remote_apply(ClientNode, ssl, seed, ["testing"]),
- Obj = ?match(#'IOP_IOR'{},
- orber_test_lib:remote_apply(ClientNode, corba,
- string_to_object, ["corbaname:iiop:1.1@"++Loopback++":5648/NameService#mamba",
- [{context, [#'IOP_ServiceContext'{context_id=?ORBER_GENERIC_CTX_ID,
- context_data = {configuration, ClientOptions}}]}]])),
- ?match(ok, orber_test_lib:remote_apply(ClientNode, orber_test_server,
- print, [Obj])),
-
- ok
- end.
+ {interceptors, {native, [orber_iiop_tracer_silent]}}|ExtraSSLOptions]])),
+ ServerOptions = orber_test_lib:get_options(iiop_ssl, server,
+ 2, [{flags, ?ORB_ENV_LOCAL_INTERFACE},
+ {iiop_port, 5648},
+ {iiop_ssl_port, 5649},
+ {interceptors, {native, [orber_iiop_tracer_silent]}}|ExtraSSLOptions]),
+ ?match({ok, _},
+ orber_test_lib:remote_apply(ServerNode, orber,
+ add_listen_interface,
+ [Loopback, ssl, ServerOptions])),
+
+ ClientOptions = orber_test_lib:get_options(iiop_ssl, client,
+ 2, [{iiop_ssl_port, 0}|ExtraSSLOptions]),
+ {ok, ClientNode, _ClientHost} =
+ ?match({ok,_,_}, orber_test_lib:js_node(ClientOptions)),
+
+ ?match(ok, orber_test_lib:remote_apply(ClientNode, orber_test_lib,
+ install_test_data,
+ [ssl])),
+ orber_test_lib:remote_apply(ClientNode, ssl, start, []),
+ orber_test_lib:remote_apply(ServerNode, crypto, start, []),
+ orber_test_lib:remote_apply(ClientNode, ssl, seed, ["testing"]),
+ Obj = ?match(#'IOP_IOR'{},
+ orber_test_lib:remote_apply(ClientNode, corba,
+ string_to_object, ["corbaname:iiop:1.1@"++Loopback++":5648/NameService#mamba",
+ [{context, [#'IOP_ServiceContext'{context_id=?ORBER_GENERIC_CTX_ID,
+ context_data = {configuration, ClientOptions}}]}]])),
+ ?match(ok, orber_test_lib:remote_apply(ClientNode, orber_test_server,
+ print, [Obj])).
diff --git a/lib/orber/test/naming_context_SUITE.erl b/lib/orber/test/naming_context_SUITE.erl
index 4406e01d5a..789aace882 100644
--- a/lib/orber/test/naming_context_SUITE.erl
+++ b/lib/orber/test/naming_context_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -25,7 +25,7 @@
%%-----------------------------------------------------------------
-module(naming_context_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/COSS/CosNaming/CosNaming.hrl").
-include_lib("orber/src/orber_iiop.hrl").
-include_lib("orber/include/corba.hrl").
@@ -35,7 +35,7 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]).
%%-----------------------------------------------------------------
%% Internal exports
@@ -43,7 +43,8 @@
-export([name_context/1, check_list/1, name_context_ext/1]).
--export([init_all/1, finish_all/1, init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_suite/1, end_per_suite/1, init_per_testcase/2,
+ end_per_testcase/2]).
%%-----------------------------------------------------------------
@@ -75,12 +76,22 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["Description", "more description"];
-all(suite) -> {req,
- [mnesia],
- {conf, init_all, cases(), finish_all}}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
-cases() ->
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
[name_context, check_list, name_context_ext].
%%-----------------------------------------------------------------
@@ -95,7 +106,7 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Path = code:which(?MODULE),
code:del_path(filename:join(filename:dirname(Path), "idl_output")),
orber:jump_stop(),
@@ -103,10 +114,10 @@ fin_per_testcase(_Case, Config) ->
test_server:timetrap_cancel(Dog),
ok.
-init_all(Config) ->
+init_per_suite(Config) ->
Config.
-finish_all(Config) ->
+end_per_suite(Config) ->
Config.
%%-----------------------------------------------------------------
diff --git a/lib/orber/test/orber.cover b/lib/orber/test/orber.cover
new file mode 100644
index 0000000000..807a7c2c6e
--- /dev/null
+++ b/lib/orber/test/orber.cover
@@ -0,0 +1,2 @@
+{incl_app,orber,details}.
+
diff --git a/lib/orber/test/orber.spec b/lib/orber/test/orber.spec
index 9d19ea7fc1..0dd30deade 100644
--- a/lib/orber/test/orber.spec
+++ b/lib/orber/test/orber.spec
@@ -1,19 +1 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2010. 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%
-%%
-{topcase, {dir, "../orber_test"}}.
+{suites,"../orber_test",all}.
diff --git a/lib/orber/test/orber_SUITE.erl b/lib/orber/test/orber_SUITE.erl
index f54da02c0e..be6ffa201c 100644
--- a/lib/orber/test/orber_SUITE.erl
+++ b/lib/orber/test/orber_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -18,15 +18,16 @@
%%
%%
-module(orber_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(default_timeout, ?t:minutes(15)).
-define(application, orber).
% Test server specific exports
--export([all/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
% Test cases must be exported.
-export([app_test/1, undefined_functions/1, install_load_order/1,
@@ -35,17 +36,33 @@
%%
%% all/1
%%
-all(doc) ->
- [];
-all(suite) ->
- [app_test, undefined_functions,
- install_load_order, install_local_content].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [app_test, undefined_functions, install_load_order,
+ install_local_content].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Case, Config) ->
?line Dog=test_server:timetrap(?default_timeout),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/orber/test/orber_acl_SUITE.erl b/lib/orber/test/orber_acl_SUITE.erl
index 2c2a768af2..b43a00be19 100644
--- a/lib/orber/test/orber_acl_SUITE.erl
+++ b/lib/orber/test/orber_acl_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -25,7 +25,7 @@
%%-----------------------------------------------------------------
-module(orber_acl_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(default_timeout, ?t:minutes(5)).
@@ -47,7 +47,7 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]).
%%-----------------------------------------------------------------
%% Internal exports
@@ -59,15 +59,26 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["Testing API for ACL (Access Control List)"];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[ipv4_verify, ipv4_range, ipv4_interfaces, ipv4_bm,
ipv6_verify, ipv6_range, ipv6_interfaces, ipv6_bm].
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%-----------------------------------------------------------------
%% Init and cleanup functions.
%%-----------------------------------------------------------------
-init_all(Config) ->
+init_per_suite(Config) ->
if
list(Config) ->
Config;
@@ -75,7 +86,7 @@ init_all(Config) ->
exit("Config not a list")
end.
-finish_all(Config) ->
+end_per_suite(Config) ->
Config.
@@ -84,7 +95,7 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/orber/test/orber_firewall_ipv4_in_SUITE.erl b/lib/orber/test/orber_firewall_ipv4_in_SUITE.erl
index 3ac0cb7921..0175409a5b 100644
--- a/lib/orber/test/orber_firewall_ipv4_in_SUITE.erl
+++ b/lib/orber/test/orber_firewall_ipv4_in_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -20,7 +20,7 @@
-module(orber_firewall_ipv4_in_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
-include_lib("orber/COSS/CosNaming/CosNaming.hrl").
-include_lib("orber/src/orber_iiop.hrl").
@@ -49,8 +49,9 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1, cases/0, init_all/1, finish_all/1,
- init_per_testcase/2, fin_per_testcase/2,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2, cases/0,
+ init_per_suite/1, end_per_suite/1,
+ init_per_testcase/2, end_per_testcase/2,
deny_port_api/1, deny_port_range_api/1, deny_host_api/1,
deny_peerhost_api/1, allow_port_range_api/1,
allow_host_api/1, allow_peerhost_api/1, check_address_api/1]).
@@ -60,17 +61,28 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["API tests for orber's firewall functionallity."];
-all(suite) -> {req,
- [mnesia],
- {conf, init_all, cases(), finish_all}}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% NOTE - the fragment test cases must bu first since we explicitly set a request
%% id. Otherwise, the request-id counter would be increased and we cannot know
%% what it is.
-cases() ->
- [deny_port_api, deny_port_range_api, deny_host_api, deny_peerhost_api,
- allow_port_range_api, allow_host_api, allow_peerhost_api, check_address_api].
+cases() ->
+ [deny_port_api, deny_port_range_api, deny_host_api,
+ deny_peerhost_api, allow_port_range_api, allow_host_api,
+ allow_peerhost_api, check_address_api].
init_per_testcase(_Case, Config) ->
@@ -78,12 +90,12 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-init_all(Config) ->
+init_per_suite(Config) ->
if
is_list(Config) ->
orber:jump_start([{iiop_port, 0},
@@ -93,7 +105,7 @@ init_all(Config) ->
exit("Config not a list")
end.
-finish_all(Config) ->
+end_per_suite(Config) ->
orber:jump_stop(),
Config.
diff --git a/lib/orber/test/orber_firewall_ipv4_out_SUITE.erl b/lib/orber/test/orber_firewall_ipv4_out_SUITE.erl
index 193fc72f7c..591b5f5f67 100644
--- a/lib/orber/test/orber_firewall_ipv4_out_SUITE.erl
+++ b/lib/orber/test/orber_firewall_ipv4_out_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -20,7 +20,7 @@
-module(orber_firewall_ipv4_out_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
-include_lib("orber/COSS/CosNaming/CosNaming.hrl").
-include_lib("orber/src/orber_iiop.hrl").
@@ -49,8 +49,9 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1, cases/0, init_all/1, finish_all/1,
- init_per_testcase/2, fin_per_testcase/2,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2, cases/0,
+ init_per_suite/1, end_per_suite/1,
+ init_per_testcase/2, end_per_testcase/2,
deny_port_api/1, deny_port_range_api/1, deny_host_api/1,
allow_port_api/1, allow_port_range_api/1, allow_host_api/1,
local_interface_api/1]).
@@ -60,15 +61,25 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["API tests for orber's firewall functionallity."];
-all(suite) -> {req,
- [mnesia],
- {conf, init_all, cases(), finish_all}}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% NOTE - the fragment test cases must bu first since we explicitly set a request
%% id. Otherwise, the request-id counter would be increased and we cannot know
%% what it is.
-cases() ->
+cases() ->
[deny_port_api, deny_port_range_api, deny_host_api,
allow_port_api, allow_port_range_api, allow_host_api,
local_interface_api].
@@ -79,12 +90,12 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-init_all(Config) ->
+init_per_suite(Config) ->
if
is_list(Config) ->
orber:jump_start([{iiop_port, 0},
@@ -94,7 +105,7 @@ init_all(Config) ->
exit("Config not a list")
end.
-finish_all(Config) ->
+end_per_suite(Config) ->
orber:jump_stop(),
Config.
diff --git a/lib/orber/test/orber_firewall_ipv6_in_SUITE.erl b/lib/orber/test/orber_firewall_ipv6_in_SUITE.erl
index 83f48cba0c..10827b6ef5 100644
--- a/lib/orber/test/orber_firewall_ipv6_in_SUITE.erl
+++ b/lib/orber/test/orber_firewall_ipv6_in_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -20,7 +20,7 @@
-module(orber_firewall_ipv6_in_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
-include_lib("orber/COSS/CosNaming/CosNaming.hrl").
-include_lib("orber/src/orber_iiop.hrl").
@@ -49,8 +49,9 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1, cases/0, init_all/1, finish_all/1,
- init_per_testcase/2, fin_per_testcase/2,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2, cases/0,
+ init_per_suite/1, end_per_suite/1,
+ init_per_testcase/2, end_per_testcase/2,
deny_port_api/1, deny_port_range_api/1, deny_host_api/1,
deny_peerhost_api/1, allow_port_range_api/1,
allow_host_api/1, allow_peerhost_api/1, check_address_api/1]).
@@ -60,18 +61,28 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["API tests for orber's firewall functionallity."];
-all(suite) -> {req,
- [mnesia],
- {conf, init_all, cases(), finish_all}}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% NOTE - the fragment test cases must bu first since we explicitly set a request
%% id. Otherwise, the request-id counter would be increased and we cannot know
%% what it is.
-cases() ->
- [deny_port_api, deny_port_range_api, deny_host_api, deny_peerhost_api,
- allow_port_range_api, allow_host_api, allow_peerhost_api,
- check_address_api].
+cases() ->
+ [deny_port_api, deny_port_range_api, deny_host_api,
+ deny_peerhost_api, allow_port_range_api, allow_host_api,
+ allow_peerhost_api, check_address_api].
init_per_testcase(_Case, Config) ->
@@ -82,13 +93,13 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
orber:jump_stop(),
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-init_all(Config) ->
+init_per_suite(Config) ->
case orber_test_lib:version_ok() of
true ->
if
@@ -101,7 +112,7 @@ init_all(Config) ->
Reason
end.
-finish_all(Config) ->
+end_per_suite(Config) ->
Config.
diff --git a/lib/orber/test/orber_firewall_ipv6_out_SUITE.erl b/lib/orber/test/orber_firewall_ipv6_out_SUITE.erl
index e1856b9a47..83d22cc487 100644
--- a/lib/orber/test/orber_firewall_ipv6_out_SUITE.erl
+++ b/lib/orber/test/orber_firewall_ipv6_out_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -20,7 +20,7 @@
-module(orber_firewall_ipv6_out_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
-include_lib("orber/COSS/CosNaming/CosNaming.hrl").
-include_lib("orber/src/orber_iiop.hrl").
@@ -49,8 +49,9 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1, cases/0, init_all/1, finish_all/1,
- init_per_testcase/2, fin_per_testcase/2,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2, cases/0,
+ init_per_suite/1, end_per_suite/1,
+ init_per_testcase/2, end_per_testcase/2,
deny_port_api/1, deny_port_range_api/1, deny_host_api/1,
allow_port_api/1, allow_port_range_api/1, allow_host_api/1,
local_interface_api/1]).
@@ -60,15 +61,25 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["API tests for orber's firewall functionallity."];
-all(suite) -> {req,
- [mnesia],
- {conf, init_all, cases(), finish_all}}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% NOTE - the fragment test cases must bu first since we explicitly set a request
%% id. Otherwise, the request-id counter would be increased and we cannot know
%% what it is.
-cases() ->
+cases() ->
[deny_port_api, deny_port_range_api, deny_host_api,
allow_port_api, allow_port_range_api, allow_host_api,
local_interface_api].
@@ -82,13 +93,13 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
orber:jump_stop(),
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-init_all(Config) ->
+init_per_suite(Config) ->
case orber_test_lib:version_ok() of
true ->
if
@@ -101,7 +112,7 @@ init_all(Config) ->
Reason
end.
-finish_all(Config) ->
+end_per_suite(Config) ->
Config.
diff --git a/lib/orber/test/orber_nat_SUITE.erl b/lib/orber/test/orber_nat_SUITE.erl
index 5b295dd1aa..625f168520 100644
--- a/lib/orber/test/orber_nat_SUITE.erl
+++ b/lib/orber/test/orber_nat_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -20,7 +20,7 @@
-module(orber_nat_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
-include_lib("orber/COSS/CosNaming/CosNaming.hrl").
-include_lib("orber/src/orber_iiop.hrl").
@@ -50,8 +50,9 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1, cases/0, init_all/1, finish_all/1,
- init_per_testcase/2, fin_per_testcase/2,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2, cases/0,
+ init_per_suite/1, end_per_suite/1,
+ init_per_testcase/2, end_per_testcase/2,
nat_ip_address/1, nat_ip_address_multiple/1,
nat_ip_address_local/1, nat_ip_address_local_local/1,
nat_iiop_port/1, nat_iiop_port_local/1,
@@ -68,32 +69,40 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["API tests for multi orber interfaces",
- "This suite test intra-ORB communication. There are three scenarios:",
- "* No security at all (multi_orber_api)",
- "* Two secure orbs using ssl (ssl_multi_orb_api)",
- "* One secure and one orb with no security. (ssl_multi_orb_api)"];
-all(suite) -> {req,
- [mnesia],
- {conf, init_all, cases(), finish_all}}.
-
-cases() ->
- [
- nat_ip_address,
- nat_ip_address_multiple,
- nat_ip_address_local,
- nat_iiop_port,
- nat_iiop_port_local,
- nat_ip_address_local_local,
- nat_iiop_port_local_local,
- nat_iiop_ssl_port,
- nat_iiop_ssl_port_local
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ cases().
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+cases() ->
+ [nat_ip_address, nat_ip_address_multiple,
+ nat_ip_address_local, nat_iiop_port,
+ nat_iiop_port_local, nat_ip_address_local_local,
+ nat_iiop_port_local_local, nat_iiop_ssl_port,
+ nat_iiop_ssl_port_local].
%%-----------------------------------------------------------------
%% Init and cleanup functions.
%%-----------------------------------------------------------------
-
+init_per_testcase(TC, Config)
+ when TC =:= nat_iiop_ssl_port;
+ TC =:= nat_iiop_ssl_port_local ->
+ case orber_test_lib:ssl_version() of
+ no_ssl ->
+ {skip,"SSL not installed!"};
+ _ ->
+ init_per_testcase(dummy_tc, Config)
+ end;
init_per_testcase(_Case, Config) ->
Path = code:which(?MODULE),
code:add_pathz(filename:join(filename:dirname(Path), "idl_output")),
@@ -104,7 +113,7 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
oe_orber_test_server:oe_unregister(),
orber:jump_stop(),
Path = code:which(?MODULE),
@@ -113,7 +122,7 @@ fin_per_testcase(_Case, Config) ->
test_server:timetrap_cancel(Dog),
ok.
-init_all(Config) ->
+init_per_suite(Config) ->
if
is_list(Config) ->
Config;
@@ -121,7 +130,7 @@ init_all(Config) ->
exit("Config not a list")
end.
-finish_all(Config) ->
+end_per_suite(Config) ->
Config.
%%-----------------------------------------------------------------
@@ -266,107 +275,99 @@ nat_iiop_ssl_port(doc) -> ["SECURE MULTI ORB API tests (SSL depth 1)",
"Make sure NAT works for SSL"];
nat_iiop_ssl_port(suite) -> [];
nat_iiop_ssl_port(_Config) ->
- case os:type() of
- vxworks ->
- {skipped, "No SSL-support for VxWorks."};
- _ ->
- IP = orber_test_lib:get_host(),
- ServerOptions = orber_test_lib:get_options(iiop_ssl, server,
- 1, [{iiop_ssl_port, 0},
- {flags, ?ORB_ENV_ENABLE_NAT},
- {ip_address, IP}]),
- ClientOptions = orber_test_lib:get_options(iiop_ssl, client,
- 1, [{iiop_ssl_port, 0}]),
- {ok, ServerNode, _ServerHost} =
- ?match({ok,_,_}, orber_test_lib:js_node(ServerOptions)),
- ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
- SSLServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_ssl_port, []),
- NATSSLServerPort = SSLServerPort+1,
- {ok, Ref} = ?match({ok, _},
- orber_test_lib:remote_apply(ServerNode, orber,
- add_listen_interface,
- [IP, ssl, NATSSLServerPort])),
- orber_test_lib:remote_apply(ServerNode, orber_env, configure_override,
- [nat_iiop_ssl_port,
- {local, NATSSLServerPort, [{4001, 43}]}]),
-
- {ok, ClientNode, _ClientHost} =
- ?match({ok,_,_}, orber_test_lib:js_node(ClientOptions)),
- ?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
- install_test_data,
- [ssl])),
-
- IOR1 = ?match(#'IOP_IOR'{},
- orber_test_lib:remote_apply(ClientNode, corba,
- string_to_object,
- ["corbaname::1.2@"++IP++":"++
- integer_to_list(ServerPort)++"/NameService#mamba"])),
-
- ?match({'external', {_IP, _Port, _ObjectKey, _Counter, _TP,
- #host_data{protocol = ssl,
- ssl_data = #'SSLIOP_SSL'{port = NATSSLServerPort}}}},
- iop_ior:get_key(IOR1)),
- ?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
- uninstall_test_data,
- [ssl])),
- ?match(ok,
- orber_test_lib:remote_apply(ServerNode, orber,
- remove_listen_interface, [Ref])),
- ok
- end.
+
+ IP = orber_test_lib:get_host(),
+ ServerOptions = orber_test_lib:get_options(iiop_ssl, server,
+ 1, [{iiop_ssl_port, 0},
+ {flags, ?ORB_ENV_ENABLE_NAT},
+ {ip_address, IP}]),
+ ClientOptions = orber_test_lib:get_options(iiop_ssl, client,
+ 1, [{iiop_ssl_port, 0}]),
+ {ok, ServerNode, _ServerHost} =
+ ?match({ok,_,_}, orber_test_lib:js_node(ServerOptions)),
+ ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
+ SSLServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_ssl_port, []),
+ NATSSLServerPort = SSLServerPort+1,
+ {ok, Ref} = ?match({ok, _},
+ orber_test_lib:remote_apply(ServerNode, orber,
+ add_listen_interface,
+ [IP, ssl, NATSSLServerPort])),
+ orber_test_lib:remote_apply(ServerNode, orber_env, configure_override,
+ [nat_iiop_ssl_port,
+ {local, NATSSLServerPort, [{4001, 43}]}]),
+
+ {ok, ClientNode, _ClientHost} =
+ ?match({ok,_,_}, orber_test_lib:js_node(ClientOptions)),
+ ?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
+ install_test_data,
+ [ssl])),
+
+ IOR1 = ?match(#'IOP_IOR'{},
+ orber_test_lib:remote_apply(ClientNode, corba,
+ string_to_object,
+ ["corbaname::1.2@"++IP++":"++
+ integer_to_list(ServerPort)++"/NameService#mamba"])),
+
+ ?match({'external', {_IP, _Port, _ObjectKey, _Counter, _TP,
+ #host_data{protocol = ssl,
+ ssl_data = #'SSLIOP_SSL'{port = NATSSLServerPort}}}},
+ iop_ior:get_key(IOR1)),
+ ?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
+ uninstall_test_data,
+ [ssl])),
+ ?match(ok,
+ orber_test_lib:remote_apply(ServerNode, orber,
+ remove_listen_interface, [Ref])),
+ ok.
nat_iiop_ssl_port_local(doc) -> ["SECURE MULTI ORB API tests (SSL depth 1)",
"Make sure NAT works for SSL"];
nat_iiop_ssl_port_local(suite) -> [];
nat_iiop_ssl_port_local(_Config) ->
- case os:type() of
- vxworks ->
- {skipped, "No SSL-support for VxWorks."};
- _ ->
- IP = orber_test_lib:get_host(),
- ServerOptions = orber_test_lib:get_options(iiop_ssl, server,
- 1, [{iiop_ssl_port, 0},
- {flags,
- (?ORB_ENV_LOCAL_INTERFACE bor
- ?ORB_ENV_ENABLE_NAT)},
- {ip_address, IP}]),
- ClientOptions = orber_test_lib:get_options(iiop_ssl, client,
- 1, [{iiop_ssl_port, 0}]),
- {ok, ServerNode, _ServerHost} =
- ?match({ok,_,_}, orber_test_lib:js_node(ServerOptions)),
- ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
- SSLServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_ssl_port, []),
- NATSSLServerPort = SSLServerPort+1,
- {ok, Ref} = ?match({ok, _},
- orber_test_lib:remote_apply(ServerNode, orber,
- add_listen_interface,
- [IP, ssl, NATSSLServerPort])),
- orber_test_lib:remote_apply(ServerNode, orber_env, configure_override,
- [nat_iiop_ssl_port,
- {local, NATSSLServerPort, [{NATSSLServerPort, NATSSLServerPort}]}]),
-
- {ok, ClientNode, _ClientHost} =
- ?match({ok,_,_}, orber_test_lib:js_node(ClientOptions)),
- ?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
- install_test_data,
- [ssl])),
-
- IOR1 = ?match(#'IOP_IOR'{},
- orber_test_lib:remote_apply(ClientNode, corba,
- string_to_object,
- ["corbaname::1.2@"++IP++":"++
- integer_to_list(ServerPort)++"/NameService#mamba"])),
-
- ?match({'external', {_IP, _Port, _ObjectKey, _Counter, _TP,
- #host_data{protocol = ssl,
- ssl_data = #'SSLIOP_SSL'{port = NATSSLServerPort}}}},
- iop_ior:get_key(IOR1)),
- ?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
- uninstall_test_data,
- [ssl])),
- ?match(ok,
- orber_test_lib:remote_apply(ServerNode, orber,
- remove_listen_interface, [Ref])),
- ok
- end.
+
+ IP = orber_test_lib:get_host(),
+ ServerOptions = orber_test_lib:get_options(iiop_ssl, server,
+ 1, [{iiop_ssl_port, 0},
+ {flags,
+ (?ORB_ENV_LOCAL_INTERFACE bor
+ ?ORB_ENV_ENABLE_NAT)},
+ {ip_address, IP}]),
+ ClientOptions = orber_test_lib:get_options(iiop_ssl, client,
+ 1, [{iiop_ssl_port, 0}]),
+ {ok, ServerNode, _ServerHost} =
+ ?match({ok,_,_}, orber_test_lib:js_node(ServerOptions)),
+ ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
+ SSLServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_ssl_port, []),
+ NATSSLServerPort = SSLServerPort+1,
+ {ok, Ref} = ?match({ok, _},
+ orber_test_lib:remote_apply(ServerNode, orber,
+ add_listen_interface,
+ [IP, ssl, NATSSLServerPort])),
+ orber_test_lib:remote_apply(ServerNode, orber_env, configure_override,
+ [nat_iiop_ssl_port,
+ {local, NATSSLServerPort, [{NATSSLServerPort, NATSSLServerPort}]}]),
+
+ {ok, ClientNode, _ClientHost} =
+ ?match({ok,_,_}, orber_test_lib:js_node(ClientOptions)),
+ ?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
+ install_test_data,
+ [ssl])),
+
+ IOR1 = ?match(#'IOP_IOR'{},
+ orber_test_lib:remote_apply(ClientNode, corba,
+ string_to_object,
+ ["corbaname::1.2@"++IP++":"++
+ integer_to_list(ServerPort)++"/NameService#mamba"])),
+
+ ?match({'external', {_IP, _Port, _ObjectKey, _Counter, _TP,
+ #host_data{protocol = ssl,
+ ssl_data = #'SSLIOP_SSL'{port = NATSSLServerPort}}}},
+ iop_ior:get_key(IOR1)),
+ ?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
+ uninstall_test_data,
+ [ssl])),
+ ?match(ok,
+ orber_test_lib:remote_apply(ServerNode, orber,
+ remove_listen_interface, [Ref])),
+ ok.
diff --git a/lib/orber/test/orber_test_lib.erl b/lib/orber/test/orber_test_lib.erl
index a694dc58c4..ffc13d0e3c 100644
--- a/lib/orber/test/orber_test_lib.erl
+++ b/lib/orber/test/orber_test_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -95,16 +95,21 @@
%%
%%------------------------------------------------------------
ssl_version() ->
- case catch erlang:system_info(otp_release) of
- Version when is_list(Version) ->
- if
- "R12B" < Version ->
- 3;
- true ->
- 2
- end;
- _ ->
- 2
+ try
+ ssl:module_info(),
+ case catch erlang:system_info(otp_release) of
+ Version when is_list(Version) ->
+ if
+ "R12B" < Version ->
+ 3;
+ true ->
+ 2
+ end;
+ _ ->
+ 2
+ end
+ catch error:undef ->
+ no_ssl
end.
%%------------------------------------------------------------
@@ -126,13 +131,22 @@ version_ok() ->
_ ->
case gen_tcp:listen(0, [{reuseaddr, true}, inet6]) of
{ok, LSock} ->
- gen_tcp:close(LSock),
- true;
+ {ok, Port} = inet:port(LSock),
+ case gen_tcp:connect(Hostname, Port, [inet6]) of
+ {error, _} ->
+ gen_tcp:close(LSock),
+ {skipped, "Inet cannot handle IPv6"};
+ {ok, Socket} ->
+ gen_tcp:close(Socket),
+ gen_tcp:close(LSock),
+ true
+ end;
{error, _} ->
{skipped, "Inet cannot handle IPv6"}
end
end
end.
+
%%------------------------------------------------------------
%% function : get_host
%% Arguments: Family - inet | inet6
@@ -287,9 +301,11 @@ start_ssl(true, Node) ->
start_ssl(_, _) ->
ok.
-start_orber({lightweigth, Options}, Node) ->
+start_orber({lightweight, Options}, Node) ->
+ ok = rpc:call(Node, mnesia, start, []),
ok = rpc:call(Node, orber, start_lightweight, [Options]);
start_orber(lightweight, Node) ->
+ ok = rpc:call(Node, mnesia, start, []),
ok = rpc:call(Node, orber, start_lightweight, []);
start_orber(_, Node) ->
ok = rpc:call(Node, orber, jump_start, []).
@@ -1280,6 +1296,22 @@ test_coding(Obj, Local) ->
?match({'EXCEPTION',{'MARSHAL',_,_,_}},
orber_test_server:
testing_iiop_server_marshal(Obj, "string")),
+
+ RecS = #orber_test_server_rec_struct{chain = [#orber_test_server_rec_struct{chain = []}]},
+ ?match(RecS, orber_test_server:testing_iiop_rec_struct(Obj, RecS)),
+
+ RecU = #orber_test_server_rec_union{label = 'RecursiveType',
+ value = [#orber_test_server_rec_union{label = 'RecursiveType',
+ value = []}]},
+ ?match(RecU, orber_test_server:testing_iiop_rec_union(Obj, RecU)),
+
+%% RecA1 = #any{typecode = unsupported, value = RecS},
+%% RecA2 = #any{typecode = unsupported, value = RecU},
+%% ?match(RecA1,
+%% orber_test_server:testing_iiop_rec_any(Obj, RecA1)),
+%% ?match(RecA2,
+%% orber_test_server:testing_iiop_rec_any(Obj, RecA2)),
+
ok.
%%--------------- Testing Post- & Pre-cond -------------------
diff --git a/lib/orber/test/orber_test_server.idl b/lib/orber/test/orber_test_server.idl
index a88211c941..438c10e19b 100644
--- a/lib/orber/test/orber_test_server.idl
+++ b/lib/orber/test/orber_test_server.idl
@@ -28,7 +28,7 @@ module orber_parent {
};
module orber_test {
-
+
// interface server
interface server : orber_parent::inherrit {
typedef string array[2];
@@ -89,6 +89,23 @@ module orber_test {
const fixed52 fixed52negconst2 = -123.00d;
const fixed52 fixed52negconst3 = -023.00d;
+ struct rec_struct; // Forward declaration
+ typedef sequence<rec_struct> rec_struct_seq;
+ struct rec_struct {
+ rec_struct_seq chain;
+ };
+
+
+ union rec_union; // Forward declaration
+ typedef sequence<rec_union>rec_union_seq;
+
+ enum MyEnum {RecursiveType, NameType};
+
+ union rec_union switch (MyEnum) {
+ case RecursiveType : rec_union_seq chain;
+ case NameType : string aName;
+ };
+
void stop_normal();
void stop_brutal();
@@ -123,6 +140,12 @@ module orber_test {
void testing_iiop_context();
void testing_iiop_server_marshal(inout StrLength6 Str);
+ // Recursive types
+ any testing_iiop_rec_any(in any RecType);
+ rec_struct testing_iiop_rec_struct(in rec_struct RecS);
+ rec_union testing_iiop_rec_union(in rec_union RecU);
+
+
oneway void testing_iiop_oneway_delay(in long Time);
void testing_iiop_twoway_delay(in long Time);
diff --git a/lib/orber/test/orber_test_server_impl.erl b/lib/orber/test/orber_test_server_impl.erl
index 35296cb619..10a9caf242 100644
--- a/lib/orber/test/orber_test_server_impl.erl
+++ b/lib/orber/test/orber_test_server_impl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2010. 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
@@ -55,6 +55,9 @@
testing_iiop_void/2,
testing_iiop_context/2,
testing_iiop_server_marshal/3,
+ testing_iiop_rec_any/3,
+ testing_iiop_rec_struct/3,
+ testing_iiop_rec_union/3,
relay_call/3,
relay_cast/3,
%% Testing pseudo calls.
@@ -197,6 +200,16 @@ testing_iiop_context(_Self, State) ->
testing_iiop_server_marshal(_Self, State, _String) ->
{reply, {ok, false}, State}.
+testing_iiop_rec_any(_Self, State, RAny) ->
+ {reply, RAny, State}.
+
+testing_iiop_rec_struct(_Self, State, RecS) ->
+ {reply, RecS, State}.
+
+testing_iiop_rec_union(_Self, State, RecU) ->
+ {reply, RecU, State}.
+
+
testing_iiop_oneway_delay(_Self, State, Time) ->
timer:sleep(Time),
{noreply, State}.
diff --git a/lib/orber/test/orber_test_timeout_server_impl.erl b/lib/orber/test/orber_test_timeout_server_impl.erl
index 138eb51d92..67ea897fdd 100644
--- a/lib/orber/test/orber_test_timeout_server_impl.erl
+++ b/lib/orber/test/orber_test_timeout_server_impl.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2010. 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
diff --git a/lib/orber/test/orber_web_SUITE.erl b/lib/orber/test/orber_web_SUITE.erl
index ffa7468853..a3b4d8547d 100644
--- a/lib/orber/test/orber_web_SUITE.erl
+++ b/lib/orber/test/orber_web_SUITE.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -25,7 +25,7 @@
-module(orber_web_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/include/corba.hrl").
-include_lib("orber/src/orber_iiop.hrl").
@@ -65,12 +65,12 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
%%-----------------------------------------------------------------
%% Internal exports
%%-----------------------------------------------------------------
--export([]).
-compile(export_all).
%%-----------------------------------------------------------------
@@ -78,10 +78,28 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["This suite is for testing the Orber Web API"];
-all(suite) ->
- [menu, configure, info, nameservice, ifr_select, ifr_data,
- create, delete_ctx, add_ctx, delete_obj, server].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [menu, configure, info, nameservice, ifr_select,
+ ifr_data, create, delete_ctx, add_ctx, delete_obj,
+ server].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%-----------------------------------------------------------------
%% Init and cleanup functions.
@@ -95,7 +113,7 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
oe_orber_test_server:oe_unregister(),
orber:jump_stop(),
Path = code:which(?MODULE),
diff --git a/lib/orber/test/tc_SUITE.erl b/lib/orber/test/tc_SUITE.erl
index 807a663219..52b7f8852f 100644
--- a/lib/orber/test/tc_SUITE.erl
+++ b/lib/orber/test/tc_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -25,7 +25,7 @@
%%-----------------------------------------------------------------
-module(tc_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("orber/src/orber_iiop.hrl").
-define(default_timeout, ?t:minutes(3)).
@@ -128,12 +128,12 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
%%-----------------------------------------------------------------
%% Internal exports
%%-----------------------------------------------------------------
--export([]).
-compile(export_all).
%%-----------------------------------------------------------------
@@ -141,19 +141,32 @@
%% Args:
%% Returns:
%%-----------------------------------------------------------------
-all(doc) -> ["Description", "more description"];
-all(suite) ->
- [null, void,
- short, ushort,
- long, ulong,
- longlong, ulonglong,
- boolean, char, wchar, octet,
- float, double, longdouble,
- any, typecode, principal, object_reference,
- struct, union, enum, string, wstring, sequence, array,
- alias, exception, fixed, value, value_box, native,
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [null, void, short, ushort, long, ulong, longlong,
+ ulonglong, boolean, char, wchar, octet, float, double,
+ longdouble, any, typecode, principal, object_reference,
+ struct, union, enum, string, wstring, sequence, array,
+ alias, exception, fixed, value, value_box, native,
abstract_interface, indirection, get_tc].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%-----------------------------------------------------------------
%% Init and cleanup functions.
%%-----------------------------------------------------------------
@@ -163,7 +176,7 @@ init_per_testcase(_Case, Config) ->
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/orber/vsn.mk b/lib/orber/vsn.mk
index 584a52ab84..5f17cda229 100644
--- a/lib/orber/vsn.mk
+++ b/lib/orber/vsn.mk
@@ -1 +1,3 @@
-ORBER_VSN = 3.6.18
+
+ORBER_VSN = 3.6.20
+
diff --git a/lib/os_mon/src/disksup.erl b/lib/os_mon/src/disksup.erl
index 3340f7ee72..3ee1df759f 100644
--- a/lib/os_mon/src/disksup.erl
+++ b/lib/os_mon/src/disksup.erl
@@ -103,6 +103,7 @@ init([]) ->
Flavor==darwin;
Flavor==linux;
Flavor==openbsd;
+ Flavor==netbsd;
Flavor==irix64;
Flavor==irix ->
start_portprogram();
@@ -267,6 +268,9 @@ check_disk_space({unix, freebsd}, Port, Threshold) ->
check_disk_space({unix, openbsd}, Port, Threshold) ->
Result = my_cmd("/bin/df -k -t ffs", Port),
check_disks_solaris(skip_to_eol(Result), Threshold);
+check_disk_space({unix, netbsd}, Port, Threshold) ->
+ Result = my_cmd("/bin/df -k -t ffs", Port),
+ check_disks_solaris(skip_to_eol(Result), Threshold);
check_disk_space({unix, sunos4}, Port, Threshold) ->
Result = my_cmd("df", Port),
check_disks_solaris(skip_to_eol(Result), Threshold);
diff --git a/lib/os_mon/src/memsup.erl b/lib/os_mon/src/memsup.erl
index 822e1f939c..cc4941ee7d 100644
--- a/lib/os_mon/src/memsup.erl
+++ b/lib/os_mon/src/memsup.erl
@@ -176,9 +176,11 @@ init([]) ->
PortMode = case OS of
{unix, darwin} -> false;
{unix, freebsd} -> false;
+ {unix, dragonfly} -> false;
% Linux supports this.
{unix, linux} -> true;
{unix, openbsd} -> true;
+ {unix, netbsd} -> true;
{unix, irix64} -> true;
{unix, irix} -> true;
{unix, sunos} -> true;
@@ -610,8 +612,10 @@ code_change(Vsn, PrevState, "1.8") ->
PortMode = case OS of
{unix, darwin} -> false;
{unix, freebsd} -> false;
+ {unix, dragonfly} -> false;
{unix, linux} -> false;
{unix, openbsd} -> true;
+ {unix, netbsd} -> true;
{unix, sunos} -> true;
{win32, _OSname} -> false;
vxworks -> true
@@ -687,6 +691,7 @@ get_os_wordsize({unix, linux}) -> get_os_wordsize_with_uname();
get_os_wordsize({unix, darwin}) -> get_os_wordsize_with_uname();
get_os_wordsize({unix, netbsd}) -> get_os_wordsize_with_uname();
get_os_wordsize({unix, freebsd}) -> get_os_wordsize_with_uname();
+get_os_wordsize({unix, dragonfly}) -> get_os_wordsize_with_uname();
get_os_wordsize({unix, openbsd}) -> get_os_wordsize_with_uname();
get_os_wordsize(_) -> unsupported_os.
@@ -736,7 +741,7 @@ get_memory_usage({unix,darwin}) ->
%% FreeBSD: Look in /usr/include/sys/vmmeter.h for the format of struct
%% vmmeter
-get_memory_usage({unix,freebsd}) ->
+get_memory_usage({unix,OSname}) when OSname == freebsd; OSname == dragonfly ->
PageSize = freebsd_sysctl("vm.stats.vm.v_page_size"),
PageCount = freebsd_sysctl("vm.stats.vm.v_page_count"),
FreeCount = freebsd_sysctl("vm.stats.vm.v_free_count"),
@@ -779,6 +784,9 @@ get_ext_memory_usage(OS, {Alloc, Total}) ->
{unix, freebsd} ->
[{total_memory, Total}, {free_memory, Total-Alloc},
{system_total_memory, Total}];
+ {unix, dragonfly} ->
+ [{total_memory, Total}, {free_memory, Total-Alloc},
+ {system_total_memory, Total}];
{unix, darwin} ->
[{total_memory, Total}, {free_memory, Total-Alloc},
{system_total_memory, Total}];
diff --git a/lib/os_mon/test/Makefile b/lib/os_mon/test/Makefile
index c87285e38b..a240640f92 100644
--- a/lib/os_mon/test/Makefile
+++ b/lib/os_mon/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2010. All Rights Reserved.
+# Copyright Ericsson AB 1997-2011. 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
@@ -85,7 +85,7 @@ release_spec:
release_tests_spec: make_emakefile
$(INSTALL_DIR) $(RELSYSDIR)
- $(INSTALL_DATA) os_mon.spec $(EMAKEFILE) $(SOURCE) $(RELSYSDIR)
+ $(INSTALL_DATA) os_mon.spec os_mon.cover $(EMAKEFILE) $(SOURCE) $(RELSYSDIR)
## tar chf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
diff --git a/lib/os_mon/test/cpu_sup_SUITE.erl b/lib/os_mon/test/cpu_sup_SUITE.erl
index 45f9d981d1..d04adbb6d3 100644
--- a/lib/os_mon/test/cpu_sup_SUITE.erl
+++ b/lib/os_mon/test/cpu_sup_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
@@ -17,10 +17,10 @@
%% %CopyrightEnd%
%%
-module(cpu_sup_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% Test server specific exports
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]).
-export([init_per_suite/1, end_per_suite/1]).
-export([init_per_testcase/2, end_per_testcase/2]).
@@ -41,29 +41,43 @@ end_per_suite(Config) when is_list(Config) ->
?line ok = application:stop(os_mon),
Config.
+init_per_testcase(unavailable, Config) ->
+ terminate(Config),
+ init_per_testcase(dummy, Config);
init_per_testcase(_Case, Config) ->
Dog = ?t:timetrap(?default_timeout),
[{watchdog, Dog} | Config].
+end_per_testcase(unavailable, Config) ->
+ restart(Config),
+ end_per_testcase(dummy, Config);
end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-all(suite) ->
- case ?t:os_type() of
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ case test_server:os_type() of
{unix, sunos} ->
- [load_api, util_api, util_values, port,
- {conf, terminate, [unavailable], restart}];
+ [load_api, util_api, util_values, port, unavailable];
{unix, linux} ->
- [load_api, util_api, util_values, port,
- {conf, terminate, [unavailable], restart}];
- {unix, _OSname} ->
- [load_api];
- _OS ->
- [unavailable]
+ [load_api, util_api, util_values, port, unavailable];
+ {unix, _OSname} -> [load_api];
+ _OS -> [unavailable]
end.
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
load_api(suite) ->
[];
load_api(doc) ->
diff --git a/lib/os_mon/test/disksup_SUITE.erl b/lib/os_mon/test/disksup_SUITE.erl
index 987d631c36..c1ff2c6afc 100644
--- a/lib/os_mon/test/disksup_SUITE.erl
+++ b/lib/os_mon/test/disksup_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -17,10 +17,10 @@
%% %CopyrightEnd%
%%
-module(disksup_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% Test server specific exports
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]).
-export([init_per_suite/1, end_per_suite/1]).
-export([init_per_testcase/2, end_per_testcase/2]).
@@ -41,29 +41,43 @@ end_per_suite(Config) when is_list(Config) ->
?line ok = application:stop(os_mon),
Config.
+init_per_testcase(unavailable, Config) ->
+ terminate(Config),
+ init_per_testcase(dummy, Config);
init_per_testcase(_Case, Config) ->
Dog = ?t:timetrap(?default_timeout),
[{watchdog,Dog} | Config].
+end_per_testcase(unavailable, Config) ->
+ restart(Config),
+ end_per_testcase(dummy, Config);
end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
Bugs = [otp_5910],
- case ?t:os_type() of
+ case test_server:os_type() of
{unix, sunos} ->
- [api, config, alarm, port,
- {conf, terminate, [unavailable], restart}] ++ Bugs;
- {unix, _OSname} ->
- [api, alarm] ++ Bugs;
- {win32, _OSname} ->
- [api, alarm] ++ Bugs;
- _OS ->
- [unavailable]
+ [api, config, alarm, port, unavailable] ++ Bugs;
+ {unix, _OSname} -> [api, alarm] ++ Bugs;
+ {win32, _OSname} -> [api, alarm] ++ Bugs;
+ _OS -> [unavailable]
end.
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
api(suite) ->
[];
api(doc) ->
diff --git a/lib/os_mon/test/memsup_SUITE.erl b/lib/os_mon/test/memsup_SUITE.erl
index 01a7f6c7f2..1d9ebca51f 100644
--- a/lib/os_mon/test/memsup_SUITE.erl
+++ b/lib/os_mon/test/memsup_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -17,10 +17,10 @@
%% %CopyrightEnd%
%%
-module(memsup_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% Test server specific exports
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]).
-export([init_per_suite/1, end_per_suite/1]).
-export([init_per_testcase/2, end_per_testcase/2]).
@@ -49,19 +49,30 @@ end_per_testcase(_Case, Config) ->
?t:timetrap_cancel(Dog),
Config.
-all(suite) ->
- All = case ?t:os_type() of
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ All = case test_server:os_type() of
{unix, sunos} ->
- [api, alarm1, alarm2, process,
- config, timeout, unavailable, port];
+ [api, alarm1, alarm2, process, config, timeout,
+ unavailable, port];
{unix, linux} ->
[api, alarm1, alarm2, process, timeout];
- _OS ->
- [api, alarm1, alarm2, process]
+ _OS -> [api, alarm1, alarm2, process]
end,
Bugs = [otp_5910],
All ++ Bugs.
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
api(suite) ->
[];
api(doc) ->
diff --git a/lib/os_mon/test/os_mon.cover b/lib/os_mon/test/os_mon.cover
new file mode 100644
index 0000000000..aa07391351
--- /dev/null
+++ b/lib/os_mon/test/os_mon.cover
@@ -0,0 +1,2 @@
+{incl_app,os_mon,details}.
+
diff --git a/lib/os_mon/test/os_mon.spec b/lib/os_mon/test/os_mon.spec
index bdae523795..d292b258f3 100644
--- a/lib/os_mon/test/os_mon.spec
+++ b/lib/os_mon/test/os_mon.spec
@@ -1 +1 @@
-{topcase, {dir, "../os_mon_test"}}.
+{suites,"../os_mon_test",all}.
diff --git a/lib/os_mon/test/os_mon_SUITE.erl b/lib/os_mon/test/os_mon_SUITE.erl
index ce52271ff8..f074657d4c 100644
--- a/lib/os_mon/test/os_mon_SUITE.erl
+++ b/lib/os_mon/test/os_mon_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -17,11 +17,12 @@
%% %CopyrightEnd%
%%
-module(os_mon_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% Test server specific exports
--export([all/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
%% Test cases
-export([app_file/1, config/1]).
@@ -33,17 +34,35 @@ init_per_testcase(_Case, Config) ->
Dog = test_server:timetrap(?default_timeout),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-all(suite) ->
- case ?t:os_type() of
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ case test_server:os_type() of
{unix, sunos} -> [app_file, config];
_OS -> [app_file]
end.
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
app_file(suite) ->
[];
app_file(doc) ->
diff --git a/lib/os_mon/test/os_mon_mib_SUITE.erl b/lib/os_mon/test/os_mon_mib_SUITE.erl
index a1d463030a..4bd256a3f7 100644
--- a/lib/os_mon/test/os_mon_mib_SUITE.erl
+++ b/lib/os_mon/test/os_mon_mib_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -24,13 +24,14 @@
-define(line,erlang:display({line,?LINE}),).
-define(config(A,B), config(A,B)).
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("os_mon/include/OTP-OS-MON-MIB.hrl").
-include_lib("snmp/include/snmp_types.hrl").
-endif.
% Test server specific exports
--export([all/1, init_per_suite/1, end_per_suite/1,
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_suite/1, end_per_suite/1,
init_per_testcase/2, end_per_testcase/2]).
@@ -38,8 +39,8 @@
-export([update_load_table/1]).
-export([get_mem_sys_mark/1, get_mem_proc_mark/1, get_disk_threshold/1,
- get_load_table/1, get_next_load_table/1, get_disk_table/1,
- get_next_disk_table/1, real_snmp_request/1, load_unload/1]).
+ get_load_table/1, get_disk_table/1,
+ real_snmp_request/1, load_unload/1]).
-export([sys_tot_mem/1, sys_used_mem/1, large_erl_process/1,
large_erl_process_mem/1, cpu_load/1, cpu_load5/1, cpu_load15/1,
@@ -47,7 +48,7 @@
large_erl_process_mem64/1, disk_descr/1, disk_kbytes/1,
disk_capacity/1]).
--export([tickets/1]).
+-export([]).
-export([otp_6351/1, otp_7441/1]).
-define(TRAP_UDP, 5000).
@@ -77,17 +78,32 @@ end_per_testcase(_Case, Config) when is_list(Config) ->
test_server:timetrap_cancel(Dog),
Config.
-all(doc) ->
- ["Test os_mon mibs and provided instrumentation functions."];
+suite() -> [{ct_hooks,[ts_install_cth]}].
-all(suite) ->
+all() ->
[load_unload, get_mem_sys_mark, get_mem_proc_mark,
- get_disk_threshold, get_load_table, get_next_load_table,
- get_disk_table, get_next_disk_table, real_snmp_request,
- update_load_table, tickets].
+ get_disk_threshold, get_load_table,
+ {group, get_next_load_table}, get_disk_table,
+ {group, get_next_disk_table}, real_snmp_request,
+ update_load_table, {group, tickets}].
+
+groups() ->
+ [{tickets, [], [otp_6351, otp_7441]},
+ {get_next_load_table, [],
+ [sys_tot_mem, sys_used_mem, large_erl_process,
+ large_erl_process_mem, cpu_load, cpu_load5, cpu_load15,
+ os_wordsize, sys_tot_mem64, sys_used_mem64,
+ large_erl_process_mem64]},
+ {get_next_disk_table, [],
+ [disk_descr, disk_kbytes, disk_capacity]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
-tickets(suite) ->
- [otp_6351, otp_7441].
-endif.
%%---------------------------------------------------------------------
@@ -338,21 +354,6 @@ get_load_table(Config) when is_list(Config) ->
ok.
%%---------------------------------------------------------------------
-get_next_load_table(doc) ->
- ["Simulates get_next calls to test the instrumentation function "
- "for the loadTable"];
-get_next_load_table(suite) ->
- [ sys_tot_mem,
- sys_used_mem,
- large_erl_process,
- large_erl_process_mem,
- cpu_load,
- cpu_load5,
- cpu_load15,
- os_wordsize,
- sys_tot_mem64,
- sys_used_mem64,
- large_erl_process_mem64].
sys_tot_mem(doc) ->
[];
@@ -592,11 +593,6 @@ get_disk_table(Config) when is_list(Config) ->
ok.
%%---------------------------------------------------------------------
-get_next_disk_table(doc) ->
- ["Simulates get_next calls to test the instrumentation function "
- "for the diskTable."];
-get_next_disk_table(suite) ->
- [disk_descr, disk_kbytes, disk_capacity].
disk_descr(doc) ->
[];
diff --git a/lib/os_mon/test/os_sup_SUITE.erl b/lib/os_mon/test/os_sup_SUITE.erl
index 25041f968d..61005f5ca0 100644
--- a/lib/os_mon/test/os_sup_SUITE.erl
+++ b/lib/os_mon/test/os_sup_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -17,10 +17,10 @@
%% %CopyrightEnd%
%%
-module(os_sup_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% Test server specific exports
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]).
-export([init_per_suite/1, end_per_suite/1]).
-export([init_per_testcase/2, end_per_testcase/2]).
@@ -63,17 +63,28 @@ end_per_testcase(_Case, Config) ->
?t:timetrap_cancel(Dog),
ok.
-all(suite) ->
- case ?t:os_type() of
- {unix, sunos} ->
- [message, config, port];
- {win32, _OSname} ->
- [message];
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ case test_server:os_type() of
+ {unix, sunos} -> [message, config, port];
+ {win32, _OSname} -> [message];
OS ->
- Str = io_lib:format("os_sup not available for ~p", [OS]),
+ Str = io_lib:format("os_sup not available for ~p",
+ [OS]),
{skip, lists:flatten(Str)}
end.
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
message(suite) ->
[];
message(doc) ->
diff --git a/lib/parsetools/test/Makefile b/lib/parsetools/test/Makefile
index 19354b87b2..624c4e6975 100644
--- a/lib/parsetools/test/Makefile
+++ b/lib/parsetools/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2005-2009. All Rights Reserved.
+# Copyright Ericsson AB 2005-2011. 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
@@ -71,8 +71,8 @@ release_spec: opt
release_tests_spec: make_emakefile
$(INSTALL_DIR) $(RELSYSDIR)
- $(INSTALL_DATA) parsetools.spec $(EMAKEFILE) $(ERL_FILES) $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ $(INSTALL_DATA) parsetools.spec parsetools.cover $(EMAKEFILE) $(ERL_FILES) $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
# @tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
release_docs_spec:
diff --git a/lib/parsetools/test/leex_SUITE.erl b/lib/parsetools/test/leex_SUITE.erl
index 069f780b5e..23ad16f98d 100644
--- a/lib/parsetools/test/leex_SUITE.erl
+++ b/lib/parsetools/test/leex_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2011. 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
@@ -30,17 +30,19 @@
-define(privdir, "leex_SUITE_priv").
-define(t, test_server).
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(datadir, ?config(data_dir, Config)).
-define(privdir, ?config(priv_dir, Config)).
-endif.
--export([all/1, init_per_testcase/2, fin_per_testcase/2]).
+-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([checks/1,
- file/1, compile/1, syntax/1,
- examples/1,
- pt/1, man/1, ex/1, ex2/1, not_yet/1]).
+-export([
+ file/1, compile/1, syntax/1,
+
+ pt/1, man/1, ex/1, ex2/1, not_yet/1]).
% Default timetrap timeout (set in init_per_testcase).
-define(default_timeout, ?t:minutes(1)).
@@ -49,15 +51,33 @@ init_per_testcase(_Case, Config) ->
?line Dog = ?t:timetrap(?default_timeout),
[{watchdog, Dog} | Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-all(suite) -> [checks, examples].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, checks}, {group, examples}].
+
+groups() ->
+ [{checks, [], [file, compile, syntax]},
+ {examples, [], [pt, man, ex, ex2, not_yet]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
-checks(suite) ->
- [file, compile, syntax].
file(doc) ->
"Bad files and options.";
@@ -330,8 +350,6 @@ syntax(Config) when is_list(Config) ->
leex:file(Filename, Ret),
ok.
-examples(suite) ->
- [pt,man,ex,ex2,not_yet].
pt(doc) ->
"Pushing back characters.";
diff --git a/lib/parsetools/test/parsetools.cover b/lib/parsetools/test/parsetools.cover
new file mode 100644
index 0000000000..13f84e3ba6
--- /dev/null
+++ b/lib/parsetools/test/parsetools.cover
@@ -0,0 +1,2 @@
+{incl_app,parsetools,details}.
+
diff --git a/lib/parsetools/test/parsetools.spec b/lib/parsetools/test/parsetools.spec
index 5b34633378..870d57baf1 100644
--- a/lib/parsetools/test/parsetools.spec
+++ b/lib/parsetools/test/parsetools.spec
@@ -1 +1 @@
-{topcase, {dir, "../parsetools_test"}}.
+{suites,"../parsetools_test",all}.
diff --git a/lib/parsetools/test/yecc_SUITE.erl b/lib/parsetools/test/yecc_SUITE.erl
index 8153be7e61..1de87b3bff 100644
--- a/lib/parsetools/test/yecc_SUITE.erl
+++ b/lib/parsetools/test/yecc_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -29,24 +29,26 @@
-define(privdir, "yecc_SUITE_priv").
-define(t, test_server).
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(datadir, ?config(data_dir, Config)).
-define(privdir, ?config(priv_dir, Config)).
-endif.
--export([all/1, init_per_testcase/2, fin_per_testcase/2]).
+-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([app_test/1,
- checks/1,
- file/1, syntax/1, compile/1, rules/1, expect/1,
- conflicts/1,
- examples/1,
- empty/1, prec/1, yeccpre/1, lalr/1, old_yecc/1,
- other_examples/1,
- bugs/1,
- otp_5369/1, otp_6362/1, otp_7945/1, otp_8483/1, otp_8486/1,
- improvements/1,
- otp_7292/1, otp_7969/1, otp_8919/1]).
+
+ file/1, syntax/1, compile/1, rules/1, expect/1,
+ conflicts/1,
+
+ empty/1, prec/1, yeccpre/1, lalr/1, old_yecc/1,
+ other_examples/1,
+
+ otp_5369/1, otp_6362/1, otp_7945/1, otp_8483/1, otp_8486/1,
+
+ otp_7292/1, otp_7969/1, otp_8919/1]).
% Default timetrap timeout (set in init_per_testcase).
-define(default_timeout, ?t:minutes(1)).
@@ -55,12 +57,38 @@ init_per_testcase(_Case, Config) ->
?line Dog = ?t:timetrap(?default_timeout),
[{watchdog, Dog} | Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-all(suite) -> [app_test, checks, examples, bugs, improvements].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [app_test, {group, checks}, {group, examples},
+ {group, bugs}, {group, improvements}].
+
+groups() ->
+ [{checks, [],
+ [file, syntax, compile, rules, expect, conflicts]},
+ {examples, [],
+ [empty, prec, yeccpre, lalr, old_yecc, other_examples]},
+ {bugs, [],
+ [otp_5369, otp_6362, otp_7945, otp_8483, otp_8486]},
+ {improvements, [], [otp_7292, otp_7969, otp_8919]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
app_test(doc) ->
["Tests the applications consistency."];
@@ -70,8 +98,6 @@ app_test(Config) when is_list(Config) ->
?line ok=?t:app_test(parsetools),
ok.
-checks(suite) ->
- [file, syntax, compile, rules, expect, conflicts].
file(doc) ->
"Bad files and options.";
@@ -730,8 +756,6 @@ rules(Config) when is_list(Config) ->
?line run(Config, Ts),
ok.
-examples(suite) ->
- [empty, prec, yeccpre, lalr, old_yecc, other_examples].
expect(doc) ->
"Check of expect.";
@@ -1283,8 +1307,6 @@ other_examples(Config) when is_list(Config) ->
?line run(Config, Ts),
ok.
-bugs(suite) ->
- [otp_5369, otp_6362, otp_7945, otp_8483, otp_8486].
otp_5369(doc) ->
"OTP-5369. A bug in parse_and_scan reported on erlang questions.";
@@ -1540,9 +1562,6 @@ otp_8486(Config) when is_list(Config) ->
?line run(Config, Ts),
ok.
-improvements(suite) ->
- [otp_7292, otp_7969, otp_8919].
-
otp_7292(doc) ->
"OTP-7292. Header declarations for edoc.";
otp_7292(suite) -> [];
diff --git a/lib/percept/doc/src/book.xml b/lib/percept/doc/src/book.xml
index acea01ab38..4de6bc4eb1 100644
--- a/lib/percept/doc/src/book.xml
+++ b/lib/percept/doc/src/book.xml
@@ -5,7 +5,7 @@
<header titlestyle="normal">
<copyright>
<year>2007</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/percept/doc/src/egd_ug.xmlsrc b/lib/percept/doc/src/egd_ug.xmlsrc
index 11f7ca6663..d9bece7e07 100644
--- a/lib/percept/doc/src/egd_ug.xmlsrc
+++ b/lib/percept/doc/src/egd_ug.xmlsrc
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2007</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/percept/doc/src/notes.xml b/lib/percept/doc/src/notes.xml
index c310a0e598..33bfa7baab 100644
--- a/lib/percept/doc/src/notes.xml
+++ b/lib/percept/doc/src/notes.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2007</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
@@ -32,6 +32,21 @@
</header>
<p>This document describes the changes made to the Percept application.</p>
+<section><title>Percept 0.8.5</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p> Fixes a race condition found in percept_db start/1
+ function. (Thanks to Ahmed Omar) </p>
+ <p>
+ Own Id: OTP-9012</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Percept 0.8.4</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/percept/doc/src/part.xml b/lib/percept/doc/src/part.xml
index a501ae526f..8053b279d5 100644
--- a/lib/percept/doc/src/part.xml
+++ b/lib/percept/doc/src/part.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2007</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/percept/doc/src/part_notes.xml b/lib/percept/doc/src/part_notes.xml
index 2580281240..4965e67640 100755
--- a/lib/percept/doc/src/part_notes.xml
+++ b/lib/percept/doc/src/part_notes.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2007</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/percept/doc/src/percept_ug.xmlsrc b/lib/percept/doc/src/percept_ug.xmlsrc
index 1164e26143..af2dfe101a 100644
--- a/lib/percept/doc/src/percept_ug.xmlsrc
+++ b/lib/percept/doc/src/percept_ug.xmlsrc
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2007</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/percept/doc/src/ref_man.xml b/lib/percept/doc/src/ref_man.xml
index b25f5b57a3..ac82d9378c 100644
--- a/lib/percept/doc/src/ref_man.xml
+++ b/lib/percept/doc/src/ref_man.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2007</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/percept/src/egd.erl b/lib/percept/src/egd.erl
index 4fb5b6c46a..1b26d96728 100644
--- a/lib/percept/src/egd.erl
+++ b/lib/percept/src/egd.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -42,6 +42,7 @@
%%==========================================================================
%% @type egd_image()
+%% @type font()
%% @type point() = {integer(), integer()}
%% @type color()
%% @type render_option() = {render_engine, opaque} | {render_engine, alpha}
diff --git a/lib/percept/src/percept.erl b/lib/percept/src/percept.erl
index f5e0f7e469..3a2d9f7601 100644
--- a/lib/percept/src/percept.erl
+++ b/lib/percept/src/percept.erl
@@ -185,10 +185,27 @@ stop_webserver() ->
undefined ->
{error, not_started};
Pid ->
- Pid ! {self(), get_port},
- receive Port -> ok end,
- Pid ! quit,
- stop_webserver(Port)
+ do_stop([], Pid)
+ end.
+
+do_stop([], Pid)->
+ Pid ! {self(), get_port},
+ Port = receive P -> P end,
+ do_stop(Port, Pid);
+do_stop(Port, [])->
+ case whereis(percept_httpd) of
+ undefined ->
+ {error, not_started};
+ Pid ->
+ do_stop(Port, Pid)
+ end;
+do_stop(Port, Pid)->
+ case find_service_pid_from_port(inets:services_info(), Port) of
+ undefined ->
+ {error, not_started};
+ Pid2 ->
+ Pid ! quit,
+ inets:stop(httpd, Pid2)
end.
%% @spec stop_webserver(integer()) -> ok | {error, not_started}
@@ -196,12 +213,7 @@ stop_webserver() ->
%% @hidden
stop_webserver(Port) ->
- case find_service_pid_from_port(inets:services_info(), Port) of
- undefined ->
- {error, not_started};
- Pid ->
- inets:stop(httpd, Pid)
- end.
+ do_stop(Port,[]).
%%==========================================================================
%%
diff --git a/lib/percept/src/percept_db.erl b/lib/percept/src/percept_db.erl
index edb0d79a29..52e9afb78f 100644
--- a/lib/percept/src/percept_db.erl
+++ b/lib/percept/src/percept_db.erl
@@ -33,7 +33,7 @@
]).
-include("percept.hrl").
-
+-define(STOP_TIMEOUT, 1000).
%%==========================================================================
%%
%% Type definitions
@@ -77,17 +77,32 @@
start() ->
case erlang:whereis(percept_db) of
undefined ->
- Pid = spawn( fun() -> init_percept_db() end),
- erlang:register(percept_db, Pid),
- {started, Pid};
+ {started, do_start()};
PerceptDB ->
- erlang:unregister(percept_db),
- PerceptDB ! {action, stop},
- Pid = spawn( fun() -> init_percept_db() end),
- erlang:register(percept_db, Pid),
- {restarted, Pid}
+ {restarted, restart(PerceptDB)}
end.
+%% @spec restart(pid()) -> pid()
+%% @private
+%% @doc restarts the percept database.
+
+-spec restart(pid())-> pid().
+
+restart(PerceptDB)->
+ stop_sync(PerceptDB),
+ do_start().
+
+%% @spec do_start(pid()) -> pid()
+%% @private
+%% @doc starts the percept database.
+
+-spec do_start()-> pid().
+
+do_start()->
+ Pid = spawn( fun() -> init_percept_db() end),
+ erlang:register(percept_db, Pid),
+ Pid.
+
%% @spec stop() -> not_started | {stopped, Pid}
%% Pid = pid()
%% @doc Stops the percept database.
@@ -103,6 +118,22 @@ stop() ->
{stopped, Pid}
end.
+%% @spec stop_sync(pid()) -> true
+%% @private
+%% @doc Stops the percept database, with a synchronous call.
+
+-spec stop_sync(pid())-> true.
+
+stop_sync(Pid)->
+ MonitorRef = erlang:monitor(process, Pid),
+ stop(),
+ receive
+ {'DOWN', MonitorRef, _Type, Pid, _Info}->
+ true
+ after ?STOP_TIMEOUT->
+ exit(Pid, kill)
+ end.
+
%% @spec insert(tuple()) -> ok
%% @doc Inserts a trace or profile message to the database.
diff --git a/lib/percept/test/Makefile b/lib/percept/test/Makefile
index 0984b02c81..d927386d1c 100644
--- a/lib/percept/test/Makefile
+++ b/lib/percept/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2007-2009. All Rights Reserved.
+# Copyright Ericsson AB 2007-2011. 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
@@ -82,8 +82,8 @@ release_spec: opt
release_tests_spec: make_emakefile
$(INSTALL_DIR) $(RELSYSDIR)
- $(INSTALL_DATA) percept.spec $(EMAKEFILE) $(SOURCE) $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ $(INSTALL_DATA) percept.spec percept.cover $(EMAKEFILE) $(SOURCE) $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
@tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
release_docs_spec:
diff --git a/lib/percept/test/egd_SUITE.erl b/lib/percept/test/egd_SUITE.erl
index fde02b47d5..51f090b39c 100644
--- a/lib/percept/test/egd_SUITE.erl
+++ b/lib/percept/test/egd_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -18,10 +18,10 @@
%%
-module(egd_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% Test server specific exports
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]).
-export([init_per_suite/1, end_per_suite/1]).
-export([init_per_testcase/2, end_per_testcase/2]).
@@ -54,16 +54,22 @@ end_per_testcase(_Case, Config) ->
?t:timetrap_cancel(Dog),
ok.
-all(suite) ->
- % Test cases
- [
- image_create_and_destroy,
- image_shape,
- image_primitives,
- image_colors,
- image_font,
- image_png_compliant
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [image_create_and_destroy, image_shape,
+ image_primitives, image_colors, image_font,
+ image_png_compliant].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%----------------------------------------------------------------------
%% Tests
diff --git a/lib/percept/test/percept.cover b/lib/percept/test/percept.cover
new file mode 100644
index 0000000000..8a5ad0a55e
--- /dev/null
+++ b/lib/percept/test/percept.cover
@@ -0,0 +1,2 @@
+{incl_app,percept,details}.
+
diff --git a/lib/percept/test/percept.spec b/lib/percept/test/percept.spec
index 75aacc1fd6..f3ef76bd60 100644
--- a/lib/percept/test/percept.spec
+++ b/lib/percept/test/percept.spec
@@ -1,2 +1 @@
-{topcase, {dir, "../percept_test"}}.
-
+{suites,"../percept_test",all}.
diff --git a/lib/percept/test/percept_SUITE.erl b/lib/percept/test/percept_SUITE.erl
index ff7cccdaa8..e415d92a04 100644
--- a/lib/percept/test/percept_SUITE.erl
+++ b/lib/percept/test/percept_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -18,10 +18,10 @@
%%
-module(percept_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% Test server specific exports
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]).
-export([init_per_suite/1, end_per_suite/1]).
-export([init_per_testcase/2, end_per_testcase/2]).
@@ -51,12 +51,20 @@ end_per_testcase(_Case, Config) ->
?t:timetrap_cancel(Dog),
ok.
-all(suite) ->
- % Test cases
- [ webserver,
- profile,
- analyze,
- analyze_dist].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [webserver, profile, analyze, analyze_dist].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%----------------------------------------------------------------------
%% Tests
@@ -70,6 +78,10 @@ webserver(Config) when is_list(Config) ->
% Explicit start inets?
?line {started, _, Port} = percept:start_webserver(),
?line ok = percept:stop_webserver(Port),
+ ?line {started, _, _} = percept:start_webserver(),
+ ?line ok = percept:stop_webserver(),
+ ?line {started, _, NewPort} = percept:start_webserver(),
+ ?line ok = percept:stop_webserver(NewPort),
?line application:stop(inets),
ok.
diff --git a/lib/percept/test/percept_db_SUITE.erl b/lib/percept/test/percept_db_SUITE.erl
new file mode 100644
index 0000000000..79be9714ba
--- /dev/null
+++ b/lib/percept/test/percept_db_SUITE.erl
@@ -0,0 +1,76 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2007-2010. 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(percept_db_SUITE).
+-include("test_server.hrl").
+
+%% Test server specific exports
+-export([all/1]).
+-export([init_per_suite/1, end_per_suite/1]).
+-export([init_per_testcase/2, end_per_testcase/2]).
+
+%% Test cases
+-export([
+ start/1
+ ]).
+
+%% Default timetrap timeout (set in init_per_testcase)
+-define(default_timeout, ?t:minutes(2)).
+-define(restarts, 10).
+-define(alive_timeout, 500).
+
+init_per_suite(Config) when is_list(Config) ->
+ Config.
+
+end_per_suite(Config) when is_list(Config) ->
+ Config.
+
+init_per_testcase(_Case, Config) ->
+ Dog = ?t:timetrap(?default_timeout),
+ [{max_size, 300}, {watchdog,Dog} | Config].
+
+end_per_testcase(_Case, Config) ->
+ Dog = ?config(watchdog, Config),
+ ?t:timetrap_cancel(Dog),
+ ok.
+
+all(suite) ->
+ % Test cases
+ [start].
+
+%%----------------------------------------------------------------------
+%% Tests
+%%----------------------------------------------------------------------
+
+start(suite) ->
+ [];
+start(doc) ->
+ ["Percept_db start and restart test."];
+start(Config) when is_list(Config) ->
+ ok = restart(?restarts),
+ {stopped, _DB} = percept_db:stop(),
+ ok.
+
+restart(0)->
+ ok;
+restart(N)->
+ {_, DB} = percept_db:start(),
+ timer:sleep(?alive_timeout),
+ true = erlang:is_process_alive(DB),
+ restart(N-1).
diff --git a/lib/percept/vsn.mk b/lib/percept/vsn.mk
index 443d25c78f..2a302991aa 100644
--- a/lib/percept/vsn.mk
+++ b/lib/percept/vsn.mk
@@ -1 +1 @@
-PERCEPT_VSN = 0.8.4
+PERCEPT_VSN = 0.8.5
diff --git a/lib/pman/doc/src/pman.xml b/lib/pman/doc/src/pman.xml
index 2469d141e5..84d5a5772a 100644
--- a/lib/pman/doc/src/pman.xml
+++ b/lib/pman/doc/src/pman.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1996</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/public_key/doc/src/book.xml b/lib/public_key/doc/src/book.xml
index d3b8c7a2c7..f8d1205e57 100644
--- a/lib/public_key/doc/src/book.xml
+++ b/lib/public_key/doc/src/book.xml
@@ -5,7 +5,7 @@
<header titlestyle="normal">
<copyright>
<year>2008</year>
- <year>2008</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/public_key/doc/src/cert_records.xml b/lib/public_key/doc/src/cert_records.xml
index 0d6113acef..ad4f5812cb 100644
--- a/lib/public_key/doc/src/cert_records.xml
+++ b/lib/public_key/doc/src/cert_records.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2008</year>
- <year>2008</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/public_key/doc/src/introduction.xml b/lib/public_key/doc/src/introduction.xml
index 71488e435a..8cf11ee10e 100644
--- a/lib/public_key/doc/src/introduction.xml
+++ b/lib/public_key/doc/src/introduction.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2008</year>
- <year>2008</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/public_key/doc/src/notes.xml b/lib/public_key/doc/src/notes.xml
index befbd3e586..14b43041ce 100644
--- a/lib/public_key/doc/src/notes.xml
+++ b/lib/public_key/doc/src/notes.xml
@@ -34,6 +34,25 @@
<file>notes.xml</file>
</header>
+<section><title>Public_Key 0.11</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Allows the public_key module to decode and encode RSA and
+ DSA keys encoded using the SubjectPublicKeyInfo format.
+ When pem_entry_encode is called on an RSA or DSA public
+ key type, the key is wrapped in the SubjectPublicKeyInfo
+ format.</p>
+ <p>
+ Own Id: OTP-9061</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Public_Key 0.10</title>
<section><title>Improvements and New Features</title>
diff --git a/lib/public_key/doc/src/part.xml b/lib/public_key/doc/src/part.xml
index b85fa063ce..c338a71613 100644
--- a/lib/public_key/doc/src/part.xml
+++ b/lib/public_key/doc/src/part.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2008</year>
- <year>2008</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/public_key/doc/src/part_notes.xml b/lib/public_key/doc/src/part_notes.xml
index 37ca516bc8..f855e76a6d 100644
--- a/lib/public_key/doc/src/part_notes.xml
+++ b/lib/public_key/doc/src/part_notes.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2008</year>
- <year>2008</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/public_key/doc/src/public_key.xml b/lib/public_key/doc/src/public_key.xml
index c72719fac4..c5f57214b1 100644
--- a/lib/public_key/doc/src/public_key.xml
+++ b/lib/public_key/doc/src/public_key.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2008</year>
- <year>2008</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
@@ -56,44 +56,43 @@
<p><em>Data Types </em></p>
- <p><c>boolean() = true | false</c></p>
+ <p><code>boolean() = true | false</code></p>
- <p><c>string = [bytes()]</c></p>
+ <p><code>string = [bytes()]</code></p>
- <p><c>der_encoded() = binary() </c></p>
-
- <p><c>decrypt_der() = binary() </c></p>
+ <p><code>pki_asn1_type() = 'Certificate' | 'RSAPrivateKey'| 'RSAPublicKey'
+ 'DSAPrivateKey' | 'DSAPublicKey' | 'DHParameter' | 'SubjectPublicKeyInfo'</code></p>
- <p><c>pki_asn1_type() = 'Certificate' | 'RSAPrivateKey'|
- 'DSAPrivateKey' | 'DHParameter'</c></p>
-
- <p><c>pem_entry () = {pki_asn1_type(), der_encoded() | decrypt_der(), not_encrypted |
- {"DES-CBC" | "DES-EDE3-CBC", crypto:rand_bytes(8)}}.</c></p>
-
- <p><c>rsa_public_key() = #'RSAPublicKey'{}</c></p>
+ <p><code>pem_entry () = {pki_asn1_type(), binary() %% DER or encrypted DER
+ not_encrypted | {"DES-CBC" | "DES-EDE3-CBC", crypto:rand_bytes(8)}}.</code></p>
- <p><c>rsa_private_key() = #'RSAPrivateKey'{} </c></p>
+ <p><code>rsa_public_key() = #'RSAPublicKey'{}</code></p>
- <p><c>dsa_public_key() = {integer(), #'Dss-Parms'{}} </c></p>
+ <p><code>rsa_private_key() = #'RSAPrivateKey'{} </code></p>
- <p><c>rsa_private_key() = #'RSAPrivateKey'{} </c></p>
+ <p><code>dsa_public_key() = {integer(), #'Dss-Parms'{}} </code></p>
+
+ <p><code>rsa_private_key() = #'RSAPrivateKey'{} </code></p>
- <p><c>dsa_private_key() = #'DSAPrivateKey'{}</c></p>
+ <p><code>dsa_private_key() = #'DSAPrivateKey'{}</code></p>
- <p><c> public_crypt_options() = [{rsa_pad, rsa_padding()}]. </c></p>
+ <p><code> public_crypt_options() = [{rsa_pad, rsa_padding()}]. </code></p>
- <p><c> rsa_padding() = 'rsa_pkcs1_padding' | 'rsa_pkcs1_oaep_padding'
- | 'rsa_no_padding'</c></p>
-
- <p><c> rsa_digest_type() = 'md5' | 'sha' </c></p>
+ <p><code> rsa_padding() = 'rsa_pkcs1_padding' | 'rsa_pkcs1_oaep_padding'
+ | 'rsa_no_padding'</code></p>
- <p><c> dss_digest_type() = 'none' | 'sha' </c></p>
+ <p><code> rsa_digest_type() = 'md5' | 'sha' </code></p>
+
+ <p><code> dss_digest_type() = 'none' | 'sha' </code></p>
+
+ <p><code> ssh_file() = openssh_public_key | rfc4716_public_key |
+ known_hosts | auth_keys </code></p>
-<!-- <p><c>policy_tree() = [Root, Children]</c></p> -->
+<!-- <p><code>policy_tree() = [Root, Children]</code></p> -->
-<!-- <p><c>Root = #policy_tree_node{}</c></p> -->
+<!-- <p><code>Root = #policy_tree_node{}</code></p> -->
-<!-- <p><c>Children = [] | policy_tree()</c></p> -->
+<!-- <p><code>Children = [] | policy_tree()</code></p> -->
<!-- <p> The policy_tree_node record has the following fields:</p> -->
@@ -207,17 +206,24 @@
<v> Password = string() </v>
</type>
<desc>
- <p>Decodes a pem entry. pem_decode/1 returns a list of
- pem entries.</p>
+ <p>Decodes a pem entry. pem_decode/1 returns a list of pem
+ entries. Note that if the pem entry is of type
+ 'SubjectPublickeyInfo' it will be further decoded to an
+ rsa_public_key() or dsa_public_key().</p>
</desc>
</func>
<func>
<name>pem_entry_encode(Asn1Type, Entity [,{CipherInfo, Password}]) -> pem_entry()</name>
- <fsummary> Creates a pem entry that can be feed to pem_encode/1.</fsummary>
+ <fsummary> Creates a pem entry that can be fed to pem_encode/1.</fsummary>
<type>
- <v>Asn1Type = atom()</v>
- <v>Entity = term()</v>
+ <v>Asn1Type = pki_asn1_type()</v>
+ <v>Entity = term() - The Erlang representation of
+ <c>Asn1Type</c>. If <c>Asn1Type</c> is 'SubjectPublicKeyInfo'
+ then <c>Entity</c> must be either an rsa_public_key() or a
+ dsa_public_key() and this function will create the appropriate
+ 'SubjectPublicKeyInfo' entry.
+ </v>
<v>CipherInfo = {"DES-CBC" | "DES-EDE3-CBC", crypto:rand_bytes(8)}</v>
<v>Password = string()</v>
</type>
@@ -251,7 +257,7 @@
</func>
<func>
- <name> pkix_decode_cert(Cert, otp|plain) -> #'Certificate'{} | #'OTPCertificate'{}</name>
+ <name>pkix_decode_cert(Cert, otp|plain) -> #'Certificate'{} | #'OTPCertificate'{}</name>
<fsummary> Decodes an asn1 der encoded pkix x509 certificate.</fsummary>
<type>
<v>Cert = der_encoded()</v>
@@ -396,6 +402,55 @@
</func>
<func>
+ <name>ssh_decode(SshBin, Type) -> [{public_key(), Attributes::list()}]</name>
+ <fsummary>Decodes a ssh file-binary. </fsummary>
+ <type>
+ <v>SshBin = binary()</v>
+ <d>Example {ok, SshBin} = file:read_file("known_hosts").</d>
+ <v> Type = public_key | ssh_file()</v>
+ <d>If <c>Type</c> is <c>public_key</c> the binary may be either
+ a rfc4716 public key or a openssh public key.</d>
+ </type>
+ <desc>
+ <p> Decodes a ssh file-binary. In the case of know_hosts or
+ auth_keys the binary may include one or more lines of the
+ file. Returns a list of public keys and their attributes, possible
+ attribute values depends on the file type represented by the
+ binary.
+ </p>
+
+ <taglist>
+ <tag>rfc4716 attributes - see RFC 4716</tag>
+ <item>{headers, [{string(), utf8_string()}]}</item>
+ <tag>auth_key attributes - see man sshd </tag>
+ <item>{comment, string()}</item>
+ <item>{options, [string()]}</item>
+ <item>{bits, integer()} - In ssh version 1 files</item>
+ <tag>known_host attributes - see man sshd</tag>
+ <item>{hostnames, [string()]}</item>
+ <item>{comment, string()}</item>
+ <item>{bits, integer()} - In ssh version 1 files</item>
+ </taglist>
+
+ </desc>
+ </func>
+
+ <func>
+ <name>ssh_encode([{Key, Attributes}], Type) -> binary()</name>
+ <fsummary> Encodes a list of ssh file entries to a binary.</fsummary>
+ <type>
+ <v>Key = public_key()</v>
+ <v>Attributes = list()</v>
+ <v>Type = ssh_file()</v>
+ </type>
+ <desc>
+ <p>Encodes a list of ssh file entries (public keys and attributes) to a binary. Possible
+ attributes depends on the file type, see <seealso
+ marker="ssh_decode"> ssh_decode/2 </seealso></p>
+ </desc>
+ </func>
+
+ <func>
<name>verify(Msg, DigestType, Signature, Key) -> boolean()</name>
<fsummary>Verifies a digital signature.</fsummary>
<type>
diff --git a/lib/public_key/doc/src/public_key_records.xml b/lib/public_key/doc/src/public_key_records.xml
index 45b7106859..bb90290266 100644
--- a/lib/public_key/doc/src/public_key_records.xml
+++ b/lib/public_key/doc/src/public_key_records.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2008</year>
- <year>2008</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/public_key/doc/src/ref_man.xml b/lib/public_key/doc/src/ref_man.xml
index 0f11281d05..285cc36c6f 100644
--- a/lib/public_key/doc/src/ref_man.xml
+++ b/lib/public_key/doc/src/ref_man.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2008</year>
- <year>2008</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/public_key/include/public_key.hrl b/lib/public_key/include/public_key.hrl
index 4950597fb5..5f97d80f7e 100644
--- a/lib/public_key/include/public_key.hrl
+++ b/lib/public_key/include/public_key.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -70,13 +70,18 @@
interim_reasons_mask
}).
-
--type der_encoded() :: binary().
--type decrypt_der() :: binary().
--type pki_asn1_type() :: 'Certificate' | 'RSAPrivateKey'
- | 'DSAPrivateKey' | 'DHParameter'.
--type pem_entry() :: {pki_asn1_type(), der_encoded() | decrypt_der(),
+-type public_key() :: rsa_public_key() | dsa_public_key().
+-type rsa_public_key() :: #'RSAPublicKey'{}.
+-type rsa_private_key() :: #'RSAPrivateKey'{}.
+-type dsa_private_key() :: #'DSAPrivateKey'{}.
+-type dsa_public_key() :: {integer(), #'Dss-Parms'{}}.
+-type pki_asn1_type() :: 'Certificate' | 'RSAPrivateKey' | 'RSAPublicKey'
+ | 'DSAPrivateKey' | 'DSAPublicKey' | 'DHParameter'
+ | 'SubjectPublicKeyInfo'.
+-type pem_entry() :: {pki_asn1_type(), binary(), %% DER or Encrypted DER
not_encrypted | {Cipher :: string(), Salt :: binary()}}.
-type asn1_type() :: atom(). %% see "OTP-PUB-KEY.hrl
+-type ssh_file() :: openssh_public_key | rfc4716_public_key | known_hosts |
+ auth_keys.
-endif. % -ifdef(public_key).
diff --git a/lib/public_key/src/Makefile b/lib/public_key/src/Makefile
index 51f405361b..5a24b02d2a 100644
--- a/lib/public_key/src/Makefile
+++ b/lib/public_key/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2008-2009. All Rights Reserved.
+# Copyright Ericsson AB 2008-2011. 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
@@ -41,6 +41,7 @@ RELSYSDIR = $(RELEASE_PATH)/lib/public_key-$(VSN)
MODULES = \
public_key \
pubkey_pem \
+ pubkey_ssh \
pubkey_cert \
pubkey_cert_records
diff --git a/lib/public_key/src/pubkey_cert.erl b/lib/public_key/src/pubkey_cert.erl
index fadb993ed9..5ab9642279 100644
--- a/lib/public_key/src/pubkey_cert.erl
+++ b/lib/public_key/src/pubkey_cert.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -38,7 +38,7 @@
%%====================================================================
%%--------------------------------------------------------------------
--spec verify_data(der_encoded()) -> {md5 | sha, binary(), binary()}.
+-spec verify_data(DER::binary()) -> {md5 | sha, binary(), binary()}.
%%
%% Description: Extracts data from DerCert needed to call public_key:verify/4.
%%--------------------------------------------------------------------
@@ -146,7 +146,7 @@ validate_issuer(OtpCert, Issuer, UserState, VerifyFun) ->
verify_fun(OtpCert, {bad_cert, invalid_issuer}, UserState, VerifyFun)
end.
%%--------------------------------------------------------------------
--spec validate_signature(#'OTPCertificate'{}, der_encoded(),
+-spec validate_signature(#'OTPCertificate'{}, DER::binary(),
term(),term(), term(), fun()) -> term().
%%
diff --git a/lib/public_key/src/pubkey_cert_records.erl b/lib/public_key/src/pubkey_cert_records.erl
index 20b322b4a4..b86d7a1f0c 100644
--- a/lib/public_key/src/pubkey_cert_records.erl
+++ b/lib/public_key/src/pubkey_cert_records.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -23,14 +23,14 @@
-include("public_key.hrl").
--export([decode_cert/1, transform/2]).
+-export([decode_cert/1, transform/2, supportedPublicKeyAlgorithms/1]).
%%====================================================================
%% Internal application API
%%====================================================================
%%--------------------------------------------------------------------
--spec decode_cert(der_encoded()) -> {ok, #'OTPCertificate'{}}.
+-spec decode_cert(DerCert::binary()) -> {ok, #'OTPCertificate'{}}.
%%
%% Description: Recursively decodes a Certificate.
%%--------------------------------------------------------------------
@@ -80,16 +80,24 @@ transform(Other,_) ->
Other.
%%--------------------------------------------------------------------
-%%% Internal functions
+-spec supportedPublicKeyAlgorithms(Oid::tuple()) -> asn1_type().
+%%
+%% Description: Returns the public key type for an algorithm
+%% identifier tuple as found in SubjectPublicKeyInfo.
+%%
%%--------------------------------------------------------------------
-
-%%% SubjectPublicKey
supportedPublicKeyAlgorithms(?'rsaEncryption') -> 'RSAPublicKey';
supportedPublicKeyAlgorithms(?'id-dsa') -> 'DSAPublicKey';
supportedPublicKeyAlgorithms(?'dhpublicnumber') -> 'DHPublicKey';
supportedPublicKeyAlgorithms(?'id-keyExchangeAlgorithm') -> 'KEA-PublicKey';
supportedPublicKeyAlgorithms(?'id-ecPublicKey') -> 'ECPoint'.
+%%--------------------------------------------------------------------
+%%% Internal functions
+%%--------------------------------------------------------------------
+
+%%% SubjectPublicKey
+
decode_supportedPublicKey(#'OTPSubjectPublicKeyInfo'{algorithm= PA =
#'PublicKeyAlgorithm'{algorithm=Algo},
subjectPublicKey = {0,SPK0}}) ->
diff --git a/lib/public_key/src/pubkey_pem.erl b/lib/public_key/src/pubkey_pem.erl
index 31d881973a..c26815bc04 100644
--- a/lib/public_key/src/pubkey_pem.erl
+++ b/lib/public_key/src/pubkey_pem.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -69,8 +69,9 @@ encode(PemEntries) ->
encode_pem_entries(PemEntries).
%%--------------------------------------------------------------------
--spec decipher({pki_asn1_type(), decrypt_der(),{Cipher :: string(), Salt :: binary()}}, string()) ->
- der_encoded().
+-spec decipher({pki_asn1_type(), DerEncrypted::binary(),{Cipher :: string(),
+ Salt :: binary()}},
+ string()) -> Der::binary().
%%
%% Description: Deciphers a decrypted pem entry.
%%--------------------------------------------------------------------
@@ -78,7 +79,8 @@ decipher({_, DecryptDer, {Cipher,Salt}}, Password) ->
decode_key(DecryptDer, Password, Cipher, Salt).
%%--------------------------------------------------------------------
--spec cipher(der_encoded(),{Cipher :: string(), Salt :: binary()} , string()) -> binary().
+-spec cipher(Der::binary(),{Cipher :: string(), Salt :: binary()} ,
+ string()) -> binary().
%%
%% Description: Ciphers a PEM entry
%%--------------------------------------------------------------------
@@ -91,13 +93,13 @@ cipher(Der, {Cipher,Salt}, Password)->
encode_pem_entries(Entries) ->
[encode_pem_entry(Entry) || Entry <- Entries].
-encode_pem_entry({Asn1Type, Der, not_encrypted}) ->
- StartStr = pem_start(Asn1Type),
- [StartStr, "\n", b64encode_and_split(Der), pem_end(StartStr) ,"\n\n"];
-encode_pem_entry({Asn1Type, Der, {Cipher, Salt}}) ->
- StartStr = pem_start(Asn1Type),
+encode_pem_entry({Type, Der, not_encrypted}) ->
+ StartStr = pem_start(Type),
+ [StartStr, "\n", b64encode_and_split(Der), "\n", pem_end(StartStr) ,"\n\n"];
+encode_pem_entry({Type, Der, {Cipher, Salt}}) ->
+ StartStr = pem_start(Type),
[StartStr,"\n", pem_decrypt(),"\n", pem_decrypt_info(Cipher, Salt),"\n",
- b64encode_and_split(Der), pem_end(StartStr) ,"\n\n"].
+ b64encode_and_split(Der), "\n", pem_end(StartStr) ,"\n\n"].
decode_pem_entries([], Entries) ->
lists:reverse(Entries);
@@ -115,17 +117,17 @@ decode_pem_entries([Start| Lines], Entries) ->
end.
decode_pem_entry(Start, [<<"Proc-Type: 4,ENCRYPTED", _/binary>>, Line | Lines]) ->
- Asn1Type = asn1_type(Start),
+ Type = asn1_type(Start),
Cs = erlang:iolist_to_binary(Lines),
Decoded = base64:mime_decode(Cs),
[_, DekInfo0] = string:tokens(binary_to_list(Line), ": "),
[Cipher, Salt] = string:tokens(DekInfo0, ","),
- {Asn1Type, Decoded, {Cipher, unhex(Salt)}};
+ {Type, Decoded, {Cipher, unhex(Salt)}};
decode_pem_entry(Start, Lines) ->
- Asn1Type = asn1_type(Start),
+ Type = asn1_type(Start),
Cs = erlang:iolist_to_binary(Lines),
- Der = base64:mime_decode(Cs),
- {Asn1Type, Der, not_encrypted}.
+ Decoded = base64:mime_decode(Cs),
+ {Type, Decoded, not_encrypted}.
split_bin(Bin) ->
split_bin(0, Bin).
@@ -145,19 +147,15 @@ split_bin(N, Bin) ->
b64encode_and_split(Bin) ->
split_lines(base64:encode(Bin)).
+split_lines(<<Text:?ENCODED_LINE_LENGTH/binary>>) ->
+ [Text];
split_lines(<<Text:?ENCODED_LINE_LENGTH/binary, Rest/binary>>) ->
[Text, $\n | split_lines(Rest)];
split_lines(Bin) ->
- [Bin, $\n].
+ [Bin].
%% Ignore white space at end of line
-join_entry([<<"-----END CERTIFICATE-----", _/binary>>| Lines], Entry) ->
- {lists:reverse(Entry), Lines};
-join_entry([<<"-----END RSA PRIVATE KEY-----", _/binary>>| Lines], Entry) ->
- {lists:reverse(Entry), Lines};
-join_entry([<<"-----END DSA PRIVATE KEY-----", _/binary>>| Lines], Entry) ->
- {lists:reverse(Entry), Lines};
-join_entry([<<"-----END DH PARAMETERS-----", _/binary>>| Lines], Entry) ->
+join_entry([<<"-----END ", _/binary>>| Lines], Entry) ->
{lists:reverse(Entry), Lines};
join_entry([Line | Lines], Entry) ->
join_entry(Lines, [Line | Entry]).
@@ -210,15 +208,22 @@ pem_start('Certificate') ->
<<"-----BEGIN CERTIFICATE-----">>;
pem_start('RSAPrivateKey') ->
<<"-----BEGIN RSA PRIVATE KEY-----">>;
+pem_start('RSAPublicKey') ->
+ <<"-----BEGIN RSA PUBLIC KEY-----">>;
+pem_start('SubjectPublicKeyInfo') ->
+ <<"-----BEGIN PUBLIC KEY-----">>;
pem_start('DSAPrivateKey') ->
<<"-----BEGIN DSA PRIVATE KEY-----">>;
pem_start('DHParameter') ->
<<"-----BEGIN DH PARAMETERS-----">>.
-
pem_end(<<"-----BEGIN CERTIFICATE-----">>) ->
<<"-----END CERTIFICATE-----">>;
pem_end(<<"-----BEGIN RSA PRIVATE KEY-----">>) ->
<<"-----END RSA PRIVATE KEY-----">>;
+pem_end(<<"-----BEGIN RSA PUBLIC KEY-----">>) ->
+ <<"-----END RSA PUBLIC KEY-----">>;
+pem_end(<<"-----BEGIN PUBLIC KEY-----">>) ->
+ <<"-----END PUBLIC KEY-----">>;
pem_end(<<"-----BEGIN DSA PRIVATE KEY-----">>) ->
<<"-----END DSA PRIVATE KEY-----">>;
pem_end(<<"-----BEGIN DH PARAMETERS-----">>) ->
@@ -230,6 +235,10 @@ asn1_type(<<"-----BEGIN CERTIFICATE-----">>) ->
'Certificate';
asn1_type(<<"-----BEGIN RSA PRIVATE KEY-----">>) ->
'RSAPrivateKey';
+asn1_type(<<"-----BEGIN RSA PUBLIC KEY-----">>) ->
+ 'RSAPublicKey';
+asn1_type(<<"-----BEGIN PUBLIC KEY-----">>) ->
+ 'SubjectPublicKeyInfo';
asn1_type(<<"-----BEGIN DSA PRIVATE KEY-----">>) ->
'DSAPrivateKey';
asn1_type(<<"-----BEGIN DH PARAMETERS-----">>) ->
diff --git a/lib/public_key/src/pubkey_ssh.erl b/lib/public_key/src/pubkey_ssh.erl
new file mode 100644
index 0000000000..f342eab159
--- /dev/null
+++ b/lib/public_key/src/pubkey_ssh.erl
@@ -0,0 +1,431 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2011-2011. 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(pubkey_ssh).
+
+-include("public_key.hrl").
+
+-export([decode/2, encode/2]).
+
+-define(UINT32(X), X:32/unsigned-big-integer).
+%% Max encoded line length is 72, but conformance examples use 68
+%% Comment from rfc 4716: "The following are some examples of public
+%% key files that are compliant (note that the examples all wrap
+%% before 72 bytes to meet IETF document requirements; however, they
+%% are still compliant.)" So we choose to use 68 also.
+-define(ENCODED_LINE_LENGTH, 68).
+
+%%====================================================================
+%% Internal application API
+%%====================================================================
+
+%%--------------------------------------------------------------------
+-spec decode(binary(), public_key | ssh_file()) -> [{public_key(), Attributes::list()}].
+%%
+%% Description: Decodes a ssh file-binary.
+%%--------------------------------------------------------------------
+decode(Bin, public_key)->
+ case binary:match(Bin, begin_marker()) of
+ nomatch ->
+ openssh_decode(Bin, openssh_public_key);
+ _ ->
+ rfc4716_decode(Bin)
+ end;
+decode(Bin, rfc4716_public_key) ->
+ rfc4716_decode(Bin);
+decode(Bin, Type) ->
+ openssh_decode(Bin, Type).
+
+%%--------------------------------------------------------------------
+-spec encode([{public_key(), Attributes::list()}], ssh_file()) ->
+ binary().
+%%
+%% Description: Encodes a list of ssh file entries.
+%%--------------------------------------------------------------------
+encode(Entries, Type) ->
+ erlang:iolist_to_binary(lists:map(fun({Key, Attributes}) ->
+ do_encode(Type, Key, Attributes)
+ end, Entries)).
+
+%%--------------------------------------------------------------------
+%%% Internal functions
+%%--------------------------------------------------------------------
+begin_marker() ->
+ <<"---- BEGIN SSH2 PUBLIC KEY ----">>.
+end_marker() ->
+ <<"---- END SSH2 PUBLIC KEY ----">>.
+
+rfc4716_decode(Bin) ->
+ Lines = binary:split(Bin, <<"\n">>, [global]),
+ do_rfc4716_decode(Lines, []).
+
+do_rfc4716_decode([<<"---- BEGIN SSH2 PUBLIC KEY ----", _/binary>> | Lines], Acc) ->
+ do_rfc4716_decode(Lines, Acc);
+%% Ignore empty lines before or after begin/end - markers.
+do_rfc4716_decode([<<>> | Lines], Acc) ->
+ do_rfc4716_decode(Lines, Acc);
+do_rfc4716_decode([], Acc) ->
+ lists:reverse(Acc);
+do_rfc4716_decode(Lines, Acc) ->
+ {Headers, PubKey, Rest} = rfc4716_decode_lines(Lines, []),
+ case Headers of
+ [_|_] ->
+ do_rfc4716_decode(Rest, [{PubKey, [{headers, Headers}]} | Acc]);
+ _ ->
+ do_rfc4716_decode(Rest, [{PubKey, []} | Acc])
+ end.
+
+rfc4716_decode_lines([Line | Lines], Acc) ->
+ case binary:last(Line) of
+ $\\ ->
+ NewLine = binary:replace(Line,<<"\\">>, hd(Lines), []),
+ rfc4716_decode_lines([NewLine | tl(Lines)], Acc);
+ _ ->
+ rfc4716_decode_line(Line, Lines, Acc)
+ end.
+
+rfc4716_decode_line(Line, Lines, Acc) ->
+ case binary:split(Line, <<":">>) of
+ [Tag, Value] ->
+ rfc4716_decode_lines(Lines, [{string_decode(Tag), unicode_decode(Value)} | Acc]);
+ _ ->
+ {Body, Rest} = join_entry([Line | Lines], []),
+ {lists:reverse(Acc), rfc4716_pubkey_decode(base64:mime_decode(Body)), Rest}
+ end.
+
+join_entry([<<"---- END SSH2 PUBLIC KEY ----", _/binary>>| Lines], Entry) ->
+ {lists:reverse(Entry), Lines};
+join_entry([Line | Lines], Entry) ->
+ join_entry(Lines, [Line | Entry]).
+
+
+rfc4716_pubkey_decode(<<?UINT32(Len), Type:Len/binary,
+ ?UINT32(SizeE), E:SizeE/binary,
+ ?UINT32(SizeN), N:SizeN/binary>>) when Type == <<"ssh-rsa">> ->
+ #'RSAPublicKey'{modulus = erlint(SizeN, N),
+ publicExponent = erlint(SizeE, E)};
+
+rfc4716_pubkey_decode(<<?UINT32(Len), Type:Len/binary,
+ ?UINT32(SizeP), P:SizeP/binary,
+ ?UINT32(SizeQ), Q:SizeQ/binary,
+ ?UINT32(SizeG), G:SizeG/binary,
+ ?UINT32(SizeY), Y:SizeY/binary>>) when Type == <<"ssh-dss">> ->
+ {erlint(SizeY, Y),
+ #'Dss-Parms'{p = erlint(SizeP, P),
+ q = erlint(SizeQ, Q),
+ g = erlint(SizeG, G)}}.
+
+openssh_decode(Bin, FileType) ->
+ Lines = binary:split(Bin, <<"\n">>, [global]),
+ do_openssh_decode(FileType, Lines, []).
+
+do_openssh_decode(_, [], Acc) ->
+ lists:reverse(Acc);
+%% Ignore empty lines
+do_openssh_decode(FileType, [<<>> | Lines], Acc) ->
+ do_openssh_decode(FileType, Lines, Acc);
+%% Ignore lines that start with #
+do_openssh_decode(FileType,[<<"#", _/binary>> | Lines], Acc) ->
+ do_openssh_decode(FileType, Lines, Acc);
+do_openssh_decode(auth_keys = FileType, [Line | Lines], Acc) ->
+ Split = binary:split(Line, <<" ">>, [global]),
+ case mend_split(Split, []) of
+ %% ssh2
+ [Options, KeyType, Base64Enc, Comment] when KeyType == <<"ssh-rsa">>;
+ KeyType == <<"ssh-dss">> ->
+ do_openssh_decode(FileType, Lines,
+ [{openssh_pubkey_decode(KeyType, Base64Enc),
+ [{comment, string_decode(Comment)},
+ {options, comma_list_decode(Options)}]}
+ | Acc]);
+
+ [KeyType, Base64Enc, Comment] when KeyType == <<"ssh-rsa">>;
+ KeyType == <<"ssh-dss">> ->
+ do_openssh_decode(FileType, Lines,
+ [{openssh_pubkey_decode(KeyType, Base64Enc),
+ [{comment, string_decode(Comment)}]} | Acc]);
+ %% ssh1
+ [Options, Bits, Exponent, Modulus, Comment] ->
+ do_openssh_decode(FileType, Lines,
+ [{ssh1_rsa_pubkey_decode(Modulus, Exponent),
+ [{comment, string_decode(Comment)},
+ {options, comma_list_decode(Options)},
+ {bits, integer_decode(Bits)}]} | Acc]);
+ [Bits, Exponent, Modulus, Comment] ->
+ do_openssh_decode(FileType, Lines,
+ [{ssh1_rsa_pubkey_decode(Modulus, Exponent),
+ [{comment, string_decode(Comment)},
+ {bits, integer_decode(Bits)}]} | Acc])
+ end;
+
+do_openssh_decode(known_hosts = FileType, [Line | Lines], Acc) ->
+ case binary:split(Line, <<" ">>, [global]) of
+ %% ssh 2
+ [HostNames, KeyType, Base64Enc] when KeyType == <<"ssh-rsa">>;
+ KeyType == <<"ssh-dss">> ->
+ do_openssh_decode(FileType, Lines,
+ [{openssh_pubkey_decode(KeyType, Base64Enc),
+ [{hostnames, comma_list_decode(HostNames)}]}| Acc]);
+ [HostNames, KeyType, Base64Enc, Comment] when KeyType == <<"ssh-rsa">>;
+ KeyType == <<"ssh-dss">> ->
+ do_openssh_decode(FileType, Lines,
+ [{openssh_pubkey_decode(KeyType, Base64Enc),
+ [{comment, string_decode(Comment)},
+ {hostnames, comma_list_decode(HostNames)}]} | Acc]);
+ %% ssh 1
+ [HostNames, Bits, Exponent, Modulus, Comment] ->
+ do_openssh_decode(FileType, Lines,
+ [{ssh1_rsa_pubkey_decode(Modulus, Exponent),
+ [{comment, string_decode(Comment)},
+ {hostnames, comma_list_decode(HostNames)},
+ {bits, integer_decode(Bits)}]} | Acc]);
+ [HostNames, Bits, Exponent, Modulus] ->
+ do_openssh_decode(FileType, Lines,
+ [{ssh1_rsa_pubkey_decode(Modulus, Exponent),
+ [{comment, []},
+ {hostnames, comma_list_decode(HostNames)},
+ {bits, integer_decode(Bits)}]} | Acc])
+ end;
+
+do_openssh_decode(openssh_public_key = FileType, [Line | Lines], Acc) ->
+ case binary:split(Line, <<" ">>, [global]) of
+ [KeyType, Base64Enc, Comment0] when KeyType == <<"ssh-rsa">>;
+ KeyType == <<"ssh-dss">> ->
+ Comment = string:strip(binary_to_list(Comment0), right, $\n),
+ do_openssh_decode(FileType, Lines,
+ [{openssh_pubkey_decode(KeyType, Base64Enc),
+ [{comment, Comment}]} | Acc])
+ end.
+
+
+openssh_pubkey_decode(<<"ssh-rsa">>, Base64Enc) ->
+ <<?UINT32(StrLen), _:StrLen/binary,
+ ?UINT32(SizeE), E:SizeE/binary,
+ ?UINT32(SizeN), N:SizeN/binary>>
+ = base64:mime_decode(Base64Enc),
+ #'RSAPublicKey'{modulus = erlint(SizeN, N),
+ publicExponent = erlint(SizeE, E)};
+
+openssh_pubkey_decode(<<"ssh-dss">>, Base64Enc) ->
+ <<?UINT32(StrLen), _:StrLen/binary,
+ ?UINT32(SizeP), P:SizeP/binary,
+ ?UINT32(SizeQ), Q:SizeQ/binary,
+ ?UINT32(SizeG), G:SizeG/binary,
+ ?UINT32(SizeY), Y:SizeY/binary>>
+ = base64:mime_decode(Base64Enc),
+ {erlint(SizeY, Y),
+ #'Dss-Parms'{p = erlint(SizeP, P),
+ q = erlint(SizeQ, Q),
+ g = erlint(SizeG, G)}}.
+
+erlint(MPIntSize, MPIntValue) ->
+ Bits= MPIntSize * 8,
+ <<Integer:Bits/integer>> = MPIntValue,
+ Integer.
+
+ssh1_rsa_pubkey_decode(MBin, EBin) ->
+ #'RSAPublicKey'{modulus = integer_decode(MBin),
+ publicExponent = integer_decode(EBin)}.
+
+integer_decode(BinStr) ->
+ list_to_integer(binary_to_list(BinStr)).
+
+string_decode(BinStr) ->
+ binary_to_list(BinStr).
+
+unicode_decode(BinStr) ->
+ unicode:characters_to_list(BinStr).
+
+comma_list_decode(BinOpts) ->
+ CommaList = binary:split(BinOpts, <<",">>, [global]),
+ lists:map(fun(Item) ->
+ binary_to_list(Item)
+ end, CommaList).
+
+do_encode(rfc4716_public_key, Key, Attributes) ->
+ rfc4716_encode(Key, proplists:get_value(headers, Attributes, []), []);
+
+do_encode(Type, Key, Attributes) ->
+ openssh_encode(Type, Key, Attributes).
+
+rfc4716_encode(Key, [],[]) ->
+ erlang:iolist_to_binary([begin_marker(),"\n",
+ split_lines(base64:encode(ssh2_pubkey_encode(Key))),
+ "\n", end_marker(), "\n"]);
+rfc4716_encode(Key, [], [_|_] = Acc) ->
+ erlang:iolist_to_binary([begin_marker(), "\n",
+ lists:reverse(Acc),
+ split_lines(base64:encode(ssh2_pubkey_encode(Key))),
+ "\n", end_marker(), "\n"]);
+rfc4716_encode(Key, [ Header | Headers], Acc) ->
+ LinesStr = rfc4716_encode_header(Header),
+ rfc4716_encode(Key, Headers, [LinesStr | Acc]).
+
+rfc4716_encode_header({Tag, Value}) ->
+ TagLen = length(Tag),
+ ValueLen = length(Value),
+ case TagLen + 1 + ValueLen of
+ N when N > ?ENCODED_LINE_LENGTH ->
+ NumOfChars = ?ENCODED_LINE_LENGTH - (TagLen + 1),
+ {First, Rest} = lists:split(NumOfChars, Value),
+ [Tag,":" , First, [$\\], "\n", rfc4716_encode_value(Rest) , "\n"];
+ _ ->
+ [Tag, ":", Value, "\n"]
+ end.
+
+rfc4716_encode_value(Value) ->
+ case length(Value) of
+ N when N > ?ENCODED_LINE_LENGTH ->
+ {First, Rest} = lists:split(?ENCODED_LINE_LENGTH, Value),
+ [First, [$\\], "\n", rfc4716_encode_value(Rest)];
+ _ ->
+ Value
+ end.
+
+openssh_encode(openssh_public_key, Key, Attributes) ->
+ Comment = proplists:get_value(comment, Attributes),
+ Enc = base64:encode(ssh2_pubkey_encode(Key)),
+ erlang:iolist_to_binary([key_type(Key), " ", Enc, " ", Comment, "\n"]);
+
+openssh_encode(auth_keys, Key, Attributes) ->
+ Comment = proplists:get_value(comment, Attributes, ""),
+ Options = proplists:get_value(options, Attributes, undefined),
+ Bits = proplists:get_value(bits, Attributes, undefined),
+ case Bits of
+ undefined ->
+ openssh_ssh2_auth_keys_encode(Options, Key, Comment);
+ _ ->
+ openssh_ssh1_auth_keys_encode(Options, Bits, Key, Comment)
+ end;
+openssh_encode(known_hosts, Key, Attributes) ->
+ Comment = proplists:get_value(comment, Attributes, ""),
+ Hostnames = proplists:get_value(hostnames, Attributes),
+ Bits = proplists:get_value(bits, Attributes, undefined),
+ case Bits of
+ undefined ->
+ openssh_ssh2_know_hosts_encode(Hostnames, Key, Comment);
+ _ ->
+ openssh_ssh1_known_hosts_encode(Hostnames, Bits, Key, Comment)
+ end.
+
+openssh_ssh2_auth_keys_encode(undefined, Key, Comment) ->
+ erlang:iolist_to_binary([key_type(Key)," ", base64:encode(ssh2_pubkey_encode(Key)), line_end(Comment)]);
+openssh_ssh2_auth_keys_encode(Options, Key, Comment) ->
+ erlang:iolist_to_binary([comma_list_encode(Options, []), " ",
+ key_type(Key)," ", base64:encode(ssh2_pubkey_encode(Key)), line_end(Comment)]).
+
+openssh_ssh1_auth_keys_encode(undefined, Bits,
+ #'RSAPublicKey'{modulus = N, publicExponent = E},
+ Comment) ->
+ erlang:iolist_to_binary([integer_to_list(Bits), " ", integer_to_list(E), " ", integer_to_list(N),
+ line_end(Comment)]);
+openssh_ssh1_auth_keys_encode(Options, Bits,
+ #'RSAPublicKey'{modulus = N, publicExponent = E},
+ Comment) ->
+ erlang:iolist_to_binary([comma_list_encode(Options, []), " ", integer_to_list(Bits),
+ " ", integer_to_list(E), " ", integer_to_list(N), line_end(Comment)]).
+
+openssh_ssh2_know_hosts_encode(Hostnames, Key, Comment) ->
+ erlang:iolist_to_binary([comma_list_encode(Hostnames, []), " ",
+ key_type(Key)," ", base64:encode(ssh2_pubkey_encode(Key)), line_end(Comment)]).
+
+openssh_ssh1_known_hosts_encode(Hostnames, Bits,
+ #'RSAPublicKey'{modulus = N, publicExponent = E},
+ Comment) ->
+ erlang:iolist_to_binary([comma_list_encode(Hostnames, [])," ", integer_to_list(Bits)," ",
+ integer_to_list(E)," ", integer_to_list(N), line_end(Comment)]).
+
+line_end("") ->
+ "\n";
+line_end(Comment) ->
+ [" ", Comment, "\n"].
+
+key_type(#'RSAPublicKey'{}) ->
+ <<"ssh-rsa">>;
+key_type({_, #'Dss-Parms'{}}) ->
+ <<"ssh-dss">>.
+
+comma_list_encode([Option], []) ->
+ Option;
+comma_list_encode([Option], Acc) ->
+ Acc ++ "," ++ Option;
+comma_list_encode([Option | Rest], []) ->
+ comma_list_encode(Rest, Option);
+comma_list_encode([Option | Rest], Acc) ->
+ comma_list_encode(Rest, Acc ++ "," ++ Option).
+
+ssh2_pubkey_encode(#'RSAPublicKey'{modulus = N, publicExponent = E}) ->
+ TypeStr = <<"ssh-rsa">>,
+ StrLen = size(TypeStr),
+ EBin = crypto:mpint(E),
+ NBin = crypto:mpint(N),
+ <<?UINT32(StrLen), TypeStr:StrLen/binary,
+ EBin/binary,
+ NBin/binary>>;
+ssh2_pubkey_encode({Y, #'Dss-Parms'{p = P, q = Q, g = G}}) ->
+ TypeStr = <<"ssh-dss">>,
+ StrLen = size(TypeStr),
+ PBin = crypto:mpint(P),
+ QBin = crypto:mpint(Q),
+ GBin = crypto:mpint(G),
+ YBin = crypto:mpint(Y),
+ <<?UINT32(StrLen), TypeStr:StrLen/binary,
+ PBin/binary,
+ QBin/binary,
+ GBin/binary,
+ YBin/binary>>.
+
+mend_split([Part1, Part2 | Rest] = List, Acc) ->
+ case option_end(Part1, Part2) of
+ true ->
+ lists:reverse(Acc) ++ List;
+ false ->
+ case length(binary:matches(Part1, <<"\"">>)) of
+ N when N rem 2 == 0 ->
+ mend_split(Rest, [Part1 | Acc]);
+ _ ->
+ mend_split([<<Part1/binary, Part2/binary>> | Rest], Acc)
+ end
+ end.
+
+option_end(Part1, Part2) ->
+ (is_key_field(Part1) orelse is_bits_field(Part1))
+ orelse
+ (is_key_field(Part2) orelse is_bits_field(Part2)).
+
+is_key_field(<<"ssh-dss">>) ->
+ true;
+is_key_field(<<"ssh-rsa">>) ->
+ true;
+is_key_field(_) ->
+ false.
+
+is_bits_field(Part) ->
+ try list_to_integer(binary_to_list(Part)) of
+ _ ->
+ true
+ catch _:_ ->
+ false
+ end.
+
+split_lines(<<Text:?ENCODED_LINE_LENGTH/binary>>) ->
+ [Text];
+split_lines(<<Text:?ENCODED_LINE_LENGTH/binary, Rest/binary>>) ->
+ [Text, $\n | split_lines(Rest)];
+split_lines(Bin) ->
+ [Bin].
diff --git a/lib/public_key/src/public_key.app.src b/lib/public_key/src/public_key.app.src
index 60487946fa..1963bd05d4 100644
--- a/lib/public_key/src/public_key.app.src
+++ b/lib/public_key/src/public_key.app.src
@@ -1,9 +1,9 @@
{application, public_key,
[{description, "Public key infrastructure"},
{vsn, "%VSN%"},
- {modules, [
- public_key,
- pubkey_pem,
+ {modules, [ public_key,
+ pubkey_pem,
+ pubkey_ssh,
pubkey_cert,
pubkey_cert_records,
'OTP-PUB-KEY'
diff --git a/lib/public_key/src/public_key.appup.src b/lib/public_key/src/public_key.appup.src
index 6b6b76d0a5..4986801dad 100644
--- a/lib/public_key/src/public_key.appup.src
+++ b/lib/public_key/src/public_key.appup.src
@@ -1,6 +1,23 @@
%% -*- erlang -*-
{"%VSN%",
[
+ {"0.11",
+ [
+ {update, public_key, soft, soft_purge, soft_purge, []},
+ {update, pubkey_pem, soft, soft_purge, soft_purge, []},
+ {add_module, pubkey_ssh, soft, soft_purge, soft_purge},
+ {update, pubkey_cert, soft, soft_purge, soft_purge, []},
+ {update, pubkey_cert_records, soft, soft_purge, soft_purge, []}
+ ]
+ },
+
+ {"0.10",
+ [
+ {update, public_key, soft, soft_purge, soft_purge, []},
+ {update, pubkey_pem, soft, soft_purge, soft_purge, []},
+ {update, pubkey_cert_records, soft, soft_purge, soft_purge, []}
+ ]
+ },
{"0.9",
[
{update, public_key, soft, soft_purge, soft_purge, []},
@@ -18,12 +35,29 @@
}
],
[
- {"0.9",
- [
+ {"0.11",
+ [
+ {update, public_key, soft, soft_purge, soft_purge, []},
+ {update, pubkey_pem, soft, soft_purge, soft_purge, []},
+ {delete_module, pubkey_ssh, soft, soft_purge, soft_purge},
+ {update, pubkey_cert, soft, soft_purge, soft_purge, []},
+ {update, pubkey_cert_records, soft, soft_purge, soft_purge, []}
+ ]
+ },
+
+ {"0.10",
+ [
+ {update, public_key, soft, soft_purge, soft_purge, []},
+ {update, pubkey_pem, soft, soft_purge, soft_purge, []},
+ {update, pubkey_cert_records, soft, soft_purge, soft_purge, []}
+ ]
+ },
+ {"0.9",
+ [
{update, public_key, soft, soft_purge, soft_purge, []},
- {update, pubkey_cert, soft, soft_purge, soft_purge, []}
- ]
- },
+ {update, pubkey_cert, soft, soft_purge, soft_purge, []}
+ ]
+ },
{"0.8",
[
{update, 'OTP-PUB-KEY', soft, soft_purge, soft_purge, []},
@@ -32,5 +66,5 @@
{update, pubkey_cert_records, soft, soft_purge, soft_purge, []},
{update, pubkey_cert, soft, soft_purge, soft_purge, []}
]
- }
+ }
]}.
diff --git a/lib/public_key/src/public_key.erl b/lib/public_key/src/public_key.erl
index 30398df9cc..2901020e83 100644
--- a/lib/public_key/src/public_key.erl
+++ b/lib/public_key/src/public_key.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -41,7 +41,8 @@
pkix_is_issuer/2,
pkix_issuer_id/2,
pkix_normalize_name/1,
- pkix_path_validation/3
+ pkix_path_validation/3,
+ ssh_decode/2, ssh_encode/2
]).
%% Deprecated
@@ -51,10 +52,6 @@
-deprecated({decode_private_key, 1, next_major_release}).
-deprecated({decode_private_key, 2, next_major_release}).
--type rsa_public_key() :: #'RSAPublicKey'{}.
--type rsa_private_key() :: #'RSAPrivateKey'{}.
--type dsa_private_key() :: #'DSAPrivateKey'{}.
--type dsa_public_key() :: {integer(), #'Dss-Parms'{}}.
-type rsa_padding() :: 'rsa_pkcs1_padding' | 'rsa_pkcs1_oaep_padding'
| 'rsa_no_padding'.
-type public_crypt_options() :: [{rsa_pad, rsa_padding()}].
@@ -62,11 +59,11 @@
-type dss_digest_type() :: 'none' | 'sha'.
-define(UINT32(X), X:32/unsigned-big-integer).
+-define(DER_NULL, <<5, 0>>).
%%====================================================================
%% API
%%====================================================================
-
%%--------------------------------------------------------------------
-spec pem_decode(binary()) -> [pem_entry()].
%%
@@ -90,6 +87,17 @@ pem_encode(PemEntries) when is_list(PemEntries) ->
%% Description: Decodes a pem entry. pem_decode/1 returns a list of
%% pem entries.
%%--------------------------------------------------------------------
+pem_entry_decode({'SubjectPublicKeyInfo', Der, _}) ->
+ {_, {'AlgorithmIdentifier', AlgId, Params}, {0, Key0}}
+ = der_decode('SubjectPublicKeyInfo', Der),
+ KeyType = pubkey_cert_records:supportedPublicKeyAlgorithms(AlgId),
+ case KeyType of
+ 'RSAPublicKey' ->
+ der_decode(KeyType, Key0);
+ 'DSAPublicKey' ->
+ {params, DssParams} = der_decode('DSAParams', Params),
+ {der_decode(KeyType, Key0), DssParams}
+ end;
pem_entry_decode({Asn1Type, Der, not_encrypted}) when is_atom(Asn1Type),
is_binary(Der) ->
der_decode(Asn1Type, Der).
@@ -114,6 +122,18 @@ pem_entry_decode({Asn1Type, CryptDer, {Cipher, Salt}} = PemEntry,
%
%% Description: Creates a pem entry that can be feed to pem_encode/1.
%%--------------------------------------------------------------------
+pem_entry_encode('SubjectPublicKeyInfo', Entity=#'RSAPublicKey'{}) ->
+ Der = der_encode('RSAPublicKey', Entity),
+ Spki = {'SubjectPublicKeyInfo',
+ {'AlgorithmIdentifier', ?'rsaEncryption', ?DER_NULL}, {0, Der}},
+ pem_entry_encode('SubjectPublicKeyInfo', Spki);
+pem_entry_encode('SubjectPublicKeyInfo',
+ {DsaInt, Params=#'Dss-Parms'{}}) when is_integer(DsaInt) ->
+ KeyDer = der_encode('DSAPublicKey', DsaInt),
+ ParamDer = der_encode('DSAParams', {params, Params}),
+ Spki = {'SubjectPublicKeyInfo',
+ {'AlgorithmIdentifier', ?'id-dsa', ParamDer}, {0, KeyDer}},
+ pem_entry_encode('SubjectPublicKeyInfo', Spki);
pem_entry_encode(Asn1Type, Entity) when is_atom(Asn1Type) ->
Der = der_encode(Asn1Type, Entity),
{Asn1Type, Der, not_encrypted}.
@@ -128,7 +148,7 @@ pem_entry_encode(Asn1Type, Entity,
{Asn1Type, DecryptDer, CipherInfo}.
%%--------------------------------------------------------------------
--spec der_decode(asn1_type(), der_encoded()) -> term().
+-spec der_decode(asn1_type(), Der::binary()) -> term().
%%
%% Description: Decodes a public key asn1 der encoded entity.
%%--------------------------------------------------------------------
@@ -142,7 +162,7 @@ der_decode(Asn1Type, Der) when is_atom(Asn1Type), is_binary(Der) ->
end.
%%--------------------------------------------------------------------
--spec der_encode(asn1_type(), term()) -> der_encoded().
+-spec der_encode(asn1_type(), term()) -> Der::binary().
%%
%% Description: Encodes a public key entity with asn1 DER encoding.
%%--------------------------------------------------------------------
@@ -156,7 +176,7 @@ der_encode(Asn1Type, Entity) when is_atom(Asn1Type) ->
end.
%%--------------------------------------------------------------------
--spec pkix_decode_cert(der_encoded(), plain | otp) ->
+-spec pkix_decode_cert(Cert::binary(), plain | otp) ->
#'Certificate'{} | #'OTPCertificate'{}.
%%
%% Description: Decodes an asn1 der encoded pkix certificate. The otp
@@ -177,7 +197,7 @@ pkix_decode_cert(DerCert, otp) when is_binary(DerCert) ->
end.
%%--------------------------------------------------------------------
--spec pkix_encode(asn1_type(), term(), otp | plain) -> der_encoded().
+-spec pkix_encode(asn1_type(), term(), otp | plain) -> Der::binary().
%%
%% Description: Der encodes a certificate or part of a certificate.
%% This function must be used for encoding certificates or parts of certificates
@@ -337,7 +357,7 @@ verify(PlainText, sha, Signature, {Key, #'Dss-Parms'{p = P, q = Q, g = G}})
crypto:mpint(G), crypto:mpint(Key)]).
%%--------------------------------------------------------------------
-spec pkix_sign(#'OTPTBSCertificate'{},
- rsa_private_key() | dsa_private_key()) -> der_encoded().
+ rsa_private_key() | dsa_private_key()) -> Der::binary().
%%
%% Description: Sign a pkix x.509 certificate. Returns the corresponding
%% der encoded 'Certificate'{}
@@ -346,7 +366,7 @@ pkix_sign(#'OTPTBSCertificate'{signature =
#'SignatureAlgorithm'{algorithm = Alg}
= SigAlg} = TBSCert, Key) ->
- Msg = pkix_encode('OTPTBSCertificate', TBSCert, otp),
+ Msg = pkix_encode('OTPTBSCertificate', TBSCert, otp),
DigestType = pubkey_cert:digest_type(Alg),
Signature = sign(Msg, DigestType, Key),
Cert = #'OTPCertificate'{tbsCertificate= TBSCert,
@@ -356,7 +376,7 @@ pkix_sign(#'OTPTBSCertificate'{signature =
pkix_encode('OTPCertificate', Cert, otp).
%%--------------------------------------------------------------------
--spec pkix_verify(der_encoded(), rsa_public_key()|
+-spec pkix_verify(Cert::binary(), rsa_public_key()|
dsa_public_key()) -> boolean().
%%
%% Description: Verify pkix x.509 certificate signature.
@@ -372,9 +392,9 @@ pkix_verify(DerCert, #'RSAPublicKey'{} = RSAKey)
verify(PlainText, DigestType, Signature, RSAKey).
%%--------------------------------------------------------------------
--spec pkix_is_issuer(Cert :: der_encoded()| #'OTPCertificate'{},
- IssuerCert :: der_encoded()|
- #'OTPCertificate'{}) -> boolean().
+-spec pkix_is_issuer(Cert::binary()| #'OTPCertificate'{},
+ IssuerCert::binary()|
+ #'OTPCertificate'{}) -> boolean().
%%
%% Description: Checks if <IssuerCert> issued <Cert>.
%%--------------------------------------------------------------------
@@ -390,7 +410,7 @@ pkix_is_issuer(#'OTPCertificate'{tbsCertificate = TBSCert},
Candidate#'OTPTBSCertificate'.subject).
%%--------------------------------------------------------------------
--spec pkix_is_self_signed(der_encoded()| #'OTPCertificate'{}) -> boolean().
+-spec pkix_is_self_signed(Cert::binary()| #'OTPCertificate'{}) -> boolean().
%%
%% Description: Checks if a Certificate is self signed.
%%--------------------------------------------------------------------
@@ -401,7 +421,7 @@ pkix_is_self_signed(Cert) when is_binary(Cert) ->
pkix_is_self_signed(OtpCert).
%%--------------------------------------------------------------------
--spec pkix_is_fixed_dh_cert(der_encoded()| #'OTPCertificate'{}) -> boolean().
+-spec pkix_is_fixed_dh_cert(Cert::binary()| #'OTPCertificate'{}) -> boolean().
%%
%% Description: Checks if a Certificate is a fixed Diffie-Hellman Cert.
%%--------------------------------------------------------------------
@@ -412,14 +432,14 @@ pkix_is_fixed_dh_cert(Cert) when is_binary(Cert) ->
pkix_is_fixed_dh_cert(OtpCert).
%%--------------------------------------------------------------------
--spec pkix_issuer_id(der_encoded()| #'OTPCertificate'{},
- IssuedBy :: self | other) ->
- {ok, {SerialNr :: integer(),
- Issuer :: {rdnSequence,
- [#'AttributeTypeAndValue'{}]}}}
+-spec pkix_issuer_id(Cert::binary()| #'OTPCertificate'{},
+ IssuedBy :: self | other) ->
+ {ok, {SerialNr :: integer(),
+ Issuer :: {rdnSequence,
+ [#'AttributeTypeAndValue'{}]}}}
| {error, Reason :: term()}.
%
-%% Description: Returns the issuer id.
+%% Description: Returns the issuer id.
%%--------------------------------------------------------------------
pkix_issuer_id(#'OTPCertificate'{} = OtpCert, self) ->
pubkey_cert:issuer_id(OtpCert, self);
@@ -432,8 +452,8 @@ pkix_issuer_id(Cert, Signed) when is_binary(Cert) ->
pkix_issuer_id(OtpCert, Signed).
%%--------------------------------------------------------------------
--spec pkix_normalize_name({rdnSequence,
- [#'AttributeTypeAndValue'{}]}) ->
+-spec pkix_normalize_name({rdnSequence,
+ [#'AttributeTypeAndValue'{}]}) ->
{rdnSequence,
[#'AttributeTypeAndValue'{}]}.
%%
@@ -444,8 +464,8 @@ pkix_normalize_name(Issuer) ->
pubkey_cert:normalize_general_name(Issuer).
%%--------------------------------------------------------------------
--spec pkix_path_validation(der_encoded()| #'OTPCertificate'{} | atom(),
- CertChain :: [der_encoded()] ,
+-spec pkix_path_validation(Cert::binary()| #'OTPCertificate'{} | atom(),
+ CertChain :: [binary()] ,
Options :: list()) ->
{ok, {PublicKeyInfo :: term(),
PolicyTree :: term()}} |
@@ -472,7 +492,7 @@ pkix_path_validation(TrustedCert, CertChain, Options) when
is_binary(TrustedCert) -> OtpCert = pkix_decode_cert(TrustedCert,
otp), pkix_path_validation(OtpCert, CertChain, Options);
-pkix_path_validation(#'OTPCertificate'{} = TrustedCert, CertChain, Options)
+pkix_path_validation(#'OTPCertificate'{} = TrustedCert, CertChain, Options)
when is_list(CertChain), is_list(Options) ->
MaxPathDefault = length(CertChain),
ValidationState = pubkey_cert:init_validation_state(TrustedCert,
@@ -481,6 +501,37 @@ pkix_path_validation(#'OTPCertificate'{} = TrustedCert, CertChain, Options)
path_validation(CertChain, ValidationState).
%%--------------------------------------------------------------------
+-spec ssh_decode(binary(), public_key | ssh_file()) -> [{public_key(), Attributes::list()}].
+%%
+%% Description: Decodes a ssh file-binary. In the case of know_hosts
+%% or auth_keys the binary may include one or more lines of the
+%% file. Returns a list of public keys and their attributes, possible
+%% attribute values depends on the file type represented by the
+%% binary.
+%%--------------------------------------------------------------------
+ssh_decode(SshBin, Type) when is_binary(SshBin),
+ Type == public_key;
+ Type == rfc4716_public_key;
+ Type == openssh_public_key;
+ Type == auth_keys;
+ Type == known_hosts ->
+ pubkey_ssh:decode(SshBin, Type).
+
+%%--------------------------------------------------------------------
+-spec ssh_encode([{public_key(), Attributes::list()}], ssh_file()) ->
+ binary().
+%% Description: Encodes a list of ssh file entries (public keys and
+%% attributes) to a binary. Possible attributes depends on the file
+%% type.
+%%--------------------------------------------------------------------
+ssh_encode(Entries, Type) when is_list(Entries),
+ Type == rfc4716_public_key;
+ Type == openssh_public_key;
+ Type == auth_keys;
+ Type == known_hosts ->
+ pubkey_ssh:encode(Entries, Type).
+
+%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
@@ -494,7 +545,6 @@ decrypt_public(CipherText, N,E, Options) ->
crypto:rsa_public_decrypt(CipherText,[crypto:mpint(E), crypto:mpint(N)],
Padding).
-
path_validation([], #path_validation_state{working_public_key_algorithm
= Algorithm,
working_public_key =
diff --git a/lib/public_key/test/Makefile b/lib/public_key/test/Makefile
index e20b903942..6889ae9a8a 100644
--- a/lib/public_key/test/Makefile
+++ b/lib/public_key/test/Makefile
@@ -80,7 +80,7 @@ release_tests_spec: opt
$(INSTALL_DIR) $(RELSYSDIR)
$(INSTALL_DATA) $(SPEC_FILES) $(ERL_FILES) $(COVER_FILE) $(HRL_FILES) $(RELSYSDIR)
$(INSTALL_DATA) $(TARGET_FILES) $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
@tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
release_docs_spec:
diff --git a/lib/public_key/test/pkits_SUITE.erl b/lib/public_key/test/pkits_SUITE.erl
index 1d75e1aed2..a325a975e9 100644
--- a/lib/public_key/test/pkits_SUITE.erl
+++ b/lib/public_key/test/pkits_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -25,8 +25,7 @@
-compile(export_all).
-%%-include_lib("public_key/include/public_key.hrl").
--include("public_key.hrl").
+-include_lib("public_key/include/public_key.hrl").
-define(error(Format,Args), error(Format,Args,?FILE,?LINE)).
-define(warning(Format,Args), warning(Format,Args,?FILE,?LINE)).
@@ -42,133 +41,772 @@
-define(NIST5, "2.16.840.1.101.3.2.1.48.5").
-define(NIST6, "2.16.840.1.101.3.2.1.48.6").
+-record(verify_state, {
+ certs_db,
+ crl_info,
+ revoke_state}).
%%
-all(doc) ->
- ["PKITS tests for RFC3280 compliance"];
-all(suite) ->
- [signature_verification,
- validity_periods,
- verifying_name_chaining,
- %% basic_certificate_revocation_tests,
- verifying_paths_with_self_issued_certificates,
- verifying_basic_constraints,
- key_usage,
-%% certificate_policies,
-%% require_explicit_policy,
-%% policy_mappings,
-%% inhibit_policy_mapping,
-%% inhibit_any_policy,
- name_constraints,
-%% distribution_points,
-%% delta_crls,
- private_certificate_extensions].
-
-signature_verification(doc) -> [""];
-signature_verification(suite) -> [];
-signature_verification(Config) when is_list(Config) ->
- run(signature_verification()).
-validity_periods(doc) -> [""];
-validity_periods(suite) -> [];
-validity_periods(Config) when is_list(Config) ->
- run(validity_periods()).
-verifying_name_chaining(doc) -> [""];
-verifying_name_chaining(suite) -> [];
-verifying_name_chaining(Config) when is_list(Config) ->
- run(verifying_name_chaining()).
-basic_certificate_revocation_tests(doc) -> [""];
-basic_certificate_revocation_tests(suite) -> [];
-basic_certificate_revocation_tests(Config) when is_list(Config) ->
- run(basic_certificate_revocation_tests()).
-verifying_paths_with_self_issued_certificates(doc) -> [""];
-verifying_paths_with_self_issued_certificates(suite) -> [];
-verifying_paths_with_self_issued_certificates(Config) when is_list(Config) ->
- run(verifying_paths_with_self_issued_certificates()).
-verifying_basic_constraints(doc) -> [""];
-verifying_basic_constraints(suite) -> [];
-verifying_basic_constraints(Config) when is_list(Config) ->
- run(verifying_basic_constraints()).
-key_usage(doc) -> [""];
-key_usage(suite) -> [];
-key_usage(Config) when is_list(Config) ->
- run(key_usage()).
+suite() ->
+ [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, signature_verification},
+ {group, validity_periods},
+ {group, verifying_name_chaining},
+ {group, verifying_paths_with_self_issued_certificates},
+ %%{group, basic_certificate_revocation_tests},
+ %%{group, delta_crls},
+ %%{group, distribution_points},
+ {group, verifying_basic_constraints},
+ {group, key_usage},
+ {group, name_constraints},
+ {group, private_certificate_extensions}].
+
+groups() ->
+ [{signature_verification, [], [valid_rsa_signature,
+ invalid_rsa_signature, valid_dsa_signature,
+ invalid_dsa_signature]},
+ {validity_periods, [],
+ [not_before_invalid, not_before_valid, not_after_invalid, not_after_valid]},
+ {verifying_name_chaining, [],
+ [invalid_name_chain, whitespace_name_chain, capitalization_name_chain,
+ uid_name_chain, attrib_name_chain, string_name_chain]},
+ {verifying_paths_with_self_issued_certificates, [],
+ [basic_valid, basic_invalid, crl_signing_valid, crl_signing_invalid]},
+ %% {basic_certificate_revocation_tests, [],
+ %% [missing_CRL, revoked_CA, revoked_peer, invalid_CRL_signature,
+ %% invalid_CRL_issuer, invalid_CRL, valid_CRL,
+ %% unknown_CRL_extension, old_CRL, fresh_CRL, valid_serial,
+ %% invalid_serial, valid_seperate_keys, invalid_separate_keys]},
+ %% {delta_crls, [], [delta_without_crl, valid_delta_crls, invalid_delta_crls]},
+ %% {distribution_points, [], [valid_distribution_points,
+ %% valid_distribution_points_no_issuing_distribution_point,
+ %% invalid_distribution_points, valid_only_contains,
+ %% invalid_only_contains, valid_only_some_reasons,
+ %% invalid_only_some_reasons, valid_indirect_crl,
+ %% invalid_indirect_crl, valid_crl_issuer, invalid_crl_issuer]},
+ {verifying_basic_constraints,[],
+ [missing_basic_constraints, valid_basic_constraint, invalid_path_constraints,
+ valid_path_constraints]},
+ {key_usage, [],
+ [invalid_key_usage, valid_key_usage]},
+ {name_constraints, [],
+ [valid_DN_name_constraints, invalid_DN_name_constraints,
+ valid_rfc822_name_constraints,
+ invalid_rfc822_name_constraints, valid_DN_and_rfc822_name_constraints,
+ invalid_DN_and_rfc822_name_constraints, valid_dns_name_constraints,
+ invalid_dns_name_constraints, valid_uri_name_constraints,
+ invalid_uri_name_constraints]},
+ {private_certificate_extensions, [],
+ [unknown_critical_extension, unknown_not_critical_extension]}
+ ].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+init_per_testcase(_Func, Config) ->
+ Datadir = proplists:get_value(data_dir, Config),
+ put(datadir, Datadir),
+ Config.
+
+end_per_testcase(_Func, Config) ->
+ Config.
+
+init_per_suite(Config) ->
+ {skip, "PKIX Conformance test certificates expired 14 of April 2011,"
+ " new conformance test suite uses new format so skip until PKCS-12 support is implemented"}.
+ %% try crypto:start() of
+ %% ok ->
+ %% Config
+ %% catch _:_ ->
+ %% {skip, "Crypto did not start"}
+ %% end.
+
+end_per_suite(_Config) ->
+ application:stop(crypto).
+
+%%-----------------------------------------------------------------------------
+valid_rsa_signature(doc) ->
+ ["Test rsa signatur verification"];
+valid_rsa_signature(suite) ->
+ [];
+valid_rsa_signature(Config) when is_list(Config) ->
+ run([{ "4.1.1", "Valid Signatures Test1", ok}]).
+
+invalid_rsa_signature(doc) ->
+ ["Test rsa signatur verification"];
+invalid_rsa_signature(suite) ->
+ [];
+invalid_rsa_signature(Config) when is_list(Config) ->
+ run([{ "4.1.2", "Invalid CA Signature Test2", {bad_cert,invalid_signature}},
+ { "4.1.3", "Invalid EE Signature Test3", {bad_cert,invalid_signature}}]).
+
+valid_dsa_signature(doc) ->
+ ["Test dsa signatur verification"];
+valid_dsa_signature(suite) ->
+ [];
+valid_dsa_signature(Config) when is_list(Config) ->
+ run([{ "4.1.4", "Valid DSA Signatures Test4", ok},
+ { "4.1.5", "Valid DSA Parameter Inheritance Test5", ok}]).
+
+invalid_dsa_signature(doc) ->
+ ["Test dsa signatur verification"];
+invalid_dsa_signature(suite) ->
+ [];
+invalid_dsa_signature(Config) when is_list(Config) ->
+ run([{ "4.1.6", "Invalid DSA Signature Test6",{bad_cert,invalid_signature}}]).
+%%-----------------------------------------------------------------------------
+not_before_invalid(doc) ->
+ [""];
+not_before_invalid(suite) ->
+ [];
+not_before_invalid(Config) when is_list(Config) ->
+ run([{ "4.2.1", "Invalid CA notBefore Date Test1",{bad_cert, cert_expired}},
+ { "4.2.2", "Invalid EE notBefore Date Test2",{bad_cert, cert_expired}}]).
+
+not_before_valid(doc) ->
+ [""];
+not_before_valid(suite) ->
+ [];
+not_before_valid(Config) when is_list(Config) ->
+ run([{ "4.2.3", "Valid pre2000 UTC notBefore Date Test3", ok},
+ { "4.2.4", "Valid GeneralizedTime notBefore Date Test4", ok}]).
+
+not_after_invalid(doc) ->
+ [""];
+not_after_invalid(suite) ->
+ [];
+not_after_invalid(Config) when is_list(Config) ->
+ run([{ "4.2.5", "Invalid CA notAfter Date Test5", {bad_cert, cert_expired}},
+ { "4.2.6", "Invalid EE notAfter Date Test6", {bad_cert, cert_expired}},
+ { "4.2.7", "Invalid pre2000 UTC EE notAfter Date Test7",{bad_cert, cert_expired}}]).
+
+not_after_valid(doc) ->
+ [""];
+not_after_valid(suite) ->
+ [];
+not_after_valid(Config) when is_list(Config) ->
+ run([{ "4.2.8", "Valid GeneralizedTime notAfter Date Test8", ok}]).
+%%-----------------------------------------------------------------------------
+invalid_name_chain(doc) ->
+ [""];
+invalid_name_chain(suite) ->
+ [];
+invalid_name_chain(Config) when is_list(Config) ->
+ run([{ "4.3.1", "Invalid Name Chaining EE Test1", {bad_cert, invalid_issuer}},
+ { "4.3.2", "Invalid Name Chaining Order Test2", {bad_cert, invalid_issuer}}]).
+
+whitespace_name_chain(doc) ->
+ [""];
+whitespace_name_chain(suite) ->
+ [];
+whitespace_name_chain(Config) when is_list(Config) ->
+ run([{ "4.3.3", "Valid Name Chaining Whitespace Test3", ok},
+ { "4.3.4", "Valid Name Chaining Whitespace Test4", ok}]).
+
+capitalization_name_chain(doc) ->
+ [""];
+capitalization_name_chain(suite) ->
+ [];
+capitalization_name_chain(Config) when is_list(Config) ->
+ run([{ "4.3.5", "Valid Name Chaining Capitalization Test5",ok}]).
+
+uid_name_chain(doc) ->
+ [""];
+uid_name_chain(suite) ->
+ [];
+uid_name_chain(Config) when is_list(Config) ->
+ run([{ "4.3.6", "Valid Name Chaining UIDs Test6",ok}]).
+
+attrib_name_chain(doc) ->
+ [""];
+attrib_name_chain(suite) ->
+ [];
+attrib_name_chain(Config) when is_list(Config) ->
+ run([{ "4.3.7", "Valid RFC3280 Mandatory Attribute Types Test7", ok},
+ { "4.3.8", "Valid RFC3280 Optional Attribute Types Test8", ok}]).
+
+string_name_chain(doc) ->
+ [""];
+string_name_chain(suite) ->
+ [];
+string_name_chain(Config) when is_list(Config) ->
+ run([{ "4.3.9", "Valid UTF8String Encoded Names Test9", ok},
+ { "4.3.10", "Valid Rollover from PrintableString to UTF8String Test10", ok},
+ { "4.3.11", "Valid UTF8String Case Insensitive Match Test11", ok}]).
+
+%%-----------------------------------------------------------------------------
+
+basic_valid(doc) ->
+ [""];
+basic_valid(suite) ->
+ [];
+basic_valid(Config) when is_list(Config) ->
+ run([{ "4.5.1", "Valid Basic Self-Issued Old With New Test1", ok},
+ { "4.5.3", "Valid Basic Self-Issued New With Old Test3", ok},
+ { "4.5.4", "Valid Basic Self-Issued New With Old Test4", ok}
+ ]).
+
+basic_invalid(doc) ->
+ [""];
+basic_invalid(suite) ->
+ [];
+basic_invalid(Config) when is_list(Config) ->
+ run([{"4.5.2", "Invalid Basic Self-Issued Old With New Test2",
+ {bad_cert, {revoked, keyCompromise}}},
+ {"4.5.5", "Invalid Basic Self-Issued New With Old Test5",
+ {bad_cert, {revoked, keyCompromise}}}
+ ]).
+
+crl_signing_valid(doc) ->
+ [""];
+crl_signing_valid(suite) ->
+ [];
+crl_signing_valid(Config) when is_list(Config) ->
+ run([{ "4.5.6", "Valid Basic Self-Issued CRL Signing Key Test6", ok}]).
+
+crl_signing_invalid(doc) ->
+ [""];
+crl_signing_invalid(suite) ->
+ [];
+crl_signing_invalid(Config) when is_list(Config) ->
+ run([{ "4.5.7", "Invalid Basic Self-Issued CRL Signing Key Test7",
+ {bad_cert, {revoked, keyCompromise}}},
+ { "4.5.8", "Invalid Basic Self-Issued CRL Signing Key Test8",
+ {bad_cert, invalid_key_usage}}
+ ]).
+
+%%-----------------------------------------------------------------------------
+missing_CRL(doc) ->
+ [""];
+missing_CRL(suite) ->
+ [];
+missing_CRL(Config) when is_list(Config) ->
+ run([{ "4.4.1", "Missing CRL Test1",{bad_cert,
+ revocation_status_undetermined}}]).
+
+revoked_CA(doc) ->
+ [""];
+revoked_CA(suite) ->
+ [];
+revoked_CA(Config) when is_list(Config) ->
+ run([{ "4.4.2", "Invalid Revoked CA Test2", {bad_cert,
+ {revoked, keyCompromise}}}]).
+
+revoked_peer(doc) ->
+ [""];
+revoked_peer(suite) ->
+ [];
+revoked_peer(Config) when is_list(Config) ->
+ run([{ "4.4.3", "Invalid Revoked EE Test3", {bad_cert,
+ {revoked, keyCompromise}}}]).
+
+invalid_CRL_signature(doc) ->
+ [""];
+invalid_CRL_signature(suite) ->
+ [];
+invalid_CRL_signature(Config) when is_list(Config) ->
+ run([{ "4.4.4", "Invalid Bad CRL Signature Test4",
+ {bad_cert, revocation_status_undetermined}}]).
+
+invalid_CRL_issuer(doc) ->
+ [""];
+invalid_CRL_issuer(suite) ->
+ [];
+invalid_CRL_issuer(Config) when is_list(Config) ->
+ run({ "4.4.5", "Invalid Bad CRL Issuer Name Test5",
+ {bad_cert, revocation_status_undetermined}}).
+
+invalid_CRL(doc) ->
+ [""];
+invalid_CRL(suite) ->
+ [];
+invalid_CRL(Config) when is_list(Config) ->
+ run([{ "4.4.6", "Invalid Wrong CRL Test6",
+ {bad_cert, revocation_status_undetermined}}]).
+
+valid_CRL(doc) ->
+ [""];
+valid_CRL(suite) ->
+ [];
+valid_CRL(Config) when is_list(Config) ->
+ run([{ "4.4.7", "Valid Two CRLs Test7", ok}]).
+
+unknown_CRL_extension(doc) ->
+ [""];
+unknown_CRL_extension(suite) ->
+ [];
+unknown_CRL_extension(Config) when is_list(Config) ->
+ run([{ "4.4.8", "Invalid Unknown CRL Entry Extension Test8",
+ {bad_cert, {revoked, keyCompromise}}},
+ { "4.4.9", "Invalid Unknown CRL Extension Test9",
+ {bad_cert, {revoked, keyCompromise}}},
+ { "4.4.10", "Invalid Unknown CRL Extension Test10",
+ {bad_cert, revocation_status_undetermined}}]).
+
+old_CRL(doc) ->
+ [""];
+old_CRL(suite) ->
+ [];
+old_CRL(Config) when is_list(Config) ->
+ run([{ "4.4.11", "Invalid Old CRL nextUpdate Test11",
+ {bad_cert, revocation_status_undetermined}},
+ { "4.4.12", "Invalid pre2000 CRL nextUpdate Test12",
+ {bad_cert, revocation_status_undetermined}}]).
+
+fresh_CRL(doc) ->
+ [""];
+fresh_CRL(suite) ->
+ [];
+fresh_CRL(Config) when is_list(Config) ->
+ run([{ "4.4.13", "Valid GeneralizedTime CRL nextUpdate Test13", ok}]).
+
+valid_serial(doc) ->
+ [""];
+valid_serial(suite) ->
+ [];
+valid_serial(Config) when is_list(Config) ->
+ run([
+ { "4.4.14", "Valid Negative Serial Number Test14",ok},
+ { "4.4.16", "Valid Long Serial Number Test16", ok},
+ { "4.4.17", "Valid Long Serial Number Test17", ok}
+ ]).
+
+invalid_serial(doc) ->
+ [""];
+invalid_serial(suite) ->
+ [];
+invalid_serial(Config) when is_list(Config) ->
+ run([{ "4.4.15", "Invalid Negative Serial Number Test15",
+ {bad_cert, {revoked, keyCompromise}}},
+ { "4.4.18", "Invalid Long Serial Number Test18",
+ {bad_cert, {revoked, keyCompromise}}}]).
+
+valid_seperate_keys(doc) ->
+ [""];
+valid_seperate_keys(suite) ->
+ [];
+valid_seperate_keys(Config) when is_list(Config) ->
+ run([{ "4.4.19", "Valid Separate Certificate and CRL Keys Test19", ok}]).
+
+invalid_separate_keys(doc) ->
+ [""];
+invalid_separate_keys(suite) ->
+ [];
+invalid_separate_keys(Config) when is_list(Config) ->
+ run([{ "4.4.20", "Invalid Separate Certificate and CRL Keys Test20",
+ {bad_cert, {revoked, keyCompromise}}},
+ { "4.4.21", "Invalid Separate Certificate and CRL Keys Test21",
+ {bad_cert, revocation_status_undetermined}}
+ ]).
+%%-----------------------------------------------------------------------------
+missing_basic_constraints(doc) ->
+ [""];
+missing_basic_constraints(suite) ->
+ [];
+missing_basic_constraints(Config) when is_list(Config) ->
+ run([{ "4.6.1", "Invalid Missing basicConstraints Test1",
+ {bad_cert, missing_basic_constraint}},
+ { "4.6.2", "Invalid cA False Test2",
+ {bad_cert, missing_basic_constraint}},
+ { "4.6.3", "Invalid cA False Test3",
+ {bad_cert, missing_basic_constraint}}]).
+
+valid_basic_constraint(doc) ->
+ [""];
+valid_basic_constraint(suite) ->
+ [];
+valid_basic_constraint(Config) when is_list(Config) ->
+ run([{"4.6.4", "Valid basicConstraints Not Critical Test4", ok}]).
+
+invalid_path_constraints(doc) ->
+ [""];
+invalid_path_constraints(suite) ->
+ [];
+invalid_path_constraints(Config) when is_list(Config) ->
+ run([{ "4.6.5", "Invalid pathLenConstraint Test5", {bad_cert, max_path_length_reached}},
+ { "4.6.6", "Invalid pathLenConstraint Test6", {bad_cert, max_path_length_reached}},
+ { "4.6.9", "Invalid pathLenConstraint Test9", {bad_cert, max_path_length_reached}},
+ { "4.6.10", "Invalid pathLenConstraint Test10", {bad_cert, max_path_length_reached}},
+ { "4.6.11", "Invalid pathLenConstraint Test11", {bad_cert, max_path_length_reached}},
+ { "4.6.12", "Invalid pathLenConstraint Test12", {bad_cert, max_path_length_reached}},
+ { "4.6.16", "Invalid Self-Issued pathLenConstraint Test16",
+ {bad_cert, max_path_length_reached}}]).
+
+valid_path_constraints(doc) ->
+ [""];
+valid_path_constraints(suite) ->
+ [];
+valid_path_constraints(Config) when is_list(Config) ->
+ run([{ "4.6.7", "Valid pathLenConstraint Test7", ok},
+ { "4.6.8", "Valid pathLenConstraint Test8", ok},
+ { "4.6.13", "Valid pathLenConstraint Test13", ok},
+ { "4.6.14", "Valid pathLenConstraint Test14", ok},
+ { "4.6.15", "Valid Self-Issued pathLenConstraint Test15", ok},
+ { "4.6.17", "Valid Self-Issued pathLenConstraint Test17", ok}]).
+
+%%-----------------------------------------------------------------------------
+invalid_key_usage(doc) ->
+ [""];
+invalid_key_usage(suite) ->
+ [];
+invalid_key_usage(Config) when is_list(Config) ->
+ run([{ "4.7.1", "Invalid keyUsage Critical keyCertSign False Test1",
+ {bad_cert,invalid_key_usage} },
+ { "4.7.2", "Invalid keyUsage Not Critical keyCertSign False Test2",
+ {bad_cert,invalid_key_usage}},
+ { "4.7.4", "Invalid keyUsage Critical cRLSign False Test4",
+ {bad_cert, revocation_status_undetermined}},
+ { "4.7.5", "Invalid keyUsage Not Critical cRLSign False Test5",
+ {bad_cert, revocation_status_undetermined}}
+ ]).
+
+valid_key_usage(doc) ->
+ [""];
+valid_key_usage(suite) ->
+ [];
+valid_key_usage(Config) when is_list(Config) ->
+ run([{ "4.7.3", "Valid keyUsage Not Critical Test3", ok}]).
+
+%%-----------------------------------------------------------------------------
certificate_policies(doc) -> [""];
certificate_policies(suite) -> [];
certificate_policies(Config) when is_list(Config) ->
run(certificate_policies()).
+%%-----------------------------------------------------------------------------
require_explicit_policy(doc) -> [""];
require_explicit_policy(suite) -> [];
require_explicit_policy(Config) when is_list(Config) ->
run(require_explicit_policy()).
+%%-----------------------------------------------------------------------------
policy_mappings(doc) -> [""];
policy_mappings(suite) -> [];
policy_mappings(Config) when is_list(Config) ->
run(policy_mappings()).
+%%-----------------------------------------------------------------------------
inhibit_policy_mapping(doc) -> [""];
inhibit_policy_mapping(suite) -> [];
inhibit_policy_mapping(Config) when is_list(Config) ->
run(inhibit_policy_mapping()).
+%%-----------------------------------------------------------------------------
inhibit_any_policy(doc) -> [""];
inhibit_any_policy(suite) -> [];
inhibit_any_policy(Config) when is_list(Config) ->
run(inhibit_any_policy()).
-name_constraints(doc) -> [""];
-name_constraints(suite) -> [];
-name_constraints(Config) when is_list(Config) ->
- run(name_constraints()).
-distribution_points(doc) -> [""];
-distribution_points(suite) -> [];
-distribution_points(Config) when is_list(Config) ->
- run(distribution_points()).
-delta_crls(doc) -> [""];
-delta_crls(suite) -> [];
-delta_crls(Config) when is_list(Config) ->
- run(delta_crls()).
-private_certificate_extensions(doc) -> [""];
-private_certificate_extensions(suite) -> [];
-private_certificate_extensions(Config) when is_list(Config) ->
- run(private_certificate_extensions()).
-
-run() ->
- catch crypto:start(),
- Tests =
- [signature_verification(),
- validity_periods(),
- verifying_name_chaining(),
- %%basic_certificate_revocation_tests(),
- verifying_paths_with_self_issued_certificates(),
- verifying_basic_constraints(),
- key_usage(),
- %%certificate_policies(),
- %%require_explicit_policy(),
- %%policy_mappings(),
- %%inhibit_policy_mapping(),
- %%inhibit_any_policy(),
- name_constraints(),
- %distribution_points(),
- %delta_crls(),
- private_certificate_extensions()
- ],
- run(lists:append(Tests)).
+%%-----------------------------------------------------------------------------
+
+valid_DN_name_constraints(doc) ->
+ [""];
+valid_DN_name_constraints(suite) ->
+ [];
+valid_DN_name_constraints(Config) when is_list(Config) ->
+ run([{ "4.13.1", "Valid DN nameConstraints Test1", ok},
+ { "4.13.4", "Valid DN nameConstraints Test4", ok},
+ { "4.13.5", "Valid DN nameConstraints Test5", ok},
+ { "4.13.6", "Valid DN nameConstraints Test6", ok},
+ { "4.13.11", "Valid DN nameConstraints Test11", ok},
+ { "4.13.14", "Valid DN nameConstraints Test14", ok},
+ { "4.13.18", "Valid DN nameConstraints Test18", ok},
+ { "4.13.19", "Valid Self-Issued DN nameConstraints Test19", ok}]).
+
+invalid_DN_name_constraints(doc) ->
+ [""];
+invalid_DN_name_constraints(suite) ->
+ [];
+invalid_DN_name_constraints(Config) when is_list(Config) ->
+ run([{ "4.13.2", "Invalid DN nameConstraints Test2", {bad_cert, name_not_permitted}},
+ { "4.13.3", "Invalid DN nameConstraints Test3", {bad_cert, name_not_permitted}},
+ { "4.13.7", "Invalid DN nameConstraints Test7", {bad_cert, name_not_permitted}},
+ { "4.13.8", "Invalid DN nameConstraints Test8", {bad_cert, name_not_permitted}},
+ { "4.13.9", "Invalid DN nameConstraints Test9", {bad_cert, name_not_permitted}},
+ { "4.13.10", "Invalid DN nameConstraints Test10",{bad_cert, name_not_permitted}},
+ { "4.13.12", "Invalid DN nameConstraints Test12",{bad_cert, name_not_permitted}},
+ { "4.13.13", "Invalid DN nameConstraints Test13",{bad_cert, name_not_permitted}},
+ { "4.13.15", "Invalid DN nameConstraints Test15",{bad_cert, name_not_permitted}},
+ { "4.13.16", "Invalid DN nameConstraints Test16",{bad_cert, name_not_permitted}},
+ { "4.13.17", "Invalid DN nameConstraints Test17",{bad_cert, name_not_permitted}},
+ { "4.13.20", "Invalid Self-Issued DN nameConstraints Test20",
+ {bad_cert, name_not_permitted}}]).
+
+valid_rfc822_name_constraints(doc) ->
+ [""];
+valid_rfc822_name_constraints(suite) ->
+ [];
+valid_rfc822_name_constraints(Config) when is_list(Config) ->
+ run([{ "4.13.21", "Valid RFC822 nameConstraints Test21", ok},
+ { "4.13.23", "Valid RFC822 nameConstraints Test23", ok},
+ { "4.13.25", "Valid RFC822 nameConstraints Test25", ok}]).
+
+
+invalid_rfc822_name_constraints(doc) ->
+ [""];
+invalid_rfc822_name_constraints(suite) ->
+ [];
+invalid_rfc822_name_constraints(Config) when is_list(Config) ->
+ run([{ "4.13.22", "Invalid RFC822 nameConstraints Test22",
+ {bad_cert, name_not_permitted}},
+ { "4.13.24", "Invalid RFC822 nameConstraints Test24",
+ {bad_cert, name_not_permitted}},
+ { "4.13.26", "Invalid RFC822 nameConstraints Test26",
+ {bad_cert, name_not_permitted}}]).
+
+valid_DN_and_rfc822_name_constraints(doc) ->
+ [""];
+valid_DN_and_rfc822_name_constraints(suite) ->
+ [];
+valid_DN_and_rfc822_name_constraints(Config) when is_list(Config) ->
+ run([{ "4.13.27", "Valid DN and RFC822 nameConstraints Test27", ok}]).
+
+invalid_DN_and_rfc822_name_constraints(doc) ->
+ [""];
+invalid_DN_and_rfc822_name_constraints(suite) ->
+ [];
+invalid_DN_and_rfc822_name_constraints(Config) when is_list(Config) ->
+ run([{ "4.13.28", "Invalid DN and RFC822 nameConstraints Test28",
+ {bad_cert, name_not_permitted}},
+ { "4.13.29", "Invalid DN and RFC822 nameConstraints Test29",
+ {bad_cert, name_not_permitted}}]).
+
+valid_dns_name_constraints(doc) ->
+ [""];
+valid_dns_name_constraints(suite) ->
+ [];
+valid_dns_name_constraints(Config) when is_list(Config) ->
+ run([{ "4.13.30", "Valid DNS nameConstraints Test30", ok},
+ { "4.13.32", "Valid DNS nameConstraints Test32", ok}]).
+
+invalid_dns_name_constraints(doc) ->
+ [""];
+invalid_dns_name_constraints(suite) ->
+ [];
+invalid_dns_name_constraints(Config) when is_list(Config) ->
+ run([{ "4.13.31", "Invalid DNS nameConstraints Test31", {bad_cert, name_not_permitted}},
+ { "4.13.33", "Invalid DNS nameConstraints Test33", {bad_cert, name_not_permitted}},
+ { "4.13.38", "Invalid DNS nameConstraints Test38", {bad_cert, name_not_permitted}}]).
+
+valid_uri_name_constraints(doc) ->
+ [""];
+valid_uri_name_constraints(suite) ->
+ [];
+valid_uri_name_constraints(Config) when is_list(Config) ->
+ run([{ "4.13.34", "Valid URI nameConstraints Test34", ok},
+ { "4.13.36", "Valid URI nameConstraints Test36", ok}]).
+
+invalid_uri_name_constraints(doc) ->
+ [""];
+invalid_uri_name_constraints(suite) ->
+ [];
+invalid_uri_name_constraints(Config) when is_list(Config) ->
+ run([{ "4.13.35", "Invalid URI nameConstraints Test35",{bad_cert, name_not_permitted}},
+ { "4.13.37", "Invalid URI nameConstraints Test37",{bad_cert, name_not_permitted}}]).
+
+%%-----------------------------------------------------------------------------
+delta_without_crl(doc) ->
+ [""];
+delta_without_crl(suite) ->
+ [];
+delta_without_crl(Config) when is_list(Config) ->
+ run([{ "4.15.1", "Invalid deltaCRLIndicator No Base Test1",{bad_cert,
+ revocation_status_undetermined}},
+ {"4.15.10", "Invalid delta-CRL Test10", {bad_cert,
+ revocation_status_undetermined}}]).
+
+valid_delta_crls(doc) ->
+ [""];
+valid_delta_crls(suite) ->
+ [];
+valid_delta_crls(Config) when is_list(Config) ->
+ run([{ "4.15.2", "Valid delta-CRL Test2", ok},
+ { "4.15.5", "Valid delta-CRL Test5", ok},
+ { "4.15.7", "Valid delta-CRL Test7", ok},
+ { "4.15.8", "Valid delta-CRL Test8", ok}
+ ]).
+
+invalid_delta_crls(doc) ->
+ [""];
+invalid_delta_crls(suite) ->
+ [];
+invalid_delta_crls(Config) when is_list(Config) ->
+ run([{ "4.15.3", "Invalid delta-CRL Test3", {bad_cert,{revoked, keyCompromise}}},
+ { "4.15.4", "Invalid delta-CRL Test4", {bad_cert,{revoked, keyCompromise}}},
+ { "4.15.6", "Invalid delta-CRL Test6", {bad_cert,{revoked, keyCompromise}}},
+ { "4.15.9", "Invalid delta-CRL Test9", {bad_cert,{revoked, keyCompromise}}}]).
+
+%%-----------------------------------------------------------------------------
+valid_distribution_points(doc) ->
+ [""];
+valid_distribution_points(suite) ->
+ [];
+valid_distribution_points(Config) when is_list(Config) ->
+ run([{ "4.14.1", "Valid distributionPoint Test1", ok},
+ { "4.14.4", "Valid distributionPoint Test4", ok},
+ { "4.14.5", "Valid distributionPoint Test5", ok},
+ { "4.14.7", "Valid distributionPoint Test7", ok}
+ ]).
+
+valid_distribution_points_no_issuing_distribution_point(doc) ->
+ [""];
+valid_distribution_points_no_issuing_distribution_point(suite) ->
+ [];
+valid_distribution_points_no_issuing_distribution_point(Config) when is_list(Config) ->
+ run([{ "4.14.10", "Valid No issuingDistributionPoint Test10", ok}
+ ]).
+
+invalid_distribution_points(doc) ->
+ [""];
+invalid_distribution_points(suite) ->
+ [];
+invalid_distribution_points(Config) when is_list(Config) ->
+ run([{ "4.14.2", "Invalid distributionPoint Test2", {bad_cert,{revoked, keyCompromise}}},
+ { "4.14.3", "Invalid distributionPoint Test3", {bad_cert,
+ revocation_status_undetermined}},
+ { "4.14.6", "Invalid distributionPoint Test6", {bad_cert,{revoked, keyCompromise}}},
+ { "4.14.8", "Invalid distributionPoint Test8", {bad_cert,
+ revocation_status_undetermined}},
+ { "4.14.9", "Invalid distributionPoint Test9", {bad_cert,
+ revocation_status_undetermined}}
+ ]).
+
+valid_only_contains(doc) ->
+ [""];
+valid_only_contains(suite) ->
+ [];
+valid_only_contains(Config) when is_list(Config) ->
+ run([{ "4.14.13", "Valid onlyContainsCACerts CRL Test13", ok}]).
+
+
+invalid_only_contains(doc) ->
+ [""];
+invalid_only_contains(suite) ->
+ [];
+invalid_only_contains(Config) when is_list(Config) ->
+ run([{ "4.14.11", "Invalid onlyContainsUserCerts CRL Test11",
+ {bad_cert, revocation_status_undetermined}},
+ { "4.14.12", "Invalid onlyContainsCACerts CRL Test12",
+ {bad_cert, revocation_status_undetermined}},
+ { "4.14.14", "Invalid onlyContainsAttributeCerts Test14",
+ {bad_cert, revocation_status_undetermined}}
+ ]).
+
+valid_only_some_reasons(doc) ->
+ [""];
+valid_only_some_reasons(suite) ->
+ [];
+valid_only_some_reasons(Config) when is_list(Config) ->
+ run([{ "4.14.18", "Valid onlySomeReasons Test18", ok},
+ { "4.14.19", "Valid onlySomeReasons Test19", ok}
+ ]).
+
+invalid_only_some_reasons(doc) ->
+ [""];
+invalid_only_some_reasons(suite) ->
+ [];
+invalid_only_some_reasons(Config) when is_list(Config) ->
+ run([{ "4.14.15", "Invalid onlySomeReasons Test15",
+ {bad_cert,{revoked, keyCompromise}}},
+ { "4.14.16", "Invalid onlySomeReasons Test16",
+ {bad_cert,{revoked, certificateHold}}},
+ { "4.14.17", "Invalid onlySomeReasons Test17",
+ {bad_cert, revocation_status_undetermined}},
+ { "4.14.20", "Invalid onlySomeReasons Test20",
+ {bad_cert,{revoked, keyCompromise}}},
+ { "4.14.21", "Invalid onlySomeReasons Test21",
+ {bad_cert,{revoked, affiliationChanged}}}
+ ]).
+
+valid_indirect_crl(doc) ->
+ [""];
+valid_indirect_crl(suite) ->
+ [];
+valid_indirect_crl(Config) when is_list(Config) ->
+ run([{ "4.14.22", "Valid IDP with indirectCRL Test22", ok},
+ { "4.14.24", "Valid IDP with indirectCRL Test24", ok},
+ { "4.14.25", "Valid IDP with indirectCRL Test25", ok}
+ ]).
+
+invalid_indirect_crl(doc) ->
+ [""];
+invalid_indirect_crl(suite) ->
+ [];
+invalid_indirect_crl(Config) when is_list(Config) ->
+ run([{ "4.14.23", "Invalid IDP with indirectCRL Test23",
+ {bad_cert,{revoked, keyCompromise}}},
+ { "4.14.26", "Invalid IDP with indirectCRL Test26",
+ {bad_cert, revocation_status_undetermined}}
+ ]).
+
+valid_crl_issuer(doc) ->
+ [""];
+valid_crl_issuer(suite) ->
+ [];
+valid_crl_issuer(Config) when is_list(Config) ->
+ run([{ "4.14.28", "Valid cRLIssuer Test28", ok}%%,
+ %%{ "4.14.29", "Valid cRLIssuer Test29", ok},
+ %%{ "4.14.33", "Valid cRLIssuer Test33", ok}
+ ]).
+
+invalid_crl_issuer(doc) ->
+ [""];
+invalid_crl_issuer(suite) ->
+ [];
+invalid_crl_issuer(Config) when is_list(Config) ->
+ run([
+ { "4.14.27", "Invalid cRLIssuer Test27", {bad_cert, revocation_status_undetermined}},
+ { "4.14.31", "Invalid cRLIssuer Test31", {bad_cert,{revoked, keyCompromise}}},
+ { "4.14.32", "Invalid cRLIssuer Test32", {bad_cert,{revoked, keyCompromise}}},
+ { "4.14.34", "Invalid cRLIssuer Test34", {bad_cert,{revoked, keyCompromise}}},
+ { "4.14.35", "Invalid cRLIssuer Test35", {bad_cert, revocation_status_undetermined}}
+ ]).
+
+
+%%distribution_points() ->
+ %%{ "4.14", "Distribution Points" },
+%% [
+ %% Although this test is valid it has a circular dependency. As a result
+ %% an attempt is made to reursively checks a CRL path and rejected due to
+ %% a CRL path validation error. PKITS notes suggest this test does not
+ %% need to be run due to this issue.
+%% { "4.14.30", "Valid cRLIssuer Test30", 54 }].
+
+
+%%-----------------------------------------------------------------------------
+
+unknown_critical_extension(doc) ->
+ [""];
+unknown_critical_extension(suite) ->
+ [];
+unknown_critical_extension(Config) when is_list(Config) ->
+ run([{ "4.16.2", "Invalid Unknown Critical Certificate Extension Test2",
+ {bad_cert,unknown_critical_extension}}]).
+
+unknown_not_critical_extension(doc) ->
+ [""];
+unknown_not_critical_extension(suite) ->
+ [];
+unknown_not_critical_extension(Config) when is_list(Config) ->
+ run([{ "4.16.1", "Valid Unknown Not Critical Certificate Extension Test1", ok}]).
+
+%%-----------------------------------------------------------------------------
run(Tests) ->
File = file(?CERTS,"TrustAnchorRootCertificate.crt"),
{ok, TA} = file:read_file(File),
run(Tests, TA).
run({Chap, Test, Result}, TA) ->
- CertChain = sort_chain(read_certs(Test),TA, [], false),
- try public_key:pkix_path_validation(TA, CertChain, []) of
- {Result, _} -> ok;
+ CertChain = sort_chain(read_certs(Test),TA, [], false, Chap),
+ Options = path_validation_options(TA, Chap,Test),
+ try public_key:pkix_path_validation(TA, CertChain, Options) of
+ {Result, _} -> ok;
{error,Result} when Result =/= ok ->
ok;
- {error,Error} when is_integer(Result) ->
- ?warning(" ~p~n Got ~p expected ~p~n",[Test, Error, Result]);
- {error,Error} when Result =/= ok ->
- ?error(" minor ~p~n Got ~p expected ~p~n",[Test, Error, Result]);
{error, Error} ->
?error(" ~p ~p~n Expected ~p got ~p ~n", [Chap, Test, Result, Error]),
fail;
- {ok, _} when Result =/= ok ->
+ {ok, _OK} when Result =/= ok ->
?error(" ~p ~p~n Expected ~p got ~p ~n", [Chap, Test, Result, ok]),
fail
catch Type:Reason ->
@@ -183,14 +821,318 @@ run([Test|Rest],TA) ->
run(Rest,TA);
run([],_) -> ok.
+path_validation_options(TA, Chap, Test) ->
+ case needs_crl_options(Chap) of
+ true ->
+ crl_options(TA, Test);
+ false ->
+ Fun =
+ fun(_,{bad_cert, _} = Reason, _) ->
+ {fail, Reason};
+ (_,{extension, _}, UserState) ->
+ {unknown, UserState};
+ (_, Valid, UserState) when Valid == valid;
+ Valid == valid_peer ->
+ {valid, UserState}
+ end,
+ [{verify_fun, {Fun, []}}]
+ end.
+
+needs_crl_options("4.4" ++ _) ->
+ true;
+needs_crl_options("4.5" ++ _) ->
+ true;
+needs_crl_options("4.7.4" ++ _) ->
+ true;
+needs_crl_options("4.7.5" ++ _) ->
+ true;
+needs_crl_options("4.14" ++ _) ->
+ true;
+needs_crl_options("4.15" ++ _) ->
+ true;
+needs_crl_options(_) ->
+ false.
+
+crl_options(TA, Test) ->
+ case read_crls(Test) of
+ [] ->
+ [];
+ CRLs ->
+ Fun =
+ fun(_,{bad_cert, _} = Reason, _) ->
+ {fail, Reason};
+ (_,{extension,
+ #'Extension'{extnID = ?'id-ce-cRLDistributionPoints',
+ extnValue = Value}}, UserState0) ->
+ UserState = update_crls(Value, UserState0),
+ {valid, UserState};
+ (_,{extension, _}, UserState) ->
+ {unknown, UserState};
+ (OtpCert, Valid, UserState) when Valid == valid;
+ Valid == valid_peer ->
+ {ErlCerts, CRLs} = UserState#verify_state.crl_info,
+ CRLInfo0 =
+ crl_info(OtpCert,
+ ErlCerts,[{DerCRL, public_key:der_decode('CertificateList',
+ DerCRL)} || DerCRL <- CRLs],
+ []),
+ CRLInfo = lists:reverse(CRLInfo0),
+ Certs = UserState#verify_state.certs_db,
+ Fun = fun(DP, CRLtoValidate, Id, CertsDb) ->
+ trusted_cert_and_path(DP, CRLtoValidate, Id, CertsDb)
+ end,
+ Ignore = ignore_sign_test_when_building_path(Test),
+ case public_key:pkix_crls_validate(OtpCert, CRLInfo,
+ [{issuer_fun,{Fun, {Ignore, Certs}}}]) of
+ valid ->
+ {valid, UserState};
+ Reason ->
+ {fail, Reason}
+ end
+ end,
+
+ Certs = read_certs(Test),
+ ErlCerts = [public_key:pkix_decode_cert(Cert, otp) || Cert <- Certs],
+
+ [{verify_fun, {Fun, #verify_state{certs_db = [TA| Certs],
+ crl_info = {ErlCerts, CRLs}}}}]
+ end.
+
+crl_info(_, _, [], Acc) ->
+ Acc;
+crl_info(OtpCert, Certs, [{_, #'CertificateList'{tbsCertList =
+ #'TBSCertList'{issuer = Issuer,
+ crlExtensions = CRLExtensions}}}
+ = CRL | Rest], Acc) ->
+ OtpTBSCert = OtpCert#'OTPCertificate'.tbsCertificate,
+ Extensions = OtpTBSCert#'OTPTBSCertificate'.extensions,
+ ExtList = pubkey_cert:extensions_list(CRLExtensions),
+ DPs = case pubkey_cert:select_extension(?'id-ce-cRLDistributionPoints', Extensions) of
+ #'Extension'{extnValue = Value} ->
+ lists:map(fun(Point) -> pubkey_cert_records:transform(Point, decode) end, Value);
+ _ ->
+ case same_issuer(OtpCert, Issuer) of
+ true ->
+ [make_dp(ExtList, asn1_NOVALUE, Issuer)];
+ false ->
+ [make_dp(ExtList, Issuer, ignore)]
+ end
+ end,
+ DPsCRLs = lists:map(fun(DP) -> {DP, CRL} end, DPs),
+ crl_info(OtpCert, Certs, Rest, DPsCRLs ++ Acc).
+
+ignore_sign_test_when_building_path("Invalid Bad CRL Signature Test4") ->
+ true;
+ignore_sign_test_when_building_path(_) ->
+ false.
+
+same_issuer(OTPCert, Issuer) ->
+ DecIssuer = pubkey_cert_records:transform(Issuer, decode),
+ OTPTBSCert = OTPCert#'OTPCertificate'.tbsCertificate,
+ CertIssuer = OTPTBSCert#'OTPTBSCertificate'.issuer,
+ pubkey_cert:is_issuer(DecIssuer, CertIssuer).
+
+make_dp(Extensions, Issuer0, DpInfo) ->
+ {Issuer, Point} = mk_issuer_dp(Issuer0, DpInfo),
+ case pubkey_cert:select_extension('id-ce-cRLReason', Extensions) of
+ #'Extension'{extnValue = Reasons} ->
+ #'DistributionPoint'{cRLIssuer = Issuer,
+ reasons = Reasons,
+ distributionPoint = Point};
+ _ ->
+ #'DistributionPoint'{cRLIssuer = Issuer,
+ reasons = [unspecified, keyCompromise,
+ cACompromise, affiliationChanged, superseded,
+ cessationOfOperation, certificateHold,
+ removeFromCRL, privilegeWithdrawn, aACompromise],
+ distributionPoint = Point}
+ end.
+
+mk_issuer_dp(asn1_NOVALUE, Issuer) ->
+ {asn1_NOVALUE, {fullName, [{directoryName, Issuer}]}};
+mk_issuer_dp(Issuer, _) ->
+ {[{directoryName, Issuer}], asn1_NOVALUE}.
+
+update_crls(_, State) ->
+ State.
+
+trusted_cert_and_path(DP, CRL, Id, {Ignore, CertsList}) ->
+ case crl_issuer(crl_issuer_name(DP), CRL, Id, CertsList, CertsList, Ignore) of
+ {ok, IssuerCert, DerIssuerCert} ->
+ Certs = [{public_key:pkix_decode_cert(Cert, otp), Cert} || Cert <- CertsList],
+ CertChain = build_chain(Certs, Certs, IssuerCert, Ignore, [DerIssuerCert]),
+ {ok, public_key:pkix_decode_cert(hd(CertChain), otp), CertChain};
+ Other ->
+ Other
+ end.
+
+crl_issuer_name(#'DistributionPoint'{cRLIssuer = asn1_NOVALUE}) ->
+ undefined;
+crl_issuer_name(#'DistributionPoint'{cRLIssuer = [{directoryName, Issuer}]}) ->
+ pubkey_cert_records:transform(Issuer, decode).
+
+build_chain([],_, _, _,Acc) ->
+ Acc;
+
+build_chain([{First, DerFirst}|Certs], All, Cert, Ignore, Acc) ->
+ case public_key:pkix_is_self_signed(Cert) andalso is_test_root(Cert) of
+ true ->
+ Acc;
+ false ->
+ case public_key:pkix_is_issuer(Cert, First)
+ %%andalso check_extension_cert_signer(First)
+ andalso is_signer(First, Cert, Ignore)
+ of
+ true ->
+ build_chain(All, All, First, Ignore, [DerFirst | Acc]);
+ false ->
+ build_chain(Certs, All, Cert, Ignore, Acc)
+ end
+ end.
+
+is_signer(_,_, true) ->
+ true;
+is_signer(Signer, #'OTPCertificate'{} = Cert,_) ->
+ TBSCert = Signer#'OTPCertificate'.tbsCertificate,
+ PublicKeyInfo = TBSCert#'OTPTBSCertificate'.subjectPublicKeyInfo,
+ PublicKey = PublicKeyInfo#'OTPSubjectPublicKeyInfo'.subjectPublicKey,
+ AlgInfo = PublicKeyInfo#'OTPSubjectPublicKeyInfo'.algorithm,
+ PublicKeyParams = AlgInfo#'PublicKeyAlgorithm'.parameters,
+ try pubkey_cert:validate_signature(Cert, public_key:pkix_encode('OTPCertificate',
+ Cert, otp),
+ PublicKey, PublicKeyParams, true, ?DEFAULT_VERIFYFUN) of
+ true ->
+ true
+ catch
+ _:_ ->
+ false
+ end;
+is_signer(Signer, #'CertificateList'{} = CRL, _) ->
+ TBSCert = Signer#'OTPCertificate'.tbsCertificate,
+ PublicKeyInfo = TBSCert#'OTPTBSCertificate'.subjectPublicKeyInfo,
+ PublicKey = PublicKeyInfo#'OTPSubjectPublicKeyInfo'.subjectPublicKey,
+ AlgInfo = PublicKeyInfo#'OTPSubjectPublicKeyInfo'.algorithm,
+ PublicKeyParams = AlgInfo#'PublicKeyAlgorithm'.parameters,
+ pubkey_crl:verify_crl_signature(CRL, public_key:pkix_encode('CertificateList',
+ CRL, plain),
+ PublicKey, PublicKeyParams).
+
+is_test_root(OtpCert) ->
+ TBSCert = OtpCert#'OTPCertificate'.tbsCertificate,
+ {rdnSequence, AtterList} = TBSCert#'OTPTBSCertificate'.issuer,
+ lists:member([{'AttributeTypeAndValue',{2,5,4,3},{printableString,"Trust Anchor"}}],
+ AtterList).
+
+check_extension_cert_signer(OtpCert) ->
+ TBSCert = OtpCert#'OTPCertificate'.tbsCertificate,
+ Extensions = TBSCert#'OTPTBSCertificate'.extensions,
+ case pubkey_cert:select_extension(?'id-ce-keyUsage', Extensions) of
+ #'Extension'{extnValue = KeyUse} ->
+ lists:member(keyCertSign, KeyUse);
+ _ ->
+ true
+ end.
+
+check_extension_crl_signer(OtpCert) ->
+ TBSCert = OtpCert#'OTPCertificate'.tbsCertificate,
+ Extensions = TBSCert#'OTPTBSCertificate'.extensions,
+ case pubkey_cert:select_extension(?'id-ce-keyUsage', Extensions) of
+ #'Extension'{extnValue = KeyUse} ->
+ lists:member(cRLSign, KeyUse);
+ _ ->
+ true
+ end.
+
+crl_issuer(undefined, CRL, issuer_not_found, _, CertsList, Ignore) ->
+ crl_issuer(CRL, CertsList, Ignore);
+
+crl_issuer(IssuerName, CRL, issuer_not_found, CertsList, CertsList, Ignore) ->
+ crl_issuer(IssuerName, CRL, IssuerName, CertsList, CertsList, Ignore);
+
+crl_issuer(undefined, CRL, Id, [Cert | Rest], All, false) ->
+ ErlCert = public_key:pkix_decode_cert(Cert, otp),
+ TBSCertificate = ErlCert#'OTPCertificate'.tbsCertificate,
+ SerialNumber = TBSCertificate#'OTPTBSCertificate'.serialNumber,
+ Issuer = public_key:pkix_normalize_name(
+ TBSCertificate#'OTPTBSCertificate'.subject),
+ Bool = is_signer(ErlCert, CRL, false),
+ case {SerialNumber, Issuer} of
+ Id when Bool == true ->
+ {ok, ErlCert, Cert};
+ _ ->
+ crl_issuer(undefined, CRL, Id, Rest, All, false)
+ end;
+
+crl_issuer(IssuerName, CRL, Id, [Cert | Rest], All, false) ->
+ ErlCert = public_key:pkix_decode_cert(Cert, otp),
+ TBSCertificate = ErlCert#'OTPCertificate'.tbsCertificate,
+ SerialNumber = TBSCertificate#'OTPTBSCertificate'.serialNumber,
+ %%Issuer = public_key:pkix_normalize_name(
+ %% TBSCertificate#'OTPTBSCertificate'.subject),
+ Bool = is_signer(ErlCert, CRL, false),
+ case {SerialNumber, IssuerName} of
+ Id when Bool == true ->
+ {ok, ErlCert, Cert};
+ {_, IssuerName} when Bool == true ->
+ {ok, ErlCert, Cert};
+ _ ->
+ crl_issuer(IssuerName, CRL, Id, Rest, All, false)
+ end;
+
+crl_issuer(undefined, CRL, _, [], CertsList, Ignore) ->
+ crl_issuer(CRL, CertsList, Ignore);
+crl_issuer(CRLName, CRL, _, [], CertsList, Ignore) ->
+ crl_issuer(CRLName, CRL, CertsList, Ignore).
+
+
+crl_issuer(_, [],_) ->
+ {error, issuer_not_found};
+crl_issuer(CRL, [Cert | Rest], Ignore) ->
+ ErlCert = public_key:pkix_decode_cert(Cert, otp),
+ case public_key:pkix_is_issuer(CRL, ErlCert) andalso
+ check_extension_crl_signer(ErlCert) andalso
+ is_signer(ErlCert, CRL, Ignore)
+ of
+ true ->
+ {ok, ErlCert,Cert};
+ false ->
+ crl_issuer(CRL, Rest, Ignore)
+ end.
+
+crl_issuer(_,_, [],_) ->
+ {error, issuer_not_found};
+crl_issuer(IssuerName, CRL, [Cert | Rest], Ignore) ->
+ ErlCert = public_key:pkix_decode_cert(Cert, otp),
+ TBSCertificate = ErlCert#'OTPCertificate'.tbsCertificate,
+ Issuer = public_key:pkix_normalize_name(
+ TBSCertificate#'OTPTBSCertificate'.subject),
+
+ case
+ public_key:pkix_is_issuer(CRL, ErlCert) andalso
+ check_extension_crl_signer(ErlCert) andalso
+ is_signer(ErlCert, CRL, Ignore)
+ of
+ true ->
+ case pubkey_cert:is_issuer(Issuer, IssuerName) of
+ true ->
+ {ok, ErlCert,Cert};
+ false ->
+ crl_issuer(IssuerName, CRL, Rest, Ignore)
+ end;
+ false ->
+ crl_issuer(IssuerName, CRL, Rest, Ignore)
+ end.
read_certs(Test) ->
File = test_file(Test),
- %% io:format("Read ~p ",[File]),
Ders = erl_make_certs:pem_to_der(File),
- %% io:format("Ders ~p ~n",[length(Ders)]),
[Cert || {'Certificate', Cert, not_encrypted} <- Ders].
+read_crls(Test) ->
+ File = test_file(Test),
+ Ders = erl_make_certs:pem_to_der(File),
+ [CRL || {'CertificateList', CRL, not_encrypted} <- Ders].
+
test_file(Test) ->
file(?CONV, lists:append(string:tokens(Test, " -")) ++ ".pem").
@@ -208,118 +1150,89 @@ file(Sub,File) ->
end,
AbsFile.
-sort_chain([First|Certs], TA, Try, Found) ->
+sort_chain(Certs, TA, Acc, Bool, Chap) when Chap == "4.5.3"->
+ [CA, Entity, Self] = do_sort_chain(Certs, TA, Acc, Bool, Chap),
+ [CA, Self, Entity];
+sort_chain(Certs, TA, Acc, Bool, Chap) when Chap == "4.5.4";
+ Chap == "4.5.5" ->
+ [CA, Entity, _Self] = do_sort_chain(Certs, TA, Acc, Bool, Chap),
+ [CA, Entity];
+
+sort_chain(Certs, TA, Acc, Bool, Chap) when Chap == "4.14.24";
+ Chap == "4.14.25";
+ Chap == "4.14.26";
+ Chap == "4.14.27";
+ Chap == "4.14.31";
+ Chap == "4.14.32";
+ Chap == "4.14.33" ->
+ [_OtherCA, Entity, CA] = do_sort_chain(Certs, TA, Acc, Bool, Chap),
+ [CA, Entity];
+
+sort_chain(Certs, TA, Acc, Bool, Chap) when Chap == "4.14.28";
+ Chap == "4.14.29" ->
+ [CA, _OtherCA, Entity] = do_sort_chain(Certs, TA, Acc, Bool, Chap),
+ [CA, Entity];
+
+
+sort_chain(Certs, TA, Acc, Bool, Chap) when Chap == "4.14.33" ->
+ [Entity, CA, _OtherCA] = do_sort_chain(Certs, TA, Acc, Bool, Chap),
+ [CA, Entity];
+
+
+sort_chain(Certs, TA, Acc, Bool, Chap) ->
+ do_sort_chain(Certs, TA, Acc, Bool, Chap).
+
+do_sort_chain([First], TA, Try, Found, Chap) when Chap == "4.5.6";
+ Chap == "4.5.7";
+ Chap == "4.4.19";
+ Chap == "4.4.20";
+ Chap == "4.4.21"->
case public_key:pkix_is_issuer(First,TA) of
true ->
- [First|sort_chain(Certs,First,Try,true)];
+ [First|do_sort_chain([],First,Try,true, Chap)];
+ false ->
+ do_sort_chain([],TA,[First|Try],Found, Chap)
+ end;
+do_sort_chain([First|Certs], TA, Try, Found, Chap) when Chap == "4.5.6";
+ Chap == "4.5.7";
+ Chap == "4.4.19";
+ Chap == "4.4.20";
+ Chap == "4.4.21"->
+%% case check_extension_cert_signer(public_key:pkix_decode_cert(First, otp)) of
+%% true ->
+ case public_key:pkix_is_issuer(First,TA) of
+ true ->
+ [First|do_sort_chain(Certs,First,Try,true, Chap)];
false ->
- sort_chain(Certs,TA,[First|Try],Found)
+ do_sort_chain(Certs,TA,[First|Try],Found, Chap)
end;
-sort_chain([], _, [],_) -> [];
-sort_chain([], Valid, Check, true) ->
- sort_chain(lists:reverse(Check), Valid, [], false);
-sort_chain([], _Valid, Check, false) ->
+%% false ->
+%% do_sort_chain(Certs, TA, Try, Found, Chap)
+%% end;
+
+do_sort_chain([First|Certs], TA, Try, Found, Chap) ->
+ case public_key:pkix_is_issuer(First,TA) of
+ true ->
+ [First|do_sort_chain(Certs,First,Try,true, Chap)];
+ false ->
+ do_sort_chain(Certs,TA,[First|Try],Found, Chap)
+ end;
+
+do_sort_chain([], _, [],_, _) -> [];
+do_sort_chain([], Valid, Check, true, Chap) ->
+ do_sort_chain(lists:reverse(Check), Valid, [], false, Chap);
+do_sort_chain([], _Valid, Check, false, _) ->
Check.
-signature_verification() ->
- %% "4.1", "Signature Verification" ,
- [{ "4.1.1", "Valid Signatures Test1", ok},
- { "4.1.2", "Invalid CA Signature Test2", {bad_cert,invalid_signature}},
- { "4.1.3", "Invalid EE Signature Test3", {bad_cert,invalid_signature}},
- { "4.1.4", "Valid DSA Signatures Test4", ok},
- { "4.1.5", "Valid DSA Parameter Inheritance Test5", ok},
- { "4.1.6", "Invalid DSA Signature Test6", {bad_cert,invalid_signature}}].
-validity_periods() ->
- %% { "4.2", "Validity Periods" },
- [{ "4.2.1", "Invalid CA notBefore Date Test1", {bad_cert, cert_expired}},
- { "4.2.2", "Invalid EE notBefore Date Test2", {bad_cert, cert_expired}},
- { "4.2.3", "Valid pre2000 UTC notBefore Date Test3", ok},
- { "4.2.4", "Valid GeneralizedTime notBefore Date Test4", ok},
- { "4.2.5", "Invalid CA notAfter Date Test5", {bad_cert, cert_expired}},
- { "4.2.6", "Invalid EE notAfter Date Test6", {bad_cert, cert_expired}},
- { "4.2.7", "Invalid pre2000 UTC EE notAfter Date Test7", {bad_cert, cert_expired}},
- { "4.2.8", "Valid GeneralizedTime notAfter Date Test8", ok}].
-verifying_name_chaining() ->
- %%{ "4.3", "Verifying Name Chaining" },
- [{ "4.3.1", "Invalid Name Chaining EE Test1", {bad_cert, invalid_issuer}},
- { "4.3.2", "Invalid Name Chaining Order Test2", {bad_cert, invalid_issuer}},
- { "4.3.3", "Valid Name Chaining Whitespace Test3", ok},
- { "4.3.4", "Valid Name Chaining Whitespace Test4", ok},
- { "4.3.5", "Valid Name Chaining Capitalization Test5", ok},
- { "4.3.6", "Valid Name Chaining UIDs Test6", ok},
- { "4.3.7", "Valid RFC3280 Mandatory Attribute Types Test7", ok},
- { "4.3.8", "Valid RFC3280 Optional Attribute Types Test8", ok},
- { "4.3.9", "Valid UTF8String Encoded Names Test9", ok},
- { "4.3.10", "Valid Rollover from PrintableString to UTF8String Test10", ok},
- { "4.3.11", "Valid UTF8String Case Insensitive Match Test11", ok}].
-basic_certificate_revocation_tests() ->
- %%{ "4.4", "Basic Certificate Revocation Tests" },
- [{ "4.4.1", "Missing CRL Test1", 3 },
- { "4.4.2", "Invalid Revoked CA Test2", 23 },
- { "4.4.3", "Invalid Revoked EE Test3", 23 },
- { "4.4.4", "Invalid Bad CRL Signature Test4", 8 },
- { "4.4.5", "Invalid Bad CRL Issuer Name Test5", 3 },
- { "4.4.6", "Invalid Wrong CRL Test6", 3 },
- { "4.4.7", "Valid Two CRLs Test7", ok},
-
- %% The test document suggests these should return certificate revoked...
- %% Subsquent discussion has concluded they should not due to unhandle
- %% critical CRL extensions.
- { "4.4.8", "Invalid Unknown CRL Entry Extension Test8", 36 },
- { "4.4.9", "Invalid Unknown CRL Extension Test9", 36 },
-
- { "4.4.10", "Invalid Unknown CRL Extension Test10", 36 },
- { "4.4.11", "Invalid Old CRL nextUpdate Test11", 12 },
- { "4.4.12", "Invalid pre2000 CRL nextUpdate Test12", 12 },
- { "4.4.13", "Valid GeneralizedTime CRL nextUpdate Test13", ok},
- { "4.4.14", "Valid Negative Serial Number Test14", ok},
- { "4.4.15", "Invalid Negative Serial Number Test15", 23 },
- { "4.4.16", "Valid Long Serial Number Test16", ok},
- { "4.4.17", "Valid Long Serial Number Test17", ok},
- { "4.4.18", "Invalid Long Serial Number Test18", 23 },
- { "4.4.19", "Valid Separate Certificate and CRL Keys Test19", ok},
- { "4.4.20", "Invalid Separate Certificate and CRL Keys Test20", 23 },
-
- %% CRL path is revoked so get a CRL path validation error
- { "4.4.21", "Invalid Separate Certificate and CRL Keys Test21", 54 }].
-verifying_paths_with_self_issued_certificates() ->
- %%{ "4.5", "Verifying Paths with Self-Issued Certificates" },
- [{ "4.5.1", "Valid Basic Self-Issued Old With New Test1", ok},
- %%{ "4.5.2", "Invalid Basic Self-Issued Old With New Test2", 23 },
- %%{ "4.5.3", "Valid Basic Self-Issued New With Old Test3", ok},
- %%{ "4.5.4", "Valid Basic Self-Issued New With Old Test4", ok},
- { "4.5.5", "Invalid Basic Self-Issued New With Old Test5", 23 },
- %%{ "4.5.6", "Valid Basic Self-Issued CRL Signing Key Test6", ok},
- { "4.5.7", "Invalid Basic Self-Issued CRL Signing Key Test7", 23 },
- { "4.5.8", "Invalid Basic Self-Issued CRL Signing Key Test8", {bad_cert,invalid_key_usage} }].
-verifying_basic_constraints() ->
- [%%{ "4.6", "Verifying Basic Constraints" },
- { "4.6.1", "Invalid Missing basicConstraints Test1",
- {bad_cert, missing_basic_constraint} },
- { "4.6.2", "Invalid cA False Test2", {bad_cert, missing_basic_constraint}},
- { "4.6.3", "Invalid cA False Test3", {bad_cert, missing_basic_constraint}},
- { "4.6.4", "Valid basicConstraints Not Critical Test4", ok},
- { "4.6.5", "Invalid pathLenConstraint Test5", {bad_cert, max_path_length_reached}},
- { "4.6.6", "Invalid pathLenConstraint Test6", {bad_cert, max_path_length_reached}},
- { "4.6.7", "Valid pathLenConstraint Test7", ok},
- { "4.6.8", "Valid pathLenConstraint Test8", ok},
- { "4.6.9", "Invalid pathLenConstraint Test9", {bad_cert, max_path_length_reached}},
- { "4.6.10", "Invalid pathLenConstraint Test10", {bad_cert, max_path_length_reached}},
- { "4.6.11", "Invalid pathLenConstraint Test11", {bad_cert, max_path_length_reached}},
- { "4.6.12", "Invalid pathLenConstraint Test12", {bad_cert, max_path_length_reached}},
- { "4.6.13", "Valid pathLenConstraint Test13", ok},
- { "4.6.14", "Valid pathLenConstraint Test14", ok},
- { "4.6.15", "Valid Self-Issued pathLenConstraint Test15", ok},
- { "4.6.16", "Invalid Self-Issued pathLenConstraint Test16", {bad_cert, max_path_length_reached}},
- { "4.6.17", "Valid Self-Issued pathLenConstraint Test17", ok}].
-key_usage() ->
- %%{ "4.7", "Key Usage" },
- [{ "4.7.1", "Invalid keyUsage Critical keyCertSign False Test1", {bad_cert,invalid_key_usage} },
- { "4.7.2", "Invalid keyUsage Not Critical keyCertSign False Test2", {bad_cert,invalid_key_usage} },
- { "4.7.3", "Valid keyUsage Not Critical Test3", ok}
- %%,{ "4.7.4", "Invalid keyUsage Critical cRLSign False Test4", 35 }
- %%,{ "4.7.5", "Invalid keyUsage Not Critical cRLSign False Test5", 35 }
- ].
+error(Format, Args, File0, Line) ->
+ File = filename:basename(File0),
+ Pid = group_leader(),
+ Pid ! {failed, File, Line},
+ io:format(Pid, "~s(~p): ERROR"++Format, [File,Line|Args]).
+
+warning(Format, Args, File0, Line) ->
+ File = filename:basename(File0),
+ io:format("~s(~p): Warning "++Format, [File,Line|Args]).
%% Certificate policy tests need special handling. They can have several
%% sub tests and we need to check the outputs are correct.
@@ -427,178 +1340,3 @@ inhibit_any_policy() ->
{"4.12.8", "Invalid Self-Issued inhibitAnyPolicy Test8", 43 },
{"4.12.9", "Valid Self-Issued inhibitAnyPolicy Test9", ok},
{"4.12.10", "Invalid Self-Issued inhibitAnyPolicy Test10", 43 }].
-
-name_constraints() ->
- %%{ "4.13", "Name Constraints" },
- [{ "4.13.1", "Valid DN nameConstraints Test1", ok},
- { "4.13.2", "Invalid DN nameConstraints Test2", {bad_cert, name_not_permitted}},
- { "4.13.3", "Invalid DN nameConstraints Test3", {bad_cert, name_not_permitted}},
- { "4.13.4", "Valid DN nameConstraints Test4", ok},
- { "4.13.5", "Valid DN nameConstraints Test5", ok},
- { "4.13.6", "Valid DN nameConstraints Test6", ok},
- { "4.13.7", "Invalid DN nameConstraints Test7", {bad_cert, name_not_permitted}},
- { "4.13.8", "Invalid DN nameConstraints Test8", {bad_cert, name_not_permitted}},
- { "4.13.9", "Invalid DN nameConstraints Test9", {bad_cert, name_not_permitted}},
- { "4.13.10", "Invalid DN nameConstraints Test10", {bad_cert, name_not_permitted}},
- { "4.13.11", "Valid DN nameConstraints Test11", ok},
- { "4.13.12", "Invalid DN nameConstraints Test12", {bad_cert, name_not_permitted}},
- { "4.13.13", "Invalid DN nameConstraints Test13", {bad_cert, name_not_permitted}},
- { "4.13.14", "Valid DN nameConstraints Test14", ok},
- { "4.13.15", "Invalid DN nameConstraints Test15", {bad_cert, name_not_permitted}},
- { "4.13.16", "Invalid DN nameConstraints Test16", {bad_cert, name_not_permitted}},
- { "4.13.17", "Invalid DN nameConstraints Test17", {bad_cert, name_not_permitted}},
- { "4.13.18", "Valid DN nameConstraints Test18", ok},
- { "4.13.19", "Valid Self-Issued DN nameConstraints Test19", ok},
- { "4.13.20", "Invalid Self-Issued DN nameConstraints Test20", {bad_cert, name_not_permitted} },
- { "4.13.21", "Valid RFC822 nameConstraints Test21", ok},
- { "4.13.22", "Invalid RFC822 nameConstraints Test22", {bad_cert, name_not_permitted} },
- { "4.13.23", "Valid RFC822 nameConstraints Test23", ok},
- { "4.13.24", "Invalid RFC822 nameConstraints Test24", {bad_cert, name_not_permitted} },
- { "4.13.25", "Valid RFC822 nameConstraints Test25", ok},
- { "4.13.26", "Invalid RFC822 nameConstraints Test26", {bad_cert, name_not_permitted}},
- { "4.13.27", "Valid DN and RFC822 nameConstraints Test27", ok},
- { "4.13.28", "Invalid DN and RFC822 nameConstraints Test28", {bad_cert, name_not_permitted} },
- { "4.13.29", "Invalid DN and RFC822 nameConstraints Test29", {bad_cert, name_not_permitted} },
- { "4.13.30", "Valid DNS nameConstraints Test30", ok},
- { "4.13.31", "Invalid DNS nameConstraints Test31", {bad_cert, name_not_permitted} },
- { "4.13.32", "Valid DNS nameConstraints Test32", ok},
- { "4.13.33", "Invalid DNS nameConstraints Test33", {bad_cert, name_not_permitted}},
- { "4.13.34", "Valid URI nameConstraints Test34", ok},
- { "4.13.35", "Invalid URI nameConstraints Test35", {bad_cert, name_not_permitted} },
- { "4.13.36", "Valid URI nameConstraints Test36", ok},
- { "4.13.37", "Invalid URI nameConstraints Test37", {bad_cert, name_not_permitted}},
- { "4.13.38", "Invalid DNS nameConstraints Test38", {bad_cert, name_not_permitted} }].
-distribution_points() ->
- %%{ "4.14", "Distribution Points" },
- [{ "4.14.1", "Valid distributionPoint Test1", ok},
- { "4.14.2", "Invalid distributionPoint Test2", 23 },
- { "4.14.3", "Invalid distributionPoint Test3", 44 },
- { "4.14.4", "Valid distributionPoint Test4", ok},
- { "4.14.5", "Valid distributionPoint Test5", ok},
- { "4.14.6", "Invalid distributionPoint Test6", 23 },
- { "4.14.7", "Valid distributionPoint Test7", ok},
- { "4.14.8", "Invalid distributionPoint Test8", 44 },
- { "4.14.9", "Invalid distributionPoint Test9", 44 },
- { "4.14.10", "Valid No issuingDistributionPoint Test10", ok},
- { "4.14.11", "Invalid onlyContainsUserCerts CRL Test11", 44 },
- { "4.14.12", "Invalid onlyContainsCACerts CRL Test12", 44 },
- { "4.14.13", "Valid onlyContainsCACerts CRL Test13", ok},
- { "4.14.14", "Invalid onlyContainsAttributeCerts Test14", 44 },
- { "4.14.15", "Invalid onlySomeReasons Test15", 23 },
- { "4.14.16", "Invalid onlySomeReasons Test16", 23 },
- { "4.14.17", "Invalid onlySomeReasons Test17", 3 },
- { "4.14.18", "Valid onlySomeReasons Test18", ok},
- { "4.14.19", "Valid onlySomeReasons Test19", ok},
- { "4.14.20", "Invalid onlySomeReasons Test20", 23 },
- { "4.14.21", "Invalid onlySomeReasons Test21", 23 },
- { "4.14.22", "Valid IDP with indirectCRL Test22", ok},
- { "4.14.23", "Invalid IDP with indirectCRL Test23", 23 },
- { "4.14.24", "Valid IDP with indirectCRL Test24", ok},
- { "4.14.25", "Valid IDP with indirectCRL Test25", ok},
- { "4.14.26", "Invalid IDP with indirectCRL Test26", 44 },
- { "4.14.27", "Invalid cRLIssuer Test27", 3 },
- { "4.14.28", "Valid cRLIssuer Test28", ok},
- { "4.14.29", "Valid cRLIssuer Test29", ok},
-
- %% Although this test is valid it has a circular dependency. As a result
- %% an attempt is made to reursively checks a CRL path and rejected due to
- %% a CRL path validation error. PKITS notes suggest this test does not
- %% need to be run due to this issue.
- { "4.14.30", "Valid cRLIssuer Test30", 54 },
- { "4.14.31", "Invalid cRLIssuer Test31", 23 },
- { "4.14.32", "Invalid cRLIssuer Test32", 23 },
- { "4.14.33", "Valid cRLIssuer Test33", ok},
- { "4.14.34", "Invalid cRLIssuer Test34", 23 },
- { "4.14.35", "Invalid cRLIssuer Test35", 44 }].
-delta_crls() ->
- %%{ "4.15", "Delta-CRLs" },
- [{ "4.15.1", "Invalid deltaCRLIndicator No Base Test1", 3 },
- { "4.15.2", "Valid delta-CRL Test2", ok},
- { "4.15.3", "Invalid delta-CRL Test3", 23 },
- { "4.15.4", "Invalid delta-CRL Test4", 23 },
- { "4.15.5", "Valid delta-CRL Test5", ok},
- { "4.15.6", "Invalid delta-CRL Test6", 23 },
- { "4.15.7", "Valid delta-CRL Test7", ok},
- { "4.15.8", "Valid delta-CRL Test8", ok},
- { "4.15.9", "Invalid delta-CRL Test9", 23 },
- { "4.15.10", "Invalid delta-CRL Test10", 12 }].
-private_certificate_extensions() ->
- %%{ "4.16", "Private Certificate Extensions" },
- [{ "4.16.1", "Valid Unknown Not Critical Certificate Extension Test1", ok},
- { "4.16.2", "Invalid Unknown Critical Certificate Extension Test2",
- {bad_cert,unknown_critical_extension}}].
-
-
-convert() ->
- Tests = [signature_verification(),
- validity_periods(),
- verifying_name_chaining(),
- basic_certificate_revocation_tests(),
- verifying_paths_with_self_issued_certificates(),
- verifying_basic_constraints(),
- key_usage(),
- certificate_policies(),
- require_explicit_policy(),
- policy_mappings(),
- inhibit_policy_mapping(),
- inhibit_any_policy(),
- name_constraints(),
- distribution_points(),
- delta_crls(),
- private_certificate_extensions()],
- [convert(Test) || Test <- lists:flatten(Tests)].
-
-convert({_,Test,_}) ->
- convert1(Test);
-convert({_,Test,_,_,_,_,_}) ->
- convert1(Test).
-
-convert1(Test) ->
- FName = lists:append(string:tokens(Test, " -")),
- File = filename:join(?MIME, "Signed" ++ FName ++ ".eml"),
- io:format("Convert ~p~n",[File]),
- {ok, Mail} = file:read_file(File),
- Base64 = skip_lines(Mail),
- %%io:format("~s",[Base64]),
- Tmp = base64:mime_decode(Base64),
- file:write_file("pkits/smime-pem/tmp-pkcs7.der", Tmp),
- Cmd = "openssl pkcs7 -inform der -in pkits/smime-pem/tmp-pkcs7.der"
- " -print_certs -out pkits/smime-pem/" ++ FName ++ ".pem",
- case os:cmd(Cmd) of
- "" -> ok;
- Err ->
- io:format("~s",[Err]),
- erlang:error(bad_cmd)
- end.
-
-skip_lines(<<"\r\n\r\n", Rest/binary>>) -> Rest;
-skip_lines(<<"\n\n", Rest/binary>>) -> Rest;
-skip_lines(<<_:8, Rest/binary>>) ->
- skip_lines(Rest).
-
-init_per_testcase(_Func, Config) ->
- Datadir = proplists:get_value(data_dir, Config),
- put(datadir, Datadir),
- Config.
-
-fin_per_testcase(_Func, Config) ->
- %% Nodes = select_nodes(all, Config, ?FILE, ?LINE),
- %% rpc:multicall(Nodes, mnesia, lkill, []),
- Config.
-
-init_per_suite(Config) ->
- crypto:start(),
- Config.
-
-end_per_suite(_Config) ->
- crypto:stop().
-
-error(Format, Args, File0, Line) ->
- File = filename:basename(File0),
- Pid = group_leader(),
- Pid ! {failed, File, Line},
- io:format(Pid, "~s(~p): ERROR"++Format, [File,Line|Args]).
-
-warning(Format, Args, File0, Line) ->
- File = filename:basename(File0),
- io:format("~s(~p): Warning "++Format, [File,Line|Args]).
diff --git a/lib/public_key/test/public_key.cover b/lib/public_key/test/public_key.cover
index 8477c76ef6..ec00814578 100644
--- a/lib/public_key/test/public_key.cover
+++ b/lib/public_key/test/public_key.cover
@@ -1,2 +1,4 @@
+{incl_app,public_key,details}.
-{exclude, ['OTP-PUB-KEY']}. \ No newline at end of file
+
+{excl_mods, public_key, ['OTP-PUB-KEY']}.
diff --git a/lib/public_key/test/public_key.spec b/lib/public_key/test/public_key.spec
index dee9ad44ed..1749822c2d 100644
--- a/lib/public_key/test/public_key.spec
+++ b/lib/public_key/test/public_key.spec
@@ -1,2 +1 @@
-{topcase, {dir, "../public_key_test"}}.
-
+{suites,"../public_key_test",all}.
diff --git a/lib/public_key/test/public_key_SUITE.erl b/lib/public_key/test/public_key_SUITE.erl
index 88cfbcf2b6..b11e4d092a 100644
--- a/lib/public_key/test/public_key_SUITE.erl
+++ b/lib/public_key/test/public_key_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -23,10 +23,10 @@
%% Note: This directive should only be used in test suites.
-compile(export_all).
--include_lib("test_server/include/test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include_lib("test_server/include/test_server_line.hrl").
--include("public_key.hrl").
+-include_lib("public_key/include/public_key.hrl").
-define(TIMEOUT, 120000). % 2 min
@@ -41,9 +41,12 @@
%% variable, but should NOT alter/remove any existing entries.
%%--------------------------------------------------------------------
init_per_suite(Config) ->
- crypto:start(),
- Config.
-
+ try crypto:start() of
+ ok ->
+ Config
+ catch _:_ ->
+ {skip, "Crypto did not start"}
+ end.
%%--------------------------------------------------------------------
%% Function: end_per_suite(Config) -> _
%% Config - [tuple()]
@@ -51,7 +54,7 @@ init_per_suite(Config) ->
%% Description: Cleanup after the whole suite
%%--------------------------------------------------------------------
end_per_suite(_Config) ->
- crypto:stop().
+ application:stop(crypto).
%%--------------------------------------------------------------------
%% Function: init_per_testcase(TestCase, Config) -> Config
@@ -96,19 +99,34 @@ end_per_testcase(_TestCase, Config) ->
%% Name of a test case.
%% Description: Returns a list of all test cases in this test suite
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test the public_key rsa functionality"];
-
-all(suite) ->
- [app,
- pk_decode_encode,
- encrypt_decrypt,
- sign_verify,
- pkix,
- pkix_path_validation,
- deprecated
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [app,
+ {group, pem_decode_encode},
+ {group, ssh_public_key_decode_encode},
+ encrypt_decrypt,
+ {group, sign_verify},
+ pkix, pkix_path_validation, deprecated].
+
+groups() ->
+ [{pem_decode_encode, [], [dsa_pem, rsa_pem, encrypted_pem,
+ dh_pem, cert_pem]},
+ {ssh_public_key_decode_encode, [],
+ [ssh_rsa_public_key, ssh_dsa_public_key, ssh_rfc4716_rsa_comment,
+ ssh_rfc4716_dsa_comment, ssh_rfc4716_rsa_subject, ssh_known_hosts,
+ ssh_auth_keys, ssh1_known_hosts, ssh1_auth_keys, ssh_openssh_public_key_with_comment,
+ ssh_openssh_public_key_long_header]},
+ {sign_verify, [], [rsa_sign_verify, dsa_sign_verify]}
].
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%% Test cases starts here.
%%--------------------------------------------------------------------
@@ -119,74 +137,130 @@ app(suite) ->
app(Config) when is_list(Config) ->
ok = test_server:app_test(public_key).
-pk_decode_encode(doc) ->
- ["Tests pem_decode/1, pem_encode/1, "
- "der_decode/2, der_encode/2, "
- "pem_entry_decode/1, pem_entry_decode/2,"
- "pem_entry_encode/2, pem_entry_encode/3."];
+%%--------------------------------------------------------------------
-pk_decode_encode(suite) ->
+dsa_pem(doc) ->
+ [""];
+dsa_pem(suite) ->
[];
-pk_decode_encode(Config) when is_list(Config) ->
+dsa_pem(Config) when is_list(Config) ->
Datadir = ?config(data_dir, Config),
- [{'DSAPrivateKey', DerDSAKey, not_encrypted} = Entry0 ] =
- erl_make_certs:pem_to_der(filename:join(Datadir, "dsa.pem")),
-
+ [{'DSAPrivateKey', DerDSAKey, not_encrypted} = Entry0 ] =
+ erl_make_certs:pem_to_der(filename:join(Datadir, "dsa.pem")),
+
DSAKey = public_key:der_decode('DSAPrivateKey', DerDSAKey),
-
+
DSAKey = public_key:pem_entry_decode(Entry0),
-
- [{'RSAPrivateKey', DerRSAKey, not_encrypted} = Entry1 ] =
+
+ {ok, DSAPubPem} = file:read_file(filename:join(Datadir, "dsa_pub.pem")),
+ [{'SubjectPublicKeyInfo', _, _} = PubEntry0] =
+ public_key:pem_decode(DSAPubPem),
+ DSAPubKey = public_key:pem_entry_decode(PubEntry0),
+ true = check_entry_type(DSAPubKey, 'DSAPublicKey'),
+ PubEntry0 = public_key:pem_entry_encode('SubjectPublicKeyInfo', DSAPubKey),
+ DSAPubPemNoEndNewLines = strip_ending_newlines(DSAPubPem),
+ DSAPubPemNoEndNewLines = strip_ending_newlines(public_key:pem_encode([PubEntry0])).
+
+%%--------------------------------------------------------------------
+
+rsa_pem(doc) ->
+ [""];
+rsa_pem(suite) ->
+ [];
+rsa_pem(Config) when is_list(Config) ->
+ Datadir = ?config(data_dir, Config),
+ [{'RSAPrivateKey', DerRSAKey, not_encrypted} = Entry0 ] =
erl_make_certs:pem_to_der(filename:join(Datadir, "client_key.pem")),
-
+
RSAKey0 = public_key:der_decode('RSAPrivateKey', DerRSAKey),
+
+ RSAKey0 = public_key:pem_entry_decode(Entry0),
- RSAKey0 = public_key:pem_entry_decode(Entry1),
-
- [{'RSAPrivateKey', _, {_,_}} = Entry2] =
+ [{'RSAPrivateKey', _, {_,_}} = Entry1] =
erl_make_certs:pem_to_der(filename:join(Datadir, "rsa.pem")),
-
- true = check_entry_type(public_key:pem_entry_decode(Entry2, "abcd1234"),
+
+ true = check_entry_type(public_key:pem_entry_decode(Entry1, "abcd1234"),
'RSAPrivateKey'),
+ {ok, RSAPubPem} = file:read_file(filename:join(Datadir, "rsa_pub.pem")),
+ [{'SubjectPublicKeyInfo', _, _} = PubEntry0] =
+ public_key:pem_decode(RSAPubPem),
+ RSAPubKey = public_key:pem_entry_decode(PubEntry0),
+ true = check_entry_type(RSAPubKey, 'RSAPublicKey'),
+ PubEntry0 = public_key:pem_entry_encode('SubjectPublicKeyInfo', RSAPubKey),
+ RSAPubPemNoEndNewLines = strip_ending_newlines(RSAPubPem),
+ RSAPubPemNoEndNewLines = strip_ending_newlines(public_key:pem_encode([PubEntry0])),
+
+ {ok, RSARawPem} = file:read_file(filename:join(Datadir, "rsa_pub_key.pem")),
+ [{'RSAPublicKey', _, _} = PubEntry1] =
+ public_key:pem_decode(RSARawPem),
+ RSAPubKey = public_key:pem_entry_decode(PubEntry1),
+ RSARawPemNoEndNewLines = strip_ending_newlines(RSARawPem),
+ RSARawPemNoEndNewLines = strip_ending_newlines(public_key:pem_encode([PubEntry1])).
+
+%%--------------------------------------------------------------------
+
+encrypted_pem(doc) ->
+ [""];
+encrypted_pem(suite) ->
+ [];
+encrypted_pem(Config) when is_list(Config) ->
+ Datadir = ?config(data_dir, Config),
+
+ [{'RSAPrivateKey', DerRSAKey, not_encrypted}] =
+ erl_make_certs:pem_to_der(filename:join(Datadir, "client_key.pem")),
+
+ RSAKey = public_key:der_decode('RSAPrivateKey', DerRSAKey),
+
Salt0 = crypto:rand_bytes(8),
- Entry3 = public_key:pem_entry_encode('RSAPrivateKey', RSAKey0,
+ Entry0 = public_key:pem_entry_encode('RSAPrivateKey', RSAKey,
{{"DES-EDE3-CBC", Salt0}, "1234abcd"}),
-
- RSAKey0 = public_key:pem_entry_decode(Entry3,"1234abcd"),
-
+ RSAKey = public_key:pem_entry_decode(Entry0,"1234abcd"),
Des3KeyFile = filename:join(Datadir, "des3_client_key.pem"),
+ erl_make_certs:der_to_pem(Des3KeyFile, [Entry0]),
+ [{'RSAPrivateKey', _, {"DES-EDE3-CBC", Salt0}}] =
+ erl_make_certs:pem_to_der(Des3KeyFile),
- erl_make_certs:der_to_pem(Des3KeyFile, [Entry3]),
-
- [{'RSAPrivateKey', _, {"DES-EDE3-CBC", Salt0}}] = erl_make_certs:pem_to_der(Des3KeyFile),
-
Salt1 = crypto:rand_bytes(8),
- Entry4 = public_key:pem_entry_encode('RSAPrivateKey', RSAKey0,
+ Entry1 = public_key:pem_entry_encode('RSAPrivateKey', RSAKey,
{{"DES-CBC", Salt1}, "4567efgh"}),
-
-
DesKeyFile = filename:join(Datadir, "des_client_key.pem"),
+ erl_make_certs:der_to_pem(DesKeyFile, [Entry1]),
+ [{'RSAPrivateKey', _, {"DES-CBC", Salt1}} =Entry2] =
+ erl_make_certs:pem_to_der(DesKeyFile),
+ true = check_entry_type(public_key:pem_entry_decode(Entry2, "4567efgh"),
+ 'RSAPrivateKey').
- erl_make_certs:der_to_pem(DesKeyFile, [Entry4]),
-
- [{'RSAPrivateKey', _, {"DES-CBC", Salt1}} =Entry5] = erl_make_certs:pem_to_der(DesKeyFile),
-
-
- true = check_entry_type(public_key:pem_entry_decode(Entry5, "4567efgh"),
- 'RSAPrivateKey'),
+%%--------------------------------------------------------------------
- [{'DHParameter', DerDH, not_encrypted} = Entry6] =
+dh_pem(doc) ->
+ [""];
+dh_pem(suite) ->
+ [];
+dh_pem(Config) when is_list(Config) ->
+ Datadir = ?config(data_dir, Config),
+ [{'DHParameter', DerDH, not_encrypted} = Entry] =
erl_make_certs:pem_to_der(filename:join(Datadir, "dh.pem")),
-
- erl_make_certs:der_to_pem(filename:join(Datadir, "new_dh.pem"), [Entry6]),
+
+ erl_make_certs:der_to_pem(filename:join(Datadir, "new_dh.pem"), [Entry]),
DHParameter = public_key:der_decode('DHParameter', DerDH),
- DHParameter = public_key:pem_entry_decode(Entry6),
+ DHParameter = public_key:pem_entry_decode(Entry),
- Entry6 = public_key:pem_entry_encode('DHParameter', DHParameter),
+ Entry = public_key:pem_entry_encode('DHParameter', DHParameter).
+%%--------------------------------------------------------------------
+cert_pem(doc) ->
+ [""];
+cert_pem(suite) ->
+ [];
+cert_pem(Config) when is_list(Config) ->
+ Datadir = ?config(data_dir, Config),
+
+ [Entry0] =
+ erl_make_certs:pem_to_der(filename:join(Datadir, "dsa.pem")),
+
[{'Certificate', DerCert, not_encrypted} = Entry7] =
erl_make_certs:pem_to_der(filename:join(Datadir, "client_cert.pem")),
@@ -196,15 +270,232 @@ pk_decode_encode(Config) when is_list(Config) ->
CertEntries = [{'Certificate', _, not_encrypted} = CertEntry0,
{'Certificate', _, not_encrypted} = CertEntry1] =
erl_make_certs:pem_to_der(filename:join(Datadir, "cacerts.pem")),
-
+
ok = erl_make_certs:der_to_pem(filename:join(Datadir, "wcacerts.pem"), CertEntries),
ok = erl_make_certs:der_to_pem(filename:join(Datadir, "wdsa.pem"), [Entry0]),
NewCertEntries = erl_make_certs:pem_to_der(filename:join(Datadir, "wcacerts.pem")),
true = lists:member(CertEntry0, NewCertEntries),
true = lists:member(CertEntry1, NewCertEntries),
- [Entry0] = erl_make_certs:pem_to_der(filename:join(Datadir, "wdsa.pem")),
- ok.
+ [Entry0] = erl_make_certs:pem_to_der(filename:join(Datadir, "wdsa.pem")).
+
+%%--------------------------------------------------------------------
+ssh_rsa_public_key(doc) ->
+ "";
+ssh_rsa_public_key(suite) ->
+ [];
+ssh_rsa_public_key(Config) when is_list(Config) ->
+ Datadir = ?config(data_dir, Config),
+
+ {ok, RSARawSsh2} = file:read_file(filename:join(Datadir, "ssh2_rsa_pub")),
+ [{PubKey, Attributes1}] = public_key:ssh_decode(RSARawSsh2, public_key),
+ [{PubKey, Attributes1}] = public_key:ssh_decode(RSARawSsh2, rfc4716_public_key),
+
+ {ok, RSARawOpenSsh} = file:read_file(filename:join(Datadir, "openssh_rsa_pub")),
+ [{PubKey, Attributes2}] = public_key:ssh_decode(RSARawOpenSsh, public_key),
+ [{PubKey, Attributes2}] = public_key:ssh_decode(RSARawOpenSsh, openssh_public_key),
+
+ %% Can not check EncodedSSh == RSARawSsh2 and EncodedOpenSsh
+ %% = RSARawOpenSsh as line breakpoints may differ
+
+ EncodedSSh = public_key:ssh_encode([{PubKey, Attributes1}], rfc4716_public_key),
+ EncodedOpenSsh = public_key:ssh_encode([{PubKey, Attributes2}], openssh_public_key),
+
+ [{PubKey, Attributes1}] =
+ public_key:ssh_decode(EncodedSSh, public_key),
+ [{PubKey, Attributes2}] =
+ public_key:ssh_decode(EncodedOpenSsh, public_key).
+
+%%--------------------------------------------------------------------
+
+ssh_dsa_public_key(doc) ->
+ "";
+ssh_dsa_public_key(suite) ->
+ [];
+ssh_dsa_public_key(Config) when is_list(Config) ->
+ Datadir = ?config(data_dir, Config),
+
+ {ok, DSARawSsh2} = file:read_file(filename:join(Datadir, "ssh2_dsa_pub")),
+ [{PubKey, Attributes1}] = public_key:ssh_decode(DSARawSsh2, public_key),
+ [{PubKey, Attributes1}] = public_key:ssh_decode(DSARawSsh2, rfc4716_public_key),
+
+ {ok, DSARawOpenSsh} = file:read_file(filename:join(Datadir, "openssh_dsa_pub")),
+ [{PubKey, Attributes2}] = public_key:ssh_decode(DSARawOpenSsh, public_key),
+ [{PubKey, Attributes2}] = public_key:ssh_decode(DSARawOpenSsh, openssh_public_key),
+
+ %% Can not check EncodedSSh == DSARawSsh2 and EncodedOpenSsh
+ %% = DSARawOpenSsh as line breakpoints may differ
+
+ EncodedSSh = public_key:ssh_encode([{PubKey, Attributes1}], rfc4716_public_key),
+ EncodedOpenSsh = public_key:ssh_encode([{PubKey, Attributes2}], openssh_public_key),
+
+ [{PubKey, Attributes1}] =
+ public_key:ssh_decode(EncodedSSh, public_key),
+ [{PubKey, Attributes2}] =
+ public_key:ssh_decode(EncodedOpenSsh, public_key).
+
+%%--------------------------------------------------------------------
+ssh_rfc4716_rsa_comment(doc) ->
+ "Test comment header and rsa key";
+ssh_rfc4716_rsa_comment(suite) ->
+ [];
+ssh_rfc4716_rsa_comment(Config) when is_list(Config) ->
+ Datadir = ?config(data_dir, Config),
+
+ {ok, RSARawSsh2} = file:read_file(filename:join(Datadir, "ssh2_rsa_comment_pub")),
+ [{#'RSAPublicKey'{} = PubKey, Attributes}] =
+ public_key:ssh_decode(RSARawSsh2, public_key),
+
+ Headers = proplists:get_value(headers, Attributes),
+
+ Value = proplists:get_value("Comment", Headers, undefined),
+ true = Value =/= undefined,
+ RSARawSsh2 = public_key:ssh_encode([{PubKey, Attributes}], rfc4716_public_key).
+
+%%--------------------------------------------------------------------
+ssh_rfc4716_dsa_comment(doc) ->
+ "Test comment header and dsa key";
+ssh_rfc4716_dsa_comment(suite) ->
+ [];
+ssh_rfc4716_dsa_comment(Config) when is_list(Config) ->
+ Datadir = ?config(data_dir, Config),
+
+ {ok, DSARawSsh2} = file:read_file(filename:join(Datadir, "ssh2_dsa_comment_pub")),
+ [{{_, #'Dss-Parms'{}} = PubKey, Attributes}] =
+ public_key:ssh_decode(DSARawSsh2, public_key),
+
+ Headers = proplists:get_value(headers, Attributes),
+
+ Value = proplists:get_value("Comment", Headers, undefined),
+ true = Value =/= undefined,
+
+ %% Can not check Encoded == DSARawSsh2 as line continuation breakpoints may differ
+ Encoded = public_key:ssh_encode([{PubKey, Attributes}], rfc4716_public_key),
+ [{PubKey, Attributes}] =
+ public_key:ssh_decode(Encoded, public_key).
+
+%%--------------------------------------------------------------------
+ssh_rfc4716_rsa_subject(doc) ->
+ "Test another header value than comment";
+ssh_rfc4716_rsa_subject(suite) ->
+ [];
+ssh_rfc4716_rsa_subject(Config) when is_list(Config) ->
+ Datadir = ?config(data_dir, Config),
+
+ {ok, RSARawSsh2} = file:read_file(filename:join(Datadir, "ssh2_subject_pub")),
+ [{#'RSAPublicKey'{} = PubKey, Attributes}] =
+ public_key:ssh_decode(RSARawSsh2, public_key),
+
+ Headers = proplists:get_value(headers, Attributes),
+
+ Value = proplists:get_value("Subject", Headers, undefined),
+ true = Value =/= undefined,
+
+ %% Can not check Encoded == RSARawSsh2 as line continuation breakpoints may differ
+ Encoded = public_key:ssh_encode([{PubKey, Attributes}], rfc4716_public_key),
+ [{PubKey, Attributes}] =
+ public_key:ssh_decode(Encoded, public_key).
+
+%%--------------------------------------------------------------------
+ssh_known_hosts(doc) ->
+ "";
+ssh_known_hosts(suite) ->
+ [];
+ssh_known_hosts(Config) when is_list(Config) ->
+ Datadir = ?config(data_dir, Config),
+
+ {ok, SshKnownHosts} = file:read_file(filename:join(Datadir, "known_hosts")),
+ [{#'RSAPublicKey'{}, Attributes1}, {#'RSAPublicKey'{}, Attributes2}] = Decoded =
+ public_key:ssh_decode(SshKnownHosts, known_hosts),
+
+ Value1 = proplists:get_value(hostnames, Attributes1, undefined),
+ Value2 = proplists:get_value(hostnames, Attributes2, undefined),
+ true = (Value1 =/= undefined) and (Value2 =/= undefined),
+
+ Encoded = public_key:ssh_encode(Decoded, known_hosts),
+ Decoded = public_key:ssh_decode(Encoded, known_hosts).
+
+%%--------------------------------------------------------------------
+
+ssh1_known_hosts(doc) ->
+ "";
+ssh1_known_hosts(suite) ->
+ [];
+ssh1_known_hosts(Config) when is_list(Config) ->
+ Datadir = ?config(data_dir, Config),
+
+ {ok, SshKnownHosts} = file:read_file(filename:join(Datadir, "ssh1_known_hosts")),
+ [{#'RSAPublicKey'{}, Attributes1}, {#'RSAPublicKey'{}, Attributes2}] = Decoded =
+ public_key:ssh_decode(SshKnownHosts, known_hosts),
+
+ Value1 = proplists:get_value(hostnames, Attributes1, undefined),
+ Value2 = proplists:get_value(hostnames, Attributes2, undefined),
+ true = (Value1 =/= undefined) and (Value2 =/= undefined),
+
+ Encoded = public_key:ssh_encode(Decoded, known_hosts),
+ Decoded = public_key:ssh_decode(Encoded, known_hosts).
+
+%%--------------------------------------------------------------------
+ssh_auth_keys(doc) ->
+ "";
+ssh_auth_keys(suite) ->
+ [];
+ssh_auth_keys(Config) when is_list(Config) ->
+ Datadir = ?config(data_dir, Config),
+
+ {ok, SshAuthKeys} = file:read_file(filename:join(Datadir, "auth_keys")),
+ [{#'RSAPublicKey'{}, Attributes1}, {{_, #'Dss-Parms'{}}, _Attributes2}] = Decoded =
+ public_key:ssh_decode(SshAuthKeys, auth_keys),
+
+ Value1 = proplists:get_value(options, Attributes1, undefined),
+ true = Value1 =/= undefined,
+
+ Encoded = public_key:ssh_encode(Decoded, auth_keys),
+ Decoded = public_key:ssh_decode(Encoded, auth_keys).
+
+%%--------------------------------------------------------------------
+ssh1_auth_keys(doc) ->
+ "";
+ssh1_auth_keys(suite) ->
+ [];
+ssh1_auth_keys(Config) when is_list(Config) ->
+ Datadir = ?config(data_dir, Config),
+
+ {ok, SshAuthKeys} = file:read_file(filename:join(Datadir, "ssh1_auth_keys")),
+ [{#'RSAPublicKey'{}, Attributes1}, {#'RSAPublicKey'{}, Attributes2}] = Decoded =
+ public_key:ssh_decode(SshAuthKeys, auth_keys),
+
+ Value1 = proplists:get_value(bits, Attributes1, undefined),
+ Value2 = proplists:get_value(bits, Attributes2, undefined),
+ true = (Value1 =/= undefined) and (Value2 =/= undefined),
+
+ Encoded = public_key:ssh_encode(Decoded, auth_keys),
+ Decoded = public_key:ssh_decode(Encoded, auth_keys).
+
+%%--------------------------------------------------------------------
+ssh_openssh_public_key_with_comment(doc) ->
+ "Test that emty lines and lines starting with # are ignored";
+ssh_openssh_public_key_with_comment(suite) ->
+ [];
+ssh_openssh_public_key_with_comment(Config) when is_list(Config) ->
+ Datadir = ?config(data_dir, Config),
+
+ {ok, DSARawOpenSsh} = file:read_file(filename:join(Datadir, "openssh_dsa_with_comment_pub")),
+ [{{_, #'Dss-Parms'{}}, _}] = public_key:ssh_decode(DSARawOpenSsh, openssh_public_key).
+
+%%--------------------------------------------------------------------
+ssh_openssh_public_key_long_header(doc) ->
+ "Test that long headers are handled";
+ssh_openssh_public_key_long_header(suite) ->
+ [];
+ssh_openssh_public_key_long_header(Config) when is_list(Config) ->
+ Datadir = ?config(data_dir, Config),
+
+ {ok,RSARawOpenSsh} = file:read_file(filename:join(Datadir, "ssh_rsa_long_header_pub")),
+ [{#'RSAPublicKey'{}, _}] = Decoded = public_key:ssh_decode(RSARawOpenSsh, public_key),
+
+ Encoded = public_key:ssh_encode(Decoded, rfc4716_public_key),
+ Decoded = public_key:ssh_decode(Encoded, rfc4716_public_key).
%%--------------------------------------------------------------------
encrypt_decrypt(doc) ->
@@ -227,44 +518,49 @@ encrypt_decrypt(Config) when is_list(Config) ->
ok.
%%--------------------------------------------------------------------
-sign_verify(doc) ->
- ["Checks that we can sign and verify signatures."];
-sign_verify(suite) ->
+rsa_sign_verify(doc) ->
+ ["Checks that we can sign and verify rsa signatures."];
+rsa_sign_verify(suite) ->
[];
-sign_verify(Config) when is_list(Config) ->
- %% Make cert signs and validates the signature using RSA and DSA
+rsa_sign_verify(Config) when is_list(Config) ->
Ca = {_, CaKey} = erl_make_certs:make_cert([]),
+ {Cert1, _} = erl_make_certs:make_cert([{key, dsa}, {issuer, Ca}]),
PrivateRSA = #'RSAPrivateKey'{modulus=Mod, publicExponent=Exp} =
public_key:pem_entry_decode(CaKey),
-
- CertInfo = {Cert1,CertKey1} = erl_make_certs:make_cert([{key, dsa}, {issuer, Ca}]),
-
PublicRSA = #'RSAPublicKey'{modulus=Mod, publicExponent=Exp},
true = public_key:pkix_verify(Cert1, PublicRSA),
- {Cert2,_CertKey} = erl_make_certs:make_cert([{issuer, CertInfo}]),
-
- #'DSAPrivateKey'{p=P, q=Q, g=G, y=Y, x=_X} =
- public_key:pem_entry_decode(CertKey1),
- true = public_key:pkix_verify(Cert2, {Y, #'Dss-Parms'{p=P, q=Q, g=G}}),
-
- %% RSA sign
Msg = list_to_binary(lists:duplicate(5, "Foo bar 100")),
-
RSASign = public_key:sign(Msg, sha, PrivateRSA),
true = public_key:verify(Msg, sha, RSASign, PublicRSA),
false = public_key:verify(<<1:8, Msg/binary>>, sha, RSASign, PublicRSA),
false = public_key:verify(Msg, sha, <<1:8, RSASign/binary>>, PublicRSA),
RSASign1 = public_key:sign(Msg, md5, PrivateRSA),
- true = public_key:verify(Msg, md5, RSASign1, PublicRSA),
+ true = public_key:verify(Msg, md5, RSASign1, PublicRSA).
- %% DSA sign
+%%--------------------------------------------------------------------
+
+dsa_sign_verify(doc) ->
+ ["Checks that we can sign and verify dsa signatures."];
+dsa_sign_verify(suite) ->
+ [];
+dsa_sign_verify(Config) when is_list(Config) ->
+ Ca = erl_make_certs:make_cert([]),
+ CertInfo = {_,CertKey1} = erl_make_certs:make_cert([{key, dsa}, {issuer, Ca}]),
+ {Cert2,_CertKey} = erl_make_certs:make_cert([{issuer, CertInfo}]),
+
+ #'DSAPrivateKey'{p=P, q=Q, g=G, y=Y, x=_X} =
+ public_key:pem_entry_decode(CertKey1),
+ true = public_key:pkix_verify(Cert2, {Y, #'Dss-Parms'{p=P, q=Q, g=G}}),
+
Datadir = ?config(data_dir, Config),
[DsaKey = {'DSAPrivateKey', _, _}] =
erl_make_certs:pem_to_der(filename:join(Datadir, "dsa.pem")),
DSAPrivateKey = public_key:pem_entry_decode(DsaKey),
#'DSAPrivateKey'{p=P1, q=Q1, g=G1, y=Y1, x=_X1} = DSAPrivateKey,
+
+ Msg = list_to_binary(lists:duplicate(5, "Foo bar 100")),
DSASign = public_key:sign(Msg, sha, DSAPrivateKey),
DSAPublicKey = Y1,
DSAParams = #'Dss-Parms'{p=P1, q=Q1, g=G1},
@@ -281,9 +577,8 @@ sign_verify(Config) when is_list(Config) ->
false = public_key:verify(<<1:8, RestDigest/binary>>, none, DigestSign,
{DSAPublicKey, DSAParams}),
false = public_key:verify(Digest, none, <<1:8, DigestSign/binary>>,
- {DSAPublicKey, DSAParams}),
-
- ok.
+ {DSAPublicKey, DSAParams}).
+
%%--------------------------------------------------------------------
pkix(doc) ->
"Misc pkix tests not covered elsewhere";
@@ -429,9 +724,16 @@ check_entry_type(#'DSAPrivateKey'{}, 'DSAPrivateKey') ->
true;
check_entry_type(#'RSAPrivateKey'{}, 'RSAPrivateKey') ->
true;
+check_entry_type(#'RSAPublicKey'{}, 'RSAPublicKey') ->
+ true;
+check_entry_type({_Int, #'Dss-Parms'{}}, 'DSAPublicKey') when is_integer(_Int) ->
+ true;
check_entry_type(#'DHParameter'{}, 'DHParameter') ->
true;
check_entry_type(#'Certificate'{}, 'Certificate') ->
true;
check_entry_type(_,_) ->
false.
+
+strip_ending_newlines(Bin) ->
+ string:strip(binary_to_list(Bin), right, 10).
diff --git a/lib/public_key/test/public_key_SUITE_data/auth_keys b/lib/public_key/test/public_key_SUITE_data/auth_keys
new file mode 100644
index 0000000000..0c4b47edde
--- /dev/null
+++ b/lib/public_key/test/public_key_SUITE_data/auth_keys
@@ -0,0 +1,3 @@
+command="dump /home",no-pty,no-port-forwarding ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAgEAwrr66r8n6B8Y0zMF3dOpXEapIQD9DiYQ6D6/zwor9o39jSkHNiMMER/GETBbzP83LOcekm02aRjo55ArO7gPPVvCXbrirJu9pkm4AC4BBre5xSLS7soyzwbigFruM8G63jSXqpHqJ/ooi168sKMC2b0Ncsi+JlTfNYlDXJVLKEeZgZOInQyMmtisaDTUQWTIv1snAizf4iIYENuAkGYGNCL77u5Y5VOu5eQipvFajTnps9QvUx/zdSFYn9e2sulWM3Bxc/S4IJ67JWHVRpfJxGi3hinRBH8WQdXuUwdJJTiJHKPyYrrM7Q6Xq4TOMFtcRuLDC6u3BXM1L0gBvHPNOnD5l2Lp5EjUkQ9CBf2j4A4gfH+iWQZyk08esAG/iwArAVxkl368+dkbMWOXL8BN4x5zYgdzoeypQZZ2RKH780MCTSo4WQ19DP8pw+9q3bSFC9H3xYAxrKAJNWjeTUJOTrTe+mWXXU770gYyQTxa2ycnYrlZucn1S3vsvn6eq7NZZ8NRbyv1n15Ocg+nHK4fuKOrwPhU3NbKQwtjb0Wsxx1gAmQqIOLTpAdsrAauPxC7TPYA5qQVCphvimKuhQM/1gMV225JrnjspVlthCzuFYUjXOKC3wxz6FFEtwnXu3uC5bVVkmkNadJmD21gD23yk4BraGXVYpRMIB+X+OTUUI8= dhopson@VMUbuntu-DSH
+
+ssh-dss AAAAB3NzaC1kc3MAAACBAPY8ZOHY2yFSJA6XYC9HRwNHxaehvx5wOJ0rzZdzoSOXxbETW6ToHv8D1UJ/z+zHo9Fiko5XybZnDIaBDHtblQ+Yp7StxyltHnXF1YLfKD1G4T6JYrdHYI14Om1eg9e4NnCRleaqoZPF3UGfZia6bXrGTQf3gJq2e7Yisk/gF+1VAAAAFQDb8D5cvwHWTZDPfX0D2s9Rd7NBvQAAAIEAlN92+Bb7D4KLYk3IwRbXblwXdkPggA4pfdtW9vGfJ0/RHd+NjB4eo1D+0dix6tXwYGN7PKS5R/FXPNwxHPapcj9uL1Jn2AWQ2dsknf+i/FAAvioUPkmdMc0zuWoSOEsSNhVDtX3WdvVcGcBq9cetzrtOKWOocJmJ80qadxTRHtUAAACBAN7CY+KKv1gHpRzFwdQm7HK9bb1LAo2KwaoXnadFgeptNBQeSXG1vO+JsvphVMBJc9HSn24VYtYtsMu74qXviYjziVucWKjjKEb11juqnF0GDlB3VVmxHLmxnAz643WK42Z7dLM5sY29ouezv4Xz2PuMch5VGPP+CDqzCM4loWgV dhopson@VMUbuntu-DSH
diff --git a/lib/public_key/test/public_key_SUITE_data/dsa_pub.pem b/lib/public_key/test/public_key_SUITE_data/dsa_pub.pem
new file mode 100644
index 0000000000..d3635e5b20
--- /dev/null
+++ b/lib/public_key/test/public_key_SUITE_data/dsa_pub.pem
@@ -0,0 +1,12 @@
+-----BEGIN PUBLIC KEY-----
+MIIBtzCCASwGByqGSM44BAEwggEfAoGBALez5tklY5CdFeTMos899pA6i4u4uCts
+zgBzrdBk6cl5FVqzdzWMGTQiynnTpGsrOESinzP06Ip+pG15We2OORwgvCxD/W95
+aCiN0/+MdiXqlsmboBARMzsa+SmBENN3gF/+tuuEAFzOXU1q2cmEywRLyfbM2KIB
+VE/TChWYw2eRAhUA1R64VvcQ90XA8SOKVDmMA0dBzukCgYEAlLMYP0pbgBlgHQVO
+3/avAHlWNrIq52Lxk7SdPJWgMvPjTK9Z6sv88kxsCcydtjvO439j1yqcwk50GQc+
+86ktBWWz93/HkIdnFyqafef4mmWvm2Uq6ClQKS+A0Asfaj8Mys+HUMiI+qsfdjRb
+yIpwb7MX1nsVdsKzALnZNMW27A0DgYQAAoGAfEIAb3mLjtFfiF/tsZb4/DGHdWSb
+6Ir0hFkoBUZ9ymBO70wlfZVSQGs240kZtOMpAOpJL1Dy8oH6PUQ+JyacwZIo8fdq
+19/Kwm6CPrpaEhzErmMvwT2CZJYZ+HOk55ljLkVCiyG7MzEj2+odLKym9yoQsbsJ
+olHzIRpkLk45y4c=
+-----END PUBLIC KEY-----
diff --git a/lib/public_key/test/public_key_SUITE_data/known_hosts b/lib/public_key/test/public_key_SUITE_data/known_hosts
new file mode 100644
index 0000000000..30fc3b1fe8
--- /dev/null
+++ b/lib/public_key/test/public_key_SUITE_data/known_hosts
@@ -0,0 +1,3 @@
+hostname.domain.com,192.168.0.1 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA1XY18+zA8VNK2YkzygOkMqUxHSTfxT1Xxx8CgDZgcQH8HUhPssW5ttvG8nKetlPQZAVk1C4WkWS1y5b3ekBhZTIxocp9Joc6V1+f2EOfO2mSLRwB16RGrdw6q7msrBXTC/dl+hF45kMMzVNzqxnSMVOa0sEPK2zK6Sg3Vi9fCSM=
+
+|1|BWO5qDxk/cFH0wa05JLdHn+j6xQ=|rXQvIxh5cDD3C43k5DPDamawVNA= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA1XY18+zA8VNK2YkzygOkMqUxHSTfxT1Xxx8CgDZgcQH8HUhPssW5ttvG8nKetlPQZAVk1C4WkWS1y5b3ekBhZTIxocp9Joc6V1+f2EOfO2mSLRwB16RGrdw6q7msrBXTC/dl+hF45kMMzVNzqxnSMVOa0sEPK2zK6Sg3Vi9fCSM= [email protected]
diff --git a/lib/public_key/test/public_key_SUITE_data/openssh_dsa_pub b/lib/public_key/test/public_key_SUITE_data/openssh_dsa_pub
new file mode 100644
index 0000000000..a765ba8189
--- /dev/null
+++ b/lib/public_key/test/public_key_SUITE_data/openssh_dsa_pub
@@ -0,0 +1 @@
+ssh-dss AAAAB3NzaC1kc3MAAACBAPY8ZOHY2yFSJA6XYC9HRwNHxaehvx5wOJ0rzZdzoSOXxbETW6ToHv8D1UJ/z+zHo9Fiko5XybZnDIaBDHtblQ+Yp7StxyltHnXF1YLfKD1G4T6JYrdHYI14Om1eg9e4NnCRleaqoZPF3UGfZia6bXrGTQf3gJq2e7Yisk/gF+1VAAAAFQDb8D5cvwHWTZDPfX0D2s9Rd7NBvQAAAIEAlN92+Bb7D4KLYk3IwRbXblwXdkPggA4pfdtW9vGfJ0/RHd+NjB4eo1D+0dix6tXwYGN7PKS5R/FXPNwxHPapcj9uL1Jn2AWQ2dsknf+i/FAAvioUPkmdMc0zuWoSOEsSNhVDtX3WdvVcGcBq9cetzrtOKWOocJmJ80qadxTRHtUAAACBAN7CY+KKv1gHpRzFwdQm7HK9bb1LAo2KwaoXnadFgeptNBQeSXG1vO+JsvphVMBJc9HSn24VYtYtsMu74qXviYjziVucWKjjKEb11juqnF0GDlB3VVmxHLmxnAz643WK42Z7dLM5sY29ouezv4Xz2PuMch5VGPP+CDqzCM4loWgV dhopson@VMUbuntu-DSH
diff --git a/lib/public_key/test/public_key_SUITE_data/openssh_dsa_with_comment_pub b/lib/public_key/test/public_key_SUITE_data/openssh_dsa_with_comment_pub
new file mode 100644
index 0000000000..d5a34a3f78
--- /dev/null
+++ b/lib/public_key/test/public_key_SUITE_data/openssh_dsa_with_comment_pub
@@ -0,0 +1,3 @@
+#This should be ignored!!
+
+ssh-dss AAAAB3NzaC1kc3MAAACBAPY8ZOHY2yFSJA6XYC9HRwNHxaehvx5wOJ0rzZdzoSOXxbETW6ToHv8D1UJ/z+zHo9Fiko5XybZnDIaBDHtblQ+Yp7StxyltHnXF1YLfKD1G4T6JYrdHYI14Om1eg9e4NnCRleaqoZPF3UGfZia6bXrGTQf3gJq2e7Yisk/gF+1VAAAAFQDb8D5cvwHWTZDPfX0D2s9Rd7NBvQAAAIEAlN92+Bb7D4KLYk3IwRbXblwXdkPggA4pfdtW9vGfJ0/RHd+NjB4eo1D+0dix6tXwYGN7PKS5R/FXPNwxHPapcj9uL1Jn2AWQ2dsknf+i/FAAvioUPkmdMc0zuWoSOEsSNhVDtX3WdvVcGcBq9cetzrtOKWOocJmJ80qadxTRHtUAAACBAN7CY+KKv1gHpRzFwdQm7HK9bb1LAo2KwaoXnadFgeptNBQeSXG1vO+JsvphVMBJc9HSn24VYtYtsMu74qXviYjziVucWKjjKEb11juqnF0GDlB3VVmxHLmxnAz643WK42Z7dLM5sY29ouezv4Xz2PuMch5VGPP+CDqzCM4loWgV dhopson@VMUbuntu-DSH
diff --git a/lib/public_key/test/public_key_SUITE_data/openssh_rsa_pub b/lib/public_key/test/public_key_SUITE_data/openssh_rsa_pub
new file mode 100644
index 0000000000..0a0838db40
--- /dev/null
+++ b/lib/public_key/test/public_key_SUITE_data/openssh_rsa_pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAgEAwrr66r8n6B8Y0zMF3dOpXEapIQD9DiYQ6D6/zwor9o39jSkHNiMMER/GETBbzP83LOcekm02aRjo55ArO7gPPVvCXbrirJu9pkm4AC4BBre5xSLS7soyzwbigFruM8G63jSXqpHqJ/ooi168sKMC2b0Ncsi+JlTfNYlDXJVLKEeZgZOInQyMmtisaDTUQWTIv1snAizf4iIYENuAkGYGNCL77u5Y5VOu5eQipvFajTnps9QvUx/zdSFYn9e2sulWM3Bxc/S4IJ67JWHVRpfJxGi3hinRBH8WQdXuUwdJJTiJHKPyYrrM7Q6Xq4TOMFtcRuLDC6u3BXM1L0gBvHPNOnD5l2Lp5EjUkQ9CBf2j4A4gfH+iWQZyk08esAG/iwArAVxkl368+dkbMWOXL8BN4x5zYgdzoeypQZZ2RKH780MCTSo4WQ19DP8pw+9q3bSFC9H3xYAxrKAJNWjeTUJOTrTe+mWXXU770gYyQTxa2ycnYrlZucn1S3vsvn6eq7NZZ8NRbyv1n15Ocg+nHK4fuKOrwPhU3NbKQwtjb0Wsxx1gAmQqIOLTpAdsrAauPxC7TPYA5qQVCphvimKuhQM/1gMV225JrnjspVlthCzuFYUjXOKC3wxz6FFEtwnXu3uC5bVVkmkNadJmD21gD23yk4BraGXVYpRMIB+X+OTUUI8= dhopson@VMUbuntu-DSH
diff --git a/lib/public_key/test/public_key_SUITE_data/rsa_pub.pem b/lib/public_key/test/public_key_SUITE_data/rsa_pub.pem
new file mode 100644
index 0000000000..cbe81343f7
--- /dev/null
+++ b/lib/public_key/test/public_key_SUITE_data/rsa_pub.pem
@@ -0,0 +1,4 @@
+-----BEGIN PUBLIC KEY-----
+MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANRiyZg0uci74Nc6mnqZ8AoDl88aT7x6
+JA0MfgHIHzteEj7Qg+lE5QxMGAafurVE5vqoHkDfwk4uzzsCAJuz91MCAwEAAQ==
+-----END PUBLIC KEY-----
diff --git a/lib/public_key/test/public_key_SUITE_data/rsa_pub_key.pem b/lib/public_key/test/public_key_SUITE_data/rsa_pub_key.pem
new file mode 100644
index 0000000000..3b9d7568ff
--- /dev/null
+++ b/lib/public_key/test/public_key_SUITE_data/rsa_pub_key.pem
@@ -0,0 +1,4 @@
+-----BEGIN RSA PUBLIC KEY-----
+MEgCQQDUYsmYNLnIu+DXOpp6mfAKA5fPGk+8eiQNDH4ByB87XhI+0IPpROUMTBgG
+n7q1ROb6qB5A38JOLs87AgCbs/dTAgMBAAE=
+-----END RSA PUBLIC KEY-----
diff --git a/lib/public_key/test/public_key_SUITE_data/ssh1_auth_keys b/lib/public_key/test/public_key_SUITE_data/ssh1_auth_keys
new file mode 100644
index 0000000000..c91f4e4679
--- /dev/null
+++ b/lib/public_key/test/public_key_SUITE_data/ssh1_auth_keys
@@ -0,0 +1,3 @@
+1024 35 794430685278501116412873221867658581245241426828503388129294124540165981586596106773643485704743298698207838825035605868404742682423919455523383721081589378970796492944950066480951790660582889972423189943567111507801410254720228911513553205592856585541922662924268445466959576882300405064708497308004255650466014242855505233634626075778108365396568863197935915425650388910408127232583533503834009244199384570662092164277923946411149853110048365318587554141774139652307149492021035538341281427025252592933784473453522113124752189378715431529801894015739903371171585194505182320772654217490509848165365152457990491089951560694728469571221819385402117009544812199223715540348068497710535492913376699508575875577554607325905000745578091554027803374110357015655416894607641289462159580964951182385869168785183135763253784745647466464331174922663455073627501620274348748413309761116542324505123795743603781806636788810617169341018091186028310551725315297135354426735951943325476221811539822892501042385411792050504283745898099390893596941969752683246939665141002098430129617772928840718016009187577151479855846883928332010147501182201528575840364152774917950524127063432334646746291719251739989499132767590205934821590545762802261107691663 dhopson@VMUbuntu-DSH
+
+command="dump /home",no-pty,no-port-forwarding 1024 35 794430685278501116412873221867658581245241426828503388129294124540165981586596106773643485704743298698207838825035605868404742682423919455523383721081589378970796492944950066480951790660582889972423189943567111507801410254720228911513553205592856585541922662924268445466959576882300405064708497308004255650466014242855505233634626075778108365396568863197935915425650388910408127232583533503834009244199384570662092164277923946411149853110048365318587554141774139652307149492021035538341281427025252592933784473453522113124752189378715431529801894015739903371171585194505182320772654217490509848165365152457990491089951560694728469571221819385402117009544812199223715540348068497710535492913376699508575875577554607325905000745578091554027803374110357015655416894607641289462159580964951182385869168785183135763253784745647466464331174922663455073627501620274348748413309761116542324505123795743603781806636788810617169341018091186028310551725315297135354426735951943325476221811539822892501042385411792050504283745898099390893596941969752683246939665141002098430129617772928840718016009187577151479855846883928332010147501182201528575840364152774917950524127063432334646746291719251739989499132767590205934821590545762802261107691663 dhopson@VMUbuntu-DSH
diff --git a/lib/public_key/test/public_key_SUITE_data/ssh1_known_hosts b/lib/public_key/test/public_key_SUITE_data/ssh1_known_hosts
new file mode 100644
index 0000000000..ec668fe05b
--- /dev/null
+++ b/lib/public_key/test/public_key_SUITE_data/ssh1_known_hosts
@@ -0,0 +1,2 @@
+hostname.domain.com,192.168.0.1 1024 35 794430685278501116412873221867658581245241426828503388129294124540165981586596106773643485704743298698207838825035605868404742682423919455523383721081589378970796492944950066480951790660582889972423189943567111507801410254720228911513553205592856585541922662924268445466959576882300405064708497308004255650466014242855505233634626075778108365396568863197935915425650388910408127232583533503834009244199384570662092164277923946411149853110048365318587554141774139652307149492021035538341281427025252592933784473453522113124752189378715431529801894015739903371171585194505182320772654217490509848165365152457990491089951560694728469571221819385402117009544812199223715540348068497710535492913376699508575875577554607325905000745578091554027803374110357015655416894607641289462159580964951182385869168785183135763253784745647466464331174922663455073627501620274348748413309761116542324505123795743603781806636788810617169341018091186028310551725315297135354426735951943325476221811539822892501042385411792050504283745898099390893596941969752683246939665141002098430129617772928840718016009187577151479855846883928332010147501182201528575840364152774917950524127063432334646746291719251739989499132767590205934821590545762802261107691663 dhopson@VMUbuntu-DSH
+hostname2.domain.com,192.168.0.2 1024 35 794430685278501116412873221867658581245241426828503388129294124540165981586596106773643485704743298698207838825035605868404742682423919455523383721081589378970796492944950066480951790660582889972423189943567111507801410254720228911513553205592856585541922662924268445466959576882300405064708497308004255650466014242855505233634626075778108365396568863197935915425650388910408127232583533503834009244199384570662092164277923946411149853110048365318587554141774139652307149492021035538341281427025252592933784473453522113124752189378715431529801894015739903371171585194505182320772654217490509848165365152457990491089951560694728469571221819385402117009544812199223715540348068497710535492913376699508575875577554607325905000745578091554027803374110357015655416894607641289462159580964951182385869168785183135763253784745647466464331174922663455073627501620274348748413309761116542324505123795743603781806636788810617169341018091186028310551725315297135354426735951943325476221811539822892501042385411792050504283745898099390893596941969752683246939665141002098430129617772928840718016009187577151479855846883928332010147501182201528575840364152774917950524127063432334646746291719251739989499132767590205934821590545762802261107691663
diff --git a/lib/public_key/test/public_key_SUITE_data/ssh2_dsa_comment_pub b/lib/public_key/test/public_key_SUITE_data/ssh2_dsa_comment_pub
new file mode 100644
index 0000000000..ca5089dbd7
--- /dev/null
+++ b/lib/public_key/test/public_key_SUITE_data/ssh2_dsa_comment_pub
@@ -0,0 +1,13 @@
+---- BEGIN SSH2 PUBLIC KEY ----
+Comment: This is my public key for use on \
+servers which I don't like.
+AAAAB3NzaC1kc3MAAACBAPY8ZOHY2yFSJA6XYC9HRwNHxaehvx5wOJ0rzZdzoSOXxbET
+W6ToHv8D1UJ/z+zHo9Fiko5XybZnDIaBDHtblQ+Yp7StxyltHnXF1YLfKD1G4T6JYrdH
+YI14Om1eg9e4NnCRleaqoZPF3UGfZia6bXrGTQf3gJq2e7Yisk/gF+1VAAAAFQDb8D5c
+vwHWTZDPfX0D2s9Rd7NBvQAAAIEAlN92+Bb7D4KLYk3IwRbXblwXdkPggA4pfdtW9vGf
+J0/RHd+NjB4eo1D+0dix6tXwYGN7PKS5R/FXPNwxHPapcj9uL1Jn2AWQ2dsknf+i/FAA
+vioUPkmdMc0zuWoSOEsSNhVDtX3WdvVcGcBq9cetzrtOKWOocJmJ80qadxTRHtUAAACB
+AN7CY+KKv1gHpRzFwdQm7HK9bb1LAo2KwaoXnadFgeptNBQeSXG1vO+JsvphVMBJc9HS
+n24VYtYtsMu74qXviYjziVucWKjjKEb11juqnF0GDlB3VVmxHLmxnAz643WK42Z7dLM5
+sY29ouezv4Xz2PuMch5VGPP+CDqzCM4loWgV
+---- END SSH2 PUBLIC KEY ----
diff --git a/lib/public_key/test/public_key_SUITE_data/ssh2_dsa_pub b/lib/public_key/test/public_key_SUITE_data/ssh2_dsa_pub
new file mode 100644
index 0000000000..a5e38be81a
--- /dev/null
+++ b/lib/public_key/test/public_key_SUITE_data/ssh2_dsa_pub
@@ -0,0 +1,12 @@
+---- BEGIN SSH2 PUBLIC KEY ----
+Comment: DSA Public Key for use with MyIsp
+AAAAB3NzaC1kc3MAAACBAPY8ZOHY2yFSJA6XYC9HRwNHxaehvx5wOJ0rzZdzoSOXxbET
+W6ToHv8D1UJ/z+zHo9Fiko5XybZnDIaBDHtblQ+Yp7StxyltHnXF1YLfKD1G4T6JYrdH
+YI14Om1eg9e4NnCRleaqoZPF3UGfZia6bXrGTQf3gJq2e7Yisk/gF+1VAAAAFQDb8D5c
+vwHWTZDPfX0D2s9Rd7NBvQAAAIEAlN92+Bb7D4KLYk3IwRbXblwXdkPggA4pfdtW9vGf
+J0/RHd+NjB4eo1D+0dix6tXwYGN7PKS5R/FXPNwxHPapcj9uL1Jn2AWQ2dsknf+i/FAA
+vioUPkmdMc0zuWoSOEsSNhVDtX3WdvVcGcBq9cetzrtOKWOocJmJ80qadxTRHtUAAACB
+AN7CY+KKv1gHpRzFwdQm7HK9bb1LAo2KwaoXnadFgeptNBQeSXG1vO+JsvphVMBJc9HS
+n24VYtYtsMu74qXviYjziVucWKjjKEb11juqnF0GDlB3VVmxHLmxnAz643WK42Z7dLM5
+sY29ouezv4Xz2PuMch5VGPP+CDqzCM4loWgV
+---- END SSH2 PUBLIC KEY ----
diff --git a/lib/public_key/test/public_key_SUITE_data/ssh2_rsa_comment_pub b/lib/public_key/test/public_key_SUITE_data/ssh2_rsa_comment_pub
new file mode 100644
index 0000000000..e4d446147c
--- /dev/null
+++ b/lib/public_key/test/public_key_SUITE_data/ssh2_rsa_comment_pub
@@ -0,0 +1,7 @@
+---- BEGIN SSH2 PUBLIC KEY ----
+Comment: "1024-bit RSA, converted from OpenSSH by [email protected]"
+x-command: /home/me/bin/lock-in-guest.sh
+AAAAB3NzaC1yc2EAAAABIwAAAIEA1on8gxCGJJWSRT4uOrR13mUaUk0hRf4RzxSZ1zRb
+YYFw8pfGesIFoEuVth4HKyF8k1y4mRUnYHP1XNMNMJl1JcEArC2asV8sHf6zSPVffozZ
+5TT4SfsUu/iKy9lUcCfXzwre4WWZSXXcPff+EHtWshahu3WzBdnGxm5Xoi89zcE=
+---- END SSH2 PUBLIC KEY ----
diff --git a/lib/public_key/test/public_key_SUITE_data/ssh2_rsa_pub b/lib/public_key/test/public_key_SUITE_data/ssh2_rsa_pub
new file mode 100644
index 0000000000..761088b517
--- /dev/null
+++ b/lib/public_key/test/public_key_SUITE_data/ssh2_rsa_pub
@@ -0,0 +1,13 @@
+---- BEGIN SSH2 PUBLIC KEY ----
+AAAAB3NzaC1yc2EAAAABIwAAAgEAwrr66r8n6B8Y0zMF3dOpXEapIQD9DiYQ6D6/zwor9o
+39jSkHNiMMER/GETBbzP83LOcekm02aRjo55ArO7gPPVvCXbrirJu9pkm4AC4BBre5xSLS
+7soyzwbigFruM8G63jSXqpHqJ/ooi168sKMC2b0Ncsi+JlTfNYlDXJVLKEeZgZOInQyMmt
+isaDTUQWTIv1snAizf4iIYENuAkGYGNCL77u5Y5VOu5eQipvFajTnps9QvUx/zdSFYn9e2
+sulWM3Bxc/S4IJ67JWHVRpfJxGi3hinRBH8WQdXuUwdJJTiJHKPyYrrM7Q6Xq4TOMFtcRu
+LDC6u3BXM1L0gBvHPNOnD5l2Lp5EjUkQ9CBf2j4A4gfH+iWQZyk08esAG/iwArAVxkl368
++dkbMWOXL8BN4x5zYgdzoeypQZZ2RKH780MCTSo4WQ19DP8pw+9q3bSFC9H3xYAxrKAJNW
+jeTUJOTrTe+mWXXU770gYyQTxa2ycnYrlZucn1S3vsvn6eq7NZZ8NRbyv1n15Ocg+nHK4f
+uKOrwPhU3NbKQwtjb0Wsxx1gAmQqIOLTpAdsrAauPxC7TPYA5qQVCphvimKuhQM/1gMV22
+5JrnjspVlthCzuFYUjXOKC3wxz6FFEtwnXu3uC5bVVkmkNadJmD21gD23yk4BraGXVYpRM
+IB+X+OTUUI8=
+---- END SSH2 PUBLIC KEY ----
diff --git a/lib/public_key/test/public_key_SUITE_data/ssh2_subject_pub b/lib/public_key/test/public_key_SUITE_data/ssh2_subject_pub
new file mode 100644
index 0000000000..8b8ccda8ba
--- /dev/null
+++ b/lib/public_key/test/public_key_SUITE_data/ssh2_subject_pub
@@ -0,0 +1,8 @@
+---- BEGIN SSH2 PUBLIC KEY ----
+Subject: me
+Comment: 1024-bit rsa, created by [email protected] Mon Jan 15 \
+08:31:24 2001
+AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4
+596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4
+soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=
+---- END SSH2 PUBLIC KEY ----
diff --git a/lib/public_key/test/public_key_SUITE_data/ssh_rsa_long_comment_pub b/lib/public_key/test/public_key_SUITE_data/ssh_rsa_long_comment_pub
new file mode 100644
index 0000000000..7b42ced93e
--- /dev/null
+++ b/lib/public_key/test/public_key_SUITE_data/ssh_rsa_long_comment_pub
@@ -0,0 +1,9 @@
+---- BEGIN SSH2 PUBLIC KEY ----
+Comment: This is an example of a very very very very looooooooooooo\
+ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\
+commment
+x-command: /home/me/bin/lock-in-guest.sh
+AAAAB3NzaC1yc2EAAAABIwAAAIEA1on8gxCGJJWSRT4uOrR13mUaUk0hRf4RzxSZ1zRb
+YYFw8pfGesIFoEuVth4HKyF8k1y4mRUnYHP1XNMNMJl1JcEArC2asV8sHf6zSPVffozZ
+5TT4SfsUu/iKy9lUcCfXzwre4WWZSXXcPff+EHtWshahu3WzBdnGxm5Xoi89zcE=
+---- END SSH2 PUBLIC KEY ----
diff --git a/lib/public_key/test/public_key_SUITE_data/ssh_rsa_long_header_pub b/lib/public_key/test/public_key_SUITE_data/ssh_rsa_long_header_pub
new file mode 100644
index 0000000000..7b42ced93e
--- /dev/null
+++ b/lib/public_key/test/public_key_SUITE_data/ssh_rsa_long_header_pub
@@ -0,0 +1,9 @@
+---- BEGIN SSH2 PUBLIC KEY ----
+Comment: This is an example of a very very very very looooooooooooo\
+ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\
+commment
+x-command: /home/me/bin/lock-in-guest.sh
+AAAAB3NzaC1yc2EAAAABIwAAAIEA1on8gxCGJJWSRT4uOrR13mUaUk0hRf4RzxSZ1zRb
+YYFw8pfGesIFoEuVth4HKyF8k1y4mRUnYHP1XNMNMJl1JcEArC2asV8sHf6zSPVffozZ
+5TT4SfsUu/iKy9lUcCfXzwre4WWZSXXcPff+EHtWshahu3WzBdnGxm5Xoi89zcE=
+---- END SSH2 PUBLIC KEY ----
diff --git a/lib/public_key/vsn.mk b/lib/public_key/vsn.mk
index 334b9d792e..3c6b012152 100644
--- a/lib/public_key/vsn.mk
+++ b/lib/public_key/vsn.mk
@@ -1 +1 @@
-PUBLIC_KEY_VSN = 0.10
+PUBLIC_KEY_VSN = 0.12
diff --git a/lib/reltool/doc/src/notes.xml b/lib/reltool/doc/src/notes.xml
index 95e379db53..a791f2ce03 100644
--- a/lib/reltool/doc/src/notes.xml
+++ b/lib/reltool/doc/src/notes.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2009</year>
- <year>2009</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
@@ -37,7 +37,29 @@
thus constitutes one section in this document. The title of each
section is the version number of Reltool.</p>
- <section><title>Reltool 0.5.4</title>
+ <section><title>Reltool 0.5.5</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ The reltool module contained two seriously erroneous
+ specs which caused bogus warnings when dialyzing reltool
+ and some correct code of users. These were fixed (specs
+ for start_link/1 and eval_server/3)</p>
+ <p>
+ - Code cleanups and simplifications - Fix a bug in the
+ calculation of circular dependencies - Eliminate two
+ dialyzer warnings - Put files alphabetically</p>
+ <p>
+ Own Id: OTP-9120</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>Reltool 0.5.4</title>
<section><title>Improvements and New Features</title>
<list>
diff --git a/lib/reltool/doc/src/reltool.xml b/lib/reltool/doc/src/reltool.xml
index 598594145a..31e15e34e7 100644
--- a/lib/reltool/doc/src/reltool.xml
+++ b/lib/reltool/doc/src/reltool.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2009</year>
- <year>2009</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/reltool/doc/src/reltool_examples.xml b/lib/reltool/doc/src/reltool_examples.xml
index bce9413b52..19a3f37819 100644
--- a/lib/reltool/doc/src/reltool_examples.xml
+++ b/lib/reltool/doc/src/reltool_examples.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2009</year>
- <year>2009</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/reltool/doc/src/reltool_usage.xml b/lib/reltool/doc/src/reltool_usage.xml
index 0a053a014e..d128e80a77 100644
--- a/lib/reltool/doc/src/reltool_usage.xml
+++ b/lib/reltool/doc/src/reltool_usage.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2009</year>
- <year>2009</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/reltool/src/reltool.app.src b/lib/reltool/src/reltool.app.src
index b80753e8fc..4188f341f1 100644
--- a/lib/reltool/src/reltool.app.src
+++ b/lib/reltool/src/reltool.app.src
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
@@ -22,8 +22,8 @@
{vsn, "%VSN%"},
{modules,
[
- reltool_app_win,
reltool,
+ reltool_app_win,
reltool_fgraph,
reltool_fgraph_win,
reltool_mod_win,
diff --git a/lib/reltool/src/reltool.erl b/lib/reltool/src/reltool.erl
index 9dd0a24f46..54eb1ca9e1 100644
--- a/lib/reltool/src/reltool.erl
+++ b/lib/reltool/src/reltool.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
@@ -38,26 +38,26 @@ start() ->
%% Start main window process
-spec start(options()) -> {ok, window_pid()} | {error, reason()}.
-start(Options)when is_list(Options) ->
+start(Options) when is_list(Options) ->
case start_link(Options) of
- {ok, WinPid} ->
+ {ok, WinPid} = OK ->
unlink(WinPid),
- {ok, WinPid};
- Other->
- Other
+ OK;
+ {error, _Reason} = Error ->
+ Error
end.
%% Start main window process with wx debugging enabled
--spec debug() -> {ok, window_pid()} | {error, reason()}.
+-spec debug() -> {ok, window_pid()} | {error, reason()}.
debug() ->
start([{wx_debug, 2}]).
%% Start main window process with options
--spec start_link(options()) -> {ok, window_pid() | {error, reason()}}.
+-spec start_link(options()) -> {ok, window_pid()} | {error, reason()}.
start_link(Options) when is_list(Options) ->
case reltool_sys_win:start_link(Options) of
- {ok, WinPid} ->
- {ok, WinPid};
+ {ok, _WinPid} = OK ->
+ OK;
{error, Reason} ->
{error, lists:flatten(io_lib:format("~p", [Reason]))}
end.
@@ -76,8 +76,8 @@ start_server(Options) ->
-spec get_server(window_pid()) -> {ok, server_pid()} | {error, reason()}.
get_server(WinPid) ->
case reltool_sys_win:get_server(WinPid) of
- {ok, ServerPid} ->
- {ok, ServerPid};
+ {ok, _ServerPid} = OK ->
+ OK;
{error, Reason} ->
{error, lists:flatten(io_lib:format("~p", [Reason]))}
end.
@@ -96,9 +96,9 @@ stop(Pid) when is_pid(Pid) ->
end.
%% Internal library function
--spec eval_server(server(), boolean(), fun((server_pid()) -> term())) ->
- {ok, server_pid()} | {error, reason()}.
-eval_server(Pid, DisplayWarnings, Fun)
+-spec eval_server(server(), boolean(), fun((server_pid()) -> Ret)) ->
+ Ret | {error, reason()} when Ret :: term().
+eval_server(Pid, _DisplayWarnings, Fun)
when is_pid(Pid) ->
Fun(Pid);
eval_server(Options, DisplayWarnings, Fun)
@@ -107,8 +107,8 @@ eval_server(Options, DisplayWarnings, Fun)
Res = case start_server(Options) of
{ok, Pid} ->
apply_fun(Pid, DisplayWarnings, Fun);
- {error, Reason} ->
- {error, Reason}
+ {error, _Reason} = Error ->
+ Error
end,
process_flag(trap_exit, TrapExit),
Res.
@@ -122,21 +122,18 @@ apply_fun(Pid, true, Fun) ->
{ok, Warnings} ->
[io:format("~p: ~s\n", [?APPLICATION, W]) || W <- Warnings],
apply_fun(Pid, false, Fun);
- {error, Reason} ->
+ {error, _Reason} = Error ->
stop(Pid),
- {error, Reason}
+ Error
end.
%% Get status about the configuration
-type warning() :: string().
--spec get_status(server()) ->
- {ok, [warning()]} | {error, reason()}.
+-spec get_status(server()) -> {ok, [warning()]} | {error, reason()}.
get_status(PidOrOptions)
when is_pid(PidOrOptions); is_list(PidOrOptions) ->
eval_server(PidOrOptions, false,
- fun(Pid) ->
- reltool_server:get_status(Pid)
- end).
+ fun(Pid) -> reltool_server:get_status(Pid) end).
%% Get reltool configuration
-spec get_config(server()) -> {ok, config()} | {error, reason()}.
diff --git a/lib/reltool/src/reltool.hrl b/lib/reltool/src/reltool.hrl
index 1a34ced89d..93f47f6381 100644
--- a/lib/reltool/src/reltool.hrl
+++ b/lib/reltool/src/reltool.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
@@ -20,8 +20,8 @@
-define(MISSING_APP_NAME, '*MISSING*').
-define(MISSING_APP_TEXT, "*MISSING*").
--type file() :: string().
--type dir() :: string().
+-type file() :: file:filename().
+-type dir() :: file:filename().
%% app - Include all modules in app file
%% ebin - Include all modules on ebin directory
%% derived - Include only those modules that others are dependent on
@@ -48,7 +48,7 @@
-type mod_name() :: atom().
-type app_name() :: atom().
-type app_vsn() :: string(). % e.g. "4.7"
--type app_label() :: string().% e.g. "mnesia" or "mnesia-4.7"
+-type app_label() :: string(). % e.g. "mnesia" or "mnesia-4.7"
-type app_type() :: permanent | transient | temporary | load | none.
-type incl_app() :: app_name().
-type emu_name() :: string().
@@ -93,10 +93,10 @@
| {escript, escript_file(), [escript()]}
| {app, app_name(), [app()]}.
-type config() :: {sys, [sys()]}.
--type option() :: {wx_debug, term()} |
- {trap_exit, boolean()} |
- config() |
- {config, config() | file()}.
+-type option() :: {wx_debug, term()}
+ | {trap_exit, boolean()}
+ | config()
+ | {config, config() | file()}.
-type options() :: [option()].
-type server_pid() :: pid().
-type window_pid() :: pid().
@@ -110,32 +110,30 @@
-type top_dir() :: file().
-type top_file() :: file().
-type target_spec() :: [target_spec()]
- | {create_dir, base_dir(), [target_spec()]}
- | {create_dir, base_dir(), top_dir(), [target_spec()]}
- | {archive, base_file(), [archive_opt()], [target_spec()]}
- | {copy_file, base_file()}
- | {copy_file, base_file(), top_file()}
- | {write_file, base_file(), iolist()}
- | {strip_beam_file, base_file()}.
--type target_dir() :: dir().
--type incl_defaults() :: boolean().
--type incl_derived() :: boolean().
--type ets_tab() :: term().
--type status() :: missing | ok.
+ | {create_dir, base_dir(), [target_spec()]}
+ | {create_dir, base_dir(), top_dir(), [target_spec()]}
+ | {archive, base_file(), [archive_opt()], [target_spec()]}
+ | {copy_file, base_file()}
+ | {copy_file, base_file(), top_file()}
+ | {write_file, base_file(), iolist()}
+ | {strip_beam_file, base_file()}.
+-type target_dir() :: dir().
+-type incl_defaults() :: boolean().
+-type incl_derived() :: boolean().
+-type status() :: missing | ok.
-record(common,
{
sys_debug :: term(),
wx_debug :: term(),
trap_exit :: boolean(),
- app_tab :: ets_tab(),
- mod_tab :: ets_tab(),
- mod_used_by_tab :: ets_tab()
- }).
-
+ app_tab :: ets:tab(),
+ mod_tab :: ets:tab(),
+ mod_used_by_tab :: ets:tab()
+ }).
-record(mod,
- {%% Static
+ { %% Static
name :: mod_name(),
app_name :: app_name(),
incl_cond :: incl_cond() | undefined,
@@ -144,13 +142,12 @@
is_ebin_mod :: boolean(),
uses_mods :: [mod_name()],
exists :: boolean(),
-
%% Dynamic
status :: status(),
used_by_mods :: [mod_name()],
is_pre_included :: boolean() | undefined,
is_included :: boolean() | undefined
- }).
+ }).
-record(app_info,
{
@@ -166,10 +163,12 @@
env = [] :: [{atom(), term()}],
mod = undefined :: {mod_name(), [term()]} | undefined,
start_phases = undefined :: [{atom(), term()}] | undefined
- }).
+ }).
+
+-record(regexp, {source, compiled}).
-record(app,
- {%% Static info
+ { %% Static info
name :: app_name(),
is_escript :: boolean(),
use_selected_vsn :: boolean() | undefined,
@@ -188,10 +187,10 @@
debug_info :: debug_info() | undefined,
app_file :: app_file() | undefined,
app_type :: app_type() | undefined,
- incl_app_filters :: incl_app_filters(),
- excl_app_filters :: excl_app_filters(),
- incl_archive_filters :: incl_archive_filters(),
- excl_archive_filters :: excl_archive_filters(),
+ incl_app_filters :: [#regexp{}],
+ excl_app_filters :: [#regexp{}],
+ incl_archive_filters :: [#regexp{}],
+ excl_archive_filters :: [#regexp{}],
archive_opts :: [archive_opt()],
%% Dynamic
@@ -203,13 +202,13 @@
is_pre_included :: boolean(),
is_included :: boolean(),
rels :: [rel_name()]
- }).
+ }).
-record(rel_app,
{
- name :: app_name(),
- app_type :: app_type(),
- incl_apps :: [incl_app()]
+ name :: app_name(),
+ app_type :: app_type() | undefined,
+ incl_apps = [] :: [incl_app()]
}).
-record(rel,
@@ -217,11 +216,10 @@
name :: rel_name(),
vsn :: rel_vsn(),
rel_apps :: [#rel_app{}]
- }).
+ }).
-record(sys,
- {
- %% Sources
+ { %% Sources
root_dir :: dir(),
lib_dirs :: [dir()],
escripts :: [file()],
@@ -234,21 +232,19 @@
rels :: [#rel{}],
emu_name :: emu_name(),
profile :: profile(),
- incl_sys_filters :: incl_sys_filters(),
- excl_sys_filters :: excl_sys_filters(),
- incl_app_filters :: incl_app_filters(),
- excl_app_filters :: excl_app_filters(),
- incl_archive_filters :: incl_archive_filters(),
- excl_archive_filters :: excl_archive_filters(),
+ incl_sys_filters :: [#regexp{}],
+ excl_sys_filters :: [#regexp{}],
+ incl_app_filters :: [#regexp{}],
+ excl_app_filters :: [#regexp{}],
+ incl_archive_filters :: [#regexp{}],
+ excl_archive_filters :: [#regexp{}],
archive_opts :: [archive_opt()],
relocatable :: boolean(),
rel_app_type :: app_type(),
embedded_app_type :: app_type() | undefined,
app_file :: app_file(),
debug_info :: debug_info()
- }).
-
--record(regexp, {source, compiled}).
+ }).
-define(ERR_IMAGE, 0).
-define(WARN_IMAGE, 1).
@@ -275,7 +271,7 @@
-define(DEFAULT_INCL_ARCHIVE_FILTERS, [".*"]).
-define(DEFAULT_EXCL_ARCHIVE_FILTERS, ["^include\$", "^priv\$"]).
--define(DEFAULT_ARCHIVE_OPTS, []).
+-define(DEFAULT_ARCHIVE_OPTS, []).
-define(DEFAULT_INCL_SYS_FILTERS, [".*"]).
-define(DEFAULT_EXCL_SYS_FILTERS, []).
@@ -305,5 +301,5 @@
"^erts.*/bin/(start|escript|to_erl|run_erl)(|\\.exe)\$",
"^erts.*/bin/.*(debug|pdb)"]).
-define(STANDALONE_INCL_APP_FILTERS, ["^ebin",
- "^priv"]).
+ "^priv"]).
-define(STANDALONE_EXCL_APP_FILTERS, ["^ebin/.*\\.appup\$"]).
diff --git a/lib/reltool/src/reltool_mod_win.erl b/lib/reltool/src/reltool_mod_win.erl
index 281d2c8ad4..e1c2fa5100 100644
--- a/lib/reltool/src/reltool_mod_win.erl
+++ b/lib/reltool/src/reltool_mod_win.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
@@ -744,7 +744,7 @@ create_editor(Parent) ->
wxStyledTextCtrl:styleSetFont(Ed, Style, FixedFont),
wxStyledTextCtrl:styleSetForeground(Ed, Style, Color)
end,
- [SetStyle(Style) || Style <- Styles],
+ lists:foreach(fun (Style) -> SetStyle(Style) end, Styles),
wxStyledTextCtrl:setKeyWords(Ed, 0, keyWords()),
%% Margins Markers
diff --git a/lib/reltool/src/reltool_server.erl b/lib/reltool/src/reltool_server.erl
index 039ad56aa8..9743289ca6 100644
--- a/lib/reltool/src/reltool_server.erl
+++ b/lib/reltool/src/reltool_server.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
@@ -498,8 +498,8 @@ more_apps_in_rels([{RelName, AppName} = RA | RelApps], Apps, Acc, Status) ->
true ->
more_apps_in_rels(RelApps, Apps, Acc, Status);
false ->
- case lists:keysearch(AppName, #app.name, Apps) of
- {value, #app{info = #app_info{applications = InfoApps}}} ->
+ case lists:keyfind(AppName, #app.name, Apps) of
+ #app{info = #app_info{applications = InfoApps}} ->
Extra = [{RelName, N} || N <- InfoApps],
{Acc2, Status2} =
more_apps_in_rels(Extra, Apps, [RA | Acc], Status),
@@ -743,9 +743,9 @@ mod_propagate_is_used_by(_C, []) ->
read_apps(C, Sys, [#app{mods = Mods, is_included = IsIncl} = A | Apps], Acc) ->
{Mods2, IsIncl2} = read_apps(C, Sys, A, Mods, [], IsIncl),
Status =
- case lists:keysearch(missing, #mod.status, Mods2) of
- {value, _} -> missing;
- false -> ok
+ case lists:keymember(missing, #mod.status, Mods2) of
+ true -> missing;
+ false -> ok
end,
UsesMods = [M#mod.uses_mods || M <- Mods2, M#mod.is_included =:= true],
UsesMods2 = lists:usort(lists:flatten(UsesMods)),
@@ -820,22 +820,14 @@ filter_app(A) ->
A#app.use_selected_vsn =:= undefined ->
false;
true ->
- {Dir, Dirs} =
+ {Dir, Dirs, OptVsn} =
case A#app.use_selected_vsn of
undefined ->
- {shrinked, []};
+ {shrinked, [], undefined};
false ->
- {shrinked, []};
+ {shrinked, [], undefined};
true ->
- {A#app.active_dir, [A#app.active_dir]};
- _ when A#app.is_escript ->
- {A#app.active_dir, [A#app.active_dir]}
- end,
- OptVsn =
- case A#app.use_selected_vsn of
- undefined -> undefined;
- false -> undefined;
- true -> A#app.vsn
+ {A#app.active_dir, [A#app.active_dir], A#app.vsn}
end,
{true, A#app{active_dir = Dir,
sorted_dirs = Dirs,
@@ -1087,8 +1079,8 @@ missing_mod(ModName, AppName) ->
add_mod_config(Mods, ModConfigs) ->
AddConfig =
fun(Config, Acc) ->
- case lists:keysearch(Config#mod.name, #mod.name, Mods) of
- {value, M} ->
+ case lists:keyfind(Config#mod.name, #mod.name, Mods) of
+ #mod{} = M ->
M2 = M#mod{incl_cond = Config#mod.incl_cond},
lists:keystore(Config#mod.name, #mod.name, Acc, M2);
false ->
@@ -1179,10 +1171,10 @@ read_config(OldSys, {sys, KeyVals}, Status) ->
end,
NewSys2 = NewSys#sys{apps = lists:sort(Apps),
rels = lists:sort(Rels)},
- case lists:keysearch(NewSys2#sys.boot_rel,
+ case lists:keymember(NewSys2#sys.boot_rel,
#rel.name,
NewSys2#sys.rels) of
- {value, _} ->
+ true ->
{NewSys2, Status2};
false ->
Text2 = lists:concat(["Release " ++ NewSys2#sys.boot_rel,
@@ -1326,7 +1318,7 @@ decode(#sys{} = Sys, [{Key, Val} | KeyVals], Status) ->
Val =:= none;
Val =:= undefined ->
{Sys#sys{embedded_app_type = Val}, Status};
- app_file when Val =:= keep; Val =:= strip, Val =:= all ->
+ app_file when Val =:= keep; Val =:= strip; Val =:= all ->
{Sys#sys{app_file = Val}, Status};
debug_info when Val =:= keep; Val =:= strip ->
{Sys#sys{debug_info = Val}, Status};
@@ -1418,27 +1410,27 @@ decode(#mod{} = Mod, [{Key, Val} | KeyVals], Status) ->
end,
decode(Mod2, KeyVals, Status2);
decode(#rel{rel_apps = RelApps} = Rel, [RelApp | KeyVals], Status) ->
- RA =
+ {ValidTypesAssigned, RA} =
case RelApp of
Name when is_atom(Name) ->
- #rel_app{name = Name, app_type = undefined, incl_apps = []};
+ {true, #rel_app{name = Name}};
{Name, Type} when is_atom(Name) ->
- #rel_app{name = Name, app_type = Type, incl_apps = []};
+ {is_type(Type), #rel_app{name = Name, app_type = Type}};
{Name, InclApps} when is_atom(Name), is_list(InclApps) ->
- #rel_app{name = Name,
- app_type = undefined,
- incl_apps = InclApps};
+ VI = lists:all(fun erlang:is_atom/1, InclApps),
+ {VI, #rel_app{name = Name, incl_apps = InclApps}};
{Name, Type, InclApps} when is_atom(Name), is_list(InclApps) ->
- #rel_app{name = Name, app_type = Type, incl_apps = InclApps};
+ VT = is_type(Type),
+ VI = lists:all(fun erlang:is_atom/1, InclApps),
+ {VT andalso VI,
+ #rel_app{name = Name, app_type = Type, incl_apps = InclApps}};
_ ->
- #rel_app{incl_apps = []}
+ {false, #rel_app{incl_apps = []}}
end,
- IsType = is_type(RA#rel_app.app_type),
- NonAtoms = [IA || IA <- RA#rel_app.incl_apps, not is_atom(IA)],
- if
- IsType, NonAtoms =:= [] ->
+ case ValidTypesAssigned of
+ true ->
decode(Rel#rel{rel_apps = RelApps ++ [RA]}, KeyVals, Status);
- true ->
+ false ->
Text = lists:flatten(io_lib:format("~p", [RelApp])),
Status2 =
reltool_utils:return_first_error(Status,
@@ -1542,10 +1534,9 @@ check_rel(RelName, RelApps, Status) ->
patch_erts_version(RootDir, Apps, Status) ->
AppName = erts,
- case lists:keysearch(AppName, #app.name, Apps) of
- {value, Erts} ->
+ case lists:keyfind(AppName, #app.name, Apps) of
+ #app{vsn = Vsn} = Erts ->
LocalRoot = code:root_dir(),
- Vsn = Erts#app.vsn,
if
LocalRoot =:= RootDir, Vsn =:= "" ->
Vsn2 = erlang:system_info(version),
@@ -1773,20 +1764,20 @@ files_to_apps(_Escript, [], Acc, _Apps, _OldApps, Status) ->
{lists:keysort(#app.name, Acc), Status}.
merge_escript_app(AppName, Dir, Info, Mods, Apps, OldApps, Status) ->
- case lists:keysearch(AppName, #app.name, OldApps) of
- {value, App} ->
- ok;
- false ->
- App = default_app(AppName, Dir)
- end,
- App2 = App#app{is_escript = true,
- label = filename:basename(Dir, ".escript"),
- info = Info,
- mods = Mods,
- active_dir = Dir,
- sorted_dirs = [Dir]},
- case lists:keysearch(AppName, #app.name, Apps) of
- {value, _} ->
+ App1 = case lists:keyfind(AppName, #app.name, OldApps) of
+ #app{} = App ->
+ App;
+ false ->
+ default_app(AppName, Dir)
+ end,
+ App2 = App1#app{is_escript = true,
+ label = filename:basename(Dir, ".escript"),
+ info = Info,
+ mods = Mods,
+ active_dir = Dir,
+ sorted_dirs = [Dir]},
+ case lists:keymember(AppName, #app.name, Apps) of
+ true ->
Error = lists:concat([AppName, ": Application name clash. ",
"Escript ", Dir," contains application ",
AppName, "."]),
@@ -1804,12 +1795,15 @@ merge_app_dirs([{Name, Dir} | Rest], Apps, OldApps) ->
%% Initate app
Apps2 = sort_app_dirs(Apps),
Apps4 =
- case lists:keysearch(Name, #app.name, Apps) of
+ case lists:keyfind(Name, #app.name, Apps) of
false ->
- case lists:keysearch(Name, #app.name, OldApps) of
- {value, OldApp} when OldApp#app.active_dir =:= Dir ->
+ case lists:keyfind(Name, #app.name, OldApps) of
+ false ->
+ App = default_app(Name, Dir),
+ [App | Apps2];
+ #app{active_dir = Dir} = OldApp ->
[OldApp | Apps2];
- {value, OldApp} ->
+ OldApp ->
App =
case filter_app(OldApp) of
{true, NewApp} ->
@@ -1818,12 +1812,9 @@ merge_app_dirs([{Name, Dir} | Rest], Apps, OldApps) ->
false ->
default_app(Name, Dir)
end,
- [App | Apps2];
- false ->
- App = default_app(Name, Dir),
[App | Apps2]
end;
- {value, OldApp} ->
+ OldApp ->
Apps3 = lists:keydelete(Name, #app.name, Apps2),
App = OldApp#app{sorted_dirs = [Dir | OldApp#app.sorted_dirs]},
[App | Apps3]
diff --git a/lib/reltool/src/reltool_target.erl b/lib/reltool/src/reltool_target.erl
index dd6f75b9fc..0fcf89a360 100644
--- a/lib/reltool/src/reltool_target.erl
+++ b/lib/reltool/src/reltool_target.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
@@ -90,11 +90,11 @@ do_gen_config(#sys{root_dir = RootDir,
debug_info = DebugInfo},
InclDefs) ->
ErtsItems =
- case lists:keysearch(erts, #app.name, Apps) of
- {value, Erts} ->
- [{erts, do_gen_config(Erts, InclDefs)}];
- false ->
- []
+ case lists:keyfind(erts, #app.name, Apps) of
+ false ->
+ [];
+ Erts ->
+ [{erts, do_gen_config(Erts, InclDefs)}]
end,
AppsItems =
[do_gen_config(A, InclDefs)
@@ -521,7 +521,6 @@ sort_apps([#app{name = Name, info = Info} = App | Apps],
Visited,
[],
[]),
-
Missing1 = NotFnd1 ++ NotFnd2 ++ Missing,
case Uses ++ Incs of
[] ->
@@ -533,7 +532,7 @@ sort_apps([#app{name = Name, info = Info} = App | Apps],
%% The apps in L must be started before the app.
%% Check if we have already taken care of some app in L,
%% in that case we have a circular dependency.
- NewCircular = [N1 || N1 <- L, N2 <- Visited, N1 =:= N2],
+ NewCircular = [N || #app{name = N} <- L, N2 <- Visited, N =:= N2],
Circular1 = case NewCircular of
[] -> Circular;
_ -> [Name | NewCircular] ++ Circular
@@ -558,9 +557,9 @@ sort_apps([], Missing, Circular, _) ->
[make_set(Circular), make_set(Missing)]).
find_all(CheckingApp, [Name | Names], Apps, Visited, Found, NotFound) ->
- case lists:keysearch(Name, #app.name, Apps) of
- {value, #app{info = Info} = App} ->
- %% It is OK to have a dependecy like
+ case lists:keyfind(Name, #app.name, Apps) of
+ #app{info = Info} = App ->
+ %% It is OK to have a dependency like
%% X includes Y, Y uses X.
case lists:member(CheckingApp, Info#app_info.incl_apps) of
true ->
@@ -1232,7 +1231,7 @@ do_eval_spec({strip_beam, File}, _OrigSourceDir, SourceDir, TargetDir) ->
reltool_utils:write_file(TargetFile, BeamBin2).
cleanup_spec(List, TargetDir) when is_list(List) ->
- lists:foreach(fun(F)-> cleanup_spec(F, TargetDir) end, List);
+ lists:foreach(fun(F) -> cleanup_spec(F, TargetDir) end, List);
%% cleanup_spec({source_dir, _SourceDir, Spec}, TargetDir) ->
%% cleanup_spec(Spec, TargetDir);
cleanup_spec({create_dir, Dir, Files}, TargetDir) ->
@@ -1444,8 +1443,8 @@ subst([], _Vars, Result) ->
subst_var([$%| Rest], Vars, Result, VarAcc) ->
Key = lists:reverse(VarAcc),
- case lists:keysearch(Key, 1, Vars) of
- {value, {Key, Value}} ->
+ case lists:keyfind(Key, 1, Vars) of
+ {Key, Value} ->
subst(Rest, Vars, lists:reverse(Value, Result));
false ->
subst(Rest, Vars, [$% | VarAcc ++ [$% | Result]])
diff --git a/lib/reltool/test/Makefile b/lib/reltool/test/Makefile
index 5109058797..62fe05238b 100644
--- a/lib/reltool/test/Makefile
+++ b/lib/reltool/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2009-2010. All Rights Reserved.
+# Copyright Ericsson AB 2009-2011. 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
@@ -73,10 +73,10 @@ release_spec: opt
release_tests_spec: opt
$(INSTALL_DIR) $(RELSYSDIR)
- $(INSTALL_DATA) reltool.spec $(ERL_FILES) $(HRL_FILES) $(RELSYSDIR)
+ $(INSTALL_DATA) reltool.spec reltool.cover $(ERL_FILES) $(HRL_FILES) $(RELSYSDIR)
$(INSTALL_SCRIPT) rtt $(INSTALL_PROGS) $(RELSYSDIR)
$(INSTALL_DATA) $(INSTALL_PROGS) $(RELSYSDIR)
-# chmod -f -R u+w $(RELSYSDIR)
+# chmod -R u+w $(RELSYSDIR)
# @tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
release_docs_spec:
diff --git a/lib/reltool/test/reltool.cover b/lib/reltool/test/reltool.cover
new file mode 100644
index 0000000000..ca425b9f98
--- /dev/null
+++ b/lib/reltool/test/reltool.cover
@@ -0,0 +1,2 @@
+{incl_app,reltool,details}.
+
diff --git a/lib/reltool/test/reltool.spec b/lib/reltool/test/reltool.spec
index 252232e09d..2995720105 100644
--- a/lib/reltool/test/reltool.spec
+++ b/lib/reltool/test/reltool.spec
@@ -1,2 +1 @@
-{topcase, {dir, "../reltool_test"}}.
-
+{suites,"../reltool_test",all}.
diff --git a/lib/reltool/test/reltool_app_SUITE.erl b/lib/reltool/test/reltool_app_SUITE.erl
index f8433f73d0..a6e00cde08 100644
--- a/lib/reltool/test/reltool_app_SUITE.erl
+++ b/lib/reltool/test/reltool_app_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2011. 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
@@ -45,35 +45,36 @@ init_per_suite(Config) ->
end_per_suite(Config) ->
reltool_test_lib:end_per_suite(Config).
+init_per_testcase(undef_funcs=Case, Config) ->
+ case test_server:is_debug() of
+ true ->
+ {skip,"Debug-compiled emulator -- far too slow"};
+ false ->
+ Config2 = [{tc_timeout, timer:minutes(10)} | Config],
+ reltool_test_lib:init_per_testcase(Case, Config2)
+ end;
init_per_testcase(Case, Config) ->
- Config2 =
- case Case of
- undef_funcs ->
- [{tc_timeout, timer:minutes(10)} | Config];
- _ ->
- Config
- end,
- reltool_test_lib:init_per_testcase(Case, Config2).
+ reltool_test_lib:init_per_testcase(Case, Config).
end_per_testcase(Func,Config) ->
reltool_test_lib:end_per_testcase(Func,Config).
-fin_per_testcase(Case, Config) ->
- reltool_test_lib:end_per_testcase(Case, Config).
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all() ->
- all(suite).
-
-all(suite) ->
- [
- fields,
- modules,
- export_all,
- app_depend,
- undef_funcs
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [fields, modules, export_all, app_depend, undef_funcs].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/reltool/test/reltool_server_SUITE.erl b/lib/reltool/test/reltool_server_SUITE.erl
index faf1bdbba2..b77560db94 100644
--- a/lib/reltool/test/reltool_server_SUITE.erl
+++ b/lib/reltool/test/reltool_server_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
@@ -18,8 +18,9 @@
-module(reltool_server_SUITE).
--export([all/0, init_per_suite/1, end_per_suite/1,
- init_per_testcase/2, fin_per_testcase/2, end_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_suite/1, end_per_suite/1,
+ init_per_testcase/2, end_per_testcase/2]).
-compile(export_all).
@@ -42,25 +43,27 @@ init_per_testcase(Func,Config) ->
reltool_test_lib:init_per_testcase(Func,Config).
end_per_testcase(Func,Config) ->
reltool_test_lib:end_per_testcase(Func,Config).
-fin_per_testcase(Func,Config) -> %% For test_server
- reltool_test_lib:end_per_testcase(Func,Config).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% SUITE specification
-all() ->
- all(suite).
-all(suite) ->
- [
- start_server,
- set_config,
- create_release,
- create_script,
- create_target,
- create_embedded,
- create_standalone,
- create_old_target
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [start_server, set_config, create_release,
+ create_script, create_target, create_embedded,
+ create_standalone, create_old_target,
+ otp_9135].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% The test cases
@@ -108,6 +111,37 @@ set_config(_Config) ->
ok.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% OTP-9135, test that app_file option can be set to all | keep | strip
+
+otp_9135(TestInfo) when is_atom(TestInfo) ->
+ reltool_test_lib:tc_info(TestInfo);
+otp_9135(_Config) ->
+ Libs = lists:sort(erl_libs()),
+ StrippedDefaultSys =
+ case Libs of
+ [] -> [];
+ _ -> {lib_dirs, Libs}
+ end,
+
+ Config1 = {sys,[{app_file, keep}]}, % this is the default
+ {ok, Pid1} = ?msym({ok, _}, reltool:start_server([{config, Config1}])),
+ ?m({ok, {sys,StrippedDefaultSys}}, reltool:get_config(Pid1)),
+ ?m(ok, reltool:stop(Pid1)),
+
+ Config2 = {sys,[{app_file, strip}]},
+ {ok, Pid2} = ?msym({ok, _}, reltool:start_server([{config, Config2}])),
+ ExpectedConfig2 = StrippedDefaultSys++[{app_file,strip}],
+ ?m({ok, {sys,ExpectedConfig2}}, reltool:get_config(Pid2)),
+ ?m(ok, reltool:stop(Pid2)),
+
+ Config3 = {sys,[{app_file, all}]},
+ {ok, Pid3} = ?msym({ok, _}, reltool:start_server([{config, Config3}])),
+ ExpectedConfig3 = StrippedDefaultSys++[{app_file,all}],
+ ?m({ok, {sys,ExpectedConfig3}}, reltool:get_config(Pid3)),
+ ?m(ok, reltool:stop(Pid3)),
+ ok.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Generate releases
create_release(TestInfo) when is_atom(TestInfo) ->
diff --git a/lib/reltool/test/reltool_test_lib.erl b/lib/reltool/test/reltool_test_lib.erl
index 5390b0a75e..b8bcbcd009 100644
--- a/lib/reltool/test/reltool_test_lib.erl
+++ b/lib/reltool/test/reltool_test_lib.erl
@@ -97,7 +97,7 @@ wx_init_per_suite(Config) ->
exit({skipped, "Can not test on MacOSX"});
{unix, _} ->
io:format("DISPLAY ~s~n", [os:getenv("DISPLAY")]),
- case proplists:get_value(xserver, Config, none) of
+ case ct:get_config(xserver, none) of
none -> ignore;
Server -> os:putenv("DISPLAY", Server)
end;
@@ -295,7 +295,7 @@ eval_test_case(Mod, Fun, Config) ->
test_case_evaluator(Mod, Fun, [Config]) ->
NewConfig = Mod:init_per_testcase(Fun, Config),
R = apply(Mod, Fun, [NewConfig]),
- Mod:fin_per_testcase(Fun, NewConfig),
+ Mod:end_per_testcase(Fun, NewConfig),
exit({test_case_ok, R}).
wait_for_evaluator(Pid, Mod, Fun, Config) ->
@@ -311,12 +311,12 @@ wait_for_evaluator(Pid, Mod, Fun, Config) ->
{'EXIT', Pid, {skipped, Reason}} ->
log("<WARNING> Test case ~w skipped, because ~p~n",
[{Mod, Fun}, Reason]),
- Mod:fin_per_testcase(Fun, Config),
+ Mod:end_per_testcase(Fun, Config),
{skip, {Mod, Fun}, Reason};
{'EXIT', Pid, Reason} ->
log("<ERROR> Eval process ~w exited, because\n\t~p~n",
[{Mod, Fun}, Reason]),
- Mod:fin_per_testcase(Fun, Config),
+ Mod:end_per_testcase(Fun, Config),
{crash, {Mod, Fun}, Reason}
end.
diff --git a/lib/reltool/test/reltool_wx_SUITE.erl b/lib/reltool/test/reltool_wx_SUITE.erl
index 2e2b355e07..424bc7d189 100644
--- a/lib/reltool/test/reltool_wx_SUITE.erl
+++ b/lib/reltool/test/reltool_wx_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
@@ -18,8 +18,9 @@
-module(reltool_wx_SUITE).
--export([all/0, init_per_suite/1, end_per_suite/1,
- init_per_testcase/2, fin_per_testcase/2, end_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_suite/1, end_per_suite/1,
+ init_per_testcase/2, end_per_testcase/2]).
-compile(export_all).
@@ -36,16 +37,22 @@ init_per_testcase(Func,Config) ->
reltool_test_lib:init_per_testcase(Func,Config).
end_per_testcase(Func,Config) ->
reltool_test_lib:end_per_testcase(Func,Config).
-fin_per_testcase(Func,Config) -> %% For test_server
- reltool_test_lib:end_per_testcase(Func,Config).
%% SUITE specification
-all() ->
- all(suite).
-all(suite) ->
- [
- start_all_windows
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [start_all_windows].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% The test cases
diff --git a/lib/reltool/test/rtt.erl b/lib/reltool/test/rtt.erl
index 6755b8400f..437009e26a 100644
--- a/lib/reltool/test/rtt.erl
+++ b/lib/reltool/test/rtt.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009. All Rights Reserved.
+%% Copyright Ericsson AB 2010. 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
diff --git a/lib/reltool/vsn.mk b/lib/reltool/vsn.mk
index 9e0bce1d01..484f84788d 100644
--- a/lib/reltool/vsn.mk
+++ b/lib/reltool/vsn.mk
@@ -1 +1 @@
-RELTOOL_VSN = 0.5.4
+RELTOOL_VSN = 0.5.5
diff --git a/lib/runtime_tools/c_src/trace_file_drv.c b/lib/runtime_tools/c_src/trace_file_drv.c
index cd54f36af0..668f6f4af3 100644
--- a/lib/runtime_tools/c_src/trace_file_drv.c
+++ b/lib/runtime_tools/c_src/trace_file_drv.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1999-2009. All Rights Reserved.
+ * Copyright Ericsson AB 1999-2011. 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
diff --git a/lib/runtime_tools/doc/src/notes.xml b/lib/runtime_tools/doc/src/notes.xml
index 92629c18e5..b27a3a0996 100644
--- a/lib/runtime_tools/doc/src/notes.xml
+++ b/lib/runtime_tools/doc/src/notes.xml
@@ -31,6 +31,23 @@
<p>This document describes the changes made to the Runtime_Tools
application.</p>
+<section><title>Runtime_Tools 1.8.5</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ When a big number of trace patterns are set by inviso the
+ Erlang VM could get unresponsive for several seconds.
+ This is now corrected.</p>
+ <p>
+ Own Id: OTP-9048 Aux Id: seq11480 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Runtime_Tools 1.8.4.1</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/runtime_tools/doc/src/notes_history.xml b/lib/runtime_tools/doc/src/notes_history.xml
index 587d935e0a..8fe27f619c 100644
--- a/lib/runtime_tools/doc/src/notes_history.xml
+++ b/lib/runtime_tools/doc/src/notes_history.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2006</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/runtime_tools/doc/src/part_notes_history.xml b/lib/runtime_tools/doc/src/part_notes_history.xml
index cdd727780c..2ce1a5de05 100644
--- a/lib/runtime_tools/doc/src/part_notes_history.xml
+++ b/lib/runtime_tools/doc/src/part_notes_history.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2006</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/runtime_tools/doc/src/runtime_tools_app.xml b/lib/runtime_tools/doc/src/runtime_tools_app.xml
index e31c8cb5f7..1fd61b84d8 100644
--- a/lib/runtime_tools/doc/src/runtime_tools_app.xml
+++ b/lib/runtime_tools/doc/src/runtime_tools_app.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1999</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/runtime_tools/src/inviso_rt.erl b/lib/runtime_tools/src/inviso_rt.erl
index dfab70b42e..ac7ac2a584 100644
--- a/lib/runtime_tools/src/inviso_rt.erl
+++ b/lib/runtime_tools/src/inviso_rt.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -1422,7 +1422,17 @@ do_set_trace_patterns(Args,Flags) ->
do_set_trace_patterns_2([{M,F,Arity,MS}|Rest],Flags,Replies) -> % Option-less.
do_set_trace_patterns_2([{M,F,Arity,MS,[]}|Rest],Flags,Replies);
-do_set_trace_patterns_2([{M,F,Arity,MS,Opts}|Rest],Flags,Replies) when is_atom(M) ->
+do_set_trace_patterns_2(Mlist = [{M,F,Arity,MS,Opts}|Rest],Flags,Replies) when is_atom(M) ->
+ case length(Mlist) rem 10 of
+ 0 ->
+ timer:sleep(100);
+ _ ->
+ ok
+ end,
+ %% sleep 100 ms for every 10:th element in the list to let other
+ %% processes run since this is a potentially
+ %% heavy operation that might result in an unresponsive Erlang VM for
+ %% several seconds otherwise
case load_module_on_option(M,Opts) of
true -> % Already present, loaded or no option!
case catch erlang:trace_pattern({M,F,Arity},MS,Flags) of
@@ -1438,30 +1448,11 @@ do_set_trace_patterns_2([{M,F,Arity,MS,Opts}|Rest],Flags,Replies) when is_atom(M
do_set_trace_patterns_2(Rest,Flags,[0|Replies])
end;
do_set_trace_patterns_2([{M,F,Arity,MS,Opts}|Rest],Flags,Replies) when is_list(M) ->
- case check_pattern_parameters(void,F,Arity,MS) of % We don't want to repeat bad params.
- ok ->
- case inviso_rt_lib:expand_regexp(M,Opts) of % Get a list of real modulnames.
- Mods when is_list(Mods) ->
- MoreReplies=
- do_set_trace_patterns_2(lists:map(fun(Mod)->
- {Mod,F,Arity,MS,Opts}
- end,
- Mods),
- Flags,
- Replies),
- do_set_trace_patterns_2(Rest,Flags,MoreReplies);
- {error,Reason} ->
- do_set_trace_patterns_2(Rest,Flags,[{error,Reason}|Replies])
- end;
- error -> % Bad pattern parameters.
- do_set_trace_patterns_2(Rest,
- Flags,
- [{error,{bad_trace_args,{M,F,Arity,MS}}}|Replies])
- end;
+ do_set_trace_patterns_2([{{void,M},F,Arity,MS,Opts}|Rest],Flags,Replies);
do_set_trace_patterns_2([{{Dir,M},F,Arity,MS,Opts}|Rest],Flags,Replies)
when is_list(Dir),is_list(M) ->
- case check_pattern_parameters(void,F,Arity,MS) of % We don't want to repeat bad params.
- ok ->
+ case check_pattern_parameters('_',F,Arity,MS) of % We don't want to repeat bad params.
+ true ->
case inviso_rt_lib:expand_regexp(Dir,M,Opts) of % Get a list of real modulnames.
Mods when is_list(Mods) ->
MoreReplies=
@@ -1475,7 +1466,7 @@ do_set_trace_patterns_2([{{Dir,M},F,Arity,MS,Opts}|Rest],Flags,Replies)
{error,Reason} ->
do_set_trace_patterns_2(Rest,Flags,[{error,Reason}|Replies])
end;
- error -> % Bad pattern parameters.
+ false -> % Bad pattern parameters.
do_set_trace_patterns_2(Rest,
Flags,
[{error,{bad_trace_args,{M,F,Arity,MS}}}|Replies])
@@ -2174,21 +2165,20 @@ check_flags_2([Faulty|_],_Flags) -> {error,{bad_flag,Faulty}}.
%% the function is to avoid to get multiple error return values in the return
%% list for a pattern used together with a regexp expanded module name.
check_pattern_parameters(Mod,Func,Arity,MS) ->
- if
- (Mod=='_') and (Func=='_') and (Arity=='_') and
- (is_list(MS) or (MS==true) or (MS==false)) ->
- ok;
- (is_atom(Mod) and (Mod/='_')) and (Func=='_') and (Arity=='_') and
- (is_list(MS) or (MS==true) or (MS==false)) ->
- ok;
- (is_atom(Mod) and (Mod/='_')) and
- (is_atom(Func) and (Func/='_')) and
- ((Arity=='_') or is_integer(Arity)) and
- (is_list(MS) or (MS==true) or (MS==false)) ->
- ok;
- true ->
- error
- end.
+ MSresult = check_MS(MS),
+ MFAresult = check_MFA(Mod,Func,Arity),
+ MFAresult and MSresult.
+
+check_MS(MS) when is_list(MS) -> true;
+check_MS(true) -> true;
+check_MS(false) -> true.
+
+check_MFA('_','_','_') -> true;
+check_MFA(Mod,'_','_') when is_atom(Mod) -> true;
+check_MFA(Mod,'_',A) when is_atom(Mod), is_integer(A) -> false;
+check_MFA(Mod,F,'_') when is_atom(Mod), is_atom(F) -> true;
+check_MFA(Mod,F,A) when is_atom(Mod), is_atom(F), is_integer(A) -> true.
+
%% -----------------------------------------------------------------------------
%% Help function finding out if Mod is loaded, and if not, if it can successfully
diff --git a/lib/runtime_tools/test/Makefile b/lib/runtime_tools/test/Makefile
index 873d395277..cfaf420d65 100644
--- a/lib/runtime_tools/test/Makefile
+++ b/lib/runtime_tools/test/Makefile
@@ -57,9 +57,9 @@ release_spec: opt
release_tests_spec: make_emakefile
$(INSTALL_DIR) $(RELSYSDIR)
- $(INSTALL_DATA) runtime_tools.spec $(ERL_FILES) $(RELSYSDIR)
+ $(INSTALL_DATA) runtime_tools.spec runtime_tools.cover $(ERL_FILES) $(RELSYSDIR)
$(INSTALL_DATA) $(EMAKEFILE) runtime_tools.cover $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
@tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
release_docs_spec:
diff --git a/lib/runtime_tools/test/dbg_SUITE.erl b/lib/runtime_tools/test/dbg_SUITE.erl
index ff96af5e86..bd908c1f3a 100644
--- a/lib/runtime_tools/test/dbg_SUITE.erl
+++ b/lib/runtime_tools/test/dbg_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2011. 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
@@ -19,30 +19,51 @@
-module(dbg_SUITE).
%% Test functions
--export([all/1, big/1, tiny/1, simple/1, message/1, distributed/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ big/1, tiny/1, simple/1, message/1, distributed/1,
ip_port/1, file_port/1, file_port2/1, file_port_schedfix/1,
ip_port_busy/1, wrap_port/1, wrap_port_time/1,
with_seq_trace/1, dead_suspend/1, local_trace/1,
saved_patterns/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
-export([tracee1/1, tracee2/1]).
-export([dummy/0, exported/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(default_timeout, ?t:minutes(1)).
init_per_testcase(_Case, Config) ->
?line Dog=test_server:timetrap(?default_timeout),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-all(suite) -> [big, tiny, simple, message, distributed,
- ip_port, file_port, file_port2, file_port_schedfix,
- ip_port_busy, wrap_port, wrap_port_time,
- with_seq_trace, dead_suspend, local_trace, saved_patterns].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [big, tiny, simple, message, distributed, ip_port,
+ file_port, file_port2, file_port_schedfix, ip_port_busy,
+ wrap_port, wrap_port_time, with_seq_trace, dead_suspend,
+ local_trace, saved_patterns].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
big(suite) -> [];
big(doc) -> ["Rudimentary interface test"];
diff --git a/lib/runtime_tools/test/erts_alloc_config_SUITE.erl b/lib/runtime_tools/test/erts_alloc_config_SUITE.erl
index 32483dbe73..8ea04e1767 100644
--- a/lib/runtime_tools/test/erts_alloc_config_SUITE.erl
+++ b/lib/runtime_tools/test/erts_alloc_config_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2011. 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
@@ -21,10 +21,12 @@
%-define(line_trace, 1).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%-compile(export_all).
--export([all/1, init_per_testcase/2, fin_per_testcase/2]).
+-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]).
%% Testcases
-export([basic/1]).
@@ -34,15 +36,33 @@
-define(DEFAULT_TIMEOUT, ?t:minutes(2)).
-all(doc) -> [];
-all(suite) -> [basic].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [basic].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(Case, Config) when is_list(Config) ->
[{testcase, Case},
{watchdog, ?t:timetrap(?DEFAULT_TIMEOUT)},
{erl_flags_env, save_env()} | Config].
-fin_per_testcase(_Case, Config) when is_list(Config) ->
+end_per_testcase(_Case, Config) when is_list(Config) ->
?t:timetrap_cancel(?config(watchdog, Config)),
restore_env(?config(erl_flags_env, Config)),
ok.
diff --git a/lib/runtime_tools/test/inviso_SUITE.erl b/lib/runtime_tools/test/inviso_SUITE.erl
index 1c5c887b62..3ae8d34dd6 100644
--- a/lib/runtime_tools/test/inviso_SUITE.erl
+++ b/lib/runtime_tools/test/inviso_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2011. 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
@@ -29,49 +29,40 @@
-module(inviso_SUITE).
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include_lib("kernel/include/file.hrl").
-define(l,?line).
-all(suite) ->
- [
- basic_dist_trace_1,
- basic_dist_trace_2,
- basic_dist_trace_3,
- basic_dist_trace_ti_1,
- basic_dist_trace_ti_2,
- basic_dist_trace_ti_3,
- suspend_dist_trace_ti_1,
- suspend_dist_trace_ti_2,
- meta_cleanfunc_dist_1,
- basic_handlerfun_dist_1,
- delete_log_dist_1,
- autostart_dist_1,
- autostart_dist_2,
- autostart_dist_3,
- running_alone_dist_1,
- running_alone_dist_2,
- running_alone_dist_3,
- running_alone_dist_4,
- running_alone_dist_5,
- overload_dist_1,
- overload_dist_2,
- overload_dist_3,
- overload_dist_4,
- overload_dist_5,
- subscribe_dist_1,
- lfm_trace_dist_1,
- lfm_trace_ti_dist_2,
- handle_logfile_sort_wrapset,
- fetch_log_dist_trace_1,
- fetch_log_dist_trace_2,
- fetch_log_dist_trace_3,
- fetch_log_dist_error_1,
- fetch_log_dist_error_2,
- expand_regexp_dist_1,
- only_loaded_dist_1
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [basic_dist_trace_1, basic_dist_trace_2,
+ basic_dist_trace_3, basic_dist_trace_ti_1,
+ basic_dist_trace_ti_2, basic_dist_trace_ti_3,
+ suspend_dist_trace_ti_1, suspend_dist_trace_ti_2,
+ meta_cleanfunc_dist_1, basic_handlerfun_dist_1,
+ delete_log_dist_1, autostart_dist_1, autostart_dist_2,
+ autostart_dist_3, running_alone_dist_1,
+ running_alone_dist_2, running_alone_dist_3,
+ running_alone_dist_4, running_alone_dist_5,
+ overload_dist_1, overload_dist_2, overload_dist_3,
+ overload_dist_4, overload_dist_5, subscribe_dist_1,
+ lfm_trace_dist_1, lfm_trace_ti_dist_2,
+ handle_logfile_sort_wrapset, fetch_log_dist_trace_1,
+ fetch_log_dist_trace_2, fetch_log_dist_trace_3,
+ fetch_log_dist_error_1, fetch_log_dist_error_2,
+ expand_regexp_dist_1, only_loaded_dist_1].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_suite(Config) ->
@@ -133,7 +124,7 @@ init_per_testcase(_Case,Config) ->
insert_timetraphandle_config(TH,NewConfig2).
%% -----------------------------------------------------------------------------
-fin_per_testcase(Case,Config) ->
+end_per_testcase(Case,Config) ->
?l test_server:stop_node(get_remotenode_config(inviso1,Config)),
?l test_server:stop_node(get_remotenode_config(inviso2,Config)),
@@ -142,14 +133,14 @@ fin_per_testcase(Case,Config) ->
true;
Pid when is_pid(Pid) -> % But if it exists...
exit(Pid,kill), % Remove it!
- io:format("Had to kill the control component in fin_per_testcase,~p.~n",[Case])
+ io:format("Had to kill the control component in end_per_testcase,~p.~n",[Case])
end,
case whereis(inviso_rt) of
undefined -> % Should not exist.
true;
Pid2 when is_pid(Pid2) -> % But if it exists...
exit(Pid2,kill), % Remove it!
- io:format("Had to kill local runtime component in fin_per_testcase,~p.~n",[Case])
+ io:format("Had to kill local runtime component in end_per_testcase,~p.~n",[Case])
end,
?l process_killer([inviso_test_proc,
inviso_tab_proc,
diff --git a/lib/runtime_tools/test/runtime_tools.cover b/lib/runtime_tools/test/runtime_tools.cover
index 2d62ebe6ac..ef850bc377 100644
--- a/lib/runtime_tools/test/runtime_tools.cover
+++ b/lib/runtime_tools/test/runtime_tools.cover
@@ -1 +1,3 @@
-{exclude,[observer_backend]}.
+{incl_app,runtime_tools,details}.
+
+{excl_mods, runtime_tools, [observer_backend]}.
diff --git a/lib/runtime_tools/test/runtime_tools.spec b/lib/runtime_tools/test/runtime_tools.spec
index a60a533ce2..0a24232be8 100644
--- a/lib/runtime_tools/test/runtime_tools.spec
+++ b/lib/runtime_tools/test/runtime_tools.spec
@@ -1 +1 @@
-{topcase, {dir, "../runtime_tools_test"}}.
+{suites,"../runtime_tools_test",all}.
diff --git a/lib/runtime_tools/test/runtime_tools_SUITE.erl b/lib/runtime_tools/test/runtime_tools_SUITE.erl
index 84e255e126..b26f3dd881 100644
--- a/lib/runtime_tools/test/runtime_tools_SUITE.erl
+++ b/lib/runtime_tools/test/runtime_tools_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2011. 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
@@ -17,10 +17,11 @@
%% %CopyrightEnd%
%%
-module(runtime_tools_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% Test server specific exports
--export([all/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([init_per_testcase/2, end_per_testcase/2]).
%% Test cases
@@ -38,9 +39,27 @@ end_per_testcase(_Case, Config) ->
?t:timetrap_cancel(Dog),
ok.
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[app_file].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
app_file(suite) ->
[];
app_file(doc) ->
diff --git a/lib/runtime_tools/vsn.mk b/lib/runtime_tools/vsn.mk
index 8be4ae613b..6ed98f697e 100644
--- a/lib/runtime_tools/vsn.mk
+++ b/lib/runtime_tools/vsn.mk
@@ -1 +1 @@
-RUNTIME_TOOLS_VSN = 1.8.4.1
+RUNTIME_TOOLS_VSN = 1.8.5
diff --git a/lib/sasl/doc/src/alarm_handler.xml b/lib/sasl/doc/src/alarm_handler.xml
index e4501ce5f0..87be6d2a9e 100644
--- a/lib/sasl/doc/src/alarm_handler.xml
+++ b/lib/sasl/doc/src/alarm_handler.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1996</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/sasl/doc/src/appup.xml b/lib/sasl/doc/src/appup.xml
index 5182889710..89bcf23b5e 100644
--- a/lib/sasl/doc/src/appup.xml
+++ b/lib/sasl/doc/src/appup.xml
@@ -4,7 +4,7 @@
<fileref>
<header>
<copyright>
- <year>1997</year><year>2009</year>
+ <year>1997</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -174,11 +174,19 @@
<c>remove</c> and <c>purge</c>.</p>
<pre>
{add_application, Application}
+{add_application, Application, Type}
Application = atom()
+ Type = permanent | transient | temporary | load | none
</pre>
<p>Adding an application means that the modules defined by
the <c>modules</c> key in the <c>.app</c> file are loaded using
- <c>add_module</c>, then the application is started.</p>
+ <c>add_module</c>.</p>
+ <p><c>Type</c> defaults to <c>permanent</c> and specifies the start type
+ of the application. If <c>Type = permanent | transient | temporary</c>,
+ the application will be loaded and started in the corresponding way,
+ see <c>application(3)</c>. If <c>Type = load</c>, the application will
+ only be loaded. If <c>Type = none</c>, the application will be neither
+ loaded nor started, although the code for its modules will be loaded.</p>
<pre>
{remove_application, Application}
Application = atom()
diff --git a/lib/sasl/doc/src/notes.xml b/lib/sasl/doc/src/notes.xml
index e528af2522..7941e371a0 100644
--- a/lib/sasl/doc/src/notes.xml
+++ b/lib/sasl/doc/src/notes.xml
@@ -30,6 +30,39 @@
</header>
<p>This document describes the changes made to the SASL application.</p>
+<section><title>SASL 2.1.9.3</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Honor start type in .rel files when building relup files</p>
+ <p>
+ Previously, relup file always included an
+ application:start(Application, permanent) apply
+ instruction for every application that appear in the
+ UpTo/DowFrom release file, whatever their start type in
+ the release file.</p>
+ <p>
+ The new implementation fixes this bug by honoring the
+ start type according to the rel(5) format. If the start
+ type is none, no apply line is included in the relup. If
+ the start type is load, the relup includes instruction to
+ only load the application. Otherwise, the relup includes
+ an instruction to start the application to the according
+ type.</p>
+ <p>
+ The fix is implemented by adding a new parameter to the
+ add_application high level appup instruction. This new
+ parameter is documented in appup(5).</p>
+ <p>
+ Own Id: OTP-9097</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>SASL 2.1.9.2</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/sasl/doc/src/part_notes_history.xml b/lib/sasl/doc/src/part_notes_history.xml
index 2726d73684..d8d48bfd46 100644
--- a/lib/sasl/doc/src/part_notes_history.xml
+++ b/lib/sasl/doc/src/part_notes_history.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2006</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/sasl/doc/src/rel.xml b/lib/sasl/doc/src/rel.xml
index 108f5e7f3e..470adf3c03 100644
--- a/lib/sasl/doc/src/rel.xml
+++ b/lib/sasl/doc/src/rel.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1997</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/sasl/doc/src/relup.xml b/lib/sasl/doc/src/relup.xml
index f7d9fcdd42..7aba7e58ba 100644
--- a/lib/sasl/doc/src/relup.xml
+++ b/lib/sasl/doc/src/relup.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1997</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/sasl/doc/src/sasl_app.xml b/lib/sasl/doc/src/sasl_app.xml
index a7fecfc440..446baccb08 100644
--- a/lib/sasl/doc/src/sasl_app.xml
+++ b/lib/sasl/doc/src/sasl_app.xml
@@ -4,7 +4,7 @@
<appref>
<header>
<copyright>
- <year>1996</year><year>2009</year>
+ <year>1996</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -67,6 +67,11 @@
<p>This error logger writes <em>all</em> events sent to
the error logger to disk. It installs the <c>log_mf_h</c>
event handler in the <c>error_logger</c> process.</p>
+ <p>To activate this event handler, the following three sasl
+ configuration parameters must be set:
+ <c>error_logger_mf_dir</c>, <c>error_logger_mf_maxbytes</c>
+ and <c>error_logger_mf_maxfiles</c>. See below for more
+ information about the configuration parameters.</p>
</item>
</taglist>
</section>
diff --git a/lib/sasl/doc/src/script.xml b/lib/sasl/doc/src/script.xml
index 6bac07d106..17cc64f08e 100644
--- a/lib/sasl/doc/src/script.xml
+++ b/lib/sasl/doc/src/script.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1997</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/sasl/doc/src/systools.xml b/lib/sasl/doc/src/systools.xml
index 296553bb12..883c9c372b 100644
--- a/lib/sasl/doc/src/systools.xml
+++ b/lib/sasl/doc/src/systools.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1996</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
@@ -130,7 +130,7 @@
<fsummary>Generate a boot script <c>.script/.boot</c>.</fsummary>
<type>
<v>Name = string()</v>
- <v>Opt = no_module_tests | {path,[Dir]} | local | {variables,[Var]} | exref | {exref,[App]}] | silent | {outdir,Dir}</v>
+ <v>Opt = src_tests | {path,[Dir]} | local | {variables,[Var]} | exref | {exref,[App]}] | silent | {outdir,Dir}</v>
<v>&nbsp;Dir = string()</v>
<v>&nbsp;Var = {VarName,Prefix}</v>
<v>&nbsp;&nbsp;VarName = Prefix = string()</v>
@@ -174,15 +174,13 @@
the applications.</p>
</item>
<item>
- <p>There should no duplicated modules, that is, modules with
+ <p>There should be no duplicated modules, that is, modules with
the same name but belonging to different applications.</p>
</item>
<item>
- <p>A warning is issued if the source code for a module is
- missing or newer than the object code. <br></br>
-
- If the <c>no_module_tests</c> option is specified, this
- check is omitted.</p>
+ <p>If the <c>src_tests</c> option is specified, a
+ warning is issued if the source code for a module is
+ missing or newer than the object code.</p>
</item>
</list>
<p>The applications are sorted according to the dependencies
@@ -242,7 +240,7 @@
<fsummary>Create a release package.</fsummary>
<type>
<v>Name = string()</v>
- <v>Opt = {dirs,[IncDir]} | {path,[Dir]} | {variables,[Var]} | {var_tar,VarTar} | {erts,Dir} | no_module_tests | exref | {exref,[App]} | silent | {outdir,Dir}</v>
+ <v>Opt = {dirs,[IncDir]} | {path,[Dir]} | {variables,[Var]} | {var_tar,VarTar} | {erts,Dir} | src_tests | exref | {exref,[App]} | silent | {outdir,Dir}</v>
<v>&nbsp;Dir = string()</v>
<v>&nbsp;IncDir = src | include | atom()</v>
<v>&nbsp;Var = {VarName,PreFix}</v>
@@ -330,7 +328,7 @@ myapp-1/ebin/myapp.app
system <c>{erts,Dir}</c> is copied to <c>erts-ErtsVsn/bin</c>.</p>
<p>All checks performed with the <c>make_script</c> function
are performed before the release package is created. The
- <c>no_module_tests</c> and <c>exref</c> options are also
+ <c>src_tests</c> and <c>exref</c> options are also
valid here.</p>
<p>The return value and the handling of errors and warnings
are the same as described for <c>make_script</c> above.</p>
diff --git a/lib/sasl/src/rb.erl b/lib/sasl/src/rb.erl
index 38e486b7a7..13753565d8 100644
--- a/lib/sasl/src/rb.erl
+++ b/lib/sasl/src/rb.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -169,7 +169,7 @@ print_filters() ->
print_dates() ->
io:format(" - {StartDate, EndDate}~n"),
- io:format(" StartDate = EndDate = {{Y-M-D},{H,M,S}} ~n"),
+ io:format(" StartDate = EndDate = {{Y,M,D},{H,M,S}} ~n"),
io:format(" prints the reports with date between StartDate and EndDate~n"),
io:format(" - {StartDate, from}~n"),
io:format(" prints the reports with date greater than StartDate~n"),
diff --git a/lib/sasl/src/release_handler.erl b/lib/sasl/src/release_handler.erl
index 4c43277848..b60aa847df 100644
--- a/lib/sasl/src/release_handler.erl
+++ b/lib/sasl/src/release_handler.erl
@@ -791,7 +791,7 @@ check_rel(Root, RelFile, Masters) ->
check_rel(Root, RelFile, LibDirs, Masters) ->
case consult(RelFile, Masters) of
{ok, [RelData]} ->
- check_rel_data(RelData, Root, LibDirs);
+ check_rel_data(RelData, Root, LibDirs, Masters);
{ok, _} ->
throw({error, {bad_rel_file, RelFile}});
{error, Reason} when is_tuple(Reason) ->
@@ -800,7 +800,8 @@ check_rel(Root, RelFile, LibDirs, Masters) ->
throw({error, {FileError, RelFile}})
end.
-check_rel_data({release, {Name, Vsn}, {erts, EVsn}, Libs}, Root, LibDirs) ->
+check_rel_data({release, {Name, Vsn}, {erts, EVsn}, Libs}, Root, LibDirs,
+ Masters) ->
Libs2 =
lists:map(fun(LibSpec) ->
Lib = element(1, LibSpec),
@@ -810,7 +811,7 @@ check_rel_data({release, {Name, Vsn}, {erts, EVsn}, Libs}, Root, LibDirs) ->
case lists:keysearch(Lib, 1, LibDirs) of
{value, {_Lib, _Vsn, Dir}} ->
Path = filename:join(Dir,LibName),
- check_path(Path),
+ check_path(Path, Masters),
Path;
_ ->
filename:join([Root, "lib", LibName])
@@ -820,19 +821,34 @@ check_rel_data({release, {Name, Vsn}, {erts, EVsn}, Libs}, Root, LibDirs) ->
Libs),
#release{name = Name, vsn = Vsn, erts_vsn = EVsn,
libs = Libs2, status = unpacking};
-check_rel_data(RelData, _Root, _LibDirs) ->
+check_rel_data(RelData, _Root, _LibDirs, _Masters) ->
throw({error, {bad_rel_data, RelData}}).
check_path(Path) ->
- case file:read_file_info(Path) of
- {ok, Info} when Info#file_info.type==directory ->
- ok;
- {ok, _Info} ->
- throw({error, {not_a_directory, Path}});
- {error, _Reason} ->
- throw({error, {no_such_directory, Path}})
- end.
-
+ check_path_response(Path, file:read_file_info(Path)).
+check_path(Path, false) -> check_path(Path);
+check_path(Path, Masters) -> check_path_master(Masters, Path).
+
+%%-----------------------------------------------------------------
+%% check_path at any master node.
+%% If the path does not exist or is not a directory
+%% at one node it should not exist at any other node either.
+%%-----------------------------------------------------------------
+check_path_master([Master|Ms], Path) ->
+ case rpc:call(Master, file, read_file_info, [Path]) of
+ {badrpc, _} -> consult_master(Ms, Path);
+ Res -> check_path_response(Path, Res)
+ end;
+check_path_master([], _Path) ->
+ {error, no_master}.
+
+check_path_response(_Path, {ok, Info}) when Info#file_info.type==directory ->
+ ok;
+check_path_response(Path, {ok, _Info}) ->
+ throw({error, {not_a_directory, Path}});
+check_path_response(Path, {error, _Reason}) ->
+ throw({error, {no_such_directory, Path}}).
+
do_check_install_release(RelDir, Vsn, Releases, Masters) ->
case lists:keysearch(Vsn, #release.vsn, Releases) of
{value, #release{status = current}} ->
diff --git a/lib/sasl/src/release_handler_1.erl b/lib/sasl/src/release_handler_1.erl
index 9c0edf4e99..8d050fb7b0 100644
--- a/lib/sasl/src/release_handler_1.erl
+++ b/lib/sasl/src/release_handler_1.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -20,7 +20,7 @@
%% External exports
-export([eval_script/3, eval_script/4, check_script/2]).
--export([get_vsn/1]). %% exported because used in a test case
+-export([get_current_vsn/1]). %% exported because used in a test case
-record(eval_state, {bins = [], stopped = [], suspended = [], apps = [],
libdirs, unpurged = [], vsns = [], newlibs = [],
@@ -223,7 +223,7 @@ eval({load_object_code, {Lib, LibVsn, Modules}}, EvalState) ->
FName = filename:join(Ebin, File),
case erl_prim_loader:get_file(FName) of
{ok, Bin, FName2} ->
- NVsns = add_new_vsn(Mod, FName2, Vsns),
+ NVsns = add_new_vsn(Mod, Bin, Vsns),
{[{Mod, Bin, FName2} | Bins],NVsns};
error ->
throw({error, {no_such_file,FName}})
@@ -609,17 +609,17 @@ sync_nodes(Id, Nodes) ->
add_old_vsn(Mod, Vsns) ->
case lists:keysearch(Mod, 1, Vsns) of
{value, {Mod, undefined, NewVsn}} ->
- OldVsn = get_vsn(code:which(Mod)),
+ OldVsn = get_current_vsn(Mod),
lists:keyreplace(Mod, 1, Vsns, {Mod, OldVsn, NewVsn});
{value, {Mod, _OldVsn, _NewVsn}} ->
Vsns;
false ->
- OldVsn = get_vsn(code:which(Mod)),
+ OldVsn = get_current_vsn(Mod),
[{Mod, OldVsn, undefined} | Vsns]
end.
-add_new_vsn(Mod, File, Vsns) ->
- NewVsn = get_vsn(File),
+add_new_vsn(Mod, Bin, Vsns) ->
+ NewVsn = get_vsn(Bin),
case lists:keysearch(Mod, 1, Vsns) of
{value, {Mod, OldVsn, undefined}} ->
lists:keyreplace(Mod, 1, Vsns, {Mod, OldVsn, NewVsn});
@@ -627,17 +627,35 @@ add_new_vsn(Mod, File, Vsns) ->
[{Mod, undefined, NewVsn} | Vsns]
end.
-
+%%-----------------------------------------------------------------
+%% Func: get_current_vsn/1
+%% Args: Mod = atom()
+%% Purpose: This function returns the equivalent of
+%% beam_lib:version(code:which(Mod)), but it will also handle the
+%% case when using erl_prim_loader loader different from 'efile'.
+%% The reason for not using the Binary from the 'bins' or the
+%% version directly from the 'vsns' state field is that these are
+%% updated already by load_object_code, and this function is called
+%% from load and remove.
+%% Returns: Vsn = term()
+%%-----------------------------------------------------------------
+get_current_vsn(Mod) ->
+ File = code:which(Mod),
+ case erl_prim_loader:get_file(File) of
+ {ok, Bin, _File2} ->
+ get_vsn(Bin);
+ error ->
+ throw({error, {no_such_file, File}})
+ end.
%%-----------------------------------------------------------------
%% Func: get_vsn/1
-%% Args: File = string()
+%% Args: Bin = binary()
%% Purpose: Finds the version attribute of a module.
-%% Returns: Vsn
-%% Vsn = term()
+%% Returns: Vsn = term()
%%-----------------------------------------------------------------
-get_vsn(File) ->
- {ok, {_Mod, Vsn}} = beam_lib:version(File),
+get_vsn(Bin) ->
+ {ok, {_Mod, Vsn}} = beam_lib:version(Bin),
case misc_supp:is_string(Vsn) of
true ->
Vsn;
diff --git a/lib/sasl/src/sasl.erl b/lib/sasl/src/sasl.erl
index d1babaffff..aed5f0da1f 100644
--- a/lib/sasl/src/sasl.erl
+++ b/lib/sasl/src/sasl.erl
@@ -81,27 +81,38 @@ get_mf() ->
Dir = get_mf_dir(),
MaxB = get_mf_maxb(),
MaxF = get_mf_maxf(),
- {Dir, MaxB, MaxF}.
+ case {Dir, MaxB, MaxF} of
+ {undefined,undefined,undefined} = R ->
+ R;
+ {undefined,_,_} ->
+ exit({missing_config, {sasl, error_logger_mf_dir}});
+ {_,undefined,_} ->
+ exit({missing_config, {sasl, error_logger_mf_maxbytes}});
+ {_,_,undefined} ->
+ exit({missing_config, {sasl, error_logger_mf_maxfiles}});
+ R ->
+ R
+ end.
get_mf_dir() ->
case application:get_env(sasl, error_logger_mf_dir) of
- {ok, false} -> throw(undefined);
+ {ok, false} -> undefined;
{ok, Dir} when is_list(Dir) -> Dir;
- undefined -> throw(undefined);
+ undefined -> undefined;
{ok, Bad} -> exit({bad_config, {sasl, {error_logger_mf_dir, Bad}}})
end.
get_mf_maxb() ->
case application:get_env(sasl, error_logger_mf_maxbytes) of
{ok, MaxB} when is_integer(MaxB) -> MaxB;
- undefined -> throw(undefined);
+ undefined -> undefined;
{ok, Bad} -> exit({bad_config, {sasl, {error_logger_mf_maxbytes, Bad}}})
end.
get_mf_maxf() ->
case application:get_env(sasl, error_logger_mf_maxfiles) of
{ok, MaxF} when is_integer(MaxF), MaxF > 0, MaxF < 256 -> MaxF;
- undefined -> throw(undefined);
+ undefined -> undefined;
{ok, Bad} -> exit({bad_config, {sasl, {error_logger_mf_maxfiles, Bad}}})
end.
diff --git a/lib/sasl/src/systools_make.erl b/lib/sasl/src/systools_make.erl
index 20a142c763..7489ee58d2 100644
--- a/lib/sasl/src/systools_make.erl
+++ b/lib/sasl/src/systools_make.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -50,7 +50,7 @@
%% the applications are found.
%%
%% New options: {path,Path} can contain wildcards
-%% no_module_tests
+%% src_tests
%% {variables,[{Name,AbsString}]}
%% {machine, jam | beam | vee}
%% exref | {exref, [AppName]}
@@ -82,8 +82,7 @@ make_script(RelName, Output, Flags) when is_list(RelName),
Path0 = get_path(Flags),
Path1 = mk_path(Path0), % expand wildcards etc.
Path = make_set(Path1 ++ code:get_path()),
- ModTestP = {not member(no_module_tests, Flags),
- xref_p(Flags)},
+ ModTestP = {member(src_tests, Flags),xref_p(Flags)},
case get_release(RelName, Path, ModTestP, machine(Flags)) of
{ok, Release, Appls, Warnings} ->
case generate_script(Output,Release,Appls,Flags) of
@@ -155,7 +154,7 @@ return({error,Mod,Error},_,Flags) ->
%% should be included in the release package and there it can be found.
%%
%% New options: {path,Path} can contain wildcards
-%% no_module_tests
+%% src_tests
%% exref | {exref, [AppName]}
%% {variables,[{Name,AbsString}]}
%% {machine, jam | beam | vee}
@@ -190,8 +189,7 @@ make_tar(RelName, Flags) when is_list(RelName), is_list(Flags) ->
Path0 = get_path(Flags),
Path1 = mk_path(Path0),
Path = make_set(Path1 ++ code:get_path()),
- ModTestP = {not member(no_module_tests, Flags),
- xref_p(Flags)},
+ ModTestP = {member(src_tests, Flags),xref_p(Flags)},
case get_release(RelName, Path, ModTestP, machine(Flags)) of
{ok, Release, Appls, Warnings} ->
case catch mk_tar(RelName, Release, Appls, Flags, Path1) of
@@ -218,7 +216,7 @@ make_tar(RelName, Flags) ->
%% {ok, #release, [{{Name,Vsn},#application}], Warnings} | {error, What}
get_release(File, Path) ->
- get_release(File, Path, true, false).
+ get_release(File, Path, {false,false}, false).
get_release(File, Path, ModTestP) ->
get_release(File, Path, ModTestP, false).
@@ -771,36 +769,40 @@ get_mod_vsn([]) ->
%% Use the module extension of the running machine as extension for
%% the checked modules.
-check_mods(Modules, Appls, Path, {true, XrefP}, Machine) ->
- Ext = objfile_extension(Machine),
- IncPath = create_include_path(Appls, Path),
- Res = append(map(fun(ModT) ->
- {Mod,_Vsn,App,_,Dir} = ModT,
- case check_mod(Mod,App,Dir,Ext,IncPath) of
- ok ->
- [];
- {error, Error} ->
- [{error,{Error, ModT}}];
- {warning, Warn} ->
- [{warning,{Warn,ModT}}]
- end
- end,
- Modules)),
- Res2 = Res ++ check_xref(Appls, Path, XrefP),
+check_mods(Modules, Appls, Path, {SrcTestP, XrefP}, Machine) ->
+ SrcTestRes = check_src(Modules, Appls, Path, SrcTestP, Machine),
+ XrefRes = check_xref(Appls, Path, XrefP),
+ Res = SrcTestRes ++ XrefRes,
case filter(fun({error, _}) -> true;
(_) -> false
end,
- Res2) of
+ Res) of
[] ->
{ok, filter(fun({warning, _}) -> true;
(_) -> false
end,
- Res2)};
+ Res)};
Errors ->
{error, Errors}
- end;
-check_mods(_, _, _, _, _) ->
- {ok, []}.
+ end.
+
+check_src(Modules, Appls, Path, true, Machine) ->
+ Ext = objfile_extension(Machine),
+ IncPath = create_include_path(Appls, Path),
+ append(map(fun(ModT) ->
+ {Mod,_Vsn,App,_,Dir} = ModT,
+ case check_mod(Mod,App,Dir,Ext,IncPath) of
+ ok ->
+ [];
+ {error, Error} ->
+ [{error,{Error, ModT}}];
+ {warning, Warn} ->
+ [{warning,{Warn,ModT}}]
+ end
+ end,
+ Modules));
+check_src(_, _, _, _, _) ->
+ [].
check_xref(_Appls, _Path, false) ->
[];
@@ -1853,11 +1855,11 @@ cas([silent | Args], {Path, _Sil, Loc, Test, Var, Mach,
cas([local | Args], {Path, Sil, _Loc, Test, Var, Mach,
Xref, XrefApps, X}) ->
cas(Args, {Path, Sil, local, Test, Var, Mach, Xref, XrefApps, X});
-%%% no_module_tests ----------------------------------------------------
-cas([no_module_tests | Args], {Path, Sil, Loc, _Test, Var, Mach,
- Xref, XrefApps, X}) ->
+%%% src_tests -------------------------------------------------------
+cas([src_tests | Args], {Path, Sil, Loc, _Test, Var, Mach,
+ Xref, XrefApps, X}) ->
cas(Args,
- {Path, Sil, Loc, no_module_tests, Var, Mach, Xref, XrefApps,X});
+ {Path, Sil, Loc, src_tests, Var, Mach, Xref, XrefApps,X});
%%% variables ----------------------------------------------------------
cas([{variables, V} | Args], {Path, Sil, Loc, Test, Var, Mach,
Xref, XrefApps, X}) when is_list(V) ->
@@ -1896,6 +1898,10 @@ cas([{outdir, Dir} | Args], {Path, Sil, Loc, Test, Var, Mach,
cas([otp_build | Args], {Path, Sil, Loc, Test, Var, Mach,
Xref, XrefApps, X}) ->
cas(Args, {Path, Sil, Loc, Test, Var, Mach, Xref, XrefApps, X});
+%%% no_module_tests (kept for backwards compatibility, but ignored) ----
+cas([no_module_tests | Args], {Path, Sil, Loc, Test, Var, Mach,
+ Xref, XrefApps, X}) ->
+ cas(Args, {Path, Sil, Loc, Test, Var, Mach, Xref, XrefApps,X});
%%% ERROR --------------------------------------------------------------
cas([Y | Args], {Path, Sil, Loc, Test, Var, Mach, Xref, XrefApps, X}) ->
cas(Args, {Path, Sil, Loc, Test, Var, Mach, Xref, XrefApps,X++[Y]}).
@@ -1935,10 +1941,10 @@ cat([{dirs, D} | Args], {Path, Sil, Dirs, Erts, Test,
cat([{erts, E} | Args], {Path, Sil, Dirs, _Erts, Test,
Var, VarTar, Mach, Xref, XrefApps, X}) when is_list(E)->
cat(Args, {Path, Sil, Dirs, E, Test, Var, VarTar, Mach, Xref, XrefApps, X});
-%%% no_module_tests ----------------------------------------------------
-cat([no_module_tests | Args], {Path, Sil, Dirs, Erts, _Test, Var, VarTar, Mach, Xref, XrefApps, X}) ->
- cat(Args, {Path, Sil, Dirs, Erts, no_module_tests, Var, VarTar, Mach,
- Xref, XrefApps, X});
+%%% src_tests ----------------------------------------------------
+cat([src_tests | Args], {Path, Sil, Dirs, Erts, _Test, Var, VarTar, Mach, Xref, XrefApps, X}) ->
+ cat(Args, {Path, Sil, Dirs, Erts, src_tests, Var, VarTar, Mach,
+ Xref, XrefApps, X});
%%% variables ----------------------------------------------------------
cat([{variables, V} | Args], {Path, Sil, Dirs, Erts, Test, Var, VarTar, Mach, Xref, XrefApps, X}) when is_list(V) ->
case check_vars(V) of
@@ -1982,6 +1988,9 @@ cat([{outdir, Dir} | Args], {Path, Sil, Dirs, Erts, Test, Var, VarTar, Mach, Xre
%%% otp_build (secret, not documented) ---------------------------------
cat([otp_build | Args], {Path, Sil, Dirs, Erts, Test, Var, VarTar, Mach, Xref, XrefApps, X}) ->
cat(Args, {Path, Sil, Dirs, Erts, Test, Var, VarTar, Mach, Xref, XrefApps, X});
+%%% no_module_tests (kept for backwards compatibility, but ignored) ----
+cat([no_module_tests | Args], {Path, Sil, Dirs, Erts, Test, Var, VarTar, Mach, Xref, XrefApps, X}) ->
+ cat(Args, {Path, Sil, Dirs, Erts, Test, Var, VarTar, Mach, Xref, XrefApps, X});
%%% ERROR --------------------------------------------------------------
cat([Y | Args], {Path, Sil, Dirs, Erts, Test, Var, VarTar, Mach, Xref, XrefApps, X}) ->
cat(Args, {Path, Sil, Dirs, Erts, Test, Var, VarTar, Mach, Xref, XrefApps, X++[Y]}).
diff --git a/lib/sasl/src/systools_rc.erl b/lib/sasl/src/systools_rc.erl
index 23d1a52b66..daadb79967 100644
--- a/lib/sasl/src/systools_rc.erl
+++ b/lib/sasl/src/systools_rc.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -34,7 +34,7 @@
%% {add_module, Mod, [Mod]}
%% {remove_module, Mod, PrePurge, PostPurge, [Mod]}
%% {restart_application, Appl}
-%% {add_application, Appl}
+%% {add_application, Appl, Type}
%% {remove_application, Appl}
%%
%% Low-level
@@ -109,6 +109,8 @@ expand_script([I|Script]) ->
{delete_module, Mod} ->
[{remove, {Mod, brutal_purge, brutal_purge}},
{purge, [Mod]}];
+ {add_application, Application} ->
+ {add_application, Application, permanent};
_ ->
I
end,
@@ -317,14 +319,18 @@ translate_independent_instrs(Before, After, Appls, PreAppls) ->
translate_application_instrs(Script, Appls, PreAppls) ->
%% io:format("Appls ~n~p~n",[Appls]),
L = lists:map(
- fun({add_application, Appl}) ->
+ fun({add_application, Appl, Type}) ->
case lists:keysearch(Appl, #application.name, Appls) of
{value, Application} ->
Mods =
remove_vsn(Application#application.modules),
+ ApplyL = case Type of
+ none -> [];
+ load -> [{apply, {application, load, [Appl]}}];
+ _ -> [{apply, {application, start, [Appl, Type]}}]
+ end,
[{add_module, M, []} || M <- Mods] ++
- [{apply, {application, start,
- [Appl, permanent]}}];
+ ApplyL;
false ->
throw({error, {no_such_application, Appl}})
end;
@@ -750,8 +756,9 @@ check_op({remove_module, Mod, PrePurge, PostPurge, Mods}) ->
lists:foreach(fun(M) -> check_mod(M) end, Mods);
check_op({remove_application, Appl}) ->
check_appl(Appl);
-check_op({add_application, Appl}) ->
- check_appl(Appl);
+check_op({add_application, Appl, Type}) ->
+ check_appl(Appl),
+ check_start_type(Type);
check_op({restart_application, Appl}) ->
check_appl(Appl);
check_op(restart) -> ok;
@@ -839,6 +846,13 @@ check_node(Node) -> throw({error, {bad_node, Node}}).
check_appl(Appl) when is_atom(Appl) -> ok;
check_appl(Appl) -> throw({error, {bad_application, Appl}}).
+check_start_type(none) -> ok;
+check_start_type(load) -> ok;
+check_start_type(temporary) -> ok;
+check_start_type(transient) -> ok;
+check_start_type(permanent) -> ok;
+check_start_type(T) -> throw({error, {bad_start_type, T}}).
+
check_func(Func) when is_atom(Func) -> ok;
check_func(Func) -> throw({error, {bad_func, Func}}).
diff --git a/lib/sasl/src/systools_relup.erl b/lib/sasl/src/systools_relup.erl
index 177d50be80..ec5486226c 100644
--- a/lib/sasl/src/systools_relup.erl
+++ b/lib/sasl/src/systools_relup.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -179,8 +179,7 @@ check_opts([]) ->
[].
do_mk_relup(TopRelFile, BaseUpRelDcs, BaseDnRelDcs, Path, Opts) ->
- ModTest = false,
- case systools_make:get_release(to_list(TopRelFile), Path, ModTest) of
+ case systools_make:get_release(to_list(TopRelFile), Path) of
%%
%% TopRel = #release
%% NameVsnApps = [{{Name, Vsn}, #application}]
@@ -246,9 +245,8 @@ foreach_baserel_up(TopRel, TopApps, [BaseRelDc|BaseRelDcs], Path, Opts,
{RUs4, Ws4} =
check_for_emulator_restart(TopRel, BaseRel, RUs3, Ws3, Opts),
- ModTest = false,
BaseApps =
- case systools_make:get_release(BaseRelFile, Path, ModTest) of
+ case systools_make:get_release(BaseRelFile, Path) of
{ok, _, NameVsnApps, _Warns} ->
lists:map(fun({_,App}) -> App end, NameVsnApps);
Other1 ->
@@ -283,9 +281,8 @@ foreach_baserel_dn(TopRel, TopApps, [BaseRelDc|BaseRelDcs], Path, Opts,
%%
{RUs1, Ws1} = collect_appup_scripts(dn, TopApps, BaseRel, Ws, []),
- ModTest = false,
{BaseApps, Ws2} =
- case systools_make:get_release(BaseRelFile, Path, ModTest) of
+ case systools_make:get_release(BaseRelFile, Path) of
%%
%% NameVsnApps = [{{Name, Vsn}, #application}]
{ok, _, NameVsnApps, Warns} ->
@@ -370,10 +367,10 @@ collect_appup_scripts(_, [], _, Ws, RUs) -> {RUs, Ws}.
%% ToApps = [#application]
%%
create_add_app_scripts(FromRel, ToRel, RU0s, W0s) ->
- AddedNs = [N || {N, _V, _T} <- ToRel#release.applications,
+ AddedNs = [{N, T} || {N, _V, T} <- ToRel#release.applications,
not lists:keymember(N, 1, FromRel#release.applications)],
%% io:format("Added apps: ~p~n", [AddedNs]),
- RUs = [[{add_application, N}] || N <- AddedNs],
+ RUs = [[{add_application, N, T}] || {N, T} <- AddedNs],
{RUs ++ RU0s, W0s}.
diff --git a/lib/sasl/vsn.mk b/lib/sasl/vsn.mk
index d01a9bc4f1..8112d145dd 100644
--- a/lib/sasl/vsn.mk
+++ b/lib/sasl/vsn.mk
@@ -1 +1 @@
-SASL_VSN = 2.1.9.2
+SASL_VSN = 2.1.9.3
diff --git a/lib/snmp/doc/man1/.gitignore b/lib/snmp/doc/man1/.gitignore
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/snmp/doc/man1/.gitignore
diff --git a/lib/snmp/doc/src/Makefile b/lib/snmp/doc/src/Makefile
index e8d9efb148..35ed63e103 100644
--- a/lib/snmp/doc/src/Makefile
+++ b/lib/snmp/doc/src/Makefile
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2009. All Rights Reserved.
+# Copyright Ericsson AB 1997-2011. 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
@@ -67,12 +67,15 @@ XML_OUTPUT = $(XML_FILES:%.xml=%.latex.xmls_output) \
INFO_FILE = ../../info
+#HTML_REF1_FILES = $(XML_REF1_FILES:%.xml=$(HTMLDIR)/%.html)
HTML_REF3_FILES = $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html)
HTML_REF6_FILES = $(XML_REF6_FILES:%.xml=$(HTMLDIR)/%.html)
HTML_CHAP_FILES = $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html)
-EXTRA_FILES = summary.html.src \
+EXTRA_FILES = \
+ summary.html.src \
$(DEFAULT_HTML_FILES) \
+ $(HTML_REF1_FILES) \
$(HTML_REF3_FILES) \
$(HTML_REF6_FILES) \
$(HTML_CHAP_FILES)
@@ -80,6 +83,7 @@ EXTRA_FILES = summary.html.src \
MAN7DIR = $(DOCDIR)/man7
+MAN1_FILES = $(MAN1DIR)/snmpc.1
MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3)
MAN6_FILES = $(XML_REF6_FILES:%_app.xml=$(MAN6DIR)/%.6)
MAN7_FILES = $(MIB_FILES:$(MIBSDIR)/%.mib=$(MAN7DIR)/%.7)
@@ -95,6 +99,7 @@ else
TEX_FILES_BOOK = \
$(BOOK_FILES:%.xml=%.tex)
TEX_FILES_REF_MAN = \
+ $(XML_REF1_FILES:%.xml=%.tex) \
$(XML_REF3_FILES:%.xml=%.tex) \
$(XML_REF6_FILES:%.xml=%.tex) \
$(XML_APPLICATION_FILES:%.xml=%.tex)
@@ -169,7 +174,7 @@ ps: $(TOP_PS_FILE)
html: $(HTML_FILES) $(TOP_HTML_FILES) gifs
-html2: gifs $(TOP_HTML_FILES) $(HTML_FILES) $(HTML_REF3_FILES) $(HTML_REF6_FILES) $(HTML_CHAP_FILES)
+html2: gifs $(TOP_HTML_FILES) $(HTML_FILES) $(HTML_REF1_FILES) $(HTML_REF3_FILES) $(HTML_REF6_FILES) $(HTML_CHAP_FILES)
clean: clean_tex clean_html clean_man clean_docs
@@ -195,7 +200,9 @@ endif
$(INDEX_TARGET): $(INDEX_SRC) ../../vsn.mk # Create top make file
sed -e 's;%VSN%;$(VSN);' $< > $@ # inserting version number
-man: man3 man6 man7
+man: man1 man3 man6 man7
+
+man1: $(MAN1_FILES)
man3: $(MAN3_FILES)
@@ -213,6 +220,7 @@ clean_pdf:
clean_man:
@echo "cleaning man:"
+ rm -f $(MAN1DIR)/*
rm -f $(MAN3DIR)/*
rm -f $(MAN6DIR)/*
rm -f $(MAN7DIR)/*
@@ -233,6 +241,11 @@ $(MAN7DIR)/%.7: $(MIBSDIR)/%.mib
# ----------------------------------------------------
# Release Target
# ----------------------------------------------------
+
+$(MAN1DIR)/snmpc.1: snmpc_cmd.xml
+ date=`date +"%B %e %Y"`; \
+ xsltproc --output "$@" --stringparam company "Ericsson AB" --stringparam docgen "$(DOCGEN)" --stringparam gendate "$$date" --stringparam appname "$(APPLICATION)" --stringparam appver "$(VSN)" --xinclude -path $(DOCGEN)/priv/docbuilder_dtd -path $(DOCGEN)/priv/dtd_man_entities $(DOCGEN)/priv/xsl/db_man.xsl $<
+
include $(ERL_TOP)/make/otp_release_targets.mk
ifdef DOCSUPPORT
@@ -244,6 +257,8 @@ release_docs_spec: docs
$(INSTALL_DATA) $(HTMLDIR)/* \
$(RELSYSDIR)/doc/html
$(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR)
+ $(INSTALL_DIR) $(RELEASE_PATH)/man/man1
+ $(INSTALL_DATA) $(MAN1DIR)/* $(RELEASE_PATH)/man/man1
$(INSTALL_DIR) $(RELEASE_PATH)/man/man3
$(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3
$(INSTALL_DIR) $(RELEASE_PATH)/man/man6
@@ -269,7 +284,9 @@ release_docs_spec: docs
$(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \
$(RELSYSDIR)/doc/html
$(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR)
- $(INSTALL_DIR) $(RELEASE_PATH)/man/man3
+ $(INSTALL_DIR) $(RELEASE_PATH)/man/man1
+ $(INSTALL_DATA) $(MAN1_FILES) $(RELEASE_PATH)/man/man1
+ $(INSTALL_DIR) $(RELEASE_PATH)/man/man
$(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3
$(INSTALL_DIR) $(RELEASE_PATH)/man/man6
$(INSTALL_DATA) $(MAN6_FILES) $(RELEASE_PATH)/man/man6
@@ -286,6 +303,10 @@ release_spec:
ifdef DOCSUPPORT
info: info_xml info_man info_html
+ @echo "MAN1DIR: $(MAN1DIR)"
+ @echo "MAN3DIR: $(MAN3DIR)"
+ @echo "MAN6DIR: $(MAN6DIR)"
+ @echo "MAN7DIR: $(MAN7DIR)"
else
info: info_xml info_man info_html info_tex
@echo "DVI2PS = $(DVI2PS)"
@@ -297,6 +318,7 @@ endif
info_man:
@echo "man files:"
+ @echo "MAN1_FILES = $(MAN1_FILES)"
@echo "MAN3_FILES = $(MAN3_FILES)"
@echo "MAN6_FILES = $(MAN6_FILES)"
@echo "MAN7_FILES = $(MAN7_FILES)"
@@ -305,6 +327,7 @@ info_man:
info_xml:
@echo "xml files:"
+# @echo "XML_REF1_FILES = $(XML_REF1_FILES)"
@echo "XML_REF3_FILES = $(XML_REF3_FILES)"
@echo "XML_REF6_FILES = $(XML_REF6_FILES)"
@echo "XML_PART_FILES = $(XML_PART_FILES)"
@@ -333,6 +356,7 @@ info_html:
@echo ""
@echo "DEFAULT_HTML_FILES = $(DEFAULT_HTML_FILES)"
@echo ""
+# @echo "HTML_REF1_FILES = $(HTML_REF1_FILES)"
@echo "HTML_REF3_FILES = $(HTML_REF3_FILES)"
@echo "HTML_REF6_FILES = $(HTML_REF6_FILES)"
@echo "HTML_CHAP_FILES = $(HTML_CHAP_FILES)"
diff --git a/lib/snmp/doc/src/depend.mk b/lib/snmp/doc/src/depend.mk
index bf9833274d..20a523dd8c 100644
--- a/lib/snmp/doc/src/depend.mk
+++ b/lib/snmp/doc/src/depend.mk
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2004-2009. All Rights Reserved.
+# Copyright Ericsson AB 2004-2011. 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
@@ -48,6 +48,7 @@ $(HTMLDIR)/ref_man.html: \
snmp_app.xml \
snmp.xml \
snmpc.xml \
+ snmpc_cmd.xml \
snmpa.xml \
snmpa_conf.xml \
snmpa_discovery_handler.xml \
diff --git a/lib/snmp/doc/src/files.mk b/lib/snmp/doc/src/files.mk
index 293fb52ce0..bd94cd6bac 100644
--- a/lib/snmp/doc/src/files.mk
+++ b/lib/snmp/doc/src/files.mk
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2001-2009. All Rights Reserved.
+# Copyright Ericsson AB 2001-2011. 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
@@ -23,6 +23,9 @@ XML_APPLICATION_FILES = \
XML_APP_REF3_FILES = \
snmp.xml
+XML_COMP_REF1_FILES = \
+ snmpc_cmd.xml
+
XML_COMP_REF3_FILES = \
snmpc.xml
@@ -62,6 +65,9 @@ XML_MANAGER_REF3_FILES = \
snmpm_network_interface_filter.xml \
snmpm_user.xml
+XML_REF1_FILES = \
+ $(XML_COMP_REF1_FILES)
+
XML_REF3_FILES = \
$(XML_APP_REF3_FILES) \
$(XML_COMP_REF3_FILES) \
@@ -98,12 +104,13 @@ XML_CHAPTER_FILES = \
BOOK_FILES = book.xml
-XML_FILES = $(BOOK_FILES) \
- $(XML_CHAPTER_FILES) \
- $(XML_PART_FILES) \
- $(XML_REF6_FILES) \
- $(XML_REF3_FILES) \
- $(XML_APPLICATION_FILES)
+XML_FILES = $(BOOK_FILES) \
+ $(XML_CHAPTER_FILES) \
+ $(XML_PART_FILES) \
+ $(XML_REF1_FILES) \
+ $(XML_REF3_FILES) \
+ $(XML_REF6_FILES) \
+ $(XML_APPLICATION_FILES)
GIF_FILES = book.gif \
getnext1.gif \
diff --git a/lib/snmp/doc/src/make.dep b/lib/snmp/doc/src/make.dep
index ccd01b9d3a..223e197f25 100644
--- a/lib/snmp/doc/src/make.dep
+++ b/lib/snmp/doc/src/make.dep
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1999-2009. All Rights Reserved.
+# Copyright Ericsson AB 1999-2011. 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
@@ -52,7 +52,7 @@ book.dvi: book.tex part.tex ref_man.tex snmp.tex snmp_advanced_agent.tex \
snmpa_notification_delivery_info_receiver.tex \
snmpa_notification_filter.tex \
snmpa_supervisor.tex \
- snmpc.tex snmpm.tex snmpm_conf.tex snmpm_mpd.tex \
+ snmpc.tex snmpc_cmd.tex snmpm.tex snmpm_conf.tex snmpm_mpd.tex \
snmpm_network_interface.tex snmpm_network_interface_filter.tex \
snmpm_user.tex
diff --git a/lib/snmp/doc/src/notes.xml b/lib/snmp/doc/src/notes.xml
index 493e7aa092..2efeb8ae3f 100644
--- a/lib/snmp/doc/src/notes.xml
+++ b/lib/snmp/doc/src/notes.xml
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="latin1" ?>
+<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE chapter SYSTEM "chapter.dtd">
<chapter>
<header>
<copyright>
- <year>1996</year><year>2010</year>
+ <year>1996</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -32,23 +32,135 @@
<file>notes.xml</file>
</header>
- <section><title>SNMP 4.18</title>
+ <section>
+ <title>SNMP Development Toolkit 4.19</title>
+ <p>Version 4.19 supports code replacement in runtime from/to
+ version 4.18.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+<!--
+ <p>-</p>
+-->
+ <list type="bulleted">
+ <item>
+ <p>[compiler] Added support for textual convention
+ <c>AGENT-CAPABILITIES</c> and "full" support for textual
+ convention MODULE-COMPLIANCE, both defined by the SNMPv2-CONF
+ mib.</p>
+ <p>The <c>reference</c> and <c>modules</c> part(s) are
+ stored in the <c>assocList</c> of the mib-entry (<c>me</c>)
+ record.
+ Only handled <em>if</em> the option(s) <c>agent_capabilities</c>
+ and <c>module_compliance</c> (respectively) are provided to the
+ compiler. </p>
+ <p>See <seealso marker="snmpc#compile">compile/2</seealso>
+ for more info. </p>
+ <p>For backward compatibillity, the MIBs provided with
+ this application are <em>not</em> compiled with these
+ options. </p>
+ <p>Own Id: OTP-8966</p>
+ </item>
+
+ <item>
+ <p>[agent] Added a "complete" set of (snmp) table and variable
+ print functions, for each mib handled by the SNMP (agent)
+ application. This will be usefull when debugging a running agent.</p>
+ <p>See
+ <seealso marker="snmpa#print_mib_info">print_mib_info/0</seealso>,
+ <seealso marker="snmpa#print_mib_tables">print_mib_tables/0</seealso>
+ and
+ <seealso marker="snmpa#print_mib_variables">print_mib_variables/0</seealso>
+ for more info. </p>
+ <p>Own Id: OTP-8977</p>
+ </item>
+
+ <item>
+ <p>[compiler] Added a MIB compiler (frontend) escript,
+ <c>snmpc</c>. </p>
+ <p>Own Id: OTP-9004</p>
+ </item>
+
+ </list>
+ </section>
+
+ <section>
+ <title>Fixed Bugs and Malfunctions</title>
+<!--
+ <p>-</p>
+-->
+ <list type="bulleted">
+ <item>
+ <p>[agent] For the table vacmAccessTable,
+ when performing the is_set_ok and set operation(s),
+ all values of the vacmAccessSecurityModel column was
+ incorrectly translated to <c>any</c>. </p>
+<!--
+that is when calling:
+snmp_view_basec_acm_mib:vacmAccessTable(set, RowIndex, Cols).
+-->
+ <p>Own Id: OTP-8980</p>
+ </item>
+
+ <item>
+ <p>[agent] When calling
+ <seealso marker="snmp_view_based_acm_mib#reconfigure">snmp_view_based_acm_mib:reconfigure/1</seealso>
+ on a running node, the table <c>vacmAccessTable</c> was not properly
+ cleaned.
+ This meant that if some entries in the vacm.conf file was removed
+ (compared to the <c>current</c> config),
+ while others where modified and/or added, the removed entrie(s)
+ would still exist in the <c>vacmAccessTable</c> table. </p>
+ <p>Own Id: OTP-8981</p>
+ <p>Aux Id: Seq 11750</p>
+ </item>
+
+ </list>
+ </section>
+
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+
+ </section> <!-- 4.19 -->
+
+ <section>
+ <title>SNMP Development Toolkit 4.18</title>
+ <p>Version 4.18 supports code replacement in runtime from/to
+ version 4.17.1 and 4.17.</p>
+
+ <section>
+ <title>Improvements and new features</title>
+ <list type="bulleted">
+ <item>
+ <p>Prepared for R14B release.</p>
+ </item>
+ </list>
+ </section>
<section><title>Fixed Bugs and Malfunctions</title>
- <list>
+ <p>-</p>
+<!--
+ <list type="bulleted">
<item>
- <p>
- When the function FilterMod:accept_recv/2 returned false
- the SNMP agent stopped collecting messages from UDP.</p>
- <p>
- Own Id: OTP-8761</p>
+ <p>[agent] When the function FilterMod:accept_recv/2 returned false
+ the SNMP agent stopped collecting messages from UDP.</p>
+ <p>Own Id: OTP-8761</p>
</item>
</list>
+-->
</section>
-</section>
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+ </section>
+ </section> <!-- 4.18 -->
+
-<section>
+ <section>
<title>SNMP Development Toolkit 4.17.1</title>
<p>Version 4.17.1 supports code replacement in runtime from/to
version 4.17, 4.16.2, 4.16.1, 4.16, 4.15, 4.14 and 4.13.5.</p>
@@ -63,7 +175,8 @@
<list type="bulleted">
<item>
<p>When the function FilterMod:accept_recv/2
- returned false the SNMP agent stopped collecting messages from UDP.</p>
+ returned false the SNMP agent stopped collecting
+ messages from UDP.</p>
<p>Own Id: OTP-8761</p>
</item>
</list>
diff --git a/lib/snmp/doc/src/ref_man.xml b/lib/snmp/doc/src/ref_man.xml
index 1ae5a8205b..92e8927f6d 100644
--- a/lib/snmp/doc/src/ref_man.xml
+++ b/lib/snmp/doc/src/ref_man.xml
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="latin1" ?>
+<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE application SYSTEM "application.dtd">
<application xmlns:xi="http://www.w3.org/2001/XInclude">
<header>
<copyright>
- <year>1996</year><year>2009</year>
+ <year>1996</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -61,6 +61,7 @@
<xi:include href="snmp_user_based_sm_mib.xml"/>
<xi:include href="snmp_view_based_acm_mib.xml"/>
<xi:include href="snmpc.xml"/>
+ <xi:include href="snmpc_cmd.xml"/>
<xi:include href="snmpm.xml"/>
<xi:include href="snmpm_conf.xml"/>
<xi:include href="snmpm_mpd.xml"/>
diff --git a/lib/snmp/doc/src/snmp_agent_config_files.xml b/lib/snmp/doc/src/snmp_agent_config_files.xml
index 0bab563f87..b62269d506 100644
--- a/lib/snmp/doc/src/snmp_agent_config_files.xml
+++ b/lib/snmp/doc/src/snmp_agent_config_files.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>1997</year><year>2009</year>
+ <year>1997</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -178,11 +178,12 @@
<c>community.conf</c>. It must be present if the agent is
configured for SNMPv1 or SNMPv2c.
</p>
+ <p>An SNMP <em>community</em> is a relationship between an SNMP
+ agent and a set of SNMP managers that defines authentication, access
+ control and proxy characteristics. </p>
<p>The corresponding table is <c>snmpCommunityTable</c> in the
- SNMP-COMMUNITY-MIB.
- </p>
- <p>Each entry is a term:
- </p>
+ SNMP-COMMUNITY-MIB. </p>
+ <p>Each entry is a term: </p>
<p><c>{CommunityIndex, CommunityName, SecurityName, ContextName, TransportTag}.</c></p>
<list type="bulleted">
<item><c>CommunityIndex</c> is a non-empty string.
diff --git a/lib/snmp/doc/src/snmp_config.xml b/lib/snmp/doc/src/snmp_config.xml
index 769b908adc..fc8562b638 100644
--- a/lib/snmp/doc/src/snmp_config.xml
+++ b/lib/snmp/doc/src/snmp_config.xml
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="latin1" ?>
+<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE chapter SYSTEM "chapter.dtd">
<chapter>
<header>
<copyright>
- <year>1997</year><year>2010</year>
+ <year>1997</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -1004,36 +1004,16 @@ ok
</taglist>
<p>Another usefull way to debug the agent is to pretty-print the content of
- some of the (MIB-) tables handled directly by the agent. This can be done
- for the following tables: </p>
- <taglist>
- <tag><c><![CDATA[snmpCommunityTable]]></c></tag>
- <item>
- <p><c><![CDATA[snmp_community_mib:snmpCommunityTable(print).]]></c></p>
- </item>
-
- <tag><c><![CDATA[snmpNotifyTable]]></c></tag>
- <item>
- <p><c><![CDATA[snmp_notification_mib:snmpNotifyTable(print).]]></c></p>
- </item>
-
- <tag><c><![CDATA[snmpTargetAddrTable]]></c></tag>
- <item>
- <p><c><![CDATA[snmp_target_mib:snmpTargetAddrTable(print).]]></c></p>
- </item>
-
- <tag><c><![CDATA[snmpTargetParamsTable]]></c></tag>
- <item>
- <p><c><![CDATA[snmp_target_mib:snmpTargetParamsTable(print).]]></c></p>
- </item>
-
- <tag><c><![CDATA[usmUserTable]]></c></tag>
- <item>
- <p><c><![CDATA[snmp_user_based_sm_mib:usmUserTable(print).]]></c></p>
- </item>
-
- </taglist>
-
+ all the tables and/or variables handled directly by the agent.
+ This can be done by simply calling: </p>
+ <p><c><![CDATA[snmpa:print_mib_info()]]></c></p>
+ <p>See
+ <seealso marker="snmpa#print_mib_info">print_mib_info/0</seealso>,
+ <seealso marker="snmpa#print_mib_tables">print_mib_tables/0</seealso>
+ or
+ <seealso marker="snmpa#print_mib_variables">print_mib_variables/0</seealso>
+ for more info. </p>
+
</section>
</chapter>
diff --git a/lib/snmp/doc/src/snmp_view_based_acm_mib.xml b/lib/snmp/doc/src/snmp_view_based_acm_mib.xml
index ffea256608..d595f6b93b 100644
--- a/lib/snmp/doc/src/snmp_view_based_acm_mib.xml
+++ b/lib/snmp/doc/src/snmp_view_based_acm_mib.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1999</year><year>2009</year>
+ <year>1999</year><year>2010</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -38,7 +38,10 @@
SNMP-VIEW-BASED-ACM-MIB, and functions for configuring the database.
</p>
<p>The configuration files are described in the SNMP User's Manual.</p>
+
+ <marker id="configure"></marker>
</description>
+
<funcs>
<func>
<name>configure(ConfDir) -> void()</name>
@@ -48,27 +51,24 @@
</type>
<desc>
<p>This function is called from the supervisor at system
- start-up.
- </p>
+ start-up. </p>
<p>Inserts all data in the configuration files into the
- database and destroys all old rows with StorageType
- <c>volatile</c>. The rows created from the configuration file
- will have StorageType <c>nonVolatile</c>.
- </p>
- <p>All <c>snmp</c> counters are set to zero.
- </p>
+ database and destroys all old rows with StorageType
+ <c>volatile</c>. The rows created from the configuration file
+ will have StorageType <c>nonVolatile</c>. </p>
+ <p>All <c>snmp</c> counters are set to zero. </p>
<p>If an error is found in the configuration file, it is
- reported using the function <c>config_err/2</c> of the error
- report module, and the function fails with the reason
- <c>configuration_error</c>.
- </p>
+ reported using the function <c>config_err/2</c> of the error
+ report module, and the function fails with the reason
+ <c>configuration_error</c>. </p>
<p><c>ConfDir</c> is a string which points to the directory
- where the configuration files are found.
- </p>
- <p>The configuration file read is: <c>vacm.conf</c>.
- </p>
+ where the configuration files are found. </p>
+ <p>The configuration file read is: <c>vacm.conf</c>. </p>
+
+ <marker id="reconfigure"></marker>
</desc>
</func>
+
<func>
<name>reconfigure(ConfDir) -> void()</name>
<fsummary>Configure the SNMP-VIEW-BASED-ACM-MIB</fsummary>
@@ -88,18 +88,20 @@
<p>All <c>snmp</c> counters are set to zero.
</p>
<p>If an error is found in the configuration file, it is
- reported using the function <c>config_err/2</c> of the error
- report module, and the function fails with the reason
+ reported using the function
+ <seealso marker="snmpa_error#config_err">config_err/2</seealso>
+ of the error report module, and the function fails with the reason
<c>configuration_error</c>.
</p>
<p><c>ConfDir</c> is a string which points to the directory
where the configuration files are found.
</p>
- <p>The configuration file read is: <c>vacm.conf</c>.
- <marker id="add_sec2group"></marker>
-</p>
+ <p>The configuration file read is: <c>vacm.conf</c>. </p>
+
+ <marker id="add_sec2group"></marker>
</desc>
</func>
+
<func>
<name>add_sec2group(SecModel, SecName, GroupName) -> Ret</name>
<fsummary>Add one security to group definition</fsummary>
@@ -113,10 +115,13 @@
</type>
<desc>
<p>Adds a security to group definition to the agent config.
- Equivalent to one vacmSecurityToGroup-line in the <c>vacm.conf</c> file.</p>
+ Equivalent to one vacmSecurityToGroup-line in the
+ <c>vacm.conf</c> file.</p>
+
<marker id="delete_sec2group"></marker>
</desc>
</func>
+
<func>
<name>delete_sec2group(Key) -> Ret</name>
<fsummary>Delete one security to group definition</fsummary>
@@ -127,9 +132,11 @@
</type>
<desc>
<p>Delete a security to group definition from the agent config.</p>
+
<marker id="add_access"></marker>
</desc>
</func>
+
<func>
<name>add_access(GroupName, Prefix, SecModel, SecLevel, Match, RV, WV, NV) -> Ret</name>
<fsummary>Add one access definition</fsummary>
@@ -148,10 +155,12 @@
</type>
<desc>
<p>Adds a access definition to the agent config.
- Equivalent to one vacmAccess-line in the <c>vacm.conf</c> file.</p>
- <marker id="delete_access"></marker>
+ Equivalent to one vacmAccess-line in the <c>vacm.conf</c> file.</p>
+
+ <marker id="delete_access"></marker>
</desc>
</func>
+
<func>
<name>delete_access(Key) -> Ret</name>
<fsummary>Delete one access definition</fsummary>
@@ -161,10 +170,12 @@
<v>Reason = term()</v>
</type>
<desc>
- <p>Delete a access definition from the agent config.</p>
- <marker id="add_view_tree_fam"></marker>
+ <p>Delete a access definition from the agent config.</p>
+
+ <marker id="add_view_tree_fam"></marker>
</desc>
</func>
+
<func>
<name>add_view_tree_fam(ViewIndex, SubTree, Status, Mask) -> Ret</name>
<fsummary>Add one view tree family definition</fsummary>
@@ -178,11 +189,14 @@
<v>Reason = term()</v>
</type>
<desc>
- <p>Adds a view tree family definition to the agent config.
- Equivalent to one vacmViewTreeFamily-line in the <c>vacm.conf</c> file.</p>
- <marker id="delete_view_tree_fam"></marker>
+ <p>Adds a view tree family definition to the agent config.
+ Equivalent to one vacmViewTreeFamily-line in the
+ <c>vacm.conf</c> file.</p>
+
+ <marker id="delete_view_tree_fam"></marker>
</desc>
</func>
+
<func>
<name>delete_view_tree_fam(Key) -> Ret</name>
<fsummary>Delete one view tree family definition</fsummary>
diff --git a/lib/snmp/doc/src/snmpa.xml b/lib/snmp/doc/src/snmpa.xml
index f546724a78..1d680e80f5 100644
--- a/lib/snmp/doc/src/snmpa.xml
+++ b/lib/snmp/doc/src/snmpa.xml
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="latin1" ?>
+<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE erlref SYSTEM "erlref.dtd">
<erlref>
<header>
<copyright>
- <year>2004</year><year>2010</year>
+ <year>2004</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -1252,6 +1252,39 @@ snmp_agent:register_subagent(SA1,[1,2,3], SA2).
<p>This is a utility function, that can be useful when
e.g. debugging instrumentation functions.</p>
+ <marker id="print_mib_info"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>print_mib_info() -> void()</name>
+ <fsummary>Print mib info</fsummary>
+ <desc>
+ <p>Prints the content of all the (snmp) tables and variables
+ for all mibs handled by the snmp agent. </p>
+
+ <marker id="print_mib_tables"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>print_mib_tables() -> void()</name>
+ <fsummary>Print mib tables</fsummary>
+ <desc>
+ <p>Prints the content of all the (snmp) tables
+ for all mibs handled by the snmp agent. </p>
+
+ <marker id="print_mib_variables"></marker>
+ </desc>
+ </func>
+
+ <func>
+ <name>print_mib_variables() -> void()</name>
+ <fsummary>Print mib variables</fsummary>
+ <desc>
+ <p>Prints the content of all the (snmp) variables
+ for all mibs handled by the snmp agent. </p>
+
<marker id="verbosity"></marker>
</desc>
</func>
diff --git a/lib/snmp/doc/src/snmpa_error.xml b/lib/snmp/doc/src/snmpa_error.xml
index a7312e8b24..4dbafdfbb7 100644
--- a/lib/snmp/doc/src/snmpa_error.xml
+++ b/lib/snmp/doc/src/snmpa_error.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2002</year><year>2009</year>
+ <year>2002</year><year>2010</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -51,6 +51,8 @@
<c>error_report_mod</c>, see
<seealso marker="snmp_config#configuration_params">configuration parameters</seealso>.
</p>
+
+ <marker id="config_err"></marker>
</description>
<funcs>
<func>
@@ -67,8 +69,11 @@
</p>
<p><c>Format</c> and <c>Args</c> are as in
<c>io:format(Format, Args)</c>.</p>
+
+ <marker id="user_err"></marker>
</desc>
</func>
+
<func>
<name>user_err(Format, Args) -> void()</name>
<fsummary>Called if a user related error occurs</fsummary>
diff --git a/lib/snmp/doc/src/snmpc.xml b/lib/snmp/doc/src/snmpc.xml
index fbd0950c69..771629492d 100644
--- a/lib/snmp/doc/src/snmpc.xml
+++ b/lib/snmp/doc/src/snmpc.xml
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="latin1" ?>
+<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE erlref SYSTEM "erlref.dtd">
<erlref>
<header>
<copyright>
- <year>2004</year><year>2010</year>
+ <year>2004</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -37,6 +37,7 @@
<p>The module <c>snmpc</c> contains interface functions to the
SNMP toolkit MIB compiler.</p>
+ <marker id="compile"></marker>
</description>
<funcs>
@@ -47,7 +48,7 @@
<type>
<v>File = string()</v>
<v>Options = [opt()]</v>
- <v>opt() = db() | relaxed_row_name_assign_check() | deprecated() | description() | reference() | group_check() | i() | il() | imports() | module() | module_identity() | outdir() | no_defs() | verbosity() | warnings()</v>
+ <v>opt() = db() | relaxed_row_name_assign_check() | deprecated() | description() | reference() | group_check() | i() | il() | imports() | module() | module_identity() | module_compliance() | agent_capabilities() | outdir() | no_defs() | verbosity() | warnings()</v>
<v>db() = {db, volatile|persistent|mnesia}</v>
<v>deprecated() = {deprecated, bool()}</v>
<v>relaxed_row_name_assign_check() = relaxed_row_name_assign_check</v>
@@ -59,6 +60,8 @@
<v>imports() = imports</v>
<v>module() = {module, atom()}</v>
<v>module_identity() = module_identity</v>
+ <v>module_compliance() = module_compliance</v>
+ <v>agent_capabilities() = agent_capabilities</v>
<v>no_defs() = no_defs</v>
<v>outdir() = {outdir, dir()}</v>
<v>verbosity() = {verbosity, silence|warning|info|log|debug|trace}</v>
@@ -77,6 +80,7 @@
be used for the default instrumentation. </p>
<p>Default is <c>volatile</c>. </p>
</item>
+
<item>
<p>The option <c>deprecated</c> specifies if a deprecated
definition should be kept or not. If the option is
@@ -84,6 +88,7 @@
definitions. </p>
<p>Default is <c>true</c>. </p>
</item>
+
<item>
<p>The option <c>relaxed_row_name_assign_check</c>, if present,
specifies that the row name assign check shall not be done
@@ -94,12 +99,14 @@
<p>By default it is not included, but if this option is present
it will be. </p>
</item>
+
<item>
<p>The option <c>description</c> specifies if the text
of the DESCRIPTION field will be included or not. </p>
<p>By default it is not included, but if this option is
present it will be. </p>
</item>
+
<item>
<p>The option <c>reference</c> specifies if the text
of the REFERENCE field, when found in a table definition,
@@ -108,18 +115,21 @@
it will be. The reference text will be placed in the allocList
field of the mib-entry record (#me{}) for the table. </p>
</item>
+
<item>
<p>The option <c>group_check</c> specifies whether the
mib compiler should check the OBJECT-GROUP macro and
the NOTIFICATION-GROUP macro for correctness or not. </p>
<p>Default is <c>true</c>. </p>
</item>
+
<item>
<p>The option <c>i</c> specifies the path to search for
imported (compiled) MIB files. The directories should be
strings with a trailing directory delimiter. </p>
<p>Default is <c>["./"]</c>. </p>
</item>
+
<item>
<p>The option <c>il</c> (include_lib) also specifies a
list of directories to search for imported MIBs. It
@@ -132,11 +142,13 @@
<c><![CDATA[<snmp-home>/priv/mibs/]]></c>
are always listed last in the include path. </p>
</item>
+
<item>
<p>The option <c>imports</c>, if present, specifies that
the IMPORT statement of the MIB shall be included in the
compiled mib. </p>
</item>
+
<item>
<p>The option <c>module</c>, if present, specifies the
name of a module which implements all instrumentation
@@ -145,11 +157,29 @@
functions must be the same as the corresponding managed
object it implements. </p>
</item>
+
<item>
<p>The option <c>module_identity</c>, if present, specifies
that the info part of the MODULE-IDENTITY statement of the MIB
shall be included in the compiled mib. </p>
</item>
+
+ <item>
+ <p>The option <c>module_compliance</c>, if present, specifies
+ that the MODULE-COMPLIANCE statement of the MIB shall be included
+ (with a mib-entry record) in the compiled mib. The mib-entry record
+ of the module-compliance will contain <c>reference</c> and <c>module</c>
+ part(s) this info in the <c>assocList</c> field). </p>
+ </item>
+
+ <item>
+ <p>The option <c>agent_capabilities</c>, if present, specifies
+ that the AGENT-CAPABILITIES statement of the MIB shall be included
+ (with a mib-entry record) in the compiled mib. The mib-entry record
+ of the agent-capabilitie will contain <c>reference</c> and <c>modules</c>
+ part(s) this info in the <c>assocList</c> field). </p>
+ </item>
+
<item>
<p>The option <c>no_defs</c>, if present, specifies
that if a managed object does not have an instrumentation
@@ -157,6 +187,7 @@
be used, instead this is reported as an error, and the
compilation aborts. </p>
</item>
+
<item>
<p>The option <c>verbosity</c> specifies the verbosity of
the SNMP mib compiler. I.e. if warning, info, log, debug
@@ -166,11 +197,13 @@
option <c>verbosity</c> is <c>silence</c>, warning messages will
still be shown. </p>
</item>
+
<item>
<p>The option <c>warnings</c> specifies whether warning
messages should be shown. </p>
<p>Default is <c>true</c>. </p>
</item>
+
</list>
<p>The MIB compiler understands both SMIv1 and SMIv2 MIBs. It
uses the <c>MODULE-IDENTITY</c> statement to determine if the MIB is
@@ -185,8 +218,11 @@
have to be specified to <c>erlc</c> using the syntax
<c>+term</c>. See <c>erlc(1)</c> for details.
</p>
+
+ <marker id="is_consistent"></marker>
</desc>
</func>
+
<func>
<name>is_consistent(Mibs) -> ok | {error, Reason}</name>
<fsummary>Check for OID conflicts between MIBs</fsummary>
@@ -198,8 +234,11 @@
<p>Checks for multiple usage of object identifiers and traps
between MIBs.
</p>
+
+ <marker id="mib_to_hrl"></marker>
</desc>
</func>
+
<func>
<name>mib_to_hrl(MibName) -> ok | {error, Reason}</name>
<fsummary>Generate constants for the objects in the MIB</fsummary>
diff --git a/lib/snmp/doc/src/snmpc_cmd.xml b/lib/snmp/doc/src/snmpc_cmd.xml
new file mode 100644
index 0000000000..9358382a10
--- /dev/null
+++ b/lib/snmp/doc/src/snmpc_cmd.xml
@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="iso-8859-1" ?>
+<!DOCTYPE comref SYSTEM "comref.dtd">
+
+<comref>
+ <header>
+ <copyright>
+ <year>2011</year><year>2011</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ 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.
+
+ </legalnotice>
+
+ <title>snmpc</title>
+ <prepared></prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>snmpc_cmd.xml</file>
+ </header>
+ <com>snmpc(command)</com>
+ <comsummary>SNMP MIB compiler frontend</comsummary>
+ <description>
+ <p>The <c><![CDATA[snmpc]]></c> program provides a way to run
+ the SNMP MIB compiler of the Erlang system. </p>
+ </description>
+
+ <funcs>
+ <func>
+ <name>snmpc [options] file.mib | file.bin</name>
+ <fsummary>Compile MIBs</fsummary>
+ <desc>
+ <p><c><![CDATA[snmpc]]></c> compile a SNMP MIB file,
+ see <seealso marker="snmpc#compile">compile/1,2</seealso> for
+ more info. </p>
+ <p>It can also be used to generate a header file (.hrl)
+ with definitions of Erlang constants for the objects in
+ the MIB, see
+ <seealso marker="snmpc#mib_to_hrl">mib_to_hrl/1</seealso>. </p>
+ </desc>
+ </func>
+ </funcs>
+
+ <section>
+ <title>Compiler options</title>
+ <p>The following options are supported (note that most of these relate
+ to the compilation of the MIB file):</p>
+ <taglist>
+ <tag>--help</tag>
+ <item>
+ <p>Prints help info.</p>
+ </item>
+
+ <tag>--version</tag>
+ <item>
+ <p>Prints application and mib format version.</p>
+ </item>
+
+ <tag>--verbosity <em>verbosity</em></tag>
+ <item>
+ <p>Print debug info. </p>
+ <p><c>verbosity</c> = <c>trace</c> | <c>debug</c> | <c>log</c> | <c>info</c> | <c>silence</c></p>
+ <p>Defaults to <c>silence</c>.</p>
+ </item>
+
+ <tag>--warnings</tag>
+ <item>
+ <p>Print warning messages. </p>
+ </item>
+
+ <tag>--o <em>directory</em></tag>
+ <item>
+ <p>The directory where the compiler should place the output files.
+ If not specified, output files will be placed in the current working
+ directory.</p>
+ </item>
+
+ <tag>--i <em>Directory</em></tag>
+ <item>
+ <p>Specifies the path to search for imported (compiled) MIB files.
+ By default, the current working directory is always included. </p>
+ <p>This option can be present several times, each time specifying
+ <em>one</em> path. </p>
+ </item>
+
+ <tag>--il <em>Directory</em></tag>
+ <item>
+ <p>This option (include_lib), specifies a list of directories to
+ search for imported MIBs. It assumes that the first element in
+ the directory name corresponds to an OTP application. The compiler
+ will find the current installed version. For example, the value
+ ["snmp/mibs/"] will be replaced by ["snmp-3.1.1/mibs/"] (or what
+ the current version may be in the system). The current directory
+ and the "snmp-home"/priv/mibs/ are always listed last in the
+ include path. </p>
+ </item>
+
+ <tag>--sgc</tag>
+ <item>
+ <p>This option (skip group check), if present, disables the
+ group check of the mib compiler.
+ That is, should the OBJECT-GROUP and the NOTIFICATION-GROUP
+ macro(s) be checked for correctness or not. </p>
+ </item>
+
+ <tag>--dep</tag>
+ <item>
+ <p>Keep deprecated definition(s).
+ If not specified the compiler will ignore deprecated definitions. </p>
+ </item>
+
+ <tag>--desc</tag>
+ <item>
+ <p>The DESCRIPTION field will be included. </p>
+ </item>
+
+ <tag>--ref</tag>
+ <item>
+ <p>The REFERENCE field will be included. </p>
+ </item>
+
+ <tag>--imp</tag>
+ <item>
+ <p>The IMPORTS field will be included. </p>
+ </item>
+
+ <tag>--mi</tag>
+ <item>
+ <p>The MODULE-IDENTITY field will be included. </p>
+ </item>
+
+ <tag>--mc</tag>
+ <item>
+ <p>The MODULE-COMPLIANCE field will be included. </p>
+ </item>
+
+ <tag>--ac</tag>
+ <item>
+ <p>The AGENT-CAPABILITIES field will be included. </p>
+ </item>
+
+ <tag>--mod <em>module</em></tag>
+ <item>
+ <p>The module which implements all the instrumentation functions. </p>
+ <p>The name of all instrumentation functions must be the
+ same as the corresponding managed object it implements. </p>
+ </item>
+
+ <tag>--nd</tag>
+ <item>
+ <p>The default instrumentation functions will <em>not</em> be
+ used if a managed object have no instrumentation function.
+ Instead this will be reported as an error, and the compilation
+ aborts. </p>
+ </item>
+
+ <tag>--rrnac</tag>
+ <item>
+ <p>This option, if present, specifies that the row name assign check
+ shall not be done strictly according to the SMI (which allows only
+ the value 1). </p>
+ <p>With this option, all values greater than zero is allowed (>= 1).
+ This means that the error will be converted to a warning. </p>
+ <p>By default it is not included, but if this option is present
+ it will be. </p>
+ </item>
+
+ </taglist>
+ </section>
+
+ <section>
+ <title>SEE ALSO</title>
+ <p><seealso marker="erlc">erlc(1)</seealso>,
+ <seealso marker="compiler:compile">compile(3)</seealso>,
+ <seealso marker="snmp:snmpc">snmpc(3)</seealso></p>
+ </section>
+</comref>
+
diff --git a/lib/snmp/include/snmp_types.hrl b/lib/snmp/include/snmp_types.hrl
index 1fd6d153c9..4adb24361c 100644
--- a/lib/snmp/include/snmp_types.hrl
+++ b/lib/snmp/include/snmp_types.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2010. 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
@@ -192,7 +192,7 @@
%%----------------------------------------------------------------------
-record(mib,
{misc = [],
- mib_format_version = "3.1",
+ mib_format_version = "3.2",
name = "",
module_identity, %% Not in SMIv1, and only with +module_identity
mes = [],
diff --git a/lib/snmp/mibs/Makefile.in b/lib/snmp/mibs/Makefile.in
index b85a8b0767..7aefb0ea34 100644
--- a/lib/snmp/mibs/Makefile.in
+++ b/lib/snmp/mibs/Makefile.in
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2009. All Rights Reserved.
+# Copyright Ericsson AB 1996-2011. 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
@@ -108,20 +108,28 @@ TARGET_FILES = \
# FLAGS
# ----------------------------------------------------
-SNMP_FLAGS += -pa ../ebin +version
+SNMP_FLAGS += -pa ../ebin +version
ifneq ($(MIBS_VERBOSITY),)
-SNMP_FLAGS += +'{verbosity,$(MIBS_VERBOSITY)}'
+SNMP_FLAGS += +'{verbosity, $(MIBS_VERBOSITY)}'
endif
-ifneq ($(MIBS_REFERENCE),)
+ifeq ($(MIBS_REFERENCE),true)
SNMP_FLAGS += +reference
endif
-ifneq ($(MIBS_OPTIONS),)
+ifeq ($(MIBS_OPTIONS),true)
SNMP_FLAGS += +options
endif
+ifeq ($(MIBS_MC),true)
+SNMP_FLAGS += +module_compliance
+endif
+
+ifeq ($(MIBS_AC),true)
+SNMP_FLAGS += +agent_capabilities
+endif
+
# ----------------------------------------------------
# Targets
@@ -148,6 +156,14 @@ conf:
cd ..; $(MAKE) conf
info:
+ @echo "MIBS_REFERENCE = $(MIBS_REFERENCE)"
+ @echo ""
+ @echo "MIBS_OPTIONS = $(MIBS_OPTIONS)"
+ @echo ""
+ @echo "MIBS_MC = $(MIBS_MC)"
+ @echo ""
+ @echo "MIBS_AC = $(MIBS_AC)"
+ @echo ""
@echo "SNMP_FLAGS = $(SNMP_FLAGS)"
@echo ""
@echo "MIBS = $(MIBS)"
diff --git a/lib/snmp/src/agent/snmp_community_mib.erl b/lib/snmp/src/agent/snmp_community_mib.erl
index 8f0f4cad73..5644a43345 100644
--- a/lib/snmp/src/agent/snmp_community_mib.erl
+++ b/lib/snmp/src/agent/snmp_community_mib.erl
@@ -336,6 +336,8 @@ get_target_addr_ext_mms(TDomain, TAddress, Key) ->
get_target_addr_ext_mms(TDomain, TAddress, NextKey)
end
end.
+
+
%%-----------------------------------------------------------------
%% Instrumentation Functions
%%-----------------------------------------------------------------
@@ -347,7 +349,7 @@ snmpCommunityTable(print) ->
PrintRow =
fun(Prefix, Row) ->
lists:flatten(
- io_lib:format("~sIndex: ~p"
+ io_lib:format("~sIndex: ~p"
"~n~sName: ~p"
"~n~sSecurityName: ~p"
"~n~sContextEngineID: ~p"
diff --git a/lib/snmp/src/agent/snmp_framework_mib.erl b/lib/snmp/src/agent/snmp_framework_mib.erl
index d9bf7e8551..0d7866d94d 100644
--- a/lib/snmp/src/agent/snmp_framework_mib.erl
+++ b/lib/snmp/src/agent/snmp_framework_mib.erl
@@ -373,15 +373,27 @@ intAgentUDPPort(Op) ->
intAgentIpAddress(Op) ->
snmp_generic:variable_func(Op, db(intAgentIpAddress)).
+snmpEngineID(print) ->
+ VarAndValue = [{snmpEngineID, snmpEngineID(get)}],
+ snmpa_mib_lib:print_variables(VarAndValue);
snmpEngineID(Op) ->
snmp_generic:variable_func(Op, db(snmpEngineID)).
+snmpEngineMaxMessageSize(print) ->
+ VarAndValue = [{snmpEngineMaxMessageSize, snmpEngineMaxMessageSize(get)}],
+ snmpa_mib_lib:print_variables(VarAndValue);
snmpEngineMaxMessageSize(Op) ->
snmp_generic:variable_func(Op, db(snmpEngineMaxMessageSize)).
+snmpEngineBoots(print) ->
+ VarAndValue = [{snmpEngineBoots, snmpEngineBoots(get)}],
+ snmpa_mib_lib:print_variables(VarAndValue);
snmpEngineBoots(Op) ->
snmp_generic:variable_func(Op, db(snmpEngineBoots)).
+snmpEngineTime(print) ->
+ VarAndValue = [{snmpEngineTime, snmpEngineTime(get)}],
+ snmpa_mib_lib:print_variables(VarAndValue);
snmpEngineTime(get) ->
{value, get_engine_time()}.
diff --git a/lib/snmp/src/agent/snmp_standard_mib.erl b/lib/snmp/src/agent/snmp_standard_mib.erl
index 639172401d..b6834d278c 100644
--- a/lib/snmp/src/agent/snmp_standard_mib.erl
+++ b/lib/snmp/src/agent/snmp_standard_mib.erl
@@ -40,6 +40,28 @@
sys_object_id/1, sys_object_id/2, sys_or_table/3,
variable_func/1, variable_func/2,
inc/1, inc/2]).
+-export([sysDescr/1, sysContact/1, sysName/1, sysLocation/1,
+ sysServices/1, sysUpTime/1, snmpEnableAuthenTraps/1,
+ sysObjectID/1,
+ snmpInPkts/1, snmpOutPkts/1,
+ snmpInBadVersions/1,
+ snmpInBadCommunityNames/1, snmpInBadCommunityUses/1,
+ snmpInASNParseErrs/1,
+ snmpInTooBigs/1,
+ snmpInNoSuchNames/1, snmpInBadValues/1,
+ snmpInReadOnlys/1, snmpInGenErrs/1,
+ snmpInTotalReqVars/1, snmpInTotalSetVars/1,
+ snmpInGetRequests/1, snmpInSetRequests/1,
+ snmpInGetNexts/1,
+ snmpInGetResponses/1, snmpInTraps/1,
+ snmpOutTooBigs/1,
+ snmpOutNoSuchNames/1,
+ snmpOutBadValues/1,
+ snmpOutGenErrs/1,
+ snmpOutGetRequests/1, snmpOutSetRequests/1,
+ snmpOutGetNexts/1,
+ snmpOutGetResponses/1,
+ snmpOutTraps/1]).
-export([dummy/1, snmp_set_serial_no/1, snmp_set_serial_no/2]).
-export([add_agent_caps/2, del_agent_caps/1, get_agent_caps/0]).
-export([check_standard/1]).
@@ -202,18 +224,257 @@ variable_func(get, Name) ->
inc(Name) -> inc(Name, 1).
inc(Name, N) -> ets:update_counter(snmp_agent_table, Name, N).
+
+sysDescr(print) ->
+ VarAndValue = [{sysDescr, sysDescr(get)}],
+ snmpa_mib_lib:print_variables(VarAndValue);
+
+sysDescr(get) ->
+ VarDB = db(sysDescr),
+ snmp_generic:variable_get(VarDB).
+
+
+sysContact(print) ->
+ VarAndValue = [{sysContact, sysContact(get)}],
+ snmpa_mib_lib:print_variables(VarAndValue);
+
+sysContact(get) ->
+ VarDB = db(sysContact),
+ snmp_generic:variable_get(VarDB).
+
+
+sysName(print) ->
+ VarAndValue = [{sysName, sysName(get)}],
+ snmpa_mib_lib:print_variables(VarAndValue);
+
+sysName(get) ->
+ VarDB = db(sysName),
+ snmp_generic:variable_get(VarDB).
+
+
+sysLocation(print) ->
+ VarAndValue = [{sysLocation, sysLocation(get)}],
+ snmpa_mib_lib:print_variables(VarAndValue);
+
+sysLocation(get) ->
+ VarDB = db(sysLocation),
+ snmp_generic:variable_get(VarDB).
+
+
+sysServices(print) ->
+ VarAndValue = [{sysServices, sysServices(get)}],
+ snmpa_mib_lib:print_variables(VarAndValue);
+
+sysServices(get) ->
+ VarDB = db(sysServices),
+ snmp_generic:variable_get(VarDB).
+
+
+snmpInPkts(print) ->
+ gen_counter(print, snmpInPkts);
+snmpInPkts(get) ->
+ gen_counter(get, snmpInPkts).
+
+
+snmpOutPkts(print) ->
+ gen_counter(print, snmpOutPkts);
+snmpOutPkts(get) ->
+ gen_counter(get, snmpOutPkts).
+
+
+snmpInASNParseErrs(print) ->
+ gen_counter(print, snmpInASNParseErrs);
+snmpInASNParseErrs(get) ->
+ gen_counter(get, snmpInASNParseErrs).
+
+
+snmpInBadCommunityNames(print) ->
+ gen_counter(print, snmpInBadCommunityNames);
+snmpInBadCommunityNames(get) ->
+ gen_counter(get, snmpInBadCommunityNames).
+
+
+snmpInBadCommunityUses(print) ->
+ gen_counter(print, snmpInBadCommunityUses);
+
+snmpInBadCommunityUses(get) ->
+ gen_counter(get, snmpInBadCommunityUses).
+
+
+snmpInBadVersions(print) ->
+ gen_counter(print, snmpInBadVersions);
+snmpInBadVersions(get) ->
+ gen_counter(get, snmpInBadVersions).
+
+
+snmpInTooBigs(print) ->
+ gen_counter(print, snmpInTooBigs);
+snmpInTooBigs(get) ->
+ gen_counter(get, snmpInTooBigs).
+
+
+snmpInNoSuchNames(print) ->
+ gen_counter(print, snmpInNoSuchNames);
+snmpInNoSuchNames(get) ->
+ gen_counter(get, snmpInNoSuchNames).
+
+
+snmpInBadValues(print) ->
+ gen_counter(print, snmpInBadValues);
+snmpInBadValues(get) ->
+ gen_counter(get, snmpInBadValues).
+
+
+snmpInReadOnlys(print) ->
+ gen_counter(print, snmpInReadOnlys);
+snmpInReadOnlys(get) ->
+ gen_counter(get, snmpInReadOnlys).
+
+
+snmpInGenErrs(print) ->
+ gen_counter(print, snmpInGenErrs);
+snmpInGenErrs(get) ->
+ gen_counter(get, snmpInGenErrs).
+
+
+snmpInTotalReqVars(print) ->
+ gen_counter(print, snmpInTotalReqVars);
+snmpInTotalReqVars(get) ->
+ gen_counter(get, snmpInTotalReqVars).
+
+
+snmpInTotalSetVars(print) ->
+ gen_counter(print, snmpInTotalSetVars);
+snmpInTotalSetVars(get) ->
+ gen_counter(get, snmpInTotalSetVars).
+
+
+snmpInGetRequests(print) ->
+ gen_counter(print, snmpInGetRequests);
+snmpInGetRequests(get) ->
+ gen_counter(get, snmpInGetRequests).
+
+
+snmpInSetRequests(print) ->
+ gen_counter(print, snmpInSetRequests);
+snmpInSetRequests(get) ->
+ gen_counter(get, snmpInSetRequests).
+
+
+snmpInGetNexts(print) ->
+ gen_counter(print, snmpInGetNexts);
+snmpInGetNexts(get) ->
+ gen_counter(get, snmpInGetNexts).
+
+
+snmpInGetResponses(print) ->
+ gen_counter(print, snmpInGetResponses);
+snmpInGetResponses(get) ->
+ gen_counter(get, snmpInGetResponses).
+
+
+snmpInTraps(print) ->
+ gen_counter(print, snmpInTraps);
+snmpInTraps(get) ->
+ gen_counter(get, snmpInTraps).
+
+
+snmpOutTooBigs(print) ->
+ gen_counter(print, snmpOutTooBigs);
+snmpOutTooBigs(get) ->
+ gen_counter(get, snmpOutTooBigs).
+
+
+snmpOutNoSuchNames(print) ->
+ gen_counter(print, snmpOutNoSuchNames);
+snmpOutNoSuchNames(get) ->
+ gen_counter(get, snmpOutNoSuchNames).
+
+
+snmpOutBadValues(print) ->
+ gen_counter(print, snmpOutBadValues);
+snmpOutBadValues(get) ->
+ gen_counter(get, snmpOutBadValues).
+
+
+snmpOutGenErrs(print) ->
+ gen_counter(print, snmpOutGenErrs);
+snmpOutGenErrs(get) ->
+ gen_counter(get, snmpOutGenErrs).
+
+
+snmpOutGetRequests(print) ->
+ gen_counter(print, snmpOutGetRequests);
+snmpOutGetRequests(get) ->
+ gen_counter(get, snmpOutGetRequests).
+
+
+snmpOutSetRequests(print) ->
+ gen_counter(print, snmpOutSetRequests);
+snmpOutSetRequests(get) ->
+ gen_counter(get, snmpOutSetRequests).
+
+
+snmpOutGetNexts(print) ->
+ gen_counter(print, snmpOutGetNexts);
+snmpOutGetNexts(get) ->
+ gen_counter(get, snmpOutGetNexts).
+
+
+snmpOutGetResponses(print) ->
+ gen_counter(print, snmpOutGetResponses);
+snmpOutGetResponses(get) ->
+ gen_counter(get, snmpOutGetResponses).
+
+
+snmpOutTraps(print) ->
+ gen_counter(print, snmpOutTraps);
+snmpOutTraps(get) ->
+ gen_counter(get, snmpOutTraps).
+
+
+gen_counter(print, Counter) ->
+ Val = gen_counter(get, Counter),
+ VarAndValue = [{Counter, Val}],
+ snmpa_mib_lib:print_variables(VarAndValue);
+
+gen_counter(get, Counter) ->
+ variable_func(get, Counter).
+
+
%%-----------------------------------------------------------------
%% This is the instrumentation function for sysUpTime.
%%-----------------------------------------------------------------
+sysUpTime(print) ->
+ sys_up_time(print);
+sysUpTime(get) ->
+ sys_up_time(get).
+
sys_up_time() ->
snmpa:sys_up_time().
+sys_up_time(print) ->
+ VarAndValue = [{sysUpTime, sys_up_time(get)}],
+ snmpa_mib_lib:print_variables(VarAndValue);
+
sys_up_time(get) ->
{value, snmpa:sys_up_time()}.
+
%%-----------------------------------------------------------------
%% This is the instrumentation function for snmpEnableAuthenTraps
%%-----------------------------------------------------------------
+
+snmpEnableAuthenTraps(print) ->
+ snmp_enable_authen_traps(print);
+snmpEnableAuthenTraps(get) ->
+ snmp_enable_authen_traps(get).
+
+
+snmp_enable_authen_traps(print) ->
+ VarAndValue = [{snmpEnableAuthenTraps, snmp_enable_authen_traps(get)}],
+ snmpa_mib_lib:print_variables(VarAndValue);
+
snmp_enable_authen_traps(new) ->
snmp_generic:variable_func(new, db(snmpEnableAuthenTraps));
@@ -226,9 +487,19 @@ snmp_enable_authen_traps(get) ->
snmp_enable_authen_traps(set, NewVal) ->
snmp_generic:variable_func(set, NewVal, db(snmpEnableAuthenTraps)).
+
%%-----------------------------------------------------------------
-%% This is the instrumentation function for sysObjectId
+%% This is the instrumentation function for sysObjectID
%%-----------------------------------------------------------------
+sysObjectID(print) ->
+ sys_object_id(print);
+sysObjectID(get) ->
+ sys_object_id(get).
+
+sys_object_id(print) ->
+ VarAndValue = [{sysObjectID, sys_object_id(get)}],
+ snmpa_mib_lib:print_variables(VarAndValue);
+
sys_object_id(new) ->
snmp_generic:variable_func(new, db(sysObjectID));
@@ -241,6 +512,7 @@ sys_object_id(get) ->
sys_object_id(set, NewVal) ->
snmp_generic:variable_func(set, NewVal, db(sysObjectID)).
+
%%-----------------------------------------------------------------
%% This is a dummy instrumentation function for objects like
%% snmpTrapOID, that is accessible-for-notify, with different
@@ -249,6 +521,7 @@ sys_object_id(set, NewVal) ->
%%-----------------------------------------------------------------
dummy(_Op) -> ok.
+
%%-----------------------------------------------------------------
%% This is the instrumentation function for snmpSetSerialNo.
%% It is always volatile.
diff --git a/lib/snmp/src/agent/snmp_target_mib.erl b/lib/snmp/src/agent/snmp_target_mib.erl
index 3c32d1f59f..270a5fd5b6 100644
--- a/lib/snmp/src/agent/snmp_target_mib.erl
+++ b/lib/snmp/src/agent/snmp_target_mib.erl
@@ -511,6 +511,10 @@ set_target_engine_id(TargetAddrName, EngineId) ->
%%-----------------------------------------------------------------
%% Instrumentation Functions
%%-----------------------------------------------------------------
+snmpTargetSpinLock(print) ->
+ VarAndValue = [{snmpTargetSpinLock, snmpTargetSpinLock(get)}],
+ snmpa_mib_lib:print_variables(VarAndValue);
+
snmpTargetSpinLock(new) ->
snmp_generic:variable_func(new, {snmpTargetSpinLock, volatile}),
{A1,A2,A3} = erlang:now(),
@@ -591,12 +595,9 @@ snmpTargetAddrTable(print) ->
?'snmpTargetAddrRowStatus_active' -> active;
_ -> undefined
end,
- Prefix,
- element(?snmpTargetAddrEngineId, Row),
- Prefix,
- element(?snmpTargetAddrTMask, Row),
- Prefix,
- element(?snmpTargetAddrMMS, Row)]))
+ Prefix, element(?snmpTargetAddrEngineId, Row),
+ Prefix, element(?snmpTargetAddrTMask, Row),
+ Prefix, element(?snmpTargetAddrMMS, Row)]))
end,
snmpa_mib_lib:print_table(Table, DB, FOI, PrintRow);
%% Op == new | delete
diff --git a/lib/snmp/src/agent/snmp_user_based_sm_mib.erl b/lib/snmp/src/agent/snmp_user_based_sm_mib.erl
index f40bb1a5b9..69cebc858b 100644
--- a/lib/snmp/src/agent/snmp_user_based_sm_mib.erl
+++ b/lib/snmp/src/agent/snmp_user_based_sm_mib.erl
@@ -26,6 +26,12 @@
table_next/2,
is_engine_id_known/1, get_user/2, get_user_from_security_name/2,
mk_key_change/3, mk_key_change/5, extract_new_key/3, mk_random/1]).
+-export([usmStatsUnsupportedSecLevels/1,
+ usmStatsNotInTimeWindows/1,
+ usmStatsUnknownUserNames/1,
+ usmStatsUnknownEngineIDs/1,
+ usmStatsWrongDigests/1,
+ usmStatsDecryptionErrors/1]).
-export([add_user/1, add_user/13, delete_user/1]).
%% Internal
@@ -303,6 +309,54 @@ gc_tabs() ->
%%-----------------------------------------------------------------
%% Counter functions
%%-----------------------------------------------------------------
+
+usmStatsUnsupportedSecLevels(print) ->
+ VarAndValue = [{usmStatsUnsupportedSecLevels,
+ usmStatsUnsupportedSecLevels(get)}],
+ snmpa_mib_lib:print_variables(VarAndValue);
+usmStatsUnsupportedSecLevels(get) ->
+ get_counter(usmStatsUnsupportedSecLevels).
+
+usmStatsNotInTimeWindows(print) ->
+ VarAndValue = [{usmStatsNotInTimeWindows, usmStatsNotInTimeWindows(get)}],
+ snmpa_mib_lib:print_variables(VarAndValue);
+usmStatsNotInTimeWindows(get) ->
+ get_counter(usmStatsNotInTimeWindows).
+
+usmStatsUnknownUserNames(print) ->
+ VarAndValue = [{usmStatsUnknownUserNames, usmStatsUnknownUserNames(get)}],
+ snmpa_mib_lib:print_variables(VarAndValue);
+usmStatsUnknownUserNames(get) ->
+ get_counter(usmStatsUnknownUserNames).
+
+usmStatsUnknownEngineIDs(print) ->
+ VarAndValue = [{usmStatsUnknownEngineIDs, usmStatsUnknownEngineIDs(get)}],
+ snmpa_mib_lib:print_variables(VarAndValue);
+usmStatsUnknownEngineIDs(get) ->
+ get_counter(usmStatsUnknownEngineIDs).
+
+usmStatsWrongDigests(print) ->
+ VarAndValue = [{usmStatsWrongDigests, usmStatsWrongDigests(get)}],
+ snmpa_mib_lib:print_variables(VarAndValue);
+usmStatsWrongDigests(get) ->
+ get_counter(usmStatsWrongDigests).
+
+usmStatsDecryptionErrors(print) ->
+ VarAndValue = [{usmStatsDecryptionErrors, usmStatsDecryptionErrors(get)}],
+ snmpa_mib_lib:print_variables(VarAndValue);
+usmStatsDecryptionErrors(get) ->
+ get_counter(usmStatsDecryptionErrors).
+
+
+get_counter(Name) ->
+ case (catch ets:lookup(snmp_agent_table, Name)) of
+ [{_, Val}] ->
+ {value, Val};
+ _ ->
+ genErr
+ end.
+
+
init_vars() -> lists:map(fun maybe_create_var/1, vars()).
maybe_create_var(Var) ->
@@ -323,6 +377,7 @@ vars() ->
usmStatsDecryptionErrors
].
+
%%-----------------------------------------------------------------
%% API functions
%%-----------------------------------------------------------------
@@ -374,6 +429,11 @@ get_user_from_security_name(EngineID, SecName) ->
%%-----------------------------------------------------------------
%% Instrumentation Functions
%%-----------------------------------------------------------------
+
+usmUserSpinLock(print) ->
+ VarAndValue = [{usmUserSpinLock, usmUserSpinLock(get)}],
+ snmpa_mib_lib:print_variables(VarAndValue);
+
usmUserSpinLock(new) ->
snmp_generic:variable_func(new, {usmUserSpinLock, volatile}),
{A1,A2,A3} = erlang:now(),
diff --git a/lib/snmp/src/agent/snmp_view_based_acm_mib.erl b/lib/snmp/src/agent/snmp_view_based_acm_mib.erl
index 657207b36e..28469a7b4e 100644
--- a/lib/snmp/src/agent/snmp_view_based_acm_mib.erl
+++ b/lib/snmp/src/agent/snmp_view_based_acm_mib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -133,7 +133,6 @@ check_vacm({vacmSecurityToGroup, SecModel, SecName, GroupName}) ->
{ok, SecM} = snmp_conf:check_sec_model(SecModel, []),
snmp_conf:check_string(SecName),
snmp_conf:check_string(GroupName),
-
Vacm = {SecM, SecName, GroupName,
?'StorageType_nonVolatile', ?'RowStatus_active'},
{ok, {vacmSecurityToGroup, Vacm}};
@@ -181,15 +180,22 @@ init_tabs(Sec2Group, Access, View) ->
snmpa_local_db:table_delete(db(vacmSecurityToGroupTable)),
snmpa_local_db:table_create(db(vacmSecurityToGroupTable)),
init_sec2group_table(Sec2Group),
+
+ ?vdebug("create vacm access table",[]),
+ snmpa_vacm:cleanup(),
init_access_table(Access),
+
?vdebug("create vacm view-tree-family table",[]),
snmpa_local_db:table_delete(db(vacmViewTreeFamilyTable)),
snmpa_local_db:table_create(db(vacmViewTreeFamilyTable)),
- init_view_table(View).
+ init_view_table(View),
+
+ ?vdebug("table(s) initiated",[]),
+ ok.
init_sec2group_table([Row | T]) ->
-% ?vtrace("init security-to-group table: "
-% "~n Row: ~p",[Row]),
+%% ?vtrace("init security-to-group table: "
+%% "~n Row: ~p",[Row]),
Key1 = element(1, Row),
Key2 = element(2, Row),
Key = [Key1, length(Key2) | Key2],
@@ -198,12 +204,12 @@ init_sec2group_table([Row | T]) ->
init_sec2group_table([]) -> true.
init_access_table([{GN, Prefix, Model, Level, Row} | T]) ->
-% ?vtrace("init access table: "
-% "~n GN: ~p"
-% "~n Prefix: ~p"
-% "~n Model: ~p"
-% "~n Level: ~p"
-% "~n Row: ~p",[GN, Prefix, Model, Level, Row]),
+%% ?vtrace("init access table: "
+%% "~n GN: ~p"
+%% "~n Prefix: ~p"
+%% "~n Model: ~p"
+%% "~n Level: ~p"
+%% "~n Row: ~p",[GN, Prefix, Model, Level, Row]),
Key = [length(GN) | GN] ++ [length(Prefix) | Prefix] ++ [Model, Level],
snmpa_vacm:insert([{Key, Row}], false),
init_access_table(T);
@@ -211,8 +217,8 @@ init_access_table([]) ->
snmpa_vacm:dump_table().
init_view_table([Row | T]) ->
-% ?vtrace("init view table: "
-% "~n Row: ~p",[Row]),
+%% ?vtrace("init view table: "
+%% "~n Row: ~p",[Row]),
Key1 = element(1, Row),
Key2 = element(2, Row),
Key = [length(Key1) | Key1] ++ [length(Key2) | Key2],
@@ -348,6 +354,49 @@ vacmContextTable(Op, Arg1, Arg2) ->
snmp_framework_mib:intContextTable(Op, Arg1, Arg2).
+vacmSecurityToGroupTable(print) ->
+ Table = vacmSecurityToGroupTable,
+ DB = db(Table),
+ FOI = foi(Table),
+ PrintRow =
+ fun(Prefix, Row) ->
+ lists:flatten(
+ io_lib:format("~sSecurityModel: ~p (~w)"
+ "~n~sSecurityName: ~p"
+ "~n~sGroupName: ~p"
+ "~n~sStorageType: ~p (~w)"
+ "~n~sStatus: ~p (~w)",
+ [Prefix, element(?vacmSecurityModel, Row),
+ case element(?vacmSecurityModel, Row) of
+ ?SEC_ANY -> any;
+ ?SEC_V1 -> v1;
+ ?SEC_V2C -> v2c;
+ ?SEC_USM -> usm;
+ _ -> undefined
+ end,
+ Prefix, element(?vacmSecurityName, Row),
+ Prefix, element(?vacmGroupName, Row),
+ Prefix, element(?vacmSecurityToGroupStorageType, Row),
+ case element(?vacmSecurityToGroupStorageType, Row) of
+ ?'vacmSecurityToGroupStorageType_readOnly' -> readOnly;
+ ?'vacmSecurityToGroupStorageType_permanent' -> permanent;
+ ?'vacmSecurityToGroupStorageType_nonVolatile' -> nonVolatile;
+ ?'vacmSecurityToGroupStorageType_volatile' -> volatile;
+ ?'vacmSecurityToGroupStorageType_other' -> other;
+ _ -> undefined
+ end,
+ Prefix, element(?vacmSecurityToGroupStatus, Row),
+ case element(?vacmSecurityToGroupStatus, Row) of
+ ?'vacmSecurityToGroupStatus_destroy' -> destroy;
+ ?'vacmSecurityToGroupStatus_createAndWait' -> createAndWait;
+ ?'vacmSecurityToGroupStatus_createAndGo' -> createAndGo;
+ ?'vacmSecurityToGroupStatus_notReady' -> notReady;
+ ?'vacmSecurityToGroupStatus_notInService' -> notInService;
+ ?'vacmSecurityToGroupStatus_active' -> active;
+ _ -> undefined
+ end]))
+ end,
+ snmpa_mib_lib:print_table(Table, DB, FOI, PrintRow);
vacmSecurityToGroupTable(Op) ->
snmp_generic:table_func(Op, db(vacmSecurityToGroupTable)).
@@ -402,13 +451,13 @@ verify_vacmSecurityToGroupTable_cols([{Col, Val0}|Cols], Acc) ->
verify_vacmSecurityToGroupTable_col(?vacmSecurityModel, Model) ->
case Model of
any -> ?SEC_ANY;
- v1 -> ?SEC_ANY;
- v2c -> ?SEC_ANY;
- usm -> ?SEC_ANY;
+ v1 -> ?SEC_V1;
+ v2c -> ?SEC_V2C;
+ usm -> ?SEC_USM;
?SEC_ANY -> ?SEC_ANY;
- ?SEC_V1 -> ?SEC_ANY;
- ?SEC_V2C -> ?SEC_ANY;
- ?SEC_USM -> ?SEC_ANY;
+ ?SEC_V1 -> ?SEC_V1;
+ ?SEC_V2C -> ?SEC_V2C;
+ ?SEC_USM -> ?SEC_USM;
_ ->
?vlog("verification of vacmSecurityModel(~w) ~p failed",
[?vacmSecurityModel, Model]),
@@ -445,6 +494,49 @@ verify_vacmSecurityToGroupTable_col(_, Val) ->
%% {RowIndex, {Col4, Col5, ..., Col9}}
%%
%%-----------------------------------------------------------------
+vacmAccessTable(print) ->
+ %% M�ste jag g�ra om alla entrien till {RowIdx, Row}?
+ TableInfo = get_table(vacmAccessTable),
+ PrintRow =
+ fun(Prefix, Row) ->
+ lists:flatten(
+ io_lib:format("~sContextMatch: ~p (~w)"
+ "~n~sReadViewName: ~p"
+ "~n~sWriteViewName: ~p"
+ "~n~sNotifyViewName: ~p"
+ "~n~sStorageType: ~p (~w)"
+ "~n~sStatus: ~p (~w)",
+ [Prefix, element(?vacmAccessContextMatch-3, Row),
+ case element(?vacmAccessContextMatch-3, Row) of
+ ?vacmAccessContextMatch_exact -> exact;
+ ?vacmAccessContextMatch_prefix -> prefix;
+ _ -> undefined
+ end,
+ Prefix, element(?vacmAccessReadViewName-3, Row),
+ Prefix, element(?vacmAccessWriteViewName-3, Row),
+ Prefix, element(?vacmAccessNotifyViewName-3, Row),
+ Prefix, element(?vacmAccessStorageType-3, Row),
+ case element(?vacmAccessStorageType-3, Row) of
+ ?vacmAccessStorageType_other -> other ;
+ ?vacmAccessStorageType_volatile -> volatile;
+ ?vacmAccessStorageType_nonVolatile -> nonVolatile;
+ ?vacmAccessStorageType_permanent -> permanent;
+ ?vacmAccessStorageType_readOnly -> readOnly;
+ _ -> undefined
+ end,
+ Prefix, element(?vacmAccessStatus-3, Row),
+ case element(?vacmAccessStatus-3, Row) of
+ ?vacmAccessStatus_destroy -> destroy;
+ ?vacmAccessStatus_createAndWait -> createAndWait;
+ ?vacmAccessStatus_createAndGo -> createAndGo;
+ ?vacmAccessStatus_notReady -> notReady;
+ ?vacmAccessStatus_notInService -> notInService;
+ ?vacmAccessStatus_active -> active;
+ _ -> undefined
+ end
+ ]))
+ end,
+ snmpa_mib_lib:print_table(vacmAccessTable, {ok, TableInfo}, PrintRow);
vacmAccessTable(_Op) ->
ok.
vacmAccessTable(get, RowIndex, Cols) ->
@@ -540,24 +632,24 @@ verify_vacmAccessTable_col(?vacmAccessContextPrefix, Pref) ->
verify_vacmAccessTable_col(?vacmAccessSecurityModel, Model) ->
case Model of
any -> ?SEC_ANY;
- v1 -> ?SEC_ANY;
- v2c -> ?SEC_ANY;
- usm -> ?SEC_ANY;
+ v1 -> ?SEC_V1;
+ v2c -> ?SEC_V2C;
+ usm -> ?SEC_USM;
?SEC_ANY -> ?SEC_ANY;
- ?SEC_V1 -> ?SEC_ANY;
- ?SEC_V2C -> ?SEC_ANY;
- ?SEC_USM -> ?SEC_ANY;
+ ?SEC_V1 -> ?SEC_V1;
+ ?SEC_V2C -> ?SEC_V2C;
+ ?SEC_USM -> ?SEC_USM;
_ ->
wrongValue(?vacmAccessSecurityModel)
end;
verify_vacmAccessTable_col(?vacmAccessSecurityLevel, Level) ->
case Level of
- noAuthNoPriv -> 1;
- authNoPriv -> 2;
- authPriv -> 3;
- 1 -> 1;
- 2 -> 2;
- 3 -> 3;
+ noAuthNoPriv -> ?vacmAccessSecurityLevel_noAuthNoPriv;
+ authNoPriv -> ?vacmAccessSecurityLevel_authNoPriv;
+ authPriv -> ?vacmAccessSecurityLevel_authPriv;
+ ?vacmAccessSecurityLevel_noAuthNoPriv -> ?vacmAccessSecurityLevel_noAuthNoPriv;
+ ?vacmAccessSecurityLevel_authNoPriv -> ?vacmAccessSecurityLevel_authNoPriv;
+ ?vacmAccessSecurityLevel_authPriv -> ?vacmAccessSecurityLevel_authPriv;
_ -> wrongValue(?vacmAccessSecurityLevel)
end;
verify_vacmAccessTable_col(?vacmAccessContextMatch, Match) ->
@@ -664,6 +756,7 @@ do_get_next(RowIndex, Cols) ->
end
end.
+
%%-----------------------------------------------------------------
%% Functions to manipulate vacmAccessRows.
%%-----------------------------------------------------------------
@@ -696,29 +789,76 @@ split_cols([Col | Cols], PreCols) when Col =< 3 ->
split_cols(Cols, PreCols) ->
{PreCols, Cols}.
+vacmViewSpinLock(print) ->
+ VarAndValue = [{vacmViewSpinLock, vacmViewSpinLock(get)}],
+ snmpa_mib_lib:print_variables(VarAndValue);
+
vacmViewSpinLock(new) ->
- snmp_generic:variable_func(new, {vacmViewSpinLock, volatile}),
+ snmp_generic:variable_func(new, volatile_db(vacmViewSpinLock)),
{A1,A2,A3} = erlang:now(),
random:seed(A1,A2,A3),
Val = random:uniform(2147483648) - 1,
- snmp_generic:variable_func(set, Val, {vacmViewSpinLock, volatile});
+ snmp_generic:variable_func(set, Val, volatile_db(vacmViewSpinLock));
vacmViewSpinLock(delete) ->
ok;
vacmViewSpinLock(get) ->
- snmp_generic:variable_func(get, {vacmViewSpinLock, volatile}).
+ snmp_generic:variable_func(get, volatile_db(vacmViewSpinLock)).
vacmViewSpinLock(is_set_ok, NewVal) ->
- case snmp_generic:variable_func(get, {vacmViewSpinLock, volatile}) of
+ case snmp_generic:variable_func(get, volatile_db(vacmViewSpinLock)) of
{value, NewVal} -> noError;
_ -> inconsistentValue
end;
vacmViewSpinLock(set, NewVal) ->
snmp_generic:variable_func(set, (NewVal + 1) rem 2147483648,
- {vacmViewSpinLock, volatile}).
-
-
+ volatile_db(vacmViewSpinLock)).
+
+
+vacmViewTreeFamilyTable(print) ->
+ Table = vacmViewTreeFamilyTable,
+ DB = db(Table),
+ FOI = foi(Table),
+ PrintRow =
+ fun(Prefix, Row) ->
+ lists:flatten(
+ io_lib:format("~sViewName: ~p"
+ "~n~sSubtree: ~p"
+ "~n~sMask: ~p"
+ "~n~sType: ~p (~w)"
+ "~n~sStorageType: ~p (~w)"
+ "~n~sStatus: ~p (~w)",
+ [Prefix, element(?vacmViewTreeFamilyViewName, Row),
+ Prefix, element(?vacmViewTreeFamilySubtree, Row),
+ Prefix, element(?vacmViewTreeFamilyMask, Row),
+ Prefix, element(?vacmViewTreeFamilyType, Row),
+ case element(?vacmViewTreeFamilyType, Row) of
+ ?vacmViewTreeFamilyType_included -> included;
+ ?vacmViewTreeFamilyType_excluded -> excluded;
+ _ -> undefined
+ end,
+ Prefix, element(?vacmViewTreeFamilyStorageType, Row),
+ case element(?vacmViewTreeFamilyStorageType, Row) of
+ ?vacmViewTreeFamilyStorageType_readOnly -> readOnly;
+ ?vacmViewTreeFamilyStorageType_permanent -> permanent;
+ ?vacmViewTreeFamilyStorageType_nonVolatile -> nonVolatile;
+ ?vacmViewTreeFamilyStorageType_volatile -> volatile;
+ ?vacmViewTreeFamilyStorageType_other -> other;
+ _ -> undefined
+ end,
+ Prefix, element(?vacmViewTreeFamilyStatus, Row),
+ case element(?vacmViewTreeFamilyStatus, Row) of
+ ?vacmViewTreeFamilyStatus_destroy -> destroy;
+ ?vacmViewTreeFamilyStatus_createAndWait -> createAndWait;
+ ?vacmViewTreeFamilyStatus_createAndGo -> createAndGo;
+ ?vacmViewTreeFamilyStatus_notReady -> notReady;
+ ?vacmViewTreeFamilyStatus_notInService -> notInService;
+ ?vacmViewTreeFamilyStatus_active -> active;
+ _ -> undefined
+ end]))
+ end,
+ snmpa_mib_lib:print_table(Table, DB, FOI, PrintRow);
vacmViewTreeFamilyTable(Op) ->
snmp_generic:table_func(Op, db(vacmViewTreeFamilyTable)).
vacmViewTreeFamilyTable(get_next, RowIndex, Cols) ->
@@ -795,7 +935,25 @@ table_next(Name, RestOid) ->
snmp_generic:table_next(db(Name), RestOid).
-db(X) -> snmpa_agent:db(X).
+get_table(vacmAccessTable) ->
+ do_get_vacmAccessTable([], []).
+
+do_get_vacmAccessTable(Key0, Acc) ->
+ case snmpa_vacm:get_next_row(Key0) of
+ {Key, _Row} = Entry ->
+ do_get_vacmAccessTable(Key, [Entry | Acc]);
+ false ->
+ lists:reverse(Acc)
+ end.
+
+
+%%-----------------------------------------------------------------
+%% Wrappers
+%%-----------------------------------------------------------------
+
+db(X) -> snmpa_agent:db(X).
+volatile_db(X) -> {X, volatile}.
+
fa(vacmSecurityToGroupTable) -> ?vacmGroupName;
fa(vacmViewTreeFamilyTable) -> ?vacmViewTreeFamilyMask.
diff --git a/lib/snmp/src/agent/snmpa.erl b/lib/snmp/src/agent/snmpa.erl
index 87b191caed..22fbd33add 100644
--- a/lib/snmp/src/agent/snmpa.erl
+++ b/lib/snmp/src/agent/snmpa.erl
@@ -105,6 +105,8 @@
set_request_limit/1, set_request_limit/2
]).
+-export([print_mib_info/0, print_mib_tables/0, print_mib_variables/0]).
+
-include("snmpa_atl.hrl").
-define(EXTRA_INFO, undefined).
@@ -283,6 +285,186 @@ whereis_mib(Agent, Mib) when is_atom(Mib) ->
%% -
+mibs_info() ->
+ [
+ {snmp_standard_mib,
+ [],
+ [
+ sysDescr,
+ sysObjectID,
+ sysContact,
+ sysName,
+ sysLocation,
+ sysServices,
+ snmpEnableAuthenTraps,
+ sysUpTime,
+ snmpInPkts,
+ snmpOutPkts,
+ snmpInBadVersions,
+ snmpInBadCommunityNames,
+ snmpInBadCommunityUses,
+ snmpInASNParseErrs,
+ snmpInTooBigs,
+ snmpInNoSuchNames,
+ snmpInBadValues,
+ snmpInReadOnlys,
+ snmpInGenErrs,
+ snmpInTotalReqVars,
+ snmpInTotalSetVars,
+ snmpInGetRequests,
+ snmpInSetRequests,
+ snmpInGetNexts,
+ snmpInGetResponses,
+ snmpInTraps,
+ snmpOutTooBigs,
+ snmpOutNoSuchNames,
+ snmpOutBadValues,
+ snmpOutGenErrs,
+ snmpOutGetRequests,
+ snmpOutSetRequests,
+ snmpOutGetNexts,
+ snmpOutGetResponses,
+ snmpOutTraps
+ ]
+ },
+ {snmp_framework_mib,
+ [
+ ],
+ [
+ snmpEngineID,
+ snmpEngineBoots,
+ snmpEngineTime,
+ snmpEngineMaxMessageSize
+ ]
+ },
+ {snmp_view_based_acm_mib,
+ [
+ vacmAccessTable,
+ vacmSecurityToGroupTable,
+ vacmViewTreeFamilyTable
+ ],
+ [
+ vacmViewSpinLock
+ ]
+ },
+ {snmp_target_mib,
+ [
+ snmpTargetAddrTable,
+ snmpTargetParamsTable
+ ],
+ [
+ snmpTargetSpinLock
+ ]
+ },
+ {snmp_community_mib,
+ [
+ snmpCommunityTable
+ ],
+ []
+ },
+ {snmp_notification_mib,
+ [
+ snmpNotifyTable
+ ],
+ []},
+ {snmp_user_based_sm_mib,
+ [
+ usmUserTable
+ ],
+ [
+ usmUserSpinLock,
+ usmStatsUnsupportedSecLevels,
+ usmStatsNotInTimeWindows,
+ usmStatsUnknownUserNames,
+ usmStatsUnknownEngineIDs,
+ usmStatsWrongDigests,
+ usmStatsDecryptionErrors
+ ]
+ }
+ ].
+
+print_mib_info() ->
+ MibsInfo = mibs_info(),
+ print_mib_info(MibsInfo).
+
+print_mib_info([]) ->
+ io:format("~n", []),
+ ok;
+print_mib_info([{Mod, Tables, Variables} | MibsInfo]) ->
+ io:format("~n** ~s ** ~n~n", [make_pretty_mib(Mod)]),
+ print_mib_variables2(Mod, Variables),
+ print_mib_tables2(Mod, Tables),
+ io:format("~n", []),
+ print_mib_info(MibsInfo).
+
+
+print_mib_tables() ->
+ Tables = [{Mod, Tabs} || {Mod, Tabs, _Vars} <- mibs_info()],
+ print_mib_tables(Tables).
+
+print_mib_tables([]) ->
+ ok;
+print_mib_tables([{Mod, Tabs}|MibTabs])
+ when is_atom(Mod) andalso is_list(Tabs) ->
+ print_mib_tables(Mod, Tabs),
+ print_mib_tables(MibTabs);
+print_mib_tables([_|MibTabs]) ->
+ print_mib_tables(MibTabs).
+
+print_mib_tables(_Mod, [] = _Tables) ->
+ ok;
+print_mib_tables(Mod, Tables) ->
+ io:format("~n** ~s ** ~n~n", [make_pretty_mib(Mod)]),
+ print_mib_tables2(Mod, Tables),
+ io:format("~n", []).
+
+print_mib_tables2(Mod, Tables) ->
+ [(catch Mod:Table(print)) || Table <- Tables].
+
+
+print_mib_variables() ->
+ Variables = [{Mod, Vars} || {Mod, _Tabs, Vars} <- mibs_info()],
+ print_mib_variables(Variables).
+
+print_mib_variables([]) ->
+ ok;
+print_mib_variables([{Mod, Vars}|MibVars])
+ when is_atom(Mod) andalso is_list(Vars) ->
+ print_mib_variables(Mod, Vars),
+ print_mib_variables(MibVars);
+print_mib_variables([_|MibVars]) ->
+ print_mib_variables(MibVars).
+
+print_mib_variables(_Mod, [] = _Vars) ->
+ ok;
+print_mib_variables(Mod, Vars) ->
+ io:format("~n** ~s ** ~n~n", [make_pretty_mib(Mod)]),
+ print_mib_variables2(Mod, Vars),
+ io:format("~n", []).
+
+print_mib_variables2(Mod, Variables) ->
+ Vars = [{Var, (catch Mod:Var(get))} || Var <- Variables],
+ snmpa_mib_lib:print_variables(Vars).
+
+
+make_pretty_mib(snmp_view_based_acm_mib) ->
+ "SNMP-VIEW-BASED-ACM-MIB";
+make_pretty_mib(snmp_target_mib) ->
+ "SNMP-TARGET-MIB";
+make_pretty_mib(snmp_community_mib) ->
+ "SNMP-COMMUNITY-MIB";
+make_pretty_mib(snmp_notification_mib) ->
+ "SNMP-NOTIFICATION-MIB";
+make_pretty_mib(snmp_user_based_sm_mib) ->
+ "SNMP-USER-BASED-SM-MIB";
+make_pretty_mib(snmp_framework_mib) ->
+ "SNMP-FRAMEWORK-MIB";
+make_pretty_mib(Mod) ->
+ atom_to_list(Mod).
+
+
+%% -
+
mib_of(Oid) ->
snmpa_agent:mib_of(Oid).
diff --git a/lib/snmp/src/agent/snmpa_mib_lib.erl b/lib/snmp/src/agent/snmpa_mib_lib.erl
index 441228b9ee..078e681945 100644
--- a/lib/snmp/src/agent/snmpa_mib_lib.erl
+++ b/lib/snmp/src/agent/snmpa_mib_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -19,7 +19,8 @@
-module(snmpa_mib_lib).
-export([table_cre_row/3, table_del_row/2]).
--export([get_table/2, print_table/3, print_table/4, print_tables/1]).
+-export([get_table/2]).
+-export([print_variables/1, print_table/3, print_table/4, print_tables/1]).
-export([gc_tab/3, gc_tab/5]).
-include("SNMPv2-TC.hrl").
@@ -81,31 +82,69 @@ get_table(NameDb, FOI, Oid, Acc) ->
end.
+print_variables(Variables) when is_list(Variables) ->
+ Variables2 = print_variables_prefixify(Variables),
+ lists:foreach(fun({Variable, ValueResult, Prefix}) ->
+ print_variable(Variable, ValueResult, Prefix)
+ end, Variables2),
+ ok.
+
+print_variable(Variable, {value, Val}, Prefix) when is_atom(Variable) ->
+ io:format("~w~s=> ~p~n", [Variable, Prefix, Val]);
+print_variable(Variable, Error, Prefix) when is_atom(Variable) ->
+ io:format("~w~s=> [e] ~p~n", [Variable, Prefix, Error]).
+
+print_variables_prefixify(Variables) ->
+ MaxVarLength = print_variables_maxlength(Variables),
+ print_variables_prefixify(Variables, MaxVarLength, []).
+
+print_variables_prefixify([], _MaxVarLength, Acc) ->
+ lists:reverse(Acc);
+print_variables_prefixify([{Var, Res}|Variables], MaxVarLength, Acc) ->
+ Prefix = make_variable_print_prefix(Var, MaxVarLength),
+ print_variables_prefixify(Variables, MaxVarLength,
+ [{Var, Res, Prefix}|Acc]).
+
+make_variable_print_prefix(Var, MaxVarLength) ->
+ lists:duplicate(MaxVarLength - length(atom_to_list(Var)) + 1, $ ).
+
+print_variables_maxlength(Variables) ->
+ print_variables_maxlength(Variables, 0).
+
+print_variables_maxlength([], MaxLength) ->
+ MaxLength;
+print_variables_maxlength([{Var, _}|Variables], MaxLength) when is_atom(Var) ->
+ VarLen = length(atom_to_list(Var)),
+ if
+ VarLen > MaxLength ->
+ print_variables_maxlength(Variables, VarLen);
+ true ->
+ print_variables_maxlength(Variables, MaxLength)
+ end.
+
+
print_tables(Tables) when is_list(Tables) ->
lists:foreach(fun({Table, DB, FOI, PrintRow}) ->
print_table(Table, DB, FOI, PrintRow)
end, Tables),
ok.
-%% print_table(Table, DB, FOI, PrintRow) ->
-%% TableInfo = get_table(DB(Table), FOI(Table)),
-%% print_table(Table, TableInfo, PrintRow),
-%% ok.
-
print_table(Table, DB, FOI, PrintRow) ->
TableInfo = get_table(DB, FOI),
print_table(Table, TableInfo, PrintRow).
print_table(Table, TableInfo, PrintRow) when is_function(PrintRow, 2) ->
- io:format("~w => ~n", [Table]),
+ io:format("~w =>", [Table]),
do_print_table(TableInfo, PrintRow).
+do_print_table({ok, [] = _TableInfo}, _PrintRow) ->
+ io:format(" -~n", []);
do_print_table({ok, TableInfo}, PrintRow) when is_function(PrintRow, 2) ->
+ io:format("~n", []),
lists:foreach(fun({RowIdx, Row}) ->
io:format(" ~w => ~n~s~n",
[RowIdx, PrintRow(" ", Row)])
- end, TableInfo),
- io:format("~n", []);
+ end, TableInfo);
do_print_table({error, {invalid_rowindex, BadRowIndex, []}}, _PrintRow) ->
io:format("Error: Bad rowindex ~w~n", [BadRowIndex]);
do_print_table({error, {invalid_rowindex, BadRowIndex, TableInfo}}, PrintRow) ->
diff --git a/lib/snmp/src/agent/snmpa_vacm.erl b/lib/snmp/src/agent/snmpa_vacm.erl
index 2eacea4301..892dc265f1 100644
--- a/lib/snmp/src/agent/snmpa_vacm.erl
+++ b/lib/snmp/src/agent/snmpa_vacm.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2010. 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
@@ -21,7 +21,7 @@
-export([get_mib_view/5]).
-export([init/1, init/2, backup/1]).
-export([delete/1, get_row/1, get_next_row/1, insert/1, insert/2,
- dump_table/0]).
+ cleanup/0, dump_table/0]).
-include("SNMPv2-TC.hrl").
-include("SNMP-VIEW-BASED-ACM-MIB.hrl").
@@ -256,6 +256,11 @@ delete(Key) ->
ets:delete(snmpa_vacm, Key),
dump_table().
+
+cleanup() ->
+ ets:delete_all_objects(snmpa_vacm),
+ dump_table().
+
dump_table(true) ->
dump_table();
dump_table(_) ->
diff --git a/lib/snmp/src/app/snmp.appup.src b/lib/snmp/src/app/snmp.appup.src
index 2375e3df70..de0e5d6e14 100644
--- a/lib/snmp/src/app/snmp.appup.src
+++ b/lib/snmp/src/app/snmp.appup.src
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -22,43 +22,30 @@
%% ----- U p g r a d e -------------------------------------------------------
[
- {"4.17.1",
+ {"4.18",
[
- {load_module, snmp_community_mib, soft_purge, soft_purge, []},
- {load_module, snmp_framework_mib, soft_purge, soft_purge, []},
- {load_module, snmp_generic, soft_purge, soft_purge, []},
- {load_module, snmp_notification_mib, soft_purge, soft_purge, []},
- {load_module, snmp_standard_mib, soft_purge, soft_purge, []},
- {load_module, snmp_target_mib, soft_purge, soft_purge, []},
- {load_module, snmp_user_based_sm_mib, soft_purge, soft_purge, []},
- {load_module, snmp_view_based_acm_mib, soft_purge, soft_purge, []},
- {load_module, snmpa_conf, soft_purge, soft_purge, []},
- {update, snmpa_target_cache, soft, soft_purge, soft_purge, []},
- {load_module, snmpa_usm, soft_purge, soft_purge, []},
- {load_module, snmpm, soft_purge, soft_purge, []},
- {load_module, snmpm_conf, soft_purge, soft_purge, []},
- {update, snmpm_config, soft, soft_purge, soft_purge, []},
- {load_module, snmpm_usm, soft_purge, soft_purge, []}
- ]
- },
- {"4.17",
- [
- {load_module, snmp_community_mib, soft_purge, soft_purge, []},
- {load_module, snmp_framework_mib, soft_purge, soft_purge, []},
- {load_module, snmp_generic, soft_purge, soft_purge, []},
- {load_module, snmp_notification_mib, soft_purge, soft_purge, []},
- {load_module, snmp_standard_mib, soft_purge, soft_purge, []},
- {load_module, snmp_target_mib, soft_purge, soft_purge, []},
- {load_module, snmp_user_based_sm_mib, soft_purge, soft_purge, []},
- {load_module, snmp_view_based_acm_mib, soft_purge, soft_purge, []},
- {load_module, snmpa_conf, soft_purge, soft_purge, []},
- {update, snmpa_target_cache, soft, soft_purge, soft_purge, []},
- {load_module, snmpa_usm, soft_purge, soft_purge, []},
- {load_module, snmpm, soft_purge, soft_purge, []},
- {load_module, snmpm_conf, soft_purge, soft_purge, []},
- {update, snmpm_config, soft, soft_purge, soft_purge, []},
- {load_module, snmpm_usm, soft_purge, soft_purge, []},
- {load_module, snmpa_net_if, soft_purge, soft_purge, []}
+ {load_module, snmp_misc, soft_purge, soft_purge, []},
+ {load_module, snmpa_vacm, soft_purge, soft_purge, []},
+ {load_module, snmpa, soft_purge, soft_purge,
+ [snmp_community_mib,
+ snmp_framework_mib,
+ snmp_standard_mib,
+ snmp_target_mib,
+ snmp_user_based_sm_mib,
+ snmp_view_based_acm_mib]},
+ {load_module, snmp_community_mib, soft_purge, soft_purge,
+ [snmpa_mib_lib]},
+ {load_module, snmp_framework_mib, soft_purge, soft_purge,
+ [snmpa_mib_lib]},
+ {load_module, snmp_standard_mib, soft_purge, soft_purge,
+ [snmpa_mib_lib]},
+ {load_module, snmp_target_mib, soft_purge, soft_purge,
+ [snmpa_mib_lib]},
+ {load_module, snmp_user_based_sm_mib, soft_purge, soft_purge,
+ [snmpa_mib_lib]},
+ {load_module, snmp_view_based_acm_mib, soft_purge, soft_purge,
+ [snmpa_mib_lib, snmpa_vacm]},
+ {load_module, snmpa_mib_lib, soft_purge, soft_purge, []}
]
}
],
@@ -66,43 +53,30 @@
%% ------D o w n g r a d e ---------------------------------------------------
[
- {"4.17.1",
- [
- {load_module, snmp_community_mib, soft_purge, soft_purge, []},
- {load_module, snmp_framework_mib, soft_purge, soft_purge, []},
- {load_module, snmp_generic, soft_purge, soft_purge, []},
- {load_module, snmp_notification_mib, soft_purge, soft_purge, []},
- {load_module, snmp_standard_mib, soft_purge, soft_purge, []},
- {load_module, snmp_target_mib, soft_purge, soft_purge, []},
- {load_module, snmp_user_based_sm_mib, soft_purge, soft_purge, []},
- {load_module, snmp_view_based_acm_mib, soft_purge, soft_purge, []},
- {load_module, snmpa_conf, soft_purge, soft_purge, []},
- {update, snmpa_target_cache, soft, soft_purge, soft_purge, []},
- {load_module, snmpa_usm, soft_purge, soft_purge, []},
- {load_module, snmpm, soft_purge, soft_purge, []},
- {load_module, snmpm_conf, soft_purge, soft_purge, []},
- {update, snmpm_config, soft, soft_purge, soft_purge, []},
- {load_module, snmpm_usm, soft_purge, soft_purge, []}
- ]
- },
- {"4.17",
+ {"4.18",
[
- {load_module, snmp_community_mib, soft_purge, soft_purge, []},
- {load_module, snmp_framework_mib, soft_purge, soft_purge, []},
- {load_module, snmp_generic, soft_purge, soft_purge, []},
- {load_module, snmp_notification_mib, soft_purge, soft_purge, []},
- {load_module, snmp_standard_mib, soft_purge, soft_purge, []},
- {load_module, snmp_target_mib, soft_purge, soft_purge, []},
- {load_module, snmp_user_based_sm_mib, soft_purge, soft_purge, []},
- {load_module, snmp_view_based_acm_mib, soft_purge, soft_purge, []},
- {load_module, snmpa_conf, soft_purge, soft_purge, []},
- {update, snmpa_target_cache, soft, soft_purge, soft_purge, []},
- {load_module, snmpa_usm, soft_purge, soft_purge, []},
- {load_module, snmpm, soft_purge, soft_purge, []},
- {load_module, snmpm_conf, soft_purge, soft_purge, []},
- {update, snmpm_config, soft, soft_purge, soft_purge, []},
- {load_module, snmpm_usm, soft_purge, soft_purge, []},
- {load_module, snmpa_net_if, soft_purge, soft_purge, []}
+ {load_module, snmp_misc, soft_purge, soft_purge, []},
+ {load_module, snmpa_vacm, soft_purge, soft_purge, []},
+ {load_module, snmpa, soft_purge, soft_purge,
+ [snmp_community_mib,
+ snmp_framework_mib,
+ snmp_standard_mib,
+ snmp_target_mib,
+ snmp_user_based_sm_mib,
+ snmp_view_based_acm_mib]},
+ {load_module, snmp_community_mib, soft_purge, soft_purge,
+ [snmpa_mib_lib]},
+ {load_module, snmp_framework_mib, soft_purge, soft_purge,
+ [snmpa_mib_lib]},
+ {load_module, snmp_standard_mib, soft_purge, soft_purge,
+ [snmpa_mib_lib]},
+ {load_module, snmp_target_mib, soft_purge, soft_purge,
+ [snmpa_mib_lib]},
+ {load_module, snmp_user_based_sm_mib, soft_purge, soft_purge,
+ [snmpa_mib_lib]},
+ {load_module, snmp_view_based_acm_mib, soft_purge, soft_purge,
+ [snmpa_mib_lib, snmpa_vacm]},
+ {load_module, snmpa_mib_lib, soft_purge, soft_purge, []}
]
}
]
diff --git a/lib/snmp/src/compile/Makefile b/lib/snmp/src/compile/Makefile
index 4be60e1835..0ceaf276a6 100644
--- a/lib/snmp/src/compile/Makefile
+++ b/lib/snmp/src/compile/Makefile
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2009. All Rights Reserved.
+# Copyright Ericsson AB 1997-2011. 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
@@ -20,6 +20,7 @@
include $(ERL_TOP)/make/target.mk
EBIN = ../../ebin
+BIN = ../../bin
include $(ERL_TOP)/make/$(TARGET)/otp.mk
@@ -44,9 +45,11 @@ RELSYSDIR = $(RELEASE_PATH)/lib/snmp-$(VSN)
include modules.mk
+ESCRIPT_BIN = $(ESCRIPT_SRC:%.src=$(BIN)/%)
+
ERL_FILES = $(MODULES:%=%.erl)
-TARGET_FILES = $(MODULES:%=$(EBIN)/%.$(EMULATOR))
+TARGET_FILES = $(MODULES:%=$(EBIN)/%.$(EMULATOR)) $(ESCRIPT_BIN)
GENERATED_PARSER = $(PARSER_MODULE:%=%.erl)
@@ -97,8 +100,12 @@ info:
@echo ""
@echo "EBIN: $(EBIN)"
@echo ""
+ @echo "ESCRIPT_SRC: $(ESCRIPT_SRC)"
+ @echo "ESCRIPT_BIN: $(ESCRIPT_BIN)"
+ @echo ""
@echo ""
+
# ----------------------------------------------------
# Special Build Targets
# ----------------------------------------------------
@@ -107,6 +114,7 @@ parser: $(PARSER_TARGET)
$(GENERATED_PARSER): $(PARSER_SRC)
+
# ----------------------------------------------------
# Release Target
# ----------------------------------------------------
@@ -115,9 +123,11 @@ include $(ERL_TOP)/make/otp_release_targets.mk
release_spec: opt
$(INSTALL_DIR) $(RELSYSDIR)/src
$(INSTALL_DIR) $(RELSYSDIR)/src/compiler
- $(INSTALL_DATA) $(PARSER_SRC) $(ERL_FILES) $(INTERNAL_HRL_FILES) $(RELSYSDIR)/src/compiler
+ $(INSTALL_DATA) $(ESCRIPT_SRC) $(PARSER_SRC) $(ERL_FILES) $(INTERNAL_HRL_FILES) $(RELSYSDIR)/src/compiler
$(INSTALL_DIR) $(RELSYSDIR)/ebin
$(INSTALL_DATA) $(TARGET_FILES) $(RELSYSDIR)/ebin
+ $(INSTALL_DIR) $(RELSYSDIR)/bin
+ $(INSTALL_SCRIPT) $(ESCRIPT_BIN) $(RELSYSDIR)/bin
release_docs_spec:
diff --git a/lib/snmp/src/compile/depend.mk b/lib/snmp/src/compile/depend.mk
index 75af1bf293..f7084f8bcd 100644
--- a/lib/snmp/src/compile/depend.mk
+++ b/lib/snmp/src/compile/depend.mk
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2004-2009. All Rights Reserved.
+# Copyright Ericsson AB 2004-2011. 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
@@ -44,3 +44,6 @@ $(EBIN)/snmpc_mib_gram.$(EMULATOR): \
../../include/snmp_types.hrl \
snmpc_mib_gram.erl
+$(BIN)/snmpc: snmpc.src
+ $(PERL) -p -e 's?%VSN%?$(VSN)? ' < $< > $@
+ chmod 755 $@
diff --git a/lib/snmp/src/compile/modules.mk b/lib/snmp/src/compile/modules.mk
index 6365b0e694..399e4f865e 100644
--- a/lib/snmp/src/compile/modules.mk
+++ b/lib/snmp/src/compile/modules.mk
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2004-2009. All Rights Reserved.
+# Copyright Ericsson AB 2004-2011. 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
@@ -21,6 +21,9 @@ PARSER_SRC = snmpc_mib_gram.yrl
PARSER_MODULE = $(PARSER_SRC:%.yrl=%)
+ESCRIPT_SRC = \
+ snmpc.src
+
MODULES = \
$(PARSER_MODULE) \
snmpc \
diff --git a/lib/snmp/src/compile/snmpc.erl b/lib/snmp/src/compile/snmpc.erl
index a7f2cdc2bc..195c238184 100644
--- a/lib/snmp/src/compile/snmpc.erl
+++ b/lib/snmp/src/compile/snmpc.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -112,6 +112,8 @@ compile(FileName) ->
%% description
%% reference
%% imports
+%% agent_capabilities
+%% module_compliance
%% module_identity
%% {module, string()}
%% no_defs
@@ -203,6 +205,10 @@ get_options([imports|Opts], Formats, Args) ->
get_options(Opts, ["~n imports"|Formats], Args);
get_options([module_identity|Opts], Formats, Args) ->
get_options(Opts, ["~n module_identity"|Formats], Args);
+get_options([module_compliance|Opts], Formats, Args) ->
+ get_options(Opts, ["~n module_compliance"|Formats], Args);
+get_options([agent_capabilities|Opts], Formats, Args) ->
+ get_options(Opts, ["~n agent_capabilities"|Formats], Args);
get_options([relaxed_row_name_assign_check|Opts], Formats, Args) ->
get_options(Opts, ["~n relaxed_row_name_assign_check"|Formats], Args);
get_options([_|Opts], Formats, Args) ->
@@ -288,6 +294,10 @@ check_options([imports| T]) ->
check_options(T);
check_options([module_identity| T]) ->
check_options(T);
+check_options([module_compliance| T]) ->
+ check_options(T);
+check_options([agent_capabilities| T]) ->
+ check_options(T);
check_options([relaxed_row_name_assign_check| T]) ->
check_options(T);
check_options([{module, M} | T]) when is_atom(M) ->
@@ -315,6 +325,12 @@ get_description(Options) ->
get_reference(Options) ->
get_bool_option(reference, Options).
+get_agent_capabilities(Options) ->
+ get_bool_option(agent_capabilities, Options).
+
+get_module_compliance(Options) ->
+ get_bool_option(module_compliance, Options).
+
get_relaxed_row_name_assign_check(Options) ->
lists:member(relaxed_row_name_assign_check, Options).
@@ -387,10 +403,12 @@ get_verbosity(Options) ->
init(From, MibFileName, Options) ->
{A,B,C} = now(),
random:seed(A,B,C),
- put(options, Options),
- put(verbosity, get_verbosity(Options)),
- put(description, get_description(Options)),
- put(reference, get_reference(Options)),
+ put(options, Options),
+ put(verbosity, get_verbosity(Options)),
+ put(description, get_description(Options)),
+ put(reference, get_reference(Options)),
+ put(agent_capabilities, get_agent_capabilities(Options)),
+ put(module_compliance, get_module_compliance(Options)),
File = filename:rootname(MibFileName, ".mib"),
put(filename, filename:basename(File ++ ".mib")),
R = case catch c_impl(File) of
@@ -876,12 +894,12 @@ definitions_loop([{#mc_object_type{name = NameOfEntry,
definitions_loop([{#mc_notification{name = TrapName,
status = deprecated}, Line}|T],
- false) ->
+ #dldata{deprecated = false} = Data) ->
?vinfo2("defloop -> notification ~w is deprecated => ignored",
[TrapName], Line),
update_status(TrapName, deprecated),
ensure_macro_imported('NOTIFICATION-TYPE', Line),
- definitions_loop(T, false);
+ definitions_loop(T, Data);
definitions_loop([{#mc_notification{name = TrapName,
status = obsolete}, Line}|T],
@@ -921,10 +939,96 @@ definitions_loop([{#mc_notification{name = TrapName,
snmpc_lib:add_cdata(#cdata.traps, [Notif]),
definitions_loop(T, Data);
-definitions_loop([{#mc_module_compliance{name = Name},Line}|T], Data) ->
- ?vlog2("defloop -> module_compliance:"
- "~n Name: ~p", [Name], Line),
+definitions_loop([{#mc_agent_capabilities{name = Name,
+ status = Status,
+ description = Desc,
+ reference = Ref,
+ modules = Mods,
+ name_assign = {Parent, SubIdx}},Line}|T], Data) ->
+ ?vlog2("defloop -> agent_capabilities ~p:"
+ "~n Status: ~p"
+ "~n Desc: ~p"
+ "~n Ref: ~p"
+ "~n Mods: ~p"
+ "~n Parent: ~p"
+ "~n SubIndex: ~p",
+ [Name, Status, Desc, Ref, Mods, Parent, SubIdx], Line),
+ ensure_macro_imported('AGENT-CAPABILITIES', Line),
+ case get(agent_capabilities) of
+ true ->
+ update_status(Name, Status),
+ snmpc_lib:register_oid(Line, Name, Parent, SubIdx),
+ NewME = snmpc_lib:makeInternalNode2(false, Name),
+ Description = make_description(Desc),
+ Reference =
+ case Ref of
+ undefined ->
+ [];
+ _ ->
+ [{reference, Ref}]
+ end,
+ Modules =
+ case Mods of
+ undefined ->
+ [];
+ [] ->
+ [];
+ _ ->
+ [{modules, Mods}]
+ end,
+ AssocList = Reference ++ Modules,
+ NewME2 = NewME#me{description = Description,
+ assocList = AssocList},
+ snmpc_lib:add_cdata(#cdata.mes, [NewME2]);
+ _ ->
+ ok
+ end,
+ definitions_loop(T, Data);
+
+definitions_loop([{#mc_module_compliance{name = Name,
+ status = Status,
+ description = Desc,
+ reference = Ref,
+ modules = Mods,
+ name_assign = {Parent, SubIdx}},Line}|T], Data) ->
+ ?vlog2("defloop -> module_compliance: ~p"
+ "~n Status: ~p"
+ "~n Desc: ~p"
+ "~n Ref: ~p"
+ "~n Mods: ~p"
+ "~n Parent: ~p"
+ "~n SubIndex: ~p",
+ [Name, Status, Desc, Ref, Mods, Parent, SubIdx], Line),
ensure_macro_imported('MODULE-COMPLIANCE', Line),
+ case get(module_compliance) of
+ true ->
+ update_status(Name, Status),
+ snmpc_lib:register_oid(Line, Name, Parent, SubIdx),
+ NewME = snmpc_lib:makeInternalNode2(false, Name),
+ Description = make_description(Desc),
+ Reference =
+ case Ref of
+ undefined ->
+ [];
+ _ ->
+ [{reference, Ref}]
+ end,
+ Modules =
+ case Mods of
+ undefined ->
+ [];
+ [] ->
+ [];
+ _ ->
+ [{modules, Mods}]
+ end,
+ AssocList = Reference ++ Modules,
+ NewME2 = NewME#me{description = Description,
+ assocList = AssocList},
+ snmpc_lib:add_cdata(#cdata.mes, [NewME2]);
+ _ ->
+ ok
+ end,
definitions_loop(T, Data);
definitions_loop([{#mc_object_group{name = Name,
@@ -1328,22 +1432,26 @@ save(Filename, MibName, Options) ->
parse(FileName) ->
+%% ?vtrace("parse -> start tokenizer for ~p", [FileName]),
case snmpc_tok:start_link(reserved_words(),
[{file, FileName ++ ".mib"},
{forget_stringdata, true}]) of
{error,ReasonStr} ->
snmpc_lib:error(lists:flatten(ReasonStr),[]);
{ok, TokPid} ->
+%% ?vtrace("parse -> tokenizer start, now get tokens", []),
Toks = snmpc_tok:get_all_tokens(TokPid),
+%% ?vtrace("parse -> tokens: ~p", [Toks]),
set_version(Toks),
- %% io:format("parse -> lexical analysis: ~n~p~n", [Toks]),
- %% t("parse -> lexical analysis: ~n~p", [Toks]),
+ %% ?vtrace("parse -> lexical analysis: ~n~p", [Toks]),
CDataArg =
case lists:keysearch(module, 1, get(options)) of
{value, {module, M}} -> {module, M};
_ -> {file, FileName ++ ".funcs"}
end,
put(cdata,snmpc_lib:make_cdata(CDataArg)),
+%% ?vtrace("parse -> stop tokenizer and then do the actual parse",
+%% []),
snmpc_tok:stop(TokPid),
Res = if
is_list(Toks) ->
@@ -1351,7 +1459,7 @@ parse(FileName) ->
true ->
Toks
end,
- %% t("parse -> parsed: ~n~p", [Res]),
+%% ?vtrace("parse -> parsed result: ~n~p", [Res]),
case Res of
{ok, PData} ->
{ok, PData};
@@ -1443,6 +1551,10 @@ reserved_words() ->
'NOTIFICATION-GROUP',
'NOTIFICATIONS',
'MODULE-COMPLIANCE',
+ 'AGENT-CAPABILITIES',
+ 'PRODUCT-RELEASE',
+ 'SUPPORTS',
+ 'INCLUDES',
'MODULE',
'MANDATORY-GROUPS',
'GROUP',
diff --git a/lib/snmp/src/compile/snmpc.hrl b/lib/snmp/src/compile/snmpc.hrl
index eb896cde6b..1c0808d065 100644
--- a/lib/snmp/src/compile/snmpc.hrl
+++ b/lib/snmp/src/compile/snmpc.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -103,16 +103,75 @@
).
+-record(mc_agent_capabilities,
+ {name,
+ product_release,
+ status,
+ description,
+ reference,
+ modules,
+ name_assign
+ }
+ ).
+
+-record(mc_ac_module,
+ {name,
+ groups,
+ variation
+ }
+ ).
+
+-record(mc_ac_object_variation,
+ {name,
+ syntax,
+ write_syntax,
+ access,
+ creation,
+ default_value,
+ description
+ }
+ ).
+
+-record(mc_ac_notification_variation,
+ {name,
+ access,
+ description
+ }
+ ).
+
+
-record(mc_module_compliance,
{name,
status,
description,
reference,
- module,
+ modules,
name_assign
}
).
+-record(mc_mc_compliance_group,
+ {name,
+ description
+ }
+ ).
+
+-record(mc_mc_object,
+ {name,
+ syntax,
+ write_syntax,
+ access,
+ description
+ }
+ ).
+
+-record(mc_mc_module,
+ {name,
+ mandatory,
+ compliance
+ }
+ ).
+
-record(mc_object_group,
{name,
diff --git a/lib/snmp/src/compile/snmpc.src b/lib/snmp/src/compile/snmpc.src
new file mode 100644
index 0000000000..5f9b154bfa
--- /dev/null
+++ b/lib/snmp/src/compile/snmpc.src
@@ -0,0 +1,381 @@
+#!/usr/bin/env escript
+%% -*- erlang -*-
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2008-2011. 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%
+%%
+%% SNMP MIB compiler frontend
+%%
+
+-mode(compile).
+
+-include_lib("kernel/include/file.hrl").
+-include_lib("snmp/include/snmp_types.hrl").
+
+
+-record(state,
+ {
+ version = "%VSN%",
+ mfv,
+ file, % .mib or .bin depending on which are compiled
+ outdir = "./",
+ db = volatile,
+ include_dirs = ["./"],
+ include_lib_dirs = [],
+ deprecated = false,
+ group_check = true,
+ description = false,
+ reference = false,
+ imports = false,
+ module_identity = false,
+ module_compliance = false,
+ agent_capabilities = false,
+ module,
+ no_defaults = false,
+ relaxed_row_name_assigne_check = false,
+ %% The default verbosity (silence) will be filled in
+ %% during argument processing.
+ verbosity,
+ warnings = false
+ }).
+
+
+%% ------------------------------------------------------------------------
+%% Valid arguments:
+%% --o Dir [defaults to "./"]
+%% --i Dir [defaults to "./"]
+%% --il Dir
+%% --sgc
+%% --db DB [defaults to volatile]
+%% --dep
+%% --desc
+%% --ref
+%% --imp
+%% --mi
+%% --mc
+%% --ac
+%% --mod Mod
+%% --nd
+%% --rrnac
+%% --version
+%% --verbosity V
+%% --warnings
+main(Args) when is_list(Args) ->
+ case (catch process_args(Args)) of
+ ok ->
+ usage();
+ {ok, State} when is_record(State, state) ->
+ compile(State);
+ {ok, Str} when is_list(Str) ->
+ io:format("~s~n~n", [Str]),
+ halt(1);
+ {error, ReasonStr} ->
+ usage(ReasonStr)
+ end;
+main(_) ->
+ usage().
+
+compile(State) ->
+ %% io:format("snmpc: ~p~n", [State]),
+ case mk_file(State) of
+ {mib, File} ->
+ Options = mk_mib_options(State),
+ case mib2bin(File, Options) of
+ {ok, _BinFileName} ->
+ ok;
+ {error, Reason} ->
+ io:format("ERROR: Failed compiling mib: "
+ "~n ~p~n", [Reason]),
+ halt(1)
+ end;
+ {bin, File} ->
+ Options = mk_hrl_options(State),
+ case bin2hrl(File, Options) of
+ ok ->
+ ok;
+ {error, Reason} ->
+ io:format("ERROR: Failed generating hrl from mib: "
+ "~n ~p~n", [Reason]),
+ halt(1)
+ end
+ end.
+
+mib2bin(MibFileName, Options) ->
+ snmpc:compile(MibFileName, Options).
+
+bin2hrl(BinFileName, {OutDir, Verbosity}) ->
+ MibName = filename:basename(BinFileName),
+ BinFile = BinFileName ++ ".bin",
+ HrlFile = filename:join(OutDir, MibName) ++ ".hrl",
+ put(verbosity, Verbosity),
+ snmpc_mib_to_hrl:convert(BinFile, HrlFile, MibName).
+
+
+mk_file(#state{file = MIB}) ->
+ DirName = filename:dirname(MIB),
+ case filename:extension(MIB) of
+ ".mib" ->
+ BaseName = filename:basename(MIB, ".mib"),
+ {mib, filename:join(DirName, BaseName)};
+ ".bin" ->
+ BaseName = filename:basename(MIB, ".bin"),
+ {bin, filename:join(DirName, BaseName)};
+ BadExt ->
+ e(lists:flatten(io_lib:format("Unsupported file type: ~s", [BadExt])))
+ end.
+
+mk_mib_options(#state{outdir = OutDir,
+ db = DB,
+ include_dirs = IDs,
+ include_lib_dirs = ILDs,
+ deprecated = Dep,
+ group_check = GC,
+ description = Desc,
+ reference = Ref,
+ imports = Imp,
+ module_identity = MI,
+ module_compliance = MC,
+ agent_capabilities = AC,
+ module = Mod,
+ no_defaults = ND,
+ relaxed_row_name_assigne_check = RRNAC,
+ %% The default verbosity (silence) will be filled in
+ %% during argument processing.
+ verbosity = V,
+ warnings = W}) ->
+ [{outdir, OutDir},
+ {db, DB},
+ {i, IDs},
+ {il, ILDs},
+ {group_check, GC},
+ {verbosity, V},
+ {warnings, W},
+ {deprecated, Dep}] ++
+ if
+ (Mod =/= undefined) ->
+ [{module, Mod}];
+ true ->
+ []
+ end ++
+ maybe_option(ND, no_defs) ++
+ maybe_option(RRNAC, relaxed_row_name_assign_check) ++
+ maybe_option(Desc, description) ++
+ maybe_option(Ref, reference) ++
+ maybe_option(Imp, imports) ++
+ maybe_option(MI, module_identity) ++
+ maybe_option(MC, module_compliance) ++
+ maybe_option(AC, agent_capabilities).
+
+maybe_option(true, Opt) -> [Opt];
+maybe_option(_, _) -> [].
+
+
+mk_hrl_options(#state{outdir = OutDir,
+ verbosity = Verbosity}) ->
+ {OutDir, Verbosity}.
+
+
+process_args([]) ->
+ e("No input file");
+process_args(Args) ->
+ #mib{mib_format_version = MFV} = #mib{},
+ State = #state{},
+ process_args(Args, State#state{mfv = MFV}).
+
+process_args([], #state{verbosity = Verbosity0, file = MIB} = State) ->
+ if
+ (MIB =:= undefined) ->
+ e("No input file");
+ true ->
+ Verbosity =
+ case Verbosity0 of
+ undefined ->
+ silence;
+ _ ->
+ Verbosity0
+ end,
+ IPath = lists:reverse(State#state.include_dirs),
+ IlPath = lists:reverse(State#state.include_lib_dirs),
+ {ok, State#state{verbosity = Verbosity,
+ include_dirs = IPath,
+ include_lib_dirs = IlPath}}
+ end;
+process_args(["--help"|_Args], _State) ->
+ ok;
+process_args(["--version"|_Args], #state{version = Version, mfv = MFV} = _State) ->
+ {ok, lists:flatten(io_lib:format("snmpc ~s (~s)", [Version, MFV]))};
+process_args(["--verbosity", Verbosity0|Args], #state{verbosity = V} = State)
+ when (V =:= undefined) ->
+ Verbosity = list_to_atom(Verbosity0),
+ case lists:member(Verbosity, [trace,debug,log,info,silence]) of
+ true ->
+ process_args(Args, State#state{verbosity = Verbosity});
+ false ->
+ e(lists:flatten(io_lib:format("Unknown verbosity: ~s", [Verbosity0])))
+ end;
+process_args(["--verbosity"|_Args], #state{verbosity = V})
+ when (V =/= undefined) ->
+ e(lists:flatten(io_lib:format("Verbosity already set to ~w", [V])));
+process_args(["--warnings"|Args], State) ->
+ process_args(Args, State#state{warnings = true});
+process_args(["--o", Dir|Args], State) ->
+ case (catch file:read_file_info(Dir)) of
+ {ok, #file_info{type = directory}} ->
+ process_args(Args, State#state{outdir = Dir});
+ {ok, #file_info{type = BadType}} ->
+ e(lists:flatten(io_lib:format("Not a directory: ~p (~w)", [Dir, BadType])));
+ _ ->
+ e(lists:flatten(io_lib:format("Bad directory: ~p", [Dir])))
+ end;
+process_args(["--i", Dir|Args], State) ->
+ case (catch file:read_file_info(Dir)) of
+ {ok, #file_info{type = directory}} ->
+ IPath = [Dir | State#state.include_dirs],
+ process_args(Args, State#state{include_dirs = IPath});
+ {ok, #file_info{type = BadType}} ->
+ e(lists:flatten(io_lib:format("Not a directory: ~p (~w)", [Dir, BadType])));
+ _ ->
+ e(lists:flatten(io_lib:format("Bad directory: ~p", [Dir])))
+ end;
+process_args(["--il", Dir|Args], State) ->
+ case (catch file:read_file_info(Dir)) of
+ {ok, #file_info{type = directory}} ->
+ IlPath = [Dir | State#state.include_lib_dirs],
+ process_args(Args, State#state{include_lib_dirs = IlPath});
+ {ok, #file_info{type = BadType}} ->
+ e(lists:flatten(io_lib:format("Not a directory: ~p (~w)", [Dir, BadType])));
+ _ ->
+ e(lists:flatten(io_lib:format("Bad directory: ~p", [Dir])))
+ end;
+process_args(["--db", DB0|Args], State) ->
+ DB = list_to_atom(DB0),
+ case lists:member(DB, [volatile,persistent,mnesia]) of
+ true ->
+ process_args(Args, State#state{db = DB});
+ false ->
+ e(lists:flatten(io_lib:format("Invalid db: ~s", [DB0])))
+ end;
+process_args(["--dep"|Args], State) ->
+ process_args(Args, State#state{deprecated = true});
+process_args(["--sgc"|Args], State) ->
+ process_args(Args, State#state{group_check = false});
+process_args(["--desc"|Args], State) ->
+ process_args(Args, State#state{description = true});
+process_args(["--ref"|Args], State) ->
+ process_args(Args, State#state{reference = true});
+process_args(["--imp"|Args], State) ->
+ process_args(Args, State#state{imports = true});
+process_args(["--mi"|Args], State) ->
+ process_args(Args, State#state{module_identity = true});
+process_args(["--mod", Module0|Args], #state{module = M} = State)
+ when (M =:= undefined) ->
+ Module = list_to_atom(Module0),
+ process_args(Args, State#state{module = Module});
+process_args(["--mod"|_Args], #state{module = M})
+ when (M =/= undefined) ->
+ e(lists:flatten(io_lib:format("Module already set to ~w", [M])));
+process_args(["--nd"|Args], State) ->
+ process_args(Args, State#state{no_defaults = true});
+process_args(["--rrnac"|Args], State) ->
+ process_args(Args, State#state{relaxed_row_name_assigne_check = true});
+process_args([MIB], State) ->
+ Ext = filename:extension(MIB),
+ if
+ ((Ext =:= ".mib") orelse (Ext =:= ".bin")) ->
+ case (catch file:read_file_info(MIB)) of
+ {ok, #file_info{type = regular}} ->
+ process_args([], State#state{file = MIB});
+ {ok, #file_info{type = BadType}} ->
+ e(lists:flatten(io_lib:format("~s not a file: ~w", [MIB, BadType])));
+ {error, enoent} ->
+ e(lists:flatten(io_lib:format("No such file: ~s", [MIB])));
+ _ ->
+ e(lists:flatten(io_lib:format("Bad file: ~s", [MIB])))
+ end;
+ true ->
+ e(lists:flatten(io_lib:format("Unknown option: ~s", [MIB])))
+ end;
+process_args([Arg|Args], _State) when Args =/= [] ->
+ e(lists:flatten(io_lib:format("Unknown option: ~s", [Arg]))).
+
+usage(ReasonStr) ->
+ io:format("ERROR: ~s~n", [ReasonStr]),
+ usage().
+
+usage() ->
+ io:format("Usage: snmpc [options] MIB.mib|MIB.bin"
+ "~nCompile a MIB (.mib -> .bin) or generate an erlang header "
+ "~nfile from a compiled MIB file (.bin -> .hrl)"
+ "~nOptions:"
+ "~n --help - Prints this info."
+ "~n --version - Prints compiler version."
+ "~n --verbosity <verbosity> - Print debug info."
+ "~n verbosity = trace | debug | log | info | silence"
+ "~n Defaults to silence."
+ "~n --warnings - Print warning messages."
+ "~n --o <output dir> - The output dir."
+ "~n Defaults to current working dir."
+ "~n --i <include dir> - Add this dir to the list of dirs that will be"
+ "~n searched for imported (compiled) MIB files."
+ "~n The current workin dir will always be included. "
+ "~n --il <include_lib dir> - Add this dir to the list of dirs that will be"
+ "~n searched for imported (compiled) MIB files."
+ "~n It assumes that the first element in the dir name"
+ "~n correspond to an OTP application. For example snmp/mibs/"
+ "~n The current workin dir and the <snmp-home>/priv/mibs "
+ "~n are always listed last the includ path. "
+ "~n --db <DB> - Database to used for the default instrumentation."
+ "~n Defaults to volatile."
+ "~n --sgc - This option (skip group check), if present, disables "
+ "~n the \"group check\" of the mib compiler. "
+ "~n That is, should the OBJECT-GROUP and the NOTIFICATION-GROUP "
+ "~n macro(s) be checked for correctness or not. "
+ "~n By default the check is done. "
+ "~n --dep - Keep deprecated definition(s)."
+ "~n If not specified the compiler will ignore"
+ "~n deprecated definitions."
+ "~n --desc - The DESCRIPTION field will be included."
+ "~n --ref - The REFERENCE field will be included."
+ "~n --imp - The IMPORTS field will be included."
+ "~n --mi - The MODULE-IDENTITY field will be included."
+ "~n --mc - The MODULE-COMPLIANCE field will be included."
+ "~n --ac - The AGENT-CAPABILITIES field will be included."
+ "~n --mod <module> - The module which implements all the instrumentation"
+ "~n functions. "
+ "~n The name of all instrumentation functions must"
+ "~n be the same as the corresponding managed object"
+ "~n it implements."
+ "~n --nd - The default instrumentation functions will *not* be used"
+ "~n if a managed object have no instrumentation function. "
+ "~n Instead this will be reported as an error, and the "
+ "~n compilation aborts. "
+ "~n --rrnac - This option, if present, specifies that the row name "
+ "~n assign check shall not be done strictly according to"
+ "~n the SMI (which allows only the value 1). "
+ "~n With this option, all values greater than zero is allowed"
+ "~n (>= 1). This means that the error will be converted to "
+ "~n a warning. "
+ "~n By default it is not included, but if this option is "
+ "~n present it will be. "
+ "~n "
+ "~n", []),
+ halt(1).
+
+
+e(Reason) ->
+ throw({error, Reason}).
+
diff --git a/lib/snmp/src/compile/snmpc_lib.erl b/lib/snmp/src/compile/snmpc_lib.erl
index 4490412e84..4f71c47bfa 100644
--- a/lib/snmp/src/compile/snmpc_lib.erl
+++ b/lib/snmp/src/compile/snmpc_lib.erl
@@ -306,7 +306,10 @@ import_mib({{'SNMPv2-TC', ImportsFromMib},Line}) ->
Macros = ['TEXTUAL-CONVENTION'],
import_built_in_loop(ImportsFromMib,Nodes,Types,Macros,'SNMPv2-TC',Line);
import_mib({{'SNMPv2-CONF', ImportsFromMib},Line}) ->
- Macros = ['OBJECT-GROUP','NOTIFICATION-GROUP','MODULE-COMPLIANCE'],
+ Macros = ['OBJECT-GROUP',
+ 'NOTIFICATION-GROUP',
+ 'MODULE-COMPLIANCE',
+ 'AGENT-CAPABILITIES'],
import_built_in_loop(ImportsFromMib,[],[],Macros,'SNMPv2-CONF',Line);
import_mib({{'RFC1155-SMI', ImportsFromMib},Line}) ->
Nodes = [makeInternalNode(internet, [1,3,6,1]),
diff --git a/lib/snmp/src/compile/snmpc_mib_gram.yrl b/lib/snmp/src/compile/snmpc_mib_gram.yrl
index 1957f52936..74b9ddaa25 100644
--- a/lib/snmp/src/compile/snmpc_mib_gram.yrl
+++ b/lib/snmp/src/compile/snmpc_mib_gram.yrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -59,6 +59,7 @@ newtypename
objectidentifier
objectname
objecttypev1
+prodrel
range_num
referpart
size
@@ -79,7 +80,7 @@ revisions
listofdefinitionsv2
mibid
last_updated
-oranization
+organization
contact_info
revision
revision_string
@@ -101,19 +102,31 @@ textualconvention
objectgroup
notificationgroup
modulecompliance
-modulepart
-modules
-module
-modulenamepart
-mandatorypart
-compliancepart
-compliances
-compliance
-compliancegroup
-object
+mc_modulepart
+mc_modules
+mc_module
+mc_modulenamepart
+mc_mandatorypart
+mc_compliancepart
+mc_compliances
+mc_compliance
+mc_compliancegroup
+mc_object
+mc_accesspart
+agentcapabilities
+ac_status
+ac_modulepart
+ac_modules
+ac_module
+ac_modulenamepart
+ac_variationpart
+ac_variations
+ac_variation
+ac_accesspart
+ac_access
+ac_creationpart
syntaxpart
writesyntaxpart
-accesspart
fsyntax
defbitsvalue
defbitsnames
@@ -161,6 +174,12 @@ integer variable atom string quote '{' '}' '::=' ':' '=' ',' '.' '(' ')' ';' '|'
'CONTACT-INFO'
'MODULE-IDENTITY'
'NOTIFICATION-TYPE'
+'PRODUCT-RELEASE'
+'AGENT-CAPABILITIES'
+'INCLUDES'
+'SUPPORTS'
+'VARIATION'
+'CREATION-REQUIRES'
'MODULE-COMPLIANCE'
'OBJECT-GROUP'
'NOTIFICATION-GROUP'
@@ -212,8 +231,8 @@ mib -> mibname 'DEFINITIONS' implies 'BEGIN'
defs = Defs}.
v1orv2 -> moduleidentity listofdefinitionsv2 :
- {v2_mib, ['$1'|lists:reverse('$2')]}.
-v1orv2 -> listofdefinitions : {v1_mib, lists:reverse('$1')}.
+ {v2_mib, ['$1'|lreverse(v1orv2_mod, '$2')]}.
+v1orv2 -> listofdefinitions : {v1_mib, lreverse(v1orv2_list, '$1')}.
definition -> objectidentifier : '$1'.
definition -> objecttypev1 : '$1'.
@@ -231,7 +250,7 @@ imports -> imports_from_one_mib : ['$1'].
imports -> imports_from_one_mib imports : ['$1' | '$2'].
imports_from_one_mib -> listofimports 'FROM' variable :
- {{val('$3'), lists:reverse('$1')}, line_of('$2')}.
+ {{val('$3'), lreverse(imports_from_one_mib, '$1')}, line_of('$2')}.
listofimports -> import_stuff : ['$1'].
listofimports -> listofimports ',' import_stuff : ['$3' | '$1'].
@@ -251,6 +270,8 @@ import_stuff -> 'MODULE-IDENTITY'
: ensure_ver(2,'$1'), {builtin, 'MODULE-IDENTITY'}.
import_stuff -> 'NOTIFICATION-TYPE'
: ensure_ver(2,'$1'), {builtin, 'NOTIFICATION-TYPE'}.
+import_stuff -> 'AGENT-CAPABILITIES'
+ : ensure_ver(2,'$1'), {builtin, 'AGENT-CAPABILITIES'}.
import_stuff -> 'MODULE-COMPLIANCE'
: ensure_ver(2,'$1'), {builtin, 'MODULE-COMPLIANCE'}.
import_stuff -> 'NOTIFICATION-GROUP'
@@ -296,7 +317,7 @@ import_stuff -> 'TAddress'
traptype -> objectname 'TRAP-TYPE' 'ENTERPRISE' objectname varpart
description referpart implies integer :
- Trap = make_trap('$1', '$4', lists:reverse('$5'),
+ Trap = make_trap('$1', '$4', lreverse(traptype, '$5'),
'$6', '$7', val('$9')),
{Trap, line_of('$2')}.
@@ -324,7 +345,7 @@ newtype -> newtypename implies syntax :
{NT, line_of('$2')}.
tableentrydefinition -> newtypename implies 'SEQUENCE' '{' fields '}' :
- Seq = make_sequence('$1', lists:reverse('$5')),
+ Seq = make_sequence('$1', lreverse(tableentrydefinition, '$5')),
{Seq, line_of('$3')}.
% returns: list of {<fieldname>, <asn1_type>}
@@ -408,9 +429,9 @@ variables -> variables ',' objectname : ['$3' | '$1'].
implies -> '::=' : '$1'.
implies -> ':' ':' '=' : w("Sloppy asignment on line ~p", [line_of('$1')]), '$1'.
-descriptionfield -> string : lists:reverse(val('$1')).
+descriptionfield -> string : lreverse(descriptionfield, val('$1')).
descriptionfield -> '$empty' : undefined.
-description -> 'DESCRIPTION' string : lists:reverse(val('$2')).
+description -> 'DESCRIPTION' string : lreverse(description, val('$2')).
description -> '$empty' : undefined.
displaypart -> 'DISPLAY-HINT' string : display_hint('$2') .
@@ -418,7 +439,7 @@ displaypart -> '$empty' : undefined .
% returns: {indexes, undefined}
% | {indexes, IndexList} where IndexList is a list of aliasnames.
-indexpartv1 -> 'INDEX' '{' indextypesv1 '}' : {indexes, lists:reverse('$3')}.
+indexpartv1 -> 'INDEX' '{' indextypesv1 '}' : {indexes, lreverse(indexpartv1, '$3')}.
indexpartv1 -> '$empty' : {indexes, undefined}.
indextypesv1 -> indextypev1 : ['$1'].
@@ -436,14 +457,16 @@ parentintegers -> atom '(' integer ')' parentintegers : [val('$3') | '$5'].
defvalpart -> 'DEFVAL' '{' integer '}' : {defval, val('$3')}.
defvalpart -> 'DEFVAL' '{' atom '}' : {defval, val('$3')}.
defvalpart -> 'DEFVAL' '{' '{' defbitsvalue '}' '}' : {defval, '$4'}.
-defvalpart -> 'DEFVAL' '{' quote atom '}'
- : {defval, make_defval_for_string(line_of('$1'), lists:reverse(val('$3')),
- val('$4'))}.
-defvalpart -> 'DEFVAL' '{' quote variable '}'
- : {defval, make_defval_for_string(line_of('$1'), lists:reverse(val('$3')),
- val('$4'))}.
-defvalpart -> 'DEFVAL' '{' string '}'
- : {defval, lists:reverse(val('$3'))}.
+defvalpart -> 'DEFVAL' '{' quote atom '}' :
+ {defval, make_defval_for_string(line_of('$1'),
+ lreverse(defvalpart_quote_atom, val('$3')),
+ val('$4'))}.
+defvalpart -> 'DEFVAL' '{' quote variable '}' :
+ {defval, make_defval_for_string(line_of('$1'),
+ lreverse(defvalpart_quote_variable, val('$3')),
+ val('$4'))}.
+defvalpart -> 'DEFVAL' '{' string '}' :
+ {defval, lreverse(defvalpart_string, val('$3'))}.
defvalpart -> '$empty' : undefined.
defbitsvalue -> defbitsnames : '$1'.
@@ -461,7 +484,7 @@ accessv1 -> atom: accessv1('$1').
statusv1 -> atom : statusv1('$1').
-referpart -> 'REFERENCE' string : lists:reverse(val('$2')).
+referpart -> 'REFERENCE' string : lreverse(referpart, val('$2')).
referpart -> '$empty' : undefined.
@@ -471,7 +494,7 @@ referpart -> '$empty' : undefined.
%%----------------------------------------------------------------------
moduleidentity -> mibid 'MODULE-IDENTITY'
'LAST-UPDATED' last_updated
- 'ORGANIZATION' oranization
+ 'ORGANIZATION' organization
'CONTACT-INFO' contact_info
'DESCRIPTION' descriptionfield
revisionpart nameassign :
@@ -480,20 +503,20 @@ moduleidentity -> mibid 'MODULE-IDENTITY'
{MI, line_of('$2')}.
mibid -> atom : val('$1').
-last_updated -> string : lists:reverse(val('$1')) .
-oranization -> string : lists:reverse(val('$1')) .
-contact_info -> string : lists:reverse(val('$1')) .
+last_updated -> string : lreverse(last_updated, val('$1')) .
+organization -> string : lreverse(organization, val('$1')) .
+contact_info -> string : lreverse(contact_info, val('$1')) .
revisionpart -> '$empty' : [] .
-revisionpart -> revisions : lists:reverse('$1') .
+revisionpart -> revisions : lreverse(revisionpart, '$1') .
revisions -> revision : ['$1'] .
revisions -> revisions revision : ['$2' | '$1'] .
revision -> 'REVISION' revision_string 'DESCRIPTION' revision_desc :
make_revision('$2', '$4') .
-revision_string -> string : lists:reverse(val('$1')) .
-revision_desc -> string : lists:reverse(val('$1')) .
+revision_string -> string : lreverse(revision_string, val('$1')) .
+revision_desc -> string : lreverse(revision_desc, val('$1')) .
definitionv2 -> objectidentifier : '$1'.
definitionv2 -> objecttypev2 : '$1'.
@@ -505,6 +528,7 @@ definitionv2 -> notification : '$1'.
definitionv2 -> objectgroup : '$1'.
definitionv2 -> notificationgroup : '$1'.
definitionv2 -> modulecompliance : '$1'.
+definitionv2 -> agentcapabilities : '$1'.
listofdefinitionsv2 -> '$empty' : [] .
listofdefinitionsv2 -> listofdefinitionsv2 definitionv2 : ['$2' | '$1'].
@@ -535,46 +559,127 @@ notificationgroup -> objectname 'NOTIFICATION-GROUP' 'NOTIFICATIONS' '{'
{NG, line_of('$2')}.
modulecompliance -> objectname 'MODULE-COMPLIANCE' 'STATUS' statusv2
- description referpart modulepart nameassign :
+ description referpart mc_modulepart nameassign :
+%% io:format("modulecompliance -> "
+%% "~n '$1': ~p"
+%% "~n '$4': ~p"
+%% "~n '$5': ~p"
+%% "~n '$6': ~p"
+%% "~n '$7': ~p"
+%% "~n '$8': ~p"
+%% "~n", ['$1', '$4', '$5', '$6', '$7', '$8']),
MC = make_module_compliance('$1', '$4', '$5', '$6',
'$7', '$8'),
+%% io:format("modulecompliance -> "
+%% "~n MC: ~p"
+%% "~n", [MC]),
{MC, line_of('$2')}.
-modulepart -> '$empty'.
-modulepart -> modules.
-modules -> module.
-modules -> modules module.
+agentcapabilities -> objectname 'AGENT-CAPABILITIES'
+ 'PRODUCT-RELEASE' prodrel
+ 'STATUS' ac_status
+ description referpart ac_modulepart nameassign :
+ AC = make_agent_capabilities('$1', '$4', '$6', '$7',
+ '$8', '$9', '$10'),
+ {AC, line_of('$2')}.
+
+prodrel -> string : lreverse(prodrel, val('$1')).
+
+ac_status -> atom : ac_status('$1').
+
+ac_modulepart -> ac_modules :
+ lreverse(ac_modulepart, '$1').
+ac_modulepart -> '$empty' :
+ [].
+
+ac_modules -> ac_module :
+ ['$1'].
+ac_modules -> ac_module ac_modules :
+ ['$1' | '$2'].
+
+ac_module -> 'SUPPORTS' ac_modulenamepart 'INCLUDES' '{' objects '}' ac_variationpart :
+ make_ac_module('$2', '$5', '$7').
+
+ac_modulenamepart -> mibname : '$1'.
+ac_modulenamepart -> '$empty' : undefined.
+
+ac_variationpart -> '$empty' :
+ [].
+ac_variationpart -> ac_variations :
+ lreverse(ac_variationpart, '$1').
+
+ac_variations -> ac_variation :
+ ['$1'].
+ac_variations -> ac_variation ac_variations :
+ ['$1' | '$2'].
+
+%% ac_variation -> ac_objectvariation.
+%% ac_variation -> ac_notificationvariation.
+
+ac_variation -> 'VARIATION' objectname syntaxpart writesyntaxpart ac_accesspart ac_creationpart defvalpart description :
+ make_ac_variation('$2', '$3', '$4', '$5', '$6', '$7', '$8').
+
+ac_accesspart -> 'ACCESS' ac_access : '$2'.
+ac_accesspart -> '$empty' : undefined.
+
+ac_access -> atom: ac_access('$1').
+
+ac_creationpart -> 'CREATION-REQUIRES' '{' objects '}' :
+ lreverse(ac_creationpart, '$3').
+ac_creationpart -> '$empty' :
+ [].
+
+mc_modulepart -> '$empty' :
+ [].
+mc_modulepart -> mc_modules :
+ lreverse(mc_modulepart, '$1').
+
+mc_modules -> mc_module :
+ ['$1'].
+mc_modules -> mc_module mc_modules :
+ ['$1' | '$2'].
-module -> 'MODULE' modulenamepart mandatorypart compliancepart.
+mc_module -> 'MODULE' mc_modulenamepart mc_mandatorypart mc_compliancepart :
+ make_mc_module('$2', '$3', '$4').
-modulenamepart -> mibname.
-modulenamepart -> '$empty'.
+mc_modulenamepart -> mibname : '$1'.
+mc_modulenamepart -> '$empty' : undefined.
-mandatorypart -> 'MANDATORY-GROUPS' '{' objects '}'.
-mandatorypart -> '$empty'.
+mc_mandatorypart -> 'MANDATORY-GROUPS' '{' objects '}' :
+ lreverse(mc_mandatorypart, '$3').
+mc_mandatorypart -> '$empty' :
+ [].
-compliancepart -> compliances.
-compliancepart -> '$empty'.
+mc_compliancepart -> mc_compliances :
+ lreverse(mc_compliancepart, '$1').
+mc_compliancepart -> '$empty' :
+ [].
-compliances -> compliance.
-compliances -> compliances compliance.
+mc_compliances -> mc_compliance :
+ ['$1'].
+mc_compliances -> mc_compliance mc_compliances :
+ ['$1' | '$2'].
-compliance -> compliancegroup.
-compliance -> object.
+mc_compliance -> mc_compliancegroup :
+ '$1'.
+mc_compliance -> mc_object :
+ '$1'.
-compliancegroup -> 'GROUP' objectname description.
+mc_compliancegroup -> 'GROUP' objectname description :
+ make_mc_compliance_group('$2', '$3').
-object -> 'OBJECT' objectname syntaxpart writesyntaxpart accesspart description.
+mc_object -> 'OBJECT' objectname syntaxpart writesyntaxpart mc_accesspart description :
+ make_mc_object('$2', '$3', '$4', '$5', '$6').
-syntaxpart -> 'SYNTAX' syntax.
-syntaxpart -> '$empty'.
+syntaxpart -> 'SYNTAX' syntax : '$2'.
+syntaxpart -> '$empty' : undefined.
-writesyntaxpart -> 'WRITE-SYNTAX' syntax.
-writesyntaxpart -> '$empty'.
+writesyntaxpart -> 'WRITE-SYNTAX' syntax : '$2'.
+writesyntaxpart -> '$empty' : undefined.
-accesspart -> 'MIN-ACCESS' accessv2.
-accesspart -> '$empty'.
+mc_accesspart -> 'MIN-ACCESS' accessv2 : '$2'.
+mc_accesspart -> '$empty' : undefined.
objecttypev2 -> objectname 'OBJECT-TYPE'
'SYNTAX' syntax
@@ -589,7 +694,7 @@ objecttypev2 -> objectname 'OBJECT-TYPE'
'$11', '$12', Kind, '$15'),
{OT, line_of('$2')}.
-indexpartv2 -> 'INDEX' '{' indextypesv2 '}' : {indexes, lists:reverse('$3')}.
+indexpartv2 -> 'INDEX' '{' indextypesv2 '}' : {indexes, lreverse(indexpartv2, '$3')}.
indexpartv2 -> 'AUGMENTS' '{' entry '}' : {augments, '$3'}.
indexpartv2 -> '$empty' : {indexes, undefined}.
@@ -614,7 +719,7 @@ notification -> objectname 'NOTIFICATION-TYPE' objectspart
Not = make_notification('$1','$3','$5', '$7', '$8', '$9'),
{Not, line_of('$2')}.
-objectspart -> 'OBJECTS' '{' objects '}' : lists:reverse('$3').
+objectspart -> 'OBJECTS' '{' objects '}' : lreverse(objectspart, '$3').
objectspart -> '$empty' : [].
objects -> objectname : ['$1'].
@@ -655,6 +760,14 @@ statusv2(Tok) ->
"syntax error before: " ++ atom_to_list(Else))
end.
+ac_status(Tok) ->
+ case val(Tok) of
+ current -> current;
+ obsolete -> obsolete;
+ Else -> return_error(line_of(Tok),
+ "syntax error before: " ++ atom_to_list(Else))
+ end.
+
accessv1(Tok) ->
case val(Tok) of
'read-only' -> 'read-only';
@@ -676,6 +789,18 @@ accessv2(Tok) ->
"syntax error before: " ++ atom_to_list(Else))
end.
+ac_access(Tok) ->
+ case val(Tok) of
+ 'not-implemented' -> 'not-implemented'; % only for notifications
+ 'accessible-for-notify' -> 'accessible-for-notify';
+ 'read-only' -> 'read-only';
+ 'read-write' -> 'read-write';
+ 'read-create' -> 'read-create';
+ 'write-only' -> 'write-only'; % for backward-compatibility only
+ Else -> return_error(line_of(Tok),
+ "syntax error before: " ++ atom_to_list(Else))
+ end.
+
%% ---------------------------------------------------------------------
%% Various basic record build functions
%% ---------------------------------------------------------------------
@@ -744,14 +869,79 @@ make_notification(Name, Vars, Status, Desc, Ref, NA) ->
reference = Ref,
name_assign = NA}.
-make_module_compliance(Name, Status, Desc, Ref, Mod, NA) ->
+make_agent_capabilities(Name, ProdRel, Status, Desc, Ref, Mods, NA) ->
+ #mc_agent_capabilities{name = Name,
+ product_release = ProdRel,
+ status = Status,
+ description = Desc,
+ reference = Ref,
+ modules = Mods,
+ name_assign = NA}.
+
+make_ac_variation(Name,
+ undefined = _Syntax,
+ undefined = _WriteSyntax,
+ Access,
+ undefined = _Creation,
+ undefined = _DefVal,
+ Desc) ->
+%% io:format("make_ac_variation -> entry with"
+%% "~n Name: ~p"
+%% "~n Access: ~p"
+%% "~n Desc: ~p"
+%% "~n", [Name, Access, Desc]),
+ #mc_ac_notification_variation{name = Name,
+ access = Access,
+ description = Desc};
+
+make_ac_variation(Name, Syntax, WriteSyntax, Access, Creation, DefVal, Desc) ->
+%% io:format("make_ac_variation -> entry with"
+%% "~n Name: ~p"
+%% "~n Syntax: ~p"
+%% "~n WriteSyntax: ~p"
+%% "~n Access: ~p"
+%% "~n Creation: ~p"
+%% "~n DefVal: ~p"
+%% "~n Desc: ~p"
+%% "~n", [Name, Syntax, WriteSyntax, Access, Creation, DefVal, Desc]),
+ #mc_ac_object_variation{name = Name,
+ syntax = Syntax,
+ write_syntax = WriteSyntax,
+ access = Access,
+ creation = Creation,
+ default_value = DefVal,
+ description = Desc}.
+
+make_ac_module(Name, Grps, Var) ->
+ #mc_ac_module{name = Name,
+ groups = Grps,
+ variation = Var}.
+
+
+make_module_compliance(Name, Status, Desc, Ref, Mods, NA) ->
#mc_module_compliance{name = Name,
status = Status,
description = Desc,
reference = Ref,
- module = Mod,
+ modules = Mods,
name_assign = NA}.
+make_mc_module(Name, Mand, Compl) ->
+ #mc_mc_module{name = Name,
+ mandatory = Mand,
+ compliance = Compl}.
+
+make_mc_compliance_group(Name, Desc) ->
+ #mc_mc_compliance_group{name = Name,
+ description = Desc}.
+
+make_mc_object(Name, Syntax, WriteSyntax, Access, Desc) ->
+ #mc_mc_object{name = Name,
+ syntax = Syntax,
+ write_syntax = WriteSyntax,
+ access = Access,
+ description = Desc}.
+
make_object_group(Name, Objs, Status, Desc, Ref, NA) ->
#mc_object_group{name = Name,
objects = Objs,
@@ -968,6 +1158,12 @@ filter_v2imports(_,Type) -> {type, Type}.
w(F, A) ->
?vwarning(F, A).
-%i(F, A) ->
-% io:format("~w:" ++ F ++ "~n", [?MODULE|A]).
+lreverse(_Tag, L) when is_list(L) ->
+ lists:reverse(L);
+lreverse(Tag, X) ->
+ exit({bad_list, Tag, X}).
+
+
+%% i(F, A) ->
+%% io:format("~w:" ++ F ++ "~n", [?MODULE|A]).
diff --git a/lib/snmp/src/compile/snmpc_mib_to_hrl.erl b/lib/snmp/src/compile/snmpc_mib_to_hrl.erl
index 07bd29231b..e8c46a0521 100644
--- a/lib/snmp/src/compile/snmpc_mib_to_hrl.erl
+++ b/lib/snmp/src/compile/snmpc_mib_to_hrl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -24,7 +24,8 @@
-include("snmpc_lib.hrl").
%% External exports
--export([convert/1, compile/3]).
+-export([convert/1, convert/3, compile/3]).
+
%%-----------------------------------------------------------------
%% Func: convert/1
diff --git a/lib/snmp/src/compile/snmpc_tok.erl b/lib/snmp/src/compile/snmpc_tok.erl
index 6b99e7ae43..e238b256d0 100644
--- a/lib/snmp/src/compile/snmpc_tok.erl
+++ b/lib/snmp/src/compile/snmpc_tok.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2010. 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
@@ -37,6 +37,8 @@
-export([null_get_line/0, format_error/1, terminate/2, handle_call/3, init/1,
test/0]).
+-include("snmpc_lib.hrl").
+
%%----------------------------------------------------------------------
%% Reserved_words: list of KeyWords. Example: ['IF', 'BEGIN', ..., 'GOTO']
@@ -130,6 +132,10 @@ test() ->
'current','deprecated','not-accessible','obsolete',
'read-create','read-only','read-write', 'IMPORTS', 'FROM',
'MODULE-COMPLIANCE',
+ 'AGENT-CAPABILITIES',
+ 'PRODUCT-RELEASE',
+ 'SUPPORTS',
+ 'INCLUDES',
'DisplayString',
'PhysAddress',
'MacAddress',
@@ -225,6 +231,7 @@ get_all_tokens(Str,Toks) ->
case catch tokenise(Str) of
{error, ErrorInfo} -> {error, ErrorInfo};
{Token, RestChars} when is_tuple(Token) ->
+ %% ?vtrace("get_all_tokens -> Token: ~p", [Token]),
get_all_tokens(RestChars, [Token|Toks])
end.
diff --git a/lib/snmp/test/Makefile b/lib/snmp/test/Makefile
index 86af2460f5..b7975024b4 100644
--- a/lib/snmp/test/Makefile
+++ b/lib/snmp/test/Makefile
@@ -227,7 +227,7 @@ release_spec:
release_tests_spec: opt
$(INSTALL_DIR) $(RELSYSDIR)
$(INSTALL_DATA) $(RELTEST_FILES) $(COVER_SPEC_FILE) $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
tar cf - snmp_test_data | (cd $(RELSYSDIR); tar xf -)
release_docs_spec:
diff --git a/lib/snmp/test/klas3.erl b/lib/snmp/test/klas3.erl
index a5ce2af8c5..ec78d19dbb 100644
--- a/lib/snmp/test/klas3.erl
+++ b/lib/snmp/test/klas3.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2010. 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
diff --git a/lib/snmp/test/modules.mk b/lib/snmp/test/modules.mk
index 6a0c3e9481..eacc749b53 100644
--- a/lib/snmp/test/modules.mk
+++ b/lib/snmp/test/modules.mk
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2004-2010. All Rights Reserved.
+# Copyright Ericsson AB 2004-2011. 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
@@ -62,6 +62,8 @@ COMPILER_MIB_FILES = \
OTP8574-MIB
MIB_FILES = \
+ AC-TEST-MIB.mib \
+ MC-TEST-MIB.mib \
OLD-SNMPEA-MIB.mib \
OLD-SNMPEA-MIB-v2.mib \
Klas1.mib \
diff --git a/lib/snmp/test/sa.erl b/lib/snmp/test/sa.erl
index ad3ccce08f..fee50c0e8c 100644
--- a/lib/snmp/test/sa.erl
+++ b/lib/snmp/test/sa.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2010. 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
diff --git a/lib/snmp/test/snmp.cover b/lib/snmp/test/snmp.cover
index 027dce68c1..a2e7dd978f 100644
--- a/lib/snmp/test/snmp.cover
+++ b/lib/snmp/test/snmp.cover
@@ -1,5 +1,7 @@
%% -*- erlang -*-
-{exclude,
+{incl_app,snmp,details}.
+
+{excl_mods,snmp,
[snmp_index,
snmpa_error_io,
snmpa_authentication_service,
diff --git a/lib/snmp/test/snmp.spec b/lib/snmp/test/snmp.spec
index 0af52c139e..88ae0145f0 100644
--- a/lib/snmp/test/snmp.spec
+++ b/lib/snmp/test/snmp.spec
@@ -1 +1 @@
-{topcase, {dir, "../snmp_test"}}.
+{suites,"../snmp_test",all}.
diff --git a/lib/snmp/test/snmp_SUITE.erl b/lib/snmp/test/snmp_SUITE.erl
index f560e36663..b6d72da2fa 100644
--- a/lib/snmp/test/snmp_SUITE.erl
+++ b/lib/snmp/test/snmp_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -19,27 +19,14 @@
-module(snmp_SUITE).
--export([all/1,
- init_per_testcase/2, fin_per_testcase/2
+-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([app/1, compiler/1, misc/1, agent/1, manager/1]).
-
--export([
- app_test/1,
- appup_test/1,
- compiler_test/1,
- conf_test/1,
- pdus_test/1,
- log_test/1,
- note_store_test/1,
- mibs_test/1,
- nfilter_test/1,
- agent_test/1,
- manager_config_test/1,
- manager_user_test/1,
- manager_test/1
- ]).
%%
%% -----
@@ -48,110 +35,60 @@
init_per_testcase(_Case, Config) when is_list(Config) ->
Config.
-fin_per_testcase(_Case, Config) when is_list(Config) ->
+end_per_testcase(_Case, Config) when is_list(Config) ->
Config.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Top test case
-all(doc) ->
- ["Test suites for the snmp application.",
- "There are eight different sub test-suites."];
-
-all(suite) ->
- [
- app,
- compiler,
- misc,
- agent,
- manager
-
- ].
-
-app(suite) ->
- [
- app_test,
- appup_test
- ].
-
-compiler(suite) ->
- [
- compiler_test
- ].
-
-misc(suite) ->
- [
- conf_test,
- pdus_test,
- log_test,
- note_store_test
- ].
-
-agent(suite) ->
- [
- mibs_test,
- nfilter_test,
- agent_test
- ].
-
-manager(suite) ->
- [
- manager_config_test,
- manager_user_test,
- manager_test
- ].
-
-
-app_test(suite) ->
- [{snmp_app_test, all}].
-
-
-appup_test(suite) ->
- [{snmp_appup_test, all}].
-
-
-compiler_test(suite) ->
- [{snmp_compiler_test, all}].
-
-
-conf_test(suite) ->
- [{snmp_conf_test, all}].
-
-
-pdus_test(suite) ->
- [{snmp_pdus_test, all}].
-
-
-log_test(suite) ->
- [{snmp_log_test, all}].
-
-
-note_store_test(suite) ->
- [{snmp_note_store_test, all}].
-
-
-mibs_test(suite) ->
- [{snmp_agent_mibs_test, all}].
-
-
-nfilter_test(suite) ->
- [{snmp_agent_nfilter_test, all}].
-
-
-agent_test(suite) ->
- [{snmp_agent_test, all}].
-
-
-manager_config_test(suite) ->
- [{snmp_manager_config_test, all}].
-
-
-manager_user_test(suite) ->
- [{snmp_manager_user_test, all}].
+suite() ->
+ [{ct_hooks, [ts_install_cth]}].
+
+all() ->
+ [{group, app},
+ {group, compiler},
+ {group, misc},
+ {group, agent},
+ {group, manager}].
+
+groups() ->
+ [{app, [], [{group, app_test},
+ {group, appup_test}]},
+ {compiler, [], [{group, compiler_test}]},
+ {misc, [], [{group, conf_test},
+ {group, pdus_test},
+ {group, log_test},
+ {group, note_store_test}]},
+ {agent, [], [{group, mibs_test},
+ {group, nfilter_test},
+ {group, agent_test}]},
+ {manager, [], [{group, manager_config_test},
+ {group, manager_user_test},
+ {group, manager_test}]},
+ {app_test, [], [{snmp_app_test, all}]},
+ {appup_test, [], [{snmp_appup_test, all}]},
+ {compiler_test, [], [{snmp_compiler_test, all}]},
+ {conf_test, [], [{snmp_conf_test, all}]},
+ {pdus_test, [], [{snmp_pdus_test, all}]},
+ {log_test, [], [{snmp_log_test, all}]},
+ {note_store_test, [], [{snmp_note_store_test, all}]},
+ {mibs_test, [], [{snmp_agent_mibs_test, all}]},
+ {nfilter_test, [], [{snmp_agent_nfilter_test, all}]},
+ {agent_test, [], [{snmp_agent_test, all}]},
+ {manager_config_test, [], [{snmp_manager_config_test, all}]},
+ {manager_user_test, [], [{snmp_manager_user_test, all}]},
+ {manager_test, [], [{snmp_manager_test, all}]}].
+
+init_per_suite(Config) ->
+ Config.
+end_per_suite(_Config) ->
+ ok.
-manager_test(suite) ->
- [{snmp_manager_test, all}].
+init_per_group(_GroupName, Config) ->
+ Config.
+end_per_group(_GroupName, Config) ->
+ Config.
diff --git a/lib/snmp/test/snmp_agent_bl_test.erl b/lib/snmp/test/snmp_agent_bl_test.erl
index 4608d90201..b17489a755 100644
--- a/lib/snmp/test/snmp_agent_bl_test.erl
+++ b/lib/snmp/test/snmp_agent_bl_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
@@ -89,7 +89,7 @@ init_per_testcase(_Case, Config) when list(Config) ->
Dog = ?t:timetrap(?t:minutes(6)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) when list(Config) ->
+end_per_testcase(_Case, Config) when list(Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
Config.
diff --git a/lib/snmp/test/snmp_agent_mibs_test.erl b/lib/snmp/test/snmp_agent_mibs_test.erl
index 5f1ff53a79..3e48130fac 100644
--- a/lib/snmp/test/snmp_agent_mibs_test.erl
+++ b/lib/snmp/test/snmp_agent_mibs_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2010. 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
@@ -26,7 +26,7 @@
%%----------------------------------------------------------------------
%% Include files
%%----------------------------------------------------------------------
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("snmp_test_lib.hrl").
-include_lib("snmp/include/snmp_types.hrl").
-include_lib("snmp/include/SNMP-COMMUNITY-MIB.hrl").
@@ -39,12 +39,12 @@
%% External exports
%%----------------------------------------------------------------------
-export([
- all/1,
- init_per_testcase/2, fin_per_testcase/2,
- init_all/1, finish_all/1,
+ all/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_testcase/2, end_per_testcase/2,
+ init_per_suite/1, end_per_suite/1,
start_and_stop/1,
- size_check/1,
+
size_check_ets/1,
size_check_dets/1,
size_check_mnesia/1,
@@ -58,8 +58,6 @@
%%----------------------------------------------------------------------
%% Internal exports
%%----------------------------------------------------------------------
--export([
- ]).
%%----------------------------------------------------------------------
%% Macros
@@ -100,20 +98,20 @@ init_per_testcase(cache_test, Config) when is_list(Config) ->
init_per_testcase(_Case, Config) when is_list(Config) ->
Config.
-fin_per_testcase(size_check_dets, Config) when is_list(Config) ->
+end_per_testcase(size_check_dets, Config) when is_list(Config) ->
Dir = ?config(dets_dir, Config),
?line ok = ?DEL_DIR(Dir),
lists:keydelete(dets_dir, 1, Config);
-fin_per_testcase(size_check_mnesia, Config) when is_list(Config) ->
+end_per_testcase(size_check_mnesia, Config) when is_list(Config) ->
mnesia_stop(),
Dir = ?config(mnesia_dir, Config),
?line ok = ?DEL_DIR(Dir),
lists:keydelete(mnesia_dir, 1, Config);
-fin_per_testcase(cache_test, Config) when is_list(Config) ->
+end_per_testcase(cache_test, Config) when is_list(Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
Config;
-fin_per_testcase(_Case, Config) when is_list(Config) ->
+end_per_testcase(_Case, Config) when is_list(Config) ->
Config.
@@ -121,20 +119,25 @@ fin_per_testcase(_Case, Config) when is_list(Config) ->
%% Test case definitions
%%======================================================================
-all(suite) ->
- {conf, init_all, cases(), finish_all}.
+all() ->
+cases().
+
+groups() ->
+ [{size_check, [],
+ [size_check_ets, size_check_dets, size_check_mnesia]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
-cases() ->
- [
- start_and_stop,
- load_unload,
- size_check,
- me_lookup,
- which_mib,
- cache_test
- ].
+cases() ->
+[start_and_stop, load_unload, {group, size_check},
+ me_lookup, which_mib, cache_test].
-init_all(Config) when is_list(Config) ->
+init_per_suite(Config) when is_list(Config) ->
%% Data dir points wrong
DataDir0 = ?config(data_dir, Config),
DataDir1 = filename:split(filename:absname(DataDir0)),
@@ -142,7 +145,7 @@ init_all(Config) when is_list(Config) ->
DataDir = filename:join(lists:reverse(DataDir2) ++ [?snmp_test_data]),
[{snmp_data_dir, DataDir ++ "/"}|Config].
-finish_all(Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
lists:keydelete(snmp_data_dir, 1, Config).
@@ -217,12 +220,6 @@ load_unload(Config) when is_list(Config) ->
%% ---------------------------------------------------------------------
-size_check(suite) ->
- [
- size_check_ets,
- size_check_dets,
- size_check_mnesia
- ].
size_check_ets(suite) ->
[];
diff --git a/lib/snmp/test/snmp_agent_ms_test.erl b/lib/snmp/test/snmp_agent_ms_test.erl
index 3a3a790e6a..1f34f1c8d1 100644
--- a/lib/snmp/test/snmp_agent_ms_test.erl
+++ b/lib/snmp/test/snmp_agent_ms_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
@@ -28,7 +28,7 @@
-define(application, snmp).
-include_lib("kernel/include/file.hrl").
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("snmp_test_lib.hrl").
-define(SNMP_USE_V3, true).
-include_lib("snmp/include/snmp_types.hrl").
@@ -83,39 +83,165 @@
_ -> V3
end).
-all(suite) -> {req,
- [mnesia, distribution,
- {local_slave_nodes, 2}, {time, 360}],
- [{conf, init_all, cases(), finish_all}]}.
+all() ->
+[cases()].
+
+groups() ->
+ [{mib_storage, [],
+ [{group, mib_storage_ets}, {group, mib_storage_dets},
+ {group, mib_storage_mnesia},
+ {group, mib_storage_size_check_ets},
+ {group, mib_storage_size_check_dets},
+ {group, mib_storage_size_check_mnesia},
+ {group, mib_storage_varm_dets},
+ {group, mib_storage_varm_mnesia}]},
+ {mib_storage_ets, [], mib_storage_ets_cases()},
+ {mib_storage_dets, [], mib_storage_dets_cases()},
+ {mib_storage_mnesia, [], mib_storage_mnesia_cases()},
+ {mib_storage_size_check_ets, [],
+ mse_size_check_cases()},
+ {mib_storage_size_check_dets, [],
+ msd_size_check_cases()},
+ {mib_storage_size_check_mnesia, [],
+ msm_size_check_cases()},
+ {mib_storage_varm_dets, [],
+ varm_mib_storage_dets_cases()},
+ {mib_storage_varm_mnesia, [],
+ varm_mib_storage_mnesia_cases()},
+ {test_v1, [], v1_cases()}, {test_v2, [], v2_cases()},
+ {test_v1_v2, [], v1_v2_cases()},
+ {test_v3, [], v3_cases()},
+ {test_multi_threaded, [], mt_cases()},
+ {multiple_reqs, [], mul_cases()},
+ {multiple_reqs_2, [], mul_cases_2()},
+ {v2_inform, [], [v2_inform_i]},
+ {v3_security, [],
+ [v3_crypto_basic, v3_md5_auth, v3_sha_auth,
+ v3_des_priv]},
+ {standard_mibs, [],
+ [snmp_standard_mib, snmp_community_mib,
+ snmp_framework_mib, snmp_target_mib,
+ snmp_notification_mib, snmp_view_based_acm_mib]},
+ {standard_mibs_2, [],
+ [snmpv2_mib_2, snmp_community_mib_2,
+ snmp_framework_mib_2, snmp_target_mib_2,
+ snmp_notification_mib_2, snmp_view_based_acm_mib_2]},
+ {standard_mibs_3, [],
+ [snmpv2_mib_3, snmp_framework_mib_3, snmp_mpd_mib_3,
+ snmp_target_mib_3, snmp_notification_mib_3,
+ snmp_view_based_acm_mib_3, snmp_user_based_sm_mib_3]},
+ {reported_bugs, [],
+ [otp_1128, otp_1129, otp_1131, otp_1162, otp_1222,
+ otp_1298, otp_1331, otp_1338, otp_1342, otp_2776,
+ otp_2979, otp_3187, otp_3725]},
+ {reported_bugs_2, [],
+ [otp_1128_2, otp_1129_2, otp_1131_2, otp_1162_2,
+ otp_1222_2, otp_1298_2, otp_1331_2, otp_1338_2,
+ otp_1342_2, otp_2776_2, otp_2979_2, otp_3187_2]},
+ {reported_bugs_3, [],
+ [otp_1128_3, otp_1129_3, otp_1131_3, otp_1162_3,
+ otp_1222_3, otp_1298_3, otp_1331_3, otp_1338_3,
+ otp_1342_3, otp_2776_3, otp_2979_3, otp_3187_3,
+ otp_3542]},
+ {tickets, [], [{group, otp_4394}]},
+ {otp_4394, [], [otp_4394_test]}].
+
+init_per_group(otp_4394, Config) ->
+ init_otp_4394(Config);
+init_per_group(v2_inform, Config) ->
+ init_v2_inform(Config);
+init_per_group(multiple_reqs_2, Config) ->
+ init_mul(Config);
+init_per_group(multiple_reqs, Config) ->
+ init_mul(Config);
+init_per_group(test_multi_threaded, Config) ->
+ init_mt(Config);
+init_per_group(test_v3, Config) ->
+ init_v3(Config);
+init_per_group(test_v1_v2, Config) ->
+ init_v1_v2(Config);
+init_per_group(test_v2, Config) ->
+ init_v2(Config);
+init_per_group(test_v1, Config) ->
+ init_v1(Config);
+init_per_group(mib_storage_varm_mnesia, Config) ->
+ init_varm_mib_storage_mnesia(Config);
+init_per_group(mib_storage_varm_dets, Config) ->
+ init_varm_mib_storage_dets(Config);
+init_per_group(mib_storage_size_check_mnesia, Config) ->
+ init_size_check_msm(Config);
+init_per_group(mib_storage_size_check_dets, Config) ->
+ init_size_check_msd(Config);
+init_per_group(mib_storage_size_check_ets, Config) ->
+ init_size_check_mse(Config);
+init_per_group(mib_storage_mnesia, Config) ->
+ init_mib_storage_mnesia(Config);
+init_per_group(mib_storage_dets, Config) ->
+ init_mib_storage_dets(Config);
+init_per_group(mib_storage_ets, Config) ->
+ init_mib_storage_ets(Config);
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(otp_4394, Config) ->
+ finish_otp_4394(Config);
+end_per_group(v2_inform, Config) ->
+ finish_v2_inform(Config);
+end_per_group(multiple_reqs_2, Config) ->
+ finish_mul(Config);
+end_per_group(multiple_reqs, Config) ->
+ finish_mul(Config);
+end_per_group(test_multi_threaded, Config) ->
+ finish_mt(Config);
+end_per_group(test_v3, Config) ->
+ finish_v3(Config);
+end_per_group(test_v1_v2, Config) ->
+ finish_v1_v2(Config);
+end_per_group(test_v2, Config) ->
+ finish_v2(Config);
+end_per_group(test_v1, Config) ->
+ finish_v1(Config);
+end_per_group(mib_storage_varm_mnesia, Config) ->
+ finish_varm_mib_storage_mnesia(Config);
+end_per_group(mib_storage_varm_dets, Config) ->
+ finish_varm_mib_storage_dets(Config);
+end_per_group(mib_storage_size_check_mnesia, Config) ->
+ finish_size_check_msm(Config);
+end_per_group(mib_storage_size_check_dets, Config) ->
+ finish_size_check_msd(Config);
+end_per_group(mib_storage_size_check_ets, Config) ->
+ finish_size_check_mse(Config);
+end_per_group(mib_storage_mnesia, Config) ->
+ finish_mib_storage_mnesia(Config);
+end_per_group(mib_storage_dets, Config) ->
+ finish_mib_storage_dets(Config);
+end_per_group(mib_storage_ets, Config) ->
+ finish_mib_storage_ets(Config);
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Case, Config) when list(Config) ->
Dog = ?t:timetrap(?t:minutes(6)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) when list(Config) ->
+end_per_testcase(_Case, Config) when list(Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
Config.
-cases() ->
- case ?OSTYPE() of
- vxworks ->
- %% No crypto app, so skip v3 testcases
- [
- app_info,
- test_v1, test_v2, test_v1_v2,
- test_multi_threaded,
- mib_storage,
- tickets];
- _Else ->
- [
- app_info,
- test_v1, test_v2, test_v1_v2, test_v3,
- test_multi_threaded,
- mib_storage,
- tickets
- ]
- end.
+cases() ->
+case ?OSTYPE() of
+ vxworks ->
+ [app_info, {group, test_v1}, {group, test_v2},
+ {group, test_v1_v2}, {group, test_multi_threaded},
+ {group, mib_storage}, {group, tickets}];
+ _Else ->
+ [app_info, {group, test_v1}, {group, test_v2},
+ {group, test_v1_v2}, {group, test_v3},
+ {group, test_multi_threaded}, {group, mib_storage},
+ {group, tickets}]
+end.
%%%-----------------------------------------------------------------
@@ -460,144 +586,56 @@ delete_mib_storage_mnesia_tables() ->
%% <base>, and a second version <base>_2. There may be several
%% versions as well, <base>_N.
%%-----------------------------------------------------------------
-mib_storage(suite) -> [
- mib_storage_ets,
- mib_storage_dets,
- mib_storage_mnesia,
- mib_storage_size_check_ets,
- mib_storage_size_check_dets,
- mib_storage_size_check_mnesia,
- mib_storage_varm_dets,
- mib_storage_varm_mnesia
- ].
-
-mib_storage_ets(suite) -> {req, [], {conf, init_mib_storage_ets,
- mib_storage_ets_cases(),
- finish_mib_storage_ets}}.
-
-mib_storage_dets(suite) -> {req, [], {conf, init_mib_storage_dets,
- mib_storage_dets_cases(),
- finish_mib_storage_dets}}.
-
-mib_storage_mnesia(suite) -> {req, [], {conf, init_mib_storage_mnesia,
- mib_storage_mnesia_cases(),
- finish_mib_storage_mnesia}}.
-
-mib_storage_size_check_ets(suite) ->
- {req, [], {conf,
- init_size_check_mse,
- mse_size_check_cases(),
- finish_size_check_mse}}.
-
-mib_storage_size_check_dets(suite) ->
- {req, [], {conf,
- init_size_check_msd,
- msd_size_check_cases(),
- finish_size_check_msd}}.
-
-mib_storage_size_check_mnesia(suite) ->
- {req, [], {conf,
- init_size_check_msm,
- msm_size_check_cases(),
- finish_size_check_msm}}.
-
-mib_storage_varm_dets(suite) ->
- {req, [], {conf,
- init_varm_mib_storage_dets,
- varm_mib_storage_dets_cases(),
- finish_varm_mib_storage_dets}}.
-
-mib_storage_varm_mnesia(suite) ->
- {req, [], {conf,
- init_varm_mib_storage_mnesia,
- varm_mib_storage_mnesia_cases(),
- finish_varm_mib_storage_mnesia}}.
-
-mib_storage_ets_cases() ->
- [
- mse_simple,
- mse_v1_processing,
- mse_big,
- mse_big2,
- mse_loop_mib,
- mse_api,
- mse_sa_register,
- mse_v1_trap,
- mse_sa_error,
- mse_next_across_sa,
- mse_undo,
- mse_standard_mib,
- mse_community_mib,
- mse_framework_mib,
- mse_target_mib,
- mse_notification_mib,
- mse_view_based_acm_mib,
- mse_sparse_table,
- mse_me_of,
- mse_mib_of].
-
-mib_storage_dets_cases() ->
- [
- msd_simple,
- msd_v1_processing,
- msd_big,
- msd_big2,
- msd_loop_mib,
- msd_api,
- msd_sa_register,
- msd_v1_trap,
- msd_sa_error,
- msd_next_across_sa,
- msd_undo,
- msd_standard_mib,
- msd_community_mib,
- msd_framework_mib,
- msd_target_mib,
- msd_notification_mib,
- msd_view_based_acm_mib,
- msd_sparse_table,
- msd_me_of,
- msd_mib_of
- ].
-
-mib_storage_mnesia_cases() ->
- [
- msm_simple,
- msm_v1_processing,
- msm_big,
- msm_big2,
- msm_loop_mib,
- msm_api,
- msm_sa_register,
- msm_v1_trap,
- msm_sa_error,
- msm_next_across_sa,
- msm_undo,
- msm_standard_mib,
- msm_community_mib,
- msm_framework_mib,
- msm_target_mib,
- msm_notification_mib,
- msm_view_based_acm_mib,
- msm_sparse_table,
- msm_me_of,
- msm_mib_of
- ].
-
-mse_size_check_cases() ->
- [mse_size_check].
-
-msd_size_check_cases() ->
- [msd_size_check].
-
-msm_size_check_cases() ->
- [msm_size_check].
-
-varm_mib_storage_dets_cases() ->
- [msd_varm_mib_start].
-
-varm_mib_storage_mnesia_cases() ->
- [msm_varm_mib_start].
+
+
+
+
+
+
+
+
+
+mib_storage_ets_cases() ->
+[mse_simple, mse_v1_processing, mse_big, mse_big2,
+ mse_loop_mib, mse_api, mse_sa_register, mse_v1_trap,
+ mse_sa_error, mse_next_across_sa, mse_undo,
+ mse_standard_mib, mse_community_mib, mse_framework_mib,
+ mse_target_mib, mse_notification_mib,
+ mse_view_based_acm_mib, mse_sparse_table, mse_me_of,
+ mse_mib_of].
+
+mib_storage_dets_cases() ->
+[msd_simple, msd_v1_processing, msd_big, msd_big2,
+ msd_loop_mib, msd_api, msd_sa_register, msd_v1_trap,
+ msd_sa_error, msd_next_across_sa, msd_undo,
+ msd_standard_mib, msd_community_mib, msd_framework_mib,
+ msd_target_mib, msd_notification_mib,
+ msd_view_based_acm_mib, msd_sparse_table, msd_me_of,
+ msd_mib_of].
+
+mib_storage_mnesia_cases() ->
+[msm_simple, msm_v1_processing, msm_big, msm_big2,
+ msm_loop_mib, msm_api, msm_sa_register, msm_v1_trap,
+ msm_sa_error, msm_next_across_sa, msm_undo,
+ msm_standard_mib, msm_community_mib, msm_framework_mib,
+ msm_target_mib, msm_notification_mib,
+ msm_view_based_acm_mib, msm_sparse_table, msm_me_of,
+ msm_mib_of].
+
+mse_size_check_cases() ->
+[mse_size_check].
+
+msd_size_check_cases() ->
+[msd_size_check].
+
+msm_size_check_cases() ->
+[msm_size_check].
+
+varm_mib_storage_dets_cases() ->
+[msd_varm_mib_start].
+
+varm_mib_storage_mnesia_cases() ->
+[msm_varm_mib_start].
init_mib_storage_ets(Config) when list(Config) ->
?LOG("init_mib_storage_ets -> entry", []),
@@ -1099,20 +1137,14 @@ app_dir(App) ->
end.
-test_v1(suite) -> {req, [], {conf, init_v1, v1_cases(), finish_v1}}.
%v1_cases() -> [loop_mib];
-v1_cases() ->
- [simple,
- db_notify_client,
- v1_processing, big, big2, loop_mib,
- api, subagent, mnesia, multiple_reqs,
- sa_register, v1_trap, sa_error, next_across_sa, undo, reported_bugs,
- standard_mibs, sparse_table, cnt_64,
- opaque,
- % opaque].
-
- change_target_addr_config].
+v1_cases() ->
+[simple, db_notify_client, v1_processing, big, big2,
+ loop_mib, api, subagent, mnesia, {group, multiple_reqs},
+ sa_register, v1_trap, sa_error, next_across_sa, undo,
+ {group, reported_bugs}, {group, standard_mibs},
+ sparse_table, cnt_64, opaque, change_target_addr_config].
init_v1(Config) when list(Config) ->
?line SaNode = ?config(snmp_sa, Config),
@@ -1129,15 +1161,15 @@ finish_v1(Config) when list(Config) ->
delete_files(C1),
lists:keydelete(vsn, 1, C1).
-test_v2(suite) -> {req, [], {conf, init_v2, v2_cases(), finish_v2}}.
%v2_cases() -> [loop_mib_2];
-v2_cases() ->
- [simple_2, v2_processing, big_2, big2_2, loop_mib_2,
- api_2, subagent_2, mnesia_2,
- multiple_reqs_2, sa_register_2, v2_trap, v2_inform, sa_error_2,
- next_across_sa_2, undo_2, reported_bugs_2, standard_mibs_2,
- v2_types, implied, sparse_table_2, cnt_64_2, opaque_2, v2_caps].
+v2_cases() ->
+[simple_2, v2_processing, big_2, big2_2, loop_mib_2,
+ api_2, subagent_2, mnesia_2, {group, multiple_reqs_2},
+ sa_register_2, v2_trap, {group, v2_inform}, sa_error_2,
+ next_across_sa_2, undo_2, {group, reported_bugs_2},
+ {group, standard_mibs_2}, v2_types, implied,
+ sparse_table_2, cnt_64_2, opaque_2, v2_caps].
init_v2(Config) when list(Config) ->
SaNode = ?config(snmp_sa, Config),
@@ -1154,10 +1186,9 @@ finish_v2(Config) when list(Config) ->
delete_files(C1),
lists:keydelete(vsn, 1, C1).
-test_v1_v2(suite) -> {req, [], {conf, init_v1_v2, v1_v2_cases(), finish_v1_v2}}.
-v1_v2_cases() ->
- [simple_bi].
+v1_v2_cases() ->
+[simple_bi].
init_v1_v2(Config) when list(Config) ->
SaNode = ?config(snmp_sa, Config),
@@ -1174,16 +1205,16 @@ finish_v1_v2(Config) when list(Config) ->
delete_files(C1),
lists:keydelete(vsn, 1, C1).
-test_v3(suite) -> {req, [], {conf, init_v3, v3_cases(), finish_v3}}.
%v3_cases() -> [loop_mib_3];
-v3_cases() ->
- [simple_3, v3_processing,
- big_3, big2_3, api_3, subagent_3, mnesia_3, loop_mib_3,
- multiple_reqs_3, sa_register_3, v3_trap, v3_inform, sa_error_3,
- next_across_sa_3, undo_3, reported_bugs_3, standard_mibs_3,
- v3_security,
- v2_types_3, implied_3, sparse_table_3, cnt_64_3, opaque_3, v2_caps_3].
+v3_cases() ->
+[simple_3, v3_processing, big_3, big2_3, api_3,
+ subagent_3, mnesia_3, loop_mib_3, multiple_reqs_3,
+ sa_register_3, v3_trap, v3_inform, sa_error_3,
+ next_across_sa_3, undo_3, {group, reported_bugs_3},
+ {group, standard_mibs_3}, {group, v3_security},
+ v2_types_3, implied_3, sparse_table_3, cnt_64_3,
+ opaque_3, v2_caps_3].
init_v3(Config) when list(Config) ->
%% Make sure crypto works, otherwise start_agent will fail
@@ -1221,10 +1252,9 @@ finish_v3(Config) when list(Config) ->
delete_files(C1),
lists:keydelete(vsn, 1, C1).
-test_multi_threaded(suite) -> {req, [], {conf, init_mt, mt_cases(), finish_mt}}.
-mt_cases() ->
- [multi_threaded, mt_trap].
+mt_cases() ->
+[multi_threaded, mt_trap].
init_mt(Config) when list(Config) ->
SaNode = ?config(snmp_sa, Config),
@@ -1739,21 +1769,19 @@ mnesia_2(X) -> mnesia(X).
mnesia_3(X) -> mnesia(X).
-multiple_reqs(suite) ->
- {req, [], {conf, init_mul, mul_cases(), finish_mul}}.
-mul_cases() ->
- [mul_get, mul_get_err, mul_next, mul_next_err, mul_set_err].
+mul_cases() ->
+[mul_get, mul_get_err, mul_next, mul_next_err,
+ mul_set_err].
-multiple_reqs_2(suite) ->
- {req, [], {conf, init_mul, mul_cases_2(), finish_mul}}.
multiple_reqs_3(_X) ->
{req, [], {conf, init_mul, mul_cases_3(), finish_mul}}.
-mul_cases_2() ->
- [mul_get_2, mul_get_err_2, mul_next_2, mul_next_err_2, mul_set_err_2].
+mul_cases_2() ->
+[mul_get_2, mul_get_err_2, mul_next_2, mul_next_err_2,
+ mul_set_err_2].
mul_cases_3() ->
@@ -1939,8 +1967,6 @@ v2_trap(Config) when list(Config) ->
v3_trap(X) ->
v2_trap(X).
-v2_inform(suite) ->
- {req, [], {conf, init_v2_inform, [v2_inform_i], finish_v2_inform}}.
v3_inform(_X) ->
%% v2_inform(X).
@@ -2112,7 +2138,6 @@ v3_processing(Config) when list(Config) ->
%% accomplished by the first inform sent. That one will generate a
%% report, which makes it in sync. The notification-generating
%% application times out, and send again. This time it'll work.
-v3_security(suite) -> [v3_crypto_basic, v3_md5_auth, v3_sha_auth, v3_des_priv].
v3_crypto_basic(suite) -> [];
v3_crypto_basic(_Config) ->
@@ -3591,22 +3616,8 @@ bad_return() ->
%%% Note that many of the functions in the standard mib is
%%% already tested by the normal tests.
%%%-----------------------------------------------------------------
-standard_mibs(suite) ->
- [snmp_standard_mib, snmp_community_mib,
- snmp_framework_mib,
- snmp_target_mib, snmp_notification_mib,
- snmp_view_based_acm_mib].
-
-standard_mibs_2(suite) ->
- [snmpv2_mib_2, snmp_community_mib_2,
- snmp_framework_mib_2,
- snmp_target_mib_2, snmp_notification_mib_2,
- snmp_view_based_acm_mib_2].
-
-standard_mibs_3(suite) ->
- [snmpv2_mib_3,snmp_framework_mib_3, snmp_mpd_mib_3,
- snmp_target_mib_3, snmp_notification_mib_3,
- snmp_view_based_acm_mib_3, snmp_user_based_sm_mib_3].
+
+
%%-----------------------------------------------------------------
%% For this test, the agent is configured for v1.
@@ -4527,27 +4538,12 @@ loop_it_2(Oid, N) ->
%%% Testing of reported bugs and other tickets.
%%%-----------------------------------------------------------------
-reported_bugs(suite) ->
- [otp_1128, otp_1129, otp_1131, otp_1162,
- otp_1222, otp_1298, otp_1331, otp_1338,
- otp_1342, otp_2776, otp_2979, otp_3187, otp_3725].
-reported_bugs_2(suite) ->
- [otp_1128_2, otp_1129_2, otp_1131_2, otp_1162_2,
- otp_1222_2, otp_1298_2, otp_1331_2, otp_1338_2,
- otp_1342_2, otp_2776_2, otp_2979_2, otp_3187_2].
-reported_bugs_3(suite) ->
- [otp_1128_3, otp_1129_3, otp_1131_3, otp_1162_3,
- otp_1222_3, otp_1298_3, otp_1331_3, otp_1338_3,
- otp_1342_3, otp_2776_3, otp_2979_3, otp_3187_3,
- otp_3542].
%% These are (ticket) test cases where the initiation has to be done
%% individually.
-tickets(suite) ->
- [otp_4394].
%%-----------------------------------------------------------------
%% Ticket: OTP-1128
@@ -4971,10 +4967,6 @@ otp_3725_test(MaNode) ->
%%-----------------------------------------------------------------
-otp_4394(suite) -> {req, [], {conf,
- init_otp_4394,
- [otp_4394_test],
- finish_otp_4394}}.
init_otp_4394(Config) when list(Config) ->
?DBG("init_otp_4394 -> entry with"
diff --git a/lib/snmp/test/snmp_agent_mt_test.erl b/lib/snmp/test/snmp_agent_mt_test.erl
index 8d5a57f58d..4f125c0017 100644
--- a/lib/snmp/test/snmp_agent_mt_test.erl
+++ b/lib/snmp/test/snmp_agent_mt_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
@@ -28,7 +28,7 @@
-define(application, snmp).
-include_lib("kernel/include/file.hrl").
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("snmp_test_lib.hrl").
-define(SNMP_USE_V3, true).
-include_lib("snmp/include/snmp_types.hrl").
@@ -83,39 +83,165 @@
_ -> V3
end).
-all(suite) -> {req,
- [mnesia, distribution,
- {local_slave_nodes, 2}, {time, 360}],
- [{conf, init_all, cases(), finish_all}]}.
+all() ->
+[cases()].
+
+groups() ->
+ [{mib_storage, [],
+ [{group, mib_storage_ets}, {group, mib_storage_dets},
+ {group, mib_storage_mnesia},
+ {group, mib_storage_size_check_ets},
+ {group, mib_storage_size_check_dets},
+ {group, mib_storage_size_check_mnesia},
+ {group, mib_storage_varm_dets},
+ {group, mib_storage_varm_mnesia}]},
+ {mib_storage_ets, [], mib_storage_ets_cases()},
+ {mib_storage_dets, [], mib_storage_dets_cases()},
+ {mib_storage_mnesia, [], mib_storage_mnesia_cases()},
+ {mib_storage_size_check_ets, [],
+ mse_size_check_cases()},
+ {mib_storage_size_check_dets, [],
+ msd_size_check_cases()},
+ {mib_storage_size_check_mnesia, [],
+ msm_size_check_cases()},
+ {mib_storage_varm_dets, [],
+ varm_mib_storage_dets_cases()},
+ {mib_storage_varm_mnesia, [],
+ varm_mib_storage_mnesia_cases()},
+ {test_v1, [], v1_cases()}, {test_v2, [], v2_cases()},
+ {test_v1_v2, [], v1_v2_cases()},
+ {test_v3, [], v3_cases()},
+ {test_multi_threaded, [], mt_cases()},
+ {multiple_reqs, [], mul_cases()},
+ {multiple_reqs_2, [], mul_cases_2()},
+ {v2_inform, [], [v2_inform_i]},
+ {v3_security, [],
+ [v3_crypto_basic, v3_md5_auth, v3_sha_auth,
+ v3_des_priv]},
+ {standard_mibs, [],
+ [snmp_standard_mib, snmp_community_mib,
+ snmp_framework_mib, snmp_target_mib,
+ snmp_notification_mib, snmp_view_based_acm_mib]},
+ {standard_mibs_2, [],
+ [snmpv2_mib_2, snmp_community_mib_2,
+ snmp_framework_mib_2, snmp_target_mib_2,
+ snmp_notification_mib_2, snmp_view_based_acm_mib_2]},
+ {standard_mibs_3, [],
+ [snmpv2_mib_3, snmp_framework_mib_3, snmp_mpd_mib_3,
+ snmp_target_mib_3, snmp_notification_mib_3,
+ snmp_view_based_acm_mib_3, snmp_user_based_sm_mib_3]},
+ {reported_bugs, [],
+ [otp_1128, otp_1129, otp_1131, otp_1162, otp_1222,
+ otp_1298, otp_1331, otp_1338, otp_1342, otp_2776,
+ otp_2979, otp_3187, otp_3725]},
+ {reported_bugs_2, [],
+ [otp_1128_2, otp_1129_2, otp_1131_2, otp_1162_2,
+ otp_1222_2, otp_1298_2, otp_1331_2, otp_1338_2,
+ otp_1342_2, otp_2776_2, otp_2979_2, otp_3187_2]},
+ {reported_bugs_3, [],
+ [otp_1128_3, otp_1129_3, otp_1131_3, otp_1162_3,
+ otp_1222_3, otp_1298_3, otp_1331_3, otp_1338_3,
+ otp_1342_3, otp_2776_3, otp_2979_3, otp_3187_3,
+ otp_3542]},
+ {tickets, [], [{group, otp_4394}]},
+ {otp_4394, [], [otp_4394_test]}].
+
+init_per_group(otp_4394, Config) ->
+ init_otp_4394(Config);
+init_per_group(v2_inform, Config) ->
+ init_v2_inform(Config);
+init_per_group(multiple_reqs_2, Config) ->
+ init_mul(Config);
+init_per_group(multiple_reqs, Config) ->
+ init_mul(Config);
+init_per_group(test_multi_threaded, Config) ->
+ init_mt(Config);
+init_per_group(test_v3, Config) ->
+ init_v3(Config);
+init_per_group(test_v1_v2, Config) ->
+ init_v1_v2(Config);
+init_per_group(test_v2, Config) ->
+ init_v2(Config);
+init_per_group(test_v1, Config) ->
+ init_v1(Config);
+init_per_group(mib_storage_varm_mnesia, Config) ->
+ init_varm_mib_storage_mnesia(Config);
+init_per_group(mib_storage_varm_dets, Config) ->
+ init_varm_mib_storage_dets(Config);
+init_per_group(mib_storage_size_check_mnesia, Config) ->
+ init_size_check_msm(Config);
+init_per_group(mib_storage_size_check_dets, Config) ->
+ init_size_check_msd(Config);
+init_per_group(mib_storage_size_check_ets, Config) ->
+ init_size_check_mse(Config);
+init_per_group(mib_storage_mnesia, Config) ->
+ init_mib_storage_mnesia(Config);
+init_per_group(mib_storage_dets, Config) ->
+ init_mib_storage_dets(Config);
+init_per_group(mib_storage_ets, Config) ->
+ init_mib_storage_ets(Config);
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(otp_4394, Config) ->
+ finish_otp_4394(Config);
+end_per_group(v2_inform, Config) ->
+ finish_v2_inform(Config);
+end_per_group(multiple_reqs_2, Config) ->
+ finish_mul(Config);
+end_per_group(multiple_reqs, Config) ->
+ finish_mul(Config);
+end_per_group(test_multi_threaded, Config) ->
+ finish_mt(Config);
+end_per_group(test_v3, Config) ->
+ finish_v3(Config);
+end_per_group(test_v1_v2, Config) ->
+ finish_v1_v2(Config);
+end_per_group(test_v2, Config) ->
+ finish_v2(Config);
+end_per_group(test_v1, Config) ->
+ finish_v1(Config);
+end_per_group(mib_storage_varm_mnesia, Config) ->
+ finish_varm_mib_storage_mnesia(Config);
+end_per_group(mib_storage_varm_dets, Config) ->
+ finish_varm_mib_storage_dets(Config);
+end_per_group(mib_storage_size_check_mnesia, Config) ->
+ finish_size_check_msm(Config);
+end_per_group(mib_storage_size_check_dets, Config) ->
+ finish_size_check_msd(Config);
+end_per_group(mib_storage_size_check_ets, Config) ->
+ finish_size_check_mse(Config);
+end_per_group(mib_storage_mnesia, Config) ->
+ finish_mib_storage_mnesia(Config);
+end_per_group(mib_storage_dets, Config) ->
+ finish_mib_storage_dets(Config);
+end_per_group(mib_storage_ets, Config) ->
+ finish_mib_storage_ets(Config);
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Case, Config) when list(Config) ->
Dog = ?t:timetrap(?t:minutes(6)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) when list(Config) ->
+end_per_testcase(_Case, Config) when list(Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
Config.
-cases() ->
- case ?OSTYPE() of
- vxworks ->
- %% No crypto app, so skip v3 testcases
- [
- app_info,
- test_v1, test_v2, test_v1_v2,
- test_multi_threaded,
- mib_storage,
- tickets];
- _Else ->
- [
- app_info,
- test_v1, test_v2, test_v1_v2, test_v3,
- test_multi_threaded,
- mib_storage,
- tickets
- ]
- end.
+cases() ->
+case ?OSTYPE() of
+ vxworks ->
+ [app_info, {group, test_v1}, {group, test_v2},
+ {group, test_v1_v2}, {group, test_multi_threaded},
+ {group, mib_storage}, {group, tickets}];
+ _Else ->
+ [app_info, {group, test_v1}, {group, test_v2},
+ {group, test_v1_v2}, {group, test_v3},
+ {group, test_multi_threaded}, {group, mib_storage},
+ {group, tickets}]
+end.
%%%-----------------------------------------------------------------
@@ -460,144 +586,56 @@ delete_mib_storage_mnesia_tables() ->
%% <base>, and a second version <base>_2. There may be several
%% versions as well, <base>_N.
%%-----------------------------------------------------------------
-mib_storage(suite) -> [
- mib_storage_ets,
- mib_storage_dets,
- mib_storage_mnesia,
- mib_storage_size_check_ets,
- mib_storage_size_check_dets,
- mib_storage_size_check_mnesia,
- mib_storage_varm_dets,
- mib_storage_varm_mnesia
- ].
-
-mib_storage_ets(suite) -> {req, [], {conf, init_mib_storage_ets,
- mib_storage_ets_cases(),
- finish_mib_storage_ets}}.
-
-mib_storage_dets(suite) -> {req, [], {conf, init_mib_storage_dets,
- mib_storage_dets_cases(),
- finish_mib_storage_dets}}.
-
-mib_storage_mnesia(suite) -> {req, [], {conf, init_mib_storage_mnesia,
- mib_storage_mnesia_cases(),
- finish_mib_storage_mnesia}}.
-
-mib_storage_size_check_ets(suite) ->
- {req, [], {conf,
- init_size_check_mse,
- mse_size_check_cases(),
- finish_size_check_mse}}.
-
-mib_storage_size_check_dets(suite) ->
- {req, [], {conf,
- init_size_check_msd,
- msd_size_check_cases(),
- finish_size_check_msd}}.
-
-mib_storage_size_check_mnesia(suite) ->
- {req, [], {conf,
- init_size_check_msm,
- msm_size_check_cases(),
- finish_size_check_msm}}.
-
-mib_storage_varm_dets(suite) ->
- {req, [], {conf,
- init_varm_mib_storage_dets,
- varm_mib_storage_dets_cases(),
- finish_varm_mib_storage_dets}}.
-
-mib_storage_varm_mnesia(suite) ->
- {req, [], {conf,
- init_varm_mib_storage_mnesia,
- varm_mib_storage_mnesia_cases(),
- finish_varm_mib_storage_mnesia}}.
-
-mib_storage_ets_cases() ->
- [
- mse_simple,
- mse_v1_processing,
- mse_big,
- mse_big2,
- mse_loop_mib,
- mse_api,
- mse_sa_register,
- mse_v1_trap,
- mse_sa_error,
- mse_next_across_sa,
- mse_undo,
- mse_standard_mib,
- mse_community_mib,
- mse_framework_mib,
- mse_target_mib,
- mse_notification_mib,
- mse_view_based_acm_mib,
- mse_sparse_table,
- mse_me_of,
- mse_mib_of].
-
-mib_storage_dets_cases() ->
- [
- msd_simple,
- msd_v1_processing,
- msd_big,
- msd_big2,
- msd_loop_mib,
- msd_api,
- msd_sa_register,
- msd_v1_trap,
- msd_sa_error,
- msd_next_across_sa,
- msd_undo,
- msd_standard_mib,
- msd_community_mib,
- msd_framework_mib,
- msd_target_mib,
- msd_notification_mib,
- msd_view_based_acm_mib,
- msd_sparse_table,
- msd_me_of,
- msd_mib_of
- ].
-
-mib_storage_mnesia_cases() ->
- [
- msm_simple,
- msm_v1_processing,
- msm_big,
- msm_big2,
- msm_loop_mib,
- msm_api,
- msm_sa_register,
- msm_v1_trap,
- msm_sa_error,
- msm_next_across_sa,
- msm_undo,
- msm_standard_mib,
- msm_community_mib,
- msm_framework_mib,
- msm_target_mib,
- msm_notification_mib,
- msm_view_based_acm_mib,
- msm_sparse_table,
- msm_me_of,
- msm_mib_of
- ].
-
-mse_size_check_cases() ->
- [mse_size_check].
-
-msd_size_check_cases() ->
- [msd_size_check].
-
-msm_size_check_cases() ->
- [msm_size_check].
-
-varm_mib_storage_dets_cases() ->
- [msd_varm_mib_start].
-
-varm_mib_storage_mnesia_cases() ->
- [msm_varm_mib_start].
+
+
+
+
+
+
+
+
+
+mib_storage_ets_cases() ->
+[mse_simple, mse_v1_processing, mse_big, mse_big2,
+ mse_loop_mib, mse_api, mse_sa_register, mse_v1_trap,
+ mse_sa_error, mse_next_across_sa, mse_undo,
+ mse_standard_mib, mse_community_mib, mse_framework_mib,
+ mse_target_mib, mse_notification_mib,
+ mse_view_based_acm_mib, mse_sparse_table, mse_me_of,
+ mse_mib_of].
+
+mib_storage_dets_cases() ->
+[msd_simple, msd_v1_processing, msd_big, msd_big2,
+ msd_loop_mib, msd_api, msd_sa_register, msd_v1_trap,
+ msd_sa_error, msd_next_across_sa, msd_undo,
+ msd_standard_mib, msd_community_mib, msd_framework_mib,
+ msd_target_mib, msd_notification_mib,
+ msd_view_based_acm_mib, msd_sparse_table, msd_me_of,
+ msd_mib_of].
+
+mib_storage_mnesia_cases() ->
+[msm_simple, msm_v1_processing, msm_big, msm_big2,
+ msm_loop_mib, msm_api, msm_sa_register, msm_v1_trap,
+ msm_sa_error, msm_next_across_sa, msm_undo,
+ msm_standard_mib, msm_community_mib, msm_framework_mib,
+ msm_target_mib, msm_notification_mib,
+ msm_view_based_acm_mib, msm_sparse_table, msm_me_of,
+ msm_mib_of].
+
+mse_size_check_cases() ->
+[mse_size_check].
+
+msd_size_check_cases() ->
+[msd_size_check].
+
+msm_size_check_cases() ->
+[msm_size_check].
+
+varm_mib_storage_dets_cases() ->
+[msd_varm_mib_start].
+
+varm_mib_storage_mnesia_cases() ->
+[msm_varm_mib_start].
init_mib_storage_ets(Config) when list(Config) ->
?LOG("init_mib_storage_ets -> entry", []),
@@ -1099,20 +1137,14 @@ app_dir(App) ->
end.
-test_v1(suite) -> {req, [], {conf, init_v1, v1_cases(), finish_v1}}.
%v1_cases() -> [loop_mib];
-v1_cases() ->
- [simple,
- db_notify_client,
- v1_processing, big, big2, loop_mib,
- api, subagent, mnesia, multiple_reqs,
- sa_register, v1_trap, sa_error, next_across_sa, undo, reported_bugs,
- standard_mibs, sparse_table, cnt_64,
- opaque,
- % opaque].
-
- change_target_addr_config].
+v1_cases() ->
+[simple, db_notify_client, v1_processing, big, big2,
+ loop_mib, api, subagent, mnesia, {group, multiple_reqs},
+ sa_register, v1_trap, sa_error, next_across_sa, undo,
+ {group, reported_bugs}, {group, standard_mibs},
+ sparse_table, cnt_64, opaque, change_target_addr_config].
init_v1(Config) when list(Config) ->
?line SaNode = ?config(snmp_sa, Config),
@@ -1129,15 +1161,15 @@ finish_v1(Config) when list(Config) ->
delete_files(C1),
lists:keydelete(vsn, 1, C1).
-test_v2(suite) -> {req, [], {conf, init_v2, v2_cases(), finish_v2}}.
%v2_cases() -> [loop_mib_2];
-v2_cases() ->
- [simple_2, v2_processing, big_2, big2_2, loop_mib_2,
- api_2, subagent_2, mnesia_2,
- multiple_reqs_2, sa_register_2, v2_trap, v2_inform, sa_error_2,
- next_across_sa_2, undo_2, reported_bugs_2, standard_mibs_2,
- v2_types, implied, sparse_table_2, cnt_64_2, opaque_2, v2_caps].
+v2_cases() ->
+[simple_2, v2_processing, big_2, big2_2, loop_mib_2,
+ api_2, subagent_2, mnesia_2, {group, multiple_reqs_2},
+ sa_register_2, v2_trap, {group, v2_inform}, sa_error_2,
+ next_across_sa_2, undo_2, {group, reported_bugs_2},
+ {group, standard_mibs_2}, v2_types, implied,
+ sparse_table_2, cnt_64_2, opaque_2, v2_caps].
init_v2(Config) when list(Config) ->
SaNode = ?config(snmp_sa, Config),
@@ -1154,10 +1186,9 @@ finish_v2(Config) when list(Config) ->
delete_files(C1),
lists:keydelete(vsn, 1, C1).
-test_v1_v2(suite) -> {req, [], {conf, init_v1_v2, v1_v2_cases(), finish_v1_v2}}.
-v1_v2_cases() ->
- [simple_bi].
+v1_v2_cases() ->
+[simple_bi].
init_v1_v2(Config) when list(Config) ->
SaNode = ?config(snmp_sa, Config),
@@ -1174,16 +1205,16 @@ finish_v1_v2(Config) when list(Config) ->
delete_files(C1),
lists:keydelete(vsn, 1, C1).
-test_v3(suite) -> {req, [], {conf, init_v3, v3_cases(), finish_v3}}.
%v3_cases() -> [loop_mib_3];
-v3_cases() ->
- [simple_3, v3_processing,
- big_3, big2_3, api_3, subagent_3, mnesia_3, loop_mib_3,
- multiple_reqs_3, sa_register_3, v3_trap, v3_inform, sa_error_3,
- next_across_sa_3, undo_3, reported_bugs_3, standard_mibs_3,
- v3_security,
- v2_types_3, implied_3, sparse_table_3, cnt_64_3, opaque_3, v2_caps_3].
+v3_cases() ->
+[simple_3, v3_processing, big_3, big2_3, api_3,
+ subagent_3, mnesia_3, loop_mib_3, multiple_reqs_3,
+ sa_register_3, v3_trap, v3_inform, sa_error_3,
+ next_across_sa_3, undo_3, {group, reported_bugs_3},
+ {group, standard_mibs_3}, {group, v3_security},
+ v2_types_3, implied_3, sparse_table_3, cnt_64_3,
+ opaque_3, v2_caps_3].
init_v3(Config) when list(Config) ->
%% Make sure crypto works, otherwise start_agent will fail
@@ -1221,10 +1252,9 @@ finish_v3(Config) when list(Config) ->
delete_files(C1),
lists:keydelete(vsn, 1, C1).
-test_multi_threaded(suite) -> {req, [], {conf, init_mt, mt_cases(), finish_mt}}.
-mt_cases() ->
- [multi_threaded, mt_trap].
+mt_cases() ->
+[multi_threaded, mt_trap].
init_mt(Config) when list(Config) ->
SaNode = ?config(snmp_sa, Config),
@@ -1739,21 +1769,19 @@ mnesia_2(X) -> mnesia(X).
mnesia_3(X) -> mnesia(X).
-multiple_reqs(suite) ->
- {req, [], {conf, init_mul, mul_cases(), finish_mul}}.
-mul_cases() ->
- [mul_get, mul_get_err, mul_next, mul_next_err, mul_set_err].
+mul_cases() ->
+[mul_get, mul_get_err, mul_next, mul_next_err,
+ mul_set_err].
-multiple_reqs_2(suite) ->
- {req, [], {conf, init_mul, mul_cases_2(), finish_mul}}.
multiple_reqs_3(_X) ->
{req, [], {conf, init_mul, mul_cases_3(), finish_mul}}.
-mul_cases_2() ->
- [mul_get_2, mul_get_err_2, mul_next_2, mul_next_err_2, mul_set_err_2].
+mul_cases_2() ->
+[mul_get_2, mul_get_err_2, mul_next_2, mul_next_err_2,
+ mul_set_err_2].
mul_cases_3() ->
@@ -1939,8 +1967,6 @@ v2_trap(Config) when list(Config) ->
v3_trap(X) ->
v2_trap(X).
-v2_inform(suite) ->
- {req, [], {conf, init_v2_inform, [v2_inform_i], finish_v2_inform}}.
v3_inform(_X) ->
%% v2_inform(X).
@@ -2112,7 +2138,6 @@ v3_processing(Config) when list(Config) ->
%% accomplished by the first inform sent. That one will generate a
%% report, which makes it in sync. The notification-generating
%% application times out, and send again. This time it'll work.
-v3_security(suite) -> [v3_crypto_basic, v3_md5_auth, v3_sha_auth, v3_des_priv].
v3_crypto_basic(suite) -> [];
v3_crypto_basic(_Config) ->
@@ -3591,22 +3616,8 @@ bad_return() ->
%%% Note that many of the functions in the standard mib is
%%% already tested by the normal tests.
%%%-----------------------------------------------------------------
-standard_mibs(suite) ->
- [snmp_standard_mib, snmp_community_mib,
- snmp_framework_mib,
- snmp_target_mib, snmp_notification_mib,
- snmp_view_based_acm_mib].
-
-standard_mibs_2(suite) ->
- [snmpv2_mib_2, snmp_community_mib_2,
- snmp_framework_mib_2,
- snmp_target_mib_2, snmp_notification_mib_2,
- snmp_view_based_acm_mib_2].
-
-standard_mibs_3(suite) ->
- [snmpv2_mib_3,snmp_framework_mib_3, snmp_mpd_mib_3,
- snmp_target_mib_3, snmp_notification_mib_3,
- snmp_view_based_acm_mib_3, snmp_user_based_sm_mib_3].
+
+
%%-----------------------------------------------------------------
%% For this test, the agent is configured for v1.
@@ -4527,27 +4538,12 @@ loop_it_2(Oid, N) ->
%%% Testing of reported bugs and other tickets.
%%%-----------------------------------------------------------------
-reported_bugs(suite) ->
- [otp_1128, otp_1129, otp_1131, otp_1162,
- otp_1222, otp_1298, otp_1331, otp_1338,
- otp_1342, otp_2776, otp_2979, otp_3187, otp_3725].
-reported_bugs_2(suite) ->
- [otp_1128_2, otp_1129_2, otp_1131_2, otp_1162_2,
- otp_1222_2, otp_1298_2, otp_1331_2, otp_1338_2,
- otp_1342_2, otp_2776_2, otp_2979_2, otp_3187_2].
-reported_bugs_3(suite) ->
- [otp_1128_3, otp_1129_3, otp_1131_3, otp_1162_3,
- otp_1222_3, otp_1298_3, otp_1331_3, otp_1338_3,
- otp_1342_3, otp_2776_3, otp_2979_3, otp_3187_3,
- otp_3542].
%% These are (ticket) test cases where the initiation has to be done
%% individually.
-tickets(suite) ->
- [otp_4394].
%%-----------------------------------------------------------------
%% Ticket: OTP-1128
@@ -4971,10 +4967,6 @@ otp_3725_test(MaNode) ->
%%-----------------------------------------------------------------
-otp_4394(suite) -> {req, [], {conf,
- init_otp_4394,
- [otp_4394_test],
- finish_otp_4394}}.
init_otp_4394(Config) when list(Config) ->
?DBG("init_otp_4394 -> entry with"
diff --git a/lib/snmp/test/snmp_agent_nfilter_test.erl b/lib/snmp/test/snmp_agent_nfilter_test.erl
index 269c7c96c9..f08060cee3 100644
--- a/lib/snmp/test/snmp_agent_nfilter_test.erl
+++ b/lib/snmp/test/snmp_agent_nfilter_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2010. 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
@@ -25,7 +25,7 @@
%%----------------------------------------------------------------------
%% Include files
%%----------------------------------------------------------------------
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("snmp_test_lib.hrl").
@@ -33,8 +33,8 @@
%% External exports
%%----------------------------------------------------------------------
-export([
- all/1,
- init_per_testcase/2, fin_per_testcase/2
+ all/0,
+ init_per_testcase/2, end_per_testcase/2
]).
%%----------------------------------------------------------------------
@@ -58,14 +58,14 @@
init_per_testcase(_Case, Config) when is_list(Config) ->
Config.
-fin_per_testcase(_Case, Config) when is_list(Config) ->
+end_per_testcase(_Case, Config) when is_list(Config) ->
Config.
%%======================================================================
%% Test case definitions
%%======================================================================
-all(_) ->
- ?SKIP(not_yet_implemented).
+all() ->
+ {skip,not_yet_implemented}.
%%======================================================================
diff --git a/lib/snmp/test/snmp_agent_test.erl b/lib/snmp/test/snmp_agent_test.erl
index 9d2e9969c4..692d29fda0 100644
--- a/lib/snmp/test/snmp_agent_test.erl
+++ b/lib/snmp/test/snmp_agent_test.erl
@@ -28,7 +28,7 @@
-define(application, snmp).
-include_lib("kernel/include/file.hrl").
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("snmp_test_lib.hrl").
-define(SNMP_USE_V3, true).
-include_lib("snmp/include/snmp_types.hrl").
@@ -85,18 +85,171 @@
end).
-all(suite) ->
- Reqs = [mnesia, distribution, {local_slave_nodes, 2}, {time, 360}],
- Conf1 = [{conf, init_all, cases(), finish_all}],
- Conf2 = [tickets2],
- {req, Reqs, Conf1 ++ Conf2}.
+all() ->
+ Reqs = [mnesia, distribution, {local_slave_nodes, 2},
+ {time, 360}],
+ Conf1 = [{group, all_tcs}],
+ Conf2 = [{group, tickets2}],
+ Conf1 ++ Conf2.
+
+groups() ->
+ [{all_tcs, [], cases()},
+ {mib_storage, [],
+ [{group, mib_storage_ets}, {group, mib_storage_dets},
+ {group, mib_storage_mnesia},
+ {group, mib_storage_size_check_ets},
+ {group, mib_storage_size_check_dets},
+ {group, mib_storage_size_check_mnesia},
+ {group, mib_storage_varm_dets},
+ {group, mib_storage_varm_mnesia}]},
+ {mib_storage_ets, [], mib_storage_ets_cases()},
+ {mib_storage_dets, [], mib_storage_dets_cases()},
+ {mib_storage_mnesia, [], mib_storage_mnesia_cases()},
+ {mib_storage_size_check_ets, [],
+ mse_size_check_cases()},
+ {mib_storage_size_check_dets, [],
+ msd_size_check_cases()},
+ {mib_storage_size_check_mnesia, [],
+ msm_size_check_cases()},
+ {mib_storage_varm_dets, [],
+ varm_mib_storage_dets_cases()},
+ {mib_storage_varm_mnesia, [],
+ varm_mib_storage_mnesia_cases()},
+ {misc, [], misc_cases()}, {test_v1, [], v1_cases()},
+ {test_v2, [], v2_cases()},
+ {test_v1_v2, [], v1_v2_cases()},
+ {test_v3, [], v3_cases()},
+ {test_multi_threaded, [], mt_cases()},
+ {multiple_reqs, [], mul_cases()},
+ {multiple_reqs_2, [], mul_cases_2()},
+ {v2_inform, [], [v2_inform_i]},
+ {v3_security, [],
+ [v3_crypto_basic, v3_md5_auth, v3_sha_auth,
+ v3_des_priv]},
+ {standard_mibs, [],
+ [snmp_standard_mib, snmp_community_mib,
+ snmp_framework_mib, snmp_target_mib,
+ snmp_notification_mib, snmp_view_based_acm_mib]},
+ {standard_mibs_2, [],
+ [snmpv2_mib_2, snmp_community_mib_2,
+ snmp_framework_mib_2, snmp_target_mib_2,
+ snmp_notification_mib_2, snmp_view_based_acm_mib_2]},
+ {standard_mibs_3, [],
+ [snmpv2_mib_3, snmp_framework_mib_3, snmp_mpd_mib_3,
+ snmp_target_mib_3, snmp_notification_mib_3,
+ snmp_view_based_acm_mib_3, snmp_user_based_sm_mib_3]},
+ {reported_bugs, [],
+ [otp_1128, otp_1129, otp_1131, otp_1162, otp_1222,
+ otp_1298, otp_1331, otp_1338, otp_1342, otp_2776,
+ otp_2979, otp_3187, otp_3725]},
+ {reported_bugs_2, [],
+ [otp_1128_2, otp_1129_2, otp_1131_2, otp_1162_2,
+ otp_1222_2, otp_1298_2, otp_1331_2, otp_1338_2,
+ otp_1342_2, otp_2776_2, otp_2979_2, otp_3187_2]},
+ {reported_bugs_3, [],
+ [otp_1128_3, otp_1129_3, otp_1131_3, otp_1162_3,
+ otp_1222_3, otp_1298_3, otp_1331_3, otp_1338_3,
+ otp_1342_3, otp_2776_3, otp_2979_3, otp_3187_3,
+ otp_3542]},
+ {tickets1, [], [{group, otp_4394}, {group, otp_7157}]},
+ {tickets2, [], [otp8395]},
+ {otp_4394, [], [otp_4394_test]},
+ {otp_7157, [],
+ begin Reqs = [], Conf = [otp_7157_test], Conf end}].
+
+init_per_group(all_tcs, Config) ->
+ init_all(Config);
+init_per_group(otp_7157, Config) ->
+ init_otp_7157(Config);
+init_per_group(otp_4394, Config) ->
+ init_otp_4394(Config);
+init_per_group(v2_inform, Config) ->
+ init_v2_inform(Config);
+init_per_group(multiple_reqs_2, Config) ->
+ init_mul(Config);
+init_per_group(multiple_reqs, Config) ->
+ init_mul(Config);
+init_per_group(test_multi_threaded, Config) ->
+ init_mt(Config);
+init_per_group(test_v3, Config) ->
+ init_v3(Config);
+init_per_group(test_v1_v2, Config) ->
+ init_v1_v2(Config);
+init_per_group(test_v2, Config) ->
+ init_v2(Config);
+init_per_group(test_v1, Config) ->
+ init_v1(Config);
+init_per_group(misc, Config) ->
+ init_misc(Config);
+init_per_group(mib_storage_varm_mnesia, Config) ->
+ init_varm_mib_storage_mnesia(Config);
+init_per_group(mib_storage_varm_dets, Config) ->
+ init_varm_mib_storage_dets(Config);
+init_per_group(mib_storage_size_check_mnesia, Config) ->
+ init_size_check_msm(Config);
+init_per_group(mib_storage_size_check_dets, Config) ->
+ init_size_check_msd(Config);
+init_per_group(mib_storage_size_check_ets, Config) ->
+ init_size_check_mse(Config);
+init_per_group(mib_storage_mnesia, Config) ->
+ init_mib_storage_mnesia(Config);
+init_per_group(mib_storage_dets, Config) ->
+ init_mib_storage_dets(Config);
+init_per_group(mib_storage_ets, Config) ->
+ init_mib_storage_ets(Config);
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(all_tcs, Config) ->
+ finish_all(Config);
+end_per_group(otp_7157, Config) ->
+ finish_otp_7157(Config);
+end_per_group(otp_4394, Config) ->
+ finish_otp_4394(Config);
+end_per_group(v2_inform, Config) ->
+ finish_v2_inform(Config);
+end_per_group(multiple_reqs_2, Config) ->
+ finish_mul(Config);
+end_per_group(multiple_reqs, Config) ->
+ finish_mul(Config);
+end_per_group(test_multi_threaded, Config) ->
+ finish_mt(Config);
+end_per_group(test_v3, Config) ->
+ finish_v3(Config);
+end_per_group(test_v1_v2, Config) ->
+ finish_v1_v2(Config);
+end_per_group(test_v2, Config) ->
+ finish_v2(Config);
+end_per_group(test_v1, Config) ->
+ finish_v1(Config);
+end_per_group(misc, Config) ->
+ finish_misc(Config);
+end_per_group(mib_storage_varm_mnesia, Config) ->
+ finish_varm_mib_storage_mnesia(Config);
+end_per_group(mib_storage_varm_dets, Config) ->
+ finish_varm_mib_storage_dets(Config);
+end_per_group(mib_storage_size_check_mnesia, Config) ->
+ finish_size_check_msm(Config);
+end_per_group(mib_storage_size_check_dets, Config) ->
+ finish_size_check_msd(Config);
+end_per_group(mib_storage_size_check_ets, Config) ->
+ finish_size_check_mse(Config);
+end_per_group(mib_storage_mnesia, Config) ->
+ finish_mib_storage_mnesia(Config);
+end_per_group(mib_storage_dets, Config) ->
+ finish_mib_storage_dets(Config);
+end_per_group(mib_storage_ets, Config) ->
+ finish_mib_storage_ets(Config);
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(otp8395 = Case, Config) when is_list(Config) ->
?DBG("init_per_testcase -> entry with"
"~n Case: ~p"
"~n Config: ~p", [Case, Config]),
- Config2 = init_per_testcase2(Case, init_suite(Config)),
+ Config2 = init_per_testcase2(Case, init_per_suite(Config)),
otp8395({init, Config2});
init_per_testcase(otp_7157_test = _Case, Config) when is_list(Config) ->
?DBG("init_per_testcase -> entry with"
@@ -123,10 +276,10 @@ init_per_testcase(_Case, Config) when is_list(Config) ->
Dog = ?WD_START(?MINS(6)),
[{watchdog, Dog}|Config].
-fin_per_testcase(otp8395, Config) when is_list(Config) ->
+end_per_testcase(otp8395, Config) when is_list(Config) ->
otp8395({fin, Config});
-fin_per_testcase(_Case, Config) when is_list(Config) ->
- ?DBG("fin_per_testcase -> entry with"
+end_per_testcase(_Case, Config) when is_list(Config) ->
+ ?DBG("end_per_testcase -> entry with"
"~n Case: ~p"
"~n Config: ~p", [_Case, Config]),
Dog = ?config(watchdog, Config),
@@ -134,8 +287,8 @@ fin_per_testcase(_Case, Config) when is_list(Config) ->
Config.
-init_suite(Config) ->
- ?DBG("init_suite -> entry with"
+init_per_suite(Config) ->
+ ?DBG("init_per_suite -> entry with"
"~n Config: ~p", [Config]),
%% Suite root dir for test suite
@@ -170,12 +323,12 @@ init_suite(Config) ->
{mib_dir, MibDir},
{std_mib_dir, StdMibDir} | Config1],
- ?DBG("init_suite -> done when"
+ ?DBG("init_per_suite -> done when"
"~n Config2: ~p", [Config2]),
Config2.
%% end_per_suite(Config) ->
-end_suite(Config) ->
+end_per_suite(Config) ->
Config.
fix_data_dir(Config) ->
@@ -220,35 +373,22 @@ init_per_testcase2(Case, Config) ->
{sub_agent_top_dir, SubAgentTopDir},
{manager_top_dir, ManagerTopDir} | Config].
-fin_per_testcase2(_Case, Config) ->
+end_per_testcase2(_Case, Config) ->
Config.
-cases() ->
- case ?OSTYPE() of
- vxworks ->
- %% No crypto app, so skip v3 testcases
- [
- misc,
- test_v1,
- test_v2,
- test_v1_v2,
- test_multi_threaded,
- mib_storage,
- tickets1
- ];
- _Else ->
- [
- misc,
- test_v1,
- test_v2,
- test_v1_v2,
- test_v3,
- test_multi_threaded,
- mib_storage,
- tickets1
- ]
- end.
+cases() ->
+case ?OSTYPE() of
+ vxworks ->
+ [{group, misc}, {group, test_v1}, {group, test_v2},
+ {group, test_v1_v2}, {group, test_multi_threaded},
+ {group, mib_storage}, {group, tickets1}];
+ _Else ->
+ [{group, misc}, {group, test_v1}, {group, test_v2},
+ {group, test_v1_v2}, {group, test_v3},
+ {group, test_multi_threaded}, {group, mib_storage},
+ {group, tickets1}]
+end.
%%%-----------------------------------------------------------------
@@ -355,144 +495,56 @@ delete_mib_storage_mnesia_tables() ->
%% <base>, and a second version <base>_2. There may be several
%% versions as well, <base>_N.
%%-----------------------------------------------------------------
-mib_storage(suite) -> [
- mib_storage_ets,
- mib_storage_dets,
- mib_storage_mnesia,
- mib_storage_size_check_ets,
- mib_storage_size_check_dets,
- mib_storage_size_check_mnesia,
- mib_storage_varm_dets,
- mib_storage_varm_mnesia
- ].
-
-mib_storage_ets(suite) -> {req, [], {conf, init_mib_storage_ets,
- mib_storage_ets_cases(),
- finish_mib_storage_ets}}.
-
-mib_storage_dets(suite) -> {req, [], {conf, init_mib_storage_dets,
- mib_storage_dets_cases(),
- finish_mib_storage_dets}}.
-
-mib_storage_mnesia(suite) -> {req, [], {conf, init_mib_storage_mnesia,
- mib_storage_mnesia_cases(),
- finish_mib_storage_mnesia}}.
-
-mib_storage_size_check_ets(suite) ->
- {req, [], {conf,
- init_size_check_mse,
- mse_size_check_cases(),
- finish_size_check_mse}}.
-
-mib_storage_size_check_dets(suite) ->
- {req, [], {conf,
- init_size_check_msd,
- msd_size_check_cases(),
- finish_size_check_msd}}.
-
-mib_storage_size_check_mnesia(suite) ->
- {req, [], {conf,
- init_size_check_msm,
- msm_size_check_cases(),
- finish_size_check_msm}}.
-
-mib_storage_varm_dets(suite) ->
- {req, [], {conf,
- init_varm_mib_storage_dets,
- varm_mib_storage_dets_cases(),
- finish_varm_mib_storage_dets}}.
-
-mib_storage_varm_mnesia(suite) ->
- {req, [], {conf,
- init_varm_mib_storage_mnesia,
- varm_mib_storage_mnesia_cases(),
- finish_varm_mib_storage_mnesia}}.
-
-mib_storage_ets_cases() ->
- [
- mse_simple,
- mse_v1_processing,
- mse_big,
- mse_big2,
- mse_loop_mib,
- mse_api,
- mse_sa_register,
- mse_v1_trap,
- mse_sa_error,
- mse_next_across_sa,
- mse_undo,
- mse_standard_mib,
- mse_community_mib,
- mse_framework_mib,
- mse_target_mib,
- mse_notification_mib,
- mse_view_based_acm_mib,
- mse_sparse_table,
- mse_me_of,
- mse_mib_of].
-
-mib_storage_dets_cases() ->
- [
- msd_simple,
- msd_v1_processing,
- msd_big,
- msd_big2,
- msd_loop_mib,
- msd_api,
- msd_sa_register,
- msd_v1_trap,
- msd_sa_error,
- msd_next_across_sa,
- msd_undo,
- msd_standard_mib,
- msd_community_mib,
- msd_framework_mib,
- msd_target_mib,
- msd_notification_mib,
- msd_view_based_acm_mib,
- msd_sparse_table,
- msd_me_of,
- msd_mib_of
- ].
-
-mib_storage_mnesia_cases() ->
- [
- msm_simple,
- msm_v1_processing,
- msm_big,
- msm_big2,
- msm_loop_mib,
- msm_api,
- msm_sa_register,
- msm_v1_trap,
- msm_sa_error,
- msm_next_across_sa,
- msm_undo,
- msm_standard_mib,
- msm_community_mib,
- msm_framework_mib,
- msm_target_mib,
- msm_notification_mib,
- msm_view_based_acm_mib,
- msm_sparse_table,
- msm_me_of,
- msm_mib_of
- ].
-
-mse_size_check_cases() ->
- [mse_size_check].
-
-msd_size_check_cases() ->
- [msd_size_check].
-
-msm_size_check_cases() ->
- [msm_size_check].
-
-varm_mib_storage_dets_cases() ->
- [msd_varm_mib_start].
-
-varm_mib_storage_mnesia_cases() ->
- [msm_varm_mib_start].
+
+
+
+
+
+
+
+
+
+mib_storage_ets_cases() ->
+[mse_simple, mse_v1_processing, mse_big, mse_big2,
+ mse_loop_mib, mse_api, mse_sa_register, mse_v1_trap,
+ mse_sa_error, mse_next_across_sa, mse_undo,
+ mse_standard_mib, mse_community_mib, mse_framework_mib,
+ mse_target_mib, mse_notification_mib,
+ mse_view_based_acm_mib, mse_sparse_table, mse_me_of,
+ mse_mib_of].
+
+mib_storage_dets_cases() ->
+[msd_simple, msd_v1_processing, msd_big, msd_big2,
+ msd_loop_mib, msd_api, msd_sa_register, msd_v1_trap,
+ msd_sa_error, msd_next_across_sa, msd_undo,
+ msd_standard_mib, msd_community_mib, msd_framework_mib,
+ msd_target_mib, msd_notification_mib,
+ msd_view_based_acm_mib, msd_sparse_table, msd_me_of,
+ msd_mib_of].
+
+mib_storage_mnesia_cases() ->
+[msm_simple, msm_v1_processing, msm_big, msm_big2,
+ msm_loop_mib, msm_api, msm_sa_register, msm_v1_trap,
+ msm_sa_error, msm_next_across_sa, msm_undo,
+ msm_standard_mib, msm_community_mib, msm_framework_mib,
+ msm_target_mib, msm_notification_mib,
+ msm_view_based_acm_mib, msm_sparse_table, msm_me_of,
+ msm_mib_of].
+
+mse_size_check_cases() ->
+[mse_size_check].
+
+msd_size_check_cases() ->
+[msd_size_check].
+
+msm_size_check_cases() ->
+[msm_size_check].
+
+varm_mib_storage_dets_cases() ->
+[msd_varm_mib_start].
+
+varm_mib_storage_mnesia_cases() ->
+[msm_varm_mib_start].
init_mib_storage_ets(Config) when is_list(Config) ->
?LOG("init_mib_storage_ets -> entry", []),
@@ -975,8 +1027,6 @@ mib_of(Oid, ExpectedMibName) ->
end.
-misc(suite) ->
- {req, [], {conf, init_misc, misc_cases(), finish_misc}}.
init_misc(Config) ->
init_v1(Config).
@@ -984,11 +1034,8 @@ init_misc(Config) ->
finish_misc(Config) ->
finish_v1(Config).
-misc_cases() ->
- [
- app_info,
- info_test
- ].
+misc_cases() ->
+[app_info, info_test].
app_info(suite) -> [];
app_info(Config) when is_list(Config) ->
@@ -1021,34 +1068,14 @@ app_dir(App) ->
end.
-test_v1(suite) -> {req, [], {conf, init_v1, v1_cases(), finish_v1}}.
%v1_cases() -> [loop_mib];
-v1_cases() ->
- [
- simple,
- db_notify_client,
- v1_processing,
- big,
- big2,
- loop_mib,
- api,
- subagent,
- mnesia,
- multiple_reqs,
- sa_register,
- v1_trap,
- sa_error,
- next_across_sa,
- undo,
- reported_bugs,
- standard_mibs,
- sparse_table,
- cnt_64,
- opaque,
-
- change_target_addr_config
- ].
+v1_cases() ->
+[simple, db_notify_client, v1_processing, big, big2,
+ loop_mib, api, subagent, mnesia, {group, multiple_reqs},
+ sa_register, v1_trap, sa_error, next_across_sa, undo,
+ {group, reported_bugs}, {group, standard_mibs},
+ sparse_table, cnt_64, opaque, change_target_addr_config].
init_v1(Config) when is_list(Config) ->
?line SaNode = ?config(snmp_sa, Config),
@@ -1065,34 +1092,14 @@ finish_v1(Config) when is_list(Config) ->
delete_files(C1),
lists:keydelete(vsn, 1, C1).
-test_v2(suite) -> {req, [], {conf, init_v2, v2_cases(), finish_v2}}.
-
-v2_cases() ->
- [
- simple_2,
- v2_processing,
- big_2,
- big2_2,
- loop_mib_2,
- api_2,
- subagent_2,
- mnesia_2,
- multiple_reqs_2,
- sa_register_2,
- v2_trap,
- v2_inform,
- sa_error_2,
- next_across_sa_2,
- undo_2,
- reported_bugs_2,
- standard_mibs_2,
- v2_types,
- implied,
- sparse_table_2,
- cnt_64_2,
- opaque_2,
- v2_caps
- ].
+
+v2_cases() ->
+[simple_2, v2_processing, big_2, big2_2, loop_mib_2,
+ api_2, subagent_2, mnesia_2, {group, multiple_reqs_2},
+ sa_register_2, v2_trap, {group, v2_inform}, sa_error_2,
+ next_across_sa_2, undo_2, {group, reported_bugs_2},
+ {group, standard_mibs_2}, v2_types, implied,
+ sparse_table_2, cnt_64_2, opaque_2, v2_caps].
init_v2(Config) when is_list(Config) ->
SaNode = ?config(snmp_sa, Config),
@@ -1109,11 +1116,9 @@ finish_v2(Config) when is_list(Config) ->
delete_files(C1),
lists:keydelete(vsn, 1, C1).
-test_v1_v2(suite) ->
- {req, [], {conf, init_v1_v2, v1_v2_cases(), finish_v1_v2}}.
-v1_v2_cases() ->
- [simple_bi].
+v1_v2_cases() ->
+[simple_bi].
init_v1_v2(Config) when is_list(Config) ->
SaNode = ?config(snmp_sa, Config),
@@ -1130,35 +1135,15 @@ finish_v1_v2(Config) when is_list(Config) ->
delete_files(C1),
lists:keydelete(vsn, 1, C1).
-test_v3(suite) -> {req, [], {conf, init_v3, v3_cases(), finish_v3}}.
-
-v3_cases() ->
- [
- simple_3,
- v3_processing,
- big_3,
- big2_3,
- api_3,
- subagent_3,
- mnesia_3,
- loop_mib_3,
- multiple_reqs_3,
- sa_register_3,
- v3_trap,
- v3_inform,
- sa_error_3,
- next_across_sa_3,
- undo_3,
- reported_bugs_3,
- standard_mibs_3,
- v3_security,
- v2_types_3,
- implied_3,
- sparse_table_3,
- cnt_64_3,
- opaque_3,
- v2_caps_3
- ].
+
+v3_cases() ->
+[simple_3, v3_processing, big_3, big2_3, api_3,
+ subagent_3, mnesia_3, loop_mib_3, multiple_reqs_3,
+ sa_register_3, v3_trap, v3_inform, sa_error_3,
+ next_across_sa_3, undo_3, {group, reported_bugs_3},
+ {group, standard_mibs_3}, {group, v3_security},
+ v2_types_3, implied_3, sparse_table_3, cnt_64_3,
+ opaque_3, v2_caps_3].
init_v3(Config) when is_list(Config) ->
%% Make sure crypto works, otherwise start_agent will fail
@@ -1196,11 +1181,9 @@ finish_v3(Config) when is_list(Config) ->
delete_files(C1),
lists:keydelete(vsn, 1, C1).
-test_multi_threaded(suite) ->
- {req, [], {conf, init_mt, mt_cases(), finish_mt}}.
-mt_cases() ->
- [multi_threaded, mt_trap].
+mt_cases() ->
+[multi_threaded, mt_trap].
init_mt(Config) when is_list(Config) ->
SaNode = ?config(snmp_sa, Config),
@@ -1690,21 +1673,19 @@ mnesia_2(X) -> ?P(mnesia_2), mnesia(X).
mnesia_3(X) -> ?P(mnesia_3), mnesia(X).
-multiple_reqs(suite) ->
- {req, [], {conf, init_mul, mul_cases(), finish_mul}}.
-mul_cases() ->
- [mul_get, mul_get_err, mul_next, mul_next_err, mul_set_err].
+mul_cases() ->
+[mul_get, mul_get_err, mul_next, mul_next_err,
+ mul_set_err].
-multiple_reqs_2(suite) ->
- {req, [], {conf, init_mul, mul_cases_2(), finish_mul}}.
multiple_reqs_3(_X) ->
{req, [], {conf, init_mul, mul_cases_3(), finish_mul}}.
-mul_cases_2() ->
- [mul_get_2, mul_get_err_2, mul_next_2, mul_next_err_2, mul_set_err_2].
+mul_cases_2() ->
+[mul_get_2, mul_get_err_2, mul_next_2, mul_next_err_2,
+ mul_set_err_2].
mul_cases_3() ->
@@ -1929,8 +1910,6 @@ v3_trap(Config) when is_list(Config) ->
?P(v3_trap),
trap2(Config).
-v2_inform(suite) ->
- {req, [], {conf, init_v2_inform, [v2_inform_i], finish_v2_inform}}.
v3_inform(_X) ->
%% v2_inform(X).
@@ -2190,13 +2169,6 @@ v3_processing(Config) when is_list(Config) ->
%% accomplished by the first inform sent. That one will generate a
%% report, which makes it in sync. The notification-generating
%% application times out, and send again. This time it'll work.
-v3_security(suite) ->
- [
- v3_crypto_basic,
- v3_md5_auth,
- v3_sha_auth,
- v3_des_priv
- ].
v3_crypto_basic(suite) -> [];
v3_crypto_basic(_Config) ->
@@ -4044,36 +4016,8 @@ bad_return() ->
%%% Note that many of the functions in the standard mib is
%%% already tested by the normal tests.
%%%-----------------------------------------------------------------
-standard_mibs(suite) ->
- [
- snmp_standard_mib,
- snmp_community_mib,
- snmp_framework_mib,
- snmp_target_mib,
- snmp_notification_mib,
- snmp_view_based_acm_mib
- ].
-
-standard_mibs_2(suite) ->
- [
- snmpv2_mib_2,
- snmp_community_mib_2,
- snmp_framework_mib_2,
- snmp_target_mib_2,
- snmp_notification_mib_2,
- snmp_view_based_acm_mib_2
- ].
-
-standard_mibs_3(suite) ->
- [
- snmpv2_mib_3,
- snmp_framework_mib_3,
- snmp_mpd_mib_3,
- snmp_target_mib_3,
- snmp_notification_mib_3,
- snmp_view_based_acm_mib_3,
- snmp_user_based_sm_mib_3
- ].
+
+
%%-----------------------------------------------------------------
%% For this test, the agent is configured for v1.
@@ -5117,70 +5061,14 @@ loop_it_2(Oid, N) ->
%%% Testing of reported bugs and other tickets.
%%%-----------------------------------------------------------------
-reported_bugs(suite) ->
- [
- otp_1128,
- otp_1129,
- otp_1131,
- otp_1162,
- otp_1222,
- otp_1298,
- otp_1331,
- otp_1338,
- otp_1342,
- otp_2776,
- otp_2979,
- otp_3187,
- otp_3725
- ].
-
-reported_bugs_2(suite) ->
- [
- otp_1128_2,
- otp_1129_2,
- otp_1131_2,
- otp_1162_2,
- otp_1222_2,
- otp_1298_2,
- otp_1331_2,
- otp_1338_2,
- otp_1342_2,
- otp_2776_2,
- otp_2979_2,
- otp_3187_2
- ].
-
-reported_bugs_3(suite) ->
- [
- otp_1128_3,
- otp_1129_3,
- otp_1131_3,
- otp_1162_3,
- otp_1222_3,
- otp_1298_3,
- otp_1331_3,
- otp_1338_3,
- otp_1342_3,
- otp_2776_3,
- otp_2979_3,
- otp_3187_3,
- otp_3542
- ].
+
+
%% These are (ticket) test cases where the initiation has to be done
%% individually.
-tickets1(suite) ->
- [
- otp_4394,
- otp_7157
- ].
-tickets2(suite) ->
- [
- otp8395
- ].
@@ -5661,10 +5549,6 @@ otp_3725_test(MaNode) ->
%%-----------------------------------------------------------------
-otp_4394(suite) -> {req, [], {conf,
- init_otp_4394,
- [otp_4394_test],
- finish_otp_4394}}.
init_otp_4394(Config) when is_list(Config) ->
?DBG("init_otp_4394 -> entry with"
@@ -5758,10 +5642,6 @@ otp_4394_test1() ->
%%-----------------------------------------------------------------
-otp_7157(suite) ->
- Reqs = [],
- Conf = [{conf, init_otp_7157, [otp_7157_test], finish_otp_7157}],
- {req, Reqs, Conf}.
init_otp_7157(Config) when is_list(Config) ->
%% <CONDITIONAL-SKIP>
diff --git a/lib/snmp/test/snmp_agent_v1_test.erl b/lib/snmp/test/snmp_agent_v1_test.erl
index 52ac6cf58f..737bb25cc3 100644
--- a/lib/snmp/test/snmp_agent_v1_test.erl
+++ b/lib/snmp/test/snmp_agent_v1_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
@@ -103,7 +103,7 @@ init_per_testcase(_Case, Config) when list(Config) ->
Dog = ?t:timetrap(?t:minutes(6)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) when list(Config) ->
+end_per_testcase(_Case, Config) when list(Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
Config.
diff --git a/lib/snmp/test/snmp_agent_v2_test.erl b/lib/snmp/test/snmp_agent_v2_test.erl
index eca66dc30d..dc94c18ad9 100644
--- a/lib/snmp/test/snmp_agent_v2_test.erl
+++ b/lib/snmp/test/snmp_agent_v2_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
@@ -28,7 +28,7 @@
-define(application, snmp).
-include_lib("kernel/include/file.hrl").
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("snmp_test_lib.hrl").
-define(SNMP_USE_V3, true).
-include_lib("snmp/include/snmp_types.hrl").
@@ -83,39 +83,165 @@
_ -> V3
end).
-all(suite) -> {req,
- [mnesia, distribution,
- {local_slave_nodes, 2}, {time, 360}],
- [{conf, init_all, cases(), finish_all}]}.
+all() ->
+[cases()].
+
+groups() ->
+ [{mib_storage, [],
+ [{group, mib_storage_ets}, {group, mib_storage_dets},
+ {group, mib_storage_mnesia},
+ {group, mib_storage_size_check_ets},
+ {group, mib_storage_size_check_dets},
+ {group, mib_storage_size_check_mnesia},
+ {group, mib_storage_varm_dets},
+ {group, mib_storage_varm_mnesia}]},
+ {mib_storage_ets, [], mib_storage_ets_cases()},
+ {mib_storage_dets, [], mib_storage_dets_cases()},
+ {mib_storage_mnesia, [], mib_storage_mnesia_cases()},
+ {mib_storage_size_check_ets, [],
+ mse_size_check_cases()},
+ {mib_storage_size_check_dets, [],
+ msd_size_check_cases()},
+ {mib_storage_size_check_mnesia, [],
+ msm_size_check_cases()},
+ {mib_storage_varm_dets, [],
+ varm_mib_storage_dets_cases()},
+ {mib_storage_varm_mnesia, [],
+ varm_mib_storage_mnesia_cases()},
+ {test_v1, [], v1_cases()}, {test_v2, [], v2_cases()},
+ {test_v1_v2, [], v1_v2_cases()},
+ {test_v3, [], v3_cases()},
+ {test_multi_threaded, [], mt_cases()},
+ {multiple_reqs, [], mul_cases()},
+ {multiple_reqs_2, [], mul_cases_2()},
+ {v2_inform, [], [v2_inform_i]},
+ {v3_security, [],
+ [v3_crypto_basic, v3_md5_auth, v3_sha_auth,
+ v3_des_priv]},
+ {standard_mibs, [],
+ [snmp_standard_mib, snmp_community_mib,
+ snmp_framework_mib, snmp_target_mib,
+ snmp_notification_mib, snmp_view_based_acm_mib]},
+ {standard_mibs_2, [],
+ [snmpv2_mib_2, snmp_community_mib_2,
+ snmp_framework_mib_2, snmp_target_mib_2,
+ snmp_notification_mib_2, snmp_view_based_acm_mib_2]},
+ {standard_mibs_3, [],
+ [snmpv2_mib_3, snmp_framework_mib_3, snmp_mpd_mib_3,
+ snmp_target_mib_3, snmp_notification_mib_3,
+ snmp_view_based_acm_mib_3, snmp_user_based_sm_mib_3]},
+ {reported_bugs, [],
+ [otp_1128, otp_1129, otp_1131, otp_1162, otp_1222,
+ otp_1298, otp_1331, otp_1338, otp_1342, otp_2776,
+ otp_2979, otp_3187, otp_3725]},
+ {reported_bugs_2, [],
+ [otp_1128_2, otp_1129_2, otp_1131_2, otp_1162_2,
+ otp_1222_2, otp_1298_2, otp_1331_2, otp_1338_2,
+ otp_1342_2, otp_2776_2, otp_2979_2, otp_3187_2]},
+ {reported_bugs_3, [],
+ [otp_1128_3, otp_1129_3, otp_1131_3, otp_1162_3,
+ otp_1222_3, otp_1298_3, otp_1331_3, otp_1338_3,
+ otp_1342_3, otp_2776_3, otp_2979_3, otp_3187_3,
+ otp_3542]},
+ {tickets, [], [{group, otp_4394}]},
+ {otp_4394, [], [otp_4394_test]}].
+
+init_per_group(otp_4394, Config) ->
+ init_otp_4394(Config);
+init_per_group(v2_inform, Config) ->
+ init_v2_inform(Config);
+init_per_group(multiple_reqs_2, Config) ->
+ init_mul(Config);
+init_per_group(multiple_reqs, Config) ->
+ init_mul(Config);
+init_per_group(test_multi_threaded, Config) ->
+ init_mt(Config);
+init_per_group(test_v3, Config) ->
+ init_v3(Config);
+init_per_group(test_v1_v2, Config) ->
+ init_v1_v2(Config);
+init_per_group(test_v2, Config) ->
+ init_v2(Config);
+init_per_group(test_v1, Config) ->
+ init_v1(Config);
+init_per_group(mib_storage_varm_mnesia, Config) ->
+ init_varm_mib_storage_mnesia(Config);
+init_per_group(mib_storage_varm_dets, Config) ->
+ init_varm_mib_storage_dets(Config);
+init_per_group(mib_storage_size_check_mnesia, Config) ->
+ init_size_check_msm(Config);
+init_per_group(mib_storage_size_check_dets, Config) ->
+ init_size_check_msd(Config);
+init_per_group(mib_storage_size_check_ets, Config) ->
+ init_size_check_mse(Config);
+init_per_group(mib_storage_mnesia, Config) ->
+ init_mib_storage_mnesia(Config);
+init_per_group(mib_storage_dets, Config) ->
+ init_mib_storage_dets(Config);
+init_per_group(mib_storage_ets, Config) ->
+ init_mib_storage_ets(Config);
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(otp_4394, Config) ->
+ finish_otp_4394(Config);
+end_per_group(v2_inform, Config) ->
+ finish_v2_inform(Config);
+end_per_group(multiple_reqs_2, Config) ->
+ finish_mul(Config);
+end_per_group(multiple_reqs, Config) ->
+ finish_mul(Config);
+end_per_group(test_multi_threaded, Config) ->
+ finish_mt(Config);
+end_per_group(test_v3, Config) ->
+ finish_v3(Config);
+end_per_group(test_v1_v2, Config) ->
+ finish_v1_v2(Config);
+end_per_group(test_v2, Config) ->
+ finish_v2(Config);
+end_per_group(test_v1, Config) ->
+ finish_v1(Config);
+end_per_group(mib_storage_varm_mnesia, Config) ->
+ finish_varm_mib_storage_mnesia(Config);
+end_per_group(mib_storage_varm_dets, Config) ->
+ finish_varm_mib_storage_dets(Config);
+end_per_group(mib_storage_size_check_mnesia, Config) ->
+ finish_size_check_msm(Config);
+end_per_group(mib_storage_size_check_dets, Config) ->
+ finish_size_check_msd(Config);
+end_per_group(mib_storage_size_check_ets, Config) ->
+ finish_size_check_mse(Config);
+end_per_group(mib_storage_mnesia, Config) ->
+ finish_mib_storage_mnesia(Config);
+end_per_group(mib_storage_dets, Config) ->
+ finish_mib_storage_dets(Config);
+end_per_group(mib_storage_ets, Config) ->
+ finish_mib_storage_ets(Config);
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Case, Config) when list(Config) ->
Dog = ?t:timetrap(?t:minutes(6)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) when list(Config) ->
+end_per_testcase(_Case, Config) when list(Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
Config.
-cases() ->
- case ?OSTYPE() of
- vxworks ->
- %% No crypto app, so skip v3 testcases
- [
- app_info,
- test_v1, test_v2, test_v1_v2,
- test_multi_threaded,
- mib_storage,
- tickets];
- _Else ->
- [
- app_info,
- test_v1, test_v2, test_v1_v2, test_v3,
- test_multi_threaded,
- mib_storage,
- tickets
- ]
- end.
+cases() ->
+case ?OSTYPE() of
+ vxworks ->
+ [app_info, {group, test_v1}, {group, test_v2},
+ {group, test_v1_v2}, {group, test_multi_threaded},
+ {group, mib_storage}, {group, tickets}];
+ _Else ->
+ [app_info, {group, test_v1}, {group, test_v2},
+ {group, test_v1_v2}, {group, test_v3},
+ {group, test_multi_threaded}, {group, mib_storage},
+ {group, tickets}]
+end.
%%%-----------------------------------------------------------------
@@ -460,144 +586,56 @@ delete_mib_storage_mnesia_tables() ->
%% <base>, and a second version <base>_2. There may be several
%% versions as well, <base>_N.
%%-----------------------------------------------------------------
-mib_storage(suite) -> [
- mib_storage_ets,
- mib_storage_dets,
- mib_storage_mnesia,
- mib_storage_size_check_ets,
- mib_storage_size_check_dets,
- mib_storage_size_check_mnesia,
- mib_storage_varm_dets,
- mib_storage_varm_mnesia
- ].
-
-mib_storage_ets(suite) -> {req, [], {conf, init_mib_storage_ets,
- mib_storage_ets_cases(),
- finish_mib_storage_ets}}.
-
-mib_storage_dets(suite) -> {req, [], {conf, init_mib_storage_dets,
- mib_storage_dets_cases(),
- finish_mib_storage_dets}}.
-
-mib_storage_mnesia(suite) -> {req, [], {conf, init_mib_storage_mnesia,
- mib_storage_mnesia_cases(),
- finish_mib_storage_mnesia}}.
-
-mib_storage_size_check_ets(suite) ->
- {req, [], {conf,
- init_size_check_mse,
- mse_size_check_cases(),
- finish_size_check_mse}}.
-
-mib_storage_size_check_dets(suite) ->
- {req, [], {conf,
- init_size_check_msd,
- msd_size_check_cases(),
- finish_size_check_msd}}.
-
-mib_storage_size_check_mnesia(suite) ->
- {req, [], {conf,
- init_size_check_msm,
- msm_size_check_cases(),
- finish_size_check_msm}}.
-
-mib_storage_varm_dets(suite) ->
- {req, [], {conf,
- init_varm_mib_storage_dets,
- varm_mib_storage_dets_cases(),
- finish_varm_mib_storage_dets}}.
-
-mib_storage_varm_mnesia(suite) ->
- {req, [], {conf,
- init_varm_mib_storage_mnesia,
- varm_mib_storage_mnesia_cases(),
- finish_varm_mib_storage_mnesia}}.
-
-mib_storage_ets_cases() ->
- [
- mse_simple,
- mse_v1_processing,
- mse_big,
- mse_big2,
- mse_loop_mib,
- mse_api,
- mse_sa_register,
- mse_v1_trap,
- mse_sa_error,
- mse_next_across_sa,
- mse_undo,
- mse_standard_mib,
- mse_community_mib,
- mse_framework_mib,
- mse_target_mib,
- mse_notification_mib,
- mse_view_based_acm_mib,
- mse_sparse_table,
- mse_me_of,
- mse_mib_of].
-
-mib_storage_dets_cases() ->
- [
- msd_simple,
- msd_v1_processing,
- msd_big,
- msd_big2,
- msd_loop_mib,
- msd_api,
- msd_sa_register,
- msd_v1_trap,
- msd_sa_error,
- msd_next_across_sa,
- msd_undo,
- msd_standard_mib,
- msd_community_mib,
- msd_framework_mib,
- msd_target_mib,
- msd_notification_mib,
- msd_view_based_acm_mib,
- msd_sparse_table,
- msd_me_of,
- msd_mib_of
- ].
-
-mib_storage_mnesia_cases() ->
- [
- msm_simple,
- msm_v1_processing,
- msm_big,
- msm_big2,
- msm_loop_mib,
- msm_api,
- msm_sa_register,
- msm_v1_trap,
- msm_sa_error,
- msm_next_across_sa,
- msm_undo,
- msm_standard_mib,
- msm_community_mib,
- msm_framework_mib,
- msm_target_mib,
- msm_notification_mib,
- msm_view_based_acm_mib,
- msm_sparse_table,
- msm_me_of,
- msm_mib_of
- ].
-
-mse_size_check_cases() ->
- [mse_size_check].
-
-msd_size_check_cases() ->
- [msd_size_check].
-
-msm_size_check_cases() ->
- [msm_size_check].
-
-varm_mib_storage_dets_cases() ->
- [msd_varm_mib_start].
-
-varm_mib_storage_mnesia_cases() ->
- [msm_varm_mib_start].
+
+
+
+
+
+
+
+
+
+mib_storage_ets_cases() ->
+[mse_simple, mse_v1_processing, mse_big, mse_big2,
+ mse_loop_mib, mse_api, mse_sa_register, mse_v1_trap,
+ mse_sa_error, mse_next_across_sa, mse_undo,
+ mse_standard_mib, mse_community_mib, mse_framework_mib,
+ mse_target_mib, mse_notification_mib,
+ mse_view_based_acm_mib, mse_sparse_table, mse_me_of,
+ mse_mib_of].
+
+mib_storage_dets_cases() ->
+[msd_simple, msd_v1_processing, msd_big, msd_big2,
+ msd_loop_mib, msd_api, msd_sa_register, msd_v1_trap,
+ msd_sa_error, msd_next_across_sa, msd_undo,
+ msd_standard_mib, msd_community_mib, msd_framework_mib,
+ msd_target_mib, msd_notification_mib,
+ msd_view_based_acm_mib, msd_sparse_table, msd_me_of,
+ msd_mib_of].
+
+mib_storage_mnesia_cases() ->
+[msm_simple, msm_v1_processing, msm_big, msm_big2,
+ msm_loop_mib, msm_api, msm_sa_register, msm_v1_trap,
+ msm_sa_error, msm_next_across_sa, msm_undo,
+ msm_standard_mib, msm_community_mib, msm_framework_mib,
+ msm_target_mib, msm_notification_mib,
+ msm_view_based_acm_mib, msm_sparse_table, msm_me_of,
+ msm_mib_of].
+
+mse_size_check_cases() ->
+[mse_size_check].
+
+msd_size_check_cases() ->
+[msd_size_check].
+
+msm_size_check_cases() ->
+[msm_size_check].
+
+varm_mib_storage_dets_cases() ->
+[msd_varm_mib_start].
+
+varm_mib_storage_mnesia_cases() ->
+[msm_varm_mib_start].
init_mib_storage_ets(Config) when list(Config) ->
?LOG("init_mib_storage_ets -> entry", []),
@@ -1099,20 +1137,14 @@ app_dir(App) ->
end.
-test_v1(suite) -> {req, [], {conf, init_v1, v1_cases(), finish_v1}}.
%v1_cases() -> [loop_mib];
-v1_cases() ->
- [simple,
- db_notify_client,
- v1_processing, big, big2, loop_mib,
- api, subagent, mnesia, multiple_reqs,
- sa_register, v1_trap, sa_error, next_across_sa, undo, reported_bugs,
- standard_mibs, sparse_table, cnt_64,
- opaque,
- % opaque].
-
- change_target_addr_config].
+v1_cases() ->
+[simple, db_notify_client, v1_processing, big, big2,
+ loop_mib, api, subagent, mnesia, {group, multiple_reqs},
+ sa_register, v1_trap, sa_error, next_across_sa, undo,
+ {group, reported_bugs}, {group, standard_mibs},
+ sparse_table, cnt_64, opaque, change_target_addr_config].
init_v1(Config) when list(Config) ->
?line SaNode = ?config(snmp_sa, Config),
@@ -1129,15 +1161,15 @@ finish_v1(Config) when list(Config) ->
delete_files(C1),
lists:keydelete(vsn, 1, C1).
-test_v2(suite) -> {req, [], {conf, init_v2, v2_cases(), finish_v2}}.
%v2_cases() -> [loop_mib_2];
-v2_cases() ->
- [simple_2, v2_processing, big_2, big2_2, loop_mib_2,
- api_2, subagent_2, mnesia_2,
- multiple_reqs_2, sa_register_2, v2_trap, v2_inform, sa_error_2,
- next_across_sa_2, undo_2, reported_bugs_2, standard_mibs_2,
- v2_types, implied, sparse_table_2, cnt_64_2, opaque_2, v2_caps].
+v2_cases() ->
+[simple_2, v2_processing, big_2, big2_2, loop_mib_2,
+ api_2, subagent_2, mnesia_2, {group, multiple_reqs_2},
+ sa_register_2, v2_trap, {group, v2_inform}, sa_error_2,
+ next_across_sa_2, undo_2, {group, reported_bugs_2},
+ {group, standard_mibs_2}, v2_types, implied,
+ sparse_table_2, cnt_64_2, opaque_2, v2_caps].
init_v2(Config) when list(Config) ->
SaNode = ?config(snmp_sa, Config),
@@ -1154,10 +1186,9 @@ finish_v2(Config) when list(Config) ->
delete_files(C1),
lists:keydelete(vsn, 1, C1).
-test_v1_v2(suite) -> {req, [], {conf, init_v1_v2, v1_v2_cases(), finish_v1_v2}}.
-v1_v2_cases() ->
- [simple_bi].
+v1_v2_cases() ->
+[simple_bi].
init_v1_v2(Config) when list(Config) ->
SaNode = ?config(snmp_sa, Config),
@@ -1174,16 +1205,16 @@ finish_v1_v2(Config) when list(Config) ->
delete_files(C1),
lists:keydelete(vsn, 1, C1).
-test_v3(suite) -> {req, [], {conf, init_v3, v3_cases(), finish_v3}}.
%v3_cases() -> [loop_mib_3];
-v3_cases() ->
- [simple_3, v3_processing,
- big_3, big2_3, api_3, subagent_3, mnesia_3, loop_mib_3,
- multiple_reqs_3, sa_register_3, v3_trap, v3_inform, sa_error_3,
- next_across_sa_3, undo_3, reported_bugs_3, standard_mibs_3,
- v3_security,
- v2_types_3, implied_3, sparse_table_3, cnt_64_3, opaque_3, v2_caps_3].
+v3_cases() ->
+[simple_3, v3_processing, big_3, big2_3, api_3,
+ subagent_3, mnesia_3, loop_mib_3, multiple_reqs_3,
+ sa_register_3, v3_trap, v3_inform, sa_error_3,
+ next_across_sa_3, undo_3, {group, reported_bugs_3},
+ {group, standard_mibs_3}, {group, v3_security},
+ v2_types_3, implied_3, sparse_table_3, cnt_64_3,
+ opaque_3, v2_caps_3].
init_v3(Config) when list(Config) ->
%% Make sure crypto works, otherwise start_agent will fail
@@ -1221,10 +1252,9 @@ finish_v3(Config) when list(Config) ->
delete_files(C1),
lists:keydelete(vsn, 1, C1).
-test_multi_threaded(suite) -> {req, [], {conf, init_mt, mt_cases(), finish_mt}}.
-mt_cases() ->
- [multi_threaded, mt_trap].
+mt_cases() ->
+[multi_threaded, mt_trap].
init_mt(Config) when list(Config) ->
SaNode = ?config(snmp_sa, Config),
@@ -1739,21 +1769,19 @@ mnesia_2(X) -> mnesia(X).
mnesia_3(X) -> mnesia(X).
-multiple_reqs(suite) ->
- {req, [], {conf, init_mul, mul_cases(), finish_mul}}.
-mul_cases() ->
- [mul_get, mul_get_err, mul_next, mul_next_err, mul_set_err].
+mul_cases() ->
+[mul_get, mul_get_err, mul_next, mul_next_err,
+ mul_set_err].
-multiple_reqs_2(suite) ->
- {req, [], {conf, init_mul, mul_cases_2(), finish_mul}}.
multiple_reqs_3(_X) ->
{req, [], {conf, init_mul, mul_cases_3(), finish_mul}}.
-mul_cases_2() ->
- [mul_get_2, mul_get_err_2, mul_next_2, mul_next_err_2, mul_set_err_2].
+mul_cases_2() ->
+[mul_get_2, mul_get_err_2, mul_next_2, mul_next_err_2,
+ mul_set_err_2].
mul_cases_3() ->
@@ -1939,8 +1967,6 @@ v2_trap(Config) when list(Config) ->
v3_trap(X) ->
v2_trap(X).
-v2_inform(suite) ->
- {req, [], {conf, init_v2_inform, [v2_inform_i], finish_v2_inform}}.
v3_inform(_X) ->
%% v2_inform(X).
@@ -2112,7 +2138,6 @@ v3_processing(Config) when list(Config) ->
%% accomplished by the first inform sent. That one will generate a
%% report, which makes it in sync. The notification-generating
%% application times out, and send again. This time it'll work.
-v3_security(suite) -> [v3_crypto_basic, v3_md5_auth, v3_sha_auth, v3_des_priv].
v3_crypto_basic(suite) -> [];
v3_crypto_basic(_Config) ->
@@ -3591,22 +3616,8 @@ bad_return() ->
%%% Note that many of the functions in the standard mib is
%%% already tested by the normal tests.
%%%-----------------------------------------------------------------
-standard_mibs(suite) ->
- [snmp_standard_mib, snmp_community_mib,
- snmp_framework_mib,
- snmp_target_mib, snmp_notification_mib,
- snmp_view_based_acm_mib].
-
-standard_mibs_2(suite) ->
- [snmpv2_mib_2, snmp_community_mib_2,
- snmp_framework_mib_2,
- snmp_target_mib_2, snmp_notification_mib_2,
- snmp_view_based_acm_mib_2].
-
-standard_mibs_3(suite) ->
- [snmpv2_mib_3,snmp_framework_mib_3, snmp_mpd_mib_3,
- snmp_target_mib_3, snmp_notification_mib_3,
- snmp_view_based_acm_mib_3, snmp_user_based_sm_mib_3].
+
+
%%-----------------------------------------------------------------
%% For this test, the agent is configured for v1.
@@ -4527,27 +4538,12 @@ loop_it_2(Oid, N) ->
%%% Testing of reported bugs and other tickets.
%%%-----------------------------------------------------------------
-reported_bugs(suite) ->
- [otp_1128, otp_1129, otp_1131, otp_1162,
- otp_1222, otp_1298, otp_1331, otp_1338,
- otp_1342, otp_2776, otp_2979, otp_3187, otp_3725].
-reported_bugs_2(suite) ->
- [otp_1128_2, otp_1129_2, otp_1131_2, otp_1162_2,
- otp_1222_2, otp_1298_2, otp_1331_2, otp_1338_2,
- otp_1342_2, otp_2776_2, otp_2979_2, otp_3187_2].
-reported_bugs_3(suite) ->
- [otp_1128_3, otp_1129_3, otp_1131_3, otp_1162_3,
- otp_1222_3, otp_1298_3, otp_1331_3, otp_1338_3,
- otp_1342_3, otp_2776_3, otp_2979_3, otp_3187_3,
- otp_3542].
%% These are (ticket) test cases where the initiation has to be done
%% individually.
-tickets(suite) ->
- [otp_4394].
%%-----------------------------------------------------------------
%% Ticket: OTP-1128
@@ -4971,10 +4967,6 @@ otp_3725_test(MaNode) ->
%%-----------------------------------------------------------------
-otp_4394(suite) -> {req, [], {conf,
- init_otp_4394,
- [otp_4394_test],
- finish_otp_4394}}.
init_otp_4394(Config) when list(Config) ->
?DBG("init_otp_4394 -> entry with"
diff --git a/lib/snmp/test/snmp_agent_v3_test.erl b/lib/snmp/test/snmp_agent_v3_test.erl
index 823c914136..266be72878 100644
--- a/lib/snmp/test/snmp_agent_v3_test.erl
+++ b/lib/snmp/test/snmp_agent_v3_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
@@ -28,7 +28,7 @@
-define(application, snmp).
-include_lib("kernel/include/file.hrl").
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("snmp_test_lib.hrl").
-define(SNMP_USE_V3, true).
-include_lib("snmp/include/snmp_types.hrl").
@@ -83,39 +83,165 @@
_ -> V3
end).
-all(suite) -> {req,
- [mnesia, distribution,
- {local_slave_nodes, 2}, {time, 360}],
- [{conf, init_all, cases(), finish_all}]}.
+all() ->
+[cases()].
+
+groups() ->
+ [{mib_storage, [],
+ [{group, mib_storage_ets}, {group, mib_storage_dets},
+ {group, mib_storage_mnesia},
+ {group, mib_storage_size_check_ets},
+ {group, mib_storage_size_check_dets},
+ {group, mib_storage_size_check_mnesia},
+ {group, mib_storage_varm_dets},
+ {group, mib_storage_varm_mnesia}]},
+ {mib_storage_ets, [], mib_storage_ets_cases()},
+ {mib_storage_dets, [], mib_storage_dets_cases()},
+ {mib_storage_mnesia, [], mib_storage_mnesia_cases()},
+ {mib_storage_size_check_ets, [],
+ mse_size_check_cases()},
+ {mib_storage_size_check_dets, [],
+ msd_size_check_cases()},
+ {mib_storage_size_check_mnesia, [],
+ msm_size_check_cases()},
+ {mib_storage_varm_dets, [],
+ varm_mib_storage_dets_cases()},
+ {mib_storage_varm_mnesia, [],
+ varm_mib_storage_mnesia_cases()},
+ {test_v1, [], v1_cases()}, {test_v2, [], v2_cases()},
+ {test_v1_v2, [], v1_v2_cases()},
+ {test_v3, [], v3_cases()},
+ {test_multi_threaded, [], mt_cases()},
+ {multiple_reqs, [], mul_cases()},
+ {multiple_reqs_2, [], mul_cases_2()},
+ {v2_inform, [], [v2_inform_i]},
+ {v3_security, [],
+ [v3_crypto_basic, v3_md5_auth, v3_sha_auth,
+ v3_des_priv]},
+ {standard_mibs, [],
+ [snmp_standard_mib, snmp_community_mib,
+ snmp_framework_mib, snmp_target_mib,
+ snmp_notification_mib, snmp_view_based_acm_mib]},
+ {standard_mibs_2, [],
+ [snmpv2_mib_2, snmp_community_mib_2,
+ snmp_framework_mib_2, snmp_target_mib_2,
+ snmp_notification_mib_2, snmp_view_based_acm_mib_2]},
+ {standard_mibs_3, [],
+ [snmpv2_mib_3, snmp_framework_mib_3, snmp_mpd_mib_3,
+ snmp_target_mib_3, snmp_notification_mib_3,
+ snmp_view_based_acm_mib_3, snmp_user_based_sm_mib_3]},
+ {reported_bugs, [],
+ [otp_1128, otp_1129, otp_1131, otp_1162, otp_1222,
+ otp_1298, otp_1331, otp_1338, otp_1342, otp_2776,
+ otp_2979, otp_3187, otp_3725]},
+ {reported_bugs_2, [],
+ [otp_1128_2, otp_1129_2, otp_1131_2, otp_1162_2,
+ otp_1222_2, otp_1298_2, otp_1331_2, otp_1338_2,
+ otp_1342_2, otp_2776_2, otp_2979_2, otp_3187_2]},
+ {reported_bugs_3, [],
+ [otp_1128_3, otp_1129_3, otp_1131_3, otp_1162_3,
+ otp_1222_3, otp_1298_3, otp_1331_3, otp_1338_3,
+ otp_1342_3, otp_2776_3, otp_2979_3, otp_3187_3,
+ otp_3542]},
+ {tickets, [], [{group, otp_4394}]},
+ {otp_4394, [], [otp_4394_test]}].
+
+init_per_group(otp_4394, Config) ->
+ init_otp_4394(Config);
+init_per_group(v2_inform, Config) ->
+ init_v2_inform(Config);
+init_per_group(multiple_reqs_2, Config) ->
+ init_mul(Config);
+init_per_group(multiple_reqs, Config) ->
+ init_mul(Config);
+init_per_group(test_multi_threaded, Config) ->
+ init_mt(Config);
+init_per_group(test_v3, Config) ->
+ init_v3(Config);
+init_per_group(test_v1_v2, Config) ->
+ init_v1_v2(Config);
+init_per_group(test_v2, Config) ->
+ init_v2(Config);
+init_per_group(test_v1, Config) ->
+ init_v1(Config);
+init_per_group(mib_storage_varm_mnesia, Config) ->
+ init_varm_mib_storage_mnesia(Config);
+init_per_group(mib_storage_varm_dets, Config) ->
+ init_varm_mib_storage_dets(Config);
+init_per_group(mib_storage_size_check_mnesia, Config) ->
+ init_size_check_msm(Config);
+init_per_group(mib_storage_size_check_dets, Config) ->
+ init_size_check_msd(Config);
+init_per_group(mib_storage_size_check_ets, Config) ->
+ init_size_check_mse(Config);
+init_per_group(mib_storage_mnesia, Config) ->
+ init_mib_storage_mnesia(Config);
+init_per_group(mib_storage_dets, Config) ->
+ init_mib_storage_dets(Config);
+init_per_group(mib_storage_ets, Config) ->
+ init_mib_storage_ets(Config);
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(otp_4394, Config) ->
+ finish_otp_4394(Config);
+end_per_group(v2_inform, Config) ->
+ finish_v2_inform(Config);
+end_per_group(multiple_reqs_2, Config) ->
+ finish_mul(Config);
+end_per_group(multiple_reqs, Config) ->
+ finish_mul(Config);
+end_per_group(test_multi_threaded, Config) ->
+ finish_mt(Config);
+end_per_group(test_v3, Config) ->
+ finish_v3(Config);
+end_per_group(test_v1_v2, Config) ->
+ finish_v1_v2(Config);
+end_per_group(test_v2, Config) ->
+ finish_v2(Config);
+end_per_group(test_v1, Config) ->
+ finish_v1(Config);
+end_per_group(mib_storage_varm_mnesia, Config) ->
+ finish_varm_mib_storage_mnesia(Config);
+end_per_group(mib_storage_varm_dets, Config) ->
+ finish_varm_mib_storage_dets(Config);
+end_per_group(mib_storage_size_check_mnesia, Config) ->
+ finish_size_check_msm(Config);
+end_per_group(mib_storage_size_check_dets, Config) ->
+ finish_size_check_msd(Config);
+end_per_group(mib_storage_size_check_ets, Config) ->
+ finish_size_check_mse(Config);
+end_per_group(mib_storage_mnesia, Config) ->
+ finish_mib_storage_mnesia(Config);
+end_per_group(mib_storage_dets, Config) ->
+ finish_mib_storage_dets(Config);
+end_per_group(mib_storage_ets, Config) ->
+ finish_mib_storage_ets(Config);
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Case, Config) when list(Config) ->
Dog = ?t:timetrap(?t:minutes(6)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) when list(Config) ->
+end_per_testcase(_Case, Config) when list(Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
Config.
-cases() ->
- case ?OSTYPE() of
- vxworks ->
- %% No crypto app, so skip v3 testcases
- [
- app_info,
- test_v1, test_v2, test_v1_v2,
- test_multi_threaded,
- mib_storage,
- tickets];
- _Else ->
- [
- app_info,
- test_v1, test_v2, test_v1_v2, test_v3,
- test_multi_threaded,
- mib_storage,
- tickets
- ]
- end.
+cases() ->
+case ?OSTYPE() of
+ vxworks ->
+ [app_info, {group, test_v1}, {group, test_v2},
+ {group, test_v1_v2}, {group, test_multi_threaded},
+ {group, mib_storage}, {group, tickets}];
+ _Else ->
+ [app_info, {group, test_v1}, {group, test_v2},
+ {group, test_v1_v2}, {group, test_v3},
+ {group, test_multi_threaded}, {group, mib_storage},
+ {group, tickets}]
+end.
%%%-----------------------------------------------------------------
@@ -460,144 +586,56 @@ delete_mib_storage_mnesia_tables() ->
%% <base>, and a second version <base>_2. There may be several
%% versions as well, <base>_N.
%%-----------------------------------------------------------------
-mib_storage(suite) -> [
- mib_storage_ets,
- mib_storage_dets,
- mib_storage_mnesia,
- mib_storage_size_check_ets,
- mib_storage_size_check_dets,
- mib_storage_size_check_mnesia,
- mib_storage_varm_dets,
- mib_storage_varm_mnesia
- ].
-
-mib_storage_ets(suite) -> {req, [], {conf, init_mib_storage_ets,
- mib_storage_ets_cases(),
- finish_mib_storage_ets}}.
-
-mib_storage_dets(suite) -> {req, [], {conf, init_mib_storage_dets,
- mib_storage_dets_cases(),
- finish_mib_storage_dets}}.
-
-mib_storage_mnesia(suite) -> {req, [], {conf, init_mib_storage_mnesia,
- mib_storage_mnesia_cases(),
- finish_mib_storage_mnesia}}.
-
-mib_storage_size_check_ets(suite) ->
- {req, [], {conf,
- init_size_check_mse,
- mse_size_check_cases(),
- finish_size_check_mse}}.
-
-mib_storage_size_check_dets(suite) ->
- {req, [], {conf,
- init_size_check_msd,
- msd_size_check_cases(),
- finish_size_check_msd}}.
-
-mib_storage_size_check_mnesia(suite) ->
- {req, [], {conf,
- init_size_check_msm,
- msm_size_check_cases(),
- finish_size_check_msm}}.
-
-mib_storage_varm_dets(suite) ->
- {req, [], {conf,
- init_varm_mib_storage_dets,
- varm_mib_storage_dets_cases(),
- finish_varm_mib_storage_dets}}.
-
-mib_storage_varm_mnesia(suite) ->
- {req, [], {conf,
- init_varm_mib_storage_mnesia,
- varm_mib_storage_mnesia_cases(),
- finish_varm_mib_storage_mnesia}}.
-
-mib_storage_ets_cases() ->
- [
- mse_simple,
- mse_v1_processing,
- mse_big,
- mse_big2,
- mse_loop_mib,
- mse_api,
- mse_sa_register,
- mse_v1_trap,
- mse_sa_error,
- mse_next_across_sa,
- mse_undo,
- mse_standard_mib,
- mse_community_mib,
- mse_framework_mib,
- mse_target_mib,
- mse_notification_mib,
- mse_view_based_acm_mib,
- mse_sparse_table,
- mse_me_of,
- mse_mib_of].
-
-mib_storage_dets_cases() ->
- [
- msd_simple,
- msd_v1_processing,
- msd_big,
- msd_big2,
- msd_loop_mib,
- msd_api,
- msd_sa_register,
- msd_v1_trap,
- msd_sa_error,
- msd_next_across_sa,
- msd_undo,
- msd_standard_mib,
- msd_community_mib,
- msd_framework_mib,
- msd_target_mib,
- msd_notification_mib,
- msd_view_based_acm_mib,
- msd_sparse_table,
- msd_me_of,
- msd_mib_of
- ].
-
-mib_storage_mnesia_cases() ->
- [
- msm_simple,
- msm_v1_processing,
- msm_big,
- msm_big2,
- msm_loop_mib,
- msm_api,
- msm_sa_register,
- msm_v1_trap,
- msm_sa_error,
- msm_next_across_sa,
- msm_undo,
- msm_standard_mib,
- msm_community_mib,
- msm_framework_mib,
- msm_target_mib,
- msm_notification_mib,
- msm_view_based_acm_mib,
- msm_sparse_table,
- msm_me_of,
- msm_mib_of
- ].
-
-mse_size_check_cases() ->
- [mse_size_check].
-
-msd_size_check_cases() ->
- [msd_size_check].
-
-msm_size_check_cases() ->
- [msm_size_check].
-
-varm_mib_storage_dets_cases() ->
- [msd_varm_mib_start].
-
-varm_mib_storage_mnesia_cases() ->
- [msm_varm_mib_start].
+
+
+
+
+
+
+
+
+
+mib_storage_ets_cases() ->
+[mse_simple, mse_v1_processing, mse_big, mse_big2,
+ mse_loop_mib, mse_api, mse_sa_register, mse_v1_trap,
+ mse_sa_error, mse_next_across_sa, mse_undo,
+ mse_standard_mib, mse_community_mib, mse_framework_mib,
+ mse_target_mib, mse_notification_mib,
+ mse_view_based_acm_mib, mse_sparse_table, mse_me_of,
+ mse_mib_of].
+
+mib_storage_dets_cases() ->
+[msd_simple, msd_v1_processing, msd_big, msd_big2,
+ msd_loop_mib, msd_api, msd_sa_register, msd_v1_trap,
+ msd_sa_error, msd_next_across_sa, msd_undo,
+ msd_standard_mib, msd_community_mib, msd_framework_mib,
+ msd_target_mib, msd_notification_mib,
+ msd_view_based_acm_mib, msd_sparse_table, msd_me_of,
+ msd_mib_of].
+
+mib_storage_mnesia_cases() ->
+[msm_simple, msm_v1_processing, msm_big, msm_big2,
+ msm_loop_mib, msm_api, msm_sa_register, msm_v1_trap,
+ msm_sa_error, msm_next_across_sa, msm_undo,
+ msm_standard_mib, msm_community_mib, msm_framework_mib,
+ msm_target_mib, msm_notification_mib,
+ msm_view_based_acm_mib, msm_sparse_table, msm_me_of,
+ msm_mib_of].
+
+mse_size_check_cases() ->
+[mse_size_check].
+
+msd_size_check_cases() ->
+[msd_size_check].
+
+msm_size_check_cases() ->
+[msm_size_check].
+
+varm_mib_storage_dets_cases() ->
+[msd_varm_mib_start].
+
+varm_mib_storage_mnesia_cases() ->
+[msm_varm_mib_start].
init_mib_storage_ets(Config) when list(Config) ->
?LOG("init_mib_storage_ets -> entry", []),
@@ -1099,20 +1137,14 @@ app_dir(App) ->
end.
-test_v1(suite) -> {req, [], {conf, init_v1, v1_cases(), finish_v1}}.
%v1_cases() -> [loop_mib];
-v1_cases() ->
- [simple,
- db_notify_client,
- v1_processing, big, big2, loop_mib,
- api, subagent, mnesia, multiple_reqs,
- sa_register, v1_trap, sa_error, next_across_sa, undo, reported_bugs,
- standard_mibs, sparse_table, cnt_64,
- opaque,
- % opaque].
-
- change_target_addr_config].
+v1_cases() ->
+[simple, db_notify_client, v1_processing, big, big2,
+ loop_mib, api, subagent, mnesia, {group, multiple_reqs},
+ sa_register, v1_trap, sa_error, next_across_sa, undo,
+ {group, reported_bugs}, {group, standard_mibs},
+ sparse_table, cnt_64, opaque, change_target_addr_config].
init_v1(Config) when list(Config) ->
?line SaNode = ?config(snmp_sa, Config),
@@ -1129,15 +1161,15 @@ finish_v1(Config) when list(Config) ->
delete_files(C1),
lists:keydelete(vsn, 1, C1).
-test_v2(suite) -> {req, [], {conf, init_v2, v2_cases(), finish_v2}}.
%v2_cases() -> [loop_mib_2];
-v2_cases() ->
- [simple_2, v2_processing, big_2, big2_2, loop_mib_2,
- api_2, subagent_2, mnesia_2,
- multiple_reqs_2, sa_register_2, v2_trap, v2_inform, sa_error_2,
- next_across_sa_2, undo_2, reported_bugs_2, standard_mibs_2,
- v2_types, implied, sparse_table_2, cnt_64_2, opaque_2, v2_caps].
+v2_cases() ->
+[simple_2, v2_processing, big_2, big2_2, loop_mib_2,
+ api_2, subagent_2, mnesia_2, {group, multiple_reqs_2},
+ sa_register_2, v2_trap, {group, v2_inform}, sa_error_2,
+ next_across_sa_2, undo_2, {group, reported_bugs_2},
+ {group, standard_mibs_2}, v2_types, implied,
+ sparse_table_2, cnt_64_2, opaque_2, v2_caps].
init_v2(Config) when list(Config) ->
SaNode = ?config(snmp_sa, Config),
@@ -1154,10 +1186,9 @@ finish_v2(Config) when list(Config) ->
delete_files(C1),
lists:keydelete(vsn, 1, C1).
-test_v1_v2(suite) -> {req, [], {conf, init_v1_v2, v1_v2_cases(), finish_v1_v2}}.
-v1_v2_cases() ->
- [simple_bi].
+v1_v2_cases() ->
+[simple_bi].
init_v1_v2(Config) when list(Config) ->
SaNode = ?config(snmp_sa, Config),
@@ -1174,16 +1205,16 @@ finish_v1_v2(Config) when list(Config) ->
delete_files(C1),
lists:keydelete(vsn, 1, C1).
-test_v3(suite) -> {req, [], {conf, init_v3, v3_cases(), finish_v3}}.
%v3_cases() -> [loop_mib_3];
-v3_cases() ->
- [simple_3, v3_processing,
- big_3, big2_3, api_3, subagent_3, mnesia_3, loop_mib_3,
- multiple_reqs_3, sa_register_3, v3_trap, v3_inform, sa_error_3,
- next_across_sa_3, undo_3, reported_bugs_3, standard_mibs_3,
- v3_security,
- v2_types_3, implied_3, sparse_table_3, cnt_64_3, opaque_3, v2_caps_3].
+v3_cases() ->
+[simple_3, v3_processing, big_3, big2_3, api_3,
+ subagent_3, mnesia_3, loop_mib_3, multiple_reqs_3,
+ sa_register_3, v3_trap, v3_inform, sa_error_3,
+ next_across_sa_3, undo_3, {group, reported_bugs_3},
+ {group, standard_mibs_3}, {group, v3_security},
+ v2_types_3, implied_3, sparse_table_3, cnt_64_3,
+ opaque_3, v2_caps_3].
init_v3(Config) when list(Config) ->
%% Make sure crypto works, otherwise start_agent will fail
@@ -1221,10 +1252,9 @@ finish_v3(Config) when list(Config) ->
delete_files(C1),
lists:keydelete(vsn, 1, C1).
-test_multi_threaded(suite) -> {req, [], {conf, init_mt, mt_cases(), finish_mt}}.
-mt_cases() ->
- [multi_threaded, mt_trap].
+mt_cases() ->
+[multi_threaded, mt_trap].
init_mt(Config) when list(Config) ->
SaNode = ?config(snmp_sa, Config),
@@ -1739,21 +1769,19 @@ mnesia_2(X) -> mnesia(X).
mnesia_3(X) -> mnesia(X).
-multiple_reqs(suite) ->
- {req, [], {conf, init_mul, mul_cases(), finish_mul}}.
-mul_cases() ->
- [mul_get, mul_get_err, mul_next, mul_next_err, mul_set_err].
+mul_cases() ->
+[mul_get, mul_get_err, mul_next, mul_next_err,
+ mul_set_err].
-multiple_reqs_2(suite) ->
- {req, [], {conf, init_mul, mul_cases_2(), finish_mul}}.
multiple_reqs_3(_X) ->
{req, [], {conf, init_mul, mul_cases_3(), finish_mul}}.
-mul_cases_2() ->
- [mul_get_2, mul_get_err_2, mul_next_2, mul_next_err_2, mul_set_err_2].
+mul_cases_2() ->
+[mul_get_2, mul_get_err_2, mul_next_2, mul_next_err_2,
+ mul_set_err_2].
mul_cases_3() ->
@@ -1939,8 +1967,6 @@ v2_trap(Config) when list(Config) ->
v3_trap(X) ->
v2_trap(X).
-v2_inform(suite) ->
- {req, [], {conf, init_v2_inform, [v2_inform_i], finish_v2_inform}}.
v3_inform(_X) ->
%% v2_inform(X).
@@ -2112,7 +2138,6 @@ v3_processing(Config) when list(Config) ->
%% accomplished by the first inform sent. That one will generate a
%% report, which makes it in sync. The notification-generating
%% application times out, and send again. This time it'll work.
-v3_security(suite) -> [v3_crypto_basic, v3_md5_auth, v3_sha_auth, v3_des_priv].
v3_crypto_basic(suite) -> [];
v3_crypto_basic(_Config) ->
@@ -3591,22 +3616,8 @@ bad_return() ->
%%% Note that many of the functions in the standard mib is
%%% already tested by the normal tests.
%%%-----------------------------------------------------------------
-standard_mibs(suite) ->
- [snmp_standard_mib, snmp_community_mib,
- snmp_framework_mib,
- snmp_target_mib, snmp_notification_mib,
- snmp_view_based_acm_mib].
-
-standard_mibs_2(suite) ->
- [snmpv2_mib_2, snmp_community_mib_2,
- snmp_framework_mib_2,
- snmp_target_mib_2, snmp_notification_mib_2,
- snmp_view_based_acm_mib_2].
-
-standard_mibs_3(suite) ->
- [snmpv2_mib_3,snmp_framework_mib_3, snmp_mpd_mib_3,
- snmp_target_mib_3, snmp_notification_mib_3,
- snmp_view_based_acm_mib_3, snmp_user_based_sm_mib_3].
+
+
%%-----------------------------------------------------------------
%% For this test, the agent is configured for v1.
@@ -4527,27 +4538,12 @@ loop_it_2(Oid, N) ->
%%% Testing of reported bugs and other tickets.
%%%-----------------------------------------------------------------
-reported_bugs(suite) ->
- [otp_1128, otp_1129, otp_1131, otp_1162,
- otp_1222, otp_1298, otp_1331, otp_1338,
- otp_1342, otp_2776, otp_2979, otp_3187, otp_3725].
-reported_bugs_2(suite) ->
- [otp_1128_2, otp_1129_2, otp_1131_2, otp_1162_2,
- otp_1222_2, otp_1298_2, otp_1331_2, otp_1338_2,
- otp_1342_2, otp_2776_2, otp_2979_2, otp_3187_2].
-reported_bugs_3(suite) ->
- [otp_1128_3, otp_1129_3, otp_1131_3, otp_1162_3,
- otp_1222_3, otp_1298_3, otp_1331_3, otp_1338_3,
- otp_1342_3, otp_2776_3, otp_2979_3, otp_3187_3,
- otp_3542].
%% These are (ticket) test cases where the initiation has to be done
%% individually.
-tickets(suite) ->
- [otp_4394].
%%-----------------------------------------------------------------
%% Ticket: OTP-1128
@@ -4971,10 +4967,6 @@ otp_3725_test(MaNode) ->
%%-----------------------------------------------------------------
-otp_4394(suite) -> {req, [], {conf,
- init_otp_4394,
- [otp_4394_test],
- finish_otp_4394}}.
init_otp_4394(Config) when list(Config) ->
?DBG("init_otp_4394 -> entry with"
diff --git a/lib/snmp/test/snmp_app_test.erl b/lib/snmp/test/snmp_app_test.erl
index 5c5a5285a0..bc62c8d530 100644
--- a/lib/snmp/test/snmp_app_test.erl
+++ b/lib/snmp/test/snmp_app_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -23,8 +23,9 @@
-module(snmp_app_test).
-export([
- all/1, init_suite/1, fin_suite/1,
- init_per_testcase/2, fin_per_testcase/2,
+ all/0,groups/0,init_per_group/2,end_per_group/2, init_per_suite/1,
+ end_per_suite/1,
+ init_per_testcase/2, end_per_testcase/2,
fields/1,
modules/1,
@@ -32,7 +33,7 @@
app_depend/1,
undef_funcs/1,
- start_and_stop/1,
+
start_and_stop_empty/1,
start_and_stop_with_agent/1,
start_and_stop_with_manager/1,
@@ -44,25 +45,34 @@
-include_lib("kernel/include/file.hrl").
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("snmp_test_lib.hrl").
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) ->
- Cases =
- [
- fields,
- modules,
- exportall,
- app_depend,
- undef_funcs,
- start_and_stop
- ],
- {conf, init_suite, Cases, fin_suite}.
-
-init_suite(Config) when is_list(Config) ->
+all() ->
+Cases = [fields, modules, exportall, app_depend,
+ undef_funcs, {group, start_and_stop}],
+ Cases.
+
+groups() ->
+ [{start_and_stop, [],
+ [start_and_stop_empty, start_and_stop_with_agent,
+ start_and_stop_with_manager,
+ start_and_stop_with_agent_and_manager,
+ start_epmty_and_then_agent_and_manager_and_stop,
+ start_with_agent_and_then_manager_and_stop,
+ start_with_manager_and_then_agent_and_stop]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+init_per_suite(Config) when is_list(Config) ->
?DISPLAY_SUITE_INFO(),
PrivDir = ?config(priv_dir, Config),
TopDir = filename:join(PrivDir, app),
@@ -97,9 +107,9 @@ is_app(App) ->
{error, {invalid_format, Error}}
end.
-fin_suite(suite) -> [];
-fin_suite(doc) -> [];
-fin_suite(Config) when is_list(Config) ->
+end_per_suite(suite) -> [];
+end_per_suite(doc) -> [];
+end_per_suite(Config) when is_list(Config) ->
Config.
@@ -112,7 +122,7 @@ init_per_testcase(undef_funcs, Config) ->
init_per_testcase(_Case, Config) ->
Config.
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Config.
@@ -290,6 +300,25 @@ undef_funcs(Config) when is_list(Config) ->
xref:stop(XRef),
analyze_undefined_function_calls(Undefs, Mods, []).
+valid_undef(crypto = CalledMod) ->
+ case (catch CalledMod:version()) of
+ Version when is_list(Version) ->
+ %% The called module was crypto and the version
+ %% function returns a valid value.
+ %% This means that the function is
+ %% actually undefined...
+ true;
+ _ ->
+ %% The called module was crypto but the version
+ %% function does *not* return a valid value.
+ %% This means the crypto was not actually not
+ %% build, which is an case snmp handles.
+ false
+ end;
+valid_undef(_) ->
+ true.
+
+
analyze_undefined_function_calls([], _, []) ->
ok;
analyze_undefined_function_calls([], _, AppUndefs) ->
@@ -302,14 +331,25 @@ analyze_undefined_function_calls([{{Mod, _F, _A}, _C} = AppUndef|Undefs],
{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]);
+ %% If the called module is crypto, then we will *not*
+ %% fail if crypto is not built (since crypto is actually
+ %% not built for all platforms)
+ case valid_undef(Mod2) of
+ true ->
+ 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("skipping ~p (calling ~w:~w/~w)~n",
+ [Mod, Mod2, Func2, Ar2]),
+ analyze_undefined_function_calls(Undefs,
+ AppModules, AppUndefs)
+ end;
false ->
- io:format("dropping ~p~n", [Mod]),
- analyze_undefined_function_calls(Undefs, AppModules, AppUndefs)
+ 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...
@@ -319,16 +359,6 @@ undef_funcs_make_name(App, PostFix) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-start_and_stop(suite) ->
- [
- start_and_stop_empty,
- start_and_stop_with_agent,
- start_and_stop_with_manager,
- start_and_stop_with_agent_and_manager,
- start_epmty_and_then_agent_and_manager_and_stop,
- start_with_agent_and_then_manager_and_stop,
- start_with_manager_and_then_agent_and_stop
- ].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/snmp/test/snmp_appup_mgr.erl b/lib/snmp/test/snmp_appup_mgr.erl
index 271d6a2847..6648ce9dbe 100644
--- a/lib/snmp/test/snmp_appup_mgr.erl
+++ b/lib/snmp/test/snmp_appup_mgr.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2010. 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
diff --git a/lib/snmp/test/snmp_appup_test.erl b/lib/snmp/test/snmp_appup_test.erl
index 18509526cf..99994a2410 100644
--- a/lib/snmp/test/snmp_appup_test.erl
+++ b/lib/snmp/test/snmp_appup_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -23,32 +23,46 @@
-module(snmp_appup_test).
-export([
- all/1, init_suite/1, fin_suite/1,
- init_per_testcase/2, fin_per_testcase/2,
+ all/0,
+ groups/0, init_per_group/2, end_per_group/2,
+ init_per_suite/1, end_per_suite/1,
+ init_per_testcase/2, end_per_testcase/2,
appup_file/1
]).
--include("test_server.hrl").
+-compile({no_auto_import, [error/1]}).
+
+-include_lib("common_test/include/ct.hrl").
-include("snmp_test_lib.hrl").
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) ->
+all() ->
Cases =
[
appup_file
],
- {conf, init_suite, Cases, fin_suite}.
+ Cases.
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-init_suite(suite) -> [];
-init_suite(doc) -> [];
-init_suite(Config) when is_list(Config) ->
+init_per_suite(suite) -> [];
+init_per_suite(doc) -> [];
+init_per_suite(Config) when is_list(Config) ->
PrivDir = ?config(priv_dir, Config),
TopDir = filename:join(PrivDir, appup),
case file:make_dir(TopDir) of
@@ -76,9 +90,9 @@ file_name(App, Ext) ->
filename:join([LibDir, "ebin", atom_to_list(App) ++ Ext]).
-fin_suite(suite) -> [];
-fin_suite(doc) -> [];
-fin_suite(Config) when is_list(Config) ->
+end_per_suite(suite) -> [];
+end_per_suite(doc) -> [];
+end_per_suite(Config) when is_list(Config) ->
Config.
@@ -88,7 +102,7 @@ fin_suite(Config) when is_list(Config) ->
init_per_testcase(_Case, Config) when is_list(Config) ->
Config.
-fin_per_testcase(_Case, Config) when is_list(Config) ->
+end_per_testcase(_Case, Config) when is_list(Config) ->
Config.
diff --git a/lib/snmp/test/snmp_compiler_test.erl b/lib/snmp/test/snmp_compiler_test.erl
index ad77b01362..2e6020ae7a 100644
--- a/lib/snmp/test/snmp_compiler_test.erl
+++ b/lib/snmp/test/snmp_compiler_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -28,7 +28,7 @@
%%----------------------------------------------------------------------
%% Include files
%%----------------------------------------------------------------------
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("snmp_test_lib.hrl").
-include_lib("snmp/include/snmp_types.hrl").
@@ -37,15 +37,17 @@
%% External exports
%%----------------------------------------------------------------------
-export([
- all/1,
- init_per_testcase/2, fin_per_testcase/2,
+ all/0,
+ groups/0, init_per_group/2, end_per_group/2,
+ init_per_testcase/2, end_per_testcase/2,
description/1,
oid_conflicts/1,
imports/1,
module_identity/1,
+ agent_capabilities/1,
+ module_compliance/1,
- tickets/1,
otp_6150/1,
otp_8574/1,
otp_8595/1
@@ -78,9 +80,9 @@ init_per_testcase(_Case, Config) when is_list(Config) ->
MibDir = join(lists:reverse(["snmp_test_data"|RL])),
CompDir = join(Dir, "comp_dir/"),
?line ok = file:make_dir(CompDir),
- [{comp_dir, CompDir},{mib_dir, MibDir}|Config].
+ [{comp_dir, CompDir}, {mib_dir, MibDir} | Config].
-fin_per_testcase(_Case, Config) when is_list(Config) ->
+end_per_testcase(_Case, Config) when is_list(Config) ->
CompDir = ?config(comp_dir, Config),
?line ok = ?DEL_DIR(CompDir),
lists:keydelete(comp_dir, 1, Config).
@@ -90,21 +92,27 @@ fin_per_testcase(_Case, Config) when is_list(Config) ->
%% Test case definitions
%%======================================================================
-all(suite) ->
+all() ->
[
- description,
- oid_conflicts,
- imports,
+ description,
+ oid_conflicts,
+ imports,
module_identity,
- tickets
+ agent_capabilities,
+ module_compliance,
+ {group, tickets}
].
-tickets(suite) ->
- [
- otp_6150,
- otp_8574,
- otp_8595
- ].
+groups() ->
+ [{tickets, [], [otp_6150, otp_8574, otp_8595]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%======================================================================
@@ -169,6 +177,88 @@ module_identity(Config) when is_list(Config) ->
?SKIP(not_yet_implemented).
+agent_capabilities(suite) ->
+ [];
+agent_capabilities(Config) when is_list(Config) ->
+ put(tname,agent_capabilities),
+ p("starting with Config: ~p~n", [Config]),
+
+ SnmpPrivDir = code:priv_dir(snmp),
+ SnmpMibsDir = join(SnmpPrivDir, "mibs"),
+ OtpMibsPrivDir = code:priv_dir(otp_mibs),
+ OtpMibsMibsDir = join(OtpMibsPrivDir, "mibs"),
+ Dir = ?config(mib_dir, Config),
+ AcMib = join(Dir,"AC-TEST-MIB.mib"),
+ ?line {ok, MibFile1} = snmpc:compile(AcMib, [options,
+ version,
+ {i, [SnmpMibsDir, OtpMibsMibsDir]},
+ {outdir, Dir},
+ {verbosity, trace}]),
+ ?line {ok, Mib1} = snmp_misc:read_mib(MibFile1),
+ ?line {ok, MibFile2} = snmpc:compile(AcMib, [options,
+ version,
+ agent_capabilities,
+ {i, [SnmpMibsDir, OtpMibsMibsDir]},
+ {outdir, Dir},
+ {verbosity, trace}]),
+ ?line {ok, Mib2} = snmp_misc:read_mib(MibFile2),
+ MEDiff = Mib2#mib.mes -- Mib1#mib.mes,
+ %% This is a rather pathetic test, but it is somthing...
+ io:format("agent_capabilities -> "
+ "~n MEDiff: ~p"
+ "~n Mib1: ~p"
+ "~n Mib2: ~p"
+ "~n", [MEDiff, Mib1, Mib2]),
+ case length(MEDiff) of
+ 2 ->
+ ok;
+ _BadLen ->
+ exit({unexpected_mes, MEDiff})
+ end,
+ ok.
+
+
+module_compliance(suite) ->
+ [];
+module_compliance(Config) when is_list(Config) ->
+ put(tname,module_compliance),
+ p("starting with Config: ~p~n", [Config]),
+
+ SnmpPrivDir = code:priv_dir(snmp),
+ SnmpMibsDir = join(SnmpPrivDir, "mibs"),
+ OtpMibsPrivDir = code:priv_dir(otp_mibs),
+ OtpMibsMibsDir = join(OtpMibsPrivDir, "mibs"),
+ Dir = ?config(mib_dir, Config),
+ AcMib = join(Dir,"MC-TEST-MIB.mib"),
+ ?line {ok, MibFile1} = snmpc:compile(AcMib, [options,
+ version,
+ {i, [SnmpMibsDir, OtpMibsMibsDir]},
+ {outdir, Dir},
+ {verbosity, trace}]),
+ ?line {ok, Mib1} = snmp_misc:read_mib(MibFile1),
+ ?line {ok, MibFile2} = snmpc:compile(AcMib, [options,
+ version,
+ module_compliance,
+ {i, [SnmpMibsDir, OtpMibsMibsDir]},
+ {outdir, Dir},
+ {verbosity, trace}]),
+ ?line {ok, Mib2} = snmp_misc:read_mib(MibFile2),
+ MEDiff = Mib2#mib.mes -- Mib1#mib.mes,
+ %% This is a rather pathetic test, but it is somthing...
+ io:format("agent_capabilities -> "
+ "~n MEDiff: ~p"
+ "~n Mib1: ~p"
+ "~n Mib2: ~p"
+ "~n", [MEDiff, Mib1, Mib2]),
+ case length(MEDiff) of
+ 1 ->
+ ok;
+ _BadLen ->
+ exit({unexpected_mes, MEDiff})
+ end,
+ ok.
+
+
otp_6150(suite) ->
[];
otp_6150(Config) when is_list(Config) ->
@@ -257,7 +347,7 @@ LAST-UPDATED \"0005290000Z\"
Ericsson Utvecklings AB
Open System
Box 1505
-SE-125 25 �LVSJ�\"
+SE-125 25 ÄLVSJÖ\"
DESCRIPTION
\" Objects for management \"
diff --git a/lib/snmp/test/snmp_conf_test.erl b/lib/snmp/test/snmp_conf_test.erl
index d2f9631947..c4341d8d7e 100644
--- a/lib/snmp/test/snmp_conf_test.erl
+++ b/lib/snmp/test/snmp_conf_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2010. 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
@@ -26,7 +26,7 @@
%%----------------------------------------------------------------------
%% Include files
%%----------------------------------------------------------------------
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("snmp_test_lib.hrl").
-include_lib("snmp/include/STANDARD-MIB.hrl").
@@ -37,8 +37,8 @@
%% External exports
%%----------------------------------------------------------------------
-export([
- all/1,
- init_per_testcase/2, fin_per_testcase/2,
+ all/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_testcase/2, end_per_testcase/2,
check_mandatory/1,
check_integer1/1,
@@ -80,32 +80,28 @@
init_per_testcase(_Case, Config) when is_list(Config) ->
Config.
-fin_per_testcase(_Case, Config) when is_list(Config) ->
+end_per_testcase(_Case, Config) when is_list(Config) ->
Config.
%%======================================================================
%% Test case definitions
%%======================================================================
-all(suite) ->
- [
- check_mandatory,
- check_integer1,
- check_integer2,
- check_string1,
- check_string2,
- check_atom,
- check_ip,
- check_taddress,
- check_packet_size,
- check_oid,
- check_sec_model1,
- check_sec_model2,
- check_sec_level,
- check_timer,
-
- read,
- read_files
- ].
+all() ->
+[check_mandatory, check_integer1, check_integer2,
+ check_string1, check_string2, check_atom, check_ip,
+ check_taddress, check_packet_size, check_oid,
+ check_sec_model1, check_sec_model2, check_sec_level,
+ check_timer, read, read_files].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%======================================================================
diff --git a/lib/snmp/test/snmp_log_test.erl b/lib/snmp/test/snmp_log_test.erl
index 91bdc3e849..b692017407 100644
--- a/lib/snmp/test/snmp_log_test.erl
+++ b/lib/snmp/test/snmp_log_test.erl
@@ -29,7 +29,7 @@
%%----------------------------------------------------------------------
%% Include files
%%----------------------------------------------------------------------
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("snmp_test_lib.hrl").
-define(SNMP_USE_V3, true).
-include_lib("snmp/include/snmp_types.hrl").
@@ -40,19 +40,19 @@
%% External exports
%%----------------------------------------------------------------------
-export([
- init_per_testcase/2, fin_per_testcase/2,
+ init_per_testcase/2, end_per_testcase/2,
- all/1,
+ all/0,groups/0,init_per_group/2,end_per_group/2,
open_and_close/1,
- open_write_and_close/1,
+
open_write_and_close1/1,
open_write_and_close2/1,
open_write_and_close3/1,
open_write_and_close4/1,
- log_to_io/1,
+
log_to_io1/1,
log_to_io2/1,
- log_to_txt/1,
+
log_to_txt1/1,
log_to_txt2/1,
log_to_txt3/1
@@ -97,7 +97,7 @@ init_per_testcase(Case, Config) when is_list(Config) ->
Dog = ?WD_START(?MINS(5)),
[{log_dir, CaseDir}, {watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) when is_list(Config) ->
+end_per_testcase(_Case, Config) when is_list(Config) ->
%% Leave the dirs created above (enable debugging of the test case(s))
Dog = ?config(watchdog, Config),
?WD_STOP(Dog),
@@ -108,37 +108,30 @@ fin_per_testcase(_Case, Config) when is_list(Config) ->
%% Test case definitions
%%======================================================================
%% ?SKIP(not_yet_implemented).
-all(suite) ->
- [
- open_and_close,
- open_write_and_close,
- log_to_io,
- log_to_txt
- ].
-
-
-open_write_and_close(suite) ->
- [
- open_write_and_close1,
- open_write_and_close2,
- open_write_and_close3,
- open_write_and_close4
- ].
-
-
-log_to_io(suite) ->
- [
- log_to_io1,
- log_to_io2
- ].
-
-
-log_to_txt(suite) ->
- [
- log_to_txt1,
- log_to_txt2,
- log_to_txt3
- ].
+all() ->
+[open_and_close, {group, open_write_and_close},
+ {group, log_to_io}, {group, log_to_txt}].
+
+groups() ->
+ [{open_write_and_close, [],
+ [open_write_and_close1, open_write_and_close2,
+ open_write_and_close3, open_write_and_close4]},
+ {log_to_io, [], [log_to_io1, log_to_io2]},
+ {log_to_txt, [],
+ [log_to_txt1, log_to_txt2, log_to_txt3]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+
+
+
+
+
%%======================================================================
diff --git a/lib/snmp/test/snmp_manager_config_test.erl b/lib/snmp/test/snmp_manager_config_test.erl
index d5dc1387f7..4498d506f3 100644
--- a/lib/snmp/test/snmp_manager_config_test.erl
+++ b/lib/snmp/test/snmp_manager_config_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -31,7 +31,7 @@
%%----------------------------------------------------------------------
%% Include files
%%----------------------------------------------------------------------
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("snmp_test_lib.hrl").
-include_lib("snmp/src/manager/snmpm_usm.hrl").
@@ -42,10 +42,10 @@
%% -compile(export_all).
-export([
- all/1,
- init_per_testcase/2, fin_per_testcase/2,
+ all/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_testcase/2, end_per_testcase/2,
- start_and_stop/1,
+
simple_start_and_stop/1,
start_without_mandatory_opts1/1,
@@ -58,36 +58,36 @@
start_with_invalid_agents_conf_file1/1,
start_with_invalid_usm_conf_file1/1,
- normal_op/1,
+
- system/1,
+
simple_system_op/1,
- users/1,
+
register_user_using_file/1,
register_user_using_function/1,
register_user_failed_using_function1/1,
- agents/1,
+
register_agent_using_file/1,
register_agent_using_function/1,
register_agent_failed_using_function1/1,
- usm_users/1,
+
register_usm_user_using_file/1,
register_usm_user_using_function/1,
register_usm_user_failed_using_function1/1,
update_usm_user_info/1,
- counter/1,
+
create_and_increment/1,
- stats_counter/1,
+
stats_create_and_increment/1,
- tickets/1,
+
otp_7219/1,
- otp_8395/1,
+
otp_8395_1/1,
otp_8395_2/1,
otp_8395_3/1,
@@ -150,8 +150,8 @@ init_per_testcase(Case, Config) when is_list(Config) ->
{manager_log_dir, MgrLogDir} | Config].
-fin_per_testcase(Case, Config) when is_list(Config) ->
- p("fin_per_testcase -> Case: ~p", [Case]),
+end_per_testcase(Case, Config) when is_list(Config) ->
+ p("end_per_testcase -> Case: ~p", [Case]),
%% The cleanup is removed due to some really discusting NFS behaviour...
%% CaseTopDir = ?config(manager_dir, Config),
%% ?line ok = ?DEL_DIR(CaseTopDir),
@@ -163,33 +163,60 @@ fin_per_testcase(Case, Config) when is_list(Config) ->
%%======================================================================
% all(doc) ->
% "The top snmp manager config test case";
-all(suite) ->
- [
- start_and_stop,
- normal_op,
- tickets
- ].
+all() ->
+[{group, start_and_stop}, {group, normal_op},
+ {group, tickets}].
+
+groups() ->
+ [{start_and_stop, [],
+ [simple_start_and_stop,
+ start_without_mandatory_opts1,
+ start_without_mandatory_opts2,
+ start_with_all_valid_opts, start_with_unknown_opts,
+ start_with_incorrect_opts,
+ start_with_invalid_manager_conf_file1,
+ start_with_invalid_users_conf_file1,
+ start_with_invalid_agents_conf_file1,
+ start_with_invalid_usm_conf_file1]},
+ {normal_op, [],
+ [{group, system},
+ {group, agents},
+ {group, users},
+ {group, usm_users},
+ {group, counter},
+ {group, stats_counter}]},
+ {system, [], [simple_system_op]},
+ {users, [],
+ [register_user_using_file,
+ register_user_using_function,
+ register_user_failed_using_function1]},
+ {agents, [],
+ [register_agent_using_file,
+ register_agent_using_function,
+ register_agent_failed_using_function1]},
+ {usm_users, [],
+ [register_usm_user_using_file,
+ register_usm_user_using_function,
+ register_usm_user_failed_using_function1,
+ update_usm_user_info]},
+ {counter, [], [create_and_increment]},
+ {stats_counter, [], [stats_create_and_increment]},
+ {tickets, [], [otp_7219, {group, otp_8395}]},
+ {otp_8395, [],
+ [otp_8395_1, otp_8395_2, otp_8395_3, otp_8395_4]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%======================================================================
%% Test functions
%%======================================================================
-start_and_stop(doc) ->
- "A collection of start and stop tests";
-start_and_stop(suite) ->
- [
- simple_start_and_stop,
- start_without_mandatory_opts1,
- start_without_mandatory_opts2,
- start_with_all_valid_opts,
- start_with_unknown_opts,
- start_with_incorrect_opts,
- start_with_invalid_manager_conf_file1,
- start_with_invalid_users_conf_file1,
- start_with_invalid_agents_conf_file1,
- start_with_invalid_usm_conf_file1
- ].
%%
@@ -794,7 +821,10 @@ start_with_invalid_users_conf_file1(Conf) when is_list(Conf) ->
p("start"),
process_flag(trap_exit, true),
ConfDir = ?config(manager_conf_dir, Conf),
- DbDir = ?config(manager_db_dir, Conf),
+ DbDir = ?config(manager_db_dir, Conf),
+
+ verify_dir_existing(conf, ConfDir),
+ verify_dir_existing(db, DbDir),
Opts = [{versions, [v1]},
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
@@ -895,7 +925,10 @@ start_with_invalid_agents_conf_file1(Conf) when is_list(Conf) ->
p("start"),
process_flag(trap_exit, true),
ConfDir = ?config(manager_conf_dir, Conf),
- DbDir = ?config(manager_db_dir, Conf),
+ DbDir = ?config(manager_db_dir, Conf),
+
+ verify_dir_existing(conf, ConfDir),
+ verify_dir_existing(db, DbDir),
Opts = [{versions, [v1]},
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
@@ -1641,29 +1674,12 @@ start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) ->
%% ---
%%
-normal_op(doc) ->
- "A collection of tests for normal operation";
-normal_op(suite) ->
- [
- system,
- agents,
- users,
- usm_users,
- counter,
- stats_counter
- ].
%%
%% ---
%%
-system(doc) ->
- "Various system related operations with the snmp manager config";
-system(suite) ->
- [
- simple_system_op
- ].
simple_system_op(suite) -> [];
simple_system_op(doc) ->
@@ -1702,14 +1718,6 @@ simple_system_op(Conf) when is_list(Conf) ->
%% ---
%%
-users(doc) ->
- "Various users related operations with the snmp manager config";
-users(suite) ->
- [
- register_user_using_file,
- register_user_using_function,
- register_user_failed_using_function1
- ].
%%
@@ -1764,14 +1772,6 @@ register_user_failed_using_function1(Conf) when is_list(Conf) ->
%% ---
%%
-agents(doc) ->
- "Various agents related operations with the snmp manager config";
-agents(suite) ->
- [
- register_agent_using_file,
- register_agent_using_function,
- register_agent_failed_using_function1
- ].
%%
@@ -1950,15 +1950,6 @@ register_agent_failed_using_function1(Conf) when is_list(Conf) ->
%% ---
%%
-usm_users(doc) ->
- "Various USM users related operations with the snmp manager config";
-usm_users(suite) ->
- [
- register_usm_user_using_file,
- register_usm_user_using_function,
- register_usm_user_failed_using_function1,
- update_usm_user_info
- ].
%%
@@ -2042,7 +2033,6 @@ register_usm_user_using_file(Conf) when is_list(Conf) ->
%% --
p("done"),
ok.
-%% ?SKIP(not_yet_implemented).
%%
@@ -2208,12 +2198,6 @@ update_usm_user_info(Conf) when is_list(Conf) ->
%% ---
%%
-counter(doc) ->
- "Various counter related operations with the snmp manager config";
-counter(suite) ->
- [
- create_and_increment
- ].
%%
@@ -2258,13 +2242,6 @@ create_and_increment(Conf) when is_list(Conf) ->
%% ---
%%
-stats_counter(doc) ->
- "Various statistic counter related operations with the "
- "snmp manager config";
-stats_counter(suite) ->
- [
- stats_create_and_increment
- ].
%%
@@ -2323,11 +2300,6 @@ loop(N, _, F) when (N > 0) andalso is_function(F) ->
%% Ticket test-cases
%%======================================================================
-tickets(suite) ->
- [
- otp_7219,
- otp_8395
- ].
otp_7219(suite) ->
@@ -2379,13 +2351,6 @@ otp_7219(Config) when is_list(Config) ->
-otp_8395(suite) ->
- [
- otp_8395_1,
- otp_8395_2,
- otp_8395_3,
- otp_8395_4
- ].
otp_8395_1(suite) -> [];
otp_8395_1(doc) ->
@@ -2696,9 +2661,21 @@ write_usm_conf2(Dir, Str) ->
write_conf_file(Dir, File, Str) ->
- ?line {ok, Fd} = file:open(filename:join(Dir, File), write),
- ?line ok = io:format(Fd, "~s", [Str]),
- file:close(Fd).
+ case file:open(filename:join(Dir, File), write) of
+ {ok, Fd} ->
+ ?line ok = io:format(Fd, "~s", [Str]),
+ file:close(Fd);
+ {error, Reason} ->
+ Info =
+ [{dir, Dir, case (catch file:read_file_info(Dir)) of
+ {ok, FI} ->
+ FI;
+ _ ->
+ undefined
+ end},
+ {file, File}],
+ exit({failed_writing_conf_file, Info, Reason})
+ end.
maybe_start_crypto() ->
@@ -2724,6 +2701,17 @@ maybe_stop_crypto() ->
%% ------
+verify_dir_existing(DirName, Dir) ->
+ case file:read_file_info(Dir) of
+ {ok, _} ->
+ ok;
+ {error, Reason} ->
+ exit({non_existing_dir, DirName, Dir, Reason})
+ end.
+
+
+%% ------
+
str(X) ->
lists:flatten(io_lib:format("~w", [X])).
diff --git a/lib/snmp/test/snmp_manager_test.erl b/lib/snmp/test/snmp_manager_test.erl
index cef96417dc..50836db731 100644
--- a/lib/snmp/test/snmp_manager_test.erl
+++ b/lib/snmp/test/snmp_manager_test.erl
@@ -31,7 +31,7 @@
%% Include files
%%----------------------------------------------------------------------
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("snmp_test_lib.hrl").
-include("snmp_test_data/Test2.hrl").
@@ -43,10 +43,10 @@
%% External exports
%%----------------------------------------------------------------------
-export([
- all/1,
- init_per_testcase/2, fin_per_testcase/2,
+ all/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_testcase/2, end_per_testcase/2,
- start_and_stop_tests/1,
+
simple_start_and_stop1/1,
simple_start_and_stop2/1,
simple_start_and_monitor_crash1/1,
@@ -54,49 +54,49 @@
notify_started01/1,
notify_started02/1,
- user_tests/1,
+
register_user1/1,
- agent_tests/1,
+
register_agent1/1,
register_agent2/1,
- misc_tests/1,
+
info/1,
- request_tests/1,
+
- get_tests/1,
+
simple_sync_get1/1,
simple_sync_get2/1,
simple_async_get1/1,
simple_async_get2/1,
- get_next_tests/1,
+
simple_sync_get_next1/1,
simple_sync_get_next2/1,
simple_async_get_next1/1,
simple_async_get_next2/1,
- set_tests/1,
+
simple_sync_set1/1,
simple_sync_set2/1,
simple_async_set1/1,
simple_async_set2/1,
- bulk_tests/1,
+
simple_sync_get_bulk1/1,
simple_sync_get_bulk2/1,
simple_async_get_bulk1/1,
simple_async_get_bulk2/1,
- misc_request_tests/1,
+
misc_async1/1,
misc_async2/1,
discovery/1,
- event_tests/1,
+
trap1/1,
trap2/1,
@@ -109,10 +109,10 @@
report/1,
- tickets/1,
- otp8015/1,
+
+
otp8015_1/1,
- otp8395/1,
+
otp8395_1/1
]).
@@ -289,18 +289,18 @@ init_per_testcase3(Case, Config) ->
Config
end.
-fin_per_testcase(Case, Config) when is_list(Config) ->
+end_per_testcase(Case, Config) when is_list(Config) ->
?DBG("fin [~w] Nodes [1]: ~p", [Case, erlang:nodes()]),
Dog = ?config(watchdog, Config),
?WD_STOP(Dog),
Conf1 = lists:keydelete(watchdog, 1, Config),
- Conf2 = fin_per_testcase2(Case, Conf1),
+ Conf2 = end_per_testcase2(Case, Conf1),
?DBG("fin [~w] Nodes [2]: ~p", [Case, erlang:nodes()]),
%% TopDir = ?config(top_dir, Conf2),
%% ?DEL_DIR(TopDir),
Conf2.
-fin_per_testcase2(Case, Config) ->
+end_per_testcase2(Case, Config) ->
OldApiCases =
[
simple_sync_get1,
@@ -359,118 +359,64 @@ fin_per_testcase2(Case, Config) ->
%% Test case definitions
%%======================================================================
-all(suite) ->
- [
- start_and_stop_tests,
- misc_tests,
- user_tests,
- agent_tests,
- request_tests,
- event_tests,
- discovery,
- tickets
- ].
-
-start_and_stop_tests(suite) ->
- [
- simple_start_and_stop1,
- simple_start_and_stop2,
- simple_start_and_monitor_crash1,
- simple_start_and_monitor_crash2,
- notify_started01,
- notify_started02
- ].
-
-misc_tests(suite) ->
- [
- info
- ].
-
-user_tests(suite) ->
- [
- register_user1
- ].
-
-agent_tests(suite) ->
- [
- register_agent1,
- register_agent2
- ].
-
-request_tests(suite) ->
- [
- get_tests,
- get_next_tests,
- set_tests,
- bulk_tests,
- misc_request_tests
- ].
-
-get_tests(suite) ->
- [
- simple_sync_get1,
- simple_sync_get2,
- simple_async_get1,
- simple_async_get2
- ].
-
-get_next_tests(suite) ->
- [
- simple_sync_get_next1,
- simple_sync_get_next2,
- simple_async_get_next1,
- simple_async_get_next2
- ].
-
-set_tests(suite) ->
- [
- simple_sync_set1,
- simple_sync_set2,
- simple_async_set1,
- simple_async_set2
- ].
-
-bulk_tests(suite) ->
- [
- simple_sync_get_bulk1,
- simple_sync_get_bulk2,
- simple_async_get_bulk1,
- simple_async_get_bulk2
- ].
-
-misc_request_tests(suite) ->
- [
- misc_async1,
- misc_async2
- ].
-
-event_tests(suite) ->
- [
- trap1,
- trap2,
- inform1,
- inform2,
- inform3,
- inform4,
- inform_swarm,
- report
- ].
-
-tickets(suite) ->
- [
- otp8015,
- otp8395
- ].
-
-otp8015(suite) ->
- [
- otp8015_1
- ].
-
-otp8395(suite) ->
- [
- otp8395_1
- ].
+all() ->
+[{group, start_and_stop_tests}, {group, misc_tests},
+ {group, user_tests}, {group, agent_tests},
+ {group, request_tests}, {group, event_tests}, discovery,
+ {group, tickets}].
+
+groups() ->
+ [{start_and_stop_tests, [],
+ [simple_start_and_stop1, simple_start_and_stop2,
+ simple_start_and_monitor_crash1,
+ simple_start_and_monitor_crash2, notify_started01,
+ notify_started02]},
+ {misc_tests, [], [info]},
+ {user_tests, [], [register_user1]},
+ {agent_tests, [], [register_agent1, register_agent2]},
+ {request_tests, [],
+ [{group, get_tests}, {group, get_next_tests},
+ {group, set_tests}, {group, bulk_tests},
+ {group, misc_request_tests}]},
+ {get_tests, [],
+ [simple_sync_get1, simple_sync_get2, simple_async_get1,
+ simple_async_get2]},
+ {get_next_tests, [],
+ [simple_sync_get_next1, simple_sync_get_next2,
+ simple_async_get_next1, simple_async_get_next2]},
+ {set_tests, [],
+ [simple_sync_set1, simple_sync_set2, simple_async_set1,
+ simple_async_set2]},
+ {bulk_tests, [],
+ [simple_sync_get_bulk1, simple_sync_get_bulk2,
+ simple_async_get_bulk1, simple_async_get_bulk2]},
+ {misc_request_tests, [], [misc_async1, misc_async2]},
+ {event_tests, [],
+ [trap1, trap2, inform1, inform2, inform3, inform4,
+ inform_swarm, report]},
+ {tickets, [], [{group, otp8015}, {group, otp8395}]},
+ {otp8015, [], [otp8015_1]}, {otp8395, [], [otp8395_1]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
%%======================================================================
diff --git a/lib/snmp/test/snmp_manager_user.erl b/lib/snmp/test/snmp_manager_user.erl
index 07b56bde39..b0e192344d 100644
--- a/lib/snmp/test/snmp_manager_user.erl
+++ b/lib/snmp/test/snmp_manager_user.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
diff --git a/lib/snmp/test/snmp_manager_user_old.erl b/lib/snmp/test/snmp_manager_user_old.erl
index b53514d699..edffc80dd4 100755
--- a/lib/snmp/test/snmp_manager_user_old.erl
+++ b/lib/snmp/test/snmp_manager_user_old.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009. All Rights Reserved.
+%% Copyright Ericsson AB 2010. 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
diff --git a/lib/snmp/test/snmp_manager_user_test.erl b/lib/snmp/test/snmp_manager_user_test.erl
index 0f47d70873..fefa1ad713 100644
--- a/lib/snmp/test/snmp_manager_user_test.erl
+++ b/lib/snmp/test/snmp_manager_user_test.erl
@@ -26,7 +26,7 @@
%%----------------------------------------------------------------------
%% Include files
%%----------------------------------------------------------------------
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("snmp_test_lib.hrl").
@@ -36,10 +36,10 @@
%% -compile(export_all).
-export([
- all/1,
- init_per_testcase/2, fin_per_testcase/2,
+all/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_testcase/2, end_per_testcase/2,
+
- register_user/1,
simple_register_and_unregister1/1,
simple_register_and_unregister2/1,
simple_register_and_unregister3/1,
@@ -62,7 +62,7 @@
register_monitor_request_and_crash3/1,
register_monitor_request_and_crash4/1,
- tickets/1,
+
otp7902/1
]).
@@ -123,8 +123,8 @@ init_per_testcase(Case, Config) when is_list(Config) ->
{manager_log_dir, MgrLogDir} | Config].
-fin_per_testcase(Case, Config) when is_list(Config) ->
- p("fin_per_testcase -> Case: ~p", [Case]),
+end_per_testcase(Case, Config) when is_list(Config) ->
+ p("end_per_testcase -> Case: ~p", [Case]),
% MgrTopDir = ?config(manager_dir, Config),
% ?DEL_DIR(MgrTopDir),
Config.
@@ -134,42 +134,41 @@ fin_per_testcase(Case, Config) when is_list(Config) ->
%% Test case definitions
%%======================================================================
-all(suite) ->
- [
- register_user,
- tickets
- ].
-
-register_user(suite) ->
- [
- simple_register_and_unregister1,
- simple_register_and_unregister2,
- simple_register_and_unregister3,
- register_and_crash1,
- register_and_crash2,
- register_and_crash3,
- register_request_and_crash1,
- register_request_and_crash2,
- register_request_and_crash3,
- simple_register_monitor_and_unregister1,
- simple_register_monitor_and_unregister2,
- simple_register_monitor_and_unregister3,
- register_monitor_and_crash1,
- register_monitor_and_crash2,
- register_monitor_and_crash3,
- register_monitor_and_crash4,
- register_monitor_and_crash5,
- register_monitor_request_and_crash1,
- register_monitor_request_and_crash2,
- register_monitor_request_and_crash3,
- register_monitor_request_and_crash4
- ].
-
-
-tickets(suite) ->
- [
- otp7902
- ].
+all() ->
+[{group, register_user}, {group, tickets}].
+
+groups() ->
+ [{register_user, [],
+ [simple_register_and_unregister1,
+ simple_register_and_unregister2,
+ simple_register_and_unregister3, register_and_crash1,
+ register_and_crash2, register_and_crash3,
+ register_request_and_crash1,
+ register_request_and_crash2,
+ register_request_and_crash3,
+ simple_register_monitor_and_unregister1,
+ simple_register_monitor_and_unregister2,
+ simple_register_monitor_and_unregister3,
+ register_monitor_and_crash1,
+ register_monitor_and_crash2,
+ register_monitor_and_crash3,
+ register_monitor_and_crash4,
+ register_monitor_and_crash5,
+ register_monitor_request_and_crash1,
+ register_monitor_request_and_crash2,
+ register_monitor_request_and_crash3,
+ register_monitor_request_and_crash4]},
+ {tickets, [], [otp7902]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+
+
%%======================================================================
diff --git a/lib/snmp/test/snmp_manager_user_test_lib.erl b/lib/snmp/test/snmp_manager_user_test_lib.erl
index a49fe93178..bf8fff7c4c 100644
--- a/lib/snmp/test/snmp_manager_user_test_lib.erl
+++ b/lib/snmp/test/snmp_manager_user_test_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2010. 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
diff --git a/lib/snmp/test/snmp_note_store_test.erl b/lib/snmp/test/snmp_note_store_test.erl
index 8686a47468..24ba88f986 100644
--- a/lib/snmp/test/snmp_note_store_test.erl
+++ b/lib/snmp/test/snmp_note_store_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2010. 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
@@ -25,7 +25,7 @@
%%----------------------------------------------------------------------
%% Include files
%%----------------------------------------------------------------------
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include("snmp_test_lib.hrl").
@@ -33,8 +33,8 @@
%% External exports
%%----------------------------------------------------------------------
-export([
- init_per_testcase/2, fin_per_testcase/2,
- all/1,
+ init_per_testcase/2, end_per_testcase/2,
+ all/0,groups/0,init_per_group/2,end_per_group/2,
start_and_stop/1,
notes/1,
info/1,
@@ -63,20 +63,24 @@
init_per_testcase(_Case, Config) when is_list(Config) ->
Config.
-fin_per_testcase(_Case, Config) when is_list(Config) ->
+end_per_testcase(_Case, Config) when is_list(Config) ->
Config.
%%======================================================================
%% Test case definitions
%%======================================================================
-all(suite) ->
- [
- start_and_stop,
- notes,
- info,
- garbage_in
-
- ].
+all() ->
+[start_and_stop, notes, info, garbage_in].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%======================================================================
diff --git a/lib/snmp/test/snmp_pdus_test.erl b/lib/snmp/test/snmp_pdus_test.erl
index 6dc5b779aa..ef510ad62e 100644
--- a/lib/snmp/test/snmp_pdus_test.erl
+++ b/lib/snmp/test/snmp_pdus_test.erl
@@ -25,7 +25,7 @@
%%----------------------------------------------------------------------
%% Include files
%%----------------------------------------------------------------------
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include("snmp_test_lib.hrl").
-include_lib("snmp/include/snmp_types.hrl").
@@ -34,11 +34,11 @@
%% External exports
%%----------------------------------------------------------------------
-export([
- all/1,
- tickets/1,
+ all/0,groups/0,init_per_group/2,end_per_group/2,
+
otp7575/1,
otp8563/1,
- init_per_testcase/2, fin_per_testcase/2
+ init_per_testcase/2, end_per_testcase/2
]).
@@ -64,23 +64,26 @@
init_per_testcase(_Case, Config) when is_list(Config) ->
Config.
-fin_per_testcase(_Case, Config) when is_list(Config) ->
+end_per_testcase(_Case, Config) when is_list(Config) ->
Config.
%%======================================================================
%% Test case definitions
%%======================================================================
-all(suite) ->
- [
- tickets
- ].
-
-tickets(suite) ->
- [
- otp7575,
- otp8563
- ].
+all() ->
+[{group, tickets}].
+
+groups() ->
+ [{tickets, [], [otp7575, otp8563]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
diff --git a/lib/snmp/test/snmp_test_data/AC-TEST-MIB.mib b/lib/snmp/test/snmp_test_data/AC-TEST-MIB.mib
new file mode 100644
index 0000000000..58defbe1cf
--- /dev/null
+++ b/lib/snmp/test/snmp_test_data/AC-TEST-MIB.mib
@@ -0,0 +1,131 @@
+--
+-- AC-TEST-MIB.mib
+-- MIB generated by MG-SOFT Visual MIB Builder Version 5.0 Build 250
+-- Tuesday, November 30, 2010 at 23:03:18
+--
+
+ AC-TEST-MIB DEFINITIONS ::= BEGIN
+
+ IMPORTS
+ otpExpr
+ FROM OTP-REG
+ OBJECT-GROUP, AGENT-CAPABILITIES
+ FROM SNMPv2-CONF
+ Integer32, OBJECT-TYPE, MODULE-IDENTITY, OBJECT-IDENTITY
+ FROM SNMPv2-SMI;
+
+
+ acTestModule MODULE-IDENTITY
+ LAST-UPDATED "201011302230Z" -- November 30, 2010 at 22:30 GMT
+ ORGANIZATION
+ "Ac Test Co."
+ CONTACT-INFO
+ DESCRIPTION
+ "Ac Test module."
+ ::= { reg 1 }
+
+
+
+--
+-- Node definitions
+--
+
+ acTest OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "Test area."
+ ::= { otpExpr 4321 }
+
+
+ reg OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "Registrations."
+ ::= { acTest 1 }
+
+
+ mib OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "Objects."
+ ::= { acTest 2 }
+
+
+ someObject OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "Description."
+ ::= { mib 1 }
+
+
+ oneMore OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "Description."
+ ::= { mib 2 }
+
+
+ grp OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "Groups
+ ."
+ ::= { acTest 3 }
+
+
+ basicGrp OBJECT-GROUP
+ OBJECTS { someObject }
+ STATUS current
+ DESCRIPTION
+ "Basic set of objects."
+ ::= { grp 1 }
+
+
+ allObjects OBJECT-GROUP
+ OBJECTS { someObject, oneMore }
+ STATUS current
+ DESCRIPTION
+ "Complete set."
+ ::= { grp 2 }
+
+
+ cap OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "Capabilities."
+ ::= { acTest 5 }
+
+
+ basicAgent AGENT-CAPABILITIES
+ PRODUCT-RELEASE
+ "Product release v1."
+ STATUS current
+ DESCRIPTION
+ "Basic agent."
+ SUPPORTS AC-TEST-MIB
+ INCLUDES { basicGrp }
+ ::= { cap 1 }
+
+
+ fullAgent AGENT-CAPABILITIES
+ PRODUCT-RELEASE
+ "Product release v2."
+ STATUS current
+ DESCRIPTION
+ "Full featured agent."
+ SUPPORTS AC-TEST-MIB
+ INCLUDES { allObjects }
+ ::= { cap 2 }
+
+
+
+ END
+
+--
+-- AC-TEST-MIB.mib
+--
diff --git a/lib/snmp/test/snmp_test_data/MC-TEST-MIB.mib b/lib/snmp/test/snmp_test_data/MC-TEST-MIB.mib
new file mode 100644
index 0000000000..cadaa6f891
--- /dev/null
+++ b/lib/snmp/test/snmp_test_data/MC-TEST-MIB.mib
@@ -0,0 +1,173 @@
+MC-TEST-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ otpExpr
+ FROM OTP-REG
+ MODULE-IDENTITY, OBJECT-TYPE,
+ mib-2, NOTIFICATION-TYPE, OBJECT-IDENTITY
+ FROM SNMPv2-SMI
+ TDomain, TAddress, DisplayString, TEXTUAL-CONVENTION,
+ AutonomousType, RowPointer, TimeStamp,
+ RowStatus, StorageType
+ FROM SNMPv2-TC
+ MODULE-COMPLIANCE, OBJECT-GROUP, NOTIFICATION-GROUP
+ FROM SNMPv2-CONF;
+
+mcTestModule MODULE-IDENTITY
+ LAST-UPDATED "9605160000Z"
+ ORGANIZATION "MC Test Co."
+ CONTACT-INFO
+ DESCRIPTION
+ "MC Test module."
+ ::= { reg 1 }
+
+mcObjects OBJECT IDENTIFIER ::= { mcTestModule 1 }
+
+-- MIB contains one group
+
+mcMisc OBJECT IDENTIFIER ::= { mcObjects 1 }
+mcGeneral OBJECT IDENTIFIER ::= { mcObjects 2 }
+
+
+mcTest OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "Test area."
+ ::= { otpExpr 4322 }
+
+
+reg OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "Registrations."
+ ::= { mcTest 1 }
+
+
+mcTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF McEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "This table contains one row per physical entity. There is
+ always at least one row for an 'overall' physical entity."
+ ::= { mcMisc 1 }
+
+mcEntry OBJECT-TYPE
+ SYNTAX McEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "Table entry..."
+ INDEX { mcIndex }
+ ::= { mcTable 1 }
+
+McEntry ::= SEQUENCE {
+ mcIndex INTEGER,
+ mcName DisplayString,
+ mcStorageType StorageType,
+ mcRowStatus RowStatus
+}
+
+mcIndex OBJECT-TYPE
+ SYNTAX INTEGER
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The index for this entry."
+ ::= { mcEntry 1 }
+
+mcName OBJECT-TYPE
+ SYNTAX DisplayString
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Name of... "
+ ::= { mcEntry 2 }
+
+
+mcStorageType OBJECT-TYPE
+ SYNTAX StorageType
+ MAX-ACCESS read-create
+ STATUS current
+ DESCRIPTION
+ "The storage type for this conceptual row."
+ DEFVAL { nonVolatile }
+ ::= { mcEntry 3 }
+
+mcRowStatus OBJECT-TYPE
+ SYNTAX RowStatus
+ MAX-ACCESS read-create
+ STATUS current
+ DESCRIPTION
+ "The status of this conceptual row..."
+ ::= { mcEntry 4 }
+
+
+-- last change time stamp for the whole MIB
+mcTimeStamp OBJECT-TYPE
+ SYNTAX TimeStamp
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The sysUpTime value when of the last time *anything* in the
+ MIB was changed. "
+ ::= { mcGeneral 1 }
+
+-- Entity MIB Trap Definitions
+mcTraps OBJECT IDENTIFIER ::= { mcTestModule 2 }
+mcTrapPrefix OBJECT IDENTIFIER ::= { mcTraps 0 }
+
+mcConfigChange NOTIFICATION-TYPE
+ STATUS current
+ DESCRIPTION
+ "An mcConfigChange trap is sent when the value of
+ entLastChangeTime changes..."
+ ::= { mcTrapPrefix 1 }
+
+-- conformance information
+mcConformance OBJECT IDENTIFIER ::= { mcTestModule 3 }
+
+mcCompliances OBJECT IDENTIFIER ::= { mcConformance 1 }
+mcGroups OBJECT IDENTIFIER ::= { mcConformance 2 }
+
+-- compliance statements
+
+
+mcCompliance MODULE-COMPLIANCE
+ STATUS current
+ DESCRIPTION
+ "The compliance statement for SNMP entities which implement
+ the MC Test MIB."
+ MODULE -- this module
+ MANDATORY-GROUPS { mcGeneralGroup,
+ mcNotificationsGroup }
+ ::= { mcCompliances 1 }
+
+-- MIB groupings
+
+mcGeneralGroup OBJECT-GROUP
+ OBJECTS {
+ mcName,
+ mcStorageType,
+ mcRowStatus,
+ mcTimeStamp
+ }
+ STATUS current
+ DESCRIPTION
+ "The collection of objects which are used to represent
+ general information..."
+ ::= { mcGroups 1 }
+
+mcNotificationsGroup NOTIFICATION-GROUP
+ NOTIFICATIONS { mcConfigChange }
+ STATUS current
+ DESCRIPTION
+ "The collection of notifications..."
+ ::= { mcGroups 2 }
+
+
+END
+
+
+
diff --git a/lib/snmp/test/snmp_test_manager.erl b/lib/snmp/test/snmp_test_manager.erl
index 9d9c52ef8d..4cc6d36acc 100644
--- a/lib/snmp/test/snmp_test_manager.erl
+++ b/lib/snmp/test/snmp_test_manager.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
diff --git a/lib/snmp/test/snmp_test_mgr_misc.erl b/lib/snmp/test/snmp_test_mgr_misc.erl
index ef1ba0b948..fc6dedd96d 100644
--- a/lib/snmp/test/snmp_test_mgr_misc.erl
+++ b/lib/snmp/test/snmp_test_mgr_misc.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -33,6 +33,8 @@
%% internal exports
-export([init_packet/10]).
+-compile({no_auto_import, [error/2]}).
+
-define(SNMP_USE_V3, true).
-include_lib("snmp/include/snmp_types.hrl").
diff --git a/lib/snmp/test/snmp_test_server.erl b/lib/snmp/test/snmp_test_server.erl
index d0a5185452..ffbd2126a3 100644
--- a/lib/snmp/test/snmp_test_server.erl
+++ b/lib/snmp/test/snmp_test_server.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2010. 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
@@ -33,7 +33,7 @@
fatal_skip/3,
init_per_testcase/2,
- fin_per_testcase/2
+ end_per_testcase/2
]).
-include("snmp_test_lib.hrl").
@@ -229,7 +229,7 @@ eval(Mod, Fun, Config) ->
Eval = fun() -> do_eval(Self, Mod, Fun, Config2) end,
Pid = spawn_link(Eval),
R = wait_for_evaluator(Pid, Mod, Fun, Config2, []),
- Mod:fin_per_testcase(Fun, Config2),
+ Mod:end_per_testcase(Fun, Config2),
global:unregister_name(?TEST_CASE_SUP),
process_flag(trap_exit, Flag),
R.
@@ -361,7 +361,7 @@ init_per_testcase(_Case, Config) ->
global:register_name(?GLOBAL_LOGGER, group_leader()),
Config.
-fin_per_testcase(_Case, _Config) ->
+end_per_testcase(_Case, _Config) ->
global:unregister_name(?GLOBAL_LOGGER),
ok.
diff --git a/lib/snmp/test/snmp_test_suite.erl b/lib/snmp/test/snmp_test_suite.erl
index a6e203eba3..77aaa508ad 100644
--- a/lib/snmp/test/snmp_test_suite.erl
+++ b/lib/snmp/test/snmp_test_suite.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2010. 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
@@ -29,7 +29,7 @@ behaviour_info(callbacks) ->
[
{all, 1},
{init_per_testcase, 2},
- {fin_per_testcase, 2}
+ {end_per_testcase, 2}
];
behaviour_info(_Other) ->
undefined.
diff --git a/lib/snmp/test/test1.erl b/lib/snmp/test/test1.erl
index b26b03d4ce..23cfaf6aaa 100644
--- a/lib/snmp/test/test1.erl
+++ b/lib/snmp/test/test1.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2010. 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
diff --git a/lib/snmp/test/test2.erl b/lib/snmp/test/test2.erl
index dc010cfa11..a33208af7b 100644
--- a/lib/snmp/test/test2.erl
+++ b/lib/snmp/test/test2.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2010. 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
diff --git a/lib/snmp/test/test_config/.gitignore b/lib/snmp/test/test_config/.gitignore
new file mode 100644
index 0000000000..fc2d5dbadf
--- /dev/null
+++ b/lib/snmp/test/test_config/.gitignore
@@ -0,0 +1,19 @@
+# Sys config files (Generated)
+/sys.config
+/sys-agent.config
+/sys-manager.config
+
+# Agent config files (Generated)
+/agent/agent.conf
+/agent/community.conf
+/agent/context.conf
+/agent/notify.conf
+/agent/standard.conf
+/agent/target_addr.conf
+/agent/target_params.conf
+/agent/usm.conf
+/agent/vacm.conf
+
+# Manager config files (Generated)
+/manager/manager.conf
+/manager/usm.conf
diff --git a/lib/snmp/test/test_config/Makefile b/lib/snmp/test/test_config/Makefile
new file mode 100644
index 0000000000..d7bebbc431
--- /dev/null
+++ b/lib/snmp/test/test_config/Makefile
@@ -0,0 +1,199 @@
+#-*-makefile-*- ; force emacs to enter makefile-mode
+
+# %CopyrightBegin%
+#
+# Copyright Ericsson AB 1997-2011. 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%
+
+include $(ERL_TOP)/make/target.mk
+include $(ERL_TOP)/make/$(TARGET)/otp.mk
+
+
+# ----------------------------------------------------
+# Application version
+# ----------------------------------------------------
+include ../../vsn.mk
+
+VSN = $(SNMP_VSN)
+
+
+# ----------------------------------------------------
+# Configured variables
+# ----------------------------------------------------
+
+
+# ----------------------------------------------------
+# Target Specs
+# ----------------------------------------------------
+
+include modules.mk
+
+ERL_TARGETS = $(MODULES:%=$(EBIN)/%.$(EMULATOR))
+
+SYS_CONFIG_SRCS = $(SYS_CONFIG_FILES:%=%.src)
+AGENT_CONFIG_SRCS = $(AGENT_CONFIG_FILES:%=%.src)
+MANAGER_CONFIG_SRCS = $(MANAGER_CONFIG_FILES:%=%.src)
+
+CONFIG_FILES = \
+ $(SYS_CONFIG_FILES) \
+ $(AGENT_CONFIG_FILES) \
+ $(MANAGER_CONFIG_FILES)
+
+TARGETS = \
+ $(ERL_TARGETS) \
+ $(CONFIG_FILES)
+
+
+# ----------------------------------------------------
+# Release directory specification
+# ----------------------------------------------------
+ifeq ($(TESTROOT),)
+TESTROOT=/tmp
+endif
+RELSYSDIR = $(TESTROOT)
+
+
+# ----------------------------------------------------
+# FLAGS AND VARIABLES
+# ----------------------------------------------------
+
+EBIN = .
+
+ERL_COMPILE_FLAGS += +'{parse_transform,sys_pre_attributes}' \
+ +'{attribute,insert,app_vsn,$(APP_VSN)}'
+
+ifeq ($(ADDR),)
+ADDR = $(shell erl -noshell -s snmp_test_config ip_address -s init stop)
+endif
+
+ifeq ($(TARGET_NAME_PRE),)
+TARGET_NAME_PRE = $(shell erl -noshell -s snmp_test_config ip_address2 -s init stop)
+endif
+
+ifeq ($(SYS_CONTACT),)
+SYS_CONTACT = [email protected]
+endif
+
+ifeq ($(SYS_LOCATION),)
+SYS_LOCATION = Erlang/OTP
+endif
+
+ifeq ($(SYS_NAME),)
+SYS_NAME = FOO
+endif
+
+ifeq ($(AGENT_ENGINE_ID),)
+AGENT_ENGINE_ID = Agent engine of $(USER)
+endif
+
+ifeq ($(AGENT_USM_ENGINE_ID),)
+AGENT_USM_ENGINE_ID = $(AGENT_ENGINE_ID)
+endif
+
+ifeq ($(MANAGER_ENGINE_ID),)
+MANAGER_ENGINE_ID = Manager engine of $(USER)
+endif
+
+ifeq ($(MANAGER_USM_ENGINE_ID),)
+MANAGER_USM_ENGINE_ID = $(MANAGER_ENGINE_ID)
+endif
+
+
+
+# ----------------------------------------------------
+# Targets
+# ----------------------------------------------------
+
+tests debug opt: $(TARGETS)
+
+clean:
+ rm -f $(CONFIG_FILES)
+ rm -f $(ERL_TARGETS)
+ rm -f core
+
+docs:
+
+%.config: %.config.src
+ @echo "$< -> $@"
+ $(PERL) -p -e 's?%DIR%?$(RELSYSDIR)? ' < $< > $@
+
+agent/%.conf: agent/%.conf.src
+ @echo "$< -> $@"
+ sed -e 's?%ADDR%?$(ADDR)? ' \
+ -e 's?%SYS_CONTACT%?$(SYS_CONTACT)? ' \
+ -e 's?%SYS_LOCATION%?$(SYS_LOCATION)? ' \
+ -e 's?%SYS_NAME%?$(SYS_NAME)? ' \
+ -e 's?%TARGET_NAME_PRE%?$(TARGET_NAME_PRE)? ' \
+ -e 's?%ENGINE_ID%?\"$(AGENT_ENGINE_ID)\"? ' \
+ -e 's?%USM_ENGINE_ID%?\"$(AGENT_USM_ENGINE_ID)\"? ' < $< > $@
+
+manager/%.conf: manager/%.conf.src
+ @echo "$< -> $@"
+ sed -e 's?%ADDR%?$(ADDR)? ' \
+ -e 's?%ENGINE_ID%?\"$(MANAGER_ENGINE_ID)\"? ' \
+ -e 's?%USM_ENGINE_ID%?\"$(MANAGER_USM_ENGINE_ID)\"? ' < $< > $@
+
+
+# ----------------------------------------------------
+# Release Target
+# ----------------------------------------------------
+include $(ERL_TOP)/make/otp_release_targets.mk
+
+release_spec:
+
+release_tests_spec: clean opt
+ $(INSTALL_DIR) $(RELSYSDIR)
+ chmod -f -R u+w $(RELSYSDIR)
+ $(INSTALL_DIR) $(RELSYSDIR)/agent
+ chmod -f -R u+w $(RELSYSDIR)/agent
+ $(INSTALL_DIR) $(RELSYSDIR)/agent/conf
+ chmod -f -R u+w $(RELSYSDIR)/agent/conf
+ $(INSTALL_DIR) $(RELSYSDIR)/agent/db
+ chmod -f -R u+w $(RELSYSDIR)/agent/db
+ $(INSTALL_DIR) $(RELSYSDIR)/agent/log
+ chmod -f -R u+w $(RELSYSDIR)/agent/log
+ $(INSTALL_DIR) $(RELSYSDIR)/manager
+ chmod -f -R u+w $(RELSYSDIR)/manager
+ $(INSTALL_DIR) $(RELSYSDIR)/manager/conf
+ chmod -f -R u+w $(RELSYSDIR)/manager/conf
+ $(INSTALL_DIR) $(RELSYSDIR)/manager/db
+ chmod -f -R u+w $(RELSYSDIR)/manager/db
+ $(INSTALL_DIR) $(RELSYSDIR)/manager/log
+ chmod -f -R u+w $(RELSYSDIR)/manager/log
+ $(INSTALL_DATA) $(SYS_CONFIG_FILES) $(RELSYSDIR)
+ $(INSTALL_DATA) $(AGENT_CONFIG_FILES) $(RELSYSDIR)/agent/conf
+ $(INSTALL_DATA) $(MANAGER_CONFIG_FILES) $(RELSYSDIR)/manager/conf
+
+release_docs_spec:
+
+
+info:
+ @echo ""
+ @echo "RELSYSDIR = $(RELSYSDIR)"
+ @echo ""
+ @echo "SYS_CONFIG_SRCS = $(SYS_CONFIG_SRCS)"
+ @echo "SYS_CONFIG_FILES = $(SYS_CONFIG_FILES)"
+ @echo ""
+ @echo "AGENT_CONFIG_SRCS = $(AGENT_CONFIG_SRCS)"
+ @echo "AGENT_CONFIG_FILES = $(AGENT_CONFIG_FILES)"
+ @echo ""
+ @echo "MANAGER_CONFIG_SRCS = $(MANAGER_CONFIG_SRCS)"
+ @echo "MANAGER_CONFIG_FILES = $(MANAGER_CONFIG_FILES)"
+ @echo ""
+ @echo "ADDR = $(ADDR)"
+ @echo "TARGET_NAME_PRE = $(TARGET_NAME_PRE)"
+ @echo ""
+
+
diff --git a/lib/snmp/test/test_config/agent/agent.conf.src b/lib/snmp/test/test_config/agent/agent.conf.src
new file mode 100644
index 0000000000..1fe95cc72d
--- /dev/null
+++ b/lib/snmp/test/test_config/agent/agent.conf.src
@@ -0,0 +1,19 @@
+%% This file defines the Agent local configuration info
+%% The data is inserted into the snmpEngine* variables defined
+%% in SNMP-FRAMEWORK-MIB, and the intAgent* variables defined
+%% in OTP-SNMPEA-MIB.
+%% Each row is a 2-tuple:
+%% {AgentVariable, Value}.
+%% For example
+%% {intAgentUDPPort, 4000}.
+%% The ip address for the agent is sent as id in traps.
+%% {intAgentIpAddress, [127,42,17,5]}.
+%% {snmpEngineID, "agentEngine"}.
+%% {snmpEngineMaxMessageSize, 484}.
+%%
+
+
+{intAgentUDPPort, 4000}.
+{intAgentIpAddress, %ADDR%}.
+{snmpEngineID, %ENGINE_ID%}.
+{snmpEngineMaxMessageSize, 484}.
diff --git a/lib/snmp/test/test_config/agent/community.conf.src b/lib/snmp/test/test_config/agent/community.conf.src
new file mode 100644
index 0000000000..8dccb929c9
--- /dev/null
+++ b/lib/snmp/test/test_config/agent/community.conf.src
@@ -0,0 +1,15 @@
+%% This file defines the community info which maps to VACM parameters.
+%% The data is inserted into the snmpCommunityTable defined
+%% in SNMP-COMMUNITY-MIB.
+%% Each row is a 5-tuple:
+%% {CommunityIndex, CommunityName, SecurityName, ContextName, TransportTag}.
+%% For example
+%% {"1", "public", "initial", "", ""}.
+%% {"2", "secret", "secret_name", "", "tag"}.
+%% {"3", "bridge1", "initial", "bridge1", ""}.
+%%
+
+
+{"public", "public", "initial", "", ""}.
+{"all-rights", "all-rights", "all-rights", "", ""}.
+{"standard trap", "standard trap", "initial", "", ""}.
diff --git a/lib/snmp/test/test_config/agent/context.conf.src b/lib/snmp/test/test_config/agent/context.conf.src
new file mode 100644
index 0000000000..ea8b5a97eb
--- /dev/null
+++ b/lib/snmp/test/test_config/agent/context.conf.src
@@ -0,0 +1,14 @@
+%% This file defines the contexts known to the agent.
+%% The data is inserted into the vacmContextTable defined
+%% in SNMP-VIEW-BASED-ACM-MIB.
+%% Each row is a string:
+%% ContextName.
+%%
+%% The empty string is the default context.
+%% For example
+%% "bridge1".
+%% "bridge2".
+%%
+
+
+"".
diff --git a/lib/snmp/test/test_config/agent/notify.conf.src b/lib/snmp/test/test_config/agent/notify.conf.src
new file mode 100644
index 0000000000..164fd25b95
--- /dev/null
+++ b/lib/snmp/test/test_config/agent/notify.conf.src
@@ -0,0 +1,13 @@
+%% This file defines the notification parameters.
+%% The data is inserted into the snmpNotifyTable defined
+%% in SNMP-NOTIFICATION-MIB.
+%% The Name is used as CommunityString for v1 and v2c.
+%% Each row is a 3-tuple:
+%% {Name, Tag, Type}.
+%% For example
+%% {"standard trap", "std_trap", trap}.
+%% {"standard inform", "std_inform", inform}.
+%%
+
+
+{"stadard_trap", "std_trap", trap}.
diff --git a/lib/snmp/test/test_config/agent/standard.conf.src b/lib/snmp/test/test_config/agent/standard.conf.src
new file mode 100644
index 0000000000..31e04e7695
--- /dev/null
+++ b/lib/snmp/test/test_config/agent/standard.conf.src
@@ -0,0 +1,21 @@
+%% This file defines the STANDARD-MIB info.
+%% Each row is a 2-tuple:
+%% {StandardVariable, Value}.
+%% For example
+%% {sysDescr, "Erlang SNMP agent"}.
+%% {sysObjectID, [1,2,3]}.
+%% {sysContact, "[email protected]"}.
+%% {sysName, "test"}.
+%% {sysLocation, "erlang"}.
+%% {sysServices, 72}.
+%% {snmpEnableAuthenTraps, enabled}.
+%%
+
+
+{sysDescr, "Erlang SNMP agent"}.
+{sysObjectID, [1,2,3]}.
+{sysContact, "%SYS_CONTACT%"}.
+{sysLocation, "%SYS_LOCATION%"}.
+{sysServices, 72}.
+{snmpEnableAuthenTraps, disabled}.
+{sysName, "%SYS_NAME%"}.
diff --git a/lib/snmp/test/test_config/agent/target_addr.conf.src b/lib/snmp/test/test_config/agent/target_addr.conf.src
new file mode 100644
index 0000000000..740df74ecf
--- /dev/null
+++ b/lib/snmp/test/test_config/agent/target_addr.conf.src
@@ -0,0 +1,21 @@
+%% This file defines the target address parameters.
+%% The data is inserted into the snmpTargetAddrTable defined
+%% in SNMP-TARGET-MIB, and in the snmpTargetAddrExtTable defined
+%% in SNMP-COMMUNITY-MIB.
+%% Each row is a 10-tuple:
+%% {Name, Ip, Udp, Timeout, RetryCount, TagList, ParamsName, EngineId,
+%% TMask, MaxMessageSize}.
+%% The EngineId value is only used if Inform-Requests are sent to this
+%% target. If Informs are not sent, this value is ignored, and can be
+%% e.g. an empty string. However, if Informs are sent, it is essential
+%% that the value of EngineId matches the value of the target's
+%% actual snmpEngineID.
+%% For example
+%% {"1.2.3.4 v1", [1,2,3,4], 162,
+%% 1500, 3, "std_inform", "otp_v2", "",
+%% [127,0,0,0], 2048}.
+%%
+
+
+{"%TARGET_NAME_PRE% v2", %ADDR%, 5000, 1500, 3, "std_trap", "target_v2", "", [], 2048}.
+{"%TARGET_NAME_PRE% v2.2", %ADDR%, 5000, 1500, 3, "std_inform", "target_v2", "", [], 2048}.
diff --git a/lib/snmp/test/test_config/agent/target_params.conf.src b/lib/snmp/test/test_config/agent/target_params.conf.src
new file mode 100644
index 0000000000..a4a535baa2
--- /dev/null
+++ b/lib/snmp/test/test_config/agent/target_params.conf.src
@@ -0,0 +1,11 @@
+%% This file defines the target parameters.
+%% The data is inserted into the snmpTargetParamsTable defined
+%% in SNMP-TARGET-MIB.
+%% Each row is a 5-tuple:
+%% {Name, MPModel, SecurityModel, SecurityName, SecurityLevel}.
+%% For example
+%% {"target_v3", v3, usm, "", noAuthNoPriv}.
+%%
+
+
+{"target_v2", v2c, v2c, "initial", noAuthNoPriv}.
diff --git a/lib/snmp/test/test_config/agent/usm.conf.src b/lib/snmp/test/test_config/agent/usm.conf.src
new file mode 100644
index 0000000000..0409084048
--- /dev/null
+++ b/lib/snmp/test/test_config/agent/usm.conf.src
@@ -0,0 +1,17 @@
+%% This file defines the security parameters for the user-based
+%% security model.
+%% The data is inserted into the usmUserTable defined
+%% in SNMP-USER-BASED-SM-MIB.
+%% Each row is a 13-tuple:
+%% {EngineID, UserName, SecName, Clone, AuthP, AuthKeyC, OwnAuthKeyC,
+%% PrivP, PrivKeyC, OwnPrivKeyC, Public, AuthKey, PrivKey}.
+%% For example
+%% {"agentEngine", "initial", "initial", zeroDotZero,
+%% usmNoAuthProtocol, "", "", usmNoPrivProtocol, "", "", "",
+%% "", ""}.
+%%
+
+
+{%USM_ENGINE_ID%, "initial", "initial", zeroDotZero, usmHMACMD5AuthProtocol, "", "", usmNoPrivProtocol, "", "", "", [160,66,33,136,178,59,246,214,102,63,131,131,54,14,221,177], ""}.
+{%USM_ENGINE_ID%, "templateMD5", "templateMD5", zeroDotZero, usmHMACMD5AuthProtocol, "", "", usmNoPrivProtocol, "", "", "", [160,66,33,136,178,59,246,214,102,63,131,131,54,14,221,177], ""}.
+{%USM_ENGINE_ID%, "templateSHA", "templateSHA", zeroDotZero, usmHMACSHAAuthProtocol, "", "", usmNoPrivProtocol, "", "", "", [199,94,239,13,229,135,141,77,124,129,65,189,230,240,115,163,239,15,13,242], ""}.
diff --git a/lib/snmp/test/test_config/agent/vacm.conf.src b/lib/snmp/test/test_config/agent/vacm.conf.src
new file mode 100644
index 0000000000..86271443ad
--- /dev/null
+++ b/lib/snmp/test/test_config/agent/vacm.conf.src
@@ -0,0 +1,27 @@
+%% This file defines the Mib Views.
+%% The data is inserted into the vacm* tables defined
+%% in SNMP-VIEW-BASED-ACM-MIB.
+%% Each row is one of 3 tuples; one for each table in the MIB:
+%% {vacmSecurityToGroup, SecModel, SecName, GroupName}.
+%% {vacmAccess, GroupName, Prefix, SecModel, SecLevel, Match, RV, WV, NV}.
+%% {vacmViewTreeFamily, ViewIndex, ViewSubtree, ViewStatus, ViewMask}.
+%% For example
+%% {vacmSecurityToGroup, v2c, "initial", "initial"}.
+%% {vacmSecurityToGroup, usm, "initial", "initial"}.
+%% read/notify access to system
+%% {vacmAccess, "initial", "", any, noAuthNoPriv, exact,
+%% "system", "", "system"}.
+%% {vacmViewTreeFamily, "system", [1,3,6,1,2,1,1], included, null}.
+%% {vacmViewTreeFamily, "exmib", [1,3,6,1,3], included, null}. % for EX1-MIB
+%% {vacmViewTreeFamily, "internet", [1,3,6,1], included, null}.
+%%
+
+
+{vacmSecurityToGroup, v2c, "initial", "initial"}.
+{vacmSecurityToGroup, v2c, "all-rights", "all-rights"}.
+{vacmAccess, "initial", "", any, noAuthNoPriv, exact, "restricted", "", "restricted"}.
+{vacmAccess, "initial", "", usm, authNoPriv, exact, "internet", "internet", "internet"}.
+{vacmAccess, "initial", "", usm, authPriv, exact, "internet", "internet", "internet"}.
+{vacmAccess, "all-rights", "", any, noAuthNoPriv, exact, "internet", "internet", "internet"}.
+{vacmViewTreeFamily, "restricted", [1,3,6,1], included, null}.
+{vacmViewTreeFamily, "internet", [1,3,6,1], included, null}.
diff --git a/lib/snmp/test/test_config/manager/manager.conf.src b/lib/snmp/test/test_config/manager/manager.conf.src
new file mode 100644
index 0000000000..c38a61b13c
--- /dev/null
+++ b/lib/snmp/test/test_config/manager/manager.conf.src
@@ -0,0 +1,16 @@
+%% This file was generated by snmp_config (version-4.9.3) 2007-06-29 13:35:05
+%% This file defines the Manager local configuration info
+%% Each row is a 2-tuple:
+%% {Variable, Value}.
+%% For example
+%% {port, 5000}.
+%% {address, [127,42,17,5]}.
+%% {engine_id, "managerEngine"}.
+%% {max_message_size, 484}.
+%%
+
+
+{port, 5000}.
+{address, %ADDR%}.
+{engine_id, %ENGINE_ID%}.
+{max_message_size, 484}.
diff --git a/lib/snmp/test/test_config/manager/usm.conf.src b/lib/snmp/test/test_config/manager/usm.conf.src
new file mode 100644
index 0000000000..a558c86710
--- /dev/null
+++ b/lib/snmp/test/test_config/manager/usm.conf.src
@@ -0,0 +1,9 @@
+%% This file was generated by snmp_config (version-4.9.3) 2007-06-29 13:35:05
+%% This file defines the usm users the manager handles
+%% Each row is a 6 or 7-tuple:
+%% {EngineID, UserName, AuthP, AuthKey, PrivP, PrivKey}
+%% {EngineID, UserName, SecName, AuthP, AuthKey, PrivP, PrivKey}
+%%
+
+{%USM_ENGINE_ID%, "initial", usmNoAuthProtocol, "", usmNoPrivProtocol, ""}.
+
diff --git a/lib/snmp/test/test_config/modules.mk b/lib/snmp/test/test_config/modules.mk
new file mode 100644
index 0000000000..3d084cef01
--- /dev/null
+++ b/lib/snmp/test/test_config/modules.mk
@@ -0,0 +1,41 @@
+#-*-makefile-*- ; force emacs to enter makefile-mode
+
+# %CopyrightBegin%
+#
+# Copyright Ericsson AB 2004-2010. 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%
+
+SYS_CONFIG_FILES = \
+ sys.config \
+ sys-agent.config \
+ sys-manager.config
+
+AGENT_CONFIG_FILES = \
+ agent/agent.conf \
+ agent/community.conf \
+ agent/context.conf \
+ agent/notify.conf \
+ agent/standard.conf \
+ agent/target_addr.conf \
+ agent/target_params.conf \
+ agent/usm.conf \
+ agent/vacm.conf
+
+MANAGER_CONFIG_FILES = \
+ manager/manager.conf \
+ manager/usm.conf
+
+MODULES = \
+ snmp_test_config
diff --git a/lib/snmp/test/test_config/snmp_test_config.erl b/lib/snmp/test/test_config/snmp_test_config.erl
new file mode 100644
index 0000000000..550a276c4c
--- /dev/null
+++ b/lib/snmp/test/test_config/snmp_test_config.erl
@@ -0,0 +1,32 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2002-2010. 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(snmp_test_config).
+
+-export([ip_address/0, ip_address2/0]).
+
+ip_address() ->
+ {ok, Hostname} = inet:gethostname(),
+ {ok, Address} = inet:getaddr(Hostname, inet),
+ io:format("~w", [tuple_to_list(Address)]).
+
+ip_address2() ->
+ {ok, Hostname} = inet:gethostname(),
+ {ok, {A1, A2, A3, A4}} = inet:getaddr(Hostname, inet),
+ io:format("~w.~w.~w.~w", [A1, A2, A3, A4]).
diff --git a/lib/snmp/test/test_config/sys-agent.config.src b/lib/snmp/test/test_config/sys-agent.config.src
new file mode 100644
index 0000000000..46a458203d
--- /dev/null
+++ b/lib/snmp/test/test_config/sys-agent.config.src
@@ -0,0 +1,43 @@
+%% This is an example sys config file for starting the snmp application
+%% with only a agent running.
+[{snmp,
+ [
+ {agent,
+ [
+ {priority, normal},
+ {versions, [v1,v2,v3]},
+ {db_dir, "%DIR%/agent/db"},
+ {mib_storage, ets},
+%% {agent_mib_storage, volatile},
+ {agent_mib_storage, persistent},
+ {target_cache, [{verbosity,silence}]},
+ {symbolic_store, [{verbosity,silence}]},
+ {local_db, [{repair,true},{auto_save,5000},{verbosity,silence}]},
+ {error_report_module, snmpa_error_logger},
+ {agent_type, master},
+ {agent_verbosity, trace},
+ {audit_trail_log, [{type, read},
+ {dir, "%DIR%/agent/log"},
+ {size, {10240,10}}]},
+ {config, [{dir, "%DIR%/agent/conf"},
+ {force_load, true},
+ {verbosity, trace}]},
+ {multi_threaded, true},
+ {mib_server, [{mibentry_override, false},
+ {trapentry_override, false},
+ {cache, true},
+ {verbosity, trace}]},
+ {note_store, [{timeout,30000}, {verbosity,silence}]},
+ {supervisor, [{verbosity,silence}]},
+ {net_if, [{module, snmpa_net_if},
+ {verbosity, silence},
+ {options, [{bind_to, true},
+ {no_reuse, false},
+ {req_limit, infinity},
+ {sndbuf, 32000},
+ {recbuf, 32000}]}]}
+ ]
+ }
+ ]
+ }
+].
diff --git a/lib/snmp/test/test_config/sys-manager.config.src b/lib/snmp/test/test_config/sys-manager.config.src
new file mode 100644
index 0000000000..4366263084
--- /dev/null
+++ b/lib/snmp/test/test_config/sys-manager.config.src
@@ -0,0 +1,35 @@
+%% This is an example sys config file for starting the snmp application
+%% with only a manager running.
+[{snmp,
+ [
+ {manager,
+ [
+ {priority, normal},
+ {versions, [v1,v2,v3]},
+ {config, [{dir, "%DIR%/manager/conf"},
+ {verbosity, trace},
+ {db_dir, "%DIR%/manager/db"},
+ {repair, true},
+ {auto_save, 5000}]},
+ {inform_request_behaviour, user},
+ {mibs, []},
+ {server, [{timeout, 30000},
+ {verbosity, trace}]},
+ {note_store, [{timeout,30000},
+ {verbosity,silence}]},
+ {audit_trail_log, [{type, read},
+ {dir, "%DIR%/manager/log"},
+ {size, {10240,10}}]},
+ {net_if, [{module,snmpm_net_if},
+ {verbosity, trace},
+ {options, [{bind_to, true},
+ {no_reuse, false},
+% {sndbuf, 32000},
+ {recbuf, 45000}]}]},
+ {def_user_mod, snmpm_user_default},
+ {def_user_data, undefined}
+ ]
+ }
+ ]
+ }
+].
diff --git a/lib/snmp/test/test_config/sys.config.src b/lib/snmp/test/test_config/sys.config.src
new file mode 100644
index 0000000000..b2cd399883
--- /dev/null
+++ b/lib/snmp/test/test_config/sys.config.src
@@ -0,0 +1,68 @@
+%% This is an example sys config file for starting the snmp application
+%% with both an agent and a manager running.
+[{snmp,
+ [
+ {agent,
+ [
+ {priority, normal},
+ {versions, [v1,v2,v3]},
+ {db_dir, "%DIR%/agent/db"},
+ {mib_storage, ets},
+ {agent_mib_storage, volatile},
+ {target_cache, [{verbosity,silence}]},
+ {symbolic_store, [{verbosity,silence}]},
+ {local_db, [{repair,true},{auto_save,5000},{verbosity,silence}]},
+ {error_report_module, snmpa_error_logger},
+ {agent_type, master},
+ {agent_verbosity, silence},
+ {audit_trail_log, [{type, read},
+ {dir, "%DIR%/agent/log"},
+ {size, {10240,10}}]},
+ {config, [{dir, "%DIR%/agent/conf"},
+ {force_load, true},
+ {verbosity, silence}]},
+ {multi_threaded, false},
+ {mib_server, [{mibentry_override, false},
+ {trapentry_override, false},
+ {verbosity, silence}]},
+ {note_store, [{timeout,30000},{verbosity,silence}]},
+ {net_if, [{module, snmpa_net_if},
+ {verbosity, silence},
+ {options, [{bind_to, true},
+ {no_reuse, false},
+ {req_limit, infinity},
+ {sndbuf, 32000},
+ {recbuf, 32000}]}]}
+ ]
+ },
+ {manager,
+ [
+ {priority, normal},
+ {versions, [v1,v2,v3]},
+ {config, [{dir, "%DIR%/manager/conf"},
+ {verbosity, silence},
+ {db_dir, "%DIR%/manager/db"},
+ {repair, true},
+ {auto_save, 5000}]},
+ {inform_request_behaviour, auto},
+ {mibs, []},
+ {server, [{timeout, 30000},
+ {verbosity, silence}]},
+ {note_store, [{timeout, 30000},
+ {verbosity, silence}]},
+ {audit_trail_log, [{type, read},
+ {dir, "%DIR%/manager/log"},
+ {size, {10240,10}}]},
+ {net_if, [{module,snmpm_net_if},
+ {verbosity, silence},
+ {options, [{bind_to, true},
+ {no_reuse, false},
+ {recbuf, 33000},
+ {sndbuf, 34000}]}]},
+ {def_user_mod, snmpm_user_default},
+ {def_user_data, undefined}
+ ]
+ }
+ ]
+ }
+].
diff --git a/lib/snmp/vsn.mk b/lib/snmp/vsn.mk
index 1229b12ae2..e70c97dcb8 100644
--- a/lib/snmp/vsn.mk
+++ b/lib/snmp/vsn.mk
@@ -1,3 +1,22 @@
-SNMP_VSN = 4.18
+#-*-makefile-*- ; force emacs to enter makefile-mode
+
+# %CopyrightBegin%
+#
+# Copyright Ericsson AB 1997-2011. 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%
+
+SNMP_VSN = 4.19
PRE_VSN =
APP_VSN = "snmp-$(SNMP_VSN)$(PRE_VSN)"
diff --git a/lib/ssh/doc/src/notes.xml b/lib/ssh/doc/src/notes.xml
index 9bedd446f4..4f546a37ed 100644
--- a/lib/ssh/doc/src/notes.xml
+++ b/lib/ssh/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2004</year><year>2010</year>
+ <year>2004</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -29,6 +29,72 @@
<file>notes.xml</file>
</header>
+<section><title>Ssh 2.0.6</title>
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ A memory leak has been fixed. I.e. per terminated connection the size of
+ a pid and the length of a user name string was not cleared.</p>
+ <p>
+ Own Id: OTP-9232</p>
+ </item>
+ </list>
+ </section>
+</section>
+
+<section><title>Ssh 2.0.5</title>
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Strengthened random number generation. (Thanks to Geoff Cant)</p>
+ <p>
+ Own Id: OTP-9225</p>
+ </item>
+ </list>
+ </section>
+</section>
+
+<section><title>Ssh 2.0.4</title>
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>In some cases SSH returned {error, normal} when a channel was terminated
+ unexpectedly. This has now been changed to {error, channel_closed}.</p>
+ <p>
+ *** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>
+ Own Id: OTP-8987 Aux Id: seq11748</p>
+ </item>
+ <item>
+ <p>
+ SSH did not handle the error reason enetunreach
+ when trying to open a IPv6 connection.</p>
+ <p>
+ Own Id: OTP-9031</p>
+ </item>
+ </list>
+ </section>
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ It is now possible to use SSH to sign and verify binary data.</p>
+ <p>
+ Own Id: OTP-8986</p>
+ </item>
+ <item>
+ <p>
+ SSH now ensures that the .ssh directory exists before trying
+ to access files located in that directory.</p>
+ <p>
+ Own Id: OTP-9010</p>
+ </item>
+ </list>
+ </section>
+</section>
+
<section><title>Ssh 2.0.3</title>
<section><title>Fixed Bugs and Malfunctions</title>
<list>
diff --git a/lib/ssh/doc/src/ssh.xml b/lib/ssh/doc/src/ssh.xml
index 71e6b2cd3d..2c5096a25f 100644
--- a/lib/ssh/doc/src/ssh.xml
+++ b/lib/ssh/doc/src/ssh.xml
@@ -283,6 +283,22 @@
</func>
<func>
+ <name>sign_data(Data, Algorithm) -> Signature | {error, Reason}</name>
+ <fsummary> </fsummary>
+ <type>
+ <v> Data = binary()</v>
+ <v> Algorithm = "ssh-rsa"</v>
+ <v> Signature = binary()</v>
+ <v> Reason = term()</v>
+ </type>
+ <desc>
+ <p>Signs the supplied binary using the SSH key.
+ </p>
+ </desc>
+ </func>
+
+
+ <func>
<name>start() -> </name>
<name>start(Type) -> ok | {error, Reason}</name>
<fsummary>Starts the Ssh application. </fsummary>
@@ -339,6 +355,22 @@
by the listener up and running.</p>
</desc>
</func>
+
+ <func>
+ <name>verify_data(Data, Signature, Algorithm) -> ok | {error, Reason}</name>
+ <fsummary> </fsummary>
+ <type>
+ <v> Data = binary()</v>
+ <v> Algorithm = "ssh-rsa"</v>
+ <v> Signature = binary()</v>
+ <v> Reason = term()</v>
+ </type>
+ <desc>
+ <p>Verifies the supplied binary against the binary signature.
+ </p>
+ </desc>
+ </func>
+
</funcs>
</erlref>
diff --git a/lib/ssh/doc/src/ssh_connection.xml b/lib/ssh/doc/src/ssh_connection.xml
index 499cbbeabe..9942306b93 100644
--- a/lib/ssh/doc/src/ssh_connection.xml
+++ b/lib/ssh/doc/src/ssh_connection.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2008</year>
- <year>2008</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/ssh/src/ssh.appup.src b/lib/ssh/src/ssh.appup.src
index 9c806bcd03..37f24e2463 100644
--- a/lib/ssh/src/ssh.appup.src
+++ b/lib/ssh/src/ssh.appup.src
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -19,12 +19,12 @@
{"%VSN%",
[
- {"2.0.2", [{load_module, ssh_file, soft_purge, soft_purge, []}]},
- {"2.0.1", [{restart_application, ssh}]}
+ {"2.0.5", [{load_module, ssh_userreg, soft_purge, soft_purge, []},
+ {load_module, ssh_connection_handler, soft_purge, soft_purge, [ssh_userreg]}]}
],
[
- {"2.0.2", [{load_module, ssh_file, soft_purge, soft_purge, []}]},
- {"2.0.1", [{restart_application, ssh}]}
+ {"2.0.5", [{load_module, ssh_userreg, soft_purge, soft_purge, []},
+ {load_module, ssh_connection_handler, soft_purge, soft_purge, [ssh_userreg]}]}
]
}.
diff --git a/lib/ssh/src/ssh.erl b/lib/ssh/src/ssh.erl
index 994c77436a..cada109df0 100644
--- a/lib/ssh/src/ssh.erl
+++ b/lib/ssh/src/ssh.erl
@@ -30,6 +30,8 @@
stop_listener/1, stop_listener/2, stop_daemon/1, stop_daemon/2,
shell/1, shell/2, shell/3]).
+-export([sign_data/2, verify_data/3]).
+
%%--------------------------------------------------------------------
%% Function: start([, Type]) -> ok
%%
@@ -94,11 +96,17 @@ connect(Host, Port, Options, Timeout) ->
do_demonitor(MRef, Manager),
{error, Other};
{'DOWN', MRef, _, Manager, Reason} when is_pid(Manager) ->
+ error_logger:warning_report([{ssh, connect},
+ {diagnose,
+ "Connection was closed before properly set up."},
+ {host, Host},
+ {port, Port},
+ {reason, Reason}]),
receive %% Clear EXIT message from queue
{'EXIT', Manager, _What} ->
- {error, Reason}
+ {error, channel_closed}
after 0 ->
- {error, Reason}
+ {error, channel_closed}
end
after Timeout ->
do_demonitor(MRef, Manager),
@@ -239,6 +247,43 @@ shell(Host, Port, Options) ->
Error
end.
+
+%%--------------------------------------------------------------------
+%% Function: sign_data(Data, Algorithm) -> binary() |
+%% {error, Reason}
+%%
+%% Data = binary()
+%% Algorithm = "ssh-rsa"
+%%
+%% Description: Use SSH key to sign data.
+%%--------------------------------------------------------------------
+sign_data(Data, Algorithm) when is_binary(Data) ->
+ case ssh_file:private_identity_key(Algorithm,[]) of
+ {ok, Key} when Algorithm == "ssh-rsa" ->
+ ssh_rsa:sign(Key, Data);
+ Error ->
+ Error
+ end.
+
+%%--------------------------------------------------------------------
+%% Function: verify_data(Data, Signature, Algorithm) -> ok |
+%% {error, Reason}
+%%
+%% Data = binary()
+%% Signature = binary()
+%% Algorithm = "ssh-rsa"
+%%
+%% Description: Use SSH signature to verify data.
+%%--------------------------------------------------------------------
+verify_data(Data, Signature, Algorithm) when is_binary(Data), is_binary(Signature) ->
+ case ssh_file:public_identity_key(Algorithm, []) of
+ {ok, Key} when Algorithm == "ssh-rsa" ->
+ ssh_rsa:verify(Key, Data, Signature);
+ Error ->
+ Error
+ end.
+
+
%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
diff --git a/lib/ssh/src/ssh_acceptor.erl b/lib/ssh/src/ssh_acceptor.erl
index 9060626ab3..59fbd24cf5 100644
--- a/lib/ssh/src/ssh_acceptor.erl
+++ b/lib/ssh/src/ssh_acceptor.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -55,6 +55,10 @@ acceptor_init(Parent, Port, Address, SockOpts, Opts, AcceptTimeout) ->
do_socket_listen(Callback, Port, Opts) ->
case Callback:listen(Port, Opts) of
+ {error, nxdomain} ->
+ Callback:listen(Port, lists:delete(inet6, Opts));
+ {error, enetunreach} ->
+ Callback:listen(Port, lists:delete(inet6, Opts));
{error, eafnosupport} ->
Callback:listen(Port, lists:delete(inet6, Opts));
Other ->
diff --git a/lib/ssh/src/ssh_bits.erl b/lib/ssh/src/ssh_bits.erl
index 399581a0fd..3f0a06575c 100755
--- a/lib/ssh/src/ssh_bits.erl
+++ b/lib/ssh/src/ssh_bits.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -34,7 +34,7 @@
%% integer utils
-export([isize/1]).
-export([irandom/1, irandom/3]).
--export([random/1, random/3]).
+-export([random/1]).
-export([xor_bits/2, fill_bits/2]).
-export([i2bin/2, bin2i/1]).
@@ -401,9 +401,6 @@ xor_bits(XBits, YBits) ->
irandom(Bits) ->
irandom(Bits, 1, 0).
-%% irandom_odd(Bits) ->
-%% irandom(Bits, 1, 1).
-
%%
%% irandom(N, Top, Bottom)
%%
@@ -414,57 +411,16 @@ irandom(Bits) ->
%% Bot = 0 - do not set the least signifcant bit
%% Bot = 1 - set the least signifcant bit (i.e always odd)
%%
-irandom(0, _Top, _Bottom) ->
- 0;
-irandom(Bits, Top, Bottom) ->
- Bytes = (Bits+7) div 8,
- Skip = (8-(Bits rem 8)) rem 8,
- TMask = case Top of
- 0 -> 0;
- 1 -> 16#80;
- 2 -> 16#c0
- end,
- BMask = case Bottom of
- 0 -> 0;
- 1 -> (1 bsl Skip)
- end,
- <<X:Bits/big-unsigned-integer, _:Skip>> = random(Bytes, TMask, BMask),
- X.
+irandom(Bits, Top, Bottom) when is_integer(Top),
+ 0 =< Top, Top =< 2 ->
+ crypto:erlint(crypto:strong_rand_mpint(Bits, Top - 1, Bottom)).
%%
%% random/1
%% Generate N random bytes
%%
random(N) ->
- random(N, 0, 0).
-
-random(N, TMask, BMask) ->
- list_to_binary(rnd(N, TMask, BMask)).
-
-%% random/3
-%% random(Bytes, TopMask, BotMask)
-%% where
-%% Bytes is the number of bytes to generate
-%% TopMask is bitwised or'ed to the first byte
-%% BotMask is bitwised or'ed to the last byte
-%%
-rnd(0, _TMask, _BMask) ->
- [];
-rnd(1, TMask, BMask) ->
- [(rand8() bor TMask) bor BMask];
-rnd(N, TMask, BMask) ->
- [(rand8() bor TMask) | rnd_n(N-1, BMask)].
-
-rnd_n(1, BMask) ->
- [rand8() bor BMask];
-rnd_n(I, BMask) ->
- [rand8() | rnd_n(I-1, BMask)].
-
-rand8() ->
- (rand32() bsr 8) band 16#ff.
-
-rand32() ->
- random:uniform(16#100000000) -1.
+ crypto:strong_rand_bytes(N).
%%
%% Base 64 encode/decode
diff --git a/lib/ssh/src/ssh_cli.erl b/lib/ssh/src/ssh_cli.erl
index cb78acb84c..781e01b9d1 100644
--- a/lib/ssh/src/ssh_cli.erl
+++ b/lib/ssh/src/ssh_cli.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
diff --git a/lib/ssh/src/ssh_connection_handler.erl b/lib/ssh/src/ssh_connection_handler.erl
index 0ba11b0a26..3193be2510 100644
--- a/lib/ssh/src/ssh_connection_handler.erl
+++ b/lib/ssh/src/ssh_connection_handler.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -106,8 +106,6 @@ peer_address(ConnectionHandler) ->
%% initialize.
%%--------------------------------------------------------------------
init([Role, Manager, Socket, SshOpts]) ->
- {A,B,C} = erlang:now(),
- random:seed(A, B, C),
{NumVsn, StrVsn} = ssh_transport:versions(Role, SshOpts),
ssh_bits:install_messages(ssh_transport:transport_messages(NumVsn)),
{Protocol, Callback, CloseTag} =
@@ -580,7 +578,9 @@ handle_info({CloseTag, _Socket}, _StateName,
%% Reason. The return value is ignored.
%%--------------------------------------------------------------------
terminate(normal, _, #state{transport_cb = Transport,
- socket = Socket}) ->
+ socket = Socket,
+ manager = Pid}) ->
+ (catch ssh_userreg:delete_user(Pid)),
(catch Transport:close(Socket)),
ok;
@@ -812,7 +812,7 @@ handle_disconnect(#ssh_msg_disconnect{} = Msg,
#state{ssh_params = Ssh0, manager = Pid} = State) ->
{SshPacket, Ssh} = ssh_transport:ssh_packet(Msg, Ssh0),
try
- send_msg(SshPacket, State),
+ send_msg(SshPacket, State),
ssh_connection_manager:event(Pid, Msg)
catch
exit:{noproc, _Reason} ->
@@ -824,6 +824,7 @@ handle_disconnect(#ssh_msg_disconnect{} = Msg,
[Msg, Exit]),
error_logger:info_report(Report)
end,
+ (catch ssh_userreg:delete_user(Pid)),
{stop, normal, State#state{ssh_params = Ssh}}.
counterpart_versions(NumVsn, StrVsn, #ssh{role = server} = Ssh) ->
diff --git a/lib/ssh/src/ssh_connection_manager.erl b/lib/ssh/src/ssh_connection_manager.erl
index 6bf89224cf..9bfd5270da 100644
--- a/lib/ssh/src/ssh_connection_manager.erl
+++ b/lib/ssh/src/ssh_connection_manager.erl
@@ -147,7 +147,7 @@ close(ConnectionManager, ChannelId) ->
try call(ConnectionManager, {close, ChannelId}) of
ok ->
ok;
- {error,normal} ->
+ {error, channel_closed} ->
ok
catch
exit:{noproc, _} ->
@@ -158,7 +158,7 @@ stop(ConnectionManager) ->
try call(ConnectionManager, stop) of
ok ->
ok;
- {error,normal} ->
+ {error, channel_closed} ->
ok
catch
exit:{noproc, _} ->
@@ -604,7 +604,7 @@ call(Pid, Msg, Timeout) ->
exit:{timeout, _} ->
{error, timeout};
exit:{normal, _} ->
- {error, normal}
+ {error, channel_closed}
end.
cast(Pid, Msg) ->
diff --git a/lib/ssh/src/ssh_file.erl b/lib/ssh/src/ssh_file.erl
index 13722656db..12180f56bb 100755
--- a/lib/ssh/src/ssh_file.erl
+++ b/lib/ssh/src/ssh_file.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -27,14 +27,16 @@
-include("PKCS-1.hrl").
-include("DSS.hrl").
+-include_lib("kernel/include/file.hrl").
+
-export([public_host_dsa_key/2,private_host_dsa_key/2,
public_host_rsa_key/2,private_host_rsa_key/2,
public_host_key/2,private_host_key/2,
lookup_host_key/3, add_host_key/3, % del_host_key/2,
lookup_user_key/3, ssh_dir/2, file_name/3]).
--export([private_identity_key/2]).
-%% , public_identity_key/2,
+-export([private_identity_key/2,
+ public_identity_key/2]).
%% identity_keys/2]).
-export([encode_public_key/1, decode_public_key_v2/2]).
@@ -43,6 +45,9 @@
-define(DBG_PATHS, true).
+-define(PERM_700, 8#700).
+-define(PERM_644, 8#644).
+
%% API
public_host_dsa_key(Type, Opts) ->
File = file_name(Type, "ssh_host_dsa_key.pub", Opts),
@@ -113,8 +118,10 @@ do_lookup_host_key(Host, Alg, Opts) ->
add_host_key(Host, Key, Opts) ->
Host1 = add_ip(replace_localhost(Host)),
- case file:open(file_name(user, "known_hosts", Opts),[write,append]) of
+ KnownHosts = file_name(user, "known_hosts", Opts),
+ case file:open(KnownHosts, [write,append]) of
{ok, Fd} ->
+ ok = file:change_mode(KnownHosts, ?PERM_644),
Res = add_key_fd(Fd, Host1, Key),
file:close(Fd),
Res;
@@ -140,6 +147,11 @@ private_identity_key(Alg, Opts) ->
Path = file_name(user, identity_key_filename(Alg), Opts),
read_private_key_v2(Path, Alg).
+public_identity_key(Alg, Opts) ->
+ Path = file_name(user, identity_key_filename(Alg) ++ ".pub", Opts),
+ read_public_key_v2(Path, Alg).
+
+
read_public_key_v2(File, Type) ->
case file:read_file(File) of
{ok,Bin} ->
@@ -532,4 +544,7 @@ file_name(Type, Name, Opts) ->
default_user_dir()->
{ok,[[Home|_]]} = init:get_argument(home),
- filename:join(Home, ".ssh").
+ UserDir = filename:join(Home, ".ssh"),
+ ok = filelib:ensure_dir(filename:join(UserDir, "dummy")),
+ ok = file:change_mode(UserDir, ?PERM_700),
+ UserDir.
diff --git a/lib/ssh/src/ssh_rsa.erl b/lib/ssh/src/ssh_rsa.erl
index e27cdcf7bd..91b8285b2e 100755
--- a/lib/ssh/src/ssh_rsa.erl
+++ b/lib/ssh/src/ssh_rsa.erl
@@ -202,8 +202,7 @@ rsassa_pkcs1_v1_5_verify(Public=#ssh_key { public={N,_E}}, Mb, Sb) ->
case emsa_pkcs1_v1_5_encode(Mb, K) of
EM -> ok;
_S ->
- io:format("S: ~p~n", [_S]),
- {error, invalid_signature} % exit(invalid_signature)
+ {error, invalid_signature}
end.
diff --git a/lib/ssh/src/ssh_transport.erl b/lib/ssh/src/ssh_transport.erl
index e79ccdda0c..de3e29e2f1 100644
--- a/lib/ssh/src/ssh_transport.erl
+++ b/lib/ssh/src/ssh_transport.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -169,6 +169,8 @@ do_connect(Callback, Address, Port, SocketOpts, Timeout) ->
Callback:connect(Address, Port, lists:delete(inet6, Opts), Timeout);
{error, eafnosupport} ->
Callback:connect(Address, Port, lists:delete(inet6, Opts), Timeout);
+ {error, enetunreach} ->
+ Callback:connect(Address, Port, lists:delete(inet6, Opts), Timeout);
Other ->
Other
end.
diff --git a/lib/ssh/src/ssh_userreg.erl b/lib/ssh/src/ssh_userreg.erl
index 33c801f490..f901461aea 100644
--- a/lib/ssh/src/ssh_userreg.erl
+++ b/lib/ssh/src/ssh_userreg.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -25,11 +25,18 @@
-behaviour(gen_server).
%% API
--export([start_link/0, register_user/2, lookup_user/1]).
+-export([start_link/0,
+ register_user/2,
+ lookup_user/1,
+ delete_user/1]).
%% gen_server callbacks
--export([init/1, handle_call/3, handle_cast/2, handle_info/2,
- terminate/2, code_change/3]).
+-export([init/1,
+ handle_call/3,
+ handle_cast/2,
+ handle_info/2,
+ terminate/2,
+ code_change/3]).
-record(state, {user_db = []}).
@@ -46,6 +53,9 @@ start_link() ->
register_user(User, Cm) ->
gen_server:cast(?MODULE, {register, {User, Cm}}).
+delete_user(Cm) ->
+ gen_server:cast(?MODULE, {delete, Cm}).
+
lookup_user(Cm) ->
gen_server:call(?MODULE, {get_user, Cm}, infinity).
@@ -82,9 +92,10 @@ handle_call({get_user, Cm}, _From, #state{user_db = Db} = State) ->
%% {stop, Reason, State}
%% Description: Handling cast messages
%%--------------------------------------------------------------------
-handle_cast({register, UserCm}, State0) ->
- State = insert(UserCm, State0),
- {noreply, State}.
+handle_cast({register, UserCm}, State) ->
+ {noreply, insert(UserCm, State)};
+handle_cast({delete, UserCm}, State) ->
+ {noreply, delete(UserCm, State)}.
%%--------------------------------------------------------------------
%% Function: handle_info(Info, State) -> {noreply, State} |
@@ -118,6 +129,9 @@ code_change(_OldVsn, State, _Extra) ->
insert({User, Cm}, #state{user_db = Db} = State) ->
State#state{user_db = [{User, Cm} | Db]}.
+delete(Cm, #state{user_db = Db} = State) ->
+ State#state{user_db = lists:keydelete(Cm, 2, Db)}.
+
lookup(_, []) ->
undefined;
lookup(Cm, [{User, Cm} | _Rest]) ->
diff --git a/lib/ssh/vsn.mk b/lib/ssh/vsn.mk
index db03168ad9..d0861b3ddc 100644
--- a/lib/ssh/vsn.mk
+++ b/lib/ssh/vsn.mk
@@ -1,5 +1,5 @@
#-*-makefile-*- ; force emacs to enter makefile-mode
-SSH_VSN = 2.0.3
+SSH_VSN = 2.0.6
APP_VSN = "ssh-$(SSH_VSN)"
diff --git a/lib/ssl/doc/src/book.xml b/lib/ssl/doc/src/book.xml
index 85d6b56b26..ecfb915b44 100644
--- a/lib/ssl/doc/src/book.xml
+++ b/lib/ssl/doc/src/book.xml
@@ -4,7 +4,7 @@
<book xmlns:xi="http://www.w3.org/2001/XInclude">
<header titlestyle="normal">
<copyright>
- <year>1999</year><year>2009</year>
+ <year>1999</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
diff --git a/lib/ssl/doc/src/notes.xml b/lib/ssl/doc/src/notes.xml
index 313f1e59c9..52ee9c086a 100644
--- a/lib/ssl/doc/src/notes.xml
+++ b/lib/ssl/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>1999</year><year>2010</year>
+ <year>1999</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -31,7 +31,80 @@
<p>This document describes the changes made to the SSL application.
</p>
- <section><title>SSL 4.1.1</title>
+ <section><title>SSL 4.1.4</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Reduced memory footprint of an ssl connection.</p>
+ <p>
+ Handshake hashes, premaster secret and "public_key_info"
+ does not need to be saved when the connection has been
+ established. The own certificate is no longer duplicated
+ in the state.</p>
+ <p>
+ Own Id: OTP-9021</p>
+ </item>
+ <item>
+ <p>
+ Add the option {hibernate_after, int()} to ssl:connect
+ and ssl:listen</p>
+ <p>
+ Own Id: OTP-9106</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>SSL 4.1.3</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Fixed error in cache-handling fix from ssl-4.1.2</p>
+ <p>
+ Own Id: OTP-9018 Aux Id: seq11739 </p>
+ </item>
+ <item>
+ <p>
+ Verification of a critical extended_key_usage-extension
+ corrected</p>
+ <p>
+ Own Id: OTP-9029 Aux Id: seq11541 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>SSL 4.1.2</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ The ssl application caches certificate files, it will now
+ invalidate cache entries if the diskfile is changed.</p>
+ <p>
+ Own Id: OTP-8965 Aux Id: seq11739 </p>
+ </item>
+ <item>
+ <p>
+ Now runs the terminate function before returning from the
+ call made by ssl:close/1, as before the caller of
+ ssl:close/1 could get problems with the reuseaddr option.</p>
+ <p>
+ Own Id: OTP-8992</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>SSL 4.1.1</title>
<section><title>Fixed Bugs and Malfunctions</title>
<list>
diff --git a/lib/ssl/doc/src/ssl.xml b/lib/ssl/doc/src/ssl.xml
index ec272379bb..0da6bbee5b 100644
--- a/lib/ssl/doc/src/ssl.xml
+++ b/lib/ssl/doc/src/ssl.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1999</year><year>2010</year>
+ <year>1999</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -53,13 +53,11 @@
<p>The following data types are used in the functions below:
</p>
- <p><c>boolean() = true | false</c></p>
-
- <p><c>property() = atom()</c></p>
-
+ <p><c>boolean() = true | false</c></p>
+
<p><c>option() = socketoption() | ssloption() | transportoption()</c></p>
- <p><c>socketoption() = [{property(), term()}] - defaults to
+ <p><c>socketoption() = proplists:property() - The default socket options are
[{mode,list},{packet, 0},{header, 0},{active, true}].
</c></p>
@@ -72,10 +70,10 @@
{verify_fun, {fun(), term()}} |
{fail_if_no_peer_cert, boolean()}
{depth, integer()} |
- {cert, der_bin()}| {certfile, path()} |
- {key, der_bin()} | {keyfile, path()} | {password, string()} |
- {cacerts, [der_bin()]} | {cacertfile, path()} |
- |{dh, der_bin()} | {dhfile, path()} | {ciphers, ciphers()} |
+ {cert, der_encoded()}| {certfile, path()} |
+ {key, der_encoded()} | {keyfile, path()} | {password, string()} |
+ {cacerts, [der_encoded()]} | {cacertfile, path()} |
+ |{dh, der_encoded()} | {dhfile, path()} | {ciphers, ciphers()} |
{ssl_imp, ssl_imp()} | {reuse_sessions, boolean()} | {reuse_session, fun()}
</c></p>
@@ -95,7 +93,7 @@
<p><c>path() = string() - representing a file path.</c></p>
- <p><c>der_bin() = binary() -Asn1 DER encoded entity as an erlang binary.</c></p>
+ <p><c>der_encoded() = binary() -Asn1 DER encoded entity as an erlang binary.</c></p>
<p><c>host() = hostname() | ipaddress()</c></p>
@@ -136,14 +134,14 @@
<taglist>
- <tag>{cert, der_bin()}</tag>
+ <tag>{cert, der_encoded()}</tag>
<item> The DER encoded users certificate. If this option
is supplied it will override the certfile option.</item>
<tag>{certfile, path()}</tag>
<item>Path to a file containing the user's certificate.</item>
- <tag>{key, der_bin()}</tag>
+ <tag>{key, der_encoded()}</tag>
<item> The DER encoded users private key. If this option
is supplied it will override the keyfile option.</item>
@@ -158,7 +156,7 @@
Only used if the private keyfile is password protected.
</item>
- <tag>{cacerts, [der_bin()]}</tag>
+ <tag>{cacerts, [der_encoded()]}</tag>
<item> The DER encoded trusted certificates. If this option
is supplied it will override the cacertfile option.</item>
@@ -266,9 +264,16 @@ fun(OtpCert :: #'OTPCertificate'{}, Event :: {bad_cert, Reason :: atom()} |
<p>Possible path validation errors: </p>
-<p> {bad_cert, cert_expired}, {bad_cert, invalid_issuer}, {bad_cert, invalid_signature}, {bad_cert, unknown_ca}, {bad_cert, name_not_permitted}, {bad_cert, missing_basic_constraint}, {bad_cert, invalid_key_usage}</p>
+<p> {bad_cert, cert_expired}, {bad_cert, invalid_issuer}, {bad_cert, invalid_signature}, {bad_cert, unknown_ca},{bad_cert, selfsigned_peer}, {bad_cert, name_not_permitted}, {bad_cert, missing_basic_constraint}, {bad_cert, invalid_key_usage}</p>
</item>
+ <tag>{hibernate_after, integer()|undefined}</tag>
+ <item>When an integer-value is specified, the <code>ssl_connection</code>
+ will go into hibernation after the specified number of milliseconds
+ of inactivity, thus reducing its memory footprint. When
+ <code>undefined</code> is specified (this is the default), the process
+ will never go into hibernation.
+ </item>
</taglist>
</section>
@@ -301,7 +306,7 @@ fun(OtpCert :: #'OTPCertificate'{}, Event :: {bad_cert, Reason :: atom()} |
<taglist>
- <tag>{dh, der_bin()}</tag>
+ <tag>{dh, der_encoded()}</tag>
<item>The DER encoded Diffie Hellman parameters. If this option
is supplied it will override the dhfile option.
</item>
@@ -481,7 +486,7 @@ fun(OtpCert :: #'OTPCertificate'{}, Event :: {bad_cert, Reason :: atom()} |
<fsummary>Get the value of the specified options.</fsummary>
<type>
<v>Socket = sslsocket()</v>
- <v>OptionNames = [property()]</v>
+ <v>OptionNames = [atom()]</v>
</type>
<desc>
<p>Get the value of the specified socket options, if no
@@ -576,7 +581,7 @@ fun(OtpCert :: #'OTPCertificate'{}, Event :: {bad_cert, Reason :: atom()} |
<fsummary>Write data to a socket.</fsummary>
<type>
<v>Socket = sslsocket()</v>
- <v>Data = iolist() | binary()</v>
+ <v>Data = iodata()</v>
</type>
<desc>
<p>Writes <c>Data</c> to <c>Socket</c>. </p>
diff --git a/lib/ssl/doc/src/using_ssl.xml b/lib/ssl/doc/src/using_ssl.xml
index 4bdd8f97b4..605290b6f9 100644
--- a/lib/ssl/doc/src/using_ssl.xml
+++ b/lib/ssl/doc/src/using_ssl.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2003</year><year>2009</year>
+ <year>2003</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
diff --git a/lib/ssl/examples/certs/Makefile b/lib/ssl/examples/certs/Makefile
index b811b461dc..a4f067ade6 100644
--- a/lib/ssl/examples/certs/Makefile
+++ b/lib/ssl/examples/certs/Makefile
@@ -57,5 +57,5 @@ release_spec: opt
$(INSTALL_DIR) $(RELSYSDIR)/examples/certs
tar cf - etc | \
(cd $(RELSYSDIR)/examples/certs; tar xf -)
- chmod -f -R ug+rw $(RELSYSDIR)/examples
+ chmod -R ug+rw $(RELSYSDIR)/examples
release_docs_spec:
diff --git a/lib/ssl/examples/src/Makefile b/lib/ssl/examples/src/Makefile
index 46c0507b3a..ae5881d49b 100644
--- a/lib/ssl/examples/src/Makefile
+++ b/lib/ssl/examples/src/Makefile
@@ -66,7 +66,7 @@ release_spec: opt
$(INSTALL_DIR) $(RELSYSDIR)/examples/src
$(INSTALL_DIR) $(RELSYSDIR)/examples/ebin
(cd ..; tar cf - src ebin | (cd $(RELSYSDIR)/examples; tar xf -))
- chmod -f -R ug+w $(RELSYSDIR)/examples
+ chmod -R ug+w $(RELSYSDIR)/examples
release_docs_spec:
diff --git a/lib/ssl/src/inet_ssl_dist.erl b/lib/ssl/src/inet_ssl_dist.erl
index f62aefd35a..6c0fbc0618 100644
--- a/lib/ssl/src/inet_ssl_dist.erl
+++ b/lib/ssl/src/inet_ssl_dist.erl
@@ -1,8 +1,8 @@
-%%<copyright>
-%% <year>2000-2008</year>
-%% <holder>Ericsson AB, All Rights Reserved</holder>
-%%</copyright>
-%%<legalnotice>
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2000-2011. 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
@@ -14,8 +14,9 @@
%% the License for the specific language governing rights and limitations
%% under the License.
%%
-%% The Initial Developer of the Original Code is Ericsson AB.
-%%</legalnotice>
+%% %CopyrightEnd%
+%%
+
%%
-module(inet_ssl_dist).
@@ -135,6 +136,9 @@ accept_connection(AcceptPid, Socket, MyNode, Allowed, SetupTime) ->
[self(), AcceptPid, Socket, MyNode,
Allowed, SetupTime]).
+%% Suppress dialyzer warning, we do not really care about old ssl code
+%% as we intend to remove it.
+-spec(do_accept(_,_,_,_,_,_) -> no_return()).
do_accept(Kernel, AcceptPid, Socket, MyNode, Allowed, SetupTime) ->
process_flag(priority, max),
receive
@@ -167,8 +171,8 @@ do_accept(Kernel, AcceptPid, Socket, MyNode, Allowed, SetupTime) ->
ssl_prim:getll(S)
end,
f_address = fun get_remote_id/2,
- mf_tick = {?MODULE, tick},
- mf_getstat = {?MODULE,getstat}
+ mf_tick = fun ?MODULE:tick/1,
+ mf_getstat = fun ?MODULE:getstat/1
},
dist_util:handshake_other_started(HSData);
{false,IP} ->
@@ -204,6 +208,9 @@ setup(Node, Type, MyNode, LongOrShortNames,SetupTime) ->
LongOrShortNames,
SetupTime]).
+%% Suppress dialyzer warning, we do not really care about old ssl code
+%% as we intend to remove it.
+-spec(do_setup(_,_,_,_,_,_) -> no_return()).
do_setup(Kernel, Node, Type, MyNode, LongOrShortNames,SetupTime) ->
process_flag(priority, max),
?trace("~p~n",[{inet_ssl_dist,self(),setup,Node}]),
@@ -258,8 +265,8 @@ do_setup(Kernel, Node, Type, MyNode, LongOrShortNames,SetupTime) ->
protocol = ssl,
family = inet}
end,
- mf_tick = {?MODULE, tick},
- mf_getstat = {?MODULE,getstat},
+ mf_tick = fun ?MODULE:tick/1,
+ mf_getstat = fun ?MODULE:getstat/1,
request_type = Type
},
dist_util:handshake_we_started(HSData);
diff --git a/lib/ssl/src/ssl.appup.src b/lib/ssl/src/ssl.appup.src
index 51c5289bd2..a0ecb4ac6f 100644
--- a/lib/ssl/src/ssl.appup.src
+++ b/lib/ssl/src/ssl.appup.src
@@ -1,10 +1,18 @@
%% -*- erlang -*-
{"%VSN%",
[
+ {"4.1.4", [{restart_application, ssl}]},
+ {"4.1.3", [{restart_application, ssl}]},
+ {"4.1.2", [{restart_application, ssl}]},
+ {"4.1.1", [{restart_application, ssl}]},
{"4.1", [{restart_application, ssl}]},
{"4.0.1", [{restart_application, ssl}]}
],
[
+ {"4.1.4", [{restart_application, ssl}]},
+ {"4.1.3", [{restart_application, ssl}]},
+ {"4.1.2", [{restart_application, ssl}]},
+ {"4.1.1", [{restart_application, ssl}]},
{"4.1", [{restart_application, ssl}]},
{"4.0.1", [{restart_application, ssl}]}
]}.
diff --git a/lib/ssl/src/ssl.erl b/lib/ssl/src/ssl.erl
index 7e5929d708..380c59b058 100644
--- a/lib/ssl/src/ssl.erl
+++ b/lib/ssl/src/ssl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -49,10 +49,29 @@
inet_ssl, %% inet options for internal ssl socket
cb %% Callback info
}).
+-type option() :: socketoption() | ssloption() | transportoption().
+-type socketoption() :: term(). %% See gen_tcp and inet, import spec later when there is one to import
+-type ssloption() :: {verify, verify_type()} |
+ {verify_fun, {fun(), InitialUserState::term()}} |
+ {fail_if_no_peer_cert, boolean()} | {depth, integer()} |
+ {cert, Der::binary()} | {certfile, path()} | {key, Der::binary()} |
+ {keyfile, path()} | {password, string()} | {cacerts, [Der::binary()]} |
+ {cacertfile, path()} | {dh, Der::binary()} | {dhfile, path()} |
+ {ciphers, ciphers()} | {ssl_imp, ssl_imp()} | {reuse_sessions, boolean()} |
+ {reuse_session, fun()} | {hibernate_after, integer()|undefined}.
+
+-type verify_type() :: verify_none | verify_peer.
+-type path() :: string().
+-type ciphers() :: [erl_cipher_suite()] |
+ string(). % (according to old API)
+-type ssl_imp() :: new | old.
+
+-type transportoption() :: {CallbackModule::atom(), DataTag::atom(), ClosedTag::atom()}.
+
%%--------------------------------------------------------------------
--spec start() -> ok.
--spec start(permanent | transient | temporary) -> ok.
+-spec start() -> ok | {error, reason()}.
+-spec start(permanent | transient | temporary) -> ok | {error, reason()}.
%%
%% Description: Utility function that starts the ssl,
%% crypto and public_key applications. Default type
@@ -77,9 +96,12 @@ stop() ->
application:stop(ssl).
%%--------------------------------------------------------------------
--spec connect(host() | port(), list()) -> {ok, #sslsocket{}}.
--spec connect(host() | port(), list() | port_num(), timeout() | list()) -> {ok, #sslsocket{}}.
--spec connect(host() | port(), port_num(), list(), timeout()) -> {ok, #sslsocket{}}.
+-spec connect(host() | port(), [option()]) -> {ok, #sslsocket{}} |
+ {error, reason()}.
+-spec connect(host() | port(), [option()] | port_num(), timeout() | list()) ->
+ {ok, #sslsocket{}} | {error, reason()}.
+-spec connect(host() | port(), port_num(), list(), timeout()) ->
+ {ok, #sslsocket{}} | {error, reason()}.
%%
%% Description: Connect to a ssl server.
@@ -126,7 +148,7 @@ connect(Host, Port, Options0, Timeout) ->
end.
%%--------------------------------------------------------------------
--spec listen(port_num(), list()) ->{ok, #sslsocket{}} | {error, reason()}.
+-spec listen(port_num(), [option()]) ->{ok, #sslsocket{}} | {error, reason()}.
%%
%% Description: Creates a ssl listen socket.
@@ -150,8 +172,10 @@ listen(Port, Options0) ->
end.
%%--------------------------------------------------------------------
--spec transport_accept(#sslsocket{}) -> {ok, #sslsocket{}}.
--spec transport_accept(#sslsocket{}, timeout()) -> {ok, #sslsocket{}}.
+-spec transport_accept(#sslsocket{}) -> {ok, #sslsocket{}} |
+ {error, reason()}.
+-spec transport_accept(#sslsocket{}, timeout()) -> {ok, #sslsocket{}} |
+ {error, reason()}.
%%
%% Description: Performs transport accept on a ssl listen socket
%%--------------------------------------------------------------------
@@ -189,9 +213,10 @@ transport_accept(#sslsocket{} = ListenSocket, Timeout) ->
ssl_broker:transport_accept(Pid, ListenSocket, Timeout).
%%--------------------------------------------------------------------
--spec ssl_accept(#sslsocket{}) -> {ok, #sslsocket{}} | {error, reason()}.
--spec ssl_accept(#sslsocket{}, list() | timeout()) -> {ok, #sslsocket{}} | {error, reason()}.
--spec ssl_accept(port(), list(), timeout()) -> {ok, #sslsocket{}} | {error, reason()}.
+-spec ssl_accept(#sslsocket{}) -> ok | {error, reason()}.
+-spec ssl_accept(#sslsocket{} | port(), timeout()| [option()]) ->
+ ok | {ok, #sslsocket{}} | {error, reason()}.
+-spec ssl_accept(port(), [option()], timeout()) -> {ok, #sslsocket{}} | {error, reason()}.
%%
%% Description: Performs accept on a ssl listen socket. e.i. performs
%% ssl handshake.
@@ -238,7 +263,7 @@ close(Socket = #sslsocket{}) ->
ssl_broker:close(Socket).
%%--------------------------------------------------------------------
--spec send(#sslsocket{}, iolist()) -> ok | {error, reason()}.
+-spec send(#sslsocket{}, iodata()) -> ok | {error, reason()}.
%%
%% Description: Sends data over the ssl connection
%%--------------------------------------------------------------------
@@ -377,9 +402,9 @@ cipher_suites(openssl) ->
[ssl_cipher:openssl_suite_name(S) || S <- ssl_cipher:suites(Version)].
%%--------------------------------------------------------------------
--spec getopts(#sslsocket{}, [atom()]) -> {ok, [{atom(), term()}]}| {error, reason()}.
+-spec getopts(#sslsocket{}, [atom()]) -> {ok, [{atom(), term()}]} | {error, reason()}.
%%
-%% Description:
+%% Description: Gets options
%%--------------------------------------------------------------------
getopts(#sslsocket{fd = new_ssl, pid = Pid}, OptTags) when is_pid(Pid) ->
ssl_connection:get_opts(Pid, OptTags);
@@ -390,9 +415,9 @@ getopts(#sslsocket{} = Socket, Options) ->
ssl_broker:getopts(Socket, Options).
%%--------------------------------------------------------------------
--spec setopts(#sslsocket{}, [{atom(), term()}]) -> ok | {error, reason()}.
+-spec setopts(#sslsocket{}, [proplist:property()]) -> ok | {error, reason()}.
%%
-%% Description:
+%% Description: Sets options
%%--------------------------------------------------------------------
setopts(#sslsocket{fd = new_ssl, pid = Pid}, Opts0) when is_pid(Pid) ->
Opts = proplists:expand([{binary, [{mode, binary}]},
@@ -684,7 +709,8 @@ handle_options(Opts0, _Role) ->
reuse_sessions = handle_option(reuse_sessions, Opts, true),
secure_renegotiate = handle_option(secure_renegotiate, Opts, false),
renegotiate_at = handle_option(renegotiate_at, Opts, ?DEFAULT_RENEGOTIATE_AT),
- debug = handle_option(debug, Opts, [])
+ debug = handle_option(debug, Opts, []),
+ hibernate_after = handle_option(hibernate_after, Opts, undefined)
},
CbInfo = proplists:get_value(cb_info, Opts, {gen_tcp, tcp, tcp_closed, tcp_error}),
@@ -693,7 +719,7 @@ handle_options(Opts0, _Role) ->
depth, cert, certfile, key, keyfile,
password, cacerts, cacertfile, dh, dhfile, ciphers,
debug, reuse_session, reuse_sessions, ssl_imp,
- cb_info, renegotiate_at, secure_renegotiate],
+ cb_info, renegotiate_at, secure_renegotiate, hibernate_after],
SockOpts = lists:foldl(fun(Key, PropList) ->
proplists:delete(Key, PropList)
@@ -800,6 +826,10 @@ validate_option(renegotiate_at, Value) when is_integer(Value) ->
validate_option(debug, Value) when is_list(Value); Value == true ->
Value;
+validate_option(hibernate_after, undefined) ->
+ undefined;
+validate_option(hibernate_after, Value) when is_integer(Value), Value >= 0 ->
+ Value;
validate_option(Opt, Value) ->
throw({error, {eoptions, {Opt, Value}}}).
diff --git a/lib/ssl/src/ssl_app.erl b/lib/ssl/src/ssl_app.erl
index 8d50fd7bdb..c9f81726b9 100644
--- a/lib/ssl/src/ssl_app.erl
+++ b/lib/ssl/src/ssl_app.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
diff --git a/lib/ssl/src/ssl_certificate_db.erl b/lib/ssl/src/ssl_certificate_db.erl
index 2a5a7f3394..3eceefa304 100644
--- a/lib/ssl/src/ssl_certificate_db.erl
+++ b/lib/ssl/src/ssl_certificate_db.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -27,7 +27,9 @@
-export([create/0, remove/1, add_trusted_certs/3,
remove_trusted_certs/2, lookup_trusted_cert/3, issuer_candidate/1,
- lookup_cached_certs/1, cache_pem_file/3]).
+ lookup_cached_certs/1, cache_pem_file/4, uncache_pem_file/2, lookup/2]).
+
+-type time() :: {non_neg_integer(), non_neg_integer(), non_neg_integer()}.
%%====================================================================
%% Internal application API
@@ -98,17 +100,35 @@ add_trusted_certs(Pid, File, [CertsDb, FileToRefDb, PidToFileDb]) ->
insert(Pid, File, PidToFileDb),
{ok, Ref}.
%%--------------------------------------------------------------------
--spec cache_pem_file(pid(), string(), certdb_ref()) -> term().
+-spec cache_pem_file(pid(), string(), time(), certdb_ref()) -> term().
%%
%% Description: Cache file as binary in DB
%%--------------------------------------------------------------------
-cache_pem_file(Pid, File, [CertsDb, _FileToRefDb, PidToFileDb]) ->
+cache_pem_file(Pid, File, Time, [CertsDb, _FileToRefDb, PidToFileDb]) ->
{ok, PemBin} = file:read_file(File),
Content = public_key:pem_decode(PemBin),
- insert({file, File}, Content, CertsDb),
+ insert({file, File}, {Time, Content}, CertsDb),
insert(Pid, File, PidToFileDb),
{ok, Content}.
+%--------------------------------------------------------------------
+-spec uncache_pem_file(string(), certdb_ref()) -> no_return().
+%%
+%% Description: If a cached file is no longer valid (changed on disk)
+%% we must terminate the connections using the old file content, and
+%% when those processes are finish the cache will be cleaned. It is
+%% a rare but possible case a new ssl client/server is started with
+%% a filename with the same name as previously started client/server
+%% but with different content.
+%% --------------------------------------------------------------------
+uncache_pem_file(File, [_CertsDb, _FileToRefDb, PidToFileDb]) ->
+ Pids = select(PidToFileDb, [{{'$1', File},[],['$$']}]),
+ lists:foreach(fun([Pid]) ->
+ exit(Pid, shutdown)
+ end, Pids).
+
+
+
%%--------------------------------------------------------------------
-spec remove_trusted_certs(pid(), certdb_ref()) -> term().
@@ -174,6 +194,22 @@ issuer_candidate(PrevCandidateKey) ->
end.
%%--------------------------------------------------------------------
+-spec lookup(term(), term()) -> term() | undefined.
+%%
+%% Description: Looks up an element in a certificat <Db>.
+%%--------------------------------------------------------------------
+lookup(Key, Db) ->
+ case ets:lookup(Db, Key) of
+ [] ->
+ undefined;
+ Contents ->
+ Pick = fun({_, Data}) -> Data;
+ ({_,_,Data}) -> Data
+ end,
+ [Pick(Data) || Data <- Contents]
+ end.
+
+%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
certificate_db_name() ->
@@ -191,16 +227,8 @@ ref_count(Key, Db,N) ->
delete(Key, Db) ->
_ = ets:delete(Db, Key).
-lookup(Key, Db) ->
- case ets:lookup(Db, Key) of
- [] ->
- undefined;
- Contents ->
- Pick = fun({_, Data}) -> Data;
- ({_,_,Data}) -> Data
- end,
- [Pick(Data) || Data <- Contents]
- end.
+select(Db, MatchSpec)->
+ ets:select(Db, MatchSpec).
remove_certs(Ref, CertsDb) ->
ets:match_delete(CertsDb, {{Ref, '_', '_'}, '_'}).
diff --git a/lib/ssl/src/ssl_connection.erl b/lib/ssl/src/ssl_connection.erl
index 6c9ac65b64..0a86e9bd29 100644
--- a/lib/ssl/src/ssl_connection.erl
+++ b/lib/ssl/src/ssl_connection.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -70,7 +70,6 @@
%% {{md5_hash, sha_hash}, {prev_md5, prev_sha}} (binary())
tls_handshake_hashes, % see above
tls_cipher_texts, % list() received but not deciphered yet
- own_cert, % binary()
session, % #session{} from ssl_handshake.hrl
session_cache, %
session_cache_cb, %
@@ -90,7 +89,8 @@
log_alert, % boolean()
renegotiation, % {boolean(), From | internal | peer}
recv_during_renegotiation, %boolean()
- send_queue % queue()
+ send_queue, % queue()
+ terminated = false %
}).
-define(DEFAULT_DIFFIE_HELLMAN_PARAMS,
@@ -107,12 +107,14 @@
%%====================================================================
%%--------------------------------------------------------------------
--spec send(pid(), iolist()) -> ok | {error, reason()}.
+-spec send(pid(), iodata()) -> ok | {error, reason()}.
%%
%% Description: Sends data over the ssl connection
%%--------------------------------------------------------------------
send(Pid, Data) ->
sync_send_all_state_event(Pid, {application_data,
+ %% iolist_to_binary should really
+ %% be called iodata_to_binary()
erlang:iolist_to_binary(Data)}, infinity).
%%--------------------------------------------------------------------
@@ -289,9 +291,9 @@ start_link(Role, Host, Port, Socket, Options, User, CbInfo) ->
%% gen_fsm callbacks
%%====================================================================
%%--------------------------------------------------------------------
--spec init(list()) -> {ok, state_name(), #state{}} | {stop, term()}.
+-spec init(list()) -> {ok, state_name(), #state{}, timeout()} | {stop, term()}.
%% Possible return values not used now.
-%% | {ok, state_name(), #state{}, timeout()} |
+%% | {ok, state_name(), #state{}} |
%% ignore
%% Description:Whenever a gen_fsm is started using gen_fsm:start/[3,4] or
%% gen_fsm:start_link/3,4, this function is called by the new process to
@@ -304,13 +306,14 @@ init([Role, Host, Port, Socket, {SSLOpts0, _} = Options,
try ssl_init(SSLOpts0, Role) of
{ok, Ref, CacheRef, OwnCert, Key, DHParams} ->
+ Session = State0#state.session,
State = State0#state{tls_handshake_hashes = Hashes0,
- own_cert = OwnCert,
+ session = Session#session{own_certificate = OwnCert},
cert_db_ref = Ref,
session_cache = CacheRef,
private_key = Key,
diffie_hellman_params = DHParams},
- {ok, hello, State}
+ {ok, hello, State, get_timeout(State)}
catch
throw:Error ->
{stop, Error}
@@ -331,14 +334,13 @@ init([Role, Host, Port, Socket, {SSLOpts0, _} = Options,
%%--------------------------------------------------------------------
hello(start, #state{host = Host, port = Port, role = client,
ssl_options = SslOpts,
+ session = #session{own_certificate = Cert} = Session0,
transport_cb = Transport, socket = Socket,
connection_states = ConnectionStates,
- renegotiation = {Renegotiation, _}}
- = State0) ->
-
+ renegotiation = {Renegotiation, _}} = State0) ->
Hello = ssl_handshake:client_hello(Host, Port,
ConnectionStates,
- SslOpts, Renegotiation),
+ SslOpts, Renegotiation, Cert),
Version = Hello#client_hello.client_version,
Hashes0 = ssl_handshake:init_hashes(),
@@ -347,13 +349,13 @@ hello(start, #state{host = Host, port = Port, role = client,
Transport:send(Socket, BinMsg),
State1 = State0#state{connection_states = CS2,
negotiated_version = Version, %% Requested version
- session =
- #session{session_id = Hello#client_hello.session_id,
- is_resumable = false},
+ session =
+ Session0#session{session_id = Hello#client_hello.session_id,
+ is_resumable = false},
tls_handshake_hashes = Hashes1},
{Record, State} = next_record(State1),
next_state(hello, Record, State);
-
+
hello(start, #state{role = server} = State0) ->
{Record, State} = next_record(State0),
next_state(hello, Record, State);
@@ -370,7 +372,6 @@ hello(#server_hello{cipher_suite = CipherSuite,
negotiated_version = ReqVersion,
renegotiation = {Renegotiation, _},
ssl_options = SslOptions} = State0) ->
-
case ssl_handshake:hello(Hello, SslOptions, ConnectionStates0, Renegotiation) of
{Version, NewId, ConnectionStates} ->
{KeyAlgorithm, _, _} =
@@ -396,13 +397,11 @@ hello(#server_hello{cipher_suite = CipherSuite,
hello(Hello = #client_hello{client_version = ClientVersion},
State = #state{connection_states = ConnectionStates0,
- port = Port, session = Session0,
+ port = Port, session = #session{own_certificate = Cert} = Session0,
renegotiation = {Renegotiation, _},
session_cache = Cache,
session_cache_cb = CacheCb,
- ssl_options = SslOpts,
- own_cert = Cert}) ->
-
+ ssl_options = SslOpts}) ->
case ssl_handshake:hello(Hello, SslOpts, {Port, Session0, Cache, CacheCb,
ConnectionStates0, Cert}, Renegotiation) of
{Version, {Type, Session}, ConnectionStates} ->
@@ -415,6 +414,9 @@ hello(Hello = #client_hello{client_version = ClientVersion},
{stop, normal, State}
end;
+hello(timeout, State) ->
+ { next_state, hello, State, hibernate };
+
hello(Msg, State) ->
handle_unexpected_message(Msg, hello, State).
%%--------------------------------------------------------------------
@@ -463,6 +465,9 @@ abbreviated(#finished{verify_data = Data} = Finished,
{stop, normal, State}
end;
+abbreviated(timeout, State) ->
+ { next_state, abbreviated, State, hibernate };
+
abbreviated(Msg, State) ->
handle_unexpected_message(Msg, abbreviated, State).
@@ -536,7 +541,7 @@ certify(#server_hello_done{},
connection_states = ConnectionStates0,
negotiated_version = Version,
premaster_secret = undefined,
- role = client} = State0) ->
+ role = client} = State0) ->
case ssl_handshake:master_secret(Version, Session,
ConnectionStates0, client) of
{MasterSecret, ConnectionStates1} ->
@@ -585,6 +590,9 @@ certify(#client_key_exchange{exchange_keys = Keys},
{stop, normal, State}
end;
+certify(timeout, State) ->
+ { next_state, certify, State, hibernate };
+
certify(Msg, State) ->
handle_unexpected_message(Msg, certify, State).
@@ -613,7 +621,6 @@ certify_client_key_exchange(#client_diffie_hellman_public{dh_public = ClientPubl
diffie_hellman_params = #'DHParameter'{prime = P,
base = G},
diffie_hellman_keys = {_, ServerDhPrivateKey}} = State0) ->
-
case dh_master_secret(crypto:mpint(P), crypto:mpint(G), ClientPublicDhKey, ServerDhPrivateKey, State0) of
#state{} = State1 ->
{Record, State} = next_record(State1),
@@ -656,8 +663,7 @@ cipher(#finished{verify_data = Data} = Finished,
role = Role,
session = #session{master_secret = MasterSecret}
= Session0,
- tls_handshake_hashes = Hashes0} = State) ->
-
+ tls_handshake_hashes = Hashes0} = State) ->
case ssl_handshake:verify_connection(Version, Finished,
opposite_role(Role),
MasterSecret, Hashes0) of
@@ -669,6 +675,9 @@ cipher(#finished{verify_data = Data} = Finished,
{stop, normal, State}
end;
+cipher(timeout, State) ->
+ { next_state, cipher, State, hibernate };
+
cipher(Msg, State) ->
handle_unexpected_message(Msg, cipher, State).
@@ -678,15 +687,15 @@ cipher(Msg, State) ->
%%--------------------------------------------------------------------
connection(#hello_request{}, #state{host = Host, port = Port,
socket = Socket,
+ session = #session{own_certificate = Cert},
ssl_options = SslOpts,
negotiated_version = Version,
transport_cb = Transport,
connection_states = ConnectionStates0,
renegotiation = {Renegotiation, _},
tls_handshake_hashes = Hashes0} = State0) ->
-
Hello = ssl_handshake:client_hello(Host, Port, ConnectionStates0,
- SslOpts, Renegotiation),
+ SslOpts, Renegotiation, Cert),
{BinMsg, ConnectionStates1, Hashes1} =
encode_handshake(Hello, Version, ConnectionStates0, Hashes0),
@@ -698,6 +707,9 @@ connection(#hello_request{}, #state{host = Host, port = Port,
connection(#client_hello{} = Hello, #state{role = server} = State) ->
hello(Hello, State);
+connection(timeout, State) ->
+ {next_state, connection, State, hibernate};
+
connection(Msg, State) ->
handle_unexpected_message(Msg, connection, State).
%%--------------------------------------------------------------------
@@ -710,7 +722,7 @@ connection(Msg, State) ->
%% the event. Not currently used!
%%--------------------------------------------------------------------
handle_event(_Event, StateName, State) ->
- {next_state, StateName, State}.
+ {next_state, StateName, State, get_timeout(State)}.
%%--------------------------------------------------------------------
-spec handle_sync_event(term(), from(), state_name(), #state{}) ->
@@ -741,7 +753,8 @@ handle_sync_event({application_data, Data0}, From, connection,
{Msgs, [], ConnectionStates} ->
Result = Transport:send(Socket, Msgs),
{reply, Result,
- connection, State#state{connection_states = ConnectionStates}};
+ connection, State#state{connection_states = ConnectionStates},
+ get_timeout(State)};
{Msgs, RestData, ConnectionStates} ->
if
Msgs =/= [] ->
@@ -754,12 +767,14 @@ handle_sync_event({application_data, Data0}, From, connection,
renegotiation = {true, internal}})
end
catch throw:Error ->
- {reply, Error, connection, State}
+ {reply, Error, connection, State, get_timeout(State)}
end;
handle_sync_event({application_data, Data}, From, StateName,
#state{send_queue = Queue} = State) ->
%% In renegotiation priorities handshake, send data when handshake is finished
- {next_state, StateName, State#state{send_queue = queue:in({From, Data}, Queue)}};
+ {next_state, StateName,
+ State#state{send_queue = queue:in({From, Data}, Queue)},
+ get_timeout(State)};
handle_sync_event(start, From, hello, State) ->
hello(start, State#state{from = From});
@@ -773,12 +788,16 @@ handle_sync_event(start, From, hello, State) ->
%% here to make sure it is the users problem and not owers if
%% they upgrade a active socket.
handle_sync_event(start, _, connection, State) ->
- {reply, connected, connection, State};
+ {reply, connected, connection, State, get_timeout(State)};
handle_sync_event(start, From, StateName, State) ->
- {next_state, StateName, State#state{from = From}};
+ {next_state, StateName, State#state{from = From}, get_timeout(State)};
-handle_sync_event(close, _, _StateName, State) ->
- {stop, normal, ok, State};
+handle_sync_event(close, _, StateName, State) ->
+ %% Run terminate before returning
+ %% so that the reuseaddr inet-option will work
+ %% as intended.
+ (catch terminate(user_close, StateName, State)),
+ {stop, normal, ok, State#state{terminated = true}};
handle_sync_event({shutdown, How0}, _, StateName,
#state{transport_cb = Transport,
@@ -797,7 +816,7 @@ handle_sync_event({shutdown, How0}, _, StateName,
case Transport:shutdown(Socket, How0) of
ok ->
- {reply, ok, StateName, State};
+ {reply, ok, StateName, State, get_timeout(State)};
Error ->
{stop, normal, Error, State}
end;
@@ -808,30 +827,33 @@ handle_sync_event({recv, N}, From, connection = StateName, State0) ->
%% Doing renegotiate wait with handling request until renegotiate is
%% finished. Will be handled by next_state_connection/2.
handle_sync_event({recv, N}, From, StateName, State) ->
- {next_state, StateName, State#state{bytes_to_read = N, from = From,
- recv_during_renegotiation = true}};
+ {next_state, StateName,
+ State#state{bytes_to_read = N, from = From,
+ recv_during_renegotiation = true},
+ get_timeout(State)};
handle_sync_event({new_user, User}, _From, StateName,
State =#state{user_application = {OldMon, _}}) ->
NewMon = erlang:monitor(process, User),
erlang:demonitor(OldMon, [flush]),
- {reply, ok, StateName, State#state{user_application = {NewMon,User}}};
+ {reply, ok, StateName, State#state{user_application = {NewMon,User}},
+ get_timeout(State)};
handle_sync_event({get_opts, OptTags}, _From, StateName,
#state{socket = Socket,
socket_options = SockOpts} = State) ->
OptsReply = get_socket_opts(Socket, OptTags, SockOpts, []),
- {reply, OptsReply, StateName, State};
+ {reply, OptsReply, StateName, State, get_timeout(State)};
handle_sync_event(sockname, _From, StateName,
#state{socket = Socket} = State) ->
SockNameReply = inet:sockname(Socket),
- {reply, SockNameReply, StateName, State};
+ {reply, SockNameReply, StateName, State, get_timeout(State)};
handle_sync_event(peername, _From, StateName,
#state{socket = Socket} = State) ->
PeerNameReply = inet:peername(Socket),
- {reply, PeerNameReply, StateName, State};
+ {reply, PeerNameReply, StateName, State, get_timeout(State)};
handle_sync_event({set_opts, Opts0}, _From, StateName,
#state{socket_options = Opts1,
@@ -841,27 +863,27 @@ handle_sync_event({set_opts, Opts0}, _From, StateName,
State1 = State0#state{socket_options = Opts},
if
Opts#socket_options.active =:= false ->
- {reply, ok, StateName, State1};
+ {reply, ok, StateName, State1, get_timeout(State1)};
Buffer =:= <<>>, Opts1#socket_options.active =:= false ->
%% Need data, set active once
{Record, State2} = next_record_if_active(State1),
case next_state(StateName, Record, State2) of
- {next_state, StateName, State} ->
- {reply, ok, StateName, State};
+ {next_state, StateName, State, Timeout} ->
+ {reply, ok, StateName, State, Timeout};
{stop, Reason, State} ->
{stop, Reason, State}
end;
Buffer =:= <<>> ->
%% Active once already set
- {reply, ok, StateName, State1};
+ {reply, ok, StateName, State1, get_timeout(State1)};
true ->
case application_data(<<>>, State1) of
Stop = {stop,_,_} ->
Stop;
{Record, State2} ->
case next_state(StateName, Record, State2) of
- {next_state, StateName, State} ->
- {reply, ok, StateName, State};
+ {next_state, StateName, State, Timeout} ->
+ {reply, ok, StateName, State, Timeout};
{stop, Reason, State} ->
{stop, Reason, State}
end
@@ -872,7 +894,7 @@ handle_sync_event(renegotiate, From, connection, State) ->
renegotiate(State#state{renegotiation = {true, From}});
handle_sync_event(renegotiate, _, StateName, State) ->
- {reply, {error, already_renegotiating}, StateName, State};
+ {reply, {error, already_renegotiating}, StateName, State, get_timeout(State)};
handle_sync_event(info, _, StateName,
#state{negotiated_version = Version,
@@ -880,19 +902,19 @@ handle_sync_event(info, _, StateName,
AtomVersion = ssl_record:protocol_version(Version),
{reply, {ok, {AtomVersion, ssl_cipher:suite_definition(Suite)}},
- StateName, State};
+ StateName, State, get_timeout(State)};
handle_sync_event(session_info, _, StateName,
#state{session = #session{session_id = Id,
cipher_suite = Suite}} = State) ->
{reply, [{session_id, Id},
{cipher_suite, ssl_cipher:suite_definition(Suite)}],
- StateName, State};
+ StateName, State, get_timeout(State)};
handle_sync_event(peer_certificate, _, StateName,
#state{session = #session{peer_certificate = Cert}}
= State) ->
- {reply, {ok, Cert}, StateName, State}.
+ {reply, {ok, Cert}, StateName, State, get_timeout(State)}.
%%--------------------------------------------------------------------
-spec handle_info(msg(),state_name(), #state{}) ->
@@ -956,7 +978,7 @@ handle_info({'DOWN', MonitorRef, _, _, _}, _,
handle_info(Msg, StateName, State) ->
Report = io_lib:format("SSL: Got unexpected info: ~p ~n", [Msg]),
error_logger:info_report(Report),
- {next_state, StateName, State}.
+ {next_state, StateName, State, get_timeout(State)}.
%%--------------------------------------------------------------------
-spec terminate(reason(), state_name(), #state{}) -> term().
@@ -966,6 +988,11 @@ handle_info(Msg, StateName, State) ->
%% necessary cleaning up. When it returns, the gen_fsm terminates with
%% Reason. The return value is ignored.
%%--------------------------------------------------------------------
+terminate(_, _, #state{terminated = true}) ->
+ %% Happens when user closes the connection using ssl:close/1
+ %% we want to guarantee that Transport:close has been called
+ %% when ssl:close/1 returns.
+ ok;
terminate(Reason, connection, #state{negotiated_version = Version,
connection_states = ConnectionStates,
transport_cb = Transport,
@@ -975,14 +1002,14 @@ terminate(Reason, connection, #state{negotiated_version = Version,
notify_renegotiater(Renegotiate),
BinAlert = terminate_alert(Reason, Version, ConnectionStates),
Transport:send(Socket, BinAlert),
- workaround_transport_delivery_problems(Socket, Transport),
+ workaround_transport_delivery_problems(Socket, Transport, Reason),
Transport:close(Socket);
-terminate(_Reason, _StateName, #state{transport_cb = Transport,
+terminate(Reason, _StateName, #state{transport_cb = Transport,
socket = Socket, send_queue = SendQueue,
renegotiation = Renegotiate}) ->
notify_senders(SendQueue),
notify_renegotiater(Renegotiate),
- workaround_transport_delivery_problems(Socket, Transport),
+ workaround_transport_delivery_problems(Socket, Transport, Reason),
Transport:close(Socket).
%%--------------------------------------------------------------------
@@ -1082,12 +1109,13 @@ init_private_key({rsa, PrivateKey}, _, _,_) ->
init_private_key({dsa, PrivateKey},_,_,_) ->
public_key:der_decode('DSAPrivateKey', PrivateKey).
+-spec(handle_file_error(_,_,_,_,_,_) -> no_return()).
handle_file_error(Line, Error, {badmatch, Reason}, File, Throw, Stack) ->
file_error(Line, Error, Reason, File, Throw, Stack);
handle_file_error(Line, Error, Reason, File, Throw, Stack) ->
file_error(Line, Error, Reason, File, Throw, Stack).
--spec(file_error/6 :: (_,_,_,_,_,_) -> no_return()).
+-spec(file_error(_,_,_,_,_,_) -> no_return()).
file_error(Line, Error, Reason, File, Throw, Stack) ->
Report = io_lib:format("SSL: ~p: ~p:~p ~s~n ~p~n",
[Line, Error, Reason, File, Stack]),
@@ -1147,7 +1175,7 @@ certify_client(#state{client_certificate_requested = true, role = client,
transport_cb = Transport,
negotiated_version = Version,
cert_db_ref = CertDbRef,
- own_cert = OwnCert,
+ session = #session{own_certificate = OwnCert},
socket = Socket,
tls_handshake_hashes = Hashes0} = State) ->
Certificate = ssl_handshake:certificate(OwnCert, CertDbRef, client),
@@ -1163,10 +1191,10 @@ verify_client_cert(#state{client_certificate_requested = true, role = client,
connection_states = ConnectionStates0,
transport_cb = Transport,
negotiated_version = Version,
- own_cert = OwnCert,
socket = Socket,
private_key = PrivateKey,
- session = #session{master_secret = MasterSecret},
+ session = #session{master_secret = MasterSecret,
+ own_certificate = OwnCert},
tls_handshake_hashes = Hashes0} = State) ->
case ssl_handshake:client_certificate_verify(OwnCert, MasterSecret,
@@ -1332,7 +1360,7 @@ certify_server(#state{transport_cb = Transport,
connection_states = ConnectionStates,
tls_handshake_hashes = Hashes,
cert_db_ref = CertDbRef,
- own_cert = OwnCert} = State) ->
+ session = #session{own_certificate = OwnCert}} = State) ->
case ssl_handshake:certificate(OwnCert, CertDbRef, server) of
CertMsg = #certificate{} ->
{BinCertMsg, NewConnectionStates, NewHashes} =
@@ -1359,7 +1387,6 @@ key_exchange(#state{role = server, key_algorithm = Algo,
when Algo == dhe_dss;
Algo == dhe_rsa;
Algo == dh_anon ->
-
Keys = crypto:dh_generate_key([crypto:mpint(P), crypto:mpint(G)]),
ConnectionState =
ssl_record:pending_connection_state(ConnectionStates0, read),
@@ -1408,8 +1435,6 @@ key_exchange(#state{role = client,
State#state{connection_states = ConnectionStates1,
tls_handshake_hashes = Hashes1}.
--spec(rsa_key_exchange/2 :: (_,_) -> no_return()).
-
rsa_key_exchange(PremasterSecret, PublicKeyInfo = {Algorithm, _, _})
when Algorithm == ?rsaEncryption;
Algorithm == ?md2WithRSAEncryption;
@@ -1776,7 +1801,7 @@ handle_tls_handshake(Handle, StateName, #state{tls_packets = [Packet]} = State)
handle_tls_handshake(Handle, StateName, #state{tls_packets = [Packet | Packets]} = State0) ->
FsmReturn = {next_state, StateName, State0#state{tls_packets = Packets}},
case Handle(Packet, FsmReturn) of
- {next_state, NextStateName, State} ->
+ {next_state, NextStateName, State, _Timeout} ->
handle_tls_handshake(Handle, NextStateName, State);
{stop, _,_} = Stop ->
Stop
@@ -1787,11 +1812,11 @@ next_state(_, #alert{} = Alert, #state{negotiated_version = Version} = State) ->
{stop, normal, State};
next_state(Next, no_record, State) ->
- {next_state, Next, State};
+ {next_state, Next, State, get_timeout(State)};
next_state(Next, #ssl_tls{type = ?ALERT, fragment = EncAlerts}, State) ->
Alerts = decode_alerts(EncAlerts),
- handle_alerts(Alerts, {next_state, Next, State});
+ handle_alerts(Alerts, {next_state, Next, State, get_timeout(State)});
next_state(StateName, #ssl_tls{type = ?HANDSHAKE, fragment = Data},
State0 = #state{tls_handshake_buffer = Buf0, negotiated_version = Version}) ->
@@ -1911,14 +1936,22 @@ next_state_connection(StateName, #state{send_queue = Queue0,
next_state_is_connection(State)
end.
+%% In next_state_is_connection/1: clear tls_handshake_hashes,
+%% premaster_secret and public_key_info (only needed during handshake)
+%% to reduce memory foot print of a connection.
next_state_is_connection(State =
#state{recv_during_renegotiation = true, socket_options =
#socket_options{active = false}}) ->
- passive_receive(State#state{recv_during_renegotiation = false}, connection);
+ passive_receive(State#state{recv_during_renegotiation = false,
+ premaster_secret = undefined,
+ public_key_info = undefined,
+ tls_handshake_hashes = {<<>>, <<>>}}, connection);
next_state_is_connection(State0) ->
{Record, State} = next_record_if_active(State0),
- next_state(connection, Record, State).
+ next_state(connection, Record, State#state{premaster_secret = undefined,
+ public_key_info = undefined,
+ tls_handshake_hashes = {<<>>, <<>>}}).
register_session(_, _, _, #session{is_resumable = true} = Session) ->
Session; %% Already registered
@@ -2034,7 +2067,7 @@ handle_alerts([], Result) ->
handle_alerts(_, {stop, _, _} = Stop) ->
%% If it is a fatal alert immediately close
Stop;
-handle_alerts([Alert | Alerts], {next_state, StateName, State}) ->
+handle_alerts([Alert | Alerts], {next_state, StateName, State, _Timeout}) ->
handle_alerts(Alerts, handle_alert(Alert, StateName, State)).
handle_alert(#alert{level = ?FATAL} = Alert, StateName,
@@ -2185,7 +2218,8 @@ notify_renegotiater({true, From}) when not is_atom(From) ->
notify_renegotiater(_) ->
ok.
-terminate_alert(Reason, Version, ConnectionStates) when Reason == normal; Reason == shutdown ->
+terminate_alert(Reason, Version, ConnectionStates) when Reason == normal; Reason == shutdown;
+ Reason == user_close ->
{BinAlert, _} = encode_alert(?ALERT_REC(?WARNING, ?CLOSE_NOTIFY),
Version, ConnectionStates),
BinAlert;
@@ -2194,10 +2228,13 @@ terminate_alert(_, Version, ConnectionStates) ->
Version, ConnectionStates),
BinAlert.
-workaround_transport_delivery_problems(Socket, Transport) ->
+workaround_transport_delivery_problems(_,_, user_close) ->
+ ok;
+workaround_transport_delivery_problems(Socket, Transport, _) ->
%% Standard trick to try to make sure all
%% data sent to to tcp port is really sent
- %% before tcp port is closed.
+ %% before tcp port is closed so that the peer will
+ %% get a correct error message.
inet:setopts(Socket, [{active, false}]),
Transport:shutdown(Socket, write),
Transport:recv(Socket, 0).
@@ -2211,3 +2248,8 @@ linux_workaround_transport_delivery_problems(#alert{level = ?FATAL}, Socket) ->
end;
linux_workaround_transport_delivery_problems(_, _) ->
ok.
+
+get_timeout(#state{ssl_options=#ssl_options{hibernate_after=undefined}}) ->
+ infinity;
+get_timeout(#state{ssl_options=#ssl_options{hibernate_after=HibernateAfter}}) ->
+ HibernateAfter.
diff --git a/lib/ssl/src/ssl_handshake.erl b/lib/ssl/src/ssl_handshake.erl
index c7a1c4965d..1f4c44d115 100644
--- a/lib/ssl/src/ssl_handshake.erl
+++ b/lib/ssl/src/ssl_handshake.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -30,7 +30,7 @@
-include("ssl_internal.hrl").
-include_lib("public_key/include/public_key.hrl").
--export([master_secret/4, client_hello/5, server_hello/4, hello/4,
+-export([master_secret/4, client_hello/6, server_hello/4, hello/4,
hello_request/0, certify/6, certificate/3,
client_certificate_verify/5, certificate_verify/5,
certificate_request/2, key_exchange/2, server_key_exchange_hash/2,
@@ -49,13 +49,13 @@
%%====================================================================
%%--------------------------------------------------------------------
-spec client_hello(host(), port_num(), #connection_states{},
- #ssl_options{}, boolean()) -> #client_hello{}.
+ #ssl_options{}, boolean(), der_cert()) -> #client_hello{}.
%%
%% Description: Creates a client hello message.
%%--------------------------------------------------------------------
client_hello(Host, Port, ConnectionStates, #ssl_options{versions = Versions,
ciphers = UserSuites}
- = SslOpts, Renegotiation) ->
+ = SslOpts, Renegotiation, OwnCert) ->
Fun = fun(Version) ->
ssl_record:protocol_version(Version)
@@ -65,7 +65,7 @@ client_hello(Host, Port, ConnectionStates, #ssl_options{versions = Versions,
SecParams = Pending#connection_state.security_parameters,
Ciphers = available_suites(UserSuites, Version),
- Id = ssl_manager:client_session_id(Host, Port, SslOpts),
+ Id = ssl_manager:client_session_id(Host, Port, SslOpts, OwnCert),
#client_hello{session_id = Id,
client_version = Version,
@@ -194,14 +194,12 @@ certify(#certificate{asn1_certificates = ASN1Certs}, CertDbRef,
{fun(OtpCert, ExtensionOrError, {SslState, UserState}) ->
case ssl_certificate:validate_extension(OtpCert,
ExtensionOrError,
- SslState) of
- {valid, _} ->
- apply_user_fun(Fun, OtpCert,
- ExtensionOrError, UserState,
- SslState);
- {fail, Reason} ->
- apply_user_fun(Fun, OtpCert, Reason, UserState,
- SslState);
+ SslState) of
+ {valid, NewSslState} ->
+ {valid, {NewSslState, UserState}};
+ {fail, Reason} ->
+ apply_user_fun(Fun, OtpCert, Reason, UserState,
+ SslState);
{unknown, _} ->
apply_user_fun(Fun, OtpCert,
ExtensionOrError, UserState, SslState)
@@ -571,7 +569,7 @@ select_session(Hello, Port, Session, Version,
#ssl_options{ciphers = UserSuites} = SslOpts, Cache, CacheCb, Cert) ->
SuggestedSessionId = Hello#client_hello.session_id,
SessionId = ssl_manager:server_session_id(Port, SuggestedSessionId,
- SslOpts),
+ SslOpts, Cert),
Suites = available_suites(Cert, UserSuites, Version),
case ssl_session:is_new(SuggestedSessionId, SessionId) of
diff --git a/lib/ssl/src/ssl_handshake.hrl b/lib/ssl/src/ssl_handshake.hrl
index 68a7802ef2..fb0ebac7d1 100644
--- a/lib/ssl/src/ssl_handshake.hrl
+++ b/lib/ssl/src/ssl_handshake.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -29,13 +29,13 @@
-include_lib("public_key/include/public_key.hrl").
-type algo_oid() :: ?'rsaEncryption' | ?'id-dsa'.
--type public_key() :: #'RSAPublicKey'{} | integer().
-type public_key_params() :: #'Dss-Parms'{} | term().
--type public_key_info() :: {algo_oid(), public_key(), public_key_params()}.
+-type public_key_info() :: {algo_oid(), #'RSAPublicKey'{} | integer() , public_key_params()}.
-record(session, {
session_id,
peer_certificate,
+ own_certificate,
compression_method,
cipher_suite,
master_secret,
diff --git a/lib/ssl/src/ssl_internal.hrl b/lib/ssl/src/ssl_internal.hrl
index 43a85c2d9d..c28daa271e 100644
--- a/lib/ssl/src/ssl_internal.hrl
+++ b/lib/ssl/src/ssl_internal.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -19,7 +19,6 @@
%%
-
-ifndef(ssl_internal).
-define(ssl_internal, true).
@@ -99,7 +98,11 @@
reuse_sessions, % boolean()
renegotiate_at,
secure_renegotiate,
- debug %
+ debug,
+ hibernate_after % undefined if not hibernating,
+ % or number of ms of inactivity
+ % after which ssl_connection will
+ % go into hibernation
}).
-record(socket_options,
diff --git a/lib/ssl/src/ssl_manager.erl b/lib/ssl/src/ssl_manager.erl
index 3b02d96562..f845b1ecc0 100644
--- a/lib/ssl/src/ssl_manager.erl
+++ b/lib/ssl/src/ssl_manager.erl
@@ -29,8 +29,8 @@
%% Internal application API
-export([start_link/1,
connection_init/2, cache_pem_file/1,
- lookup_trusted_cert/3, issuer_candidate/1, client_session_id/3,
- server_session_id/3,
+ lookup_trusted_cert/3, issuer_candidate/1, client_session_id/4,
+ server_session_id/4,
register_session/2, register_session/3, invalidate_session/2,
invalidate_session/3]).
@@ -43,6 +43,7 @@
-include("ssl_handshake.hrl").
-include("ssl_internal.hrl").
+-include_lib("kernel/include/file.hrl").
-record(state, {
session_cache,
@@ -76,16 +77,17 @@ start_link(Opts) ->
connection_init(Trustedcerts, Role) ->
call({connection_init, Trustedcerts, Role}).
%%--------------------------------------------------------------------
--spec cache_pem_file(string()) -> {ok, term()}.
+-spec cache_pem_file(string()) -> {ok, term()} | {error, reason()}.
%%
-%% Description: Cach a pem file and
+%% Description: Cach a pem file and return its content.
%%--------------------------------------------------------------------
-cache_pem_file(File) ->
- case ssl_certificate_db:lookup_cached_certs(File) of
- [{_,Content}] ->
- {ok, Content};
- [] ->
- call({cache_pem, File})
+cache_pem_file(File) ->
+ try file:read_file_info(File) of
+ {ok, #file_info{mtime = LastWrite}} ->
+ cache_pem_file(File, LastWrite)
+ catch
+ _:Reason ->
+ {error, Reason}
end.
%%--------------------------------------------------------------------
-spec lookup_trusted_cert(reference(), serialnumber(), issuer()) ->
@@ -106,20 +108,21 @@ lookup_trusted_cert(Ref, SerialNumber, Issuer) ->
issuer_candidate(PrevCandidateKey) ->
ssl_certificate_db:issuer_candidate(PrevCandidateKey).
%%--------------------------------------------------------------------
--spec client_session_id(host(), port_num(), #ssl_options{}) -> session_id().
+-spec client_session_id(host(), port_num(), #ssl_options{},
+ der_cert() | undefined) -> session_id().
%%
%% Description: Select a session id for the client.
%%--------------------------------------------------------------------
-client_session_id(Host, Port, SslOpts) ->
- call({client_session_id, Host, Port, SslOpts}).
+client_session_id(Host, Port, SslOpts, OwnCert) ->
+ call({client_session_id, Host, Port, SslOpts, OwnCert}).
%%--------------------------------------------------------------------
--spec server_session_id(host(), port_num(), #ssl_options{}) -> session_id().
+-spec server_session_id(host(), port_num(), #ssl_options{}, der_cert()) -> session_id().
%%
%% Description: Select a session id for the server.
%%--------------------------------------------------------------------
-server_session_id(Port, SuggestedSessionId, SslOpts) ->
- call({server_session_id, Port, SuggestedSessionId, SslOpts}).
+server_session_id(Port, SuggestedSessionId, SslOpts, OwnCert) ->
+ call({server_session_id, Port, SuggestedSessionId, SslOpts, OwnCert}).
%%--------------------------------------------------------------------
-spec register_session(port_num(), #session{}) -> ok.
@@ -201,28 +204,35 @@ handle_call({{connection_init, Trustedcerts, _Role}, Pid}, _From,
end,
{reply, Result, State};
-handle_call({{client_session_id, Host, Port, SslOpts}, _}, _,
+handle_call({{client_session_id, Host, Port, SslOpts, OwnCert}, _}, _,
#state{session_cache = Cache,
session_cache_cb = CacheCb} = State) ->
- Id = ssl_session:id({Host, Port, SslOpts}, Cache, CacheCb),
+ Id = ssl_session:id({Host, Port, SslOpts}, Cache, CacheCb, OwnCert),
{reply, Id, State};
-handle_call({{server_session_id, Port, SuggestedSessionId, SslOpts}, _},
+handle_call({{server_session_id, Port, SuggestedSessionId, SslOpts, OwnCert}, _},
_, #state{session_cache_cb = CacheCb,
session_cache = Cache,
session_lifetime = LifeTime} = State) ->
Id = ssl_session:id(Port, SuggestedSessionId, SslOpts,
- Cache, CacheCb, LifeTime),
+ Cache, CacheCb, LifeTime, OwnCert),
{reply, Id, State};
-handle_call({{cache_pem, File},Pid}, _, State = #state{certificate_db = Db}) ->
- try ssl_certificate_db:cache_pem_file(Pid,File,Db) of
+handle_call({{cache_pem, File, LastWrite}, Pid}, _,
+ #state{certificate_db = Db} = State) ->
+ try ssl_certificate_db:cache_pem_file(Pid, File, LastWrite, Db) of
Result ->
{reply, Result, State}
catch
_:Reason ->
{reply, {error, Reason}, State}
- end.
+ end;
+handle_call({{recache_pem, File, LastWrite}, Pid}, From,
+ #state{certificate_db = Db} = State) ->
+ ssl_certificate_db:uncache_pem_file(File, Db),
+ cast({recache_pem, File, LastWrite, Pid, From}),
+ {noreply, State}.
+
%%--------------------------------------------------------------------
-spec handle_cast(msg(), #state{}) -> {noreply, #state{}}.
%% Possible return values not used now.
@@ -259,7 +269,21 @@ handle_cast({invalidate_session, Port, #session{session_id = ID}},
#state{session_cache = Cache,
session_cache_cb = CacheCb} = State) ->
CacheCb:delete(Cache, {Port, ID}),
- {noreply, State}.
+ {noreply, State};
+
+handle_cast({recache_pem, File, LastWrite, Pid, From},
+ #state{certificate_db = [_, FileToRefDb, _]} = State0) ->
+ case ssl_certificate_db:lookup(File, FileToRefDb) of
+ undefined ->
+ {reply, Msg, State} = handle_call({{cache_pem, File, LastWrite}, Pid}, From, State0),
+ gen_server:reply(From, Msg),
+ {noreply, State};
+ _ -> %% Send message to self letting cleanup messages be handled
+ %% first so that no reference to the old version of file
+ %% exists when we cache the new one.
+ cast({recache_pem, File, LastWrite, Pid, From}),
+ {noreply, State0}
+ end.
%%--------------------------------------------------------------------
-spec handle_info(msg(), #state{}) -> {noreply, #state{}}.
@@ -286,12 +310,14 @@ handle_info({'EXIT', _, _}, State) ->
handle_info({'DOWN', _Ref, _Type, _Pid, ecacertfile}, State) ->
{noreply, State};
+handle_info({'DOWN', _Ref, _Type, Pid, shutdown}, State) ->
+ handle_info({remove_trusted_certs, Pid}, State);
handle_info({'DOWN', _Ref, _Type, Pid, _Reason}, State) ->
erlang:send_after(?CERTIFICATE_CACHE_CLEANUP, self(),
{remove_trusted_certs, Pid}),
{noreply, State};
handle_info({remove_trusted_certs, Pid},
- State = #state{certificate_db = Db}) ->
+ #state{certificate_db = Db} = State) ->
ssl_certificate_db:remove_trusted_certs(Pid, Db),
{noreply, State};
@@ -362,3 +388,16 @@ session_validation({{{Host, Port}, _}, Session}, LifeTime) ->
session_validation({{Port, _}, Session}, LifeTime) ->
validate_session(Port, Session, LifeTime),
LifeTime.
+
+cache_pem_file(File, LastWrite) ->
+ case ssl_certificate_db:lookup_cached_certs(File) of
+ [{_, {Mtime, Content}}] ->
+ case LastWrite of
+ Mtime ->
+ {ok, Content};
+ _ ->
+ call({recache_pem, File, LastWrite})
+ end;
+ [] ->
+ call({cache_pem, File, LastWrite})
+ end.
diff --git a/lib/ssl/src/ssl_session.erl b/lib/ssl/src/ssl_session.erl
index 25e7445180..dc4b7a711c 100644
--- a/lib/ssl/src/ssl_session.erl
+++ b/lib/ssl/src/ssl_session.erl
@@ -28,7 +28,7 @@
-include("ssl_internal.hrl").
%% Internal application API
--export([is_new/2, id/3, id/6, valid_session/2]).
+-export([is_new/2, id/4, id/7, valid_session/2]).
-define(GEN_UNIQUE_ID_MAX_TRIES, 10).
@@ -48,13 +48,14 @@ is_new(_ClientSuggestion, _ServerDecision) ->
true.
%%--------------------------------------------------------------------
--spec id({host(), port_num(), #ssl_options{}}, cache_ref(), atom()) -> binary().
+-spec id({host(), port_num(), #ssl_options{}}, cache_ref(), atom(),
+ undefined | binary()) -> binary().
%%
%% Description: Should be called by the client side to get an id
%% for the client hello message.
%%--------------------------------------------------------------------
-id(ClientInfo, Cache, CacheCb) ->
- case select_session(ClientInfo, Cache, CacheCb) of
+id(ClientInfo, Cache, CacheCb, OwnCert) ->
+ case select_session(ClientInfo, Cache, CacheCb, OwnCert) of
no_session ->
<<>>;
SessionId ->
@@ -63,19 +64,19 @@ id(ClientInfo, Cache, CacheCb) ->
%%--------------------------------------------------------------------
-spec id(port_num(), binary(), #ssl_options{}, cache_ref(),
- atom(), seconds()) -> binary().
+ atom(), seconds(), binary()) -> binary().
%%
%% Description: Should be called by the server side to get an id
%% for the server hello message.
%%--------------------------------------------------------------------
-id(Port, <<>>, _, Cache, CacheCb, _) ->
+id(Port, <<>>, _, Cache, CacheCb, _, _) ->
new_id(Port, ?GEN_UNIQUE_ID_MAX_TRIES, Cache, CacheCb);
id(Port, SuggestedSessionId, #ssl_options{reuse_sessions = ReuseEnabled,
reuse_session = ReuseFun},
- Cache, CacheCb, SecondLifeTime) ->
+ Cache, CacheCb, SecondLifeTime, OwnCert) ->
case is_resumable(SuggestedSessionId, Port, ReuseEnabled,
- ReuseFun, Cache, CacheCb, SecondLifeTime) of
+ ReuseFun, Cache, CacheCb, SecondLifeTime, OwnCert) of
true ->
SuggestedSessionId;
false ->
@@ -93,19 +94,20 @@ valid_session(#session{time_stamp = TimeStamp}, LifeTime) ->
%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
-select_session({HostIP, Port, SslOpts}, Cache, CacheCb) ->
+select_session({HostIP, Port, SslOpts}, Cache, CacheCb, OwnCert) ->
Sessions = CacheCb:select_session(Cache, {HostIP, Port}),
- select_session(Sessions, SslOpts).
+ select_session(Sessions, SslOpts, OwnCert).
-select_session([], _) ->
+select_session([], _, _) ->
no_session;
select_session(Sessions, #ssl_options{ciphers = Ciphers,
- reuse_sessions = ReuseSession}) ->
+ reuse_sessions = ReuseSession}, OwnCert) ->
IsResumable =
fun(Session) ->
ReuseSession andalso (Session#session.is_resumable) andalso
lists:member(Session#session.cipher_suite, Ciphers)
+ andalso (OwnCert == Session#session.own_certificate)
end,
case [Id || [Id, Session] <- Sessions, IsResumable(Session)] of
[] ->
@@ -140,14 +142,16 @@ new_id(Port, Tries, Cache, CacheCb) ->
end.
is_resumable(SuggestedSessionId, Port, ReuseEnabled, ReuseFun, Cache,
- CacheCb, SecondLifeTime) ->
+ CacheCb, SecondLifeTime, OwnCert) ->
case CacheCb:lookup(Cache, {Port, SuggestedSessionId}) of
#session{cipher_suite = CipherSuite,
+ own_certificate = SessionOwnCert,
compression_method = Compression,
is_resumable = Is_resumable,
peer_certificate = PeerCert} = Session ->
ReuseEnabled
andalso Is_resumable
+ andalso (OwnCert == SessionOwnCert)
andalso valid_session(Session, SecondLifeTime)
andalso ReuseFun(SuggestedSessionId, PeerCert,
Compression, CipherSuite);
diff --git a/lib/ssl/src/ssl_ssl3.erl b/lib/ssl/src/ssl_ssl3.erl
index c49f9f1e6d..f2926b2d2f 100644
--- a/lib/ssl/src/ssl_ssl3.erl
+++ b/lib/ssl/src/ssl_ssl3.erl
@@ -102,11 +102,6 @@ mac_hash(Method, Mac_write_secret, Seq_num, Type, Length, Fragment) ->
%% hash(MAC_write_secret + pad_1 + seq_num +
%% SSLCompressed.type + SSLCompressed.length +
%% SSLCompressed.fragment));
- case Method of
- ?NULL -> ok;
- _ ->
- ok
- end,
Mac = mac_hash(Method, Mac_write_secret,
[<<?UINT64(Seq_num), ?BYTE(Type),
?UINT16(Length)>>, Fragment]),
diff --git a/lib/ssl/src/ssl_tls1.erl b/lib/ssl/src/ssl_tls1.erl
index 3784483e9c..5f9850c386 100644
--- a/lib/ssl/src/ssl_tls1.erl
+++ b/lib/ssl/src/ssl_tls1.erl
@@ -128,11 +128,6 @@ mac_hash(Method, Mac_write_secret, Seq_num, Type, {Major, Minor},
%% HMAC_hash(MAC_write_secret, seq_num + TLSCompressed.type +
%% TLSCompressed.version + TLSCompressed.length +
%% TLSCompressed.fragment));
- case Method of
- ?NULL -> ok;
- _ ->
- ok
- end,
Mac = hmac_hash(Method, Mac_write_secret,
[<<?UINT64(Seq_num), ?BYTE(Type),
?BYTE(Major), ?BYTE(Minor), ?UINT16(Length)>>,
diff --git a/lib/ssl/test/Makefile b/lib/ssl/test/Makefile
index c0a7f8d257..53b2223035 100644
--- a/lib/ssl/test/Makefile
+++ b/lib/ssl/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1999-2010. All Rights Reserved.
+# Copyright Ericsson AB 1999-2011. 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
@@ -60,6 +60,7 @@ ERL_FILES = $(MODULES:%=%.erl)
HRL_FILES = ssl_test_MACHINE.hrl
HRL_FILES_SRC = \
+ ssl_int.hrl \
ssl_alert.hrl \
ssl_handshake.hrl
@@ -126,8 +127,8 @@ release_spec: opt
release_tests_spec: opt
$(INSTALL_DIR) $(RELSYSDIR)
$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(HRL_FILES_NEEDED_IN_TEST) $(COVER_FILE) $(RELSYSDIR)
- $(INSTALL_DATA) ssl.spec $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ $(INSTALL_DATA) ssl.spec ssl.cover $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
@tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
release_docs_spec:
diff --git a/lib/ssl/test/make_certs.erl b/lib/ssl/test/make_certs.erl
index 3c18a905b4..693289990c 100644
--- a/lib/ssl/test/make_certs.erl
+++ b/lib/ssl/test/make_certs.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2010. 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
diff --git a/lib/ssl/test/old_ssl_active_SUITE.erl b/lib/ssl/test/old_ssl_active_SUITE.erl
index d1cec26827..52ff0bcc5d 100644
--- a/lib/ssl/test/old_ssl_active_SUITE.erl
+++ b/lib/ssl/test/old_ssl_active_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -20,11 +20,10 @@
%%
-module(old_ssl_active_SUITE).
--export([all/1,
+-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,
- fin_per_testcase/2,
- config/1,
- finish/1,
+ end_per_testcase/2,
cinit_return_chkclose/1,
sinit_return_chkclose/1,
cinit_big_return_chkclose/1,
@@ -40,7 +39,7 @@
-import(ssl_test_MACHINE, [mk_ssl_cert_opts/1, test_one_listener/7,
test_server_only/6]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("ssl_test_MACHINE.hrl").
-define(MANYCONNS, ssl_test_MACHINE:many_conns()).
@@ -49,33 +48,35 @@ init_per_testcase(_Case, Config) ->
WatchDog = ssl_test_lib:timetrap(?DEFAULT_TIMEOUT),
[{watchdog, WatchDog}| Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
WatchDog = ?config(watchdog, Config),
test_server:timetrap_cancel(WatchDog).
-all(doc) ->
- "Test of ssl.erl interface in active mode.";
-all(suite) ->
- {conf,
- config,
- [cinit_return_chkclose,
- sinit_return_chkclose,
- cinit_big_return_chkclose,
- sinit_big_return_chkclose,
- cinit_big_echo_chkclose,
- cinit_huge_echo_chkclose,
- sinit_big_echo_chkclose,
- cinit_few_echo_chkclose,
- cinit_many_echo_chkclose,
- cinit_cnocert],
- finish}.
-
-config(doc) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [cinit_return_chkclose, sinit_return_chkclose,
+ cinit_big_return_chkclose, sinit_big_return_chkclose,
+ cinit_big_echo_chkclose, cinit_huge_echo_chkclose,
+ sinit_big_echo_chkclose, cinit_few_echo_chkclose,
+ cinit_many_echo_chkclose, cinit_cnocert].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+init_per_suite(doc) ->
"Want to se what Config contains, and record the number of available "
"file descriptors";
-config(suite) ->
+init_per_suite(suite) ->
[];
-config(Config) ->
+init_per_suite(Config) ->
io:format("Config: ~p~n", [Config]),
case os:type() of
{unix, _} ->
@@ -87,20 +88,25 @@ config(Config) ->
%% operating system, version of OTP, Erts, kernel and stdlib.
%% Check if SSL exists. If this case fails, all other cases are skipped
- crypto:start(),
- application:start(public_key),
- case ssl:start() of
- ok -> ssl:stop();
- {error, {already_started, _}} -> ssl:stop();
- Error -> ?t:fail({failed_starting_ssl,Error})
- end,
- Config.
-
-finish(doc) ->
+ case catch crypto:start() of
+ ok ->
+ application:start(public_key),
+ case ssl:start() of
+ ok -> ssl:stop();
+ {error, {already_started, _}} -> ssl:stop();
+ Error -> ?t:fail({failed_starting_ssl,Error})
+ end,
+ Config;
+ _Else ->
+ {skip,"Could not start crypto!"}
+ end.
+
+end_per_suite(doc) ->
"This test case has no mission other than closing the conf case";
-finish(suite) ->
+end_per_suite(suite) ->
[];
-finish(Config) ->
+end_per_suite(Config) ->
+ crypto:stop(),
Config.
cinit_return_chkclose(doc) ->
diff --git a/lib/ssl/test/old_ssl_active_once_SUITE.erl b/lib/ssl/test/old_ssl_active_once_SUITE.erl
index 63eaa730e9..c7beadb301 100644
--- a/lib/ssl/test/old_ssl_active_once_SUITE.erl
+++ b/lib/ssl/test/old_ssl_active_once_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
@@ -20,11 +20,10 @@
%%
-module(old_ssl_active_once_SUITE).
--export([all/1,
+-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,
- fin_per_testcase/2,
- config/1,
- finish/1,
+ end_per_testcase/2,
server_accept_timeout/1,
cinit_return_chkclose/1,
sinit_return_chkclose/1,
@@ -40,7 +39,7 @@
-import(ssl_test_MACHINE, [mk_ssl_cert_opts/1, test_one_listener/7,
test_server_only/6]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("ssl_test_MACHINE.hrl").
-define(MANYCONNS, ssl_test_MACHINE:many_conns()).
@@ -49,50 +48,57 @@ init_per_testcase(_Case, Config) ->
WatchDog = ssl_test_lib:timetrap(?DEFAULT_TIMEOUT),
[{watchdog, WatchDog}| Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
WatchDog = ?config(watchdog, Config),
test_server:timetrap_cancel(WatchDog).
-all(doc) ->
- "Test of ssl.erl interface in passive mode.";
-all(suite) ->
- {conf,
- config,
- [server_accept_timeout,
- cinit_return_chkclose,
- sinit_return_chkclose,
- cinit_big_return_chkclose,
- sinit_big_return_chkclose,
- cinit_big_echo_chkclose,
- cinit_huge_echo_chkclose,
- sinit_big_echo_chkclose,
- cinit_few_echo_chkclose,
- cinit_many_echo_chkclose,
- cinit_cnocert],
- finish}.
-
-config(doc) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [server_accept_timeout, cinit_return_chkclose,
+ sinit_return_chkclose, cinit_big_return_chkclose,
+ sinit_big_return_chkclose, cinit_big_echo_chkclose,
+ cinit_huge_echo_chkclose, sinit_big_echo_chkclose,
+ cinit_few_echo_chkclose, cinit_many_echo_chkclose,
+ cinit_cnocert].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+init_per_suite(doc) ->
"Want to se what Config contains.";
-config(suite) ->
+init_per_suite(suite) ->
[];
-config(Config) ->
+init_per_suite(Config) ->
io:format("Config: ~p~n", [Config]),
%% Check if SSL exists. If this case fails, all other cases are skipped
- crypto:start(),
- application:start(public_key),
- case ssl:start() of
- ok -> ssl:stop();
- {error, {already_started, _}} -> ssl:stop();
- Error -> ?t:fail({failed_starting_ssl,Error})
- end,
- Config.
-
-finish(doc) ->
+ case catch crypto:start() of
+ ok ->
+ application:start(public_key),
+ case ssl:start() of
+ ok -> ssl:stop();
+ {error, {already_started, _}} -> ssl:stop();
+ Error -> ?t:fail({failed_starting_ssl,Error})
+ end,
+ Config;
+ _Else ->
+ {skip,"Could not start crypto"}
+ end.
+
+end_per_suite(doc) ->
"This test case has no mission other than closing the conf case";
-finish(suite) ->
+end_per_suite(suite) ->
[];
-finish(Config) ->
+end_per_suite(Config) ->
+ crypto:stop(),
Config.
server_accept_timeout(doc) ->
diff --git a/lib/ssl/test/old_ssl_dist_SUITE.erl b/lib/ssl/test/old_ssl_dist_SUITE.erl
index 97090c1409..4544fb616a 100644
--- a/lib/ssl/test/old_ssl_dist_SUITE.erl
+++ b/lib/ssl/test/old_ssl_dist_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -29,39 +29,55 @@
%%%-------------------------------------------------------------------
-module(old_ssl_dist_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(DEFAULT_TIMETRAP_SECS, 240).
-define(AWAIT_SLL_NODE_UP_TIMEOUT, 30000).
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]).
-export([init_per_suite/1,
end_per_suite/1,
init_per_testcase/2,
- fin_per_testcase/2]).
+ end_per_testcase/2]).
-export([cnct2tstsrvr/1]).
-export([basic/1]).
-record(node_handle, {connection_handler, socket, name, nodename}).
-all(doc) ->
- [];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[basic].
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
init_per_suite(Config) ->
- add_ssl_opts_config(Config).
+ try crypto:start() of
+ ok ->
+ add_ssl_opts_config(Config)
+ catch _:_ ->
+ {skip, "Crypto did not start"}
+ end.
end_per_suite(Config) ->
+ application:stop(crypto),
Config.
init_per_testcase(Case, Config) when list(Config) ->
Dog = ?t:timetrap(?t:seconds(?DEFAULT_TIMETRAP_SECS)),
[{watchdog, Dog},{testcase, Case}|Config].
-fin_per_testcase(_Case, Config) when list(Config) ->
+end_per_testcase(_Case, Config) when list(Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
diff --git a/lib/ssl/test/old_ssl_misc_SUITE.erl b/lib/ssl/test/old_ssl_misc_SUITE.erl
index 2767123a12..ea03e83867 100644
--- a/lib/ssl/test/old_ssl_misc_SUITE.erl
+++ b/lib/ssl/test/old_ssl_misc_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -20,18 +20,17 @@
%%
-module(old_ssl_misc_SUITE).
--export([all/1,
+-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,
- fin_per_testcase/2,
- config/1,
- finish/1,
+ end_per_testcase/2,
seed/1,
app/1
]).
-import(ssl_test_MACHINE, [mk_ssl_cert_opts/1, test_one_listener/7,
test_server_only/6]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("ssl_test_MACHINE.hrl").
-define(MANYCONNS, 5).
@@ -40,41 +39,52 @@ init_per_testcase(_Case, Config) ->
WatchDog = ssl_test_lib:timetrap(?DEFAULT_TIMEOUT),
[{watchdog, WatchDog}| Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
WatchDog = ?config(watchdog, Config),
test_server:timetrap_cancel(WatchDog).
-all(doc) ->
- "Test of misc in ssl.erl interface.";
-all(suite) ->
- {conf,
- config,
- [seed, app],
- finish
- }.
+suite() -> [{ct_hooks,[ts_install_cth]}].
-config(doc) ->
+all() ->
+ [seed, app].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+init_per_suite(doc) ->
"Want to se what Config contains.";
-config(suite) ->
+init_per_suite(suite) ->
[];
-config(Config) ->
+init_per_suite(Config) ->
io:format("Config: ~p~n", [Config]),
%% Check if SSL exists. If this case fails, all other cases are skipped
- crypto:start(),
- application:start(public_key),
- case ssl:start() of
- ok -> ssl:stop();
- {error, {already_started, _}} -> ssl:stop();
- Error -> ?t:fail({failed_starting_ssl,Error})
- end,
- Config.
-
-finish(doc) ->
+ case catch crypto:start() of
+ ok ->
+ application:start(public_key),
+ case ssl:start() of
+ ok -> ssl:stop();
+ {error, {already_started, _}} -> ssl:stop();
+ Error -> ?t:fail({failed_starting_ssl,Error})
+ end,
+ Config;
+ _Else ->
+ {skip,"Could not start crypto!"}
+ end.
+
+end_per_suite(doc) ->
"This test case has no mission other than closing the conf case";
-finish(suite) ->
+end_per_suite(suite) ->
[];
-finish(Config) ->
+end_per_suite(Config) ->
+ crypto:stop(),
Config.
seed(doc) ->
diff --git a/lib/ssl/test/old_ssl_passive_SUITE.erl b/lib/ssl/test/old_ssl_passive_SUITE.erl
index 96a7938583..7b54fe876a 100644
--- a/lib/ssl/test/old_ssl_passive_SUITE.erl
+++ b/lib/ssl/test/old_ssl_passive_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -20,11 +20,10 @@
%%
-module(old_ssl_passive_SUITE).
--export([all/1,
+-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,
- fin_per_testcase/2,
- config/1,
- finish/1,
+ end_per_testcase/2,
server_accept_timeout/1,
cinit_return_chkclose/1,
sinit_return_chkclose/1,
@@ -40,7 +39,7 @@
-import(ssl_test_MACHINE, [mk_ssl_cert_opts/1, test_one_listener/7,
test_server_only/6]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("ssl_test_MACHINE.hrl").
-define(MANYCONNS, ssl_test_MACHINE:many_conns()).
@@ -49,49 +48,56 @@ init_per_testcase(_Case, Config) ->
WatchDog = ssl_test_lib:timetrap(?DEFAULT_TIMEOUT),
[{watchdog, WatchDog}| Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
WatchDog = ?config(watchdog, Config),
test_server:timetrap_cancel(WatchDog).
-all(doc) ->
- "Test of ssl.erl interface in passive mode.";
-all(suite) ->
- {conf,
- config,
- [server_accept_timeout,
- cinit_return_chkclose,
- sinit_return_chkclose,
- cinit_big_return_chkclose,
- sinit_big_return_chkclose,
- cinit_big_echo_chkclose,
- sinit_big_echo_chkclose,
- cinit_few_echo_chkclose,
- cinit_many_echo_chkclose,
- cinit_cnocert],
- finish}.
-
-config(doc) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [server_accept_timeout, cinit_return_chkclose,
+ sinit_return_chkclose, cinit_big_return_chkclose,
+ sinit_big_return_chkclose, cinit_big_echo_chkclose,
+ sinit_big_echo_chkclose, cinit_few_echo_chkclose,
+ cinit_many_echo_chkclose, cinit_cnocert].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+init_per_suite(doc) ->
"Want to se what Config contains.";
-config(suite) ->
+init_per_suite(suite) ->
[];
-config(Config) ->
+init_per_suite(Config) ->
io:format("Config: ~p~n", [Config]),
%% Check if SSL exists. If this case fails, all other cases are skipped
- crypto:start(),
- application:start(public_key),
- case ssl:start() of
- ok -> ssl:stop();
- {error, {already_started, _}} -> ssl:stop();
- Error -> ?t:fail({failed_starting_ssl,Error})
- end,
- Config.
-
-finish(doc) ->
+ case catch crypto:start() of
+ ok ->
+ application:start(public_key),
+ case ssl:start() of
+ ok -> ssl:stop();
+ {error, {already_started, _}} -> ssl:stop();
+ Error -> ?t:fail({failed_starting_ssl,Error})
+ end,
+ Config;
+ _Else ->
+ {skip,"Could not start crypto"}
+ end.
+
+end_per_suite(doc) ->
"This test case has no mission other than closing the conf case";
-finish(suite) ->
+end_per_suite(suite) ->
[];
-finish(Config) ->
+end_per_suite(Config) ->
+ crypto:stop(),
Config.
server_accept_timeout(doc) ->
diff --git a/lib/ssl/test/old_ssl_peer_cert_SUITE.erl b/lib/ssl/test/old_ssl_peer_cert_SUITE.erl
index e5b3975d41..ee19bad175 100644
--- a/lib/ssl/test/old_ssl_peer_cert_SUITE.erl
+++ b/lib/ssl/test/old_ssl_peer_cert_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -20,11 +20,10 @@
%%
-module(old_ssl_peer_cert_SUITE).
--export([all/1,
+-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,
- fin_per_testcase/2,
- config/1,
- finish/1,
+ end_per_testcase/2,
cinit_plain/1,
cinit_both_verify/1,
cinit_cnocert/1
@@ -32,7 +31,7 @@
-import(ssl_test_MACHINE, [mk_ssl_cert_opts/1, test_one_listener/7,
test_server_only/6]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("ssl_test_MACHINE.hrl").
@@ -40,42 +39,52 @@ init_per_testcase(_Case, Config) ->
WatchDog = ssl_test_lib:timetrap(?DEFAULT_TIMEOUT),
[{watchdog, WatchDog}| Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
WatchDog = ?config(watchdog, Config),
test_server:timetrap_cancel(WatchDog).
-all(doc) ->
- "Test of ssl verification and peer certificate retrieval.";
-all(suite) ->
- {conf,
- config,
- [cinit_plain,
- cinit_both_verify,
- cinit_cnocert],
- finish}.
-
-config(doc) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [cinit_plain, cinit_both_verify, cinit_cnocert].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+init_per_suite(doc) ->
"Want to se what Config contains.";
-config(suite) ->
+init_per_suite(suite) ->
[];
-config(Config) ->
+init_per_suite(Config) ->
io:format("Config: ~p~n", [Config]),
%% Check if SSL exists. If this case fails, all other cases are skipped
- crypto:start(),
- application:start(public_key),
- case ssl:start() of
- ok -> ssl:stop();
- {error, {already_started, _}} -> ssl:stop();
- Error -> ?t:fail({failed_starting_ssl,Error})
- end,
- Config.
-
-finish(doc) ->
+ case catch crypto:start() of
+ ok ->
+ application:start(public_key),
+ case ssl:start() of
+ ok -> ssl:stop();
+ {error, {already_started, _}} -> ssl:stop();
+ Error -> ?t:fail({failed_starting_ssl,Error})
+ end,
+ Config;
+ _Else ->
+ {skip,"Could not start crypto"}
+ end.
+
+end_per_suite(doc) ->
"This test case has no mission other than closing the conf case";
-finish(suite) ->
+end_per_suite(suite) ->
[];
-finish(Config) ->
+end_per_suite(Config) ->
+ crypto:stop(),
Config.
cinit_plain(doc) ->
diff --git a/lib/ssl/test/old_ssl_protocol_SUITE.erl b/lib/ssl/test/old_ssl_protocol_SUITE.erl
index efdbf45a3d..9b9937c210 100644
--- a/lib/ssl/test/old_ssl_protocol_SUITE.erl
+++ b/lib/ssl/test/old_ssl_protocol_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -20,13 +20,15 @@
%%
-module(old_ssl_protocol_SUITE).
--export([all/1, init_per_testcase/2, fin_per_testcase/2, config/1,
- finish/1, sslv2/1, sslv3/1, tlsv1/1, sslv2_sslv3/1,
+-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,
+ sslv2/1, sslv3/1, tlsv1/1, sslv2_sslv3/1,
sslv2_tlsv1/1, sslv3_tlsv1/1, sslv2_sslv3_tlsv1/1]).
-import(ssl_test_MACHINE, [mk_ssl_cert_opts/1, test_one_listener/7,
test_server_only/6]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("ssl_test_MACHINE.hrl").
@@ -34,41 +36,53 @@ init_per_testcase(_Case, Config) ->
WatchDog = test_server:timetrap(?DEFAULT_TIMEOUT),
[{watchdog, WatchDog}| Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
WatchDog = ?config(watchdog, Config),
test_server:timetrap_cancel(WatchDog).
-all(doc) ->
- "Test of configuration protocol_version.";
-all(suite) ->
- {conf,
- config,
- [sslv2, sslv3, tlsv1, sslv2_sslv3, sslv2_tlsv1, sslv3_tlsv1,
- sslv2_sslv3_tlsv1],
- finish}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
-config(doc) ->
+all() ->
+ [sslv2, sslv3, tlsv1, sslv2_sslv3, sslv2_tlsv1,
+ sslv3_tlsv1, sslv2_sslv3_tlsv1].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+init_per_suite(doc) ->
"Want to se what Config contains.";
-config(suite) ->
+init_per_suite(suite) ->
[];
-config(Config) ->
+init_per_suite(Config) ->
io:format("Config: ~p~n", [Config]),
%% Check if SSL exists. If this case fails, all other cases are skipped
- crypto:start(),
- application:start(public_key),
- case ssl:start() of
- ok -> ssl:stop();
- {error, {already_started, _}} -> ssl:stop();
- Error -> ?t:fail({failed_starting_ssl,Error})
- end,
- Config.
-
-finish(doc) ->
+ case catch crypto:start() of
+ ok ->
+ application:start(public_key),
+ case ssl:start() of
+ ok -> ssl:stop();
+ {error, {already_started, _}} -> ssl:stop();
+ Error -> ?t:fail({failed_starting_ssl,Error})
+ end,
+ Config;
+ _Else ->
+ {skip,"Could not start crypto"}
+ end.
+
+end_per_suite(doc) ->
"This test case has no other purpose than closing the conf case.";
-finish(suite) ->
+end_per_suite(suite) ->
[];
-finish(Config) ->
+end_per_suite(Config) ->
+ crypto:stop(),
Config.
%%%%%
diff --git a/lib/ssl/test/old_ssl_verify_SUITE.erl b/lib/ssl/test/old_ssl_verify_SUITE.erl
index 7a8cd1578a..4c11ea6850 100644
--- a/lib/ssl/test/old_ssl_verify_SUITE.erl
+++ b/lib/ssl/test/old_ssl_verify_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -20,18 +20,17 @@
%%
-module(old_ssl_verify_SUITE).
--export([all/1,
+-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,
- fin_per_testcase/2,
- config/1,
- finish/1,
+ end_per_testcase/2,
cinit_both_verify/1,
cinit_cnocert/1
]).
-import(ssl_test_MACHINE, [mk_ssl_cert_opts/1, test_one_listener/7,
test_server_only/6]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("ssl_test_MACHINE.hrl").
@@ -39,41 +38,52 @@ init_per_testcase(_Case, Config) ->
WatchDog = ssl_test_lib:timetrap(?DEFAULT_TIMEOUT),
[{watchdog, WatchDog}| Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
WatchDog = ?config(watchdog, Config),
test_server:timetrap_cancel(WatchDog).
-all(doc) ->
- "Test of ssl.erl interface in active mode.";
-all(suite) ->
- {conf,
- config,
- [cinit_both_verify,
- cinit_cnocert],
- finish}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
-config(doc) ->
+all() ->
+ [cinit_both_verify, cinit_cnocert].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+init_per_suite(doc) ->
"Want to se what Config contains.";
-config(suite) ->
+init_per_suite(suite) ->
[];
-config(Config) ->
+init_per_suite(Config) ->
io:format("Config: ~p~n", [Config]),
%% Check if SSL exists. If this case fails, all other cases are skipped
- crypto:start(),
- application:start(public_key),
- case ssl:start() of
- ok -> ssl:stop();
- {error, {already_started, _}} -> ssl:stop();
- Error -> ?t:fail({failed_starting_ssl,Error})
- end,
- Config.
-
-finish(doc) ->
+ case catch crypto:start() of
+ ok ->
+ application:start(public_key),
+ case ssl:start() of
+ ok -> ssl:stop();
+ {error, {already_started, _}} -> ssl:stop();
+ Error -> ?t:fail({failed_starting_ssl,Error})
+ end,
+ Config;
+ _Else ->
+ {skip,"Could not start crypto"}
+ end.
+
+end_per_suite(doc) ->
"This test case has no mission other than closing the conf case";
-finish(suite) ->
+end_per_suite(suite) ->
[];
-finish(Config) ->
+end_per_suite(Config) ->
+ crypto:stop(),
Config.
cinit_both_verify(doc) ->
diff --git a/lib/ssl/test/old_transport_accept_SUITE.erl b/lib/ssl/test/old_transport_accept_SUITE.erl
index 71c1d9e181..6f0c8e456b 100644
--- a/lib/ssl/test/old_transport_accept_SUITE.erl
+++ b/lib/ssl/test/old_transport_accept_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -19,16 +19,17 @@
%%
-module(old_transport_accept_SUITE).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include("test_server_line.hrl").
%% Default timetrap timeout (set in init_per_testcase).
-define(default_timeout, ?t:minutes(1)).
-define(application, ssh).
--export([all/1,
+-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,
- fin_per_testcase/2,
+ end_per_testcase/2,
config/1,
echo_once/1,
echo_twice/1,
@@ -43,15 +44,37 @@ init_per_testcase(_Case, Config) ->
[{watchdog, WatchDog}, {protomod, gen_tcp}, {serialize_accept, true}|
Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
WatchDog = ?config(watchdog, Config),
test_server:timetrap_cancel(WatchDog).
-all(doc) ->
- "Test transport_accept and ssl_accept";
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[config, echo_once, echo_twice, close_before_ssl_accept].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ try crypto:start() of
+ ok ->
+ Config
+ catch _:_ ->
+ {skip, "Crypto did not start"}
+ end.
+
+end_per_suite(_Config) ->
+ application:stop(crypto),
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
config(doc) ->
"Want to se what Config contains.";
config(suite) ->
diff --git a/lib/ssl/test/ssl.cover b/lib/ssl/test/ssl.cover
index e8daa363c5..60774cc0f1 100644
--- a/lib/ssl/test/ssl.cover
+++ b/lib/ssl/test/ssl.cover
@@ -1,19 +1,21 @@
-{exclude, [ssl_pkix_oid,
- 'PKIX1Algorithms88',
- 'PKIX1Explicit88',
- 'PKIX1Implicit88',
- 'PKIXAttributeCertificate',
- 'SSL-PKIX',
- ssl_pem,
- ssl_pkix,
- ssl_base64,
- ssl_broker,
- ssl_broker_int,
- ssl_broker_sup,
- ssl_debug,
- ssl_server,
- ssl_prim,
- inet_ssl_dist,
- 'OTP-PKIX'
+{incl_app,ssl,details}.
+
+{excl_mods, ssl, [ssl_pkix_oid,
+ 'PKIX1Algorithms88',
+ 'PKIX1Explicit88',
+ 'PKIX1Implicit88',
+ 'PKIXAttributeCertificate',
+ 'SSL-PKIX',
+ ssl_pem,
+ ssl_pkix,
+ ssl_base64,
+ ssl_broker,
+ ssl_broker_int,
+ ssl_broker_sup,
+ ssl_debug,
+ ssl_server,
+ ssl_prim,
+ inet_ssl_dist,
+ 'OTP-PKIX'
]}.
diff --git a/lib/ssl/test/ssl.spec b/lib/ssl/test/ssl.spec
index 6ef4fb73db..fc7c1bbb82 100644
--- a/lib/ssl/test/ssl.spec
+++ b/lib/ssl/test/ssl.spec
@@ -1 +1 @@
-{topcase, {dir, "../ssl_test"}}.
+{suites,"../ssl_test",all}.
diff --git a/lib/ssl/test/ssl_basic_SUITE.erl b/lib/ssl/test/ssl_basic_SUITE.erl
index 8f9554f3ce..4f0907027f 100644
--- a/lib/ssl/test/ssl_basic_SUITE.erl
+++ b/lib/ssl/test/ssl_basic_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -24,10 +24,12 @@
%% Note: This directive should only be used in test suites.
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include("test_server_line.hrl").
-include_lib("public_key/include/public_key.hrl").
+
-include("ssl_alert.hrl").
+-include("ssl_int.hrl").
-define('24H_in_sec', 86400).
-define(TIMEOUT, 60000).
@@ -47,20 +49,23 @@
%%--------------------------------------------------------------------
init_per_suite(Config0) ->
Dog = ssl_test_lib:timetrap(?LONG_TIMEOUT *2),
- crypto:start(),
- application:start(public_key),
- ssl:start(),
-
- %% make rsa certs using oppenssl
- Result =
- (catch make_certs:all(?config(data_dir, Config0),
- ?config(priv_dir, Config0))),
- test_server:format("Make certs ~p~n", [Result]),
-
- Config1 = ssl_test_lib:make_dsa_cert(Config0),
- Config = ssl_test_lib:cert_options(Config1),
- [{watchdog, Dog} | Config].
-
+ try crypto:start() of
+ ok ->
+ application:start(public_key),
+ ssl:start(),
+
+ %% make rsa certs using oppenssl
+ Result =
+ (catch make_certs:all(?config(data_dir, Config0),
+ ?config(priv_dir, Config0))),
+ test_server:format("Make certs ~p~n", [Result]),
+
+ Config1 = ssl_test_lib:make_dsa_cert(Config0),
+ Config = ssl_test_lib:cert_options(Config1),
+ [{watchdog, Dog} | Config]
+ catch _:_ ->
+ {skip, "Crypto did not start"}
+ end.
%%--------------------------------------------------------------------
%% Function: end_per_suite(Config) -> _
%% Config - [tuple()]
@@ -69,7 +74,7 @@ init_per_suite(Config0) ->
%%--------------------------------------------------------------------
end_per_suite(_Config) ->
ssl:stop(),
- crypto:stop().
+ application:stop(crypto).
%%--------------------------------------------------------------------
%% Function: init_per_testcase(TestCase, Config) -> Config
@@ -84,6 +89,13 @@ end_per_suite(_Config) ->
%% variable, but should NOT alter/remove any existing entries.
%% Description: Initialization before each test case
%%--------------------------------------------------------------------
+init_per_testcase(session_cache_process_list, Config) ->
+ init_customized_session_cache(list, Config);
+
+init_per_testcase(session_cache_process_mnesia, Config) ->
+ mnesia:start(),
+ init_customized_session_cache(mnesia, Config);
+
init_per_testcase(reuse_session_expired, Config0) ->
Config = lists:keydelete(watchdog, 1, Config0),
Dog = ssl_test_lib:timetrap(?EXPIRE * 1000 * 5),
@@ -125,11 +137,24 @@ init_per_testcase(empty_protocol_versions, Config) ->
ssl:start(),
Config;
+init_per_testcase(different_ca_peer_sign, Config0) ->
+ ssl_test_lib:make_mix_cert(Config0);
+
init_per_testcase(_TestCase, Config0) ->
Config = lists:keydelete(watchdog, 1, Config0),
Dog = test_server:timetrap(?TIMEOUT),
[{watchdog, Dog} | Config].
+init_customized_session_cache(Type, Config0) ->
+ Config = lists:keydelete(watchdog, 1, Config0),
+ Dog = test_server:timetrap(?TIMEOUT),
+ ssl:stop(),
+ application:load(ssl),
+ application:set_env(ssl, session_cb, ?MODULE),
+ application:set_env(ssl, session_cb_init_args, [Type]),
+ ssl:start(),
+ [{watchdog, Dog} | Config].
+
%%--------------------------------------------------------------------
%% Function: end_per_testcase(TestCase, Config) -> _
%% Case - atom()
@@ -138,6 +163,16 @@ init_per_testcase(_TestCase, Config0) ->
%% A list of key/value pairs, holding the test case configuration.
%% Description: Cleanup after each test case
%%--------------------------------------------------------------------
+end_per_testcase(session_cache_process_list, Config) ->
+ application:unset_env(ssl, session_cb),
+ end_per_testcase(default_action, Config);
+end_per_testcase(session_cache_process_mnesia, Config) ->
+ application:unset_env(ssl, session_cb),
+ application:unset_env(ssl, session_cb_init_args),
+ mnesia:stop(),
+ ssl:stop(),
+ ssl:start(),
+ end_per_testcase(default_action, Config);
end_per_testcase(reuse_session_expired, Config) ->
application:unset_env(ssl, session_lifetime),
end_per_testcase(default_action, Config);
@@ -166,48 +201,69 @@ end_per_testcase(_TestCase, Config) ->
%% Name of a test case.
%% Description: Returns a list of all test cases in this test suite
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test the basic ssl functionality"];
+suite() -> [{ct_hooks,[ts_install_cth]}].
-all(suite) ->
+all() ->
[app, alerts, connection_info, protocol_versions,
- empty_protocol_versions, controlling_process, controller_dies,
- client_closes_socket, peercert, connect_dist, peername, sockname,
- socket_options, misc_ssl_options, versions, cipher_suites,
- upgrade, upgrade_with_timeout, tcp_connect, ipv6, ekeyfile,
- ecertfile, ecacertfile, eoptions, shutdown, shutdown_write,
- shutdown_both, shutdown_error,
+ empty_protocol_versions, controlling_process,
+ controller_dies, client_closes_socket, peercert,
+ connect_dist, peername, sockname, socket_options,
+ misc_ssl_options, versions, cipher_suites, upgrade,
+ upgrade_with_timeout, tcp_connect, ipv6, ekeyfile,
+ ecertfile, ecacertfile, eoptions, shutdown,
+ shutdown_write, shutdown_both, shutdown_error,
ciphers_rsa_signed_certs, ciphers_rsa_signed_certs_ssl3,
ciphers_rsa_signed_certs_openssl_names,
ciphers_rsa_signed_certs_openssl_names_ssl3,
- ciphers_dsa_signed_certs,
- ciphers_dsa_signed_certs_ssl3,
+ ciphers_dsa_signed_certs, ciphers_dsa_signed_certs_ssl3,
ciphers_dsa_signed_certs_openssl_names,
ciphers_dsa_signed_certs_openssl_names_ssl3,
anonymous_cipher_suites,
default_reject_anonymous,
send_close,
- close_transport_accept, dh_params, server_verify_peer_passive,
- server_verify_peer_active, server_verify_peer_active_once,
+ close_transport_accept, dh_params,
+ server_verify_peer_passive, server_verify_peer_active,
+ server_verify_peer_active_once,
server_verify_none_passive, server_verify_none_active,
- server_verify_none_active_once, server_verify_no_cacerts,
- server_require_peer_cert_ok, server_require_peer_cert_fail,
+ server_verify_none_active_once,
+ server_verify_no_cacerts, server_require_peer_cert_ok,
+ server_require_peer_cert_fail,
server_verify_client_once_passive,
server_verify_client_once_active,
- server_verify_client_once_active_once, client_verify_none_passive,
- client_verify_none_active, client_verify_none_active_once,
- reuse_session, reuse_session_expired,
- server_does_not_want_to_reuse_session, client_renegotiate,
- server_renegotiate, client_renegotiate_reused_session,
- server_renegotiate_reused_session, client_no_wrap_sequence_number,
- server_no_wrap_sequence_number, extended_key_usage,
- no_authority_key_identifier,
- invalid_signature_client, invalid_signature_server, cert_expired,
- client_with_cert_cipher_suites_handshake, unknown_server_ca_fail,
- der_input, unknown_server_ca_accept_verify_none, unknown_server_ca_accept_verify_peer,
- unknown_server_ca_accept_backwardscompatibilty
+ server_verify_client_once_active_once,
+ client_verify_none_passive, client_verify_none_active,
+ client_verify_none_active_once,
+ reuse_session,
+ reuse_session_expired,
+ server_does_not_want_to_reuse_session,
+ client_renegotiate, server_renegotiate,
+ client_renegotiate_reused_session,
+ server_renegotiate_reused_session,
+ client_no_wrap_sequence_number,
+ server_no_wrap_sequence_number, extended_key_usage_verify_peer,
+ extended_key_usage_verify_none,
+ no_authority_key_identifier, invalid_signature_client,
+ invalid_signature_server, cert_expired,
+ client_with_cert_cipher_suites_handshake,
+ unknown_server_ca_fail, der_input,
+ unknown_server_ca_accept_verify_none,
+ unknown_server_ca_accept_verify_peer,
+ unknown_server_ca_accept_backwardscompatibilty,
+ %%different_ca_peer_sign,
+ no_reuses_session_server_restart_new_cert,
+ no_reuses_session_server_restart_new_cert_file, reuseaddr,
+ hibernate
].
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% Test cases starts here.
%%--------------------------------------------------------------------
app(doc) ->
@@ -321,7 +377,6 @@ basic_test(Config) ->
ssl_test_lib:close(Server),
ssl_test_lib:close(Client).
-
%%--------------------------------------------------------------------
controlling_process(doc) ->
@@ -521,9 +576,7 @@ client_closes_socket(Config) when is_list(Config) ->
_Client = spawn_link(Connect),
- ssl_test_lib:check_result(Server, {error,closed}),
-
- ssl_test_lib:close(Server).
+ ssl_test_lib:check_result(Server, {error,closed}).
%%--------------------------------------------------------------------
@@ -738,7 +791,6 @@ socket_options(Config) when is_list(Config) ->
ssl_test_lib:check_result(Server, ok, Client, ok),
ssl_test_lib:close(Server),
- ssl_test_lib:close(Client),
{ok, Listen} = ssl:listen(0, ServerOpts),
{ok,[{mode,list}]} = ssl:getopts(Listen, [mode]),
@@ -841,6 +893,7 @@ send_recv(Config) when is_list(Config) ->
ssl_test_lib:close(Server),
ssl_test_lib:close(Client).
+%%--------------------------------------------------------------------
send_close(doc) ->
[""];
@@ -867,8 +920,7 @@ send_close(Config) when is_list(Config) ->
ok = ssl:send(SslS, "Hello world"),
{ok,<<"Hello world">>} = ssl:recv(SslS, 11),
gen_tcp:close(TcpS),
- {error, _} = ssl:send(SslS, "Hello world"),
- ssl_test_lib:close(Server).
+ {error, _} = ssl:send(SslS, "Hello world").
%%--------------------------------------------------------------------
close_transport_accept(doc) ->
@@ -1043,8 +1095,7 @@ tcp_connect(Config) when is_list(Config) ->
{Server, {error, Error}} ->
test_server:format("Error ~p", [Error])
end
- end,
- ssl_test_lib:close(Server).
+ end.
dummy(_Socket) ->
@@ -1053,6 +1104,8 @@ dummy(_Socket) ->
exit(kill).
%%--------------------------------------------------------------------
+ipv6() ->
+ [{require, ipv6_hosts}].
ipv6(doc) ->
["Test ipv6."];
ipv6(suite) ->
@@ -1060,7 +1113,7 @@ ipv6(suite) ->
ipv6(Config) when is_list(Config) ->
{ok, Hostname0} = inet:gethostname(),
- case lists:member(list_to_atom(Hostname0), ?config(ipv6_hosts, Config)) of
+ case lists:member(list_to_atom(Hostname0), ct:get_config(ipv6_hosts)) of
true ->
ClientOpts = ?config(client_opts, Config),
ServerOpts = ?config(server_opts, Config),
@@ -1149,13 +1202,13 @@ ecertfile(Config) when is_list(Config) ->
%%--------------------------------------------------------------------
-ecacertfile(doc) ->
+ecacertfile(doc) ->
["Test what happens with an invalid cacert file"];
-ecacertfile(suite) ->
+ecacertfile(suite) ->
[];
-ecacertfile(Config) when is_list(Config) ->
+ecacertfile(Config) when is_list(Config) ->
ClientOpts = [{reuseaddr, true}|?config(client_opts, Config)],
ServerBadOpts = [{reuseaddr, true}|?config(server_bad_ca, Config)],
{ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
@@ -1532,7 +1585,7 @@ erlang_cipher_suite(Suite) ->
Suite.
cipher(CipherSuite, Version, Config, ClientOpts, ServerOpts) ->
- process_flag(trap_exit, true),
+ %% process_flag(trap_exit, true),
test_server:format("Testing CipherSuite ~p~n", [CipherSuite]),
{ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
@@ -1556,16 +1609,8 @@ cipher(CipherSuite, Version, Config, ClientOpts, ServerOpts) ->
Result = ssl_test_lib:wait_for_result(Server, ok, Client, ok),
ssl_test_lib:close(Server),
- receive
- {'EXIT', Server, normal} ->
- ok
- end,
ssl_test_lib:close(Client),
- receive
- {'EXIT', Client, normal} ->
- ok
- end,
- process_flag(trap_exit, false),
+
case Result of
ok ->
[];
@@ -1607,7 +1652,6 @@ reuse_session(suite) ->
[];
reuse_session(Config) when is_list(Config) ->
- process_flag(trap_exit, true),
ClientOpts = ?config(client_opts, Config),
ServerOpts = ?config(server_opts, Config),
{ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
@@ -1615,13 +1659,13 @@ reuse_session(Config) when is_list(Config) ->
Server =
ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
{from, self()},
- {mfa, {?MODULE, session_info_result, []}},
- {options, ServerOpts}]),
+ {mfa, {?MODULE, session_info_result, []}},
+ {options, ServerOpts}]),
Port = ssl_test_lib:inet_port(Server),
Client0 =
ssl_test_lib:start_client([{node, ClientNode},
{port, Port}, {host, Hostname},
- {mfa, {ssl_test_lib, no_result, []}},
+ {mfa, {ssl_test_lib, no_result, []}},
{from, self()}, {options, ClientOpts}]),
SessionInfo =
receive
@@ -1629,16 +1673,16 @@ reuse_session(Config) when is_list(Config) ->
Info
end,
- Server ! listen,
+ Server ! {listen, {mfa, {ssl_test_lib, no_result, []}}},
%% Make sure session is registered
test_server:sleep(?SLEEP),
Client1 =
- ssl_test_lib:start_client([{node, ClientNode},
- {port, Port}, {host, Hostname},
- {mfa, {?MODULE, session_info_result, []}},
- {from, self()}, {options, ClientOpts}]),
+ ssl_test_lib:start_client([{node, ClientNode},
+ {port, Port}, {host, Hostname},
+ {mfa, {?MODULE, session_info_result, []}},
+ {from, self()}, {options, ClientOpts}]),
receive
{Client1, SessionInfo} ->
ok;
@@ -1648,10 +1692,10 @@ reuse_session(Config) when is_list(Config) ->
test_server:fail(session_not_reused)
end,
- Server ! listen,
+ Server ! {listen, {mfa, {ssl_test_lib, no_result, []}}},
Client2 =
- ssl_test_lib:start_client([{node, ClientNode},
+ ssl_test_lib:start_client([{node, ClientNode},
{port, Port}, {host, Hostname},
{mfa, {?MODULE, session_info_result, []}},
{from, self()}, {options, [{reuse_sessions, false}
@@ -1665,10 +1709,6 @@ reuse_session(Config) when is_list(Config) ->
end,
ssl_test_lib:close(Server),
- ssl_test_lib:close(Client0),
- ssl_test_lib:close(Client1),
- ssl_test_lib:close(Client2),
-
Server1 =
ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
@@ -1680,7 +1720,7 @@ reuse_session(Config) when is_list(Config) ->
Client3 =
ssl_test_lib:start_client([{node, ClientNode},
{port, Port1}, {host, Hostname},
- {mfa, {?MODULE, session_info_result, []}},
+ {mfa, {ssl_test_lib, no_result, []}},
{from, self()}, {options, ClientOpts}]),
SessionInfo1 =
@@ -1689,7 +1729,7 @@ reuse_session(Config) when is_list(Config) ->
Info1
end,
- Server1 ! listen,
+ Server1 ! {listen, {mfa, {ssl_test_lib, no_result, []}}},
%% Make sure session is registered
test_server:sleep(?SLEEP),
@@ -1705,14 +1745,16 @@ reuse_session(Config) when is_list(Config) ->
test_server:fail(
session_reused_when_session_reuse_disabled_by_server);
{Client4, _Other} ->
+ test_server:format("OTHER: ~p ~n", [_Other]),
ok
end,
-
+
ssl_test_lib:close(Server1),
+ ssl_test_lib:close(Client0),
+ ssl_test_lib:close(Client1),
+ ssl_test_lib:close(Client2),
ssl_test_lib:close(Client3),
- ssl_test_lib:close(Client4),
- process_flag(trap_exit, false).
-
+ ssl_test_lib:close(Client4).
session_info_result(Socket) ->
ssl:session_info(Socket).
@@ -1725,7 +1767,6 @@ reuse_session_expired(suite) ->
[];
reuse_session_expired(Config) when is_list(Config) ->
- process_flag(trap_exit, true),
ClientOpts = ?config(client_opts, Config),
ServerOpts = ?config(server_opts, Config),
{ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
@@ -1746,8 +1787,8 @@ reuse_session_expired(Config) when is_list(Config) ->
{Server, Info} ->
Info
end,
-
- Server ! listen,
+
+ Server ! {listen, {mfa, {ssl_test_lib, no_result, []}}},
%% Make sure session is registered
test_server:sleep(?SLEEP),
@@ -1767,7 +1808,7 @@ reuse_session_expired(Config) when is_list(Config) ->
end,
Server ! listen,
-
+
%% Make sure session is unregistered due to expiration
test_server:sleep((?EXPIRE+1) * 1000),
@@ -1782,12 +1823,12 @@ reuse_session_expired(Config) when is_list(Config) ->
{Client2, _} ->
ok
end,
-
+ process_flag(trap_exit, false),
ssl_test_lib:close(Server),
ssl_test_lib:close(Client0),
ssl_test_lib:close(Client1),
- ssl_test_lib:close(Client2),
- process_flag(trap_exit, false).
+ ssl_test_lib:close(Client2).
+
%%--------------------------------------------------------------------
server_does_not_want_to_reuse_session(doc) ->
["Test reuse of sessions (short handshake)"];
@@ -1820,10 +1861,11 @@ server_does_not_want_to_reuse_session(Config) when is_list(Config) ->
Info
end,
- Server ! listen,
+ Server ! {listen, {mfa, {ssl_test_lib, no_result, []}}},
%% Make sure session is registered
test_server:sleep(?SLEEP),
+ ssl_test_lib:close(Client0),
Client1 =
ssl_test_lib:start_client([{node, ClientNode},
@@ -1836,11 +1878,9 @@ server_does_not_want_to_reuse_session(Config) when is_list(Config) ->
{Client1, _Other} ->
ok
end,
-
+
ssl_test_lib:close(Server),
- ssl_test_lib:close(Client0),
- ssl_test_lib:close(Client1),
- process_flag(trap_exit, false).
+ ssl_test_lib:close(Client1).
%%--------------------------------------------------------------------
@@ -2007,6 +2047,7 @@ server_verify_none_active_once(Config) when is_list(Config) ->
ssl_test_lib:check_result(Server, ok, Client, ok),
ssl_test_lib:close(Server),
ssl_test_lib:close(Client).
+
%%--------------------------------------------------------------------
server_verify_client_once_passive(doc) ->
@@ -2034,7 +2075,7 @@ server_verify_client_once_passive(Config) when is_list(Config) ->
ssl_test_lib:check_result(Server, ok, Client0, ok),
ssl_test_lib:close(Client0),
- Server ! listen,
+ Server ! {listen, {mfa, {ssl_test_lib, no_result, []}}},
Client1 = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
{host, Hostname},
{from, self()},
@@ -2072,7 +2113,7 @@ server_verify_client_once_active(Config) when is_list(Config) ->
ssl_test_lib:check_result(Server, ok, Client0, ok),
ssl_test_lib:close(Client0),
- Server ! listen,
+ Server ! {listen, {mfa, {ssl_test_lib, no_result, []}}},
Client1 = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
{host, Hostname},
{from, self()},
@@ -2083,7 +2124,6 @@ server_verify_client_once_active(Config) when is_list(Config) ->
ssl_test_lib:close(Server),
ssl_test_lib:close(Client1).
-
%%--------------------------------------------------------------------
server_verify_client_once_active_once(doc) ->
@@ -2111,18 +2151,17 @@ server_verify_client_once_active_once(Config) when is_list(Config) ->
ssl_test_lib:check_result(Server, ok, Client0, ok),
ssl_test_lib:close(Client0),
- Server ! listen,
-
+ Server ! {listen, {mfa, {ssl_test_lib, no_result, []}}},
Client1 = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
- {host, Hostname},
- {from, self()},
- {mfa, {?MODULE, result_ok, []}},
- {options, [{active, once} | ClientOpts]}]),
+ {host, Hostname},
+ {from, self()},
+ {mfa, {?MODULE, result_ok, []}},
+ {options, [{active, once} | ClientOpts]}]),
ssl_test_lib:check_result(Client1, ok),
ssl_test_lib:close(Server),
ssl_test_lib:close(Client1).
-
+
%%--------------------------------------------------------------------
server_verify_no_cacerts(doc) ->
@@ -2130,9 +2169,8 @@ server_verify_no_cacerts(doc) ->
server_verify_no_cacerts(suite) ->
[];
-
server_verify_no_cacerts(Config) when is_list(Config) ->
- ServerOpts = ServerOpts = ?config(server_opts, Config),
+ ServerOpts = ?config(server_opts, Config),
{_, ServerNode, _} = ssl_test_lib:run_where(Config),
Server = ssl_test_lib:start_server_error([{node, ServerNode}, {port, 0},
{from, self()},
@@ -2293,8 +2331,6 @@ client_verify_none_active_once(Config) when is_list(Config) ->
ssl_test_lib:close(Server),
ssl_test_lib:close(Client).
-
-
%%--------------------------------------------------------------------
client_renegotiate(doc) ->
["Test ssl:renegotiate/1 on client."];
@@ -2303,7 +2339,6 @@ client_renegotiate(suite) ->
[];
client_renegotiate(Config) when is_list(Config) ->
- process_flag(trap_exit, true),
ServerOpts = ?config(server_opts, Config),
ClientOpts = ?config(client_opts, Config),
@@ -2326,11 +2361,9 @@ client_renegotiate(Config) when is_list(Config) ->
{options, [{reuse_sessions, false} | ClientOpts]}]),
ssl_test_lib:check_result(Client, ok, Server, ok),
-
ssl_test_lib:close(Server),
- ssl_test_lib:close(Client),
- process_flag(trap_exit, false),
- ok.
+ ssl_test_lib:close(Client).
+
%%--------------------------------------------------------------------
server_renegotiate(doc) ->
["Test ssl:renegotiate/1 on server."];
@@ -2339,7 +2372,6 @@ server_renegotiate(suite) ->
[];
server_renegotiate(Config) when is_list(Config) ->
- process_flag(trap_exit, true),
ServerOpts = ?config(server_opts, Config),
ClientOpts = ?config(client_opts, Config),
@@ -2362,8 +2394,7 @@ server_renegotiate(Config) when is_list(Config) ->
ssl_test_lib:check_result(Server, ok, Client, ok),
ssl_test_lib:close(Server),
- ssl_test_lib:close(Client),
- ok.
+ ssl_test_lib:close(Client).
%%--------------------------------------------------------------------
client_renegotiate_reused_session(doc) ->
@@ -2373,7 +2404,6 @@ client_renegotiate_reused_session(suite) ->
[];
client_renegotiate_reused_session(Config) when is_list(Config) ->
- process_flag(trap_exit, true),
ServerOpts = ?config(server_opts, Config),
ClientOpts = ?config(client_opts, Config),
@@ -2396,11 +2426,8 @@ client_renegotiate_reused_session(Config) when is_list(Config) ->
{options, [{reuse_sessions, true} | ClientOpts]}]),
ssl_test_lib:check_result(Client, ok, Server, ok),
-
ssl_test_lib:close(Server),
- ssl_test_lib:close(Client),
- process_flag(trap_exit, false),
- ok.
+ ssl_test_lib:close(Client).
%%--------------------------------------------------------------------
server_renegotiate_reused_session(doc) ->
["Test ssl:renegotiate/1 on server when the ssl session will be reused."];
@@ -2409,7 +2436,6 @@ server_renegotiate_reused_session(suite) ->
[];
server_renegotiate_reused_session(Config) when is_list(Config) ->
- process_flag(trap_exit, true),
ServerOpts = ?config(server_opts, Config),
ClientOpts = ?config(client_opts, Config),
@@ -2432,9 +2458,7 @@ server_renegotiate_reused_session(Config) when is_list(Config) ->
ssl_test_lib:check_result(Server, ok, Client, ok),
ssl_test_lib:close(Server),
- ssl_test_lib:close(Client),
- ok.
-
+ ssl_test_lib:close(Client).
%%--------------------------------------------------------------------
client_no_wrap_sequence_number(doc) ->
["Test that erlang client will renegotiate session when",
@@ -2446,7 +2470,6 @@ client_no_wrap_sequence_number(suite) ->
[];
client_no_wrap_sequence_number(Config) when is_list(Config) ->
- process_flag(trap_exit, true),
ServerOpts = ?config(server_opts, Config),
ClientOpts = ?config(client_opts, Config),
@@ -2471,11 +2494,8 @@ client_no_wrap_sequence_number(Config) when is_list(Config) ->
{renegotiate_at, N} | ClientOpts]}]),
ssl_test_lib:check_result(Client, ok),
-
ssl_test_lib:close(Server),
- ssl_test_lib:close(Client),
- process_flag(trap_exit, false),
- ok.
+ ssl_test_lib:close(Client).
%%--------------------------------------------------------------------
server_no_wrap_sequence_number(doc) ->
["Test that erlang server will renegotiate session when",
@@ -2487,7 +2507,6 @@ server_no_wrap_sequence_number(suite) ->
[];
server_no_wrap_sequence_number(Config) when is_list(Config) ->
- process_flag(trap_exit, true),
ServerOpts = ?config(server_opts, Config),
ClientOpts = ?config(client_opts, Config),
@@ -2511,17 +2530,15 @@ server_no_wrap_sequence_number(Config) when is_list(Config) ->
ssl_test_lib:check_result(Server, ok),
ssl_test_lib:close(Server),
- ssl_test_lib:close(Client),
- ok.
-
+ ssl_test_lib:close(Client).
%%--------------------------------------------------------------------
-extended_key_usage(doc) ->
- ["Test cert that has a critical extended_key_usage extension"];
+extended_key_usage_verify_peer(doc) ->
+ ["Test cert that has a critical extended_key_usage extension in verify_peer mode"];
-extended_key_usage(suite) ->
+extended_key_usage_verify_peer(suite) ->
[];
-extended_key_usage(Config) when is_list(Config) ->
+extended_key_usage_verify_peer(Config) when is_list(Config) ->
ClientOpts = ?config(client_verification_opts, Config),
ServerOpts = ?config(server_verification_opts, Config),
PrivDir = ?config(priv_dir, Config),
@@ -2537,13 +2554,13 @@ extended_key_usage(Config) when is_list(Config) ->
ServerExtKeyUsageExt = {'Extension', ?'id-ce-extKeyUsage', true, [?'id-kp-serverAuth']},
ServerOTPTbsCert = ServerOTPCert#'OTPCertificate'.tbsCertificate,
ServerExtensions = ServerOTPTbsCert#'OTPTBSCertificate'.extensions,
- NewServerOTPTbsCert = ServerOTPTbsCert#'OTPTBSCertificate'{extensions =
- [ServerExtKeyUsageExt |
+ NewServerOTPTbsCert = ServerOTPTbsCert#'OTPTBSCertificate'{extensions =
+ [ServerExtKeyUsageExt |
ServerExtensions]},
- NewServerDerCert = public_key:pkix_sign(NewServerOTPTbsCert, Key),
+ NewServerDerCert = public_key:pkix_sign(NewServerOTPTbsCert, Key),
ssl_test_lib:der_to_pem(NewServerCertFile, [{'Certificate', NewServerDerCert, not_encrypted}]),
NewServerOpts = [{certfile, NewServerCertFile} | proplists:delete(certfile, ServerOpts)],
-
+
ClientCertFile = proplists:get_value(certfile, ClientOpts),
NewClientCertFile = filename:join(PrivDir, "client/new_cert.pem"),
[{'Certificate', ClientDerCert, _}] = ssl_test_lib:pem_to_der(ClientCertFile),
@@ -2551,28 +2568,90 @@ extended_key_usage(Config) when is_list(Config) ->
ClientExtKeyUsageExt = {'Extension', ?'id-ce-extKeyUsage', true, [?'id-kp-clientAuth']},
ClientOTPTbsCert = ClientOTPCert#'OTPCertificate'.tbsCertificate,
ClientExtensions = ClientOTPTbsCert#'OTPTBSCertificate'.extensions,
- NewClientOTPTbsCert = ClientOTPTbsCert#'OTPTBSCertificate'{extensions =
+ NewClientOTPTbsCert = ClientOTPTbsCert#'OTPTBSCertificate'{extensions =
[ClientExtKeyUsageExt |
ClientExtensions]},
- NewClientDerCert = public_key:pkix_sign(NewClientOTPTbsCert, Key),
+ NewClientDerCert = public_key:pkix_sign(NewClientOTPTbsCert, Key),
ssl_test_lib:der_to_pem(NewClientCertFile, [{'Certificate', NewClientDerCert, not_encrypted}]),
NewClientOpts = [{certfile, NewClientCertFile} | proplists:delete(certfile, ClientOpts)],
{ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
-
- Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
- {from, self()},
+
+ Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
+ {from, self()},
{mfa, {?MODULE, send_recv_result_active, []}},
{options, [{verify, verify_peer} | NewServerOpts]}]),
Port = ssl_test_lib:inet_port(Server),
- Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
+ Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
{host, Hostname},
- {from, self()},
+ {from, self()},
{mfa, {?MODULE, send_recv_result_active, []}},
{options, [{verify, verify_peer} | NewClientOpts]}]),
-
+
ssl_test_lib:check_result(Server, ok, Client, ok),
-
+
+ ssl_test_lib:close(Server),
+ ssl_test_lib:close(Client).
+
+%%--------------------------------------------------------------------
+extended_key_usage_verify_none(doc) ->
+ ["Test cert that has a critical extended_key_usage extension in verify_none mode"];
+
+extended_key_usage_verify_none(suite) ->
+ [];
+
+extended_key_usage_verify_none(Config) when is_list(Config) ->
+ ClientOpts = ?config(client_verification_opts, Config),
+ ServerOpts = ?config(server_verification_opts, Config),
+ PrivDir = ?config(priv_dir, Config),
+
+ KeyFile = filename:join(PrivDir, "otpCA/private/key.pem"),
+ [KeyEntry] = ssl_test_lib:pem_to_der(KeyFile),
+ Key = public_key:pem_entry_decode(KeyEntry),
+
+ ServerCertFile = proplists:get_value(certfile, ServerOpts),
+ NewServerCertFile = filename:join(PrivDir, "server/new_cert.pem"),
+ [{'Certificate', ServerDerCert, _}] = ssl_test_lib:pem_to_der(ServerCertFile),
+ ServerOTPCert = public_key:pkix_decode_cert(ServerDerCert, otp),
+ ServerExtKeyUsageExt = {'Extension', ?'id-ce-extKeyUsage', true, [?'id-kp-serverAuth']},
+ ServerOTPTbsCert = ServerOTPCert#'OTPCertificate'.tbsCertificate,
+ ServerExtensions = ServerOTPTbsCert#'OTPTBSCertificate'.extensions,
+ NewServerOTPTbsCert = ServerOTPTbsCert#'OTPTBSCertificate'{extensions =
+ [ServerExtKeyUsageExt |
+ ServerExtensions]},
+ NewServerDerCert = public_key:pkix_sign(NewServerOTPTbsCert, Key),
+ ssl_test_lib:der_to_pem(NewServerCertFile, [{'Certificate', NewServerDerCert, not_encrypted}]),
+ NewServerOpts = [{certfile, NewServerCertFile} | proplists:delete(certfile, ServerOpts)],
+
+ ClientCertFile = proplists:get_value(certfile, ClientOpts),
+ NewClientCertFile = filename:join(PrivDir, "client/new_cert.pem"),
+ [{'Certificate', ClientDerCert, _}] = ssl_test_lib:pem_to_der(ClientCertFile),
+ ClientOTPCert = public_key:pkix_decode_cert(ClientDerCert, otp),
+ ClientExtKeyUsageExt = {'Extension', ?'id-ce-extKeyUsage', true, [?'id-kp-clientAuth']},
+ ClientOTPTbsCert = ClientOTPCert#'OTPCertificate'.tbsCertificate,
+ ClientExtensions = ClientOTPTbsCert#'OTPTBSCertificate'.extensions,
+ NewClientOTPTbsCert = ClientOTPTbsCert#'OTPTBSCertificate'{extensions =
+ [ClientExtKeyUsageExt |
+ ClientExtensions]},
+ NewClientDerCert = public_key:pkix_sign(NewClientOTPTbsCert, Key),
+ ssl_test_lib:der_to_pem(NewClientCertFile, [{'Certificate', NewClientDerCert, not_encrypted}]),
+ NewClientOpts = [{certfile, NewClientCertFile} | proplists:delete(certfile, ClientOpts)],
+
+ {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+
+ Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
+ {from, self()},
+ {mfa, {?MODULE, send_recv_result_active, []}},
+ {options, [{verify, verify_none} | NewServerOpts]}]),
+ Port = ssl_test_lib:inet_port(Server),
+ Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
+ {host, Hostname},
+ {from, self()},
+ {mfa, {?MODULE, send_recv_result_active, []}},
+ {options, [{verify, verify_none} | NewClientOpts]}]),
+
+ ssl_test_lib:check_result(Server, ok, Client, ok),
+
ssl_test_lib:close(Server),
ssl_test_lib:close(Client).
@@ -2885,9 +2964,7 @@ unknown_server_ca_fail(Config) when is_list(Config) ->
| ClientOpts]}]),
ssl_test_lib:check_result(Server, {error,"unknown ca"},
- Client, {error, "unknown ca"}),
- ssl_test_lib:close(Server),
- ssl_test_lib:close(Client).
+ Client, {error, "unknown ca"}).
%%--------------------------------------------------------------------
unknown_server_ca_accept_verify_none(doc) ->
@@ -3052,19 +3129,240 @@ der_input_opts(Opts) ->
{Cert, {rsa, Key}, CaCerts, DHParams}.
%%--------------------------------------------------------------------
-%%% Internal functions
+%% different_ca_peer_sign(doc) ->
+%% ["Check that a CA can have a different signature algorithm than the peer cert."];
+
+%% different_ca_peer_sign(suite) ->
+%% [];
+
+%% different_ca_peer_sign(Config) when is_list(Config) ->
+%% ClientOpts = ?config(client_mix_opts, Config),
+%% ServerOpts = ?config(server_mix_verify_opts, Config),
+
+%% {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+%% Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
+%% {from, self()},
+%% {mfa, {?MODULE, send_recv_result_active_once, []}},
+%% {options, [{active, once},
+%% {verify, verify_peer} | ServerOpts]}]),
+%% Port = ssl_test_lib:inet_port(Server),
+
+%% Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
+%% {host, Hostname},
+%% {from, self()},
+%% {mfa, {?MODULE,
+%% send_recv_result_active_once,
+%% []}},
+%% {options, [{active, once},
+%% {verify, verify_peer}
+%% | ClientOpts]}]),
+
+%% ssl_test_lib:check_result(Server, ok, Client, ok),
+%% ssl_test_lib:close(Server),
+%% ssl_test_lib:close(Client).
+
+
%%--------------------------------------------------------------------
-erlang_ssl_receive(Socket, Data) ->
+no_reuses_session_server_restart_new_cert(doc) ->
+ ["Check that a session is not reused if the server is restarted with a new cert."];
+
+no_reuses_session_server_restart_new_cert(suite) ->
+ [];
+
+no_reuses_session_server_restart_new_cert(Config) when is_list(Config) ->
+
+ ClientOpts = ?config(client_opts, Config),
+ ServerOpts = ?config(server_opts, Config),
+ DsaServerOpts = ?config(server_dsa_opts, Config),
+ {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+
+ Server =
+ ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
+ {from, self()},
+ {mfa, {?MODULE, session_info_result, []}},
+ {options, ServerOpts}]),
+ Port = ssl_test_lib:inet_port(Server),
+ Client0 =
+ ssl_test_lib:start_client([{node, ClientNode},
+ {port, Port}, {host, Hostname},
+ {mfa, {ssl_test_lib, no_result, []}},
+ {from, self()}, {options, ClientOpts}]),
+ SessionInfo =
+ receive
+ {Server, Info} ->
+ Info
+ end,
+
+ %% Make sure session is registered
+ test_server:sleep(?SLEEP),
+ ssl_test_lib:close(Server),
+ ssl_test_lib:close(Client0),
+
+ Server1 =
+ ssl_test_lib:start_server([{node, ServerNode}, {port, Port},
+ {from, self()},
+ {mfa, {ssl_test_lib, no_result, []}},
+ {options, DsaServerOpts}]),
+
+ Client1 =
+ ssl_test_lib:start_client([{node, ClientNode},
+ {port, Port}, {host, Hostname},
+ {mfa, {?MODULE, session_info_result, []}},
+ {from, self()}, {options, ClientOpts}]),
receive
- {ssl, Socket, Data} ->
- io:format("Received ~p~n",[Data]),
- ok;
- Other ->
- test_server:fail({unexpected_message, Other})
- after ?SLEEP * 3 ->
- test_server:fail({did_not_get, Data})
- end.
+ {Client1, SessionInfo} ->
+ test_server:fail(session_reused_when_server_has_new_cert);
+ {Client1, _Other} ->
+ ok
+ end,
+ ssl_test_lib:close(Server1),
+ ssl_test_lib:close(Client1).
+
+%%--------------------------------------------------------------------
+no_reuses_session_server_restart_new_cert_file(doc) ->
+ ["Check that a session is not reused if a server is restarted with a new "
+ "cert contained in a file with the same name as the old cert."];
+
+no_reuses_session_server_restart_new_cert_file(suite) ->
+ [];
+
+no_reuses_session_server_restart_new_cert_file(Config) when is_list(Config) ->
+ ClientOpts = ?config(client_opts, Config),
+ ServerOpts = ?config(server_verification_opts, Config),
+ DsaServerOpts = ?config(server_dsa_opts, Config),
+ PrivDir = ?config(priv_dir, Config),
+
+ NewServerOpts = new_config(PrivDir, ServerOpts),
+ {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+
+ Server =
+ ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
+ {from, self()},
+ {mfa, {?MODULE, session_info_result, []}},
+ {options, NewServerOpts}]),
+ Port = ssl_test_lib:inet_port(Server),
+ Client0 =
+ ssl_test_lib:start_client([{node, ClientNode},
+ {port, Port}, {host, Hostname},
+ {mfa, {ssl_test_lib, no_result, []}},
+ {from, self()}, {options, ClientOpts}]),
+ SessionInfo =
+ receive
+ {Server, Info} ->
+ Info
+ end,
+
+ %% Make sure session is registered and we get
+ %% new file time stamp when calling new_config!
+ test_server:sleep(?SLEEP* 2),
+ ssl_test_lib:close(Server),
+ ssl_test_lib:close(Client0),
+
+ NewServerOpts = new_config(PrivDir, DsaServerOpts),
+
+ Server1 =
+ ssl_test_lib:start_server([{node, ServerNode}, {port, Port},
+ {from, self()},
+ {mfa, {ssl_test_lib, no_result, []}},
+ {options, NewServerOpts}]),
+ Client1 =
+ ssl_test_lib:start_client([{node, ClientNode},
+ {port, Port}, {host, Hostname},
+ {mfa, {?MODULE, session_info_result, []}},
+ {from, self()}, {options, ClientOpts}]),
+ receive
+ {Client1, SessionInfo} ->
+ test_server:fail(session_reused_when_server_has_new_cert);
+ {Client1, _Other} ->
+ ok
+ end,
+ ssl_test_lib:close(Server1),
+ ssl_test_lib:close(Client1).
+
+%%--------------------------------------------------------------------
+reuseaddr(doc) ->
+ [""];
+
+reuseaddr(suite) ->
+ [];
+
+reuseaddr(Config) when is_list(Config) ->
+ ClientOpts = ?config(client_opts, Config),
+ ServerOpts = ?config(server_opts, Config),
+ {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+ Server =
+ ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
+ {from, self()},
+ {mfa, {ssl_test_lib, no_result, []}},
+ {options, [{active, false} | ServerOpts]}]),
+ Port = ssl_test_lib:inet_port(Server),
+ Client =
+ ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
+ {host, Hostname},
+ {from, self()},
+ {mfa, {ssl_test_lib, no_result, []}},
+ {options, [{active, false} | ClientOpts]}]),
+ test_server:sleep(?SLEEP),
+ ssl_test_lib:close(Server),
+
+ Server1 =
+ ssl_test_lib:start_server([{node, ServerNode}, {port, Port},
+ {from, self()},
+ {mfa, {?MODULE, send_recv_result, []}},
+ {options, [{active, false} | ServerOpts]}]),
+ Client1 =
+ ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
+ {host, Hostname},
+ {from, self()},
+ {mfa, {?MODULE, send_recv_result, []}},
+ {options, [{active, false} | ClientOpts]}]),
+
+ ssl_test_lib:check_result(Server1, ok, Client1, ok),
+ ssl_test_lib:close(Server1),
+ ssl_test_lib:close(Client1).
+
+%%--------------------------------------------------------------------
+
+hibernate(doc) ->
+ ["Check that an SSL connection that is started with option "
+ "{hibernate_after, 1000} indeed hibernates after 1000ms of "
+ "inactivity"];
+
+hibernate(suite) ->
+ [];
+
+hibernate(Config) ->
+ ClientOpts = ?config(client_opts, Config),
+ ServerOpts = ?config(server_opts, Config),
+
+ {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+
+ Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
+ {from, self()},
+ {mfa, {?MODULE, send_recv_result_active, []}},
+ {options, ServerOpts}]),
+ Port = ssl_test_lib:inet_port(Server),
+ {Client, #sslsocket{pid=Pid}} = ssl_test_lib:start_client([return_socket,
+ {node, ClientNode}, {port, Port},
+ {host, Hostname},
+ {from, self()},
+ {mfa, {?MODULE, send_recv_result_active, []}},
+ {options, [{hibernate_after, 1000}|ClientOpts]}]),
+
+ { current_function, { _M, _F, _A } } =
+ process_info(Pid, current_function),
+
+ timer:sleep(1100),
+
+ { current_function, { erlang, hibernate, 3} } =
+ process_info(Pid, current_function),
+ ssl_test_lib:close(Server),
+ ssl_test_lib:close(Client).
+
+%%--------------------------------------------------------------------
+%%% Internal functions
+%%--------------------------------------------------------------------
send_recv_result(Socket) ->
ssl:send(Socket, "Hello world"),
{ok,"Hello world"} = ssl:recv(Socket, 11),
@@ -3087,7 +3385,6 @@ send_recv_result_active_once(Socket) ->
result_ok(_Socket) ->
ok.
-
renegotiate(Socket, Data) ->
test_server:format("Renegotiating ~n", []),
Result = ssl:renegotiate(Socket),
@@ -3104,3 +3401,182 @@ renegotiate_reuse_session(Socket, Data) ->
%% Make sure session is registerd
test_server:sleep(?SLEEP),
renegotiate(Socket, Data).
+
+new_config(PrivDir, ServerOpts0) ->
+ CaCertFile = proplists:get_value(cacertfile, ServerOpts0),
+ CertFile = proplists:get_value(certfile, ServerOpts0),
+ KeyFile = proplists:get_value(keyfile, ServerOpts0),
+ NewCaCertFile = filename:join(PrivDir, "new_ca.pem"),
+ NewCertFile = filename:join(PrivDir, "new_cert.pem"),
+ NewKeyFile = filename:join(PrivDir, "new_key.pem"),
+ file:copy(CaCertFile, NewCaCertFile),
+ file:copy(CertFile, NewCertFile),
+ file:copy(KeyFile, NewKeyFile),
+ ServerOpts1 = proplists:delete(cacertfile, ServerOpts0),
+ ServerOpts2 = proplists:delete(certfile, ServerOpts1),
+ ServerOpts = proplists:delete(keyfile, ServerOpts2),
+
+ {ok, PEM} = file:read_file(NewCaCertFile),
+ test_server:format("CA file content: ~p~n", [public_key:pem_decode(PEM)]),
+
+ [{cacertfile, NewCaCertFile}, {certfile, NewCertFile},
+ {keyfile, NewKeyFile} | ServerOpts].
+
+session_cache_process_list(doc) ->
+ ["Test reuse of sessions (short handshake)"];
+
+session_cache_process_list(suite) ->
+ [];
+session_cache_process_list(Config) when is_list(Config) ->
+ session_cache_process(list,Config).
+
+session_cache_process_mnesia(doc) ->
+ ["Test reuse of sessions (short handshake)"];
+
+session_cache_process_mnesia(suite) ->
+ [];
+session_cache_process_mnesia(Config) when is_list(Config) ->
+ session_cache_process(mnesia,Config).
+
+session_cache_process(Type,Config) when is_list(Config) ->
+ reuse_session(Config).
+
+init([Type]) ->
+ ets:new(ssl_test, [named_table, public, set]),
+ ets:insert(ssl_test, {type, Type}),
+ case Type of
+ list ->
+ spawn(fun() -> session_loop([]) end);
+ mnesia ->
+ mnesia:start(),
+ {atomic,ok} = mnesia:create_table(sess_cache, []),
+ sess_cache
+ end.
+
+session_cb() ->
+ [{type, Type}] = ets:lookup(ssl_test, type),
+ Type.
+
+terminate(Cache) ->
+ case session_cb() of
+ list ->
+ Cache ! terminate;
+ mnesia ->
+ catch {atomic,ok} =
+ mnesia:delete_table(sess_cache)
+ end.
+
+lookup(Cache, Key) ->
+ case session_cb() of
+ list ->
+ Cache ! {self(), lookup, Key},
+ receive {Cache, Res} -> Res end;
+ mnesia ->
+ case mnesia:transaction(fun() ->
+ mnesia:read(sess_cache,
+ Key, read)
+ end) of
+ {atomic, [{sess_cache, Key, Value}]} ->
+ Value;
+ _ ->
+ undefined
+ end
+ end.
+
+update(Cache, Key, Value) ->
+ case session_cb() of
+ list ->
+ Cache ! {update, Key, Value};
+ mnesia ->
+ {atomic, ok} =
+ mnesia:transaction(fun() ->
+ mnesia:write(sess_cache,
+ {sess_cache, Key, Value}, write)
+ end)
+ end.
+
+delete(Cache, Key) ->
+ case session_cb() of
+ list ->
+ Cache ! {delete, Key};
+ mnesia ->
+ {atomic, ok} =
+ mnesia:transaction(fun() ->
+ mnesia:delete(sess_cache, Key)
+ end)
+ end.
+
+foldl(Fun, Acc, Cache) ->
+ case session_cb() of
+ list ->
+ Cache ! {self(),foldl,Fun,Acc},
+ receive {Cache, Res} -> Res end;
+ mnesia ->
+ Foldl = fun() ->
+ mnesia:foldl(Fun, Acc, sess_cache)
+ end,
+ {atomic, Res} = mnesia:transaction(Foldl),
+ Res
+ end.
+
+select_session(Cache, PartialKey) ->
+ case session_cb() of
+ list ->
+ Cache ! {self(),select_session, PartialKey},
+ receive
+ {Cache, Res} ->
+ Res
+ end;
+ mnesia ->
+ Sel = fun() ->
+ mnesia:select(Cache,
+ [{{sess_cache,{PartialKey,'$1'}, '$2'},
+ [],['$$']}])
+ end,
+ {atomic, Res} = mnesia:transaction(Sel),
+ Res
+ end.
+
+session_loop(Sess) ->
+ receive
+ terminate ->
+ ok;
+ {Pid, lookup, Key} ->
+ case lists:keysearch(Key,1,Sess) of
+ {value, {Key,Value}} ->
+ Pid ! {self(), Value};
+ _ ->
+ Pid ! {self(), undefined}
+ end,
+ session_loop(Sess);
+ {update, Key, Value} ->
+ NewSess = [{Key,Value}| lists:keydelete(Key,1,Sess)],
+ session_loop(NewSess);
+ {delete, Key} ->
+ session_loop(lists:keydelete(Key,1,Sess));
+ {Pid,foldl,Fun,Acc} ->
+ Res = lists:foldl(Fun, Acc,Sess),
+ Pid ! {self(), Res},
+ session_loop(Sess);
+ {Pid,select_session,PKey} ->
+ Sel = fun({{PKey0, Id},Session}, Acc) when PKey == PKey0 ->
+ [[Id, Session]|Acc];
+ (_,Acc) ->
+ Acc
+ end,
+ Sessions = lists:foldl(Sel, [], Sess),
+ Pid ! {self(), Sessions},
+ session_loop(Sess)
+ end.
+
+
+erlang_ssl_receive(Socket, Data) ->
+ receive
+ {ssl, Socket, Data} ->
+ io:format("Received ~p~n",[Data]),
+ ok;
+ Other ->
+ test_server:fail({unexpected_message, Other})
+ after ?SLEEP * 3 ->
+ test_server:fail({did_not_get, Data})
+ end.
diff --git a/lib/ssl/test/ssl_packet_SUITE.erl b/lib/ssl/test/ssl_packet_SUITE.erl
index 88d2d99ef8..d22d5d2954 100644
--- a/lib/ssl/test/ssl_packet_SUITE.erl
+++ b/lib/ssl/test/ssl_packet_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -23,7 +23,7 @@
%% Note: This directive should only be used in test suites.
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-define(BYTE(X), X:8/unsigned-big-integer).
-define(UINT16(X), X:16/unsigned-big-integer).
@@ -53,15 +53,18 @@
%% variable, but should NOT alter/remove any existing entries.
%%--------------------------------------------------------------------
init_per_suite(Config) ->
- crypto:start(),
- application:start(public_key),
- ssl:start(),
- Result =
- (catch make_certs:all(?config(data_dir, Config),
- ?config(priv_dir, Config))),
- test_server:format("Make certs ~p~n", [Result]),
- ssl_test_lib:cert_options(Config).
-
+ try crypto:start() of
+ ok ->
+ application:start(public_key),
+ ssl:start(),
+ Result =
+ (catch make_certs:all(?config(data_dir, Config),
+ ?config(priv_dir, Config))),
+ test_server:format("Make certs ~p~n", [Result]),
+ ssl_test_lib:cert_options(Config)
+ catch _:_ ->
+ {skip, "Crypto did not start"}
+ end.
%%--------------------------------------------------------------------
%% Function: end_per_suite(Config) -> _
%% Config - [tuple()]
@@ -70,7 +73,7 @@ init_per_suite(Config) ->
%%--------------------------------------------------------------------
end_per_suite(_Config) ->
ssl:stop(),
- crypto:stop().
+ application:stop(crypto).
%%--------------------------------------------------------------------
%% Function: init_per_testcase(TestCase, Config) -> Config
@@ -115,56 +118,56 @@ end_per_testcase(_TestCase, Config) ->
%% Name of a test case.
%% Description: Returns a list of all test cases in this test suite
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test that erlang:decode_packet/3 seems to be handled correctly."
- "We only use the most basic packet types in our tests as testing of"
- "the packet types are for inet to verify"
- ];
-
-all(suite) ->
- [packet_raw_passive_many_small,
- packet_0_passive_many_small, packet_1_passive_many_small,
- packet_2_passive_many_small, packet_4_passive_many_small,
- packet_raw_passive_some_big, packet_0_passive_some_big,
- packet_1_passive_some_big,
- packet_2_passive_some_big, packet_4_passive_some_big,
- packet_raw_active_once_many_small,
- packet_0_active_once_many_small, packet_1_active_once_many_small,
- packet_2_active_once_many_small, packet_4_active_once_many_small,
- packet_raw_active_once_some_big,
- packet_0_active_once_some_big, packet_1_active_once_some_big,
- packet_2_active_once_some_big, packet_4_active_once_some_big,
- packet_raw_active_many_small, packet_0_active_many_small,
- packet_1_active_many_small,
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [packet_raw_passive_many_small,
+ packet_0_passive_many_small,
+ packet_1_passive_many_small,
+ packet_2_passive_many_small,
+ packet_4_passive_many_small,
+ packet_raw_passive_some_big, packet_0_passive_some_big,
+ packet_1_passive_some_big, packet_2_passive_some_big,
+ packet_4_passive_some_big,
+ packet_raw_active_once_many_small,
+ packet_0_active_once_many_small,
+ packet_1_active_once_many_small,
+ packet_2_active_once_many_small,
+ packet_4_active_once_many_small,
+ packet_raw_active_once_some_big,
+ packet_0_active_once_some_big,
+ packet_1_active_once_some_big,
+ packet_2_active_once_some_big,
+ packet_4_active_once_some_big,
+ packet_raw_active_many_small,
+ packet_0_active_many_small, packet_1_active_many_small,
packet_2_active_many_small, packet_4_active_many_small,
- packet_raw_active_some_big, packet_0_active_some_big,
- packet_1_active_some_big, packet_2_active_some_big,
- packet_4_active_some_big,
- packet_send_to_large,
+ packet_raw_active_some_big, packet_0_active_some_big,
+ packet_1_active_some_big, packet_2_active_some_big,
+ packet_4_active_some_big, packet_send_to_large,
packet_wait_passive, packet_wait_active,
packet_baddata_passive, packet_baddata_active,
packet_size_passive, packet_size_active,
- packet_cdr_decode,
- packet_cdr_decode_list,
- packet_http_decode,
- packet_http_decode_list,
- packet_http_bin_decode_multi,
- packet_http_error_passive,
- packet_line_decode,
- packet_line_decode_list,
- packet_asn1_decode,
- packet_asn1_decode_list,
- packet_tpkt_decode,
- packet_tpkt_decode_list,
- %packet_fcgi_decode,
- packet_sunrm_decode,
- packet_sunrm_decode_list,
- header_decode_one_byte,
- header_decode_two_bytes,
+ packet_cdr_decode, packet_cdr_decode_list,
+ packet_http_decode, packet_http_decode_list,
+ packet_http_bin_decode_multi, packet_http_error_passive,
+ packet_line_decode, packet_line_decode_list,
+ packet_asn1_decode, packet_asn1_decode_list,
+ packet_tpkt_decode, packet_tpkt_decode_list,
+ packet_sunrm_decode, packet_sunrm_decode_list,
+ header_decode_one_byte, header_decode_two_bytes,
header_decode_two_bytes_one_sent,
- header_decode_two_bytes_two_sent
+ header_decode_two_bytes_two_sent].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
- ].
%% Test cases starts here.
%%--------------------------------------------------------------------
diff --git a/lib/ssl/test/ssl_payload_SUITE.erl b/lib/ssl/test/ssl_payload_SUITE.erl
index d80df0bfbd..24e86b3913 100644
--- a/lib/ssl/test/ssl_payload_SUITE.erl
+++ b/lib/ssl/test/ssl_payload_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -22,7 +22,7 @@
%% Note: This directive should only be used in test suites.
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-define(TIMEOUT, 600000).
@@ -37,12 +37,15 @@
%% variable, but should NOT alter/remove any existing entries.
%%--------------------------------------------------------------------
init_per_suite(Config) ->
- crypto:start(),
- application:start(public_key),
- ssl:start(),
- make_certs:all(?config(data_dir, Config), ?config(priv_dir, Config)),
- ssl_test_lib:cert_options(Config).
-
+ try crypto:start() of
+ ok ->
+ application:start(public_key),
+ ssl:start(),
+ make_certs:all(?config(data_dir, Config), ?config(priv_dir, Config)),
+ ssl_test_lib:cert_options(Config)
+ catch _:_ ->
+ {skip, "Crypto did not start"}
+ end.
%%--------------------------------------------------------------------
%% Function: end_per_suite(Config) -> _
%% Config - [tuple()]
@@ -51,7 +54,7 @@ init_per_suite(Config) ->
%%--------------------------------------------------------------------
end_per_suite(_Config) ->
ssl:stop(),
- crypto:stop().
+ application:stop(crypto).
%%--------------------------------------------------------------------
%% Function: init_per_testcase(TestCase, Config) -> Config
@@ -96,24 +99,30 @@ end_per_testcase(_TestCase, Config) ->
%% Name of a test case.
%% Description: Returns a list of all test cases in this test suite
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test payload over ssl in all socket modes, active, active_once,"
- "and passive mode."];
-
-all(suite) ->
- [server_echos_passive_small, server_echos_active_once_small,
- server_echos_active_small,
- client_echos_passive_small, client_echos_active_once_small,
- client_echos_active_small,
- server_echos_passive_big, server_echos_active_once_big,
- server_echos_active_big,
- client_echos_passive_big, client_echos_active_once_big,
- client_echos_active_big,
- server_echos_passive_huge, server_echos_active_once_huge,
- server_echos_active_huge,
- client_echos_passive_huge, client_echos_active_once_huge,
- client_echos_active_huge
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [server_echos_passive_small,
+ server_echos_active_once_small,
+ server_echos_active_small, client_echos_passive_small,
+ client_echos_active_once_small,
+ client_echos_active_small, server_echos_passive_big,
+ server_echos_active_once_big, server_echos_active_big,
+ client_echos_passive_big, client_echos_active_once_big,
+ client_echos_active_big, server_echos_passive_huge,
+ server_echos_active_once_huge, server_echos_active_huge,
+ client_echos_passive_huge,
+ client_echos_active_once_huge, client_echos_active_huge].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% Test cases starts here.
%%--------------------------------------------------------------------
diff --git a/lib/ssl/test/ssl_session_cache_SUITE.erl b/lib/ssl/test/ssl_session_cache_SUITE.erl
index 0f39759d97..a43b9ab586 100644
--- a/lib/ssl/test/ssl_session_cache_SUITE.erl
+++ b/lib/ssl/test/ssl_session_cache_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2011. 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
@@ -24,7 +24,7 @@
%% Note: This directive should only be used in test suites.
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-define(SLEEP, 500).
-define(TIMEOUT, 60000).
@@ -47,19 +47,23 @@
%%--------------------------------------------------------------------
init_per_suite(Config0) ->
Dog = ssl_test_lib:timetrap(?LONG_TIMEOUT *2),
- crypto:start(),
- application:start(public_key),
- ssl:start(),
-
- %% make rsa certs using oppenssl
- Result =
- (catch make_certs:all(?config(data_dir, Config0),
- ?config(priv_dir, Config0))),
- test_server:format("Make certs ~p~n", [Result]),
-
- Config1 = ssl_test_lib:make_dsa_cert(Config0),
- Config = ssl_test_lib:cert_options(Config1),
- [{watchdog, Dog} | Config].
+ try crypto:start() of
+ ok ->
+ application:start(public_key),
+ ssl:start(),
+
+ %% make rsa certs using oppenssl
+ Result =
+ (catch make_certs:all(?config(data_dir, Config0),
+ ?config(priv_dir, Config0))),
+ test_server:format("Make certs ~p~n", [Result]),
+
+ Config1 = ssl_test_lib:make_dsa_cert(Config0),
+ Config = ssl_test_lib:cert_options(Config1),
+ [{watchdog, Dog} | Config]
+ catch _:_ ->
+ {skip, "Crypto did not start"}
+ end.
%%--------------------------------------------------------------------
%% Function: end_per_suite(Config) -> _
@@ -69,7 +73,7 @@ init_per_suite(Config0) ->
%%--------------------------------------------------------------------
end_per_suite(_Config) ->
ssl:stop(),
- crypto:stop().
+ application:stop(crypto).
%%--------------------------------------------------------------------
%% Function: init_per_testcase(TestCase, Config) -> Config
@@ -141,13 +145,20 @@ end_per_testcase(_TestCase, Config) ->
%% Name of a test case.
%% Description: Returns a list of all test cases in this test suite
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test session cach API"];
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [session_cache_process_list,
+ session_cache_process_mnesia].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [
- session_cache_process_list, session_cache_process_mnesia
- ].
+end_per_group(_GroupName, Config) ->
+ Config.
session_cache_process_list(doc) ->
["Test reuse of sessions (short handshake)"];
diff --git a/lib/ssl/test/ssl_test_lib.erl b/lib/ssl/test/ssl_test_lib.erl
index e1e8214ed6..40bbdf1dbd 100644
--- a/lib/ssl/test/ssl_test_lib.erl
+++ b/lib/ssl/test/ssl_test_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -81,14 +81,20 @@ run_server(ListenSocket, Opts) ->
no_result_msg ->
ok;
Msg ->
- test_server:format("Msg: ~p ~n", [Msg]),
+ test_server:format("Server Msg: ~p ~n", [Msg]),
Pid ! {self(), Msg}
end,
- receive
+ receive
listen ->
run_server(ListenSocket, Opts);
+ {listen, MFA} ->
+ run_server(ListenSocket, [MFA | proplists:delete(mfa, Opts)]);
close ->
- ok = rpc:call(Node, ssl, close, [AcceptSocket])
+ test_server:format("Server closing ~p ~n", [self()]),
+ Result = rpc:call(Node, ssl, close, [AcceptSocket], 500),
+ test_server:format("Result ~p ~n", [Result]);
+ {ssl_closed, _} ->
+ ok
end.
%%% To enable to test with s_client -reconnect
@@ -122,12 +128,14 @@ remove_close_msg(ReconnectTimes) ->
remove_close_msg(ReconnectTimes -1)
end.
-
start_client(Args) ->
- Result = spawn_link(?MODULE, run_client, [Args]),
+ Result = spawn_link(?MODULE, run_client, [lists:delete(return_socket, Args)]),
receive
- connected ->
- Result
+ { connected, Socket } ->
+ case lists:member(return_socket, Args) of
+ true -> { Result, Socket };
+ false -> Result
+ end
end.
run_client(Opts) ->
@@ -139,7 +147,7 @@ run_client(Opts) ->
test_server:format("ssl:connect(~p, ~p, ~p)~n", [Host, Port, Options]),
case rpc:call(Node, ssl, connect, [Host, Port, Options]) of
{ok, Socket} ->
- Pid ! connected,
+ Pid ! { connected, Socket },
test_server:format("Client: connected~n", []),
%% In specail cases we want to know the client port, it will
%% be indicated by sending {port, 0} in options list!
@@ -151,19 +159,30 @@ run_client(Opts) ->
no_result_msg ->
ok;
Msg ->
+ test_server:format("Client Msg: ~p ~n", [Msg]),
Pid ! {self(), Msg}
end,
- receive
+ receive
close ->
- ok = rpc:call(Node, ssl, close, [Socket])
+ test_server:format("Client closing~n", []),
+ rpc:call(Node, ssl, close, [Socket]);
+ {ssl_closed, Socket} ->
+ ok
end;
{error, Reason} ->
- test_server:format("Client: connection failed: ~p ~n", [Reason]),
+ test_server:format("Client: connection failed: ~p ~n", [Reason]),
Pid ! {self(), {error, Reason}}
end.
close(Pid) ->
- Pid ! close.
+ test_server:format("Close ~p ~n", [Pid]),
+ Monitor = erlang:monitor(process, Pid),
+ Pid ! close,
+ receive
+ {'DOWN', Monitor, process, Pid, Reason} ->
+ erlang:demonitor(Monitor),
+ test_server:format("Pid: ~p down due to:~p ~n", [Pid, Reason])
+ end.
check_result(Server, ServerMsg, Client, ClientMsg) ->
receive
@@ -208,47 +227,27 @@ check_result(Pid, Msg) ->
test_server:fail(Reason)
end.
-check_result_ignore_renegotiation_reject(Pid, Msg) ->
- receive
- {Pid, fail_session_fatal_alert_during_renegotiation} ->
- test_server:comment("Server rejected old renegotiation"),
- ok;
- {ssl_error, _, esslconnect} ->
- test_server:comment("Server rejected old renegotiation"),
- ok;
- {Pid, Msg} ->
- ok;
- {Port, {data,Debug}} when is_port(Port) ->
- io:format("openssl ~s~n",[Debug]),
- check_result(Pid,Msg);
- Unexpected ->
- Reason = {{expected, {Pid, Msg}},
- {got, Unexpected}},
- test_server:fail(Reason)
- end.
-
-
wait_for_result(Server, ServerMsg, Client, ClientMsg) ->
receive
{Server, ServerMsg} ->
receive
{Client, ClientMsg} ->
- ok;
- Unexpected ->
- Unexpected
+ ok
+ %% Unexpected ->
+ %% Unexpected
end;
{Client, ClientMsg} ->
receive
{Server, ServerMsg} ->
- ok;
- Unexpected ->
- Unexpected
+ ok
+ %% Unexpected ->
+ %% Unexpected
end;
{Port, {data,Debug}} when is_port(Port) ->
io:format("openssl ~s~n",[Debug]),
- wait_for_result(Server, ServerMsg, Client, ClientMsg);
- Unexpected ->
- Unexpected
+ wait_for_result(Server, ServerMsg, Client, ClientMsg)
+ %% Unexpected ->
+ %% Unexpected
end.
@@ -258,9 +257,9 @@ wait_for_result(Pid, Msg) ->
ok;
{Port, {data,Debug}} when is_port(Port) ->
io:format("openssl ~s~n",[Debug]),
- wait_for_result(Pid,Msg);
- Unexpected ->
- Unexpected
+ wait_for_result(Pid,Msg)
+ %% Unexpected ->
+ %% Unexpected
end.
cert_options(Config) ->
@@ -327,8 +326,8 @@ cert_options(Config) ->
make_dsa_cert(Config) ->
- {ServerCaCertFile, ServerCertFile, ServerKeyFile} = make_dsa_cert_files("server", Config),
- {ClientCaCertFile, ClientCertFile, ClientKeyFile} = make_dsa_cert_files("client", Config),
+ {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}]},
@@ -342,22 +341,41 @@ make_dsa_cert(Config) ->
| Config].
-
-make_dsa_cert_files(RoleStr, Config) ->
- CaInfo = {CaCert, _} = erl_make_certs:make_cert([{key, dsa}]),
- {Cert, CertKey} = erl_make_certs:make_cert([{key, dsa}, {issuer, CaInfo}]),
+make_mix_cert(Config) ->
+ {ServerCaCertFile, ServerCertFile, ServerKeyFile} = make_cert_files("server", Config, dsa,
+ rsa, "mix"),
+ {ClientCaCertFile, ClientCertFile, ClientKeyFile} = make_cert_files("client", Config, dsa,
+ rsa, "mix"),
+ [{server_mix_opts, [{ssl_imp, new},{reuseaddr, true},
+ {cacertfile, ServerCaCertFile},
+ {certfile, ServerCertFile}, {keyfile, ServerKeyFile}]},
+ {server_mix_verify_opts, [{ssl_imp, new},{reuseaddr, true},
+ {cacertfile, ClientCaCertFile},
+ {certfile, ServerCertFile}, {keyfile, ServerKeyFile},
+ {verify, verify_peer}]},
+ {client_mix_opts, [{ssl_imp, new},{reuseaddr, true},
+ {cacertfile, ClientCaCertFile},
+ {certfile, ClientCertFile}, {keyfile, ClientKeyFile}]}
+ | Config].
+
+make_cert_files(RoleStr, Config, Alg1, Alg2, Prefix) ->
+ 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}]),
CaCertFile = filename:join([?config(priv_dir, Config),
- RoleStr, "dsa_cacerts.pem"]),
+ RoleStr, Prefix ++ Alg1Str ++ "_cacerts.pem"]),
CertFile = filename:join([?config(priv_dir, Config),
- RoleStr, "dsa_cert.pem"]),
+ RoleStr, Prefix ++ Alg2Str ++ "_cert.pem"]),
KeyFile = filename:join([?config(priv_dir, Config),
- RoleStr, "dsa_key.pem"]),
+ RoleStr, Prefix ++ Alg2Str ++ "_key.pem"]),
der_to_pem(CaCertFile, [{'Certificate', CaCert, not_encrypted}]),
der_to_pem(CertFile, [{'Certificate', Cert, not_encrypted}]),
der_to_pem(KeyFile, [CertKey]),
{CaCertFile, CertFile, KeyFile}.
+
start_upgrade_server(Args) ->
Result = spawn_link(?MODULE, run_upgrade_server, [Args]),
receive
@@ -395,10 +413,12 @@ run_upgrade_server(Opts) ->
end,
{Module, Function, Args} = proplists:get_value(mfa, Opts),
Msg = rpc:call(Node, Module, Function, [SslAcceptSocket | Args]),
+ test_server:format("Upgrade Server Msg: ~p ~n", [Msg]),
Pid ! {self(), Msg},
receive
close ->
- ok = rpc:call(Node, ssl, close, [SslAcceptSocket])
+ test_server:format("Upgrade Server closing~n", []),
+ rpc:call(Node, ssl, close, [SslAcceptSocket])
end
catch error:{badmatch, Error} ->
Pid ! {self(), Error}
@@ -428,10 +448,12 @@ run_upgrade_client(Opts) ->
test_server:format("apply(~p, ~p, ~p)~n",
[Module, Function, [SslSocket | Args]]),
Msg = rpc:call(Node, Module, Function, [SslSocket | Args]),
+ test_server:format("Upgrade Client Msg: ~p ~n", [Msg]),
Pid ! {self(), Msg},
receive
close ->
- ok = rpc:call(Node, ssl, close, [SslSocket])
+ test_server:format("Upgrade Client closing~n", []),
+ rpc:call(Node, ssl, close, [SslSocket])
end.
start_upgrade_server_error(Args) ->
diff --git a/lib/ssl/test/ssl_to_openssl_SUITE.erl b/lib/ssl/test/ssl_to_openssl_SUITE.erl
index afedeaf099..64a6a9eaf8 100644
--- a/lib/ssl/test/ssl_to_openssl_SUITE.erl
+++ b/lib/ssl/test/ssl_to_openssl_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -24,7 +24,7 @@
%% Note: This directive should only be used in test suites.
-compile(export_all).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-define(TIMEOUT, 120000).
-define(LONG_TIMEOUT, 600000).
@@ -50,16 +50,20 @@ init_per_suite(Config0) ->
false ->
{skip, "Openssl not found"};
_ ->
- crypto:start(),
- application:start(public_key),
- ssl:start(),
- Result =
- (catch make_certs:all(?config(data_dir, Config0),
- ?config(priv_dir, Config0))),
- test_server:format("Make certs ~p~n", [Result]),
- Config1 = ssl_test_lib:make_dsa_cert(Config0),
- Config = ssl_test_lib:cert_options(Config1),
- [{watchdog, Dog} | Config]
+ try crypto:start() of
+ ok ->
+ application:start(public_key),
+ ssl:start(),
+ Result =
+ (catch make_certs:all(?config(data_dir, Config0),
+ ?config(priv_dir, Config0))),
+ test_server:format("Make certs ~p~n", [Result]),
+ Config1 = ssl_test_lib:make_dsa_cert(Config0),
+ Config = ssl_test_lib:cert_options(Config1),
+ [{watchdog, Dog} | Config]
+ catch _:_ ->
+ {skip, "Crypto did not start"}
+ end
end.
%%--------------------------------------------------------------------
@@ -70,7 +74,7 @@ init_per_suite(Config0) ->
%%--------------------------------------------------------------------
end_per_suite(_Config) ->
ssl:stop(),
- crypto:stop().
+ application:stop(crypto).
%%--------------------------------------------------------------------
%% Function: init_per_testcase(TestCase, Config) -> Config
@@ -139,11 +143,10 @@ end_per_testcase(_, Config) ->
%% Name of a test case.
%% Description: Returns a list of all test cases in this test suite
%%--------------------------------------------------------------------
-all(doc) ->
- ["Test erlangs ssl against openssl"];
+suite() -> [{ct_hooks,[ts_install_cth]}].
-all(suite) ->
- [erlang_client_openssl_server,
+all() ->
+ [erlang_client_openssl_server,
erlang_server_openssl_client,
tls1_erlang_client_openssl_server_dsa_cert,
tls1_erlang_server_openssl_client_dsa_cert,
@@ -154,22 +157,29 @@ all(suite) ->
erlang_client_openssl_server_no_wrap_sequence_number,
erlang_server_openssl_client_no_wrap_sequence_number,
erlang_client_openssl_server_no_server_ca_cert,
- ssl3_erlang_client_openssl_server,
+ ssl3_erlang_client_openssl_server,
ssl3_erlang_server_openssl_client,
ssl3_erlang_client_openssl_server_client_cert,
ssl3_erlang_server_openssl_client_client_cert,
ssl3_erlang_server_erlang_client_client_cert,
- tls1_erlang_client_openssl_server,
+ tls1_erlang_client_openssl_server,
tls1_erlang_server_openssl_client,
tls1_erlang_client_openssl_server_client_cert,
tls1_erlang_server_openssl_client_client_cert,
tls1_erlang_server_erlang_client_client_cert,
- ciphers_rsa_signed_certs,
- ciphers_dsa_signed_certs,
- erlang_client_bad_openssl_server,
- expired_session,
- ssl2_erlang_server_openssl_client
- ].
+ ciphers_rsa_signed_certs, ciphers_dsa_signed_certs,
+ erlang_client_bad_openssl_server, expired_session,
+ ssl2_erlang_server_openssl_client].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% Test cases starts here.
%%--------------------------------------------------------------------
@@ -1164,10 +1174,6 @@ cipher(CipherSuite, Version, Config, ClientOpts, ServerOpts) ->
close_port(OpenSslPort),
%% Clean close down!
ssl_test_lib:close(Client),
- receive
- {'EXIT', Client, normal} ->
- ok
- end,
Return = case Result of
ok ->
diff --git a/lib/ssl/vsn.mk b/lib/ssl/vsn.mk
index ee692adb3b..0e80e42637 100644
--- a/lib/ssl/vsn.mk
+++ b/lib/ssl/vsn.mk
@@ -1,2 +1 @@
-
-SSL_VSN = 4.1.1
+SSL_VSN = 4.1.5
diff --git a/lib/stdlib/doc/src/binary.xml b/lib/stdlib/doc/src/binary.xml
index c5eb81a86a..c81023862e 100644
--- a/lib/stdlib/doc/src/binary.xml
+++ b/lib/stdlib/doc/src/binary.xml
@@ -485,7 +485,7 @@
<code>
1> Bin = &lt;&lt;1,2,3,4,5,6,7,8,9,10&gt;&gt;.
-2> binary:part(Bin,{byte_size(Bin), -5)).
+2> binary:part(Bin,{byte_size(Bin), -5}).
&lt;&lt;6,7,8,9,10&gt;&gt;
</code>
diff --git a/lib/stdlib/doc/src/calendar.xml b/lib/stdlib/doc/src/calendar.xml
index 36f0c03162..075c7f9c78 100644
--- a/lib/stdlib/doc/src/calendar.xml
+++ b/lib/stdlib/doc/src/calendar.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1996</year><year>2009</year>
+ <year>1996</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -63,6 +63,14 @@
given as local time, they must be converted to universal time, in
order to get the correct value of the elapsed time between epochs.
Use of the function <c>time_difference/2</c> is discouraged.</p>
+ <p>There exists different definitions for the week of the year.
+ The calendar module contains a week of the year implementation
+ which conforms to the ISO 8601 standard. Since the week number for
+ a given date can fall on the previous, the current or on the next
+ year it is important to provide the information which year is it
+ together with the week number. The function <c>iso_week_number/0</c>
+ and <c>iso_week_number/1</c> returns a tuple of the year and the
+ week number.</p>
</description>
<section>
@@ -154,6 +162,30 @@ time() = {Hour, Minute, Second}
</desc>
</func>
<func>
+ <name>iso_week_number() -> IsoWeekNumber</name>
+ <fsummary>Compute the iso week number for the actual date</fsummary>
+ <type>
+ <v>IsoWeekNumber = {int(), int()}</v>
+ </type>
+ <desc>
+ <p>This function returns the tuple {Year, WeekNum} representing
+ the iso week number for the actual date. For determining the
+ actual date, the function <c>local_time/0</c> is used.</p>
+ </desc>
+ </func>
+ <func>
+ <name>iso_week_number(Date) -> IsoWeekNumber</name>
+ <fsummary>Compute the iso week number for the given date</fsummary>
+ <type>
+ <v>Date = date()</v>
+ <v>IsoWeekNumber = {int(), int()}</v>
+ </type>
+ <desc>
+ <p>This function returns the tuple {Year, WeekNum} representing
+ the iso week number for the given date.</p>
+ </desc>
+ </func>
+ <func>
<name>last_day_of_the_month(Year, Month) -> int()</name>
<fsummary>Compute the number of days in a month</fsummary>
<desc>
diff --git a/lib/stdlib/doc/src/dict.xml b/lib/stdlib/doc/src/dict.xml
index ebcd2eed09..0cc76e0c78 100644
--- a/lib/stdlib/doc/src/dict.xml
+++ b/lib/stdlib/doc/src/dict.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1996</year><year>2009</year>
+ <year>1996</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -55,10 +55,8 @@ dictionary()
</type>
<desc>
<p>This function appends a new <c>Value</c> to the current list
- of values associated with <c>Key</c>. An exception is
- generated if the initial value associated with <c>Key</c> is
- not a list of values.</p>
- </desc>
+ of values associated with <c>Key</c>.</p>
+ </desc>
</func>
<func>
<name>append_list(Key, ValList, Dict1) -> Dict2</name>
@@ -165,8 +163,8 @@ dictionary()
<v>Dict = dictionary()</v>
</type>
<desc>
- <p>This function converts the key/value list <c>List</c> to a
- dictionary.</p>
+ <p>This function converts the <c>Key</c> - <c>Value</c> list
+ <c>List</c> to a dictionary.</p>
</desc>
</func>
<func>
@@ -270,7 +268,7 @@ merge(Fun, D1, D2) ->
<v>Dict1 = Dict2 = dictionary()</v>
</type>
<desc>
- <p>Update the a value in a dictionary by calling <c>Fun</c> on
+ <p>Update a value in a dictionary by calling <c>Fun</c> on
the value to get a new value. An exception is generated if
<c>Key</c> is not present in the dictionary.</p>
</desc>
@@ -285,7 +283,7 @@ merge(Fun, D1, D2) ->
<v>Dict1 = Dict2 = dictionary()</v>
</type>
<desc>
- <p>Update the a value in a dictionary by calling <c>Fun</c> on
+ <p>Update a value in a dictionary by calling <c>Fun</c> on
the value to get a new value. If <c>Key</c> is not present
in the dictionary then <c>Initial</c> will be stored as
the first value. For example <c>append/3</c> could be defined
diff --git a/lib/stdlib/doc/src/erl_expand_records.xml b/lib/stdlib/doc/src/erl_expand_records.xml
index 7fb03e7c50..c93248493f 100644
--- a/lib/stdlib/doc/src/erl_expand_records.xml
+++ b/lib/stdlib/doc/src/erl_expand_records.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2005</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/stdlib/doc/src/erl_internal.xml b/lib/stdlib/doc/src/erl_internal.xml
index 906b95deb7..732d77c3ae 100644
--- a/lib/stdlib/doc/src/erl_internal.xml
+++ b/lib/stdlib/doc/src/erl_internal.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1996</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/stdlib/doc/src/erl_pp.xml b/lib/stdlib/doc/src/erl_pp.xml
index 6b15c5afd3..1fdda48893 100644
--- a/lib/stdlib/doc/src/erl_pp.xml
+++ b/lib/stdlib/doc/src/erl_pp.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1996</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/stdlib/doc/src/filelib.xml b/lib/stdlib/doc/src/filelib.xml
index 969aff4fcb..fab68ae77c 100644
--- a/lib/stdlib/doc/src/filelib.xml
+++ b/lib/stdlib/doc/src/filelib.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2003</year><year>2010</year>
+ <year>2003</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -44,7 +44,7 @@
<section>
<title>DATA TYPES</title>
<code type="none">
-filename() = = string() | atom() | DeepList | RawFilename
+filename() = string() | atom() | DeepList | RawFilename
DeepList = [char() | atom() | DeepList]
RawFilename = binary()
If VM is in unicode filename mode, string() and char() are allowed to be > 255.
@@ -105,7 +105,7 @@ dirname() = filename()</code>
interpreted as Unicode may be encountered, in which case the
<c>fun()</c> must be prepared to handle raw file names
(i.e. binaries). If the regular expression contains
- codepoints beyond 255, it will not match file names that does
+ codepoints beyond 255, it will not match file names that do
not conform to the expected character encoding (i.e. are not
encoded in valid UTF-8).</p>
diff --git a/lib/stdlib/doc/src/io.xml b/lib/stdlib/doc/src/io.xml
index efbb1fc078..41e3e92c59 100644
--- a/lib/stdlib/doc/src/io.xml
+++ b/lib/stdlib/doc/src/io.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1996</year><year>2010</year>
+ <year>1996</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -81,7 +81,8 @@ charlist() = [unicode_char() | unicode_binary() | charlist()]
</section>
<funcs>
<func>
- <name>columns([IoDevice]) -> {ok,int()} | {error, enotsup}</name>
+ <name>columns() -> {ok,int()} | {error, enotsup}</name>
+ <name>columns(IoDevice) -> {ok,int()} | {error, enotsup}</name>
<fsummary>Get the number of columns of a device</fsummary>
<type>
<v>IoDevice = io_device()</v>
@@ -94,7 +95,8 @@ charlist() = [unicode_char() | unicode_binary() | charlist()]
</desc>
</func>
<func>
- <name>put_chars([IoDevice,] IoData) -> ok</name>
+ <name>put_chars(IoData) -> ok</name>
+ <name>put_chars(IoDevice, IoData) -> ok</name>
<fsummary>Write a list of characters</fsummary>
<type>
<v>IoDevice = io_device()</v>
@@ -106,7 +108,8 @@ charlist() = [unicode_char() | unicode_binary() | charlist()]
</desc>
</func>
<func>
- <name>nl([IoDevice]) -> ok</name>
+ <name>nl() -> ok</name>
+ <name>nl(IoDevice) -> ok</name>
<fsummary>Write a newline</fsummary>
<type>
<v>IoDevice = io_device()</v>
@@ -116,7 +119,8 @@ charlist() = [unicode_char() | unicode_binary() | charlist()]
</desc>
</func>
<func>
- <name>get_chars([IoDevice,] Prompt, Count) -> Data | eof</name>
+ <name>get_chars(Prompt, Count) -> Data | eof</name>
+ <name>get_chars(IoDevice, Prompt, Count) -> Data | eof</name>
<fsummary>Read a specified number of characters</fsummary>
<type>
<v>IoDevice = io_device()</v>
@@ -150,7 +154,8 @@ charlist() = [unicode_char() | unicode_binary() | charlist()]
</desc>
</func>
<func>
- <name>get_line([IoDevice,] Prompt) -> Data | eof | {error,Reason}</name>
+ <name>get_line(Prompt) -> Data | eof | {error,Reason}</name>
+ <name>get_line(IoDevice, Prompt) -> Data | eof | {error,Reason}</name>
<fsummary>Read a line</fsummary>
<type>
<v>IoDevice = io_device()</v>
@@ -183,7 +188,8 @@ charlist() = [unicode_char() | unicode_binary() | charlist()]
</desc>
</func>
<func>
- <name>getopts([IoDevice]) -> Opts</name>
+ <name>getopts() -> Opts</name>
+ <name>getopts(IoDevice) -> Opts</name>
<fsummary>Get the supported options and values from an I/O-server</fsummary>
<type>
<v>IoDevice = io_device()</v>
@@ -210,7 +216,8 @@ charlist() = [unicode_char() | unicode_binary() | charlist()]
</desc>
</func>
<func>
- <name>setopts([IoDevice,] Opts) -> ok | {error, Reason}</name>
+ <name>setopts(Opts) -> ok | {error, Reason}</name>
+ <name>setopts(IoDevice, Opts) -> ok | {error, Reason}</name>
<fsummary>Set options</fsummary>
<type>
<v>IoDevice = io_device()</v>
@@ -281,7 +288,8 @@ charlist() = [unicode_char() | unicode_binary() | charlist()]
</desc>
</func>
<func>
- <name>write([IoDevice,] Term) -> ok</name>
+ <name>write(Term) -> ok</name>
+ <name>write(IoDevice, Term) -> ok</name>
<fsummary>Write a term</fsummary>
<type>
<v>IoDevice = io_device()</v>
@@ -293,7 +301,8 @@ charlist() = [unicode_char() | unicode_binary() | charlist()]
</desc>
</func>
<func>
- <name>read([IoDevice,] Prompt) -> Result</name>
+ <name>read(Prompt) -> Result</name>
+ <name>read(IoDevice, Prompt) -> Result</name>
<fsummary>Read a term</fsummary>
<type>
<v>IoDevice = io_device()</v>
@@ -356,9 +365,11 @@ charlist() = [unicode_char() | unicode_binary() | charlist()]
</func>
<func>
<name>fwrite(Format) -></name>
- <name>fwrite([IoDevice,] Format, Data) -> ok</name>
+ <name>fwrite(Format, Data) -> ok</name>
+ <name>fwrite(IoDevice, Format, Data) -> ok</name>
<name>format(Format) -></name>
- <name>format([IoDevice,] Format, Data) -> ok</name>
+ <name>format(Format, Data) -> ok</name>
+ <name>format(IoDevice, Format, Data) -> ok</name>
<fsummary>Write formatted output</fsummary>
<type>
<v>IoDevice = io_device()</v>
@@ -464,9 +475,9 @@ ok</pre>
<p>Prints the argument with the <c>string</c> syntax. The
argument is, if no Unicode translation modifier is present, an
<seealso marker="erts:erlang#iolist_definition">I/O list</seealso>, a binary, or an atom. If the Unicode translation modifier ('t') is in effect, the argument is chardata(), meaning that binaries are in UTF-8. The characters
- are printed without quotes. In this format, the printed
- argument is truncated to the given precision and field
- width.</p>
+ are printed without quotes. The string is first truncated
+ by the given precision and then padded and justified
+ to the given field width. The default precision is the field width.</p>
<p>This format can be used for printing any object and
truncating the output so it fits a specified field:</p>
<pre>
@@ -475,6 +486,8 @@ ok</pre>
ok
4> <input>io:fwrite("|~10s|~n", [io_lib:write({hey, hey, hey})]).</input>
|{hey,hey,h|
+5> <input>io:fwrite("|~-10.8s|~n", [io_lib:write({hey, hey, hey})]).</input>
+|{hey,hey |
ok</pre>
<p>A list with integers larger than 255 is considered an error if the Unicode translation modifier is not given:</p>
<pre>
@@ -660,7 +673,8 @@ ok
</desc>
</func>
<func>
- <name>fread([IoDevice,] Prompt, Format) -> Result</name>
+ <name>fread(Prompt, Format) -> Result</name>
+ <name>fread(IoDevice, Prompt, Format) -> Result</name>
<fsummary>Read formatted input</fsummary>
<type>
<v>IoDevice = io_device()</v>
@@ -820,7 +834,8 @@ enter><input>:</input> <input>alan</input> <input>:</input> <input>joe</in
</desc>
</func>
<func>
- <name>rows([IoDevice]) -> {ok,int()} | {error, enotsup}</name>
+ <name>rows() -> {ok,int()} | {error, enotsup}</name>
+ <name>rows(IoDevice) -> {ok,int()} | {error, enotsup}</name>
<fsummary>Get the number of rows of a device</fsummary>
<type>
<v>IoDevice = io_device()</v>
@@ -834,7 +849,8 @@ enter><input>:</input> <input>alan</input> <input>:</input> <input>joe</in
</func>
<func>
<name>scan_erl_exprs(Prompt) -></name>
- <name>scan_erl_exprs([IoDevice,] Prompt, StartLine) -> Result</name>
+ <name>scan_erl_exprs(Prompt, StartLine) -> Result</name>
+ <name>scan_erl_exprs(IoDevice, Prompt, StartLine) -> Result</name>
<fsummary>Read and tokenize Erlang expressions</fsummary>
<type>
<v>IoDevice = io_device()</v>
@@ -877,7 +893,8 @@ enter><input>1.0er.</input>
</func>
<func>
<name>scan_erl_form(Prompt) -></name>
- <name>scan_erl_form([IoDevice,] Prompt, StartLine) -> Result</name>
+ <name>scan_erl_form(Prompt, StartLine) -> Result</name>
+ <name>scan_erl_form(IoDevice, Prompt, StartLine) -> Result</name>
<fsummary>Read and tokenize an Erlang form</fsummary>
<type>
<v>IoDevice = io_device()</v>
@@ -900,7 +917,8 @@ enter><input>1.0er.</input>
</func>
<func>
<name>parse_erl_exprs(Prompt) -></name>
- <name>parse_erl_exprs([IoDevice,] Prompt, StartLine) -> Result</name>
+ <name>parse_erl_exprs(Prompt, StartLine) -> Result</name>
+ <name>parse_erl_exprs(IoDevice, Prompt, StartLine) -> Result</name>
<fsummary>Read, tokenize and parse Erlang expressions</fsummary>
<type>
<v>IoDevice = io_device()</v>
@@ -943,7 +961,8 @@ enter><input>abc("hey".</input>
</func>
<func>
<name>parse_erl_form(Prompt) -></name>
- <name>parse_erl_form([IoDevice,] Prompt, StartLine) -> Result</name>
+ <name>parse_erl_form(Prompt, StartLine) -> Result</name>
+ <name>parse_erl_form(IoDevice, Prompt, StartLine) -> Result</name>
<fsummary>Read, tokenize and parse an Erlang form</fsummary>
<type>
<v>IoDevice = io_device()</v>
diff --git a/lib/stdlib/doc/src/io_protocol.xml b/lib/stdlib/doc/src/io_protocol.xml
index a97d996d98..3e8ab1affc 100644
--- a/lib/stdlib/doc/src/io_protocol.xml
+++ b/lib/stdlib/doc/src/io_protocol.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1999</year>
- <year>2009</year>
+ <year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
diff --git a/lib/stdlib/doc/src/log_mf_h.xml b/lib/stdlib/doc/src/log_mf_h.xml
index 198a55a63b..f8e11339a7 100644
--- a/lib/stdlib/doc/src/log_mf_h.xml
+++ b/lib/stdlib/doc/src/log_mf_h.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1996</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/stdlib/doc/src/math.xml b/lib/stdlib/doc/src/math.xml
index 990a6b4024..02e4d6e495 100644
--- a/lib/stdlib/doc/src/math.xml
+++ b/lib/stdlib/doc/src/math.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1996</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/stdlib/doc/src/notes.xml b/lib/stdlib/doc/src/notes.xml
index 940044d0a8..8cd499f960 100644
--- a/lib/stdlib/doc/src/notes.xml
+++ b/lib/stdlib/doc/src/notes.xml
@@ -30,6 +30,115 @@
</header>
<p>This document describes the changes made to the STDLIB application.</p>
+<section><title>STDLIB 1.17.3</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Two bugs in io:format for ~F.~Ps has been corrected. When
+ length(S) >= abs(F) > P, the precision P was incorrectly
+ ignored. When F == P > lenght(S) the result was
+ incorrectly left adjusted. Bug found by Ali Yakout who
+ also provided a fix.</p>
+ <p>
+ Own Id: OTP-8989 Aux Id: seq11741 </p>
+ </item>
+ <item>
+ <p>Fix exception generation in the io module
+ <p>
+ Some functions did not generate correct badarg exception
+ on a badarg exception.</p></p>
+ <p>
+ Own Id: OTP-9045</p>
+ </item>
+ <item>
+ <p>
+ Fixes to the dict and orddict module documentation</p>
+ <p>
+ Fixed grammar and one inconsistency (Key - Value instead
+ of key/value, since everywhere else the former is used).
+ (thanks to Filipe David Manana)</p>
+ <p>
+ Own Id: OTP-9083</p>
+ </item>
+ <item>
+ <p>
+ Add ISO week number calculation functions to the calendar
+ module in stdlib</p>
+ <p>
+ This new feature adds the missing week number function to
+ the calendar module of the stdlib application. The
+ implementation conforms to the ISO 8601 standard. The new
+ feature has been implemented tested and documented
+ (thanks to Imre Horvath).</p>
+ <p>
+ Own Id: OTP-9087</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Implement the 'MAY' clauses from RFC4648 regarding the
+ pad character to make mime_decode() and
+ mime_decode_to_string() functions more tolerant of badly
+ padded base64. The RFC is quoted below for easy
+ reference.</p>
+ <p>
+ "RFC4648 Section 3.3 with reference to MIME decoding:
+ Furthermore, such specifications MAY ignore the pad
+ character, "=", treating it as non-alphabet data, if it
+ is present before the end of the encoded data. If more
+ than the allowed number of pad characters is found at the
+ end of the string (e.g., a base 64 string terminated with
+ "==="), the excess pad characters MAY also be ignored."</p>
+ <p>
+ Own Id: OTP-9020</p>
+ </item>
+ <item>
+ <p>
+ Supervisors will no longer save start parameters for
+ temporary processes as they will not be restarted. In the
+ case of simple_one_for_one workers such as ssl-connection
+ processes this will substantial reduce the memory
+ footprint of the supervisor.</p>
+ <p>
+ Own Id: OTP-9064</p>
+ </item>
+ <item>
+ <p>
+ When running escript it is now possible to add the -n
+ flag and the escript will be compiled using +native.</p>
+ <p>
+ Own Id: OTP-9076</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>STDLIB 1.17.2.1</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Several type specifications for standard libraries were
+ wrong in the R14B01 release. This is now corrected. The
+ corrections concern types in re,io,filename and the
+ module erlang itself.</p>
+ <p>
+ Own Id: OTP-9008</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>STDLIB 1.17.2</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/stdlib/doc/src/orddict.xml b/lib/stdlib/doc/src/orddict.xml
index 08c808f822..1b8b74534b 100644
--- a/lib/stdlib/doc/src/orddict.xml
+++ b/lib/stdlib/doc/src/orddict.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2000</year><year>2009</year>
+ <year>2000</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -172,8 +172,8 @@ ordered_dictionary()
<v>Orddict = ordered_dictionary()</v>
</type>
<desc>
- <p>This function converts the key/value list <c>List</c> to a
- dictionary.</p>
+ <p>This function converts the <c>Key</c> - <c>Value</c> list
+ <c>List</c> to a dictionary.</p>
</desc>
</func>
<func>
@@ -277,7 +277,7 @@ merge(Fun, D1, D2) ->
<v>Orddict1 = Orddict2 = ordered_dictionary()</v>
</type>
<desc>
- <p>Update the a value in a dictionary by calling <c>Fun</c> on
+ <p>Update a value in a dictionary by calling <c>Fun</c> on
the value to get a new value. An exception is generated if
<c>Key</c> is not present in the dictionary.</p>
</desc>
@@ -292,7 +292,7 @@ merge(Fun, D1, D2) ->
<v>Orddict1 = Orddict2 = ordered_dictionary()</v>
</type>
<desc>
- <p>Update the a value in a dictionary by calling <c>Fun</c> on
+ <p>Update a value in a dictionary by calling <c>Fun</c> on
the value to get a new value. If <c>Key</c> is not present
in the dictionary then <c>Initial</c> will be stored as
the first value. For example <c>append/3</c> could be defined
diff --git a/lib/stdlib/doc/src/part_notes_history.xml b/lib/stdlib/doc/src/part_notes_history.xml
index 744b009583..5e055ee606 100644
--- a/lib/stdlib/doc/src/part_notes_history.xml
+++ b/lib/stdlib/doc/src/part_notes_history.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2006</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/stdlib/doc/src/pg.xml b/lib/stdlib/doc/src/pg.xml
index 66b9702ae0..b174d4f7d4 100644
--- a/lib/stdlib/doc/src/pg.xml
+++ b/lib/stdlib/doc/src/pg.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1996</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/stdlib/doc/src/re.xml b/lib/stdlib/doc/src/re.xml
index 056e7bc9b9..9091035392 100644
--- a/lib/stdlib/doc/src/re.xml
+++ b/lib/stdlib/doc/src/re.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2007</year>
- <year>2008</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/stdlib/doc/src/shell_default.xml b/lib/stdlib/doc/src/shell_default.xml
index 4f8cc6c5bb..f7e7d5388a 100644
--- a/lib/stdlib/doc/src/shell_default.xml
+++ b/lib/stdlib/doc/src/shell_default.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1996</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/stdlib/doc/src/supervisor.xml b/lib/stdlib/doc/src/supervisor.xml
index 45fa0847a8..d6203bdaa0 100644
--- a/lib/stdlib/doc/src/supervisor.xml
+++ b/lib/stdlib/doc/src/supervisor.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1996</year><year>2010</year>
+ <year>1996</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -83,11 +83,17 @@
supervisor, where all child processes are dynamically added
instances of the same process type, i.e. running the same
code.</p>
- <p>The functions <c>terminate_child/2</c>, <c>delete_child/2</c>
+ <p>The functions <c>delete_child/2</c>
and <c>restart_child/2</c> are invalid for
<c>simple_one_for_one</c> supervisors and will return
<c>{error,simple_one_for_one}</c> if the specified supervisor
uses this restart strategy.</p>
+ <p>The function <c>terminate_child/2</c> can be used for
+ children under <c>simple_one_for_one</c> supervisors by
+ giving the child's <c>pid()</c> as the second argument. If
+ instead the child specification identifier is used,
+ <c>terminate_child/2</c> will return
+ <c>{error,simple_one_for_one}</c>.</p>
</item>
</list>
<p>To prevent a supervisor from getting into an infinite loop of
@@ -311,24 +317,33 @@ child_spec() = {Id,StartFunc,Restart,Shutdown,Type,Modules}
<type>
<v>SupRef = Name | {Name,Node} | {global,Name} | pid()</v>
<v>&nbsp;Name = Node = atom()</v>
- <v>Id = term()</v>
+ <v>Id = pid() | term()</v>
<v>Result = ok | {error,Error}</v>
<v>&nbsp;Error = not_found | simple_one_for_one</v>
</type>
<desc>
- <p>Tells the supervisor <c>SupRef</c> to terminate the child
- process corresponding to the child specification identified
- by <c>Id</c>. The process, if there is one, is terminated but
- the child specification is kept by the supervisor. This means
- that the child process may be later be restarted by
- the supervisor. The child process can also be restarted
- explicitly by calling <c>restart_child/2</c>. Use
- <c>delete_child/2</c> to remove the child specification.</p>
+ <p>Tells the supervisor <c>SupRef</c> to terminate the given
+ child.</p>
+ <p>If the supervisor is not <c>simple_one_for_one</c>,
+ <c>Id</c> must be the child specification identifier. The
+ process, if there is one, is terminated but the child
+ specification is kept by the supervisor. The child process
+ may later be restarted by the supervisor. The child process
+ can also be restarted explicitly by calling
+ <c>restart_child/2</c>. Use <c>delete_child/2</c> to remove
+ the child specification.</p>
+ <p>If the supervisor is <c>simple_one_for_one</c>, <c>Id</c>
+ must be the child process' <c>pid()</c>. I the specified
+ process is alive, but is not a child of the given
+ supervisor, the function will return
+ <c>{error,not_found}</c>. If the child specification
+ identifier is given instead instead of a <c>pid()</c>, the
+ function will return <c>{error,simple_one_for_one}</c>.</p>
+ <p>If successful, the function returns <c>ok</c>. If there is
+ no child specification with the specified <c>Id</c>, the
+ function returns <c>{error,not_found}</c>.</p>
<p>See <c>start_child/2</c> for a description of
<c>SupRef</c>.</p>
- <p>If successful, the function returns <c>ok</c>. If there is
- no child specification with the specified <c>Id</c>,
- the function returns <c>{error,not_found}</c>.</p>
</desc>
</func>
<func>
diff --git a/lib/stdlib/doc/src/supervisor_bridge.xml b/lib/stdlib/doc/src/supervisor_bridge.xml
index b334f57caf..cbd0d9230b 100644
--- a/lib/stdlib/doc/src/supervisor_bridge.xml
+++ b/lib/stdlib/doc/src/supervisor_bridge.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1996</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/stdlib/doc/src/sys.xml b/lib/stdlib/doc/src/sys.xml
index 8cbfb9387b..efa8922a9d 100644
--- a/lib/stdlib/doc/src/sys.xml
+++ b/lib/stdlib/doc/src/sys.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1996</year><year>2009</year>
+ <year>1996</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -243,8 +243,8 @@
customise the value of <c>Misc</c> by exporting
a <c>format_status/2</c> function that contributes
module-specific information;
- see <seealso marker="gen_server#format_status/2">gen_server:format_status/2</seealso>
- and <seealso marker="gen_fsm#format_status/2">gen_fsm:format_status/2</seealso>
+ see <seealso marker="gen_server#Module:format_status/2">gen_server:format_status/2</seealso>
+ and <seealso marker="gen_fsm#Module:format_status/2">gen_fsm:format_status/2</seealso>
for more details.</p>
</desc>
</func>
diff --git a/lib/stdlib/doc/src/timer.xml b/lib/stdlib/doc/src/timer.xml
index 1b34e71490..0baeff1db3 100644
--- a/lib/stdlib/doc/src/timer.xml
+++ b/lib/stdlib/doc/src/timer.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1996</year><year>2009</year>
+ <year>1996</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -203,6 +203,7 @@
<func>
<name>tc(Module, Function, Arguments) -> {Time, Value}</name>
<name>tc(Fun, Arguments) -> {Time, Value}</name>
+ <name>tc(Fun) -> {Time, Value}</name>
<fsummary>Measure the real time it takes to evaluate <c>apply(Module,
Function, Arguments)</c> or <c>apply(Fun, Arguments)</c></fsummary>
<type>
@@ -218,7 +219,7 @@
<tag><c>tc/3</c></tag>
<item>
<p>Evaluates <c>apply(Module, Function, Arguments)</c> and measures
- the elapsed real time as reported by <c>now/0</c>.
+ the elapsed real time as reported by <c>os:timestamp/0</c>.
Returns <c>{Time, Value}</c>, where
<c>Time</c> is the elapsed real time in <em>microseconds</em>,
and <c>Value</c> is what is returned from the apply.</p>
@@ -228,6 +229,11 @@
<p>Evaluates <c>apply(Fun, Arguments)</c>. Otherwise works
like <c>tc/3</c>.</p>
</item>
+ <tag><c>tc/1</c></tag>
+ <item>
+ <p>Evaluates <c>Fun()</c>. Otherwise works like <c>tc/2</c>.</p>
+ </item>
+
</taglist>
</desc>
</func>
diff --git a/lib/stdlib/doc/src/unicode.xml b/lib/stdlib/doc/src/unicode.xml
index 60edd8ade9..cb1cfa8ed0 100644
--- a/lib/stdlib/doc/src/unicode.xml
+++ b/lib/stdlib/doc/src/unicode.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1996</year>
- <year>2009</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
@@ -40,7 +40,7 @@
<section>
<title>DATA TYPES</title>
- <marker id="charlist_definition"></marker>
+ <marker id="type-charlist"></marker>
<code type="none">
unicode_binary() = binary() with characters encoded in UTF-8 coding standard
unicode_char() = integer() representing valid unicode codepoint
@@ -164,10 +164,16 @@ latin1_charlist() = [latin1_char() | latin1_binary() | latin1_charlist()]
<item>Integers out of range - If <c>InEncoding</c> is
<c>latin1</c>, an error occurs whenever an integer greater
than 255 is found in the lists. If <c>InEncoding</c> is
- of a Unicode type, error occurs whenever an integer greater than
- <c>16#10FFFF</c> (the maximum unicode character) or in the
- range <c>16#D800</c> to <c>16#DFFF</c> (invalid unicode
- range) is found.</item>
+ of a Unicode type, an error occurs whenever an integer
+ <list type="bulleted">
+ <item>greater than <c>16#10FFFF</c>
+ (the maximum unicode character),</item>
+ <item>in the range <c>16#D800</c> to <c>16#DFFF</c>
+ (invalid unicode range)</item>
+ <item>or equal to 16#FFFE or 16#FFFF (non characters)</item>
+ </list>
+ is found.
+ </item>
<item>UTF encoding incorrect - If <c>InEncoding</c> is
one of the UTF types, the bytes in any binaries have to be valid
diff --git a/lib/stdlib/doc/src/unicode_usage.xml b/lib/stdlib/doc/src/unicode_usage.xml
index c02ea3cbcb..416df1f02c 100644
--- a/lib/stdlib/doc/src/unicode_usage.xml
+++ b/lib/stdlib/doc/src/unicode_usage.xml
@@ -173,19 +173,19 @@ Eshell V5.7 (abort with ^G)
<taglist>
<tag>Mandatory Unicode file naming</tag>
<item>
-<p>Windows and, for most common uses, MacOSX enforces Unicode support for file names. All files created in the filesystem has names that can consistently be interpreted. In MacOSX, all file names are retrieved in UTF-8 encoding, while Windows have selected an approach where each system call handling file names has a special Unicode aware variant, giving much the same effect. There are no file names on these systems that are not Unicode file names, why the default behavior of the Erlang VM is to work in &quot;Unicode file name translation mode&quot;, meaning that a file name can be given as a Unicode list and that will be automatically translated to the proper name encoding for the underlying operating and file system.</p>
+<p>Windows and, for most common uses, MacOSX enforces Unicode support for file names. All files created in the filesystem have names that can consistently be interpreted. In MacOSX, all file names are retrieved in UTF-8 encoding, while Windows has selected an approach where each system call handling file names has a special Unicode aware variant, giving much the same effect. There are no file names on these systems that are not Unicode file names, why the default behavior of the Erlang VM is to work in &quot;Unicode file name translation mode&quot;, meaning that a file name can be given as a Unicode list and that will be automatically translated to the proper name encoding for the underlying operating and file system.</p>
<p>Doing i.e. a <c>file:list_dir/1</c> on one of these systems may return Unicode lists with codepoints beyond 255, depending on the content of the actual filesystem.</p>
<p>As the feature is fairly new, you may still stumble upon non core applications that cannot handle being provided with file names containing characters with codepoints larger than 255, but the core Erlang system should have no problems with Unicode file names.</p>
</item>
<tag>Transparent file naming</tag>
<item>
<p>Most Unix operating systems have adopted a simpler approach, namely that Unicode file naming is not enforced, but by convention. Those systems usually use UTF-8 encoding for Unicode file names, but do not enforce it. On such a system, a file name containing characters having codepoints between 128 and 255 may be named either as plain ISO-latin-1 or using UTF-8 encoding. As no consistency is enforced, the Erlang VM can do no consistent translation of all file names. If the VM would automatically select encoding based on heuristics, one could get unexpected behavior on these systems, therefore file names not being encoded in UTF-8 are returned as &quot;raw file names&quot; if Unicode file naming support is turned on.</p>
-<p>A raw file name is not a list, but a binary. Many non core applications still does not handle file names given as binaries, why such raw names are avoided by default. This means that systems having implemented Unicode file naming through transparent file systems and an UTF-8 convention, does not by default have Unicode file naming turned on. Explicitly turning Unicode file name handling on for these types of systems is considered experimental.</p>
+<p>A raw file name is not a list, but a binary. Many non core applications still do not handle file names given as binaries, why such raw names are avoided by default. This means that systems having implemented Unicode file naming through transparent file systems and an UTF-8 convention, do not by default have Unicode file naming turned on. Explicitly turning Unicode file name handling on for these types of systems is considered experimental.</p>
</item>
</taglist>
<p>The Unicode file naming support was introduced with OTP release R14B01. A VM operating in Unicode file mode can work with files having names in any language or character set (as long as it's supported by the underlying OS and file system). The Unicode character list is used to denote file or directory names and if the file system content is listed, you will also be able to get Unicode lists as return value. The support lies in the kernel and stdlib modules, why most applications (that does not explicitly require the file names to be in the ISO-latin-1 range) will benefit from the Unicode support without change.</p>
-<p>On Operating systems with mandatory Unicode file names, this means that you more easily conform to the file names of other (non Erlang) applications, and you can also process file names that, at least on Windows, where completely inaccessible (due to having names that could not be represented in ISO-latin-1). Also you will avoid creating incomprehensible file names on MacOSX as the vfs layer of the OS will accept all your file names as UTF-8 and will not rewrite them.</p>
+<p>On Operating systems with mandatory Unicode file names, this means that you more easily conform to the file names of other (non Erlang) applications, and you can also process file names that, at least on Windows, were completely inaccessible (due to having names that could not be represented in ISO-latin-1). Also you will avoid creating incomprehensible file names on MacOSX as the vfs layer of the OS will accept all your file names as UTF-8 and will not rewrite them.</p>
<p>For most systems, turning on Unicode file name translation is no problem even if it uses transparent file naming. Very few systems have mixed file name encodings. A consistent UTF-8 named system will work perfectly in Unicode file name mode. It is still however considered experimental in R14B01. Unicode file name translation is turned on with the <c>+fnu</c> switch to the <c>erl</c> program. If the VM is started in Unicode file name translation mode, <c>file:native_name_encoding/0</c> will return the atom <c>utf8</c>.</p>
@@ -197,10 +197,10 @@ Eshell V5.7 (abort with ^G)
<section>
<title>Notes about raw file names and automatic file name conversion</title>
-<p>Raw file names is introduced together with Unicode file name support in erts-5.8.2 (OTP R14B01). The reason the &quot;raw file names&quot; is introduced in the system is to be able to consistently represent file names given in different encodings on the same system. Having the VM automatically translate a file name that is not in UTF-8 when to a list of Unicode characters might seem practical, but this would open up for both duplicate file names and other inconsistent behavior. Consider a directory containing a file named &quot;bj�rn&quot; in ISO-latin-1, while the Erlang VM is operating in Unicode file name mode (and therefore expecting UTF-8 file naming). The ISO-latin-1 name is not valid UTF-8 and one could be tempted to think that automatic conversion in for example <c>file:list_dir/1</c> is a good idea. But what would happen if we later tried to open the file and has the name as a Unicode list (magically converted from the ISO-latin-1 file name)? The VM will convert the file name given to UTF-8, as this is the encoding expected. Effectively this means trying to open the file named &lt;&lt;&quot;bj�rn&quot;/utf8&gt;&gt;. This file does not exist, and even if it existed it would not be the same file as the one that was listed. We could even create two files named &quot;bj�rn&quot;, one named in the UTF-8 encoding and one not. If <c>file:list_dir/1</c> would automatically convert the ISO-latin-1 file name to a list, we would get two identical file names as the result. To avoid this, we need to differentiate between file names being properly encoded according to the Unicode file naming convention (i.e. UTF-8) and file names being invalid under the encoding. This is done by representing invalid encoding as &quot;raw&quot; file names, i.e. as binaries.</p>
-<p>The core system of Erlang (kernel and stdlib) accept raw file names except for loadable drivers and executables invoked using <c>open_port({spawn, ...} ...)</c>. <c>open_port({spawn_executable, ...} ...)</c> however does accept them. As mentioned earlier, the arguments given in the option list to <c>open_port({spawn_executable, ...} ...)</c> undergo the same conversion as the file names, meaning that the executable will be provided with arguments in UTF-8 as well. This translation is avoided consistently with how the file names are treated, by giving the argument as a binary.</p>
+<p>Raw file names is introduced together with Unicode file name support in erts-5.8.2 (OTP R14B01). The reason &quot;raw file names&quot; is introduced in the system is to be able to consistently represent file names given in different encodings on the same system. Having the VM automatically translate a file name that is not in UTF-8 to a list of Unicode characters might seem practical, but this would open up for both duplicate file names and other inconsistent behavior. Consider a directory containing a file named &quot;bj�rn&quot; in ISO-latin-1, while the Erlang VM is operating in Unicode file name mode (and therefore expecting UTF-8 file naming). The ISO-latin-1 name is not valid UTF-8 and one could be tempted to think that automatic conversion in for example <c>file:list_dir/1</c> is a good idea. But what would happen if we later tried to open the file and have the name as a Unicode list (magically converted from the ISO-latin-1 file name)? The VM will convert the file name given to UTF-8, as this is the encoding expected. Effectively this means trying to open the file named &lt;&lt;&quot;bj�rn&quot;/utf8&gt;&gt;. This file does not exist, and even if it existed it would not be the same file as the one that was listed. We could even create two files named &quot;bj�rn&quot;, one named in the UTF-8 encoding and one not. If <c>file:list_dir/1</c> would automatically convert the ISO-latin-1 file name to a list, we would get two identical file names as the result. To avoid this, we need to differentiate between file names being properly encoded according to the Unicode file naming convention (i.e. UTF-8) and file names being invalid under the encoding. This is done by representing invalid encoding as &quot;raw&quot; file names, i.e. as binaries.</p>
+<p>The core system of Erlang (kernel and stdlib) accepts raw file names except for loadable drivers and executables invoked using <c>open_port({spawn, ...} ...)</c>. <c>open_port({spawn_executable, ...} ...)</c> however does accept them. As mentioned earlier, the arguments given in the option list to <c>open_port({spawn_executable, ...} ...)</c> undergo the same conversion as the file names, meaning that the executable will be provided with arguments in UTF-8 as well. This translation is avoided consistently with how the file names are treated, by giving the argument as a binary.</p>
<p>To force Unicode file name translation mode on systems where this is not the default is considered experimental in OTP R14B01 due to the raw file names possibly being a new experience to the programmer and that the non core applications of OTP are not tested for compliance with raw file names yet. Unicode file name translation is expected to be default in future releases.</p>
-<p>If working with raw file names, one can still conform to the encoding convention of the Erlang VM by using the <c>file:native_name_encoding/0</c> function, which returns either the atom <c>latin1</c> or the atom <c>utf8</c> depending on the file name translation mode. On Linux, an VM started without explicitly stating the file name translation mode will default to <c>latin1</c> as the native file name encoding, why file names on the disk encoded as UTF-8 will be returned as a list of the names interpreted as ISO-latin-1. The &quot;UTF-8 list&quot; is not a practical type for displaying or operating on in Erlang, but it is backward compatible and usable in all functions requiring a file name. On Windows and MacOSX, the default behavior is that of file name translation, why the <c>file:native_name_encoding/0</c> by default returns <c>utf8</c> on those systems (the fact that Windows actually does not use UTF-8 on the file system level can safely be ignored by the Erlang programmer). The default behavior can be changed using the <c>+fnu</c> or <c>+fnl</c> options to the VM, see the <c>erl</c> command manual page.</p>
+<p>If working with raw file names, one can still conform to the encoding convention of the Erlang VM by using the <c>file:native_name_encoding/0</c> function, which returns either the atom <c>latin1</c> or the atom <c>utf8</c> depending on the file name translation mode. On Linux, a VM started without explicitly stating the file name translation mode will default to <c>latin1</c> as the native file name encoding, why file names on the disk encoded as UTF-8 will be returned as a list of the names interpreted as ISO-latin-1. The &quot;UTF-8 list&quot; is not a practical type for displaying or operating on in Erlang, but it is backward compatible and usable in all functions requiring a file name. On Windows and MacOSX, the default behavior is that of file name translation, why the <c>file:native_name_encoding/0</c> by default returns <c>utf8</c> on those systems (the fact that Windows actually does not use UTF-8 on the file system level can safely be ignored by the Erlang programmer). The default behavior can be changed using the <c>+fnu</c> or <c>+fnl</c> options to the VM, see the <c>erl</c> command manual page.</p>
<p>Even if you are operating without Unicode file naming translation automatically done by the VM, you can access and create files with names in UTF-8 encoding by using raw file names encoded as UTF-8. Enforcing the UTF-8 encoding regardless of the mode the Erlang VM is started in might, in some circumstances be a good idea, as the convention of using UTF-8 file names is spreading.</p>
</section>
<section>
diff --git a/lib/stdlib/doc/src/zip.xml b/lib/stdlib/doc/src/zip.xml
index 4d98a20206..529a70a23d 100644
--- a/lib/stdlib/doc/src/zip.xml
+++ b/lib/stdlib/doc/src/zip.xml
@@ -34,11 +34,11 @@
<module>zip</module>
<modulesummary>Utility for reading and creating 'zip' archives.</modulesummary>
<description>
- <p>The <c>zip</c> module archives and extract files to and from a zip
+ <p>The <c>zip</c> module archives and extracts files to and from a zip
archive. The zip format is specified by the "ZIP Appnote.txt" file
available on PKWare's website www.pkware.com.</p>
<p>The zip module supports zip archive versions up to 6.1. However,
- password-protection and Zip64 is not supported.</p>
+ password-protection and Zip64 are not supported.</p>
<p>By convention, the name of a zip file should end in "<c>.zip</c>".
To abide to the convention, you'll need to add "<c>.zip</c>" yourself
to the name.</p>
@@ -52,7 +52,7 @@
<seealso marker="#unzip_2">unzip/2</seealso> function. (They are
also available as <c>extract</c>.)</p>
<p>To fold a function over all files in a zip archive, use the
- <seealso marker="#foldl_3">foldl_3</seealso>.</p>
+ <seealso marker="#foldl_3">foldl_3</seealso> function.</p>
<p>To return a list of the files in a zip archive, use the
<seealso marker="#list_dir_1">list_dir/1</seealso> or the
<seealso marker="#list_dir_2">list_dir/2</seealso> function. (They
@@ -155,13 +155,13 @@ zip_file() </code>
<p>Files will be compressed using the DEFLATE compression, as
described in the Appnote.txt file. However, files will be
stored without compression if they already are compressed.
- The <c>zip/2</c> and <c>zip/3</c> checks the file extension
+ The <c>zip/2</c> and <c>zip/3</c> functions check the file extension
to see whether the file should be stored without compression.
Files with the following extensions are not compressed:
<c>.Z</c>, <c>.zip</c>, <c>.zoo</c>, <c>.arc</c>, <c>.lzh</c>,
<c>.arj</c>.</p>
<p>It is possible to override the default behavior and
- explicitly control what types of files that should be
+ explicitly control what types of files should be
compressed by using the <c>{compress, What}</c> and
<c>{uncompress, What}</c> options. It is possible to have
several <c>compress</c> and <c>uncompress</c> options. In
@@ -208,7 +208,7 @@ zip_file() </code>
</item>
<tag><c>{compress, What}</c></tag>
<item>
- <p>Controls what types of files that will be
+ <p>Controls what types of files will be
compressed. It is by default set to <c>all</c>. The
following values of <c>What</c> are allowed:</p>
<taglist>
@@ -228,7 +228,7 @@ zip_file() </code>
</item>
<tag><c>{uncompress, What}</c></tag>
<item>
- <p>Controls what types of files that will be uncompressed. It is by
+ <p>Controls what types of files will be uncompressed. It is by
default set to <c>[".Z",".zip",".zoo",".arc",".lzh",".arj"]</c>.
The following values of <c>What</c> are allowed:</p>
<taglist>
@@ -292,7 +292,7 @@ zip_file() </code>
<p>By default, the <c>open/2</c> function will open the
zip file in <c>raw</c> mode, which is faster but does not allow
a remote (erlang) file server to be used. Adding <c>cooked</c>
- to the mode list will override the default and open zip file
+ to the mode list will override the default and open the zip file
without the <c>raw</c> option. The same goes for the files
extracted.</p>
</item>
@@ -301,7 +301,7 @@ zip_file() </code>
<p>By default, all existing files with the same name as file in
the zip archive will be overwritten. With the <c>keep_old_files</c>
option, the <c>unzip/2</c> function will not overwrite any existing
- files. Not that even with the <c>memory</c> option given, which
+ files. Note that even with the <c>memory</c> option given, which
means that no files will be overwritten, files existing will be
excluded from the result.</p>
</item>
@@ -418,7 +418,7 @@ zip_file() </code>
<p>By default, the <c>open/2</c> function will open the
zip file in <c>raw</c> mode, which is faster but does not allow
a remote (erlang) file server to be used. Adding <c>cooked</c>
- to the mode list will override the default and open zip file
+ to the mode list will override the default and open the zip file
without the <c>raw</c> option.</p>
</item>
</taglist>
diff --git a/lib/stdlib/src/base64.erl b/lib/stdlib/src/base64.erl
index ebef998ee1..a14a72ac6d 100644
--- a/lib/stdlib/src/base64.erl
+++ b/lib/stdlib/src/base64.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -114,7 +114,7 @@ decode(List) when is_list(List) ->
mime_decode(Bin) when is_binary(Bin) ->
mime_decode_binary(<<>>, Bin);
mime_decode(List) when is_list(List) ->
- list_to_binary(mime_decode_l(List)).
+ mime_decode(list_to_binary(List)).
-spec decode_l(string()) -> string().
@@ -125,7 +125,7 @@ decode_l(List) ->
-spec mime_decode_l(string()) -> string().
mime_decode_l(List) ->
- L = strip_illegal(List, []),
+ L = strip_illegal(List, [], 0),
decode(L, []).
%%-------------------------------------------------------------------------
@@ -198,6 +198,9 @@ decode_binary(Result, <<>>) ->
true = is_binary(Result),
Result.
+%% Skipping pad character if not at end of string. Also liberal about
+%% excess padding and skipping of other illegal (non-base64 alphabet)
+%% characters. See section 3.3 of RFC4648
mime_decode_binary(Result, <<0:8,T/bits>>) ->
mime_decode_binary(Result, T);
mime_decode_binary(Result0, <<C:8,T/bits>>) ->
@@ -205,15 +208,27 @@ mime_decode_binary(Result0, <<C:8,T/bits>>) ->
Bits when is_integer(Bits) ->
mime_decode_binary(<<Result0/bits,Bits:6>>, T);
eq ->
- case tail_contains_equal(T) of
- true ->
- Split = byte_size(Result0) - 1,
- <<Result:Split/bytes,_:4>> = Result0,
- Result;
- false ->
- Split = byte_size(Result0) - 1,
- <<Result:Split/bytes,_:2>> = Result0,
- Result
+ case tail_contains_more(T, false) of
+ {<<>>, Eq} ->
+ %% No more valid data.
+ case bit_size(Result0) rem 8 of
+ 0 ->
+ %% '====' is not uncommon.
+ Result0;
+ 4 when Eq ->
+ %% enforce at least one more '=' only ignoring illegals and spacing
+ Split = byte_size(Result0) - 1,
+ <<Result:Split/bytes,_:4>> = Result0,
+ Result;
+ 2 ->
+ %% remove 2 bits
+ Split = byte_size(Result0) - 1,
+ <<Result:Split/bytes,_:2>> = Result0,
+ Result
+ end;
+ {More, _} ->
+ %% More valid data, skip the eq as invalid
+ mime_decode_binary(Result0, More)
end;
_ ->
mime_decode_binary(Result0, T)
@@ -262,31 +277,63 @@ strip_ws(<<$\s,T/binary>>) ->
strip_ws(T);
strip_ws(T) -> T.
-strip_illegal([0|Cs], A) ->
- strip_illegal(Cs, A);
-strip_illegal([C|Cs], A) ->
+%% Skipping pad character if not at end of string. Also liberal about
+%% excess padding and skipping of other illegal (non-base64 alphabet)
+%% characters. See section 3.3 of RFC4648
+strip_illegal([], A, _Cnt) ->
+ A;
+strip_illegal([0|Cs], A, Cnt) ->
+ strip_illegal(Cs, A, Cnt);
+strip_illegal([C|Cs], A, Cnt) ->
case element(C, ?DECODE_MAP) of
- bad -> strip_illegal(Cs, A);
- ws -> strip_illegal(Cs, A);
- eq -> strip_illegal_end(Cs, [$=|A]);
- _ -> strip_illegal(Cs, [C|A])
- end;
-strip_illegal([], A) -> A.
+ bad ->
+ strip_illegal(Cs, A, Cnt);
+ ws ->
+ strip_illegal(Cs, A, Cnt);
+ eq ->
+ case {tail_contains_more(Cs, false), Cnt rem 4} of
+ {{[], _}, 0} ->
+ A; %% Ignore extra =
+ {{[], true}, 2} ->
+ [$=|[$=|A]]; %% 'XX=='
+ {{[], _}, 3} ->
+ [$=|A]; %% 'XXX='
+ {{[H|T], _}, _} ->
+ %% more data, skip equals
+ strip_illegal(T, [H|A], Cnt+1)
+ end;
+ _ ->
+ strip_illegal(Cs, [C|A], Cnt+1)
+ end.
-strip_illegal_end([0|Cs], A) ->
- strip_illegal_end(Cs, A);
-strip_illegal_end([C|Cs], A) ->
+%% Search the tail for more valid data and remember if we saw
+%% another equals along the way.
+tail_contains_more([], Eq) ->
+ {[], Eq};
+tail_contains_more(<<>>, Eq) ->
+ {<<>>, Eq};
+tail_contains_more([C|T]=More, Eq) ->
case element(C, ?DECODE_MAP) of
- bad -> strip_illegal(Cs, A);
- ws -> strip_illegal(Cs, A);
- eq -> [C|A];
- _ -> strip_illegal(Cs, [C|A])
+ bad ->
+ tail_contains_more(T, Eq);
+ ws ->
+ tail_contains_more(T, Eq);
+ eq ->
+ tail_contains_more(T, true);
+ _ ->
+ {More, Eq}
end;
-strip_illegal_end([], A) -> A.
-
-tail_contains_equal(<<$=,_/binary>>) -> true;
-tail_contains_equal(<<_,T/binary>>) -> tail_contains_equal(T);
-tail_contains_equal(<<>>) -> false.
+tail_contains_more(<<C:8,T/bits>> =More, Eq) ->
+ case element(C, ?DECODE_MAP) of
+ bad ->
+ tail_contains_more(T, Eq);
+ ws ->
+ tail_contains_more(T, Eq);
+ eq ->
+ tail_contains_more(T, true);
+ _ ->
+ {More, Eq}
+ end.
%% accessors
b64e(X) ->
diff --git a/lib/stdlib/src/c.erl b/lib/stdlib/src/c.erl
index d04d8f191f..235ea939a8 100644
--- a/lib/stdlib/src/c.erl
+++ b/lib/stdlib/src/c.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -42,31 +42,31 @@
-spec help() -> 'ok'.
help() ->
- format("bt(Pid) -- stack backtrace for a process\n"
- "c(File) -- compile and load code in <File>\n"
- "cd(Dir) -- change working directory\n"
- "flush() -- flush any messages sent to the shell\n"
- "help() -- help info\n"
- "i() -- information about the system\n"
- "ni() -- information about the networked system\n"
- "i(X,Y,Z) -- information about pid <X,Y,Z>\n"
- "l(Module) -- load or reload module\n"
- "lc([File]) -- compile a list of Erlang modules\n"
- "ls() -- list files in the current directory\n"
- "ls(Dir) -- list files in directory <Dir>\n"
- "m() -- which modules are loaded\n"
- "m(Mod) -- information about module <Mod>\n"
- "memory() -- memory allocation information\n"
- "memory(T) -- memory allocation information of type <T>\n"
- "nc(File) -- compile and load code in <File> on all nodes\n"
- "nl(Module) -- load module on all nodes\n"
- "pid(X,Y,Z) -- convert X,Y,Z to a Pid\n"
- "pwd() -- print working directory\n"
- "q() -- quit - shorthand for init:stop()\n"
- "regs() -- information about registered processes\n"
- "nregs() -- information about all registered processes\n"
- "xm(M) -- cross reference check a module\n"
- "y(File) -- generate a Yecc parser\n").
+ io:put_chars(<<"bt(Pid) -- stack backtrace for a process\n"
+ "c(File) -- compile and load code in <File>\n"
+ "cd(Dir) -- change working directory\n"
+ "flush() -- flush any messages sent to the shell\n"
+ "help() -- help info\n"
+ "i() -- information about the system\n"
+ "ni() -- information about the networked system\n"
+ "i(X,Y,Z) -- information about pid <X,Y,Z>\n"
+ "l(Module) -- load or reload module\n"
+ "lc([File]) -- compile a list of Erlang modules\n"
+ "ls() -- list files in the current directory\n"
+ "ls(Dir) -- list files in directory <Dir>\n"
+ "m() -- which modules are loaded\n"
+ "m(Mod) -- information about module <Mod>\n"
+ "memory() -- memory allocation information\n"
+ "memory(T) -- memory allocation information of type <T>\n"
+ "nc(File) -- compile and load code in <File> on all nodes\n"
+ "nl(Module) -- load module on all nodes\n"
+ "pid(X,Y,Z) -- convert X,Y,Z to a Pid\n"
+ "pwd() -- print working directory\n"
+ "q() -- quit - shorthand for init:stop()\n"
+ "regs() -- information about registered processes\n"
+ "nregs() -- information about all registered processes\n"
+ "xm(M) -- cross reference check a module\n"
+ "y(File) -- generate a Yecc parser\n">>).
%% c(FileName)
%% Compile a file/module.
diff --git a/lib/stdlib/src/calendar.erl b/lib/stdlib/src/calendar.erl
index ddc0666f77..33725d999c 100644
--- a/lib/stdlib/src/calendar.erl
+++ b/lib/stdlib/src/calendar.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -28,6 +28,8 @@
gregorian_days_to_date/1,
gregorian_seconds_to_datetime/1,
is_leap_year/1,
+ iso_week_number/0,
+ iso_week_number/1,
last_day_of_the_month/2,
local_time/0,
local_time_to_universal_time/1,
@@ -70,6 +72,7 @@
-type second() :: 0..59.
-type daynum() :: 1..7.
-type ldom() :: 28 | 29 | 30 | 31. % last day of month
+-type weeknum() :: 1..53.
-type t_now() :: {non_neg_integer(),non_neg_integer(),non_neg_integer()}.
@@ -77,6 +80,7 @@
-type t_time() :: {hour(),minute(),second()}.
-type t_datetime() :: {t_date(),t_time()}.
-type t_datetime1970() :: {{year1970(),month(),day()},t_time()}.
+-type t_yearweeknum() :: {year(),weeknum()}.
%%----------------------------------------------------------------------
@@ -172,6 +176,42 @@ is_leap_year1(Year) when Year rem 400 =:= 0 ->
is_leap_year1(_) -> false.
+%%
+%% Calculates the iso week number for the current date.
+%%
+-spec iso_week_number() -> t_yearweeknum().
+iso_week_number() ->
+ {Date, _} = local_time(),
+ iso_week_number(Date).
+
+
+%%
+%% Calculates the iso week number for the given date.
+%%
+-spec iso_week_number(t_date()) -> t_yearweeknum().
+iso_week_number({Year, Month, Day}) ->
+ D = date_to_gregorian_days({Year, Month, Day}),
+ W01_1_Year = gregorian_days_of_iso_w01_1(Year),
+ W01_1_NextYear = gregorian_days_of_iso_w01_1(Year + 1),
+ if W01_1_Year =< D andalso D < W01_1_NextYear ->
+ % Current Year Week 01..52(,53)
+ {Year, (D - W01_1_Year) div 7 + 1};
+ D < W01_1_Year ->
+ % Previous Year 52 or 53
+ PWN = case day_of_the_week(Year - 1, 1, 1) of
+ 4 -> 53;
+ _ -> case day_of_the_week(Year - 1, 12, 31) of
+ 4 -> 53;
+ _ -> 52
+ end
+ end,
+ {Year - 1, PWN};
+ W01_1_NextYear =< D ->
+ % Next Year, Week 01
+ {Year + 1, 1}
+ end.
+
+
%% last_day_of_the_month(Year, Month)
%%
%% Returns the number of days in a month.
@@ -377,6 +417,19 @@ dty(Y, D1, D2) when D1 < D2 ->
dty(Y, _D1, D2) ->
{Y, D2}.
+%%
+%% The Gregorian days of the iso week 01 day 1 for a given year.
+%%
+-spec gregorian_days_of_iso_w01_1(year()) -> non_neg_integer().
+gregorian_days_of_iso_w01_1(Year) ->
+ D0101 = date_to_gregorian_days(Year, 1, 1),
+ DOW = day_of_the_week(Year, 1, 1),
+ if DOW =< 4 ->
+ D0101 - DOW + 1;
+ true ->
+ D0101 + 7 - DOW + 1
+ end.
+
%% year_day_to_date(Year, DayOfYear) = {Month, DayOfMonth}
%%
%% Note: 1 is the first day of the month.
diff --git a/lib/stdlib/src/erl_lint.erl b/lib/stdlib/src/erl_lint.erl
index 0c2d3db8ec..cfb9f0ca98 100644
--- a/lib/stdlib/src/erl_lint.erl
+++ b/lib/stdlib/src/erl_lint.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -60,6 +60,10 @@ value_option(Flag, Default, On, OnVal, Off, OffVal, Opts) ->
(_Opt, Def) -> Def
end, Default, Opts).
+%% The maximum number of arguments allowed for a function.
+
+-define(MAX_ARGUMENTS, 255).
+
%% The error and warning info structures, {Line,Module,Descriptor},
%% are kept in their seperate fields in the lint state record together
%% with the name of the file (when a new file is entered, marked by
@@ -226,6 +230,9 @@ format_error({obsolete_guard, {F, A}}) ->
io_lib:format("~p/~p obsolete", [F, A]);
format_error({reserved_for_future,K}) ->
io_lib:format("atom ~w: future reserved keyword - rename or quote", [K]);
+format_error({too_many_arguments,Arity}) ->
+ io_lib:format("too many arguments (~w) - "
+ "maximum allowed is ~w", [Arity,?MAX_ARGUMENTS]);
%% --- patterns and guards ---
format_error(illegal_pattern) -> "illegal pattern";
format_error(illegal_bin_pattern) ->
@@ -1307,13 +1314,18 @@ define_function(Line, Name, Arity, St0) ->
true ->
add_error(Line, {redefine_function,NA}, St1);
false ->
- St2 = St1#lint{defined=gb_sets:add_element(NA, St1#lint.defined)},
- case imported(Name, Arity, St2) of
- {yes,_M} -> add_error(Line, {define_import,NA}, St2);
- no -> St2
+ St2 = function_check_max_args(Line, Arity, St1),
+ St3 = St2#lint{defined=gb_sets:add_element(NA, St2#lint.defined)},
+ case imported(Name, Arity, St3) of
+ {yes,_M} -> add_error(Line, {define_import,NA}, St3);
+ no -> St3
end
end.
+function_check_max_args(Line, Arity, St) when Arity > ?MAX_ARGUMENTS ->
+ add_error(Line, {too_many_arguments,Arity}, St);
+function_check_max_args(_, _, St) -> St.
+
%% clauses([Clause], VarTable, State) -> {VarTable, State}.
clauses(Cs, Vt, St) ->
diff --git a/lib/stdlib/src/erl_parse.yrl b/lib/stdlib/src/erl_parse.yrl
index bb4b18cf9b..15b45d72f4 100644
--- a/lib/stdlib/src/erl_parse.yrl
+++ b/lib/stdlib/src/erl_parse.yrl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -757,7 +757,8 @@ record_fields([{typed,Expr,TypeInfo}|Fields]) ->
{atom, La, _} ->
case has_undefined(TypeInfo) of
false ->
- lift_unions(abstract(undefined, La), TypeInfo);
+ TypeInfo2 = maybe_add_paren(TypeInfo),
+ lift_unions(abstract(undefined, La), TypeInfo2);
true ->
TypeInfo
end
@@ -778,6 +779,11 @@ has_undefined({type,_,union,Ts}) ->
has_undefined(_) ->
false.
+maybe_add_paren({ann_type,L,T}) ->
+ {paren_type,L,[{ann_type,L,T}]};
+maybe_add_paren(T) ->
+ T.
+
term(Expr) ->
try normalise(Expr)
catch _:_R -> ret_err(?line(Expr), "bad attribute")
diff --git a/lib/stdlib/src/erl_posix_msg.erl b/lib/stdlib/src/erl_posix_msg.erl
index fe981b23a7..909cc1d102 100644
--- a/lib/stdlib/src/erl_posix_msg.erl
+++ b/lib/stdlib/src/erl_posix_msg.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2010. 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
@@ -24,143 +24,146 @@
-spec message(atom()) -> string().
-message(e2big) -> "argument list too long";
-message(eacces) -> "permission denied";
-message(eaddrinuse) -> "address already in use";
-message(eaddrnotavail) -> "can't assign requested address";
-message(eadv) -> "advertise error";
-message(eafnosupport) -> "address family not supported by protocol family";
-message(eagain) -> "resource temporarily unavailable";
-message(ealign) -> "EALIGN";
-message(ealready) -> "operation already in progress";
-message(ebade) -> "bad exchange descriptor";
-message(ebadf) -> "bad file number";
-message(ebadfd) -> "file descriptor in bad state";
-message(ebadmsg) -> "not a data message";
-message(ebadr) -> "bad request descriptor";
-message(ebadrpc) -> "RPC structure is bad";
-message(ebadrqc) -> "bad request code";
-message(ebadslt) -> "invalid slot";
-message(ebfont) -> "bad font file format";
-message(ebusy) -> "file busy";
-message(echild) -> "no children";
-message(echrng) -> "channel number out of range";
-message(ecomm) -> "communication error on send";
-message(econnaborted) -> "software caused connection abort";
-message(econnrefused) -> "connection refused";
-message(econnreset) -> "connection reset by peer";
-message(edeadlk) -> "resource deadlock avoided";
-message(edeadlock) -> "resource deadlock avoided";
-message(edestaddrreq) -> "destination address required";
-message(edirty) -> "mounting a dirty fs w/o force";
-message(edom) -> "math argument out of range";
-message(edotdot) -> "cross mount point";
-message(edquot) -> "disk quota exceeded";
-message(eduppkg) -> "duplicate package name";
-message(eexist) -> "file already exists";
-message(efault) -> "bad address in system call argument";
-message(efbig) -> "file too large";
-message(ehostdown) -> "host is down";
-message(ehostunreach) -> "host is unreachable";
-message(eidrm) -> "identifier removed";
-message(einit) -> "initialization error";
-message(einprogress) -> "operation now in progress";
-message(eintr) -> "interrupted system call";
-message(einval) -> "invalid argument";
-message(eio) -> "I/O error";
-message(eisconn) -> "socket is already connected";
-message(eisdir) -> "illegal operation on a directory";
-message(eisnam) -> "is a name file";
-message(elbin) -> "ELBIN";
-message(el2hlt) -> "level 2 halted";
-message(el2nsync) -> "level 2 not synchronized";
-message(el3hlt) -> "level 3 halted";
-message(el3rst) -> "level 3 reset";
-message(elibacc) -> "can not access a needed shared library";
-message(elibbad) -> "accessing a corrupted shared library";
-message(elibexec) -> "can not exec a shared library directly";
-message(elibmax) ->
- "attempting to link in more shared libraries than system limit";
-message(elibscn) -> ".lib section in a.out corrupted";
-message(elnrng) -> "link number out of range";
-message(eloop) -> "too many levels of symbolic links";
-message(emfile) -> "too many open files";
-message(emlink) -> "too many links";
-message(emsgsize) -> "message too long";
-message(emultihop) -> "multihop attempted";
-message(enametoolong) -> "file name too long";
-message(enavail) -> "not available";
-message(enet) -> "ENET";
-message(enetdown) -> "network is down";
-message(enetreset) -> "network dropped connection on reset";
-message(enetunreach) -> "network is unreachable";
-message(enfile) -> "file table overflow";
-message(enoano) -> "anode table overflow";
-message(enobufs) -> "no buffer space available";
-message(enocsi) -> "no CSI structure available";
-message(enodata) -> "no data available";
-message(enodev) -> "no such device";
-message(enoent) -> "no such file or directory";
-message(enoexec) -> "exec format error";
-message(enolck) -> "no locks available";
-message(enolink) -> "link has be severed";
-message(enomem) -> "not enough memory";
-message(enomsg) -> "no message of desired type";
-message(enonet) -> "machine is not on the network";
-message(enopkg) -> "package not installed";
-message(enoprotoopt) -> "bad proocol option";
-message(enospc) -> "no space left on device";
-message(enosr) -> "out of stream resources or not a stream device";
-message(enosym) -> "unresolved symbol name";
-message(enosys) -> "function not implemented";
-message(enotblk) -> "block device required";
-message(enotconn) -> "socket is not connected";
-message(enotdir) -> "not a directory";
-message(enotempty) -> "directory not empty";
-message(enotnam) -> "not a name file";
-message(enotsock) -> "socket operation on non-socket";
-message(enotsup) -> "operation not supported";
-message(enotty) -> "inappropriate device for ioctl";
-message(enotuniq) -> "name not unique on network";
-message(enxio) -> "no such device or address";
-message(eopnotsupp) -> "operation not supported on socket";
-message(eperm) -> "not owner";
-message(epfnosupport) -> "protocol family not supported";
-message(epipe) -> "broken pipe";
-message(eproclim) -> "too many processes";
-message(eprocunavail) -> "bad procedure for program";
-message(eprogmismatch) -> "program version wrong";
-message(eprogunavail) -> "RPC program not available";
-message(eproto) -> "protocol error";
-message(eprotonosupport) -> "protocol not suppored";
-message(eprototype) -> "protocol wrong type for socket";
-message(erange) -> "math result unrepresentable";
-message(erefused) -> "EREFUSED";
-message(eremchg) -> "remote address changed";
-message(eremdev) -> "remote device";
-message(eremote) -> "pathname hit remote file system";
-message(eremoteio) -> "remote i/o error";
-message(eremoterelease) -> "EREMOTERELEASE";
-message(erofs) -> "read-only file system";
-message(erpcmismatch) -> "RPC version is wrong";
-message(erremote) -> "object is remote";
-message(eshutdown) -> "can't send after socket shutdown";
-message(esocktnosupport) -> "socket type not supported";
-message(espipe) -> "invalid seek";
-message(esrch) -> "no such process";
-message(esrmnt) -> "srmount error";
-message(estale) -> "stale remote file handle";
-message(esuccess) -> "Error 0";
-message(etime) -> "timer expired";
-message(etimedout) -> "connection timed out";
-message(etoomanyrefs) -> "too many references: can't splice";
-message(etxtbsy) -> "text file or pseudo-device busy";
-message(euclean) -> "structure needs cleaning";
-message(eunatch) -> "protocol driver not attached";
-message(eusers) -> "too many users";
-message(eversion) -> "version mismatch";
-message(ewouldblock) -> "operation would block";
-message(exdev) -> "cross-domain link";
-message(exfull) -> "message tables full";
-message(nxdomain) -> "non-existing domain";
-message(_) -> "unknown POSIX error".
+message(T) ->
+ binary_to_list(message_1(T)).
+
+message_1(e2big) -> <<"argument list too long">>;
+message_1(eacces) -> <<"permission denied">>;
+message_1(eaddrinuse) -> <<"address already in use">>;
+message_1(eaddrnotavail) -> <<"can't assign requested address">>;
+message_1(eadv) -> <<"advertise error">>;
+message_1(eafnosupport) -> <<"address family not supported by protocol family">>;
+message_1(eagain) -> <<"resource temporarily unavailable">>;
+message_1(ealign) -> <<"EALIGN">>;
+message_1(ealready) -> <<"operation already in progress">>;
+message_1(ebade) -> <<"bad exchange descriptor">>;
+message_1(ebadf) -> <<"bad file number">>;
+message_1(ebadfd) -> <<"file descriptor in bad state">>;
+message_1(ebadmsg) -> <<"not a data message">>;
+message_1(ebadr) -> <<"bad request descriptor">>;
+message_1(ebadrpc) -> <<"RPC structure is bad">>;
+message_1(ebadrqc) -> <<"bad request code">>;
+message_1(ebadslt) -> <<"invalid slot">>;
+message_1(ebfont) -> <<"bad font file format">>;
+message_1(ebusy) -> <<"file busy">>;
+message_1(echild) -> <<"no children">>;
+message_1(echrng) -> <<"channel number out of range">>;
+message_1(ecomm) -> <<"communication error on send">>;
+message_1(econnaborted) -> <<"software caused connection abort">>;
+message_1(econnrefused) -> <<"connection refused">>;
+message_1(econnreset) -> <<"connection reset by peer">>;
+message_1(edeadlk) -> <<"resource deadlock avoided">>;
+message_1(edeadlock) -> <<"resource deadlock avoided">>;
+message_1(edestaddrreq) -> <<"destination address required">>;
+message_1(edirty) -> <<"mounting a dirty fs w/o force">>;
+message_1(edom) -> <<"math argument out of range">>;
+message_1(edotdot) -> <<"cross mount point">>;
+message_1(edquot) -> <<"disk quota exceeded">>;
+message_1(eduppkg) -> <<"duplicate package name">>;
+message_1(eexist) -> <<"file already exists">>;
+message_1(efault) -> <<"bad address in system call argument">>;
+message_1(efbig) -> <<"file too large">>;
+message_1(ehostdown) -> <<"host is down">>;
+message_1(ehostunreach) -> <<"host is unreachable">>;
+message_1(eidrm) -> <<"identifier removed">>;
+message_1(einit) -> <<"initialization error">>;
+message_1(einprogress) -> <<"operation now in progress">>;
+message_1(eintr) -> <<"interrupted system call">>;
+message_1(einval) -> <<"invalid argument">>;
+message_1(eio) -> <<"I/O error">>;
+message_1(eisconn) -> <<"socket is already connected">>;
+message_1(eisdir) -> <<"illegal operation on a directory">>;
+message_1(eisnam) -> <<"is a name file">>;
+message_1(elbin) -> <<"ELBIN">>;
+message_1(el2hlt) -> <<"level 2 halted">>;
+message_1(el2nsync) -> <<"level 2 not synchronized">>;
+message_1(el3hlt) -> <<"level 3 halted">>;
+message_1(el3rst) -> <<"level 3 reset">>;
+message_1(elibacc) -> <<"can not access a needed shared library">>;
+message_1(elibbad) -> <<"accessing a corrupted shared library">>;
+message_1(elibexec) -> <<"can not exec a shared library directly">>;
+message_1(elibmax) ->
+ <<"attempting to link in more shared libraries than system limit">>;
+message_1(elibscn) -> <<".lib section in a.out corrupted">>;
+message_1(elnrng) -> <<"link number out of range">>;
+message_1(eloop) -> <<"too many levels of symbolic links">>;
+message_1(emfile) -> <<"too many open files">>;
+message_1(emlink) -> <<"too many links">>;
+message_1(emsgsize) -> <<"message too long">>;
+message_1(emultihop) -> <<"multihop attempted">>;
+message_1(enametoolong) -> <<"file name too long">>;
+message_1(enavail) -> <<"not available">>;
+message_1(enet) -> <<"ENET">>;
+message_1(enetdown) -> <<"network is down">>;
+message_1(enetreset) -> <<"network dropped connection on reset">>;
+message_1(enetunreach) -> <<"network is unreachable">>;
+message_1(enfile) -> <<"file table overflow">>;
+message_1(enoano) -> <<"anode table overflow">>;
+message_1(enobufs) -> <<"no buffer space available">>;
+message_1(enocsi) -> <<"no CSI structure available">>;
+message_1(enodata) -> <<"no data available">>;
+message_1(enodev) -> <<"no such device">>;
+message_1(enoent) -> <<"no such file or directory">>;
+message_1(enoexec) -> <<"exec format error">>;
+message_1(enolck) -> <<"no locks available">>;
+message_1(enolink) -> <<"link has be severed">>;
+message_1(enomem) -> <<"not enough memory">>;
+message_1(enomsg) -> <<"no message of desired type">>;
+message_1(enonet) -> <<"machine is not on the network">>;
+message_1(enopkg) -> <<"package not installed">>;
+message_1(enoprotoopt) -> <<"bad proocol option">>;
+message_1(enospc) -> <<"no space left on device">>;
+message_1(enosr) -> <<"out of stream resources or not a stream device">>;
+message_1(enosym) -> <<"unresolved symbol name">>;
+message_1(enosys) -> <<"function not implemented">>;
+message_1(enotblk) -> <<"block device required">>;
+message_1(enotconn) -> <<"socket is not connected">>;
+message_1(enotdir) -> <<"not a directory">>;
+message_1(enotempty) -> <<"directory not empty">>;
+message_1(enotnam) -> <<"not a name file">>;
+message_1(enotsock) -> <<"socket operation on non-socket">>;
+message_1(enotsup) -> <<"operation not supported">>;
+message_1(enotty) -> <<"inappropriate device for ioctl">>;
+message_1(enotuniq) -> <<"name not unique on network">>;
+message_1(enxio) -> <<"no such device or address">>;
+message_1(eopnotsupp) -> <<"operation not supported on socket">>;
+message_1(eperm) -> <<"not owner">>;
+message_1(epfnosupport) -> <<"protocol family not supported">>;
+message_1(epipe) -> <<"broken pipe">>;
+message_1(eproclim) -> <<"too many processes">>;
+message_1(eprocunavail) -> <<"bad procedure for program">>;
+message_1(eprogmismatch) -> <<"program version wrong">>;
+message_1(eprogunavail) -> <<"RPC program not available">>;
+message_1(eproto) -> <<"protocol error">>;
+message_1(eprotonosupport) -> <<"protocol not suppored">>;
+message_1(eprototype) -> <<"protocol wrong type for socket">>;
+message_1(erange) -> <<"math result unrepresentable">>;
+message_1(erefused) -> <<"EREFUSED">>;
+message_1(eremchg) -> <<"remote address changed">>;
+message_1(eremdev) -> <<"remote device">>;
+message_1(eremote) -> <<"pathname hit remote file system">>;
+message_1(eremoteio) -> <<"remote i/o error">>;
+message_1(eremoterelease) -> <<"EREMOTERELEASE">>;
+message_1(erofs) -> <<"read-only file system">>;
+message_1(erpcmismatch) -> <<"RPC version is wrong">>;
+message_1(erremote) -> <<"object is remote">>;
+message_1(eshutdown) -> <<"can't send after socket shutdown">>;
+message_1(esocktnosupport) -> <<"socket type not supported">>;
+message_1(espipe) -> <<"invalid seek">>;
+message_1(esrch) -> <<"no such process">>;
+message_1(esrmnt) -> <<"srmount error">>;
+message_1(estale) -> <<"stale remote file handle">>;
+message_1(esuccess) -> <<"Error 0">>;
+message_1(etime) -> <<"timer expired">>;
+message_1(etimedout) -> <<"connection timed out">>;
+message_1(etoomanyrefs) -> <<"too many references: can't splice">>;
+message_1(etxtbsy) -> <<"text file or pseudo-device busy">>;
+message_1(euclean) -> <<"structure needs cleaning">>;
+message_1(eunatch) -> <<"protocol driver not attached">>;
+message_1(eusers) -> <<"too many users">>;
+message_1(eversion) -> <<"version mismatch">>;
+message_1(ewouldblock) -> <<"operation would block">>;
+message_1(exdev) -> <<"cross-domain link">>;
+message_1(exfull) -> <<"message tables full">>;
+message_1(nxdomain) -> <<"non-existing domain">>;
+message_1(_) -> <<"unknown POSIX error">>.
diff --git a/lib/stdlib/src/erl_pp.erl b/lib/stdlib/src/erl_pp.erl
index df4a20b833..66c80a45cb 100644
--- a/lib/stdlib/src/erl_pp.erl
+++ b/lib/stdlib/src/erl_pp.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -558,17 +558,11 @@ record_field({typed_record_field,{record_field,_,F,Val},Type}, Hook) ->
Fl = lexpr(F, L, Hook),
Vl = typed(lexpr(Val, R, Hook), Type),
{list,[{cstep,[Fl,' ='],Vl}]};
-record_field({typed_record_field,Field,Type0}, Hook) ->
- Type = remove_undefined(Type0),
+record_field({typed_record_field,Field,Type}, Hook) ->
typed(record_field(Field, Hook), Type);
record_field({record_field,_,F}, Hook) ->
lexpr(F, 0, Hook).
-remove_undefined({type,L,union,[{atom,_,undefined}|T]}) ->
- {type,L,union,T};
-remove_undefined(T) -> % cannot happen
- T.
-
list({cons,_,H,T}, Es, Hook) ->
list(T, [H|Es], Hook);
list({nil,_}, Es, Hook) ->
diff --git a/lib/stdlib/src/escript.erl b/lib/stdlib/src/escript.erl
index 99e454f593..d67617260e 100644
--- a/lib/stdlib/src/escript.erl
+++ b/lib/stdlib/src/escript.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -31,7 +31,7 @@
%%-----------------------------------------------------------------------
--type mode() :: 'compile' | 'debug' | 'interpret' | 'run'.
+-type mode() :: 'native' | 'compile' | 'debug' | 'interpret' | 'run'.
-type source() :: 'archive' | 'beam' | 'text'.
-record(state, {file :: file:filename(),
@@ -304,7 +304,11 @@ parse_and_run(File, Args, Options) ->
false ->
case lists:member("i", Options) of
true -> interpret;
- false -> Mode
+ false ->
+ case lists:member("n", Options) of
+ true -> native;
+ false -> Mode
+ end
end
end
end,
@@ -321,6 +325,14 @@ parse_and_run(File, Args, Options) ->
_Other ->
fatal("There were compilation errors.")
end;
+ native ->
+ case compile:forms(FormsOrBin, [report,native]) of
+ {ok, Module, BeamBin} ->
+ {module, Module} = code:load_binary(Module, File, BeamBin),
+ run(Module, Args);
+ _Other ->
+ fatal("There were compilation errors.")
+ end;
debug ->
case compile:forms(FormsOrBin, [report, debug_info]) of
{ok,Module,BeamBin} ->
@@ -570,9 +582,7 @@ parse_beam(S, File, HeaderSz, CheckOnly) ->
forms_or_bin = Bin}
end;
{error, beam_lib, Reason} when is_tuple(Reason) ->
- fatal(element(1, Reason));
- {error, beam_lib, Reason} ->
- fatal(Reason)
+ fatal(element(1, Reason))
end.
parse_source(S, File, Fd, StartLine, HeaderSz, CheckOnly) ->
@@ -666,7 +676,7 @@ epp_parse_file2(Epp, S, Forms, Parsed) ->
{attribute,Ln,mode,NewMode} ->
S2 = S#state{mode = NewMode},
if
- NewMode =:= compile; NewMode =:= interpret; NewMode =:= debug ->
+ NewMode =:= compile; NewMode =:= interpret; NewMode =:= debug; NewMode =:= native ->
epp_parse_file(Epp, S2, [Form | Forms]);
true ->
Args = lists:flatten(io_lib:format("illegal mode attribute: ~p", [NewMode])),
diff --git a/lib/stdlib/src/filename.erl b/lib/stdlib/src/filename.erl
index e38b8957f2..24abf1e977 100644
--- a/lib/stdlib/src/filename.erl
+++ b/lib/stdlib/src/filename.erl
@@ -165,8 +165,6 @@ basename1([$/|[]], Tail, DirSep2) ->
basename1([], Tail, DirSep2);
basename1([$/|Rest], _Tail, DirSep2) ->
basename1(Rest, [], DirSep2);
-basename1([[_|_]=List|Rest], Tail, DirSep2) ->
- basename1(List++Rest, Tail, DirSep2);
basename1([DirSep2|Rest], Tail, DirSep2) when is_integer(DirSep2) ->
basename1([$/|Rest], Tail, DirSep2);
basename1([Char|Rest], Tail, DirSep2) when is_integer(Char) ->
@@ -280,8 +278,6 @@ dirname(Name0) ->
Name = flatten(Name0),
dirname(Name, [], [], separators()).
-dirname([[_|_]=List|Rest], Dir, File, Seps) ->
- dirname(List++Rest, Dir, File, Seps);
dirname([$/|Rest], Dir, File, Seps) ->
dirname(Rest, File++Dir, [$/], Seps);
dirname([DirSep|Rest], Dir, File, {DirSep,_}=Seps) when is_integer(DirSep) ->
@@ -346,8 +342,6 @@ extension(Name) when is_binary(Name) ->
[]
end,
case binary:matches(Name,[<<".">>]) of
- nomatch -> % Bug in binary workaround :(
- <<>>;
[] ->
<<>>;
List ->
@@ -479,6 +473,12 @@ maybe_remove_dirsep(Name, _) ->
%% by a previous call to join/{1,2}.
-spec append(file:filename(), file:name()) -> file:filename().
+append(Dir, Name) when is_binary(Dir), is_binary(Name) ->
+ <<Dir/binary,$/:8,Name/binary>>;
+append(Dir, Name) when is_binary(Dir) ->
+ append(Dir,filename_string_to_binary(Name));
+append(Dir, Name) when is_binary(Name) ->
+ append(filename_string_to_binary(Dir),Name);
append(Dir, Name) ->
Dir ++ [$/|Name].
@@ -685,8 +685,6 @@ split([$/|Rest], Comp, Components, OsType) ->
split(Rest, [], [lists:reverse(Comp)|Components], OsType);
split([Char|Rest], Comp, Components, OsType) when is_integer(Char) ->
split(Rest, [Char|Comp], Components, OsType);
-split([List|Rest], Comp, Components, OsType) when is_list(List) ->
- split(List++Rest, Comp, Components, OsType);
split([], [], Components, _OsType) ->
lists:reverse(Components);
split([], Comp, Components, OsType) ->
diff --git a/lib/stdlib/src/gb_sets.erl b/lib/stdlib/src/gb_sets.erl
index 113f29e252..fc5beb28b0 100644
--- a/lib/stdlib/src/gb_sets.erl
+++ b/lib/stdlib/src/gb_sets.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
diff --git a/lib/stdlib/src/gen.erl b/lib/stdlib/src/gen.erl
index 43df6f621d..574146b1cd 100644
--- a/lib/stdlib/src/gen.erl
+++ b/lib/stdlib/src/gen.erl
@@ -29,6 +29,8 @@
-export([init_it/6, init_it/7]).
+-export([format_status_header/2]).
+
-define(default_timeout, 5000).
%%-----------------------------------------------------------------
@@ -315,3 +317,10 @@ debug_options(Opts) ->
{ok, Options} -> sys:debug_options(Options);
_ -> []
end.
+
+format_status_header(TagLine, Pid) when is_pid(Pid) ->
+ lists:concat([TagLine, " ", pid_to_list(Pid)]);
+format_status_header(TagLine, RegName) when is_atom(RegName) ->
+ lists:concat([TagLine, " ", RegName]);
+format_status_header(TagLine, Name) ->
+ {TagLine, Name}.
diff --git a/lib/stdlib/src/gen_event.erl b/lib/stdlib/src/gen_event.erl
index b1e9e3a02f..b00910771f 100644
--- a/lib/stdlib/src/gen_event.erl
+++ b/lib/stdlib/src/gen_event.erl
@@ -724,7 +724,8 @@ get_modules(MSL) ->
%%-----------------------------------------------------------------
format_status(Opt, StatusData) ->
[PDict, SysState, Parent, _Debug, [ServerName, MSL, _Hib]] = StatusData,
- Header = lists:concat(["Status for event handler ", ServerName]),
+ Header = gen:format_status_header("Status for event handler",
+ ServerName),
FmtMSL = [case erlang:function_exported(Mod, format_status, 2) of
true ->
Args = [PDict, State],
diff --git a/lib/stdlib/src/gen_fsm.erl b/lib/stdlib/src/gen_fsm.erl
index 7d9960b912..f2f1365d3d 100644
--- a/lib/stdlib/src/gen_fsm.erl
+++ b/lib/stdlib/src/gen_fsm.erl
@@ -614,15 +614,8 @@ get_msg(Msg) -> Msg.
format_status(Opt, StatusData) ->
[PDict, SysState, Parent, Debug, [Name, StateName, StateData, Mod, _Time]] =
StatusData,
- StatusHdr = "Status for state machine",
- Header = if
- is_pid(Name) ->
- lists:concat([StatusHdr, " ", pid_to_list(Name)]);
- is_atom(Name); is_list(Name) ->
- lists:concat([StatusHdr, " ", Name]);
- true ->
- {StatusHdr, Name}
- end,
+ Header = gen:format_status_header("Status for state machine",
+ Name),
Log = sys:get_debug(log, Debug, []),
DefaultStatus = [{data, [{"StateData", StateData}]}],
Specfic =
diff --git a/lib/stdlib/src/gen_server.erl b/lib/stdlib/src/gen_server.erl
index ac81df9cab..09d94a9c40 100644
--- a/lib/stdlib/src/gen_server.erl
+++ b/lib/stdlib/src/gen_server.erl
@@ -840,15 +840,8 @@ name_to_pid(Name) ->
%%-----------------------------------------------------------------
format_status(Opt, StatusData) ->
[PDict, SysState, Parent, Debug, [Name, State, Mod, _Time]] = StatusData,
- StatusHdr = "Status for generic server",
- Header = if
- is_pid(Name) ->
- lists:concat([StatusHdr, " ", pid_to_list(Name)]);
- is_atom(Name); is_list(Name) ->
- lists:concat([StatusHdr, " ", Name]);
- true ->
- {StatusHdr, Name}
- end,
+ Header = gen:format_status_header("Status for generic server",
+ Name),
Log = sys:get_debug(log, Debug, []),
DefaultStatus = [{data, [{"State", State}]}],
Specfic =
diff --git a/lib/stdlib/src/io.erl b/lib/stdlib/src/io.erl
index 1d0f9374bc..6aeb076a0b 100644
--- a/lib/stdlib/src/io.erl
+++ b/lib/stdlib/src/io.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -39,6 +39,8 @@
-type device() :: atom() | pid().
-type prompt() :: atom() | string().
+-type error_description() :: term(). % Whatever the io-server sends.
+-type request_error() :: {'error',error_description()}.
%% XXX: Some uses of line() in this file may need to read erl_scan:location()
-type line() :: pos_integer().
@@ -53,26 +55,12 @@
to_tuple(T) when is_tuple(T) -> T;
to_tuple(T) -> {T}.
-%% Problem: the variables Other, Name and Args may collide with surrounding
-%% ones.
-%% Give extra args to macro, being the variables to use.
--define(O_REQUEST(Io, Request),
- case request(Io, Request) of
- {error, Reason} ->
- [Name | Args] = tuple_to_list(to_tuple(Request)),
- erlang:error(conv_reason(Name, Reason), [Name, Io | Args]);
- Other ->
- Other
- end).
-
o_request(Io, Request, Func) ->
case request(Io, Request) of
{error, Reason} ->
[_Name | Args] = tuple_to_list(to_tuple(Request)),
- {'EXIT',{undef,[_Current|Mfas]}} = (catch erlang:error(undef)),
- MFA = {io, Func, [Io | Args]},
- exit({conv_reason(Func, Reason),[MFA|Mfas]});
-% erlang:error(conv_reason(Name, Reason), [Name, Io | Args]);
+ {'EXIT',{get_stacktrace,[_Current|Mfas]}} = (catch erlang:error(get_stacktrace)),
+ erlang:raise(error, conv_reason(Func, Reason), [{io, Func, [Io | Args]}|Mfas]);
Other ->
Other
end.
@@ -299,32 +287,32 @@ format(Io, Format, Args) ->
%% Scanning Erlang code.
--spec scan_erl_exprs(prompt()) -> erl_scan:tokens_result().
+-spec scan_erl_exprs(prompt()) -> erl_scan:tokens_result() | request_error().
scan_erl_exprs(Prompt) ->
scan_erl_exprs(default_input(), Prompt, 1).
--spec scan_erl_exprs(device(), prompt()) -> erl_scan:tokens_result().
+-spec scan_erl_exprs(device(), prompt()) -> erl_scan:tokens_result() | request_error().
scan_erl_exprs(Io, Prompt) ->
scan_erl_exprs(Io, Prompt, 1).
--spec scan_erl_exprs(device(), prompt(), line()) -> erl_scan:tokens_result().
+-spec scan_erl_exprs(device(), prompt(), line()) -> erl_scan:tokens_result() | request_error().
scan_erl_exprs(Io, Prompt, Pos0) ->
request(Io, {get_until,unicode,Prompt,erl_scan,tokens,[Pos0]}).
--spec scan_erl_form(prompt()) -> erl_scan:tokens_result().
+-spec scan_erl_form(prompt()) -> erl_scan:tokens_result() | request_error().
scan_erl_form(Prompt) ->
scan_erl_form(default_input(), Prompt, 1).
--spec scan_erl_form(device(), prompt()) -> erl_scan:tokens_result().
+-spec scan_erl_form(device(), prompt()) -> erl_scan:tokens_result() | request_error().
scan_erl_form(Io, Prompt) ->
scan_erl_form(Io, Prompt, 1).
--spec scan_erl_form(device(), prompt(), line()) -> erl_scan:tokens_result().
+-spec scan_erl_form(device(), prompt(), line()) -> erl_scan:tokens_result() | request_error().
scan_erl_form(Io, Prompt, Pos0) ->
request(Io, {get_until,unicode,Prompt,erl_scan,tokens,[Pos0]}).
@@ -335,7 +323,8 @@ scan_erl_form(Io, Prompt, Pos0) ->
-type parse_ret() :: {'ok', erl_parse_expr_list(), line()}
| {'eof', line()}
- | {'error', erl_scan:error_info(), line()}.
+ | {'error', erl_scan:error_info(), line()}
+ | request_error().
-spec parse_erl_exprs(prompt()) -> parse_ret().
@@ -364,7 +353,8 @@ parse_erl_exprs(Io, Prompt, Pos0) ->
-type parse_form_ret() :: {'ok', erl_parse_absform(), line()}
| {'eof', line()}
- | {'error', erl_scan:error_info(), line()}.
+ | {'error', erl_scan:error_info(), line()}
+ | request_error().
-spec parse_erl_form(prompt()) -> parse_form_ret().
diff --git a/lib/stdlib/src/io_lib_format.erl b/lib/stdlib/src/io_lib_format.erl
index eb1885021d..49a00a4ec7 100644
--- a/lib/stdlib/src/io_lib_format.erl
+++ b/lib/stdlib/src/io_lib_format.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -558,28 +558,30 @@ iolist_to_chars(B) when is_binary(B) ->
string(S, none, _Adj, none, _Pad) -> S;
string(S, F, Adj, none, Pad) ->
- N = lists:flatlength(S),
- if N > F -> flat_trunc(S, F);
- N =:= F -> S;
- true -> adjust(S, chars(Pad, F-N), Adj)
- end;
+ string_field(S, F, Adj, lists:flatlength(S), Pad);
string(S, none, _Adj, P, Pad) ->
+ string_field(S, P, left, lists:flatlength(S), Pad);
+string(S, F, Adj, P, Pad) when F >= P ->
N = lists:flatlength(S),
- if N > P -> flat_trunc(S, P);
- N =:= P -> S;
- true -> [S|chars(Pad, P-N)]
- end;
-string(S, F, Adj, F, Pad) ->
- string(S, none, Adj, F, Pad);
-string(S, F, Adj, P, Pad) when F > P ->
- N = lists:flatlength(S),
- if N > F -> flat_trunc(S, F);
- N =:= F -> S;
- N > P -> adjust(flat_trunc(S, P), chars(Pad, F-P), Adj);
- N =:= P -> adjust(S, chars(Pad, F-P), Adj);
- true -> adjust([S|chars(Pad, P-N)], chars(Pad, F-P), Adj)
+ if F > P ->
+ if N > P ->
+ adjust(flat_trunc(S, P), chars(Pad, F-P), Adj);
+ N < P ->
+ adjust([S|chars(Pad, P-N)], chars(Pad, F-P), Adj);
+ true -> % N == P
+ adjust(S, chars(Pad, F-P), Adj)
+ end;
+ true -> % F == P
+ string_field(S, F, Adj, N, Pad)
end.
+string_field(S, F, _Adj, N, _Pad) when N > F ->
+ flat_trunc(S, F);
+string_field(S, F, Adj, N, Pad) when N < F ->
+ adjust(S, chars(Pad, F-N), Adj);
+string_field(S, _, _, _, _) -> % N == F
+ S.
+
%% unprefixed_integer(Int, Field, Adjust, Base, PadChar, Lowercase)
%% -> [Char].
@@ -624,8 +626,8 @@ newline(F, right, _P, _Pad) -> chars($\n, F).
%%
adjust(Data, [], _) -> Data;
-adjust(Data, Pad, left) -> [Data,Pad];
-adjust(Data, Pad, right) -> [Pad,Data].
+adjust(Data, Pad, left) -> [Data|Pad];
+adjust(Data, Pad, right) -> [Pad|Data].
%% Flatten and truncate a deep list to at most N elements.
diff --git a/lib/stdlib/src/log_mf_h.erl b/lib/stdlib/src/log_mf_h.erl
index 2729f27e51..5fa5360fa1 100644
--- a/lib/stdlib/src/log_mf_h.erl
+++ b/lib/stdlib/src/log_mf_h.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -185,13 +185,19 @@ read_index_file(Dir) ->
%%-----------------------------------------------------------------
%% Write the index file. This file contains one binary with
%% the last used filename (an integer).
+%% Write a temporary file and rename it in order to make the update
+%% atomic.
%%-----------------------------------------------------------------
write_index_file(Dir, Index) ->
- case file:open(Dir ++ "/index", [raw, write]) of
+ File = Dir ++ "/index",
+ TmpFile = File ++ ".tmp",
+ case file:open(TmpFile, [raw, write]) of
{ok, Fd} ->
- file:write(Fd, [Index]),
- ok = file:close(Fd);
+ ok = file:write(Fd, [Index]),
+ ok = file:close(Fd),
+ ok = file:rename(TmpFile,File),
+ ok;
_ -> exit(open_index_file)
end.
diff --git a/lib/stdlib/src/ms_transform.erl b/lib/stdlib/src/ms_transform.erl
index a249dea525..b565eb20f4 100644
--- a/lib/stdlib/src/ms_transform.erl
+++ b/lib/stdlib/src/ms_transform.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
diff --git a/lib/stdlib/src/orddict.erl b/lib/stdlib/src/orddict.erl
index 8a13992785..4e30c9eefd 100644
--- a/lib/stdlib/src/orddict.erl
+++ b/lib/stdlib/src/orddict.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
diff --git a/lib/stdlib/src/ordsets.erl b/lib/stdlib/src/ordsets.erl
index 4c72e351d0..5a1c260703 100644
--- a/lib/stdlib/src/ordsets.erl
+++ b/lib/stdlib/src/ordsets.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
diff --git a/lib/stdlib/src/pool.erl b/lib/stdlib/src/pool.erl
index 7f5f23e26d..a3c9927ee9 100644
--- a/lib/stdlib/src/pool.erl
+++ b/lib/stdlib/src/pool.erl
@@ -95,6 +95,9 @@ pspawn_link(M, F, A) ->
start_nodes([], _, _) -> [];
start_nodes([Host|Tail], Name, Args) ->
case slave:start(Host, Name, Args) of
+ {error, {already_running, Node}} ->
+ io:format("Can't start node on host ~w due to ~w~n",[Host, {already_running, Node}]),
+ [Node | start_nodes(Tail, Name, Args)];
{error, R} ->
io:format("Can't start node on host ~w due to ~w~n",[Host, R]),
start_nodes(Tail, Name, Args);
diff --git a/lib/stdlib/src/re.erl b/lib/stdlib/src/re.erl
index 296a6b3d23..e2cc9f57ce 100644
--- a/lib/stdlib/src/re.erl
+++ b/lib/stdlib/src/re.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -37,16 +37,16 @@ split(Subject,RE,Options) ->
{error,_Err} ->
throw(badre);
{PreCompiled, NumSub, RunOpt} ->
- % OK, lets run
+ %% OK, lets run
case re:run(FlatSubject,PreCompiled,RunOpt ++ [global]) of
nomatch ->
case Group of
true ->
convert_any_split_result([[FlatSubject]],
- Convert, Unicode,true);
+ Convert, Unicode, true);
false ->
convert_any_split_result([FlatSubject],
- Convert, Unicode,false)
+ Convert, Unicode, false)
end;
{match, Matches} ->
Res = do_split(FlatSubject, 0, Matches, NumSub,
@@ -69,7 +69,7 @@ split(Subject,RE,Options) ->
erlang:error(badarg,[Subject,RE,Options])
end.
-backstrip_empty(List,false) ->
+backstrip_empty(List, false) ->
do_backstrip_empty(List);
backstrip_empty(List, true) ->
do_backstrip_empty_g(List).
@@ -196,41 +196,36 @@ compile_split(Pat,Options0) when not is_tuple(Pat) ->
end;
compile_split(_,_) ->
throw(badre).
-
-
replace(Subject,RE,Replacement) ->
replace(Subject,RE,Replacement,[]).
+
replace(Subject,RE,Replacement,Options) ->
try
{NewOpt,Convert,Unicode} =
process_repl_params(Options,iodata,false),
FlatSubject = to_binary(Subject, Unicode),
FlatReplacement = to_binary(Replacement, Unicode),
- case do_replace(FlatSubject,Subject,RE,FlatReplacement,NewOpt) of
- {error,_Err} ->
- throw(badre);
- IoList ->
- case Convert of
- iodata ->
- IoList;
- binary ->
- case Unicode of
- false ->
- iolist_to_binary(IoList);
- true ->
- unicode:characters_to_binary(IoList,unicode)
- end;
- list ->
- case Unicode of
- false ->
- binary_to_list(iolist_to_binary(IoList));
- true ->
- unicode:characters_to_list(IoList,unicode)
- end
- end
- end
+ IoList = do_replace(FlatSubject,Subject,RE,FlatReplacement,NewOpt),
+ case Convert of
+ iodata ->
+ IoList;
+ binary ->
+ case Unicode of
+ false ->
+ iolist_to_binary(IoList);
+ true ->
+ unicode:characters_to_binary(IoList,unicode)
+ end;
+ list ->
+ case Unicode of
+ false ->
+ binary_to_list(iolist_to_binary(IoList));
+ true ->
+ unicode:characters_to_list(IoList,unicode)
+ end
+ end
catch
throw:badopt ->
erlang:error(badarg,[Subject,RE,Replacement,Options]);
@@ -239,7 +234,7 @@ replace(Subject,RE,Replacement,Options) ->
error:badarg ->
erlang:error(badarg,[Subject,RE,Replacement,Options])
end.
-
+
do_replace(FlatSubject,Subject,RE,Replacement,Options) ->
case re:run(FlatSubject,RE,Options) of
@@ -314,7 +309,7 @@ apply_mlist(Subject,Replacement,Mlist) ->
precomp_repl(<<>>) ->
[];
precomp_repl(<<$\\,X,Rest/binary>>) when X < $1 ; X > $9 ->
- % Escaped character
+ %% Escaped character
case precomp_repl(Rest) of
[BHead | T0] when is_binary(BHead) ->
[<<X,BHead/binary>> | T0];
@@ -524,7 +519,7 @@ process_uparams([H|T],Type) ->
{[H|NL],NType};
process_uparams([],Type) ->
{[],Type}.
-
+
ucompile(RE,Options) ->
try
@@ -548,6 +543,7 @@ urun(Subject,RE,Options) ->
[Subject,RE,Options])),
erlang:raise(error,AnyError,[{Mod,run,L}|Rest])
end.
+
urun2(Subject0,RE0,Options0) ->
{Options,RetType} = case (catch process_uparams(Options0,index)) of
{A,B} ->
@@ -573,7 +569,6 @@ urun2(Subject0,RE0,Options0) ->
_ ->
Ret
end.
-
%% Might be called either with two-tuple (if regexp was already compiled)
diff --git a/lib/stdlib/src/string.erl b/lib/stdlib/src/string.erl
index c987c224db..264348180f 100644
--- a/lib/stdlib/src/string.erl
+++ b/lib/stdlib/src/string.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
diff --git a/lib/stdlib/src/supervisor.erl b/lib/stdlib/src/supervisor.erl
index 7102fb9f6e..09a01a9aea 100644
--- a/lib/stdlib/src/supervisor.erl
+++ b/lib/stdlib/src/supervisor.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -40,7 +40,7 @@
%%--------------------------------------------------------------------------
-type child_id() :: pid() | 'undefined'.
--type mfargs() :: {module(), atom(), [term()]}.
+-type mfargs() :: {module(), atom(), [term()] | undefined}.
-type modules() :: [module()] | 'dynamic'.
-type restart() :: 'permanent' | 'transient' | 'temporary'.
-type shutdown() :: 'brutal_kill' | timeout().
@@ -65,11 +65,13 @@
-type child() :: #child{}.
-define(DICT, dict).
+-define(SETS, sets).
+-define(SET, set).
-record(state, {name,
strategy :: strategy(),
children = [] :: [child()],
- dynamics = ?DICT:new() :: ?DICT(),
+ dynamics :: ?DICT() | ?SET(),
intensity :: non_neg_integer(),
period :: pos_integer(),
restarts = [],
@@ -138,7 +140,7 @@ delete_child(Supervisor, Name) ->
%%-----------------------------------------------------------------
-type term_err() :: 'not_found' | 'simple_one_for_one'.
--spec terminate_child(sup_ref(), term()) -> 'ok' | {'error', term_err()}.
+-spec terminate_child(sup_ref(), pid() | term()) -> 'ok' | {'error', term_err()}.
terminate_child(Supervisor, Name) ->
call(Supervisor, {terminate_child, Name}).
@@ -283,23 +285,40 @@ do_start_child_i(M, F, A) ->
-spec handle_call(call(), term(), state()) -> {'reply', term(), state()}.
handle_call({start_child, EArgs}, _From, State) when ?is_simple(State) ->
- #child{mfargs = {M, F, A}} = hd(State#state.children),
+ Child = hd(State#state.children),
+ #child{mfargs = {M, F, A}} = Child,
Args = A ++ EArgs,
case do_start_child_i(M, F, Args) of
{ok, Pid} ->
- NState = State#state{dynamics =
- ?DICT:store(Pid, Args, State#state.dynamics)},
+ NState = save_dynamic_child(Child#child.restart_type, Pid, Args, State),
{reply, {ok, Pid}, NState};
{ok, Pid, Extra} ->
- NState = State#state{dynamics =
- ?DICT:store(Pid, Args, State#state.dynamics)},
+ NState = save_dynamic_child(Child#child.restart_type, Pid, Args, State),
{reply, {ok, Pid, Extra}, NState};
What ->
{reply, What, State}
end;
-%%% The requests terminate_child, delete_child and restart_child are
-%%% invalid for simple_one_for_one supervisors.
+%% terminate_child for simple_one_for_one can only be done with pid
+handle_call({terminate_child, Name}, _From, State) when not is_pid(Name),
+ ?is_simple(State) ->
+ {reply, {error, simple_one_for_one}, State};
+
+handle_call({terminate_child, Name}, _From, State) ->
+ case get_child(Name, State, ?is_simple(State)) of
+ {value, Child} ->
+ case do_terminate(Child, State#state.name) of
+ #child{restart_type=RT} when RT=:=temporary; ?is_simple(State) ->
+ {reply, ok, state_del_child(Child, State)};
+ NChild ->
+ {reply, ok, replace_child(NChild, State)}
+ end;
+ false ->
+ {reply, {error, not_found}, State}
+ end;
+
+%%% The requests delete_child and restart_child are invalid for
+%%% simple_one_for_one supervisors.
handle_call({_Req, _Data}, _From, State) when ?is_simple(State) ->
{reply, {error, simple_one_for_one}, State};
@@ -342,19 +361,20 @@ handle_call({delete_child, Name}, _From, State) ->
{reply, {error, not_found}, State}
end;
-handle_call({terminate_child, Name}, _From, State) ->
- case get_child(Name, State) of
- {value, Child} ->
- NChild = do_terminate(Child, State#state.name),
- {reply, ok, replace_child(NChild, State)};
- _ ->
- {reply, {error, not_found}, State}
- end;
+handle_call(which_children, _From, #state{children = [#child{restart_type = temporary,
+ child_type = CT,
+ modules = Mods}]} =
+ State) when ?is_simple(State) ->
+ Reply = lists:map(fun(Pid) -> {undefined, Pid, CT, Mods} end,
+ ?SETS:to_list(dynamics_db(temporary, State#state.dynamics))),
+ {reply, Reply, State};
-handle_call(which_children, _From, State) when ?is_simple(State) ->
- [#child{child_type = CT, modules = Mods}] = State#state.children,
+handle_call(which_children, _From, #state{children = [#child{restart_type = RType,
+ child_type = CT,
+ modules = Mods}]} =
+ State) when ?is_simple(State) ->
Reply = lists:map(fun({Pid, _}) -> {undefined, Pid, CT, Mods} end,
- ?DICT:to_list(State#state.dynamics)),
+ ?DICT:to_list(dynamics_db(RType, State#state.dynamics))),
{reply, Reply, State};
handle_call(which_children, _From, State) ->
@@ -366,13 +386,31 @@ handle_call(which_children, _From, State) ->
State#state.children),
{reply, Resp, State};
-handle_call(count_children, _From, State) when ?is_simple(State) ->
- [#child{child_type = CT}] = State#state.children,
+
+handle_call(count_children, _From, #state{children = [#child{restart_type = temporary,
+ child_type = CT}]} = State)
+ when ?is_simple(State) ->
+ {Active, Count} =
+ ?SETS:fold(fun(Pid, {Alive, Tot}) ->
+ if is_pid(Pid) -> {Alive+1, Tot +1};
+ true -> {Alive, Tot + 1} end
+ end, {0, 0}, dynamics_db(temporary, State#state.dynamics)),
+ Reply = case CT of
+ supervisor -> [{specs, 1}, {active, Active},
+ {supervisors, Count}, {workers, 0}];
+ worker -> [{specs, 1}, {active, Active},
+ {supervisors, 0}, {workers, Count}]
+ end,
+ {reply, Reply, State};
+
+handle_call(count_children, _From, #state{children = [#child{restart_type = RType,
+ child_type = CT}]} = State)
+ when ?is_simple(State) ->
{Active, Count} =
?DICT:fold(fun(Pid, _Val, {Alive, Tot}) ->
if is_pid(Pid) -> {Alive+1, Tot +1};
true -> {Alive, Tot + 1} end
- end, {0, 0}, State#state.dynamics),
+ end, {0, 0}, dynamics_db(RType, State#state.dynamics)),
Reply = case CT of
supervisor -> [{specs, 1}, {active, Active},
{supervisors, Count}, {workers, 0}];
@@ -535,15 +573,11 @@ handle_start_child(Child, State) ->
false ->
case do_start_child(State#state.name, Child) of
{ok, Pid} ->
- Children = State#state.children,
{{ok, Pid},
- State#state{children =
- [Child#child{pid = Pid}|Children]}};
+ save_child(Child#child{pid = Pid}, State)};
{ok, Pid, Extra} ->
- Children = State#state.children,
{{ok, Pid, Extra},
- State#state{children =
- [Child#child{pid = Pid}|Children]}};
+ save_child(Child#child{pid = Pid}, State)};
{error, What} ->
{{error, {What, Child}}, State}
end;
@@ -558,22 +592,21 @@ handle_start_child(Child, State) ->
%%% Returns: {ok, state()} | {shutdown, state()}
%%% ---------------------------------------------------
-restart_child(Pid, Reason, State) when ?is_simple(State) ->
- case ?DICT:find(Pid, State#state.dynamics) of
+restart_child(Pid, Reason, #state{children = [Child]} = State) when ?is_simple(State) ->
+ RestartType = Child#child.restart_type,
+ case dynamic_child_args(Pid, dynamics_db(RestartType, State#state.dynamics)) of
{ok, Args} ->
- [Child] = State#state.children,
- RestartType = Child#child.restart_type,
{M, F, _} = Child#child.mfargs,
NChild = Child#child{pid = Pid, mfargs = {M, F, Args}},
do_restart(RestartType, Reason, NChild, State);
error ->
- {ok, State}
+ {ok, State}
end;
+
restart_child(Pid, Reason, State) ->
Children = State#state.children,
case lists:keyfind(Pid, #child.pid, Children) of
- #child{} = Child ->
- RestartType = Child#child.restart_type,
+ #child{restart_type = RestartType} = Child ->
do_restart(RestartType, Reason, Child, State);
false ->
{ok, State}
@@ -608,7 +641,8 @@ restart(Child, State) ->
restart(simple_one_for_one, Child, State) ->
#child{mfargs = {M, F, A}} = Child,
- Dynamics = ?DICT:erase(Child#child.pid, State#state.dynamics),
+ Dynamics = ?DICT:erase(Child#child.pid, dynamics_db(Child#child.restart_type,
+ State#state.dynamics)),
case do_start_child_i(M, F, A) of
{ok, Pid} ->
NState = State#state{dynamics = ?DICT:store(Pid, A, Dynamics)},
@@ -755,15 +789,54 @@ monitor_child(Pid) ->
%%-----------------------------------------------------------------
%% Child/State manipulating functions.
%%-----------------------------------------------------------------
-state_del_child(#child{pid = Pid}, State) when ?is_simple(State) ->
- NDynamics = ?DICT:erase(Pid, State#state.dynamics),
+
+%% Note we do not want to save the parameter list for temporary processes as
+%% they will not be restarted, and hence we do not need this information.
+%% Especially for dynamic children to simple_one_for_one supervisors
+%% it could become very costly as it is not uncommon to spawn
+%% very many such processes.
+save_child(#child{restart_type = temporary,
+ mfargs = {M, F, _}} = Child, #state{children = Children} = State) ->
+ State#state{children = [Child#child{mfargs = {M, F, undefined}} |Children]};
+save_child(Child, #state{children = Children} = State) ->
+ State#state{children = [Child |Children]}.
+
+save_dynamic_child(temporary, Pid, _, #state{dynamics = Dynamics} = State) ->
+ State#state{dynamics = ?SETS:add_element(Pid, dynamics_db(temporary, Dynamics))};
+save_dynamic_child(RestartType, Pid, Args, #state{dynamics = Dynamics} = State) ->
+ State#state{dynamics = ?DICT:store(Pid, Args, dynamics_db(RestartType, Dynamics))}.
+
+dynamics_db(temporary, undefined) ->
+ ?SETS:new();
+dynamics_db(_, undefined) ->
+ ?DICT:new();
+dynamics_db(_,Dynamics) ->
+ Dynamics.
+
+dynamic_child_args(Pid, Dynamics) ->
+ case ?SETS:is_set(Dynamics) of
+ true ->
+ {ok, undefined};
+ false ->
+ ?DICT:find(Pid, Dynamics)
+ end.
+
+state_del_child(#child{pid = Pid, restart_type = temporary}, State) when ?is_simple(State) ->
+ NDynamics = ?SETS:del_element(Pid, dynamics_db(temporary, State#state.dynamics)),
+ State#state{dynamics = NDynamics};
+state_del_child(#child{pid = Pid, restart_type = RType}, State) when ?is_simple(State) ->
+ NDynamics = ?DICT:erase(Pid, dynamics_db(RType, State#state.dynamics)),
State#state{dynamics = NDynamics};
state_del_child(Child, State) ->
NChildren = del_child(Child#child.name, State#state.children),
State#state{children = NChildren}.
+del_child(Name, [Ch|Chs]) when Ch#child.name =:= Name, Ch#child.restart_type =:= temporary ->
+ Chs;
del_child(Name, [Ch|Chs]) when Ch#child.name =:= Name ->
[Ch#child{pid = undefined} | Chs];
+del_child(Pid, [Ch|Chs]) when Ch#child.pid =:= Pid, Ch#child.restart_type =:= temporary ->
+ Chs;
del_child(Pid, [Ch|Chs]) when Ch#child.pid =:= Pid ->
[Ch#child{pid = undefined} | Chs];
del_child(Name, [Ch|Chs]) ->
@@ -786,7 +859,31 @@ split_child(_, [], After) ->
{lists:reverse(After), []}.
get_child(Name, State) ->
+ get_child(Name, State, false).
+get_child(Pid, State, AllowPid) when AllowPid, is_pid(Pid) ->
+ get_dynamic_child(Pid, State);
+get_child(Name, State, _) ->
lists:keysearch(Name, #child.name, State#state.children).
+
+get_dynamic_child(Pid, #state{children=[Child], dynamics=Dynamics}) ->
+ case is_dynamic_pid(Pid, dynamics_db(Child#child.restart_type, Dynamics)) of
+ true ->
+ {value, Child#child{pid=Pid}};
+ false ->
+ case erlang:is_process_alive(Pid) of
+ true -> false;
+ false -> {value, Child}
+ end
+ end.
+
+is_dynamic_pid(Pid, Dynamics) ->
+ case ?SETS:is_set(Dynamics) of
+ true ->
+ ?SETS:is_element(Pid, Dynamics);
+ false ->
+ ?DICT:is_key(Pid, Dynamics)
+ end.
+
replace_child(Child, State) ->
Chs = do_replace_child(Child, State#state.children),
State#state{children = Chs}.
diff --git a/lib/stdlib/src/timer.erl b/lib/stdlib/src/timer.erl
index b456c5d6c1..78e897b877 100644
--- a/lib/stdlib/src/timer.erl
+++ b/lib/stdlib/src/timer.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -22,7 +22,7 @@
send_after/3, send_after/2,
exit_after/3, exit_after/2, kill_after/2, kill_after/1,
apply_interval/4, send_interval/3, send_interval/2,
- cancel/1, sleep/1, tc/2, tc/3, now_diff/2,
+ cancel/1, sleep/1, tc/1, tc/2, tc/3, now_diff/2,
seconds/1, minutes/1, hours/1, hms/3]).
-export([start_link/0, start/0,
@@ -101,15 +101,24 @@ sleep(T) ->
after T -> ok
end.
+%%
+%% Measure the execution time (in microseconds) for Fun().
+%%
+-spec tc(function()) -> {time(), term()}.
+tc(F) ->
+ Before = os:timestamp(),
+ Val = F(),
+ After = os:timestamp(),
+ {now_diff(After, Before), Val}.
%%
%% Measure the execution time (in microseconds) for Fun(Args).
%%
-spec tc(function(), [_]) -> {time(), term()}.
tc(F, A) ->
- Before = erlang:now(),
- Val = (catch apply(F, A)),
- After = erlang:now(),
+ Before = os:timestamp(),
+ Val = apply(F, A),
+ After = os:timestamp(),
{now_diff(After, Before), Val}.
%%
@@ -117,9 +126,9 @@ tc(F, A) ->
%%
-spec tc(atom(), atom(), [term()]) -> {time(), term()}.
tc(M, F, A) ->
- Before = erlang:now(),
- Val = (catch apply(M, F, A)),
- After = erlang:now(),
+ Before = os:timestamp(),
+ Val = apply(M, F, A),
+ After = os:timestamp(),
{now_diff(After, Before), Val}.
%%
diff --git a/lib/stdlib/src/unicode.erl b/lib/stdlib/src/unicode.erl
index 869505ba83..12bc60623d 100644
--- a/lib/stdlib/src/unicode.erl
+++ b/lib/stdlib/src/unicode.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
diff --git a/lib/stdlib/test/Makefile b/lib/stdlib/test/Makefile
index 3bbd9ce318..5502c69fa5 100644
--- a/lib/stdlib/test/Makefile
+++ b/lib/stdlib/test/Makefile
@@ -133,9 +133,9 @@ release_spec: opt
release_tests_spec: make_emakefile
$(INSTALL_DIR) $(RELSYSDIR)
- $(INSTALL_DATA) stdlib.spec stdlib.spec.vxworks $(EMAKEFILE) \
+ $(INSTALL_DATA) stdlib.spec $(EMAKEFILE) \
$(ERL_FILES) $(COVERFILE) $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
@tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
release_docs_spec:
diff --git a/lib/stdlib/test/array_SUITE.erl b/lib/stdlib/test/array_SUITE.erl
index e7cfc65be1..1b496bb8ec 100644
--- a/lib/stdlib/test/array_SUITE.erl
+++ b/lib/stdlib/test/array_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -19,7 +19,7 @@
-module(array_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% Default timetrap timeout (set in init_per_testcase).
%% This should be set relatively high (10-15 times the expected
@@ -27,8 +27,9 @@
-define(default_timeout, ?t:seconds(60)).
%% Test server specific exports
--export([all/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
-export([
new_test/1,
@@ -64,33 +65,37 @@
%%
%% all/1
%%
-all(doc) ->
- [];
-all(suite) ->
- [new_test,
- fix_test,
- relax_test,
- resize_test,
- set_get_test,
- to_list_test,
- sparse_to_list_test,
- from_list_test,
- to_orddict_test,
- sparse_to_orddict_test,
- from_orddict_test,
- map_test,
- sparse_map_test,
- foldl_test,
- sparse_foldl_test,
- foldr_test,
- sparse_foldr_test
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [new_test, fix_test, relax_test, resize_test,
+ set_get_test, to_list_test, sparse_to_list_test,
+ from_list_test, to_orddict_test, sparse_to_orddict_test,
+ from_orddict_test, map_test, sparse_map_test,
+ foldl_test, sparse_foldl_test, foldr_test,
+ sparse_foldr_test].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Case, Config) ->
?line Dog=test_server:timetrap(?default_timeout),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/stdlib/test/base64_SUITE.erl b/lib/stdlib/test/base64_SUITE.erl
index 44742063b3..c64a961ffa 100644
--- a/lib/stdlib/test/base64_SUITE.erl
+++ b/lib/stdlib/test/base64_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -18,18 +18,19 @@
%%
-module(base64_SUITE).
--author('[email protected]').
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
-include("test_server_line.hrl").
%% Test server specific exports
--export([all/1, init_per_testcase/2, end_per_testcase/2]).
+-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]).
%% Test cases must be exported.
-export([base64_encode/1, base64_decode/1, base64_otp_5635/1,
base64_otp_6279/1, big/1, illegal/1, mime_decode/1,
- roundtrip/1]).
+ mime_decode_to_string/1, roundtrip/1]).
init_per_testcase(_, Config) ->
Dog = test_server:timetrap(?t:minutes(2)),
@@ -44,14 +45,29 @@ end_per_testcase(_, Config) ->
%%-------------------------------------------------------------------------
%% Test cases starts here.
%%-------------------------------------------------------------------------
-all(doc) ->
- ["Test library functions for base64 encode and decode "
- "(taken from inets/test/http_format_SUITE)"];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[base64_encode, base64_decode, base64_otp_5635,
- base64_otp_6279, big, illegal, mime_decode,
+ base64_otp_6279, big, illegal, mime_decode, mime_decode_to_string,
roundtrip].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%-------------------------------------------------------------------------
base64_encode(doc) ->
@@ -59,7 +75,7 @@ base64_encode(doc) ->
base64_encode(suite) ->
[];
base64_encode(Config) when is_list(Config) ->
- %% Two pads
+ %% Two pads
<<"QWxhZGRpbjpvcGVuIHNlc2FtZQ==">> =
base64:encode("Aladdin:open sesame"),
%% One pad
@@ -77,8 +93,8 @@ base64_decode(doc) ->
base64_decode(suite) ->
[];
base64_decode(Config) when is_list(Config) ->
- %% Two pads
- <<"Aladdin:open sesame">> =
+ %% Two pads
+ <<"Aladdin:open sesame">> =
base64:decode("QWxhZGRpbjpvcGVuIHNlc2FtZQ=="),
%% One pad
<<"Hello World">> = base64:decode(<<"SGVsbG8gV29ybGQ=">>),
@@ -138,20 +154,85 @@ illegal(Config) when is_list(Config) ->
{'EXIT',{function_clause, _}} = (catch base64:decode("()")),
ok.
%%-------------------------------------------------------------------------
+%% mime_decode and mime_decode_to_string have different implementations
+%% so test both with the same input separately. Both functions have
+%% the same implementation for binary/string arguments.
mime_decode(doc) ->
["Test base64:mime_decode/1."];
mime_decode(suite) ->
[];
mime_decode(Config) when is_list(Config) ->
- %% Two pads
- <<"Aladdin:open sesame">> =
+ %% Test correct padding
+ <<"one">> = base64:mime_decode(<<"b25l">>),
+ <<"on">> = base64:mime_decode(<<"b24=">>),
+ <<"o">> = base64:mime_decode(<<"bw==">>),
+ %% Test 1 extra padding
+ <<"one">> = base64:mime_decode(<<"b25l= =">>),
+ <<"on">> = base64:mime_decode(<<"b24== =">>),
+ <<"o">> = base64:mime_decode(<<"bw=== =">>),
+ %% Test 2 extra padding
+ <<"one">> = base64:mime_decode(<<"b25l===">>),
+ <<"on">> = base64:mime_decode(<<"b24====">>),
+ <<"o">> = base64:mime_decode(<<"bw=====">>),
+ %% Test misc embedded padding
+ <<"one">> = base64:mime_decode(<<"b2=5l===">>),
+ <<"on">> = base64:mime_decode(<<"b=24====">>),
+ <<"o">> = base64:mime_decode(<<"b=w=====">>),
+ %% Test misc white space and illegals with embedded padding
+ <<"one">> = base64:mime_decode(<<" b~2=\r\n5()l===">>),
+ <<"on">> = base64:mime_decode(<<"\tb =2\"�4=�= ==">>),
+ <<"o">> = base64:mime_decode(<<"\nb=w=====">>),
+ %% Two pads
+ <<"Aladdin:open sesame">> =
base64:mime_decode("QWxhZGRpbjpvc()GVuIHNlc2FtZQ=="),
- %% One pad, followed by ignored text
- <<"Hello World">> = base64:mime_decode(<<"SGVsb)(G8gV29ybGQ=apa">>),
+ %% One pad to ignore, followed by more text
+ <<"Hello World!!">> = base64:mime_decode(<<"SGVsb)(G8gV29ybGQ=h IQ= =">>),
+ %% No pad
+ <<"Aladdin:open sesam">> =
+ base64:mime_decode("QWxhZGRpbjpvcG�\")(VuIHNlc2Ft"),
+ %% Encoded base 64 strings may be divided by non base 64 chars.
+ %% In this cases whitespaces.
+ <<"0123456789!@#0^&*();:<>,. []{}">> =
+ base64:mime_decode(
+ <<"MDEy MzQ1Njc4 \tOSFAIzBeJ \nio)(oKTs6 PD4sLi \r\nBbXXt9">>),
+ ok.
+
+%%-------------------------------------------------------------------------
+
+%% Repeat of mime_decode() tests
+mime_decode_to_string(doc) ->
+ ["Test base64:mime_decode_to_string/1."];
+mime_decode_to_string(suite) ->
+ [];
+mime_decode_to_string(Config) when is_list(Config) ->
+ %% Test correct padding
+ "one" = base64:mime_decode_to_string(<<"b25l">>),
+ "on" = base64:mime_decode_to_string(<<"b24=">>),
+ "o" = base64:mime_decode_to_string(<<"bw==">>),
+ %% Test 1 extra padding
+ "one" = base64:mime_decode_to_string(<<"b25l= =">>),
+ "on" = base64:mime_decode_to_string(<<"b24== =">>),
+ "o" = base64:mime_decode_to_string(<<"bw=== =">>),
+ %% Test 2 extra padding
+ "one" = base64:mime_decode_to_string(<<"b25l===">>),
+ "on" = base64:mime_decode_to_string(<<"b24====">>),
+ "o" = base64:mime_decode_to_string(<<"bw=====">>),
+ %% Test misc embedded padding
+ "one" = base64:mime_decode_to_string(<<"b2=5l===">>),
+ "on" = base64:mime_decode_to_string(<<"b=24====">>),
+ "o" = base64:mime_decode_to_string(<<"b=w=====">>),
+ %% Test misc white space and illegals with embedded padding
+ "one" = base64:mime_decode_to_string(<<" b~2=\r\n5()l===">>),
+ "on" = base64:mime_decode_to_string(<<"\tb =2\"�4=�= ==">>),
+ "o" = base64:mime_decode_to_string(<<"\nb=w=====">>),
+ %% Two pads
+ "Aladdin:open sesame" =
+ base64:mime_decode_to_string("QWxhZGRpbjpvc()GVuIHNlc2FtZQ=="),
+ %% One pad to ignore, followed by more text
+ "Hello World!!" = base64:mime_decode_to_string(<<"SGVsb)(G8gV29ybGQ=h IQ= =">>),
%% No pad
"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.
"0123456789!@#0^&*();:<>,. []{}" =
@@ -159,6 +240,7 @@ mime_decode(Config) when is_list(Config) ->
<<"MDEy MzQ1Njc4 \tOSFAIzBeJ \nio)(oKTs6 PD4sLi \r\nBbXXt9">>),
ok.
+%%-------------------------------------------------------------------------
roundtrip(Config) when is_list(Config) ->
Sizes = lists:seq(1, 255) ++ lists:seq(2400-5, 2440),
diff --git a/lib/stdlib/test/beam_lib_SUITE.erl b/lib/stdlib/test/beam_lib_SUITE.erl
index bc867a3770..4ccc863795 100644
--- a/lib/stdlib/test/beam_lib_SUITE.erl
+++ b/lib/stdlib/test/beam_lib_SUITE.erl
@@ -1,6 +1,19 @@
%%
%% %CopyrightBegin%
%%
+%% Copyright Ericsson AB 1997-2011. 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(beam_lib_SUITE).
@@ -14,25 +27,45 @@
-define(t,test_server).
-define(privdir, "beam_lib_SUITE_priv").
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(format(S, A), ok).
-define(privdir, ?config(priv_dir, Conf)).
-endif.
--export([all/1, normal/1, error/1, cmp/1, cmp_literals/1, strip/1, otp_6711/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ normal/1, error/1, cmp/1, cmp_literals/1, strip/1, otp_6711/1,
building/1, md5/1, encrypted_abstr/1, encrypted_abstr_file/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [error, normal, cmp, cmp_literals, strip, otp_6711,
+ building, md5, encrypted_abstr, encrypted_abstr_file].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [error, normal, cmp, cmp_literals, strip, otp_6711, building, md5,
- encrypted_abstr, encrypted_abstr_file].
init_per_testcase(_Case, Config) ->
Dog=?t:timetrap(?t:minutes(2)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/stdlib/test/binary_module_SUITE.erl b/lib/stdlib/test/binary_module_SUITE.erl
index e4cdcf6125..8fb63f33bd 100644
--- a/lib/stdlib/test/binary_module_SUITE.erl
+++ b/lib/stdlib/test/binary_module_SUITE.erl
@@ -1,6 +1,26 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2011. 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(binary_module_SUITE).
--export([all/1, interesting/1,random_ref_comp/1,random_ref_sr_comp/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ interesting/1,random_ref_comp/1,random_ref_sr_comp/1,
random_ref_fla_comp/1,parts/1, bin_to_list/1, list_to_bin/1,
copy/1, referenced/1,guard/1,encode_decode/1,badargs/1,longest_common_trap/1]).
@@ -16,8 +36,8 @@
-else.
--include("test_server.hrl").
--export([init_per_testcase/2, fin_per_testcase/2]).
+-include_lib("test_server/include/test_server.hrl").
+-export([init_per_testcase/2, end_per_testcase/2]).
% Default timetrap timeout (set in init_per_testcase).
% Some of these testcases are really heavy...
-define(default_timeout, ?t:minutes(20)).
@@ -38,15 +58,35 @@ init_per_testcase(_Case, Config) ->
?line Dog = ?t:timetrap(?default_timeout),
[{watchdog, Dog} | Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
?line Dog = ?config(watchdog, Config),
?line test_server:timetrap_cancel(Dog),
ok.
-endif.
-all(suite) -> [interesting,random_ref_fla_comp,random_ref_sr_comp,
- random_ref_comp,parts,bin_to_list, list_to_bin, copy,
- referenced,guard,encode_decode,badargs,longest_common_trap].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [interesting, random_ref_fla_comp, random_ref_sr_comp,
+ random_ref_comp, parts, bin_to_list, list_to_bin, copy,
+ referenced, guard, encode_decode, badargs,
+ longest_common_trap].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
-define(MASK_ERROR(EXPR),mask_error((catch (EXPR)))).
diff --git a/lib/stdlib/test/c_SUITE.erl b/lib/stdlib/test/c_SUITE.erl
index 2edbc7ab4c..25281365be 100644
--- a/lib/stdlib/test/c_SUITE.erl
+++ b/lib/stdlib/test/c_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -17,18 +17,36 @@
%% %CopyrightEnd%
%%
-module(c_SUITE).
--export([all/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([c_1/1, c_2/1, c_3/1, c_4/1, nc_1/1, nc_2/1, nc_3/1, nc_4/1,
memory/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-import(c, [c/2, nc/2]).
-all(doc) -> ["Test cases for the 'c' module."];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[c_1, c_2, c_3, c_4, nc_1, nc_2, nc_3, nc_4, memory].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%% Write output to a directory other than current directory:
c_1(doc) ->
diff --git a/lib/stdlib/test/calendar_SUITE.erl b/lib/stdlib/test/calendar_SUITE.erl
index 10fb72c1b1..8192d035ca 100644
--- a/lib/stdlib/test/calendar_SUITE.erl
+++ b/lib/stdlib/test/calendar_SUITE.erl
@@ -18,29 +18,43 @@
%%
-module(calendar_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
gregorian_days/1,
gregorian_seconds/1,
day_of_the_week/1,
day_of_the_week_calibrate/1,
leap_years/1,
last_day_of_the_month/1,
- local_time_to_universal_time_dst/1]).
+ local_time_to_universal_time_dst/1,
+ iso_week_number/1]).
-define(START_YEAR, 1947).
-define(END_YEAR, 2012).
-all(suite) -> [gregorian_days,
- gregorian_seconds,
- day_of_the_week,
- day_of_the_week_calibrate,
- leap_years,
- last_day_of_the_month,
- local_time_to_universal_time_dst];
+suite() -> [{ct_hooks,[ts_install_cth]}].
-all(doc) -> "This is the test suite for calendar.erl".
+all() ->
+ [gregorian_days, gregorian_seconds, day_of_the_week,
+ day_of_the_week_calibrate, leap_years,
+ last_day_of_the_month, local_time_to_universal_time_dst, iso_week_number].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
gregorian_days(doc) ->
"Tests that date_to_gregorian_days and gregorian_days_to_date "
@@ -156,6 +170,15 @@ local_time_to_universal_time_dst_x(Config) when is_list(Config) ->
{comment,"Bug in mktime() in this OS"}
end.
+iso_week_number(doc) ->
+ "Test the iso week number calculation for all three possibilities."
+ " When the date falls on the last week of the previous year,"
+ " when the date falls on a week within the given year and finally,"
+ " when the date falls on the first week of the next year.";
+iso_week_number(suite) ->
+ [];
+iso_week_number(Config) when is_list(Config) ->
+ ?line check_iso_week_number().
%%
%% LOCAL FUNCTIONS
@@ -245,7 +268,12 @@ check_last_day_of_the_month({SYr, SMon}, {EYr, EMon}) when SYr < EYr ->
check_last_day_of_the_month(_, _) ->
ok.
-
+%% check_iso_week_number
+%%
+check_iso_week_number() ->
+ ?line {2004, 53} = calendar:iso_week_number({2005, 1, 1}),
+ ?line {2007, 1} = calendar:iso_week_number({2007, 1, 1}),
+ ?line {2009, 1} = calendar:iso_week_number({2008, 12, 29}).
diff --git a/lib/stdlib/test/dets_SUITE.erl b/lib/stdlib/test/dets_SUITE.erl
index 8b18ef5664..9fcc9e6aaf 100644
--- a/lib/stdlib/test/dets_SUITE.erl
+++ b/lib/stdlib/test/dets_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -28,13 +28,15 @@
-define(privdir(_), "./dets_SUITE_priv").
-define(datadir(_), "./dets_SUITE_data").
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(format(S, A), ok).
-define(privdir(Conf), ?config(priv_dir, Conf)).
-define(datadir(Conf), ?config(data_dir, Conf)).
-endif.
--export([all/1, not_run/1, newly_started/1, basic_v8/1, basic_v9/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ not_run/1, newly_started/1, basic_v8/1, basic_v9/1,
open_v8/1, open_v9/1, sets_v8/1, sets_v9/1, bags_v8/1,
bags_v9/1, duplicate_bags_v8/1, duplicate_bags_v9/1,
access_v8/1, access_v9/1, dirty_mark/1, dirty_mark2/1,
@@ -57,7 +59,7 @@
-export([histogram/1, sum_histogram/1, ave_histogram/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
%% Internal export.
-export([client/2]).
@@ -83,36 +85,51 @@ init_per_testcase(_Case, Config) ->
Dog=?t:timetrap(?t:minutes(15)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, _Config) ->
+end_per_testcase(_Case, _Config) ->
Dog=?config(watchdog, _Config),
test_server:timetrap_cancel(Dog),
ok.
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
case os:type() of
- vxworks ->
- [not_run];
+ vxworks -> [not_run];
_ ->
- {req,[stdlib],
- [basic_v8, basic_v9, open_v8, open_v9, sets_v8, sets_v9,
- bags_v8, bags_v9, duplicate_bags_v8, duplicate_bags_v9,
- newly_started, open_file_v8, open_file_v9,
- init_table_v8, init_table_v9, repair_v8, repair_v9,
- access_v8, access_v9, oldbugs_v8, oldbugs_v9,
- unsafe_assumptions, truncated_segment_array_v8,
- truncated_segment_array_v9, dirty_mark, dirty_mark2,
- bag_next_v8, bag_next_v9, hash_v8b_v8c, phash, fold_v8,
- fold_v9, fixtable_v8, fixtable_v9, match_v8, match_v9,
- select_v8, select_v9, update_counter, badarg,
- cache_sets_v8, cache_sets_v9, cache_bags_v8,
- cache_bags_v9, cache_duplicate_bags_v8,
- cache_duplicate_bags_v9, otp_4208, otp_4989, many_clients,
- otp_4906, otp_5402, simultaneous_open, insert_new,
- repair_continuation, otp_5487, otp_6206, otp_6359, otp_4738,
- otp_7146, otp_8070, otp_8856, otp_8898, otp_8899, otp_8903,
- otp_8923]}
+ [basic_v8, basic_v9, open_v8, open_v9, sets_v8, sets_v9,
+ bags_v8, bags_v9, duplicate_bags_v8, duplicate_bags_v9,
+ newly_started, open_file_v8, open_file_v9,
+ init_table_v8, init_table_v9, repair_v8, repair_v9,
+ access_v8, access_v9, oldbugs_v8, oldbugs_v9,
+ unsafe_assumptions, truncated_segment_array_v8,
+ truncated_segment_array_v9, dirty_mark, dirty_mark2,
+ bag_next_v8, bag_next_v9, hash_v8b_v8c, phash, fold_v8,
+ fold_v9, fixtable_v8, fixtable_v9, match_v8, match_v9,
+ select_v8, select_v9, update_counter, badarg,
+ cache_sets_v8, cache_sets_v9, cache_bags_v8,
+ cache_bags_v9, cache_duplicate_bags_v8,
+ cache_duplicate_bags_v9, otp_4208, otp_4989,
+ many_clients, otp_4906, otp_5402, simultaneous_open,
+ insert_new, repair_continuation, otp_5487, otp_6206,
+ otp_6359, otp_4738, otp_7146, otp_8070, otp_8856, otp_8898,
+ otp_8899, otp_8903, otp_8923]
end.
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
not_run(suite) -> [];
not_run(Conf) when is_list(Conf) ->
{comment, "Not runnable VxWorks/NFS"}.
diff --git a/lib/stdlib/test/dict_SUITE.erl b/lib/stdlib/test/dict_SUITE.erl
index 6a90870bda..c46fc47b34 100644
--- a/lib/stdlib/test/dict_SUITE.erl
+++ b/lib/stdlib/test/dict_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -22,21 +22,41 @@
-module(dict_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
create/1,store/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-import(lists, [foldl/3,reverse/1]).
-all(suite) ->
- [create,store].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [create, store].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Case, Config) ->
?line Dog = ?t:timetrap(?t:minutes(5)),
[{watchdog,Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/stdlib/test/dict_test_lib.erl b/lib/stdlib/test/dict_test_lib.erl
index fd15baa5ff..92a75dad89 100644
--- a/lib/stdlib/test/dict_test_lib.erl
+++ b/lib/stdlib/test/dict_test_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2010. 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
diff --git a/lib/stdlib/test/digraph_SUITE.erl b/lib/stdlib/test/digraph_SUITE.erl
index 6ef5b1ddef..1d1326d60e 100644
--- a/lib/stdlib/test/digraph_SUITE.erl
+++ b/lib/stdlib/test/digraph_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -23,19 +23,41 @@
-ifdef(STANDALONE).
-define(line, put(line, ?LINE), ).
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-endif.
--export([all/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([opts/1, degree/1, path/1, cycle/1, misc/1, vertices/1,
- edges/1, data/1, tickets/1, otp_3522/1, otp_3630/1, otp_8066/1]).
+-export([opts/1, degree/1, path/1, cycle/1, vertices/1,
+ edges/1, data/1, otp_3522/1, otp_3630/1, otp_8066/1]).
-export([spawn_graph/2]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) -> {req, [stdlib], [opts, degree, path, cycle, misc, tickets]}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [opts, degree, path, cycle, {group, misc},
+ {group, tickets}].
+
+groups() ->
+ [{misc, [], [vertices, edges, data]},
+ {tickets, [], [otp_3522, otp_3630, otp_8066]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -147,7 +169,6 @@ cycle(Config) when is_list(Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-misc(suite) -> [vertices, edges, data].
vertices(doc) -> [];
vertices(suite) -> [];
@@ -210,7 +231,6 @@ data(Config) when is_list(Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-tickets(suite) -> [otp_3522, otp_3630, otp_8066].
otp_3522(doc) -> [];
otp_3522(suite) -> [];
diff --git a/lib/stdlib/test/digraph_utils_SUITE.erl b/lib/stdlib/test/digraph_utils_SUITE.erl
index d6d477b388..12c486c25f 100644
--- a/lib/stdlib/test/digraph_utils_SUITE.erl
+++ b/lib/stdlib/test/digraph_utils_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -22,10 +22,11 @@
-ifdef(debug).
-define(line, put(line, ?LINE), ).
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-endif.
--export([all/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([simple/1, loop/1, isolated/1, topsort/1, subgraph/1,
condensation/1, tree/1]).
@@ -33,8 +34,27 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) -> {req, [stdlib], [simple, loop, isolated, topsort,
- subgraph, condensation, tree]}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [simple, loop, isolated, topsort, subgraph,
+ condensation, tree].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/stdlib/test/dummy_h.erl b/lib/stdlib/test/dummy_h.erl
index 01eb790a75..7546fe78a0 100644
--- a/lib/stdlib/test/dummy_h.erl
+++ b/lib/stdlib/test/dummy_h.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2010. 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
diff --git a/lib/stdlib/test/edlin_expand_SUITE.erl b/lib/stdlib/test/edlin_expand_SUITE.erl
index 613bfd000e..a0e198ce09 100644
--- a/lib/stdlib/test/edlin_expand_SUITE.erl
+++ b/lib/stdlib/test/edlin_expand_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2011. 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
@@ -17,13 +17,14 @@
%% %CopyrightEnd%
%%
-module(edlin_expand_SUITE).
--export([all/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([normal/1, quoted_fun/1, quoted_module/1, quoted_both/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
% Default timetrap timeout (set in init_per_testcase).
-define(default_timeout, ?t:minutes(1)).
@@ -31,16 +32,36 @@
init_per_testcase(_Case, Config) ->
?line Dog = ?t:timetrap(?default_timeout),
[{watchdog, Dog} | Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-all(doc) ->
- ["Test cases for edlin_expand."];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[normal, quoted_fun, quoted_module, quoted_both].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ true = code:delete(expand_test),
+ true = code:delete(expand_test1),
+ true = code:delete('ExpandTestCaps'),
+ true = code:delete('ExpandTestCaps1'),
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
normal(doc) ->
[""];
normal(suite) ->
diff --git a/lib/stdlib/test/epp_SUITE.erl b/lib/stdlib/test/epp_SUITE.erl
index e9fb932632..9b024a5b49 100644
--- a/lib/stdlib/test/epp_SUITE.erl
+++ b/lib/stdlib/test/epp_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -17,11 +17,12 @@
%% %CopyrightEnd%
-module(epp_SUITE).
--export([all/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([rec_1/1, predef_mac/1,
- upcase_mac/1, upcase_mac_1/1, upcase_mac_2/1,
- variable/1, variable_1/1, otp_4870/1, otp_4871/1, otp_5362/1,
+ upcase_mac_1/1, upcase_mac_2/1,
+ variable_1/1, otp_4870/1, otp_4871/1, otp_5362/1,
pmod/1, not_circular/1, skip_header/1, otp_6277/1, otp_7702/1,
otp_8130/1, overload_mac/1, otp_8388/1, otp_8470/1, otp_8503/1,
otp_8562/1, otp_8665/1, otp_8911/1]).
@@ -44,8 +45,8 @@ config(priv_dir, _) ->
config(data_dir, _) ->
filename:absname("./epp_SUITE_data").
-else.
--include("test_server.hrl").
--export([init_per_testcase/2, fin_per_testcase/2]).
+-include_lib("test_server/include/test_server.hrl").
+-export([init_per_testcase/2, end_per_testcase/2]).
% Default timetrap timeout (set in init_per_testcase).
-define(default_timeout, ?t:minutes(1)).
@@ -53,18 +54,36 @@ config(data_dir, _) ->
init_per_testcase(_, Config) ->
?line Dog = ?t:timetrap(?default_timeout),
[{watchdog, Dog} | Config].
-fin_per_testcase(_, Config) ->
+end_per_testcase(_, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-endif.
-all(doc) ->
- ["Test cases for epp."];
-all(suite) ->
- [rec_1, upcase_mac, predef_mac, variable, otp_4870, otp_4871, otp_5362,
- pmod, not_circular, skip_header, otp_6277, otp_7702, otp_8130,
- overload_mac, otp_8388, otp_8470, otp_8503, otp_8562, otp_8665, otp_8911].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [rec_1, {group, upcase_mac}, predef_mac,
+ {group, variable}, otp_4870, otp_4871, otp_5362, pmod,
+ not_circular, skip_header, otp_6277, otp_7702, otp_8130,
+ overload_mac, otp_8388, otp_8470, otp_8503, otp_8562,
+ otp_8665, otp_8911].
+
+groups() ->
+ [{upcase_mac, [], [upcase_mac_1, upcase_mac_2]},
+ {variable, [], [variable_1]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
rec_1(doc) ->
["Recursive macros hang or crash epp (OTP-1398)."];
@@ -127,10 +146,6 @@ check_errors([{error, Info} | Rest]) ->
check_errors([_ | Rest]) ->
check_errors(Rest).
-upcase_mac(doc) ->
- ["Check that uppercase macro names are implicitly quoted (OTP-2608)"];
-upcase_mac(suite) ->
- [upcase_mac_1, upcase_mac_2].
upcase_mac_1(doc) ->
[];
@@ -176,10 +191,6 @@ predef_mac(Config) when is_list(Config) ->
end,
ok.
-variable(doc) ->
- ["Check variable as first file component of the include directives."];
-variable(suite) ->
- [variable_1].
variable_1(doc) ->
[];
diff --git a/lib/stdlib/test/erl_eval_SUITE.erl b/lib/stdlib/test/erl_eval_SUITE.erl
index c60a558fa1..4b59cee99e 100644
--- a/lib/stdlib/test/erl_eval_SUITE.erl
+++ b/lib/stdlib/test/erl_eval_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -17,7 +17,8 @@
%% %CopyrightEnd%
-module(erl_eval_SUITE).
--export([all/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([guard_1/1, guard_2/1,
match_pattern/1,
@@ -38,7 +39,8 @@
otp_8133/1,
funs/1,
try_catch/1,
- eval_expr_5/1]).
+ eval_expr_5/1,
+ zero_width/1]).
%%
%% Define to run outside of test server
@@ -57,26 +59,42 @@
config(priv_dir,_) ->
".".
-else.
--include("test_server.hrl").
--export([init_per_testcase/2, fin_per_testcase/2]).
+-include_lib("test_server/include/test_server.hrl").
+-export([init_per_testcase/2, end_per_testcase/2]).
% Default timetrap timeout (set in init_per_testcase).
-define(default_timeout, ?t:minutes(1)).
init_per_testcase(_Case, Config) ->
?line Dog = ?t:timetrap(?default_timeout),
[{watchdog, Dog} | Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-endif.
-all(doc) ->
- ["Test cases for the 'erl_eval' module."];
-all(suite) ->
- [guard_1, guard_2, match_pattern, string_plusplus, pattern_expr,
- match_bin, guard_3, guard_4,
- lc, simple_cases, unary_plus, apply_atom, otp_5269, otp_6539, otp_6543,
- otp_6787, otp_6977, otp_7550, otp_8133, funs, try_catch, eval_expr_5].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [guard_1, guard_2, match_pattern, string_plusplus,
+ pattern_expr, match_bin, guard_3, guard_4, lc,
+ simple_cases, unary_plus, apply_atom, otp_5269,
+ otp_6539, otp_6543, otp_6787, otp_6977, otp_7550,
+ otp_8133, funs, try_catch, eval_expr_5, zero_width].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
guard_1(doc) ->
["(OTP-2405)"];
@@ -553,6 +571,17 @@ otp_5269(Config) when is_list(Config) ->
B:A>> <- [<<16:8,19:16>>],
<<X:8>> <- [<<B:8>>]].",
[19]),
+ ?line check(fun() ->
+ (fun (<<A:1/binary, B:8/integer, _C:B/binary>>) ->
+ case A of
+ B -> wrong;
+ _ -> ok
+ end
+ end)(<<1,2,3,4>>) end,
+ "(fun(<<A:1/binary, B:8/integer, _C:B/binary>>) ->"
+ " case A of B -> wrong; _ -> ok end"
+ " end)(<<1, 2, 3, 4>>).",
+ ok),
ok.
otp_6539(doc) ->
@@ -1326,6 +1355,14 @@ eval_expr_5(Config) when is_list(Config) ->
ok
end.
+zero_width(Config) when is_list(Config) ->
+ ?line check(fun() ->
+ {'EXIT',{badarg,_}} = (catch <<not_a_number:0>>),
+ ok
+ end, "begin {'EXIT',{badarg,_}} = (catch <<not_a_number:0>>), "
+ "ok end.", ok),
+ ok.
+
%% Check the string in different contexts: as is; in fun; from compiled code.
check(F, String, Result) ->
check1(F, String, Result),
diff --git a/lib/stdlib/test/erl_eval_helper.erl b/lib/stdlib/test/erl_eval_helper.erl
index 7fdbabcb17..6863b40108 100644
--- a/lib/stdlib/test/erl_eval_helper.erl
+++ b/lib/stdlib/test/erl_eval_helper.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2010. 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
diff --git a/lib/stdlib/test/erl_expand_records_SUITE.erl b/lib/stdlib/test/erl_expand_records_SUITE.erl
index 1d621c65df..f8c1ad783c 100644
--- a/lib/stdlib/test/erl_expand_records_SUITE.erl
+++ b/lib/stdlib/test/erl_expand_records_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -27,15 +27,17 @@
-define(privdir, "erl_expand_records_SUITE_priv").
-define(t, test_server).
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(privdir, ?config(priv_dir, Config)).
-endif.
--export([all/1, init_per_testcase/2, fin_per_testcase/2]).
+-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([abstract_module/1, attributes/1, expr/1, guard/1,
init/1, pattern/1, strict/1, update/1,
- tickets/1, otp_5915/1, otp_7931/1, otp_5990/1,
+ otp_5915/1, otp_7931/1, otp_5990/1,
otp_7078/1, otp_7101/1]).
% Default timetrap timeout (set in init_per_testcase).
@@ -45,14 +47,33 @@ init_per_testcase(_Case, Config) ->
?line Dog = ?t:timetrap(?default_timeout),
[{watchdog, Dog} | Config].
-fin_per_testcase(_Case, _Config) ->
+end_per_testcase(_Case, _Config) ->
Dog = ?config(watchdog, _Config),
test_server:timetrap_cancel(Dog),
ok.
-all(suite) ->
- [abstract_module, attributes, expr, guard, init, pattern,
- strict, update, tickets].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [abstract_module, attributes, expr, guard, init,
+ pattern, strict, update, {group, tickets}].
+
+groups() ->
+ [{tickets, [],
+ [otp_5915, otp_7931, otp_5990, otp_7078, otp_7101]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
abstract_module(doc) ->
"Compile an abstract module.";
@@ -399,8 +420,6 @@ update(Config) when is_list(Config) ->
?line run(Config, Ts),
ok.
-tickets(suite) ->
- [otp_5915, otp_7931, otp_5990, otp_7078, otp_7101].
otp_5915(doc) ->
"Strict record tests in guards.";
diff --git a/lib/stdlib/test/erl_internal_SUITE.erl b/lib/stdlib/test/erl_internal_SUITE.erl
index 8f675c94ec..b6b3c004ea 100644
--- a/lib/stdlib/test/erl_internal_SUITE.erl
+++ b/lib/stdlib/test/erl_internal_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -18,15 +18,35 @@
%%
-module(erl_internal_SUITE).
--export([all/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([behav/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [behav].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) -> [behav].
-define(default_timeout, ?t:minutes(2)).
@@ -34,7 +54,7 @@ init_per_testcase(_Case, Config) ->
?line Dog = test_server:timetrap(?default_timeout),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/stdlib/test/erl_lint_SUITE.erl b/lib/stdlib/test/erl_lint_SUITE.erl
index d0c0d68b4a..f980d52e4e 100644
--- a/lib/stdlib/test/erl_lint_SUITE.erl
+++ b/lib/stdlib/test/erl_lint_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -27,34 +27,37 @@
-define(privdir, "erl_lint_SUITE_priv").
-define(t, test_server).
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(datadir, ?config(data_dir, Conf)).
-define(privdir, ?config(priv_dir, Conf)).
-endif.
--export([all/1, init_per_testcase/2, fin_per_testcase/2]).
-
--export([unused_vars_warn/1,
- unused_vars_warn_basic/1,
- unused_vars_warn_lc/1,
- unused_vars_warn_rec/1,
- unused_vars_warn_fun/1,
- unused_vars_OTP_4858/1,
- export_vars_warn/1,
- shadow_vars/1,
- unused_import/1,
- unused_function/1,
- unsafe_vars/1,unsafe_vars2/1,
- unsafe_vars_try/1,
- guard/1, otp_4886/1, otp_4988/1, otp_5091/1, otp_5276/1, otp_5338/1,
- otp_5362/1, otp_5371/1, otp_7227/1, otp_5494/1, otp_5644/1, otp_5878/1,
- otp_5917/1, otp_6585/1, otp_6885/1, export_all/1,
- bif_clash/1,
- behaviour_basic/1, behaviour_multiple/1,
- otp_7550/1,
- otp_8051/1,
- format_warn/1,
- on_load/1, on_load_successful/1, on_load_failing/1
+-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([
+ unused_vars_warn_basic/1,
+ unused_vars_warn_lc/1,
+ unused_vars_warn_rec/1,
+ unused_vars_warn_fun/1,
+ unused_vars_OTP_4858/1,
+ export_vars_warn/1,
+ shadow_vars/1,
+ unused_import/1,
+ unused_function/1,
+ unsafe_vars/1,unsafe_vars2/1,
+ unsafe_vars_try/1,
+ guard/1, otp_4886/1, otp_4988/1, otp_5091/1, otp_5276/1, otp_5338/1,
+ otp_5362/1, otp_5371/1, otp_7227/1, otp_5494/1, otp_5644/1, otp_5878/1,
+ otp_5917/1, otp_6585/1, otp_6885/1, export_all/1,
+ bif_clash/1,
+ behaviour_basic/1, behaviour_multiple/1,
+ otp_7550/1,
+ otp_8051/1,
+ format_warn/1,
+ on_load_successful/1, on_load_failing/1,
+ too_many_arguments/1
]).
% Default timetrap timeout (set in init_per_testcase).
@@ -64,24 +67,44 @@ init_per_testcase(_Case, Config) ->
?line Dog = ?t:timetrap(?default_timeout),
[{watchdog, Dog} | Config].
-fin_per_testcase(_Case, _Config) ->
+end_per_testcase(_Case, _Config) ->
Dog = ?config(watchdog, _Config),
test_server:timetrap_cancel(Dog),
ok.
-all(suite) ->
- [unused_vars_warn, export_vars_warn,
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, unused_vars_warn}, export_vars_warn,
shadow_vars, unused_import, unused_function,
- unsafe_vars, unsafe_vars2, unsafe_vars_try,
- guard, otp_4886, otp_4988, otp_5091, otp_5276, otp_5338,
- otp_5362, otp_5371, otp_7227, otp_5494, otp_5644, otp_5878, otp_5917, otp_6585,
- otp_6885, export_all, bif_clash,
- behaviour_basic, behaviour_multiple, otp_7550, otp_8051, format_warn,
- on_load].
+ unsafe_vars, unsafe_vars2, unsafe_vars_try, guard,
+ otp_4886, otp_4988, otp_5091, otp_5276, otp_5338,
+ otp_5362, otp_5371, otp_7227, otp_5494, otp_5644,
+ otp_5878, otp_5917, otp_6585, otp_6885, export_all,
+ bif_clash, behaviour_basic, behaviour_multiple,
+ otp_7550, otp_8051, format_warn, {group, on_load},
+ too_many_arguments].
+
+groups() ->
+ [{unused_vars_warn, [],
+ [unused_vars_warn_basic, unused_vars_warn_lc,
+ unused_vars_warn_rec, unused_vars_warn_fun,
+ unused_vars_OTP_4858]},
+ {on_load, [], [on_load_successful, on_load_failing]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
-unused_vars_warn(suite) ->
- [unused_vars_warn_basic, unused_vars_warn_lc, unused_vars_warn_rec,
- unused_vars_warn_fun, unused_vars_OTP_4858].
unused_vars_warn_basic(doc) ->
"Warnings for unused variables in some simple cases.";
@@ -2831,8 +2854,6 @@ format_level(Level, Count, Config) ->
%% Test the -on_load(Name/0) directive.
-on_load(suite) ->
- [on_load_successful, on_load_failing].
on_load_successful(Config) when is_list(Config) ->
Ts = [{on_load_1,
@@ -2913,6 +2934,21 @@ on_load_failing(Config) when is_list(Config) ->
?line [] = run(Config, Ts),
ok.
+too_many_arguments(doc) ->
+ "Test that too many arguments is not accepted.";
+too_many_arguments(suite) -> [];
+too_many_arguments(Config) when is_list(Config) ->
+ Ts = [{too_many_1,
+ <<"f(_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_) -> ok.">>,
+ [],
+ {errors,
+ [{1,erl_lint,{too_many_arguments,256}}],[]}}
+ ],
+
+ ?line [] = run(Config, Ts),
+ ok.
+
+
run(Config, Tests) ->
F = fun({N,P,Ws,E}, BadL) ->
case catch run_test(Config, P, Ws) of
diff --git a/lib/stdlib/test/erl_pp_SUITE.erl b/lib/stdlib/test/erl_pp_SUITE.erl
index c57541fba9..bc811355ab 100644
--- a/lib/stdlib/test/erl_pp_SUITE.erl
+++ b/lib/stdlib/test/erl_pp_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -30,23 +30,25 @@
-define(privdir, "erl_pp_SUITE_priv").
-define(t, test_server).
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(datadir, ?config(data_dir, Config)).
-define(privdir, ?config(priv_dir, Config)).
-endif.
--export([all/1, init_per_testcase/2, fin_per_testcase/2]).
+-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([expr/1, func/1, call/1, recs/1, try_catch/1, if_then/1,
- receive_after/1, bits/1, head_tail/1, package/1,
- cond1/1, block/1, case1/1, ops/1, messages/1,
- old_mnemosyne_syntax/1,
- attributes/1, import_export/1, misc_attrs/1,
- hook/1,
- neg_indent/1,
- tickets/1,
- otp_6321/1, otp_6911/1, otp_6914/1, otp_8150/1, otp_8238/1,
- otp_8473/1, otp_8522/1, otp_8567/1, otp_8664/1]).
+-export([ func/1, call/1, recs/1, try_catch/1, if_then/1,
+ receive_after/1, bits/1, head_tail/1, package/1,
+ cond1/1, block/1, case1/1, ops/1, messages/1,
+ old_mnemosyne_syntax/1,
+ import_export/1, misc_attrs/1,
+ hook/1,
+ neg_indent/1,
+
+ otp_6321/1, otp_6911/1, otp_6914/1, otp_8150/1, otp_8238/1,
+ otp_8473/1, otp_8522/1, otp_8567/1, otp_8664/1, otp_9147/1]).
%% Internal export.
-export([ehook/6]).
@@ -58,17 +60,40 @@ init_per_testcase(_Case, Config) ->
?line Dog = ?t:timetrap(?default_timeout),
[{watchdog, Dog} | Config].
-fin_per_testcase(_Case, _Config) ->
+end_per_testcase(_Case, _Config) ->
Dog = ?config(watchdog, _Config),
test_server:timetrap_cancel(Dog),
ok.
-all(suite) ->
- [expr, attributes, hook, neg_indent, tickets].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, expr}, {group, attributes}, hook, neg_indent,
+ {group, tickets}].
+
+groups() ->
+ [{expr, [],
+ [func, call, recs, try_catch, if_then, receive_after,
+ bits, head_tail, package, cond1, block, case1, ops,
+ messages, old_mnemosyne_syntax]},
+ {attributes, [], [misc_attrs, import_export]},
+ {tickets, [],
+ [otp_6321, otp_6911, otp_6914, otp_8150, otp_8238,
+ otp_8473, otp_8522, otp_8567, otp_8664, otp_9147]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
-expr(suite) ->
- [func, call, recs, try_catch, if_then, receive_after, bits, head_tail,
- package, cond1, block, case1, ops, messages, old_mnemosyne_syntax].
func(suite) ->
[];
@@ -564,8 +589,6 @@ old_mnemosyne_syntax(Config) when is_list(Config) ->
ok.
-attributes(suite) ->
- [misc_attrs, import_export].
import_export(suite) ->
[];
@@ -763,9 +786,6 @@ neg_indent(Config) when is_list(Config) ->
ok.
-tickets(suite) ->
- [otp_6321, otp_6911, otp_6914, otp_8150, otp_8238, otp_8473, otp_8522,
- otp_8567, otp_8664].
otp_6321(doc) ->
"OTP_6321. Bug fix of exprs().";
@@ -1027,6 +1047,26 @@ otp_8664(Config) when is_list(Config) ->
ok.
+otp_9147(doc) ->
+ "OTP_9147. Create well-formed types when adding 'undefined'.";
+otp_9147(suite) -> [];
+otp_9147(Config) when is_list(Config) ->
+ FileName = filename('otp_9147.erl', Config),
+ C1 = <<"-module(otp_9147).\n"
+ "-export_type([undef/0]).\n"
+ "-record(undef, {f1 :: F1 :: a | b}).\n"
+ "-type undef() :: #undef{}.\n">>,
+ ?line ok = file:write_file(FileName, C1),
+ ?line {ok, _, []} =
+ compile:file(FileName, [return,'P',{outdir,?privdir}]),
+ PFileName = filename('otp_9147.P', Config),
+ ?line {ok, Bin} = file:read_file(PFileName),
+ %% The parentheses around "F1 :: a | b" are new (bugfix).
+ ?line true =
+ lists:member("-record(undef,{f1 :: undefined | (F1 :: a | b)}).",
+ string:tokens(binary_to_list(Bin), "\n")),
+ ok.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
compile(Config, Tests) ->
diff --git a/lib/stdlib/test/erl_scan_SUITE.erl b/lib/stdlib/test/erl_scan_SUITE.erl
index 32eb97bc92..31a4f94294 100644
--- a/lib/stdlib/test/erl_scan_SUITE.erl
+++ b/lib/stdlib/test/erl_scan_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -17,9 +17,10 @@
%% %CopyrightEnd%
-module(erl_scan_SUITE).
--export([all/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([error/1, error_1/1, error_2/1, iso88591/1, otp_7810/1]).
+-export([ error_1/1, error_2/1, iso88591/1, otp_7810/1]).
-import(lists, [nth/2,flatten/1]).
-import(io_lib, [print/1]).
@@ -39,14 +40,14 @@
%% config(data_dir, _) ->
%% ".".
-else.
--include("test_server.hrl").
--export([init_per_testcase/2, fin_per_testcase/2]).
+-include_lib("test_server/include/test_server.hrl").
+-export([init_per_testcase/2, end_per_testcase/2]).
init_per_testcase(_Case, Config) when is_list(Config) ->
?line Dog=test_server:timetrap(test_server:seconds(1200)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
@@ -55,15 +56,27 @@ fin_per_testcase(_Case, Config) ->
% Default timetrap timeout (set in init_per_testcase).
-define(default_timeout, ?t:minutes(1)).
-all(doc) ->
- ["Test cases for the 'erl_scan' module."];
-all(suite) ->
- [error,iso88591,otp_7810].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, error}, iso88591, otp_7810].
+
+groups() ->
+ [{error, [], [error_1, error_2]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
-error(doc) ->
- ["Error cases"];
-error(suite) ->
- [error_1, error_2].
error_1(doc) ->
["(OTP-2347)"];
diff --git a/lib/stdlib/test/error_logger_forwarder.erl b/lib/stdlib/test/error_logger_forwarder.erl
index 7d99d07860..5703ac769a 100644
--- a/lib/stdlib/test/error_logger_forwarder.erl
+++ b/lib/stdlib/test/error_logger_forwarder.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009. All Rights Reserved.
+%% Copyright Ericsson AB 2010. 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
diff --git a/lib/stdlib/test/escript_SUITE.erl b/lib/stdlib/test/escript_SUITE.erl
index 162ca6006f..9f95df062b 100644
--- a/lib/stdlib/test/escript_SUITE.erl
+++ b/lib/stdlib/test/escript_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2011. 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
@@ -18,9 +18,10 @@
-module(escript_SUITE).
-export([
- all/1,
+ 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,
- fin_per_testcase/2,
+ end_per_testcase/2,
basic/1,
errors/1,
strange_name/1,
@@ -35,29 +36,36 @@
verify_sections/3
]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("kernel/include/file.hrl").
-all(suite) ->
- [
- basic,
- errors,
- strange_name,
- emulator_flags,
- module_script,
- beam_script,
- archive_script,
- epp,
- create_and_extract,
- foldl,
- overflow
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [basic, errors, strange_name, emulator_flags,
+ module_script, beam_script, archive_script, epp,
+ create_and_extract, foldl, overflow].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
init_per_testcase(_Case, Config) ->
?line Dog = ?t:timetrap(?t:minutes(1)),
[{watchdog,Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/stdlib/test/ets_SUITE.erl b/lib/stdlib/test/ets_SUITE.erl
index 620848003c..9d348b5f1a 100644
--- a/lib/stdlib/test/ets_SUITE.erl
+++ b/lib/stdlib/test/ets_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -18,24 +18,25 @@
%%
-module(ets_SUITE).
--export([all/1]).
--export([new/1,default/1,setbag/1,badnew/1,verybadnew/1,named/1,keypos2/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]).
--export([insert/1,empty/1,badinsert/1]).
--export([lookup/1,time_lookup/1,badlookup/1,lookup_order/1]).
--export([delete/1,delete_elem/1,delete_tab/1,delete_large_tab/1,
+-export([empty/1,badinsert/1]).
+-export([time_lookup/1,badlookup/1,lookup_order/1]).
+-export([delete_elem/1,delete_tab/1,delete_large_tab/1,
delete_large_named_table/1,
evil_delete/1,baddelete/1,match_delete/1,table_leak/1]).
-export([match_delete3/1]).
-export([firstnext/1,firstnext_concurrent/1]).
-export([slot/1]).
--export([match/1, match1/1, match2/1, match_object/1, match_object2/1]).
--export([misc/1, dups/1, misc1/1, safe_fixtable/1, info/1, tab2list/1]).
--export([files/1, tab2file/1, tab2file2/1, tabfile_ext1/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]).
--export([heavy/1, heavy_lookup/1, heavy_lookup_element/1, heavy_concurrent/1]).
--export([lookup_element/1, lookup_element_mult/1]).
--export([fold/1]).
+-export([ heavy_lookup/1, heavy_lookup_element/1, heavy_concurrent/1]).
+-export([ lookup_element_mult/1]).
+-export([]).
-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,
t_delete_all_objects/1, t_insert_list/1, t_test_ms/1,
@@ -59,7 +60,7 @@
-export([otp_7665/1]).
-export([meta_wb/1]).
-export([grow_shrink/1, grow_pseudo_deleted/1, shrink_pseudo_deleted/1]).
--export([meta_smp/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]).
@@ -72,7 +73,7 @@
-export([write_concurrency/1, heir/1, give_away/1, setopts/1]).
-export([bad_table/1, types/1]).
--export([init_per_testcase/2, fin_per_testcase/2, end_per_suite/1]).
+-export([init_per_testcase/2, end_per_testcase/2]).
%% Convenience for manual testing
-export([random_test/0]).
@@ -92,12 +93,15 @@
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,
do_heavy_concurrent/1, tab2file2_do/2, exit_large_table_owner_do/2,
- types_do/1, sleeper/0, rpc_externals/0, memory_do/1
+ types_do/1, sleeper/0, rpc_externals/0, memory_do/1,
+ ms_tracee_dummy/1, ms_tracee_dummy/2, ms_tracee_dummy/3, ms_tracee_dummy/4
]).
-export([t_select_reverse/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
+
+-define(m(A,B), ?line assert_eq(A,B)).
init_per_testcase(Case, Config) ->
Seed = {S1,S2,S3} = random:seed0(), %now(),
@@ -108,44 +112,80 @@ init_per_testcase(Case, Config) ->
Dog=test_server:timetrap(test_server:minutes(20)),
[{watchdog, Dog}, {test_case, Case} | Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog=?config(watchdog, Config),
wait_for_test_procs(true),
test_server:timetrap_cancel(Dog).
-
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, new}, {group, insert}, {group, lookup},
+ {group, delete}, firstnext, firstnext_concurrent, slot,
+ {group, match}, t_match_spec_run,
+ {group, lookup_element}, {group, misc}, {group, files},
+ {group, heavy}, ordered, ordered_match,
+ interface_equality, fixtable_next, fixtable_insert,
+ rename, rename_unnamed, evil_rename, update_element,
+ update_counter, evil_update_counter, partly_bound,
+ match_heavy, {group, fold}, member, t_delete_object,
+ t_init_table, t_whitebox, t_delete_all_objects,
+ t_insert_list, t_test_ms, t_select_delete, t_ets_dets,
+ memory, t_select_reverse, t_bucket_disappears,
+ select_fail, t_insert_new, t_repair_continuation,
+ otp_5340, otp_6338, otp_6842_select_1000, otp_7665,
+ otp_8732, meta_wb, grow_shrink, grow_pseudo_deleted,
+ shrink_pseudo_deleted, {group, meta_smp}, smp_insert,
+ smp_fixed_delete, smp_unfix_fix, smp_select_delete,
+ otp_8166, exit_large_table_owner,
+ exit_many_large_table_owner, exit_many_tables_owner,
+ exit_many_many_tables_owner, write_concurrency, heir,
+ give_away, setopts, bad_table, types].
+
+groups() ->
+ [{new, [],
+ [default, setbag, badnew, verybadnew, named, keypos2,
+ privacy]},
+ {insert, [], [empty, badinsert]},
+ {lookup, [], [time_lookup, badlookup, lookup_order]},
+ {lookup_element, [], [lookup_element_mult]},
+ {delete, [],
+ [delete_elem, delete_tab, delete_large_tab,
+ delete_large_named_table, evil_delete, table_leak,
+ baddelete, match_delete, match_delete3]},
+ {match, [],
+ [match1, match2, match_object, match_object2]},
+ {misc, [],
+ [misc1, safe_fixtable, info, dups, tab2list]},
+ {files, [],
+ [tab2file, tab2file2, tabfile_ext1,
+ tabfile_ext2, tabfile_ext3, tabfile_ext4]},
+ {heavy, [],
+ [heavy_lookup, heavy_lookup_element, heavy_concurrent]},
+ {fold, [],
+ [foldl_ordered, foldr_ordered, foldl, foldr,
+ fold_empty]},
+ {meta_smp, [],
+ [meta_lookup_unnamed_read, meta_lookup_unnamed_write,
+ meta_lookup_named_read, meta_lookup_named_write,
+ meta_newdel_unnamed, meta_newdel_named]}].
+
+init_per_suite(Config) ->
+ Config.
end_per_suite(_Config) ->
stop_spawn_logger(),
catch erts_debug:set_internal_state(available_internal_state, false).
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- [
- new,insert,lookup,delete,firstnext,firstnext_concurrent,slot,match,
- t_match_spec_run,
- lookup_element, misc,files, heavy,
- ordered, ordered_match, interface_equality,
- fixtable_next, fixtable_insert, rename, rename_unnamed, evil_rename,
- update_element, update_counter, evil_update_counter, partly_bound,
- match_heavy, fold, member,
- t_delete_object, t_init_table, t_whitebox,
- t_delete_all_objects, t_insert_list, t_test_ms,
- t_select_delete, t_ets_dets, memory, t_select_reverse,
- t_bucket_disappears,
- select_fail,t_insert_new, t_repair_continuation, otp_5340, otp_6338,
- otp_6842_select_1000, otp_7665, otp_8732,
- meta_wb,
- grow_shrink, grow_pseudo_deleted, shrink_pseudo_deleted,
- meta_smp,
- smp_insert, smp_fixed_delete, smp_unfix_fix, smp_select_delete, otp_8166,
- exit_large_table_owner,
- exit_many_large_table_owner,
- exit_many_tables_owner,
- exit_many_many_tables_owner,
- write_concurrency, heir, give_away, setopts,
- bad_table, types
- ].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -176,29 +216,180 @@ t_match_spec_run(suite) ->
t_match_spec_run(doc) ->
["Check ets:match_spec_run/2."];
t_match_spec_run(Config) when is_list(Config) ->
+ init_externals(),
?line EtsMem = etsmem(),
- ?line [2,3] = ets:match_spec_run([{1},{2},{3}],
- ets:match_spec_compile(
- [{{'$1'},[{'>','$1',1}],['$1']}])),
+
+ t_match_spec_run_test([{1},{2},{3}],
+ [{{'$1'},[{'>','$1',1}],['$1']}],
+ [2,3]),
+
?line Huge = [{X} || X <- lists:seq(1,2500)],
?line L = lists:seq(2476,2500),
- ?line L = ets:match_spec_run(Huge,
- ets:match_spec_compile(
- [{{'$1'},[{'>','$1',2475}],['$1']}])),
+ t_match_spec_run_test(Huge, [{{'$1'},[{'>','$1',2475}],['$1']}], L),
+
?line L2 = [{X*16#FFFFFFF} || X <- L],
- ?line L2 = ets:match_spec_run(Huge,
- ets:match_spec_compile(
- [{{'$1'},
- [{'>','$1',2475}],
- [{{{'*','$1',16#FFFFFFF}}}]}])),
- ?line [500,1000,1500,2000,2500] =
- ets:match_spec_run(Huge,
- ets:match_spec_compile(
- [{{'$1'},
- [{'=:=',{'rem','$1',500},0}],
- ['$1']}])),
+ t_match_spec_run_test(Huge,
+ [{{'$1'}, [{'>','$1',2475}], [{{{'*','$1',16#FFFFFFF}}}]}],
+ L2),
+
+ t_match_spec_run_test(Huge, [{{'$1'}, [{'=:=',{'rem','$1',500},0}], ['$1']}],
+ [500,1000,1500,2000,2500]),
+
+ %% More matching fun with several match clauses and guards,
+ %% applied to a variety of terms.
+ Fun = fun(Term) ->
+ CTerm = {const, Term},
+
+ N_List = [{Term, "0", "v-element"},
+ {"=hidden_node", "0", Term},
+ {"0", Term, Term},
+ {"something", Term, "something else"},
+ {"guard and res", Term, 872346},
+ {Term, {'and',Term,'again'}, 3.14},
+ {Term, {'and',Term,'again'}, "m&g"},
+ {Term, {'and',Term,'again'}, "m&g&r"},
+ {[{second,Term}, 'and', "tail"], Term, ['and',"tail"]}],
+
+ N_MS = [{{'$1','$2','$3'},
+ [{'=:=','$1',CTerm}, {'=:=','$2',{const,"0"}}],
+ [{{"Guard only for $1",'$3'}}]},
+
+ {{'$3','$1','$4'},
+ [{'=:=','$3',"=hidden_node"}, {'=:=','$1',{const,"0"}}],
+ [{{"Result only for $4",'$4'}}]},
+
+ {{'$2','$1','$1'},
+ [{'=:=','$2',{const,"0"}}],
+ [{{"Match only for $1",'$2'}}]},
+
+ {{'$2',Term,['$3'|'_']},
+ [{is_list,'$2'},{'=:=','$3',$s}],
+ [{{"Matching term",'$2'}}]},
+
+ {{'$1','$2',872346},
+ [{'=:=','$2',CTerm}, {is_list,'$1'}],
+ [{{"Guard and result",'$2'}}]},
+
+ {{'$1', {'and','$1','again'}, '$2'},
+ [{is_float,'$2'}],
+ [{{"Match and result",'$1'}}]},
+
+ {{'$1', {'and','$1','again'}, '$2'},
+ [{'=:=','$1',CTerm}, {'=:=', '$2', "m&g"}],
+ [{{"Match and guard",'$2'}}]},
+
+ {{'$1', {'and','$1','again'}, "m&g&r"},
+ [{'=:=','$1',CTerm}],
+ [{{"Match, guard and result",'$1'}}]},
+
+ {{'$1', '$2', '$3'},
+ [{'=:=','$1',[{{second,'$2'}} | '$3']}],
+ [{{"Building guard"}}]}
+ ],
+
+ N_Result = [{"Guard only for $1", "v-element"},
+ {"Result only for $4", Term},
+ {"Match only for $1", "0"},
+ {"Matching term","something"},
+ {"Guard and result",Term},
+ {"Match and result",Term},
+ {"Match and guard","m&g"},
+ {"Match, guard and result",Term},
+ {"Building guard"}],
+
+ F = fun(N_MS_Perm) ->
+ t_match_spec_run_test(N_List, N_MS_Perm, N_Result)
+ end,
+ repeat_for_permutations(F, N_MS)
+ end,
+
+ test_terms(Fun, skip_refc_check),
+
?line verify_etsmem(EtsMem).
+t_match_spec_run_test(List, MS, Result) ->
+
+ %%io:format("ms = ~p\n",[MS]),
+
+ ?m(Result, ets:match_spec_run(List, ets:match_spec_compile(MS))),
+
+ %% Check that ets:select agree
+ Tab = ets:new(xxx, [bag]),
+ ets:insert(Tab, List),
+ SRes = lists:sort(Result),
+ ?m(SRes, lists:sort(ets:select(Tab, MS))),
+ ets:delete(Tab),
+
+ %% Check that tracing agree
+ Self = self(),
+ {Tracee, MonRef} = spawn_monitor(fun() -> ms_tracee(Self, List) end),
+ receive {Tracee, ready} -> ok end,
+
+ MST = lists:map(fun(Clause) -> ms_clause_ets_to_trace(Clause) end, MS),
+
+ %%io:format("MS = ~p\nMST= ~p\n",[MS,MST]),
+
+ erlang:trace_pattern({?MODULE,ms_tracee_dummy,'_'}, MST , [local]),
+ erlang:trace(Tracee, true, [call]),
+ Tracee ! start,
+ TRes = ms_tracer_collect(Tracee, MonRef, []),
+ %erlang:trace(Tracee, false, [call]),
+ %Tracee ! stop,
+ case TRes of
+ SRes -> ok;
+ _ ->
+ io:format("TRACE MATCH FAILED\n"),
+ io:format("Input = ~p\nMST = ~p\nExpected = ~p\nGot = ~p\n", [List, MST, SRes, TRes]),
+ ?t:fail("TRACE MATCH FAILED")
+ end,
+ ok.
+
+
+
+ms_tracer_collect(Tracee, Ref, Acc) ->
+ receive
+ {trace, Tracee, call, _Args, [Msg]} ->
+ %io:format("trace Args=~p Msg=~p\n", [_Args, Msg]),
+ ms_tracer_collect(Tracee, Ref, [Msg | Acc]);
+
+ {'DOWN', Ref, process, Tracee, _} ->
+ %io:format("monitor DOWN for ~p\n", [Tracee]),
+ TDRef = erlang:trace_delivered(Tracee),
+ ms_tracer_collect(Tracee, TDRef, Acc);
+
+ {trace_delivered, Tracee, Ref} ->
+ %%io:format("trace delivered for ~p\n", [Tracee]),
+ lists:sort(Acc);
+
+ Other ->
+ io:format("Unexpected message = ~p\n", [Other]),
+ ?t:fail("Unexpected tracer msg")
+ end.
+
+
+ms_tracee(Parent, CallArgList) ->
+ %io:format("ms_tracee ~p started with ArgList = ~p\n", [self(), CallArgList]),
+ Parent ! {self(), ready},
+ receive start -> ok end,
+ lists:foreach(fun(Args) ->
+ erlang:apply(?MODULE, ms_tracee_dummy, tuple_to_list(Args))
+ end, CallArgList).
+ %%receive stop -> ok end.
+
+
+
+ms_tracee_dummy(_) -> ok.
+ms_tracee_dummy(_,_) -> ok.
+ms_tracee_dummy(_,_,_) -> ok.
+ms_tracee_dummy(_,_,_,_) -> ok.
+
+ms_clause_ets_to_trace({Head, Guard, Body}) ->
+ {tuple_to_list(Head), Guard, [{message, Body}]}.
+
+assert_eq(A,A) -> ok;
+assert_eq(A,B) ->
+ io:format("FAILED MATCH:\n~p\n =/=\n~p\n",[A,B]),
+ ?t:fail("assert_eq failed").
t_repair_continuation(suite) ->
@@ -332,7 +523,6 @@ t_repair_continuation_do(Opts) ->
?line true = ets:is_compiled_ms(ets:match_spec_compile(MS)),
?line verify_etsmem(EtsMem).
-new(suite) -> [default,setbag,badnew,verybadnew,named,keypos2,privacy].
default(doc) ->
["Check correct default vaules of a new ets table"];
@@ -1391,8 +1581,7 @@ update_element_opts(Tuple,KeyPos,UpdPos,Opts) ->
ok.
update_element(T,Tuple,KeyPos,UpdPos) ->
- KeyList = [Key || Key <- [17,"seventeen",<<"seventeen">>,{17},list_to_binary(lists:seq(1,100)),
- make_ref(), self()]],
+ KeyList = [17,"seventeen",<<"seventeen">>,{17},list_to_binary(lists:seq(1,100)),make_ref(), self()],
lists:foreach(fun(Key) ->
TupleWithKey = setelement(KeyPos,Tuple,Key),
update_element_do(T,TupleWithKey,Key,UpdPos)
@@ -1406,6 +1595,8 @@ update_element_do(Tab,Tuple,Key,UpdPos) ->
% This will try all combinations of {fromValue,toValue}
%
% IMPORTANT: size(Values) must be a prime number for this to work!!!
+
+ %io:format("update_element_do for key=~p\n",[Key]),
Big32 = 16#12345678,
Big64 = 16#123456789abcdef0,
Values = { 623, -27, 0, Big32, -Big32, Big64, -Big64, Big32*Big32,
@@ -1426,7 +1617,7 @@ update_element_do(Tab,Tuple,Key,UpdPos) ->
(ToIx, [], Pos, _Rand, _MeF) ->
{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]),
@@ -1553,6 +1744,7 @@ update_counter_for(T) ->
(Obj, Times, Arg3, Myself) ->
?line {NewObj, Ret} = uc_mimic(Obj,Arg3),
ArgHash = erlang:phash2({T,a,Arg3}),
+ %%io:format("update_counter(~p, ~p, ~p) expecting ~p\n",[T,a,Arg3,Ret]),
?line Ret = ets:update_counter(T,a,Arg3),
?line ArgHash = erlang:phash2({T,a,Arg3}),
%%io:format("NewObj=~p~n ",[NewObj]),
@@ -2720,8 +2912,6 @@ rotate_tuple(Tuple, N) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-insert(doc) -> ["Test proper and improper inserts into a table."];
-insert(suite) -> [empty,badinsert].
empty(doc) ->
["Check lookup in an empty table and lookup of a non-existing key"];
@@ -2761,8 +2951,6 @@ badinsert_do(Opts) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-lookup(doc) -> ["Some tests for lookups (timing, bad lookups, etc.)."];
-lookup(suite) -> [time_lookup,badlookup,lookup_order].
time_lookup(doc) -> ["Lookup timing."];
time_lookup(suite) -> [];
@@ -2889,8 +3077,6 @@ fill_tab(Tab,Val) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-lookup_element(doc) -> ["Some tests for lookup_element."];
-lookup_element(suite) -> [lookup_element_mult].
lookup_element_mult(doc) -> ["Multiple return elements (OTP-2386)"];
lookup_element_mult(suite) -> [];
@@ -2932,11 +3118,6 @@ lem_crash_3(T) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-delete(doc) ->
- ["Check delete functionality (proper/improper deletes)"];
-delete(suite) ->
- [delete_elem,delete_tab,delete_large_tab,delete_large_named_table,evil_delete,
- table_leak,baddelete,match_delete,match_delete3].
delete_elem(doc) ->
["Check delete of an element inserted in a `filled' table."];
@@ -3416,7 +3597,7 @@ firstnext_concurrent(Config) when is_list(Config) ->
[dynamic_go() || _ <- lists:seq(1, 2)],
receive
after 5000 -> ok
- end.
+ end.
ets_init(Tab, N) ->
ets_new(Tab, [named_table,public,ordered_set]),
@@ -3471,7 +3652,6 @@ slot_loop(Tab,SlotNo,EltsSoFar) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-match(suite) -> [match1, match2, match_object, match_object2].
match1(suite) -> [];
match1(Config) when is_list(Config) ->
@@ -3606,7 +3786,6 @@ match_object2_do(Opts) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-misc(suite) -> [misc1, safe_fixtable, info, dups, tab2list].
tab2list(doc) -> ["Tests tab2list (OTP-3319)"];
tab2list(suite) -> [];
@@ -3739,9 +3918,6 @@ dups_do(Opts) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-files(suite) -> [tab2file, tab2file2, tabfile_ext1, tabfile_ext2,
- tabfile_ext3, tabfile_ext4].
-
tab2file(doc) -> ["Check the ets:tab2file function on an empty "
"ets table."];
tab2file(suite) -> [];
@@ -3991,7 +4167,6 @@ make_sub_binary(List, Num) when is_list(List) ->
{_,B} = split_binary(Bin, N+1),
B.
-heavy(suite) -> [heavy_lookup, heavy_lookup_element, heavy_concurrent].
%% Lookup stuff like crazy...
heavy_lookup(doc) -> ["Performs multiple lookups for every key ",
@@ -4054,7 +4229,7 @@ do_lookup_element(Tab, N, M) ->
end.
-heavy_concurrent(_Config) ->
+heavy_concurrent(Config) when is_list(Config) ->
repeat_for_opts(do_heavy_concurrent).
do_heavy_concurrent(Opts) ->
@@ -4092,9 +4267,6 @@ do_heavy_concurrent_proc(Tab, N, Offs) ->
_ = ets:lookup(Tab, N),
do_heavy_concurrent_proc(Tab, N-1, Offs).
-fold(suite) -> [foldl_ordered, foldr_ordered,
- foldl, foldr,
- fold_empty].
fold_empty(doc) ->
[];
@@ -4856,13 +5028,6 @@ shrink_pseudo_deleted_do(Type) ->
process_flag(scheduler,0).
-meta_smp(suite) ->
- [meta_lookup_unnamed_read,
- meta_lookup_unnamed_write,
- meta_lookup_named_read,
- meta_lookup_named_write,
- meta_newdel_unnamed,
- meta_newdel_named].
meta_lookup_unnamed_read(suite) -> [];
meta_lookup_unnamed_read(Config) when is_list(Config) ->
@@ -5250,7 +5415,7 @@ types_do(Opts) ->
ets:delete_all_objects(T),
?line 0 = ets:info(T,size)
end,
- test_terms(Fun),
+ test_terms(Fun, strict),
ets:delete(T),
?line verify_etsmem(EtsMem).
@@ -5325,7 +5490,25 @@ my_tab_to_list(_Ts,'$end_of_table', Acc) -> lists:reverse(Acc);
my_tab_to_list(Ts,Key, Acc) ->
my_tab_to_list(Ts,ets:next(Ts,Key),[ets:lookup(Ts, Key)| Acc]).
+wait_for_all_schedulers_online_to_execute() ->
+ PMs = lists:map(fun (Sched) ->
+ spawn_opt(fun () -> ok end,
+ [monitor, {scheduler, Sched}])
+ end,
+ lists:seq(1,erlang:system_info(schedulers_online))),
+ lists:foreach(fun ({P, M}) ->
+ receive
+ {'DOWN', M, process, P, _} -> ok
+ end
+ end,
+ PMs),
+ ok.
+
etsmem() ->
+ %% Wait until it is guaranteed that all already scheduled
+ %% deallocations of DbTable structures have completed.
+ wait_for_all_schedulers_online_to_execute(),
+
AllTabs = lists:map(fun(T) -> {T,ets:info(T,name),ets:info(T,size),
ets:info(T,memory),ets:info(T,type)}
end, ets:all()),
@@ -5476,6 +5659,20 @@ repeat_while(Fun, Arg0) ->
{false,Ret} -> Ret
end.
+%% Some (but not all) permutations of List
+repeat_for_permutations(Fun, List) ->
+ repeat_for_permutations(Fun, List, length(List)-1).
+repeat_for_permutations(Fun, List, 0) ->
+ Fun(List);
+repeat_for_permutations(Fun, List, N) ->
+ {A,B} = lists:split(N, List),
+ L1 = B++A,
+ L2 = lists:reverse(L1),
+ L3 = B++lists:reverse(A),
+ L4 = lists:reverse(B)++A,
+ Fun(L1), Fun(L2), Fun(L3), Fun(L4),
+ repeat_for_permutations(Fun, List, N-1).
+
receive_any() ->
receive M ->
io:format("Process ~p got msg ~p\n", [self(),M]),
@@ -5533,7 +5730,7 @@ only_if_smp(Schedulers, Func) ->
%% Copy-paste from emulator/test/binary_SUITE.erl
-define(heap_binary_size, 64).
-test_terms(Test_Func) ->
+test_terms(Test_Func, Mode) ->
garbage_collect(),
?line Pib0 = process_info(self(),binary),
@@ -5610,7 +5807,10 @@ test_terms(Test_Func) ->
Pib = process_info(self(),binary),
?line Test_Func(Bin3),
garbage_collect(),
- ?line Pib = process_info(self(),binary),
+ case Mode of
+ strict -> ?line Pib = process_info(self(),binary);
+ skip_refc_check -> ok
+ end,
?line Test_Func(make_unaligned_sub_binary(Bin0)),
?line Test_Func(make_unaligned_sub_binary(Bin1)),
@@ -5654,9 +5854,13 @@ test_terms(Test_Func) ->
?line Test_Func(lists:duplicate(32, FF)),
garbage_collect(),
- ?line Pib0 = process_info(self(),binary),
+ case Mode of
+ strict -> ?line Pib0 = process_info(self(),binary);
+ skip_refc_check -> ok
+ end,
ok.
+
id(I) -> I.
very_big_num() ->
@@ -5688,27 +5892,32 @@ make_ext_ref() ->
Ref.
init_externals() ->
- SysDistSz = ets:info(sys_dist,size),
- ?line Pa = filename:dirname(code:which(?MODULE)),
- ?line {ok, Node} = test_server:start_node(plopp, slave, [{args, " -pa " ++ Pa}]),
- ?line Res = case rpc:call(Node, ?MODULE, rpc_externals, []) of
- {badrpc, {'EXIT', E}} ->
- test_server:fail({rpcresult, E});
- R -> R
- end,
- ?line test_server:stop_node(Node),
-
- %% Wait for table 'sys_dist' to stabilize
- repeat_while(fun() ->
- case ets:info(sys_dist,size) of
- SysDistSz -> false;
- Sz ->
- io:format("Waiting for sys_dist to revert size from ~p to size ~p\n",
- [Sz, SysDistSz]),
- receive after 1000 -> true end
- end
- end),
- put(externals, Res).
+ case get(externals) of
+ undefined ->
+ SysDistSz = ets:info(sys_dist,size),
+ ?line Pa = filename:dirname(code:which(?MODULE)),
+ ?line {ok, Node} = test_server:start_node(plopp, slave, [{args, " -pa " ++ Pa}]),
+ ?line Res = case rpc:call(Node, ?MODULE, rpc_externals, []) of
+ {badrpc, {'EXIT', E}} ->
+ test_server:fail({rpcresult, E});
+ R -> R
+ end,
+ ?line test_server:stop_node(Node),
+
+ %% Wait for table 'sys_dist' to stabilize
+ repeat_while(fun() ->
+ case ets:info(sys_dist,size) of
+ SysDistSz -> false;
+ Sz ->
+ io:format("Waiting for sys_dist to revert size from ~p to size ~p\n",
+ [Sz, SysDistSz]),
+ receive after 1000 -> true end
+ end
+ end),
+ put(externals, Res);
+
+ {_,_,_} -> ok
+ end.
rpc_externals() ->
{self(), make_port(), make_ref()}.
diff --git a/lib/stdlib/test/ets_tough_SUITE.erl b/lib/stdlib/test/ets_tough_SUITE.erl
index 4c8d941f13..d9d0461575 100644
--- a/lib/stdlib/test/ets_tough_SUITE.erl
+++ b/lib/stdlib/test/ets_tough_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -17,13 +17,33 @@
%% %CopyrightEnd%
%%
-module(ets_tough_SUITE).
--export([all/1,ex1/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,ex1/1]).
-export([init/1,terminate/2,handle_call/3,handle_info/2]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
-compile([export_all]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [ex1].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) -> [ex1].
-define(DEBUG(X),debug_disabled).
@@ -34,7 +54,7 @@ init_per_testcase(_Func, Config) ->
Dog=test_server:timetrap(test_server:seconds(300)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ets:delete(?GLOBAL_PARAMS).
diff --git a/lib/stdlib/test/file_sorter_SUITE.erl b/lib/stdlib/test/file_sorter_SUITE.erl
index c00ed91fe7..80d4ea5fdc 100644
--- a/lib/stdlib/test/file_sorter_SUITE.erl
+++ b/lib/stdlib/test/file_sorter_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -27,12 +27,13 @@
-define(t,test_server).
-define(privdir(_), "./file_sorter_SUITE_priv").
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(format(S, A), ok).
-define(privdir(Conf), ?config(priv_dir, Conf)).
-endif.
--export([all/1, basic/1, badarg/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, basic/1, badarg/1,
term_sort/1, term_keysort/1,
binary_term_sort/1, binary_term_keysort/1,
binary_sort/1,
@@ -44,30 +45,42 @@
binary_check/1,
inout/1, misc/1, many/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
init_per_testcase(_Case, Config) ->
Dog=?t:timetrap(?t:minutes(2)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-all(suite) ->
- {req,[stdlib,kernel],
- [basic, badarg,
- term_sort, term_keysort,
- binary_term_sort, binary_term_keysort,
- binary_sort,
- term_merge, term_keymerge,
- binary_term_merge, binary_term_keymerge,
- binary_merge,
- term_check, binary_term_keycheck,
- binary_term_check, binary_term_keycheck,
- binary_check,
- inout, misc, many]}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [basic, badarg, term_sort, term_keysort,
+ binary_term_sort, binary_term_keysort, binary_sort,
+ term_merge, term_keymerge, binary_term_merge,
+ binary_term_keymerge, binary_merge, term_check,
+ binary_term_keycheck, binary_term_check,
+ binary_term_keycheck, binary_check, inout, misc, many].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
basic(doc) ->
["Basic test case."];
diff --git a/lib/stdlib/test/filelib_SUITE.erl b/lib/stdlib/test/filelib_SUITE.erl
index 5a279609c6..a355097fe2 100644
--- a/lib/stdlib/test/filelib_SUITE.erl
+++ b/lib/stdlib/test/filelib_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -19,27 +19,47 @@
-module(filelib_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
wildcard_one/1,wildcard_two/1,wildcard_errors/1,
fold_files/1,otp_5960/1,ensure_dir_eexist/1]).
-import(lists, [foreach/2]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("kernel/include/file.hrl").
init_per_testcase(_Case, Config) ->
?line Dog = ?t:timetrap(?t:minutes(5)),
[{watchdog,Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-all(suite) ->
- [wildcard_one,wildcard_two,wildcard_errors,fold_files,otp_5960,
- ensure_dir_eexist].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [wildcard_one, wildcard_two, wildcard_errors,
+ fold_files, otp_5960, ensure_dir_eexist].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
wildcard_one(Config) when is_list(Config) ->
?line {ok,OldCwd} = file:get_cwd(),
diff --git a/lib/stdlib/test/filename_SUITE.erl b/lib/stdlib/test/filename_SUITE.erl
index dbce93600b..70b0d413dc 100644
--- a/lib/stdlib/test/filename_SUITE.erl
+++ b/lib/stdlib/test/filename_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -17,7 +17,8 @@
%% %CopyrightEnd%
%%
-module(filename_SUITE).
--export([all/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([absname/1, absname_2/1,
basename_1/1, basename_2/1,
dirname/1, extension/1, join/1, t_nativename/1]).
@@ -26,9 +27,12 @@
basename_bin_1/1, basename_bin_2/1,
dirname_bin/1, extension_bin/1, join_bin/1]).
-export([pathtype_bin/1,rootname_bin/1,split_bin/1]).
--include("test_server.hrl").
-all(suite) ->
+-include_lib("test_server/include/test_server.hrl").
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[absname, absname_2, basename_1, basename_2, dirname,
extension,
join, pathtype, rootname, split, t_nativename, find_src,
@@ -36,6 +40,22 @@ all(suite) ->
extension_bin,
join_bin, pathtype_bin, rootname_bin, split_bin].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
absname(Config) when is_list(Config) ->
diff --git a/lib/stdlib/test/fixtable_SUITE.erl b/lib/stdlib/test/fixtable_SUITE.erl
index 1940ee147e..57fe4c4508 100644
--- a/lib/stdlib/test/fixtable_SUITE.erl
+++ b/lib/stdlib/test/fixtable_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -21,22 +21,41 @@
%%%----------------------------------------------------------------------
-module(fixtable_SUITE).
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
%%% Test cases
-export([multiple_fixes/1, multiple_processes/1,
other_process_deletes/1, owner_dies/1,
other_process_closes/1,insert_same_key/1]).
-export([fixbag/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
%%% Internal exports
-export([command_loop/0,start_commander/0]).
-all(suite) -> {req, [stdlib],
- [multiple_fixes, multiple_processes,
- other_process_deletes, owner_dies,
- other_process_closes,insert_same_key,fixbag]}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
--include("test_server.hrl").
+all() ->
+ [multiple_fixes, multiple_processes,
+ other_process_deletes, owner_dies, other_process_closes,
+ insert_same_key, fixbag].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+-include_lib("test_server/include/test_server.hrl").
%%% I wrote this thinking I would use more than one temporary at a time, but
%%% I wasn't... Well, maybe in the future...
@@ -53,7 +72,7 @@ init_per_testcase(_Func, Config) ->
Dog=test_server:timetrap(test_server:seconds(60)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
lists:foreach(fun(X) ->
diff --git a/lib/stdlib/test/format_SUITE.erl b/lib/stdlib/test/format_SUITE.erl
index 1c9e953003..68e17a0459 100644
--- a/lib/stdlib/test/format_SUITE.erl
+++ b/lib/stdlib/test/format_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -17,13 +17,14 @@
%% %CopyrightEnd%
%%
-module(format_SUITE).
--export([all/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([hang_1/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
% Default timetrap timeout (set in init_per_testcase).
-define(default_timeout, ?t:minutes(1)).
@@ -31,16 +32,32 @@
init_per_testcase(_Case, Config) ->
?line Dog = ?t:timetrap(?default_timeout),
[{watchdog, Dog} | Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-all(doc) ->
- ["Test cases for io:format/[2,3]."];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[hang_1].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
hang_1(doc) ->
["Bad args can hang (OTP-2400)"];
hang_1(suite) ->
diff --git a/lib/stdlib/test/gen_event_SUITE.erl b/lib/stdlib/test/gen_event_SUITE.erl
index 4f7de451e3..b3a7edc140 100644
--- a/lib/stdlib/test/gen_event_SUITE.erl
+++ b/lib/stdlib/test/gen_event_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -18,16 +18,40 @@
%%
-module(gen_event_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1]).
--export([start/1, test_all/1, add_handler/1, add_sup_handler/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([start/1, add_handler/1, add_sup_handler/1,
delete_handler/1, swap_handler/1, swap_sup_handler/1,
notify/1, sync_notify/1, call/1, info/1, hibernate/1,
- call_format_status/1, error_format_status/1]).
+ call_format_status/1, call_format_status_anon/1,
+ error_format_status/1]).
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [start, {group, test_all}, hibernate,
+ call_format_status, call_format_status_anon, error_format_status].
+
+groups() ->
+ [{test_all, [],
+ [add_handler, add_sup_handler, delete_handler,
+ swap_handler, swap_sup_handler, notify, sync_notify,
+ call, info]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) -> {req, [stdlib], [start, test_all, hibernate,
- call_format_status, error_format_status]}.
%% --------------------------------------
%% Start an event manager.
@@ -171,9 +195,6 @@ hibernate(Config) when is_list(Config) ->
ok.
-test_all(suite) -> [add_handler, add_sup_handler, delete_handler,
- swap_handler, swap_sup_handler, notify,
- sync_notify, call, info].
add_handler(doc) -> [];
add_handler(suite) -> [];
@@ -868,6 +889,22 @@ call_format_status(Config) when is_list(Config) ->
?line {"Installed handlers", [{_,dummy1_h,_,FmtState,_}]} = HandlerInfo2,
ok.
+call_format_status_anon(suite) ->
+ [];
+call_format_status_anon(doc) ->
+ ["Test that sys:get_status/1,2 calls format_status/2 for anonymous gen_event processes"];
+call_format_status_anon(Config) when is_list(Config) ->
+ ?line {ok, Pid} = gen_event:start(),
+ %% The 'Name' of the gen_event process will be a pid() here, so
+ %% the next line will crash if format_status can't string-ify pids.
+ ?line Status1 = sys:get_status(Pid),
+ ?line ok = gen_event:stop(Pid),
+ Header = "Status for event handler " ++ pid_to_list(Pid),
+ ?line {status, Pid, _, [_, _, Pid, [], Data1]} = Status1,
+ ?line Header = proplists:get_value(header, Data1),
+ ok.
+
+
error_format_status(suite) ->
[];
error_format_status(doc) ->
diff --git a/lib/stdlib/test/gen_fsm_SUITE.erl b/lib/stdlib/test/gen_fsm_SUITE.erl
index dd120f8c05..d60629d841 100644
--- a/lib/stdlib/test/gen_fsm_SUITE.erl
+++ b/lib/stdlib/test/gen_fsm_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -18,19 +18,20 @@
%%
-module(gen_fsm_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% Test cases
--export([all/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([start/1, start1/1, start2/1, start3/1, start4/1 , start5/1, start6/1,
+-export([ start1/1, start2/1, start3/1, start4/1 , start5/1, start6/1,
start7/1, start8/1, start9/1, start10/1, start11/1]).
--export([abnormal/1, abnormal1/1, abnormal2/1]).
+-export([ abnormal1/1, abnormal2/1]).
-export([shutdown/1]).
--export([sys/1, sys1/1, call_format_status/1, error_format_status/1]).
+-export([ sys1/1, call_format_status/1, error_format_status/1]).
-export([hibernate/1,hiber_idle/3,hiber_wakeup/3,hiber_idle/2,hiber_wakeup/2]).
@@ -53,13 +54,31 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) ->
- [start, abnormal, shutdown, sys, hibernate, enter_loop].
-
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, start}, {group, abnormal}, shutdown,
+ {group, sys}, hibernate, enter_loop].
+
+groups() ->
+ [{start, [],
+ [start1, start2, start3, start4, start5, start6, start7,
+ start8, start9, start10, start11]},
+ {abnormal, [], [abnormal1, abnormal2]},
+ {sys, [],
+ [sys1, call_format_status, error_format_status]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+init_per_group(_GroupName, Config) ->
+ Config.
-start(suite) -> [start1, start2, start3, start4, start5, start6, start7,
- start8, start9, start10, start11].
+end_per_group(_GroupName, Config) ->
+ Config.
%% anonymous
start1(Config) when is_list(Config) ->
@@ -239,7 +258,6 @@ start11(Config) when is_list(Config) ->
test_server:messages_get(),
ok.
-abnormal(suite) -> [abnormal1, abnormal2].
%% Check that time outs in calls work
abnormal1(suite) -> [];
@@ -305,7 +323,6 @@ shutdown(Config) when is_list(Config) ->
ok.
-sys(suite) -> [sys1, call_format_status, error_format_status].
sys1(Config) when is_list(Config) ->
?line {ok, Pid} =
diff --git a/lib/stdlib/test/gen_server_SUITE.erl b/lib/stdlib/test/gen_server_SUITE.erl
index 99388ba2e3..a614d6595d 100644
--- a/lib/stdlib/test/gen_server_SUITE.erl
+++ b/lib/stdlib/test/gen_server_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -18,12 +18,13 @@
%%
-module(gen_server_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("kernel/include/inet.hrl").
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
--export([all/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([start/1, crash/1, call/1, cast/1, cast_fast/1,
info/1, abcast/1, multicall/1, multicall_down/1,
call_remote1/1, call_remote2/1, call_remote3/1,
@@ -45,23 +46,55 @@
-export([init/1, handle_call/3, handle_cast/2,
handle_info/2, terminate/2, format_status/2]).
-all(suite) ->
- [start, crash, call, cast, cast_fast, info,
- abcast, multicall, multicall_down, call_remote1,
- call_remote2, call_remote3, call_remote_n1,
- call_remote_n2, call_remote_n3, spec_init,
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [start, crash, call, cast, cast_fast, info, abcast,
+ multicall, multicall_down, call_remote1, call_remote2,
+ call_remote3, call_remote_n1, call_remote_n2,
+ call_remote_n3, spec_init,
spec_init_local_registered_parent,
- spec_init_global_registered_parent,
- otp_5854, hibernate, otp_7669,
- call_format_status, error_format_status,
+ spec_init_global_registered_parent, otp_5854, hibernate,
+ otp_7669, call_format_status, error_format_status,
call_with_huge_message_queue].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
-define(default_timeout, ?t:minutes(1)).
+init_per_testcase(Case, Config) when Case == call_remote1;
+ Case == call_remote2;
+ Case == call_remote3;
+ Case == call_remote_n1;
+ Case == call_remote_n2;
+ Case == call_remote_n3 ->
+ {ok,N} = start_node(hubba),
+ ?line Dog = ?t:timetrap(?default_timeout),
+ [{node,N},{watchdog, Dog} | Config];
init_per_testcase(_Case, Config) ->
?line Dog = ?t:timetrap(?default_timeout),
[{watchdog, Dog} | Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
+ case proplists:get_value(node, Config) of
+ undefined ->
+ ok;
+ N ->
+ test_server:stop_node(N)
+ end,
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
@@ -294,8 +327,8 @@ start_node(Name) ->
call_remote1(suite) -> [];
call_remote1(Config) when is_list(Config) ->
- ?line N = hubba,
- ?line {ok, Node} = start_node(N),
+ N = hubba,
+ ?line Node = proplists:get_value(node,Config),
?line {ok, Pid} = rpc:call(Node, gen_server, start,
[{global, N}, ?MODULE, [], []]),
?line ok = (catch gen_server:call({global, N}, started_p, infinity)),
@@ -308,7 +341,7 @@ call_remote1(Config) when is_list(Config) ->
call_remote2(suite) -> [];
call_remote2(Config) when is_list(Config) ->
?line N = hubba,
- ?line {ok, Node} = start_node(N),
+ ?line Node = proplists:get_value(node,Config),
?line {ok, Pid} = rpc:call(Node, gen_server, start,
[{global, N}, ?MODULE, [], []]),
@@ -321,8 +354,7 @@ call_remote2(Config) when is_list(Config) ->
call_remote3(suite) -> [];
call_remote3(Config) when is_list(Config) ->
- ?line N = hubba,
- ?line {ok, Node} = start_node(N),
+ ?line Node = proplists:get_value(node,Config),
?line {ok, Pid} = rpc:call(Node, gen_server, start,
[{local, piller}, ?MODULE, [], []]),
@@ -340,7 +372,7 @@ call_remote3(Config) when is_list(Config) ->
call_remote_n1(suite) -> [];
call_remote_n1(Config) when is_list(Config) ->
?line N = hubba,
- ?line {ok, Node} = start_node(N),
+ ?line Node = proplists:get_value(node,Config),
?line {ok, _Pid} = rpc:call(Node, gen_server, start,
[{global, N}, ?MODULE, [], []]),
?line _ = test_server:stop_node(Node),
@@ -352,7 +384,7 @@ call_remote_n1(Config) when is_list(Config) ->
call_remote_n2(suite) -> [];
call_remote_n2(Config) when is_list(Config) ->
?line N = hubba,
- ?line {ok, Node} = start_node(N),
+ ?line Node = proplists:get_value(node,Config),
?line {ok, Pid} = rpc:call(Node, gen_server, start,
[{global, N}, ?MODULE, [], []]),
@@ -364,8 +396,7 @@ call_remote_n2(Config) when is_list(Config) ->
call_remote_n3(suite) -> [];
call_remote_n3(Config) when is_list(Config) ->
- ?line N = hubba,
- ?line {ok, Node} = start_node(N),
+ ?line Node = proplists:get_value(node,Config),
?line {ok, _Pid} = rpc:call(Node, gen_server, start,
[{local, piller}, ?MODULE, [], []]),
diff --git a/lib/stdlib/test/id_transform_SUITE.erl b/lib/stdlib/test/id_transform_SUITE.erl
index 95ee509833..e1972a100e 100644
--- a/lib/stdlib/test/id_transform_SUITE.erl
+++ b/lib/stdlib/test/id_transform_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -21,17 +21,37 @@
-include_lib("kernel/include/file.hrl").
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
id_transform/1]).
-export([check/2,check2/1,g/0,f/1,t/1,t1/1,t2/1,t3/1,t4/1,
t5/1,t6/1,apa/1,new_fun/0]).
-% Serves as test...
+ % Serves as test...
-hej(hopp).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [id_transform].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) -> [id_transform].
id_transform(doc) -> "Test erl_id_trans.";
id_transform(Config) when is_list(Config) ->
diff --git a/lib/stdlib/test/io_SUITE.erl b/lib/stdlib/test/io_SUITE.erl
index 73efeb004a..54a98985cd 100644
--- a/lib/stdlib/test/io_SUITE.erl
+++ b/lib/stdlib/test/io_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -18,15 +18,16 @@
%%
-module(io_SUITE).
--export([all/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([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
-export([error_1/1, float_g/1, otp_5403/1, otp_5813/1, otp_6230/1,
otp_6282/1, otp_6354/1, otp_6495/1, otp_6517/1, otp_6502/1,
manpage/1, otp_6708/1, otp_7084/1, otp_7421/1,
io_lib_collect_line_3_wb/1, cr_whitespace_in_string/1,
- io_fread_newlines/1]).
+ io_fread_newlines/1, otp_8989/1]).
%-define(debug, true).
@@ -37,7 +38,7 @@
-define(t, test_server).
-define(privdir(_), "./io_SUITE_priv").
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(format(S, A), ok).
-define(privdir(Conf), ?config(priv_dir, Conf)).
-endif.
@@ -49,17 +50,35 @@
init_per_testcase(_Case, Config) ->
?line Dog = ?t:timetrap(?default_timeout),
[{watchdog, Dog} | Config].
-fin_per_testcase(_Case, _Config) ->
+end_per_testcase(_Case, _Config) ->
Dog = ?config(watchdog, _Config),
test_server:timetrap_cancel(Dog),
ok.
-all(doc) ->
- ["Test cases for io."];
-all(suite) ->
- [error_1,float_g,otp_5403,otp_5813,otp_6230,otp_6282,otp_6354,otp_6495,
- otp_6517,otp_6502,manpage,otp_6708,otp_7084,otp_7421,
- io_lib_collect_line_3_wb,cr_whitespace_in_string,io_fread_newlines].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [error_1, float_g, otp_5403, otp_5813, otp_6230,
+ otp_6282, otp_6354, otp_6495, otp_6517, otp_6502,
+ manpage, otp_6708, otp_7084, otp_7421,
+ io_lib_collect_line_3_wb, cr_whitespace_in_string,
+ io_fread_newlines, otp_8989].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
error_1(doc) ->
["Error cases for output"];
@@ -1898,3 +1917,81 @@ read_newlines(Fd, Acc, N0) ->
eof ->
{lists:reverse(Acc),N0}
end.
+
+
+
+otp_8989(doc) ->
+ "OTP-8989 io:format for ~F.Ps ignores P in some cases";
+otp_8989(Suite) when is_list(Suite) ->
+ Hello = "Hello",
+ ?line " Hello" = fmt("~6.6s", [Hello]),
+ ?line " Hello" = fmt("~*.6s", [6,Hello]),
+ ?line " Hello" = fmt("~6.*s", [6,Hello]),
+ ?line " Hello" = fmt("~*.*s", [6,6,Hello]),
+ %%
+ ?line " Hello" = fmt("~6.5s", [Hello]),
+ ?line " Hello" = fmt("~*.5s", [6,Hello]),
+ ?line " Hello" = fmt("~6.*s", [5,Hello]),
+ ?line " Hello" = fmt("~*.*s", [6,5,Hello]),
+ %%
+ ?line " Hell" = fmt("~6.4s", [Hello]),
+ ?line " Hell" = fmt("~*.4s", [6,Hello]),
+ ?line " Hell" = fmt("~6.*s", [4,Hello]),
+ ?line " Hell" = fmt("~*.*s", [6,4,Hello]),
+ %%
+ ?line "Hello" = fmt("~5.5s", [Hello]),
+ ?line "Hello" = fmt("~*.5s", [5,Hello]),
+ ?line "Hello" = fmt("~5.*s", [5,Hello]),
+ ?line "Hello" = fmt("~*.*s", [5,5,Hello]),
+ %%
+ ?line " Hell" = fmt("~5.4s", [Hello]),
+ ?line " Hell" = fmt("~*.4s", [5,Hello]),
+ ?line " Hell" = fmt("~5.*s", [4,Hello]),
+ ?line " Hell" = fmt("~*.*s", [5,4,Hello]),
+ %%
+ ?line "Hell" = fmt("~4.4s", [Hello]),
+ ?line "Hell" = fmt("~*.4s", [4,Hello]),
+ ?line "Hell" = fmt("~4.*s", [4,Hello]),
+ ?line "Hell" = fmt("~*.*s", [4,4,Hello]),
+ %%
+ ?line " Hel" = fmt("~4.3s", [Hello]),
+ ?line " Hel" = fmt("~*.3s", [4,Hello]),
+ ?line " Hel" = fmt("~4.*s", [3,Hello]),
+ ?line " Hel" = fmt("~*.*s", [4,3,Hello]),
+ %%
+ %%
+ ?line "Hello " = fmt("~-6.6s", [Hello]),
+ ?line "Hello " = fmt("~*.6s", [-6,Hello]),
+ ?line "Hello " = fmt("~-6.*s", [6,Hello]),
+ ?line "Hello " = fmt("~*.*s", [-6,6,Hello]),
+ %%
+ ?line "Hello " = fmt("~-6.5s", [Hello]),
+ ?line "Hello " = fmt("~*.5s", [-6,Hello]),
+ ?line "Hello " = fmt("~-6.*s", [5,Hello]),
+ ?line "Hello " = fmt("~*.*s", [-6,5,Hello]),
+ %%
+ ?line "Hell " = fmt("~-6.4s", [Hello]),
+ ?line "Hell " = fmt("~*.4s", [-6,Hello]),
+ ?line "Hell " = fmt("~-6.*s", [4,Hello]),
+ ?line "Hell " = fmt("~*.*s", [-6,4,Hello]),
+ %%
+ ?line "Hello" = fmt("~-5.5s", [Hello]),
+ ?line "Hello" = fmt("~*.5s", [-5,Hello]),
+ ?line "Hello" = fmt("~-5.*s", [5,Hello]),
+ ?line "Hello" = fmt("~*.*s", [-5,5,Hello]),
+ %%
+ ?line "Hell " = fmt("~-5.4s", [Hello]),
+ ?line "Hell " = fmt("~*.4s", [-5,Hello]),
+ ?line "Hell " = fmt("~-5.*s", [4,Hello]),
+ ?line "Hell " = fmt("~*.*s", [-5,4,Hello]),
+ %%
+ ?line "Hell" = fmt("~-4.4s", [Hello]),
+ ?line "Hell" = fmt("~*.4s", [-4,Hello]),
+ ?line "Hell" = fmt("~-4.*s", [4,Hello]),
+ ?line "Hell" = fmt("~*.*s", [-4,4,Hello]),
+ %%
+ ?line "Hel " = fmt("~-4.3s", [Hello]),
+ ?line "Hel " = fmt("~*.3s", [-4,Hello]),
+ ?line "Hel " = fmt("~-4.*s", [3,Hello]),
+ ?line "Hel " = fmt("~*.*s", [-4,3,Hello]),
+ ok.
diff --git a/lib/stdlib/test/io_proto_SUITE.erl b/lib/stdlib/test/io_proto_SUITE.erl
index d9672a8c7b..b69cd74edb 100644
--- a/lib/stdlib/test/io_proto_SUITE.erl
+++ b/lib/stdlib/test/io_proto_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
@@ -19,15 +19,19 @@
-module(io_proto_SUITE).
-compile(r12).
--export([all/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([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
--export([setopts_getopts/1,unicode_options/1,unicode_options_gen/1, binary_options/1, bc_with_r12/1,
- bc_with_r12_gl/1, read_modes_gl/1,bc_with_r12_ogl/1, read_modes_ogl/1, broken_unicode/1,eof_on_pipe/1,unicode_prompt/1]).
+-export([setopts_getopts/1,unicode_options/1,unicode_options_gen/1,
+ binary_options/1, bc_with_r12/1,
+ bc_with_r12_gl/1, read_modes_gl/1,bc_with_r12_ogl/1,
+ read_modes_ogl/1, broken_unicode/1,eof_on_pipe/1,unicode_prompt/1]).
--export([io_server_proxy/1,start_io_server_proxy/0, proxy_getall/1, proxy_setnext/2, proxy_quit/1]).
+-export([io_server_proxy/1,start_io_server_proxy/0, proxy_getall/1,
+ proxy_setnext/2, proxy_quit/1]).
%% For spawn
-export([toerl_server/3,hold_the_line/3,answering_machine1/3,
answering_machine2/3]).
@@ -42,7 +46,7 @@
-define(t, test_server).
-define(privdir(_), "./io_SUITE_priv").
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(privdir(Conf), ?config(priv_dir, Conf)).
-endif.
@@ -73,19 +77,36 @@ init_per_testcase(_Case, Config) ->
end,
os:putenv("TERM","vt100"),
[{watchdog, Dog}, {term, Term} | Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
Term = ?config(term,Config),
os:putenv("TERM",Term),
test_server:timetrap_cancel(Dog),
ok.
-all(doc) ->
- ["Test cases for the io_protocol."];
-all(suite) ->
- [setopts_getopts, unicode_options, unicode_options_gen, binary_options, bc_with_r12,
- bc_with_r12_gl,bc_with_r12_ogl, read_modes_gl, read_modes_ogl,
- broken_unicode,eof_on_pipe,unicode_prompt].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [setopts_getopts, unicode_options, unicode_options_gen,
+ binary_options, bc_with_r12, bc_with_r12_gl,
+ bc_with_r12_ogl, read_modes_gl, read_modes_ogl,
+ broken_unicode, eof_on_pipe, unicode_prompt].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
-record(state, {
diff --git a/lib/stdlib/test/lists_SUITE.erl b/lib/stdlib/test/lists_SUITE.erl
index 0089e874c8..b56f0b39d8 100644
--- a/lib/stdlib/test/lists_SUITE.erl
+++ b/lib/stdlib/test/lists_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -21,7 +21,7 @@
%%%-----------------------------------------------------------------
-module(lists_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
% Default timetrap timeout (set in init_per_testcase).
@@ -30,36 +30,37 @@
-define(default_timeout, ?t:minutes(4)).
% Test server specific exports
--export([all/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
% Test cases must be exported.
-export([member/1, reverse/1,
keymember/1, keysearch_keyfind/1,
keystore/1, keytake/1,
- append/1, append_1/1, append_2/1,
- seq/1, seq_loop/1, seq_2/1, seq_3/1, seq_2_e/1, seq_3_e/1,
- sublist/1, flatten/1,
+ append_1/1, append_2/1,
+ seq_loop/1, seq_2/1, seq_3/1, seq_2_e/1, seq_3_e/1,
+
sublist_2/1, sublist_3/1, sublist_2_e/1, sublist_3_e/1,
flatten_1/1, flatten_2/1, flatten_1_e/1, flatten_2_e/1,
dropwhile/1,
- sort/1, sort_1/1, sort_stable/1, merge/1, rmerge/1, sort_rand/1,
- usort/1, usort_1/1, usort_stable/1, umerge/1, rumerge/1,usort_rand/1,
+ sort_1/1, sort_stable/1, merge/1, rmerge/1, sort_rand/1,
+ usort_1/1, usort_stable/1, umerge/1, rumerge/1,usort_rand/1,
keymerge/1, rkeymerge/1,
- keysort/1, keysort_1/1, keysort_i/1, keysort_stable/1,
+ keysort_1/1, keysort_i/1, keysort_stable/1,
keysort_rand/1, keysort_error/1,
ukeymerge/1, rukeymerge/1,
- ukeysort/1, ukeysort_1/1, ukeysort_i/1, ukeysort_stable/1,
+ ukeysort_1/1, ukeysort_i/1, ukeysort_stable/1,
ukeysort_rand/1, ukeysort_error/1,
funmerge/1, rfunmerge/1,
- funsort/1, funsort_1/1, funsort_stable/1, funsort_rand/1,
+ funsort_1/1, funsort_stable/1, funsort_rand/1,
funsort_error/1,
ufunmerge/1, rufunmerge/1,
- ufunsort/1, ufunsort_1/1, ufunsort_stable/1, ufunsort_rand/1,
+ ufunsort_1/1, ufunsort_stable/1, ufunsort_rand/1,
ufunsort_error/1,
zip_unzip/1, zip_unzip3/1, zipwith/1, zipwith3/1,
filter_partition/1,
- tickets/1, otp_5939/1, otp_6023/1, otp_6606/1, otp_7230/1,
+ otp_5939/1, otp_6023/1, otp_6606/1, otp_7230/1,
suffix/1, subtract/1]).
%% Sort randomized lists until stopped.
@@ -76,21 +77,59 @@
%%
%% all/1
%%
-all(doc) ->
- [];
-all(suite) ->
- [append, reverse, member, keymember, keysearch_keyfind, keystore, keytake,
- dropwhile,
- sort, usort, keysort, ukeysort,
- funsort, ufunsort, sublist, flatten, seq,
- zip_unzip, zip_unzip3, zipwith, zipwith3,
- filter_partition, tickets, suffix, subtract].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, append}, reverse, member, keymember,
+ keysearch_keyfind, keystore, keytake, dropwhile, {group,sort},
+ {group, usort}, {group, keysort}, {group, ukeysort},
+ {group, funsort}, {group, ufunsort}, {group, sublist},
+ {group, flatten}, {group, seq}, zip_unzip, zip_unzip3,
+ zipwith, zipwith3, filter_partition, {group, tickets},
+ suffix, subtract].
+
+groups() ->
+ [{append, [], [append_1, append_2]},
+ {usort, [],
+ [umerge, rumerge, usort_1, usort_rand, usort_stable]},
+ {keysort, [],
+ [keymerge, rkeymerge, keysort_1, keysort_rand,
+ keysort_i, keysort_stable, keysort_error]},
+ {sort,[],[merge, rmerge, sort_1, sort_rand]},
+ {ukeysort, [],
+ [ukeymerge, rukeymerge, ukeysort_1, ukeysort_rand,
+ ukeysort_i, ukeysort_stable, ukeysort_error]},
+ {funsort, [],
+ [funmerge, rfunmerge, funsort_1, funsort_stable,
+ funsort_error, funsort_rand]},
+ {ufunsort, [],
+ [ufunmerge, rufunmerge, ufunsort_1, ufunsort_stable,
+ ufunsort_error, ufunsort_rand]},
+ {seq, [], [seq_loop, seq_2, seq_3, seq_2_e, seq_3_e]},
+ {sublist, [],
+ [sublist_2, sublist_3, sublist_2_e, sublist_3_e]},
+ {flatten, [],
+ [flatten_1, flatten_2, flatten_1_e, flatten_2_e]},
+ {tickets, [], [otp_5939, otp_6023, otp_6606, otp_7230]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Case, Config) ->
?line Dog=test_server:timetrap(?default_timeout),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
@@ -98,10 +137,6 @@ fin_per_testcase(_Case, Config) ->
%
% Test cases starts here.
%
-append(doc) ->
- ["Tests lists:append/1 & lists:append/2"];
-append(suite) ->
- [append_1, append_2].
append_1(doc) -> [];
append_1(suite) -> [];
@@ -346,12 +381,6 @@ keytake(Config) when is_list(Config) ->
?line false = lists:keytake(4, 2, L),
ok.
-sort(doc) ->
- ["Tests merge functions and lists:sort/1"];
-sort(suite) ->
- %% [merge, rmerge, sort_1, sort_rand, sort_stable].
- [merge, rmerge, sort_1, sort_rand].
-
merge(doc) -> ["merge functions"];
merge(suite) -> [];
merge(Config) when is_list(Config) ->
@@ -536,10 +565,6 @@ expl_pid([{I,F} | T], L) when is_function(F) ->
expl_pid([], L) ->
L.
-usort(doc) ->
- ["Tests unique merge functions and lists:usort/1"];
-usort(suite) ->
- [umerge, rumerge, usort_1, usort_rand, usort_stable].
usort_1(suite) -> [];
usort_1(doc) -> [""];
@@ -750,11 +775,6 @@ ucheck_stability(L) ->
U = lists:usort(L),
check_stab(L, U, S, "usort/1", "ukeysort/2").
-keysort(doc) ->
- ["Tests lists:keysort/2"];
-keysort(suite) ->
- [keymerge, rkeymerge,
- keysort_1, keysort_rand, keysort_i, keysort_stable, keysort_error].
keymerge(doc) -> ["Key merge two lists."];
keymerge(suite) -> [];
@@ -946,11 +966,6 @@ keycompare(I, J, A, B) when element(I, A) == element(I, B),
element(J, A) =< element(J, B) ->
ok.
-ukeysort(doc) ->
- ["Tests lists:ukeysort/2"];
-ukeysort(suite) ->
- [ukeymerge, rukeymerge,
- ukeysort_1, ukeysort_rand, ukeysort_i, ukeysort_stable, ukeysort_error].
ukeymerge(suite) -> [];
ukeymerge(doc) -> ["Merge two lists while removing duplicates."];
@@ -1240,11 +1255,6 @@ ukeycompare(I, J, A, B) when A =/= B,
ok.
-funsort(doc) ->
- ["Tests lists:sort/2"];
-funsort(suite) ->
- [funmerge, rfunmerge,
- funsort_1, funsort_stable, funsort_error, funsort_rand].
funmerge(doc) -> ["Merge two lists using a fun."];
funmerge(suite) -> [];
@@ -1377,11 +1387,6 @@ funsort_check(I, Input, Expected) ->
?line Expected = funsort(I, Input),
check_sorted(I, Input, Expected).
-ufunsort(doc) ->
- ["Tests lists:usort/2"];
-ufunsort(suite) ->
- [ufunmerge, rufunmerge,
- ufunsort_1, ufunsort_stable, ufunsort_error, ufunsort_rand].
ufunmerge(suite) -> [];
ufunmerge(doc) -> ["Merge two lists while removing duplicates using a fun."];
@@ -2076,12 +2081,6 @@ rkeymerge2_2(_I, T1, _E1, [], M, H1) ->
%%%------------------------------------------------------------
-seq(doc) ->
- ["Tests lists:seq/3"];
-seq(suite) ->
- [
- seq_loop,
- seq_2, seq_3, seq_2_e, seq_3_e].
seq_loop(doc) ->
["Test for infinite loop (OTP-2404)."];
@@ -2229,10 +2228,6 @@ property(From, To, Step) ->
%%%------------------------------------------------------------
-sublist(doc) ->
- ["Tests lists:sublist/[2,3]"];
-sublist(suite) ->
- [sublist_2, sublist_3, sublist_2_e, sublist_3_e].
-define(sublist_error2(X,Y), ?line {'EXIT', _} = (catch lists:sublist(X,Y))).
-define(sublist_error3(X,Y,Z), ?line {'EXIT', _} = (catch lists:sublist(X,Y,Z))).
@@ -2326,10 +2321,6 @@ sublist_3_e(Config) when is_list(Config) ->
%%%------------------------------------------------------------
-flatten(doc) ->
- ["Tests lists:flatten/[1,2]"];
-flatten(suite) ->
- [flatten_1, flatten_2, flatten_1_e, flatten_2_e].
-define(flatten_error1(X), ?line {'EXIT', _} = (catch lists:flatten(X))).
-define(flatten_error2(X,Y), ?line {'EXIT', _} = (catch lists:flatten(X,Y))).
@@ -2489,10 +2480,6 @@ filpart(F, All, Exp) ->
Other = lists:filter(fun(E) -> not F(E) end, All),
{Exp,Other} = lists:partition(F, All).
-tickets(doc) ->
- ["Ticktes."];
-tickets(suite) ->
- [otp_5939, otp_6023, otp_6606, otp_7230].
otp_5939(doc) -> ["OTP-5939. Guard tests added."];
otp_5939(suite) -> [];
diff --git a/lib/stdlib/test/log_mf_h_SUITE.erl b/lib/stdlib/test/log_mf_h_SUITE.erl
index 640261f665..2fd05afb11 100644
--- a/lib/stdlib/test/log_mf_h_SUITE.erl
+++ b/lib/stdlib/test/log_mf_h_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -18,12 +18,32 @@
%%
-module(log_mf_h_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("kernel/include/file.hrl").
--export([all/1, test/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, test/1]).
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [test].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) -> [test].
%%-----------------------------------------------------------------
diff --git a/lib/stdlib/test/ms_transform_SUITE.erl b/lib/stdlib/test/ms_transform_SUITE.erl
index 2d90d5b823..4e5df12798 100644
--- a/lib/stdlib/test/ms_transform_SUITE.erl
+++ b/lib/stdlib/test/ms_transform_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -19,9 +19,10 @@
-module(ms_transform_SUITE).
-author('[email protected]').
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/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([basic_ets/1]).
-export([basic_dbg/1]).
-export([from_shell/1]).
@@ -38,21 +39,40 @@
-export([float_1_function/1]).
-export([action_function/1]).
-export([warnings/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
init_per_testcase(_Func, Config) ->
Dog=test_server:timetrap(test_server:seconds(360)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Func, Config) ->
+end_per_testcase(_Func, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog).
-all(suite) -> [from_shell,basic_ets,basic_dbg,records,record_index,multipass,
- bitsyntax, record_defaults, andalso_orelse,
- float_1_function, action_function,
- warnings,
- top_match, old_guards, autoimported, semicolon].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [from_shell, basic_ets, basic_dbg, records,
+ record_index, multipass, bitsyntax, record_defaults,
+ andalso_orelse, float_1_function, action_function,
+ warnings, top_match, old_guards, autoimported,
+ semicolon].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% This may be subject to change
-define(WARN_NUMBER_SHADOW,50).
diff --git a/lib/stdlib/test/naughty_child.erl b/lib/stdlib/test/naughty_child.erl
index b56130929c..b939436bfc 100644
--- a/lib/stdlib/test/naughty_child.erl
+++ b/lib/stdlib/test/naughty_child.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2010. 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
diff --git a/lib/stdlib/test/proc_lib_SUITE.erl b/lib/stdlib/test/proc_lib_SUITE.erl
index 2fd7725335..1565aa9bba 100644
--- a/lib/stdlib/test/proc_lib_SUITE.erl
+++ b/lib/stdlib/test/proc_lib_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -23,10 +23,12 @@
%%
%%-define(STANDALONE,1).
--export([all/1, crash/1, sync_start/1, sync_start_nolink/1, sync_start_link/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
+ crash/1, sync_start_nolink/1, sync_start_link/1,
spawn_opt/1, sp1/0, sp2/0, sp3/1, sp4/2, sp5/1,
hibernate/1]).
--export([tickets/1, otp_6345/1]).
+-export([ otp_6345/1]).
-export([hib_loop/1, awaken/1]).
@@ -40,12 +42,32 @@
-ifdef(STANDALONE).
-define(line, noop, ).
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-endif.
-all(suite) -> [crash, sync_start, spawn_opt, hibernate, tickets].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [crash, {group, sync_start}, spawn_opt, hibernate,
+ {group, tickets}].
+
+groups() ->
+ [{tickets, [], [otp_6345]},
+ {sync_start, [], [sync_start_nolink, sync_start_link]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
-tickets(suite) -> [otp_6345].
%%-----------------------------------------------------------------
%% We don't have to test that spwn and spawn_link actually spawns
@@ -127,7 +149,6 @@ crash(Config) when is_list(Config) ->
ok
end.
-sync_start(suite) -> [sync_start_nolink, sync_start_link].
sync_start_nolink(Config) when is_list(Config) ->
_Pid = spawn_link(?MODULE, sp5, [self()]),
diff --git a/lib/stdlib/test/qlc_SUITE.erl b/lib/stdlib/test/qlc_SUITE.erl
index e21de8770a..98eeaee118 100644
--- a/lib/stdlib/test/qlc_SUITE.erl
+++ b/lib/stdlib/test/qlc_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -43,7 +43,7 @@
-define(testcase, current_testcase). % don't know
-define(t, test_server).
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(datadir, ?config(data_dir, Config)).
-define(privdir, ?config(priv_dir, Config)).
-define(testcase, ?config(?TESTCASE, Config)).
@@ -51,36 +51,33 @@
-include_lib("stdlib/include/ms_transform.hrl").
--export([all/1, init_per_testcase/2, fin_per_testcase/2]).
+-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([parse_transform/1,
- badarg/1, nested_qlc/1, unused_var/1, lc/1, fun_clauses/1,
- filter_var/1, single/1, exported_var/1, generator_vars/1,
- nomatch/1, errors/1, pattern/1,
+-export([
+ badarg/1, nested_qlc/1, unused_var/1, lc/1, fun_clauses/1,
+ filter_var/1, single/1, exported_var/1, generator_vars/1,
+ nomatch/1, errors/1, pattern/1,
- evaluation/1,
- eval/1, cursor/1, fold/1, eval_unique/1, eval_cache/1, append/1,
- evaluator/1, string_to_handle/1, table/1, process_dies/1,
- sort/1, keysort/1, filesort/1, cache/1, cache_list/1, filter/1,
- info/1, nested_info/1, lookup1/1, lookup2/1, lookup_rec/1,
- indices/1, pre_fun/1, skip_filters/1,
+ eval/1, cursor/1, fold/1, eval_unique/1, eval_cache/1, append/1,
+ evaluator/1, string_to_handle/1, table/1, process_dies/1,
+ sort/1, keysort/1, filesort/1, cache/1, cache_list/1, filter/1,
+ info/1, nested_info/1, lookup1/1, lookup2/1, lookup_rec/1,
+ indices/1, pre_fun/1, skip_filters/1,
- table_impls/1,
- ets/1, dets/1,
+ ets/1, dets/1,
- join/1,
- join_option/1, join_filter/1, join_lookup/1, join_merge/1,
- join_sort/1, join_complex/1,
+ join_option/1, join_filter/1, join_lookup/1, join_merge/1,
+ join_sort/1, join_complex/1,
- tickets/1,
- otp_5644/1, otp_5195/1, otp_6038_bug/1, otp_6359/1, otp_6562/1,
- otp_6590/1, otp_6673/1, otp_6964/1, otp_7114/1, otp_7238/1,
- otp_7232/1, otp_7552/1, otp_6674/1, otp_7714/1,
+ otp_5644/1, otp_5195/1, otp_6038_bug/1, otp_6359/1, otp_6562/1,
+ otp_6590/1, otp_6673/1, otp_6964/1, otp_7114/1, otp_7238/1,
+ otp_7232/1, otp_7552/1, otp_6674/1, otp_7714/1,
- manpage/1,
+ manpage/1,
- compat/1,
- backward/1, forward/1]).
+ backward/1, forward/1]).
%% Internal exports.
-export([bad_table_throw/1, bad_table_exit/1, default_table/1, bad_table/1,
@@ -114,17 +111,50 @@ init_per_testcase(Case, Config) ->
?line Dog = ?t:timetrap(?default_timeout),
[{?TESTCASE, Case}, {watchdog, Dog} | Config].
-fin_per_testcase(_Case, _Config) ->
+end_per_testcase(_Case, _Config) ->
Dog = ?config(watchdog, _Config),
test_server:timetrap_cancel(Dog),
ok.
-all(suite) ->
- [parse_transform, evaluation, table_impls, join, tickets, manpage, compat].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, parse_transform}, {group, evaluation},
+ {group, table_impls}, {group, join}, {group, tickets},
+ manpage, {group, compat}].
+
+groups() ->
+ [{parse_transform, [],
+ [badarg, nested_qlc, unused_var, lc, fun_clauses,
+ filter_var, single, exported_var, generator_vars,
+ nomatch, errors, pattern]},
+ {evaluation, [],
+ [eval, cursor, fold, eval_unique, eval_cache, append,
+ evaluator, string_to_handle, table, process_dies, sort,
+ keysort, filesort, cache, cache_list, filter, info,
+ nested_info, lookup1, lookup2, lookup_rec, indices,
+ pre_fun, skip_filters]},
+ {table_impls, [], [ets, dets]},
+ {join, [],
+ [join_option, join_filter, join_lookup, join_merge,
+ join_sort, join_complex]},
+ {tickets, [],
+ [otp_5644, otp_5195, otp_6038_bug, otp_6359, otp_6562,
+ otp_6590, otp_6673, otp_6964, otp_7114, otp_7232,
+ otp_7238, otp_7552, otp_6674, otp_7714]},
+ {compat, [], [backward, forward]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
-parse_transform(suite) ->
- [badarg, nested_qlc, unused_var, lc, fun_clauses, filter_var,
- single, exported_var, generator_vars, nomatch, errors, pattern].
+end_per_group(_GroupName, Config) ->
+ Config.
badarg(doc) ->
"Badarg.";
@@ -461,11 +491,6 @@ pattern(Config) when is_list(Config) ->
-record(k, {t,v}).\n">>, Ts),
ok.
-evaluation(suite) ->
- [eval, cursor, fold, eval_unique, eval_cache, append, evaluator,
- string_to_handle, table, process_dies, sort, keysort, filesort, cache,
- cache_list, filter, info, nested_info, lookup1, lookup2, lookup_rec,
- indices, pre_fun, skip_filters].
eval(doc) ->
"eval/2";
@@ -4297,8 +4322,6 @@ skip_filters(Config) when is_list(Config) ->
ok.
-table_impls(suite) ->
- [ets, dets].
ets(doc) ->
"ets:table/1,2.";
@@ -4445,9 +4468,6 @@ dets(Config) when is_list(Config) ->
_ = file:delete(Fname),
ok.
-join(suite) ->
- [join_option, join_filter, join_lookup, join_merge,
- join_sort, join_complex].
join_option(doc) ->
"The 'join' option (any, lookup, merge, nested_loop). Also cache/unique.";
@@ -5729,10 +5749,6 @@ join_complex(Config) when is_list(Config) ->
ok.
-tickets(suite) ->
- [otp_5644, otp_5195, otp_6038_bug, otp_6359, otp_6562, otp_6590,
- otp_6673, otp_6964, otp_7114, otp_7232, otp_7238, otp_7552, otp_6674,
- otp_7714].
otp_5644(doc) ->
"OTP-5644. Handle the new language element M:F/A.";
@@ -7378,8 +7394,6 @@ gb_iter(I0, N, EFun) ->
end.
">>.
-compat(suite) ->
- [backward, forward].
backward(doc) ->
"OTP-6674. Join info and extra constants.";
diff --git a/lib/stdlib/test/queue_SUITE.erl b/lib/stdlib/test/queue_SUITE.erl
index 2cd6b52311..3d3152919a 100644
--- a/lib/stdlib/test/queue_SUITE.erl
+++ b/lib/stdlib/test/queue_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2011. 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
@@ -17,13 +17,14 @@
%% %CopyrightEnd%
%%
-module(queue_SUITE).
--export([all/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([do/1, to_list/1, io_test/1, op_test/1, error/1, oops/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
% Default timetrap timeout (set in init_per_testcase).
-define(default_timeout, ?t:minutes(1)).
@@ -31,16 +32,32 @@
init_per_testcase(_Case, Config) ->
?line Dog = ?t:timetrap(?default_timeout),
[{watchdog, Dog} | Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-all(doc) ->
- ["Test cases for queue."];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[do, to_list, io_test, op_test, error, oops].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
do(doc) ->
[""];
do(suite) ->
diff --git a/lib/stdlib/test/random_SUITE.erl b/lib/stdlib/test/random_SUITE.erl
index 8f1c304705..ac9d1a6c06 100644
--- a/lib/stdlib/test/random_SUITE.erl
+++ b/lib/stdlib/test/random_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -17,13 +17,14 @@
%% %CopyrightEnd%
-module(random_SUITE).
--export([all/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([interval_1/1, seed0/1, seed/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
% Default timetrap timeout (set in init_per_testcase).
-define(default_timeout, ?t:minutes(1)).
@@ -31,16 +32,32 @@
init_per_testcase(_Case, Config) ->
?line Dog = ?t:timetrap(?default_timeout),
[{watchdog, Dog} | Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-all(doc) ->
- ["Test cases for random."];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[interval_1, seed0, seed].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
seed0(doc) ->
["Test that seed is set implicitly, and always the same."];
seed0(suite) ->
diff --git a/lib/stdlib/test/random_iolist.erl b/lib/stdlib/test/random_iolist.erl
index 4bce347d9a..8f21b5a3b3 100644
--- a/lib/stdlib/test/random_iolist.erl
+++ b/lib/stdlib/test/random_iolist.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2010. 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
diff --git a/lib/stdlib/test/random_unicode_list.erl b/lib/stdlib/test/random_unicode_list.erl
index 3e83383b08..b8bd719b89 100644
--- a/lib/stdlib/test/random_unicode_list.erl
+++ b/lib/stdlib/test/random_unicode_list.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2010. 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
diff --git a/lib/stdlib/test/re_SUITE.erl b/lib/stdlib/test/re_SUITE.erl
index 46a84d4e24..c4817c0d38 100644
--- a/lib/stdlib/test/re_SUITE.erl
+++ b/lib/stdlib/test/re_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -18,12 +18,41 @@
%%
-module(re_SUITE).
--export([all/1, pcre/1,compile_options/1,run_options/1,combined_options/1,replace_autogen/1,global_capture/1,replace_input_types/1,replace_return/1,split_autogen/1,split_options/1,split_specials/1,error_handling/1,pcre_cve_2008_2371/1,pcre_compile_workspace_overflow/1,re_infinite_loop/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, pcre/1,compile_options/1,
+ run_options/1,combined_options/1,replace_autogen/1,
+ global_capture/1,replace_input_types/1,replace_return/1,
+ split_autogen/1,split_options/1,split_specials/1,
+ error_handling/1,pcre_cve_2008_2371/1,
+ pcre_compile_workspace_overflow/1,re_infinite_loop/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("kernel/include/file.hrl").
-all(suite) -> [pcre,compile_options,run_options,combined_options,replace_autogen,global_capture,replace_input_types,replace_return,split_autogen,split_options,split_specials,error_handling,pcre_cve_2008_2371,pcre_compile_workspace_overflow,re_infinite_loop].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [pcre, compile_options, run_options, combined_options,
+ replace_autogen, global_capture, replace_input_types,
+ replace_return, split_autogen, split_options,
+ split_specials, error_handling, pcre_cve_2008_2371,
+ pcre_compile_workspace_overflow, re_infinite_loop].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
pcre(doc) ->
["Run all applicable tests from the PCRE testsuites."];
diff --git a/lib/stdlib/test/select_SUITE.erl b/lib/stdlib/test/select_SUITE.erl
index 6900f1a8f5..546c25f954 100644
--- a/lib/stdlib/test/select_SUITE.erl
+++ b/lib/stdlib/test/select_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -37,7 +37,7 @@
-export([config/2]).
-define(fmt(A,B),io:format(A,B)).
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(fmt(A,B),test_server:format(A,B)).
-endif.
@@ -58,23 +58,41 @@ config(priv_dir,_) ->
".".
-else.
%% When run in test server.
--export([all/1,select_test/1,init_per_testcase/2, fin_per_testcase/2,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,select_test/1,
+ init_per_testcase/2, end_per_testcase/2,
return_values/1]).
init_per_testcase(_Case, Config) when is_list(Config) ->
?line Dog=test_server:timetrap(test_server:seconds(1200)),
[{watchdog, Dog}|Config].
-
-fin_per_testcase(_Case, Config) ->
+
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-all(doc) ->
- ["Test ets:select"];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[return_values, select_test].
-
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
select_test(suite) ->
[];
select_test(doc) ->
diff --git a/lib/stdlib/test/sets_SUITE.erl b/lib/stdlib/test/sets_SUITE.erl
index c9f1a03598..f284276bd7 100644
--- a/lib/stdlib/test/sets_SUITE.erl
+++ b/lib/stdlib/test/sets_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -22,13 +22,15 @@
-module(sets_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2,
+-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,
create/1,add_element/1,del_element/1,
subtract/1,intersection/1,union/1,is_subset/1,
is_set/1,fold/1,filter/1,
take_smallest/1,take_largest/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-import(lists, [foldl/3,reverse/1]).
@@ -36,15 +38,33 @@ init_per_testcase(_Case, Config) ->
?line Dog = ?t:timetrap(?t:minutes(5)),
[{watchdog,Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
-all(suite) ->
- [create,add_element,del_element,subtract,
- intersection,union,is_subset,is_set,fold,filter,
- take_smallest,take_largest].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [create, add_element, del_element, subtract,
+ intersection, union, is_subset, is_set, fold, filter,
+ take_smallest, take_largest].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
create(Config) when is_list(Config) ->
test_all(fun create_1/1).
diff --git a/lib/stdlib/test/sets_test_lib.erl b/lib/stdlib/test/sets_test_lib.erl
index 6b6fb00550..bdfb0d59d2 100644
--- a/lib/stdlib/test/sets_test_lib.erl
+++ b/lib/stdlib/test/sets_test_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2010. 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
diff --git a/lib/stdlib/test/shell_SUITE.erl b/lib/stdlib/test/shell_SUITE.erl
index 588342d46a..8273377ba1 100644
--- a/lib/stdlib/test/shell_SUITE.erl
+++ b/lib/stdlib/test/shell_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -17,21 +17,22 @@
%% %CopyrightEnd%
%%
-module(shell_SUITE).
--export([all/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([forget/1, records/1, known_bugs/1, otp_5226/1, otp_5327/1,
- otp_5435/1, otp_5195/1, otp_5915/1, otp_5916/1,
- bits/1, bs_match_misc_SUITE/1, bs_match_int_SUITE/1,
- bs_match_tail_SUITE/1, bs_match_bin_SUITE/1,
- bs_construct_SUITE/1,
- refman/1, refman_bit_syntax/1,
- progex/1, progex_bit_syntax/1, progex_records/1,
- progex_lc/1, progex_funs/1,
- tickets/1, otp_5990/1, otp_6166/1, otp_6554/1, otp_6785/1,
- otp_7184/1, otp_7232/1, otp_8393/1]).
-
--export([restricted/1, start_restricted_from_shell/1,
- start_restricted_on_command_line/1,restricted_local/1]).
+ otp_5435/1, otp_5195/1, otp_5915/1, otp_5916/1,
+ bs_match_misc_SUITE/1, bs_match_int_SUITE/1,
+ bs_match_tail_SUITE/1, bs_match_bin_SUITE/1,
+ bs_construct_SUITE/1,
+ refman_bit_syntax/1,
+ progex_bit_syntax/1, progex_records/1,
+ progex_lc/1, progex_funs/1,
+ otp_5990/1, otp_6166/1, otp_6554/1, otp_6785/1,
+ otp_7184/1, otp_7232/1, otp_8393/1]).
+
+-export([ start_restricted_from_shell/1,
+ start_restricted_on_command_line/1,restricted_local/1]).
%% Internal export.
-export([otp_5435_2/0, prompt1/1, prompt2/1, prompt3/1, prompt4/1,
@@ -50,8 +51,8 @@
config(priv_dir,_) ->
".".
-else.
--include("test_server.hrl").
--export([init_per_testcase/2, fin_per_testcase/2]).
+-include_lib("test_server/include/test_server.hrl").
+-export([init_per_testcase/2, end_per_testcase/2]).
% Default timetrap timeout (set in init_per_testcase).
-define(default_timeout, ?t:minutes(2)).
init_per_testcase(_Case, Config) ->
@@ -60,7 +61,7 @@ init_per_testcase(_Case, Config) ->
?line code:add_patha(?config(priv_dir,Config)),
[{orig_path,OrigPath}, {watchdog, Dog} | Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
?line Dog = ?config(watchdog, Config),
?line test_server:timetrap_cancel(Dog),
?line OrigPath = ?config(orig_path,Config),
@@ -71,18 +72,44 @@ fin_per_testcase(_Case, Config) ->
ok.
-endif.
-all(doc) ->
- ["Test cases for the 'shell' module."];
-all(suite) ->
- [forget, records, known_bugs, otp_5226, otp_5327, otp_5435, otp_5195,
- otp_5915, otp_5916, bits, refman, progex, tickets, restricted].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [forget, records, known_bugs, otp_5226, otp_5327,
+ otp_5435, otp_5195, otp_5915, otp_5916, {group, bits},
+ {group, refman}, {group, progex}, {group, tickets},
+ {group, restricted}].
+
+groups() ->
+ [{restricted, [],
+ [start_restricted_from_shell,
+ start_restricted_on_command_line, restricted_local]},
+ {bits, [],
+ [bs_match_misc_SUITE, bs_match_tail_SUITE,
+ bs_match_bin_SUITE, bs_construct_SUITE]},
+ {refman, [], [refman_bit_syntax]},
+ {progex, [],
+ [progex_bit_syntax, progex_records, progex_lc,
+ progex_funs]},
+ {tickets, [],
+ [otp_5990, otp_6166, otp_6554, otp_6785, otp_7184,
+ otp_7232, otp_8393]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
-record(state, {bin, reply, leader}).
-restricted(doc) ->
- ["Test restricted_shell"];
-restricted(suite) ->
- [start_restricted_from_shell,start_restricted_on_command_line,restricted_local].
start_restricted_from_shell(doc) ->
["Test that a restricted shell can be started from the normal shell"];
@@ -797,9 +824,6 @@ otp_5916(Config) when is_list(Config) ->
[ok] = scan(C),
ok.
-bits(suite) ->
- [bs_match_misc_SUITE, % bs_match_int_SUITE/,
- bs_match_tail_SUITE, bs_match_bin_SUITE, bs_construct_SUITE].
bs_match_misc_SUITE(doc) ->
["OTP-5327. Adopted from parts of emulator/test/bs_match_misc_SUITE.erl."];
@@ -1520,8 +1544,6 @@ evaluate(Str, Vars) ->
Result
end.
-refman(suite) ->
- [refman_bit_syntax].
refman_bit_syntax(doc) ->
["Bit syntax examples from the Reference Manual. OTP-5237."];
@@ -1564,8 +1586,6 @@ refman_bit_syntax(Config) when is_list(Config) ->
?line <<2,4,6>> = << << (X*2) >> || <<X>> <= << 1,2,3 >> >>,
ok.
-progex(suite) ->
- [progex_bit_syntax, progex_records, progex_lc, progex_funs].
-define(IP_VERSION, 4).
-define(IP_MIN_HDR_LEN, 5).
@@ -2256,8 +2276,6 @@ progex_funs(Config) when is_list(Config) ->
?line [ok] = scan(Test2_shell),
ok.
-tickets(suite) ->
- [otp_5990, otp_6166, otp_6554, otp_6785, otp_7184, otp_7232, otp_8393].
otp_5990(doc) ->
"OTP-5990. {erlang,is_record}.";
diff --git a/lib/stdlib/test/slave_SUITE.erl b/lib/stdlib/test/slave_SUITE.erl
index 5c1282fe9b..37fc694083 100644
--- a/lib/stdlib/test/slave_SUITE.erl
+++ b/lib/stdlib/test/slave_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -18,18 +18,37 @@
%%
-module(slave_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1, t_start/1, t_start_link/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, t_start/1, t_start_link/1,
start_link_nodedown/1, errors/1]).
%% Internal exports.
-export([fun_init/1, test_errors/1]).
-export([timeout_test/1, auth_test/1, rsh_test/1, start_a_slave/3]).
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[t_start_link, start_link_nodedown, t_start, errors].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
t_start_link(suite) -> [];
t_start_link(Config) when is_list(Config) ->
?line Dog = test_server:timetrap(test_server:seconds(20)),
diff --git a/lib/stdlib/test/sofs_SUITE.erl b/lib/stdlib/test/sofs_SUITE.erl
index d60cfc6895..01de1f0600 100644
--- a/lib/stdlib/test/sofs_SUITE.erl
+++ b/lib/stdlib/test/sofs_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -26,13 +26,14 @@
-define(config(X,Y), foo).
-define(t, test_server).
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(format(S, A), ok).
-endif.
--export([all/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([sofs/1, from_term_1/1, set_1/1, from_sets_1/1, relation_1/1,
+-export([ from_term_1/1, set_1/1, from_sets_1/1, relation_1/1,
a_function_1/1, family_1/1, projection/1,
relation_to_family_1/1, domain_1/1, range_1/1, image/1,
inverse_image/1, inverse_1/1, converse_1/1, no_elements_1/1,
@@ -47,7 +48,7 @@
multiple_relative_product/1, digraph/1, constant_function/1,
misc/1]).
--export([sofs_family/1, family_specification/1,
+-export([ family_specification/1,
family_domain_1/1, family_range_1/1,
family_to_relation_1/1,
union_of_family_1/1, intersection_of_family_1/1,
@@ -81,18 +82,56 @@
union/1, union/2, family_to_digraph/1, family_to_digraph/2,
digraph_to_family/1, digraph_to_family/2]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
-compile({inline,[{eval,2}]}).
-all(suite) ->
- [sofs, sofs_family].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, sofs}, {group, sofs_family}].
+
+groups() ->
+ [{sofs, [],
+ [from_term_1, set_1, from_sets_1, relation_1,
+ a_function_1, family_1, relation_to_family_1, domain_1,
+ range_1, image, inverse_image, inverse_1, converse_1,
+ no_elements_1, substitution, restriction, drestriction,
+ projection, strict_relation_1, extension,
+ weak_relation_1, to_sets_1, specification, union_1,
+ intersection_1, difference, symdiff,
+ symmetric_partition, is_sofs_set_1, is_set_1, is_equal,
+ is_subset, is_a_function_1, is_disjoint, join,
+ canonical, composite_1, relative_product_1,
+ relative_product_2, product_1, partition_1, partition_3,
+ multiple_relative_product, digraph, constant_function,
+ misc]},
+ {sofs_family, [],
+ [family_specification, family_domain_1, family_range_1,
+ family_to_relation_1, union_of_family_1,
+ intersection_of_family_1, family_projection,
+ family_difference, family_intersection_1,
+ family_intersection_2, family_union_1, family_union_2,
+ partition_family]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Case, Config) ->
Dog=?t:timetrap(?t:minutes(2)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
@@ -100,18 +139,6 @@ fin_per_testcase(_Case, Config) ->
%% [{2,b},{1,a,b}] == lists:sort([{2,b},{1,a,b}])
%% [{1,a,b},{2,b}] == lists:keysort(1,[{2,b},{1,a,b}])
-sofs(suite) ->
- [from_term_1, set_1, from_sets_1, relation_1, a_function_1,
- family_1, relation_to_family_1, domain_1, range_1, image,
- inverse_image, inverse_1, converse_1, no_elements_1,
- substitution, restriction, drestriction, projection,
- strict_relation_1, extension, weak_relation_1, to_sets_1,
- specification, union_1, intersection_1, difference, symdiff,
- symmetric_partition, is_sofs_set_1, is_set_1, is_equal,
- is_subset, is_a_function_1, is_disjoint, join, canonical,
- composite_1, relative_product_1, relative_product_2, product_1,
- partition_1, partition_3, multiple_relative_product, digraph,
- constant_function, misc].
from_term_1(suite) -> [];
from_term_1(doc) -> [""];
@@ -1934,12 +1961,6 @@ relational_restriction(R) ->
Fun = fun(S) -> no_elements(S) > 1 end,
family_to_relation(family_specification(Fun, relation_to_family(R))).
-sofs_family(suite) ->
- [family_specification, family_domain_1, family_range_1,
- family_to_relation_1, union_of_family_1, intersection_of_family_1,
- family_projection, family_difference,
- family_intersection_1, family_intersection_2,
- family_union_1, family_union_2, partition_family].
family_specification(suite) -> [];
family_specification(doc) -> [""];
diff --git a/lib/stdlib/test/stdlib.cover b/lib/stdlib/test/stdlib.cover
index b98d949889..61f4f064b9 100644
--- a/lib/stdlib/test/stdlib.cover
+++ b/lib/stdlib/test/stdlib.cover
@@ -1,10 +1,17 @@
%% -*- erlang -*-
-{exclude,
- [erl_parse,
- ets,
- filename,
- gen_event,
- gen_server,
- gen,
- lists,
- proc_lib]}.
+{incl_app,stdlib,details}.
+
+{excl_mods,stdlib,
+ [erl_parse,
+ erl_eval,
+ ets,
+ filename,
+ gen_event,
+ gen_server,
+ gen,
+ lists,
+ io,
+ io_lib,
+ io_lib_format,
+ io_lib_pretty,
+ proc_lib]}.
diff --git a/lib/stdlib/test/stdlib.spec b/lib/stdlib/test/stdlib.spec
index bbfb43bd15..3768e494b2 100644
--- a/lib/stdlib/test/stdlib.spec
+++ b/lib/stdlib/test/stdlib.spec
@@ -1,4 +1 @@
-{topcase, {dir, "../stdlib_test"}}.
-%{skip,{dets_SUITE,open_file_1,"Crashes Windows tests"}}.
-%{skip,{dets_SUITE,fold,"Crashes Windows tests"}}.
-%{skip,{dets_SUITE,match,"Crashes Windows tests"}}.
+{suites,"../stdlib_test",all}.
diff --git a/lib/stdlib/test/stdlib_SUITE.erl b/lib/stdlib/test/stdlib_SUITE.erl
index d46a2caf90..0cca030b3d 100644
--- a/lib/stdlib/test/stdlib_SUITE.erl
+++ b/lib/stdlib/test/stdlib_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -20,7 +20,7 @@
%%% Purpose:Stdlib application test suite.
%%%-----------------------------------------------------------------
-module(stdlib_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
% Default timetrap timeout (set in init_per_testcase).
@@ -28,8 +28,9 @@
-define(application, stdlib).
% Test server specific exports
--export([all/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
% Test cases must be exported.
-export([app_test/1]).
@@ -38,15 +39,31 @@
%%
%% all/1
%%
-all(doc) ->
- [];
-all(suite) ->
- [?cases].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [app_test].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Case, Config) ->
?line Dog=test_server:timetrap(?default_timeout),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
@@ -58,7 +75,7 @@ app_test(suite) ->
[];
app_test(doc) ->
["Application consistency test."];
-app_test(Config) when list(Config) ->
+app_test(Config) when is_list(Config) ->
?t:app_test(stdlib),
ok.
diff --git a/lib/stdlib/test/string_SUITE.erl b/lib/stdlib/test/string_SUITE.erl
index 452e048dd7..1dcd4be21e 100644
--- a/lib/stdlib/test/string_SUITE.erl
+++ b/lib/stdlib/test/string_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -20,15 +20,16 @@
%%% Purpose: string test suite.
%%%-----------------------------------------------------------------
-module(string_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
% Default timetrap timeout (set in init_per_testcase).
-define(default_timeout, ?t:minutes(1)).
% Test server specific exports
--export([all/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
% Test cases must be exported.
-export([len/1,equal/1,concat/1,chr_rchr/1,str_rstr/1]).
@@ -40,19 +41,34 @@
%%
%% all/1
%%
-all(doc) ->
- [];
-all(suite) ->
- [len,equal,concat,chr_rchr,str_rstr,
- span_cspan,substr,tokens,chars,
- copies,words,strip,sub_word,left_right,
- sub_string,centre, join,
- to_integer,to_float,to_upper_to_lower].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [len, equal, concat, chr_rchr, str_rstr, span_cspan,
+ substr, tokens, chars, copies, words, strip, sub_word,
+ left_right, sub_string, centre, join, to_integer,
+ to_float, to_upper_to_lower].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_Case, Config) ->
?line Dog=test_server:timetrap(?default_timeout),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/stdlib/test/supervisor_1.erl b/lib/stdlib/test/supervisor_1.erl
index 297550b230..3198be0fed 100644
--- a/lib/stdlib/test/supervisor_1.erl
+++ b/lib/stdlib/test/supervisor_1.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2010. 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
diff --git a/lib/stdlib/test/supervisor_SUITE.erl b/lib/stdlib/test/supervisor_SUITE.erl
index 039ea298c4..c79a5002fb 100644
--- a/lib/stdlib/test/supervisor_SUITE.erl
+++ b/lib/stdlib/test/supervisor_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -20,51 +20,114 @@
-module(supervisor_SUITE).
--include("test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
+-define(TIMEOUT, 1000).
%% Testserver specific export
--export([all/1]).
+-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]).
-%% Indirect spawn export
--export([init/1]).
+%% Internal export
+-export([init/1, terminate_all_children/1]).
%% API tests
--export([sup_start/1, sup_start_normal/1, sup_start_ignore_init/1,
- sup_start_ignore_child/1, sup_start_error_return/1,
- sup_start_fail/1, sup_stop/1, sup_stop_infinity/1,
- sup_stop_timeout/1, sup_stop_brutal_kill/1, child_adm/1,
- child_adm_simple/1, child_specs/1, extra_return/1]).
+-export([ sup_start_normal/1, sup_start_ignore_init/1,
+ sup_start_ignore_child/1, sup_start_error_return/1,
+ sup_start_fail/1, sup_stop_infinity/1,
+ sup_stop_timeout/1, sup_stop_brutal_kill/1, child_adm/1,
+ child_adm_simple/1, child_specs/1, extra_return/1]).
%% Tests concept permanent, transient and temporary
--export([normal_termination/1, permanent_normal/1, transient_normal/1,
- temporary_normal/1, abnormal_termination/1,
- permanent_abnormal/1, transient_abnormal/1,
- temporary_abnormal/1]).
+-export([ permanent_normal/1, transient_normal/1,
+ temporary_normal/1,
+ permanent_abnormal/1, transient_abnormal/1,
+ temporary_abnormal/1]).
%% Restart strategy tests
--export([restart_one_for_one/1, one_for_one/1,
- one_for_one_escalation/1, restart_one_for_all/1, one_for_all/1,
- one_for_all_escalation/1, restart_simple_one_for_one/1,
- simple_one_for_one/1, simple_one_for_one_escalation/1,
- restart_rest_for_one/1, rest_for_one/1, rest_for_one_escalation/1,
- simple_one_for_one_extra/1]).
+-export([ one_for_one/1,
+ one_for_one_escalation/1, one_for_all/1,
+ one_for_all_escalation/1,
+ simple_one_for_one/1, simple_one_for_one_escalation/1,
+ rest_for_one/1, rest_for_one_escalation/1,
+ simple_one_for_one_extra/1]).
%% Misc tests
--export([child_unlink/1, tree/1, count_children_memory/1]).
+-export([child_unlink/1, tree/1, count_children_memory/1,
+ do_not_save_start_parameters_for_temporary_children/1,
+ do_not_save_child_specs_for_temporary_children/1,
+ simple_one_for_one_scale_many_temporary_children/1]).
+
+%%-------------------------------------------------------------------------
+
+suite() ->
+ [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, sup_start}, {group, sup_stop}, child_adm,
+ child_adm_simple, extra_return, child_specs,
+ {group, restart_one_for_one},
+ {group, restart_one_for_all},
+ {group, restart_simple_one_for_one},
+ {group, restart_rest_for_one},
+ {group, normal_termination},
+ {group, abnormal_termination}, child_unlink, tree,
+ count_children_memory, do_not_save_start_parameters_for_temporary_children,
+ do_not_save_child_specs_for_temporary_children,
+ simple_one_for_one_scale_many_temporary_children].
+
+groups() ->
+ [{sup_start, [],
+ [sup_start_normal, sup_start_ignore_init,
+ sup_start_ignore_child, sup_start_error_return,
+ sup_start_fail]},
+ {sup_stop, [],
+ [sup_stop_infinity, sup_stop_timeout,
+ sup_stop_brutal_kill]},
+ {normal_termination, [],
+ [permanent_normal, transient_normal, temporary_normal]},
+ {abnormal_termination, [],
+ [permanent_abnormal, transient_abnormal,
+ temporary_abnormal]},
+ {restart_one_for_one, [],
+ [one_for_one, one_for_one_escalation]},
+ {restart_one_for_all, [],
+ [one_for_all, one_for_all_escalation]},
+ {restart_simple_one_for_one, [],
+ [simple_one_for_one, simple_one_for_one_extra,
+ simple_one_for_one_escalation]},
+ {restart_rest_for_one, [],
+ [rest_for_one, rest_for_one_escalation]}].
+
+init_per_suite(Config0) ->
+ Config = lists:keydelete(watchdog, 1, Config0),
+ Dog = test_server:timetrap(?TIMEOUT),
+ [{watchdog, Dog} | Config].
+
+end_per_suite(_Config) ->
+ ok.
-%-------------------------------------------------------------------------
+init_per_group(_GroupName, Config) ->
+ Config.
-all(suite) ->
- {req,[stdlib],
- [sup_start, sup_stop, child_adm,
- child_adm_simple, extra_return, child_specs,
- restart_one_for_one, restart_one_for_all,
- restart_simple_one_for_one, restart_rest_for_one,
- normal_termination, abnormal_termination, child_unlink, tree,
- count_children_memory]}.
+end_per_group(_GroupName, Config) ->
+ Config.
+init_per_testcase(count_children_memory, Config) ->
+ MemoryState = erlang:system_info(allocator),
+ case count_children_allocator_test(MemoryState) of
+ true -> Config;
+ false ->
+ {skip, "+Meamin used during test; erlang:memory/1 not available"}
+ end;
+init_per_testcase(_Case, Config) ->
+ erlang:display(_Case),
+ Config.
-start(InitResult) ->
+end_per_testcase(_Case, _Config) ->
+ ok.
+
+start_link(InitResult) ->
supervisor:start_link({local, sup_test}, ?MODULE, InitResult).
%% Simulate different supervisors callback.
@@ -81,162 +144,87 @@ get_child_counts(Supervisor) ->
proplists:get_value(supervisors, Counts),
proplists:get_value(workers, Counts)].
-
-%-------------------------------------------------------------------------
-%
-% Test cases starts here.
-%
-%-------------------------------------------------------------------------
-
-sup_start(doc) ->
- ["Test start of a supervisor."];
-sup_start(suite) ->
- [sup_start_normal, sup_start_ignore_init, sup_start_ignore_child,
- sup_start_error_return, sup_start_fail].
-
-%-------------------------------------------------------------------------
+%%-------------------------------------------------------------------------
+%% Test cases starts here.
+%%-------------------------------------------------------------------------
sup_start_normal(doc) ->
["Tests that the supervisor process starts correctly and that it "
- "can be terminated gracefully."];
+ "can be terminated gracefully."];
sup_start_normal(suite) -> [];
sup_start_normal(Config) when is_list(Config) ->
process_flag(trap_exit, true),
- ?line {ok, Pid} = start({ok, {{one_for_one, 2, 3600}, []}}),
- ?line exit(Pid, shutdown),
- receive
- {'EXIT', Pid, shutdown} ->
- ok;
- {'EXIT', Pid, Else} ->
- ?line test_server:fail({bad_exit_reason, Else})
- after
- 2000 ->
- ?line test_server:fail(no_exit_reason)
- end,
- ok.
-%-------------------------------------------------------------------------
+ {ok, Pid} = start_link({ok, {{one_for_one, 2, 3600}, []}}),
+ terminate(Pid, shutdown).
+
+%%-------------------------------------------------------------------------
sup_start_ignore_init(doc) ->
["Tests what happens if init-callback returns ignore"];
sup_start_ignore_init(suite) -> [];
sup_start_ignore_init(Config) when is_list(Config) ->
process_flag(trap_exit, true),
- ?line ignore = start(ignore),
-
- receive
- {'EXIT', _Pid, normal} ->
- ok;
- {'EXIT', _Pid, Else} ->
- ?line test_server:fail({bad_exit_reason, Else})
- after
- 2000 ->
- ?line test_server:fail(no_exit_reason)
- end,
- ok.
+ ignore = start_link(ignore),
+ check_exit_reason(normal).
-
-%-------------------------------------------------------------------------
+%%-------------------------------------------------------------------------
sup_start_ignore_child(doc) ->
["Tests what happens if init-callback returns ignore"];
sup_start_ignore_child(suite) -> [];
sup_start_ignore_child(Config) when is_list(Config) ->
process_flag(trap_exit, true),
- ?line {ok, _Pid} = start({ok, {{one_for_one, 2, 3600}, []}}),
+ {ok, _Pid} = start_link({ok, {{one_for_one, 2, 3600}, []}}),
Child1 = {child1, {supervisor_1, start_child, [ignore]},
permanent, 1000, worker, []},
Child2 = {child2, {supervisor_1, start_child, []}, permanent,
1000, worker, []},
-
- ?line {ok, undefined} = supervisor:start_child(sup_test, Child1),
- ?line {ok, CPid2} = supervisor:start_child(sup_test, Child2),
- ?line [{child2, CPid2, worker, []},{child1, undefined, worker, []}]
- = supervisor:which_children(sup_test),
- ?line [2,1,0,2] = get_child_counts(sup_test),
+ {ok, undefined} = supervisor:start_child(sup_test, Child1),
+ {ok, CPid2} = supervisor:start_child(sup_test, Child2),
- ok.
+ [{child2, CPid2, worker, []},{child1, undefined, worker, []}]
+ = supervisor:which_children(sup_test),
+ [2,1,0,2] = get_child_counts(sup_test).
-%-------------------------------------------------------------------------
+%%-------------------------------------------------------------------------
sup_start_error_return(doc) ->
["Tests what happens if init-callback returns a invalid value"];
sup_start_error_return(suite) -> [];
sup_start_error_return(Config) when is_list(Config) ->
process_flag(trap_exit, true),
- ?line {error, Term} = start(invalid),
-
- receive
- {'EXIT', _Pid, Term} ->
- ok;
- {'EXIT', _Pid, Else} ->
- ?line test_server:fail({bad_exit_reason, Else})
- after
- 2000 ->
- ?line test_server:fail(no_exit_reason)
- end,
- ok.
+ {error, Term} = start_link(invalid),
+ check_exit_reason(Term).
-%-------------------------------------------------------------------------
+%%-------------------------------------------------------------------------
sup_start_fail(doc) ->
["Tests what happens if init-callback fails"];
sup_start_fail(suite) -> [];
sup_start_fail(Config) when is_list(Config) ->
process_flag(trap_exit, true),
- ?line {error, Term} = start(fail),
+ {error, Term} = start_link(fail),
+ check_exit_reason(Term).
- receive
- {'EXIT', _Pid, Term} ->
- ok;
- {'EXIT', _Pid, Else} ->
- ?line test_server:fail({bad_exit_reason, Else})
- after
- 2000 ->
- ?line test_server:fail(no_exit_reason)
- end,
- ok.
-%-------------------------------------------------------------------------
-sup_stop(doc) ->
- ["Tests that the supervisor shoutdowns its children if it is "
- "shutdown itself."];
-sup_stop(suite) -> [sup_stop_infinity, sup_stop_timeout, sup_stop_brutal_kill].
-
-%-------------------------------------------------------------------------
+%%-------------------------------------------------------------------------
sup_stop_infinity(doc) ->
["See sup_stop/1 when Shutdown = infinity, this walue is only allowed "
- "for children of type supervisor"];
+ "for children of type supervisor"];
sup_stop_infinity(suite) -> [];
sup_stop_infinity(Config) when is_list(Config) ->
process_flag(trap_exit, true),
- ?line {ok, Pid} = start({ok, {{one_for_one, 2, 3600}, []}}),
+ {ok, Pid} = start_link({ok, {{one_for_one, 2, 3600}, []}}),
Child1 = {child1, {supervisor_1, start_child, []},
permanent, infinity, supervisor, []},
Child2 = {child2, {supervisor_1, start_child, []}, permanent,
- infinity, worker, []},
- ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1),
+ infinity, worker, []},
+ {ok, CPid1} = supervisor:start_child(sup_test, Child1),
link(CPid1),
- ?line {error, {invalid_shutdown,infinity}} =
- supervisor:start_child(sup_test, Child2),
+ {error, {invalid_shutdown,infinity}} =
+ supervisor:start_child(sup_test, Child2),
- ?line exit(Pid, shutdown),
+ terminate(Pid, shutdown),
+ check_exit_reason(CPid1, shutdown).
- receive
- {'EXIT', Pid, shutdown} ->
- ok;
- {'EXIT', Pid, Else} ->
- ?line test_server:fail({bad_exit_reason, Else})
- after
- 5000 ->
- ?line test_server:fail(no_exit_reason)
- end,
- receive
- {'EXIT', CPid1, shutdown} -> ok;
- {'EXIT', CPid1, Reason} ->
- ?line test_server:fail({bad_exit_reason, Reason})
- after
- 2000 -> ?line test_server:fail(no_exit_reason)
- end,
- ok.
-
-%-------------------------------------------------------------------------
+%%-------------------------------------------------------------------------
sup_stop_timeout(doc) ->
["See sup_stop/1 when Shutdown = 1000"];
@@ -244,93 +232,47 @@ sup_stop_timeout(suite) -> [];
sup_stop_timeout(Config) when is_list(Config) ->
process_flag(trap_exit, true),
- ?line {ok, Pid} = start({ok, {{one_for_one, 2, 3600}, []}}),
+ {ok, Pid} = start_link({ok, {{one_for_one, 2, 3600}, []}}),
Child1 = {child1, {supervisor_1, start_child, []},
permanent, 1000, worker, []},
Child2 = {child2, {supervisor_1, start_child, []}, permanent,
1000, worker, []},
- ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1),
+ {ok, CPid1} = supervisor:start_child(sup_test, Child1),
link(CPid1),
- ?line {ok, CPid2} = supervisor:start_child(sup_test, Child2),
+ {ok, CPid2} = supervisor:start_child(sup_test, Child2),
link(CPid2),
-
+
CPid2 ! {sleep, 200000},
- ?line exit(Pid, shutdown),
+ terminate(Pid, shutdown),
- receive
- {'EXIT', Pid, shutdown} ->
- ok;
- {'EXIT', Pid, Else} ->
- ?line test_server:fail({bad_exit_reason, Else})
- after
- 5000 ->
- ?line test_server:fail(no_exit_reason)
- end,
+ check_exit_reason(CPid1, shutdown),
+ check_exit_reason(CPid2, killed).
- receive
- {'EXIT', CPid1, shutdown} -> ok;
- {'EXIT', CPid1, Reason} ->
- ?line test_server:fail({bad_exit_reason,Reason})
- after
- 2000 -> ?line test_server:fail(no_exit_reason)
- end,
-
- receive
- {'EXIT', CPid2, killed} -> ok;
- {'EXIT', CPid2, Reason2} ->
- ?line test_server:fail({bad_exit_reason, Reason2})
- after
- 2000 -> ?line test_server:fail(no_exit_reason)
- end,
- ok.
-%-------------------------------------------------------------------------
+%%-------------------------------------------------------------------------
sup_stop_brutal_kill(doc) ->
["See sup_stop/1 when Shutdown = brutal_kill"];
sup_stop_brutal_kill(suite) -> [];
sup_stop_brutal_kill(Config) when is_list(Config) ->
process_flag(trap_exit, true),
- ?line {ok, Pid} = start({ok, {{one_for_one, 2, 3600}, []}}),
+ {ok, Pid} = start_link({ok, {{one_for_one, 2, 3600}, []}}),
Child1 = {child1, {supervisor_1, start_child, []},
permanent, 1000, worker, []},
Child2 = {child2, {supervisor_1, start_child, []}, permanent,
brutal_kill, worker, []},
- ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1),
+ {ok, CPid1} = supervisor:start_child(sup_test, Child1),
link(CPid1),
- ?line {ok, CPid2} = supervisor:start_child(sup_test, Child2),
+ {ok, CPid2} = supervisor:start_child(sup_test, Child2),
link(CPid2),
- ?line exit(Pid, shutdown),
+ terminate(Pid, shutdown),
- receive
- {'EXIT', Pid, shutdown} ->
- ok;
- {'EXIT', Pid, Else} ->
- ?line test_server:fail({bad_exit_reason, Else})
- after
- 5000 ->
- ?line test_server:fail(no_exit_reason)
- end,
+ check_exit_reason(CPid1, shutdown),
+ check_exit_reason(CPid2, killed).
- receive
- {'EXIT', CPid1, shutdown} -> ok;
- {'EXIT', CPid1, Reason} ->
- ?line test_server:fail({bad_exit_reason, Reason})
- after
- 2000 -> ?line test_server:fail(no_exit_reason)
- end,
- receive
- {'EXIT', CPid2, killed} -> ok;
- {'EXIT', CPid2, Reason2} ->
- ?line test_server:fail({bad_exit_reason, Reason2})
- after
- 2000 -> ?line test_server:fail(no_exit_reason)
- end,
- ok.
-
-%-------------------------------------------------------------------------
+%%-------------------------------------------------------------------------
extra_return(doc) ->
["The start function provided to start a child may "
"return {ok, Pid} or {ok, Pid, Info}, if it returns "
@@ -344,46 +286,40 @@ extra_return(Config) when is_list(Config) ->
Child = {child1, {supervisor_1, start_child, [extra_return]},
permanent, 1000,
worker, []},
- ?line {ok, _Pid} = start({ok, {{one_for_one, 2, 3600}, [Child]}}),
- ?line [{child1, CPid, worker, []}] = supervisor:which_children(sup_test),
+ {ok, _Pid} = start_link({ok, {{one_for_one, 2, 3600}, [Child]}}),
+ [{child1, CPid, worker, []}] = supervisor:which_children(sup_test),
link(CPid),
- ?line {error, not_found} = supervisor:terminate_child(sup_test, hej),
- ?line {error, not_found} = supervisor:delete_child(sup_test, hej),
- ?line {error, not_found} = supervisor:restart_child(sup_test, hej),
- ?line {error, running} = supervisor:delete_child(sup_test, child1),
- ?line {error, running} = supervisor:restart_child(sup_test, child1),
- ?line [{child1, CPid, worker, []}] = supervisor:which_children(sup_test),
- ?line [1,1,0,1] = get_child_counts(sup_test),
-
- ?line ok = supervisor:terminate_child(sup_test, child1),
- receive
- {'EXIT', CPid, shutdown} -> ok;
- {'EXIT', CPid, Reason} ->
- ?line test_server:fail({bad_reason, Reason})
- after 1000 ->
- ?line test_server:fail(no_child_termination)
- end,
- ?line [{child1,undefined,worker,[]}] = supervisor:which_children(sup_test),
- ?line [1,0,0,1] = get_child_counts(sup_test),
-
- ?line {ok, CPid2,extra_return} =
+ {error, not_found} = supervisor:terminate_child(sup_test, hej),
+ {error, not_found} = supervisor:delete_child(sup_test, hej),
+ {error, not_found} = supervisor:restart_child(sup_test, hej),
+ {error, running} = supervisor:delete_child(sup_test, child1),
+ {error, running} = supervisor:restart_child(sup_test, child1),
+ [{child1, CPid, worker, []}] = supervisor:which_children(sup_test),
+ [1,1,0,1] = get_child_counts(sup_test),
+
+ ok = supervisor:terminate_child(sup_test, child1),
+ check_exit_reason(CPid, shutdown),
+ [{child1,undefined,worker,[]}] = supervisor:which_children(sup_test),
+ [1,0,0,1] = get_child_counts(sup_test),
+
+ {ok, CPid2,extra_return} =
supervisor:restart_child(sup_test, child1),
- ?line [{child1, CPid2, worker, []}] = supervisor:which_children(sup_test),
- ?line [1,1,0,1] = get_child_counts(sup_test),
+ [{child1, CPid2, worker, []}] = supervisor:which_children(sup_test),
+ [1,1,0,1] = get_child_counts(sup_test),
- ?line ok = supervisor:terminate_child(sup_test, child1),
- ?line ok = supervisor:terminate_child(sup_test, child1),
- ?line ok = supervisor:delete_child(sup_test, child1),
- ?line {error, not_found} = supervisor:restart_child(sup_test, child1),
- ?line [] = supervisor:which_children(sup_test),
- ?line [0,0,0,0] = get_child_counts(sup_test),
+ ok = supervisor:terminate_child(sup_test, child1),
+ ok = supervisor:terminate_child(sup_test, child1),
+ ok = supervisor:delete_child(sup_test, child1),
+ {error, not_found} = supervisor:restart_child(sup_test, child1),
+ [] = supervisor:which_children(sup_test),
+ [0,0,0,0] = get_child_counts(sup_test),
- ?line {ok, CPid3, extra_return} = supervisor:start_child(sup_test, Child),
- ?line [{child1, CPid3, worker, []}] = supervisor:which_children(sup_test),
- ?line [1,1,0,1] = get_child_counts(sup_test),
+ {ok, CPid3, extra_return} = supervisor:start_child(sup_test, Child),
+ [{child1, CPid3, worker, []}] = supervisor:which_children(sup_test),
+ [1,1,0,1] = get_child_counts(sup_test),
ok.
-%-------------------------------------------------------------------------
+%%-------------------------------------------------------------------------
child_adm(doc)->
["Test API functions start_child/2, terminate_child/2, delete_child/2 "
"restart_child/2, which_children/1, count_children/1. Only correct "
@@ -394,116 +330,124 @@ child_adm(Config) when is_list(Config) ->
process_flag(trap_exit, true),
Child = {child1, {supervisor_1, start_child, []}, permanent, 1000,
worker, []},
- ?line {ok, _Pid} = start({ok, {{one_for_one, 2, 3600}, [Child]}}),
- ?line [{child1, CPid, worker, []}] = supervisor:which_children(sup_test),
- ?line [1,1,0,1] = get_child_counts(sup_test),
+ {ok, _Pid} = start_link({ok, {{one_for_one, 2, 3600}, [Child]}}),
+ [{child1, CPid, worker, []}] = supervisor:which_children(sup_test),
+ [1,1,0,1] = get_child_counts(sup_test),
link(CPid),
%% Start of an already runnig process
- ?line {error,{already_started, CPid}} =
+ {error,{already_started, CPid}} =
supervisor:start_child(sup_test, Child),
-
+
%% Termination
- ?line {error, not_found} = supervisor:terminate_child(sup_test, hej),
- ?line {'EXIT',{noproc,{gen_server,call, _}}} =
+ {error, not_found} = supervisor:terminate_child(sup_test, hej),
+ {'EXIT',{noproc,{gen_server,call, _}}} =
(catch supervisor:terminate_child(foo, child1)),
- ?line ok = supervisor:terminate_child(sup_test, child1),
- receive
- {'EXIT', CPid, shutdown} -> ok;
- {'EXIT', CPid, Reason} ->
- ?line test_server:fail({bad_reason, Reason})
- after 1000 ->
- ?line test_server:fail(no_child_termination)
- end,
- ?line [{child1,undefined,worker,[]}] = supervisor:which_children(sup_test),
- ?line [1,0,0,1] = get_child_counts(sup_test),
+ ok = supervisor:terminate_child(sup_test, child1),
+ check_exit_reason(CPid, shutdown),
+ [{child1,undefined,worker,[]}] = supervisor:which_children(sup_test),
+ [1,0,0,1] = get_child_counts(sup_test),
%% Like deleting something that does not exist, it will succeed!
- ?line ok = supervisor:terminate_child(sup_test, child1),
+ ok = supervisor:terminate_child(sup_test, child1),
%% Start of already existing but not running process
- ?line {error,already_present} =
- supervisor:start_child(sup_test, Child),
+ {error,already_present} = supervisor:start_child(sup_test, Child),
%% Restart
- ?line {ok, CPid2} = supervisor:restart_child(sup_test, child1),
- ?line [{child1, CPid2, worker, []}] = supervisor:which_children(sup_test),
- ?line [1,1,0,1] = get_child_counts(sup_test),
- ?line {error, running} = supervisor:restart_child(sup_test, child1),
- ?line {error, not_found} = supervisor:restart_child(sup_test, child2),
-
+ {ok, CPid2} = supervisor:restart_child(sup_test, child1),
+ [{child1, CPid2, worker, []}] = supervisor:which_children(sup_test),
+ [1,1,0,1] = get_child_counts(sup_test),
+ {error, running} = supervisor:restart_child(sup_test, child1),
+ {error, not_found} = supervisor:restart_child(sup_test, child2),
+
%% Deletion
- ?line {error, running} = supervisor:delete_child(sup_test, child1),
- ?line {error, not_found} = supervisor:delete_child(sup_test, hej),
- ?line {'EXIT',{noproc,{gen_server,call, _}}} =
+ {error, running} = supervisor:delete_child(sup_test, child1),
+ {error, not_found} = supervisor:delete_child(sup_test, hej),
+ {'EXIT',{noproc,{gen_server,call, _}}} =
(catch supervisor:delete_child(foo, child1)),
- ?line ok = supervisor:terminate_child(sup_test, child1),
- ?line ok = supervisor:delete_child(sup_test, child1),
- ?line {error, not_found} = supervisor:restart_child(sup_test, child1),
- ?line [] = supervisor:which_children(sup_test),
- ?line [0,0,0,0] = get_child_counts(sup_test),
-
+ ok = supervisor:terminate_child(sup_test, child1),
+ ok = supervisor:delete_child(sup_test, child1),
+ {error, not_found} = supervisor:restart_child(sup_test, child1),
+ [] = supervisor:which_children(sup_test),
+ [0,0,0,0] = get_child_counts(sup_test),
+
%% Start
- ?line {'EXIT',{noproc,{gen_server,call, _}}} =
+ {'EXIT',{noproc,{gen_server,call, _}}} =
(catch supervisor:start_child(foo, Child)),
- ?line {ok, CPid3} = supervisor:start_child(sup_test, Child),
- ?line [{child1, CPid3, worker, []}] = supervisor:which_children(sup_test),
- ?line [1,1,0,1] = get_child_counts(sup_test),
+ {ok, CPid3} = supervisor:start_child(sup_test, Child),
+ [{child1, CPid3, worker, []}] = supervisor:which_children(sup_test),
+ [1,1,0,1] = get_child_counts(sup_test),
+
+ %% Terminate with Pid not allowed when not simple_one_for_one
+ {error,not_found} = supervisor:terminate_child(sup_test, CPid3),
+ [{child1, CPid3, worker, []}] = supervisor:which_children(sup_test),
+ [1,1,0,1] = get_child_counts(sup_test),
- ?line {'EXIT',{noproc,{gen_server,call,[foo,which_children,infinity]}}}
+ {'EXIT',{noproc,{gen_server,call,[foo,which_children,infinity]}}}
= (catch supervisor:which_children(foo)),
- ?line {'EXIT',{noproc,{gen_server,call,[foo,count_children,infinity]}}}
+ {'EXIT',{noproc,{gen_server,call,[foo,count_children,infinity]}}}
= (catch supervisor:count_children(foo)),
ok.
-%-------------------------------------------------------------------------
+%%-------------------------------------------------------------------------
child_adm_simple(doc) ->
["The API functions terminate_child/2, delete_child/2 "
"restart_child/2 are not valid for a simple_one_for_one supervisor "
- "check that the correct error message is returned."];
+ "check that the correct error message is returned."];
child_adm_simple(suite) -> [];
child_adm_simple(Config) when is_list(Config) ->
Child = {child, {supervisor_1, start_child, []}, permanent, 1000,
worker, []},
- ?line {ok, _Pid} = start({ok, {{simple_one_for_one, 2, 3600}, [Child]}}),
+ {ok, _Pid} = start_link({ok, {{simple_one_for_one, 2, 3600}, [Child]}}),
%% In simple_one_for_one all children are added dynamically
- ?line [] = supervisor:which_children(sup_test),
- ?line [1,0,0,0] = get_child_counts(sup_test),
-
+ [] = supervisor:which_children(sup_test),
+ [1,0,0,0] = get_child_counts(sup_test),
+
%% Start
- ?line {'EXIT',{noproc,{gen_server,call, _}}} =
+ {'EXIT',{noproc,{gen_server,call, _}}} =
(catch supervisor:start_child(foo, [])),
- ?line {ok, CPid1} = supervisor:start_child(sup_test, []),
- ?line [{undefined, CPid1, worker, []}] =
+ {ok, CPid1} = supervisor:start_child(sup_test, []),
+ [{undefined, CPid1, worker, []}] =
supervisor:which_children(sup_test),
- ?line [1,1,0,1] = get_child_counts(sup_test),
-
- ?line {ok, CPid2} = supervisor:start_child(sup_test, []),
- ?line Children = supervisor:which_children(sup_test),
- ?line 2 = length(Children),
- ?line true = lists:member({undefined, CPid2, worker, []}, Children),
- ?line true = lists:member({undefined, CPid1, worker, []}, Children),
- ?line [1,2,0,2] = get_child_counts(sup_test),
+ [1,1,0,1] = get_child_counts(sup_test),
+
+ {ok, CPid2} = supervisor:start_child(sup_test, []),
+ Children = supervisor:which_children(sup_test),
+ 2 = length(Children),
+ true = lists:member({undefined, CPid2, worker, []}, Children),
+ true = lists:member({undefined, CPid1, worker, []}, Children),
+ [1,2,0,2] = get_child_counts(sup_test),
%% Termination
- ?line {error, simple_one_for_one} =
- supervisor:terminate_child(sup_test, child1),
+ {error, simple_one_for_one} = supervisor:terminate_child(sup_test, child1),
+ [1,2,0,2] = get_child_counts(sup_test),
+ ok = supervisor:terminate_child(sup_test,CPid1),
+ [_] = supervisor:which_children(sup_test),
+ [1,1,0,1] = get_child_counts(sup_test),
+ false = erlang:is_process_alive(CPid1),
+ %% Terminate non-existing proccess is ok
+ ok = supervisor:terminate_child(sup_test,CPid1),
+ [_] = supervisor:which_children(sup_test),
+ [1,1,0,1] = get_child_counts(sup_test),
+ %% Terminate pid which is not a child of this supervisor is not ok
+ NoChildPid = spawn_link(fun() -> receive after infinity -> ok end end),
+ {error, not_found} = supervisor:terminate_child(sup_test, NoChildPid),
+ true = erlang:is_process_alive(NoChildPid),
%% Restart
- ?line {error, simple_one_for_one} =
- supervisor:restart_child(sup_test, child1),
-
+ {error, simple_one_for_one} = supervisor:restart_child(sup_test, child1),
+
%% Deletion
- ?line {error, simple_one_for_one} =
- supervisor:delete_child(sup_test, child1),
+ {error, simple_one_for_one} = supervisor:delete_child(sup_test, child1),
ok.
-
-%-------------------------------------------------------------------------
+
+%%-------------------------------------------------------------------------
child_specs(doc) ->
["Tests child specs, invalid formats should be rejected."];
child_specs(suite) -> [];
child_specs(Config) when is_list(Config) ->
process_flag(trap_exit, true),
- ?line {ok, _Pid} = start({ok, {{one_for_one, 2, 3600}, []}}),
- ?line {error, _} = supervisor:start_child(sup_test, hej),
+ {ok, _Pid} = start_link({ok, {{one_for_one, 2, 3600}, []}}),
+ {error, _} = supervisor:start_child(sup_test, hej),
%% Bad child specs
B1 = {child, mfa, permanent, 1000, worker, []},
@@ -513,7 +457,7 @@ child_specs(Config) when is_list(Config) ->
B5 = {child, {m,f,[a]}, permanent, infinity, worker, []},
B6 = {child, {m,f,[a]}, permanent, 1000, worker, dy},
B7 = {child, {m,f,[a]}, permanent, 1000, worker, [1,2,3]},
-
+
%% Correct child specs!
%% <Modules> (last parameter in a child spec) can be [] as we do
%% not test code upgrade here.
@@ -522,358 +466,261 @@ child_specs(Config) when is_list(Config) ->
C3 = {child, {m,f,[a]}, temporary, 1000, worker, dynamic},
C4 = {child, {m,f,[a]}, transient, 1000, worker, [m]},
- ?line {error, {invalid_mfa,mfa}} = supervisor:start_child(sup_test, B1),
- ?line {error, {invalid_restart_type, prmanent}} =
+ {error, {invalid_mfa,mfa}} = supervisor:start_child(sup_test, B1),
+ {error, {invalid_restart_type, prmanent}} =
supervisor:start_child(sup_test, B2),
- ?line {error, {invalid_shutdown,-10}}
- = supervisor:start_child(sup_test, B3),
- ?line {error, {invalid_child_type,wrker}}
+ {error, {invalid_shutdown,-10}}
+ = supervisor:start_child(sup_test, B3),
+ {error, {invalid_child_type,wrker}}
= supervisor:start_child(sup_test, B4),
- ?line {error, _} = supervisor:start_child(sup_test, B5),
- ?line {error, {invalid_modules,dy}}
+ {error, _} = supervisor:start_child(sup_test, B5),
+ {error, {invalid_modules,dy}}
= supervisor:start_child(sup_test, B6),
-
- ?line {error, {invalid_mfa,mfa}} = supervisor:check_childspecs([B1]),
- ?line {error, {invalid_restart_type,prmanent}} =
+
+ {error, {invalid_mfa,mfa}} = supervisor:check_childspecs([B1]),
+ {error, {invalid_restart_type,prmanent}} =
supervisor:check_childspecs([B2]),
- ?line {error, {invalid_shutdown,-10}} = supervisor:check_childspecs([B3]),
- ?line {error, {invalid_child_type,wrker}}
+ {error, {invalid_shutdown,-10}} = supervisor:check_childspecs([B3]),
+ {error, {invalid_child_type,wrker}}
= supervisor:check_childspecs([B4]),
- ?line {error, _} = supervisor:check_childspecs([B5]),
- ?line {error, {invalid_modules,dy}} = supervisor:check_childspecs([B6]),
- ?line {error, {invalid_module, 1}} =
+ {error, _} = supervisor:check_childspecs([B5]),
+ {error, {invalid_modules,dy}} = supervisor:check_childspecs([B6]),
+ {error, {invalid_module, 1}} =
supervisor:check_childspecs([B7]),
- ?line ok = supervisor:check_childspecs([C1]),
- ?line ok = supervisor:check_childspecs([C2]),
- ?line ok = supervisor:check_childspecs([C3]),
- ?line ok = supervisor:check_childspecs([C4]),
+ ok = supervisor:check_childspecs([C1]),
+ ok = supervisor:check_childspecs([C2]),
+ ok = supervisor:check_childspecs([C3]),
+ ok = supervisor:check_childspecs([C4]),
ok.
-%-------------------------------------------------------------------------
-normal_termination(doc) ->
- ["Testes the supervisors behaviour if a child dies with reason normal"];
-normal_termination(suite) ->
- [permanent_normal, transient_normal, temporary_normal].
-%-------------------------------------------------------------------------
+%%-------------------------------------------------------------------------
permanent_normal(doc) ->
["A permanent child should always be restarted"];
permanent_normal(suite) -> [];
permanent_normal(Config) when is_list(Config) ->
- ?line {ok, _SupPid} = start({ok, {{one_for_one, 2, 3600}, []}}),
+ {ok, SupPid} = start_link({ok, {{one_for_one, 2, 3600}, []}}),
Child1 = {child1, {supervisor_1, start_child, []}, permanent, 1000,
worker, []},
-
- ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1),
-
- CPid1 ! stop,
- test_server:sleep(100),
- ?line [{child1, Pid ,worker,[]}] = supervisor:which_children(sup_test),
+
+ {ok, CPid1} = supervisor:start_child(sup_test, Child1),
+
+ terminate(SupPid, CPid1, child1, normal),
+
+ [{child1, Pid ,worker,[]}] = supervisor:which_children(sup_test),
case is_pid(Pid) of
true ->
ok;
false ->
- ?line test_server:fail({permanent_child_not_restarted, Child1})
+ test_server:fail({permanent_child_not_restarted, Child1})
end,
- ?line [1,1,0,1] = get_child_counts(sup_test),
+ [1,1,0,1] = get_child_counts(sup_test).
- ok.
-%-------------------------------------------------------------------------
+%%-------------------------------------------------------------------------
transient_normal(doc) ->
["A transient child should not be restarted if it exits with "
"reason normal"];
transient_normal(suite) -> [];
transient_normal(Config) when is_list(Config) ->
- ?line {ok, _SupPid} = start({ok, {{one_for_one, 2, 3600}, []}}),
+ {ok, SupPid} = start_link({ok, {{one_for_one, 2, 3600}, []}}),
Child1 = {child1, {supervisor_1, start_child, []}, transient, 1000,
worker, []},
-
- ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1),
-
- CPid1 ! stop,
- test_server:sleep(100),
-
- ?line [{child1,undefined,worker,[]}] = supervisor:which_children(sup_test),
- ?line [1,0,0,1] = get_child_counts(sup_test),
- ok.
-%-------------------------------------------------------------------------
+ {ok, CPid1} = supervisor:start_child(sup_test, Child1),
+
+ terminate(SupPid, CPid1, child1, normal),
+
+ [{child1,undefined,worker,[]}] = supervisor:which_children(sup_test),
+ [1,0,0,1] = get_child_counts(sup_test).
+
+%%-------------------------------------------------------------------------
temporary_normal(doc) ->
["A temporary process should never be restarted"];
temporary_normal(suite) -> [];
temporary_normal(Config) when is_list(Config) ->
- ?line {ok, _SupPid} = start({ok, {{one_for_one, 2, 3600}, []}}),
+ {ok, SupPid} = start_link({ok, {{one_for_one, 2, 3600}, []}}),
Child1 = {child1, {supervisor_1, start_child, []}, temporary, 1000,
worker, []},
-
- ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1),
-
- CPid1 ! stop,
- test_server:sleep(100),
-
- ?line [{child1,undefined,worker,[]}] = supervisor:which_children(sup_test),
- ?line [1,0,0,1] = get_child_counts(sup_test),
- ok.
-%-------------------------------------------------------------------------
-abnormal_termination(doc) ->
- ["Testes the supervisors behaviour if a child dies with reason abnormal"];
-abnormal_termination(suite) ->
- [permanent_abnormal, transient_abnormal, temporary_abnormal].
+ {ok, CPid1} = supervisor:start_child(sup_test, Child1),
+
+ terminate(SupPid, CPid1, child1, normal),
+
+ [] = supervisor:which_children(sup_test),
+ [0,0,0,0] = get_child_counts(sup_test).
-%-------------------------------------------------------------------------
+%%-------------------------------------------------------------------------
permanent_abnormal(doc) ->
["A permanent child should always be restarted"];
permanent_abnormal(suite) -> [];
permanent_abnormal(Config) when is_list(Config) ->
- ?line {ok, _SupPid} = start({ok, {{one_for_one, 2, 3600}, []}}),
+ {ok, SupPid} = start_link({ok, {{one_for_one, 2, 3600}, []}}),
Child1 = {child1, {supervisor_1, start_child, []}, permanent, 1000,
worker, []},
-
- ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1),
-
- CPid1 ! die,
- test_server:sleep(100),
- ?line [{child1, Pid ,worker,[]}] = supervisor:which_children(sup_test),
+
+ {ok, CPid1} = supervisor:start_child(sup_test, Child1),
+ terminate(SupPid, CPid1, child1, abnormal),
+
+ [{child1, Pid ,worker,[]}] = supervisor:which_children(sup_test),
case is_pid(Pid) of
true ->
ok;
false ->
- ?line test_server:fail({permanent_child_not_restarted, Child1})
+ test_server:fail({permanent_child_not_restarted, Child1})
end,
- ?line [1,1,0,1] = get_child_counts(sup_test),
+ [1,1,0,1] = get_child_counts(sup_test).
- ok.
-%-------------------------------------------------------------------------
+%%-------------------------------------------------------------------------
transient_abnormal(doc) ->
["A transient child should be restarted if it exits with "
"reason abnormal"];
transient_abnormal(suite) -> [];
transient_abnormal(Config) when is_list(Config) ->
- ?line {ok, _SupPid} = start({ok, {{one_for_one, 2, 3600}, []}}),
+ {ok, SupPid} = start_link({ok, {{one_for_one, 2, 3600}, []}}),
Child1 = {child1, {supervisor_1, start_child, []}, transient, 1000,
worker, []},
-
- ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1),
-
- CPid1 ! die,
- test_server:sleep(100),
-
- ?line [{child1, Pid ,worker,[]}] = supervisor:which_children(sup_test),
+
+ {ok, CPid1} = supervisor:start_child(sup_test, Child1),
+ terminate(SupPid, CPid1, child1, abnormal),
+
+ [{child1, Pid ,worker,[]}] = supervisor:which_children(sup_test),
case is_pid(Pid) of
true ->
ok;
false ->
- ?line test_server:fail({transient_child_not_restarted, Child1})
+ test_server:fail({transient_child_not_restarted, Child1})
end,
- ?line [1,1,0,1] = get_child_counts(sup_test),
+ [1,1,0,1] = get_child_counts(sup_test).
- ok.
-%-------------------------------------------------------------------------
+%%-------------------------------------------------------------------------
temporary_abnormal(doc) ->
["A temporary process should never be restarted"];
temporary_abnormal(suite) -> [];
temporary_abnormal(Config) when is_list(Config) ->
- ?line {ok, _SupPid} = start({ok, {{one_for_one, 2, 3600}, []}}),
+ {ok, SupPid} = start_link({ok, {{one_for_one, 2, 3600}, []}}),
Child1 = {child1, {supervisor_1, start_child, []}, temporary, 1000,
worker, []},
-
- ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1),
-
- CPid1 ! die,
- test_server:sleep(100),
-
- ?line [{child1,undefined,worker,[]}] = supervisor:which_children(sup_test),
- ?line [1,0,0,1] = get_child_counts(sup_test),
- ok.
-%-------------------------------------------------------------------------
-restart_one_for_one(doc) ->
- ["Test that the one_for_one strategy works."];
+ {ok, CPid1} = supervisor:start_child(sup_test, Child1),
+ terminate(SupPid, CPid1, child1, abnormal),
-restart_one_for_one(suite) -> [one_for_one, one_for_one_escalation].
+ [] = supervisor:which_children(sup_test),
+ [0,0,0,0] = get_child_counts(sup_test).
-%-------------------------------------------------------------------------
+%%-------------------------------------------------------------------------
one_for_one(doc) ->
["Test the one_for_one base case."];
one_for_one(suite) -> [];
one_for_one(Config) when is_list(Config) ->
process_flag(trap_exit, true),
Child1 = {child1, {supervisor_1, start_child, []}, permanent, 1000,
- worker, []},
+ worker, []},
Child2 = {child2, {supervisor_1, start_child, []}, permanent, 1000,
- worker, []},
- ?line {ok, Pid} = start({ok, {{one_for_one, 2, 3600}, []}}),
- ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1),
- link(CPid1),
- ?line {ok, CPid2} = supervisor:start_child(sup_test, Child2),
- link(CPid2),
- CPid1 ! die,
- receive
- {'EXIT', CPid1, died} -> ok;
- {'EXIT', CPid1, Reason} ->
- ?line test_server:fail({bad_exit_reason, Reason})
- end,
- test_server:sleep(100),
+ worker, []},
+ {ok, SupPid} = start_link({ok, {{one_for_one, 2, 3600}, []}}),
+ {ok, CPid1} = supervisor:start_child(sup_test, Child1),
+ {ok, CPid2} = supervisor:start_child(sup_test, Child2),
+
+ terminate(SupPid, CPid1, child1, abnormal),
Children = supervisor:which_children(sup_test),
if length(Children) == 2 ->
case lists:keysearch(CPid2, 2, Children) of
{value, _} -> ok;
- _ -> ?line test_server:fail(bad_child)
+ _ -> test_server:fail(bad_child)
end;
- true -> ?line test_server:fail({bad_child_list, Children})
+ true -> test_server:fail({bad_child_list, Children})
end,
- ?line [2,2,0,2] = get_child_counts(sup_test),
-
+ [2,2,0,2] = get_child_counts(sup_test),
+
%% Test restart frequency property
- CPid2 ! die,
- receive
- {'EXIT', CPid2, _} -> ok
- end,
- test_server:sleep(100),
- [{_, Pid4, _, _}|_] = supervisor:which_children(sup_test),
- Pid4 ! die,
- receive
- {'EXIT', Pid, _} -> ok
- after 3000 -> ?line test_server:fail(restart_failed)
- end,
- ok.
-%-------------------------------------------------------------------------
+ terminate(SupPid, CPid2, child2, abnormal),
+
+ [{Id4, Pid4, _, _}|_] = supervisor:which_children(sup_test),
+ terminate(SupPid, Pid4, Id4, abnormal),
+ check_exit([SupPid]).
+
+%%-------------------------------------------------------------------------
one_for_one_escalation(doc) ->
["Test restart escalation on a one_for_one supervisor."];
one_for_one_escalation(suite) -> [];
one_for_one_escalation(Config) when is_list(Config) ->
process_flag(trap_exit, true),
+
Child1 = {child1, {supervisor_1, start_child, [error]},
permanent, 1000,
- worker, []},
+ worker, []},
Child2 = {child2, {supervisor_1, start_child, []}, permanent, 1000,
- worker, []},
- ?line {ok, Pid} = start({ok, {{one_for_one, 4, 3600}, []}}),
- ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1),
- link(CPid1),
- ?line {ok, CPid2} = supervisor:start_child(sup_test, Child2),
+ worker, []},
+
+ {ok, SupPid} = start_link({ok, {{one_for_one, 4, 3600}, []}}),
+ {ok, CPid1} = supervisor:start_child(sup_test, Child1),
+ {ok, CPid2} = supervisor:start_child(sup_test, Child2),
link(CPid2),
- CPid1 ! die,
- receive
- {'EXIT', CPid1, died} -> ok;
- {'EXIT', CPid1, Reason} ->
- ?line test_server:fail({bad_exit_reason, Reason})
- end,
- receive
- {'EXIT', Pid, _} -> ok
- after
- 2000 -> ?line test_server:fail(supervisor_alive)
- end,
- receive
- {'EXIT', CPid2, _} -> ok
- after
- 4000 -> ?line test_server:fail(all_not_terminated)
- end,
- ok.
-%-------------------------------------------------------------------------
-restart_one_for_all(doc) ->
- ["Test that the one_for_all strategy works."];
-restart_one_for_all(suite) ->
- [one_for_all, one_for_all_escalation].
+ terminate(SupPid, CPid1, child1, abnormal),
+ check_exit([SupPid, CPid2]).
+
-%-------------------------------------------------------------------------
+%%-------------------------------------------------------------------------
one_for_all(doc) ->
["Test the one_for_all base case."];
one_for_all(suite) -> [];
one_for_all(Config) when is_list(Config) ->
process_flag(trap_exit, true),
+
Child1 = {child1, {supervisor_1, start_child, []}, permanent, 1000,
worker, []},
Child2 = {child2, {supervisor_1, start_child, []}, permanent, 1000,
worker, []},
- ?line {ok, Pid} = start({ok, {{one_for_all, 2, 3600}, []}}),
- ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1),
- link(CPid1),
- ?line {ok, CPid2} = supervisor:start_child(sup_test, Child2),
+ {ok, SupPid} = start_link({ok, {{one_for_all, 2, 3600}, []}}),
+ {ok, CPid1} = supervisor:start_child(sup_test, Child1),
+ {ok, CPid2} = supervisor:start_child(sup_test, Child2),
link(CPid2),
- CPid1 ! die,
- receive
- {'EXIT', CPid1, died} -> ok;
- {'EXIT', CPid1, Reason} ->
- ?line test_server:fail({bad_exit_reason, Reason})
- end,
- receive
- {'EXIT', CPid2, _} -> ok
- end,
- test_server:sleep(100),
+
+ terminate(SupPid, CPid1, child1, abnormal),
+ check_exit([CPid2]),
+
Children = supervisor:which_children(sup_test),
if length(Children) == 2 -> ok;
- true -> ?line test_server:fail({bad_child_list, Children})
+ true ->
+ test_server:fail({bad_child_list, Children})
end,
+
%% Test that no old children is still alive
- SCh = lists:map(fun({_,P,_,_}) -> P end, Children),
- case lists:member(CPid1, SCh) of
- true -> ?line test_server:fail(bad_child);
- false -> ok
- end,
- case lists:member(CPid2, SCh) of
- true -> ?line test_server:fail(bad_child);
- false -> ok
- end,
- ?line [2,2,0,2] = get_child_counts(sup_test),
+ not_in_child_list([CPid1, CPid2], lists:map(fun({_,P,_,_}) -> P end, Children)),
+
+ [2,2,0,2] = get_child_counts(sup_test),
%%% Test restart frequency property
- [{_, Pid3, _, _}|_] = supervisor:which_children(sup_test),
- Pid3 ! die,
- test_server:sleep(100),
- [{_, Pid4, _, _}|_] = supervisor:which_children(sup_test),
- Pid4 ! die,
- receive
- {'EXIT', Pid, _} -> ok
- after 3000 -> ?line test_server:fail(restart_failed)
- end,
- exit(Pid, shutdown).
+ [{Id3, Pid3, _, _}|_] = supervisor:which_children(sup_test),
+ terminate(SupPid, Pid3, Id3, abnormal),
+ [{Id4, Pid4, _, _}|_] = supervisor:which_children(sup_test),
+ terminate(SupPid, Pid4, Id4, abnormal),
+ check_exit([SupPid]).
+
-%-------------------------------------------------------------------------
+%%-------------------------------------------------------------------------
one_for_all_escalation(doc) ->
["Test restart escalation on a one_for_all supervisor."];
one_for_all_escalation(suite) -> [];
one_for_all_escalation(Config) when is_list(Config) ->
process_flag(trap_exit, true),
+
Child1 = {child1, {supervisor_1, start_child, []}, permanent, 1000,
worker, []},
Child2 = {child2, {supervisor_1, start_child, [error]},
permanent, 1000,
worker, []},
- ?line {ok, Pid} = start({ok, {{one_for_all, 4, 3600}, []}}),
- ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1),
- link(CPid1),
- ?line {ok, CPid2} = supervisor:start_child(sup_test, Child2),
+ {ok, SupPid} = start_link({ok, {{one_for_all, 4, 3600}, []}}),
+ {ok, CPid1} = supervisor:start_child(sup_test, Child1),
+ {ok, CPid2} = supervisor:start_child(sup_test, Child2),
link(CPid2),
- CPid1 ! die,
- receive
- {'EXIT', CPid1, died} -> ok;
- {'EXIT', CPid1, Reason} ->
- ?line test_server:fail({bad_exit_reason, Reason})
- end,
- receive
- {'EXIT', CPid2, _} -> ok
- after
- 2000 -> ?line test_server:fail(all_not_terminated)
- end,
- receive
- {'EXIT', Pid, _} -> ok
- after
- 4000 -> ?line test_server:fail(supervisor_alive)
- end,
- ok.
-%-------------------------------------------------------------------------
-restart_simple_one_for_one(doc) ->
- ["Test that the simple_one_for_one strategy works."];
+ terminate(SupPid, CPid1, child1, abnormal),
+ check_exit([CPid2, SupPid]).
-restart_simple_one_for_one(suite) ->
- [simple_one_for_one, simple_one_for_one_extra,
- simple_one_for_one_escalation].
-%-------------------------------------------------------------------------
+%%-------------------------------------------------------------------------
simple_one_for_one(doc) ->
["Test the simple_one_for_one base case."];
simple_one_for_one(suite) -> [];
@@ -881,42 +728,31 @@ simple_one_for_one(Config) when is_list(Config) ->
process_flag(trap_exit, true),
Child = {child, {supervisor_1, start_child, []}, permanent, 1000,
worker, []},
- ?line {ok, Pid} = start({ok, {{simple_one_for_one, 2, 3600}, [Child]}}),
- ?line {ok, CPid1} = supervisor:start_child(sup_test, []),
- link(CPid1),
- ?line {ok, CPid2} = supervisor:start_child(sup_test, []),
- link(CPid2),
- CPid1 ! die,
- receive
- {'EXIT', CPid1, died} -> ok;
- {'EXIT', CPid1, Reason} ->
- ?line test_server:fail({bad_exit_reason, Reason})
- end,
- test_server:sleep(100),
+ {ok, SupPid} = start_link({ok, {{simple_one_for_one, 2, 3600}, [Child]}}),
+ {ok, CPid1} = supervisor:start_child(sup_test, []),
+ {ok, CPid2} = supervisor:start_child(sup_test, []),
+
+ terminate(SupPid, CPid1, child1, abnormal),
+
Children = supervisor:which_children(sup_test),
if length(Children) == 2 ->
case lists:keysearch(CPid2, 2, Children) of
{value, _} -> ok;
- _ -> ?line test_server:fail(bad_child)
+ _ -> test_server:fail(bad_child)
end;
- true -> ?line test_server:fail({bad_child_list, Children})
+ true -> test_server:fail({bad_child_list, Children})
end,
- ?line [1,2,0,2] = get_child_counts(sup_test),
+ [1,2,0,2] = get_child_counts(sup_test),
%% Test restart frequency property
- CPid2 ! die,
- receive
- {'EXIT', CPid2, _} -> ok
- end,
- test_server:sleep(100),
- [{_, Pid4, _, _}|_] = supervisor:which_children(sup_test),
- Pid4 ! die,
- receive
- {'EXIT', Pid, _} -> ok
- after 3000 -> ?line test_server:fail(restart_failed)
- end,
- ok.
-%-------------------------------------------------------------------------
+ terminate(SupPid, CPid2, child2, abnormal),
+
+ [{Id4, Pid4, _, _}|_] = supervisor:which_children(sup_test),
+
+ terminate(SupPid, Pid4, Id4, abnormal),
+ check_exit([SupPid]).
+
+%%-------------------------------------------------------------------------
simple_one_for_one_extra(doc) ->
["Tests automatic restart of children "
"who's start function return extra info."];
@@ -925,41 +761,26 @@ simple_one_for_one_extra(Config) when is_list(Config) ->
process_flag(trap_exit, true),
Child = {child, {supervisor_1, start_child, [extra_info]},
permanent, 1000, worker, []},
- ?line {ok, Pid} = start({ok, {{simple_one_for_one, 2, 3600}, [Child]}}),
- ?line {ok, CPid1, extra_info} = supervisor:start_child(sup_test, []),
- link(CPid1),
- ?line {ok, CPid2, extra_info} = supervisor:start_child(sup_test, []),
+ {ok, SupPid} = start_link({ok, {{simple_one_for_one, 2, 3600}, [Child]}}),
+ {ok, CPid1, extra_info} = supervisor:start_child(sup_test, []),
+ {ok, CPid2, extra_info} = supervisor:start_child(sup_test, []),
link(CPid2),
- CPid1 ! die,
- receive
- {'EXIT', CPid1, died} -> ok;
- {'EXIT', CPid1, Reason} ->
- ?line test_server:fail({bad_exit_reason, Reason})
- end,
- test_server:sleep(100),
+ terminate(SupPid, CPid1, child1, abnormal),
Children = supervisor:which_children(sup_test),
if length(Children) == 2 ->
case lists:keysearch(CPid2, 2, Children) of
{value, _} -> ok;
- _ -> ?line test_server:fail(bad_child)
+ _ -> test_server:fail(bad_child)
end;
- true -> ?line test_server:fail({bad_child_list, Children})
+ true -> test_server:fail({bad_child_list, Children})
end,
- ?line [1,2,0,2] = get_child_counts(sup_test),
+ [1,2,0,2] = get_child_counts(sup_test),
+ terminate(SupPid, CPid2, child2, abnormal),
+ [{Id4, Pid4, _, _}|_] = supervisor:which_children(sup_test),
+ terminate(SupPid, Pid4, Id4, abnormal),
+ check_exit([SupPid]).
- CPid2 ! die,
- receive
- {'EXIT', CPid2, _} -> ok
- end,
- test_server:sleep(100),
- [{_, Pid4, _, _}|_] = supervisor:which_children(sup_test),
- Pid4 ! die,
- receive
- {'EXIT', Pid, _} -> ok
- after 3000 -> ?line test_server:fail(restart_failed)
- end,
- ok.
-%-------------------------------------------------------------------------
+%%-------------------------------------------------------------------------
simple_one_for_one_escalation(doc) ->
["Test restart escalation on a simple_one_for_one supervisor."];
simple_one_for_one_escalation(suite) -> [];
@@ -967,34 +788,16 @@ simple_one_for_one_escalation(Config) when is_list(Config) ->
process_flag(trap_exit, true),
Child = {child, {supervisor_1, start_child, []}, permanent, 1000,
worker, []},
- ?line {ok, Pid} = start({ok, {{simple_one_for_one, 4, 3600}, [Child]}}),
- ?line {ok, CPid1} = supervisor:start_child(sup_test, [error]),
+ {ok, SupPid} = start_link({ok, {{simple_one_for_one, 4, 3600}, [Child]}}),
+ {ok, CPid1} = supervisor:start_child(sup_test, [error]),
link(CPid1),
- ?line {ok, CPid2} = supervisor:start_child(sup_test, []),
+ {ok, CPid2} = supervisor:start_child(sup_test, []),
link(CPid2),
- CPid1 ! die,
- receive
- {'EXIT', CPid1, died} -> ok;
- {'EXIT', CPid1, Reason} ->
- ?line test_server:fail({bad_exit_reason, Reason})
- end,
- receive
- {'EXIT', Pid, _} -> ok
- after
- 2000 -> ?line test_server:fail(supervisor_alive)
- end,
- receive
- {'EXIT', CPid2, _} -> ok
- after
- 2000 -> ?line test_server:fail(all_not_terminated)
- end,
- ok.
-%-------------------------------------------------------------------------
-restart_rest_for_one(doc) ->
- ["Test that the rest_for_one strategy works."];
-restart_rest_for_one(suite) -> [rest_for_one, rest_for_one_escalation].
-%-------------------------------------------------------------------------
+ terminate(SupPid, CPid1, child, abnormal),
+ check_exit([SupPid, CPid2]).
+
+%%-------------------------------------------------------------------------
rest_for_one(doc) ->
["Test the rest_for_one base case."];
rest_for_one(suite) -> [];
@@ -1006,70 +809,45 @@ rest_for_one(Config) when is_list(Config) ->
worker, []},
Child3 = {child3, {supervisor_1, start_child, []}, permanent, 1000,
worker, []},
- ?line {ok, Pid} = start({ok, {{rest_for_one, 2, 3600}, []}}),
- ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1),
+ {ok, SupPid} = start_link({ok, {{rest_for_one, 2, 3600}, []}}),
+ {ok, CPid1} = supervisor:start_child(sup_test, Child1),
link(CPid1),
- ?line {ok, CPid2} = supervisor:start_child(sup_test, Child2),
- link(CPid2),
- ?line {ok, CPid3} = supervisor:start_child(sup_test, Child3),
+ {ok, CPid2} = supervisor:start_child(sup_test, Child2),
+ {ok, CPid3} = supervisor:start_child(sup_test, Child3),
link(CPid3),
- ?line [3,3,0,3] = get_child_counts(sup_test),
+ [3,3,0,3] = get_child_counts(sup_test),
+
+ terminate(SupPid, CPid2, child2, abnormal),
- CPid2 ! die,
- receive
- {'EXIT', CPid2, died} -> ok;
- {'EXIT', CPid2, Reason} ->
- ?line test_server:fail({bad_exit_reason, Reason})
- after 2000 ->
- ?line test_server:fail(no_exit)
- end,
%% Check that Cpid3 did die
- receive
- {'EXIT', CPid3, _} -> ok
- after 2000 ->
- ?line test_server:fail(no_exit)
- end,
- %% Check that Cpid1 didn't die
- receive
- {'EXIT', CPid1, _} ->
- ?line test_server:fail(bad_exit)
- after
- 100 -> ok
- end,
+ check_exit([CPid3]),
+
Children = supervisor:which_children(sup_test),
- if length(Children) == 3 -> ok;
- true -> ?line test_server:fail({bad_child_list, Children})
+ is_in_child_list([CPid1], Children),
+
+ if length(Children) == 3 ->
+ ok;
+ true ->
+ test_server:fail({bad_child_list, Children})
end,
- ?line [3,3,0,3] = get_child_counts(sup_test),
+ [3,3,0,3] = get_child_counts(sup_test),
%% Test that no old children is still alive
- SCh = lists:map(fun({_,P,_,_}) -> P end, Children),
- case lists:member(CPid1, SCh) of
- true -> ok;
- false -> ?line test_server:fail(bad_child)
- end,
- case lists:member(CPid2, SCh) of
- true -> ?line test_server:fail(bad_child);
- false -> ok
- end,
- case lists:member(CPid3, SCh) of
- true -> ?line test_server:fail(bad_child);
- false -> ok
- end,
-
+ Pids = lists:map(fun({_,P,_,_}) -> P end, Children),
+ not_in_child_list([CPid2, CPid3], Pids),
+ in_child_list([CPid1], Pids),
+
%% Test restart frequency property
[{child3, Pid3, _, _}|_] = supervisor:which_children(sup_test),
- Pid3 ! die,
- test_server:sleep(100),
+
+ terminate(SupPid, Pid3, child3, abnormal),
+
[_,{child2, Pid4, _, _}|_] = supervisor:which_children(sup_test),
- Pid4 ! die,
- receive
- {'EXIT', Pid, _} -> ok
- after 3000 -> ?line test_server:fail(restart_failed)
- end,
- exit(Pid, shutdown).
-%-------------------------------------------------------------------------
+ terminate(SupPid, Pid4, child2, abnormal),
+ check_exit([SupPid]).
+
+%%-------------------------------------------------------------------------
rest_for_one_escalation(doc) ->
["Test restart escalation on a rest_for_one supervisor."];
rest_for_one_escalation(suite) -> [];
@@ -1080,42 +858,29 @@ rest_for_one_escalation(Config) when is_list(Config) ->
Child2 = {child2, {supervisor_1, start_child, [error]},
permanent, 1000,
worker, []},
- ?line {ok, Pid} = start({ok, {{rest_for_one, 4, 3600}, []}}),
- ?line {ok, CPid1} = supervisor:start_child(sup_test, Child1),
- link(CPid1),
- ?line {ok, CPid2} = supervisor:start_child(sup_test, Child2),
+ {ok, SupPid} = start_link({ok, {{rest_for_one, 4, 3600}, []}}),
+ {ok, CPid1} = supervisor:start_child(sup_test, Child1),
+ {ok, CPid2} = supervisor:start_child(sup_test, Child2),
link(CPid2),
- CPid1 ! die,
- receive
- {'EXIT', CPid1, died} -> ok;
- {'EXIT', CPid1, Reason} ->
- ?line test_server:fail({bad_exit_reason, Reason})
- end,
- receive
- {'EXIT', CPid2, _} -> ok
- after
- 2000 -> ?line test_server:fail(not_terminated)
- end,
- receive
- {'EXIT', Pid, _} -> ok
- after
- 4000 -> ?line test_server:fail(supervisor_alive)
- end,
- ok.
-%-------------------------------------------------------------------------
-child_unlink(doc)-> ["Test that the supervisor does not hang forever if "
- "the child unliks and then is terminated by the supervisor."];
-child_unlink(suite) -> [];
+ terminate(SupPid, CPid1, child1, abnormal),
+ check_exit([CPid2, SupPid]).
+
+%%-------------------------------------------------------------------------
+child_unlink(doc)->
+ ["Test that the supervisor does not hang forever if "
+ "the child unliks and then is terminated by the supervisor."];
+child_unlink(suite) ->
+ [];
child_unlink(Config) when is_list(Config) ->
-
- ?line {ok, SupPid} = start({ok, {{one_for_one, 2, 3600}, []}}),
-
+
+ {ok, SupPid} = start_link({ok, {{one_for_one, 2, 3600}, []}}),
+
Child = {naughty_child, {naughty_child,
start_link, [SupPid]}, permanent,
1000, worker, [supervisor_SUITE]},
-
- ?line {ok, _ChildPid} = supervisor:start_child(sup_test, Child),
+
+ {ok, _ChildPid} = supervisor:start_child(sup_test, Child),
Pid = spawn(supervisor, terminate_child, [SupPid, naughty_child]),
@@ -1128,17 +893,16 @@ child_unlink(Config) when is_list(Config) ->
ok;
_ ->
exit(Pid, kill),
- ?line test_server:fail(supervisor_hangs)
+ test_server:fail(supervisor_hangs)
end.
-%-------------------------------------------------------------------------
-
+%%-------------------------------------------------------------------------
tree(doc) ->
["Test a basic supervison tree."];
tree(suite) ->
[];
tree(Config) when is_list(Config) ->
process_flag(trap_exit, true),
-
+
Child1 = {child1, {supervisor_1, start_child, []},
permanent, 1000,
worker, []},
@@ -1164,134 +928,63 @@ tree(Config) when is_list(Config) ->
supervisor, []},
%% Top supervisor
- ?line {ok, Pid} = start({ok, {{one_for_all, 4, 3600}, []}}),
-
+ {ok, SupPid} = start_link({ok, {{one_for_all, 4, 3600}, []}}),
+
%% Child supervisors
- ?line {ok, Sup1} = supervisor:start_child(Pid, ChildSup1),
- ?line {ok, Sup2} = supervisor:start_child(Pid, ChildSup2),
- ?line [2,2,2,0] = get_child_counts(Pid),
-
+ {ok, Sup1} = supervisor:start_child(SupPid, ChildSup1),
+ {ok, Sup2} = supervisor:start_child(SupPid, ChildSup2),
+ [2,2,2,0] = get_child_counts(SupPid),
+
%% Workers
- ?line [{_, CPid2, _, _},{_, CPid1, _, _}] =
+ [{_, CPid2, _, _},{_, CPid1, _, _}] =
supervisor:which_children(Sup1),
- ?line [2,2,0,2] = get_child_counts(Sup1),
- ?line [0,0,0,0] = get_child_counts(Sup2),
-
+ [2,2,0,2] = get_child_counts(Sup1),
+ [0,0,0,0] = get_child_counts(Sup2),
+
%% Dynamic children
- ?line {ok, CPid3} = supervisor:start_child(Sup2, Child3),
- ?line {ok, CPid4} = supervisor:start_child(Sup2, Child4),
- ?line [2,2,0,2] = get_child_counts(Sup1),
- ?line [2,2,0,2] = get_child_counts(Sup2),
-
- link(Sup1),
- link(Sup2),
- link(CPid1),
- link(CPid2),
- link(CPid3),
- link(CPid4),
-
+ {ok, CPid3} = supervisor:start_child(Sup2, Child3),
+ {ok, CPid4} = supervisor:start_child(Sup2, Child4),
+ [2,2,0,2] = get_child_counts(Sup1),
+ [2,2,0,2] = get_child_counts(Sup2),
+
%% Test that the only the process that dies is restarted
- CPid4 ! die,
-
- receive
- {'EXIT', CPid4, _} -> ?line ok
- after 10000 ->
- ?line test_server:fail(child_was_not_killed)
- end,
-
- test_server:sleep(100),
-
- ?line [{_, CPid2, _, _},{_, CPid1, _, _}] =
+ terminate(Sup2, CPid4, child4, abnormal),
+
+ [{_, CPid2, _, _},{_, CPid1, _, _}] =
supervisor:which_children(Sup1),
- ?line [2,2,0,2] = get_child_counts(Sup1),
-
- ?line [{_, NewCPid4, _, _},{_, CPid3, _, _}] =
+ [2,2,0,2] = get_child_counts(Sup1),
+
+ [{_, NewCPid4, _, _},{_, CPid3, _, _}] =
supervisor:which_children(Sup2),
- ?line [2,2,0,2] = get_child_counts(Sup2),
-
- link(NewCPid4),
+ [2,2,0,2] = get_child_counts(Sup2),
+
+ false = NewCPid4 == CPid4,
%% Test that supervisor tree is restarted, but not dynamic children.
- CPid3 ! die,
+ terminate(Sup2, CPid3, child3, abnormal),
- receive
- {'EXIT', CPid3, died} -> ?line ok;
- {'EXIT', CPid3, Reason} ->
- ?line test_server:fail({bad_exit_reason, Reason})
- after 1000 ->
- ?line test_server:fail(child_was_not_killed)
- end,
+ timer:sleep(1000),
- test_server:sleep(1000),
+ [{supchild2, NewSup2, _, _},{supchild1, NewSup1, _, _}] =
+ supervisor:which_children(SupPid),
+ [2,2,2,0] = get_child_counts(SupPid),
- receive
- {'EXIT', NewCPid4, _} -> ?line ok
- after 1000 ->
- ?line test_server:fail(child_was_not_killed)
- end,
-
- receive
- {'EXIT', Sup2, _} -> ?line ok
- after 1000 ->
- ?line test_server:fail(child_was_not_killed)
- end,
-
- receive
- {'EXIT', CPid1, _} -> ?line ok
- after 1000 ->
- ?line test_server:fail(child_was_not_killed)
- end,
-
- receive
- {'EXIT', CPid2, _} -> ?line ok
- after 1000 ->
- ?line test_server:fail(child_was_not_killed)
- end,
-
- receive
- {'EXIT', Sup1, _} -> ?line ok
- after 1000 ->
- ?line test_server:fail(child_was_not_killed)
- end,
-
- ?line [{supchild2, NewSup2, _, _},{supchild1, NewSup1, _, _}] =
- supervisor:which_children(Pid),
- ?line [2,2,2,0] = get_child_counts(Pid),
-
- ?line [{child2, _, _, _},{child1, _, _, _}] =
+ [{child2, _, _, _},{child1, _, _, _}] =
supervisor:which_children(NewSup1),
- ?line [2,2,0,2] = get_child_counts(NewSup1),
-
- ?line [] = supervisor:which_children(NewSup2),
- ?line [0,0,0,0] = get_child_counts(NewSup2),
-
- ok.
-%-------------------------------------------------------------------------
-count_children_allocator_test(MemoryState) ->
- Allocators = [temp_alloc, eheap_alloc, binary_alloc, ets_alloc,
- driver_alloc, sl_alloc, ll_alloc, fix_alloc, std_alloc,
- sys_alloc],
- MemoryStateList = element(4, MemoryState),
- AllocTypes = [lists:keyfind(Alloc, 1, MemoryStateList)
- || Alloc <- Allocators],
- AllocStates = [lists:keyfind(e, 1, AllocValue)
- || {_Type, AllocValue} <- AllocTypes],
- lists:all(fun(State) -> State == {e, true} end, AllocStates).
+ [2,2,0,2] = get_child_counts(NewSup1),
+ [] = supervisor:which_children(NewSup2),
+ [0,0,0,0] = get_child_counts(NewSup2).
+%%-------------------------------------------------------------------------
count_children_memory(doc) ->
- ["Test that which_children eats memory, but count_children does not."];
+ ["Test that count_children does not eat memory."];
count_children_memory(suite) ->
- MemoryState = erlang:system_info(allocator),
- case count_children_allocator_test(MemoryState) of
- true -> [];
- false ->
- {skip, "+Meamin used during test; erlang:memory/1 not available"}
- end;
+ [];
count_children_memory(Config) when is_list(Config) ->
process_flag(trap_exit, true),
Child = {child, {supervisor_1, start_child, []}, temporary, 1000,
worker, []},
- ?line {ok, _Pid} = start({ok, {{simple_one_for_one, 2, 3600}, [Child]}}),
+ {ok, SupPid} = start_link({ok, {{simple_one_for_one, 2, 3600}, [Child]}}),
[supervisor:start_child(sup_test, []) || _Ignore <- lists:seq(1,1000)],
garbage_collect(),
@@ -1299,7 +992,7 @@ count_children_memory(Config) when is_list(Config) ->
Children = supervisor:which_children(sup_test),
_Size2 = erlang:memory(processes_used),
ChildCount = get_child_counts(sup_test),
- Size3 = erlang:memory(processes_used),
+ _Size3 = erlang:memory(processes_used),
[supervisor:start_child(sup_test, []) || _Ignore2 <- lists:seq(1,1000)],
@@ -1315,40 +1008,318 @@ count_children_memory(Config) when is_list(Config) ->
ChildCount3 = get_child_counts(sup_test),
Size7 = erlang:memory(processes_used),
- ?line 1000 = length(Children),
- ?line [1,1000,0,1000] = ChildCount,
- ?line 2000 = length(Children2),
- ?line [1,2000,0,2000] = ChildCount2,
- ?line Children3 = Children2,
- ?line ChildCount3 = ChildCount2,
+ 1000 = length(Children),
+ [1,1000,0,1000] = ChildCount,
+ 2000 = length(Children2),
+ [1,2000,0,2000] = ChildCount2,
+ Children3 = Children2,
+ ChildCount3 = ChildCount2,
%% count_children consumes memory using an accumulator function,
- %% but the space can be reclaimed incrementally, whereas
- %% which_children generates a return list.
+ %% but the space can be reclaimed incrementally,
+ %% which_children may generate garbage that will be reclaimed later.
case (Size5 =< Size4) of
true -> ok;
false ->
- ?line test_server:fail({count_children, used_more_memory})
+ test_server:fail({count_children, used_more_memory})
end,
case Size7 =< Size6 of
true -> ok;
false ->
- ?line test_server:fail({count_children, used_more_memory})
+ test_server:fail({count_children, used_more_memory})
end,
- case Size4 > Size3 of
- true -> ok;
+ [terminate(SupPid, Pid, child, kill) || {undefined, Pid, worker, _Modules} <- Children3],
+ [1,0,0,0] = get_child_counts(sup_test).
+
+count_children_allocator_test(MemoryState) ->
+ Allocators = [temp_alloc, eheap_alloc, binary_alloc, ets_alloc,
+ driver_alloc, sl_alloc, ll_alloc, fix_alloc, std_alloc,
+ sys_alloc],
+ MemoryStateList = element(4, MemoryState),
+ AllocTypes = [lists:keyfind(Alloc, 1, MemoryStateList)
+ || Alloc <- Allocators],
+ AllocStates = [lists:keyfind(e, 1, AllocValue)
+ || {_Type, AllocValue} <- AllocTypes],
+ lists:all(fun(State) -> State == {e, true} end, AllocStates).
+
+%%-------------------------------------------------------------------------
+do_not_save_start_parameters_for_temporary_children(doc) ->
+ ["Temporary children shall not be restarted so they should not "
+ "save start parameters, as it potentially can "
+ "take up a huge amount of memory for no purpose."];
+do_not_save_start_parameters_for_temporary_children(suite) ->
+ [];
+do_not_save_start_parameters_for_temporary_children(Config) when is_list(Config) ->
+ process_flag(trap_exit, true),
+ dont_save_start_parameters_for_temporary_children(one_for_all),
+ dont_save_start_parameters_for_temporary_children(one_for_one),
+ dont_save_start_parameters_for_temporary_children(rest_for_one),
+ dont_save_start_parameters_for_temporary_children(simple_one_for_one).
+
+start_children(_,_, 0) ->
+ ok;
+start_children(Sup, Args, N) ->
+ Spec = child_spec(Args, N),
+ {ok, _, _} = supervisor:start_child(Sup, Spec),
+ start_children(Sup, Args, N-1).
+
+child_spec([_|_] = SimpleOneForOneArgs, _) ->
+ SimpleOneForOneArgs;
+child_spec({Name, MFA, RestartType, Shutdown, Type, Modules}, N) ->
+ NewName = list_to_atom((atom_to_list(Name) ++ integer_to_list(N))),
+ {NewName, MFA, RestartType, Shutdown, Type, Modules}.
+
+%%-------------------------------------------------------------------------
+do_not_save_child_specs_for_temporary_children(doc) ->
+ ["Temporary children shall not be restarted so supervisors should "
+ "not save their spec when they terminate"];
+do_not_save_child_specs_for_temporary_children(suite) ->
+ [];
+do_not_save_child_specs_for_temporary_children(Config) when is_list(Config) ->
+ process_flag(trap_exit, true),
+ dont_save_child_specs_for_temporary_children(one_for_all, kill),
+ dont_save_child_specs_for_temporary_children(one_for_one, kill),
+ dont_save_child_specs_for_temporary_children(rest_for_one, kill),
+
+ dont_save_child_specs_for_temporary_children(one_for_all, normal),
+ dont_save_child_specs_for_temporary_children(one_for_one, normal),
+ dont_save_child_specs_for_temporary_children(rest_for_one, normal),
+
+ dont_save_child_specs_for_temporary_children(one_for_all, abnormal),
+ dont_save_child_specs_for_temporary_children(one_for_one, abnormal),
+ dont_save_child_specs_for_temporary_children(rest_for_one, abnormal),
+
+ dont_save_child_specs_for_temporary_children(one_for_all, supervisor),
+ dont_save_child_specs_for_temporary_children(one_for_one, supervisor),
+ dont_save_child_specs_for_temporary_children(rest_for_one, supervisor).
+
+%%-------------------------------------------------------------------------
+dont_save_start_parameters_for_temporary_children(simple_one_for_one = Type) ->
+ Permanent = {child, {supervisor_1, start_child, []},
+ permanent, 1000, worker, []},
+ Transient = {child, {supervisor_1, start_child, []},
+ transient, 1000, worker, []},
+ Temporary = {child, {supervisor_1, start_child, []},
+ temporary, 1000, worker, []},
+ {ok, Sup1} = supervisor:start_link(?MODULE, {ok, {{Type, 2, 3600}, [Permanent]}}),
+ {ok, Sup2} = supervisor:start_link(?MODULE, {ok, {{Type, 2, 3600}, [Transient]}}),
+ {ok, Sup3} = supervisor:start_link(?MODULE, {ok, {{Type, 2, 3600}, [Temporary]}}),
+
+ LargeList = lists:duplicate(10, "Potentially large"),
+
+ start_children(Sup1, [LargeList], 100),
+ start_children(Sup2, [LargeList], 100),
+ start_children(Sup3, [LargeList], 100),
+
+ [{memory,Mem1}] = process_info(Sup1, [memory]),
+ [{memory,Mem2}] = process_info(Sup2, [memory]),
+ [{memory,Mem3}] = process_info(Sup3, [memory]),
+
+ true = (Mem3 < Mem1) and (Mem3 < Mem2),
+
+ terminate(Sup1, shutdown),
+ terminate(Sup2, shutdown),
+ terminate(Sup3, shutdown);
+
+dont_save_start_parameters_for_temporary_children(Type) ->
+ {ok, Sup1} = supervisor:start_link(?MODULE, {ok, {{Type, 2, 3600}, []}}),
+ {ok, Sup2} = supervisor:start_link(?MODULE, {ok, {{Type, 2, 3600}, []}}),
+ {ok, Sup3} = supervisor:start_link(?MODULE, {ok, {{Type, 2, 3600}, []}}),
+
+ LargeList = lists:duplicate(10, "Potentially large"),
+
+ Permanent = {child1, {supervisor_1, start_child, [LargeList]},
+ permanent, 1000, worker, []},
+ Transient = {child2, {supervisor_1, start_child, [LargeList]},
+ transient, 1000, worker, []},
+ Temporary = {child3, {supervisor_1, start_child, [LargeList]},
+ temporary, 1000, worker, []},
+
+ start_children(Sup1, Permanent, 100),
+ start_children(Sup2, Transient, 100),
+ start_children(Sup3, Temporary, 100),
+
+ [{memory,Mem1}] = process_info(Sup1, [memory]),
+ [{memory,Mem2}] = process_info(Sup2, [memory]),
+ [{memory,Mem3}] = process_info(Sup3, [memory]),
+
+ true = (Mem3 < Mem1) and (Mem3 < Mem2),
+
+ terminate(Sup1, shutdown),
+ terminate(Sup2, shutdown),
+ terminate(Sup3, shutdown).
+
+dont_save_child_specs_for_temporary_children(Type, TerminateHow)->
+ {ok, Sup} =
+ supervisor:start_link(?MODULE, {ok, {{Type, 2, 3600}, []}}),
+
+ Permanent = {child1, {supervisor_1, start_child, []},
+ permanent, 1000, worker, []},
+ Transient = {child2, {supervisor_1, start_child, []},
+ transient, 1000, worker, []},
+ Temporary = {child3, {supervisor_1, start_child, []},
+ temporary, 1000, worker, []},
+
+ permanent_child_spec_saved(Permanent, Sup, TerminateHow),
+
+ transient_child_spec_saved(Transient, Sup, TerminateHow),
+
+ temporary_child_spec_not_saved(Temporary, Sup, TerminateHow),
+
+ terminate(Sup, shutdown).
+
+permanent_child_spec_saved(ChildSpec, Sup, supervisor = TerminateHow) ->
+ already_present(Sup, ChildSpec, TerminateHow);
+
+permanent_child_spec_saved(ChildSpec, Sup, TerminateHow) ->
+ restarted(Sup, ChildSpec, TerminateHow).
+
+transient_child_spec_saved(ChildSpec, Sup, supervisor = TerminateHow) ->
+ already_present(Sup, ChildSpec, TerminateHow);
+
+transient_child_spec_saved(ChildSpec, Sup, normal = TerminateHow) ->
+ already_present(Sup, ChildSpec, TerminateHow);
+
+transient_child_spec_saved(ChildSpec, Sup, TerminateHow) ->
+ restarted(Sup, ChildSpec, TerminateHow).
+
+temporary_child_spec_not_saved({Id, _,_,_,_,_} = ChildSpec, Sup, TerminateHow) ->
+ {ok, Pid} = supervisor:start_child(Sup, ChildSpec),
+ terminate(Sup, Pid, Id, TerminateHow),
+ {ok, _} = supervisor:start_child(Sup, ChildSpec).
+
+already_present(Sup, {Id,_,_,_,_,_} = ChildSpec, TerminateHow) ->
+ {ok, Pid} = supervisor:start_child(Sup, ChildSpec),
+ terminate(Sup, Pid, Id, TerminateHow),
+ {error, already_present} = supervisor:start_child(Sup, ChildSpec),
+ {ok, _} = supervisor:restart_child(Sup, Id).
+
+restarted(Sup, {Id,_,_,_,_,_} = ChildSpec, TerminateHow) ->
+ {ok, Pid} = supervisor:start_child(Sup, ChildSpec),
+ terminate(Sup, Pid, Id, TerminateHow),
+ %% Permanent processes will be restarted by the supervisor
+ %% when not terminated by api
+ {error, {already_started, _}} = supervisor:start_child(Sup, ChildSpec).
+
+
+%%-------------------------------------------------------------------------
+%% OTP-9242: Pids for dynamic temporary children were saved as a list,
+%% which caused bad scaling when adding/deleting many processes.
+simple_one_for_one_scale_many_temporary_children(_Config) ->
+ process_flag(trap_exit, true),
+ Child = {child, {supervisor_1, start_child, []}, temporary, 1000,
+ worker, []},
+ {ok, _SupPid} = start_link({ok, {{simple_one_for_one, 2, 3600}, [Child]}}),
+
+ C1 = [begin
+ {ok,P} = supervisor:start_child(sup_test,[]),
+ P
+ end || _<- lists:seq(1,1000)],
+ {T1,done} = timer:tc(?MODULE,terminate_all_children,[C1]),
+
+ C2 = [begin
+ {ok,P} = supervisor:start_child(sup_test,[]),
+ P
+ end || _<- lists:seq(1,10000)],
+ {T2,done} = timer:tc(?MODULE,terminate_all_children,[C2]),
+
+ Scaling = T2 div T1,
+ if Scaling > 20 ->
+ %% The scaling shoul be linear (i.e.10, really), but we
+ %% give some extra here to avoid failing the test
+ %% unecessarily.
+ ?t:fail({bad_scaling,Scaling});
+ true ->
+ ok
+ end.
+
+
+terminate_all_children([C|Cs]) ->
+ ok = supervisor:terminate_child(sup_test,C),
+ terminate_all_children(Cs);
+terminate_all_children([]) ->
+ done.
+
+
+
+%%-------------------------------------------------------------------------
+terminate(Pid, Reason) when Reason =/= supervisor ->
+ terminate(dummy, Pid, dummy, Reason).
+
+terminate(Sup, _, ChildId, supervisor) ->
+ ok = supervisor:terminate_child(Sup, ChildId);
+terminate(_, ChildPid, _, kill) ->
+ Ref = erlang:monitor(process, ChildPid),
+ exit(ChildPid, kill),
+ receive
+ {'DOWN', Ref, process, ChildPid, killed} ->
+ ok
+ end;
+terminate(_, ChildPid, _, shutdown) ->
+ Ref = erlang:monitor(process, ChildPid),
+ exit(ChildPid, shutdown),
+ receive
+ {'DOWN', Ref, process, ChildPid, shutdown} ->
+ ok
+ end;
+terminate(_, ChildPid, _, normal) ->
+ Ref = erlang:monitor(process, ChildPid),
+ ChildPid ! stop,
+ receive
+ {'DOWN', Ref, process, ChildPid, normal} ->
+ ok
+ end;
+terminate(_, ChildPid, _,abnormal) ->
+ Ref = erlang:monitor(process, ChildPid),
+ ChildPid ! die,
+ receive
+ {'DOWN', Ref, process, ChildPid, died} ->
+ ok
+ end.
+
+in_child_list([], _) ->
+ true;
+in_child_list([Pid | Rest], Pids) ->
+ case is_in_child_list(Pid, Pids) of
+ true ->
+ in_child_list(Rest, Pids);
false ->
- ?line test_server:fail({which_children, used_no_memory})
- end,
- case Size6 > Size5 of
- true -> ok;
+ test_server:fail(child_should_be_alive)
+ end.
+not_in_child_list([], _) ->
+ true;
+not_in_child_list([Pid | Rest], Pids) ->
+ case is_in_child_list(Pid, Pids) of
+ true ->
+ test_server:fail(child_should_not_be_alive);
false ->
- ?line test_server:fail({which_children, used_no_memory})
- end,
+ not_in_child_list(Rest, Pids)
+ end.
- [exit(Pid, kill) || {undefined, Pid, worker, _Modules} <- Children3],
- test_server:sleep(100),
- ?line [1,0,0,0] = get_child_counts(sup_test),
+is_in_child_list(Pid, ChildPids) ->
+ lists:member(Pid, ChildPids).
- ok.
+check_exit([]) ->
+ ok;
+check_exit([Pid | Pids]) ->
+ receive
+ {'EXIT', Pid, _} ->
+ check_exit(Pids)
+ end.
+
+check_exit_reason(Reason) ->
+ receive
+ {'EXIT', _, Reason} ->
+ ok;
+ {'EXIT', _, Else} ->
+ test_server:fail({bad_exit_reason, Else})
+ end.
+
+check_exit_reason(Pid, Reason) ->
+ receive
+ {'EXIT', Pid, Reason} ->
+ ok;
+ {'EXIT', Pid, Else} ->
+ test_server:fail({bad_exit_reason, Else})
+ end.
diff --git a/lib/stdlib/test/supervisor_bridge_SUITE.erl b/lib/stdlib/test/supervisor_bridge_SUITE.erl
index b23bac2d44..f2dbad0b3b 100644
--- a/lib/stdlib/test/supervisor_bridge_SUITE.erl
+++ b/lib/stdlib/test/supervisor_bridge_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -17,16 +17,37 @@
%% %CopyrightEnd%
%%
-module(supervisor_bridge_SUITE).
--export([all/1,starting/1,mini_terminate/1,mini_die/1,badstart/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,starting/1,
+ mini_terminate/1,mini_die/1,badstart/1]).
-export([client/1,init/1,internal_loop_init/1,terminate/2]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(bridge_name,supervisor_bridge_SUITE_server).
-define(work_bridge_name,work_supervisor_bridge_SUITE_server).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all(suite) -> [starting,mini_terminate,mini_die,badstart].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [starting, mini_terminate, mini_die, badstart].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/stdlib/test/sys_SUITE.erl b/lib/stdlib/test/sys_SUITE.erl
index e44fd56403..72b089aa3f 100644
--- a/lib/stdlib/test/sys_SUITE.erl
+++ b/lib/stdlib/test/sys_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -17,9 +17,11 @@
%% %CopyrightEnd%
%%
-module(sys_SUITE).
--export([all/1,log/1,log_to_file/1,stats/1,trace/1,suspend/1,install/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,log/1,log_to_file/1,
+ stats/1,trace/1,suspend/1,install/1]).
-export([handle_call/3,terminate/2,init/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(server,sys_SUITE_server).
@@ -29,7 +31,26 @@
%% system messages at all.
-all(suite) -> [log,log_to_file,stats,trace,suspend,install].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [log, log_to_file, stats, trace, suspend, install].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/stdlib/test/tar_SUITE.erl b/lib/stdlib/test/tar_SUITE.erl
index 7646f4c249..e32704ca65 100644
--- a/lib/stdlib/test/tar_SUITE.erl
+++ b/lib/stdlib/test/tar_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -18,21 +18,39 @@
%%
-module(tar_SUITE).
--export([all/1, borderline/1, atomic/1, long_names/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, borderline/1, atomic/1, long_names/1,
create_long_names/1, bad_tar/1, errors/1, extract_from_binary/1,
extract_from_binary_compressed/1,
extract_from_open_file/1, symlinks/1, open_add_close/1, cooked_compressed/1,
memory/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("kernel/include/file.hrl").
-all(suite) -> [borderline, atomic, long_names, create_long_names,
- bad_tar, errors,
- extract_from_binary, extract_from_binary_compressed,
- extract_from_open_file,
- symlinks, open_add_close, cooked_compressed,
- memory].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [borderline, atomic, long_names, create_long_names,
+ bad_tar, errors, extract_from_binary,
+ extract_from_binary_compressed, extract_from_open_file,
+ symlinks, open_add_close, cooked_compressed, memory].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
borderline(doc) ->
["Test creating, listing and extracting one file from an archive",
diff --git a/lib/stdlib/test/timer_SUITE.erl b/lib/stdlib/test/timer_SUITE.erl
index 5f38c91c64..f84c72b0f8 100644
--- a/lib/stdlib/test/timer_SUITE.erl
+++ b/lib/stdlib/test/timer_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -18,12 +18,12 @@
%%
-module(timer_SUITE).
--export([all/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([do_big_test/1]).
-export([big_test/1, collect/3, i_t/3, a_t/2]).
-export([do_nrev/1, internal_watchdog/2]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% Test suite for timer module. This is a really nasty test it runs a
%% lot of timeouts and then checks in the end if any of them was
@@ -51,7 +51,26 @@
%% amount of load. The test suite should also include tests that test the
%% interface of the timer module.
-all(suite) -> [do_big_test].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [do_big_test].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% ------------------------------------------------------- %%
diff --git a/lib/stdlib/test/timer_simple_SUITE.erl b/lib/stdlib/test/timer_simple_SUITE.erl
index 6aa2b7b945..dc751aad16 100644
--- a/lib/stdlib/test/timer_simple_SUITE.erl
+++ b/lib/stdlib/test/timer_simple_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -21,7 +21,8 @@
-module(timer_simple_SUITE).
%% external
--export([all/1,
+-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,
apply_after/1,
send_after1/1,
@@ -49,31 +50,35 @@
timer/4,
timer/5]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(MAXREF, (1 bsl 18)).
-define(REFMARG, 30).
-all(doc) -> "Test of the timer module.";
-all(suite) ->
- [apply_after,
- send_after1,
- send_after2,
- send_after3,
- exit_after1,
- exit_after2,
- kill_after1,
- kill_after2,
- apply_interval,
- send_interval1,
- send_interval2,
- send_interval3,
- send_interval4,
- cancel1,
- cancel2,
- tc,
- unique_refs,
- timer_perf].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [apply_after, send_after1, send_after2, send_after3,
+ exit_after1, exit_after2, kill_after1, kill_after2,
+ apply_interval, send_interval1, send_interval2,
+ send_interval3, send_interval4, cancel1, cancel2, tc,
+ unique_refs, timer_perf].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init_per_testcase(_, Config) when is_list(Config) ->
timer:start(),
@@ -224,7 +229,7 @@ cancel2(Config) when is_list(Config) ->
tc(doc) -> "Test sleep/1 and tc/3.";
tc(suite) -> [];
tc(Config) when is_list(Config) ->
- % This should both sleep and tc/3
+ %% This should test both sleep and tc/3
?line {Res1, ok} = timer:tc(timer, sleep, [500]),
?line ok = if
Res1 < 500*1000 -> {too_early, Res1}; % Too early
@@ -232,13 +237,40 @@ tc(Config) when is_list(Config) ->
true -> ok
end,
- % This should both sleep and tc/2
+ %% tc/2
?line {Res2, ok} = timer:tc(fun(T) -> timer:sleep(T) end, [500]),
?line ok = if
Res2 < 500*1000 -> {too_early, Res2}; % Too early
Res2 > 800*1000 -> {too_late, Res2}; % Too much time
true -> ok
end,
+
+ %% tc/1
+ ?line {Res3, ok} = timer:tc(fun() -> timer:sleep(500) end),
+ ?line ok = if
+ Res3 < 500*1000 -> {too_early, Res3}; % Too early
+ Res3 > 800*1000 -> {too_late, Res3}; % Too much time
+ true -> ok
+ end,
+
+ %% Check that timer:tc don't catch errors
+ ?line ok = try timer:tc(erlang, exit, [foo])
+ catch exit:foo -> ok
+ end,
+
+ ?line ok = try timer:tc(fun(Reason) -> 1 = Reason end, [foo])
+ catch error:{badmatch,_} -> ok
+ end,
+
+ ?line ok = try timer:tc(fun() -> throw(foo) end)
+ catch foo -> ok
+ end,
+
+ %% Check that return values are propageted
+ Self = self(),
+ ?line {_, Self} = timer:tc(erlang, self, []),
+ ?line {_, Self} = timer:tc(fun(P) -> P end, [self()]),
+ ?line {_, Self} = timer:tc(fun() -> self() end),
?line Sec = timer:seconds(4),
?line Min = timer:minutes(4),
diff --git a/lib/stdlib/test/unicode_SUITE.erl b/lib/stdlib/test/unicode_SUITE.erl
index 141ac64606..9aa800209d 100644
--- a/lib/stdlib/test/unicode_SUITE.erl
+++ b/lib/stdlib/test/unicode_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -18,11 +18,12 @@
%%
-module(unicode_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,
+-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,
- fin_per_testcase/2,
+ end_per_testcase/2,
utf8_illegal_sequences_bif/1,
utf16_illegal_sequences_bif/1,
random_lists/1,
@@ -34,12 +35,32 @@ init_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
Dog=?t:timetrap(?t:minutes(20)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog).
-all(suite) ->
- [utf8_illegal_sequences_bif,utf16_illegal_sequences_bif,random_lists,roundtrips,latin1,exceptions].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [utf8_illegal_sequences_bif,
+ utf16_illegal_sequences_bif, random_lists, roundtrips,
+ latin1, exceptions].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
exceptions(Config) when is_list(Config) ->
diff --git a/lib/stdlib/test/win32reg_SUITE.erl b/lib/stdlib/test/win32reg_SUITE.erl
index c8cc82f61e..d3984ba67c 100644
--- a/lib/stdlib/test/win32reg_SUITE.erl
+++ b/lib/stdlib/test/win32reg_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -18,22 +18,34 @@
%%
-module(win32reg_SUITE).
--export([all/1,long/1,evil_write/1]).
--export([ostype/1,fini/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,long/1,evil_write/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-all(suite) ->
- [{conf,ostype,[long,evil_write],fini}].
+suite() -> [{ct_hooks,[ts_install_cth]}].
-ostype(Config) when is_list(Config) ->
+all() ->
+ [long, evil_write].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+init_per_suite(Config) when is_list(Config) ->
case os:type() of
{win32, _} ->
Config;
_ ->
{skip,"Doesn't run on UNIX."}
end.
-fini(Config) when is_list(Config) ->
+end_per_suite(Config) when is_list(Config) ->
Config.
long(doc) -> "Test long keys and entries (OTP-3446).";
diff --git a/lib/stdlib/test/y2k_SUITE.erl b/lib/stdlib/test/y2k_SUITE.erl
index a574d5e36e..d4d0721abf 100644
--- a/lib/stdlib/test/y2k_SUITE.erl
+++ b/lib/stdlib/test/y2k_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -21,30 +21,38 @@
-module(y2k_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,
date_1999_01_01/1, date_1999_02_28/1,
date_1999_09_09/1, date_2000_01_01/1,
date_2000_02_29/1, date_2001_01_01/1,
date_2001_02_29/1, date_2004_02_29/1
]).
-all(doc) ->
- "This is the test suite for year 2000. Eight dates according "
- "to Ericsson Corporate Millennium Test Specification "
- "(LME/DT-98:1097 are tested.";
-
-all(suite) ->
- [date_1999_01_01,
- date_1999_02_28,
- date_1999_09_09,
- date_2000_01_01,
- date_2000_02_29,
- date_2001_01_01,
- date_2001_02_29,
- date_2004_02_29
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [date_1999_01_01, date_1999_02_28, date_1999_09_09,
+ date_2000_01_01, date_2000_02_29, date_2001_01_01,
+ date_2001_02_29, date_2004_02_29].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
date_1999_01_01(doc) ->
"#1 : 1999-01-01: test roll-over from 1998-12-31 to 1999-01-01.";
diff --git a/lib/stdlib/test/zip_SUITE.erl b/lib/stdlib/test/zip_SUITE.erl
index 48b14396c1..d5f2cd52d4 100644
--- a/lib/stdlib/test/zip_SUITE.erl
+++ b/lib/stdlib/test/zip_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2011. 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
@@ -18,7 +18,8 @@
%%
-module(zip_SUITE).
--export([all/1, borderline/1, atomic/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, borderline/1, atomic/1,
bad_zip/1, unzip_from_binary/1, unzip_to_binary/1,
zip_to_binary/1,
unzip_options/1, zip_options/1, list_dir_options/1, aliases/1,
@@ -26,18 +27,34 @@
compress_control/1,
foldl/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include("test_server_line.hrl").
-include_lib("kernel/include/file.hrl").
-include_lib("stdlib/include/zip.hrl").
-all(suite) -> [borderline, atomic, bad_zip,
- unzip_from_binary, unzip_to_binary,
- zip_to_binary,
- unzip_options, zip_options, list_dir_options, aliases,
- openzip_api, zip_api, unzip_jar,
- compress_control,
- foldl].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [borderline, atomic, bad_zip, unzip_from_binary,
+ unzip_to_binary, zip_to_binary, unzip_options,
+ zip_options, list_dir_options, aliases, openzip_api,
+ zip_api, unzip_jar, compress_control, foldl].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
borderline(doc) ->
["Test creating, listing and extracting one file from an archive "
diff --git a/lib/stdlib/vsn.mk b/lib/stdlib/vsn.mk
index ac02e1f359..c0956030cf 100644
--- a/lib/stdlib/vsn.mk
+++ b/lib/stdlib/vsn.mk
@@ -1 +1 @@
-STDLIB_VSN = 1.17.3
+STDLIB_VSN = 1.17.4
diff --git a/lib/syntax_tools/src/erl_recomment.erl b/lib/syntax_tools/src/erl_recomment.erl
index 919e9cfc5d..fc7c515700 100644
--- a/lib/syntax_tools/src/erl_recomment.erl
+++ b/lib/syntax_tools/src/erl_recomment.erl
@@ -163,7 +163,7 @@ recomment_forms_2(C, [N | Ns] = Nodes, Insert) ->
Trailing =
case Ns of
[] -> true;
- [Next | _] -> L < node_min(Next) - 2
+ [Next | _] -> L + Delta < node_min(Next) - 2
end,
if L > Max + 1 ; L =:= Max + 1, not Trailing ->
[N | recomment_forms_2(C, Ns, Insert)];
diff --git a/lib/syntax_tools/test/Makefile b/lib/syntax_tools/test/Makefile
index 621c76f5a5..3e31bdbd50 100644
--- a/lib/syntax_tools/test/Makefile
+++ b/lib/syntax_tools/test/Makefile
@@ -59,7 +59,7 @@ release_spec: opt
release_tests_spec: make_emakefile
$(INSTALL_DIR) $(RELSYSDIR)
$(INSTALL_DATA) $(EMAKEFILE) $(ERL_FILES) $(RELSYSDIR)
- $(INSTALL_DATA) syntax_tools.dynspec $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ $(INSTALL_DATA) syntax_tools.spec syntax_tools.cover $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
release_docs_spec:
diff --git a/lib/syntax_tools/test/syntax_tools.cover b/lib/syntax_tools/test/syntax_tools.cover
new file mode 100644
index 0000000000..fd30f66cc4
--- /dev/null
+++ b/lib/syntax_tools/test/syntax_tools.cover
@@ -0,0 +1,2 @@
+{incl_app,syntax_tools,details}.
+
diff --git a/lib/syntax_tools/test/syntax_tools.dynspec b/lib/syntax_tools/test/syntax_tools.dynspec
deleted file mode 100644
index 981cb8175e..0000000000
--- a/lib/syntax_tools/test/syntax_tools.dynspec
+++ /dev/null
@@ -1,5 +0,0 @@
-%% -*- erlang -*-
-%% You can test this file using this command.
-%% file:script("syntax_tools.dynspec", [{'Os',"Unix"}]).
-
-[].
diff --git a/lib/syntax_tools/test/syntax_tools.spec b/lib/syntax_tools/test/syntax_tools.spec
new file mode 100644
index 0000000000..e7ddbf7586
--- /dev/null
+++ b/lib/syntax_tools/test/syntax_tools.spec
@@ -0,0 +1,2 @@
+%% -*- erlang -*-
+{suites,"../syntax_tools_test",all}.
diff --git a/lib/syntax_tools/test/syntax_tools_SUITE.erl b/lib/syntax_tools/test/syntax_tools_SUITE.erl
index 16f794683b..fd381f0b25 100644
--- a/lib/syntax_tools/test/syntax_tools_SUITE.erl
+++ b/lib/syntax_tools/test/syntax_tools_SUITE.erl
@@ -17,17 +17,36 @@
%%
-module(syntax_tools_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% Test server specific exports
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
%% Test cases
-export([smoke_test/1]).
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[smoke_test].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%% Read and parse all source in the OTP release.
smoke_test(Config) when is_list(Config) ->
?line Dog = ?t:timetrap(?t:minutes(12)),
diff --git a/lib/test_server/doc/src/notes.xml b/lib/test_server/doc/src/notes.xml
index ab329c399b..9c62b0fcf6 100644
--- a/lib/test_server/doc/src/notes.xml
+++ b/lib/test_server/doc/src/notes.xml
@@ -32,6 +32,43 @@
<file>notes.xml</file>
</header>
+<section><title>Test_Server 3.4.3</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Updated the ts*.config files to contain information
+ relevant to testing Erlang/OTP in an open source
+ environment.</p>
+ <p>
+ Own Id: OTP-9017</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Alpha release of Common Test Hooks (CTH). CTHs allow the
+ users of common test to abtract out common behaviours
+ from test suites in a much more elegant and flexible way
+ than was possible before. Note that the addition of this
+ feature may introduce minor changes in the undocumented
+ behaviour of the interface inbetween common_test and
+ test_server.</p>
+ <p>
+ *** POTENTIAL INCOMPATIBILITY ***</p>
+ <p>
+ Own Id: OTP-8851</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Test_Server 3.4.2</title>
<section><title>Improvements and New Features</title>
diff --git a/lib/test_server/doc/src/test_server.xml b/lib/test_server/doc/src/test_server.xml
index 0cae75d692..78bb922cc5 100644
--- a/lib/test_server/doc/src/test_server.xml
+++ b/lib/test_server/doc/src/test_server.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2007</year>
- <year>2008</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/test_server/doc/src/test_server_ctrl.xml b/lib/test_server/doc/src/test_server_ctrl.xml
index 2368c4bacc..9028a67ecb 100644
--- a/lib/test_server/doc/src/test_server_ctrl.xml
+++ b/lib/test_server/doc/src/test_server_ctrl.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2007</year>
- <year>2008</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/test_server/doc/src/ts.xml b/lib/test_server/doc/src/ts.xml
index f60c79aadd..496ad3667a 100644
--- a/lib/test_server/doc/src/ts.xml
+++ b/lib/test_server/doc/src/ts.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2007</year>
- <year>2008</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/test_server/src/Makefile b/lib/test_server/src/Makefile
index 3dca55178d..63a585d526 100644
--- a/lib/test_server/src/Makefile
+++ b/lib/test_server/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2010. All Rights Reserved.
+# Copyright Ericsson AB 1996-2011. 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
@@ -57,7 +57,8 @@ TS_MODULES= \
ts_erl_config \
ts_autoconf_win32 \
ts_autoconf_vxworks \
- ts_install
+ ts_install \
+ ts_install_cth
TARGET_MODULES= $(MODULES:%=$(EBIN)/%)
TS_TARGET_MODULES= $(TS_MODULES:%=$(EBIN)/%)
@@ -71,7 +72,7 @@ C_FILES =
AUTOCONF_FILES = configure.in conf_vars.in
COVER_FILES = cross.cover
PROGRAMS = configure config.sub config.guess install-sh
-CONFIG = ts.config ts.unix.config ts.win32.config ts.vxworks.config
+CONFIG = ts.config ts.unix.config ts.win32.config
TARGET_FILES = $(MODULES:%=$(EBIN)/%.$(EMULATOR)) \
$(APP_TARGET) $(APPUP_TARGET)
@@ -136,7 +137,7 @@ release_tests_spec: opt
$(INSTALL_DIR) $(RELEASE_PATH)/test_server
$(INSTALL_DATA) $(ERL_FILES) $(TS_ERL_FILES) \
$(HRL_FILES) $(INTERNAL_HRL_FILES) $(TS_HRL_FILES) \
- $(TARGET_FILES) $(TS_TARGET_FILES) \
+ $(TS_TARGET_FILES) \
$(AUTOCONF_FILES) $(C_FILES) $(COVER_FILES) $(CONFIG) \
$(RELEASE_PATH)/test_server
$(INSTALL_SCRIPT) $(PROGRAMS) $(RELEASE_PATH)/test_server
diff --git a/lib/test_server/src/test_server.erl b/lib/test_server/src/test_server.erl
index ee121e5bb6..591329b361 100644
--- a/lib/test_server/src/test_server.erl
+++ b/lib/test_server/src/test_server.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -36,7 +36,7 @@
-export([capture_start/0,capture_stop/0,capture_get/0]).
-export([messages_get/0]).
-export([hours/1,minutes/1,seconds/1,sleep/1,adjusted_sleep/1,timecall/3]).
--export([timetrap_scale_factor/0,timetrap/1,timetrap_cancel/1]).
+-export([timetrap_scale_factor/0,timetrap/1,timetrap_cancel/1,timetrap_cancel/0]).
-export([m_out_of_n/3,do_times/4,do_times/2]).
-export([call_crash/3,call_crash/4,call_crash/5]).
-export([temp_name/1]).
@@ -470,7 +470,7 @@ cover_analyse(Analyse,Modules) ->
overview ->
fun(_) -> undefined end
end,
- R = lists:map(
+ R = pmap(
fun(M) ->
case cover:analyse(M,module) of
{ok,{M,{Cov,NotCov}}} ->
@@ -486,6 +486,19 @@ cover_analyse(Analyse,Modules) ->
stick_all_sticky(node(),Sticky),
R.
+pmap(Fun,List) ->
+ Collector = self(),
+ Pids = lists:map(fun(E) ->
+ spawn(fun() ->
+ Collector ! {res,self(),Fun(E)}
+ end)
+ end, List),
+ lists:map(fun(Pid) ->
+ receive
+ {res,Pid,Res} ->
+ Res
+ end
+ end, Pids).
unstick_all_sticky(Node) ->
lists:filter(
@@ -856,7 +869,7 @@ run_test_case_msgloop(Ref, Pid, CaptureStdout, Terminate, Comment, CurrConf) ->
%% a framework function failed
CB = os:getenv("TEST_SERVER_FRAMEWORK"),
Loc = case CB of
- false ->
+ FW when FW =:= false; FW =:= "undefined" ->
{test_server,Func};
_ ->
{list_to_atom(CB),Func}
@@ -935,8 +948,7 @@ spawn_fw_call(Mod,{init_per_testcase,Func},Pid,{timetrap_timeout,TVal}=Why,
Skip = {skip,{failed,{Mod,init_per_testcase,Why}}},
%% if init_per_testcase fails, the test case
%% should be skipped
- case catch test_server_sup:framework_call(
- end_tc,[?pl2a(Mod),Func,{Pid,Skip,[[]]}]) of
+ case catch do_end_tc_call(Mod,Func,{Pid,Skip,[[]]},Why) of
{'EXIT',FwEndTCErr} ->
exit({fw_notify_done,end_tc,FwEndTCErr});
_ ->
@@ -955,11 +967,9 @@ spawn_fw_call(Mod,{end_per_testcase,Func},Pid,{timetrap_timeout,TVal}=Why,
Conf = [{tc_status,ok}],
%% if end_per_testcase fails, the test case should be
%% reported successful with a warning printed as comment
- case catch test_server_sup:framework_call(end_tc,
- [?pl2a(Mod),Func,
- {Pid,
- {failed,{Mod,end_per_testcase,Why}},
- [Conf]}]) of
+ case catch do_end_tc_call(Mod,Func,{Pid,
+ {failed,{Mod,end_per_testcase,Why}},
+ [Conf]}, Why) of
{'EXIT',FwEndTCErr} ->
exit({fw_notify_done,end_tc,FwEndTCErr});
_ ->
@@ -1001,9 +1011,7 @@ spawn_fw_call(Mod,Func,Pid,Error,Loc,SendTo,Comment) ->
ok
end,
Conf = [{tc_status,{failed,timetrap_timeout}}],
- case catch test_server_sup:framework_call(end_tc,
- [?pl2a(Mod),Func,
- {Pid,Error,[Conf]}]) of
+ case catch do_end_tc_call(Mod,Func,{Pid,Error,[Conf]},Error) of
{'EXIT',FwEndTCErr} ->
exit({fw_notify_done,end_tc,FwEndTCErr});
_ ->
@@ -1073,23 +1081,22 @@ run_test_case_eval(Mod, Func, Args0, Name, Ref, RunInit,
{ok,Args} ->
run_test_case_eval1(Mod, Func, Args, Name, RunInit, TCCallback);
Error = {error,_Reason} ->
- test_server_sup:framework_call(end_tc,[?pl2a(Mod),Func,{Error,Args0}]),
- {{0,{skip,{failed,Error}}},{Mod,Func},[]};
+ NewResult = do_end_tc_call(Mod,Func,{Error,Args0},
+ {skip,{failed,Error}}),
+ {{0,NewResult},{Mod,Func},[]};
{fail,Reason} ->
- [Conf] = Args0,
- Conf1 = [{tc_status,{failed,Reason}} | Conf],
+ Conf = [{tc_status,{failed,Reason}} | hd(Args0)],
fw_error_notify(Mod, Func, Conf, Reason),
- test_server_sup:framework_call(end_tc,[?pl2a(Mod),Func,
- {{error,Reason},[Conf1]}]),
- {{0,{failed,Reason}},{Mod,Func},[]};
+ NewResult = do_end_tc_call(Mod,Func, {{error,Reason},[Conf]},
+ {fail,Reason}),
+ {{0,NewResult},{Mod,Func},[]};
Skip = {skip,_Reason} ->
- test_server_sup:framework_call(end_tc,[?pl2a(Mod),Func,{Skip,Args0}]),
- {{0,Skip},{Mod,Func},[]};
+ NewResult = do_end_tc_call(Mod,Func,{Skip,Args0},Skip),
+ {{0,NewResult},{Mod,Func},[]};
{auto_skip,Reason} ->
- test_server_sup:framework_call(end_tc,[?pl2a(Mod),
- Func,
- {{skip,Reason},Args0}]),
- {{0,{skip,{fw_auto_skip,Reason}}},{Mod,Func},[]}
+ NewResult = do_end_tc_call(Mod, Func, {{skip,Reason},Args0},
+ {skip,{fw_auto_skip,Reason}}),
+ {{0,NewResult},{Mod,Func},[]}
end,
exit({Ref,Time,Value,Loc,Opts}).
@@ -1103,14 +1110,20 @@ run_test_case_eval1(Mod, Func, Args, Name, RunInit, TCCallback) ->
Skip = {skip,Reason} ->
Line = get_loc(),
Conf = [{tc_status,{skipped,Reason}}],
- test_server_sup:framework_call(end_tc,[?pl2a(Mod),Func,{Skip,[Conf]}]),
- {{0,{skip,Reason}},Line,[]};
+ NewRes = do_end_tc_call(Mod,Func,{Skip,[Conf]}, Skip),
+ {{0,NewRes},Line,[]};
{skip_and_save,Reason,SaveCfg} ->
Line = get_loc(),
Conf = [{tc_status,{skipped,Reason}},{save_config,SaveCfg}],
- test_server_sup:framework_call(end_tc,[?pl2a(Mod),Func,
- {{skip,Reason},[Conf]}]),
- {{0,{skip,Reason}},Line,[]};
+ NewRes = do_end_tc_call(Mod, Func, {{skip,Reason},[Conf]},
+ {skip, Reason}),
+ {{0,NewRes},Line,[]};
+ FailTC = {fail,Reason} -> % user fails the testcase
+ EndConf = [{tc_status,{failed,Reason}} | hd(Args)],
+ fw_error_notify(Mod, Func, EndConf, Reason),
+ NewRes = do_end_tc_call(Mod, Func, {{error,Reason},[EndConf]},
+ FailTC),
+ {{0,NewRes},{Mod,Func},[]};
{ok,NewConf} ->
put(test_server_init_or_end_conf,undefined),
%% call user callback function if defined
@@ -1145,8 +1158,9 @@ run_test_case_eval1(Mod, Func, Args, Name, RunInit, TCCallback) ->
{FWReturn1,TSReturn1,EndConf2} =
case end_per_testcase(Mod, Func, EndConf1) of
SaveCfg1={save_config,_} ->
- {FWReturn,TSReturn,[SaveCfg1|lists:keydelete(save_config, 1, EndConf1)]};
- {fail,ReasonToFail} -> % user has failed the testcase
+ {FWReturn,TSReturn,[SaveCfg1|lists:keydelete(save_config,1,
+ EndConf1)]};
+ {fail,ReasonToFail} -> % user has failed the testcase
fw_error_notify(Mod, Func, EndConf1, ReasonToFail),
{{error,ReasonToFail},{failed,ReasonToFail},EndConf1};
{failed,{_,end_per_testcase,_}} = Failure -> % unexpected termination
@@ -1155,13 +1169,12 @@ run_test_case_eval1(Mod, Func, Args, Name, RunInit, TCCallback) ->
{FWReturn,TSReturn,EndConf1}
end,
put(test_server_init_or_end_conf,undefined),
- case test_server_sup:framework_call(end_tc, [?pl2a(Mod), Func,
- {FWReturn1,[EndConf2]}]) of
- {fail,Reason} ->
- fw_error_notify(Mod, Func, EndConf2, Reason),
- {{T,{failed,Reason}},{Mod,Func},[]};
- _ ->
- {{T,TSReturn1},Loc,[]}
+ case do_end_tc_call(Mod, Func, {FWReturn1,[EndConf2]}, TSReturn1) of
+ {failed,Reason} = NewReturn ->
+ fw_error_notify(Mod,Func,EndConf2, Reason),
+ {{T,NewReturn},{Mod,Func},[]};
+ NewReturn ->
+ {{T,NewReturn},Loc,[]}
end
end;
skip_init ->
@@ -1179,10 +1192,41 @@ run_test_case_eval1(Mod, Func, Args, Name, RunInit, TCCallback) ->
{{T,Return},Loc} = {ts_tc(Mod, Func, Args2),get_loc()},
%% call user callback function if defined
Return1 = user_callback(TCCallback, Mod, Func, 'end', Return),
- {Return2,Opts} = process_return_val([Return1], Mod,Func,Args1, Loc, Return1),
+ {Return2,Opts} = process_return_val([Return1], Mod, Func,
+ Args1, Loc, Return1),
{{T,Return2},Loc,Opts}
end.
+do_end_tc_call(M,F,Res,Return) ->
+ Ref = make_ref(),
+ case os:getenv("TEST_SERVER_FRAMEWORK") of
+ FW when FW == "ct_framework";
+ FW == "undefined";
+ FW == false ->
+ case test_server_sup:framework_call(
+ end_tc, [?pl2a(M),F,Res, Return], ok) of
+ {fail,FWReason} ->
+ {failed,FWReason};
+ ok ->
+ case Return of
+ {fail,Reason} ->
+ {failed,Reason};
+ Return ->
+ Return
+ end;
+ NewReturn ->
+ NewReturn
+ end;
+ Other ->
+ case test_server_sup:framework_call(
+ end_tc, [Other,F,Res], Ref) of
+ {fail,FWReason} ->
+ {failed,FWReason};
+ _Else ->
+ Return
+ end
+ end.
+
%% the return value is a list and we have to check if it contains
%% the result of an end conf case or if it's a Config list
process_return_val([Return], M,F,A, Loc, Final) when is_list(Return) ->
@@ -1197,13 +1241,13 @@ process_return_val([Return], M,F,A, Loc, Final) when is_list(Return) ->
end, Return) of
true -> % must be return value from end conf case
process_return_val1(Return, M,F,A, Loc, Final, []);
- false -> % must be Config value from init conf case
- case test_server_sup:framework_call(end_tc, [?pl2a(M),F,{ok,A}]) of
- {fail,FWReason} ->
+ false -> % must be Config value from init conf case
+ case do_end_tc_call(M,F,{ok,A}, Return) of
+ {failed, FWReason} = Failed ->
fw_error_notify(M,F,A, FWReason),
- {{failed,FWReason},[]};
- _ ->
- {Return,[]}
+ {Failed, []};
+ NewReturn ->
+ {NewReturn, []}
end
end;
%% the return value is not a list, so it's the return value from an
@@ -1211,16 +1255,16 @@ process_return_val([Return], M,F,A, Loc, Final) when is_list(Return) ->
process_return_val(Return, M,F,A, Loc, Final) ->
process_return_val1(Return, M,F,A, Loc, Final, []).
-process_return_val1([Failed={E,TCError}|_], M,F,A=[Args], Loc, _, SaveOpts) when E=='EXIT';
- E==failed ->
+process_return_val1([Failed={E,TCError}|_], M,F,A=[Args], Loc, _, SaveOpts)
+ when E=='EXIT';
+ E==failed ->
fw_error_notify(M,F,A, TCError, mod_loc(Loc)),
- case test_server_sup:framework_call(end_tc,
- [?pl2a(M),F,{{error,TCError},
- [[{tc_status,{failed,TCError}}|Args]]}]) of
- {fail,FWReason} ->
+ case do_end_tc_call(M,F,{{error,TCError},
+ [[{tc_status,{failed,TCError}}|Args]]}, Failed) of
+ {failed,FWReason} ->
{{failed,FWReason},SaveOpts};
- _ ->
- {Failed,SaveOpts}
+ NewReturn ->
+ {NewReturn,SaveOpts}
end;
process_return_val1([SaveCfg={save_config,_}|Opts], M,F,[Args], Loc, Final, SaveOpts) ->
process_return_val1(Opts, M,F,[[SaveCfg|Args]], Loc, Final, SaveOpts);
@@ -1234,11 +1278,11 @@ process_return_val1([RetVal={Tag,_}|Opts], M,F,A, Loc, _, SaveOpts) when Tag==sk
process_return_val1([_|Opts], M,F,A, Loc, Final, SaveOpts) ->
process_return_val1(Opts, M,F,A, Loc, Final, SaveOpts);
process_return_val1([], M,F,A, _Loc, Final, SaveOpts) ->
- case test_server_sup:framework_call(end_tc, [?pl2a(M),F,{Final,A}]) of
- {fail,FWReason} ->
+ case do_end_tc_call(M,F,{Final,A}, Final) of
+ {failed,FWReason} ->
{{failed,FWReason},SaveOpts};
- _ ->
- {Final,lists:reverse(SaveOpts)}
+ NewReturn ->
+ {NewReturn,lists:reverse(SaveOpts)}
end.
user_callback(undefined, _, _, _, Args) ->
@@ -1283,6 +1327,8 @@ init_per_testcase(Mod, Func, Args) ->
"bad elements in Config: ~p\n",[Bad]},
{skip,{failed,{Mod,init_per_testcase,bad_return}}}
end;
+ {'$test_server_ok',Res={fail,_Reason}} ->
+ Res;
{'$test_server_ok',_Other} ->
group_leader() ! {printout,12,
"ERROR! init_per_testcase did not return "
@@ -1306,8 +1352,8 @@ init_per_testcase(Mod, Func, Args) ->
{skip,{failed,{Mod,init_per_testcase,Other}}}
end;
false ->
- %% Optional init_per_testcase not defined
- %% keep quiet.
+%% Optional init_per_testcase not defined
+%% keep quiet.
[Config] = Args,
{ok, Config}
end.
@@ -1657,7 +1703,7 @@ fail() ->
break(Comment) ->
case erase(test_server_timetraps) of
undefined -> ok;
- List -> lists:foreach(fun(Ref) -> timetrap_cancel(Ref) end,List)
+ List -> lists:foreach(fun({Ref,_}) -> timetrap_cancel(Ref) end, List)
end,
io:format(user,
"\n\n\n--- SEMIAUTOMATIC TESTING ---"
@@ -1738,14 +1784,16 @@ timetrap(Timeout0) ->
{undefined,false} -> timetrap1(Timeout, false);
{undefined,_} -> timetrap1(Timeout, true);
{infinity,_} -> infinity;
+ {_Int,_Scale} when Timeout == infinity -> infinity;
{Int,Scale} -> timetrap1(Timeout*Int, Scale)
end.
timetrap1(Timeout, Scale) ->
- Ref = spawn_link(test_server_sup,timetrap,[Timeout,Scale,self()]),
+ TCPid = self(),
+ Ref = spawn_link(test_server_sup,timetrap,[Timeout,Scale,TCPid]),
case get(test_server_timetraps) of
- undefined -> put(test_server_timetraps,[Ref]);
- List -> put(test_server_timetraps,[Ref|List])
+ undefined -> put(test_server_timetraps,[{Ref,TCPid}]);
+ List -> put(test_server_timetraps,[{Ref,TCPid}|List])
end,
Ref.
@@ -1758,14 +1806,16 @@ ensure_timetrap(Config) ->
undefined -> ok;
Garbage ->
erase(test_server_default_timetrap),
- format("=== WARNING: garbage in test_server_default_timetrap: ~p~n",
+ format("=== WARNING: garbage in "
+ "test_server_default_timetrap: ~p~n",
[Garbage])
end,
DTmo = case lists:keysearch(default_timeout,1,Config) of
{value,{default_timeout,Tmo}} -> Tmo;
_ -> ?DEFAULT_TIMETRAP_SECS
end,
- format("=== test_server setting default timetrap of ~p seconds~n",
+ format("=== test_server setting default "
+ "timetrap of ~p seconds~n",
[DTmo]),
put(test_server_default_timetrap, timetrap(seconds(DTmo)))
end.
@@ -1777,11 +1827,13 @@ cancel_default_timetrap() ->
TimeTrap when is_pid(TimeTrap) ->
timetrap_cancel(TimeTrap),
erase(test_server_default_timetrap),
- format("=== test_server canceled default timetrap since another timetrap was set~n"),
+ format("=== test_server canceled default timetrap "
+ "since another timetrap was set~n"),
ok;
Garbage ->
erase(test_server_default_timetrap),
- format("=== WARNING: garbage in test_server_default_timetrap: ~p~n",
+ format("=== WARNING: garbage in "
+ "test_server_default_timetrap: ~p~n",
[Garbage]),
error
end.
@@ -1795,6 +1847,7 @@ time_ms({Other,_N}) ->
"Should be seconds, minutes, or hours.~n", [Other]),
exit({invalid_time_spec,Other});
time_ms(Ms) when is_integer(Ms) -> Ms;
+time_ms(infinity) -> infinity;
time_ms(Other) -> exit({invalid_time_spec,Other}).
@@ -1808,11 +1861,29 @@ timetrap_cancel(infinity) ->
timetrap_cancel(Handle) ->
case get(test_server_timetraps) of
undefined -> ok;
- [Handle] -> erase(test_server_timetraps);
- List -> put(test_server_timetraps,lists:delete(Handle,List))
+ [{Handle,_}] -> erase(test_server_timetraps);
+ Timers -> put(test_server_timetraps,
+ lists:keydelete(Handle, 1, Timers))
end,
test_server_sup:timetrap_cancel(Handle).
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% timetrap_cancel() -> ok
+%%
+%% Cancels timetrap for current test case.
+timetrap_cancel() ->
+ case get(test_server_timetraps) of
+ undefined ->
+ ok;
+ Timers ->
+ case lists:keysearch(self(), 2, Timers) of
+ {value,{Handle,_}} ->
+ timetrap_cancel(Handle);
+ _ ->
+ ok
+ end
+ end.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% hours(N) -> Milliseconds
%% minutes(N) -> Milliseconds
diff --git a/lib/test_server/src/test_server_ctrl.erl b/lib/test_server/src/test_server_ctrl.erl
index 1dc5646184..de9b962dfc 100644
--- a/lib/test_server/src/test_server_ctrl.erl
+++ b/lib/test_server/src/test_server_ctrl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
@@ -168,6 +168,7 @@
cross_cover_analyse/1, cross_cover_analyse/2, trc/1, stop_trace/0]).
-export([testcase_callback/1]).
-export([set_random_seed/1]).
+-export([kill_slavenodes/0]).
%%% TEST_SERVER INTERFACE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-export([output/2, print/2, print/3, print_timestamp/2]).
@@ -525,6 +526,9 @@ testcase_callback(ModFunc) ->
set_random_seed(Seed) ->
controller_call({set_random_seed,Seed}).
+kill_slavenodes() ->
+ controller_call(kill_slavenodes).
+
get_hosts() ->
get(test_server_hosts).
@@ -533,6 +537,8 @@ get_target_os_type() ->
undefined ->
%% This is probably called on the target node
os:type();
+ Pid when Pid =:= self() ->
+ os:type();
_pid ->
%% This is called on the controller, e.g. from a
%% specification clause of a test case
@@ -637,7 +643,7 @@ contact_main_target(local) ->
%% When used by a general framework, global registration of
%% test_server should not be required.
case os:getenv("TEST_SERVER_FRAMEWORK") of
- false ->
+ FW when FW =:= false; FW =:= "undefined" ->
%% Local target! The global test_server process implemented by
%% test_server.erl will not be started, so we simulate it by
%% globally registering this process instead.
@@ -1704,7 +1710,7 @@ do_test_cases(TopCases, SkipCases,
[erlang:system_info(version), code:root_dir()]),
case os:getenv("TEST_SERVER_FRAMEWORK") of
- false ->
+ FW when FW =:= false; FW =:= "undefined" ->
print(html, "<p>Target:<br>\n"),
print_who(TI#target_info.host, TI#target_info.username),
print(html, "<br>Used Erlang ~s in <tt>~s</tt>.\n",
@@ -1806,6 +1812,9 @@ start_log_file() ->
ok = file:make_dir(PrivDir),
put(test_server_priv_dir,PrivDir++"/"),
print_timestamp(13,"Suite started at "),
+
+ LogInfo = [{topdir,Dir},{rundir,lists:flatten(TestDir)}],
+ test_server_sup:framework_call(report, [loginfo,LogInfo]),
ok.
make_html_link(LinkName, Target, Explanation) ->
@@ -1919,7 +1928,6 @@ html_convert_modules(TestSpec, _Config) ->
copy_html_files(get(test_server_dir), get(test_server_log_dir_base)).
%% Retrieve a list of modules out of the test spec.
-
html_isolate_modules(List) -> html_isolate_modules(List, sets:new()).
html_isolate_modules([], Set) -> sets:to_list(Set);
@@ -1933,37 +1941,56 @@ html_isolate_modules([{Mod,_Case,_Args}|Cases], Set) ->
html_isolate_modules(Cases, sets:add_element(Mod, Set)).
%% Given a list of modules, convert each module's source code to HTML.
-
html_convert_modules([Mod|Mods]) ->
case code:which(Mod) of
Path when is_list(Path) ->
SrcFile = filename:rootname(Path) ++ ".erl",
- DestDir = get(test_server_dir),
- Name = atom_to_list(Mod),
- DestFile = filename:join(DestDir, downcase(Name) ++ ?src_listing_ext),
- html_possibly_convert(SrcFile, DestFile),
- html_convert_modules(Mods);
- _Other -> ok
+ FoundSrcFile =
+ case file:read_file_info(SrcFile) of
+ {ok,SInfo} ->
+ {SrcFile,SInfo};
+ {error,_} ->
+ ModInfo = Mod:module_info(compile),
+ case proplists:get_value(source, ModInfo) of
+ undefined ->
+ undefined;
+ OtherSrcFile ->
+ case file:read_file_info(OtherSrcFile) of
+ {ok,SInfo} ->
+ {OtherSrcFile,SInfo};
+ {error,_} ->
+ undefined
+ end
+ end
+ end,
+ case FoundSrcFile of
+ undefined ->
+ html_convert_modules(Mods);
+ {SrcFile1,SrcFileInfo} ->
+ DestDir = get(test_server_dir),
+ Name = atom_to_list(Mod),
+ DestFile = filename:join(DestDir,
+ downcase(Name)++?src_listing_ext),
+ html_possibly_convert(SrcFile1, SrcFileInfo, DestFile),
+ html_convert_modules(Mods)
+ end;
+ _Other ->
+ html_convert_modules(Mods)
end;
html_convert_modules([]) -> ok.
%% Convert source code to HTML if possible and needed.
-
-html_possibly_convert(Src, Dest) ->
- case file:read_file_info(Src) of
- {ok,SInfo} ->
- case file:read_file_info(Dest) of
- {error,_Reason} -> % no dest file
- erl2html2:convert(Src, Dest);
- {ok,DInfo} when DInfo#file_info.mtime < SInfo#file_info.mtime ->
- erl2html2:convert(Src, Dest);
- {ok,_DInfo} -> ok % dest file up to date
- end;
- {error,_Reason} -> ok % no source code found
+html_possibly_convert(Src, SrcInfo, Dest) ->
+ case file:read_file_info(Dest) of
+ {error,_Reason} -> % no dest file
+ erl2html2:convert(Src, Dest);
+ {ok,DestInfo} when DestInfo#file_info.mtime < SrcInfo#file_info.mtime ->
+ erl2html2:convert(Src, Dest);
+ {ok,_DestInfo} ->
+ ok % dest file up to date
end.
%% Copy all HTML files in InDir to OutDir.
-
copy_html_files(InDir, OutDir) ->
Files = filelib:wildcard(filename:join(InDir, "*" ++ ?src_listing_ext)),
lists:foreach(fun (Src) -> copy_html_file(Src, OutDir) end, Files).
@@ -3552,7 +3579,7 @@ run_test_case1(Ref, Num, Mod, Func, Args, RunInit, Where,
{_,{'EXIT',Reason}} ->
progress(failed, Num, Mod, Func, Loc, Reason,
Time, Comment, Style);
- {_, {failed, Reason}} ->
+ {_, {Fail, Reason}} when Fail =:= fail; Fail =:= failed ->
progress(failed, Num, Mod, Func, Loc, Reason,
Time, Comment, Style);
{_, {Skip, Reason}} when Skip==skip; Skip==skipped ->
@@ -4057,7 +4084,7 @@ get_font_style1(default) ->
format_exception(Reason={_Error,Stack}) when is_list(Stack) ->
case os:getenv("TEST_SERVER_FRAMEWORK") of
- false ->
+ FW when FW =:= false; FW =:= "undefined" ->
case application:get_env(test_server, format_exception) of
{ok,false} ->
{"~p",Reason};
@@ -4630,7 +4657,7 @@ collect_case([Case | Cases], St, Acc) ->
collect_case_invoke(Mod, Case, MFA, St) ->
case os:getenv("TEST_SERVER_FRAMEWORK") of
- false ->
+ FW when FW =:= false; FW =:= "undefined" ->
case catch apply(Mod, Case, [suite]) of
{'EXIT',_} ->
{ok,[MFA],St};
diff --git a/lib/test_server/src/test_server_node.erl b/lib/test_server/src/test_server_node.erl
index 49025b1a3d..1fd40d1dd9 100644
--- a/lib/test_server/src/test_server_node.erl
+++ b/lib/test_server/src/test_server_node.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
@@ -84,7 +84,7 @@ start_remote_main_target(Parameters) ->
MasterNode,MasterCookie),
Cmd =
case os:getenv("TEST_SERVER_FRAMEWORK") of
- false -> Cmd0;
+ FW when FW =:= false; FW =:= "undefined" -> Cmd0;
FW -> Cmd0 ++ " -env TEST_SERVER_FRAMEWORK " ++ FW
end,
diff --git a/lib/test_server/src/test_server_sup.erl b/lib/test_server/src/test_server_sup.erl
index 625724fbb5..53dfb45e3a 100644
--- a/lib/test_server/src/test_server_sup.erl
+++ b/lib/test_server/src/test_server_sup.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -83,13 +83,13 @@ timetrap(Timeout0, Scale, Pid) ->
%% Handle = term()
%%
%% Cancels a time trap.
-
timetrap_cancel(Handle) ->
unlink(Handle),
MonRef = erlang:monitor(process, Handle),
exit(Handle, kill),
receive {'DOWN',MonRef,_,_,_} -> ok after 2000 -> ok end.
+
capture_get(Msgs) ->
receive
{captured,Msg} ->
@@ -494,7 +494,8 @@ framework_call(Func,Args) ->
framework_call(Func,Args,DefaultReturn) ->
CB = os:getenv("TEST_SERVER_FRAMEWORK"),
framework_call(CB,Func,Args,DefaultReturn).
-framework_call(false,_Func,_Args,DefaultReturn) ->
+framework_call(FW,_Func,_Args,DefaultReturn)
+ when FW =:= false; FW =:= "undefined" ->
DefaultReturn;
framework_call(Callback,Func,Args,DefaultReturn) ->
Mod = list_to_atom(Callback),
diff --git a/lib/test_server/src/ts.config b/lib/test_server/src/ts.config
index 30ef25a0b8..f021f5958b 100644
--- a/lib/test_server/src/ts.config
+++ b/lib/test_server/src/ts.config
@@ -1,45 +1,46 @@
%% -*- erlang -*-
-{ipv6_hosts,[otptest06,otptest08,sauron,iluvatar]}.
-%%% Change these to suite the environment.
-%%% test_hosts are looked up using "ypmatch xx yy zz hosts"
-{test_hosts,
- [bingo, hurin, turin, gandalf, super,
- merry, nenya, sam, elrond, isildur]}.
+%%% Change these to suite the environment. See the inet_SUITE for info about
+%%% what they are used for.
+%%% test_hosts are looked up using "ypmatch xx yy zz hosts.byname"
+%{test_hosts,[my_ip4_host]}.
%% IPv4 host only - no ipv6 entry must exist!
-{test_host_ipv4_only,
- {"isildur", %Short hostname
- "isildur.du.uab.ericsson.se", %Long hostname
- "134.138.177.24", %IP string
- {134,138,177,24}, %IP tuple
- ["isildur"], %Any aliases
- "::ffff:134.138.177.24", %IPv6 string (compatibilty addr)
- {0,0,0,0,0,65535,34442,45336} %IPv6 tuple
- }}.
-
-{test_host_ipv6_only,
- {"otptest06", %Short hostname
- "otptest06.du.uab.ericsson.se", %Long hostname
- "fec0::a00:20ff:feb2:b4a9", %IPv6 string
- {65216,0,0,0,2560,8447,65202,46249}, %IPv6 tuple
- ["otptest06-ip6"] %Aliases.
- }}.
-
-
-
-{test_dummy_host, {"dummy",
- "dummy.du.uab.ericsson.se",
- "192.138.177.1",
- {192,138,177,1},
- ["dummy"],
- "::ffff:192.138.177.1",
- {0,0,0,0,0,65535,49290,45313}
- }}.
-
-{test_dummy_ipv6_host, {"dummy6",
- "dummy6.du.uab.ericsson.se",
- "fec0::a00:20ff:feb2:6666",
- {65216,0,0,0,2560,8447,65202,26214},
- ["dummy6-ip6"]
- }}.
+%{test_host_ipv4_only,
+% {"my_ip4_host", %Short hostname
+% "my_ip4_host.mydomain.com", %Long hostname
+% "10.10.0.1", %IP string
+% {10,10,0,1}, %IP tuple
+% ["my_ip4_host"], %Any aliases
+% "::ffff:10.10.0.1", %IPv6 string (compatibilty addr)
+% {0,0,0,0,0,65535,2570,1} %IPv6 tuple
+% }}.
+
+%{test_dummy_host, {"dummy",
+% "dummy.mydomain.com",
+% "192.168.0.1",
+% {192,168,0,1},
+% ["dummy"],
+% "::ffff:192.168.0.1",
+% {0,0,0,0,0,65535,49320,1}
+% }}.
+
+
+%%% test_hosts are looked up using "ypmatch xx yy zz ipnodes.byname"
+%{ipv6_hosts,[my_ip6_host]}.
+
+
+%{test_host_ipv6_only,
+% {"my_ip6_host", %Short hostname
+% "my_ip6_host.mydomain.com", %Long hostname
+% "::2eff:f2b0:1ea0", %IPv6 string
+% {0,0,0,0,0,12031,62128,7840}, %IPv6 tuple
+% ["my_ip6_host"] %Aliases.
+% }}.
+
+%{test_dummy_ipv6_host, {"dummy6",
+% "dummy6.mydomain.com",
+% "127::1",
+% {295,0,0,0,0,0,0,1},
+% ["dummy6-ip6"]
+% }}.
diff --git a/lib/test_server/src/ts.erl b/lib/test_server/src/ts.erl
index fcd955345f..729a2b11fc 100644
--- a/lib/test_server/src/ts.erl
+++ b/lib/test_server/src/ts.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -150,6 +150,14 @@ help(installed) ->
" TraceSpec is the name of a file containing\n",
" trace specifications or a list of trace\n",
" specification elements.\n",
+ " {config, Path} - Specify which directory ts should get it's \n"
+ " config files from. The files should follow\n"
+ " the convention lib/test_server/src/ts*.config.\n"
+ " These config files can also be specified by\n"
+ " setting the TEST_CONFIG_PATH environment\n"
+ " variable to the directory where the config\n"
+ " files are. The default location is\n"
+ " tests/test_server/.\n"
"\n",
"Supported trace information elements\n",
" {tp | tpl, Mod, [] | match_spec()}\n",
@@ -249,7 +257,7 @@ run_some([Spec|Specs], Opts) ->
run(Testspec) when is_atom(Testspec) ->
Options=check_test_get_opts(Testspec, []),
File = atom_to_list(Testspec),
- run_test(File, ["SPEC current.spec NAME ",File], Options);
+ run_test(File, [{spec,[File++".spec"]}], Options);
%% This can be used from command line, e.g.
%% erl -s ts run all_tests <config>
@@ -293,11 +301,11 @@ run(List, Opts) when is_list(List), is_list(Opts) ->
run(Testspec, Config) when is_atom(Testspec), is_list(Config) ->
Options=check_test_get_opts(Testspec, Config),
File=atom_to_list(Testspec),
- run_test(File, ["SPEC current.spec NAME ", File], Options);
+ run_test(File, [{spec,[File++".spec"]}], Options);
%% Runs one module in a spec (interactive)
run(Testspec, Mod) when is_atom(Testspec), is_atom(Mod) ->
run_test({atom_to_list(Testspec), Mod},
- ["SPEC current.spec NAME ", atom_to_list(Mod)],
+ [{suite,Mod}],
[interactive]).
%% run/3
@@ -305,20 +313,23 @@ run(Testspec, Mod) when is_atom(Testspec), is_atom(Mod) ->
run(Testspec,Mod,Config) when is_atom(Testspec), is_atom(Mod), is_list(Config) ->
Options=check_test_get_opts(Testspec, Config),
run_test({atom_to_list(Testspec), Mod},
- ["SPEC current.spec NAME ", atom_to_list(Mod)],
+ [{suite,Mod}],
Options);
%% Runs one testcase in a module.
run(Testspec, Mod, Case) when is_atom(Testspec), is_atom(Mod), is_atom(Case) ->
Options=check_test_get_opts(Testspec, []),
- Args = ["CASE ",atom_to_list(Mod)," ",atom_to_list(Case)],
+ Args = [{suite,atom_to_list(Mod)},{testcase,atom_to_list(Case)}],
run_test(atom_to_list(Testspec), Args, Options).
%% run/4
%% Run one testcase in a module with Options.
-run(Testspec, Mod, Case, Config) when is_atom(Testspec), is_atom(Mod), is_atom(Case), is_list(Config) ->
+run(Testspec, Mod, Case, Config) when is_atom(Testspec),
+ is_atom(Mod),
+ is_atom(Case),
+ is_list(Config) ->
Options=check_test_get_opts(Testspec, Config),
- Args = ["CASE ",atom_to_list(Mod), " ",atom_to_list(Case)],
+ Args = [{suite,atom_to_list(Mod)}, {testcase,atom_to_list(Case)}],
run_test(atom_to_list(Testspec), Args, Options).
%% Check testspec to be valid and get possible Options
@@ -327,10 +338,11 @@ check_test_get_opts(Testspec, Config) ->
validate_test(Testspec),
Mode = configmember(batch, {batch, interactive}, Config),
Vars = configvars(Config),
- Trace = configtrace(Config),
+ Trace = get_config(trace,Config),
+ ConfigPath = get_config(config,Config),
KeepTopcase = configmember(keep_topcase, {keep_topcase,[]}, Config),
Cover = configcover(Testspec,Config),
- lists:flatten([Vars,Mode,Trace,KeepTopcase,Cover]).
+ lists:flatten([Vars,Mode,Trace,KeepTopcase,Cover,ConfigPath]).
to_erlang_term(Atom) ->
String = atom_to_list(Atom),
@@ -398,8 +410,8 @@ special_vars(Config) ->
SpecVars1
end.
-configtrace(Config) ->
- case lists:keysearch(trace,1,Config) of
+get_config(Key,Config) ->
+ case lists:keysearch(Key,1,Config) of
{value,Value} -> Value;
false -> []
end.
diff --git a/lib/test_server/src/ts.unix.config b/lib/test_server/src/ts.unix.config
index b4325f065f..5a2580f464 100644
--- a/lib/test_server/src/ts.unix.config
+++ b/lib/test_server/src/ts.unix.config
@@ -1,4 +1,4 @@
%% -*- erlang -*-
%% Always run a (VNC) X server on host
-{xserver, "frumgar.du.uab.ericsson.se:66"}.
+%% {xserver, "xserver.example.com:66"}.
diff --git a/lib/test_server/src/ts.vxworks.config b/lib/test_server/src/ts.vxworks.config
deleted file mode 100644
index b0b66e07ad..0000000000
--- a/lib/test_server/src/ts.vxworks.config
+++ /dev/null
@@ -1,19 +0,0 @@
-%% -*- erlang -*-
-
-%%% There is no equivalent command to ypmatch on Win32... :-(
-{hardcoded_hosts,
- [{"134.138.177.74","strider"},
- {"134.138.177.72", "elrond"},
- {"134.138.177.67", "sam"},
- {"134.138.176.215", "nenya"},
- {"134.138.176.192", "merry"},
- {"134.138.177.35", "lw4"},
- {"134.138.177.35", "lw5"},
- {"134.138.176.16", "super"},
- {"134.138.177.16", "gandalf"},
- {"134.138.177.92", "turin"},
- {"134.138.177.86", "mallor"}]}.
-
-{hardcoded_ipv6_hosts,
- [{"fe80::a00:20ff:feb2:b4a9","otptest06"},
- {"fe80::a00:20ff:feb2:a621","otptest08"}]}.
diff --git a/lib/test_server/src/ts.win32.config b/lib/test_server/src/ts.win32.config
index 2802c4a75a..cae587bea8 100644
--- a/lib/test_server/src/ts.win32.config
+++ b/lib/test_server/src/ts.win32.config
@@ -1,15 +1,8 @@
%% -*- erlang -*-
%%% There is no equivalent command to ypmatch on Win32... :-(
-{hardcoded_hosts,
- [{"134.138.177.24","isildur"},
- {"134.138.177.72", "elrond"},
- {"134.138.176.215", "nenya"},
- {"134.138.176.192", "merry"},
- {"134.138.176.16", "super"},
- {"134.138.177.16", "gandalf"},
- {"134.138.177.92", "turin"}]}.
+%{hardcoded_hosts,
+% [{"127.0.0.1","localhost"}]}.
-{hardcoded_ipv6_hosts,
- [{"fe80::a00:20ff:feb2:b4a9","otptest06"},
- {"fe80::a00:20ff:feb2:a621","otptest08"}]}.
+%{hardcoded_ipv6_hosts,
+% [{"::1","localhost"}]}.
diff --git a/lib/test_server/src/ts_install.erl b/lib/test_server/src/ts_install.erl
index 2ddffccf5b..8332ccfb40 100644
--- a/lib/test_server/src/ts_install.erl
+++ b/lib/test_server/src/ts_install.erl
@@ -22,6 +22,7 @@
-export([install/2, platform_id/1]).
-include("ts.hrl").
+-include_lib("kernel/include/file.hrl").
install(install_local, Options) ->
install(os:type(), Options);
@@ -150,11 +151,17 @@ add_vars(Vars0, Opts0) ->
end,
{PlatformId, PlatformLabel, PlatformFilename, Version} =
platform([{longnames, LongNames}|Vars0]),
+ NetDir = lists:concat(["/net", hostname()]),
+ Mounted = case file:read_file_info(NetDir) of
+ {ok, #file_info{type = directory}} -> NetDir;
+ _ -> ""
+ end,
{Opts, [{longnames, LongNames},
{platform_id, PlatformId},
{platform_filename, PlatformFilename},
{rsh_name, get_rsh_name()},
{platform_label, PlatformLabel},
+ {ts_net_dir, Mounted},
{erl_flags, []},
{erl_release, Version},
{ts_testcase_callback, get_testcase_callback()} | Vars0]}.
diff --git a/lib/test_server/src/ts_install_cth.erl b/lib/test_server/src/ts_install_cth.erl
new file mode 100644
index 0000000000..c5444a342f
--- /dev/null
+++ b/lib/test_server/src/ts_install_cth.erl
@@ -0,0 +1,286 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010-2011. 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%
+%%
+
+%%% @doc TS Installed SCB
+%%%
+%%% This module does what the make parts of the ts:run/x command did,
+%%% but not the Makefile.first parts! So they have to be done by ts or
+%%% manually!!
+
+-module(ts_install_cth).
+
+%% Suite Callbacks
+-export([id/1]).
+-export([init/2]).
+
+-export([pre_init_per_suite/3]).
+-export([post_init_per_suite/4]).
+-export([pre_end_per_suite/3]).
+-export([post_end_per_suite/4]).
+
+-export([pre_init_per_group/3]).
+-export([post_init_per_group/4]).
+-export([pre_end_per_group/3]).
+-export([post_end_per_group/4]).
+
+-export([pre_init_per_testcase/3]).
+-export([post_end_per_testcase/4]).
+
+-export([on_tc_fail/3]).
+-export([on_tc_skip/3]).
+
+-export([terminate/1]).
+
+-include_lib("kernel/include/file.hrl").
+
+-type proplist() :: list({atom(),term()}).
+-type config() :: proplist().
+-type reason() :: term().
+-type skip_or_fail() :: {skip, reason()} |
+ {auto_skip, reason()} |
+ {fail, reason()}.
+
+-record(state, { ts_conf_dir, target_system, install_opts, nodenames, nodes }).
+
+%% @doc The id of this SCB
+-spec id(Opts :: term()) ->
+ Id :: term().
+id(_Opts) ->
+ ?MODULE.
+
+%% @doc Always called before any other callback function.
+-spec init(Id :: term(), Opts :: proplist()) ->
+ State :: #state{}.
+init(_Id, Opts) ->
+ Nodenames = proplists:get_value(nodenames, Opts, 0),
+ Nodes = proplists:get_value(nodes, Opts, 0),
+ TSConfDir = proplists:get_value(ts_conf_dir, Opts),
+ TargetSystem = proplists:get_value(target_system, Opts, install_local),
+ InstallOpts = proplists:get_value(install_opts, Opts, []),
+ #state{ nodenames = Nodenames,
+ nodes = Nodes,
+ ts_conf_dir = TSConfDir,
+ target_system = TargetSystem,
+ install_opts = InstallOpts }.
+
+%% @doc Called before init_per_suite is called.
+-spec pre_init_per_suite(Suite :: atom(),
+ Config :: config(),
+ State :: #state{}) ->
+ {config() | skip_or_fail(), NewState :: #state{}}.
+pre_init_per_suite(Suite,Config,#state{ ts_conf_dir = undefined} = State) ->
+ DataDir = proplists:get_value(data_dir, Config),
+ ParentDir = filename:join(
+ lists:reverse(
+ tl(lists:reverse(filename:split(DataDir))))),
+ TSConfDir = filename:join([ParentDir, "..","test_server"]),
+ pre_init_per_suite(Suite, Config, State#state{ ts_conf_dir = TSConfDir });
+pre_init_per_suite(_Suite,Config,State) ->
+ DataDir = proplists:get_value(data_dir, Config),
+ try
+ {ok,Variables} =
+ file:consult(filename:join(State#state.ts_conf_dir,"variables")),
+
+ %% Make the stuff in all_SUITE_data if it exists
+ AllDir = filename:join(DataDir,"../all_SUITE_data"),
+ case filelib:is_dir(AllDir) of
+ true ->
+ make_non_erlang(AllDir,Variables);
+ false ->
+ ok
+ end,
+
+ make_non_erlang(DataDir, Variables),
+
+ {add_node_name(Config, State), State}
+ catch Error:Reason ->
+ Stack = erlang:get_stacktrace(),
+ ct:pal("~p failed! ~p:{~p,~p}",[?MODULE,Error,Reason,Stack]),
+ {{fail,{?MODULE,{Error,Reason, Stack}}},State}
+ end.
+
+%% @doc Called after init_per_suite.
+-spec post_init_per_suite(Suite :: atom(),
+ Config :: config(),
+ Return :: config() | skip_or_fail(),
+ State :: #state{}) ->
+ {config() | skip_or_fail(), NewState :: #state{}}.
+post_init_per_suite(_Suite,_Config,Return,State) ->
+ test_server_ctrl:kill_slavenodes(),
+ {Return, State}.
+
+%% @doc Called before end_per_suite.
+-spec pre_end_per_suite(Suite :: atom(),
+ Config :: config() | skip_or_fail(),
+ State :: #state{}) ->
+ {ok | skip_or_fail(), NewState :: #state{}}.
+pre_end_per_suite(_Suite,Config,State) ->
+ {Config, State}.
+
+%% @doc Called after end_per_suite.
+-spec post_end_per_suite(Suite :: atom(),
+ Config :: config(),
+ Return :: term(),
+ State :: #state{}) ->
+ {ok | skip_or_fail(), NewState :: #state{}}.
+post_end_per_suite(_Suite,_Config,Return,State) ->
+ {Return, State}.
+
+%% @doc Called before each init_per_group.
+-spec pre_init_per_group(Group :: atom(),
+ Config :: config(),
+ State :: #state{}) ->
+ {config() | skip_or_fail(), NewState :: #state{}}.
+pre_init_per_group(_Group,Config,State) ->
+ {add_node_name(Config, State), State}.
+
+%% @doc Called after each init_per_group.
+-spec post_init_per_group(Group :: atom(),
+ Config :: config(),
+ Return :: config() | skip_or_fail(),
+ State :: #state{}) ->
+ {config() | skip_or_fail(), NewState :: #state{}}.
+post_init_per_group(_Group,_Config,Return,State) ->
+ {Return, State}.
+
+%% @doc Called after each end_per_group.
+-spec pre_end_per_group(Group :: atom(),
+ Config :: config() | skip_or_fail(),
+ State :: #state{}) ->
+ {ok | skip_or_fail(), NewState :: #state{}}.
+pre_end_per_group(_Group,Config,State) ->
+ {Config, State}.
+
+%% @doc Called after each end_per_group.
+-spec post_end_per_group(Group :: atom(),
+ Config :: config(),
+ Return :: term(),
+ State :: #state{}) ->
+ {ok | skip_or_fail(), NewState :: #state{}}.
+post_end_per_group(_Group,_Config,Return,State) ->
+ {Return, State}.
+
+%% @doc Called before each test case.
+-spec pre_init_per_testcase(TC :: atom(),
+ Config :: config(),
+ State :: #state{}) ->
+ {config() | skip_or_fail(), NewState :: #state{}}.
+pre_init_per_testcase(_TC,Config,State) ->
+ {add_node_name(Config, State), State}.
+
+%% @doc Called after each test case.
+-spec post_end_per_testcase(TC :: atom(),
+ Config :: config(),
+ Return :: term(),
+ State :: #state{}) ->
+ {ok | skip_or_fail(), NewState :: #state{}}.
+post_end_per_testcase(_TC,_Config,Return,State) ->
+ {Return, State}.
+
+%% @doc Called after a test case failed.
+-spec on_tc_fail(TC :: init_per_suite | end_per_suite |
+ init_per_group | end_per_group | atom(),
+ Reason :: term(), State :: #state{}) ->
+ NewState :: #state{}.
+on_tc_fail(_TC, _Reason, State) ->
+ State.
+
+%% @doc Called when a test case is skipped.
+-spec on_tc_skip(TC :: end_per_suite | init_per_group | end_per_group | atom(),
+ {tc_auto_skip, {failed, {Mod :: atom(), Function :: atom(),
+ Reason :: term()}}} |
+ {tc_user_skip, {skipped, Reason :: term()}},
+ State :: #state{}) ->
+ NewState :: #state{}.
+on_tc_skip(_TC, _Reason, State) ->
+ State.
+
+%% @doc Called when the scope of the SCB is done.
+-spec terminate(State :: #state{}) ->
+ term().
+terminate(_State) ->
+ ok.
+
+%%% ============================================================================
+%%% Local functions
+%%% ============================================================================
+%% Configure and run all the Makefiles in the data dirs of the suite
+%% in question
+make_non_erlang(DataDir, Variables) ->
+ {ok,CurrWD} = file:get_cwd(),
+ try
+ file:set_cwd(DataDir),
+ MakeCommand = proplists:get_value(make_command,Variables),
+
+ FirstMakefile = filename:join(DataDir,"Makefile.first"),
+ case filelib:is_regular(FirstMakefile) of
+ true ->
+ ct:log("Making ~p",[FirstMakefile]),
+ ok = ts_make:make(
+ MakeCommand, DataDir, filename:basename(FirstMakefile));
+ false ->
+ ok
+ end,
+
+ MakefileSrc = filename:join(DataDir,"Makefile.src"),
+ MakefileDest = filename:join(DataDir,"Makefile"),
+ case filelib:is_regular(MakefileSrc) of
+ true ->
+ ok = ts_lib:subst_file(MakefileSrc,MakefileDest,Variables),
+ ct:log("Making ~p",[MakefileDest]),
+ ok = ts_make:make([{makefile,"Makefile"},{data_dir,DataDir}
+ | Variables]);
+ false ->
+ ok
+ end
+ after
+ file:set_cwd(CurrWD),
+ timer:sleep(100)
+ end.
+
+%% Add a nodename to config if it does not exist
+add_node_name(Config, State) ->
+ case proplists:get_value(nodenames, Config) of
+ undefined ->
+ lists:keystore(
+ nodenames, 1, Config,
+ {nodenames,generate_nodenames(State#state.nodenames)});
+ _Else ->
+ Config
+ end.
+
+
+%% Copied from test_server_ctrl.erl
+generate_nodenames(Num) ->
+ {ok,Name} = inet:gethostname(),
+ generate_nodenames2(Num, [Name], []).
+
+generate_nodenames2(0, _Hosts, Acc) ->
+ Acc;
+generate_nodenames2(N, Hosts, Acc) ->
+ Host=lists:nth((N rem (length(Hosts)))+1, Hosts),
+ Name=list_to_atom(temp_nodename("nod", []) ++ "@" ++ Host),
+ generate_nodenames2(N-1, Hosts, [Name|Acc]).
+
+temp_nodename([], Acc) ->
+ lists:flatten(Acc);
+temp_nodename([Chr|Base], Acc) ->
+ {A,B,C} = erlang:now(),
+ New = [Chr | integer_to_list(Chr bxor A bxor B+A bxor C+B)],
+ temp_nodename(Base, [New|Acc]).
diff --git a/lib/test_server/src/ts_run.erl b/lib/test_server/src/ts_run.erl
index 888ac98973..d145290820 100644
--- a/lib/test_server/src/ts_run.erl
+++ b/lib/test_server/src/ts_run.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -28,7 +28,7 @@
-include("ts.hrl").
--import(lists, [map/2,member/2,filter/2,reverse/1]).
+-import(lists, [member/2,filter/2]).
-record(state,
{file, % File given.
@@ -63,50 +63,18 @@ run(File, Args0, Options, Vars0) ->
_ ->
{false, fun run_interactive/3}
end,
- HandleTopcase = case member(keep_topcase, Options) of
- true -> [fun copy_topcase/3];
- false -> [fun remove_original_topcase/3,
- fun init_topcase/3]
- end,
- MakefileHooks = [fun make_make/3,
- fun add_make_testcase/3],
- MakeLoop = fun(V, Sp, St) -> make_loop(MakefileHooks, V, Sp, St) end,
Hooks = [fun init_state/3,
- fun read_spec_file/3] ++
- HandleTopcase ++
- [fun run_preinits/3,
- fun find_makefiles/3,
- MakeLoop,
- fun make_test_suite/3,
- fun add_topcase_to_spec/3,
- fun write_spec_file/3,
+ fun run_preinits/3,
fun make_command/3,
Runner],
- Args = make_test_server_args(Args0,Options,Vars),
+ Args = make_common_test_args(Args0,Options,Vars),
St = #state{file=File,test_server_args=Args,batch=Batch},
R = execute(Hooks, Vars, [], St),
- case Batch of
- true -> ts_reports:make_index();
- false -> ok % ts_reports:make_index() is run on the test_server node
- end,
case R of
{ok,_,_,_} -> ok;
Error -> Error
end.
-make_loop(Hooks, Vars0, Spec0, St0) ->
- case St0#state.makefiles of
- [Makefile|Rest] ->
- case execute(Hooks, Vars0, Spec0, St0#state{makefile=Makefile}) of
- {error, Reason} ->
- {error, Reason};
- {ok, Vars, Spec, St} ->
- make_loop(Hooks, Vars, Spec, St#state{makefiles=Rest})
- end;
- [] ->
- {ok, Vars0, Spec0, St0}
- end.
-
execute([Hook|Rest], Vars0, Spec0, St0) ->
case Hook(Vars0, Spec0, St0) of
ok ->
@@ -156,101 +124,6 @@ init_state(Vars, [], St0) ->
false ->
{error,{no_test_directory,TestDir}}
end.
-
-%% Read the spec file for the test suite.
-
-read_spec_file(Vars, _, St) ->
- TestDir = St#state.test_dir,
- File = St#state.file,
- {SpecFile,Res} = get_spec_filename(Vars, TestDir, File),
- case Res of
- {ok,Spec} ->
- {ok,Vars,Spec,St};
- {error,Atom} when is_atom(Atom) ->
- {error,{no_spec,SpecFile}};
- {error,Reason} ->
- {error,{bad_spec,lists:flatten(file:format_error(Reason))}}
- end.
-
-get_spec_filename(Vars, TestDir, File) ->
- DynSpec = filename:join(TestDir, File ++ ".dynspec"),
- case filelib:is_file(DynSpec) of
- true ->
- Bs0 = erl_eval:new_bindings(),
- Bs1 = erl_eval:add_binding('Target', ts_lib:var(target, Vars), Bs0),
- Bs2 = erl_eval:add_binding('Os', ts_lib:var(os, Vars), Bs1),
- TCCStr = ts_lib:var(test_c_compiler, Vars),
- TCC = try
- {ok, Toks, _} = erl_scan:string(TCCStr ++ "."),
- {ok, Tcc} = erl_parse:parse_term(Toks),
- Tcc
- catch
- _:_ -> undefined
- end,
- Bs = erl_eval:add_binding('TestCCompiler', TCC, Bs2),
- {DynSpec,file:script(DynSpec, Bs)};
- false ->
- SpecFile = get_spec_filename_1(Vars, TestDir, File),
- {SpecFile,file:consult(SpecFile)}
- end.
-
-get_spec_filename_1(Vars, TestDir, File) ->
- case ts_lib:var(os, Vars) of
- "VxWorks" ->
- check_spec_filename(TestDir, File, ".spec.vxworks");
- "Windows"++_ ->
- check_spec_filename(TestDir, File, ".spec.win");
- _Other ->
- filename:join(TestDir, File ++ ".spec")
- end.
-
-check_spec_filename(TestDir, File, Ext) ->
- Spec = filename:join(TestDir, File ++ Ext),
- case filelib:is_file(Spec) of
- true -> Spec;
- false -> filename:join(TestDir, File ++ ".spec")
- end.
-
-%% Remove the top case from the spec file. We will add our own
-%% top case later.
-
-remove_original_topcase(Vars, Spec, St) ->
- {ok,Vars,filter(fun ({topcase,_}) -> false;
- (_Other) -> true end, Spec),St}.
-
-%% Initialize our new top case. We'll keep in it the state to be
-%% able to add more to it.
-
-init_topcase(Vars, Spec, St) ->
- TestDir = St#state.test_dir,
- TopCase =
- case St#state.mod of
- Mod when is_atom(Mod) ->
- ModStr = atom_to_list(Mod),
- case filelib:is_file(filename:join(TestDir,ModStr++".erl")) of
- true -> [{Mod,all}];
- false ->
- Wc = filename:join(TestDir, ModStr ++ "*_SUITE.erl"),
- [{list_to_atom(filename:basename(M, ".erl")),all} ||
- M <- filelib:wildcard(Wc)]
- end;
- _Other ->
- %% Here we used to return {dir,TestDir}. Now we instead
- %% list all suites in TestDir, so we can add make testcases
- %% around it later (see add_make_testcase) without getting
- %% duplicates of the suite. (test_server_ctrl does no longer
- %% check for duplicates of testcases)
- Wc = filename:join(TestDir, "*_SUITE.erl"),
- [{list_to_atom(filename:basename(M, ".erl")),all} ||
- M <- filelib:wildcard(Wc)]
- end,
- {ok,Vars,Spec,St#state{topcase=TopCase}}.
-
-%% Or if option keep_topcase was given, eh... keep the topcase
-copy_topcase(Vars, Spec, St) ->
- {value,{topcase,Tc}} = lists:keysearch(topcase,1,Spec),
- {ok, Vars, lists:keydelete(topcase,1,Spec),St#state{topcase=Tc}}.
-
%% Run any "Makefile.first" files first.
%% XXX We should fake a failing test case if the make fails.
@@ -279,171 +152,14 @@ run_pre_makefile(Vars, Spec, St) ->
{error,_Reason}=Error -> Error
end.
-%% Search for `Makefile.src' in each *_SUITE_data directory.
-
-find_makefiles(Vars, Spec, St) ->
- Wc = filename:join(St#state.data_wc, "Makefile.src"),
- Makefiles = reverse(del_skipped_suite_data_dir(filelib:wildcard(Wc), Spec)),
- {ok,Vars,Spec,St#state{makefiles=Makefiles}}.
-
-%% Create "Makefile" from "Makefile.src".
-
-make_make(Vars, Spec, State) ->
- Src = State#state.makefile,
- Dest = filename:rootname(Src),
- ts_lib:progress(Vars, 1, "Making ~s...\n", [Dest]),
- case ts_lib:subst_file(Src, Dest, Vars) of
- ok ->
- {ok, Vars, Spec, State#state{makefile=Dest}};
- {error, Reason} ->
- {error, {Src, Reason}}
- end.
-
-%% Add a testcase which will do the making of the stuff in the data directory.
-
-add_make_testcase(Vars, Spec, St) ->
- Makefile = St#state.makefile,
- Dir = filename:dirname(Makefile),
- Shortname = filename:basename(Makefile),
- Suite = filename:basename(Dir, "_data"),
- Config = [{data_dir,Dir},{makefile,Shortname}],
- MakeModule = Suite ++ "_make",
- MakeModuleSrc = filename:join(filename:dirname(Dir),
- MakeModule ++ ".erl"),
- MakeMod = list_to_atom(MakeModule),
- case filelib:is_file(MakeModuleSrc) of
- true -> ok;
- false -> generate_make_module(ts_lib:var(make_command, Vars),
- MakeModuleSrc,
- MakeModule)
- end,
- case Suite of
- "all_SUITE" ->
- {ok,Vars,Spec,St#state{all={MakeMod,Config}}};
- _ ->
- %% Avoid duplicates of testcases. There is no longer
- %% a check for this in test_server_ctrl.
- TestCase = {list_to_atom(Suite),all},
- TopCase0 = case St#state.topcase of
- List when is_list(List) ->
- List -- [TestCase];
- Top ->
- [Top] -- [TestCase]
- end,
- TopCase = [{make,{MakeMod,make,[Config]},
- TestCase,
- {MakeMod,unmake,[Config]}}|TopCase0],
- {ok,Vars,Spec,St#state{topcase=TopCase}}
- end.
-
-generate_make_module(MakeCmd, Name, ModuleString) ->
- {ok,Host} = inet:gethostname(),
- file:write_file(Name,
- ["-module(",ModuleString,").\n",
- "\n",
- "-export([make/1,unmake/1]).\n",
- "\n",
- "make(Config) when is_list(Config) ->\n",
- " Mins = " ++ integer_to_list(?DEFAULT_MAKE_TIMETRAP_MINUTES) ++ ",\n"
- " test_server:format(\"=== Setting timetrap to ~p minutes ===~n\", [Mins]),\n"
- " TimeTrap = test_server:timetrap(test_server:minutes(Mins)),\n"
- " Res = ts_make:make([{make_command, \""++MakeCmd++"\"},{cross_node,\'ts@" ++ Host ++ "\'}|Config]),\n",
- " test_server:timetrap_cancel(TimeTrap),\n"
- " Res.\n"
- "\n",
- "unmake(Config) when is_list(Config) ->\n",
- " Mins = " ++ integer_to_list(?DEFAULT_UNMAKE_TIMETRAP_MINUTES) ++ ",\n"
- " test_server:format(\"=== Setting timetrap to ~p minutes ===~n\", [Mins]),\n"
- " TimeTrap = test_server:timetrap(test_server:minutes(Mins)),\n"
- " Res = ts_make:unmake([{make_command, \""++MakeCmd++"\"}|Config]),\n"
- " test_server:timetrap_cancel(TimeTrap),\n"
- " Res.\n"
- "\n"]).
-
-
-make_test_suite(Vars, _Spec, State) ->
- TestDir = State#state.test_dir,
-
- Erl_flags=[{i, "../test_server"}|ts_lib:var(erl_flags,Vars)],
-
- case code:is_loaded(test_server_line) of
- false -> code:load_file(test_server_line);
- _ -> ok
- end,
-
- {ok, Cwd} = file:get_cwd(),
- ok = file:set_cwd(TestDir),
- Result = (catch make_all(Erl_flags)),
- ok = file:set_cwd(Cwd),
- case Result of
- up_to_date ->
- ok;
- {'EXIT', Reason} ->
- %% If I return an error here, the test will be stopped
- %% and it will not show up in the top index page. Instead
- %% I return ok - the test will run for all existing suites.
- %% It might be that there are old suites that are run, but
- %% at least one suite is missing, and that is reported on the
- %% top index page.
- io:format("~s: {error,{make_crashed,~p}\n",
- [State#state.file,Reason]),
- ok;
- error ->
- %% See comment above
- io:format("~s: {error,make_of_test_suite_failed}\n",
- [State#state.file]),
- ok
- end.
-
-%% Add topcase to spec.
-
-add_topcase_to_spec(Vars, Spec, St) ->
- Tc = case St#state.all of
- {MakeMod,Config} ->
- [{make,{MakeMod,make,[Config]},
- St#state.topcase,
- {MakeMod,unmake,[Config]}}];
- undefined -> St#state.topcase
- end,
- {ok,Vars,Spec++[{topcase,Tc}],St}.
-
-%% Writes the (possibly transformed) spec file.
-
-write_spec_file(Vars, Spec, _State) ->
- F = fun(Term) -> io_lib:format("~p.~n", [Term]) end,
- SpecFile = map(F, Spec),
- Hosts =
- case lists:keysearch(hosts, 1, Vars) of
- false ->
- [];
- {value, {hosts, HostList}} ->
- io_lib:format("{hosts,~p}.~n",[HostList])
- end,
- DiskLess =
- case lists:keysearch(diskless, 1, Vars) of
- false ->
- [];
- {value, {diskless, How}} ->
- io_lib:format("{diskless, ~p}.~n",[How])
- end,
- Conf = consult_config(),
- MoreConfig = io_lib:format("~p.\n", [{config,Conf}]),
- file:write_file("current.spec", [DiskLess,Hosts,MoreConfig,SpecFile]).
-
-consult_config() ->
- {ok,Conf} = file:consult("ts.config"),
- case os:type() of
- {unix,_} -> consult_config("ts.unix.config", Conf);
- {win32,_} -> consult_config("ts.win32.config", Conf);
- vxworks -> consult_config("ts.vxworks.config", Conf);
- _ -> Conf
- end.
-
-consult_config(File, Conf0) ->
- case file:consult(File) of
- {ok,Conf} -> Conf++Conf0;
- {error,enoent} -> Conf0
- end.
+get_config_files() ->
+ TSConfig = "ts.config",
+ [TSConfig | case os:type() of
+ {unix,_} -> ["ts.unix.config"];
+ {win32,_} -> ["ts.win32.config"];
+ vxworks -> ["ts.vxworks.config"];
+ _ -> []
+ end].
%% Makes the command to start up the Erlang node to run the tests.
@@ -457,6 +173,7 @@ backslashify([]) ->
[].
make_command(Vars, Spec, State) ->
+ {ok,Cwd} = file:get_cwd(),
TestDir = State#state.test_dir,
TestPath = filename:nativename(TestDir),
Erl = case os:getenv("TS_RUN_VALGRIND") of
@@ -487,7 +204,7 @@ make_command(Vars, Spec, State) ->
{value,{erl_start_args,Args}} -> Args;
false -> ""
end,
- CrashFile = State#state.file ++ "_erl_crash.dump",
+ CrashFile = filename:join(Cwd,State#state.file ++ "_erl_crash.dump"),
case filelib:is_file(CrashFile) of
true ->
io:format("ts_run: Deleting dump: ~s\n",[CrashFile]),
@@ -495,7 +212,14 @@ make_command(Vars, Spec, State) ->
false ->
ok
end,
- Cmd = [Erl, Naming, "test_server -pa ", $", TestPath, $",
+
+ %% If Common Test specific variables are needed, add them here
+ %% on form: "{key1,value1}" "{key2,value2}" ...
+ NetDir = ts_lib:var(ts_net_dir, Vars),
+ TestVars = [ "\"{net_dir,\\\"",NetDir,"\\\"}\"" ],
+
+ %% NOTE: Do not use ' in these commands as it wont work on windows
+ Cmd = [Erl, Naming, "test_server"
" -rsh ", ts_lib:var(rsh_name, Vars),
" -env PATH \"",
backslashify(lists:flatten([TestPath, path_separator(),
@@ -505,15 +229,21 @@ make_command(Vars, Spec, State) ->
%% uncomment the line below to disable exception formatting
%% " -test_server_format_exception false",
" -boot start_sasl -sasl errlog_type error",
- " -s test_server_ctrl run_test ", State#state.test_server_args,
+ " -pz ",Cwd,
+ " -ct_test_vars ",TestVars,
+ " -eval \"file:set_cwd(\\\"",TestDir,"\\\")\" "
+ " -eval \"ct:run_test(",
+ backslashify(lists:flatten(State#state.test_server_args)),")\""
" ",
ExtraArgs],
{ok, Vars, Spec, State#state{command=lists:flatten(Cmd)}}.
+
run_batch(Vars, _Spec, State) ->
process_flag(trap_exit, true),
Command = State#state.command ++ " -noinput -s erlang halt",
ts_lib:progress(Vars, 1, "Command: ~s~n", [Command]),
+ io:format(user, "Command: ~s~n",[Command]),
Port = open_port({spawn, Command}, [stream, in, eof]),
tricky_print_data(Port).
@@ -554,7 +284,7 @@ is_testnode_dead([{"test_server",_}|_]) -> false;
is_testnode_dead([_|T]) -> is_testnode_dead(T).
run_interactive(Vars, _Spec, State) ->
- Command = State#state.command ++ " -s ts_reports make_index",
+ Command = State#state.command,
ts_lib:progress(Vars, 1, "Command: ~s~n", [Command]),
case ts_lib:var(os, Vars) of
"Windows 95" ->
@@ -604,77 +334,56 @@ path_separator() ->
end.
-make_test_server_args(Args0,Options,Vars) ->
- Parameters =
- case ts_lib:var(os, Vars) of
- "VxWorks" ->
- F = write_parameterfile(vxworks,Vars),
- " PARAMETERS " ++ F;
- _ ->
- ""
- end,
+make_common_test_args(Args0, Options, _Vars) ->
Trace =
case lists:keysearch(trace,1,Options) of
{value,{trace,TI}} when is_tuple(TI); is_tuple(hd(TI)) ->
ok = file:write_file(?tracefile,io_lib:format("~p.~n",[TI])),
- " TRACE " ++ ?tracefile;
+ [{ct_trace,?tracefile}];
{value,{trace,TIFile}} when is_atom(TIFile) ->
- " TRACE " ++ atom_to_list(TIFile);
+ [{ct_trace,atom_to_list(TIFile)}];
{value,{trace,TIFile}} ->
- " TRACE " ++ TIFile;
+ [{ct_trace,TIFile}];
false ->
- ""
+ []
end,
Cover =
case lists:keysearch(cover,1,Options) of
- {value,{cover,App,File,Analyse}} ->
- " COVER " ++ to_list(App) ++ " " ++ to_list(File) ++ " " ++
- to_list(Analyse);
+ {value,{cover, App, none, _Analyse}} ->
+ io:format("No cover file found for ~p~n",[App]),
+ [];
+ {value,{cover,_App,File,_Analyse}} ->
+ [{cover,to_list(File)}];
false ->
- ""
+ []
end,
- TCCallback =
- case ts_lib:var(ts_testcase_callback, Vars) of
- "" ->
- "";
- {Mod,Func} ->
- io:format("Function ~w:~w/4 will be called before and "
- "after each test case.\n", [Mod,Func]),
- " TESTCASE_CALLBACK " ++ to_list(Mod) ++ " " ++ to_list(Func);
- ModFunc when is_list(ModFunc) ->
- [Mod,Func]=string:tokens(ModFunc," "),
- io:format("Function ~s:~s/4 will be called before and "
- "after each test case.\n", [Mod,Func]),
- " TESTCASE_CALLBACK " ++ ModFunc;
- _ ->
- ""
- end,
- Args0 ++ Parameters ++ Trace ++ Cover ++ TCCallback.
+
+ Logdir = case lists:keysearch(logdir, 1, Options) of
+ {value,{logdir, _}} ->
+ [];
+ false ->
+ [{logdir,"../test_server"}]
+ end,
+
+ ConfigPath = case {os:getenv("TEST_CONFIG_PATH"),
+ lists:keysearch(config, 1, Options)} of
+ {false,{value, {config, Path}}} ->
+ Path;
+ {false,false} ->
+ "../test_server";
+ {Path,_} ->
+ Path
+ end,
+ ConfigFiles = [{config,[filename:join(ConfigPath,File)
+ || File <- get_config_files()]}],
+ io_lib:format("~100000p",[Args0++Trace++Cover++Logdir++
+ ConfigFiles++Options]).
to_list(X) when is_atom(X) ->
atom_to_list(X);
to_list(X) when is_list(X) ->
X.
-write_parameterfile(Type,Vars) ->
- Cross_host = ts_lib:var(target_host, Vars),
- SlaveTargets = case lists:keysearch(slavetargets,1,Vars) of
- {value, ST} ->
- [ST];
- _ ->
- []
- end,
- Master = case lists:keysearch(master,1,Vars) of
- {value,M} -> [M];
- false -> []
- end,
- ToWrite = [{type,Type},
- {target, list_to_atom(Cross_host)}] ++ SlaveTargets ++ Master,
-
- Crossfile = atom_to_list(Type) ++ "parameters" ++ os:getpid(),
- ok = file:write_file(Crossfile,io_lib:format("~p.~n", [ToWrite])),
- Crossfile.
-
%%
%% Paths and spaces handling for w2k and XP
%%
@@ -720,53 +429,3 @@ split_one(Path) ->
split_path(Path) ->
string:tokens(Path,";").
-
-%%
-%% Run make:all/1 if the test suite seems to be designed
-%% to be built/re-built by ts.
-%%
-make_all(Flags) ->
- case filelib:is_regular("Emakefile") of
- false ->
- make_all_no_emakefile(Flags);
- true ->
- make:all(Flags)
- end.
-
-make_all_no_emakefile(Flags) ->
- case filelib:wildcard("*.beam") of
- [] ->
- %% Since there are no *.beam files, we will assume
- %% that this test suite was designed to be built and
- %% re-built by ts. Create an Emakefile so that
- %% make:all/1 will be run the next time too
- %% (in case a test suite is being interactively
- %% developed).
- create_emakefile(Flags, "*.erl");
- [_|_] ->
- %% There is no Emakefile and there already are
- %% some *.beam files here. Assume that this test
- %% suite was not designed to be re-built by ts.
- %% Only create a Emakefile that will compile
- %% generated *_SUITE_make files (if any).
- create_emakefile(Flags, "*_SUITE_make.erl")
- end.
-
-create_emakefile(Flags, Wc) ->
- case filelib:wildcard(Wc) of
- [] ->
- %% There are no files to be built (i.e. not even any
- %% generated *_SUITE_make.erl files). We must handle
- %% this case specially, because make:all/1 will crash
- %% on Emakefile with an empty list of modules.
- io:put_chars("No Emakefile found - not running make:all/1\n"),
- up_to_date;
- [_|_]=Ms0 ->
- io:format("Creating an Emakefile for compiling files matching ~s\n",
- [Wc]),
- Ms = [list_to_atom(filename:rootname(M, ".erl")) || M <- Ms0],
- Make0 = {Ms,Flags},
- Make = io_lib:format("~p. \n", [Make0]),
- ok = file:write_file("Emakefile", Make),
- make:all(Flags)
- end.
diff --git a/lib/test_server/test/Makefile b/lib/test_server/test/Makefile
index fcb1282d16..ab72a9d579 100644
--- a/lib/test_server/test/Makefile
+++ b/lib/test_server/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2009. All Rights Reserved.
+# Copyright Ericsson AB 1997-2011. 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
@@ -27,11 +27,7 @@ include $(ERL_TOP)/make/$(TARGET)/otp.mk
MODULES= \
test_server_SUITE \
test_server_line_SUITE \
- test_server_skip_SUITE \
- test_server_conf01_SUITE \
- test_server_conf02_SUITE \
- test_server_parallel01_SUITE \
- test_server_shuffle01_SUITE
+ test_server_test_lib
ERL_FILES= $(MODULES:%=%.erl)
@@ -52,6 +48,7 @@ RELSYSDIR = $(RELEASE_PATH)/test_server_test
ERL_MAKE_FLAGS += -pa $(ERL_TOP)/lib/test_server/ebin
ERL_COMPILE_FLAGS += -I$(ERL_TOP)/lib/test_server/include
+ERL_COMPILE_FLAGS += -I$(ERL_TOP)/lib/test_server/test
EBIN = .
@@ -88,8 +85,8 @@ release_spec: opt
release_tests_spec: make_emakefile
$(INSTALL_DIR) $(RELSYSDIR)
$(INSTALL_DATA) $(EMAKEFILE) $(ERL_FILES) $(COVERFILE) $(RELSYSDIR)
- $(INSTALL_DATA) test_server.spec $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ $(INSTALL_DATA) test_server.spec test_server.cover $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
@tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
release_docs_spec:
diff --git a/lib/test_server/test/test_server.cover b/lib/test_server/test/test_server.cover
index c2366db166..5c59bab494 100644
--- a/lib/test_server/test/test_server.cover
+++ b/lib/test_server/test/test_server.cover
@@ -1,20 +1,22 @@
-{exclude,[test_server,
- test_server_ctrl,
- ts_selftest]}.
+{incl_app,test_server,details}.
-%% Using include list here because the test_server might not find
+{excl_mods, test_server, [test_server,
+ test_server_ctrl,
+ ts_selftest]}.
+
+%% Using incl_mods list here because the test_server might not find
%% lib_dir for test_server - and so it will not find which modules to
%% compile.
-{include,[erl2html2,
- test_server_node,
- test_server_sup,
- ts,
- ts_autoconf_vxworks,
- ts_autoconf_win32,
- ts_erl_config,
- ts_install,
- ts_lib,
- ts_make,
- ts_run,
- vxworks_client]}.
+{incl_mods, test_server, [erl2html2,
+ test_server_node,
+ test_server_sup,
+ ts,
+ ts_autoconf_vxworks,
+ ts_autoconf_win32,
+ ts_erl_config,
+ ts_install,
+ ts_lib,
+ ts_make,
+ ts_run,
+ vxworks_client]}.
diff --git a/lib/test_server/test/test_server.spec b/lib/test_server/test/test_server.spec
index 23b0b71963..a3b4d01d08 100644
--- a/lib/test_server/test/test_server.spec
+++ b/lib/test_server/test/test_server.spec
@@ -1,2 +1 @@
-{topcase, {dir, "../test_server_test"}}.
-{skip,{test_server_SUITE,skip_case7,"This case should be noted as `Skipped'"}}.
+{suites, "../test_server_test", all}.
diff --git a/lib/test_server/test/test_server_SUITE.erl b/lib/test_server/test/test_server_SUITE.erl
index 0563e1104f..4c344717f0 100644
--- a/lib/test_server/test/test_server_SUITE.erl
+++ b/lib/test_server/test/test_server_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2011. 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
@@ -16,539 +16,149 @@
%%
%% %CopyrightEnd%
%%
-
-%%%------------------------------------------------------------------
-%%% Test Server self test.
-%%%------------------------------------------------------------------
+%%%-------------------------------------------------------------------
+%%% @author Lukas Larsson <[email protected]>
+%%% @copyright (C) 2011, Erlang Solutions Ltd.
+%%% @doc
+%%%
+%%% @end
+%%% Created : 15 Feb 2011 by Lukas Larsson <[email protected]>
+%%%-------------------------------------------------------------------
-module(test_server_SUITE).
--include_lib("test_server/include/test_server.hrl").
--include_lib("test_server/include/test_server_line.hrl").
--include_lib("kernel/include/file.hrl").
--export([all/1]).
--export([init_per_suite/1, end_per_suite/1]).
--export([init_per_testcase/2, end_per_testcase/2, fin_per_testcase/2]).
--export([config/1, comment/1, timetrap/1, timetrap_cancel/1, multiply_timetrap/1,
- init_per_s/1, init_per_tc/1, end_per_tc/1,
- timeconv/1, msgs/1, capture/1, timecall/1,
- do_times/1, do_times_mfa/1, do_times_fun/1,
- skip_cases/1, skip_case1/1, skip_case2/1, skip_case3/1,
- skip_case4/1, skip_case5/1, skip_case6/1, skip_case7/1,
- skip_case8/1, skip_case9/1, undefined_functions/1,
- conf_init/1, check_new_conf/1, conf_cleanup/1,
- check_old_conf/1, conf_init_fail/1, start_stop_node/1,
- cleanup_nodes_init/1, check_survive_nodes/1, cleanup_nodes_fin/1,
- commercial/1]).
+%% Note: This directive should only be used in test suites.
+-compile(export_all).
+
+-include_lib("common_test/include/ct.hrl").
+-include("test_server_test_lib.hrl").
--export([dummy_function/0,dummy_function/1,doer/1]).
+%%--------------------------------------------------------------------
+%% COMMON TEST CALLBACK FUNCTIONS
+%%--------------------------------------------------------------------
-all(doc) -> ["Test Server self test"];
-all(suite) ->
- [config, comment, timetrap, timetrap_cancel, multiply_timetrap,
- init_per_s, init_per_tc, end_per_tc,
- timeconv, msgs, capture, timecall, do_times, skip_cases,
- undefined_functions, commercial,
- {conf, conf_init, [check_new_conf], conf_cleanup},
- check_old_conf,
- {conf, conf_init_fail,[conf_member_skip],conf_cleanup_skip},
- start_stop_node,
- {conf, cleanup_nodes_init,[check_survive_nodes],cleanup_nodes_fin},
- config
- ].
+%% @spec suite() -> Info
+suite() ->
+ [{ct_hooks,[ts_install_cth,test_server_test_lib]}].
+%% @spec init_per_suite(Config0) ->
+%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1}
init_per_suite(Config) ->
- [{init_per_suite_var,ok}|Config].
+ [{path_dirs,[proplists:get_value(data_dir,Config)]} | Config].
+%% @spec end_per_suite(Config) -> _
end_per_suite(_Config) ->
- ok.
-
-init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
- Dog = ?t:timetrap(?t:minutes(2)),
- Config1 = [{watchdog, Dog}|Config],
- case Func of
- init_per_tc ->
- [{strange_var, 1}|Config1];
- skip_case8 ->
- {skipped, "This case should be noted as `Skipped'"};
- skip_case9 ->
- {skip, "This case should be noted as `Skipped'"};
- _ ->
- Config1
- end;
-init_per_testcase(Func, Config) ->
- io:format("Func:~p",[Func]),
- io:format("Config:~p",[Config]),
- ?t:fail("Arguments to init_per_testcase not correct").
-
-end_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
- Dog=?config(watchdog, Config),
- ?t:timetrap_cancel(Dog),
- case Func of
- end_per_tc -> io:format("CLEANUP => this test case is ok\n");
- _Other -> ok
- end;
-end_per_testcase(Func, Config) ->
- io:format("Func:~p",[Func]),
- io:format("Config:~p",[Config]),
- ?t:fail("Arguments to end_per_testcase not correct").
-
-fin_per_testcase(Func, Config) ->
- io:format("Func:~p",[Func]),
- io:format("Config:~p",[Config]),
- ?t:fail("fin_per_testcase/2 called, should have called end_per_testcase/2").
+ io:format("TEST_SERVER_FRAMEWORK: ~p",[os:getenv("TEST_SERVER_FRAMEWORK")]),
+ ok.
+
+%% @spec init_per_group(GroupName, Config0) ->
+%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1}
+init_per_group(_GroupName, Config) ->
+ Config.
+
+%% @spec end_per_group(GroupName, Config0) ->
+%% void() | {save_config,Config1}
+end_per_group(_GroupName, _Config) ->
+ ok.
+
+%% @spec init_per_testcase(TestCase, Config0) ->
+%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1}
+init_per_testcase(_TestCase, Config) ->
+ Config.
+
+%% @spec end_per_testcase(TestCase, Config0) ->
+%% void() | {save_config,Config1} | {fail,Reason}
+end_per_testcase(_TestCase, _Config) ->
+ ok.
+
+%% @spec: groups() -> [Group]
+groups() ->
+ [].
+
+%% @spec all() -> GroupsAndTestCases | {skip,Reason}
+all() ->
+ [test_server_SUITE, test_server_parallel01_SUITE,
+ test_server_conf02_SUITE, test_server_conf01_SUITE,
+ test_server_skip_SUITE, test_server_shuffle01_SUITE].
+
+
+%%--------------------------------------------------------------------
+%% TEST CASES
+%%--------------------------------------------------------------------
+%% @spec TestCase(Config0) ->
+%% ok | exit() | {skip,Reason} | {comment,Comment} |
+%% {save_config,Config1} | {skip_and_save,Reason,Config1}
+test_server_SUITE(Config) ->
+% rpc:call(Node,dbg, tracer,[]),
+% rpc:call(Node,dbg, p,[all,c]),
+% rpc:call(Node,dbg, tpl,[test_server_ctrl,x]),
+ run_test_server_tests("test_server_SUITE", 39, 1, 31,
+ 20, 9, 1, 11, 2, 26, Config).
+
+test_server_parallel01_SUITE(Config) ->
+ run_test_server_tests("test_server_parallel01_SUITE", 37, 0, 19,
+ 19, 0, 0, 0, 0, 37, Config).
+
+test_server_shuffle01_SUITE(Config) ->
+ run_test_server_tests("test_server_shuffle01_SUITE", 130, 0, 0,
+ 76, 0, 0, 0, 0, 130, Config).
+
+test_server_skip_SUITE(Config) ->
+ run_test_server_tests("test_server_skip_SUITE", 3, 0, 1,
+ 0, 0, 1, 3, 0, 0, Config).
+
+test_server_conf01_SUITE(Config) ->
+ run_test_server_tests("test_server_conf01_SUITE", 24, 0, 12,
+ 12, 0, 0, 0, 0, 24, Config).
+
+test_server_conf02_SUITE(Config) ->
+ run_test_server_tests("test_server_conf02_SUITE", 26, 0, 12,
+ 12, 0, 0, 0, 0, 26, Config).
+
+
+run_test_server_tests(SuiteName, NCases, NFail, NExpected, NSucc,
+ NUsrSkip, NAutoSkip,
+ NActualSkip, NActualFail, NActualSucc, Config) ->
+ Node = proplists:get_value(node, Config),
+ {ok,_Pid} = rpc:call(Node,test_server_ctrl, start, []),
+ rpc:call(Node,
+ test_server_ctrl,add_dir_with_skip,
+ [SuiteName,
+ [proplists:get_value(data_dir,Config)],SuiteName,
+ [{test_server_SUITE,skip_case7,"SKIPPED!"}]]),
+
+ until(fun() ->
+ rpc:call(Node,test_server_ctrl,jobs,[]) =:= []
+ end),
-
-config(suite) -> [];
-config(doc) -> ["Test that the Config variable is decent, ",
- "and that the std config variables are correct ",
- "(check that data/priv dir exists)."
- "Also check that ?config macro works."];
-config(Config) when is_list(Config) ->
- is_tuplelist(Config),
- {value,{data_dir,Dd}}=lists:keysearch(data_dir,1,Config),
- {value,{priv_dir,Dp}}=lists:keysearch(priv_dir,1,Config),
- true=is_dir(Dd),
- {ok, _Bin}=file:read_file(filename:join(Dd, "dummy_file")),
- true=is_dir(Dp),
-
- Dd = ?config(data_dir,Config),
- Dp = ?config(priv_dir,Config),
- ok;
-config(_Config) ->
- ?t:fail("Config variable is not a list.").
-
-is_tuplelist([]) ->
- true;
-is_tuplelist([{_A,_B}|Rest]) ->
- is_tuplelist(Rest);
-is_tuplelist(_) ->
- false.
-
-is_dir(Dir) ->
- case file:read_file_info(Dir) of
- {ok, #file_info{type=directory}} ->
- true;
- _ ->
- false
- end.
-
-comment(suite) -> [];
-comment(doc) -> ["Print a comment in the HTML log"];
-comment(Config) when is_list(Config) ->
- ?t:comment("This comment should not occur in the HTML log because a later"
- " comment shall overwrite it"),
- ?t:comment("This comment is printed with the comment/1 function."
- " It should occur in the HTML log").
-
-
-
-timetrap(suite) -> [];
-timetrap(doc) -> ["Test that timetrap works."];
-timetrap(Config) when is_list(Config) ->
- TrapAfter = 3000,
- Dog=?t:timetrap(TrapAfter),
- process_flag(trap_exit, true),
- TimeOut = TrapAfter * test_server:timetrap_scale_factor() + 1000,
- receive
- {'EXIT', Dog, {timetrap_timeout, _, _}} ->
- ok;
- {'EXIT', _OtherPid, {timetrap_timeout, _, _}} ->
- ?t:fail("EXIT signal from wrong process")
- after
- TimeOut ->
- ?t:fail("Timetrap is not working.")
- end,
- ?t:timetrap_cancel(Dog),
- ok.
-
-
-timetrap_cancel(suite) -> [];
-timetrap_cancel(doc) -> ["Test that timetrap_cancel works."];
-timetrap_cancel(Config) when is_list(Config) ->
- Dog=?t:timetrap(1000),
- receive
- after
- 500 ->
- ok
- end,
- ?t:timetrap_cancel(Dog),
- receive
- after 1000 ->
- ok
- end,
- ok.
-
-multiply_timetrap(suite) -> [];
-multiply_timetrap(doc) -> ["Test multiply timetrap"];
-multiply_timetrap(Config) when is_list(Config) ->
- %% This simulates the call to test_server_ctrl:multiply_timetraps/1:
- put(test_server_multiply_timetraps,{2,true}),
-
- Dog = ?t:timetrap(500),
- timer:sleep(800),
- ?t:timetrap_cancel(Dog),
-
- %% Reset
- put(test_server_multiply_timetraps,1),
- ok.
-
-
-init_per_s(suite) -> [];
-init_per_s(doc) -> ["Test that a Config that is altered in ",
- "init_per_suite gets through to the testcases."];
-init_per_s(Config) ->
- %% Check that the config var sent from init_per_suite
- %% really exists.
- {value, {init_per_suite_var, ok}} =
- lists:keysearch(init_per_suite_var,1,Config),
-
- %% Check that the other variables still exist.
- {value,{data_dir,_Dd}}=lists:keysearch(data_dir,1,Config),
- {value,{priv_dir,_Dp}}=lists:keysearch(priv_dir,1,Config),
- ok.
-
-init_per_tc(suite) -> [];
-init_per_tc(doc) -> ["Test that a Config that is altered in ",
- "init_per_testcase gets through to the ",
- "actual testcase."];
-init_per_tc(Config) ->
- %% Check that the config var sent from init_per_testcase
- %% really exists.
- {value, {strange_var, 1}} = lists:keysearch(strange_var,1,Config),
-
- %% Check that the other variables still exist.
- {value,{data_dir,_Dd}}=lists:keysearch(data_dir,1,Config),
- {value,{priv_dir,_Dp}}=lists:keysearch(priv_dir,1,Config),
- ok.
-
-end_per_tc(suite) -> [];
-end_per_tc(doc) -> ["Test that end_per_testcase/2 is called even if"
- " test case fails"];
-end_per_tc(Config) when is_list(Config) ->
- ?t:fail("This case should fail! Check that \"CLEANUP\" is"
- " printed in the minor log file.").
-
-
-timeconv(suite) -> [];
-timeconv(doc) -> ["Test that the time unit conversion functions ",
- "works."];
-timeconv(Config) when is_list(Config) ->
- Val=2,
- Secs=Val*1000,
- Mins=Secs*60,
- Hrs=Mins*60,
- Secs=?t:seconds(2),
- Mins=?t:minutes(2),
- Hrs=?t:hours(2),
- ok.
-
-
-msgs(suite) -> [];
-msgs(doc) -> ["Tests the messages_get function."];
-msgs(Config) when is_list(Config) ->
- self() ! {hej, du},
- self() ! {lite, "data"},
- self() ! en_atom,
- [{hej, du}, {lite, "data"}, en_atom] = ?t:messages_get(),
- ok.
-
-capture(suite) -> [];
-capture(doc) -> ["Test that the capture functions work properly."];
-capture(Config) when is_list(Config) ->
- String1="abcedfghjiklmnopqrstuvwxyz",
- String2="0123456789",
- ?t:capture_start(),
- io:format(String1),
- [String1]=?t:capture_get(),
- io:format(String2),
- [String2]=?t:capture_get(),
- ?t:capture_stop(),
- []=?t:capture_get(),
- io:format(String2),
- []=?t:capture_get(),
- ok.
-
-timecall(suite) -> [];
-timecall(doc) -> ["Tests that timed calls work."];
-timecall(Config) when is_list(Config) ->
- {_Time1, liten_apa_e_oxo_farlig} = ?t:timecall(?MODULE, dummy_function, []),
- {Time2, jag_ar_en_gorilla} = ?t:timecall(?MODULE, dummy_function, [gorilla]),
- DTime=round(Time2),
- if
- DTime<1 ->
- ?t:fail("Timecall reported a too low time.");
- DTime==1 ->
+ rpc:call(Node,test_server_ctrl, stop, []),
+ {ok,#suite{ n_cases = NCases,
+ n_cases_failed = NFail,
+ n_cases_expected = NExpected,
+ n_cases_succ = NSucc,
+ n_cases_user_skip = NUsrSkip,
+ n_cases_auto_skip = NAutoSkip,
+ cases = Cases }} = Data =
+ test_server_test_lib:parse_suite(
+ hd(filelib:wildcard(
+ filename:join([proplists:get_value(priv_dir, Config),
+ SuiteName++".logs","run*","suite.log"])))),
+ {NActualSkip,NActualFail,NActualSucc} =
+ lists:foldl(fun(#tc{ result = skip },{S,F,Su}) ->
+ {S+1,F,Su};
+ (#tc{ result = ok },{S,F,Su}) ->
+ {S,F,Su+1};
+ (#tc{ result = failed },{S,F,Su}) ->
+ {S,F+1,Su}
+ end,{0,0,0},Cases),
+ Data.
+
+until(Fun) ->
+ case Fun() of
+ true ->
ok;
- DTime>1 ->
- ?t:fail("Timecall reported a too high time.")
- end,
- ok.
-
-dummy_function() ->
- liten_apa_e_oxo_farlig.
-dummy_function(gorilla) ->
- receive after 1000 -> ok end,
- jag_ar_en_gorilla.
-
-
-do_times(suite) -> [do_times_mfa, do_times_fun];
-do_times(doc) -> ["Test the do_times function."].
-
-do_times_mfa(suite) -> [];
-do_times_mfa(doc) -> ["Test the do_times function with M,F,A given."];
-do_times_mfa(Config) when is_list(Config) ->
- ?t:do_times(100, ?MODULE, doer, [self()]),
- 100=length(?t:messages_get()),
- ok.
-
-do_times_fun(suite) -> [];
-do_times_fun(doc) -> ["Test the do_times function with fun given."];
-do_times_fun(Config) when is_list(Config) ->
- Self = self(),
- ?t:do_times(100, fun() -> doer(Self) end),
- 100=length(?t:messages_get()),
- ok.
-
-doer(From) ->
- From ! a,
- ok.
-
-skip_cases(doc) -> ["Test all possible ways to skip a test case."];
-skip_cases(suite) -> [skip_case1, skip_case2, skip_case3, skip_case4,
- skip_case5, skip_case6, skip_case7, skip_case8,
- skip_case9].
-
-skip_case1(suite) -> [];
-skip_case1(doc) -> ["Test that you can return {skipped, Reason},"
- " and that Reason is in the comment field in the HTML log"];
-skip_case1(Config) when is_list(Config) ->
- %% If this comment shows, the case failed!!
- ?t:comment("ERROR: This case should have been noted as `Skipped'"),
- %% The Reason in {skipped, Reason} should overwrite a 'comment'
- {skipped, "This case should be noted as `Skipped'"}.
-
-skip_case2(suite) -> [];
-skip_case2(doc) -> ["Test that you can return {skipped, Reason},"
- " and that Reason is in the comment field in the HTML log"];
-skip_case2(Config) when is_list(Config) ->
- %% If this comment shows, the case failed!!
- ?t:comment("ERROR: This case should have been noted as `Skipped'"),
- %% The Reason in {skipped, Reason} should overwrite a 'comment'
- exit({skipped, "This case should be noted as `Skipped'"}).
-
-skip_case3(suite) -> [];
-skip_case3(doc) -> ["Test that you can return {skip, Reason},"
- " and that Reason is in the comment field in the HTML log"];
-skip_case3(Config) when is_list(Config) ->
- %% If this comment shows, the case failed!!
- ?t:comment("ERROR: This case should have been noted as `Skipped'"),
- %% The Reason in {skip, Reason} should overwrite a 'comment'
- {skip, "This case should be noted as `Skipped'"}.
-
-skip_case4(suite) -> [];
-skip_case4(doc) -> ["Test that you can return {skip, Reason},"
- " and that Reason is in the comment field in the HTML log"];
-skip_case4(Config) when is_list(Config) ->
- %% If this comment shows, the case failed!!
- ?t:comment("ERROR: This case should have been noted as `Skipped'"),
- %% The Reason in {skip, Reason} should overwrite a 'comment'
- exit({skip, "This case should be noted as `Skipped'"}).
-
-skip_case5(suite) -> {skipped, "This case should be noted as `Skipped'"};
-skip_case5(doc) -> ["Test that you can return {skipped, Reason}"
- " from the specification clause"].
-
-skip_case6(suite) -> {skip, "This case should be noted as `Skipped'"};
-skip_case6(doc) -> ["Test that you can return {skip, Reason}"
- " from the specification clause"].
-
-skip_case7(suite) -> [];
-skip_case7(doc) -> ["Test that skip works from a test specification file"];
-skip_case7(Config) when is_list(Config) ->
- %% This case shall be skipped by adding
- %% {skip, {test_server_SUITE, skip_case7, Reason}}.
- %% to the test specification file.
- ?t:fail("This case should have been Skipped by the .spec file").
-
-skip_case8(suite) -> [];
-skip_case8(doc) -> ["Test that {skipped, Reason} works from"
- " init_per_testcase/2"];
-skip_case8(Config) when is_list(Config) ->
- %% This case shall be skipped by adding a specific clause to
- %% returning {skipped, Reason} from init_per_testcase/2 for this case.
- ?t:fail("This case should have been Skipped by init_per_testcase/2").
-
-skip_case9(suite) -> [];
-skip_case9(doc) -> ["Test that {skip, Reason} works from a init_per_testcase/2"];
-skip_case9(Config) when is_list(Config) ->
- %% This case shall be skipped by adding a specific clause to
- %% returning {skip, Reason} from init_per_testcase/2 for this case.
- ?t:fail("This case should have been Skipped by init_per_testcase/2").
-
-undefined_functions(suite) -> [];
-undefined_functions(doc) -> ["Check for calls to undefined functions in"
- " test_server."
- "Skip if cover is running"];
-undefined_functions(Config) when is_list(Config) ->
- case whereis(cover_server) of
- Pid when is_pid(Pid) ->
- {skip,"Cover is running"};
- undefined ->
- undefined_functions()
- end.
-
-undefined_functions() ->
- TestServerDir = filename:dirname(code:which(test_server)),
- Res = xref:d(TestServerDir),
-
- {value,{unused,Unused}} = lists:keysearch(unused, 1, Res),
- case Unused of
- [] -> ok;
- _ ->
- lists:foreach(fun (MFA) ->
- io:format("~s unused", [format_mfa(MFA)])
- end, Unused)
- end,
-
- {value,{undefined,Undef0}} = lists:keysearch(undefined, 1, Res),
- Undef = [U || U <- Undef0, not unresolved(U)],
- case Undef of
- [] -> ok;
- _ ->
- lists:foreach(fun ({MFA1,MFA2}) ->
- io:format("~s calls undefined ~s",
- [format_mfa(MFA1),format_mfa(MFA2)])
- end, Undef),
- ?t:fail({length(Undef),undefined_functions_in_otp})
- end,
- ok.
-
-unresolved({_,{_,'$F_EXPR',_}}) -> true;
-unresolved(_) -> false.
-
-format_mfa({M,F,A}) ->
- lists:flatten(io_lib:format("~s:~s/~p", [M,F,A])).
-
-conf_init(doc) -> ["Test successful conf case: Change Config parameter"];
-conf_init(Config) when is_list(Config) ->
- [{conf_init_var,1389}|Config].
-
-check_new_conf(suite) -> [];
-check_new_conf(doc) -> ["Check that Config parameter changed by"
- " conf_init is used"];
-check_new_conf(Config) when is_list(Config) ->
- 1389 = ?config(conf_init_var,Config),
- ok.
-
-conf_cleanup(doc) -> ["Test successful conf case: Restore Config parameter"];
-conf_cleanup(Config) when is_list(Config) ->
- lists:keydelete(conf_init_var,1,Config).
-
-check_old_conf(suite) -> [];
-check_old_conf(doc) -> ["Test that the restored Config is used after a"
- " conf cleanup"];
-check_old_conf(Config) when is_list(Config) ->
- undefined = ?config(conf_init_var,Config),
- ok.
-
-conf_init_fail(doc) -> ["Test that config members are skipped if"
- " conf init function fails."];
-conf_init_fail(Config) when is_list(Config) ->
- ?t:fail("This case should fail! Check that conf_member_skip and"
- " conf_cleanup_skip are skipped.").
-
-
-
-start_stop_node(suite) -> [];
-start_stop_node(doc) -> ["Test start and stop of slave and peer nodes"];
-start_stop_node(Config) when is_list(Config) ->
- {ok,Node2} = ?t:start_node(node2,peer,[]),
- {error, _} = ?t:start_node(node2,peer,[{fail_on_error,false}]),
- true = lists:member(Node2,nodes()),
-
- {ok,Node3} = ?t:start_node(node3,slave,[]),
- {error, _} = ?t:start_node(node3,slave,[]),
- true = lists:member(Node3,nodes()),
-
- {ok,Node4} = ?t:start_node(node4,peer,[{wait,false}]),
- case lists:member(Node4,nodes()) of
- true ->
- ?t:comment("WARNING: Node started with {wait,false}"
- " is up faster than expected...");
false ->
- wait_for_node(Node4,0),
- true = lists:member(Node4,nodes())
- end,
-
- true = ?t:stop_node(Node2),
- false = lists:member(Node2,nodes()),
-
- true = ?t:stop_node(Node3),
- false = lists:member(Node3,nodes()),
-
- true = ?t:stop_node(Node4),
- false = lists:member(Node4,nodes()),
- timer:sleep(2000),
- false = ?t:stop_node(Node4),
-
- ok.
-
-
-wait_for_node(Node,Acc) ->
- case net_adm:ping(Node) of
- pang ->
timer:sleep(100),
- wait_for_node(Node,Acc+100);
- pong ->
- Acc
+ until(Fun)
end.
-
-cleanup_nodes_init(doc) -> ["Test that nodes are terminated when test case"
- " is finished unless {cleanup,false} is given."];
-cleanup_nodes_init(Config) when is_list(Config) ->
- {ok,DieSlave} = ?t:start_node(die_slave, slave, []),
- {ok,SurviveSlave} = ?t:start_node(survive_slave, slave, [{cleanup,false}]),
- {ok,DiePeer} = ?t:start_node(die_peer, peer, []),
- {ok,SurvivePeer} = ?t:start_node(survive_peer, peer, [{cleanup,false}]),
- [{die_slave,DieSlave},
- {survive_slave,SurviveSlave},
- {die_peer,DiePeer},
- {survive_peer,SurvivePeer} | Config].
-
-
-
-check_survive_nodes(suite) -> [];
-check_survive_nodes(doc) -> ["Test that nodes with {cleanup,false} survived"];
-check_survive_nodes(Config) when is_list(Config) ->
- timer:sleep(1000),
- false = lists:member(?config(die_slave,Config),nodes()),
- true = lists:member(?config(survive_slave,Config),nodes()),
- false = lists:member(?config(die_peer,Config),nodes()),
- true = lists:member(?config(survive_peer,Config),nodes()),
- ok.
-
-
-cleanup_nodes_fin(doc) -> ["Test that nodes started with {cleanup,false}"
- " can be stopped"];
-cleanup_nodes_fin(Config) when is_list(Config) ->
- Slave = ?config(survive_slave,Config),
- Peer = ?config(survive_peer,Config),
-
- true = ?t:stop_node(Slave),
- false = lists:member(Slave,nodes()),
- true = ?t:stop_node(Peer),
- false = lists:member(Peer,nodes()),
-
- C1 = lists:keydelete(die_slave,1,Config),
- C2 = lists:keydelete(survive_slave,1,C1),
- C3 = lists:keydelete(die_peer,1,C2),
- lists:keydelete(survive_peer,1,C3).
-
-commercial(Config) when is_list(Config) ->
- case ?t:is_commercial() of
- false -> {comment,"Open-source build"};
- true -> {comment,"Commercial build"}
- end.
-
-
+
diff --git a/lib/test_server/test/test_server_SUITE_data/Makefile.src b/lib/test_server/test/test_server_SUITE_data/Makefile.src
new file mode 100644
index 0000000000..d5af919eec
--- /dev/null
+++ b/lib/test_server/test/test_server_SUITE_data/Makefile.src
@@ -0,0 +1,2 @@
+all:
+ erlc *.erl \ No newline at end of file
diff --git a/lib/test_server/test/test_server_SUITE_data/test_server_SUITE.erl b/lib/test_server/test/test_server_SUITE_data/test_server_SUITE.erl
new file mode 100644
index 0000000000..dfcdff0c3e
--- /dev/null
+++ b/lib/test_server/test/test_server_SUITE_data/test_server_SUITE.erl
@@ -0,0 +1,554 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2011. 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%
+%%
+
+%%%------------------------------------------------------------------
+%%% Test Server self test.
+%%%------------------------------------------------------------------
+-module(test_server_SUITE).
+-include_lib("test_server/include/test_server.hrl").
+-include_lib("test_server/include/test_server_line.hrl").
+-include_lib("kernel/include/file.hrl").
+-export([all/1]).
+
+-export([init_per_suite/1, end_per_suite/1]).
+-export([init_per_testcase/2, end_per_testcase/2, fin_per_testcase/2]).
+-export([config/1, comment/1, timetrap/1, timetrap_cancel/1, multiply_timetrap/1,
+ init_per_s/1, init_per_tc/1, end_per_tc/1,
+ timeconv/1, msgs/1, capture/1, timecall/1,
+ do_times/1, do_times_mfa/1, do_times_fun/1,
+ skip_cases/1, skip_case1/1, skip_case2/1, skip_case3/1,
+ skip_case4/1, skip_case5/1, skip_case6/1, skip_case7/1,
+ skip_case8/1, skip_case9/1, undefined_functions/1,
+ conf_init/1, check_new_conf/1, conf_cleanup/1,
+ check_old_conf/1, conf_init_fail/1, start_stop_node/1,
+ cleanup_nodes_init/1, check_survive_nodes/1, cleanup_nodes_fin/1,
+ commercial/1]).
+
+-export([dummy_function/0,dummy_function/1,doer/1]).
+
+all(doc) -> ["Test Server self test"];
+all(suite) ->
+ [config, comment, timetrap, timetrap_cancel, multiply_timetrap,
+ init_per_s, init_per_tc, end_per_tc,
+ timeconv, msgs, capture, timecall, do_times, skip_cases,
+ undefined_functions, commercial,
+ {conf, conf_init, [check_new_conf], conf_cleanup},
+ check_old_conf,
+ {conf, conf_init_fail,[conf_member_skip],conf_cleanup_skip},
+ start_stop_node,
+ {conf, cleanup_nodes_init,[check_survive_nodes],cleanup_nodes_fin},
+ config
+ ].
+
+
+init_per_suite(Config) ->
+ [{init_per_suite_var,ok}|Config].
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
+ Dog = ?t:timetrap(?t:minutes(2)),
+ Config1 = [{watchdog, Dog}|Config],
+ case Func of
+ init_per_tc ->
+ [{strange_var, 1}|Config1];
+ skip_case8 ->
+ {skipped, "This case should be noted as `Skipped'"};
+ skip_case9 ->
+ {skip, "This case should be noted as `Skipped'"};
+ _ ->
+ Config1
+ end;
+init_per_testcase(Func, Config) ->
+ io:format("Func:~p",[Func]),
+ io:format("Config:~p",[Config]),
+ ?t:fail("Arguments to init_per_testcase not correct").
+
+end_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
+ Dog=?config(watchdog, Config),
+ ?t:timetrap_cancel(Dog),
+ case Func of
+ end_per_tc -> io:format("CLEANUP => this test case is ok\n");
+ _Other -> ok
+ end;
+end_per_testcase(Func, Config) ->
+ io:format("Func:~p",[Func]),
+ io:format("Config:~p",[Config]),
+ ?t:fail("Arguments to end_per_testcase not correct").
+
+fin_per_testcase(Func, Config) ->
+ io:format("Func:~p",[Func]),
+ io:format("Config:~p",[Config]),
+ ?t:fail("fin_per_testcase/2 called, should have called end_per_testcase/2").
+
+
+config(suite) -> [];
+config(doc) -> ["Test that the Config variable is decent, ",
+ "and that the std config variables are correct ",
+ "(check that data/priv dir exists)."
+ "Also check that ?config macro works."];
+config(Config) when is_list(Config) ->
+ is_tuplelist(Config),
+ {value,{data_dir,Dd}}=lists:keysearch(data_dir,1,Config),
+ {value,{priv_dir,Dp}}=lists:keysearch(priv_dir,1,Config),
+ true=is_dir(Dd),
+ {ok, _Bin}=file:read_file(filename:join(Dd, "dummy_file")),
+ true=is_dir(Dp),
+
+ Dd = ?config(data_dir,Config),
+ Dp = ?config(priv_dir,Config),
+ ok;
+config(_Config) ->
+ ?t:fail("Config variable is not a list.").
+
+is_tuplelist([]) ->
+ true;
+is_tuplelist([{_A,_B}|Rest]) ->
+ is_tuplelist(Rest);
+is_tuplelist(_) ->
+ false.
+
+is_dir(Dir) ->
+ case file:read_file_info(Dir) of
+ {ok, #file_info{type=directory}} ->
+ true;
+ _ ->
+ false
+ end.
+
+comment(suite) -> [];
+comment(doc) -> ["Print a comment in the HTML log"];
+comment(Config) when is_list(Config) ->
+ ?t:comment("This comment should not occur in the HTML log because a later"
+ " comment shall overwrite it"),
+ ?t:comment("This comment is printed with the comment/1 function."
+ " It should occur in the HTML log").
+
+
+
+timetrap(suite) -> [];
+timetrap(doc) -> ["Test that timetrap works."];
+timetrap(Config) when is_list(Config) ->
+ TrapAfter = 3000,
+ Dog=?t:timetrap(TrapAfter),
+ process_flag(trap_exit, true),
+ TimeOut = TrapAfter * test_server:timetrap_scale_factor() + 1000,
+ receive
+ {'EXIT', Dog, {timetrap_timeout, _, _}} ->
+ ok;
+ {'EXIT', _OtherPid, {timetrap_timeout, _, _}} ->
+ ?t:fail("EXIT signal from wrong process")
+ after
+ TimeOut ->
+ ?t:fail("Timetrap is not working.")
+ end,
+ ?t:timetrap_cancel(Dog),
+ ok.
+
+
+timetrap_cancel(suite) -> [];
+timetrap_cancel(doc) -> ["Test that timetrap_cancel works."];
+timetrap_cancel(Config) when is_list(Config) ->
+ Dog=?t:timetrap(1000),
+ receive
+ after
+ 500 ->
+ ok
+ end,
+ ?t:timetrap_cancel(Dog),
+ receive
+ after 1000 ->
+ ok
+ end,
+ ok.
+
+multiply_timetrap(suite) -> [];
+multiply_timetrap(doc) -> ["Test multiply timetrap"];
+multiply_timetrap(Config) when is_list(Config) ->
+ %% This simulates the call to test_server_ctrl:multiply_timetraps/1:
+ put(test_server_multiply_timetraps,{2,true}),
+
+ Dog = ?t:timetrap(500),
+ timer:sleep(800),
+ ?t:timetrap_cancel(Dog),
+
+ %% Reset
+ put(test_server_multiply_timetraps,1),
+ ok.
+
+
+init_per_s(suite) -> [];
+init_per_s(doc) -> ["Test that a Config that is altered in ",
+ "init_per_suite gets through to the testcases."];
+init_per_s(Config) ->
+ %% Check that the config var sent from init_per_suite
+ %% really exists.
+ {value, {init_per_suite_var, ok}} =
+ lists:keysearch(init_per_suite_var,1,Config),
+
+ %% Check that the other variables still exist.
+ {value,{data_dir,_Dd}}=lists:keysearch(data_dir,1,Config),
+ {value,{priv_dir,_Dp}}=lists:keysearch(priv_dir,1,Config),
+ ok.
+
+init_per_tc(suite) -> [];
+init_per_tc(doc) -> ["Test that a Config that is altered in ",
+ "init_per_testcase gets through to the ",
+ "actual testcase."];
+init_per_tc(Config) ->
+ %% Check that the config var sent from init_per_testcase
+ %% really exists.
+ {value, {strange_var, 1}} = lists:keysearch(strange_var,1,Config),
+
+ %% Check that the other variables still exist.
+ {value,{data_dir,_Dd}}=lists:keysearch(data_dir,1,Config),
+ {value,{priv_dir,_Dp}}=lists:keysearch(priv_dir,1,Config),
+ ok.
+
+end_per_tc(suite) -> [];
+end_per_tc(doc) -> ["Test that end_per_testcase/2 is called even if"
+ " test case fails"];
+end_per_tc(Config) when is_list(Config) ->
+ ?t:fail("This case should fail! Check that \"CLEANUP\" is"
+ " printed in the minor log file.").
+
+
+timeconv(suite) -> [];
+timeconv(doc) -> ["Test that the time unit conversion functions ",
+ "works."];
+timeconv(Config) when is_list(Config) ->
+ Val=2,
+ Secs=Val*1000,
+ Mins=Secs*60,
+ Hrs=Mins*60,
+ Secs=?t:seconds(2),
+ Mins=?t:minutes(2),
+ Hrs=?t:hours(2),
+ ok.
+
+
+msgs(suite) -> [];
+msgs(doc) -> ["Tests the messages_get function."];
+msgs(Config) when is_list(Config) ->
+ self() ! {hej, du},
+ self() ! {lite, "data"},
+ self() ! en_atom,
+ [{hej, du}, {lite, "data"}, en_atom] = ?t:messages_get(),
+ ok.
+
+capture(suite) -> [];
+capture(doc) -> ["Test that the capture functions work properly."];
+capture(Config) when is_list(Config) ->
+ String1="abcedfghjiklmnopqrstuvwxyz",
+ String2="0123456789",
+ ?t:capture_start(),
+ io:format(String1),
+ [String1]=?t:capture_get(),
+ io:format(String2),
+ [String2]=?t:capture_get(),
+ ?t:capture_stop(),
+ []=?t:capture_get(),
+ io:format(String2),
+ []=?t:capture_get(),
+ ok.
+
+timecall(suite) -> [];
+timecall(doc) -> ["Tests that timed calls work."];
+timecall(Config) when is_list(Config) ->
+ {_Time1, liten_apa_e_oxo_farlig} = ?t:timecall(?MODULE, dummy_function, []),
+ {Time2, jag_ar_en_gorilla} = ?t:timecall(?MODULE, dummy_function, [gorilla]),
+ DTime=round(Time2),
+ if
+ DTime<1 ->
+ ?t:fail("Timecall reported a too low time.");
+ DTime==1 ->
+ ok;
+ DTime>1 ->
+ ?t:fail("Timecall reported a too high time.")
+ end,
+ ok.
+
+dummy_function() ->
+ liten_apa_e_oxo_farlig.
+dummy_function(gorilla) ->
+ receive after 1000 -> ok end,
+ jag_ar_en_gorilla.
+
+
+do_times(suite) -> [do_times_mfa, do_times_fun];
+do_times(doc) -> ["Test the do_times function."].
+
+do_times_mfa(suite) -> [];
+do_times_mfa(doc) -> ["Test the do_times function with M,F,A given."];
+do_times_mfa(Config) when is_list(Config) ->
+ ?t:do_times(100, ?MODULE, doer, [self()]),
+ 100=length(?t:messages_get()),
+ ok.
+
+do_times_fun(suite) -> [];
+do_times_fun(doc) -> ["Test the do_times function with fun given."];
+do_times_fun(Config) when is_list(Config) ->
+ Self = self(),
+ ?t:do_times(100, fun() -> doer(Self) end),
+ 100=length(?t:messages_get()),
+ ok.
+
+doer(From) ->
+ From ! a,
+ ok.
+
+skip_cases(doc) -> ["Test all possible ways to skip a test case."];
+skip_cases(suite) -> [skip_case1, skip_case2, skip_case3, skip_case4,
+ skip_case5, skip_case6, skip_case7, skip_case8,
+ skip_case9].
+
+skip_case1(suite) -> [];
+skip_case1(doc) -> ["Test that you can return {skipped, Reason},"
+ " and that Reason is in the comment field in the HTML log"];
+skip_case1(Config) when is_list(Config) ->
+ %% If this comment shows, the case failed!!
+ ?t:comment("ERROR: This case should have been noted as `Skipped'"),
+ %% The Reason in {skipped, Reason} should overwrite a 'comment'
+ {skipped, "This case should be noted as `Skipped'"}.
+
+skip_case2(suite) -> [];
+skip_case2(doc) -> ["Test that you can return {skipped, Reason},"
+ " and that Reason is in the comment field in the HTML log"];
+skip_case2(Config) when is_list(Config) ->
+ %% If this comment shows, the case failed!!
+ ?t:comment("ERROR: This case should have been noted as `Skipped'"),
+ %% The Reason in {skipped, Reason} should overwrite a 'comment'
+ exit({skipped, "This case should be noted as `Skipped'"}).
+
+skip_case3(suite) -> [];
+skip_case3(doc) -> ["Test that you can return {skip, Reason},"
+ " and that Reason is in the comment field in the HTML log"];
+skip_case3(Config) when is_list(Config) ->
+ %% If this comment shows, the case failed!!
+ ?t:comment("ERROR: This case should have been noted as `Skipped'"),
+ %% The Reason in {skip, Reason} should overwrite a 'comment'
+ {skip, "This case should be noted as `Skipped'"}.
+
+skip_case4(suite) -> [];
+skip_case4(doc) -> ["Test that you can return {skip, Reason},"
+ " and that Reason is in the comment field in the HTML log"];
+skip_case4(Config) when is_list(Config) ->
+ %% If this comment shows, the case failed!!
+ ?t:comment("ERROR: This case should have been noted as `Skipped'"),
+ %% The Reason in {skip, Reason} should overwrite a 'comment'
+ exit({skip, "This case should be noted as `Skipped'"}).
+
+skip_case5(suite) -> {skipped, "This case should be noted as `Skipped'"};
+skip_case5(doc) -> ["Test that you can return {skipped, Reason}"
+ " from the specification clause"].
+
+skip_case6(suite) -> {skip, "This case should be noted as `Skipped'"};
+skip_case6(doc) -> ["Test that you can return {skip, Reason}"
+ " from the specification clause"].
+
+skip_case7(suite) -> [];
+skip_case7(doc) -> ["Test that skip works from a test specification file"];
+skip_case7(Config) when is_list(Config) ->
+ %% This case shall be skipped by adding
+ %% {skip, {test_server_SUITE, skip_case7, Reason}}.
+ %% to the test specification file.
+ ?t:fail("This case should have been Skipped by the .spec file").
+
+skip_case8(suite) -> [];
+skip_case8(doc) -> ["Test that {skipped, Reason} works from"
+ " init_per_testcase/2"];
+skip_case8(Config) when is_list(Config) ->
+ %% This case shall be skipped by adding a specific clause to
+ %% returning {skipped, Reason} from init_per_testcase/2 for this case.
+ ?t:fail("This case should have been Skipped by init_per_testcase/2").
+
+skip_case9(suite) -> [];
+skip_case9(doc) -> ["Test that {skip, Reason} works from a init_per_testcase/2"];
+skip_case9(Config) when is_list(Config) ->
+ %% This case shall be skipped by adding a specific clause to
+ %% returning {skip, Reason} from init_per_testcase/2 for this case.
+ ?t:fail("This case should have been Skipped by init_per_testcase/2").
+
+undefined_functions(suite) -> [];
+undefined_functions(doc) -> ["Check for calls to undefined functions in"
+ " test_server."
+ "Skip if cover is running"];
+undefined_functions(Config) when is_list(Config) ->
+ case whereis(cover_server) of
+ Pid when is_pid(Pid) ->
+ {skip,"Cover is running"};
+ undefined ->
+ undefined_functions()
+ end.
+
+undefined_functions() ->
+ TestServerDir = filename:dirname(code:which(test_server)),
+ Res = xref:d(TestServerDir),
+
+ {value,{unused,Unused}} = lists:keysearch(unused, 1, Res),
+ case Unused of
+ [] -> ok;
+ _ ->
+ lists:foreach(fun (MFA) ->
+ io:format("~s unused", [format_mfa(MFA)])
+ end, Unused)
+ end,
+
+ {value,{undefined,Undef0}} = lists:keysearch(undefined, 1, Res),
+ Undef = [U || U <- Undef0, not unresolved(U)],
+ case Undef of
+ [] -> ok;
+ _ ->
+ lists:foreach(fun ({MFA1,MFA2}) ->
+ io:format("~s calls undefined ~s",
+ [format_mfa(MFA1),format_mfa(MFA2)])
+ end, Undef),
+ ?t:fail({length(Undef),undefined_functions_in_otp})
+ end,
+ ok.
+
+unresolved({_,{_,'$F_EXPR',_}}) -> true;
+unresolved(_) -> false.
+
+format_mfa({M,F,A}) ->
+ lists:flatten(io_lib:format("~s:~s/~p", [M,F,A])).
+
+conf_init(doc) -> ["Test successful conf case: Change Config parameter"];
+conf_init(Config) when is_list(Config) ->
+ [{conf_init_var,1389}|Config].
+
+check_new_conf(suite) -> [];
+check_new_conf(doc) -> ["Check that Config parameter changed by"
+ " conf_init is used"];
+check_new_conf(Config) when is_list(Config) ->
+ 1389 = ?config(conf_init_var,Config),
+ ok.
+
+conf_cleanup(doc) -> ["Test successful conf case: Restore Config parameter"];
+conf_cleanup(Config) when is_list(Config) ->
+ lists:keydelete(conf_init_var,1,Config).
+
+check_old_conf(suite) -> [];
+check_old_conf(doc) -> ["Test that the restored Config is used after a"
+ " conf cleanup"];
+check_old_conf(Config) when is_list(Config) ->
+ undefined = ?config(conf_init_var,Config),
+ ok.
+
+conf_init_fail(doc) -> ["Test that config members are skipped if"
+ " conf init function fails."];
+conf_init_fail(Config) when is_list(Config) ->
+ ?t:fail("This case should fail! Check that conf_member_skip and"
+ " conf_cleanup_skip are skipped.").
+
+
+
+start_stop_node(suite) -> [];
+start_stop_node(doc) -> ["Test start and stop of slave and peer nodes"];
+start_stop_node(Config) when is_list(Config) ->
+ {ok,Node2} = ?t:start_node(node2,peer,[]),
+ {error, _} = ?t:start_node(node2,peer,[{fail_on_error,false}]),
+ true = lists:member(Node2,nodes()),
+
+ {ok,Node3} = ?t:start_node(node3,slave,[]),
+ {error, _} = ?t:start_node(node3,slave,[]),
+ true = lists:member(Node3,nodes()),
+
+ {ok,Node4} = ?t:start_node(node4,peer,[{wait,false}]),
+ case lists:member(Node4,nodes()) of
+ true ->
+ ?t:comment("WARNING: Node started with {wait,false}"
+ " is up faster than expected...");
+ false ->
+ wait_for_node(Node4,0),
+ true = lists:member(Node4,nodes())
+ end,
+
+ true = ?t:stop_node(Node2),
+ false = lists:member(Node2,nodes()),
+
+ true = ?t:stop_node(Node3),
+ false = lists:member(Node3,nodes()),
+
+ true = ?t:stop_node(Node4),
+ false = lists:member(Node4,nodes()),
+ timer:sleep(2000),
+ false = ?t:stop_node(Node4),
+
+ ok.
+
+
+wait_for_node(Node,Acc) ->
+ case net_adm:ping(Node) of
+ pang ->
+ timer:sleep(100),
+ wait_for_node(Node,Acc+100);
+ pong ->
+ Acc
+ end.
+
+cleanup_nodes_init(doc) -> ["Test that nodes are terminated when test case"
+ " is finished unless {cleanup,false} is given."];
+cleanup_nodes_init(Config) when is_list(Config) ->
+ {ok,DieSlave} = ?t:start_node(die_slave, slave, []),
+ {ok,SurviveSlave} = ?t:start_node(survive_slave, slave, [{cleanup,false}]),
+ {ok,DiePeer} = ?t:start_node(die_peer, peer, []),
+ {ok,SurvivePeer} = ?t:start_node(survive_peer, peer, [{cleanup,false}]),
+ [{die_slave,DieSlave},
+ {survive_slave,SurviveSlave},
+ {die_peer,DiePeer},
+ {survive_peer,SurvivePeer} | Config].
+
+
+
+check_survive_nodes(suite) -> [];
+check_survive_nodes(doc) -> ["Test that nodes with {cleanup,false} survived"];
+check_survive_nodes(Config) when is_list(Config) ->
+ timer:sleep(1000),
+ false = lists:member(?config(die_slave,Config),nodes()),
+ true = lists:member(?config(survive_slave,Config),nodes()),
+ false = lists:member(?config(die_peer,Config),nodes()),
+ true = lists:member(?config(survive_peer,Config),nodes()),
+ ok.
+
+
+cleanup_nodes_fin(doc) -> ["Test that nodes started with {cleanup,false}"
+ " can be stopped"];
+cleanup_nodes_fin(Config) when is_list(Config) ->
+ Slave = ?config(survive_slave,Config),
+ Peer = ?config(survive_peer,Config),
+
+ true = ?t:stop_node(Slave),
+ false = lists:member(Slave,nodes()),
+ true = ?t:stop_node(Peer),
+ false = lists:member(Peer,nodes()),
+
+ C1 = lists:keydelete(die_slave,1,Config),
+ C2 = lists:keydelete(survive_slave,1,C1),
+ C3 = lists:keydelete(die_peer,1,C2),
+ lists:keydelete(survive_peer,1,C3).
+
+commercial(Config) when is_list(Config) ->
+ case ?t:is_commercial() of
+ false -> {comment,"Open-source build"};
+ true -> {comment,"Commercial build"}
+ end.
+
+
diff --git a/lib/test_server/test/test_server_SUITE_data/dummy_file b/lib/test_server/test/test_server_SUITE_data/test_server_SUITE_data/dummy_file
index 65c88fbd75..65c88fbd75 100644
--- a/lib/test_server/test/test_server_SUITE_data/dummy_file
+++ b/lib/test_server/test/test_server_SUITE_data/test_server_SUITE_data/dummy_file
diff --git a/lib/test_server/test/test_server_conf01_SUITE.erl b/lib/test_server/test/test_server_SUITE_data/test_server_conf01_SUITE.erl
index a6d7dfe851..06e0ea80c4 100644
--- a/lib/test_server/test/test_server_conf01_SUITE.erl
+++ b/lib/test_server/test/test_server_SUITE_data/test_server_conf01_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
diff --git a/lib/test_server/test/test_server_conf02_SUITE.erl b/lib/test_server/test/test_server_SUITE_data/test_server_conf02_SUITE.erl
index deba4660c6..ccc0f12bf5 100644
--- a/lib/test_server/test/test_server_conf02_SUITE.erl
+++ b/lib/test_server/test/test_server_SUITE_data/test_server_conf02_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
diff --git a/lib/test_server/test/test_server_parallel01_SUITE.erl b/lib/test_server/test/test_server_SUITE_data/test_server_parallel01_SUITE.erl
index 0e7f329f89..f38f768f3b 100644
--- a/lib/test_server/test/test_server_parallel01_SUITE.erl
+++ b/lib/test_server/test/test_server_SUITE_data/test_server_parallel01_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
diff --git a/lib/test_server/test/test_server_shuffle01_SUITE.erl b/lib/test_server/test/test_server_SUITE_data/test_server_shuffle01_SUITE.erl
index 7ad269501d..0faf50a345 100644
--- a/lib/test_server/test/test_server_shuffle01_SUITE.erl
+++ b/lib/test_server/test/test_server_SUITE_data/test_server_shuffle01_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
diff --git a/lib/test_server/test/test_server_skip_SUITE.erl b/lib/test_server/test/test_server_SUITE_data/test_server_skip_SUITE.erl
index 4037e1cc0e..9607d0d689 100644
--- a/lib/test_server/test/test_server_skip_SUITE.erl
+++ b/lib/test_server/test/test_server_SUITE_data/test_server_skip_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
diff --git a/lib/test_server/test/test_server_line_SUITE.erl b/lib/test_server/test/test_server_line_SUITE.erl
index 02897f164f..0aba54f6b5 100644
--- a/lib/test_server/test/test_server_line_SUITE.erl
+++ b/lib/test_server/test/test_server_line_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
@@ -23,20 +23,29 @@
-module(test_server_line_SUITE).
-include_lib("test_server/include/test_server.hrl").
--export([all/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([all/0,suite/0]).
+-export([init_per_suite/1,end_per_suite/1,
+ init_per_testcase/2, end_per_testcase/2]).
-export([parse_transform/1, lines/1]).
-all(doc) -> ["Test of parse transform for collection line numbers"];
-all(suite) -> [parse_transform,lines].
+suite() ->
+ [{ct_hooks,[ts_install_cth]},
+ {doc,["Test of parse transform for collection line numbers"]}].
+all() -> [parse_transform,lines].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
init_per_testcase(_Case, Config) ->
?line test_server_line:clear(),
Dog = ?t:timetrap(?t:minutes(2)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
?line test_server_line:clear(),
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog),
diff --git a/lib/test_server/test/test_server_line_SUITE_data/parse_transform_test.erl b/lib/test_server/test/test_server_line_SUITE_data/parse_transform_test.erl
index c3ee1b68cd..8f3477d3ac 100644
--- a/lib/test_server/test/test_server_line_SUITE_data/parse_transform_test.erl
+++ b/lib/test_server/test/test_server_line_SUITE_data/parse_transform_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2011. 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
diff --git a/lib/test_server/test/test_server_test_lib.erl b/lib/test_server/test/test_server_test_lib.erl
new file mode 100644
index 0000000000..5ca24f3df7
--- /dev/null
+++ b/lib/test_server/test/test_server_test_lib.erl
@@ -0,0 +1,191 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2009-2011. 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(test_server_test_lib).
+-export([parse_suite/1]).
+-export([init/2, pre_init_per_testcase/3, post_end_per_testcase/4]).
+
+-include("test_server_test_lib.hrl").
+
+%% The CTH hooks all tests
+init(_Id, _Opts) ->
+ [].
+
+pre_init_per_testcase(_TC,Config,State) ->
+ case os:type() of
+ {win32, _} ->
+ %% Extend timeout for windows as starting node
+ %% can take a long time there
+ test_server:timetrap( 120000 * test_server:timetrap_scale_factor());
+ _ ->
+ ok
+ end,
+ {start_slave(Config, 50),State}.
+
+start_slave(Config,_Level) ->
+ [_,Host] = string:tokens(atom_to_list(node()), "@"),
+
+ ct:log("Trying to start ~s~n",
+ ["test_server_tester@"++Host]),
+ case slave:start(Host, test_server_tester, []) of
+ {error,Reason} ->
+ test_server:fail(Reason);
+ {ok,Node} ->
+ ct:log("Node ~p started~n", [Node]),
+ IsCover = test_server:is_cover(),
+ if IsCover ->
+ cover:start(Node);
+ true->
+ ok
+ end,
+ DataDir = proplists:get_value(data_dir, Config),
+ PrivDir = proplists:get_value(priv_dir, Config),
+
+ %% PrivDir as well as directory of Test Server suites
+ %% have to be in code path on Test Server node.
+ [_ | Parts] = lists:reverse(filename:split(DataDir)),
+ TSDir = filename:join(lists:reverse(Parts)),
+ AddPathDirs = case proplists:get_value(path_dirs, Config) of
+ undefined -> [];
+ Ds -> Ds
+ end,
+ PathDirs = [PrivDir,TSDir | AddPathDirs],
+ [true = rpc:call(Node, code, add_patha, [D]) || D <- PathDirs],
+ io:format("Dirs added to code path (on ~w):~n",
+ [Node]),
+ [io:format("~s~n", [D]) || D <- PathDirs],
+
+ true = rpc:call(Node, os, putenv,
+ ["TEST_SERVER_FRAMEWORK", "undefined"]),
+
+ ok = rpc:call(Node, file, set_cwd, [PrivDir]),
+ [{node,Node} | Config]
+ end.
+
+post_end_per_testcase(_TC, Config, Return, State) ->
+ Node = proplists:get_value(node, Config),
+ cover:stop(Node),
+ slave:stop(Node),
+
+ {Return, State}.
+
+%% Parse an .suite log file
+parse_suite(FileName) ->
+
+ case file:open(FileName, [read, raw, read_ahead]) of
+ {ok, Fd} ->
+ Data = parse_suite(Fd, #suite{ }),
+ file:close(Fd),
+ {ok, Data};
+ _ ->
+ error
+ end.
+
+fline(Fd) ->
+ case prim_file:read_line(Fd) of
+ eof -> eof;
+ {ok, Line} -> Line
+ end.
+
+parse_suite(Fd, S) ->
+ _Started = fline(Fd),
+ _Starting = fline(Fd),
+ "=cases" ++ NCases = fline(Fd),
+ "=user" ++ _User = fline(Fd),
+ "=host" ++ Host = fline(Fd),
+ "=hosts" ++ _Hosts = fline(Fd),
+ "=emulator_vsn" ++ Evsn = fline(Fd),
+ "=emulator" ++ Emu = fline(Fd),
+ "=otp_release" ++ OtpRel = fline(Fd),
+ "=started" ++ Start = fline(Fd),
+ NewS = parse_cases(Fd, S#suite{
+ n_cases_expected = list_to_int(clean(NCases)),
+ host = list_to_binary(clean(Host)),
+ emulator_vsn = list_to_binary(clean(Evsn)),
+ emulator = list_to_binary(clean(Emu)),
+ otp_release = list_to_binary(clean(OtpRel)),
+ started = list_to_binary(clean(Start))
+ }),
+ "=failed" ++ Failed = fline(Fd),
+ "=successful" ++ Succ = fline(Fd),
+ "=user_skipped" ++ UsrSkip = fline(Fd),
+ "=auto_skipped" ++ AutSkip = fline(Fd),
+ NewS#suite{ n_cases_failed = list_to_int(clean(Failed)),
+ n_cases_succ = list_to_int(clean(Succ)),
+ n_cases_user_skip = list_to_int(clean(UsrSkip)),
+ n_cases_auto_skip = list_to_int(clean(AutSkip)) }.
+
+
+parse_cases(Fd, #suite{ n_cases = N,
+ cases = Cases } = S) ->
+ case parse_case(Fd) of
+ finished -> S#suite{ log_ok = true };
+ {eof, Tc} ->
+ S#suite{ n_cases = N + 1,
+ cases = [Tc#tc{ result = crashed }|Cases]};
+ {ok, Case} ->
+ parse_cases(Fd, S#suite{ n_cases = N + 1,
+ cases = [Case|Cases]})
+ end.
+
+parse_case(Fd) -> parse_case(Fd, #tc{}).
+parse_case(Fd, Tc) -> parse_case(fline(Fd), Fd, Tc).
+
+parse_case(eof, _, Tc) -> {eof, Tc};
+parse_case("=case" ++ Case, Fd, Tc) ->
+ Name = list_to_binary(clean(Case)),
+ parse_case(fline(Fd), Fd, Tc#tc{ name = Name });
+parse_case("=logfile" ++ File, Fd, Tc) ->
+ Log = list_to_binary(clean(File)),
+ parse_case(fline(Fd), Fd, Tc#tc{ logfile = Log });
+parse_case("=elapsed" ++ Elapsed, Fd, Tc) ->
+ {ok, [Time], _} = io_lib:fread("~f", clean(Elapsed)),
+ parse_case(fline(Fd), Fd, Tc#tc{ elapsed = Time });
+parse_case("=result" ++ Result, _, Tc) ->
+ case clean(Result) of
+ "ok" ++ _ ->
+ {ok, Tc#tc{ result = ok } };
+ "failed" ++ _ ->
+ {ok, Tc#tc{ result = failed } };
+ "skipped" ++ _ ->
+ {ok, Tc#tc{ result = skip } }
+ end;
+parse_case("=finished" ++ _ , _Fd, #tc{ name = undefined }) ->
+ finished;
+parse_case(_, Fd, Tc) ->
+ parse_case(fline(Fd), Fd, Tc).
+
+skip([]) -> [];
+skip([$ |Ts]) -> skip(Ts);
+skip(Ts) -> Ts.
+
+%rmnl(L) -> L.
+rmnl([]) -> [];
+rmnl([$\n | Ts]) -> rmnl(Ts);
+rmnl([T|Ts]) -> [T | rmnl(Ts)].
+
+clean(L) ->
+ rmnl(skip(L)).
+
+list_to_int(L) ->
+ try
+ list_to_integer(L)
+ catch
+ _:_ ->
+ 0
+ end.
diff --git a/lib/test_server/test/test_server_test_lib.hrl b/lib/test_server/test/test_server_test_lib.hrl
new file mode 100644
index 0000000000..27b7be9618
--- /dev/null
+++ b/lib/test_server/test/test_server_test_lib.hrl
@@ -0,0 +1,23 @@
+-record(tc, {
+ name,
+ result,
+ elapsed,
+ logfile
+ }).
+
+-record(suite, {
+ application,
+ n_cases = 0,
+ n_cases_failed = 0,
+ n_cases_expected = 0,
+ n_cases_succ,
+ n_cases_user_skip,
+ n_cases_auto_skip,
+ cases = [],
+ host,
+ emulator_vsn,
+ emulator,
+ otp_release,
+ started,
+ log_ok = false
+ }).
diff --git a/lib/test_server/vsn.mk b/lib/test_server/vsn.mk
index 4e293b76a7..b7c0987845 100644
--- a/lib/test_server/vsn.mk
+++ b/lib/test_server/vsn.mk
@@ -1,2 +1,2 @@
-TEST_SERVER_VSN = 3.4.2
+TEST_SERVER_VSN = 3.4.3
diff --git a/lib/toolbar/doc/src/toolbar.xml b/lib/toolbar/doc/src/toolbar.xml
index 4e9798e5ae..ad379438fe 100644
--- a/lib/toolbar/doc/src/toolbar.xml
+++ b/lib/toolbar/doc/src/toolbar.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1996</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/tools/doc/src/cover.xml b/lib/tools/doc/src/cover.xml
index 323bd0dda8..683acc025d 100644
--- a/lib/tools/doc/src/cover.xml
+++ b/lib/tools/doc/src/cover.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2001</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
@@ -270,6 +270,8 @@
defaults to <c>function</c>.</p>
<p>If <c>Module</c> is not Cover compiled, the function returns
<c>{error,{not_cover_compiled,Module}}</c>.</p>
+ <p>HINT: It is possible to issue multiple analyse_to_file commands at
+ the same time. </p>
</desc>
</func>
<func>
@@ -307,6 +309,33 @@
<c>.beam</c> file, or in <c>../src</c> relative to that
directory. If no source code is found,
<c>,{error,no_source_code_found}</c> is returned.</p>
+ <p>HINT: It is possible to issue multiple analyse_to_file commands at
+ the same time. </p>
+ </desc>
+ </func>
+ <func>
+ <name>async_analyse_to_file(Module) -> </name>
+ <name>async_analyse_to_file(Module,Options) -> </name>
+ <name>async_analyse_to_file(Module, OutFile) -> </name>
+ <name>async_analyse_to_file(Module, OutFile, Options) -> pid()</name>
+ <fsummary>Asynchronous call to analyse_to_file.</fsummary>
+ <type>
+ <v>Module = atom()</v>
+ <v>OutFile = string()</v>
+ <v>Options = [Option]</v>
+ <v>Option = html</v>
+ <v>Error = {not_cover_compiled,Module} | {file,File,Reason} | no_source_code_found | not_main_node</v>
+ <v>&nbsp;File = string()</v>
+ <v>&nbsp;Reason = term()</v>
+ </type>
+ <desc>
+ <p>This function works exactly the same way as
+ <seealso marker="#analyse_to_file-1">analyse_to_file</seealso> except
+ that it is asynchronous instead of synchronous. The spawned process
+ will link with the caller when created. If an <c>Error</c> occurs
+ while doing the cover analysis the process will crash with the same
+ error reason as <seealso marker="#analyse_to_file-1">analyse_to_file</seealso>
+ would return.</p>
</desc>
</func>
<func>
diff --git a/lib/tools/doc/src/cover_chapter.xml b/lib/tools/doc/src/cover_chapter.xml
index b4f7919183..5083b01f1d 100644
--- a/lib/tools/doc/src/cover_chapter.xml
+++ b/lib/tools/doc/src/cover_chapter.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2001</year><year>2009</year>
+ <year>2001</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -403,6 +403,13 @@ ok
database contains information about each executable line in each
Cover compiled module, performance decreases proportionally to
the size and number of the Cover compiled modules.</p>
+ <p>To improve performance when analysing cover results it is possible
+ to do multiple calls to <seealso marker="cover#analyse-1">analyse</seealso>
+ and <seealso marker="cover#analyse_to_file-1">analyse_to_file</seealso>
+ at once. You can also use the
+ <seealso marker="cover#async_analyse_to_file-1">async_analyse_to_file</seealso>
+ convenience function.
+ </p>
</section>
<section>
diff --git a/lib/tools/doc/src/cprof.xml b/lib/tools/doc/src/cprof.xml
index 421ed7875a..2dc419d29c 100644
--- a/lib/tools/doc/src/cprof.xml
+++ b/lib/tools/doc/src/cprof.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2002</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/tools/doc/src/erlang_mode.xml b/lib/tools/doc/src/erlang_mode.xml
index c21afc1f9b..794224d601 100644
--- a/lib/tools/doc/src/erlang_mode.xml
+++ b/lib/tools/doc/src/erlang_mode.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2003</year><year>2009</year>
+ <year>2003</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
diff --git a/lib/tools/doc/src/erlang_mode_chapter.xml b/lib/tools/doc/src/erlang_mode_chapter.xml
index 8aabd6ae74..4ffa224ea5 100644
--- a/lib/tools/doc/src/erlang_mode_chapter.xml
+++ b/lib/tools/doc/src/erlang_mode_chapter.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2003</year><year>2009</year>
+ <year>2003</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
diff --git a/lib/tools/doc/src/make.xml b/lib/tools/doc/src/make.xml
index f13514d99f..1c8df67abf 100644
--- a/lib/tools/doc/src/make.xml
+++ b/lib/tools/doc/src/make.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1996</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/tools/doc/src/notes.xml b/lib/tools/doc/src/notes.xml
index 5f9cecd6e4..118800e44a 100644
--- a/lib/tools/doc/src/notes.xml
+++ b/lib/tools/doc/src/notes.xml
@@ -30,6 +30,55 @@
</header>
<p>This document describes the changes made to the Tools application.</p>
+<section><title>Tools 2.6.6.3</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Declare indentation options as "safe" in erlang-mode for
+ Emacs</p>
+ <p>
+ Emacs has a facility for setting options on a per-file
+ basis based on comments in the source file. By default,
+ all options are considered "unsafe", and the user is
+ queried before the variable is set. This patch declares
+ the variables erlang-indent-level, erlang-indent-guard
+ and erlang-argument-indent to be safe, if the value
+ specified in the source file is valid.</p>
+ <p>
+ Such declarations usually look like this:</p>
+ <p>
+ %% -*- erlang-indent-level: 2 -*-</p>
+ <p>
+ and appear on the first line of the file. (thanks to
+ Magnus Henoch)</p>
+ <p>
+ Own Id: OTP-9122</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Cover has been improved to take less memory and allow
+ parallel analysis of cover data. Data collection from
+ nodes is now done in parallel and it is now possible to
+ issue multiple analyse and analyse_to_file requests at
+ the same time. A new function call async_analyse_to_file
+ has also been introduced, see the documentation for more
+ details.</p>
+ <p>
+ Own Id: OTP-9043 Aux Id: seq11771 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Tools 2.6.6.2</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/tools/doc/src/part_notes_history.xml b/lib/tools/doc/src/part_notes_history.xml
index b40b530c02..da637f380a 100644
--- a/lib/tools/doc/src/part_notes_history.xml
+++ b/lib/tools/doc/src/part_notes_history.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2006</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/tools/doc/src/tags.xml b/lib/tools/doc/src/tags.xml
index 5e1da25acf..54b5a4914c 100644
--- a/lib/tools/doc/src/tags.xml
+++ b/lib/tools/doc/src/tags.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1998</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/tools/emacs/erlang.el b/lib/tools/emacs/erlang.el
index ed825a298f..6728bef2a4 100644
--- a/lib/tools/emacs/erlang.el
+++ b/lib/tools/emacs/erlang.el
@@ -1,7 +1,7 @@
;; erlang.el --- Major modes for editing and running Erlang
;; %CopyrightBegin%
;;
-;; Copyright Ericsson AB 1996-2010. All Rights Reserved.
+;; Copyright Ericsson AB 1996-2011. 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
@@ -386,7 +386,8 @@ then no prototype is inserted.
The test is performed by the function `erlang-test-criteria-list'.")
(defvar erlang-electric-arrow-criteria
- '(erlang-next-lines-empty-p
+ '(erlang-stop-when-in-type-spec
+ erlang-next-lines-empty-p
erlang-at-end-of-function-p)
"*List of functions controlling the arrow aspect of `erlang-electric-gt'.
The functions in this list are called, in order, whenever a `>'
@@ -466,14 +467,17 @@ To activate the workaround, place the following in your `~/.emacs' file:
(defvar erlang-indent-level 4
"*Indentation of Erlang calls/clauses within blocks.")
+(put 'erlang-indent-level 'safe-local-variable 'integerp)
(defvar erlang-indent-guard 2
"*Indentation of Erlang guards.")
+(put 'erlang-indent-guard 'safe-local-variable 'integerp)
(defvar erlang-argument-indent 2
"*Indentation of the first argument in a function call.
When nil, indent to the column after the `(' of the
function.")
+(put 'erlang-argument-indent 'safe-local-variable '(lambda (val) (or (null val) (integerp val))))
(defvar erlang-tab-always-indent t
"*Non-nil means TAB in Erlang mode should always re-indent the current line,
@@ -4042,6 +4046,16 @@ This function is designed to be a member of a criteria list."
nil)))
+(defun erlang-stop-when-in-type-spec ()
+ "Return `stop' when in a type spec line.
+
+This function is designed to be a member of a criteria list."
+ (save-excursion
+ (beginning-of-line)
+ (when (save-match-data (looking-at "-\\(spec\\|type\\)"))
+ 'stop)))
+
+
(defun erlang-next-lines-empty-p ()
"Return non-nil if next lines are empty.
diff --git a/lib/tools/src/cover.erl b/lib/tools/src/cover.erl
index c4d1bd1d2f..73a736f0e8 100644
--- a/lib/tools/src/cover.erl
+++ b/lib/tools/src/cover.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -35,23 +35,37 @@
%% remote_process_loop/1.
%%
%% TABLES
-%% Each nodes has an ets table named 'cover_internal_data_table'
-%% (?COVER_TABLE). This table contains the coverage data and is
-%% continously updated when cover compiled code is executed.
+%% Each nodes has two tables: cover_internal_data_table (?COVER_TABLE) and.
+%% cover_internal_clause_table (?COVER_CLAUSE_TABLE).
+%% ?COVER_TABLE contains the bump data i.e. the data about which lines
+%% have been executed how many times.
+%% ?COVER_CLAUSE_TABLE contains information about which clauses in which modules
+%% cover is currently collecting statistics.
%%
-%% The main node owns a table named
-%% 'cover_collected_remote_data_table' (?COLLECTION_TABLE). This table
-%% contains data which is collected from remote nodes (either when a
-%% remote node is stopped with cover:stop/1 or when analysing. When
-%% analysing, data is even moved from the ?COVER_TABLE on the main
-%% node to the ?COLLECTION_TABLE.
+%% The main node owns tables named
+%% 'cover_collected_remote_data_table' (?COLLECTION_TABLE) and
+%% 'cover_collected_remote_clause_table' (?COLLECTION_CLAUSE_TABLE).
+%% These tables contain data which is collected from remote nodes (either when a
+%% remote node is stopped with cover:stop/1 or when analysing). When
+%% analysing, data is even moved from the COVER tables on the main
+%% node to the COLLECTION tables.
%%
%% The main node also has a table named 'cover_binary_code_table'
%% (?BINARY_TABLE). This table contains the binary code for each cover
%% compiled module. This is necessary so that the code can be loaded
%% on remote nodes that are started after the compilation.
%%
-
+%% PARELLALISM
+%% To take advantage of SMP when doing the cover analysis both the data
+%% collection and analysis has been parallelized. One process is spawned for
+%% each node when collecting data, and on the remote node when collecting data
+%% one process is spawned per module.
+%%
+%% When analyzing data it is possible to issue multiple analyse(_to_file)/X
+%% calls at once. They are however all calls (for backwardscompatability
+%% reasons) so the user of cover will have to spawn several processes to to the
+%% calls ( or use async_analyse_to_file ).
+%%
%% External exports
-export([start/0, start/1,
@@ -61,6 +75,9 @@
analyse/1, analyse/2, analyse/3, analyze/1, analyze/2, analyze/3,
analyse_to_file/1, analyse_to_file/2, analyse_to_file/3,
analyze_to_file/1, analyze_to_file/2, analyze_to_file/3,
+ async_analyse_to_file/1,async_analyse_to_file/2,
+ async_analyse_to_file/3, async_analyze_to_file/1,
+ async_analyze_to_file/2, async_analyze_to_file/3,
export/1, export/2, import/1,
modules/0, imported/0, imported_modules/0, which_nodes/0, is_compiled/1,
reset/1, reset/0,
@@ -100,8 +117,10 @@
}).
-define(COVER_TABLE, 'cover_internal_data_table').
+-define(COVER_CLAUSE_TABLE, 'cover_internal_clause_table').
-define(BINARY_TABLE, 'cover_binary_code_table').
-define(COLLECTION_TABLE, 'cover_collected_remote_data_table').
+-define(COLLECTION_CLAUSE_TABLE, 'cover_collected_remote_clause_table').
-define(TAG, cover_compiled).
-define(SERVER, cover_server).
@@ -114,6 +133,8 @@
true -> ?BLOCK(Expr)
end).
+-define(SPAWN_DBG(Tag,Value),put(Tag,Value)).
+
-include_lib("stdlib/include/ms_transform.hrl").
%%%----------------------------------------------------------------------
@@ -127,7 +148,10 @@ start() ->
case whereis(?SERVER) of
undefined ->
Starter = self(),
- Pid = spawn(fun() -> init_main(Starter) end),
+ Pid = spawn(fun() ->
+ ?SPAWN_DBG(start,[]),
+ init_main(Starter)
+ end),
Ref = erlang:monitor(process,Pid),
Return =
receive
@@ -229,6 +253,7 @@ compile_modules(Files,Options) ->
{i, Dir} when is_list(Dir) -> true;
{d, _Macro} -> true;
{d, _Macro, _Value} -> true;
+ export_all -> true;
_ -> false
end
end,
@@ -382,6 +407,30 @@ analyze_to_file(Module, OptOrOut) -> analyse_to_file(Module, OptOrOut).
analyze_to_file(Module, OutFile, Options) ->
analyse_to_file(Module, OutFile, Options).
+async_analyse_to_file(Module) ->
+ do_spawn(?MODULE, analyse_to_file, [Module]).
+async_analyse_to_file(Module, OutFileOrOpts) ->
+ do_spawn(?MODULE, analyse_to_file, [Module, OutFileOrOpts]).
+async_analyse_to_file(Module, OutFile, Options) ->
+ do_spawn(?MODULE, analyse_to_file, [Module, OutFile, Options]).
+
+do_spawn(M,F,A) ->
+ spawn_link(fun() ->
+ case apply(M,F,A) of
+ {ok, _} ->
+ ok;
+ {error, Reason} ->
+ exit(Reason)
+ end
+ end).
+
+async_analyze_to_file(Module) ->
+ async_analyse_to_file(Module).
+async_analyze_to_file(Module, OutFileOrOpts) ->
+ async_analyse_to_file(Module, OutFileOrOpts).
+async_analyze_to_file(Module, OutFile, Options) ->
+ async_analyse_to_file(Module, OutFile, Options).
+
outfilename(Module,Opts) ->
case lists:member(html,Opts) of
true ->
@@ -500,6 +549,8 @@ remote_call(Node,Request) ->
Return
end.
+remote_reply(Proc,Reply) when is_pid(Proc) ->
+ Proc ! {?SERVER,Reply};
remote_reply(MainNode,Reply) ->
{?SERVER,MainNode} ! {?SERVER,Reply}.
@@ -509,9 +560,15 @@ remote_reply(MainNode,Reply) ->
init_main(Starter) ->
register(?SERVER,self()),
- ets:new(?COVER_TABLE, [set, public, named_table]),
+ %% Having write concurrancy here gives a 40% performance boost
+ %% when collect/1 is called.
+ ets:new(?COVER_TABLE, [set, public, named_table
+ ,{write_concurrency, true}
+ ]),
+ ets:new(?COVER_CLAUSE_TABLE, [set, public, named_table]),
ets:new(?BINARY_TABLE, [set, named_table]),
ets:new(?COLLECTION_TABLE, [set, public, named_table]),
+ ets:new(?COLLECTION_CLAUSE_TABLE, [set, public, named_table]),
process_flag(trap_exit,true),
Starter ! {?SERVER,started},
main_process_loop(#main_state{}).
@@ -569,7 +626,7 @@ main_process_loop(State) ->
case get_beam_file(Module,BeamFile0,Compiled0) of
{ok,BeamFile} ->
{Reply,Compiled} =
- case do_compile_beam(Module,BeamFile) of
+ case do_compile_beam(Module,BeamFile,[]) of
{ok, Module} ->
remote_load_compiled(State#main_state.nodes,
[{Module,BeamFile}]),
@@ -593,40 +650,10 @@ main_process_loop(State) ->
end;
{From, {export,OutFile,Module}} ->
- case file:open(OutFile,[write,binary,raw]) of
- {ok,Fd} ->
- Reply =
- case Module of
- '_' ->
- export_info(State#main_state.imported),
- collect(State#main_state.nodes),
- do_export_table(State#main_state.compiled,
- State#main_state.imported,
- Fd);
- _ ->
- export_info(Module,State#main_state.imported),
- case is_loaded(Module, State) of
- {loaded, File} ->
- [{Module,Clauses}] =
- ets:lookup(?COVER_TABLE,Module),
- collect(Module, Clauses,
- State#main_state.nodes),
- do_export_table([{Module,File}],[],Fd);
- {imported, File, ImportFiles} ->
- %% don't know if I should allow this -
- %% export a module which is only imported
- Imported = [{Module,File,ImportFiles}],
- do_export_table([],Imported,Fd);
- _NotLoaded ->
- {error,{not_cover_compiled,Module}}
- end
- end,
- file:close(Fd),
- reply(From, Reply);
- {error,Reason} ->
- reply(From, {error, {cant_open_file,OutFile,Reason}})
-
- end,
+ spawn(fun() ->
+ ?SPAWN_DBG(export,{OutFile, Module}),
+ do_export(Module, OutFile, From, State)
+ end),
main_process_loop(State);
{From, {import,File}} ->
@@ -692,107 +719,73 @@ main_process_loop(State) ->
unregister(?SERVER),
reply(From, ok);
- {From, {Request, Module}} ->
- case is_loaded(Module, State) of
- {loaded, File} ->
- {Reply,State1} =
- case Request of
- {analyse, Analysis, Level} ->
- analyse_info(Module,State#main_state.imported),
- [{Module,Clauses}] =
- ets:lookup(?COVER_TABLE,Module),
- collect(Module,Clauses,State#main_state.nodes),
- R = do_analyse(Module, Analysis, Level, Clauses),
- {R,State};
-
- {analyse_to_file, OutFile, Opts} ->
- R = case find_source(File) of
- {beam,_BeamFile} ->
- {error,no_source_code_found};
- ErlFile ->
- Imported = State#main_state.imported,
- analyse_info(Module,Imported),
- [{Module,Clauses}] =
- ets:lookup(?COVER_TABLE,Module),
- collect(Module, Clauses,
- State#main_state.nodes),
- HTML = lists:member(html,Opts),
- do_analyse_to_file(Module,OutFile,
- ErlFile,HTML)
- end,
- {R,State};
-
- is_compiled ->
- {{file, File},State};
-
- reset ->
- R = do_reset_main_node(Module,
- State#main_state.nodes),
- Imported =
- remove_imported(Module,
- State#main_state.imported),
- {R,State#main_state{imported=Imported}}
- end,
- reply(From, Reply),
- main_process_loop(State1);
-
- {imported,File,_ImportFiles} ->
- {Reply,State1} =
- case Request of
- {analyse, Analysis, Level} ->
- analyse_info(Module,State#main_state.imported),
- [{Module,Clauses}] =
- ets:lookup(?COLLECTION_TABLE,Module),
- R = do_analyse(Module, Analysis, Level, Clauses),
- {R,State};
-
- {analyse_to_file, OutFile, Opts} ->
- R = case find_source(File) of
- {beam,_BeamFile} ->
- {error,no_source_code_found};
- ErlFile ->
- Imported = State#main_state.imported,
- analyse_info(Module,Imported),
- HTML = lists:member(html,Opts),
- do_analyse_to_file(Module,OutFile,
- ErlFile,HTML)
- end,
- {R,State};
-
- is_compiled ->
- {false,State};
-
- reset ->
- R = do_reset_collection_table(Module),
- Imported =
- remove_imported(Module,
- State#main_state.imported),
- {R,State#main_state{imported=Imported}}
- end,
- reply(From, Reply),
- main_process_loop(State1);
-
- NotLoaded ->
- Reply =
- case Request of
- is_compiled ->
- false;
- _ ->
- {error, {not_cover_compiled,Module}}
- end,
- Compiled =
- case NotLoaded of
- unloaded ->
- do_clear(Module),
- remote_unload(State#main_state.nodes,[Module]),
- update_compiled([Module],
- State#main_state.compiled);
- false ->
- State#main_state.compiled
+ {From, {{analyse, Analysis, Level}, Module}} ->
+ S = try
+ Loaded = is_loaded(Module, State),
+ spawn(fun() ->
+ ?SPAWN_DBG(analyse,{Module,Analysis, Level}),
+ do_parallel_analysis(
+ Module, Analysis, Level,
+ Loaded, From, State)
+ end),
+ State
+ catch throw:Reason ->
+ reply(From,{error, {not_cover_compiled,Module}}),
+ not_loaded(Module, Reason, State)
+ end,
+ main_process_loop(S);
+
+ {From, {{analyse_to_file, OutFile, Opts},Module}} ->
+ S = try
+ Loaded = is_loaded(Module, State),
+ spawn(fun() ->
+ ?SPAWN_DBG(analyse_to_file,
+ {Module,OutFile, Opts}),
+ do_parallel_analysis_to_file(
+ Module, OutFile, Opts,
+ Loaded, From, State)
+ end),
+ State
+ catch throw:Reason ->
+ reply(From,{error, {not_cover_compiled,Module}}),
+ not_loaded(Module, Reason, State)
+ end,
+ main_process_loop(S);
+
+ {From, {is_compiled, Module}} ->
+ S = try is_loaded(Module, State) of
+ {loaded, File} ->
+ reply(From,{file, File}),
+ State;
+ {imported,_File,_ImportFiles} ->
+ reply(From,false),
+ State
+ catch throw:Reason ->
+ reply(From,false),
+ not_loaded(Module, Reason, State)
+ end,
+ main_process_loop(S);
+
+ {From, {reset, Module}} ->
+ S = try
+ Loaded = is_loaded(Module,State),
+ R = case Loaded of
+ {loaded, _File} ->
+ do_reset_main_node(
+ Module, State#main_state.nodes);
+ {imported, _File, _} ->
+ do_reset_collection_table(Module)
end,
- reply(From, Reply),
- main_process_loop(State#main_state{compiled=Compiled})
- end;
+ Imported =
+ remove_imported(Module,
+ State#main_state.imported),
+ reply(From, R),
+ State#main_state{imported=Imported}
+ catch throw:Reason ->
+ reply(From,{error, {not_cover_compiled,Module}}),
+ not_loaded(Module, Reason, State)
+ end,
+ main_process_loop(S);
{'EXIT',Pid,_Reason} ->
%% Exit is trapped on the main node only, so this will only happen
@@ -807,17 +800,17 @@ main_process_loop(State) ->
main_process_loop(State)
end.
-
-
-
-
%%%----------------------------------------------------------------------
%%% cover_server on remote node
%%%----------------------------------------------------------------------
init_remote(Starter,MainNode) ->
register(?SERVER,self()),
- ets:new(?COVER_TABLE, [set, public, named_table]),
+ ets:new(?COVER_TABLE, [set, public, named_table
+ %% write_concurrency here makes otp_8270 break :(
+ %,{write_concurrency, true}
+ ]),
+ ets:new(?COVER_CLAUSE_TABLE, [set, public, named_table]),
Starter ! {self(),started},
remote_process_loop(#remote_state{main_node=MainNode}).
@@ -843,29 +836,14 @@ remote_process_loop(State) ->
remote_process_loop(State);
{remote,collect,Module,CollectorPid} ->
- MS =
- case Module of
- '_' -> ets:fun2ms(fun({M,C}) when is_atom(M) -> C end);
- _ -> ets:fun2ms(fun({M,C}) when M=:=Module -> C end)
- end,
- AllClauses = lists:flatten(ets:select(?COVER_TABLE,MS)),
-
- %% Sending clause by clause in order to avoid large lists
- lists:foreach(
- fun({M,F,A,C,_L}) ->
- Pattern =
- {#bump{module=M, function=F, arity=A, clause=C}, '_'},
- Bumps = ets:match_object(?COVER_TABLE, Pattern),
- %% Reset
- lists:foreach(fun({Bump,_N}) ->
- ets:insert(?COVER_TABLE, {Bump,0})
- end,
- Bumps),
- CollectorPid ! {chunk,Bumps}
- end,
- AllClauses),
- CollectorPid ! done,
- remote_reply(State#remote_state.main_node, ok),
+ self() ! {remote,collect,Module,CollectorPid, ?SERVER};
+
+ {remote,collect,Module,CollectorPid,From} ->
+ spawn(fun() ->
+ ?SPAWN_DBG(remote_collect,
+ {Module, CollectorPid, From}),
+ do_collect(Module, CollectorPid, From)
+ end),
remote_process_loop(State);
{remote,stop} ->
@@ -894,6 +872,33 @@ remote_process_loop(State) ->
end.
+do_collect(Module, CollectorPid, From) ->
+ AllMods =
+ case Module of
+ '_' -> ets:tab2list(?COVER_CLAUSE_TABLE);
+ _ -> ets:lookup(?COVER_CLAUSE_TABLE, Module)
+ end,
+
+ %% Sending clause by clause in order to avoid large lists
+ pmap(
+ fun({_Mod,Clauses}) ->
+ lists:map(fun(Clause) ->
+ send_collected_data(Clause, CollectorPid)
+ end,Clauses)
+ end,AllMods),
+ CollectorPid ! done,
+ remote_reply(From, ok).
+
+send_collected_data({M,F,A,C,_L}, CollectorPid) ->
+ Pattern =
+ {#bump{module=M, function=F, arity=A, clause=C}, '_'},
+ Bumps = ets:match_object(?COVER_TABLE, Pattern),
+ %% Reset
+ lists:foreach(fun({Bump,_N}) ->
+ ets:insert(?COVER_TABLE, {Bump,0})
+ end,
+ Bumps),
+ CollectorPid ! {chunk,Bumps}.
reload_originals([{Module,_File}|Compiled]) ->
do_reload_original(Module),
@@ -932,6 +937,9 @@ load_compiled([{Module,File,Binary,InitialTable}|Compiled],Acc) ->
load_compiled([],Acc) ->
Acc.
+insert_initial_data([Item|Items]) when is_atom(element(1,Item)) ->
+ ets:insert(?COVER_CLAUSE_TABLE, Item),
+ insert_initial_data(Items);
insert_initial_data([Item|Items]) ->
ets:insert(?COVER_TABLE, Item),
insert_initial_data(Items);
@@ -957,7 +965,10 @@ remote_start(MainNode) ->
case whereis(?SERVER) of
undefined ->
Starter = self(),
- Pid = spawn(fun() -> init_remote(Starter,MainNode) end),
+ Pid = spawn(fun() ->
+ ?SPAWN_DBG(remote_start,{MainNode}),
+ init_remote(Starter,MainNode)
+ end),
Ref = erlang:monitor(process,Pid),
Return =
receive
@@ -972,14 +983,25 @@ remote_start(MainNode) ->
{error,{already_started,Pid}}
end.
-%% Load a set of cover compiled modules on remote nodes
-remote_load_compiled(Nodes,Compiled0) ->
- Compiled = lists:map(fun get_data_for_remote_loading/1,Compiled0),
+%% Load a set of cover compiled modules on remote nodes,
+%% We do it ?MAX_MODS modules at a time so that we don't
+%% run out of memory on the cover_server node.
+-define(MAX_MODS, 10).
+remote_load_compiled(Nodes,Compiled) ->
+ remote_load_compiled(Nodes, Compiled, [], 0).
+remote_load_compiled(_Nodes, [], [], _ModNum) ->
+ ok;
+remote_load_compiled(Nodes, Compiled, Acc, ModNum)
+ when Compiled == []; ModNum == ?MAX_MODS ->
lists:foreach(
fun(Node) ->
- remote_call(Node,{remote,load_compiled,Compiled})
+ remote_call(Node,{remote,load_compiled,Acc})
end,
- Nodes).
+ Nodes),
+ remote_load_compiled(Nodes, Compiled, [], 0);
+remote_load_compiled(Nodes, [MF | Rest], Acc, ModNum) ->
+ remote_load_compiled(
+ Nodes, Rest, [get_data_for_remote_loading(MF) | Acc], ModNum + 1).
%% Read all data needed for loading a cover compiled module on a remote node
%% Binary is the beam code for the module and InitialTable is the initial
@@ -987,15 +1009,15 @@ remote_load_compiled(Nodes,Compiled0) ->
get_data_for_remote_loading({Module,File}) ->
[{Module,Binary}] = ets:lookup(?BINARY_TABLE,Module),
%%! The InitialTable list will be long if the module is big - what to do??
- InitialTable = ets:select(?COVER_TABLE,ms(Module)),
- {Module,File,Binary,InitialTable}.
+ InitialBumps = ets:select(?COVER_TABLE,ms(Module)),
+ InitialClauses = ets:lookup(?COVER_CLAUSE_TABLE,Module),
+
+ {Module,File,Binary,InitialBumps ++ InitialClauses}.
%% Create a match spec which returns the clause info {Module,InitInfo} and
%% all #bump keys for the given module with 0 number of calls.
ms(Module) ->
- ets:fun2ms(fun({Module,InitInfo}) ->
- {Module,InitInfo};
- ({Key,_}) when is_record(Key,bump),Key#bump.module=:=Module ->
+ ets:fun2ms(fun({Key,_}) when Key#bump.module=:=Module ->
{Key,0}
end).
@@ -1017,27 +1039,30 @@ remote_reset(Module,Nodes) ->
%% Collect data from remote nodes - used for analyse or stop(Node)
remote_collect(Module,Nodes,Stop) ->
- CollectorPid = spawn(fun() -> collector_proc(length(Nodes)) end),
- lists:foreach(
- fun(Node) ->
- remote_call(Node,{remote,collect,Module,CollectorPid}),
- if Stop -> remote_call(Node,{remote,stop});
- true -> ok
- end
- end,
- Nodes).
+ pmap(fun(Node) ->
+ ?SPAWN_DBG(remote_collect,
+ {Module, Nodes, Stop}),
+ do_collection(Node, Module, Stop)
+ end,
+ Nodes).
+
+do_collection(Node, Module, Stop) ->
+ CollectorPid = spawn(fun collector_proc/0),
+ remote_call(Node,{remote,collect,Module,CollectorPid, self()}),
+ if Stop -> remote_call(Node,{remote,stop});
+ true -> ok
+ end.
%% Process which receives chunks of data from remote nodes - either when
%% analysing or when stopping cover on the remote nodes.
-collector_proc(0) ->
- ok;
-collector_proc(N) ->
+collector_proc() ->
+ ?SPAWN_DBG(collector_proc, []),
receive
{chunk,Chunk} ->
insert_in_collection_table(Chunk),
- collector_proc(N);
+ collector_proc();
done ->
- collector_proc(N-1)
+ ok
end.
insert_in_collection_table([{Key,Val}|Chunk]) ->
@@ -1052,7 +1077,13 @@ insert_in_collection_table(Key,Val) ->
ets:update_counter(?COLLECTION_TABLE,
Key,Val);
false ->
- ets:insert(?COLLECTION_TABLE,{Key,Val})
+ %% Make sure that there are no race conditions from ets:member
+ case ets:insert_new(?COLLECTION_TABLE,{Key,Val}) of
+ false ->
+ insert_in_collection_table(Key,Val);
+ _ ->
+ ok
+ end
end.
@@ -1073,14 +1104,15 @@ analyse_info(Module,Imported) ->
export_info(_Module,[]) ->
ok;
-export_info(Module,Imported) ->
- imported_info("Export",Module,Imported).
+export_info(_Module,_Imported) ->
+ %% Do not print that the export includes imported modules
+ ok.
export_info([]) ->
ok;
-export_info(Imported) ->
- AllImportFiles = get_all_importfiles(Imported,[]),
- io:format("Export includes data from imported files\n~p\n",[AllImportFiles]).
+export_info(_Imported) ->
+ %% Do not print that the export includes imported modules
+ ok.
get_all_importfiles([{_M,_F,ImportFiles}|Imported],Acc) ->
NewAcc = do_get_all_importfiles(ImportFiles,Acc),
@@ -1153,14 +1185,14 @@ is_loaded(Module, State) ->
{ok, File} ->
case code:which(Module) of
?TAG -> {loaded, File};
- _ -> unloaded
+ _ -> throw(unloaded)
end;
false ->
case get_file(Module,State#main_state.imported) of
{ok,File,ImportFiles} ->
{imported, File, ImportFiles};
false ->
- false
+ throw(not_loaded)
end
end.
@@ -1227,13 +1259,13 @@ do_compile(File, UserOptions) ->
Options = [debug_info,binary,report_errors,report_warnings] ++ UserOptions,
case compile:file(File, Options) of
{ok, Module, Binary} ->
- do_compile_beam(Module,Binary);
+ do_compile_beam(Module,Binary,UserOptions);
error ->
error
end.
%% Beam is a binary or a .beam file name
-do_compile_beam(Module,Beam) ->
+do_compile_beam(Module,Beam,UserOptions) ->
%% Clear database
do_clear(Module),
@@ -1253,13 +1285,13 @@ do_compile_beam(Module,Beam) ->
%% Compile and load the result
%% It's necessary to check the result of loading since it may
%% fail, for example if Module resides in a sticky directory
- {ok, Module, Binary} = compile:forms(Forms, []),
+ {ok, Module, Binary} = compile:forms(Forms, UserOptions),
case code:load_binary(Module, ?TAG, Binary) of
{module, Module} ->
%% Store info about all function clauses in database
InitInfo = reverse(Vars#vars.init_info),
- ets:insert(?COVER_TABLE, {Module, InitInfo}),
+ ets:insert(?COVER_CLAUSE_TABLE, {Module, InitInfo}),
%% Store binary code so it can be loaded on remote nodes
ets:insert(?BINARY_TABLE, {Module, Binary}),
@@ -1793,9 +1825,8 @@ common_elems(L1, L2) ->
%% Collect data for all modules
collect(Nodes) ->
%% local node
- MS = ets:fun2ms(fun({M,C}) when is_atom(M) -> {M,C} end),
- AllClauses = ets:select(?COVER_TABLE,MS),
- move_modules(AllClauses),
+ AllClauses = ets:tab2list(?COVER_CLAUSE_TABLE),
+ pmap(fun move_modules/1,AllClauses),
%% remote nodes
remote_collect('_',Nodes,false).
@@ -1803,7 +1834,7 @@ collect(Nodes) ->
%% Collect data for one module
collect(Module,Clauses,Nodes) ->
%% local node
- move_modules([{Module,Clauses}]),
+ move_modules({Module,Clauses}),
%% remote nodes
remote_collect(Module,Nodes,false).
@@ -1811,12 +1842,9 @@ collect(Module,Clauses,Nodes) ->
%% When analysing, the data from the local ?COVER_TABLE is moved to the
%% ?COLLECTION_TABLE. Resetting data in ?COVER_TABLE
-move_modules([{Module,Clauses}|AllClauses]) ->
- ets:insert(?COLLECTION_TABLE,{Module,Clauses}),
- move_clauses(Clauses),
- move_modules(AllClauses);
-move_modules([]) ->
- ok.
+move_modules({Module,Clauses}) ->
+ ets:insert(?COLLECTION_CLAUSE_TABLE,{Module,Clauses}),
+ move_clauses(Clauses).
move_clauses([{M,F,A,C,_L}|Clauses]) ->
Pattern = {#bump{module=M, function=F, arity=A, clause=C}, '_'},
@@ -1855,6 +1883,22 @@ find_source(File0) ->
end
end.
+do_parallel_analysis(Module, Analysis, Level, Loaded, From, State) ->
+ analyse_info(Module,State#main_state.imported),
+ C = case Loaded of
+ {loaded, _File} ->
+ [{Module,Clauses}] =
+ ets:lookup(?COVER_CLAUSE_TABLE,Module),
+ collect(Module,Clauses,State#main_state.nodes),
+ Clauses;
+ _ ->
+ [{Module,Clauses}] =
+ ets:lookup(?COLLECTION_CLAUSE_TABLE,Module),
+ Clauses
+ end,
+ R = do_analyse(Module, Analysis, Level, C),
+ reply(From, R).
+
%% do_analyse(Module, Analysis, Level, Clauses)-> {ok,Answer} | {error,Error}
%% Clauses = [{Module,Function,Arity,Clause,Lines}]
do_analyse(Module, Analysis, line, _Clauses) ->
@@ -1931,6 +1975,28 @@ merge_functions([{_MFA,R}|Functions], MFun, Result) ->
merge_functions([], _MFun, Result) ->
Result.
+do_parallel_analysis_to_file(Module, OutFile, Opts, Loaded, From, State) ->
+ File = case Loaded of
+ {loaded, File0} ->
+ [{Module,Clauses}] =
+ ets:lookup(?COVER_CLAUSE_TABLE,Module),
+ collect(Module, Clauses,
+ State#main_state.nodes),
+ File0;
+ {imported, File0, _} ->
+ File0
+ end,
+ case find_source(File) of
+ {beam,_BeamFile} ->
+ reply(From, {error,no_source_code_found});
+ ErlFile ->
+ analyse_info(Module,State#main_state.imported),
+ HTML = lists:member(html,Opts),
+ R = do_analyse_to_file(Module,OutFile,
+ ErlFile,HTML),
+ reply(From, R)
+ end.
+
%% do_analyse_to_file(Module,OutFile,ErlFile) -> {ok,OutFile} | {error,Error}
%% Module = atom()
%% OutFile = ErlFile = string()
@@ -2027,6 +2093,42 @@ fill2() -> ".| ".
fill3() -> "| ".
%%%--Export--------------------------------------------------------------
+do_export(Module, OutFile, From, State) ->
+ case file:open(OutFile,[write,binary,raw]) of
+ {ok,Fd} ->
+ Reply =
+ case Module of
+ '_' ->
+ export_info(State#main_state.imported),
+ collect(State#main_state.nodes),
+ do_export_table(State#main_state.compiled,
+ State#main_state.imported,
+ Fd);
+ _ ->
+ export_info(Module,State#main_state.imported),
+ try is_loaded(Module, State) of
+ {loaded, File} ->
+ [{Module,Clauses}] =
+ ets:lookup(?COVER_CLAUSE_TABLE,Module),
+ collect(Module, Clauses,
+ State#main_state.nodes),
+ do_export_table([{Module,File}],[],Fd);
+ {imported, File, ImportFiles} ->
+ %% don't know if I should allow this -
+ %% export a module which is only imported
+ Imported = [{Module,File,ImportFiles}],
+ do_export_table([],Imported,Fd)
+ catch throw:_ ->
+ {error,{not_cover_compiled,Module}}
+ end
+ end,
+ file:close(Fd),
+ reply(From, Reply);
+ {error,Reason} ->
+ reply(From, {error, {cant_open_file,OutFile,Reason}})
+
+ end.
+
do_export_table(Compiled, Imported, Fd) ->
ModList = merge(Imported,Compiled),
write_module_data(ModList,Fd).
@@ -2043,7 +2145,7 @@ merge([],ModuleList) ->
write_module_data([{Module,File}|ModList],Fd) ->
write({file,Module,File},Fd),
- [Clauses] = ets:lookup(?COLLECTION_TABLE,Module),
+ [Clauses] = ets:lookup(?COLLECTION_CLAUSE_TABLE,Module),
write(Clauses,Fd),
ModuleData = ets:match_object(?COLLECTION_TABLE,{#bump{module=Module},'_'}),
do_write_module_data(ModuleData,Fd),
@@ -2093,7 +2195,7 @@ do_import_to_table(Fd,ImportFile,Imported,DontImport) ->
{Module,Clauses} ->
case lists:member(Module,DontImport) of
false ->
- ets:insert(?COLLECTION_TABLE,{Module,Clauses});
+ ets:insert(?COLLECTION_CLAUSE_TABLE,{Module,Clauses});
true ->
ok
end,
@@ -2127,14 +2229,14 @@ do_reset_main_node(Module,Nodes) ->
remote_reset(Module,Nodes).
do_reset_collection_table(Module) ->
- ets:delete(?COLLECTION_TABLE,Module),
+ ets:delete(?COLLECTION_CLAUSE_TABLE,Module),
ets:match_delete(?COLLECTION_TABLE, {#bump{module=Module},'_'}).
%% do_reset(Module) -> ok
%% The reset is done on a per-clause basis to avoid building
%% long lists in the case of very large modules
do_reset(Module) ->
- [{Module,Clauses}] = ets:lookup(?COVER_TABLE, Module),
+ [{Module,Clauses}] = ets:lookup(?COVER_CLAUSE_TABLE, Module),
do_reset2(Clauses).
do_reset2([{M,F,A,C,_L}|Clauses]) ->
@@ -2149,10 +2251,19 @@ do_reset2([]) ->
ok.
do_clear(Module) ->
- ets:match_delete(?COVER_TABLE, {Module,'_'}),
+ ets:match_delete(?COVER_CLAUSE_TABLE, {Module,'_'}),
ets:match_delete(?COVER_TABLE, {#bump{module=Module},'_'}),
ets:match_delete(?COLLECTION_TABLE, {#bump{module=Module},'_'}).
+not_loaded(Module, unloaded, State) ->
+ do_clear(Module),
+ remote_unload(State#main_state.nodes,[Module]),
+ Compiled = update_compiled([Module],
+ State#main_state.compiled),
+ State#main_state{ compiled = Compiled };
+not_loaded(_Module,_Else, State) ->
+ State.
+
%%%--Div-----------------------------------------------------------------
@@ -2180,3 +2291,30 @@ escape_lt_and_gt1([],Acc) ->
lists:reverse(Acc);
escape_lt_and_gt1([H|T],Acc) ->
escape_lt_and_gt1(T,[H|Acc]).
+
+pmap(Fun, List) ->
+ pmap(Fun, List, 20).
+pmap(Fun, List, Limit) ->
+ pmap(Fun, List, [], Limit, 0, []).
+pmap(Fun, [E | Rest], Pids, Limit, Cnt, Acc) when Cnt < Limit ->
+ Collector = self(),
+ Pid = spawn_link(fun() ->
+ ?SPAWN_DBG(pmap,E),
+ Collector ! {res,self(),Fun(E)}
+ end),
+ erlang:monitor(process, Pid),
+ pmap(Fun, Rest, Pids ++ [Pid], Limit, Cnt + 1, Acc);
+pmap(Fun, List, [Pid | Pids], Limit, Cnt, Acc) ->
+ receive
+ {'DOWN', _Ref, process, _, _} ->
+ pmap(Fun, List, [Pid | Pids], Limit, Cnt - 1, Acc);
+ {res, Pid, Res} ->
+ pmap(Fun, List, Pids, Limit, Cnt, [Res | Acc])
+ end;
+pmap(_Fun, [], [], _Limit, 0, Acc) ->
+ lists:reverse(Acc);
+pmap(Fun, [], [], Limit, Cnt, Acc) ->
+ receive
+ {'DOWN', _Ref, process, _, _} ->
+ pmap(Fun, [], [], Limit, Cnt - 1, Acc)
+ end.
diff --git a/lib/tools/src/make.erl b/lib/tools/src/make.erl
index 77c354651b..e78e2a43a4 100644
--- a/lib/tools/src/make.erl
+++ b/lib/tools/src/make.erl
@@ -222,12 +222,7 @@ recompilep(File, NoExec, Load, Opts) ->
recompilep1(File, NoExec, Load, Opts, ObjFile) ->
{ok, Erl} = file:read_file_info(lists:append(File, ".erl")),
{ok, Obj} = file:read_file_info(ObjFile),
- case {readable(Erl), writable(Obj)} of
- {true, true} ->
- recompilep1(Erl, Obj, File, NoExec, Load, Opts);
- _ ->
- error
- end.
+ recompilep1(Erl, Obj, File, NoExec, Load, Opts).
recompilep1(#file_info{mtime=Te},
#file_info{mtime=To}, File, NoExec, Load, Opts) when Te>To ->
@@ -277,14 +272,6 @@ exists(File) ->
false
end.
-readable(#file_info{access=read_write}) -> true;
-readable(#file_info{access=read}) -> true;
-readable(_) -> false.
-
-writable(#file_info{access=read_write}) -> true;
-writable(#file_info{access=write}) -> true;
-writable(_) -> false.
-
coerce_2_list(X) when is_atom(X) ->
atom_to_list(X);
coerce_2_list(X) ->
diff --git a/lib/tools/test/Makefile b/lib/tools/test/Makefile
index 3a59be758a..8019b7269f 100644
--- a/lib/tools/test/Makefile
+++ b/lib/tools/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2010. All Rights Reserved.
+# Copyright Ericsson AB 1997-2011. 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
@@ -39,7 +39,8 @@ INSTALL_PROGS= $(TARGET_FILES)
EMAKEFILE=Emakefile
-SPEC_FILES= tools.spec tools.spec.win
+SPEC_FILES= tools.spec
+COVER_FILE = tools.cover
# ----------------------------------------------------
# Release directory specification
@@ -84,8 +85,9 @@ release_spec: opt
release_tests_spec: make_emakefile
$(INSTALL_DIR) $(RELSYSDIR)
- $(INSTALL_DATA) $(SPEC_FILES) $(EMAKEFILE) $(ERL_FILES) $(RELSYSDIR)
- chmod -f -R u+w $(RELSYSDIR)
+ $(INSTALL_DATA) $(SPEC_FILES) $(COVER_FILE) $(EMAKEFILE) \
+ $(ERL_FILES) $(RELSYSDIR)
+ chmod -R u+w $(RELSYSDIR)
@tar cf - *_SUITE_data | (cd $(RELSYSDIR); tar xf -)
release_docs_spec:
diff --git a/lib/tools/test/cover_SUITE.erl b/lib/tools/test/cover_SUITE.erl
index b9ccd62d0b..b5c8e8a1b7 100644
--- a/lib/tools/test/cover_SUITE.erl
+++ b/lib/tools/test/cover_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -18,13 +18,16 @@
%%
-module(cover_SUITE).
--export([all/1]).
+-export([all/0, init_per_testcase/2, end_per_testcase/2,
+ suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
+
-export([start/1, compile/1, analyse/1, misc/1, stop/1,
distribution/1, export_import/1,
otp_5031/1, eif/1, otp_5305/1, otp_5418/1, otp_6115/1, otp_7095/1,
otp_8188/1, otp_8270/1, otp_8273/1, otp_8340/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%%----------------------------------------------------------------------
%% The following directory structure is assumed:
@@ -37,18 +40,55 @@
%% y
%%----------------------------------------------------------------------
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
case whereis(cover_server) of
undefined ->
[start, compile, analyse, misc, stop, distribution,
- export_import,
- otp_5031, eif, otp_5305, otp_5418, otp_6115, otp_7095,
- otp_8188, otp_8270, otp_8273, otp_8340];
+ export_import, otp_5031, eif, otp_5305, otp_5418,
+ otp_6115, otp_7095, otp_8188, otp_8270, otp_8273,
+ otp_8340];
_pid ->
- {skip,"It looks like the test server is running cover. "
- "Can't run cover test."}
+ {skip,
+ "It looks like the test server is running "
+ "cover. Can't run cover test."}
end.
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+init_per_testcase(TC, Config) when TC =:= misc;
+ TC =:= compile;
+ TC =:= analyse;
+ TC =:= distribution;
+ TC =:= otp_5031;
+ TC =:= stop ->
+ case code:which(crypto) of
+ Path when is_list(Path) ->
+ init_per_testcase(dummy_tc, Config);
+ _Else ->
+ {skip, "No crypto file to test with"}
+ end;
+init_per_testcase(_TestCase, Config) ->
+ Config.
+
+end_per_testcase(_TestCase, _Config) ->
+ %cover:stop(),
+ ok.
+
start(suite) -> [];
start(Config) when is_list(Config) ->
?line ok = file:set_cwd(?config(data_dir, Config)),
@@ -331,6 +371,7 @@ distribution(Config) when is_list(Config) ->
%% Check that stop() unloads on all nodes
?line ok = cover:stop(),
+ ?line timer:sleep(100), %% Give nodes time to unload on slow machines.
?line LocalBeam = code:which(f),
?line N2Beam = rpc:call(N2,code,which,[f]),
?line true = is_unloaded(LocalBeam),
@@ -381,8 +422,8 @@ export_import(Config) when is_list(Config) ->
?line {ok,a} = cover:compile(a),
?line ?t:capture_start(),
?line ok = cover:export("all_exported"),
- ?line [Text2] = ?t:capture_get(),
- ?line "Export includes data from imported files"++_ = lists:flatten(Text2),
+ ?line [] = ?t:capture_get(),
+% ?line "Export includes data from imported files"++_ = lists:flatten(Text2),
?line ?t:capture_stop(),
?line ok = cover:stop(),
?line ok = cover:import("all_exported"),
diff --git a/lib/tools/test/cprof_SUITE.erl b/lib/tools/test/cprof_SUITE.erl
index e697cc1571..ce5cf66a14 100644
--- a/lib/tools/test/cprof_SUITE.erl
+++ b/lib/tools/test/cprof_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2011. 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
@@ -41,7 +41,7 @@
-define(config(A,B),config(A,B)).
-export([config/2]).
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-endif.
-ifdef(debug).
@@ -63,14 +63,17 @@ config(data_dir, _) ->
"cprof_SUITE_data".
-else.
%% When run in test server.
--export([all/1, init_per_testcase/2, fin_per_testcase/2, not_run/1]).
+-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,
+ not_run/1]).
-export([basic/1, on_load/1, modules/1]).
init_per_testcase(_Case, Config) ->
?line Dog=test_server:timetrap(test_server:seconds(30)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
erlang:trace_pattern({'_','_','_'}, false, [local,meta,call_count]),
erlang:trace_pattern(on_load, false, [local,meta,call_count]),
erlang:trace(all, false, [all]),
@@ -78,16 +81,30 @@ fin_per_testcase(_Case, Config) ->
test_server:timetrap_cancel(Dog),
ok.
-all(doc) ->
- ["Test the cprof profiling tool."];
-all(suite) ->
- case test_server:is_native(?MODULE) of
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ case test_server:is_native(cprof_SUITE) of
true -> [not_run];
false -> [basic, on_load, modules]
-%, on_and_off, info,
-% pause_and_restart, combo]
end.
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
not_run(Config) when is_list(Config) ->
{skipped,"Native code"}.
diff --git a/lib/tools/test/emem_SUITE.erl b/lib/tools/test/emem_SUITE.erl
index 430fa86c6c..11fb8bec68 100644
--- a/lib/tools/test/emem_SUITE.erl
+++ b/lib/tools/test/emem_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -24,7 +24,8 @@
receive_and_save_trace/2, send_trace/2]).
--export([all/1, init_per_testcase/2, fin_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_testcase/2, end_per_testcase/2]).
-export([live_node/1,
'sparc_sunos5.8_32b_emt2.0'/1,
@@ -41,7 +42,7 @@
-include_lib("kernel/include/file.hrl").
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(DEFAULT_TIMEOUT, ?t:minutes(5)).
@@ -65,23 +66,32 @@
%%
%%
-all(doc) -> [];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
case is_debug_compiled() of
- true -> {skipped, "Not run when debug compiled"};
+ true -> {skip, "Not run when debug compiled"};
false -> test_cases()
end.
-
-test_cases() ->
- [live_node,
- 'sparc_sunos5.8_32b_emt2.0',
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+test_cases() ->
+ [live_node, 'sparc_sunos5.8_32b_emt2.0',
'pc_win2000_32b_emt2.0',
'pc.smp_linux2.2.19pre17_32b_emt2.0',
'powerpc_darwin7.7.0_32b_emt2.0',
'alpha_osf1v5.1_64b_emt2.0',
'sparc_sunos5.8_64b_emt2.0',
- 'sparc_sunos5.8_32b_emt1.0',
- 'pc_win2000_32b_emt1.0',
+ 'sparc_sunos5.8_32b_emt1.0', 'pc_win2000_32b_emt1.0',
'powerpc_darwin7.7.0_32b_emt1.0',
'alpha_osf1v5.1_64b_emt1.0',
'sparc_sunos5.8_64b_emt1.0'].
@@ -100,7 +110,7 @@ init_per_testcase(Case, Config) when is_list(Config) ->
[{watchdog, Dog}, {testcase, Case} | Config])
end.
-fin_per_testcase(_Case, Config) when is_list(Config) ->
+end_per_testcase(_Case, Config) when is_list(Config) ->
ignore_cores:restore(Config),
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
@@ -700,8 +710,8 @@ start_node(Name, Args) ->
% stop_node(Node) ->
% ?t:stop_node(Node).
-is_debug_compiled() ->
- is_debug_compiled(erlang:system_info(system_version)).
+is_debug_compiled() ->
+is_debug_compiled(erlang:system_info(system_version)).
is_debug_compiled([$d,$e,$b,$u,$g | _]) ->
true;
diff --git a/lib/tools/test/eprof_SUITE.erl b/lib/tools/test/eprof_SUITE.erl
index 67607c6cf2..ecdbc5ce57 100644
--- a/lib/tools/test/eprof_SUITE.erl
+++ b/lib/tools/test/eprof_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -18,11 +18,31 @@
%%
-module(eprof_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
--export([all/1,tiny/1,eed/1,basic/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2,tiny/1,eed/1,basic/1]).
+
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [basic, tiny, eed].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
-all(suite) -> [basic,tiny,eed].
basic(suite) -> [];
basic(Config) when is_list(Config) ->
diff --git a/lib/tools/test/fprof_SUITE.erl b/lib/tools/test/fprof_SUITE.erl
index 1cd9ac7824..0da6d4a9ea 100644
--- a/lib/tools/test/fprof_SUITE.erl
+++ b/lib/tools/test/fprof_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2011. 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
@@ -18,10 +18,11 @@
%%
-module(fprof_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% Test server framework exports
--export([all/1, not_run/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, not_run/1]).
%% Test suites
-export([stack_seq/1, tail_seq/1, create_file_slow/1, spawn_simple/1,
@@ -54,18 +55,33 @@
-all(doc) ->
- ["Test the 'fprof' profiling tool."];
-all(suite) ->
- case test_server:is_native(?MODULE) of
- true ->
- [not_run];
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ case test_server:is_native(fprof_SUITE) of
+ true -> [not_run];
false ->
[stack_seq, tail_seq, create_file_slow, spawn_simple,
imm_tail_seq, imm_create_file_slow, imm_compile,
cpu_create_file_slow]
end.
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
not_run(Config) when is_list(Config) ->
{skipped, "Native code"}.
diff --git a/lib/tools/test/ignore_cores.erl b/lib/tools/test/ignore_cores.erl
index 8902a469ef..8b1ac0fe6c 120000..100644
--- a/lib/tools/test/ignore_cores.erl
+++ b/lib/tools/test/ignore_cores.erl
@@ -1 +1,158 @@
-../../../erts/test/ignore_cores.erl \ No newline at end of file
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2008-2010. 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%
+%%
+
+%%%-------------------------------------------------------------------
+%%% File : ignore_cores.erl
+%%% Author : Rickard Green <[email protected]>
+%%% Description :
+%%%
+%%% Created : 11 Feb 2008 by Rickard Green <[email protected]>
+%%%-------------------------------------------------------------------
+
+-module(ignore_cores).
+
+-include_lib("test_server/include/test_server.hrl").
+
+-export([init/1, fini/1, setup/3, setup/4, restore/1, dir/1]).
+
+-record(ignore_cores, {org_cwd,
+ org_path,
+ org_pwd_env,
+ ign_dir = false,
+ cores_dir = false}).
+
+%%
+%% Takes a testcase config
+%%
+
+init(Config) ->
+ {ok, OrgCWD} = file:get_cwd(),
+ [{ignore_cores,
+ #ignore_cores{org_cwd = OrgCWD,
+ org_path = code:get_path(),
+ org_pwd_env = os:getenv("PWD")}}
+ | lists:keydelete(ignore_cores, 1, Config)].
+
+fini(Config) ->
+ #ignore_cores{org_cwd = OrgCWD,
+ org_path = OrgPath,
+ org_pwd_env = OrgPWD} = ?config(ignore_cores, Config),
+ ok = file:set_cwd(OrgCWD),
+ true = code:set_path(OrgPath),
+ case OrgPWD of
+ false -> ok;
+ _ -> true = os:putenv("PWD", OrgPWD)
+ end,
+ lists:keydelete(ignore_cores, 1, Config).
+
+setup(Suite, Testcase, Config) ->
+ setup(Suite, Testcase, Config, false).
+
+setup(Suite, Testcase, Config, SetCwd) when is_atom(Suite),
+ is_atom(Testcase),
+ is_list(Config) ->
+ #ignore_cores{org_cwd = OrgCWD,
+ org_path = OrgPath,
+ org_pwd_env = OrgPWD} = ?config(ignore_cores, Config),
+ Path = lists:map(fun (".") -> OrgCWD; (Dir) -> Dir end, OrgPath),
+ true = code:set_path(Path),
+ PrivDir = ?config(priv_dir, Config),
+ IgnDir = filename:join([PrivDir,
+ atom_to_list(Suite)
+ ++ "_"
+ ++ atom_to_list(Testcase)
+ ++ "_wd"]),
+ ok = file:make_dir(IgnDir),
+ case SetCwd of
+ false ->
+ ok;
+ _ ->
+ ok = file:set_cwd(IgnDir),
+ OrgPWD = case os:getenv("PWD") of
+ false -> false;
+ PWD ->
+ os:putenv("PWD", IgnDir),
+ PWD
+ end
+ end,
+ ok = file:write_file(filename:join([IgnDir, "ignore_core_files"]), <<>>),
+ %% cores are dumped in /cores on MacOS X
+ CoresDir = case {?t:os_type(), filelib:is_dir("/cores")} of
+ {{unix,darwin}, true} ->
+ filelib:fold_files("/cores",
+ "^core.*$",
+ false,
+ fun (C,Cs) -> [C|Cs] end,
+ []);
+ _ ->
+ false
+ end,
+ lists:keyreplace(ignore_cores,
+ 1,
+ Config,
+ {ignore_cores,
+ #ignore_cores{org_cwd = OrgCWD,
+ org_path = OrgPath,
+ org_pwd_env = OrgPWD,
+ ign_dir = IgnDir,
+ cores_dir = CoresDir}}).
+
+restore(Config) ->
+ #ignore_cores{org_cwd = OrgCWD,
+ org_path = OrgPath,
+ org_pwd_env = OrgPWD,
+ ign_dir = IgnDir,
+ cores_dir = CoresDir} = ?config(ignore_cores, Config),
+ try
+ case CoresDir of
+ false ->
+ ok;
+ _ ->
+ %% Move cores dumped by these testcases in /cores
+ %% to cwd.
+ lists:foreach(fun (C) ->
+ case lists:member(C, CoresDir) of
+ true -> ok;
+ _ ->
+ Dst = filename:join(
+ [IgnDir,
+ filename:basename(C)]),
+ {ok, _} = file:copy(C, Dst),
+ file:delete(C)
+ end
+ end,
+ filelib:fold_files("/cores",
+ "^core.*$",
+ false,
+ fun (C,Cs) -> [C|Cs] end,
+ []))
+ end
+ after
+ catch file:set_cwd(OrgCWD),
+ catch code:set_path(OrgPath),
+ case OrgPWD of
+ false -> ok;
+ _ -> catch os:putenv("PWD", OrgPWD)
+ end
+ end.
+
+
+dir(Config) ->
+ #ignore_cores{ign_dir = Dir} = ?config(ignore_cores, Config),
+ Dir.
diff --git a/lib/tools/test/instrument_SUITE.erl b/lib/tools/test/instrument_SUITE.erl
index da5930e015..bc886d47c3 100644
--- a/lib/tools/test/instrument_SUITE.erl
+++ b/lib/tools/test/instrument_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2011. 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
@@ -18,22 +18,43 @@
%%
-module(instrument_SUITE).
--export([all/1,init_per_testcase/2,fin_per_testcase/2]).
+-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(['+Mim true'/1, '+Mis true'/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
init_per_testcase(_Case, Config) ->
?line Dog=?t:timetrap(10000),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
-all(suite) -> ['+Mim true', '+Mis true'].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ ['+Mim true', '+Mis true'].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
'+Mim true'(doc) -> ["Check that memory data can be read and processed"];
'+Mim true'(suite) -> [];
diff --git a/lib/tools/test/lcnt_SUITE.erl b/lib/tools/test/lcnt_SUITE.erl
index e6866f721d..f2afa60e33 100644
--- a/lib/tools/test/lcnt_SUITE.erl
+++ b/lib/tools/test/lcnt_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2011. 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
@@ -18,10 +18,10 @@
%%
-module(lcnt_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% Test server specific exports
--export([all/1]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]).
-export([init_per_suite/1, end_per_suite/1]).
-export([init_per_testcase/2, end_per_testcase/2]).
@@ -51,10 +51,21 @@ end_per_testcase(_Case, Config) ->
?t:timetrap_cancel(Dog),
ok.
-all(suite) ->
- % Test cases
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[load_v1, conflicts, locations, swap_keys].
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%%----------------------------------------------------------------------
%% Tests
%%----------------------------------------------------------------------
diff --git a/lib/tools/test/make_SUITE.erl b/lib/tools/test/make_SUITE.erl
index 72dccdb465..b1a65226de 100644
--- a/lib/tools/test/make_SUITE.erl
+++ b/lib/tools/test/make_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. 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
@@ -18,12 +18,13 @@
%%
-module(make_SUITE).
--export([all/1, make_all/1, make_files/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, make_all/1, make_files/1]).
-export([otp_6057_init/1,
otp_6057_a/1, otp_6057_b/1, otp_6057_c/1,
otp_6057_end/1]).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-include_lib("kernel/include/file.hrl").
@@ -35,9 +36,27 @@
%% that the file :"test5.erl" shall be compiled with the 'S' option,
%% i.e. produce "test5.S" instead of "test5.<objext>"
-all(suite) -> [make_all, make_files,
- {conf, otp_6057_init,
- [otp_6057_a,otp_6057_b,otp_6057_c], otp_6057_end}].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [make_all, make_files, {group, otp_6057}].
+
+groups() ->
+ [{otp_6057,[],[otp_6057_a, otp_6057_b,
+ otp_6057_c]}].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ otp_6057_init(Config).
+
+end_per_group(_GroupName, Config) ->
+ otp_6057_end(Config).
+
test_files() -> ["test1", "test2", "test3", "test4"].
@@ -146,7 +165,7 @@ otp_6057_init(Config) when is_list(Config) ->
otp_6057_a(suite) ->
[];
otp_6057_a(doc) ->
- ["Test that make:all/0 looks for object file in correct place"];
+ ["Test that make:all/0, suite/0 looks for object file in correct place"];
otp_6057_a(Config) when is_list(Config) ->
?line PrivDir = ?config(priv_dir, Config),
diff --git a/lib/tools/test/tools.cover b/lib/tools/test/tools.cover
new file mode 100644
index 0000000000..1053be4f0f
--- /dev/null
+++ b/lib/tools/test/tools.cover
@@ -0,0 +1,2 @@
+{incl_app,tools,details}.
+
diff --git a/lib/tools/test/tools.spec b/lib/tools/test/tools.spec
index 93d5930472..1b07cf1cb6 100644
--- a/lib/tools/test/tools.spec
+++ b/lib/tools/test/tools.spec
@@ -1 +1 @@
-{topcase, {dir, "../tools_test"}}.
+{suites,"../tools_test",all}.
diff --git a/lib/tools/test/tools_SUITE.erl b/lib/tools/test/tools_SUITE.erl
index 6b952f10ab..ea3f59dbe1 100644
--- a/lib/tools/test/tools_SUITE.erl
+++ b/lib/tools/test/tools_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2011. 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
@@ -18,28 +18,45 @@
%%
-module(tools_SUITE).
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
%% Default timetrap timeout (set in init_per_testcase).
-define(default_timeout, ?t:minutes(1)).
-define(application, tools).
%% Test server specific exports
--export([all/1]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
%% Test cases must be exported.
-export([app_test/1]).
-all(doc) ->
- [];
-all(suite) ->
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
[app_test].
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
init_per_testcase(_Case, Config) ->
?line Dog=test_server:timetrap(?default_timeout),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, Config) ->
+end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
diff --git a/lib/tools/test/xref_SUITE.erl b/lib/tools/test/xref_SUITE.erl
index f9d062ef85..2f83ab4995 100644
--- a/lib/tools/test/xref_SUITE.erl
+++ b/lib/tools/test/xref_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2011. 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
@@ -29,28 +29,29 @@
-define(privdir, "xref_SUITE_priv").
-define(copydir, "xref_SUITE_priv/datacopy").
-else.
--include("test_server.hrl").
+-include_lib("test_server/include/test_server.hrl").
-define(format(S, A), ok).
-define(datadir, ?config(data_dir, Conf)).
-define(privdir, ?config(priv_dir, Conf)).
-define(copydir, ?config(copy_dir, Conf)).
-endif.
--export([all/1, init/1, fini/1]).
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+ init_per_group/2,end_per_group/2, init/1, fini/1]).
--export([xref/1,
+-export([
addrem/1, convert/1, intergraph/1, lines/1, loops/1,
no_data/1, modules/1]).
--export([files/1,
+-export([
add/1, default/1, info/1, lib/1, read/1, read2/1, remove/1,
replace/1, update/1, deprecated/1, trycatch/1,
abstract_modules/1, fun_mfa/1, qlc/1]).
--export([analyses/1,
+-export([
analyze/1, basic/1, md/1, q/1, variables/1, unused_locals/1]).
--export([misc/1,
+-export([
format_error/1, otp_7423/1, otp_7831/1]).
-import(lists, [append/2, flatten/1, keysearch/3, member/2, sort/1, usort/1]).
@@ -59,7 +60,7 @@
range/1, relation_to_family/1, set/1, to_external/1,
union/2]).
--export([init_per_testcase/2, fin_per_testcase/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
%% Checks some info counters of a server and some relations that should hold.
-export([check_count/1, check_state/1]).
@@ -68,8 +69,36 @@
-include_lib("tools/src/xref.hrl").
-all(suite) ->
- {conf, init, [xref, files, analyses, misc], fini}.
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, xref}, {group, files}, {group, analyses},
+ {group, misc}].
+
+groups() ->
+ [{xref, [],
+ [addrem, convert, intergraph, lines, loops, no_data,
+ modules]},
+ {files, [],
+ [add, default, info, lib, read, read2, remove, replace,
+ update, deprecated, trycatch, abstract_modules, fun_mfa,
+ qlc]},
+ {analyses, [],
+ [analyze, basic, md, q, variables, unused_locals]},
+ {misc, [], [format_error, otp_7423, otp_7831]}].
+
+init_per_suite(Config) ->
+ init(Config).
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
init(Conf) when is_list(Conf) ->
DataDir = ?datadir,
@@ -91,13 +120,11 @@ init_per_testcase(_Case, Config) ->
Dog=?t:timetrap(?t:minutes(2)),
[{watchdog, Dog}|Config].
-fin_per_testcase(_Case, _Config) ->
+end_per_testcase(_Case, _Config) ->
Dog=?config(watchdog, _Config),
test_server:timetrap_cancel(Dog),
ok.
-xref(suite) ->
- [addrem, convert, intergraph, lines, loops, no_data, modules].
%% Seems a bit short...
addrem(suite) -> [];
@@ -680,9 +707,6 @@ modules(Conf) when is_list(Conf) ->
?line ok = xref_base:delete(S),
ok.
-files(suite) ->
- [add, default, info, lib, read, read2, remove, replace, update,
- deprecated, trycatch, abstract_modules, fun_mfa, qlc].
add(suite) -> [];
add(doc) -> ["Add modules, applications, releases, directories"];
@@ -1788,8 +1812,6 @@ qlc(Conf) when is_list(Conf) ->
ok.
-analyses(suite) ->
- [analyze, basic, md, q, variables, unused_locals].
analyze(suite) -> [];
analyze(doc) -> ["Simple analyses"];
@@ -2312,8 +2334,6 @@ unused_locals(Conf) when is_list(Conf) ->
?line ok = file:delete(Beam2),
ok.
-misc(suite) ->
- [format_error, otp_7423, otp_7831].
format_error(suite) -> [];
format_error(doc) -> ["Format error messages"];
diff --git a/lib/tools/vsn.mk b/lib/tools/vsn.mk
index 0c89b18065..83027cfaa6 100644
--- a/lib/tools/vsn.mk
+++ b/lib/tools/vsn.mk
@@ -1 +1 @@
-TOOLS_VSN = 2.6.6.2
+TOOLS_VSN = 2.6.6.3
diff --git a/lib/tv/doc/src/tv.xml b/lib/tv/doc/src/tv.xml
index 76edcac71b..84b9f8c33d 100644
--- a/lib/tv/doc/src/tv.xml
+++ b/lib/tv/doc/src/tv.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1997</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/tv/src/tv_io_lib.erl b/lib/tv/src/tv_io_lib.erl
index f693ff796d..5457575b7d 100644
--- a/lib/tv/src/tv_io_lib.erl
+++ b/lib/tv/src/tv_io_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2010. 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
@@ -52,10 +52,11 @@ write(_Term, 0) -> "...";
write(Term, _D) when is_integer(Term) -> integer_to_list(Term);
write(Term, _D) when is_float(Term) -> tv_io_lib_format:fwrite_g(Term);
write(Atom, _D) when is_atom(Atom) -> write_atom(Atom);
-write(Term, _D) when is_port(Term) -> "#Port";
+write(Term, _D) when is_port(Term) -> lists:flatten(io_lib:write(Term));
write(Term, _D) when is_pid(Term) -> pid_to_list(Term);
-write(Term, _D) when is_reference(Term) -> "#Ref";
-write(Term, _D) when is_binary(Term) -> "#Bin";
+write(Term, _D) when is_reference(Term) -> io_lib:write(Term);
+write(Term, _D) when is_binary(Term), byte_size(Term) > 100 -> "#Bin";
+write(Term, _D) when is_binary(Term) -> "<<\"" ++ binary_to_list(Term) ++ "\">>";
write(Term, _D) when is_bitstring(Term) -> "#Bitstr";
write([], _D) -> "[]";
write({}, _D) -> "{}";
diff --git a/lib/typer/RELEASE_NOTES b/lib/typer/RELEASE_NOTES
new file mode 100644
index 0000000000..d91a815ee9
--- /dev/null
+++ b/lib/typer/RELEASE_NOTES
@@ -0,0 +1,22 @@
+==============================================================================
+ Major features, additions and changes between Typer versions
+ (in reversed chronological order)
+==============================================================================
+
+Version 0.9 (in Erlang/OTP R14B02)
+----------------------------------
+ - Major rewrite; all code has been cleaned up and placed in one file.
+ The only reason why this is not version 1.0 yet is that there is no proper
+ documentation for typer which can be displayed in the www.erlang.org site.
+ - Added ability to receive the set of exported types and report unknown ones.
+ - Better handling of overloaded contracts; especially erroneous ones on which
+ typer does not crash anymore.
+ - Fixed problem that caused typer to hang when given a file whose module name
+ did not correspond to the file name.
+ - Added two undocumented options that may come very handy when trying to
+ understand why typer reports some particular set of types for the functions
+ in a module. These options are mainly for typer developers at this point,
+ but may become documented in some future version.
+
+Older versions
+--------------
diff --git a/lib/typer/src/Makefile b/lib/typer/src/Makefile
index 9c9ef6156f..620b3ebb69 100644
--- a/lib/typer/src/Makefile
+++ b/lib/typer/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2006-2009. All Rights Reserved.
+# Copyright Ericsson AB 2006-2011. 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
@@ -45,15 +45,9 @@ DIALYZER_DIR = $(ERL_TOP)/lib/dialyzer
# ----------------------------------------------------
# Target Specs
# ----------------------------------------------------
-MODULES = \
- typer \
- typer_annotator \
- typer_info \
- typer_map \
- typer_options \
- typer_preprocess
-
-HRL_FILES= typer.hrl
+MODULES = typer
+
+HRL_FILES=
ERL_FILES= $(MODULES:%=%.erl)
INSTALL_FILES= $(MODULES:%=$(EBIN)/%.$(EMULATOR)) $(APP_TARGET) $(APPUP_TARGET)
TARGET_FILES= $(INSTALL_FILES)
@@ -87,8 +81,8 @@ clean:
# Special Build Targets
# ----------------------------------------------------
-$(EBIN)/typer_options.$(EMULATOR): typer_options.erl ../vsn.mk Makefile
- erlc -W $(ERL_COMPILE_FLAGS) -DVSN="\"v$(VSN)\"" -o$(EBIN) typer_options.erl
+$(EBIN)/typer.$(EMULATOR): typer.erl ../vsn.mk Makefile
+ erlc -W $(ERL_COMPILE_FLAGS) -DVSN="\"v$(VSN)\"" -o$(EBIN) typer.erl
$(APP_TARGET): $(APP_SRC) ../vsn.mk
sed -e 's;%VSN%;$(VSN);' $< > $@
@@ -97,14 +91,9 @@ $(APPUP_TARGET): $(APPUP_SRC) ../vsn.mk
sed -e 's;%VSN%;$(VSN);' $< > $@
# ---------------------------------------------------------------------
-# dependencies -- I wish they were somehow automatically generated
+# dependencies
# ---------------------------------------------------------------------
-$(EBIN)/typer.beam: typer.hrl
-$(EBIN)/typer_annotator.beam: typer.hrl
-$(EBIN)/typer_info.beam: typer.hrl
-$(EBIN)/typer_options.beam: typer.hrl
-$(EBIN)/typer_preprocess.beam: typer.hrl
# ----------------------------------------------------
# Release Target
diff --git a/lib/typer/src/typer.app.src b/lib/typer/src/typer.app.src
index 3eb0cbf816..850829e1dc 100644
--- a/lib/typer/src/typer.app.src
+++ b/lib/typer/src/typer.app.src
@@ -3,12 +3,7 @@
{application, typer,
[{description, "TYPe annotator for ERlang programs, version %VSN%"},
{vsn, "%VSN%"},
- {modules, [typer,
- typer_annotator,
- typer_info,
- typer_map,
- typer_options,
- typer_preprocess]},
+ {modules, [typer]},
{registered, []},
{applications, [compiler, dialyzer, hipe, kernel, stdlib]},
{env, []}]}.
diff --git a/lib/typer/src/typer.erl b/lib/typer/src/typer.erl
index e19614f911..e40c4f39cd 100644
--- a/lib/typer/src/typer.erl
+++ b/lib/typer/src/typer.erl
@@ -1,65 +1,107 @@
%% -*- erlang-indent-level: 2 -*-
%%-----------------------------------------------------------------------
%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2006-2010. All Rights Reserved.
-%%
+%%
+%% Copyright Ericsson AB 2006-2011. 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%
%%
-%%--------------------------------------------------------------------
+%%-----------------------------------------------------------------------
%% File : typer.erl
-%% Author : Bingwen He <[email protected]>
-%% Description : The main driver of the TypEr application
-%%--------------------------------------------------------------------
+%% Author(s) : The first version of typer was written by Bingwen He
+%% with guidance from Kostis Sagonas and Tobias Lindahl.
+%% Since June 2008 typer is maintained by Kostis Sagonas.
+%% Description : An Erlang/OTP application that shows type information
+%% for Erlang modules to the user. Additionally, it can
+%% annotate the code of files with such type information.
+%%-----------------------------------------------------------------------
-module(typer).
-%% Avoid warning for local function error/1 clashing with autoimported BIF.
--compile({no_auto_import,[error/1]}).
-export([start/0]).
--export([error/1, compile_error/1]). % for error reporting
--include("typer.hrl").
+%%-----------------------------------------------------------------------
+
+-define(SHOW, show).
+-define(SHOW_EXPORTED, show_exported).
+-define(ANNOTATE, annotate).
+-define(ANNOTATE_INC_FILES, annotate_inc_files).
+
+-type mode() :: ?SHOW | ?SHOW_EXPORTED | ?ANNOTATE | ?ANNOTATE_INC_FILES.
+
+%%-----------------------------------------------------------------------
+
+-type files() :: [file:filename()].
+-type callgraph() :: dialyzer_callgraph:callgraph().
+-type codeserver() :: dialyzer_codeserver:codeserver().
+-type plt() :: dialyzer_plt:plt().
+
+-record(analysis,
+ {mode :: mode() | 'undefined',
+ macros = [] :: [{atom(), term()}],
+ includes = [] :: files(),
+ codeserver = dialyzer_codeserver:new():: codeserver(),
+ callgraph = dialyzer_callgraph:new() :: callgraph(),
+ files = [] :: files(), % absolute names
+ plt = none :: 'none' | file:filename(),
+ no_spec = false :: boolean(),
+ show_succ = false :: boolean(),
+ %% For choosing between specs or edoc @spec comments
+ edoc = false :: boolean(),
+ %% Files in 'fms' are compilable with option 'to_pp'; we keep them
+ %% as {FileName, ModuleName} in case the ModuleName is different
+ fms = [] :: [{file:filename(), module()}],
+ ex_func = map__new() :: map(),
+ record = map__new() :: map(),
+ func = map__new() :: map(),
+ inc_func = map__new() :: map(),
+ trust_plt = dialyzer_plt:new() :: plt()}).
+-type analysis() :: #analysis{}.
+
+-record(args, {files = [] :: files(),
+ files_r = [] :: files(),
+ trusted = [] :: files()}).
+-type args() :: #args{}.
%%--------------------------------------------------------------------
-spec start() -> no_return().
start() ->
- {Args, Analysis} = typer_options:process(),
+ {Args, Analysis} = process_cl_args(),
%% io:format("Args: ~p\n", [Args]),
%% io:format("Analysis: ~p\n", [Analysis]),
- TrustedFiles = typer_preprocess:get_all_files(Args, trust),
- Analysis1 = Analysis#typer_analysis{t_files = TrustedFiles},
- Analysis2 = extract(Analysis1),
- All_Files = typer_preprocess:get_all_files(Args, analysis),
+ TrustedFiles = filter_fd(Args#args.trusted, [], fun is_erl_file/1),
+ Analysis2 = extract(Analysis, TrustedFiles),
+ All_Files = get_all_files(Args),
%% io:format("All_Files: ~p\n", [All_Files]),
- Analysis3 = Analysis2#typer_analysis{ana_files = All_Files},
- Analysis4 = typer_info:collect(Analysis3),
- %% io:format("Final: ~p\n", [Analysis4#typer_analysis.final_files]),
+ Analysis3 = Analysis2#analysis{files = All_Files},
+ Analysis4 = collect_info(Analysis3),
+ %% io:format("Final: ~p\n", [Analysis4#analysis.fms]),
TypeInfo = get_type_info(Analysis4),
- typer_annotator:annotate(TypeInfo),
+ show_or_annotate(TypeInfo),
%% io:format("\nTyper analysis finished\n"),
erlang:halt(0).
%%--------------------------------------------------------------------
--spec extract(#typer_analysis{}) -> #typer_analysis{}.
+-spec extract(analysis(), files()) -> analysis().
-extract(#typer_analysis{macros = Macros, includes = Includes,
- t_files = TFiles, trust_plt = TrustPLT} = Analysis) ->
+extract(#analysis{macros = Macros,
+ includes = Includes,
+ trust_plt = TrustPLT} = Analysis, TrustedFiles) ->
%% io:format("--- Extracting trusted typer_info... "),
Ds = [{d, Name, Value} || {Name, Value} <- Macros],
CodeServer = dialyzer_codeserver:new(),
@@ -87,7 +129,7 @@ extract(#typer_analysis{macros = Macros, includes = Includes,
{error, Reason} -> compile_error(Reason)
end
end,
- CodeServer1 = lists:foldl(Fun, CodeServer, TFiles),
+ CodeServer1 = lists:foldl(Fun, CodeServer, TrustedFiles),
%% Process remote types
NewCodeServer =
try
@@ -112,30 +154,30 @@ extract(#typer_analysis{macros = Macros, includes = Includes,
dialyzer_plt:insert_contract_list(TmpPlt, SpecList)
end,
NewTrustPLT = lists:foldl(FoldFun, TrustPLT, Modules),
- Analysis#typer_analysis{trust_plt = NewTrustPLT}.
+ Analysis#analysis{trust_plt = NewTrustPLT}.
%%--------------------------------------------------------------------
--spec get_type_info(#typer_analysis{}) -> #typer_analysis{}.
+-spec get_type_info(analysis()) -> analysis().
-get_type_info(#typer_analysis{callgraph = CallGraph,
- trust_plt = TrustPLT,
- code_server = CodeServer} = Analysis) ->
+get_type_info(#analysis{callgraph = CallGraph,
+ trust_plt = TrustPLT,
+ codeserver = CodeServer} = Analysis) ->
StrippedCallGraph = remove_external(CallGraph, TrustPLT),
%% io:format("--- Analyzing callgraph... "),
try
NewPlt = dialyzer_succ_typings:analyze_callgraph(StrippedCallGraph,
TrustPLT, CodeServer),
- Analysis#typer_analysis{callgraph = StrippedCallGraph, trust_plt = NewPlt}
+ Analysis#analysis{callgraph = StrippedCallGraph, trust_plt = NewPlt}
catch
error:What ->
- error(io_lib:format("Analysis failed with message: ~p",
- [{What, erlang:get_stacktrace()}]));
+ fatal_error(io_lib:format("Analysis failed with message: ~p",
+ [{What, erlang:get_stacktrace()}]));
throw:{dialyzer_succ_typing_error, Msg} ->
- error(io_lib:format("Analysis failed with message: ~s", [Msg]))
+ fatal_error(io_lib:format("Analysis failed with message: ~s", [Msg]))
end.
--spec remove_external(dialyzer_callgraph:callgraph(), dialyzer_plt:plt()) -> dialyzer_callgraph:callgraph().
+-spec remove_external(callgraph(), plt()) -> callgraph().
remove_external(CallGraph, PLT) ->
{StrippedCG0, Ext} = dialyzer_callgraph:remove_external(CallGraph),
@@ -143,11 +185,16 @@ remove_external(CallGraph, PLT) ->
case get_external(Ext, PLT) of
[] -> ok;
Externals ->
- msg(io_lib:format(" Unknown functions: ~p\n", [lists:usort(Externals)]))
+ msg(io_lib:format(" Unknown functions: ~p\n", [lists:usort(Externals)])),
+ ExtTypes = rcv_ext_types(),
+ case ExtTypes of
+ [] -> ok;
+ _ -> msg(io_lib:format(" Unknown types: ~p\n", [ExtTypes]))
+ end
end,
StrippedCG.
--spec get_external([{mfa(), mfa()}], dialyzer_plt:plt()) -> [mfa()].
+-spec get_external([{mfa(), mfa()}], plt()) -> [mfa()].
get_external(Exts, Plt) ->
Fun = fun ({_From, To = {M, F, A}}, Acc) ->
@@ -163,31 +210,790 @@ get_external(Exts, Plt) ->
lists:foldl(Fun, [], Exts).
%%--------------------------------------------------------------------
+%% Showing type information or annotating files with such information.
+%%--------------------------------------------------------------------
+
+-define(TYPER_ANN_DIR, "typer_ann").
+
+-type line() :: non_neg_integer().
+-type fa() :: {atom(), arity()}.
+-type func_info() :: {line(), atom(), arity()}.
+
+-record(info, {records = map__new() :: map(),
+ functions = [] :: [func_info()],
+ types = map__new() :: map(),
+ edoc = false :: boolean()}).
+-record(inc, {map = map__new() :: map(), filter = [] :: files()}).
+-type inc() :: #inc{}.
+
+-spec show_or_annotate(analysis()) -> 'ok'.
+
+show_or_annotate(#analysis{mode = Mode, fms = Files} = Analysis) ->
+ case Mode of
+ ?SHOW -> show(Analysis);
+ ?SHOW_EXPORTED -> show(Analysis);
+ ?ANNOTATE ->
+ Fun = fun ({File, Module}) ->
+ Info = get_final_info(File, Module, Analysis),
+ write_typed_file(File, Info)
+ end,
+ lists:foreach(Fun, Files);
+ ?ANNOTATE_INC_FILES ->
+ IncInfo = write_and_collect_inc_info(Analysis),
+ write_inc_files(IncInfo)
+ end.
+
+write_and_collect_inc_info(Analysis) ->
+ Fun = fun ({File, Module}, Inc) ->
+ Info = get_final_info(File, Module, Analysis),
+ write_typed_file(File, Info),
+ IncFuns = get_functions(File, Analysis),
+ collect_imported_functions(IncFuns, Info#info.types, Inc)
+ end,
+ NewInc = lists:foldl(Fun, #inc{}, Analysis#analysis.fms),
+ clean_inc(NewInc).
+
+write_inc_files(Inc) ->
+ Fun =
+ fun (File) ->
+ Val = map__lookup(File, Inc#inc.map),
+ %% Val is function with its type info
+ %% in form [{{Line,F,A},Type}]
+ Functions = [Key || {Key, _} <- Val],
+ Val1 = [{{F,A},Type} || {{_Line,F,A},Type} <- Val],
+ Info = #info{types = map__from_list(Val1),
+ records = map__new(),
+ %% Note we need to sort functions here!
+ functions = lists:keysort(1, Functions)},
+ %% io:format("Types ~p\n", [Info#info.types]),
+ %% io:format("Functions ~p\n", [Info#info.functions]),
+ %% io:format("Records ~p\n", [Info#info.records]),
+ write_typed_file(File, Info)
+ end,
+ lists:foreach(Fun, dict:fetch_keys(Inc#inc.map)).
+
+show(Analysis) ->
+ Fun = fun ({File, Module}) ->
+ Info = get_final_info(File, Module, Analysis),
+ show_type_info(File, Info)
+ end,
+ lists:foreach(Fun, Analysis#analysis.fms).
+
+get_final_info(File, Module, Analysis) ->
+ Records = get_records(File, Analysis),
+ Types = get_types(Module, Analysis, Records),
+ Functions = get_functions(File, Analysis),
+ Edoc = Analysis#analysis.edoc,
+ #info{records = Records, functions = Functions, types = Types, edoc = Edoc}.
+
+collect_imported_functions(Functions, Types, Inc) ->
+ %% Coming from other sourses, including:
+ %% FIXME: How to deal with yecc-generated file????
+ %% --.yrl (yecc-generated file)???
+ %% -- yeccpre.hrl (yecc-generated file)???
+ %% -- other cases
+ Fun = fun ({File, _} = Obj, I) ->
+ case is_yecc_gen(File, I) of
+ {true, NewI} -> NewI;
+ {false, NewI} ->
+ check_imported_functions(Obj, NewI, Types)
+ end
+ end,
+ lists:foldl(Fun, Inc, Functions).
+
+-spec is_yecc_gen(file:filename(), inc()) -> {boolean(), inc()}.
+
+is_yecc_gen(File, #inc{filter = Fs} = Inc) ->
+ case lists:member(File, Fs) of
+ true -> {true, Inc};
+ false ->
+ case filename:extension(File) of
+ ".yrl" ->
+ Rootname = filename:rootname(File, ".yrl"),
+ Obj = Rootname ++ ".erl",
+ case lists:member(Obj, Fs) of
+ true -> {true, Inc};
+ false ->
+ NewInc = Inc#inc{filter = [Obj|Fs]},
+ {true, NewInc}
+ end;
+ _ ->
+ case filename:basename(File) of
+ "yeccpre.hrl" -> {true, Inc};
+ _ -> {false, Inc}
+ end
+ end
+ end.
+
+check_imported_functions({File, {Line, F, A}}, Inc, Types) ->
+ IncMap = Inc#inc.map,
+ FA = {F, A},
+ Type = get_type_info(FA, Types),
+ case map__lookup(File, IncMap) of
+ none -> %% File is not added. Add it
+ Obj = {File,[{FA, {Line, Type}}]},
+ NewMap = map__insert(Obj, IncMap),
+ Inc#inc{map = NewMap};
+ Val -> %% File is already in. Check.
+ case lists:keyfind(FA, 1, Val) of
+ false ->
+ %% Function is not in; add it
+ Obj = {File, Val ++ [{FA, {Line, Type}}]},
+ NewMap = map__insert(Obj, IncMap),
+ Inc#inc{map = NewMap};
+ Type ->
+ %% Function is in and with same type
+ Inc;
+ _ ->
+ %% Function is in but with diff type
+ inc_warning(FA, File),
+ Elem = lists:keydelete(FA, 1, Val),
+ NewMap = case Elem of
+ [] -> map__remove(File, IncMap);
+ _ -> map__insert({File, Elem}, IncMap)
+ end,
+ Inc#inc{map = NewMap}
+ end
+ end.
+
+inc_warning({F, A}, File) ->
+ io:format(" ***Warning: Skip function ~p/~p ", [F, A]),
+ io:format("in file ~p because of inconsistent type\n", [File]).
+
+clean_inc(Inc) ->
+ Inc1 = remove_yecc_generated_file(Inc),
+ normalize_obj(Inc1).
+
+remove_yecc_generated_file(#inc{filter = Filter} = Inc) ->
+ Fun = fun (Key, #inc{map = Map} = I) ->
+ I#inc{map = map__remove(Key, Map)}
+ end,
+ lists:foldl(Fun, Inc, Filter).
+
+normalize_obj(TmpInc) ->
+ Fun = fun (Key, Val, Inc) ->
+ NewVal = [{{Line,F,A},Type} || {{F,A},{Line,Type}} <- Val],
+ map__insert({Key, NewVal}, Inc)
+ end,
+ TmpInc#inc{map = map__fold(Fun, map__new(), TmpInc#inc.map)}.
+
+get_records(File, Analysis) ->
+ map__lookup(File, Analysis#analysis.record).
+
+get_types(Module, Analysis, Records) ->
+ TypeInfoPlt = Analysis#analysis.trust_plt,
+ TypeInfo =
+ case dialyzer_plt:lookup_module(TypeInfoPlt, Module) of
+ none -> [];
+ {value, List} -> List
+ end,
+ CodeServer = Analysis#analysis.codeserver,
+ TypeInfoList =
+ case Analysis#analysis.show_succ of
+ true ->
+ [convert_type_info(I) || I <- TypeInfo];
+ false ->
+ [get_type(I, CodeServer, Records) || I <- TypeInfo]
+ end,
+ map__from_list(TypeInfoList).
+
+convert_type_info({{_M, F, A}, Range, Arg}) ->
+ {{F, A}, {Range, Arg}}.
+
+get_type({{M, F, A} = MFA, Range, Arg}, CodeServer, Records) ->
+ case dialyzer_codeserver:lookup_mfa_contract(MFA, CodeServer) of
+ error ->
+ {{F, A}, {Range, Arg}};
+ {ok, {_FileLine, Contract}} ->
+ Sig = erl_types:t_fun(Arg, Range),
+ case dialyzer_contracts:check_contract(Contract, Sig) of
+ ok -> {{F, A}, {contract, Contract}};
+ {error, {extra_range, _, _}} ->
+ {{F, A}, {contract, Contract}};
+ {error, {overlapping_contract, []}} ->
+ {{F, A}, {contract, Contract}};
+ {error, invalid_contract} ->
+ CString = dialyzer_contracts:contract_to_string(Contract),
+ SigString = dialyzer_utils:format_sig(Sig, Records),
+ Msg = io_lib:format("Error in contract of function ~w:~w/~w\n"
+ "\t The contract is: " ++ CString ++ "\n" ++
+ "\t but the inferred signature is: ~s",
+ [M, F, A, SigString]),
+ fatal_error(Msg);
+ {error, ErrorStr} when is_list(ErrorStr) -> % ErrorStr is a string()
+ Msg = io_lib:format("Error in contract of function ~w:~w/~w: ~s",
+ [M, F, A, ErrorStr]),
+ fatal_error(Msg)
+ end
+ end.
+
+get_functions(File, Analysis) ->
+ case Analysis#analysis.mode of
+ ?SHOW ->
+ Funcs = map__lookup(File, Analysis#analysis.func),
+ Inc_Funcs = map__lookup(File, Analysis#analysis.inc_func),
+ remove_module_info(Funcs) ++ normalize_incFuncs(Inc_Funcs);
+ ?SHOW_EXPORTED ->
+ Ex_Funcs = map__lookup(File, Analysis#analysis.ex_func),
+ remove_module_info(Ex_Funcs);
+ ?ANNOTATE ->
+ Funcs = map__lookup(File, Analysis#analysis.func),
+ remove_module_info(Funcs);
+ ?ANNOTATE_INC_FILES ->
+ map__lookup(File, Analysis#analysis.inc_func)
+ end.
+
+normalize_incFuncs(Functions) ->
+ [FunInfo || {_FileName, FunInfo} <- Functions].
+
+-spec remove_module_info([func_info()]) -> [func_info()].
+
+remove_module_info(FunInfoList) ->
+ F = fun ({_,module_info,0}) -> false;
+ ({_,module_info,1}) -> false;
+ ({Line,F,A}) when is_integer(Line), is_atom(F), is_integer(A) -> true
+ end,
+ lists:filter(F, FunInfoList).
+
+write_typed_file(File, Info) ->
+ io:format(" Processing file: ~p\n", [File]),
+ Dir = filename:dirname(File),
+ RootName = filename:basename(filename:rootname(File)),
+ Ext = filename:extension(File),
+ TyperAnnDir = filename:join(Dir, ?TYPER_ANN_DIR),
+ TmpNewFilename = lists:concat([RootName, ".ann", Ext]),
+ NewFileName = filename:join(TyperAnnDir, TmpNewFilename),
+ case file:make_dir(TyperAnnDir) of
+ {error, Reason} ->
+ case Reason of
+ eexist -> %% TypEr dir exists; remove old typer files
+ ok = file:delete(NewFileName),
+ write_typed_file(File, Info, NewFileName);
+ enospc ->
+ Msg = io_lib:format("Not enough space in ~p\n", [Dir]),
+ fatal_error(Msg);
+ eacces ->
+ Msg = io:format("No write permission in ~p\n", [Dir]),
+ fatal_error(Msg);
+ _ ->
+ Msg = io_lib:format("Unhandled error ~s when writing ~p\n",
+ [Reason, Dir]),
+ fatal_error(Msg)
+ end;
+ ok -> %% Typer dir does NOT exist
+ write_typed_file(File, Info, NewFileName)
+ end.
+
+write_typed_file(File, Info, NewFileName) ->
+ {ok, Binary} = file:read_file(File),
+ Chars = binary_to_list(Binary),
+ write_typed_file(Chars, NewFileName, Info, 1, []),
+ io:format(" Saved as: ~p\n", [NewFileName]).
+
+write_typed_file(Chars, File, #info{functions = []}, _LNo, _Acc) ->
+ ok = file:write_file(File, list_to_binary(Chars), [append]);
+write_typed_file([Ch|Chs] = Chars, File, Info, LineNo, Acc) ->
+ [{Line,F,A}|RestFuncs] = Info#info.functions,
+ case Line of
+ 1 -> %% This will happen only for inc files
+ ok = raw_write(F, A, Info, File, []),
+ NewInfo = Info#info{functions = RestFuncs},
+ NewAcc = [],
+ write_typed_file(Chars, File, NewInfo, Line, NewAcc);
+ _ ->
+ case Ch of
+ 10 ->
+ NewLineNo = LineNo + 1,
+ {NewInfo, NewAcc} =
+ case NewLineNo of
+ Line ->
+ ok = raw_write(F, A, Info, File, [Ch|Acc]),
+ {Info#info{functions = RestFuncs}, []};
+ _ ->
+ {Info, [Ch|Acc]}
+ end,
+ write_typed_file(Chs, File, NewInfo, NewLineNo, NewAcc);
+ _ ->
+ write_typed_file(Chs, File, Info, LineNo, [Ch|Acc])
+ end
+ end.
+
+raw_write(F, A, Info, File, Content) ->
+ TypeInfo = get_type_string(F, A, Info, file),
+ ContentList = lists:reverse(Content) ++ TypeInfo ++ "\n",
+ ContentBin = list_to_binary(ContentList),
+ file:write_file(File, ContentBin, [append]).
+
+get_type_string(F, A, Info, Mode) ->
+ Type = get_type_info({F,A}, Info#info.types),
+ TypeStr =
+ case Type of
+ {contract, C} ->
+ dialyzer_contracts:contract_to_string(C);
+ {RetType, ArgType} ->
+ Sig = erl_types:t_fun(ArgType, RetType),
+ dialyzer_utils:format_sig(Sig, Info#info.records)
+ end,
+ case Info#info.edoc of
+ false ->
+ case {Mode, Type} of
+ {file, {contract, _}} -> "";
+ _ ->
+ Prefix = lists:concat(["-spec ", F]),
+ lists:concat([Prefix, TypeStr, "."])
+ end;
+ true ->
+ Prefix = lists:concat(["%% @spec ", F]),
+ lists:concat([Prefix, TypeStr, "."])
+ end.
+
+show_type_info(File, Info) ->
+ io:format("\n%% File: ~p\n%% ", [File]),
+ OutputString = lists:concat(["~.", length(File)+8, "c~n"]),
+ io:fwrite(OutputString, [$-]),
+ Fun = fun ({_LineNo, F, A}) ->
+ TypeInfo = get_type_string(F, A, Info, show),
+ io:format("~s\n", [TypeInfo])
+ end,
+ lists:foreach(Fun, Info#info.functions).
+
+get_type_info(Func, Types) ->
+ case map__lookup(Func, Types) of
+ none ->
+ %% Note: Typeinfo of any function should exist in
+ %% the result offered by dialyzer, otherwise there
+ %% *must* be something wrong with the analysis
+ Msg = io_lib:format("No type info for function: ~p\n", [Func]),
+ fatal_error(Msg);
+ {contract, _Fun} = C -> C;
+ {_RetType, _ArgType} = RA -> RA
+ end.
+
+%%--------------------------------------------------------------------
+%% Processing of command-line options and arguments.
+%%--------------------------------------------------------------------
+
+-spec process_cl_args() -> {args(), analysis()}.
+
+process_cl_args() ->
+ ArgList = init:get_plain_arguments(),
+ %% io:format("Args is ~p\n", [ArgList]),
+ {Args, Analysis} = analyze_args(ArgList, #args{}, #analysis{}),
+ %% if the mode has not been set, set it to the default mode (show)
+ {Args, case Analysis#analysis.mode of
+ undefined -> Analysis#analysis{mode = ?SHOW};
+ Mode when is_atom(Mode) -> Analysis
+ end}.
+
+analyze_args([], Args, Analysis) ->
+ {Args, Analysis};
+analyze_args(ArgList, Args, Analysis) ->
+ {Result, Rest} = cl(ArgList),
+ {NewArgs, NewAnalysis} = analyze_result(Result, Args, Analysis),
+ analyze_args(Rest, NewArgs, NewAnalysis).
+
+cl(["-h"|_]) -> help_message();
+cl(["--help"|_]) -> help_message();
+cl(["-v"|_]) -> version_message();
+cl(["--version"|_]) -> version_message();
+cl(["--edoc"|Opts]) -> {edoc, Opts};
+cl(["--show"|Opts]) -> {{mode, ?SHOW}, Opts};
+cl(["--show_exported"|Opts]) -> {{mode, ?SHOW_EXPORTED}, Opts};
+cl(["--show-exported"|Opts]) -> {{mode, ?SHOW_EXPORTED}, Opts};
+cl(["--show_success_typings"|Opts]) -> {show_succ, Opts};
+cl(["--show-success-typings"|Opts]) -> {show_succ, Opts};
+cl(["--annotate"|Opts]) -> {{mode, ?ANNOTATE}, Opts};
+cl(["--annotate-inc-files"|Opts]) -> {{mode, ?ANNOTATE_INC_FILES}, Opts};
+cl(["--no_spec"|Opts]) -> {no_spec, Opts};
+cl(["--plt",Plt|Opts]) -> {{plt, Plt}, Opts};
+cl(["-D"++Def|Opts]) ->
+ case Def of
+ "" -> fatal_error("no variable name specified after -D");
+ _ ->
+ DefPair = process_def_list(re:split(Def, "=", [{return, list}])),
+ {{def, DefPair}, Opts}
+ end;
+cl(["-I",Dir|Opts]) -> {{inc, Dir}, Opts};
+cl(["-I"++Dir|Opts]) ->
+ case Dir of
+ "" -> fatal_error("no include directory specified after -I");
+ _ -> {{inc, Dir}, Opts}
+ end;
+cl(["-T"|Opts]) ->
+ {Files, RestOpts} = dialyzer_cl_parse:collect_args(Opts),
+ case Files of
+ [] -> fatal_error("no file or directory specified after -T");
+ [_|_] -> {{trusted, Files}, RestOpts}
+ end;
+cl(["-r"|Opts]) ->
+ {Files, RestOpts} = dialyzer_cl_parse:collect_args(Opts),
+ {{files_r, Files}, RestOpts};
+cl(["-pa",Dir|Opts]) -> {{pa,Dir}, Opts};
+cl(["-pz",Dir|Opts]) -> {{pz,Dir}, Opts};
+cl(["-"++H|_]) -> fatal_error("unknown option -"++H);
+cl(Opts) ->
+ {Files, RestOpts} = dialyzer_cl_parse:collect_args(Opts),
+ {{files, Files}, RestOpts}.
+
+process_def_list(L) ->
+ case L of
+ [Name, Value] ->
+ {ok, Tokens, _} = erl_scan:string(Value ++ "."),
+ {ok, ErlValue} = erl_parse:parse_term(Tokens),
+ {list_to_atom(Name), ErlValue};
+ [Name] ->
+ {list_to_atom(Name), true}
+ end.
+
+%% Get information about files that the user trusts and wants to analyze
+analyze_result({files, Val}, Args, Analysis) ->
+ NewVal = Args#args.files ++ Val,
+ {Args#args{files = NewVal}, Analysis};
+analyze_result({files_r, Val}, Args, Analysis) ->
+ NewVal = Args#args.files_r ++ Val,
+ {Args#args{files_r = NewVal}, Analysis};
+analyze_result({trusted, Val}, Args, Analysis) ->
+ NewVal = Args#args.trusted ++ Val,
+ {Args#args{trusted = NewVal}, Analysis};
+analyze_result(edoc, Args, Analysis) ->
+ {Args, Analysis#analysis{edoc = true}};
+%% Get useful information for actual analysis
+analyze_result({mode, Mode}, Args, Analysis) ->
+ case Analysis#analysis.mode of
+ undefined -> {Args, Analysis#analysis{mode = Mode}};
+ OldMode -> mode_error(OldMode, Mode)
+ end;
+analyze_result({def, Val}, Args, Analysis) ->
+ NewVal = Analysis#analysis.macros ++ [Val],
+ {Args, Analysis#analysis{macros = NewVal}};
+analyze_result({inc, Val}, Args, Analysis) ->
+ NewVal = Analysis#analysis.includes ++ [Val],
+ {Args, Analysis#analysis{includes = NewVal}};
+analyze_result({plt, Plt}, Args, Analysis) ->
+ {Args, Analysis#analysis{plt = Plt}};
+analyze_result(show_succ, Args, Analysis) ->
+ {Args, Analysis#analysis{show_succ = true}};
+analyze_result(no_spec, Args, Analysis) ->
+ {Args, Analysis#analysis{no_spec = true}};
+analyze_result({pa, Dir}, Args, Analysis) ->
+ code:add_patha(Dir),
+ {Args, Analysis};
+analyze_result({pz, Dir}, Args, Analysis) ->
+ code:add_pathz(Dir),
+ {Args, Analysis}.
+
+%%--------------------------------------------------------------------
+%% File processing.
+%%--------------------------------------------------------------------
+
+-spec get_all_files(args()) -> [file:filename(),...].
+
+get_all_files(#args{files = Fs, files_r = Ds}) ->
+ case filter_fd(Fs, Ds, fun test_erl_file_exclude_ann/1) of
+ [] -> fatal_error("no file(s) to analyze");
+ AllFiles -> AllFiles
+ end.
--spec error(string()) -> no_return().
+-spec test_erl_file_exclude_ann(file:filename()) -> boolean().
-error(Slogan) ->
+test_erl_file_exclude_ann(File) ->
+ case is_erl_file(File) of
+ true -> %% Exclude files ending with ".ann.erl"
+ case re:run(File, "[\.]ann[\.]erl$") of
+ {match, _} -> false;
+ nomatch -> true
+ end;
+ false -> false
+ end.
+
+-spec is_erl_file(file:filename()) -> boolean().
+
+is_erl_file(File) ->
+ filename:extension(File) =:= ".erl".
+
+-type test_file_fun() :: fun((file:filename()) -> boolean()).
+
+-spec filter_fd(files(), files(), test_file_fun()) -> files().
+
+filter_fd(File_Dir, Dir_R, Fun) ->
+ All_File_1 = process_file_and_dir(File_Dir, Fun),
+ All_File_2 = process_dir_rec(Dir_R, Fun),
+ remove_dup(All_File_1 ++ All_File_2).
+
+-spec process_file_and_dir(files(), test_file_fun()) -> files().
+
+process_file_and_dir(File_Dir, TestFun) ->
+ Fun =
+ fun (Elem, Acc) ->
+ case filelib:is_regular(Elem) of
+ true -> process_file(Elem, TestFun, Acc);
+ false -> check_dir(Elem, false, Acc, TestFun)
+ end
+ end,
+ lists:foldl(Fun, [], File_Dir).
+
+-spec process_dir_rec(files(), test_file_fun()) -> files().
+
+process_dir_rec(Dirs, TestFun) ->
+ Fun = fun (Dir, Acc) -> check_dir(Dir, true, Acc, TestFun) end,
+ lists:foldl(Fun, [], Dirs).
+
+-spec check_dir(file:filename(), boolean(), files(), test_file_fun()) -> files().
+
+check_dir(Dir, Recursive, Acc, Fun) ->
+ case file:list_dir(Dir) of
+ {ok, Files} ->
+ {TmpDirs, TmpFiles} = split_dirs_and_files(Files, Dir),
+ case Recursive of
+ false ->
+ FinalFiles = process_file_and_dir(TmpFiles, Fun),
+ Acc ++ FinalFiles;
+ true ->
+ TmpAcc1 = process_file_and_dir(TmpFiles, Fun),
+ TmpAcc2 = process_dir_rec(TmpDirs, Fun),
+ Acc ++ TmpAcc1 ++ TmpAcc2
+ end;
+ {error, eacces} ->
+ fatal_error("no access permission to dir \""++Dir++"\"");
+ {error, enoent} ->
+ fatal_error("cannot access "++Dir++": No such file or directory");
+ {error, _Reason} ->
+ fatal_error("error involving a use of file:list_dir/1")
+ end.
+
+%% Same order as the input list
+-spec process_file(file:filename(), test_file_fun(), files()) -> files().
+
+process_file(File, TestFun, Acc) ->
+ case TestFun(File) of
+ true -> Acc ++ [File];
+ false -> Acc
+ end.
+
+%% Same order as the input list
+-spec split_dirs_and_files(files(), file:filename()) -> {files(), files()}.
+
+split_dirs_and_files(Elems, Dir) ->
+ Test_Fun =
+ fun (Elem, {DirAcc, FileAcc}) ->
+ File = filename:join(Dir, Elem),
+ case filelib:is_regular(File) of
+ false -> {[File|DirAcc], FileAcc};
+ true -> {DirAcc, [File|FileAcc]}
+ end
+ end,
+ {Dirs, Files} = lists:foldl(Test_Fun, {[], []}, Elems),
+ {lists:reverse(Dirs), lists:reverse(Files)}.
+
+%% Removes duplicate filenames but keeps the order of the input list
+-spec remove_dup(files()) -> files().
+
+remove_dup(Files) ->
+ Test_Dup = fun (File, Acc) ->
+ case lists:member(File, Acc) of
+ true -> Acc;
+ false -> [File|Acc]
+ end
+ end,
+ Reversed_Elems = lists:foldl(Test_Dup, [], Files),
+ lists:reverse(Reversed_Elems).
+
+%%--------------------------------------------------------------------
+%% Collect information.
+%%--------------------------------------------------------------------
+
+-type inc_file_info() :: {file:filename(), func_info()}.
+
+-record(tmpAcc, {file :: file:filename(),
+ module :: atom(),
+ funcAcc = [] :: [func_info()],
+ incFuncAcc = [] :: [inc_file_info()],
+ dialyzerObj = [] :: [{mfa(), {_, _}}]}).
+
+-spec collect_info(analysis()) -> analysis().
+
+collect_info(Analysis) ->
+ NewPlt =
+ try get_dialyzer_plt(Analysis) of
+ DialyzerPlt ->
+ dialyzer_plt:merge_plts([Analysis#analysis.trust_plt, DialyzerPlt])
+ catch
+ throw:{dialyzer_error,_Reason} ->
+ fatal_error("Dialyzer's PLT is missing or is not up-to-date; please (re)create it")
+ end,
+ NewAnalysis = lists:foldl(fun collect_one_file_info/2,
+ Analysis#analysis{trust_plt = NewPlt},
+ Analysis#analysis.files),
+ %% Process Remote Types
+ TmpCServer = NewAnalysis#analysis.codeserver,
+ NewCServer =
+ try
+ NewRecords = dialyzer_codeserver:get_temp_records(TmpCServer),
+ NewExpTypes = dialyzer_codeserver:get_temp_exported_types(TmpCServer),
+ OldRecords = dialyzer_plt:get_types(NewPlt),
+ OldExpTypes = dialyzer_plt:get_exported_types(NewPlt),
+ MergedRecords = dialyzer_utils:merge_records(NewRecords, OldRecords),
+ MergedExpTypes = sets:union(NewExpTypes, OldExpTypes),
+ %% io:format("Merged Records ~p",[MergedRecords]),
+ TmpCServer1 = dialyzer_codeserver:set_temp_records(MergedRecords, TmpCServer),
+ TmpCServer2 =
+ dialyzer_codeserver:insert_temp_exported_types(MergedExpTypes,
+ TmpCServer1),
+ TmpCServer3 = dialyzer_utils:process_record_remote_types(TmpCServer2),
+ dialyzer_contracts:process_contract_remote_types(TmpCServer3)
+ catch
+ throw:{error, ErrorMsg} ->
+ fatal_error(ErrorMsg)
+ end,
+ NewAnalysis#analysis{codeserver = NewCServer}.
+
+collect_one_file_info(File, Analysis) ->
+ Ds = [{d,Name,Val} || {Name,Val} <- Analysis#analysis.macros],
+ %% Current directory should also be included in "Includes".
+ Includes = [filename:dirname(File)|Analysis#analysis.includes],
+ Is = [{i,Dir} || Dir <- Includes],
+ Options = dialyzer_utils:src_compiler_opts() ++ Is ++ Ds,
+ case dialyzer_utils:get_abstract_code_from_src(File, Options) of
+ {error, Reason} ->
+ %% io:format("File=~p\n,Options=~p\n,Error=~p\n", [File,Options,Reason]),
+ compile_error(Reason);
+ {ok, AbstractCode} ->
+ case dialyzer_utils:get_core_from_abstract_code(AbstractCode, Options) of
+ error -> compile_error(["Could not get core erlang for "++File]);
+ {ok, Core} ->
+ case dialyzer_utils:get_record_and_type_info(AbstractCode) of
+ {error, Reason} -> compile_error([Reason]);
+ {ok, Records} ->
+ Mod = cerl:concrete(cerl:module_name(Core)),
+ case dialyzer_utils:get_spec_info(Mod, AbstractCode, Records) of
+ {error, Reason} -> compile_error([Reason]);
+ {ok, SpecInfo} ->
+ ExpTypes = get_exported_types_from_core(Core),
+ analyze_core_tree(Core, Records, SpecInfo, ExpTypes,
+ Analysis, File)
+ end
+ end
+ end
+ end.
+
+analyze_core_tree(Core, Records, SpecInfo, ExpTypes, Analysis, File) ->
+ Module = cerl:concrete(cerl:module_name(Core)),
+ TmpTree = cerl:from_records(Core),
+ CS1 = Analysis#analysis.codeserver,
+ NextLabel = dialyzer_codeserver:get_next_core_label(CS1),
+ {Tree, NewLabel} = cerl_trees:label(TmpTree, NextLabel),
+ CS2 = dialyzer_codeserver:insert(Module, Tree, CS1),
+ CS3 = dialyzer_codeserver:set_next_core_label(NewLabel, CS2),
+ CS4 = dialyzer_codeserver:store_temp_records(Module, Records, CS3),
+ CS5 =
+ case Analysis#analysis.no_spec of
+ true -> CS4;
+ false -> dialyzer_codeserver:store_temp_contracts(Module, SpecInfo, CS4)
+ end,
+ OldExpTypes = dialyzer_codeserver:get_temp_exported_types(CS5),
+ MergedExpTypes = sets:union(ExpTypes, OldExpTypes),
+ CS6 = dialyzer_codeserver:insert_temp_exported_types(MergedExpTypes, CS5),
+ Ex_Funcs = [{0,F,A} || {_,_,{F,A}} <- cerl:module_exports(Tree)],
+ TmpCG = Analysis#analysis.callgraph,
+ CG = dialyzer_callgraph:scan_core_tree(Tree, TmpCG),
+ Fun = fun analyze_one_function/2,
+ All_Defs = cerl:module_defs(Tree),
+ Acc = lists:foldl(Fun, #tmpAcc{file = File, module = Module}, All_Defs),
+ Exported_FuncMap = map__insert({File, Ex_Funcs}, Analysis#analysis.ex_func),
+ %% we must sort all functions in the file which
+ %% originate from this file by *numerical order* of lineNo
+ Sorted_Functions = lists:keysort(1, Acc#tmpAcc.funcAcc),
+ FuncMap = map__insert({File, Sorted_Functions}, Analysis#analysis.func),
+ %% we do not need to sort functions which are imported from included files
+ IncFuncMap = map__insert({File, Acc#tmpAcc.incFuncAcc},
+ Analysis#analysis.inc_func),
+ FMs = Analysis#analysis.fms ++ [{File, Module}],
+ RecordMap = map__insert({File, Records}, Analysis#analysis.record),
+ Analysis#analysis{fms = FMs,
+ callgraph = CG,
+ codeserver = CS6,
+ ex_func = Exported_FuncMap,
+ inc_func = IncFuncMap,
+ record = RecordMap,
+ func = FuncMap}.
+
+analyze_one_function({Var, FunBody} = Function, Acc) ->
+ F = cerl:fname_id(Var),
+ A = cerl:fname_arity(Var),
+ TmpDialyzerObj = {{Acc#tmpAcc.module, F, A}, Function},
+ NewDialyzerObj = Acc#tmpAcc.dialyzerObj ++ [TmpDialyzerObj],
+ [_, LineNo, {file, FileName}] = cerl:get_ann(FunBody),
+ BaseName = filename:basename(FileName),
+ FuncInfo = {LineNo, F, A},
+ OriginalName = Acc#tmpAcc.file,
+ {FuncAcc, IncFuncAcc} =
+ case (FileName =:= OriginalName) orelse (BaseName =:= OriginalName) of
+ true -> %% Coming from original file
+ %% io:format("Added function ~p\n", [{LineNo, F, A}]),
+ {Acc#tmpAcc.funcAcc ++ [FuncInfo], Acc#tmpAcc.incFuncAcc};
+ false ->
+ %% Coming from other sourses, including:
+ %% -- .yrl (yecc-generated file)
+ %% -- yeccpre.hrl (yecc-generated file)
+ %% -- other cases
+ {Acc#tmpAcc.funcAcc, Acc#tmpAcc.incFuncAcc ++ [{FileName, FuncInfo}]}
+ end,
+ Acc#tmpAcc{funcAcc = FuncAcc,
+ incFuncAcc = IncFuncAcc,
+ dialyzerObj = NewDialyzerObj}.
+
+-spec get_dialyzer_plt(analysis()) -> plt().
+
+get_dialyzer_plt(#analysis{plt = PltFile0}) ->
+ PltFile =
+ case PltFile0 =:= none of
+ true -> dialyzer_plt:get_default_plt();
+ false -> PltFile0
+ end,
+ dialyzer_plt:from_file(PltFile).
+
+%% Exported Types
+
+get_exported_types_from_core(Core) ->
+ Attrs = cerl:module_attrs(Core),
+ ExpTypes1 = [cerl:concrete(L2) || {L1, L2} <- Attrs,
+ cerl:is_literal(L1),
+ cerl:is_literal(L2),
+ cerl:concrete(L1) =:= 'export_type'],
+ ExpTypes2 = lists:flatten(ExpTypes1),
+ M = cerl:atom_val(cerl:module_name(Core)),
+ sets:from_list([{M, F, A} || {F, A} <- ExpTypes2]).
+
+%%--------------------------------------------------------------------
+%% Utilities for error reporting.
+%%--------------------------------------------------------------------
+
+-spec fatal_error(string()) -> no_return().
+
+fatal_error(Slogan) ->
msg(io_lib:format("typer: ~s\n", [Slogan])),
erlang:halt(1).
-%%--------------------------------------------------------------------
+-spec mode_error(mode(), mode()) -> no_return().
+
+mode_error(OldMode, NewMode) ->
+ Msg = io_lib:format("Mode was previously set to '~s'; "
+ "can not set it to '~s' now",
+ [OldMode, NewMode]),
+ fatal_error(Msg).
-spec compile_error([string()]) -> no_return().
compile_error(Reason) ->
JoinedString = lists:flatten([X ++ "\n" || X <- Reason]),
Msg = "Analysis failed with error report:\n" ++ JoinedString,
- error(Msg).
-
-%%--------------------------------------------------------------------
-%% Outputs a message on 'stderr', if possible.
-%%--------------------------------------------------------------------
+ fatal_error(Msg).
-spec msg(string()) -> 'ok'.
msg(Msg) ->
case os:type() of
- {unix, _} ->
+ {unix, _} -> % Output a message on 'stderr', if possible
P = open_port({fd, 0, 2}, [out]),
port_command(P, Msg),
true = port_close(P),
@@ -197,3 +1003,111 @@ msg(Msg) ->
end.
%%--------------------------------------------------------------------
+%% Version and help messages.
+%%--------------------------------------------------------------------
+
+-spec version_message() -> no_return().
+
+version_message() ->
+ io:format("TypEr version "++?VSN++"\n"),
+ erlang:halt(0).
+
+-spec help_message() -> no_return().
+
+help_message() ->
+ S = <<" Usage: typer [--help] [--version] [--plt PLT] [--edoc]
+ [--show | --show-exported | --annotate | --annotate-inc-files]
+ [-Ddefine]* [-I include_dir]* [-pa dir]* [-pz dir]*
+ [-T application]* [-r] file*
+
+ Options:
+ -r dir*
+ search directories recursively for .erl files below them
+ --show
+ Prints type specifications for all functions on stdout.
+ (this is the default behaviour; this option is not really needed)
+ --show-exported (or --show_exported)
+ Same as --show, but prints specifications for exported functions only
+ Specs are displayed sorted alphabetically on the function's name
+ --annotate
+ Annotates the specified files with type specifications
+ --annotate-inc-files
+ Same as --annotate but annotates all -include() files as well as
+ all .erl files (use this option with caution - has not been tested much)
+ --edoc
+ Prints type information as Edoc @spec comments, not as type specs
+ --plt PLT
+ Use the specified dialyzer PLT file rather than the default one
+ -T file*
+ The specified file(s) already contain type specifications and these
+ are to be trusted in order to print specs for the rest of the files
+ (Multiple files or dirs, separated by spaces, can be specified.)
+ -Dname (or -Dname=value)
+ pass the defined name(s) to TypEr
+ (The syntax of defines is the same as that used by \"erlc\".)
+ -I include_dir
+ pass the include_dir to TypEr
+ (The syntax of includes is the same as that used by \"erlc\".)
+ -pa dir
+ -pz dir
+ Set code path options to TypEr
+ (This is useful for files that use parse tranforms.)
+ --version (or -v)
+ prints the Typer version and exits
+ --help (or -h)
+ prints this message and exits
+
+ Note:
+ * denotes that multiple occurrences of these options are possible.
+">>,
+ io:put_chars(S),
+ erlang:halt(0).
+
+%%--------------------------------------------------------------------
+%% Handle messages.
+%%--------------------------------------------------------------------
+
+rcv_ext_types() ->
+ Self = self(),
+ Self ! {Self, done},
+ rcv_ext_types(Self, []).
+
+rcv_ext_types(Self, ExtTypes) ->
+ receive
+ {Self, ext_types, ExtType} ->
+ rcv_ext_types(Self, [ExtType|ExtTypes]);
+ {Self, done} ->
+ lists:usort(ExtTypes)
+ end.
+
+%%--------------------------------------------------------------------
+%% A convenient abstraction of a Key-Value mapping data structure
+%% specialized for the uses in this module
+%%--------------------------------------------------------------------
+
+-type map() :: dict().
+
+-spec map__new() -> map().
+map__new() ->
+ dict:new().
+
+-spec map__insert({term(), term()}, map()) -> map().
+map__insert(Object, Map) ->
+ {Key, Value} = Object,
+ dict:store(Key, Value, Map).
+
+-spec map__lookup(term(), map()) -> term().
+map__lookup(Key, Map) ->
+ try dict:fetch(Key, Map) catch error:_ -> none end.
+
+-spec map__from_list([{fa(), term()}]) -> map().
+map__from_list(List) ->
+ dict:from_list(List).
+
+-spec map__remove(term(), map()) -> map().
+map__remove(Key, Dict) ->
+ dict:erase(Key, Dict).
+
+-spec map__fold(fun((term(), term(), term()) -> map()), map(), map()) -> map().
+map__fold(Fun, Acc0, Dict) ->
+ dict:fold(Fun, Acc0, Dict).
diff --git a/lib/typer/src/typer.hrl b/lib/typer/src/typer.hrl
deleted file mode 100644
index c331dd82db..0000000000
--- a/lib/typer/src/typer.hrl
+++ /dev/null
@@ -1,64 +0,0 @@
-%% -*- erlang-indent-level: 2 -*-
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2006-2009. 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%
-%%
-
--define(SHOW, show).
--define(SHOW_EXPORTED, show_exported).
--define(ANNOTATE, annotate).
--define(ANNOTATE_INC_FILES, annotate_inc_files).
-
--type mode() :: ?SHOW | ?SHOW_EXPORTED | ?ANNOTATE | ?ANNOTATE_INC_FILES.
-
--record(typer_analysis,
- {mode :: mode(),
- macros = [] :: [{atom(), _}], % {macro_name, value}
- includes = [] :: [string()],
-
- %% Esp for Dialyzer
- %% ----------------------
- code_server = dialyzer_codeserver:new():: dialyzer_codeserver:codeserver(),
- callgraph = dialyzer_callgraph:new() :: dialyzer_callgraph:callgraph(),
- ana_files = [] :: [string()], % absolute filenames
- plt = none :: 'none' | string(),
-
- %% Esp for TypEr
- %% ----------------------
- t_files = [] :: [string()],
-
- %% For choosing between contracts or comments
- contracts = true :: boolean(),
-
- %% Any file in 'final_files' is compilable.
- %% And we need to keep it as {FileName,ModuleName}
- %% in case filename does NOT match with moduleName
- final_files = [] :: [{string(), atom()}],
-
- ex_func = typer_map:new() :: dict(),
- record = typer_map:new() :: dict(),
-
- %% Functions: the line number of the function
- %% should be kept as well
- func = typer_map:new() :: dict(),
- inc_func = typer_map:new() :: dict(),
- trust_plt = dialyzer_plt:new() :: dialyzer_plt:plt()}).
-
--record(args,
- {analyze = [] :: [string()],
- analyzed_dir_r = [] :: [string()],
- trust = [] :: [string()]}).
diff --git a/lib/typer/src/typer_annotator.erl b/lib/typer/src/typer_annotator.erl
deleted file mode 100644
index 68a8f03a5c..0000000000
--- a/lib/typer/src/typer_annotator.erl
+++ /dev/null
@@ -1,384 +0,0 @@
-%% -*- erlang-indent-level: 2 -*-
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2008-2010. 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%
-%%
-%%============================================================================
-%% File : typer_annotator.erl
-%% Author : Bingwen He <[email protected]>
-%% Description :
-%% If file 'FILENAME' has been analyzed, then the output of
-%% command "diff -B FILENAME.erl typer_ann/FILENAME.ann.erl"
-%% should be exactly what TypEr has added, namely type info.
-%%============================================================================
-
--module(typer_annotator).
-
--export([annotate/1]).
-
-%%----------------------------------------------------------------------------
-
--include("typer.hrl").
-
-%%----------------------------------------------------------------------------
-
--define(TYPER_ANN_DIR, "typer_ann").
-
--type func_info() :: {non_neg_integer(), atom(), arity()}.
-
--record(info, {recMap = typer_map:new() :: dict(),
- funcs = [] :: [func_info()],
- typeMap :: dict(),
- contracts :: boolean()}).
--record(inc, {map = typer_map:new() :: dict(),
- filter = [] :: [string()]}).
-
-%%----------------------------------------------------------------------------
-
--spec annotate(#typer_analysis{}) -> 'ok'.
-
-annotate(Analysis) ->
- case Analysis#typer_analysis.mode of
- ?SHOW -> show(Analysis);
- ?SHOW_EXPORTED -> show(Analysis);
- ?ANNOTATE ->
- Fun = fun({File, Module}) ->
- Info = get_final_info(File, Module, Analysis),
- write_typed_file(File, Info)
- end,
- lists:foreach(Fun, Analysis#typer_analysis.final_files);
- ?ANNOTATE_INC_FILES ->
- IncInfo = write_and_collect_inc_info(Analysis),
- write_inc_files(IncInfo)
- end.
-
-write_and_collect_inc_info(Analysis) ->
- Fun = fun({File, Module}, Inc) ->
- Info = get_final_info(File, Module, Analysis),
- write_typed_file(File, Info),
- IncFuns = get_functions(File, Analysis),
- collect_imported_funcs(IncFuns, Info#info.typeMap, Inc)
- end,
- NewInc = lists:foldl(Fun,#inc{}, Analysis#typer_analysis.final_files),
- clean_inc(NewInc).
-
-write_inc_files(Inc) ->
- Fun =
- fun (File) ->
- Val = typer_map:lookup(File,Inc#inc.map),
- %% Val is function with its type info
- %% in form [{{Line,F,A},Type}]
- Functions = [Key || {Key,_} <- Val],
- Val1 = [{{F,A},Type} || {{_Line,F,A},Type} <- Val],
- Info = #info{typeMap = typer_map:from_list(Val1),
- recMap = typer_map:new(),
- %% Note we need to sort functions here!
- funcs = lists:keysort(1, Functions)},
- %% io:format("TypeMap ~p\n", [Info#info.typeMap]),
- %% io:format("Funcs ~p\n", [Info#info.funcs]),
- %% io:format("RecMap ~p\n", [Info#info.recMap]),
- write_typed_file(File, Info)
- end,
- lists:foreach(Fun, dict:fetch_keys(Inc#inc.map)).
-
-show(Analysis) ->
- Fun = fun({File, Module}) ->
- Info = get_final_info(File, Module, Analysis),
- show_type_info_only(File, Info)
- end,
- lists:foreach(Fun, Analysis#typer_analysis.final_files).
-
-get_final_info(File, Module, Analysis) ->
- RecMap = get_recMap(File, Analysis),
- TypeMap = get_typeMap(Module, Analysis,RecMap),
- Functions = get_functions(File, Analysis),
- Contracts = Analysis#typer_analysis.contracts,
- #info{recMap=RecMap, funcs=Functions, typeMap=TypeMap, contracts=Contracts}.
-
-collect_imported_funcs(Funcs, TypeMap, TmpInc) ->
- %% Coming from other sourses, including:
- %% FIXME: How to deal with yecc-generated file????
- %% --.yrl (yecc-generated file)???
- %% -- yeccpre.hrl (yecc-generated file)???
- %% -- other cases
- Fun = fun({File,_} = Obj, Inc) ->
- case is_yecc_file(File, Inc) of
- {yecc_generated, NewInc} -> NewInc;
- {not_yecc, NewInc} ->
- check_imported_funcs(Obj, NewInc, TypeMap)
- end
- end,
- lists:foldl(Fun, TmpInc, Funcs).
-
--spec is_yecc_file(string(), #inc{}) -> {'not_yecc', #inc{}}
- | {'yecc_generated', #inc{}}.
-is_yecc_file(File, Inc) ->
- case lists:member(File, Inc#inc.filter) of
- true -> {yecc_generated, Inc};
- false ->
- case filename:extension(File) of
- ".yrl" ->
- Rootname = filename:rootname(File, ".yrl"),
- Obj = Rootname ++ ".erl",
- case lists:member(Obj, Inc#inc.filter) of
- true -> {yecc_generated, Inc};
- false ->
- NewFilter = [Obj|Inc#inc.filter],
- NewInc = Inc#inc{filter = NewFilter},
- {yecc_generated, NewInc}
- end;
- _ ->
- case filename:basename(File) of
- "yeccpre.hrl" -> {yecc_generated, Inc};
- _ -> {not_yecc, Inc}
- end
- end
- end.
-
-check_imported_funcs({File, {Line, F, A}}, Inc, TypeMap) ->
- IncMap = Inc#inc.map,
- FA = {F, A},
- Type = get_type_info(FA, TypeMap),
- case typer_map:lookup(File, IncMap) of
- none -> %% File is not added. Add it
- Obj = {File,[{FA, {Line, Type}}]},
- NewMap = typer_map:insert(Obj, IncMap),
- Inc#inc{map = NewMap};
- Val -> %% File is already in. Check.
- case lists:keyfind(FA, 1, Val) of
- false ->
- %% Function is not in; add it
- Obj = {File, Val ++ [{FA, {Line, Type}}]},
- NewMap = typer_map:insert(Obj, IncMap),
- Inc#inc{map = NewMap};
- Type ->
- %% Function is in and with same type
- Inc;
- _ ->
- %% Function is in but with diff type
- inc_warning(FA, File),
- Elem = lists:keydelete(FA, 1, Val),
- NewMap = case Elem of
- [] ->
- typer_map:remove(File, IncMap);
- _ ->
- typer_map:insert({File, Elem}, IncMap)
- end,
- Inc#inc{map = NewMap}
- end
- end.
-
-inc_warning({F, A}, File) ->
- io:format(" ***Warning: Skip function ~p/~p ", [F, A]),
- io:format("in file ~p because of inconsistent type\n", [File]).
-
-clean_inc(Inc) ->
- Inc1 = remove_yecc_generated_file(Inc),
- normalize_obj(Inc1).
-
-remove_yecc_generated_file(TmpInc) ->
- Fun = fun(Key, Inc) ->
- NewMap = typer_map:remove(Key, Inc#inc.map),
- Inc#inc{map = NewMap}
- end,
- lists:foldl(Fun, TmpInc, TmpInc#inc.filter).
-
-normalize_obj(TmpInc) ->
- Fun = fun(Key, Val, Inc) ->
- NewVal = [{{Line,F,A},Type} || {{F,A},{Line,Type}} <- Val],
- typer_map:insert({Key,NewVal}, Inc)
- end,
- NewMap = typer_map:fold(Fun, typer_map:new(), TmpInc#inc.map),
- TmpInc#inc{map = NewMap}.
-
-get_recMap(File, Analysis) ->
- typer_map:lookup(File, Analysis#typer_analysis.record).
-
-get_typeMap(Module, Analysis, RecMap) ->
- TypeInfoPlt = Analysis#typer_analysis.trust_plt,
- TypeInfo =
- case dialyzer_plt:lookup_module(TypeInfoPlt, Module) of
- none -> [];
- {value, List} -> List
- end,
- CodeServer = Analysis#typer_analysis.code_server,
- TypeInfoList = [get_type(I, CodeServer, RecMap) || I <- TypeInfo],
- typer_map:from_list(TypeInfoList).
-
-get_type({{M, F, A} = MFA, Range, Arg}, CodeServer, RecMap) ->
- case dialyzer_codeserver:lookup_mfa_contract(MFA, CodeServer) of
- error ->
- {{F, A}, {Range, Arg}};
- {ok, {_FileLine, Contract}} ->
- Sig = erl_types:t_fun(Arg, Range),
- case dialyzer_contracts:check_contract(Contract, Sig) of
- ok -> {{F, A}, {contract, Contract}};
- {error, {extra_range, _, _}} ->
- {{F, A}, {contract, Contract}};
- {error, invalid_contract} ->
- CString = dialyzer_contracts:contract_to_string(Contract),
- SigString = dialyzer_utils:format_sig(Sig, RecMap),
- typer:error(
- io_lib:format("Error in contract of function ~w:~w/~w\n"
- "\t The contract is: " ++ CString ++ "\n" ++
- "\t but the inferred signature is: ~s",
- [M, F, A, SigString]));
- {error, Msg} when is_list(Msg) -> % Msg is a string()
- typer:error(
- io_lib:format("Error in contract of function ~w:~w/~w: ~s",
- [M, F, A, Msg]))
- end
- end.
-
-get_functions(File, Analysis) ->
- case Analysis#typer_analysis.mode of
- ?SHOW ->
- Funcs = typer_map:lookup(File, Analysis#typer_analysis.func),
- Inc_Funcs = typer_map:lookup(File, Analysis#typer_analysis.inc_func),
- remove_module_info(Funcs) ++ normalize_incFuncs(Inc_Funcs);
- ?SHOW_EXPORTED ->
- Ex_Funcs = typer_map:lookup(File, Analysis#typer_analysis.ex_func),
- remove_module_info(Ex_Funcs);
- ?ANNOTATE ->
- Funcs = typer_map:lookup(File, Analysis#typer_analysis.func),
- remove_module_info(Funcs);
- ?ANNOTATE_INC_FILES ->
- typer_map:lookup(File, Analysis#typer_analysis.inc_func)
- end.
-
-normalize_incFuncs(Funcs) ->
- [FuncInfo || {_FileName, FuncInfo} <- Funcs].
-
--spec remove_module_info([func_info()]) -> [func_info()].
-
-remove_module_info(FuncInfoList) ->
- F = fun ({_,module_info,0}) -> false;
- ({_,module_info,1}) -> false;
- ({Line,F,A}) when is_integer(Line), is_atom(F), is_integer(A) -> true
- end,
- lists:filter(F, FuncInfoList).
-
-write_typed_file(File, Info) ->
- io:format(" Processing file: ~p\n", [File]),
- Dir = filename:dirname(File),
- RootName = filename:basename(filename:rootname(File)),
- Ext = filename:extension(File),
- TyperAnnDir = filename:join(Dir, ?TYPER_ANN_DIR),
- TmpNewFilename = lists:concat([RootName,".ann",Ext]),
- NewFileName = filename:join(TyperAnnDir, TmpNewFilename),
- case file:make_dir(TyperAnnDir) of
- {error, Reason} ->
- case Reason of
- eexist -> %% TypEr dir exists; remove old typer files
- ok = file:delete(NewFileName),
- write_typed_file(File, Info, NewFileName);
- enospc ->
- io:format(" Not enough space in ~p\n", [Dir]);
- eacces ->
- io:format(" No write permission in ~p\n", [Dir]);
- _ ->
- io:format("Unknown error when writing ~p\n", [Dir]),
- halt()
- end;
- ok -> %% Typer dir does NOT exist
- write_typed_file(File, Info, NewFileName)
- end.
-
-write_typed_file(File, Info, NewFileName) ->
- {ok, Binary} = file:read_file(File),
- Chars = binary_to_list(Binary),
- write_typed_file(Chars, NewFileName, Info, 1, []),
- io:format(" Saved as: ~p\n", [NewFileName]).
-
-write_typed_file(Chars, File, #info{funcs = []}, _LNo, _Acc) ->
- ok = file:write_file(File, list_to_binary(Chars), [append]);
-write_typed_file([Ch|Chs] = Chars, File, Info, LineNo, Acc) ->
- [{Line,F,A}|RestFuncs] = Info#info.funcs,
- case Line of
- 1 -> %% This will happen only for inc files
- ok = raw_write(F, A, Info, File, []),
- NewInfo = Info#info{funcs = RestFuncs},
- NewAcc = [],
- write_typed_file(Chars, File, NewInfo, Line, NewAcc);
- _ ->
- case Ch of
- 10 ->
- NewLineNo = LineNo + 1,
- {NewInfo, NewAcc} =
- case NewLineNo of
- Line ->
- ok = raw_write(F, A, Info, File, [Ch|Acc]),
- {Info#info{funcs = RestFuncs}, []};
- _ ->
- {Info, [Ch|Acc]}
- end,
- write_typed_file(Chs, File, NewInfo, NewLineNo, NewAcc);
- _ ->
- write_typed_file(Chs, File, Info, LineNo, [Ch|Acc])
- end
- end.
-
-raw_write(F, A, Info, File, Content) ->
- TypeInfo = get_type_string(F, A, Info, file),
- ContentList = lists:reverse(Content) ++ TypeInfo ++ "\n",
- ContentBin = list_to_binary(ContentList),
- file:write_file(File, ContentBin, [append]).
-
-get_type_string(F, A, Info, Mode) ->
- Type = get_type_info({F,A}, Info#info.typeMap),
- TypeStr =
- case Type of
- {contract, C} ->
- dialyzer_contracts:contract_to_string(C);
- {RetType, ArgType} ->
- dialyzer_utils:format_sig(erl_types:t_fun(ArgType, RetType),
- Info#info.recMap)
- end,
- case Info#info.contracts of
- true ->
- case {Mode, Type} of
- {file, {contract, _}} -> "";
- _ ->
- Prefix = lists:concat(["-spec ", F]),
- lists:concat([Prefix, TypeStr, "."])
- end;
- false ->
- Prefix = lists:concat(["%% @spec ", F]),
- lists:concat([Prefix, TypeStr, "."])
- end.
-
-show_type_info_only(File, Info) ->
- io:format("\n%% File: ~p\n%% ", [File]),
- OutputString = lists:concat(["~.", length(File)+8, "c~n"]),
- io:fwrite(OutputString, [$-]),
- Fun = fun ({_LineNo, F, A}) ->
- TypeInfo = get_type_string(F, A, Info, show),
- io:format("~s\n", [TypeInfo])
- end,
- lists:foreach(Fun, Info#info.funcs).
-
-get_type_info(Func, TypeMap) ->
- case typer_map:lookup(Func, TypeMap) of
- none ->
- %% Note: Typeinfo of any function should exist in
- %% the result offered by dialyzer, otherwise there
- %% *must* be something wrong with the analysis
- io:format("No type info for function: ~p\n", [Func]),
- halt();
- {contract, _Fun} = C -> C;
- {_RetType, _ArgType} = RA -> RA
- end.
diff --git a/lib/typer/src/typer_info.erl b/lib/typer/src/typer_info.erl
deleted file mode 100644
index ea25fa6f68..0000000000
--- a/lib/typer/src/typer_info.erl
+++ /dev/null
@@ -1,162 +0,0 @@
-%% -*- erlang-indent-level: 2 -*-
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2006-2009. 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(typer_info).
-
--export([collect/1]).
-
--type func_info() :: {non_neg_integer(), atom(), arity()}.
--type inc_file_info() :: {string(), func_info()}.
-
--record(tmpAcc, {file :: string(),
- module :: atom(),
- funcAcc=[] :: [func_info()],
- incFuncAcc=[] :: [inc_file_info()],
- dialyzerObj=[] :: [{mfa(), {_, _}}]}).
-
--include("typer.hrl").
-
--spec collect(#typer_analysis{}) -> #typer_analysis{}.
-
-collect(Analysis) ->
- NewPlt =
- try get_dialyzer_plt(Analysis) of
- DialyzerPlt ->
- dialyzer_plt:merge_plts([Analysis#typer_analysis.trust_plt, DialyzerPlt])
- catch
- throw:{dialyzer_error,_Reason} ->
- typer:error("Dialyzer's PLT is missing or is not up-to-date; please (re)create it")
- end,
- NewAnalysis = lists:foldl(fun collect_one_file_info/2,
- Analysis#typer_analysis{trust_plt = NewPlt},
- Analysis#typer_analysis.ana_files),
- %% Process Remote Types
- TmpCServer = NewAnalysis#typer_analysis.code_server,
- NewCServer =
- try
- NewRecords = dialyzer_codeserver:get_temp_records(TmpCServer),
- OldRecords = dialyzer_plt:get_types(NewPlt),
- MergedRecords = dialyzer_utils:merge_records(NewRecords, OldRecords),
- %% io:format("Merged Records ~p",[MergedRecords]),
- TmpCServer1 = dialyzer_codeserver:set_temp_records(MergedRecords, TmpCServer),
- TmpCServer2 = dialyzer_utils:process_record_remote_types(TmpCServer1),
- dialyzer_contracts:process_contract_remote_types(TmpCServer2)
- catch
- throw:{error, ErrorMsg} ->
- typer:error(ErrorMsg)
- end,
- NewAnalysis#typer_analysis{code_server = NewCServer}.
-
-collect_one_file_info(File, Analysis) ->
- Ds = [{d,Name,Val} || {Name,Val} <- Analysis#typer_analysis.macros],
- %% Current directory should also be included in "Includes".
- Includes = [filename:dirname(File)|Analysis#typer_analysis.includes],
- Is = [{i,Dir} || Dir <- Includes],
- Options = dialyzer_utils:src_compiler_opts() ++ Is ++ Ds,
- case dialyzer_utils:get_abstract_code_from_src(File, Options) of
- {error, Reason} ->
- %% io:format("File=~p\n,Options=~p\n,Error=~p\n", [File,Options,Reason]),
- typer:compile_error(Reason);
- {ok, AbstractCode} ->
- case dialyzer_utils:get_core_from_abstract_code(AbstractCode, Options) of
- error -> typer:compile_error(["Could not get core erlang for "++File]);
- {ok, Core} ->
- case dialyzer_utils:get_record_and_type_info(AbstractCode) of
- {error, Reason} -> typer:compile_error([Reason]);
- {ok, Records} ->
- Mod = list_to_atom(filename:basename(File, ".erl")),
- case dialyzer_utils:get_spec_info(Mod, AbstractCode, Records) of
- {error, Reason} -> typer:compile_error([Reason]);
- {ok, SpecInfo} ->
- analyze_core_tree(Core, Records, SpecInfo, Analysis, File)
- end
- end
- end
- end.
-
-analyze_core_tree(Core, Records, SpecInfo, Analysis, File) ->
- Module = list_to_atom(filename:basename(File, ".erl")),
- TmpTree = cerl:from_records(Core),
- CS1 = Analysis#typer_analysis.code_server,
- NextLabel = dialyzer_codeserver:get_next_core_label(CS1),
- {Tree, NewLabel} = cerl_trees:label(TmpTree, NextLabel),
- CS2 = dialyzer_codeserver:insert(Module, Tree, CS1),
- CS3 = dialyzer_codeserver:set_next_core_label(NewLabel, CS2),
- CS4 = dialyzer_codeserver:store_temp_records(Module, Records, CS3),
- CS5 = dialyzer_codeserver:store_temp_contracts(Module, SpecInfo, CS4),
- Ex_Funcs = [{0,F,A} || {_,_,{F,A}} <- cerl:module_exports(Tree)],
- TmpCG = Analysis#typer_analysis.callgraph,
- CG = dialyzer_callgraph:scan_core_tree(Tree, TmpCG),
- Fun = fun analyze_one_function/2,
- All_Defs = cerl:module_defs(Tree),
- Acc = lists:foldl(Fun, #tmpAcc{file=File, module=Module}, All_Defs),
- Exported_FuncMap = typer_map:insert({File, Ex_Funcs},
- Analysis#typer_analysis.ex_func),
- %% NOTE: we must sort all functions in the file which
- %% originate from this file by *numerical order* of lineNo
- Sorted_Functions = lists:keysort(1, Acc#tmpAcc.funcAcc),
- FuncMap = typer_map:insert({File, Sorted_Functions},
- Analysis#typer_analysis.func),
- %% NOTE: However we do not need to sort functions
- %% which are imported from included files.
- IncFuncMap = typer_map:insert({File, Acc#tmpAcc.incFuncAcc},
- Analysis#typer_analysis.inc_func),
- Final_Files = Analysis#typer_analysis.final_files ++ [{File, Module}],
- RecordMap = typer_map:insert({File, Records}, Analysis#typer_analysis.record),
- Analysis#typer_analysis{final_files=Final_Files,
- callgraph=CG,
- code_server=CS5,
- ex_func=Exported_FuncMap,
- inc_func=IncFuncMap,
- record=RecordMap,
- func=FuncMap}.
-
-analyze_one_function({Var, FunBody} = Function, Acc) ->
- F = cerl:fname_id(Var),
- A = cerl:fname_arity(Var),
- TmpDialyzerObj = {{Acc#tmpAcc.module, F, A}, Function},
- NewDialyzerObj = Acc#tmpAcc.dialyzerObj ++ [TmpDialyzerObj],
- [_, LineNo, {file, FileName}] = cerl:get_ann(FunBody),
- BaseName = filename:basename(FileName),
- FuncInfo = {LineNo, F, A},
- OriginalName = Acc#tmpAcc.file,
- {FuncAcc, IncFuncAcc} =
- case (FileName =:= OriginalName) orelse (BaseName =:= OriginalName) of
- true -> %% Coming from original file
- %% io:format("Added function ~p\n", [{LineNo, F, A}]),
- {Acc#tmpAcc.funcAcc ++ [FuncInfo], Acc#tmpAcc.incFuncAcc};
- false ->
- %% Coming from other sourses, including:
- %% -- .yrl (yecc-generated file)
- %% -- yeccpre.hrl (yecc-generated file)
- %% -- other cases
- {Acc#tmpAcc.funcAcc, Acc#tmpAcc.incFuncAcc ++ [{FileName, FuncInfo}]}
- end,
- Acc#tmpAcc{funcAcc = FuncAcc,
- incFuncAcc = IncFuncAcc,
- dialyzerObj = NewDialyzerObj}.
-
-get_dialyzer_plt(#typer_analysis{plt = PltFile0}) ->
- PltFile =
- case PltFile0 =:= none of
- true -> dialyzer_plt:get_default_plt();
- false -> PltFile0
- end,
- dialyzer_plt:from_file(PltFile).
diff --git a/lib/typer/src/typer_map.erl b/lib/typer/src/typer_map.erl
deleted file mode 100644
index bf62dea651..0000000000
--- a/lib/typer/src/typer_map.erl
+++ /dev/null
@@ -1,47 +0,0 @@
-%% -*- erlang-indent-level: 2 -*-
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2006-2009. 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(typer_map).
-
--export([new/0, insert/2, lookup/2, from_list/1, remove/2, fold/3]).
-
--spec new() -> dict().
-new() ->
- dict:new().
-
--spec insert({term(), term()}, dict()) -> dict().
-insert(Object, Dict) ->
- {Key, Value} = Object,
- dict:store(Key, Value, Dict).
-
--spec lookup(term(), dict()) -> any().
-lookup(Key, Dict) ->
- try dict:fetch(Key, Dict) catch error:_ -> none end.
-
--spec from_list([{term(), term()}]) -> dict().
-from_list(List) ->
- dict:from_list(List).
-
--spec remove(term(), dict()) -> dict().
-remove(Key, Dict) ->
- dict:erase(Key, Dict).
-
--spec fold(fun((term(), term(), term()) -> term()), term(), dict()) -> term().
-fold(Fun, Acc0, Dict) ->
- dict:fold(Fun, Acc0, Dict).
diff --git a/lib/typer/src/typer_options.erl b/lib/typer/src/typer_options.erl
deleted file mode 100644
index 1e53b1b305..0000000000
--- a/lib/typer/src/typer_options.erl
+++ /dev/null
@@ -1,191 +0,0 @@
-%% -*- erlang-indent-level: 2 -*-
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2006-2009. 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%
-%%
-%%===========================================================================
-%% File : typer_options.erl
-%% Author : Bingwen He <[email protected]>
-%% Description : Handles all command-line options given to TypEr
-%%===========================================================================
-
--module(typer_options).
-
--export([process/0]).
-
-%%---------------------------------------------------------------------------
-
--include("typer.hrl").
-
-%%---------------------------------------------------------------------------
-%% Exported functions
-%%---------------------------------------------------------------------------
-
--spec process() -> {#args{}, #typer_analysis{}}.
-
-process() ->
- ArgList = init:get_plain_arguments(),
- %% io:format("Args is ~p\n",[Args]),
- {Args, Analysis} = analyze_args(ArgList, #args{}, #typer_analysis{}),
- %% if the mode has not been set, set it to the default mode (show)
- {Args, case Analysis#typer_analysis.mode of
- undefined -> Analysis#typer_analysis{mode = ?SHOW};
- Mode when is_atom(Mode) -> Analysis
- end}.
-
-%%---------------------------------------------------------------------------
-%% Internal functions
-%%---------------------------------------------------------------------------
-
-analyze_args([], Args, Analysis) ->
- {Args, Analysis};
-analyze_args(ArgList, Args, Analysis) ->
- {Result, Rest} = cl(ArgList),
- {NewArgs, NewAnalysis} = analyze_result(Result, Args, Analysis),
- analyze_args(Rest, NewArgs, NewAnalysis).
-
-cl(["-h"|_]) -> help_message();
-cl(["--help"|_]) -> help_message();
-cl(["-v"|_]) -> version_message();
-cl(["--version"|_]) -> version_message();
-cl(["--comments"|Opts]) -> {comments, Opts};
-cl(["--show"|Opts]) -> {{mode, ?SHOW}, Opts};
-cl(["--show_exported"|Opts]) -> {{mode, ?SHOW_EXPORTED}, Opts};
-cl(["--show-exported"|Opts]) -> {{mode, ?SHOW_EXPORTED}, Opts};
-cl(["--annotate"|Opts]) -> {{mode, ?ANNOTATE}, Opts};
-cl(["--annotate-inc-files"|Opts]) -> {{mode, ?ANNOTATE_INC_FILES}, Opts};
-cl(["--plt",Plt|Opts]) -> {{plt, Plt}, Opts};
-cl(["-D"++Def|Opts]) ->
- case Def of
- "" -> typer:error("no variable name specified after -D");
- _ ->
- L = re:split(Def, "=", [{return, list}]),
- DefPair = process_def_list(L),
- {{def, DefPair}, Opts}
- end;
-cl(["-I",Dir|Opts]) -> {{inc,Dir}, Opts};
-cl(["-I"++Dir|Opts]) ->
- case Dir of
- "" -> typer:error("no include directory specified after -I");
- _ -> {{inc, Dir}, Opts}
- end;
-cl(["-T"|Opts]) ->
- {Files, RestOpts} = dialyzer_cl_parse:collect_args(Opts),
- case Files of
- [] -> typer:error("no file or directory specified after -T");
- [_|_] -> {{trust, Files}, RestOpts}
- end;
-cl(["-r"|Opts]) ->
- {Files, RestOpts} = dialyzer_cl_parse:collect_args(Opts),
- {{a_dir_r, Files}, RestOpts};
-cl(["-"++H|_]) -> typer:error("unknown option -"++H);
-cl(Opts) ->
- {Args, RestOpts} = dialyzer_cl_parse:collect_args(Opts),
- {{analyze, Args}, RestOpts}.
-
-process_def_list(L) ->
- case L of
- [Name, Value] ->
- {ok, Tokens, _} = erl_scan:string(Value ++ "."),
- {ok, ErlValue} = erl_parse:parse_term(Tokens),
- {list_to_atom(Name), ErlValue};
- [Name] ->
- {list_to_atom(Name), true}
- end.
-
-%% Get information about files that the user trusts and wants to analyze
-analyze_result({analyze, Val}, Args, Analysis) ->
- NewVal = Args#args.analyze ++ Val,
- {Args#args{analyze = NewVal}, Analysis};
-analyze_result({a_dir_r, Val}, Args, Analysis) ->
- NewVal = Args#args.analyzed_dir_r ++ Val,
- {Args#args{analyzed_dir_r = NewVal}, Analysis};
-analyze_result({trust, Val}, Args, Analysis) ->
- NewVal = Args#args.trust ++ Val,
- {Args#args{trust = NewVal}, Analysis};
-analyze_result(comments, Args, Analysis) ->
- {Args, Analysis#typer_analysis{contracts = false}};
-%% Get useful information for actual analysis
-analyze_result({mode, Val}, Args, Analysis) ->
- case Analysis#typer_analysis.mode of
- undefined -> {Args, Analysis#typer_analysis{mode = Val}};
- _ -> mode_error()
- end;
-analyze_result({def, Val}, Args, Analysis) ->
- NewVal = Analysis#typer_analysis.macros ++ [Val],
- {Args, Analysis#typer_analysis{macros = NewVal}};
-analyze_result({inc, Val}, Args, Analysis) ->
- NewVal = Analysis#typer_analysis.includes ++ [Val],
- {Args, Analysis#typer_analysis{includes = NewVal}};
-analyze_result({plt, Plt}, Args, Analysis) ->
- {Args, Analysis#typer_analysis{plt = Plt}}.
-
-%%--------------------------------------------------------------------
-
--spec mode_error() -> no_return().
-mode_error() ->
- typer:error("can not do \"show\", \"show-exported\", \"annotate\", and \"annotate-inc-files\" at the same time").
-
--spec version_message() -> no_return().
-version_message() ->
- io:format("TypEr version "++?VSN++"\n"),
- erlang:halt(0).
-
--spec help_message() -> no_return().
-help_message() ->
- S = " Usage: typer [--help] [--version] [--comments] [--plt PLT]
- [--show | --show-exported | --annotate | --annotate-inc-files]
- [-Ddefine]* [-I include_dir]* [-T application]* [-r] file*
-
- Options:
- -r dir*
- search directories recursively for .erl files below them
- --show
- Prints type specifications for all functions on stdout.
- (this is the default behaviour; this option is not really needed)
- --show-exported (or --show_exported)
- Same as --show, but prints specifications for exported functions only
- Specs are displayed sorted alphabetically on the function's name
- --annotate
- Annotates the specified files with type specifications
- --annotate-inc-files
- Same as --annotate but annotates all -include() files as well as
- all .erl files (use this option with caution - has not been tested much)
- --comments
- Prints type information using Edoc comments, not type specs
- --plt PLT
- Use the specified dialyzer PLT file rather than the default one
- -T file*
- The specified file(s) already contain type specifications and these
- are to be trusted in order to print specs for the rest of the files
- (Multiple files or dirs, separated by spaces, can be specified.)
- -Dname (or -Dname=value)
- pass the defined name(s) to TypEr
- (The syntax of defines is the same as that used by \"erlc\".)
- -I include_dir
- pass the include_dir to TypEr
- (The syntax of includes is the same as that used by \"erlc\".)
- --version (or -v)
- prints the Typer version and exits
- --help (or -h)
- prints this message and exits
-
- Note:
- * denotes that multiple occurrences of these options are possible.
-",
- io:put_chars(S),
- erlang:halt(0).
diff --git a/lib/typer/src/typer_preprocess.erl b/lib/typer/src/typer_preprocess.erl
deleted file mode 100644
index 7cb0b9932b..0000000000
--- a/lib/typer/src/typer_preprocess.erl
+++ /dev/null
@@ -1,154 +0,0 @@
-%% -*- erlang-indent-level: 2 -*-
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2006-2009. 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(typer_preprocess).
-
--export([get_all_files/2]).
-
--include("typer.hrl").
-
-%%----------------------------------------------------------------------------
-
--spec get_all_files(#args{}, 'analysis' | 'trust') -> [string()].
-
-get_all_files(Args, analysis) ->
- case internal_get_all_files(Args#args.analyze,
- Args#args.analyzed_dir_r,
- fun test_erl_file_exclude_ann/1) of
- [] -> typer:error("no file(s) to analyze");
- AllFiles -> AllFiles
- end;
-get_all_files(Args, trust) ->
- internal_get_all_files(Args#args.trust, [], fun test_erl_file/1).
-
--spec test_erl_file_exclude_ann(string()) -> boolean().
-
-test_erl_file_exclude_ann(File) ->
- case filename:extension(File) of
- ".erl" -> %% Exclude files ending with ".ann.erl"
- case re:run(File, "[\.]ann[\.]erl$") of
- {match, _} -> false;
- nomatch -> true
- end;
- _ -> false
- end.
-
--spec test_erl_file(string()) -> boolean().
-
-test_erl_file(File) ->
- filename:extension(File) =:= ".erl".
-
--spec internal_get_all_files([string()], [string()],
- fun((string()) -> boolean())) -> [string()].
-
-internal_get_all_files(File_Dir, Dir_R, Fun) ->
- All_File_1 = process_file_and_dir(File_Dir, Fun),
- All_File_2 = process_dir_recursively(Dir_R, Fun),
- remove_dup(All_File_1 ++ All_File_2).
-
--spec process_file_and_dir([string()],
- fun((string()) -> boolean())) -> [string()].
-
-process_file_and_dir(File_Dir, TestFun) ->
- Fun =
- fun (Elem, Acc) ->
- case filelib:is_regular(Elem) of
- true -> process_file(Elem, TestFun, Acc);
- false -> check_dir(Elem, non_recursive, Acc, TestFun)
- end
- end,
- lists:foldl(Fun, [], File_Dir).
-
--spec process_dir_recursively([string()],
- fun((string()) -> boolean())) -> [string()].
-
-process_dir_recursively(Dirs, TestFun) ->
- Fun = fun (Dir, Acc) ->
- check_dir(Dir, recursive, Acc, TestFun)
- end,
- lists:foldl(Fun, [], Dirs).
-
--spec check_dir(string(),
- 'non_recursive' | 'recursive',
- [string()],
- fun((string()) -> boolean())) -> [string()].
-
-check_dir(Dir, Mode, Acc, Fun) ->
- case file:list_dir(Dir) of
- {ok, Files} ->
- {TmpDirs, TmpFiles} = split_dirs_and_files(Files, Dir),
- case Mode of
- non_recursive ->
- FinalFiles = process_file_and_dir(TmpFiles, Fun),
- Acc ++ FinalFiles;
- recursive ->
- TmpAcc1 = process_file_and_dir(TmpFiles, Fun),
- TmpAcc2 = process_dir_recursively(TmpDirs, Fun),
- Acc ++ TmpAcc1 ++ TmpAcc2
- end;
- {error, eacces} ->
- typer:error("no access permission to dir \""++Dir++"\"");
- {error, enoent} ->
- typer:error("cannot access "++Dir++": No such file or directory");
- {error, _Reason} ->
- typer:error("error involving a use of file:list_dir/1")
- end.
-
-%% Same order as the input list
--spec process_file(string(), fun((string()) -> boolean()), string()) -> [string()].
-
-process_file(File, TestFun, Acc) ->
- case TestFun(File) of
- true -> Acc ++ [File];
- false -> Acc
- end.
-
-%% Same order as the input list
--spec split_dirs_and_files([string()], string()) -> {[string()], [string()]}.
-
-split_dirs_and_files(Elems, Dir) ->
- Test_Fun =
- fun (Elem, {DirAcc, FileAcc}) ->
- File = filename:join(Dir, Elem),
- case filelib:is_regular(File) of
- false -> {[File|DirAcc], FileAcc};
- true -> {DirAcc, [File|FileAcc]}
- end
- end,
- {Dirs, Files} = lists:foldl(Test_Fun, {[], []}, Elems),
- {lists:reverse(Dirs), lists:reverse(Files)}.
-
-%%-----------------------------------------------------------------------
-%% Utilities
-%%-----------------------------------------------------------------------
-
-%% Removes duplicate filenames but it keeps the order of the input list
-
--spec remove_dup([string()]) -> [string()].
-
-remove_dup(Files) ->
- Test_Dup = fun (File, Acc) ->
- case lists:member(File, Acc) of
- true -> Acc;
- false -> [File|Acc]
- end
- end,
- Reversed_Elems = lists:foldl(Test_Dup, [], Files),
- lists:reverse(Reversed_Elems).
diff --git a/lib/typer/vsn.mk b/lib/typer/vsn.mk
index 7f4aabb335..51561939ac 100644
--- a/lib/typer/vsn.mk
+++ b/lib/typer/vsn.mk
@@ -1 +1 @@
-TYPER_VSN = 0.1.7.5
+TYPER_VSN = 0.9
diff --git a/lib/webtool/doc/src/notes_history.xml b/lib/webtool/doc/src/notes_history.xml
index edab54d61f..a72a85412d 100644
--- a/lib/webtool/doc/src/notes_history.xml
+++ b/lib/webtool/doc/src/notes_history.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2006</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/webtool/doc/src/part_notes_history.xml b/lib/webtool/doc/src/part_notes_history.xml
index c1f6f846f5..76db9b7d9a 100644
--- a/lib/webtool/doc/src/part_notes_history.xml
+++ b/lib/webtool/doc/src/part_notes_history.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2006</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/webtool/doc/src/webtool.xml b/lib/webtool/doc/src/webtool.xml
index 55bac8bd34..bbb25d29bd 100644
--- a/lib/webtool/doc/src/webtool.xml
+++ b/lib/webtool/doc/src/webtool.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2001</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/webtool/doc/src/webtool_chapter.xml b/lib/webtool/doc/src/webtool_chapter.xml
index f72a255b0a..305fbcb8ee 100644
--- a/lib/webtool/doc/src/webtool_chapter.xml
+++ b/lib/webtool/doc/src/webtool_chapter.xml
@@ -151,7 +151,7 @@
http://Servername:Port/ErlScriptAlias/Mod/Func<?QueryString> ]]></code>
<p>An <c>alias</c> parameter in the configuration function can be
an ErlScriptAlias as used in the above URL. The definition of
- an ErlScripAlias shall be like this:</p>
+ an ErlScriptAlias shall be like this:</p>
<p><c>{alias,{erl_alias,Path,[Modules]}}</c>, e.g.</p>
<p><c>{alias,{erl_alias,"/testtool",[helloworld]}}</c></p>
<p>The following URL will then cause a call to the function
@@ -184,7 +184,7 @@ http://Servername:Port/ErlScriptAlias/Mod/Func<?QueryString> ]]></code>
directory <c>/usr/local/otp/lib/myapp-1.0/priv</c>:</p>
<p><c>{alias,{"/mytool_home","/usr/local/otp/lib/myapp-1.0/priv"}}</c></p>
<p>See the INETS documentation, especially the module
- <c>mod_esi</c>, for a more in depht coverage of Erl Scheme.</p>
+ <c>mod_esi</c>, for a more in depth coverage of the Erl Scheme.</p>
</section>
<section>
diff --git a/lib/wx/c_src/wxe_driver.c b/lib/wx/c_src/wxe_driver.c
index 310325ea26..2404b13cc3 100644
--- a/lib/wx/c_src/wxe_driver.c
+++ b/lib/wx/c_src/wxe_driver.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2008-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2008-2011. 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
@@ -117,8 +117,7 @@ wxe_driver_start(ErlDrvPort port, char *buff)
if(WXE_DRV_PORT == 0) {
for(; *buff != 32; buff++);
buff++;
- erl_wx_privdir = malloc(strlen(buff));
- strcpy(erl_wx_privdir, buff);
+ erl_wx_privdir = strdup(buff);
WXE_DRV_PORT = port;
wxe_master = data;
@@ -146,7 +145,6 @@ static void
wxe_driver_unload(void)
{
// fprintf(stderr, "%s:%d: UNLOAD \r\n", __FILE__,__LINE__);
- meta_command(WXE_SHUTDOWN, wxe_master);
stop_native_gui(wxe_master);
unload_native_gui();
free(wxe_master);
diff --git a/lib/wx/c_src/wxe_impl.cpp b/lib/wx/c_src/wxe_impl.cpp
index 79d1a29519..365fb691a1 100644
--- a/lib/wx/c_src/wxe_impl.cpp
+++ b/lib/wx/c_src/wxe_impl.cpp
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2008-2010. All Rights Reserved.
+ * Copyright Ericsson AB 2008-2011. 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
@@ -78,6 +78,21 @@ extern void erts_thread_disable_fpe(void);
}
#endif
+#if defined(__APPLE__) && defined(__MACH__) && !defined(__DARWIN__)
+#define __DARWIN__ 1
+#endif
+
+#ifdef __DARWIN__
+extern "C" {
+ int erl_drv_stolen_main_thread_join(ErlDrvTid tid, void **respp);
+ int erl_drv_steal_main_thread(char *name,
+ ErlDrvTid *dtid,
+ void* (*func)(void*),
+ void* arg,
+ ErlDrvThreadOpts *opts);
+}
+#endif
+
void *wxe_main_loop(void * );
/* ************************************************************
@@ -99,8 +114,14 @@ int start_native_gui(wxe_data *sd)
wxe_batch_locker_c = erl_drv_cond_create((char *)"wxe_batch_locker_c");
init_caller = driver_connected(sd->port);
- if((res = erl_drv_thread_create((char *)"wxwidgets",
- &wxe_thread,wxe_main_loop,(void *) sd->pdl,NULL)) == 0) {
+#ifdef __DARWIN__
+ res = erl_drv_steal_main_thread((char *)"wxwidgets",
+ &wxe_thread,wxe_main_loop,(void *) sd->pdl,NULL);
+#else
+ res = erl_drv_thread_create((char *)"wxwidgets",
+ &wxe_thread,wxe_main_loop,(void *) sd->pdl,NULL);
+#endif
+ if(res == 0) {
erl_drv_mutex_lock(wxe_status_m);
for(;wxe_status == WXE_NOT_INITIATED;) {
erl_drv_cond_wait(wxe_status_c, wxe_status_m);
@@ -117,7 +138,14 @@ int start_native_gui(wxe_data *sd)
void stop_native_gui(wxe_data *sd)
{
+ if(wxe_status == WXE_INITIATED) {
+ meta_command(WXE_SHUTDOWN, sd);
+ }
+#ifdef __DARWIN__
+ erl_drv_stolen_main_thread_join(wxe_thread, NULL);
+#else
erl_drv_thread_join(wxe_thread, NULL);
+#endif
erl_drv_mutex_destroy(wxe_status_m);
erl_drv_cond_destroy(wxe_status_c);
erl_drv_mutex_destroy(wxe_batch_locker_m);
@@ -182,8 +210,8 @@ void *wxe_main_loop(void *vpdl)
{
int result;
int argc = 1;
- char * temp = (char *) "Erlang\0";
- char ** argv = &temp;
+ char * temp = (char *) "Erlang";
+ char * argv[] = {temp,NULL};
ErlDrvPDL pdl = (ErlDrvPDL) vpdl;
driver_pdl_inc_refc(pdl);
@@ -202,7 +230,9 @@ void *wxe_main_loop(void *vpdl)
/* We are done try to make a clean exit */
wxe_status = WXE_EXITED;
driver_pdl_dec_refc(pdl);
+#ifndef __DARWIN__
erl_drv_thread_exit(NULL);
+#endif
return NULL;
} else {
erl_drv_mutex_lock(wxe_status_m);
diff --git a/lib/wx/c_src/wxe_ps_init.c b/lib/wx/c_src/wxe_ps_init.c
index e787c214bd..a85f751024 100644
--- a/lib/wx/c_src/wxe_ps_init.c
+++ b/lib/wx/c_src/wxe_ps_init.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2008-2009. All Rights Reserved.
+ * Copyright Ericsson AB 2008-2011. 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
diff --git a/lib/wx/doc/src/notes.xml b/lib/wx/doc/src/notes.xml
index 1493501ea4..3d27cf671b 100644
--- a/lib/wx/doc/src/notes.xml
+++ b/lib/wx/doc/src/notes.xml
@@ -31,6 +31,31 @@
<p>This document describes the changes made to the wxErlang
application.</p>
+<section><title>Wx 0.98.9</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>Wx crashed if graphics could not be initiated, for
+ instance if DISPLAY was not available.</p> <p>Wx could
+ crash during startup, thanks Boris Muhmer for extra
+ ordinary testing.</p>
+ <p>
+ Own Id: OTP-9080</p>
+ </item>
+ <item>
+ <p>
+ Wx on MacOS X generated complains on stderr about certain
+ cocoa functions not beeing called from the "Main thread".
+ This is now corrected.</p>
+ <p>
+ Own Id: OTP-9081</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Wx 0.98.8</title>
<section><title>Improvements and New Features</title>
diff --git a/lib/wx/src/wxe_master.erl b/lib/wx/src/wxe_master.erl
index d8592c133b..9efe59054c 100644
--- a/lib/wx/src/wxe_master.erl
+++ b/lib/wx/src/wxe_master.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -128,19 +128,19 @@ init([]) ->
process_flag(trap_exit, true),
DriverWithArgs = DriverName ++ " " ++ code:priv_dir(wx) ++ [0],
- case catch open_port({spawn, DriverWithArgs},[binary]) of
- {'EXIT', Err} ->
- erlang:error({open_port,Err});
- Port ->
- wx_debug_info = ets:new(wx_debug_info, [named_table]),
- wx_non_consts = ets:new(wx_non_consts, [named_table]),
- true = ets:insert(wx_debug_info, wxdebug_table()),
- spawn_link(fun() -> debug_ping(Port) end),
- receive
- {wx_consts, List} ->
- true = ets:insert(wx_non_consts, List)
- end,
- {ok, #state{cb_port=Port, driver=DriverName, users=gb_sets:empty()}}
+ try
+ Port = open_port({spawn, DriverWithArgs},[binary]),
+ wx_debug_info = ets:new(wx_debug_info, [named_table]),
+ wx_non_consts = ets:new(wx_non_consts, [named_table]),
+ true = ets:insert(wx_debug_info, wxdebug_table()),
+ spawn_link(fun() -> debug_ping(Port) end),
+ receive
+ {wx_consts, List} ->
+ true = ets:insert(wx_non_consts, List)
+ end,
+ {ok, #state{cb_port=Port, driver=DriverName, users=gb_sets:empty()}}
+ catch _:Err ->
+ error({Err, "Could not initiate graphics"})
end.
%%--------------------------------------------------------------------
diff --git a/lib/wx/test/Makefile b/lib/wx/test/Makefile
index dfec4bb695..cf51d7918f 100644
--- a/lib/wx/test/Makefile
+++ b/lib/wx/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2008-2010. All Rights Reserved.
+# Copyright Ericsson AB 2008-2011. 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
@@ -62,7 +62,7 @@ release_spec:
release_tests_spec: opt
$(INSTALL_DIR) $(RELSYSDIR)
- $(INSTALL_DATA) wx.spec wx_test_lib.hrl $(ErlSrc) $(ErlTargets) $(RELSYSDIR)
+ $(INSTALL_DATA) wx.spec wx.cover wx_test_lib.hrl $(ErlSrc) $(ErlTargets) $(RELSYSDIR)
$(INSTALL_SCRIPT) wxt $(RELSYSDIR)
release_docs_spec:
diff --git a/lib/wx/test/wx.cover b/lib/wx/test/wx.cover
new file mode 100644
index 0000000000..47e162ba7d
--- /dev/null
+++ b/lib/wx/test/wx.cover
@@ -0,0 +1,2 @@
+{incl_app,wx,details}.
+
diff --git a/lib/wx/test/wx.spec b/lib/wx/test/wx.spec
index a9201e5737..21e4a8c064 100644
--- a/lib/wx/test/wx.spec
+++ b/lib/wx/test/wx.spec
@@ -1,2 +1 @@
-{topcase, {dir, "../wx_test"}}.
-
+{suites,"../wx_test",all}.
diff --git a/lib/wx/test/wx_app_SUITE.erl b/lib/wx/test/wx_app_SUITE.erl
index 8fff324913..162923eaa3 100644
--- a/lib/wx/test/wx_app_SUITE.erl
+++ b/lib/wx/test/wx_app_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2011. 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
@@ -45,22 +45,28 @@ init_per_testcase(Case, Config0) ->
end_per_testcase(Func,Config) ->
wx_test_lib:end_per_testcase(Func, Config).
-fin_per_testcase(Case, Config) ->
- wx_test_lib:end_per_testcase(Case, Config).
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-all() ->
- all(suite).
-
-all(suite) ->
- [
- fields,
- modules,
- exportall,
- app_depend,
- undef_funcs
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [fields, modules, exportall, app_depend, undef_funcs].
+
+groups() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/wx/test/wx_basic_SUITE.erl b/lib/wx/test/wx_basic_SUITE.erl
index 599aa371ba..9ad34248a9 100644
--- a/lib/wx/test/wx_basic_SUITE.erl
+++ b/lib/wx/test/wx_basic_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -23,8 +23,9 @@
%%% Created : 3 Nov 2008 by Dan Gudmundsson <[email protected]>
%%%-------------------------------------------------------------------
-module(wx_basic_SUITE).
--export([all/0, init_per_suite/1, end_per_suite/1,
- init_per_testcase/2, fin_per_testcase/2, end_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_suite/1, end_per_suite/1,
+ init_per_testcase/2, end_per_testcase/2]).
-compile(export_all).
@@ -41,20 +42,23 @@ init_per_testcase(Func,Config) ->
wx_test_lib:init_per_testcase(Func,Config).
end_per_testcase(Func,Config) ->
wx_test_lib:end_per_testcase(Func,Config).
-fin_per_testcase(Func,Config) -> %% For test_server
- wx_test_lib:end_per_testcase(Func,Config).
%% SUITE specification
-all() ->
- all(suite).
-all(suite) ->
- [
- create_window,
- several_apps,
- wx_api,
- wx_misc,
- data_types
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [create_window, several_apps, wx_api, wx_misc,
+ data_types].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% The test cases
diff --git a/lib/wx/test/wx_class_SUITE.erl b/lib/wx/test/wx_class_SUITE.erl
index 7b8d510d40..79e6833e9b 100644
--- a/lib/wx/test/wx_class_SUITE.erl
+++ b/lib/wx/test/wx_class_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -24,8 +24,9 @@
%%%-------------------------------------------------------------------
-module(wx_class_SUITE).
--export([all/0, init_per_suite/1, end_per_suite/1,
- init_per_testcase/2, fin_per_testcase/2, end_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_suite/1, end_per_suite/1,
+ init_per_testcase/2, end_per_testcase/2]).
-compile(export_all).
@@ -42,25 +43,23 @@ init_per_testcase(Func,Config) ->
wx_test_lib:init_per_testcase(Func,Config).
end_per_testcase(Func,Config) ->
wx_test_lib:end_per_testcase(Func,Config).
-fin_per_testcase(Func,Config) -> %% For test_server
- wx_test_lib:end_per_testcase(Func,Config).
%% SUITE specification
-all() ->
- all(suite).
-all(suite) ->
- [
- calendarCtrl,
- treeCtrl,
- notebook,
- staticBoxSizer,
- clipboard,
- helpFrame,
- htmlWindow,
- listCtrlSort,
- radioBox,
- systemSettings
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [calendarCtrl, treeCtrl, notebook, staticBoxSizer,
+ clipboard, helpFrame, htmlWindow, listCtrlSort,
+ radioBox, systemSettings].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
%% The test cases
diff --git a/lib/wx/test/wx_event_SUITE.erl b/lib/wx/test/wx_event_SUITE.erl
index dea10d892e..0d8dd4852e 100644
--- a/lib/wx/test/wx_event_SUITE.erl
+++ b/lib/wx/test/wx_event_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -22,8 +22,9 @@
%%% Created : 3 Nov 2008 by Dan Gudmundsson <[email protected]>
%%%-------------------------------------------------------------------
-module(wx_event_SUITE).
--export([all/0, init_per_suite/1, end_per_suite/1,
- init_per_testcase/2, fin_per_testcase/2, end_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_suite/1, end_per_suite/1,
+ init_per_testcase/2, end_per_testcase/2]).
-compile(export_all).
@@ -40,22 +41,23 @@ init_per_testcase(Func,Config) ->
wx_test_lib:init_per_testcase(Func,Config).
end_per_testcase(Func,Config) ->
wx_test_lib:end_per_testcase(Func,Config).
-fin_per_testcase(Func,Config) -> %% For test_server
- wx_test_lib:end_per_testcase(Func,Config).
%% SUITE specification
-all() ->
- all(suite).
-all(suite) ->
- [
- connect,
- disconnect,
- connect_msg_20,
- connect_cb_20,
- mouse_on_grid,
- spin_event,
- connect_in_callback
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [connect, disconnect, connect_msg_20, connect_cb_20,
+ mouse_on_grid, spin_event, connect_in_callback].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% The test cases
diff --git a/lib/wx/test/wx_opengl_SUITE.erl b/lib/wx/test/wx_opengl_SUITE.erl
index 778d089bce..e8fdf603d6 100644
--- a/lib/wx/test/wx_opengl_SUITE.erl
+++ b/lib/wx/test/wx_opengl_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -22,8 +22,9 @@
%%% Created : 3 Nov 2008 by Dan Gudmundsson <[email protected]>
%%%-------------------------------------------------------------------
-module(wx_opengl_SUITE).
--export([all/0, init_per_suite/1, end_per_suite/1,
- init_per_testcase/2, fin_per_testcase/2, end_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_suite/1, end_per_suite/1,
+ init_per_testcase/2, end_per_testcase/2]).
-compile(export_all).
@@ -48,18 +49,23 @@ init_per_testcase(Func,Config) ->
wx_test_lib:init_per_testcase(Func,Config).
end_per_testcase(Func,Config) ->
wx_test_lib:end_per_testcase(Func,Config).
-fin_per_testcase(Func,Config) -> %% For test_server
- wx_test_lib:end_per_testcase(Func,Config).
%% SUITE specification
-all() ->
- all(suite).
-all(suite) ->
- [
- canvas,
- glu_tesselation
- ].
-
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [canvas, glu_tesselation].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
%% The test cases
-define(VS, {{ 0.5, 0.5, -0.5}, %1
diff --git a/lib/wx/test/wx_test_lib.erl b/lib/wx/test/wx_test_lib.erl
index 9368aa4bdc..8509d6be6f 100644
--- a/lib/wx/test/wx_test_lib.erl
+++ b/lib/wx/test/wx_test_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2010. 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
@@ -35,7 +35,7 @@ init_per_suite(Config) ->
exit("Can not test on MacOSX");
{unix, _} ->
io:format("DISPLAY ~s~n", [os:getenv("DISPLAY")]),
- case proplists:get_value(xserver, Config, none) of
+ case ct:get_config(xserver, none) of
none -> ignore;
Server ->
os:putenv("DISPLAY", Server)
@@ -200,7 +200,7 @@ eval_test_case(Mod, Fun, Config) ->
test_case_evaluator(Mod, Fun, [Config]) ->
NewConfig = Mod:init_per_testcase(Fun, Config),
R = apply(Mod, Fun, [NewConfig]),
- Mod:fin_per_testcase(Fun, NewConfig),
+ Mod:end_per_testcase(Fun, NewConfig),
exit({test_case_ok, R}).
wait_for_evaluator(Pid, Mod, Fun, Config) ->
@@ -216,12 +216,12 @@ wait_for_evaluator(Pid, Mod, Fun, Config) ->
{'EXIT', Pid, {skipped, Reason}} ->
log("<WARNING> Test case ~w skipped, because ~p~n",
[{Mod, Fun}, Reason]),
- Mod:fin_per_testcase(Fun, Config),
+ Mod:end_per_testcase(Fun, Config),
{skip, {Mod, Fun}, Reason};
{'EXIT', Pid, Reason} ->
log("<ERROR> Eval process ~w exited, because ~p~n",
[{Mod, Fun}, Reason]),
- Mod:fin_per_testcase(Fun, Config),
+ Mod:end_per_testcase(Fun, Config),
{crash, {Mod, Fun}, Reason}
end.
diff --git a/lib/wx/test/wx_xtra_SUITE.erl b/lib/wx/test/wx_xtra_SUITE.erl
index d5888bbf94..02a0672594 100644
--- a/lib/wx/test/wx_xtra_SUITE.erl
+++ b/lib/wx/test/wx_xtra_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
@@ -23,8 +23,9 @@
%%% Created : 3 Nov 2008 by Dan Gudmundsson <[email protected]>
%%%-------------------------------------------------------------------
-module(wx_xtra_SUITE).
--export([all/0, init_per_suite/1, end_per_suite/1,
- init_per_testcase/2, fin_per_testcase/2, end_per_testcase/2]).
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
+ init_per_suite/1, end_per_suite/1,
+ init_per_testcase/2, end_per_testcase/2]).
-compile(export_all).
@@ -41,19 +42,23 @@ init_per_testcase(Func,Config) ->
wx_test_lib:init_per_testcase(Func,Config).
end_per_testcase(Func,Config) ->
wx_test_lib:end_per_testcase(Func,Config).
-fin_per_testcase(Func,Config) -> %% For test_server
- wx_test_lib:end_per_testcase(Func,Config).
%% SUITE specification
-all() ->
- all(suite).
-all(suite) ->
- [
- destroy_app,
- multiple_add_in_sizer,
- app_dies,
- menu_item_debug
- ].
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [destroy_app, multiple_add_in_sizer, app_dies,
+ menu_item_debug].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
%% The test cases
diff --git a/lib/wx/vsn.mk b/lib/wx/vsn.mk
index dea0678063..7c440a7f5b 100644
--- a/lib/wx/vsn.mk
+++ b/lib/wx/vsn.mk
@@ -1 +1 @@
-WX_VSN = 0.98.8
+WX_VSN = 0.98.9
diff --git a/lib/xmerl/doc/examples/Makefile b/lib/xmerl/doc/examples/Makefile
new file mode 100644
index 0000000000..2768ee1985
--- /dev/null
+++ b/lib/xmerl/doc/examples/Makefile
@@ -0,0 +1,61 @@
+ERLC = erlc
+EMULATOR = beam
+EBIN = .
+HTML = .
+XML = ./xml
+RM = rm -f
+
+# ----------------------------------------------------
+# Common Macros
+# ----------------------------------------------------
+include ../../vsn.mk
+VSN = $(XMERL_VSN)
+
+
+MODULES = \
+ xmerl_test \
+ test_html \
+ xserl_test \
+ mkdocs \
+ sdocbook2xhtml
+
+
+
+DOC_FILES = $(DOCS:%=$(HTML)/%.html)
+
+ERL_COMPILE_FLAGS += $(DEBUG) -I ../../include +warn_unused_wars +debug_info
+
+SUB_DIRECTORIES =
+
+#all: $(MODULES:%=$(EBIN)/%.$(EMULATOR)) xsm $(DOC_FILES)
+all opt: $(MODULES:%=$(EBIN)/%.$(EMULATOR)) $(DOC_FILES)
+
+info:
+ @echo "DOC_FILES: $(DOC_FILES)"
+
+clean:
+# @for d in $(SUB_DIRECTORIES); do \
+# cd $$d; $(MAKE) clean; \
+# done
+ $(RM) $(HTML)/*.html
+ $(RM) $(EBIN)/*.beam
+ $(RM) core *~
+
+debug: xsmdebug $(DOC_FILES)
+
+xsm:
+ @for d in $(SUB_DIRECTORIES); do \
+ cd $$d; $(MAKE); \
+ done
+
+xsmdebug:
+ @for d in $(SUB_DIRECTORIES); do \
+ cd $$d; $(MAKE) DEBUG=-Ddebug=1; \
+ done
+
+$(HTML)/%.html: $(XML)/%.xml
+ erl -noshell -pa ../../ebin -run mkdocs run $< $@ -s erlang halt
+
+$(EBIN)/%.beam: %.erl
+ $(ERLC) $(ERL_COMPILE_FLAGS) -o $(EBIN) $<
+
diff --git a/lib/xmerl/doc/examples/mkdocs.erl b/lib/xmerl/doc/examples/mkdocs.erl
new file mode 100644
index 0000000000..9faa12685b
--- /dev/null
+++ b/lib/xmerl/doc/examples/mkdocs.erl
@@ -0,0 +1,9 @@
+-module(mkdocs).
+-author('[email protected]').
+
+-export([run/1]).
+
+run([InFile, OutFile])->
+ {A,_}=xmerl_scan:file(InFile,[{fetch_fun, fun(DTDSpec,S) -> {ok,S} end}]),
+ B = sdocbook2xhtml:process_xml(A),
+ file:write_file(OutFile,[B]).
diff --git a/lib/xmerl/doc/examples/sdocbook2xhtml.erl b/lib/xmerl/doc/examples/sdocbook2xhtml.erl
new file mode 100644
index 0000000000..f96bf51963
--- /dev/null
+++ b/lib/xmerl/doc/examples/sdocbook2xhtml.erl
@@ -0,0 +1,823 @@
+%%%----------------------------------------------------------------------
+%%% File : sdocbook2xhtml.erl
+%%% Description : Erlang XSLT like "stylesheet" for exporting
+%%% Simplified Docbook XML to XHTML.
+%%%
+%%% Modules used : lists, io_lib, xmerl, xmerl_lib, xmerl_xs
+%%%
+%%%----------------------------------------------------------------------
+
+-module(sdocbook2xhtml).
+-author('[email protected]').
+
+
+-include("xmerl.hrl").
+-import(xmerl_lib, [markup/3,mapxml/2, foldxml/3, mapfoldxml/3]).
+-import(xmerl_xs, [ xslapply/2, value_of/1, select/2, built_in_rules/2]).
+
+-export([ process_xml/1 ]).
+
+-export([abbrev/4,
+ abstract/4,
+ acronym/4,
+ address/4,
+ anchor/4,
+ appendix/4,
+ appendixinfo/4,
+ article/4,
+ articleinfo/4,
+ audiodata/4,
+ audioobject/4,
+ author/4,
+ authorgroup/4,
+ authorinitials/4,
+ bibliography/4,
+ bibliomixed/4,
+ bibliomisc/4,
+ bibliomset/4,
+ biblioset/4,
+ blockquote/4,
+ caption/4,
+ citetitle/4,
+ city/4,
+ colspec/4,
+ command/4,
+ computeroutput/4,
+ copyright/4,
+ corpauthor/4,
+ country/4,
+ date/4,
+ edition/4,
+ editor/4,
+ email/4,
+ emphasis/4,
+ entry/4,
+ example/4,
+ fax/4,
+ figure/4,
+ filename/4,
+ firstname/4,
+ footnote/4,
+ holder/4,
+ honorific/4,
+ imagedata/4,
+ imageobject/4,
+ informaltable/4,
+ inlinemediaobject/4,
+ isbn/4,
+ issn/4,
+ issuenum/4,
+ legalnotice/4,
+ lineage/4,
+ link/4,
+ literal/4,
+ itemizedlist/4,
+ listitem/4,
+ mediaobject/4,
+ member/4,
+ note/4,
+ orderedlist/4,
+ othercredit/4,
+ othername/4,
+ para/4,
+ phone/4,
+ phrase/4,
+ programlisting/4,
+ publishername/4,
+ quote/4,
+ replaceable/4,
+ revhistory/4,
+ revision/4,
+ revnumber/4,
+ revremark/4,
+ row/4,
+ section/4,
+ sectioninfo/4,
+ simplelist/4,
+ subtitle/4,
+ surname/4,
+ systemitem/4,
+ table/4,
+ tbody/4,
+ term/4,
+ tfoot/4,
+ tgroup/4,
+ thead/4,
+ title/4,
+ titleabbrev/4,
+ trademark/4,
+ ulink/4,
+ userinput/4,
+ variablelist/4,
+ varlistentry/4,
+ xref/4,
+ year/4
+ ]).
+
+
+xmlhead() -> "<\?xml version=\"1.0\" encoding=\"iso-8859-1\"\?>".
+doctype() ->"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\
+ \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd \">\n".
+
+style() ->
+ "<style type=\"text/css\"> body {margin-left:10%; margin-right:5%;} \
+.logo{float:right;}
+.toc UL {
+ list-style-type: none;
+ border: solid;
+ border-width: thin;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ background: #f0f0f0;
+ letter-spacing: 2px;
+ line-height: 20px;
+}
+</style>".
+
+process_xml(E)->
+%% lists:flatten(template( E )).
+ template( E ).
+
+%% article is the root element
+template(E0 = #xmlElement{name=article})->
+
+ E = changetitle(E0), %% Add section numbering to titles
+
+ [ xmlhead(), doctype(),
+ "<html xmlns=\"http://www.w3.org/1999/xhtml\" >"
+ "<head>"
+ "<title>",
+ value_of(select("articleinfo/title",E)),
+ "</title>",
+ style(),
+ "</head>"
+ "<body>",
+%% "<img src=\"/logo.png\" alt=\"no logo\" class=\"logo\" </img>",
+ xslapply( fun template/1, select("articleinfo",E)),
+ process_toc(E), %% Insert toc between info and main part of article
+ xslapply( fun template/1, select("section",E)),
+ xslapply( fun template/1, select("appendix",E)),
+ "</body></html>"];
+
+template(E = #xmlElement{name=Name})->
+ A = xslapply( fun template/1, E),
+ case catch
+ sdocbook2xhtml:Name(A, E#xmlElement.attributes, E#xmlElement.parents,E)
+ of
+ {'EXIT', {undef, _}} ->
+ A;
+ {'EXIT', Reason} ->
+ exit(Reason);
+ Res ->
+ Res
+ end;
+
+template(E) ->
+ built_in_rules( fun template/1, E).
+
+%% -------------------------------------------------------------------
+%% simple serialize tags
+
+abbrev(Data, Attrs, [{bibliomset,_}|_], E)->
+ ["<dt><abbr>", Data, "</abbr></dt><dd>"];
+abbrev(Data, Attrs, Parents, E)->
+ markup("abbr",Attrs, Data).
+
+
+abstract(Data, Attrs, Parents, E)->
+ ["<h3>Abstract</h3><blockquote>", Data, "</blockquote>"].
+
+acronym(Data, Attrs, Parents, E)->
+ markup("acronym",Attrs, Data).
+
+address(Data, Attrs, Parents, E)->
+ markup("address", Attrs, Data).
+
+anchor(Data, Attrs, Parents, E)->
+ case find_attribute(id, Attrs) of
+ {value,ID} ->
+ ["<a name=\"" ++ ID ++ "\">", Data, "</a>"];
+ false ->
+ Data
+ end.
+
+appendix(Data, Attrs, Parents, E)->
+ ["<h1>Appendix</h1>", Data].
+
+appendixinfo(Data,_,_,_)->
+ Data.
+
+article(Data, Attrs, Parents, E)->
+ ["<body>"
+ "<img src=\"/logga2.jpg\" alt=\"no logo\" class=\"logo\"
+width=\"50\"</img>",
+ Data,
+ "</body>"].
+
+articleinfo(Data,_,_,_)->
+ Data.
+
+audiodata(Data, Attrs, Parents, E)->Data.
+
+audioobject(_,_,_,_)->
+ [].
+
+author(Data, Attrs, [{authorgroup,_} | _], E)->
+ markup("dd", Attrs, Data);
+author(Data, Attrs, Parents, E)->
+ Data.
+
+authorgroup(Data,_,_,_)->
+ ["<dl><dt>Author</dt>",Data,"</dl>"].
+
+authorinitials(Data,_,_,_)-> Data.
+
+bibliography(Data, Attrs, Parents, E)->
+ ["<h3>Bibliography</h3>" ,Data].
+
+bibliomisc(Data,_,_,_)-> Data.
+bibliomixed(Data,_,_,_)-> ["<dl>",Data, "</dl>"].
+bibliomset(Data,_,_,_)-> [Data, "</dd>"].
+
+biblioset(Data,_,_,_)-> Data.
+
+blockquote(Data, Attrs, Parents, E)->
+ markup("blockquote",Attrs, Data).
+
+caption(Data, Attrs, Parents, E)-> Data.
+
+citetitle(Data,_,_,_)-> ["<i>",Data,"</i>"].
+
+city(Data,_,_,_)->
+ Data.
+
+%% Fix Me is it "col" element in html?
+colspec(_, Attrs,_,_)->
+ [].
+
+command(Data,_,_,_)->
+ ["<b><tt>", Data, "</tt></b>"].
+
+computeroutput(Data,_,_,_)->
+ ["<tt>", Data, "</tt>"].
+
+copyright(Data,_,_,_)->
+ [ "&copy; ", Data].
+
+corpauthor(Data,_,_,_)->
+ Data.
+
+country(Data,_,_,_)->
+ Data.
+
+date(Data,_,[{revision,_}|_],_)->
+ ["<td>", Data, "</td>"];
+date(Data,_,_,_)->
+ Data.
+
+edition(Data,_,_,_)->
+ Data.
+
+editor(Data,_,_,_)->
+ Data.
+
+email(Data,_,_,_)->
+ ["<i><a href=\"mailto:", Data,"\">",Data,"</a></i>"].
+
+emphasis(Data, Attrs, Parents, E)->
+ ["<em>", Data, "</em>"].
+
+%% Cell in a table
+entry(Data, Attrs, [{row,_}, {thead,_} | _], E)->
+ ["<th>", Data, "</th>"];
+entry(Data, Attrs, Parents, E)->
+ ["<td>", Data, "</td>"].
+
+example(Data, Attrs, Parents, E)->
+ ["<hr />", Data, "<hr />"].
+
+fax(Data, Attrs, Parents, E)->
+ ["<address>", Data, "</address>"].
+
+%% May contain ulink to image, resolved by ulink type
+figure(Data, _, _, _)->
+ Data.
+
+filename(Data, _, _, _)->
+ ["<i>", Data, "</i>"].
+
+firstname(Data, _, _, _)->
+ [Data , " " ].
+
+footnote(Data, _, _, _)->
+ Data.
+
+holder(Data, _, _, _)->
+ [" ",Data].
+
+honorific(Data, _, _, _)->
+ Data.
+
+imagedata(Data, Attrs, Parents, E)->
+ SRC =
+ case find_attribute(fileref, Attrs) of
+ {value,AS} ->
+ " src=" ++ AS ++ " ";
+ false ->
+ []
+ end,
+ ALT =
+ case SRC of
+ [] ->
+ " alt=\"No image!\" ";
+ _ ->" alt=\"" ++ SRC ++ "\" "
+ end,
+ WIDTH =
+ case find_attribute(width, Attrs) of
+ false ->
+ [];
+ {value,A} ->" width=" ++ A ++ " "
+ end,
+
+ ["<img " ++ SRC ++ ALT ++ WIDTH ++ "></img>"].
+
+
+imageobject(Data, Attrs, Parents, E)->
+ Data.
+
+informaltable(Data, Attrs, Parents, E)->
+ ["<table border=\"1\" >", Data, "</table>"].
+
+
+inlinemediaobject(Data, Attrs, Parents, E)->
+ Data.
+
+isbn(Data, Attrs, Parents, E)->
+ Data.
+
+issn(Data, Attrs, Parents, E)->
+ Data.
+
+issuenum(Data, Attrs, Parents, E)->
+ Data.
+
+itemizedlist(Data, Attrs, Parents, _)->
+ markup("ul", Attrs, Data).
+
+%keyword
+%{
+% display: inline;
+%}
+
+%keywordset
+%{
+% display: inline;
+%}
+
+legalnotice(Data, Attrs, Parents, _)->
+ markup("small", Attrs, Data).
+
+lineage(Data, Attrs, Parents, _)->
+ Data.
+
+%lineannotation
+%{
+% display: inline;
+%}
+
+% Hypertext link
+link(Data, Attrs, Parents, _)->
+ case find_attribute(linkend, Attrs) of
+ {value,LINK} ->
+ ["<a href=\"#" ++ LINK ++ "\">", Data, "</a>"];
+ false ->
+ Data
+ end.
+
+listitem(Data, Attrs, [{varlistentry,_} | _], E) ->
+ markup("dd", Attrs, Data);
+listitem(Data, Attrs, Parents, _)->
+ markup("li", Attrs, Data).
+
+literal(Data, Attrs, Parents, _)->
+ markup("tt", Attrs, Data).
+
+%literallayout
+%{
+% display: inline;
+%}
+
+mediaobject(Data, Attrs, Parents, _)->
+ Data.
+
+%% simplelist member
+member(Data, Attrs, Parents, _)->
+ [Data,"<br></br>"].
+
+note(Data, Attrs, Parents, _)->
+["<table border=\"1\" cellspacing=\"0\" cellpadding=\"5\" width=\"80%\"
+bgcolor=\"#CCCCCC\"><tr><td>NOTE</td><td><i>", Data, "</i></td></tr></table>"].
+
+%objectinfo
+%{
+% display: inline;
+%}
+
+%option
+%{
+% display: inline;
+%}
+
+orderedlist(Data, Attrs, Parents, _)->
+ markup("ol",Attrs,Data).
+
+%% Hmm otheraddr not in DTD
+%otheraddr
+%{
+% display: inline;
+%}
+
+othercredit(Data, Attrs, Parents, _)->Data.
+
+othername(Data, Attrs, Parents, E)->Data.
+
+%% IGNORE
+%pagenums
+%{
+% display: inline;
+%}
+
+para(Data, Attrs, [{listitem,_}|_], E)->
+ Data;
+para(Data, Attrs, [{note,_}|_], E)->
+ Data;
+para(Data, Attrs, Parents, E)->
+ markup("p", Attrs, Data).
+
+phone(Data, Attrs, Parents, E)->Data.
+
+phrase(Data, Attrs, Parents, E)->Data.
+
+%pob
+%{
+% display: inline;
+%}
+
+%postcode
+%{
+% display: inline;
+%}
+
+%printhistory
+%{
+% display: inline;
+%}
+
+%procedure
+%{
+% display: inline;
+%}
+
+programlisting(Data, Attrs, Parents, E)->
+["<table border=\"1\" cellspacing=\"0\" cellpadding=\"5\" width=\"100%\"
+bgcolor=\"#CCCCCC\"><tr><td><pre><code>", Data,
+"</code></pre></td></tr></table>"].
+
+%pubdate
+%{
+% display: inline;
+%}
+
+%publisher
+%{
+% display: inline;
+%}
+
+publishername(Data, Attrs, Parents, E)->
+ Data.
+
+quote(Data, Attrs, Parents, _)->
+ markup("q", Attrs, Data).
+
+replaceable(Data, Attrs, Parents,_)->
+ markup("i", Attrs, Data).
+
+revhistory(Data, Attrs, Parents,E)->
+ {A,B,C} = case E#xmlElement.language of
+ "en" -> {"Revision history","Date","Comment"};
+ "sv" -> {"Revisionshistoria","Datum","Kommentar"};
+ _ ->{"lang is undefined","lang is undefined","lang is undefined"}
+ end,
+
+ ["<h4>",A,"</h4>","<table><thead>"
+ "<tr><th>Rev.</th><th>",B,"</th><th>",C,"</th></tr></thead>", Data,
+ "</table>"].
+
+revision(Data, Attrs, Parents,_)->
+ markup("tr", Attrs, Data).
+
+revnumber(Data, Attrs, Parents,_)->
+ markup("td", Attrs, Data).
+
+revremark(Data, Attrs, Parents,_)->
+ markup("td", Attrs, Data).
+
+row(Data, Attrs, Parents, E)->
+ markup("tr", Attrs, Data).
+
+section(Data, Attrs, Parents, E)->
+ Data.
+
+sectioninfo(Data, Attrs, Parents, E)->Data.
+
+%sidebar
+%{
+% display: block;
+%}
+
+simplelist(Data, Attrs, Parents, E)->
+ ["<table border=\"1\" cellspacing=\"0\" cellpadding=\"5\"
+width=\"100%\"><tr><td>", Data, "</td></tr></table>"].
+
+
+%state
+%{
+% display: inline;
+%}
+
+%step
+%{
+% display: inline;
+%}
+
+%street
+%{
+% display: inline;
+%}
+
+%substeps
+%{
+% display: inline;
+%}
+
+subtitle(Data, Attrs, Parents, E)->
+ ["<h3>", Data, "</h3>"].
+
+surname(Data, Attrs, Parents, E)->Data.
+
+systemitem(Data, Attrs, Parents, E)->
+ markup("b", Attrs, Data).
+
+table(Data, Attrs, Parents, E)->
+ ["<table border=\"1\" cellspacing=\"0\" cellpadding=\"4\" >",
+ Data, "</table>"].
+
+%% Fix me alot
+tbody(Data, Attrs, Parents, E)->
+ markup("tbody", Attrs, Data).
+%{
+% display: table-row-group;
+%}
+
+term(Data, Attrs, [{varlistentry,_} | _], E) ->
+ markup("dt", Attrs, Data).
+
+
+%textobject
+%{
+% display: inline;
+%}
+
+tfoot(Data, Attrs, Parents, E)->
+ markup("tfoot",Attrs, Data).
+
+%% Fixme alot
+tgroup(Data, Attrs, Parents, E)->
+ markup("colgroup", Attrs, Data).
+%{
+% display: table;
+%}
+
+thead(Data, Attrs, Parents, E)->
+ markup("thead",Attrs, Data).
+%{
+% display: table-row-group;
+%}
+
+title(Data, Attrs, Parents, E)->
+%% io:fwrite("Parents ~p~n", [Parents]),
+ title1(Data, Attrs, Parents, E).
+
+title1(Data, Attrs, [{section,_}, {section,_}, {section,_},
+ {section,_}, {section,_}, {appendix,_} | _], E) ->
+ ["<h6>", Data, "</h6>"];
+title1(Data, Attrs, [{section,_}, {section,_}, {section,_},
+ {section,_}, {appendix,_} | _], E) ->
+ ["<h5>", Data, "</h5>"];
+title1(Data, Attrs, [{section,_}, {section,_}, {section,_},
+ {apendix,_} | _], E) ->
+ ["<h4>", Data, "</h4>"];
+title1(Data, Attrs, [{section,_}, {section,_}, {appendix,_} | _], E) ->
+ ["<h3>", Data, "</h3>"];
+title1(Data, Attrs, [{section,_}, {appendix,_} | _], E) ->
+ ["<h2>", Data, "</h2>"];
+title1(Data, Attrs, [{appendix,_} | _], E) ->
+ ["<h1>", Data, "</h1>"];
+
+title1(Data, Attrs, [{section,_}, {section,_}, {section,_},
+ {section,_}, {section,_}, {section,_} | _], E) ->
+ ["<h6>", Data, "</h6>"];
+title1(Data, Attrs, [{section,_}, {section,_}, {section,_},
+ {section,_}, {section,_} | _], E) ->
+ ["<h6>", Data, "</h6>"];
+title1(Data, Attrs, [{section,_}, {section,_}, {section,_},
+ {section,_} | _], E) ->
+ ["<h5>", Data, "</h5>"];
+title1(Data, Attrs, [{section,C}, {section,B}, {section,A} | _], E) ->
+ {value, Id} = find_attribute(id,Attrs),
+ ["<h4 id=\"", Id, "\">", Data, "</h4>"];
+title1(Data, Attrs, [{section,B}, {section,A} | _], E) ->
+ {value, Id} = find_attribute(id,Attrs),
+ ["<h3 id=\"", Id, "\">", Data, "</h3>"];
+title1(Data, Attrs, [{section,A} | _], E) ->
+ {value, Id} = find_attribute(id,Attrs),
+ ["<h2 id=\"", Id, "\">", Data, "</h2>"];
+title1(Data, Attrs, [{articleinfo,_} | _], E) ->
+ ["<h1>", Data, "</h1>"];
+title1(Data, Attrs, [{table,_} | _], E) ->
+ ["<caption>", Data, "</caption>"];
+title1(Data, Attrs, [{bibliomset,_} | _], E) ->
+ ["<i><b>", Data, "</b></i>"];
+title1(Data, Attrs, Parents, E)->
+ ["<h4>", Data, "</h4>"].
+
+titleabbrev(Data, Attrs, Parents, E)->[].
+
+trademark(Data, Attrs, Parents, E)->
+ [ Data, " &reg; "].
+
+ulink(Data, Attrs, Parents, E)->
+ case find_attribute(url, Attrs) of
+ {value,LINK} ->
+ ["<a href="++ LINK ++ ">", Data, "</a>"];
+ false ->
+ Data
+ end.
+
+
+%% User input is Constant Bold
+userinput(Data, Attrs, Parents, E)->
+ ["<tt><b>", Data, "</b></tt>"].
+
+variablelist(Data, Attrs, Parents, E)->
+ markup("dl", Attrs, Data).
+
+varlistentry(Data, Attrs, Parents, E)->Data.
+
+%videodata
+%{
+% display: inline;
+%}
+
+%videoobject
+%{
+% display: inline;
+%}
+
+%volumenum
+%{
+% display: inline;
+%}
+
+xref(Data, Attrs, Parents, E)->
+ case find_attribute(linkend, Attrs) of
+ {value,LINK} ->
+ ["<a href=\"#" ++ LINK ++ "\" />"];
+ false ->
+ Data
+ end.
+
+year(Data, Attrs, Parents, E)->Data.
+
+%% ----------------------------------------------------------
+%% Utils find_attribute copied from Ulf Wigers xmerl distribution
+
+find_attribute(Name, Attrs) ->
+ case lists:keysearch(Name, #xmlAttribute.name, Attrs) of
+ {value, #xmlAttribute{value = V}} ->
+ {value, V};
+ false ->
+ false
+ end.
+%% ------------
+
+changetitle(A) ->
+ Afun = fun changecount/2,
+ {E, Acc} = mapfoldxml(Afun, {0,0,0,0,0,0}, A),
+ E.
+
+changecount(#xmlElement{name=title}=E, {A,B,C,Ex,Fig,Tab})->
+ case E#xmlElement.parents of
+ [{example,_} |_] ->
+ {addexhead(E,{A,Ex+1}), {A,B,C,Ex+1,Fig,Tab} };
+ [{figure,_} |_] ->
+ {addfighead(E,{A,Fig+1}), {A,B,C,Ex,Fig+1,Tab} };
+ [{table,_} |_] ->
+ {addtablehead(E,{A,Tab+1}), {A,B,C,Ex,Fig,Tab+1} };
+ [{section,_},{section,_},{section,_},{article,_} |_] ->
+ {addheader(E,{A,B,C+1}), {A,B,C+1,Ex,Fig,Tab} };
+ [{section,_},{section,_},{article,_} |_] ->
+ { addheader(E,{A,B+1,0}), {A,B+1,0,Ex,Fig,Tab} };
+ [{section,_},{article,_} |_] ->
+ {addheader(E,{A+1,0,0}),{A+1,0,0,0,0,0}};
+ _ ->
+ {E,{A,B,C,Ex,Fig,Tab}}
+ end;
+changecount(E, Acc)->{E,Acc}.
+
+addexhead(#xmlElement{name=title,content=[#xmlText{}=T1|_]}= E, {Ch,No})->
+ NewHeader = "Example " ++
+ integer_to_list(Ch)++" - "++ integer_to_list(No) ++
+ " " ++ T1#xmlText.value,
+ E#xmlElement{content=[T1#xmlText{value=NewHeader}]}.
+addfighead(#xmlElement{name=title,content=[#xmlText{}=T1|_]}= E, {Ch,No})->
+ NewHeader = "Figure " ++
+ integer_to_list(Ch)++" - "++ integer_to_list(No) ++
+ " " ++ T1#xmlText.value,
+ E#xmlElement{content=[T1#xmlText{value=NewHeader}]}.
+addtablehead(#xmlElement{name=title,content=[#xmlText{}=T1|_]}= E, {Ch,No})->
+ NewHeader = "Table " ++
+ integer_to_list(Ch)++" - "++ integer_to_list(No) ++
+ " " ++ T1#xmlText.value,
+ E#xmlElement{content=[T1#xmlText{value=NewHeader}]}.
+
+addheader(#xmlElement{name=title,content=[#xmlText{}=T1|_]}= E, Chapters)->
+ NewHeader = chapterstring(Chapters)++ " " ++ T1#xmlText.value,
+ NewAtts = addid(E#xmlElement.attributes, Chapters),
+ E#xmlElement{content=[T1#xmlText{value=NewHeader}],
+ attributes = NewAtts}.
+
+chapterstring({A,0,0})->integer_to_list(A);
+chapterstring({A,B,0})->integer_to_list(A)++"."++ integer_to_list(B);
+chapterstring({A,B,C})->integer_to_list(A) ++ "." ++
+ integer_to_list(B) ++ "." ++
+ integer_to_list(C).
+
+%% addid add id attribute if it not already exists
+addid(OldAtts, Chapters)->
+ case find_attribute(id, OldAtts) of
+ {value,_} ->
+ OldAtts;
+ false ->
+ add_attribute(id,"sect_"++ chapterstring(Chapters),
+ OldAtts)
+ end.
+
+add_attribute(Name, Value, OldAtts)->
+ [#xmlAttribute{ name=Name, value = Value}| OldAtts ].
+
+
+process_toc(E)->
+ AFun = fun chapindex/2,
+ TOCR = foldxml(AFun, [], E),
+% Str = case find_attribute(lang, E#xmlElement.attributes) of
+% {value,"en"} -> "Table of Contents";
+% {value,"sv"} -> "Inneh�llsf�rtecking";
+% _ ->"lang is undefined"
+% end,
+ Str = case E#xmlElement.language of
+ "en" -> "Table of Contents";
+ "sv" -> "Inneh�llsf�rtecking";
+ _ ->"lang is undefined"
+ end,
+ TOC = ["<div class=\"toc\"><h3>",Str,"</h3><ul>",
+lists:reverse(TOCR), "</ul></div>"].
+
+chapindex(#xmlElement{name=title}=E, Accu)->
+ case E#xmlElement.parents of
+ [{section,_},{section,_},{section,_},{article,_} |_] ->
+ ["<li>"++spind(3)++ addlink(E,"toc_level_3") ++"</li>"| Accu];
+ [{section,_},{section,_},{article,_} |_] ->
+ ["<li>"++spind(2)++ addlink(E,"toc_level_2") ++ "</li>"| Accu];
+ [{section,_},{article,_} |_] ->
+ ["<li>"++spind(1)++ addlink(E,"toc_level_1") ++"</li>"| Accu];
+ _ ->
+ Accu
+ end;
+chapindex(E, Accu) ->
+ Accu.
+
+spind(0) ->"";
+spind(X)->
+ "&#160;&#160;" ++ spind(X-1).
+
+addlink(E, TocLevel)->
+ {value,LINK} = find_attribute(id,E#xmlElement.attributes),
+ [#xmlText{value=Title}|_] = E#xmlElement.content, %% Pfuii
+ "<a href=\"#" ++ LINK ++
+ "\" class=\"" ++ TocLevel ++ "\">" ++
+ Title ++ "</a>".
+
+
diff --git a/lib/xmerl/doc/examples/test_html.erl b/lib/xmerl/doc/examples/test_html.erl
new file mode 100755
index 0000000000..3ca15f30f8
--- /dev/null
+++ b/lib/xmerl/doc/examples/test_html.erl
@@ -0,0 +1,225 @@
+%%% The contents of this file are subject to the Erlang Public License,
+%%% Version 1.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.erlang.org/license/EPL1_0.txt
+%%%
+%%% 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.
+%%%
+%%% The Original Code is xmerl-0.7
+%%%
+%%% The Initial Developer of the Original Code is Ericsson Telecom
+%%% AB. Portions created by Ericsson are Copyright (C), 1998, Ericsson
+%%% Telecom AB. All Rights Reserved.
+%%%
+%%% Contributor(s): ______________________________________.
+%%%
+%%%----------------------------------------------------------------------
+%%% #0. BASIC INFORMATION
+%%%----------------------------------------------------------------------
+%%% File: test_html.erl
+%%% Author : Ulf Wiger <[email protected]>
+
+%%% Description : Callback module for exporting XML to HTML with support
+%%% for special Erlang-related tags. (Experimental)
+%%%
+%%% Modules used : lists, io_lib
+%%%
+%%%----------------------------------------------------------------------
+
+-module(test_html).
+-author('[email protected]').
+
+
+-export(['#xml-inheritance#'/0]).
+
+%%% special Erlang forms
+-export(['EXIT'/4,
+ 'tuple_list'/4]).
+
+-export(['#root#'/4,
+ title/4,
+ heading/4,
+ section/4,
+ table/4,
+ row/4,
+ col/4,
+ data/4,
+ p/4, para/4, 'P'/4,
+ emphasis/4]).
+
+-include("xmerl.hrl").
+
+
+'#xml-inheritance#'() -> [xmerl_xml].
+
+
+
+%% The '#root#' tag is called when the entire structure has been exported.
+%% It does not appear in the structure itself.
+'#root#'(Data, Attrs, [], E) ->
+ Title =
+ case find_attribute(title, Attrs) of
+ {value, T} ->
+ ["<title>", T, "</title>"];
+ false ->
+ []
+ end,
+ ["<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n"
+ "<html>\n",
+ "<head>\n", Title, "</head>\n"
+ "<body>\n", Data, "</body>\n"].
+
+
+
+
+%%% Special token: EXIT
+'EXIT'(Reason, Attrs = [], Parents = [], E) ->
+ %% This happens e.g. if a request function crashes completely.
+ ["<pre>\n", mk_string({'EXIT', Reason}), "</pre>"].
+
+
+title(Str, Attrs, Parents, E) ->
+ ["<h1>", Str, "</h1>\n"].
+
+
+%%% section/3 is to be used instead of headings.
+section(Data, Attrs, [{section,_}, {section,_}, {section,_} | _], E) ->
+ opt_heading(Attrs, "<h4>", "</h4>", Data);
+section(Data, Attrs, [{section,_}, {section,_} | _], E) ->
+ opt_heading(Attrs, "<h3>", "</h3>", Data);
+section(Data, Attrs, [{section,_} | _], E) ->
+ opt_heading(Attrs, "<h2>", "</h2>", Data);
+section(Data, Attrs, Parents, E) ->
+ opt_heading(Attrs, "<h1>", "</h1>", Data).
+
+opt_heading(Attrs, StartTag, EndTag, Data) ->
+ case find_attribute(heading, Attrs) of
+ {value, Text} ->
+ [StartTag, Text, EndTag, "\n" | Data];
+ false ->
+ Data
+ end.
+
+
+%% tables
+%% e.g. {table, [{heading, [{col, H1}, {col, H2}]},
+%% {row, [{col, C11}, {col, C12}]},
+%% {row, [{col, C21}, {col, C22}]}]}.
+
+table(Data, Attrs, Parents, E) ->
+ Border = case find_attribute(border, Attrs) of
+ false ->
+ " border=1";
+ {value, N} ->
+ [" border=", mk_string(N)]
+ end,
+ ["<table", Border, ">\n", Data, "\n</table>\n"].
+
+row(Data, Attrs, [{table,_}|_], E) ->
+ ["<tr>", Data, "</tr>\n"].
+
+heading(Data, Attrs, [{table,_}|_], E) ->
+ ["<tr>", Data, "</tr>\n"].
+
+
+%% Context-sensitive columns (heading- or row columns)
+col(Data, Attrs, [{heading,_}, {table,_} | _], E) ->
+ ["<th>", nbsp_if_empty(Data), "</th>\n"];
+col(Data, Attrs, [{row,_}, {table,_} | _], E) ->
+ ["<td>", nbsp_if_empty(Data), "</td>\n"].
+
+
+tuple_list(List, Attrs, Parents, E) ->
+ Elems = case find_attribute(elements, Attrs) of
+ {value, Es} ->
+ Es;
+ false ->
+ case List of
+ [H|_] ->
+ lists:seq(1,size(H));
+ [] ->
+ []
+ end
+ end,
+ TableData = [{row, [{col, {element(P, Rec)}} || P <- Elems]} ||
+ Rec <- List],
+ Table = case find_attribute(heading, Attrs) of
+ {value, Cols} ->
+ Head = {heading, [{col, C} || C <- Cols]},
+ {table, [Head | TableData]};
+ false ->
+ {table, TableData}
+ end,
+ {'#xml-redefine#', Table}.
+
+
+data(Data, Pos, Attrs, Parents) ->
+ mk_string(Data).
+
+
+
+p(Data, Pos, Attrs, Parents) ->
+ {'#xml-alias#', 'P'}.
+
+para(Data, Pos, Attrs, Parents) ->
+ {'#xml-alias#', 'P'}.
+
+'P'(Data, Pos, Attrs, Parents) ->
+ ["<p>", mk_string(Data), "</p>\n"].
+
+
+emphasis(Str, Pos, Attrs, Parents) ->
+ ["<strong>", Str, "</strong>"].
+
+
+nbsp_if_empty(Data) when binary(Data), size(Data) == 0 ->
+ "&nbsp;";
+nbsp_if_empty(Data) when list(Data) ->
+ case catch list_to_binary(Data) of
+ {'EXIT', _} ->
+ nbsp_if_empty_term(Data);
+ B when size(B) == 0 ->
+ "&nbsp;";
+ _ ->
+ Data
+ end;
+nbsp_if_empty(Data) ->
+ nbsp_if_empty_term(Data).
+
+nbsp_if_empty_term(Data) ->
+ Str = io_lib:format("~p", [Data]),
+ case list_to_binary(Str) of
+ B when size(B) == 0 ->
+ "&nbsp;";
+ _ ->
+ Str
+ end.
+
+
+mk_string(I) when integer(I) ->
+ integer_to_list(I);
+mk_string(A) when atom(A) ->
+ atom_to_list(A);
+mk_string(L) when list(L) ->
+ %% again, we can't regognize a string without "parsing" it
+ case catch list_to_binary(L) of
+ {'EXIT',_} ->
+ io_lib:format("~p", [L]);
+ _ ->
+ L
+ end;
+mk_string(Term) ->
+ io_lib:format("~p", [Term]).
+
+
+
+find_attribute(Name, Attrs) ->
+ case lists:keysearch(Name, #xmlAttribute.name, Attrs) of
+ {value, #xmlAttribute{value = V}} ->
+ {value, V};
+ false ->
+ false
+ end.
diff --git a/lib/xmerl/doc/examples/xmerl_test.erl b/lib/xmerl/doc/examples/xmerl_test.erl
new file mode 100644
index 0000000000..b4288431f2
--- /dev/null
+++ b/lib/xmerl/doc/examples/xmerl_test.erl
@@ -0,0 +1,522 @@
+-module(xmerl_test).
+
+-compile(export_all).
+%%-export([Function/Arity, ...]).
+
+-define(XMERL_APP,).
+
+-include("xmerl.hrl").
+
+%% Export to HTML from "simple" format
+test1() ->
+ xmerl:export_simple(simple(), xmerl_html, [{title, "Doc Title"}]).
+
+
+%% Export to XML from "simple" format
+test2() ->
+ xmerl:export_simple(simple(), xmerl_xml, [{title, "Doc Title"}]).
+
+
+%% Parse XHTML, and export result to HTML and text
+test3() ->
+ FetchFun = fun(_DTDSpec, S) -> {ok, not_fetched,S} end,
+ {A, _} = xmerl_scan:string(html(),
+ [{fetch_fun,FetchFun}]),
+ io:format("From xmerl_scan:string/2~n ~p~n", [A]),
+ B = xmerl:export([A], xmerl_html),
+ io:format("From xmerl:export/2 xmerl_html filter~n ~p~n", [B]),
+ C = xmerl:export([A], xmerl_text),
+ io:format("From xmerl:export/2 xmerl_text filter~n ~p~n", [C]).
+
+
+test4() ->
+ FetchFun = fun(_DTDSpec, S) -> {ok, not_fetched, S} end,
+ {A,_} = xmerl_scan:string(xml_namespace(),
+ [{fetch_fun,FetchFun},
+ {namespace_conformant,true}]),
+ io:format("From xmerl_scan:string/2~n ~p~n", [A]).
+
+test5() ->
+ {ok, Cwd} = file:get_cwd(), % Assume we are in the examples dir...
+ File = Cwd ++ "/xml/xmerl.xml",
+ FetchFun = fun(_DTDSpec, S) -> {ok, not_fetched, S} end,
+% {Resp0,Rest0}=xmerl_eventp:stream(File,[]),
+% io:format("Tree: ~p~n",[Resp0]),
+ {Resp1, _Rest1}=xmerl_eventp:file_sax(File, ?MODULE, undefined,
+ [{fetch_fun, FetchFun}]),
+ io:format("Using file_sax: counted ~p paragraphs~n", [Resp1]),
+ {Resp2, _Rest2} = xmerl_eventp:stream_sax(File, ?MODULE, undefined, []),
+ io:format("Using stream_sax: counted ~p paragraphs~n", [Resp2]).
+
+test6() ->
+ FetchFun = fun(_DTDSpec, S) -> {ok, {string,""}, S} end,
+ {Doc, _} = xmerl_scan:string(xml_namespace(),
+ [{fetch_fun, FetchFun},
+ {namespace_conformant, true}]),
+ E = xmerl_xpath:string("child::title[position()=1]", Doc),
+ io:format("From xmerl_scan:string/2~n E=~p~n", [E]).
+
+
+simple() ->
+ [{document,
+ [{title, ["Doc Title"]},
+ {author, ["Ulf Wiger"]},
+ {section,[{heading, ["heading1"]},
+ {'P', ["This is a paragraph of text."]},
+ {section,[{heading, ["heading2"]},
+ {'P', ["This is another paragraph."]},
+ {table,[{border, ["1"]},
+ {heading,[{col, ["head1"]},
+ {col, ["head2"]}]},
+ {row, [{col, ["col11"]},
+ {col, ["col12"]}]},
+ {row, [{col, ["col21"]},
+ {col, ["col22"]}]}
+ ]}
+ ]}
+ ]}
+ ]}
+ ].
+
+
+html() ->
+ "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"DTD/xhtml1-strict.dtd\"><html>"
+ "<head><title>Doc Title</title><author>Ulf Wiger</author></head>"
+ "<h1>heading1</h1>"
+ "<p>This is a paragraph of text.</p>"
+ "<h2>heading2</h2>"
+ "<p>This is another paragraph.</p>"
+ "<table>"
+ "<thead><tr><td>head1</td><td>head2</td></tr></thead>"
+ "<tr><td>col11</td><td>col122</td></tr>"
+ "<tr><td>col21</td><td>col122</td></tr>"
+ "</table>"
+ "</html>".
+
+xml_namespace() ->
+ "<?xml version=\"1.0\"?>"
+ "<!-- initially, the default namespace is \"books\" -->"
+ "<book xmlns='urn:loc.gov:books' xmlns:isbn='urn:ISBN:0-395-36341-6'>"
+ "<title>Cheaper by the Dozen</title>"
+ "<isbn:number>1568491379</isbn:number>"
+ "<notes>"
+ "<!-- make HTML the default namespace for some comments -->"
+ "<p xmlns='urn:w3-org-ns:HTML'>"
+ "This is a <i>funny</i> book!"
+ "</p>"
+ "</notes>"
+ "</book>".
+
+
+%%% ============================================================================
+%%% Generic callbacks
+
+%'#text#'(Text) ->
+% [].
+
+'#root#'(Data, Attrs, [], _E) ->
+ io:format("root... Data=~p Attrs=~p E=~p~n",[Data,Attrs,_E]),
+ [].
+
+'#element#'(Tag, Data, Attrs, _Parents, _E) ->
+ io:format("Tag=~p~n Data=~p~n Attrs=~p~n Parents=~p~n E=~p~n",
+ [Tag, Data, Attrs, _Parents, _E]),
+ [].
+
+'#element#'(_Tag, _Data, _Attrs, CBstate) ->
+% io:format("Tag=~p~n Data=~p~n Attrs=~p~n CBstate=~p~n",
+% [Tag, Data, Attrs, CBstate]),
+ CBstate.
+
+'#text#'(Text, CBstate) ->
+ io:format("Text=~p~n CBstate=~p~n",
+ [Text, CBstate]),
+ CBstate.
+
+
+'#xml-inheritance#'() ->
+ [xmerl_html].
+
+
+
+
+%%% ============================================================================
+%%% To run these tests you must first download the testsuite from www.w3c.org
+%%% xmlconf.xml is the main test file that contains references to all the tests.
+%%% Thus parse this, export result and execute tests in the call-back functions.
+%%% Note:
+%%% - xmerl assumes all characters are represented with a single integer.
+w3cvalidate() ->
+ Tests = filename:join(filename:dirname(filename:absname(code:which(xmerl))),
+ "../w3c/xmlconf/xmlconf.xml"),
+ TestDir = filename:dirname(Tests),
+ io:format("Looking for W3C tests at ~p~n", [Tests]),
+ {ok, Bin} = file:read_file(Tests),
+
+% String = ucs:to_unicode(binary_to_list(Bin), 'utf-8'),
+% case xmerl_scan:string(String, [{xmlbase, TestDir}]) of
+ case xmerl_scan:string(binary_to_list(Bin), [{xmlbase, TestDir}]) of
+ {error, Reason} ->
+ io:format("ERROR xmerl:scan_file/2 Reason=~w~n", [Reason]);
+ {A, _Res} ->
+% io:format("From xmerl:scan_file/2 ~n A=~p~n Res=~w~n", [A,Res]),
+ C = xmerl:export([A], xmerl_test),
+ io:format("From xmerl:export/2 xmerl_text filter~n ~p~n", [C])
+ end.
+
+
+'TESTSUITE'(_Data, Attrs, _Parents, _E) ->
+ _Profile = find_attribute('PROFILE', Attrs),
+% io:format("testsuite Profile=~p~n", [Profile]),
+ [].
+
+'TESTCASES'(_Data, Attrs, _Parents, _E) ->
+ Profile = find_attribute('PROFILE', Attrs),
+ XMLbase = find_attribute('xml:base', Attrs),
+ io:format("testsuite Profile=~p~n xml:base=~p~n", [Profile, XMLbase]),
+ [].
+
+%% More info on Canonical Forms can be found at:
+%% http://dev.w3.org/cvsweb/~checkout~/2001/XML-Test-Suite/xmlconf/sun/cxml.html?content-type=text/html;%20charset=iso-8859-1
+'TEST'(Data, Attrs, _Parents, E) ->
+% io:format("test Attrs=~p~n Parents=~p~n E=~p~n",[Attrs, _Parents, E]),
+ Id = find_attribute('ID', Attrs),
+ io:format("Test: ~p ",[Id]),
+ Entities = find_attribute('ENTITIES', Attrs), % Always handle all entities
+ Output1 = find_attribute('OUTPUT', Attrs), %
+ Output3 = find_attribute('OUTPUT3', Attrs), % FIXME!
+ Sections = find_attribute('SECTIONS', Attrs),
+ Recommendation = find_attribute('RECOMMENDATION', Attrs), % FIXME!
+ Type = find_attribute('TYPE', Attrs), % Always handle all entities
+ Version = find_attribute('VERSION', Attrs), % FIXME!
+ URI = find_attribute('URI', Attrs),
+ Namespace = find_attribute('NAMESPACE', Attrs), % FIXME!
+
+ OutputForm=
+ if
+ Output1 =/= undefined -> Output1;
+ true -> Output3
+ end,
+ Test = filename:join(E#xmlElement.xmlbase, URI),
+% io:format("TEST URI=~p~n E=~p~n",[Test,E]),
+ case Type of
+ "valid" ->
+% io:format("Data=~p~n Attrs=~p~n Parents=~p~n Path=~p~n",
+% [Data, Attrs, _Parents, Test]),
+ test_valid(Test, Data, Sections, Entities, OutputForm, Recommendation,
+ Version, Namespace);
+ "invalid" ->
+ test_invalid(Test, Data, Sections, Entities, OutputForm, Recommendation,
+ Version, Namespace);
+ "not-wf" ->
+ test_notwf(Test, Data, Sections, Entities, OutputForm, Recommendation,
+ Version, Namespace);
+ "error" ->
+ test_error(Test, Data, Sections, Entities, OutputForm, Recommendation,
+ Version, Namespace)
+ end,
+ [].
+
+%% Really basic HTML font tweaks, to support highlighting
+%% some aspects of test descriptions ...
+'EM'(Data, _Attrs, _Parents, _E) ->
+ [$" |Data ++ [$"]].
+
+'B'(Data, _Attrs, _Parents, _E) ->
+ [$" |Data ++ [$"]].
+
+
+
+find_attribute(Tag,Attrs) ->
+ case xmerl_lib:find_attribute(Tag, Attrs) of
+ {value, Id} -> Id;
+ false -> undefined
+ end.
+
+
+-define(CONT, false).
+
+%%% All parsers must accept "valid" testcases.
+test_valid(URI, Data, Sections, Entities, OutputForm, Recommendation, Version,
+ Namespace) ->
+ io:format("nonvalidating ", []),
+ case nonvalidating_parser_q(URI) of
+ {Res, Tail} when is_record(Res, xmlElement) ->
+ case is_whitespace(Tail) of
+ true ->
+ io:format("OK ", []),
+ ok;
+ false ->
+ print_error({Res, Tail}, URI, Sections, Entities, OutputForm,
+ Recommendation,
+ Version, Namespace, Data),
+ if
+ ?CONT == false -> throw({'EXIT', failed_test});
+ true -> error
+ end
+ end;
+ Error ->
+ print_error(Error, URI, Sections, Entities, OutputForm, Recommendation,
+ Version, Namespace, Data),
+ if
+ ?CONT == false -> throw({'EXIT', failed_test});
+ true -> error
+ end
+ end,
+ io:format("validating ", []),
+ case validating_parser_q(URI) of
+ {Res2, Tail2} when is_record(Res2, xmlElement) ->
+ case is_whitespace(Tail2) of
+ true ->
+ io:format("OK~n", []),
+ ok;
+ false ->
+ print_error({Res2, Tail2}, URI, Sections, Entities, OutputForm,
+ Recommendation,
+ Version, Namespace, Data),
+ if
+ ?CONT == false -> throw({'EXIT', failed_test});
+ true -> error
+ end
+ end;
+ Error2 ->
+ print_error(Error2, URI, Sections, Entities, OutputForm, Recommendation,
+ Version, Namespace, Data),
+ if
+ ?CONT == false -> throw({'EXIT', failed_test});
+ true -> error
+ end
+ end.
+
+
+%%% Nonvalidating parsers must accept "invalid" testcases, but validating ones
+%%% must reject them.
+test_invalid(URI, Data, Sections, Entities, OutputForm, Recommendation, Version,
+ Namespace) ->
+ io:format("nonvalidating ", []),
+ case nonvalidating_parser_q(URI) of
+ {Res,Tail} when is_record(Res, xmlElement) ->
+ case is_whitespace(Tail) of
+ true ->
+ io:format("OK ", []),
+ ok;
+ false ->
+ print_error({Res, Tail}, URI, Sections, Entities, OutputForm,
+ Recommendation,
+ Version, Namespace, Data),
+ if
+ ?CONT == false -> throw({'EXIT', failed_test});
+ true -> error
+ end
+ end;
+ Error ->
+ print_error(Error, URI, Sections, Entities, OutputForm, Recommendation,
+ Version, Namespace, Data),
+ if
+ ?CONT == false -> throw({'EXIT', failed_test});
+ true -> error
+ end
+ end,
+ io:format("validating ", []),
+ case validating_parser_q(URI) of
+ {Res2, Tail2} when is_record(Res2, xmlElement) ->
+ case is_whitespace(Tail2) of
+ false ->
+ io:format("OK~n", []),
+ ok;
+ true ->
+ print_error({Res2, Tail2}, URI, Sections, Entities, OutputForm,
+ Recommendation,
+ Version, Namespace, Data),
+ if
+ ?CONT == false -> throw({'EXIT', failed_test});
+ true -> error
+ end
+ end;
+ {error, enoent} ->
+ print_error("Testfile not found", URI, Sections, Entities, OutputForm,
+ Recommendation, Version, Namespace, Data),
+ if
+ ?CONT == false -> throw({'EXIT', failed_test});
+ true -> error
+ end;
+ _Error2 ->
+ io:format("OK~n", []),
+ ok
+ end.
+
+%%% No parser should accept a "not-wf" testcase unless it's a nonvalidating
+%%% parser and the test contains external entities that the parser doesn't read
+test_notwf(URI, Data, Sections, Entities, OutputForm, Recommendation, Version,
+ Namespace) ->
+ io:format("nonvalidating ", []),
+ case nonvalidating_parser_q(URI) of
+ {Res, Tail} when is_record(Res, xmlElement) ->
+ case is_whitespace(Tail) of
+ false ->
+ io:format("OK ", []),
+ ok;
+ true ->
+ print_error({Res, Tail}, URI, Sections, Entities, OutputForm,
+ Recommendation,
+ Version, Namespace, Data),
+ if
+ ?CONT == false -> throw({'EXIT', failed_test});
+ true -> error
+ end
+ end;
+ {error,enoent} ->
+ print_error("Testfile not found",URI,Sections,Entities,OutputForm,
+ Recommendation,Version,Namespace,Data),
+ if
+ ?CONT==false -> throw({'EXIT', failed_test});
+ true -> error
+ end;
+ _Error ->
+ io:format("OK ",[]),
+ ok
+ end,
+ io:format("validating ",[]),
+ case validating_parser_q(URI) of
+ {Res2, Tail2} when is_record(Res2, xmlElement) ->
+ case is_whitespace(Tail2) of
+ false ->
+ io:format("OK~n", []),
+ ok;
+ true ->
+ print_error({Res2, Tail2}, URI, Sections, Entities, OutputForm,
+ Recommendation,
+ Version, Namespace, Data),
+ if
+ ?CONT == false -> throw({'EXIT', failed_test});
+ true -> error
+ end
+ end;
+ {error,enoent} ->
+ print_error("Testfile not found", URI, Sections, Entities, OutputForm,
+ Recommendation, Version, Namespace, Data),
+ if
+ ?CONT == false -> throw({'EXIT', failed_test});
+ true -> error
+ end;
+ _Error2 ->
+ io:format("OK~n", []),
+ ok
+ end.
+
+%%% Parsers are not required to report "errors", but xmerl will always...
+test_error(URI, Data, Sections, Entities, OutputForm, Recommendation, Version,
+ Namespace) ->
+ io:format("nonvalidating ", []),
+ case nonvalidating_parser_q(URI) of
+ {'EXIT', _Reason} ->
+ io:format("OK ", []),
+ ok;
+ {error, enoent} ->
+ print_error("Testfile not found", URI, Sections, Entities, OutputForm,
+ Recommendation, Version, Namespace, Data),
+ if
+ ?CONT == false -> throw({'EXIT', failed_test});
+ true -> error
+ end;
+ Res ->
+ print_error(Res, URI, Sections, Entities, OutputForm, Recommendation,
+ Version, Namespace, Data),
+ if
+ ?CONT == false -> throw({'EXIT', failed_test});
+ true -> error
+ end
+ end,
+ io:format("validating ", []),
+ case validating_parser_q(URI) of
+ {'EXIT', _Reason2} ->
+ io:format("OK~n", []),
+ ok;
+ {error, enoent} ->
+ print_error("Testfile not found", URI, Sections, Entities, OutputForm,
+ Recommendation, Version, Namespace, Data),
+ if
+ ?CONT == false -> throw({'EXIT', failed_test});
+ true -> error
+ end;
+ Res2 ->
+ print_error(Res2, URI, Sections, Entities, OutputForm, Recommendation,
+ Version, Namespace, Data),
+ if
+ ?CONT == false -> throw({'EXIT', failed_test});
+ true -> error
+ end
+ end.
+
+
+%%% Use xmerl as nonvalidating XML parser
+nonvalidating_parser(URI) ->
+ (catch xmerl_scan:file(URI, [])).
+
+
+%%% Use xmerl as nonvalidating XML parser
+nonvalidating_parser_q(URI) ->
+ (catch xmerl_scan:file(URI, [{quiet, true}])).
+
+
+%%% Use xmerl as validating XML parser
+validating_parser(URI) ->
+ (catch xmerl_scan:file(URI, [{validation, true}])).
+
+
+%%% Use xmerl as validating XML parser
+validating_parser_q(URI) ->
+ (catch xmerl_scan:file(URI, [{validation, true}, {quiet, true}])).
+
+
+is_whitespace([]) ->
+ true;
+is_whitespace([H |Rest]) when ?whitespace(H) ->
+ is_whitespace(Rest);
+is_whitespace(_) ->
+ false.
+
+
+print_error(Error, URI, Sections, Entities, OutputForm, Recommendation, Version,
+ Namespace, Data) ->
+ io:format("ERROR ~p~n URI=~p~n See Section ~s~n",[Error, URI, Sections]),
+ if
+ Entities == undefined -> ok;
+ true -> io:format(" Entities =~s~n",[Entities])
+ end,
+ if
+ OutputForm == undefined -> ok;
+ true -> io:format(" OutputForm=~s FIXME!~n",[OutputForm])
+ end,
+ if
+ Recommendation == undefined -> ok;
+ true -> io:format(" Recommendation=~s~n",[Recommendation])
+ end,
+ if
+ Version == undefined -> ok;
+ true -> io:format(" Version =~s~n",[Version])
+ end,
+ if
+ Namespace == undefined -> ok;
+ true -> io:format(" Namespace =~s~n",[Namespace])
+ end,
+ io:format(Data).
+
+
+
+
+
+
+
+
+
+%%% ============================================================================
+%%% Callbacks for parsing of Simplified DocBook XML
+
+para(_Data, _Attrs, US) ->
+ case US of
+ Int when is_integer(Int) -> Int+1;
+ undefined -> 1
+ end.
+
+
diff --git a/lib/xmerl/doc/examples/xml/test.xml b/lib/xmerl/doc/examples/xml/test.xml
new file mode 100755
index 0000000000..e803a83560
--- /dev/null
+++ b/lib/xmerl/doc/examples/xml/test.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" ?>
+<People>
+ <Person Type = "Personal">
+ </Person>
+</People>
+
diff --git a/lib/xmerl/doc/examples/xml/test2.xml b/lib/xmerl/doc/examples/xml/test2.xml
new file mode 100755
index 0000000000..0cb11194fc
--- /dev/null
+++ b/lib/xmerl/doc/examples/xml/test2.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding = "ISO-8859-1" ?>
+<People>
+ <!-- This is a real comment -->
+ <comment>This is a comment</comment>
+ <Person Type = "Personal">
+ </Person>
+</People>
+
diff --git a/lib/xmerl/doc/examples/xml/test3.xml b/lib/xmerl/doc/examples/xml/test3.xml
new file mode 100755
index 0000000000..dbdc1e62c2
--- /dev/null
+++ b/lib/xmerl/doc/examples/xml/test3.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding = 'ISO-8859-1' ?>
+<People>
+ <!-- This is a real comment -->
+ <comment>This is a comment</comment>
+ <Person Type = "Personal">
+ </Person>
+</People>
+
diff --git a/lib/xmerl/doc/examples/xml/test4.xml b/lib/xmerl/doc/examples/xml/test4.xml
new file mode 100755
index 0000000000..e9d85b8d8f
--- /dev/null
+++ b/lib/xmerl/doc/examples/xml/test4.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding = 'ISO-8859-1' ?>
+<People>
+ <!-- This is a real comment -->
+ <comment>
+ This is a comment
+ </comment>
+ <Person Type = "Personal">
+ </Person>
+</People>
diff --git a/lib/xmerl/doc/examples/xml/test5.xml b/lib/xmerl/doc/examples/xml/test5.xml
new file mode 100755
index 0000000000..e9d85b8d8f
--- /dev/null
+++ b/lib/xmerl/doc/examples/xml/test5.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding = 'ISO-8859-1' ?>
+<People>
+ <!-- This is a real comment -->
+ <comment>
+ This is a comment
+ </comment>
+ <Person Type = "Personal">
+ </Person>
+</People>
diff --git a/lib/xmerl/doc/examples/xml/testdtd.dtd b/lib/xmerl/doc/examples/xml/testdtd.dtd
new file mode 100755
index 0000000000..2ce1c513a6
--- /dev/null
+++ b/lib/xmerl/doc/examples/xml/testdtd.dtd
@@ -0,0 +1,17 @@
+<!ELEMENT PARAMETER ( #PCDATA | PARAMETER )* >
+<!ATTLIST PARAMETER NR ( 1000024 | 1000025 | 1000101 | 1000102 | 1000103
+| 1000105 | 1000110 | 1000115 | 1000198 ) #REQUIRED >
+<!ATTLIST PARAMETER UNIT CDATA #REQUIRED >
+
+<!ELEMENT PRODUCT ( USER_DEF, PRODUCTELEMENT+ ) >
+<!ATTLIST PRODUCT CUSTOMER CDATA #REQUIRED >
+<!ATTLIST PRODUCT DESCRIPTION CDATA #REQUIRED >
+<!ATTLIST PRODUCT GENERATOR NMTOKEN #REQUIRED >
+<!ATTLIST PRODUCT PRODUCTID NMTOKEN #REQUIRED >
+
+<!ELEMENT PRODUCTELEMENT ( PARAMETER+ ) >
+<!ATTLIST PRODUCTELEMENT ELEMENTID CDATA #REQUIRED >
+<!ATTLIST PRODUCTELEMENT TYPE NMTOKEN #REQUIRED >
+
+<!ELEMENT USER_DEF ( #PCDATA ) >
+
diff --git a/lib/xmerl/doc/examples/xml/xmerl.xml b/lib/xmerl/doc/examples/xml/xmerl.xml
new file mode 100755
index 0000000000..f02282dbef
--- /dev/null
+++ b/lib/xmerl/doc/examples/xml/xmerl.xml
@@ -0,0 +1,523 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE article
+ PUBLIC "-//OASIS//DTD Simplified DocBook XML V1.0//EN"
+ "http://www.oasis-open.org/docbook/xml/simple/1.0/sdocbook.dtd">
+
+<article lang="en" xml:lang="en" >
+ <articleinfo>
+ <title>XMerL - XML processing tools for Erlang</title>
+ <subtitle>Reference Manual</subtitle>
+ <authorgroup>
+ <author>
+ <firstname>Ulf</firstname>
+ <surname>Wiger</surname>
+ </author>
+ </authorgroup>
+ <revhistory>
+ <revision>
+ <revnumber>1.0</revnumber><date>2003-02-04</date>
+ <revremark>Converted xml from html</revremark>
+ </revision>
+ </revhistory>
+ <abstract>
+ <para>XMerL tools contains xmerl_scan; a non-validating XML
+ processor, xmerl_xpath; a XPath implementation, xmerl for export
+ of XML trees to HTML, XML or text and xmerl_xs for XSLT like
+ transforms in erlang.
+ </para>
+ </abstract>
+ </articleinfo>
+
+ <section>
+ <title>xmerl_scan - the XML processor</title>
+ <para>The (non-validating) XML processor is activated through
+ <computeroutput>xmerl_scan:string/[1,2]</computeroutput> or
+ <computeroutput>xmerl_scan:file/[1,2]</computeroutput>.
+ It returns records of the type defined in xmerl.hrl.
+ </para>
+
+ <para>As far as I can tell, xmerl_scan implements the complete XML
+ 1.0 spec, including:</para>
+ <itemizedlist>
+ <listitem><para>entity expansion</para></listitem>
+ <listitem><para>fetching and parsing external DTDs</para></listitem>
+ <listitem><para>contitional processing</para></listitem>
+ <listitem><para>UniCode</para></listitem>
+ <listitem><para>XML Names</para></listitem>
+ </itemizedlist>
+ <programlisting>
+xmerl_scan:string(Text [ , Options ]) -> #xmlElement{}.
+xmerl_scan:file(Filename [ , Options ]) -> #xmlElement{}. </programlisting>
+
+ <para>The Options are basically to specify the behaviour of the
+ scanner. See the source code for details, but you can specify
+ funs to handle scanner events (event_fun), process the document
+ entities once identified (hook_fun), and decide what to do if the
+ scanner runs into eof before the document is complete
+ (continuation_fun).</para>
+
+ <para>You can also specify a path (fetch_path) as a list of
+ directories to search when fetching files. If the file in question
+ is not in the fetch_path, the URI will be used as a file
+ name.</para>
+
+
+ <section>
+ <title>Customization functions</title>
+ <para>The XML processor offers a number of hooks for
+ customization. These hooks are defined as function objects, and
+ can be provided by the caller.</para>
+
+ <para>The following customization functions are available. If
+ they also have access to their own state variable, the access
+ function for this state is identified within parentheses:</para>
+
+ <itemizedlist>
+
+ <listitem><para>event function (<computeroutput>
+ xmerl_scan:event_state/[1,2]
+ </computeroutput>)</para></listitem>
+
+ <listitem><para>hook function (<computeroutput>
+ xmerl_scan:hook_state/[1,2]
+ </computeroutput>)</para></listitem>
+
+ <listitem><para>fetch function (<computeroutput>
+ xmerl_scan:fetch_state/[1,2] </computeroutput>)
+ </para></listitem>
+
+ <listitem><para>continuation function (<computeroutput>
+ xmerl_scan:cont_state/[1,2] </computeroutput>)
+ </para></listitem>
+
+ <listitem><para>rules function (<computeroutput>
+ xmerl_scan:rules_state/[1,2] </computeroutput>)
+ </para></listitem>
+
+ <listitem><para>accumulator function</para></listitem>
+
+ <listitem><para>close function</para></listitem>
+
+ </itemizedlist>
+
+ <para>For all of the above state access functions, the function
+ with one argument
+ (e.g. <computeroutput>event_fun(GlobalState)</computeroutput>)
+ will read the state variable, while the function with two
+ arguments (e.g.: <computeroutput>event_fun(NewStateData,
+ GlobalState)</computeroutput>) will modify it.</para>
+
+ <para>For each function, the description starts with the syntax
+ for specifying the function in the
+ <computeroutput>Options</computeroutput> list. The general forms
+ are <computeroutput>{Tag, Fun}</computeroutput>, or
+ <computeroutput>{Tag, Fun, LocalState}</computeroutput>. The
+ second form can be used to initialize the state variable in
+ question.</para>
+
+ <section>
+ <title>User State</title>
+
+ <para>All customization functions are free to access a
+ &quot;User state&quot; variable. Care must of course be taken
+ to coordinate the use of this state. It is recommended that
+ functions, which do not really have anything to contribute to
+ the &quot;global&quot; user state, use their own state
+ variable instead. Another option (used in
+ e.g. <computeroutput>xmerl_eventp.erl</computeroutput>) is for
+ customization functions to share one of the local states (in
+ <computeroutput>xmerl_eventp.erl</computeroutput>, the
+ continuation function and the fetch function both acces the
+ <computeroutput>cont_state</computeroutput>.)</para>
+
+ <para>Functions to access user state:</para>
+
+ <itemizedlist>
+
+ <listitem><para><computeroutput>
+ xmerl_scan:user_state(GlobalState) </computeroutput>
+ </para></listitem>
+
+ <listitem><para><computeroutput>xmerl_scan:user_state(UserState',
+ GlobalState) </computeroutput></para></listitem>
+
+ </itemizedlist>
+
+ </section>
+ <section>
+ <title>Event Function</title>
+
+ <para><computeroutput>{event_fun, fun()} | {event_fun, fun(),
+ LocalState}</computeroutput></para>
+
+ <para>The event function is called at the beginning and at the
+ end of a parsed entity. It has the following format and
+ semantics:</para>
+
+<programlisting>
+<![CDATA[
+fun(Event, GlobalState) ->
+ EventState = xmerl_scan:event_state(GlobalState),
+ EventState' = foo(Event, EventState),
+ GlobalState' = xmerl_scan:event_state(EventState', GlobalState)
+end.
+]]></programlisting>
+
+ </section>
+ <section>
+ <title>Hook Function</title>
+ <para> <computeroutput>{hook_fun, fun()} | {hook_fun, fun(),
+ LocalState}</computeroutput></para>
+
+
+
+<para>The hook function is called when the processor has parsed a complete
+entity. Format and semantics:</para>
+
+<programlisting>
+<![CDATA[
+fun(Entity, GlobalState) ->
+ HookState = xmerl_scan:hook_state(GlobalState),
+ {TransformedEntity, HookState'} = foo(Entity, HookState),
+ GlobalState' = xmerl_scan:hook_state(HookState', GlobalState),
+ {TransformedEntity, GlobalState'}
+end.
+]]></programlisting>
+
+ <para>The relationship between the event function, the hook
+ function and the accumulator function is as follows:</para>
+
+ <orderedlist>
+ <listitem><para>The event function is first called with an
+ 'ended' event for the parsed entity.</para></listitem>
+
+ <listitem><para>The hook function is called, possibly
+ re-formatting the entity.</para></listitem>
+
+ <listitem><para>The acc function is called in order to
+ (optionally) add the re-formatted entity to the contents of
+ its parent element.</para></listitem>
+
+ </orderedlist>
+
+ </section>
+ <section>
+ <title>Fetch Function</title>
+<para>
+<computeroutput>{fetch_fun, fun()} | {fetch_fun, fun(), LocalState}</computeroutput>
+</para>
+<para>The fetch function is called in order to fetch an external resource
+(e.g. a DTD).</para>
+
+<para>The fetch function can respond with three different return values:</para>
+
+ <programlisting>
+<![CDATA[
+ Result ::=
+ {ok, GlobalState'} |
+ {ok, {file, Filename}, GlobalState'} |
+ {ok, {string, String}, GlobalState'}
+]]></programlisting>
+
+<para>Format and semantics:</para>
+
+ <programlisting>
+<![CDATA[
+fun(URI, GlobalState) ->
+ FetchState = xmerl_scan:fetch_state(GlobalState),
+ Result = foo(URI, FetchState). % Result being one of the above
+end.
+]]></programlisting>
+
+ </section>
+ <section>
+ <title>Continuation Function</title>
+<para>
+<computeroutput>{continuation_fun, fun()} | {continuation_fun, fun(), LocalState}</computeroutput>
+</para>
+<para>The continuation function is called when the parser encounters the end
+of the byte stream. Format and semantics:</para>
+
+ <programlisting>
+<![CDATA[
+fun(Continue, Exception, GlobalState) ->
+ ContState = xmerl_scan:cont_state(GlobalState),
+ {Result, ContState'} = get_more_bytes(ContState),
+ GlobalState' = xmerl_scan:cont_state(ContState', GlobalState),
+ case Result of
+ [] ->
+ GlobalState' = xmerl_scan:cont_state(ContState', GlobalState),
+ Exception(GlobalState');
+ MoreBytes ->
+ {MoreBytes', Rest} = end_on_whitespace_char(MoreBytes),
+ ContState'' = update_cont_state(Rest, ContState'),
+ GlobalState' = xmerl_scan:cont_state(ContState'', GlobalState),
+ Continue(MoreBytes', GlobalState')
+ end
+end.
+]]></programlisting>
+ </section>
+ <section>
+ <title>Rules Functions</title>
+ <para>
+<computeroutput>
+{rules, ReadFun : fun(), WriteFun : fun(), LocalState} |
+{rules, Table : ets()}</computeroutput>
+</para>
+ <para>The rules functions take care of storing scanner
+ information in a rules database. User-provided rules functions
+ may opt to store the information in mnesia, or perhaps in the
+ user_state(LocalState).</para>
+
+ <para>The following modes exist:</para>
+
+ <itemizedlist>
+
+ <listitem><para>If the user doesn't specify an option, the
+ scanner creates an ets table, and uses built-in functions to
+ read and write data to it. When the scanner is done, the ets
+ table is deleted.</para></listitem>
+
+ <listitem><para>If the user specifies an ets table via the
+ <computeroutput>{rules, Table}</computeroutput> option, the
+ scanner uses this table. When the scanner is done, it does
+ <emphasis>not</emphasis> delete the table.</para></listitem>
+
+ <listitem><para>If the user specifies read and write
+ functions, the scanner will use them instead.</para></listitem>
+
+ </itemizedlist>
+
+ <para>The format for the read and write functions are as
+ follows:</para>
+
+
+<programlisting>
+<![CDATA[
+WriteFun(Context, Name, Definition, ScannerState) -> NewScannerState.
+ReadFun(Context, Name, ScannerState) -> Definition | undefined.
+]]></programlisting>
+
+ <para>Here is a summary of the data objects currently being
+ written by the scanner:</para>
+
+ <table>
+ <title>Scanner data objects</title>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>Context</entry>
+ <entry>Key Value</entry>
+ <entry>Definition</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>notation</entry>
+ <entry>NotationName</entry>
+ <entry><computeroutput>{system, SL} | {public, PIDL, SL}</computeroutput></entry>
+ </row>
+ <row>
+ <entry>elem_def</entry>
+ <entry>ElementName</entry>
+ <entry><computeroutput>#xmlElement{content = ContentSpec}</computeroutput></entry>
+ </row>
+ <row>
+ <entry>parameter_entity</entry>
+ <entry>PEName</entry>
+ <entry><computeroutput>PEDef</computeroutput></entry>
+ </row>
+ <row>
+ <entry>entity</entry>
+ <entry>EntityName</entry>
+ <entry><computeroutput>EntityDef</computeroutput></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+
+<programlisting>
+<![CDATA[
+ContentSpec ::= empty | any | ElemContent
+ElemContent ::= {Mode, Elems}
+Mode ::= seq | choice
+Elems ::= [Elem]
+Elem ::= '#PCDATA' | Name | ElemContent | {Occurrence, Elems}
+Occurrence ::= '*' | '?' | '+'
+]]></programlisting>
+ <note><para>When &lt;Elem&gt; is not wrapped with
+&lt;Occurrence&gt;, (Occurrence = once) is implied.</para></note>
+
+ </section>
+ <section>
+ <title>Accumulator Function</title>
+ <para><computeroutput>{acc_fun, fun()} | {acc_fun, fun(),
+ LocalState}</computeroutput></para>
+
+ <para>The accumulator function is called to accumulate the
+ contents of an entity.When parsing very large files, it may
+ not be desireable to do so.In this case, an acc function can
+ be provided that simply doesn't accumulate.</para>
+
+ <para>Note that it is possible to even modify the parsed
+ entity before accumulating it, but this must be done with
+ care. <computeroutput>xmerl_scan</computeroutput> performs
+ post-processing of the element for namespace management. Thus,
+ the element must keep its original structure for this to
+ work.</para>
+
+ <para>The acc function has the following format and
+ semantics:</para>
+
+ <programlisting>
+<![CDATA[
+%% default accumulating acc fun
+fun(ParsedEntity, Acc, GlobalState) ->
+ {[X|Acc], GlobalState}.
+
+%% non-accumulating acc fun
+fun(ParsedEntity, Acc, GlobalState) ->
+ {Acc, GlobalState}.
+]]></programlisting>
+ </section>
+ <section>
+ <title>Close Function</title>
+
+ <para>The close function is called when a document (either the
+ main document or an external DTD) has been completely
+ parsed. When xmerl_scan was started using
+ <computeroutput>xmerl_scan:file/[1,2]</computeroutput>, the
+ file will be read in full, and closed immediately, before the
+ parsing starts, so when the close function is called, it will
+ not need to actually close the file. In this case, the close
+ function will be a good place to modify the state
+ variables.</para>
+
+ <para>Format and semantics:</para>
+
+ <programlisting>
+<![CDATA[
+fun(GlobalState) ->
+ GlobalState' = .... % state variables may be altered
+]]></programlisting>
+ </section>
+
+ </section>
+
+ </section>
+
+ <section>
+ <title>XPATH</title>
+
+ <programlisting>
+<![CDATA[
+xmerl_xpath:string(QueryString, #xmlElement{}) ->
+ [DocEntity]
+
+DocEntity : #xmlElement{}
+ | #xmlAttribute{}
+ | #xmlText{}
+ | #xmlPI{}
+ | #xmlComment{}
+]]></programlisting>
+
+ <para>The xmerl_xpath module does seem to handle the entire XPATH
+ 1.0 spec, but I haven't tested that much yet. The grammar is
+ defined in
+ <computeroutput>xmerl_xpath_parse.yrl</computeroutput>. The core
+ functions are defined in
+ <computeroutput>xmerl_xpath_pred.erl</computeroutput>.</para>
+ </section>
+ <section>
+ <title>Some useful shell commands for debugging the XPath parser</title>
+<para>
+ <command>
+<![CDATA[
+c(xmerl_xpath_scan).
+yecc:yecc("xmerl_xpath_parse.yrl", "xmerl_xpath_parse", true, []).
+c(xmerl_xpath_parse).
+
+xmerl_xpath_parse:parse(xmerl_xpath_scan:tokens("position() > -1")).
+xmerl_xpath_parse:parse(xmerl_xpath_scan:tokens("5 * 6 div 2")).
+xmerl_xpath_parse:parse(xmerl_xpath_scan:tokens("5 + 6 mod 2")).
+xmerl_xpath_parse:parse(xmerl_xpath_scan:tokens("5 * 6")).
+xmerl_xpath_parse:parse(xmerl_xpath_scan:tokens("5 * 6")).
+xmerl_xpath_parse:parse(xmerl_xpath_scan:tokens("-----6")).
+xmerl_xpath_parse:parse(xmerl_xpath_scan:tokens("parent::node()")).
+xmerl_xpath_parse:parse(xmerl_xpath_scan:tokens("descendant-or-self::node()")).
+xmerl_xpath_parse:parse(xmerl_xpath_scan:tokens("parent::processing-instruction('foo')")).]]></command></para>
+ </section>
+ <section>
+ <title>Erlang Data Structure Export</title>
+
+ <para>The idea as follows:</para>
+
+ <para>The Erlang data structure should look like this:</para>
+ <programlisting>
+<![CDATA[
+Element: {Tag, Attributes, Content}
+Tag : atom()
+Attributes: [{Key, Value}]
+Content: [String | Element]
+String: [char() | binary() | String]
+]]></programlisting>
+
+ <para>Some short forms are allowed:</para>
+ <programlisting>
+<![CDATA[
+{Tag, Content} -> {Tag, [], Content}
+Tag -> {Tag, [], []}
+]]></programlisting>
+
+ <para>Note that content lists must be flat, but strings can be
+ deep.</para>
+
+ <para>It is also allowed to include normal
+ <computeroutput>#xml...</computeroutput> elements in the simple
+ format.</para>
+
+ <para><computeroutput>xmerl:export_simple(Data,
+ Callback)</computeroutput> takes the above data structure and
+ exports it, using the callback module
+ <computeroutput>Callback</computeroutput>.</para>
+
+ <para>The callback module should contain hook functions for all
+ tags present in the data structure. The hook function must have
+ the format:</para>
+ <para><computeroutput> Tag(Data, Attrs, Parents, E)
+ </computeroutput></para>
+
+ <para>where E is an <computeroutput>#xmlElement{}</computeroutput>
+ record (see <computeroutput>xmerl.hrl</computeroutput>).</para>
+
+ <para>Attrs is converted from the simple <computeroutput>[{Key,
+ Value}]</computeroutput> to
+ <computeroutput>[#xmlAttribute{}]</computeroutput></para>
+
+ <para>Parents is a list of <computeroutput>[{ParentTag,
+ ParentTagPosition}]</computeroutput>.</para>
+
+ <para>The hook function should return either the Data to be
+ exported, or the tuple <computeroutput>{'#xml-redefine#',
+ NewStructure}</computeroutput>, where
+ <computeroutput>NewStructure</computeroutput> is an element (which
+ can be simple), or a (simple-) content list wrapped in a 1-tuple
+ as <computeroutput>{NewContent}</computeroutput>.</para>
+
+ <para>The callback module can inherit definitions from other
+ callback modules, through the required function
+ <computeroutput>'#xml-interitance#() ->
+ [ModuleName]</computeroutput>. </para>
+
+ <para>As long as a tag is represented in one of the callback
+ modules, things will work. It is of course also possible to
+ redefine a tag.</para>
+ <section>
+ <title>XSLT like transforms</title>
+ <para>See separate document <ulink url="xmerl_xs.html" >xmerl_xs.html
+ </ulink></para>.
+ </section>
+ </section>
+
+</article>
diff --git a/lib/xmerl/doc/examples/xml/xmerl_xs.xml b/lib/xmerl/doc/examples/xml/xmerl_xs.xml
new file mode 100644
index 0000000000..9a798808b9
--- /dev/null
+++ b/lib/xmerl/doc/examples/xml/xmerl_xs.xml
@@ -0,0 +1,541 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE article
+ PUBLIC "-//OASIS//DTD Simplified DocBook XML V1.0//EN"
+ "http://www.oasis-open.org/docbook/xml/simple/1.0/sdocbook.dtd">
+
+<article lang="en" xml:lang="en" >
+ <articleinfo>
+ <title>XSLT like transformations in Erlang </title>
+ <subtitle>User Guide</subtitle>
+ <authorgroup>
+ <author>
+ <firstname>Mikael</firstname>
+ <surname>Karlsson</surname>
+ </author>
+ </authorgroup>
+ <revhistory>
+ <revision>
+ <revnumber>1.0</revnumber><date>2002-10-25</date>
+ <revremark>First Draft</revremark>
+ </revision>
+ <revision>
+ <revnumber>1.1</revnumber><date>2003-02-05</date>
+ <revremark>Moved module xserl to xmerl application, renamed to
+ xmerl_xs</revremark>
+ </revision>
+ </revhistory>
+ <abstract>
+ <para>Erlang has similarities to XSLT since both languages
+ have a functional programming approach. Using the xpath implementation
+ in the existing xmerl application it is possible to write XSLT
+ like transforms in Erlang. One can also combine the
+ transformations with the erlang scripting possibility
+ in the yaws webserver to implement "on the fly" html
+ conversions of xml documents.
+ </para>
+ </abstract>
+ </articleinfo>
+
+
+ <section>
+ <title>Terminology</title>
+ <variablelist>
+ <varlistentry>
+ <term>XML</term>
+ <listitem>
+ <para>Extensible Markup Language</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>XSLT</term>
+ <listitem>
+ <para>Extensible Stylesheet Language: Transformations</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </section>
+ <section>
+ <title>Introduction</title>
+ <para>XSLT stylesheets are often used when transforming XML
+ documents, to other XML documents or (X)HTML for presentation.
+ There are a number of brick-sized books written on the
+ topic. XSLT contains quite many
+ functions and learning them all may take some effort, which
+ could be a reason why the author only has reached a basic level of
+ understanding. This document assumes a basic level of
+ understanding of XSLT.
+ </para>
+ <para>Since XSLT is based on a functional programming approach
+ with pattern matching and recursion it is possible to write
+ similar style sheets in Erlang. At least for basic
+ transforms. XPath which is used in XSLT is also already
+ implemented in the xmerl application written i Erlang. This
+ document describes how to use the XPath implementation together
+ with Erlangs pattern matching and a couple of functions to write
+ XSLT like transforms.</para>
+ <para>This approach is probably easier for an Erlanger but
+ if you need to use real XSLT stylesheets in order to "comply to
+ the standard" there is an adapter available to the Sablotron
+ XSLT package which is written i C++.
+ </para>
+ <para>
+ This document is written in the Simplified Docbook DTD which is
+ a subset of the complete one and converted to xhtml using a
+ stylesheet written in Erlang.
+ </para>
+ </section>
+
+ <section>
+ <title>Tools</title>
+ <section>
+ <title>xmerl</title>
+ <para><ulink url="http://sowap.sourceforge.net/" >xmerl</ulink>
+ is a xml parser written in Erlang</para>
+ <section>
+ <title>xmerl_xpath</title>
+ <para>XPath is in important part of XSLT and is implemented in
+ xmerl</para>
+ </section>
+ <section>
+ <title>xmerl_xs</title>
+ <para>
+ <ulink url="xmerl_xs.yaws" >xmerl_xs</ulink> is a very small
+ module acting as "syntactic sugar" for the XSLT lookalike
+ transforms. It uses xmerl_xpath.
+ </para>
+ </section>
+ </section>
+
+ <section>
+ <title>yaws</title>
+ <para>
+ <ulink url="http://yaws.hyber.org/" >Yaws</ulink>, Yet Another
+ Webserver, is a web server written in Erlang that support dynamic
+ content generation using embedded scripts, also written in Erlang.
+ </para>
+<!--
+ <figure>
+ <title>The Yaws logo</title>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="yaws_pb.gif" format="GIF" scale="50%"/>
+ </imageobject>
+ </mediaobject>
+ </figure>
+-->
+ <para>Yaws is not needed to make the XSLT like transformations, but
+ combining yaws and xmerl it is possible to do transformations
+ of XML documents to HTML in realtime, when clients requests a
+ web page. As an example I am able to edit this document using
+ emacs with psgml tools, save the document and just do a reload
+ in my browser to see the result. The parse/transform time is not
+ visually different compared to loading any other document in the
+ browser.
+ </para>
+ </section>
+
+ </section>
+
+ <section>
+ <title>Transformations</title>
+<para>
+ When xmerl_scan parses an xml string/file it returns a record of:
+</para>
+ <programlisting>
+<![CDATA[
+ -record(xmlElement, {
+ name,
+ parents = [],
+ pos,
+ attributes = [],
+ content = [],
+ language = [],
+ expanded_name = [],
+ nsinfo = [],% {Prefix, Local} | []
+ namespace = #xmlNamespace{}
+ }).
+ ]]>
+</programlisting>
+<para>
+ Were content is a mixed list of yet other xmlElement records and/or
+ xmlText (or other node types).
+</para>
+ <section>
+ <title>xmerl_xs functions</title>
+ <para>
+ Functions used:
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term>xslapply/2</term>
+ <listitem>
+ <para>function to make things look similar
+ to xsl:apply-templates.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>value_of/1</term>
+ <listitem>
+ <para>Conatenates all text nodes within a tree.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>select/2</term>
+ <listitem>
+ <para>select(Str, E) extracts nodes from the XML tree using
+ xmerl_xpath.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>built_in_rules/2</term>
+ <listitem>
+ <para>The default fallback behaviour, template funs should
+ end with:
+ <computeroutput>template(E)->built_in_rules(fun
+ template/1, E).
+</computeroutput>
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+<note><para>Text is escaped using xmerl_lib:export_text/1 for
+ "&lt;", "&gt;" and other relevant xml
+ characters when exported. So the value_of/1 and built_in_rules/2
+ functions should be replaced when not exporting to xml or html.
+</para></note>
+ </section>
+
+
+<section><title>Examples</title>
+ <example>
+ <title>Using xslapply</title>
+ <para>original XSLT:</para>
+ <programlisting>
+<![CDATA[
+ <xsl:template match="doc/title">
+ <h1>
+ <xsl:apply-templates/>
+ </h1>
+ </xsl:template>
+ ]]>
+ </programlisting>
+ <para>
+ becomes in Erlang:</para>
+ <programlisting>
+<![CDATA[
+ template(E = #xmlElement{ parents=[{'doc',_}|_], name='title'}) ->
+ ["<h1>",
+ xslapply(fun template/1, E),
+ "</h1>"];
+ ]]>
+ </programlisting>
+
+ </example>
+ <example>
+ <title>Using value_of and select</title>
+ <programlisting>
+<![CDATA[
+ <xsl:template match="title">
+ <div align="center"><h1><xsl:value-of select="." /></h1></div>
+ </xsl:template>
+ ]]>
+ </programlisting>
+ <para>
+ becomes:
+ </para>
+ <programlisting>
+<![CDATA[
+template(E = #xmlElement{name='title'}) ->
+ ["<div align=\"center\"><h1>", value_of(select(".", E)), "</h1></div>"];
+ ]]>
+ </programlisting>
+ </example>
+ <example>
+ <title>Simple xsl stylesheet</title>
+<para>
+ A complete example with the XSLT sheet in the xmerl distribution.
+</para>
+ <programlisting>
+<![CDATA[
+
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns="http://www.w3.org/TR/xhtml1/strict">
+
+ <xsl:strip-space elements="doc chapter section"/>
+ <xsl:output
+ method="xml"
+ indent="yes"
+ encoding="iso-8859-1"
+ />
+
+ <xsl:template match="doc">
+ <html>
+ <head>
+ <title>
+ <xsl:value-of select="title"/>
+ </title>
+ </head>
+ <body>
+ <xsl:apply-templates/>
+ </body>
+ </html>
+ </xsl:template>
+
+ <xsl:template match="doc/title">
+ <h1>
+ <xsl:apply-templates/>
+ </h1>
+ </xsl:template>
+
+ <xsl:template match="chapter/title">
+ <h2>
+ <xsl:apply-templates/>
+ </h2>
+ </xsl:template>
+
+ <xsl:template match="section/title">
+ <h3>
+ <xsl:apply-templates/>
+ </h3>
+ </xsl:template>
+
+ <xsl:template match="para">
+ <p>
+ <xsl:apply-templates/>
+ </p>
+ </xsl:template>
+
+ <xsl:template match="note">
+ <p class="note">
+ <b>NOTE: </b>
+ <xsl:apply-templates/>
+ </p>
+ </xsl:template>
+
+ <xsl:template match="emph">
+ <em>
+ <xsl:apply-templates/>
+ </em>
+ </xsl:template>
+
+</xsl:stylesheet>
+ ]]>
+ </programlisting>
+ </example>
+ <example>
+ <title>Erlang version</title>
+ <para>
+ Erlang transformation of previous example:
+ </para>
+ <programlisting>
+<![CDATA[
+
+-include("xmerl.hrl").
+
+-import(xmerl_xs,
+ [ xslapply/2, value_of/1, select/2, built_in_rules/2 ]).
+
+doctype()->
+ "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\
+ \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd \">".
+
+process_xml(Doc)->
+ template(Doc).
+
+template(E = #xmlElement{name='doc'})->
+ [ "<\?xml version=\"1.0\" encoding=\"iso-8859-1\"\?>",
+ doctype(),
+ "<html xmlns=\"http://www.w3.org/1999/xhtml\" >"
+ "<head>"
+ "<title>", value_of(select("title",E)), "</title>"
+ "</head>"
+ "<body>",
+ xslapply( fun template/1, E),
+ "</body>"
+ "</html>" ];
+
+
+template(E = #xmlElement{ parents=[{'doc',_}|_], name='title'}) ->
+ ["<h1>",
+ xslapply( fun template/1, E),
+ "</h1>"];
+
+template(E = #xmlElement{ parents=[{'chapter',_}|_], name='title'}) ->
+ ["<h2>",
+ xslapply( fun template/1, E),
+ "</h2>"];
+
+template(E = #xmlElement{ parents=[{'section',_}|_], name='title'}) ->
+ ["<h3>",
+ xslapply( fun template/1, E),
+ "</h3>"];
+
+template(E = #xmlElement{ name='para'}) ->
+ ["<p>", xslapply( fun template/1, E), "</p>"];
+
+template(E = #xmlElement{ name='note'}) ->
+ ["<p class=\"note\">"
+ "<b>NOTE: </b>",
+ xslapply( fun template/1, E),
+ "</p>"];
+
+template(E = #xmlElement{ name='emph'}) ->
+ ["<em>", xslapply( fun template/1, E), "</em>"];
+
+template(E)->
+ built_in_rules( fun template/1, E).
+ ]]>
+ </programlisting>
+ <para>
+ It is important to end with a call to
+ <computeroutput>xmerl_xs:built_in_rules/2</computeroutput>
+ if you want any text to be written in "push" transforms.
+ That are the ones using a lot <computeroutput>xslapply( fun
+ template/1, E )</computeroutput> instead of
+ <computeroutput>value_of(select("xpath",E))</computeroutput>,
+ which is pull...
+ </para>
+ </example>
+<para>The largest example is the stylesheet to transform this document
+ from the Simplified Docbook XML format to xhtml. The source
+ file is <computeroutput>sdocbook2xhtml.erl</computeroutput>.
+</para>
+</section>
+ <section>
+ <title>Tips and tricks</title>
+ <section>
+ <title>for-each</title>
+ <para>The function for-each is quite common in XSLT stylesheets.
+ It can often be rewritten and replaced by select/1. Since
+ select/1 returns a list of #xmlElements and xslapply/2
+ traverses them it is more or less the same as to loop over all
+ the elements.
+ </para>
+ </section>
+ <section>
+ <title>position()</title>
+ <para>The XSLT position() and #xmlElement.pos are not the
+ same. One has to make an own position in Erlang.</para>
+ <example>
+ <title>Counting positions</title>
+ <programlisting>
+<![CDATA[
+<xsl:template match="stanza">
+ <p><xsl:apply-templates select="line" /></p>
+</xsl:template>
+
+<xsl:template match="line">
+ <xsl:if test="position() mod 2 = 0">&#160;&#160;</xsl:if>
+ <xsl:value-of select="." /><br />
+</xsl:template>
+ ]]>
+ </programlisting>
+<para>Can be written as</para>
+ <programlisting>
+<![CDATA[
+template(E = #xmlElement{name='stanza'}) ->
+ {Lines,LineNo} = lists:mapfoldl(fun template_pos/2, 1, select("line", E)),
+ ["<p>", Lines, "</p>"].
+
+template_pos(E = #xmlElement{name='line'}, P) ->
+ {[indent_line(P rem 2), value_of(E#xmlElement.content), "<br />"], P + 1 }.
+
+indent_line(0)->"&#160;&#160;";
+indent_line(_)->"".
+ ]]>
+ </programlisting>
+ </example>
+ </section>
+ <section>
+ <title>Global tree awareness</title>
+ <para>In XSLT you have "root" access to the top of the tree
+ with XPath, even though you are somewhere deep in your
+ tree.</para>
+ <para>The xslapply/2 function only carries back the child part
+ of the tree to the template fun. But it is quite easy to write
+ template funs that handles both the child and top tree.</para>
+ <example>
+ <title>Passing the root tree</title>
+ <para>The following example piece will prepend the article
+ title to any section title</para>
+ <programlisting>
+<![CDATA[
+template(E = #xmlElement{name='title'}, ETop ) ->
+ ["<h3>", value_of(select("title", ETop))," - ",
+ xslapply( fun(A) -> template(A, ETop) end, E),
+ "</h3>"];
+ ]]>
+ </programlisting>
+ </example>
+ </section>
+ </section>
+
+ </section>
+
+
+ <section>
+ <title>Utility functions</title>
+ <para>
+ The module xmerl_xs contains the functions
+ <computeroutput>mapxml/2, foldxml/3</computeroutput> and
+ <computeroutput> mapfoldxml/3</computeroutput> to traverse
+ <literal>#xmlElement</literal> trees. They can be used in order
+ to build cross-references, see sdocbook2xhtml.erl for instance
+ where <computeroutput>foldxml/3</computeroutput> and
+ <computeroutput> mapfoldxml/3</computeroutput> are used to
+ number chapters, examples and figures and to build the Table of
+ contents for the document.
+ </para>
+ </section>
+
+
+ <section>
+ <title>Future enhancements</title>
+ <para>
+ More wish- than task-list at the moment.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>More stylesheets</para>
+ </listitem>
+ <listitem>
+ <para>On the fly exports to PDF for printing and also more
+ "polished" presentations.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section>
+ <title>References</title>
+ <orderedlist>
+ <listitem>
+ <para><ulink url="../xml/xmerl_xs.xml" >XML source
+ file</ulink> for this document.
+ </para>
+ </listitem>
+ <listitem>
+ <para><ulink url="../xs/sdocbook2xhtml.erl" >Erlang style
+ sheet</ulink> used for this document. (Simplified Docbook DTD).</para>
+ </listitem>
+ <listitem>
+ <para><ulink url="http://www.erlang.org/" >Open Source Erlang</ulink>
+ </para>
+ </listitem>
+ </orderedlist>
+
+ </section>
+</article>
+
+<!--
+Local Variables:
+mode: xml
+sgml-indent-step: 2
+sgml-indent-data: t
+sgml-set-face: t
+sgml-insert-missing-element-comment: nil
+End:
+-->
diff --git a/lib/xmerl/doc/examples/xserl_test.erl b/lib/xmerl/doc/examples/xserl_test.erl
new file mode 100644
index 0000000000..69db75cfe8
--- /dev/null
+++ b/lib/xmerl/doc/examples/xserl_test.erl
@@ -0,0 +1,85 @@
+-module(xserl_test).
+-include("xmerl.hrl").
+-import(xserl,[ xslapply/2, value_of/1, select/2, built_in_rules/2 ]).
+-export([process_xml/1,test/0]).
+
+doctype()->
+ "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\
+ \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd \">".
+
+test() ->
+ Str= "<?xml version=\"1.0\"?>"
+ "<doc xmlns='urn:loc.gov:books' xmlns:isbn='urn:ISBN:0-395-36341-6'>"
+ "<title>Cheaper by the Dozen</title>"
+ "<isbn:number>1568491379</isbn:number>"
+ "<note>"
+ "<!-- make HTML the default namespace for some commentary -->"
+ "<p xmlns='urn:w3-org-ns:HTML'>"
+ "This is a <i>funny</i> book!"
+ "</p>"
+ "</note>"
+ "</doc>",
+ {Doc,_}=xmerl_scan:string(Str,[{fetch_fun, fun(DTDSpec,S) -> {ok,S} end}]),
+
+ process_xml(Doc).
+
+process_xml(Doc)->
+ template(Doc).
+
+template(E = #xmlElement{name='doc'})->
+ [ "<\?xml version=\"1.0\" encoding=\"iso-8859-1\"\?>",
+ doctype(),
+ "<html xmlns=\"http://www.w3.org/1999/xhtml\" >"
+ "<head>"
+ "<title>", xserl:value_of(select("title",E)), "</title>"
+ "</head>"
+ "<body>",
+ xslapply( fun template/1, E),
+ "</body>"
+ "</html>" ];
+
+
+template(E = #xmlElement{ parents=[{'doc',_}|_], name='title'}) ->
+ ["<h1>",
+%% xslapply( fun template/1, E),
+%% same as
+ lists:map( fun template/1, E#xmlElement.content ),
+ "</h1>"];
+
+template(E = #xmlElement{ parents=[{'chapter',_}|_], name='title'}) ->
+ ["<h2>",
+ xslapply( fun template/1, E),
+ "</h2>"];
+
+template(E = #xmlElement{ parents=[{'section',_}|_], name='title'}) ->
+ ["<h3>",
+ xslapply( fun template/1, E),
+ "</h3>"];
+
+template(E = #xmlElement{ name='para'}) ->
+ ["<p>",
+ xslapply( fun template/1, E),
+ "</p>"];
+
+template(E = #xmlElement{ name='note'}) ->
+ ["<p class=\"note\">"
+ "<b>NOTE: </b>",
+ xslapply( fun template/1, E),
+ "</p>"];
+
+template(E = #xmlElement{ name='emph'}) ->
+ ["<em>",
+ xslapply( fun template/1, E),
+ "</em>"];
+
+template(E)->
+ built_in_rules( fun template/1, E).
+
+%% It is important to end with a call to xserl:built_in_rules/2
+%% if you want any text to be written in "push" transforms.
+%% That are the ones using a lot xslapply( fun template/1, E )
+%% instead of value_of(select("xpath",E)), which is pull...
+%% Could maybe be caught as an exception in xslapply instead,
+%% but I think that could degrade performance - having an
+%% exception for every #xmlText element.
+
diff --git a/lib/xmerl/doc/src/notes.xml b/lib/xmerl/doc/src/notes.xml
index aa66cbec77..8542435456 100644
--- a/lib/xmerl/doc/src/notes.xml
+++ b/lib/xmerl/doc/src/notes.xml
@@ -31,6 +31,35 @@
<p>This document describes the changes made to the Xmerl application.</p>
+<section><title>Xmerl 1.2.8</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p> The function xmerl_lib:expand_content/1 is mainly for
+ expanding Simple XML, but can also handle xmerl records.
+ This patch fixes an omission that caused expand_content/1
+ to not maintain the parents list when expanding
+ #xmlElement{} records. (Thanks to Ulf Wiger) </p>
+ <p>
+ Own Id: OTP-9034</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p> Removed some dialyzer warnings. </p>
+ <p>
+ Own Id: OTP-9074</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Xmerl 1.2.7</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/xmerl/doc/src/notes_history.xml b/lib/xmerl/doc/src/notes_history.xml
index 06d0cb3b40..a8f7d8b3a6 100644
--- a/lib/xmerl/doc/src/notes_history.xml
+++ b/lib/xmerl/doc/src/notes_history.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2006</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/xmerl/doc/src/xmerl_sax_parser.xml b/lib/xmerl/doc/src/xmerl_sax_parser.xml
index ea63ba22a1..972023622e 100644
--- a/lib/xmerl/doc/src/xmerl_sax_parser.xml
+++ b/lib/xmerl/doc/src/xmerl_sax_parser.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2008</year>
- <year>2008</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/lib/xmerl/src/xmerl_lib.erl b/lib/xmerl/src/xmerl_lib.erl
index 7b76a76a33..6402f1cbeb 100644
--- a/lib/xmerl/src/xmerl_lib.erl
+++ b/lib/xmerl/src/xmerl_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2011. 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
@@ -148,9 +148,10 @@ expand_element(Element) ->
expand_element(Element, Pos, Parents) ->
expand_element(Element, Pos, Parents, false).
-expand_element(E = #xmlElement{}, Pos, Parents, Norm) ->
- Content = expand_content(E#xmlElement.content, 1, Parents, Norm),
- Attrs = expand_attributes(E#xmlElement.attributes, 1, []),
+expand_element(E = #xmlElement{name = N}, Pos, Parents, Norm) ->
+ NewParents = [{N,Pos}|Parents],
+ Content = expand_content(E#xmlElement.content, 1, NewParents, Norm),
+ Attrs = expand_attributes(E#xmlElement.attributes, 1, NewParents),
E#xmlElement{pos = Pos,
parents = Parents,
attributes = Attrs,
diff --git a/lib/xmerl/src/xmerl_sax_parser.erl b/lib/xmerl/src/xmerl_sax_parser.erl
index eb9f8deec6..c1acf51b8a 100644
--- a/lib/xmerl/src/xmerl_sax_parser.erl
+++ b/lib/xmerl/src/xmerl_sax_parser.erl
@@ -278,6 +278,7 @@ detect_charset_1(Xml, State) ->
convert_encoding(Enc) -> %% Just for 7,8 bit + utf8
case string:to_lower(Enc) of
"utf-8" -> utf8;
+ "us-ascii" -> utf8;
"iso-8859-1" -> latin1; % Handle all iso-8859 as latin1
"iso-8859-2" -> latin1;
"iso-8859-3" -> latin1;
diff --git a/lib/xmerl/src/xmerl_sax_parser_utf16be.erlsrc b/lib/xmerl/src/xmerl_sax_parser_utf16be.erlsrc
index fae5346e6a..5c995a5a9c 100644
--- a/lib/xmerl/src/xmerl_sax_parser_utf16be.erlsrc
+++ b/lib/xmerl/src/xmerl_sax_parser_utf16be.erlsrc
@@ -2,7 +2,7 @@
%%--------------------------------------------------------------------
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -35,6 +35,6 @@
%% STRING_REST and STRING_UNBOUND_REST is only different in the list case
-define(STRING_UNBOUND_REST(MatchChar, Rest), <<MatchChar/big-utf16, Rest/binary>>).
--define(BYTE_ORDER_MARK_1, undefined).
+-define(BYTE_ORDER_MARK_1, undefined_bom1).
-define(BYTE_ORDER_MARK_2, <<16#FE>>).
-define(BYTE_ORDER_MARK_REST(Rest), <<16#FE, 16#FF, Rest/binary>>).
diff --git a/lib/xmerl/src/xmerl_sax_parser_utf16le.erlsrc b/lib/xmerl/src/xmerl_sax_parser_utf16le.erlsrc
index 5e1f0a217c..5c6ca0caba 100644
--- a/lib/xmerl/src/xmerl_sax_parser_utf16le.erlsrc
+++ b/lib/xmerl/src/xmerl_sax_parser_utf16le.erlsrc
@@ -2,7 +2,7 @@
%%--------------------------------------------------------------------
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2011. 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
@@ -35,6 +35,6 @@
%% STRING_REST and STRING_UNBOUND_REST is only different in the list case
-define(STRING_UNBOUND_REST(MatchChar, Rest), <<MatchChar/little-utf16, Rest/binary>>).
--define(BYTE_ORDER_MARK_1, undefined).
+-define(BYTE_ORDER_MARK_1, undefined_bom1).
-define(BYTE_ORDER_MARK_2, <<16#FF>>).
-define(BYTE_ORDER_MARK_REST(Rest), <<16#FF, 16#FE, Rest/binary>>).
diff --git a/lib/xmerl/src/xmerl_scan.erl b/lib/xmerl/src/xmerl_scan.erl
index e07d495fc7..22eb641a02 100644
--- a/lib/xmerl/src/xmerl_scan.erl
+++ b/lib/xmerl/src/xmerl_scan.erl
@@ -102,6 +102,7 @@
%% declaration. </dd>
%% </dl>
+
-module(xmerl_scan).
-vsn('0.20').
-date('03-09-16').
@@ -2283,8 +2284,16 @@ scan_att_chars("&" ++ T, S0, Delim, Acc, TmpAcc,AT,IsNorm) -> % Reference
true ->
scan_att_chars(T1,S1,Delim,[ExpRef|Acc],[ExpRef|TmpAcc],AT,IsNorm);
_ ->
- scan_att_chars(string_to_char_set(S#xmerl_scanner.encoding,ExpRef)
- ++ T1, S1, Delim, Acc,TmpAcc, AT,IsNorm)
+ Ch = string_to_char_set(S#xmerl_scanner.encoding, ExpRef),
+ case T of
+ "#" ++ _ ->
+ %% normalization rules (sec 3.3.3) require that for
+ %% character references, the referenced character be
+ %% added directly to the normalized value
+ scan_att_chars(T1, S1, Delim, Ch ++ Acc,TmpAcc, AT,IsNorm);
+ _ ->
+ scan_att_chars(Ch ++ T1, S1, Delim, Acc,TmpAcc, AT,IsNorm)
+ end
end;
scan_att_chars("<" ++ _T, S0, _Delim, _Acc,_, _,_) -> % Tags not allowed here
?fatal(unexpected_char, S0);
@@ -3909,7 +3918,7 @@ schemaLocations(#xmlElement{attributes=Atts,xmlbase=_Base}) ->
case lists:dropwhile(Pred,Atts) of
[#xmlAttribute{value=Paths}|_] ->
- case string:tokens(Paths," ") of
+ case string:tokens(Paths," \n\t\r") of
L when length(L) > 0 ->
case length(L) rem 2 of
0 ->
diff --git a/lib/xmerl/src/xmerl_uri.erl b/lib/xmerl/src/xmerl_uri.erl
index d8edb2e6e1..a0c6f1c2a7 100644
--- a/lib/xmerl/src/xmerl_uri.erl
+++ b/lib/xmerl/src/xmerl_uri.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2011. 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
@@ -359,9 +359,9 @@ scan_host(C0) ->
%% Hex4=<?HEX ->
%% {C1,lists:reverse(lists:append(IPv6address))};
{C1,Hostname,[A|_HostF]} ->
- {C1,lists:reverse(lists:append(Hostname))};
- _ ->
- {error,no_host}
+ {C1,lists:reverse(lists:append(Hostname))}
+%% _ ->
+%% {error,no_host}
end.
scan_host2([H|C0],Acc,CurF,Host,HostF) when $0=<H,H=<$9 ->
diff --git a/lib/xmerl/src/xmerl_xpath.erl b/lib/xmerl/src/xmerl_xpath.erl
index e654a8ef1d..c803af3631 100644
--- a/lib/xmerl/src/xmerl_xpath.erl
+++ b/lib/xmerl/src/xmerl_xpath.erl
@@ -19,8 +19,8 @@
%% Description : Implements a search engine based on XPath
-%% @doc The xmerl_xpath module handles the entire XPath 1.0 spec
-%% XPath expressions typically occurs in XML attributes and are used to addres
+%% @doc The xmerl_xpath module handles the entire XPath 1.0 spec.
+%% XPath expressions typically occur in XML attributes and are used to address
%% parts of an XML document.
% The grammar is defined in <code>xmerl_xpath_parse.yrl</code>.
% The core functions are defined in <code>xmerl_xpath_pred.erl</code>.
diff --git a/lib/xmerl/src/xmerl_xsd.erl b/lib/xmerl/src/xmerl_xsd.erl
index c0923520c2..1f0793bc58 100644
--- a/lib/xmerl/src/xmerl_xsd.erl
+++ b/lib/xmerl/src/xmerl_xsd.erl
@@ -2420,8 +2420,8 @@ validate_xml(XMLEl=#xmlElement{},SEl=#schema_element{},S) ->
%% 2 often
check_element_type(XML=[XMLTxt=#xmlText{}|Rest],CM=[CMEl|CMRest],Env,
Block,S,Checked) ->
- %% XMLTxt ��r det f��rsta av content i element,
- %% CMEl ��r den till��tna typen enligt schemat
+ %% XMLTxt is the first part of the elements content,
+ %% CMEl is the allowed type according to the schema
case is_whitespace(XMLTxt) of
true -> %% Ignore XMLEl
check_element_type(Rest,CM,Env,Block,S,[XMLTxt|Checked]);
@@ -2453,7 +2453,7 @@ check_element_type(XML=[#xmlElement{}|_],[{choice,{CM,Occ}}|_CMRest],
check_element_type(XML=[#xmlElement{}|_],[{all,{CM,Occ}}|_CMRest],
Env,_Block,S,Checked) ->
?debug("calling choice/6~n",[]),
- check_all(XML,CM,Occ,Env,S,Checked,XML);
+ check_all(XML,CM,Occ,Env,set_num_el(S,0),Checked,XML); %%LTH
%% 3 often. CMEL may be ((simpleType | complexType)?, (unique | key | keyref)*))
check_element_type(XML=[XMLEl=#xmlElement{}|_],[CMEl|CMRest],Env,
Block,S,Checked) ->
@@ -2921,7 +2921,7 @@ schemaLocations(El=#xmlElement{attributes=Atts},S) ->
[] ->
S;
[#xmlAttribute{value=Paths}|_] ->
- case string:tokens(Paths," ") of
+ case string:tokens(Paths," \n\t\r") of
L when length(L) > 0 ->
case length(L) rem 2 of
0 ->
@@ -3393,8 +3393,12 @@ qualified_node_set(Paths,[QN|QNs],El,S,Acc) ->
end
end,
{KeySequence,S2} = mapfoldl(Fun,S,Paths),
- qualified_node_set(Paths,QNs,El,S2,[flatten(KeySequence)|Acc]).
-
+ case flatten(KeySequence) of
+ [] ->
+ qualified_node_set(Paths,QNs,El,S2,Acc);
+ KS ->
+ qualified_node_set(Paths,QNs,El,S2,[KS|Acc])
+ end.
apply_field(F,El,S) ->
%% xmerl_xpath:string returns a list
diff --git a/lib/xmerl/src/xmerl_xsd_type.erl b/lib/xmerl/src/xmerl_xsd_type.erl
index 19951f030f..9352f4185d 100644
--- a/lib/xmerl/src/xmerl_xsd_type.erl
+++ b/lib/xmerl/src/xmerl_xsd_type.erl
@@ -612,7 +612,7 @@ check_NMTOKEN2([H|T]) ->
check_NMTOKEN2(T).
check_NMTOKENS(Value) ->
- TokList = string:tokens(Value," "),
+ TokList = string:tokens(Value," \n\t\r"),
lists:foreach(fun check_NMTOKEN/1,TokList),
{ok,Value}.
@@ -645,7 +645,7 @@ check_ENTITIES(Value) ->
check_list_type(Value,fun check_ENTITY/1).
check_list_type(Value,BaseTypeFun) ->
- Tokens = string:tokens(Value," "),
+ Tokens = string:tokens(Value," \n\t\r"),
lists:foreach(BaseTypeFun,Tokens),
{ok,Value}.
diff --git a/lib/xmerl/test/Makefile b/lib/xmerl/test/Makefile
new file mode 100644
index 0000000000..0f8cd88c13
--- /dev/null
+++ b/lib/xmerl/test/Makefile
@@ -0,0 +1,127 @@
+#
+# %CopyrightBegin%
+#
+# Copyright Ericsson AB 2004-2010. 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%
+#
+include $(ERL_TOP)/make/target.mk
+include $(ERL_TOP)/make/$(TARGET)/otp.mk
+
+# ----------------------------------------------------
+# Common Macros
+# ----------------------------------------------------
+
+include ../vsn.mk
+VSN = $(XMERL_VSN)
+
+RM = rm -f
+
+# ----------------------------------------------------
+# Target Specs
+# ----------------------------------------------------
+
+HRL_DIR= $(ERL_TOP)/lib/xmerl/include/
+HRL_MODULES= $(HRL_DIR)xmerl $(HRL_DIR)xmerl_xsd
+HRL_FILES= $(HRL_MODULES:%=%.hrl)
+
+
+MODULES= \
+ xmerl_test \
+ xmerl_app_test \
+ xmerl_appup_test \
+ xmerl_test_lib \
+ xmerl_xsd_lib
+
+ERL_FILES= $(MODULES:%=%.erl)
+
+SUITE_FILES= \
+ xmerl_SUITE.erl \
+ xmerl_std_SUITE.erl \
+ xmerl_sax_SUITE.erl \
+ xmerl_sax_std_SUITE.erl \
+ xmerl_xsd_SUITE.erl \
+ xmerl_xsd_MS2002-01-16_SUITE.erl \
+ xmerl_xsd_NIST2002-01-16_SUITE.erl \
+ xmerl_xsd_Sun2002-01-16_SUITE.erl
+
+XML_FILES= \
+ testcases.dtd \
+ xmlconformance.msxsl \
+ xmlconformance.xsl
+
+
+TARGET_FILES= $(MODULES:%=%.$(EMULATOR))
+
+
+INSTALL_PROGS= $(TARGET_FILES)
+
+ifndef XMERL_PRESERV
+XMERL_PRESERV_TEST_DIRS=
+else
+XMERL_PRESERV_TEST_DIRS= -Ddont_rm_test_dirs
+endif
+
+# ----------------------------------------------------
+# Release directory specification
+# ----------------------------------------------------
+
+RELSYSDIR = $(RELEASE_PATH)/xmerl_test
+
+# ----------------------------------------------------
+# FLAGS
+# ----------------------------------------------------
+
+#ERL_COMPILE_FLAGS += -I$(ERL_TOP)/lib/test_server/include -I$(ERL_TOP)/lib/xmerl/include/ $(XMERL_PRESERV_TEST_DIRS)
+
+
+# ----------------------------------------------------
+# Targets
+# ----------------------------------------------------
+
+tests debug opt: xmerl_test.erl
+
+info:
+ @echo "HRL_FILES: $(HRL_FILES)"
+
+clean:
+ $(RM) *.beam
+ $(RM) xmerl_test.erl
+ $(RM) core *~
+
+xmerl_test.erl: ../doc/examples/xmerl_test.erl
+ cp $< $@
+ chmod u+w $@
+
+
+# ----------------------------------------------------
+# Release Target
+# ----------------------------------------------------
+include $(ERL_TOP)/make/otp_release_targets.mk
+
+release_spec: opt
+
+release_tests_spec: opt
+ $(INSTALL_DIR) $(RELSYSDIR)
+ $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(RELSYSDIR)
+ $(INSTALL_DATA) $(SUITE_FILES) $(RELSYSDIR)
+ $(INSTALL_DATA) xmerl.spec xmerl.cover $(RELSYSDIR)
+ cp $(XML_FILES) $(RELSYSDIR)
+ @tar cfh - xmerl_SUITE_data | (cd $(RELSYSDIR); tar xf -)
+ @tar cfh - xmerl_std_SUITE_data | (cd $(RELSYSDIR); tar xf -)
+ @tar cfh - xmerl_xsd_SUITE_data | (cd $(RELSYSDIR); tar xf -)
+ @tar cfh - xmerl_xsd_MS2002-01-16_SUITE_data | (cd $(RELSYSDIR); tar xf -)
+ @tar cfh - xmerl_xsd_NIST2002-01-16_SUITE_data | (cd $(RELSYSDIR); tar xf -)
+ @tar cfh - xmerl_xsd_Sun2002-01-16_SUITE_data | (cd $(RELSYSDIR); tar xf -)
+ chmod -f -R u+w $(RELSYSDIR)
diff --git a/lib/xmerl/test/ReadMe b/lib/xmerl/test/ReadMe
new file mode 100644
index 0000000000..effcff6fc4
--- /dev/null
+++ b/lib/xmerl/test/ReadMe
@@ -0,0 +1,24 @@
+
+W3C conformance tests
+=====================
+
+The xmerl tests contains a large number of conformance tests from W3C, which are located in the following
+directories.
+
+xmerl_std_SUITE_data:
+ These tests are fetched from http://www.w3.org/XML/Test/ and repackaged as four tgz files.
+ The W3C Copyright notice is located in the file xmerl_std_SUITE_data/w3c-copyright-19980720.html.
+
+xmerl_xsd_MS2002-01-16_SUITE_data:
+ These tests are fetched from http://www.w3.org/XML/2004/xml-schema-test-suite/index.html
+ The W3C Copyright notice is located in the file xmerl_xsd_MS2002-01-16_SUITE_data/w3c-copyright-19990405.html.
+
+xmerl_xsd_NIST2002-01-16_SUITE_data:
+ These tests are fetched from http://www.w3.org/XML/2004/xml-schema-test-suite/index.html
+ The W3C Copyright notice is located in the file xmerl_xsd_NIST2002-01-16_SUITE_data/w3c-copyright-19990405.html.
+
+xmerl_xsd_Sun2002-01-16_SUITE_data:
+ These tests are fetched from http://www.w3.org/XML/2004/xml-schema-test-suite/index.html
+ The W3C Copyright notice is located in the file xmerl_xsd_Sun2002-01-16_SUITE_data/w3c-copyright-19990405.html.
+
+
diff --git a/lib/xmerl/test/testcases.dtd b/lib/xmerl/test/testcases.dtd
new file mode 100644
index 0000000000..448d362991
--- /dev/null
+++ b/lib/xmerl/test/testcases.dtd
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ @(#)testcases.dtd 1.6 99/01/21
+ Original version copyright 1998 by Sun Microsystems, Inc.
+ All Rights Reserved.
+ Modifications copyright 1999 by OASIS.
+
+ 1999-06-09 00:20
+
+ DTD describing a database of XML tests.
+
+ NOTE: the OASIS/NIST test effort also has a DTD for its test
+ environment, but that DTD is not yet suited for automated test
+ processing. (Among other issues, it doesn't record information
+ putting any test case into the test matrix.) If that gets fixed,
+ it may be useful to switch over to that DTD.
+-->
+
+<!--
+ The root element of the whole collection is TESTSUITE. While not
+ very different from TESTCASES, it must be distinguished due to
+ improper processing by IE5.
+-->
+<!ELEMENT TESTSUITE ( TESTCASES+ )>
+<!ATTLIST TESTSUITE
+ PROFILE CDATA #IMPLIED
+ >
+
+<!--
+ The root element of a collection should be "TESTCASES". It groups
+ a set of tests in a particular "PROFILE", which is descriptive. For
+ example, a "Japanese" profile might group tests with documents
+ in standard Japanese encodings, using Japanese characters used
+ inside names and name tokens as well as inside text. Or the
+ profile might be associated with the test supplier.
+-->
+
+<!ELEMENT TESTCASES (TEST|TESTCASES)*>
+<!ATTLIST TESTCASES
+ PROFILE CDATA #IMPLIED
+ >
+
+<!--
+ The body of each TEST element is its description, used
+ to evaluate the diagnostic produced on negative tests.
+ People will generally read this to evaluate whether the
+ test failed for the correct reason.
+
+ The type of (external) ENTITIES required affect the results
+ permitted for certain types of nonvalidating parsers. In
+ some cases, errors (even well-formedness errors) can't be seen
+ without reading external parameter or general entities.
+
+ Each test has a unique ID used in diagnostics.
+
+ Tests with an OUTPUT attribute do dual duty: not only must parsers
+ accept the test, but the data they report must also have "Second
+ Canonical Form" as found in the specified output file. (This is
+ what James Clark titled "Canonical XML", with the addition of the
+ NOTATION declarations that all XML parsers are required to report.)
+
+ The OUTPUT3 attribute is like OUTPUT, but when sent through a
+ validating parser the data reported must have the "Third Canonical
+ Form" as found in the specified output file. (This is Second
+ Canonical form, with declarations of unparsed ENTITY values and
+ with all ignorable whitespace removed.)
+
+ Tests apply to one or more particular SECTIONS.
+
+ Each test has a TYPE:
+ * All parsers must accept "valid" testcases.
+ * Nonvalidating parsers must also accept "invalid" testcases,
+ but validating ones must reject them.
+ * No parser should accept a "not-wf" testcase unless it's a
+ nonvalidating parser and the test contains external entities
+ that the parser doesn't read.
+ * Parsers are not required to report "errors".
+
+ Each test is in a particular XML document, with a URI. If these
+ tests are accessed over a network, the path will be relative to
+ the base URI of the document holding the testcase.
+-->
+
+<!ELEMENT TEST (#PCDATA | EM | B)*>
+<!ATTLIST TEST
+ ENTITIES (both|none|parameter|general) "none"
+ ID ID #REQUIRED
+ OUTPUT CDATA #IMPLIED
+ OUTPUT3 CDATA #IMPLIED
+ SECTIONS CDATA #REQUIRED
+ TYPE (valid|invalid|not-wf|error) #REQUIRED
+ URI CDATA #REQUIRED
+ NAMESPACE (yes|no) "yes"
+ >
+
+<!--
+ Really basic HTML font tweaks, to support highlighting
+ some aspects of test descriptions ...
+ EM == emphasis (e.g. italics, fun colors)
+ B == bold
+-->
+<!ELEMENT EM (#PCDATA | B)*>
+<!ELEMENT B (#PCDATA | EM)*>
diff --git a/lib/xmerl/test/xmerl.cover b/lib/xmerl/test/xmerl.cover
new file mode 100644
index 0000000000..d0155946ea
--- /dev/null
+++ b/lib/xmerl/test/xmerl.cover
@@ -0,0 +1,2 @@
+{incl_app,xmerl,details}.
+
diff --git a/lib/xmerl/test/xmerl.spec b/lib/xmerl/test/xmerl.spec
new file mode 100644
index 0000000000..89ab31c755
--- /dev/null
+++ b/lib/xmerl/test/xmerl.spec
@@ -0,0 +1 @@
+{suites,"../xmerl_test",all}.
diff --git a/lib/xmerl/test/xmerl_SUITE.erl b/lib/xmerl/test/xmerl_SUITE.erl
new file mode 100644
index 0000000000..9b65232fe7
--- /dev/null
+++ b/lib/xmerl/test/xmerl_SUITE.erl
@@ -0,0 +1,634 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2008-2010. 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%
+%%
+%%
+%%% Purpose : Test suite for the ASN.1 application
+
+-module(xmerl_SUITE).
+
+-compile(export_all).
+
+%%----------------------------------------------------------------------
+%% Include files
+%%----------------------------------------------------------------------
+-include_lib("test_server/include/test_server.hrl").
+%%-include("xmerl.hrl").
+-include_lib("xmerl/include/xmerl.hrl").
+-include_lib("kernel/include/file.hrl").
+
+
+%%======================================================================
+%% Tests
+%%======================================================================
+
+%%----------------------------------------------------------------------
+%% Test groups
+%%----------------------------------------------------------------------
+all() ->
+ [{group, cpd_tests}, xpath_text1, xpath_main,
+ xpath_abbreviated_syntax, xpath_functions,
+ {group, misc}, {group, eventp_tests},
+ {group, ticket_tests}, {group, app_test},
+ {group, appup_test}].
+
+groups() ->
+ [{cpd_tests, [],
+ [cpd_invalid1, cpd_invalid1_index, cpd_invalid2_index,
+ cpd_invalid_index3, cpd_invalid_is_layer,
+ cpd_expl_provided_DTD]},
+ {misc, [],
+ [latin1_alias, syntax_bug1, syntax_bug2, syntax_bug3,
+ pe_ref1, copyright, testXSEIF, export_simple1, export]},
+ {eventp_tests, [], [sax_parse_and_export]},
+ {ticket_tests, [],
+ [ticket_5998, ticket_7211, ticket_7214, ticket_7430,
+ ticket_6873, ticket_7496, ticket_8156, ticket_8697]},
+ {app_test, [], [{xmerl_app_test, all}]},
+ {appup_test, [], [{xmerl_appup_test, all}]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+%%----------------------------------------------------------------------
+%% Initializations
+%%----------------------------------------------------------------------
+init_per_suite(doc) ->
+ ["Starts the test suite"];
+init_per_suite(Config) ->
+ Dog=test_server:timetrap({minutes,10}),
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line ok=erl_tar:extract("cpd.tar.gz",[compressed]),
+ ?line ok=erl_tar:extract("misc.tar.gz",[compressed]),
+ ?line ok = change_mode(["cpd", "misc"]),
+ ?line file:set_cwd(filename:join(?config(data_dir,Config),xpath)),
+ TestServerIncludeDir=filename:join(filename:dirname(code:priv_dir(test_server)), "include"),
+ ?line {ok, xpath_lib} = compile:file(xpath_lib, [{i, TestServerIncludeDir}]),
+ ?line {ok, xpath_text} = compile:file(xpath_text, [{i, TestServerIncludeDir}]),
+ ?line {ok, xpath_abbrev} = compile:file(xpath_abbrev, [{i, TestServerIncludeDir}]),
+ [{watchdog, Dog}|Config].
+
+
+-ifndef(dont_rm_test_dirs).
+end_per_suite(doc) ->
+ ["Stops the test suite"];
+end_per_suite(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line ok=rm_files(["cpd", "misc"]),
+ Dog=?config(watchdog, Config),
+ test_server:timetrap_cancel(Dog),
+ lists:keydelete(watchdog,1,Config).
+
+-else.
+end_per_suite(doc) ->
+ ["Stops the test suite"];
+end_per_suite(Config) ->
+ Dog=?config(watchdog, Config),
+ test_server:timetrap_cancel(Dog),
+ lists:keydelete(watchdog,1,Config).
+-endif.
+
+
+%% initialization before each testcase
+init_per_testcase(_TestCase,Config) ->
+ io:format("Config:~n~p",[Config]),
+ ?line {ok, _} = file:read_file_info(filename:join([?config(priv_dir,Config)])),
+ ?line code:add_patha(?config(priv_dir,Config)),
+ Dog=test_server:timetrap({minutes,10}),
+ [{watchdog, Dog}|Config].
+
+
+%% clean up after each testcase
+end_per_testcase(_Func,Config) ->
+ Dog=?config(watchdog, Config),
+ test_server:timetrap_cancel(Dog),
+ ok.
+
+
+%%----------------------------------------------------------------------
+%% Test cases
+%%----------------------------------------------------------------------
+cpd_invalid1(suite) -> [];
+cpd_invalid1(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line case catch xmerl_scan:file(filename:join([?config(data_dir,Config), cpd,"cpd_test.xml"]),[]) of
+ {'EXIT',{fatal,Reason}} ->
+ case Reason of
+ {expected_markup,_Path,28,32} -> ok;
+ _ -> {comment,"parsing changed behaviour"}
+ end
+ end.
+
+cpd_invalid1_index(suite) -> [];
+cpd_invalid1_index(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line case catch xmerl_scan:file(filename:join([?config(data_dir,Config), cpd,"cpd_index.xml"]),[]) of
+ {'EXIT',{fatal,Reason}} ->
+ case Reason of
+ {{error,{whitespace_was_expected}},_Path,1,19} -> ok;
+ _ -> {comment,"parsing changed behaviour"}
+ end
+ end.
+
+cpd_invalid2_index(suite) -> [];
+cpd_invalid2_index(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line case catch xmerl_scan:file(filename:join([?config(data_dir,Config), cpd,"cpd_index2.xml"]),[]) of
+ {'EXIT',{fatal,Reason}} ->
+ case Reason of
+ {{invalid_target_name,_Ver},_Path,2,3} ->ok;
+ _ -> {comment,"parsing changed behaviour"}
+ end
+ end.
+
+cpd_invalid_index3(suite) -> [];
+cpd_invalid_index3(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line case catch xmerl_scan:file(filename:join([?config(data_dir,Config), cpd,"cpd_index3.xml"]),[]) of
+ {'EXIT',{fatal,Reason}} ->
+ case Reason of
+ {expected_markup,_Path,1,2} -> ok;
+ _ -> {comment,"parsing changed behaviour"}
+ end
+ end.
+
+cpd_invalid_is_layer(suite) -> [];
+cpd_invalid_is_layer(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line case catch xmerl_scan:file(filename:join([?config(data_dir,Config), cpd,"is_layer2.xml"]),[]) of
+ {'EXIT',{fatal,_Reason}} -> ok
+ end.
+
+cpd_expl_provided_DTD(suite) -> [];
+cpd_expl_provided_DTD(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {#xmlElement{},[]} = xmerl_scan:file(filename:join([?config(data_dir,Config), cpd,"file_wo_DTD.xml"]),[{validation,true},{doctype_DTD,"separate_DTD.dtd"}]).
+
+%%----------------------------------------------------------------------
+
+xpath_text1(suite) -> [];
+xpath_text1(Config) ->
+ ?line file:set_cwd(filename:join(?config(data_dir,Config),xpath)),
+ ?line ok = xpath_text:one().
+
+xpath_main(suite) -> [];
+xpath_main(Config) ->
+ ?line file:set_cwd(filename:join(?config(data_dir,Config),xpath)),
+ ?line ok = xpath_lib:test().
+
+xpath_abbreviated_syntax(suite) -> [];
+xpath_abbreviated_syntax(Config) ->
+ ?line file:set_cwd(filename:join(?config(data_dir,Config),xpath)),
+ ?line ok = xpath_abbrev:test().
+
+xpath_functions(suite) -> [];
+xpath_functions(Config) ->
+ ?line file:set_cwd(filename:join(?config(data_dir,Config),xpath)),
+ ?line ok = xpath_abbrev:functions().
+
+%%----------------------------------------------------------------------
+
+latin1_alias(suite) -> [];
+latin1_alias(Config) ->
+% ?line file:set_cwd(filename:join(?config(data_dir,Config),misc)),
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {_Elements,[]}=
+ xmerl_scan:file(filename:join([?config(data_dir,Config),
+ misc,"motorcycles.xml"]),
+ [{validation,true},
+ {encoding,'iso-8859-1'}]).
+
+syntax_bug1(suite) -> [];
+syntax_bug1(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {fatal,{"expected one of: ?>, standalone, encoding",
+ {file,'misc/syntax_bug1.xml'},{line,1},{col,21}}} =
+ case catch xmerl_scan:file('misc/syntax_bug1.xml') of
+ {'EXIT',Reason} ->
+ Reason;
+ Err -> Err
+ end.
+
+syntax_bug2(suite) -> [];
+syntax_bug2(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {fatal,{"expected one of: ?>, whitespace_character",
+ {file,'misc/syntax_bug2.xml'},{line,1},{col,20}}} =
+ case catch xmerl_scan:file('misc/syntax_bug2.xml') of
+ {'EXIT',Reason} ->
+ Reason;
+ Err -> Err
+ end.
+
+syntax_bug3(suite) -> [];
+syntax_bug3(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {fatal,{{endtag_does_not_match,{was,obj,should_have_been,int}},
+ {file,'misc/syntax_bug3.xml'},{line,4},{col,3}}} =
+ case catch xmerl_scan:file('misc/syntax_bug3.xml') of
+ {'EXIT',Reason} ->
+ Reason;
+ Err -> Err
+ end.
+
+pe_ref1(suite) -> [];
+pe_ref1(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {#xmlElement{},[]} = xmerl_scan:file(filename:join([?config(data_dir,Config), misc,"PE_ref1.xml"]),[{validation,true}]).
+
+copyright(suite) -> [];
+copyright(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {#xmlElement{},[]} = xmerl_scan:file(filename:join([?config(data_dir,Config), misc,"cprght.xml"]),[{validation,true}]).
+
+testXSEIF(suite) -> [];
+testXSEIF(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {#xmlElement{},[]} = xmerl_scan:file(filename:join([?config(data_dir,Config), misc,"ReplBoard_1_1543-CNA11313Uen.xml"]),[{validation,true}]).
+
+export_simple1(suite) -> [];
+export_simple1(Config) ->
+ Simple = simple(),
+ Res = xmerl:export_simple(Simple,xmerl_xml,[{title, "Doc Title"}]),
+ ?line "<?xml version="++_ = lists:flatten(Res),
+
+ %% Use of fun in simple content OTP-6679
+ Simple2 = simple2(),
+ Res2 = xmerl:export_simple(Simple2,xmerl_xml,[{title,"Doc Title"}]),
+ ?line true = (Res2 =:= Res),
+ ok.
+
+export(suite) -> [];
+export(Config) ->
+ DataDir = ?config(data_dir,Config),
+ Prolog = ["<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!DOCTYPE motorcycles SYSTEM \"motorcycles.dtd\">\n"],
+ TestFile = filename:join([DataDir,"misc","motorcycles.xml"]),
+ ?line {E,_} = xmerl_scan:file(TestFile),
+ ?line Exported = xmerl:export([E],xmerl_xml,[{prolog,Prolog}]),
+ B = list_to_binary(Exported++"\n"),
+ ?line {ok,B} = file:read_file(TestFile),
+ ok.
+
+%%----------------------------------------------------------------------
+
+sax_parse_and_export(suite) -> [];
+sax_parse_and_export(Config) ->
+ ?line ok = sax_parse_export_xml_big(Config),
+ ?line ok = sax_parse_export_xml_small(Config).
+
+%%----------------------------------------------------------------------
+
+sax_parse_export_xml_big(Config) ->
+ DataDir = ?config(data_dir,Config),
+ OutDir = ?config(priv_dir,Config),
+ io:format("DataDir: ~p~n,OutDir:~p~n",[DataDir,OutDir]),
+ CMOMxml = filename:join([DataDir,"eventp","CMOM.xml"]),
+ ?line {Ex,[]} = xmerl_eventp:file_sax(CMOMxml, xmerl_xml,[],[]),
+ OutFile = filename:join([OutDir,"cmom"]),
+ file:delete(OutFile),
+ StubFile = filename:join([DataDir,"eventp","CelloMOM.stub"]),
+ ?line {ok,Bin} = file:read_file(StubFile),
+ ?line {ok,IO} = file:open(OutFile,[write,append]),
+ ?line ok = file:write(IO,Bin),
+ ?line ok = io:format(IO,"~s~n~n",[lists:flatten(Ex)]),
+ Cmd = lists:flatten(io_lib:format("cmp ~s ~s",[OutFile,CMOMxml])),
+ ?line [] = os:cmd(Cmd),
+ ok.
+
+sax_parse_export_xml_small(Config) ->
+ DataDir = ?config(data_dir,Config),
+ OutDir = ?config(priv_dir,Config),
+ Wurfl_xml = filename:join([DataDir,"eventp","wurfl.xml"]),
+ ?line {Ex,[]} = xmerl_eventp:file_sax(Wurfl_xml, xmerl_xml,[],[]),
+ OutFile = filename:join([OutDir,"wrfl"]),
+ file:delete(OutFile),
+ StubFile = filename:join([DataDir,"eventp","wurfl.stub"]),
+ ?line {ok,Bin} = file:read_file(StubFile),
+ ?line {ok,IO} = file:open(OutFile,[write,append]),
+ ?line ok = file:write(IO,Bin),
+ ?line ok = io:format(IO,"~s~n",[lists:flatten(Ex)]),
+ Cmd = lists:flatten(io_lib:format("cmp ~s ~s",[OutFile,Wurfl_xml])),
+ ?line [] = os:cmd(Cmd),
+ ok.
+
+
+simple() ->
+ [{document,
+ [{title, "Doc Title"}, {author, "Ulf Wiger"}],
+ [{section,
+ [{heading, "heading1"}],
+ [{'P', ["This is a paragraph of text."]},
+ {section,
+ [{heading, "heading2"}],
+ [{'P', ["This is another paragraph."]},
+ {table,
+ [{border, 1}],
+ [{heading,
+ [{col, ["head1"]},
+ {col, ["head2"]}]},
+ {row,
+ [{col, ["col11"]},
+ {col, ["col12"]}]},
+ {row,
+ [{col, ["col21"]},
+ {col, ["col22"]}]}]}]}]}]}].
+
+
+simple2() ->
+ GenC = fun ?MODULE:generate_section/1,
+ GenA = fun ?MODULE:generate_attr_title/1,
+ [{document,[{GenA,2}],[{GenC,1}]}].
+
+generate_attr_title(0) ->
+ done;
+generate_attr_title(1) ->
+ {{title,"Doc Title"},0};
+generate_attr_title(2) ->
+ {{author, "Ulf Wiger"},1}.
+generate_section(0) ->
+ done;
+generate_section(N) ->
+ GenC = fun ?MODULE:generate_section_content/1,
+ GenA = fun ?MODULE:generate_section_attribute/1,
+ {{section,[{GenA,1}],[{GenC,2}]},N-1}.
+
+generate_section_attribute(0) ->
+ done;
+generate_section_attribute(N) ->
+ {{heading, "heading1"},N-1}.
+
+
+generate_subsection_content(0) ->
+ done;
+generate_subsection_content(1) ->
+ {{'P',["This is another paragraph."]},0};
+generate_subsection_content(N) ->
+ {{table,[{fun ?MODULE:generate_border_attribute/1,1}],
+ [{fun ?MODULE:generate_table_content/1,2}]},N-1}.
+generate_section_content(0) ->
+ done;
+generate_section_content(1) ->
+ {{'P',["This is a paragraph of text."]},0};
+generate_section_content(N) ->
+ {{section,[{heading,"heading2"}],
+ [{fun ?MODULE:generate_subsection_content/1,2}]},N-1}.
+generate_border_attribute(0) ->
+ done;
+generate_border_attribute(N) ->
+ {{border,N},N-1}.
+generate_table_content(0) ->
+ done;
+generate_table_content(1) ->
+ {{fun ?MODULE:generate_heading/1,1},0};
+generate_table_content(N) ->
+ {{fun ?MODULE:generate_row/1, {2,2}},N-1}.
+generate_row({0,_}) ->
+ done;
+generate_row(N) ->
+ UpdateS = fun({2,_}) -> {1,2};(_) -> {0,0} end,
+ {{row,[{fun ?MODULE:generate_row_col/1, N}]},UpdateS(N)}.
+generate_row_col({_,0}) ->
+ done;
+generate_row_col(N={C,R}) ->
+ UpdateS = fun({X,Y}) -> {X,Y-1} end,
+ {{col,[lists:concat(["col",C,R])]},UpdateS(N)}.
+generate_heading(0) ->
+ done;
+generate_heading(N) ->
+ {{heading,[{fun ?MODULE:generate_heading_col/1,2}]},N-1}.
+generate_heading_col(0) ->
+ done;
+generate_heading_col(N) ->
+ {{col,[lists:concat(["head",N])]},N-1}.
+
+%%----------------------------------------------------------------------
+%% Ticket Tests
+%%----------------------------------------------------------------------
+
+%%
+%% ticket_5998
+%%
+%% A Kleene Closure child in a sequence consumed all following
+%% childs. This problem has been fixed.
+%%
+ticket_5998(suite) -> [];
+ticket_5998(Config) ->
+ DataDir = ?config(data_dir,Config),
+ %% First fix is tested by case syntax_bug2.
+
+ ?line case catch xmerl_scan:file(filename:join([DataDir,misc,
+ "ticket_5998_2.xml"])) of
+ {'EXIT',{fatal,Reason1}} ->
+ case Reason1 of
+ {{endtag_does_not_match,
+ {was,obj,should_have_been,int}},
+ _,_,_} -> ok;
+ _ -> {comment,"parsing changed behaviour"}
+ end
+ end,
+
+ ?line case catch xmerl_scan:file(filename:join([DataDir,misc,
+ "ticket_5998_3.xml"])) of
+ {'EXIT',{fatal,Reason2}} ->
+ case Reason2 of
+ {"expected one of: ?>, standalone, encoding",
+ _,_,_} -> ok;
+ _ -> {comment,"parsing changed behaviour"}
+ end
+ end.
+
+
+%%
+%% ticket_7211
+%%
+%% A Kleene Closure child in a sequence consumed all following
+%% childs. This problem has been fixed.
+%%
+ticket_7211(suite) -> [];
+ticket_7211(Config) ->
+ DataDir = ?config(data_dir,Config),
+ ?line {E,[]} =
+ xmerl_scan:file(filename:join([DataDir,misc,"notes2.xml"]),
+ [{fetch_path,[filename:join([DataDir,misc,erlang_docs_dtd])]},
+ {validation,dtd}]),
+
+ ?line ok = case E of
+ Rec when is_record(Rec,xmlElement) ->
+ ok;
+ _ ->
+ E
+ end,
+
+ ?line {E2,[]} =
+ xmerl_scan:file(filename:join([DataDir,misc,"XS.xml"]),
+ [{fetch_path,[filename:join([DataDir,misc,erlang_docs_dtd])]},
+ {validation,dtd}]),
+
+ ?line ok = case E2 of
+ Rec2 when is_record(Rec2,xmlElement) ->
+ ok;
+ _ ->
+ E2
+ end.
+
+%%
+%% ticket_7214
+%%
+%% Now validating xhtml1-transitional.dtd.
+%% A certain contentspec with a succeding choice, that didn't match
+%% all content, followed by other child elements caused a
+%% failure. This is now corrected.
+%%
+ticket_7214(suite) -> [];
+ticket_7214(Config) ->
+ DataDir = ?config(data_dir,Config),
+
+ ?line {E,[]} =
+ xmerl_scan:file(filename:join([DataDir,misc,'block_tags.html']),
+ [{validation,dtd},
+ {fetch_path,[filename:join([DataDir,misc,erlang_docs_dtd])]}]),
+
+ ?line ok = case E of
+ Rec when is_record(Rec,xmlElement) ->
+ ok;
+ _ ->
+ E
+ end.
+
+%%
+%% ticket_7430
+%%
+%% Problem with contents of numeric character references followed by
+%% UTF-8 characters..
+%%
+ticket_7430(suite) -> [];
+ticket_7430(Config) ->
+ DataDir = ?config(data_dir,Config),
+
+ ?line {E,[]} =
+ xmerl_scan:string("<a>\303\251&#xD;\303\251</a>",
+ [{encoding, 'utf-8'}]),
+
+ ?line ok = case E of
+ {xmlElement,a,a,[],
+ {xmlNamespace,[],[]},
+ [],1,[],
+ [{xmlText,[{a,1}],1,[],"�",text},
+ {xmlText,[{a,1}],2,[],"\n�",text}],
+ [],_,undeclared} ->
+ ok;
+ _ ->
+ E
+ end.
+
+ticket_6873(suite) -> [];
+ticket_6873(Config) ->
+ ?line file:set_cwd(filename:join(?config(data_dir,Config),xpath)),
+ ?line ok = xpath_abbrev:ticket_6873(),
+ ?line ok = xpath_lib:ticket_6873().
+
+ticket_7496(suite) -> [];
+ticket_7496(Config) ->
+ ?line file:set_cwd(filename:join(?config(data_dir,Config),xpath)),
+ ?line ok = xpath_abbrev:ticket_7496().
+
+ticket_8156(suite) -> [];
+ticket_8156(Config) ->
+ ?line {ftp,{[],[]},"testmachine1",21,"/w.erl"} = xmerl_uri:parse("ftp://testmachine1/w.erl"),
+ ?line {ftp,{"user",[]},"testmachine1",21,"/w.erl"} = xmerl_uri:parse("ftp://user@testmachine1/w.erl"),
+ ?line {ftp,{"user","hello"},"testmachine1",21,"/w.erl"} =
+ xmerl_uri:parse("ftp://user:hello@testmachine1/w.erl"),
+ ?line {ftp,{[],[]},"testmachine1",3000,"/w.erl"} = xmerl_uri:parse("ftp://testmachine1:3000/w.erl"),
+ ?line {ftp,{"user","hello"},"testmachine1",3000,"/w.erl"} =
+ xmerl_uri:parse("ftp://user:hello@testmachine1:3000/w.erl"),
+ ok.
+
+ticket_8697(suite) -> [];
+ticket_8697(doc) ->
+ ["Test that xmerl_scan can decode unicode entities properly"];
+ticket_8697(Config) ->
+ ?line {UTF8Output, []} = xmerl_scan:string("<?xml version=\"1\" ?>\n<text>" ++ [229, 145, 156] ++ "</text>"),
+ ?line #xmlElement{content = [#xmlText{value = UTF8Text}]} = UTF8Output,
+ ?line [16#545C] = UTF8Text,
+ ?line {DecEntityOutput, []} = xmerl_scan:string("<?xml version=\"1\" ?>\n<text>&#21596;</text>"),
+ ?line #xmlElement{content = [#xmlText{value = DecEntityText}]} = DecEntityOutput,
+ ?line [21596] = DecEntityText,
+ ?line {HexEntityOutput, []} = xmerl_scan:string("<?xml version=\"1\" ?>\n<text>&#x545C;</text>"),
+ ?line #xmlElement{content = [#xmlText{value = HexEntityText}]} = HexEntityOutput,
+ ?line [16#545C] = HexEntityText,
+ ok.
+
+
+
+
+
+%%======================================================================
+%% Support Functions
+%%======================================================================
+
+%% Dir is a directory
+rm_f_(Dir) ->
+ ?line {ok,CWD} = file:get_cwd(),
+ ?line {ok,FileList} = file:list_dir(Dir),
+ ?line file:set_cwd(filename:join([CWD,Dir])),
+ rm_files(FileList),
+ ?line file:set_cwd(CWD),
+ ? line ok = file:del_dir(Dir).
+
+rm_files([])->
+ ok;
+rm_files([F|Fs]) ->
+ case filelib:is_dir(F) of
+ true ->
+ rm_f_(F);
+ _ ->
+ ?line ok = file:delete(F)
+ end,
+ rm_files(Fs).
+
+change_mode(Files) ->
+ change_mode3(Files).
+change_mode2(Dir)->
+ ?line {ok,CWD} = file:get_cwd(),
+ ?line {ok,FileList} = file:list_dir(Dir),
+ ?line file:set_cwd(filename:join([CWD,Dir])),
+ change_mode3(FileList),
+ ?line file:set_cwd(CWD).
+change_mode3([]) ->
+ ok;
+change_mode3([F|Fs]) ->
+ case filelib:is_dir(F) of
+ true ->
+ chmod(F),
+ change_mode2(F);
+ _ ->
+ chmod(F)
+ end,
+ change_mode3(Fs).
+
+chmod(F) ->
+ case file:read_file_info(F) of
+ {ok,FileInfo} ->
+ Mode= FileInfo#file_info.mode,
+ file:write_file_info(F,FileInfo#file_info{mode=8#00777 bor Mode});
+ _ ->
+ ok
+ end.
+
diff --git a/lib/xmerl/test/xmerl_SUITE_data/cpd.tar.gz b/lib/xmerl/test/xmerl_SUITE_data/cpd.tar.gz
new file mode 100644
index 0000000000..c750e14adf
--- /dev/null
+++ b/lib/xmerl/test/xmerl_SUITE_data/cpd.tar.gz
Binary files differ
diff --git a/lib/xmerl/test/xmerl_SUITE_data/eventp/CMOM.xml b/lib/xmerl/test/xmerl_SUITE_data/eventp/CMOM.xml
new file mode 100644
index 0000000000..7c64046897
--- /dev/null
+++ b/lib/xmerl/test/xmerl_SUITE_data/eventp/CMOM.xml
@@ -0,0 +1,30261 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<!--
+ Document no: 1551-1/CSX10109
+ Revision: MOM-CELLO_4.3.1
+ Date: 12-17-2003
+ Author: Ake Pappila/Hsiang-Ling Teng
+
+ Generated from UML by uml2xml version 3.0 (based on DTD file rev. F)
+ Rational Rose model used: /vobs/cello/cma/cma_uml/CelloMOM.mdl
+-->
+
+<!DOCTYPE models SYSTEM "mp.dtd">
+
+<models>
+<mim name="MOM-CELLO_4.3.1-1" version="5" release="1">
+ <exception name="AttributeMissingException">
+ <description>Exception thrown when an attribute is missing during upgrade.</description>
+ </exception>
+
+ <exception name="EnableExistingProgramException">
+ <description>Exception thrown when enabling of existing programs fails.</description>
+ </exception>
+
+ <exception name="ExtraIdentifiersOfNonExistingLoadModulesException">
+ </exception>
+
+ <exception name="FileCopyException">
+ <description>Exception thrown when copying of files fails.</description>
+ </exception>
+
+ <exception name="FileNotExistException">
+ <description>Exception thrown when the specified file does not exist.</description>
+ </exception>
+
+ <exception name="FindAndReplaceException">
+ </exception>
+
+ <exception name="HeapPoolSettingsException">
+ <description>Exception thrown when the heap or pool setting is incorrect.</description>
+ </exception>
+
+ <exception name="AttributeValueOutOfRangeException">
+ <description>Exception thrown when an attribute value is out of range.</description>
+ </exception>
+
+ <exception name="CancelInstallRequestException">
+ <description>Exception thrown when a cancel install equest for some reason fails.</description>
+ </exception>
+
+ <exception name="ChecksumhandlerException">
+ <description>Exception thrown when the control of checksum for loadmodules has been rejaected due to 'null' recieved from resource layer.</description>
+ </exception>
+
+ <exception name="ClearAllPiuTypesReferencedByPlugInUnitException">
+ <description>Exception thrown when its not possible to clear all PiuTypes referenced by PlugInUnit.</description>
+ </exception>
+
+ <exception name="ConditionallyMandatoryAttributeOrElementMissingException">
+ <description>Exception thrown when an conditional mandatory attribute (or element) is missing.</description>
+ </exception>
+
+ <exception name="ConfigurationVersionMO_HandlerException">
+ <description>Exception thrown when the creation of a CV during upgrade fails.</description>
+ </exception>
+
+ <exception name="ControlFileDocumentHandlerException">
+ </exception>
+
+ <exception name="CreateLoadModuleException">
+ <description>Exception thrown when the creation of a load module fails.</description>
+ </exception>
+
+ <exception name="DisableExistingProgramsException">
+ <description>Exception thrown when disabling of existing programs for some reason fails.</description>
+ </exception>
+
+ <exception name="DocumentObjectProxyException">
+ </exception>
+
+ <exception name="ExplicitReplacementInInformationForRPUsException">
+ <description>Exception thrown when replacement of existing RPU information fails.</description>
+ </exception>
+
+ <exception name="InstallOfLoadModulesCancelledException">
+ <description>Exception thrown when the installation of Load Modules is cancelled.</description>
+ </exception>
+
+ <exception name="InstallOfLoadModulesPartlyExcecutedException">
+ <description>Exception thrown when the installment of Load Modules is only partly executed.</description>
+ </exception>
+
+ <exception name="InstallOfLoadModulesRejectedException">
+ <description>Exception thrown when the install of Load Modules is rejected.</description>
+ </exception>
+
+ <exception name="InstallRejectedFTP_ServerNotAccessibleException">
+ <description>Exception thrown when the install is rejected due to FTP server is not accessible.</description>
+ </exception>
+
+ <exception name="InstallRejectedGetLoadModuleFileException">
+ <description>Exception thrown when the install is rejected due to error when trying to retreive Load Module.</description>
+ </exception>
+
+ <exception name="InstallRejectedIP_AddressException">
+ <description>Exception thrown when install is rejected due to erronous IP address.</description>
+ </exception>
+
+ <exception name="InstallRejectedInsufficientDiskSpaceException">
+ <description>Exception thrown when the install is rejected due to insufficient disk space.</description>
+ </exception>
+
+ <exception name="InstallRejectedLoadListFileException">
+ </exception>
+
+ <exception name="InstallRequestException">
+ <description>Exception thrown when the installation of a Load Module fails.</description>
+ </exception>
+
+ <exception name="InsufficientDiskSpaceException">
+ <description>Exception thrown when the disk space is insufficient.</description>
+ </exception>
+
+ <exception name="JvmMO_HandlerException">
+ </exception>
+
+ <exception name="LoadModuleFIlePathLengthOutOfRangeException">
+ <description>Exception thrown when file path for the Load Module is out of length.</description>
+ </exception>
+
+ <exception name="LoadModuleMO_HandlerException">
+ </exception>
+
+ <exception name="ManagedElementDataMO_HandlerException">
+ </exception>
+
+ <exception name="MandatoryElementIsMissingException">
+ </exception>
+
+ <exception name="MergeControlFileException">
+ <description>Exception thrown when the merger of control files fails.</description>
+ </exception>
+
+ <exception name="PIU_MO_HandlerException">
+ </exception>
+
+ <exception name="ParseException">
+ </exception>
+
+ <exception name="ParserFactoryException">
+ </exception>
+
+ <exception name="PiuTypeDefinitionMissingInUpgradeControlFileException">
+ <description>Exception thrown when PiuType definitions is missing in the UCF file.</description>
+ </exception>
+
+ <exception name="PiuTypeMO_HandlerException">
+ </exception>
+
+ <exception name="ProductNumberAndRevisionAlreadyInUseException">
+ <description>Exception thrown when the product number and revision is already used.</description>
+ </exception>
+
+ <exception name="ProgramConfigurationException">
+ </exception>
+
+ <exception name="ReconfigureProgramsException">
+ <description>Exception thrown when reconfiguration of programs fails.</description>
+ </exception>
+
+ <exception name="ReferencedElementMissingException">
+ <description>Exception thrown when the referenced element is missing.</description>
+ </exception>
+
+ <exception name="RepertoireMO_HandlerException">
+ </exception>
+
+ <exception name="ReplaceConfigSupportMOsOpException">
+ </exception>
+
+ <exception name="ReserveLoadModulesException">
+ <description>Exception thrown when reserving a Load Module fails.</description>
+ </exception>
+
+ <exception name="SelectiveInstallFailureException">
+ <description>Exception thrown when a selective install fails.</description>
+ </exception>
+
+ <exception name="SlotMO_HandlerException">
+ </exception>
+
+ <exception name="SwAllocationMO_HandlerException">
+ </exception>
+
+ <exception name="UnexpectedAttributeException">
+ <description>Exception thrown when an unexpected attribute occurs at upgrade.</description>
+ </exception>
+
+ <exception name="UnexpectedAttributeFormatException">
+ <description>Exception thrown when an unexpected format of the attribute occurs.</description>
+ </exception>
+
+ <exception name="UnexpectedElementException">
+ <description>Exception thrown when </description>
+ </exception>
+
+ <exception name="UpgradeControlFileDataException">
+ </exception>
+
+ <exception name="UpgradeControlFileNotFoundException">
+ </exception>
+
+ <exception name="UpgradeControlFileParserException">
+ </exception>
+
+ <exception name="UpgradePackageDeleteException">
+ <description>Exception thrown when its not possible to delete the upgrade package.</description>
+ </exception>
+
+ <exception name="UpgradePackageDeleteNotAllowedException">
+ <description>Exception thrown when its not allowed to delete the upgrade package.</description>
+ </exception>
+
+ <exception name="UpgradePackageDoesNotExistException">
+ <description>Exception thrown when the specified upgrade package does not exist.</description>
+ </exception>
+
+ <exception name="UpgradePackageFileSystemErrorException">
+ <description>Exception thrown when an error in the file system occurs.</description>
+ </exception>
+
+ <exception name="UpgradeRejectedException">
+ <description>Exception thrown when the upgrade is rejected.</description>
+ </exception>
+
+ <exception name="ValidateException">
+ </exception>
+
+ <exception name="VerifyChecksumException">
+ <description>Exception thrown when the checksum is incorrect.</description>
+ </exception>
+
+ <exception name="VerifyCreationOfCVsException">
+ <description>Exception thrown when its not possible to verify the creation of CV's.</description>
+ </exception>
+
+ <exception name="VerifyOperationalPIUsException">
+ </exception>
+
+ <exception name="VerifyRejectedException">
+ </exception>
+
+ <exception name="VerifyRequestException">
+ </exception>
+
+ <exception name="VerifySupportedPIUsException">
+ </exception>
+
+ <exception name="VerifyUpgradeHandlerException">
+ </exception>
+
+ <exception name="VerifyUpgradeWindowException">
+ </exception>
+
+ <exception name="UpgradeLogFileNotAccessibleException">
+ <description>The upgrade trace log file is not accessible i.e. the log file exists but it is not possible to access it with write permission.</description>
+ </exception>
+
+ <exception name="UpgradeControlFileException">
+ <description>The file parser has found that the UpgradeControlFile is incorrect.</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="UpgradeNotPossibleException">
+ <description>Before an upgrade is started it was found that the upgrade can not take place. A possible reason is that the upgrade package that is running in the node is not in the upgrade window of this upgrade package. </description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="UpgradeLogFileNotInUseException">
+ <description>The upgrade trace output is currently not directed to a file.
+
+This is a property that can be changed in the trace property file (Trace_01.prop).
+</description>
+ </exception>
+
+ <enum name="UpgradePackageState">
+ <enumMember name="NOT_INSTALLED">
+ <description>The upgrade package is not installed.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="INSTALL_COMPLETED">
+ <description>The upgrade package is completely installed.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="UPGRADE_EXECUTING">
+ <description>Upgrade is executing. </description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="AWAITING_CONFIRMATION">
+ <description>The execution of upgrade needs confirmation before it proceeds.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="ONLY_DELETEABLE">
+ <description>In this state an Upgrade Package can only be deleted. Its actions, when invoked, will throw the exception ActionNotAllowed. </description>
+ <value>4</value>
+ </enumMember>
+ <enumMember name="INSTALL_EXECUTING">
+ <description>Installation of the upgrade package is executing.</description>
+ <value>5</value>
+ </enumMember>
+ <enumMember name="INSTALL_NOT_COMPLETED">
+ <description>The upgrade package is not completely installed i.e. parts of it has been installed. </description>
+ <value>6</value>
+ </enumMember>
+ <enumMember name="UPGRADE_COMPLETED">
+ <description>The upgrade has been successfully executed.</description>
+ <value>7</value>
+ </enumMember>
+ </enum>
+
+ <enum name="UpgradeProgressInformation">
+ <enumMember name="IDLE">
+ <description>No action is in progress. </description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="DOWNLOADING_FILES">
+ <description>Downloading of files (load modules) in progress.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="SAVING_CV">
+ <description>Saving a Configuration Version.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="RECONFIGURING_MOS">
+ <description>Operation ReplaceConfigSupportMOs detected in upgrade.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="INITIATING_LOADER_INFO">
+ <description>Trigger Initiate detected in upgrade sequence.</description>
+ <value>4</value>
+ </enumMember>
+ <enumMember name="PRELOADING">
+ <description>Trigger Preload detected in upgrade sequence.</description>
+ <value>5</value>
+ </enumMember>
+ <enumMember name="CONVERSION_OF_PERSISTENT_DATA">
+ <value>6</value>
+ </enumMember>
+ <enumMember name="APPLICATION_SPECIFIC_ACTION">
+ <description>'Unique trigger' for an application detected in upgrade sequence.</description>
+ <value>7</value>
+ </enumMember>
+ <enumMember name="SHUTDOWN_WAIT">
+ <value>8</value>
+ </enumMember>
+ <enumMember name="TAKING_NEW_SOFTWARE_INTO_SERVICE">
+ <value>9</value>
+ </enumMember>
+ <enumMember name="FINISH_AND_CLEANING_UP">
+ <description>The error handling is switched back to normal.</description>
+ <value>10</value>
+ </enumMember>
+ <enumMember name="RESTORING_SYSTEM_STATE">
+ <value>11</value>
+ </enumMember>
+ <enumMember name="EXECUTION_FAILED">
+ <description>Indicates that the execution of an install or an upgrade action has failed.</description>
+ <value>12</value>
+ </enumMember>
+ <enumMember name="CANCEL_OF_INSTALLATION_IS_EXECUTING">
+ <description>Indicates that cancellation of an ongoing installation is in progress.</description>
+ <value>13</value>
+ </enumMember>
+ <enumMember name="CANCEL_OF_INSTALLATION_FAILED">
+ <description>Indicates that the execution of a cancel install action failed.</description>
+ <value>14</value>
+ </enumMember>
+ <enumMember name="VERIFICATION_INITIATED">
+ <value>15</value>
+ </enumMember>
+ <enumMember name="VERIFYING_UPGRADE_FROM_VERSION">
+ <value>16</value>
+ </enumMember>
+ <enumMember name="VERIFYING_POSSIBLE_TO_CREATE_REQ_NO_CVS">
+ <value>17</value>
+ </enumMember>
+ <enumMember name="VERIFYING_PIUS_SUPPORTED">
+ <value>18</value>
+ </enumMember>
+ <enumMember name="VERIFYING_CHECKSUM_FOR_LM">
+ <value>19</value>
+ </enumMember>
+ <enumMember name="VERIFYING_PIUS_NOT_FAULTY">
+ <value>20</value>
+ </enumMember>
+ <enumMember name="VERIFICATION_FINISHED">
+ <value>21</value>
+ </enumMember>
+ <enumMember name="VERIFICATION_FAILED">
+ <value>22</value>
+ </enumMember>
+ </enum>
+
+ <enum name="InvokedAction">
+ <enumMember name="VERIFY_UPGRADE">
+ <description>The verifyUpgrade action has been invoked.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="UPGRADE">
+ <description>An upgrade action (one of the variants) has been invoked.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="INSTALL">
+ <description>An install action (one of the variants) has been invoked.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="CANCEL_INSTALL">
+ <description>The cancelInstall action has been invoked.</description>
+ <value>4</value>
+ </enumMember>
+ </enum>
+
+ <struct name="ActionResultData">
+ <structMember name="time">
+ <description>A timestamp.
+
+Format: "Date: 2003-04-24, Time: 20:52:11.182"</description>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </structMember>
+ <structMember name="typeOfInvokedAction">
+ <enumRef name="InvokedAction">
+ <defaultValue>VERIFY_UPGRADE</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="info">
+ <enumRef name="Information">
+ <defaultValue>EXECUTED</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="actionId">
+ <description>This id is used to link more than one result to one action</description>
+ <long>
+ <defaultValue>1</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="additionalInfo">
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </structMember>
+ </struct>
+
+ <enum name="Information">
+ <enumMember name="EXECUTED">
+ <description>The invoked action has been successfully executed without warnings.One of three possible main results of executed action.
+
+Value valid for type of invoked action:
+INSTALL
+CANCEL_INSTALL
+VERIFY_UPGRADE
+UPGRADE</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="UNSPECIFIED">
+ <description>A not specified error/ warning has been detected (see additional info for further details)
+
+Value valid for type of invoked action:
+INSTALL
+CANCEL_INSTALL
+VERIFY_UPGRADE
+UPGRADE</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="LM_CHECKSUM_VER_FAILED">
+ <description>A load module checksum verification has failed.
+
+Value valid for type of invoked action:
+INSTALL
+VERIFY_UPGRADE
+UPGRADE</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="NOT_ENOUGH_AVAIL_DISK_SPACE">
+ <description> There is not enough available disk space for the required number of new CVs (configuration versions) to be created automatically during an upgrade.
+
+Value valid for type of invoked action:
+VERIFY_UPGRADE
+UPGRADE</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="MAX_NO_CV_WILL_BE_EXCEEDED">
+ <description>The maximum number of allowed CVs (configuration versions) will be exceeded if the required number of new CVs is created automatically during an upgrade.
+
+Value valid for type of invoked action:
+VERIFY_UPGRADE
+UPGRADE</description>
+ <value>4</value>
+ </enumMember>
+ <enumMember name="UPGRADE_FROM_CURRENT_UP_NOT_ALLOWED">
+ <description>The Upgrade Window element in the Upgrade Control File does not specify the current Upgrade Package as a valid 'upgrade from' version.
+
+Value valid for type of invoked action:
+VERIFY_UPGRADE
+UPGRADE</description>
+ <value>5</value>
+ </enumMember>
+ <enumMember name="NON_SUPPORTED_PIU">
+ <description>A non supported Plug In Unit (PIU) has been detected i.e. the PIU in the node is not defined in the Upgrade Control File.
+This is not a fault that prevents an upgrade from being executed.
+
+Value valid for type of invoked action:
+VERIFY_UPGRADE
+UPGRADE</description>
+ <value>6</value>
+ </enumMember>
+ <enumMember name="FAULTY_PIU">
+ <description>A faulty Plug In Unit (PIU) has been detected.
+This is not a fault that prevents an upgrade from being executed.
+
+Value valid for type of invoked action:
+VERIFY_UPGRADE
+UPGRADE</description>
+ <value>7</value>
+ </enumMember>
+ <enumMember name="CREATION_OF_CV_FAILED">
+ <description>The auto-creation of an install CV failed.
+
+Value valid for type of invoked action:
+INSTALL
+</description>
+ <value>8</value>
+ </enumMember>
+ <enumMember name="ACTION_NOT_ALLOWED">
+ <description>The requested action is not allowed due to an other action already is in progress for an other UP MO.
+
+Value valid for type of invoked action:
+INSTALL
+CANCEL_INSTALL
+VERIFY_UPGRADE
+UPGRADE</description>
+ <value>9</value>
+ </enumMember>
+ <enumMember name="INSTALLATION_MANUALLY_CANCELLED">
+ <description>An ongoing installation has been cancelled (aborted) due to request from client.
+
+Value valid for type of invoked action:
+INSTALL</description>
+ <value>10</value>
+ </enumMember>
+ <enumMember name="FTP_SERVER_NOT_ACCESSIBLE">
+ <description>The FTP server to be used for downloads of load modules is not accessible.
+
+Value valid for type of invoked action:
+INSTALL</description>
+ <value>11</value>
+ </enumMember>
+ <enumMember name="INSUFFICIENT_DISK_SPACE_FOR_LOAD_MODULES">
+ <description>The required disk space for load modules to be installed is insufficient.
+
+Value valid for type of invoked action:
+INSTALL</description>
+ <value>12</value>
+ </enumMember>
+ <enumMember name="FTP_SERVER_IP_ADDRESS_ERROR">
+ <description>Error detected in the IP address of the FTP server.
+
+Value valid for type of invoked action:
+INSTALL</description>
+ <value>13</value>
+ </enumMember>
+ <enumMember name="DELTA_INSTALL_MERGE_ERROR">
+ <description>The install of the delta Upgrade Control File (UCF) failed i.e. the analysis of the delta UCF together with current active UP's UCF failed.
+
+Value valid for type of invoked action:
+INSTALL</description>
+ <value>14</value>
+ </enumMember>
+ <enumMember name="SELECTIVE_INSTALL_ERROR">
+ <description>Error detected during the selection phase of an install.
+
+Value valid for type of invoked action:
+INSTALL
+
+</description>
+ <value>15</value>
+ </enumMember>
+ <enumMember name="EXECUTION_FAILED">
+ <description>The execution of invoked action failed.One of three possible main results of executed action.
+
+Value valid for type of invoked action:
+INSTALL
+CANCEL_INSTALL
+VERIFY_UPGRADE
+UPGRADE</description>
+ <value>16</value>
+ </enumMember>
+ <enumMember name="EXECUTED_WITH_WARNINGS">
+ <description>The action has been successfully executed but with warnings.One of three possible main results of executed action.
+
+Value valid for type of invoked action:
+INSTALL
+CANCEL_INSTALL
+VERIFY_UPGRADE</description>
+ <value>17</value>
+ </enumMember>
+ </enum>
+
+ <exception name="FtpServerNotAccessibleException">
+ <description>Ftp server is not accessible. This may depend on erroneous IP address, username, password, or that the IP communication with the Ftp server is down, or that the Ftp server itself is malfunctioning. </description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="GetFileException">
+ <description>An error was encountered during FTP get file. A filePath in the upgradeControlFile may be inconsistent with a filepath on the Ftp server. </description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <struct name="PiuTypeProgramConfiguration">
+ <structMember name="tag">
+ <description>The tag is used as a reference between the PiuType MO and the Repertoire MO to find out how to create the program object under a PlugInUnit MO.</description>
+ <string/>
+ </structMember>
+ <structMember name="subParentLDN">
+ <description>Local distinguished name of the program parent from the PlugInUnit.
+
+Example:
+1. "Spu=1,Spm=2" (the program is to be created under: ...PlugInUnit=2,Spu=1,Spm=2")
+2. "" (empty string - the program is to be created directly under the PlugInUnit)</description>
+ <string/>
+ </structMember>
+ <structMember name="programMoTypeName">
+ <description>The name of the Program MO that will be created.</description>
+ <string/>
+ </structMember>
+ <structMember name="loadableProcessorName">
+ <description>The loadableProcessorName is a user friendly name of the processor.</description>
+ <string/>
+ </structMember>
+ </struct>
+
+ <struct name="RepertoireLoadModuleData">
+ <description>This structure contains load module data that belongs to a piu type.
+</description>
+ <structMember name="loadModuleDN">
+ <description>The distinguished name of the load module, which is needed and sufficient to convert the load module to a real object reference.</description>
+ <string/>
+ </structMember>
+ <structMember name="tag">
+ <description>The tag is used as a reference between the PiuType MO and the Repertoire MO to find out how to create the program object under a PlugInUnit MO.</description>
+ <string/>
+ </structMember>
+ </struct>
+
+ <struct name="ConfigurationVersionAttributes">
+ <structMember name="name">
+ <string>
+ </string>
+ </structMember>
+ <structMember name="identity">
+ <string>
+ </string>
+ </structMember>
+ <structMember name="type">
+ <string/>
+ </structMember>
+ <structMember name="upgradePackageId">
+ <string/>
+ </structMember>
+ <structMember name="operatorName">
+ <string>
+ </string>
+ </structMember>
+ <structMember name="operatorComment">
+ <string>
+ </string>
+ </structMember>
+ <structMember name="date">
+ <string/>
+ </structMember>
+ <structMember name="status">
+ <string/>
+ </structMember>
+ </struct>
+
+ <enum name="ConfigurationVersionType">
+ <enumMember name="standard">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="upgrade">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="minimal">
+ <value>2</value>
+ </enumMember>
+ <enumMember name="test">
+ <value>3</value>
+ </enumMember>
+ <enumMember name="autocreate">
+ <value>4</value>
+ </enumMember>
+ <enumMember name="other">
+ <value>5</value>
+ </enumMember>
+ </enum>
+
+ <enum name="LoadModuleLoaderType">
+ <enumMember name="OseLoader">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="SpmLoader">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="Jvm">
+ <value>2</value>
+ </enumMember>
+ <enumMember name="WebServer">
+ <value>3</value>
+ </enumMember>
+ <enumMember name="Other">
+ <value>99</value>
+ </enumMember>
+ <enumMember name="SpmFpgaLoader">
+ <value>4</value>
+ </enumMember>
+ <enumMember name="XpLoader">
+ <value>5</value>
+ </enumMember>
+ </enum>
+
+ <enum name="LoadModulePreLoadType">
+ <enumMember name="no">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="must">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="wish">
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="RPUSwitchOverMode">
+ <description>This attribute can have the following values:
+
+AtPiuFault = Indicates the MP (where the normal RPU is configured) is faulty (HW error). This is the default value.
+
+AtPiuRestart = Indicates the MP (where the normal RPU is configured) is restarted.</description>
+ <enumMember name="AtPiuFault">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="AtPiuRestart">
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="RPUNormalisationMode">
+ <description>This enumeration can have the following values:
+
+Manual = Indicates that no normalisation is performed by cello until the operator issues a "switch" action.
+
+Automatic = Indicates that Cello performs the normalisation automatically, after the failed RPU is available again. This is the default value.</description>
+ <enumMember name="Manual">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="Automatic">
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="RPUReplicationMode">
+ <description>This enumaration contains the following values:
+
+Always = Data replication is always performed. This overrides the characteristics set on the each container ( that is associated with the RPU ).
+
+Never = Data replication is never performed. This overrides the characteristics set on the each container ( that is associated with the RPU ).
+
+AtShutdown = Each time the RSH (which handles the RPU) is shut down, a complete snapshot is taken and replicated to the other MP, if necessary. Otherwise, the replication is performed according to the characteristics set on each container ( that is associated with the RPU ).
+
+ApplControlled = The data replication is made according to the characteristics set on each container ( that is associated with the RPU ). This is the default value.</description>
+ <enumMember name="Always">
+ <description>Always = Data replication is always performed. This overrides the characteristics set on the each container ( that is associated with the RPU ).</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="Never">
+ <description>Data replication is never performed. This overrides the characteristics set on the each container ( that is associated with the RPU ).</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="AtShutdown">
+ <description>AtShutdown = Each time the RSH (which handles the RPU) is shut down, a complete snapshot is taken and replicated to the other MP, if necessary. Otherwise, the replication is performed according to the characteristics set on each container ( that is associated with the RPU ).</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="ApplControlled">
+ <description>ApplControlled = The data replication is made according to the characteristics set on each container ( that is associated with the RPU ). This is the default value.</description>
+ <value>4</value>
+ </enumMember>
+ </enum>
+
+ <enum name="RPUOperationalMode">
+ <description>This enumeration contains the following values:
+
+AsConfigured = The RSHs runs as the RPU is configured.
+SwitchOver = The RSHs has been switched over.
+Unavailable = No RSHs, that uses this RPU, are running.</description>
+ <enumMember name="AsConfigured">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="SwitchedOver">
+ <value>2</value>
+ </enumMember>
+ <enumMember name="Unavailable">
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <struct name="PiuTypeMOConfiguration">
+ <structMember name="subParentLDN">
+ <string/>
+ </structMember>
+ <structMember name="moTypeName">
+ <string/>
+ </structMember>
+ <structMember name="identity">
+ <string/>
+ </structMember>
+ </struct>
+
+ <struct name="AirFlowData">
+ <description>Control value for the fan unit. Needed by cooling function.
+</description>
+ <structMember name="normalLowTempAirFlow">
+ <description>Control value for the fan unit running in normal autonomous mode.
+This parameter is the subrack/fanunit airflow value that is required to achieve sufficient cooling at 20 degree
+centigrade or lower ambient temperature of the most demanding plug in unit (PIU) in the subrack. This airflow value
+shall be sufficient (but not unnecessarily large) to secure that no "normal overtemp" fault indication is issued.
+Default values = 250 m3/h. (value &gt;=0)
+</description>
+ <float>
+ <defaultValue>250</defaultValue>
+ </float>
+ </structMember>
+ <structMember name="normalHighTempAirFlow">
+ <description>Control value for the fan unit running in normal autonomous mode. This parameter is the subrack/fanunit airflow
+value that is required to achieve sufficient cooling at 50 degree centigrade ambient temperature of the most
+demanding plug in unit (PIU) in the subrack. This airflow value shall be sufficient (but not unnecessarily large) to
+secure that no "normal overtemp" fault indication is issued.
+Default values = 400 m3/h. (value &gt;=0)</description>
+ <float>
+ <defaultValue>400</defaultValue>
+ </float>
+ </structMember>
+ <structMember name="noiseReducedLowTempAirFlow">
+ <description>Control value for the fan unit running in noise reduction mode. This parameter is the subrack/fanunit airflow value
+that is required to achieve sufficient cooling at 20 degree centigrade or lower ambient temperature of the most
+demanding plug in unit (PIU) in the subrack. This airflow value shall be sufficient (but not unnecessarily large) to
+secure that no "exceptional overtemp" fault indication is issued
+Default values = 250 m3/h. (value &gt;=0)</description>
+ <float>
+ <defaultValue>250</defaultValue>
+ </float>
+ </structMember>
+ <structMember name="noiseReducedHighTempAirFlow">
+ <description>Control value for the fan unit running in noise reduction mode. This parameter is the subrack/fanunit airflow value
+that is required to achieve sufficient cooling at 50 degree centigrade ambient temperature of the most demanding
+plug in unit (PIU) in the subrack. This airflow value shall be sufficient (but not unnecessarily large) to secure
+that no "exceptional overtemp" fault indication is issued.
+Default values = 400 m3/h. (value &gt;=0)</description>
+ <float>
+ <defaultValue>400</defaultValue>
+ </float>
+ </structMember>
+ </struct>
+
+ <exception name="IpAddressException">
+ <description>Erroneous Ip Address Format</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="AueFailureException">
+ <description>An application upgrade engine has reported a failure. </description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="ActionNotAllowedException">
+ <description>The action is not allowed, the UpgradePackage MO is in wrong state.
+
+For example if you try 'upgrade()' before an 'install()' or 'forcedInstall()' has been done.</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="CVFileSystemErrorException">
+ <description>Exception thrown upon file system Error.</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="CVDBErrorException">
+ <description>Data Base Error Exception (error when creating database backup).</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="CVLLPErrorException">
+ <description>LLP Error Exception (error when creating ARMAMENT and LLP.LMID files).</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="CVAlreadyExistsException">
+ <description>The configuration version already exists (e.g. message at create).</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="CVDoesNotExistsException">
+ <description>The configuration version does not exist (e.g. message at setCVAsStartable).</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="CVDeleteNotAllowedException">
+ <description>It is not allowed to delete the configuration version, because it is in use (used as startable or in rollback list).</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="CVInvalidCVException">
+ <description>The configuration version is not valid (due to missing files).
+
+</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="CVFormatErrorException">
+ <description>Format Error in given configuration version name.
+
+The following characters are allowed within the name:
+[0-9], [A-Z], [a-z] and '&amp;','%',':','.','_', '-'
+
+Note! For comment and operatorName spaces (' ') are also allowed within the strings.</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="CVErrorException">
+ <description>Error Exception.</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="InstallException">
+ <description>Indicates that an error in an installation has occurred.</description>
+ <exceptionParameter name="install">
+ <description>The message of the exception.</description>
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="LogActivationException">
+ <description>Exception thrown when a database error occurs.</description>
+ </exception>
+
+ <exception name="InvalidDriveNameException">
+ <description>Exception thrown when an invalid drive name is specified or when a data base error occurs.</description>
+ </exception>
+
+ <exception name="VerifyUpgradeException">
+ </exception>
+
+ <exception name="CVActivityLogFilePathErrorException">
+ <description>Exception thrown when the log file path is wrong.</description>
+ </exception>
+
+ <exception name="CV_MaxNumberOfInstancesException">
+ <description>Exception thrown when max number of CV's in the system has been reached.</description>
+ </exception>
+
+ <exception name="Aal2PathIdNotUniqueException">
+ <exceptionParameter name="message">
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="PathAlreadyRegisteredException">
+ <exceptionParameter name="message">
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="NotInGroupException">
+ </exception>
+
+ <exception name="InvalidReferenceException">
+ </exception>
+
+ <exception name="InvalidPriorityException">
+ <description>Indicates an invalid priority level, i.e. the priority in question is out of the defined range.</description>
+ <exceptionParameter name="invalidPriority">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <struct name="QoSProfileClassA">
+ <description>This struct contains the values applicable for QoS Class A.</description>
+ <structMember name="boundOnProbOfDelay">
+ <description>Represents the upper bound on the probability that the delay in the node exceeds the delay limit given by the attribute "boundOnNodeDelay".
+
+Unit is 1/1000000000.
+</description>
+ <long>
+ <range>
+ <min>0</min> <max>1000000000</max>
+ </range>
+ <defaultValue>500000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="boundOnProbOfLoss">
+ <description>Represents the upper bound of the cell loss probability in the current node.
+
+Unit is 1/1000000000.</description>
+ <long>
+ <range>
+ <min>0</min> <max>1000000000</max>
+ </range>
+ <defaultValue>500000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="boundOnNodeDelay">
+ <description>The upper bound on the delay (delay=queueing and serving of Aal2 packets in an Aal2 mux + delay on ATM layer) through the current node.
+Unit is micro seconds.</description>
+ <long>
+ <range>
+ <min>0</min> <max>10000</max>
+ </range>
+ <defaultValue>5000</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <struct name="QoSProfileClassB">
+ <description>This struct contains the values applicable for QoS Class B.</description>
+ <structMember name="boundOnProbOfDelay">
+ <description>Represents the upper bound on the probability that the delay in the node exceeds the delay limit given by the attribute "boundOnNodeDelay".
+
+Unit is 1/1000000000.</description>
+ <long>
+ <range>
+ <min>0</min> <max>1000000000</max>
+ </range>
+ <defaultValue>500000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="boundOnProbOfLoss">
+ <description>Represents the upper bound of the cell loss probability in the current node.
+
+Unit is 1/1000000000.
+</description>
+ <long>
+ <range>
+ <min>0</min> <max>1000000000</max>
+ </range>
+ <defaultValue>500000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="boundOnNodeDelay">
+ <description>The upper bound on the delay (delay=queueing and serving of Aal2 packets in an Aal2 mux + delay on ATM layer) through the current node.
+Unit is micro seconds.</description>
+ <long>
+ <range>
+ <min>0</min> <max>20000</max>
+ </range>
+ <defaultValue>15000</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <struct name="QoSProfileClassC">
+ <description>This struct contains the values applicable for QoS Class C.
+
+NOTE: The attribute 'boundONodeDelay' is not applicable for QoS Class C so setting of this attribute will have no effect.</description>
+ <structMember name="boundOnProbOfDelay">
+ <description>Represents the upper bound on the probability that the delay in the node exceeds the delay limit given by the attribute "boundOnNodeDelay".
+
+Unit is 1/1000000000.</description>
+ <long>
+ <range>
+ <min>0</min> <max>1000000000</max>
+ </range>
+ <defaultValue>1000000000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="boundOnProbOfLoss">
+ <description>Represents the upper bound of the cell loss probability in the current node.
+
+Unit is 1/1000000000.
+</description>
+ <long>
+ <range>
+ <min>0</min> <max>1000000000</max>
+ </range>
+ <defaultValue>1000000000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="boundOnNodeDelay">
+ <description>The upper bound on the delay (delay=queueing and serving of Aal2 packets in an Aal2 mux + delay on ATM layer) through the current node.
+Unit is micro seconds.</description>
+ <long>
+ <defaultValue>25000</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <struct name="QoSProfileClassD">
+ <description>This struct contains the values applicable for QoS Class D.
+
+NOTE: The attribute 'boundONodeDelay' is not applicable for QoS Class D so setting of this attribute will have no effect.</description>
+ <structMember name="boundOnProbOfDelay">
+ <description>Represents the upper bound on the probability that the delay in the node exceeds the delay limit given by the attribute "boundOnNodeDelay".
+
+Unit is 1/1000000000.</description>
+ <long>
+ <range>
+ <min>1</min> <max>1000000000</max>
+ </range>
+ <defaultValue>1000000000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="boundOnProbOfLoss">
+ <description>Represents the upper bound of the cell loss probability in the current node.
+
+Unit is 1/1000000000.</description>
+ <long>
+ <range>
+ <min>0</min> <max>1000000000</max>
+ </range>
+ <defaultValue>1000000000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="boundOnNodeDelay">
+ <description>The upper bound on the delay (delay=queueing and serving of Aal2 packets in an Aal2 mux + delay on ATM layer) through the current node.
+Unit is micro seconds.</description>
+ <long>
+ <defaultValue>50000</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <enum name="SupportedQoSClasses">
+ <enumMember name="NO_CLASS_SUPPORTED">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="CLASS_A">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="CLASS_B">
+ <value>2</value>
+ </enumMember>
+ <enumMember name="CLASS_A_B">
+ <value>3</value>
+ </enumMember>
+ <enumMember name="CLASS_C">
+ <value>4</value>
+ </enumMember>
+ <enumMember name="CLASS_A_C">
+ <value>5</value>
+ </enumMember>
+ <enumMember name="CLASS_B_C">
+ <value>6</value>
+ </enumMember>
+ <enumMember name="CLASS_A_B_C">
+ <value>7</value>
+ </enumMember>
+ <enumMember name="CLASS_D">
+ <value>8</value>
+ </enumMember>
+ <enumMember name="CLASS_A_D">
+ <value>9</value>
+ </enumMember>
+ <enumMember name="CLASS_B_D">
+ <value>10</value>
+ </enumMember>
+ <enumMember name="CLASS_A_B_D">
+ <value>11</value>
+ </enumMember>
+ <enumMember name="CLASS_C_D">
+ <value>12</value>
+ </enumMember>
+ <enumMember name="CLASS_A_C_D">
+ <value>13</value>
+ </enumMember>
+ <enumMember name="CLASS_B_C_D">
+ <value>14</value>
+ </enumMember>
+ <enumMember name="CLASS_A_B_C_D">
+ <value>15</value>
+ </enumMember>
+ </enum>
+
+ <exception name="IsReservedCanNotSetPathIdException">
+ <description>Exception thrown when an attempt is made to set or change the aal2PathId of an Aal2PathVccTp while its reserved by an other Aal2PathGrp</description>
+ </exception>
+
+ <exception name="IsUnlockedCanNotSetPathOwnerException">
+ <description>Exception thrown when an attempt is made to set or change the aal2PathOwner of an Aal2PathVccTp while its not LOCKED.</description>
+ </exception>
+
+ <enum name="SlotState">
+ <description>
+</description>
+ <enumMember name="free">
+ <description>It is free to be pre-configured with a new PlugInUnit. </description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="used">
+ <description>A PlugInUnit is inserted in the slot or the slot is pre-configured with a PlugInUnit.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="coveredByPiu">
+ <description>Currently not supported.</description>
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <struct name="AdminProductData">
+ <structMember name="productNumber">
+ <description>The product number of the product or document.
+
+Examples: ABC 101 001, CXC 123 456, 1/BFD 101 999
+
+In the case of UpgradePackage this is the document number of the upgrade package.</description>
+ <string>
+ <lengthRange>
+ <min>1</min> <max>24</max>
+ </lengthRange>
+ </string>
+ </structMember>
+ <structMember name="productRevision">
+ <description>The revision of the product number.
+
+Examples: R1, r1a, R1A02, P7B</description>
+ <string>
+ <lengthRange>
+ <min>1</min> <max>7</max>
+ </lengthRange>
+ </string>
+ </structMember>
+ <structMember name="productName">
+ <description>A user-friendly name of the product.</description>
+ <string>
+ <lengthRange>
+ <min>1</min> <max>12</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </structMember>
+ <structMember name="productInfo">
+ <description>User-friendly information about the product.</description>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </structMember>
+ <structMember name="productionDate">
+ <description>The production date can be represented in two ways.
+
+1) The preferable syntax is a four-digit representation of the year, and a two-digit representation of the month and a two-digit representation of the day. The numbers of characters in this case, is eight.
+Example:
+19991231
+
+2) The date can also consist of two digits for the year, followed by the letter W for week and two digits for the number of week. The numbers of characters in this case, is five.
+Example:
+99W12
+</description>
+ <string>
+ <lengthRange>
+ <min>1</min> <max>8</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </structMember>
+ </struct>
+
+ <struct name="OperProductData">
+ <structMember name="productName">
+ <description>A user-friendly name of the product.
+
+
+
+</description>
+ <string>
+ <lengthRange>
+ <min>1</min> <max>12</max>
+ </lengthRange>
+ </string>
+ </structMember>
+ <structMember name="productNumber">
+ <description>Unique identity for each product, which is constituted by the Ericsson product number (ABC number).
+
+The maximum number of characters for a product number is 24 including 2 slashes, 2 spaces and 2 characters for origination notation.
+
+Example of product number:
+ABC 101 001
+(1/ABC 101 01/1234)
+123/ABCDE 101 1010/12345
+
+.</description>
+ <string>
+ <lengthRange>
+ <min>1</min> <max>24</max>
+ </lengthRange>
+ </string>
+ </structMember>
+ <structMember name="productRevision">
+ <description>Indicates the revision state of the product. It consists of a letter R or P, one or two digits and/or one or two letters. The maximum number of characters is four inclusive R or P.
+Example: R1A, R1A02, P7B
+
+A suffix may be added to the revision state. The suffix may consists of one or two digits or one letter.
+
+
+</description>
+ <string>
+ <lengthRange>
+ <min>1</min> <max>7</max>
+ </lengthRange>
+ </string>
+ </structMember>
+ <structMember name="serialNumber">
+ <description>The serial number consists of 13 alphanumerical characters grouped as 6 plus 7 characters. The first 6 characters are to be used for factory codes and the last 7 characters are used for an individual number or batch number.
+
+</description>
+ <string/>
+ </structMember>
+ <structMember name="productionDate">
+ <description>The production date can be represented in two ways.
+
+1) The preferable syntax is a four-digit representation of the year, and a two-digit representation of the month and a two-digit representation of the day. The numbers of characters in this case, is eight.
+Example:
+19991231
+
+2) The date can also consist of two digits for the year, followed by the letter W for week and two digits for the number of week. The numbers of characters in this case, is five.
+Example:
+99W12
+
+</description>
+ <string>
+ <lengthRange>
+ <min>5</min> <max>8</max>
+ </lengthRange>
+ </string>
+ </structMember>
+ </struct>
+
+ <enum name="LoadClass">
+ <description>Defines the phase in the load and start sequence.
+</description>
+ <enumMember name="coreOs">
+ <value>10</value>
+ </enumMember>
+ <enumMember name="coreDevice">
+ <value>50</value>
+ </enumMember>
+ <enumMember name="loadListProvider">
+ <value>100</value>
+ </enumMember>
+ <enumMember name="coreEarly">
+ <value>200</value>
+ </enumMember>
+ <enumMember name="coreLate">
+ <value>300</value>
+ </enumMember>
+ <enumMember name="networkAndConnectionHandling">
+ <value>400</value>
+ </enumMember>
+ <enumMember name="application">
+ <value>500</value>
+ </enumMember>
+ <enumMember name="upgrade">
+ <value>600</value>
+ </enumMember>
+ </enum>
+
+ <enum name="StartState">
+ <enumMember name="disabled">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="enabled">
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="SubrackType">
+ <enumMember name="hub">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="device">
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="PiuRole">
+ <enumMember name="mp">
+ <description>The board is a Main processor.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="bp">
+ <description>The board is a device board.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="others">
+ <description>The board is not a Main processor or a device board. </description>
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <enum name="RestartCause">
+ <description>This attribute indicates the restart cause of plugInUnit. The defined values are:
+1. piuRestartError: restart because of error.
+2. piuRestartUpgrade: restart because of system upgrade.
+</description>
+ <enumMember name="piuRestartUpgrade">
+ <description>This attributes indicates that the Piu restart cause is upgrade.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="piuRestartError">
+ <description>This attributes indicates that the Piu restart cause is error.</description>
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="FanState">
+ <description>The Fan can be in one of three controlling state:
+- standalone: not manageable, full speed fans
+- autonomous: manageable, air-flow control
+- noiseReduced: time-limited low speed fan</description>
+ <enumMember name="standalone">
+ <description>It's running on itself, not manageable.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="autonomous">
+ <description>Manageable state.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="noiseReduced">
+ <description>Temporary state with reduced cooling.</description>
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <enum name="SeqRestarts">
+ <enumMember name="RESTARTS_WITH_NO_LIMITS">
+ <description>This attributes indicates unlimited restarts and no faulty marking of the PIU. Used for critical PIU's such as TUBs, SCBs and some ET-boards.
+</description>
+ <value>-1</value>
+ </enumMember>
+ <enumMember name="RESTARTS_WITH_WARM">
+ <description>This attributes indicates the following sequential restarts:
+-warm
+-refresh
+-cold
+-cold with fault marked (not loaded). Alarm sent.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="RESTARTS_WITH_REFRESH">
+ <description>This attributes indicates the following sequential restarts:
+-refresh
+-cold
+-cold with fault marked (not loaded). Alarm sent.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="RESTARTS_WITH_COLD">
+ <description>This attributes indicates the following sequential restarts:
+-cold
+-cold with fault marked (not loaded). Alarm sent.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="RESTARTS_WITH_FAULT_MARKED">
+ <description>This attributes indicates the following sequential restarts:
+-cold with fault marked (not loaded). Alarm sent.</description>
+ <value>0</value>
+ </enumMember>
+ </enum>
+
+ <exception name="RepertoireNotFoundException">
+ <description>This class is an exception class thrown when a equipment specific error occurs.
+</description>
+ </exception>
+
+ <exception name="SwAllocationNotFoundException">
+ <description>This class is an exception class thrown when a equipment specific error occurs.
+</description>
+ </exception>
+
+ <exception name="WebServerPathConfigurationException">
+ <description>This class is an exception class thrown when failed to configure the webserver root path
+</description>
+ </exception>
+
+ <exception name="FroLocationFailedException">
+ </exception>
+
+ <exception name="FroShutdownException">
+ </exception>
+
+ <exception name="NotUniqueLineNoException">
+ </exception>
+
+ <exception name="WrongPhysPathTermTypeException">
+ </exception>
+
+ <enum name="OperState">
+ <enumMember name="disabled">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="enabled">
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="AdmState">
+ <enumMember name="locked">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="unlocked">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="shuttingDown">
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <exception name="OccupiedException">
+ </exception>
+
+ <exception name="NotReservedException">
+ </exception>
+
+ <exception name="NotSupportedException">
+ </exception>
+
+ <enum name="SilPortState">
+ <description>Indication of Switch Internal Link port status.</description>
+ <enumMember name="portActive">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="portPassive">
+ <value>2</value>
+ </enumMember>
+ <enumMember name="portNotConnected">
+ <value>3</value>
+ </enumMember>
+ <enumMember name="portLocked">
+ <value>4</value>
+ </enumMember>
+ <enumMember name="portNotInstalled">
+ <value>5</value>
+ </enumMember>
+ </enum>
+
+ <exception name="InvalidIndexException">
+ <description>Index specified is invalid, i.e. it is out of the range of valid indices.</description>
+ <exceptionParameter name="invalidIndex">
+ <description>The exception message.</description>
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="TransactionException">
+ </exception>
+
+ <exception name="UndeletableMoException">
+ <description>Exception thrown when MO is not possible to delete.</description>
+ </exception>
+
+ <exception name="FroNotAccessibleException">
+ <description>Exception that is thrown when a FRO (Facade Resource Object in the resource layer) cannot be accessed.</description>
+ </exception>
+
+ <exception name="FroRequestFailedException">
+ <description>Exception that is thrown when the result of a request to a FRO (Facade Resource Object in the resource layer) is not ok.</description>
+ </exception>
+
+ <exception name="MoReservedByOtherUserException">
+ <description>Exception thrown when the MO is already reserved by another user (MO).</description>
+ </exception>
+
+ <exception name="MoHasChildrenException">
+ <description>Exception class thrown when an MO is requested to be deleted, but the MO has children, which must be deleted first.</description>
+ </exception>
+
+ <exception name="MoReservedNotDeletableException">
+ <description>Exception thrown when trying to delete an MO that is reserved by another MO (user).</description>
+ </exception>
+
+ <exception name="MaxNumberExceededException">
+ <description>Exception thrown when the maximum number of childrens for an MO is exceeded.</description>
+ </exception>
+
+ <exception name="AttrValueNotUniqueException">
+ <description>Exception thrown when a value of an attribute is not unique.</description>
+ </exception>
+
+ <exception name="EquipException">
+ </exception>
+
+ <exception name="IpFormatException">
+ </exception>
+
+ <exception name="IpException">
+ </exception>
+
+ <exception name="TransactionRequiredException">
+ <description>Exception class thrown when an MO is accessed outside a transaction but the access method requires a transaction.</description>
+ </exception>
+
+ <exception name="ValueOutOfRangeException">
+ <description>Exception thrown when an MO attribute is requested to be set, but the requested value is not accepted.</description>
+ </exception>
+
+ <exception name="WrongAttributeTypeException">
+ <description>Exception thrown when an MO attribute is requested to be set, but the requested value is of the wrong type. </description>
+ </exception>
+
+ <exception name="NotHandledAttributeTypeException">
+ <description>Exception class thrown when an attribute of not handled type is requested. </description>
+ </exception>
+
+ <exception name="NoSuchFieldException">
+ <description>Exception class thrown when a Struct is accessed but the reqested Struct element is not found. </description>
+ </exception>
+
+ <exception name="MoCanNotBeCreatedException">
+ </exception>
+
+ <exception name="NoSuchAttributeException">
+ <description>Exception thrown when an MO attribute is requested to be accessed but the access
+method for the is not defined (the attribute can not be accessed)</description>
+ </exception>
+
+ <exception name="MoCardinalityViolationException">
+ <description>Exception class thrown when the creation of an MO fails due to child - parent
+cardinality violation. The cardinality is specified in the MIM. </description>
+ </exception>
+
+ <exception name="IllegalParentException">
+ <description>Exception thrown when the parent of the MO is of the wrong type.</description>
+ </exception>
+
+ <exception name="AttrNotSettableAtCreateException">
+ <description>Exception thrown when a create is ordered with
+attribute values that are not settable at create.</description>
+ </exception>
+
+ <exception name="AttrMissingAtCreateException">
+ <description>Exception thrown when an attribute that is mandatory at create is missing.</description>
+ </exception>
+
+ <exception name="MoNameAlreadyTakenException">
+ <description>Exception thrown when an MO is created and the distinguished name of the MO is already in use.</description>
+ </exception>
+
+ <exception name="IllegalArgumentTypeException">
+ <description>Exception thrown if the argument supplied is of the wrong type, for example in an action.</description>
+ </exception>
+
+ <exception name="IllegalAttributeValueException">
+ <description>Exception thrown if the value of the attribute is not valid.</description>
+ </exception>
+
+ <enum name="RestartRank">
+ <enumMember name="RESTART_WARM">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="RESTART_REFRESH">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="RESTART_COLD">
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="AvailabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <enumMember name="IN_TEST">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="FAILED">
+ <value>2</value>
+ </enumMember>
+ <enumMember name="POWER_OFF">
+ <value>4</value>
+ </enumMember>
+ <enumMember name="OFF_LINE">
+ <value>8</value>
+ </enumMember>
+ <enumMember name="OFF_DUTY">
+ <value>16</value>
+ </enumMember>
+ <enumMember name="DEGRADED">
+ <value>64</value>
+ </enumMember>
+ <enumMember name="NOT_INSTALLED">
+ <value>128</value>
+ </enumMember>
+ <enumMember name="LOG_FULL">
+ <value>256</value>
+ </enumMember>
+ <enumMember name="DEPENDENCY_LOCKED">
+ <value>544</value>
+ </enumMember>
+ <enumMember name="DEPENDENCY_FAILED">
+ <value>1056</value>
+ </enumMember>
+ <enumMember name="DEPENDENCY_SHUTTINGDOWN">
+ <value>2080</value>
+ </enumMember>
+ <enumMember name="NO_STATUS">
+ <value>0</value>
+ </enumMember>
+ </enum>
+
+ <exception name="InvalidMoReferenceException">
+ <description>Exception thrown when the submitted MO reference is invalid.</description>
+ </exception>
+
+ <exception name="FroNotLockedException">
+ <description>Exception thrown when a fRo cannot be accessed.</description>
+ </exception>
+
+ <exception name="GeneralErrorException">
+ <description>Exception thrown by an MO when there is a general error.</description>
+ </exception>
+
+ <exception name="IdentityNotAllowedException">
+ <description>Exception thrown when an identity (LDN) specified at create is not allowed.</description>
+ </exception>
+
+ <exception name="IllegalMoTypeException">
+ <description>Exception thrown when a reference to an MO is of a unexpected/wrong MO type.</description>
+ </exception>
+
+ <exception name="ImpossibleCollectAtmInfoException">
+ <description>Exception thrown when gathering of ATM info fails.</description>
+ </exception>
+
+ <exception name="MoCanNotBeDeletedException">
+ <description>Exception thrown when its not possible to delete an MO.</description>
+ </exception>
+
+ <exception name="MoNotPossibleToReserveException">
+ <description>Exception thrown when by an MO if its not possible to reserve the MO.</description>
+ </exception>
+
+ <exception name="MoNotReservedByUserException">
+ <description>Exception thrown when a user tries to release an MO that is not reserved by this user.</description>
+ </exception>
+
+ <exception name="NoDiskException">
+ <description>Exception thrown when there is no hard disk.</description>
+ </exception>
+
+ <exception name="RemovalFailedException">
+ <description>Exception thrown when an element cannot be removed from a sequence.</description>
+ </exception>
+
+ <exception name="RestartRejectedException">
+ <description>Exception thrown when restart of the PlugInUnit is not allowed.</description>
+ </exception>
+
+ <enum name="SyncMode">
+ <description>The Sync Mode Operation of the node.</description>
+ <enumMember name="NOT_USED">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="CDMA">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="WCDMA">
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <struct name="Mtp2ProfileDataAnsi">
+ <structMember name="suermT">
+ <description>SUERM parameter T.
+Measured in SU units.</description>
+ <long>
+ <range>
+ <min>1</min> <max>511</max>
+ </range>
+ <defaultValue>64</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="suermD">
+ <description>SUREM parameter D.
+Measurement units are in SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>256</max>
+ </range>
+ <defaultValue>256</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="suermN">
+ <description>SUERM parameter N.
+Measurement units are in SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>256</max>
+ </range>
+ <defaultValue>16</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="tin">
+ <description>Normal AERM threshold, Tin. Number of signal errors that cause abortion of a normal proving peroid.
+
+Measurement units are SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>7</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="tie">
+ <description>Emergency AERM threshold, Tie. Number of signal units errors that cause abortion of an emergency proving period.
+
+Measurement units are SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>7</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="provings">
+ <description>Proving abort limit. Number of consecutive aborted proving periods that will cause a return to the Out Of Service state.
+
+Measurement units are the number of proving periods.</description>
+ <long>
+ <range>
+ <min>1</min> <max>7</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT1">
+ <description>Maximum time to stay in Aligned Ready state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>16300</max>
+ </range>
+ <defaultValue>12900</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT2">
+ <description>Maximum time to stay in Not Aligned state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>32700</max>
+ </range>
+ <defaultValue>5000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT3">
+ <description>Maximum time to stay in Aligned state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>16300</max>
+ </range>
+ <defaultValue>11500</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT4n">
+ <description>Length of the normal proving period.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>4000</max>
+ </range>
+ <defaultValue>2300</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT4e">
+ <description>Length of the emergengcy proving period.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>4000</max>
+ </range>
+ <defaultValue>600</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT5">
+ <description>Time between sending Status Indication "B" while in the Congested state.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>1</min> <max>255</max>
+ </range>
+ <defaultValue>80</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT6">
+ <description>Maximum time a remote site may remain in the congestated state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>8100</max>
+ </range>
+ <defaultValue>1000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT7">
+ <description>Maximum time to wait for an expected acknowledgement of an MSU before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>2000</max>
+ </range>
+ <defaultValue>500</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="bitRate">
+ <description>The speed of the link. Only supported values are 64 and 56 kbit/s.
+0 = 64 kbit/s.
+1 = 56 kbit/s.
+
+</description>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="errorCorrection">
+ <description>The error correction algorithm to use. Only Basic Error Correction (BEC) is supported.
+0 = BEC
+</description>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionOnSet1">
+ <description>Percentage of the Transmit Buffer that will cause MTP2 to signal congestion for prio 1 messages towards client.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>70</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionOnSet2">
+ <description>Percentage of the Transmit Buffer that will cause MTP2 to signal congestion for prio 2 messages towards client.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>80</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionOnSet3">
+ <description>Percentage of the Transmit Buffer that will cause MTP2 to signal congestion for prio 3 messages towards client.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>90</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionAbatement1">
+ <description>Percentage of the Transmit Buffer that ceases congestion for prio 1 messages.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>60</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionAbatement2">
+ <description>Percentage of the Transmit Buffer that ceases congestion for prio 2 messages.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>70</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionAbatement3">
+ <description>Percentage of the Transmit Buffer that ceases congestion for prio 3 messages.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>80</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionDiscardLevel1">
+ <description>Percentage of the Transmit Buffer where messages sent to MTP2 from client with priority less than 1 is discarded by MTP2.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionDiscardLevel2">
+ <description>Percentage of the Transmit Buffer where messages sent to MTP2 from client with priority less than 2 is discarded by MTP2.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionDiscardLevel3">
+ <description>Percentage of the Transmit Buffer where messages sent to MTP2 from client with priority less than 3 is discarded by MTP2.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="n1Onset">
+ <description>Number of MSUs in ReTransmit Buffer before onset of preventive retransmission in PCR.
+NOTE: Only valid if errorCorrection==SCC_MTP2_ERROR_CORRECTION_PCR.
+This value is ignored otherwise.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>60</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="n2Onset">
+ <description>Number of MSUs in ReTransmit Buffer before onset of preventive retransmission in PCR.
+NOTE: Only valid if errorCorrection==SCC_MTP2_ERROR_CORRECTION_PCR.
+This value is ignored otherwise.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>70</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <struct name="Mtp2ProfileDataItu">
+ <structMember name="suermT">
+ <description>SUERM parameter T.
+Measured in SU units.</description>
+ <long>
+ <range>
+ <min>1</min> <max>64</max>
+ </range>
+ <defaultValue>64</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="suermD">
+ <description>SUREM parameter D.
+Measurement units are in SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>256</max>
+ </range>
+ <defaultValue>256</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="suermN">
+ <description>SUERM parameter N.
+Measurement units are in SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>256</max>
+ </range>
+ <defaultValue>16</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="tin">
+ <description>Normal AERM threshold, Tin. Number of signal errors that cause abortion of a normal proving peroid.
+
+Measurement units are SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>7</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="tie">
+ <description>Emergency AERM threshold, Tie. Number of signal units errors that cause abortion of an emergency proving period.
+
+Measurement units are SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>7</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="provings">
+ <description>Proving abort limit. Number of consecutive aborted proving periods that will cause a return to the Out Of Service state.
+
+Measurement units are the number of proving periods.</description>
+ <long>
+ <range>
+ <min>1</min> <max>7</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT1">
+ <description>Maximum time to stay in Aligned Ready state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>65500</max>
+ </range>
+ <defaultValue>40000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT2">
+ <description>Maximum time to stay in Not Aligned state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>262000</max>
+ </range>
+ <defaultValue>5000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT3">
+ <description>Maximum time to stay in Aligned state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>2000</max>
+ </range>
+ <defaultValue>1000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT4n">
+ <description>Length of the normal proving period.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>16300</max>
+ </range>
+ <defaultValue>7500</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT4e">
+ <description>Length of the emergengcy proving period.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>16300</max>
+ </range>
+ <defaultValue>400</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT5">
+ <description>Time between sending Status Indication "B" while in the Congested state.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>1</min> <max>255</max>
+ </range>
+ <defaultValue>80</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT6">
+ <description>Maximum time a remote site may remain in the congestated state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>8100</max>
+ </range>
+ <defaultValue>3000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT7">
+ <description>Maximum time to wait for an expected acknowledgement of an MSU before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>2000</max>
+ </range>
+ <defaultValue>500</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="bitRate">
+ <description>The speed of the link. Only supported values are 64 and 56 kbit/s.
+0 = 64 kbit/s.
+1 = 56 kbit/s.
+
+</description>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="errorCorrection">
+ <description>The error correction algorithm to use. Only Basic Error Correction (BEC) is supported.
+0 = BEC
+</description>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionOnSet1">
+ <description>Percentage of the Transmit Buffer that will cause MTP2 to signal congestion for prio 1 messages towards client.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>70</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionOnSet2">
+ <description>Percentage of the Transmit Buffer that will cause MTP2 to signal congestion for prio 2 messages towards client.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>80</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionOnSet3">
+ <description>Percentage of the Transmit Buffer that will cause MTP2 to signal congestion for prio 3 messages towards client.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>90</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionAbatement1">
+ <description>Percentage of the Transmit Buffer that ceases congestion for prio 1 messages.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>60</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionAbatement2">
+ <description>Percentage of the Transmit Buffer that ceases congestion for prio 2 messages.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>70</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionAbatement3">
+ <description>Percentage of the Transmit Buffer that ceases congestion for prio 3 messages.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>80</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionDiscardLevel1">
+ <description>Percentage of the Transmit Buffer where messages sent to MTP2 from client with priority less than 1 is discarded by MTP2.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionDiscardLevel2">
+ <description>Percentage of the Transmit Buffer where messages sent to MTP2 from client with priority less than 2 is discarded by MTP2.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionDiscardLevel3">
+ <description>Percentage of the Transmit Buffer where messages sent to MTP2 from client with priority less than 3 is discarded by MTP2.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="n1Onset">
+ <description>Number of MSUs in ReTransmit Buffer before onset of preventive retransmission in PCR.
+NOTE: Only valid if errorCorrection==SCC_MTP2_ERROR_CORRECTION_PCR.
+This value is ignored otherwise.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>60</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="n2Onset">
+ <description>Number of MSUs in ReTransmit Buffer before onset of preventive retransmission in PCR.
+NOTE: Only valid if errorCorrection==SCC_MTP2_ERROR_CORRECTION_PCR.
+This value is ignored otherwise.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>70</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <struct name="Mtp2ProfileDataChina">
+ <structMember name="bitRate">
+ <description>The speed of the link. Only supported values are 64 and 56 kbit/s.
+0 = 64 kbit/s.
+1 = 56 kbit/s.
+
+</description>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="errorCorrection">
+ <description>The error correction algorithm to use. Only Basic Error Correction (BEC) is supported.
+0 = BEC</description>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="provings">
+ <description>Proving abort limit. Number of consecutive aborted proving periods that will cause a return to the Out Of Service state.
+
+Measurement units are the number of proving periods.</description>
+ <long>
+ <range>
+ <min>1</min> <max>7</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="suermD">
+ <description>SUERM parameter D.
+Measurement units are in SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>256</max>
+ </range>
+ <defaultValue>256</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="suermN">
+ <description>SUERM parameter N.
+Measurement units are in SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>256</max>
+ </range>
+ <defaultValue>16</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="suermT">
+ <description>SUERM parameter T.
+Measured in SU units.</description>
+ <long>
+ <range>
+ <min>1</min> <max>64</max>
+ </range>
+ <defaultValue>64</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="tie">
+ <description>Emergency AERM threshold, Tie. Number of signal units errors that cause abortion of an emergency proving period.
+
+Measurement units are SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>7</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT1">
+ <description>Maximum time to stay in Aligned Ready state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>65500</max>
+ </range>
+ <defaultValue>45000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT2">
+ <description>Maximum time to stay in Not Aligned state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>262000</max>
+ </range>
+ <defaultValue>132000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT3">
+ <description>Maximum time to stay in Aligned state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>2000</max>
+ </range>
+ <defaultValue>1000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT4e">
+ <description>Length of the emergengcy proving period.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>16300</max>
+ </range>
+ <defaultValue>500</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT4n">
+ <description>Length of the normal proving period.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>16300</max>
+ </range>
+ <defaultValue>8200</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT5">
+ <description>Time between sending Status Indication "B" while in the Congested state.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>1</min> <max>255</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT6">
+ <description>Maximum time a remote site may remain in the congestated state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>8100</max>
+ </range>
+ <defaultValue>5000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT7">
+ <description>Maximum time to wait for an expected acknowledgement of an MSU before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>2000</max>
+ </range>
+ <defaultValue>2000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="tin">
+ <description>Normal AERM threshold, Tin. Number of signal errors that cause abortion of a normal proving peroid.
+
+Measurement units are SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>7</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionOnSet1">
+ <description>Percentage of the Transmit Buffer that will cause MTP2 to signal congestion for prio 1 messages towards client.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>70</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionOnSet2">
+ <description>Percentage of the Transmit Buffer that will cause MTP2 to signal congestion for prio 2 messages towards client.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>80</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionOnSet3">
+ <description>Percentage of the Transmit Buffer that will cause MTP2 to signal congestion for prio 3 messages towards client.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>90</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionAbatement1">
+ <description>Percentage of the Transmit Buffer that ceases congestion for prio 1 messages.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>60</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionAbatement2">
+ <description>Percentage of the Transmit Buffer that ceases congestion for prio 2 messages.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>70</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionAbatement3">
+ <description>Percentage of the Transmit Buffer that ceases congestion for prio 3 messages.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>80</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionDiscardLevel1">
+ <description>Percentage of the Transmit Buffer where messages sent to MTP2 from client with priority less than 1 is discarded by MTP2.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionDiscardLevel2">
+ <description>Percentage of the Transmit Buffer where messages sent to MTP2 from client with priority less than 2 is discarded by MTP2.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionDiscardLevel3">
+ <description>Percentage of the Transmit Buffer where messages sent to MTP2 from client with priority less than 3 is discarded by MTP2.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="n1Onset">
+ <description>Number of MSUs in ReTransmit Buffer before onset of preventive retransmission in PCR.
+NOTE: Only valid if errorCorrection==SCC_MTP2_ERROR_CORRECTION_PCR.
+This value is ignored otherwise.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>60</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="n2Onset">
+ <description>Number of MSUs in ReTransmit Buffer before onset of preventive retransmission in PCR.
+NOTE: Only valid if errorCorrection==SCC_MTP2_ERROR_CORRECTION_PCR.
+This value is ignored otherwise.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>70</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <enum name="EmergencyStatus">
+ <description>This enumeration specifies the different stages of the emergency state.</description>
+ <enumMember name="NEVER_USED">
+ <description>Emergency state has not been activated since installation of license key file.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="ACTIVE">
+ <description>All capacity restrictions removed and all features enabled. The maximum time in this state is 7 days.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="USE_DEGRADED">
+ <description>A new license key file has to be istalled in order not to jopardize future use and performance.
+The maximum time in this state is 7 days.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="ACTIVE_AGAIN">
+ <description>All features enabled again for a maximum period of 7 days then a new license key file has to be installed in order to be able to use this node.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="USE_DISABLED">
+ <description>Use of the node is no longer allowed since no new license key file has been installed.</description>
+ <value>4</value>
+ </enumMember>
+ </enum>
+
+ <struct name="EmergencyInfo">
+ <description>This attribute provides information about the current EmergencyState.
+
+Note: for the states NEVER_USED and USE_DISABLED the return value for time is insignificant.</description>
+ <structMember name="state">
+ <description>The current emergency state of the license server.</description>
+ <enumRef name="EmergencyStatus">
+ <defaultValue>NEVER_USED</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="time">
+ <description>This attribute holds information on the time elapsed in this state.
+
+Note: The time out values for the states ALL_OPEN, DEGADED and PROLONGED is 7 days. The unit for this attribute is seconds.
+1 day = 86400 seconds
+7 days = 604800 seconds.</description>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <enum name="NodeRestartType">
+ <enumMember name="WARM_AT_PIU_RESTART">
+ <description>Warm node restart at restart of the last PIU.</description>
+ <value>4</value>
+ </enumMember>
+ <enumMember name="COLD_AT_PIU_RESTART">
+ <description>Cold node restart at restart of the last PIU.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="WARM_AT_PIU_FAULT">
+ <description>Warm node restart at fault mark of the last PIU.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="COLD_AT_PIU_FAULT">
+ <description>Cold node restart at fault mark of the last PIU.</description>
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <struct name="UniSaalProfileData">
+ <structMember name="maxPD">
+ <description>Maximum number of SD PDUs before a poll is sent.
+
+maxPD &lt; initialCredit</description>
+ <long>
+ <range>
+ <min>10</min> <max>10000</max>
+ </range>
+ <defaultValue>25</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="maxStat">
+ <description>Maximum number, odd integer value, of list elements placed in a STAT PDU.
+
+Note: The maxStat attribute is dependent on the AAL5 maximum SDU size defined in the Aal5TpVccTp MO. The maxStat times 4 (octets) plus additional 12 octets (for header) must not exceed the AAL5 maximum SDU size (lower of the two directions, fromUserMaxSduSize and toUserMaxSduSize).
+The consistency control is not performed until the UniSaalTp MO is created since there is no relation between the UniSaalProfile MO and the Aal5TpVccTp MO.</description>
+ <long>
+ <range>
+ <min>3</min> <max>1001</max>
+ </range>
+ <defaultValue>67</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="initialCredit">
+ <description>Initial number of credits.
+
+Note: For 64 kbit/s use 30.
+
+Note! The value for initialCredit must be larger than the value of maxPD.
+</description>
+ <long>
+ <range>
+ <min>10</min> <max>1000</max>
+ </range>
+ <defaultValue>250</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerKeepAlive">
+ <description>Timer to be used during a period of no outstanding acknowledgements or new data pending receipt of credit. At timeout the peer is polled to see if it is alive. The timer determines the interval between polls in transient phase. This timer should be greater than the roundtripdelay and also greater than timerpoll. Time unit = milliseconds.
+</description>
+ <long>
+ <range>
+ <min>10</min> <max>10000</max>
+ </range>
+ <defaultValue>2000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerNoResponse">
+ <description>Timer to determine the maximum time interval during which at least one STAT PDU reception is expected as a response to a poll. This timer should be equal to timerKeepAlive+roundtripdelay. Time unit = milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>100000</max>
+ </range>
+ <defaultValue>7000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerIdle">
+ <description>Timer running when there are no PDUs to transmit and there are no outstanding acknowledgements or data pending for credit. When this timer is running, no POLL PDUs are sent. This timer should be significantly greater than timerKeepAlive value. Time unit = milliseconds.</description>
+ <long>
+ <range>
+ <min>1000</min> <max>600000</max>
+ </range>
+ <defaultValue>15000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerCC">
+ <description>Timer determining the time between re-transmission of PDUs: BGN, END, ER, RS. Should be slightly more than the roundtripdelay. Time unit = milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>10000</max>
+ </range>
+ <defaultValue>1000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerPoll">
+ <description>Timer that specifies the maximum time between sending of POLL PDUs to the peer receiver during other traffic (active phase). Time unit = milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>100000</max>
+ </range>
+ <defaultValue>750</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="maxCC">
+ <description>Maximum number of re-transmissions of PDUs: BGN, END, ER, RS. Time unit = milliseconds.</description>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionOnSet">
+ <description>Attribute specifying the percentage of the buffer that must be filled in order to cause congestion. Congestion is notified to the users of this protocol layer. The part of the buffer above the congestion level is used to take care of messages that were sent before the users stopped sending.
+
+This attribute should follow the rule 0 &lt;= congestationAbatement &lt; congestationOnSet &lt;= 100.</description>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>70</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionAbatement">
+ <description>Attribute specifying the percentage of the buffer for which congestion is stopped. If the congestionAbatement level is lesser but almost equal to congestionOnSet, congestion alarms might be raised and ceased very often.
+
+This attribute should follow the rule 0 &lt;= congestationAbatement &lt; congestationOnSet &lt;= 100.</description>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>60</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <struct name="NniSaalProfileData">
+ <description>Struct holding the values for an NniSaalProfile.
+
+NOTE: Congestition Level 1 - 3 is supported.</description>
+ <structMember name="timerPoll">
+ <description>Timer that specifies the maximum time between sending of POLL PDUs to the peer receiver during other traffic (active phase). Time unit = milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>100000</max>
+ </range>
+ <defaultValue>50</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="maxCC">
+ <description>Maximum number of re-transmissions of PDUs: BGN, END, ER, RS.</description>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="maxPD">
+ <description>Maximum number of SD PDUs before a poll is sent.
+
+maxPD &lt; initialCredit</description>
+ <long>
+ <range>
+ <min>0</min> <max>10000</max>
+ </range>
+ <defaultValue>25</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="maxStat">
+ <description>Maximum number, odd integer value, of list elements placed in a STAT PDU.
+
+Note: The maxStat attribute is controlled by the AAL5 maximum SDU size defined in the Aal5TpVccTp MO. The maxStat times 4 (octets) plus additional 12 octets (for header) must not exceed the AAL5 maximum SDU size (lower of the two directions, fromUserMaxSduSize and toUserMaxSduSize).
+
+The consistency control is not performed until the NniSaalTp MO is created since there is no relation between the NniSaalProfile MO and the Aal5TpVccTp MO.</description>
+ <long>
+ <range>
+ <min>3</min> <max>1001</max>
+ </range>
+ <defaultValue>67</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="initialCredit">
+ <description>Initial number of credits.
+
+Note: For 64 kbit/s use 30.
+
+Note! The value for initialCredit must be larger than the value of maxPD.</description>
+ <long>
+ <range>
+ <min>10</min> <max>1000</max>
+ </range>
+ <defaultValue>250</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerKeepAlive">
+ <description>Timer to be used during a period of no outstanding acknowledgements or new data pending receipt of credit. At timeout the peer is polled to see if it is alive. The timer determines the interval between polls in transient phase. This timer should be greater than the roundtripdelay and also greater than timerpoll. Time unit = milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>10000</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerNoResponse">
+ <description>Timer to determine the maximum time interval during which at least one STAT PDU reception is expected as a response to a poll.This timer should be equal to timerKeepAlive+roundtripdelay. Time unit = milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>100000</max>
+ </range>
+ <defaultValue>500</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerIdle">
+ <description>Timer running when there are no PDUs to transmit and there are no outstanding acknowledgements or data pending for credit. When this timer is running, no POLL PDUs are sent. This timer should be significantly greater than timerKeepAlive value. Time unit = milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>10000</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerCC">
+ <description>Timer determining the time between re-transmission of PDUs: BGN, END, ER, RS. Time unit = milliseconds.
+Should be more than the roundtrip delay.</description>
+ <long>
+ <range>
+ <min>10</min> <max>10000</max>
+ </range>
+ <defaultValue>200</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="mps">
+ <description>Management Proving Status which is used to decide if proving is done or not during SAAL connection setup.
+</description>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionLevel1OnSet">
+ <description>Attribute specifying the percentage of the buffer that must be filled in order to cause congestion.
+Congestion is notified to the users of this protocol layer. The part of the buffer above the congestion
+level is used to take care of messages that were sent before the users stopped sending.
+
+Attribute specifying the percentage of the buffer that must be filled in order to cause congestion.
+Congestion is notified to the users of this protocol layer. The part of the buffer above the congestion
+level is used to take care of messages that were sent before the users stopped sending.
+
+This attribute should follow the rule 0 &lt;= congestationLevel1OnSet &lt;= congestationLevel2OnSet &lt;= congestationLevel3OnSet &lt;= 100.</description>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>70</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionLevel2OnSet">
+ <description>Attribute specifying the percentage of the buffer that must be filled in order to cause congestion.
+Congestion is notified to the users of this protocol layer. The part of the buffer above the congestion
+level is used to take care of messages that were sent before the users stopped sending.
+
+This attribute should follow the rule 0 &lt;= congestationLevel1OnSet &lt;= congestationLevel2OnSet &lt;= congestationLevel3OnSet &lt;= 100.</description>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>80</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionLevel3OnSet">
+ <description>Attribute specifying the percentage of the buffer that must be filled in order to cause congestion.
+Congestion is notified to the users of this protocol layer. The part of the buffer above the congestion
+level is used to take care of messages that were sent before the users stopped sending.
+
+This attribute should follow the rule 0 &lt;= congestationLevel1OnSet &lt;= congestationLevel2OnSet &lt;= congestationLevel3OnSet &lt;= 100.</description>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>90</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionLevel1Abatement">
+ <description>Attribute specifying the percentage of the buffer for which congestionLevel1 is stopped. If the congestionAbatement level is lesser but almost equal to congestionOnSet, congestion alarms might be raised and ceased very often.
+</description>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>60</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="nrOfPDUsDuringProving">
+ <description>The length of proving in terms of number of transmitted PDUs (n1).
+noOfPDUsDuringProving x T3 &lt; T2
+
+For the TTC standard the only allowed value is 0 (which means no proving).</description>
+ <long>
+ <range>
+ <min>0</min> <max>100000</max>
+ </range>
+ <defaultValue>1000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="maxNRP">
+ <description>State variable which defines max number of retransmissions of PDUs during proving to consider proving successful.
+</description>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerNoCredit">
+ <description>Maximum time of no credit. If the timer expires, the assured data transfer mode is released.</description>
+ <long>
+ <range>
+ <min>0</min> <max>100000</max>
+ </range>
+ <defaultValue>1500</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerRepeatSrec">
+ <description>Timer which is set whenever a report of SSCOP recovery is received from the SSCF. If the timer is running when another report of recovery is received, the assured data transfer mode is released. If the timer expires, nothing is done. Time unit = milliseconds.</description>
+ <long>
+ <range>
+ <min>0</min> <max>86400000</max>
+ </range>
+ <defaultValue>3600000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT1">
+ <description>Timer between the link release action and the next link re-establish action during the alignment. At expiry of timer T1, a new attempt to setup assured data transfer mode to the peer is done. Time unit = milliseconds.
+</description>
+ <long>
+ <range>
+ <min>10</min> <max>100000</max>
+ </range>
+ <defaultValue>5000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT2">
+ <description>Total time that SSCF will attempt alignment. At expiry of timer T2, the alignment procedure will be interrupted.
+ Time unit = milliseconds.
+</description>
+ <long>
+ <range>
+ <min>10</min> <max>200000</max>
+ </range>
+ <defaultValue>30000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT3">
+ <description>Time between proving PDUs. The timer is set such that loading of the signalling link is approximately 50% of its nominal rate.
+Time unit = milliseconds.</description>
+ <long>
+ <range>
+ <min>5</min> <max>1000</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <exception name="ListOfTimeSlotsNotUniqueException">
+ <description>Exception thrown when a time slot appears more than once in the time slot list.</description>
+ </exception>
+
+ <enum name="RefActivity">
+ <description>RefActivity can have the following values:
+
+inactive = Synchronization reference is currently not used in system clock generation.
+active = Synchronization is used in system clock generation.
+</description>
+ <enumMember name="inactive">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="active">
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="RefState">
+ <description>RefState can have the following values:
+failed = synchronization reference is not capable to perform its required tasks.
+degraded = capability of synchronization reference to perform its required tasks is degraded e.g. because of signal level degradation. This value is only applicable for traffic carrying (ET physical path termination) synchronization references. Note: attribute degradationIsFault controls whether synchronization reference degradation is interpreted as a synchronization reference fault or not.
+lossOfTracking = system clock regulation algorithm on TU board can not follow the 8kHz synchronization reference signal either because of the poor quality of the signal or because of a HW fault at TU board. If all synchronization references repeatedly end up to state lossOfTracking, fault is likely in TU HW.
+ok = synchronization reference is capable of performing its required tasks.
+</description>
+ <enumMember name="failed">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="degraded">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="lossOfTracking">
+ <value>2</value>
+ </enumMember>
+ <enumMember name="ok">
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <enum name="FaultCriteria">
+ <description>FaultCriteria can have the following values:
+degrNotFault = synchronization reference degradation is NOT interpreted as a synchronization reference fault.
+degrIsFault = synchronization reference degradation is interpreted as a synchronization reference fault.</description>
+ <enumMember name="degrNotFault">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="degrIsFault">
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="ClockState">
+ <description>ClockState can have the following values:
+startUp =
+locked = system clock signal on Timing Unit is locked: a synchronization reference is used in the system clock generation, clock accuracy is 50 ppb or better.
+holdOver = system clock signal on Timing Unit is hold-over: no synchronization reference is used in system clock generation, clock accuracy is 50 ppb or better.
+freeRunning = system clock signal on Timing Unit is free running: no synchronization reference is used in system clock generation, clock accuracy is 4.6 ppm or better.
+failed = system clock signal on Timing Unit is failed: fault in system clock generation function, no quarantee of clock accuracy level.
+not Applicable = system clock signal on Timing Unit is not applicable: TU board not present.</description>
+ <enumMember name="unknownMode">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="startupMode">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="lockedMode">
+ <value>2</value>
+ </enumMember>
+ <enumMember name="holdOverMode">
+ <value>3</value>
+ </enumMember>
+ <enumMember name="freeRunningMode">
+ <value>4</value>
+ </enumMember>
+ <enumMember name="failedMode">
+ <value>5</value>
+ </enumMember>
+ <enumMember name="lossOfTrackingMode">
+ <value>6</value>
+ </enumMember>
+ <enumMember name="notApplicable">
+ <value>7</value>
+ </enumMember>
+ </enum>
+
+ <exception name="AlreadyRegisteredException">
+ <description>Exception thrown when an object is already registered.</description>
+ </exception>
+
+ <exception name="MaxNoOfRefRegisteredException">
+ <description>Exception thrown when the maximum number of references is reached.</description>
+ </exception>
+
+ <exception name="PriorityAlreadyInUseException">
+ <description>Exception thrown when a priority is already in use.</description>
+ </exception>
+
+ <exception name="PriorityOutOfRangeException">
+ <description>Exception thrown when the priority is out of range.</description>
+ </exception>
+
+ <exception name="NotPermittedException">
+ <description>Exception thrown when an reference is not valid, null or of incorrect type.</description>
+ </exception>
+
+ <exception name="NotRegisteredException">
+ <description>Exception thrown when trying to de-register an object that is not registered in the database.</description>
+ </exception>
+
+ <enum name="SystemClockRedundancy">
+ <enumMember name="SYSTEM_CLOCK_USERS_USE_PLANE_A">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="SYSTEM_CLOCK_USERS_USE_PLANE_B">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="SYSTEM_CLOCK_USERS_USE_PLANE_A_AND_B">
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <exception name="NotUniqueFroIdException">
+ <description>Exception thrown when a fro Id is not unique.</description>
+ </exception>
+
+ <enum name="ActiveSwitchPlane">
+ <enumMember name="switchPlaneA">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="switchPlaneB">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="switchPlaneBoth">
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="SwitchReliableGroup">
+ <description>A predefined group consisting of working links and their corresponding protecting links. These links form the n+m link redundancy. </description>
+ <enumMember name="physicalLinkStatusWorking">
+ <description>Defines physical link status.
+</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="physicalLinkStatusProtecting">
+ <description>Defines physical link status.
+</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="physicalLinkStatusUndefined">
+ <description>Defines physical link status.
+</description>
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <struct name="GlobalTitleData">
+ <structMember name="indicator">
+ <description>Global title indicator should have following values for both ITU and TTC:
+
+The values for the GT Indicator
+
+Value Comment
+
+0 No new global title
+2 TT only
+3 TT-NP-ES
+4 TT-NP-ES-NOA
+
+Explanation:
+
+TT = translation type
+NP = numbering plan
+ES = encoding scheme
+NOA = nature of address indication</description>
+ <long>
+ <range>
+ <min>0</min> <max>4</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="natureOfAddress">
+ <description>Indicates number type, i.e. national or international number.
+Coding of the Nature Address:
+
+0 = "unknown"
+1 = "Subscriber number"
+2 = "Reserved for national use"
+3 = "National significant number"
+4 = "International number"</description>
+ <long>
+ <range>
+ <min>0</min> <max>4</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="numberingPlan">
+ <description>Indicates which numbering plan that is used.
+
+Coding of the Numbering Plan:
+
+0 = "Unknown"
+1 = "ISDN/Telephony Numbering Plan"
+3 = "Data Numbering Plan"
+4 = "Telex Numbering Plan"
+5 = "Maritime Mobile Numbering Plan"
+6 = "Land Mobile Numbering Plan"
+7 = "ISDN/Mobile Numbering Plan"
+</description>
+ <long>
+ <range>
+ <min>0</min> <max>7</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="translationType">
+ <description>Used to direct the message to the appropriate Global Title translation function.</description>
+ <long>
+ <range>
+ <min>0</min> <max>254</max>
+ </range>
+ </long>
+ </structMember>
+ <structMember name="addressInformation">
+ <description>Digit string of 1-37 digits, where each digit is 0-9, and B, C. B and C are for Code 11 and Code 12.
+The addressInformation may also contain wild card symbols: "*" or "?". Wild cards are only allowed for defining Global Title Translations, they are not allowed for specifying SCCP SAPs (built with SPC and Global Title or SPC + SSN + Global Title).</description>
+ <string>
+ <lengthRange>
+ <min>1</min> <max>37</max>
+ </lengthRange>
+ </string>
+ </structMember>
+ <structMember name="encodingScheme">
+ <description>Indicates if the number of address signals are an odd or even number, and is coded as follows:
+
+0 = "Unknown"
+1 = "BCD, odd number of digits"
+2 = "BCD, even number of digits"
+
+Other values in the encoding scheme will result in the error "Wrong Nature Of Address", (Routing failure reason=No translation for an address of such nature).</description>
+ <long>
+ <range>
+ <min>0</min> <max>2</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <enum name="SharingMode">
+ <enumMember name="loadShare">
+ <description>The when sharing mode is set to loadShare the SCCP traffic is load shared between the two entities (access points).</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="dupliDominant">
+ <description>When the sharing mode is set to dupliDominant the second entity (access point) is a backup for the first entity.</description>
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="EncodingScheme">
+ <description>Possible values for number signalling.</description>
+ <enumMember name="UNKNOWN">
+ <description>Unkown encoding scheme.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="ODD_NUMBER">
+ <description>BCD, odd number of digits.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="EVEN_NUMBER">
+ <description>BCD, even number of digits.</description>
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="GlobalTitleIndicator">
+ <description>Global title indicator values for China, ITU, TTC and ANSI.
+
+Note: China, ITU and TCC will use TT_ONLY, TT_NP_ES, TT_NP_ES_NOA, NOA_ONLY.
+
+ANSI will use:
+ANSI_TT_NP_ES = 5
+ANSI_TT_ONLY = 6
+</description>
+ <enumMember name="TT_ONLY">
+ <description>Translation Type only.
+
+Only valid for China, ITU and TTC.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="TT_NP_ES">
+ <description>Translation Type, Numbering Plan and Encoding Scheme.
+
+Only valid for China, ITU and TTC.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="TT_NP_ES_NOA">
+ <description>Translation Type, Numbering Plan, Encoding Scheme, and Nature Of Address indication.
+
+Only valid for China, ITU and TTC.</description>
+ <value>4</value>
+ </enumMember>
+ <enumMember name="NOA_ONLY">
+ <description>Nature of Address indicator only.
+
+Only valid for China, ITU and TTC.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="ANSI_TT_NP_ES">
+ <description>Translation Type, Numbering Plan and Encoding Scheme.
+
+Only valid for ANSI.
+</description>
+ <value>5</value>
+ </enumMember>
+ <enumMember name="ANSI_TT_ONLY">
+ <description>Translation Type only.
+
+Only valid for ANSI.
+</description>
+ <value>6</value>
+ </enumMember>
+ </enum>
+
+ <enum name="NatureOfAddress">
+ <description>Phone number types.</description>
+ <enumMember name="UNKNOWN">
+ <description>Unknown number type.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="SN">
+ <description>Subscriber number type.
+</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="RN">
+ <description>Reserved for national use, number type.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="NSN">
+ <description>National Significant Number type.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="IN">
+ <description>International number type.</description>
+ <value>4</value>
+ </enumMember>
+ </enum>
+
+ <enum name="NumberingPlan">
+ <description>Numbering plans.</description>
+ <enumMember name="UNKNOWN">
+ <description>Unknown numbering plan.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="TELEPHONY">
+ <description>ISDN/Telephony numbering plan.
+</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="DATA">
+ <description>Data numbering plan.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="TELEX">
+ <description>Telex numbering plan.
+</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="MOBILE_MARITIME">
+ <description>Maritime mobile numering plan.
+</description>
+ <value>4</value>
+ </enumMember>
+ <enumMember name="MOBILE_LAND">
+ <description>Land mobile numbering plan.
+</description>
+ <value>5</value>
+ </enumMember>
+ <enumMember name="MOBILE">
+ <description>ISDN/Mobile numbering plan.</description>
+ <value>6</value>
+ </enumMember>
+ </enum>
+
+ <enum name="SccpCountType">
+ <enumMember name="MESSAGES">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="OCTETS">
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <struct name="Scmg">
+ <structMember name="sendSST">
+ <description>Controls when to send SST (SCCP Subsystem Test message).
+
+0 = Wait for tStatInfo timer to expire once after MTP_RESUME before sending SST.
+1 = Send SST immediately after MTP_RESUME, then start tStatInfo timer.</description>
+ <long>
+ <defaultValue>1</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="sendSSA">
+ <description>Controls when to send SSA (SCCP Subsystem Allowed message).
+
+0 = Do not send SSA when client attaches, wait until SST is received. (default for ANSI/CHINA/ITU/TTC)
+1 = Send SSA immediately when client attaches.</description>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="sendSSP">
+ <description>Controls whether to send SSP (SCCP Subsystem Prohibited message).
+
+0 = Do not send SSP when client detaches. (default for TTC)
+1 = Send SSP immediately when client detaches. (default for ANSI/CHINA/ITU)</description>
+ <long>
+ <defaultValue>1</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="useSST">
+ <description>Controls whether to send SST messages or not (SCCP Subsystem Test message).
+
+0 = Send SST as indicated by sendSST. (default for ANSI/CHINA/ITU)
+1 = (not used)
+2 = (not used)
+3 = Do not initiate SST messages at all, ie. do not start timer tStatInfo nor send any SST at MTP_RESUME. (default for TTC)</description>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="allowRemoteBroadcast">
+ <description>Controls the remote broadcast.
+
+0 = allow remote broadcast. (default for ANSI/CHINA/ITU/TTC)
+1 = do not allow remote broadcast</description>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="initiateTimerTcon">
+ <description>Controls whether to initiate hardcoded congestion timer or not.
+
+0 = start timer when SSC is received. (default for CHINA/ITU/TTC)
+1 = do not start timer
+
+Note! This attribute is not valid for the ANSI standard.</description>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <enum name="DiscardReturnServiceMsg">
+ <enumMember name="DISCARD">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="RETURN">
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <exception name="WrongUserTypeException">
+ </exception>
+
+ <exception name="UsageNotPermittedException">
+ </exception>
+
+ <enum name="J1Type">
+ <description>J1Type can have the following values:
+J1_G = 0 according to TTC JT-G703/G704
+J1_I = 1 according to TCC JT-I431</description>
+ <enumMember name="j1_G">
+ <description>J1 according to TTC JT-G703/G704</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="j1_I">
+ <description>J1 according to TCC JT-I431</description>
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="StandardMode">
+ <description>Indicates what standard the MAO is operating to.</description>
+ <enumMember name="TTC">
+ <description>The standard mode is Telecommunication Technology Committee (TTC).</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="ANSI">
+ <description>The standard mode ANSI.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="ETSI">
+ <description>The standard mode is ETSI.</description>
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="MuxMode">
+ <description>Indicates what multiplexing is being used.</description>
+ <enumMember name="STANDBY">
+ <description>Standby for protection.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="E1_J1_T1_LEVEL">
+ <description>Multiplexing terminated at the E1/J1/T1 level.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="VC4_STS3CSPE_LEVEL">
+ <description>Multiplexing terminated at the VC-4/STS3CSPE level.</description>
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="Os155LoopBack">
+ <description>The loopback method available for use by the Os155SpiTtp MO.</description>
+ <enumMember name="NONE">
+ <description>No loopback in use.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="LINE">
+ <description>Loopingback using line.</description>
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="SwitchModes">
+ <description>The switch modes.</description>
+ <enumMember name="AUTOMATIC">
+ <description>Automatic switching.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="LOCKED">
+ <description>Locked for swtiching.</description>
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <exception name="FailedResourceException">
+ </exception>
+
+ <exception name="LockedResourceException">
+ </exception>
+
+ <exception name="UnknownReasonException">
+ </exception>
+
+ <exception name="AlreadyLockedException">
+ </exception>
+
+ <exception name="IncorrectOsi155SpiIdException">
+ </exception>
+
+ <enum name="PathTraceFormat">
+ <description>Path Trace Formats.</description>
+ <enumMember name="ITU_T_G707">
+ <description>16 byte path trace format according to ITU-T G707 table 4.</description>
+ <value>16</value>
+ </enumMember>
+ <enumMember name="GR_253_CORE">
+ <description>64 byte path trace format according to section 3.3.2.3, Telecordia GR-253-CORE.</description>
+ <value>64</value>
+ </enumMember>
+ </enum>
+
+ <enum name="Crc4Mode">
+ <description>Cyclical Redundancy Checks 4 modes.</description>
+ <enumMember name="OFF">
+ <description>CRC 4 is off.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="ON">
+ <description>CRC 4 is on.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="AUTOMATIC">
+ <description>CRC 4 is automatic.</description>
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="IdlePattern">
+ <description>Idle patterns.</description>
+ <enumMember name="A_LAW">
+ <description>A law idle pattern.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="U_LAW">
+ <description>Micro law idle pattern.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="UNDEFINED">
+ <description>Undefined idle pattern.</description>
+ <value>0</value>
+ </enumMember>
+ </enum>
+
+ <enum name="LoopbackState">
+ <description>The possible loopback states for E1/J1/T1/E3/T3PhysPathTerm MOs.</description>
+ <enumMember name="none">
+ <description>This is the normal state, no loop back is preformed (and ordinary traffic is running).</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="line">
+ <description>The phyiscal path is looped on the line side, the external incoming path is looped back to the external outgoing path.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="system">
+ <description>The physical path is looped on the system side, the (node-) internal incoming path is looped back to the internal outgoing path.</description>
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="TransmissionMode">
+ <description>L stands for long haul interface and S stands for short haul interface.
+The subsequent figure specifies the cable distance in feets.</description>
+ <enumMember name="L_6000">
+ <description>Long Haul 6000 ft, -0 dB</description>
+ <value>8</value>
+ </enumMember>
+ <enumMember name="L_4000">
+ <description>Long Haul 4000 ft, -7 dB</description>
+ <value>7</value>
+ </enumMember>
+ <enumMember name="L_2000">
+ <description>Long Haul 2000 ft, -15 dB</description>
+ <value>6</value>
+ </enumMember>
+ <enumMember name="L_0">
+ <description>Long Haul 0 ft, -22 dB</description>
+ <value>5</value>
+ </enumMember>
+ <enumMember name="S_133">
+ <description>Short Haul 0..133 ft</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="S_266">
+ <description>Short Haul 134..266 ft</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="S_399">
+ <description>Short Haul 267..399 ft</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="S_533">
+ <description>Short Haul 400..533 ft</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="S_655">
+ <description>Short Haul 534..655 ft</description>
+ <value>4</value>
+ </enumMember>
+ </enum>
+
+ <struct name="Mtp3bSpItuPriorityData">
+ <description>Priority attributes for MTP3b SP of the ITU standard.</description>
+ <structMember name="prioSlt">
+ <description>The prioSlt attribute sets the priority for the
+ Signalling Link Test Message and Acknowledge (SLTM / SLTA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioCo">
+ <description>The prioCo attribute sets the priority for the ChangeOver Order and Acknowledge (COO/COA) or eXtended Change over Order and Acknowledge (XCO/XCA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet)
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioCb">
+ <description>The prioCb attribute sets the priority for the
+ Change Back Declaration and Acknowledge (CBD / CBA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioEc">
+ <description>The prioEc attribute sets the priority for the
+Emergency Change over Order and Acknowledge (ECO / ECA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioRst">
+ <description>The prioRst attribute sets the priority for the
+signalling Route Set Test (RST) message when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioTra">
+ <description>The prioTra attribute sets the priority for the
+Traffic Restart Allowed signal (TRA) message when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioUpu">
+ <description>The prioUpu attribute sets the priority for the
+ User Part Unavailable (UPU) message when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioLink">
+ <description>The prioLink attribute sets the priority for link related messages when issued by the MTP3b itself. The messages are :
+
+Link INhibit (LIN), Link UNinhibit (LUN),
+Link Inhibit Denied (LID),
+Link Inhibit Acknowledge (LIA),
+Link Uninhibit Acknowledge (LUA),
+Link Forced Uninhibit (LFU),
+Link Local inhibit Test (LLT) and
+Link Remote inhibit Test (LRT)
+
+When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ </struct>
+
+ <struct name="Mtp3bSpItuTimerData">
+ <description>ITU timers for MTP3bSpItu. Timervalues in 1/10 s (deciseconds).</description>
+ <structMember name="timerT1">
+ <description>Delay to avoid message mis-sequencing on changeover.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT2">
+ <description>Timer for waiting for a COO or a COA.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT3">
+ <description>Delay to avoid message mis-sequencing on a time controlled diversion change back.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT4">
+ <description>Timer for waiting for CBA, first attempt.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT5">
+ <description>Timer for waiting for CBA, second attempt
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT6">
+ <description>Timer for delay to avoid message mis-sequencing on controlled rerouting.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>9</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT8">
+ <description>Timer for delay to prohibit sending of TFP messages via the response method. This is a STP specific parameter, which is ignored when configured as an endpoint.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT10">
+ <description>Timer for waiting to repeat sending of RST periodically.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>400</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT12">
+ <description>Waiting for uninhibit acknowledgement.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT13">
+ <description>Timer for waiting for force uninhibit.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT14">
+ <description>Timer for waiting for inhibition acknowledgement.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT17">
+ <description>Delay to avoid oscillation of initial alignment failure and link restart.
+
+The value for this timer should be less than the value for timerT2.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>9</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTBsnt">
+ <description>Waiting for BSNT value from MTP-2 or SAAL (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTRetrieval">
+ <description>Timer for waiting for completion of buffer retrieval from MTP-2 or SAAL (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTStart">
+ <description>Timer for retransmission of DL_START_req if no answer received. Started when timerT17 expires. (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>1200</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTc">
+ <description>Controlling the period a route set is considered congested when a Transfer Controlled message has been received.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>50</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT18">
+ <description>Supervision timer for the first phase of a restarting STP. This is an STP specific parameter, which is ignored when configured as an endpoint.
+
+The value for this timer should be less than the value for timerT2.
+
+Unit: deciseconds (1/10 second).
+</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>550</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT19">
+ <description>Controlling the response of the receipt of a traffic restart message from an adjacent node.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>680</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT20">
+ <description>Overall MTP restart timer at the restarting MTP.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>600</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT21">
+ <description>Overall MTP restart timer at an adjacent signalling point to a restarting MTP.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>640</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT22">
+ <description>Local inhibit test timer.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>2500</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT23">
+ <description>Remote inhibit test timer.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>2500</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerSlta">
+ <description>Supervision timer for SLTA message (time within SLTA should arrive).
+
+Timer T1 in ITU Q.707 standard.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerSltm">
+ <description>Timer for sending SLTM periodically.
+
+Timer T2 in ITU Q.707 standard.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>400</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaTack">
+ <description>Timer used for message acknowledgement.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaPeriodicAudit">
+ <description>Timer used for audit procedure.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>300</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT1">
+ <description>Delay to avoid mis-sequencing of messages when an association fails.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT3">
+ <description>Delay to avoid mis-sequencing of messages when an association becomes active.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT6">
+ <description>Delay to avoid mis-sequencing on controlled rerouting.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT8">
+ <description>Delay to prohibit sending of DUNA messages via the response method.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT40">
+ <description>Delay to avoid message mis-sequencing on controlled/forced rerouting.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT41">
+ <description>Timer controlloing the traffic activation delay during restart phase.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT42">
+ <description>The forever interval period for trying association after an unsiccessfull trial.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaTc">
+ <description>Timer controlling the period a route set is considered congested when a SCON message has been received.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>50</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT15">
+ <description>Timer waiting to start signaling route set congestiontest. Used only if the Route Set
+Congestion Test Selectoption is set to "Use Route Set Congestion test".
+
+Guiding value 20 - 30.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT16">
+ <description>Timer waiting for route set congestion status update. Used only if the Route Set
+Congestion Test Selectoption is set to "Use Route Set Congestion test"
+
+Guiding value 14 - 22.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>14</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTDlack">
+ <description>Timer pending an acknowledge from the network layer for a DL_ACK_REQ.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaTassocack">
+ <description>Timer used for SCTP_ASSOCIATE_REQ message acknowledgement. This is the maximum time to wait for the SCTP_COMMUP_IND mesage before considering it to be an error.
+It should be longer than the time a message spends to reach the most distant destination, be processed and returned.</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <enum name="CongestLevel">
+ <description>The supported congestion levels.</description>
+ <enumMember name="level_0">
+ <description>No Congestion.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="level_1">
+ <description>Congestion level low.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="level_2">
+ <description>Congestion level medium.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="level_3">
+ <description>Congestion level high.</description>
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <exception name="ActivationFailedException">
+ </exception>
+
+ <exception name="NoAvailRouteException">
+ </exception>
+
+ <enum name="Mtp3bCongestLevel">
+ <enumMember name="notCongested">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="congested">
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="Mtp3bNetworkInd">
+ <description>Indicates which type of geographical network, e.g. national, international, etc..
+
+Note: Not applicable for TTC.</description>
+ <enumMember name="INTERNATIONAL_NETWORK">
+ <description>International Network.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="SPARE">
+ <description>Spare (for international use only).</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="NATIONAL_NETWORK">
+ <description>National network.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="RESERVED_FOR_NATIONAL_USE">
+ <description>Reserved for national use.</description>
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <enum name="Mtp3bTfrHandling">
+ <description>Indicates how a TransFer Restricted (TFR) signal is handled.</description>
+ <enumMember name="HANDLE_AS_TFA">
+ <description>Treat the TransFer Restricted (FTR) signal as a TransFer Allowed (TFA) signal.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="IGNORED">
+ <description>Ignore the TransFer Restricted (TFR) signal.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="HANDLE_BY_STANDARD">
+ <description>Handle the incoming TRF messages according to the standard.</description>
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="Mtp3bSioSpareBitsUse">
+ <description>Indicates whether the two spare bits in the Service Information Octet (SIO) should be treated as spare or for indicating a priority level. </description>
+ <enumMember name="SPARE">
+ <description>The two spare bits in the SIO are treated as spare.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="PRIO">
+ <description>The two spare bits in the SIO are to be used for indicating a priority level.</description>
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="Mtp3bItuVersion">
+ <description>Indicates which version of the ITU standard.</description>
+ <enumMember name="ITU_T_88">
+ <description>ITU-T -88.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="ITU_T_03_93">
+ <description>ITU-T 03/93.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="ITU_T_07_96">
+ <description>ITU-T 07/96</description>
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <struct name="Mtp3bSpAnsiTimerData">
+ <description>ANSI timers for MTP3bSpAnsi. Timervalues in 1/10 s (deciseconds).</description>
+ <structMember name="timerT1">
+ <description>Delay to avoid message mis-sequencing on changeover.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT2">
+ <description>Timer for waiting for a COO or a COA.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT3">
+ <description>Delay to avoid message mis-sequencing on a time controlled diversion change back.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT4">
+ <description>Timer for waiting for CBA, first attempt.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT5">
+ <description>Timer for waiting for CBA, second attempt
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT6">
+ <description>Timer for delay to avoid message mis-sequencing on controlled rerouting.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>9</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT8">
+ <description>Timer for delay to prohibit sending of TFP messages via the response method. This is a STP specific parameter, which is ignored when configured as an endpoint.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT10">
+ <description>Timer for waiting to repeat sending of RST periodically.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>400</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT12">
+ <description>Waiting for uninhibit acknowledgement.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT13">
+ <description>Timer for waiting for force uninhibit.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT14">
+ <description>Timer for waiting for inhibition acknowledgement.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT15">
+ <description>Timer waiting to start signaling route set congestiontest. Used only if the Route Set
+Congestion Test Selectoption is set to "Use Route Set Congestion test".
+
+Guiding value 20 - 30.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT16">
+ <description>Timer waiting for route set congestion status update. Used only if the Route Set
+Congestion Test Selectoption is set to "Use Route Set Congestion test"
+
+Guiding value 14 - 22.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>14</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT17">
+ <description>Delay to avoid oscillation of initial alignment failure and link restart.
+
+The value for this timer should be less than the value for timerT2.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>9</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTBsnt">
+ <description>Waiting for BSNT value from MTP-2 or SAAL (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTRetrieval">
+ <description>Timer for waiting for completion of buffer retrieval from MTP-2 or SAAL (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTStart">
+ <description>Timer for retransmission of DL_START_req if no answer received. Started when timerT17 expires. (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>1200</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTc">
+ <description>Controlling the period a route set is considered congested when a Transfer Controlled message has been received.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>50</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT30">
+ <description>Timer to limit sending of TFPs and TFRs in response to unexpected TRA and TRW. This timer is specific for STP functionality and is ignored when configured as an endpoint.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>300</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT25">
+ <description>Delay extension timer invoked on reciept of a Traffic Restart Waiting message from an adjacent SP which is restarting.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>300</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT26">
+ <description>Controlling the periodic resend of Traffic Restart Waiting messages during restart of the local node.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>120</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT27">
+ <description>Timer enforcing a minimum node unavailablility period during MTP restart.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT28">
+ <description>Delay timer controlling a timed reaction of the restart of an adjacent node.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT29">
+ <description>Timer controlling the response of the receipt of Traffic Restart messages from an adjacent node.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>600</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT20">
+ <description>Controlling the periodic resend of Local Inhibit Change Message.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>1000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT21">
+ <description>Controlling the periodic resend of Remote Inhibit Test Message.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>1000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT22">
+ <description>Delay on commencement of MTP Restart to allow the node to rebuild an accurate routing table based on messages for adjacent nodes.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>600</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT23">
+ <description>Supervision timer for routing updates on MTP Restart.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>40</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT31">
+ <description>Timer controlling the detection of false link congestion.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTDlack">
+ <description>Timer pending an acknowledge from the network layer for a DL_ACK_REQ.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerSltm">
+ <description>Timer for sending SLTM periodically.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>400</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerSlta">
+ <description>Supervision timer for SLTA message (time within SLTA should arrive).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaTack">
+ <description>Timer used for message acknowledgement.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaPeriodicAudit">
+ <description>Timer used for audit procedure.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>300</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT1">
+ <description>Delay to avoid mis-sequencing of messages when an association fails.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT3">
+ <description>Delay to avoid mis-sequencing of messages when an association becomes active.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT6">
+ <description>Delay to avoid mis-sequencing on controlled rerouting.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT8">
+ <description>Delay to prohibit sending of DUNA messages via the response method.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT40">
+ <description>Delay to avoid message mis-sequencing on controlled/forced rerouting.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT41">
+ <description>Timer controlloing the traffic activation delay during restart phase.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT42">
+ <description>The forever interval period for trying association after an unsiccessfull trial.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaTc">
+ <description>Timer controlling the period a route set is considered congested when a SCON message has been received.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>50</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaTassocack">
+ <description>Timer used for SCTP_ASSOCIATE_REQ message acknowledgement. This is the maximum time to wait for the SCTP_COMMUP_IND mesage before considering it to be an error.
+It should be longer than the time a message spends to reach the most distant destination, be processed and returned.</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <struct name="Mtp3bSpTtcTimerData">
+ <description>TTC timers for MTP3bSpTtc. Timervalues in 1/10 s (deciseconds).</description>
+ <structMember name="timerT1">
+ <description>Delay to avoid message mis-sequencing on changeover.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT2">
+ <description>Timer for waiting for a COO or a COA.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT3">
+ <description>Delay to avoid message mis-sequencing on a time controlled diversion change back.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT4">
+ <description>Timer for waiting for CBA, first attempt.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT6">
+ <description>Timer for delay to avoid message mis-sequencing on controlled rerouting.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>9</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT8">
+ <description>Timer for delay to prohibit sending of TFP messages via the response method. This is a STP specific parameter, which is ignored when configured as an endpoint.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT10">
+ <description>Timer for waiting to repeat sending of RST periodically.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>400</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT17">
+ <description>Delay to avoid oscillation of initial alignment failure and link restart.
+
+The value for this timer should be less than the value for timerT2.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>9</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerSrt">
+ <description>Timer pending a Signalling Route Test Acknowledgement.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTBsnt">
+ <description>Waiting for BSNT value from MTP-2 or SAAL (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTRetrieval">
+ <description>Timer for waiting for completion of buffer retrieval from MTP-2 or SAAL (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTStart">
+ <description>Timer for retransmission of DL_START_req if no answer received. Started when timerT17 expires. (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>1200</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTc">
+ <description>Controlling the period a route set is considered congested when a Transfer Controlled message has been received.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>50</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT15">
+ <description>Timer waiting to start signaling route set congestiontest. Used only if the Route Set
+Congestion Test Selectoption is set to "Use Route Set Congestion test".
+
+Guiding value 20 - 30.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT16">
+ <description>Timer waiting for route set congestion status update. Used only if the Route Set
+Congestion Test Selectoption is set to "Use Route Set Congestion test"
+
+Guiding value 14 - 22.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>14</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTDlack">
+ <description>Timer pending an acknowledge from the network layer for a DL_ACK_REQ.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <struct name="Mtp3bSpAnsiPriorityData">
+ <description>Priority attributes for MTP3b SP of the ANSI standard.</description>
+ <structMember name="prioSlt">
+ <description>The prioSlt attribute sets the priority for the
+ Signalling Link Test Message and Acknowledge (SLTM / SLTA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioCo">
+ <description>The prioCo attribute sets the priority for the ChangeOver Order and Acknowledge (COO/COA) or eXtended Change over Order and Acknowledge (XCO/XCA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet)
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioCb">
+ <description>The prioCb attribute sets the priority for the
+ Change Back Declaration and Acknowledge (CBD / CBA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioEc">
+ <description>The prioEc attribute sets the priority for the
+Emergency Change over Order and Acknowledge (ECO / ECA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioRst">
+ <description>The prioRst attribute sets the priority for the
+signalling Route Set Test (RST) message when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioTra">
+ <description>The prioTra attribute sets the priority for the
+Traffic Restart Allowed signal (TRA) message when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioUpu">
+ <description>The prioUpu attribute sets the priority for the
+ User Part Unavailable (UPU) message when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioLink">
+ <description>The prioLink attribute sets the priority for link related messages when issued by the MTP3b itself. The messages are :
+
+Link INhibit (LIN), Link UNinhibit (LUN),
+Link Inhibit Denied (LID),
+Link Inhibit Acknowledge (LIA),
+Link Uninhibit Acknowledge (LUA),
+Link Forced Uninhibit (LFU),
+Link Local inhibit Test (LLT) and
+Link Remote inhibit Test (LRT)
+
+When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ </struct>
+
+ <struct name="Mtp3bSpTtcPriorityData">
+ <description>Priority attributes for MTP3b SP of the TTC standard.</description>
+ <structMember name="prioCo">
+ <description>The prioCo attribute sets the priority for the ChangeOver Order and Acknowledge (COO/COA) or eXtended Change over Order and Acknowledge (XCO/XCA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet)
+.</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioCb">
+ <description>The prioCb attribute sets the priority for the
+ Change Back Declaration and Acknowledge (CBD / CBA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioEc">
+ <description>The prioEc attribute sets the priority for the
+Emergency Change over Order and Acknowledge (ECO / ECA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioRst">
+ <description>The prioRst attribute sets the priority for the
+signalling Route Set Test (RST) message when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioTfa">
+ <description>The prioTfa attribute sets the priority for the Transfer Allowed, TFA, messages.
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioRt">
+ <description>The priority indicator used for indicating message priority for signalling route test messages (SRT/SRA).
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioTfc">
+ <description>The priority indicator used for indicating the message prioirity for TFC.
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ </struct>
+
+ <enum name="Mtp3bSpPriorityLevel">
+ <description>Indicates the priority level for MTP 3.</description>
+ <enumMember name="LOWEST">
+ <description>Lowest priority setting.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="LOW">
+ <description>Low priority setting.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="HIGH">
+ <description>High priority setting.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="HIGHEST">
+ <description>Highest priority setting.</description>
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <struct name="Mtp3bSpChinaTimerData">
+ <description>China timers for MTP3bSpChina. Timervalues in 1/10 s (deciseconds).</description>
+ <structMember name="timerSlta">
+ <description>Supervision timer for SLTA message (time within SLTA should arrive).
+
+Timer T1 in ITU Q.707 standard.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerSltm">
+ <description>Timer for sending SLTM periodically.
+
+Timer T2 in ITU Q.707 standard.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>400</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT1">
+ <description>Delay to avoid message mis-sequencing on changeover.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT10">
+ <description>Timer for waiting to repeat sending of RST periodically.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>400</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT12">
+ <description>Waiting for uninhibit acknowledgement.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT13">
+ <description>Timer for waiting for force uninhibit.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT14">
+ <description>Timer for waiting for inhibition acknowledgement.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT17">
+ <description>Delay to avoid oscillation of initial alignment failure and link restart.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>9</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT18">
+ <description>Supervision timer for the first phase of a restarting STP. This is an STP specific parameter, which is ignored when configured as an endpoint.
+
+Unit: deciseconds (1/10 second).
+</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>200</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT19">
+ <description>Controlling the response of the receipt of a traffic restart message from an adjacent node.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>40</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT2">
+ <description>Timer for waiting for a COO or a COA.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT20">
+ <description>Overall MTP restart timer at the restarting MTP.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>40</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT21">
+ <description>Overall MTP restart timer at an adjacent signalling point to a restarting MTP.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>300</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT22">
+ <description>Local inhibit test timer.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>2500</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT23">
+ <description>Remote inhibit test timer.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>2500</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT3">
+ <description>Delay to avoid message mis-sequencing on a time controlled diversion change back.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT4">
+ <description>Timer for waiting for CBA, first attempt.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT5">
+ <description>Timer for waiting for CBA, second attempt
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT6">
+ <description>Timer for delay to avoid message mis-sequencing on controlled rerouting.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>9</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT8">
+ <description>Timer for delay to prohibit sending of TFP messages via the response method. This is a STP specific parameter, which is ignored when configured as an endpoint.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTBsnt">
+ <description>Waiting for BSNT value from MTP-2 or SAAL (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTc">
+ <description>Controlling the period a route set is considered congested when a Transfer Controlled message has been received.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>50</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTRetrieval">
+ <description>Timer for waiting for completion of buffer retrieval from MTP-2 or SAAL (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTStart">
+ <description>Timer for retransmission of DL_START_req if no answer received. Started when timerT17 expires. (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>1200</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaTack">
+ <description>Timer used for message acknowledgement.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaPeriodicAudit">
+ <description>Timer used for audit procedure.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>300</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT1">
+ <description>Delay to avoid mis-sequencing of messages when an association fails.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT3">
+ <description>Delay to avoid mis-sequencing of messages when an association becomes active.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT6">
+ <description>Delay to avoid mis-sequencing on controlled rerouting.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT8">
+ <description>Delay to prohibit sending of DUNA messages via the response method.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT40">
+ <description>Delay to avoid message mis-sequencing on controlled/forced rerouting.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT41">
+ <description>Timer controlloing the traffic activation delay during restart phase.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT42">
+ <description>The forever interval period for trying association after an unsiccessfull trial.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaTc">
+ <description>Timer controlling the period a route set is considered congested when a SCON message has been received.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>50</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT15">
+ <description>Timer waiting to start signaling route set congestiontest. Used only if the Route Set
+Congestion Test Selectoption is set to "Use Route Set Congestion test".
+
+Guiding value 20 - 30.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT16">
+ <description>Timer waiting for route set congestion status update. Used only if the Route Set
+Congestion Test Selectoption is set to "Use Route Set Congestion test"
+
+Guiding value 14 - 22.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>14</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTDlack">
+ <description>Timer pending an acknowledge from the network layer for a DL_ACK_REQ.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaTassocack">
+ <description>Timer used for SCTP_ASSOCIATE_REQ message acknowledgement. This is the maximum time to wait for the SCTP_COMMUP_IND mesage before considering it to be an error.
+It should be longer than the time a message spends to reach the most distant destination, be processed and returned.</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <enum name="Mtp3bNetworkIndTtc">
+ <description>Indicates which type of geographical network, e.g. national, international, etc..
+
+Note: Only for TTC.</description>
+ <enumMember name="NATIONAL_NETWORK">
+ <description>National network.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="SPARE">
+ <description>Spare (for international use only).</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="INTERNATIONAL_NETWORK">
+ <description>International Network.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="SPARE_1">
+ <description>Spare.</description>
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <enum name="Mtp3bUsageState">
+ <description>There are three possible states for the usageState attribute:
+
+- idle, the Mtp3bSl carries no traffic.
+- active, the Mtp3bSl is working normally, and there is traffic, and it is not congested.
+- busy, the Mtp3bSl is working but is congested (traffic is routed on other links).</description>
+ <enumMember name="IDLE">
+ <description>idle, the Mtp3bSl carries no traffic.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="ACTIVE">
+ <description>active, the Mtp3bSl is working normally, and there is traffic, and it is not congested.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="BUSY">
+ <description>busy, the Mtp3bSl is working but is congested (traffic is routed on other links).</description>
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="Mtp3bProceduralState">
+ <description>The procedural state of the link.
+
+0 - not initialized
+1 - initialized</description>
+ <enumMember name="NOT_INITIALIZED">
+ <description>0 - not initialized.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="INITIALIZED">
+ <description>1 - initialized.</description>
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="NodeBehaviourType">
+ <description>The nodeBehaviorType attribute represents the MTP3b node type.</description>
+ <enumMember name="SEP">
+ <description>Signaling End Point.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="SEP_STP">
+ <description>Signalling Transfer and End Point, i.e the signalling point is of both type Signalling End Point (SEP) and Signalling Transfer Point (STP).</description>
+ <value>4</value>
+ </enumMember>
+ <enumMember name="SGW_STP_SEP">
+ <description>Signaling GateWay, Signaling End Point and Signalling Transfer Point, i.e the signalling point is of both type Signalling Transfer Point (STP), Signaling End Point (SEP) and Signaling GateWay (SGW).</description>
+ <value>5</value>
+ </enumMember>
+ </enum>
+
+ <struct name="Mtp3bSpChinaPriorityData">
+ <description>Priority attributes for MTP3b SP of the China standard.</description>
+ <structMember name="prioSlt">
+ <description>The prioSlt attribute sets the priority for the
+ Signalling Link Test Message and Acknowledge (SLTM / SLTA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioCo">
+ <description>The prioCo attribute sets the priority for the ChangeOver Order and Acknowledge (COO/COA) or eXtended Change over Order and Acknowledge (XCO/XCA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet)
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioCb">
+ <description>The prioCb attribute sets the priority for the
+ Change Back Declaration and Acknowledge (CBD / CBA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioEc">
+ <description>The prioEc attribute sets the priority for the
+Emergency Change over Order and Acknowledge (ECO / ECA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioRst">
+ <description>The prioRst attribute sets the priority for the
+signalling Route Set Test (RST) message when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioTra">
+ <description>The prioTra attribute sets the priority for the
+Traffic Restart Allowed signal (TRA) message when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioUpu">
+ <description>The prioUpu attribute sets the priority for the
+ User Part Unavailable (UPU) message when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioLink">
+ <description>The prioLink attribute sets the priority for link related messages when issued by the MTP3b itself. The messages are :
+
+Link INhibit (LIN), Link UNinhibit (LUN),
+Link Inhibit Denied (LID),
+Link Inhibit Acknowledge (LIA),
+Link Uninhibit Acknowledge (LUA),
+Link Forced Uninhibit (LFU),
+Link Local inhibit Test (LLT) and
+Link Remote inhibit Test (LRT)
+
+When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ </struct>
+
+ <enum name="Mtp3bRouteType">
+ <description>The type of Signalling Route.</description>
+ <enumMember name="TDM_ATM">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="IP">
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="HomingState">
+ <enumMember name="SINGLE_HOMED_1">
+ <description>Single-homed with ipAddress1.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="SINGLE_HOMED_2">
+ <description>Single-homed with ipAddress2.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="MULTI_HOMED">
+ <description>Multihomed association with ipAddress1 and
+ipAddress2
+</description>
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <enum name="RouteState">
+ <description>The state of the signaling route.</description>
+ <enumMember name="NOT_BLOCKED">
+ <description>The signaling route is not blocked.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="BLOCKED">
+ <description>The signaling route is blocked.</description>
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="WorkingMode">
+ <enumMember name="hostMode">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="routerMode">
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="OspfMetricType">
+ <description>Open Shortest Path First metric type.</description>
+ <enumMember name="comparableCost">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="nonComparable">
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="RouteType">
+ <description>The types of the routes found in the IP routing table.</description>
+ <enumMember name="INET_RTPROTO_OTHER">
+ <description>The source of information is unknown.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="INET_RTPROTO_LOCAL">
+ <description>Route created from local configuration data (both static and interface routes).
+Each interface created gets an entry in the routing table of the RO.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="INET_RTPROTO_NETMGMT">
+ <description>Route added by SNMP.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="INET_RTPROTO_OSPF">
+ <description>Route added by OSPF.</description>
+ <value>13</value>
+ </enumMember>
+ <enumMember name="INET_RTPROTR_ICMP">
+ <description>Route added by ICMP redirect message.</description>
+ <value>4</value>
+ </enumMember>
+ </enum>
+
+ <exception name="RouteNotFoundException">
+ <description>Invalid IP route has been given as a parameter to an action.</description>
+ <exceptionParameter name="routeNotFound">
+ <description>Exception message.</description>
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="InvalidRouteException">
+ <description>Invalid IP route has been given as a parameter to an action.</description>
+ <exceptionParameter name="invalidRoute">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <enum name="MauDuplexMode">
+ <enumMember name="HALF_DUPLEX">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="FULL_DUPLEX">
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="ControllerMode">
+ <description>The controller mode of a physical interface.</description>
+ <enumMember name="CONTROLLER_E1">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="CONTROLLER_T1">
+ <value>2</value>
+ </enumMember>
+ <enumMember name="CONTROLLER_J1">
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <struct name="OspfAreaRange">
+ <description>ipAddress - the subnet address of the range.
+subnetMask - IP subnet mask of the range to be added.
+advertise - indicates whether the area range should be advertised into OSPF.
+</description>
+ <structMember name="ipAddress">
+ <string/>
+ </structMember>
+ <structMember name="subnetMask">
+ <description>Note! The subnet has to be contigious. That is, has the LSB set to 0 (zero).
+
+Example:
+
+255.255.255.X
+
+Contiguous subnet mask:
+11111111.11111111.11111111.11111110 (X = 254)
+11111111.11111111.11111111.11111100 (X = 252)
+
+Not-contiguous subnet mask:
+11111111.11111111.11111111.11111010 (X = 250)
+</description>
+ <string/>
+ </structMember>
+ <structMember name="advertise">
+ <boolean/>
+ </structMember>
+ </struct>
+
+ <struct name="RoutingTableEntry">
+ <description>IP routing table entry.</description>
+ <structMember name="destinationIpAddr">
+ <description>The destination IP address.</description>
+ <string/>
+ </structMember>
+ <structMember name="destinationNetworkMask">
+ <description>The destination IP network mask.</description>
+ <string/>
+ </structMember>
+ <structMember name="nextHopIpAddr">
+ <description>The next hop IP address.</description>
+ <string/>
+ </structMember>
+ <structMember name="routeMetric">
+ <description>The route metric.</description>
+ <long/>
+ </structMember>
+ <structMember name="routeType">
+ <description>The route type.</description>
+ <enumRef name="RouteType">
+ </enumRef>
+ </structMember>
+ <structMember name="interfaceName">
+ <description>The interface name.</description>
+ <string/>
+ </structMember>
+ <structMember name="redistribute">
+ <description>Indicates if the route should be redistributed.</description>
+ <boolean/>
+ </structMember>
+ <structMember name="active">
+ <description>Indicates if the route is active.</description>
+ <boolean/>
+ </structMember>
+ </struct>
+
+ <enum name="AutoConfigurationMode">
+ <description>Denotes whether the autoConfiguration mode for the IpAccessHost is turned on or off.</description>
+ <enumMember name="ON">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="OFF">
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="Aal5TpSelectionModes">
+ <description>In case 'NO_PREFERENCE', 'LOCAL_MP_SELECT_VCC_AT_LINK_UP', LOCAL_MP_PEER_SELECTION_VCC' or 'LOCAL_MP_ACTIVE_RESELECTION' is selected the IpAtmLink MO will prefer Aal5TpVccTp on local MP (i.e. Aal5TpVccTp executing on the same MP as the IpAtmLink), but other Aal5TpVccTp will be accepted if needed.
+
+In case 'ONLY_LOCAL_MP' is selected, the ipAtmLink (Inet Link) will consider Aal5TpVccTp residing on other MPs as a malfunction and discard the usage of them. No InvArp sending will be performed on them and all incomming trafic on them will be discarded. If no local Aal5TpVccTp exists the operational state of the link will be changed to disabled.</description>
+ <enumMember name="NO_PREFERENCE">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="LOCAL_MP_SELECT_VCC_AT_LINK_UP">
+ <description>Prefer termination on local MP, select Vcc when link goes up.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="LOCAL_MP_PEER_SELECTION_VCC">
+ <description>Prefer termination on local MP, follow peer selection of Vcc.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="LOCAL_MP_ACTIVE_RESELECTION">
+ <description>Prefer termination on local MP, active reselection to new Aal5TpVccTp as soon as a better choice exists.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="ONLY_LOCAL_MP">
+ <description>Restricted to local MP, follow peer selection if termination is on local MP.
+</description>
+ <value>4</value>
+ </enumMember>
+ </enum>
+
+ <enum name="AlarmReport">
+ <description>Alarm report for the Virtual path connection termination point.
+RDI - Remote defect indication
+LOC - Loss of continuity
+AIS - Alarm indication signal</description>
+ <enumMember name="ALARM_LOC">
+ <description>For alarms of type Loss of continuity.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="ALARM_LOC_RDI">
+ <description>For alarms of type Loss of continuity and Remote defect indication.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="ALARM_AIS_LOC">
+ <description>For alarms of type Alarm indication signal and Loss of continuity.</description>
+ <value>6</value>
+ </enumMember>
+ <enumMember name="ALARM_AIS_RDI_LOC">
+ <description>For alarms of type Alarm indication signal, Remote defect indication and Loss of continuity.</description>
+ <value>7</value>
+ </enumMember>
+ </enum>
+
+ <enum name="AtmCounterMode">
+ <enumMember name="PM_MODE_OFF">
+ <description>Performance monitoring is turned off. PM counters give irrelevant values.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="PM_MODE_ONLYCOUNT">
+ <description>Performance monitoring counters are active
+</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="PM_MODE_FPM">
+ <description>FPM, Forward Performance Monitoring activated.
+
+Performance monitoring counters are active
+</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="PM_MODE_BR">
+ <description>Backward reporting, BR, cells are generated.
+
+Performance monitoring counters are active
+</description>
+ <value>4</value>
+ </enumMember>
+ <enumMember name="PM_MODE_FPM_BR">
+ <description>FPM, Forward Performance Monitoring activated.
+
+Backward reporting, BR, cells are generated.
+
+Performance monitoring counters are active
+</description>
+ <value>6</value>
+ </enumMember>
+ </enum>
+
+ <enum name="AtmNomPmBlkSize">
+ <description>Nominal performance monitoring, PM, blocksize. The minimum number of ATM cells to send before sending a Forward Performance Monitoring, FPM, cell.</description>
+ <enumMember name="NOM_PM_BLKSIZE_2_7">
+ <description>Nominal performance monitoring, PM, block size, 2e7 (2 to the power of 7).</description>
+ <value>128</value>
+ </enumMember>
+ <enumMember name="NOM_PM_BLKSIZE_2_8">
+ <description>Nominal performance monitoring, PM, block size, 2e8 (2 to the power of 8).</description>
+ <value>256</value>
+ </enumMember>
+ <enumMember name="NOM_PM_BLKSIZE_2_9">
+ <description>Nominal performance monitoring, PM, block size, 2e9 (2 to the power of 9).</description>
+ <value>512</value>
+ </enumMember>
+ <enumMember name="NOM_PM_BLKSIZE_2_10">
+ <description>Nominal performance monitoring, PM, block size, 2e10 (2 to the power of 10).</description>
+ <value>1024</value>
+ </enumMember>
+ <enumMember name="NOM_PM_BLKSIZE_2_11">
+ <description>Nominal performance monitoring, PM, block size, 2e11 (2 to the power of 11).</description>
+ <value>2048</value>
+ </enumMember>
+ <enumMember name="NOM_PM_BLKSIZE_2_12">
+ <description>Nominal performance monitoring, PM, block size, 2e12 (2 to the power of 12).</description>
+ <value>4096</value>
+ </enumMember>
+ <enumMember name="NOM_PM_BLKSIZE_2_13">
+ <description>Nominal performance monitoring, PM, block size, 2e13 (2 to the power of 13).</description>
+ <value>8192</value>
+ </enumMember>
+ <enumMember name="NOM_PM_BLKSIZE_2_14">
+ <description>Nominal performance monitoring, PM, block size, 2e14 (2 to the power of 14).</description>
+ <value>16384</value>
+ </enumMember>
+ <enumMember name="NOM_PM_BLKSIZE_2_15">
+ <description>Nominal performance monitoring, PM, block size, 2e15 (2 to the power of 15).</description>
+ <value>32768</value>
+ </enumMember>
+ </enum>
+
+ <enum name="ServiceCategory">
+ <enumMember name="SERVICE_CATEGORY_CBR">
+ <description>Service category Constant Bit rate, CBR.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="SERVICE_CATEGORY_UBR">
+ <description>Service category Unspecified Bit rate, UBR.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="SERVICE_CATEGORY_UBR_PLUS">
+ <description>Service category Unspecified Bit rate+, UBR+. UBR+ guarantees a certain bandwidth. If higher bandwidth is used it will be handled as UBR.</description>
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <enum name="AtmQos">
+ <description>ATM's Quality of Service classes.
+
+The ATM layer system provides four QoS classes, numbered 1 to 4, where CLASS_ONE gives the best QoS in regards to Cell Loss Ratio &lt;CLR&gt; and Cell Delay Variation &lt;CDV&gt; and CLASS_FOUR doesn't give any QoS guarantees. CLASS_ONE and CLASS_TWO are the only classes applicable for real time traffic.</description>
+ <enumMember name="CLASS_ONE">
+ <description>CDV &lt; 1 ms (milliseconds), CLR &lt; 10e-8. Typically used by timing unit.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="CLASS_TWO">
+ <description>CDV &lt; 1 ms, CLR &lt; 10e-7. Typically used for speech.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="CLASS_THREE">
+ <description>CLR &lt; 10e-5. Typically used for signalling.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="CLASS_FOUR">
+ <description>Typically used for IP.</description>
+ <value>4</value>
+ </enumMember>
+ </enum>
+
+ <struct name="ValueOfUnex">
+ <description>The attributes in this struct represents the ATM header, (vpi, vci, pti), of the last recieved unexpected cell.</description>
+ <structMember name="vpi">
+ <description>The ATM header vpi.</description>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="vci">
+ <description>The ATM header vci.</description>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="pti">
+ <description>The ATM header pti.</description>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <class name="TransportNetwork">
+ <description>This MO structures the transport network of the managed element. It is created automatically and cannot be deleted.
+
+The local distinguished name of this MO is ManagedElement=1, TransportNetwork=1.</description>
+ <systemCreated/>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="TransportNetworkId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="getAal5ForNniSaal">
+ <description>This action returns a sequnce of Aal5TpVccTp MOs that is unreserved and executes on an MP.
+
+Also the following condition has to be fullfilled:
+
+MinAal5Sdu = min (fromUserMaxSduSize, toUserMaxSduSize)
+
+roundedDownSdu = (MinAal5Sdu - (MinAal5Sdu modulo 4) +4)
+
+roundedDownSdu &gt; low boundry for maxSduSize (in NniSaalTp)
+
+Note that the values for fromUserMaxSduSize and toUserMaxSduSize is the actual values set in the Aal5TpVccTp MO.
+Also note that the attributes minAal5Sdu and roundedDownSdu is used internaly in this action.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </returnType>
+ </action>
+ <action name="getAal5ForUniSaal">
+ <description>This action returns a sequnce of Aal5TpVccTp MOs that is unreserved and executes on an MP.
+
+Also the following condition has to be fullfilled:
+
+MinAal5Sdu = min (fromUserMaxSduSize, toUserMaxSduSize)
+
+roundedDownSdu = (MinAal5Sdu - (MinAal5Sdu modulo 4) +4)
+
+roundedDownSdu &gt; low boundry for maxSduSize (in UniSaalTp)
+
+Note that the values for fromUserMaxSduSize and toUserMaxSduSize is the actual values set in the Aal5TpVccTp MO.
+Also note that the attributes minAal5Sdu and roundedDownSdu is used internaly in this action.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </returnType>
+ </action>
+ <action name="getAal2PathForAal2Pdu">
+ <description>This action returns a sequence of all unreserved Aal2PathVccTp's that have an Aal2PathId that has not been
+used by another Aal2PathDistributionUnit under the same parent (Aal2Ap).
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </returnType>
+ <parameter name="aal2Ap">
+ <in/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="getRpuForAal2Pdu">
+ <description>This action returns a sequence of all ReliableProgramUniters that has not reached the maximun number of possible reservations
+and has not already been used by other Aal2PathDistributionUnit MO's (if exists) under the same parent (Aal2Ap MO).
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </returnType>
+ <parameter name="aal2Ap">
+ <in/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="getUnreservedPluginUnits">
+ <description>This action returns a sequence of PlugInUnits that is unreserved.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </returnType>
+ </action>
+ <action name="getDs0BundlesForMtp2">
+ <description>This action returns a sequence of Ds0Bundle MOs that is unreserved and only has one (1) timeSlot set in the listOfTimeSlots.
+The attribute tdmMode in these Ds0Bundles must be enabled.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </returnType>
+ </action>
+ </class>
+
+ <class name="Slot">
+ <description>The Slot MO is used to represent a slot in a subrack. A slot can hold a plug-in-unit, a board, (represented by PlugInUnit MOs).
+
+The number of slots in a subrack is specified when defining the subrack.
+
+The system will automatically create the right number of Slot MOs in the subrack at creation of the Subrack MO.
+This MO cannot be deleted by an operator.
+
+The local distinguished names of this MO's are select with identity Slot=1 in the leftmost slot with incremental numbering towards the right in the subrack.. </description>
+ <systemCreated/>
+ <attribute name="userLabel">
+ <description>A user friendly name associated to the managed object
+
+</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="slotState">
+ <description>Gives the state of the slot.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="SlotState">
+ <defaultValue>free</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="slotNumber">
+ <description>The number of the position from the left side, starting from 1.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long/>
+ </dataType>
+ </attribute>
+ <attribute name="SlotId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="productData">
+ <description>This product data describes the plug-in-unit that is presently inserted. The information is only available when slotState = used.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <structRef name="OperProductData"/>
+ </dataType>
+ </attribute>
+ <attribute name="upgradeGroupId">
+ <description>The upgradeGroupId is able to group a number of PIUs, all in the group can be upgraded at the same time.
+
+If upgradeGroupTypeName is "", this attribute is not used.
+</description>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="upgradeGroupTypeName">
+ <description>The upgradeGroupTypeName, together with the upgradeGroupId, define an upgrade group.
+</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="ManagedObject">
+ <description>The Managed Object MO is not part of the model. It is only used to have valid reference types for certain attributes. </description>
+ <attribute name="ManagedObjectId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="getType">
+ <returnType>
+ <string/>
+ </returnType>
+ </action>
+ <action name="getId">
+ <returnType>
+ <string/>
+ </returnType>
+ </action>
+ <action name="getParent">
+ <returnType>
+ <moRef name="ManagedObject"/>
+ </returnType>
+ </action>
+ <action name="getChildren">
+ <returnType>
+ <long/>
+ </returnType>
+ </action>
+ <action name="getFullDistinguishedName">
+ <returnType>
+ <string/>
+ </returnType>
+ </action>
+ <action name="delete">
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="MoHasChildrenException"/>
+ <raisesException name="MoReservedByOtherUserException"/>
+ <raisesException name="FroRequestFailedException"/>
+ <raisesException name="FroNotAccessibleException"/>
+ <raisesException name="UndeletableMoException"/>
+ <raisesException name="TransactionRequiredException"/>
+ </action>
+ <action name="getLocalDistinguishedName">
+ <returnType>
+ <string/>
+ </returnType>
+ </action>
+ <action name="create">
+ <returnType>
+ <moRef name="ManagedObject"/>
+ </returnType>
+ <raisesException name="MoNameAlreadyTakenException"/>
+ <raisesException name="AttrMissingAtCreateException"/>
+ <raisesException name="AttrNotSettableAtCreateException"/>
+ <raisesException name="IllegalParentException"/>
+ <raisesException name="MoCardinalityViolationException"/>
+ <raisesException name="NoSuchAttributeException"/>
+ <raisesException name="MoCanNotBeCreatedException"/>
+ <raisesException name="NoSuchFieldException"/>
+ <raisesException name="NotHandledAttributeTypeException"/>
+ <raisesException name="WrongAttributeTypeException"/>
+ <raisesException name="ValueOutOfRangeException"/>
+ <raisesException name="FroRequestFailedException"/>
+ <raisesException name="FroNotAccessibleException"/>
+ <raisesException name="TransactionRequiredException"/>
+ <raisesException name="IpException"/>
+ <raisesException name="IpFormatException"/>
+ <raisesException name="EquipException"/>
+ <raisesException name="AttrValueNotUniqueException"/>
+ <raisesException name="MaxNumberExceededException"/>
+ <raisesException name="MoReservedNotDeletableException"/>
+ </action>
+ </class>
+
+ <class name="VclTp">
+ <description>This MO is used to represent the termination of an external VC link in the node.
+
+Note that a maximum of 10 000 MO of this kind may be configured in a node.
+
+Note! The performance monitoring counters in the VclTp MO is set to 0 (zero) at start or restart of the node.
+When the value is to large too fit in to a long (31bit) the counter turns over and starts from 0 again.</description>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="externalVci">
+ <description>Virtual Channel Idenitifier, VCI, value for this Virtual Channel Link, VCL.
+
+Range: 32 - 65535.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>32</min> <max>65535</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="atmTrafficDescriptorId">
+ <description>Reference to the AtmTrafficDescriptor profile.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="AtmTrafficDescriptor"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>User that have reserved this VclTp.
+
+</description>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the VclTp.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmReceivedAtmCells">
+ <description>Performance monitoring counter for number of received ATM cells.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmTransmittedAtmCells">
+ <description>Performance monitoring counter for number of transmitted ATM cells.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status of the VclTp.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="VclTpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="eteLoopBack">
+ <description>Used by VclTp to inforce a Virtual Channel end-to-end loopback.
+false=Failed, true=Succeded.
+
+Note! This action requires a transaction.
+
+</description>
+ <returnType>
+ <boolean/>
+ </returnType>
+ </action>
+ </class>
+
+ <class name="ManagedElement">
+ <description>The Managed Element MO is the top MO in the MOM. A management application will communicate with the Managed Element MO for the purpose of monitoring it and controlling it.
+
+The ManagedElement MO is automatically created and cannot be deleted.
+
+The local distinguished name of this MO is ManagedElement=1.</description>
+ <systemCreated/>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="site">
+ <description>This attribute gives information about geographical location (e.g. place name).</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>255</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="logicalName">
+ <description>This attribute gives a logical name of a site.
+
+</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>255</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="productType">
+ <description>This attribute describes the product type and is always set to the value "Node".</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <defaultValue>Node</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="productName">
+ <description>This attribute describes the implemented functionality. </description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>12</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="productNumber">
+ <description>This attribute uniquely identifies the product (e.g. ROF123).</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>24</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="productRevision">
+ <description>This attribute identifies the version of the product (e.g. R2A).</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>7</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ManagedElementId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="restart">
+ <description>Restart the node with an unconditional reload.
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="restartRank">
+ <in/>
+ <dataType>
+ <enumRef name="RestartRank">
+ </enumRef>
+ </dataType>
+ </parameter>
+ </action>
+ </class>
+
+ <class name="Equipment">
+ <description>This Managed Object is used as a structural element for the network element, i.e. it only acts as a container for other MO:s. This MO structures the equipment of the network element.
+
+The local distinguished name of this MO is ManagedElement=1, Equipment=1.</description>
+ <systemCreated/>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="EquipmentId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Subrack">
+ <description>This MO is used to represent a subrack.
+</description>
+ <attribute name="userLabel">
+ <description>A free tag that a user can associated to the this managed object. The value has no relevance for the managed system.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="switchModule">
+ <description>A reference to a SwitchModule ManagedObject, from which the SwitchModule number can be retrived. That number describes how the subrack is connected to the node, i.e. how the subracks cables are connected to the hub subrack. (The hub subrack has switch module number 0).</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="SwitchModule"/>
+ </dataType>
+ </attribute>
+ <attribute name="subrackType">
+ <description>There can only be one hub subrack in the node. The hub subrack is used to control switching and synchronization for the complete node.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="SubrackType">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="productType">
+ <description>This attribute describes the product type and is always set to the value "HW".</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>"HW"</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeProductData">
+ <description>This product data describes the subrack that is configured to be installed.
+
+</description>
+ <mandatory/>
+ <dataType>
+ <structRef name="AdminProductData"/>
+ </dataType>
+ </attribute>
+ <attribute name="subrackPosition">
+ <description>The position of this subrack within a cabinet.
+The purpose of this attribute is to help an operator locate the source of an error by letting the system put this
+information in alarms. The system does not use this information in any other way i.e. it does not affect the
+operation of the system.
+The subrack position is an integer (1-n) stating the cabinet Id, starting from the left and a letter (A-Z) stating
+the Subrack vertical position starting from the ground, e.g. 5C.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="cabinetPosition">
+ <description>The position of the cabinet (within a group of other cabinets) in which this subrack is placed.
+The purpose of this attribute is to help an operator locate the source of an error by letting the system put this information in alarms. The system does not use this information in any other way i.e. it does not affect the operation of the system.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="SubrackId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="numberOfSlots">
+ <description>Defines the number of slot in the subrack. The default value is 28.
+
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>28</max>
+ </range>
+ <defaultValue>28</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="operationalProductData">
+ <description>The operational product data describes the subrack that is actually installed.
+
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <structRef name="OperProductData"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>A reference to the SwAllocation MO that has reserved this Subrack for Fan MO upgrades..
+The attribute is set/cleared by internal actions.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <action name="removeSlots">
+ <description>Removes the given number of Slot MOs from the model. The Slots with the highest slotNumber are removed. After the action no Slot will have apn = 0.
+The attribute numberOfSlots will be udated.
+
+If there is a child MO the action will fail and the MOHasChildrenException is thrown.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="numberOfSlotsToRemove">
+ <description>The number of slots to remove.</description>
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ </action>
+ </class>
+
+ <class name="LoadModule">
+ <description>This MO is used to represent software installed in the file system.
+
+LoadModule MO can represent files with executable code, files with text information
+(COI) or directories in Cello file system.
+
+MOs of this type are created automatically during system upgrade.
+MOs of this type are possible to create manually but a system upgrade
+is recommended to create them.
+
+Note! In order for a program to be reliable the following conditions must be fulfilled:
+
+1. The attribute 'loaderType' must be set to 'OseLoader'.
+2. The attribute 'oseProgramLoadClass' must be set to a value &gt; 100.
+3. The program must execute on a MP (Main Processor).
+
+</description>
+ <attribute name="userLabel">
+ <description>Free tag for marking this managed object.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="productData">
+ <description>Product information data.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="AdminProductData"/>
+ </dataType>
+ </attribute>
+ <attribute name="loadModuleFilePath">
+ <description>The path to this load module in the file system, including the file name.
+
+Example: /c/load_modules/CXC112874R1A01
+where /c/load_modules/ is the directory and CXC112874R1A01 is the file name.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="loaderType">
+ <description>The type of the program loader.
+
+Note! This corresponds to LoaderName in the Upgrade Control File (UCF).</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="LoadModuleLoaderType">
+ <defaultValue>OseLoader</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="otherLoaderName">
+ <description>This attribute must have a value if the loaderType attribute equals other.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="preLoad">
+ <description>A recommendation to the system to (if possible) cache this load module close to where its program(s) execute(s), e.g. in a flash file system. The purpose of this attribute is to enable faster loading at restart of programs referring to this load module.
+
+
+
+
+</description>
+ <dataType>
+ <enumRef name="LoadModulePreLoadType">
+ <defaultValue>no</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="fileFormat">
+ <description>The file format (RPDOUT, html, java, fpga, ...).</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="oseProgramLoadClass">
+ <description>Specifies in which load phase programs of this load module should be started.
+
+Note: If the LoadModule is a java archive file (.jar) it will be loaded in the load phase of the java machine rather than according to its own oseProgramLoadClass.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="LoadClass">
+ <defaultValue>application</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reliableProgramLabel">
+ <description>Reliable program identity.
+Compare this to the reliableProgramLabel in ReliableProgramUniter MO.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="isDirectory">
+ <description>Indicates if the load module is a file or directory.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="oseProgramPoolSize">
+ <description>This attribute sets the size of the program pool size. In the referenced loadModule there is
+possible to set this value at create.
+This value will then be fetched by program and used at create if no value is submitted at
+create of the program Mo.
+The referenced load module has a default size defined at compile time which is used if no
+value is submitted at create of loadModule or the program Mo.
+
+Note! The value of this attribute is overwritten during Software Upgrade.
+
+Unit is byte.
+
+</description>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="oseProgramHeapSize">
+ <description>This attribute sets the size of the program heap size. In the referenced loadModule there is possible to set this value at create. This value will then be fetched by program and used at create if no value is submitted at create of the program Mo.
+The referenced load module has a default size defined at compile time which is used if no value is submitted at create of loadModule or the program Mo.
+
+Note! The value of this attribute is overwritten during Software Upgrade.
+
+Unit is byte.
+
+</description>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="programMustBeSingleton">
+ <description>Indicator whether the (OSE) program must be a singleton or not.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="moppletEntries">
+ <description>Contains all class that are to be initialised and started when the JVM restarts.
+Technical note: The class name must specify the full package and class name in standard Java syntax, e.g. "se.ericsson.cello.X" ; must implement the se.ericsson.cello.moframework.Mopplet interface and be found in this LoadModule.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <sequence>
+ <string>
+ <defaultValue/>
+ </string>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="LoadModuleId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedByUpgradePackage">
+ <description>Indicates whether this MO has been reserved by the UpgradePackage MO or not.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Synchronization">
+ <description>This MO is used to administer synchronization references for the network synchronization function and to view the system clock state of Timing Unit boards.
+
+Synchronization can have 0 to 8 relations to other MOs. The only valid MOs where relations can exist are E1Physpathterm, J1Physpathterm, T1Physpathterm, Os155SpiTtp, TU Synchronization Reference, and ManagedObject (for the non-Cello RXI820 MO) MOs. Note that maximum number of relations to these MOs is 8 all together.
+
+The synchronization MO is automatically created and cannot be deleted.
+
+Note: An external ManagedObject that wishes to be connected to the Synchronization MO must implement the following interface se.ericsson.cello.equipment.SyncReservable!
+
+The local distinguished name of this MO is ManagedElement=1,TransportNetwork=1,Synchronization=1
+
+.</description>
+ <systemCreated/>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="degradationIsFault">
+ <description>Controls whether synchronization reference degradation (e.g. signal level degradation) is interpreted as a synchronization reference fault or not. Attribute value is only applicable for traffic carrying synchronization references</description>
+ <dataType>
+ <enumRef name="FaultCriteria">
+ <defaultValue>degrNotFault</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="systemClockA">
+ <description>State of system clock signal on Timing Unit A.
+Note that system clock generated by TU A (TU in slot 4) has higher priority than TU B (TU in slot 5) system clock, i.e. each device board uses system clocks according to this priority order.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="ClockState">
+ <defaultValue>unknownMode</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="systemClockB">
+ <description>State of system clock signal on Timing Unit B. Note that system clock generated by TU A (TU in slot 4) has higher priority than TU B (TU in slot 5) system clock, i.e. each device board uses system clocks according to this priority order.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="ClockState">
+ <defaultValue>unknownMode</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="syncReference">
+ <description>Set of synchronization reference physical resources. An MO reference to an TU synchronization reference MO implementation.
+A synchronization reference in added to the system by using action AddSyncRefResource.
+Note: if this attributes has value "Non-existing MO reference" then all the respective attributes of type sequence of 8 are not applicable.
+
+Note: The length of this sequence is always 8.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ <length>8</length>
+ <nonUnique/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="syncRefPriority">
+ <description>Synchronization reference priority.
+1 represents the highest and 8 the lowest priority. Every synchronization reference must have unique priority value. Value 0 means not applicable, that no synchronization with this priority is defined.
+This attribute is mandatory when adding a synchronization reference to the system (by using action addSyncRefResource).
+A priority value can be changed with the changeSyncRefPriority action provided that the priority is not already assigned to some other SyncRefResource.
+
+Note: The length of this sequence is always 8.</description>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <long>
+ <range>
+ <min>0</min> <max>8</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ <length>8</length>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="syncRefActivity">
+ <description>Set of synchronization reference activity attributes.
+
+Note: The length of this sequence is always 8.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <enumRef name="RefActivity">
+ <defaultValue>inactive</defaultValue>
+ </enumRef>
+ <length>8</length>
+ <nonUnique/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="syncRefStatus">
+ <description>Set of synchronization reference status attributes.
+
+Note: The length of this sequence is always 8.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <enumRef name="RefState">
+ <defaultValue>failed</defaultValue>
+ </enumRef>
+ <length>8</length>
+ <nonUnique/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="SynchronizationId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="systemClockRedundancy">
+ <description>Indicates if the node is redundant from Network Synchronization functions point of view.</description>
+ <dataType>
+ <enumRef name="SystemClockRedundancy">
+ <defaultValue>SYSTEM_CLOCK_USERS_USE_PLANE_A</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <action name="addSyncRefResource">
+ <description>This action adds one synchronization reference to the system. As a result of successful action, one set of attributes (attributes of type sequence of 8) is added to Synchronization MO.
+Parameters:
+syncReference: Managed object implementation, to which a mo-reference is to be added. See description of attribute SyncReference.
+syncPriority: Priority of synchronization reference. Each synchronization reference must have unique priority value, this must be checked by synchronization MO.
+
+Description of exceptions:
+- AlreadyRegistered: this reference is already registered
+- MaxNoOfRefRegistered: maximum number (8) of synchronization references already present
+- PriorityAlreadyInUse: syncPriority is identical with an existing synchronization reference priority
+- PriorityOutOfRange: invalid syncPriority value
+- InvalidMoReference: invalid syncReference for registration as a synchronization reference (invalid MO type)
+- NotPermitted: syncReference does not allow SyncReserve to be performed
+
+Note: An external ManagedObject that wishes to be connected to the Synchronization MO must implement the following interface se.ericsson.cello.equipment.SyncReservable!
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="syncReference">
+ <in/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </parameter>
+ <parameter name="syncPriority">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="AlreadyRegisteredException"/>
+ <raisesException name="MaxNoOfRefRegisteredException"/>
+ <raisesException name="PriorityAlreadyInUseException"/>
+ <raisesException name="PriorityOutOfRangeException"/>
+ <raisesException name="InvalidMoReferenceException"/>
+ <raisesException name="NotPermittedException"/>
+ </action>
+ <action name="removeSyncRefResource">
+ <description>This action removes one synchronization reference that has previously been added.
+(In future releases, this action should include a check whether the synchronization reference to be removed is the only existing synchronization reference. In that case, the user is asked for a confirmation to remove the last synchronization reference.)
+Parameters:
+syncReference: Managed object implementation, to which a mo-reference currently exists, but is now to be removed. See description of attribute SyncReference.
+
+Description of exceptions:
+- NotRegistered: synchronization reference is not registered
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="syncReference">
+ <in/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </parameter>
+ <raisesException name="NotRegisteredException"/>
+ </action>
+ <action name="changeSyncRefPriority">
+ <description>This action changes the synchronization priority of one previously registered synchronization reference resource.
+Parameters:
+syncReference: Managed object implementation, for which the synchronization priority is to be changed. See description of attribute syncReference.
+syncPriority: The new priority of synchronization reference. Each synchronization reference must have unique priority value, this must be checked by synchronization MO.
+
+Description of exceptions:
+- PriorityAlreadyInUse: syncPriority is identical with an existing synchronization reference priority
+- PriorityOutOfRange: invalid syncPriority value
+- NotRegistered: synchronization reference is not registered
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="syncReference">
+ <in/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </parameter>
+ <parameter name="syncPriority">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="PriorityAlreadyInUseException"/>
+ <raisesException name="PriorityOutOfRangeException"/>
+ <raisesException name="NotRegisteredException"/>
+ </action>
+ <action name="resetLossOfTracking">
+ <description>This action resets the detected Loss of Tracking error condition of one synchronization reference. After reset the synchronization reference is usable again.
+Parameters:
+syncReference: Specifies the synchronization reference for which the Loss of Tracking status is to be reset.
+
+Description of exceptions:
+- NotRegistered: synchronization reference is not registered
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="syncReference">
+ <in/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </parameter>
+ <raisesException name="NotRegisteredException"/>
+ </action>
+ </class>
+
+ <class name="SccpApLocal">
+ <description>This Managed Object represents an SCCP Local Access Point. An SCCP AP instance is a logical point in the SCCP network at which an SCCP user can access the services provided by the SCCP and the SCCP can deliver its services to the SCCP user. The SCCP Access Point is identified by a SubSystem Number (SSN).
+
+A local SccpAp represents an access point in the own node.
+
+The performance monitoring counters found in SccpApLocal MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is a shutdown request from the CLI (Cluster Interface).</description>
+ <attribute name="SccpApLocalId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the SCCP AP. The operability of the SCCP AP is described by this attribute which has two possible values:
+
+Disabled: The SCCP AP is totally inoperable and unable to provide the service to the user.
+
+Enabled: The SCCP AP is partly or fully operable and available for use.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="ssN">
+ <description>The sub system number, SSN, of the SCCP Access Point. Note that this has to be a unique number.
+
+If the SccpAp is local then the SSN has to be unique among all other SccpAp MOs under the same SccpSp MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>2</min> <max>255</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxConn">
+ <description>The maxConn attribute specifies the max number of connections allowed for this SCCP Access Point. It is only valid for local SCCP Access Points.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>524288</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="useS1">
+ <description>Controls adding of OPC from routing label to Calling Party Address if absent.
+
+False = Do not add OPC to Calling Part Address.
+True = Add OPC to Calling Part Address.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="SccpSp">
+ <description>The Signalling Connection Control Part, SCCP, Signalling Point, SP, MO is the placeholder for all SCCP related managed objects.
+
+Startime for accounting is set by attributes accountDateFileOutput and accountTimeFileOutput.
+The attribute accountPeriodFileOutput sets period for the accounting record to be stored on the /c file system.
+The accounting is stopped by setting the accountPeriodFileOutput to zero (0).
+NOTE: The SRP function and SccpAccountingCriteria MO's should only be created for one signalling stack, i.e one PIU.
+
+Note! The guiding values that can be found for some attributes is to be regarded as a recommendation for these attributes.
+Depending on the size of the network, traffic load, use and so forth it might be neccesary to set values for these attributes outside the guiding values.</description>
+ <attribute name="SccpSpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the SCCP SP. The operability of the SCCP SP is described by this attribute which has two possible values:
+
+Disabled: The SCCP SP is totally inoperable and unable to provide the service to the user (e.g. if the processor is not usable).
+
+Enabled: The SCCP SP is partly or fully operable and available for use.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="mtp3bSpId">
+ <description>The identity of the L3 Signaling Point used by this MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="prioSST">
+ <description>This attribute sets the priority for the Subsystem Test message when issued by the SCCP itself. When a message is transferred from the SCCP the message priority uses the two spare bits in the SIO.
+Coding of the message priority:
+0 Lowest priority
+1
+2
+3 Highest priority</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>3</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="prioIT">
+ <description>This attribute sets the priority for the Inactivity Test message when issued by the SCCP itself. When a message is transferred from the SCCP the message priority uses the two spare bits in the SIO.
+Coding of the message priority:
+0 Lowest priority
+1
+2
+3 Highest priority</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>3</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="prioRLSD">
+ <description>This attribute sets the priority for the connection release message when issued by the SCCP itself. When a message is transferred from the SCCP the message priority uses the two spare bits in the SIO.
+Coding of the message priority:
+0 Lowest priority
+1
+2
+3 Highest priority</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>3</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="prioGeneral">
+ <description>This attribute sets the priority for all the other messages which are issued by the SCCP itself. When a message is transferred from the SCCP the message priority uses the two spare bits in the SIO.
+
+Coding of the message priority:
+
+0 Lowest priority
+1
+2
+3 Highest priority</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>3</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="accountDateFileOutput">
+ <description>Date for accounting file output.
+Format in ASCI-code: yyyymmdd
+yyyy = 0000-9999
+mm = 01-12
+dd = 01-31
+
+Note! This is the start date for the output.</description>
+ <dataType>
+ <string>
+ <defaultValue>"00000000"</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="accountTimeFileOutput">
+ <description>Time for accounting file output.
+Format in ASCI-code: hhmm
+hh = 00-23
+mm = 00-59</description>
+ <dataType>
+ <string>
+ <defaultValue>"0000"</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="accountPeriodFileOutput">
+ <description>Period for accounting file output.
+Format: number of half hour.
+Range = 0, 1, 2, 4, 6, 8, 12, 16, 24, 48
+
+Note! if set to 0 (zero) the output will be stopped.</description>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="upperConnThres">
+ <description>The upper connection threshold allow the user to specify the level at which the upper connection threshold notification is triggered. The thresholds must be given as a percentage of the maximum number of connection resources made available for the entire SCCP.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>80</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="lowerConnThres">
+ <description>The lower connection threshold allow the user to specify the level at which the lower connection threshold notification is triggered. The thresholds must be given as a percentage of the maximum number of connection resources made available for the entire SCCP. The value must be less then UpperConnThres.
+
+The maximum value is less or equal to the upper connection threshold</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>50</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="swapUDTPointer">
+ <description>There are two ways to construct a UDTS from a UDT, the XUDTS will be constructed in the same way. One way is to only swap the pointers to Called Party Address and Calling Party Address in a UDT message when constructing a UDTS. The other way is to swap data. How this is done in the SCCP is configurable. The coding and interpretation is as follows:
+0, swap data Called party Address will be sent before Calling party Address
+1, swap pointers Called party Address will be sent after Calling party Address.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="hopCounterSclc">
+ <description>The SCLC hop counter is a parameter that is decremented for each performed GT translation for SCLC messages on the way to the end destination. If decrementing the counter results in the value of zero in a non-end destination node, the SCCP initiates the appropriate error procedure.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>15</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="hopCounterScoc">
+ <description>The SCOC hop counter is a parameter that is decremented for each performed GT translation for SCOC messages on the way to the end destination. If decrementing the counter results in the value of zero in no end destination node, the SCCP initiates the appropriate error procedure.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>15</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tconnEst">
+ <description>Connection establishment control timer.
+
+Unit: deciseconds (0.1 seconds).
+
+Guiding values;
+Range 600 - 1200, Default 600
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>600</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tIas">
+ <description>Send inactivity control timer.
+
+Unit: deciseconds (0.1 seconds).
+
+Guiding values;
+Range 3000-6000
+Default 3000</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>3000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tIar">
+ <description>Receive inactivity control timer.
+
+Unit: deciseconds (0.1 seconds).
+
+Guiding values;
+Range 6600-12600
+Default 6600</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>6600</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tRel">
+ <description>Connection release timer.
+
+Unit: deciseconds (0.1 seconds).
+
+Guiding values;
+Range 100-200
+Default 100</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tCong">
+ <description>Congestion timer.
+
+Unit: deciseconds (0.1 seconds).
+
+Guiding values;
+Range 10-2550
+Default 300</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>300</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tStatInfo">
+ <description>Subsystem Status Test timer.
+
+Unit: deciseconds (0.1 seconds).
+
+Guiding values;
+Range 10-2550
+Default 300</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>300</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tconnResp">
+ <description>Connection response waiting timer.
+
+Unit: deciseconds (0.1 seconds).
+
+Guiding values;
+Range 100-200
+Default 150</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>150</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tReass">
+ <description>Reassembly timer.
+
+Unit: deciseconds (0.1 seconds).
+
+Guiding values;
+Range 100-200
+Default 150</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>150</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tGuard">
+ <description>Guard timer for program restart not applicable for this CPP version. Instead a restart counter is used to improve restart performance.
+
+Unit: deciseconds (0.1 seconds).
+
+Guiding values;
+Range 13800-15000 (23-25 minutes)
+Default 1380 (23 minutes)
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>13800</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="smiValue">
+ <description>The SMI (Subsystem Multiplicity Indicator) is always ignored for incoming messages. This SCCP can however be configured to insert a specific SMI value in outgoing messages. The coding and interpretation is as follows:
+
+Coding Comment
+ 0 | Affected Subsystem multiplicity unknown.
+ 1 | Affected Subsystem is solitary.
+ 2 | Affected Subsystem is duplicated.
+ 3 | Spare.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>3</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="useSCMG">
+ <description>The use of SCMG functions.
+
+SST = SCCP Subsystem Test message.
+SSA = SCCP Subsystem Allowed message.
+SSP = SCCP Subsystem Prohibited message.
+SSC = SCCP Subsystem Congested message.
+
+The attributes contained in the struct is:
+initiateTimerTcon,
+allowRemoteBroadcast,
+useSST,
+useSSP,
+sendSSA,
+sendSST
+
+</description>
+ <dataType>
+ <structRef name="Scmg"/>
+ </dataType>
+ </attribute>
+ <attribute name="maxRelayedConn">
+ <description>Connection Oriented SCCP Signaling Relay Point (SRP-CO) and Maximum number of Relayed Connections is not used in this CPP version.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>524288</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUDTSent">
+ <description>Performance monitoring counter for number of sent UDT's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUDTRec">
+ <description>Performance monitoring counter for number of received UDT's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUDTSSent">
+ <description>Performance monitoring counter for number of sent UDTS's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUDTSRec">
+ <description>Performance monitoring counter for number of received UDTS's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfXUDTSent">
+ <description>Performance monitoring counter for number of sent XUDT's.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfXUDTRec">
+ <description>Performance management counter for number of received XUDT's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfXUDTSSent">
+ <description>Performance monitoring counter for number of sent XUDTS's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfXUDTSRec">
+ <description>Performance monitoring counter for number of received XUDTS's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCRSent">
+ <description>Performance monitoring counter for number of sent CR's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCRRec">
+ <description>Performance monitoring counter for number of received CR's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDT1Sent">
+ <description>Performance monitoring counter for number of sent DT1's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDT1Rec">
+ <description>Performance monitoring counter for number of received DT1's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfERRSent">
+ <description>Performance monitoring counter for number of sent ERR's.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfERRRec">
+ <description>Performance monitoring counter for number of received ERR's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSubsysAllowedSent">
+ <description>Performance monitoring counter for number of sent SSA's, subsystem allowed.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCREFRecFromNL">
+ <description>Performance monitoring counter for number of CREF messages received from NL.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCREFSentToNL">
+ <description>Performance monitoring counter for number of CREF messages sent to NL.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRLSDRecFromNL">
+ <description>Performance monitoring counter for number of RLSD messages received from NL.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRLSDSentToNL">
+ <description>Performance monitoring counter for number of RLSD messages sent to NL.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfConInUseExceedHighWaterMark">
+ <description>Performance monitoring counter for number of connections in use that has exceeded the high watermark threshold.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfConInUseReceededLowWaterMark">
+ <description>Performance monitoring counter for number of connections in use that has receded the low watermark threshold.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLUDTRec">
+ <description>Performance monitoring counter for number of received LUDT messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLUDTSSent">
+ <description>Performance monitoring counter for number of sent LUDTS messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="SccpScrc">
+ <description>The Signalling Connection Control Part Routing Control (SCCP SCRC) MO holds information about the SCCP routing control.</description>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="SccpScrcId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRoutingFailure">
+ <description>Performance monitoring counter for number of routing failures.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfConnectFailure">
+ <description>Performance monitoring counter for number of connect failures.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfHopCounterViolation">
+ <description>Performance monitoring counter for number of Hop counter violations.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRoutingFailNoTransAddrOfSuchNature">
+ <description>Performance monitoring counter for number of routing failures due to no translation for Nature of Address field.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRoutingFailNoTransSpecificAddr">
+ <description>Performance monitoring counter for number of routing failures due to no translation of specific address.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRoutingFailurePointCodeUnAvail">
+ <description>Performance monitoring counter for number of routing failures due to destination point code not available.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRoutingFailNetworkCongest">
+ <description>Performance monitoring counter for number of routing failures due to network congestion.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRoutingFailSubsysUnavail">
+ <description>Performance monitoring counter for number of routing failures due to destination subsystem unavailable.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRoutingFailReasonUnknown">
+ <description>Performance monitoring counter for number of routing failures due to unknown reason.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRoutingFailUnequippedSubsys">
+ <description>Performance monitoring counter for number of routing failures due to unequipped subsystem.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Program">
+ <description>The Program MO represent the executable software on the target hardware.
+
+MOs of this type are created automatically during system upgrade.
+MOs of this type are possible to create manually but a system upgrade
+is recommended to create them.
+
+Note! Some programs are not possible to restart or can take part in an RPU. For more information please refer to the LoadModule MO.
+
+</description>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="loadModule">
+ <description>This attribute gives information about which load module the program is instantiated from.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="LoadModule"/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>This attribute shows whether the program has normal performance capability or not.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="startState">
+ <description>This attribute shows whether the program is permitted to enter operational state enabled or not after a PIU restart. The default state is disabled in order to avoid that an operating program and a new version of the same program have its startState enabled at the same time.
+
+It is used on all types of node restarts and restart of PlugInUnit with restartCause = piuRestartUpgrade.</description>
+ <dataType>
+ <enumRef name="StartState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="heapSize">
+ <description>This attribute sets the size of the program heap size.
+
+The value in the referenced LoadModule is fetched by program and used at create if no value is submitted at create of the program MO.
+
+The referenced load module has a default size defined at compile time wich is used if no value is submitted at create of loadModule or the program Mo.
+
+Note! The value of this attribute is overwritten during Software Upgrade.
+
+Note: If the program is a child to a Fan Mo this attribute is irrelevant.
+
+Note: Setting of this attribute will have no effect until the program is restarted.</description>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="poolSize">
+ <description>This attribute sets the size of the program pool size. In the referenced LoadModule there is possible to set this value at create.
+
+The value in the referenced LoadModule is fetched by program and used at create if no value is submitted at create of the program MO.
+
+The referenced load module has a default size defined at compile time wich is used if no value is submitted at create of
+LoadModule or the Program Mo.
+
+Note! The value of this attribute is overwritten during Software Upgrade.
+
+Only working for MP-Program
+
+Unit is bytes.
+
+Note: If the program is a child to a Fan Mo this attribute is irrelevant.
+
+Note: Setting of this attribute will not have any effect until the program is restarted.
+
+</description>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="restartTimer">
+ <description>This type specifies the time that a program have to execute without faults, until the restart counter is reset. The time value is interpreted as seconds.
+
+restartTimer= -1 : Forever, implies that the restart counter is only reset when the PIU is restarted.
+
+Note: If the program is a child to a Fan Mo this attribute is irrelevant.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>-1</min>
+ </range>
+ <defaultValue>60</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="restartCounterLimit">
+ <description>This attribute specifies the number of times that a program can restart, without escalation to a PIU restart. The possible values are:
+
+restartCounterLimit = -1 : Unlimited, means never restart PIU, regardless of the number of times the specific program restarts.
+
+Note: If the program is a child to a Fan Mo this attribute is irrelevant.
+
+Note! The value 3 means 3 restarts, hot, warm and finally as a last resort PIU restart.
+
+Note! The program escalates to a PIU restart when the number of restarts reaches the value set for this attribute.
+I.e. if for example the value is set to 5, escalation to PIU restart will occur at the fifth restart.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>-1</min>
+ </range>
+ <defaultValue>3</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="ProgramId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="restart">
+ <description>Request to restart the program.
+Only valid for MP programs.
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ </class>
+
+ <class name="UniSaalProfile">
+ <description>The UniSaal Profile MO represent and keeps attribute values used by one or more UNI SAAL termination point MOs.</description>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="UniSaalTp"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="profileData">
+ <description>See structure UniSaalProfileData</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="UniSaalProfileData"/>
+ </dataType>
+ </attribute>
+ <attribute name="UniSaalProfileId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="UniSaalTp">
+ <description>The MO represents an access point for a user where a UNI SAAL connection is terminated. The access point depends
+on an AAL5 connection termination located on the same processor.
+
+UniSaalTp can only terminate on a Mp processor.
+
+Note! The performance monitoring counters found in NniSaalTp MO is set to zero when the Mo and its RO is created.
+These counters are not reset unless there occurs a fault situation that demands a restart and recreation of the ROs.
+Also note that some of these counters are reset based on other conditions. For more details please refer to the
+descriptions of the performance monitoring counters in this MO.</description>
+ <attribute name="UniSaalTpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the UniSaalTp MO.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving MO.
+
+</description>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="uniSaalProfileId">
+ <description>Reference to a UniSaalProfile MO.
+
+The maxStat attribute defined in the UniSaalProfile MO is dependent on the AAL5 SDU size defined in the Aal5TpVccTp MO. See the description of the maxStat attribute in the UniSaalProfile MO.
+
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="UniSaalProfile"/>
+ </dataType>
+ </attribute>
+ <attribute name="aal5TpVccTpId">
+ <description>Reference to an Aal5TpVccTpMo.
+
+Note: The Aal5 termination point must terminate on a main processor, MP.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Aal5TpVccTp"/>
+ </dataType>
+ </attribute>
+ <attribute name="maxSduSize">
+ <description>Maximum SAAL SDU size. The attribute is dependent on the AAL5 maximum SDU size defined in the Aal5TpVccTp MO. The 'maxSduSize' may not exceed the AAL5 maximum SDU size (the lower of the two directions, fromUserMaxSduSize and toUserMaxSduSize).
+
+Example: If 'fromUserMaxSduSize' is set to 256 and 'toUserMaxSduSize' is set to 512 in the Aal5TpVccTp MO, the ' maxSduSize' in the UniSaalTp MO may not exceed 252.
+
+(i.e. maxSduSize &lt;= the aal5MaxSduSize - 4 bytes)
+
+Note! When setting the value of 'maxSduSize' the 4 bytes used by the SAAL layer for the SAAL header has to be considered.
+
+Note! The upper limit of 2044 (2048 including the SAAL header) is due to limitations on the AAL5 layer.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>128</min> <max>2044</max>
+ </range>
+ <defaultValue>128</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSentSDUs">
+ <description>Number of successfully sent SDUs.
+Counts the number of successfully sent messages to the
+application using SAAL. Reset when the link goes InService or the counter "overflows".</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfReceivedSDUs">
+ <description>Number of successfully received SDUs.
+Counts the number of successfully received messages from
+ the application using SAAL. Reset when the link goes
+ InService or the counter "overflows".</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLinkInServiceTime">
+ <description>The accumulated time (in seconds) the signalling link has
+ been in service (in assured data transfer mode) since it was created. If the link is down the value 0 is returned.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAllSLFailures">
+ <description>Number of all Signalling Link failures.
+Is a total sum of the error counters:
+ - Number of protocol errors
+ - Number of unsuccessfully retransmissions
+ - Number of NoResponses
+ - Number of other errors</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfNoResponses">
+ <description>Number of no response. This counter is increased when SSCOP (Service Specific Connection Oriented Protocol)
+send an MaaError with error code P.
+For details refer to ITU-T Q.2110 - B-ISDN AATM Adaptation Layer - Service Specific Connection Oriented Protocol (SSCOP); (7/94).
+Counts the number of no responses detected the last 30 minutes.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLocalCongestions">
+ <description>Number of local congestions.
+This counter is increased when the sum of SAAL send and retransmission buffers are filled to more than 90%.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRemoteCongestions">
+ <description>Number of remote congestions.
+This counter is increased when the remote side gives SAAL no credit. Reset when the link goes InService or the counter "overflows".</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSequenceDataLosses">
+ <description>Number of sequences data loss.
+Counts the number of SD loss detected the last 30 minutes</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfProtocolErrors">
+ <description>Number of unsolicited or inappropriate PDUs. This counter is increased when SSCOP (Service Specific Connection Oriented Protocol)
+send an MaaError with error code Q.
+For details refer to ITU-T Q.2110 - B-ISDN AATM Adaptation Layer - Service Specific Connection Oriented Protocol (SSCOP); (7/94).
+Counts the number of protocol errors detected the last 30 minutes.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccReTransmissions">
+ <description>Number of unsuccessful retransmissions.
+Counts the number of unsuccessfully retransmissions detected the last 30 minutes.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfOtherErrors">
+ <description>Number of other list element errors. This counter is increased when SSCOP (Service Specific Connection Oriented Protocol)
+send an MaaError with error code Q-U.
+For details refer to ITU-T Q.2110 - B-ISDN AATM Adaptation Layer - Service Specific Connection Oriented Protocol (SSCOP); (7/94).
+Counts the number of other errors detected the last 30 minutes. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="E1PhysPathTerm">
+ <description>This MO represents an E1 (i.e. 2 Mbit/s) physical interface in the node. The E1PhysPathTerm MO does not define which type of traffic (TDM or ATM) that the interface should support.
+Please refer to the Ds0Bundle, AtmPort, IMALink and IMAGroup objects for details about configuration of traffic type.
+
+Note! The performance monitoring counters in the E1PhysPathTerm MO is set to 0 (zero) at start or restart of the node.
+When the value is to large too fit in to a long (31bit) the counter turns over and starts from 0 again.
+</description>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>enabled or disabled according to the actual operational state of the Physical Line Termination. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="lineNo">
+ <description>The actual Line number on the board.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>8</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedByTraffic">
+ <description>The identity of the reserving AtmPort MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="AtmPort"/>
+ </dataType>
+ </attribute>
+ <attribute name="loopback">
+ <description>This attribute describes the current Loopback State of this physical path termination.
+
+Note! administrativeStatus must be set to locked when setting loopback attribute.</description>
+ <dataType>
+ <enumRef name="LoopbackState">
+ <defaultValue>none</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmEs">
+ <description>Performance Monitoring counter for ES, Errored Seconds.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSes">
+ <description>Performance Monitoring counter for Severely Errored Seconds, SES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="E1PhysPathTermId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="crc4Mode">
+ <description>Indicates what Cyclical Redundancy Check 4 Mode that is being used.</description>
+ <dataType>
+ <enumRef name="Crc4Mode">
+ <defaultValue>AUTOMATIC</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="idlePattern">
+ <description>The idle pattern.
+
+NOTE: Going from A_LAW or U_LAW to UNDEFINED is always allowed but setting up one ET board with
+both U_LAW and A_LAW is not allowed.
+E.g. If you want to change from A_LAW to U_LAW on one ET board you have to change idlePattern
+on each physical port belonging to the board to UNDEFINED first.
+A_LAW -&gt; UNDEFINED -&gt; U_LAW or U_LAW -&gt; UNDEFINED -&gt; A_LAW</description>
+ <dataType>
+ <enumRef name="IdlePattern">
+ <defaultValue>UNDEFINED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="degDegThr">
+ <description>The threshold decides how many of the received blocks that are allowed to have bit errors. The measurement is made on a per-second basis and if the threshold is passed the second is considered bad.
+
+This is a percentage value.
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="degDegM">
+ <description>How many bad seconds in a row that causes a Degraded Signal alarm.
+
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>2</min> <max>10</max>
+ </range>
+ <defaultValue>7</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="rdiReporting">
+ <description>Indicates whether Remote Defect Indication, RDI, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="aisReporting">
+ <description>Indicates whether Alarm Indication Signal, AIS, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="shutDownTimeout">
+ <description>The shut-down timer. It is used when the administrativeState is set to shutdown.
+
+Value in seconds, must be a positive value.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100000</max>
+ </range>
+ <defaultValue>1800</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBySync">
+ <description>The identity of the reserving Synchronization MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Synchronization"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedByImaLink">
+ <description>The identity of the reserving ImaLink MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ImaLink"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="J1PhysPathTerm">
+ <description>This MO represents an J1 (i.e. 1.5 Mbit/s) physical interface in the node. The J1PhysPathTerm MO does not define which type of traffic (TDM or ATM) that the interface should support.
+Please refer to the Ds0Bundle, AtmPort, IMALink and IMAGroup objects for details about configuration of traffic type.
+
+The performance monitoring counters in the J1PhysPathTerm MO is set to 0 (zero) at start or restart of the node.
+When the value is to large too fit in to a long (31bit) the counter turns over and starts from 0 again.
+</description>
+ <attribute name="J1PhysPathTermId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="lineNo">
+ <description>The actual Line number on the board.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>8</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>enabled or disabled according to the actual operational state of the Physical Line Termination. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="physicalLineType">
+ <description>Supported interfaces is defined in J1Types</description>
+ <dataType>
+ <enumRef name="J1Type">
+ <defaultValue>j1_G</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedByTraffic">
+ <description>The identity of the reserving AtmPort MO.
+
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="AtmPort"/>
+ </dataType>
+ </attribute>
+ <attribute name="degThreshold">
+ <description>Maximum allowed BER(Bit Error Rate). Degraded signal (DEG) if BER &gt; degThreshold. The attribute gives a maximum BER of 10e-X, where X ranges from 5 to 9 (default 6)
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>3</min> <max>9</max>
+ </range>
+ <defaultValue>6</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="loopback">
+ <description>Possible values
+
+none - This is the normal state, no loop back is performed (and ordinary traffic is running).
+
+line - The physical path is looped on the line side, the external incoming path is looped back to the external outgoing path.
+
+system - The physical path is looped on the system side, the (node-) internal incoming path is looped back to the internal outgoing path.
+
+Note! administrativeStatus must be set to locked when setting loopback attribute.</description>
+ <dataType>
+ <enumRef name="LoopbackState">
+ <defaultValue>none</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmEs">
+ <description>Performance monitoring counter for Errored Seconds, ES.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSes">
+ <description>Performance monitoring counter for Severly Errored Seconds, SES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="idlePattern">
+ <description>The idle pattern.
+
+NOTE: Going from A_LAW or U_LAW to UNDEFINED is always allowed but setting up one ET board with
+both U_LAW and A_LAW is not allowed.
+E.g. If you want to change from A_LAW to U_LAW on one ET board you have to change idlePattern
+on each physical port belonging to the board to UNDEFINED first.
+A_LAW -&gt; UNDEFINED -&gt; U_LAW or U_LAW -&gt; UNDEFINED -&gt; A_LAW</description>
+ <dataType>
+ <enumRef name="IdlePattern">
+ <defaultValue>UNDEFINED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="rdiReporting">
+ <description>Indicates whether Remote Defect Indication, RDI, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="aisReporting">
+ <description>Indicates whether Alarm Indication Signal, AIS, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="shutDownTimeout">
+ <description>The shut-down timer. It is used when the administrativeState is set to shutdown.
+
+Value in seconds, must be a positive value.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100000</max>
+ </range>
+ <defaultValue>1800</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBySync">
+ <description>The identity of the reserving Synchronization MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Synchronization"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedByImaLink">
+ <description>The identity of the reserving ImaLink MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ImaLink"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Aal0TpVccTp">
+ <description>This MO is used to represent the point in the node where an AAL0 connection is terminated. At this point the user exchange SDUs with its peer at the remote end of the AAL0 connection.
+
+Note! The performance monitoring counters in this MO is set to 0 when counterMode is set to PM_MODE_ON.
+In PM_MODE_OFF no information at all is retrived. So any value for pm-monitoring is measured from the time
+of setting counterMode to PM_MODE_ON.
+At node restart these performance monitoring counters is reset to 0.
+
+</description>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="processorId">
+ <description>This attribute specifies on what processor the termination point resides. It could either be a board processor or main processor (MO type PlugInUnit), or a SP processor (MO type Spm).</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational State reflects the operational state of the end points and the belonging node connections.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving MO.
+</description>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="vclTpId">
+ <description>The virtual channel to which this MO is termination.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="VclTp"/>
+ </dataType>
+ </attribute>
+ <attribute name="Aal0TpVccTpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="continuityCheck">
+ <description>Continuitiy checking means that a cell is sent downstream when no user cell has been sent for a period of nominally 1 second.
+
+Activates VC end to end continuityCheck according to ITU.T rec I.610.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="nomPmBlkSize">
+ <description>Nominal performance monitoring (PM) blocksize. The minimum number of ATM cells to send before sending a Forward Performance Monitoring, FPM, cell.</description>
+ <dataType>
+ <enumRef name="AtmNomPmBlkSize">
+ <defaultValue>NOM_PM_BLKSIZE_2_10</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="counterMode">
+ <description>PM mode is set to indicate type of performance monitoring mode (i.e. activation of bidirectional PM measurements).
+
+</description>
+ <dataType>
+ <enumRef name="AtmCounterMode">
+ <defaultValue>PM_MODE_OFF</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwLostCells">
+ <description>Performance monitoring counter for forwarded lost cells.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwMissinsCells">
+ <description>Performance monitoring counter for number of forwarded missinserted cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwErrBlocks">
+ <description>Performance monitoring counter for number of forwarded errored blocks.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLostFpmCells">
+ <description>Performance monitoring counter for number of lost Forward Performance Monitoring, FPM cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwLostCells">
+ <description>Performance monitoring counter for number of lost backward cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwMissinsCells">
+ <description>Performance monitoring counter for number of backward missinserted cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwErrBlocks">
+ <description>Performance monitoring counter for number of backward errored blocks.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLostBrCells">
+ <description>Performance monitoring counter for number of lost Backward Reporting, BR, cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="alarmReport">
+ <description>Attribute to decide what type of alarms to be reported.</description>
+ <dataType>
+ <enumRef name="AlarmReport">
+ <defaultValue>ALARM_LOC</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Aal5TpVccTp">
+ <description>This MO is used to represent the point in the node where an AAL5 connection is terminated. At this point the user exchanges SDUs with its peer at the remote end of the AAL5 connection.
+
+Note! The 'mtuSize' on the IpAtmLink MO does not include 8 bytes required for the LLC/SNAP header and this should be taken into consideration when setting the SduSize on the Aal5TpVccTp MO.
+
+Note! The performance monitoring counters in this MO is set to 0 when counterMode is set to PM_MODE_ON.
+In PM_MODE_OFF no information at all is retrived. So any value for pm-monitoring is measured from the time
+of setting counterMode to PM_MODE_ON.
+At node restart these performance monitoring counters is reset to 0..</description>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="processorId">
+ <description>This attribute specifies on what processor the protocol is terminated. It could either be a board processor or main processor (PlugInUnit) or a SP processor (Spm).</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="vclTpId">
+ <description>The virtual channel to which this MO is termination.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="VclTp"/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational State reflects the operational state of the end points and the belonging node connections.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="fromUserMaxSduSize">
+ <description>The maximum SDU size in number of octets received from the user (called maxIngressSduSize in the FRO domain).
+
+The allowed range is dependent on the processorType.
+SP: LowestMaxSduSize =1, HighestMaxSduSize=1600
+BP: LowestMaxSduSize =1, HighestMaxSduSize=1600
+MP:LowestMaxSduSize =1, HighestMaxSduSize=2048</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>2048</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="toUserMaxSduSize">
+ <description>The maximum SDU size in number of octets sent to the user (called maxEgressSduSize in the FRO domain). This attribute is controlled by the processor type.
+
+The allowed range is dependent on the processorType.
+SP: LowestMaxSduSize =1, HighestMaxSduSize=1600
+BP: LowestMaxSduSize =1, HighestMaxSduSize=1600
+MP:LowestMaxSduSize =1, HighestMaxSduSize=2048</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>2048</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The attribute is set by the action reserve from a user of Aal5TpVccTp. It could either be a Cello user like IpAtmLink/UniSaalTp or a node application.
+
+</description>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="Aal5TpVccTpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="alarmReport">
+ <description>Attribute to decide what type of alarms to be reported.</description>
+ <dataType>
+ <enumRef name="AlarmReport">
+ <defaultValue>ALARM_LOC</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="continuityCheck">
+ <description>Continuitiy checking means that a cell is sent downstream when no user cell has been sent for a period of nominally 1 second. Continuity check both enables generation of CC cells as well as detection of LOC
+</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="nomPmBlkSize">
+ <description>Nominal performance monitoring (PM) blocksize. The minimum number of ATM cells to send before sending a Forward Performance Monitoring, FPM, cell.
+</description>
+ <dataType>
+ <enumRef name="AtmNomPmBlkSize">
+ <defaultValue>NOM_PM_BLKSIZE_2_10</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="counterMode">
+ <description>PM mode is set to indicate type of performance monitoring mode (i.e. activation of bidirectional PM measurements).
+
+</description>
+ <dataType>
+ <enumRef name="AtmCounterMode">
+ <defaultValue>PM_MODE_OFF</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwLostCells">
+ <description>Performance monitoring counter for number of lost forward cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwMissinsCells">
+ <description>Performance monitoring counter for number of forward missinserted cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwErrBlocks">
+ <description>Performance monitoring counter for number of forward errored blocks.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLostFpmCells">
+ <description>Performance monitoring counter for number of lost Forward Performance Monitoring, FPM, cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwLostCells">
+ <description>Performance monitoring counter for number of lost backward cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwMissinsCells">
+ <description>Performance monitoring counter for number of backward missinserted cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwErrBlocks">
+ <description>Performance monitoring counter for number of backward errored blocks.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLostBrCells">
+ <description>Performance monitoring counter for number of lost Backward Reporting, BR, cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="AtmPort">
+ <description>The AtmPort MO is used to configure a physical port for ATM traffic.
+ATM can be transported accross the physical layer in three distinct and different ways:
+
+- Normal mode
+
+An AtmPort MO is created with a reference to physical layer object (any of E1PhysPathTerm,
+J1PhysPathTerm, T1PhysPathTerm, E3PhysPathTerm, T3PhysPathTerm, Sts3CspeTtp, E1Ttp, T1Ttp or Vc4Ttp).
+The payload of that physical layer object is used to transport the ATM traffic.
+
+- Fractional ATM mode
+
+An AtmPort MO is created with a reference to a Ds0Bundle object. The Ds0Bundle specifies
+in this case the timeslots on the physical layer (any of E1PhysPathTerm,J1PhysPathTerm,
+T1PhysPathTerm, T1Ttp or E1Ttp) that should be used for ATM traffic. The remaining timeslots
+are not used at all.
+I.e. when fractional ATM is used only one Ds0Bundle can exist as a child to a physical port MO.
+
+- IMA mode
+
+In IMA mode, a number of physical ports are grouped together to form one "virtual" physical
+ATM pipe. In this mode the AtmPort MO is created with a reference to an IMAGroup MO.
+Please refer to the ImaGroup MO for further details.
+
+Note! The performance monitoring counters in the AtmPort MO is set to 0 (zero) at start or restart of the node.
+When the value is to large too fit in to a long (31bit) the counter turns over and starts from 0 again..
+
+
+</description>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="AtmPortId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the ATM port.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status of the AtmPort.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmTransmittedAtmCells">
+ <description>Performance monitoring counter for number of transmitted ATM cells through the ATM port. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmReceivedAtmCells">
+ <description>Performance monitoring counter for number of received ATM cells through the ATM port.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="valueOfLastCellWithUnexp">
+ <description>This attribute returns the ATM header, (vpi, vci, pti), of the last received unexpected cell.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <structRef name="ValueOfUnex"/>
+ </dataType>
+ </attribute>
+ <attribute name="uses">
+ <description>Reference to the physical port, IMA Group or Ds0Bundle used by the ATM port.
+
+The possible MOs are:
+E1PhysPathTerm, J1PhysPathTerm, T1PhysPathTerm, E3PhysPathTerm, T3PhysPathTerm, Sts3CspeTtp, Sts1SpeTtp, Vc4Ttp, E1Ttp, T1Ttp, Ds0Bundle and ImaGroup.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="pmSecondsWithUnexp">
+ <description>Performance monitoring counter for errored seconds with discarded cells due to protocol errors (unexpected, UNEX, events).
+
+I.610: With protcol errors is meant the reception of cells with either a non-standardized or a non-currently allocated header value.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="hecCorrectionMode">
+ <description>Header Error Correction.
+
+This attribute specifies if the AtmPort should detect and correct single bit errors or detect multiple bit errors in the ATM header.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mtp3bAp">
+ <description>This MO represents an MTP3b Access Point (in a remote node). An MTP3b AP is a logical point in the MTP network at which an
+MTP3b user can access the services provided by MTP3b and the MTP3b can deliver its services to the MTP3b user.
+
+The performance monitoring counters found in Mtp3Ap MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is shutdown request from CLI (Cluster Interface).
+
+</description>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="routeSetId">
+ <description>The routeSetId attribute points out the MTP3b Signalling Route Set (SRS) to which the Mtp3bAp MO is connected. </description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Mtp3bSrs"/>
+ </dataType>
+ </attribute>
+ <attribute name="serviceInd">
+ <description>The serviceInd attribute (Service Indicator, SI) is used by traffic handling functions to perform message distribution.
+Only SI=3 for SCCP usage and SI=12 for Q.2630.1 usage and SI=14 for GCP (H.248) usage have any meaning in this case.
+
+Full range of values for attribute SI:
+0 = Signalling network management messages
+1 = Signalling network testing &amp; maintenance regular messages
+2 = Signalling network testing &amp; maintenance special messages*
+3 = SCCP
+4 = Telephone User Part (TUP)
+5 = ISDN User Part (ISUP)
+6 = Data User Part, call and circuit related messages
+7 = Data User Part, facility registration and cancellation messages
+8 = MTP Testing User Part
+9 = Broadband ISDN User Part
+10 = Satellite ISDN User Part
+11 = Spare
+12 = Q.2630.1
+13 = Spare
+14 = H.248
+15 = Spare
+
+Note! The serviceIndicator has to be unique for each Mtp3bAp witin the same Mtp3bSrs.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>15</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operationalState attribute determines the operational status of the MTP3b AP .
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="Mtp3bApId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUserPartUnavailRec">
+ <description>A performance management counter for number of received User Part Unavailable messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAdjacentSPNotAccessible">
+ <description>Performance management counter for number of Adjacent SP's that are not accessible via direct links.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="NniSaalProfile">
+ <description>The NniSaal Profile MO represents and keeps attribute values used by one or more NNI SAAL termination point MOs.</description>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of NniSaalTps that have reserved this NniSaalProfile.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="NniSaalTp"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="profileData">
+ <description>See structure NniSaalProfileData.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="NniSaalProfileData"/>
+ </dataType>
+ </attribute>
+ <attribute name="NniSaalProfileId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="NniSaalTp">
+ <description>The MO represents an access point for a user where a NNI SAAL connection is terminated. The access point depends
+on an AAL5 connection termination located on the same processor.
+
+NniSaalTp can only terminate on a Mp processor.
+
+Note! The performance monitoring counters found in NniSaalTp MO is set to zero when the Mo and its RO is created.
+These counters are not reset unless there occurs a fault situation that demands a restart and recreation of the ROs.
+Also note that some of these counters are reset based on other conditions. For more details please refer to the
+descriptions of the performance monitoring counters in this MO.</description>
+ <attribute name="NniSaalTpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the NniSaalTp MO.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="nniSaalProfileId">
+ <description>Reference to a NniSaalProfile MO.
+
+The maxStat attribute defined in the NniSaalProfile MO is controlled by the AAL5 SDU size defined in the Aal5TpVccTp MO. See the description of the maxStat attribute in the NniSaalProfile MO.
+
+Note! The consistency check of the attributes in the two MOs mentioned above could not be performed until the NniSaalTp MO was created since there is no direct relation between the objects. It is therefore the responsibility of NniSaalTp to verify the consistency.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="NniSaalProfile"/>
+ </dataType>
+ </attribute>
+ <attribute name="aal5TpVccTpId">
+ <description>Reference to a Aal5TpVccTp MO.
+
+Note: The Aal5 termination point must terminate on a main processor, MP.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Aal5TpVccTp"/>
+ </dataType>
+ </attribute>
+ <attribute name="maxSduSize">
+ <description>Maximum SAAL SDU size. The attribute is dependent on the AAL5 maximum SDU size defined in the Aal5TpVccTp MO. The 'maxSduSize' may not exceed the AAL5 maximum SDU size (the lower of the two directions, fromUserMaxSduSize and toUserMaxSduSize).
+
+Example: If 'fromUserMaxSduSize' is set to 256 and 'toUserMaxSduSize' is set to 512 in the Aal5TpVccTp MO, the ' maxSduSize' in the NniSaalTp MO may not exceed 252.
+
+(i.e. maxSduSize &lt;= the aal5MaxSduSize - 4 bytes)
+
+Note! When setting the value of 'maxSduSize' the 4 bytes used by the SAAL layer for the SAAL header has to be considered.
+
+Note! The upper limit of 2044 (2048 including the SAAL header) is due to limitations on the AAL5 layer.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>128</min> <max>2044</max>
+ </range>
+ <defaultValue>128</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSentSDUs">
+ <description>Number of successfully sent SDUs.
+Counts the number of successfully sent messages to the
+application using SAAL. Reset when the link goes InService or the counter "overflows".</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfReceivedSDUs">
+ <description>Number of successfully received SDUs.
+Counts the number of successfully received messages from
+ the application using SAAL. Reset when the link goes
+ InService or the counter "overflows".</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLinkInServiceTime">
+ <description>The accumulated time (in seconds) the signalling link has
+ been in service (in assured data transfer mode) since it was created. If the link is down the value 0 is returned.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAllSLFailures">
+ <description>Number of all Signalling Link failures.
+Is a total sum of the error counters:
+ - Number of protocol errors
+ - Number of unsuccessfully retransmissions
+ - Number of NoResponses
+ - Number of other errors</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfNoResponses">
+ <description>Number of no response.
+Counts the number of no responses detected the last 30 minutes.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLocalCongestions">
+ <description>Number of local congestions.
+This counter is increased when the sum of SAAL send and retransmission buffers are filled to more than the congestionOnSet attribute is configured to..</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRemoteCongestions">
+ <description>Number of remote congestions.
+This counter is increased when the remote side gives SAAL no credit. Reset when the link goes InService or the counter "overflows".</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAlignmentFailures">
+ <description>Number of alignment or proving failures. This counter is
+increased when "alignment not successful".
+The counter is reset when the link is created or the counter "overflows".</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSequenceDataLosses">
+ <description>Number of sequences data loss.
+Counts the number of SD loss detected the last 30 minutes</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfProtocolErrors">
+ <description>Number of unsolicited or inappropriate PDUs.
+Counts the number of protocol errors detected the last 30 minutes.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccReTransmissions">
+ <description>Number of unsuccessful retransmissions.
+Counts the number of unsuccessfully retransmissions detected the last 30 minutes.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfOtherErrors">
+ <description>Number of other list element errors.
+Counts the number of other errors detected the last 30 minutes. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="AtmTrafficDescriptor">
+ <description>This MO specifies traffic and QoS parameters for virtual channel connections.
+
+The attributes can only be set in certain combinations:
+
+CBR:
+ingressAtmQos /egressAtmQos:
+1, 2
+
+ingressAtmPcr /egressAtmPcr:
+mandatory (must be specified)
+
+ingressAtmMcr /egressAtmMcr:
+optional (not used, any value submitted will be ignored)
+
+UBR+:
+ingressAtmQos /egressAtmQos:
+3
+
+ingressAtmPcr /egressAtmPcr:
+optional (if shaping is used the desired rate is specified, 0 means no shaping)
+
+ingressAtmMcr /egressAtmMcr:
+mandatory (must be specified)
+
+UBR:
+ingressAtmQos /egressAtmQos:
+4
+
+ingressAtmPcr /egressAtmPcr:
+optional (not used, any value submitted will be ignored)
+
+ingressAtmMcr /egressAtmMcr:
+optional (not used, any value submitted will be ignored)
+
+Note that the VP sub layer only supports ServiceCategory = CBR and QoS = 1.
+
+Note! The performance monitoring counters in the AtmTrafficDescriptor MO is set to 0 (zero) at start or restart of the node.
+When the value is to large too fit in to a long (31bit) the counter turns over and starts from 0 again.
+</description>
+ <attribute name="AtmTrafficDescriptorId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>This MO's user label.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ingressAtmPcr">
+ <description>Ingress ATM Peak cell rate (cells/s).
+
+Only positive values are allowed. This attribute is only mandatory when serviceCategory is CBR or UBR_PLUS.
+
+Note! When 'serviceCategory' is set to UBR this attribute has no relevance and the value submitted is ignored by the system.
+
+Note! When 'serviceCategory' is set to UBR+ the value 0 (zero) means that shaping is not used. A value larger than the minimum desired cell rate enables shaping to the rate specified.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="ingressAtmQos">
+ <description>Ingress ATM quality of service.
+
+This attribute can be set to Class 1 and 2 if attribute serviceCategory is set to CBR.
+
+This attribute can be set to Class 3 if attribute serviceCategory is set to UBR+.
+
+This attribute can be set to Class 4 if attribute serviceCategory is set to UBR.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="AtmQos">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="egressAtmPcr">
+ <description>Egress ATM Peak cell rate (cells/s).
+
+Only positive values allowed.
+
+This attribute is only mandatory when serviceCategory is CBR or UBR_PLUS.
+
+Note! When 'serviceCategory' is set to UBR this attribute has no relevance and the value submitted is ignored by the system.
+
+Note! When 'serviceCategory' is set to UBR+ the value 0 (zero) means that shaping is not used. A value larger than the minimum desired cell rate enables shaping to the rate specified.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="egressAtmQos">
+ <description>Egress ATM quality of service.
+
+This attribute can be set to Class 1 and 2 if attribute serviceCategory is set to CBR.
+
+This attribute can be set to Class 3 if attribute serviceCategory is set to UBR+.
+
+This attribute can be set to Class 4 if attribute serviceCategory is set to UBR.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="AtmQos">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Sequence of Users that are using this AtmTrafficDescriptor.
+
+
+</description>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="egressAtmMcr">
+ <description>Egress ATM minimum desired cell rate.
+
+Only positive values allowed. The attribute is only mandatory when serviceCategory is UBR+.
+
+Note! When 'serviceCategory' is set to CBR or UBR this attribute has no relevance and the value submitted is ignored by the system.
+
+Note! This attribute cannot have a value larger than for 'egressAtmPcr'.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="ingressAtmMcr">
+ <description>Ingress minimum desired cell rate (cells/s).
+
+Only positive vaues allowed. This attribute is mandatory only when serviceCategory is UBR+.
+
+Note! When 'serviceCategory' is set to CBR or UBR this attribute has no relevance and the value submitted is ignored by the system.
+
+Note! This attribute cannot have a value larger than for 'ingressAtmPcr'.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="serviceCategory">
+ <description>The service category.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="ServiceCategory">
+ </enumRef>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mtp3bSrs">
+ <description>This MO represents/models a MTP3b Signalling Route Set.
+
+The performance monitoring counters found in Mtp3Srs MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is shutdown request from CLI (Cluster Interface).</description>
+ <attribute name="Mtp3bSrsId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the Mtp3bSrs MO.
+
+There are two possible states for the operationalState attribute:
+
+- enabled, the MO is partly or fully operational.
+- disabled, the MO is not operational.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The attribute is set by the local action Reserve.
+
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="autoReroute">
+ <description>This flag indicates Whether automatic rerouting is performed(true) or not(false), between IP and ATM/TDM
+routes when configuration is made. If set to 'false', it has to be done manually, for ex. by management actions(orders).
+
+Note! The attribute 'autoReroute' will always be set to 'false' regardless of value submitted. This attribute is to be removed in coming releases.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <boolean/>
+ </dataType>
+ </attribute>
+ <attribute name="destPointCode">
+ <description>The destPointCode attribute (destination point code, DPC) represents the point code of this Mtp3b SRS MO.
+The Destination Point Code in a Route Set has to be unique within each Signaling Point.
+
+Note! The format of destPointCode must correspond to the signallingPointCode format in the Mtp3bSp, i.e. ITU, ANSI, TTC or China.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>16777215</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="congestedLevel">
+ <description>There are two possible states for the congestedLevel attribute:
+
+- notCongested, no change in congestion level.
+- congested, change in congestion level has occurred.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bCongestLevel">
+ <defaultValue>notCongested</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDiscardedMsgFromBroadToNarrow">
+ <description>Performance management counter for number of messages discarded from broadband to narrowband.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTransferControlledRec">
+ <description>Performance monitoring counter for number of received Transfer Control (TFC) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTransferProhibitedRec">
+ <description>Performance monitoring counter for number of received Transfer Prohibited (TFP) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTransferAllowedRec">
+ <description>Performance monitoring counter for number of received Transfer Allowed (TFA) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <action name="routeSetTestAnyRoute">
+ <description>The route set test is only available for the Japanese Mtp3b, TTC.
+
+See JT-Q.707 for details.
+
+The test selects a route in the route set and tests it.
+
+Possible return codes are:
+
+0 : successful test
+48 : unsuccessful test
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <long/>
+ </returnType>
+ </action>
+ <action name="routeSetTestSpecificRoute">
+ <description>The route set test is only available for the Japanese Mtp3b, TTC.
+
+See JT-Q.707 for details.
+
+The test tests the specified route.
+
+Possible return codes are:
+
+0 : successful test
+48 : unsuccessful test
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <long/>
+ </returnType>
+ <parameter name="routeId">
+ <in/>
+ <dataType>
+ <moRef name="Mtp3bSr"/>
+ </dataType>
+ </parameter>
+ </action>
+ </class>
+
+ <class name="PlugInUnit">
+ <description>This MO is used to represent a plug-in-unit, that is a board inserted in a slot in a subrack.
+
+Note! Before deleting the PlugInUnit MO, administrativeState must be set to locked.</description>
+ <attribute name="PlugInUnitId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>A free tag that a user can associated to the this managed object. The value has no relevance for the managed system.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state of the PlugInUnit.
+
+The possibility to rollback the setting of this attribute is limited.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state is set to 'enabled' when the plug-in-unit has loaded and started its 'Basic' load module.</description>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="productType">
+ <description>This attribute describes the product type and is always set to the value "HW".</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>"HW"</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="piuType">
+ <description>A reference to an available PiuType at create of a PIU.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="PiuType"/>
+ </dataType>
+ </attribute>
+ <attribute name="piuGroupNumber">
+ <description>Indicates which restart group the plug-in unit belongs to.
+Such a group consists of a number of plug-in units where at least one must be enabled (working) or performing recovery. When all plug-in units in a group are out of function, the node is restarted.
+
+Must have a positive value.
+
+Zero indicates no group.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>65536</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled. It is a bit mapped CORBA long, where one or more of the bits may be set. If none of the bits are set then the availability status is considered to be undefined.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of managed objects depending on PlugInUnit</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="pmProcessorLoad">
+ <description>The measurement is done over 100 ms, and returns the sum of load on processes up to, and including process priority 23. The sum is expressed in %
+
+Supported on MP, BP and SP boards.
+
+In case of SP boards the returned processor load is the load of the BP.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="allowedSeqRestarts">
+ <description>The number of automatic (do not require intervention from a human operator) sequential restarts that are allowed for a PIU. When this number of automatic restarts has been exceeded, the automatic restarting halts and the PIU is faulty marked.
+
+The time limit between two restarts is 5 minutes. This means that if the time between two restarts
+is less then 5 minutes the restarts are counted, otherwise the restart counter is reset.
+
+For example, 3 means 3 restarts with time limit &lt; 5 minutes are accepted but when the 4:th occurs within 5 minutes the board is considered faulty and an alarm is generated.</description>
+ <dataType>
+ <enumRef name="SeqRestarts">
+ <defaultValue>RESTARTS_WITH_WARM</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <action name="restart">
+ <description>
+Note! The restartCause can have the following values:
+1 = restart error
+2 = restart upgrade
+
+Note! The restartCause piuRestartUpgrade overrides the restartRank value and gives mainly restartRank=warm (or restartRank=refresh in some upgrade situations.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="restartRank">
+ <in/>
+ <dataType>
+ <enumRef name="RestartRank">
+ </enumRef>
+ </dataType>
+ </parameter>
+ <parameter name="restartCause">
+ <in/>
+ <dataType>
+ <enumRef name="RestartCause">
+ </enumRef>
+ </dataType>
+ </parameter>
+ <raisesException name="ValueOutOfRangeException"/>
+ <raisesException name="FroNotAccessibleException"/>
+ </action>
+ </class>
+
+ <class name="Mtp3bSls">
+ <description>This MO represents the SS7 Signalling Link Set as defined in Recommendation Q.704 Ver. 3, April 28 1992 (ITU) T1.111-1996 (ANSI), JT-Q.704 Ver. 3, April 28 1992 (TTC) or GF001-9001 1990 (China).
+
+It provides information about a set of signalling links between an OPC/Adjacent PC pair. A link set is constructed from between 1 to16 Signalling Links (for China, Itu, Ttc and the ANSI standard), all of which have the same two end points (signalling points) as the Signalling Link Set. A Signalling LInk Set may be part of many routes.</description>
+ <attribute name="Mtp3bSlsId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Use label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the MTP3B SLS.
+
+The operability of the MTP3B SLS is described by the operationalState attribute which has two possible values:
+
+- Enabled: The MTP3B SLS is partly or fully operable and available for use. At least one of the belonging links (SL) is enabled.
+- Disabled: The MTP3B SLS is totally inoperable and unable to provide service to the user.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="usageState">
+ <description>The usageState reflects the usage state of the links in the link set. There are three possible values:
+
+- Active: At least one of the belonging SLs of the SLS is Active and no link is Busy.
+- Busy: If one of the belonging links is Busy.
+- Idle: All SLs of the SLS are Unavailable.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bUsageState">
+ <defaultValue>IDLE</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="periodicLinkTestFlag">
+ <description>The periodicLinkTestFlag indicates if periodic sending of SLTM/SLTA messages are used or not. The SLTM message will be sent on every link which is "aligned" at an interval of (SLTM timer). The answer, SLTA is supposed to arrive within (SLTA timer). If this doesnt happen, or if the received SLTA doesnt match the sent SLTM a second SLTM will be sent. If this SLTM also fail then the link will be considered 'out-of-service' and a restart of that link will begin.
+
+ANSI: true is default.
+ITU: true is default.
+China: true is default.
+TTC: false is default.
+
+Note that TTC does not use this feature.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="mtp3bSrsId">
+ <description>The mtp3bSrsId attribute points out the corresponding MTP3b Signalling Route Set MO (adjacentDPC).</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Mtp3bSrs"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="Mtp3bSr"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <action name="deactivateLinkSet">
+ <description>This action deactivates a link set, which means the containing signalling links are taken out of service.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ <raisesException name="FroNotAccessibleException"/>
+ </action>
+ <action name="activateLinkSet">
+ <description>A linkset containing signalling links which are all out of service, is called a deactivated linkset. In order to start up the signalling links and get them into service, there is an Activate Link Set action, or rather, there are two similar actions for activation of a link set.
+
+If the action fails to activate a link the ActivationFailed exception is raised.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ <raisesException name="FroNotAccessibleException"/>
+ </action>
+ <action name="emergencyActivateLinkSet">
+ <description>This action activates the signalling link with emergency alignment.
+It will also set autoStartLink = true
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ <raisesException name="FroNotAccessibleException"/>
+ </action>
+ </class>
+
+ <class name="Mtp3bSr">
+ <description>This MO represents a MTP3b Signalling Route. A Signalling Route is used to convey MTP3b User messages from a origin SP to a destination SP (Signalling Point). This MO is multiple instansiated and is contained in the MO MTP3b Signalling Route Set. A Signalling Route is from a network point of view the sequence of link sets from a originating signalling point to a destination signalling point.
+
+Note! At least one signalling route in the signalling route set must have priority = 1.
+If lower priorities are defined the next level must be priority=2. (e.g. routes with priority =1 and =3 in a route set will not work).
+
+Note! Signalling Routes belonging to the same route set with the same priority must have the same type of bearer (Broad Band or Narrow Band).</description>
+ <attribute name="Mtp3bSrId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="linkSetM3uId">
+ <description>The MTP3b Signalling Link Set (MTP3bSls) or M3uAssociation to which the MTP3bSr MO is connected.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Operational state notification.There are two possible states for the operationalState attribute:
+- enabled, possible to perform operations on the MTP3b SR.
+- disabled, not possible to perform operations on the MTP3b SR.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="usageState">
+ <description>There are three possible states for the usageState attribute:
+
+-active, route is active.
+-busy, route is congested.
+-idle, route not in use.
+
+(idle=0, active=1, busy=2)
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bUsageState">
+ <defaultValue>IDLE</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="priority">
+ <description>The priority of the alternative route. The traffic is directed to the highest priority route(s) available in the route set. If more than one route has the same priority within a route set then loadsharing is permitted between these routes.
+The value 1 is considered as the highest priority.</description>
+ <mandatory/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>5</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="routeType">
+ <description>The type of the route.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="Mtp3bRouteType">
+ <defaultValue>TDM_ATM</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="RouteBlockingState">
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="RouteState">
+ <defaultValue>NOT_BLOCKED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSecondsAccumulatedRouteUnavailable">
+ <description>The number of seconds (accumulated) route unavailable.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <action name="blockSignalingRoute">
+ <description>This action blocks the Signaling Route.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="deBlockSignalingRoute">
+ <description>This action deblocks the Signaling Route.
+
+Note! This action requires antransaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ </class>
+
+ <class name="IpSystem">
+ <description>The IP System MO constitutes the top structure level for IP related MOs in a Cello node.
+
+The IpSystem MO is automatically created and cannot be deleted.
+
+The local distinguished name of this MO is ManagedElement=1, IpSystem=1.
+</description>
+ <systemCreated/>
+ <attribute name="userLabel">
+ <description>An operator defined label.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="IpSystemId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="ping">
+ <description>Ping - used to call a host or router to find out if it is present in the network. The following input parameter is used by the Ping action:
+The domain name or IP address to the host that shall be called.
+
+The following parameter is returned:
+Ping result: 'IP address/domain name' - is alive or no answer.
+
+Note! This action requires a transaction.
+</description>
+ <returnType>
+ <string/>
+ </returnType>
+ <parameter name="host">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="traceRoute">
+ <description>Trace route - used to get information about the route through the IP network that is used for a destination with a specific IP address.
+
+The following input parameter is used by the trace route action:
+The domain name or IP address to a host that shall be trace-routed.
+
+The following parameter is returned:
+Trace result - list of IP addresses/domain names or path not found.
+
+Note! This action requires a transaction.
+</description>
+ <returnType>
+ <string/>
+ </returnType>
+ <parameter name="host">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ </action>
+ </class>
+
+ <class name="IpAtmLink">
+ <description>This MO represents an Internet Protocol over ATM link. LLC/SNAP encapsulated packets over Atm Adaptation Layer 5, AAL5, ATM PVCs are used.
+
+Note: The performance monitoring counters in the IpAtmLink MO has a "Wrap-around time" of approximately 2 hours.
+
+Note! When setting the 'fromUserMaxSduSize' and 'toUserMaxSduSize' on the Aal5TpVccTp MO the defined SduSize should be 8 bytes larger then the 'mtuSize' on the IpAtmLink.
+
+Note! Only Aal5TpVccTp's that terminates on an MP (Main Processor) may be used when setting up IpAtmLink's.</description>
+ <attribute name="IpAtmLinkId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>The User Label attribute gives the operator the possibility to label the links.
+</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the IP over ATM link is dependent of the operational states of the underlying AAL5 termination points that are used to transport IP datagrams. If at least one operational AAL5 termination point (MO: AAL5 TP VCC TP) exists, the operational state of the IP over ATM Link is set to "ENABLED"</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled. It is a bit mapped CORBA long, where one or more of the bits may be set. If none of the bits are set then the availability status is considered to be undefined.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>If set, indicates that this IpAtmLink is reserved by the OspfInterface represented by this attribute.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="OspfInterface"/>
+ </dataType>
+ </attribute>
+ <attribute name="ipAddress">
+ <description>The input format used by the operator is four fields of digits, separated by a dot. Each field consists of three digits.
+
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="subnetMask">
+ <description>The attribute subnetMask states the subnet mask of the IP over ATM link (point to point link).
+
+The input format used by the operator is four fields of digits, separated by a dot. Each field consists of three digits.
+For a point to point link, the subnetmask 255.255.255.252 is very likely.
+
+Note! The subnet mask has to be contiguos. That is, it has the LSB's set to 0 (zero).
+
+Example:
+
+255.255.255.X
+
+Contiguous subnet mask:
+11111111.11111111.11111111.11111110 (X = 254)
+11111111.11111111.11111111.11111100 (X = 252)
+
+Not-contiguous subnet mask:
+11111111.11111111.11111111.11111010 (X = 250)
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="mtuSize">
+ <description>The attribute mtuSize states the maximum IP datagram size that may be sent on the IP over ATM link in bytes, without fragmentation. Recommended MTU size is 1500 bytes to prevent IP fragmentation.
+
+Note that the size of the IP datagram does not include the 8 Bytes added for the LLC/SNAP header before putting the IP datagram in AAL5 SDU.
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>576</min> <max>2040</max>
+ </range>
+ <defaultValue>1500</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="metric">
+ <description>The attribute metric states the metric "cost" of the IP over ATM link. The metric value is calculated as 10^8 /link bit speed.
+
+For example:
+Metric for 10 Mbps Ethernet = 10^8/10^7 = 10
+Metric for 100 Mbps Ethernet = 10^8/10^8 = 1</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>32767</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="monitor">
+ <description>This attribute indicates whether InvATMARP monitor is turned on or off.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="monitorInterval">
+ <description>The interval between sending monitor packets.
+Unit is seconds.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>60</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="monitorRetries">
+ <description>The number of retries when sending monitor packets.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>255</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="interfaceName">
+ <description>The interface name.
+
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="aal5TpVccTpSelectionMode">
+ <description>The selection mode for the Aal5TpVccTp's used by the IpAtmLink MO. Determines how the IpAtmLink MO selects the Aal5 termination points used.
+
+In case 'NO_PREFERENCE', 'LOCAL_MP_SELECT_VCC_AT_LINK_UP', LOCAL_MP_PEER_SELECTION_VCC' or 'LOCAL_MP_ACTIVE_RESELECTION' is selected the IpAtmLink MO will prefer Aal5TpVccTp on local MP (i.e. Aal5TpVccTp MOs executing on the same MP as the IpAtmLink), but other Aal5TpVccTp will be accepted if needed.
+
+In case 'ONLY_LOCAL_MP' is selected, the ipAtmLink (Inet Link) will consider Aal5TpVccTp residing on other MPs as a malfunction and discard the usage of them. No InvArp sending will be performed on them and all incomming trafic on them will be discarded. If no local Aal5TpVccTp exists the operational state of the link will be changed to disabled.
+
+ </description>
+ <dataType>
+ <enumRef name="Aal5TpSelectionModes">
+ <defaultValue>NO_PREFERENCE</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="Aal5TpVccTpIdList">
+ <description>References to MOs of type Aal5TpVccTp representing the underlying AAL5 termination points (of a AAL5 PVC:s) for the IP over Atm link.
+
+The operator gives a list of relative distinguished names of the Aal5TpVccTp MO's to be used by the IP over ATM link.
+An Aal5TpVccTp MO may only be specified once in the list.
+
+To change in the set of Aal5TpVccTp MO's related to the IP over ATM link the link has to be deleted and then created with the desired set of AAL5 TP.
+
+Note! Only Aal5TpVccTp's that terminates on an MP (Main Processor) may be used when setting up IpAtmLink's.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <sequence>
+ <moRef name="Aal5TpVccTp"/>
+ <length>4</length>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInUcastPkts">
+ <description>Performance monitoring counter for the number of input unicast packets deliverred to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInNUcastPkts">
+ <description>Performance monitoring counter for the number of input broadcast/multicast packets deliverred to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfOutUcastPkts">
+ <description>Performance monitoring counter for the number of out unicast packets deliverred to higher layer</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfOutNUcastPkts">
+ <description>Performance monitoring counter for the number of output broadcast/multicast packets deliverred to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInErrors">
+ <description>Performance monitoring counter for the number of input packets discarded due to any error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInDiscards">
+ <description>Performance monitoring counter for the number of input packets discarded due to resource limitations.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfifOutDiscards">
+ <description>Performance monitoring counter for the number of outbound packets discarded due to resource limitations.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <action name="assignIpAddress">
+ <description>This action sets the IP address and the subnet mask.
+
+The changing of the IP address with the operation assignIpAddress, it might cause an interruption of the communication between the node and the network management tool. If an incorrect or erroneous IP address is configured, the communication with the node might be lost until the node is restarted or the IP address is changed to the correct value.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="ipAddress">
+ <description>The input format used by the operator is four fields of digits, separated by a dot. Each field consists of three digits.</description>
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="subnetMask">
+ <description>The input format used by the operator is four fields of digits, separated by a dot. Each field consists of three digits.</description>
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ </action>
+ </class>
+
+ <class name="EthernetLink">
+ <description>The Ethernet Link MO represents the Internet Protocol over Ethernet link. There is only one Ethernet link MO per Cello node.
+
+The changing of the IP address with operation assignIpAddress might cause interruption of the communication if the network management tool is connected via the ethernet link.
+
+Note: The EthernetLink MO can not be deleted!
+
+Note: The performance monitoring counters in the EthernetLink MO has a "Wrap-around time" of approximately 2 hours.
+</description>
+ <attribute name="userLabel">
+ <description>The User Label attribute gives the operator the possibility to label the links.
+
+</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ipAddress">
+ <description>The attribute ipAddress states the IP address of the Ethernet link, it is also the IP address for the O&amp;M host..
+
+The input format used by the operator is four fields of digits, separated by a dot. Each field consists of three digits.
+It must not be a broadcast or multicast address.
+
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="subnetMask">
+ <description>The attribute subnetMask states the subnet mask of the Ethernet link.
+
+The input format used by the operator is four fields of digits, separated by a dot. Each field consists of three digits.
+
+Note! The subnet mask has to contiguos. That is, it has the LSB set to 0 (zero).
+
+Example:
+
+255.255.255.X
+
+Contiguous subnet mask:
+11111111.11111111.11111111.11111110 (X = 254)
+11111111.11111111.11111111.11111100 (X = 252)
+
+Not-contiguous subnet mask:
+11111111.11111111.11111111.11111010 (X = 250)
+
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="broadcastAddress">
+ <description>The input format used by the operator is four fields of digits, separated by a dot. Each field consists of three digits.</description>
+ <mandatory/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="mtuSize">
+ <description>The IP layer expects the Ethernet link to have an MTU size (maximum Ethernet frame size without fragmentization) of 1500 bytes.
+
+The value is always the default value.
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>1500</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="metric">
+ <description>The attribute metric states the metric of the Ethernet link. The metric value is calculated as 10^8/link bit speed.
+
+For example:
+Metric for 10 Mbps Ethernet = 10^8/10^7 = 10
+Metric for 100 Mbps Ethernet = 10^8/10^8 = 1</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>32767</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the Ethernet link is dependent of the operational states of the underlying MAU:s that represents the Ethernet transceiver function. If at least one operational MAU exists, the operational state of the Ethernet Link is set to "ENABLED"</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="interfaceName">
+ <description>The interface name.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="macAddress">
+ <description>The mac address is persistently stored in flash prom on the MP where the IP stack resides. It is stored there at manufacturing. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <long/>
+ <length>6</length>
+ <nonUnique/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>If set, indicates that this EthernetLink is reserved by the OspfInterface MAO represented by this attribute.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="OspfInterface"/>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="EthernetLinkId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInUcastPkts">
+ <description>Performance monitoring counter for the number of input unicast packets deliverred to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInNUcastPkts">
+ <description>Performance monitoring counter for the number of input broadcast/multicast packets deliverred to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfOutUcastPkts">
+ <description>Performance monitoring counter for the number of out unicast packets deliverred to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInErrors">
+ <description>Performance monitoring counter for the number of input packets discarded due to any error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInDiscards">
+ <description>Performance monitoring counter for the number of input packets discarded due to resource limitations.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfOutNUcastPkts">
+ <description>Performance monitoring counter for the number of output broadcast/multicast packets deliverred to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfifOutDiscards">
+ <description>Performance monitoring counter for the number of outbound packets discarded due to resource limitations.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <action name="assignIpAddress">
+ <description>This action sets the IP address and the subnet mask.
+
+The changing of the IP address with the operation assignIpAddress,
+causes an interruption of the communication between the node and
+the network management tool. If an incorrect or erroneous IP address
+is configured, the communication with the node might be lost until
+the node is restarted or the IP address is changed to the correct
+value.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="ipAddress">
+ <description>The input format used by the operator is four fields of digits, separated by a dot. Each field consists of three digits.</description>
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="subnetMask">
+ <description>The input format used by the operator is four fields of digits, separated by a dot. Each field consists of three digits.</description>
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ </action>
+ </class>
+
+ <class name="IpRoutingTable">
+ <description>This MO holds the IP routing table.
+
+The IpRoutingTable MO is automatically created when the Ip MO is created.
+The IpRoutingTable MO can not be created manually.
+The IpRoutingTable MO can not be deleted.
+</description>
+ <systemCreated/>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="indexOfDeletableStaticRoutes">
+ <description>This attribute gives the indexes for the static routes that are possible to delete by the operator.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="IpRoutingTableId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="addStaticRoute">
+ <description>Used to add a new static route to the routing table. It can be
+indicated if the static route should be redistributed by OSPF.
+When adding a static route with an ipaddress, which is not a subnet
+address, the ipaddress is recalculated to the corresponding subnet
+address, based on the ipaddress and the subnet mask. So when looking
+for this route using the action 'getRoutingTableEntry' it is in fact
+the recalculated ipaddress, that is displayed and not the ip address
+entered with addStaticRoute. This is an automatic correction.
+
+Note! If an attempt is made to add a static route with hopIpAddress starting with 0.0 an exception will be thrown.
+
+Note! This action requires a transaction.
+
+
+</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="ipAddress">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="subnetMask">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="hopIpAddress">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="routeMetric">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <parameter name="redistribute">
+ <in/>
+ <dataType>
+ <boolean/>
+ </dataType>
+ </parameter>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="listRoutes">
+ <description>List routes actions is used to list all routes in the routing table. It requires no input parameters.
+
+The output is a formatted string, indicating the number of routes in the table followed by route information for each of these routes.
+
+The number of routes in the table is found at the very start of the returned string. Immediately following this is the information on each route in the list in turn. The route information for each route begins with a new line character ("\n") and is followed by the following data items (in the order written below), which are separated from each other by a SPACE character:
+
+- Destination IP address
+- Destination Network mask
+- Next hop IP address/Interface index of connected networks in dot-decimal format
+- Route metric
+- Route type
+- Interface name
+- Redistribute
+- Active
+
+Note that the next hop ipaddress is not an ipaddress per se, it is the subnet on wich the host/router to route to resides.
+
+Below is an example list of routes that could be returned from this action:
+
+"\n123.123.123.123 234.234.234.234 0.0.0.7 10 13 LE0 FALSE active\n122.122.122.122 233.233.233.233 0.0.0.6 2 8 LE0 TRUE active\n132.132.132.132 243.243.243.243. 0.0.0.7 9 13 LE0 TRUE inactive"
+
+In this case, there are three routes in the routing table. The first route has destination IP address of 123.123.123.123, the second route has it set to 122.122.122.122, while finally the third has it set to 132.132.132.132.
+
+NOTE that the route types can be of the following types:
+
+INET_RTPROTO_OTHER 1
+INET_RTPROTO_LOCAL 2
+INET_RTPROTO_NETMGMT 3
+INET_RTPROTO_ICMP 4
+INET_RTPROTO_OSPF 13
+
+The types listed above also denote the origin of the routing entry.
+
+Note! This action does not require a transaction.
+</description>
+ <returnType>
+ <string/>
+ </returnType>
+ </action>
+ <action name="getRoutingTableEntry">
+ <description>Returns a RoutingTableEntry according to the specified index.
+
+Should be used with action 'numberOfRoutes' within a transaction. To refresh the routing table stored in the MO, invoke the action 'numberOfRoutes'.
+
+Precondition: 0 &lt;= index &lt;= numberOfRoutes() - 1
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <structRef name="RoutingTableEntry"/>
+ </returnType>
+ <parameter name="index">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="InvalidIndexException"/>
+ </action>
+ <action name="numberOfRoutes">
+ <description>Returns the number of entries in the routing table.
+
+Each time this action is invoked, the MO retrieves routing table information from the resource layer and then builds a new array of RoutingTable structs to store this information.
+
+This action along with getRoutingTableEntry(), which allows one to iterate through the array stored in the MO, should be used together with a transaction.</description>
+ <returnType>
+ <long/>
+ </returnType>
+ </action>
+ <action name="deleteStaticRoute">
+ <description>Removes the RoutingTableEntry submitted as a parameter from the Routing Table, if it is found in the table.
+
+Note that only static roues, previously added, can be deleted with this action.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="routingTableEntry">
+ <in/>
+ <dataType>
+ <structRef name="RoutingTableEntry"/>
+ </dataType>
+ </parameter>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ </class>
+
+ <class name="Ip">
+ <description>The Ip MO represents the IP protocol layer with IP forwarding functionality.
+
+Note: The performance monitoring counters in the Ip MO has a "Wrap-around time" of approximately 2 hours.
+
+</description>
+ <attribute name="IpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="workingMode">
+ <description>The workingMode of the IP MO controls if the IP stack in the node will work as a combined host/router (routerMode) or only as a host (hostMode).</description>
+ <mandatory/>
+ <dataType>
+ <enumRef name="WorkingMode">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="retransInterval">
+ <description>The retransmission interval. The units are seconds.
+Must be a value &gt; 0.</description>
+ <dataType>
+ <long>
+ <defaultValue>4</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="noOfRetrans">
+ <description>The number of retransmissions.
+Must be a value &gt; 0.</description>
+ <dataType>
+ <long>
+ <defaultValue>5</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="dnsServer">
+ <description>The Domain Name Server IP address.
+
+The IP address must be a Unicast IP address.
+</description>
+ <dataType>
+ <string>
+ <defaultValue>"127.0.0.1"</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="isRecursiveSearch">
+ <description>Holds information about how the DNS client wants the DNS server do the search for the IP address in the network . It can be either Recursive search or Non-recursive search.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="isSubDomainName">
+ <description>Holds information about whether to use subsets of the fully qualified domain name to reach the simple domain name. It can be either Use subsets of domain name or Not use subsets of domain name.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="isDefDomainName">
+ <description>Holds information about whether the default domain name is present. It can be Present or Not present.
+
+</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="defDomainName">
+ <description>Contains default domain name.
+If 'isDefDomainName' is set to 'true' the domain name found in this attribute is used by the DNS resolver and there is no need to submit the complete domain name. If the domain name is for example 'ws5741.uab.ericsson.se' then the default domain name would be '.uab.ericsson.se'. If 'isDefDomainName' is set to true the there is no need for using '.uab.ericsson.se'. If set to false then the complete domain name has to be used.
+A valid domain name consists of 1 or more labels separated by dots (".").
+Valid characters for a label shall be limited to letters 'a' - 'z', 'A' - 'Z', digits '0' - '9', the character '-' ("dash").
+Character case shall be preserved. Labels shall start with a letter. Total length of a label shall not exceed 255 characters.
+
+Note! The first and last character in the domain name has to be within the following alphabet: letters 'a' - 'z', 'A' - 'Z' and digits '0' - '9'. For more information refer to RFC 952 and 1101.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the IP MO is ENABLED if at least one link is operational.
+
+Shows whether the MO is OK (enabled) or failed (disabled). The values are set by the system.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="numberOfLinks">
+ <description>Represents the number of interfaces (Ethernet and IP over
+ATM links) which has registered to the IP MO.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>If set, indicates that this Ip is reserved by the Ospf represented by this attribute.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Ospf"/>
+ </dataType>
+ </attribute>
+ <attribute name="useHostFile">
+ <description>Indicates if the hosts file should be used or not. The hostFile is used by the resolver and
+chosen as a source of information before querying a DNS server.
+
+true - use the host file.
+false - do not use the host file.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="dscp">
+ <description>The DiffServ CodePoint.
+The code point values are used by DiffServ enabled hosts and router to identify different service levels.
+When set, the DSCPs are mapped to PHBs (Per Hop Behaviours) by forwarding devices along the path
+between the source and destination. PHBs dictates how each packet will be handled i.e. what type of
+service that is applied to the packet when it is forwarded.
+
+Note! Only traffic originated from the node is tagged with the dscp value. The Cello router does not implement functionality for handling different service levels when routing IP traffic.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>63</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="icmpRedirect">
+ <description>Indicates if ICMP redirects is sent out or not.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="udpChecksumState">
+ <description>Enable/Disable generation of UDP checksum.
+0 = disabled
+1 = enabled
+
+The UDP checksum is used for verifying that the UDP header has not been damaged during transmit.</description>
+ <dataType>
+ <long>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="connectionAttemptTimer">
+ <description>The time that elapses before a connection (TCP) attempt times out.
+
+Unit is seconds.</description>
+ <dataType>
+ <long>
+ <defaultValue>75</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxRetransmissionAttempts">
+ <description>The maximum number of retransmission attempts before a TCP connection is dropped.
+The default value is 10 attempts, which is around 5 minutes.
+Setting this attribute value to -1 means infinity, and TCP will never give up in trying
+to establish a connection.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>-1</min>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIpInReceives">
+ <description>Performance monitoring counter for total number of datagrams received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfHdrErrors">
+ <description>Performance monitoring counter for the number of datagrams discarded due to format error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIpAddrErrors">
+ <description>Performance monitoring counter for the number of datagrams discarded due to misdelivery.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIpForwDatagrams">
+ <description>Performance monitoring counter for the number of datagrams forwarded.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIpInDiscards">
+ <description>Performance monitoring counter for the number of datagrams dascarded due to resource limitations.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIpOutDiscards">
+ <description>Performance monitoring counter for the number of datagrams discarded due to lack of resources.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIpReasmReqds">
+ <description>Performance monitoring counter for the number of fragments received needing reassembly.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIpReasmOKs">
+ <description>Performance monitoring counter for the number of datagrams successfully reassembled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="SccpEntitySet">
+ <description>This MO represents an SCCP EntitySet which is made of one SCCP Entity. An SCCP Entity is a local MTP-SAP + a DPC + possibly an SSN, i.e an SCCP EntitySet identifies the set of access points that result from a global title translation. An SCCP EntitySet may also be made of two SCCP Entities of the same type (if an SSN is present in one SCCP Entity, then an SSN shall also be present in the other). In the latter case the two SCCP entities may be considered either as a "primary" SCCP Entity and a "backup" SCCP Entity (dupli-dominant mode) or may be interpreted as two equal SCCP entities that can be used for outgoing loadsharing purpose. In this implementation they can only be considered as "primary" and "backup".The Routing Indicator (RI) in the Called Party Address is normally not set by the SCCP for outgoing messages and should therefore be set by the user. This means that if the user has set "Route on SSN" this will be the case after the GTT also even if the set consist of MTP-3b Access Points. However, if the set consists of SCCP Access Points the RI is implicitly set to "Route on SSN" by SCCP.
+
+DPC Destination Point Code
+GTT Global Title Translation
+MTP Message Transfer Part
+SAP Signalling Access Point
+SSN Subsystem Number
+
+Note: the SccpEntitySet MO depends either on MAOs of type SccpApLocal OR SccpApRemote, not on a mixture of these MAO types.</description>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="routeIds">
+ <description>The Entity Set routeId is an array of maximum two instances of Sccp ApLocal MO's OR two instances of SccpApRemote MO's OR two instances of Mtp3bAp MO's OR one instance of SccpSP MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ <length>2</length>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="sharingMode">
+ <description>The sharingMode attribute controls the distribution of SCCP traffic over the entities (Access Points) in the set.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="SharingMode">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="newSubSystemNumber">
+ <description>The new sub system number attribute is only valid if the Mtp3b Access Points are used in the set. In that case the SSN attribute allows to optionally set the subsystem number in the Called Party Address as a result of a Global Title Translation. If the set consists of SCCP Access Points the subsystem number in the Called Party Address is always implicitly set to the SCCP Access Point SAP (SSN) as a result of a Global Title Translation.
+This attribute is controlled by the type of AP(s) that the EntitySet refers to.
+
+The default value 0 means no new subsystem number.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>254</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="newGlobalTitle">
+ <description>The New Global Title attribute allows to optionally replace the global title in the Called Party Address as a result of a Global Title Translation (GTT). If the GT resulting from a GTT is different from the GT previously included in the Called Party Address, the newly produced GT replaces the existing one. The gtIndicator attribute is read-only and is derived from the combination of Nature Of Address, the Translation Type and Numbering Plan used.
+
+Default value is considered as no new Global Title.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="GlobalTitleData"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Holds a list of the reserving MO's.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="SccpEntitySetId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="SccpGlobalTitle">
+ <description>The SCCP Global Title MO represents a combination of a global title translator and a global title rule. If no Destination Point Code (DPC) is present in the Called Party Address, a Global Title (GT) is needed. Then a global title must be present in the Called Party Address, otherwise a routing error occurs. A global title translator is selected by SCCP based on a combination of the values of the Nature Of Address (NA), the translation type (TT), and the Numbering Plan (NP) if available, in this MO matched with the same information in the Called Party Address provided by an SCCP user. A global title translation rule is selected by SCCP by matching the Global Title Address Information and possibly the Encoding Scheme in this MO, with the same information in the Called Party Address provided by an SCCP user. A global title translation rule points to the SCCP Entity Set resulting from the global title translation (GTT).
+The translation results in a DPC and possibly a new Sub System Number (SSN) or GT or both (decided by the SCCP Entity Set it refers to). If the GT and/or SSN resulting from a GTT is different from the GT and/or SSN previously included in the Called Party Address, the newly produced GT and/or SSN replaces the existing one.
+
+GT - Global Title
+SCCP - Signalling Connection Control Part
+SSN - Sub System Number
+DPC - Destination Point Code
+TT - Translation Type
+GTT - Global Title Translation</description>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="gtIndicator">
+ <description>Global title indicator for China, ITU, TTC and ANSI.
+
+
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="GlobalTitleIndicator">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="natureOfAddress">
+ <description>Indicates number type, i.e. national or international number.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="NatureOfAddress">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="numberingPlan">
+ <description>Indicates which numbering plan that is used.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="NumberingPlan">
+ <defaultValue>UNKNOWN</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="translationType">
+ <description>Used to direct the message to the appropriate Global Title translation function.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>254</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="addressInformation">
+ <description>Digit string of 1-37 digits, where each digit is 0-9, and "B", "C". "B" and "C" are for Code 11 and Code 12.
+The addressInformation may also contain wild card symbols: "*" or "?". Wild cards are only allowed for defining Global Title Translations, they are not allowed for specifying SCCP SAPs (built with SPC and Global Title or SPC + SSN + Global Title).</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>1</min> <max>37</max>
+ </lengthRange>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="encodingScheme">
+ <description>Indicates if the number of address signals are an odd or even number.
+
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="EncodingScheme">
+ <defaultValue>UNKNOWN</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="sccpEntitySetId">
+ <description>The sccpEntitySetId attribute points out the corresponding SccpEntitySet MO.
+
+Note! This attribute is only optional if this MO is used by Policing. In all other cases it has to be set.</description>
+ <noNotification/>
+ <dataType>
+ <moRef name="SccpEntitySet"/>
+ </dataType>
+ </attribute>
+ <attribute name="SccpGlobalTitleId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Aal2PathVccTp">
+ <description>This MO is used to represent an AAL2 Path, i.e. an ATM VC connection that carries multiplexed AAL2 links.
+
+VCC TP - Virtual Channel Connection Termination Point.
+
+The total number of Aal2PathVccTps associated to an Aal2Ap, by connecting them to Aal2PathDistributionUnits under that Aal2Ap, must not exceed 632.
+
+The total number of Aal2PathVccTps associated to a ReliableProgramUniter, by connecting them to Aal2PathDistributionUnits associated to the ReliableProgramUniter, must not exceed 280.
+
+Note! The performance monitoring counters in this MO is set to 0 when counterMode is set to PM_MODE_ON.
+In PM_MODE_OFF no information at all is retrived. So any value for pm-monitoring is measured from the time of setting counterMode to PM_MODE_ON.
+At node restart these performance monitoring counters is reset to 0.
+</description>
+ <attribute name="Aal2PathVccTpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="vclTpId">
+ <description>Reference to the VclTp to be used by this Aal2PathVccTp.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="VclTp"/>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state of the termination point. </description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>unlocked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Operational state of the termination point.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving Aal2PathDistribution MO.
+
+</description>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status of Aal2PathVccTp.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="continuityCheck">
+ <description>Continuitiy checking means that a cell is sent downstream when no user cell has been sent for a period of nominally 1 second.
+
+Activates VC end to end continuityCheck according to ITU.T rec I.610.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="counterMode">
+ <description>PM mode is set to indicate type of performance monitoring mode (ie. activation of bidirectional PM measurements).
+
+</description>
+ <dataType>
+ <enumRef name="AtmCounterMode">
+ <defaultValue>PM_MODE_OFF</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="nomPmBlocksize">
+ <description>Nominal performance monitoring (PM) blocksize. The minimum number of ATM cells to send before sending a Forward Performance Monitoring, FPM, cell.</description>
+ <dataType>
+ <enumRef name="AtmNomPmBlkSize">
+ <defaultValue>NOM_PM_BLKSIZE_2_10</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="timerCu">
+ <description>Timer that assures that CPS-packets with one or more octets already packed in the ATM cell wait at most the duration of timerCu before being scheduled for transmission.
+
+Units for timerCu is 10 to the power of -4 seconds. This value can be set in steps of 10 to the power of -4.
+
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="aal2PathId">
+ <description>This attribute is used to identify the path in the Q.2630.1 protocol.
+
+The pathId value must be unique within all Aal2PathDistributionUnits under the same Aal2Ap
+
+All integers &gt; 0 are allowed (not 0).
+
+The Aal2PathId is used by the Aal2 connection control function in two Aal2 nodes to uniquely identify an AAL2 path between the two nodes. This means that the value of the attribute Aal2PathId for an Aal2 path must be the same in each of the two nodes.
+
+In order to set this attribute, the Aal2PathVccTp may not be reserved. If an attempt is made, an "IsReservedCanNotSetPathId" exception is thrown.
+
+Note! Setting of this attribute will not have any effect until 'actionAddPath' in Aal2PathDistributionUnit MO' is called adding this MO to the list of Aal2PathVccTp MO's.</description>
+ <mandatory/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>2147483647</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="aal2PathOwner">
+ <description>This attribute indicates whether this Aal2 Path VCC Termination Point is considered the owner of the Aal2 Path in order to decide channel selection procedure in the Q.2630.1 protocol.
+
+Note! In order to set this attribute, the Aal2PathVccTp may not be reserved. If an attempt is made, an "IsReservedCanNotSetPathId" exception is thrown.
+
+Note! The administrativeState has to be LOCKED when this attribute is set, if not the "IsUnlockedCanNotSetPathOwner" exception is thrown.
+
+Note! Setting of this attribute will not have any effect until 'actionAddPath' in Aal2PathDistributionUnit MO' is called adding this MO to the list of Aal2PathVccTp MO's.</description>
+ <mandatory/>
+ <dataType>
+ <boolean/>
+ </dataType>
+ </attribute>
+ <attribute name="alarmReport">
+ <description>Attribute to decide what type of alarms to be reported.</description>
+ <dataType>
+ <enumRef name="AlarmReport">
+ <defaultValue>ALARM_LOC</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="aal2QoSProfileId">
+ <description>The identity of the QosProfile used by the Aal2PathVccTp.</description>
+ <mandatory/>
+ <dataType>
+ <moRef name="Aal2QosProfile"/>
+ </dataType>
+ </attribute>
+ <attribute name="aal2QoSAvailableProfiles">
+ <description>This attribute specifies which QoSClass that can be supported by this Aal2Path.
+</description>
+ <dataType>
+ <enumRef name="SupportedQoSClasses">
+ <defaultValue>CLASS_A_B_C_D</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwLostCells">
+ <description>Performance monitoring counter for forwarded lost cells.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwMissinsCells">
+ <description>Performance monitoring counter for number of forwarded missinserted cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwErrBlocks">
+ <description>Performance monitoring counter for number of forwarded errored blocks.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLostFpmCells">
+ <description>Performance monitoring counter for number of lost Forward Performance Monitoring, FPM cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwLostCells">
+ <description>Performance monitoring counter for number of lost backward cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwMissinsCells">
+ <description>Performance monitoring counter for number of backward missinserted cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwErrBlocks">
+ <description>Performance monitoring counter for number of backward errored blocks.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLostBrCells">
+ <description>Performance monitoring counter for number of lost Backward Reporting, BR, cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Aal2RoutingCase">
+ <description>This MO represents a AAL2 routing case which points out an AAL2 access point. </description>
+ <attribute name="Aal2RoutingCaseId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>For free use</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="routeList">
+ <description>An array of alternative routes identified by the concerned Aal2Ap MOs. A routeList can have 0 to 5 Aal2Aps.
+The Aal2Ap must be unique.
+Note! if this attribute is set, the routePriorityList also must be se with the same number of values ( if the routeList
+contains 3 routes, the routePriorityList must contain 3 prioritys).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <restricted/>
+ <dataType>
+ <sequence>
+ <moRef name="Aal2Ap"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="routePriorityList">
+ <description>A list of all the Aal2Ap priorities.
+The priority values can be in the range 1 to 5, one beeing the highest priority.
+The Aal2Aps can have the same priorities.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <restricted/>
+ <dataType>
+ <sequence>
+ <long>
+ <range>
+ <min>0</min> <max>5</max>
+ </range>
+ </long>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="numberDirection">
+ <description>Defines the possible set of AAL type 2 Service Endpoint Addresses (A2EA) that match the routing case.
+
+The number direction of a routing case shall be interpreted as all AAL type 2 Service Endpoint Addresses
+starting with the string of numbers defined in the number direction. For example, the AAL2 End System
+Addresses "12340" and "123400" will both match the number direction "1234".
+
+The AAL2 routing function uses a longest match comparison to select between routing cases with overlapping
+number directions. For example, given two routing cases A with the number direction "1234" and B with the number
+direction "12345" the AAL2 End System Address "12345" will be routed using routing case B, whereas the AAL
+type 2 Service Endpoint Addresses "12344" and "12346" will be routed using routing case A.
+
+NOTE: It is not allowed to use leading zeros when configuring this attribute.
+
+NOTE: It is not possible to replace an existing routing case by creating routing cases with number directions that
+completely overlap the number direction of the existing routing case.
+
+NOTE: It is not possible to create two routing cases with the exact same number directions in a node.
+
+NOTE: It is possible to create one or more routing cases with number directions that partially overlap the number
+direction of an existing routing case.
+
+Length range 1..15
+Alphabet: "0123456789"
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>1</min> <max>15</max>
+ </lengthRange>
+ </string>
+ </dataType>
+ </attribute>
+ <action name="addAal2ApToRc">
+ <description>Adds the identified (and existing) Aal2Ap MO to the routeList. This action should also be used when changing the priority for an existing Aal2Ap MO. When submitting an existing Aal2Ap MO with a new priority the routing list will be updated with the new priority for the specified Aal2Ap MO.
+
+Note! In order to be able to update the priority for a routing entry, the routing entry first has to be deleted and then submitted with the new priority.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="priority">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <parameter name="route">
+ <in/>
+ <dataType>
+ <moRef name="Aal2Ap"/>
+ </dataType>
+ </parameter>
+ <raisesException name="InvalidPriorityException"/>
+ <raisesException name="IllegalArgumentTypeException"/>
+ <raisesException name="IllegalAttributeValueException"/>
+ </action>
+ <action name="removeAal2ApFromRc">
+ <description>Removes the identified Aal2Ap MO from the routeList.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="route">
+ <in/>
+ <dataType>
+ <moRef name="Aal2Ap"/>
+ </dataType>
+ </parameter>
+ <raisesException name="IllegalAttributeValueException"/>
+ <raisesException name="IllegalArgumentTypeException"/>
+ </action>
+ </class>
+
+ <class name="Aal2Sp">
+ <description>The Aal2Sp (AAL2 Signalling Point) MO is used to represent the AAL type 2 Service Endpoint Address of the node in the AAL2 network.
+There is one and only one instance of this MO in the ATM NE system.</description>
+ <attribute name="userLabel">
+ <description>For free use</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="a2ea">
+ <description>An E.164 format number that specifies the AAL type 2 Service Endpoint Address of the node.
+
+Length Range: 1..15
+Alphabet: "0123456789"
+
+Note! It is not allowed to use leading zeros when configuring this attribute.</description>
+ <mandatory/>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>1</min> <max>15</max>
+ </lengthRange>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="Aal2SpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="pmUnsuccessfulConnsInternal">
+ <description>Performance monitoring counter for the number of unsuccessful attempts to establish connections due to node internal problems.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Aal2Ap">
+ <description>This MO represents a AAL2 Access Point signalling function associated with a single AAL2 signalling relationship to a remote peer AAL2 acess point signalling function. An AAL2 access point is either a high rate access point that uses MTP-3B for signalling or a low rate access point that uses UNI-SAAL for signalling.
+
+Aal2Ap - Aal2 Access Point
+
+Note! The performance monitoring counters in the AalAp MO is set to 0 (zero) at start or restart of the node.
+When the value is to large too fit in to a long (31bit) the counter turns over and starts from 0 again.</description>
+ <attribute name="Aal2ApId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Free for use</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>This attribute holds a list of the reserving MOs.
+</description>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Operational state of the AAL2 AP.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status of the Aal2Ap.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="timerErq">
+ <description>Q.2630.2 establishment request timer. Unit is milli seconds.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>5000</min> <max>30000</max>
+ </range>
+ <defaultValue>5000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="timerRel">
+ <description>Q.2630.2 release request timer. Unit is milli seconds.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>2000</min> <max>60000</max>
+ </range>
+ <defaultValue>2000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="sigLinkId">
+ <description>Reference to a UniSaalTp or Mtp3bAp MO that provides a signalling link for the Aal2Ap.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="secondarySigLinkId">
+ <description>Reference to a secondary signalling link MO of type UniSaalTp. This attribute can only be set when sigLinkId is of type UniSaalTp.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="rpuId">
+ <description>The physical location of an AP (Access Point) LR/HR (Low Rate/ High Rate) program represented by a reference to a RPU (ReliableProgramUniter) MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ReliableProgramUniter"/>
+ </dataType>
+ </attribute>
+ <attribute name="aal2QoSCodePointProfileId">
+ <description>The identity of the QoSCodePointProfile used by this MO.</description>
+ <dataType>
+ <moRef name="Aal2QosCodePointProfile"/>
+ </dataType>
+ </attribute>
+ <attribute name="pmExisOrigConns">
+ <description>Performance monitoring counter pmExisOrigConns.
+Number of existing connections for the AP originating in this node.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="nrOfConfiguredAal2Paths">
+ <description>The total number of Aal2PathVccTp MOs configured on this Aal2 Ap.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="nrOfUnavailableAal2Paths">
+ <description>The total number of unavailable Aal2PathVccTp's on this Aal2 Ap, i.e. the number of Aal2PathVccTp MOs connectected to this Aal2Ap with 'administrativeState' LOCKED.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmExisTermConns">
+ <description>Performance monitoring counter pmExisTermConns.
+Number of existing connections for the AP terminating in this node.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmExisTransConns">
+ <description>Performance monitoring counter pmExisTransConns.
+Number of existing connections for the AP transiting in this node.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSuccOutConnsRemote">
+ <description>Performance monitoring counter pmSuccOutConnsRemote.
+Number of successful establishment of outgoing connections on this AP</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSuccInConnsRemote">
+ <description>Performance monitoring counter pmSuccInConnsRemote.
+Number of successful establishment of incoming connections on this AP.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUnSuccInConnsRemote">
+ <description>Performance monitoring counter pmUnSuccInConnsRemote.
+
+Number of unsuccessful establishment of incoming connections on this AP caused by reject from beyond this node.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUnSuccOutConnsRemote">
+ <description>Performance monitoring counter pmUnSuccOutConnsRemote.
+
+Number of unsuccessful establishment of outgoing connections on this AP caused by reject from remote side, reset from remote side, no reply or signalling link failure.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUnSuccInConnsLocal">
+ <description>Performance monitoring counter pmUnSuccInConnsLocal.
+Number of unsuccessful attempts to allocate Common Part Sublayer, CPS, resources during establishment of incoming connections on this AP caused by Channel Identifier, CID, and/or bandwidth collision or mismatch of Call Admission Control, CAC, between peers.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUnSuccOutConnsLocal">
+ <description>Performance monitoring counter pmUnSuccOutConnsLocal.
+
+Number of unsuccessful attempts to allocate CPS resources during establishment of outgoing connections on this AP. Caused by rejects in CAC (Connections Admission Control).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUnRecMessages">
+ <description>Performance monitoring counter pmUnRecMessages.
+
+Number of received unrecognized Q.2630.1 messages on this AP.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUnRecParams">
+ <description>Performance monitoring counter pmUnRecParams.
+
+Number of received Q.2630.1 messages with unrecognized parameters on this AP.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Etm1">
+ <description>This MO represents the hardware of the ET-M1 board type. It only represents the ET specific hardware, while the DBM module of the board is represented by the PlugInUnit MO.
+
+The ET-M1 board contains 8 physical ports that can be configured as either E1 (ETSI), J1 (TTC) or T1(ANSI). The board does not allow for a mix of E1, J1 and T1 ports, thus all configured ports on the board must be configured to the same standard.
+
+Each of the ports on the ET-M1 board can be used to carry either ATM traffic or circuit orientated (Nx64 Kbits/s connections) traffic.
+
+Each port can support up to 30 ATM VC connections. Two of these connections are reserved for AAL2 paths, and therefore two AAL2 multiplexers per port are available.
+
+Each port can support up to 2 VP connections.
+
+The ET-M1 board supports 1 bidirectional F4/F5 PM flow per port.
+
+Other restrictions:
+- All ports (configured for ATM) on the board must have the same value for the hecCorrection attribute (ATM Port MO).
+- It is possible to configure UBR+ traffic, but there is no guarantee on the minimum cell rate.
+- VP shaping is not supported (it is recommended to configure at most one VP per physical port).
+- VC shaping is not supported with an exception for AAL2 path traffic. This is shaped to the peak bandwidth on the VC connection.
+- When using the Etm1 board the performance monitoring counters in the transmit direction found on the AtmPort MO does not show the following cells: CC cells and OAM FPM cells.
+
+Note! IMA is not applicable for the ETM1 board.
+
+Note! When using fractional atm, timeslot 1 must be a part of the fraction.
+
+Note! ETM1 does not support EPD and PPD
+
+Note! ETM1 does not have a proper buffer management. Thus fairness of UBR+ traffic can not be guaranteed and shaping on UBR+ traffic is not possible.
+
+Note! The number of VCC TP+VPC TP with performance monitoring enabled (i.e. PM mode &lt;&gt; off) is restricted to 1 per port.
+</description>
+ <attribute name="userLabel">
+ <description>user label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Enabled or disabled according to the actual operational state of the Etm1 board.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="Etm1Id">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="TuSyncRef">
+ <description>This MO is used to administer synchronization reference (a synchronization input with support for 2MHz and 10MHz signals) on Timing Unit board.</description>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Operational state of TU synchronization reference</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>Administrative state of TU synchronization reference</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status of the TuSyncRef.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>When the TU synchronization reference is registered in the system as an usable synchronization reference, this MO reference is set by using "local" operation syncReserve(). When synchronization reference is de registered, "local" operation syncRelease is used. Note that the only valid user of these operations is Synchronization MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Synchronization"/>
+ </dataType>
+ </attribute>
+ <attribute name="TuSyncRefId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Spm">
+ <description>The Special purpose Processor Module MO, Spm, represents one of the Special Purpose Processors and its connected hardware. This object is used for SW management and restart. Hardware failure indications are sent to Spu.
+
+Note! If the board is of type SPB1 the maximum number of Spm MO's that is possible to create under the Spu MO is 3.
+If the board is of type SPB2 the maximum number of Spm MO's that is possible to create under the Spu MO is 5.</description>
+ <attribute name="SpmId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>user label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the SPM</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="switchModuleNumber">
+ <description>Switch Module Number</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="asciPortNumber">
+ <description>ASCI Port Number</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="executionResourceNumber">
+ <description>The identity of the SPM on the Special purpose Processor Unit (SPU).
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="runningResourceIdList">
+ <description>The list of identities of running Spm's
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <long/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="installedResourceIdList">
+ <description>The list of identities of installed Spm's in the system.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <long/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="spLinkName">
+ <description>The uniqe name of the link between the SP and BP.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <action name="restart">
+ <description>Restarts the SP.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ </class>
+
+ <class name="Spu">
+ <description>The Special purpose Processor Unit MO, Spu, represents the board specific HW on SPB. This objects collects HW failure indications on the board and issues/ceases alarms.</description>
+ <attribute name="userLabel">
+ <description>user label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the SPB board.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="spLinkName">
+ <description>The special purpose processor link name.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="SpuId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="restart">
+ <description>Restarts all SPs on the board (but not the BP).
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroNotAccessibleException"/>
+ </action>
+ </class>
+
+ <class name="AtmCrossConnection">
+ <description>This MO is used to represent the point-to-point ATM cross-connect relationship between two VCL termination points.</description>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Operational state for the cross connection.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="vclTpAId">
+ <description>Identifies the VclTp managed object involved in the A side of the cross connection (which consists of an A and B side).
+
+Must not be the same as vclTpBId.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="VclTp"/>
+ </dataType>
+ </attribute>
+ <attribute name="vclTpBId">
+ <description>Identifies the VclTp managed object involved in the B side of the cross connection (which consists of an A and B side).
+
+Must not be the same as vclTpAId.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="VclTp"/>
+ </dataType>
+ </attribute>
+ <attribute name="AtmCrossConnectionId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="ConfigurationVersion">
+ <description>The Configuration Version, CV, is an MO managing all on disk saved node configuration. This MO keeps all administrative data about the CV's including path and file-names of the configuration files. There may be more than one CV on the disk but only one is used at the time. A CV is always based on one Upgrade Package.
+
+The local distinguished name of this MO is ManagedElement=1, SwManagement=1, ConfigurationVersion=1.</description>
+ <systemCreated/>
+ <attribute name="ConfigurationVersionId">
+ <description>Configuration version MO's id.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="storedConfigurationVersions">
+ <description>List of stored configuration versions in the node.
+
+Stored in and read from the file system.
+
+List of stored configuration versions (CV) in the node.
+
+The list is a sequence of CVs.
+Each CV is presented as structure. A CV structure has following fields:
+ 1. Name
+ 2. Identity
+ 3. Type
+ 4. UpgradePackageId
+ 5. Operator name
+ 6. Comment
+ 7. Date
+ 8. Status
+
+The CV list is formatted as a sequence of ConfigurationVersionAttributes.
+Each struct contains one CV.
+
+The following characters are allowed within the struct members below.
+
+[0-9], [A-Z], [a-z] and '&amp;' , '%' , ':' , '.' , '_' , '-'
+
+Note! For comment and operatorName spaces (' ') are also allowed within the strings.
+
+Struct element description :
+-Name is in string format, max length is 40.
+-Identity is in string format, max length is 40.
+-Type is in string format, max length is 40.
+-UpgradePackageId is in string format, max length is 40.
+-Operator name is in string format, max length is 40.
+-Comment is in string format, max length is 40.
+-Date is in string format, max length is 40. Format for date is: weekday month date hour:min:seconds year.
+-Status is in string format, max length is 40.
+
+Note! The identity can not be the same as name. Identity should contain the product identity.
+
+
+</description>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <structRef name="ConfigurationVersionAttributes"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="currentLoadedConfigurationVersion">
+ <description>The name of the current loaded configuration version.
+
+Stored in and read from the file system.
+
+This is the configuration version that the system started with, i.e. the configuration version that was startable at the last node restart. </description>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="startableConfigurationVersion">
+ <description>The name of the configuration version that will be used at next node restart.
+
+Stored in and read from the file system.
+
+This attribute is set by the action "setStartable( name of cv)".
+Also set at rollback by the system. The first CV in the rollback list is then used.</description>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="rollbackList">
+ <description>A list of configuration versions to rollback to (configuration version name).
+
+The configuration version on the first line is used at the next rollback. That line is then automatically removed from the rollback list.
+
+This attribute is modified by actions setFirstRollbackList() and removeFromRollbackList()</description>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="currentUpgradePackage">
+ <description>A reference to current executing upgrade package.</description>
+ <readOnly/>
+ <dataType>
+ <moRef name="UpgradePackage"/>
+ </dataType>
+ </attribute>
+ <attribute name="autoCreatedCVIsTurnedOn">
+ <description>Flag that indicates that a configuration version will be created automatically once a day.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="timeForAutoCreatedCV">
+ <description>Time for the automatic creation of configuration versions once a day.
+
+The string must be specified as "HH:MM" to be accepted at set.
+
+See also Class Attribute autoCreatedCVIsTurnedOn.
+The time is UTC time.
+
+Note! If changing the clock on the node, this attribute must be set or
+the JVM MP must be reastarted.
+
+
+</description>
+ <dataType>
+ <string>
+ <defaultValue>"04:00"</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="rollbackOn">
+ <description>Flag that indicates if rollback is enabled or not.
+When true the system will automatically set the rollback counter. In case of cyclic restarts a rollback will be issued after x restarts. x is defined by the rollbackInitCounterValue.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="rollbackInitTimerValue">
+ <description>Used by the system when rollback is switched on (autoRollbackOn=true). After the given time the node is considered not in a cyclic restart mode. The rollback counter will then be reset to its initial value (rollbackInitCounterValue).
+
+Timer value in minutes.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>10000</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="rollbackInitCounterValue">
+ <description>Initial value for the rollback counter. Used when rollback is switched on (autoRollbackOn=true).
+
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>10000</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="commandlogStatus">
+ <description>An attribute to indicate status of command log.
+It can be ON/OFF(true/false). </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="executingCv">
+ <description>The name of the executing Configuration Version, CV.
+
+Same as 'currentLoadedConfigurationVersion' after a node restart, changed to the value of lastCreatedCv when a CV is created.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="lastCreatedCv">
+ <description>The name of the last created Configuration Version, CV.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <action name="setStartable">
+ <description>The CV given will be the one used at the normal node restarts. Only A CV with status = OK can be set as startable.
+
+This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="configurationVersionName">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="create">
+ <description>A new CV directory will be created. A DB backup from the current RAM CV,
+an ARMAMENT file and the file LLP:LMid is created at the directory. The current
+command log file is copied to the CV directory first, then it removes the file from
+the current directory.
+
+Note: The file cmdlog.properties under /c/ will not be saved to the CV.
+
+The following characters are allowed in the Strings:
+
+[0-9], [A-Z], [a-z] and '&amp;' , '%' , ':' , '.' , '_' , '-'
+
+Note! For comment and operatorName spaces (' ') are also allowed within the strings
+
+-configurationVersionName is in string format, max length is 40 characters.
+-identity is in string format, max length is 40 characters.
+-operatorName is in string format, max length is 40 characters.
+-comment is in string format, max length is 40 characters.
+
+This action does not require a transaction.
+
+Note! The configurationVersionName and identity can not be the same. The identity should be the product identity.
+</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="configurationVersionName">
+ <description>One ASCII text string. It must be possible to create a directory with string. Do not use string "autocreated1" and "autocreated2" as cv name. They are used by the system.</description>
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="identity">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="type">
+ <description>Type of the configuration version [ standard | test | other ].</description>
+ <in/>
+ <dataType>
+ <enumRef name="ConfigurationVersionType">
+ <defaultValue>other</defaultValue>
+ </enumRef>
+ </dataType>
+ </parameter>
+ <parameter name="operatorName">
+ <description>The operator's name.</description>
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="comment">
+ <description>The operator's comment.</description>
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <raisesException name="ValueOutOfRangeException"/>
+ </action>
+ <action name="delete">
+ <description>Delete a configuration version (CV) permanently.
+
+If CV is referenced in the startable or in the rollback list, the action is not performed (an exception is thrown instead).
+
+Note! The latest created CV is not deletable until a node restart is performed or a new CV is created. Also note that a CV is not possible to delete when it has one of the folowing properties:
+- "loaded"
+- "startable"
+- The CV is found in the "rollbacklist"
+
+This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="configurationVersionName">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="removeFromRollbackList">
+ <description>Removes a Configuration Version (CV) from the rollback list.
+
+This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="configurationVersionName">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="setFirstRollbackList">
+ <description>Adds a Configuration Version (CV) first in the rollback list. This will cause the node to chose this CV at the next rollback. A CV with status NOK, can't be put in the rollback list.
+
+This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="configurationVersionName">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="activateCommandLog">
+ <description>This action activates the log.
+
+The inparameter is the drive name (where the command log file should be stored).
+
+Default command log is drive /c/.
+
+Note! Invoking this action affects the attribute'commandLogStatus'.
+
+Note! This action does not require a transaction.
+</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="cmdlogdriveName">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <raisesException name="InvalidDriveNameException"/>
+ <raisesException name="LogActivationException"/>
+ </action>
+ <action name="deactivateCommandLog">
+ <description>This action deactivates the logging of configuration commands.
+
+Please note that uncommited data will be lost.
+
+Note! Invoking this action affects the attribute'commandLogStatus'.
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="LogActivationException"/>
+ </action>
+ </class>
+
+ <class name="SwManagement">
+ <description>This MO is used as a structural element for the SW managed object. The MO structures the software resources of the node.
+
+Note that the SwManagement MO is automatically created and cannot be deleted.
+
+The local distinguished name of this MO is ManagedElement=1, SwManagement=1.</description>
+ <systemCreated/>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="SwManagementId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="normalizeRPU">
+ <description>This action will normalize all RPUs in the node.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ </class>
+
+ <class name="UpgradePackage">
+ <description>The UpgradePackage, UP, represents an upgrade package as stored in the node file system and as stored on the ftp server that it is/shall be fetched from.
+
+There may be more than one UP at the same time on the disk. One UP represents the running system issue in the node. That one is pointed out by the Configuration Version MO.
+
+The actions on an UpgradePackage MO, are actions that can be called to take that particular UpgradePackage into operation on the node.
+
+The deletion of the Upgrade Package on disk is performed when the associated Upgrade Package MO is deleted. The Upgrade Package's unique LoadModule MOs and files are deleted. ConfigurationVersions in otherReferringCVs are deleted.
+
+
+The UP MO refers to all load modules used in the UP. One load module may by used in more than one UP.
+
+Note at the start-up of the system/database/loading of a Configuration Version, special Upgrade Package MOs are created to represent Upgrade Packages that are stored on the disk but do not have an MO in the current Configuration Version. These special Upgrade Package MOs have are in the "onlyDeletable" state. In this state, the MO will throw ActionNotAllowedException on all its actions!
+
+MOs of this type are created automatically during system upgrade.
+MOs of this type are possible to create manually but a system upgrade
+is recommended to create them.</description>
+ <attribute name="UpgradePackageId">
+ <description>The identity of the MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free of use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="loadModuleList">
+ <description>List of references to load modules that belong to this upgrade package.
+
+The list will be null until a successful install has been performed.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="LoadModule"/>
+ <nonUnique/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="upgradeControlFilePath">
+ <description>Path to the .xml file on the node once it has been fetched from the FTP server.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="state">
+ <description>Contains the state of this upgrade package.
+
+The management system and/or operator need to act on some changes in the state attribute.
+
+This attribute is used to accept/reject and modify behavior of actions. For example action 'upgrade' is not allowed in state notInstalled. Furthermore, action 'upgrade' does not behave the same if state == 'Installed' compared to if state == 'executingUpgrade' or 'awaitingConfirm'.
+
+To continue and conclude the upgrade sequence when in state == 'awaitingConfirm', action 'confirmUpgrade()' must be called. In this state it is also advisable to check attribute 'confirmationDeadline' to see how much time it is left before automatic rollback is done.
+
+Upgrade Package MOs that are stored on disk but do not have an MO in the current Configuration Version are in state "onlyDeletable". An MO in this state will throw the exception ActionNotAllowedException on all its actions.
+
+</description>
+ <readOnly/>
+ <dataType>
+ <enumRef name="UpgradePackageState">
+ <defaultValue>NOT_INSTALLED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="progressHeader">
+ <description>Header enum describing the current progress indication.
+Note that this is only progress information, that should be shown to a human operator, because some operations may take time.
+
+Changes in the progress header NEVER entails that the operator or management system need to perform any particular actions. </description>
+ <readOnly/>
+ <dataType>
+ <enumRef name="UpgradeProgressInformation">
+ <defaultValue>IDLE</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="progressTotal">
+ <description>
+This notification attribute is used to indicate progress for different steps in the upgrade sequence. The value gives the total number of steps that is to be performed in current step.
+
+This attribute is changed whenever 'progressHeader' is changed and indicates a maximum count for the progress of the progress counter. What items that are counted is specific for each case. For some cases, the counter is not yet implemented. In these cases, the progressTotal is set to zero (0) when the progressHeader is set.
+
+</description>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="progressCount">
+ <description>This attribute is used to indicate progress for different steps in the upgrade sequence. The value is separated in increments from 0 to progressTotal.
+
+The value of progressCount never exceeds the value of 'progressTotal'.
+
+For some cases, the counter is not yet implemented. In these cases, the progressCount is set to zero (0) when the progressHeader is set.</description>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeData">
+ <description>Contains product data for this upgrade package. This information is extracted from the upgrade control file. </description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <structRef name="AdminProductData"/>
+ </dataType>
+ </attribute>
+ <attribute name="confirmationDeadline">
+ <description>This attribute contains the deadline date and time for an operator confirmation. If the deadline is not met, then an automatic rollback to a previous configuration is issued by the system.
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ftpServerIpAddress">
+ <description>Ip address to the ftp server where the upgrade package is stored.
+
+The input format used by the operator is four fields of digits, separated by a dot.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="upFilePathOnFtpServer">
+ <description>File path on the FTP server to the upgrade control file. </description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="user">
+ <description>User id. to be used for logging in to the FTP server.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <defaultValue>anonymous</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="password">
+ <description>Password to the FTP server. This attribute is only supplied at create and is not readable.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <defaultValue>anonymous</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="upgradePackageDocumentId">
+ <description>The document number and revision of the uppgrade package where the white spaces has been removed and underscore between the document number and revision has been inserted e.g. 19089-CSX10901/1_A.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="deletePreventingCVs">
+ <description>The list containing the names of the Configuration Versions that stop the Upgrade Package MO from being deleted.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <string/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="otherReferringCVs">
+ <description>The list of names of Configuration Versions that refer to the Upgarde Package MO, but do not affect the deletable status of the Upgrade Package MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <string/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="isDeletable">
+ <description>Indicates if the Upgrade Package MO can be deleted.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="basedOnUpgradePackages">
+ <description>This attribute is only valid for Upgrade Packages of type Delta.It contains the merge history of this upgrade package.
+
+Example: [Product Data for normal UP (non Delta UP), Product Data for Delta UP1, Product Data for Delta UP2]. </description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <structRef name="AdminProductData"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="upCompatibilityIndex">
+ <description>This attribute states a compatibility index.
+
+If specified, it may be used when verifying that an upgrade 'from' state is valid for this Upgrade Package.
+
+Note: It is only used when the Upgrade Control File element upgrade window contains this type of information.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="cppUpVersion">
+ <description>This attribute states the CPP upgrade package version of this Upgrade Package</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <structRef name="AdminProductData"/>
+ </dataType>
+ </attribute>
+ <attribute name="actionResult">
+ <description>The attribute contains the result from the latest four invoked actions.
+
+This attribute is only valid for actions::
+- install (all variants)
+- cancelInstall
+- verifyUpgrade
+- upgrade (all variants, Note that the attribute is only valid when the verification phase discovers that upgrade is not possible').</description>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <structRef name="ActionResultData"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <action name="install">
+ <description>Load modules defined in the Upgrade Package Control file will only be downloaded to the node if the Load Module MO representing the load module file doesn't already exist.
+The result of this action is indicated in the attribute ActionResult. In case the installation fails after 'void' has been returned the attribute 'ProgressHeader' is set to 'InstallationExecutionFailed'.Already downloaded load modules (the downloaded file and the Load Module MO representing it) are not removed at installation failure.
+
+
+This action returns an actionID (created by the server). This actionID shall be used to locate the result of the action in attribute actionResult.
+
+Note! This action will be removed in a later version.
+Note! This action does not require a transaction. </description>
+ <returnType>
+ <long/>
+ </returnType>
+ <raisesException name="FtpServerNotAccessibleException"/>
+ <raisesException name="GetFileException"/>
+ <raisesException name="IpAddressException"/>
+ <raisesException name="UpgradeControlFileException"/>
+ <raisesException name="ActionNotAllowedException"/>
+ <raisesException name="InstallException"/>
+ </action>
+ <action name="verifyUpgrade">
+ <description>Verifies that an upgrade is possible.
+
+The operation is not blocked while the verification is executing i.e. after basic controls the operation initiates the verification and returns 'void'.
+
+The progress of this action is indicated in the attribute ProgressHeader.The result of this action is indicated in the attribute ActionResult.
+
+This action returns an actionID (created by the server). This actionID shall be used to locate the result of the action in attribute actionResult.
+
+Note: This action does not require a transaction.
+
+
+
+</description>
+ <returnType>
+ <long/>
+ </returnType>
+ <raisesException name="VerifyUpgradeException"/>
+ <raisesException name="ActionNotAllowedException"/>
+ </action>
+ <action name="upgrade">
+ <description>Upgrades the node. The operation is not blocked while upgrade is executing i.e. after basic controls the operation initiates the upgrade and returns 'void'.
+
+Before the real upgrade is started a verification phase is executed.
+
+The progress of this action is indicated in the attribute ProgressHeader.
+
+This action returns an actionID (created by the server). This actionID shall be used to locate the result of the action in attribute actionResult.
+
+The result of this action is only indicated in attribute ActionResult in case the verification phase discovers that upgrade is not possible.
+
+Note: This action does not require a transaction.
+
+</description>
+ <returnType>
+ <long/>
+ </returnType>
+ <raisesException name="UpgradeNotPossibleException"/>
+ <raisesException name="ActionNotAllowedException"/>
+ </action>
+ <action name="rebootNodeUpgrade">
+ <description>The same as upgrade except that the hard upgrade sequence is always chosen.
+
+It could be helpful to use this method if the application has start- or upgrade- synchronization problems when using a soft upgrade sequence.
+
+This action returns an actionID (created by the server). This actionID shall be used to locate the result of the action in attribute actionResult.
+
+The result of this action is only indicated in attribute ActionResult in case the verification phase discovers that upgrade is not possible.
+
+Note: This action does not require a transaction. </description>
+ <returnType>
+ <long/>
+ </returnType>
+ <raisesException name="UpgradeNotPossibleException"/>
+ <raisesException name="ActionNotAllowedException"/>
+ </action>
+ <action name="confirmUpgrade">
+ <description>The operator invokes this method when the trial period is over.
+The operation is not blocked while upgrade is executing i.e. after basic controls the operation initiates the upgrade and returns 'void'.In case the upgrade fails after 'void' has been returned the attribute ProgressHeader will be set to 'UpgradeExecutionFailed'.
+
+Note! This action does not require a transaction. </description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="UpgradeNotPossibleException"/>
+ <raisesException name="ActionNotAllowedException"/>
+ </action>
+ <action name="cancelUpgrade">
+ <description>Cancels an executing upgrade or an upgrade that is awaiting confirm.
+
+Note: This action performs a node restart so that the CV pointed out in the ConfigurationVersion MO is rolled back.
+
+Note! This action does not require a transaction. </description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="ActionNotAllowedException"/>
+ </action>
+ <action name="forcedInstall">
+ <description>All load modules defined in the Upgrade Package Control file will be downloaded to the node even if the Load Module MO representing the load module already exists i.e. existing load module files are replaced.
+The result of this action is indicated in the attribute ActionResult.In case the installation fails after 'void' has been returned the attribute 'ProgressHeader' is set to 'InstallationExecutionFailed'.Already downloaded load modules (the downloaded file and the Load Module MO representing it) are not removed at installation failure.
+
+
+This action returns an actionID (created by the server). This actionID shall be used to locate the result of the action in attribute actionResult.
+
+Note! This action will be removed in a later version.
+Note! This action does not require a transaction. </description>
+ <returnType>
+ <long/>
+ </returnType>
+ <raisesException name="FtpServerNotAccessibleException"/>
+ <raisesException name="GetFileException"/>
+ <raisesException name="IpAddressException"/>
+ <raisesException name="UpgradeControlFileException"/>
+ <raisesException name="ActionNotAllowedException"/>
+ <raisesException name="InstallException"/>
+ </action>
+ <action name="nonBlockingInstall">
+ <description>Load modules defined in the Upgrade Package Control file will only be downloaded to the node if the Load Module MO representing the load module doesn't already exist.
+
+This action is non-blocking i.e. the action initiates the installation and returns 'void' immediately without waiting for the installation to be completed.
+
+In case the installation fails after 'void' has been returned, this will be indicated by change of the value of attribute 'ProgressHeader' to 'ExecutionFailed'. Already downloaded load modules (the downloaded file and the Load Module MO representing it) are not removed at installation failure.
+
+This action returns an actionID (created by the server). This actionID shall be used to locate the result of the action in attribute actionResult.
+
+Note! This action does not require a transaction.
+</description>
+ <returnType>
+ <long/>
+ </returnType>
+ <raisesException name="ActionNotAllowedException"/>
+ <raisesException name="InstallException"/>
+ </action>
+ <action name="nonBlockingForcedInstall">
+ <description>All load modules defined in the Upgrade Package Control file will be downloaded to the node even if the Load Module MO representing the load module already exists i.e. existing load module files are replaced.
+This action is non-blocking i.e. the action initiates the installation and returns 'void' immediately without waiting for the installation to be completed.
+The result of this action is indicated in the attribute ActionResult.In case the installation fails after 'void' has been returned the attribute 'ProgressHeader' is set to 'InstallationExecutionFailed'. Already downloaded load modules (the downloaded file and the Load Module MO representing it) are not removed at installation failure.
+
+This action returns an actionID (created by the server). This actionID shall be used to locate the result of the action in attribute actionResult.
+
+Note! This action does not require a transaction. </description>
+ <returnType>
+ <long/>
+ </returnType>
+ <raisesException name="ActionNotAllowedException"/>
+ <raisesException name="InstallException"/>
+ </action>
+ <action name="nonBlockingSelectiveForcedInstall">
+ <description>This action only installs the load modules that are required in this node i.e. the load modules required after successful execution of action upgrade on this upgrade package.
+
+A load module is considered to be required if one of the following criteria is fulfilled:
+a) The load module is included in a Repertoire MO where the Repertoire MO is connected to a SwAllocation MO and the SwAllocation MO is connected to a Slot MO, a Fan MO, a Jvm MO, a Webserver MO or an applicable type of application MO.
+b) The load module is of type 'other'.
+
+All required load modules will be downloaded to the node even if the Load Module MO representing the load module already exists i.e. existing load module files are replaced.
+
+This operation is non-blocking i.e. the action initiates the installation and returns "void" immediately without waiting for the installation to be completed.
+The result of this action is indicated in the attribute ActionResult.In case the installation fails after 'void' has been returned the attribute 'ProgressHeader' is set to 'InstallationExecutionFailed'. Already downloaded load modules (the downloaded file and the Load Module MO representing it) are not removed at installation failure.
+
+Note. The behaviour described for this action is also obtained for the other installation actions if the Upgrade Control File indicates that the upgrade package is of type selective (which is recommended).
+
+This action returns an actionID (created by the server). This actionID shall be used to locate the result of the action in attribute actionResult.
+
+Note! This action does not require a transaction. </description>
+ <returnType>
+ <long/>
+ </returnType>
+ <raisesException name="ActionNotAllowedException"/>
+ <raisesException name="InstallException"/>
+ </action>
+ <action name="nonBlockingSelectiveInstall">
+ <description>This action only installs the load modules defined in the Upgrade Package Control file that are required in this node i.e. the load modules required after successful execution of action upgrade on this upgrade package.
+
+A load module is considered to be required if one of the following criteria is fulfilled:
+a) The load module is included in a Repertoire MO where the Repertoire MO is connected to a SwAllocation MO and the SwAllocation MO is connected to a Slot MO, a Fan MO, a Jvm MO, a Webserver MO or an applicable type of application MO.
+b) The load module is of type 'other'.
+
+Returns an actionID (created by the server). This actionID shall be used to locate the result of the action in attribute
+actionResult.
+
+The required load modules will only be downloaded to the node if the Load Module MO representing the load module doesn't already exist.
+
+This action is non-blocking i.e. the action initiates the installation and returns 'void' immediately without waiting for the installation to be completed.
+
+The result of this action is indicated in the attribute ActionResult. In case the installation fails after 'void' has been returned the attribute 'ProgressHeader' is set to 'InstallationExecutionFailed'. Already downloaded load modules (the downloaded file and the Load Module MO representing it) are not removed at installation failure.long
+
+Note. The behaviour described for this action is also obtained for the other installation actions if the Upgrade Control File indicates that the upgrade package is of type selective (which is recommended).
+Note! This action does not require a transaction. </description>
+ <returnType>
+ <long/>
+ </returnType>
+ <raisesException name="ActionNotAllowedException"/>
+ <raisesException name="InstallException"/>
+ </action>
+ <action name="cancelInstall">
+ <description>This action interrupts an ongoing installation of an upgrade package.
+
+Already downloaded load modules (the downloaded file and the Load Module MO representing it) are not removed at execution of this action.
+
+This action is non-blocking i.e. the action initiates the cancel of the installation and returns 'void' immediately without waiting for the cancellation to be completed.
+
+During execution of this action the value of attribute 'ProgressHeader' is set to 'CancelOfInstallationIsExecuting'.
+
+In case the cancellation fails after 'void' has been returned this will be indicated by change of the value of attribute 'ProgressHeader' to 'CancelOfInstallationFailed'.
+
+Note! This action does not require a transaction.
+
+This action interrupts an ongoing installation of an upgrade package.
+Already downloaded load modules (the downloaded file and the Load Module MO representing it) are not removed at execution of this action.
+This action is non-blocking i.e. the action initiates the cancel of the installation and returns 'void' immediately without waiting for the cancellation to be completed.
+During execution of this action the value of attribute 'ProgressHeader' is set to 'CancelOfInstallationIsExecuting'.The result of this action is indicated in the attribute ActionResult.In case the cancellation fails after 'void' has been returned the attribute 'ProgressHeader' is set to 'CancelOfInstallationFailed'.
+
+This action returns an actionID (created by the server). This actionID shall be used to locate the result of the action in attribute actionResult.
+
+Note! This action does not require a transaction. </description>
+ <returnType>
+ <long/>
+ </returnType>
+ <raisesException name="ActionNotAllowedException"/>
+ </action>
+ <action name="clearUpgradeLogFile">
+ <description>Is used to clear the contents of current upgrade log file.
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="UpgradeLogFileNotInUseException"/>
+ <raisesException name="UpgradeLogFileNotAccessibleException"/>
+ </action>
+ </class>
+
+ <class name="Repertoire">
+ <description>The Repertoire is an abstraction of a functionality represented by a plug in unit type (PiuType MO) and one or more load modules (LoadModule MO). The repertoire also provides rules for PiuType/ Load Module combinations valid for a specific function where one function can be provided by one or many PiuType-Load Module combinations.
+These rules are used to load the correct software (Load Modules) to a PlugInUnit. This could be used as operator configuration support and/or in situations where automatic re-configuration is required (hot repair).
+
+MOs of this type are created automatically during system upgrade.
+MOs of this type are possible to create manually but a system upgrade is recommended to create them.</description>
+ <attribute name="userLabel">
+ <description>A user friendly name associated to the managed object. </description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="name">
+ <description>A function friendly name associated to the repertoire. The value must be unique with respect to all repertoires with the same install state.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="info">
+ <description>Information regarding the function.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="piuTypeList">
+ <description>A list containing all PiuType references that has been added to this repertoire.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="PiuType"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="RepertoireId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving SwAllocation MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="SwAllocation"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="OspfInterface">
+ <description>The OSPF Interface MO represents an interface that is used by the OSPF protocol to communicate with a neighbour node. By connecting an OSPF interface to a Link MO that Link is defined as a link to be used by OSPF.
+
+Each OspfInterface MO must always be connected to a OspfArea MO.
+</description>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ospfAreaRelated">
+ <description>The identity of the OspfArea connected to this OspfInterface. The default value is the default OspfArea MO.</description>
+ <dataType>
+ <moRef name="OspfArea"/>
+ </dataType>
+ </attribute>
+ <attribute name="lsaTransmissionInterval">
+ <description>The time, in seconds, between LSA re-transmissions over the interface - default value 5 seconds.</description>
+ <dataType>
+ <long>
+ <defaultValue>5</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="helloInterval">
+ <description>The time, in seconds, between sending OSPF Hello-packets over the interface. Default value 10 seconds.
+
+Note! Must be a positive value.</description>
+ <dataType>
+ <long>
+ <defaultValue>10</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="routerDeadInterval">
+ <description>The time, in seconds, after which a neighbor router is declared dead when not heard from.
+</description>
+ <dataType>
+ <long>
+ <defaultValue>40</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="interfaceTransitDelay">
+ <description>Estimated delay, in seconds, for the transmission of a link state update package over the interface.
+</description>
+ <dataType>
+ <long>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="interfacePriority">
+ <description>The interface priority. Each router is configured with a priority configured from 0 - 255 where 0 is the lowest priority and 255 the highest.
+
+Note! Must be a positive value.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="relatedLink">
+ <description>Each OSPF interface is connected to one IP link.
+The relatedLink can be either an IpAtmLink or an EthernetLink MO
+reference.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="OspfInterfaceId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfOspfIfEvents">
+ <description>Performance monitoring counter for the number of times this OSPF interface has changed its state or an error has occured.
+
+See RFC 1850.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Ospf">
+ <description>The Ospf MO represents an instance of the Open Shortest Path First (OSPF) routing protocol running in a Cello node.
+
+When the Ospf MO is created a default OspfArea MO is also created. This OspfArea has the areaId 000.000.000.000.
+
+The attribute range0 in the default OspfArea will contain the following values:
+advertise = false
+ipAddress = 000.000.000.000
+subnetMask = 000.000.000.000
+</description>
+ <attribute name="OspfId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ospfRouterId">
+ <description>The ospfRouterId attribute is in the form of an IP address.
+In order to able to set ospfRouterId the attribute
+administrativeState has to be set to locked. The ospfRouterId
+is uniquely identifying the router in the Autonomous System. By
+convention to ensure uniqueness, this should be configured to the
+value of one of the routers IP interface addresses.</description>
+ <mandatory/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="ospfASBdrRtrStatus">
+ <description>The ospfASBdrRtrStatus attribute controls, whether this router is configured as an Autonomous System border router (Routers connected to multiple areas are called area border routers). The attribute must be set to 'True' if the user wants to configure static routes, which should be distributed to other OSPF routes as external routes. Configuration of static routes is the same as adding and deleting static routes to the IpRoutingTable Mo.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the MO.
+The operationalState can only be enabled when the IP MO is in workingMode routerMode.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state of the MO.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="ospfAreaBdrRtrStatus">
+ <description>Area border router flag - indicates whether the router is acting as an area border router or not.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="ipMo">
+ <description>The name of the Ip MO that the Ospf MO is to use</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Ip"/>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled. It is a bit mapped CORBA long, where one or more of the bits may be set. If none of the bits are set then the availability status is considered to be undefined.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfOspfOriginateNewLsas">
+ <description>The number of new link-state advertisments that have been originated. This number is incremented each time the router originates a new LSA.
+
+For more detailed information, see RFC 1850.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfOspfRxNewLsas">
+ <description>The number of link-state advertisments received determined to be new instantiations. This number does not include newer instantiations of self-originated link-state advertisments.
+
+For more detailed information, see RFC 1850.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="recoverTopoDb">
+ <description>Indicates whether the topology database is to be recovered from the database at restart.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="topoDbStoreInterv">
+ <description>The interval, in seconds, with which the topology database will be stored.</description>
+ <dataType>
+ <long>
+ <defaultValue>60</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="OspfArea">
+ <description>An OSPF autonomous system is divided into OSPF areas. The OSPF Area MO represents such OSPF areas.
+
+A default OspfArea MO is automatically created when the Ospf MO is created.
+It has the identity = 1, so LDN of this MO will be
+ManagedElement=1,IpSystem=1,Ospf=1,OspfArea=1.
+
+Note! A maximum of 4 OspfAreas can be configured each with a maximum of 8 interfaces.</description>
+ <attribute name="OspfAreaId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="stubArea">
+ <description>Indicates whether the OSPF area is a stub area or not.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="importExternalLsa">
+ <description>Indicates whether importing Autonomous System external LSA's is supported.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="sendAreaSummary">
+ <description>Import Area summary - indicates whether the router will originate and propagate summary LSAs into a stub-area.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="stubAreaMetric">
+ <description>Cost for default route that the router advertises into the area if the area is a stub area and the router is an area border router. By default set to the least metric among the interfaces to other areas.</description>
+ <dataType>
+ <long>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="stubAreaMetricType">
+ <description>Stub Area metric type.
+
+RFC 1850 (OSPF V2 MIB):
+
+comparableCost (external type 1)
+nonComparable (external type 2)</description>
+ <dataType>
+ <enumRef name="OspfMetricType">
+ <defaultValue>comparableCost</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="areaLsaChecksum">
+ <description>Area Lsa checksum - 32-bit unsigned sum of the link-state advertisements LS check sums contained in this area's link-state database.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="areaId">
+ <description>The OSPF area identity in form of an IP address. This areId uniquely identifies the area.
+AreaId 0.0.0.0 is used for the OSPF backbone.
+Range: 000.000.000.000 to 255.255.255.255.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="range0">
+ <description>OspfArea IP address range zero (0).</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="OspfAreaRange"/>
+ </dataType>
+ </attribute>
+ <attribute name="range1">
+ <description>OspfArea IP address range one (1).</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <structRef name="OspfAreaRange"/>
+ </dataType>
+ </attribute>
+ <attribute name="range2">
+ <description>OspfArea IP address range two (2).</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <structRef name="OspfAreaRange"/>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfOspfSpfRuns">
+ <description>The number of times that the intra-area route table has been calculated using this area's link-state database. This is typically done using Dijkstra's algorithm.
+
+For more detailed information, see RFC 1850.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Holds a list of the reserving OspfInterface MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="OspfInterface"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <action name="addAreaRange">
+ <description>Add aggregation range. Used to add a range of IP addresses to an OSPF area.
+
+Note! This action requires a transaction.
+</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="range">
+ <description>The area range aggregation.</description>
+ <in/>
+ <dataType>
+ <structRef name="OspfAreaRange"/>
+ </dataType>
+ </parameter>
+ <parameter name="rangeIndex">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="AttrMissingAtCreateException"/>
+ <raisesException name="FroNotAccessibleException"/>
+ <raisesException name="FroRequestFailedException"/>
+ <raisesException name="NoSuchFieldException"/>
+ <raisesException name="ValueOutOfRangeException"/>
+ <raisesException name="WrongAttributeTypeException"/>
+ </action>
+ <action name="deleteAreaRange">
+ <description>Delete an IP address range. Used to remove a range of IP addresses from an OSPF area.
+
+Input is the area aggregation range index.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="rangeIndex">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="FroNotAccessibleException"/>
+ <raisesException name="FroRequestFailedException"/>
+ <raisesException name="ValueOutOfRangeException"/>
+ </action>
+ </class>
+
+ <class name="SwitchCoreUnit">
+ <description>The Switch Core Unit MO, SCU, represents the board specific HW on the SCB. This object collects HW failure on the board and sends alarms. It is also used for configuration of board specific FW.
+This board can only be fitted in slot 1 and 28 in a standards subrack.
+The board has a number of switch internal link ports.</description>
+ <notificationTypes>alarm</notificationTypes>
+ <attribute name="userLabel">
+ <description>user label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeStateSili">
+ <description>The administrative state of the switch internal link ports on the switch board. The attribute refers to all ports (locking will lock all ports, unlocking unlock all ports).
+SILI -switch internal link interface.
+</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalStateSil">
+ <description>Operational state indicates the the traffic handling capability of all ports as a group on the board, i.e it is enabled if one or more of the eight ports is enabled. The purpose of this attribute is only for test.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalStateSync">
+ <description>Operational State for network synchronization distribution.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatusSil">
+ <description>The availability status of the switch internal link (SIL) ports..
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatusSync">
+ <description>Availability state for network synchronization distribution.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="SwitchCoreUnitId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>A list of the reserving MO's.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="silPorts">
+ <description>The attribute provides a list of port numbers.
+The port number is between 0-7 and is used to read state of the switch internal port.
+See action getSilPortState, getOperState and getAvailState.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <long/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <action name="getSilPortState">
+ <description>Returns status of the switch internal link port, which is the same as the LEDs on the unit.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <enumRef name="SilPortState">
+ </enumRef>
+ </returnType>
+ <parameter name="portNr">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="getSilOperState">
+ <description>Returns operational status of the switch internal link port.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <enumRef name="OperState">
+ </enumRef>
+ </returnType>
+ <parameter name="portNr">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="getSilAvailState">
+ <description>Returns availability status of the switch internal link port.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <long/>
+ </returnType>
+ <parameter name="portNr">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ </class>
+
+ <class name="GeneralProcessorUnit">
+ <description>The General purpose Processor Unit MO, GPU, represents the board specific HW on the GPB; hard disk, ethernet and serial port etc.
+
+Note! The 'availabilityStatus' for the GeneralProcessorUnit MO is retreived from the PlugInUnit MO.</description>
+ <attribute name="GeneralProcessorUnitId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Indicates if the function provided by the managed object is capable of performing its normal functions or not.
+
+Note! The value for operationalState is retrived from the GeneralProcessorUnit's parent, i.e. the PlugInUnit.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="hdVolumeDSize">
+ <description>The total size in bytes of the D volume.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="hdVolumeDFreespace">
+ <description>The amount in bytes of freespace available on the D volume.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="hdVolumePSize">
+ <description>The total size in bytes of the P volume.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="hdVolumePFreespace">
+ <description>The amount in bytes of freespace available on the P volume.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Holds the identity of the reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Jvm">
+ <description>The JVM MO is used to represent the Java Virtual Machine. This object is used for configuration JVM parameters, including SW management of Java class libraries used in the machine.
+
+The local distinguished name of this MO is ManagedElement=1, Equipment=1, JVM=1.</description>
+ <systemCreated/>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="classpath">
+ <description>Current classpath, the JVM is using</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="admClasspath">
+ <description>New classpath that will be activated at next restart of JVM. The classpath has a directory, which contains the load module, i.e. the classpath references the load module.</description>
+ <dataType>
+ <sequence>
+ <moRef name="LoadModule"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="freeMemory">
+ <description>Free memory in the java machine, in bytes.
+
+NOTE: Before this value is read from the system the action 'garbageCollect' is invoked.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="totalMemory">
+ <description>Total amount of memory allocated to the java machine, in bytes.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="mopplets">
+ <description>Contains all classes that are to be initilised and started when the JVM restarts.
+
+Technical note: The specified classes must implement the se.ericsson.cello.moframework.Mopplet interface and be found in a jar/zip-file pointed out by the classpath.
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <string/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="main">
+ <description>Defines the start class name.
+e.g. "se.ericsson.cello.oms.Oms"</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="options">
+ <description>Current options:
+ -D&lt;property&gt;=&lt;value&gt; Set a system property value. Commonly java.class.path
+-Xms&lt;size&gt; Specify the size, in bytes, of the memory allocation pool.
+-Xss&lt;size&gt; Set thread stack size in bytes.
+-Xverify:[all | remote | none] Verify classes according to the suboption.
+ -Xverify:all verifies all classes.
+ -Xverify:remote verifies remote classes only.
+ -Xverify:none turns off class verification.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="JvmId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="properties">
+ <description>Determines the current system properties.
+
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <string/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="reliableProgramUniter">
+ <description>A reference to the ReliableProgramUniter that refers to the programs in the which the JVM executes.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ReliableProgramUniter"/>
+ </dataType>
+ </attribute>
+ <attribute name="admMain">
+ <description>New start class that will be activated at next restart of the JVM.
+e.g. "se.ericsson.cello.oms.Oms"</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="admOptions">
+ <description>This attribute is used when setting one or more administrative options.
+
+A set option is operational after the next Java Machine restart.
+
+See also attribute 'options'
+
+One or more options can be set, one option in each string of the
+sequence according to description below:
+
+Current options:
+ -D&lt;property&gt;=&lt;value&gt; Set a system property value. Commonly java.class.path
+-Xms&lt;size&gt; Specify the size, in bytes, of the memory allocation pool.
+-Xss&lt;size&gt; Set thread stack size in bytes.
+-Xverify:[all | remote | none] Verify classes according to the suboption.
+ -Xverify:all verifies all classes.
+ -Xverify:remote verifies remote classes only.
+ -Xverify:none turns off class verification.</description>
+ <dataType>
+ <sequence>
+ <string/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBySwAllocation">
+ <description>This attribute holds the identity of the reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="SwAllocation"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <action name="garbageCollect">
+ <description>Runs the garbage collector.
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="setProperty">
+ <description>Sets a system property (i.e. propertys in the operating system).
+Note! The valeus set with this action is not saved in the database.
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="name">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="value">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="restart">
+ <description>Restart of executing JVM instance.
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ </class>
+
+ <class name="SwitchFabric">
+ <description>This MO represents the switch of a Cello node. It is used for general switch configuration.
+
+The system creates automatically one instance of this MO at restart.
+
+Today, only a maximum of 32 Switch Modules MOs and 2 SwitchInternalLinks MOs per InternalLinkGroup MOs are allowed in a Cello node. However, in theory the switch addressing space in the system allows up to 256 SwitchModules MOs. This would then mean there are 255 InternalLinkGroup MOs, each of which is allowed 256 SwitchInternalLink MOs by the addressing.
+
+The local distinguished name of this MO is ManagedElement=1, SwitchFabric=1.
+
+</description>
+ <systemCreated/>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="SwitchFabricId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="SwitchModule">
+ <description>This MO represents two switch planes of one sub-rack, i.e. either the main switch or an external switch.
+
+Note! In a non-redundant system the administrativeStateSwitchPlaneA/B has to be set to locked for the non-present plane. </description>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="switchModuleNumber">
+ <description>Indicates the number of the switch module, SMN.
+
+switchModuleNumber &amp;gt;= 0
+
+The main switch module, with one or two TimingUnits, is given SMN = 0. SMN for extension switch modules depends on the port pair that the extension switch module is connected to in the main switch module.
+
+The SMN is calculated according to the following formula:
+
+Switch module number [1..255] = int (APN/2)*8 + ISL-port in main [1..8]
+
+APN - ASCC port number
+ISL - inter-switch link</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="secondSmnEvaluation">
+ <description>secondSmnEvaluation - There are two cables that
+are relevant for Switch Module Number (smn) numbering
+If the cabling is wrong secondSmnEvaluation
+will show the second opinion about smn.
+Under normal conditions secondSmnEvaluation = smn.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state of the switch module.
+
+Note! When setting the 'administrativeState' to shutting down a notification about that the state has changed to 'locked' will be sent towards the operator. There is however no guarantee that this operation has been succesful despite the notification and state change due to limitations in the resource layer
+</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>unlocked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeStateSwitchPlaneA">
+ <description>The administrative state of switch plane A.
+It is not allowed to lock both switch plane A and B.
+
+Note! When setting the 'administrativeState' to shutting down a notification about that the state has changed to 'locked' will be sent towards the operator. There is however no guarantee that this operation has been succesful despite the notification and state change due to limitations in the resource layer</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>unlocked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeStateSwitchPlaneB">
+ <description>The administrative state of switch plane B.
+It is not allowed to lock both switch plane A and B.
+
+Note! When setting the 'administrativeState' to shutting down a notification about that the state has changed to 'locked' will be sent towards the operator. There is however no guarantee that this operation has been succesful despite the notification and state change due to limitations in the resource layer</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>unlocked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the Switch Module. At least one of switch plane is enabled. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalStateSwitchPlaneA">
+ <description>The operational state of Switch Module plane A. The state is disabled if any switch ports is faulty. But switch may still be used.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalStateSwitchPlaneB">
+ <description>The operational state of Switch Module plane B. The state is disabled if any switch ports is faulty. But switch may still be used.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status of the Switch Module.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatusSwitchPlaneA">
+ <description>The availability status of the Switch Plane A.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatusSwitchPlaneB">
+ <description>The availability status of the Switch Plane B.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="activeSwitchPlane">
+ <description>The active switch plane: A, B. During multiple faults, both plan A and B may be used.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="ActiveSwitchPlane">
+ <defaultValue>switchPlaneA</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="SwitchModuleId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="InternalLinkGroup">
+ <description>The Internal Link Group MO represents all switch internal links connecting the main switch to an external switch.
+
+Switch internal links are automatically grouped in Reliable Groups for redundancy.</description>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="switchModuleNumber1">
+ <description>Reference to the SwitchModule MO that is interconnected by the link in the InternalLinkGroup.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="SwitchModule"/>
+ </dataType>
+ </attribute>
+ <attribute name="switchModuleNumber2">
+ <description>Reference to the SwitchModule MO that is interconnected by the link in the InternalLinkGroup.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="SwitchModule"/>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative status of internal link group.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>unlocked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational status of internal link group.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="InternalLinkGroupId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="getRlgLinks">
+ <description>Returns a list of resource instance identities of the switch internal links in the specified Reliable Group.
+
+The existing Reliable Groups are listed with action getReliableLinkGroups.
+
+Note! This action is transactional.</description>
+ <returnType>
+ <sequence>
+ <longlong/>
+ </sequence>
+ </returnType>
+ <parameter name="rlgNumber">
+ <description>Reliable link group number.</description>
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="getLinkStatus">
+ <description>Returns the status of the specified switch internal link, within the specified Reliable Group.
+
+Note! This action is transactional.</description>
+ <returnType>
+ <enumRef name="SwitchReliableGroup">
+ </enumRef>
+ </returnType>
+ <parameter name="instanceId">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <parameter name="rlgNumber">
+ <description>Reliable link group number.</description>
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="getReliableLinkGroups">
+ <description>Returns a sequence of Reliable Group numbers.
+
+Each Reliable Group is identified by a unique number which can be used to read out the identities of the switch internal links that are allocated to the Reliable Group. This is done with action getRlgLinks.
+
+The allocation of switch internal links to Reliable Groups is automatic.
+
+Note! This action is transactional.
+</description>
+ <returnType>
+ <sequence>
+ <long/>
+ </sequence>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ </class>
+
+ <class name="SwitchInternalLink">
+ <description>This MO represents a link interconnecting the from either a SCB or SXB port on the main switch to a SCB on an external switch.
+
+The main switch is located in the hub subrack.
+
+The SCB is represented by the SwitchCoreUnit MO, while the SXB is represented by the SwitchExtensionUnit MO.
+
+Switch internal links are automatically grouped in Reliable Groups for redundancy.</description>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="SwitchInternalLinkId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="plugInUnit1">
+ <description>The reference of one connection point for a SwitchCoreUnit or SwitchExtensionUnit.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="plugInUnit2">
+ <description>The reference of one connection point for a SwitchCoreUnit or SwitchExtensionUnit.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="siliport1">
+ <description>Switch internal port number on PlugInUnit1.
+
+Note!
+On a standard SCB/SXB board, the ports are labeled from the bottom to the top.
+
+Port nr -&gt; label:
+ '0' 'D'
+ '1' 'C'
+ '2' 'B'
+ '3' 'A'
+
+Also note that his mapping will change when adding/removing a board.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>3</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="siliport2">
+ <description>Switch internal port number on PlugInUnit2.
+
+Note!
+On a standard SCB/SXB board, the ports are labeled from the bottom to the top.
+
+Port nr -&gt; label:
+ '0' 'D'
+ '1' 'C'
+ '2' 'B'
+ '3' 'A'
+
+Also note that his mapping will change when adding/removing a board.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>3</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state of switch internal link.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>unlocked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalStateTraffic">
+ <description>The operational state of switch internal link. There is no traffic if the link is disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatusTraffic">
+ <description>The availabilityl status of switch internal link.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalStateSync">
+ <description>The operational state of sync link. There is no clock distribution if the link is disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatusSync">
+ <description>The availability state of sync link.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Etm4">
+ <description>This MO represents the hardware of the ET-M4 board type. It only represents the ET specific hardware, while the DBM module of the board is represented by the PlugInUnit MO.
+
+The ET-M4 board contains 2 physical ports that can be configured as either STM1(ETSI/TTC) or OC3C (ANSI). The board supports unchannelised ATM access (i.e. it maps ATMs cells directly into an SDH VC4 container).
+
+The board supports up to 1800 ATM VC connections.
+The number of terminated VPs are limited to 48/board.
+The board supports up to 750 VC UBR+ connections.
+
+The ET-M4 board contains 128 AAL2 multiplexers.
+The ET-M4 board supports up to 256 bidirectional F4/F5 PM flow per port.
+
+Note! IMA is not applicable for the ETM4 board.
+
+Note! The number of VCC TP+VPC TP with performance monitoring enabled (i.e. PM mode &lt;&gt; off) is restricted to 256 per board.
+
+Note! When using the Etm4 board the performance monitoring counters in the transmit direction found on the AtmPort MO does not show the following cells: CC cells and OAM FPM cells.</description>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Enabled or disabled according to the actual operational state of the hardware ETM4. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="Etm4Id">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="VpcTp">
+ <description>Virtual path connection termination point, VpcTp, is used to represent the point where the VPC and associated overhead (F4 OAM cells) are terminated/originated.
+
+Note! The performance monitoring counters in this MO is set to 0 when counterMode is set to PM_MODE_ON.
+In PM_MODE_OFF no information at all is retrived. So any value for pm-monitoring is measured from the time
+of setting counterMode to PM_MODE_ON.
+At node restart these performance monitoring counters is reset to 0.</description>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="VpcTpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>enabled or disabled according to the actual operational state of the VpcTp</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="continuityCheck">
+ <description>Continuity checking means that a cell is sent downstream when no user cell has been sent for a period of nominally 1 second. Continuity check both enables generation of CC cells as well as detection of LOC</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="counterMode">
+ <description>PM mode is set to indicate type of performance monitoring mode (i.e. activation of bidirectional PM measurements).
+
+</description>
+ <dataType>
+ <enumRef name="AtmCounterMode">
+ <defaultValue>PM_MODE_OFF</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="nomPmBlkSize">
+ <description>Nominal performance monitoring (PM) blocksize. The minimum number of ATM cells to send before sending a Forward Performance Monitoring, FPM, cell.
+</description>
+ <dataType>
+ <enumRef name="AtmNomPmBlkSize">
+ <defaultValue>NOM_PM_BLKSIZE_2_10</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwLostCells">
+ <description>Performance monitoring counter for number of lost forward cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwMissinsCells">
+ <description>Performance monitoring counter for number of forward missinserted cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwErrBlocks">
+ <description>Performance monitoring counter for number of forward errored blocks.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLostFpmCells">
+ <description>Performance monitoring counter for number of lost Forward Performance Monitoring, FPM, cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwLostCells">
+ <description>Performance monitoring counter for number of lost backward cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwMissinsCells">
+ <description>Performance monitoring counter for number of backward missinserted cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwErrBlocks">
+ <description>Performance monitoring counter for number of backward errored blocks.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLostBrCells">
+ <description>Performance monitoring counter for number of lost Backward Reporting, BR, cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="alarmReport">
+ <description>Attribute to decide what type of alarms to be reported.</description>
+ <dataType>
+ <enumRef name="AlarmReport">
+ <defaultValue>ALARM_LOC</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <action name="eteLoopBack">
+ <description>This action performs VC end to end loopback from this VpcTp.
+false=Failed, true=Succeded
+
+Note! This action requires a transaction.
+</description>
+ <returnType>
+ <boolean/>
+ </returnType>
+ </action>
+ </class>
+
+ <class name="VplTp">
+ <description>This MO is used to represent the termination of a VP link.
+
+Note that a maximum of 999 MO's of this type may be configured.
+
+Note! For information on how many VplTp's that can be configured under the AtmPort MO please refer to the board that is parent to the termination reserved by the AtmPort MO.
+
+The performance monitoring counters in the VplTp MO is set to 0 (zero) at start or restart of the node.
+When the value is to large to fit in to a long (31bit) the counter turns over and starts from 0 again.</description>
+ <attribute name="userLabel">
+ <description>This MOs user label.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="atmTrafficDescriptor">
+ <description>Reference to the Atm Traffic Descriptor.</description>
+ <mandatory/>
+ <dataType>
+ <moRef name="AtmTrafficDescriptor"/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>enabled or disabled according to the actual operational state of the VplTp.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="externalVpi">
+ <description>This is the virtual path identifier for the external ATM cells.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmReceivedAtmCells">
+ <description>Performance monitoring counter for number of received ATM cells for the VplTp.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmTransmittedAtmCells">
+ <description>Performance monitoring counter for number of transmitted ATM cells.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="VplTpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="TimingUnit">
+ <description>This MO represents a timing unit (reference clock) in the node.
+
+The corresponding Program shall be of LoadModuleLoaderType, SpmFpgaLoader.</description>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Operational state of TimingUnit</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status of the TimingUnit.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="TimingUnitId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="PiuType">
+ <description>The PiuType is an MO that holds product information about a PlugInUnit and the execution resources of the PlugInUnit. It is created/deleted during a software upgrade.
+The PiuType is used when creating execution MOs connected to a PlugInUnit and when allocating software to this resource.
+
+MOs of this type are created automatically during system upgrade.
+MOs of this type are possible to create manually but a system upgrade
+is recommended to create them.
+
+
+</description>
+ <attribute name="userLabel">
+ <description>A user friendly name associated to the managed object. </description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="productData">
+ <description>The productData describes the product number, short product revision, product name and product information of the PlugInUnit. The production date is not used.
+
+Trailing letters in the revision is recommended to be excluded in the PiuType. Example: R2B will be R2 without trailing letter, R2B/3 must be R2B/3 in the PiuType, R2B/A should be R2 in the PiuType.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="AdminProductData"/>
+ </dataType>
+ </attribute>
+ <attribute name="boardWidth">
+ <description>The width of the PlugInUnit board in steps of 5 mm.
+A PlugInUnit can use/cover more than the slot that it occupies.
+
+Example: boardWidth=3 corresponds to 3*5 = 15 mm.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long/>
+ </dataType>
+ </attribute>
+ <attribute name="airFlowData">
+ <description>Control value m3/h for the fan unit. Needed by cooling function.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="AirFlowData"/>
+ </dataType>
+ </attribute>
+ <attribute name="PiuTypeId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="role">
+ <description>The value will be MP if a board has the role of a Main processor.
+The value will be BP if a board has the role of a device board
+Otherwise the value will be OTHERS.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="PiuRole">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity's of the reserving MO's.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <action name="numberOfMoConfigurations">
+ <description>Returns the number of entries in the PIUTypeConfigurationArray.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <long/>
+ </returnType>
+ </action>
+ <action name="getMoConfiguration">
+ <description>Returns a struct of a specific MoConfiguration at a given index.
+The moConfiguration holds information about how to create the
+subordinate objects for a specific piu type.
+
+Precondition: 0 &lt;= index &lt;= numberOfMoConfigurations() - 1
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <structRef name="PiuTypeMOConfiguration"/>
+ </returnType>
+ <parameter name="index">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="InvalidIndexException"/>
+ </action>
+ </class>
+
+ <class name="SwAllocation">
+ <description>This MO is primarily used to handle data for automatic configuration of load modules. Automatic in the meaning that the system selects the appropriate load module and revision. A SWA may be related to a slot, indicating that a specific functionality is requested at this location. The SWA is manually created by the operator.
+
+The SWA object is related to (one or more) repertoires, which hold information on possible PIU-type/revisions and load module combinations.
+
+In some cases (e.g multi-purpose boards, boards with processor/FPGA-pools) it may not be possible to completely configure the PIU without instructions from the operator (e.g which load module runs on which processor/FPGA). In these cases a specialization of the SWA has to be designed in such a way that it can be manually configured.
+
+When a SwAllocation MO depends on a ManagedObject MO, this ManagedObject actually represents a RBS Fan.
+
+MOs of this type are created automatically during system upgrade.
+MOs of this type are possible to create manually but a system upgrade is recommended to create them.</description>
+ <attribute name="userLabel">
+ <description>Free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="role">
+ <description>The role of a slot/PIU. The role must be unique with respect to other SwAllocations in the node.
+
+This is a preparation to introduce predefined SwAllocation in future upgrade packages.</description>
+ <mandatory/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="repertoireList">
+ <description>A list of references to repertoires.</description>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="Repertoire"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="slotList">
+ <description>A list of references to mainly slots in a subrack, e.g. Slot or Fan MO. It may also refer to other objects handling auxiliary units, e.g. RBS Fan.</description>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="SwAllocationId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="addRepertoire">
+ <description>Adds the specifed repertoire to this list.
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="aRepertoire">
+ <in/>
+ <dataType>
+ <moRef name="Repertoire"/>
+ </dataType>
+ </parameter>
+ <raisesException name="IllegalArgumentTypeException"/>
+ </action>
+ <action name="deleteRepertoire">
+ <description>Removes the first occurrence of the specified repertoire from this list.
+
+Notw! This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="aRepertoire">
+ <in/>
+ <dataType>
+ <moRef name="Repertoire"/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="addSlot">
+ <description>Adds the specified Slot to the slotList.
+The slot can only be of type Slot MO, Fan MO, WebServer MO, JVM MO or an applicable type of application MO (e.g. for "RBS Fans").
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="aSlot">
+ <in/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </parameter>
+ <raisesException name="IllegalArgumentTypeException"/>
+ </action>
+ <action name="deleteSlot">
+ <description>Removes the first occurrence of the specified slot from this list.
+The slot can only be of type Slot MO, Fan MO, WebServer MO or an
+applicable type of application MO (e.g. for "RBS Fans").
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="aSlot">
+ <in/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="deleteAllRepertoires">
+ <description>Removes all repertoires from this list and sets its size to zero.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="deleteAllSlots">
+ <description>Removes all slots from this list and sets its size to zero.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="addSlots">
+ <description>Adds the specified Slot to the slotList.
+The slot can only be of type Slot MO, Fan MO, WebServer MO, JVM MO or an applicable type of application MO (e.g. for "RBS Fans").
+If the slot exists in the list, the object is ignored.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="managedObjects">
+ <in/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </parameter>
+ <raisesException name="IllegalArgumentTypeException"/>
+ </action>
+ <action name="addRepertoires">
+ <description>Adds the specifed repertoire to this list.
+
+If the repertoires exist in the list the repertoire is ignored.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="repertoire">
+ <in/>
+ <dataType>
+ <sequence>
+ <moRef name="Repertoire"/>
+ </sequence>
+ </dataType>
+ </parameter>
+ <raisesException name="IllegalArgumentTypeException"/>
+ </action>
+ </class>
+
+ <class name="MediumAccessUnit">
+ <description>The Medium Access Unit (MAU) MO represents the Ethernet transceiver function on a General Processor Board (GPB).
+
+Note! Ethernet links which are modelled by a MediumAccessUnit MO are used for O&amp;M IP traffic only. MediumAccessUnit MOs must not be configured under a GeneralProcessorUnit MO which have a IpAccessHostGpb referring to it.
+
+Note! This object is known in standards as "MediumAttachmentUnit".
+</description>
+ <attribute name="userLabel">
+ <description>Label for free use.
+</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Description of operational state which has an enumerated datatype</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="MediumAccessUnitId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="connectorLabel">
+ <description>This attribute is used by a management system to show the label on the port the connector is attached to.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <defaultValue>Eth</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDot3StatsLateCollisions">
+ <description>Performance management counter for the number of times that a collision was detected on the interface after the minimum length of a frame.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDot3StatsFCSErrors">
+ <description>Performance management counter for the number of frames that did not pass the FCS check.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="linkSpeed">
+ <description>The Link Speed, measurment unit is Mb/s..</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="duplexMode">
+ <description>The duplex mode used.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="MauDuplexMode">
+ <defaultValue>FULL_DUPLEX</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="ReliableProgramUniter">
+ <description>A Reliable Program Uniter (RPU) is a controlling and addressing entity providing one common addressing unit for two Reliable Programs. Or more correctly for parts of two Reliable Programs, each part is called a Resource Suite Handler (RSH). The RSH is implemented and owned by the application. It is not a function or a concept within Cello.
+
+MOs of this type are created automatically during system upgrade.
+MOs of this type are possible to create manually but a system upgrade
+is recommended to create them.</description>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="reliableProgramLabel">
+ <description>Reliable Program Label.
+Compare this to the reliableProgramLabel in LoadModule MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="admActiveSlot">
+ <description>Reference to slot, contains the running "Normal" relation to a slot. If the reference is set to the passive slot, the passive slot will be cleared and only one relation will be set.</description>
+ <mandatory/>
+ <dataType>
+ <moRef name="Slot"/>
+ </dataType>
+ </attribute>
+ <attribute name="admPassiveSlot">
+ <description>Reference to slot, contains the running "Stand-by" relation to a slot. If the reference is set to the active slot or a null value, the passive slot will be cleared. </description>
+ <dataType>
+ <moRef name="Slot"/>
+ </dataType>
+ </attribute>
+ <attribute name="switchOver">
+ <description>This attribute controls when to switchover the RPU, if a certain type error situation occurs.</description>
+ <dataType>
+ <enumRef name="RPUSwitchOverMode">
+ <defaultValue>AtPiuFault</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="normalisation">
+ <description>This attribute controls when to switch back the RPU, after error recovery has been done.</description>
+ <dataType>
+ <enumRef name="RPUNormalisationMode">
+ <defaultValue>Automatic</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="replication">
+ <description>This attribute indicates that which level of data replication that is associated with the RPU.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="RPUReplicationMode">
+ <defaultValue>ApplControlled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalMode">
+ <description>This attribute indicates if the RSH execution mode (active/passive) in the two Reliable Program, matches the normal/stand-by relations set on the corresponding RPU.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="RPUOperationalMode">
+ <defaultValue>Unavailable</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="ReliableProgramUniterId">
+ <mandatory/>
+ <noNotification/>
+ <nonPersistent/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <action name="switch">
+ <description>This action will force the two corresponding RSHs to change their execution mode (active/passive). It will lead either to a switchover or to a switchback, depending of what value the operational Mode attribute is showing.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="ActionNotAllowedException"/>
+ </action>
+ </class>
+
+ <class name="ManagedElementData">
+ <description>This object contains attributes and actions on Cello node-level.
+
+The ManagedElementData MO is automatically created and cannot be deleted.
+
+The local distinguished name of this MO is ManagedElement=1, ManagedElementData=1.</description>
+ <systemCreated/>
+ <attribute name="ManagedElementDataId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="autoConfigurationAllowed">
+ <description>This attribute specifies if the system is allowed to auto create detected objects. Note that slots will always be auto created.
+
+Note! When setting this attribute from true to false the system creates a new CV.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="documentServerAddress">
+ <description>The base URL for the documentation server (ALEX). The attribute is read by Element Management application to find the documentation server in the network.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="logonServerAddress">
+ <description>A list of node names or IP addresses of the single logon servers (SLSs). The list uses commas to seperate the single logon server addresses, e.g. "https://SLS1,https://SLS2,https://SLS3", these addresses consists of the URLs to the concerned SLS servers. The attribute is read by Element Management application to find the single logon server in the network.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="dhcpServerAddresses">
+ <description>IP addresses to the DHCP server, used by the DHCP Relay Agent.
+
+Default is an empty array.
+
+Adding and removing addresses is done through the actions addDhcpServerAddress() and removeDhcpServerAddress().
+
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <string>
+ <defaultValue>empty</defaultValue>
+ </string>
+ <length>10</length>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="performanceDataPath">
+ <description>This attribute is used by the internal performance management service
+to know where to store it's data files. The attribute is the name of
+a path in the node.
+
+Example: /c/public_html/cello/XML_files/</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ntpServerAddressPrimary">
+ <description>This is the IP address to the NTP server</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ntpServiceActivePrimary">
+ <description>This is a boolean that controls if the node should poll the primary NTP server for information.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="ntpMinPollPrimary">
+ <description>This value states the minimum interval (in seconds) for polling the primary NTP server.
+
+Note! This value has to be &gt; 0.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>16</min> <max>131072</max>
+ </range>
+ <defaultValue>64</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="ntpMaxPollPrimary">
+ <description>This value states the maximum interval (in seconds) for polling the primary NTP server.
+
+Note! This value has to be &gt; 0.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>16</min> <max>131072</max>
+ </range>
+ <defaultValue>1024</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="ntpBurstFlagPrimary">
+ <description>This is the burst flag used towards the primary NTP server.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="ntpServerAddressSecondary">
+ <description>This is an alternative IP address to a NTP server</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ntpServiceActiveSecondary">
+ <description>This is a boolean that controls if the node should poll the secondary NTP server for information.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="ntpMinPollSecondary">
+ <description>This value states the minimum interval (in seconds) for polling the secondary NTP server.
+
+Note! This value has to be &gt; 0.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>16</min> <max>131072</max>
+ </range>
+ <defaultValue>64</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="ntpMaxPollSecondary">
+ <description>This value states the maximum interval (in seconds) for polling the secondary NTP server.
+
+Note! This value has to be &gt; 0.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>16</min> <max>131072</max>
+ </range>
+ <defaultValue>1024</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="ntpBurstFlagSecondary">
+ <description>This is the burst flag used towards the secondary NTP server.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="nodeUTCTime">
+ <description>This attribute specifies the UTC time used in the node. The attribute value is milliseconds since epoch (January 1, 1970, 00:00:00 GMT).
+The value may only be set while ntpServiceActive both for primary and secondary is false.</description>
+ <dataType>
+ <longlong>
+ <defaultValue>0</defaultValue>
+ </longlong>
+ </dataType>
+ </attribute>
+ <attribute name="nodeLocalTimeZone">
+ <description>This value states in what time zone the node is located. This attribute is needed by management application to convert UTC time from a log or NTP service to local time.
+It will not change the real time clock on the node.
+
+The timeZone is represented by three characters, example GMT.
+
+Available options are:
+
+TimeZone ID Offset
+GMT (Greenwich Mean Time) 0
+UTC (Coordinated Universal Time) 0
+ECT ( Central European Standard Time) + 1
+EET (Eastern European Time) + 2
+ART (Eastern European Time) + 2
+EAT (Eastern African Time) + 3
+MET (Iran Time) + 3.5
+NET (Armenia Time) + 4
+PLT (Pakistan Time) + 5
+IST (India Standard Time) + 5.5
+BST (Bangladesh Time) + 6
+VST (Indochina Time) + 7
+CTT (China Standard Time) + 8
+JST (Japan Standard Time) + 9
+CST (Central Standard Time) + 9.5
+EST (Eastern Standard Time) + 10
+AET (Eastern Standard Time) + 10
+SST (Solomon Is. Time) + 11
+NST (New Zealand Standard Time) + 12
+CAT (Central Alaska Time) - 1
+AGT (Argentina Time) - 3
+BET (Brazil Time) - 3
+CNT (Newfoundland Standard Time) - 3.5
+PRT (Atlantic Standard Time) - 4
+IET (Eastern Standard Time) - 5
+ACT (Central Standard Time) - 6
+PNT (Mountain Standard Time) - 7
+MST (Mountain Standard Time) - 7
+PST (Pacific Standard Time) - 8
+AST (Alaska Standard Time) - 9
+HST (Hawaii Standard Time) - 10
+MIT (West Saoma Time) - 11
+--
+
+Reference: http://www.greenwichmeantime.com
+</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="daylightSavingTime">
+ <description>This attribute states weather daylight saving time is used on this node. It is used to by the management application and will not change the real time clock on the node.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="hdVolumeCSize">
+ <description>The total size of the C volume on the Cello node in bytes. The C volume may be replicated on several hard disks.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="hdVolumeCFreespace">
+ <description>The number of bytes of free space available on the C volume. The C volume may be replicated on several hard disks in a Cello node.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="nodeUniqueID">
+ <description>This is a unique node identity to be set only in the factory.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="swServerUrlList">
+ <description>A list of URLs of external server for downloading of software. A comma-separated list or URLs, complete with path and name of property file.
+
+Note: For downloading of software for system upgrade, see attribute ftpServerIpAddress in MO UpdradePackage.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="piuGroupEscalationType">
+ <description>The type of node restart when it is a problem with the last PIU in a PIU group.</description>
+ <dataType>
+ <enumRef name="NodeRestartType">
+ <defaultValue>WARM_AT_PIU_RESTART</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="syncModeOperation">
+ <description>The sync mode operation of the node. Note that this attribute is only relevant when the node contains CBU board. For all other cases the value shall be set to NOT_USED.</description>
+ <dataType>
+ <enumRef name="SyncMode">
+ <defaultValue>NOT_USED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <action name="createNtpPrimary">
+ <description>This action creates the primary Network Time Protocol. There can only exist one primary and one secondary ntp.
+
+Once the ntp is created it is possible to change the attributes, i.e ip address, burst flag, max- and min poll and which is the active one.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="ntpServerAddressPrimary">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="ntpMinPollPrimary">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <parameter name="ntpMaxPollPrimary">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <parameter name="ntpBurstFlagPrimary">
+ <in/>
+ <dataType>
+ <boolean/>
+ </dataType>
+ </parameter>
+ <parameter name="ntpServiceActivePrimary">
+ <in/>
+ <dataType>
+ <boolean/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="createNtpSecondary">
+ <description>This action creates the secondary/alterative Network Time Protocol.
+There can only exist one primary and one secondary ntp.
+
+Once the ntp is created it is possible to change the attributes, i.e ip address, burst flag, max- and min poll and which is the active one.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="ntpServerAddressSecondary">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="ntpMinPollSecondary">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <parameter name="ntpMaxPollSecondary">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <parameter name="ntpBurstFlagSecondary">
+ <in/>
+ <dataType>
+ <boolean/>
+ </dataType>
+ </parameter>
+ <parameter name="ntpServiceActiveSecondary">
+ <in/>
+ <dataType>
+ <boolean/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="deleteNtpPrimary">
+ <description>This action deletes the primary NTP.
+
+An exception will be thrown if the primary attributes are accessed (set and get).
+
+Note! This action requires a transaction.
+</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="deleteNtpSecondary">
+ <description>This action deletes the secondary NTP.
+
+An exception will be thrown if the secondary attributes are accessed (set and get).
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="addDhcpServerAddress">
+ <description>Takes an array of Ip addresses (Strings), and adds them to the list held by the Dhcp Relay Agent fRO.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="ipAddressArray">
+ <description>Elements are assumed to have the format of a String with 4 fields of numerics, each field separated with a dot. E.g. 123.322.34.123. An empty array or empty string in first element is not allowed. Max 10 elements.</description>
+ <in/>
+ <dataType>
+ <sequence>
+ <string/>
+ </sequence>
+ </dataType>
+ </parameter>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="removeDhcpServerAddress">
+ <description>Takes an array of Ip addresses (Strings), and removes them from the list held by the Dhcp Relay Agent fRO.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="ipAddressArray">
+ <description>Elements are assumed to have the format of a String with 4 fields of numerics, each field separated with a dot. E.g. 123.322.34.123. An empty array or empty string in first element is not allowed. Max 10 elements.</description>
+ <in/>
+ <dataType>
+ <sequence>
+ <string/>
+ </sequence>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="setNodeUniqueId">
+ <description>Used for setting the nodeUniqueId attribute. This method should only be used in the factory, i.e. it is not for general use by the operator.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="nodeUniqueId">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ </action>
+ </class>
+
+ <class name="SwitchExtensionUnit">
+ <description>This MO represents the Switch Extension Unit, SXU, board. The board may only be inserted in slot 2-27 (in a standard subrack).
+If redundant links are used, two boards must be inserted next to each other.
+The board has a number of switch internal link ports.</description>
+ <attribute name="SwitchExtensionUnitId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>This attribute is used to hold a user friendly name of the object if needed.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeStateSil">
+ <description>The administrative state of switch internal link ports on the switch board.
+The attribute refers to all ports (locking will lock all ports, unlocking will unlock all ports).
+SIL- switch internal link.
+
+</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>unlocked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalStateSil">
+ <description>Operational State for all ports. Operational state is enabled if one of the eight ports is enabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalStateSync">
+ <description>Operational State for network synchronization distribution</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatusSil">
+ <description>The availability state of switch internal link (sil) ports.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatusSync">
+ <description>The availability state of the sync link.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The attribute is set by the action Reserve.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="SilPorts">
+ <description>The attribute provides a list of port numbers.
+The port number is between 0-7 and is used to read state of the switch internal port.
+Se action getSilPortState, getSilOperState and getSilAvailState.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <long/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <action name="getSilPortState">
+ <description>Returns status of the switch internal link port.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <enumRef name="SilPortState">
+ </enumRef>
+ </returnType>
+ <parameter name="portNr">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="getSilOperState">
+ <description>Returns operational status of the switch internal link port.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <enumRef name="OperState">
+ </enumRef>
+ </returnType>
+ <parameter name="portNr">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="getSilAvailState">
+ <description>Returns availability status of the switch internal link port.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <long/>
+ </returnType>
+ <parameter name="portNr">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ </class>
+
+ <class name="Aal2PathDistributionUnit">
+ <description>This MO is used to represent an AAL2 Path Distribution Unit. Such a unit handles a set of Aal2PathVccTps that belong to the same Aal2 AP and that are handled by the same Path Resource Handling Program.
+This Path Resource Handling Program is referenced by the rpuId attribute.</description>
+ <attribute name="Aal2PathDistributionUnitId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="rpuId">
+ <description>The physical location of a CPS RC (Common Part Sub-Layer Resource Control) program represented by a reference to a ReliableProgramUniter.
+
+Note that one ReliableProgramUniter MO may only be referenced once under one Aal2Ap. That means all Aal2PathDistributionUnits must reference different ReliableProgramUniter MO's.
+
+Two Aal2PathDistributionUnits under different Aal2Ap's may however reference the same ReliableProgramUniter MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ReliableProgramUniter"/>
+ </dataType>
+ </attribute>
+ <attribute name="aal2PathVccTpList">
+ <description>List of references to Aal2PathVccTp MO:s.
+Note that setting of this attribute removes the current list of Aal2PathVccTp's.
+Each reference must be unique among all paths within all Aal2PathDistributionUnit's belonging to the same Aal2Ap.</description>
+ <dataType>
+ <sequence>
+ <moRef name="Aal2PathVccTp"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <action name="addPath">
+ <description>This action adds a list of Aal2PathVccTps to an Aal2PathDistributionUnit.
+
+If the data contains a reference to a non existing path, the exception InvalidReference is raised.
+
+If the path list contains a path that has a non-unique aal2PathId value, then the exception Aal2PathIdNotUnique is raised. The pathId value must be unique within all Aal2PathDistributionUnits under the same Aal2Ap.
+
+If the path list contains a path that already belongs to a Aal2PathDistributionUnit, then the exception PathAlreadyRegistered is raised.
+
+Note! Adding one or more Aal2PathVccTps using this action updates the attribute 'Aal2PathVccTpList'.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="aal2PathVccTpId">
+ <in/>
+ <dataType>
+ <sequence>
+ <moRef name="Aal2PathVccTp"/>
+ </sequence>
+ </dataType>
+ </parameter>
+ <raisesException name="InvalidReferenceException"/>
+ <raisesException name="Aal2PathIdNotUniqueException"/>
+ <raisesException name="PathAlreadyRegisteredException"/>
+ </action>
+ <action name="removePath">
+ <description>This action removes a list (sequence) of AAL2 path's from the Aal2PathDistributionUnit.
+
+If the path list contains a path that is not in this Aal2PathDistributionUnit, the exception NotInGroup is raised.
+
+Note! Removing one or more Aal2PathVccTps using this action updates the attribute 'Aal2PathVccTpList'.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="aal2PathList">
+ <in/>
+ <dataType>
+ <sequence>
+ <moRef name="Aal2PathVccTp"/>
+ </sequence>
+ </dataType>
+ </parameter>
+ <raisesException name="NotInGroupException"/>
+ </action>
+ </class>
+
+ <class name="Fan">
+ <description>The Fan is used for cooling the Cello-subrack and is connected to one or two
+SCU (switch core board). This MO is used for controlling and sending alarm from
+the Fan.
+
+Note, either the fan can be supplied by Cello and Fan MO is used, or alternatively the fan can supplied by a source external to Cello and therefore a ManagedObject MO is used to represent the fan.
+
+</description>
+ <attribute name="FanId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>user label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrativeState of Fan MO.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="connectedToScu">
+ <description>A Fan must always be connected to a Switch Core unit that mediates the communication with a main processor.
+
+In this attribute it is possible to see which SwichCoreUnit that the fan is connected to.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="SwitchCoreUnit"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state is set to 'enabled' when the Fan has loaded and started its load module.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="piuType">
+ <description>A reference to an available PiuType at create of a Fan.
+</description>
+ <mandatory/>
+ <dataType>
+ <moRef name="PiuType"/>
+ </dataType>
+ </attribute>
+ <attribute name="controllingState">
+ <description>The application that controls the Fan has three main states:
+- standalone: running on itself, not manageable
+- autonomous: manageable state
+- noiseReduced: temporary state with reduced cooling
+
+NOTE: This attribute is not supported in CPP 4.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="FanState">
+ <defaultValue>standalone</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="hdlcAddress">
+ <description>The physical address of the RS-485 communication link.
+Incorrect setting of the address can cause collision with other connected auxiliary units or lost connection. The default value should be suitable for most configurations.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>255</max>
+ </range>
+ <defaultValue>7</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving MO. </description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <action name="restartFan">
+ <description>A restart will cause the Fan to be initiated, re-booted and all load modules to be reloaded from persistent memory. This is also known as a forced reload.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="restartCause">
+ <in/>
+ <dataType>
+ <enumRef name="RestartCause">
+ </enumRef>
+ </dataType>
+ </parameter>
+ <raisesException name="EquipException"/>
+ <raisesException name="ValueOutOfRangeException"/>
+ </action>
+ </class>
+
+ <class name="Mtp2TpItu">
+ <description>This MO represents a MTP2 Termination Point for the ITU standard, as defined in Recommendation Q.703 07/96.
+
+The performance monitoring counters found in Mtp2Itu MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is a hardware fault, aal1 server/adm restart or node restart.
+
+NOTE: This MO cannot in anyway be related (either contain or by dependence) to an MO that belongs to a standard
+which is NOT the ITU standard.
+
+NOTE: There is a restriction of a maximum of 32 Mtp2Tp's per MP.</description>
+ <attribute name="userLabel">
+ <description>Free tag for marking this managed object.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="Mtp2TpItuId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the MTP2 Signalling Terminal.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="mtp2ProfileItuId">
+ <description>Reference to a Mtp2ProfileItu MO.
+
+Note: The bitRate can not be changed.</description>
+ <mandatory/>
+ <noNotification/>
+ <dataType>
+ <moRef name="Mtp2ProfileItu"/>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfReTransmittedOctets">
+ <description>Number of re-transmitted octets.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfNacks">
+ <description>Number of negative acknowledgements received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuReceivedInError">
+ <description>Number of signal units received in error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfStartedRBCongestion">
+ <description>Number of started local RB congestions.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSendBufferOctets">
+ <description>Number of octets in send buffer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLocalSIBTime">
+ <description>Total time in local SIB (Sending).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmRemoteSIBTime">
+ <description>Total time in remote SIB (Receiving).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSIOSIFTransmitted">
+ <description>Number of SIO &amp; SIF octets transmitted.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The attribute is set by the list of reserving MO's.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Mtp3bSlItu"/>
+ </dataType>
+ </attribute>
+ <attribute name="ds0BundleId">
+ <description>The Ds0Bundle MO that this MO references.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Ds0Bundle"/>
+ </dataType>
+ </attribute>
+ <attribute name="plugInUnitId">
+ <description>The PlugInUnit MO that this MO references.
+It indicates on which processor the Termination Point will be.
+
+Note: The PlugInUnit must be of type GPB.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="PlugInUnit"/>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSUTransmitted">
+ <description>Number of MSUs transmitted.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSIOSIFReceived">
+ <description>Number of SIO and SIF octets received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSUReceived">
+ <description>Number of MSUs received..</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mtp2TpAnsi">
+ <description>This MO represents a MTP2 Termination Point for the ANSI standard , as defined in T1.111-1996.
+
+The performance monitoring counters found in Mtp2Ansi MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is a hardware fault, aal1 server/adm restart or node restart.
+
+NOTE: This MO cannot in anyway be related (either contained by or dependent on) an MO that belongs to a
+standard which is NOT the ANSI standard.
+
+NOTE: There is a restriction of a maximum of 32 Mtp2Tp's per MP.</description>
+ <attribute name="userLabel">
+ <description>Free tag for marking this managed object.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="Mtp2TpAnsiId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the MTP2 Signalling Terminal.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="mtp2ProfileAnsiId">
+ <description>Reference to a Mtp2ProfileAnsi MO.
+
+Note: The bitRate can not be changed.</description>
+ <mandatory/>
+ <noNotification/>
+ <dataType>
+ <moRef name="Mtp2ProfileAnsi"/>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfReTransmittedOctets">
+ <description>Number of re-transmitted octets.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfNacks">
+ <description>Number of negative acknowledgements received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuReceivedInError">
+ <description>Number of signal units received in error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfStartedRBCongestion">
+ <description>Number of started local RB congestions.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSendBufferOctets">
+ <description>Number of octets in send buffer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLocalSIBTime">
+ <description>Total time in local SIB (Sending).
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmRemoteSIBTime">
+ <description>Total time in remote SIB (Receiving).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSIOSIFTransmitted">
+ <description>Number of SIO &amp; SIF octets transmitted.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSUReceived">
+ <description>Number of MSUs received..</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Mtp3bSlAnsi"/>
+ </dataType>
+ </attribute>
+ <attribute name="ds0BundleId">
+ <description>The Ds0Bundle MO that this MO references.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Ds0Bundle"/>
+ </dataType>
+ </attribute>
+ <attribute name="plugInUnitId">
+ <description>The PlugInUnit MO that this MO references.
+It indicates on which processor the Termination Point will be.
+
+Note: The PlugInUnit must be of type GPB.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="PlugInUnit"/>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSUTransmitted">
+ <description>Number of MSUs transmitted.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSIOSIFReceived">
+ <description>Number of SIO and SIF octets received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Ds0Bundle">
+ <description>The Ds0Bundle, Digital Signalling Level 0, MO represents a number of timeslots on a physical port.
+Any of E1PhysPathTerm, J1PhysPathTerm, T1PhysPathTerm, E1Ttp or T1Ttp.
+The Ds0Bundle can be used in three different ways:
+
+- Fractional ATM
+
+Please refer to the AtmPort MO for details. Note that the TdmMode attribute
+must be disabled.
+
+-Circuit emulation
+
+Please refer to Aal1VccTp MO for details. Note that the TdmMode attribute
+must be disabled. Note that only 4 Ds0Bundle's per port can be configured
+when running circuit emulation.
+
+- TDM Switching
+
+The Ds0Bundle is reserved for switching node internal Ds0 connections. In
+this mode, the tdmMode attribute should be enabled.
+
+
+</description>
+ <attribute name="Ds0BundleId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Free tag for marking this managed object.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availabiltity status of Ds0Bundle.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of Ds0Bundle.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="listOfTimeSlots">
+ <description>The list gives the time slots (within ATM traffic fraction) that are to be allocated to the Ds0Bundle.
+
+When a Ds0Bundle is contained by a E1PhysPathTerm the slots that can be placed in this list are 1 to 31.
+When a Ds0Bundle is contained by a J1PhysPathTerm then the slots that can be placed in this list are 1 to 24.
+When a Ds0Bundle is contained by a T1PhysPathTerm then the slots that can be placed in this list are 1 to 24.
+When a Ds0Bundle is contained by a E1Ttp the slots that can be placed in this list are 1 to 31.
+
+Note: the same timeslot cannot appear more than once in the list! If a E1/J/T1PhysPathTerm contains more than
+one Ds0Bundle, then the Ds0Bundles listOfTimeSlots must be mutually exclusive (i.e. slots in one list cannot be used in another list).
+
+Note! If the Ds0Bundle is used for carrying SS7 traffic, the listOfTimeSlots can only contain 1 (one) time slot.
+In this case that is if the Ds0Bundle is reserved by an Mtp2TpAnsi, Mtp2TpItu or Mtp2TpChina.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <sequence>
+ <long>
+ <range>
+ <min>0</min> <max>31</max>
+ </range>
+ </long>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="tdmMode">
+ <description>The state of tdmMode (Time Division Multiplexing), can be disabled/enabled.
+
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <boolean/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Aal1TpVccTp">
+ <description>The Aal1TpVccTp MO represents the Aal1 interworking function in a circuit emulation. The object refers to a Ds0Bundle which represents one end of the circuit emulation, and a VclTp which represents the other end.
+
+Note! The performance monitoring counters in this MO is set to 0 when counterMode is set to PM_MODE_ON.
+In PM_MODE_OFF no information at all is retrived. So any value for pm-monitoring is measured from the time
+of setting counterMode to PM_MODE_ON.
+At node restart these performance monitoring counters is reset to 0.</description>
+ <attribute name="userLabel">
+ <description>Free tag for marking this managed object.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ds0BundleId">
+ <description>The Ds0Bundle MO that this MO references.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Ds0Bundle"/>
+ </dataType>
+ </attribute>
+ <attribute name="partialFill">
+ <description>Indicates how many bytes are filled in each ATM cell. The value 47 indicates that the partial filled cells is not used, i.e. all the cells are filled completely.
+
+Partial filling of cells in used in circuit emulation. It is used to reduce packetisation delay. Refer to the ATM Forum specifications for more details.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>23</min> <max>47</max>
+ </range>
+ <defaultValue>47</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="cdvt">
+ <description>Specifies the cell delay variation tolerance. Refer to ATM Forum specifications for more details.
+
+Unit is micro seconds.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>100</min> <max>4000</max>
+ </range>
+ <defaultValue>1000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of Aal1TpVccTp.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="continuityCheck">
+ <description>Continuitiy checking means that a cell is sent downstream when no user cell has been sent for a period of nominally 1 second.
+
+Activates VC end to end continuityCheck according to ITU.T rec I.610.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="counterMode">
+ <description>Controls the activation of PM counters and F5 PM flow on the VC connection.</description>
+ <dataType>
+ <enumRef name="AtmCounterMode">
+ <defaultValue>PM_MODE_OFF</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="nomPmBlockSize">
+ <description>Nominal performance monitoring (PM) blocksize. The minimum number of ATM cells to send before sending a Forward Performance Monitoring, FPM, cell.</description>
+ <dataType>
+ <enumRef name="AtmNomPmBlkSize">
+ <defaultValue>NOM_PM_BLKSIZE_2_10</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwLostCells">
+ <description>Performance monitoring counter for forwarded lost cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwMissinsCells">
+ <description>Performance monitoring counter for number of forwarded missinserted cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwErrBlocks">
+ <description>Performance monitoring counter for number of forwarded errored blocks.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLostFpmCells">
+ <description>Performance monitoring counter for number of lost Forward Performance Monitoring, FPM cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwLostCells">
+ <description>Performance monitoring counter for number of lost backward cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwMissinsCells">
+ <description>Performance monitoring counter for number of backward missinserted cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwErrBlocks">
+ <description>Performance monitoring counter for number of backward errored blocks.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLostBrCells">
+ <description>Performance monitoring counter for number of lost Backward Reporting, BR, cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="Aal1TpVccTpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="vclTpId">
+ <description>The VclTp MO that this MO references.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="VclTp"/>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="alarmReport">
+ <description>Attribute to decide what type of alarms to be reported.</description>
+ <dataType>
+ <enumRef name="AlarmReport">
+ <defaultValue>ALARM_LOC</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mtp3bSpAnsi">
+ <description>Mtp3b Signalling Point for the ANSI standard.
+
+This MO represents/models the MTP3b Signaling Point characteristics/functions according to the Ansi standard.
+A signaling point is a logical node in the signaling network. The combination of signaling points and their interconnecting
+signaling links form the SS No. 7 signaling network. The signaling point represented by this object is a Local Signaling Point.
+
+The performance monitoring counters found in Mtp3SpAnsi MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is shutdown request from CLI (Cluster Interface).
+
+NOTE: IT IS NOT POSSIBLE TO CREATE SIGNALLING POINTS OF DIFFERENT STANDARDS!
+
+NOTE: This MO cannot in anyway be related (either contain or by dependence) to an MO that belongs to a standard which is NOT the ANSI standard.
+
+NOTE: The combination of network indicator (networkInd) and Signalling Point Code (signallingPointCode) has to be unique for each Signalling Point.
+
+NOTE: A maximum of 15 instances of this MO can be created on (referencing) the same PlugInUnit.
+
+NOTE: The maximum number of Signalling Points that can be created in a CPP based node is 24.
+
+NOTE: Deleting a singel L3 Signal Point is not possible, if it necessary to delete a Signal Point then all Signal Points has to be deleted. This also has to be done whitin the same transaction.
+
+NOTE: Any object created under a certain SP (Signaling Point) cannot refer to an object created under another SP. Nor can it refer to an object created under another SP.</description>
+ <attribute name="Mtp3bSpAnsiId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="rpuId">
+ <description>Holds a reference to the Reliable Program Uniter.
+The RPU is at the server.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ReliableProgramUniter"/>
+ </dataType>
+ </attribute>
+ <attribute name="networkInd">
+ <description>The network indicator, NI, is used for discrimination of messages between functionally different networks.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="Mtp3bNetworkInd">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="signallingPointCode">
+ <description>The signallingPointCode (Local Point Code) attribute (SPC) is used together with the network indicator (NI, networkInd attribute) to uniquely identify the MTP Signalling Point, SP.
+SP = NI-SPC.
+Size (2 exp 24)-1 (16777215).
+The SignallingPointCode (SPC) is normally grouped together as three numbers wich correspond to network identifier, network cluster, network cluster member. The three numbers are coded as 8-8-8 bits in the total SPC. To enter the SPC-value, you have to convert the 3 numbers to their binary code and then convert the whole 24-bit patterna as an integer. Sometimes the SPC is used as a whole uniqe number (no internal structure).
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>16777215</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="testPatternSltm">
+ <description>The testPatternSltm attribute represents a string testpattern in the Signalling Link Test Message.
+
+Minimum string length 2 characters, maximum 30 characters. Allowed characters are 0-9, A-F.
+Only even number of characters is allowed.</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>2</min> <max>30</max>
+ </lengthRange>
+ <defaultValue>"A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5"</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="nodeBehaviour">
+ <description>The nodeBehaviour attribute represents the MTP3b node type.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="NodeBehaviourType">
+ <defaultValue>SEP</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="maxSizeReroutBuf">
+ <description>The maxSizeReroutBuf attribute represents the maximum size (in kB) of the rerouting buffer.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>5000</max>
+ </range>
+ <defaultValue>2000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxSizeChangeBuf">
+ <description>The maxSizeChangeBuf attribute represents the maximum size (in kB) of the changeover buffer.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>5000</max>
+ </range>
+ <defaultValue>2000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="transFrHandler">
+ <description>Determines how a TransFer Restricted signal (TFR) should be treated.
+</description>
+ <dataType>
+ <enumRef name="Mtp3bTfrHandling">
+ <defaultValue>IGNORED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="sioSpare">
+ <description>The sioSpare2 attribute determines if the two spare bits in the SIO (Service Information Octet) should be treated as spare.</description>
+ <dataType>
+ <enumRef name="Mtp3bSioSpareBitsUse">
+ <defaultValue>PRIO</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="m3uaNoOfAttempsOfDauds">
+ <description>For M3UA, number of attempts to send the DAUD message.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="noOfAttempsOfAssociationEstablishment">
+ <description>Number of attempts to send the SCTP_ASSOCIATE_REQ message.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>65535</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="statusIndInterval">
+ <description>The statusIndInterval attribute sets the interval for sending MTP-STATUS indication, i.e. send indication every Nth message .</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="resendTfcInterval">
+ <description>Send TFC back to originating signalling point code for every n:th message when
+the destination is congested. Set to 0 will suppress sending of TFC.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="sendSltmBefLink">
+ <description>The sendSltmBefLink attribute determines if the SLTM (Signalling Link Test Message) should be sent and a SLTA received before the link is considered to be in service.
+
+Note! It is not recommended nor is it in accordance with standard to set the value of this attribute to 'false' </description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="spPriority">
+ <description>Struct containing the ANSI priority attributes.
+</description>
+ <dataType>
+ <structRef name="Mtp3bSpAnsiPriorityData"/>
+ </dataType>
+ </attribute>
+ <attribute name="noOfCongestLevelForNI">
+ <description>Defines the number of congestion levels for NI.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>3</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="routeSetCongestTestFlag">
+ <description>Selection of which procedure to use during congestion handling if the national option with priorities is used.
+
+0, use TcTimer as described by the TTC standard.
+1, use Route Set Congestion Test as described by the ANSI, ITU and China Standard.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operationalState attribute reflects the operational status of the MTP3b SP.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="spTimer">
+ <description>Struct containing ANSI specific timer data.</description>
+ <dataType>
+ <structRef name="Mtp3bSpAnsiTimerData"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Holds a list of the reserving MO's. Can be of type SccpSp.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfForcedRerouteSuccessPerf">
+ <description>Performance monitoring counter for number of successfully performed forced rerouting.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfControlledRerouteSuccessPerf">
+ <description>Performance monitoring counter for number of successfully performed controlled rerouting.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfEmergencyChangeOverRec">
+ <description>Performance management counter for number of received emergency changeOver orders (ECO) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfChangeOverRec">
+ <description>Performance counter for number of changeOver order messages (COO/XCO) received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfChangeBackDeclRec">
+ <description>Performance management counter for number of received change Back Declarations (CBD) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSLTAFirstTimeOutRec">
+ <description>Performance management counter for number of SLTA first time out received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSLTASecondTimeOutRec">
+ <description>Performance management counter for number of SLTA second time out received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUPMsgDiscardedDueToRoutingErr">
+ <description>Performance monitoring counter for number of UP (user part) messages (MTP_TRANSFER_req) discarded due to routing error.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOAXCASent">
+ <description>Performance management counter for number of sent COA/XCA messages.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECOSent">
+ <description>Performance management counter for number of sent ECO messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECASent">
+ <description>Performance management counter for number of sent ECA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOAXCARec">
+ <description>Performance management counter for number of received COA/XCA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBARec">
+ <description>Performance management counter for number of received CBA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECARec">
+ <description>Performance management counter for number of received ECA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTRARec">
+ <description>Performance management counter for number of received TRA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTRASent">
+ <description>Performance management counter for number of sent TRA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTimerT21WasStarted">
+ <description>Performance monitoring counter for number of times the timer T21 was started (i.e. how many times the remote inhibit test message has been sent).
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBASent">
+ <description>Performance management counter for number of sent CBA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessForcedRerouting">
+ <description>Performance monitoring counter for number of unsuccessfully performed forced reroutings.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessControlledRerouting">
+ <description>Performance monitoring counter for number of unsuccessfully performed controlled reroutings.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuccessAssocEstablish">
+ <description>Performance management counter for number of successful association establishment.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessAssocEstablish">
+ <description>Performance management counter for number of unsuccessful association establishment.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpCommunicationErr">
+ <description>Performance management counter for number of SCTP communication error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpSendFailure">
+ <description>Performance management counter for number of SCTP send failure.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpBufOverflow">
+ <description>Performance management counter for number of SCTP stop sending data.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpResumeSending">
+ <description>Performance management counter for number of SCTP resume sending data.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpNetworkStatusChange">
+ <description>Performance management counter for number of SCTP network status change.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpAssociationRestart">
+ <description>Performance management counter for number of SCTP association restart.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuccessAssocAbort">
+ <description>The number of successful abortions of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuccessAssocShutDown">
+ <description>The number of succesful shutdowns of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessAssocAbort">
+ <description>The number of unsuccessful abortions of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessAssocShutDown">
+ <description>The number of unsuccesful shutdowns of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIncomingAssocEstabRequestInStateDownWhenStateEstabIsBlocked">
+ <description>The number of incoming request for association establishment when state on the association is 'DOWN' and establishment of associations is blocked. </description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMaxTrialsForAssocEstabReached">
+ <description>The number of times that the max limit for trying to establish an association has been reached.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMaxTrialsForAssocActivReached">
+ <description>The number of times that the max limit for trying to activate an association has been reached.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLowerPrioMsgDiscarded">
+ <description>The number of messages with low priority that has been discarded.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mtp3bSpItu">
+ <description>Mtp3b Signalling Point for the ITU standard.
+
+This MO represents/models the MTP3b Signaling Point characteristics/functions according to the ITU standard.
+A signaling point is a logical node in the signaling network. The combination of signaling points and their interconnecting
+signaling links form the SS No. 7 signaling network. The signaling point represented by this object is a Local Signaling Point.
+
+The performance monitoring counters found in Mtp3SpItu MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is shutdown request from CLI (Cluster Interface).
+
+NOTE: IT IS NOT POSSIBLE TO CREATE SIGNALLING POINTS OF DIFFERENT STANDARDS!
+
+NOTE: This MO cannot in anyway be related (either contain or by dependence) to an MO that belongs to a standard which is NOT the ITU standard.
+
+NOTE: The combination of network indicator (networkInd) and Signalling Point Code (signallingPointCode) has to be unique for each Signalling Point.
+
+NOTE: A maximum of 15 instances of this MO can be created on (referencing) the same PlugInUnit.
+
+NOTE: The maximum number of Signalling Points that can be created in a CPP based node is 24.
+
+NOTE: Deleting a singel L3 Signal Point is not possible, if it necessary to delete a Signal Point then all Signal Points has to be deleted. This also has to be done whitin the same transaction.
+
+NOTE: Any object created under a certain SP (Signaling Point) cannot refer to an object created under another SP. Nor can it refer to an object created under another SP.
+
+NOTE: The value of the attribute 'version' is valid for all SPs (Mtp3bSpItu MOs) and the value of the last created or changed SP will be used for all SPs.</description>
+ <attribute name="Mtp3bSpItuId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="networkInd">
+ <description>The networkInd attribute (NI) is used by signalling message handling functions in MTP3b
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="Mtp3bNetworkInd">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="signallingPointCode">
+ <description>The signallingPointCode (Local Point Code) attribute (SPC) is used together with the network indicator (NI, networkInd attribute) to uniquely identify the MTP Signalling Point, SP.
+SP = NI-SPC.
+Size (2 exp 14)-1 (16383).
+The SignallingPointCode (SPC) is normally used as a whole unique number (no internal structure). But sometimes the SPC is grouped together as three numbers which corresponds to zone, area/network, signalling point. If this is the case the three numbers are coded as 3-8-3 bits in the total SPC. To enter the SPC-value then you have to convert the three numbers to their binary code and then convert the whole 14-bit pattern as an integer.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>16383</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="version">
+ <description>This attribute shows what MTP3b ITU standard the system follows. With ITU, it is possible using this attribute to set which of the ITU standard versions that shall be followed.
+
+Note! Setting of another value than 'ITU_T_07_96' at create will have no effect. The Signaling Point will always be created with the value 'ITU_T_07_96'.
+
+Note! It is not possible to hav signaling points with different versions in the node so setting of this attribute will effect all signaling points. The value for the last created or changed signaling point will be used for all signaling points.</description>
+ <dataType>
+ <enumRef name="Mtp3bItuVersion">
+ <defaultValue>ITU_T_07_96</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="nodeBehaviour">
+ <description>The nodeBehaviour attribute represents the MTP3b node type.
+
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="NodeBehaviourType">
+ <defaultValue>SEP</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="noOfCongestLevelForNI">
+ <description>Defines the number of congestion levels for NI.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>3</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="routeSetCongestTestFlag">
+ <description>Selection of which procedure to use during congestion handling if the national option with priorities is used.
+
+0, use TcTimer as described by the TTC standard.
+1, use Route Set Congestion Test as described by the ANSI, ITU and China Standard.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="resendTfcInterval">
+ <description>Send TFC back to originating signalling point code for every n:th message when
+the destination is congested. Set to 0 will suppress sending of TFC.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxSizeReroutBuf">
+ <description>The maxSizeReroutBuf attribute represents the maximum size (in kB) of the rerouting buffer.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>5000</max>
+ </range>
+ <defaultValue>2000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxSizeChangeBuf">
+ <description>The maxSizeChangeBuf attribute represents the maximum size (in kB) of the changeover buffer.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>5000</max>
+ </range>
+ <defaultValue>2000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="transFrHandler">
+ <description>Determines if a TransFer Restricted signal (TFR) should be treated as a TFA (TransFer Allowed signal) or be ignored.
+</description>
+ <dataType>
+ <enumRef name="Mtp3bTfrHandling">
+ <defaultValue>IGNORED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="sioSpare">
+ <description>The sioSpare2 attribute determines if the two spare bits in the SIO (Service Information Octet) should be treated as spare.</description>
+ <dataType>
+ <enumRef name="Mtp3bSioSpareBitsUse">
+ <defaultValue>PRIO</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="statusIndInterval">
+ <description>The statusIndInterval attribute sets the interval for sending MTP-STATUS indication, i.e. send indication every Nth message .</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="sendSltmBefLink">
+ <description>The sendSltmBefLink attribute determines if the SLTM (Signalling Link Test Message) should be sent and a SLTA received before the link is considered to be in service.
+
+Note! It is not recommended nor is it in accordance with standard to set the value of this attribute to 'false' </description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="testPatternSltm">
+ <description>The testPatternSltm attribute represents a string testpattern in the Signalling Link Test Message.
+
+Minimum string length 2 characters, maximum 30 characters. Allowed characters are 0-9, A-F.
+Only even number of characters is allowed.
+
+</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>2</min> <max>30</max>
+ </lengthRange>
+ <defaultValue>"A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5"</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="spPriority">
+ <description>Struct containing the priority attributes.
+</description>
+ <dataType>
+ <structRef name="Mtp3bSpItuPriorityData"/>
+ </dataType>
+ </attribute>
+ <attribute name="spTimer">
+ <description>Struct containing ITU specific timer attributes</description>
+ <dataType>
+ <structRef name="Mtp3bSpItuTimerData"/>
+ </dataType>
+ </attribute>
+ <attribute name="rpuId">
+ <description>Holds a reference to the Reliable Program Uniter.
+The RPU is at the server.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ReliableProgramUniter"/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operationalState attribute reflects the operational status of the MTP3b SP.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="m3uaNoOfAttempsOfDauds">
+ <description>For M3UA, number of attempts to send the DAUD message.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="noOfAttempsOfAssociationEstablishment">
+ <description>Number of attempts to send the SCTP_ASSOCIATE_REQ message.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>65535</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Holds a list of the reserving MO's. Can be of type SccpSp.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfForcedRerouteSuccessPerf">
+ <description>Performance monitoring counter for number of successfully performed forced rerouting.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfControlledRerouteSuccessPerf">
+ <description>Performance monitoring counter for number of successfully performed controlled rerouting.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfEmergencyChangeOverRec">
+ <description>Performance management counter for number of received emergency changeOver orders (ECO) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfChangeOverRec">
+ <description>Performance counter for number of changeOver order messages (COO/XCO) received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfChangeBackDeclRec">
+ <description>Performance management counter for number of received change Back Declarations (CBD) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSLTAFirstTimeOutRec">
+ <description>Performance management counter for number of SLTA first time out received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSLTASecondTimeOutRec">
+ <description>Performance management counter for number of SLTA second time out received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUPMsgDiscardedDueToRoutingErr">
+ <description>Performance monitoring counter for number of UP (user part) messages (MTP_TRANSFER_req) discarded due to routing error.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOAXCASent">
+ <description>Performance management counter for number of sent COA/XCA messages.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECOSent">
+ <description>Performance management counter for number of sent ECO messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECASent">
+ <description>Performance management counter for number of sent ECA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOAXCARec">
+ <description>Performance management counter for number of received COA/XCA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBARec">
+ <description>Performance management counter for number of received CBA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECARec">
+ <description>Performance management counter for number of received ECA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTRARec">
+ <description>Performance management counter for number of received TRA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTRASent">
+ <description>Performance management counter for number of sent TRA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTimerT21WasStarted">
+ <description>Performance monitoring counter for number of times the timer T21 was started (i.e. adjacent SP restarted).
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBASent">
+ <description>Performance management counter for number of sent CBA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessForcedRerouting">
+ <description>Performance monitoring counter for number of unsuccessfully performed forced reroutings.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessControlledRerouting">
+ <description>Performance monitoring counter for number of unsuccessfully performed controlled reroutings.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuccessAssocEstablish">
+ <description>Performance management counter for number of successful association establishment.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessAssocEstablish">
+ <description>Performance management counter for number of unsuccessful association establishment.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpCommunicationErr">
+ <description>Performance management counter for number of SCTP communication error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpSendFailure">
+ <description>Performance management counter for number of SCTP send failure.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpBufOverflow">
+ <description>Performance management counter for number of SCTP stop sending data.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpResumeSending">
+ <description>Performance management counter for number of SCTP resume sending data.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpNetworkStatusChange">
+ <description>Performance management counter for number of SCTP network status change.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpAssociationRestart">
+ <description>Performance management counter for number of SCTP association restart.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuccessAssocAbort">
+ <description>The number of successful abortions of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuccessAssocShutDown">
+ <description>The number of succesful shutdowns of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessAssocAbort">
+ <description>The number of unsuccessful abortions of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessAssocShutDown">
+ <description>The number of unsuccesful shutdowns of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIncomingAssocEstabRequestInStateDownWhenStateEstabIsBlocked">
+ <description>The number of incoming request for association establishment when state on the association is 'DOWN' and establishment of associations is blocked. </description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMaxTrialsForAssocEstabReached">
+ <description>The number of times that the max limit for trying to establish an association has been reached.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMaxTrialsForAssocActivReached">
+ <description>The number of times that the max limit for trying to activate an association has been reached.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLowerPrioMsgDiscarded">
+ <description>The number of messages with low priority that has been discarded.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mtp3bSpTtc">
+ <description>Mtp3b Signalling Point for the TTC standard.
+
+This MO represents/models the MTP3b Signaling Point characteristics/functions according to the TTC standard.
+A signaling point is a logical node in the signaling network. The combination of signaling points and their interconnecting
+signaling links form the SS No. 7 signaling network. The signaling point represented by this object is a Local Signaling Point.
+
+The performance monitoring counters found in Mtp3SpTtc MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is shutdown request from CLI (Cluster Interface).
+
+NOTE: This MO cannot in anyway be related (either contain or by dependence) to an MO that belongs to a
+standard which is NOT the TTC standard.
+
+NOTE: IT IS NOT POSSIBLE TO CREATE SIGNALLING POINTS OF DIFFERENT STANDARDS!
+
+NOTE: The combination of network indicator (networkInd) and Signalling Point Code (signallingPointCode) has to be unique for each Signalling Point.
+
+NOTE: A maximum of 15 instances of this MO can be created on (referencing) the same PlugInUnit.
+
+NOTE: The maximum number of Signalling Points that can be created in a CPP based node is 24.
+
+NOTE: Deleting a singel L3 Signal Point is not possible, if it necessary to delete a Signal Point then all Signal Points has to be deleted. This also has to be done whitin the same transaction.
+
+NOTE: Any object created under a certain SP (Signaling Point) cannot refer to an object created under another SP. Nor can it refer to an object created under another SP.</description>
+ <attribute name="Mtp3bSpTtcId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="networkInd">
+ <description>The networkInd attribute (NI) is used by signalling message handling functions in MTP3b.
+
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="Mtp3bNetworkIndTtc">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="signallingPointCode">
+ <description>The signallingPointCode (Local Point Code) attribute (SPC) is used together with the network indicator (NI, networkInd attribute) to uniquely identify the MTP Signalling Point, SP.
+SP = NI-SPC.
+Size (2 exp 16)-1 (65535).
+The SignallingPointCode (SPC) is always used as a whole unique number (no internal structure).</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="nodeBehaviour">
+ <description>The nodeBehaviour attribute represents the MTP3b node type.
+
+Note! Only SEP and STP is supported for the Ttc standard.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="NodeBehaviourType">
+ <defaultValue>SEP</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="routeSetCongestTestFlag">
+ <description>Selection of which procedure to use during congestion handling if the national option with priorities is used.
+
+0, use TcTimer as described by the TTC standard.
+1, use Route Set Congestion Test as described by the ANSI, ITU and China Standard.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="resendTfcInterval">
+ <description>Send TFC back to originating signalling point code for every n:th message when
+the destination is congested. Set to 0 will suppress sending of TFC.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxSizeReroutBuf">
+ <description>The maxSizeReroutBuf attribute represents the maximum size (in kB) of the rerouting buffer.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>5000</max>
+ </range>
+ <defaultValue>2000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxSizeChangeBuf">
+ <description>The maxSizeChangeBuf attribute represents the maximum size (in kB) of the changeover buffer.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>5000</max>
+ </range>
+ <defaultValue>2000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="statusIndInterval">
+ <description>The statusIndInterval attribute sets the interval for sending MTP-STATUS indication, i.e. send indication every Nth message .</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="testPatternSltm">
+ <description>The testPatternSltm attribute represents a string testpattern in the Signalling Link Test Message.
+
+String length 4 characters. Allowed characters are 0-9, A-F.
+
+</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>4</min> <max>4</max>
+ </lengthRange>
+ <defaultValue>"7711"</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="spPriority">
+ <description>Struct containing the TTC priority attributes.
+</description>
+ <dataType>
+ <structRef name="Mtp3bSpTtcPriorityData"/>
+ </dataType>
+ </attribute>
+ <attribute name="rpuId">
+ <description>Holds a reference to the Reliable Program Uniter.
+The RPU is at the server.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ReliableProgramUniter"/>
+ </dataType>
+ </attribute>
+ <attribute name="spTimer">
+ <description>Struct containing TTC timer attributes.</description>
+ <noNotification/>
+ <dataType>
+ <structRef name="Mtp3bSpTtcTimerData"/>
+ </dataType>
+ </attribute>
+ <attribute name="noOfCongestLevelForNI">
+ <description>Defines the number of congestion levels for NI.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>3</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operationalState attribute reflects the operational status of the MTP3b SP.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Holds a list of the reserving MO's. Can be of type SccpSp.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfForcedRerouteSuccessPerf">
+ <description>Performance monitoring counter for number of successfully performed forced rerouting.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfControlledRerouteSuccessPerf">
+ <description>Performance monitoring counter for number of successfully performed controlled rerouting.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfEmergencyChangeOverRec">
+ <description>Performance management counter for number of received emergency changeOver orders (ECO) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfChangeOverRec">
+ <description>Performance counter for number of changeOver order messages (COO/XCO) received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfChangeBackDeclRec">
+ <description>Performance management counter for number of received change Back Declarations (CBD) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSLTAFirstTimeOutRec">
+ <description>Performance management counter for number of SLTA first time out received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSLTASecondTimeOutRec">
+ <description>Performance management counter for number of SLTA second time out received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUPMsgDiscardedDueToRoutingErr">
+ <description>Performance monitoring counter for number of UP (user part) messages (MTP_TRANSFER_req) discarded due to routing error.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOAXCASent">
+ <description>Performance management counter for number of sent COA/XCA messages.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECOSent">
+ <description>Performance management counter for number of sent ECO messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECASent">
+ <description>Performance management counter for number of sent ECA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOAXCARec">
+ <description>Performance management counter for number of received COA/XCA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBARec">
+ <description>Performance management counter for number of received CBA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECARec">
+ <description>Performance management counter for number of received ECA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTRARec">
+ <description>Performance management counter for number of received TRA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTRASent">
+ <description>Performance management counter for number of sent TRA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBASent">
+ <description>Performance management counter for number of sent CBA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessForcedRerouting">
+ <description>Performance monitoring counter for number of unsuccessfully performed forced reroutings.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessControlledRerouting">
+ <description>Performance monitoring counter for number of unsuccessfully performed controlled reroutings.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuccessAssocEstablish">
+ <description>Performance management counter for number of successful association establishment.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessAssocEstablish">
+ <description>Performance management counter for number of unsuccessful association establishment.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpCommunicationErr">
+ <description>Performance management counter for number of SCTP communication error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpSendFailure">
+ <description>Performance management counter for number of SCTP send failure.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpBufOverflow">
+ <description>Performance management counter for number of SCTP stop sending data.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpResumeSending">
+ <description>Performance management counter for number of SCTP resume sending data.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpNetworkStatusChange">
+ <description>Performance management counter for number of SCTP network status change.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpAssociationRestart">
+ <description>Performance management counter for number of SCTP association restart.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mtp3bSlAnsi">
+ <description>This MO represents an MTP3b Signalling Link for the ANSI standard. It represents the termination of the signalling link within the signalling point as defined in T1.111-1996.
+
+The total amount of links between any two specific nodes in the network shall not be more than 80 independent on how many linksets that are defined between the two nodes. The signalLinkCode for a link must be unique between the nodes, independent on which linkSet the link belongs to. A maximum of five linksets with a maximum of 16 links in each linkset can be configured. A maximum of 16 links between two adjacent nodes can be configured.
+
+NOTE: This MO cannot in anyway be related (either contain or by dependence) to an MO that belongs to a standard which is NOT the ANSI standard.
+
+The performance monitoring counters found in Mtp3SlAnsi MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is shutdown request from CLI (Cluster Interface).</description>
+ <attribute name="Mtp3bSlAnsiId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>This attribute reflects the operational status of the Mtp3bSlAnsi.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="tpId">
+ <description>The tpId attribute points out the termination point of the lower layer protocol.
+
+For narrowband this signalling link will be connected to an MTP L2 termination point (Mtp2Tp MO). And for broadband it will be connected to a NNI SAAL termination point (NniSaalTp Mo).</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="linkState">
+ <description>The link state of the Mtp3bSlAnsi.
+
+The link state is a bit map which contains a combination of the following values: (in hexadecimal format)
+
+0x00 Available
+0x01 Failed
+0x02 Remotely blocked
+0x04 Locally blocked
+0x08 Remotely inhibited
+0x10 Locally inhibited
+0x20 Deactivated</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="usageState">
+ <description>There are three possible states for the usageState attribute:
+
+- idle, the Mtp3bSl carries no traffic.
+- active, the Mtp3bSl is working normally, and there is traffic, and it is not congested.
+- busy, the Mtp3bSl is working but is congested (traffic is routed on other links).
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bUsageState">
+ <defaultValue>IDLE</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="signLinkCode">
+ <description>The signalling link code, SLC, used for this link.
+The signLinkCode for a link must be unique between the nodes,
+independent on in which linkSet the link belongs.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>15</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="proceduralState">
+ <description>The procedural state of the link.
+
+0 - not initialized
+1 - initialized
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bProceduralState">
+ <defaultValue>NOT_INITIALIZED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="linkCongestLevel">
+ <description>The congestion level of the link.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="CongestLevel">
+ <defaultValue>level_0</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="autoStartLink">
+ <description>Controls if the Mtp3bSL should be activated at create.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAALINServiceInd">
+ <description>Performance management counter for number of received link-in-service indications.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAALOUTInd">
+ <description>Performance management counter for number of received link-out-of-service indications.
+
+Note! This counter is incremented every time a link out of service indication is received for the link.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOOXCOSent">
+ <description>Performance management counter for number of sent change over order (COO/XCO) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBDSent">
+ <description>Performance management counter for number of sent CBD messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLocalLinkCongestRec">
+ <description>Performance monitoring counter for number of local link congestion primitives received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLocalLinkCongestCeaseRec">
+ <description>Performance monitoring counter for number of local link congestion ceased primitives received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSURec">
+ <description>Performance monitoring counter for number of received MSU's on this signalling link.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSUSent">
+ <description>Performance monitoring counter for number of sent MSU's on this signalling link.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <action name="deactivate">
+ <description>This action deactivates the signalling link.
+ It will also set autoStartLink = false.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="activate">
+ <description>This action activates the signalling link with normal alignment. It will also set autoStartLink = true.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="emergencyActivate">
+ <description>This action activates the signalling link with emergency alignment.
+ It will also set autoStartLink = true
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="localInhibit">
+ <description>This action inhibits the Mtp3bSlAnsi. Signalling link management inhibiting is requested by management when it becomes necessary, e.g for maintenance or testing purposes to make or keep a signalling link unavailable to User Part-generated signalling traffic.
+Inhibiting of a signalling link may be requested by management function at either end of the link. The request is granted, provided that the inhibiting action does not cause any previously accessible destinations to become inaccessible at either end of the signalling link. The request may also be refused under certain circumstances such as congestion.
+Exception FroRequestFailed if it was not possible to inhibit.
+
+Note! This action requires a transaction.
+</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="localUninhibit">
+ <description>This action uninhibits the Mtp3bSlAnsi.
+
+Exception FrorequestFailed if it was not possible to uninhibit.
+
+Note! This action requires a transaction.
+</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ </class>
+
+ <class name="Mtp3bSlItu">
+ <description>This MO represents an MTP3b Signalling Link for the ITU standard. It represents the termination of the signalling link within the signalling point as defined in Q.704 and Q.2210 (07/96).
+
+The total amount of links between any two specific nodes in the network shall not be more than 16, independent on how many linksets that are defined between the two nodes. The signalLinkCode for a link must be unique between the nodes, independent on which linkSet the link belongs to.
+
+The performance monitoring counters found in Mtp3SlItu MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is shutdown request from CLI (Cluster Interface).
+
+NOTE: This MO cannot in anyway be related (either contain or by dependence) to an MO that belongs to a standard which is NOT the ITU standard.</description>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="tpId">
+ <description>The tpId attribute points out the termination point of the lower layer protocol.
+
+For narrowband this signalling link will be connected to an MTP L2 termination point (Mtp2Tp MO). And for broadband it will be connected to a NNI SAAL termination point (NniSaalTp Mo).</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>This attribute reflects the operational status of the Mtp3bSl.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="linkState">
+ <description>The link state of the Mtp3bSl.
+
+The link state is a bit map which contains a combination of the following values: (in hexadecimal format)
+
+0x00 Available
+0x01 Failed
+0x02 Remotely blocked
+0x04 Locally blocked
+0x08 Remotely inhibited
+0x10 Locally inhibited
+0x20 Deactivated</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="usageState">
+ <description>There are three possible states for the usageState attribute:
+
+- idle, the Mtp3bSl carries no traffic.
+- active, the Mtp3bSl is working normally, and there is traffic, and it is not congested.
+- busy, the Mtp3bSl is working but is congested (traffic is routed on other links).
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bUsageState">
+ <defaultValue>IDLE</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="signLinkCode">
+ <description>The signalling link code, SLC, used for this link.
+The signLinkCode for a link must be unique between the nodes,
+independent on in which linkSet the link belongs.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>15</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="proceduralState">
+ <description>The procedural state of the link.
+
+0 - not initialized
+1 - initialized
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bProceduralState">
+ <defaultValue>NOT_INITIALIZED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="linkCongestLevel">
+ <description>The congestion level of the link.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="CongestLevel">
+ <defaultValue>level_0</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="autoStartLink">
+ <description>Controls if the Mtp3b Signalling Link should be activated at create.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="prioBeforeSio">
+ <description>This Boolean tells if the message priority shall be inserted in an octet before the Service Indicator Octet (SIO).
+
+ITU default is false.
+</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAALINServiceInd">
+ <description>Performance management counter for number of received link-in-service indications.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAALOUTInd">
+ <description>Performance management counter for number of received link-out-of-service indications.
+
+Note! This counter is incremented every time a link out of service indication is received for the link.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOOXCOSent">
+ <description>Performance management counter for number of sent change over order (COO/XCO) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBDSent">
+ <description>Performance management counter for number of sent CBD messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLocalLinkCongestRec">
+ <description>Performance monitoring counter for number of local link congestion primitives received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLocalLinkCongestCeaseRec">
+ <description>Performance monitoring counter for number of local link congestion ceased primitives received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSURec">
+ <description>Performance monitoring counter for number of received MSU's on this signalling link.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSUSent">
+ <description>Performance monitoring counter for number of sent MSU's on this signalling link.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="Mtp3bSlItuId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="localInhibit">
+ <description>This action inhibits the Mtp3bSlItu. Signalling link management inhibiting is requested by management when it becomes necessary, e.g for maintenance or testing purposes to make or keep a signalling link unavailable to User Part-generated signalling traffic.
+Inhibiting of a signalling link may be requested by management function at either end of the link. The request is granted, provided that the inhibiting action does not cause any previously accessible destinations to become inaccessible at either end of the signalling link. The request may also be refused under certain circumstances such as congestion.
+Exception FroRequestFailed if it was not possible to inhibit.
+
+Note! This action requires a transaction.
+</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="localUninhibit">
+ <description>This action uninhibits the Mtp3bSlItu.
+
+Exception FrorequestFailed if it was not possible to uninhibit.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="deactivate">
+ <description>This action deactivates the Mtp3bSl.
+It will also set autoStartLink = false.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="activate">
+ <description>This action activates the Mtp3bSl with normal alignment. It will also set autoStartLink = true.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="emergencyActivate">
+ <description>This action activates the Mtp3bSl with emergency alignment.
+It will also set autoStartLink = true
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ </class>
+
+ <class name="Mtp3bSlTtc">
+ <description>This MO represents an MTP3b Signalling Link for the TTC standard. It represents the termination of the signalling link within the signalling point as defined in JT-Q.704 Ver. 3, April 28 1992 and JT-Q.2210 Ver.1 April 24 1996.
+
+The total amount of links between any two specific nodes in the network shall not be more than 16, independent on how many linksets that are defined between the two nodes. The signalLinkCode for a link must be unique between the nodes, independent on which linkSet the link belongs to.
+
+The performance monitoring counters found in Mtp3SlTtc MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is shutdown request from CLI (Cluster Interface).
+
+NOTE: This MO cannot in anyway be related (either contain or by dependence) to an MO that belongs to a standard which is NOT the TTC standard.</description>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="tpId">
+ <description>The tpId attribute points out the termination point of the lower layer protocol. Only BroadBand is supported for TTC. The MO will be connected to a NNI SAAL termination point (NniSaalTp Mo).</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>This attribute reflects the operational status of the Mtp3bSl.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="linkState">
+ <description>The link state of the Mtp3bSl.
+
+The link state is a bit map which contains a combination of the following values: (in hexadecimal format)
+
+0x00 Available
+0x01 Failed
+0x02 Remotely blocked
+0x04 Locally blocked
+0x08 Remotely inhibited
+0x10 Locally inhibited
+0x20 Deactivated</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="usageState">
+ <description>There are three possible states for the usageState attribute:
+
+- idle, the Mtp3bSl carries no traffic.
+- active, the Mtp3bSl is working normally, and there is traffic, and it is not congested.
+- busy, the Mtp3bSl is working but is congested (traffic is routed on other links).
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bUsageState">
+ <defaultValue>IDLE</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="signLinkCode">
+ <description>The signalling link code, SLC, used for this link.
+The code have to be uniqe in this signal link set, i.e the signallingLinkCode for
+all the Mtp3bSl that belongs to the same Mtp3bSls must be unique(mutual exclusive). </description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>15</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="proceduralState">
+ <description>The procedural state of the link.
+
+0 - not initialized
+1 - initialized
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bProceduralState">
+ <defaultValue>NOT_INITIALIZED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="linkCongestLevel">
+ <description>The congestion level of the link.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="CongestLevel">
+ <defaultValue>level_0</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="autoStartLink">
+ <description>Controls if the Mtp3b Signalling Link should be activated at create.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="prioBeforeSio">
+ <description>This Boolean tells if the message priority shall be inserted in an octet before the Service Indicator Octet (SIO).
+
+</description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAALINServiceInd">
+ <description>Performance management counter for number of received link-in-service indications.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAALOUTInd">
+ <description>Performance management counter for number of received link-out-of-service indications.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOOXCOSent">
+ <description>Performance management counter for number of sent change over order (COO/XCO) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBDSent">
+ <description>Performance management counter for number of sent CBD messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLocalLinkCongestRec">
+ <description>Performance monitoring counter for number of local link congestion primitives received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLocalLinkCongestCeaseRec">
+ <description>Performance monitoring counter for number of local link congestion ceased primitives received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSURec">
+ <description>Performance monitoring counter for number of received MSU's on this signalling link.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSUSent">
+ <description>Performance monitoring counter for number of sent MSU's on this signalling link.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="Mtp3bSlTtcId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="deactivate">
+ <description>This action deactivates the Mtp3bSl.
+It will also set autoStartLink = false.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ <raisesException name="FroNotAccessibleException"/>
+ </action>
+ <action name="activate">
+ <description>This action activates the signalling link with normal alignment. It will also set autoStartLink = true.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ <raisesException name="FroNotAccessibleException"/>
+ </action>
+ <action name="emergencyActivate">
+ <description>This action activates the signalling link with emergency alignment.
+It will also set autoStartLink = true
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ <raisesException name="FroNotAccessibleException"/>
+ </action>
+ </class>
+
+ <class name="Mtp2ProfileAnsi">
+ <description>The MTP 2 Profile MO represents and keeps attribute values used by one or more MTP 2 ANSI termination point MOs.</description>
+ <attribute name="userLabel">
+ <description>This MOs user label.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="Mtp2ProfileAnsiId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="profileData">
+ <description>Struct containing profile data.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="Mtp2ProfileDataAnsi"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of Mtp2TpAnsi MOs that have reserved this Mtp2TpProfileAnsi MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="Mtp2TpAnsi"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mtp2ProfileItu">
+ <description>The MTP 2 Profile MO represents and keeps attribute values used by one or more MTP 2 ITU termination point MOs.</description>
+ <attribute name="userLabel">
+ <description>The MOs user label.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="Mtp2ProfileItuId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="profileData">
+ <description>Struct containing profile data.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="Mtp2ProfileDataItu"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of Mtp2TpItu MOs that have reserved this Mtp2TpProfileItu MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="Mtp2TpItu"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="E1Ttp">
+ <description>This MO represents a channelised E1 interface in the node. The E1Ttp (Trail Termination Point) MO
+does not define which type of traffic (TDM or ATM) that the interface should support. Please refer to
+the Ds0Bundle, AtmPort, IMALink and IMAGroup objects for details about configuration of traffic type.
+
+The performance monitoring counters in the E1Ttp MO is set to 0 (zero) at start or restart of the node.
+When the value is to large too fit in to a long (31bit) the counter turns over and starts from 0 again.
+
+Note! This MO is automatically created as a consequence of creating an Os155SpiTtpMo
+Please refer to the Os155SpiTtpMo for more details.
+
+</description>
+ <systemCreated/>
+ <attribute name="degDegThr">
+ <description>The threshold decides how many of the received blocks that are allowed to have bit errors. The measurement is made on a per-second basis and if the threshold is passed the second is considered bad.
+
+This is a percentage value.
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="degDegM">
+ <description>How many bad seconds in a row that causes a Degraded Signal alarm.
+
+
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>2</min> <max>10</max>
+ </range>
+ <defaultValue>7</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="aisReporting">
+ <description>Indicates whether Alarm Indication Signal, AIS, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="rdiReporting">
+ <description>Indicates whether Remote Defect Indication, RDI, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="crc4Mode">
+ <description>Indicates what Cyclical Redundancy Check 4 Mode that is being used.</description>
+ <dataType>
+ <enumRef name="Crc4Mode">
+ <defaultValue>AUTOMATIC</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="idlePattern">
+ <description>The idle pattern.
+
+NOTE: Going from A_LAW or U_LAW to UNDEFINED is always allowed but setting up one ET board with
+both U_LAW and A_LAW is not allowed.
+E.g. If you want to change from A_LAW to U_LAW on one ET board you have to change idlePattern
+on each physical port belonging to the board to UNDEFINED first.
+A_LAW -&gt; UNDEFINED -&gt; U_LAW or U_LAW -&gt; UNDEFINED -&gt; A_LAW</description>
+ <dataType>
+ <enumRef name="IdlePattern">
+ <defaultValue>UNDEFINED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmEs">
+ <description>Performance monitoring counter of Errored Seconds (ES).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSes">
+ <description>Performance monitoring counter for Severely Errored Seconds.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="E1TtpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identityof the reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="AtmPort"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedByImaLink">
+ <description>The identity of the reserving ImaLink MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ImaLink"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Vc4Ttp">
+ <description>This MO is automatically created as a consequence of creating an Os155SpiTtp object if any of the following conditions are true:
+a) standardmode = ETSI or
+b) standardmode = TTC and muxmode = VC4_STS3CSPE_LEVEL.
+
+It represents the termination of the SDH VC-4 path layer. The VC-4 can either be used for channelised access, in which case VC-12 MOs are created as children to the Vc4Ttp MO, or be used to carry ATM traffic, in which case there is a relationship between the AtmPort MO and the Vc4Ttp MO.
+
+Note! The performance monitoring counters in the Vc4TtpMO is set to 0 (zero) at start or restart of the node.
+When the value is to large to fit in to a long (31bit) the counter turns over and starts from 0 again.
+</description>
+ <systemCreated/>
+ <attribute name="pathTraceFormat">
+ <description>Indicates the format of the expectedPathtrace and transmittedPathtrace attributes. The format may be in 16 or 64 characters. Usually 16 is used for ETSI and 64 for ANSI/TTC.
+
+ITU_T_G707=16
+GR_253_CORE=64
+
+Note that the 16 characters format requires the operator to specify 15 characters where no character contains the null character (the 16th character is added automatically).
+
+Note that the 64 characters format requires the operator to specify 62 ASCII characters all different from null followed by CR/LF.</description>
+ <dataType>
+ <enumRef name="PathTraceFormat">
+ <defaultValue>ITU_T_G707</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="transmittedPathTrace">
+ <description>The transmitted path trace.
+Can be defined in two formats. The format may be in 16 or 64 characters. Usually 16 is used for ETSI and 64 for ANSI/TTC.
+
+Note: The string must be of 15 or 62 characters length, or empty string ("").
+
+</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>64</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="expectedPathTrace">
+ <description>Expected path trace.
+
+The string can be of 15 or 62 characters length, or empty string ("").
+
+Note: An empty string for this attribute means that the detection of Trace Identifier Mismatch (TIM) should be disabled. This attribute is set to empty string every time attribute pathTraceFormat is set.
+
+</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>64</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="timConsequentAction">
+ <description>Trace Identifier Mismatch (TIM) consequent action, i.e. for generation of Alarm Indication Signal (AIS) downstream and Remote Defect Indication (RDI) upstream as a consequence of the TIM detection.
+
+True - enabled.
+False - disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="vcDegThreshold">
+ <description>This threshold decides how many of the received blocks that are allowed to have bit errors. The measurement is made on a per-second basis and if the threshold is passed the second is considered bad.
+
+The attribute value is in unit of % (percent).</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="vcDegM">
+ <description>Indicates how many bad seconds in a row that causes a Degraded Signal alarm.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>2</min> <max>10</max>
+ </range>
+ <defaultValue>7</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="auAisReporting">
+ <description>AU AIS reporting.
+
+True - enable reporting.
+False - disable reporting.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="vcRdiReporting">
+ <description>VC RDI reporting.
+
+True - enable reporting.
+False - disable reporting.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmVcEs">
+ <description>Performance monitoring counter for Virtual Container 4, VC4, Errored Seconds, ES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmVcSes">
+ <description>Performance monitoring counter for Virtual Container 4, VC4, Severely Errored Seconds, SES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="Vc4TtpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="AtmPort"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Os155SpiTtp">
+ <description>This MO represents the physical interface and the termination of the SDH Regenerator and Multiplexer Section Layers.
+
+When creating the Os155SpiTtp a number of additional objects will be created. Depending on the values of standardmode and muxmode different objects will be created as described below:
+
+muxmode = standby
+standardmode = ETSI, TTC, ANSI
+No objects under the Os155SpiTtp is created.
+
+muxmode = VC4_STS3CSPE_LEVEL
+standardmode = ETSI, TTC
+A Vc4 MO is created under the Os155SpiTtp MO.
+
+muxmode = VC4_STS3CSPE_LEVEL
+standardmode = ANSI
+A Sts3CspeTtp MO is created under the Os155SpiTtp MO.
+
+The following two configurations is only applicable for the ET-MC41 board.
+
+muxmode = E1_J1_T1_LEVEL
+standardmode = ETSI
+A Vc4 MO, 63 Vc12Ttp MO's and 63 E1Ttp MO's is created under the Os155SpiTtp MO
+
+muxmode = E1_J1_T1_LEVEL
+standardmode = ANSI
+3 Sts1CspeTtp MO's, 3*28 Vt15Ttp MO's and 3*28 TiTtp MO's is created under the Os155SpiTtp MO.
+
+The performance monitoring counters in the Os155SpiTtp MO is set to 0 (zero) at start or restart of the node.
+When the value is too large too fit in to a long (31bit) the counter turns over and starts from 0 again.
+
+Note! If the Os155SpiTtp is configured as part of an Mspg protection group and is configured as standby, muxMode set to standby, no children's to this MO will be created.</description>
+ <attribute name="Os155SpiTtpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="lineNo">
+ <description>The actual line number.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>2</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="standardMode">
+ <description>The standard that this MO is operating to.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="StandardMode">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="shutDownTimeout">
+ <description>The shut-down timer. It is used when the administrativeState is set to shutdown.
+
+Value in seconds, must be a positive value.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100000</max>
+ </range>
+ <defaultValue>1800</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="muxMode">
+ <description>The level at which the STM-1/OC3 signal is demultiplexed.
+
+If parent is of type Etmc41, the valid muxMode is STANDBY or E1_J1_T1_LEVEL.
+If parent is of type Etm4, the valid muxMode is STANDBY or VC4_STS3CSPE_LEVEL.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="MuxMode">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="msDegThreshold">
+ <description>MS - multiplexer section.
+
+The threshold decides how many of the received blocks that are allowed to have bit errors. The measurement is made on a per-second basis and if the threshold is passed the second is considered bad.
+
+This is a percentage value.
+
+Note: When operating to the ANSI standard, this attribute has no meaning.
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="msDegM">
+ <description>MS - multiplexer section.
+
+How many bad seconds in a row that causes a Degraded Signal alarm.
+
+Note: When operating to the ANSI standard, this attribute has no meaning.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>2</min> <max>10</max>
+ </range>
+ <defaultValue>7</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="msRdiReporting">
+ <description>Indicates whether Remote Defect Indication, RDI, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="msAisReporting">
+ <description>Indicates whether Alarm Indication Signal, AIS, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="loopBack">
+ <description>Enables or disables line loopback, i.e. the received signal is returned in the transmitted direction.
+
+none - This is the normal state, no loop back is performed (and ordinary traffic is running).
+
+line - The physical path is looped on the line side, the external incoming path is looped back to the external outgoing path.
+
+Note! administrativeStatus must be set to locked when setting loopback attribute.</description>
+ <dataType>
+ <enumRef name="Os155LoopBack">
+ <defaultValue>NONE</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmMsEs">
+ <description>Performance monitoring counter for Multiplexer Section, MS, Errored Seconds, ES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmMsSes">
+ <description>Performance monitoring counter for Multiplexer Section, MS, Severely Errored Seconds, SES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBySync">
+ <description>The identity of the reserving Synchronization MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Synchronization"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Vc12Ttp">
+ <description>This MO is automatically created when the configuring the Os155SpiTtp. It represents the termination of the SDH VC-12 path layer.
+
+Note: This MO is only valid when the ETSI standard is in use.
+
+The performance monitoring counters in the Vc12TtpMO is set to 0 (zero) at start or restart of the node.
+When the value is to large too fit in to a long (31bit) the counter turns over and starts from 0 again.</description>
+ <systemCreated/>
+ <attribute name="Vc12TtpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="transmittedPathTrace">
+ <description>The transmitted path trace.
+
+Note: when 16 byte tracing is used, only 15 bytes should be used in the set action for this attribute.
+
+
+</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>64</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="expectedPathTrace">
+ <description>Expected path trace.
+
+Note: when 16 byte tracing is used, only 15 bytes should be used in the set action for this attribute.
+
+Note: An empty string for this attribute means that the detection of Trace Identifier Mismatch (TIM) should be disabled.
+</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>64</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="timConsequentAction">
+ <description>Trace Identifier Mismatch (TIM) consequent action, i.e. for generation of Alarm Indication Signal (AIS) downstream and Remote Defect Indication (RDI) upstream as a consequence of the TIM detection.
+
+True - enabled.
+False - disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="vcDegThreshold">
+ <description>This threshold decides how many of the received blocks that are allowed to have bit errors. The measurement is made on a per-second basis and if the threshold is passed the second is considered bad.
+
+The attribute value is in unit of % (percent).</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="vcDegM">
+ <description>Indicates how many bad seconds in a row that causes a Degraded Signal alarm.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>2</min> <max>10</max>
+ </range>
+ <defaultValue>7</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tuAisReporting">
+ <description>Timing Unit Alarm Indication Signal (TU AIS) reporting.
+
+True - enable reporting.
+False - disable reporting.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="vcRdiReporting">
+ <description>VC RDI reporting.
+
+True - enable reporting.
+False - disable reporting.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmVcEs">
+ <description>Performance monitoring counter for Virtual Container 12, VC12, Errored Seconds, ES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmVcSes">
+ <description>Performance monitoring counter for Virtual Container 12, VC12, Severely Errored Seconds, SES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="shutDownTimeout">
+ <description>The shut-down timer. It is used when the administrativeState is set to shutdown.
+
+Value in seconds, must be a positive value.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100000</max>
+ </range>
+ <defaultValue>1800</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Etmc1">
+ <description>This MO represents the hardware of the ET-MC1 board type. It only represents the ET specific hardware, the DBM module of the board is represented by the PlugInUnit MO.
+
+The ET-MC1 board contains 8 phyiscal ports that can be configured as either E1 (ETSI), J1 (TTC) or T1(ANSI). The board does not allow for a mix of E1, J1 and T1 ports, thus all configured ports on the board must be configured to the same standard.
+
+Each port on the ET-MC1 board can be used to carry either ATM traffic or circuit orientated (Nx64 Kbits/s connections) traffic.
+
+Each port can support up to 30 ATM VC connections. Two of these connections are reserved for AAL2 paths, and therefore two AAL2 multiplexers per port are available.
+
+Each port can support up to 2 VP connections.
+
+The ET-MC1 port supports one bidirectional F4/F5 PM flow per port.
+
+At the VP/VC endpoints, the Lost FPM/BR cells counters are not available.
+
+Note! The ETMC1 supports IMA.
+
+For more details on restrictions please refer to 155 17-21/CSX 101 09 Uen.
+
+Note! When the Etmc1 is part of the Cbu it is only possible to configure 4 physical ports of type E1, J1 or T1 on the Etmc1 board.</description>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Enabled or disabled according to the actual operational state of the ETMC1 board.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="Etmc1Id">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Etmc41">
+ <description>This MO represents the hardware of the ET-MC41 board type. It only represents the ET specific hardware, while the DBM module of the board is represented by the PlugInUnit MO.
+
+The ET-MC41 board contains a 155 Mbits/s physical optical port. The board can be configured as a E1 channelised board providing 63 logical E1 interfaces.
+
+Each E1 logical channel on the ET-MC41 can be used to carry either ATM traffic or circuit oriented (Nx64 kbit/s) traffic.
+
+Each E1 logical channel can support up to 30 ATM VC connections. Two of these connections are reserved for aal2 paths, and therefore two AAL2 multiplexers per E1/DS1/J1 channel are available.
+
+Each E1/DS1/J1 channel can suport up to 2 VP connections.
+
+The ET-MC41 board support one biderectional F4/F5 PM flow per E1 channel.
+
+Note! The ETMC41 supports IMA. However the E1 ports being part of the same IMA group can not be selected randomly.
+
+Note! The number of VCC TP+VPC TP with performance monitoring enabled (i.e. PM mode &lt;&gt; off) is restricted to 1 / port
+
+For more details on restrictions please refer to 155 17-21/CSX 101 09 Uen.</description>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Enabled or disabled according to the actual operational state of the ET-MC41 board.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="Etmc41Id">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mtp2ProfileChina">
+ <description>The MTP2 Profile MO represents and keeps attribute values used by one or more MTP2 China termination point MOs.</description>
+ <attribute name="Mtp2ProfileChinaId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="profileData">
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="Mtp2ProfileDataChina"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of Mtp2TpChina MOs that have reserved this Mtp2TpProfileChina MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="Mtp2TpChina"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>The MOs user label.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mtp2TpChina">
+ <description>This MO represents a MTP 2 termination point for the China standard, as defined in GF001-9001, plus supplement 1-3.
+
+The performance monitoring counters found in Mtp2China MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is a hardware fault, aal1 server/adm restart or node restart.
+
+NOTE: This MO cannot in anyway be related (either contained by or dependent on) an MO that belongs to a standard
+which is NOT the China standard.
+
+NOTE: There is a restriction of a maximum of 32 Mtp2Tp's per MP.
+
+</description>
+ <attribute name="ds0BundleId">
+ <description>The Ds0Bundle MO that this MO references.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Ds0Bundle"/>
+ </dataType>
+ </attribute>
+ <attribute name="mtp2ProfileChinaId">
+ <description>Reference to a Mtp2ProfileChina MO.
+
+Note: The bitRate can not be changed.</description>
+ <mandatory/>
+ <noNotification/>
+ <dataType>
+ <moRef name="Mtp2ProfileChina"/>
+ </dataType>
+ </attribute>
+ <attribute name="Mtp2TpChinaId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the MTP2 Signalling Terminal.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmLocalSIBTime">
+ <description>Total time in local SIB (Sending).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSUTransmitted">
+ <description>Number of MSUs transmitted.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfNacks">
+ <description>Number of negative acknowledgements received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuReceivedInError">
+ <description>Number of signal units received in error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfReTransmittedOctets">
+ <description>Number of re-transmitted octets.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSendBufferOctets">
+ <description>Number of octets in send buffer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSIOSIFReceived">
+ <description>Number of SIO and SIF octets received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSIOSIFTransmitted">
+ <description>Number of SIO &amp; SIF octets transmitted.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfStartedRBCongestion">
+ <description>Number of started local RB congestions.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmRemoteSIBTime">
+ <description>Total time in remote SIB (Receiving).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Mtp3bSlChina"/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Free tag for marking this managed object.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="plugInUnitId">
+ <description>The PlugInUnit MO that this MO references.
+It indicates on which processor the Termination Point will be.
+
+Note: The PlugInUnit must be of type GPB.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="PlugInUnit"/>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSUReceived">
+ <description>Number of MSUs received..</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mtp3bSlChina">
+ <description>This MO represents an MTP3b Signalling Link for the China standard. It represents the termination of the signalling link within the signalling point as defined in GF001-9001, plus supplement 1-3.
+
+The total amount of links between any two specific nodes in the network shall not be more than 16, independent on how many linksets that are defined between the two nodes. The signalLinkCode for a link must be unique between the nodes, independent on which linkSet the link belongs to.
+
+The performance monitoring counters found in Mtp3SlChina MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is shutdown request from CLI (Cluster Interface).
+
+NOTE: This MO cannot in anyway be related (either contain or by dependence) to an MO that belongs to a standard that is NOT the China standard.</description>
+ <attribute name="Mtp3bSlChinaId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>This attribute reflects the operational status of the Mtp3bSl.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="autoStartLink">
+ <description>Controls if the Mtp3b Signalling Link should be activated at create.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="linkCongestLevel">
+ <description>The congestion level of the link.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="CongestLevel">
+ <defaultValue>level_0</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="linkState">
+ <description>The link state of the Mtp3bSl.
+
+The link state is a bit map which contains a combination of the following values: (in hexadecimal format)
+
+0x00 Available
+0x01 Failed
+0x02 Remotely blocked
+0x04 Locally blocked
+0x08 Remotely inhibited
+0x10 Locally inhibited
+0x20 Deactivated</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="prioBeforeSio">
+ <description>This Boolean tells if the message priority shall be inserted in an octet before the Service Indicator Octet (SIO).
+
+China default is false.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="proceduralState">
+ <description>The procedural state of the link.
+
+0 - not initialized
+1 - initialized
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bProceduralState">
+ <defaultValue>NOT_INITIALIZED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="signLinkCode">
+ <description>The signalling link code, SLC, used for this link.
+The signLinkCode for a link must be unique between the nodes,
+independent on in which linkSet the link belongs.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>15</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tpId">
+ <description>The tpId attribute points out the termination point of the lower layer protocol.
+
+For narrowband this signalling link will be connected to an MTP L2 termination point (Mtp2Tp MO). And for broadband it will be connected to a NNI SAAL termination point (NniSaalTp Mo).</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="usageState">
+ <description>There are three possible states for the usageState attribute:
+
+- idle, the Mtp3bSl carries no traffic.
+- active, the Mtp3bSl is working normally, and there is traffic, and it is not congested.
+- busy, the Mtp3bSl is working but is congested (traffic is routed on other links).
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bUsageState">
+ <defaultValue>IDLE</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAALINServiceInd">
+ <description>Performance management counter for number of received link-in-service indications.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAALOUTInd">
+ <description>Performance management counter for number of received link-out-of-service indications.
+
+Note! This counter is incremented every time a link out of service indication is received for the link.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBDSent">
+ <description>Performance management counter for number of sent CBD messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOOXCOSent">
+ <description>Performance management counter for number of sent change over order (COO/XCO) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLocalLinkCongestCeaseRec">
+ <description>Performance monitoring counter for number of local link congestion ceased primitives received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLocalLinkCongestRec">
+ <description>Performance monitoring counter for number of local link congestion primitives received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSURec">
+ <description>Performance monitoring counter for number of received MSU's on this signalling link.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSUSent">
+ <description>Performance monitoring counter for number of sent MSU's on this signalling link.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <action name="activate">
+ <description>This action activates the Mtp3bSl with normal alignment. It will also set autoStartLink = true.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="deactivate">
+ <description>This action deactivates the Mtp3bSl.
+It will also set autoStartLink = false.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="emergencyActivate">
+ <description>This action activates the Mtp3bSl with emergency alignment.
+It will also set autoStartLink = true
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="localInhibit">
+ <description>This action inhibits the Mtp3bSlChina. Signalling link management inhibiting is requested by management when it becomes necessary, e.g for maintenance or testing purposes to make or keep a signalling link unavailable to User Part-generated signalling traffic.
+Inhibiting of a signalling link may be requested by management function at either end of the link. The request is granted, provided that the inhibiting action does not cause any previously accessible destinations to become inaccessible at either end of the signalling link. The request may also be refused under certain circumstances such as congestion.
+Exception FroRequestFailed if it was not possible to inhibit.
+
+Note! This action requires a transaction.
+</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="localUninhibit">
+ <description>This action uninhibits the Mtp3bSlItu.
+
+Exception FrorequestFailed if it was not possible to uninhibit.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ </class>
+
+ <class name="Mtp3bSpChina">
+ <description>Mtp3b Signalling Point for the China standard.
+
+This MO represents/models the MTP3b Signaling Point characteristics/functions according to the China standard.
+A signaling point is a logical node in the signaling network. The combination of signaling points and their interconnecting
+signaling links form the SS No. 7 signaling network. The signaling point represented by this object is a Local Signaling Point.
+
+The performance monitoring counters found in Mtp3SpChina MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is shutdown request from CLI (Cluster Interface).
+
+NOTE: IT IS NOT POSSIBLE TO CREATE SIGNALLING POINTS OF DIFFERENT STANDARDS!
+
+NOTE: This MO cannot in anyway be related (either contain or by dependence) to an MO that belongs to a standard which is NOT the China standard.
+
+NOTE: The combination of network indicator (networkInd) and Signalling Point Code (signallingPointCode) has to be unique for each Signalling Point.
+
+NOTE: A maximum of 15 instances of this MO can be created on (referencing) the same PlugInUnit.
+
+NOTE: The maximum number of Signalling Points that can be created in a CPP based node is 24.
+
+NOTE: Deleting a singel L3 Signal Point is not possible, if it necessary to delete a Signal Point then all Signal Points has to be deleted. This also has to be done whitin the same transaction.
+
+NOTE: Any object created under a certain SP (Signaling Point) cannot refer to an object created under another SP. Nor can it refer to an object created under another SP.</description>
+ <attribute name="Mtp3bSpChinaId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="maxSizeChangeBuf">
+ <description>The maxSizeChangeBuf attribute represents the maximum size (in kB) of the changeover buffer.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>5000</max>
+ </range>
+ <defaultValue>2000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxSizeReroutBuf">
+ <description>The maxSizeReroutBuf attribute represents the maximum size (in kB) of the rerouting buffer.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>5000</max>
+ </range>
+ <defaultValue>2000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="networkInd">
+ <description>The network indicator, NI, is used for discrimination of messages between functionally different networks.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="Mtp3bNetworkInd">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operationalState attribute reflects the operational status of the MTP3b SP.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Holds a list of the reserving MO's. Can be of type SccpSp.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="sendSltmBefLink">
+ <description>The sendSltmBefLink attribute determines if the SLTM (Signalling Link Test Message) should be sent and a SLTA received before the link is considered to be in service.
+
+Note! It is not recommended nor is it in accordance with standard to set the value of this attribute to 'false' </description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="signallingPointCode">
+ <description>The signallingPointCode (Local Point Code) attribute (SPC) is used together with the network indicator (NI, networkInd attribute) to uniquely identify the MTP Signalling Point, SP.
+SP = NI-SPC.
+Size (2 exp 24)-1 (16777215).
+The SignallingPointCode (SPC) is nornally used as a whole unique number (no internal structure). But sometimes the SPC is grouped together as three numbers which corresponds to zone, area/network, signalling point. If this is the case the three numbers are coded as 8-8-8 bits in the total SPC. To enter the SPC-value then you have to convert the three numbers to their binary code and then convert the whole 24-bit pattern as an integer.
+ </description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>16777215</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="nodeBehaviour">
+ <description>The nodeBehaviour attribute represents the MTP3b node type.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="NodeBehaviourType">
+ <defaultValue>SEP</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="noOfCongestLevelForNI">
+ <description>Defines the number of congestion levels for NI.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>3</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="routeSetCongestTestFlag">
+ <description>Selection of which procedure to use during congestion handling if the national option with priorities is used.
+
+0, use TcTimer as described by the TTC standard.
+1, use Route Set Congestion Test as described by the ANSI, ITU and China Standard.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="resendTfcInterval">
+ <description>Send TFC back to originating signalling point code for every n:th message when
+the destination is congested. Set to 0 will suppress sending of TFC.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="sioSpare">
+ <description>The sioSpare attribute determines if the two spare bits in the SIO (Service Information Octet) should be treated as spare.</description>
+ <dataType>
+ <enumRef name="Mtp3bSioSpareBitsUse">
+ <defaultValue>SPARE</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="spPriority">
+ <description>Struct containing the priority attributes.
+
+Note: The China and ITU priorityData is identical so the ItuPriorityData is used for China to avoid duplication of data.</description>
+ <dataType>
+ <structRef name="Mtp3bSpChinaPriorityData"/>
+ </dataType>
+ </attribute>
+ <attribute name="spTimer">
+ <description>Struct containing China specific timer attributes</description>
+ <dataType>
+ <structRef name="Mtp3bSpChinaTimerData"/>
+ </dataType>
+ </attribute>
+ <attribute name="statusIndInterval">
+ <description>The statusIndInterval attribute sets the interval for sending MTP-STATUS indication, i.e. send indication every Nth message .</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="testPatternSltm">
+ <description>The testPatternSltm attribute represents a string testpattern in the Signalling Link Test Message.
+
+Minimum string length 2 characters, maximum 30 characters. Allowed characters are 0-9, A-F.
+Only even number of characters is allowed.
+
+</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>2</min> <max>30</max>
+ </lengthRange>
+ <defaultValue>"A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5"</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="transFrHandler">
+ <description>Determines if a TransFer Restricted signal (TFR) should be treated as a TFA (TransFer Allowed signal) or be ignored.
+</description>
+ <dataType>
+ <enumRef name="Mtp3bTfrHandling">
+ <defaultValue>IGNORED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="rpuId">
+ <description>Holds a reference to the Reliable Program Uniter.
+The RPU is at the server.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ReliableProgramUniter"/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="m3uaNoOfAttempsOfDauds">
+ <description>For M3UA, number of attempts to send the DAUD message.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="noOfAttempsOfAssociationEstablishment">
+ <description>Number of attempts to send the SCTP_ASSOCIATE_REQ message.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>65535</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="version">
+ <description>This attribute shows what MTP3b ITU standard the system follows. With ITU, it is possible using this attribute to set which of the ITU standard versions that shall be followed.
+
+Note! Setting of another value than 'ITU_T_07_96' at create will have no effect. The Signaling Point will always be created with the value 'ITU_T_07_96'.
+
+Note! It is not possible to hav signaling points with different versions in the node so setting of this attribute will effect all signaling points. The value for the last created or changed signaling point will be used for all signaling points.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bItuVersion">
+ <defaultValue>ITU_T_07_96</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBARec">
+ <description>Performance management counter for number of received CBA messages.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBASent">
+ <description>Performance management counter for number of sent CBA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfChangeBackDeclRec">
+ <description>Performance management counter for number of received change Back Declarations (CBD) messages.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfChangeOverRec">
+ <description>Performance counter for number of changeOver order messages (COO/XCO) received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOAXCARec">
+ <description>Performance management counter for number of received COA/XCA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOAXCASent">
+ <description>Performance management counter for number of sent COA/XCA messages.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfControlledRerouteSuccessPerf">
+ <description>Performance monitoring counter for number of successfully performed controlled rerouting.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECASent">
+ <description>Performance management counter for number of sent ECA messages.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECARec">
+ <description>Performance management counter for number of received ECA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECOSent">
+ <description>Performance management counter for number of sent ECO messages.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfEmergencyChangeOverRec">
+ <description>Performance management counter for number of received emergency changeOver orders (ECO) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfForcedRerouteSuccessPerf">
+ <description>Performance monitoring counter for number of successfully performed forced rerouting.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSLTAFirstTimeOutRec">
+ <description>Performance management counter for number of SLTA first time out received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSLTASecondTimeOutRec">
+ <description>Performance management counter for number of SLTA second time out received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTimerT21WasStarted">
+ <description>Performance monitoring counter for number of times the timer T21 was started (i.e. adjacent SP restarted).
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTRARec">
+ <description>Performance management counter for number of received TRA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTRASent">
+ <description>Performance management counter for number of sent TRA messages.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessControlledRerouting">
+ <description>Performance monitoring counter for number of unsuccessfully performed controlled reroutings.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessForcedRerouting">
+ <description>Performance monitoring counter for number of unsuccessfully performed forced reroutings.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUPMsgDiscardedDueToRoutingErr">
+ <description>Performance monitoring counter for number of UP (user part) messages (MTP_TRANSFER_req) discarded due to routing error.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuccessAssocEstablish">
+ <description>Performance management counter for number of successful association establishment.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessAssocEstablish">
+ <description>Performance management counter for number of unsuccessful association establishment.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpCommunicationErr">
+ <description>Performance management counter for number of SCTP communication error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpSendFailure">
+ <description>Performance management counter for number of SCTP send failure.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpBufOverflow">
+ <description>Performance management counter for number of SCTP stop sending data.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpResumeSending">
+ <description>Performance management counter for number of SCTP resume sending data.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpNetworkStatusChange">
+ <description>Performance management counter for number of SCTP network status change.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpAssociationRestart">
+ <description>Performance management counter for number of SCTP association restart.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuccessAssocAbort">
+ <description>The number of successful abortions of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuccessAssocShutDown">
+ <description>The number of succesful shutdowns of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessAssocAbort">
+ <description>The number of unsuccessful abortions of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessAssocShutDown">
+ <description>The number of unsuccesful shutdowns of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIncomingAssocEstabRequestInStateDownWhenStateEstabIsBlocked">
+ <description>The number of incoming request for association establishment when state on the association is 'DOWN' and establishment of associations is blocked. </description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMaxTrialsForAssocEstabReached">
+ <description>The number of times that the max limit for trying to establish an association has been reached.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMaxTrialsForAssocActivReached">
+ <description>The number of times that the max limit for trying to activate an association has been reached.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLowerPrioMsgDiscarded">
+ <description>The number of messages with low priority that has been discarded.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mspg">
+ <description>The MSPG (Multiplex Section Protection Group) object enables two different protection mechanism in Cello. First it enables a standard 1+1 MSP mechanism. A failure on the working line will thus cause a sub 50 ms switch to the standby line.
+Secondly the MSPG is used to enable equipment protection, whereas a failure of the working board will cause a switch to the standby board. While executing an equipment protection switch, the node on the other end of the multiplexer section, will experience a standard 1+1 MSP switch.
+
+It is possible to force traffic to one port/board by using administrative state.
+Setting administrative state to locked on the working board, will automatically cause an equipment switch to the standby board. Similarily setting administrative state to locked on the working port, will cause an MSP switch to the standby port.
+
+The process of configuring a MSP protection interface is as follows:
+1) Create the working interface as normal.
+2) Create the standby interface by creating an Os155SpiTtp with mux mode set to STANDBY (standby for protection).
+3) Create a MSPG object with references to the two Os155SpiTtp objects.
+
+Note! The ports selected for MSPG must be have the attribute standardMode configured in exactly the same way.
+
+Note! The Os155SpiTtp created for standby will not create any children, i.e no Vc4Ttp or Vc4Ttp, Vc12Ttp and E1Ttp will be created. Nor will object of type Sts1SpeTtp, Vt15Ttp or T1Ttp be created.</description>
+ <attribute name="os155SpiWorkingId">
+ <description>The working OS155 pyhiscal path termination.
+This is the administrative value.
+
+To retrive the Id of the current working port, use the selectedPort.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Os155SpiTtp"/>
+ </dataType>
+ </attribute>
+ <attribute name="os155SpiStandbyId">
+ <description>The standby OS155 physical path termination.
+This is the administrative value.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Os155SpiTtp"/>
+ </dataType>
+ </attribute>
+ <attribute name="switchMode">
+ <description>The switching mode.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="SwitchModes">
+ <defaultValue>AUTOMATIC</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the Mspg.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="MspgId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="selectedPort">
+ <description>The port currently selected by the MSPG. The selected port can only
+change due to a MSP or equipment switch.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Os155SpiTtp"/>
+ </dataType>
+ </attribute>
+ <attribute name="selectedBoard">
+ <description>The board currently providing the user traffic interface to the Cello switch.
+The only action that can change the selected board is an equipment switch.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="degCauseMsp">
+ <description>If set to true, then a swith is performed upon detection of DEG.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <action name="manualMspSwitch">
+ <description>Initiates a switch when there does not exist a defect.
+
+This action can fail for the following reasons:
+FailedResource - the switch was not possible due to a traffic affecting fault on the port to which the switch was requested (i.e. the one not currently selected).
+LockedResource - the port to which the switch is intended is administratively locked.
+UnknownReason - there exists another fault that prevents the action.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FailedResourceException"/>
+ <raisesException name="LockedResourceException"/>
+ <raisesException name="UnknownReasonException"/>
+ </action>
+ </class>
+
+ <class name="T1PhysPathTerm">
+ <description>This MO represents an T1 (i.e. 1.5 Mbit/s) physical interface in the node. The T1PhysPathTerm MO does not define which type of traffic (TDM or ATM) that the interface should support.
+Please refer to the Ds0Bundle, AtmPort, IMALink and IMAGroup objects for details about configuration of traffic type.
+
+</description>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="T1PhysPathTermId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="lineNo">
+ <description>The actual Line number on the board.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>8</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="loopback">
+ <description>Possible values
+
+none - This is the normal state, no loop back is performed (and ordinary traffic is running).
+
+line - The physical path is looped on the line side, the external incoming path is looped back to the external outgoing path.
+
+system - The physical path is looped on the system side, the (node-) internal incoming path is looped back to the internal outgoing path.
+
+Note! administrativeStatus must be set to locked when setting loopback attribute.</description>
+ <dataType>
+ <enumRef name="LoopbackState">
+ <defaultValue>none</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmEs">
+ <description>Performance monitoring counter for Errored Seconds, ES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSes">
+ <description>Performance monitoring counter for Severly Errored Seconds, SES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedByTraffic">
+ <description>The identity of the reserving AtmPort MO. </description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="AtmPort"/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Enabled or disabled according to the actual operational state of the Physical Line Termination. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="rdiReporting">
+ <description>Indicates whether Remote Defect Indication, RDI, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="aisReporting">
+ <description>Indicates whether Alarm Indication Signal, AIS, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="shutDownTimeout">
+ <description>The shut-down timer. It is used when the administrativeState is set to shutdown.
+
+Value in seconds, must be a positive value.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100000</max>
+ </range>
+ <defaultValue>1800</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="idlePattern">
+ <description>The idle pattern.
+
+NOTE: Going from A_LAW or U_LAW to UNDEFINED is always allowed but setting up one ET board with
+both U_LAW and A_LAW is not allowed.
+E.g. If you want to change from A_LAW to U_LAW on one ET board you have to change idlePattern
+on each physical port belonging to the board to UNDEFINED first.
+A_LAW -&gt; UNDEFINED -&gt; U_LAW or U_LAW -&gt; UNDEFINED -&gt; A_LAW</description>
+ <dataType>
+ <enumRef name="IdlePattern">
+ <defaultValue>UNDEFINED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="transmissionMode">
+ <description>The type of transmission media.
+Refer to the TransmissionMode enumeration for details.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="TransmissionMode">
+ <defaultValue>S_133</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBySync">
+ <description>The identity of the reserving Synchronization MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Synchronization"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedByImaLink">
+ <description>The identity of the reserving ImaLink MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ImaLink"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="ImaGroup">
+ <description>IMA, Inverse Multiplexing for ATM, makes it possible to group several physical
+interfaces together to form a virtual physical pipe for atm. The capacity of this
+pipe is equal to the sum of each of the physical interfaces included in the
+group.
+
+When IMA should be configured, an ATMPort MO is created with reference to an
+IMAGroup MO rather than a pure physical interface MO.
+The IMAGroup MO in turn is created with a list of the physical port MO's that
+are included in the group. The physical port MO's must be of the same type
+and be located on the same ET board.
+
+For each of the physical port MO's included in the IMAGroup, an IMALink object
+is automatically created. The IMALink object is responsible for handling link
+specific performance and fault management related to IMA.
+
+The ports can be of type E1PhysPathTerm, J1PhysPathTerm, T1PhysPathTerm, E1Ttp, T1Ttp.
+
+The performance monitoring counters in the ImaGroup MO is set to 0 (zero) at start or restart of the node.
+When the value is to large too fit in to a long (31bit) the counter turns over and starts from 0 again.
+
+Note! A general restriction in Cello is that ports being part of the same IMA group
+must be located on the same board.
+
+Note! Only termination points on Etmc1 and Etmc41 boards are allowed as ImaLinks.
+
+Note! At least two links has to be configured in an Ima Group.</description>
+ <attribute name="ImaGroupId">
+ <description>The identity of the MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="physicalPortList">
+ <description>Holds a list of the physical ports connected to the ImaGroup.
+Can be of type:
+E1PhysPathTerm,
+J1PhysPathTerm,
+T1PhysPathTerm,
+E1Ttp,
+T1Ttp.</description>
+ <mandatory/>
+ <noNotification/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="requiredNumberOfLinks">
+ <description>The required number of links specifies the number of IMALinks that needs to be
+operational in order for the complete group to be operational. The bandwidth
+available for the ATMPort (and thus for creating VP/VC connections) is defined
+by this number.
+Setting the requiredNumberOfLinks field to K less than the number of physical
+links included in the IMAGroup, will reduce the bandwidth available to the atmport
+with the corresponding bandwidth but will also give the effect that K links
+failures can be tolerated with virtually no traffic disturbance.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>8</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="activeLinks">
+ <description>The number of active links in the ImaGroup.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Enabled or disabled according to the actual operational state of the ImaGroup.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmGrUasIma">
+ <description>This performance counter reflects the GrUasLma attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmGrFc">
+ <description>This performance counter reflects the GrFc attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmGrFcFe">
+ <description>This performance counter reflects the GrFcFe attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="AtmPort"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="ImaLink">
+ <description>This MO is automatically created as a consequence of creating an IMAGroup or
+adding links to an IMAGroup.
+It provides IMA Link specific performance and fault management information.
+
+The links can be of type E1PhysPathTerm, J1PhysPathTerm, T1PhysPathTerm, E1Ttp or T1Ttp.
+
+The performance monitoring counters in the ImaLink MO is set to 0 (zero) at start or restart of the node.
+When the value is to large too fit in to a long (31bit) the counter turns over and starts from 0 again.
+
+Note! A general restriction in Cello is that ports being part of the same IMA group
+must be located on the same board.</description>
+ <attribute name="operationalState">
+ <description>Enabled or disabled according to the actual operational state of the ImaLink.
+If the operationalState is disabled the ImaLink will be blocked for traffic.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmIvIma">
+ <description>This performance counter reflects the LvLma attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ImaLinkId">
+ <description>The identity of the MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="pmOifIma">
+ <description>This performance counter reflects the OifLma attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSesIma">
+ <description>This performance counter reflects the SesLma attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSesImaFe">
+ <description>This performance counter reflects the SesLmaFe attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUasIma">
+ <description>This performance counter reflects the UasLma attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUasImaFe">
+ <description>This performance counter reflects the UasLmaFe attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmTxUusIma">
+ <description>This performance counter reflects the TxUusLma attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmRxUusIma">
+ <description>This performance counter reflects the RxUusLma attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmTxUusImaFe">
+ <description>This performance counter reflects the TxUusLmaFe attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmRxUusImaFe">
+ <description>This performance counter reflects the RxUusLmaFe attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmTxFc">
+ <description>This performance counter reflects the TxFc attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmRxFc">
+ <description>This performance counter reflects the RxFc attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmTxFcFe">
+ <description>This performance counter reflects the TxFcFe attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmRxFcFe">
+ <description>This performance counter reflects the RxFcFe attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmTxStuffIma">
+ <description>This performance counter reflects the TxStuffLma attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmRxStuffIma">
+ <description>This performance counter reflects the RxStuffLma attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="uses">
+ <description>Reference to the physical port represented by this MO.
+Can be of types E1PhysPathTerm, J1PhysPathTerm, T1PhysPathTerm, E1Ttp or T1Ttp.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Sts3CspeTtp">
+ <description>This MO represents the termination of the SONET higher order paths.
+This MO is automatically created when creating the OS155SPITTP with mux mode
+set to VC4_STS3CSPE_LEVEL and standardMode set to ANSI.
+
+The performance monitoring counters in the Sts3CspeTtp MO is set to 0 (zero) at start or restart of the node.
+When the value is to large to fit in to a long (31bit) the counter turns over and starts from 0 again.</description>
+ <attribute name="Sts3CspeTtpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>enabled or disabled according to the actual operational state of the Sts3CspeTtp.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="aisPReporting">
+ <description>Indicates whether Alarm Indication Signal, AIS, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="rdiPReporting">
+ <description>Indicates whether Remote Defect Indication, RDI, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="timConsequentAction">
+ <description>Trace Identifier Mismatch (TIM) consequent action, i.e. for generation of Alarm Indication Signal (AIS) downstream and Remote Defect Indication (RDI) upstream as a consequence of the TIM detection.
+
+True - enabled.
+False - disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="expectedPathTrace">
+ <description>Expected path trace.
+
+The string can be of 64 characters length, or empty string ("").
+The string shall consist of 62 ASCII characters followed by CR/LF.
+The empty string shall be coded with the first character equal to ASCII null (i.e. byte value 0) and the rest dummy or non-existing.
+
+Note: An empty string for this attribute means that the detection of Trace Identifier Mismatch (TIM) should be disabled. This attribute is set to empty string every time attribute pathTraceFormat is set.</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>64</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="transmittedPathTrace">
+ <description>The transmitted path trace.
+
+The string shall consist of 62 ASCII characters followed by CR/LF.
+The empty string shall be coded with the first character equal to ASCII null (i.e. byte value 0) and the rest dummy or non-existing.</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>64</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Identity of the AtmPort reserving this MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="AtmPort"/>
+ </dataType>
+ </attribute>
+ <attribute name="pmEsp">
+ <description>Performance Monitoring counter for ES, Errored Seconds.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSesp">
+ <description>Performance Monitoring counter for Severely Errored Seconds, SES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="WebServer">
+ <description>The WebServer MO represents the WebServer in the node.
+
+This object is used for configuration of the WebServer paths. By connecting this object to a
+SwAllocation MO that is connected to a Repertoire MO the WebServer paths will be
+automatically configured during system upgrade.
+
+The local distinguished name of this MO is ManagedElement=1, WebServer=1.
+
+The WebServer MO is created automatically by the system.</description>
+ <systemCreated/>
+ <attribute name="WebServerId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="webServerPaths">
+ <description>Paths that shall be used by the WebServer separated by the delimiter character ":".</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBySwAllocation">
+ <description>List of reserving MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="SwAllocation"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="IpAccessAutoConfig">
+ <description>This MO represents the Auto Configuration feature for the IpAccessHost's in Cello.
+
+</description>
+ <attribute name="IpAccessAutoConfigId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Hold a list of the identitys of the reserving IpAccessHost's.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="networkPrefix">
+ <description>The network prefix.
+
+The prefix denotes how many bits that are used for calculating the subnet mask.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>32</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="nrOfUnusedAdresses">
+ <description>The number of addresses in the range that are not used.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="totalNrOfAddresses">
+ <description>The total number of addresses in the range.
+
+Note that the first address in the range will be the same one as the one for networkAddress.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="minIpAddress">
+ <description>The lowest value that can be used as host IP address. If autoConfig=ON for an IpAccessHost, the operator does not explicitly have to assign an Ip Address and prefixLength to the host. This is done by the Control Plane, based on the IpAccesAutoConfig identity specified for the IpAccessHost.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="maxIpAddress">
+ <description>The highest value that can be used as host IP address. If autoConfig=ON for an IpAccessHost, the operator does not explicitly have to assign an Ip Address and prefixLength to the host. This is done by the Control Plane, based on the IpAccesAutoConfig identity specified for the IpAccessHost.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="IpAccessHostMsb">
+ <description>This MO represents the Ip Access Host used for payload. This host type executes on a MSB board (Media Stream Board used by Media Gateway).
+
+Note! If autoConfig is set to ON, the Ip Addresses and the Prefixes for this MO is set by the IpAccessAutoConfig MO.
+
+Note! There can be a maximum of 128 host's in the node.
+
+Note! The references to Aal5TpVccTp MO's has to be set in pairs.
+
+Note! The IpAccessMsbHost must execute on the sam MP as the Aal5TpVccTp that are defined in the attributes 'aal5TpVccTpRef1' and 'aal5TpVccTpRef2'.
+
+Note! The 'administrativeState' has to be set to LOCKED in order to be able to delete this host.</description>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the Ip Access Host.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>DEGRADED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state of the Ip Access Host.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="shutDownTimer">
+ <description>The shut-down timer. It is used when the administrativeState is set to shutdown.
+
+Value in seconds, must be a positive value.</description>
+ <dataType>
+ <long>
+ <defaultValue>10</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="dspId">
+ <description>The identity of the DSP (Digital Signalling Processor) on a MSB board.
+
+Note! The value of this attribute has to be unique among the host's that execute on the same board.</description>
+ <mandatory/>
+ <noNotification/>
+ <nonPersistent/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>16</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="aal5TpVccTpRef1">
+ <description>Holds a reference to an Aal5 termination point (Aal5TpVccTp MO).
+
+Note! The Aal5TpVccTp references are mutually exclusive.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Aal5TpVccTp"/>
+ </dataType>
+ </attribute>
+ <attribute name="aal5TpVccTpRef2">
+ <description>Holds a reference to an Aal5 termination point (Aal5TpVccTp MO).
+
+Note! The Aal5TpVccTp references are mutually exclusive.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Aal5TpVccTp"/>
+ </dataType>
+ </attribute>
+ <attribute name="autoConfig">
+ <description>This attribute specifies whether the auto configuration feature for the Ip Access Host is used or not.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="AutoConfigurationMode">
+ <defaultValue>OFF</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="autoConfigIdentity">
+ <description>The identity of the IpAccessAutoConfig MO used by this host.
+
+Note! This attribute can only be set if 'autoConfig' is set to 'ON'.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="IpAccessAutoConfig"/>
+ </dataType>
+ </attribute>
+ <attribute name="ipAddress">
+ <description>The IpAddress.
+
+Note! If autoConfig = OFF this attribute is mandatory.
+
+Note! If the autoConfiguration is used for this IpAccessHost (autoConfig = ON) this attribute cannot be set. This attribute is then set by the 'IpAccessAutoConfig MO'.
+
+Note! The IpAddress has to be unique within the node.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="networkPrefix">
+ <description>The network prefix.
+
+The prefix denotes how many bits that are used for calculating the subnet mask.
+
+Note! If auto configuration is used (autoConfig = ON) this attribute cannot be set, the networkPrefix is then set in the ipAccessAutoConfig MO class.
+
+Note! If auto configuration is not used (autoConfig = OFF) this attribute must be set.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>32</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="linkStatusAddress">
+ <description>The link Status for Ip Address.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="mtu">
+ <description>The maximum transfer unit.
+
+Note! in order to be able to set the value for this attribute, the administrative state has to be locked.
+
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>72</min> <max>2048</max>
+ </range>
+ <defaultValue>1024</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="ipDefaultTtl">
+ <description>The default value inserted into the Time-To-Live field of the IP header of datagrams originated at this entity,
+whenever a TTL value is not supplied by the transport layer protocol.
+
+Note! in order to be able to set the value for this attribute, the administrative state has to be locked.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>255</max>
+ </range>
+ <defaultValue>50</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInReceives">
+ <description>The total number of input datagrams received from interfaces, including those received in error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInHdrErrors">
+ <description>The number of input datagrams discarded due to errors in their IP headers, including bad checksums, version number
+mismatch, other format errors, time-to-live exceeded, errors discovered in processing their IP options, etc.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInAddrErrors">
+ <description>The number of input datagrams discarded because the IP address in their IP header's destination field was not a
+valid address to be received at this entity. This count includes invalid addresses (e.g., 0.0.0.0) and addresses of
+unsupported Classes (e.g., Class E). For entities which are not IP routers and therefore do not forward datagrams,
+this counter includes datagrams discarded because the destination address was not a local address.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInUnknownProtos">
+ <description>The number of locally-addressed datagrams received successfully but discarded because of an unknown or
+unsupported protocol.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInDiscards">
+ <description>The number of input IP datagrams for which no problems were encountered to prevent their continued processing, but which
+were discarded (e.g., for lack of buffer space). Note that this counter does not include any datagrams discarded while
+awaiting re-assembly.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInDelivers">
+ <description>The total number of input datagrams successfully delivered to IP user-protocols (including ICMP).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpOutRequests">
+ <description>The total number of IP datagrams which local IP user-protocols (including ICMP) supplied to IP in requests for
+transmission. Note that this counter does not include any datagrams counted in ipForwDatagrams</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpOutDiscards">
+ <description>The number of output IP datagrams for which no problem was encountered to prevent their transmission to their
+destination, but which were discarded (e.g., for lack of buffer space). Note that this counter would include
+datagrams counted in ipForwDatagrams if any such packets met this (discretionary) discard criterion.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInMsgs">
+ <description>The total number of ICMP messages which the entity received.
+Note that this counter includes all those counted by icmpInErrors</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInErrors">
+ <description>The number of ICMP messages which the entity received but determined as having
+ICMP-specific errors (bad ICMP checksums, bad length, etc.).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInDestUnreachs">
+ <description>The number of ICMP Destination Unreachable messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInTimeExcds">
+ <description>The number of ICMP Time Exceeded messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInParamProbs">
+ <description>The number of ICMP Parameter Problem messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInSrcQuenchs">
+ <description>The number of ICMP Source Quench messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInRedirects">
+ <description>The number of ICMP Redirect messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInEchos">
+ <description>The number of ICMP Echo (request) messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInEchoReps">
+ <description>The number of ICMP Echo Reply messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutMsgs">
+ <description>The total number of ICMP messages which this entity attempted to send.
+Note that this counter includes all those counted by icmpOutErrors.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutErrors">
+ <description>The number of ICMP messages which this entity did not send due to problems discovered within ICMP such as a lack of
+buffers. This value should not include errors discovered outside the ICMP layer such as the inability of IP to route the
+resultant datagram. In some implementations there may be no types of error which contribute to this counter's value.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutDestUnreachs">
+ <description>The number of ICMP Destination Unreachable messages sent.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutParmProbs">
+ <description>The number of ICMP Parameter Problem messages sent.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutEchos">
+ <description>The number of ICMP Echo (request) messages sent.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutEchoReps">
+ <description>The number of ICMP Echo Reply messages sent.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUdpInDatagrams">
+ <description>The total number of UDP datagrams delivered to UDP users.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUdpNoPorts">
+ <description>The total number of received UDP datagrams for which there was no application at the destination port.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUdpInErrors">
+ <description>The number of received UDP datagrams that could not be delivered for
+reasons other than the lack of an application at the destination port.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUdpOutDatagrams">
+ <description>The total number of UDP datagrams sent from this entity.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="IpAccessHostMsbId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="plugInUnitId">
+ <description>Holds a reference to the PlugInUnit.
+
+Note that the 'plugInUnitId has to be the same as the one defined in the attribute 'processorId' found on the Aal5TpVccTpMo.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="PlugInUnit"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Aal2QosProfile">
+ <description>This MO represents the definitions of properties for a set of Aal2 quality of service classes.</description>
+ <attribute name="Aal2QosProfileId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="profileClassA">
+ <description>This attribute holds the values applicable for QoS Class A.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="QoSProfileClassA"/>
+ </dataType>
+ </attribute>
+ <attribute name="profileClassB">
+ <description>This attribute holds the values applicable for QoS Class B.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="QoSProfileClassB"/>
+ </dataType>
+ </attribute>
+ <attribute name="profileClassC">
+ <description>This attribute holds the values applicable for QoS Class C.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="QoSProfileClassC"/>
+ </dataType>
+ </attribute>
+ <attribute name="profileClassD">
+ <description>This attribute holds the values applicable for QoS Class D.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="QoSProfileClassD"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving Aal2PathVccTp MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="Aal2PathVccTp"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Aal2QosCodePointProfile">
+ <description>This MO represents the QoS CodePoints for the different Aal2 QoS classes.</description>
+ <attribute name="Aal2QosCodePointProfileId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="qualityOfServiceCodePointA">
+ <description>The Code Point for Class A.
+
+Recommended value for Class A, 128.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="qualityOfServiceCodePointB">
+ <description>The Code Point for Class B.
+
+Recommended value for Class B, 129.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="qualityOfServiceCodePointC">
+ <description>The Code Point for Class C.
+
+Recommended value for Class C, 130.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="qualityOfServiceCodePointD">
+ <description>The Code Point for Class D.
+
+Recommended value for Class D, 131.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Holds the identity of the reserving Aal2Ap Mo.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="Aal2Ap"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="M3uAssociation">
+ <description>This MO represents the M3UA Association part of the M3UA (MTP3-User Adaptaion Layer) that is a protocol
+for the transport of any SS7 MTP3-User signalling (e.g., ISUP and SCCP messages) over IP using the services
+of the Stream Control Transmission Protocol.
+
+Note that the local port number is hard coded to 2905.
+
+
+</description>
+ <attribute name="M3uAssociationId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Holds a list of the reserving Signaling Route's (Mtp3bSr MO).
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="Mtp3bSr"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The Operational State of the M3Ua</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="mtp3bSrsId">
+ <description>The identity of the Signalling Route Set used.</description>
+ <mandatory/>
+ <noNotification/>
+ <nonPersistent/>
+ <restricted/>
+ <dataType>
+ <moRef name="Mtp3bSrs"/>
+ </dataType>
+ </attribute>
+ <attribute name="sctpId">
+ <description>The SctpHost used by this association.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Sctp"/>
+ </dataType>
+ </attribute>
+ <attribute name="dscp">
+ <description>The DSCP, DiffServCodePoint, for the internal M3UA user.
+Only one DSCP value is valid and set by the first defined MO 'instance'.
+
+NOTE: The value set for the 'dscp' when creating the first M3uAssociation under a signaling point will also be used for all other M3uAssociation MO's that are created under this signaling point. So setting the value for the 'dscp' on other instances than the first one created will have no effect. Note that associations created under a different signaling point can have a different dscp-value. </description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>63</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="associationState">
+ <description>The possible states of an M3Ua association.
+
+Bit 1 = 1 indicates INACTIVE
+Bit 2 = 1 indicates ACTIVE
+Bit 3 = 1 indicates ESTABLISHED
+Bit 4 = 1 indicates DOWN
+
+These values are mutually exclusive.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>15</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="localIpMask">
+ <description>This attribute denotes whether single or multi homing is used.
+
+Note! that all M3uAssociations that refers to the same SCTP MO must have this attribute set to the same value.
+
+Note! If localipMask=2 or localipMask=3 . the attribute ipAddress2 or autoConfigIdentity2 in IpAccessHostGpb MO must be defined.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="HomingState">
+ <defaultValue>SINGLE_HOMED_1</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="autoStartAssociation">
+ <description>If true, the M3ua layer in the stack will after a restart, start up all signalling associations.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="remotePortNumber">
+ <description>The port number of the remote signalling point (SP).</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>2905</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="remoteIpAddress1">
+ <description>Remote IpAddress 1, if not used the value should be an empty string.
+Range is 0.0.0.0 - 255.255.255.255
+
+Note! This address is concidered as the primary IP-address. In case of association establisment failure 'remoteIpAddress2' will be used.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="remoteIpAddress2">
+ <description>Remote IpAddress 2, if not used the value should be an empty string.
+Range is 0.0.0.0 - 255.255.255.255
+
+Note! This address cannot be the same as remoteIpAddress1. This address is used when trying to establish association in case association attempt using 'remoteIpAddress1' fails.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCommunicationLost">
+ <description>Number of communication losses.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCongestions">
+ <description>Number of congestions.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDunaRec">
+ <description>Number of DUNA messages received through the association.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDavaRec">
+ <description>Number of DAVA messages received through the association.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSconRec">
+ <description>Number of SCON messages received through the association.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDupuRec">
+ <description>Number of DUPU messages received through the association.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDataMsgSent">
+ <description>The number of data messages sent on the associations related to this signalling point.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDunaSent">
+ <description>Number of DUNA messages sent through the association.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDavaSent">
+ <description>Number of DAVA messages sent through the association.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSconSent">
+ <description>Number of SCON messages sent through the association.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDupuSent">
+ <description>Number of DUPU messages sent through the association.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDataMsgRec">
+ <description>Number of DATA (payload data) messages received through the association.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfErrorMsgRec">
+ <description>Number of ERROR messages received through the association.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfErrorMsgSent">
+ <description>Number of ERROR messages sent through the association.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfNotifyMsgRec">
+ <description>Number of NOTIFY messages received through the association.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDaudMsgSent">
+ <description>The number of daud messages sent on the associations related to this signalling point.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDaudMsgRec">
+ <description>The number of daud messages received on the associations related to this signalling point.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspupSent">
+ <description>The number of ASPUP sent.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspupReceived">
+ <description>The number of ASPUP received.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspdnSent">
+ <description>The number of ASPDN sent.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspdnReceived">
+ <description>The number of ASPDN received.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspacSent">
+ <description>The number of ASPAC sent.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspacReceived">
+ <description>The number of ASPAC received.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspiaSent">
+ <description>The number of ASPIA sent.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspiaReceived">
+ <description>The number of ASPIA received.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspupAckSent">
+ <description>The number of ASPUP_Ack sent.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspupAckReceived">
+ <description>The number of ASPUP_Ack received.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspdnAckSent">
+ <description>The number of ASPDN_Ack sent.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspdnAckReceived">
+ <description>The number of ASPDN_Ack received.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspacAckSent">
+ <description>The number of ASPAC_Ack sent.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspacAckReceived">
+ <description>The number of ASPAC_Ack received.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspiaAckSent">
+ <description>The number of ASPIA_Ack sent.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspiaAckReceived">
+ <description>The number of ASPIA_Ack received.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfM3uaDataMsgDiscarded">
+ <description>The number of data Messages discarded.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <action name="setAutoActivate">
+ <description>This action starts the association.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="setAutoDown">
+ <description>This action stops the association.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ </class>
+
+ <class name="Sctp">
+ <description>This MO represents the SCTP, Stream Control Transmission Protocol in Cello.
+SCTP is designed to transport signaling messages over IP networks.</description>
+ <attribute name="SctpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the Ip Access Host.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="numberOfAssociations">
+ <description>The maximum number of M3uAssociations that can be handled by this SCTP MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>512</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Holds a list of the M3Ua's handled by the SCTP.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="M3uAssociation"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="ipAccessHostGpbId">
+ <description>The identity of the IpAccessHostGbp reserved by this MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="IpAccessHostGpb"/>
+ </dataType>
+ </attribute>
+ <attribute name="minimumRto">
+ <description>The minimum value for RTO (Retransmission time-out).
+The minimumRto shall be larger than tSack + expected Round Trip Time.
+
+Unit is second/100.
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>4</min> <max>500</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maximumRto">
+ <description>The maximum value for RTO (Retransmission time-out).
+
+Unit is second/100.
+
+maximumRto must be larger than minimumRto.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>4</min> <max>180000</max>
+ </range>
+ <defaultValue>15</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="initialRto">
+ <description>The initial value that the RTO (Retransmission time-out) will take prior to the first RTT (Round Trip Time) measure.
+
+Note that the value for 'initialRto' has to be equal to or greater than 'minimumRto'.
+
+Unit is seconds/100.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>4</min> <max>180000</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="rtoAlphaIndex">
+ <description>This parameter is used for computing the value of the SRTT (Smoothed Round Trip Time) for a specific destination
+address. Is is used to weight the RTT values, and it's value must be between 0 and 1 (0 &lt; rtoAlpha &lt; 1). A value
+close to 1 gives a higher importance to the last RTT measurement.
+The range of possible values in the configuration file and the actual value given to this parameter within the module
+are the following:
+
+rtoAlphaIndex = 1 -&gt; RTO-Alpha = 1/2
+rtoAlphaIndex = 2 -&gt; RTO-Alpha = 1/4
+rtoAlphaIndex = 3 -&gt; RTO-Alpha = 1/8
+rtoAlphaIndex = 4 -&gt; RTO-Alpha = 1/16</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>4</max>
+ </range>
+ <defaultValue>3</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="rtoBetaIndex">
+ <description>This parameter is used for computing the the value of RTTVar (Round Trip Time Variation) of a destination
+address.
+It's value must be between 0 and 1 (0 &lt; rtoBetaIndex &lt; 1). A value close to 1 gives more importance to the
+last observed variation.
+The range of possible values in the configuration file and the actual value given to this parameter within the module
+are the following:
+
+rtoBetaIndex = 1 -&gt; RTO-Beta = 1/2
+rtoBetaIndex = 2 -&gt; RTO-Beta = 1/4
+rtoBetaIndex = 3 -&gt; RTO-Beta = 1/8
+rtoBetaIndex = 4 -&gt; RTO-Beta = 1/16
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>4</max>
+ </range>
+ <defaultValue>2</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="validCookieLife">
+ <description>This parameter sets up the lifespan of the State Cookie sent in the INIT_ACK chunk. It is used for limiting the
+the valid amount of time between sending the INIT_ACK and the reception of a COOKIE_ECHO chunk when
+establishing an association.
+If a COOKIE_ECHO chunk arrives after 'validCookieLife' has expired when sending an INIT_ACK chunk, the
+COOKIE_ECHO shall be discarded and no association will be established.
+
+Unit is seconds.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>180</max>
+ </range>
+ <defaultValue>60</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="allowedIncrementCookieLife">
+ <description>The sender of an INIT chunk may request to the remote endpoint a cookie life-span increase (for example, if a previous attempt to
+connect failed due to a state-cookie error). If the value sent in the "Cookie Preservative field" of the INIT chunk is less or equal to
+this parameter, the reciver of the INIT chunk will increase the 'validCookieLife' with the number of seconds specified. If the value
+present in the "Cookie Preservative field" is higher than this parameter, the cookie life should be incremented with the number of
+seconds specified by the parameter.
+
+Unit is seconds.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>180</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="keyChangePeriod">
+ <description>Defines how often the secret key used for computing the MAC (Message Authentication Code) on the State Cookie is changed.
+
+Unit is seconds.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>180</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="associationMaxRtx">
+ <description>This is the maximum number of consecutive retransmissions to a remote peer (on all the destination transport addresses of the peer, if it's multi homed). If the number of retransmissions becomes higher than this value, the remote peer shall be considered unreachable and the association shall be closed down.
+
+The value of this attribute should be greater than, or equal to the value of the attribute 'pathMaxRtx'.
+
+Note that for a specific association, it might happen that all the remote addresses (if the the remote end is multi homed) becomes unreachable without exceeding the 'associationMaxRtx'. In such a case the association will be closed down.
+
+Note! The value need to be increased to avoid frequent CommLost's in case of an unstable network.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>20</max>
+ </range>
+ <defaultValue>2</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pathMaxRtx">
+ <description>Maximum number of consecutive retransmissions to a remote transport address. If the number of retransmissions becomes higher than this value, the remote transport address shall be considered as "inactive" and no data shall be sent to it. If all of the remote transport addresses becomes "inactive", tha association will be closed down.
+
+Note! The value need to be increased to avoid frequent CommLost's in case of an unstable network.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>20</max>
+ </range>
+ <defaultValue>2</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxInitialRtrAtt">
+ <description>The maximum nimber of retransmissions allowed for both INIT and COOKIE_ECHO chunks. If the number of retransmissions
+exceeds this value, then the SCTP must abort the initialization of the association and report the error to the user.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>16</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxShutDownRtrAtt">
+ <description>The maximum number of retransmission during the shutdown phase of an association.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>16</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="heartbeatInterval">
+ <description>The amount of time added to the RTO (Retransmission Time Out) of a specific address when setting up the period of
+time between sending heartbeats. Small values can lead to an earlier detection of unreachable addresses than higher
+values. Note that sendig often might lead to performace penalty.
+
+Unit is seconds.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>1800</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="heartbeatStatus">
+ <description>This attribute enables/disables heartbeats for associations.
+
+True = Enables</description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="maxIncomingStream">
+ <description>This is the maximum incoming streams (MIS) for an association. Established associations might have an IS less or equal to
+this, but it's MIS can never be higher than the value of this attribute.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>16384</max>
+ </range>
+ <defaultValue>17</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxOutgoingStream">
+ <description>The maximum number of outgonig streams for an association.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>16384</max>
+ </range>
+ <defaultValue>17</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxUserDataSize">
+ <description>The maximum number of bytes a user is allowed to pass as a non fragmentable user data in a SCTP_SEND_REQ message
+(fixed user MTU):
+The values for this attribute is 'user' data and do not include IP header (20 bytes), SCTP header (12 bytes) or DATA chunk
+header (16 bytes).
+
+Unit is bytes.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>528</min> <max>65484</max>
+ </range>
+ <defaultValue>1432</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="mBuffer">
+ <description>This attribute sets the size of the buffer used for storing user data pending to be sent or retransmitted in an association. I.e. establish the maximum amount of user data that SCTP shall buffer before discarding user messages.
+
+The Unit is in kilo bytes.
+
+Note! The restriction on this attribute is:
+mBuffer x number of M3uAssociation MOs connected to this Sctp + 20 Mb &lt;= the heap for Sctp program.
+
+Note! The value may need to be increased to ensure stable dataflow at high load.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>2048</max>
+ </range>
+ <defaultValue>128</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="nThreshold">
+ <description>This attribute sets the value of the threshold used by SCTP to stop the delivery of data on anassociation.
+Once nThreshold or more bytes are queued and pending to be sent, the SCTP layer shall issue an indication to the user.
+The value of nThreshold should be less than mBuffer in order to be effective. A normal value for nThreshold is 3/4 * mBuffer.
+
+Unit is kilo bytes.
+
+Note! The value may need to be increased to ensure stable dataflow at high load.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>2048</max>
+ </range>
+ <defaultValue>96</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tSack">
+ <description>The delay of sending the SACK. I.e. the time from DATA chunk reception to Sack chunk sending.
+
+Unit is second/100</description>
+ <dataType>
+ <long>
+ <range>
+ <min>2</min> <max>50</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxDataSizeIp">
+ <description>The maximum number of bytes SCTP shall be able to fetch every time it reads from the socket.
+
+Note! This value includes the Ip header, 20 bytes.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1500</min> <max>65535</max>
+ </range>
+ <defaultValue>8192</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="initialAdRecWin">
+ <description>The value of the initial advertised reciver window.
+
+Note! The range is 1500 to maxDataSizeIp.
+
+Unit is bytes.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1500</min> <max>65535</max>
+ </range>
+ <defaultValue>8192</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="intervalOobPkts">
+ <description>The number of seconds for the interval for which the counter for out of the blue chunks will be reset.
+
+Unit is seconds.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>6500</max>
+ </range>
+ <defaultValue>3600</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="intervalLostUser">
+ <description>The number of seconds for the interval for which the SCTP will decide that the SCTP user that lost the
+connection is dead. After the time specified in this attribute has elapsed, all associations related to the
+SCTP user will be destroyed.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>3600</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxBurst">
+ <description>The number of packages that will be sent during the fast retransmit phase when a SACK is processed.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>16384</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="nPercentage">
+ <description>The size of 'n' inpercentage when SCTP_CONGESTION_CEASE_IND is sent. At 100 percent the
+primitive will buffer usage goes below 'nThreshold'.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>85</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="bundlingActivated">
+ <description>This attribute enables/disables the use of bundling.
+Valid values:
+1: enabled.
+0: disabled.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="bundlingTimer">
+ <description>This attribute specifies maximum SCTP bundling delay.
+Value=0 means that SCTP will only bundle what is available and send directly (no delay).
+Unit is milliseconds</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>1000</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpCurrEstab">
+ <description>Number of SCTP associations for which the current state is either ESTABLISHED, SHUTDOWN-PENDING, or SHUTDOWN-RECEIVED.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpActiveEstab">
+ <description>Number of times that SCTP associations have made a direct transition to the ESTABLISHED state from the COOKIE-ECHOED state.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpPassiveEstab">
+ <description>Number of times that SCTP associations have made a direct transition to the ESTABLISHED state from the CLOSED state.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpAborted">
+ <description>Number of times that SCTP associations have made a direct transition to the CLOSED state from any state using the primitive ABORT.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpShutdowns">
+ <description>Number of times that SCTP associations have made a direct transition to the CLOSED state from either the SHUTDOWN-SENT state or the SHUTDOWN-ACK-SENT state.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatAssocOutOfBlue">
+ <description>Number of out of the blue packets (SCTP packet correctly formed-right checksum- but the receiver is not able to identify the association to which this packet belongs) received by the host.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatSentChunks">
+ <description>Number of complete data chunks sent to the peers (no retransmissions included).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatRecChunks">
+ <description>Number of complete data chunks received from the peers (no retransmissions included).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatOutOfOrderSendChunks">
+ <description>Number of unordered chunks sent to the peers.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatOutOfOrderRecChunks">
+ <description>Number of unordered chunks received from the peers.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatChecksumErrorCounter">
+ <description>Number of SCTP packets received from the peers with an invalid checksum.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatRetransChunks">
+ <description>Number of data chunks retransmitted to the peers.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatSentControlChunks">
+ <description>Number of datagrams sent with chunk type id &gt; 0.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatReceivedControlChunks">
+ <description>Number of datagrams Receivedwith chunk type id &gt; 0.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatFragmentedUserMsg">
+ <description>Number of fragmented user messages, incremented when the first data chunk of a fragmented message is sent.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatReassembledUserMsg">
+ <description>Number of reassembled user messages, incremented when the first data chunk of a fragmented message is received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatSentPackages">
+ <description>Number of SCTP packages sent.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatReceivedPackages">
+ <description>Number of SCTP packages Received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatCommStop">
+ <description>Number of times the SCTP has sent a communication stop indication to the user.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatCommResume">
+ <description>Number of times SCTP has sent a communication resume indication to the user.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatSentChunksDropped">
+ <description>Number of sent chunks that SCTP has been forced to drop due to buffer overflow in the sending buffer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatRecChunksDropped">
+ <description>Number of received chunks that SCTP has been forced to drop due to buffer overflow in the receiving buffer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Sts1SpeTtp">
+ <description>This MO represents the termination of the SONET higher order paths.
+This MO is automatically created when creating the OS155SPITTP with mux mode
+set to E1_J1_T1_LEVEL and standardmode set to ANSI.
+
+The performance monitoring counters in the Sts1SpeTtp MO is set to 0 (zero) at start or restart of the node.
+When the value is to large to fit in to a long (31bit) the counter turns over and starts from 0 again.</description>
+ <attribute name="Sts1SpeTtpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>enabled or disabled according to the actual operational state of the Sts3CspeTtp.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="aisPReporting">
+ <description>Indicates whether Alarm Indication Signal, AIS, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="rdiPReporting">
+ <description>Indicates whether Remote Defect Indication, RDI, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="timConsequentAction">
+ <description>Trace Identifier Mismatch (TIM) consequent action, i.e. for generation of Alarm Indication Signal (AIS) downstream and Remote Defect Indication (RDI) upstream as a consequence of the TIM detection.
+
+True - enabled.
+False - disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="expectedPathTrace">
+ <description>Expected path trace.
+
+The string can be of 64 characters length, or empty string ("").
+
+Note: An empty string for this attribute means that the detection of Trace Identifier Mismatch (TIM) should be disabled. This attribute is set to empty string every time attribute pathTraceFormat is set.</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>64</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="transmittedPathTrace">
+ <description>The transmitted path trace.
+Can be defined in two formats. The format may be in 16 or 64 characters. Usually 16 is used for ETSI and 64 for ANSI/TTC.
+
+Note: The string must be of 15 or 62 characters length, or empty string ("").</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>64</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="pmEsp">
+ <description>Performance Monitoring counter for ES, Errored Seconds.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSesp">
+ <description>Performance Monitoring counter for Severely Errored Seconds, SES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Vt15Ttp">
+ <description>This MO is automatically created when the configuring the Os155SpiTtp. It represents the termination of the SONET VP 1.5 path layer.
+
+This MO is automatically created when creating the Os155SpiTtp MO with the following conditions:
+muxmode = E1_J1_T1_LEVEL
+standardmode = ANSI
+
+The performance monitoring counters in the Vt15Ttp is set to 0 (zero) at start or restart of the node.
+When the value is too large too fit in to a long (31bit) the counter turns over and starts from 0 again.
+</description>
+ <systemCreated/>
+ <attribute name="Vt15TtpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="aisVreporting">
+ <description>Indicates whether Alarm Indication Signal, AIS, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="rdiVreporting">
+ <description>Indicates whether Remote Defect Indication, RDI, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="shutDownTimer">
+ <description>This timer defines the time that elapses before shut down when administrativeState is se to 'shuttingDown'.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>100000</max>
+ </range>
+ <defaultValue>1800</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the Vt15Ttp MO.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state of the Vt15Ttp MO.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmEs">
+ <description>Performance monitoring counter of Errored Seconds (ES).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSes">
+ <description>Performance monitoring counter for Serverely Errored Seconds.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="T1Ttp">
+ <description>This MO represents a channelised T1 interface in the node. The T1Ttp MO does not define which type of traffic (TDM or ATM) that the interface should support. Please refer to the Ds0Bundle, AtmPort, IMALink and IMAGroup objects for details about configuration of traffic type.
+
+The performance monitoring counters in the T1Ttp MO is set to 0 (zero) at start or restart of the node.
+When the value is to large too fit in to a long (31bit) the counter turns over and starts from 0 again.
+
+Note! This MO is automatically created as a consequence of creating an Os155SpiTtpMo
+Please refer to the Os155SpiTtpMo for more details.</description>
+ <systemCreated/>
+ <attribute name="T1TtpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="aisReporting">
+ <description>Indicates whether Alarm Indication Signal, AIS, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="rdiReporting">
+ <description>Indicates whether Remote Defect Indication, RDI, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the T1Ttp MO.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmEs">
+ <description>Performance monitoring counter of Errored Seconds (ES).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSes">
+ <description>Performance monitoring counter for Serverely Errored Seconds.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving AtmPort MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="AtmPort"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedByImaLink">
+ <description>The identity of the reserving ImaLink MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ImaLink"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="E3PhysPathTerm">
+ <description>This MO represents an E3 (i.e. 34 Mbit/s) physical interface in the node. Please refer to the AtmPort object for details about configuration of traffic type.
+
+Note! The performance monitoring counters in the E3PhysPathTerm MO is set to 0 (zero) at start or restart of the node.
+When the value is too large too fit in to a long (31bit) the counter turns over and starts from 0 again.</description>
+ <attribute name="E3PhysPathTermId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state of the E3PhysPathTerm.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="shutDownTimeout">
+ <description>The shut-down timer. It is used when the administrativeState is set to shutdown.
+
+Value in seconds, must be a positive value.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100000</max>
+ </range>
+ <defaultValue>1800</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>enabled or disabled according to the actual operational state of the Physical Line Termination. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="lineNo">
+ <description>The actual Line number on the board.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>2</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="loopback">
+ <description>Possible values
+
+none - This is the normal state, no loop back is performed (and ordinary traffic is running).
+
+line - The physical path is looped on the line side, the external incoming path is looped back to the external outgoing path.
+
+system - The physical path is looped on the system side, the (node-) internal incoming path is looped back to the internal outgoing path.
+
+Note! administrativeStatus must be set to locked when setting loopback attribute.</description>
+ <dataType>
+ <enumRef name="LoopbackState">
+ <defaultValue>none</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="degDegThr">
+ <description>The threshold decides how many of the received blocks that are allowed to have bit errors. The measurement is made on a per-second basis and if the threshold is passed the second is considered bad.
+
+This is a percentage value.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="degDegM">
+ <description>How many bad seconds in a row that causes a Degraded Signal alarm.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>2</min> <max>10</max>
+ </range>
+ <defaultValue>7</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="aisReporting">
+ <description>Indicates whether Alarm Indication Signal, AIS, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="rdiReporting">
+ <description>Indicates whether Remote Defect Indication, RDI, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="pmEs">
+ <description>Performance Monitoring counter for ES, Errored Seconds.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSes">
+ <description>Performance Monitoring counter for Severely Errored Seconds, SES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedByTraffic">
+ <description>The identity of the reserving AtmPort MO. </description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="AtmPort"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBySync">
+ <description>The identity of the reserving Synchronization MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Synchronization"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="T3PhysPathTerm">
+ <description>This MO represents an T3 (i.e. 45 Mbit/s) physical interface in the node. Please refer to the AtmPort object for details about configuration of traffic type.
+
+Note! The performance monitoring counters in the T3PhysPathTerm MO is set to 0 (zero) at start or restart of the node.
+When the value is too large too fit in to a long (31bit) the counter turns over and starts from 0 again.</description>
+ <attribute name="T3PhysPathTermId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>enabled or disabled according to the actual operational state of the Physical Line Termination. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state of the T3PhysPathTerm MO.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="shutDownTimeout">
+ <description>The shut-down timer. It is used when the administrativeState is set to shutdown.
+
+Value in seconds, must be a positive value.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100000</max>
+ </range>
+ <defaultValue>1800</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="lineNo">
+ <description>The actual Line number on the board.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>2</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="loopback">
+ <description>Possible values
+
+none - This is the normal state, no loop back is performed (and ordinary traffic is running).
+
+line - The physical path is looped on the line side, the external incoming path is looped back to the external outgoing path.
+
+system - The physical path is looped on the system side, the (node-) internal incoming path is looped back to the internal outgoing path.
+
+Note! administrativeStatus must be set to locked when setting loopback attribute.</description>
+ <dataType>
+ <enumRef name="LoopbackState">
+ <defaultValue>none</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="aisReporting">
+ <description>Indicates whether Alarm Indication Signal, AIS, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="rdiReporting">
+ <description>Indicates whether Remote Defect Indication, RDI, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="pmEsCpp">
+ <description>Performance Monitoring counter for ES, Errored Seconds based on C-bit parity.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSesCpp">
+ <description>Performance Monitoring counter for Severely Errored Seconds, SES based on C-bit parity.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedByTraffic">
+ <description>The identity of the reserving AtmPort MO. </description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="AtmPort"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBySync">
+ <description>The identity of the reserving Synchronization MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Synchronization"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Etm3">
+ <description>This MO represents the hardware of the ET-M3 board type. It only represents the ET specific hardware, while the DBM module of the board is represented by the PlugInUnit MO.
+
+The ET-M3 board contains 2 physical ports that can be configured as either E3 (ETSI) or T3(ANSI).
+
+Each port on the ET-M3 board can be used to carry ATM traffic.
+
+At the VP/VC endpoints, the Lost FPM/BR cells counters are not available.
+
+IMA is not applicable for theETM3 board.
+
+The ET-M3 board supports eight bidirectional F4/F5 PM flow per port.
+
+The number of VCC TP+VPC TP with performance monitoring enabled (i.e. PM mode &lt;&gt; off) is restricted to 8/port.
+
+Each port can support up to 240 ATM VC connections. Sixteen of these connections are reserved for AAL2 paths, and therefore sixteen AAL2 multiplexers per port are available.
+
+Each port can support up to 16 VP connections. </description>
+ <attribute name="Etm3Id">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Enabled or disabled according to the actual operational state of the Etm3 board.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="SccpApRemote">
+ <description>This Managed Object represents an SCCP Remote Access Point. An SCCP AP instance is a logical point in the SCCP network at which an SCCP user can access the services provided by the SCCP and the SCCP can deliver its services to the SCCP user. The SCCP Remote Access Point is identified by a SubSystem Number (SSN).
+
+A remote SccpAp represents an access point in another node and is related to a Mtp3bAp MO.
+
+The performance monitoring counters found in SccpAp MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is a shutdown request from the CLI (Cluster Interface).</description>
+ <attribute name="SccpApRemoteId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the SCCP AP. The operability of the SCCP AP is described by this attribute which has two possible values:
+
+Disabled: The SCCP AP is totally inoperable and unable to provide the service to the user (e.g. if the MTP-3b AP is not usable).
+
+Enabled: The SCCP AP is partly or fully operable and available for use.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Holds a list of the reserving MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="mtp3bApId">
+ <description>The identity of the Mtp3bAp used by this MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Mtp3bAp"/>
+ </dataType>
+ </attribute>
+ <attribute name="ssN">
+ <description>The sub system number, SSN, of the SCCP Access Point. Note that this has to be a unique number.
+
+The SSN has to be unique among all other SccpApRemote MOs that has the same DPC in their corresponding Mtp3bSrs MOs.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>2</min> <max>255</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="IpAccessHostGpb">
+ <description>This MO represents the Ip Access Host used for payload. This host type executes on a GPB board (GeneralPocessorUnit).
+
+Note! If autoConfig is set to ON, the Ip Addresses and the Prefixes for this MO is set by the IpAccessAutoConfig MO.
+
+Note! There can be a maximum of 128 host's in the node, and only one host on each main processor.
+
+Note! The host cannot be configured on a MP which have a MediumAccessUnit-child MO. They are exclusive.
+
+Note! The 'administrativeState' has to be set to LOCKED in order to be able to delete this host.</description>
+ <attribute name="IpAccessHostGpbId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving MO, can be of type Sctp.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the Ip Access Host.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>DEGRADED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state of the Ip Access Host.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="shutDownTimer">
+ <description>The shut-down timer. It is used when the administrativeState is set to shutdown.
+
+Value in seconds, must be a positive value.</description>
+ <dataType>
+ <long>
+ <defaultValue>10</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="linkStatusAddress1">
+ <description>The link status for IpAddress1.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="linkStatusAddress2">
+ <description>The link status for IpAddress2, only valid if 2 IpAddresses are configured for this host.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="generalProcessorUnitId">
+ <description>Holds a reference to the GPU (GenerelProcessorUnit).</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="GeneralProcessorUnit"/>
+ </dataType>
+ </attribute>
+ <attribute name="autoConfig">
+ <description>This attribute specifies whether the auto configuration feature for the Ip AccessHost is used or not.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="AutoConfigurationMode">
+ <defaultValue>OFF</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="autoConfigIdentity">
+ <description>The identity of the IpAccessAutoConfig MO used by this host.
+
+Note! This attribute is mandatory if 'autoConfig' is set to ON.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="IpAccessAutoConfig"/>
+ </dataType>
+ </attribute>
+ <attribute name="autoConfigIdentity2">
+ <description>The identity of the IpAccessAutoConfig MO used by this host.
+
+Note! This attribute can only be set if 'autoConfig' is set to 'ON'. This attribute is not neccesary to set if 'autoConfig' is set to ON, unless the host shall have two Ip Addresses automatically assigned.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="IpAccessAutoConfig"/>
+ </dataType>
+ </attribute>
+ <attribute name="ipAddress">
+ <description>The IpAddress.
+
+Note! If autoConfig = OFF this attribute is mandatory.
+Note! If the autoConfiguration is used for this IpAccessHostGpb (autoConfig = ON) this attribute cannot be set. This attribute is then set by the 'IpAccessAutoConfig MO'.
+Note! If the attribute is set, its value must not be the same as for attribute ipAddress2.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ipAddress2">
+ <description>The second IpAddress.
+
+Note! If autoConfig = OFF this attribute is possible to set. This attribute should only be set if multi-homing is used for this host (i.e. two addresses defined).
+Note! If the autoConfiguration is used for this IpAccessHostGpb (autoConfig = ON) this attribute cannot be set. This attribute is then set by the 'IpAccessAutoConfig MO'.
+Note! If the attribute is set, its value must not be the same as for attribute 'ipAddress'.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="pathMTUDiscovery">
+ <description>Specifies whether path MTU discovery should be used by this host.
+
+Note! in order to be able to set the value for this attribute, the administrative state has to be locked.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="mtu">
+ <description>The maximum transfer unit.
+
+The MTU has a initial value of 1452 if pathMTUDiscovery is set to false.
+If pathMTUDiscovery is set to true, the initial value of MTU is 1452.
+
+Note! in order to be able to set the value for this attribute, the administrative state has to be locked.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>72</min> <max>2048</max>
+ </range>
+ <defaultValue>1452</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="ipDefaultTtl">
+ <description>The default value inserted into the Time-To-Live field of the IP header of datagrams originated at this entity,
+whenever a TTL value is not supplied by the transport layer protocol.
+
+Note! in order to be able to set the value for this attribute, the administrative state has to be locked.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>255</max>
+ </range>
+ <defaultValue>50</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="ipReasmTimeout">
+ <description>The maximum number of seconds which received fragments are
+held while they are awaiting reassembly at this entity.
+
+Note! in order to be able to set the value for this attribute, the administrative state has to be locked.
+
+Note! The value for this attribute has to be positive.</description>
+ <dataType>
+ <long>
+ <defaultValue>300</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="nextHopIpAddr">
+ <description>The next hop IP address.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="nextHopIpAddr2">
+ <description>The secondary next hop IP address.
+
+Note! This attribute must only be set if one of the following conditions are fulfilled:
+1. Attribute 'ipAddress2' is set.
+2. Attribute 'autoConfig' = 'ON' and attribute 'autoConfigIdentity2' is set.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="networkPrefix">
+ <description>The network prefix.
+
+The prefix denotes how many bits that are used for calculating the subnet mask.
+
+Note! The default value 0 (zero) is most likely not possible to use and an other value should be submitted if this attribute is configured manually.
+Note! If auto configuration is not used (autoConfig = OFF) this attribute must be set (i.e. this attribute is then 'mandatory').
+Note! If auto configuration is used (autoConfig = ON) this attribute cannot be set, networkPrefix is then set by the ipAccessAutoConfig MO class.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>32</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="networkPrefix2">
+ <description>The second network prefix.
+
+The prefix denotes how many bits that are used for calculating the subnet mask.
+
+Note! The default value 0 (zero) is most likely not possible to use and an other value should be submitted if this attribute is configured manually.
+Note! If auto configuration is not used (autoConfig = OFF) and ipAddress2 is set this attribute must be set (i.e. this attribute is then 'mandatory').
+Note! If auto configuration is used (autoConfig = ON) this attribute cannot be set, networkPrefix2 is then set by the ipAccessAutoConfig MO class. </description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>32</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInReceives">
+ <description>The total number of input datagrams received from interfaces, including those received in error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInHdrErrors">
+ <description>The number of input datagrams discarded due to errors in their IP headers, including bad checksums, version number
+mismatch, other format errors, time-to-live exceeded, errors discovered in processing their IP options, etc.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInAddrErrors">
+ <description>The number of input datagrams discarded because the IP address in their IP header's destination field was not a
+valid address to be received at this entity. This count includes invalid addresses (e.g., 0.0.0.0) and addresses of
+unsupported Classes (e.g., Class E). For entities which are not IP routers and therefore do not forward datagrams,
+this counter includes datagrams discarded because the destination address was not a local address.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInUnknownProtos">
+ <description>The number of locally-addressed datagrams received successfully but discarded because of an unknown or
+unsupported protocol.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInDiscards">
+ <description>The number of input IP datagrams for which no problems were encountered to prevent their continued processing, but which
+were discarded (e.g., for lack of buffer space). Note that this counter does not include any datagrams discarded while
+awaiting re-assembly.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInDelivers">
+ <description>The total number of input datagrams successfully delivered to IP user-protocols (including ICMP).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpOutRequests">
+ <description>The total number of IP datagrams which local IP user-protocols (including ICMP) supplied to IP in requests for
+transmission. Note that this counter does not include any datagrams counted in ipForwDatagrams</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpOutDiscards">
+ <description>The number of output IP datagrams for which no problem was encountered to prevent their transmission to their
+destination, but which were discarded (e.g., for lack of buffer space). Note that this counter would include
+datagrams counted in ipForwDatagrams if any such packets met this (discretionary) discard criterion.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpReasmReqds">
+ <description>The number of IP fragments received which needed to be reassembled at this entity.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpReasmOKs">
+ <description>The number of IP datagrams successfully re-assembled.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpReasmFails">
+ <description>The number of failures detected by the IP re-assembly algorithm (for whatever reason: timed out, errors, etc).
+Note that this is not necessarily a count of discarded IP fragments since some algorithms (notably the algorithm
+in RFC 815) can lose track of the number of fragments by combining them as they are received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpFragOKs">
+ <description>The number of IP datagrams that have been successfully fragmented at this entity.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpFragFails">
+ <description>The number of IP datagrams that have been discarded because they needed to be fragmented
+at this entity but could not be, e.g., because their Don't Fragment flag was set.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpFragCreates">
+ <description>The number of IP datagram fragments that have been generated as a result of fragmentation at this entity.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInMsgs">
+ <description>The total number of ICMP messages which the entityreceived.
+Note that this counter includes all those counted by icmpInErrors</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInErrors">
+ <description>The number of ICMP messages which the entity received but determined as having
+ICMP-specific errors (bad ICMP checksums, bad length, etc.).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInDestUnreachs">
+ <description>The number of ICMP Destination Unreachable messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInTimeExcds">
+ <description>The number of ICMP Time Exceeded messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInParamProbs">
+ <description>The number of ICMP Parameter Problem messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInSrcQuenchs">
+ <description>The number of ICMP Source Quench messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInRedirects">
+ <description>The number of ICMP Redirect messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInEchos">
+ <description>The number of ICMP Echo (request) messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInEchoReps">
+ <description>The number of ICMP Echo Reply messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutMsgs">
+ <description>The total number of ICMP messages which this entity attempted to send.
+Note that this counter includes all those counted by icmpOutErrors.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutErrors">
+ <description>The number of ICMP messages which this entity did not send due to problems discovered within ICMP such as a lack of
+buffers. This value should not include errors discovered outside the ICMP layer such as the inability of IP to route the
+resultant datagram. In some implementations there may be no types of error which contribute to this counter's value.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutDestUnreachs">
+ <description>The number of ICMP Destination Unreachable messages sent.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutParmProbs">
+ <description>The number of ICMP Parameter Problem messages sent.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutEchos">
+ <description>The number of ICMP Echo (request) messages sent.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutEchoReps">
+ <description>The number of ICMP Echo Reply messages sent.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUdpInDatagrams">
+ <description>The total number of UDP datagrams delivered to UDP users.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUdpNoPorts">
+ <description>The total number of received UDP datagrams for which there was no application at the destination port.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUdpInErrors">
+ <description>The number of received UDP datagrams that could not be delivered for
+reasons other than the lack of an application at the destination port.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUdpOutDatagrams">
+ <description>The total number of UDP datagrams sent from this entity.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInUcastPkts">
+ <description>Performance monitoring counter for the number of input unicast packets delivered to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfOutUcastPkts">
+ <description>Performance monitoring counter for the number of out unicast packets delivered to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInErrors">
+ <description>Performance monitoring counter for the number of input packets discarded due to any error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInDiscards">
+ <description>Performance monitoring counter for the number of input packets discarded due to resource limitations.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInBroadcastPkts">
+ <description>Performance monitoring counter for the number of input broadcast packets delivered to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInMulticastPkts">
+ <description>Performance monitoring counter for the number of input multicast packets delivered to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfOutBroadcastPkts">
+ <description>Performance monitoring counter for the number of output broadcast packets delivered to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfOutMulticastPkts">
+ <description>Performance monitoring counter for the number of output multicast packets delivered to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="SystemFunctions">
+ <description>This MO structures the SystemFunctions of the managed element. It is created automatically and cannot be deleted.
+
+The local distinguished name of this MO is ManagedElement=1, SystemFunctions=1.</description>
+ <systemCreated/>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="SystemFunctionsId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Licensing">
+ <description>This MO represents the Licensing (Software Keys) functions in Cello.</description>
+ <systemCreated/>
+ <attribute name="LicensingId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="emergencyStateInfo">
+ <description>This attribute holds information about the emergency status and the time remaining in the current state.
+
+Note! If the node is in emergency state USE_DEGRADED, or the emergency state is USE_DISABLED, the the value of'time' is insignificant.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <structRef name="EmergencyInfo"/>
+ </dataType>
+ </attribute>
+ <attribute name="licenseFileUrl">
+ <description>This attribute returns the URL to the License Key File so it can be viewed with an XML capable web browser
+in case this is a licensed node.
+
+Note! In case the node is not licensed, an empty string will be returned.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>256</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <action name="updateLicenseKeyFile">
+ <description>This action sends a request to the FTP/SFTP server to update the license key file.
+
+User Id for login to FTP/SFTP server where license key files are located.
+If a null string userId is given, anonymous FTP/SFTP transfer is assumed.
+Max length is 20 characters.
+
+Password for login to the FTP/SFTP server where license key files are located.
+Max length is 20 characters.
+
+The IpAddress of the FTP/SFTP server where license key files are located.
+Max length is 16 characters.
+
+Source name and path of the license key file on the FTP/SFTP server.
+Max length is 256 charcters.
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="userId">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="password">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="ipAddress">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="sFile">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="setEmergencyState">
+ <description>This action sets the license server into emergency state.
+I.e. opens up all licensed features and capacity restrictions.
+Disabling emergency state is done by loading a new license key file.
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ </class>
+
+ <class name="TimingUnit2">
+ <description>This MO represents a timing unit2 (reference clock) in the node.
+
+The corresponding Program shall be of LoadModuleLoaderType, SpmFpgaLoader.</description>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Operational state of TimingUnit</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status of the TimingUnit.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="TimingUnit2Id">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="SccpPolicing">
+ <description>The SccpPolicing MO represents the policing function in CPP.
+
+The originatingMtp3bSpc is a madatory attribute for policing in one local node (i.e. a SRP in one NI).
+For policing between two local nodes (i.e. a SRP between two NIs) the originatingMtp3bSpc can be replaced by the originatingSccpSpId.
+Optional attributes for policing in one local node (i.e a SRP in one NI) are destinationMtp3bSpc, destinationSccpSsn, originatingSccpSsn and policingGlobalTitle.
+For policing between two local nodes (i.e. a SRP between two NIs) the destinationMtp3bSpc can be replaced by the destinationSccpSpId.</description>
+ <attribute name="SccpPolicingId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="originatingMtp3bSpc">
+ <description>The value of the SPC (Signaling Point Code).
+
+Note! If the 'originatingSccpSpId' is specified the 'originatingMtp3bSpc' is invalid.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>16777215</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="destinationMtp3bSpc">
+ <description>The value of the destination SPC (Signaling Point Code).
+
+Note! The default value 0 (zero) means that no SPC is defined.
+Note! If no 'destinationSccpSp' is defined and the value of 'destinationMtp3bSpc' is set to 0 (zero), all Signalling Point Codes (SPC) are valid.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>16777215</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="originatingSccpSpId">
+ <description>The identity of the originating SccpSp MO must be used for policing between local nodes.
+
+Note! If the 'originatingSccpSpId' is specified the 'originatingMtp3bSpc' is invalid.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="originatingSccpSsn">
+ <description>The value of SSN in CgPA (Calling Party Address)
+
+Note! The value 0 (zero) means that all ssN (Sub System Number) are valid.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="destinationSccpSpId">
+ <description>The identity of the destination SccpSp MO can be used for policing between local nodes.
+
+Note! If the 'destinationSccpSpId' is specified the 'destinationMtp3bSpc' is invalid.
+Note! If no destination 'destinationSccpSp' is defined and the value of 'destinationMtp3bSpc' is set to 0, all local nodes are valid.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="destinationSccpSsn">
+ <description>The value of SSN inCdPA (Called Party Address).
+
+Note! The valu 0 (zero) means tha all ssN (Sub System Number) are valid.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="policingGlobalTitle">
+ <description>The Policing Global Title attribute allows to optionally police on Global Title
+
+Default value is considered as no policing Global Title and all GTs are valid.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="GlobalTitleData"/>
+ </dataType>
+ </attribute>
+ <attribute name="discardOrReturnServiceMsg">
+ <description>For a policing case whether to discard or return Service Messages, if the return option is set.</description>
+ <dataType>
+ <enumRef name="DiscardReturnServiceMsg">
+ <defaultValue>DISCARD</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRejectMsg">
+ <description>Performance monitoring counter for the number of rejected messages.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="SccpAccountingCriteria">
+ <description>The SccpAccountingCriteria MO and the SccpSp MO represents the accounting function in CPP.
+
+Attribute usageType specifies Accounting Remuneration (incoming GT messages) or Verification (outgoing GT messages).
+
+For Remuneration a SccpGlobalTitle MOId in attribute globalTitleId must be defined.
+For Verification a SccpGlobalTitle MOid is defined in attribute globalTitleId, or a SccpEntitySet MOid is defined if accounting shall be made on the resulting new GT.
+
+The attribute ssN is optional .
+The Mtp3bSrs MOid (including an SPC) in attribute pointerId is optional for accounting in one local node (SRP in one NI).
+The SccpSp MOid in attribute pointerId is optional for accounting between two local nodes (SRP between two NIs).
+Attribute countType specifies if Messages och Octets shall be counted.
+Start and stop of accounting and output period for the accounting file is specified in the SccpSp MO.</description>
+ <attribute name="SccpAccountingCriteriaId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="usageType">
+ <description>This attribute specifies if the MO is used for renumeration or verification.
+
+0 = Verification Criteria to detect outgoing massages that will be charged in the next relay node.
+
+1 = Renumeration Criteria to detect incoming messages for relaying, that will be charged.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long/>
+ </dataType>
+ </attribute>
+ <attribute name="ssN">
+ <description>Subsystem Number this Accounting Criteria applies to.
+SubSystem Number 0 (zero) means that any SSN in CdPA (Called Party Address) is valid.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="countType">
+ <description>Specifies type of countes that should be activated.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="SccpCountType">
+ <defaultValue>MESSAGES</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="globalTitleId">
+ <description>The identity of the SccpGlobalTitle MO or the SccpEntitySet MO used by this MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMsg">
+ <description>Performance monitoring counter for the number of messages, both incoming and outgoing.
+
+Note! If 'countType' is set to 'OCTETS' this counter is not valid.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfOctets">
+ <description>Performance monitoring counter for the number of octets, both incoming and outgoing.
+
+Note! If 'countType' is set to 'MESSAGES this counter is not valid.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pointerId">
+ <description>The pointer is an instance of a Mtp3bSrs MO OR an instance of a SccpSP MO.
+
+Note! If no pointerId is set all Signaling Point Codes (SPC) and all Sccp SP identities are valid.
+Note! It is not possible to submit the Id of the SccpSp that the SccpAccountingCriteria belongs to.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Cbu">
+ <description>This MO models the Cbu (Node Control Board) board in CPP.
+The Cbu board integrates the functionality of TUB, SCB, GPB and ETB (ET-MC1) into one Plug-In Unit.
+
+Note! The 'operationalState' is set to disabled if one of the functional parts is faulty. Even if the Cbu is marked with 'operationalState' DISABLED, parts of the Cbu can still be operational.
+
+Note! A functional part on a Cbu board can only be redundant with the same functional part on another Cbu board and thus not with that functional part implemented on a discrete board. Also note that redundancy is only applicable for the GPB part and the TimingUnit part of the Cbu board..
+
+Note! On the Cbu board it is only possible to configure a maximum of 4 physical path terminations. These can be of type E1PhysPathTerm, J1PhyspathTerm or T1PhyspathTerm. It is not possible to create physical path terminations of different standards on the same board.
+
+Note! The Gpu part of the Cbu board (General Processor Unit) retrieves its 'availabilityStatus' from the PlugInUnit MO, thus not represented on the Cbu MO.
+
+Note! When the ET-MC1 is part of the Cbu board it is only possible to configure 4 physical ports as either E1 (ETSI), J1 (TTC) or T1 (ANSI).
+
+Note! This unit may only be inserted in slot 1 and 24 (or more accurately at APN=1 and 0 in a non-standard subrack). If redundant configuration is needed, two Cbu's must be inserted in the subrack.
+If only one Cbu is used it must be placed in slot 1 (in a non-standard subrack) to be able to read the product information data of the subrack</description>
+ <attribute name="CbuId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Provides the possibility to put a user-friendly label on the MO instance.
+
+Note! This attribute cannot be used for uniquely identifing the MO.</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>128</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Enabled or disabled according to the actual operational state of the NCB board.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatusEt">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.
+The 'availabilityStatusEt' gives the availability status for the ET part of the NCB board.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatusTu">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.
+The 'availabilityStatusTu' gives the availability status for the Timing Unit part of the NCB board.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ </class>
+
+ <relationship name="ManagedElement_to_TransportNetwork">
+ <containment>
+ <parent>
+ <hasClass name="ManagedElement"/>
+ </parent>
+ <child>
+ <hasClass name="TransportNetwork"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Synchronization">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Synchronization"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_SccpSp">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="SccpSp"/>
+ <cardinality>
+ <min>0</min> <max>24</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_UniSaalProfile">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="UniSaalProfile"/>
+ <cardinality>
+ <min>0</min> <max>300</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_UniSaalTp">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="UniSaalTp"/>
+ <cardinality>
+ <min>0</min> <max>4800</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Aal0TpVccTp">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Aal0TpVccTp"/>
+ <cardinality>
+ <min>0</min> <max>2200</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Aal5TpVccTp">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Aal5TpVccTp"/>
+ <cardinality>
+ <min>0</min> <max>6000</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_AtmPort">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="AtmPort"/>
+ <cardinality>
+ <min>0</min> <max>500</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_NniSaalProfile">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="NniSaalProfile"/>
+ <cardinality>
+ <min>0</min> <max>50</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_NniSaalTp">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="NniSaalTp"/>
+ <cardinality>
+ <min>0</min> <max>600</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_AtmTrafficDescriptor">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="AtmTrafficDescriptor"/>
+ <cardinality>
+ <min>0</min> <max>1000</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Aal2PathVccTp">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Aal2PathVccTp"/>
+ <cardinality>
+ <min>0</min> <max>2000</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Aal2RoutingCase">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Aal2RoutingCase"/>
+ <cardinality>
+ <min>0</min> <max>900</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Aal2Sp">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Aal2Sp"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_AtmCrossConnection">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="AtmCrossConnection"/>
+ <cardinality>
+ <min>0</min> <max>5000</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Mtp2TpItu">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp2TpItu"/>
+ <cardinality>
+ <min>0</min> <max>256</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Mtp2TpAnsi">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp2TpAnsi"/>
+ <cardinality>
+ <min>0</min> <max>256</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Aal1TpVccTp">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Aal1TpVccTp"/>
+ <cardinality>
+ <min>0</min> <max>1000</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Mtp3bSpAnsi">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSpAnsi"/>
+ <cardinality>
+ <min>0</min> <max>24</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Mtp3bSpItu">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSpItu"/>
+ <cardinality>
+ <min>0</min> <max>24</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Mtp3bSpTtc">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSpTtc"/>
+ <cardinality>
+ <min>0</min> <max>24</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Mtp2ProfileAnsi">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp2ProfileAnsi"/>
+ <cardinality>
+ <min>0</min> <max>256</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Mtp2ProfileItu">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp2ProfileItu"/>
+ <cardinality>
+ <min>0</min> <max>256</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Mtp2ProfileChina">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp2ProfileChina"/>
+ <cardinality>
+ <min>0</min> <max>256</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Mtp2TpChina">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp2TpChina"/>
+ <cardinality>
+ <min>0</min> <max>256</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Mtp3bSpChina">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSpChina"/>
+ <cardinality>
+ <min>0</min> <max>24</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Mspg">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Mspg"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_ImaGroup">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="ImaGroup"/>
+ <cardinality>
+ <min>0</min> <max>200</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Aal2QosProfile">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Aal2QosProfile"/>
+ <cardinality>
+ <min>0</min> <max>20</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Aal2QosCodePointProfile">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Aal2QosCodePointProfile"/>
+ <cardinality>
+ <min>0</min> <max>20</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Sctp">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Sctp"/>
+ <cardinality>
+ <min>0</min> <max>10</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Subrack_to_Slot">
+ <containment>
+ <parent>
+ <hasClass name="Subrack"/>
+ </parent>
+ <child>
+ <hasClass name="Slot"/>
+ <cardinality>
+ <min>1</min> <max>28</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Slot_to_PlugInUnit">
+ <containment>
+ <parent>
+ <hasClass name="Slot"/>
+ </parent>
+ <child>
+ <hasClass name="PlugInUnit"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Slot_to_ManagedObject">
+ <containment>
+ <parent>
+ <hasClass name="Slot"/>
+ </parent>
+ <child>
+ <hasClass name="ManagedObject"/>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="ManagedElement_to_ManagedObject">
+ <containment>
+ <parent>
+ <hasClass name="ManagedElement"/>
+ </parent>
+ <child>
+ <hasClass name="ManagedObject"/>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_ManagedObject">
+ <description>This containment relation indicated that any kind of board may be used to specilize PlugInUnit.</description>
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="ManagedObject"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Subrack_to_ManagedObject">
+ <containment>
+ <parent>
+ <hasClass name="Subrack"/>
+ </parent>
+ <child>
+ <hasClass name="ManagedObject"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="VpcTp_to_VclTp">
+ <containment>
+ <parent>
+ <hasClass name="VpcTp"/>
+ </parent>
+ <child>
+ <hasClass name="VclTp"/>
+ <cardinality>
+ <min>0</min> <max>5000</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="ManagedElement_to_Equipment">
+ <containment>
+ <parent>
+ <hasClass name="ManagedElement"/>
+ </parent>
+ <child>
+ <hasClass name="Equipment"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="ManagedElement_to_IpSystem">
+ <containment>
+ <parent>
+ <hasClass name="ManagedElement"/>
+ </parent>
+ <child>
+ <hasClass name="IpSystem"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="ManagedElement_to_SwManagement">
+ <containment>
+ <parent>
+ <hasClass name="ManagedElement"/>
+ </parent>
+ <child>
+ <hasClass name="SwManagement"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="ManagedElement_to_SwitchFabric">
+ <containment>
+ <parent>
+ <hasClass name="ManagedElement"/>
+ </parent>
+ <child>
+ <hasClass name="SwitchFabric"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="ManagedElement_to_ManagedElementData">
+ <containment>
+ <parent>
+ <hasClass name="ManagedElement"/>
+ </parent>
+ <child>
+ <hasClass name="ManagedElementData"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="ManagedElement_to_SystemFunctions">
+ <containment>
+ <parent>
+ <hasClass name="ManagedElement"/>
+ </parent>
+ <child>
+ <hasClass name="SystemFunctions"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Equipment_to_Subrack">
+ <containment>
+ <parent>
+ <hasClass name="Equipment"/>
+ </parent>
+ <child>
+ <hasClass name="Subrack"/>
+ <cardinality>
+ <min>0</min> <max>9</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Equipment_to_Jvm">
+ <containment>
+ <parent>
+ <hasClass name="Equipment"/>
+ </parent>
+ <child>
+ <hasClass name="Jvm"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Subrack_to_Fan">
+ <containment>
+ <parent>
+ <hasClass name="Subrack"/>
+ </parent>
+ <child>
+ <hasClass name="Fan"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SwManagement_to_LoadModule">
+ <containment>
+ <parent>
+ <hasClass name="SwManagement"/>
+ </parent>
+ <child>
+ <hasClass name="LoadModule"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SccpScrc_to_SccpApLocal">
+ <description>The SccpApLocal represents a local SSN, no relation exists to an Mtp3bAp
+
+Of the possible 216 SccpAps allowed on a node, a maximum of 16 are allowed to be local, and a maximum of 200 are allowed to be remote.</description>
+ <containment>
+ <parent>
+ <hasClass name="SccpScrc"/>
+ </parent>
+ <child>
+ <hasClass name="SccpApLocal"/>
+ <cardinality>
+ <min>0</min> <max>16</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SccpSp_to_SccpScrc">
+ <containment>
+ <parent>
+ <hasClass name="SccpSp"/>
+ </parent>
+ <child>
+ <hasClass name="SccpScrc"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SccpScrc_to_SccpEntitySet">
+ <containment>
+ <parent>
+ <hasClass name="SccpScrc"/>
+ </parent>
+ <child>
+ <hasClass name="SccpEntitySet"/>
+ <cardinality>
+ <min>0</min> <max>2048</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SccpScrc_to_SccpGlobalTitle">
+ <containment>
+ <parent>
+ <hasClass name="SccpScrc"/>
+ </parent>
+ <child>
+ <hasClass name="SccpGlobalTitle"/>
+ <cardinality>
+ <min>0</min> <max>2048</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SccpScrc_to_SccpApRemote">
+ <containment>
+ <parent>
+ <hasClass name="SccpScrc"/>
+ </parent>
+ <child>
+ <hasClass name="SccpApRemote"/>
+ <cardinality>
+ <min>0</min> <max>200</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SccpScrc_to_SccpPolicing">
+ <containment>
+ <parent>
+ <hasClass name="SccpScrc"/>
+ </parent>
+ <child>
+ <hasClass name="SccpPolicing"/>
+ <cardinality>
+ <min>0</min> <max>1024</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SccpScrc_to_SccpAccountingCriteria">
+ <containment>
+ <parent>
+ <hasClass name="SccpScrc"/>
+ </parent>
+ <child>
+ <hasClass name="SccpAccountingCriteria"/>
+ <cardinality>
+ <min>0</min> <max>100</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_Program">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="Program"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Spm_to_Program">
+ <containment>
+ <parent>
+ <hasClass name="Spm"/>
+ </parent>
+ <child>
+ <hasClass name="Program"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TimingUnit_to_Program">
+ <containment>
+ <parent>
+ <hasClass name="TimingUnit"/>
+ </parent>
+ <child>
+ <hasClass name="Program"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etm4_to_Program">
+ <containment>
+ <parent>
+ <hasClass name="Etm4"/>
+ </parent>
+ <child>
+ <hasClass name="Program"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etm1_to_Program">
+ <containment>
+ <parent>
+ <hasClass name="Etm1"/>
+ </parent>
+ <child>
+ <hasClass name="Program"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etmc1_to_Program">
+ <containment>
+ <parent>
+ <hasClass name="Etmc1"/>
+ </parent>
+ <child>
+ <hasClass name="Program"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etmc41_to_Program">
+ <containment>
+ <parent>
+ <hasClass name="Etmc41"/>
+ </parent>
+ <child>
+ <hasClass name="Program"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TimingUnit2_to_Program">
+ <containment>
+ <parent>
+ <hasClass name="TimingUnit2"/>
+ </parent>
+ <child>
+ <hasClass name="Program"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etm3_to_Program">
+ <containment>
+ <parent>
+ <hasClass name="Etm3"/>
+ </parent>
+ <child>
+ <hasClass name="Program"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Spu_to_Program">
+ <containment>
+ <parent>
+ <hasClass name="Spu"/>
+ </parent>
+ <child>
+ <hasClass name="Program"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Fan_to_Program">
+ <containment>
+ <parent>
+ <hasClass name="Fan"/>
+ </parent>
+ <child>
+ <hasClass name="Program"/>
+ <cardinality>
+ <min>1</min> <max>2</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etm1_to_E1PhysPathTerm">
+ <containment>
+ <parent>
+ <hasClass name="Etm1"/>
+ </parent>
+ <child>
+ <hasClass name="E1PhysPathTerm"/>
+ <cardinality>
+ <min>0</min> <max>8</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etmc1_to_E1PhysPathTerm">
+ <containment>
+ <parent>
+ <hasClass name="Etmc1"/>
+ </parent>
+ <child>
+ <hasClass name="E1PhysPathTerm"/>
+ <cardinality>
+ <min>0</min> <max>8</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="E1PhysPathTerm_to_Ds0Bundle">
+ <containment>
+ <parent>
+ <hasClass name="E1PhysPathTerm"/>
+ </parent>
+ <child>
+ <hasClass name="Ds0Bundle"/>
+ <cardinality>
+ <min>0</min> <max>31</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etm1_to_J1PhysPathTerm">
+ <containment>
+ <parent>
+ <hasClass name="Etm1"/>
+ </parent>
+ <child>
+ <hasClass name="J1PhysPathTerm"/>
+ <cardinality>
+ <min>0</min> <max>8</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etmc1_to_J1PhysPathTerm">
+ <containment>
+ <parent>
+ <hasClass name="Etmc1"/>
+ </parent>
+ <child>
+ <hasClass name="J1PhysPathTerm"/>
+ <cardinality>
+ <min>0</min> <max>8</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="J1PhysPathTerm_to_Ds0Bundle">
+ <containment>
+ <parent>
+ <hasClass name="J1PhysPathTerm"/>
+ </parent>
+ <child>
+ <hasClass name="Ds0Bundle"/>
+ <cardinality>
+ <min>0</min> <max>24</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="AtmPort_to_VplTp">
+ <containment>
+ <parent>
+ <hasClass name="AtmPort"/>
+ </parent>
+ <child>
+ <hasClass name="VplTp"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpChina_to_Mtp3bAp">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpChina"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bAp"/>
+ <cardinality>
+ <min>0</min> <max>510</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpAnsi_to_Mtp3bAp">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpAnsi"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bAp"/>
+ <cardinality>
+ <min>0</min> <max>510</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpItu_to_Mtp3bAp">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpItu"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bAp"/>
+ <cardinality>
+ <min>0</min> <max>510</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpTtc_to_Mtp3bAp">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpTtc"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bAp"/>
+ <cardinality>
+ <min>0</min> <max>510</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpItu_to_Mtp3bSrs">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpItu"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSrs"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpTtc_to_Mtp3bSrs">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpTtc"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSrs"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpChina_to_Mtp3bSrs">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpChina"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSrs"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSrs_to_Mtp3bSr">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSrs"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSr"/>
+ <cardinality>
+ <min>0</min> <max>5</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpAnsi_to_Mtp3bSrs">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpAnsi"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSrs"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_Etm1">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="Etm1"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_Spu">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="Spu"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_SwitchCoreUnit">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="SwitchCoreUnit"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_GeneralProcessorUnit">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="GeneralProcessorUnit"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_Etm4">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="Etm4"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_TimingUnit">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="TimingUnit"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_SwitchExtensionUnit">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="SwitchExtensionUnit"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_Etmc1">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="Etmc1"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_Etmc41">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="Etmc41"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_Etm3">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="Etm3"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_TimingUnit2">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="TimingUnit2"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_Cbu">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="Cbu"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpChina_to_Mtp3bSls">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpChina"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSls"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpItu_to_Mtp3bSls">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpItu"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSls"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpTtc_to_Mtp3bSls">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpTtc"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSls"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpAnsi_to_Mtp3bSls">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpAnsi"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSls"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpChina_to_Mtp3bSls_0">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpChina"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSls"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpAnsi_to_Mtp3bSls_0">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpAnsi"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSls"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpItu_to_Mtp3bSls_0">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpItu"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSls"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpTtc_to_Mtp3bSls_0">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpTtc"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSls"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSls_to_Mtp3bSlAnsi">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSls"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSlAnsi"/>
+ <cardinality>
+ <min>0</min> <max>16</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSls_to_Mtp3bSlItu">
+ <description>Multiplicity: 0..16</description>
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSls"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSlItu"/>
+ <cardinality>
+ <min>0</min> <max>16</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSls_to_Mtp3bSlTtc">
+ <description>Multiplicity: 0..16</description>
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSls"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSlTtc"/>
+ <cardinality>
+ <min>0</min> <max>16</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSls_to_Mtp3bSlChina">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSls"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSlChina"/>
+ <cardinality>
+ <min>0</min> <max>16</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="IpSystem_to_Ip">
+ <containment>
+ <parent>
+ <hasClass name="IpSystem"/>
+ </parent>
+ <child>
+ <hasClass name="Ip"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="IpSystem_to_Ospf">
+ <containment>
+ <parent>
+ <hasClass name="IpSystem"/>
+ </parent>
+ <child>
+ <hasClass name="Ospf"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="IpSystem_to_IpAccessAutoConfig">
+ <containment>
+ <parent>
+ <hasClass name="IpSystem"/>
+ </parent>
+ <child>
+ <hasClass name="IpAccessAutoConfig"/>
+ <cardinality>
+ <min>0</min> <max>32</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="IpSystem_to_IpAccessHostMsb">
+ <containment>
+ <parent>
+ <hasClass name="IpSystem"/>
+ </parent>
+ <child>
+ <hasClass name="IpAccessHostMsb"/>
+ <cardinality>
+ <min>0</min> <max>128</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="IpSystem_to_IpAccessHostGpb">
+ <containment>
+ <parent>
+ <hasClass name="IpSystem"/>
+ </parent>
+ <child>
+ <hasClass name="IpAccessHostGpb"/>
+ <cardinality>
+ <min>0</min> <max>128</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Ip_to_IpAtmLink">
+ <containment>
+ <parent>
+ <hasClass name="Ip"/>
+ </parent>
+ <child>
+ <hasClass name="IpAtmLink"/>
+ <cardinality>
+ <min>0</min> <max>500</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Ip_to_EthernetLink">
+ <containment>
+ <parent>
+ <hasClass name="Ip"/>
+ </parent>
+ <child>
+ <hasClass name="EthernetLink"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Ip_to_IpRoutingTable">
+ <containment>
+ <parent>
+ <hasClass name="Ip"/>
+ </parent>
+ <child>
+ <hasClass name="IpRoutingTable"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Aal2Sp_to_Aal2Ap">
+ <containment>
+ <parent>
+ <hasClass name="Aal2Sp"/>
+ </parent>
+ <child>
+ <hasClass name="Aal2Ap"/>
+ <cardinality>
+ <min>0</min> <max>850</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Aal2Ap_to_Aal2PathDistributionUnit">
+ <containment>
+ <parent>
+ <hasClass name="Aal2Ap"/>
+ </parent>
+ <child>
+ <hasClass name="Aal2PathDistributionUnit"/>
+ <cardinality>
+ <min>0</min> <max>26</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etm1_to_T1PhysPathTerm">
+ <containment>
+ <parent>
+ <hasClass name="Etm1"/>
+ </parent>
+ <child>
+ <hasClass name="T1PhysPathTerm"/>
+ <cardinality>
+ <min>0</min> <max>8</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TimingUnit_to_TuSyncRef">
+ <containment>
+ <parent>
+ <hasClass name="TimingUnit"/>
+ </parent>
+ <child>
+ <hasClass name="TuSyncRef"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TimingUnit2_to_TuSyncRef">
+ <containment>
+ <parent>
+ <hasClass name="TimingUnit2"/>
+ </parent>
+ <child>
+ <hasClass name="TuSyncRef"/>
+ <cardinality>
+ <min>0</min> <max>2</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Spu_to_Spm">
+ <containment>
+ <parent>
+ <hasClass name="Spu"/>
+ </parent>
+ <child>
+ <hasClass name="Spm"/>
+ <cardinality>
+ <min>0</min> <max>5</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SwManagement_to_ConfigurationVersion">
+ <containment>
+ <parent>
+ <hasClass name="SwManagement"/>
+ </parent>
+ <child>
+ <hasClass name="ConfigurationVersion"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SwManagement_to_UpgradePackage">
+ <containment>
+ <parent>
+ <hasClass name="SwManagement"/>
+ </parent>
+ <child>
+ <hasClass name="UpgradePackage"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SwManagement_to_Repertoire">
+ <containment>
+ <parent>
+ <hasClass name="SwManagement"/>
+ </parent>
+ <child>
+ <hasClass name="Repertoire"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SwManagement_to_PiuType">
+ <containment>
+ <parent>
+ <hasClass name="SwManagement"/>
+ </parent>
+ <child>
+ <hasClass name="PiuType"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SwManagement_to_SwAllocation">
+ <containment>
+ <parent>
+ <hasClass name="SwManagement"/>
+ </parent>
+ <child>
+ <hasClass name="SwAllocation"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SwManagement_to_ReliableProgramUniter">
+ <containment>
+ <parent>
+ <hasClass name="SwManagement"/>
+ </parent>
+ <child>
+ <hasClass name="ReliableProgramUniter"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Ospf_to_OspfInterface">
+ <containment>
+ <parent>
+ <hasClass name="Ospf"/>
+ </parent>
+ <child>
+ <hasClass name="OspfInterface"/>
+ <cardinality>
+ <min>0</min> <max>32</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Ospf_to_OspfArea">
+ <containment>
+ <parent>
+ <hasClass name="Ospf"/>
+ </parent>
+ <child>
+ <hasClass name="OspfArea"/>
+ <cardinality>
+ <min>1</min> <max>4</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Cbu_to_GeneralProcessorUnit">
+ <containment>
+ <parent>
+ <hasClass name="Cbu"/>
+ </parent>
+ <child>
+ <hasClass name="GeneralProcessorUnit"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="GeneralProcessorUnit_to_MediumAccessUnit">
+ <containment>
+ <parent>
+ <hasClass name="GeneralProcessorUnit"/>
+ </parent>
+ <child>
+ <hasClass name="MediumAccessUnit"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SwitchFabric_to_SwitchModule">
+ <containment>
+ <parent>
+ <hasClass name="SwitchFabric"/>
+ </parent>
+ <child>
+ <hasClass name="SwitchModule"/>
+ <cardinality>
+ <min>0</min> <max>32</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SwitchFabric_to_InternalLinkGroup">
+ <containment>
+ <parent>
+ <hasClass name="SwitchFabric"/>
+ </parent>
+ <child>
+ <hasClass name="InternalLinkGroup"/>
+ <cardinality>
+ <min>0</min> <max>31</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="InternalLinkGroup_to_SwitchInternalLink">
+ <containment>
+ <parent>
+ <hasClass name="InternalLinkGroup"/>
+ </parent>
+ <child>
+ <hasClass name="SwitchInternalLink"/>
+ <cardinality>
+ <min>0</min> <max>8</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etm4_to_Os155SpiTtp">
+ <containment>
+ <parent>
+ <hasClass name="Etm4"/>
+ </parent>
+ <child>
+ <hasClass name="Os155SpiTtp"/>
+ <cardinality>
+ <min>0</min> <max>2</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="VplTp_to_VpcTp">
+ <containment>
+ <parent>
+ <hasClass name="VplTp"/>
+ </parent>
+ <child>
+ <hasClass name="VpcTp"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="E1Ttp_to_Ds0Bundle">
+ <containment>
+ <parent>
+ <hasClass name="E1Ttp"/>
+ </parent>
+ <child>
+ <hasClass name="Ds0Bundle"/>
+ <cardinality>
+ <min>0</min> <max>31</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="T1PhysPathTerm_to_Ds0Bundle">
+ <containment>
+ <parent>
+ <hasClass name="T1PhysPathTerm"/>
+ </parent>
+ <child>
+ <hasClass name="Ds0Bundle"/>
+ <cardinality>
+ <min>0</min> <max>24</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="T1Ttp_to_Ds0Bundle">
+ <containment>
+ <parent>
+ <hasClass name="T1Ttp"/>
+ </parent>
+ <child>
+ <hasClass name="Ds0Bundle"/>
+ <cardinality>
+ <min>0</min> <max>24</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpAnsi_to_M3uAssociation">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpAnsi"/>
+ </parent>
+ <child>
+ <hasClass name="M3uAssociation"/>
+ <cardinality>
+ <min>0</min> <max>512</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpItu_to_M3uAssociation">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpItu"/>
+ </parent>
+ <child>
+ <hasClass name="M3uAssociation"/>
+ <cardinality>
+ <min>0</min> <max>512</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Vc12Ttp_to_E1Ttp">
+ <containment>
+ <parent>
+ <hasClass name="Vc12Ttp"/>
+ </parent>
+ <child>
+ <hasClass name="E1Ttp"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Os155SpiTtp_to_Vc4Ttp">
+ <containment>
+ <parent>
+ <hasClass name="Os155SpiTtp"/>
+ </parent>
+ <child>
+ <hasClass name="Vc4Ttp"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Vc4Ttp_to_Vc12Ttp">
+ <containment>
+ <parent>
+ <hasClass name="Vc4Ttp"/>
+ </parent>
+ <child>
+ <hasClass name="Vc12Ttp"/>
+ <cardinality>
+ <min>0</min> <max>63</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etmc41_to_Os155SpiTtp">
+ <containment>
+ <parent>
+ <hasClass name="Etmc41"/>
+ </parent>
+ <child>
+ <hasClass name="Os155SpiTtp"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Os155SpiTtp_to_Sts3CspeTtp">
+ <containment>
+ <parent>
+ <hasClass name="Os155SpiTtp"/>
+ </parent>
+ <child>
+ <hasClass name="Sts3CspeTtp"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Os155SpiTtp_to_Sts1SpeTtp">
+ <containment>
+ <parent>
+ <hasClass name="Os155SpiTtp"/>
+ </parent>
+ <child>
+ <hasClass name="Sts1SpeTtp"/>
+ <cardinality>
+ <min>0</min> <max>3</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Cbu_to_Etmc1">
+ <containment>
+ <parent>
+ <hasClass name="Cbu"/>
+ </parent>
+ <child>
+ <hasClass name="Etmc1"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etmc1_to_T1PhysPathTerm">
+ <containment>
+ <parent>
+ <hasClass name="Etmc1"/>
+ </parent>
+ <child>
+ <hasClass name="T1PhysPathTerm"/>
+ <cardinality>
+ <min>0</min> <max>8</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpChina_to_M3uAssociation">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpChina"/>
+ </parent>
+ <child>
+ <hasClass name="M3uAssociation"/>
+ <cardinality>
+ <min>0</min> <max>512</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="ImaGroup_to_ImaLink">
+ <containment>
+ <parent>
+ <hasClass name="ImaGroup"/>
+ </parent>
+ <child>
+ <hasClass name="ImaLink"/>
+ <cardinality>
+ <min>0</min> <max>8</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SystemFunctions_to_WebServer">
+ <containment>
+ <parent>
+ <hasClass name="SystemFunctions"/>
+ </parent>
+ <child>
+ <hasClass name="WebServer"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Sts1SpeTtp_to_Vt15Ttp">
+ <containment>
+ <parent>
+ <hasClass name="Sts1SpeTtp"/>
+ </parent>
+ <child>
+ <hasClass name="Vt15Ttp"/>
+ <cardinality>
+ <min>0</min> <max>28</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Vt15Ttp_to_T1Ttp">
+ <containment>
+ <parent>
+ <hasClass name="Vt15Ttp"/>
+ </parent>
+ <child>
+ <hasClass name="T1Ttp"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etm3_to_E3PhysPathTerm">
+ <containment>
+ <parent>
+ <hasClass name="Etm3"/>
+ </parent>
+ <child>
+ <hasClass name="E3PhysPathTerm"/>
+ <cardinality>
+ <min>0</min> <max>2</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etm3_to_T3PhysPathTerm">
+ <containment>
+ <parent>
+ <hasClass name="Etm3"/>
+ </parent>
+ <child>
+ <hasClass name="T3PhysPathTerm"/>
+ <cardinality>
+ <min>0</min> <max>2</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SystemFunctions_to_Licensing">
+ <containment>
+ <parent>
+ <hasClass name="SystemFunctions"/>
+ </parent>
+ <child>
+ <hasClass name="Licensing"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Cbu_to_TimingUnit2">
+ <containment>
+ <parent>
+ <hasClass name="Cbu"/>
+ </parent>
+ <child>
+ <hasClass name="TimingUnit2"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+</mim>
+
+</models>
+
diff --git a/lib/xmerl/test/xmerl_SUITE_data/eventp/CelloMOM.stub b/lib/xmerl/test/xmerl_SUITE_data/eventp/CelloMOM.stub
new file mode 100644
index 0000000000..754b1ecded
--- /dev/null
+++ b/lib/xmerl/test/xmerl_SUITE_data/eventp/CelloMOM.stub
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<!--
+ Document no: 1551-1/CSX10109
+ Revision: MOM-CELLO_4.3.1
+ Date: 12-17-2003
+ Author: Ake Pappila/Hsiang-Ling Teng
+
+ Generated from UML by uml2xml version 3.0 (based on DTD file rev. F)
+ Rational Rose model used: /vobs/cello/cma/cma_uml/CelloMOM.mdl
+-->
+
+<!DOCTYPE models SYSTEM "mp.dtd">
+
diff --git a/lib/xmerl/test/xmerl_SUITE_data/eventp/CelloMOM.xml b/lib/xmerl/test/xmerl_SUITE_data/eventp/CelloMOM.xml
new file mode 100644
index 0000000000..8f8cf54505
--- /dev/null
+++ b/lib/xmerl/test/xmerl_SUITE_data/eventp/CelloMOM.xml
@@ -0,0 +1,30261 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<!--
+ Document no: 1551-1/CSX10109
+ Revision: MOM-CELLO_4.3.1
+ Date: 12-17-2003
+ Author: Ake Pappila/Hsiang-Ling Teng
+
+ Generated from UML by uml2xml version 3.0 (based on DTD file rev. F)
+ Rational Rose model used: /vobs/cello/cma/cma_uml/CelloMOM.mdl
+-->
+
+<!DOCTYPE models SYSTEM "mp.dtd">
+
+<models>
+<mim name="MOM-CELLO_4.3.1-1" version="5" release="1">
+ <exception name="AttributeMissingException">
+ <description>Exception thrown when an attribute is missing during upgrade.</description>
+ </exception>
+
+ <exception name="EnableExistingProgramException">
+ <description>Exception thrown when enabling of existing programs fails.</description>
+ </exception>
+
+ <exception name="ExtraIdentifiersOfNonExistingLoadModulesException">
+ </exception>
+
+ <exception name="FileCopyException">
+ <description>Exception thrown when copying of files fails.</description>
+ </exception>
+
+ <exception name="FileNotExistException">
+ <description>Exception thrown when the specified file does not exist.</description>
+ </exception>
+
+ <exception name="FindAndReplaceException">
+ </exception>
+
+ <exception name="HeapPoolSettingsException">
+ <description>Exception thrown when the heap or pool setting is incorrect.</description>
+ </exception>
+
+ <exception name="AttributeValueOutOfRangeException">
+ <description>Exception thrown when an attribute value is out of range.</description>
+ </exception>
+
+ <exception name="CancelInstallRequestException">
+ <description>Exception thrown when a cancel install equest for some reason fails.</description>
+ </exception>
+
+ <exception name="ChecksumhandlerException">
+ <description>Exception thrown when the control of checksum for loadmodules has been rejaected due to 'null' recieved from resource layer.</description>
+ </exception>
+
+ <exception name="ClearAllPiuTypesReferencedByPlugInUnitException">
+ <description>Exception thrown when its not possible to clear all PiuTypes referenced by PlugInUnit.</description>
+ </exception>
+
+ <exception name="ConditionallyMandatoryAttributeOrElementMissingException">
+ <description>Exception thrown when an conditional mandatory attribute (or element) is missing.</description>
+ </exception>
+
+ <exception name="ConfigurationVersionMO_HandlerException">
+ <description>Exception thrown when the creation of a CV during upgrade fails.</description>
+ </exception>
+
+ <exception name="ControlFileDocumentHandlerException">
+ </exception>
+
+ <exception name="CreateLoadModuleException">
+ <description>Exception thrown when the creation of a load module fails.</description>
+ </exception>
+
+ <exception name="DisableExistingProgramsException">
+ <description>Exception thrown when disabling of existing programs for some reason fails.</description>
+ </exception>
+
+ <exception name="DocumentObjectProxyException">
+ </exception>
+
+ <exception name="ExplicitReplacementInInformationForRPUsException">
+ <description>Exception thrown when replacement of existing RPU information fails.</description>
+ </exception>
+
+ <exception name="InstallOfLoadModulesCancelledException">
+ <description>Exception thrown when the installation of Load Modules is cancelled.</description>
+ </exception>
+
+ <exception name="InstallOfLoadModulesPartlyExcecutedException">
+ <description>Exception thrown when the installment of Load Modules is only partly executed.</description>
+ </exception>
+
+ <exception name="InstallOfLoadModulesRejectedException">
+ <description>Exception thrown when the install of Load Modules is rejected.</description>
+ </exception>
+
+ <exception name="InstallRejectedFTP_ServerNotAccessibleException">
+ <description>Exception thrown when the install is rejected due to FTP server is not accessible.</description>
+ </exception>
+
+ <exception name="InstallRejectedGetLoadModuleFileException">
+ <description>Exception thrown when the install is rejected due to error when trying to retreive Load Module.</description>
+ </exception>
+
+ <exception name="InstallRejectedIP_AddressException">
+ <description>Exception thrown when install is rejected due to erronous IP address.</description>
+ </exception>
+
+ <exception name="InstallRejectedInsufficientDiskSpaceException">
+ <description>Exception thrown when the install is rejected due to insufficient disk space.</description>
+ </exception>
+
+ <exception name="InstallRejectedLoadListFileException">
+ </exception>
+
+ <exception name="InstallRequestException">
+ <description>Exception thrown when the installation of a Load Module fails.</description>
+ </exception>
+
+ <exception name="InsufficientDiskSpaceException">
+ <description>Exception thrown when the disk space is insufficient.</description>
+ </exception>
+
+ <exception name="JvmMO_HandlerException">
+ </exception>
+
+ <exception name="LoadModuleFIlePathLengthOutOfRangeException">
+ <description>Exception thrown when file path for the Load Module is out of length.</description>
+ </exception>
+
+ <exception name="LoadModuleMO_HandlerException">
+ </exception>
+
+ <exception name="ManagedElementDataMO_HandlerException">
+ </exception>
+
+ <exception name="MandatoryElementIsMissingException">
+ </exception>
+
+ <exception name="MergeControlFileException">
+ <description>Exception thrown when the merger of control files fails.</description>
+ </exception>
+
+ <exception name="PIU_MO_HandlerException">
+ </exception>
+
+ <exception name="ParseException">
+ </exception>
+
+ <exception name="ParserFactoryException">
+ </exception>
+
+ <exception name="PiuTypeDefinitionMissingInUpgradeControlFileException">
+ <description>Exception thrown when PiuType definitions is missing in the UCF file.</description>
+ </exception>
+
+ <exception name="PiuTypeMO_HandlerException">
+ </exception>
+
+ <exception name="ProductNumberAndRevisionAlreadyInUseException">
+ <description>Exception thrown when the product number and revision is already used.</description>
+ </exception>
+
+ <exception name="ProgramConfigurationException">
+ </exception>
+
+ <exception name="ReconfigureProgramsException">
+ <description>Exception thrown when reconfiguration of programs fails.</description>
+ </exception>
+
+ <exception name="ReferencedElementMissingException">
+ <description>Exception thrown when the referenced element is missing.</description>
+ </exception>
+
+ <exception name="RepertoireMO_HandlerException">
+ </exception>
+
+ <exception name="ReplaceConfigSupportMOsOpException">
+ </exception>
+
+ <exception name="ReserveLoadModulesException">
+ <description>Exception thrown when reserving a Load Module fails.</description>
+ </exception>
+
+ <exception name="SelectiveInstallFailureException">
+ <description>Exception thrown when a selective install fails.</description>
+ </exception>
+
+ <exception name="SlotMO_HandlerException">
+ </exception>
+
+ <exception name="SwAllocationMO_HandlerException">
+ </exception>
+
+ <exception name="UnexpectedAttributeException">
+ <description>Exception thrown when an unexpected attribute occurs at upgrade.</description>
+ </exception>
+
+ <exception name="UnexpectedAttributeFormatException">
+ <description>Exception thrown when an unexpected format of the attribute occurs.</description>
+ </exception>
+
+ <exception name="UnexpectedElementException">
+ <description>Exception thrown when </description>
+ </exception>
+
+ <exception name="UpgradeControlFileDataException">
+ </exception>
+
+ <exception name="UpgradeControlFileNotFoundException">
+ </exception>
+
+ <exception name="UpgradeControlFileParserException">
+ </exception>
+
+ <exception name="UpgradePackageDeleteException">
+ <description>Exception thrown when its not possible to delete the upgrade package.</description>
+ </exception>
+
+ <exception name="UpgradePackageDeleteNotAllowedException">
+ <description>Exception thrown when its not allowed to delete the upgrade package.</description>
+ </exception>
+
+ <exception name="UpgradePackageDoesNotExistException">
+ <description>Exception thrown when the specified upgrade package does not exist.</description>
+ </exception>
+
+ <exception name="UpgradePackageFileSystemErrorException">
+ <description>Exception thrown when an error in the file system occurs.</description>
+ </exception>
+
+ <exception name="UpgradeRejectedException">
+ <description>Exception thrown when the upgrade is rejected.</description>
+ </exception>
+
+ <exception name="ValidateException">
+ </exception>
+
+ <exception name="VerifyChecksumException">
+ <description>Exception thrown when the checksum is incorrect.</description>
+ </exception>
+
+ <exception name="VerifyCreationOfCVsException">
+ <description>Exception thrown when its not possible to verify the creation of CV's.</description>
+ </exception>
+
+ <exception name="VerifyOperationalPIUsException">
+ </exception>
+
+ <exception name="VerifyRejectedException">
+ </exception>
+
+ <exception name="VerifyRequestException">
+ </exception>
+
+ <exception name="VerifySupportedPIUsException">
+ </exception>
+
+ <exception name="VerifyUpgradeHandlerException">
+ </exception>
+
+ <exception name="VerifyUpgradeWindowException">
+ </exception>
+
+ <exception name="UpgradeLogFileNotAccessibleException">
+ <description>The upgrade trace log file is not accessible i.e. the log file exists but it is not possible to access it with write permission.</description>
+ </exception>
+
+ <exception name="UpgradeControlFileException">
+ <description>The file parser has found that the UpgradeControlFile is incorrect.</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="UpgradeNotPossibleException">
+ <description>Before an upgrade is started it was found that the upgrade can not take place. A possible reason is that the upgrade package that is running in the node is not in the upgrade window of this upgrade package. </description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="UpgradeLogFileNotInUseException">
+ <description>The upgrade trace output is currently not directed to a file.
+
+This is a property that can be changed in the trace property file (Trace_01.prop).
+</description>
+ </exception>
+
+ <enum name="UpgradePackageState">
+ <enumMember name="NOT_INSTALLED">
+ <description>The upgrade package is not installed.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="INSTALL_COMPLETED">
+ <description>The upgrade package is completely installed.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="UPGRADE_EXECUTING">
+ <description>Upgrade is executing. </description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="AWAITING_CONFIRMATION">
+ <description>The execution of upgrade needs confirmation before it proceeds.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="ONLY_DELETEABLE">
+ <description>In this state an Upgrade Package can only be deleted. Its actions, when invoked, will throw the exception ActionNotAllowed. </description>
+ <value>4</value>
+ </enumMember>
+ <enumMember name="INSTALL_EXECUTING">
+ <description>Installation of the upgrade package is executing.</description>
+ <value>5</value>
+ </enumMember>
+ <enumMember name="INSTALL_NOT_COMPLETED">
+ <description>The upgrade package is not completely installed i.e. parts of it has been installed. </description>
+ <value>6</value>
+ </enumMember>
+ <enumMember name="UPGRADE_COMPLETED">
+ <description>The upgrade has been successfully executed.</description>
+ <value>7</value>
+ </enumMember>
+ </enum>
+
+ <enum name="UpgradeProgressInformation">
+ <enumMember name="IDLE">
+ <description>No action is in progress. </description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="DOWNLOADING_FILES">
+ <description>Downloading of files (load modules) in progress.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="SAVING_CV">
+ <description>Saving a Configuration Version.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="RECONFIGURING_MOS">
+ <description>Operation ReplaceConfigSupportMOs detected in upgrade.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="INITIATING_LOADER_INFO">
+ <description>Trigger Initiate detected in upgrade sequence.</description>
+ <value>4</value>
+ </enumMember>
+ <enumMember name="PRELOADING">
+ <description>Trigger Preload detected in upgrade sequence.</description>
+ <value>5</value>
+ </enumMember>
+ <enumMember name="CONVERSION_OF_PERSISTENT_DATA">
+ <value>6</value>
+ </enumMember>
+ <enumMember name="APPLICATION_SPECIFIC_ACTION">
+ <description>'Unique trigger' for an application detected in upgrade sequence.</description>
+ <value>7</value>
+ </enumMember>
+ <enumMember name="SHUTDOWN_WAIT">
+ <value>8</value>
+ </enumMember>
+ <enumMember name="TAKING_NEW_SOFTWARE_INTO_SERVICE">
+ <value>9</value>
+ </enumMember>
+ <enumMember name="FINISH_AND_CLEANING_UP">
+ <description>The error handling is switched back to normal.</description>
+ <value>10</value>
+ </enumMember>
+ <enumMember name="RESTORING_SYSTEM_STATE">
+ <value>11</value>
+ </enumMember>
+ <enumMember name="EXECUTION_FAILED">
+ <description>Indicates that the execution of an install or an upgrade action has failed.</description>
+ <value>12</value>
+ </enumMember>
+ <enumMember name="CANCEL_OF_INSTALLATION_IS_EXECUTING">
+ <description>Indicates that cancellation of an ongoing installation is in progress.</description>
+ <value>13</value>
+ </enumMember>
+ <enumMember name="CANCEL_OF_INSTALLATION_FAILED">
+ <description>Indicates that the execution of a cancel install action failed.</description>
+ <value>14</value>
+ </enumMember>
+ <enumMember name="VERIFICATION_INITIATED">
+ <value>15</value>
+ </enumMember>
+ <enumMember name="VERIFYING_UPGRADE_FROM_VERSION">
+ <value>16</value>
+ </enumMember>
+ <enumMember name="VERIFYING_POSSIBLE_TO_CREATE_REQ_NO_CVS">
+ <value>17</value>
+ </enumMember>
+ <enumMember name="VERIFYING_PIUS_SUPPORTED">
+ <value>18</value>
+ </enumMember>
+ <enumMember name="VERIFYING_CHECKSUM_FOR_LM">
+ <value>19</value>
+ </enumMember>
+ <enumMember name="VERIFYING_PIUS_NOT_FAULTY">
+ <value>20</value>
+ </enumMember>
+ <enumMember name="VERIFICATION_FINISHED">
+ <value>21</value>
+ </enumMember>
+ <enumMember name="VERIFICATION_FAILED">
+ <value>22</value>
+ </enumMember>
+ </enum>
+
+ <enum name="InvokedAction">
+ <enumMember name="VERIFY_UPGRADE">
+ <description>The verifyUpgrade action has been invoked.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="UPGRADE">
+ <description>An upgrade action (one of the variants) has been invoked.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="INSTALL">
+ <description>An install action (one of the variants) has been invoked.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="CANCEL_INSTALL">
+ <description>The cancelInstall action has been invoked.</description>
+ <value>4</value>
+ </enumMember>
+ </enum>
+
+ <struct name="ActionResultData">
+ <structMember name="time">
+ <description>A timestamp.
+
+Format: "Date: 2003-04-24, Time: 20:52:11.182"</description>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </structMember>
+ <structMember name="typeOfInvokedAction">
+ <enumRef name="InvokedAction">
+ <defaultValue>VERIFY_UPGRADE</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="info">
+ <enumRef name="Information">
+ <defaultValue>EXECUTED</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="actionId">
+ <description>This id is used to link more than one result to one action</description>
+ <long>
+ <defaultValue>1</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="additionalInfo">
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </structMember>
+ </struct>
+
+ <enum name="Information">
+ <enumMember name="EXECUTED">
+ <description>The invoked action has been successfully executed without warnings.One of three possible main results of executed action.
+
+Value valid for type of invoked action:
+INSTALL
+CANCEL_INSTALL
+VERIFY_UPGRADE
+UPGRADE</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="UNSPECIFIED">
+ <description>A not specified error/ warning has been detected (see additional info for further details)
+
+Value valid for type of invoked action:
+INSTALL
+CANCEL_INSTALL
+VERIFY_UPGRADE
+UPGRADE</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="LM_CHECKSUM_VER_FAILED">
+ <description>A load module checksum verification has failed.
+
+Value valid for type of invoked action:
+INSTALL
+VERIFY_UPGRADE
+UPGRADE</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="NOT_ENOUGH_AVAIL_DISK_SPACE">
+ <description> There is not enough available disk space for the required number of new CVs (configuration versions) to be created automatically during an upgrade.
+
+Value valid for type of invoked action:
+VERIFY_UPGRADE
+UPGRADE</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="MAX_NO_CV_WILL_BE_EXCEEDED">
+ <description>The maximum number of allowed CVs (configuration versions) will be exceeded if the required number of new CVs is created automatically during an upgrade.
+
+Value valid for type of invoked action:
+VERIFY_UPGRADE
+UPGRADE</description>
+ <value>4</value>
+ </enumMember>
+ <enumMember name="UPGRADE_FROM_CURRENT_UP_NOT_ALLOWED">
+ <description>The Upgrade Window element in the Upgrade Control File does not specify the current Upgrade Package as a valid 'upgrade from' version.
+
+Value valid for type of invoked action:
+VERIFY_UPGRADE
+UPGRADE</description>
+ <value>5</value>
+ </enumMember>
+ <enumMember name="NON_SUPPORTED_PIU">
+ <description>A non supported Plug In Unit (PIU) has been detected i.e. the PIU in the node is not defined in the Upgrade Control File.
+This is not a fault that prevents an upgrade from being executed.
+
+Value valid for type of invoked action:
+VERIFY_UPGRADE
+UPGRADE</description>
+ <value>6</value>
+ </enumMember>
+ <enumMember name="FAULTY_PIU">
+ <description>A faulty Plug In Unit (PIU) has been detected.
+This is not a fault that prevents an upgrade from being executed.
+
+Value valid for type of invoked action:
+VERIFY_UPGRADE
+UPGRADE</description>
+ <value>7</value>
+ </enumMember>
+ <enumMember name="CREATION_OF_CV_FAILED">
+ <description>The auto-creation of an install CV failed.
+
+Value valid for type of invoked action:
+INSTALL
+</description>
+ <value>8</value>
+ </enumMember>
+ <enumMember name="ACTION_NOT_ALLOWED">
+ <description>The requested action is not allowed due to an other action already is in progress for an other UP MO.
+
+Value valid for type of invoked action:
+INSTALL
+CANCEL_INSTALL
+VERIFY_UPGRADE
+UPGRADE</description>
+ <value>9</value>
+ </enumMember>
+ <enumMember name="INSTALLATION_MANUALLY_CANCELLED">
+ <description>An ongoing installation has been cancelled (aborted) due to request from client.
+
+Value valid for type of invoked action:
+INSTALL</description>
+ <value>10</value>
+ </enumMember>
+ <enumMember name="FTP_SERVER_NOT_ACCESSIBLE">
+ <description>The FTP server to be used for downloads of load modules is not accessible.
+
+Value valid for type of invoked action:
+INSTALL</description>
+ <value>11</value>
+ </enumMember>
+ <enumMember name="INSUFFICIENT_DISK_SPACE_FOR_LOAD_MODULES">
+ <description>The required disk space for load modules to be installed is insufficient.
+
+Value valid for type of invoked action:
+INSTALL</description>
+ <value>12</value>
+ </enumMember>
+ <enumMember name="FTP_SERVER_IP_ADDRESS_ERROR">
+ <description>Error detected in the IP address of the FTP server.
+
+Value valid for type of invoked action:
+INSTALL</description>
+ <value>13</value>
+ </enumMember>
+ <enumMember name="DELTA_INSTALL_MERGE_ERROR">
+ <description>The install of the delta Upgrade Control File (UCF) failed i.e. the analysis of the delta UCF together with current active UP's UCF failed.
+
+Value valid for type of invoked action:
+INSTALL</description>
+ <value>14</value>
+ </enumMember>
+ <enumMember name="SELECTIVE_INSTALL_ERROR">
+ <description>Error detected during the selection phase of an install.
+
+Value valid for type of invoked action:
+INSTALL
+
+</description>
+ <value>15</value>
+ </enumMember>
+ <enumMember name="EXECUTION_FAILED">
+ <description>The execution of invoked action failed.One of three possible main results of executed action.
+
+Value valid for type of invoked action:
+INSTALL
+CANCEL_INSTALL
+VERIFY_UPGRADE
+UPGRADE</description>
+ <value>16</value>
+ </enumMember>
+ <enumMember name="EXECUTED_WITH_WARNINGS">
+ <description>The action has been successfully executed but with warnings.One of three possible main results of executed action.
+
+Value valid for type of invoked action:
+INSTALL
+CANCEL_INSTALL
+VERIFY_UPGRADE</description>
+ <value>17</value>
+ </enumMember>
+ </enum>
+
+ <exception name="FtpServerNotAccessibleException">
+ <description>Ftp server is not accessible. This may depend on erroneous IP address, username, password, or that the IP communication with the Ftp server is down, or that the Ftp server itself is malfunctioning. </description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="GetFileException">
+ <description>An error was encountered during FTP get file. A filePath in the upgradeControlFile may be inconsistent with a filepath on the Ftp server. </description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <struct name="PiuTypeProgramConfiguration">
+ <structMember name="tag">
+ <description>The tag is used as a reference between the PiuType MO and the Repertoire MO to find out how to create the program object under a PlugInUnit MO.</description>
+ <string/>
+ </structMember>
+ <structMember name="subParentLDN">
+ <description>Local distinguished name of the program parent from the PlugInUnit.
+
+Example:
+1. "Spu=1,Spm=2" (the program is to be created under: ...PlugInUnit=2,Spu=1,Spm=2")
+2. "" (empty string - the program is to be created directly under the PlugInUnit)</description>
+ <string/>
+ </structMember>
+ <structMember name="programMoTypeName">
+ <description>The name of the Program MO that will be created.</description>
+ <string/>
+ </structMember>
+ <structMember name="loadableProcessorName">
+ <description>The loadableProcessorName is a user friendly name of the processor.</description>
+ <string/>
+ </structMember>
+ </struct>
+
+ <struct name="RepertoireLoadModuleData">
+ <description>This structure contains load module data that belongs to a piu type.
+</description>
+ <structMember name="loadModuleDN">
+ <description>The distinguished name of the load module, which is needed and sufficient to convert the load module to a real object reference.</description>
+ <string/>
+ </structMember>
+ <structMember name="tag">
+ <description>The tag is used as a reference between the PiuType MO and the Repertoire MO to find out how to create the program object under a PlugInUnit MO.</description>
+ <string/>
+ </structMember>
+ </struct>
+
+ <struct name="ConfigurationVersionAttributes">
+ <structMember name="name">
+ <string>
+ </string>
+ </structMember>
+ <structMember name="identity">
+ <string>
+ </string>
+ </structMember>
+ <structMember name="type">
+ <string/>
+ </structMember>
+ <structMember name="upgradePackageId">
+ <string/>
+ </structMember>
+ <structMember name="operatorName">
+ <string>
+ </string>
+ </structMember>
+ <structMember name="operatorComment">
+ <string>
+ </string>
+ </structMember>
+ <structMember name="date">
+ <string/>
+ </structMember>
+ <structMember name="status">
+ <string/>
+ </structMember>
+ </struct>
+
+ <enum name="ConfigurationVersionType">
+ <enumMember name="standard">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="upgrade">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="minimal">
+ <value>2</value>
+ </enumMember>
+ <enumMember name="test">
+ <value>3</value>
+ </enumMember>
+ <enumMember name="autocreate">
+ <value>4</value>
+ </enumMember>
+ <enumMember name="other">
+ <value>5</value>
+ </enumMember>
+ </enum>
+
+ <enum name="LoadModuleLoaderType">
+ <enumMember name="OseLoader">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="SpmLoader">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="Jvm">
+ <value>2</value>
+ </enumMember>
+ <enumMember name="WebServer">
+ <value>3</value>
+ </enumMember>
+ <enumMember name="Other">
+ <value>99</value>
+ </enumMember>
+ <enumMember name="SpmFpgaLoader">
+ <value>4</value>
+ </enumMember>
+ <enumMember name="XpLoader">
+ <value>5</value>
+ </enumMember>
+ </enum>
+
+ <enum name="LoadModulePreLoadType">
+ <enumMember name="no">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="must">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="wish">
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="RPUSwitchOverMode">
+ <description>This attribute can have the following values:
+
+AtPiuFault = Indicates the MP (where the normal RPU is configured) is faulty (HW error). This is the default value.
+
+AtPiuRestart = Indicates the MP (where the normal RPU is configured) is restarted.</description>
+ <enumMember name="AtPiuFault">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="AtPiuRestart">
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="RPUNormalisationMode">
+ <description>This enumeration can have the following values:
+
+Manual = Indicates that no normalisation is performed by cello until the operator issues a "switch" action.
+
+Automatic = Indicates that Cello performs the normalisation automatically, after the failed RPU is available again. This is the default value.</description>
+ <enumMember name="Manual">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="Automatic">
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="RPUReplicationMode">
+ <description>This enumaration contains the following values:
+
+Always = Data replication is always performed. This overrides the characteristics set on the each container ( that is associated with the RPU ).
+
+Never = Data replication is never performed. This overrides the characteristics set on the each container ( that is associated with the RPU ).
+
+AtShutdown = Each time the RSH (which handles the RPU) is shut down, a complete snapshot is taken and replicated to the other MP, if necessary. Otherwise, the replication is performed according to the characteristics set on each container ( that is associated with the RPU ).
+
+ApplControlled = The data replication is made according to the characteristics set on each container ( that is associated with the RPU ). This is the default value.</description>
+ <enumMember name="Always">
+ <description>Always = Data replication is always performed. This overrides the characteristics set on the each container ( that is associated with the RPU ).</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="Never">
+ <description>Data replication is never performed. This overrides the characteristics set on the each container ( that is associated with the RPU ).</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="AtShutdown">
+ <description>AtShutdown = Each time the RSH (which handles the RPU) is shut down, a complete snapshot is taken and replicated to the other MP, if necessary. Otherwise, the replication is performed according to the characteristics set on each container ( that is associated with the RPU ).</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="ApplControlled">
+ <description>ApplControlled = The data replication is made according to the characteristics set on each container ( that is associated with the RPU ). This is the default value.</description>
+ <value>4</value>
+ </enumMember>
+ </enum>
+
+ <enum name="RPUOperationalMode">
+ <description>This enumeration contains the following values:
+
+AsConfigured = The RSHs runs as the RPU is configured.
+SwitchOver = The RSHs has been switched over.
+Unavailable = No RSHs, that uses this RPU, are running.</description>
+ <enumMember name="AsConfigured">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="SwitchedOver">
+ <value>2</value>
+ </enumMember>
+ <enumMember name="Unavailable">
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <struct name="PiuTypeMOConfiguration">
+ <structMember name="subParentLDN">
+ <string/>
+ </structMember>
+ <structMember name="moTypeName">
+ <string/>
+ </structMember>
+ <structMember name="identity">
+ <string/>
+ </structMember>
+ </struct>
+
+ <struct name="AirFlowData">
+ <description>Control value for the fan unit. Needed by cooling function.
+</description>
+ <structMember name="normalLowTempAirFlow">
+ <description>Control value for the fan unit running in normal autonomous mode.
+This parameter is the subrack/fanunit airflow value that is required to achieve sufficient cooling at 20 degree
+centigrade or lower ambient temperature of the most demanding plug in unit (PIU) in the subrack. This airflow value
+shall be sufficient (but not unnecessarily large) to secure that no "normal overtemp" fault indication is issued.
+Default values = 250 m3/h. (value &gt;=0)
+</description>
+ <float>
+ <defaultValue>250</defaultValue>
+ </float>
+ </structMember>
+ <structMember name="normalHighTempAirFlow">
+ <description>Control value for the fan unit running in normal autonomous mode. This parameter is the subrack/fanunit airflow
+value that is required to achieve sufficient cooling at 50 degree centigrade ambient temperature of the most
+demanding plug in unit (PIU) in the subrack. This airflow value shall be sufficient (but not unnecessarily large) to
+secure that no "normal overtemp" fault indication is issued.
+Default values = 400 m3/h. (value &gt;=0)</description>
+ <float>
+ <defaultValue>400</defaultValue>
+ </float>
+ </structMember>
+ <structMember name="noiseReducedLowTempAirFlow">
+ <description>Control value for the fan unit running in noise reduction mode. This parameter is the subrack/fanunit airflow value
+that is required to achieve sufficient cooling at 20 degree centigrade or lower ambient temperature of the most
+demanding plug in unit (PIU) in the subrack. This airflow value shall be sufficient (but not unnecessarily large) to
+secure that no "exceptional overtemp" fault indication is issued
+Default values = 250 m3/h. (value &gt;=0)</description>
+ <float>
+ <defaultValue>250</defaultValue>
+ </float>
+ </structMember>
+ <structMember name="noiseReducedHighTempAirFlow">
+ <description>Control value for the fan unit running in noise reduction mode. This parameter is the subrack/fanunit airflow value
+that is required to achieve sufficient cooling at 50 degree centigrade ambient temperature of the most demanding
+plug in unit (PIU) in the subrack. This airflow value shall be sufficient (but not unnecessarily large) to secure
+that no "exceptional overtemp" fault indication is issued.
+Default values = 400 m3/h. (value &gt;=0)</description>
+ <float>
+ <defaultValue>400</defaultValue>
+ </float>
+ </structMember>
+ </struct>
+
+ <exception name="IpAddressException">
+ <description>Erroneous Ip Address Format</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="AueFailureException">
+ <description>An application upgrade engine has reported a failure. </description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="ActionNotAllowedException">
+ <description>The action is not allowed, the UpgradePackage MO is in wrong state.
+
+For example if you try 'upgrade()' before an 'install()' or 'forcedInstall()' has been done.</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="CVFileSystemErrorException">
+ <description>Exception thrown upon file system Error.</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="CVDBErrorException">
+ <description>Data Base Error Exception (error when creating database backup).</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="CVLLPErrorException">
+ <description>LLP Error Exception (error when creating ARMAMENT and LLP.LMID files).</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="CVAlreadyExistsException">
+ <description>The configuration version already exists (e.g. message at create).</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="CVDoesNotExistsException">
+ <description>The configuration version does not exist (e.g. message at setCVAsStartable).</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="CVDeleteNotAllowedException">
+ <description>It is not allowed to delete the configuration version, because it is in use (used as startable or in rollback list).</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="CVInvalidCVException">
+ <description>The configuration version is not valid (due to missing files).
+
+</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="CVFormatErrorException">
+ <description>Format Error in given configuration version name.
+
+The following characters are allowed within the name:
+[0-9], [A-Z], [a-z] and '&amp;','%',':','.','_', '-'
+
+Note! For comment and operatorName spaces (' ') are also allowed within the strings.</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="CVErrorException">
+ <description>Error Exception.</description>
+ <exceptionParameter name="message">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="InstallException">
+ <description>Indicates that an error in an installation has occurred.</description>
+ <exceptionParameter name="install">
+ <description>The message of the exception.</description>
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="LogActivationException">
+ <description>Exception thrown when a database error occurs.</description>
+ </exception>
+
+ <exception name="InvalidDriveNameException">
+ <description>Exception thrown when an invalid drive name is specified or when a data base error occurs.</description>
+ </exception>
+
+ <exception name="VerifyUpgradeException">
+ </exception>
+
+ <exception name="CVActivityLogFilePathErrorException">
+ <description>Exception thrown when the log file path is wrong.</description>
+ </exception>
+
+ <exception name="CV_MaxNumberOfInstancesException">
+ <description>Exception thrown when max number of CV's in the system has been reached.</description>
+ </exception>
+
+ <exception name="Aal2PathIdNotUniqueException">
+ <exceptionParameter name="message">
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="PathAlreadyRegisteredException">
+ <exceptionParameter name="message">
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="NotInGroupException">
+ </exception>
+
+ <exception name="InvalidReferenceException">
+ </exception>
+
+ <exception name="InvalidPriorityException">
+ <description>Indicates an invalid priority level, i.e. the priority in question is out of the defined range.</description>
+ <exceptionParameter name="invalidPriority">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <struct name="QoSProfileClassA">
+ <description>This struct contains the values applicable for QoS Class A.</description>
+ <structMember name="boundOnProbOfDelay">
+ <description>Represents the upper bound on the probability that the delay in the node exceeds the delay limit given by the attribute "boundOnNodeDelay".
+
+Unit is 1/1000000000.
+</description>
+ <long>
+ <range>
+ <min>0</min> <max>1000000000</max>
+ </range>
+ <defaultValue>500000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="boundOnProbOfLoss">
+ <description>Represents the upper bound of the cell loss probability in the current node.
+
+Unit is 1/1000000000.</description>
+ <long>
+ <range>
+ <min>0</min> <max>1000000000</max>
+ </range>
+ <defaultValue>500000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="boundOnNodeDelay">
+ <description>The upper bound on the delay (delay=queueing and serving of Aal2 packets in an Aal2 mux + delay on ATM layer) through the current node.
+Unit is micro seconds.</description>
+ <long>
+ <range>
+ <min>0</min> <max>10000</max>
+ </range>
+ <defaultValue>5000</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <struct name="QoSProfileClassB">
+ <description>This struct contains the values applicable for QoS Class B.</description>
+ <structMember name="boundOnProbOfDelay">
+ <description>Represents the upper bound on the probability that the delay in the node exceeds the delay limit given by the attribute "boundOnNodeDelay".
+
+Unit is 1/1000000000.</description>
+ <long>
+ <range>
+ <min>0</min> <max>1000000000</max>
+ </range>
+ <defaultValue>500000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="boundOnProbOfLoss">
+ <description>Represents the upper bound of the cell loss probability in the current node.
+
+Unit is 1/1000000000.
+</description>
+ <long>
+ <range>
+ <min>0</min> <max>1000000000</max>
+ </range>
+ <defaultValue>500000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="boundOnNodeDelay">
+ <description>The upper bound on the delay (delay=queueing and serving of Aal2 packets in an Aal2 mux + delay on ATM layer) through the current node.
+Unit is micro seconds.</description>
+ <long>
+ <range>
+ <min>0</min> <max>20000</max>
+ </range>
+ <defaultValue>15000</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <struct name="QoSProfileClassC">
+ <description>This struct contains the values applicable for QoS Class C.
+
+NOTE: The attribute 'boundONodeDelay' is not applicable for QoS Class C so setting of this attribute will have no effect.</description>
+ <structMember name="boundOnProbOfDelay">
+ <description>Represents the upper bound on the probability that the delay in the node exceeds the delay limit given by the attribute "boundOnNodeDelay".
+
+Unit is 1/1000000000.</description>
+ <long>
+ <range>
+ <min>0</min> <max>1000000000</max>
+ </range>
+ <defaultValue>1000000000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="boundOnProbOfLoss">
+ <description>Represents the upper bound of the cell loss probability in the current node.
+
+Unit is 1/1000000000.
+</description>
+ <long>
+ <range>
+ <min>0</min> <max>1000000000</max>
+ </range>
+ <defaultValue>1000000000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="boundOnNodeDelay">
+ <description>The upper bound on the delay (delay=queueing and serving of Aal2 packets in an Aal2 mux + delay on ATM layer) through the current node.
+Unit is micro seconds.</description>
+ <long>
+ <defaultValue>25000</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <struct name="QoSProfileClassD">
+ <description>This struct contains the values applicable for QoS Class D.
+
+NOTE: The attribute 'boundONodeDelay' is not applicable for QoS Class D so setting of this attribute will have no effect.</description>
+ <structMember name="boundOnProbOfDelay">
+ <description>Represents the upper bound on the probability that the delay in the node exceeds the delay limit given by the attribute "boundOnNodeDelay".
+
+Unit is 1/1000000000.</description>
+ <long>
+ <range>
+ <min>1</min> <max>1000000000</max>
+ </range>
+ <defaultValue>1000000000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="boundOnProbOfLoss">
+ <description>Represents the upper bound of the cell loss probability in the current node.
+
+Unit is 1/1000000000.</description>
+ <long>
+ <range>
+ <min>0</min> <max>1000000000</max>
+ </range>
+ <defaultValue>1000000000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="boundOnNodeDelay">
+ <description>The upper bound on the delay (delay=queueing and serving of Aal2 packets in an Aal2 mux + delay on ATM layer) through the current node.
+Unit is micro seconds.</description>
+ <long>
+ <defaultValue>50000</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <enum name="SupportedQoSClasses">
+ <enumMember name="NO_CLASS_SUPPORTED">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="CLASS_A">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="CLASS_B">
+ <value>2</value>
+ </enumMember>
+ <enumMember name="CLASS_A_B">
+ <value>3</value>
+ </enumMember>
+ <enumMember name="CLASS_C">
+ <value>4</value>
+ </enumMember>
+ <enumMember name="CLASS_A_C">
+ <value>5</value>
+ </enumMember>
+ <enumMember name="CLASS_B_C">
+ <value>6</value>
+ </enumMember>
+ <enumMember name="CLASS_A_B_C">
+ <value>7</value>
+ </enumMember>
+ <enumMember name="CLASS_D">
+ <value>8</value>
+ </enumMember>
+ <enumMember name="CLASS_A_D">
+ <value>9</value>
+ </enumMember>
+ <enumMember name="CLASS_B_D">
+ <value>10</value>
+ </enumMember>
+ <enumMember name="CLASS_A_B_D">
+ <value>11</value>
+ </enumMember>
+ <enumMember name="CLASS_C_D">
+ <value>12</value>
+ </enumMember>
+ <enumMember name="CLASS_A_C_D">
+ <value>13</value>
+ </enumMember>
+ <enumMember name="CLASS_B_C_D">
+ <value>14</value>
+ </enumMember>
+ <enumMember name="CLASS_A_B_C_D">
+ <value>15</value>
+ </enumMember>
+ </enum>
+
+ <exception name="IsReservedCanNotSetPathIdException">
+ <description>Exception thrown when an attempt is made to set or change the aal2PathId of an Aal2PathVccTp while its reserved by an other Aal2PathGrp</description>
+ </exception>
+
+ <exception name="IsUnlockedCanNotSetPathOwnerException">
+ <description>Exception thrown when an attempt is made to set or change the aal2PathOwner of an Aal2PathVccTp while its not LOCKED.</description>
+ </exception>
+
+ <enum name="SlotState">
+ <description>
+</description>
+ <enumMember name="free">
+ <description>It is free to be pre-configured with a new PlugInUnit. </description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="used">
+ <description>A PlugInUnit is inserted in the slot or the slot is pre-configured with a PlugInUnit.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="coveredByPiu">
+ <description>Currently not supported.</description>
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <struct name="AdminProductData">
+ <structMember name="productNumber">
+ <description>The product number of the product or document.
+
+Examples: ABC 101 001, CXC 123 456, 1/BFD 101 999
+
+In the case of UpgradePackage this is the document number of the upgrade package.</description>
+ <string>
+ <lengthRange>
+ <min>1</min> <max>24</max>
+ </lengthRange>
+ </string>
+ </structMember>
+ <structMember name="productRevision">
+ <description>The revision of the product number.
+
+Examples: R1, r1a, R1A02, P7B</description>
+ <string>
+ <lengthRange>
+ <min>1</min> <max>7</max>
+ </lengthRange>
+ </string>
+ </structMember>
+ <structMember name="productName">
+ <description>A user-friendly name of the product.</description>
+ <string>
+ <lengthRange>
+ <min>1</min> <max>12</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </structMember>
+ <structMember name="productInfo">
+ <description>User-friendly information about the product.</description>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </structMember>
+ <structMember name="productionDate">
+ <description>The production date can be represented in two ways.
+
+1) The preferable syntax is a four-digit representation of the year, and a two-digit representation of the month and a two-digit representation of the day. The numbers of characters in this case, is eight.
+Example:
+19991231
+
+2) The date can also consist of two digits for the year, followed by the letter W for week and two digits for the number of week. The numbers of characters in this case, is five.
+Example:
+99W12
+</description>
+ <string>
+ <lengthRange>
+ <min>1</min> <max>8</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </structMember>
+ </struct>
+
+ <struct name="OperProductData">
+ <structMember name="productName">
+ <description>A user-friendly name of the product.
+
+
+
+</description>
+ <string>
+ <lengthRange>
+ <min>1</min> <max>12</max>
+ </lengthRange>
+ </string>
+ </structMember>
+ <structMember name="productNumber">
+ <description>Unique identity for each product, which is constituted by the Ericsson product number (ABC number).
+
+The maximum number of characters for a product number is 24 including 2 slashes, 2 spaces and 2 characters for origination notation.
+
+Example of product number:
+ABC 101 001
+(1/ABC 101 01/1234)
+123/ABCDE 101 1010/12345
+
+.</description>
+ <string>
+ <lengthRange>
+ <min>1</min> <max>24</max>
+ </lengthRange>
+ </string>
+ </structMember>
+ <structMember name="productRevision">
+ <description>Indicates the revision state of the product. It consists of a letter R or P, one or two digits and/or one or two letters. The maximum number of characters is four inclusive R or P.
+Example: R1A, R1A02, P7B
+
+A suffix may be added to the revision state. The suffix may consists of one or two digits or one letter.
+
+
+</description>
+ <string>
+ <lengthRange>
+ <min>1</min> <max>7</max>
+ </lengthRange>
+ </string>
+ </structMember>
+ <structMember name="serialNumber">
+ <description>The serial number consists of 13 alphanumerical characters grouped as 6 plus 7 characters. The first 6 characters are to be used for factory codes and the last 7 characters are used for an individual number or batch number.
+
+</description>
+ <string/>
+ </structMember>
+ <structMember name="productionDate">
+ <description>The production date can be represented in two ways.
+
+1) The preferable syntax is a four-digit representation of the year, and a two-digit representation of the month and a two-digit representation of the day. The numbers of characters in this case, is eight.
+Example:
+19991231
+
+2) The date can also consist of two digits for the year, followed by the letter W for week and two digits for the number of week. The numbers of characters in this case, is five.
+Example:
+99W12
+
+</description>
+ <string>
+ <lengthRange>
+ <min>5</min> <max>8</max>
+ </lengthRange>
+ </string>
+ </structMember>
+ </struct>
+
+ <enum name="LoadClass">
+ <description>Defines the phase in the load and start sequence.
+</description>
+ <enumMember name="coreOs">
+ <value>10</value>
+ </enumMember>
+ <enumMember name="coreDevice">
+ <value>50</value>
+ </enumMember>
+ <enumMember name="loadListProvider">
+ <value>100</value>
+ </enumMember>
+ <enumMember name="coreEarly">
+ <value>200</value>
+ </enumMember>
+ <enumMember name="coreLate">
+ <value>300</value>
+ </enumMember>
+ <enumMember name="networkAndConnectionHandling">
+ <value>400</value>
+ </enumMember>
+ <enumMember name="application">
+ <value>500</value>
+ </enumMember>
+ <enumMember name="upgrade">
+ <value>600</value>
+ </enumMember>
+ </enum>
+
+ <enum name="StartState">
+ <enumMember name="disabled">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="enabled">
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="SubrackType">
+ <enumMember name="hub">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="device">
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="PiuRole">
+ <enumMember name="mp">
+ <description>The board is a Main processor.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="bp">
+ <description>The board is a device board.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="others">
+ <description>The board is not a Main processor or a device board. </description>
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <enum name="RestartCause">
+ <description>This attribute indicates the restart cause of plugInUnit. The defined values are:
+1. piuRestartError: restart because of error.
+2. piuRestartUpgrade: restart because of system upgrade.
+</description>
+ <enumMember name="piuRestartUpgrade">
+ <description>This attributes indicates that the Piu restart cause is upgrade.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="piuRestartError">
+ <description>This attributes indicates that the Piu restart cause is error.</description>
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="FanState">
+ <description>The Fan can be in one of three controlling state:
+- standalone: not manageable, full speed fans
+- autonomous: manageable, air-flow control
+- noiseReduced: time-limited low speed fan</description>
+ <enumMember name="standalone">
+ <description>It's running on itself, not manageable.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="autonomous">
+ <description>Manageable state.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="noiseReduced">
+ <description>Temporary state with reduced cooling.</description>
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <enum name="SeqRestarts">
+ <enumMember name="RESTARTS_WITH_NO_LIMITS">
+ <description>This attributes indicates unlimited restarts and no faulty marking of the PIU. Used for critical PIU's such as TUBs, SCBs and some ET-boards.
+</description>
+ <value>-1</value>
+ </enumMember>
+ <enumMember name="RESTARTS_WITH_WARM">
+ <description>This attributes indicates the following sequential restarts:
+-warm
+-refresh
+-cold
+-cold with fault marked (not loaded). Alarm sent.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="RESTARTS_WITH_REFRESH">
+ <description>This attributes indicates the following sequential restarts:
+-refresh
+-cold
+-cold with fault marked (not loaded). Alarm sent.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="RESTARTS_WITH_COLD">
+ <description>This attributes indicates the following sequential restarts:
+-cold
+-cold with fault marked (not loaded). Alarm sent.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="RESTARTS_WITH_FAULT_MARKED">
+ <description>This attributes indicates the following sequential restarts:
+-cold with fault marked (not loaded). Alarm sent.</description>
+ <value>0</value>
+ </enumMember>
+ </enum>
+
+ <exception name="RepertoireNotFoundException">
+ <description>This class is an exception class thrown when a equipment specific error occurs.
+</description>
+ </exception>
+
+ <exception name="SwAllocationNotFoundException">
+ <description>This class is an exception class thrown when a equipment specific error occurs.
+</description>
+ </exception>
+
+ <exception name="WebServerPathConfigurationException">
+ <description>This class is an exception class thrown when failed to configure the webserver root path
+</description>
+ </exception>
+
+ <exception name="FroLocationFailedException">
+ </exception>
+
+ <exception name="FroShutdownException">
+ </exception>
+
+ <exception name="NotUniqueLineNoException">
+ </exception>
+
+ <exception name="WrongPhysPathTermTypeException">
+ </exception>
+
+ <enum name="OperState">
+ <enumMember name="disabled">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="enabled">
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="AdmState">
+ <enumMember name="locked">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="unlocked">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="shuttingDown">
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <exception name="OccupiedException">
+ </exception>
+
+ <exception name="NotReservedException">
+ </exception>
+
+ <exception name="NotSupportedException">
+ </exception>
+
+ <enum name="SilPortState">
+ <description>Indication of Switch Internal Link port status.</description>
+ <enumMember name="portActive">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="portPassive">
+ <value>2</value>
+ </enumMember>
+ <enumMember name="portNotConnected">
+ <value>3</value>
+ </enumMember>
+ <enumMember name="portLocked">
+ <value>4</value>
+ </enumMember>
+ <enumMember name="portNotInstalled">
+ <value>5</value>
+ </enumMember>
+ </enum>
+
+ <exception name="InvalidIndexException">
+ <description>Index specified is invalid, i.e. it is out of the range of valid indices.</description>
+ <exceptionParameter name="invalidIndex">
+ <description>The exception message.</description>
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="TransactionException">
+ </exception>
+
+ <exception name="UndeletableMoException">
+ <description>Exception thrown when MO is not possible to delete.</description>
+ </exception>
+
+ <exception name="FroNotAccessibleException">
+ <description>Exception that is thrown when a FRO (Facade Resource Object in the resource layer) cannot be accessed.</description>
+ </exception>
+
+ <exception name="FroRequestFailedException">
+ <description>Exception that is thrown when the result of a request to a FRO (Facade Resource Object in the resource layer) is not ok.</description>
+ </exception>
+
+ <exception name="MoReservedByOtherUserException">
+ <description>Exception thrown when the MO is already reserved by another user (MO).</description>
+ </exception>
+
+ <exception name="MoHasChildrenException">
+ <description>Exception class thrown when an MO is requested to be deleted, but the MO has children, which must be deleted first.</description>
+ </exception>
+
+ <exception name="MoReservedNotDeletableException">
+ <description>Exception thrown when trying to delete an MO that is reserved by another MO (user).</description>
+ </exception>
+
+ <exception name="MaxNumberExceededException">
+ <description>Exception thrown when the maximum number of childrens for an MO is exceeded.</description>
+ </exception>
+
+ <exception name="AttrValueNotUniqueException">
+ <description>Exception thrown when a value of an attribute is not unique.</description>
+ </exception>
+
+ <exception name="EquipException">
+ </exception>
+
+ <exception name="IpFormatException">
+ </exception>
+
+ <exception name="IpException">
+ </exception>
+
+ <exception name="TransactionRequiredException">
+ <description>Exception class thrown when an MO is accessed outside a transaction but the access method requires a transaction.</description>
+ </exception>
+
+ <exception name="ValueOutOfRangeException">
+ <description>Exception thrown when an MO attribute is requested to be set, but the requested value is not accepted.</description>
+ </exception>
+
+ <exception name="WrongAttributeTypeException">
+ <description>Exception thrown when an MO attribute is requested to be set, but the requested value is of the wrong type. </description>
+ </exception>
+
+ <exception name="NotHandledAttributeTypeException">
+ <description>Exception class thrown when an attribute of not handled type is requested. </description>
+ </exception>
+
+ <exception name="NoSuchFieldException">
+ <description>Exception class thrown when a Struct is accessed but the reqested Struct element is not found. </description>
+ </exception>
+
+ <exception name="MoCanNotBeCreatedException">
+ </exception>
+
+ <exception name="NoSuchAttributeException">
+ <description>Exception thrown when an MO attribute is requested to be accessed but the access
+method for the is not defined (the attribute can not be accessed)</description>
+ </exception>
+
+ <exception name="MoCardinalityViolationException">
+ <description>Exception class thrown when the creation of an MO fails due to child - parent
+cardinality violation. The cardinality is specified in the MIM. </description>
+ </exception>
+
+ <exception name="IllegalParentException">
+ <description>Exception thrown when the parent of the MO is of the wrong type.</description>
+ </exception>
+
+ <exception name="AttrNotSettableAtCreateException">
+ <description>Exception thrown when a create is ordered with
+attribute values that are not settable at create.</description>
+ </exception>
+
+ <exception name="AttrMissingAtCreateException">
+ <description>Exception thrown when an attribute that is mandatory at create is missing.</description>
+ </exception>
+
+ <exception name="MoNameAlreadyTakenException">
+ <description>Exception thrown when an MO is created and the distinguished name of the MO is already in use.</description>
+ </exception>
+
+ <exception name="IllegalArgumentTypeException">
+ <description>Exception thrown if the argument supplied is of the wrong type, for example in an action.</description>
+ </exception>
+
+ <exception name="IllegalAttributeValueException">
+ <description>Exception thrown if the value of the attribute is not valid.</description>
+ </exception>
+
+ <enum name="RestartRank">
+ <enumMember name="RESTART_WARM">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="RESTART_REFRESH">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="RESTART_COLD">
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="AvailabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <enumMember name="IN_TEST">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="FAILED">
+ <value>2</value>
+ </enumMember>
+ <enumMember name="POWER_OFF">
+ <value>4</value>
+ </enumMember>
+ <enumMember name="OFF_LINE">
+ <value>8</value>
+ </enumMember>
+ <enumMember name="OFF_DUTY">
+ <value>16</value>
+ </enumMember>
+ <enumMember name="DEGRADED">
+ <value>64</value>
+ </enumMember>
+ <enumMember name="NOT_INSTALLED">
+ <value>128</value>
+ </enumMember>
+ <enumMember name="LOG_FULL">
+ <value>256</value>
+ </enumMember>
+ <enumMember name="DEPENDENCY_LOCKED">
+ <value>544</value>
+ </enumMember>
+ <enumMember name="DEPENDENCY_FAILED">
+ <value>1056</value>
+ </enumMember>
+ <enumMember name="DEPENDENCY_SHUTTINGDOWN">
+ <value>2080</value>
+ </enumMember>
+ <enumMember name="NO_STATUS">
+ <value>0</value>
+ </enumMember>
+ </enum>
+
+ <exception name="InvalidMoReferenceException">
+ <description>Exception thrown when the submitted MO reference is invalid.</description>
+ </exception>
+
+ <exception name="FroNotLockedException">
+ <description>Exception thrown when a fRo cannot be accessed.</description>
+ </exception>
+
+ <exception name="GeneralErrorException">
+ <description>Exception thrown by an MO when there is a general error.</description>
+ </exception>
+
+ <exception name="IdentityNotAllowedException">
+ <description>Exception thrown when an identity (LDN) specified at create is not allowed.</description>
+ </exception>
+
+ <exception name="IllegalMoTypeException">
+ <description>Exception thrown when a reference to an MO is of a unexpected/wrong MO type.</description>
+ </exception>
+
+ <exception name="ImpossibleCollectAtmInfoException">
+ <description>Exception thrown when gathering of ATM info fails.</description>
+ </exception>
+
+ <exception name="MoCanNotBeDeletedException">
+ <description>Exception thrown when its not possible to delete an MO.</description>
+ </exception>
+
+ <exception name="MoNotPossibleToReserveException">
+ <description>Exception thrown when by an MO if its not possible to reserve the MO.</description>
+ </exception>
+
+ <exception name="MoNotReservedByUserException">
+ <description>Exception thrown when a user tries to release an MO that is not reserved by this user.</description>
+ </exception>
+
+ <exception name="NoDiskException">
+ <description>Exception thrown when there is no hard disk.</description>
+ </exception>
+
+ <exception name="RemovalFailedException">
+ <description>Exception thrown when an element cannot be removed from a sequence.</description>
+ </exception>
+
+ <exception name="RestartRejectedException">
+ <description>Exception thrown when restart of the PlugInUnit is not allowed.</description>
+ </exception>
+
+ <enum name="SyncMode">
+ <description>The Sync Mode Operation of the node.</description>
+ <enumMember name="NOT_USED">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="CDMA">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="WCDMA">
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <struct name="Mtp2ProfileDataAnsi">
+ <structMember name="suermT">
+ <description>SUERM parameter T.
+Measured in SU units.</description>
+ <long>
+ <range>
+ <min>1</min> <max>511</max>
+ </range>
+ <defaultValue>64</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="suermD">
+ <description>SUREM parameter D.
+Measurement units are in SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>256</max>
+ </range>
+ <defaultValue>256</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="suermN">
+ <description>SUERM parameter N.
+Measurement units are in SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>256</max>
+ </range>
+ <defaultValue>16</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="tin">
+ <description>Normal AERM threshold, Tin. Number of signal errors that cause abortion of a normal proving peroid.
+
+Measurement units are SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>7</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="tie">
+ <description>Emergency AERM threshold, Tie. Number of signal units errors that cause abortion of an emergency proving period.
+
+Measurement units are SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>7</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="provings">
+ <description>Proving abort limit. Number of consecutive aborted proving periods that will cause a return to the Out Of Service state.
+
+Measurement units are the number of proving periods.</description>
+ <long>
+ <range>
+ <min>1</min> <max>7</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT1">
+ <description>Maximum time to stay in Aligned Ready state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>16300</max>
+ </range>
+ <defaultValue>12900</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT2">
+ <description>Maximum time to stay in Not Aligned state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>32700</max>
+ </range>
+ <defaultValue>5000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT3">
+ <description>Maximum time to stay in Aligned state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>16300</max>
+ </range>
+ <defaultValue>11500</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT4n">
+ <description>Length of the normal proving period.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>4000</max>
+ </range>
+ <defaultValue>2300</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT4e">
+ <description>Length of the emergengcy proving period.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>4000</max>
+ </range>
+ <defaultValue>600</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT5">
+ <description>Time between sending Status Indication "B" while in the Congested state.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>1</min> <max>255</max>
+ </range>
+ <defaultValue>80</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT6">
+ <description>Maximum time a remote site may remain in the congestated state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>8100</max>
+ </range>
+ <defaultValue>1000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT7">
+ <description>Maximum time to wait for an expected acknowledgement of an MSU before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>2000</max>
+ </range>
+ <defaultValue>500</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="bitRate">
+ <description>The speed of the link. Only supported values are 64 and 56 kbit/s.
+0 = 64 kbit/s.
+1 = 56 kbit/s.
+
+</description>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="errorCorrection">
+ <description>The error correction algorithm to use. Only Basic Error Correction (BEC) is supported.
+0 = BEC
+</description>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionOnSet1">
+ <description>Percentage of the Transmit Buffer that will cause MTP2 to signal congestion for prio 1 messages towards client.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>70</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionOnSet2">
+ <description>Percentage of the Transmit Buffer that will cause MTP2 to signal congestion for prio 2 messages towards client.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>80</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionOnSet3">
+ <description>Percentage of the Transmit Buffer that will cause MTP2 to signal congestion for prio 3 messages towards client.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>90</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionAbatement1">
+ <description>Percentage of the Transmit Buffer that ceases congestion for prio 1 messages.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>60</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionAbatement2">
+ <description>Percentage of the Transmit Buffer that ceases congestion for prio 2 messages.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>70</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionAbatement3">
+ <description>Percentage of the Transmit Buffer that ceases congestion for prio 3 messages.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>80</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionDiscardLevel1">
+ <description>Percentage of the Transmit Buffer where messages sent to MTP2 from client with priority less than 1 is discarded by MTP2.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionDiscardLevel2">
+ <description>Percentage of the Transmit Buffer where messages sent to MTP2 from client with priority less than 2 is discarded by MTP2.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionDiscardLevel3">
+ <description>Percentage of the Transmit Buffer where messages sent to MTP2 from client with priority less than 3 is discarded by MTP2.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="n1Onset">
+ <description>Number of MSUs in ReTransmit Buffer before onset of preventive retransmission in PCR.
+NOTE: Only valid if errorCorrection==SCC_MTP2_ERROR_CORRECTION_PCR.
+This value is ignored otherwise.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>60</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="n2Onset">
+ <description>Number of MSUs in ReTransmit Buffer before onset of preventive retransmission in PCR.
+NOTE: Only valid if errorCorrection==SCC_MTP2_ERROR_CORRECTION_PCR.
+This value is ignored otherwise.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>70</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <struct name="Mtp2ProfileDataItu">
+ <structMember name="suermT">
+ <description>SUERM parameter T.
+Measured in SU units.</description>
+ <long>
+ <range>
+ <min>1</min> <max>64</max>
+ </range>
+ <defaultValue>64</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="suermD">
+ <description>SUREM parameter D.
+Measurement units are in SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>256</max>
+ </range>
+ <defaultValue>256</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="suermN">
+ <description>SUERM parameter N.
+Measurement units are in SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>256</max>
+ </range>
+ <defaultValue>16</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="tin">
+ <description>Normal AERM threshold, Tin. Number of signal errors that cause abortion of a normal proving peroid.
+
+Measurement units are SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>7</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="tie">
+ <description>Emergency AERM threshold, Tie. Number of signal units errors that cause abortion of an emergency proving period.
+
+Measurement units are SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>7</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="provings">
+ <description>Proving abort limit. Number of consecutive aborted proving periods that will cause a return to the Out Of Service state.
+
+Measurement units are the number of proving periods.</description>
+ <long>
+ <range>
+ <min>1</min> <max>7</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT1">
+ <description>Maximum time to stay in Aligned Ready state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>65500</max>
+ </range>
+ <defaultValue>40000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT2">
+ <description>Maximum time to stay in Not Aligned state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>262000</max>
+ </range>
+ <defaultValue>5000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT3">
+ <description>Maximum time to stay in Aligned state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>2000</max>
+ </range>
+ <defaultValue>1000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT4n">
+ <description>Length of the normal proving period.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>16300</max>
+ </range>
+ <defaultValue>7500</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT4e">
+ <description>Length of the emergengcy proving period.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>16300</max>
+ </range>
+ <defaultValue>400</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT5">
+ <description>Time between sending Status Indication "B" while in the Congested state.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>1</min> <max>255</max>
+ </range>
+ <defaultValue>80</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT6">
+ <description>Maximum time a remote site may remain in the congestated state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>8100</max>
+ </range>
+ <defaultValue>3000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT7">
+ <description>Maximum time to wait for an expected acknowledgement of an MSU before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>2000</max>
+ </range>
+ <defaultValue>500</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="bitRate">
+ <description>The speed of the link. Only supported values are 64 and 56 kbit/s.
+0 = 64 kbit/s.
+1 = 56 kbit/s.
+
+</description>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="errorCorrection">
+ <description>The error correction algorithm to use. Only Basic Error Correction (BEC) is supported.
+0 = BEC
+</description>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionOnSet1">
+ <description>Percentage of the Transmit Buffer that will cause MTP2 to signal congestion for prio 1 messages towards client.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>70</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionOnSet2">
+ <description>Percentage of the Transmit Buffer that will cause MTP2 to signal congestion for prio 2 messages towards client.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>80</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionOnSet3">
+ <description>Percentage of the Transmit Buffer that will cause MTP2 to signal congestion for prio 3 messages towards client.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>90</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionAbatement1">
+ <description>Percentage of the Transmit Buffer that ceases congestion for prio 1 messages.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>60</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionAbatement2">
+ <description>Percentage of the Transmit Buffer that ceases congestion for prio 2 messages.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>70</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionAbatement3">
+ <description>Percentage of the Transmit Buffer that ceases congestion for prio 3 messages.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>80</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionDiscardLevel1">
+ <description>Percentage of the Transmit Buffer where messages sent to MTP2 from client with priority less than 1 is discarded by MTP2.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionDiscardLevel2">
+ <description>Percentage of the Transmit Buffer where messages sent to MTP2 from client with priority less than 2 is discarded by MTP2.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionDiscardLevel3">
+ <description>Percentage of the Transmit Buffer where messages sent to MTP2 from client with priority less than 3 is discarded by MTP2.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="n1Onset">
+ <description>Number of MSUs in ReTransmit Buffer before onset of preventive retransmission in PCR.
+NOTE: Only valid if errorCorrection==SCC_MTP2_ERROR_CORRECTION_PCR.
+This value is ignored otherwise.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>60</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="n2Onset">
+ <description>Number of MSUs in ReTransmit Buffer before onset of preventive retransmission in PCR.
+NOTE: Only valid if errorCorrection==SCC_MTP2_ERROR_CORRECTION_PCR.
+This value is ignored otherwise.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>70</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <struct name="Mtp2ProfileDataChina">
+ <structMember name="bitRate">
+ <description>The speed of the link. Only supported values are 64 and 56 kbit/s.
+0 = 64 kbit/s.
+1 = 56 kbit/s.
+
+</description>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="errorCorrection">
+ <description>The error correction algorithm to use. Only Basic Error Correction (BEC) is supported.
+0 = BEC</description>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="provings">
+ <description>Proving abort limit. Number of consecutive aborted proving periods that will cause a return to the Out Of Service state.
+
+Measurement units are the number of proving periods.</description>
+ <long>
+ <range>
+ <min>1</min> <max>7</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="suermD">
+ <description>SUERM parameter D.
+Measurement units are in SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>256</max>
+ </range>
+ <defaultValue>256</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="suermN">
+ <description>SUERM parameter N.
+Measurement units are in SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>256</max>
+ </range>
+ <defaultValue>16</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="suermT">
+ <description>SUERM parameter T.
+Measured in SU units.</description>
+ <long>
+ <range>
+ <min>1</min> <max>64</max>
+ </range>
+ <defaultValue>64</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="tie">
+ <description>Emergency AERM threshold, Tie. Number of signal units errors that cause abortion of an emergency proving period.
+
+Measurement units are SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>7</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT1">
+ <description>Maximum time to stay in Aligned Ready state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>65500</max>
+ </range>
+ <defaultValue>45000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT2">
+ <description>Maximum time to stay in Not Aligned state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>262000</max>
+ </range>
+ <defaultValue>132000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT3">
+ <description>Maximum time to stay in Aligned state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>2000</max>
+ </range>
+ <defaultValue>1000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT4e">
+ <description>Length of the emergengcy proving period.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>16300</max>
+ </range>
+ <defaultValue>500</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT4n">
+ <description>Length of the normal proving period.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>16300</max>
+ </range>
+ <defaultValue>8200</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT5">
+ <description>Time between sending Status Indication "B" while in the Congested state.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>1</min> <max>255</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT6">
+ <description>Maximum time a remote site may remain in the congestated state before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>8100</max>
+ </range>
+ <defaultValue>5000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT7">
+ <description>Maximum time to wait for an expected acknowledgement of an MSU before signalling link failure.
+
+Measurement units are milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>2000</max>
+ </range>
+ <defaultValue>2000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="tin">
+ <description>Normal AERM threshold, Tin. Number of signal errors that cause abortion of a normal proving peroid.
+
+Measurement units are SUs.</description>
+ <long>
+ <range>
+ <min>1</min> <max>7</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionOnSet1">
+ <description>Percentage of the Transmit Buffer that will cause MTP2 to signal congestion for prio 1 messages towards client.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>70</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionOnSet2">
+ <description>Percentage of the Transmit Buffer that will cause MTP2 to signal congestion for prio 2 messages towards client.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>80</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionOnSet3">
+ <description>Percentage of the Transmit Buffer that will cause MTP2 to signal congestion for prio 3 messages towards client.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>90</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionAbatement1">
+ <description>Percentage of the Transmit Buffer that ceases congestion for prio 1 messages.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>60</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionAbatement2">
+ <description>Percentage of the Transmit Buffer that ceases congestion for prio 2 messages.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>70</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionAbatement3">
+ <description>Percentage of the Transmit Buffer that ceases congestion for prio 3 messages.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>80</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionDiscardLevel1">
+ <description>Percentage of the Transmit Buffer where messages sent to MTP2 from client with priority less than 1 is discarded by MTP2.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionDiscardLevel2">
+ <description>Percentage of the Transmit Buffer where messages sent to MTP2 from client with priority less than 2 is discarded by MTP2.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionDiscardLevel3">
+ <description>Percentage of the Transmit Buffer where messages sent to MTP2 from client with priority less than 3 is discarded by MTP2.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="n1Onset">
+ <description>Number of MSUs in ReTransmit Buffer before onset of preventive retransmission in PCR.
+NOTE: Only valid if errorCorrection==SCC_MTP2_ERROR_CORRECTION_PCR.
+This value is ignored otherwise.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>60</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="n2Onset">
+ <description>Number of MSUs in ReTransmit Buffer before onset of preventive retransmission in PCR.
+NOTE: Only valid if errorCorrection==SCC_MTP2_ERROR_CORRECTION_PCR.
+This value is ignored otherwise.</description>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>70</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <enum name="EmergencyStatus">
+ <description>This enumeration specifies the different stages of the emergency state.</description>
+ <enumMember name="NEVER_USED">
+ <description>Emergency state has not been activated since installation of license key file.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="ACTIVE">
+ <description>All capacity restrictions removed and all features enabled. The maximum time in this state is 7 days.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="USE_DEGRADED">
+ <description>A new license key file has to be istalled in order not to jopardize future use and performance.
+The maximum time in this state is 7 days.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="ACTIVE_AGAIN">
+ <description>All features enabled again for a maximum period of 7 days then a new license key file has to be installed in order to be able to use this node.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="USE_DISABLED">
+ <description>Use of the node is no longer allowed since no new license key file has been installed.</description>
+ <value>4</value>
+ </enumMember>
+ </enum>
+
+ <struct name="EmergencyInfo">
+ <description>This attribute provides information about the current EmergencyState.
+
+Note: for the states NEVER_USED and USE_DISABLED the return value for time is insignificant.</description>
+ <structMember name="state">
+ <description>The current emergency state of the license server.</description>
+ <enumRef name="EmergencyStatus">
+ <defaultValue>NEVER_USED</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="time">
+ <description>This attribute holds information on the time elapsed in this state.
+
+Note: The time out values for the states ALL_OPEN, DEGADED and PROLONGED is 7 days. The unit for this attribute is seconds.
+1 day = 86400 seconds
+7 days = 604800 seconds.</description>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <enum name="NodeRestartType">
+ <enumMember name="WARM_AT_PIU_RESTART">
+ <description>Warm node restart at restart of the last PIU.</description>
+ <value>4</value>
+ </enumMember>
+ <enumMember name="COLD_AT_PIU_RESTART">
+ <description>Cold node restart at restart of the last PIU.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="WARM_AT_PIU_FAULT">
+ <description>Warm node restart at fault mark of the last PIU.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="COLD_AT_PIU_FAULT">
+ <description>Cold node restart at fault mark of the last PIU.</description>
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <struct name="UniSaalProfileData">
+ <structMember name="maxPD">
+ <description>Maximum number of SD PDUs before a poll is sent.
+
+maxPD &lt; initialCredit</description>
+ <long>
+ <range>
+ <min>10</min> <max>10000</max>
+ </range>
+ <defaultValue>25</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="maxStat">
+ <description>Maximum number, odd integer value, of list elements placed in a STAT PDU.
+
+Note: The maxStat attribute is dependent on the AAL5 maximum SDU size defined in the Aal5TpVccTp MO. The maxStat times 4 (octets) plus additional 12 octets (for header) must not exceed the AAL5 maximum SDU size (lower of the two directions, fromUserMaxSduSize and toUserMaxSduSize).
+The consistency control is not performed until the UniSaalTp MO is created since there is no relation between the UniSaalProfile MO and the Aal5TpVccTp MO.</description>
+ <long>
+ <range>
+ <min>3</min> <max>1001</max>
+ </range>
+ <defaultValue>67</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="initialCredit">
+ <description>Initial number of credits.
+
+Note: For 64 kbit/s use 30.
+
+Note! The value for initialCredit must be larger than the value of maxPD.
+</description>
+ <long>
+ <range>
+ <min>10</min> <max>1000</max>
+ </range>
+ <defaultValue>250</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerKeepAlive">
+ <description>Timer to be used during a period of no outstanding acknowledgements or new data pending receipt of credit. At timeout the peer is polled to see if it is alive. The timer determines the interval between polls in transient phase. This timer should be greater than the roundtripdelay and also greater than timerpoll. Time unit = milliseconds.
+</description>
+ <long>
+ <range>
+ <min>10</min> <max>10000</max>
+ </range>
+ <defaultValue>2000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerNoResponse">
+ <description>Timer to determine the maximum time interval during which at least one STAT PDU reception is expected as a response to a poll. This timer should be equal to timerKeepAlive+roundtripdelay. Time unit = milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>100000</max>
+ </range>
+ <defaultValue>7000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerIdle">
+ <description>Timer running when there are no PDUs to transmit and there are no outstanding acknowledgements or data pending for credit. When this timer is running, no POLL PDUs are sent. This timer should be significantly greater than timerKeepAlive value. Time unit = milliseconds.</description>
+ <long>
+ <range>
+ <min>1000</min> <max>600000</max>
+ </range>
+ <defaultValue>15000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerCC">
+ <description>Timer determining the time between re-transmission of PDUs: BGN, END, ER, RS. Should be slightly more than the roundtripdelay. Time unit = milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>10000</max>
+ </range>
+ <defaultValue>1000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerPoll">
+ <description>Timer that specifies the maximum time between sending of POLL PDUs to the peer receiver during other traffic (active phase). Time unit = milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>100000</max>
+ </range>
+ <defaultValue>750</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="maxCC">
+ <description>Maximum number of re-transmissions of PDUs: BGN, END, ER, RS. Time unit = milliseconds.</description>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionOnSet">
+ <description>Attribute specifying the percentage of the buffer that must be filled in order to cause congestion. Congestion is notified to the users of this protocol layer. The part of the buffer above the congestion level is used to take care of messages that were sent before the users stopped sending.
+
+This attribute should follow the rule 0 &lt;= congestationAbatement &lt; congestationOnSet &lt;= 100.</description>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>70</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionAbatement">
+ <description>Attribute specifying the percentage of the buffer for which congestion is stopped. If the congestionAbatement level is lesser but almost equal to congestionOnSet, congestion alarms might be raised and ceased very often.
+
+This attribute should follow the rule 0 &lt;= congestationAbatement &lt; congestationOnSet &lt;= 100.</description>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>60</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <struct name="NniSaalProfileData">
+ <description>Struct holding the values for an NniSaalProfile.
+
+NOTE: Congestition Level 1 - 3 is supported.</description>
+ <structMember name="timerPoll">
+ <description>Timer that specifies the maximum time between sending of POLL PDUs to the peer receiver during other traffic (active phase). Time unit = milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>100000</max>
+ </range>
+ <defaultValue>50</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="maxCC">
+ <description>Maximum number of re-transmissions of PDUs: BGN, END, ER, RS.</description>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="maxPD">
+ <description>Maximum number of SD PDUs before a poll is sent.
+
+maxPD &lt; initialCredit</description>
+ <long>
+ <range>
+ <min>0</min> <max>10000</max>
+ </range>
+ <defaultValue>25</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="maxStat">
+ <description>Maximum number, odd integer value, of list elements placed in a STAT PDU.
+
+Note: The maxStat attribute is controlled by the AAL5 maximum SDU size defined in the Aal5TpVccTp MO. The maxStat times 4 (octets) plus additional 12 octets (for header) must not exceed the AAL5 maximum SDU size (lower of the two directions, fromUserMaxSduSize and toUserMaxSduSize).
+
+The consistency control is not performed until the NniSaalTp MO is created since there is no relation between the NniSaalProfile MO and the Aal5TpVccTp MO.</description>
+ <long>
+ <range>
+ <min>3</min> <max>1001</max>
+ </range>
+ <defaultValue>67</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="initialCredit">
+ <description>Initial number of credits.
+
+Note: For 64 kbit/s use 30.
+
+Note! The value for initialCredit must be larger than the value of maxPD.</description>
+ <long>
+ <range>
+ <min>10</min> <max>1000</max>
+ </range>
+ <defaultValue>250</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerKeepAlive">
+ <description>Timer to be used during a period of no outstanding acknowledgements or new data pending receipt of credit. At timeout the peer is polled to see if it is alive. The timer determines the interval between polls in transient phase. This timer should be greater than the roundtripdelay and also greater than timerpoll. Time unit = milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>10000</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerNoResponse">
+ <description>Timer to determine the maximum time interval during which at least one STAT PDU reception is expected as a response to a poll.This timer should be equal to timerKeepAlive+roundtripdelay. Time unit = milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>100000</max>
+ </range>
+ <defaultValue>500</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerIdle">
+ <description>Timer running when there are no PDUs to transmit and there are no outstanding acknowledgements or data pending for credit. When this timer is running, no POLL PDUs are sent. This timer should be significantly greater than timerKeepAlive value. Time unit = milliseconds.</description>
+ <long>
+ <range>
+ <min>10</min> <max>10000</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerCC">
+ <description>Timer determining the time between re-transmission of PDUs: BGN, END, ER, RS. Time unit = milliseconds.
+Should be more than the roundtrip delay.</description>
+ <long>
+ <range>
+ <min>10</min> <max>10000</max>
+ </range>
+ <defaultValue>200</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="mps">
+ <description>Management Proving Status which is used to decide if proving is done or not during SAAL connection setup.
+</description>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionLevel1OnSet">
+ <description>Attribute specifying the percentage of the buffer that must be filled in order to cause congestion.
+Congestion is notified to the users of this protocol layer. The part of the buffer above the congestion
+level is used to take care of messages that were sent before the users stopped sending.
+
+Attribute specifying the percentage of the buffer that must be filled in order to cause congestion.
+Congestion is notified to the users of this protocol layer. The part of the buffer above the congestion
+level is used to take care of messages that were sent before the users stopped sending.
+
+This attribute should follow the rule 0 &lt;= congestationLevel1OnSet &lt;= congestationLevel2OnSet &lt;= congestationLevel3OnSet &lt;= 100.</description>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>70</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionLevel2OnSet">
+ <description>Attribute specifying the percentage of the buffer that must be filled in order to cause congestion.
+Congestion is notified to the users of this protocol layer. The part of the buffer above the congestion
+level is used to take care of messages that were sent before the users stopped sending.
+
+This attribute should follow the rule 0 &lt;= congestationLevel1OnSet &lt;= congestationLevel2OnSet &lt;= congestationLevel3OnSet &lt;= 100.</description>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>80</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionLevel3OnSet">
+ <description>Attribute specifying the percentage of the buffer that must be filled in order to cause congestion.
+Congestion is notified to the users of this protocol layer. The part of the buffer above the congestion
+level is used to take care of messages that were sent before the users stopped sending.
+
+This attribute should follow the rule 0 &lt;= congestationLevel1OnSet &lt;= congestationLevel2OnSet &lt;= congestationLevel3OnSet &lt;= 100.</description>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>90</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="congestionLevel1Abatement">
+ <description>Attribute specifying the percentage of the buffer for which congestionLevel1 is stopped. If the congestionAbatement level is lesser but almost equal to congestionOnSet, congestion alarms might be raised and ceased very often.
+</description>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>60</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="nrOfPDUsDuringProving">
+ <description>The length of proving in terms of number of transmitted PDUs (n1).
+noOfPDUsDuringProving x T3 &lt; T2
+
+For the TTC standard the only allowed value is 0 (which means no proving).</description>
+ <long>
+ <range>
+ <min>0</min> <max>100000</max>
+ </range>
+ <defaultValue>1000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="maxNRP">
+ <description>State variable which defines max number of retransmissions of PDUs during proving to consider proving successful.
+</description>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerNoCredit">
+ <description>Maximum time of no credit. If the timer expires, the assured data transfer mode is released.</description>
+ <long>
+ <range>
+ <min>0</min> <max>100000</max>
+ </range>
+ <defaultValue>1500</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerRepeatSrec">
+ <description>Timer which is set whenever a report of SSCOP recovery is received from the SSCF. If the timer is running when another report of recovery is received, the assured data transfer mode is released. If the timer expires, nothing is done. Time unit = milliseconds.</description>
+ <long>
+ <range>
+ <min>0</min> <max>86400000</max>
+ </range>
+ <defaultValue>3600000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT1">
+ <description>Timer between the link release action and the next link re-establish action during the alignment. At expiry of timer T1, a new attempt to setup assured data transfer mode to the peer is done. Time unit = milliseconds.
+</description>
+ <long>
+ <range>
+ <min>10</min> <max>100000</max>
+ </range>
+ <defaultValue>5000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT2">
+ <description>Total time that SSCF will attempt alignment. At expiry of timer T2, the alignment procedure will be interrupted.
+ Time unit = milliseconds.
+</description>
+ <long>
+ <range>
+ <min>10</min> <max>200000</max>
+ </range>
+ <defaultValue>30000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT3">
+ <description>Time between proving PDUs. The timer is set such that loading of the signalling link is approximately 50% of its nominal rate.
+Time unit = milliseconds.</description>
+ <long>
+ <range>
+ <min>5</min> <max>1000</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <exception name="ListOfTimeSlotsNotUniqueException">
+ <description>Exception thrown when a time slot appears more than once in the time slot list.</description>
+ </exception>
+
+ <enum name="RefActivity">
+ <description>RefActivity can have the following values:
+
+inactive = Synchronization reference is currently not used in system clock generation.
+active = Synchronization is used in system clock generation.
+</description>
+ <enumMember name="inactive">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="active">
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="RefState">
+ <description>RefState can have the following values:
+failed = synchronization reference is not capable to perform its required tasks.
+degraded = capability of synchronization reference to perform its required tasks is degraded e.g. because of signal level degradation. This value is only applicable for traffic carrying (ET physical path termination) synchronization references. Note: attribute degradationIsFault controls whether synchronization reference degradation is interpreted as a synchronization reference fault or not.
+lossOfTracking = system clock regulation algorithm on TU board can not follow the 8kHz synchronization reference signal either because of the poor quality of the signal or because of a HW fault at TU board. If all synchronization references repeatedly end up to state lossOfTracking, fault is likely in TU HW.
+ok = synchronization reference is capable of performing its required tasks.
+</description>
+ <enumMember name="failed">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="degraded">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="lossOfTracking">
+ <value>2</value>
+ </enumMember>
+ <enumMember name="ok">
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <enum name="FaultCriteria">
+ <description>FaultCriteria can have the following values:
+degrNotFault = synchronization reference degradation is NOT interpreted as a synchronization reference fault.
+degrIsFault = synchronization reference degradation is interpreted as a synchronization reference fault.</description>
+ <enumMember name="degrNotFault">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="degrIsFault">
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="ClockState">
+ <description>ClockState can have the following values:
+startUp =
+locked = system clock signal on Timing Unit is locked: a synchronization reference is used in the system clock generation, clock accuracy is 50 ppb or better.
+holdOver = system clock signal on Timing Unit is hold-over: no synchronization reference is used in system clock generation, clock accuracy is 50 ppb or better.
+freeRunning = system clock signal on Timing Unit is free running: no synchronization reference is used in system clock generation, clock accuracy is 4.6 ppm or better.
+failed = system clock signal on Timing Unit is failed: fault in system clock generation function, no quarantee of clock accuracy level.
+not Applicable = system clock signal on Timing Unit is not applicable: TU board not present.</description>
+ <enumMember name="unknownMode">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="startupMode">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="lockedMode">
+ <value>2</value>
+ </enumMember>
+ <enumMember name="holdOverMode">
+ <value>3</value>
+ </enumMember>
+ <enumMember name="freeRunningMode">
+ <value>4</value>
+ </enumMember>
+ <enumMember name="failedMode">
+ <value>5</value>
+ </enumMember>
+ <enumMember name="lossOfTrackingMode">
+ <value>6</value>
+ </enumMember>
+ <enumMember name="notApplicable">
+ <value>7</value>
+ </enumMember>
+ </enum>
+
+ <exception name="AlreadyRegisteredException">
+ <description>Exception thrown when an object is already registered.</description>
+ </exception>
+
+ <exception name="MaxNoOfRefRegisteredException">
+ <description>Exception thrown when the maximum number of references is reached.</description>
+ </exception>
+
+ <exception name="PriorityAlreadyInUseException">
+ <description>Exception thrown when a priority is already in use.</description>
+ </exception>
+
+ <exception name="PriorityOutOfRangeException">
+ <description>Exception thrown when the priority is out of range.</description>
+ </exception>
+
+ <exception name="NotPermittedException">
+ <description>Exception thrown when an reference is not valid, null or of incorrect type.</description>
+ </exception>
+
+ <exception name="NotRegisteredException">
+ <description>Exception thrown when trying to de-register an object that is not registered in the database.</description>
+ </exception>
+
+ <enum name="SystemClockRedundancy">
+ <enumMember name="SYSTEM_CLOCK_USERS_USE_PLANE_A">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="SYSTEM_CLOCK_USERS_USE_PLANE_B">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="SYSTEM_CLOCK_USERS_USE_PLANE_A_AND_B">
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <exception name="NotUniqueFroIdException">
+ <description>Exception thrown when a fro Id is not unique.</description>
+ </exception>
+
+ <enum name="ActiveSwitchPlane">
+ <enumMember name="switchPlaneA">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="switchPlaneB">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="switchPlaneBoth">
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="SwitchReliableGroup">
+ <description>A predefined group consisting of working links and their corresponding protecting links. These links form the n+m link redundancy. </description>
+ <enumMember name="physicalLinkStatusWorking">
+ <description>Defines physical link status.
+</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="physicalLinkStatusProtecting">
+ <description>Defines physical link status.
+</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="physicalLinkStatusUndefined">
+ <description>Defines physical link status.
+</description>
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <struct name="GlobalTitleData">
+ <structMember name="indicator">
+ <description>Global title indicator should have following values for both ITU and TTC:
+
+The values for the GT Indicator
+
+Value Comment
+
+0 No new global title
+2 TT only
+3 TT-NP-ES
+4 TT-NP-ES-NOA
+
+Explanation:
+
+TT = translation type
+NP = numbering plan
+ES = encoding scheme
+NOA = nature of address indication</description>
+ <long>
+ <range>
+ <min>0</min> <max>4</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="natureOfAddress">
+ <description>Indicates number type, i.e. national or international number.
+Coding of the Nature Address:
+
+0 = "unknown"
+1 = "Subscriber number"
+2 = "Reserved for national use"
+3 = "National significant number"
+4 = "International number"</description>
+ <long>
+ <range>
+ <min>0</min> <max>4</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="numberingPlan">
+ <description>Indicates which numbering plan that is used.
+
+Coding of the Numbering Plan:
+
+0 = "Unknown"
+1 = "ISDN/Telephony Numbering Plan"
+3 = "Data Numbering Plan"
+4 = "Telex Numbering Plan"
+5 = "Maritime Mobile Numbering Plan"
+6 = "Land Mobile Numbering Plan"
+7 = "ISDN/Mobile Numbering Plan"
+</description>
+ <long>
+ <range>
+ <min>0</min> <max>7</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="translationType">
+ <description>Used to direct the message to the appropriate Global Title translation function.</description>
+ <long>
+ <range>
+ <min>0</min> <max>254</max>
+ </range>
+ </long>
+ </structMember>
+ <structMember name="addressInformation">
+ <description>Digit string of 1-37 digits, where each digit is 0-9, and B, C. B and C are for Code 11 and Code 12.
+The addressInformation may also contain wild card symbols: "*" or "?". Wild cards are only allowed for defining Global Title Translations, they are not allowed for specifying SCCP SAPs (built with SPC and Global Title or SPC + SSN + Global Title).</description>
+ <string>
+ <lengthRange>
+ <min>1</min> <max>37</max>
+ </lengthRange>
+ </string>
+ </structMember>
+ <structMember name="encodingScheme">
+ <description>Indicates if the number of address signals are an odd or even number, and is coded as follows:
+
+0 = "Unknown"
+1 = "BCD, odd number of digits"
+2 = "BCD, even number of digits"
+
+Other values in the encoding scheme will result in the error "Wrong Nature Of Address", (Routing failure reason=No translation for an address of such nature).</description>
+ <long>
+ <range>
+ <min>0</min> <max>2</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <enum name="SharingMode">
+ <enumMember name="loadShare">
+ <description>The when sharing mode is set to loadShare the SCCP traffic is load shared between the two entities (access points).</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="dupliDominant">
+ <description>When the sharing mode is set to dupliDominant the second entity (access point) is a backup for the first entity.</description>
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="EncodingScheme">
+ <description>Possible values for number signalling.</description>
+ <enumMember name="UNKNOWN">
+ <description>Unkown encoding scheme.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="ODD_NUMBER">
+ <description>BCD, odd number of digits.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="EVEN_NUMBER">
+ <description>BCD, even number of digits.</description>
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="GlobalTitleIndicator">
+ <description>Global title indicator values for China, ITU, TTC and ANSI.
+
+Note: China, ITU and TCC will use TT_ONLY, TT_NP_ES, TT_NP_ES_NOA, NOA_ONLY.
+
+ANSI will use:
+ANSI_TT_NP_ES = 5
+ANSI_TT_ONLY = 6
+</description>
+ <enumMember name="TT_ONLY">
+ <description>Translation Type only.
+
+Only valid for China, ITU and TTC.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="TT_NP_ES">
+ <description>Translation Type, Numbering Plan and Encoding Scheme.
+
+Only valid for China, ITU and TTC.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="TT_NP_ES_NOA">
+ <description>Translation Type, Numbering Plan, Encoding Scheme, and Nature Of Address indication.
+
+Only valid for China, ITU and TTC.</description>
+ <value>4</value>
+ </enumMember>
+ <enumMember name="NOA_ONLY">
+ <description>Nature of Address indicator only.
+
+Only valid for China, ITU and TTC.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="ANSI_TT_NP_ES">
+ <description>Translation Type, Numbering Plan and Encoding Scheme.
+
+Only valid for ANSI.
+</description>
+ <value>5</value>
+ </enumMember>
+ <enumMember name="ANSI_TT_ONLY">
+ <description>Translation Type only.
+
+Only valid for ANSI.
+</description>
+ <value>6</value>
+ </enumMember>
+ </enum>
+
+ <enum name="NatureOfAddress">
+ <description>Phone number types.</description>
+ <enumMember name="UNKNOWN">
+ <description>Unknown number type.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="SN">
+ <description>Subscriber number type.
+</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="RN">
+ <description>Reserved for national use, number type.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="NSN">
+ <description>National Significant Number type.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="IN">
+ <description>International number type.</description>
+ <value>4</value>
+ </enumMember>
+ </enum>
+
+ <enum name="NumberingPlan">
+ <description>Numbering plans.</description>
+ <enumMember name="UNKNOWN">
+ <description>Unknown numbering plan.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="TELEPHONY">
+ <description>ISDN/Telephony numbering plan.
+</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="DATA">
+ <description>Data numbering plan.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="TELEX">
+ <description>Telex numbering plan.
+</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="MOBILE_MARITIME">
+ <description>Maritime mobile numering plan.
+</description>
+ <value>4</value>
+ </enumMember>
+ <enumMember name="MOBILE_LAND">
+ <description>Land mobile numbering plan.
+</description>
+ <value>5</value>
+ </enumMember>
+ <enumMember name="MOBILE">
+ <description>ISDN/Mobile numbering plan.</description>
+ <value>6</value>
+ </enumMember>
+ </enum>
+
+ <enum name="SccpCountType">
+ <enumMember name="MESSAGES">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="OCTETS">
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <struct name="Scmg">
+ <structMember name="sendSST">
+ <description>Controls when to send SST (SCCP Subsystem Test message).
+
+0 = Wait for tStatInfo timer to expire once after MTP_RESUME before sending SST.
+1 = Send SST immediately after MTP_RESUME, then start tStatInfo timer.</description>
+ <long>
+ <defaultValue>1</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="sendSSA">
+ <description>Controls when to send SSA (SCCP Subsystem Allowed message).
+
+0 = Do not send SSA when client attaches, wait until SST is received. (default for ANSI/CHINA/ITU/TTC)
+1 = Send SSA immediately when client attaches.</description>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="sendSSP">
+ <description>Controls whether to send SSP (SCCP Subsystem Prohibited message).
+
+0 = Do not send SSP when client detaches. (default for TTC)
+1 = Send SSP immediately when client detaches. (default for ANSI/CHINA/ITU)</description>
+ <long>
+ <defaultValue>1</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="useSST">
+ <description>Controls whether to send SST messages or not (SCCP Subsystem Test message).
+
+0 = Send SST as indicated by sendSST. (default for ANSI/CHINA/ITU)
+1 = (not used)
+2 = (not used)
+3 = Do not initiate SST messages at all, ie. do not start timer tStatInfo nor send any SST at MTP_RESUME. (default for TTC)</description>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="allowRemoteBroadcast">
+ <description>Controls the remote broadcast.
+
+0 = allow remote broadcast. (default for ANSI/CHINA/ITU/TTC)
+1 = do not allow remote broadcast</description>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="initiateTimerTcon">
+ <description>Controls whether to initiate hardcoded congestion timer or not.
+
+0 = start timer when SSC is received. (default for CHINA/ITU/TTC)
+1 = do not start timer
+
+Note! This attribute is not valid for the ANSI standard.</description>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <enum name="DiscardReturnServiceMsg">
+ <enumMember name="DISCARD">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="RETURN">
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <exception name="WrongUserTypeException">
+ </exception>
+
+ <exception name="UsageNotPermittedException">
+ </exception>
+
+ <enum name="J1Type">
+ <description>J1Type can have the following values:
+J1_G = 0 according to TTC JT-G703/G704
+J1_I = 1 according to TCC JT-I431</description>
+ <enumMember name="j1_G">
+ <description>J1 according to TTC JT-G703/G704</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="j1_I">
+ <description>J1 according to TCC JT-I431</description>
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="StandardMode">
+ <description>Indicates what standard the MAO is operating to.</description>
+ <enumMember name="TTC">
+ <description>The standard mode is Telecommunication Technology Committee (TTC).</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="ANSI">
+ <description>The standard mode ANSI.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="ETSI">
+ <description>The standard mode is ETSI.</description>
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="MuxMode">
+ <description>Indicates what multiplexing is being used.</description>
+ <enumMember name="STANDBY">
+ <description>Standby for protection.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="E1_J1_T1_LEVEL">
+ <description>Multiplexing terminated at the E1/J1/T1 level.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="VC4_STS3CSPE_LEVEL">
+ <description>Multiplexing terminated at the VC-4/STS3CSPE level.</description>
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="Os155LoopBack">
+ <description>The loopback method available for use by the Os155SpiTtp MO.</description>
+ <enumMember name="NONE">
+ <description>No loopback in use.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="LINE">
+ <description>Loopingback using line.</description>
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="SwitchModes">
+ <description>The switch modes.</description>
+ <enumMember name="AUTOMATIC">
+ <description>Automatic switching.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="LOCKED">
+ <description>Locked for swtiching.</description>
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <exception name="FailedResourceException">
+ </exception>
+
+ <exception name="LockedResourceException">
+ </exception>
+
+ <exception name="UnknownReasonException">
+ </exception>
+
+ <exception name="AlreadyLockedException">
+ </exception>
+
+ <exception name="IncorrectOsi155SpiIdException">
+ </exception>
+
+ <enum name="PathTraceFormat">
+ <description>Path Trace Formats.</description>
+ <enumMember name="ITU_T_G707">
+ <description>16 byte path trace format according to ITU-T G707 table 4.</description>
+ <value>16</value>
+ </enumMember>
+ <enumMember name="GR_253_CORE">
+ <description>64 byte path trace format according to section 3.3.2.3, Telecordia GR-253-CORE.</description>
+ <value>64</value>
+ </enumMember>
+ </enum>
+
+ <enum name="Crc4Mode">
+ <description>Cyclical Redundancy Checks 4 modes.</description>
+ <enumMember name="OFF">
+ <description>CRC 4 is off.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="ON">
+ <description>CRC 4 is on.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="AUTOMATIC">
+ <description>CRC 4 is automatic.</description>
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="IdlePattern">
+ <description>Idle patterns.</description>
+ <enumMember name="A_LAW">
+ <description>A law idle pattern.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="U_LAW">
+ <description>Micro law idle pattern.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="UNDEFINED">
+ <description>Undefined idle pattern.</description>
+ <value>0</value>
+ </enumMember>
+ </enum>
+
+ <enum name="LoopbackState">
+ <description>The possible loopback states for E1/J1/T1/E3/T3PhysPathTerm MOs.</description>
+ <enumMember name="none">
+ <description>This is the normal state, no loop back is preformed (and ordinary traffic is running).</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="line">
+ <description>The phyiscal path is looped on the line side, the external incoming path is looped back to the external outgoing path.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="system">
+ <description>The physical path is looped on the system side, the (node-) internal incoming path is looped back to the internal outgoing path.</description>
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="TransmissionMode">
+ <description>L stands for long haul interface and S stands for short haul interface.
+The subsequent figure specifies the cable distance in feets.</description>
+ <enumMember name="L_6000">
+ <description>Long Haul 6000 ft, -0 dB</description>
+ <value>8</value>
+ </enumMember>
+ <enumMember name="L_4000">
+ <description>Long Haul 4000 ft, -7 dB</description>
+ <value>7</value>
+ </enumMember>
+ <enumMember name="L_2000">
+ <description>Long Haul 2000 ft, -15 dB</description>
+ <value>6</value>
+ </enumMember>
+ <enumMember name="L_0">
+ <description>Long Haul 0 ft, -22 dB</description>
+ <value>5</value>
+ </enumMember>
+ <enumMember name="S_133">
+ <description>Short Haul 0..133 ft</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="S_266">
+ <description>Short Haul 134..266 ft</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="S_399">
+ <description>Short Haul 267..399 ft</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="S_533">
+ <description>Short Haul 400..533 ft</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="S_655">
+ <description>Short Haul 534..655 ft</description>
+ <value>4</value>
+ </enumMember>
+ </enum>
+
+ <struct name="Mtp3bSpItuPriorityData">
+ <description>Priority attributes for MTP3b SP of the ITU standard.</description>
+ <structMember name="prioSlt">
+ <description>The prioSlt attribute sets the priority for the
+ Signalling Link Test Message and Acknowledge (SLTM / SLTA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioCo">
+ <description>The prioCo attribute sets the priority for the ChangeOver Order and Acknowledge (COO/COA) or eXtended Change over Order and Acknowledge (XCO/XCA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet)
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioCb">
+ <description>The prioCb attribute sets the priority for the
+ Change Back Declaration and Acknowledge (CBD / CBA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioEc">
+ <description>The prioEc attribute sets the priority for the
+Emergency Change over Order and Acknowledge (ECO / ECA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioRst">
+ <description>The prioRst attribute sets the priority for the
+signalling Route Set Test (RST) message when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioTra">
+ <description>The prioTra attribute sets the priority for the
+Traffic Restart Allowed signal (TRA) message when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioUpu">
+ <description>The prioUpu attribute sets the priority for the
+ User Part Unavailable (UPU) message when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioLink">
+ <description>The prioLink attribute sets the priority for link related messages when issued by the MTP3b itself. The messages are :
+
+Link INhibit (LIN), Link UNinhibit (LUN),
+Link Inhibit Denied (LID),
+Link Inhibit Acknowledge (LIA),
+Link Uninhibit Acknowledge (LUA),
+Link Forced Uninhibit (LFU),
+Link Local inhibit Test (LLT) and
+Link Remote inhibit Test (LRT)
+
+When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ </struct>
+
+ <struct name="Mtp3bSpItuTimerData">
+ <description>ITU timers for MTP3bSpItu. Timervalues in 1/10 s (deciseconds).</description>
+ <structMember name="timerT1">
+ <description>Delay to avoid message mis-sequencing on changeover.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT2">
+ <description>Timer for waiting for a COO or a COA.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT3">
+ <description>Delay to avoid message mis-sequencing on a time controlled diversion change back.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT4">
+ <description>Timer for waiting for CBA, first attempt.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT5">
+ <description>Timer for waiting for CBA, second attempt
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT6">
+ <description>Timer for delay to avoid message mis-sequencing on controlled rerouting.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>9</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT8">
+ <description>Timer for delay to prohibit sending of TFP messages via the response method. This is a STP specific parameter, which is ignored when configured as an endpoint.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT10">
+ <description>Timer for waiting to repeat sending of RST periodically.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>400</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT12">
+ <description>Waiting for uninhibit acknowledgement.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT13">
+ <description>Timer for waiting for force uninhibit.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT14">
+ <description>Timer for waiting for inhibition acknowledgement.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT17">
+ <description>Delay to avoid oscillation of initial alignment failure and link restart.
+
+The value for this timer should be less than the value for timerT2.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>9</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTBsnt">
+ <description>Waiting for BSNT value from MTP-2 or SAAL (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTRetrieval">
+ <description>Timer for waiting for completion of buffer retrieval from MTP-2 or SAAL (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTStart">
+ <description>Timer for retransmission of DL_START_req if no answer received. Started when timerT17 expires. (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>1200</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTc">
+ <description>Controlling the period a route set is considered congested when a Transfer Controlled message has been received.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>50</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT18">
+ <description>Supervision timer for the first phase of a restarting STP. This is an STP specific parameter, which is ignored when configured as an endpoint.
+
+The value for this timer should be less than the value for timerT2.
+
+Unit: deciseconds (1/10 second).
+</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>550</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT19">
+ <description>Controlling the response of the receipt of a traffic restart message from an adjacent node.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>680</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT20">
+ <description>Overall MTP restart timer at the restarting MTP.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>600</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT21">
+ <description>Overall MTP restart timer at an adjacent signalling point to a restarting MTP.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>640</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT22">
+ <description>Local inhibit test timer.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>2500</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT23">
+ <description>Remote inhibit test timer.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>2500</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerSlta">
+ <description>Supervision timer for SLTA message (time within SLTA should arrive).
+
+Timer T1 in ITU Q.707 standard.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerSltm">
+ <description>Timer for sending SLTM periodically.
+
+Timer T2 in ITU Q.707 standard.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>400</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaTack">
+ <description>Timer used for message acknowledgement.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaPeriodicAudit">
+ <description>Timer used for audit procedure.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>300</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT1">
+ <description>Delay to avoid mis-sequencing of messages when an association fails.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT3">
+ <description>Delay to avoid mis-sequencing of messages when an association becomes active.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT6">
+ <description>Delay to avoid mis-sequencing on controlled rerouting.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT8">
+ <description>Delay to prohibit sending of DUNA messages via the response method.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT40">
+ <description>Delay to avoid message mis-sequencing on controlled/forced rerouting.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT41">
+ <description>Timer controlloing the traffic activation delay during restart phase.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT42">
+ <description>The forever interval period for trying association after an unsiccessfull trial.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaTc">
+ <description>Timer controlling the period a route set is considered congested when a SCON message has been received.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>50</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT15">
+ <description>Timer waiting to start signaling route set congestiontest. Used only if the Route Set
+Congestion Test Selectoption is set to "Use Route Set Congestion test".
+
+Guiding value 20 - 30.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT16">
+ <description>Timer waiting for route set congestion status update. Used only if the Route Set
+Congestion Test Selectoption is set to "Use Route Set Congestion test"
+
+Guiding value 14 - 22.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>14</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTDlack">
+ <description>Timer pending an acknowledge from the network layer for a DL_ACK_REQ.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaTassocack">
+ <description>Timer used for SCTP_ASSOCIATE_REQ message acknowledgement. This is the maximum time to wait for the SCTP_COMMUP_IND mesage before considering it to be an error.
+It should be longer than the time a message spends to reach the most distant destination, be processed and returned.</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <enum name="CongestLevel">
+ <description>The supported congestion levels.</description>
+ <enumMember name="level_0">
+ <description>No Congestion.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="level_1">
+ <description>Congestion level low.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="level_2">
+ <description>Congestion level medium.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="level_3">
+ <description>Congestion level high.</description>
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <exception name="ActivationFailedException">
+ </exception>
+
+ <exception name="NoAvailRouteException">
+ </exception>
+
+ <enum name="Mtp3bCongestLevel">
+ <enumMember name="notCongested">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="congested">
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="Mtp3bNetworkInd">
+ <description>Indicates which type of geographical network, e.g. national, international, etc..
+
+Note: Not applicable for TTC.</description>
+ <enumMember name="INTERNATIONAL_NETWORK">
+ <description>International Network.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="SPARE">
+ <description>Spare (for international use only).</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="NATIONAL_NETWORK">
+ <description>National network.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="RESERVED_FOR_NATIONAL_USE">
+ <description>Reserved for national use.</description>
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <enum name="Mtp3bTfrHandling">
+ <description>Indicates how a TransFer Restricted (TFR) signal is handled.</description>
+ <enumMember name="HANDLE_AS_TFA">
+ <description>Treat the TransFer Restricted (FTR) signal as a TransFer Allowed (TFA) signal.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="IGNORED">
+ <description>Ignore the TransFer Restricted (TFR) signal.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="HANDLE_BY_STANDARD">
+ <description>Handle the incoming TRF messages according to the standard.</description>
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="Mtp3bSioSpareBitsUse">
+ <description>Indicates whether the two spare bits in the Service Information Octet (SIO) should be treated as spare or for indicating a priority level. </description>
+ <enumMember name="SPARE">
+ <description>The two spare bits in the SIO are treated as spare.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="PRIO">
+ <description>The two spare bits in the SIO are to be used for indicating a priority level.</description>
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="Mtp3bItuVersion">
+ <description>Indicates which version of the ITU standard.</description>
+ <enumMember name="ITU_T_88">
+ <description>ITU-T -88.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="ITU_T_03_93">
+ <description>ITU-T 03/93.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="ITU_T_07_96">
+ <description>ITU-T 07/96</description>
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <struct name="Mtp3bSpAnsiTimerData">
+ <description>ANSI timers for MTP3bSpAnsi. Timervalues in 1/10 s (deciseconds).</description>
+ <structMember name="timerT1">
+ <description>Delay to avoid message mis-sequencing on changeover.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT2">
+ <description>Timer for waiting for a COO or a COA.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT3">
+ <description>Delay to avoid message mis-sequencing on a time controlled diversion change back.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT4">
+ <description>Timer for waiting for CBA, first attempt.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT5">
+ <description>Timer for waiting for CBA, second attempt
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT6">
+ <description>Timer for delay to avoid message mis-sequencing on controlled rerouting.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>9</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT8">
+ <description>Timer for delay to prohibit sending of TFP messages via the response method. This is a STP specific parameter, which is ignored when configured as an endpoint.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT10">
+ <description>Timer for waiting to repeat sending of RST periodically.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>400</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT12">
+ <description>Waiting for uninhibit acknowledgement.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT13">
+ <description>Timer for waiting for force uninhibit.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT14">
+ <description>Timer for waiting for inhibition acknowledgement.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT15">
+ <description>Timer waiting to start signaling route set congestiontest. Used only if the Route Set
+Congestion Test Selectoption is set to "Use Route Set Congestion test".
+
+Guiding value 20 - 30.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT16">
+ <description>Timer waiting for route set congestion status update. Used only if the Route Set
+Congestion Test Selectoption is set to "Use Route Set Congestion test"
+
+Guiding value 14 - 22.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>14</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT17">
+ <description>Delay to avoid oscillation of initial alignment failure and link restart.
+
+The value for this timer should be less than the value for timerT2.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>9</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTBsnt">
+ <description>Waiting for BSNT value from MTP-2 or SAAL (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTRetrieval">
+ <description>Timer for waiting for completion of buffer retrieval from MTP-2 or SAAL (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTStart">
+ <description>Timer for retransmission of DL_START_req if no answer received. Started when timerT17 expires. (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>1200</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTc">
+ <description>Controlling the period a route set is considered congested when a Transfer Controlled message has been received.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>50</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT30">
+ <description>Timer to limit sending of TFPs and TFRs in response to unexpected TRA and TRW. This timer is specific for STP functionality and is ignored when configured as an endpoint.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>300</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT25">
+ <description>Delay extension timer invoked on reciept of a Traffic Restart Waiting message from an adjacent SP which is restarting.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>300</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT26">
+ <description>Controlling the periodic resend of Traffic Restart Waiting messages during restart of the local node.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>120</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT27">
+ <description>Timer enforcing a minimum node unavailablility period during MTP restart.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT28">
+ <description>Delay timer controlling a timed reaction of the restart of an adjacent node.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT29">
+ <description>Timer controlling the response of the receipt of Traffic Restart messages from an adjacent node.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>600</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT20">
+ <description>Controlling the periodic resend of Local Inhibit Change Message.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>1000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT21">
+ <description>Controlling the periodic resend of Remote Inhibit Test Message.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>1000</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT22">
+ <description>Delay on commencement of MTP Restart to allow the node to rebuild an accurate routing table based on messages for adjacent nodes.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>600</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT23">
+ <description>Supervision timer for routing updates on MTP Restart.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>40</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT31">
+ <description>Timer controlling the detection of false link congestion.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTDlack">
+ <description>Timer pending an acknowledge from the network layer for a DL_ACK_REQ.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerSltm">
+ <description>Timer for sending SLTM periodically.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>400</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerSlta">
+ <description>Supervision timer for SLTA message (time within SLTA should arrive).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaTack">
+ <description>Timer used for message acknowledgement.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaPeriodicAudit">
+ <description>Timer used for audit procedure.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>300</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT1">
+ <description>Delay to avoid mis-sequencing of messages when an association fails.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT3">
+ <description>Delay to avoid mis-sequencing of messages when an association becomes active.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT6">
+ <description>Delay to avoid mis-sequencing on controlled rerouting.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT8">
+ <description>Delay to prohibit sending of DUNA messages via the response method.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT40">
+ <description>Delay to avoid message mis-sequencing on controlled/forced rerouting.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT41">
+ <description>Timer controlloing the traffic activation delay during restart phase.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT42">
+ <description>The forever interval period for trying association after an unsiccessfull trial.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaTc">
+ <description>Timer controlling the period a route set is considered congested when a SCON message has been received.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>50</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaTassocack">
+ <description>Timer used for SCTP_ASSOCIATE_REQ message acknowledgement. This is the maximum time to wait for the SCTP_COMMUP_IND mesage before considering it to be an error.
+It should be longer than the time a message spends to reach the most distant destination, be processed and returned.</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <struct name="Mtp3bSpTtcTimerData">
+ <description>TTC timers for MTP3bSpTtc. Timervalues in 1/10 s (deciseconds).</description>
+ <structMember name="timerT1">
+ <description>Delay to avoid message mis-sequencing on changeover.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT2">
+ <description>Timer for waiting for a COO or a COA.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT3">
+ <description>Delay to avoid message mis-sequencing on a time controlled diversion change back.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT4">
+ <description>Timer for waiting for CBA, first attempt.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT6">
+ <description>Timer for delay to avoid message mis-sequencing on controlled rerouting.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>9</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT8">
+ <description>Timer for delay to prohibit sending of TFP messages via the response method. This is a STP specific parameter, which is ignored when configured as an endpoint.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT10">
+ <description>Timer for waiting to repeat sending of RST periodically.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>400</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT17">
+ <description>Delay to avoid oscillation of initial alignment failure and link restart.
+
+The value for this timer should be less than the value for timerT2.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>9</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerSrt">
+ <description>Timer pending a Signalling Route Test Acknowledgement.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTBsnt">
+ <description>Waiting for BSNT value from MTP-2 or SAAL (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTRetrieval">
+ <description>Timer for waiting for completion of buffer retrieval from MTP-2 or SAAL (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTStart">
+ <description>Timer for retransmission of DL_START_req if no answer received. Started when timerT17 expires. (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>1200</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTc">
+ <description>Controlling the period a route set is considered congested when a Transfer Controlled message has been received.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>50</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT15">
+ <description>Timer waiting to start signaling route set congestiontest. Used only if the Route Set
+Congestion Test Selectoption is set to "Use Route Set Congestion test".
+
+Guiding value 20 - 30.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT16">
+ <description>Timer waiting for route set congestion status update. Used only if the Route Set
+Congestion Test Selectoption is set to "Use Route Set Congestion test"
+
+Guiding value 14 - 22.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>14</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTDlack">
+ <description>Timer pending an acknowledge from the network layer for a DL_ACK_REQ.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <struct name="Mtp3bSpAnsiPriorityData">
+ <description>Priority attributes for MTP3b SP of the ANSI standard.</description>
+ <structMember name="prioSlt">
+ <description>The prioSlt attribute sets the priority for the
+ Signalling Link Test Message and Acknowledge (SLTM / SLTA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioCo">
+ <description>The prioCo attribute sets the priority for the ChangeOver Order and Acknowledge (COO/COA) or eXtended Change over Order and Acknowledge (XCO/XCA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet)
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioCb">
+ <description>The prioCb attribute sets the priority for the
+ Change Back Declaration and Acknowledge (CBD / CBA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioEc">
+ <description>The prioEc attribute sets the priority for the
+Emergency Change over Order and Acknowledge (ECO / ECA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioRst">
+ <description>The prioRst attribute sets the priority for the
+signalling Route Set Test (RST) message when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioTra">
+ <description>The prioTra attribute sets the priority for the
+Traffic Restart Allowed signal (TRA) message when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioUpu">
+ <description>The prioUpu attribute sets the priority for the
+ User Part Unavailable (UPU) message when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioLink">
+ <description>The prioLink attribute sets the priority for link related messages when issued by the MTP3b itself. The messages are :
+
+Link INhibit (LIN), Link UNinhibit (LUN),
+Link Inhibit Denied (LID),
+Link Inhibit Acknowledge (LIA),
+Link Uninhibit Acknowledge (LUA),
+Link Forced Uninhibit (LFU),
+Link Local inhibit Test (LLT) and
+Link Remote inhibit Test (LRT)
+
+When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ </struct>
+
+ <struct name="Mtp3bSpTtcPriorityData">
+ <description>Priority attributes for MTP3b SP of the TTC standard.</description>
+ <structMember name="prioCo">
+ <description>The prioCo attribute sets the priority for the ChangeOver Order and Acknowledge (COO/COA) or eXtended Change over Order and Acknowledge (XCO/XCA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet)
+.</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioCb">
+ <description>The prioCb attribute sets the priority for the
+ Change Back Declaration and Acknowledge (CBD / CBA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioEc">
+ <description>The prioEc attribute sets the priority for the
+Emergency Change over Order and Acknowledge (ECO / ECA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioRst">
+ <description>The prioRst attribute sets the priority for the
+signalling Route Set Test (RST) message when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioTfa">
+ <description>The prioTfa attribute sets the priority for the Transfer Allowed, TFA, messages.
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioRt">
+ <description>The priority indicator used for indicating message priority for signalling route test messages (SRT/SRA).
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioTfc">
+ <description>The priority indicator used for indicating the message prioirity for TFC.
+</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ </struct>
+
+ <enum name="Mtp3bSpPriorityLevel">
+ <description>Indicates the priority level for MTP 3.</description>
+ <enumMember name="LOWEST">
+ <description>Lowest priority setting.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="LOW">
+ <description>Low priority setting.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="HIGH">
+ <description>High priority setting.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="HIGHEST">
+ <description>Highest priority setting.</description>
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <struct name="Mtp3bSpChinaTimerData">
+ <description>China timers for MTP3bSpChina. Timervalues in 1/10 s (deciseconds).</description>
+ <structMember name="timerSlta">
+ <description>Supervision timer for SLTA message (time within SLTA should arrive).
+
+Timer T1 in ITU Q.707 standard.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerSltm">
+ <description>Timer for sending SLTM periodically.
+
+Timer T2 in ITU Q.707 standard.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>400</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT1">
+ <description>Delay to avoid message mis-sequencing on changeover.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT10">
+ <description>Timer for waiting to repeat sending of RST periodically.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>400</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT12">
+ <description>Waiting for uninhibit acknowledgement.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT13">
+ <description>Timer for waiting for force uninhibit.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT14">
+ <description>Timer for waiting for inhibition acknowledgement.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT17">
+ <description>Delay to avoid oscillation of initial alignment failure and link restart.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>9</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT18">
+ <description>Supervision timer for the first phase of a restarting STP. This is an STP specific parameter, which is ignored when configured as an endpoint.
+
+Unit: deciseconds (1/10 second).
+</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>200</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT19">
+ <description>Controlling the response of the receipt of a traffic restart message from an adjacent node.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>40</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT2">
+ <description>Timer for waiting for a COO or a COA.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT20">
+ <description>Overall MTP restart timer at the restarting MTP.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>40</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT21">
+ <description>Overall MTP restart timer at an adjacent signalling point to a restarting MTP.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>300</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT22">
+ <description>Local inhibit test timer.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>2500</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT23">
+ <description>Remote inhibit test timer.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>2500</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT3">
+ <description>Delay to avoid message mis-sequencing on a time controlled diversion change back.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT4">
+ <description>Timer for waiting for CBA, first attempt.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT5">
+ <description>Timer for waiting for CBA, second attempt
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT6">
+ <description>Timer for delay to avoid message mis-sequencing on controlled rerouting.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>9</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT8">
+ <description>Timer for delay to prohibit sending of TFP messages via the response method. This is a STP specific parameter, which is ignored when configured as an endpoint.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTBsnt">
+ <description>Waiting for BSNT value from MTP-2 or SAAL (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTc">
+ <description>Controlling the period a route set is considered congested when a Transfer Controlled message has been received.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>50</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTRetrieval">
+ <description>Timer for waiting for completion of buffer retrieval from MTP-2 or SAAL (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTStart">
+ <description>Timer for retransmission of DL_START_req if no answer received. Started when timerT17 expires. (not standard timer).
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>1200</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaTack">
+ <description>Timer used for message acknowledgement.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaPeriodicAudit">
+ <description>Timer used for audit procedure.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>300</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT1">
+ <description>Delay to avoid mis-sequencing of messages when an association fails.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT3">
+ <description>Delay to avoid mis-sequencing of messages when an association becomes active.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT6">
+ <description>Delay to avoid mis-sequencing on controlled rerouting.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT8">
+ <description>Delay to prohibit sending of DUNA messages via the response method.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT40">
+ <description>Delay to avoid message mis-sequencing on controlled/forced rerouting.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT41">
+ <description>Timer controlloing the traffic activation delay during restart phase.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaT42">
+ <description>The forever interval period for trying association after an unsiccessfull trial.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaTc">
+ <description>Timer controlling the period a route set is considered congested when a SCON message has been received.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>50</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT15">
+ <description>Timer waiting to start signaling route set congestiontest. Used only if the Route Set
+Congestion Test Selectoption is set to "Use Route Set Congestion test".
+
+Guiding value 20 - 30.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerT16">
+ <description>Timer waiting for route set congestion status update. Used only if the Route Set
+Congestion Test Selectoption is set to "Use Route Set Congestion test"
+
+Guiding value 14 - 22.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>14</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerTDlack">
+ <description>Timer pending an acknowledge from the network layer for a DL_ACK_REQ.
+
+Unit: deciseconds (1/10 second).</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="timerM3uaTassocack">
+ <description>Timer used for SCTP_ASSOCIATE_REQ message acknowledgement. This is the maximum time to wait for the SCTP_COMMUP_IND mesage before considering it to be an error.
+It should be longer than the time a message spends to reach the most distant destination, be processed and returned.</description>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>20</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <enum name="Mtp3bNetworkIndTtc">
+ <description>Indicates which type of geographical network, e.g. national, international, etc..
+
+Note: Only for TTC.</description>
+ <enumMember name="NATIONAL_NETWORK">
+ <description>National network.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="SPARE">
+ <description>Spare (for international use only).</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="INTERNATIONAL_NETWORK">
+ <description>International Network.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="SPARE_1">
+ <description>Spare.</description>
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <enum name="Mtp3bUsageState">
+ <description>There are three possible states for the usageState attribute:
+
+- idle, the Mtp3bSl carries no traffic.
+- active, the Mtp3bSl is working normally, and there is traffic, and it is not congested.
+- busy, the Mtp3bSl is working but is congested (traffic is routed on other links).</description>
+ <enumMember name="IDLE">
+ <description>idle, the Mtp3bSl carries no traffic.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="ACTIVE">
+ <description>active, the Mtp3bSl is working normally, and there is traffic, and it is not congested.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="BUSY">
+ <description>busy, the Mtp3bSl is working but is congested (traffic is routed on other links).</description>
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="Mtp3bProceduralState">
+ <description>The procedural state of the link.
+
+0 - not initialized
+1 - initialized</description>
+ <enumMember name="NOT_INITIALIZED">
+ <description>0 - not initialized.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="INITIALIZED">
+ <description>1 - initialized.</description>
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="NodeBehaviourType">
+ <description>The nodeBehaviorType attribute represents the MTP3b node type.</description>
+ <enumMember name="SEP">
+ <description>Signaling End Point.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="SEP_STP">
+ <description>Signalling Transfer and End Point, i.e the signalling point is of both type Signalling End Point (SEP) and Signalling Transfer Point (STP).</description>
+ <value>4</value>
+ </enumMember>
+ <enumMember name="SGW_STP_SEP">
+ <description>Signaling GateWay, Signaling End Point and Signalling Transfer Point, i.e the signalling point is of both type Signalling Transfer Point (STP), Signaling End Point (SEP) and Signaling GateWay (SGW).</description>
+ <value>5</value>
+ </enumMember>
+ </enum>
+
+ <struct name="Mtp3bSpChinaPriorityData">
+ <description>Priority attributes for MTP3b SP of the China standard.</description>
+ <structMember name="prioSlt">
+ <description>The prioSlt attribute sets the priority for the
+ Signalling Link Test Message and Acknowledge (SLTM / SLTA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioCo">
+ <description>The prioCo attribute sets the priority for the ChangeOver Order and Acknowledge (COO/COA) or eXtended Change over Order and Acknowledge (XCO/XCA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet)
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioCb">
+ <description>The prioCb attribute sets the priority for the
+ Change Back Declaration and Acknowledge (CBD / CBA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioEc">
+ <description>The prioEc attribute sets the priority for the
+Emergency Change over Order and Acknowledge (ECO / ECA) messages when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioRst">
+ <description>The prioRst attribute sets the priority for the
+signalling Route Set Test (RST) message when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioTra">
+ <description>The prioTra attribute sets the priority for the
+Traffic Restart Allowed signal (TRA) message when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioUpu">
+ <description>The prioUpu attribute sets the priority for the
+ User Part Unavailable (UPU) message when issued by the MTP3b itself. When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ <structMember name="prioLink">
+ <description>The prioLink attribute sets the priority for link related messages when issued by the MTP3b itself. The messages are :
+
+Link INhibit (LIN), Link UNinhibit (LUN),
+Link Inhibit Denied (LID),
+Link Inhibit Acknowledge (LIA),
+Link Uninhibit Acknowledge (LUA),
+Link Forced Uninhibit (LFU),
+Link Local inhibit Test (LLT) and
+Link Remote inhibit Test (LRT)
+
+When a message is transferred from the MTP3b the message priority uses the two spare bits in the SIO (Service Information Octet).
+
+lowest:0
+low:1
+high:2
+highest:3</description>
+ <enumRef name="Mtp3bSpPriorityLevel">
+ <defaultValue>HIGHEST</defaultValue>
+ </enumRef>
+ </structMember>
+ </struct>
+
+ <enum name="Mtp3bRouteType">
+ <description>The type of Signalling Route.</description>
+ <enumMember name="TDM_ATM">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="IP">
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="HomingState">
+ <enumMember name="SINGLE_HOMED_1">
+ <description>Single-homed with ipAddress1.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="SINGLE_HOMED_2">
+ <description>Single-homed with ipAddress2.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="MULTI_HOMED">
+ <description>Multihomed association with ipAddress1 and
+ipAddress2
+</description>
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <enum name="RouteState">
+ <description>The state of the signaling route.</description>
+ <enumMember name="NOT_BLOCKED">
+ <description>The signaling route is not blocked.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="BLOCKED">
+ <description>The signaling route is blocked.</description>
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="WorkingMode">
+ <enumMember name="hostMode">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="routerMode">
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="OspfMetricType">
+ <description>Open Shortest Path First metric type.</description>
+ <enumMember name="comparableCost">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="nonComparable">
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="RouteType">
+ <description>The types of the routes found in the IP routing table.</description>
+ <enumMember name="INET_RTPROTO_OTHER">
+ <description>The source of information is unknown.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="INET_RTPROTO_LOCAL">
+ <description>Route created from local configuration data (both static and interface routes).
+Each interface created gets an entry in the routing table of the RO.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="INET_RTPROTO_NETMGMT">
+ <description>Route added by SNMP.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="INET_RTPROTO_OSPF">
+ <description>Route added by OSPF.</description>
+ <value>13</value>
+ </enumMember>
+ <enumMember name="INET_RTPROTR_ICMP">
+ <description>Route added by ICMP redirect message.</description>
+ <value>4</value>
+ </enumMember>
+ </enum>
+
+ <exception name="RouteNotFoundException">
+ <description>Invalid IP route has been given as a parameter to an action.</description>
+ <exceptionParameter name="routeNotFound">
+ <description>Exception message.</description>
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <exception name="InvalidRouteException">
+ <description>Invalid IP route has been given as a parameter to an action.</description>
+ <exceptionParameter name="invalidRoute">
+ <dataType>
+ <string/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+ <enum name="MauDuplexMode">
+ <enumMember name="HALF_DUPLEX">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="FULL_DUPLEX">
+ <value>1</value>
+ </enumMember>
+ </enum>
+
+ <enum name="ControllerMode">
+ <description>The controller mode of a physical interface.</description>
+ <enumMember name="CONTROLLER_E1">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="CONTROLLER_T1">
+ <value>2</value>
+ </enumMember>
+ <enumMember name="CONTROLLER_J1">
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <struct name="OspfAreaRange">
+ <description>ipAddress - the subnet address of the range.
+subnetMask - IP subnet mask of the range to be added.
+advertise - indicates whether the area range should be advertised into OSPF.
+</description>
+ <structMember name="ipAddress">
+ <string/>
+ </structMember>
+ <structMember name="subnetMask">
+ <description>Note! The subnet has to be contigious. That is, has the LSB set to 0 (zero).
+
+Example:
+
+255.255.255.X
+
+Contiguous subnet mask:
+11111111.11111111.11111111.11111110 (X = 254)
+11111111.11111111.11111111.11111100 (X = 252)
+
+Not-contiguous subnet mask:
+11111111.11111111.11111111.11111010 (X = 250)
+</description>
+ <string/>
+ </structMember>
+ <structMember name="advertise">
+ <boolean/>
+ </structMember>
+ </struct>
+
+ <struct name="RoutingTableEntry">
+ <description>IP routing table entry.</description>
+ <structMember name="destinationIpAddr">
+ <description>The destination IP address.</description>
+ <string/>
+ </structMember>
+ <structMember name="destinationNetworkMask">
+ <description>The destination IP network mask.</description>
+ <string/>
+ </structMember>
+ <structMember name="nextHopIpAddr">
+ <description>The next hop IP address.</description>
+ <string/>
+ </structMember>
+ <structMember name="routeMetric">
+ <description>The route metric.</description>
+ <long/>
+ </structMember>
+ <structMember name="routeType">
+ <description>The route type.</description>
+ <enumRef name="RouteType">
+ </enumRef>
+ </structMember>
+ <structMember name="interfaceName">
+ <description>The interface name.</description>
+ <string/>
+ </structMember>
+ <structMember name="redistribute">
+ <description>Indicates if the route should be redistributed.</description>
+ <boolean/>
+ </structMember>
+ <structMember name="active">
+ <description>Indicates if the route is active.</description>
+ <boolean/>
+ </structMember>
+ </struct>
+
+ <enum name="AutoConfigurationMode">
+ <description>Denotes whether the autoConfiguration mode for the IpAccessHost is turned on or off.</description>
+ <enumMember name="ON">
+ <value>1</value>
+ </enumMember>
+ <enumMember name="OFF">
+ <value>2</value>
+ </enumMember>
+ </enum>
+
+ <enum name="Aal5TpSelectionModes">
+ <description>In case 'NO_PREFERENCE', 'LOCAL_MP_SELECT_VCC_AT_LINK_UP', LOCAL_MP_PEER_SELECTION_VCC' or 'LOCAL_MP_ACTIVE_RESELECTION' is selected the IpAtmLink MO will prefer Aal5TpVccTp on local MP (i.e. Aal5TpVccTp executing on the same MP as the IpAtmLink), but other Aal5TpVccTp will be accepted if needed.
+
+In case 'ONLY_LOCAL_MP' is selected, the ipAtmLink (Inet Link) will consider Aal5TpVccTp residing on other MPs as a malfunction and discard the usage of them. No InvArp sending will be performed on them and all incomming trafic on them will be discarded. If no local Aal5TpVccTp exists the operational state of the link will be changed to disabled.</description>
+ <enumMember name="NO_PREFERENCE">
+ <value>0</value>
+ </enumMember>
+ <enumMember name="LOCAL_MP_SELECT_VCC_AT_LINK_UP">
+ <description>Prefer termination on local MP, select Vcc when link goes up.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="LOCAL_MP_PEER_SELECTION_VCC">
+ <description>Prefer termination on local MP, follow peer selection of Vcc.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="LOCAL_MP_ACTIVE_RESELECTION">
+ <description>Prefer termination on local MP, active reselection to new Aal5TpVccTp as soon as a better choice exists.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="ONLY_LOCAL_MP">
+ <description>Restricted to local MP, follow peer selection if termination is on local MP.
+</description>
+ <value>4</value>
+ </enumMember>
+ </enum>
+
+ <enum name="AlarmReport">
+ <description>Alarm report for the Virtual path connection termination point.
+RDI - Remote defect indication
+LOC - Loss of continuity
+AIS - Alarm indication signal</description>
+ <enumMember name="ALARM_LOC">
+ <description>For alarms of type Loss of continuity.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="ALARM_LOC_RDI">
+ <description>For alarms of type Loss of continuity and Remote defect indication.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="ALARM_AIS_LOC">
+ <description>For alarms of type Alarm indication signal and Loss of continuity.</description>
+ <value>6</value>
+ </enumMember>
+ <enumMember name="ALARM_AIS_RDI_LOC">
+ <description>For alarms of type Alarm indication signal, Remote defect indication and Loss of continuity.</description>
+ <value>7</value>
+ </enumMember>
+ </enum>
+
+ <enum name="AtmCounterMode">
+ <enumMember name="PM_MODE_OFF">
+ <description>Performance monitoring is turned off. PM counters give irrelevant values.</description>
+ <value>0</value>
+ </enumMember>
+ <enumMember name="PM_MODE_ONLYCOUNT">
+ <description>Performance monitoring counters are active
+</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="PM_MODE_FPM">
+ <description>FPM, Forward Performance Monitoring activated.
+
+Performance monitoring counters are active
+</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="PM_MODE_BR">
+ <description>Backward reporting, BR, cells are generated.
+
+Performance monitoring counters are active
+</description>
+ <value>4</value>
+ </enumMember>
+ <enumMember name="PM_MODE_FPM_BR">
+ <description>FPM, Forward Performance Monitoring activated.
+
+Backward reporting, BR, cells are generated.
+
+Performance monitoring counters are active
+</description>
+ <value>6</value>
+ </enumMember>
+ </enum>
+
+ <enum name="AtmNomPmBlkSize">
+ <description>Nominal performance monitoring, PM, blocksize. The minimum number of ATM cells to send before sending a Forward Performance Monitoring, FPM, cell.</description>
+ <enumMember name="NOM_PM_BLKSIZE_2_7">
+ <description>Nominal performance monitoring, PM, block size, 2e7 (2 to the power of 7).</description>
+ <value>128</value>
+ </enumMember>
+ <enumMember name="NOM_PM_BLKSIZE_2_8">
+ <description>Nominal performance monitoring, PM, block size, 2e8 (2 to the power of 8).</description>
+ <value>256</value>
+ </enumMember>
+ <enumMember name="NOM_PM_BLKSIZE_2_9">
+ <description>Nominal performance monitoring, PM, block size, 2e9 (2 to the power of 9).</description>
+ <value>512</value>
+ </enumMember>
+ <enumMember name="NOM_PM_BLKSIZE_2_10">
+ <description>Nominal performance monitoring, PM, block size, 2e10 (2 to the power of 10).</description>
+ <value>1024</value>
+ </enumMember>
+ <enumMember name="NOM_PM_BLKSIZE_2_11">
+ <description>Nominal performance monitoring, PM, block size, 2e11 (2 to the power of 11).</description>
+ <value>2048</value>
+ </enumMember>
+ <enumMember name="NOM_PM_BLKSIZE_2_12">
+ <description>Nominal performance monitoring, PM, block size, 2e12 (2 to the power of 12).</description>
+ <value>4096</value>
+ </enumMember>
+ <enumMember name="NOM_PM_BLKSIZE_2_13">
+ <description>Nominal performance monitoring, PM, block size, 2e13 (2 to the power of 13).</description>
+ <value>8192</value>
+ </enumMember>
+ <enumMember name="NOM_PM_BLKSIZE_2_14">
+ <description>Nominal performance monitoring, PM, block size, 2e14 (2 to the power of 14).</description>
+ <value>16384</value>
+ </enumMember>
+ <enumMember name="NOM_PM_BLKSIZE_2_15">
+ <description>Nominal performance monitoring, PM, block size, 2e15 (2 to the power of 15).</description>
+ <value>32768</value>
+ </enumMember>
+ </enum>
+
+ <enum name="ServiceCategory">
+ <enumMember name="SERVICE_CATEGORY_CBR">
+ <description>Service category Constant Bit rate, CBR.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="SERVICE_CATEGORY_UBR">
+ <description>Service category Unspecified Bit rate, UBR.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="SERVICE_CATEGORY_UBR_PLUS">
+ <description>Service category Unspecified Bit rate+, UBR+. UBR+ guarantees a certain bandwidth. If higher bandwidth is used it will be handled as UBR.</description>
+ <value>3</value>
+ </enumMember>
+ </enum>
+
+ <enum name="AtmQos">
+ <description>ATM's Quality of Service classes.
+
+The ATM layer system provides four QoS classes, numbered 1 to 4, where CLASS_ONE gives the best QoS in regards to Cell Loss Ratio &lt;CLR&gt; and Cell Delay Variation &lt;CDV&gt; and CLASS_FOUR doesn't give any QoS guarantees. CLASS_ONE and CLASS_TWO are the only classes applicable for real time traffic.</description>
+ <enumMember name="CLASS_ONE">
+ <description>CDV &lt; 1 ms (milliseconds), CLR &lt; 10e-8. Typically used by timing unit.</description>
+ <value>1</value>
+ </enumMember>
+ <enumMember name="CLASS_TWO">
+ <description>CDV &lt; 1 ms, CLR &lt; 10e-7. Typically used for speech.</description>
+ <value>2</value>
+ </enumMember>
+ <enumMember name="CLASS_THREE">
+ <description>CLR &lt; 10e-5. Typically used for signalling.</description>
+ <value>3</value>
+ </enumMember>
+ <enumMember name="CLASS_FOUR">
+ <description>Typically used for IP.</description>
+ <value>4</value>
+ </enumMember>
+ </enum>
+
+ <struct name="ValueOfUnex">
+ <description>The attributes in this struct represents the ATM header, (vpi, vci, pti), of the last recieved unexpected cell.</description>
+ <structMember name="vpi">
+ <description>The ATM header vpi.</description>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="vci">
+ <description>The ATM header vci.</description>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ <structMember name="pti">
+ <description>The ATM header pti.</description>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </structMember>
+ </struct>
+
+ <class name="TransportNetwork">
+ <description>This MO structures the transport network of the managed element. It is created automatically and cannot be deleted.
+
+The local distinguished name of this MO is ManagedElement=1, TransportNetwork=1.</description>
+ <systemCreated/>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="TransportNetworkId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="getAal5ForNniSaal">
+ <description>This action returns a sequnce of Aal5TpVccTp MOs that is unreserved and executes on an MP.
+
+Also the following condition has to be fullfilled:
+
+MinAal5Sdu = min (fromUserMaxSduSize, toUserMaxSduSize)
+
+roundedDownSdu = (MinAal5Sdu - (MinAal5Sdu modulo 4) +4)
+
+roundedDownSdu &gt; low boundry for maxSduSize (in NniSaalTp)
+
+Note that the values for fromUserMaxSduSize and toUserMaxSduSize is the actual values set in the Aal5TpVccTp MO.
+Also note that the attributes minAal5Sdu and roundedDownSdu is used internaly in this action.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </returnType>
+ </action>
+ <action name="getAal5ForUniSaal">
+ <description>This action returns a sequnce of Aal5TpVccTp MOs that is unreserved and executes on an MP.
+
+Also the following condition has to be fullfilled:
+
+MinAal5Sdu = min (fromUserMaxSduSize, toUserMaxSduSize)
+
+roundedDownSdu = (MinAal5Sdu - (MinAal5Sdu modulo 4) +4)
+
+roundedDownSdu &gt; low boundry for maxSduSize (in UniSaalTp)
+
+Note that the values for fromUserMaxSduSize and toUserMaxSduSize is the actual values set in the Aal5TpVccTp MO.
+Also note that the attributes minAal5Sdu and roundedDownSdu is used internaly in this action.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </returnType>
+ </action>
+ <action name="getAal2PathForAal2Pdu">
+ <description>This action returns a sequence of all unreserved Aal2PathVccTp's that have an Aal2PathId that has not been
+used by another Aal2PathDistributionUnit under the same parent (Aal2Ap).
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </returnType>
+ <parameter name="aal2Ap">
+ <in/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="getRpuForAal2Pdu">
+ <description>This action returns a sequence of all ReliableProgramUniters that has not reached the maximun number of possible reservations
+and has not already been used by other Aal2PathDistributionUnit MO's (if exists) under the same parent (Aal2Ap MO).
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </returnType>
+ <parameter name="aal2Ap">
+ <in/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="getUnreservedPluginUnits">
+ <description>This action returns a sequence of PlugInUnits that is unreserved.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </returnType>
+ </action>
+ <action name="getDs0BundlesForMtp2">
+ <description>This action returns a sequence of Ds0Bundle MOs that is unreserved and only has one (1) timeSlot set in the listOfTimeSlots.
+The attribute tdmMode in these Ds0Bundles must be enabled.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </returnType>
+ </action>
+ </class>
+
+ <class name="Slot">
+ <description>The Slot MO is used to represent a slot in a subrack. A slot can hold a plug-in-unit, a board, (represented by PlugInUnit MOs).
+
+The number of slots in a subrack is specified when defining the subrack.
+
+The system will automatically create the right number of Slot MOs in the subrack at creation of the Subrack MO.
+This MO cannot be deleted by an operator.
+
+The local distinguished names of this MO's are select with identity Slot=1 in the leftmost slot with incremental numbering towards the right in the subrack.. </description>
+ <systemCreated/>
+ <attribute name="userLabel">
+ <description>A user friendly name associated to the managed object
+
+</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="slotState">
+ <description>Gives the state of the slot.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="SlotState">
+ <defaultValue>free</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="slotNumber">
+ <description>The number of the position from the left side, starting from 1.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long/>
+ </dataType>
+ </attribute>
+ <attribute name="SlotId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="productData">
+ <description>This product data describes the plug-in-unit that is presently inserted. The information is only available when slotState = used.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <structRef name="OperProductData"/>
+ </dataType>
+ </attribute>
+ <attribute name="upgradeGroupId">
+ <description>The upgradeGroupId is able to group a number of PIUs, all in the group can be upgraded at the same time.
+
+If upgradeGroupTypeName is "", this attribute is not used.
+</description>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="upgradeGroupTypeName">
+ <description>The upgradeGroupTypeName, together with the upgradeGroupId, define an upgrade group.
+</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="ManagedObject">
+ <description>The Managed Object MO is not part of the model. It is only used to have valid reference types for certain attributes. </description>
+ <attribute name="ManagedObjectId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="getType">
+ <returnType>
+ <string/>
+ </returnType>
+ </action>
+ <action name="getId">
+ <returnType>
+ <string/>
+ </returnType>
+ </action>
+ <action name="getParent">
+ <returnType>
+ <moRef name="ManagedObject"/>
+ </returnType>
+ </action>
+ <action name="getChildren">
+ <returnType>
+ <long/>
+ </returnType>
+ </action>
+ <action name="getFullDistinguishedName">
+ <returnType>
+ <string/>
+ </returnType>
+ </action>
+ <action name="delete">
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="MoHasChildrenException"/>
+ <raisesException name="MoReservedByOtherUserException"/>
+ <raisesException name="FroRequestFailedException"/>
+ <raisesException name="FroNotAccessibleException"/>
+ <raisesException name="UndeletableMoException"/>
+ <raisesException name="TransactionRequiredException"/>
+ </action>
+ <action name="getLocalDistinguishedName">
+ <returnType>
+ <string/>
+ </returnType>
+ </action>
+ <action name="create">
+ <returnType>
+ <moRef name="ManagedObject"/>
+ </returnType>
+ <raisesException name="MoNameAlreadyTakenException"/>
+ <raisesException name="AttrMissingAtCreateException"/>
+ <raisesException name="AttrNotSettableAtCreateException"/>
+ <raisesException name="IllegalParentException"/>
+ <raisesException name="MoCardinalityViolationException"/>
+ <raisesException name="NoSuchAttributeException"/>
+ <raisesException name="MoCanNotBeCreatedException"/>
+ <raisesException name="NoSuchFieldException"/>
+ <raisesException name="NotHandledAttributeTypeException"/>
+ <raisesException name="WrongAttributeTypeException"/>
+ <raisesException name="ValueOutOfRangeException"/>
+ <raisesException name="FroRequestFailedException"/>
+ <raisesException name="FroNotAccessibleException"/>
+ <raisesException name="TransactionRequiredException"/>
+ <raisesException name="IpException"/>
+ <raisesException name="IpFormatException"/>
+ <raisesException name="EquipException"/>
+ <raisesException name="AttrValueNotUniqueException"/>
+ <raisesException name="MaxNumberExceededException"/>
+ <raisesException name="MoReservedNotDeletableException"/>
+ </action>
+ </class>
+
+ <class name="VclTp">
+ <description>This MO is used to represent the termination of an external VC link in the node.
+
+Note that a maximum of 10 000 MO of this kind may be configured in a node.
+
+Note! The performance monitoring counters in the VclTp MO is set to 0 (zero) at start or restart of the node.
+When the value is to large too fit in to a long (31bit) the counter turns over and starts from 0 again.</description>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="externalVci">
+ <description>Virtual Channel Idenitifier, VCI, value for this Virtual Channel Link, VCL.
+
+Range: 32 - 65535.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>32</min> <max>65535</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="atmTrafficDescriptorId">
+ <description>Reference to the AtmTrafficDescriptor profile.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="AtmTrafficDescriptor"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>User that have reserved this VclTp.
+
+</description>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the VclTp.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmReceivedAtmCells">
+ <description>Performance monitoring counter for number of received ATM cells.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmTransmittedAtmCells">
+ <description>Performance monitoring counter for number of transmitted ATM cells.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status of the VclTp.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="VclTpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="eteLoopBack">
+ <description>Used by VclTp to inforce a Virtual Channel end-to-end loopback.
+false=Failed, true=Succeded.
+
+Note! This action requires a transaction.
+
+</description>
+ <returnType>
+ <boolean/>
+ </returnType>
+ </action>
+ </class>
+
+ <class name="ManagedElement">
+ <description>The Managed Element MO is the top MO in the MOM. A management application will communicate with the Managed Element MO for the purpose of monitoring it and controlling it.
+
+The ManagedElement MO is automatically created and cannot be deleted.
+
+The local distinguished name of this MO is ManagedElement=1.</description>
+ <systemCreated/>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="site">
+ <description>This attribute gives information about geographical location (e.g. place name).</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>255</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="logicalName">
+ <description>This attribute gives a logical name of a site.
+
+</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>255</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="productType">
+ <description>This attribute describes the product type and is always set to the value "Node".</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <defaultValue>Node</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="productName">
+ <description>This attribute describes the implemented functionality. </description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>12</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="productNumber">
+ <description>This attribute uniquely identifies the product (e.g. ROF123).</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>24</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="productRevision">
+ <description>This attribute identifies the version of the product (e.g. R2A).</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>7</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ManagedElementId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="restart">
+ <description>Restart the node with an unconditional reload.
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="restartRank">
+ <in/>
+ <dataType>
+ <enumRef name="RestartRank">
+ </enumRef>
+ </dataType>
+ </parameter>
+ </action>
+ </class>
+
+ <class name="Equipment">
+ <description>This Managed Object is used as a structural element for the network element, i.e. it only acts as a container for other MO:s. This MO structures the equipment of the network element.
+
+The local distinguished name of this MO is ManagedElement=1, Equipment=1.</description>
+ <systemCreated/>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="EquipmentId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Subrack">
+ <description>This MO is used to represent a subrack.
+</description>
+ <attribute name="userLabel">
+ <description>A free tag that a user can associated to the this managed object. The value has no relevance for the managed system.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="switchModule">
+ <description>A reference to a SwitchModule ManagedObject, from which the SwitchModule number can be retrived. That number describes how the subrack is connected to the node, i.e. how the subrack�s cables are connected to the hub subrack. (The hub subrack has switch module number �0�).</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="SwitchModule"/>
+ </dataType>
+ </attribute>
+ <attribute name="subrackType">
+ <description>There can only be one hub subrack in the node. The hub subrack is used to control switching and synchronization for the complete node.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="SubrackType">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="productType">
+ <description>This attribute describes the product type and is always set to the value "HW".</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>"HW"</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeProductData">
+ <description>This product data describes the subrack that is configured to be installed.
+
+</description>
+ <mandatory/>
+ <dataType>
+ <structRef name="AdminProductData"/>
+ </dataType>
+ </attribute>
+ <attribute name="subrackPosition">
+ <description>The position of this subrack within a cabinet.
+The purpose of this attribute is to help an operator locate the source of an error by letting the system put this
+information in alarms. The system does not use this information in any other way i.e. it does not affect the
+operation of the system.
+The subrack position is an integer (1-n) stating the cabinet Id, starting from the left and a letter (A-Z) stating
+the Subrack vertical position starting from the ground, e.g. 5C.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="cabinetPosition">
+ <description>The position of the cabinet (within a group of other cabinets) in which this subrack is placed.
+The purpose of this attribute is to help an operator locate the source of an error by letting the system put this information in alarms. The system does not use this information in any other way i.e. it does not affect the operation of the system.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="SubrackId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="numberOfSlots">
+ <description>Defines the number of slot in the subrack. The default value is 28.
+
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>28</max>
+ </range>
+ <defaultValue>28</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="operationalProductData">
+ <description>The operational product data describes the subrack that is actually installed.
+
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <structRef name="OperProductData"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>A reference to the SwAllocation MO that has reserved this Subrack for Fan MO upgrades..
+The attribute is set/cleared by internal actions.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <action name="removeSlots">
+ <description>Removes the given number of Slot MOs from the model. The Slots with the highest slotNumber are removed. After the action no Slot will have apn = 0.
+The attribute numberOfSlots will be udated.
+
+If there is a child MO the action will fail and the MOHasChildrenException is thrown.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="numberOfSlotsToRemove">
+ <description>The number of slots to remove.</description>
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ </action>
+ </class>
+
+ <class name="LoadModule">
+ <description>This MO is used to represent software installed in the file system.
+
+LoadModule MO can represent files with executable code, files with text information
+(COI) or directories in Cello file system.
+
+MOs of this type are created automatically during system upgrade.
+MOs of this type are possible to create manually but a system upgrade
+is recommended to create them.
+
+Note! In order for a program to be reliable the following conditions must be fulfilled:
+
+1. The attribute 'loaderType' must be set to 'OseLoader'.
+2. The attribute 'oseProgramLoadClass' must be set to a value &gt; 100.
+3. The program must execute on a MP (Main Processor).
+
+</description>
+ <attribute name="userLabel">
+ <description>Free tag for marking this managed object.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="productData">
+ <description>Product information data.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="AdminProductData"/>
+ </dataType>
+ </attribute>
+ <attribute name="loadModuleFilePath">
+ <description>The path to this load module in the file system, including the file name.
+
+Example: /c/load_modules/CXC112874R1A01
+where /c/load_modules/ is the directory and CXC112874R1A01 is the file name.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="loaderType">
+ <description>The type of the program loader.
+
+Note! This corresponds to LoaderName in the Upgrade Control File (UCF).</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="LoadModuleLoaderType">
+ <defaultValue>OseLoader</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="otherLoaderName">
+ <description>This attribute must have a value if the loaderType attribute equals other.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="preLoad">
+ <description>A recommendation to the system to (if possible) cache this load module close to where its program(s) execute(s), e.g. in a flash file system. The purpose of this attribute is to enable faster loading at restart of programs referring to this load module.
+
+
+
+
+</description>
+ <dataType>
+ <enumRef name="LoadModulePreLoadType">
+ <defaultValue>no</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="fileFormat">
+ <description>The file format (RPDOUT, html, java, fpga, ...).</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="oseProgramLoadClass">
+ <description>Specifies in which load phase programs of this load module should be started.
+
+Note: If the LoadModule is a java archive file (.jar) it will be loaded in the load phase of the java machine rather than according to its own oseProgramLoadClass.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="LoadClass">
+ <defaultValue>application</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reliableProgramLabel">
+ <description>Reliable program identity.
+Compare this to the reliableProgramLabel in ReliableProgramUniter MO.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="isDirectory">
+ <description>Indicates if the load module is a file or directory.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="oseProgramPoolSize">
+ <description>This attribute sets the size of the program pool size. In the referenced loadModule there is
+possible to set this value at create.
+This value will then be fetched by program and used at create if no value is submitted at
+create of the program Mo.
+The referenced load module has a default size defined at compile time which is used if no
+value is submitted at create of loadModule or the program Mo.
+
+Note! The value of this attribute is overwritten during Software Upgrade.
+
+Unit is byte.
+
+</description>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="oseProgramHeapSize">
+ <description>This attribute sets the size of the program heap size. In the referenced loadModule there is possible to set this value at create. This value will then be fetched by program and used at create if no value is submitted at create of the program Mo.
+The referenced load module has a default size defined at compile time which is used if no value is submitted at create of loadModule or the program Mo.
+
+Note! The value of this attribute is overwritten during Software Upgrade.
+
+Unit is byte.
+
+</description>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="programMustBeSingleton">
+ <description>Indicator whether the (OSE) program must be a singleton or not.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="moppletEntries">
+ <description>Contains all class that are to be initialised and started when the JVM restarts.
+Technical note: The class name must specify the full package and class name in standard Java syntax, e.g. "se.ericsson.cello.X" ; must implement the se.ericsson.cello.moframework.Mopplet interface and be found in this LoadModule.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <sequence>
+ <string>
+ <defaultValue/>
+ </string>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="LoadModuleId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedByUpgradePackage">
+ <description>Indicates whether this MO has been reserved by the UpgradePackage MO or not.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Synchronization">
+ <description>This MO is used to administer synchronization references for the network synchronization function and to view the system clock state of Timing Unit boards.
+
+Synchronization can have 0 to 8 relations to other MOs. The only valid MOs where relations can exist are E1Physpathterm, J1Physpathterm, T1Physpathterm, Os155SpiTtp, TU Synchronization Reference, and ManagedObject (for the non-Cello RXI820 MO) MOs. Note that maximum number of relations to these MOs is 8 all together.
+
+The synchronization MO is automatically created and cannot be deleted.
+
+Note: An external ManagedObject that wishes to be connected to the Synchronization MO must implement the following interface se.ericsson.cello.equipment.SyncReservable!
+
+The local distinguished name of this MO is ManagedElement=1,TransportNetwork=1,Synchronization=1
+
+.</description>
+ <systemCreated/>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="degradationIsFault">
+ <description>Controls whether synchronization reference degradation (e.g. signal level degradation) is interpreted as a synchronization reference fault or not. Attribute value is only applicable for traffic carrying synchronization references</description>
+ <dataType>
+ <enumRef name="FaultCriteria">
+ <defaultValue>degrNotFault</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="systemClockA">
+ <description>State of system clock signal on Timing Unit A.
+Note that system clock generated by TU A (TU in slot 4) has higher priority than TU B (TU in slot 5) system clock, i.e. each device board uses system clocks according to this priority order.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="ClockState">
+ <defaultValue>unknownMode</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="systemClockB">
+ <description>State of system clock signal on Timing Unit B. Note that system clock generated by TU A (TU in slot 4) has higher priority than TU B (TU in slot 5) system clock, i.e. each device board uses system clocks according to this priority order.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="ClockState">
+ <defaultValue>unknownMode</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="syncReference">
+ <description>Set of synchronization reference physical resources. An MO reference to an TU synchronization reference MO implementation.
+A synchronization reference in added to the system by using action AddSyncRefResource.
+Note: if this attributes has value "Non-existing MO reference" then all the respective attributes of type sequence of 8 are not applicable.
+
+Note: The length of this sequence is always 8.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ <length>8</length>
+ <nonUnique/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="syncRefPriority">
+ <description>Synchronization reference priority.
+1 represents the highest and 8 the lowest priority. Every synchronization reference must have unique priority value. Value 0 means not applicable, that no synchronization with this priority is defined.
+This attribute is mandatory when adding a synchronization reference to the system (by using action addSyncRefResource).
+A priority value can be changed with the changeSyncRefPriority action provided that the priority is not already assigned to some other SyncRefResource.
+
+Note: The length of this sequence is always 8.</description>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <long>
+ <range>
+ <min>0</min> <max>8</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ <length>8</length>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="syncRefActivity">
+ <description>Set of synchronization reference activity attributes.
+
+Note: The length of this sequence is always 8.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <enumRef name="RefActivity">
+ <defaultValue>inactive</defaultValue>
+ </enumRef>
+ <length>8</length>
+ <nonUnique/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="syncRefStatus">
+ <description>Set of synchronization reference status attributes.
+
+Note: The length of this sequence is always 8.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <enumRef name="RefState">
+ <defaultValue>failed</defaultValue>
+ </enumRef>
+ <length>8</length>
+ <nonUnique/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="SynchronizationId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="systemClockRedundancy">
+ <description>Indicates if the node is redundant from Network Synchronization functions point of view.</description>
+ <dataType>
+ <enumRef name="SystemClockRedundancy">
+ <defaultValue>SYSTEM_CLOCK_USERS_USE_PLANE_A</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <action name="addSyncRefResource">
+ <description>This action adds one synchronization reference to the system. As a result of successful action, one set of attributes (attributes of type sequence of 8) is added to Synchronization MO.
+Parameters:
+syncReference: Managed object implementation, to which a mo-reference is to be added. See description of attribute SyncReference.
+syncPriority: Priority of synchronization reference. Each synchronization reference must have unique priority value, this must be checked by synchronization MO.
+
+Description of exceptions:
+- AlreadyRegistered: this reference is already registered
+- MaxNoOfRefRegistered: maximum number (8) of synchronization references already present
+- PriorityAlreadyInUse: syncPriority is identical with an existing synchronization reference priority
+- PriorityOutOfRange: invalid syncPriority value
+- InvalidMoReference: invalid syncReference for registration as a synchronization reference (invalid MO type)
+- NotPermitted: syncReference does not allow SyncReserve to be performed
+
+Note: An external ManagedObject that wishes to be connected to the Synchronization MO must implement the following interface se.ericsson.cello.equipment.SyncReservable!
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="syncReference">
+ <in/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </parameter>
+ <parameter name="syncPriority">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="AlreadyRegisteredException"/>
+ <raisesException name="MaxNoOfRefRegisteredException"/>
+ <raisesException name="PriorityAlreadyInUseException"/>
+ <raisesException name="PriorityOutOfRangeException"/>
+ <raisesException name="InvalidMoReferenceException"/>
+ <raisesException name="NotPermittedException"/>
+ </action>
+ <action name="removeSyncRefResource">
+ <description>This action removes one synchronization reference that has previously been added.
+(In future releases, this action should include a check whether the synchronization reference to be removed is the only existing synchronization reference. In that case, the user is asked for a confirmation to remove the last synchronization reference.)
+Parameters:
+syncReference: Managed object implementation, to which a mo-reference currently exists, but is now to be removed. See description of attribute SyncReference.
+
+Description of exceptions:
+- NotRegistered: synchronization reference is not registered
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="syncReference">
+ <in/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </parameter>
+ <raisesException name="NotRegisteredException"/>
+ </action>
+ <action name="changeSyncRefPriority">
+ <description>This action changes the synchronization priority of one previously registered synchronization reference resource.
+Parameters:
+syncReference: Managed object implementation, for which the synchronization priority is to be changed. See description of attribute syncReference.
+syncPriority: The new priority of synchronization reference. Each synchronization reference must have unique priority value, this must be checked by synchronization MO.
+
+Description of exceptions:
+- PriorityAlreadyInUse: syncPriority is identical with an existing synchronization reference priority
+- PriorityOutOfRange: invalid syncPriority value
+- NotRegistered: synchronization reference is not registered
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="syncReference">
+ <in/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </parameter>
+ <parameter name="syncPriority">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="PriorityAlreadyInUseException"/>
+ <raisesException name="PriorityOutOfRangeException"/>
+ <raisesException name="NotRegisteredException"/>
+ </action>
+ <action name="resetLossOfTracking">
+ <description>This action resets the detected Loss of Tracking error condition of one synchronization reference. After reset the synchronization reference is usable again.
+Parameters:
+syncReference: Specifies the synchronization reference for which the Loss of Tracking status is to be reset.
+
+Description of exceptions:
+- NotRegistered: synchronization reference is not registered
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="syncReference">
+ <in/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </parameter>
+ <raisesException name="NotRegisteredException"/>
+ </action>
+ </class>
+
+ <class name="SccpApLocal">
+ <description>This Managed Object represents an SCCP Local Access Point. An SCCP AP instance is a logical point in the SCCP network at which an SCCP user can access the services provided by the SCCP and the SCCP can deliver its services to the SCCP user. The SCCP Access Point is identified by a SubSystem Number (SSN).
+
+A local SccpAp represents an access point in the own node.
+
+The performance monitoring counters found in SccpApLocal MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is a shutdown request from the CLI (Cluster Interface).</description>
+ <attribute name="SccpApLocalId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the SCCP AP. The operability of the SCCP AP is described by this attribute which has two possible values:
+
+Disabled: The SCCP AP is totally inoperable and unable to provide the service to the user.
+
+Enabled: The SCCP AP is partly or fully operable and available for use.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="ssN">
+ <description>The sub system number, SSN, of the SCCP Access Point. Note that this has to be a unique number.
+
+If the SccpAp is local then the SSN has to be unique among all other SccpAp MOs under the same SccpSp MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>2</min> <max>255</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxConn">
+ <description>The maxConn attribute specifies the max number of connections allowed for this SCCP Access Point. It is only valid for local SCCP Access Points.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>524288</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="useS1">
+ <description>Controls adding of OPC from routing label to Calling Party Address if absent.
+
+False = Do not add OPC to Calling Part Address.
+True = Add OPC to Calling Part Address.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="SccpSp">
+ <description>The Signalling Connection Control Part, SCCP, Signalling Point, SP, MO is the placeholder for all SCCP related managed objects.
+
+Startime for accounting is set by attributes accountDateFileOutput and accountTimeFileOutput.
+The attribute accountPeriodFileOutput sets period for the accounting record to be stored on the /c file system.
+The accounting is stopped by setting the accountPeriodFileOutput to zero (0).
+NOTE: The SRP function and SccpAccountingCriteria MO's should only be created for one signalling stack, i.e one PIU.
+
+Note! The guiding values that can be found for some attributes is to be regarded as a recommendation for these attributes.
+Depending on the size of the network, traffic load, use and so forth it might be neccesary to set values for these attributes outside the guiding values.</description>
+ <attribute name="SccpSpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the SCCP SP. The operability of the SCCP SP is described by this attribute which has two possible values:
+
+Disabled: The SCCP SP is totally inoperable and unable to provide the service to the user (e.g. if the processor is not usable).
+
+Enabled: The SCCP SP is partly or fully operable and available for use.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="mtp3bSpId">
+ <description>The identity of the L3 Signaling Point used by this MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="prioSST">
+ <description>This attribute sets the priority for the Subsystem Test message when issued by the SCCP itself. When a message is transferred from the SCCP the message priority uses the two spare bits in the SIO.
+Coding of the message priority:
+0 Lowest priority
+1
+2
+3 Highest priority</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>3</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="prioIT">
+ <description>This attribute sets the priority for the Inactivity Test message when issued by the SCCP itself. When a message is transferred from the SCCP the message priority uses the two spare bits in the SIO.
+Coding of the message priority:
+0 Lowest priority
+1
+2
+3 Highest priority</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>3</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="prioRLSD">
+ <description>This attribute sets the priority for the connection release message when issued by the SCCP itself. When a message is transferred from the SCCP the message priority uses the two spare bits in the SIO.
+Coding of the message priority:
+0 Lowest priority
+1
+2
+3 Highest priority</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>3</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="prioGeneral">
+ <description>This attribute sets the priority for all the other messages which are issued by the SCCP itself. When a message is transferred from the SCCP the message priority uses the two spare bits in the SIO.
+
+Coding of the message priority:
+
+0 Lowest priority
+1
+2
+3 Highest priority</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>3</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="accountDateFileOutput">
+ <description>Date for accounting file output.
+Format in ASCI-code: yyyymmdd
+yyyy = 0000-9999
+mm = 01-12
+dd = 01-31
+
+Note! This is the start date for the output.</description>
+ <dataType>
+ <string>
+ <defaultValue>"00000000"</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="accountTimeFileOutput">
+ <description>Time for accounting file output.
+Format in ASCI-code: hhmm
+hh = 00-23
+mm = 00-59</description>
+ <dataType>
+ <string>
+ <defaultValue>"0000"</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="accountPeriodFileOutput">
+ <description>Period for accounting file output.
+Format: number of half hour.
+Range = 0, 1, 2, 4, 6, 8, 12, 16, 24, 48
+
+Note! if set to 0 (zero) the output will be stopped.</description>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="upperConnThres">
+ <description>The upper connection threshold allow the user to specify the level at which the upper connection threshold notification is triggered. The thresholds must be given as a percentage of the maximum number of connection resources made available for the entire SCCP.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>80</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="lowerConnThres">
+ <description>The lower connection threshold allow the user to specify the level at which the lower connection threshold notification is triggered. The thresholds must be given as a percentage of the maximum number of connection resources made available for the entire SCCP. The value must be less then UpperConnThres.
+
+The maximum value is less or equal to the upper connection threshold</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>50</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="swapUDTPointer">
+ <description>There are two ways to construct a UDTS from a UDT, the XUDTS will be constructed in the same way. One way is to only swap the pointers to �Called Party Address� and �Calling Party Address� in a UDT message when constructing a UDTS. The other way is to swap data. How this is done in the SCCP is configurable. The coding and interpretation is as follows:
+0, swap data ��Called party Address� will be sent before �Calling party Address�
+1, swap pointers��Called party Address� will be sent after �Calling party Address�.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="hopCounterSclc">
+ <description>The SCLC hop counter is a parameter that is decremented for each performed GT translation for SCLC messages on the way to the end destination. If decrementing the counter results in the value of zero in a non-end destination node, the SCCP initiates the appropriate error procedure.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>15</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="hopCounterScoc">
+ <description>The SCOC hop counter is a parameter that is decremented for each performed GT translation for SCOC messages on the way to the end destination. If decrementing the counter results in the value of zero in no end destination node, the SCCP initiates the appropriate error procedure.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>15</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tconnEst">
+ <description>Connection establishment control timer.
+
+Unit: deciseconds (0.1 seconds).
+
+Guiding values;
+Range 600 - 1200, Default 600
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>600</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tIas">
+ <description>Send inactivity control timer.
+
+Unit: deciseconds (0.1 seconds).
+
+Guiding values;
+Range 3000-6000
+Default 3000</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>3000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tIar">
+ <description>Receive inactivity control timer.
+
+Unit: deciseconds (0.1 seconds).
+
+Guiding values;
+Range 6600-12600
+Default 6600</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>6600</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tRel">
+ <description>Connection release timer.
+
+Unit: deciseconds (0.1 seconds).
+
+Guiding values;
+Range 100-200
+Default 100</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>100</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tCong">
+ <description>Congestion timer.
+
+Unit: deciseconds (0.1 seconds).
+
+Guiding values;
+Range 10-2550
+Default 300</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>300</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tStatInfo">
+ <description>Subsystem Status Test timer.
+
+Unit: deciseconds (0.1 seconds).
+
+Guiding values;
+Range 10-2550
+Default 300</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>300</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tconnResp">
+ <description>Connection response waiting timer.
+
+Unit: deciseconds (0.1 seconds).
+
+Guiding values;
+Range 100-200
+Default 150</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>150</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tReass">
+ <description>Reassembly timer.
+
+Unit: deciseconds (0.1 seconds).
+
+Guiding values;
+Range 100-200
+Default 150</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>150</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tGuard">
+ <description>Guard timer for program restart not applicable for this CPP version. Instead a restart counter is used to improve restart performance.
+
+Unit: deciseconds (0.1 seconds).
+
+Guiding values;
+Range 13800-15000 (23-25 minutes)
+Default 1380 (23 minutes)
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>13800</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="smiValue">
+ <description>The SMI (Subsystem Multiplicity Indicator) is always ignored for incoming messages. This SCCP can however be configured to insert a specific SMI value in outgoing messages. The coding and interpretation is as follows:
+
+Coding Comment
+ 0 | Affected Subsystem multiplicity unknown.
+ 1 | Affected Subsystem is solitary.
+ 2 | Affected Subsystem is duplicated.
+ 3 | Spare.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>3</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="useSCMG">
+ <description>The use of SCMG functions.
+
+SST = SCCP Subsystem Test message.
+SSA = SCCP Subsystem Allowed message.
+SSP = SCCP Subsystem Prohibited message.
+SSC = SCCP Subsystem Congested message.
+
+The attributes contained in the struct is:
+initiateTimerTcon,
+allowRemoteBroadcast,
+useSST,
+useSSP,
+sendSSA,
+sendSST
+
+</description>
+ <dataType>
+ <structRef name="Scmg"/>
+ </dataType>
+ </attribute>
+ <attribute name="maxRelayedConn">
+ <description>Connection Oriented SCCP Signaling Relay Point (SRP-CO) and Maximum number of Relayed Connections is not used in this CPP version.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>524288</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUDTSent">
+ <description>Performance monitoring counter for number of sent UDT's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUDTRec">
+ <description>Performance monitoring counter for number of received UDT's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUDTSSent">
+ <description>Performance monitoring counter for number of sent UDTS's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUDTSRec">
+ <description>Performance monitoring counter for number of received UDTS's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfXUDTSent">
+ <description>Performance monitoring counter for number of sent XUDT's.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfXUDTRec">
+ <description>Performance management counter for number of received XUDT's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfXUDTSSent">
+ <description>Performance monitoring counter for number of sent XUDTS's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfXUDTSRec">
+ <description>Performance monitoring counter for number of received XUDTS's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCRSent">
+ <description>Performance monitoring counter for number of sent CR's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCRRec">
+ <description>Performance monitoring counter for number of received CR's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDT1Sent">
+ <description>Performance monitoring counter for number of sent DT1's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDT1Rec">
+ <description>Performance monitoring counter for number of received DT1's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfERRSent">
+ <description>Performance monitoring counter for number of sent ERR's.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfERRRec">
+ <description>Performance monitoring counter for number of received ERR's.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSubsysAllowedSent">
+ <description>Performance monitoring counter for number of sent SSA's, subsystem allowed.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCREFRecFromNL">
+ <description>Performance monitoring counter for number of CREF messages received from NL.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCREFSentToNL">
+ <description>Performance monitoring counter for number of CREF messages sent to NL.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRLSDRecFromNL">
+ <description>Performance monitoring counter for number of RLSD messages received from NL.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRLSDSentToNL">
+ <description>Performance monitoring counter for number of RLSD messages sent to NL.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfConInUseExceedHighWaterMark">
+ <description>Performance monitoring counter for number of connections in use that has exceeded the high watermark threshold.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfConInUseReceededLowWaterMark">
+ <description>Performance monitoring counter for number of connections in use that has receded the low watermark threshold.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLUDTRec">
+ <description>Performance monitoring counter for number of received LUDT messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLUDTSSent">
+ <description>Performance monitoring counter for number of sent LUDTS messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="SccpScrc">
+ <description>The Signalling Connection Control Part Routing Control (SCCP SCRC) MO holds information about the SCCP routing control.</description>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="SccpScrcId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRoutingFailure">
+ <description>Performance monitoring counter for number of routing failures.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfConnectFailure">
+ <description>Performance monitoring counter for number of connect failures.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfHopCounterViolation">
+ <description>Performance monitoring counter for number of Hop counter violations.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRoutingFailNoTransAddrOfSuchNature">
+ <description>Performance monitoring counter for number of routing failures due to no translation for Nature of Address field.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRoutingFailNoTransSpecificAddr">
+ <description>Performance monitoring counter for number of routing failures due to no translation of specific address.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRoutingFailurePointCodeUnAvail">
+ <description>Performance monitoring counter for number of routing failures due to destination point code not available.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRoutingFailNetworkCongest">
+ <description>Performance monitoring counter for number of routing failures due to network congestion.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRoutingFailSubsysUnavail">
+ <description>Performance monitoring counter for number of routing failures due to destination subsystem unavailable.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRoutingFailReasonUnknown">
+ <description>Performance monitoring counter for number of routing failures due to unknown reason.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRoutingFailUnequippedSubsys">
+ <description>Performance monitoring counter for number of routing failures due to unequipped subsystem.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Program">
+ <description>The Program MO represent the executable software on the target hardware.
+
+MOs of this type are created automatically during system upgrade.
+MOs of this type are possible to create manually but a system upgrade
+is recommended to create them.
+
+Note! Some programs are not possible to restart or can take part in an RPU. For more information please refer to the LoadModule MO.
+
+</description>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="loadModule">
+ <description>This attribute gives information about which load module the program is instantiated from.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="LoadModule"/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>This attribute shows whether the program has normal performance capability or not.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="startState">
+ <description>This attribute shows whether the program is permitted to enter operational state enabled or not after a PIU restart. The default state is disabled in order to avoid that an operating program and a new version of the same program have its startState enabled at the same time.
+
+It is used on all types of node restarts and restart of PlugInUnit with restartCause = piuRestartUpgrade.</description>
+ <dataType>
+ <enumRef name="StartState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="heapSize">
+ <description>This attribute sets the size of the program heap size.
+
+The value in the referenced LoadModule is fetched by program and used at create if no value is submitted at create of the program MO.
+
+The referenced load module has a default size defined at compile time wich is used if no value is submitted at create of loadModule or the program Mo.
+
+Note! The value of this attribute is overwritten during Software Upgrade.
+
+Note: If the program is a child to a Fan Mo this attribute is irrelevant.
+
+Note: Setting of this attribute will have no effect until the program is restarted.</description>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="poolSize">
+ <description>This attribute sets the size of the program pool size. In the referenced LoadModule there is possible to set this value at create.
+
+The value in the referenced LoadModule is fetched by program and used at create if no value is submitted at create of the program MO.
+
+The referenced load module has a default size defined at compile time wich is used if no value is submitted at create of
+LoadModule or the Program Mo.
+
+Note! The value of this attribute is overwritten during Software Upgrade.
+
+Only working for MP-Program
+
+Unit is bytes.
+
+Note: If the program is a child to a Fan Mo this attribute is irrelevant.
+
+Note: Setting of this attribute will not have any effect until the program is restarted.
+
+</description>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="restartTimer">
+ <description>This type specifies the time that a program have to execute without faults, until the restart counter is reset. The time value is interpreted as seconds.
+
+restartTimer= -1 : Forever, implies that the restart counter is only reset when the PIU is restarted.
+
+Note: If the program is a child to a Fan Mo this attribute is irrelevant.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>-1</min>
+ </range>
+ <defaultValue>60</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="restartCounterLimit">
+ <description>This attribute specifies the number of times that a program can restart, without escalation to a PIU restart. The possible values are:
+
+restartCounterLimit = -1 : Unlimited, means never restart PIU, regardless of the number of times the specific program restarts.
+
+Note: If the program is a child to a Fan Mo this attribute is irrelevant.
+
+Note! The value 3 means 3 restarts, hot, warm and finally as a last resort PIU restart.
+
+Note! The program escalates to a PIU restart when the number of restarts reaches the value set for this attribute.
+I.e. if for example the value is set to 5, escalation to PIU restart will occur at the fifth restart.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>-1</min>
+ </range>
+ <defaultValue>3</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="ProgramId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="restart">
+ <description>Request to restart the program.
+Only valid for MP programs.
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ </class>
+
+ <class name="UniSaalProfile">
+ <description>The UniSaal Profile MO represent and keeps attribute values used by one or more UNI SAAL termination point MOs.</description>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="UniSaalTp"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="profileData">
+ <description>See structure UniSaalProfileData</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="UniSaalProfileData"/>
+ </dataType>
+ </attribute>
+ <attribute name="UniSaalProfileId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="UniSaalTp">
+ <description>The MO represents an access point for a user where a UNI SAAL connection is terminated. The access point depends
+on an AAL5 connection termination located on the same processor.
+
+UniSaalTp can only terminate on a Mp processor.
+
+Note! The performance monitoring counters found in NniSaalTp MO is set to zero when the Mo and its RO is created.
+These counters are not reset unless there occurs a fault situation that demands a restart and recreation of the ROs.
+Also note that some of these counters are reset based on other conditions. For more details please refer to the
+descriptions of the performance monitoring counters in this MO.</description>
+ <attribute name="UniSaalTpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the UniSaalTp MO.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving MO.
+
+</description>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="uniSaalProfileId">
+ <description>Reference to a UniSaalProfile MO.
+
+The maxStat attribute defined in the UniSaalProfile MO is dependent on the AAL5 SDU size defined in the Aal5TpVccTp MO. See the description of the maxStat attribute in the UniSaalProfile MO.
+
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="UniSaalProfile"/>
+ </dataType>
+ </attribute>
+ <attribute name="aal5TpVccTpId">
+ <description>Reference to an Aal5TpVccTpMo.
+
+Note: The Aal5 termination point must terminate on a main processor, MP.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Aal5TpVccTp"/>
+ </dataType>
+ </attribute>
+ <attribute name="maxSduSize">
+ <description>Maximum SAAL SDU size. The attribute is dependent on the AAL5 maximum SDU size defined in the Aal5TpVccTp MO. The 'maxSduSize' may not exceed the AAL5 maximum SDU size (the lower of the two directions, fromUserMaxSduSize and toUserMaxSduSize).
+
+Example: If 'fromUserMaxSduSize' is set to 256 and 'toUserMaxSduSize' is set to 512 in the Aal5TpVccTp MO, the ' maxSduSize' in the UniSaalTp MO may not exceed 252.
+
+(i.e. maxSduSize &lt;= the aal5MaxSduSize - 4 bytes)
+
+Note! When setting the value of 'maxSduSize' the 4 bytes used by the SAAL layer for the SAAL header has to be considered.
+
+Note! The upper limit of 2044 (2048 including the SAAL header) is due to limitations on the AAL5 layer.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>128</min> <max>2044</max>
+ </range>
+ <defaultValue>128</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSentSDUs">
+ <description>Number of successfully sent SDUs.
+Counts the number of successfully sent messages to the
+application using SAAL. Reset when the link goes InService or the counter "overflows".</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfReceivedSDUs">
+ <description>Number of successfully received SDUs.
+Counts the number of successfully received messages from
+ the application using SAAL. Reset when the link goes
+ InService or the counter "overflows".</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLinkInServiceTime">
+ <description>The accumulated time (in seconds) the signalling link has
+ been in service (in assured data transfer mode) since it was created. If the link is down the value 0 is returned.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAllSLFailures">
+ <description>Number of all Signalling Link failures.
+Is a total sum of the error counters:
+ - Number of protocol errors
+ - Number of unsuccessfully retransmissions
+ - Number of NoResponses
+ - Number of other errors</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfNoResponses">
+ <description>Number of no response. This counter is increased when SSCOP (Service Specific Connection Oriented Protocol)
+send an MaaError with error code P.
+For details refer to ITU-T Q.2110 - B-ISDN AATM Adaptation Layer - Service Specific Connection Oriented Protocol (SSCOP); (7/94).
+Counts the number of no responses detected the last 30 minutes.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLocalCongestions">
+ <description>Number of local congestions.
+This counter is increased when the sum of SAAL send and retransmission buffers are filled to more than 90%.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRemoteCongestions">
+ <description>Number of remote congestions.
+This counter is increased when the remote side gives SAAL no credit. Reset when the link goes InService or the counter "overflows".</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSequenceDataLosses">
+ <description>Number of sequences data loss.
+Counts the number of SD loss detected the last 30 minutes</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfProtocolErrors">
+ <description>Number of unsolicited or inappropriate PDUs. This counter is increased when SSCOP (Service Specific Connection Oriented Protocol)
+send an MaaError with error code Q.
+For details refer to ITU-T Q.2110 - B-ISDN AATM Adaptation Layer - Service Specific Connection Oriented Protocol (SSCOP); (7/94).
+Counts the number of protocol errors detected the last 30 minutes.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccReTransmissions">
+ <description>Number of unsuccessful retransmissions.
+Counts the number of unsuccessfully retransmissions detected the last 30 minutes.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfOtherErrors">
+ <description>Number of other list element errors. This counter is increased when SSCOP (Service Specific Connection Oriented Protocol)
+send an MaaError with error code Q-U.
+For details refer to ITU-T Q.2110 - B-ISDN AATM Adaptation Layer - Service Specific Connection Oriented Protocol (SSCOP); (7/94).
+Counts the number of other errors detected the last 30 minutes. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="E1PhysPathTerm">
+ <description>This MO represents an E1 (i.e. 2 Mbit/s) physical interface in the node. The E1PhysPathTerm MO does not define which type of traffic (TDM or ATM) that the interface should support.
+Please refer to the Ds0Bundle, AtmPort, IMALink and IMAGroup objects for details about configuration of traffic type.
+
+Note! The performance monitoring counters in the E1PhysPathTerm MO is set to 0 (zero) at start or restart of the node.
+When the value is to large too fit in to a long (31bit) the counter turns over and starts from 0 again.
+</description>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>enabled or disabled according to the actual operational state of the Physical Line Termination. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="lineNo">
+ <description>The actual Line number on the board.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>8</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedByTraffic">
+ <description>The identity of the reserving AtmPort MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="AtmPort"/>
+ </dataType>
+ </attribute>
+ <attribute name="loopback">
+ <description>This attribute describes the current Loopback State of this physical path termination.
+
+Note! administrativeStatus must be set to locked when setting loopback attribute.</description>
+ <dataType>
+ <enumRef name="LoopbackState">
+ <defaultValue>none</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmEs">
+ <description>Performance Monitoring counter for ES, Errored Seconds.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSes">
+ <description>Performance Monitoring counter for Severely Errored Seconds, SES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="E1PhysPathTermId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="crc4Mode">
+ <description>Indicates what Cyclical Redundancy Check 4 Mode that is being used.</description>
+ <dataType>
+ <enumRef name="Crc4Mode">
+ <defaultValue>AUTOMATIC</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="idlePattern">
+ <description>The idle pattern.
+
+NOTE: Going from A_LAW or U_LAW to UNDEFINED is always allowed but setting up one ET board with
+both U_LAW and A_LAW is not allowed.
+E.g. If you want to change from A_LAW to U_LAW on one ET board you have to change idlePattern
+on each physical port belonging to the board to UNDEFINED first.
+A_LAW -&gt; UNDEFINED -&gt; U_LAW or U_LAW -&gt; UNDEFINED -&gt; A_LAW</description>
+ <dataType>
+ <enumRef name="IdlePattern">
+ <defaultValue>UNDEFINED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="degDegThr">
+ <description>The threshold decides how many of the received blocks that are allowed to have bit errors. The measurement is made on a per-second basis and if the threshold is passed the second is considered bad.
+
+This is a percentage value.
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="degDegM">
+ <description>How many bad seconds in a row that causes a Degraded Signal alarm.
+
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>2</min> <max>10</max>
+ </range>
+ <defaultValue>7</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="rdiReporting">
+ <description>Indicates whether Remote Defect Indication, RDI, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="aisReporting">
+ <description>Indicates whether Alarm Indication Signal, AIS, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="shutDownTimeout">
+ <description>The shut-down timer. It is used when the administrativeState is set to shutdown.
+
+Value in seconds, must be a positive value.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100000</max>
+ </range>
+ <defaultValue>1800</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBySync">
+ <description>The identity of the reserving Synchronization MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Synchronization"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedByImaLink">
+ <description>The identity of the reserving ImaLink MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ImaLink"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="J1PhysPathTerm">
+ <description>This MO represents an J1 (i.e. 1.5 Mbit/s) physical interface in the node. The J1PhysPathTerm MO does not define which type of traffic (TDM or ATM) that the interface should support.
+Please refer to the Ds0Bundle, AtmPort, IMALink and IMAGroup objects for details about configuration of traffic type.
+
+The performance monitoring counters in the J1PhysPathTerm MO is set to 0 (zero) at start or restart of the node.
+When the value is to large too fit in to a long (31bit) the counter turns over and starts from 0 again.
+</description>
+ <attribute name="J1PhysPathTermId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="lineNo">
+ <description>The actual Line number on the board.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>8</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>enabled or disabled according to the actual operational state of the Physical Line Termination. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="physicalLineType">
+ <description>Supported interfaces is defined in J1Types</description>
+ <dataType>
+ <enumRef name="J1Type">
+ <defaultValue>j1_G</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedByTraffic">
+ <description>The identity of the reserving AtmPort MO.
+
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="AtmPort"/>
+ </dataType>
+ </attribute>
+ <attribute name="degThreshold">
+ <description>Maximum allowed BER(Bit Error Rate). Degraded signal (DEG) if BER &gt; degThreshold. The attribute gives a maximum BER of 10e-X, where X ranges from 5 to 9 (default 6)
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>3</min> <max>9</max>
+ </range>
+ <defaultValue>6</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="loopback">
+ <description>Possible values
+
+none - This is the normal state, no loop back is performed (and ordinary traffic is running).
+
+line - The physical path is looped on the line side, the external incoming path is looped back to the external outgoing path.
+
+system - The physical path is looped on the system side, the (node-) internal incoming path is looped back to the internal outgoing path.
+
+Note! administrativeStatus must be set to locked when setting loopback attribute.</description>
+ <dataType>
+ <enumRef name="LoopbackState">
+ <defaultValue>none</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmEs">
+ <description>Performance monitoring counter for Errored Seconds, ES.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSes">
+ <description>Performance monitoring counter for Severly Errored Seconds, SES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="idlePattern">
+ <description>The idle pattern.
+
+NOTE: Going from A_LAW or U_LAW to UNDEFINED is always allowed but setting up one ET board with
+both U_LAW and A_LAW is not allowed.
+E.g. If you want to change from A_LAW to U_LAW on one ET board you have to change idlePattern
+on each physical port belonging to the board to UNDEFINED first.
+A_LAW -&gt; UNDEFINED -&gt; U_LAW or U_LAW -&gt; UNDEFINED -&gt; A_LAW</description>
+ <dataType>
+ <enumRef name="IdlePattern">
+ <defaultValue>UNDEFINED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="rdiReporting">
+ <description>Indicates whether Remote Defect Indication, RDI, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="aisReporting">
+ <description>Indicates whether Alarm Indication Signal, AIS, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="shutDownTimeout">
+ <description>The shut-down timer. It is used when the administrativeState is set to shutdown.
+
+Value in seconds, must be a positive value.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100000</max>
+ </range>
+ <defaultValue>1800</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBySync">
+ <description>The identity of the reserving Synchronization MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Synchronization"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedByImaLink">
+ <description>The identity of the reserving ImaLink MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ImaLink"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Aal0TpVccTp">
+ <description>This MO is used to represent the point in the node where an AAL0 connection is terminated. At this point the user exchange SDUs with its peer at the remote end of the AAL0 connection.
+
+Note! The performance monitoring counters in this MO is set to 0 when counterMode is set to PM_MODE_ON.
+In PM_MODE_OFF no information at all is retrived. So any value for pm-monitoring is measured from the time
+of setting counterMode to PM_MODE_ON.
+At node restart these performance monitoring counters is reset to 0.
+
+</description>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="processorId">
+ <description>This attribute specifies on what processor the termination point resides. It could either be a board processor or main processor (MO type PlugInUnit), or a SP processor (MO type Spm).</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational State reflects the operational state of the end points and the belonging node connections.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving MO.
+</description>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="vclTpId">
+ <description>The virtual channel to which this MO is termination.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="VclTp"/>
+ </dataType>
+ </attribute>
+ <attribute name="Aal0TpVccTpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="continuityCheck">
+ <description>Continuitiy checking means that a cell is sent downstream when no user cell has been sent for a period of nominally 1 second.
+
+Activates VC end to end continuityCheck according to ITU.T rec I.610.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="nomPmBlkSize">
+ <description>Nominal performance monitoring (PM) blocksize. The minimum number of ATM cells to send before sending a Forward Performance Monitoring, FPM, cell.</description>
+ <dataType>
+ <enumRef name="AtmNomPmBlkSize">
+ <defaultValue>NOM_PM_BLKSIZE_2_10</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="counterMode">
+ <description>PM mode is set to indicate type of performance monitoring mode (i.e. activation of bidirectional PM measurements).
+
+</description>
+ <dataType>
+ <enumRef name="AtmCounterMode">
+ <defaultValue>PM_MODE_OFF</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwLostCells">
+ <description>Performance monitoring counter for forwarded lost cells.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwMissinsCells">
+ <description>Performance monitoring counter for number of forwarded missinserted cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwErrBlocks">
+ <description>Performance monitoring counter for number of forwarded errored blocks.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLostFpmCells">
+ <description>Performance monitoring counter for number of lost Forward Performance Monitoring, FPM cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwLostCells">
+ <description>Performance monitoring counter for number of lost backward cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwMissinsCells">
+ <description>Performance monitoring counter for number of backward missinserted cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwErrBlocks">
+ <description>Performance monitoring counter for number of backward errored blocks.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLostBrCells">
+ <description>Performance monitoring counter for number of lost Backward Reporting, BR, cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="alarmReport">
+ <description>Attribute to decide what type of alarms to be reported.</description>
+ <dataType>
+ <enumRef name="AlarmReport">
+ <defaultValue>ALARM_LOC</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Aal5TpVccTp">
+ <description>This MO is used to represent the point in the node where an AAL5 connection is terminated. At this point the user exchanges SDUs with its peer at the remote end of the AAL5 connection.
+
+Note! The 'mtuSize' on the IpAtmLink MO does not include 8 bytes required for the LLC/SNAP header and this should be taken into consideration when setting the SduSize on the Aal5TpVccTp MO.
+
+Note! The performance monitoring counters in this MO is set to 0 when counterMode is set to PM_MODE_ON.
+In PM_MODE_OFF no information at all is retrived. So any value for pm-monitoring is measured from the time
+of setting counterMode to PM_MODE_ON.
+At node restart these performance monitoring counters is reset to 0..</description>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="processorId">
+ <description>This attribute specifies on what processor the protocol is terminated. It could either be a board processor or main processor (PlugInUnit) or a SP processor (Spm).</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="vclTpId">
+ <description>The virtual channel to which this MO is termination.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="VclTp"/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational State reflects the operational state of the end points and the belonging node connections.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="fromUserMaxSduSize">
+ <description>The maximum SDU size in number of octets received from the user (called maxIngressSduSize in the FRO domain).
+
+The allowed range is dependent on the processorType.
+SP: LowestMaxSduSize =1, HighestMaxSduSize=1600
+BP: LowestMaxSduSize =1, HighestMaxSduSize=1600
+MP:LowestMaxSduSize =1, HighestMaxSduSize=2048</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>2048</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="toUserMaxSduSize">
+ <description>The maximum SDU size in number of octets sent to the user (called maxEgressSduSize in the FRO domain). This attribute is controlled by the processor type.
+
+The allowed range is dependent on the processorType.
+SP: LowestMaxSduSize =1, HighestMaxSduSize=1600
+BP: LowestMaxSduSize =1, HighestMaxSduSize=1600
+MP:LowestMaxSduSize =1, HighestMaxSduSize=2048</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>2048</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The attribute is set by the action reserve from a user of Aal5TpVccTp. It could either be a Cello user like IpAtmLink/UniSaalTp or a node application.
+
+</description>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="Aal5TpVccTpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="alarmReport">
+ <description>Attribute to decide what type of alarms to be reported.</description>
+ <dataType>
+ <enumRef name="AlarmReport">
+ <defaultValue>ALARM_LOC</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="continuityCheck">
+ <description>Continuitiy checking means that a cell is sent downstream when no user cell has been sent for a period of nominally 1 second. Continuity check both enables generation of CC cells as well as detection of LOC
+</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="nomPmBlkSize">
+ <description>Nominal performance monitoring (PM) blocksize. The minimum number of ATM cells to send before sending a Forward Performance Monitoring, FPM, cell.
+</description>
+ <dataType>
+ <enumRef name="AtmNomPmBlkSize">
+ <defaultValue>NOM_PM_BLKSIZE_2_10</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="counterMode">
+ <description>PM mode is set to indicate type of performance monitoring mode (i.e. activation of bidirectional PM measurements).
+
+</description>
+ <dataType>
+ <enumRef name="AtmCounterMode">
+ <defaultValue>PM_MODE_OFF</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwLostCells">
+ <description>Performance monitoring counter for number of lost forward cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwMissinsCells">
+ <description>Performance monitoring counter for number of forward missinserted cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwErrBlocks">
+ <description>Performance monitoring counter for number of forward errored blocks.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLostFpmCells">
+ <description>Performance monitoring counter for number of lost Forward Performance Monitoring, FPM, cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwLostCells">
+ <description>Performance monitoring counter for number of lost backward cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwMissinsCells">
+ <description>Performance monitoring counter for number of backward missinserted cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwErrBlocks">
+ <description>Performance monitoring counter for number of backward errored blocks.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLostBrCells">
+ <description>Performance monitoring counter for number of lost Backward Reporting, BR, cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="AtmPort">
+ <description>The AtmPort MO is used to configure a physical port for ATM traffic.
+ATM can be transported accross the physical layer in three distinct and different ways:
+
+- Normal mode
+
+An AtmPort MO is created with a reference to physical layer object (any of E1PhysPathTerm,
+J1PhysPathTerm, T1PhysPathTerm, E3PhysPathTerm, T3PhysPathTerm, Sts3CspeTtp, E1Ttp, T1Ttp or Vc4Ttp).
+The payload of that physical layer object is used to transport the ATM traffic.
+
+- Fractional ATM mode
+
+An AtmPort MO is created with a reference to a Ds0Bundle object. The Ds0Bundle specifies
+in this case the timeslots on the physical layer (any of E1PhysPathTerm,J1PhysPathTerm,
+T1PhysPathTerm, T1Ttp or E1Ttp) that should be used for ATM traffic. The remaining timeslots
+are not used at all.
+I.e. when fractional ATM is used only one Ds0Bundle can exist as a child to a physical port MO.
+
+- IMA mode
+
+In IMA mode, a number of physical ports are grouped together to form one "virtual" physical
+ATM pipe. In this mode the AtmPort MO is created with a reference to an IMAGroup MO.
+Please refer to the ImaGroup MO for further details.
+
+Note! The performance monitoring counters in the AtmPort MO is set to 0 (zero) at start or restart of the node.
+When the value is to large too fit in to a long (31bit) the counter turns over and starts from 0 again..
+
+
+</description>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="AtmPortId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the ATM port.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status of the AtmPort.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmTransmittedAtmCells">
+ <description>Performance monitoring counter for number of transmitted ATM cells through the ATM port. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmReceivedAtmCells">
+ <description>Performance monitoring counter for number of received ATM cells through the ATM port.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="valueOfLastCellWithUnexp">
+ <description>This attribute returns the ATM header, (vpi, vci, pti), of the last received unexpected cell.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <structRef name="ValueOfUnex"/>
+ </dataType>
+ </attribute>
+ <attribute name="uses">
+ <description>Reference to the physical port, IMA Group or Ds0Bundle used by the ATM port.
+
+The possible MOs are:
+E1PhysPathTerm, J1PhysPathTerm, T1PhysPathTerm, E3PhysPathTerm, T3PhysPathTerm, Sts3CspeTtp, Sts1SpeTtp, Vc4Ttp, E1Ttp, T1Ttp, Ds0Bundle and ImaGroup.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="pmSecondsWithUnexp">
+ <description>Performance monitoring counter for errored seconds with discarded cells due to protocol errors (unexpected, UNEX, events).
+
+I.610: With protcol errors is meant the reception of cells with either a non-standardized or a non-currently allocated header value.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="hecCorrectionMode">
+ <description>Header Error Correction.
+
+This attribute specifies if the AtmPort should detect and correct single bit errors or detect multiple bit errors in the ATM header.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mtp3bAp">
+ <description>This MO represents an MTP3b Access Point (in a remote node). An MTP3b AP is a logical point in the MTP network at which an
+MTP3b user can access the services provided by MTP3b and the MTP3b can deliver its services to the MTP3b user.
+
+The performance monitoring counters found in Mtp3Ap MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is shutdown request from CLI (Cluster Interface).
+
+</description>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="routeSetId">
+ <description>The routeSetId attribute points out the MTP3b Signalling Route Set (SRS) to which the Mtp3bAp MO is connected. </description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Mtp3bSrs"/>
+ </dataType>
+ </attribute>
+ <attribute name="serviceInd">
+ <description>The serviceInd attribute (Service Indicator, SI) is used by traffic handling functions to perform message distribution.
+Only SI=3 for SCCP usage and SI=12 for Q.2630.1 usage and SI=14 for GCP (H.248) usage have any meaning in this case.
+
+Full range of values for attribute SI:
+0 = Signalling network management messages
+1 = Signalling network testing &amp; maintenance regular messages
+2 = Signalling network testing &amp; maintenance special messages*
+3 = SCCP
+4 = Telephone User Part (TUP)
+5 = ISDN User Part (ISUP)
+6 = Data User Part, call and circuit related messages
+7 = Data User Part, facility registration and cancellation messages
+8 = MTP Testing User Part
+9 = Broadband ISDN User Part
+10 = Satellite ISDN User Part
+11 = Spare
+12 = Q.2630.1
+13 = Spare
+14 = H.248
+15 = Spare
+
+Note! The serviceIndicator has to be unique for each Mtp3bAp witin the same Mtp3bSrs.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>15</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operationalState attribute determines the operational status of the MTP3b AP .
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="Mtp3bApId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUserPartUnavailRec">
+ <description>A performance management counter for number of received User Part Unavailable messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAdjacentSPNotAccessible">
+ <description>Performance management counter for number of Adjacent SP's that are not accessible via direct links.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="NniSaalProfile">
+ <description>The NniSaal Profile MO represents and keeps attribute values used by one or more NNI SAAL termination point MOs.</description>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of NniSaalTp�s that have reserved this NniSaalProfile.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="NniSaalTp"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="profileData">
+ <description>See structure NniSaalProfileData.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="NniSaalProfileData"/>
+ </dataType>
+ </attribute>
+ <attribute name="NniSaalProfileId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="NniSaalTp">
+ <description>The MO represents an access point for a user where a NNI SAAL connection is terminated. The access point depends
+on an AAL5 connection termination located on the same processor.
+
+NniSaalTp can only terminate on a Mp processor.
+
+Note! The performance monitoring counters found in NniSaalTp MO is set to zero when the Mo and its RO is created.
+These counters are not reset unless there occurs a fault situation that demands a restart and recreation of the ROs.
+Also note that some of these counters are reset based on other conditions. For more details please refer to the
+descriptions of the performance monitoring counters in this MO.</description>
+ <attribute name="NniSaalTpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the NniSaalTp MO.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="nniSaalProfileId">
+ <description>Reference to a NniSaalProfile MO.
+
+The maxStat attribute defined in the NniSaalProfile MO is controlled by the AAL5 SDU size defined in the Aal5TpVccTp MO. See the description of the maxStat attribute in the NniSaalProfile MO.
+
+Note! The consistency check of the attributes in the two MOs mentioned above could not be performed until the NniSaalTp MO was created since there is no direct relation between the objects. It is therefore the responsibility of NniSaalTp to verify the consistency.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="NniSaalProfile"/>
+ </dataType>
+ </attribute>
+ <attribute name="aal5TpVccTpId">
+ <description>Reference to a Aal5TpVccTp MO.
+
+Note: The Aal5 termination point must terminate on a main processor, MP.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Aal5TpVccTp"/>
+ </dataType>
+ </attribute>
+ <attribute name="maxSduSize">
+ <description>Maximum SAAL SDU size. The attribute is dependent on the AAL5 maximum SDU size defined in the Aal5TpVccTp MO. The 'maxSduSize' may not exceed the AAL5 maximum SDU size (the lower of the two directions, fromUserMaxSduSize and toUserMaxSduSize).
+
+Example: If 'fromUserMaxSduSize' is set to 256 and 'toUserMaxSduSize' is set to 512 in the Aal5TpVccTp MO, the ' maxSduSize' in the NniSaalTp MO may not exceed 252.
+
+(i.e. maxSduSize &lt;= the aal5MaxSduSize - 4 bytes)
+
+Note! When setting the value of 'maxSduSize' the 4 bytes used by the SAAL layer for the SAAL header has to be considered.
+
+Note! The upper limit of 2044 (2048 including the SAAL header) is due to limitations on the AAL5 layer.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>128</min> <max>2044</max>
+ </range>
+ <defaultValue>128</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSentSDUs">
+ <description>Number of successfully sent SDUs.
+Counts the number of successfully sent messages to the
+application using SAAL. Reset when the link goes InService or the counter "overflows".</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfReceivedSDUs">
+ <description>Number of successfully received SDUs.
+Counts the number of successfully received messages from
+ the application using SAAL. Reset when the link goes
+ InService or the counter "overflows".</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLinkInServiceTime">
+ <description>The accumulated time (in seconds) the signalling link has
+ been in service (in assured data transfer mode) since it was created. If the link is down the value 0 is returned.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAllSLFailures">
+ <description>Number of all Signalling Link failures.
+Is a total sum of the error counters:
+ - Number of protocol errors
+ - Number of unsuccessfully retransmissions
+ - Number of NoResponses
+ - Number of other errors</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfNoResponses">
+ <description>Number of no response.
+Counts the number of no responses detected the last 30 minutes.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLocalCongestions">
+ <description>Number of local congestions.
+This counter is increased when the sum of SAAL send and retransmission buffers are filled to more than the congestionOnSet attribute is configured to..</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRemoteCongestions">
+ <description>Number of remote congestions.
+This counter is increased when the remote side gives SAAL no credit. Reset when the link goes InService or the counter "overflows".</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAlignmentFailures">
+ <description>Number of alignment or proving failures. This counter is
+increased when "alignment not successful".
+The counter is reset when the link is created or the counter "overflows".</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSequenceDataLosses">
+ <description>Number of sequences data loss.
+Counts the number of SD loss detected the last 30 minutes</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfProtocolErrors">
+ <description>Number of unsolicited or inappropriate PDUs.
+Counts the number of protocol errors detected the last 30 minutes.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccReTransmissions">
+ <description>Number of unsuccessful retransmissions.
+Counts the number of unsuccessfully retransmissions detected the last 30 minutes.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfOtherErrors">
+ <description>Number of other list element errors.
+Counts the number of other errors detected the last 30 minutes. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="AtmTrafficDescriptor">
+ <description>This MO specifies traffic and QoS parameters for virtual channel connections.
+
+The attributes can only be set in certain combinations:
+
+CBR:
+ingressAtmQos /egressAtmQos:
+1, 2
+
+ingressAtmPcr /egressAtmPcr:
+mandatory (must be specified)
+
+ingressAtmMcr /egressAtmMcr:
+optional (not used, any value submitted will be ignored)
+
+UBR+:
+ingressAtmQos /egressAtmQos:
+3
+
+ingressAtmPcr /egressAtmPcr:
+optional (if shaping is used the desired rate is specified, 0 means no shaping)
+
+ingressAtmMcr /egressAtmMcr:
+mandatory (must be specified)
+
+UBR:
+ingressAtmQos /egressAtmQos:
+4
+
+ingressAtmPcr /egressAtmPcr:
+optional (not used, any value submitted will be ignored)
+
+ingressAtmMcr /egressAtmMcr:
+optional (not used, any value submitted will be ignored)
+
+Note that the VP sub layer only supports ServiceCategory = CBR and QoS = 1.
+
+Note! The performance monitoring counters in the AtmTrafficDescriptor MO is set to 0 (zero) at start or restart of the node.
+When the value is to large too fit in to a long (31bit) the counter turns over and starts from 0 again.
+</description>
+ <attribute name="AtmTrafficDescriptorId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>This MO's user label.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ingressAtmPcr">
+ <description>Ingress ATM Peak cell rate (cells/s).
+
+Only positive values are allowed. This attribute is only mandatory when serviceCategory is CBR or UBR_PLUS.
+
+Note! When 'serviceCategory' is set to UBR this attribute has no relevance and the value submitted is ignored by the system.
+
+Note! When 'serviceCategory' is set to UBR+ the value 0 (zero) means that shaping is not used. A value larger than the minimum desired cell rate enables shaping to the rate specified.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="ingressAtmQos">
+ <description>Ingress ATM quality of service.
+
+This attribute can be set to Class 1 and 2 if attribute serviceCategory is set to CBR.
+
+This attribute can be set to Class 3 if attribute serviceCategory is set to UBR+.
+
+This attribute can be set to Class 4 if attribute serviceCategory is set to UBR.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="AtmQos">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="egressAtmPcr">
+ <description>Egress ATM Peak cell rate (cells/s).
+
+Only positive values allowed.
+
+This attribute is only mandatory when serviceCategory is CBR or UBR_PLUS.
+
+Note! When 'serviceCategory' is set to UBR this attribute has no relevance and the value submitted is ignored by the system.
+
+Note! When 'serviceCategory' is set to UBR+ the value 0 (zero) means that shaping is not used. A value larger than the minimum desired cell rate enables shaping to the rate specified.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="egressAtmQos">
+ <description>Egress ATM quality of service.
+
+This attribute can be set to Class 1 and 2 if attribute serviceCategory is set to CBR.
+
+This attribute can be set to Class 3 if attribute serviceCategory is set to UBR+.
+
+This attribute can be set to Class 4 if attribute serviceCategory is set to UBR.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="AtmQos">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Sequence of Users that are using this AtmTrafficDescriptor.
+
+
+</description>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="egressAtmMcr">
+ <description>Egress ATM minimum desired cell rate.
+
+Only positive values allowed. The attribute is only mandatory when serviceCategory is UBR+.
+
+Note! When 'serviceCategory' is set to CBR or UBR this attribute has no relevance and the value submitted is ignored by the system.
+
+Note! This attribute cannot have a value larger than for 'egressAtmPcr'.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="ingressAtmMcr">
+ <description>Ingress minimum desired cell rate (cells/s).
+
+Only positive vaues allowed. This attribute is mandatory only when serviceCategory is UBR+.
+
+Note! When 'serviceCategory' is set to CBR or UBR this attribute has no relevance and the value submitted is ignored by the system.
+
+Note! This attribute cannot have a value larger than for 'ingressAtmPcr'.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="serviceCategory">
+ <description>The service category.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="ServiceCategory">
+ </enumRef>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mtp3bSrs">
+ <description>This MO represents/models a MTP3b Signalling Route Set.
+
+The performance monitoring counters found in Mtp3Srs MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is shutdown request from CLI (Cluster Interface).</description>
+ <attribute name="Mtp3bSrsId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the Mtp3bSrs MO.
+
+There are two possible states for the operationalState attribute:
+
+- enabled, the MO is partly or fully operational.
+- disabled, the MO is not operational.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The attribute is set by the local action Reserve.
+
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="autoReroute">
+ <description>This flag indicates Whether automatic rerouting is performed(true) or not(false), between IP and ATM/TDM
+routes when configuration is made. If set to 'false', it has to be done manually, for ex. by management actions(orders).
+
+Note! The attribute 'autoReroute' will always be set to 'false' regardless of value submitted. This attribute is to be removed in coming releases.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <boolean/>
+ </dataType>
+ </attribute>
+ <attribute name="destPointCode">
+ <description>The destPointCode attribute (destination point code, DPC) represents the point code of this Mtp3b SRS MO.
+The Destination Point Code in a Route Set has to be unique within each Signaling Point.
+
+Note! The format of destPointCode must correspond to the signallingPointCode format in the Mtp3bSp, i.e. ITU, ANSI, TTC or China.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>16777215</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="congestedLevel">
+ <description>There are two possible states for the congestedLevel attribute:
+
+- notCongested, no change in congestion level.
+- congested, change in congestion level has occurred.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bCongestLevel">
+ <defaultValue>notCongested</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDiscardedMsgFromBroadToNarrow">
+ <description>Performance management counter for number of messages discarded from broadband to narrowband.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTransferControlledRec">
+ <description>Performance monitoring counter for number of received Transfer Control (TFC) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTransferProhibitedRec">
+ <description>Performance monitoring counter for number of received Transfer Prohibited (TFP) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTransferAllowedRec">
+ <description>Performance monitoring counter for number of received Transfer Allowed (TFA) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <action name="routeSetTestAnyRoute">
+ <description>The route set test is only available for the Japanese Mtp3b, TTC.
+
+See JT-Q.707 for details.
+
+The test selects a route in the route set and tests it.
+
+Possible return codes are:
+
+0 : successful test
+48 : unsuccessful test
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <long/>
+ </returnType>
+ </action>
+ <action name="routeSetTestSpecificRoute">
+ <description>The route set test is only available for the Japanese Mtp3b, TTC.
+
+See JT-Q.707 for details.
+
+The test tests the specified route.
+
+Possible return codes are:
+
+0 : successful test
+48 : unsuccessful test
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <long/>
+ </returnType>
+ <parameter name="routeId">
+ <in/>
+ <dataType>
+ <moRef name="Mtp3bSr"/>
+ </dataType>
+ </parameter>
+ </action>
+ </class>
+
+ <class name="PlugInUnit">
+ <description>This MO is used to represent a plug-in-unit, that is a board inserted in a slot in a subrack.
+
+Note! Before deleting the PlugInUnit MO, administrativeState must be set to locked.</description>
+ <attribute name="PlugInUnitId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>A free tag that a user can associated to the this managed object. The value has no relevance for the managed system.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state of the PlugInUnit.
+
+The possibility to rollback the setting of this attribute is limited.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state is set to 'enabled' when the plug-in-unit has loaded and started its 'Basic' load module.</description>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="productType">
+ <description>This attribute describes the product type and is always set to the value "HW".</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>"HW"</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="piuType">
+ <description>A reference to an available PiuType at create of a PIU.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="PiuType"/>
+ </dataType>
+ </attribute>
+ <attribute name="piuGroupNumber">
+ <description>Indicates which restart group the plug-in unit belongs to.
+Such a group consists of a number of plug-in units where at least one must be enabled (working) or performing recovery. When all plug-in units in a group are out of function, the node is restarted.
+
+Must have a positive value.
+
+Zero indicates no group.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>65536</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled. It is a bit mapped CORBA long, where one or more of the bits may be set. If none of the bits are set then the availability status is considered to be undefined.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of managed objects depending on PlugInUnit</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="pmProcessorLoad">
+ <description>The measurement is done over 100 ms, and returns the sum of load on processes up to, and including process priority 23. The sum is expressed in %
+
+Supported on MP, BP and SP boards.
+
+In case of SP boards the returned processor load is the load of the BP.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="allowedSeqRestarts">
+ <description>The number of automatic (do not require intervention from a human operator) sequential restarts that are allowed for a PIU. When this number of automatic restarts has been exceeded, the automatic restarting halts and the PIU is faulty marked.
+
+The time limit between two restarts is 5 minutes. This means that if the time between two restarts
+is less then 5 minutes the restarts are counted, otherwise the restart counter is reset.
+
+For example, 3 means 3 restarts with time limit &lt; 5 minutes are accepted but when the 4:th occurs within 5 minutes the board is considered faulty and an alarm is generated.</description>
+ <dataType>
+ <enumRef name="SeqRestarts">
+ <defaultValue>RESTARTS_WITH_WARM</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <action name="restart">
+ <description>
+Note! The restartCause can have the following values:
+1 = restart error
+2 = restart upgrade
+
+Note! The restartCause piuRestartUpgrade overrides the restartRank value and gives mainly restartRank=warm (or restartRank=refresh in some upgrade situations.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="restartRank">
+ <in/>
+ <dataType>
+ <enumRef name="RestartRank">
+ </enumRef>
+ </dataType>
+ </parameter>
+ <parameter name="restartCause">
+ <in/>
+ <dataType>
+ <enumRef name="RestartCause">
+ </enumRef>
+ </dataType>
+ </parameter>
+ <raisesException name="ValueOutOfRangeException"/>
+ <raisesException name="FroNotAccessibleException"/>
+ </action>
+ </class>
+
+ <class name="Mtp3bSls">
+ <description>This MO represents the SS7 Signalling Link Set as defined in Recommendation Q.704 Ver. 3, April 28 1992 (ITU) T1.111-1996 (ANSI), JT-Q.704 Ver. 3, April 28 1992 (TTC) or GF001-9001 1990 (China).
+
+It provides information about a set of signalling links between an OPC/Adjacent PC pair. A link set is constructed from between 1 to16 Signalling Links (for China, Itu, Ttc and the ANSI standard), all of which have the same two end points (signalling points) as the Signalling Link Set. A Signalling LInk Set may be part of many routes.</description>
+ <attribute name="Mtp3bSlsId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Use label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the MTP3B SLS.
+
+The operability of the MTP3B SLS is described by the operationalState attribute which has two possible values:
+
+- Enabled: The MTP3B SLS is partly or fully operable and available for use. At least one of the belonging links (SL) is enabled.
+- Disabled: The MTP3B SLS is totally inoperable and unable to provide service to the user.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="usageState">
+ <description>The usageState reflects the usage state of the links in the link set. There are three possible values:
+
+- Active: At least one of the belonging SLs of the SLS is Active and no link is Busy.
+- Busy: If one of the belonging links is Busy.
+- Idle: All SLs of the SLS are Unavailable.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bUsageState">
+ <defaultValue>IDLE</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="periodicLinkTestFlag">
+ <description>The periodicLinkTestFlag indicates if periodic sending of SLTM/SLTA messages are used or not. The SLTM message will be sent on every link which is "aligned" at an interval of (SLTM timer). The answer, SLTA is supposed to arrive within (SLTA timer). If this doesn�t happen, or if the received SLTA doesn�t match the sent SLTM a second SLTM will be sent. If this SLTM also fail then the link will be considered 'out-of-service' and a restart of that link will begin.
+
+ANSI: true is default.
+ITU: true is default.
+China: true is default.
+TTC: false is default.
+
+Note that TTC does not use this feature.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="mtp3bSrsId">
+ <description>The mtp3bSrsId attribute points out the corresponding MTP3b Signalling Route Set MO (adjacentDPC).</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Mtp3bSrs"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="Mtp3bSr"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <action name="deactivateLinkSet">
+ <description>This action deactivates a link set, which means the containing signalling links are taken out of service.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ <raisesException name="FroNotAccessibleException"/>
+ </action>
+ <action name="activateLinkSet">
+ <description>A linkset containing signalling links which are all out of service, is called a deactivated linkset. In order to start up the signalling links and get them into service, there is an Activate Link Set action, or rather, there are two similar actions for activation of a link set.
+
+If the action fails to activate a link the ActivationFailed exception is raised.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ <raisesException name="FroNotAccessibleException"/>
+ </action>
+ <action name="emergencyActivateLinkSet">
+ <description>This action activates the signalling link with emergency alignment.
+It will also set autoStartLink = true
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ <raisesException name="FroNotAccessibleException"/>
+ </action>
+ </class>
+
+ <class name="Mtp3bSr">
+ <description>This MO represents a MTP3b Signalling Route. A Signalling Route is used to convey MTP3b User messages from a origin SP to a destination SP (Signalling Point). This MO is multiple instansiated and is contained in the MO MTP3b Signalling Route Set. A Signalling Route is from a network point of view the sequence of link sets from a originating signalling point to a destination signalling point.
+
+Note! At least one signalling route in the signalling route set must have priority = 1.
+If lower priorities are defined the next level must be priority=2. (e.g. routes with priority =1 and =3 in a route set will not work).
+
+Note! Signalling Routes belonging to the same route set with the same priority must have the same type of bearer (Broad Band or Narrow Band).</description>
+ <attribute name="Mtp3bSrId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="linkSetM3uId">
+ <description>The MTP3b Signalling Link Set (MTP3bSls) or M3uAssociation to which the MTP3bSr MO is connected.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Operational state notification.There are two possible states for the operationalState attribute:
+- enabled, possible to perform operations on the MTP3b SR.
+- disabled, not possible to perform operations on the MTP3b SR.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="usageState">
+ <description>There are three possible states for the usageState attribute:
+
+-active, route is active.
+-busy, route is congested.
+-idle, route not in use.
+
+(idle=0, active=1, busy=2)
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bUsageState">
+ <defaultValue>IDLE</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="priority">
+ <description>The priority of the alternative route. The traffic is directed to the highest priority route(s) available in the route set. If more than one route has the same priority within a route set then loadsharing is permitted between these routes.
+The value 1 is considered as the highest priority.</description>
+ <mandatory/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>5</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="routeType">
+ <description>The type of the route.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="Mtp3bRouteType">
+ <defaultValue>TDM_ATM</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="RouteBlockingState">
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="RouteState">
+ <defaultValue>NOT_BLOCKED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSecondsAccumulatedRouteUnavailable">
+ <description>The number of seconds (accumulated) route unavailable.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <action name="blockSignalingRoute">
+ <description>This action blocks the Signaling Route.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="deBlockSignalingRoute">
+ <description>This action deblocks the Signaling Route.
+
+Note! This action requires antransaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ </class>
+
+ <class name="IpSystem">
+ <description>The IP System MO constitutes the top structure level for IP related MOs in a Cello node.
+
+The IpSystem MO is automatically created and cannot be deleted.
+
+The local distinguished name of this MO is ManagedElement=1, IpSystem=1.
+</description>
+ <systemCreated/>
+ <attribute name="userLabel">
+ <description>An operator defined label.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="IpSystemId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="ping">
+ <description>Ping - used to call a host or router to find out if it is present in the network. The following input parameter is used by the Ping action:
+The domain name or IP address to the host that shall be called.
+
+The following parameter is returned:
+Ping result: 'IP address/domain name' - is alive or no answer.
+
+Note! This action requires a transaction.
+</description>
+ <returnType>
+ <string/>
+ </returnType>
+ <parameter name="host">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="traceRoute">
+ <description>Trace route - used to get information about the route through the IP network that is used for a destination with a specific IP address.
+
+The following input parameter is used by the trace route action:
+The domain name or IP address to a host that shall be trace-routed.
+
+The following parameter is returned:
+Trace result - list of IP addresses/domain names or path not found.
+
+Note! This action requires a transaction.
+</description>
+ <returnType>
+ <string/>
+ </returnType>
+ <parameter name="host">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ </action>
+ </class>
+
+ <class name="IpAtmLink">
+ <description>This MO represents an Internet Protocol over ATM link. LLC/SNAP encapsulated packets over Atm Adaptation Layer 5, AAL5, ATM PVCs are used.
+
+Note: The performance monitoring counters in the IpAtmLink MO has a "Wrap-around time" of approximately 2 hours.
+
+Note! When setting the 'fromUserMaxSduSize' and 'toUserMaxSduSize' on the Aal5TpVccTp MO the defined SduSize should be 8 bytes larger then the 'mtuSize' on the IpAtmLink.
+
+Note! Only Aal5TpVccTp's that terminates on an MP (Main Processor) may be used when setting up IpAtmLink's.</description>
+ <attribute name="IpAtmLinkId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>The User Label attribute gives the operator the possibility to label the links.
+</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the IP over ATM link is dependent of the operational states of the underlying AAL5 termination points that are used to transport IP datagrams. If at least one operational AAL5 termination point (MO: AAL5 TP VCC TP) exists, the operational state of the IP over ATM Link is set to "ENABLED"</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled. It is a bit mapped CORBA long, where one or more of the bits may be set. If none of the bits are set then the availability status is considered to be undefined.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>If set, indicates that this IpAtmLink is reserved by the OspfInterface represented by this attribute.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="OspfInterface"/>
+ </dataType>
+ </attribute>
+ <attribute name="ipAddress">
+ <description>The input format used by the operator is four fields of digits, separated by a dot. Each field consists of three digits.
+
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="subnetMask">
+ <description>The attribute subnetMask states the subnet mask of the IP over ATM link (point to point link).
+
+The input format used by the operator is four fields of digits, separated by a dot. Each field consists of three digits.
+For a point to point link, the subnetmask 255.255.255.252 is very likely.
+
+Note! The subnet mask has to be contiguos. That is, it has the LSB's set to 0 (zero).
+
+Example:
+
+255.255.255.X
+
+Contiguous subnet mask:
+11111111.11111111.11111111.11111110 (X = 254)
+11111111.11111111.11111111.11111100 (X = 252)
+
+Not-contiguous subnet mask:
+11111111.11111111.11111111.11111010 (X = 250)
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="mtuSize">
+ <description>The attribute mtuSize states the maximum IP datagram size that may be sent on the IP over ATM link in bytes, without fragmentation. Recommended MTU size is 1500 bytes to prevent IP fragmentation.
+
+Note that the size of the IP datagram does not include the 8 Bytes added for the LLC/SNAP header before putting the IP datagram in AAL5 SDU.
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>576</min> <max>2040</max>
+ </range>
+ <defaultValue>1500</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="metric">
+ <description>The attribute metric states the metric "cost" of the IP over ATM link. The metric value is calculated as 10^8 /link bit speed.
+
+For example:
+Metric for 10 Mbps Ethernet = 10^8/10^7 = 10
+Metric for 100 Mbps Ethernet = 10^8/10^8 = 1</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>32767</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="monitor">
+ <description>This attribute indicates whether InvATMARP monitor is turned on or off.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="monitorInterval">
+ <description>The interval between sending monitor packets.
+Unit is seconds.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>60</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="monitorRetries">
+ <description>The number of retries when sending monitor packets.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>255</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="interfaceName">
+ <description>The interface name.
+
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="aal5TpVccTpSelectionMode">
+ <description>The selection mode for the Aal5TpVccTp's used by the IpAtmLink MO. Determines how the IpAtmLink MO selects the Aal5 termination points used.
+
+In case 'NO_PREFERENCE', 'LOCAL_MP_SELECT_VCC_AT_LINK_UP', LOCAL_MP_PEER_SELECTION_VCC' or 'LOCAL_MP_ACTIVE_RESELECTION' is selected the IpAtmLink MO will prefer Aal5TpVccTp on local MP (i.e. Aal5TpVccTp MOs executing on the same MP as the IpAtmLink), but other Aal5TpVccTp will be accepted if needed.
+
+In case 'ONLY_LOCAL_MP' is selected, the ipAtmLink (Inet Link) will consider Aal5TpVccTp residing on other MPs as a malfunction and discard the usage of them. No InvArp sending will be performed on them and all incomming trafic on them will be discarded. If no local Aal5TpVccTp exists the operational state of the link will be changed to disabled.
+
+ </description>
+ <dataType>
+ <enumRef name="Aal5TpSelectionModes">
+ <defaultValue>NO_PREFERENCE</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="Aal5TpVccTpIdList">
+ <description>References to MOs of type Aal5TpVccTp representing the underlying AAL5 termination points (of a AAL5 PVC:s) for the IP over Atm link.
+
+The operator gives a list of relative distinguished names of the Aal5TpVccTp MO's to be used by the IP over ATM link.
+An Aal5TpVccTp MO may only be specified once in the list.
+
+To change in the set of Aal5TpVccTp MO's related to the IP over ATM link the link has to be deleted and then created with the desired set of AAL5 TP.
+
+Note! Only Aal5TpVccTp's that terminates on an MP (Main Processor) may be used when setting up IpAtmLink's.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <sequence>
+ <moRef name="Aal5TpVccTp"/>
+ <length>4</length>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInUcastPkts">
+ <description>Performance monitoring counter for the number of input unicast packets deliverred to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInNUcastPkts">
+ <description>Performance monitoring counter for the number of input broadcast/multicast packets deliverred to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfOutUcastPkts">
+ <description>Performance monitoring counter for the number of out unicast packets deliverred to higher layer</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfOutNUcastPkts">
+ <description>Performance monitoring counter for the number of output broadcast/multicast packets deliverred to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInErrors">
+ <description>Performance monitoring counter for the number of input packets discarded due to any error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInDiscards">
+ <description>Performance monitoring counter for the number of input packets discarded due to resource limitations.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfifOutDiscards">
+ <description>Performance monitoring counter for the number of outbound packets discarded due to resource limitations.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <action name="assignIpAddress">
+ <description>This action sets the IP address and the subnet mask.
+
+The changing of the IP address with the operation assignIpAddress, it might cause an interruption of the communication between the node and the network management tool. If an incorrect or erroneous IP address is configured, the communication with the node might be lost until the node is restarted or the IP address is changed to the correct value.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="ipAddress">
+ <description>The input format used by the operator is four fields of digits, separated by a dot. Each field consists of three digits.</description>
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="subnetMask">
+ <description>The input format used by the operator is four fields of digits, separated by a dot. Each field consists of three digits.</description>
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ </action>
+ </class>
+
+ <class name="EthernetLink">
+ <description>The Ethernet Link MO represents the Internet Protocol over Ethernet link. There is only one Ethernet link MO per Cello node.
+
+The changing of the IP address with operation assignIpAddress might cause interruption of the communication if the network management tool is connected via the ethernet link.
+
+Note: The EthernetLink MO can not be deleted!
+
+Note: The performance monitoring counters in the EthernetLink MO has a "Wrap-around time" of approximately 2 hours.
+</description>
+ <attribute name="userLabel">
+ <description>The User Label attribute gives the operator the possibility to label the links.
+
+</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ipAddress">
+ <description>The attribute ipAddress states the IP address of the Ethernet link, it is also the IP address for the O&amp;M host..
+
+The input format used by the operator is four fields of digits, separated by a dot. Each field consists of three digits.
+It must not be a broadcast or multicast address.
+
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="subnetMask">
+ <description>The attribute subnetMask states the subnet mask of the Ethernet link.
+
+The input format used by the operator is four fields of digits, separated by a dot. Each field consists of three digits.
+
+Note! The subnet mask has to contiguos. That is, it has the LSB set to 0 (zero).
+
+Example:
+
+255.255.255.X
+
+Contiguous subnet mask:
+11111111.11111111.11111111.11111110 (X = 254)
+11111111.11111111.11111111.11111100 (X = 252)
+
+Not-contiguous subnet mask:
+11111111.11111111.11111111.11111010 (X = 250)
+
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="broadcastAddress">
+ <description>The input format used by the operator is four fields of digits, separated by a dot. Each field consists of three digits.</description>
+ <mandatory/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="mtuSize">
+ <description>The IP layer expects the Ethernet link to have an MTU size (maximum Ethernet frame size without fragmentization) of 1500 bytes.
+
+The value is always the default value.
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>1500</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="metric">
+ <description>The attribute metric states the metric of the Ethernet link. The metric value is calculated as 10^8/link bit speed.
+
+For example:
+Metric for 10 Mbps Ethernet = 10^8/10^7 = 10
+Metric for 100 Mbps Ethernet = 10^8/10^8 = 1</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>32767</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the Ethernet link is dependent of the operational states of the underlying MAU:s that represents the Ethernet transceiver function. If at least one operational MAU exists, the operational state of the Ethernet Link is set to "ENABLED"</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="interfaceName">
+ <description>The interface name.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="macAddress">
+ <description>The mac address is persistently stored in flash prom on the MP where the IP stack resides. It is stored there at manufacturing. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <long/>
+ <length>6</length>
+ <nonUnique/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>If set, indicates that this EthernetLink is reserved by the OspfInterface MAO represented by this attribute.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="OspfInterface"/>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="EthernetLinkId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInUcastPkts">
+ <description>Performance monitoring counter for the number of input unicast packets deliverred to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInNUcastPkts">
+ <description>Performance monitoring counter for the number of input broadcast/multicast packets deliverred to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfOutUcastPkts">
+ <description>Performance monitoring counter for the number of out unicast packets deliverred to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInErrors">
+ <description>Performance monitoring counter for the number of input packets discarded due to any error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInDiscards">
+ <description>Performance monitoring counter for the number of input packets discarded due to resource limitations.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfOutNUcastPkts">
+ <description>Performance monitoring counter for the number of output broadcast/multicast packets deliverred to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfifOutDiscards">
+ <description>Performance monitoring counter for the number of outbound packets discarded due to resource limitations.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <action name="assignIpAddress">
+ <description>This action sets the IP address and the subnet mask.
+
+The changing of the IP address with the operation assignIpAddress,
+causes an interruption of the communication between the node and
+the network management tool. If an incorrect or erroneous IP address
+is configured, the communication with the node might be lost until
+the node is restarted or the IP address is changed to the correct
+value.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="ipAddress">
+ <description>The input format used by the operator is four fields of digits, separated by a dot. Each field consists of three digits.</description>
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="subnetMask">
+ <description>The input format used by the operator is four fields of digits, separated by a dot. Each field consists of three digits.</description>
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ </action>
+ </class>
+
+ <class name="IpRoutingTable">
+ <description>This MO holds the IP routing table.
+
+The IpRoutingTable MO is automatically created when the Ip MO is created.
+The IpRoutingTable MO can not be created manually.
+The IpRoutingTable MO can not be deleted.
+</description>
+ <systemCreated/>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="indexOfDeletableStaticRoutes">
+ <description>This attribute gives the indexes for the static routes that are possible to delete by the operator.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="IpRoutingTableId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="addStaticRoute">
+ <description>Used to add a new static route to the routing table. It can be
+indicated if the static route should be redistributed by OSPF.
+When adding a static route with an ipaddress, which is not a subnet
+address, the ipaddress is recalculated to the corresponding subnet
+address, based on the ipaddress and the subnet mask. So when looking
+for this route using the action 'getRoutingTableEntry' it is in fact
+the recalculated ipaddress, that is displayed and not the ip address
+entered with addStaticRoute. This is an automatic correction.
+
+Note! If an attempt is made to add a static route with hopIpAddress starting with 0.0 an exception will be thrown.
+
+Note! This action requires a transaction.
+
+
+</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="ipAddress">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="subnetMask">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="hopIpAddress">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="routeMetric">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <parameter name="redistribute">
+ <in/>
+ <dataType>
+ <boolean/>
+ </dataType>
+ </parameter>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="listRoutes">
+ <description>List routes actions is used to list all routes in the routing table. It requires no input parameters.
+
+The output is a formatted string, indicating the number of routes in the table followed by route information for each of these routes.
+
+The number of routes in the table is found at the very start of the returned string. Immediately following this is the information on each route in the list in turn. The route information for each route begins with a new line character ("\n") and is followed by the following data items (in the order written below), which are separated from each other by a SPACE character:
+
+- Destination IP address
+- Destination Network mask
+- Next hop IP address/Interface index of connected networks in dot-decimal format
+- Route metric
+- Route type
+- Interface name
+- Redistribute
+- Active
+
+Note that the next hop ipaddress is not an ipaddress per se, it is the subnet on wich the host/router to route to resides.
+
+Below is an example list of routes that could be returned from this action:
+
+"\n123.123.123.123 234.234.234.234 0.0.0.7 10 13 LE0 FALSE active\n122.122.122.122 233.233.233.233 0.0.0.6 2 8 LE0 TRUE active\n132.132.132.132 243.243.243.243. 0.0.0.7 9 13 LE0 TRUE inactive"
+
+In this case, there are three routes in the routing table. The first route has destination IP address of 123.123.123.123, the second route has it set to 122.122.122.122, while finally the third has it set to 132.132.132.132.
+
+NOTE that the route types can be of the following types:
+
+INET_RTPROTO_OTHER 1
+INET_RTPROTO_LOCAL 2
+INET_RTPROTO_NETMGMT 3
+INET_RTPROTO_ICMP 4
+INET_RTPROTO_OSPF 13
+
+The types listed above also denote the origin of the routing entry.
+
+Note! This action does not require a transaction.
+</description>
+ <returnType>
+ <string/>
+ </returnType>
+ </action>
+ <action name="getRoutingTableEntry">
+ <description>Returns a RoutingTableEntry according to the specified index.
+
+Should be used with action 'numberOfRoutes' within a transaction. To refresh the routing table stored in the MO, invoke the action 'numberOfRoutes'.
+
+Precondition: 0 &lt;= index &lt;= numberOfRoutes() - 1
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <structRef name="RoutingTableEntry"/>
+ </returnType>
+ <parameter name="index">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="InvalidIndexException"/>
+ </action>
+ <action name="numberOfRoutes">
+ <description>Returns the number of entries in the routing table.
+
+Each time this action is invoked, the MO retrieves routing table information from the resource layer and then builds a new array of RoutingTable structs to store this information.
+
+This action along with getRoutingTableEntry(), which allows one to iterate through the array stored in the MO, should be used together with a transaction.</description>
+ <returnType>
+ <long/>
+ </returnType>
+ </action>
+ <action name="deleteStaticRoute">
+ <description>Removes the RoutingTableEntry submitted as a parameter from the Routing Table, if it is found in the table.
+
+Note that only static roues, previously added, can be deleted with this action.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="routingTableEntry">
+ <in/>
+ <dataType>
+ <structRef name="RoutingTableEntry"/>
+ </dataType>
+ </parameter>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ </class>
+
+ <class name="Ip">
+ <description>The Ip MO represents the IP protocol layer with IP forwarding functionality.
+
+Note: The performance monitoring counters in the Ip MO has a "Wrap-around time" of approximately 2 hours.
+
+</description>
+ <attribute name="IpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="workingMode">
+ <description>The workingMode of the IP MO controls if the IP stack in the node will work as a combined host/router (routerMode) or only as a host (hostMode).</description>
+ <mandatory/>
+ <dataType>
+ <enumRef name="WorkingMode">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="retransInterval">
+ <description>The retransmission interval. The units are seconds.
+Must be a value &gt; 0.</description>
+ <dataType>
+ <long>
+ <defaultValue>4</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="noOfRetrans">
+ <description>The number of retransmissions.
+Must be a value &gt; 0.</description>
+ <dataType>
+ <long>
+ <defaultValue>5</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="dnsServer">
+ <description>The Domain Name Server IP address.
+
+The IP address must be a Unicast IP address.
+</description>
+ <dataType>
+ <string>
+ <defaultValue>"127.0.0.1"</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="isRecursiveSearch">
+ <description>Holds information about how the DNS client wants the DNS server do the search for the IP address in the network . It can be either Recursive search or Non-recursive search.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="isSubDomainName">
+ <description>Holds information about whether to use subsets of the fully qualified domain name to reach the simple domain name. It can be either Use subsets of domain name or Not use subsets of domain name.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="isDefDomainName">
+ <description>Holds information about whether the default domain name is present. It can be Present or Not present.
+
+</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="defDomainName">
+ <description>Contains default domain name.
+If 'isDefDomainName' is set to 'true' the domain name found in this attribute is used by the DNS resolver and there is no need to submit the complete domain name. If the domain name is for example 'ws5741.uab.ericsson.se' then the default domain name would be '.uab.ericsson.se'. If 'isDefDomainName' is set to true the there is no need for using '.uab.ericsson.se'. If set to false then the complete domain name has to be used.
+A valid domain name consists of 1 or more labels separated by dots (".").
+Valid characters for a label shall be limited to letters 'a' - 'z', 'A' - 'Z', digits '0' - '9', the character '-' ("dash").
+Character case shall be preserved. Labels shall start with a letter. Total length of a label shall not exceed 255 characters.
+
+Note! The first and last character in the domain name has to be within the following alphabet: letters 'a' - 'z', 'A' - 'Z' and digits '0' - '9'. For more information refer to RFC 952 and 1101.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the IP MO is ENABLED if at least one link is operational.
+
+Shows whether the MO is OK (enabled) or failed (disabled). The values are set by the system.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="numberOfLinks">
+ <description>Represents the number of interfaces (Ethernet and IP over
+ATM links) which has registered to the IP MO.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>If set, indicates that this Ip is reserved by the Ospf represented by this attribute.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Ospf"/>
+ </dataType>
+ </attribute>
+ <attribute name="useHostFile">
+ <description>Indicates if the hosts file should be used or not. The hostFile is used by the resolver and
+chosen as a source of information before querying a DNS server.
+
+true - use the host file.
+false - do not use the host file.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="dscp">
+ <description>The DiffServ CodePoint.
+The code point values are used by DiffServ enabled hosts and router to identify different service levels.
+When set, the DSCPs are mapped to PHBs (Per Hop Behaviours) by forwarding devices along the path
+between the source and destination. PHBs dictates how each packet will be handled i.e. what type of
+service that is applied to the packet when it is forwarded.
+
+Note! Only traffic originated from the node is tagged with the dscp value. The Cello router does not implement functionality for handling different service levels when routing IP traffic.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>63</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="icmpRedirect">
+ <description>Indicates if ICMP redirects is sent out or not.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="udpChecksumState">
+ <description>Enable/Disable generation of UDP checksum.
+0 = disabled
+1 = enabled
+
+The UDP checksum is used for verifying that the UDP header has not been damaged during transmit.</description>
+ <dataType>
+ <long>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="connectionAttemptTimer">
+ <description>The time that elapses before a connection (TCP) attempt times out.
+
+Unit is seconds.</description>
+ <dataType>
+ <long>
+ <defaultValue>75</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxRetransmissionAttempts">
+ <description>The maximum number of retransmission attempts before a TCP connection is dropped.
+The default value is 10 attempts, which is around 5 minutes.
+Setting this attribute value to -1 means infinity, and TCP will never give up in trying
+to establish a connection.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>-1</min>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIpInReceives">
+ <description>Performance monitoring counter for total number of datagrams received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfHdrErrors">
+ <description>Performance monitoring counter for the number of datagrams discarded due to format error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIpAddrErrors">
+ <description>Performance monitoring counter for the number of datagrams discarded due to misdelivery.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIpForwDatagrams">
+ <description>Performance monitoring counter for the number of datagrams forwarded.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIpInDiscards">
+ <description>Performance monitoring counter for the number of datagrams dascarded due to resource limitations.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIpOutDiscards">
+ <description>Performance monitoring counter for the number of datagrams discarded due to lack of resources.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIpReasmReqds">
+ <description>Performance monitoring counter for the number of fragments received needing reassembly.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIpReasmOKs">
+ <description>Performance monitoring counter for the number of datagrams successfully reassembled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="SccpEntitySet">
+ <description>This MO represents an SCCP EntitySet which is made of one SCCP Entity. An SCCP Entity is a local MTP-SAP + a DPC + possibly an SSN, i.e an SCCP EntitySet identifies the set of access points that result from a global title translation. An SCCP EntitySet may also be made of two SCCP Entities of the same type (if an SSN is present in one SCCP Entity, then an SSN shall also be present in the other). In the latter case the two SCCP entities may be considered either as a "primary" SCCP Entity and a "backup" SCCP Entity (dupli-dominant mode) or may be interpreted as two equal SCCP entities that can be used for outgoing loadsharing purpose. In this implementation they can only be considered as "primary" and "backup".The Routing Indicator (RI) in the Called Party Address is normally not set by the SCCP for outgoing messages and should therefore be set by the user. This means that if the user has set "Route on SSN" this will be the case after the GTT also even if the set consist of MTP-3b Access Points. However, if the set consists of SCCP Access Points the RI is implicitly set to "Route on SSN" by SCCP.
+
+DPC Destination Point Code
+GTT Global Title Translation
+MTP Message Transfer Part
+SAP Signalling Access Point
+SSN Subsystem Number
+
+Note: the SccpEntitySet MO depends either on MAOs of type SccpApLocal OR SccpApRemote, not on a mixture of these MAO types.</description>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="routeIds">
+ <description>The Entity Set routeId is an array of maximum two instances of Sccp ApLocal MO's OR two instances of SccpApRemote MO's OR two instances of Mtp3bAp MO's OR one instance of SccpSP MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ <length>2</length>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="sharingMode">
+ <description>The sharingMode attribute controls the distribution of SCCP traffic over the entities (Access Points) in the set.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="SharingMode">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="newSubSystemNumber">
+ <description>The new sub system number attribute is only valid if the Mtp3b Access Points are used in the set. In that case the SSN attribute allows to optionally set the subsystem number in the Called Party Address as a result of a Global Title Translation. If the set consists of SCCP Access Points the subsystem number in the Called Party Address is always implicitly set to the SCCP Access Point SAP (SSN) as a result of a Global Title Translation.
+This attribute is controlled by the type of AP(s) that the EntitySet refers to.
+
+The default value 0 means no new subsystem number.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>254</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="newGlobalTitle">
+ <description>The New Global Title attribute allows to optionally replace the global title in the Called Party Address as a result of a Global Title Translation (GTT). If the GT resulting from a GTT is different from the GT previously included in the Called Party Address, the newly produced GT replaces the existing one. The gtIndicator attribute is read-only and is derived from the combination of Nature Of Address, the Translation Type and Numbering Plan used.
+
+Default value is considered as no new Global Title.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="GlobalTitleData"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Holds a list of the reserving MO's.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="SccpEntitySetId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="SccpGlobalTitle">
+ <description>The SCCP Global Title MO represents a combination of a global title translator and a global title rule. If no Destination Point Code (DPC) is present in the Called Party Address, a Global Title (GT) is needed. Then a global title must be present in the Called Party Address, otherwise a routing error occurs. A global title translator is selected by SCCP based on a combination of the values of the Nature Of Address (NA), the translation type (TT), and the Numbering Plan (NP) if available, in this MO matched with the same information in the Called Party Address provided by an SCCP user. A global title translation rule is selected by SCCP by matching the Global Title Address Information and possibly the Encoding Scheme in this MO, with the same information in the Called Party Address provided by an SCCP user. A global title translation rule points to the SCCP Entity Set resulting from the global title translation (GTT).
+The translation results in a DPC and possibly a new Sub System Number (SSN) or GT or both (decided by the SCCP Entity Set it refers to). If the GT and/or SSN resulting from a GTT is different from the GT and/or SSN previously included in the Called Party Address, the newly produced GT and/or SSN replaces the existing one.
+
+GT - Global Title
+SCCP - Signalling Connection Control Part
+SSN - Sub System Number
+DPC - Destination Point Code
+TT - Translation Type
+GTT - Global Title Translation</description>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="gtIndicator">
+ <description>Global title indicator for China, ITU, TTC and ANSI.
+
+
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="GlobalTitleIndicator">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="natureOfAddress">
+ <description>Indicates number type, i.e. national or international number.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="NatureOfAddress">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="numberingPlan">
+ <description>Indicates which numbering plan that is used.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="NumberingPlan">
+ <defaultValue>UNKNOWN</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="translationType">
+ <description>Used to direct the message to the appropriate Global Title translation function.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>254</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="addressInformation">
+ <description>Digit string of 1-37 digits, where each digit is 0-9, and "B", "C". "B" and "C" are for Code 11 and Code 12.
+The addressInformation may also contain wild card symbols: "*" or "?". Wild cards are only allowed for defining Global Title Translations, they are not allowed for specifying SCCP SAPs (built with SPC and Global Title or SPC + SSN + Global Title).</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>1</min> <max>37</max>
+ </lengthRange>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="encodingScheme">
+ <description>Indicates if the number of address signals are an odd or even number.
+
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="EncodingScheme">
+ <defaultValue>UNKNOWN</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="sccpEntitySetId">
+ <description>The sccpEntitySetId attribute points out the corresponding SccpEntitySet MO.
+
+Note! This attribute is only optional if this MO is used by Policing. In all other cases it has to be set.</description>
+ <noNotification/>
+ <dataType>
+ <moRef name="SccpEntitySet"/>
+ </dataType>
+ </attribute>
+ <attribute name="SccpGlobalTitleId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Aal2PathVccTp">
+ <description>This MO is used to represent an AAL2 Path, i.e. an ATM VC connection that carries multiplexed AAL2 links.
+
+VCC TP - Virtual Channel Connection Termination Point.
+
+The total number of Aal2PathVccTps associated to an Aal2Ap, by connecting them to Aal2PathDistributionUnits under that Aal2Ap, must not exceed 632.
+
+The total number of Aal2PathVccTps associated to a ReliableProgramUniter, by connecting them to Aal2PathDistributionUnits associated to the ReliableProgramUniter, must not exceed 280.
+
+Note! The performance monitoring counters in this MO is set to 0 when counterMode is set to PM_MODE_ON.
+In PM_MODE_OFF no information at all is retrived. So any value for pm-monitoring is measured from the time of setting counterMode to PM_MODE_ON.
+At node restart these performance monitoring counters is reset to 0.
+</description>
+ <attribute name="Aal2PathVccTpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="vclTpId">
+ <description>Reference to the VclTp to be used by this Aal2PathVccTp.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="VclTp"/>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state of the termination point. </description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>unlocked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Operational state of the termination point.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving Aal2PathDistribution MO.
+
+</description>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status of Aal2PathVccTp.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="continuityCheck">
+ <description>Continuitiy checking means that a cell is sent downstream when no user cell has been sent for a period of nominally 1 second.
+
+Activates VC end to end continuityCheck according to ITU.T rec I.610.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="counterMode">
+ <description>PM mode is set to indicate type of performance monitoring mode (ie. activation of bidirectional PM measurements).
+
+</description>
+ <dataType>
+ <enumRef name="AtmCounterMode">
+ <defaultValue>PM_MODE_OFF</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="nomPmBlocksize">
+ <description>Nominal performance monitoring (PM) blocksize. The minimum number of ATM cells to send before sending a Forward Performance Monitoring, FPM, cell.</description>
+ <dataType>
+ <enumRef name="AtmNomPmBlkSize">
+ <defaultValue>NOM_PM_BLKSIZE_2_10</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="timerCu">
+ <description>Timer that assures that CPS-packets with one or more octets already packed in the ATM cell wait at most the duration of timerCu before being scheduled for transmission.
+
+Units for timerCu is 10 to the power of -4 seconds. This value can be set in steps of 10 to the power of -4.
+
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="aal2PathId">
+ <description>This attribute is used to identify the path in the Q.2630.1 protocol.
+
+The pathId value must be unique within all Aal2PathDistributionUnits under the same Aal2Ap
+
+All integers &gt; 0 are allowed (not 0).
+
+The Aal2PathId is used by the Aal2 connection control function in two Aal2 nodes to uniquely identify an AAL2 path between the two nodes. This means that the value of the attribute Aal2PathId for an Aal2 path must be the same in each of the two nodes.
+
+In order to set this attribute, the Aal2PathVccTp may not be reserved. If an attempt is made, an "IsReservedCanNotSetPathId" exception is thrown.
+
+Note! Setting of this attribute will not have any effect until 'actionAddPath' in Aal2PathDistributionUnit MO' is called adding this MO to the list of Aal2PathVccTp MO's.</description>
+ <mandatory/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>2147483647</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="aal2PathOwner">
+ <description>This attribute indicates whether this Aal2 Path VCC Termination Point is considered the owner of the Aal2 Path in order to decide channel selection procedure in the Q.2630.1 protocol.
+
+Note! In order to set this attribute, the Aal2PathVccTp may not be reserved. If an attempt is made, an "IsReservedCanNotSetPathId" exception is thrown.
+
+Note! The administrativeState has to be LOCKED when this attribute is set, if not the "IsUnlockedCanNotSetPathOwner" exception is thrown.
+
+Note! Setting of this attribute will not have any effect until 'actionAddPath' in Aal2PathDistributionUnit MO' is called adding this MO to the list of Aal2PathVccTp MO's.</description>
+ <mandatory/>
+ <dataType>
+ <boolean/>
+ </dataType>
+ </attribute>
+ <attribute name="alarmReport">
+ <description>Attribute to decide what type of alarms to be reported.</description>
+ <dataType>
+ <enumRef name="AlarmReport">
+ <defaultValue>ALARM_LOC</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="aal2QoSProfileId">
+ <description>The identity of the QosProfile used by the Aal2PathVccTp.</description>
+ <mandatory/>
+ <dataType>
+ <moRef name="Aal2QosProfile"/>
+ </dataType>
+ </attribute>
+ <attribute name="aal2QoSAvailableProfiles">
+ <description>This attribute specifies which QoSClass that can be supported by this Aal2Path.
+</description>
+ <dataType>
+ <enumRef name="SupportedQoSClasses">
+ <defaultValue>CLASS_A_B_C_D</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwLostCells">
+ <description>Performance monitoring counter for forwarded lost cells.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwMissinsCells">
+ <description>Performance monitoring counter for number of forwarded missinserted cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwErrBlocks">
+ <description>Performance monitoring counter for number of forwarded errored blocks.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLostFpmCells">
+ <description>Performance monitoring counter for number of lost Forward Performance Monitoring, FPM cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwLostCells">
+ <description>Performance monitoring counter for number of lost backward cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwMissinsCells">
+ <description>Performance monitoring counter for number of backward missinserted cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwErrBlocks">
+ <description>Performance monitoring counter for number of backward errored blocks.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLostBrCells">
+ <description>Performance monitoring counter for number of lost Backward Reporting, BR, cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Aal2RoutingCase">
+ <description>This MO represents a AAL2 routing case which points out an AAL2 access point. </description>
+ <attribute name="Aal2RoutingCaseId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>For free use</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="routeList">
+ <description>An array of alternative routes identified by the concerned Aal2Ap MOs. A routeList can have 0 to 5 Aal2Aps.
+The Aal2Ap must be unique.
+Note! if this attribute is set, the routePriorityList also must be se with the same number of values ( if the routeList
+contains 3 routes, the routePriorityList must contain 3 prioritys).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <restricted/>
+ <dataType>
+ <sequence>
+ <moRef name="Aal2Ap"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="routePriorityList">
+ <description>A list of all the Aal2Ap priorities.
+The priority values can be in the range 1 to 5, one beeing the highest priority.
+The Aal2Aps can have the same priorities.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <restricted/>
+ <dataType>
+ <sequence>
+ <long>
+ <range>
+ <min>0</min> <max>5</max>
+ </range>
+ </long>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="numberDirection">
+ <description>Defines the possible set of AAL type 2 Service Endpoint Addresses (A2EA) that match the routing case.
+
+The number direction of a routing case shall be interpreted as all AAL type 2 Service Endpoint Addresses
+starting with the string of numbers defined in the number direction. For example, the AAL2 End System
+Addresses "12340" and "123400" will both match the number direction "1234".
+
+The AAL2 routing function uses a longest match comparison to select between routing cases with overlapping
+number directions. For example, given two routing cases A with the number direction "1234" and B with the number
+direction "12345" the AAL2 End System Address "12345" will be routed using routing case B, whereas the AAL
+type 2 Service Endpoint Addresses "12344" and "12346" will be routed using routing case A.
+
+NOTE: It is not allowed to use leading zeros when configuring this attribute.
+
+NOTE: It is not possible to replace an existing routing case by creating routing cases with number directions that
+completely overlap the number direction of the existing routing case.
+
+NOTE: It is not possible to create two routing cases with the exact same number directions in a node.
+
+NOTE: It is possible to create one or more routing cases with number directions that partially overlap the number
+direction of an existing routing case.
+
+Length range 1..15
+Alphabet: "0123456789"
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>1</min> <max>15</max>
+ </lengthRange>
+ </string>
+ </dataType>
+ </attribute>
+ <action name="addAal2ApToRc">
+ <description>Adds the identified (and existing) Aal2Ap MO to the routeList. This action should also be used when changing the priority for an existing Aal2Ap MO. When submitting an existing Aal2Ap MO with a new priority the routing list will be updated with the new priority for the specified Aal2Ap MO.
+
+Note! In order to be able to update the priority for a routing entry, the routing entry first has to be deleted and then submitted with the new priority.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="priority">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <parameter name="route">
+ <in/>
+ <dataType>
+ <moRef name="Aal2Ap"/>
+ </dataType>
+ </parameter>
+ <raisesException name="InvalidPriorityException"/>
+ <raisesException name="IllegalArgumentTypeException"/>
+ <raisesException name="IllegalAttributeValueException"/>
+ </action>
+ <action name="removeAal2ApFromRc">
+ <description>Removes the identified Aal2Ap MO from the routeList.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="route">
+ <in/>
+ <dataType>
+ <moRef name="Aal2Ap"/>
+ </dataType>
+ </parameter>
+ <raisesException name="IllegalAttributeValueException"/>
+ <raisesException name="IllegalArgumentTypeException"/>
+ </action>
+ </class>
+
+ <class name="Aal2Sp">
+ <description>The Aal2Sp (AAL2 Signalling Point) MO is used to represent the AAL type 2 Service Endpoint Address of the node in the AAL2 network.
+There is one and only one instance of this MO in the ATM NE system.</description>
+ <attribute name="userLabel">
+ <description>For free use</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="a2ea">
+ <description>An E.164 format number that specifies the AAL type 2 Service Endpoint Address of the node.
+
+Length Range: 1..15
+Alphabet: "0123456789"
+
+Note! It is not allowed to use leading zeros when configuring this attribute.</description>
+ <mandatory/>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>1</min> <max>15</max>
+ </lengthRange>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="Aal2SpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="pmUnsuccessfulConnsInternal">
+ <description>Performance monitoring counter for the number of unsuccessful attempts to establish connections due to node internal problems.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Aal2Ap">
+ <description>This MO represents a AAL2 Access Point signalling function associated with a single AAL2 signalling relationship to a remote peer AAL2 acess point signalling function. An AAL2 access point is either a high rate access point that uses MTP-3B for signalling or a low rate access point that uses UNI-SAAL for signalling.
+
+Aal2Ap - Aal2 Access Point
+
+Note! The performance monitoring counters in the AalAp MO is set to 0 (zero) at start or restart of the node.
+When the value is to large too fit in to a long (31bit) the counter turns over and starts from 0 again.</description>
+ <attribute name="Aal2ApId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Free for use</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>This attribute holds a list of the reserving MOs.
+</description>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Operational state of the AAL2 AP.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status of the Aal2Ap.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="timerErq">
+ <description>Q.2630.2 establishment request timer. Unit is milli seconds.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>5000</min> <max>30000</max>
+ </range>
+ <defaultValue>5000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="timerRel">
+ <description>Q.2630.2 release request timer. Unit is milli seconds.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>2000</min> <max>60000</max>
+ </range>
+ <defaultValue>2000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="sigLinkId">
+ <description>Reference to a UniSaalTp or Mtp3bAp MO that provides a signalling link for the Aal2Ap.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="secondarySigLinkId">
+ <description>Reference to a secondary signalling link MO of type UniSaalTp. This attribute can only be set when sigLinkId is of type UniSaalTp.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="rpuId">
+ <description>The physical location of an AP (Access Point) LR/HR (Low Rate/ High Rate) program represented by a reference to a RPU (ReliableProgramUniter) MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ReliableProgramUniter"/>
+ </dataType>
+ </attribute>
+ <attribute name="aal2QoSCodePointProfileId">
+ <description>The identity of the QoSCodePointProfile used by this MO.</description>
+ <dataType>
+ <moRef name="Aal2QosCodePointProfile"/>
+ </dataType>
+ </attribute>
+ <attribute name="pmExisOrigConns">
+ <description>Performance monitoring counter pmExisOrigConns.
+Number of existing connections for the AP originating in this node.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="nrOfConfiguredAal2Paths">
+ <description>The total number of Aal2PathVccTp MOs configured on this Aal2 Ap.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="nrOfUnavailableAal2Paths">
+ <description>The total number of unavailable Aal2PathVccTp's on this Aal2 Ap, i.e. the number of Aal2PathVccTp MOs connectected to this Aal2Ap with 'administrativeState' LOCKED.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmExisTermConns">
+ <description>Performance monitoring counter pmExisTermConns.
+Number of existing connections for the AP terminating in this node.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmExisTransConns">
+ <description>Performance monitoring counter pmExisTransConns.
+Number of existing connections for the AP transiting in this node.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSuccOutConnsRemote">
+ <description>Performance monitoring counter pmSuccOutConnsRemote.
+Number of successful establishment of outgoing connections on this AP</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSuccInConnsRemote">
+ <description>Performance monitoring counter pmSuccInConnsRemote.
+Number of successful establishment of incoming connections on this AP.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUnSuccInConnsRemote">
+ <description>Performance monitoring counter pmUnSuccInConnsRemote.
+
+Number of unsuccessful establishment of incoming connections on this AP caused by reject from beyond this node.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUnSuccOutConnsRemote">
+ <description>Performance monitoring counter pmUnSuccOutConnsRemote.
+
+Number of unsuccessful establishment of outgoing connections on this AP caused by reject from remote side, reset from remote side, no reply or signalling link failure.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUnSuccInConnsLocal">
+ <description>Performance monitoring counter pmUnSuccInConnsLocal.
+Number of unsuccessful attempts to allocate Common Part Sublayer, CPS, resources during establishment of incoming connections on this AP caused by Channel Identifier, CID, and/or bandwidth collision or mismatch of Call Admission Control, CAC, between peers.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUnSuccOutConnsLocal">
+ <description>Performance monitoring counter pmUnSuccOutConnsLocal.
+
+Number of unsuccessful attempts to allocate CPS resources during establishment of outgoing connections on this AP. Caused by rejects in CAC (Connections Admission Control).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUnRecMessages">
+ <description>Performance monitoring counter pmUnRecMessages.
+
+Number of received unrecognized Q.2630.1 messages on this AP.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUnRecParams">
+ <description>Performance monitoring counter pmUnRecParams.
+
+Number of received Q.2630.1 messages with unrecognized parameters on this AP.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Etm1">
+ <description>This MO represents the hardware of the ET-M1 board type. It only represents the ET specific hardware, while the DBM module of the board is represented by the PlugInUnit MO.
+
+The ET-M1 board contains 8 physical ports that can be configured as either E1 (ETSI), J1 (TTC) or T1(ANSI). The board does not allow for a mix of E1, J1 and T1 ports, thus all configured ports on the board must be configured to the same standard.
+
+Each of the ports on the ET-M1 board can be used to carry either ATM traffic or circuit orientated (Nx64 Kbits/s connections) traffic.
+
+Each port can support up to 30 ATM VC connections. Two of these connections are reserved for AAL2 paths, and therefore two AAL2 multiplexers per port are available.
+
+Each port can support up to 2 VP connections.
+
+The ET-M1 board supports 1 bidirectional F4/F5 PM flow per port.
+
+Other restrictions:
+- All ports (configured for ATM) on the board must have the same value for the hecCorrection attribute (ATM Port MO).
+- It is possible to configure UBR+ traffic, but there is no guarantee on the minimum cell rate.
+- VP shaping is not supported (it is recommended to configure at most one VP per physical port).
+- VC shaping is not supported with an exception for AAL2 path traffic. This is shaped to the peak bandwidth on the VC connection.
+- When using the Etm1 board the performance monitoring counters in the transmit direction found on the AtmPort MO does not show the following cells: CC cells and OAM FPM cells.
+
+Note! IMA is not applicable for the ETM1 board.
+
+Note! When using fractional atm, timeslot 1 must be a part of the fraction.
+
+Note! ETM1 does not support EPD and PPD
+
+Note! ETM1 does not have a proper buffer management. Thus fairness of UBR+ traffic can not be guaranteed and shaping on UBR+ traffic is not possible.
+
+Note! The number of VCC TP+VPC TP with performance monitoring enabled (i.e. PM mode &lt;&gt; off) is restricted to 1 per port.
+</description>
+ <attribute name="userLabel">
+ <description>user label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Enabled or disabled according to the actual operational state of the Etm1 board.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="Etm1Id">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="TuSyncRef">
+ <description>This MO is used to administer synchronization reference (a synchronization input with support for 2MHz and 10MHz signals) on Timing Unit board.</description>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Operational state of TU synchronization reference</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>Administrative state of TU synchronization reference</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status of the TuSyncRef.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>When the TU synchronization reference is registered in the system as an usable synchronization reference, this MO reference is set by using "local" operation syncReserve(). When synchronization reference is de registered, "local" operation syncRelease is used. Note that the only valid user of these operations is Synchronization MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Synchronization"/>
+ </dataType>
+ </attribute>
+ <attribute name="TuSyncRefId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Spm">
+ <description>The Special purpose Processor Module MO, Spm, represents one of the Special Purpose Processors and its connected hardware. This object is used for SW management and restart. Hardware failure indications are sent to Spu.
+
+Note! If the board is of type SPB1 the maximum number of Spm MO's that is possible to create under the Spu MO is 3.
+If the board is of type SPB2 the maximum number of Spm MO's that is possible to create under the Spu MO is 5.</description>
+ <attribute name="SpmId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>user label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the SPM</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="switchModuleNumber">
+ <description>Switch Module Number</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="asciPortNumber">
+ <description>ASCI Port Number</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="executionResourceNumber">
+ <description>The identity of the SPM on the Special purpose Processor Unit (SPU).
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="runningResourceIdList">
+ <description>The list of identities of running Spm's
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <long/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="installedResourceIdList">
+ <description>The list of identities of installed Spm's in the system.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <long/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="spLinkName">
+ <description>The uniqe name of the link between the SP and BP.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <action name="restart">
+ <description>Restarts the SP.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ </class>
+
+ <class name="Spu">
+ <description>The Special purpose Processor Unit MO, Spu, represents the board specific HW on SPB. This objects collects HW failure indications on the board and issues/ceases alarms.</description>
+ <attribute name="userLabel">
+ <description>user label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the SPB board.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="spLinkName">
+ <description>The special purpose processor link name.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="SpuId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="restart">
+ <description>Restarts all SPs on the board (but not the BP).
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroNotAccessibleException"/>
+ </action>
+ </class>
+
+ <class name="AtmCrossConnection">
+ <description>This MO is used to represent the point-to-point ATM cross-connect relationship between two VCL termination points.</description>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Operational state for the cross connection.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="vclTpAId">
+ <description>Identifies the VclTp managed object involved in the A side of the cross connection (which consists of an A and B side).
+
+Must not be the same as vclTpBId.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="VclTp"/>
+ </dataType>
+ </attribute>
+ <attribute name="vclTpBId">
+ <description>Identifies the VclTp managed object involved in the B side of the cross connection (which consists of an A and B side).
+
+Must not be the same as vclTpAId.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="VclTp"/>
+ </dataType>
+ </attribute>
+ <attribute name="AtmCrossConnectionId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="ConfigurationVersion">
+ <description>The Configuration Version, CV, is an MO managing all on disk saved node configuration. This MO keeps all administrative data about the CV's including path and file-names of the configuration files. There may be more than one CV on the disk but only one is used at the time. A CV is always based on one Upgrade Package.
+
+The local distinguished name of this MO is ManagedElement=1, SwManagement=1, ConfigurationVersion=1.</description>
+ <systemCreated/>
+ <attribute name="ConfigurationVersionId">
+ <description>Configuration version MO's id.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="storedConfigurationVersions">
+ <description>List of stored configuration versions in the node.
+
+Stored in and read from the file system.
+
+List of stored configuration versions (CV) in the node.
+
+The list is a sequence of CVs.
+Each CV is presented as structure. A CV structure has following fields:
+ 1. Name
+ 2. Identity
+ 3. Type
+ 4. UpgradePackageId
+ 5. Operator name
+ 6. Comment
+ 7. Date
+ 8. Status
+
+The CV list is formatted as a sequence of ConfigurationVersionAttributes.
+Each struct contains one CV.
+
+The following characters are allowed within the struct members below.
+
+[0-9], [A-Z], [a-z] and '&amp;' , '%' , ':' , '.' , '_' , '-'
+
+Note! For comment and operatorName spaces (' ') are also allowed within the strings.
+
+Struct element description :
+-Name is in string format, max length is 40.
+-Identity is in string format, max length is 40.
+-Type is in string format, max length is 40.
+-UpgradePackageId is in string format, max length is 40.
+-Operator name is in string format, max length is 40.
+-Comment is in string format, max length is 40.
+-Date is in string format, max length is 40. Format for date is: weekday month date hour:min:seconds year.
+-Status is in string format, max length is 40.
+
+Note! The identity can not be the same as name. Identity should contain the product identity.
+
+
+</description>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <structRef name="ConfigurationVersionAttributes"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="currentLoadedConfigurationVersion">
+ <description>The name of the current loaded configuration version.
+
+Stored in and read from the file system.
+
+This is the configuration version that the system started with, i.e. the configuration version that was startable at the last node restart. </description>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="startableConfigurationVersion">
+ <description>The name of the configuration version that will be used at next node restart.
+
+Stored in and read from the file system.
+
+This attribute is set by the action "setStartable( name of cv)".
+Also set at rollback by the system. The first CV in the rollback list is then used.</description>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="rollbackList">
+ <description>A list of configuration versions to rollback to (configuration version name).
+
+The configuration version on the first line is used at the next rollback. That line is then automatically removed from the rollback list.
+
+This attribute is modified by actions setFirstRollbackList() and removeFromRollbackList()</description>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="currentUpgradePackage">
+ <description>A reference to current executing upgrade package.</description>
+ <readOnly/>
+ <dataType>
+ <moRef name="UpgradePackage"/>
+ </dataType>
+ </attribute>
+ <attribute name="autoCreatedCVIsTurnedOn">
+ <description>Flag that indicates that a configuration version will be created automatically once a day.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="timeForAutoCreatedCV">
+ <description>Time for the automatic creation of configuration versions once a day.
+
+The string must be specified as "HH:MM" to be accepted at set.
+
+See also Class Attribute autoCreatedCVIsTurnedOn.
+The time is UTC time.
+
+Note! If changing the clock on the node, this attribute must be set or
+the JVM MP must be reastarted.
+
+
+</description>
+ <dataType>
+ <string>
+ <defaultValue>"04:00"</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="rollbackOn">
+ <description>Flag that indicates if rollback is enabled or not.
+When true the system will automatically set the rollback counter. In case of cyclic restarts a rollback will be issued after x restarts. x is defined by the rollbackInitCounterValue.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="rollbackInitTimerValue">
+ <description>Used by the system when rollback is switched on (autoRollbackOn=true). After the given time the node is considered not in a cyclic restart mode. The rollback counter will then be reset to its initial value (rollbackInitCounterValue).
+
+Timer value in minutes.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>10000</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="rollbackInitCounterValue">
+ <description>Initial value for the rollback counter. Used when rollback is switched on (autoRollbackOn=true).
+
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>10000</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="commandlogStatus">
+ <description>An attribute to indicate status of command log.
+It can be ON/OFF(true/false). </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="executingCv">
+ <description>The name of the executing Configuration Version, CV.
+
+Same as 'currentLoadedConfigurationVersion' after a node restart, changed to the value of lastCreatedCv when a CV is created.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="lastCreatedCv">
+ <description>The name of the last created Configuration Version, CV.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <action name="setStartable">
+ <description>The CV given will be the one used at the normal node restarts. Only A CV with status = OK can be set as startable.
+
+This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="configurationVersionName">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="create">
+ <description>A new CV directory will be created. A DB backup from the current RAM CV,
+an ARMAMENT file and the file LLP:LMid is created at the directory. The current
+command log file is copied to the CV directory first, then it removes the file from
+the current directory.
+
+Note: The file cmdlog.properties under /c/ will not be saved to the CV.
+
+The following characters are allowed in the Strings:
+
+[0-9], [A-Z], [a-z] and '&amp;' , '%' , ':' , '.' , '_' , '-'
+
+Note! For comment and operatorName spaces (' ') are also allowed within the strings
+
+-configurationVersionName is in string format, max length is 40 characters.
+-identity is in string format, max length is 40 characters.
+-operatorName is in string format, max length is 40 characters.
+-comment is in string format, max length is 40 characters.
+
+This action does not require a transaction.
+
+Note! The configurationVersionName and identity can not be the same. The identity should be the product identity.
+</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="configurationVersionName">
+ <description>One ASCII text string. It must be possible to create a directory with string. Do not use string "autocreated1" and "autocreated2" as cv name. They are used by the system.</description>
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="identity">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="type">
+ <description>Type of the configuration version [ standard | test | other ].</description>
+ <in/>
+ <dataType>
+ <enumRef name="ConfigurationVersionType">
+ <defaultValue>other</defaultValue>
+ </enumRef>
+ </dataType>
+ </parameter>
+ <parameter name="operatorName">
+ <description>The operator's name.</description>
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="comment">
+ <description>The operator's comment.</description>
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <raisesException name="ValueOutOfRangeException"/>
+ </action>
+ <action name="delete">
+ <description>Delete a configuration version (CV) permanently.
+
+If CV is referenced in the startable or in the rollback list, the action is not performed (an exception is thrown instead).
+
+Note! The latest created CV is not deletable until a node restart is performed or a new CV is created. Also note that a CV is not possible to delete when it has one of the folowing properties:
+- "loaded"
+- "startable"
+- The CV is found in the "rollbacklist"
+
+This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="configurationVersionName">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="removeFromRollbackList">
+ <description>Removes a Configuration Version (CV) from the rollback list.
+
+This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="configurationVersionName">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="setFirstRollbackList">
+ <description>Adds a Configuration Version (CV) first in the rollback list. This will cause the node to chose this CV at the next rollback. A CV with status NOK, can't be put in the rollback list.
+
+This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="configurationVersionName">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="activateCommandLog">
+ <description>This action activates the log.
+
+The inparameter is the drive name (where the command log file should be stored).
+
+Default command log is drive /c/.
+
+Note! Invoking this action affects the attribute'commandLogStatus'.
+
+Note! This action does not require a transaction.
+</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="cmdlogdriveName">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <raisesException name="InvalidDriveNameException"/>
+ <raisesException name="LogActivationException"/>
+ </action>
+ <action name="deactivateCommandLog">
+ <description>This action deactivates the logging of configuration commands.
+
+Please note that uncommited data will be lost.
+
+Note! Invoking this action affects the attribute'commandLogStatus'.
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="LogActivationException"/>
+ </action>
+ </class>
+
+ <class name="SwManagement">
+ <description>This MO is used as a structural element for the SW managed object. The MO structures the software resources of the node.
+
+Note that the SwManagement MO is automatically created and cannot be deleted.
+
+The local distinguished name of this MO is ManagedElement=1, SwManagement=1.</description>
+ <systemCreated/>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="SwManagementId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="normalizeRPU">
+ <description>This action will normalize all RPUs in the node.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ </class>
+
+ <class name="UpgradePackage">
+ <description>The UpgradePackage, UP, represents an upgrade package as stored in the node file system and as stored on the ftp server that it is/shall be fetched from.
+
+There may be more than one UP at the same time on the disk. One UP represents the running system issue in the node. That one is pointed out by the Configuration Version MO.
+
+The actions on an UpgradePackage MO, are actions that can be called to take that particular UpgradePackage into operation on the node.
+
+The deletion of the Upgrade Package on disk is performed when the associated Upgrade Package MO is deleted. The Upgrade Package's unique LoadModule MOs and files are deleted. ConfigurationVersions in otherReferringCVs are deleted.
+
+
+The UP MO refers to all load modules used in the UP. One load module may by used in more than one UP.
+
+Note at the start-up of the system/database/loading of a Configuration Version, special Upgrade Package MOs are created to represent Upgrade Packages that are stored on the disk but do not have an MO in the current Configuration Version. These special Upgrade Package MOs have are in the "onlyDeletable" state. In this state, the MO will throw ActionNotAllowedException on all its actions!
+
+MOs of this type are created automatically during system upgrade.
+MOs of this type are possible to create manually but a system upgrade
+is recommended to create them.</description>
+ <attribute name="UpgradePackageId">
+ <description>The identity of the MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free of use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="loadModuleList">
+ <description>List of references to load modules that belong to this upgrade package.
+
+The list will be null until a successful install has been performed.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="LoadModule"/>
+ <nonUnique/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="upgradeControlFilePath">
+ <description>Path to the .xml file on the node once it has been fetched from the FTP server.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="state">
+ <description>Contains the state of this upgrade package.
+
+The management system and/or operator need to act on some changes in the state attribute.
+
+This attribute is used to accept/reject and modify behavior of actions. For example action 'upgrade' is not allowed in state notInstalled. Furthermore, action 'upgrade' does not behave the same if state == 'Installed' compared to if state == 'executingUpgrade' or 'awaitingConfirm'.
+
+To continue and conclude the upgrade sequence when in state == 'awaitingConfirm', action 'confirmUpgrade()' must be called. In this state it is also advisable to check attribute 'confirmationDeadline' to see how much time it is left before automatic rollback is done.
+
+Upgrade Package MOs that are stored on disk but do not have an MO in the current Configuration Version are in state "onlyDeletable". An MO in this state will throw the exception ActionNotAllowedException on all its actions.
+
+</description>
+ <readOnly/>
+ <dataType>
+ <enumRef name="UpgradePackageState">
+ <defaultValue>NOT_INSTALLED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="progressHeader">
+ <description>Header enum describing the current progress indication.
+Note that this is only progress information, that should be shown to a human operator, because some operations may take time.
+
+Changes in the progress header NEVER entails that the operator or management system need to perform any particular actions. </description>
+ <readOnly/>
+ <dataType>
+ <enumRef name="UpgradeProgressInformation">
+ <defaultValue>IDLE</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="progressTotal">
+ <description>
+This notification attribute is used to indicate progress for different steps in the upgrade sequence. The value gives the total number of steps that is to be performed in current step.
+
+This attribute is changed whenever 'progressHeader' is changed and indicates a maximum count for the progress of the progress counter. What items that are counted is specific for each case. For some cases, the counter is not yet implemented. In these cases, the progressTotal is set to zero (0) when the progressHeader is set.
+
+</description>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="progressCount">
+ <description>This attribute is used to indicate progress for different steps in the upgrade sequence. The value is separated in increments from 0 to progressTotal.
+
+The value of progressCount never exceeds the value of 'progressTotal'.
+
+For some cases, the counter is not yet implemented. In these cases, the progressCount is set to zero (0) when the progressHeader is set.</description>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeData">
+ <description>Contains product data for this upgrade package. This information is extracted from the upgrade control file. </description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <structRef name="AdminProductData"/>
+ </dataType>
+ </attribute>
+ <attribute name="confirmationDeadline">
+ <description>This attribute contains the deadline date and time for an operator confirmation. If the deadline is not met, then an automatic rollback to a previous configuration is issued by the system.
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ftpServerIpAddress">
+ <description>Ip address to the ftp server where the upgrade package is stored.
+
+The input format used by the operator is four fields of digits, separated by a dot.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="upFilePathOnFtpServer">
+ <description>File path on the FTP server to the upgrade control file. </description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="user">
+ <description>User id. to be used for logging in to the FTP server.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <defaultValue>anonymous</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="password">
+ <description>Password to the FTP server. This attribute is only supplied at create and is not readable.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <defaultValue>anonymous</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="upgradePackageDocumentId">
+ <description>The document number and revision of the uppgrade package where the white spaces has been removed and underscore between the document number and revision has been inserted e.g. 19089-CSX10901/1_A.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="deletePreventingCVs">
+ <description>The list containing the names of the Configuration Versions that stop the Upgrade Package MO from being deleted.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <string/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="otherReferringCVs">
+ <description>The list of names of Configuration Versions that refer to the Upgarde Package MO, but do not affect the deletable status of the Upgrade Package MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <string/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="isDeletable">
+ <description>Indicates if the Upgrade Package MO can be deleted.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="basedOnUpgradePackages">
+ <description>This attribute is only valid for Upgrade Packages of type Delta.It contains the merge history of this upgrade package.
+
+Example: [Product Data for normal UP (non Delta UP), Product Data for Delta UP1, Product Data for Delta UP2]. </description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <structRef name="AdminProductData"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="upCompatibilityIndex">
+ <description>This attribute states a compatibility index.
+
+If specified, it may be used when verifying that an upgrade 'from' state is valid for this Upgrade Package.
+
+Note: It is only used when the Upgrade Control File element upgrade window contains this type of information.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="cppUpVersion">
+ <description>This attribute states the CPP upgrade package version of this Upgrade Package</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <structRef name="AdminProductData"/>
+ </dataType>
+ </attribute>
+ <attribute name="actionResult">
+ <description>The attribute contains the result from the latest four invoked actions.
+
+This attribute is only valid for actions::
+- install (all variants)
+- cancelInstall
+- verifyUpgrade
+- upgrade (all variants, Note that the attribute is only valid when the verification phase discovers that upgrade is not possible').</description>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <structRef name="ActionResultData"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <action name="install">
+ <description>Load modules defined in the Upgrade Package Control file will only be downloaded to the node if the Load Module MO representing the load module file doesn't already exist.
+The result of this action is indicated in the attribute ActionResult. In case the installation fails after 'void' has been returned the attribute 'ProgressHeader' is set to 'InstallationExecutionFailed'.Already downloaded load modules (the downloaded file and the Load Module MO representing it) are not removed at installation failure.
+
+
+This action returns an actionID (created by the server). This actionID shall be used to locate the result of the action in attribute actionResult.
+
+Note! This action will be removed in a later version.
+Note! This action does not require a transaction. </description>
+ <returnType>
+ <long/>
+ </returnType>
+ <raisesException name="FtpServerNotAccessibleException"/>
+ <raisesException name="GetFileException"/>
+ <raisesException name="IpAddressException"/>
+ <raisesException name="UpgradeControlFileException"/>
+ <raisesException name="ActionNotAllowedException"/>
+ <raisesException name="InstallException"/>
+ </action>
+ <action name="verifyUpgrade">
+ <description>Verifies that an upgrade is possible.
+
+The operation is not blocked while the verification is executing i.e. after basic controls the operation initiates the verification and returns 'void'.
+
+The progress of this action is indicated in the attribute ProgressHeader.The result of this action is indicated in the attribute ActionResult.
+
+This action returns an actionID (created by the server). This actionID shall be used to locate the result of the action in attribute actionResult.
+
+Note: This action does not require a transaction.
+
+
+
+</description>
+ <returnType>
+ <long/>
+ </returnType>
+ <raisesException name="VerifyUpgradeException"/>
+ <raisesException name="ActionNotAllowedException"/>
+ </action>
+ <action name="upgrade">
+ <description>Upgrades the node. The operation is not blocked while upgrade is executing i.e. after basic controls the operation initiates the upgrade and returns 'void'.
+
+Before the real upgrade is started a verification phase is executed.
+
+The progress of this action is indicated in the attribute ProgressHeader.
+
+This action returns an actionID (created by the server). This actionID shall be used to locate the result of the action in attribute actionResult.
+
+The result of this action is only indicated in attribute ActionResult in case the verification phase discovers that upgrade is not possible.
+
+Note: This action does not require a transaction.
+
+</description>
+ <returnType>
+ <long/>
+ </returnType>
+ <raisesException name="UpgradeNotPossibleException"/>
+ <raisesException name="ActionNotAllowedException"/>
+ </action>
+ <action name="rebootNodeUpgrade">
+ <description>The same as upgrade except that the hard upgrade sequence is always chosen.
+
+It could be helpful to use this method if the application has start- or upgrade- synchronization problems when using a soft upgrade sequence.
+
+This action returns an actionID (created by the server). This actionID shall be used to locate the result of the action in attribute actionResult.
+
+The result of this action is only indicated in attribute ActionResult in case the verification phase discovers that upgrade is not possible.
+
+Note: This action does not require a transaction. </description>
+ <returnType>
+ <long/>
+ </returnType>
+ <raisesException name="UpgradeNotPossibleException"/>
+ <raisesException name="ActionNotAllowedException"/>
+ </action>
+ <action name="confirmUpgrade">
+ <description>The operator invokes this method when the trial period is over.
+The operation is not blocked while upgrade is executing i.e. after basic controls the operation initiates the upgrade and returns 'void'.In case the upgrade fails after 'void' has been returned the attribute ProgressHeader will be set to 'UpgradeExecutionFailed'.
+
+Note! This action does not require a transaction. </description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="UpgradeNotPossibleException"/>
+ <raisesException name="ActionNotAllowedException"/>
+ </action>
+ <action name="cancelUpgrade">
+ <description>Cancels an executing upgrade or an upgrade that is awaiting confirm.
+
+Note: This action performs a node restart so that the CV pointed out in the ConfigurationVersion MO is rolled back.
+
+Note! This action does not require a transaction. </description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="ActionNotAllowedException"/>
+ </action>
+ <action name="forcedInstall">
+ <description>All load modules defined in the Upgrade Package Control file will be downloaded to the node even if the Load Module MO representing the load module already exists i.e. existing load module files are replaced.
+The result of this action is indicated in the attribute ActionResult.In case the installation fails after 'void' has been returned the attribute 'ProgressHeader' is set to 'InstallationExecutionFailed'.Already downloaded load modules (the downloaded file and the Load Module MO representing it) are not removed at installation failure.
+
+
+This action returns an actionID (created by the server). This actionID shall be used to locate the result of the action in attribute actionResult.
+
+Note! This action will be removed in a later version.
+Note! This action does not require a transaction. </description>
+ <returnType>
+ <long/>
+ </returnType>
+ <raisesException name="FtpServerNotAccessibleException"/>
+ <raisesException name="GetFileException"/>
+ <raisesException name="IpAddressException"/>
+ <raisesException name="UpgradeControlFileException"/>
+ <raisesException name="ActionNotAllowedException"/>
+ <raisesException name="InstallException"/>
+ </action>
+ <action name="nonBlockingInstall">
+ <description>Load modules defined in the Upgrade Package Control file will only be downloaded to the node if the Load Module MO representing the load module doesn't already exist.
+
+This action is non-blocking i.e. the action initiates the installation and returns 'void' immediately without waiting for the installation to be completed.
+
+In case the installation fails after 'void' has been returned, this will be indicated by change of the value of attribute 'ProgressHeader' to 'ExecutionFailed'. Already downloaded load modules (the downloaded file and the Load Module MO representing it) are not removed at installation failure.
+
+This action returns an actionID (created by the server). This actionID shall be used to locate the result of the action in attribute actionResult.
+
+Note! This action does not require a transaction.
+</description>
+ <returnType>
+ <long/>
+ </returnType>
+ <raisesException name="ActionNotAllowedException"/>
+ <raisesException name="InstallException"/>
+ </action>
+ <action name="nonBlockingForcedInstall">
+ <description>All load modules defined in the Upgrade Package Control file will be downloaded to the node even if the Load Module MO representing the load module already exists i.e. existing load module files are replaced.
+This action is non-blocking i.e. the action initiates the installation and returns 'void' immediately without waiting for the installation to be completed.
+The result of this action is indicated in the attribute ActionResult.In case the installation fails after 'void' has been returned the attribute 'ProgressHeader' is set to 'InstallationExecutionFailed'. Already downloaded load modules (the downloaded file and the Load Module MO representing it) are not removed at installation failure.
+
+This action returns an actionID (created by the server). This actionID shall be used to locate the result of the action in attribute actionResult.
+
+Note! This action does not require a transaction. </description>
+ <returnType>
+ <long/>
+ </returnType>
+ <raisesException name="ActionNotAllowedException"/>
+ <raisesException name="InstallException"/>
+ </action>
+ <action name="nonBlockingSelectiveForcedInstall">
+ <description>This action only installs the load modules that are required in this node i.e. the load modules required after successful execution of action upgrade on this upgrade package.
+
+A load module is considered to be required if one of the following criteria is fulfilled:
+a) The load module is included in a Repertoire MO where the Repertoire MO is connected to a SwAllocation MO and the SwAllocation MO is connected to a Slot MO, a Fan MO, a Jvm MO, a Webserver MO or an applicable type of application MO.
+b) The load module is of type 'other'.
+
+All required load modules will be downloaded to the node even if the Load Module MO representing the load module already exists i.e. existing load module files are replaced.
+
+This operation is non-blocking i.e. the action initiates the installation and returns "void" immediately without waiting for the installation to be completed.
+The result of this action is indicated in the attribute ActionResult.In case the installation fails after 'void' has been returned the attribute 'ProgressHeader' is set to 'InstallationExecutionFailed'. Already downloaded load modules (the downloaded file and the Load Module MO representing it) are not removed at installation failure.
+
+Note. The behaviour described for this action is also obtained for the other installation actions if the Upgrade Control File indicates that the upgrade package is of type selective (which is recommended).
+
+This action returns an actionID (created by the server). This actionID shall be used to locate the result of the action in attribute actionResult.
+
+Note! This action does not require a transaction. </description>
+ <returnType>
+ <long/>
+ </returnType>
+ <raisesException name="ActionNotAllowedException"/>
+ <raisesException name="InstallException"/>
+ </action>
+ <action name="nonBlockingSelectiveInstall">
+ <description>This action only installs the load modules defined in the Upgrade Package Control file that are required in this node i.e. the load modules required after successful execution of action upgrade on this upgrade package.
+
+A load module is considered to be required if one of the following criteria is fulfilled:
+a) The load module is included in a Repertoire MO where the Repertoire MO is connected to a SwAllocation MO and the SwAllocation MO is connected to a Slot MO, a Fan MO, a Jvm MO, a Webserver MO or an applicable type of application MO.
+b) The load module is of type 'other'.
+
+Returns an actionID (created by the server). This actionID shall be used to locate the result of the action in attribute
+actionResult.
+
+The required load modules will only be downloaded to the node if the Load Module MO representing the load module doesn't already exist.
+
+This action is non-blocking i.e. the action initiates the installation and returns 'void' immediately without waiting for the installation to be completed.
+
+The result of this action is indicated in the attribute ActionResult. In case the installation fails after 'void' has been returned the attribute 'ProgressHeader' is set to 'InstallationExecutionFailed'. Already downloaded load modules (the downloaded file and the Load Module MO representing it) are not removed at installation failure.long
+
+Note. The behaviour described for this action is also obtained for the other installation actions if the Upgrade Control File indicates that the upgrade package is of type selective (which is recommended).
+Note! This action does not require a transaction. </description>
+ <returnType>
+ <long/>
+ </returnType>
+ <raisesException name="ActionNotAllowedException"/>
+ <raisesException name="InstallException"/>
+ </action>
+ <action name="cancelInstall">
+ <description>This action interrupts an ongoing installation of an upgrade package.
+
+Already downloaded load modules (the downloaded file and the Load Module MO representing it) are not removed at execution of this action.
+
+This action is non-blocking i.e. the action initiates the cancel of the installation and returns 'void' immediately without waiting for the cancellation to be completed.
+
+During execution of this action the value of attribute 'ProgressHeader' is set to 'CancelOfInstallationIsExecuting'.
+
+In case the cancellation fails after 'void' has been returned this will be indicated by change of the value of attribute 'ProgressHeader' to 'CancelOfInstallationFailed'.
+
+Note! This action does not require a transaction.
+
+This action interrupts an ongoing installation of an upgrade package.
+Already downloaded load modules (the downloaded file and the Load Module MO representing it) are not removed at execution of this action.
+This action is non-blocking i.e. the action initiates the cancel of the installation and returns 'void' immediately without waiting for the cancellation to be completed.
+During execution of this action the value of attribute 'ProgressHeader' is set to 'CancelOfInstallationIsExecuting'.The result of this action is indicated in the attribute ActionResult.In case the cancellation fails after 'void' has been returned the attribute 'ProgressHeader' is set to 'CancelOfInstallationFailed'.
+
+This action returns an actionID (created by the server). This actionID shall be used to locate the result of the action in attribute actionResult.
+
+Note! This action does not require a transaction. </description>
+ <returnType>
+ <long/>
+ </returnType>
+ <raisesException name="ActionNotAllowedException"/>
+ </action>
+ <action name="clearUpgradeLogFile">
+ <description>Is used to clear the contents of current upgrade log file.
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="UpgradeLogFileNotInUseException"/>
+ <raisesException name="UpgradeLogFileNotAccessibleException"/>
+ </action>
+ </class>
+
+ <class name="Repertoire">
+ <description>The Repertoire is an abstraction of a functionality represented by a plug in unit type (PiuType MO) and one or more load modules (LoadModule MO). The repertoire also provides rules for PiuType/ Load Module combinations valid for a specific function where one function can be provided by one or many PiuType-Load Module combinations.
+These rules are used to load the correct software (Load Modules) to a PlugInUnit. This could be used as operator configuration support and/or in situations where automatic re-configuration is required (hot repair).
+
+MOs of this type are created automatically during system upgrade.
+MOs of this type are possible to create manually but a system upgrade is recommended to create them.</description>
+ <attribute name="userLabel">
+ <description>A user friendly name associated to the managed object. </description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="name">
+ <description>A function friendly name associated to the repertoire. The value must be unique with respect to all repertoires with the same install state.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="info">
+ <description>Information regarding the function.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="piuTypeList">
+ <description>A list containing all PiuType references that has been added to this repertoire.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="PiuType"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="RepertoireId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving SwAllocation MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="SwAllocation"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="OspfInterface">
+ <description>The OSPF Interface MO represents an interface that is used by the OSPF protocol to communicate with a neighbour node. By connecting an OSPF interface to a Link MO that Link is defined as a link to be used by OSPF.
+
+Each OspfInterface MO must always be connected to a OspfArea MO.
+</description>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ospfAreaRelated">
+ <description>The identity of the OspfArea connected to this OspfInterface. The default value is the default OspfArea MO.</description>
+ <dataType>
+ <moRef name="OspfArea"/>
+ </dataType>
+ </attribute>
+ <attribute name="lsaTransmissionInterval">
+ <description>The time, in seconds, between LSA re-transmissions over the interface - default value 5 seconds.</description>
+ <dataType>
+ <long>
+ <defaultValue>5</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="helloInterval">
+ <description>The time, in seconds, between sending OSPF Hello-packets over the interface. Default value 10 seconds.
+
+Note! Must be a positive value.</description>
+ <dataType>
+ <long>
+ <defaultValue>10</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="routerDeadInterval">
+ <description>The time, in seconds, after which a neighbor router is declared dead when not heard from.
+</description>
+ <dataType>
+ <long>
+ <defaultValue>40</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="interfaceTransitDelay">
+ <description>Estimated delay, in seconds, for the transmission of a link state update package over the interface.
+</description>
+ <dataType>
+ <long>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="interfacePriority">
+ <description>The interface priority. Each router is configured with a priority configured from 0 - 255 where 0 is the lowest priority and 255 the highest.
+
+Note! Must be a positive value.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="relatedLink">
+ <description>Each OSPF interface is connected to one IP link.
+The relatedLink can be either an IpAtmLink or an EthernetLink MO
+reference.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="OspfInterfaceId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfOspfIfEvents">
+ <description>Performance monitoring counter for the number of times this OSPF interface has changed its state or an error has occured.
+
+See RFC 1850.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Ospf">
+ <description>The Ospf MO represents an instance of the Open Shortest Path First (OSPF) routing protocol running in a Cello node.
+
+When the Ospf MO is created a default OspfArea MO is also created. This OspfArea has the areaId 000.000.000.000.
+
+The attribute range0 in the default OspfArea will contain the following values:
+advertise = false
+ipAddress = 000.000.000.000
+subnetMask = 000.000.000.000
+</description>
+ <attribute name="OspfId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ospfRouterId">
+ <description>The ospfRouterId attribute is in the form of an IP address.
+In order to able to set ospfRouterId the attribute
+administrativeState has to be set to locked. The ospfRouterId
+is uniquely identifying the router in the Autonomous System. By
+convention to ensure uniqueness, this should be configured to the
+value of one of the routers IP interface addresses.</description>
+ <mandatory/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="ospfASBdrRtrStatus">
+ <description>The ospfASBdrRtrStatus attribute controls, whether this router is configured as an Autonomous System border router (Routers connected to multiple areas are called area border routers). The attribute must be set to 'True' if the user wants to configure static routes, which should be distributed to other OSPF routes as external routes. Configuration of static routes is the same as adding and deleting static routes to the IpRoutingTable Mo.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the MO.
+The operationalState can only be enabled when the IP MO is in workingMode routerMode.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state of the MO.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="ospfAreaBdrRtrStatus">
+ <description>Area border router flag - indicates whether the router is acting as an area border router or not.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="ipMo">
+ <description>The name of the Ip MO that the Ospf MO is to use</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Ip"/>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled. It is a bit mapped CORBA long, where one or more of the bits may be set. If none of the bits are set then the availability status is considered to be undefined.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfOspfOriginateNewLsas">
+ <description>The number of new link-state advertisments that have been originated. This number is incremented each time the router originates a new LSA.
+
+For more detailed information, see RFC 1850.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfOspfRxNewLsas">
+ <description>The number of link-state advertisments received determined to be new instantiations. This number does not include newer instantiations of self-originated link-state advertisments.
+
+For more detailed information, see RFC 1850.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="recoverTopoDb">
+ <description>Indicates whether the topology database is to be recovered from the database at restart.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="topoDbStoreInterv">
+ <description>The interval, in seconds, with which the topology database will be stored.</description>
+ <dataType>
+ <long>
+ <defaultValue>60</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="OspfArea">
+ <description>An OSPF autonomous system is divided into OSPF areas. The OSPF Area MO represents such OSPF areas.
+
+A default OspfArea MO is automatically created when the Ospf MO is created.
+It has the identity = 1, so LDN of this MO will be
+ManagedElement=1,IpSystem=1,Ospf=1,OspfArea=1.
+
+Note! A maximum of 4 OspfAreas can be configured each with a maximum of 8 interfaces.</description>
+ <attribute name="OspfAreaId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="stubArea">
+ <description>Indicates whether the OSPF area is a stub area or not.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="importExternalLsa">
+ <description>Indicates whether importing Autonomous System external LSA's is supported.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="sendAreaSummary">
+ <description>Import Area summary - indicates whether the router will originate and propagate summary LSAs into a stub-area.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="stubAreaMetric">
+ <description>Cost for default route that the router advertises into the area if the area is a stub area and the router is an area border router. By default set to the least metric among the interfaces to other areas.</description>
+ <dataType>
+ <long>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="stubAreaMetricType">
+ <description>Stub Area metric type.
+
+RFC 1850 (OSPF V2 MIB):
+
+comparableCost (external type 1)
+nonComparable (external type 2)</description>
+ <dataType>
+ <enumRef name="OspfMetricType">
+ <defaultValue>comparableCost</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="areaLsaChecksum">
+ <description>Area Lsa checksum - 32-bit unsigned sum of the link-state advertisements LS check sums contained in this area's link-state database.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="areaId">
+ <description>The OSPF area identity in form of an IP address. This areId uniquely identifies the area.
+AreaId 0.0.0.0 is used for the OSPF backbone.
+Range: 000.000.000.000 to 255.255.255.255.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="range0">
+ <description>OspfArea IP address range zero (0).</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="OspfAreaRange"/>
+ </dataType>
+ </attribute>
+ <attribute name="range1">
+ <description>OspfArea IP address range one (1).</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <structRef name="OspfAreaRange"/>
+ </dataType>
+ </attribute>
+ <attribute name="range2">
+ <description>OspfArea IP address range two (2).</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <structRef name="OspfAreaRange"/>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfOspfSpfRuns">
+ <description>The number of times that the intra-area route table has been calculated using this area's link-state database. This is typically done using Dijkstra's algorithm.
+
+For more detailed information, see RFC 1850.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Holds a list of the reserving OspfInterface MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="OspfInterface"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <action name="addAreaRange">
+ <description>Add aggregation range. Used to add a range of IP addresses to an OSPF area.
+
+Note! This action requires a transaction.
+</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="range">
+ <description>The area range aggregation.</description>
+ <in/>
+ <dataType>
+ <structRef name="OspfAreaRange"/>
+ </dataType>
+ </parameter>
+ <parameter name="rangeIndex">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="AttrMissingAtCreateException"/>
+ <raisesException name="FroNotAccessibleException"/>
+ <raisesException name="FroRequestFailedException"/>
+ <raisesException name="NoSuchFieldException"/>
+ <raisesException name="ValueOutOfRangeException"/>
+ <raisesException name="WrongAttributeTypeException"/>
+ </action>
+ <action name="deleteAreaRange">
+ <description>Delete an IP address range. Used to remove a range of IP addresses from an OSPF area.
+
+Input is the area aggregation range index.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="rangeIndex">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="FroNotAccessibleException"/>
+ <raisesException name="FroRequestFailedException"/>
+ <raisesException name="ValueOutOfRangeException"/>
+ </action>
+ </class>
+
+ <class name="SwitchCoreUnit">
+ <description>The Switch Core Unit MO, SCU, represents the board specific HW on the SCB. This object collects HW failure on the board and sends alarms. It is also used for configuration of board specific FW.
+This board can only be fitted in slot 1 and 28 in a standards subrack.
+The board has a number of switch internal link ports.</description>
+ <notificationTypes>alarm</notificationTypes>
+ <attribute name="userLabel">
+ <description>user label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeStateSili">
+ <description>The administrative state of the switch internal link ports on the switch board. The attribute refers to all ports (locking will lock all ports, unlocking unlock all ports).
+SILI -switch internal link interface.
+</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalStateSil">
+ <description>Operational state indicates the the traffic handling capability of all ports as a group on the board, i.e it is enabled if one or more of the eight ports is enabled. The purpose of this attribute is only for test.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalStateSync">
+ <description>Operational State for network synchronization distribution.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatusSil">
+ <description>The availability status of the switch internal link (SIL) ports..
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatusSync">
+ <description>Availability state for network synchronization distribution.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="SwitchCoreUnitId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>A list of the reserving MO's.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="silPorts">
+ <description>The attribute provides a list of port numbers.
+The port number is between 0-7 and is used to read state of the switch internal port.
+See action getSilPortState, getOperState and getAvailState.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <long/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <action name="getSilPortState">
+ <description>Returns status of the switch internal link port, which is the same as the LEDs on the unit.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <enumRef name="SilPortState">
+ </enumRef>
+ </returnType>
+ <parameter name="portNr">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="getSilOperState">
+ <description>Returns operational status of the switch internal link port.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <enumRef name="OperState">
+ </enumRef>
+ </returnType>
+ <parameter name="portNr">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="getSilAvailState">
+ <description>Returns availability status of the switch internal link port.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <long/>
+ </returnType>
+ <parameter name="portNr">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ </class>
+
+ <class name="GeneralProcessorUnit">
+ <description>The General purpose Processor Unit MO, GPU, represents the board specific HW on the GPB; hard disk, ethernet and serial port etc.
+
+Note! The 'availabilityStatus' for the GeneralProcessorUnit MO is retreived from the PlugInUnit MO.</description>
+ <attribute name="GeneralProcessorUnitId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Indicates if the function provided by the managed object is capable of performing its normal functions or not.
+
+Note! The value for operationalState is retrived from the GeneralProcessorUnit's parent, i.e. the PlugInUnit.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="hdVolumeDSize">
+ <description>The total size in bytes of the D volume.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="hdVolumeDFreespace">
+ <description>The amount in bytes of freespace available on the D volume.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="hdVolumePSize">
+ <description>The total size in bytes of the P volume.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="hdVolumePFreespace">
+ <description>The amount in bytes of freespace available on the P volume.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Holds the identity of the reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Jvm">
+ <description>The JVM MO is used to represent the Java Virtual Machine. This object is used for configuration JVM parameters, including SW management of Java class libraries used in the machine.
+
+The local distinguished name of this MO is ManagedElement=1, Equipment=1, JVM=1.</description>
+ <systemCreated/>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="classpath">
+ <description>Current classpath, the JVM is using</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="admClasspath">
+ <description>New classpath that will be activated at next restart of JVM. The classpath has a directory, which contains the load module, i.e. the classpath references the load module.</description>
+ <dataType>
+ <sequence>
+ <moRef name="LoadModule"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="freeMemory">
+ <description>Free memory in the java machine, in bytes.
+
+NOTE: Before this value is read from the system the action 'garbageCollect' is invoked.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="totalMemory">
+ <description>Total amount of memory allocated to the java machine, in bytes.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="mopplets">
+ <description>Contains all classes that are to be initilised and started when the JVM restarts.
+
+Technical note: The specified classes must implement the se.ericsson.cello.moframework.Mopplet interface and be found in a jar/zip-file pointed out by the classpath.
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <string/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="main">
+ <description>Defines the start class name.
+e.g. "se.ericsson.cello.oms.Oms"</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="options">
+ <description>Current options:
+ -D&lt;property&gt;=&lt;value&gt; Set a system property value. Commonly java.class.path
+-Xms&lt;size&gt; Specify the size, in bytes, of the memory allocation pool.
+-Xss&lt;size&gt; Set thread stack size in bytes.
+-Xverify:[all | remote | none] Verify classes according to the suboption.
+ -Xverify:all verifies all classes.
+ -Xverify:remote verifies remote classes only.
+ -Xverify:none turns off class verification.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="JvmId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="properties">
+ <description>Determines the current system properties.
+
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <string/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="reliableProgramUniter">
+ <description>A reference to the ReliableProgramUniter that refers to the programs in the which the JVM executes.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ReliableProgramUniter"/>
+ </dataType>
+ </attribute>
+ <attribute name="admMain">
+ <description>New start class that will be activated at next restart of the JVM.
+e.g. "se.ericsson.cello.oms.Oms"</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="admOptions">
+ <description>This attribute is used when setting one or more administrative options.
+
+A set option is operational after the next Java Machine restart.
+
+See also attribute 'options'
+
+One or more options can be set, one option in each string of the
+sequence according to description below:
+
+Current options:
+ -D&lt;property&gt;=&lt;value&gt; Set a system property value. Commonly java.class.path
+-Xms&lt;size&gt; Specify the size, in bytes, of the memory allocation pool.
+-Xss&lt;size&gt; Set thread stack size in bytes.
+-Xverify:[all | remote | none] Verify classes according to the suboption.
+ -Xverify:all verifies all classes.
+ -Xverify:remote verifies remote classes only.
+ -Xverify:none turns off class verification.</description>
+ <dataType>
+ <sequence>
+ <string/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBySwAllocation">
+ <description>This attribute holds the identity of the reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="SwAllocation"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <action name="garbageCollect">
+ <description>Runs the garbage collector.
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="setProperty">
+ <description>Sets a system property (i.e. propertys in the operating system).
+Note! The valeus set with this action is not saved in the database.
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="name">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="value">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="restart">
+ <description>Restart of executing JVM instance.
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ </class>
+
+ <class name="SwitchFabric">
+ <description>This MO represents the switch of a Cello node. It is used for general switch configuration.
+
+The system creates automatically one instance of this MO at restart.
+
+Today, only a maximum of 32 Switch Modules MOs and 2 SwitchInternalLinks MOs per InternalLinkGroup MOs are allowed in a Cello node. However, in theory the switch addressing space in the system allows up to 256 SwitchModules MOs. This would then mean there are 255 InternalLinkGroup MOs, each of which is allowed 256 SwitchInternalLink MOs by the addressing.
+
+The local distinguished name of this MO is ManagedElement=1, SwitchFabric=1.
+
+</description>
+ <systemCreated/>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="SwitchFabricId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="SwitchModule">
+ <description>This MO represents two switch planes of one sub-rack, i.e. either the main switch or an external switch.
+
+Note! In a non-redundant system the administrativeStateSwitchPlaneA/B has to be set to locked for the non-present plane. </description>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="switchModuleNumber">
+ <description>Indicates the number of the switch module, SMN.
+
+switchModuleNumber &amp;gt;= 0
+
+The main switch module, with one or two TimingUnits, is given SMN = 0. SMN for extension switch modules depends on the port pair that the extension switch module is connected to in the main switch module.
+
+The SMN is calculated according to the following formula:
+
+Switch module number [1..255] = int (APN/2)*8 + ISL-port in main [1..8]
+
+APN - ASCC port number
+ISL - inter-switch link</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="secondSmnEvaluation">
+ <description>secondSmnEvaluation - There are two cables that
+are relevant for Switch Module Number (smn) numbering
+If the cabling is wrong secondSmnEvaluation
+will show the second opinion about smn.
+Under normal conditions secondSmnEvaluation = smn.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state of the switch module.
+
+Note! When setting the 'administrativeState' to shutting down a notification about that the state has changed to 'locked' will be sent towards the operator. There is however no guarantee that this operation has been succesful despite the notification and state change due to limitations in the resource layer
+</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>unlocked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeStateSwitchPlaneA">
+ <description>The administrative state of switch plane A.
+It is not allowed to lock both switch plane A and B.
+
+Note! When setting the 'administrativeState' to shutting down a notification about that the state has changed to 'locked' will be sent towards the operator. There is however no guarantee that this operation has been succesful despite the notification and state change due to limitations in the resource layer</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>unlocked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeStateSwitchPlaneB">
+ <description>The administrative state of switch plane B.
+It is not allowed to lock both switch plane A and B.
+
+Note! When setting the 'administrativeState' to shutting down a notification about that the state has changed to 'locked' will be sent towards the operator. There is however no guarantee that this operation has been succesful despite the notification and state change due to limitations in the resource layer</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>unlocked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the Switch Module. At least one of switch plane is enabled. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalStateSwitchPlaneA">
+ <description>The operational state of Switch Module plane A. The state is disabled if any switch ports is faulty. But switch may still be used.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalStateSwitchPlaneB">
+ <description>The operational state of Switch Module plane B. The state is disabled if any switch ports is faulty. But switch may still be used.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status of the Switch Module.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatusSwitchPlaneA">
+ <description>The availability status of the Switch Plane A.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatusSwitchPlaneB">
+ <description>The availability status of the Switch Plane B.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="activeSwitchPlane">
+ <description>The active switch plane: A, B. During multiple faults, both plan A and B may be used.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="ActiveSwitchPlane">
+ <defaultValue>switchPlaneA</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="SwitchModuleId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="InternalLinkGroup">
+ <description>The Internal Link Group MO represents all switch internal links connecting the main switch to an external switch.
+
+Switch internal links are automatically grouped in Reliable Groups for redundancy.</description>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="switchModuleNumber1">
+ <description>Reference to the SwitchModule MO that is interconnected by the link in the InternalLinkGroup.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="SwitchModule"/>
+ </dataType>
+ </attribute>
+ <attribute name="switchModuleNumber2">
+ <description>Reference to the SwitchModule MO that is interconnected by the link in the InternalLinkGroup.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="SwitchModule"/>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative status of internal link group.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>unlocked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational status of internal link group.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="InternalLinkGroupId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="getRlgLinks">
+ <description>Returns a list of resource instance identities of the switch internal links in the specified Reliable Group.
+
+The existing Reliable Groups are listed with action getReliableLinkGroups.
+
+Note! This action is transactional.</description>
+ <returnType>
+ <sequence>
+ <longlong/>
+ </sequence>
+ </returnType>
+ <parameter name="rlgNumber">
+ <description>Reliable link group number.</description>
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="getLinkStatus">
+ <description>Returns the status of the specified switch internal link, within the specified Reliable Group.
+
+Note! This action is transactional.</description>
+ <returnType>
+ <enumRef name="SwitchReliableGroup">
+ </enumRef>
+ </returnType>
+ <parameter name="instanceId">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <parameter name="rlgNumber">
+ <description>Reliable link group number.</description>
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="getReliableLinkGroups">
+ <description>Returns a sequence of Reliable Group numbers.
+
+Each Reliable Group is identified by a unique number which can be used to read out the identities of the switch internal links that are allocated to the Reliable Group. This is done with action getRlgLinks.
+
+The allocation of switch internal links to Reliable Groups is automatic.
+
+Note! This action is transactional.
+</description>
+ <returnType>
+ <sequence>
+ <long/>
+ </sequence>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ </class>
+
+ <class name="SwitchInternalLink">
+ <description>This MO represents a link interconnecting the from either a SCB or SXB port on the main switch to a SCB on an external switch.
+
+The main switch is located in the hub subrack.
+
+The SCB is represented by the SwitchCoreUnit MO, while the SXB is represented by the SwitchExtensionUnit MO.
+
+Switch internal links are automatically grouped in Reliable Groups for redundancy.</description>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="SwitchInternalLinkId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="plugInUnit1">
+ <description>The reference of one connection point for a SwitchCoreUnit or SwitchExtensionUnit.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="plugInUnit2">
+ <description>The reference of one connection point for a SwitchCoreUnit or SwitchExtensionUnit.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="siliport1">
+ <description>Switch internal port number on PlugInUnit1.
+
+Note!
+On a standard SCB/SXB board, the ports are labeled from the bottom to the top.
+
+Port nr -&gt; label:
+ '0' 'D'
+ '1' 'C'
+ '2' 'B'
+ '3' 'A'
+
+Also note that his mapping will change when adding/removing a board.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>3</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="siliport2">
+ <description>Switch internal port number on PlugInUnit2.
+
+Note!
+On a standard SCB/SXB board, the ports are labeled from the bottom to the top.
+
+Port nr -&gt; label:
+ '0' 'D'
+ '1' 'C'
+ '2' 'B'
+ '3' 'A'
+
+Also note that his mapping will change when adding/removing a board.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>3</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state of switch internal link.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>unlocked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalStateTraffic">
+ <description>The operational state of switch internal link. There is no traffic if the link is disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatusTraffic">
+ <description>The availabilityl status of switch internal link.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalStateSync">
+ <description>The operational state of sync link. There is no clock distribution if the link is disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatusSync">
+ <description>The availability state of sync link.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Etm4">
+ <description>This MO represents the hardware of the ET-M4 board type. It only represents the ET specific hardware, while the DBM module of the board is represented by the PlugInUnit MO.
+
+The ET-M4 board contains 2 physical ports that can be configured as either STM1(ETSI/TTC) or OC3C (ANSI). The board supports unchannelised ATM access (i.e. it maps ATMs cells directly into an SDH VC4 container).
+
+The board supports up to 1800 ATM VC connections.
+The number of terminated VPs are limited to 48/board.
+The board supports up to 750 VC UBR+ connections.
+
+The ET-M4 board contains 128 AAL2 multiplexers.
+The ET-M4 board supports up to 256 bidirectional F4/F5 PM flow per port.
+
+Note! IMA is not applicable for the ETM4 board.
+
+Note! The number of VCC TP+VPC TP with performance monitoring enabled (i.e. PM mode &lt;&gt; off) is restricted to 256 per board.
+
+Note! When using the Etm4 board the performance monitoring counters in the transmit direction found on the AtmPort MO does not show the following cells: CC cells and OAM FPM cells.</description>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Enabled or disabled according to the actual operational state of the hardware ETM4. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="Etm4Id">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="VpcTp">
+ <description>Virtual path connection termination point, VpcTp, is used to represent the point where the VPC and associated overhead (F4 OAM cells) are terminated/originated.
+
+Note! The performance monitoring counters in this MO is set to 0 when counterMode is set to PM_MODE_ON.
+In PM_MODE_OFF no information at all is retrived. So any value for pm-monitoring is measured from the time
+of setting counterMode to PM_MODE_ON.
+At node restart these performance monitoring counters is reset to 0.</description>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="VpcTpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>enabled or disabled according to the actual operational state of the VpcTp</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="continuityCheck">
+ <description>Continuity checking means that a cell is sent downstream when no user cell has been sent for a period of nominally 1 second. Continuity check both enables generation of CC cells as well as detection of LOC</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="counterMode">
+ <description>PM mode is set to indicate type of performance monitoring mode (i.e. activation of bidirectional PM measurements).
+
+</description>
+ <dataType>
+ <enumRef name="AtmCounterMode">
+ <defaultValue>PM_MODE_OFF</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="nomPmBlkSize">
+ <description>Nominal performance monitoring (PM) blocksize. The minimum number of ATM cells to send before sending a Forward Performance Monitoring, FPM, cell.
+</description>
+ <dataType>
+ <enumRef name="AtmNomPmBlkSize">
+ <defaultValue>NOM_PM_BLKSIZE_2_10</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwLostCells">
+ <description>Performance monitoring counter for number of lost forward cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwMissinsCells">
+ <description>Performance monitoring counter for number of forward missinserted cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwErrBlocks">
+ <description>Performance monitoring counter for number of forward errored blocks.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLostFpmCells">
+ <description>Performance monitoring counter for number of lost Forward Performance Monitoring, FPM, cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwLostCells">
+ <description>Performance monitoring counter for number of lost backward cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwMissinsCells">
+ <description>Performance monitoring counter for number of backward missinserted cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwErrBlocks">
+ <description>Performance monitoring counter for number of backward errored blocks.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLostBrCells">
+ <description>Performance monitoring counter for number of lost Backward Reporting, BR, cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="alarmReport">
+ <description>Attribute to decide what type of alarms to be reported.</description>
+ <dataType>
+ <enumRef name="AlarmReport">
+ <defaultValue>ALARM_LOC</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <action name="eteLoopBack">
+ <description>This action performs VC end to end loopback from this VpcTp.
+false=Failed, true=Succeded
+
+Note! This action requires a transaction.
+</description>
+ <returnType>
+ <boolean/>
+ </returnType>
+ </action>
+ </class>
+
+ <class name="VplTp">
+ <description>This MO is used to represent the termination of a VP link.
+
+Note that a maximum of 999 MO's of this type may be configured.
+
+Note! For information on how many VplTp's that can be configured under the AtmPort MO please refer to the board that is parent to the termination reserved by the AtmPort MO.
+
+The performance monitoring counters in the VplTp MO is set to 0 (zero) at start or restart of the node.
+When the value is to large to fit in to a long (31bit) the counter turns over and starts from 0 again.</description>
+ <attribute name="userLabel">
+ <description>This MOs user label.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="atmTrafficDescriptor">
+ <description>Reference to the Atm Traffic Descriptor.</description>
+ <mandatory/>
+ <dataType>
+ <moRef name="AtmTrafficDescriptor"/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>enabled or disabled according to the actual operational state of the VplTp.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="externalVpi">
+ <description>This is the virtual path identifier for the external ATM cells.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmReceivedAtmCells">
+ <description>Performance monitoring counter for number of received ATM cells for the VplTp.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmTransmittedAtmCells">
+ <description>Performance monitoring counter for number of transmitted ATM cells.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="VplTpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="TimingUnit">
+ <description>This MO represents a timing unit (reference clock) in the node.
+
+The corresponding Program shall be of LoadModuleLoaderType, SpmFpgaLoader.</description>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Operational state of TimingUnit</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status of the TimingUnit.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="TimingUnitId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="PiuType">
+ <description>The PiuType is an MO that holds product information about a PlugInUnit and the execution resources of the PlugInUnit. It is created/deleted during a software upgrade.
+The PiuType is used when creating execution MOs connected to a PlugInUnit and when allocating software to this resource.
+
+MOs of this type are created automatically during system upgrade.
+MOs of this type are possible to create manually but a system upgrade
+is recommended to create them.
+
+
+</description>
+ <attribute name="userLabel">
+ <description>A user friendly name associated to the managed object. </description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="productData">
+ <description>The productData describes the product number, short product revision, product name and product information of the PlugInUnit. The production date is not used.
+
+Trailing letters in the revision is recommended to be excluded in the PiuType. Example: R2B will be R2 without trailing letter, R2B/3 must be R2B/3 in the PiuType, R2B/A should be R2 in the PiuType.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="AdminProductData"/>
+ </dataType>
+ </attribute>
+ <attribute name="boardWidth">
+ <description>The width of the PlugInUnit board in steps of 5 mm.
+A PlugInUnit can use/cover more than the slot that it occupies.
+
+Example: boardWidth=3 corresponds to 3*5 = 15 mm.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long/>
+ </dataType>
+ </attribute>
+ <attribute name="airFlowData">
+ <description>Control value m3/h for the fan unit. Needed by cooling function.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="AirFlowData"/>
+ </dataType>
+ </attribute>
+ <attribute name="PiuTypeId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="role">
+ <description>The value will be MP if a board has the role of a Main processor.
+The value will be BP if a board has the role of a device board
+Otherwise the value will be OTHERS.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="PiuRole">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity's of the reserving MO's.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <action name="numberOfMoConfigurations">
+ <description>Returns the number of entries in the PIUTypeConfigurationArray.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <long/>
+ </returnType>
+ </action>
+ <action name="getMoConfiguration">
+ <description>Returns a struct of a specific MoConfiguration at a given index.
+The moConfiguration holds information about how to create the
+subordinate objects for a specific piu type.
+
+Precondition: 0 &lt;= index &lt;= numberOfMoConfigurations() - 1
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <structRef name="PiuTypeMOConfiguration"/>
+ </returnType>
+ <parameter name="index">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="InvalidIndexException"/>
+ </action>
+ </class>
+
+ <class name="SwAllocation">
+ <description>This MO is primarily used to handle data for automatic configuration of load modules. Automatic in the meaning that the system selects the appropriate load module and revision. A SWA may be related to a slot, indicating that a specific functionality is requested at this location. The SWA is manually created by the operator.
+
+The SWA object is related to (one or more) repertoires, which hold information on possible PIU-type/revisions and load module combinations.
+
+In some cases (e.g multi-purpose boards, boards with processor/FPGA-pools) it may not be possible to completely configure the PIU without instructions from the operator (e.g which load module runs on which processor/FPGA). In these cases a specialization of the SWA has to be designed in such a way that it can be manually configured.
+
+When a SwAllocation MO depends on a ManagedObject MO, this ManagedObject actually represents a RBS Fan.
+
+MOs of this type are created automatically during system upgrade.
+MOs of this type are possible to create manually but a system upgrade is recommended to create them.</description>
+ <attribute name="userLabel">
+ <description>Free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="role">
+ <description>The role of a slot/PIU. The role must be unique with respect to other SwAllocations in the node.
+
+This is a preparation to introduce predefined SwAllocation in future upgrade packages.</description>
+ <mandatory/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="repertoireList">
+ <description>A list of references to repertoires.</description>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="Repertoire"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="slotList">
+ <description>A list of references to mainly slots in a subrack, e.g. Slot or Fan MO. It may also refer to other objects handling auxiliary units, e.g. RBS Fan.</description>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="SwAllocationId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="addRepertoire">
+ <description>Adds the specifed repertoire to this list.
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="aRepertoire">
+ <in/>
+ <dataType>
+ <moRef name="Repertoire"/>
+ </dataType>
+ </parameter>
+ <raisesException name="IllegalArgumentTypeException"/>
+ </action>
+ <action name="deleteRepertoire">
+ <description>Removes the first occurrence of the specified repertoire from this list.
+
+Notw! This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="aRepertoire">
+ <in/>
+ <dataType>
+ <moRef name="Repertoire"/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="addSlot">
+ <description>Adds the specified Slot to the slotList.
+The slot can only be of type Slot MO, Fan MO, WebServer MO, JVM MO or an applicable type of application MO (e.g. for "RBS Fans").
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="aSlot">
+ <in/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </parameter>
+ <raisesException name="IllegalArgumentTypeException"/>
+ </action>
+ <action name="deleteSlot">
+ <description>Removes the first occurrence of the specified slot from this list.
+The slot can only be of type Slot MO, Fan MO, WebServer MO or an
+applicable type of application MO (e.g. for "RBS Fans").
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="aSlot">
+ <in/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="deleteAllRepertoires">
+ <description>Removes all repertoires from this list and sets its size to zero.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="deleteAllSlots">
+ <description>Removes all slots from this list and sets its size to zero.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="addSlots">
+ <description>Adds the specified Slot to the slotList.
+The slot can only be of type Slot MO, Fan MO, WebServer MO, JVM MO or an applicable type of application MO (e.g. for "RBS Fans").
+If the slot exists in the list, the object is ignored.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="managedObjects">
+ <in/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </parameter>
+ <raisesException name="IllegalArgumentTypeException"/>
+ </action>
+ <action name="addRepertoires">
+ <description>Adds the specifed repertoire to this list.
+
+If the repertoires exist in the list the repertoire is ignored.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="repertoire">
+ <in/>
+ <dataType>
+ <sequence>
+ <moRef name="Repertoire"/>
+ </sequence>
+ </dataType>
+ </parameter>
+ <raisesException name="IllegalArgumentTypeException"/>
+ </action>
+ </class>
+
+ <class name="MediumAccessUnit">
+ <description>The Medium Access Unit (MAU) MO represents the Ethernet transceiver function on a General Processor Board (GPB).
+
+Note! Ethernet links which are modelled by a MediumAccessUnit MO are used for O&amp;M IP traffic only. MediumAccessUnit MOs must not be configured under a GeneralProcessorUnit MO which have a IpAccessHostGpb referring to it.
+
+Note! This object is known in standards as "MediumAttachmentUnit".
+</description>
+ <attribute name="userLabel">
+ <description>Label for free use.
+</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Description of operational state which has an enumerated datatype</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="MediumAccessUnitId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="connectorLabel">
+ <description>This attribute is used by a management system to show the label on the port the connector is attached to.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <defaultValue>Eth</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDot3StatsLateCollisions">
+ <description>Performance management counter for the number of times that a collision was detected on the interface after the minimum length of a frame.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDot3StatsFCSErrors">
+ <description>Performance management counter for the number of frames that did not pass the FCS check.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="linkSpeed">
+ <description>The Link Speed, measurment unit is Mb/s..</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="duplexMode">
+ <description>The duplex mode used.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="MauDuplexMode">
+ <defaultValue>FULL_DUPLEX</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="ReliableProgramUniter">
+ <description>A Reliable Program Uniter (RPU) is a controlling and addressing entity providing one common addressing unit for two Reliable Programs. Or more correctly for parts of two Reliable Programs, each part is called a Resource Suite Handler (RSH). The RSH is implemented and owned by the application. It is not a function or a concept within Cello.
+
+MOs of this type are created automatically during system upgrade.
+MOs of this type are possible to create manually but a system upgrade
+is recommended to create them.</description>
+ <attribute name="userLabel">
+ <description>For free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="reliableProgramLabel">
+ <description>Reliable Program Label.
+Compare this to the reliableProgramLabel in LoadModule MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="admActiveSlot">
+ <description>Reference to slot, contains the running "Normal" relation to a slot. If the reference is set to the passive slot, the passive slot will be cleared and only one relation will be set.</description>
+ <mandatory/>
+ <dataType>
+ <moRef name="Slot"/>
+ </dataType>
+ </attribute>
+ <attribute name="admPassiveSlot">
+ <description>Reference to slot, contains the running "Stand-by" relation to a slot. If the reference is set to the active slot or a null value, the passive slot will be cleared. </description>
+ <dataType>
+ <moRef name="Slot"/>
+ </dataType>
+ </attribute>
+ <attribute name="switchOver">
+ <description>This attribute controls when to switchover the RPU, if a certain type error situation occurs.</description>
+ <dataType>
+ <enumRef name="RPUSwitchOverMode">
+ <defaultValue>AtPiuFault</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="normalisation">
+ <description>This attribute controls when to switch back the RPU, after error recovery has been done.</description>
+ <dataType>
+ <enumRef name="RPUNormalisationMode">
+ <defaultValue>Automatic</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="replication">
+ <description>This attribute indicates that which level of data replication that is associated with the RPU.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="RPUReplicationMode">
+ <defaultValue>ApplControlled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalMode">
+ <description>This attribute indicates if the RSH execution mode (active/passive) in the two Reliable Program, matches the normal/stand-by relations set on the corresponding RPU.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="RPUOperationalMode">
+ <defaultValue>Unavailable</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="ReliableProgramUniterId">
+ <mandatory/>
+ <noNotification/>
+ <nonPersistent/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <action name="switch">
+ <description>This action will force the two corresponding RSHs to change their execution mode (active/passive). It will lead either to a switchover or to a switchback, depending of what value the operational Mode attribute is showing.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="ActionNotAllowedException"/>
+ </action>
+ </class>
+
+ <class name="ManagedElementData">
+ <description>This object contains attributes and actions on Cello node-level.
+
+The ManagedElementData MO is automatically created and cannot be deleted.
+
+The local distinguished name of this MO is ManagedElement=1, ManagedElementData=1.</description>
+ <systemCreated/>
+ <attribute name="ManagedElementDataId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="autoConfigurationAllowed">
+ <description>This attribute specifies if the system is allowed to auto create detected objects. Note that slots will always be auto created.
+
+Note! When setting this attribute from true to false the system creates a new CV.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="documentServerAddress">
+ <description>The base URL for the documentation server (ALEX). The attribute is read by Element Management application to find the documentation server in the network.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="logonServerAddress">
+ <description>A list of node names or IP addresses of the single logon servers (SLSs). The list uses commas to seperate the single logon server addresses, e.g. "https://SLS1,https://SLS2,https://SLS3", these addresses consists of the URLs to the concerned SLS servers. The attribute is read by Element Management application to find the single logon server in the network.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="dhcpServerAddresses">
+ <description>IP addresses to the DHCP server, used by the DHCP Relay Agent.
+
+Default is an empty array.
+
+Adding and removing addresses is done through the actions addDhcpServerAddress() and removeDhcpServerAddress().
+
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <string>
+ <defaultValue>empty</defaultValue>
+ </string>
+ <length>10</length>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="performanceDataPath">
+ <description>This attribute is used by the internal performance management service
+to know where to store it's data files. The attribute is the name of
+a path in the node.
+
+Example: /c/public_html/cello/XML_files/</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ntpServerAddressPrimary">
+ <description>This is the IP address to the NTP server</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ntpServiceActivePrimary">
+ <description>This is a boolean that controls if the node should poll the primary NTP server for information.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="ntpMinPollPrimary">
+ <description>This value states the minimum interval (in seconds) for polling the primary NTP server.
+
+Note! This value has to be &gt; 0.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>16</min> <max>131072</max>
+ </range>
+ <defaultValue>64</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="ntpMaxPollPrimary">
+ <description>This value states the maximum interval (in seconds) for polling the primary NTP server.
+
+Note! This value has to be &gt; 0.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>16</min> <max>131072</max>
+ </range>
+ <defaultValue>1024</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="ntpBurstFlagPrimary">
+ <description>This is the burst flag used towards the primary NTP server.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="ntpServerAddressSecondary">
+ <description>This is an alternative IP address to a NTP server</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ntpServiceActiveSecondary">
+ <description>This is a boolean that controls if the node should poll the secondary NTP server for information.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="ntpMinPollSecondary">
+ <description>This value states the minimum interval (in seconds) for polling the secondary NTP server.
+
+Note! This value has to be &gt; 0.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>16</min> <max>131072</max>
+ </range>
+ <defaultValue>64</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="ntpMaxPollSecondary">
+ <description>This value states the maximum interval (in seconds) for polling the secondary NTP server.
+
+Note! This value has to be &gt; 0.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>16</min> <max>131072</max>
+ </range>
+ <defaultValue>1024</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="ntpBurstFlagSecondary">
+ <description>This is the burst flag used towards the secondary NTP server.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="nodeUTCTime">
+ <description>This attribute specifies the UTC time used in the node. The attribute value is milliseconds since epoch (January 1, 1970, 00:00:00 GMT).
+The value may only be set while ntpServiceActive both for primary and secondary is false.</description>
+ <dataType>
+ <longlong>
+ <defaultValue>0</defaultValue>
+ </longlong>
+ </dataType>
+ </attribute>
+ <attribute name="nodeLocalTimeZone">
+ <description>This value states in what time zone the node is located. This attribute is needed by management application to convert UTC time from a log or NTP service to local time.
+It will not change the real time clock on the node.
+
+The timeZone is represented by three characters, example GMT.
+
+Available options are:
+
+TimeZone ID Offset
+GMT (Greenwich Mean Time) 0
+UTC (Coordinated Universal Time) 0
+ECT ( Central European Standard Time) + 1
+EET (Eastern European Time) + 2
+ART (Eastern European Time) + 2
+EAT (Eastern African Time) + 3
+MET (Iran Time) + 3.5
+NET (Armenia Time) + 4
+PLT (Pakistan Time) + 5
+IST (India Standard Time) + 5.5
+BST (Bangladesh Time) + 6
+VST (Indochina Time) + 7
+CTT (China Standard Time) + 8
+JST (Japan Standard Time) + 9
+CST (Central Standard Time) + 9.5
+EST (Eastern Standard Time) + 10
+AET (Eastern Standard Time) + 10
+SST (Solomon Is. Time) + 11
+NST (New Zealand Standard Time) + 12
+CAT (Central Alaska Time) - 1
+AGT (Argentina Time) - 3
+BET (Brazil Time) - 3
+CNT (Newfoundland Standard Time) - 3.5
+PRT (Atlantic Standard Time) - 4
+IET (Eastern Standard Time) - 5
+ACT (Central Standard Time) - 6
+PNT (Mountain Standard Time) - 7
+MST (Mountain Standard Time) - 7
+PST (Pacific Standard Time) - 8
+AST (Alaska Standard Time) - 9
+HST (Hawaii Standard Time) - 10
+MIT (West Saoma Time) - 11
+--
+
+Reference: http://www.greenwichmeantime.com
+</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="daylightSavingTime">
+ <description>This attribute states weather daylight saving time is used on this node. It is used to by the management application and will not change the real time clock on the node.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="hdVolumeCSize">
+ <description>The total size of the C volume on the Cello node in bytes. The C volume may be replicated on several hard disks.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="hdVolumeCFreespace">
+ <description>The number of bytes of free space available on the C volume. The C volume may be replicated on several hard disks in a Cello node.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="nodeUniqueID">
+ <description>This is a unique node identity to be set only in the factory.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="swServerUrlList">
+ <description>A list of URLs of external server for downloading of software. A comma-separated list or URLs, complete with path and name of property file.
+
+Note: For downloading of software for system upgrade, see attribute ftpServerIpAddress in MO UpdradePackage.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="piuGroupEscalationType">
+ <description>The type of node restart when it is a problem with the last PIU in a PIU group.</description>
+ <dataType>
+ <enumRef name="NodeRestartType">
+ <defaultValue>WARM_AT_PIU_RESTART</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="syncModeOperation">
+ <description>The sync mode operation of the node. Note that this attribute is only relevant when the node contains CBU board. For all other cases the value shall be set to NOT_USED.</description>
+ <dataType>
+ <enumRef name="SyncMode">
+ <defaultValue>NOT_USED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <action name="createNtpPrimary">
+ <description>This action creates the primary Network Time Protocol. There can only exist one primary and one secondary ntp.
+
+Once the ntp is created it is possible to change the attributes, i.e ip address, burst flag, max- and min poll and which is the active one.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="ntpServerAddressPrimary">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="ntpMinPollPrimary">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <parameter name="ntpMaxPollPrimary">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <parameter name="ntpBurstFlagPrimary">
+ <in/>
+ <dataType>
+ <boolean/>
+ </dataType>
+ </parameter>
+ <parameter name="ntpServiceActivePrimary">
+ <in/>
+ <dataType>
+ <boolean/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="createNtpSecondary">
+ <description>This action creates the secondary/alterative Network Time Protocol.
+There can only exist one primary and one secondary ntp.
+
+Once the ntp is created it is possible to change the attributes, i.e ip address, burst flag, max- and min poll and which is the active one.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="ntpServerAddressSecondary">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="ntpMinPollSecondary">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <parameter name="ntpMaxPollSecondary">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <parameter name="ntpBurstFlagSecondary">
+ <in/>
+ <dataType>
+ <boolean/>
+ </dataType>
+ </parameter>
+ <parameter name="ntpServiceActiveSecondary">
+ <in/>
+ <dataType>
+ <boolean/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="deleteNtpPrimary">
+ <description>This action deletes the primary NTP.
+
+An exception will be thrown if the primary attributes are accessed (set and get).
+
+Note! This action requires a transaction.
+</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="deleteNtpSecondary">
+ <description>This action deletes the secondary NTP.
+
+An exception will be thrown if the secondary attributes are accessed (set and get).
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="addDhcpServerAddress">
+ <description>Takes an array of Ip addresses (Strings), and adds them to the list held by the Dhcp Relay Agent fRO.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="ipAddressArray">
+ <description>Elements are assumed to have the format of a String with 4 fields of numerics, each field separated with a dot. E.g. 123.322.34.123. An empty array or empty string in first element is not allowed. Max 10 elements.</description>
+ <in/>
+ <dataType>
+ <sequence>
+ <string/>
+ </sequence>
+ </dataType>
+ </parameter>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="removeDhcpServerAddress">
+ <description>Takes an array of Ip addresses (Strings), and removes them from the list held by the Dhcp Relay Agent fRO.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="ipAddressArray">
+ <description>Elements are assumed to have the format of a String with 4 fields of numerics, each field separated with a dot. E.g. 123.322.34.123. An empty array or empty string in first element is not allowed. Max 10 elements.</description>
+ <in/>
+ <dataType>
+ <sequence>
+ <string/>
+ </sequence>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="setNodeUniqueId">
+ <description>Used for setting the nodeUniqueId attribute. This method should only be used in the factory, i.e. it is not for general use by the operator.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="nodeUniqueId">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ </action>
+ </class>
+
+ <class name="SwitchExtensionUnit">
+ <description>This MO represents the Switch Extension Unit, SXU, board. The board may only be inserted in slot 2-27 (in a standard subrack).
+If redundant links are used, two boards must be inserted next to each other.
+The board has a number of switch internal link ports.</description>
+ <attribute name="SwitchExtensionUnitId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>This attribute is used to hold a user friendly name of the object if needed.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeStateSil">
+ <description>The administrative state of switch internal link ports on the switch board.
+The attribute refers to all ports (locking will lock all ports, unlocking will unlock all ports).
+SIL- switch internal link.
+
+</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>unlocked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalStateSil">
+ <description>Operational State for all ports. Operational state is enabled if one of the eight ports is enabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalStateSync">
+ <description>Operational State for network synchronization distribution</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatusSil">
+ <description>The availability state of switch internal link (sil) ports.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatusSync">
+ <description>The availability state of the sync link.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The attribute is set by the action Reserve.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="SilPorts">
+ <description>The attribute provides a list of port numbers.
+The port number is between 0-7 and is used to read state of the switch internal port.
+Se action getSilPortState, getSilOperState and getSilAvailState.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <long/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <action name="getSilPortState">
+ <description>Returns status of the switch internal link port.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <enumRef name="SilPortState">
+ </enumRef>
+ </returnType>
+ <parameter name="portNr">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="getSilOperState">
+ <description>Returns operational status of the switch internal link port.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <enumRef name="OperState">
+ </enumRef>
+ </returnType>
+ <parameter name="portNr">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="getSilAvailState">
+ <description>Returns availability status of the switch internal link port.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <long/>
+ </returnType>
+ <parameter name="portNr">
+ <in/>
+ <dataType>
+ <long/>
+ </dataType>
+ </parameter>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ </class>
+
+ <class name="Aal2PathDistributionUnit">
+ <description>This MO is used to represent an AAL2 Path Distribution Unit. Such a unit handles a set of Aal2PathVccTps that belong to the same Aal2 AP and that are handled by the same Path Resource Handling Program.
+This Path Resource Handling Program is referenced by the rpuId attribute.</description>
+ <attribute name="Aal2PathDistributionUnitId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="rpuId">
+ <description>The physical location of a CPS RC (Common Part Sub-Layer Resource Control) program represented by a reference to a ReliableProgramUniter.
+
+Note that one ReliableProgramUniter MO may only be referenced once under one Aal2Ap. That means all Aal2PathDistributionUnits must reference different ReliableProgramUniter MO's.
+
+Two Aal2PathDistributionUnits under different Aal2Ap's may however reference the same ReliableProgramUniter MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ReliableProgramUniter"/>
+ </dataType>
+ </attribute>
+ <attribute name="aal2PathVccTpList">
+ <description>List of references to Aal2PathVccTp MO:s.
+Note that setting of this attribute removes the current list of Aal2PathVccTp's.
+Each reference must be unique among all paths within all Aal2PathDistributionUnit's belonging to the same Aal2Ap.</description>
+ <dataType>
+ <sequence>
+ <moRef name="Aal2PathVccTp"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <action name="addPath">
+ <description>This action adds a list of Aal2PathVccTps to an Aal2PathDistributionUnit.
+
+If the data contains a reference to a non existing path, the exception InvalidReference is raised.
+
+If the path list contains a path that has a non-unique aal2PathId value, then the exception Aal2PathIdNotUnique is raised. The pathId value must be unique within all Aal2PathDistributionUnits under the same Aal2Ap.
+
+If the path list contains a path that already belongs to a Aal2PathDistributionUnit, then the exception PathAlreadyRegistered is raised.
+
+Note! Adding one or more Aal2PathVccTps using this action updates the attribute 'Aal2PathVccTpList'.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="aal2PathVccTpId">
+ <in/>
+ <dataType>
+ <sequence>
+ <moRef name="Aal2PathVccTp"/>
+ </sequence>
+ </dataType>
+ </parameter>
+ <raisesException name="InvalidReferenceException"/>
+ <raisesException name="Aal2PathIdNotUniqueException"/>
+ <raisesException name="PathAlreadyRegisteredException"/>
+ </action>
+ <action name="removePath">
+ <description>This action removes a list (sequence) of AAL2 path's from the Aal2PathDistributionUnit.
+
+If the path list contains a path that is not in this Aal2PathDistributionUnit, the exception NotInGroup is raised.
+
+Note! Removing one or more Aal2PathVccTps using this action updates the attribute 'Aal2PathVccTpList'.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="aal2PathList">
+ <in/>
+ <dataType>
+ <sequence>
+ <moRef name="Aal2PathVccTp"/>
+ </sequence>
+ </dataType>
+ </parameter>
+ <raisesException name="NotInGroupException"/>
+ </action>
+ </class>
+
+ <class name="Fan">
+ <description>The Fan is used for cooling the Cello-subrack and is connected to one or two
+SCU (switch core board). This MO is used for controlling and sending alarm from
+the Fan.
+
+Note, either the fan can be supplied by Cello and Fan MO is used, or alternatively the fan can supplied by a source external to Cello and therefore a ManagedObject MO is used to represent the fan.
+
+</description>
+ <attribute name="FanId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>user label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrativeState of Fan MO.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="connectedToScu">
+ <description>A Fan must always be connected to a Switch Core unit that mediates the communication with a main processor.
+
+In this attribute it is possible to see which SwichCoreUnit that the fan is connected to.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="SwitchCoreUnit"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state is set to 'enabled' when the Fan has loaded and started its load module.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="piuType">
+ <description>A reference to an available PiuType at create of a Fan.
+</description>
+ <mandatory/>
+ <dataType>
+ <moRef name="PiuType"/>
+ </dataType>
+ </attribute>
+ <attribute name="controllingState">
+ <description>The application that controls the Fan has three main states:
+- standalone: running on itself, not manageable
+- autonomous: manageable state
+- noiseReduced: temporary state with reduced cooling
+
+NOTE: This attribute is not supported in CPP 4.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="FanState">
+ <defaultValue>standalone</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="hdlcAddress">
+ <description>The physical address of the RS-485 communication link.
+Incorrect setting of the address can cause collision with other connected auxiliary units or lost connection. The default value should be suitable for most configurations.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>255</max>
+ </range>
+ <defaultValue>7</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving MO. </description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <action name="restartFan">
+ <description>A restart will cause the Fan to be initiated, re-booted and all load modules to be reloaded from persistent memory. This is also known as a forced reload.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="restartCause">
+ <in/>
+ <dataType>
+ <enumRef name="RestartCause">
+ </enumRef>
+ </dataType>
+ </parameter>
+ <raisesException name="EquipException"/>
+ <raisesException name="ValueOutOfRangeException"/>
+ </action>
+ </class>
+
+ <class name="Mtp2TpItu">
+ <description>This MO represents a MTP2 Termination Point for the ITU standard, as defined in Recommendation Q.703 07/96.
+
+The performance monitoring counters found in Mtp2Itu MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is a hardware fault, aal1 server/adm restart or node restart.
+
+NOTE: This MO cannot in anyway be related (either contain or by dependence) to an MO that belongs to a standard
+which is NOT the ITU standard.
+
+NOTE: There is a restriction of a maximum of 32 Mtp2Tp's per MP.</description>
+ <attribute name="userLabel">
+ <description>Free tag for marking this managed object.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="Mtp2TpItuId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the MTP2 Signalling Terminal.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="mtp2ProfileItuId">
+ <description>Reference to a Mtp2ProfileItu MO.
+
+Note: The bitRate can not be changed.</description>
+ <mandatory/>
+ <noNotification/>
+ <dataType>
+ <moRef name="Mtp2ProfileItu"/>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfReTransmittedOctets">
+ <description>Number of re-transmitted octets.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfNacks">
+ <description>Number of negative acknowledgements received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuReceivedInError">
+ <description>Number of signal units received in error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfStartedRBCongestion">
+ <description>Number of started local RB congestions.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSendBufferOctets">
+ <description>Number of octets in send buffer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLocalSIBTime">
+ <description>Total time in local SIB (Sending).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmRemoteSIBTime">
+ <description>Total time in remote SIB (Receiving).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSIOSIFTransmitted">
+ <description>Number of SIO &amp; SIF octets transmitted.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The attribute is set by the list of reserving MO's.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Mtp3bSlItu"/>
+ </dataType>
+ </attribute>
+ <attribute name="ds0BundleId">
+ <description>The Ds0Bundle MO that this MO references.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Ds0Bundle"/>
+ </dataType>
+ </attribute>
+ <attribute name="plugInUnitId">
+ <description>The PlugInUnit MO that this MO references.
+It indicates on which processor the Termination Point will be.
+
+Note: The PlugInUnit must be of type GPB.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="PlugInUnit"/>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSUTransmitted">
+ <description>Number of MSUs transmitted.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSIOSIFReceived">
+ <description>Number of SIO and SIF octets received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSUReceived">
+ <description>Number of MSUs received..</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mtp2TpAnsi">
+ <description>This MO represents a MTP2 Termination Point for the ANSI standard , as defined in T1.111-1996.
+
+The performance monitoring counters found in Mtp2Ansi MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is a hardware fault, aal1 server/adm restart or node restart.
+
+NOTE: This MO cannot in anyway be related (either contained by or dependent on) an MO that belongs to a
+standard which is NOT the ANSI standard.
+
+NOTE: There is a restriction of a maximum of 32 Mtp2Tp's per MP.</description>
+ <attribute name="userLabel">
+ <description>Free tag for marking this managed object.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="Mtp2TpAnsiId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the MTP2 Signalling Terminal.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="mtp2ProfileAnsiId">
+ <description>Reference to a Mtp2ProfileAnsi MO.
+
+Note: The bitRate can not be changed.</description>
+ <mandatory/>
+ <noNotification/>
+ <dataType>
+ <moRef name="Mtp2ProfileAnsi"/>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfReTransmittedOctets">
+ <description>Number of re-transmitted octets.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfNacks">
+ <description>Number of negative acknowledgements received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuReceivedInError">
+ <description>Number of signal units received in error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfStartedRBCongestion">
+ <description>Number of started local RB congestions.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSendBufferOctets">
+ <description>Number of octets in send buffer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLocalSIBTime">
+ <description>Total time in local SIB (Sending).
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmRemoteSIBTime">
+ <description>Total time in remote SIB (Receiving).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSIOSIFTransmitted">
+ <description>Number of SIO &amp; SIF octets transmitted.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSUReceived">
+ <description>Number of MSUs received..</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Mtp3bSlAnsi"/>
+ </dataType>
+ </attribute>
+ <attribute name="ds0BundleId">
+ <description>The Ds0Bundle MO that this MO references.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Ds0Bundle"/>
+ </dataType>
+ </attribute>
+ <attribute name="plugInUnitId">
+ <description>The PlugInUnit MO that this MO references.
+It indicates on which processor the Termination Point will be.
+
+Note: The PlugInUnit must be of type GPB.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="PlugInUnit"/>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSUTransmitted">
+ <description>Number of MSUs transmitted.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSIOSIFReceived">
+ <description>Number of SIO and SIF octets received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Ds0Bundle">
+ <description>The Ds0Bundle, Digital Signalling Level 0, MO represents a number of timeslots on a physical port.
+Any of E1PhysPathTerm, J1PhysPathTerm, T1PhysPathTerm, E1Ttp or T1Ttp.
+The Ds0Bundle can be used in three different ways:
+
+- Fractional ATM
+
+Please refer to the AtmPort MO for details. Note that the TdmMode attribute
+must be disabled.
+
+-Circuit emulation
+
+Please refer to Aal1VccTp MO for details. Note that the TdmMode attribute
+must be disabled. Note that only 4 Ds0Bundle's per port can be configured
+when running circuit emulation.
+
+- TDM Switching
+
+The Ds0Bundle is reserved for switching node internal Ds0 connections. In
+this mode, the tdmMode attribute should be enabled.
+
+
+</description>
+ <attribute name="Ds0BundleId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Free tag for marking this managed object.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availabiltity status of Ds0Bundle.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of Ds0Bundle.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="listOfTimeSlots">
+ <description>The list gives the time slots (within ATM traffic fraction) that are to be allocated to the Ds0Bundle.
+
+When a Ds0Bundle is contained by a E1PhysPathTerm the slots that can be placed in this list are 1 to 31.
+When a Ds0Bundle is contained by a J1PhysPathTerm then the slots that can be placed in this list are 1 to 24.
+When a Ds0Bundle is contained by a T1PhysPathTerm then the slots that can be placed in this list are 1 to 24.
+When a Ds0Bundle is contained by a E1Ttp the slots that can be placed in this list are 1 to 31.
+
+Note: the same timeslot cannot appear more than once in the list! If a E1/J/T1PhysPathTerm contains more than
+one Ds0Bundle, then the Ds0Bundles listOfTimeSlots must be mutually exclusive (i.e. slots in one list cannot be used in another list).
+
+Note! If the Ds0Bundle is used for carrying SS7 traffic, the listOfTimeSlots can only contain 1 (one) time slot.
+In this case that is if the Ds0Bundle is reserved by an Mtp2TpAnsi, Mtp2TpItu or Mtp2TpChina.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <sequence>
+ <long>
+ <range>
+ <min>0</min> <max>31</max>
+ </range>
+ </long>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="tdmMode">
+ <description>The state of tdmMode (Time Division Multiplexing), can be disabled/enabled.
+
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <boolean/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Aal1TpVccTp">
+ <description>The Aal1TpVccTp MO represents the Aal1 interworking function in a circuit emulation. The object refers to a Ds0Bundle which represents one end of the circuit emulation, and a VclTp which represents the other end.
+
+Note! The performance monitoring counters in this MO is set to 0 when counterMode is set to PM_MODE_ON.
+In PM_MODE_OFF no information at all is retrived. So any value for pm-monitoring is measured from the time
+of setting counterMode to PM_MODE_ON.
+At node restart these performance monitoring counters is reset to 0.</description>
+ <attribute name="userLabel">
+ <description>Free tag for marking this managed object.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ds0BundleId">
+ <description>The Ds0Bundle MO that this MO references.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Ds0Bundle"/>
+ </dataType>
+ </attribute>
+ <attribute name="partialFill">
+ <description>Indicates how many bytes are filled in each ATM cell. The value 47 indicates that the partial filled cells is not used, i.e. all the cells are filled completely.
+
+Partial filling of cells in used in circuit emulation. It is used to reduce packetisation delay. Refer to the ATM Forum specifications for more details.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>23</min> <max>47</max>
+ </range>
+ <defaultValue>47</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="cdvt">
+ <description>Specifies the cell delay variation tolerance. Refer to ATM Forum specifications for more details.
+
+Unit is micro seconds.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>100</min> <max>4000</max>
+ </range>
+ <defaultValue>1000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of Aal1TpVccTp.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="continuityCheck">
+ <description>Continuitiy checking means that a cell is sent downstream when no user cell has been sent for a period of nominally 1 second.
+
+Activates VC end to end continuityCheck according to ITU.T rec I.610.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="counterMode">
+ <description>Controls the activation of PM counters and F5 PM flow on the VC connection.</description>
+ <dataType>
+ <enumRef name="AtmCounterMode">
+ <defaultValue>PM_MODE_OFF</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="nomPmBlockSize">
+ <description>Nominal performance monitoring (PM) blocksize. The minimum number of ATM cells to send before sending a Forward Performance Monitoring, FPM, cell.</description>
+ <dataType>
+ <enumRef name="AtmNomPmBlkSize">
+ <defaultValue>NOM_PM_BLKSIZE_2_10</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwLostCells">
+ <description>Performance monitoring counter for forwarded lost cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwMissinsCells">
+ <description>Performance monitoring counter for number of forwarded missinserted cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmFwErrBlocks">
+ <description>Performance monitoring counter for number of forwarded errored blocks.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLostFpmCells">
+ <description>Performance monitoring counter for number of lost Forward Performance Monitoring, FPM cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwLostCells">
+ <description>Performance monitoring counter for number of lost backward cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwMissinsCells">
+ <description>Performance monitoring counter for number of backward missinserted cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmBwErrBlocks">
+ <description>Performance monitoring counter for number of backward errored blocks.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmLostBrCells">
+ <description>Performance monitoring counter for number of lost Backward Reporting, BR, cells.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="Aal1TpVccTpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="vclTpId">
+ <description>The VclTp MO that this MO references.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="VclTp"/>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="alarmReport">
+ <description>Attribute to decide what type of alarms to be reported.</description>
+ <dataType>
+ <enumRef name="AlarmReport">
+ <defaultValue>ALARM_LOC</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mtp3bSpAnsi">
+ <description>Mtp3b Signalling Point for the ANSI standard.
+
+This MO represents/models the MTP3b Signaling Point characteristics/functions according to the Ansi standard.
+A signaling point is a logical node in the signaling network. The combination of signaling points and their interconnecting
+signaling links form the SS No. 7 signaling network. The signaling point represented by this object is a Local Signaling Point.
+
+The performance monitoring counters found in Mtp3SpAnsi MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is shutdown request from CLI (Cluster Interface).
+
+NOTE: IT IS NOT POSSIBLE TO CREATE SIGNALLING POINTS OF DIFFERENT STANDARDS!
+
+NOTE: This MO cannot in anyway be related (either contain or by dependence) to an MO that belongs to a standard which is NOT the ANSI standard.
+
+NOTE: The combination of network indicator (networkInd) and Signalling Point Code (signallingPointCode) has to be unique for each Signalling Point.
+
+NOTE: A maximum of 15 instances of this MO can be created on (referencing) the same PlugInUnit.
+
+NOTE: The maximum number of Signalling Points that can be created in a CPP based node is 24.
+
+NOTE: Deleting a singel L3 Signal Point is not possible, if it necessary to delete a Signal Point then all Signal Points has to be deleted. This also has to be done whitin the same transaction.
+
+NOTE: Any object created under a certain SP (Signaling Point) cannot refer to an object created under another SP. Nor can it refer to an object created under another SP.</description>
+ <attribute name="Mtp3bSpAnsiId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="rpuId">
+ <description>Holds a reference to the Reliable Program Uniter.
+The RPU is at the server.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ReliableProgramUniter"/>
+ </dataType>
+ </attribute>
+ <attribute name="networkInd">
+ <description>The network indicator, NI, is used for discrimination of messages between functionally different networks.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="Mtp3bNetworkInd">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="signallingPointCode">
+ <description>The signallingPointCode (Local Point Code) attribute (SPC) is used together with the network indicator (NI, networkInd attribute) to uniquely identify the MTP Signalling Point, SP.
+SP = NI-SPC.
+Size (2 exp 24)-1 (16777215).
+The SignallingPointCode (SPC) is normally grouped together as three numbers wich correspond to network identifier, network cluster, network cluster member. The three numbers are coded as 8-8-8 bits in the total SPC. To enter the SPC-value, you have to convert the 3 numbers to their binary code and then convert the whole 24-bit patterna as an integer. Sometimes the SPC is used as a whole uniqe number (no internal structure).
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>16777215</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="testPatternSltm">
+ <description>The testPatternSltm attribute represents a string testpattern in the Signalling Link Test Message.
+
+Minimum string length 2 characters, maximum 30 characters. Allowed characters are 0-9, A-F.
+Only even number of characters is allowed.</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>2</min> <max>30</max>
+ </lengthRange>
+ <defaultValue>"A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5"</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="nodeBehaviour">
+ <description>The nodeBehaviour attribute represents the MTP3b node type.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="NodeBehaviourType">
+ <defaultValue>SEP</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="maxSizeReroutBuf">
+ <description>The maxSizeReroutBuf attribute represents the maximum size (in kB) of the rerouting buffer.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>5000</max>
+ </range>
+ <defaultValue>2000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxSizeChangeBuf">
+ <description>The maxSizeChangeBuf attribute represents the maximum size (in kB) of the changeover buffer.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>5000</max>
+ </range>
+ <defaultValue>2000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="transFrHandler">
+ <description>Determines how a TransFer Restricted signal (TFR) should be treated.
+</description>
+ <dataType>
+ <enumRef name="Mtp3bTfrHandling">
+ <defaultValue>IGNORED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="sioSpare">
+ <description>The sioSpare2 attribute determines if the two spare bits in the SIO (Service Information Octet) should be treated as spare.</description>
+ <dataType>
+ <enumRef name="Mtp3bSioSpareBitsUse">
+ <defaultValue>PRIO</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="m3uaNoOfAttempsOfDauds">
+ <description>For M3UA, number of attempts to send the DAUD message.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="noOfAttempsOfAssociationEstablishment">
+ <description>Number of attempts to send the SCTP_ASSOCIATE_REQ message.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>65535</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="statusIndInterval">
+ <description>The statusIndInterval attribute sets the interval for sending MTP-STATUS indication, i.e. send indication every Nth message .</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="resendTfcInterval">
+ <description>Send TFC back to originating signalling point code for every n:th message when
+the destination is congested. Set to 0 will suppress sending of TFC.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="sendSltmBefLink">
+ <description>The sendSltmBefLink attribute determines if the SLTM (Signalling Link Test Message) should be sent and a SLTA received before the link is considered to be in service.
+
+Note! It is not recommended nor is it in accordance with standard to set the value of this attribute to 'false' </description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="spPriority">
+ <description>Struct containing the ANSI priority attributes.
+</description>
+ <dataType>
+ <structRef name="Mtp3bSpAnsiPriorityData"/>
+ </dataType>
+ </attribute>
+ <attribute name="noOfCongestLevelForNI">
+ <description>Defines the number of congestion levels for NI.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>3</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="routeSetCongestTestFlag">
+ <description>Selection of which procedure to use during congestion handling if the national option with priorities is used.
+
+0, use TcTimer as described by the TTC standard.
+1, use Route Set Congestion Test as described by the ANSI, ITU and China Standard.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operationalState attribute reflects the operational status of the MTP3b SP.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="spTimer">
+ <description>Struct containing ANSI specific timer data.</description>
+ <dataType>
+ <structRef name="Mtp3bSpAnsiTimerData"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Holds a list of the reserving MO's. Can be of type SccpSp.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfForcedRerouteSuccessPerf">
+ <description>Performance monitoring counter for number of successfully performed forced rerouting.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfControlledRerouteSuccessPerf">
+ <description>Performance monitoring counter for number of successfully performed controlled rerouting.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfEmergencyChangeOverRec">
+ <description>Performance management counter for number of received emergency changeOver orders (ECO) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfChangeOverRec">
+ <description>Performance counter for number of changeOver order messages (COO/XCO) received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfChangeBackDeclRec">
+ <description>Performance management counter for number of received change Back Declarations (CBD) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSLTAFirstTimeOutRec">
+ <description>Performance management counter for number of SLTA first time out received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSLTASecondTimeOutRec">
+ <description>Performance management counter for number of SLTA second time out received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUPMsgDiscardedDueToRoutingErr">
+ <description>Performance monitoring counter for number of UP (user part) messages (MTP_TRANSFER_req) discarded due to routing error.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOAXCASent">
+ <description>Performance management counter for number of sent COA/XCA messages.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECOSent">
+ <description>Performance management counter for number of sent ECO messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECASent">
+ <description>Performance management counter for number of sent ECA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOAXCARec">
+ <description>Performance management counter for number of received COA/XCA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBARec">
+ <description>Performance management counter for number of received CBA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECARec">
+ <description>Performance management counter for number of received ECA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTRARec">
+ <description>Performance management counter for number of received TRA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTRASent">
+ <description>Performance management counter for number of sent TRA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTimerT21WasStarted">
+ <description>Performance monitoring counter for number of times the timer T21 was started (i.e. how many times the remote inhibit test message has been sent).
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBASent">
+ <description>Performance management counter for number of sent CBA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessForcedRerouting">
+ <description>Performance monitoring counter for number of unsuccessfully performed forced reroutings.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessControlledRerouting">
+ <description>Performance monitoring counter for number of unsuccessfully performed controlled reroutings.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuccessAssocEstablish">
+ <description>Performance management counter for number of successful association establishment.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessAssocEstablish">
+ <description>Performance management counter for number of unsuccessful association establishment.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpCommunicationErr">
+ <description>Performance management counter for number of SCTP communication error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpSendFailure">
+ <description>Performance management counter for number of SCTP send failure.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpBufOverflow">
+ <description>Performance management counter for number of SCTP stop sending data.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpResumeSending">
+ <description>Performance management counter for number of SCTP resume sending data.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpNetworkStatusChange">
+ <description>Performance management counter for number of SCTP network status change.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpAssociationRestart">
+ <description>Performance management counter for number of SCTP association restart.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuccessAssocAbort">
+ <description>The number of successful abortions of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuccessAssocShutDown">
+ <description>The number of succesful shutdowns of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessAssocAbort">
+ <description>The number of unsuccessful abortions of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessAssocShutDown">
+ <description>The number of unsuccesful shutdowns of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIncomingAssocEstabRequestInStateDownWhenStateEstabIsBlocked">
+ <description>The number of incoming request for association establishment when state on the association is 'DOWN' and establishment of associations is blocked. </description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMaxTrialsForAssocEstabReached">
+ <description>The number of times that the max limit for trying to establish an association has been reached.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMaxTrialsForAssocActivReached">
+ <description>The number of times that the max limit for trying to activate an association has been reached.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLowerPrioMsgDiscarded">
+ <description>The number of messages with low priority that has been discarded.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mtp3bSpItu">
+ <description>Mtp3b Signalling Point for the ITU standard.
+
+This MO represents/models the MTP3b Signaling Point characteristics/functions according to the ITU standard.
+A signaling point is a logical node in the signaling network. The combination of signaling points and their interconnecting
+signaling links form the SS No. 7 signaling network. The signaling point represented by this object is a Local Signaling Point.
+
+The performance monitoring counters found in Mtp3SpItu MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is shutdown request from CLI (Cluster Interface).
+
+NOTE: IT IS NOT POSSIBLE TO CREATE SIGNALLING POINTS OF DIFFERENT STANDARDS!
+
+NOTE: This MO cannot in anyway be related (either contain or by dependence) to an MO that belongs to a standard which is NOT the ITU standard.
+
+NOTE: The combination of network indicator (networkInd) and Signalling Point Code (signallingPointCode) has to be unique for each Signalling Point.
+
+NOTE: A maximum of 15 instances of this MO can be created on (referencing) the same PlugInUnit.
+
+NOTE: The maximum number of Signalling Points that can be created in a CPP based node is 24.
+
+NOTE: Deleting a singel L3 Signal Point is not possible, if it necessary to delete a Signal Point then all Signal Points has to be deleted. This also has to be done whitin the same transaction.
+
+NOTE: Any object created under a certain SP (Signaling Point) cannot refer to an object created under another SP. Nor can it refer to an object created under another SP.
+
+NOTE: The value of the attribute 'version' is valid for all SPs (Mtp3bSpItu MOs) and the value of the last created or changed SP will be used for all SPs.</description>
+ <attribute name="Mtp3bSpItuId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="networkInd">
+ <description>The networkInd attribute (NI) is used by signalling message handling functions in MTP3b
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="Mtp3bNetworkInd">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="signallingPointCode">
+ <description>The signallingPointCode (Local Point Code) attribute (SPC) is used together with the network indicator (NI, networkInd attribute) to uniquely identify the MTP Signalling Point, SP.
+SP = NI-SPC.
+Size (2 exp 14)-1 (16383).
+The SignallingPointCode (SPC) is normally used as a whole unique number (no internal structure). But sometimes the SPC is grouped together as three numbers which corresponds to zone, area/network, signalling point. If this is the case the three numbers are coded as 3-8-3 bits in the total SPC. To enter the SPC-value then you have to convert the three numbers to their binary code and then convert the whole 14-bit pattern as an integer.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>16383</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="version">
+ <description>This attribute shows what MTP3b ITU standard the system follows. With ITU, it is possible using this attribute to set which of the ITU standard versions that shall be followed.
+
+Note! Setting of another value than 'ITU_T_07_96' at create will have no effect. The Signaling Point will always be created with the value 'ITU_T_07_96'.
+
+Note! It is not possible to hav signaling points with different versions in the node so setting of this attribute will effect all signaling points. The value for the last created or changed signaling point will be used for all signaling points.</description>
+ <dataType>
+ <enumRef name="Mtp3bItuVersion">
+ <defaultValue>ITU_T_07_96</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="nodeBehaviour">
+ <description>The nodeBehaviour attribute represents the MTP3b node type.
+
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="NodeBehaviourType">
+ <defaultValue>SEP</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="noOfCongestLevelForNI">
+ <description>Defines the number of congestion levels for NI.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>3</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="routeSetCongestTestFlag">
+ <description>Selection of which procedure to use during congestion handling if the national option with priorities is used.
+
+0, use TcTimer as described by the TTC standard.
+1, use Route Set Congestion Test as described by the ANSI, ITU and China Standard.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="resendTfcInterval">
+ <description>Send TFC back to originating signalling point code for every n:th message when
+the destination is congested. Set to 0 will suppress sending of TFC.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxSizeReroutBuf">
+ <description>The maxSizeReroutBuf attribute represents the maximum size (in kB) of the rerouting buffer.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>5000</max>
+ </range>
+ <defaultValue>2000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxSizeChangeBuf">
+ <description>The maxSizeChangeBuf attribute represents the maximum size (in kB) of the changeover buffer.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>5000</max>
+ </range>
+ <defaultValue>2000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="transFrHandler">
+ <description>Determines if a TransFer Restricted signal (TFR) should be treated as a TFA (TransFer Allowed signal) or be ignored.
+</description>
+ <dataType>
+ <enumRef name="Mtp3bTfrHandling">
+ <defaultValue>IGNORED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="sioSpare">
+ <description>The sioSpare2 attribute determines if the two spare bits in the SIO (Service Information Octet) should be treated as spare.</description>
+ <dataType>
+ <enumRef name="Mtp3bSioSpareBitsUse">
+ <defaultValue>PRIO</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="statusIndInterval">
+ <description>The statusIndInterval attribute sets the interval for sending MTP-STATUS indication, i.e. send indication every Nth message .</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="sendSltmBefLink">
+ <description>The sendSltmBefLink attribute determines if the SLTM (Signalling Link Test Message) should be sent and a SLTA received before the link is considered to be in service.
+
+Note! It is not recommended nor is it in accordance with standard to set the value of this attribute to 'false' </description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="testPatternSltm">
+ <description>The testPatternSltm attribute represents a string testpattern in the Signalling Link Test Message.
+
+Minimum string length 2 characters, maximum 30 characters. Allowed characters are 0-9, A-F.
+Only even number of characters is allowed.
+
+</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>2</min> <max>30</max>
+ </lengthRange>
+ <defaultValue>"A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5"</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="spPriority">
+ <description>Struct containing the priority attributes.
+</description>
+ <dataType>
+ <structRef name="Mtp3bSpItuPriorityData"/>
+ </dataType>
+ </attribute>
+ <attribute name="spTimer">
+ <description>Struct containing ITU specific timer attributes</description>
+ <dataType>
+ <structRef name="Mtp3bSpItuTimerData"/>
+ </dataType>
+ </attribute>
+ <attribute name="rpuId">
+ <description>Holds a reference to the Reliable Program Uniter.
+The RPU is at the server.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ReliableProgramUniter"/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operationalState attribute reflects the operational status of the MTP3b SP.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="m3uaNoOfAttempsOfDauds">
+ <description>For M3UA, number of attempts to send the DAUD message.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="noOfAttempsOfAssociationEstablishment">
+ <description>Number of attempts to send the SCTP_ASSOCIATE_REQ message.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>65535</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Holds a list of the reserving MO's. Can be of type SccpSp.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfForcedRerouteSuccessPerf">
+ <description>Performance monitoring counter for number of successfully performed forced rerouting.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfControlledRerouteSuccessPerf">
+ <description>Performance monitoring counter for number of successfully performed controlled rerouting.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfEmergencyChangeOverRec">
+ <description>Performance management counter for number of received emergency changeOver orders (ECO) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfChangeOverRec">
+ <description>Performance counter for number of changeOver order messages (COO/XCO) received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfChangeBackDeclRec">
+ <description>Performance management counter for number of received change Back Declarations (CBD) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSLTAFirstTimeOutRec">
+ <description>Performance management counter for number of SLTA first time out received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSLTASecondTimeOutRec">
+ <description>Performance management counter for number of SLTA second time out received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUPMsgDiscardedDueToRoutingErr">
+ <description>Performance monitoring counter for number of UP (user part) messages (MTP_TRANSFER_req) discarded due to routing error.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOAXCASent">
+ <description>Performance management counter for number of sent COA/XCA messages.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECOSent">
+ <description>Performance management counter for number of sent ECO messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECASent">
+ <description>Performance management counter for number of sent ECA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOAXCARec">
+ <description>Performance management counter for number of received COA/XCA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBARec">
+ <description>Performance management counter for number of received CBA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECARec">
+ <description>Performance management counter for number of received ECA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTRARec">
+ <description>Performance management counter for number of received TRA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTRASent">
+ <description>Performance management counter for number of sent TRA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTimerT21WasStarted">
+ <description>Performance monitoring counter for number of times the timer T21 was started (i.e. adjacent SP restarted).
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBASent">
+ <description>Performance management counter for number of sent CBA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessForcedRerouting">
+ <description>Performance monitoring counter for number of unsuccessfully performed forced reroutings.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessControlledRerouting">
+ <description>Performance monitoring counter for number of unsuccessfully performed controlled reroutings.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuccessAssocEstablish">
+ <description>Performance management counter for number of successful association establishment.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessAssocEstablish">
+ <description>Performance management counter for number of unsuccessful association establishment.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpCommunicationErr">
+ <description>Performance management counter for number of SCTP communication error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpSendFailure">
+ <description>Performance management counter for number of SCTP send failure.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpBufOverflow">
+ <description>Performance management counter for number of SCTP stop sending data.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpResumeSending">
+ <description>Performance management counter for number of SCTP resume sending data.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpNetworkStatusChange">
+ <description>Performance management counter for number of SCTP network status change.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpAssociationRestart">
+ <description>Performance management counter for number of SCTP association restart.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuccessAssocAbort">
+ <description>The number of successful abortions of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuccessAssocShutDown">
+ <description>The number of succesful shutdowns of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessAssocAbort">
+ <description>The number of unsuccessful abortions of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessAssocShutDown">
+ <description>The number of unsuccesful shutdowns of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIncomingAssocEstabRequestInStateDownWhenStateEstabIsBlocked">
+ <description>The number of incoming request for association establishment when state on the association is 'DOWN' and establishment of associations is blocked. </description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMaxTrialsForAssocEstabReached">
+ <description>The number of times that the max limit for trying to establish an association has been reached.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMaxTrialsForAssocActivReached">
+ <description>The number of times that the max limit for trying to activate an association has been reached.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLowerPrioMsgDiscarded">
+ <description>The number of messages with low priority that has been discarded.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mtp3bSpTtc">
+ <description>Mtp3b Signalling Point for the TTC standard.
+
+This MO represents/models the MTP3b Signaling Point characteristics/functions according to the TTC standard.
+A signaling point is a logical node in the signaling network. The combination of signaling points and their interconnecting
+signaling links form the SS No. 7 signaling network. The signaling point represented by this object is a Local Signaling Point.
+
+The performance monitoring counters found in Mtp3SpTtc MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is shutdown request from CLI (Cluster Interface).
+
+NOTE: This MO cannot in anyway be related (either contain or by dependence) to an MO that belongs to a
+standard which is NOT the TTC standard.
+
+NOTE: IT IS NOT POSSIBLE TO CREATE SIGNALLING POINTS OF DIFFERENT STANDARDS!
+
+NOTE: The combination of network indicator (networkInd) and Signalling Point Code (signallingPointCode) has to be unique for each Signalling Point.
+
+NOTE: A maximum of 15 instances of this MO can be created on (referencing) the same PlugInUnit.
+
+NOTE: The maximum number of Signalling Points that can be created in a CPP based node is 24.
+
+NOTE: Deleting a singel L3 Signal Point is not possible, if it necessary to delete a Signal Point then all Signal Points has to be deleted. This also has to be done whitin the same transaction.
+
+NOTE: Any object created under a certain SP (Signaling Point) cannot refer to an object created under another SP. Nor can it refer to an object created under another SP.</description>
+ <attribute name="Mtp3bSpTtcId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="networkInd">
+ <description>The networkInd attribute (NI) is used by signalling message handling functions in MTP3b.
+
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="Mtp3bNetworkIndTtc">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="signallingPointCode">
+ <description>The signallingPointCode (Local Point Code) attribute (SPC) is used together with the network indicator (NI, networkInd attribute) to uniquely identify the MTP Signalling Point, SP.
+SP = NI-SPC.
+Size (2 exp 16)-1 (65535).
+The SignallingPointCode (SPC) is always used as a whole unique number (no internal structure).</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="nodeBehaviour">
+ <description>The nodeBehaviour attribute represents the MTP3b node type.
+
+Note! Only SEP and STP is supported for the Ttc standard.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="NodeBehaviourType">
+ <defaultValue>SEP</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="routeSetCongestTestFlag">
+ <description>Selection of which procedure to use during congestion handling if the national option with priorities is used.
+
+0, use TcTimer as described by the TTC standard.
+1, use Route Set Congestion Test as described by the ANSI, ITU and China Standard.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="resendTfcInterval">
+ <description>Send TFC back to originating signalling point code for every n:th message when
+the destination is congested. Set to 0 will suppress sending of TFC.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxSizeReroutBuf">
+ <description>The maxSizeReroutBuf attribute represents the maximum size (in kB) of the rerouting buffer.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>5000</max>
+ </range>
+ <defaultValue>2000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxSizeChangeBuf">
+ <description>The maxSizeChangeBuf attribute represents the maximum size (in kB) of the changeover buffer.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>5000</max>
+ </range>
+ <defaultValue>2000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="statusIndInterval">
+ <description>The statusIndInterval attribute sets the interval for sending MTP-STATUS indication, i.e. send indication every Nth message .</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="testPatternSltm">
+ <description>The testPatternSltm attribute represents a string testpattern in the Signalling Link Test Message.
+
+String length 4 characters. Allowed characters are 0-9, A-F.
+
+</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>4</min> <max>4</max>
+ </lengthRange>
+ <defaultValue>"7711"</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="spPriority">
+ <description>Struct containing the TTC priority attributes.
+</description>
+ <dataType>
+ <structRef name="Mtp3bSpTtcPriorityData"/>
+ </dataType>
+ </attribute>
+ <attribute name="rpuId">
+ <description>Holds a reference to the Reliable Program Uniter.
+The RPU is at the server.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ReliableProgramUniter"/>
+ </dataType>
+ </attribute>
+ <attribute name="spTimer">
+ <description>Struct containing TTC timer attributes.</description>
+ <noNotification/>
+ <dataType>
+ <structRef name="Mtp3bSpTtcTimerData"/>
+ </dataType>
+ </attribute>
+ <attribute name="noOfCongestLevelForNI">
+ <description>Defines the number of congestion levels for NI.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>3</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operationalState attribute reflects the operational status of the MTP3b SP.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Holds a list of the reserving MO's. Can be of type SccpSp.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfForcedRerouteSuccessPerf">
+ <description>Performance monitoring counter for number of successfully performed forced rerouting.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfControlledRerouteSuccessPerf">
+ <description>Performance monitoring counter for number of successfully performed controlled rerouting.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfEmergencyChangeOverRec">
+ <description>Performance management counter for number of received emergency changeOver orders (ECO) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfChangeOverRec">
+ <description>Performance counter for number of changeOver order messages (COO/XCO) received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfChangeBackDeclRec">
+ <description>Performance management counter for number of received change Back Declarations (CBD) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSLTAFirstTimeOutRec">
+ <description>Performance management counter for number of SLTA first time out received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSLTASecondTimeOutRec">
+ <description>Performance management counter for number of SLTA second time out received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUPMsgDiscardedDueToRoutingErr">
+ <description>Performance monitoring counter for number of UP (user part) messages (MTP_TRANSFER_req) discarded due to routing error.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOAXCASent">
+ <description>Performance management counter for number of sent COA/XCA messages.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECOSent">
+ <description>Performance management counter for number of sent ECO messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECASent">
+ <description>Performance management counter for number of sent ECA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOAXCARec">
+ <description>Performance management counter for number of received COA/XCA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBARec">
+ <description>Performance management counter for number of received CBA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECARec">
+ <description>Performance management counter for number of received ECA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTRARec">
+ <description>Performance management counter for number of received TRA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTRASent">
+ <description>Performance management counter for number of sent TRA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBASent">
+ <description>Performance management counter for number of sent CBA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessForcedRerouting">
+ <description>Performance monitoring counter for number of unsuccessfully performed forced reroutings.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessControlledRerouting">
+ <description>Performance monitoring counter for number of unsuccessfully performed controlled reroutings.
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuccessAssocEstablish">
+ <description>Performance management counter for number of successful association establishment.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessAssocEstablish">
+ <description>Performance management counter for number of unsuccessful association establishment.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpCommunicationErr">
+ <description>Performance management counter for number of SCTP communication error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpSendFailure">
+ <description>Performance management counter for number of SCTP send failure.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpBufOverflow">
+ <description>Performance management counter for number of SCTP stop sending data.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpResumeSending">
+ <description>Performance management counter for number of SCTP resume sending data.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpNetworkStatusChange">
+ <description>Performance management counter for number of SCTP network status change.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpAssociationRestart">
+ <description>Performance management counter for number of SCTP association restart.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mtp3bSlAnsi">
+ <description>This MO represents an MTP3b Signalling Link for the ANSI standard. It represents the termination of the signalling link within the signalling point as defined in T1.111-1996.
+
+The total amount of links between any two specific nodes in the network shall not be more than 80 independent on how many linksets that are defined between the two nodes. The signalLinkCode for a link must be unique between the nodes, independent on which linkSet the link belongs to. A maximum of five linksets with a maximum of 16 links in each linkset can be configured. A maximum of 16 links between two adjacent nodes can be configured.
+
+NOTE: This MO cannot in anyway be related (either contain or by dependence) to an MO that belongs to a standard which is NOT the ANSI standard.
+
+The performance monitoring counters found in Mtp3SlAnsi MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is shutdown request from CLI (Cluster Interface).</description>
+ <attribute name="Mtp3bSlAnsiId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>This attribute reflects the operational status of the Mtp3bSlAnsi.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="tpId">
+ <description>The tpId attribute points out the termination point of the lower layer protocol.
+
+For narrowband this signalling link will be connected to an MTP L2 termination point (Mtp2Tp MO). And for broadband it will be connected to a NNI SAAL termination point (NniSaalTp Mo).</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="linkState">
+ <description>The link state of the Mtp3bSlAnsi.
+
+The link state is a bit map which contains a combination of the following values: (in hexadecimal format)
+
+0x00 Available
+0x01 Failed
+0x02 Remotely blocked
+0x04 Locally blocked
+0x08 Remotely inhibited
+0x10 Locally inhibited
+0x20 Deactivated</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="usageState">
+ <description>There are three possible states for the usageState attribute:
+
+- idle, the Mtp3bSl carries no traffic.
+- active, the Mtp3bSl is working normally, and there is traffic, and it is not congested.
+- busy, the Mtp3bSl is working but is congested (traffic is routed on other links).
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bUsageState">
+ <defaultValue>IDLE</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="signLinkCode">
+ <description>The signalling link code, SLC, used for this link.
+The signLinkCode for a link must be unique between the nodes,
+independent on in which linkSet the link belongs.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>15</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="proceduralState">
+ <description>The procedural state of the link.
+
+0 - not initialized
+1 - initialized
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bProceduralState">
+ <defaultValue>NOT_INITIALIZED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="linkCongestLevel">
+ <description>The congestion level of the link.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="CongestLevel">
+ <defaultValue>level_0</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="autoStartLink">
+ <description>Controls if the Mtp3bSL should be activated at create.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAALINServiceInd">
+ <description>Performance management counter for number of received link-in-service indications.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAALOUTInd">
+ <description>Performance management counter for number of received link-out-of-service indications.
+
+Note! This counter is incremented every time a link out of service indication is received for the link.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOOXCOSent">
+ <description>Performance management counter for number of sent change over order (COO/XCO) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBDSent">
+ <description>Performance management counter for number of sent CBD messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLocalLinkCongestRec">
+ <description>Performance monitoring counter for number of local link congestion primitives received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLocalLinkCongestCeaseRec">
+ <description>Performance monitoring counter for number of local link congestion ceased primitives received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSURec">
+ <description>Performance monitoring counter for number of received MSU's on this signalling link.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSUSent">
+ <description>Performance monitoring counter for number of sent MSU's on this signalling link.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <action name="deactivate">
+ <description>This action deactivates the signalling link.
+ It will also set autoStartLink = false.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="activate">
+ <description>This action activates the signalling link with normal alignment. It will also set autoStartLink = true.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="emergencyActivate">
+ <description>This action activates the signalling link with emergency alignment.
+ It will also set autoStartLink = true
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="localInhibit">
+ <description>This action inhibits the Mtp3bSlAnsi. Signalling link management inhibiting is requested by management when it becomes necessary, e.g for maintenance or testing purposes to make or keep a signalling link unavailable to User Part-generated signalling traffic.
+Inhibiting of a signalling link may be requested by management function at either end of the link. The request is granted, provided that the inhibiting action does not cause any previously accessible destinations to become inaccessible at either end of the signalling link. The request may also be refused under certain circumstances such as congestion.
+Exception FroRequestFailed if it was not possible to inhibit.
+
+Note! This action requires a transaction.
+</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="localUninhibit">
+ <description>This action uninhibits the Mtp3bSlAnsi.
+
+Exception FrorequestFailed if it was not possible to uninhibit.
+
+Note! This action requires a transaction.
+</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ </class>
+
+ <class name="Mtp3bSlItu">
+ <description>This MO represents an MTP3b Signalling Link for the ITU standard. It represents the termination of the signalling link within the signalling point as defined in Q.704 and Q.2210 (07/96).
+
+The total amount of links between any two specific nodes in the network shall not be more than 16, independent on how many linksets that are defined between the two nodes. The signalLinkCode for a link must be unique between the nodes, independent on which linkSet the link belongs to.
+
+The performance monitoring counters found in Mtp3SlItu MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is shutdown request from CLI (Cluster Interface).
+
+NOTE: This MO cannot in anyway be related (either contain or by dependence) to an MO that belongs to a standard which is NOT the ITU standard.</description>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="tpId">
+ <description>The tpId attribute points out the termination point of the lower layer protocol.
+
+For narrowband this signalling link will be connected to an MTP L2 termination point (Mtp2Tp MO). And for broadband it will be connected to a NNI SAAL termination point (NniSaalTp Mo).</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>This attribute reflects the operational status of the Mtp3bSl.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="linkState">
+ <description>The link state of the Mtp3bSl.
+
+The link state is a bit map which contains a combination of the following values: (in hexadecimal format)
+
+0x00 Available
+0x01 Failed
+0x02 Remotely blocked
+0x04 Locally blocked
+0x08 Remotely inhibited
+0x10 Locally inhibited
+0x20 Deactivated</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="usageState">
+ <description>There are three possible states for the usageState attribute:
+
+- idle, the Mtp3bSl carries no traffic.
+- active, the Mtp3bSl is working normally, and there is traffic, and it is not congested.
+- busy, the Mtp3bSl is working but is congested (traffic is routed on other links).
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bUsageState">
+ <defaultValue>IDLE</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="signLinkCode">
+ <description>The signalling link code, SLC, used for this link.
+The signLinkCode for a link must be unique between the nodes,
+independent on in which linkSet the link belongs.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>15</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="proceduralState">
+ <description>The procedural state of the link.
+
+0 - not initialized
+1 - initialized
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bProceduralState">
+ <defaultValue>NOT_INITIALIZED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="linkCongestLevel">
+ <description>The congestion level of the link.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="CongestLevel">
+ <defaultValue>level_0</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="autoStartLink">
+ <description>Controls if the Mtp3b Signalling Link should be activated at create.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="prioBeforeSio">
+ <description>This Boolean tells if the message priority shall be inserted in an octet before the Service Indicator Octet (SIO).
+
+ITU default is false.
+</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAALINServiceInd">
+ <description>Performance management counter for number of received link-in-service indications.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAALOUTInd">
+ <description>Performance management counter for number of received link-out-of-service indications.
+
+Note! This counter is incremented every time a link out of service indication is received for the link.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOOXCOSent">
+ <description>Performance management counter for number of sent change over order (COO/XCO) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBDSent">
+ <description>Performance management counter for number of sent CBD messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLocalLinkCongestRec">
+ <description>Performance monitoring counter for number of local link congestion primitives received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLocalLinkCongestCeaseRec">
+ <description>Performance monitoring counter for number of local link congestion ceased primitives received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSURec">
+ <description>Performance monitoring counter for number of received MSU's on this signalling link.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSUSent">
+ <description>Performance monitoring counter for number of sent MSU's on this signalling link.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="Mtp3bSlItuId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="localInhibit">
+ <description>This action inhibits the Mtp3bSlItu. Signalling link management inhibiting is requested by management when it becomes necessary, e.g for maintenance or testing purposes to make or keep a signalling link unavailable to User Part-generated signalling traffic.
+Inhibiting of a signalling link may be requested by management function at either end of the link. The request is granted, provided that the inhibiting action does not cause any previously accessible destinations to become inaccessible at either end of the signalling link. The request may also be refused under certain circumstances such as congestion.
+Exception FroRequestFailed if it was not possible to inhibit.
+
+Note! This action requires a transaction.
+</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="localUninhibit">
+ <description>This action uninhibits the Mtp3bSlItu.
+
+Exception FrorequestFailed if it was not possible to uninhibit.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="deactivate">
+ <description>This action deactivates the Mtp3bSl.
+It will also set autoStartLink = false.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="activate">
+ <description>This action activates the Mtp3bSl with normal alignment. It will also set autoStartLink = true.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="emergencyActivate">
+ <description>This action activates the Mtp3bSl with emergency alignment.
+It will also set autoStartLink = true
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ </class>
+
+ <class name="Mtp3bSlTtc">
+ <description>This MO represents an MTP3b Signalling Link for the TTC standard. It represents the termination of the signalling link within the signalling point as defined in JT-Q.704 Ver. 3, April 28 1992 and JT-Q.2210 Ver.1 April 24 1996.
+
+The total amount of links between any two specific nodes in the network shall not be more than 16, independent on how many linksets that are defined between the two nodes. The signalLinkCode for a link must be unique between the nodes, independent on which linkSet the link belongs to.
+
+The performance monitoring counters found in Mtp3SlTtc MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is shutdown request from CLI (Cluster Interface).
+
+NOTE: This MO cannot in anyway be related (either contain or by dependence) to an MO that belongs to a standard which is NOT the TTC standard.</description>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="tpId">
+ <description>The tpId attribute points out the termination point of the lower layer protocol. Only BroadBand is supported for TTC. The MO will be connected to a NNI SAAL termination point (NniSaalTp Mo).</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>This attribute reflects the operational status of the Mtp3bSl.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="linkState">
+ <description>The link state of the Mtp3bSl.
+
+The link state is a bit map which contains a combination of the following values: (in hexadecimal format)
+
+0x00 Available
+0x01 Failed
+0x02 Remotely blocked
+0x04 Locally blocked
+0x08 Remotely inhibited
+0x10 Locally inhibited
+0x20 Deactivated</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="usageState">
+ <description>There are three possible states for the usageState attribute:
+
+- idle, the Mtp3bSl carries no traffic.
+- active, the Mtp3bSl is working normally, and there is traffic, and it is not congested.
+- busy, the Mtp3bSl is working but is congested (traffic is routed on other links).
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bUsageState">
+ <defaultValue>IDLE</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="signLinkCode">
+ <description>The signalling link code, SLC, used for this link.
+The code have to be uniqe in this signal link set, i.e the signallingLinkCode for
+all the Mtp3bSl that belongs to the same Mtp3bSls must be unique(mutual exclusive). </description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>15</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="proceduralState">
+ <description>The procedural state of the link.
+
+0 - not initialized
+1 - initialized
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bProceduralState">
+ <defaultValue>NOT_INITIALIZED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="linkCongestLevel">
+ <description>The congestion level of the link.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="CongestLevel">
+ <defaultValue>level_0</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="autoStartLink">
+ <description>Controls if the Mtp3b Signalling Link should be activated at create.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="prioBeforeSio">
+ <description>This Boolean tells if the message priority shall be inserted in an octet before the Service Indicator Octet (SIO).
+
+</description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAALINServiceInd">
+ <description>Performance management counter for number of received link-in-service indications.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAALOUTInd">
+ <description>Performance management counter for number of received link-out-of-service indications.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOOXCOSent">
+ <description>Performance management counter for number of sent change over order (COO/XCO) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBDSent">
+ <description>Performance management counter for number of sent CBD messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLocalLinkCongestRec">
+ <description>Performance monitoring counter for number of local link congestion primitives received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLocalLinkCongestCeaseRec">
+ <description>Performance monitoring counter for number of local link congestion ceased primitives received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSURec">
+ <description>Performance monitoring counter for number of received MSU's on this signalling link.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSUSent">
+ <description>Performance monitoring counter for number of sent MSU's on this signalling link.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="Mtp3bSlTtcId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <action name="deactivate">
+ <description>This action deactivates the Mtp3bSl.
+It will also set autoStartLink = false.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ <raisesException name="FroNotAccessibleException"/>
+ </action>
+ <action name="activate">
+ <description>This action activates the signalling link with normal alignment. It will also set autoStartLink = true.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ <raisesException name="FroNotAccessibleException"/>
+ </action>
+ <action name="emergencyActivate">
+ <description>This action activates the signalling link with emergency alignment.
+It will also set autoStartLink = true
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ <raisesException name="FroNotAccessibleException"/>
+ </action>
+ </class>
+
+ <class name="Mtp2ProfileAnsi">
+ <description>The MTP 2 Profile MO represents and keeps attribute values used by one or more MTP 2 ANSI termination point MOs.</description>
+ <attribute name="userLabel">
+ <description>This MOs user label.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="Mtp2ProfileAnsiId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="profileData">
+ <description>Struct containing profile data.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="Mtp2ProfileDataAnsi"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of Mtp2TpAnsi MOs that have reserved this Mtp2TpProfileAnsi MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="Mtp2TpAnsi"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mtp2ProfileItu">
+ <description>The MTP 2 Profile MO represents and keeps attribute values used by one or more MTP 2 ITU termination point MOs.</description>
+ <attribute name="userLabel">
+ <description>The MOs user label.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="Mtp2ProfileItuId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="profileData">
+ <description>Struct containing profile data.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="Mtp2ProfileDataItu"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of Mtp2TpItu MOs that have reserved this Mtp2TpProfileItu MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="Mtp2TpItu"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="E1Ttp">
+ <description>This MO represents a channelised E1 interface in the node. The E1Ttp (Trail Termination Point) MO
+does not define which type of traffic (TDM or ATM) that the interface should support. Please refer to
+the Ds0Bundle, AtmPort, IMALink and IMAGroup objects for details about configuration of traffic type.
+
+The performance monitoring counters in the E1Ttp MO is set to 0 (zero) at start or restart of the node.
+When the value is to large too fit in to a long (31bit) the counter turns over and starts from 0 again.
+
+Note! This MO is automatically created as a consequence of creating an Os155SpiTtpMo
+Please refer to the Os155SpiTtpMo for more details.
+
+</description>
+ <systemCreated/>
+ <attribute name="degDegThr">
+ <description>The threshold decides how many of the received blocks that are allowed to have bit errors. The measurement is made on a per-second basis and if the threshold is passed the second is considered bad.
+
+This is a percentage value.
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="degDegM">
+ <description>How many bad seconds in a row that causes a Degraded Signal alarm.
+
+
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>2</min> <max>10</max>
+ </range>
+ <defaultValue>7</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="aisReporting">
+ <description>Indicates whether Alarm Indication Signal, AIS, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="rdiReporting">
+ <description>Indicates whether Remote Defect Indication, RDI, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="crc4Mode">
+ <description>Indicates what Cyclical Redundancy Check 4 Mode that is being used.</description>
+ <dataType>
+ <enumRef name="Crc4Mode">
+ <defaultValue>AUTOMATIC</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="idlePattern">
+ <description>The idle pattern.
+
+NOTE: Going from A_LAW or U_LAW to UNDEFINED is always allowed but setting up one ET board with
+both U_LAW and A_LAW is not allowed.
+E.g. If you want to change from A_LAW to U_LAW on one ET board you have to change idlePattern
+on each physical port belonging to the board to UNDEFINED first.
+A_LAW -&gt; UNDEFINED -&gt; U_LAW or U_LAW -&gt; UNDEFINED -&gt; A_LAW</description>
+ <dataType>
+ <enumRef name="IdlePattern">
+ <defaultValue>UNDEFINED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmEs">
+ <description>Performance monitoring counter of Errored Seconds (ES).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSes">
+ <description>Performance monitoring counter for Severely Errored Seconds.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="E1TtpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identityof the reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="AtmPort"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedByImaLink">
+ <description>The identity of the reserving ImaLink MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ImaLink"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Vc4Ttp">
+ <description>This MO is automatically created as a consequence of creating an Os155SpiTtp object if any of the following conditions are true:
+a) standardmode = ETSI or
+b) standardmode = TTC and muxmode = VC4_STS3CSPE_LEVEL.
+
+It represents the termination of the SDH VC-4 path layer. The VC-4 can either be used for channelised access, in which case VC-12 MOs are created as children to the Vc4Ttp MO, or be used to carry ATM traffic, in which case there is a relationship between the AtmPort MO and the Vc4Ttp MO.
+
+Note! The performance monitoring counters in the Vc4TtpMO is set to 0 (zero) at start or restart of the node.
+When the value is to large to fit in to a long (31bit) the counter turns over and starts from 0 again.
+</description>
+ <systemCreated/>
+ <attribute name="pathTraceFormat">
+ <description>Indicates the format of the expectedPathtrace and transmittedPathtrace attributes. The format may be in 16 or 64 characters. Usually 16 is used for ETSI and 64 for ANSI/TTC.
+
+ITU_T_G707=16
+GR_253_CORE=64
+
+Note that the 16 characters format requires the operator to specify 15 characters where no character contains the null character (the 16th character is added automatically).
+
+Note that the 64 characters format requires the operator to specify 62 ASCII characters all different from null followed by CR/LF.</description>
+ <dataType>
+ <enumRef name="PathTraceFormat">
+ <defaultValue>ITU_T_G707</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="transmittedPathTrace">
+ <description>The transmitted path trace.
+Can be defined in two formats. The format may be in 16 or 64 characters. Usually 16 is used for ETSI and 64 for ANSI/TTC.
+
+Note: The string must be of 15 or 62 characters length, or empty string ("").
+
+</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>64</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="expectedPathTrace">
+ <description>Expected path trace.
+
+The string can be of 15 or 62 characters length, or empty string ("").
+
+Note: An empty string for this attribute means that the detection of Trace Identifier Mismatch (TIM) should be disabled. This attribute is set to empty string every time attribute pathTraceFormat is set.
+
+</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>64</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="timConsequentAction">
+ <description>Trace Identifier Mismatch (TIM) consequent action, i.e. for generation of Alarm Indication Signal (AIS) downstream and Remote Defect Indication (RDI) upstream as a consequence of the TIM detection.
+
+True - enabled.
+False - disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="vcDegThreshold">
+ <description>This threshold decides how many of the received blocks that are allowed to have bit errors. The measurement is made on a per-second basis and if the threshold is passed the second is considered bad.
+
+The attribute value is in unit of % (percent).</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="vcDegM">
+ <description>Indicates how many bad seconds in a row that causes a Degraded Signal alarm.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>2</min> <max>10</max>
+ </range>
+ <defaultValue>7</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="auAisReporting">
+ <description>AU AIS reporting.
+
+True - enable reporting.
+False - disable reporting.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="vcRdiReporting">
+ <description>VC RDI reporting.
+
+True - enable reporting.
+False - disable reporting.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmVcEs">
+ <description>Performance monitoring counter for Virtual Container 4, VC4, Errored Seconds, ES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmVcSes">
+ <description>Performance monitoring counter for Virtual Container 4, VC4, Severely Errored Seconds, SES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="Vc4TtpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="AtmPort"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Os155SpiTtp">
+ <description>This MO represents the physical interface and the termination of the SDH Regenerator and Multiplexer Section Layers.
+
+When creating the Os155SpiTtp a number of additional objects will be created. Depending on the values of standardmode and muxmode different objects will be created as described below:
+
+muxmode = standby
+standardmode = ETSI, TTC, ANSI
+No objects under the Os155SpiTtp is created.
+
+muxmode = VC4_STS3CSPE_LEVEL
+standardmode = ETSI, TTC
+A Vc4 MO is created under the Os155SpiTtp MO.
+
+muxmode = VC4_STS3CSPE_LEVEL
+standardmode = ANSI
+A Sts3CspeTtp MO is created under the Os155SpiTtp MO.
+
+The following two configurations is only applicable for the ET-MC41 board.
+
+muxmode = E1_J1_T1_LEVEL
+standardmode = ETSI
+A Vc4 MO, 63 Vc12Ttp MO's and 63 E1Ttp MO's is created under the Os155SpiTtp MO
+
+muxmode = E1_J1_T1_LEVEL
+standardmode = ANSI
+3 Sts1CspeTtp MO's, 3*28 Vt15Ttp MO's and 3*28 TiTtp MO's is created under the Os155SpiTtp MO.
+
+The performance monitoring counters in the Os155SpiTtp MO is set to 0 (zero) at start or restart of the node.
+When the value is too large too fit in to a long (31bit) the counter turns over and starts from 0 again.
+
+Note! If the Os155SpiTtp is configured as part of an Mspg protection group and is configured as standby, muxMode set to standby, no children's to this MO will be created.</description>
+ <attribute name="Os155SpiTtpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="lineNo">
+ <description>The actual line number.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>2</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="standardMode">
+ <description>The standard that this MO is operating to.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="StandardMode">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="shutDownTimeout">
+ <description>The shut-down timer. It is used when the administrativeState is set to shutdown.
+
+Value in seconds, must be a positive value.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100000</max>
+ </range>
+ <defaultValue>1800</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="muxMode">
+ <description>The level at which the STM-1/OC3 signal is demultiplexed.
+
+If parent is of type Etmc41, the valid muxMode is STANDBY or E1_J1_T1_LEVEL.
+If parent is of type Etm4, the valid muxMode is STANDBY or VC4_STS3CSPE_LEVEL.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="MuxMode">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="msDegThreshold">
+ <description>MS - multiplexer section.
+
+The threshold decides how many of the received blocks that are allowed to have bit errors. The measurement is made on a per-second basis and if the threshold is passed the second is considered bad.
+
+This is a percentage value.
+
+Note: When operating to the ANSI standard, this attribute has no meaning.
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="msDegM">
+ <description>MS - multiplexer section.
+
+How many bad seconds in a row that causes a Degraded Signal alarm.
+
+Note: When operating to the ANSI standard, this attribute has no meaning.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>2</min> <max>10</max>
+ </range>
+ <defaultValue>7</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="msRdiReporting">
+ <description>Indicates whether Remote Defect Indication, RDI, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="msAisReporting">
+ <description>Indicates whether Alarm Indication Signal, AIS, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="loopBack">
+ <description>Enables or disables line loopback, i.e. the received signal is returned in the transmitted direction.
+
+none - This is the normal state, no loop back is performed (and ordinary traffic is running).
+
+line - The physical path is looped on the line side, the external incoming path is looped back to the external outgoing path.
+
+Note! administrativeStatus must be set to locked when setting loopback attribute.</description>
+ <dataType>
+ <enumRef name="Os155LoopBack">
+ <defaultValue>NONE</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmMsEs">
+ <description>Performance monitoring counter for Multiplexer Section, MS, Errored Seconds, ES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmMsSes">
+ <description>Performance monitoring counter for Multiplexer Section, MS, Severely Errored Seconds, SES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBySync">
+ <description>The identity of the reserving Synchronization MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Synchronization"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Vc12Ttp">
+ <description>This MO is automatically created when the configuring the Os155SpiTtp. It represents the termination of the SDH VC-12 path layer.
+
+Note: This MO is only valid when the ETSI standard is in use.
+
+The performance monitoring counters in the Vc12TtpMO is set to 0 (zero) at start or restart of the node.
+When the value is to large too fit in to a long (31bit) the counter turns over and starts from 0 again.</description>
+ <systemCreated/>
+ <attribute name="Vc12TtpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="transmittedPathTrace">
+ <description>The transmitted path trace.
+
+Note: when 16 byte tracing is used, only 15 bytes should be used in the set action for this attribute.
+
+
+</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>64</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="expectedPathTrace">
+ <description>Expected path trace.
+
+Note: when 16 byte tracing is used, only 15 bytes should be used in the set action for this attribute.
+
+Note: An empty string for this attribute means that the detection of Trace Identifier Mismatch (TIM) should be disabled.
+</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>64</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="timConsequentAction">
+ <description>Trace Identifier Mismatch (TIM) consequent action, i.e. for generation of Alarm Indication Signal (AIS) downstream and Remote Defect Indication (RDI) upstream as a consequence of the TIM detection.
+
+True - enabled.
+False - disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="vcDegThreshold">
+ <description>This threshold decides how many of the received blocks that are allowed to have bit errors. The measurement is made on a per-second basis and if the threshold is passed the second is considered bad.
+
+The attribute value is in unit of % (percent).</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="vcDegM">
+ <description>Indicates how many bad seconds in a row that causes a Degraded Signal alarm.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>2</min> <max>10</max>
+ </range>
+ <defaultValue>7</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tuAisReporting">
+ <description>Timing Unit Alarm Indication Signal (TU AIS) reporting.
+
+True - enable reporting.
+False - disable reporting.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="vcRdiReporting">
+ <description>VC RDI reporting.
+
+True - enable reporting.
+False - disable reporting.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmVcEs">
+ <description>Performance monitoring counter for Virtual Container 12, VC12, Errored Seconds, ES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmVcSes">
+ <description>Performance monitoring counter for Virtual Container 12, VC12, Severely Errored Seconds, SES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="shutDownTimeout">
+ <description>The shut-down timer. It is used when the administrativeState is set to shutdown.
+
+Value in seconds, must be a positive value.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100000</max>
+ </range>
+ <defaultValue>1800</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Etmc1">
+ <description>This MO represents the hardware of the ET-MC1 board type. It only represents the ET specific hardware, the DBM module of the board is represented by the PlugInUnit MO.
+
+The ET-MC1 board contains 8 phyiscal ports that can be configured as either E1 (ETSI), J1 (TTC) or T1(ANSI). The board does not allow for a mix of E1, J1 and T1 ports, thus all configured ports on the board must be configured to the same standard.
+
+Each port on the ET-MC1 board can be used to carry either ATM traffic or circuit orientated (Nx64 Kbits/s connections) traffic.
+
+Each port can support up to 30 ATM VC connections. Two of these connections are reserved for AAL2 paths, and therefore two AAL2 multiplexers per port are available.
+
+Each port can support up to 2 VP connections.
+
+The ET-MC1 port supports one bidirectional F4/F5 PM flow per port.
+
+At the VP/VC endpoints, the Lost FPM/BR cells counters are not available.
+
+Note! The ETMC1 supports IMA.
+
+For more details on restrictions please refer to 155 17-21/CSX 101 09 Uen.
+
+Note! When the Etmc1 is part of the Cbu it is only possible to configure 4 physical ports of type E1, J1 or T1 on the Etmc1 board.</description>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Enabled or disabled according to the actual operational state of the ETMC1 board.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="Etmc1Id">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Etmc41">
+ <description>This MO represents the hardware of the ET-MC41 board type. It only represents the ET specific hardware, while the DBM module of the board is represented by the PlugInUnit MO.
+
+The ET-MC41 board contains a 155 Mbits/s physical optical port. The board can be configured as a E1 channelised board providing 63 logical E1 interfaces.
+
+Each E1 logical channel on the ET-MC41 can be used to carry either ATM traffic or circuit oriented (Nx64 kbit/s) traffic.
+
+Each E1 logical channel can support up to 30 ATM VC connections. Two of these connections are reserved for aal2 paths, and therefore two AAL2 multiplexers per E1/DS1/J1 channel are available.
+
+Each E1/DS1/J1 channel can suport up to 2 VP connections.
+
+The ET-MC41 board support one biderectional F4/F5 PM flow per E1 channel.
+
+Note! The ETMC41 supports IMA. However the E1 ports being part of the same IMA group can not be selected randomly.
+
+Note! The number of VCC TP+VPC TP with performance monitoring enabled (i.e. PM mode &lt;&gt; off) is restricted to 1 / port
+
+For more details on restrictions please refer to 155 17-21/CSX 101 09 Uen.</description>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Enabled or disabled according to the actual operational state of the ET-MC41 board.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="Etmc41Id">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mtp2ProfileChina">
+ <description>The MTP2 Profile MO represents and keeps attribute values used by one or more MTP2 China termination point MOs.</description>
+ <attribute name="Mtp2ProfileChinaId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="profileData">
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="Mtp2ProfileDataChina"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of Mtp2TpChina MOs that have reserved this Mtp2TpProfileChina MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="Mtp2TpChina"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>The MOs user label.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mtp2TpChina">
+ <description>This MO represents a MTP 2 termination point for the China standard, as defined in GF001-9001, plus supplement 1-3.
+
+The performance monitoring counters found in Mtp2China MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is a hardware fault, aal1 server/adm restart or node restart.
+
+NOTE: This MO cannot in anyway be related (either contained by or dependent on) an MO that belongs to a standard
+which is NOT the China standard.
+
+NOTE: There is a restriction of a maximum of 32 Mtp2Tp's per MP.
+
+</description>
+ <attribute name="ds0BundleId">
+ <description>The Ds0Bundle MO that this MO references.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Ds0Bundle"/>
+ </dataType>
+ </attribute>
+ <attribute name="mtp2ProfileChinaId">
+ <description>Reference to a Mtp2ProfileChina MO.
+
+Note: The bitRate can not be changed.</description>
+ <mandatory/>
+ <noNotification/>
+ <dataType>
+ <moRef name="Mtp2ProfileChina"/>
+ </dataType>
+ </attribute>
+ <attribute name="Mtp2TpChinaId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the MTP2 Signalling Terminal.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmLocalSIBTime">
+ <description>Total time in local SIB (Sending).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSUTransmitted">
+ <description>Number of MSUs transmitted.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfNacks">
+ <description>Number of negative acknowledgements received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuReceivedInError">
+ <description>Number of signal units received in error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfReTransmittedOctets">
+ <description>Number of re-transmitted octets.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSendBufferOctets">
+ <description>Number of octets in send buffer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSIOSIFReceived">
+ <description>Number of SIO and SIF octets received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSIOSIFTransmitted">
+ <description>Number of SIO &amp; SIF octets transmitted.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfStartedRBCongestion">
+ <description>Number of started local RB congestions.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmRemoteSIBTime">
+ <description>Total time in remote SIB (Receiving).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Mtp3bSlChina"/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Free tag for marking this managed object.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="plugInUnitId">
+ <description>The PlugInUnit MO that this MO references.
+It indicates on which processor the Termination Point will be.
+
+Note: The PlugInUnit must be of type GPB.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="PlugInUnit"/>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSUReceived">
+ <description>Number of MSUs received..</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mtp3bSlChina">
+ <description>This MO represents an MTP3b Signalling Link for the China standard. It represents the termination of the signalling link within the signalling point as defined in GF001-9001, plus supplement 1-3.
+
+The total amount of links between any two specific nodes in the network shall not be more than 16, independent on how many linksets that are defined between the two nodes. The signalLinkCode for a link must be unique between the nodes, independent on which linkSet the link belongs to.
+
+The performance monitoring counters found in Mtp3SlChina MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is shutdown request from CLI (Cluster Interface).
+
+NOTE: This MO cannot in anyway be related (either contain or by dependence) to an MO that belongs to a standard that is NOT the China standard.</description>
+ <attribute name="Mtp3bSlChinaId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>This attribute reflects the operational status of the Mtp3bSl.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="autoStartLink">
+ <description>Controls if the Mtp3b Signalling Link should be activated at create.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="linkCongestLevel">
+ <description>The congestion level of the link.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="CongestLevel">
+ <defaultValue>level_0</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="linkState">
+ <description>The link state of the Mtp3bSl.
+
+The link state is a bit map which contains a combination of the following values: (in hexadecimal format)
+
+0x00 Available
+0x01 Failed
+0x02 Remotely blocked
+0x04 Locally blocked
+0x08 Remotely inhibited
+0x10 Locally inhibited
+0x20 Deactivated</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="prioBeforeSio">
+ <description>This Boolean tells if the message priority shall be inserted in an octet before the Service Indicator Octet (SIO).
+
+China default is false.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="proceduralState">
+ <description>The procedural state of the link.
+
+0 - not initialized
+1 - initialized
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bProceduralState">
+ <defaultValue>NOT_INITIALIZED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="signLinkCode">
+ <description>The signalling link code, SLC, used for this link.
+The signLinkCode for a link must be unique between the nodes,
+independent on in which linkSet the link belongs.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>15</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tpId">
+ <description>The tpId attribute points out the termination point of the lower layer protocol.
+
+For narrowband this signalling link will be connected to an MTP L2 termination point (Mtp2Tp MO). And for broadband it will be connected to a NNI SAAL termination point (NniSaalTp Mo).</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="usageState">
+ <description>There are three possible states for the usageState attribute:
+
+- idle, the Mtp3bSl carries no traffic.
+- active, the Mtp3bSl is working normally, and there is traffic, and it is not congested.
+- busy, the Mtp3bSl is working but is congested (traffic is routed on other links).
+
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bUsageState">
+ <defaultValue>IDLE</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAALINServiceInd">
+ <description>Performance management counter for number of received link-in-service indications.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAALOUTInd">
+ <description>Performance management counter for number of received link-out-of-service indications.
+
+Note! This counter is incremented every time a link out of service indication is received for the link.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBDSent">
+ <description>Performance management counter for number of sent CBD messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOOXCOSent">
+ <description>Performance management counter for number of sent change over order (COO/XCO) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLocalLinkCongestCeaseRec">
+ <description>Performance monitoring counter for number of local link congestion ceased primitives received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLocalLinkCongestRec">
+ <description>Performance monitoring counter for number of local link congestion primitives received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSURec">
+ <description>Performance monitoring counter for number of received MSU's on this signalling link.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMSUSent">
+ <description>Performance monitoring counter for number of sent MSU's on this signalling link.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <action name="activate">
+ <description>This action activates the Mtp3bSl with normal alignment. It will also set autoStartLink = true.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="deactivate">
+ <description>This action deactivates the Mtp3bSl.
+It will also set autoStartLink = false.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="emergencyActivate">
+ <description>This action activates the Mtp3bSl with emergency alignment.
+It will also set autoStartLink = true
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="localInhibit">
+ <description>This action inhibits the Mtp3bSlChina. Signalling link management inhibiting is requested by management when it becomes necessary, e.g for maintenance or testing purposes to make or keep a signalling link unavailable to User Part-generated signalling traffic.
+Inhibiting of a signalling link may be requested by management function at either end of the link. The request is granted, provided that the inhibiting action does not cause any previously accessible destinations to become inaccessible at either end of the signalling link. The request may also be refused under certain circumstances such as congestion.
+Exception FroRequestFailed if it was not possible to inhibit.
+
+Note! This action requires a transaction.
+</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ <action name="localUninhibit">
+ <description>This action uninhibits the Mtp3bSlItu.
+
+Exception FrorequestFailed if it was not possible to uninhibit.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FroRequestFailedException"/>
+ </action>
+ </class>
+
+ <class name="Mtp3bSpChina">
+ <description>Mtp3b Signalling Point for the China standard.
+
+This MO represents/models the MTP3b Signaling Point characteristics/functions according to the China standard.
+A signaling point is a logical node in the signaling network. The combination of signaling points and their interconnecting
+signaling links form the SS No. 7 signaling network. The signaling point represented by this object is a Local Signaling Point.
+
+The performance monitoring counters found in Mtp3SpChina MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is shutdown request from CLI (Cluster Interface).
+
+NOTE: IT IS NOT POSSIBLE TO CREATE SIGNALLING POINTS OF DIFFERENT STANDARDS!
+
+NOTE: This MO cannot in anyway be related (either contain or by dependence) to an MO that belongs to a standard which is NOT the China standard.
+
+NOTE: The combination of network indicator (networkInd) and Signalling Point Code (signallingPointCode) has to be unique for each Signalling Point.
+
+NOTE: A maximum of 15 instances of this MO can be created on (referencing) the same PlugInUnit.
+
+NOTE: The maximum number of Signalling Points that can be created in a CPP based node is 24.
+
+NOTE: Deleting a singel L3 Signal Point is not possible, if it necessary to delete a Signal Point then all Signal Points has to be deleted. This also has to be done whitin the same transaction.
+
+NOTE: Any object created under a certain SP (Signaling Point) cannot refer to an object created under another SP. Nor can it refer to an object created under another SP.</description>
+ <attribute name="Mtp3bSpChinaId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="maxSizeChangeBuf">
+ <description>The maxSizeChangeBuf attribute represents the maximum size (in kB) of the changeover buffer.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>5000</max>
+ </range>
+ <defaultValue>2000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxSizeReroutBuf">
+ <description>The maxSizeReroutBuf attribute represents the maximum size (in kB) of the rerouting buffer.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>5000</max>
+ </range>
+ <defaultValue>2000</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="networkInd">
+ <description>The network indicator, NI, is used for discrimination of messages between functionally different networks.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="Mtp3bNetworkInd">
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operationalState attribute reflects the operational status of the MTP3b SP.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Holds a list of the reserving MO's. Can be of type SccpSp.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="sendSltmBefLink">
+ <description>The sendSltmBefLink attribute determines if the SLTM (Signalling Link Test Message) should be sent and a SLTA received before the link is considered to be in service.
+
+Note! It is not recommended nor is it in accordance with standard to set the value of this attribute to 'false' </description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="signallingPointCode">
+ <description>The signallingPointCode (Local Point Code) attribute (SPC) is used together with the network indicator (NI, networkInd attribute) to uniquely identify the MTP Signalling Point, SP.
+SP = NI-SPC.
+Size (2 exp 24)-1 (16777215).
+The SignallingPointCode (SPC) is nornally used as a whole unique number (no internal structure). But sometimes the SPC is grouped together as three numbers which corresponds to zone, area/network, signalling point. If this is the case the three numbers are coded as 8-8-8 bits in the total SPC. To enter the SPC-value then you have to convert the three numbers to their binary code and then convert the whole 24-bit pattern as an integer.
+ </description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>16777215</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="nodeBehaviour">
+ <description>The nodeBehaviour attribute represents the MTP3b node type.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="NodeBehaviourType">
+ <defaultValue>SEP</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="noOfCongestLevelForNI">
+ <description>Defines the number of congestion levels for NI.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>3</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="routeSetCongestTestFlag">
+ <description>Selection of which procedure to use during congestion handling if the national option with priorities is used.
+
+0, use TcTimer as described by the TTC standard.
+1, use Route Set Congestion Test as described by the ANSI, ITU and China Standard.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="resendTfcInterval">
+ <description>Send TFC back to originating signalling point code for every n:th message when
+the destination is congested. Set to 0 will suppress sending of TFC.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="sioSpare">
+ <description>The sioSpare attribute determines if the two spare bits in the SIO (Service Information Octet) should be treated as spare.</description>
+ <dataType>
+ <enumRef name="Mtp3bSioSpareBitsUse">
+ <defaultValue>SPARE</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="spPriority">
+ <description>Struct containing the priority attributes.
+
+Note: The China and ITU priorityData is identical so the ItuPriorityData is used for China to avoid duplication of data.</description>
+ <dataType>
+ <structRef name="Mtp3bSpChinaPriorityData"/>
+ </dataType>
+ </attribute>
+ <attribute name="spTimer">
+ <description>Struct containing China specific timer attributes</description>
+ <dataType>
+ <structRef name="Mtp3bSpChinaTimerData"/>
+ </dataType>
+ </attribute>
+ <attribute name="statusIndInterval">
+ <description>The statusIndInterval attribute sets the interval for sending MTP-STATUS indication, i.e. send indication every Nth message .</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="testPatternSltm">
+ <description>The testPatternSltm attribute represents a string testpattern in the Signalling Link Test Message.
+
+Minimum string length 2 characters, maximum 30 characters. Allowed characters are 0-9, A-F.
+Only even number of characters is allowed.
+
+</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>2</min> <max>30</max>
+ </lengthRange>
+ <defaultValue>"A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5"</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="transFrHandler">
+ <description>Determines if a TransFer Restricted signal (TFR) should be treated as a TFA (TransFer Allowed signal) or be ignored.
+</description>
+ <dataType>
+ <enumRef name="Mtp3bTfrHandling">
+ <defaultValue>IGNORED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="rpuId">
+ <description>Holds a reference to the Reliable Program Uniter.
+The RPU is at the server.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ReliableProgramUniter"/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="m3uaNoOfAttempsOfDauds">
+ <description>For M3UA, number of attempts to send the DAUD message.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="noOfAttempsOfAssociationEstablishment">
+ <description>Number of attempts to send the SCTP_ASSOCIATE_REQ message.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>65535</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="version">
+ <description>This attribute shows what MTP3b ITU standard the system follows. With ITU, it is possible using this attribute to set which of the ITU standard versions that shall be followed.
+
+Note! Setting of another value than 'ITU_T_07_96' at create will have no effect. The Signaling Point will always be created with the value 'ITU_T_07_96'.
+
+Note! It is not possible to hav signaling points with different versions in the node so setting of this attribute will effect all signaling points. The value for the last created or changed signaling point will be used for all signaling points.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="Mtp3bItuVersion">
+ <defaultValue>ITU_T_07_96</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBARec">
+ <description>Performance management counter for number of received CBA messages.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCBASent">
+ <description>Performance management counter for number of sent CBA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfChangeBackDeclRec">
+ <description>Performance management counter for number of received change Back Declarations (CBD) messages.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfChangeOverRec">
+ <description>Performance counter for number of changeOver order messages (COO/XCO) received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOAXCARec">
+ <description>Performance management counter for number of received COA/XCA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCOAXCASent">
+ <description>Performance management counter for number of sent COA/XCA messages.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfControlledRerouteSuccessPerf">
+ <description>Performance monitoring counter for number of successfully performed controlled rerouting.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECASent">
+ <description>Performance management counter for number of sent ECA messages.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECARec">
+ <description>Performance management counter for number of received ECA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfECOSent">
+ <description>Performance management counter for number of sent ECO messages.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfEmergencyChangeOverRec">
+ <description>Performance management counter for number of received emergency changeOver orders (ECO) messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfForcedRerouteSuccessPerf">
+ <description>Performance monitoring counter for number of successfully performed forced rerouting.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSLTAFirstTimeOutRec">
+ <description>Performance management counter for number of SLTA first time out received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSLTASecondTimeOutRec">
+ <description>Performance management counter for number of SLTA second time out received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTimerT21WasStarted">
+ <description>Performance monitoring counter for number of times the timer T21 was started (i.e. adjacent SP restarted).
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTRARec">
+ <description>Performance management counter for number of received TRA messages.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfTRASent">
+ <description>Performance management counter for number of sent TRA messages.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessControlledRerouting">
+ <description>Performance monitoring counter for number of unsuccessfully performed controlled reroutings.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessForcedRerouting">
+ <description>Performance monitoring counter for number of unsuccessfully performed forced reroutings.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUPMsgDiscardedDueToRoutingErr">
+ <description>Performance monitoring counter for number of UP (user part) messages (MTP_TRANSFER_req) discarded due to routing error.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuccessAssocEstablish">
+ <description>Performance management counter for number of successful association establishment.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessAssocEstablish">
+ <description>Performance management counter for number of unsuccessful association establishment.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpCommunicationErr">
+ <description>Performance management counter for number of SCTP communication error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpSendFailure">
+ <description>Performance management counter for number of SCTP send failure.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpBufOverflow">
+ <description>Performance management counter for number of SCTP stop sending data.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpResumeSending">
+ <description>Performance management counter for number of SCTP resume sending data.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpNetworkStatusChange">
+ <description>Performance management counter for number of SCTP network status change.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSctpAssociationRestart">
+ <description>Performance management counter for number of SCTP association restart.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuccessAssocAbort">
+ <description>The number of successful abortions of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSuccessAssocShutDown">
+ <description>The number of succesful shutdowns of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessAssocAbort">
+ <description>The number of unsuccessful abortions of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfUnsuccessAssocShutDown">
+ <description>The number of unsuccesful shutdowns of signalling associations.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIncomingAssocEstabRequestInStateDownWhenStateEstabIsBlocked">
+ <description>The number of incoming request for association establishment when state on the association is 'DOWN' and establishment of associations is blocked. </description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMaxTrialsForAssocEstabReached">
+ <description>The number of times that the max limit for trying to establish an association has been reached.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMaxTrialsForAssocActivReached">
+ <description>The number of times that the max limit for trying to activate an association has been reached.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfLowerPrioMsgDiscarded">
+ <description>The number of messages with low priority that has been discarded.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Mspg">
+ <description>The MSPG (Multiplex Section Protection Group) object enables two different protection mechanism in Cello. First it enables a standard 1+1 MSP mechanism. A failure on the working line will thus cause a sub 50 ms switch to the standby line.
+Secondly the MSPG is used to enable equipment protection, whereas a failure of the working board will cause a switch to the standby board. While executing an equipment protection switch, the node on the other end of the multiplexer section, will experience a standard 1+1 MSP switch.
+
+It is possible to force traffic to one port/board by using administrative state.
+Setting administrative state to locked on the working board, will automatically cause an equipment switch to the standby board. Similarily setting administrative state to locked on the working port, will cause an MSP switch to the standby port.
+
+The process of configuring a MSP protection interface is as follows:
+1) Create the working interface as normal.
+2) Create the standby interface by creating an Os155SpiTtp with mux mode set to STANDBY (standby for protection).
+3) Create a MSPG object with references to the two Os155SpiTtp objects.
+
+Note! The ports selected for MSPG must be have the attribute standardMode configured in exactly the same way.
+
+Note! The Os155SpiTtp created for standby will not create any children, i.e no Vc4Ttp or Vc4Ttp, Vc12Ttp and E1Ttp will be created. Nor will object of type Sts1SpeTtp, Vt15Ttp or T1Ttp be created.</description>
+ <attribute name="os155SpiWorkingId">
+ <description>The working OS155 pyhiscal path termination.
+This is the administrative value.
+
+To retrive the Id of the current working port, use the selectedPort.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Os155SpiTtp"/>
+ </dataType>
+ </attribute>
+ <attribute name="os155SpiStandbyId">
+ <description>The standby OS155 physical path termination.
+This is the administrative value.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Os155SpiTtp"/>
+ </dataType>
+ </attribute>
+ <attribute name="switchMode">
+ <description>The switching mode.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="SwitchModes">
+ <defaultValue>AUTOMATIC</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the Mspg.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="MspgId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="selectedPort">
+ <description>The port currently selected by the MSPG. The selected port can only
+change due to a MSP or equipment switch.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Os155SpiTtp"/>
+ </dataType>
+ </attribute>
+ <attribute name="selectedBoard">
+ <description>The board currently providing the user traffic interface to the Cello switch.
+The only action that can change the selected board is an equipment switch.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="degCauseMsp">
+ <description>If set to true, then a swith is performed upon detection of DEG.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <action name="manualMspSwitch">
+ <description>Initiates a switch when there does not exist a defect.
+
+This action can fail for the following reasons:
+FailedResource - the switch was not possible due to a traffic affecting fault on the port to which the switch was requested (i.e. the one not currently selected).
+LockedResource - the port to which the switch is intended is administratively locked.
+UnknownReason - there exists another fault that prevents the action.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="FailedResourceException"/>
+ <raisesException name="LockedResourceException"/>
+ <raisesException name="UnknownReasonException"/>
+ </action>
+ </class>
+
+ <class name="T1PhysPathTerm">
+ <description>This MO represents an T1 (i.e. 1.5 Mbit/s) physical interface in the node. The T1PhysPathTerm MO does not define which type of traffic (TDM or ATM) that the interface should support.
+Please refer to the Ds0Bundle, AtmPort, IMALink and IMAGroup objects for details about configuration of traffic type.
+
+</description>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="T1PhysPathTermId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="lineNo">
+ <description>The actual Line number on the board.
+</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>8</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="loopback">
+ <description>Possible values
+
+none - This is the normal state, no loop back is performed (and ordinary traffic is running).
+
+line - The physical path is looped on the line side, the external incoming path is looped back to the external outgoing path.
+
+system - The physical path is looped on the system side, the (node-) internal incoming path is looped back to the internal outgoing path.
+
+Note! administrativeStatus must be set to locked when setting loopback attribute.</description>
+ <dataType>
+ <enumRef name="LoopbackState">
+ <defaultValue>none</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmEs">
+ <description>Performance monitoring counter for Errored Seconds, ES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSes">
+ <description>Performance monitoring counter for Severly Errored Seconds, SES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedByTraffic">
+ <description>The identity of the reserving AtmPort MO. </description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="AtmPort"/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Enabled or disabled according to the actual operational state of the Physical Line Termination. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="rdiReporting">
+ <description>Indicates whether Remote Defect Indication, RDI, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="aisReporting">
+ <description>Indicates whether Alarm Indication Signal, AIS, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="shutDownTimeout">
+ <description>The shut-down timer. It is used when the administrativeState is set to shutdown.
+
+Value in seconds, must be a positive value.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100000</max>
+ </range>
+ <defaultValue>1800</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="idlePattern">
+ <description>The idle pattern.
+
+NOTE: Going from A_LAW or U_LAW to UNDEFINED is always allowed but setting up one ET board with
+both U_LAW and A_LAW is not allowed.
+E.g. If you want to change from A_LAW to U_LAW on one ET board you have to change idlePattern
+on each physical port belonging to the board to UNDEFINED first.
+A_LAW -&gt; UNDEFINED -&gt; U_LAW or U_LAW -&gt; UNDEFINED -&gt; A_LAW</description>
+ <dataType>
+ <enumRef name="IdlePattern">
+ <defaultValue>UNDEFINED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="transmissionMode">
+ <description>The type of transmission media.
+Refer to the TransmissionMode enumeration for details.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="TransmissionMode">
+ <defaultValue>S_133</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBySync">
+ <description>The identity of the reserving Synchronization MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Synchronization"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedByImaLink">
+ <description>The identity of the reserving ImaLink MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ImaLink"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="ImaGroup">
+ <description>IMA, Inverse Multiplexing for ATM, makes it possible to group several physical
+interfaces together to form a virtual physical pipe for atm. The capacity of this
+pipe is equal to the sum of each of the physical interfaces included in the
+group.
+
+When IMA should be configured, an ATMPort MO is created with reference to an
+IMAGroup MO rather than a pure physical interface MO.
+The IMAGroup MO in turn is created with a list of the physical port MO's that
+are included in the group. The physical port MO's must be of the same type
+and be located on the same ET board.
+
+For each of the physical port MO's included in the IMAGroup, an IMALink object
+is automatically created. The IMALink object is responsible for handling link
+specific performance and fault management related to IMA.
+
+The ports can be of type E1PhysPathTerm, J1PhysPathTerm, T1PhysPathTerm, E1Ttp, T1Ttp.
+
+The performance monitoring counters in the ImaGroup MO is set to 0 (zero) at start or restart of the node.
+When the value is to large too fit in to a long (31bit) the counter turns over and starts from 0 again.
+
+Note! A general restriction in Cello is that ports being part of the same IMA group
+must be located on the same board.
+
+Note! Only termination points on Etmc1 and Etmc41 boards are allowed as ImaLinks.
+
+Note! At least two links has to be configured in an Ima Group.</description>
+ <attribute name="ImaGroupId">
+ <description>The identity of the MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="physicalPortList">
+ <description>Holds a list of the physical ports connected to the ImaGroup.
+Can be of type:
+E1PhysPathTerm,
+J1PhysPathTerm,
+T1PhysPathTerm,
+E1Ttp,
+T1Ttp.</description>
+ <mandatory/>
+ <noNotification/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="requiredNumberOfLinks">
+ <description>The required number of links specifies the number of IMALinks that needs to be
+operational in order for the complete group to be operational. The bandwidth
+available for the ATMPort (and thus for creating VP/VC connections) is defined
+by this number.
+Setting the requiredNumberOfLinks field to K less than the number of physical
+links included in the IMAGroup, will reduce the bandwidth available to the atmport
+with the corresponding bandwidth but will also give the effect that K links
+failures can be tolerated with virtually no traffic disturbance.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>8</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="activeLinks">
+ <description>The number of active links in the ImaGroup.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Enabled or disabled according to the actual operational state of the ImaGroup.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmGrUasIma">
+ <description>This performance counter reflects the GrUasLma attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmGrFc">
+ <description>This performance counter reflects the GrFc attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmGrFcFe">
+ <description>This performance counter reflects the GrFcFe attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="AtmPort"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="ImaLink">
+ <description>This MO is automatically created as a consequence of creating an IMAGroup or
+adding links to an IMAGroup.
+It provides IMA Link specific performance and fault management information.
+
+The links can be of type E1PhysPathTerm, J1PhysPathTerm, T1PhysPathTerm, E1Ttp or T1Ttp.
+
+The performance monitoring counters in the ImaLink MO is set to 0 (zero) at start or restart of the node.
+When the value is to large too fit in to a long (31bit) the counter turns over and starts from 0 again.
+
+Note! A general restriction in Cello is that ports being part of the same IMA group
+must be located on the same board.</description>
+ <attribute name="operationalState">
+ <description>Enabled or disabled according to the actual operational state of the ImaLink.
+If the operationalState is disabled the ImaLink will be blocked for traffic.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmIvIma">
+ <description>This performance counter reflects the LvLma attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ImaLinkId">
+ <description>The identity of the MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="pmOifIma">
+ <description>This performance counter reflects the OifLma attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSesIma">
+ <description>This performance counter reflects the SesLma attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSesImaFe">
+ <description>This performance counter reflects the SesLmaFe attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUasIma">
+ <description>This performance counter reflects the UasLma attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUasImaFe">
+ <description>This performance counter reflects the UasLmaFe attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmTxUusIma">
+ <description>This performance counter reflects the TxUusLma attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmRxUusIma">
+ <description>This performance counter reflects the RxUusLma attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmTxUusImaFe">
+ <description>This performance counter reflects the TxUusLmaFe attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmRxUusImaFe">
+ <description>This performance counter reflects the RxUusLmaFe attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmTxFc">
+ <description>This performance counter reflects the TxFc attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmRxFc">
+ <description>This performance counter reflects the RxFc attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmTxFcFe">
+ <description>This performance counter reflects the TxFcFe attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmRxFcFe">
+ <description>This performance counter reflects the RxFcFe attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmTxStuffIma">
+ <description>This performance counter reflects the TxStuffLma attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmRxStuffIma">
+ <description>This performance counter reflects the RxStuffLma attribute as defined by Inverse Multiplexing for ATM(IMA) specification ver. 1.1, AF-PHY-0086.001</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="uses">
+ <description>Reference to the physical port represented by this MO.
+Can be of types E1PhysPathTerm, J1PhysPathTerm, T1PhysPathTerm, E1Ttp or T1Ttp.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Sts3CspeTtp">
+ <description>This MO represents the termination of the SONET higher order paths.
+This MO is automatically created when creating the OS155SPITTP with mux mode
+set to VC4_STS3CSPE_LEVEL and standardMode set to ANSI.
+
+The performance monitoring counters in the Sts3CspeTtp MO is set to 0 (zero) at start or restart of the node.
+When the value is to large to fit in to a long (31bit) the counter turns over and starts from 0 again.</description>
+ <attribute name="Sts3CspeTtpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>User label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>enabled or disabled according to the actual operational state of the Sts3CspeTtp.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="aisPReporting">
+ <description>Indicates whether Alarm Indication Signal, AIS, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="rdiPReporting">
+ <description>Indicates whether Remote Defect Indication, RDI, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="timConsequentAction">
+ <description>Trace Identifier Mismatch (TIM) consequent action, i.e. for generation of Alarm Indication Signal (AIS) downstream and Remote Defect Indication (RDI) upstream as a consequence of the TIM detection.
+
+True - enabled.
+False - disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="expectedPathTrace">
+ <description>Expected path trace.
+
+The string can be of 64 characters length, or empty string ("").
+The string shall consist of 62 ASCII characters followed by CR/LF.
+The empty string shall be coded with the first character equal to ASCII null (i.e. byte value 0) and the rest dummy or non-existing.
+
+Note: An empty string for this attribute means that the detection of Trace Identifier Mismatch (TIM) should be disabled. This attribute is set to empty string every time attribute pathTraceFormat is set.</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>64</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="transmittedPathTrace">
+ <description>The transmitted path trace.
+
+The string shall consist of 62 ASCII characters followed by CR/LF.
+The empty string shall be coded with the first character equal to ASCII null (i.e. byte value 0) and the rest dummy or non-existing.</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>64</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Identity of the AtmPort reserving this MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="AtmPort"/>
+ </dataType>
+ </attribute>
+ <attribute name="pmEsp">
+ <description>Performance Monitoring counter for ES, Errored Seconds.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSesp">
+ <description>Performance Monitoring counter for Severely Errored Seconds, SES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="WebServer">
+ <description>The WebServer MO represents the WebServer in the node.
+
+This object is used for configuration of the WebServer paths. By connecting this object to a
+SwAllocation MO that is connected to a Repertoire MO the WebServer paths will be
+automatically configured during system upgrade.
+
+The local distinguished name of this MO is ManagedElement=1, WebServer=1.
+
+The WebServer MO is created automatically by the system.</description>
+ <systemCreated/>
+ <attribute name="WebServerId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="webServerPaths">
+ <description>Paths that shall be used by the WebServer separated by the delimiter character ":".</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBySwAllocation">
+ <description>List of reserving MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="SwAllocation"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="IpAccessAutoConfig">
+ <description>This MO represents the Auto Configuration feature for the IpAccessHost's in Cello.
+
+</description>
+ <attribute name="IpAccessAutoConfigId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Hold a list of the identitys of the reserving IpAccessHost's.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="networkPrefix">
+ <description>The network prefix.
+
+The prefix denotes how many bits that are used for calculating the subnet mask.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>32</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="nrOfUnusedAdresses">
+ <description>The number of addresses in the range that are not used.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="totalNrOfAddresses">
+ <description>The total number of addresses in the range.
+
+Note that the first address in the range will be the same one as the one for networkAddress.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="minIpAddress">
+ <description>The lowest value that can be used as host IP address. If autoConfig=ON for an IpAccessHost, the operator does not explicitly have to assign an Ip Address and prefixLength to the host. This is done by the Control Plane, based on the IpAccesAutoConfig identity specified for the IpAccessHost.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="maxIpAddress">
+ <description>The highest value that can be used as host IP address. If autoConfig=ON for an IpAccessHost, the operator does not explicitly have to assign an Ip Address and prefixLength to the host. This is done by the Control Plane, based on the IpAccesAutoConfig identity specified for the IpAccessHost.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="IpAccessHostMsb">
+ <description>This MO represents the Ip Access Host used for payload. This host type executes on a MSB board (Media Stream Board used by Media Gateway).
+
+Note! If autoConfig is set to ON, the Ip Addresses and the Prefixes for this MO is set by the IpAccessAutoConfig MO.
+
+Note! There can be a maximum of 128 host's in the node.
+
+Note! The references to Aal5TpVccTp MO's has to be set in pairs.
+
+Note! The IpAccessMsbHost must execute on the sam MP as the Aal5TpVccTp that are defined in the attributes 'aal5TpVccTpRef1' and 'aal5TpVccTpRef2'.
+
+Note! The 'administrativeState' has to be set to LOCKED in order to be able to delete this host.</description>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the Ip Access Host.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>DEGRADED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state of the Ip Access Host.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="shutDownTimer">
+ <description>The shut-down timer. It is used when the administrativeState is set to shutdown.
+
+Value in seconds, must be a positive value.</description>
+ <dataType>
+ <long>
+ <defaultValue>10</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="dspId">
+ <description>The identity of the DSP (Digital Signalling Processor) on a MSB board.
+
+Note! The value of this attribute has to be unique among the host's that execute on the same board.</description>
+ <mandatory/>
+ <noNotification/>
+ <nonPersistent/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>16</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="aal5TpVccTpRef1">
+ <description>Holds a reference to an Aal5 termination point (Aal5TpVccTp MO).
+
+Note! The Aal5TpVccTp references are mutually exclusive.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Aal5TpVccTp"/>
+ </dataType>
+ </attribute>
+ <attribute name="aal5TpVccTpRef2">
+ <description>Holds a reference to an Aal5 termination point (Aal5TpVccTp MO).
+
+Note! The Aal5TpVccTp references are mutually exclusive.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Aal5TpVccTp"/>
+ </dataType>
+ </attribute>
+ <attribute name="autoConfig">
+ <description>This attribute specifies whether the auto configuration feature for the Ip Access Host is used or not.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="AutoConfigurationMode">
+ <defaultValue>OFF</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="autoConfigIdentity">
+ <description>The identity of the IpAccessAutoConfig MO used by this host.
+
+Note! This attribute can only be set if 'autoConfig' is set to 'ON'.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="IpAccessAutoConfig"/>
+ </dataType>
+ </attribute>
+ <attribute name="ipAddress">
+ <description>The IpAddress.
+
+Note! If autoConfig = OFF this attribute is mandatory.
+
+Note! If the autoConfiguration is used for this IpAccessHost (autoConfig = ON) this attribute cannot be set. This attribute is then set by the 'IpAccessAutoConfig MO'.
+
+Note! The IpAddress has to be unique within the node.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="networkPrefix">
+ <description>The network prefix.
+
+The prefix denotes how many bits that are used for calculating the subnet mask.
+
+Note! If auto configuration is used (autoConfig = ON) this attribute cannot be set, the networkPrefix is then set in the ipAccessAutoConfig MO class.
+
+Note! If auto configuration is not used (autoConfig = OFF) this attribute must be set.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>32</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="linkStatusAddress">
+ <description>The link Status for Ip Address.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="mtu">
+ <description>The maximum transfer unit.
+
+Note! in order to be able to set the value for this attribute, the administrative state has to be locked.
+
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>72</min> <max>2048</max>
+ </range>
+ <defaultValue>1024</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="ipDefaultTtl">
+ <description>The default value inserted into the Time-To-Live field of the IP header of datagrams originated at this entity,
+whenever a TTL value is not supplied by the transport layer protocol.
+
+Note! in order to be able to set the value for this attribute, the administrative state has to be locked.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>255</max>
+ </range>
+ <defaultValue>50</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInReceives">
+ <description>The total number of input datagrams received from interfaces, including those received in error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInHdrErrors">
+ <description>The number of input datagrams discarded due to errors in their IP headers, including bad checksums, version number
+mismatch, other format errors, time-to-live exceeded, errors discovered in processing their IP options, etc.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInAddrErrors">
+ <description>The number of input datagrams discarded because the IP address in their IP header's destination field was not a
+valid address to be received at this entity. This count includes invalid addresses (e.g., 0.0.0.0) and addresses of
+unsupported Classes (e.g., Class E). For entities which are not IP routers and therefore do not forward datagrams,
+this counter includes datagrams discarded because the destination address was not a local address.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInUnknownProtos">
+ <description>The number of locally-addressed datagrams received successfully but discarded because of an unknown or
+unsupported protocol.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInDiscards">
+ <description>The number of input IP datagrams for which no problems were encountered to prevent their continued processing, but which
+were discarded (e.g., for lack of buffer space). Note that this counter does not include any datagrams discarded while
+awaiting re-assembly.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInDelivers">
+ <description>The total number of input datagrams successfully delivered to IP user-protocols (including ICMP).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpOutRequests">
+ <description>The total number of IP datagrams which local IP user-protocols (including ICMP) supplied to IP in requests for
+transmission. Note that this counter does not include any datagrams counted in ipForwDatagrams</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpOutDiscards">
+ <description>The number of output IP datagrams for which no problem was encountered to prevent their transmission to their
+destination, but which were discarded (e.g., for lack of buffer space). Note that this counter would include
+datagrams counted in ipForwDatagrams if any such packets met this (discretionary) discard criterion.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInMsgs">
+ <description>The total number of ICMP messages which the entity received.
+Note that this counter includes all those counted by icmpInErrors</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInErrors">
+ <description>The number of ICMP messages which the entity received but determined as having
+ICMP-specific errors (bad ICMP checksums, bad length, etc.).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInDestUnreachs">
+ <description>The number of ICMP Destination Unreachable messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInTimeExcds">
+ <description>The number of ICMP Time Exceeded messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInParamProbs">
+ <description>The number of ICMP Parameter Problem messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInSrcQuenchs">
+ <description>The number of ICMP Source Quench messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInRedirects">
+ <description>The number of ICMP Redirect messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInEchos">
+ <description>The number of ICMP Echo (request) messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInEchoReps">
+ <description>The number of ICMP Echo Reply messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutMsgs">
+ <description>The total number of ICMP messages which this entity attempted to send.
+Note that this counter includes all those counted by icmpOutErrors.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutErrors">
+ <description>The number of ICMP messages which this entity did not send due to problems discovered within ICMP such as a lack of
+buffers. This value should not include errors discovered outside the ICMP layer such as the inability of IP to route the
+resultant datagram. In some implementations there may be no types of error which contribute to this counter's value.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutDestUnreachs">
+ <description>The number of ICMP Destination Unreachable messages sent.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutParmProbs">
+ <description>The number of ICMP Parameter Problem messages sent.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutEchos">
+ <description>The number of ICMP Echo (request) messages sent.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutEchoReps">
+ <description>The number of ICMP Echo Reply messages sent.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUdpInDatagrams">
+ <description>The total number of UDP datagrams delivered to UDP users.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUdpNoPorts">
+ <description>The total number of received UDP datagrams for which there was no application at the destination port.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUdpInErrors">
+ <description>The number of received UDP datagrams that could not be delivered for
+reasons other than the lack of an application at the destination port.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUdpOutDatagrams">
+ <description>The total number of UDP datagrams sent from this entity.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="IpAccessHostMsbId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="plugInUnitId">
+ <description>Holds a reference to the PlugInUnit.
+
+Note that the 'plugInUnitId has to be the same as the one defined in the attribute 'processorId' found on the Aal5TpVccTpMo.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="PlugInUnit"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Aal2QosProfile">
+ <description>This MO represents the definitions of properties for a set of Aal2 quality of service classes.</description>
+ <attribute name="Aal2QosProfileId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="profileClassA">
+ <description>This attribute holds the values applicable for QoS Class A.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="QoSProfileClassA"/>
+ </dataType>
+ </attribute>
+ <attribute name="profileClassB">
+ <description>This attribute holds the values applicable for QoS Class B.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="QoSProfileClassB"/>
+ </dataType>
+ </attribute>
+ <attribute name="profileClassC">
+ <description>This attribute holds the values applicable for QoS Class C.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="QoSProfileClassC"/>
+ </dataType>
+ </attribute>
+ <attribute name="profileClassD">
+ <description>This attribute holds the values applicable for QoS Class D.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="QoSProfileClassD"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>List of reserving Aal2PathVccTp MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="Aal2PathVccTp"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Aal2QosCodePointProfile">
+ <description>This MO represents the QoS CodePoints for the different Aal2 QoS classes.</description>
+ <attribute name="Aal2QosCodePointProfileId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="qualityOfServiceCodePointA">
+ <description>The Code Point for Class A.
+
+Recommended value for Class A, 128.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="qualityOfServiceCodePointB">
+ <description>The Code Point for Class B.
+
+Recommended value for Class B, 129.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="qualityOfServiceCodePointC">
+ <description>The Code Point for Class C.
+
+Recommended value for Class C, 130.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="qualityOfServiceCodePointD">
+ <description>The Code Point for Class D.
+
+Recommended value for Class D, 131.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Holds the identity of the reserving Aal2Ap Mo.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="Aal2Ap"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="M3uAssociation">
+ <description>This MO represents the M3UA Association part of the M3UA (MTP3-User Adaptaion Layer) that is a protocol
+for the transport of any SS7 MTP3-User signalling (e.g., ISUP and SCCP messages) over IP using the services
+of the Stream Control Transmission Protocol.
+
+Note that the local port number is hard coded to 2905.
+
+
+</description>
+ <attribute name="M3uAssociationId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Holds a list of the reserving Signaling Route's (Mtp3bSr MO).
+</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="Mtp3bSr"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The Operational State of the M3Ua</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="mtp3bSrsId">
+ <description>The identity of the Signalling Route Set used.</description>
+ <mandatory/>
+ <noNotification/>
+ <nonPersistent/>
+ <restricted/>
+ <dataType>
+ <moRef name="Mtp3bSrs"/>
+ </dataType>
+ </attribute>
+ <attribute name="sctpId">
+ <description>The SctpHost used by this association.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Sctp"/>
+ </dataType>
+ </attribute>
+ <attribute name="dscp">
+ <description>The DSCP, DiffServCodePoint, for the internal M3UA user.
+Only one DSCP value is valid and set by the first defined MO 'instance'.
+
+NOTE: The value set for the 'dscp' when creating the first M3uAssociation under a signaling point will also be used for all other M3uAssociation MO's that are created under this signaling point. So setting the value for the 'dscp' on other instances than the first one created will have no effect. Note that associations created under a different signaling point can have a different dscp-value. </description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>63</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="associationState">
+ <description>The possible states of an M3Ua association.
+
+Bit 1 = 1 indicates INACTIVE
+Bit 2 = 1 indicates ACTIVE
+Bit 3 = 1 indicates ESTABLISHED
+Bit 4 = 1 indicates DOWN
+
+These values are mutually exclusive.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>15</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="localIpMask">
+ <description>This attribute denotes whether single or multi homing is used.
+
+Note! that all M3uAssociations that refers to the same SCTP MO must have this attribute set to the same value.
+
+Note! If localipMask=2 or localipMask=3 . the attribute ipAddress2 or autoConfigIdentity2 in IpAccessHostGpb MO must be defined.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="HomingState">
+ <defaultValue>SINGLE_HOMED_1</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="autoStartAssociation">
+ <description>If true, the M3ua layer in the stack will after a restart, start up all signalling associations.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="remotePortNumber">
+ <description>The port number of the remote signalling point (SP).</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>65535</max>
+ </range>
+ <defaultValue>2905</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="remoteIpAddress1">
+ <description>Remote IpAddress 1, if not used the value should be an empty string.
+Range is 0.0.0.0 - 255.255.255.255
+
+Note! This address is concidered as the primary IP-address. In case of association establisment failure 'remoteIpAddress2' will be used.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="remoteIpAddress2">
+ <description>Remote IpAddress 2, if not used the value should be an empty string.
+Range is 0.0.0.0 - 255.255.255.255
+
+Note! This address cannot be the same as remoteIpAddress1. This address is used when trying to establish association in case association attempt using 'remoteIpAddress1' fails.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCommunicationLost">
+ <description>Number of communication losses.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfCongestions">
+ <description>Number of congestions.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDunaRec">
+ <description>Number of DUNA messages received through the association.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDavaRec">
+ <description>Number of DAVA messages received through the association.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSconRec">
+ <description>Number of SCON messages received through the association.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDupuRec">
+ <description>Number of DUPU messages received through the association.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDataMsgSent">
+ <description>The number of data messages sent on the associations related to this signalling point.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDunaSent">
+ <description>Number of DUNA messages sent through the association.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDavaSent">
+ <description>Number of DAVA messages sent through the association.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfSconSent">
+ <description>Number of SCON messages sent through the association.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDupuSent">
+ <description>Number of DUPU messages sent through the association.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDataMsgRec">
+ <description>Number of DATA (payload data) messages received through the association.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfErrorMsgRec">
+ <description>Number of ERROR messages received through the association.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfErrorMsgSent">
+ <description>Number of ERROR messages sent through the association.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfNotifyMsgRec">
+ <description>Number of NOTIFY messages received through the association.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDaudMsgSent">
+ <description>The number of daud messages sent on the associations related to this signalling point.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfDaudMsgRec">
+ <description>The number of daud messages received on the associations related to this signalling point.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspupSent">
+ <description>The number of ASPUP sent.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspupReceived">
+ <description>The number of ASPUP received.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspdnSent">
+ <description>The number of ASPDN sent.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspdnReceived">
+ <description>The number of ASPDN received.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspacSent">
+ <description>The number of ASPAC sent.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspacReceived">
+ <description>The number of ASPAC received.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspiaSent">
+ <description>The number of ASPIA sent.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspiaReceived">
+ <description>The number of ASPIA received.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspupAckSent">
+ <description>The number of ASPUP_Ack sent.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspupAckReceived">
+ <description>The number of ASPUP_Ack received.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspdnAckSent">
+ <description>The number of ASPDN_Ack sent.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspdnAckReceived">
+ <description>The number of ASPDN_Ack received.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspacAckSent">
+ <description>The number of ASPAC_Ack sent.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspacAckReceived">
+ <description>The number of ASPAC_Ack received.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspiaAckSent">
+ <description>The number of ASPIA_Ack sent.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfAspiaAckReceived">
+ <description>The number of ASPIA_Ack received.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfM3uaDataMsgDiscarded">
+ <description>The number of data Messages discarded.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <action name="setAutoActivate">
+ <description>This action starts the association.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="setAutoDown">
+ <description>This action stops the association.
+
+Note! This action requires a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ </class>
+
+ <class name="Sctp">
+ <description>This MO represents the SCTP, Stream Control Transmission Protocol in Cello.
+SCTP is designed to transport signaling messages over IP networks.</description>
+ <attribute name="SctpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the Ip Access Host.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="numberOfAssociations">
+ <description>The maximum number of M3uAssociations that can be handled by this SCTP MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>512</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Holds a list of the M3Ua's handled by the SCTP.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="M3uAssociation"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="ipAccessHostGpbId">
+ <description>The identity of the IpAccessHostGbp reserved by this MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="IpAccessHostGpb"/>
+ </dataType>
+ </attribute>
+ <attribute name="minimumRto">
+ <description>The minimum value for RTO (Retransmission time-out).
+The minimumRto shall be larger than tSack + expected Round Trip Time.
+
+Unit is second/100.
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>4</min> <max>500</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maximumRto">
+ <description>The maximum value for RTO (Retransmission time-out).
+
+Unit is second/100.
+
+maximumRto must be larger than minimumRto.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>4</min> <max>180000</max>
+ </range>
+ <defaultValue>15</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="initialRto">
+ <description>The initial value that the RTO (Retransmission time-out) will take prior to the first RTT (Round Trip Time) measure.
+
+Note that the value for 'initialRto' has to be equal to or greater than 'minimumRto'.
+
+Unit is seconds/100.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>4</min> <max>180000</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="rtoAlphaIndex">
+ <description>This parameter is used for computing the value of the SRTT (Smoothed Round Trip Time) for a specific destination
+address. Is is used to weight the RTT values, and it's value must be between 0 and 1 (0 &lt; rtoAlpha &lt; 1). A value
+close to 1 gives a higher importance to the last RTT measurement.
+The range of possible values in the configuration file and the actual value given to this parameter within the module
+are the following:
+
+rtoAlphaIndex = 1 -&gt; RTO-Alpha = 1/2
+rtoAlphaIndex = 2 -&gt; RTO-Alpha = 1/4
+rtoAlphaIndex = 3 -&gt; RTO-Alpha = 1/8
+rtoAlphaIndex = 4 -&gt; RTO-Alpha = 1/16</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>4</max>
+ </range>
+ <defaultValue>3</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="rtoBetaIndex">
+ <description>This parameter is used for computing the the value of RTTVar (Round Trip Time Variation) of a destination
+address.
+It's value must be between 0 and 1 (0 &lt; rtoBetaIndex &lt; 1). A value close to 1 gives more importance to the
+last observed variation.
+The range of possible values in the configuration file and the actual value given to this parameter within the module
+are the following:
+
+rtoBetaIndex = 1 -&gt; RTO-Beta = 1/2
+rtoBetaIndex = 2 -&gt; RTO-Beta = 1/4
+rtoBetaIndex = 3 -&gt; RTO-Beta = 1/8
+rtoBetaIndex = 4 -&gt; RTO-Beta = 1/16
+</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>4</max>
+ </range>
+ <defaultValue>2</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="validCookieLife">
+ <description>This parameter sets up the lifespan of the State Cookie sent in the INIT_ACK chunk. It is used for limiting the
+the valid amount of time between sending the INIT_ACK and the reception of a COOKIE_ECHO chunk when
+establishing an association.
+If a COOKIE_ECHO chunk arrives after 'validCookieLife' has expired when sending an INIT_ACK chunk, the
+COOKIE_ECHO shall be discarded and no association will be established.
+
+Unit is seconds.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>180</max>
+ </range>
+ <defaultValue>60</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="allowedIncrementCookieLife">
+ <description>The sender of an INIT chunk may request to the remote endpoint a cookie life-span increase (for example, if a previous attempt to
+connect failed due to a state-cookie error). If the value sent in the "Cookie Preservative field" of the INIT chunk is less or equal to
+this parameter, the reciver of the INIT chunk will increase the 'validCookieLife' with the number of seconds specified. If the value
+present in the "Cookie Preservative field" is higher than this parameter, the cookie life should be incremented with the number of
+seconds specified by the parameter.
+
+Unit is seconds.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>180</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="keyChangePeriod">
+ <description>Defines how often the secret key used for computing the MAC (Message Authentication Code) on the State Cookie is changed.
+
+Unit is seconds.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>180</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="associationMaxRtx">
+ <description>This is the maximum number of consecutive retransmissions to a remote peer (on all the destination transport addresses of the peer, if it's multi homed). If the number of retransmissions becomes higher than this value, the remote peer shall be considered unreachable and the association shall be closed down.
+
+The value of this attribute should be greater than, or equal to the value of the attribute 'pathMaxRtx'.
+
+Note that for a specific association, it might happen that all the remote addresses (if the the remote end is multi homed) becomes unreachable without exceeding the 'associationMaxRtx'. In such a case the association will be closed down.
+
+Note! The value need to be increased to avoid frequent CommLost's in case of an unstable network.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>20</max>
+ </range>
+ <defaultValue>2</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pathMaxRtx">
+ <description>Maximum number of consecutive retransmissions to a remote transport address. If the number of retransmissions becomes higher than this value, the remote transport address shall be considered as "inactive" and no data shall be sent to it. If all of the remote transport addresses becomes "inactive", tha association will be closed down.
+
+Note! The value need to be increased to avoid frequent CommLost's in case of an unstable network.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>20</max>
+ </range>
+ <defaultValue>2</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxInitialRtrAtt">
+ <description>The maximum nimber of retransmissions allowed for both INIT and COOKIE_ECHO chunks. If the number of retransmissions
+exceeds this value, then the SCTP must abort the initialization of the association and report the error to the user.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>16</max>
+ </range>
+ <defaultValue>8</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxShutDownRtrAtt">
+ <description>The maximum number of retransmission during the shutdown phase of an association.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>16</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="heartbeatInterval">
+ <description>The amount of time added to the RTO (Retransmission Time Out) of a specific address when setting up the period of
+time between sending heartbeats. Small values can lead to an earlier detection of unreachable addresses than higher
+values. Note that sendig often might lead to performace penalty.
+
+Unit is seconds.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>1800</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="heartbeatStatus">
+ <description>This attribute enables/disables heartbeats for associations.
+
+True = Enables</description>
+ <dataType>
+ <boolean>
+ <defaultValue>true</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="maxIncomingStream">
+ <description>This is the maximum incoming streams (MIS) for an association. Established associations might have an IS less or equal to
+this, but it's MIS can never be higher than the value of this attribute.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>16384</max>
+ </range>
+ <defaultValue>17</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxOutgoingStream">
+ <description>The maximum number of outgonig streams for an association.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>16384</max>
+ </range>
+ <defaultValue>17</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxUserDataSize">
+ <description>The maximum number of bytes a user is allowed to pass as a non fragmentable user data in a SCTP_SEND_REQ message
+(fixed user MTU):
+The values for this attribute is 'user' data and do not include IP header (20 bytes), SCTP header (12 bytes) or DATA chunk
+header (16 bytes).
+
+Unit is bytes.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>528</min> <max>65484</max>
+ </range>
+ <defaultValue>1432</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="mBuffer">
+ <description>This attribute sets the size of the buffer used for storing user data pending to be sent or retransmitted in an association. I.e. establish the maximum amount of user data that SCTP shall buffer before discarding user messages.
+
+The Unit is in kilo bytes.
+
+Note! The restriction on this attribute is:
+mBuffer x number of M3uAssociation MOs connected to this Sctp + 20 Mb &lt;= the heap for Sctp program.
+
+Note! The value may need to be increased to ensure stable dataflow at high load.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>2048</max>
+ </range>
+ <defaultValue>128</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="nThreshold">
+ <description>This attribute sets the value of the threshold used by SCTP to stop the delivery of data on anassociation.
+Once nThreshold or more bytes are queued and pending to be sent, the SCTP layer shall issue an indication to the user.
+The value of nThreshold should be less than mBuffer in order to be effective. A normal value for nThreshold is 3/4 * mBuffer.
+
+Unit is kilo bytes.
+
+Note! The value may need to be increased to ensure stable dataflow at high load.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>2048</max>
+ </range>
+ <defaultValue>96</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="tSack">
+ <description>The delay of sending the SACK. I.e. the time from DATA chunk reception to Sack chunk sending.
+
+Unit is second/100</description>
+ <dataType>
+ <long>
+ <range>
+ <min>2</min> <max>50</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxDataSizeIp">
+ <description>The maximum number of bytes SCTP shall be able to fetch every time it reads from the socket.
+
+Note! This value includes the Ip header, 20 bytes.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1500</min> <max>65535</max>
+ </range>
+ <defaultValue>8192</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="initialAdRecWin">
+ <description>The value of the initial advertised reciver window.
+
+Note! The range is 1500 to maxDataSizeIp.
+
+Unit is bytes.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1500</min> <max>65535</max>
+ </range>
+ <defaultValue>8192</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="intervalOobPkts">
+ <description>The number of seconds for the interval for which the counter for out of the blue chunks will be reset.
+
+Unit is seconds.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>6500</max>
+ </range>
+ <defaultValue>3600</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="intervalLostUser">
+ <description>The number of seconds for the interval for which the SCTP will decide that the SCTP user that lost the
+connection is dead. After the time specified in this attribute has elapsed, all associations related to the
+SCTP user will be destroyed.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>3600</max>
+ </range>
+ <defaultValue>5</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="maxBurst">
+ <description>The number of packages that will be sent during the fast retransmit phase when a SACK is processed.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>16384</max>
+ </range>
+ <defaultValue>4</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="nPercentage">
+ <description>The size of 'n' inpercentage when SCTP_CONGESTION_CEASE_IND is sent. At 100 percent the
+primitive will buffer usage goes below 'nThreshold'.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>100</max>
+ </range>
+ <defaultValue>85</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="bundlingActivated">
+ <description>This attribute enables/disables the use of bundling.
+Valid values:
+1: enabled.
+0: disabled.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>1</max>
+ </range>
+ <defaultValue>1</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="bundlingTimer">
+ <description>This attribute specifies maximum SCTP bundling delay.
+Value=0 means that SCTP will only bundle what is available and send directly (no delay).
+Unit is milliseconds</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>1000</max>
+ </range>
+ <defaultValue>10</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpCurrEstab">
+ <description>Number of SCTP associations for which the current state is either ESTABLISHED, SHUTDOWN-PENDING, or SHUTDOWN-RECEIVED.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpActiveEstab">
+ <description>Number of times that SCTP associations have made a direct transition to the ESTABLISHED state from the COOKIE-ECHOED state.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpPassiveEstab">
+ <description>Number of times that SCTP associations have made a direct transition to the ESTABLISHED state from the CLOSED state.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpAborted">
+ <description>Number of times that SCTP associations have made a direct transition to the CLOSED state from any state using the primitive ABORT.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpShutdowns">
+ <description>Number of times that SCTP associations have made a direct transition to the CLOSED state from either the SHUTDOWN-SENT state or the SHUTDOWN-ACK-SENT state.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatAssocOutOfBlue">
+ <description>Number of out of the blue packets (SCTP packet correctly formed-right checksum- but the receiver is not able to identify the association to which this packet belongs) received by the host.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatSentChunks">
+ <description>Number of complete data chunks sent to the peers (no retransmissions included).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatRecChunks">
+ <description>Number of complete data chunks received from the peers (no retransmissions included).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatOutOfOrderSendChunks">
+ <description>Number of unordered chunks sent to the peers.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatOutOfOrderRecChunks">
+ <description>Number of unordered chunks received from the peers.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatChecksumErrorCounter">
+ <description>Number of SCTP packets received from the peers with an invalid checksum.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatRetransChunks">
+ <description>Number of data chunks retransmitted to the peers.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatSentControlChunks">
+ <description>Number of datagrams sent with chunk type id &gt; 0.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatReceivedControlChunks">
+ <description>Number of datagrams Receivedwith chunk type id &gt; 0.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatFragmentedUserMsg">
+ <description>Number of fragmented user messages, incremented when the first data chunk of a fragmented message is sent.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatReassembledUserMsg">
+ <description>Number of reassembled user messages, incremented when the first data chunk of a fragmented message is received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatSentPackages">
+ <description>Number of SCTP packages sent.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatReceivedPackages">
+ <description>Number of SCTP packages Received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatCommStop">
+ <description>Number of times the SCTP has sent a communication stop indication to the user.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatCommResume">
+ <description>Number of times SCTP has sent a communication resume indication to the user.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatSentChunksDropped">
+ <description>Number of sent chunks that SCTP has been forced to drop due to buffer overflow in the sending buffer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSctpStatRecChunksDropped">
+ <description>Number of received chunks that SCTP has been forced to drop due to buffer overflow in the receiving buffer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Sts1SpeTtp">
+ <description>This MO represents the termination of the SONET higher order paths.
+This MO is automatically created when creating the OS155SPITTP with mux mode
+set to E1_J1_T1_LEVEL and standardmode set to ANSI.
+
+The performance monitoring counters in the Sts1SpeTtp MO is set to 0 (zero) at start or restart of the node.
+When the value is to large to fit in to a long (31bit) the counter turns over and starts from 0 again.</description>
+ <attribute name="Sts1SpeTtpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>enabled or disabled according to the actual operational state of the Sts3CspeTtp.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="aisPReporting">
+ <description>Indicates whether Alarm Indication Signal, AIS, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="rdiPReporting">
+ <description>Indicates whether Remote Defect Indication, RDI, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="timConsequentAction">
+ <description>Trace Identifier Mismatch (TIM) consequent action, i.e. for generation of Alarm Indication Signal (AIS) downstream and Remote Defect Indication (RDI) upstream as a consequence of the TIM detection.
+
+True - enabled.
+False - disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="expectedPathTrace">
+ <description>Expected path trace.
+
+The string can be of 64 characters length, or empty string ("").
+
+Note: An empty string for this attribute means that the detection of Trace Identifier Mismatch (TIM) should be disabled. This attribute is set to empty string every time attribute pathTraceFormat is set.</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>64</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="transmittedPathTrace">
+ <description>The transmitted path trace.
+Can be defined in two formats. The format may be in 16 or 64 characters. Usually 16 is used for ETSI and 64 for ANSI/TTC.
+
+Note: The string must be of 15 or 62 characters length, or empty string ("").</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>64</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="pmEsp">
+ <description>Performance Monitoring counter for ES, Errored Seconds.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSesp">
+ <description>Performance Monitoring counter for Severely Errored Seconds, SES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Vt15Ttp">
+ <description>This MO is automatically created when the configuring the Os155SpiTtp. It represents the termination of the SONET VP 1.5 path layer.
+
+This MO is automatically created when creating the Os155SpiTtp MO with the following conditions:
+muxmode = E1_J1_T1_LEVEL
+standardmode = ANSI
+
+The performance monitoring counters in the Vt15Ttp is set to 0 (zero) at start or restart of the node.
+When the value is too large too fit in to a long (31bit) the counter turns over and starts from 0 again.
+</description>
+ <systemCreated/>
+ <attribute name="Vt15TtpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="aisVreporting">
+ <description>Indicates whether Alarm Indication Signal, AIS, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="rdiVreporting">
+ <description>Indicates whether Remote Defect Indication, RDI, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="shutDownTimer">
+ <description>This timer defines the time that elapses before shut down when administrativeState is se to 'shuttingDown'.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>100000</max>
+ </range>
+ <defaultValue>1800</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the Vt15Ttp MO.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state of the Vt15Ttp MO.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmEs">
+ <description>Performance monitoring counter of Errored Seconds (ES).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSes">
+ <description>Performance monitoring counter for Serverely Errored Seconds.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="T1Ttp">
+ <description>This MO represents a channelised T1 interface in the node. The T1Ttp MO does not define which type of traffic (TDM or ATM) that the interface should support. Please refer to the Ds0Bundle, AtmPort, IMALink and IMAGroup objects for details about configuration of traffic type.
+
+The performance monitoring counters in the T1Ttp MO is set to 0 (zero) at start or restart of the node.
+When the value is to large too fit in to a long (31bit) the counter turns over and starts from 0 again.
+
+Note! This MO is automatically created as a consequence of creating an Os155SpiTtpMo
+Please refer to the Os155SpiTtpMo for more details.</description>
+ <systemCreated/>
+ <attribute name="T1TtpId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="aisReporting">
+ <description>Indicates whether Alarm Indication Signal, AIS, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="rdiReporting">
+ <description>Indicates whether Remote Defect Indication, RDI, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the T1Ttp MO.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmEs">
+ <description>Performance monitoring counter of Errored Seconds (ES).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSes">
+ <description>Performance monitoring counter for Serverely Errored Seconds.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving AtmPort MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="AtmPort"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedByImaLink">
+ <description>The identity of the reserving ImaLink MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ImaLink"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="E3PhysPathTerm">
+ <description>This MO represents an E3 (i.e. 34 Mbit/s) physical interface in the node. Please refer to the AtmPort object for details about configuration of traffic type.
+
+Note! The performance monitoring counters in the E3PhysPathTerm MO is set to 0 (zero) at start or restart of the node.
+When the value is too large too fit in to a long (31bit) the counter turns over and starts from 0 again.</description>
+ <attribute name="E3PhysPathTermId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state of the E3PhysPathTerm.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="shutDownTimeout">
+ <description>The shut-down timer. It is used when the administrativeState is set to shutdown.
+
+Value in seconds, must be a positive value.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100000</max>
+ </range>
+ <defaultValue>1800</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>enabled or disabled according to the actual operational state of the Physical Line Termination. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="lineNo">
+ <description>The actual Line number on the board.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>2</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="loopback">
+ <description>Possible values
+
+none - This is the normal state, no loop back is performed (and ordinary traffic is running).
+
+line - The physical path is looped on the line side, the external incoming path is looped back to the external outgoing path.
+
+system - The physical path is looped on the system side, the (node-) internal incoming path is looped back to the internal outgoing path.
+
+Note! administrativeStatus must be set to locked when setting loopback attribute.</description>
+ <dataType>
+ <enumRef name="LoopbackState">
+ <defaultValue>none</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="degDegThr">
+ <description>The threshold decides how many of the received blocks that are allowed to have bit errors. The measurement is made on a per-second basis and if the threshold is passed the second is considered bad.
+
+This is a percentage value.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100</max>
+ </range>
+ <defaultValue>30</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="degDegM">
+ <description>How many bad seconds in a row that causes a Degraded Signal alarm.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>2</min> <max>10</max>
+ </range>
+ <defaultValue>7</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="aisReporting">
+ <description>Indicates whether Alarm Indication Signal, AIS, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="rdiReporting">
+ <description>Indicates whether Remote Defect Indication, RDI, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="pmEs">
+ <description>Performance Monitoring counter for ES, Errored Seconds.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSes">
+ <description>Performance Monitoring counter for Severely Errored Seconds, SES.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedByTraffic">
+ <description>The identity of the reserving AtmPort MO. </description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="AtmPort"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBySync">
+ <description>The identity of the reserving Synchronization MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Synchronization"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="T3PhysPathTerm">
+ <description>This MO represents an T3 (i.e. 45 Mbit/s) physical interface in the node. Please refer to the AtmPort object for details about configuration of traffic type.
+
+Note! The performance monitoring counters in the T3PhysPathTerm MO is set to 0 (zero) at start or restart of the node.
+When the value is too large too fit in to a long (31bit) the counter turns over and starts from 0 again.</description>
+ <attribute name="T3PhysPathTermId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>enabled or disabled according to the actual operational state of the Physical Line Termination. </description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state of the T3PhysPathTerm MO.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="shutDownTimeout">
+ <description>The shut-down timer. It is used when the administrativeState is set to shutdown.
+
+Value in seconds, must be a positive value.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>100000</max>
+ </range>
+ <defaultValue>1800</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="lineNo">
+ <description>The actual Line number on the board.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>2</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="loopback">
+ <description>Possible values
+
+none - This is the normal state, no loop back is performed (and ordinary traffic is running).
+
+line - The physical path is looped on the line side, the external incoming path is looped back to the external outgoing path.
+
+system - The physical path is looped on the system side, the (node-) internal incoming path is looped back to the internal outgoing path.
+
+Note! administrativeStatus must be set to locked when setting loopback attribute.</description>
+ <dataType>
+ <enumRef name="LoopbackState">
+ <defaultValue>none</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="aisReporting">
+ <description>Indicates whether Alarm Indication Signal, AIS, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="rdiReporting">
+ <description>Indicates whether Remote Defect Indication, RDI, alarms are to be issued.
+
+true - reporting enabled.
+false - reporting disabled.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="pmEsCpp">
+ <description>Performance Monitoring counter for ES, Errored Seconds based on C-bit parity.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmSesCpp">
+ <description>Performance Monitoring counter for Severely Errored Seconds, SES based on C-bit parity.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="reservedByTraffic">
+ <description>The identity of the reserving AtmPort MO. </description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="AtmPort"/>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBySync">
+ <description>The identity of the reserving Synchronization MO.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="Synchronization"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Etm3">
+ <description>This MO represents the hardware of the ET-M3 board type. It only represents the ET specific hardware, while the DBM module of the board is represented by the PlugInUnit MO.
+
+The ET-M3 board contains 2 physical ports that can be configured as either E3 (ETSI) or T3(ANSI).
+
+Each port on the ET-M3 board can be used to carry ATM traffic.
+
+At the VP/VC endpoints, the Lost FPM/BR cells counters are not available.
+
+IMA is not applicable for theETM3 board.
+
+The ET-M3 board supports eight bidirectional F4/F5 PM flow per port.
+
+The number of VCC TP+VPC TP with performance monitoring enabled (i.e. PM mode &lt;&gt; off) is restricted to 8/port.
+
+Each port can support up to 240 ATM VC connections. Sixteen of these connections are reserved for AAL2 paths, and therefore sixteen AAL2 multiplexers per port are available.
+
+Each port can support up to 16 VP connections. </description>
+ <attribute name="Etm3Id">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Enabled or disabled according to the actual operational state of the Etm3 board.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="SccpApRemote">
+ <description>This Managed Object represents an SCCP Remote Access Point. An SCCP AP instance is a logical point in the SCCP network at which an SCCP user can access the services provided by the SCCP and the SCCP can deliver its services to the SCCP user. The SCCP Remote Access Point is identified by a SubSystem Number (SSN).
+
+A remote SccpAp represents an access point in another node and is related to a Mtp3bAp MO.
+
+The performance monitoring counters found in SccpAp MO is reset, set to zero, when the object is created.
+These counters will not be reset again unless there is a shutdown request from the CLI (Cluster Interface).</description>
+ <attribute name="SccpApRemoteId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the SCCP AP. The operability of the SCCP AP is described by this attribute which has two possible values:
+
+Disabled: The SCCP AP is totally inoperable and unable to provide the service to the user (e.g. if the MTP-3b AP is not usable).
+
+Enabled: The SCCP AP is partly or fully operable and available for use.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>Holds a list of the reserving MOs.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <sequence>
+ <moRef name="ManagedObject"/>
+ </sequence>
+ </dataType>
+ </attribute>
+ <attribute name="mtp3bApId">
+ <description>The identity of the Mtp3bAp used by this MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="Mtp3bAp"/>
+ </dataType>
+ </attribute>
+ <attribute name="ssN">
+ <description>The sub system number, SSN, of the SCCP Access Point. Note that this has to be a unique number.
+
+The SSN has to be unique among all other SccpApRemote MOs that has the same DPC in their corresponding Mtp3bSrs MOs.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>2</min> <max>255</max>
+ </range>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="IpAccessHostGpb">
+ <description>This MO represents the Ip Access Host used for payload. This host type executes on a GPB board (GeneralPocessorUnit).
+
+Note! If autoConfig is set to ON, the Ip Addresses and the Prefixes for this MO is set by the IpAccessAutoConfig MO.
+
+Note! There can be a maximum of 128 host's in the node, and only one host on each main processor.
+
+Note! The host cannot be configured on a MP which have a MediumAccessUnit-child MO. They are exclusive.
+
+Note! The 'administrativeState' has to be set to LOCKED in order to be able to delete this host.</description>
+ <attribute name="IpAccessHostGpbId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="reservedBy">
+ <description>The identity of the reserving MO, can be of type Sctp.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>The operational state of the Ip Access Host.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>DEGRADED</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="administrativeState">
+ <description>The administrative state of the Ip Access Host.</description>
+ <dataType>
+ <enumRef name="AdmState">
+ <defaultValue>locked</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="shutDownTimer">
+ <description>The shut-down timer. It is used when the administrativeState is set to shutdown.
+
+Value in seconds, must be a positive value.</description>
+ <dataType>
+ <long>
+ <defaultValue>10</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="linkStatusAddress1">
+ <description>The link status for IpAddress1.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="linkStatusAddress2">
+ <description>The link status for IpAddress2, only valid if 2 IpAddresses are configured for this host.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="generalProcessorUnitId">
+ <description>Holds a reference to the GPU (GenerelProcessorUnit).</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="GeneralProcessorUnit"/>
+ </dataType>
+ </attribute>
+ <attribute name="autoConfig">
+ <description>This attribute specifies whether the auto configuration feature for the Ip AccessHost is used or not.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="AutoConfigurationMode">
+ <defaultValue>OFF</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="autoConfigIdentity">
+ <description>The identity of the IpAccessAutoConfig MO used by this host.
+
+Note! This attribute is mandatory if 'autoConfig' is set to ON.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="IpAccessAutoConfig"/>
+ </dataType>
+ </attribute>
+ <attribute name="autoConfigIdentity2">
+ <description>The identity of the IpAccessAutoConfig MO used by this host.
+
+Note! This attribute can only be set if 'autoConfig' is set to 'ON'. This attribute is not neccesary to set if 'autoConfig' is set to ON, unless the host shall have two Ip Addresses automatically assigned.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="IpAccessAutoConfig"/>
+ </dataType>
+ </attribute>
+ <attribute name="ipAddress">
+ <description>The IpAddress.
+
+Note! If autoConfig = OFF this attribute is mandatory.
+Note! If the autoConfiguration is used for this IpAccessHostGpb (autoConfig = ON) this attribute cannot be set. This attribute is then set by the 'IpAccessAutoConfig MO'.
+Note! If the attribute is set, its value must not be the same as for attribute ipAddress2.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="ipAddress2">
+ <description>The second IpAddress.
+
+Note! If autoConfig = OFF this attribute is possible to set. This attribute should only be set if multi-homing is used for this host (i.e. two addresses defined).
+Note! If the autoConfiguration is used for this IpAccessHostGpb (autoConfig = ON) this attribute cannot be set. This attribute is then set by the 'IpAccessAutoConfig MO'.
+Note! If the attribute is set, its value must not be the same as for attribute 'ipAddress'.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="pathMTUDiscovery">
+ <description>Specifies whether path MTU discovery should be used by this host.
+
+Note! in order to be able to set the value for this attribute, the administrative state has to be locked.</description>
+ <dataType>
+ <boolean>
+ <defaultValue>false</defaultValue>
+ </boolean>
+ </dataType>
+ </attribute>
+ <attribute name="mtu">
+ <description>The maximum transfer unit.
+
+The MTU has a initial value of 1452 if pathMTUDiscovery is set to false.
+If pathMTUDiscovery is set to true, the initial value of MTU is 1452.
+
+Note! in order to be able to set the value for this attribute, the administrative state has to be locked.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>72</min> <max>2048</max>
+ </range>
+ <defaultValue>1452</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="ipDefaultTtl">
+ <description>The default value inserted into the Time-To-Live field of the IP header of datagrams originated at this entity,
+whenever a TTL value is not supplied by the transport layer protocol.
+
+Note! in order to be able to set the value for this attribute, the administrative state has to be locked.</description>
+ <dataType>
+ <long>
+ <range>
+ <min>1</min> <max>255</max>
+ </range>
+ <defaultValue>50</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="ipReasmTimeout">
+ <description>The maximum number of seconds which received fragments are
+held while they are awaiting reassembly at this entity.
+
+Note! in order to be able to set the value for this attribute, the administrative state has to be locked.
+
+Note! The value for this attribute has to be positive.</description>
+ <dataType>
+ <long>
+ <defaultValue>300</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="nextHopIpAddr">
+ <description>The next hop IP address.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="nextHopIpAddr2">
+ <description>The secondary next hop IP address.
+
+Note! This attribute must only be set if one of the following conditions are fulfilled:
+1. Attribute 'ipAddress2' is set.
+2. Attribute 'autoConfig' = 'ON' and attribute 'autoConfigIdentity2' is set.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="networkPrefix">
+ <description>The network prefix.
+
+The prefix denotes how many bits that are used for calculating the subnet mask.
+
+Note! The default value 0 (zero) is most likely not possible to use and an other value should be submitted if this attribute is configured manually.
+Note! If auto configuration is not used (autoConfig = OFF) this attribute must be set (i.e. this attribute is then 'mandatory').
+Note! If auto configuration is used (autoConfig = ON) this attribute cannot be set, networkPrefix is then set by the ipAccessAutoConfig MO class.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>32</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="networkPrefix2">
+ <description>The second network prefix.
+
+The prefix denotes how many bits that are used for calculating the subnet mask.
+
+Note! The default value 0 (zero) is most likely not possible to use and an other value should be submitted if this attribute is configured manually.
+Note! If auto configuration is not used (autoConfig = OFF) and ipAddress2 is set this attribute must be set (i.e. this attribute is then 'mandatory').
+Note! If auto configuration is used (autoConfig = ON) this attribute cannot be set, networkPrefix2 is then set by the ipAccessAutoConfig MO class. </description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>32</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInReceives">
+ <description>The total number of input datagrams received from interfaces, including those received in error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInHdrErrors">
+ <description>The number of input datagrams discarded due to errors in their IP headers, including bad checksums, version number
+mismatch, other format errors, time-to-live exceeded, errors discovered in processing their IP options, etc.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInAddrErrors">
+ <description>The number of input datagrams discarded because the IP address in their IP header's destination field was not a
+valid address to be received at this entity. This count includes invalid addresses (e.g., 0.0.0.0) and addresses of
+unsupported Classes (e.g., Class E). For entities which are not IP routers and therefore do not forward datagrams,
+this counter includes datagrams discarded because the destination address was not a local address.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInUnknownProtos">
+ <description>The number of locally-addressed datagrams received successfully but discarded because of an unknown or
+unsupported protocol.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInDiscards">
+ <description>The number of input IP datagrams for which no problems were encountered to prevent their continued processing, but which
+were discarded (e.g., for lack of buffer space). Note that this counter does not include any datagrams discarded while
+awaiting re-assembly.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpInDelivers">
+ <description>The total number of input datagrams successfully delivered to IP user-protocols (including ICMP).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpOutRequests">
+ <description>The total number of IP datagrams which local IP user-protocols (including ICMP) supplied to IP in requests for
+transmission. Note that this counter does not include any datagrams counted in ipForwDatagrams</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpOutDiscards">
+ <description>The number of output IP datagrams for which no problem was encountered to prevent their transmission to their
+destination, but which were discarded (e.g., for lack of buffer space). Note that this counter would include
+datagrams counted in ipForwDatagrams if any such packets met this (discretionary) discard criterion.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpReasmReqds">
+ <description>The number of IP fragments received which needed to be reassembled at this entity.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpReasmOKs">
+ <description>The number of IP datagrams successfully re-assembled.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpReasmFails">
+ <description>The number of failures detected by the IP re-assembly algorithm (for whatever reason: timed out, errors, etc).
+Note that this is not necessarily a count of discarded IP fragments since some algorithms (notably the algorithm
+in RFC 815) can lose track of the number of fragments by combining them as they are received.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpFragOKs">
+ <description>The number of IP datagrams that have been successfully fragmented at this entity.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpFragFails">
+ <description>The number of IP datagrams that have been discarded because they needed to be fragmented
+at this entity but could not be, e.g., because their Don't Fragment flag was set.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIpFragCreates">
+ <description>The number of IP datagram fragments that have been generated as a result of fragmentation at this entity.
+</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInMsgs">
+ <description>The total number of ICMP messages which the entityreceived.
+Note that this counter includes all those counted by icmpInErrors</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInErrors">
+ <description>The number of ICMP messages which the entity received but determined as having
+ICMP-specific errors (bad ICMP checksums, bad length, etc.).</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInDestUnreachs">
+ <description>The number of ICMP Destination Unreachable messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInTimeExcds">
+ <description>The number of ICMP Time Exceeded messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInParamProbs">
+ <description>The number of ICMP Parameter Problem messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInSrcQuenchs">
+ <description>The number of ICMP Source Quench messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInRedirects">
+ <description>The number of ICMP Redirect messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInEchos">
+ <description>The number of ICMP Echo (request) messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpInEchoReps">
+ <description>The number of ICMP Echo Reply messages received.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutMsgs">
+ <description>The total number of ICMP messages which this entity attempted to send.
+Note that this counter includes all those counted by icmpOutErrors.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutErrors">
+ <description>The number of ICMP messages which this entity did not send due to problems discovered within ICMP such as a lack of
+buffers. This value should not include errors discovered outside the ICMP layer such as the inability of IP to route the
+resultant datagram. In some implementations there may be no types of error which contribute to this counter's value.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutDestUnreachs">
+ <description>The number of ICMP Destination Unreachable messages sent.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutParmProbs">
+ <description>The number of ICMP Parameter Problem messages sent.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutEchos">
+ <description>The number of ICMP Echo (request) messages sent.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmIcmpOutEchoReps">
+ <description>The number of ICMP Echo Reply messages sent.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUdpInDatagrams">
+ <description>The total number of UDP datagrams delivered to UDP users.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUdpNoPorts">
+ <description>The total number of received UDP datagrams for which there was no application at the destination port.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUdpInErrors">
+ <description>The number of received UDP datagrams that could not be delivered for
+reasons other than the lack of an application at the destination port.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmUdpOutDatagrams">
+ <description>The total number of UDP datagrams sent from this entity.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInUcastPkts">
+ <description>Performance monitoring counter for the number of input unicast packets delivered to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfOutUcastPkts">
+ <description>Performance monitoring counter for the number of out unicast packets delivered to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInErrors">
+ <description>Performance monitoring counter for the number of input packets discarded due to any error.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInDiscards">
+ <description>Performance monitoring counter for the number of input packets discarded due to resource limitations.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInBroadcastPkts">
+ <description>Performance monitoring counter for the number of input broadcast packets delivered to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfInMulticastPkts">
+ <description>Performance monitoring counter for the number of input multicast packets delivered to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfOutBroadcastPkts">
+ <description>Performance monitoring counter for the number of output broadcast packets delivered to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfIfOutMulticastPkts">
+ <description>Performance monitoring counter for the number of output multicast packets delivered to higher layer.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="SystemFunctions">
+ <description>This MO structures the SystemFunctions of the managed element. It is created automatically and cannot be deleted.
+
+The local distinguished name of this MO is ManagedElement=1, SystemFunctions=1.</description>
+ <systemCreated/>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="SystemFunctionsId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Licensing">
+ <description>This MO represents the Licensing (Software Keys) functions in Cello.</description>
+ <systemCreated/>
+ <attribute name="LicensingId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="emergencyStateInfo">
+ <description>This attribute holds information about the emergency status and the time remaining in the current state.
+
+Note! If the node is in emergency state USE_DEGRADED, or the emergency state is USE_DISABLED, the the value of'time' is insignificant.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <structRef name="EmergencyInfo"/>
+ </dataType>
+ </attribute>
+ <attribute name="licenseFileUrl">
+ <description>This attribute returns the URL to the License Key File so it can be viewed with an XML capable web browser
+in case this is a licensed node.
+
+Note! In case the node is not licensed, an empty string will be returned.</description>
+ <noNotification/>
+ <readOnly/>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>256</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <action name="updateLicenseKeyFile">
+ <description>This action sends a request to the FTP/SFTP server to update the license key file.
+
+User Id for login to FTP/SFTP server where license key files are located.
+If a null string userId is given, anonymous FTP/SFTP transfer is assumed.
+Max length is 20 characters.
+
+Password for login to the FTP/SFTP server where license key files are located.
+Max length is 20 characters.
+
+The IpAddress of the FTP/SFTP server where license key files are located.
+Max length is 16 characters.
+
+Source name and path of the license key file on the FTP/SFTP server.
+Max length is 256 charcters.
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="userId">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="password">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="ipAddress">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ <parameter name="sFile">
+ <in/>
+ <dataType>
+ <string/>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="setEmergencyState">
+ <description>This action sets the license server into emergency state.
+I.e. opens up all licensed features and capacity restrictions.
+Disabling emergency state is done by loading a new license key file.
+
+Note! This action does not require a transaction.</description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ </class>
+
+ <class name="TimingUnit2">
+ <description>This MO represents a timing unit2 (reference clock) in the node.
+
+The corresponding Program shall be of LoadModuleLoaderType, SpmFpgaLoader.</description>
+ <attribute name="userLabel">
+ <description>Label for free use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Operational state of TimingUnit</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatus">
+ <description>The availability status of the TimingUnit.
+
+The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="TimingUnit2Id">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="SccpPolicing">
+ <description>The SccpPolicing MO represents the policing function in CPP.
+
+The originatingMtp3bSpc is a madatory attribute for policing in one local node (i.e. a SRP in one NI).
+For policing between two local nodes (i.e. a SRP between two NIs) the originatingMtp3bSpc can be replaced by the originatingSccpSpId.
+Optional attributes for policing in one local node (i.e a SRP in one NI) are destinationMtp3bSpc, destinationSccpSsn, originatingSccpSsn and policingGlobalTitle.
+For policing between two local nodes (i.e. a SRP between two NIs) the destinationMtp3bSpc can be replaced by the destinationSccpSpId.</description>
+ <attribute name="SccpPolicingId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="originatingMtp3bSpc">
+ <description>The value of the SPC (Signaling Point Code).
+
+Note! If the 'originatingSccpSpId' is specified the 'originatingMtp3bSpc' is invalid.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>16777215</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="destinationMtp3bSpc">
+ <description>The value of the destination SPC (Signaling Point Code).
+
+Note! The default value 0 (zero) means that no SPC is defined.
+Note! If no 'destinationSccpSp' is defined and the value of 'destinationMtp3bSpc' is set to 0 (zero), all Signalling Point Codes (SPC) are valid.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>16777215</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="originatingSccpSpId">
+ <description>The identity of the originating SccpSp MO must be used for policing between local nodes.
+
+Note! If the 'originatingSccpSpId' is specified the 'originatingMtp3bSpc' is invalid.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="originatingSccpSsn">
+ <description>The value of SSN in CgPA (Calling Party Address)
+
+Note! The value 0 (zero) means that all ssN (Sub System Number) are valid.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="destinationSccpSpId">
+ <description>The identity of the destination SccpSp MO can be used for policing between local nodes.
+
+Note! If the 'destinationSccpSpId' is specified the 'destinationMtp3bSpc' is invalid.
+Note! If no destination 'destinationSccpSp' is defined and the value of 'destinationMtp3bSpc' is set to 0, all local nodes are valid.
+</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="destinationSccpSsn">
+ <description>The value of SSN inCdPA (Called Party Address).
+
+Note! The valu 0 (zero) means tha all ssN (Sub System Number) are valid.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="policingGlobalTitle">
+ <description>The Policing Global Title attribute allows to optionally police on Global Title
+
+Default value is considered as no policing Global Title and all GTs are valid.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <structRef name="GlobalTitleData"/>
+ </dataType>
+ </attribute>
+ <attribute name="discardOrReturnServiceMsg">
+ <description>For a policing case whether to discard or return Service Messages, if the return option is set.</description>
+ <dataType>
+ <enumRef name="DiscardReturnServiceMsg">
+ <defaultValue>DISCARD</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfRejectMsg">
+ <description>Performance monitoring counter for the number of rejected messages.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="SccpAccountingCriteria">
+ <description>The SccpAccountingCriteria MO and the SccpSp MO represents the accounting function in CPP.
+
+Attribute usageType specifies Accounting Remuneration (incoming GT messages) or Verification (outgoing GT messages).
+
+For Remuneration a SccpGlobalTitle MOId in attribute globalTitleId must be defined.
+For Verification a SccpGlobalTitle MOid is defined in attribute globalTitleId, or a SccpEntitySet MOid is defined if accounting shall be made on the resulting new GT.
+
+The attribute ssN is optional .
+The Mtp3bSrs MOid (including an SPC) in attribute pointerId is optional for accounting in one local node (SRP in one NI).
+The SccpSp MOid in attribute pointerId is optional for accounting between two local nodes (SRP between two NIs).
+Attribute countType specifies if Messages och Octets shall be counted.
+Start and stop of accounting and output period for the accounting file is specified in the SccpSp MO.</description>
+ <attribute name="SccpAccountingCriteriaId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Label free for use.</description>
+ <dataType>
+ <string>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="usageType">
+ <description>This attribute specifies if the MO is used for renumeration or verification.
+
+0 = Verification Criteria to detect outgoing massages that will be charged in the next relay node.
+
+1 = Renumeration Criteria to detect incoming messages for relaying, that will be charged.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long/>
+ </dataType>
+ </attribute>
+ <attribute name="ssN">
+ <description>Subsystem Number this Accounting Criteria applies to.
+SubSystem Number 0 (zero) means that any SSN in CdPA (Called Party Address) is valid.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <long>
+ <range>
+ <min>0</min> <max>255</max>
+ </range>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="countType">
+ <description>Specifies type of countes that should be activated.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <enumRef name="SccpCountType">
+ <defaultValue>MESSAGES</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="globalTitleId">
+ <description>The identity of the SccpGlobalTitle MO or the SccpEntitySet MO used by this MO.</description>
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfMsg">
+ <description>Performance monitoring counter for the number of messages, both incoming and outgoing.
+
+Note! If 'countType' is set to 'OCTETS' this counter is not valid.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pmNoOfOctets">
+ <description>Performance monitoring counter for the number of octets, both incoming and outgoing.
+
+Note! If 'countType' is set to 'MESSAGES this counter is not valid.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <long>
+ <defaultValue>0</defaultValue>
+ </long>
+ </dataType>
+ </attribute>
+ <attribute name="pointerId">
+ <description>The pointer is an instance of a Mtp3bSrs MO OR an instance of a SccpSP MO.
+
+Note! If no pointerId is set all Signaling Point Codes (SPC) and all Sccp SP identities are valid.
+Note! It is not possible to submit the Id of the SccpSp that the SccpAccountingCriteria belongs to.</description>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <moRef name="ManagedObject"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="Cbu">
+ <description>This MO models the Cbu (Node Control Board) board in CPP.
+The Cbu board integrates the functionality of TUB, SCB, GPB and ETB (ET-MC1) into one Plug-In Unit.
+
+Note! The 'operationalState' is set to disabled if one of the functional parts is faulty. Even if the Cbu is marked with 'operationalState' DISABLED, parts of the Cbu can still be operational.
+
+Note! A functional part on a Cbu board can only be redundant with the same functional part on another Cbu board and thus not with that functional part implemented on a discrete board. Also note that redundancy is only applicable for the GPB part and the TimingUnit part of the Cbu board..
+
+Note! On the Cbu board it is only possible to configure a maximum of 4 physical path terminations. These can be of type E1PhysPathTerm, J1PhyspathTerm or T1PhyspathTerm. It is not possible to create physical path terminations of different standards on the same board.
+
+Note! The Gpu part of the Cbu board (General Processor Unit) retrieves its 'availabilityStatus' from the PlugInUnit MO, thus not represented on the Cbu MO.
+
+Note! When the ET-MC1 is part of the Cbu board it is only possible to configure 4 physical ports as either E1 (ETSI), J1 (TTC) or T1 (ANSI).
+
+Note! This unit may only be inserted in slot 1 and 24 (or more accurately at APN=1 and 0 in a non-standard subrack). If redundant configuration is needed, two Cbu's must be inserted in the subrack.
+If only one Cbu is used it must be placed in slot 1 (in a non-standard subrack) to be able to read the product information data of the subrack</description>
+ <attribute name="CbuId">
+ <mandatory/>
+ <noNotification/>
+ <restricted/>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="userLabel">
+ <description>Provides the possibility to put a user-friendly label on the MO instance.
+
+Note! This attribute cannot be used for uniquely identifing the MO.</description>
+ <dataType>
+ <string>
+ <lengthRange>
+ <min>0</min> <max>128</max>
+ </lengthRange>
+ <defaultValue>""</defaultValue>
+ </string>
+ </dataType>
+ </attribute>
+ <attribute name="operationalState">
+ <description>Enabled or disabled according to the actual operational state of the NCB board.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="OperState">
+ <defaultValue>disabled</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatusEt">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.
+The 'availabilityStatusEt' gives the availability status for the ET part of the NCB board.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ <attribute name="availabilityStatusTu">
+ <description>The availability status is used to qualify the operational state. It indicates why the operational state has changed its value to disabled.
+The 'availabilityStatusTu' gives the availability status for the Timing Unit part of the NCB board.</description>
+ <noNotification/>
+ <nonPersistent/>
+ <readOnly/>
+ <dataType>
+ <enumRef name="AvailabilityStatus">
+ <defaultValue>NO_STATUS</defaultValue>
+ </enumRef>
+ </dataType>
+ </attribute>
+ </class>
+
+ <relationship name="ManagedElement_to_TransportNetwork">
+ <containment>
+ <parent>
+ <hasClass name="ManagedElement"/>
+ </parent>
+ <child>
+ <hasClass name="TransportNetwork"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Synchronization">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Synchronization"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_SccpSp">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="SccpSp"/>
+ <cardinality>
+ <min>0</min> <max>24</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_UniSaalProfile">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="UniSaalProfile"/>
+ <cardinality>
+ <min>0</min> <max>300</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_UniSaalTp">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="UniSaalTp"/>
+ <cardinality>
+ <min>0</min> <max>4800</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Aal0TpVccTp">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Aal0TpVccTp"/>
+ <cardinality>
+ <min>0</min> <max>2200</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Aal5TpVccTp">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Aal5TpVccTp"/>
+ <cardinality>
+ <min>0</min> <max>6000</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_AtmPort">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="AtmPort"/>
+ <cardinality>
+ <min>0</min> <max>500</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_NniSaalProfile">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="NniSaalProfile"/>
+ <cardinality>
+ <min>0</min> <max>50</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_NniSaalTp">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="NniSaalTp"/>
+ <cardinality>
+ <min>0</min> <max>600</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_AtmTrafficDescriptor">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="AtmTrafficDescriptor"/>
+ <cardinality>
+ <min>0</min> <max>1000</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Aal2PathVccTp">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Aal2PathVccTp"/>
+ <cardinality>
+ <min>0</min> <max>2000</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Aal2RoutingCase">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Aal2RoutingCase"/>
+ <cardinality>
+ <min>0</min> <max>900</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Aal2Sp">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Aal2Sp"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_AtmCrossConnection">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="AtmCrossConnection"/>
+ <cardinality>
+ <min>0</min> <max>5000</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Mtp2TpItu">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp2TpItu"/>
+ <cardinality>
+ <min>0</min> <max>256</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Mtp2TpAnsi">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp2TpAnsi"/>
+ <cardinality>
+ <min>0</min> <max>256</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Aal1TpVccTp">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Aal1TpVccTp"/>
+ <cardinality>
+ <min>0</min> <max>1000</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Mtp3bSpAnsi">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSpAnsi"/>
+ <cardinality>
+ <min>0</min> <max>24</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Mtp3bSpItu">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSpItu"/>
+ <cardinality>
+ <min>0</min> <max>24</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Mtp3bSpTtc">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSpTtc"/>
+ <cardinality>
+ <min>0</min> <max>24</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Mtp2ProfileAnsi">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp2ProfileAnsi"/>
+ <cardinality>
+ <min>0</min> <max>256</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Mtp2ProfileItu">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp2ProfileItu"/>
+ <cardinality>
+ <min>0</min> <max>256</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Mtp2ProfileChina">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp2ProfileChina"/>
+ <cardinality>
+ <min>0</min> <max>256</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Mtp2TpChina">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp2TpChina"/>
+ <cardinality>
+ <min>0</min> <max>256</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Mtp3bSpChina">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSpChina"/>
+ <cardinality>
+ <min>0</min> <max>24</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Mspg">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Mspg"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_ImaGroup">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="ImaGroup"/>
+ <cardinality>
+ <min>0</min> <max>200</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Aal2QosProfile">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Aal2QosProfile"/>
+ <cardinality>
+ <min>0</min> <max>20</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Aal2QosCodePointProfile">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Aal2QosCodePointProfile"/>
+ <cardinality>
+ <min>0</min> <max>20</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TransportNetwork_to_Sctp">
+ <containment>
+ <parent>
+ <hasClass name="TransportNetwork"/>
+ </parent>
+ <child>
+ <hasClass name="Sctp"/>
+ <cardinality>
+ <min>0</min> <max>10</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Subrack_to_Slot">
+ <containment>
+ <parent>
+ <hasClass name="Subrack"/>
+ </parent>
+ <child>
+ <hasClass name="Slot"/>
+ <cardinality>
+ <min>1</min> <max>28</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Slot_to_PlugInUnit">
+ <containment>
+ <parent>
+ <hasClass name="Slot"/>
+ </parent>
+ <child>
+ <hasClass name="PlugInUnit"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Slot_to_ManagedObject">
+ <containment>
+ <parent>
+ <hasClass name="Slot"/>
+ </parent>
+ <child>
+ <hasClass name="ManagedObject"/>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="ManagedElement_to_ManagedObject">
+ <containment>
+ <parent>
+ <hasClass name="ManagedElement"/>
+ </parent>
+ <child>
+ <hasClass name="ManagedObject"/>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_ManagedObject">
+ <description>This containment relation indicated that any kind of board may be used to specilize PlugInUnit.</description>
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="ManagedObject"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Subrack_to_ManagedObject">
+ <containment>
+ <parent>
+ <hasClass name="Subrack"/>
+ </parent>
+ <child>
+ <hasClass name="ManagedObject"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="VpcTp_to_VclTp">
+ <containment>
+ <parent>
+ <hasClass name="VpcTp"/>
+ </parent>
+ <child>
+ <hasClass name="VclTp"/>
+ <cardinality>
+ <min>0</min> <max>5000</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="ManagedElement_to_Equipment">
+ <containment>
+ <parent>
+ <hasClass name="ManagedElement"/>
+ </parent>
+ <child>
+ <hasClass name="Equipment"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="ManagedElement_to_IpSystem">
+ <containment>
+ <parent>
+ <hasClass name="ManagedElement"/>
+ </parent>
+ <child>
+ <hasClass name="IpSystem"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="ManagedElement_to_SwManagement">
+ <containment>
+ <parent>
+ <hasClass name="ManagedElement"/>
+ </parent>
+ <child>
+ <hasClass name="SwManagement"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="ManagedElement_to_SwitchFabric">
+ <containment>
+ <parent>
+ <hasClass name="ManagedElement"/>
+ </parent>
+ <child>
+ <hasClass name="SwitchFabric"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="ManagedElement_to_ManagedElementData">
+ <containment>
+ <parent>
+ <hasClass name="ManagedElement"/>
+ </parent>
+ <child>
+ <hasClass name="ManagedElementData"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="ManagedElement_to_SystemFunctions">
+ <containment>
+ <parent>
+ <hasClass name="ManagedElement"/>
+ </parent>
+ <child>
+ <hasClass name="SystemFunctions"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Equipment_to_Subrack">
+ <containment>
+ <parent>
+ <hasClass name="Equipment"/>
+ </parent>
+ <child>
+ <hasClass name="Subrack"/>
+ <cardinality>
+ <min>0</min> <max>9</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Equipment_to_Jvm">
+ <containment>
+ <parent>
+ <hasClass name="Equipment"/>
+ </parent>
+ <child>
+ <hasClass name="Jvm"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Subrack_to_Fan">
+ <containment>
+ <parent>
+ <hasClass name="Subrack"/>
+ </parent>
+ <child>
+ <hasClass name="Fan"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SwManagement_to_LoadModule">
+ <containment>
+ <parent>
+ <hasClass name="SwManagement"/>
+ </parent>
+ <child>
+ <hasClass name="LoadModule"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SccpScrc_to_SccpApLocal">
+ <description>The SccpApLocal represents a local SSN, no relation exists to an Mtp3bAp
+
+Of the possible 216 SccpAps allowed on a node, a maximum of 16 are allowed to be local, and a maximum of 200 are allowed to be remote.</description>
+ <containment>
+ <parent>
+ <hasClass name="SccpScrc"/>
+ </parent>
+ <child>
+ <hasClass name="SccpApLocal"/>
+ <cardinality>
+ <min>0</min> <max>16</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SccpSp_to_SccpScrc">
+ <containment>
+ <parent>
+ <hasClass name="SccpSp"/>
+ </parent>
+ <child>
+ <hasClass name="SccpScrc"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SccpScrc_to_SccpEntitySet">
+ <containment>
+ <parent>
+ <hasClass name="SccpScrc"/>
+ </parent>
+ <child>
+ <hasClass name="SccpEntitySet"/>
+ <cardinality>
+ <min>0</min> <max>2048</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SccpScrc_to_SccpGlobalTitle">
+ <containment>
+ <parent>
+ <hasClass name="SccpScrc"/>
+ </parent>
+ <child>
+ <hasClass name="SccpGlobalTitle"/>
+ <cardinality>
+ <min>0</min> <max>2048</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SccpScrc_to_SccpApRemote">
+ <containment>
+ <parent>
+ <hasClass name="SccpScrc"/>
+ </parent>
+ <child>
+ <hasClass name="SccpApRemote"/>
+ <cardinality>
+ <min>0</min> <max>200</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SccpScrc_to_SccpPolicing">
+ <containment>
+ <parent>
+ <hasClass name="SccpScrc"/>
+ </parent>
+ <child>
+ <hasClass name="SccpPolicing"/>
+ <cardinality>
+ <min>0</min> <max>1024</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SccpScrc_to_SccpAccountingCriteria">
+ <containment>
+ <parent>
+ <hasClass name="SccpScrc"/>
+ </parent>
+ <child>
+ <hasClass name="SccpAccountingCriteria"/>
+ <cardinality>
+ <min>0</min> <max>100</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_Program">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="Program"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Spm_to_Program">
+ <containment>
+ <parent>
+ <hasClass name="Spm"/>
+ </parent>
+ <child>
+ <hasClass name="Program"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TimingUnit_to_Program">
+ <containment>
+ <parent>
+ <hasClass name="TimingUnit"/>
+ </parent>
+ <child>
+ <hasClass name="Program"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etm4_to_Program">
+ <containment>
+ <parent>
+ <hasClass name="Etm4"/>
+ </parent>
+ <child>
+ <hasClass name="Program"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etm1_to_Program">
+ <containment>
+ <parent>
+ <hasClass name="Etm1"/>
+ </parent>
+ <child>
+ <hasClass name="Program"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etmc1_to_Program">
+ <containment>
+ <parent>
+ <hasClass name="Etmc1"/>
+ </parent>
+ <child>
+ <hasClass name="Program"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etmc41_to_Program">
+ <containment>
+ <parent>
+ <hasClass name="Etmc41"/>
+ </parent>
+ <child>
+ <hasClass name="Program"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TimingUnit2_to_Program">
+ <containment>
+ <parent>
+ <hasClass name="TimingUnit2"/>
+ </parent>
+ <child>
+ <hasClass name="Program"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etm3_to_Program">
+ <containment>
+ <parent>
+ <hasClass name="Etm3"/>
+ </parent>
+ <child>
+ <hasClass name="Program"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Spu_to_Program">
+ <containment>
+ <parent>
+ <hasClass name="Spu"/>
+ </parent>
+ <child>
+ <hasClass name="Program"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Fan_to_Program">
+ <containment>
+ <parent>
+ <hasClass name="Fan"/>
+ </parent>
+ <child>
+ <hasClass name="Program"/>
+ <cardinality>
+ <min>1</min> <max>2</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etm1_to_E1PhysPathTerm">
+ <containment>
+ <parent>
+ <hasClass name="Etm1"/>
+ </parent>
+ <child>
+ <hasClass name="E1PhysPathTerm"/>
+ <cardinality>
+ <min>0</min> <max>8</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etmc1_to_E1PhysPathTerm">
+ <containment>
+ <parent>
+ <hasClass name="Etmc1"/>
+ </parent>
+ <child>
+ <hasClass name="E1PhysPathTerm"/>
+ <cardinality>
+ <min>0</min> <max>8</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="E1PhysPathTerm_to_Ds0Bundle">
+ <containment>
+ <parent>
+ <hasClass name="E1PhysPathTerm"/>
+ </parent>
+ <child>
+ <hasClass name="Ds0Bundle"/>
+ <cardinality>
+ <min>0</min> <max>31</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etm1_to_J1PhysPathTerm">
+ <containment>
+ <parent>
+ <hasClass name="Etm1"/>
+ </parent>
+ <child>
+ <hasClass name="J1PhysPathTerm"/>
+ <cardinality>
+ <min>0</min> <max>8</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etmc1_to_J1PhysPathTerm">
+ <containment>
+ <parent>
+ <hasClass name="Etmc1"/>
+ </parent>
+ <child>
+ <hasClass name="J1PhysPathTerm"/>
+ <cardinality>
+ <min>0</min> <max>8</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="J1PhysPathTerm_to_Ds0Bundle">
+ <containment>
+ <parent>
+ <hasClass name="J1PhysPathTerm"/>
+ </parent>
+ <child>
+ <hasClass name="Ds0Bundle"/>
+ <cardinality>
+ <min>0</min> <max>24</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="AtmPort_to_VplTp">
+ <containment>
+ <parent>
+ <hasClass name="AtmPort"/>
+ </parent>
+ <child>
+ <hasClass name="VplTp"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpChina_to_Mtp3bAp">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpChina"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bAp"/>
+ <cardinality>
+ <min>0</min> <max>510</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpAnsi_to_Mtp3bAp">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpAnsi"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bAp"/>
+ <cardinality>
+ <min>0</min> <max>510</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpItu_to_Mtp3bAp">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpItu"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bAp"/>
+ <cardinality>
+ <min>0</min> <max>510</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpTtc_to_Mtp3bAp">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpTtc"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bAp"/>
+ <cardinality>
+ <min>0</min> <max>510</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpItu_to_Mtp3bSrs">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpItu"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSrs"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpTtc_to_Mtp3bSrs">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpTtc"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSrs"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpChina_to_Mtp3bSrs">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpChina"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSrs"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSrs_to_Mtp3bSr">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSrs"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSr"/>
+ <cardinality>
+ <min>0</min> <max>5</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpAnsi_to_Mtp3bSrs">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpAnsi"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSrs"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_Etm1">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="Etm1"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_Spu">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="Spu"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_SwitchCoreUnit">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="SwitchCoreUnit"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_GeneralProcessorUnit">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="GeneralProcessorUnit"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_Etm4">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="Etm4"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_TimingUnit">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="TimingUnit"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_SwitchExtensionUnit">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="SwitchExtensionUnit"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_Etmc1">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="Etmc1"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_Etmc41">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="Etmc41"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_Etm3">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="Etm3"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_TimingUnit2">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="TimingUnit2"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="PlugInUnit_to_Cbu">
+ <containment>
+ <parent>
+ <hasClass name="PlugInUnit"/>
+ </parent>
+ <child>
+ <hasClass name="Cbu"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpChina_to_Mtp3bSls">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpChina"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSls"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpItu_to_Mtp3bSls">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpItu"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSls"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpTtc_to_Mtp3bSls">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpTtc"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSls"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpAnsi_to_Mtp3bSls">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpAnsi"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSls"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpChina_to_Mtp3bSls_0">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpChina"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSls"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpAnsi_to_Mtp3bSls_0">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpAnsi"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSls"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpItu_to_Mtp3bSls_0">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpItu"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSls"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpTtc_to_Mtp3bSls_0">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpTtc"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSls"/>
+ <cardinality>
+ <min>0</min> <max>255</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSls_to_Mtp3bSlAnsi">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSls"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSlAnsi"/>
+ <cardinality>
+ <min>0</min> <max>16</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSls_to_Mtp3bSlItu">
+ <description>Multiplicity: 0..16</description>
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSls"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSlItu"/>
+ <cardinality>
+ <min>0</min> <max>16</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSls_to_Mtp3bSlTtc">
+ <description>Multiplicity: 0..16</description>
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSls"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSlTtc"/>
+ <cardinality>
+ <min>0</min> <max>16</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSls_to_Mtp3bSlChina">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSls"/>
+ </parent>
+ <child>
+ <hasClass name="Mtp3bSlChina"/>
+ <cardinality>
+ <min>0</min> <max>16</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="IpSystem_to_Ip">
+ <containment>
+ <parent>
+ <hasClass name="IpSystem"/>
+ </parent>
+ <child>
+ <hasClass name="Ip"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="IpSystem_to_Ospf">
+ <containment>
+ <parent>
+ <hasClass name="IpSystem"/>
+ </parent>
+ <child>
+ <hasClass name="Ospf"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="IpSystem_to_IpAccessAutoConfig">
+ <containment>
+ <parent>
+ <hasClass name="IpSystem"/>
+ </parent>
+ <child>
+ <hasClass name="IpAccessAutoConfig"/>
+ <cardinality>
+ <min>0</min> <max>32</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="IpSystem_to_IpAccessHostMsb">
+ <containment>
+ <parent>
+ <hasClass name="IpSystem"/>
+ </parent>
+ <child>
+ <hasClass name="IpAccessHostMsb"/>
+ <cardinality>
+ <min>0</min> <max>128</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="IpSystem_to_IpAccessHostGpb">
+ <containment>
+ <parent>
+ <hasClass name="IpSystem"/>
+ </parent>
+ <child>
+ <hasClass name="IpAccessHostGpb"/>
+ <cardinality>
+ <min>0</min> <max>128</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Ip_to_IpAtmLink">
+ <containment>
+ <parent>
+ <hasClass name="Ip"/>
+ </parent>
+ <child>
+ <hasClass name="IpAtmLink"/>
+ <cardinality>
+ <min>0</min> <max>500</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Ip_to_EthernetLink">
+ <containment>
+ <parent>
+ <hasClass name="Ip"/>
+ </parent>
+ <child>
+ <hasClass name="EthernetLink"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Ip_to_IpRoutingTable">
+ <containment>
+ <parent>
+ <hasClass name="Ip"/>
+ </parent>
+ <child>
+ <hasClass name="IpRoutingTable"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Aal2Sp_to_Aal2Ap">
+ <containment>
+ <parent>
+ <hasClass name="Aal2Sp"/>
+ </parent>
+ <child>
+ <hasClass name="Aal2Ap"/>
+ <cardinality>
+ <min>0</min> <max>850</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Aal2Ap_to_Aal2PathDistributionUnit">
+ <containment>
+ <parent>
+ <hasClass name="Aal2Ap"/>
+ </parent>
+ <child>
+ <hasClass name="Aal2PathDistributionUnit"/>
+ <cardinality>
+ <min>0</min> <max>26</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etm1_to_T1PhysPathTerm">
+ <containment>
+ <parent>
+ <hasClass name="Etm1"/>
+ </parent>
+ <child>
+ <hasClass name="T1PhysPathTerm"/>
+ <cardinality>
+ <min>0</min> <max>8</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TimingUnit_to_TuSyncRef">
+ <containment>
+ <parent>
+ <hasClass name="TimingUnit"/>
+ </parent>
+ <child>
+ <hasClass name="TuSyncRef"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="TimingUnit2_to_TuSyncRef">
+ <containment>
+ <parent>
+ <hasClass name="TimingUnit2"/>
+ </parent>
+ <child>
+ <hasClass name="TuSyncRef"/>
+ <cardinality>
+ <min>0</min> <max>2</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Spu_to_Spm">
+ <containment>
+ <parent>
+ <hasClass name="Spu"/>
+ </parent>
+ <child>
+ <hasClass name="Spm"/>
+ <cardinality>
+ <min>0</min> <max>5</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SwManagement_to_ConfigurationVersion">
+ <containment>
+ <parent>
+ <hasClass name="SwManagement"/>
+ </parent>
+ <child>
+ <hasClass name="ConfigurationVersion"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SwManagement_to_UpgradePackage">
+ <containment>
+ <parent>
+ <hasClass name="SwManagement"/>
+ </parent>
+ <child>
+ <hasClass name="UpgradePackage"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SwManagement_to_Repertoire">
+ <containment>
+ <parent>
+ <hasClass name="SwManagement"/>
+ </parent>
+ <child>
+ <hasClass name="Repertoire"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SwManagement_to_PiuType">
+ <containment>
+ <parent>
+ <hasClass name="SwManagement"/>
+ </parent>
+ <child>
+ <hasClass name="PiuType"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SwManagement_to_SwAllocation">
+ <containment>
+ <parent>
+ <hasClass name="SwManagement"/>
+ </parent>
+ <child>
+ <hasClass name="SwAllocation"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SwManagement_to_ReliableProgramUniter">
+ <containment>
+ <parent>
+ <hasClass name="SwManagement"/>
+ </parent>
+ <child>
+ <hasClass name="ReliableProgramUniter"/>
+ <cardinality>
+ <min>0</min>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Ospf_to_OspfInterface">
+ <containment>
+ <parent>
+ <hasClass name="Ospf"/>
+ </parent>
+ <child>
+ <hasClass name="OspfInterface"/>
+ <cardinality>
+ <min>0</min> <max>32</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Ospf_to_OspfArea">
+ <containment>
+ <parent>
+ <hasClass name="Ospf"/>
+ </parent>
+ <child>
+ <hasClass name="OspfArea"/>
+ <cardinality>
+ <min>1</min> <max>4</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Cbu_to_GeneralProcessorUnit">
+ <containment>
+ <parent>
+ <hasClass name="Cbu"/>
+ </parent>
+ <child>
+ <hasClass name="GeneralProcessorUnit"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="GeneralProcessorUnit_to_MediumAccessUnit">
+ <containment>
+ <parent>
+ <hasClass name="GeneralProcessorUnit"/>
+ </parent>
+ <child>
+ <hasClass name="MediumAccessUnit"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SwitchFabric_to_SwitchModule">
+ <containment>
+ <parent>
+ <hasClass name="SwitchFabric"/>
+ </parent>
+ <child>
+ <hasClass name="SwitchModule"/>
+ <cardinality>
+ <min>0</min> <max>32</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SwitchFabric_to_InternalLinkGroup">
+ <containment>
+ <parent>
+ <hasClass name="SwitchFabric"/>
+ </parent>
+ <child>
+ <hasClass name="InternalLinkGroup"/>
+ <cardinality>
+ <min>0</min> <max>31</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="InternalLinkGroup_to_SwitchInternalLink">
+ <containment>
+ <parent>
+ <hasClass name="InternalLinkGroup"/>
+ </parent>
+ <child>
+ <hasClass name="SwitchInternalLink"/>
+ <cardinality>
+ <min>0</min> <max>8</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etm4_to_Os155SpiTtp">
+ <containment>
+ <parent>
+ <hasClass name="Etm4"/>
+ </parent>
+ <child>
+ <hasClass name="Os155SpiTtp"/>
+ <cardinality>
+ <min>0</min> <max>2</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="VplTp_to_VpcTp">
+ <containment>
+ <parent>
+ <hasClass name="VplTp"/>
+ </parent>
+ <child>
+ <hasClass name="VpcTp"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="E1Ttp_to_Ds0Bundle">
+ <containment>
+ <parent>
+ <hasClass name="E1Ttp"/>
+ </parent>
+ <child>
+ <hasClass name="Ds0Bundle"/>
+ <cardinality>
+ <min>0</min> <max>31</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="T1PhysPathTerm_to_Ds0Bundle">
+ <containment>
+ <parent>
+ <hasClass name="T1PhysPathTerm"/>
+ </parent>
+ <child>
+ <hasClass name="Ds0Bundle"/>
+ <cardinality>
+ <min>0</min> <max>24</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="T1Ttp_to_Ds0Bundle">
+ <containment>
+ <parent>
+ <hasClass name="T1Ttp"/>
+ </parent>
+ <child>
+ <hasClass name="Ds0Bundle"/>
+ <cardinality>
+ <min>0</min> <max>24</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpAnsi_to_M3uAssociation">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpAnsi"/>
+ </parent>
+ <child>
+ <hasClass name="M3uAssociation"/>
+ <cardinality>
+ <min>0</min> <max>512</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpItu_to_M3uAssociation">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpItu"/>
+ </parent>
+ <child>
+ <hasClass name="M3uAssociation"/>
+ <cardinality>
+ <min>0</min> <max>512</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Vc12Ttp_to_E1Ttp">
+ <containment>
+ <parent>
+ <hasClass name="Vc12Ttp"/>
+ </parent>
+ <child>
+ <hasClass name="E1Ttp"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Os155SpiTtp_to_Vc4Ttp">
+ <containment>
+ <parent>
+ <hasClass name="Os155SpiTtp"/>
+ </parent>
+ <child>
+ <hasClass name="Vc4Ttp"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Vc4Ttp_to_Vc12Ttp">
+ <containment>
+ <parent>
+ <hasClass name="Vc4Ttp"/>
+ </parent>
+ <child>
+ <hasClass name="Vc12Ttp"/>
+ <cardinality>
+ <min>0</min> <max>63</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etmc41_to_Os155SpiTtp">
+ <containment>
+ <parent>
+ <hasClass name="Etmc41"/>
+ </parent>
+ <child>
+ <hasClass name="Os155SpiTtp"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Os155SpiTtp_to_Sts3CspeTtp">
+ <containment>
+ <parent>
+ <hasClass name="Os155SpiTtp"/>
+ </parent>
+ <child>
+ <hasClass name="Sts3CspeTtp"/>
+ <cardinality>
+ <min>0</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Os155SpiTtp_to_Sts1SpeTtp">
+ <containment>
+ <parent>
+ <hasClass name="Os155SpiTtp"/>
+ </parent>
+ <child>
+ <hasClass name="Sts1SpeTtp"/>
+ <cardinality>
+ <min>0</min> <max>3</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Cbu_to_Etmc1">
+ <containment>
+ <parent>
+ <hasClass name="Cbu"/>
+ </parent>
+ <child>
+ <hasClass name="Etmc1"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etmc1_to_T1PhysPathTerm">
+ <containment>
+ <parent>
+ <hasClass name="Etmc1"/>
+ </parent>
+ <child>
+ <hasClass name="T1PhysPathTerm"/>
+ <cardinality>
+ <min>0</min> <max>8</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Mtp3bSpChina_to_M3uAssociation">
+ <containment>
+ <parent>
+ <hasClass name="Mtp3bSpChina"/>
+ </parent>
+ <child>
+ <hasClass name="M3uAssociation"/>
+ <cardinality>
+ <min>0</min> <max>512</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="ImaGroup_to_ImaLink">
+ <containment>
+ <parent>
+ <hasClass name="ImaGroup"/>
+ </parent>
+ <child>
+ <hasClass name="ImaLink"/>
+ <cardinality>
+ <min>0</min> <max>8</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SystemFunctions_to_WebServer">
+ <containment>
+ <parent>
+ <hasClass name="SystemFunctions"/>
+ </parent>
+ <child>
+ <hasClass name="WebServer"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Sts1SpeTtp_to_Vt15Ttp">
+ <containment>
+ <parent>
+ <hasClass name="Sts1SpeTtp"/>
+ </parent>
+ <child>
+ <hasClass name="Vt15Ttp"/>
+ <cardinality>
+ <min>0</min> <max>28</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Vt15Ttp_to_T1Ttp">
+ <containment>
+ <parent>
+ <hasClass name="Vt15Ttp"/>
+ </parent>
+ <child>
+ <hasClass name="T1Ttp"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etm3_to_E3PhysPathTerm">
+ <containment>
+ <parent>
+ <hasClass name="Etm3"/>
+ </parent>
+ <child>
+ <hasClass name="E3PhysPathTerm"/>
+ <cardinality>
+ <min>0</min> <max>2</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Etm3_to_T3PhysPathTerm">
+ <containment>
+ <parent>
+ <hasClass name="Etm3"/>
+ </parent>
+ <child>
+ <hasClass name="T3PhysPathTerm"/>
+ <cardinality>
+ <min>0</min> <max>2</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="SystemFunctions_to_Licensing">
+ <containment>
+ <parent>
+ <hasClass name="SystemFunctions"/>
+ </parent>
+ <child>
+ <hasClass name="Licensing"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Cbu_to_TimingUnit2">
+ <containment>
+ <parent>
+ <hasClass name="Cbu"/>
+ </parent>
+ <child>
+ <hasClass name="TimingUnit2"/>
+ <cardinality>
+ <min>1</min> <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+</mim>
+
+</models>
+
diff --git a/lib/xmerl/test/xmerl_SUITE_data/eventp/mp.dtd b/lib/xmerl/test/xmerl_SUITE_data/eventp/mp.dtd
new file mode 100644
index 0000000000..1f6e31e772
--- /dev/null
+++ b/lib/xmerl/test/xmerl_SUITE_data/eventp/mp.dtd
@@ -0,0 +1,274 @@
+<!-- 15531-APR 90163: rev F -->
+<!-- Date- 2000-10-16 -->
+<!-- Author- Johnni Sigeti -->
+<!-- Author- Niklas Storm -->
+<!-- Author- Hui Lin -->
+
+<!-- Revision History
+ A Raghunath Squid version
+ PB1 epkjsig 1999-09-09 Removed uLong, uShort, union
+ and inherits.
+ PB2 epkjsig 1999-09-23 Rewritten with new
+ requirements
+ PB3 epkjsig 1999-09-26 Updated after team review
+ B epkjsig 1999-10-06 Updated after inspection
+ PC1 epkjsig 1999-10-28 Added mandatory attribute
+ for associations.
+ PC2 epkjsig 1999-11-22 Added MORef as attribute
+ PC3 qpknian 2000-01-03 Added support object class.
+ PC4 qpknian 2000-01-18 Removed illegal characters
+ in comments.
+ PC5 qpknian 2000-01-21 Updated model tag. class and
+ soClass elements should be in
+ separate models.
+ C qpknian 2000-02-10 Approved after inspection.
+ PD1 qpknian 2000-03-02 Added applicationTag.
+ Added notificationTypes.
+ Removed controlled.
+ Renamed readOnly to advisoryReadOnly.
+ PD2 qpknian 2000-03-21 Added softLink to hoppers.
+ D qpknian 2000-04-26 Approved after inspection.
+ PE1 qpknian 2000-06-27 Updated for CR41 (use Corba types)
+ E qpknian 2000-09-01 Approved after inspection.
+ PF1 eiuhlin 2000-08-21 Updated for CR43 (Rename Model to MIM, add INTER-MIM)
+ PF2 eiuhlin 2000-09-20 Support uniDirectionalAssociation and biDirectionalAssociation
+ Add static to Attribute
+ Add enumRef and sequence to struct
+ PF3 eiuhlin 2000-09-20 Add maxLength to sequence
+ PF4 eiuhlin 2000-09-21 Define Element static
+ PF5 eiuhlin 2000-09-27 Remove ATTLIST name from moRef
+ PF6 eiuhlin 2000-10-02 Remove tag <helpRef>, <icon>
+ Add associationClass to bi and uni-directional association
+ Change tag <target> to <supported>
+ Remove ATTLIST name from supporter and supported
+ Add ATTLIST name to moRef
+ Remove tag <advisoryReadOnly>
+ Add tag <readOnly> and <undefined>
+ PF7 eiuhlin 2000-10-04 Add ATTLIST name to interMim
+ F eiuhlin 2000-10-16 Approved after inspection.
+-->
+
+
+<!-- Common -->
+<!ELEMENT description (#PCDATA)>
+
+
+<!ELEMENT applicationTag (#PCDATA)>
+
+
+<!-- Models definition -->
+<!ELEMENT models (mim|interMim)*>
+
+<!ELEMENT mim (description?, applicationTag?,
+
+ (struct | enum | exception)*,
+ class+, relationship*)>
+<!ATTLIST mim name ID #REQUIRED
+ version CDATA #REQUIRED
+ release CDATA #REQUIRED>
+
+<!ELEMENT interMim (description?, applicationTag?,
+
+ (struct | enum )*,
+ relationship*)>
+
+<!ATTLIST interMim name CDATA #REQUIRED>
+
+<!-- MO class definition -->
+<!ELEMENT class (description?, applicationTag?,
+ systemCreated?, notificationTypes?, (action | attribute)*)>
+<!ATTLIST class name CDATA #REQUIRED>
+
+<!ELEMENT systemCreated EMPTY>
+
+<!ELEMENT notificationTypes (#PCDATA)>
+
+
+<!-- Relations -->
+<!ELEMENT relationship (description?, applicationTag?,
+ (biDirectionalAssociation |uniDirectionalAssociation | containment|softLink|support))>
+<!ATTLIST relationship name CDATA #REQUIRED>
+
+<!ELEMENT softLink (parent, child+)>
+
+<!ELEMENT support (supporter,supported+)>
+
+<!ELEMENT supporter (description?, applicationTag?,
+ hasClass, cardinality?)>
+
+<!ELEMENT supported (description?, applicationTag?,
+ hasClass, cardinality?)>
+
+<!ELEMENT biDirectionalAssociation (mandatory?, associationEnd, associationEnd+, associationClass?)>
+
+<!ELEMENT uniDirectionalAssociation (mandatory?, hasClass, associationEnd+, associationClass?)>
+
+<!ELEMENT containment (parent, child+)>
+
+<!ELEMENT associationEnd (description?, applicationTag?,
+ hasClass, cardinality?)>
+<!ATTLIST associationEnd name CDATA #REQUIRED>
+
+<!ELEMENT associationClass (attribute+)>
+
+<!ELEMENT parent (description?, applicationTag?,
+ hasClass)>
+<!ELEMENT child (description?, applicationTag?,
+ hasClass, cardinality?)>
+
+<!ELEMENT cardinality (min | max | (min, max))>
+
+<!ELEMENT hasClass EMPTY>
+<!ATTLIST hasClass name CDATA #REQUIRED
+ inMim CDATA #IMPLIED
+ ofVersion CDATA #IMPLIED>
+
+
+
+
+<!-- Data types -->
+<!ENTITY % corbaTypes "boolean | octet | char | double | float |
+ long | longlong | short | string | wstring">
+<!ENTITY % availableTypes "%corbaTypes; | enumRef | structRef |
+ moRef | sequence">
+
+
+<!-- For attributes, parameters and exceptions -->
+<!ELEMENT dataType (%availableTypes;)>
+
+<!-- For actions -->
+<!ELEMENT returnType (void | %availableTypes;)>
+
+
+<!-- Return data types -->
+<!ELEMENT void EMPTY>
+
+
+<!-- Primitive data types -->
+<!ELEMENT boolean (defaultValue?)>
+
+<!ELEMENT octet (range?, defaultValue?)>
+
+<!ELEMENT char (range?, defaultValue?)>
+
+<!ELEMENT double (range?, defaultValue?)>
+
+<!ELEMENT float (range?, defaultValue?)>
+
+<!ELEMENT long (range?, defaultValue?)>
+
+<!ELEMENT longlong (range?, defaultValue?)>
+
+<!ELEMENT short (range?, defaultValue?)>
+
+<!ELEMENT string (lengthRange?, (validValues | alphabet)?, defaultValue?)>
+
+<!ELEMENT wstring (lengthRange?, (validValues | alphabet)?, defaultValue?)>
+
+
+<!ELEMENT alphabet (#PCDATA)>
+<!ELEMENT validValues (#PCDATA)>
+
+<!ELEMENT lengthRange (min?, (min, max)*, max?)>
+<!ELEMENT range (min?, (min, max)*, max?)>
+
+<!ELEMENT max (#PCDATA)>
+<!ELEMENT min (#PCDATA)>
+
+<!ELEMENT defaultValue (#PCDATA)>
+
+
+<!-- Enum data type -->
+<!ELEMENT enum (description?, applicationTag?,
+ enumMember+, defaultValue?)>
+<!ATTLIST enum name CDATA #REQUIRED>
+
+<!ELEMENT enumMember (description?, applicationTag?,
+ value?)>
+<!ATTLIST enumMember name CDATA #REQUIRED>
+
+<!ELEMENT enumRef (defaultValue?)>
+<!ATTLIST enumRef name CDATA #REQUIRED>
+
+<!ELEMENT value (#PCDATA)>
+
+
+<!-- Struct data type -->
+<!ELEMENT struct (description?, applicationTag?,
+ structMember+)>
+<!ATTLIST struct name CDATA #REQUIRED>
+
+<!ELEMENT structMember (description?, applicationTag?,
+ (%corbaTypes; | sequence | enumRef))>
+<!ATTLIST structMember name CDATA #REQUIRED>
+
+<!ELEMENT structRef EMPTY>
+<!ATTLIST structRef name CDATA #REQUIRED>
+
+
+<!-- Sequence data type -->
+<!ELEMENT sequence ((%corbaTypes; | enumRef | structRef | moRef),
+ length?, maxLength?, nonUnique?)>
+
+<!ELEMENT length (#PCDATA)>
+
+<!ELEMENT maxLength (#PCDATA)>
+
+<!ELEMENT nonUnique EMPTY>
+
+
+<!-- MoRef data type -->
+<!ELEMENT moRef EMPTY>
+
+<!ATTLIST moRef name CDATA #REQUIRED>
+
+<!-- Attribute -->
+<!ELEMENT attribute (description?, applicationTag?,
+ local?, mandatory?, noNotification?,
+ nonPersistent?, readOnly?, restricted?, static?,undefined?, dataType)>
+<!ATTLIST attribute name CDATA #REQUIRED>
+
+
+<!-- Attribute controls -->
+<!-- nonUnique is defined under the sequence data type. -->
+
+<!ELEMENT local EMPTY>
+
+<!ELEMENT mandatory EMPTY>
+
+<!ELEMENT noNotification EMPTY>
+
+<!ELEMENT nonPersistent EMPTY>
+
+<!ELEMENT readOnly EMPTY>
+
+<!ELEMENT restricted EMPTY>
+
+<!ELEMENT static EMPTY>
+
+<!ELEMENT undefined EMPTY>
+
+
+<!-- Action -->
+<!ELEMENT action (description?, applicationTag?,
+ returnType, parameter*, raisesException*)>
+<!ATTLIST action name CDATA #REQUIRED>
+
+<!ELEMENT parameter (description?, applicationTag?,
+ (in | out | inout), dataType)>
+<!ATTLIST parameter name CDATA #REQUIRED>
+
+<!ELEMENT in EMPTY>
+<!ELEMENT inout EMPTY>
+<!ELEMENT out EMPTY>
+
+<!ELEMENT exception (description?, applicationTag?,
+ exceptionParameter*)>
+<!ATTLIST exception name CDATA #REQUIRED>
+
+<!ELEMENT exceptionParameter (description?, applicationTag?,
+ dataType)>
+<!ATTLIST exceptionParameter name CDATA #REQUIRED>
+
+<!ELEMENT raisesException EMPTY>
+<!ATTLIST raisesException name CDATA #REQUIRED>
diff --git a/lib/xmerl/test/xmerl_SUITE_data/eventp/wurfl.stub b/lib/xmerl/test/xmerl_SUITE_data/eventp/wurfl.stub
new file mode 100644
index 0000000000..78d980d5b7
--- /dev/null
+++ b/lib/xmerl/test/xmerl_SUITE_data/eventp/wurfl.stub
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE wurfl [
+<!ELEMENT version (#PCDATA)>
+<!ELEMENT wurfl (version)>
+]>
diff --git a/lib/xmerl/test/xmerl_SUITE_data/eventp/wurfl.xml b/lib/xmerl/test/xmerl_SUITE_data/eventp/wurfl.xml
new file mode 100644
index 0000000000..ea96469af3
--- /dev/null
+++ b/lib/xmerl/test/xmerl_SUITE_data/eventp/wurfl.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE wurfl [
+<!ELEMENT version (#PCDATA)>
+<!ELEMENT wurfl (version)>
+]>
+<wurfl>
+ <version>
+</version>
+</wurfl>
diff --git a/lib/xmerl/test/xmerl_SUITE_data/misc.tar.gz b/lib/xmerl/test/xmerl_SUITE_data/misc.tar.gz
new file mode 100644
index 0000000000..c48a6f897b
--- /dev/null
+++ b/lib/xmerl/test/xmerl_SUITE_data/misc.tar.gz
Binary files differ
diff --git a/lib/xmerl/test/xmerl_SUITE_data/xpath/documentRoot.xml b/lib/xmerl/test/xmerl_SUITE_data/xpath/documentRoot.xml
new file mode 100644
index 0000000000..667a44b7fe
--- /dev/null
+++ b/lib/xmerl/test/xmerl_SUITE_data/xpath/documentRoot.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<documentRoot>
+<!-- Test data from
+ http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm -->
+<?value ="2"?>
+<parent name="data" >
+ <child id="1" name="alpha" >Some Text</child>
+ <child id="2" name="beta" >
+ <grandchild id="2.1" name="beta-alpha" ></grandchild>
+ <grandchild id="2.2" name="beta-beta" ></grandchild>
+ </child>
+ <pet name="tigger" type="cat" >
+ <data>
+ <birthday month="sept" day="19" ></birthday>
+ <food name="Acme Cat Food" ></food>
+ </data>
+ </pet>
+ <pet name="Fido" type="dog" >
+ <description>
+ Large dog!
+ </description>
+ <data>
+ <birthday month="feb" day="3" ></birthday>
+ <food name="Acme Dog Food" ></food>
+ </data>
+ </pet>
+ <rogue name="is this real?" >
+ <data>
+ Hates dogs!
+ </data>
+ </rogue>
+ <child id="3" name="gamma" mark="yes" >
+ <!-- A comment -->
+ <description>
+ Likes all animals - especially dogs!
+ </description>
+ <grandchild id="3.1" name="gamma-alpha" >
+ <![CDATA[ Some non-parsable character data ]]>
+ </grandchild>
+ <grandchild id="3.2" name="gamma-beta" ></grandchild>
+ </child>
+</parent>
+</documentRoot> \ No newline at end of file
diff --git a/lib/xmerl/test/xmerl_SUITE_data/xpath/e1074.xml b/lib/xmerl/test/xmerl_SUITE_data/xpath/e1074.xml
new file mode 100644
index 0000000000..920a9e67e1
--- /dev/null
+++ b/lib/xmerl/test/xmerl_SUITE_data/xpath/e1074.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <root id="1">
+ <elem1 id="2">
+ <elem2 id="3">
+ <e id="4"/>
+ <elem3 id="5">
+ <e id="6"/>
+ </elem3>
+ <elem3 id="7"/>
+ </elem2>
+ </elem1>
+ <elem1 id="8">
+ <elem2 id="9"/>
+ <e id="10"/>
+ <e id="11"/>
+ </elem1>
+ <e id="12"/>
+ </root>
diff --git a/lib/xmerl/test/xmerl_SUITE_data/xpath/e1075.xml b/lib/xmerl/test/xmerl_SUITE_data/xpath/e1075.xml
new file mode 100644
index 0000000000..920a9e67e1
--- /dev/null
+++ b/lib/xmerl/test/xmerl_SUITE_data/xpath/e1075.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <root id="1">
+ <elem1 id="2">
+ <elem2 id="3">
+ <e id="4"/>
+ <elem3 id="5">
+ <e id="6"/>
+ </elem3>
+ <elem3 id="7"/>
+ </elem2>
+ </elem1>
+ <elem1 id="8">
+ <elem2 id="9"/>
+ <e id="10"/>
+ <e id="11"/>
+ </elem1>
+ <e id="12"/>
+ </root>
diff --git a/lib/xmerl/test/xmerl_SUITE_data/xpath/e1076.xml b/lib/xmerl/test/xmerl_SUITE_data/xpath/e1076.xml
new file mode 100644
index 0000000000..c9ffebb202
--- /dev/null
+++ b/lib/xmerl/test/xmerl_SUITE_data/xpath/e1076.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <root id="1">
+ <elem1 id="2">cat</elem1>
+ <elem1 id="3"> dog </elem1>
+ <elem1 id="4">
+ cat
+ <elem2 id="5">
+ <elem3 id="6">cat</elem3>
+ </elem2>
+ dog
+ </elem1>
+ <elem1 id="7">Cat</elem1>
+ </root>
diff --git a/lib/xmerl/test/xmerl_SUITE_data/xpath/e1077.xml b/lib/xmerl/test/xmerl_SUITE_data/xpath/e1077.xml
new file mode 100644
index 0000000000..9aa548e13c
--- /dev/null
+++ b/lib/xmerl/test/xmerl_SUITE_data/xpath/e1077.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <!DOCTYPE root [ <!ELEMENT e (e*) >
+ <!ATTLIST e id ID #REQUIRED>
+ ]>
+ <root>
+ <e id="1">
+ <e id="two">
+ <e id="3"/>
+ <e id="4">
+ <e id="the fifth"/>
+ </e>
+ <e id="6"/>
+ </e>
+ </e>
+ <e id="seven"/>
+ </root>
diff --git a/lib/xmerl/test/xmerl_SUITE_data/xpath/e1078.xml b/lib/xmerl/test/xmerl_SUITE_data/xpath/e1078.xml
new file mode 100644
index 0000000000..a90db50145
--- /dev/null
+++ b/lib/xmerl/test/xmerl_SUITE_data/xpath/e1078.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <root id="1">
+ <elem1 id="2" pet="cat"/>
+ <elem1 id="3" pet=" dog " age="8"/>
+ <elem1 id="4" pet="Cat" >
+ <elem2 id="5">
+ <elem3 id="6" age="10"/>
+ </elem2>
+ </elem1>
+ <elem1 id="7" pet="dog"/>
+ </root>
diff --git a/lib/xmerl/test/xmerl_SUITE_data/xpath/motorcycles.xml b/lib/xmerl/test/xmerl_SUITE_data/xpath/motorcycles.xml
new file mode 100644
index 0000000000..b3629dce34
--- /dev/null
+++ b/lib/xmerl/test/xmerl_SUITE_data/xpath/motorcycles.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<motorcycles>
+ <bike year="2000" color="black">
+ <name>
+ <manufacturer>Suzuki</manufacturer>
+ <brandName>Suzuki VL 1500</brandName>
+ <additionalName>Intruder</additionalName>
+ </name>
+ <engine>V-engine, 2-cylinders, 1500 cc</engine>
+ <kind>custom</kind>
+ <drive>cardan</drive>
+ <accessories>Sissy bar, luggage carrier,V&amp;H exhaust pipes</accessories>
+ </bike>
+ <date>2004.08.25</date>
+ <bike year="1983" color="read pearl">
+ <name>
+ <manufacturer>Yamaha</manufacturer>
+ <brandName>XJ 400</brandName>
+ </name>
+ <engine>4 cylinder, 400 cc</engine>
+ <kind>alround</kind>
+ <drive>chain</drive>
+ <comment>Good shape!</comment>
+ </bike>
+</motorcycles>
diff --git a/lib/xmerl/test/xmerl_SUITE_data/xpath/myBS_model.xml b/lib/xmerl/test/xmerl_SUITE_data/xpath/myBS_model.xml
new file mode 100644
index 0000000000..58f90662a4
--- /dev/null
+++ b/lib/xmerl/test/xmerl_SUITE_data/xpath/myBS_model.xml
@@ -0,0 +1,6 @@
+<myBS_model>
+
+ <blipp id="name1"/>
+ <blipp id="name2"/>
+
+</myBS_model>
diff --git a/lib/xmerl/test/xmerl_SUITE_data/xpath/purchaseOrder.xml b/lib/xmerl/test/xmerl_SUITE_data/xpath/purchaseOrder.xml
new file mode 100644
index 0000000000..a5ae223d65
--- /dev/null
+++ b/lib/xmerl/test/xmerl_SUITE_data/xpath/purchaseOrder.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<apo:purchaseOrder xmlns:apo="http://www.example.com/PO1"
+ orderDate="1999-10-20">
+ <billTo country="US">
+ <name>Robert Smith</name>
+ <street>8 Oak Avenue</street>
+ <!-- etc. -->
+ <city>Old Town</city>
+ <state>PA</state>
+ <zip>95819</zip>
+ </billTo>
+ <apo:comment>Hurry, my lawn is going wild!</apo:comment>
+ <shipTo country="US">
+ <name>Alice Smith</name>
+ <street>123 Maple Street</street>
+ <!-- etc. -->
+ <city>Mill Valley</city>
+ <state>CA</state>
+ <zip>90952</zip>
+ </shipTo>
+ <!-- etc. -->
+ <items>
+ <item partNum="872-AA">
+ <productName>Lawnmower</productName>
+ <quantity>1</quantity>
+ <USPrice>148.95</USPrice>
+ <comment>Confirm this is electric</comment>
+ </item>
+ <item partNum="926-AA">
+ <productName>Baby Monitor</productName>
+ <quantity>1</quantity>
+ <USPrice>39.98</USPrice>
+ <shipDate>1999-05-21</shipDate>
+ </item>
+ </items>
+</apo:purchaseOrder>
diff --git a/lib/xmerl/test/xmerl_SUITE_data/xpath/xpath.xml b/lib/xmerl/test/xmerl_SUITE_data/xpath/xpath.xml
new file mode 100644
index 0000000000..248fbd413d
--- /dev/null
+++ b/lib/xmerl/test/xmerl_SUITE_data/xpath/xpath.xml
@@ -0,0 +1,25 @@
+<myBS_model>
+
+ <blipp id="name1">
+ <blupp att="bluppa"/>
+ </blipp>
+ <blipp id="name2">
+ <blupp att2="bluppb">
+ <plopp name="pl">here are some text</plopp>
+ </blupp>
+ </blipp>
+ <blipp id="name3" test="test1">
+ <blupp att2="bluppc">
+ <plopp name="plp">here are some more text</plopp>
+ </blupp>
+ <blupp att="bluppc2"/>
+ </blipp>
+
+ <blipp2 bid="name1">
+ <blupp att="bluppa"/>
+ <blupp att2="bluppb">
+ <plopp name="pl">here are some additional text</plopp>
+ </blupp>
+ </blipp2>
+
+</myBS_model> \ No newline at end of file
diff --git a/lib/xmerl/test/xmerl_SUITE_data/xpath/xpath_abbrev.erl b/lib/xmerl/test/xmerl_SUITE_data/xpath/xpath_abbrev.erl
new file mode 100644
index 0000000000..850b7f8135
--- /dev/null
+++ b/lib/xmerl/test/xmerl_SUITE_data/xpath/xpath_abbrev.erl
@@ -0,0 +1,266 @@
+%%%-------------------------------------------------------------------
+%%% File : xpath_abbrev.erl
+%%% Author : Bertil Karlsson <bertil@finrod>
+%%% Description :
+%%%
+%%% Created : 17 Jan 2006 by Bertil Karlsson <bertil@finrod>
+%%%-------------------------------------------------------------------
+-module(xpath_abbrev).
+
+-export([test/0, check_node_set/2, ticket_6873/0, ticket_7496/0, functions/0]).
+
+-include("test_server.hrl").
+-include_lib("xmerl/include/xmerl.hrl").
+
+test() ->
+ ?line {E,_} = xmerl_scan:file("xpath.xml"),
+
+ ?line Res1 = xmerl_xpath:string("blipp",E),
+ ?line ok = check_node_set("blipp",Res1),
+ ?line Res2 = xmerl_xpath:string("*",E),
+ ?line ok = check_node_set("*",Res2),
+ ?line Res3 = xmerl_xpath:string("blipp/blupp/plopp/text()",E),
+ ?line ok = check_node_set("blipp/blupp/plopp/text()",Res3),
+ ?line Res4 = xmerl_xpath:string("blipp/blupp/@att2",E),
+ ?line ok = check_node_set("blipp/blupp/@att2",Res4),
+ ?line Res5 = xmerl_xpath:string("blipp/@*",E),
+ ?line ok = check_node_set("blipp/@*",Res5),
+ ?line Res6 = xmerl_xpath:string("blipp[2]",E),
+ ?line ok = check_node_set("blipp[2]",Res6),
+ ?line Res7 = xmerl_xpath:string("blipp[last()]",E),
+ ?line ok = check_node_set("blipp[last()]",Res7),
+ ?line Res8 = xmerl_xpath:string("*/blupp",E),
+ ?line ok = check_node_set("*/blupp",Res8),
+ ?line Res9 = xmerl_xpath:string("/myBS_model/blipp[3]/blupp[2]",E),
+ ?line ok = check_node_set("/myBS_model/blipp[3]/blupp[2]",Res9),
+ ?line Res10 = xmerl_xpath:string("blipp//plopp",E),
+ ?line ok = check_node_set("blipp//plopp",Res10),
+ ?line Res11 = xmerl_xpath:string("//plopp",E),
+ ?line ok = check_node_set("//plopp",Res11),
+ ?line Res12 = xmerl_xpath:string("//blupp/plopp",E),
+ ?line ok = check_node_set("//blupp/plopp",Res12),
+ ?line Res13 = xmerl_xpath:string(".",E),
+ ?line ok = check_node_set(".",Res13),
+ ?line Res14 = xmerl_xpath:string(".//blipp2",E),
+ ?line ok = check_node_set(".//blipp2",Res14),
+ ?line Res15 = xmerl_xpath:string(".//blipp2/blupp/plopp/..",E),
+ ?line ok = check_node_set(".//blipp2/blupp/plopp/..",Res15),
+ ?line Res16 = xmerl_xpath:string(".//blipp[2]/blupp/plopp/../@att2",E),
+ ?line ok = check_node_set(".//blipp[2]/blupp/plopp/../@att2",Res16),
+ ?line Res17 = xmerl_xpath:string(".//blipp/blupp/plopp[2]/../@att2",E),
+ ?line ok = check_node_set(".//blipp/blupp/plopp[2]/../@att2",Res17),
+ ?line Res18 = xmerl_xpath:string("blipp[@id='name2']",E),
+ ?line ok = check_node_set("blipp[@id='name2']",Res18),
+ ?line Res19 = xmerl_xpath:string("blipp[@id='name2'][3]",E),
+ ?line ok = check_node_set("blipp[@id='name2'][3]",Res19),
+ ?line Res20 = xmerl_xpath:string("//blupp[plopp=\"here are some more text\"]",E),
+ ?line ok = check_node_set("//blupp[plopp=\"here are some more text\"]",Res20),
+ ?line Res21 = xmerl_xpath:string("//blupp[plopp]",E),
+ ?line ok = check_node_set("//blupp[plopp]",Res21),
+ ?line Res22 = xmerl_xpath:string("blipp[@id and @test]",E),
+ ?line ok = check_node_set("blipp[@id and @test]",Res22).
+
+check_node_set("blipp",[E1,E2,E3]) ->
+ ?line ok = xml_element_name(E1,blipp),
+ ?line ok = xml_element_name(E2,blipp),
+ ?line ok = xml_element_name(E3,blipp),
+ ok;
+check_node_set("*",[E1,E2,E3,E4]) ->
+ ?line ok = xml_element_name(E1,blipp),
+ ?line ok = xml_element_name(E2,blipp),
+ ?line ok = xml_element_name(E3,blipp),
+ ?line ok = xml_element_name(E4,blipp2),
+ ok;
+check_node_set("blipp/blupp/plopp/text()",[T1,T2]) ->
+ ?line #xmlText{value="here are some text"} = T1,
+ ?line #xmlText{value="here are some more text"} = T2,
+ ok;
+check_node_set("blipp/blupp/@att2",[A1,A2]) ->
+ ?line #xmlAttribute{name=att2} = A1,
+ ?line #xmlAttribute{name=att2} = A2,
+ ok;
+check_node_set("blipp/@*",[A1,A2,A3,A4]) ->
+ ?line #xmlAttribute{} = A1,
+ ?line #xmlAttribute{} = A2,
+ ?line #xmlAttribute{} = A3,
+ ?line #xmlAttribute{} = A4,
+ ok;
+check_node_set("blipp[2]",[E]) ->
+ ?line #xmlElement{name=blipp,
+ attributes=[#xmlAttribute{name=id,value="name2"}]} = E,
+ ok;
+check_node_set("blipp[last()]",[E]) ->
+ ?line #xmlElement{name=blipp,
+ attributes=[#xmlAttribute{name=id,value="name3"}|_]} = E,
+ ok;
+check_node_set("*/blupp",[E1,E2,E3,E4,E5,E6]) ->
+ ?line ok = xml_element_name(E1,blupp),
+ ?line ok = xml_element_name(E2,blupp),
+ ?line ok = xml_element_name(E3,blupp),
+ ?line ok = xml_element_name(E4,blupp),
+ ?line ok = xml_element_name(E5,blupp),
+ ?line ok = xml_element_name(E6,blupp),
+ ok;
+check_node_set("/myBS_model/blipp[3]/blupp[2]",[E]) ->
+ ?line #xmlElement{name=blupp,
+ attributes=[#xmlAttribute{name=att,value="bluppc2"}]}=E,
+ ok;
+check_node_set("blipp//plopp",[#xmlElement{name=plopp},#xmlElement{name=plopp}]) ->
+ ok;
+check_node_set("//plopp",[E1,E2,E3]) ->
+ ?line ok = xml_element_name(E1,plopp),
+ ?line ok = xml_element_name(E2,plopp),
+ ?line ok = xml_element_name(E3,plopp),
+ ok;
+check_node_set("//blupp/plopp",[E1,E2,E3]) ->
+ ?line ok = xml_element_name(E1,plopp),
+ ?line ok = xml_element_name(E2,plopp),
+ ?line ok = xml_element_name(E3,plopp),
+ ok;
+check_node_set(".",[#xmlElement{name=myBS_model}]) ->
+ ok;
+check_node_set(".//blipp2",[#xmlElement{name=blipp2}]) ->
+ ok;
+check_node_set(".//blipp2/blupp/plopp/..",[#xmlElement{name=blupp}]) ->
+ ok;
+check_node_set(".//blipp[2]/blupp/plopp/../@att2",[#xmlAttribute{name=att2,value="bluppb"}]) ->
+ ok;
+check_node_set(".//blipp/blupp/plopp[2]/../@att2",[#xmlAttribute{name=att2,value="bluppc"}]) ->
+ ok;
+check_node_set("blipp[@id='name2']",[E]) ->
+ ?line #xmlElement{name=blipp,
+ attributes=[#xmlAttribute{name=id,value="name2"}]}=E,
+ ok;
+check_node_set("blipp[@id='name2'][3]",[]) ->
+ ok;
+check_node_set("//blupp[plopp=\"here are some more text\"]",[E]) ->
+ ?line #xmlElement{name=blupp,
+ content=[_T,#xmlElement{name=plopp,content=C}|_]} = E,
+ ?line true = lists:keymember("here are some more text",#xmlText.value,C),
+ ok;
+check_node_set("//blupp[plopp]",[E1,E2,E3]) ->
+ ?line #xmlElement{name=blupp,
+ content=C1} = E1,
+ ?line true = lists:keymember(plopp,#xmlElement.name,C1),
+ ?line #xmlElement{name=blupp,
+ content=C2} = E2,
+ ?line true = lists:keymember(plopp,#xmlElement.name,C2),
+ ?line #xmlElement{name=blupp,
+ content=C3} = E3,
+ ?line true = lists:keymember(plopp,#xmlElement.name,C3),
+ ok;
+check_node_set("blipp[@id and @test]",[E]) ->
+ ?line #xmlElement{name=blipp,
+ attributes=Atts} = E,
+ ?line true = lists:keymember(id,#xmlAttribute.name,Atts),
+ ?line true = lists:keymember(test,#xmlAttribute.name,Atts),
+ ok;
+check_node_set(Pattern,NodeSet) ->
+ io:format("Pattern: ~p~nNodeSet: ~p~n",[Pattern,NodeSet]),
+ error.
+
+xml_element_name(E,N) ->
+ ?line #xmlElement{name=N} = E,
+ ok.
+
+ticket_6873() ->
+ ?line [#xmlElement{}] = xmerl_xpath:string("//foo[contains(@bar, 'oe')]",element(1,xmerl_scan:string("<foo bar=\"Joe\" />"))),
+ ok.
+
+ticket_7496() ->
+ Test = fun(Doc, XPath, Exp) ->
+ Result = xmerl_xpath:string(XPath, Doc),
+ ?line Exp = [Name || #xmlElement{name = Name} <- Result],
+ ok
+ end,
+ ?line {Doc1,_} = xmerl_scan:string("<a><b/> <c/> <d/> <e/></a>"),
+ ?line ok = Test(Doc1, "//b/following::*", [c, d, e]),
+ ?line ok = Test(Doc1,"//b/following::*[1]", [c]),
+ ?line ok = Test(Doc1,"//b/following::*[position()=1]", [c]),
+ ?line ok = Test(Doc1,"//b/following::*[3]", [e]),
+ ?line ok = Test(Doc1,"//b/following::*[position()=3]", [e]),
+ ?line ok = Test(Doc1,"//e/preceding::*", [b, c, d]),
+ ?line ok = Test(Doc1,"//e/preceding::*[1]", [d]),
+ ?line ok = Test(Doc1,"//e/preceding::*[position()=1]", [d]),
+ ?line ok = Test(Doc1,"//e/preceding::*[3]", [b]),
+ ?line ok = Test(Doc1,"//e/preceding::*[position()=3]", [b]),
+ ?line ok = Test(Doc1,"//b/following::*[position() mod 2=0]", [d]),
+ ?line ok = Test(Doc1,"//b/self::*", [b]),
+
+ ?line {Doc2,_} = xmerl_scan:string("<a><b/> <c><d/></c> <e/> <f><g/></f> <h/> <i><j/></i> <k/></a>"),
+ ?line ok = Test(Doc2,"//g/preceding::*", [b, c, d, e]),
+ ?line ok = Test(Doc2, "//g/following::*", [h, i, j, k]),
+ ?line ok = Test(Doc2,"//g/ancestor::*", [a, f]),
+ ?line ok = Test(Doc2,"//g/ancestor::*[1]", [f]),
+ ?line ok = Test(Doc2,"//g/ancestor::*[2]", [a]),
+ ?line ok = Test(Doc2,"//g/ancestor-or-self::*", [a, f, g]),
+ ?line ok = Test(Doc2,"//g/ancestor-or-self::*[1]", [g]),
+ ?line ok = Test(Doc2,"//g/ancestor-or-self::*[2]", [f]),
+ ?line ok = Test(Doc2,"//g/ancestor-or-self::*[3]", [a]),
+ ?line ok = Test(Doc2,"/descendant::*", [a, b, c, d, e, f, g, h, i, j, k]),
+ ?line ok = Test(Doc2,"//f/preceding-sibling::*", [b, c, e]),
+ ?line ok = Test(Doc2,"//f/following-sibling::*", [h, i, k]),
+ ?line ok = Test(Doc2,"//f/self::*", [f]),
+ ?line ok = Test(Doc2,"//f/ancestor::*", [a]),
+ ?line ok = Test(Doc2,"//f/descendant::*", [g]),
+ ?line ok = Test(Doc2,"//f/preceding::*", [b, c, d, e]),
+ ?line ok = Test(Doc2,"//f/following::*", [h, i, j, k]),
+ ?line ok = Test(Doc2,"//text()[1]/following-sibling::*", [c, e, f, h, i, k]),
+
+ ?line {Doc3,_} = xmerl_scan:file("documentRoot.xml"),
+ ?line ok = Test(Doc3,"//child",[child,child,child]),
+ ?line ok = Test(Doc3,"//child[@name='beta']",[child]),
+ ?line [{xmlAttribute,id,[],[],[],[],1,[],"2",false}] =
+ xmerl_xpath:string("/documentRoot/parent/child[@name='beta']/@id",Doc3),
+ ?line ok = Test(Doc3,"/documentRoot/parent/child|/documentRoot/parent/pet",
+ [child,child,child,pet,pet]),
+ ?line ok = Test(Doc3,"//*[starts-with(local-name(),'p')]",
+ [parent,pet,pet]).
+
+
+functions() ->
+ Test = fun(Doc, XPath, Exp) ->
+ Result = xmerl_xpath:string(XPath, Doc),
+ ?line Exp = [begin
+ case Obj of
+ #xmlElement{name = EName} ->
+ EName;
+ #xmlAttribute{name = AName} ->
+ AName;
+ #xmlText{value=Text} ->
+ Text
+ end
+ end|| Obj <- Result],
+ ok
+ end,
+ Foo =
+ "<foo>"
+ " <bar>"
+ " <name>Xml</name>"
+ " <value>1</value>"
+ " </bar>"
+ " <bar>"
+ " <name>Xpath</name>"
+ " <value>2</value>"
+ " </bar>"
+ " <bar>"
+ " <name>Erlang</name>"
+ " <value>3</value>"
+ " </bar>"
+ "</foo>",
+ {Doc,_} = xmerl_scan:string(Foo),
+ ?line ok = Test(Doc,"/foo/bar[name = 'Xml']/value/text()",["1"]),
+ ?line ok = Test(Doc,"/foo/bar/node()/text()",
+ ["Xml","1","Xpath","2","Erlang","3"]),
+ ?line ok = Test(Doc,"/foo/bar[contains(name, 'path')]",[bar]),
+ ?line ok = Test(Doc,"/foo/bar[starts-with(name, 'X')]",[bar,bar]),
+ ?line ok = Test(Doc,"/foo/bar[value = string(1)]/value/text()",["1"]),
+
+
+ {Doc2,_}= xmerl_scan:file("purchaseOrder.xml"),
+ ?line ok = Test(Doc2,"//*[starts-with(local-name(),'c')]",
+ ['apo:comment',city,city,comment]),
+ ?line ok = Test(Doc2,"//*[starts-with(name(),'c')]",
+ [city,city,comment]),
+ ?line ok = Test(Doc2,"//*[starts-with(name(),'{http://www.example.com/PO1')]",
+ ['apo:purchaseOrder','apo:comment']).
diff --git a/lib/xmerl/test/xmerl_SUITE_data/xpath/xpath_lib.erl b/lib/xmerl/test/xmerl_SUITE_data/xpath/xpath_lib.erl
new file mode 100644
index 0000000000..4cde46826e
--- /dev/null
+++ b/lib/xmerl/test/xmerl_SUITE_data/xpath/xpath_lib.erl
@@ -0,0 +1,184 @@
+%%%-------------------------------------------------------------------
+%%% File : xpath_lib.erl
+%%% Author : Bertil Karlsson <bertil@finrod>
+%%% Description :
+%%%
+%%% Created : 13 Jan 2006 by Bertil Karlsson <bertil@finrod>
+%%%-------------------------------------------------------------------
+-module(xpath_lib).
+
+-export([test/0,check_node_set/2,ticket_6873/0]).
+
+-include("test_server.hrl").
+-include_lib("xmerl/include/xmerl.hrl").
+
+test() ->
+ ?line {E,_} = xmerl_scan:file("myBS_model.xml"),
+ ?line Res1 = xmerl_xpath:string("blipp",E),
+ ?line ok = check_node_set("blipp",Res1),
+ ?line Res2 = xmerl_xpath:string("//blipp",E),
+ ?line ok = check_node_set("//blipp",Res2),
+ ?line Res3 = xmerl_xpath:string("/myBS_model/blipp",E),
+ ?line ok = check_node_set("/myBS_model/blipp",Res3),
+ ?line Res4 = xmerl_xpath:string("blipp[@id=\"name1\"]",E),
+ ?line ok = check_node_set("blipp[@id=\"name1\"]",Res4),
+ ?line Res5 = xmerl_xpath:string("//blipp[@id=\"name1\"]",E),
+ ?line ok = check_node_set("//blipp[@id=\"name1\"]",Res5),
+ ?line Res6 = xmerl_xpath:string("/myBS_model/blipp[@id=\"name1\"]",E),
+ ?line ok = check_node_set("/myBS_model/blipp[@id=\"name1\"]",Res6).
+
+
+check_node_set("blipp",[H1,H2]) ->
+ ?line #xmlElement{name = blipp} = H1,
+ ?line #xmlElement{name = blipp} = H2,
+ ok;
+check_node_set("//blipp",[H1,H2]) ->
+ ?line #xmlElement{name = blipp} = H1,
+ ?line #xmlElement{name = blipp} = H2,
+ ok;
+check_node_set("/myBS_model/blipp",[H1,H2]) ->
+ ?line #xmlElement{name = blipp} = H1,
+ ?line #xmlElement{name = blipp} = H2,
+ ok;
+check_node_set("blipp[@id=\"name1\"]",[H]) ->
+ ?line H#xmlElement{attributes=#xmlAttribute{name=id,value="name1"}},
+ ok;
+check_node_set("//blipp[@id=\"name1\"]",[H]) ->
+ ?line H#xmlElement{attributes=#xmlAttribute{name=id,value="name1"}},
+ ok;
+check_node_set("/myBS_model/blipp[@id=\"name1\"]",[H]) ->
+ ?line H#xmlElement{attributes=#xmlAttribute{name=id,value="name1"}},
+ ok.
+
+ticket_6873() ->
+ GetId =
+ fun(Atts) ->
+ case lists:keysearch(id,#xmlAttribute.name,Atts) of
+ {value,#xmlAttribute{value=AttV}} -> AttV;
+ _ -> novalue
+ end
+ end,
+ Test =
+ fun(Doc, XPath, Exp) ->
+ Result = xmerl_xpath:string(XPath, Doc),
+ Exp = [begin
+ case Obj of
+ #xmlElement{name = EName,attributes=Atts} ->
+ {EName,GetId(Atts)};
+ #xmlAttribute{name = AName} ->
+ AName;
+ #xmlText{value=Text} ->
+ Text
+ end
+ end|| Obj <- Result],
+ ok
+ end,
+
+
+
+ Doc1 = get_doc("e1074"),
+ ?line ok = Test(Doc1,"/*",[{root,"1"}]),
+ ?line ok = Test(Doc1,"/root",[{root,"1"}]),
+ ?line ok = Test(Doc1,"/root/*",[{elem1,"2"},{elem1,"8"},{e,"12"}]),
+ ?line ok = Test(Doc1,"/root/e",[{e,"12"}]),
+ ?line ok = Test(Doc1,"//e",[{e,"12"},{e,"4"},{e,"6"},{e,"10"},{e,"11"}]),
+ ?line ok = Test(Doc1,"//*[name() != 'e']",
+ [{root,"1"},{elem1,"2"},{elem1,"8"},{elem2,"3"},
+ {elem3,"5"},{elem3,"7"},{elem2,"9"}]),
+ ?line ok = Test(Doc1,"//elem1/e",[{e,"10"},{e,"11"}]),
+ ?line ok = Test(Doc1,"//elem1//e",[{e,"4"},{e,"6"},{e,"10"},{e,"11"}]),
+ ?line ok = Test(Doc1,"//*[*]",
+ [{root,"1"},{elem1,"2"},{elem1,"8"},
+ {elem2,"3"},{elem3,"5"}]),
+ ?line ok = Test(Doc1,"//*[not(*)]",
+ [{e,"12"},{e,"4"},{elem3,"7"},{e,"6"},
+ {elem2,"9"},{e,"10"},{e,"11"}]),
+ %% contents would be empty in the above expression
+ ?line [#xmlElement{content=[]}|_] = xmerl_xpath:string("//*[not(*)]",Doc1),
+ ?line ok = Test(Doc1,"//*[e]",[{root,"1"},{elem1,"8"},{elem2,"3"},{elem3,"5"}]),
+ ?line ok = Test(Doc1,"//*[count(e)>1]",[{elem1,"8"}]),
+ ?line ok = Test(Doc1,"//*[not(e) and name() != 'e']",
+ [{elem1,"2"},{elem3,"7"},{elem2,"9"}]),
+ ?line ok = Test(Doc1,"/*/*/*/e",[{e,"4"}]),
+ ?line ok = Test(Doc1,"//*[starts-with(name(), 'el')]",
+ [{elem1,"2"},{elem1,"8"},{elem2,"3"},
+ {elem3,"5"},{elem3,"7"},{elem2,"9"}]),
+ ?line ok = Test(Doc1,"//*[contains(name(), 'lem1')]",
+ [{elem1,"2"},{elem1,"8"}]),
+ ?line ok = Test(Doc1,"/*/e | //elem2/e",[{e,"4"},{e,"12"}]),
+
+ io:format("Tested ~p~n",[e1074]),
+
+ Doc2 = get_doc("e1075"),
+ ?line ok = Test(Doc2,"/*/*[1]",[{elem1,"2"}]),
+ ?line ok = Test(Doc2,"/root/elem1[2]",[{elem1,"8"}]),
+
+ %% Get all first-born e elements in the document; that is, for all
+ %% e elements with e element siblings, include only the first
+ %% sibling.Note that //e[1] does not return the first e element in
+ %% the document because the [1] predicate applies to e, which
+ %% represents the set of e elements under one element and not to
+ %% //e, which represents the set of e elements in the document.
+ %% ?line ok = Test(Doc2,"//e[1]",[{e,"4"},{e,"6"},{e,"10"},{e,"12"}]),
+
+ %% The following expression retrieves the first e element in the
+ %% document:
+ %% ?line ok = Test(Doc2,"(//e)[1]",[{e,4}]),
+
+ %% For all e elements with e element siblings, include only the
+ %% first 3 siblings
+ %% ?line ok = Test(Doc2,"//e[position() <= 3]",[{e,"4"},{e,"6"},{e,"10"},{e,"11"},{e,"12"}]),
+
+ %% Get all last-born e elements in the document; that is, for all
+ %% e elements with e element siblings, include only the last
+ %% sibling
+ %% ?line ok = Test(Doc2,"//e[last()]",[{e,"4"},{e,"6"},{e,"11"},{e,"12"}]),
+
+ %% Get the last e element in the document
+ %% ?line ok = Test(Doc2,"(//e)[last()]", [{e,"12"}]),
+
+
+ io:format("Tested ~p~n",[e1075]),
+
+
+ Doc3 = get_doc("e1076"),
+ ?line ok = Test(Doc3,"//*[.='cat']",[{elem1,"2"},{elem3,"6"}]),
+ ?line ok = Test(Doc3,"//*[.='dog']",[]),
+ ?line ok = Test(Doc3,"//*[contains(.,'cat')]",
+ [{elem1,"2"},{elem1,"4"},{elem3,"6"}]),
+ ?line ok = Test(Doc3,"//elem3[contains(.,'cat')]",[{elem3,"6"}]),
+ ?line ok = Test(Doc3,"//*[contains(child::text(),'cat')]",[{elem1,"2"},{elem1,"4"},{elem3,"6"}]),
+ ?line ok = Test(Doc3,"//*[count(*)=0 and contains(.,'cat')]",[{elem1,"2"},{elem3,"6"}]),
+ ?line ok = Test(Doc3,"//*[contains(translate(.,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'),'CAT')]",[{elem1,"2"},{elem1,"4"},{elem1,"7"},{elem3,"6"}]),
+
+ io:format("Tested ~p~n",[e1076]),
+
+ Doc4 = get_doc("e1078"),
+ ?line ok = Test(Doc4,"//*[@pet='cat']",[{elem1,"2"}]),
+ ?line ok = Test(Doc4,"//*[@pet='dog']",[{elem1,"7"}]),
+ ?line ok = Test(Doc4,"//*[contains(@pet,'dog')]",
+ [{elem1,"3"},{elem1,"7"}]),
+ ?line ok = Test(Doc4,"//*[@age]",[{elem1,"3"},{elem3,"6"}]),
+ ?line ok = Test(Doc4,"//elem1[@age]",[{elem1,"3"}]),
+ ?line ok = Test(Doc4,"//*[@pet and @age]",[{elem1,"3"}]),
+ ?line ok = Test(Doc4,"//*[contains(translate(@pet,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'),'CAT')]",[{elem1,"2"},{elem1,"4"}]),
+
+ io:format("Tested ~p~n",[e1078]),
+
+
+ Doc5 = get_doc("e1077"),
+ ?line ok = Test(Doc5,"id('3')",[{e,"3"}]),
+
+ %% Get all e elements directly under element id 3
+ %% ?line ok = Test(Doc5,"id('two')/e",[{e,"3"},{e,"4"},{e,"6"}]),
+ ?line ok = Test(Doc5,"id('two 3 seven the fifth')",[{e,"seven"},{e,"3"},{e,"two"}]),
+ ?line ok = Test(Doc5,"id('100')",[]),
+
+ io:format("Tested ~p~n",[e1077]),
+ ok.
+
+
+
+get_doc(Name) ->
+ ?line {Doc,_} = xmerl_scan:file(Name++".xml"),
+ Doc.
diff --git a/lib/xmerl/test/xmerl_SUITE_data/xpath/xpath_text.erl b/lib/xmerl/test/xmerl_SUITE_data/xpath/xpath_text.erl
new file mode 100644
index 0000000000..e39ad6bcb0
--- /dev/null
+++ b/lib/xmerl/test/xmerl_SUITE_data/xpath/xpath_text.erl
@@ -0,0 +1,28 @@
+%%%-------------------------------------------------------------------
+%%% File : xpath_text.erl
+%%% Author : Bertil Karlsson <bertil@finrod>
+%%% Description :
+%%%
+%%% Created : 14 Dec 2004 by Bertil Karlsson <bertil@finrod>
+%%%-------------------------------------------------------------------
+-module(xpath_text).
+
+-compile(export_all).
+
+-include("test_server.hrl").
+-include_lib("xmerl/include/xmerl.hrl").
+
+-import(xmerl_xs,
+ [ xslapply/2, value_of/1, select/2, built_in_rules/2 ]).
+
+
+one() ->
+ ?line {A,_}=xmerl_scan:file('motorcycles.xml'),
+ ?line [["Suzuki","Yamaha"]] = template(A),
+ ok.
+
+%%% templates, test of OTP-5268
+template(E = #xmlElement{name='motorcycles'}) ->
+ [value_of(select("bike/name/manufacturer/text()",E))];
+template(E) -> built_in_rules(fun template/1, E).
+
diff --git a/lib/xmerl/test/xmerl_app_test.erl b/lib/xmerl/test/xmerl_app_test.erl
new file mode 100644
index 0000000000..4cc4bf3791
--- /dev/null
+++ b/lib/xmerl/test/xmerl_app_test.erl
@@ -0,0 +1,242 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2004-2010. 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%
+%%
+%%
+%%----------------------------------------------------------------------
+%% Purpose: Verify the application specifics of the Megaco application
+%%----------------------------------------------------------------------
+-module(xmerl_app_test).
+
+-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(Case, Config) ->
+% megaco_test_lib:init_per_testcase(Case, Config).
+
+% end_per_testcase(Case, Config) ->
+% megaco_test_lib:end_per_testcase(Case, Config).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+all() ->
+ [fields, modules, exportall, app_depend].
+
+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(xmerl) of
+ {ok, AppFile} ->
+ io:format("AppFile: ~n~p~n", [AppFile]),
+ [{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 ->
+ {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(xmerl),
+ 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.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+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.
diff --git a/lib/xmerl/test/xmerl_appup_test.erl b/lib/xmerl/test/xmerl_appup_test.erl
new file mode 100644
index 0000000000..88d4a9bc28
--- /dev/null
+++ b/lib/xmerl/test/xmerl_appup_test.erl
@@ -0,0 +1,392 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2004-2010. 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%
+%%
+%%
+%%----------------------------------------------------------------------
+%% Purpose: Verify the application specifics of the Megaco application
+%%----------------------------------------------------------------------
+-module(xmerl_appup_test).
+
+-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(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].
+
+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) ->
+ AppFile = file_name(xmerl, ".app"),
+ AppupFile = file_name(xmerl, ".appup"),
+ [{app_file, AppFile}, {appup_file, AppupFile}|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) ->
+ 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,xmerl,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}]} ->
+ io:format("V= ~p, UpFrom= ~p, DownTo= ~p, Modules= ~p~n",
+ [V, UpFrom, DownTo, Modules]),
+ 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),
+ ok.
+
+
+check_depends(_, [], _) ->
+ ok;
+check_depends(UpDown, [Dep|Deps], Modules) ->
+ check_depend(UpDown, Dep, Modules),
+ check_depends(UpDown, Deps, Modules).
+
+
+check_depend(up,I={add_application, _App}, Modules) ->
+ d("check_instructions(~w) -> entry with"
+ "~n Instruction: ~p"
+ "~n Modules: ~p", [up,I , Modules]),
+ ok;
+check_depend(down,I={remove_application, _App}, Modules) ->
+ d("check_instructions(~w) -> entry with"
+ "~n Instruction: ~p"
+ "~n Modules: ~p", [down,I , 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 ->
+ local_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), is_atom(Pre), 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 ->
+ local_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), is_atom(Pre), 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}} ->
+ local_error({nonexisting_removed_module, Module})
+ end;
+
+check_instruction(_, {load_module, Module, Pre, Post, Depend},
+ AllInstr, Modules)
+ when is_atom(Module), is_atom(Pre), is_atom(Post), 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), is_atom(Pre), is_atom(Post), 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(_, Instr, _AllInstr, _Modules) ->
+ d("check_instruction -> entry when unknown instruction with"
+ "~n Instr: ~p", [Instr]),
+ local_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(Instr) ->
+ d("instruction_module -> entry when unknown instruction with"
+ "~n Instr: ~p", [Instr]),
+ local_error({error, {unknown_instruction, Instr}}).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+check_version(V) when is_list(V) ->
+ ok;
+check_version(V) ->
+ local_error({bad_version, V}).
+
+
+check_module(M, Modules) when is_atom(M) ->
+ case lists:member(M,Modules) of
+ true ->
+ ok;
+ false ->
+ local_error({unknown_module, M, Modules})
+ end;
+check_module(M, _) ->
+ local_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), 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 ->
+ local_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]),
+ local_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 ->
+ local_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 ->
+ local_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) ->
+ local_error({bad_change, Change}).
+
+
+check_purge(soft_purge) ->
+ ok;
+check_purge(brutal_purge) ->
+ ok;
+check_purge(Purge) ->
+ local_error({bad_purge, Purge}).
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+local_error(Reason) ->
+ throw({error, Reason}).
+
+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.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+d(F, A) ->
+ d(false, F, A).
+
+d(true, F, A) ->
+ io:format(F ++ "~n", A);
+d(_, _, _) ->
+ ok.
+
+
diff --git a/lib/xmerl/test/xmerl_sax_SUITE.erl b/lib/xmerl/test/xmerl_sax_SUITE.erl
new file mode 100644
index 0000000000..563bbaaa06
--- /dev/null
+++ b/lib/xmerl/test/xmerl_sax_SUITE.erl
@@ -0,0 +1,110 @@
+%%-*-erlang-*-
+%%----------------------------------------------------------------------
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010. 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%
+%%----------------------------------------------------------------------
+%% File : xmerl_sax_SUITE.erl
+%% Created : 2009-06-01
+%%----------------------------------------------------------------------
+-module(xmerl_sax_SUITE).
+-compile(export_all).
+
+%%----------------------------------------------------------------------
+%% Include files
+%%----------------------------------------------------------------------
+-include_lib("test_server/include/test_server.hrl").
+-include_lib("kernel/include/file.hrl").
+
+%%======================================================================
+%% External functions
+%%======================================================================
+
+%%----------------------------------------------------------------------
+%% Initializations
+%%----------------------------------------------------------------------
+
+init_per_suite(doc) ->
+ ["Starts the test suite"];
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(doc) ->
+ ["Stops the test suite"];
+end_per_suite(Config) ->
+ Config.
+
+
+
+%% initialization before each testcase
+init_per_testcase(_TestCase,Config) ->
+ Config.
+
+%% clean up after each testcase
+end_per_testcase(_Func,_Config) ->
+ ok.
+
+%%----------------------------------------------------------------------
+%% Tests
+%%----------------------------------------------------------------------
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% ID: ticket_8213
+%% Description: Checks that end of document is checked properly when continuation fun is missing.
+ticket_8213(suite) -> [];
+ticket_8213(_Config) ->
+ ?line {ok,ok,[]} = xmerl_sax_parser:stream("<elem/>", [{event_fun, fun (_E,_,_) -> ok end}]).
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% ID: ticket_8214
+%% Description: Checks that attributes with default namespace don't get [] in NS field.
+ticket_8214(suite) -> [];
+ticket_8214(_Config) ->
+ ?line {ok,ok,[]} =
+ xmerl_sax_parser:stream("<elem attr='123' x:attr='234' xmlns='http://lshift.net/d' "
+ "xmlns:x='http://lshift.net/x' />",
+ [{event_fun, fun ({startElement,"http://lshift.net/d","elem",
+ {[],"elem"},
+ [{[],[],"attr","123"},{"http://lshift.net/x","x","attr","234"}]},
+ _, _) ->ok;
+ ({startElement, _, "elem",_,_}, _,_) ->
+ throw({test, "Error in startElement tuple"});
+ (_E,_,_) -> ok
+ end}]).
+
+%%----------------------------------------------------------------------
+%% Bug test cases
+%%
+
+%%----------------------------------------------------------------------
+%% Test Suite
+%%
+all() ->
+ [{group, bugs}].
+
+groups() ->
+ [{bugs, [], [ticket_8213, ticket_8214]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
diff --git a/lib/xmerl/test/xmerl_sax_std_SUITE.erl b/lib/xmerl/test/xmerl_sax_std_SUITE.erl
new file mode 100644
index 0000000000..2048cc384f
--- /dev/null
+++ b/lib/xmerl/test/xmerl_sax_std_SUITE.erl
@@ -0,0 +1,25635 @@
+
+%%----------------------------------------------------------------------
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010. 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%
+%%----------------------------------------------------------------------
+%% File : xmerl_sax_std_SUITE.erl
+%% Created : 2009-06-01
+%%----------------------------------------------------------------------
+-module(xmerl_sax_std_SUITE).
+-compile(export_all).
+
+%%----------------------------------------------------------------------
+%% Include files
+%%----------------------------------------------------------------------
+-include_lib("test_server/include/test_server.hrl").
+-include_lib("kernel/include/file.hrl").
+
+%%======================================================================
+%% External functions
+%%======================================================================
+
+%%----------------------------------------------------------------------
+%% Initializations
+%%----------------------------------------------------------------------
+
+init_per_suite(doc) ->
+ ["Starts the test suite"];
+init_per_suite(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line ok=erl_tar:extract("ibm.tgz",[compressed]),
+ ?line ok=erl_tar:extract("japanese.tgz",[compressed]),
+ ?line ok=erl_tar:extract("oasis.tgz",[compressed]),
+ ?line ok=erl_tar:extract("sun.tgz",[compressed]),
+ ?line ok=erl_tar:extract("xmltest.tgz",[compressed]),
+ ?line ok = change_mode(["ibm","japanese","oasis",
+ "sun","xmltest"]),
+ Config.
+
+-ifndef(dont_rm_test_dirs).
+
+end_per_suite(doc) ->
+ ["Stops the test suite"];
+end_per_suite(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line ok=rm_files(["ibm","japanese","oasis","sun","xmltest"]),
+ Config.
+
+-else.
+
+end_per_suite(doc) ->
+ ["Stops the test suite"];
+end_per_suite(Config) ->
+ Config.
+
+-endif.
+
+%% initialization before each testcase
+init_per_testcase(_TestCase,Config) ->
+ io:format("Config:\n~p\n",[Config]),
+ ?line {ok, _} = file:read_file_info(filename:join([?config(priv_dir,Config)])),
+ ?line code:add_patha(?config(priv_dir,Config)),
+% Dog=test_server:timetrap({minutes,10}),
+% [{watchdog, Dog}|Config].
+ Config.
+
+%% clean up after each testcase
+end_per_testcase(_Func,_Config) ->
+% Dog=?config(watchdog, Config),
+% test_server:timetrap_cancel(Dog),
+ ok.
+
+%%----------------------------------------------------------------------
+%% Tests
+%%----------------------------------------------------------------------
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/001.xml
+%% ID: not-wf-sa-001
+%% Type: not-wf
+%% Sections: 3.1 [41]
+'not-wf-sa-001'(suite) -> [];
+'not-wf-sa-001'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/001.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/002.xml
+%% ID: not-wf-sa-002
+%% Type: not-wf
+%% Sections: 2.3 [4]
+'not-wf-sa-002'(suite) -> [];
+'not-wf-sa-002'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/002.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/003.xml
+%% ID: not-wf-sa-003
+%% Type: not-wf
+%% Sections: 2.6 [16]
+'not-wf-sa-003'(suite) -> [];
+'not-wf-sa-003'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/003.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/004.xml
+%% ID: not-wf-sa-004
+%% Type: not-wf
+%% Sections: 2.6 [16]
+'not-wf-sa-004'(suite) -> [];
+'not-wf-sa-004'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/004.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/005.xml
+%% ID: not-wf-sa-005
+%% Type: not-wf
+%% Sections: 2.6 [16]
+'not-wf-sa-005'(suite) -> [];
+'not-wf-sa-005'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/005.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/006.xml
+%% ID: not-wf-sa-006
+%% Type: not-wf
+%% Sections: 2.5 [16]
+'not-wf-sa-006'(suite) -> [];
+'not-wf-sa-006'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/006.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/007.xml
+%% ID: not-wf-sa-007
+%% Type: not-wf
+%% Sections: 4.1 [68]
+'not-wf-sa-007'(suite) -> [];
+'not-wf-sa-007'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/007.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/008.xml
+%% ID: not-wf-sa-008
+%% Type: not-wf
+%% Sections: 2.3 [5]
+'not-wf-sa-008'(suite) -> [];
+'not-wf-sa-008'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/008.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/009.xml
+%% ID: not-wf-sa-009
+%% Type: not-wf
+%% Sections: 4.1 [66]
+'not-wf-sa-009'(suite) -> [];
+'not-wf-sa-009'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/009.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/010.xml
+%% ID: not-wf-sa-010
+%% Type: not-wf
+%% Sections: 4.1 [68]
+'not-wf-sa-010'(suite) -> [];
+'not-wf-sa-010'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/010.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/011.xml
+%% ID: not-wf-sa-011
+%% Type: not-wf
+%% Sections: 3.1 [41]
+'not-wf-sa-011'(suite) -> [];
+'not-wf-sa-011'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/011.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/012.xml
+%% ID: not-wf-sa-012
+%% Type: not-wf
+%% Sections: 2.3 [10]
+'not-wf-sa-012'(suite) -> [];
+'not-wf-sa-012'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/012.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/013.xml
+%% ID: not-wf-sa-013
+%% Type: not-wf
+%% Sections: 2.3 [10]
+'not-wf-sa-013'(suite) -> [];
+'not-wf-sa-013'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/013.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/014.xml
+%% ID: not-wf-sa-014
+%% Type: not-wf
+%% Sections: 2.3 [10]
+'not-wf-sa-014'(suite) -> [];
+'not-wf-sa-014'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/014.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/015.xml
+%% ID: not-wf-sa-015
+%% Type: not-wf
+%% Sections: 3.1 [41]
+'not-wf-sa-015'(suite) -> [];
+'not-wf-sa-015'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/015.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/016.xml
+%% ID: not-wf-sa-016
+%% Type: not-wf
+%% Sections: 3.1 [41]
+'not-wf-sa-016'(suite) -> [];
+'not-wf-sa-016'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/016.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/017.xml
+%% ID: not-wf-sa-017
+%% Type: not-wf
+%% Sections: 2.7 [18]
+'not-wf-sa-017'(suite) -> [];
+'not-wf-sa-017'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/017.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/018.xml
+%% ID: not-wf-sa-018
+%% Type: not-wf
+%% Sections: 2.7 [19]
+'not-wf-sa-018'(suite) -> [];
+'not-wf-sa-018'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/018.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/019.xml
+%% ID: not-wf-sa-019
+%% Type: not-wf
+%% Sections: 3.1 [42]
+'not-wf-sa-019'(suite) -> [];
+'not-wf-sa-019'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/019.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/020.xml
+%% ID: not-wf-sa-020
+%% Type: not-wf
+%% Sections: 2.3 [10]
+'not-wf-sa-020'(suite) -> [];
+'not-wf-sa-020'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/020.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/021.xml
+%% ID: not-wf-sa-021
+%% Type: not-wf
+%% Sections: 2.3 [10]
+'not-wf-sa-021'(suite) -> [];
+'not-wf-sa-021'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/021.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/022.xml
+%% ID: not-wf-sa-022
+%% Type: not-wf
+%% Sections: 4.1 [66]
+'not-wf-sa-022'(suite) -> [];
+'not-wf-sa-022'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/022.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/023.xml
+%% ID: not-wf-sa-023
+%% Type: not-wf
+%% Sections: 2.3 [5]
+'not-wf-sa-023'(suite) -> [];
+'not-wf-sa-023'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/023.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/024.xml
+%% ID: not-wf-sa-024
+%% Type: not-wf
+%% Sections: 2.3 [5]
+'not-wf-sa-024'(suite) -> [];
+'not-wf-sa-024'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/024.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/025.xml
+%% ID: not-wf-sa-025
+%% Type: not-wf
+%% Sections: 2.4 [14]
+'not-wf-sa-025'(suite) -> [];
+'not-wf-sa-025'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/025.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/026.xml
+%% ID: not-wf-sa-026
+%% Type: not-wf
+%% Sections: 2.4 [14]
+'not-wf-sa-026'(suite) -> [];
+'not-wf-sa-026'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/026.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/027.xml
+%% ID: not-wf-sa-027
+%% Type: not-wf
+%% Sections: 2.5 [15]
+'not-wf-sa-027'(suite) -> [];
+'not-wf-sa-027'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/027.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/028.xml
+%% ID: not-wf-sa-028
+%% Type: not-wf
+%% Sections: 2.6 [16]
+'not-wf-sa-028'(suite) -> [];
+'not-wf-sa-028'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/028.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/029.xml
+%% ID: not-wf-sa-029
+%% Type: not-wf
+%% Sections: 2.4 [14]
+'not-wf-sa-029'(suite) -> [];
+'not-wf-sa-029'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/029.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/030.xml
+%% ID: not-wf-sa-030
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'not-wf-sa-030'(suite) -> [];
+'not-wf-sa-030'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/030.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/031.xml
+%% ID: not-wf-sa-031
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'not-wf-sa-031'(suite) -> [];
+'not-wf-sa-031'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/031.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/032.xml
+%% ID: not-wf-sa-032
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'not-wf-sa-032'(suite) -> [];
+'not-wf-sa-032'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/032.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/033.xml
+%% ID: not-wf-sa-033
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'not-wf-sa-033'(suite) -> [];
+'not-wf-sa-033'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/033.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/034.xml
+%% ID: not-wf-sa-034
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'not-wf-sa-034'(suite) -> [];
+'not-wf-sa-034'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/034.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/035.xml
+%% ID: not-wf-sa-035
+%% Type: not-wf
+%% Sections: 3.1 [43]
+'not-wf-sa-035'(suite) -> [];
+'not-wf-sa-035'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/035.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/036.xml
+%% ID: not-wf-sa-036
+%% Type: not-wf
+%% Sections: 2.8 [27]
+'not-wf-sa-036'(suite) -> [];
+'not-wf-sa-036'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/036.xml"]),
+ %% Special case becase we returns everything after a legal document
+ %% as an rest instead of giving and error to let the user handle
+ %% multipple docs on a stream.
+ ?line {ok,_,<<"Illegal data\r\n">>} = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]).
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/037.xml
+%% ID: not-wf-sa-037
+%% Type: not-wf
+%% Sections: 2.8 [27]
+'not-wf-sa-037'(suite) -> [];
+'not-wf-sa-037'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/037.xml"]),
+ %% Special case becase we returns everything after a legal document
+ %% as an rest instead of giving and error to let the user handle
+ %% multipple docs on a stream.
+ ?line {ok,_,<<"&#32;\r\n">>} = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]).
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/038.xml
+%% ID: not-wf-sa-038
+%% Type: not-wf
+%% Sections: 3.1
+'not-wf-sa-038'(suite) -> [];
+'not-wf-sa-038'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/038.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/039.xml
+%% ID: not-wf-sa-039
+%% Type: not-wf
+%% Sections: 3
+'not-wf-sa-039'(suite) -> [];
+'not-wf-sa-039'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/039.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/040.xml
+%% ID: not-wf-sa-040
+%% Type: not-wf
+%% Sections: 2.8 [27]
+'not-wf-sa-040'(suite) -> [];
+'not-wf-sa-040'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/040.xml"]),
+ %% Special case becase we returns everything after a legal document
+ %% as an rest instead of giving and error to let the user handle
+ %% multipple docs on a stream.
+ ?line {ok,_,<<"<doc></doc>\r\n">>} = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]).
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/041.xml
+%% ID: not-wf-sa-041
+%% Type: not-wf
+%% Sections: 2.8 [27]
+'not-wf-sa-041'(suite) -> [];
+'not-wf-sa-041'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/041.xml"]),
+ %% Special case becase we returns everything after a legal document
+ %% as an rest instead of giving and error to let the user handle
+ %% multipple docs on a stream.
+ ?line {ok,_,<<"<doc></doc>\r\n">>} = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]).
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/042.xml
+%% ID: not-wf-sa-042
+%% Type: not-wf
+%% Sections: 3.1 [42]
+'not-wf-sa-042'(suite) -> [];
+'not-wf-sa-042'(Config) -> {skip, "Fix 1"}.
+ %%?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ %%?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/042.xml"]),
+ %%?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/043.xml
+%% ID: not-wf-sa-043
+%% Type: not-wf
+%% Sections: 2.8 [27]
+'not-wf-sa-043'(suite) -> [];
+'not-wf-sa-043'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/043.xml"]),
+ %% Special case becase we returns everything after a legal document
+ %% as an rest instead of giving and error to let the user handle
+ %% multipple docs on a stream.
+ ?line {ok,_,<<"Illegal data\r\n">>} = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]).
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/044.xml
+%% ID: not-wf-sa-044
+%% Type: not-wf
+%% Sections: 2.8 [27]
+'not-wf-sa-044'(suite) -> [];
+'not-wf-sa-044'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/044.xml"]),
+ %% Special case becase we returns everything after a legal document
+ %% as an rest instead of giving and error to let the user handle
+ %% multipple docs on a stream.
+ ?line {ok,_,<<"<doc/>\r\n">>} = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]).
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/045.xml
+%% ID: not-wf-sa-045
+%% Type: not-wf
+%% Sections: 3.1 [44]
+'not-wf-sa-045'(suite) -> [];
+'not-wf-sa-045'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/045.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/046.xml
+%% ID: not-wf-sa-046
+%% Type: not-wf
+%% Sections: 3.1 [40]
+'not-wf-sa-046'(suite) -> [];
+'not-wf-sa-046'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/046.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/047.xml
+%% ID: not-wf-sa-047
+%% Type: not-wf
+%% Sections: 3.1 [44]
+'not-wf-sa-047'(suite) -> [];
+'not-wf-sa-047'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/047.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/048.xml
+%% ID: not-wf-sa-048
+%% Type: not-wf
+%% Sections: 2.8 [27]
+'not-wf-sa-048'(suite) -> [];
+'not-wf-sa-048'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/048.xml"]),
+ %% Special case becase we returns everything after a legal document
+ %% as an rest instead of giving and error to let the user handle
+ %% multipple docs on a stream.
+ ?line {ok,_,<<"<![CDATA[]]>\r\n">>} = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]).
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/049.xml
+%% ID: not-wf-sa-049
+%% Type: not-wf
+%% Sections: 3.1 [40]
+'not-wf-sa-049'(suite) -> [];
+'not-wf-sa-049'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/049.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/050.xml
+%% ID: not-wf-sa-050
+%% Type: not-wf
+%% Sections: 2.1 [1]
+'not-wf-sa-050'(suite) -> [];
+'not-wf-sa-050'(Config) -> {skip, "Fix 3"}.
+ %%?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ %%?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/050.xml"]),
+ %%?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/051.xml
+%% ID: not-wf-sa-051
+%% Type: not-wf
+%% Sections: 2.7 [18]
+'not-wf-sa-051'(suite) -> [];
+'not-wf-sa-051'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/051.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/052.xml
+%% ID: not-wf-sa-052
+%% Type: not-wf
+%% Sections: 4.1 [66]
+'not-wf-sa-052'(suite) -> [];
+'not-wf-sa-052'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/052.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/053.xml
+%% ID: not-wf-sa-053
+%% Type: not-wf
+%% Sections: 3.1 [42]
+'not-wf-sa-053'(suite) -> [];
+'not-wf-sa-053'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/053.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/054.xml
+%% ID: not-wf-sa-054
+%% Type: not-wf
+%% Sections: 4.2.2 [75]
+'not-wf-sa-054'(suite) -> [];
+'not-wf-sa-054'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/054.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/055.xml
+%% ID: not-wf-sa-055
+%% Type: not-wf
+%% Sections: 2.8 [28]
+'not-wf-sa-055'(suite) -> [];
+'not-wf-sa-055'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/055.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/056.xml
+%% ID: not-wf-sa-056
+%% Type: not-wf
+%% Sections: 2.8 [28]
+'not-wf-sa-056'(suite) -> [];
+'not-wf-sa-056'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/056.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/057.xml
+%% ID: not-wf-sa-057
+%% Type: not-wf
+%% Sections: 3.2 [45]
+'not-wf-sa-057'(suite) -> [];
+'not-wf-sa-057'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/057.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/058.xml
+%% ID: not-wf-sa-058
+%% Type: not-wf
+%% Sections: 3.3.1 [54]
+'not-wf-sa-058'(suite) -> [];
+'not-wf-sa-058'(_Config) -> {skip, "Attlist Notation parsing NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/058.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/059.xml
+%% ID: not-wf-sa-059
+%% Type: not-wf
+%% Sections: 3.3.1 [59]
+'not-wf-sa-059'(suite) -> [];
+'not-wf-sa-059'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/059.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/060.xml
+%% ID: not-wf-sa-060
+%% Type: not-wf
+%% Sections: 3.3.1 [56]
+'not-wf-sa-060'(suite) -> [];
+'not-wf-sa-060'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/060.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/061.xml
+%% ID: not-wf-sa-061
+%% Type: not-wf
+%% Sections: 4.2.2 [75]
+'not-wf-sa-061'(suite) -> [];
+'not-wf-sa-061'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/061.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/062.xml
+%% ID: not-wf-sa-062
+%% Type: not-wf
+%% Sections: 4.2 [71]
+'not-wf-sa-062'(suite) -> [];
+'not-wf-sa-062'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/062.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/063.xml
+%% ID: not-wf-sa-063
+%% Type: not-wf
+%% Sections: 2.8 [29]
+'not-wf-sa-063'(suite) -> [];
+'not-wf-sa-063'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/063.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/064.xml
+%% ID: not-wf-sa-064
+%% Type: not-wf
+%% Sections: 3.3 [53]
+'not-wf-sa-064'(suite) -> [];
+'not-wf-sa-064'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/064.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/065.xml
+%% ID: not-wf-sa-065
+%% Type: not-wf
+%% Sections: 3.3 [53]
+'not-wf-sa-065'(suite) -> [];
+'not-wf-sa-065'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/065.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/066.xml
+%% ID: not-wf-sa-066
+%% Type: not-wf
+%% Sections: 3.3 [52]
+'not-wf-sa-066'(suite) -> [];
+'not-wf-sa-066'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/066.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/067.xml
+%% ID: not-wf-sa-067
+%% Type: not-wf
+%% Sections: 3.3 [53]
+'not-wf-sa-067'(suite) -> [];
+'not-wf-sa-067'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/067.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/068.xml
+%% ID: not-wf-sa-068
+%% Type: not-wf
+%% Sections: 3.3.1 [58]
+'not-wf-sa-068'(suite) -> [];
+'not-wf-sa-068'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/068.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/069.xml
+%% ID: not-wf-sa-069
+%% Type: not-wf
+%% Sections: 4.2.2 [76]
+'not-wf-sa-069'(suite) -> [];
+'not-wf-sa-069'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/069.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/070.xml
+%% ID: not-wf-sa-070
+%% Type: not-wf
+%% Sections: 2.5 [16]
+'not-wf-sa-070'(suite) -> [];
+'not-wf-sa-070'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/070.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/071.xml
+%% ID: not-wf-sa-071
+%% Type: not-wf
+%% Sections: 4.1 [68]
+'not-wf-sa-071'(suite) -> [];
+'not-wf-sa-071'(_Config) -> {skip, "No loop detection yet"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/071.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/072.xml
+%% ID: not-wf-sa-072
+%% Type: not-wf
+%% Sections: 4.1 [68]
+'not-wf-sa-072'(suite) -> [];
+'not-wf-sa-072'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/072.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/073.xml
+%% ID: not-wf-sa-073
+%% Type: not-wf
+%% Sections: 4.1 [68]
+'not-wf-sa-073'(suite) -> [];
+'not-wf-sa-073'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/073.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/074.xml
+%% ID: not-wf-sa-074
+%% Type: not-wf
+%% Sections: 4.3.2
+'not-wf-sa-074'(suite) -> [];
+'not-wf-sa-074'(_Config) -> {skip, "Entity not correct tag pair NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/074.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/075.xml
+%% ID: not-wf-sa-075
+%% Type: not-wf
+%% Sections: 4.1 [68]
+'not-wf-sa-075'(suite) -> [];
+'not-wf-sa-075'(_Config) -> {skip, "No loop detection yet"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/075.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/076.xml
+%% ID: not-wf-sa-076
+%% Type: not-wf
+%% Sections: 4.1 [68]
+'not-wf-sa-076'(suite) -> [];
+'not-wf-sa-076'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/076.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/077.xml
+%% ID: not-wf-sa-077
+%% Type: not-wf
+%% Sections: 41. [68]
+'not-wf-sa-077'(suite) -> [];
+'not-wf-sa-077'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/077.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/078.xml
+%% ID: not-wf-sa-078
+%% Type: not-wf
+%% Sections: 4.1 [68]
+'not-wf-sa-078'(suite) -> [];
+'not-wf-sa-078'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/078.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/079.xml
+%% ID: not-wf-sa-079
+%% Type: not-wf
+%% Sections: 4.1 [68]
+'not-wf-sa-079'(suite) -> [];
+'not-wf-sa-079'(_Config) -> {skip, "No loop detection yet"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/079.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/080.xml
+%% ID: not-wf-sa-080
+%% Type: not-wf
+%% Sections: 4.1 [68]
+'not-wf-sa-080'(suite) -> [];
+'not-wf-sa-080'(_Config) -> {skip, "No loop detection yet"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/080.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/081.xml
+%% ID: not-wf-sa-081
+%% Type: not-wf
+%% Sections: 3.1
+'not-wf-sa-081'(suite) -> [];
+'not-wf-sa-081'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/081.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/082.xml
+%% ID: not-wf-sa-082
+%% Type: not-wf
+%% Sections: 3.1
+'not-wf-sa-082'(suite) -> [];
+'not-wf-sa-082'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/082.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/083.xml
+%% ID: not-wf-sa-083
+%% Type: not-wf
+%% Sections: 4.2.2 [76]
+'not-wf-sa-083'(suite) -> [];
+'not-wf-sa-083'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/083.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/084.xml
+%% ID: not-wf-sa-084
+%% Type: not-wf
+%% Sections: 4.1
+'not-wf-sa-084'(suite) -> [];
+'not-wf-sa-084'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/084.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/085.xml
+%% ID: not-wf-sa-085
+%% Type: not-wf
+%% Sections: 2.3 [13]
+'not-wf-sa-085'(suite) -> [];
+'not-wf-sa-085'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/085.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/086.xml
+%% ID: not-wf-sa-086
+%% Type: not-wf
+%% Sections: 2.3 [13]
+'not-wf-sa-086'(suite) -> [];
+'not-wf-sa-086'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/086.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/087.xml
+%% ID: not-wf-sa-087
+%% Type: not-wf
+%% Sections: 2.3 [13]
+'not-wf-sa-087'(suite) -> [];
+'not-wf-sa-087'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/087.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/088.xml
+%% ID: not-wf-sa-088
+%% Type: not-wf
+%% Sections: 2.3 [10]
+'not-wf-sa-088'(suite) -> [];
+'not-wf-sa-088'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/088.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/089.xml
+%% ID: not-wf-sa-089
+%% Type: not-wf
+%% Sections: 4.2 [74]
+'not-wf-sa-089'(suite) -> [];
+'not-wf-sa-089'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/089.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/090.xml
+%% ID: not-wf-sa-090
+%% Type: not-wf
+%% Sections: 2.3 [10]
+'not-wf-sa-090'(suite) -> [];
+'not-wf-sa-090'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/090.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/091.xml
+%% ID: not-wf-sa-091
+%% Type: not-wf
+%% Sections: 4.2 [74]
+'not-wf-sa-091'(suite) -> [];
+'not-wf-sa-091'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/091.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/092.xml
+%% ID: not-wf-sa-092
+%% Type: not-wf
+%% Sections: 4.5
+'not-wf-sa-092'(suite) -> [];
+'not-wf-sa-092'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/092.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/093.xml
+%% ID: not-wf-sa-093
+%% Type: not-wf
+%% Sections: 4.1 [66]
+'not-wf-sa-093'(suite) -> [];
+'not-wf-sa-093'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/093.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/094.xml
+%% ID: not-wf-sa-094
+%% Type: not-wf
+%% Sections: 2.8 [24]
+'not-wf-sa-094'(suite) -> [];
+'not-wf-sa-094'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/094.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/095.xml
+%% ID: not-wf-sa-095
+%% Type: not-wf
+%% Sections: 2.8 [23]
+'not-wf-sa-095'(suite) -> [];
+'not-wf-sa-095'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/095.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/096.xml
+%% ID: not-wf-sa-096
+%% Type: not-wf
+%% Sections: 2.9 [32]
+'not-wf-sa-096'(suite) -> [];
+'not-wf-sa-096'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/096.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/097.xml
+%% ID: not-wf-sa-097
+%% Type: not-wf
+%% Sections: 2.8 [24]
+'not-wf-sa-097'(suite) -> [];
+'not-wf-sa-097'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/097.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/098.xml
+%% ID: not-wf-sa-098
+%% Type: not-wf
+%% Sections: 2.8 [23]
+'not-wf-sa-098'(suite) -> [];
+'not-wf-sa-098'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/098.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/099.xml
+%% ID: not-wf-sa-099
+%% Type: not-wf
+%% Sections: 2.8 [23]
+'not-wf-sa-099'(suite) -> [];
+'not-wf-sa-099'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/099.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/100.xml
+%% ID: not-wf-sa-100
+%% Type: not-wf
+%% Sections: 2.9 [32]
+'not-wf-sa-100'(suite) -> [];
+'not-wf-sa-100'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/100.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/101.xml
+%% ID: not-wf-sa-101
+%% Type: not-wf
+%% Sections: 4.3.3 [81]
+'not-wf-sa-101'(suite) -> [];
+'not-wf-sa-101'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/101.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/102.xml
+%% ID: not-wf-sa-102
+%% Type: not-wf
+%% Sections: 2.8 [26]
+'not-wf-sa-102'(suite) -> [];
+'not-wf-sa-102'(Config) -> {skip, "Fix 2"}.
+ %%?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ %%?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/102.xml"]),
+ %%?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/103.xml
+%% ID: not-wf-sa-103
+%% Type: not-wf
+%% Sections: 4.3.2
+'not-wf-sa-103'(suite) -> [];
+'not-wf-sa-103'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/103.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/104.xml
+%% ID: not-wf-sa-104
+%% Type: not-wf
+%% Sections: 4.3.2
+'not-wf-sa-104'(suite) -> [];
+'not-wf-sa-104'(_Config) -> {skip, "Entity not correct tag pair NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/104.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/105.xml
+%% ID: not-wf-sa-105
+%% Type: not-wf
+%% Sections: 2.7
+'not-wf-sa-105'(suite) -> [];
+'not-wf-sa-105'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/105.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/106.xml
+%% ID: not-wf-sa-106
+%% Type: not-wf
+%% Sections: 4.2
+'not-wf-sa-106'(suite) -> [];
+'not-wf-sa-106'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/106.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/107.xml
+%% ID: not-wf-sa-107
+%% Type: not-wf
+%% Sections: 2.8 [28]
+'not-wf-sa-107'(suite) -> [];
+'not-wf-sa-107'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/107.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/108.xml
+%% ID: not-wf-sa-108
+%% Type: not-wf
+%% Sections: 2.7 [19]
+'not-wf-sa-108'(suite) -> [];
+'not-wf-sa-108'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/108.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/109.xml
+%% ID: not-wf-sa-109
+%% Type: not-wf
+%% Sections: 4.2 [70]
+'not-wf-sa-109'(suite) -> [];
+'not-wf-sa-109'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/109.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/110.xml
+%% ID: not-wf-sa-110
+%% Type: not-wf
+%% Sections: 4.1 [68]
+'not-wf-sa-110'(suite) -> [];
+'not-wf-sa-110'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/110.xml"]),
+ %% Special case becase we returns everything after a legal document
+ %% as an rest instead of giving and error to let the user handle
+ %% multipple docs on a stream.
+ ?line {ok,_,<<"&e;\r\n">>} = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]).
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/111.xml
+%% ID: not-wf-sa-111
+%% Type: not-wf
+%% Sections: 3.1 [43]
+'not-wf-sa-111'(suite) -> [];
+'not-wf-sa-111'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/111.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/112.xml
+%% ID: not-wf-sa-112
+%% Type: not-wf
+%% Sections: 2.7 [19]
+'not-wf-sa-112'(suite) -> [];
+'not-wf-sa-112'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/112.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/113.xml
+%% ID: not-wf-sa-113
+%% Type: not-wf
+%% Sections: 2.3 [9]
+'not-wf-sa-113'(suite) -> [];
+'not-wf-sa-113'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/113.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/114.xml
+%% ID: not-wf-sa-114
+%% Type: not-wf
+%% Sections: 2.3 [9]
+'not-wf-sa-114'(suite) -> [];
+'not-wf-sa-114'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/114.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/115.xml
+%% ID: not-wf-sa-115
+%% Type: not-wf
+%% Sections: 4.5
+'not-wf-sa-115'(suite) -> [];
+'not-wf-sa-115'(_Config) -> {skip, "& expansion not correct"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/115.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/116.xml
+%% ID: not-wf-sa-116
+%% Type: not-wf
+%% Sections: 4.3.2
+'not-wf-sa-116'(suite) -> [];
+'not-wf-sa-116'(_Config) -> {skip, "& expansion not correct"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/116.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/117.xml
+%% ID: not-wf-sa-117
+%% Type: not-wf
+%% Sections: 4.3.2
+'not-wf-sa-117'(suite) -> [];
+'not-wf-sa-117'(_Config) -> {skip, "& expansion not correct"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/117.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/118.xml
+%% ID: not-wf-sa-118
+%% Type: not-wf
+%% Sections: 4.1 [68]
+'not-wf-sa-118'(suite) -> [];
+'not-wf-sa-118'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/118.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/119.xml
+%% ID: not-wf-sa-119
+%% Type: not-wf
+%% Sections: 4.3.2
+'not-wf-sa-119'(suite) -> [];
+'not-wf-sa-119'(_Config) -> {skip, "& expansion not correct"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/119.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/120.xml
+%% ID: not-wf-sa-120
+%% Type: not-wf
+%% Sections: 4.5
+'not-wf-sa-120'(suite) -> [];
+'not-wf-sa-120'(_Config) -> {skip, "& expansion not correct"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/120.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/121.xml
+%% ID: not-wf-sa-121
+%% Type: not-wf
+%% Sections: 4.1 [68]
+'not-wf-sa-121'(suite) -> [];
+'not-wf-sa-121'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/121.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/122.xml
+%% ID: not-wf-sa-122
+%% Type: not-wf
+%% Sections: 3.2.1 [47]
+'not-wf-sa-122'(suite) -> [];
+'not-wf-sa-122'(_Config) -> {skip, "DTD element content parsing NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/122.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/123.xml
+%% ID: not-wf-sa-123
+%% Type: not-wf
+%% Sections: 3.2.1 [48]
+'not-wf-sa-123'(suite) -> [];
+'not-wf-sa-123'(_Config) -> {skip, "DTD element content parsing NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/123.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/124.xml
+%% ID: not-wf-sa-124
+%% Type: not-wf
+%% Sections: 3.2.2 [51]
+'not-wf-sa-124'(suite) -> [];
+'not-wf-sa-124'(_Config) -> {skip, "DTD element content parsing NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/124.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/125.xml
+%% ID: not-wf-sa-125
+%% Type: not-wf
+%% Sections: 3.2.2 [51]
+'not-wf-sa-125'(suite) -> [];
+'not-wf-sa-125'(_Config) -> {skip, "DTD element content parsing NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/125.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/126.xml
+%% ID: not-wf-sa-126
+%% Type: not-wf
+%% Sections: 3.2.2 [51]
+'not-wf-sa-126'(suite) -> [];
+'not-wf-sa-126'(_Config) -> {skip, "DTD element content parsing NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/126.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/127.xml
+%% ID: not-wf-sa-127
+%% Type: not-wf
+%% Sections: 3.2.2 [51]
+'not-wf-sa-127'(suite) -> [];
+'not-wf-sa-127'(_Config) -> {skip, "DTD element content parsing NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/127.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/128.xml
+%% ID: not-wf-sa-128
+%% Type: not-wf
+%% Sections: 2.7 [18]
+'not-wf-sa-128'(suite) -> [];
+'not-wf-sa-128'(_Config) -> {skip, "DTD element content parsing NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/128.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/129.xml
+%% ID: not-wf-sa-129
+%% Type: not-wf
+%% Sections: 3.2 [45]
+'not-wf-sa-129'(suite) -> [];
+'not-wf-sa-129'(_Config) -> {skip, "DTD element content parsing NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/129.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/130.xml
+%% ID: not-wf-sa-130
+%% Type: not-wf
+%% Sections: 3.2 [45]
+'not-wf-sa-130'(suite) -> [];
+'not-wf-sa-130'(_Config) -> {skip, "DTD element content parsing NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/130.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/131.xml
+%% ID: not-wf-sa-131
+%% Type: not-wf
+%% Sections: 3.2 [45]
+'not-wf-sa-131'(suite) -> [];
+'not-wf-sa-131'(_Config) -> {skip, "DTD element content parsing NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/131.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/132.xml
+%% ID: not-wf-sa-132
+%% Type: not-wf
+%% Sections: 3.2.1 [50]
+'not-wf-sa-132'(suite) -> [];
+'not-wf-sa-132'(_Config) -> {skip, "DTD element content parsing NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/132.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/133.xml
+%% ID: not-wf-sa-133
+%% Type: not-wf
+%% Sections: 3.2.1
+'not-wf-sa-133'(suite) -> [];
+'not-wf-sa-133'(_Config) -> {skip, "DTD element content parsing NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/133.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/134.xml
+%% ID: not-wf-sa-134
+%% Type: not-wf
+%% Sections: 3.2.1
+'not-wf-sa-134'(suite) -> [];
+'not-wf-sa-134'(_Config) -> {skip, "DTD element content parsing NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/134.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/135.xml
+%% ID: not-wf-sa-135
+%% Type: not-wf
+%% Sections: 3.2.1 [47]
+'not-wf-sa-135'(suite) -> [];
+'not-wf-sa-135'(_Config) -> {skip, "DTD element content parsing NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/135.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/136.xml
+%% ID: not-wf-sa-136
+%% Type: not-wf
+%% Sections: 3.2 [45]
+'not-wf-sa-136'(suite) -> [];
+'not-wf-sa-136'(_Config) -> {skip, "DTD element content parsing NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/136.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/137.xml
+%% ID: not-wf-sa-137
+%% Type: not-wf
+%% Sections: 3.2 [45]
+'not-wf-sa-137'(suite) -> [];
+'not-wf-sa-137'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/137.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/138.xml
+%% ID: not-wf-sa-138
+%% Type: not-wf
+%% Sections: 3.2.1 [48]
+'not-wf-sa-138'(suite) -> [];
+'not-wf-sa-138'(_Config) -> {skip, "DTD element content parsing NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/138.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/139.xml
+%% ID: not-wf-sa-139
+%% Type: not-wf
+%% Sections: 3.2.1 [46]
+'not-wf-sa-139'(suite) -> [];
+'not-wf-sa-139'(_Config) -> {skip, "DTD element content parsing NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/139.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/140.xml
+%% ID: not-wf-sa-140
+%% Type: not-wf
+%% Sections: 2.3 [4]
+'not-wf-sa-140'(suite) -> [];
+'not-wf-sa-140'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/140.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/141.xml
+%% ID: not-wf-sa-141
+%% Type: not-wf
+%% Sections: 2.3 [5]
+'not-wf-sa-141'(suite) -> [];
+'not-wf-sa-141'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/141.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/142.xml
+%% ID: not-wf-sa-142
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'not-wf-sa-142'(suite) -> [];
+'not-wf-sa-142'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/142.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/143.xml
+%% ID: not-wf-sa-143
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'not-wf-sa-143'(suite) -> [];
+'not-wf-sa-143'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/143.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/144.xml
+%% ID: not-wf-sa-144
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'not-wf-sa-144'(suite) -> [];
+'not-wf-sa-144'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/144.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/145.xml
+%% ID: not-wf-sa-145
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'not-wf-sa-145'(suite) -> [];
+'not-wf-sa-145'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/145.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/146.xml
+%% ID: not-wf-sa-146
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'not-wf-sa-146'(suite) -> [];
+'not-wf-sa-146'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/146.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/147.xml
+%% ID: not-wf-sa-147
+%% Type: not-wf
+%% Sections: 2.8 [22]
+'not-wf-sa-147'(suite) -> [];
+'not-wf-sa-147'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/147.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/148.xml
+%% ID: not-wf-sa-148
+%% Type: not-wf
+%% Sections: 2.8 [22]
+'not-wf-sa-148'(suite) -> [];
+'not-wf-sa-148'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/148.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/149.xml
+%% ID: not-wf-sa-149
+%% Type: not-wf
+%% Sections: 2.8 [28]
+'not-wf-sa-149'(suite) -> [];
+'not-wf-sa-149'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/149.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/150.xml
+%% ID: not-wf-sa-150
+%% Type: not-wf
+%% Sections: 3.1 [43]
+'not-wf-sa-150'(suite) -> [];
+'not-wf-sa-150'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/150.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/151.xml
+%% ID: not-wf-sa-151
+%% Type: not-wf
+%% Sections: 2.8 [27]
+'not-wf-sa-151'(suite) -> [];
+'not-wf-sa-151'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/151.xml"]),
+ %% Special case becase we returns everything after a legal document
+ %% as an rest instead of giving and error to let the user handle
+ %% multipple docs on a stream.
+ ?line {ok,_,<<"xml version=\"1.0\"?>\r\n">>} = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]).
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/152.xml
+%% ID: not-wf-sa-152
+%% Type: not-wf
+%% Sections: 2.8 [22]
+'not-wf-sa-152'(suite) -> [];
+'not-wf-sa-152'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/152.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/153.xml
+%% ID: not-wf-sa-153
+%% Type: not-wf
+%% Sections: 4.3.2
+'not-wf-sa-153'(suite) -> [];
+'not-wf-sa-153'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/153.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/154.xml
+%% ID: not-wf-sa-154
+%% Type: not-wf
+%% Sections: 2.8 2.6 [23, 17]
+'not-wf-sa-154'(suite) -> [];
+'not-wf-sa-154'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/154.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/155.xml
+%% ID: not-wf-sa-155
+%% Type: not-wf
+%% Sections: 2.8 2.6 [23, 17]
+'not-wf-sa-155'(suite) -> [];
+'not-wf-sa-155'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/155.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/156.xml
+%% ID: not-wf-sa-156
+%% Type: not-wf
+%% Sections: 2.8 2.6 [23, 17]
+'not-wf-sa-156'(suite) -> [];
+'not-wf-sa-156'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/156.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/157.xml
+%% ID: not-wf-sa-157
+%% Type: not-wf
+%% Sections: 2.6 [17]
+'not-wf-sa-157'(suite) -> [];
+'not-wf-sa-157'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/157.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/158.xml
+%% ID: not-wf-sa-158
+%% Type: not-wf
+%% Sections: 3.3 [52]
+'not-wf-sa-158'(suite) -> [];
+'not-wf-sa-158'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/158.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/159.xml
+%% ID: not-wf-sa-159
+%% Type: not-wf
+%% Sections: 2.3 [9]
+'not-wf-sa-159'(suite) -> [];
+'not-wf-sa-159'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/159.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/160.xml
+%% ID: not-wf-sa-160
+%% Type: not-wf
+%% Sections: 2.8
+'not-wf-sa-160'(suite) -> [];
+'not-wf-sa-160'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/160.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/161.xml
+%% ID: not-wf-sa-161
+%% Type: not-wf
+%% Sections: 2.8
+'not-wf-sa-161'(suite) -> [];
+'not-wf-sa-161'(_Config) -> {skip, "DTD element content parsing NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/161.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/162.xml
+%% ID: not-wf-sa-162
+%% Type: not-wf
+%% Sections: 2.8
+'not-wf-sa-162'(suite) -> [];
+'not-wf-sa-162'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/162.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/163.xml
+%% ID: not-wf-sa-163
+%% Type: not-wf
+%% Sections: 4.1 [69]
+'not-wf-sa-163'(suite) -> [];
+'not-wf-sa-163'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/163.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/164.xml
+%% ID: not-wf-sa-164
+%% Type: not-wf
+%% Sections: 4.1 [69]
+'not-wf-sa-164'(suite) -> [];
+'not-wf-sa-164'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/164.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/165.xml
+%% ID: not-wf-sa-165
+%% Type: not-wf
+%% Sections: 4.2 [72]
+'not-wf-sa-165'(suite) -> [];
+'not-wf-sa-165'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/165.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/166.xml
+%% ID: not-wf-sa-166
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'not-wf-sa-166'(suite) -> [];
+'not-wf-sa-166'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/166.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/167.xml
+%% ID: not-wf-sa-167
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'not-wf-sa-167'(suite) -> [];
+'not-wf-sa-167'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/167.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/168.xml
+%% ID: not-wf-sa-168
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'not-wf-sa-168'(suite) -> [];
+'not-wf-sa-168'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/168.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/169.xml
+%% ID: not-wf-sa-169
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'not-wf-sa-169'(suite) -> [];
+'not-wf-sa-169'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/169.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/170.xml
+%% ID: not-wf-sa-170
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'not-wf-sa-170'(suite) -> [];
+'not-wf-sa-170'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/170.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/171.xml
+%% ID: not-wf-sa-171
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'not-wf-sa-171'(suite) -> [];
+'not-wf-sa-171'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/171.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/172.xml
+%% ID: not-wf-sa-172
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'not-wf-sa-172'(suite) -> [];
+'not-wf-sa-172'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/172.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/173.xml
+%% ID: not-wf-sa-173
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'not-wf-sa-173'(suite) -> [];
+'not-wf-sa-173'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/173.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/174.xml
+%% ID: not-wf-sa-174
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'not-wf-sa-174'(suite) -> [];
+'not-wf-sa-174'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/174.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/175.xml
+%% ID: not-wf-sa-175
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'not-wf-sa-175'(suite) -> [];
+'not-wf-sa-175'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/175.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/176.xml
+%% ID: not-wf-sa-176
+%% Type: not-wf
+%% Sections: 3 [39]
+'not-wf-sa-176'(suite) -> [];
+'not-wf-sa-176'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/176.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/177.xml
+%% ID: not-wf-sa-177
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'not-wf-sa-177'(suite) -> [];
+'not-wf-sa-177'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/177.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/178.xml
+%% ID: not-wf-sa-178
+%% Type: not-wf
+%% Sections: 3.1 [41]
+'not-wf-sa-178'(suite) -> [];
+'not-wf-sa-178'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/178.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/179.xml
+%% ID: not-wf-sa-179
+%% Type: not-wf
+%% Sections: 4.1 [66]
+'not-wf-sa-179'(suite) -> [];
+'not-wf-sa-179'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/179.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/180.xml
+%% ID: not-wf-sa-180
+%% Type: not-wf
+%% Sections: 4.1
+'not-wf-sa-180'(suite) -> [];
+'not-wf-sa-180'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/180.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/181.xml
+%% ID: not-wf-sa-181
+%% Type: not-wf
+%% Sections: 4.3.2
+'not-wf-sa-181'(suite) -> [];
+'not-wf-sa-181'(_Config) -> {skip, "Entity not tag pair NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/181.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/182.xml
+%% ID: not-wf-sa-182
+%% Type: not-wf
+%% Sections: 4.3.2
+'not-wf-sa-182'(suite) -> [];
+'not-wf-sa-182'(_Config) -> {skip, "Entity not tag pair NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/182.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/183.xml
+%% ID: not-wf-sa-183
+%% Type: not-wf
+%% Sections: 3.2.2 [51]
+'not-wf-sa-183'(suite) -> [];
+'not-wf-sa-183'(_Config) -> {skip, "DTD element content parsing NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/183.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/184.xml
+%% ID: not-wf-sa-184
+%% Type: not-wf
+%% Sections: 3.2.2 [51]
+'not-wf-sa-184'(suite) -> [];
+'not-wf-sa-184'(_Config) -> {skip, "DTD element content parsing NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/184.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/185.xml
+%% ID: not-wf-sa-185
+%% Type: not-wf
+%% Sections: 4.1
+'not-wf-sa-185'(suite) -> [];
+'not-wf-sa-185'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/185.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sa/186.xml
+%% ID: not-wf-sa-186
+%% Type: not-wf
+%% Sections: 3.1 [44]
+'not-wf-sa-186'(suite) -> [];
+'not-wf-sa-186'(Config) -> {skip, "Fix 2"}.
+ %%?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ %%?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/sa/186.xml"]),
+ %%?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/not-sa/001.xml
+%% ID: not-wf-not-sa-001
+%% Type: not-wf
+%% Sections: 3.4 [62]
+'not-wf-not-sa-001'(suite) -> [];
+'not-wf-not-sa-001'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/not-sa/001.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/not-sa/002.xml
+%% ID: not-wf-not-sa-002
+%% Type: not-wf
+%% Sections: 2.6 [17]
+'not-wf-not-sa-002'(suite) -> [];
+'not-wf-not-sa-002'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/not-sa/002.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/not-sa/003.xml
+%% ID: not-wf-not-sa-003
+%% Type: not-wf
+%% Sections: 3.4 [62]
+'not-wf-not-sa-003'(suite) -> [];
+'not-wf-not-sa-003'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/not-sa/003.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/not-sa/004.xml
+%% ID: not-wf-not-sa-004
+%% Type: not-wf
+%% Sections: 3.4 [62]
+'not-wf-not-sa-004'(suite) -> [];
+'not-wf-not-sa-004'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/not-sa/004.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/not-sa/005.xml
+%% ID: not-wf-not-sa-005
+%% Type: error
+%% Sections: 4.1
+'not-wf-not-sa-005'(suite) -> [];
+'not-wf-not-sa-005'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/not-sa/005.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "error").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/not-sa/006.xml
+%% ID: not-wf-not-sa-006
+%% Type: not-wf
+%% Sections: 3.4 [62]
+'not-wf-not-sa-006'(suite) -> [];
+'not-wf-not-sa-006'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/not-sa/006.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/not-sa/007.xml
+%% ID: not-wf-not-sa-007
+%% Type: not-wf
+%% Sections: 4.3.2 [79]
+'not-wf-not-sa-007'(suite) -> [];
+'not-wf-not-sa-007'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/not-sa/007.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/not-sa/008.xml
+%% ID: not-wf-not-sa-008
+%% Type: not-wf
+%% Sections: 4.1 [69]
+'not-wf-not-sa-008'(suite) -> [];
+'not-wf-not-sa-008'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/not-sa/008.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/not-sa/009.xml
+%% ID: not-wf-not-sa-009
+%% Type: not-wf
+%% Sections: 2.8
+'not-wf-not-sa-009'(suite) -> [];
+'not-wf-not-sa-009'(_Config) -> {skip, "not a complete content in PE NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/not-sa/009.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/ext-sa/001.xml
+%% ID: not-wf-ext-sa-001
+%% Type: not-wf
+%% Sections: 4.1
+'not-wf-ext-sa-001'(suite) -> [];
+'not-wf-ext-sa-001'(Config) -> {skip, "Fix 1"}.
+ %%?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ %%?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/ext-sa/001.xml"]),
+ %%?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/ext-sa/002.xml
+%% ID: not-wf-ext-sa-002
+%% Type: not-wf
+%% Sections: 4.3.1 4.3.2 [77, 78]
+'not-wf-ext-sa-002'(suite) -> [];
+'not-wf-ext-sa-002'(Config) -> {skip, "Fix 1"}.
+ %%?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ %%?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/ext-sa/002.xml"]),
+ %%?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/ext-sa/003.xml
+%% ID: not-wf-ext-sa-003
+%% Type: not-wf
+%% Sections: 2.6 [17]
+'not-wf-ext-sa-003'(suite) -> [];
+'not-wf-ext-sa-003'(Config) -> {skip, "Fix 1"}.
+ %%?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ %%?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","not-wf/ext-sa/003.xml"]),
+ %%?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/002.xml
+%% ID: invalid--002
+%% Type: invalid
+%% Sections: 3.2.1
+'invalid--002'(suite) -> [];
+'invalid--002'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","invalid/002.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/005.xml
+%% ID: invalid--005
+%% Type: invalid
+%% Sections: 2.8
+'invalid--005'(suite) -> [];
+'invalid--005'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","invalid/005.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/006.xml
+%% ID: invalid--006
+%% Type: invalid
+%% Sections: 2.8
+'invalid--006'(suite) -> [];
+'invalid--006'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","invalid/006.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/not-sa/022.xml
+%% ID: invalid-not-sa-022
+%% Type: invalid
+%% Sections: 3.4 [62]
+'invalid-not-sa-022'(suite) -> [];
+'invalid-not-sa-022'(_Config) -> {skip, "DTD element content parsing NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","invalid/not-sa/022.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/001.xml
+%% ID: valid-sa-001
+%% Type: valid
+%% Sections: 3.2.2 [51]
+'valid-sa-001'(suite) -> [];
+'valid-sa-001'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/001.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/002.xml
+%% ID: valid-sa-002
+%% Type: valid
+%% Sections: 3.1 [40]
+'valid-sa-002'(suite) -> [];
+'valid-sa-002'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/002.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/003.xml
+%% ID: valid-sa-003
+%% Type: valid
+%% Sections: 3.1 [42]
+'valid-sa-003'(suite) -> [];
+'valid-sa-003'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/003.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/004.xml
+%% ID: valid-sa-004
+%% Type: valid
+%% Sections: 3.1 [41]
+'valid-sa-004'(suite) -> [];
+'valid-sa-004'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/004.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/005.xml
+%% ID: valid-sa-005
+%% Type: valid
+%% Sections: 3.1 [40]
+'valid-sa-005'(suite) -> [];
+'valid-sa-005'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/005.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/006.xml
+%% ID: valid-sa-006
+%% Type: valid
+%% Sections: 3.1 [41]
+'valid-sa-006'(suite) -> [];
+'valid-sa-006'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/006.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/007.xml
+%% ID: valid-sa-007
+%% Type: valid
+%% Sections: 3.1 4.6 [43]
+'valid-sa-007'(suite) -> [];
+'valid-sa-007'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/007.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/008.xml
+%% ID: valid-sa-008
+%% Type: valid
+%% Sections: 2.4 3.1 [43]
+'valid-sa-008'(suite) -> [];
+'valid-sa-008'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/008.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/009.xml
+%% ID: valid-sa-009
+%% Type: valid
+%% Sections: 2.3 3.1 [43]
+'valid-sa-009'(suite) -> [];
+'valid-sa-009'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/009.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/010.xml
+%% ID: valid-sa-010
+%% Type: valid
+%% Sections: 3.1 [40]
+'valid-sa-010'(suite) -> [];
+'valid-sa-010'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/010.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/011.xml
+%% ID: valid-sa-011
+%% Type: valid
+%% Sections: 3.1 [40]
+'valid-sa-011'(suite) -> [];
+'valid-sa-011'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/011.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/012.xml
+%% ID: valid-sa-012
+%% Type: valid
+%% Sections: 2.3 [4]
+'valid-sa-012'(suite) -> [];
+'valid-sa-012'(Config) -> {skip, "Fix 1"}.
+ %%?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ %%?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/012.xml"]),
+ %%?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ %%?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/013.xml
+%% ID: valid-sa-013
+%% Type: valid
+%% Sections: 2.3 3.1 [13] [40]
+'valid-sa-013'(suite) -> [];
+'valid-sa-013'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/013.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/014.xml
+%% ID: valid-sa-014
+%% Type: valid
+%% Sections: 2.3 3.1 [13] [40]
+'valid-sa-014'(suite) -> [];
+'valid-sa-014'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/014.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/015.xml
+%% ID: valid-sa-015
+%% Type: valid
+%% Sections: 2.3 3.1 [13] [40]
+'valid-sa-015'(suite) -> [];
+'valid-sa-015'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/015.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/016.xml
+%% ID: valid-sa-016
+%% Type: valid
+%% Sections: 2.6 3.1 [16] [43]
+'valid-sa-016'(suite) -> [];
+'valid-sa-016'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/016.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/017.xml
+%% ID: valid-sa-017
+%% Type: valid
+%% Sections: 2.6 3.1 [16] [43]
+'valid-sa-017'(suite) -> [];
+'valid-sa-017'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/017.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/018.xml
+%% ID: valid-sa-018
+%% Type: valid
+%% Sections: 2.7 3.1 [18] [43]
+'valid-sa-018'(suite) -> [];
+'valid-sa-018'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/018.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/019.xml
+%% ID: valid-sa-019
+%% Type: valid
+%% Sections: 2.7 3.1 [18] [43]
+'valid-sa-019'(suite) -> [];
+'valid-sa-019'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/019.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/020.xml
+%% ID: valid-sa-020
+%% Type: valid
+%% Sections: 2.7 3.1 [18] [43]
+'valid-sa-020'(suite) -> [];
+'valid-sa-020'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/020.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/021.xml
+%% ID: valid-sa-021
+%% Type: valid
+%% Sections: 2.5 3.1 [15] [43]
+'valid-sa-021'(suite) -> [];
+'valid-sa-021'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/021.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/022.xml
+%% ID: valid-sa-022
+%% Type: valid
+%% Sections: 2.5 3.1 [15] [43]
+'valid-sa-022'(suite) -> [];
+'valid-sa-022'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/022.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/023.xml
+%% ID: valid-sa-023
+%% Type: valid
+%% Sections: 3.1 [43]
+'valid-sa-023'(suite) -> [];
+'valid-sa-023'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/023.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/024.xml
+%% ID: valid-sa-024
+%% Type: valid
+%% Sections: 3.1 4.1 [43] [66]
+'valid-sa-024'(suite) -> [];
+'valid-sa-024'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/024.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/025.xml
+%% ID: valid-sa-025
+%% Type: valid
+%% Sections: 3.2 [46]
+'valid-sa-025'(suite) -> [];
+'valid-sa-025'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/025.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/026.xml
+%% ID: valid-sa-026
+%% Type: valid
+%% Sections: 3.2 [46]
+'valid-sa-026'(suite) -> [];
+'valid-sa-026'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/026.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/027.xml
+%% ID: valid-sa-027
+%% Type: valid
+%% Sections: 3.2 [46]
+'valid-sa-027'(suite) -> [];
+'valid-sa-027'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/027.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/028.xml
+%% ID: valid-sa-028
+%% Type: valid
+%% Sections: 2.8 [24]
+'valid-sa-028'(suite) -> [];
+'valid-sa-028'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/028.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/029.xml
+%% ID: valid-sa-029
+%% Type: valid
+%% Sections: 2.8 [24]
+'valid-sa-029'(suite) -> [];
+'valid-sa-029'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/029.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/030.xml
+%% ID: valid-sa-030
+%% Type: valid
+%% Sections: 2.8 [25]
+'valid-sa-030'(suite) -> [];
+'valid-sa-030'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/030.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/031.xml
+%% ID: valid-sa-031
+%% Type: valid
+%% Sections: 4.3.3 [80]
+'valid-sa-031'(suite) -> [];
+'valid-sa-031'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/031.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/032.xml
+%% ID: valid-sa-032
+%% Type: valid
+%% Sections: 2.9 [32]
+'valid-sa-032'(suite) -> [];
+'valid-sa-032'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/032.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/033.xml
+%% ID: valid-sa-033
+%% Type: valid
+%% Sections: 2.8 [23]
+'valid-sa-033'(suite) -> [];
+'valid-sa-033'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/033.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/034.xml
+%% ID: valid-sa-034
+%% Type: valid
+%% Sections: 3.1 [44]
+'valid-sa-034'(suite) -> [];
+'valid-sa-034'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/034.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/035.xml
+%% ID: valid-sa-035
+%% Type: valid
+%% Sections: 3.1 [44]
+'valid-sa-035'(suite) -> [];
+'valid-sa-035'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/035.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/036.xml
+%% ID: valid-sa-036
+%% Type: valid
+%% Sections: 2.6 [16]
+'valid-sa-036'(suite) -> [];
+'valid-sa-036'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/036.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/037.xml
+%% ID: valid-sa-037
+%% Type: valid
+%% Sections: 2.6 [15]
+'valid-sa-037'(suite) -> [];
+'valid-sa-037'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/037.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/038.xml
+%% ID: valid-sa-038
+%% Type: valid
+%% Sections: 2.6 [15]
+'valid-sa-038'(suite) -> [];
+'valid-sa-038'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/038.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/039.xml
+%% ID: valid-sa-039
+%% Type: valid
+%% Sections: 2.6 [16]
+'valid-sa-039'(suite) -> [];
+'valid-sa-039'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/039.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/040.xml
+%% ID: valid-sa-040
+%% Type: valid
+%% Sections: 3.3 3.3.1 [52] [54]
+'valid-sa-040'(suite) -> [];
+'valid-sa-040'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/040.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/041.xml
+%% ID: valid-sa-041
+%% Type: valid
+%% Sections: 3.3.1 4.1 [54] [66]
+'valid-sa-041'(suite) -> [];
+'valid-sa-041'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/041.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/042.xml
+%% ID: valid-sa-042
+%% Type: valid
+%% Sections: 3.3.1 4.1 [54] [66]
+'valid-sa-042'(suite) -> [];
+'valid-sa-042'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/042.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/043.xml
+%% ID: valid-sa-043
+%% Type: valid
+%% Sections: 3.3
+'valid-sa-043'(suite) -> [];
+'valid-sa-043'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/043.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/044.xml
+%% ID: valid-sa-044
+%% Type: valid
+%% Sections: 3.1 [44]
+'valid-sa-044'(suite) -> [];
+'valid-sa-044'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/044.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/045.xml
+%% ID: valid-sa-045
+%% Type: valid
+%% Sections: 3.3 [52]
+'valid-sa-045'(suite) -> [];
+'valid-sa-045'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/045.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/046.xml
+%% ID: valid-sa-046
+%% Type: valid
+%% Sections: 3.3 [52]
+'valid-sa-046'(suite) -> [];
+'valid-sa-046'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/046.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/047.xml
+%% ID: valid-sa-047
+%% Type: valid
+%% Sections: 3.1 [43]
+'valid-sa-047'(suite) -> [];
+'valid-sa-047'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/047.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/048.xml
+%% ID: valid-sa-048
+%% Type: valid
+%% Sections: 2.4 3.1 [14] [43]
+'valid-sa-048'(suite) -> [];
+'valid-sa-048'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/048.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/049.xml
+%% ID: valid-sa-049
+%% Type: valid
+%% Sections: 2.2 [2]
+'valid-sa-049'(suite) -> [];
+'valid-sa-049'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/049.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/050.xml
+%% ID: valid-sa-050
+%% Type: valid
+%% Sections: 2.2 [2]
+'valid-sa-050'(suite) -> [];
+'valid-sa-050'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/050.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/051.xml
+%% ID: valid-sa-051
+%% Type: valid
+%% Sections: 2.2 [2]
+'valid-sa-051'(suite) -> [];
+'valid-sa-051'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/051.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/052.xml
+%% ID: valid-sa-052
+%% Type: valid
+%% Sections: 2.2 [2]
+'valid-sa-052'(suite) -> [];
+'valid-sa-052'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/052.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/053.xml
+%% ID: valid-sa-053
+%% Type: valid
+%% Sections: 4.4.2
+'valid-sa-053'(suite) -> [];
+'valid-sa-053'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/053.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/054.xml
+%% ID: valid-sa-054
+%% Type: valid
+%% Sections: 3.1 [40] [42]
+'valid-sa-054'(suite) -> [];
+'valid-sa-054'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/054.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/055.xml
+%% ID: valid-sa-055
+%% Type: valid
+%% Sections: 2.6 2.10 [16]
+'valid-sa-055'(suite) -> [];
+'valid-sa-055'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/055.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/056.xml
+%% ID: valid-sa-056
+%% Type: valid
+%% Sections: 3.3.1 4.1 [54] [66]
+'valid-sa-056'(suite) -> [];
+'valid-sa-056'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/056.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/057.xml
+%% ID: valid-sa-057
+%% Type: valid
+%% Sections: 3.2.1 [47]
+'valid-sa-057'(suite) -> [];
+'valid-sa-057'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/057.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/058.xml
+%% ID: valid-sa-058
+%% Type: valid
+%% Sections: 3.3.3
+'valid-sa-058'(suite) -> [];
+'valid-sa-058'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/058.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/059.xml
+%% ID: valid-sa-059
+%% Type: valid
+%% Sections: 3.2 3.3 [46] [53]
+'valid-sa-059'(suite) -> [];
+'valid-sa-059'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/059.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/060.xml
+%% ID: valid-sa-060
+%% Type: valid
+%% Sections: 4.1 [66]
+'valid-sa-060'(suite) -> [];
+'valid-sa-060'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/060.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/061.xml
+%% ID: valid-sa-061
+%% Type: valid
+%% Sections: 4.1 [66]
+'valid-sa-061'(suite) -> [];
+'valid-sa-061'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/061.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/062.xml
+%% ID: valid-sa-062
+%% Type: valid
+%% Sections: 4.1 [66]
+'valid-sa-062'(suite) -> [];
+'valid-sa-062'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/062.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/063.xml
+%% ID: valid-sa-063
+%% Type: valid
+%% Sections: 2.3 [5]
+'valid-sa-063'(suite) -> [];
+'valid-sa-063'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/063.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/064.xml
+%% ID: valid-sa-064
+%% Type: valid
+%% Sections: 4.1 [66]
+'valid-sa-064'(suite) -> [];
+'valid-sa-064'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/064.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/065.xml
+%% ID: valid-sa-065
+%% Type: valid
+%% Sections: 4.5
+'valid-sa-065'(suite) -> [];
+'valid-sa-065'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/065.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/066.xml
+%% ID: valid-sa-066
+%% Type: valid
+%% Sections: 4.1 [66]
+'valid-sa-066'(suite) -> [];
+'valid-sa-066'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/066.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/067.xml
+%% ID: valid-sa-067
+%% Type: valid
+%% Sections: 4.1 [66]
+'valid-sa-067'(suite) -> [];
+'valid-sa-067'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/067.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/068.xml
+%% ID: valid-sa-068
+%% Type: valid
+%% Sections: 2.11, 4.5
+'valid-sa-068'(suite) -> [];
+'valid-sa-068'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/068.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/069.xml
+%% ID: valid-sa-069
+%% Type: valid
+%% Sections: 4.7
+'valid-sa-069'(suite) -> [];
+'valid-sa-069'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/069.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/070.xml
+%% ID: valid-sa-070
+%% Type: valid
+%% Sections: 4.4.8
+'valid-sa-070'(suite) -> [];
+'valid-sa-070'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/070.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/071.xml
+%% ID: valid-sa-071
+%% Type: valid
+%% Sections: 3.3 3.3.1 [52] [56]
+'valid-sa-071'(suite) -> [];
+'valid-sa-071'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/071.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/072.xml
+%% ID: valid-sa-072
+%% Type: valid
+%% Sections: 3.3 3.3.1 [52] [56]
+'valid-sa-072'(suite) -> [];
+'valid-sa-072'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/072.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/073.xml
+%% ID: valid-sa-073
+%% Type: valid
+%% Sections: 3.3 3.3.1 [52] [56]
+'valid-sa-073'(suite) -> [];
+'valid-sa-073'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/073.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/074.xml
+%% ID: valid-sa-074
+%% Type: valid
+%% Sections: 3.3 3.3.1 [52] [56]
+'valid-sa-074'(suite) -> [];
+'valid-sa-074'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/074.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/075.xml
+%% ID: valid-sa-075
+%% Type: valid
+%% Sections: 3.3 3.3.1 [52] [56]
+'valid-sa-075'(suite) -> [];
+'valid-sa-075'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/075.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/076.xml
+%% ID: valid-sa-076
+%% Type: valid
+%% Sections: 3.3.1
+'valid-sa-076'(suite) -> [];
+'valid-sa-076'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/076.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/077.xml
+%% ID: valid-sa-077
+%% Type: valid
+%% Sections: 3.3 3.3.1 [52] [54]
+'valid-sa-077'(suite) -> [];
+'valid-sa-077'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/077.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/078.xml
+%% ID: valid-sa-078
+%% Type: valid
+%% Sections: 3.3 3.3.1 [52] [54]
+'valid-sa-078'(suite) -> [];
+'valid-sa-078'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/078.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/079.xml
+%% ID: valid-sa-079
+%% Type: valid
+%% Sections: 3.3 3.3.2 [52] [60]
+'valid-sa-079'(suite) -> [];
+'valid-sa-079'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/079.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/080.xml
+%% ID: valid-sa-080
+%% Type: valid
+%% Sections: 3.3 3.3.2 [52] [60]
+'valid-sa-080'(suite) -> [];
+'valid-sa-080'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/080.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/081.xml
+%% ID: valid-sa-081
+%% Type: valid
+%% Sections: 3.2.1 [50]
+'valid-sa-081'(suite) -> [];
+'valid-sa-081'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/081.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/082.xml
+%% ID: valid-sa-082
+%% Type: valid
+%% Sections: 4.2 [72]
+'valid-sa-082'(suite) -> [];
+'valid-sa-082'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/082.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/083.xml
+%% ID: valid-sa-083
+%% Type: valid
+%% Sections: 4.2 [72]
+'valid-sa-083'(suite) -> [];
+'valid-sa-083'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/083.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/084.xml
+%% ID: valid-sa-084
+%% Type: valid
+%% Sections: 2.10
+'valid-sa-084'(suite) -> [];
+'valid-sa-084'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/084.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/085.xml
+%% ID: valid-sa-085
+%% Type: valid
+%% Sections: 4
+'valid-sa-085'(suite) -> [];
+'valid-sa-085'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/085.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/086.xml
+%% ID: valid-sa-086
+%% Type: valid
+%% Sections: 4.2
+'valid-sa-086'(suite) -> [];
+'valid-sa-086'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/086.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/087.xml
+%% ID: valid-sa-087
+%% Type: valid
+%% Sections: 4.5
+'valid-sa-087'(suite) -> [];
+'valid-sa-087'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/087.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/088.xml
+%% ID: valid-sa-088
+%% Type: valid
+%% Sections: 4.5
+'valid-sa-088'(suite) -> [];
+'valid-sa-088'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/088.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/089.xml
+%% ID: valid-sa-089
+%% Type: valid
+%% Sections: 4.1 [66]
+'valid-sa-089'(suite) -> [];
+'valid-sa-089'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/089.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/090.xml
+%% ID: valid-sa-090
+%% Type: valid
+%% Sections: 3.3.1
+'valid-sa-090'(suite) -> [];
+'valid-sa-090'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/090.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/091.xml
+%% ID: valid-sa-091
+%% Type: valid
+%% Sections: 3.3.1
+'valid-sa-091'(suite) -> [];
+'valid-sa-091'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/091.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/092.xml
+%% ID: valid-sa-092
+%% Type: valid
+%% Sections: 2.3 2.10
+'valid-sa-092'(suite) -> [];
+'valid-sa-092'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/092.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/093.xml
+%% ID: valid-sa-093
+%% Type: valid
+%% Sections: 2.10
+'valid-sa-093'(suite) -> [];
+'valid-sa-093'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/093.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/094.xml
+%% ID: valid-sa-094
+%% Type: valid
+%% Sections: 2.8
+'valid-sa-094'(suite) -> [];
+'valid-sa-094'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/094.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/095.xml
+%% ID: valid-sa-095
+%% Type: valid
+%% Sections: 3.3.3
+'valid-sa-095'(suite) -> [];
+'valid-sa-095'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/095.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/096.xml
+%% ID: valid-sa-096
+%% Type: valid
+%% Sections: 3.3.3
+'valid-sa-096'(suite) -> [];
+'valid-sa-096'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/096.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/097.xml
+%% ID: valid-sa-097
+%% Type: valid
+%% Sections: 3.3
+'valid-sa-097'(suite) -> [];
+'valid-sa-097'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/097.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/098.xml
+%% ID: valid-sa-098
+%% Type: valid
+%% Sections: 2.6 2.10 [16]
+'valid-sa-098'(suite) -> [];
+'valid-sa-098'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/098.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/099.xml
+%% ID: valid-sa-099
+%% Type: valid
+%% Sections: 4.3.3 [81]
+'valid-sa-099'(suite) -> [];
+'valid-sa-099'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/099.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/100.xml
+%% ID: valid-sa-100
+%% Type: valid
+%% Sections: 2.3 [12]
+'valid-sa-100'(suite) -> [];
+'valid-sa-100'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/100.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/101.xml
+%% ID: valid-sa-101
+%% Type: valid
+%% Sections: 4.5
+'valid-sa-101'(suite) -> [];
+'valid-sa-101'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/101.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/102.xml
+%% ID: valid-sa-102
+%% Type: valid
+%% Sections: 3.3.3
+'valid-sa-102'(suite) -> [];
+'valid-sa-102'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/102.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/103.xml
+%% ID: valid-sa-103
+%% Type: valid
+%% Sections: 3.3.3
+'valid-sa-103'(suite) -> [];
+'valid-sa-103'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/103.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/104.xml
+%% ID: valid-sa-104
+%% Type: valid
+%% Sections: 3.1 [40]
+'valid-sa-104'(suite) -> [];
+'valid-sa-104'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/104.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/105.xml
+%% ID: valid-sa-105
+%% Type: valid
+%% Sections: 3.3.3
+'valid-sa-105'(suite) -> [];
+'valid-sa-105'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/105.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/106.xml
+%% ID: valid-sa-106
+%% Type: valid
+%% Sections: 3.3.3
+'valid-sa-106'(suite) -> [];
+'valid-sa-106'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/106.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/107.xml
+%% ID: valid-sa-107
+%% Type: valid
+%% Sections: 3.3.3
+'valid-sa-107'(suite) -> [];
+'valid-sa-107'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/107.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/108.xml
+%% ID: valid-sa-108
+%% Type: valid
+%% Sections: 2.11, 3.3.3
+'valid-sa-108'(suite) -> [];
+'valid-sa-108'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/108.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/109.xml
+%% ID: valid-sa-109
+%% Type: valid
+%% Sections: 2.3 3.1 [10][40][41]
+'valid-sa-109'(suite) -> [];
+'valid-sa-109'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/109.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/110.xml
+%% ID: valid-sa-110
+%% Type: valid
+%% Sections: 3.3.3
+'valid-sa-110'(suite) -> [];
+'valid-sa-110'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/110.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/111.xml
+%% ID: valid-sa-111
+%% Type: valid
+%% Sections: 3.3.3
+'valid-sa-111'(suite) -> [];
+'valid-sa-111'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/111.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/112.xml
+%% ID: valid-sa-112
+%% Type: valid
+%% Sections: 3.2.1 [48][49]
+'valid-sa-112'(suite) -> [];
+'valid-sa-112'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/112.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/113.xml
+%% ID: valid-sa-113
+%% Type: valid
+%% Sections: 3.3 [52][53]
+'valid-sa-113'(suite) -> [];
+'valid-sa-113'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/113.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/114.xml
+%% ID: valid-sa-114
+%% Type: valid
+%% Sections: 2.7 [20]
+'valid-sa-114'(suite) -> [];
+'valid-sa-114'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/114.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/115.xml
+%% ID: valid-sa-115
+%% Type: valid
+%% Sections: 3.3.3
+'valid-sa-115'(suite) -> [];
+'valid-sa-115'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/115.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/116.xml
+%% ID: valid-sa-116
+%% Type: valid
+%% Sections: 2.11
+'valid-sa-116'(suite) -> [];
+'valid-sa-116'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/116.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/117.xml
+%% ID: valid-sa-117
+%% Type: valid
+%% Sections: 4.5
+'valid-sa-117'(suite) -> [];
+'valid-sa-117'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/117.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/118.xml
+%% ID: valid-sa-118
+%% Type: valid
+%% Sections: 4.5
+'valid-sa-118'(suite) -> [];
+'valid-sa-118'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/118.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa/119.xml
+%% ID: valid-sa-119
+%% Type: valid
+%% Sections: 2.5
+'valid-sa-119'(suite) -> [];
+'valid-sa-119'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/sa/119.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/001.xml
+%% ID: valid-not-sa-001
+%% Type: valid
+%% Sections: 4.2.2 [75]
+'valid-not-sa-001'(suite) -> [];
+'valid-not-sa-001'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/001.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/002.xml
+%% ID: valid-not-sa-002
+%% Type: valid
+%% Sections: 4.2.2 [75]
+'valid-not-sa-002'(suite) -> [];
+'valid-not-sa-002'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/002.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/003.xml
+%% ID: valid-not-sa-003
+%% Type: valid
+%% Sections: 4.1 [69]
+'valid-not-sa-003'(suite) -> [];
+'valid-not-sa-003'(_Config) -> {skip, "external entity NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/003.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/004.xml
+%% ID: valid-not-sa-004
+%% Type: valid
+%% Sections: 4.1 [69]
+'valid-not-sa-004'(suite) -> [];
+'valid-not-sa-004'(_Config) -> {skip, "external entity NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/004.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/005.xml
+%% ID: valid-not-sa-005
+%% Type: valid
+%% Sections: 4.1 [69]
+'valid-not-sa-005'(suite) -> [];
+'valid-not-sa-005'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/005.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/006.xml
+%% ID: valid-not-sa-006
+%% Type: valid
+%% Sections: 3.3 [52]
+'valid-not-sa-006'(suite) -> [];
+'valid-not-sa-006'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/006.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/007.xml
+%% ID: valid-not-sa-007
+%% Type: valid
+%% Sections: 3.3 [52]
+'valid-not-sa-007'(suite) -> [];
+'valid-not-sa-007'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/007.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/008.xml
+%% ID: valid-not-sa-008
+%% Type: valid
+%% Sections: 4.2.2 [75]
+'valid-not-sa-008'(suite) -> [];
+'valid-not-sa-008'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/008.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/009.xml
+%% ID: valid-not-sa-009
+%% Type: valid
+%% Sections: 4.2.2 [75]
+'valid-not-sa-009'(suite) -> [];
+'valid-not-sa-009'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/009.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/010.xml
+%% ID: valid-not-sa-010
+%% Type: valid
+%% Sections: 3.3 [52]
+'valid-not-sa-010'(suite) -> [];
+'valid-not-sa-010'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/010.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/011.xml
+%% ID: valid-not-sa-011
+%% Type: valid
+%% Sections: 4.2 4.2.1 [72] [75]
+'valid-not-sa-011'(suite) -> [];
+'valid-not-sa-011'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/011.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/012.xml
+%% ID: valid-not-sa-012
+%% Type: valid
+%% Sections: 4.3.1 [77]
+'valid-not-sa-012'(suite) -> [];
+'valid-not-sa-012'(Config) -> {skip, "Fix 3"}.
+ %% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ %% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/012.xml"]),
+ %% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ %% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/013.xml
+%% ID: valid-not-sa-013
+%% Type: valid
+%% Sections: 3.4 [62]
+'valid-not-sa-013'(suite) -> [];
+'valid-not-sa-013'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/013.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/014.xml
+%% ID: valid-not-sa-014
+%% Type: valid
+%% Sections: 3.4 [62]
+'valid-not-sa-014'(suite) -> [];
+'valid-not-sa-014'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/014.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/015.xml
+%% ID: valid-not-sa-015
+%% Type: valid
+%% Sections: 3.4 [63]
+'valid-not-sa-015'(suite) -> [];
+'valid-not-sa-015'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/015.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/016.xml
+%% ID: valid-not-sa-016
+%% Type: valid
+%% Sections: 3.4 [62]
+'valid-not-sa-016'(suite) -> [];
+'valid-not-sa-016'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/016.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/017.xml
+%% ID: valid-not-sa-017
+%% Type: valid
+%% Sections: 4.2 [72]
+'valid-not-sa-017'(suite) -> [];
+'valid-not-sa-017'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/017.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/018.xml
+%% ID: valid-not-sa-018
+%% Type: valid
+%% Sections: 4.2.2 [75]
+'valid-not-sa-018'(suite) -> [];
+'valid-not-sa-018'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/018.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/019.xml
+%% ID: valid-not-sa-019
+%% Type: valid
+%% Sections: 4.4.8
+'valid-not-sa-019'(suite) -> [];
+'valid-not-sa-019'(_Config) -> {skip, "partly replacement of markupdecls"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/019.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/020.xml
+%% ID: valid-not-sa-020
+%% Type: valid
+%% Sections: 4.4.8
+'valid-not-sa-020'(suite) -> [];
+'valid-not-sa-020'(_Config) -> {skip, "partly replacement of markupdecls"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/020.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/021.xml
+%% ID: valid-not-sa-021
+%% Type: valid
+%% Sections: 4.2 [72]
+'valid-not-sa-021'(suite) -> [];
+'valid-not-sa-021'(_Config) -> {skip, "partly replacement of markupdecls"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/021.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/023.xml
+%% ID: valid-not-sa-023
+%% Type: valid
+%% Sections: 2.3 4.1 [10] [69]
+'valid-not-sa-023'(suite) -> [];
+'valid-not-sa-023'(_Config) -> {skip, "partly replacement of markupdecls"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/023.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/024.xml
+%% ID: valid-not-sa-024
+%% Type: valid
+%% Sections: 2.8, 4.1 [69]
+'valid-not-sa-024'(suite) -> [];
+'valid-not-sa-024'(_Config) -> {skip, "partly replacement of markupdecls"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/024.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/025.xml
+%% ID: valid-not-sa-025
+%% Type: valid
+%% Sections: 4.2
+'valid-not-sa-025'(suite) -> [];
+'valid-not-sa-025'(_Config) -> {skip, "partly replacement of markupdecls"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/025.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/026.xml
+%% ID: valid-not-sa-026
+%% Type: valid
+%% Sections: 3.3 [52]
+'valid-not-sa-026'(suite) -> [];
+'valid-not-sa-026'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/026.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/027.xml
+%% ID: valid-not-sa-027
+%% Type: valid
+%% Sections: 4.1 [69]
+'valid-not-sa-027'(suite) -> [];
+'valid-not-sa-027'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/027.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/028.xml
+%% ID: valid-not-sa-028
+%% Type: valid
+%% Sections: 3.4 [62]
+'valid-not-sa-028'(suite) -> [];
+'valid-not-sa-028'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/028.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/029.xml
+%% ID: valid-not-sa-029
+%% Type: valid
+%% Sections: 3.4 [62]
+'valid-not-sa-029'(suite) -> [];
+'valid-not-sa-029'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/029.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/030.xml
+%% ID: valid-not-sa-030
+%% Type: valid
+%% Sections: 3.4 [62]
+'valid-not-sa-030'(suite) -> [];
+'valid-not-sa-030'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/030.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa/031.xml
+%% ID: valid-not-sa-031
+%% Type: valid
+%% Sections: 2.7
+'valid-not-sa-031'(suite) -> [];
+'valid-not-sa-031'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/not-sa/031.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/ext-sa/001.xml
+%% ID: valid-ext-sa-001
+%% Type: valid
+%% Sections: 2.11
+'valid-ext-sa-001'(suite) -> [];
+'valid-ext-sa-001'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/001.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/ext-sa/002.xml
+%% ID: valid-ext-sa-002
+%% Type: valid
+%% Sections: 2.11
+'valid-ext-sa-002'(suite) -> [];
+'valid-ext-sa-002'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/002.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/ext-sa/003.xml
+%% ID: valid-ext-sa-003
+%% Type: valid
+%% Sections: 3.1 4.1 [43] [68]
+'valid-ext-sa-003'(suite) -> [];
+'valid-ext-sa-003'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/003.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/ext-sa/004.xml
+%% ID: valid-ext-sa-004
+%% Type: valid
+%% Sections: 2.11
+'valid-ext-sa-004'(suite) -> [];
+'valid-ext-sa-004'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/004.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/ext-sa/005.xml
+%% ID: valid-ext-sa-005
+%% Type: valid
+%% Sections: 3.2.1 4.2.2 [48] [75]
+'valid-ext-sa-005'(suite) -> [];
+'valid-ext-sa-005'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/005.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/ext-sa/006.xml
+%% ID: valid-ext-sa-006
+%% Type: valid
+%% Sections: 2.11 3.2.1 3.2.2 4.2.2 [48] [51] [75]
+'valid-ext-sa-006'(suite) -> [];
+'valid-ext-sa-006'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/006.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/ext-sa/007.xml
+%% ID: valid-ext-sa-007
+%% Type: valid
+%% Sections: 4.2.2 4.4.3 [75]
+'valid-ext-sa-007'(suite) -> [];
+'valid-ext-sa-007'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/007.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/ext-sa/008.xml
+%% ID: valid-ext-sa-008
+%% Type: valid
+%% Sections: 4.2.2 4.3.3. 4.4.3 [75] [80]
+'valid-ext-sa-008'(suite) -> [];
+'valid-ext-sa-008'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/008.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/ext-sa/009.xml
+%% ID: valid-ext-sa-009
+%% Type: valid
+%% Sections: 2.11
+'valid-ext-sa-009'(suite) -> [];
+'valid-ext-sa-009'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/009.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/ext-sa/011.xml
+%% ID: valid-ext-sa-011
+%% Type: valid
+%% Sections: 2.11 4.2.2 [75]
+'valid-ext-sa-011'(suite) -> [];
+'valid-ext-sa-011'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/011.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/ext-sa/012.xml
+%% ID: valid-ext-sa-012
+%% Type: valid
+%% Sections: 4.2.1 4.2.2
+'valid-ext-sa-012'(suite) -> [];
+'valid-ext-sa-012'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/012.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/ext-sa/013.xml
+%% ID: valid-ext-sa-013
+%% Type: valid
+%% Sections: 3.3.3
+'valid-ext-sa-013'(suite) -> [];
+'valid-ext-sa-013'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/013.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/ext-sa/014.xml
+%% ID: valid-ext-sa-014
+%% Type: valid
+%% Sections: 4.1 4.4.3 [68]
+'valid-ext-sa-014'(suite) -> [];
+'valid-ext-sa-014'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"xmltest","valid/ext-sa/014.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: James Clark XMLTEST cases, 18-Nov-1998
+
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: James Clark XML 1.0 Tests
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: pr-xml-euc-jp.xml
+%% ID: pr-xml-euc-jp
+%% Type: error
+%% Sections: 4.3.3 [4,84]
+'pr-xml-euc-jp'(suite) -> [];
+'pr-xml-euc-jp'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"japanese","pr-xml-euc-jp.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "error").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: pr-xml-iso-2022-jp.xml
+%% ID: pr-xml-iso-2022-jp
+%% Type: error
+%% Sections: 4.3.3 [4,84]
+'pr-xml-iso-2022-jp'(suite) -> [];
+'pr-xml-iso-2022-jp'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"japanese","pr-xml-iso-2022-jp.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "error").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: pr-xml-little-endian.xml
+%% ID: pr-xml-little
+%% Type: valid
+%% Sections: 4.3.3 [4,84]
+'pr-xml-little'(suite) -> [];
+'pr-xml-little'(Config) -> {skip, "Fix 3"}.
+ %%?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ %%?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"japanese","pr-xml-little-endian.xml"]),
+ %%?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ %%?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: pr-xml-shift_jis.xml
+%% ID: pr-xml-shift_jis
+%% Type: error
+%% Sections: 4.3.3 [4,84]
+'pr-xml-shift_jis'(suite) -> [];
+'pr-xml-shift_jis'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"japanese","pr-xml-shift_jis.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "error").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: pr-xml-utf-16.xml
+%% ID: pr-xml-utf-16
+%% Type: valid
+%% Sections: 4.3.3 [4,84]
+'pr-xml-utf-16'(suite) -> [];
+'pr-xml-utf-16'(Config) -> {skip, "Fix 3"}.
+ %%?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ %%?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"japanese","pr-xml-utf-16.xml"]),
+ %%?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ %%?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: pr-xml-utf-8.xml
+%% ID: pr-xml-utf-8
+%% Type: valid
+%% Sections: 4.3.3 [4,84]
+'pr-xml-utf-8'(suite) -> [];
+'pr-xml-utf-8'(Config) -> {skip, "Fix 3"}.
+ %%?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ %%?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"japanese","pr-xml-utf-8.xml"]),
+ %%?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ %%?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: weekly-euc-jp.xml
+%% ID: weekly-euc-jp
+%% Type: error
+%% Sections: 4.3.3 [4,84]
+'weekly-euc-jp'(suite) -> [];
+'weekly-euc-jp'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"japanese","weekly-euc-jp.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "error").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: weekly-iso-2022-jp.xml
+%% ID: weekly-iso-2022-jp
+%% Type: error
+%% Sections: 4.3.3 [4,84]
+'weekly-iso-2022-jp'(suite) -> [];
+'weekly-iso-2022-jp'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"japanese","weekly-iso-2022-jp.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "error").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: weekly-little-endian.xml
+%% ID: weekly-little
+%% Type: valid
+%% Sections: 4.3.3 [4,84]
+'weekly-little'(suite) -> [];
+'weekly-little'(Config) -> {skip, "Fix 3"}.
+ %%?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ %%?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"japanese","weekly-little-endian.xml"]),
+ %%?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ %%?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: weekly-shift_jis.xml
+%% ID: weekly-shift_jis
+%% Type: error
+%% Sections: 4.3.3 [4,84]
+'weekly-shift_jis'(suite) -> [];
+'weekly-shift_jis'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"japanese","weekly-shift_jis.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "error").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: weekly-utf-16.xml
+%% ID: weekly-utf-16
+%% Type: valid
+%% Sections: 4.3.3 [4,84]
+'weekly-utf-16'(suite) -> [];
+'weekly-utf-16'(Config) -> {skip, "Fix 3"}.
+ %%?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ %%?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"japanese","weekly-utf-16.xml"]),
+ %%?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ %%?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: weekly-utf-8.xml
+%% ID: weekly-utf-8
+%% Type: valid
+%% Sections: 4.3.3 [4,84]
+'weekly-utf-8'(suite) -> [];
+'weekly-utf-8'(Config) -> {skip, "Fix 3"}.
+ %%?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ %%?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"japanese","weekly-utf-8.xml"]),
+ %%?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ %%?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: Fuji Xerox Japanese Text Tests
+
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: Fuji Xerox Japanese Text Tests XML 1.0 Tests
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/pe01.xml
+%% ID: pe01
+%% Type: valid
+%% Sections: 2.8
+'pe01'(suite) -> [];
+'pe01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/pe01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/dtd00.xml
+%% ID: dtd00
+%% Type: valid
+%% Sections: 3.2.2 [51]
+'dtd00'(suite) -> [];
+'dtd00'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/dtd00.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/dtd01.xml
+%% ID: dtd01
+%% Type: valid
+%% Sections: 2.5 [15]
+'dtd01'(suite) -> [];
+'dtd01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/dtd01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/element.xml
+%% ID: element
+%% Type: valid
+%% Sections: 3
+'element'(suite) -> [];
+'element'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/element.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/ext01.xml
+%% ID: ext01
+%% Type: valid
+%% Sections: 4.3.1 4.3.2 [77] [78]
+'ext01'(suite) -> [];
+'ext01'(Config) -> {skip, "Fix 3"}.
+ %%?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ %%?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/ext01.xml"]),
+ %%?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ %%?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/ext02.xml
+%% ID: ext02
+%% Type: valid
+%% Sections: 4.3.2 [78]
+'ext02'(suite) -> [];
+'ext02'(Config) -> {skip, "Fix 3"}.
+ %%?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ %%?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/ext02.xml"]),
+ %%?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ %%?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa01.xml
+%% ID: not-sa01
+%% Type: valid
+%% Sections: 2.9
+'not-sa01'(suite) -> [];
+'not-sa01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/not-sa01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa02.xml
+%% ID: not-sa02
+%% Type: valid
+%% Sections: 2.9
+'not-sa02'(suite) -> [];
+'not-sa02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/not-sa02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa03.xml
+%% ID: not-sa03
+%% Type: valid
+%% Sections: 2.9
+'not-sa03'(suite) -> [];
+'not-sa03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/not-sa03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/not-sa04.xml
+%% ID: not-sa04
+%% Type: valid
+%% Sections: 2.9
+'not-sa04'(suite) -> [];
+'not-sa04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/not-sa04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/notation01.xml
+%% ID: notation01
+%% Type: valid
+%% Sections: 4.7 [82]
+'notation01'(suite) -> [];
+'notation01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/notation01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/optional.xml
+%% ID: optional
+%% Type: valid
+%% Sections: 3 3.2.1 [47]
+'optional'(suite) -> [];
+'optional'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/optional.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/required00.xml
+%% ID: required00
+%% Type: valid
+%% Sections: 3.3.2 [60]
+'required00'(suite) -> [];
+'required00'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/required00.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa01.xml
+%% ID: sa01
+%% Type: valid
+%% Sections: 2.9 [32]
+'sa01'(suite) -> [];
+'sa01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/sa01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa02.xml
+%% ID: sa02
+%% Type: valid
+%% Sections: 2.9 [32]
+'sa02'(suite) -> [];
+'sa02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/sa02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa03.xml
+%% ID: sa03
+%% Type: valid
+%% Sections: 2.9 [32]
+'sa03'(suite) -> [];
+'sa03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/sa03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa04.xml
+%% ID: sa04
+%% Type: valid
+%% Sections: 2.9 [32]
+'sa04'(suite) -> [];
+'sa04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/sa04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sa05.xml
+%% ID: sa05
+%% Type: valid
+%% Sections: 2.9 [32]
+'sa05'(suite) -> [];
+'sa05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/sa05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/sgml01.xml
+%% ID: v-sgml01
+%% Type: valid
+%% Sections: 3.3.1 [59]
+'v-sgml01'(suite) -> [];
+'v-sgml01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/sgml01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/v-lang01.xml
+%% ID: v-lang01
+%% Type: valid
+%% Sections: 2.12 [35]
+'v-lang01'(suite) -> [];
+'v-lang01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/v-lang01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/v-lang02.xml
+%% ID: v-lang02
+%% Type: valid
+%% Sections: 2.12 [35]
+'v-lang02'(suite) -> [];
+'v-lang02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/v-lang02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/v-lang03.xml
+%% ID: v-lang03
+%% Type: valid
+%% Sections: 2.12 [36]
+'v-lang03'(suite) -> [];
+'v-lang03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/v-lang03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/v-lang04.xml
+%% ID: v-lang04
+%% Type: valid
+%% Sections: 2.12 [37]
+'v-lang04'(suite) -> [];
+'v-lang04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/v-lang04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/v-lang05.xml
+%% ID: v-lang05
+%% Type: valid
+%% Sections: 2.12 [35]
+'v-lang05'(suite) -> [];
+'v-lang05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/v-lang05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/v-lang06.xml
+%% ID: v-lang06
+%% Type: valid
+%% Sections: 2.12 [37]
+'v-lang06'(suite) -> [];
+'v-lang06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/v-lang06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/pe00.xml
+%% ID: v-pe00
+%% Type: valid
+%% Sections: 4.5
+'v-pe00'(suite) -> [];
+'v-pe00'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/pe00.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/pe03.xml
+%% ID: v-pe03
+%% Type: valid
+%% Sections: 4.5
+'v-pe03'(suite) -> [];
+'v-pe03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/pe03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/pe02.xml
+%% ID: v-pe02
+%% Type: valid
+%% Sections: 4.5
+'v-pe02'(suite) -> [];
+'v-pe02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","valid/pe02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/dtd01.xml
+%% ID: inv-dtd01
+%% Type: invalid
+%% Sections: 3.2.2
+'inv-dtd01'(suite) -> [];
+'inv-dtd01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/dtd01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/dtd02.xml
+%% ID: inv-dtd02
+%% Type: invalid
+%% Sections: 4.2.2
+'inv-dtd02'(suite) -> [];
+'inv-dtd02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/dtd02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/dtd03.xml
+%% ID: inv-dtd03
+%% Type: invalid
+%% Sections: 3
+'inv-dtd03'(suite) -> [];
+'inv-dtd03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/dtd03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/el01.xml
+%% ID: el01
+%% Type: invalid
+%% Sections: 3
+'el01'(suite) -> [];
+'el01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/el01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/el02.xml
+%% ID: el02
+%% Type: invalid
+%% Sections: 3
+'el02'(suite) -> [];
+'el02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/el02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/el03.xml
+%% ID: el03
+%% Type: invalid
+%% Sections: 3
+'el03'(suite) -> [];
+'el03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/el03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/el04.xml
+%% ID: el04
+%% Type: invalid
+%% Sections: 3.2
+'el04'(suite) -> [];
+'el04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/el04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/el05.xml
+%% ID: el05
+%% Type: invalid
+%% Sections: 3.2.2
+'el05'(suite) -> [];
+'el05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/el05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/el06.xml
+%% ID: el06
+%% Type: invalid
+%% Sections: 3
+'el06'(suite) -> [];
+'el06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/el06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/id01.xml
+%% ID: id01
+%% Type: invalid
+%% Sections: 3.3.1
+'id01'(suite) -> [];
+'id01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/id01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/id02.xml
+%% ID: id02
+%% Type: invalid
+%% Sections: 3.3.1
+'id02'(suite) -> [];
+'id02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/id02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/id03.xml
+%% ID: id03
+%% Type: invalid
+%% Sections: 3.3.1
+'id03'(suite) -> [];
+'id03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/id03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/id04.xml
+%% ID: id04
+%% Type: invalid
+%% Sections: 3.3.1
+'id04'(suite) -> [];
+'id04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/id04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/id05.xml
+%% ID: id05
+%% Type: invalid
+%% Sections: 3.3.1
+'id05'(suite) -> [];
+'id05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/id05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/id06.xml
+%% ID: id06
+%% Type: invalid
+%% Sections: 3.3.1
+'id06'(suite) -> [];
+'id06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/id06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/id07.xml
+%% ID: id07
+%% Type: invalid
+%% Sections: 3.3.1
+'id07'(suite) -> [];
+'id07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/id07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/id08.xml
+%% ID: id08
+%% Type: invalid
+%% Sections: 3.3.1
+'id08'(suite) -> [];
+'id08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/id08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/id09.xml
+%% ID: id09
+%% Type: invalid
+%% Sections: 3.3.1
+'id09'(suite) -> [];
+'id09'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/id09.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/not-sa01.xml
+%% ID: inv-not-sa01
+%% Type: invalid
+%% Sections: 2.9
+'inv-not-sa01'(suite) -> [];
+'inv-not-sa01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/not-sa01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/not-sa02.xml
+%% ID: inv-not-sa02
+%% Type: invalid
+%% Sections: 2.9
+'inv-not-sa02'(suite) -> [];
+'inv-not-sa02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/not-sa02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/not-sa04.xml
+%% ID: inv-not-sa04
+%% Type: invalid
+%% Sections: 2.9
+'inv-not-sa04'(suite) -> [];
+'inv-not-sa04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/not-sa04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/not-sa05.xml
+%% ID: inv-not-sa05
+%% Type: invalid
+%% Sections: 2.9
+'inv-not-sa05'(suite) -> [];
+'inv-not-sa05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/not-sa05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/not-sa06.xml
+%% ID: inv-not-sa06
+%% Type: invalid
+%% Sections: 2.9
+'inv-not-sa06'(suite) -> [];
+'inv-not-sa06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/not-sa06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/not-sa07.xml
+%% ID: inv-not-sa07
+%% Type: invalid
+%% Sections: 2.9
+'inv-not-sa07'(suite) -> [];
+'inv-not-sa07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/not-sa07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/not-sa08.xml
+%% ID: inv-not-sa08
+%% Type: invalid
+%% Sections: 2.9
+'inv-not-sa08'(suite) -> [];
+'inv-not-sa08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/not-sa08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/not-sa09.xml
+%% ID: inv-not-sa09
+%% Type: invalid
+%% Sections: 2.9
+'inv-not-sa09'(suite) -> [];
+'inv-not-sa09'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/not-sa09.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/not-sa10.xml
+%% ID: inv-not-sa10
+%% Type: invalid
+%% Sections: 2.9
+'inv-not-sa10'(suite) -> [];
+'inv-not-sa10'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/not-sa10.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/not-sa11.xml
+%% ID: inv-not-sa11
+%% Type: invalid
+%% Sections: 2.9
+'inv-not-sa11'(suite) -> [];
+'inv-not-sa11'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/not-sa11.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/not-sa12.xml
+%% ID: inv-not-sa12
+%% Type: invalid
+%% Sections: 2.9
+'inv-not-sa12'(suite) -> [];
+'inv-not-sa12'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/not-sa12.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/not-sa13.xml
+%% ID: inv-not-sa13
+%% Type: invalid
+%% Sections: 2.9
+'inv-not-sa13'(suite) -> [];
+'inv-not-sa13'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/not-sa13.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/not-sa14.xml
+%% ID: inv-not-sa14
+%% Type: invalid
+%% Sections: 3
+'inv-not-sa14'(suite) -> [];
+'inv-not-sa14'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/not-sa14.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/optional01.xml
+%% ID: optional01
+%% Type: invalid
+%% Sections: 3
+'optional01'(suite) -> [];
+'optional01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/optional01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/optional02.xml
+%% ID: optional02
+%% Type: invalid
+%% Sections: 3
+'optional02'(suite) -> [];
+'optional02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/optional02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/optional03.xml
+%% ID: optional03
+%% Type: invalid
+%% Sections: 3
+'optional03'(suite) -> [];
+'optional03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/optional03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/optional04.xml
+%% ID: optional04
+%% Type: invalid
+%% Sections: 3
+'optional04'(suite) -> [];
+'optional04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/optional04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/optional05.xml
+%% ID: optional05
+%% Type: invalid
+%% Sections: 3
+'optional05'(suite) -> [];
+'optional05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/optional05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/optional06.xml
+%% ID: optional06
+%% Type: invalid
+%% Sections: 3
+'optional06'(suite) -> [];
+'optional06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/optional06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/optional07.xml
+%% ID: optional07
+%% Type: invalid
+%% Sections: 3
+'optional07'(suite) -> [];
+'optional07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/optional07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/optional08.xml
+%% ID: optional08
+%% Type: invalid
+%% Sections: 3
+'optional08'(suite) -> [];
+'optional08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/optional08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/optional09.xml
+%% ID: optional09
+%% Type: invalid
+%% Sections: 3
+'optional09'(suite) -> [];
+'optional09'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/optional09.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/optional10.xml
+%% ID: optional10
+%% Type: invalid
+%% Sections: 3
+'optional10'(suite) -> [];
+'optional10'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/optional10.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/optional11.xml
+%% ID: optional11
+%% Type: invalid
+%% Sections: 3
+'optional11'(suite) -> [];
+'optional11'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/optional11.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/optional12.xml
+%% ID: optional12
+%% Type: invalid
+%% Sections: 3
+'optional12'(suite) -> [];
+'optional12'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/optional12.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/optional13.xml
+%% ID: optional13
+%% Type: invalid
+%% Sections: 3
+'optional13'(suite) -> [];
+'optional13'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/optional13.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/optional14.xml
+%% ID: optional14
+%% Type: invalid
+%% Sections: 3
+'optional14'(suite) -> [];
+'optional14'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/optional14.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/optional20.xml
+%% ID: optional20
+%% Type: invalid
+%% Sections: 3
+'optional20'(suite) -> [];
+'optional20'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/optional20.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/optional21.xml
+%% ID: optional21
+%% Type: invalid
+%% Sections: 3
+'optional21'(suite) -> [];
+'optional21'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/optional21.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/optional22.xml
+%% ID: optional22
+%% Type: invalid
+%% Sections: 3
+'optional22'(suite) -> [];
+'optional22'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/optional22.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/optional23.xml
+%% ID: optional23
+%% Type: invalid
+%% Sections: 3
+'optional23'(suite) -> [];
+'optional23'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/optional23.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/optional24.xml
+%% ID: optional24
+%% Type: invalid
+%% Sections: 3
+'optional24'(suite) -> [];
+'optional24'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/optional24.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/optional25.xml
+%% ID: optional25
+%% Type: invalid
+%% Sections: 3
+'optional25'(suite) -> [];
+'optional25'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/optional25.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/required00.xml
+%% ID: inv-required00
+%% Type: invalid
+%% Sections: 3.3.2
+'inv-required00'(suite) -> [];
+'inv-required00'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/required00.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/required01.xml
+%% ID: inv-required01
+%% Type: invalid
+%% Sections: 3.1 2.10
+'inv-required01'(suite) -> [];
+'inv-required01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/required01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/required02.xml
+%% ID: inv-required02
+%% Type: invalid
+%% Sections: 3.1 2.12
+'inv-required02'(suite) -> [];
+'inv-required02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/required02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/root.xml
+%% ID: root
+%% Type: invalid
+%% Sections: 2.8
+'root'(suite) -> [];
+'root'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/root.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/attr01.xml
+%% ID: attr01
+%% Type: invalid
+%% Sections: 3.3.1
+'attr01'(suite) -> [];
+'attr01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/attr01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/attr02.xml
+%% ID: attr02
+%% Type: invalid
+%% Sections: 3.3.1
+'attr02'(suite) -> [];
+'attr02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/attr02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/attr03.xml
+%% ID: attr03
+%% Type: invalid
+%% Sections: 3.3.1
+'attr03'(suite) -> [];
+'attr03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/attr03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/attr04.xml
+%% ID: attr04
+%% Type: invalid
+%% Sections: 3.3.1
+'attr04'(suite) -> [];
+'attr04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/attr04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/attr05.xml
+%% ID: attr05
+%% Type: invalid
+%% Sections: 3.3.1
+'attr05'(suite) -> [];
+'attr05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/attr05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/attr06.xml
+%% ID: attr06
+%% Type: invalid
+%% Sections: 3.3.1
+'attr06'(suite) -> [];
+'attr06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/attr06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/attr07.xml
+%% ID: attr07
+%% Type: invalid
+%% Sections: 3.3.1
+'attr07'(suite) -> [];
+'attr07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/attr07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/attr08.xml
+%% ID: attr08
+%% Type: invalid
+%% Sections: 3.3.2
+'attr08'(suite) -> [];
+'attr08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/attr08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/attr09.xml
+%% ID: attr09
+%% Type: invalid
+%% Sections: 3.3.2
+'attr09'(suite) -> [];
+'attr09'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/attr09.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/attr10.xml
+%% ID: attr10
+%% Type: invalid
+%% Sections: 3.3.2
+'attr10'(suite) -> [];
+'attr10'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/attr10.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/attr11.xml
+%% ID: attr11
+%% Type: invalid
+%% Sections: 3.3.2
+'attr11'(suite) -> [];
+'attr11'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/attr11.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/attr12.xml
+%% ID: attr12
+%% Type: invalid
+%% Sections: 3.3.2
+'attr12'(suite) -> [];
+'attr12'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/attr12.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/attr13.xml
+%% ID: attr13
+%% Type: invalid
+%% Sections: 3.3.2
+'attr13'(suite) -> [];
+'attr13'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/attr13.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/attr14.xml
+%% ID: attr14
+%% Type: invalid
+%% Sections: 3.3.2
+'attr14'(suite) -> [];
+'attr14'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/attr14.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/attr15.xml
+%% ID: attr15
+%% Type: invalid
+%% Sections: 3.3.2
+'attr15'(suite) -> [];
+'attr15'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/attr15.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/attr16.xml
+%% ID: attr16
+%% Type: invalid
+%% Sections: 3.3.2
+'attr16'(suite) -> [];
+'attr16'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/attr16.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/utf16b.xml
+%% ID: utf16b
+%% Type: invalid
+%% Sections: 4.3.3 2.8
+'utf16b'(suite) -> [];
+'utf16b'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/utf16b.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/utf16l.xml
+%% ID: utf16l
+%% Type: invalid
+%% Sections: 4.3.3 2.8
+'utf16l'(suite) -> [];
+'utf16l'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/utf16l.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/empty.xml
+%% ID: empty
+%% Type: invalid
+%% Sections: 2.4 2.7 [18] 3
+'empty'(suite) -> [];
+'empty'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","invalid/empty.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/not-sa03.xml
+%% ID: not-wf-sa03
+%% Type: not-wf
+%% Sections: 2.9
+'not-wf-sa03'(suite) -> [];
+'not-wf-sa03'(Config) -> {skip, "Fix 3"}.
+ %%?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ %%?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/not-sa03.xml"]),
+ %%?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/attlist01.xml
+%% ID: attlist01
+%% Type: not-wf
+%% Sections: 3.3.1 [56]
+'attlist01'(suite) -> [];
+'attlist01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/attlist01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/attlist02.xml
+%% ID: attlist02
+%% Type: not-wf
+%% Sections: 3.3.1 [56]
+'attlist02'(suite) -> [];
+'attlist02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/attlist02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/attlist03.xml
+%% ID: attlist03
+%% Type: not-wf
+%% Sections: 3.3.1 [59]
+'attlist03'(suite) -> [];
+'attlist03'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/attlist03.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/attlist04.xml
+%% ID: attlist04
+%% Type: not-wf
+%% Sections: 3.3.1 [56]
+'attlist04'(suite) -> [];
+'attlist04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/attlist04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/attlist05.xml
+%% ID: attlist05
+%% Type: not-wf
+%% Sections: 3.3.1 [56]
+'attlist05'(suite) -> [];
+'attlist05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/attlist05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/attlist06.xml
+%% ID: attlist06
+%% Type: not-wf
+%% Sections: 3.3.1 [56]
+'attlist06'(suite) -> [];
+'attlist06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/attlist06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/attlist07.xml
+%% ID: attlist07
+%% Type: not-wf
+%% Sections: 3.3.1 [56]
+'attlist07'(suite) -> [];
+'attlist07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/attlist07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/attlist08.xml
+%% ID: attlist08
+%% Type: not-wf
+%% Sections: 3.3.1 [56]
+'attlist08'(suite) -> [];
+'attlist08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/attlist08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/attlist09.xml
+%% ID: attlist09
+%% Type: not-wf
+%% Sections: 3.3.1 [56]
+'attlist09'(suite) -> [];
+'attlist09'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/attlist09.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/attlist10.xml
+%% ID: attlist10
+%% Type: not-wf
+%% Sections: 3.1 [40]
+'attlist10'(suite) -> [];
+'attlist10'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/attlist10.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/attlist11.xml
+%% ID: attlist11
+%% Type: not-wf
+%% Sections: 3.1 [44]
+'attlist11'(suite) -> [];
+'attlist11'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/attlist11.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/cond01.xml
+%% ID: cond01
+%% Type: not-wf
+%% Sections: 3.4 [61]
+'cond01'(suite) -> [];
+'cond01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/cond01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/cond02.xml
+%% ID: cond02
+%% Type: not-wf
+%% Sections: 3.4 [61]
+'cond02'(suite) -> [];
+'cond02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/cond02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/content01.xml
+%% ID: content01
+%% Type: not-wf
+%% Sections: 3.2.1 [48]
+'content01'(suite) -> [];
+'content01'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/content01.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/content02.xml
+%% ID: content02
+%% Type: not-wf
+%% Sections: 3.2.1 [48]
+'content02'(suite) -> [];
+'content02'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/content02.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/content03.xml
+%% ID: content03
+%% Type: not-wf
+%% Sections: 3.2.1 [48]
+'content03'(suite) -> [];
+'content03'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/content03.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/decl01.xml
+%% ID: decl01
+%% Type: not-wf
+%% Sections: 4.3.1 [77]
+'decl01'(suite) -> [];
+'decl01'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/decl01.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/dtd00.xml
+%% ID: nwf-dtd00
+%% Type: not-wf
+%% Sections: 3.2.1 [55]
+'nwf-dtd00'(suite) -> [];
+'nwf-dtd00'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/dtd00.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/dtd01.xml
+%% ID: nwf-dtd01
+%% Type: not-wf
+%% Sections: 3.2.1 [55]
+'nwf-dtd01'(suite) -> [];
+'nwf-dtd01'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/dtd01.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/dtd02.xml
+%% ID: dtd02
+%% Type: not-wf
+%% Sections: 4.1 [69]
+'dtd02'(suite) -> [];
+'dtd02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/dtd02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/dtd03.xml
+%% ID: dtd03
+%% Type: not-wf
+%% Sections: 4.1 [69]
+'dtd03'(suite) -> [];
+'dtd03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/dtd03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/dtd04.xml
+%% ID: dtd04
+%% Type: not-wf
+%% Sections: 4.2.2 [75]
+'dtd04'(suite) -> [];
+'dtd04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/dtd04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/dtd05.xml
+%% ID: dtd05
+%% Type: not-wf
+%% Sections: 4.2.2 [75]
+'dtd05'(suite) -> [];
+'dtd05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/dtd05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/dtd07.xml
+%% ID: dtd07
+%% Type: not-wf
+%% Sections: 4.3.1 [77]
+'dtd07'(suite) -> [];
+'dtd07'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/dtd07.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/element00.xml
+%% ID: element00
+%% Type: not-wf
+%% Sections: 3.1 [42]
+'element00'(suite) -> [];
+'element00'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/element00.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/element01.xml
+%% ID: element01
+%% Type: not-wf
+%% Sections: 3.1 [42]
+'element01'(suite) -> [];
+'element01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/element01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/element02.xml
+%% ID: element02
+%% Type: not-wf
+%% Sections: 3.1 [43]
+'element02'(suite) -> [];
+'element02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/element02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/element03.xml
+%% ID: element03
+%% Type: not-wf
+%% Sections: 3.1 [43]
+'element03'(suite) -> [];
+'element03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/element03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/element04.xml
+%% ID: element04
+%% Type: not-wf
+%% Sections: 3.1 [43]
+'element04'(suite) -> [];
+'element04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/element04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/encoding01.xml
+%% ID: encoding01
+%% Type: not-wf
+%% Sections: 4.3.3 [81]
+'encoding01'(suite) -> [];
+'encoding01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/encoding01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/encoding02.xml
+%% ID: encoding02
+%% Type: not-wf
+%% Sections: 4.3.3 [81]
+'encoding02'(suite) -> [];
+'encoding02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/encoding02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/encoding03.xml
+%% ID: encoding03
+%% Type: not-wf
+%% Sections: 4.3.3 [81]
+'encoding03'(suite) -> [];
+'encoding03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/encoding03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/encoding04.xml
+%% ID: encoding04
+%% Type: not-wf
+%% Sections: 4.3.3 [81]
+'encoding04'(suite) -> [];
+'encoding04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/encoding04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/encoding05.xml
+%% ID: encoding05
+%% Type: not-wf
+%% Sections: 4.3.3 [81]
+'encoding05'(suite) -> [];
+'encoding05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/encoding05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/encoding06.xml
+%% ID: encoding06
+%% Type: not-wf
+%% Sections: 4.3.3 [81]
+'encoding06'(suite) -> [];
+'encoding06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/encoding06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/encoding07.xml
+%% ID: encoding07
+%% Type: not-wf
+%% Sections: 4.3.1 [77]
+'encoding07'(suite) -> [];
+'encoding07'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/encoding07.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/pi.xml
+%% ID: pi
+%% Type: not-wf
+%% Sections: 2.6 [16]
+'pi'(suite) -> [];
+'pi'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/pi.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/pubid01.xml
+%% ID: pubid01
+%% Type: not-wf
+%% Sections: 2.3 [12]
+'pubid01'(suite) -> [];
+'pubid01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/pubid01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/pubid02.xml
+%% ID: pubid02
+%% Type: not-wf
+%% Sections: 2.3 [12]
+'pubid02'(suite) -> [];
+'pubid02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/pubid02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/pubid03.xml
+%% ID: pubid03
+%% Type: not-wf
+%% Sections: 2.3 [12]
+'pubid03'(suite) -> [];
+'pubid03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/pubid03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/pubid04.xml
+%% ID: pubid04
+%% Type: not-wf
+%% Sections: 2.3 [12]
+'pubid04'(suite) -> [];
+'pubid04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/pubid04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/pubid05.xml
+%% ID: pubid05
+%% Type: not-wf
+%% Sections: 2.3 [12]
+'pubid05'(suite) -> [];
+'pubid05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/pubid05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sgml01.xml
+%% ID: sgml01
+%% Type: not-wf
+%% Sections: 3 [39]
+'sgml01'(suite) -> [];
+'sgml01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/sgml01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sgml02.xml
+%% ID: sgml02
+%% Type: not-wf
+%% Sections: 2.8
+'sgml02'(suite) -> [];
+'sgml02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/sgml02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sgml03.xml
+%% ID: sgml03
+%% Type: not-wf
+%% Sections: 2.5 [15]
+'sgml03'(suite) -> [];
+'sgml03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/sgml03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sgml04.xml
+%% ID: sgml04
+%% Type: not-wf
+%% Sections: 3.3 [52]
+'sgml04'(suite) -> [];
+'sgml04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/sgml04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sgml05.xml
+%% ID: sgml05
+%% Type: not-wf
+%% Sections: 3.2 [45]
+'sgml05'(suite) -> [];
+'sgml05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/sgml05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sgml06.xml
+%% ID: sgml06
+%% Type: not-wf
+%% Sections: 3.3 [52]
+'sgml06'(suite) -> [];
+'sgml06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/sgml06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sgml07.xml
+%% ID: sgml07
+%% Type: not-wf
+%% Sections: 3.2 [45]
+'sgml07'(suite) -> [];
+'sgml07'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/sgml07.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sgml08.xml
+%% ID: sgml08
+%% Type: not-wf
+%% Sections: 3.2 [45]
+'sgml08'(suite) -> [];
+'sgml08'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/sgml08.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sgml09.xml
+%% ID: sgml09
+%% Type: not-wf
+%% Sections: 3.2 [45]
+'sgml09'(suite) -> [];
+'sgml09'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/sgml09.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sgml10.xml
+%% ID: sgml10
+%% Type: not-wf
+%% Sections: 3.2 [45]
+'sgml10'(suite) -> [];
+'sgml10'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/sgml10.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sgml11.xml
+%% ID: sgml11
+%% Type: not-wf
+%% Sections: 3.2 [46]
+'sgml11'(suite) -> [];
+'sgml11'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/sgml11.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sgml12.xml
+%% ID: sgml12
+%% Type: not-wf
+%% Sections: 3.2 [46]
+'sgml12'(suite) -> [];
+'sgml12'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/sgml12.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/sgml13.xml
+%% ID: sgml13
+%% Type: not-wf
+%% Sections: 3.2.1 [47]
+'sgml13'(suite) -> [];
+'sgml13'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/sgml13.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/uri01.xml
+%% ID: uri01
+%% Type: error
+%% Sections: 4.2.2 [75]
+'uri01'(suite) -> [];
+'uri01'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"sun","not-wf/uri01.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "error").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: Sun Microsystems XML Tests
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p01pass2.xml
+%% ID: o-p01pass2
+%% Type: valid
+%% Sections: 2.2 [1]
+'o-p01pass2'(suite) -> [];
+'o-p01pass2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p01pass2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p06pass1.xml
+%% ID: o-p06pass1
+%% Type: valid
+%% Sections: 2.3 [6]
+'o-p06pass1'(suite) -> [];
+'o-p06pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p06pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p07pass1.xml
+%% ID: o-p07pass1
+%% Type: valid
+%% Sections: 2.3 [7]
+'o-p07pass1'(suite) -> [];
+'o-p07pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p07pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p08pass1.xml
+%% ID: o-p08pass1
+%% Type: valid
+%% Sections: 2.3 [8]
+'o-p08pass1'(suite) -> [];
+'o-p08pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p08pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p09pass1.xml
+%% ID: o-p09pass1
+%% Type: valid
+%% Sections: 2.3 [9]
+'o-p09pass1'(suite) -> [];
+'o-p09pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p09pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p12pass1.xml
+%% ID: o-p12pass1
+%% Type: valid
+%% Sections: 2.3 [12]
+'o-p12pass1'(suite) -> [];
+'o-p12pass1'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p12pass1.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p22pass4.xml
+%% ID: o-p22pass4
+%% Type: valid
+%% Sections: 2.8 [22]
+'o-p22pass4'(suite) -> [];
+'o-p22pass4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p22pass4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p22pass5.xml
+%% ID: o-p22pass5
+%% Type: valid
+%% Sections: 2.8 [22]
+'o-p22pass5'(suite) -> [];
+'o-p22pass5'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p22pass5.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p22pass6.xml
+%% ID: o-p22pass6
+%% Type: valid
+%% Sections: 2.8 [22]
+'o-p22pass6'(suite) -> [];
+'o-p22pass6'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p22pass6.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p28pass1.xml
+%% ID: o-p28pass1
+%% Type: valid
+%% Sections: 3.1 [43] [44]
+'o-p28pass1'(suite) -> [];
+'o-p28pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p28pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p28pass3.xml
+%% ID: o-p28pass3
+%% Type: valid
+%% Sections: 2.8 4.1 [28] [69]
+'o-p28pass3'(suite) -> [];
+'o-p28pass3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p28pass3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p28pass4.xml
+%% ID: o-p28pass4
+%% Type: valid
+%% Sections: 2.8 4.2.2 [28] [75]
+'o-p28pass4'(suite) -> [];
+'o-p28pass4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p28pass4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p28pass5.xml
+%% ID: o-p28pass5
+%% Type: valid
+%% Sections: 2.8 4.1 [28] [69]
+'o-p28pass5'(suite) -> [];
+'o-p28pass5'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p28pass5.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p29pass1.xml
+%% ID: o-p29pass1
+%% Type: valid
+%% Sections: 2.8 [29]
+'o-p29pass1'(suite) -> [];
+'o-p29pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p29pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p30pass1.xml
+%% ID: o-p30pass1
+%% Type: valid
+%% Sections: 2.8 4.2.2 [30] [75]
+'o-p30pass1'(suite) -> [];
+'o-p30pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p30pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p30pass2.xml
+%% ID: o-p30pass2
+%% Type: valid
+%% Sections: 2.8 4.2.2 4.3.1 [30] [75] [77]
+'o-p30pass2'(suite) -> [];
+'o-p30pass2'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p30pass2.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p31pass1.xml
+%% ID: o-p31pass1
+%% Type: valid
+%% Sections: 2.8 [31]
+'o-p31pass1'(suite) -> [];
+'o-p31pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p31pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p31pass2.xml
+%% ID: o-p31pass2
+%% Type: valid
+%% Sections: 2.8 3.4 4.2.2 [31] [62] [63] [75]
+'o-p31pass2'(suite) -> [];
+'o-p31pass2'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p31pass2.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p43pass1.xml
+%% ID: o-p43pass1
+%% Type: valid
+%% Sections: 2.4 2.5 2.6 2.7 [15] [16] [18]
+'o-p43pass1'(suite) -> [];
+'o-p43pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p43pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p45pass1.xml
+%% ID: o-p45pass1
+%% Type: valid
+%% Sections: 3.2 [45]
+'o-p45pass1'(suite) -> [];
+'o-p45pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p45pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p46pass1.xml
+%% ID: o-p46pass1
+%% Type: valid
+%% Sections: 3.2 3.2.1 3.2.2 [45] [46] [47] [51]
+'o-p46pass1'(suite) -> [];
+'o-p46pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p46pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p47pass1.xml
+%% ID: o-p47pass1
+%% Type: valid
+%% Sections: 3.2 3.2.1 [45] [46] [47]
+'o-p47pass1'(suite) -> [];
+'o-p47pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p47pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p48pass1.xml
+%% ID: o-p48pass1
+%% Type: valid
+%% Sections: 3.2 3.2.1 [45] [46] [47]
+'o-p48pass1'(suite) -> [];
+'o-p48pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p48pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p49pass1.xml
+%% ID: o-p49pass1
+%% Type: valid
+%% Sections: 3.2 3.2.1 [45] [46] [47]
+'o-p49pass1'(suite) -> [];
+'o-p49pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p49pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p50pass1.xml
+%% ID: o-p50pass1
+%% Type: valid
+%% Sections: 3.2 3.2.1 [45] [46] [47]
+'o-p50pass1'(suite) -> [];
+'o-p50pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p50pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p51pass1.xml
+%% ID: o-p51pass1
+%% Type: valid
+%% Sections: 3.2.2 [51]
+'o-p51pass1'(suite) -> [];
+'o-p51pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p51pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p52pass1.xml
+%% ID: o-p52pass1
+%% Type: valid
+%% Sections: 3.3 [52]
+'o-p52pass1'(suite) -> [];
+'o-p52pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p52pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p53pass1.xml
+%% ID: o-p53pass1
+%% Type: valid
+%% Sections: 3.3 [53]
+'o-p53pass1'(suite) -> [];
+'o-p53pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p53pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p54pass1.xml
+%% ID: o-p54pass1
+%% Type: valid
+%% Sections: 3.3.1 [54]
+'o-p54pass1'(suite) -> [];
+'o-p54pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p54pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p55pass1.xml
+%% ID: o-p55pass1
+%% Type: valid
+%% Sections: 3.3.1 [55]
+'o-p55pass1'(suite) -> [];
+'o-p55pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p55pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p56pass1.xml
+%% ID: o-p56pass1
+%% Type: valid
+%% Sections: 3.3.1 [56]
+'o-p56pass1'(suite) -> [];
+'o-p56pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p56pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p57pass1.xml
+%% ID: o-p57pass1
+%% Type: valid
+%% Sections: 3.3.1 [57]
+'o-p57pass1'(suite) -> [];
+'o-p57pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p57pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p58pass1.xml
+%% ID: o-p58pass1
+%% Type: valid
+%% Sections: 3.3.1 [58]
+'o-p58pass1'(suite) -> [];
+'o-p58pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p58pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p59pass1.xml
+%% ID: o-p59pass1
+%% Type: valid
+%% Sections: 3.3.1 [59]
+'o-p59pass1'(suite) -> [];
+'o-p59pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p59pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p60pass1.xml
+%% ID: o-p60pass1
+%% Type: valid
+%% Sections: 3.3.2 [60]
+'o-p60pass1'(suite) -> [];
+'o-p60pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p60pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p61pass1.xml
+%% ID: o-p61pass1
+%% Type: valid
+%% Sections: 3.4 [61]
+'o-p61pass1'(suite) -> [];
+'o-p61pass1'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p61pass1.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p62pass1.xml
+%% ID: o-p62pass1
+%% Type: valid
+%% Sections: 3.4 [62]
+'o-p62pass1'(suite) -> [];
+'o-p62pass1'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p62pass1.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p63pass1.xml
+%% ID: o-p63pass1
+%% Type: valid
+%% Sections: 3.4 [63]
+'o-p63pass1'(suite) -> [];
+'o-p63pass1'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p63pass1.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p64pass1.xml
+%% ID: o-p64pass1
+%% Type: valid
+%% Sections: 3.4 [64]
+'o-p64pass1'(suite) -> [];
+'o-p64pass1'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p64pass1.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p68pass1.xml
+%% ID: o-p68pass1
+%% Type: valid
+%% Sections: 4.1 [68]
+'o-p68pass1'(suite) -> [];
+'o-p68pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p68pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p69pass1.xml
+%% ID: o-p69pass1
+%% Type: valid
+%% Sections: 4.1 [69]
+'o-p69pass1'(suite) -> [];
+'o-p69pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p69pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p70pass1.xml
+%% ID: o-p70pass1
+%% Type: valid
+%% Sections: 4.2 [70]
+'o-p70pass1'(suite) -> [];
+'o-p70pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p70pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p71pass1.xml
+%% ID: o-p71pass1
+%% Type: valid
+%% Sections: 4.2 [71]
+'o-p71pass1'(suite) -> [];
+'o-p71pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p71pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p72pass1.xml
+%% ID: o-p72pass1
+%% Type: valid
+%% Sections: 4.2 [72]
+'o-p72pass1'(suite) -> [];
+'o-p72pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p72pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p73pass1.xml
+%% ID: o-p73pass1
+%% Type: valid
+%% Sections: 4.2 [73]
+'o-p73pass1'(suite) -> [];
+'o-p73pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p73pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p76pass1.xml
+%% ID: o-p76pass1
+%% Type: valid
+%% Sections: 4.2.2 [76]
+'o-p76pass1'(suite) -> [];
+'o-p76pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p76pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p01pass1.xml
+%% ID: o-p01pass1
+%% Type: invalid
+%% Sections: 2.1 [1]
+'o-p01pass1'(suite) -> [];
+'o-p01pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p01pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p01pass3.xml
+%% ID: o-p01pass3
+%% Type: invalid
+%% Sections: 2.1 [1]
+'o-p01pass3'(suite) -> [];
+'o-p01pass3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p01pass3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03pass1.xml
+%% ID: o-p03pass1
+%% Type: invalid
+%% Sections: 2.3 [3]
+'o-p03pass1'(suite) -> [];
+'o-p03pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p04pass1.xml
+%% ID: o-p04pass1
+%% Type: invalid
+%% Sections: 2.3 [4]
+'o-p04pass1'(suite) -> [];
+'o-p04pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p04pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p05pass1.xml
+%% ID: o-p05pass1
+%% Type: invalid
+%% Sections: 2.3 [5]
+'o-p05pass1'(suite) -> [];
+'o-p05pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p05pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p06fail1.xml
+%% ID: o-p06fail1
+%% Type: invalid
+%% Sections: 2.3 [6]
+'o-p06fail1'(suite) -> [];
+'o-p06fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p06fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p08fail1.xml
+%% ID: o-p08fail1
+%% Type: invalid
+%% Sections: 2.3 [8]
+'o-p08fail1'(suite) -> [];
+'o-p08fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p08fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p08fail2.xml
+%% ID: o-p08fail2
+%% Type: invalid
+%% Sections: 2.3 [8]
+'o-p08fail2'(suite) -> [];
+'o-p08fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p08fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p10pass1.xml
+%% ID: o-p10pass1
+%% Type: invalid
+%% Sections: 2.3 [10]
+'o-p10pass1'(suite) -> [];
+'o-p10pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p10pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p14pass1.xml
+%% ID: o-p14pass1
+%% Type: invalid
+%% Sections: 2.4 [14]
+'o-p14pass1'(suite) -> [];
+'o-p14pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p14pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p15pass1.xml
+%% ID: o-p15pass1
+%% Type: invalid
+%% Sections: 2.5 [15]
+'o-p15pass1'(suite) -> [];
+'o-p15pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p15pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p16pass1.xml
+%% ID: o-p16pass1
+%% Type: invalid
+%% Sections: 2.6 [16] [17]
+'o-p16pass1'(suite) -> [];
+'o-p16pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p16pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p16pass2.xml
+%% ID: o-p16pass2
+%% Type: invalid
+%% Sections: 2.6 [16]
+'o-p16pass2'(suite) -> [];
+'o-p16pass2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p16pass2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p16pass3.xml
+%% ID: o-p16pass3
+%% Type: invalid
+%% Sections: 2.6 [16]
+'o-p16pass3'(suite) -> [];
+'o-p16pass3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p16pass3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p18pass1.xml
+%% ID: o-p18pass1
+%% Type: invalid
+%% Sections: 2.7 [18]
+'o-p18pass1'(suite) -> [];
+'o-p18pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p18pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p22pass1.xml
+%% ID: o-p22pass1
+%% Type: invalid
+%% Sections: 2.8 [22]
+'o-p22pass1'(suite) -> [];
+'o-p22pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p22pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p22pass2.xml
+%% ID: o-p22pass2
+%% Type: invalid
+%% Sections: 2.8 [22]
+'o-p22pass2'(suite) -> [];
+'o-p22pass2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p22pass2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p22pass3.xml
+%% ID: o-p22pass3
+%% Type: invalid
+%% Sections: 2.8 [22]
+'o-p22pass3'(suite) -> [];
+'o-p22pass3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p22pass3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p23pass1.xml
+%% ID: o-p23pass1
+%% Type: invalid
+%% Sections: 2.8 [23]
+'o-p23pass1'(suite) -> [];
+'o-p23pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p23pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p23pass2.xml
+%% ID: o-p23pass2
+%% Type: invalid
+%% Sections: 2.8 [23]
+'o-p23pass2'(suite) -> [];
+'o-p23pass2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p23pass2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p23pass3.xml
+%% ID: o-p23pass3
+%% Type: invalid
+%% Sections: 2.8 [23]
+'o-p23pass3'(suite) -> [];
+'o-p23pass3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p23pass3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p23pass4.xml
+%% ID: o-p23pass4
+%% Type: invalid
+%% Sections: 2.8 [23]
+'o-p23pass4'(suite) -> [];
+'o-p23pass4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p23pass4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p24pass1.xml
+%% ID: o-p24pass1
+%% Type: invalid
+%% Sections: 2.8 [24]
+'o-p24pass1'(suite) -> [];
+'o-p24pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p24pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p24pass2.xml
+%% ID: o-p24pass2
+%% Type: invalid
+%% Sections: 2.8 [24]
+'o-p24pass2'(suite) -> [];
+'o-p24pass2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p24pass2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p24pass3.xml
+%% ID: o-p24pass3
+%% Type: invalid
+%% Sections: 2.8 [24]
+'o-p24pass3'(suite) -> [];
+'o-p24pass3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p24pass3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p24pass4.xml
+%% ID: o-p24pass4
+%% Type: invalid
+%% Sections: 2.8 [24]
+'o-p24pass4'(suite) -> [];
+'o-p24pass4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p24pass4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p25pass1.xml
+%% ID: o-p25pass1
+%% Type: invalid
+%% Sections: 2.8 [25]
+'o-p25pass1'(suite) -> [];
+'o-p25pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p25pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p25pass2.xml
+%% ID: o-p25pass2
+%% Type: invalid
+%% Sections: 2.8 [25]
+'o-p25pass2'(suite) -> [];
+'o-p25pass2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p25pass2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p26pass1.xml
+%% ID: o-p26pass1
+%% Type: invalid
+%% Sections: 2.8 [26]
+'o-p26pass1'(suite) -> [];
+'o-p26pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p26pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p27pass1.xml
+%% ID: o-p27pass1
+%% Type: invalid
+%% Sections: 2.8 [27]
+'o-p27pass1'(suite) -> [];
+'o-p27pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p27pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p27pass2.xml
+%% ID: o-p27pass2
+%% Type: invalid
+%% Sections: 2.8 [27]
+'o-p27pass2'(suite) -> [];
+'o-p27pass2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p27pass2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p27pass3.xml
+%% ID: o-p27pass3
+%% Type: invalid
+%% Sections: 2.8 [27]
+'o-p27pass3'(suite) -> [];
+'o-p27pass3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p27pass3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p27pass4.xml
+%% ID: o-p27pass4
+%% Type: invalid
+%% Sections: 2.8 [27]
+'o-p27pass4'(suite) -> [];
+'o-p27pass4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p27pass4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p32pass1.xml
+%% ID: o-p32pass1
+%% Type: invalid
+%% Sections: 2.9 [32]
+'o-p32pass1'(suite) -> [];
+'o-p32pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p32pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p32pass2.xml
+%% ID: o-p32pass2
+%% Type: invalid
+%% Sections: 2.9 [32]
+'o-p32pass2'(suite) -> [];
+'o-p32pass2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p32pass2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p39pass1.xml
+%% ID: o-p39pass1
+%% Type: invalid
+%% Sections: 3 3.1 [39] [44]
+'o-p39pass1'(suite) -> [];
+'o-p39pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p39pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p39pass2.xml
+%% ID: o-p39pass2
+%% Type: invalid
+%% Sections: 3 3.1 [39] [43]
+'o-p39pass2'(suite) -> [];
+'o-p39pass2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p39pass2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p40pass1.xml
+%% ID: o-p40pass1
+%% Type: invalid
+%% Sections: 3.1 [40]
+'o-p40pass1'(suite) -> [];
+'o-p40pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p40pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p40pass2.xml
+%% ID: o-p40pass2
+%% Type: invalid
+%% Sections: 3.1 [40]
+'o-p40pass2'(suite) -> [];
+'o-p40pass2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p40pass2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p40pass3.xml
+%% ID: o-p40pass3
+%% Type: invalid
+%% Sections: 3.1 [40] [41]
+'o-p40pass3'(suite) -> [];
+'o-p40pass3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p40pass3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p40pass4.xml
+%% ID: o-p40pass4
+%% Type: invalid
+%% Sections: 3.1 [40]
+'o-p40pass4'(suite) -> [];
+'o-p40pass4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p40pass4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p41pass1.xml
+%% ID: o-p41pass1
+%% Type: invalid
+%% Sections: 3.1 [41]
+'o-p41pass1'(suite) -> [];
+'o-p41pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p41pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p41pass2.xml
+%% ID: o-p41pass2
+%% Type: invalid
+%% Sections: 3.1 [41]
+'o-p41pass2'(suite) -> [];
+'o-p41pass2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p41pass2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p42pass1.xml
+%% ID: o-p42pass1
+%% Type: invalid
+%% Sections: 3.1 [42]
+'o-p42pass1'(suite) -> [];
+'o-p42pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p42pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p42pass2.xml
+%% ID: o-p42pass2
+%% Type: invalid
+%% Sections: 3.1 [42]
+'o-p42pass2'(suite) -> [];
+'o-p42pass2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p42pass2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p44pass1.xml
+%% ID: o-p44pass1
+%% Type: invalid
+%% Sections: 3.1 [44]
+'o-p44pass1'(suite) -> [];
+'o-p44pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p44pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p44pass2.xml
+%% ID: o-p44pass2
+%% Type: invalid
+%% Sections: 3.1 [44]
+'o-p44pass2'(suite) -> [];
+'o-p44pass2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p44pass2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p44pass3.xml
+%% ID: o-p44pass3
+%% Type: invalid
+%% Sections: 3.1 [44]
+'o-p44pass3'(suite) -> [];
+'o-p44pass3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p44pass3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p44pass4.xml
+%% ID: o-p44pass4
+%% Type: invalid
+%% Sections: 3.1 [44]
+'o-p44pass4'(suite) -> [];
+'o-p44pass4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p44pass4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p44pass5.xml
+%% ID: o-p44pass5
+%% Type: invalid
+%% Sections: 3.1 [44]
+'o-p44pass5'(suite) -> [];
+'o-p44pass5'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p44pass5.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p66pass1.xml
+%% ID: o-p66pass1
+%% Type: invalid
+%% Sections: 4.1 [66]
+'o-p66pass1'(suite) -> [];
+'o-p66pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p66pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p74pass1.xml
+%% ID: o-p74pass1
+%% Type: invalid
+%% Sections: 4.2 [74]
+'o-p74pass1'(suite) -> [];
+'o-p74pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p74pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p75pass1.xml
+%% ID: o-p75pass1
+%% Type: invalid
+%% Sections: 4.2.2 [75]
+'o-p75pass1'(suite) -> [];
+'o-p75pass1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p75pass1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: e2.xml
+%% ID: o-e2
+%% Type: invalid
+%% Sections: 3.3.1 [58] [59] Errata [E2]
+'o-e2'(suite) -> [];
+'o-e2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","e2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p01fail1.xml
+%% ID: o-p01fail1
+%% Type: not-wf
+%% Sections: 2.1 [1]
+'o-p01fail1'(suite) -> [];
+'o-p01fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p01fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p01fail2.xml
+%% ID: o-p01fail2
+%% Type: not-wf
+%% Sections: 2.1 [1]
+'o-p01fail2'(suite) -> [];
+'o-p01fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p01fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p01fail3.xml
+%% ID: o-p01fail3
+%% Type: not-wf
+%% Sections: 2.1 [1]
+'o-p01fail3'(suite) -> [];
+'o-p01fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p01fail3.xml"]),
+ %% Special case becase we returns everything after a legal document
+ %% as an rest instead of giving and error to let the user handle
+ %% multipple docs on a stream.
+ ?line {ok,_, <<"<bad/>", _/binary>>} = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]).
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p01fail4.xml
+%% ID: o-p01fail4
+%% Type: not-wf
+%% Sections: 2.1 [1]
+'o-p01fail4'(suite) -> [];
+'o-p01fail4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p01fail4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail1.xml
+%% ID: o-p02fail1
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail1'(suite) -> [];
+'o-p02fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail10.xml
+%% ID: o-p02fail10
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail10'(suite) -> [];
+'o-p02fail10'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail10.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail11.xml
+%% ID: o-p02fail11
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail11'(suite) -> [];
+'o-p02fail11'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail11.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail12.xml
+%% ID: o-p02fail12
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail12'(suite) -> [];
+'o-p02fail12'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail12.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail13.xml
+%% ID: o-p02fail13
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail13'(suite) -> [];
+'o-p02fail13'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail13.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail14.xml
+%% ID: o-p02fail14
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail14'(suite) -> [];
+'o-p02fail14'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail14.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail15.xml
+%% ID: o-p02fail15
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail15'(suite) -> [];
+'o-p02fail15'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail15.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail16.xml
+%% ID: o-p02fail16
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail16'(suite) -> [];
+'o-p02fail16'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail16.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail17.xml
+%% ID: o-p02fail17
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail17'(suite) -> [];
+'o-p02fail17'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail17.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail18.xml
+%% ID: o-p02fail18
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail18'(suite) -> [];
+'o-p02fail18'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail18.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail19.xml
+%% ID: o-p02fail19
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail19'(suite) -> [];
+'o-p02fail19'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail19.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail2.xml
+%% ID: o-p02fail2
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail2'(suite) -> [];
+'o-p02fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail20.xml
+%% ID: o-p02fail20
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail20'(suite) -> [];
+'o-p02fail20'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail20.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail21.xml
+%% ID: o-p02fail21
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail21'(suite) -> [];
+'o-p02fail21'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail21.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail22.xml
+%% ID: o-p02fail22
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail22'(suite) -> [];
+'o-p02fail22'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail22.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail23.xml
+%% ID: o-p02fail23
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail23'(suite) -> [];
+'o-p02fail23'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail23.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail24.xml
+%% ID: o-p02fail24
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail24'(suite) -> [];
+'o-p02fail24'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail24.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail25.xml
+%% ID: o-p02fail25
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail25'(suite) -> [];
+'o-p02fail25'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail25.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail26.xml
+%% ID: o-p02fail26
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail26'(suite) -> [];
+'o-p02fail26'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail26.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail27.xml
+%% ID: o-p02fail27
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail27'(suite) -> [];
+'o-p02fail27'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail27.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail28.xml
+%% ID: o-p02fail28
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail28'(suite) -> [];
+'o-p02fail28'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail28.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail29.xml
+%% ID: o-p02fail29
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail29'(suite) -> [];
+'o-p02fail29'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail29.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail3.xml
+%% ID: o-p02fail3
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail3'(suite) -> [];
+'o-p02fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail30.xml
+%% ID: o-p02fail30
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail30'(suite) -> [];
+'o-p02fail30'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail30.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail31.xml
+%% ID: o-p02fail31
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail31'(suite) -> [];
+'o-p02fail31'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail31.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail4.xml
+%% ID: o-p02fail4
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail4'(suite) -> [];
+'o-p02fail4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail5.xml
+%% ID: o-p02fail5
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail5'(suite) -> [];
+'o-p02fail5'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail5.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail6.xml
+%% ID: o-p02fail6
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail6'(suite) -> [];
+'o-p02fail6'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail6.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail7.xml
+%% ID: o-p02fail7
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail7'(suite) -> [];
+'o-p02fail7'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail7.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail8.xml
+%% ID: o-p02fail8
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail8'(suite) -> [];
+'o-p02fail8'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail8.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p02fail9.xml
+%% ID: o-p02fail9
+%% Type: not-wf
+%% Sections: 2.2 [2]
+'o-p02fail9'(suite) -> [];
+'o-p02fail9'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p02fail9.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail1.xml
+%% ID: o-p03fail1
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail1'(suite) -> [];
+'o-p03fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail10.xml
+%% ID: o-p03fail10
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail10'(suite) -> [];
+'o-p03fail10'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail10.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail11.xml
+%% ID: o-p03fail11
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail11'(suite) -> [];
+'o-p03fail11'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail11.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail12.xml
+%% ID: o-p03fail12
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail12'(suite) -> [];
+'o-p03fail12'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail12.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail13.xml
+%% ID: o-p03fail13
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail13'(suite) -> [];
+'o-p03fail13'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail13.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail14.xml
+%% ID: o-p03fail14
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail14'(suite) -> [];
+'o-p03fail14'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail14.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail15.xml
+%% ID: o-p03fail15
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail15'(suite) -> [];
+'o-p03fail15'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail15.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail16.xml
+%% ID: o-p03fail16
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail16'(suite) -> [];
+'o-p03fail16'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail16.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail17.xml
+%% ID: o-p03fail17
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail17'(suite) -> [];
+'o-p03fail17'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail17.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail18.xml
+%% ID: o-p03fail18
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail18'(suite) -> [];
+'o-p03fail18'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail18.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail19.xml
+%% ID: o-p03fail19
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail19'(suite) -> [];
+'o-p03fail19'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail19.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail2.xml
+%% ID: o-p03fail2
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail2'(suite) -> [];
+'o-p03fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail20.xml
+%% ID: o-p03fail20
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail20'(suite) -> [];
+'o-p03fail20'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail20.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail21.xml
+%% ID: o-p03fail21
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail21'(suite) -> [];
+'o-p03fail21'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail21.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail22.xml
+%% ID: o-p03fail22
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail22'(suite) -> [];
+'o-p03fail22'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail22.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail23.xml
+%% ID: o-p03fail23
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail23'(suite) -> [];
+'o-p03fail23'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail23.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail24.xml
+%% ID: o-p03fail24
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail24'(suite) -> [];
+'o-p03fail24'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail24.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail25.xml
+%% ID: o-p03fail25
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail25'(suite) -> [];
+'o-p03fail25'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail25.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail26.xml
+%% ID: o-p03fail26
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail26'(suite) -> [];
+'o-p03fail26'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail26.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail27.xml
+%% ID: o-p03fail27
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail27'(suite) -> [];
+'o-p03fail27'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail27.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail28.xml
+%% ID: o-p03fail28
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail28'(suite) -> [];
+'o-p03fail28'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail28.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail29.xml
+%% ID: o-p03fail29
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail29'(suite) -> [];
+'o-p03fail29'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail29.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail3.xml
+%% ID: o-p03fail3
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail3'(suite) -> [];
+'o-p03fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail4.xml
+%% ID: o-p03fail4
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail4'(suite) -> [];
+'o-p03fail4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail5.xml
+%% ID: o-p03fail5
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail5'(suite) -> [];
+'o-p03fail5'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail5.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail7.xml
+%% ID: o-p03fail7
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail7'(suite) -> [];
+'o-p03fail7'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail7.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail8.xml
+%% ID: o-p03fail8
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail8'(suite) -> [];
+'o-p03fail8'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail8.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p03fail9.xml
+%% ID: o-p03fail9
+%% Type: not-wf
+%% Sections: 2.3 [3]
+'o-p03fail9'(suite) -> [];
+'o-p03fail9'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p03fail9.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p04fail1.xml
+%% ID: o-p04fail1
+%% Type: not-wf
+%% Sections: 2.3 [4]
+'o-p04fail1'(suite) -> [];
+'o-p04fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p04fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p04fail2.xml
+%% ID: o-p04fail2
+%% Type: not-wf
+%% Sections: 2.3 [4]
+'o-p04fail2'(suite) -> [];
+'o-p04fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p04fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p04fail3.xml
+%% ID: o-p04fail3
+%% Type: not-wf
+%% Sections: 2.3 [4]
+'o-p04fail3'(suite) -> [];
+'o-p04fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p04fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p05fail1.xml
+%% ID: o-p05fail1
+%% Type: not-wf
+%% Sections: 2.3 [5]
+'o-p05fail1'(suite) -> [];
+'o-p05fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p05fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p05fail2.xml
+%% ID: o-p05fail2
+%% Type: not-wf
+%% Sections: 2.3 [5]
+'o-p05fail2'(suite) -> [];
+'o-p05fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p05fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p05fail3.xml
+%% ID: o-p05fail3
+%% Type: not-wf
+%% Sections: 2.3 [5]
+'o-p05fail3'(suite) -> [];
+'o-p05fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p05fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p05fail4.xml
+%% ID: o-p05fail4
+%% Type: not-wf
+%% Sections: 2.3 [5]
+'o-p05fail4'(suite) -> [];
+'o-p05fail4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p05fail4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p05fail5.xml
+%% ID: o-p05fail5
+%% Type: not-wf
+%% Sections: 2.3 [5]
+'o-p05fail5'(suite) -> [];
+'o-p05fail5'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p05fail5.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p09fail1.xml
+%% ID: o-p09fail1
+%% Type: not-wf
+%% Sections: 2.3 [9]
+'o-p09fail1'(suite) -> [];
+'o-p09fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p09fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p09fail2.xml
+%% ID: o-p09fail2
+%% Type: not-wf
+%% Sections: 2.3 [9]
+'o-p09fail2'(suite) -> [];
+'o-p09fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p09fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p09fail3.xml
+%% ID: o-p09fail3
+%% Type: not-wf
+%% Sections: 2.3 [9]
+'o-p09fail3'(suite) -> [];
+'o-p09fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p09fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p09fail4.xml
+%% ID: o-p09fail4
+%% Type: not-wf
+%% Sections: 2.3 [9]
+'o-p09fail4'(suite) -> [];
+'o-p09fail4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p09fail4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p09fail5.xml
+%% ID: o-p09fail5
+%% Type: not-wf
+%% Sections: 2.3 [9]
+'o-p09fail5'(suite) -> [];
+'o-p09fail5'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p09fail5.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p10fail1.xml
+%% ID: o-p10fail1
+%% Type: not-wf
+%% Sections: 2.3 [10]
+'o-p10fail1'(suite) -> [];
+'o-p10fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p10fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p10fail2.xml
+%% ID: o-p10fail2
+%% Type: not-wf
+%% Sections: 2.3 [10]
+'o-p10fail2'(suite) -> [];
+'o-p10fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p10fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p10fail3.xml
+%% ID: o-p10fail3
+%% Type: not-wf
+%% Sections: 2.3 [10]
+'o-p10fail3'(suite) -> [];
+'o-p10fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p10fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p11fail1.xml
+%% ID: o-p11fail1
+%% Type: not-wf
+%% Sections: 2.3 [11]
+'o-p11fail1'(suite) -> [];
+'o-p11fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p11fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p11fail2.xml
+%% ID: o-p11fail2
+%% Type: not-wf
+%% Sections: 2.3 [11]
+'o-p11fail2'(suite) -> [];
+'o-p11fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p11fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p12fail1.xml
+%% ID: o-p12fail1
+%% Type: not-wf
+%% Sections: 2.3 [12]
+'o-p12fail1'(suite) -> [];
+'o-p12fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p12fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p12fail2.xml
+%% ID: o-p12fail2
+%% Type: not-wf
+%% Sections: 2.3 [12]
+'o-p12fail2'(suite) -> [];
+'o-p12fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p12fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p12fail3.xml
+%% ID: o-p12fail3
+%% Type: not-wf
+%% Sections: 2.3 [12]
+'o-p12fail3'(suite) -> [];
+'o-p12fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p12fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p12fail4.xml
+%% ID: o-p12fail4
+%% Type: not-wf
+%% Sections: 2.3 [12]
+'o-p12fail4'(suite) -> [];
+'o-p12fail4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p12fail4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p12fail5.xml
+%% ID: o-p12fail5
+%% Type: not-wf
+%% Sections: 2.3 [12]
+'o-p12fail5'(suite) -> [];
+'o-p12fail5'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p12fail5.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p12fail6.xml
+%% ID: o-p12fail6
+%% Type: not-wf
+%% Sections: 2.3 [12]
+'o-p12fail6'(suite) -> [];
+'o-p12fail6'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p12fail6.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p12fail7.xml
+%% ID: o-p12fail7
+%% Type: not-wf
+%% Sections: 2.3 [13]
+'o-p12fail7'(suite) -> [];
+'o-p12fail7'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p12fail7.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p14fail1.xml
+%% ID: o-p14fail1
+%% Type: not-wf
+%% Sections: 2.4 [14]
+'o-p14fail1'(suite) -> [];
+'o-p14fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p14fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p14fail2.xml
+%% ID: o-p14fail2
+%% Type: not-wf
+%% Sections: 2.4 [14]
+'o-p14fail2'(suite) -> [];
+'o-p14fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p14fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p14fail3.xml
+%% ID: o-p14fail3
+%% Type: not-wf
+%% Sections: 2.4 [14]
+'o-p14fail3'(suite) -> [];
+'o-p14fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p14fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p15fail1.xml
+%% ID: o-p15fail1
+%% Type: not-wf
+%% Sections: 2.5 [15]
+'o-p15fail1'(suite) -> [];
+'o-p15fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p15fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p15fail2.xml
+%% ID: o-p15fail2
+%% Type: not-wf
+%% Sections: 2.5 [15]
+'o-p15fail2'(suite) -> [];
+'o-p15fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p15fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p15fail3.xml
+%% ID: o-p15fail3
+%% Type: not-wf
+%% Sections: 2.5 [15]
+'o-p15fail3'(suite) -> [];
+'o-p15fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p15fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p16fail1.xml
+%% ID: o-p16fail1
+%% Type: not-wf
+%% Sections: 2.6 [16]
+'o-p16fail1'(suite) -> [];
+'o-p16fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p16fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p16fail2.xml
+%% ID: o-p16fail2
+%% Type: not-wf
+%% Sections: 2.6 [16]
+'o-p16fail2'(suite) -> [];
+'o-p16fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p16fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p16fail3.xml
+%% ID: o-p16fail3
+%% Type: not-wf
+%% Sections: 2.6 [16]
+'o-p16fail3'(suite) -> [];
+'o-p16fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p16fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p18fail1.xml
+%% ID: o-p18fail1
+%% Type: not-wf
+%% Sections: 2.7 [18]
+'o-p18fail1'(suite) -> [];
+'o-p18fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p18fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p18fail2.xml
+%% ID: o-p18fail2
+%% Type: not-wf
+%% Sections: 2.7 [18]
+'o-p18fail2'(suite) -> [];
+'o-p18fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p18fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p18fail3.xml
+%% ID: o-p18fail3
+%% Type: not-wf
+%% Sections: 2.7 [18]
+'o-p18fail3'(suite) -> [];
+'o-p18fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p18fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p22fail1.xml
+%% ID: o-p22fail1
+%% Type: not-wf
+%% Sections: 2.8 [22]
+'o-p22fail1'(suite) -> [];
+'o-p22fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p22fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p22fail2.xml
+%% ID: o-p22fail2
+%% Type: not-wf
+%% Sections: 2.8 [22]
+'o-p22fail2'(suite) -> [];
+'o-p22fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p22fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p23fail1.xml
+%% ID: o-p23fail1
+%% Type: not-wf
+%% Sections: 2.8 [23]
+'o-p23fail1'(suite) -> [];
+'o-p23fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p23fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p23fail2.xml
+%% ID: o-p23fail2
+%% Type: not-wf
+%% Sections: 2.8 [23]
+'o-p23fail2'(suite) -> [];
+'o-p23fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p23fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p23fail3.xml
+%% ID: o-p23fail3
+%% Type: not-wf
+%% Sections: 2.8 [23]
+'o-p23fail3'(suite) -> [];
+'o-p23fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p23fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p23fail4.xml
+%% ID: o-p23fail4
+%% Type: not-wf
+%% Sections: 2.8 [23]
+'o-p23fail4'(suite) -> [];
+'o-p23fail4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p23fail4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p23fail5.xml
+%% ID: o-p23fail5
+%% Type: not-wf
+%% Sections: 2.8 [23]
+'o-p23fail5'(suite) -> [];
+'o-p23fail5'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p23fail5.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p24fail1.xml
+%% ID: o-p24fail1
+%% Type: not-wf
+%% Sections: 2.8 [24]
+'o-p24fail1'(suite) -> [];
+'o-p24fail1'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p24fail1.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p24fail2.xml
+%% ID: o-p24fail2
+%% Type: not-wf
+%% Sections: 2.8 [24]
+'o-p24fail2'(suite) -> [];
+'o-p24fail2'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p24fail2.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p25fail1.xml
+%% ID: o-p25fail1
+%% Type: not-wf
+%% Sections: 2.8 [25]
+'o-p25fail1'(suite) -> [];
+'o-p25fail1'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p25fail1.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p26fail1.xml
+%% ID: o-p26fail1
+%% Type: not-wf
+%% Sections: 2.8 [26]
+'o-p26fail1'(suite) -> [];
+'o-p26fail1'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p26fail1.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p26fail2.xml
+%% ID: o-p26fail2
+%% Type: not-wf
+%% Sections: 2.8 [26]
+'o-p26fail2'(suite) -> [];
+'o-p26fail2'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p26fail2.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p27fail1.xml
+%% ID: o-p27fail1
+%% Type: not-wf
+%% Sections: 2.8 [27]
+'o-p27fail1'(suite) -> [];
+'o-p27fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p27fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p28fail1.xml
+%% ID: o-p28fail1
+%% Type: not-wf
+%% Sections: 2.8 [28]
+'o-p28fail1'(suite) -> [];
+'o-p28fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p28fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p29fail1.xml
+%% ID: o-p29fail1
+%% Type: not-wf
+%% Sections: 2.8 [29]
+'o-p29fail1'(suite) -> [];
+'o-p29fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p29fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p30fail1.xml
+%% ID: o-p30fail1
+%% Type: not-wf
+%% Sections: 2.8 [30]
+'o-p30fail1'(suite) -> [];
+'o-p30fail1'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p30fail1.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p31fail1.xml
+%% ID: o-p31fail1
+%% Type: not-wf
+%% Sections: 2.8 [31]
+'o-p31fail1'(suite) -> [];
+'o-p31fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p31fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p32fail1.xml
+%% ID: o-p32fail1
+%% Type: not-wf
+%% Sections: 2.9 [32]
+'o-p32fail1'(suite) -> [];
+'o-p32fail1'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p32fail1.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p32fail2.xml
+%% ID: o-p32fail2
+%% Type: not-wf
+%% Sections: 2.9 [32]
+'o-p32fail2'(suite) -> [];
+'o-p32fail2'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p32fail2.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p32fail3.xml
+%% ID: o-p32fail3
+%% Type: not-wf
+%% Sections: 2.9 [32]
+'o-p32fail3'(suite) -> [];
+'o-p32fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p32fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p32fail4.xml
+%% ID: o-p32fail4
+%% Type: not-wf
+%% Sections: 2.9 [32]
+'o-p32fail4'(suite) -> [];
+'o-p32fail4'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p32fail4.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p32fail5.xml
+%% ID: o-p32fail5
+%% Type: not-wf
+%% Sections: 2.9 [32]
+'o-p32fail5'(suite) -> [];
+'o-p32fail5'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p32fail5.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p39fail1.xml
+%% ID: o-p39fail1
+%% Type: not-wf
+%% Sections: 3 [39]
+'o-p39fail1'(suite) -> [];
+'o-p39fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p39fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p39fail2.xml
+%% ID: o-p39fail2
+%% Type: not-wf
+%% Sections: 3 [39]
+'o-p39fail2'(suite) -> [];
+'o-p39fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p39fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p39fail3.xml
+%% ID: o-p39fail3
+%% Type: not-wf
+%% Sections: 3 [39]
+'o-p39fail3'(suite) -> [];
+'o-p39fail3'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p39fail3.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p39fail4.xml
+%% ID: o-p39fail4
+%% Type: not-wf
+%% Sections: 2.8 [23]
+'o-p39fail4'(suite) -> [];
+'o-p39fail4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p39fail4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p39fail5.xml
+%% ID: o-p39fail5
+%% Type: not-wf
+%% Sections: 2.8 [23]
+'o-p39fail5'(suite) -> [];
+'o-p39fail5'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p39fail5.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p40fail1.xml
+%% ID: o-p40fail1
+%% Type: not-wf
+%% Sections: 3.1 [40]
+'o-p40fail1'(suite) -> [];
+'o-p40fail1'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p40fail1.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p40fail2.xml
+%% ID: o-p40fail2
+%% Type: not-wf
+%% Sections: 3.1 [40]
+'o-p40fail2'(suite) -> [];
+'o-p40fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p40fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p40fail3.xml
+%% ID: o-p40fail3
+%% Type: not-wf
+%% Sections: 3.1 [40]
+'o-p40fail3'(suite) -> [];
+'o-p40fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p40fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p40fail4.xml
+%% ID: o-p40fail4
+%% Type: not-wf
+%% Sections: 3.1 [40]
+'o-p40fail4'(suite) -> [];
+'o-p40fail4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p40fail4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p41fail1.xml
+%% ID: o-p41fail1
+%% Type: not-wf
+%% Sections: 3.1 [41]
+'o-p41fail1'(suite) -> [];
+'o-p41fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p41fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p41fail2.xml
+%% ID: o-p41fail2
+%% Type: not-wf
+%% Sections: 3.1 [41]
+'o-p41fail2'(suite) -> [];
+'o-p41fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p41fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p41fail3.xml
+%% ID: o-p41fail3
+%% Type: not-wf
+%% Sections: 3.1 [41]
+'o-p41fail3'(suite) -> [];
+'o-p41fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p41fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p42fail1.xml
+%% ID: o-p42fail1
+%% Type: not-wf
+%% Sections: 3.1 [42]
+'o-p42fail1'(suite) -> [];
+'o-p42fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p42fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p42fail2.xml
+%% ID: o-p42fail2
+%% Type: not-wf
+%% Sections: 3.1 [42]
+'o-p42fail2'(suite) -> [];
+'o-p42fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p42fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p42fail3.xml
+%% ID: o-p42fail3
+%% Type: not-wf
+%% Sections: 3.1 [42]
+'o-p42fail3'(suite) -> [];
+'o-p42fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p42fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p43fail1.xml
+%% ID: o-p43fail1
+%% Type: not-wf
+%% Sections: 3.1 [43]
+'o-p43fail1'(suite) -> [];
+'o-p43fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p43fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p43fail2.xml
+%% ID: o-p43fail2
+%% Type: not-wf
+%% Sections: 3.1 [43]
+'o-p43fail2'(suite) -> [];
+'o-p43fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p43fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p43fail3.xml
+%% ID: o-p43fail3
+%% Type: not-wf
+%% Sections: 3.1 [43]
+'o-p43fail3'(suite) -> [];
+'o-p43fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p43fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p44fail1.xml
+%% ID: o-p44fail1
+%% Type: not-wf
+%% Sections: 3.1 [44]
+'o-p44fail1'(suite) -> [];
+'o-p44fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p44fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p44fail2.xml
+%% ID: o-p44fail2
+%% Type: not-wf
+%% Sections: 3.1 [44]
+'o-p44fail2'(suite) -> [];
+'o-p44fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p44fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p44fail3.xml
+%% ID: o-p44fail3
+%% Type: not-wf
+%% Sections: 3.1 [44]
+'o-p44fail3'(suite) -> [];
+'o-p44fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p44fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p44fail4.xml
+%% ID: o-p44fail4
+%% Type: not-wf
+%% Sections: 3.1 [44]
+'o-p44fail4'(suite) -> [];
+'o-p44fail4'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p44fail4.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p44fail5.xml
+%% ID: o-p44fail5
+%% Type: not-wf
+%% Sections: 3.1 [44]
+'o-p44fail5'(suite) -> [];
+'o-p44fail5'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p44fail5.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p45fail1.xml
+%% ID: o-p45fail1
+%% Type: not-wf
+%% Sections: 3.2 [45]
+'o-p45fail1'(suite) -> [];
+'o-p45fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p45fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p45fail2.xml
+%% ID: o-p45fail2
+%% Type: not-wf
+%% Sections: 3.2 [45]
+'o-p45fail2'(suite) -> [];
+'o-p45fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p45fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p45fail3.xml
+%% ID: o-p45fail3
+%% Type: not-wf
+%% Sections: 3.2 [45]
+'o-p45fail3'(suite) -> [];
+'o-p45fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p45fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p45fail4.xml
+%% ID: o-p45fail4
+%% Type: not-wf
+%% Sections: 3.2 [45]
+'o-p45fail4'(suite) -> [];
+'o-p45fail4'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p45fail4.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p46fail1.xml
+%% ID: o-p46fail1
+%% Type: not-wf
+%% Sections: 3.2 [46]
+'o-p46fail1'(suite) -> [];
+'o-p46fail1'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p46fail1.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p46fail2.xml
+%% ID: o-p46fail2
+%% Type: not-wf
+%% Sections: 3.2 [46]
+'o-p46fail2'(suite) -> [];
+'o-p46fail2'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p46fail2.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p46fail3.xml
+%% ID: o-p46fail3
+%% Type: not-wf
+%% Sections: 3.2 [46]
+'o-p46fail3'(suite) -> [];
+'o-p46fail3'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p46fail3.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p46fail4.xml
+%% ID: o-p46fail4
+%% Type: not-wf
+%% Sections: 3.2 [46]
+'o-p46fail4'(suite) -> [];
+'o-p46fail4'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p46fail4.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p46fail5.xml
+%% ID: o-p46fail5
+%% Type: not-wf
+%% Sections: 3.2 [46]
+'o-p46fail5'(suite) -> [];
+'o-p46fail5'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p46fail5.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p46fail6.xml
+%% ID: o-p46fail6
+%% Type: not-wf
+%% Sections: 3.2 [46]
+'o-p46fail6'(suite) -> [];
+'o-p46fail6'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p46fail6.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p47fail1.xml
+%% ID: o-p47fail1
+%% Type: not-wf
+%% Sections: 3.2.1 [47]
+'o-p47fail1'(suite) -> [];
+'o-p47fail1'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p47fail1.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p47fail2.xml
+%% ID: o-p47fail2
+%% Type: not-wf
+%% Sections: 3.2.1 [47]
+'o-p47fail2'(suite) -> [];
+'o-p47fail2'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p47fail2.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p47fail3.xml
+%% ID: o-p47fail3
+%% Type: not-wf
+%% Sections: 3.2.1 [47]
+'o-p47fail3'(suite) -> [];
+'o-p47fail3'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p47fail3.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p47fail4.xml
+%% ID: o-p47fail4
+%% Type: not-wf
+%% Sections: 3.2.1 [47]
+'o-p47fail4'(suite) -> [];
+'o-p47fail4'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p47fail4.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p48fail1.xml
+%% ID: o-p48fail1
+%% Type: not-wf
+%% Sections: 3.2.1 [48]
+'o-p48fail1'(suite) -> [];
+'o-p48fail1'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p48fail1.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p48fail2.xml
+%% ID: o-p48fail2
+%% Type: not-wf
+%% Sections: 3.2.1 [48]
+'o-p48fail2'(suite) -> [];
+'o-p48fail2'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p48fail2.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p49fail1.xml
+%% ID: o-p49fail1
+%% Type: not-wf
+%% Sections: 3.2.1 [49]
+'o-p49fail1'(suite) -> [];
+'o-p49fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p49fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p50fail1.xml
+%% ID: o-p50fail1
+%% Type: not-wf
+%% Sections: 3.2.1 [50]
+'o-p50fail1'(suite) -> [];
+'o-p50fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p50fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p51fail1.xml
+%% ID: o-p51fail1
+%% Type: not-wf
+%% Sections: 3.2.2 [51]
+'o-p51fail1'(suite) -> [];
+'o-p51fail1'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p51fail1.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p51fail2.xml
+%% ID: o-p51fail2
+%% Type: not-wf
+%% Sections: 3.2.2 [51]
+'o-p51fail2'(suite) -> [];
+'o-p51fail2'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p51fail2.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p51fail3.xml
+%% ID: o-p51fail3
+%% Type: not-wf
+%% Sections: 3.2.2 [51]
+'o-p51fail3'(suite) -> [];
+'o-p51fail3'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p51fail3.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p51fail4.xml
+%% ID: o-p51fail4
+%% Type: not-wf
+%% Sections: 3.2.2 [51]
+'o-p51fail4'(suite) -> [];
+'o-p51fail4'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p51fail4.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p51fail5.xml
+%% ID: o-p51fail5
+%% Type: not-wf
+%% Sections: 3.2.2 [51]
+'o-p51fail5'(suite) -> [];
+'o-p51fail5'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p51fail5.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p51fail6.xml
+%% ID: o-p51fail6
+%% Type: not-wf
+%% Sections: 3.2.2 [51]
+'o-p51fail6'(suite) -> [];
+'o-p51fail6'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p51fail6.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p51fail7.xml
+%% ID: o-p51fail7
+%% Type: not-wf
+%% Sections: 3.2.2 [51]
+'o-p51fail7'(suite) -> [];
+'o-p51fail7'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p51fail7.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p52fail1.xml
+%% ID: o-p52fail1
+%% Type: not-wf
+%% Sections: 3.3 [52]
+'o-p52fail1'(suite) -> [];
+'o-p52fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p52fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p52fail2.xml
+%% ID: o-p52fail2
+%% Type: not-wf
+%% Sections: 3.3 [52]
+'o-p52fail2'(suite) -> [];
+'o-p52fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p52fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p53fail1.xml
+%% ID: o-p53fail1
+%% Type: not-wf
+%% Sections: 3.3 [53]
+'o-p53fail1'(suite) -> [];
+'o-p53fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p53fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p53fail2.xml
+%% ID: o-p53fail2
+%% Type: not-wf
+%% Sections: 3.3 [53]
+'o-p53fail2'(suite) -> [];
+'o-p53fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p53fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p53fail3.xml
+%% ID: o-p53fail3
+%% Type: not-wf
+%% Sections: 3.3 [53]
+'o-p53fail3'(suite) -> [];
+'o-p53fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p53fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p53fail4.xml
+%% ID: o-p53fail4
+%% Type: not-wf
+%% Sections: 3.3 [53]
+'o-p53fail4'(suite) -> [];
+'o-p53fail4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p53fail4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p53fail5.xml
+%% ID: o-p53fail5
+%% Type: not-wf
+%% Sections: 3.3 [53]
+'o-p53fail5'(suite) -> [];
+'o-p53fail5'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p53fail5.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p54fail1.xml
+%% ID: o-p54fail1
+%% Type: not-wf
+%% Sections: 3.3.1 [54]
+'o-p54fail1'(suite) -> [];
+'o-p54fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p54fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p55fail1.xml
+%% ID: o-p55fail1
+%% Type: not-wf
+%% Sections: 3.3.1 [55]
+'o-p55fail1'(suite) -> [];
+'o-p55fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p55fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p56fail1.xml
+%% ID: o-p56fail1
+%% Type: not-wf
+%% Sections: 3.3.1 [56]
+'o-p56fail1'(suite) -> [];
+'o-p56fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p56fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p56fail2.xml
+%% ID: o-p56fail2
+%% Type: not-wf
+%% Sections: 3.3.1 [56]
+'o-p56fail2'(suite) -> [];
+'o-p56fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p56fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p56fail3.xml
+%% ID: o-p56fail3
+%% Type: not-wf
+%% Sections: 3.3.1 [56]
+'o-p56fail3'(suite) -> [];
+'o-p56fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p56fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p56fail4.xml
+%% ID: o-p56fail4
+%% Type: not-wf
+%% Sections: 3.3.1 [56]
+'o-p56fail4'(suite) -> [];
+'o-p56fail4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p56fail4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p56fail5.xml
+%% ID: o-p56fail5
+%% Type: not-wf
+%% Sections: 3.3.1 [56]
+'o-p56fail5'(suite) -> [];
+'o-p56fail5'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p56fail5.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p57fail1.xml
+%% ID: o-p57fail1
+%% Type: not-wf
+%% Sections: 3.3.1 [57]
+'o-p57fail1'(suite) -> [];
+'o-p57fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p57fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p58fail1.xml
+%% ID: o-p58fail1
+%% Type: not-wf
+%% Sections: 3.3.1 [58]
+'o-p58fail1'(suite) -> [];
+'o-p58fail1'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p58fail1.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p58fail2.xml
+%% ID: o-p58fail2
+%% Type: not-wf
+%% Sections: 3.3.1 [58]
+'o-p58fail2'(suite) -> [];
+'o-p58fail2'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p58fail2.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p58fail3.xml
+%% ID: o-p58fail3
+%% Type: not-wf
+%% Sections: 3.3.1 [58]
+'o-p58fail3'(suite) -> [];
+'o-p58fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p58fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p58fail4.xml
+%% ID: o-p58fail4
+%% Type: not-wf
+%% Sections: 3.3.1 [58]
+'o-p58fail4'(suite) -> [];
+'o-p58fail4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p58fail4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p58fail5.xml
+%% ID: o-p58fail5
+%% Type: not-wf
+%% Sections: 3.3.1 [58]
+'o-p58fail5'(suite) -> [];
+'o-p58fail5'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p58fail5.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p58fail6.xml
+%% ID: o-p58fail6
+%% Type: not-wf
+%% Sections: 3.3.1 [58]
+'o-p58fail6'(suite) -> [];
+'o-p58fail6'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p58fail6.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p58fail7.xml
+%% ID: o-p58fail7
+%% Type: not-wf
+%% Sections: 3.3.1 [58]
+'o-p58fail7'(suite) -> [];
+'o-p58fail7'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p58fail7.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p58fail8.xml
+%% ID: o-p58fail8
+%% Type: not-wf
+%% Sections: 3.3.1 [58]
+'o-p58fail8'(suite) -> [];
+'o-p58fail8'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p58fail8.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p59fail1.xml
+%% ID: o-p59fail1
+%% Type: not-wf
+%% Sections: 3.3.1 [59]
+'o-p59fail1'(suite) -> [];
+'o-p59fail1'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p59fail1.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p59fail2.xml
+%% ID: o-p59fail2
+%% Type: not-wf
+%% Sections: 3.3.1 [59]
+'o-p59fail2'(suite) -> [];
+'o-p59fail2'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p59fail2.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p59fail3.xml
+%% ID: o-p59fail3
+%% Type: not-wf
+%% Sections: 3.3.1 [59]
+'o-p59fail3'(suite) -> [];
+'o-p59fail3'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p59fail3.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p60fail1.xml
+%% ID: o-p60fail1
+%% Type: not-wf
+%% Sections: 3.3.2 [60]
+'o-p60fail1'(suite) -> [];
+'o-p60fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p60fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p60fail2.xml
+%% ID: o-p60fail2
+%% Type: not-wf
+%% Sections: 3.3.2 [60]
+'o-p60fail2'(suite) -> [];
+'o-p60fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p60fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p60fail3.xml
+%% ID: o-p60fail3
+%% Type: not-wf
+%% Sections: 3.3.2 [60]
+'o-p60fail3'(suite) -> [];
+'o-p60fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p60fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p60fail4.xml
+%% ID: o-p60fail4
+%% Type: not-wf
+%% Sections: 3.3.2 [60]
+'o-p60fail4'(suite) -> [];
+'o-p60fail4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p60fail4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p60fail5.xml
+%% ID: o-p60fail5
+%% Type: not-wf
+%% Sections: 3.3.2 [60]
+'o-p60fail5'(suite) -> [];
+'o-p60fail5'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p60fail5.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p61fail1.xml
+%% ID: o-p61fail1
+%% Type: not-wf
+%% Sections: 3.4 [61]
+'o-p61fail1'(suite) -> [];
+'o-p61fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p61fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p62fail1.xml
+%% ID: o-p62fail1
+%% Type: not-wf
+%% Sections: 3.4 [62]
+'o-p62fail1'(suite) -> [];
+'o-p62fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p62fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p62fail2.xml
+%% ID: o-p62fail2
+%% Type: not-wf
+%% Sections: 3.4 [62]
+'o-p62fail2'(suite) -> [];
+'o-p62fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p62fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p63fail1.xml
+%% ID: o-p63fail1
+%% Type: not-wf
+%% Sections: 3.4 [63]
+'o-p63fail1'(suite) -> [];
+'o-p63fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p63fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p63fail2.xml
+%% ID: o-p63fail2
+%% Type: not-wf
+%% Sections: 3.4 [63]
+'o-p63fail2'(suite) -> [];
+'o-p63fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p63fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p64fail1.xml
+%% ID: o-p64fail1
+%% Type: not-wf
+%% Sections: 3.4 [64]
+'o-p64fail1'(suite) -> [];
+'o-p64fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p64fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p64fail2.xml
+%% ID: o-p64fail2
+%% Type: not-wf
+%% Sections: 3.4 [64]
+'o-p64fail2'(suite) -> [];
+'o-p64fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p64fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p66fail1.xml
+%% ID: o-p66fail1
+%% Type: not-wf
+%% Sections: 4.1 [66]
+'o-p66fail1'(suite) -> [];
+'o-p66fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p66fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p66fail2.xml
+%% ID: o-p66fail2
+%% Type: not-wf
+%% Sections: 4.1 [66]
+'o-p66fail2'(suite) -> [];
+'o-p66fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p66fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p66fail3.xml
+%% ID: o-p66fail3
+%% Type: not-wf
+%% Sections: 4.1 [66]
+'o-p66fail3'(suite) -> [];
+'o-p66fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p66fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p66fail4.xml
+%% ID: o-p66fail4
+%% Type: not-wf
+%% Sections: 4.1 [66]
+'o-p66fail4'(suite) -> [];
+'o-p66fail4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p66fail4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p66fail5.xml
+%% ID: o-p66fail5
+%% Type: not-wf
+%% Sections: 4.1 [66]
+'o-p66fail5'(suite) -> [];
+'o-p66fail5'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p66fail5.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p66fail6.xml
+%% ID: o-p66fail6
+%% Type: not-wf
+%% Sections: 4.1 [66]
+'o-p66fail6'(suite) -> [];
+'o-p66fail6'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p66fail6.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p68fail1.xml
+%% ID: o-p68fail1
+%% Type: not-wf
+%% Sections: 4.1 [68]
+'o-p68fail1'(suite) -> [];
+'o-p68fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p68fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p68fail2.xml
+%% ID: o-p68fail2
+%% Type: not-wf
+%% Sections: 4.1 [68]
+'o-p68fail2'(suite) -> [];
+'o-p68fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p68fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p68fail3.xml
+%% ID: o-p68fail3
+%% Type: not-wf
+%% Sections: 4.1 [68]
+'o-p68fail3'(suite) -> [];
+'o-p68fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p68fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p69fail1.xml
+%% ID: o-p69fail1
+%% Type: not-wf
+%% Sections: 4.1 [69]
+'o-p69fail1'(suite) -> [];
+'o-p69fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p69fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p69fail2.xml
+%% ID: o-p69fail2
+%% Type: not-wf
+%% Sections: 4.1 [69]
+'o-p69fail2'(suite) -> [];
+'o-p69fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p69fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p69fail3.xml
+%% ID: o-p69fail3
+%% Type: not-wf
+%% Sections: 4.1 [69]
+'o-p69fail3'(suite) -> [];
+'o-p69fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p69fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p70fail1.xml
+%% ID: o-p70fail1
+%% Type: not-wf
+%% Sections: 4.2 [70]
+'o-p70fail1'(suite) -> [];
+'o-p70fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p70fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p71fail1.xml
+%% ID: o-p71fail1
+%% Type: not-wf
+%% Sections: 4.2 [71]
+'o-p71fail1'(suite) -> [];
+'o-p71fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p71fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p71fail2.xml
+%% ID: o-p71fail2
+%% Type: not-wf
+%% Sections: 4.2 [71]
+'o-p71fail2'(suite) -> [];
+'o-p71fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p71fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p71fail3.xml
+%% ID: o-p71fail3
+%% Type: not-wf
+%% Sections: 4.2 [71]
+'o-p71fail3'(suite) -> [];
+'o-p71fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p71fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p71fail4.xml
+%% ID: o-p71fail4
+%% Type: not-wf
+%% Sections: 4.2 [71]
+'o-p71fail4'(suite) -> [];
+'o-p71fail4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p71fail4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p72fail1.xml
+%% ID: o-p72fail1
+%% Type: not-wf
+%% Sections: 4.2 [72]
+'o-p72fail1'(suite) -> [];
+'o-p72fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p72fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p72fail2.xml
+%% ID: o-p72fail2
+%% Type: not-wf
+%% Sections: 4.2 [72]
+'o-p72fail2'(suite) -> [];
+'o-p72fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p72fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p72fail3.xml
+%% ID: o-p72fail3
+%% Type: not-wf
+%% Sections: 4.2 [72]
+'o-p72fail3'(suite) -> [];
+'o-p72fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p72fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p72fail4.xml
+%% ID: o-p72fail4
+%% Type: not-wf
+%% Sections: 4.2 [72]
+'o-p72fail4'(suite) -> [];
+'o-p72fail4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p72fail4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p73fail1.xml
+%% ID: o-p73fail1
+%% Type: not-wf
+%% Sections: 4.2 [73]
+'o-p73fail1'(suite) -> [];
+'o-p73fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p73fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p73fail2.xml
+%% ID: o-p73fail2
+%% Type: not-wf
+%% Sections: 4.2 [73]
+'o-p73fail2'(suite) -> [];
+'o-p73fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p73fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p73fail3.xml
+%% ID: o-p73fail3
+%% Type: not-wf
+%% Sections: 4.2 [73]
+'o-p73fail3'(suite) -> [];
+'o-p73fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p73fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p73fail4.xml
+%% ID: o-p73fail4
+%% Type: not-wf
+%% Sections: 4.2 [73]
+'o-p73fail4'(suite) -> [];
+'o-p73fail4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p73fail4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p73fail5.xml
+%% ID: o-p73fail5
+%% Type: not-wf
+%% Sections: 4.2 [73]
+'o-p73fail5'(suite) -> [];
+'o-p73fail5'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p73fail5.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p74fail1.xml
+%% ID: o-p74fail1
+%% Type: not-wf
+%% Sections: 4.2 [74]
+'o-p74fail1'(suite) -> [];
+'o-p74fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p74fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p74fail2.xml
+%% ID: o-p74fail2
+%% Type: not-wf
+%% Sections: 4.2 [74]
+'o-p74fail2'(suite) -> [];
+'o-p74fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p74fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p74fail3.xml
+%% ID: o-p74fail3
+%% Type: not-wf
+%% Sections: 4.2 [74]
+'o-p74fail3'(suite) -> [];
+'o-p74fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p74fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p75fail1.xml
+%% ID: o-p75fail1
+%% Type: not-wf
+%% Sections: 4.2.2 [75]
+'o-p75fail1'(suite) -> [];
+'o-p75fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p75fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p75fail2.xml
+%% ID: o-p75fail2
+%% Type: not-wf
+%% Sections: 4.2.2 [75]
+'o-p75fail2'(suite) -> [];
+'o-p75fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p75fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p75fail3.xml
+%% ID: o-p75fail3
+%% Type: not-wf
+%% Sections: 4.2.2 [75]
+'o-p75fail3'(suite) -> [];
+'o-p75fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p75fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p75fail4.xml
+%% ID: o-p75fail4
+%% Type: not-wf
+%% Sections: 4.2.2 [75]
+'o-p75fail4'(suite) -> [];
+'o-p75fail4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p75fail4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p75fail5.xml
+%% ID: o-p75fail5
+%% Type: not-wf
+%% Sections: 4.2.2 [75]
+'o-p75fail5'(suite) -> [];
+'o-p75fail5'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p75fail5.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p75fail6.xml
+%% ID: o-p75fail6
+%% Type: not-wf
+%% Sections: 4.2.2 [75]
+'o-p75fail6'(suite) -> [];
+'o-p75fail6'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p75fail6.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p76fail1.xml
+%% ID: o-p76fail1
+%% Type: not-wf
+%% Sections: 4.2.2 [76]
+'o-p76fail1'(suite) -> [];
+'o-p76fail1'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p76fail1.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p76fail2.xml
+%% ID: o-p76fail2
+%% Type: not-wf
+%% Sections: 4.2.2 [76]
+'o-p76fail2'(suite) -> [];
+'o-p76fail2'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p76fail2.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p76fail3.xml
+%% ID: o-p76fail3
+%% Type: not-wf
+%% Sections: 4.2.2 [76]
+'o-p76fail3'(suite) -> [];
+'o-p76fail3'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p76fail3.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p76fail4.xml
+%% ID: o-p76fail4
+%% Type: not-wf
+%% Sections: 4.2.2 [76]
+'o-p76fail4'(suite) -> [];
+'o-p76fail4'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p76fail4.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: p11pass1.xml
+%% ID: o-p11pass1
+%% Type: error
+%% Sections: 2.3, 4.2.2 [11]
+'o-p11pass1'(suite) -> [];
+'o-p11pass1'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"oasis","p11pass1.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "error").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: OASIS/NIST TESTS, 1-Nov-1998
+
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: OASIS/NIST XML 1.0 Tests
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P28/ibm28i01.xml
+%% ID: ibm-invalid-P28-ibm28i01.xml
+%% Type: invalid
+%% Sections: 2.8
+'ibm-invalid-P28-ibm28i01'(suite) -> [];
+'ibm-invalid-P28-ibm28i01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P28/ibm28i01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 28
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P32/ibm32i01.xml
+%% ID: ibm-invalid-P32-ibm32i01.xml
+%% Type: invalid
+%% Sections: 2.9
+'ibm-invalid-P32-ibm32i01'(suite) -> [];
+'ibm-invalid-P32-ibm32i01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P32/ibm32i01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P32/ibm32i03.xml
+%% ID: ibm-invalid-P32-ibm32i03.xml
+%% Type: invalid
+%% Sections: 2.9
+'ibm-invalid-P32-ibm32i03'(suite) -> [];
+'ibm-invalid-P32-ibm32i03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P32/ibm32i03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P32/ibm32i04.xml
+%% ID: ibm-invalid-P32-ibm32i04.xml
+%% Type: invalid
+%% Sections: 2.9
+'ibm-invalid-P32-ibm32i04'(suite) -> [];
+'ibm-invalid-P32-ibm32i04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P32/ibm32i04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 32
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P39/ibm39i01.xml
+%% ID: ibm-invalid-P39-ibm39i01.xml
+%% Type: invalid
+%% Sections: 3
+'ibm-invalid-P39-ibm39i01'(suite) -> [];
+'ibm-invalid-P39-ibm39i01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P39/ibm39i01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P39/ibm39i02.xml
+%% ID: ibm-invalid-P39-ibm39i02.xml
+%% Type: invalid
+%% Sections: 3
+'ibm-invalid-P39-ibm39i02'(suite) -> [];
+'ibm-invalid-P39-ibm39i02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P39/ibm39i02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P39/ibm39i03.xml
+%% ID: ibm-invalid-P39-ibm39i03.xml
+%% Type: invalid
+%% Sections: 3
+'ibm-invalid-P39-ibm39i03'(suite) -> [];
+'ibm-invalid-P39-ibm39i03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P39/ibm39i03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P39/ibm39i04.xml
+%% ID: ibm-invalid-P39-ibm39i04.xml
+%% Type: invalid
+%% Sections: 3
+'ibm-invalid-P39-ibm39i04'(suite) -> [];
+'ibm-invalid-P39-ibm39i04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P39/ibm39i04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 39
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P41/ibm41i01.xml
+%% ID: ibm-invalid-P41-ibm41i01.xml
+%% Type: invalid
+%% Sections: 3.1
+'ibm-invalid-P41-ibm41i01'(suite) -> [];
+'ibm-invalid-P41-ibm41i01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P41/ibm41i01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P41/ibm41i02.xml
+%% ID: ibm-invalid-P41-ibm41i02.xml
+%% Type: invalid
+%% Sections: 3.1
+'ibm-invalid-P41-ibm41i02'(suite) -> [];
+'ibm-invalid-P41-ibm41i02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P41/ibm41i02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 41
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P45/ibm45i01.xml
+%% ID: ibm-invalid-P45-ibm45i01.xml
+%% Type: invalid
+%% Sections: 3.2
+'ibm-invalid-P45-ibm45i01'(suite) -> [];
+'ibm-invalid-P45-ibm45i01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P45/ibm45i01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 45
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P49/ibm49i01.xml
+%% ID: ibm-invalid-P49-ibm49i01.xml
+%% Type: invalid
+%% Sections: 3.2.1
+'ibm-invalid-P49-ibm49i01'(suite) -> [];
+'ibm-invalid-P49-ibm49i01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P49/ibm49i01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 49
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P50/ibm50i01.xml
+%% ID: ibm-invalid-P50-ibm50i01.xml
+%% Type: invalid
+%% Sections: 3.2.1
+'ibm-invalid-P50-ibm50i01'(suite) -> [];
+'ibm-invalid-P50-ibm50i01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P50/ibm50i01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 50
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P51/ibm51i01.xml
+%% ID: ibm-invalid-P51-ibm51i01.xml
+%% Type: invalid
+%% Sections: 3.2.2
+'ibm-invalid-P51-ibm51i01'(suite) -> [];
+'ibm-invalid-P51-ibm51i01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P51/ibm51i01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P51/ibm51i03.xml
+%% ID: ibm-invalid-P51-ibm51i03.xml
+%% Type: invalid
+%% Sections: 3.2.2
+'ibm-invalid-P51-ibm51i03'(suite) -> [];
+'ibm-invalid-P51-ibm51i03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P51/ibm51i03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 51
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P56/ibm56i01.xml
+%% ID: ibm-invalid-P56-ibm56i01.xml
+%% Type: invalid
+%% Sections: 3.3.1
+'ibm-invalid-P56-ibm56i01'(suite) -> [];
+'ibm-invalid-P56-ibm56i01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P56/ibm56i01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P56/ibm56i02.xml
+%% ID: ibm-invalid-P56-ibm56i02.xml
+%% Type: invalid
+%% Sections: 3.3.1
+'ibm-invalid-P56-ibm56i02'(suite) -> [];
+'ibm-invalid-P56-ibm56i02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P56/ibm56i02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P56/ibm56i03.xml
+%% ID: ibm-invalid-P56-ibm56i03.xml
+%% Type: invalid
+%% Sections: 3.3.1
+'ibm-invalid-P56-ibm56i03'(suite) -> [];
+'ibm-invalid-P56-ibm56i03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P56/ibm56i03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P56/ibm56i05.xml
+%% ID: ibm-invalid-P56-ibm56i05.xml
+%% Type: invalid
+%% Sections: 3.3.1
+'ibm-invalid-P56-ibm56i05'(suite) -> [];
+'ibm-invalid-P56-ibm56i05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P56/ibm56i05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P56/ibm56i06.xml
+%% ID: ibm-invalid-P56-ibm56i06.xml
+%% Type: invalid
+%% Sections: 3.3.1
+'ibm-invalid-P56-ibm56i06'(suite) -> [];
+'ibm-invalid-P56-ibm56i06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P56/ibm56i06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P56/ibm56i07.xml
+%% ID: ibm-invalid-P56-ibm56i07.xml
+%% Type: invalid
+%% Sections: 3.3.1
+'ibm-invalid-P56-ibm56i07'(suite) -> [];
+'ibm-invalid-P56-ibm56i07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P56/ibm56i07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P56/ibm56i08.xml
+%% ID: ibm-invalid-P56-ibm56i08.xml
+%% Type: invalid
+%% Sections: 3.3.1
+'ibm-invalid-P56-ibm56i08'(suite) -> [];
+'ibm-invalid-P56-ibm56i08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P56/ibm56i08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P56/ibm56i09.xml
+%% ID: ibm-invalid-P56-ibm56i09.xml
+%% Type: invalid
+%% Sections: 3.3.1
+'ibm-invalid-P56-ibm56i09'(suite) -> [];
+'ibm-invalid-P56-ibm56i09'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P56/ibm56i09.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P56/ibm56i10.xml
+%% ID: ibm-invalid-P56-ibm56i10.xml
+%% Type: invalid
+%% Sections: 3.3.1
+'ibm-invalid-P56-ibm56i10'(suite) -> [];
+'ibm-invalid-P56-ibm56i10'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P56/ibm56i10.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P56/ibm56i11.xml
+%% ID: ibm-invalid-P56-ibm56i11.xml
+%% Type: invalid
+%% Sections: 3.3.1
+'ibm-invalid-P56-ibm56i11'(suite) -> [];
+'ibm-invalid-P56-ibm56i11'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P56/ibm56i11.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P56/ibm56i12.xml
+%% ID: ibm-invalid-P56-ibm56i12.xml
+%% Type: invalid
+%% Sections: 3.3.1
+'ibm-invalid-P56-ibm56i12'(suite) -> [];
+'ibm-invalid-P56-ibm56i12'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P56/ibm56i12.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P56/ibm56i13.xml
+%% ID: ibm-invalid-P56-ibm56i13.xml
+%% Type: invalid
+%% Sections: 3.3.1
+'ibm-invalid-P56-ibm56i13'(suite) -> [];
+'ibm-invalid-P56-ibm56i13'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P56/ibm56i13.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P56/ibm56i14.xml
+%% ID: ibm-invalid-P56-ibm56i14.xml
+%% Type: invalid
+%% Sections: 3.3.1
+'ibm-invalid-P56-ibm56i14'(suite) -> [];
+'ibm-invalid-P56-ibm56i14'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P56/ibm56i14.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P56/ibm56i15.xml
+%% ID: ibm-invalid-P56-ibm56i15.xml
+%% Type: invalid
+%% Sections: 3.3.1
+'ibm-invalid-P56-ibm56i15'(suite) -> [];
+'ibm-invalid-P56-ibm56i15'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P56/ibm56i15.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P56/ibm56i16.xml
+%% ID: ibm-invalid-P56-ibm56i16.xml
+%% Type: invalid
+%% Sections: 3.3.1
+'ibm-invalid-P56-ibm56i16'(suite) -> [];
+'ibm-invalid-P56-ibm56i16'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P56/ibm56i16.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P56/ibm56i17.xml
+%% ID: ibm-invalid-P56-ibm56i17.xml
+%% Type: invalid
+%% Sections: 3.3.1
+'ibm-invalid-P56-ibm56i17'(suite) -> [];
+'ibm-invalid-P56-ibm56i17'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P56/ibm56i17.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P56/ibm56i18.xml
+%% ID: ibm-invalid-P56-ibm56i18.xml
+%% Type: invalid
+%% Sections: 3.3.1
+'ibm-invalid-P56-ibm56i18'(suite) -> [];
+'ibm-invalid-P56-ibm56i18'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P56/ibm56i18.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 56
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P58/ibm58i01.xml
+%% ID: ibm-invalid-P58-ibm58i01.xml
+%% Type: invalid
+%% Sections: 3.3.1
+'ibm-invalid-P58-ibm58i01'(suite) -> [];
+'ibm-invalid-P58-ibm58i01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P58/ibm58i01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P58/ibm58i02.xml
+%% ID: ibm-invalid-P58-ibm58i02.xml
+%% Type: invalid
+%% Sections: 3.3.1
+'ibm-invalid-P58-ibm58i02'(suite) -> [];
+'ibm-invalid-P58-ibm58i02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P58/ibm58i02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 58
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P59/ibm59i01.xml
+%% ID: ibm-invalid-P59-ibm59i01.xml
+%% Type: invalid
+%% Sections: 3.3.1
+'ibm-invalid-P59-ibm59i01'(suite) -> [];
+'ibm-invalid-P59-ibm59i01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P59/ibm59i01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 59
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P60/ibm60i01.xml
+%% ID: ibm-invalid-P60-ibm60i01.xml
+%% Type: invalid
+%% Sections: 3.3.2
+'ibm-invalid-P60-ibm60i01'(suite) -> [];
+'ibm-invalid-P60-ibm60i01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P60/ibm60i01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P60/ibm60i02.xml
+%% ID: ibm-invalid-P60-ibm60i02.xml
+%% Type: invalid
+%% Sections: 3.3.2
+'ibm-invalid-P60-ibm60i02'(suite) -> [];
+'ibm-invalid-P60-ibm60i02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P60/ibm60i02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P60/ibm60i03.xml
+%% ID: ibm-invalid-P60-ibm60i03.xml
+%% Type: invalid
+%% Sections: 3.3.2
+'ibm-invalid-P60-ibm60i03'(suite) -> [];
+'ibm-invalid-P60-ibm60i03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P60/ibm60i03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P60/ibm60i04.xml
+%% ID: ibm-invalid-P60-ibm60i04.xml
+%% Type: invalid
+%% Sections: 3.3.2
+'ibm-invalid-P60-ibm60i04'(suite) -> [];
+'ibm-invalid-P60-ibm60i04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P60/ibm60i04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 60
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P68/ibm68i01.xml
+%% ID: ibm-invalid-P68-ibm68i01.xml
+%% Type: error
+%% Sections: 4.1
+'ibm-invalid-P68-ibm68i01'(suite) -> [];
+'ibm-invalid-P68-ibm68i01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P68/ibm68i01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "error").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P68/ibm68i02.xml
+%% ID: ibm-invalid-P68-ibm68i02.xml
+%% Type: error
+%% Sections: 4.1
+'ibm-invalid-P68-ibm68i02'(suite) -> [];
+'ibm-invalid-P68-ibm68i02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P68/ibm68i02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "error").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P68/ibm68i03.xml
+%% ID: ibm-invalid-P68-ibm68i03.xml
+%% Type: error
+%% Sections: 4.1
+'ibm-invalid-P68-ibm68i03'(suite) -> [];
+'ibm-invalid-P68-ibm68i03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P68/ibm68i03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "error").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P68/ibm68i04.xml
+%% ID: ibm-invalid-P68-ibm68i04.xml
+%% Type: error
+%% Sections: 4.1
+'ibm-invalid-P68-ibm68i04'(suite) -> [];
+'ibm-invalid-P68-ibm68i04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P68/ibm68i04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "error").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 68
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P69/ibm69i01.xml
+%% ID: ibm-invalid-P69-ibm69i01.xml
+%% Type: error
+%% Sections: 4.1
+'ibm-invalid-P69-ibm69i01'(suite) -> [];
+'ibm-invalid-P69-ibm69i01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P69/ibm69i01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "error").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P69/ibm69i02.xml
+%% ID: ibm-invalid-P69-ibm69i02.xml
+%% Type: error
+%% Sections: 4.1
+'ibm-invalid-P69-ibm69i02'(suite) -> [];
+'ibm-invalid-P69-ibm69i02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P69/ibm69i02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "error").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P69/ibm69i03.xml
+%% ID: ibm-invalid-P69-ibm69i03.xml
+%% Type: error
+%% Sections: 4.1
+'ibm-invalid-P69-ibm69i03'(suite) -> [];
+'ibm-invalid-P69-ibm69i03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P69/ibm69i03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "error").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P69/ibm69i04.xml
+%% ID: ibm-invalid-P69-ibm69i04.xml
+%% Type: error
+%% Sections: 4.1
+'ibm-invalid-P69-ibm69i04'(suite) -> [];
+'ibm-invalid-P69-ibm69i04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P69/ibm69i04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "error").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 69
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: invalid/P76/ibm76i01.xml
+%% ID: ibm-invalid-P76-ibm76i01.xml
+%% Type: invalid
+%% Sections: 4.2.2
+'ibm-invalid-P76-ibm76i01'(suite) -> [];
+'ibm-invalid-P76-ibm76i01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","invalid/P76/ibm76i01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "invalid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 76
+
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - invalid tests
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P01/ibm01n01.xml
+%% ID: ibm-not-wf-P01-ibm01n01.xml
+%% Type: not-wf
+%% Sections: 2.1
+'ibm-not-wf-P01-ibm01n01'(suite) -> [];
+'ibm-not-wf-P01-ibm01n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P01/ibm01n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P01/ibm01n02.xml
+%% ID: ibm-not-wf-P01-ibm01n02.xml
+%% Type: not-wf
+%% Sections: 2.1
+'ibm-not-wf-P01-ibm01n02'(suite) -> [];
+'ibm-not-wf-P01-ibm01n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P01/ibm01n02.xml"]),
+ %% Special case becase we returns everything after a legal document
+ %% as an rest instead of giving and error to let the user handle
+ %% multipple docs on a stream.
+ ?line {ok,_, <<"xml version=\"1.0\"?>", _/binary>>} = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]).
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P01/ibm01n03.xml
+%% ID: ibm-not-wf-P01-ibm01n03.xml
+%% Type: not-wf
+%% Sections: 2.1
+'ibm-not-wf-P01-ibm01n03'(suite) -> [];
+'ibm-not-wf-P01-ibm01n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P01/ibm01n03.xml"]),
+ %% Special case becase we returns everything after a legal document
+ %% as an rest instead of giving and error to let the user handle
+ %% multipple docs on a stream.
+ ?line {ok,_, <<"<title>Wrong combination!</title>", _/binary>>} = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]).
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 1
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n01.xml
+%% ID: ibm-not-wf-P02-ibm02n01.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n01'(suite) -> [];
+'ibm-not-wf-P02-ibm02n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n02.xml
+%% ID: ibm-not-wf-P02-ibm02n02.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n02'(suite) -> [];
+'ibm-not-wf-P02-ibm02n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n03.xml
+%% ID: ibm-not-wf-P02-ibm02n03.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n03'(suite) -> [];
+'ibm-not-wf-P02-ibm02n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n04.xml
+%% ID: ibm-not-wf-P02-ibm02n04.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n04'(suite) -> [];
+'ibm-not-wf-P02-ibm02n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n05.xml
+%% ID: ibm-not-wf-P02-ibm02n05.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n05'(suite) -> [];
+'ibm-not-wf-P02-ibm02n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n06.xml
+%% ID: ibm-not-wf-P02-ibm02n06.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n06'(suite) -> [];
+'ibm-not-wf-P02-ibm02n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n07.xml
+%% ID: ibm-not-wf-P02-ibm02n07.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n07'(suite) -> [];
+'ibm-not-wf-P02-ibm02n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n08.xml
+%% ID: ibm-not-wf-P02-ibm02n08.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n08'(suite) -> [];
+'ibm-not-wf-P02-ibm02n08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n09.xml
+%% ID: ibm-not-wf-P02-ibm02n09.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n09'(suite) -> [];
+'ibm-not-wf-P02-ibm02n09'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n09.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n10.xml
+%% ID: ibm-not-wf-P02-ibm02n10.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n10'(suite) -> [];
+'ibm-not-wf-P02-ibm02n10'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n10.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n11.xml
+%% ID: ibm-not-wf-P02-ibm02n11.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n11'(suite) -> [];
+'ibm-not-wf-P02-ibm02n11'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n11.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n12.xml
+%% ID: ibm-not-wf-P02-ibm02n12.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n12'(suite) -> [];
+'ibm-not-wf-P02-ibm02n12'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n12.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n13.xml
+%% ID: ibm-not-wf-P02-ibm02n13.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n13'(suite) -> [];
+'ibm-not-wf-P02-ibm02n13'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n13.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n14.xml
+%% ID: ibm-not-wf-P02-ibm02n14.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n14'(suite) -> [];
+'ibm-not-wf-P02-ibm02n14'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n14.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n15.xml
+%% ID: ibm-not-wf-P02-ibm02n15.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n15'(suite) -> [];
+'ibm-not-wf-P02-ibm02n15'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n15.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n16.xml
+%% ID: ibm-not-wf-P02-ibm02n16.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n16'(suite) -> [];
+'ibm-not-wf-P02-ibm02n16'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n16.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n17.xml
+%% ID: ibm-not-wf-P02-ibm02n17.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n17'(suite) -> [];
+'ibm-not-wf-P02-ibm02n17'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n17.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n18.xml
+%% ID: ibm-not-wf-P02-ibm02n18.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n18'(suite) -> [];
+'ibm-not-wf-P02-ibm02n18'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n18.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n19.xml
+%% ID: ibm-not-wf-P02-ibm02n19.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n19'(suite) -> [];
+'ibm-not-wf-P02-ibm02n19'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n19.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n20.xml
+%% ID: ibm-not-wf-P02-ibm02n20.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n20'(suite) -> [];
+'ibm-not-wf-P02-ibm02n20'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n20.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n21.xml
+%% ID: ibm-not-wf-P02-ibm02n21.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n21'(suite) -> [];
+'ibm-not-wf-P02-ibm02n21'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n21.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n22.xml
+%% ID: ibm-not-wf-P02-ibm02n22.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n22'(suite) -> [];
+'ibm-not-wf-P02-ibm02n22'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n22.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n23.xml
+%% ID: ibm-not-wf-P02-ibm02n23.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n23'(suite) -> [];
+'ibm-not-wf-P02-ibm02n23'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n23.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n24.xml
+%% ID: ibm-not-wf-P02-ibm02n24.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n24'(suite) -> [];
+'ibm-not-wf-P02-ibm02n24'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n24.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n25.xml
+%% ID: ibm-not-wf-P02-ibm02n25.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n25'(suite) -> [];
+'ibm-not-wf-P02-ibm02n25'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n25.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n26.xml
+%% ID: ibm-not-wf-P02-ibm02n26.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n26'(suite) -> [];
+'ibm-not-wf-P02-ibm02n26'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n26.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n27.xml
+%% ID: ibm-not-wf-P02-ibm02n27.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n27'(suite) -> [];
+'ibm-not-wf-P02-ibm02n27'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n27.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n28.xml
+%% ID: ibm-not-wf-P02-ibm02n28.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n28'(suite) -> [];
+'ibm-not-wf-P02-ibm02n28'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n28.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n29.xml
+%% ID: ibm-not-wf-P02-ibm02n29.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n29'(suite) -> [];
+'ibm-not-wf-P02-ibm02n29'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n29.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n30.xml
+%% ID: ibm-not-wf-P02-ibm02n30.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n30'(suite) -> [];
+'ibm-not-wf-P02-ibm02n30'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n30.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n31.xml
+%% ID: ibm-not-wf-P02-ibm02n31.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n31'(suite) -> [];
+'ibm-not-wf-P02-ibm02n31'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n31.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n32.xml
+%% ID: ibm-not-wf-P02-ibm02n32.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n32'(suite) -> [];
+'ibm-not-wf-P02-ibm02n32'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n32.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P02/ibm02n33.xml
+%% ID: ibm-not-wf-P02-ibm02n33.xml
+%% Type: not-wf
+%% Sections: 2.2
+'ibm-not-wf-P02-ibm02n33'(suite) -> [];
+'ibm-not-wf-P02-ibm02n33'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P02/ibm02n33.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 2
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P03/ibm03n01.xml
+%% ID: ibm-not-wf-P03-ibm03n01.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P03-ibm03n01'(suite) -> [];
+'ibm-not-wf-P03-ibm03n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P03/ibm03n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 3
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P04/ibm04n01.xml
+%% ID: ibm-not-wf-P04-ibm04n01.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P04-ibm04n01'(suite) -> [];
+'ibm-not-wf-P04-ibm04n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P04/ibm04n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P04/ibm04n02.xml
+%% ID: ibm-not-wf-P04-ibm04n02.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P04-ibm04n02'(suite) -> [];
+'ibm-not-wf-P04-ibm04n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P04/ibm04n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P04/ibm04n03.xml
+%% ID: ibm-not-wf-P04-ibm04n03.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P04-ibm04n03'(suite) -> [];
+'ibm-not-wf-P04-ibm04n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P04/ibm04n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P04/ibm04n04.xml
+%% ID: ibm-not-wf-P04-ibm04n04.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P04-ibm04n04'(suite) -> [];
+'ibm-not-wf-P04-ibm04n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P04/ibm04n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P04/ibm04n05.xml
+%% ID: ibm-not-wf-P04-ibm04n05.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P04-ibm04n05'(suite) -> [];
+'ibm-not-wf-P04-ibm04n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P04/ibm04n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P04/ibm04n06.xml
+%% ID: ibm-not-wf-P04-ibm04n06.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P04-ibm04n06'(suite) -> [];
+'ibm-not-wf-P04-ibm04n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P04/ibm04n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P04/ibm04n07.xml
+%% ID: ibm-not-wf-P04-ibm04n07.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P04-ibm04n07'(suite) -> [];
+'ibm-not-wf-P04-ibm04n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P04/ibm04n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P04/ibm04n08.xml
+%% ID: ibm-not-wf-P04-ibm04n08.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P04-ibm04n08'(suite) -> [];
+'ibm-not-wf-P04-ibm04n08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P04/ibm04n08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P04/ibm04n09.xml
+%% ID: ibm-not-wf-P04-ibm04n09.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P04-ibm04n09'(suite) -> [];
+'ibm-not-wf-P04-ibm04n09'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P04/ibm04n09.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P04/ibm04n10.xml
+%% ID: ibm-not-wf-P04-ibm04n10.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P04-ibm04n10'(suite) -> [];
+'ibm-not-wf-P04-ibm04n10'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P04/ibm04n10.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P04/ibm04n11.xml
+%% ID: ibm-not-wf-P04-ibm04n11.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P04-ibm04n11'(suite) -> [];
+'ibm-not-wf-P04-ibm04n11'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P04/ibm04n11.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P04/ibm04n12.xml
+%% ID: ibm-not-wf-P04-ibm04n12.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P04-ibm04n12'(suite) -> [];
+'ibm-not-wf-P04-ibm04n12'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P04/ibm04n12.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P04/ibm04n13.xml
+%% ID: ibm-not-wf-P04-ibm04n13.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P04-ibm04n13'(suite) -> [];
+'ibm-not-wf-P04-ibm04n13'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P04/ibm04n13.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P04/ibm04n14.xml
+%% ID: ibm-not-wf-P04-ibm04n14.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P04-ibm04n14'(suite) -> [];
+'ibm-not-wf-P04-ibm04n14'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P04/ibm04n14.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P04/ibm04n15.xml
+%% ID: ibm-not-wf-P04-ibm04n15.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P04-ibm04n15'(suite) -> [];
+'ibm-not-wf-P04-ibm04n15'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P04/ibm04n15.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P04/ibm04n16.xml
+%% ID: ibm-not-wf-P04-ibm04n16.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P04-ibm04n16'(suite) -> [];
+'ibm-not-wf-P04-ibm04n16'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P04/ibm04n16.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P04/ibm04n17.xml
+%% ID: ibm-not-wf-P04-ibm04n17.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P04-ibm04n17'(suite) -> [];
+'ibm-not-wf-P04-ibm04n17'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P04/ibm04n17.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P04/ibm04n18.xml
+%% ID: ibm-not-wf-P04-ibm04n18.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P04-ibm04n18'(suite) -> [];
+'ibm-not-wf-P04-ibm04n18'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P04/ibm04n18.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 4
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P05/ibm05n01.xml
+%% ID: ibm-not-wf-P05-ibm05n01.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P05-ibm05n01'(suite) -> [];
+'ibm-not-wf-P05-ibm05n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P05/ibm05n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P05/ibm05n02.xml
+%% ID: ibm-not-wf-P05-ibm05n02.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P05-ibm05n02'(suite) -> [];
+'ibm-not-wf-P05-ibm05n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P05/ibm05n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P05/ibm05n03.xml
+%% ID: ibm-not-wf-P05-ibm05n03.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P05-ibm05n03'(suite) -> [];
+'ibm-not-wf-P05-ibm05n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P05/ibm05n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 5
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P09/ibm09n01.xml
+%% ID: ibm-not-wf-P09-ibm09n01.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P09-ibm09n01'(suite) -> [];
+'ibm-not-wf-P09-ibm09n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P09/ibm09n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P09/ibm09n02.xml
+%% ID: ibm-not-wf-P09-ibm09n02.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P09-ibm09n02'(suite) -> [];
+'ibm-not-wf-P09-ibm09n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P09/ibm09n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P09/ibm09n03.xml
+%% ID: ibm-not-wf-P09-ibm09n03.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P09-ibm09n03'(suite) -> [];
+'ibm-not-wf-P09-ibm09n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P09/ibm09n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P09/ibm09n04.xml
+%% ID: ibm-not-wf-P09-ibm09n04.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P09-ibm09n04'(suite) -> [];
+'ibm-not-wf-P09-ibm09n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P09/ibm09n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 9
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P10/ibm10n01.xml
+%% ID: ibm-not-wf-P10-ibm10n01.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P10-ibm10n01'(suite) -> [];
+'ibm-not-wf-P10-ibm10n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P10/ibm10n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P10/ibm10n02.xml
+%% ID: ibm-not-wf-P10-ibm10n02.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P10-ibm10n02'(suite) -> [];
+'ibm-not-wf-P10-ibm10n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P10/ibm10n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P10/ibm10n03.xml
+%% ID: ibm-not-wf-P10-ibm10n03.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P10-ibm10n03'(suite) -> [];
+'ibm-not-wf-P10-ibm10n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P10/ibm10n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P10/ibm10n04.xml
+%% ID: ibm-not-wf-P10-ibm10n04.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P10-ibm10n04'(suite) -> [];
+'ibm-not-wf-P10-ibm10n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P10/ibm10n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P10/ibm10n05.xml
+%% ID: ibm-not-wf-P10-ibm10n05.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P10-ibm10n05'(suite) -> [];
+'ibm-not-wf-P10-ibm10n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P10/ibm10n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P10/ibm10n06.xml
+%% ID: ibm-not-wf-P10-ibm10n06.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P10-ibm10n06'(suite) -> [];
+'ibm-not-wf-P10-ibm10n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P10/ibm10n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P10/ibm10n07.xml
+%% ID: ibm-not-wf-P10-ibm10n07.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P10-ibm10n07'(suite) -> [];
+'ibm-not-wf-P10-ibm10n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P10/ibm10n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P10/ibm10n08.xml
+%% ID: ibm-not-wf-P10-ibm10n08.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P10-ibm10n08'(suite) -> [];
+'ibm-not-wf-P10-ibm10n08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P10/ibm10n08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 10
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P11/ibm11n01.xml
+%% ID: ibm-not-wf-P11-ibm11n01.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P11-ibm11n01'(suite) -> [];
+'ibm-not-wf-P11-ibm11n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P11/ibm11n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P11/ibm11n02.xml
+%% ID: ibm-not-wf-P11-ibm11n02.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P11-ibm11n02'(suite) -> [];
+'ibm-not-wf-P11-ibm11n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P11/ibm11n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P11/ibm11n03.xml
+%% ID: ibm-not-wf-P11-ibm11n03.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P11-ibm11n03'(suite) -> [];
+'ibm-not-wf-P11-ibm11n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P11/ibm11n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P11/ibm11n04.xml
+%% ID: ibm-not-wf-P11-ibm11n04.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P11-ibm11n04'(suite) -> [];
+'ibm-not-wf-P11-ibm11n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P11/ibm11n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 11
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P12/ibm12n01.xml
+%% ID: ibm-not-wf-P12-ibm12n01.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P12-ibm12n01'(suite) -> [];
+'ibm-not-wf-P12-ibm12n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P12/ibm12n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P12/ibm12n02.xml
+%% ID: ibm-not-wf-P12-ibm12n02.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P12-ibm12n02'(suite) -> [];
+'ibm-not-wf-P12-ibm12n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P12/ibm12n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P12/ibm12n03.xml
+%% ID: ibm-not-wf-P12-ibm12n03.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P12-ibm12n03'(suite) -> [];
+'ibm-not-wf-P12-ibm12n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P12/ibm12n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 12
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P13/ibm13n01.xml
+%% ID: ibm-not-wf-P13-ibm13n01.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P13-ibm13n01'(suite) -> [];
+'ibm-not-wf-P13-ibm13n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P13/ibm13n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P13/ibm13n02.xml
+%% ID: ibm-not-wf-P13-ibm13n02.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P13-ibm13n02'(suite) -> [];
+'ibm-not-wf-P13-ibm13n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P13/ibm13n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P13/ibm13n03.xml
+%% ID: ibm-not-wf-P13-ibm13n03.xml
+%% Type: not-wf
+%% Sections: 2.3
+'ibm-not-wf-P13-ibm13n03'(suite) -> [];
+'ibm-not-wf-P13-ibm13n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P13/ibm13n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 13
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P14/ibm14n01.xml
+%% ID: ibm-not-wf-P14-ibm14n01.xml
+%% Type: not-wf
+%% Sections: 2.4
+'ibm-not-wf-P14-ibm14n01'(suite) -> [];
+'ibm-not-wf-P14-ibm14n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P14/ibm14n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P14/ibm14n02.xml
+%% ID: ibm-not-wf-P14-ibm14n02.xml
+%% Type: not-wf
+%% Sections: 2.4
+'ibm-not-wf-P14-ibm14n02'(suite) -> [];
+'ibm-not-wf-P14-ibm14n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P14/ibm14n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P14/ibm14n03.xml
+%% ID: ibm-not-wf-P14-ibm14n03.xml
+%% Type: not-wf
+%% Sections: 2.4
+'ibm-not-wf-P14-ibm14n03'(suite) -> [];
+'ibm-not-wf-P14-ibm14n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P14/ibm14n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 14
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P15/ibm15n01.xml
+%% ID: ibm-not-wf-P15-ibm15n01.xml
+%% Type: not-wf
+%% Sections: 2.5
+'ibm-not-wf-P15-ibm15n01'(suite) -> [];
+'ibm-not-wf-P15-ibm15n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P15/ibm15n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P15/ibm15n02.xml
+%% ID: ibm-not-wf-P15-ibm15n02.xml
+%% Type: not-wf
+%% Sections: 2.5
+'ibm-not-wf-P15-ibm15n02'(suite) -> [];
+'ibm-not-wf-P15-ibm15n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P15/ibm15n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P15/ibm15n03.xml
+%% ID: ibm-not-wf-P15-ibm15n03.xml
+%% Type: not-wf
+%% Sections: 2.5
+'ibm-not-wf-P15-ibm15n03'(suite) -> [];
+'ibm-not-wf-P15-ibm15n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P15/ibm15n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P15/ibm15n04.xml
+%% ID: ibm-not-wf-P15-ibm15n04.xml
+%% Type: not-wf
+%% Sections: 2.5
+'ibm-not-wf-P15-ibm15n04'(suite) -> [];
+'ibm-not-wf-P15-ibm15n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P15/ibm15n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 15
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P16/ibm16n01.xml
+%% ID: ibm-not-wf-P16-ibm16n01.xml
+%% Type: not-wf
+%% Sections: 2.6
+'ibm-not-wf-P16-ibm16n01'(suite) -> [];
+'ibm-not-wf-P16-ibm16n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P16/ibm16n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P16/ibm16n02.xml
+%% ID: ibm-not-wf-P16-ibm16n02.xml
+%% Type: not-wf
+%% Sections: 2.6
+'ibm-not-wf-P16-ibm16n02'(suite) -> [];
+'ibm-not-wf-P16-ibm16n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P16/ibm16n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P16/ibm16n03.xml
+%% ID: ibm-not-wf-P16-ibm16n03.xml
+%% Type: not-wf
+%% Sections: 2.6
+'ibm-not-wf-P16-ibm16n03'(suite) -> [];
+'ibm-not-wf-P16-ibm16n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P16/ibm16n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P16/ibm16n04.xml
+%% ID: ibm-not-wf-P16-ibm16n04.xml
+%% Type: not-wf
+%% Sections: 2.6
+'ibm-not-wf-P16-ibm16n04'(suite) -> [];
+'ibm-not-wf-P16-ibm16n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P16/ibm16n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 16
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P17/ibm17n01.xml
+%% ID: ibm-not-wf-P17-ibm17n01.xml
+%% Type: not-wf
+%% Sections: 2.6
+'ibm-not-wf-P17-ibm17n01'(suite) -> [];
+'ibm-not-wf-P17-ibm17n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P17/ibm17n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P17/ibm17n02.xml
+%% ID: ibm-not-wf-P17-ibm17n02.xml
+%% Type: not-wf
+%% Sections: 2.6
+'ibm-not-wf-P17-ibm17n02'(suite) -> [];
+'ibm-not-wf-P17-ibm17n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P17/ibm17n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P17/ibm17n03.xml
+%% ID: ibm-not-wf-P17-ibm17n03.xml
+%% Type: not-wf
+%% Sections: 2.6
+'ibm-not-wf-P17-ibm17n03'(suite) -> [];
+'ibm-not-wf-P17-ibm17n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P17/ibm17n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P17/ibm17n04.xml
+%% ID: ibm-not-wf-P17-ibm17n04.xml
+%% Type: not-wf
+%% Sections: 2.6
+'ibm-not-wf-P17-ibm17n04'(suite) -> [];
+'ibm-not-wf-P17-ibm17n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P17/ibm17n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 17
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P18/ibm18n01.xml
+%% ID: ibm-not-wf-P18-ibm18n01.xml
+%% Type: not-wf
+%% Sections: 2.7
+'ibm-not-wf-P18-ibm18n01'(suite) -> [];
+'ibm-not-wf-P18-ibm18n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P18/ibm18n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P18/ibm18n02.xml
+%% ID: ibm-not-wf-P18-ibm18n02.xml
+%% Type: not-wf
+%% Sections: 2.7
+'ibm-not-wf-P18-ibm18n02'(suite) -> [];
+'ibm-not-wf-P18-ibm18n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P18/ibm18n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 18
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P19/ibm19n01.xml
+%% ID: ibm-not-wf-P19-ibm19n01.xml
+%% Type: not-wf
+%% Sections: 2.7
+'ibm-not-wf-P19-ibm19n01'(suite) -> [];
+'ibm-not-wf-P19-ibm19n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P19/ibm19n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P19/ibm19n02.xml
+%% ID: ibm-not-wf-P19-ibm19n02.xml
+%% Type: not-wf
+%% Sections: 2.7
+'ibm-not-wf-P19-ibm19n02'(suite) -> [];
+'ibm-not-wf-P19-ibm19n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P19/ibm19n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P19/ibm19n03.xml
+%% ID: ibm-not-wf-P19-ibm19n03.xml
+%% Type: not-wf
+%% Sections: 2.7
+'ibm-not-wf-P19-ibm19n03'(suite) -> [];
+'ibm-not-wf-P19-ibm19n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P19/ibm19n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 19
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P20/ibm20n01.xml
+%% ID: ibm-not-wf-P20-ibm20n01.xml
+%% Type: not-wf
+%% Sections: 2.7
+'ibm-not-wf-P20-ibm20n01'(suite) -> [];
+'ibm-not-wf-P20-ibm20n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P20/ibm20n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 20
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P21/ibm21n01.xml
+%% ID: ibm-not-wf-P21-ibm21n01.xml
+%% Type: not-wf
+%% Sections: 2.7
+'ibm-not-wf-P21-ibm21n01'(suite) -> [];
+'ibm-not-wf-P21-ibm21n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P21/ibm21n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P21/ibm21n02.xml
+%% ID: ibm-not-wf-P21-ibm21n02.xml
+%% Type: not-wf
+%% Sections: 2.7
+'ibm-not-wf-P21-ibm21n02'(suite) -> [];
+'ibm-not-wf-P21-ibm21n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P21/ibm21n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P21/ibm21n03.xml
+%% ID: ibm-not-wf-P21-ibm21n03.xml
+%% Type: not-wf
+%% Sections: 2.7
+'ibm-not-wf-P21-ibm21n03'(suite) -> [];
+'ibm-not-wf-P21-ibm21n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P21/ibm21n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 21
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P22/ibm22n01.xml
+%% ID: ibm-not-wf-P22-ibm22n01.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P22-ibm22n01'(suite) -> [];
+'ibm-not-wf-P22-ibm22n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P22/ibm22n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P22/ibm22n02.xml
+%% ID: ibm-not-wf-P22-ibm22n02.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P22-ibm22n02'(suite) -> [];
+'ibm-not-wf-P22-ibm22n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P22/ibm22n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P22/ibm22n03.xml
+%% ID: ibm-not-wf-P22-ibm22n03.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P22-ibm22n03'(suite) -> [];
+'ibm-not-wf-P22-ibm22n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P22/ibm22n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 22
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P23/ibm23n01.xml
+%% ID: ibm-not-wf-P23-ibm23n01.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P23-ibm23n01'(suite) -> [];
+'ibm-not-wf-P23-ibm23n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P23/ibm23n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P23/ibm23n02.xml
+%% ID: ibm-not-wf-P23-ibm23n02.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P23-ibm23n02'(suite) -> [];
+'ibm-not-wf-P23-ibm23n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P23/ibm23n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P23/ibm23n03.xml
+%% ID: ibm-not-wf-P23-ibm23n03.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P23-ibm23n03'(suite) -> [];
+'ibm-not-wf-P23-ibm23n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P23/ibm23n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P23/ibm23n04.xml
+%% ID: ibm-not-wf-P23-ibm23n04.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P23-ibm23n04'(suite) -> [];
+'ibm-not-wf-P23-ibm23n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P23/ibm23n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P23/ibm23n05.xml
+%% ID: ibm-not-wf-P23-ibm23n05.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P23-ibm23n05'(suite) -> [];
+'ibm-not-wf-P23-ibm23n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P23/ibm23n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P23/ibm23n06.xml
+%% ID: ibm-not-wf-P23-ibm23n06.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P23-ibm23n06'(suite) -> [];
+'ibm-not-wf-P23-ibm23n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P23/ibm23n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 23
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P24/ibm24n01.xml
+%% ID: ibm-not-wf-P24-ibm24n01.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P24-ibm24n01'(suite) -> [];
+'ibm-not-wf-P24-ibm24n01'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P24/ibm24n01.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P24/ibm24n02.xml
+%% ID: ibm-not-wf-P24-ibm24n02.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P24-ibm24n02'(suite) -> [];
+'ibm-not-wf-P24-ibm24n02'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P24/ibm24n02.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P24/ibm24n03.xml
+%% ID: ibm-not-wf-P24-ibm24n03.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P24-ibm24n03'(suite) -> [];
+'ibm-not-wf-P24-ibm24n03'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P24/ibm24n03.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P24/ibm24n04.xml
+%% ID: ibm-not-wf-P24-ibm24n04.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P24-ibm24n04'(suite) -> [];
+'ibm-not-wf-P24-ibm24n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P24/ibm24n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P24/ibm24n05.xml
+%% ID: ibm-not-wf-P24-ibm24n05.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P24-ibm24n05'(suite) -> [];
+'ibm-not-wf-P24-ibm24n05'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P24/ibm24n05.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P24/ibm24n06.xml
+%% ID: ibm-not-wf-P24-ibm24n06.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P24-ibm24n06'(suite) -> [];
+'ibm-not-wf-P24-ibm24n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P24/ibm24n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P24/ibm24n07.xml
+%% ID: ibm-not-wf-P24-ibm24n07.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P24-ibm24n07'(suite) -> [];
+'ibm-not-wf-P24-ibm24n07'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P24/ibm24n07.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P24/ibm24n08.xml
+%% ID: ibm-not-wf-P24-ibm24n08.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P24-ibm24n08'(suite) -> [];
+'ibm-not-wf-P24-ibm24n08'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P24/ibm24n08.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P24/ibm24n09.xml
+%% ID: ibm-not-wf-P24-ibm24n09.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P24-ibm24n09'(suite) -> [];
+'ibm-not-wf-P24-ibm24n09'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P24/ibm24n09.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 24
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P25/ibm25n01.xml
+%% ID: ibm-not-wf-P25-ibm25n01.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P25-ibm25n01'(suite) -> [];
+'ibm-not-wf-P25-ibm25n01'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P25/ibm25n01.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P25/ibm25n02.xml
+%% ID: ibm-not-wf-P25-ibm25n02.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P25-ibm25n02'(suite) -> [];
+'ibm-not-wf-P25-ibm25n02'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P25/ibm25n02.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 25
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P26/ibm26n01.xml
+%% ID: ibm-not-wf-P26-ibm26n01.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P26-ibm26n01'(suite) -> [];
+'ibm-not-wf-P26-ibm26n01'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P26/ibm26n01.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 26
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P27/ibm27n01.xml
+%% ID: ibm-not-wf-P27-ibm27n01.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P27-ibm27n01'(suite) -> [];
+'ibm-not-wf-P27-ibm27n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P27/ibm27n01.xml"]),
+ %% Special case becase we returns everything after a legal document
+ %% as an rest instead of giving and error to let the user handle
+ %% multipple docs on a stream.
+ ?line {ok,_, <<"<!ELEMENT cat EMPTY>">>} = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]).
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 27
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P28/ibm28n01.xml
+%% ID: ibm-not-wf-P28-ibm28n01.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P28-ibm28n01'(suite) -> [];
+'ibm-not-wf-P28-ibm28n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P28/ibm28n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P28/ibm28n02.xml
+%% ID: ibm-not-wf-P28-ibm28n02.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P28-ibm28n02'(suite) -> [];
+'ibm-not-wf-P28-ibm28n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P28/ibm28n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P28/ibm28n03.xml
+%% ID: ibm-not-wf-P28-ibm28n03.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P28-ibm28n03'(suite) -> [];
+'ibm-not-wf-P28-ibm28n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P28/ibm28n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P28/ibm28n04.xml
+%% ID: ibm-not-wf-P28-ibm28n04.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P28-ibm28n04'(suite) -> [];
+'ibm-not-wf-P28-ibm28n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P28/ibm28n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P28/ibm28n05.xml
+%% ID: ibm-not-wf-P28-ibm28n05.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P28-ibm28n05'(suite) -> [];
+'ibm-not-wf-P28-ibm28n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P28/ibm28n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P28/ibm28n06.xml
+%% ID: ibm-not-wf-P28-ibm28n06.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P28-ibm28n06'(suite) -> [];
+'ibm-not-wf-P28-ibm28n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P28/ibm28n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P28/ibm28n07.xml
+%% ID: ibm-not-wf-P28-ibm28n07.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P28-ibm28n07'(suite) -> [];
+'ibm-not-wf-P28-ibm28n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P28/ibm28n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P28/ibm28n08.xml
+%% ID: ibm-not-wf-P28-ibm28n08.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P28-ibm28n08'(suite) -> [];
+'ibm-not-wf-P28-ibm28n08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P28/ibm28n08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 28
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/p28a/ibm28an01.xml
+%% ID: ibm-not-wf-p28a-ibm28an01.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-p28a-ibm28an01'(suite) -> [];
+'ibm-not-wf-p28a-ibm28an01'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/p28a/ibm28an01.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 28a
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P29/ibm29n01.xml
+%% ID: ibm-not-wf-P29-ibm29n01.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P29-ibm29n01'(suite) -> [];
+'ibm-not-wf-P29-ibm29n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P29/ibm29n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P29/ibm29n02.xml
+%% ID: ibm-not-wf-P29-ibm29n02.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P29-ibm29n02'(suite) -> [];
+'ibm-not-wf-P29-ibm29n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P29/ibm29n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P29/ibm29n03.xml
+%% ID: ibm-not-wf-P29-ibm29n03.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P29-ibm29n03'(suite) -> [];
+'ibm-not-wf-P29-ibm29n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P29/ibm29n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P29/ibm29n04.xml
+%% ID: ibm-not-wf-P29-ibm29n04.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P29-ibm29n04'(suite) -> [];
+'ibm-not-wf-P29-ibm29n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P29/ibm29n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P29/ibm29n05.xml
+%% ID: ibm-not-wf-P29-ibm29n05.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P29-ibm29n05'(suite) -> [];
+'ibm-not-wf-P29-ibm29n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P29/ibm29n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P29/ibm29n06.xml
+%% ID: ibm-not-wf-P29-ibm29n06.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P29-ibm29n06'(suite) -> [];
+'ibm-not-wf-P29-ibm29n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P29/ibm29n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P29/ibm29n07.xml
+%% ID: ibm-not-wf-P29-ibm29n07.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P29-ibm29n07'(suite) -> [];
+'ibm-not-wf-P29-ibm29n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P29/ibm29n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 29
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P30/ibm30n01.xml
+%% ID: ibm-not-wf-P30-ibm30n01.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P30-ibm30n01'(suite) -> [];
+'ibm-not-wf-P30-ibm30n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P30/ibm30n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 30
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P31/ibm31n01.xml
+%% ID: ibm-not-wf-P31-ibm31n01.xml
+%% Type: not-wf
+%% Sections: 2.8
+'ibm-not-wf-P31-ibm31n01'(suite) -> [];
+'ibm-not-wf-P31-ibm31n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P31/ibm31n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 31
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P32/ibm32n01.xml
+%% ID: ibm-not-wf-P32-ibm32n01.xml
+%% Type: not-wf
+%% Sections: 2.9
+'ibm-not-wf-P32-ibm32n01'(suite) -> [];
+'ibm-not-wf-P32-ibm32n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P32/ibm32n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P32/ibm32n02.xml
+%% ID: ibm-not-wf-P32-ibm32n02.xml
+%% Type: not-wf
+%% Sections: 2.9
+'ibm-not-wf-P32-ibm32n02'(suite) -> [];
+'ibm-not-wf-P32-ibm32n02'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P32/ibm32n02.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P32/ibm32n03.xml
+%% ID: ibm-not-wf-P32-ibm32n03.xml
+%% Type: not-wf
+%% Sections: 2.9
+'ibm-not-wf-P32-ibm32n03'(suite) -> [];
+'ibm-not-wf-P32-ibm32n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P32/ibm32n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P32/ibm32n04.xml
+%% ID: ibm-not-wf-P32-ibm32n04.xml
+%% Type: not-wf
+%% Sections: 2.9
+'ibm-not-wf-P32-ibm32n04'(suite) -> [];
+'ibm-not-wf-P32-ibm32n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P32/ibm32n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P32/ibm32n05.xml
+%% ID: ibm-not-wf-P32-ibm32n05.xml
+%% Type: not-wf
+%% Sections: 2.9
+'ibm-not-wf-P32-ibm32n05'(suite) -> [];
+'ibm-not-wf-P32-ibm32n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P32/ibm32n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P32/ibm32n06.xml
+%% ID: ibm-not-wf-P32-ibm32n06.xml
+%% Type: not-wf
+%% Sections: 2.9
+'ibm-not-wf-P32-ibm32n06'(suite) -> [];
+'ibm-not-wf-P32-ibm32n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P32/ibm32n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P32/ibm32n07.xml
+%% ID: ibm-not-wf-P32-ibm32n07.xml
+%% Type: not-wf
+%% Sections: 2.9
+'ibm-not-wf-P32-ibm32n07'(suite) -> [];
+'ibm-not-wf-P32-ibm32n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P32/ibm32n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P32/ibm32n08.xml
+%% ID: ibm-not-wf-P32-ibm32n08.xml
+%% Type: not-wf
+%% Sections: 2.9
+'ibm-not-wf-P32-ibm32n08'(suite) -> [];
+'ibm-not-wf-P32-ibm32n08'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P32/ibm32n08.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P32/ibm32n09.xml
+%% ID: ibm-not-wf-P32-ibm32n09.xml
+%% Type: not-wf
+%% Sections: 2.9
+'ibm-not-wf-P32-ibm32n09'(suite) -> [];
+'ibm-not-wf-P32-ibm32n09'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P32/ibm32n09.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 32
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P39/ibm39n01.xml
+%% ID: ibm-not-wf-P39-ibm39n01.xml
+%% Type: not-wf
+%% Sections: 3
+'ibm-not-wf-P39-ibm39n01'(suite) -> [];
+'ibm-not-wf-P39-ibm39n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P39/ibm39n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P39/ibm39n02.xml
+%% ID: ibm-not-wf-P39-ibm39n02.xml
+%% Type: not-wf
+%% Sections: 3
+'ibm-not-wf-P39-ibm39n02'(suite) -> [];
+'ibm-not-wf-P39-ibm39n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P39/ibm39n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P39/ibm39n03.xml
+%% ID: ibm-not-wf-P39-ibm39n03.xml
+%% Type: not-wf
+%% Sections: 3
+'ibm-not-wf-P39-ibm39n03'(suite) -> [];
+'ibm-not-wf-P39-ibm39n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P39/ibm39n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P39/ibm39n04.xml
+%% ID: ibm-not-wf-P39-ibm39n04.xml
+%% Type: not-wf
+%% Sections: 3
+'ibm-not-wf-P39-ibm39n04'(suite) -> [];
+'ibm-not-wf-P39-ibm39n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P39/ibm39n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P39/ibm39n05.xml
+%% ID: ibm-not-wf-P39-ibm39n05.xml
+%% Type: not-wf
+%% Sections: 3
+'ibm-not-wf-P39-ibm39n05'(suite) -> [];
+'ibm-not-wf-P39-ibm39n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P39/ibm39n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P39/ibm39n06.xml
+%% ID: ibm-not-wf-P39-ibm39n06.xml
+%% Type: not-wf
+%% Sections: 3
+'ibm-not-wf-P39-ibm39n06'(suite) -> [];
+'ibm-not-wf-P39-ibm39n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P39/ibm39n06.xml"]),
+ %% Special case becase we returns everything after a legal document
+ %% as an rest instead of giving and error to let the user handle
+ %% multipple docs on a stream.
+ ?line {ok,_,<<"content after end tag\r\n">>} = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]).
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 39
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P40/ibm40n01.xml
+%% ID: ibm-not-wf-P40-ibm40n01.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P40-ibm40n01'(suite) -> [];
+'ibm-not-wf-P40-ibm40n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P40/ibm40n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P40/ibm40n02.xml
+%% ID: ibm-not-wf-P40-ibm40n02.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P40-ibm40n02'(suite) -> [];
+'ibm-not-wf-P40-ibm40n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P40/ibm40n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P40/ibm40n03.xml
+%% ID: ibm-not-wf-P40-ibm40n03.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P40-ibm40n03'(suite) -> [];
+'ibm-not-wf-P40-ibm40n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P40/ibm40n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P40/ibm40n04.xml
+%% ID: ibm-not-wf-P40-ibm40n04.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P40-ibm40n04'(suite) -> [];
+'ibm-not-wf-P40-ibm40n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P40/ibm40n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P40/ibm40n05.xml
+%% ID: ibm-not-wf-P40-ibm40n05.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P40-ibm40n05'(suite) -> [];
+'ibm-not-wf-P40-ibm40n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P40/ibm40n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 40
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P41/ibm41n01.xml
+%% ID: ibm-not-wf-P41-ibm41n01.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P41-ibm41n01'(suite) -> [];
+'ibm-not-wf-P41-ibm41n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P41/ibm41n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P41/ibm41n02.xml
+%% ID: ibm-not-wf-P41-ibm41n02.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P41-ibm41n02'(suite) -> [];
+'ibm-not-wf-P41-ibm41n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P41/ibm41n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P41/ibm41n03.xml
+%% ID: ibm-not-wf-P41-ibm41n03.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P41-ibm41n03'(suite) -> [];
+'ibm-not-wf-P41-ibm41n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P41/ibm41n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P41/ibm41n04.xml
+%% ID: ibm-not-wf-P41-ibm41n04.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P41-ibm41n04'(suite) -> [];
+'ibm-not-wf-P41-ibm41n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P41/ibm41n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P41/ibm41n05.xml
+%% ID: ibm-not-wf-P41-ibm41n05.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P41-ibm41n05'(suite) -> [];
+'ibm-not-wf-P41-ibm41n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P41/ibm41n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P41/ibm41n06.xml
+%% ID: ibm-not-wf-P41-ibm41n06.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P41-ibm41n06'(suite) -> [];
+'ibm-not-wf-P41-ibm41n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P41/ibm41n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P41/ibm41n07.xml
+%% ID: ibm-not-wf-P41-ibm41n07.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P41-ibm41n07'(suite) -> [];
+'ibm-not-wf-P41-ibm41n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P41/ibm41n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P41/ibm41n08.xml
+%% ID: ibm-not-wf-P41-ibm41n08.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P41-ibm41n08'(suite) -> [];
+'ibm-not-wf-P41-ibm41n08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P41/ibm41n08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P41/ibm41n09.xml
+%% ID: ibm-not-wf-P41-ibm41n09.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P41-ibm41n09'(suite) -> [];
+'ibm-not-wf-P41-ibm41n09'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P41/ibm41n09.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P41/ibm41n10.xml
+%% ID: ibm-not-wf-P41-ibm41n10.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P41-ibm41n10'(suite) -> [];
+'ibm-not-wf-P41-ibm41n10'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P41/ibm41n10.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P41/ibm41n11.xml
+%% ID: ibm-not-wf-P41-ibm41n11.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P41-ibm41n11'(suite) -> [];
+'ibm-not-wf-P41-ibm41n11'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P41/ibm41n11.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P41/ibm41n12.xml
+%% ID: ibm-not-wf-P41-ibm41n12.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P41-ibm41n12'(suite) -> [];
+'ibm-not-wf-P41-ibm41n12'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P41/ibm41n12.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P41/ibm41n13.xml
+%% ID: ibm-not-wf-P41-ibm41n13.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P41-ibm41n13'(suite) -> [];
+'ibm-not-wf-P41-ibm41n13'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P41/ibm41n13.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P41/ibm41n14.xml
+%% ID: ibm-not-wf-P41-ibm41n14.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P41-ibm41n14'(suite) -> [];
+'ibm-not-wf-P41-ibm41n14'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P41/ibm41n14.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 41
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P42/ibm42n01.xml
+%% ID: ibm-not-wf-P42-ibm42n01.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P42-ibm42n01'(suite) -> [];
+'ibm-not-wf-P42-ibm42n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P42/ibm42n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P42/ibm42n02.xml
+%% ID: ibm-not-wf-P42-ibm42n02.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P42-ibm42n02'(suite) -> [];
+'ibm-not-wf-P42-ibm42n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P42/ibm42n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P42/ibm42n03.xml
+%% ID: ibm-not-wf-P42-ibm42n03.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P42-ibm42n03'(suite) -> [];
+'ibm-not-wf-P42-ibm42n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P42/ibm42n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P42/ibm42n04.xml
+%% ID: ibm-not-wf-P42-ibm42n04.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P42-ibm42n04'(suite) -> [];
+'ibm-not-wf-P42-ibm42n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P42/ibm42n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P42/ibm42n05.xml
+%% ID: ibm-not-wf-P42-ibm42n05.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P42-ibm42n05'(suite) -> [];
+'ibm-not-wf-P42-ibm42n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P42/ibm42n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 42
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P43/ibm43n01.xml
+%% ID: ibm-not-wf-P43-ibm43n01.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P43-ibm43n01'(suite) -> [];
+'ibm-not-wf-P43-ibm43n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P43/ibm43n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P43/ibm43n02.xml
+%% ID: ibm-not-wf-P43-ibm43n02.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P43-ibm43n02'(suite) -> [];
+'ibm-not-wf-P43-ibm43n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P43/ibm43n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P43/ibm43n04.xml
+%% ID: ibm-not-wf-P43-ibm43n04.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P43-ibm43n04'(suite) -> [];
+'ibm-not-wf-P43-ibm43n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P43/ibm43n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P43/ibm43n05.xml
+%% ID: ibm-not-wf-P43-ibm43n05.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P43-ibm43n05'(suite) -> [];
+'ibm-not-wf-P43-ibm43n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P43/ibm43n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 43
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P44/ibm44n01.xml
+%% ID: ibm-not-wf-P44-ibm44n01.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P44-ibm44n01'(suite) -> [];
+'ibm-not-wf-P44-ibm44n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P44/ibm44n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P44/ibm44n02.xml
+%% ID: ibm-not-wf-P44-ibm44n02.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P44-ibm44n02'(suite) -> [];
+'ibm-not-wf-P44-ibm44n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P44/ibm44n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P44/ibm44n03.xml
+%% ID: ibm-not-wf-P44-ibm44n03.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P44-ibm44n03'(suite) -> [];
+'ibm-not-wf-P44-ibm44n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P44/ibm44n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P44/ibm44n04.xml
+%% ID: ibm-not-wf-P44-ibm44n04.xml
+%% Type: not-wf
+%% Sections: 3.1
+'ibm-not-wf-P44-ibm44n04'(suite) -> [];
+'ibm-not-wf-P44-ibm44n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P44/ibm44n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 44
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P45/ibm45n01.xml
+%% ID: ibm-not-wf-P45-ibm45n01.xml
+%% Type: not-wf
+%% Sections: 3.2
+'ibm-not-wf-P45-ibm45n01'(suite) -> [];
+'ibm-not-wf-P45-ibm45n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P45/ibm45n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P45/ibm45n02.xml
+%% ID: ibm-not-wf-P45-ibm45n02.xml
+%% Type: not-wf
+%% Sections: 3.2
+'ibm-not-wf-P45-ibm45n02'(suite) -> [];
+'ibm-not-wf-P45-ibm45n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P45/ibm45n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P45/ibm45n03.xml
+%% ID: ibm-not-wf-P45-ibm45n03.xml
+%% Type: not-wf
+%% Sections: 3.2
+'ibm-not-wf-P45-ibm45n03'(suite) -> [];
+'ibm-not-wf-P45-ibm45n03'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P45/ibm45n03.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P45/ibm45n04.xml
+%% ID: ibm-not-wf-P45-ibm45n04.xml
+%% Type: not-wf
+%% Sections: 3.2
+'ibm-not-wf-P45-ibm45n04'(suite) -> [];
+'ibm-not-wf-P45-ibm45n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P45/ibm45n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P45/ibm45n05.xml
+%% ID: ibm-not-wf-P45-ibm45n05.xml
+%% Type: not-wf
+%% Sections: 3.2
+'ibm-not-wf-P45-ibm45n05'(suite) -> [];
+'ibm-not-wf-P45-ibm45n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P45/ibm45n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P45/ibm45n06.xml
+%% ID: ibm-not-wf-P45-ibm45n06.xml
+%% Type: not-wf
+%% Sections: 3.2
+'ibm-not-wf-P45-ibm45n06'(suite) -> [];
+'ibm-not-wf-P45-ibm45n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P45/ibm45n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P45/ibm45n07.xml
+%% ID: ibm-not-wf-P45-ibm45n07.xml
+%% Type: not-wf
+%% Sections: 3.2
+'ibm-not-wf-P45-ibm45n07'(suite) -> [];
+'ibm-not-wf-P45-ibm45n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P45/ibm45n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P45/ibm45n08.xml
+%% ID: ibm-not-wf-P45-ibm45n08.xml
+%% Type: not-wf
+%% Sections: 3.2
+'ibm-not-wf-P45-ibm45n08'(suite) -> [];
+'ibm-not-wf-P45-ibm45n08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P45/ibm45n08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P45/ibm45n09.xml
+%% ID: ibm-not-wf-P45-ibm45n09.xml
+%% Type: not-wf
+%% Sections: 3.2
+'ibm-not-wf-P45-ibm45n09'(suite) -> [];
+'ibm-not-wf-P45-ibm45n09'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P45/ibm45n09.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 45
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P46/ibm46n01.xml
+%% ID: ibm-not-wf-P46-ibm46n01.xml
+%% Type: not-wf
+%% Sections: 3.2
+'ibm-not-wf-P46-ibm46n01'(suite) -> [];
+'ibm-not-wf-P46-ibm46n01'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P46/ibm46n01.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P46/ibm46n02.xml
+%% ID: ibm-not-wf-P46-ibm46n02.xml
+%% Type: not-wf
+%% Sections: 3.2
+'ibm-not-wf-P46-ibm46n02'(suite) -> [];
+'ibm-not-wf-P46-ibm46n02'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P46/ibm46n02.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P46/ibm46n03.xml
+%% ID: ibm-not-wf-P46-ibm46n03.xml
+%% Type: not-wf
+%% Sections: 3.2
+'ibm-not-wf-P46-ibm46n03'(suite) -> [];
+'ibm-not-wf-P46-ibm46n03'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P46/ibm46n03.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P46/ibm46n04.xml
+%% ID: ibm-not-wf-P46-ibm46n04.xml
+%% Type: not-wf
+%% Sections: 3.2
+'ibm-not-wf-P46-ibm46n04'(suite) -> [];
+'ibm-not-wf-P46-ibm46n04'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P46/ibm46n04.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P46/ibm46n05.xml
+%% ID: ibm-not-wf-P46-ibm46n05.xml
+%% Type: not-wf
+%% Sections: 3.2
+'ibm-not-wf-P46-ibm46n05'(suite) -> [];
+'ibm-not-wf-P46-ibm46n05'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P46/ibm46n05.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 46
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P47/ibm47n01.xml
+%% ID: ibm-not-wf-P47-ibm47n01.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P47-ibm47n01'(suite) -> [];
+'ibm-not-wf-P47-ibm47n01'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P47/ibm47n01.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P47/ibm47n02.xml
+%% ID: ibm-not-wf-P47-ibm47n02.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P47-ibm47n02'(suite) -> [];
+'ibm-not-wf-P47-ibm47n02'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P47/ibm47n02.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P47/ibm47n03.xml
+%% ID: ibm-not-wf-P47-ibm47n03.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P47-ibm47n03'(suite) -> [];
+'ibm-not-wf-P47-ibm47n03'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P47/ibm47n03.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P47/ibm47n04.xml
+%% ID: ibm-not-wf-P47-ibm47n04.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P47-ibm47n04'(suite) -> [];
+'ibm-not-wf-P47-ibm47n04'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P47/ibm47n04.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P47/ibm47n05.xml
+%% ID: ibm-not-wf-P47-ibm47n05.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P47-ibm47n05'(suite) -> [];
+'ibm-not-wf-P47-ibm47n05'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P47/ibm47n05.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P47/ibm47n06.xml
+%% ID: ibm-not-wf-P47-ibm47n06.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P47-ibm47n06'(suite) -> [];
+'ibm-not-wf-P47-ibm47n06'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P47/ibm47n06.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 47
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P48/ibm48n01.xml
+%% ID: ibm-not-wf-P48-ibm48n01.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P48-ibm48n01'(suite) -> [];
+'ibm-not-wf-P48-ibm48n01'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P48/ibm48n01.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P48/ibm48n02.xml
+%% ID: ibm-not-wf-P48-ibm48n02.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P48-ibm48n02'(suite) -> [];
+'ibm-not-wf-P48-ibm48n02'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P48/ibm48n02.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P48/ibm48n03.xml
+%% ID: ibm-not-wf-P48-ibm48n03.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P48-ibm48n03'(suite) -> [];
+'ibm-not-wf-P48-ibm48n03'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P48/ibm48n03.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P48/ibm48n04.xml
+%% ID: ibm-not-wf-P48-ibm48n04.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P48-ibm48n04'(suite) -> [];
+'ibm-not-wf-P48-ibm48n04'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P48/ibm48n04.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P48/ibm48n05.xml
+%% ID: ibm-not-wf-P48-ibm48n05.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P48-ibm48n05'(suite) -> [];
+'ibm-not-wf-P48-ibm48n05'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P48/ibm48n05.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P48/ibm48n06.xml
+%% ID: ibm-not-wf-P48-ibm48n06.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P48-ibm48n06'(suite) -> [];
+'ibm-not-wf-P48-ibm48n06'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P48/ibm48n06.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P48/ibm48n07.xml
+%% ID: ibm-not-wf-P48-ibm48n07.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P48-ibm48n07'(suite) -> [];
+'ibm-not-wf-P48-ibm48n07'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P48/ibm48n07.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 48
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P49/ibm49n01.xml
+%% ID: ibm-not-wf-P49-ibm49n01.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P49-ibm49n01'(suite) -> [];
+'ibm-not-wf-P49-ibm49n01'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P49/ibm49n01.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P49/ibm49n02.xml
+%% ID: ibm-not-wf-P49-ibm49n02.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P49-ibm49n02'(suite) -> [];
+'ibm-not-wf-P49-ibm49n02'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P49/ibm49n02.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P49/ibm49n03.xml
+%% ID: ibm-not-wf-P49-ibm49n03.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P49-ibm49n03'(suite) -> [];
+'ibm-not-wf-P49-ibm49n03'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P49/ibm49n03.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P49/ibm49n04.xml
+%% ID: ibm-not-wf-P49-ibm49n04.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P49-ibm49n04'(suite) -> [];
+'ibm-not-wf-P49-ibm49n04'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P49/ibm49n04.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P49/ibm49n05.xml
+%% ID: ibm-not-wf-P49-ibm49n05.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P49-ibm49n05'(suite) -> [];
+'ibm-not-wf-P49-ibm49n05'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P49/ibm49n05.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P49/ibm49n06.xml
+%% ID: ibm-not-wf-P49-ibm49n06.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P49-ibm49n06'(suite) -> [];
+'ibm-not-wf-P49-ibm49n06'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P49/ibm49n06.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 49
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P50/ibm50n01.xml
+%% ID: ibm-not-wf-P50-ibm50n01.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P50-ibm50n01'(suite) -> [];
+'ibm-not-wf-P50-ibm50n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P50/ibm50n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P50/ibm50n02.xml
+%% ID: ibm-not-wf-P50-ibm50n02.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P50-ibm50n02'(suite) -> [];
+'ibm-not-wf-P50-ibm50n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P50/ibm50n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P50/ibm50n03.xml
+%% ID: ibm-not-wf-P50-ibm50n03.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P50-ibm50n03'(suite) -> [];
+'ibm-not-wf-P50-ibm50n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P50/ibm50n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P50/ibm50n04.xml
+%% ID: ibm-not-wf-P50-ibm50n04.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P50-ibm50n04'(suite) -> [];
+'ibm-not-wf-P50-ibm50n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P50/ibm50n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P50/ibm50n05.xml
+%% ID: ibm-not-wf-P50-ibm50n05.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P50-ibm50n05'(suite) -> [];
+'ibm-not-wf-P50-ibm50n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P50/ibm50n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P50/ibm50n06.xml
+%% ID: ibm-not-wf-P50-ibm50n06.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P50-ibm50n06'(suite) -> [];
+'ibm-not-wf-P50-ibm50n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P50/ibm50n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P50/ibm50n07.xml
+%% ID: ibm-not-wf-P50-ibm50n07.xml
+%% Type: not-wf
+%% Sections: 3.2.1
+'ibm-not-wf-P50-ibm50n07'(suite) -> [];
+'ibm-not-wf-P50-ibm50n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P50/ibm50n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 50
+
+testcases67(suite) -> [].
+%% ['ibm-not-wf-P50-ibm50n01','ibm-not-wf-P50-ibm50n02','ibm-not-wf-P50-ibm50n03','ibm-not-wf-P50-ibm50n04','ibm-not-wf-P50-ibm50n05','ibm-not-wf-P50-ibm50n06','ibm-not-wf-P50-ibm50n07'].
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P51/ibm51n01.xml
+%% ID: ibm-not-wf-P51-ibm51n01.xml
+%% Type: not-wf
+%% Sections: 3.2.2
+'ibm-not-wf-P51-ibm51n01'(suite) -> [];
+'ibm-not-wf-P51-ibm51n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P51/ibm51n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P51/ibm51n02.xml
+%% ID: ibm-not-wf-P51-ibm51n02.xml
+%% Type: not-wf
+%% Sections: 3.2.2
+'ibm-not-wf-P51-ibm51n02'(suite) -> [];
+'ibm-not-wf-P51-ibm51n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P51/ibm51n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P51/ibm51n03.xml
+%% ID: ibm-not-wf-P51-ibm51n03.xml
+%% Type: not-wf
+%% Sections: 3.2.2
+'ibm-not-wf-P51-ibm51n03'(suite) -> [];
+'ibm-not-wf-P51-ibm51n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P51/ibm51n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P51/ibm51n04.xml
+%% ID: ibm-not-wf-P51-ibm51n04.xml
+%% Type: not-wf
+%% Sections: 3.2.2
+'ibm-not-wf-P51-ibm51n04'(suite) -> [];
+'ibm-not-wf-P51-ibm51n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P51/ibm51n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P51/ibm51n05.xml
+%% ID: ibm-not-wf-P51-ibm51n05.xml
+%% Type: not-wf
+%% Sections: 3.2.2
+'ibm-not-wf-P51-ibm51n05'(suite) -> [];
+'ibm-not-wf-P51-ibm51n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P51/ibm51n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P51/ibm51n06.xml
+%% ID: ibm-not-wf-P51-ibm51n06.xml
+%% Type: not-wf
+%% Sections: 3.2.2
+'ibm-not-wf-P51-ibm51n06'(suite) -> [];
+'ibm-not-wf-P51-ibm51n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P51/ibm51n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P51/ibm51n07.xml
+%% ID: ibm-not-wf-P51-ibm51n07.xml
+%% Type: not-wf
+%% Sections: 3.2.2
+'ibm-not-wf-P51-ibm51n07'(suite) -> [];
+'ibm-not-wf-P51-ibm51n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P51/ibm51n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 51
+
+testcases68(suite) -> [].
+%% ['ibm-not-wf-P51-ibm51n01','ibm-not-wf-P51-ibm51n02','ibm-not-wf-P51-ibm51n03','ibm-not-wf-P51-ibm51n04','ibm-not-wf-P51-ibm51n05','ibm-not-wf-P51-ibm51n06','ibm-not-wf-P51-ibm51n07'].
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P52/ibm52n01.xml
+%% ID: ibm-not-wf-P52-ibm52n01.xml
+%% Type: not-wf
+%% Sections: 3.3
+'ibm-not-wf-P52-ibm52n01'(suite) -> [];
+'ibm-not-wf-P52-ibm52n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P52/ibm52n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P52/ibm52n02.xml
+%% ID: ibm-not-wf-P52-ibm52n02.xml
+%% Type: not-wf
+%% Sections: 3.3
+'ibm-not-wf-P52-ibm52n02'(suite) -> [];
+'ibm-not-wf-P52-ibm52n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P52/ibm52n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P52/ibm52n03.xml
+%% ID: ibm-not-wf-P52-ibm52n03.xml
+%% Type: not-wf
+%% Sections: 3.3
+'ibm-not-wf-P52-ibm52n03'(suite) -> [];
+'ibm-not-wf-P52-ibm52n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P52/ibm52n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P52/ibm52n04.xml
+%% ID: ibm-not-wf-P52-ibm52n04.xml
+%% Type: not-wf
+%% Sections: 3.3
+'ibm-not-wf-P52-ibm52n04'(suite) -> [];
+'ibm-not-wf-P52-ibm52n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P52/ibm52n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P52/ibm52n05.xml
+%% ID: ibm-not-wf-P52-ibm52n05.xml
+%% Type: not-wf
+%% Sections: 3.3
+'ibm-not-wf-P52-ibm52n05'(suite) -> [];
+'ibm-not-wf-P52-ibm52n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P52/ibm52n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P52/ibm52n06.xml
+%% ID: ibm-not-wf-P52-ibm52n06.xml
+%% Type: not-wf
+%% Sections: 3.3
+'ibm-not-wf-P52-ibm52n06'(suite) -> [];
+'ibm-not-wf-P52-ibm52n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P52/ibm52n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 52
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P53/ibm53n01.xml
+%% ID: ibm-not-wf-P53-ibm53n01.xml
+%% Type: not-wf
+%% Sections: 3.3
+'ibm-not-wf-P53-ibm53n01'(suite) -> [];
+'ibm-not-wf-P53-ibm53n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P53/ibm53n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P53/ibm53n02.xml
+%% ID: ibm-not-wf-P53-ibm53n02.xml
+%% Type: not-wf
+%% Sections: 3.3
+'ibm-not-wf-P53-ibm53n02'(suite) -> [];
+'ibm-not-wf-P53-ibm53n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P53/ibm53n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P53/ibm53n03.xml
+%% ID: ibm-not-wf-P53-ibm53n03.xml
+%% Type: not-wf
+%% Sections: 3.3
+'ibm-not-wf-P53-ibm53n03'(suite) -> [];
+'ibm-not-wf-P53-ibm53n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P53/ibm53n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P53/ibm53n04.xml
+%% ID: ibm-not-wf-P53-ibm53n04.xml
+%% Type: not-wf
+%% Sections: 3.3
+'ibm-not-wf-P53-ibm53n04'(suite) -> [];
+'ibm-not-wf-P53-ibm53n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P53/ibm53n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P53/ibm53n05.xml
+%% ID: ibm-not-wf-P53-ibm53n05.xml
+%% Type: not-wf
+%% Sections: 3.3
+'ibm-not-wf-P53-ibm53n05'(suite) -> [];
+'ibm-not-wf-P53-ibm53n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P53/ibm53n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P53/ibm53n06.xml
+%% ID: ibm-not-wf-P53-ibm53n06.xml
+%% Type: not-wf
+%% Sections: 3.3
+'ibm-not-wf-P53-ibm53n06'(suite) -> [];
+'ibm-not-wf-P53-ibm53n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P53/ibm53n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P53/ibm53n07.xml
+%% ID: ibm-not-wf-P53-ibm53n07.xml
+%% Type: not-wf
+%% Sections: 3.3
+'ibm-not-wf-P53-ibm53n07'(suite) -> [];
+'ibm-not-wf-P53-ibm53n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P53/ibm53n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P53/ibm53n08.xml
+%% ID: ibm-not-wf-P53-ibm53n08.xml
+%% Type: not-wf
+%% Sections: 3.3
+'ibm-not-wf-P53-ibm53n08'(suite) -> [];
+'ibm-not-wf-P53-ibm53n08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P53/ibm53n08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 53
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P54/ibm54n01.xml
+%% ID: ibm-not-wf-P54-ibm54n01.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P54-ibm54n01'(suite) -> [];
+'ibm-not-wf-P54-ibm54n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P54/ibm54n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P54/ibm54n02.xml
+%% ID: ibm-not-wf-P54-ibm54n02.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P54-ibm54n02'(suite) -> [];
+'ibm-not-wf-P54-ibm54n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P54/ibm54n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 54
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P55/ibm55n01.xml
+%% ID: ibm-not-wf-P55-ibm55n01.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P55-ibm55n01'(suite) -> [];
+'ibm-not-wf-P55-ibm55n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P55/ibm55n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P55/ibm55n02.xml
+%% ID: ibm-not-wf-P55-ibm55n02.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P55-ibm55n02'(suite) -> [];
+'ibm-not-wf-P55-ibm55n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P55/ibm55n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P55/ibm55n03.xml
+%% ID: ibm-not-wf-P55-ibm55n03.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P55-ibm55n03'(suite) -> [];
+'ibm-not-wf-P55-ibm55n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P55/ibm55n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 55
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P56/ibm56n01.xml
+%% ID: ibm-not-wf-P56-ibm56n01.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P56-ibm56n01'(suite) -> [];
+'ibm-not-wf-P56-ibm56n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P56/ibm56n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P56/ibm56n02.xml
+%% ID: ibm-not-wf-P56-ibm56n02.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P56-ibm56n02'(suite) -> [];
+'ibm-not-wf-P56-ibm56n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P56/ibm56n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P56/ibm56n03.xml
+%% ID: ibm-not-wf-P56-ibm56n03.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P56-ibm56n03'(suite) -> [];
+'ibm-not-wf-P56-ibm56n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P56/ibm56n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P56/ibm56n04.xml
+%% ID: ibm-not-wf-P56-ibm56n04.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P56-ibm56n04'(suite) -> [];
+'ibm-not-wf-P56-ibm56n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P56/ibm56n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P56/ibm56n05.xml
+%% ID: ibm-not-wf-P56-ibm56n05.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P56-ibm56n05'(suite) -> [];
+'ibm-not-wf-P56-ibm56n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P56/ibm56n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P56/ibm56n06.xml
+%% ID: ibm-not-wf-P56-ibm56n06.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P56-ibm56n06'(suite) -> [];
+'ibm-not-wf-P56-ibm56n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P56/ibm56n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P56/ibm56n07.xml
+%% ID: ibm-not-wf-P56-ibm56n07.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P56-ibm56n07'(suite) -> [];
+'ibm-not-wf-P56-ibm56n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P56/ibm56n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 56
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P57/ibm57n01.xml
+%% ID: ibm-not-wf-P57-ibm57n01.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P57-ibm57n01'(suite) -> [];
+'ibm-not-wf-P57-ibm57n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P57/ibm57n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 57
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P58/ibm58n01.xml
+%% ID: ibm-not-wf-P58-ibm58n01.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P58-ibm58n01'(suite) -> [];
+'ibm-not-wf-P58-ibm58n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P58/ibm58n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P58/ibm58n02.xml
+%% ID: ibm-not-wf-P58-ibm58n02.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P58-ibm58n02'(suite) -> [];
+'ibm-not-wf-P58-ibm58n02'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P58/ibm58n02.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P58/ibm58n03.xml
+%% ID: ibm-not-wf-P58-ibm58n03.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P58-ibm58n03'(suite) -> [];
+'ibm-not-wf-P58-ibm58n03'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P58/ibm58n03.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P58/ibm58n04.xml
+%% ID: ibm-not-wf-P58-ibm58n04.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P58-ibm58n04'(suite) -> [];
+'ibm-not-wf-P58-ibm58n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P58/ibm58n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P58/ibm58n05.xml
+%% ID: ibm-not-wf-P58-ibm58n05.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P58-ibm58n05'(suite) -> [];
+'ibm-not-wf-P58-ibm58n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P58/ibm58n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P58/ibm58n06.xml
+%% ID: ibm-not-wf-P58-ibm58n06.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P58-ibm58n06'(suite) -> [];
+'ibm-not-wf-P58-ibm58n06'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P58/ibm58n06.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P58/ibm58n07.xml
+%% ID: ibm-not-wf-P58-ibm58n07.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P58-ibm58n07'(suite) -> [];
+'ibm-not-wf-P58-ibm58n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P58/ibm58n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P58/ibm58n08.xml
+%% ID: ibm-not-wf-P58-ibm58n08.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P58-ibm58n08'(suite) -> [];
+'ibm-not-wf-P58-ibm58n08'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P58/ibm58n08.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 58
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P59/ibm59n01.xml
+%% ID: ibm-not-wf-P59-ibm59n01.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P59-ibm59n01'(suite) -> [];
+'ibm-not-wf-P59-ibm59n01'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P59/ibm59n01.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P59/ibm59n02.xml
+%% ID: ibm-not-wf-P59-ibm59n02.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P59-ibm59n02'(suite) -> [];
+'ibm-not-wf-P59-ibm59n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P59/ibm59n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P59/ibm59n03.xml
+%% ID: ibm-not-wf-P59-ibm59n03.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P59-ibm59n03'(suite) -> [];
+'ibm-not-wf-P59-ibm59n03'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P59/ibm59n03.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P59/ibm59n04.xml
+%% ID: ibm-not-wf-P59-ibm59n04.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P59-ibm59n04'(suite) -> [];
+'ibm-not-wf-P59-ibm59n04'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P59/ibm59n04.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P59/ibm59n05.xml
+%% ID: ibm-not-wf-P59-ibm59n05.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P59-ibm59n05'(suite) -> [];
+'ibm-not-wf-P59-ibm59n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P59/ibm59n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P59/ibm59n06.xml
+%% ID: ibm-not-wf-P59-ibm59n06.xml
+%% Type: not-wf
+%% Sections: 3.3.1
+'ibm-not-wf-P59-ibm59n06'(suite) -> [];
+'ibm-not-wf-P59-ibm59n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P59/ibm59n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 59
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P60/ibm60n01.xml
+%% ID: ibm-not-wf-P60-ibm60n01.xml
+%% Type: not-wf
+%% Sections: 3.3.2
+'ibm-not-wf-P60-ibm60n01'(suite) -> [];
+'ibm-not-wf-P60-ibm60n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P60/ibm60n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P60/ibm60n02.xml
+%% ID: ibm-not-wf-P60-ibm60n02.xml
+%% Type: not-wf
+%% Sections: 3.3.2
+'ibm-not-wf-P60-ibm60n02'(suite) -> [];
+'ibm-not-wf-P60-ibm60n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P60/ibm60n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P60/ibm60n03.xml
+%% ID: ibm-not-wf-P60-ibm60n03.xml
+%% Type: not-wf
+%% Sections: 3.3.2
+'ibm-not-wf-P60-ibm60n03'(suite) -> [];
+'ibm-not-wf-P60-ibm60n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P60/ibm60n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P60/ibm60n04.xml
+%% ID: ibm-not-wf-P60-ibm60n04.xml
+%% Type: not-wf
+%% Sections: 3.3.2
+'ibm-not-wf-P60-ibm60n04'(suite) -> [];
+'ibm-not-wf-P60-ibm60n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P60/ibm60n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P60/ibm60n05.xml
+%% ID: ibm-not-wf-P60-ibm60n05.xml
+%% Type: not-wf
+%% Sections: 3.3.2
+'ibm-not-wf-P60-ibm60n05'(suite) -> [];
+'ibm-not-wf-P60-ibm60n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P60/ibm60n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P60/ibm60n06.xml
+%% ID: ibm-not-wf-P60-ibm60n06.xml
+%% Type: not-wf
+%% Sections: 3.3.2
+'ibm-not-wf-P60-ibm60n06'(suite) -> [];
+'ibm-not-wf-P60-ibm60n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P60/ibm60n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P60/ibm60n07.xml
+%% ID: ibm-not-wf-P60-ibm60n07.xml
+%% Type: not-wf
+%% Sections: 3.3.2
+'ibm-not-wf-P60-ibm60n07'(suite) -> [];
+'ibm-not-wf-P60-ibm60n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P60/ibm60n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P60/ibm60n08.xml
+%% ID: ibm-not-wf-P60-ibm60n08.xml
+%% Type: not-wf
+%% Sections: 3.3.2
+'ibm-not-wf-P60-ibm60n08'(suite) -> [];
+'ibm-not-wf-P60-ibm60n08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P60/ibm60n08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 60
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P61/ibm61n01.xml
+%% ID: ibm-not-wf-P61-ibm61n01.xml
+%% Type: not-wf
+%% Sections: 3.4
+'ibm-not-wf-P61-ibm61n01'(suite) -> [];
+'ibm-not-wf-P61-ibm61n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P61/ibm61n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 61
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P62/ibm62n01.xml
+%% ID: ibm-not-wf-P62-ibm62n01.xml
+%% Type: not-wf
+%% Sections: 3.4
+'ibm-not-wf-P62-ibm62n01'(suite) -> [];
+'ibm-not-wf-P62-ibm62n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P62/ibm62n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P62/ibm62n02.xml
+%% ID: ibm-not-wf-P62-ibm62n02.xml
+%% Type: not-wf
+%% Sections: 3.4
+'ibm-not-wf-P62-ibm62n02'(suite) -> [];
+'ibm-not-wf-P62-ibm62n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P62/ibm62n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P62/ibm62n03.xml
+%% ID: ibm-not-wf-P62-ibm62n03.xml
+%% Type: not-wf
+%% Sections: 3.4
+'ibm-not-wf-P62-ibm62n03'(suite) -> [];
+'ibm-not-wf-P62-ibm62n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P62/ibm62n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P62/ibm62n04.xml
+%% ID: ibm-not-wf-P62-ibm62n04.xml
+%% Type: not-wf
+%% Sections: 3.4
+'ibm-not-wf-P62-ibm62n04'(suite) -> [];
+'ibm-not-wf-P62-ibm62n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P62/ibm62n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P62/ibm62n05.xml
+%% ID: ibm-not-wf-P62-ibm62n05.xml
+%% Type: not-wf
+%% Sections: 3.4
+'ibm-not-wf-P62-ibm62n05'(suite) -> [];
+'ibm-not-wf-P62-ibm62n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P62/ibm62n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P62/ibm62n06.xml
+%% ID: ibm-not-wf-P62-ibm62n06.xml
+%% Type: not-wf
+%% Sections: 3.4
+'ibm-not-wf-P62-ibm62n06'(suite) -> [];
+'ibm-not-wf-P62-ibm62n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P62/ibm62n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P62/ibm62n07.xml
+%% ID: ibm-not-wf-P62-ibm62n07.xml
+%% Type: not-wf
+%% Sections: 3.4
+'ibm-not-wf-P62-ibm62n07'(suite) -> [];
+'ibm-not-wf-P62-ibm62n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P62/ibm62n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P62/ibm62n08.xml
+%% ID: ibm-not-wf-P62-ibm62n08.xml
+%% Type: not-wf
+%% Sections: 3.4
+'ibm-not-wf-P62-ibm62n08'(suite) -> [];
+'ibm-not-wf-P62-ibm62n08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P62/ibm62n08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 62
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P63/ibm63n01.xml
+%% ID: ibm-not-wf-P63-ibm63n01.xml
+%% Type: not-wf
+%% Sections: 3.4
+'ibm-not-wf-P63-ibm63n01'(suite) -> [];
+'ibm-not-wf-P63-ibm63n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P63/ibm63n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P63/ibm63n02.xml
+%% ID: ibm-not-wf-P63-ibm63n02.xml
+%% Type: not-wf
+%% Sections: 3.4
+'ibm-not-wf-P63-ibm63n02'(suite) -> [];
+'ibm-not-wf-P63-ibm63n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P63/ibm63n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P63/ibm63n03.xml
+%% ID: ibm-not-wf-P63-ibm63n03.xml
+%% Type: not-wf
+%% Sections: 3.4
+'ibm-not-wf-P63-ibm63n03'(suite) -> [];
+'ibm-not-wf-P63-ibm63n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P63/ibm63n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P63/ibm63n04.xml
+%% ID: ibm-not-wf-P63-ibm63n04.xml
+%% Type: not-wf
+%% Sections: 3.4
+'ibm-not-wf-P63-ibm63n04'(suite) -> [];
+'ibm-not-wf-P63-ibm63n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P63/ibm63n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P63/ibm63n05.xml
+%% ID: ibm-not-wf-P63-ibm63n05.xml
+%% Type: not-wf
+%% Sections: 3.4
+'ibm-not-wf-P63-ibm63n05'(suite) -> [];
+'ibm-not-wf-P63-ibm63n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P63/ibm63n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P63/ibm63n06.xml
+%% ID: ibm-not-wf-P63-ibm63n06.xml
+%% Type: not-wf
+%% Sections: 3.4
+'ibm-not-wf-P63-ibm63n06'(suite) -> [];
+'ibm-not-wf-P63-ibm63n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P63/ibm63n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P63/ibm63n07.xml
+%% ID: ibm-not-wf-P63-ibm63n07.xml
+%% Type: not-wf
+%% Sections: 3.4
+'ibm-not-wf-P63-ibm63n07'(suite) -> [];
+'ibm-not-wf-P63-ibm63n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P63/ibm63n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 63
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P64/ibm64n01.xml
+%% ID: ibm-not-wf-P64-ibm64n01.xml
+%% Type: not-wf
+%% Sections: 3.4
+'ibm-not-wf-P64-ibm64n01'(suite) -> [];
+'ibm-not-wf-P64-ibm64n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P64/ibm64n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P64/ibm64n02.xml
+%% ID: ibm-not-wf-P64-ibm64n02.xml
+%% Type: not-wf
+%% Sections: 3.4
+'ibm-not-wf-P64-ibm64n02'(suite) -> [];
+'ibm-not-wf-P64-ibm64n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P64/ibm64n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P64/ibm64n03.xml
+%% ID: ibm-not-wf-P64-ibm64n03.xml
+%% Type: not-wf
+%% Sections: 3.4
+'ibm-not-wf-P64-ibm64n03'(suite) -> [];
+'ibm-not-wf-P64-ibm64n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P64/ibm64n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 64
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P65/ibm65n01.xml
+%% ID: ibm-not-wf-P65-ibm65n01.xml
+%% Type: not-wf
+%% Sections: 3.4
+'ibm-not-wf-P65-ibm65n01'(suite) -> [];
+'ibm-not-wf-P65-ibm65n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P65/ibm65n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P65/ibm65n02.xml
+%% ID: ibm-not-wf-P65-ibm65n02.xml
+%% Type: not-wf
+%% Sections: 3.4
+'ibm-not-wf-P65-ibm65n02'(suite) -> [];
+'ibm-not-wf-P65-ibm65n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P65/ibm65n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 65
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P66/ibm66n01.xml
+%% ID: ibm-not-wf-P66-ibm66n01.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P66-ibm66n01'(suite) -> [];
+'ibm-not-wf-P66-ibm66n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P66/ibm66n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P66/ibm66n02.xml
+%% ID: ibm-not-wf-P66-ibm66n02.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P66-ibm66n02'(suite) -> [];
+'ibm-not-wf-P66-ibm66n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P66/ibm66n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P66/ibm66n03.xml
+%% ID: ibm-not-wf-P66-ibm66n03.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P66-ibm66n03'(suite) -> [];
+'ibm-not-wf-P66-ibm66n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P66/ibm66n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P66/ibm66n04.xml
+%% ID: ibm-not-wf-P66-ibm66n04.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P66-ibm66n04'(suite) -> [];
+'ibm-not-wf-P66-ibm66n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P66/ibm66n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P66/ibm66n05.xml
+%% ID: ibm-not-wf-P66-ibm66n05.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P66-ibm66n05'(suite) -> [];
+'ibm-not-wf-P66-ibm66n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P66/ibm66n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P66/ibm66n06.xml
+%% ID: ibm-not-wf-P66-ibm66n06.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P66-ibm66n06'(suite) -> [];
+'ibm-not-wf-P66-ibm66n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P66/ibm66n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P66/ibm66n07.xml
+%% ID: ibm-not-wf-P66-ibm66n07.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P66-ibm66n07'(suite) -> [];
+'ibm-not-wf-P66-ibm66n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P66/ibm66n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P66/ibm66n08.xml
+%% ID: ibm-not-wf-P66-ibm66n08.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P66-ibm66n08'(suite) -> [];
+'ibm-not-wf-P66-ibm66n08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P66/ibm66n08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P66/ibm66n09.xml
+%% ID: ibm-not-wf-P66-ibm66n09.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P66-ibm66n09'(suite) -> [];
+'ibm-not-wf-P66-ibm66n09'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P66/ibm66n09.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P66/ibm66n10.xml
+%% ID: ibm-not-wf-P66-ibm66n10.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P66-ibm66n10'(suite) -> [];
+'ibm-not-wf-P66-ibm66n10'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P66/ibm66n10.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P66/ibm66n11.xml
+%% ID: ibm-not-wf-P66-ibm66n11.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P66-ibm66n11'(suite) -> [];
+'ibm-not-wf-P66-ibm66n11'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P66/ibm66n11.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P66/ibm66n12.xml
+%% ID: ibm-not-wf-P66-ibm66n12.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P66-ibm66n12'(suite) -> [];
+'ibm-not-wf-P66-ibm66n12'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P66/ibm66n12.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P66/ibm66n13.xml
+%% ID: ibm-not-wf-P66-ibm66n13.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P66-ibm66n13'(suite) -> [];
+'ibm-not-wf-P66-ibm66n13'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P66/ibm66n13.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P66/ibm66n14.xml
+%% ID: ibm-not-wf-P66-ibm66n14.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P66-ibm66n14'(suite) -> [];
+'ibm-not-wf-P66-ibm66n14'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P66/ibm66n14.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P66/ibm66n15.xml
+%% ID: ibm-not-wf-P66-ibm66n15.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P66-ibm66n15'(suite) -> [];
+'ibm-not-wf-P66-ibm66n15'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P66/ibm66n15.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 66
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P68/ibm68n01.xml
+%% ID: ibm-not-wf-P68-ibm68n01.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P68-ibm68n01'(suite) -> [];
+'ibm-not-wf-P68-ibm68n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P68/ibm68n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P68/ibm68n02.xml
+%% ID: ibm-not-wf-P68-ibm68n02.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P68-ibm68n02'(suite) -> [];
+'ibm-not-wf-P68-ibm68n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P68/ibm68n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P68/ibm68n03.xml
+%% ID: ibm-not-wf-P68-ibm68n03.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P68-ibm68n03'(suite) -> [];
+'ibm-not-wf-P68-ibm68n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P68/ibm68n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P68/ibm68n04.xml
+%% ID: ibm-not-wf-P68-ibm68n04.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P68-ibm68n04'(suite) -> [];
+'ibm-not-wf-P68-ibm68n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P68/ibm68n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P68/ibm68n05.xml
+%% ID: ibm-not-wf-P68-ibm68n05.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P68-ibm68n05'(suite) -> [];
+'ibm-not-wf-P68-ibm68n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P68/ibm68n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P68/ibm68n06.xml
+%% ID: ibm-not-wf-P68-ibm68n06.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P68-ibm68n06'(suite) -> [];
+'ibm-not-wf-P68-ibm68n06'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P68/ibm68n06.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P68/ibm68n07.xml
+%% ID: ibm-not-wf-P68-ibm68n07.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P68-ibm68n07'(suite) -> [];
+'ibm-not-wf-P68-ibm68n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P68/ibm68n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P68/ibm68n08.xml
+%% ID: ibm-not-wf-P68-ibm68n08.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P68-ibm68n08'(suite) -> [];
+'ibm-not-wf-P68-ibm68n08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P68/ibm68n08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P68/ibm68n09.xml
+%% ID: ibm-not-wf-P68-ibm68n09.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P68-ibm68n09'(suite) -> [];
+'ibm-not-wf-P68-ibm68n09'(_Config) -> {skip, "No loop detection yet"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P68/ibm68n09.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P68/ibm68n10.xml
+%% ID: ibm-not-wf-P68-ibm68n10.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P68-ibm68n10'(suite) -> [];
+'ibm-not-wf-P68-ibm68n10'(_Config) -> {skip, "No loop detection yet"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P68/ibm68n10.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 68
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P69/ibm69n01.xml
+%% ID: ibm-not-wf-P69-ibm69n01.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P69-ibm69n01'(suite) -> [];
+'ibm-not-wf-P69-ibm69n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P69/ibm69n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P69/ibm69n02.xml
+%% ID: ibm-not-wf-P69-ibm69n02.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P69-ibm69n02'(suite) -> [];
+'ibm-not-wf-P69-ibm69n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P69/ibm69n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P69/ibm69n03.xml
+%% ID: ibm-not-wf-P69-ibm69n03.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P69-ibm69n03'(suite) -> [];
+'ibm-not-wf-P69-ibm69n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P69/ibm69n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P69/ibm69n04.xml
+%% ID: ibm-not-wf-P69-ibm69n04.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P69-ibm69n04'(suite) -> [];
+'ibm-not-wf-P69-ibm69n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P69/ibm69n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P69/ibm69n05.xml
+%% ID: ibm-not-wf-P69-ibm69n05.xml
+%% Type: error
+%% Sections: 4.1
+'ibm-not-wf-P69-ibm69n05'(suite) -> [];
+'ibm-not-wf-P69-ibm69n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P69/ibm69n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "error").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P69/ibm69n06.xml
+%% ID: ibm-not-wf-P69-ibm69n06.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P69-ibm69n06'(suite) -> [];
+'ibm-not-wf-P69-ibm69n06'(_Config) -> {skip, "No loop detection yet"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P69/ibm69n06.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P69/ibm69n07.xml
+%% ID: ibm-not-wf-P69-ibm69n07.xml
+%% Type: not-wf
+%% Sections: 4.1
+'ibm-not-wf-P69-ibm69n07'(suite) -> [];
+'ibm-not-wf-P69-ibm69n07'(_Config) -> {skip, "No loop detection yet"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P69/ibm69n07.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 69
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P71/ibm70n01.xml
+%% ID: ibm-not-wf-P71-ibm70n01.xml
+%% Type: not-wf
+%% Sections: 4.2
+'ibm-not-wf-P71-ibm70n01'(suite) -> [];
+'ibm-not-wf-P71-ibm70n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P71/ibm70n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P71/ibm71n01.xml
+%% ID: ibm-not-wf-P71-ibm71n01.xml
+%% Type: not-wf
+%% Sections: 4.2
+'ibm-not-wf-P71-ibm71n01'(suite) -> [];
+'ibm-not-wf-P71-ibm71n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P71/ibm71n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P71/ibm71n02.xml
+%% ID: ibm-not-wf-P71-ibm71n02.xml
+%% Type: not-wf
+%% Sections: 4.2
+'ibm-not-wf-P71-ibm71n02'(suite) -> [];
+'ibm-not-wf-P71-ibm71n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P71/ibm71n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P71/ibm71n03.xml
+%% ID: ibm-not-wf-P71-ibm71n03.xml
+%% Type: not-wf
+%% Sections: 4.2
+'ibm-not-wf-P71-ibm71n03'(suite) -> [];
+'ibm-not-wf-P71-ibm71n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P71/ibm71n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P71/ibm71n04.xml
+%% ID: ibm-not-wf-P71-ibm71n04.xml
+%% Type: not-wf
+%% Sections: 4.2
+'ibm-not-wf-P71-ibm71n04'(suite) -> [];
+'ibm-not-wf-P71-ibm71n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P71/ibm71n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P71/ibm71n05.xml
+%% ID: ibm-not-wf-P71-ibm71n05.xml
+%% Type: not-wf
+%% Sections: 4.2
+'ibm-not-wf-P71-ibm71n05'(suite) -> [];
+'ibm-not-wf-P71-ibm71n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P71/ibm71n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P71/ibm71n06.xml
+%% ID: ibm-not-wf-P71-ibm71n06.xml
+%% Type: not-wf
+%% Sections: 4.2
+'ibm-not-wf-P71-ibm71n06'(suite) -> [];
+'ibm-not-wf-P71-ibm71n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P71/ibm71n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P71/ibm71n07.xml
+%% ID: ibm-not-wf-P71-ibm71n07.xml
+%% Type: not-wf
+%% Sections: 4.2
+'ibm-not-wf-P71-ibm71n07'(suite) -> [];
+'ibm-not-wf-P71-ibm71n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P71/ibm71n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P71/ibm71n08.xml
+%% ID: ibm-not-wf-P71-ibm71n08.xml
+%% Type: not-wf
+%% Sections: 4.2
+'ibm-not-wf-P71-ibm71n08'(suite) -> [];
+'ibm-not-wf-P71-ibm71n08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P71/ibm71n08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 71
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P72/ibm72n01.xml
+%% ID: ibm-not-wf-P72-ibm72n01.xml
+%% Type: not-wf
+%% Sections: 4.2
+'ibm-not-wf-P72-ibm72n01'(suite) -> [];
+'ibm-not-wf-P72-ibm72n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P72/ibm72n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P72/ibm72n02.xml
+%% ID: ibm-not-wf-P72-ibm72n02.xml
+%% Type: not-wf
+%% Sections: 4.2
+'ibm-not-wf-P72-ibm72n02'(suite) -> [];
+'ibm-not-wf-P72-ibm72n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P72/ibm72n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P72/ibm72n03.xml
+%% ID: ibm-not-wf-P72-ibm72n03.xml
+%% Type: not-wf
+%% Sections: 4.2
+'ibm-not-wf-P72-ibm72n03'(suite) -> [];
+'ibm-not-wf-P72-ibm72n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P72/ibm72n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P72/ibm72n04.xml
+%% ID: ibm-not-wf-P72-ibm72n04.xml
+%% Type: not-wf
+%% Sections: 4.2
+'ibm-not-wf-P72-ibm72n04'(suite) -> [];
+'ibm-not-wf-P72-ibm72n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P72/ibm72n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P72/ibm72n05.xml
+%% ID: ibm-not-wf-P72-ibm72n05.xml
+%% Type: not-wf
+%% Sections: 4.2
+'ibm-not-wf-P72-ibm72n05'(suite) -> [];
+'ibm-not-wf-P72-ibm72n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P72/ibm72n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P72/ibm72n06.xml
+%% ID: ibm-not-wf-P72-ibm72n06.xml
+%% Type: not-wf
+%% Sections: 4.2
+'ibm-not-wf-P72-ibm72n06'(suite) -> [];
+'ibm-not-wf-P72-ibm72n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P72/ibm72n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P72/ibm72n07.xml
+%% ID: ibm-not-wf-P72-ibm72n07.xml
+%% Type: not-wf
+%% Sections: 4.2
+'ibm-not-wf-P72-ibm72n07'(suite) -> [];
+'ibm-not-wf-P72-ibm72n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P72/ibm72n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P72/ibm72n08.xml
+%% ID: ibm-not-wf-P72-ibm72n08.xml
+%% Type: not-wf
+%% Sections: 4.2
+'ibm-not-wf-P72-ibm72n08'(suite) -> [];
+'ibm-not-wf-P72-ibm72n08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P72/ibm72n08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P72/ibm72n09.xml
+%% ID: ibm-not-wf-P72-ibm72n09.xml
+%% Type: not-wf
+%% Sections: 4.2
+'ibm-not-wf-P72-ibm72n09'(suite) -> [];
+'ibm-not-wf-P72-ibm72n09'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P72/ibm72n09.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 72
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P73/ibm73n01.xml
+%% ID: ibm-not-wf-P73-ibm73n01.xml
+%% Type: not-wf
+%% Sections: 4.2
+'ibm-not-wf-P73-ibm73n01'(suite) -> [];
+'ibm-not-wf-P73-ibm73n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P73/ibm73n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P73/ibm73n03.xml
+%% ID: ibm-not-wf-P73-ibm73n03.xml
+%% Type: not-wf
+%% Sections: 4.2
+'ibm-not-wf-P73-ibm73n03'(suite) -> [];
+'ibm-not-wf-P73-ibm73n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P73/ibm73n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 73
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P74/ibm74n01.xml
+%% ID: ibm-not-wf-P74-ibm74n01.xml
+%% Type: not-wf
+%% Sections: 4.2
+'ibm-not-wf-P74-ibm74n01'(suite) -> [];
+'ibm-not-wf-P74-ibm74n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P74/ibm74n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 74
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P75/ibm75n01.xml
+%% ID: ibm-not-wf-P75-ibm75n01.xml
+%% Type: not-wf
+%% Sections: 4.2.2
+'ibm-not-wf-P75-ibm75n01'(suite) -> [];
+'ibm-not-wf-P75-ibm75n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P75/ibm75n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P75/ibm75n02.xml
+%% ID: ibm-not-wf-P75-ibm75n02.xml
+%% Type: not-wf
+%% Sections: 4.2.2
+'ibm-not-wf-P75-ibm75n02'(suite) -> [];
+'ibm-not-wf-P75-ibm75n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P75/ibm75n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P75/ibm75n03.xml
+%% ID: ibm-not-wf-P75-ibm75n03.xml
+%% Type: not-wf
+%% Sections: 4.2.2
+'ibm-not-wf-P75-ibm75n03'(suite) -> [];
+'ibm-not-wf-P75-ibm75n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P75/ibm75n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P75/ibm75n04.xml
+%% ID: ibm-not-wf-P75-ibm75n04.xml
+%% Type: not-wf
+%% Sections: 4.2.2
+'ibm-not-wf-P75-ibm75n04'(suite) -> [];
+'ibm-not-wf-P75-ibm75n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P75/ibm75n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P75/ibm75n05.xml
+%% ID: ibm-not-wf-P75-ibm75n05.xml
+%% Type: not-wf
+%% Sections: 4.2.2
+'ibm-not-wf-P75-ibm75n05'(suite) -> [];
+'ibm-not-wf-P75-ibm75n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P75/ibm75n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P75/ibm75n06.xml
+%% ID: ibm-not-wf-P75-ibm75n06.xml
+%% Type: not-wf
+%% Sections: 4.2.2
+'ibm-not-wf-P75-ibm75n06'(suite) -> [];
+'ibm-not-wf-P75-ibm75n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P75/ibm75n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P75/ibm75n07.xml
+%% ID: ibm-not-wf-P75-ibm75n07.xml
+%% Type: not-wf
+%% Sections: 4.2.2
+'ibm-not-wf-P75-ibm75n07'(suite) -> [];
+'ibm-not-wf-P75-ibm75n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P75/ibm75n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P75/ibm75n08.xml
+%% ID: ibm-not-wf-P75-ibm75n08.xml
+%% Type: not-wf
+%% Sections: 4.2.2
+'ibm-not-wf-P75-ibm75n08'(suite) -> [];
+'ibm-not-wf-P75-ibm75n08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P75/ibm75n08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P75/ibm75n09.xml
+%% ID: ibm-not-wf-P75-ibm75n09.xml
+%% Type: not-wf
+%% Sections: 4.2.2
+'ibm-not-wf-P75-ibm75n09'(suite) -> [];
+'ibm-not-wf-P75-ibm75n09'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P75/ibm75n09.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P75/ibm75n10.xml
+%% ID: ibm-not-wf-P75-ibm75n10.xml
+%% Type: not-wf
+%% Sections: 4.2.2
+'ibm-not-wf-P75-ibm75n10'(suite) -> [];
+'ibm-not-wf-P75-ibm75n10'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P75/ibm75n10.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P75/ibm75n11.xml
+%% ID: ibm-not-wf-P75-ibm75n11.xml
+%% Type: not-wf
+%% Sections: 4.2.2
+'ibm-not-wf-P75-ibm75n11'(suite) -> [];
+'ibm-not-wf-P75-ibm75n11'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P75/ibm75n11.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P75/ibm75n12.xml
+%% ID: ibm-not-wf-P75-ibm75n12.xml
+%% Type: not-wf
+%% Sections: 4.2.2
+'ibm-not-wf-P75-ibm75n12'(suite) -> [];
+'ibm-not-wf-P75-ibm75n12'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P75/ibm75n12.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P75/ibm75n13.xml
+%% ID: ibm-not-wf-P75-ibm75n13.xml
+%% Type: not-wf
+%% Sections: 4.2.2
+'ibm-not-wf-P75-ibm75n13'(suite) -> [];
+'ibm-not-wf-P75-ibm75n13'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P75/ibm75n13.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 75
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P76/ibm76n01.xml
+%% ID: ibm-not-wf-P76-ibm76n01.xml
+%% Type: not-wf
+%% Sections: 4.2.2
+'ibm-not-wf-P76-ibm76n01'(suite) -> [];
+'ibm-not-wf-P76-ibm76n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P76/ibm76n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P76/ibm76n02.xml
+%% ID: ibm-not-wf-P76-ibm76n02.xml
+%% Type: not-wf
+%% Sections: 4.2.2
+'ibm-not-wf-P76-ibm76n02'(suite) -> [];
+'ibm-not-wf-P76-ibm76n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P76/ibm76n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P76/ibm76n03.xml
+%% ID: ibm-not-wf-P76-ibm76n03.xml
+%% Type: not-wf
+%% Sections: 4.2.2
+'ibm-not-wf-P76-ibm76n03'(suite) -> [];
+'ibm-not-wf-P76-ibm76n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P76/ibm76n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P76/ibm76n04.xml
+%% ID: ibm-not-wf-P76-ibm76n04.xml
+%% Type: not-wf
+%% Sections: 4.2.2
+'ibm-not-wf-P76-ibm76n04'(suite) -> [];
+'ibm-not-wf-P76-ibm76n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P76/ibm76n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P76/ibm76n05.xml
+%% ID: ibm-not-wf-P76-ibm76n05.xml
+%% Type: not-wf
+%% Sections: 4.2.2
+'ibm-not-wf-P76-ibm76n05'(suite) -> [];
+'ibm-not-wf-P76-ibm76n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P76/ibm76n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P76/ibm76n06.xml
+%% ID: ibm-not-wf-P76-ibm76n06.xml
+%% Type: not-wf
+%% Sections: 4.2.2
+'ibm-not-wf-P76-ibm76n06'(suite) -> [];
+'ibm-not-wf-P76-ibm76n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P76/ibm76n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P76/ibm76n07.xml
+%% ID: ibm-not-wf-P76-ibm76n07.xml
+%% Type: not-wf
+%% Sections: 4.2.2
+'ibm-not-wf-P76-ibm76n07'(suite) -> [];
+'ibm-not-wf-P76-ibm76n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P76/ibm76n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 76
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P77/ibm77n01.xml
+%% ID: ibm-not-wf-P77-ibm77n01.xml
+%% Type: not-wf
+%% Sections: 4.3.1
+'ibm-not-wf-P77-ibm77n01'(suite) -> [];
+'ibm-not-wf-P77-ibm77n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P77/ibm77n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P77/ibm77n02.xml
+%% ID: ibm-not-wf-P77-ibm77n02.xml
+%% Type: not-wf
+%% Sections: 4.3.1
+'ibm-not-wf-P77-ibm77n02'(suite) -> [];
+'ibm-not-wf-P77-ibm77n02'(Config) -> {skip, "Fix 3"}.
+ %%?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ %%?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P77/ibm77n02.xml"]),
+ %%?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P77/ibm77n03.xml
+%% ID: ibm-not-wf-P77-ibm77n03.xml
+%% Type: not-wf
+%% Sections: 4.3.1
+'ibm-not-wf-P77-ibm77n03'(suite) -> [];
+'ibm-not-wf-P77-ibm77n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P77/ibm77n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P77/ibm77n04.xml
+%% ID: ibm-not-wf-P77-ibm77n04.xml
+%% Type: not-wf
+%% Sections: 4.3.1
+'ibm-not-wf-P77-ibm77n04'(suite) -> [];
+'ibm-not-wf-P77-ibm77n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P77/ibm77n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 77
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P78/ibm78n01.xml
+%% ID: ibm-not-wf-P78-ibm78n01.xml
+%% Type: not-wf
+%% Sections: 4.3.2
+'ibm-not-wf-P78-ibm78n01'(suite) -> [];
+'ibm-not-wf-P78-ibm78n01'(Config) -> {skip, "Fix 3"}.
+ %%?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ %%?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P78/ibm78n01.xml"]),
+ %%?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P78/ibm78n02.xml
+%% ID: ibm-not-wf-P78-ibm78n02.xml
+%% Type: not-wf
+%% Sections: 4.3.2
+'ibm-not-wf-P78-ibm78n02'(suite) -> [];
+'ibm-not-wf-P78-ibm78n02'(Config) -> {skip, "Fix 3"}.
+ %%?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ %%?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P78/ibm78n02.xml"]),
+ %%?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ %%?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 78
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P79/ibm79n01.xml
+%% ID: ibm-not-wf-P79-ibm79n01.xml
+%% Type: not-wf
+%% Sections: 4.3.2
+'ibm-not-wf-P79-ibm79n01'(suite) -> [];
+'ibm-not-wf-P79-ibm79n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P79/ibm79n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P79/ibm79n02.xml
+%% ID: ibm-not-wf-P79-ibm79n02.xml
+%% Type: not-wf
+%% Sections: 4.3.2
+'ibm-not-wf-P79-ibm79n02'(suite) -> [];
+'ibm-not-wf-P79-ibm79n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P79/ibm79n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 79
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P80/ibm80n01.xml
+%% ID: ibm-not-wf-P80-ibm80n01.xml
+%% Type: not-wf
+%% Sections: 4.3.3
+'ibm-not-wf-P80-ibm80n01'(suite) -> [];
+'ibm-not-wf-P80-ibm80n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P80/ibm80n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P80/ibm80n02.xml
+%% ID: ibm-not-wf-P80-ibm80n02.xml
+%% Type: not-wf
+%% Sections: 4.3.3
+'ibm-not-wf-P80-ibm80n02'(suite) -> [];
+'ibm-not-wf-P80-ibm80n02'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P80/ibm80n02.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P80/ibm80n03.xml
+%% ID: ibm-not-wf-P80-ibm80n03.xml
+%% Type: not-wf
+%% Sections: 4.3.3
+'ibm-not-wf-P80-ibm80n03'(suite) -> [];
+'ibm-not-wf-P80-ibm80n03'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P80/ibm80n03.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P80/ibm80n04.xml
+%% ID: ibm-not-wf-P80-ibm80n04.xml
+%% Type: not-wf
+%% Sections: 4.3.3
+'ibm-not-wf-P80-ibm80n04'(suite) -> [];
+'ibm-not-wf-P80-ibm80n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P80/ibm80n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P80/ibm80n05.xml
+%% ID: ibm-not-wf-P80-ibm80n05.xml
+%% Type: not-wf
+%% Sections: 4.3.3
+'ibm-not-wf-P80-ibm80n05'(suite) -> [];
+'ibm-not-wf-P80-ibm80n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P80/ibm80n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P80/ibm80n06.xml
+%% ID: ibm-not-wf-P80-ibm80n06.xml
+%% Type: not-wf
+%% Sections: 4.3.3
+'ibm-not-wf-P80-ibm80n06'(suite) -> [];
+'ibm-not-wf-P80-ibm80n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P80/ibm80n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 80
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P81/ibm81n01.xml
+%% ID: ibm-not-wf-P81-ibm81n01.xml
+%% Type: not-wf
+%% Sections: 4.3.3
+'ibm-not-wf-P81-ibm81n01'(suite) -> [];
+'ibm-not-wf-P81-ibm81n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P81/ibm81n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P81/ibm81n02.xml
+%% ID: ibm-not-wf-P81-ibm81n02.xml
+%% Type: not-wf
+%% Sections: 4.3.3
+'ibm-not-wf-P81-ibm81n02'(suite) -> [];
+'ibm-not-wf-P81-ibm81n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P81/ibm81n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P81/ibm81n03.xml
+%% ID: ibm-not-wf-P81-ibm81n03.xml
+%% Type: not-wf
+%% Sections: 4.3.3
+'ibm-not-wf-P81-ibm81n03'(suite) -> [];
+'ibm-not-wf-P81-ibm81n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P81/ibm81n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P81/ibm81n04.xml
+%% ID: ibm-not-wf-P81-ibm81n04.xml
+%% Type: not-wf
+%% Sections: 4.3.3
+'ibm-not-wf-P81-ibm81n04'(suite) -> [];
+'ibm-not-wf-P81-ibm81n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P81/ibm81n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P81/ibm81n05.xml
+%% ID: ibm-not-wf-P81-ibm81n05.xml
+%% Type: not-wf
+%% Sections: 4.3.3
+'ibm-not-wf-P81-ibm81n05'(suite) -> [];
+'ibm-not-wf-P81-ibm81n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P81/ibm81n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P81/ibm81n06.xml
+%% ID: ibm-not-wf-P81-ibm81n06.xml
+%% Type: not-wf
+%% Sections: 4.3.3
+'ibm-not-wf-P81-ibm81n06'(suite) -> [];
+'ibm-not-wf-P81-ibm81n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P81/ibm81n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P81/ibm81n07.xml
+%% ID: ibm-not-wf-P81-ibm81n07.xml
+%% Type: not-wf
+%% Sections: 4.3.3
+'ibm-not-wf-P81-ibm81n07'(suite) -> [];
+'ibm-not-wf-P81-ibm81n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P81/ibm81n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P81/ibm81n08.xml
+%% ID: ibm-not-wf-P81-ibm81n08.xml
+%% Type: not-wf
+%% Sections: 4.3.3
+'ibm-not-wf-P81-ibm81n08'(suite) -> [];
+'ibm-not-wf-P81-ibm81n08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P81/ibm81n08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P81/ibm81n09.xml
+%% ID: ibm-not-wf-P81-ibm81n09.xml
+%% Type: not-wf
+%% Sections: 4.3.3
+'ibm-not-wf-P81-ibm81n09'(suite) -> [];
+'ibm-not-wf-P81-ibm81n09'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P81/ibm81n09.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 81
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P82/ibm82n01.xml
+%% ID: ibm-not-wf-P82-ibm82n01.xml
+%% Type: not-wf
+%% Sections: 4.7
+'ibm-not-wf-P82-ibm82n01'(suite) -> [];
+'ibm-not-wf-P82-ibm82n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P82/ibm82n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P82/ibm82n02.xml
+%% ID: ibm-not-wf-P82-ibm82n02.xml
+%% Type: not-wf
+%% Sections: 4.7
+'ibm-not-wf-P82-ibm82n02'(suite) -> [];
+'ibm-not-wf-P82-ibm82n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P82/ibm82n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P82/ibm82n03.xml
+%% ID: ibm-not-wf-P82-ibm82n03.xml
+%% Type: not-wf
+%% Sections: 4.7
+'ibm-not-wf-P82-ibm82n03'(suite) -> [];
+'ibm-not-wf-P82-ibm82n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P82/ibm82n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P82/ibm82n04.xml
+%% ID: ibm-not-wf-P82-ibm82n04.xml
+%% Type: not-wf
+%% Sections: 4.7
+'ibm-not-wf-P82-ibm82n04'(suite) -> [];
+'ibm-not-wf-P82-ibm82n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P82/ibm82n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P82/ibm82n05.xml
+%% ID: ibm-not-wf-P82-ibm82n05.xml
+%% Type: not-wf
+%% Sections: 4.7
+'ibm-not-wf-P82-ibm82n05'(suite) -> [];
+'ibm-not-wf-P82-ibm82n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P82/ibm82n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P82/ibm82n06.xml
+%% ID: ibm-not-wf-P82-ibm82n06.xml
+%% Type: not-wf
+%% Sections: 4.7
+'ibm-not-wf-P82-ibm82n06'(suite) -> [];
+'ibm-not-wf-P82-ibm82n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P82/ibm82n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P82/ibm82n07.xml
+%% ID: ibm-not-wf-P82-ibm82n07.xml
+%% Type: not-wf
+%% Sections: 4.7
+'ibm-not-wf-P82-ibm82n07'(suite) -> [];
+'ibm-not-wf-P82-ibm82n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P82/ibm82n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P82/ibm82n08.xml
+%% ID: ibm-not-wf-P82-ibm82n08.xml
+%% Type: not-wf
+%% Sections: 4.7
+'ibm-not-wf-P82-ibm82n08'(suite) -> [];
+'ibm-not-wf-P82-ibm82n08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P82/ibm82n08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 82
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P83/ibm83n01.xml
+%% ID: ibm-not-wf-P83-ibm83n01.xml
+%% Type: not-wf
+%% Sections: 4.7
+'ibm-not-wf-P83-ibm83n01'(suite) -> [];
+'ibm-not-wf-P83-ibm83n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P83/ibm83n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P83/ibm83n02.xml
+%% ID: ibm-not-wf-P83-ibm83n02.xml
+%% Type: not-wf
+%% Sections: 4.7
+'ibm-not-wf-P83-ibm83n02'(suite) -> [];
+'ibm-not-wf-P83-ibm83n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P83/ibm83n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P83/ibm83n03.xml
+%% ID: ibm-not-wf-P83-ibm83n03.xml
+%% Type: not-wf
+%% Sections: 4.7
+'ibm-not-wf-P83-ibm83n03'(suite) -> [];
+'ibm-not-wf-P83-ibm83n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P83/ibm83n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P83/ibm83n04.xml
+%% ID: ibm-not-wf-P83-ibm83n04.xml
+%% Type: not-wf
+%% Sections: 4.7
+'ibm-not-wf-P83-ibm83n04'(suite) -> [];
+'ibm-not-wf-P83-ibm83n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P83/ibm83n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P83/ibm83n05.xml
+%% ID: ibm-not-wf-P83-ibm83n05.xml
+%% Type: not-wf
+%% Sections: 4.7
+'ibm-not-wf-P83-ibm83n05'(suite) -> [];
+'ibm-not-wf-P83-ibm83n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P83/ibm83n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P83/ibm83n06.xml
+%% ID: ibm-not-wf-P83-ibm83n06.xml
+%% Type: not-wf
+%% Sections: 4.7
+'ibm-not-wf-P83-ibm83n06'(suite) -> [];
+'ibm-not-wf-P83-ibm83n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P83/ibm83n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 83
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n01.xml
+%% ID: ibm-not-wf-P85-ibm85n01.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n01'(suite) -> [];
+'ibm-not-wf-P85-ibm85n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n02.xml
+%% ID: ibm-not-wf-P85-ibm85n02.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n02'(suite) -> [];
+'ibm-not-wf-P85-ibm85n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n03.xml
+%% ID: ibm-not-wf-P85-ibm85n03.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n03'(suite) -> [];
+'ibm-not-wf-P85-ibm85n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n04.xml
+%% ID: ibm-not-wf-P85-ibm85n04.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n04'(suite) -> [];
+'ibm-not-wf-P85-ibm85n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n05.xml
+%% ID: ibm-not-wf-P85-ibm85n05.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n05'(suite) -> [];
+'ibm-not-wf-P85-ibm85n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n06.xml
+%% ID: ibm-not-wf-P85-ibm85n06.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n06'(suite) -> [];
+'ibm-not-wf-P85-ibm85n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n07.xml
+%% ID: ibm-not-wf-P85-ibm85n07.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n07'(suite) -> [];
+'ibm-not-wf-P85-ibm85n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n08.xml
+%% ID: ibm-not-wf-P85-ibm85n08.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n08'(suite) -> [];
+'ibm-not-wf-P85-ibm85n08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n09.xml
+%% ID: ibm-not-wf-P85-ibm85n09.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n09'(suite) -> [];
+'ibm-not-wf-P85-ibm85n09'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n09.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n10.xml
+%% ID: ibm-not-wf-P85-ibm85n10.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n10'(suite) -> [];
+'ibm-not-wf-P85-ibm85n10'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n10.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n100.xml
+%% ID: ibm-not-wf-P85-ibm85n100.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n100'(suite) -> [];
+'ibm-not-wf-P85-ibm85n100'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n100.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n101.xml
+%% ID: ibm-not-wf-P85-ibm85n101.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n101'(suite) -> [];
+'ibm-not-wf-P85-ibm85n101'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n101.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n102.xml
+%% ID: ibm-not-wf-P85-ibm85n102.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n102'(suite) -> [];
+'ibm-not-wf-P85-ibm85n102'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n102.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n103.xml
+%% ID: ibm-not-wf-P85-ibm85n103.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n103'(suite) -> [];
+'ibm-not-wf-P85-ibm85n103'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n103.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n104.xml
+%% ID: ibm-not-wf-P85-ibm85n104.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n104'(suite) -> [];
+'ibm-not-wf-P85-ibm85n104'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n104.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n105.xml
+%% ID: ibm-not-wf-P85-ibm85n105.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n105'(suite) -> [];
+'ibm-not-wf-P85-ibm85n105'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n105.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n106.xml
+%% ID: ibm-not-wf-P85-ibm85n106.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n106'(suite) -> [];
+'ibm-not-wf-P85-ibm85n106'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n106.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n107.xml
+%% ID: ibm-not-wf-P85-ibm85n107.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n107'(suite) -> [];
+'ibm-not-wf-P85-ibm85n107'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n107.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n108.xml
+%% ID: ibm-not-wf-P85-ibm85n108.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n108'(suite) -> [];
+'ibm-not-wf-P85-ibm85n108'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n108.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n109.xml
+%% ID: ibm-not-wf-P85-ibm85n109.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n109'(suite) -> [];
+'ibm-not-wf-P85-ibm85n109'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n109.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n11.xml
+%% ID: ibm-not-wf-P85-ibm85n11.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n11'(suite) -> [];
+'ibm-not-wf-P85-ibm85n11'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n11.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n110.xml
+%% ID: ibm-not-wf-P85-ibm85n110.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n110'(suite) -> [];
+'ibm-not-wf-P85-ibm85n110'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n110.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n111.xml
+%% ID: ibm-not-wf-P85-ibm85n111.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n111'(suite) -> [];
+'ibm-not-wf-P85-ibm85n111'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n111.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n112.xml
+%% ID: ibm-not-wf-P85-ibm85n112.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n112'(suite) -> [];
+'ibm-not-wf-P85-ibm85n112'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n112.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n113.xml
+%% ID: ibm-not-wf-P85-ibm85n113.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n113'(suite) -> [];
+'ibm-not-wf-P85-ibm85n113'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n113.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n114.xml
+%% ID: ibm-not-wf-P85-ibm85n114.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n114'(suite) -> [];
+'ibm-not-wf-P85-ibm85n114'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n114.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n115.xml
+%% ID: ibm-not-wf-P85-ibm85n115.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n115'(suite) -> [];
+'ibm-not-wf-P85-ibm85n115'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n115.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n116.xml
+%% ID: ibm-not-wf-P85-ibm85n116.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n116'(suite) -> [];
+'ibm-not-wf-P85-ibm85n116'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n116.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n117.xml
+%% ID: ibm-not-wf-P85-ibm85n117.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n117'(suite) -> [];
+'ibm-not-wf-P85-ibm85n117'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n117.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n118.xml
+%% ID: ibm-not-wf-P85-ibm85n118.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n118'(suite) -> [];
+'ibm-not-wf-P85-ibm85n118'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n118.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n119.xml
+%% ID: ibm-not-wf-P85-ibm85n119.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n119'(suite) -> [];
+'ibm-not-wf-P85-ibm85n119'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n119.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n12.xml
+%% ID: ibm-not-wf-P85-ibm85n12.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n12'(suite) -> [];
+'ibm-not-wf-P85-ibm85n12'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n12.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n120.xml
+%% ID: ibm-not-wf-P85-ibm85n120.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n120'(suite) -> [];
+'ibm-not-wf-P85-ibm85n120'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n120.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n121.xml
+%% ID: ibm-not-wf-P85-ibm85n121.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n121'(suite) -> [];
+'ibm-not-wf-P85-ibm85n121'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n121.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n122.xml
+%% ID: ibm-not-wf-P85-ibm85n122.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n122'(suite) -> [];
+'ibm-not-wf-P85-ibm85n122'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n122.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n123.xml
+%% ID: ibm-not-wf-P85-ibm85n123.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n123'(suite) -> [];
+'ibm-not-wf-P85-ibm85n123'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n123.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n124.xml
+%% ID: ibm-not-wf-P85-ibm85n124.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n124'(suite) -> [];
+'ibm-not-wf-P85-ibm85n124'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n124.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n125.xml
+%% ID: ibm-not-wf-P85-ibm85n125.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n125'(suite) -> [];
+'ibm-not-wf-P85-ibm85n125'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n125.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n126.xml
+%% ID: ibm-not-wf-P85-ibm85n126.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n126'(suite) -> [];
+'ibm-not-wf-P85-ibm85n126'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n126.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n127.xml
+%% ID: ibm-not-wf-P85-ibm85n127.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n127'(suite) -> [];
+'ibm-not-wf-P85-ibm85n127'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n127.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n128.xml
+%% ID: ibm-not-wf-P85-ibm85n128.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n128'(suite) -> [];
+'ibm-not-wf-P85-ibm85n128'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n128.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n129.xml
+%% ID: ibm-not-wf-P85-ibm85n129.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n129'(suite) -> [];
+'ibm-not-wf-P85-ibm85n129'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n129.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n13.xml
+%% ID: ibm-not-wf-P85-ibm85n13.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n13'(suite) -> [];
+'ibm-not-wf-P85-ibm85n13'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n13.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n130.xml
+%% ID: ibm-not-wf-P85-ibm85n130.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n130'(suite) -> [];
+'ibm-not-wf-P85-ibm85n130'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n130.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n131.xml
+%% ID: ibm-not-wf-P85-ibm85n131.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n131'(suite) -> [];
+'ibm-not-wf-P85-ibm85n131'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n131.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n132.xml
+%% ID: ibm-not-wf-P85-ibm85n132.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n132'(suite) -> [];
+'ibm-not-wf-P85-ibm85n132'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n132.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n133.xml
+%% ID: ibm-not-wf-P85-ibm85n133.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n133'(suite) -> [];
+'ibm-not-wf-P85-ibm85n133'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n133.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n134.xml
+%% ID: ibm-not-wf-P85-ibm85n134.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n134'(suite) -> [];
+'ibm-not-wf-P85-ibm85n134'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n134.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n135.xml
+%% ID: ibm-not-wf-P85-ibm85n135.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n135'(suite) -> [];
+'ibm-not-wf-P85-ibm85n135'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n135.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n136.xml
+%% ID: ibm-not-wf-P85-ibm85n136.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n136'(suite) -> [];
+'ibm-not-wf-P85-ibm85n136'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n136.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n137.xml
+%% ID: ibm-not-wf-P85-ibm85n137.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n137'(suite) -> [];
+'ibm-not-wf-P85-ibm85n137'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n137.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n138.xml
+%% ID: ibm-not-wf-P85-ibm85n138.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n138'(suite) -> [];
+'ibm-not-wf-P85-ibm85n138'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n138.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n139.xml
+%% ID: ibm-not-wf-P85-ibm85n139.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n139'(suite) -> [];
+'ibm-not-wf-P85-ibm85n139'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n139.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n14.xml
+%% ID: ibm-not-wf-P85-ibm85n14.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n14'(suite) -> [];
+'ibm-not-wf-P85-ibm85n14'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n14.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n140.xml
+%% ID: ibm-not-wf-P85-ibm85n140.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n140'(suite) -> [];
+'ibm-not-wf-P85-ibm85n140'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n140.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n141.xml
+%% ID: ibm-not-wf-P85-ibm85n141.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n141'(suite) -> [];
+'ibm-not-wf-P85-ibm85n141'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n141.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n142.xml
+%% ID: ibm-not-wf-P85-ibm85n142.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n142'(suite) -> [];
+'ibm-not-wf-P85-ibm85n142'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n142.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n143.xml
+%% ID: ibm-not-wf-P85-ibm85n143.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n143'(suite) -> [];
+'ibm-not-wf-P85-ibm85n143'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n143.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n144.xml
+%% ID: ibm-not-wf-P85-ibm85n144.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n144'(suite) -> [];
+'ibm-not-wf-P85-ibm85n144'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n144.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n145.xml
+%% ID: ibm-not-wf-P85-ibm85n145.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n145'(suite) -> [];
+'ibm-not-wf-P85-ibm85n145'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n145.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n146.xml
+%% ID: ibm-not-wf-P85-ibm85n146.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n146'(suite) -> [];
+'ibm-not-wf-P85-ibm85n146'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n146.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n147.xml
+%% ID: ibm-not-wf-P85-ibm85n147.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n147'(suite) -> [];
+'ibm-not-wf-P85-ibm85n147'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n147.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n148.xml
+%% ID: ibm-not-wf-P85-ibm85n148.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n148'(suite) -> [];
+'ibm-not-wf-P85-ibm85n148'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n148.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n149.xml
+%% ID: ibm-not-wf-P85-ibm85n149.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n149'(suite) -> [];
+'ibm-not-wf-P85-ibm85n149'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n149.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n15.xml
+%% ID: ibm-not-wf-P85-ibm85n15.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n15'(suite) -> [];
+'ibm-not-wf-P85-ibm85n15'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n15.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n150.xml
+%% ID: ibm-not-wf-P85-ibm85n150.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n150'(suite) -> [];
+'ibm-not-wf-P85-ibm85n150'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n150.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n151.xml
+%% ID: ibm-not-wf-P85-ibm85n151.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n151'(suite) -> [];
+'ibm-not-wf-P85-ibm85n151'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n151.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n152.xml
+%% ID: ibm-not-wf-P85-ibm85n152.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n152'(suite) -> [];
+'ibm-not-wf-P85-ibm85n152'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n152.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n153.xml
+%% ID: ibm-not-wf-P85-ibm85n153.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n153'(suite) -> [];
+'ibm-not-wf-P85-ibm85n153'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n153.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n154.xml
+%% ID: ibm-not-wf-P85-ibm85n154.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n154'(suite) -> [];
+'ibm-not-wf-P85-ibm85n154'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n154.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n155.xml
+%% ID: ibm-not-wf-P85-ibm85n155.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n155'(suite) -> [];
+'ibm-not-wf-P85-ibm85n155'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n155.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n156.xml
+%% ID: ibm-not-wf-P85-ibm85n156.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n156'(suite) -> [];
+'ibm-not-wf-P85-ibm85n156'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n156.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n157.xml
+%% ID: ibm-not-wf-P85-ibm85n157.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n157'(suite) -> [];
+'ibm-not-wf-P85-ibm85n157'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n157.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n158.xml
+%% ID: ibm-not-wf-P85-ibm85n158.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n158'(suite) -> [];
+'ibm-not-wf-P85-ibm85n158'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n158.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n159.xml
+%% ID: ibm-not-wf-P85-ibm85n159.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n159'(suite) -> [];
+'ibm-not-wf-P85-ibm85n159'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n159.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n16.xml
+%% ID: ibm-not-wf-P85-ibm85n16.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n16'(suite) -> [];
+'ibm-not-wf-P85-ibm85n16'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n16.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n160.xml
+%% ID: ibm-not-wf-P85-ibm85n160.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n160'(suite) -> [];
+'ibm-not-wf-P85-ibm85n160'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n160.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n161.xml
+%% ID: ibm-not-wf-P85-ibm85n161.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n161'(suite) -> [];
+'ibm-not-wf-P85-ibm85n161'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n161.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n162.xml
+%% ID: ibm-not-wf-P85-ibm85n162.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n162'(suite) -> [];
+'ibm-not-wf-P85-ibm85n162'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n162.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n163.xml
+%% ID: ibm-not-wf-P85-ibm85n163.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n163'(suite) -> [];
+'ibm-not-wf-P85-ibm85n163'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n163.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n164.xml
+%% ID: ibm-not-wf-P85-ibm85n164.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n164'(suite) -> [];
+'ibm-not-wf-P85-ibm85n164'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n164.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n165.xml
+%% ID: ibm-not-wf-P85-ibm85n165.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n165'(suite) -> [];
+'ibm-not-wf-P85-ibm85n165'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n165.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n166.xml
+%% ID: ibm-not-wf-P85-ibm85n166.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n166'(suite) -> [];
+'ibm-not-wf-P85-ibm85n166'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n166.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n167.xml
+%% ID: ibm-not-wf-P85-ibm85n167.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n167'(suite) -> [];
+'ibm-not-wf-P85-ibm85n167'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n167.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n168.xml
+%% ID: ibm-not-wf-P85-ibm85n168.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n168'(suite) -> [];
+'ibm-not-wf-P85-ibm85n168'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n168.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n169.xml
+%% ID: ibm-not-wf-P85-ibm85n169.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n169'(suite) -> [];
+'ibm-not-wf-P85-ibm85n169'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n169.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n17.xml
+%% ID: ibm-not-wf-P85-ibm85n17.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n17'(suite) -> [];
+'ibm-not-wf-P85-ibm85n17'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n17.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n170.xml
+%% ID: ibm-not-wf-P85-ibm85n170.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n170'(suite) -> [];
+'ibm-not-wf-P85-ibm85n170'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n170.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n171.xml
+%% ID: ibm-not-wf-P85-ibm85n171.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n171'(suite) -> [];
+'ibm-not-wf-P85-ibm85n171'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n171.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n172.xml
+%% ID: ibm-not-wf-P85-ibm85n172.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n172'(suite) -> [];
+'ibm-not-wf-P85-ibm85n172'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n172.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n173.xml
+%% ID: ibm-not-wf-P85-ibm85n173.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n173'(suite) -> [];
+'ibm-not-wf-P85-ibm85n173'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n173.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n174.xml
+%% ID: ibm-not-wf-P85-ibm85n174.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n174'(suite) -> [];
+'ibm-not-wf-P85-ibm85n174'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n174.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n175.xml
+%% ID: ibm-not-wf-P85-ibm85n175.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n175'(suite) -> [];
+'ibm-not-wf-P85-ibm85n175'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n175.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n176.xml
+%% ID: ibm-not-wf-P85-ibm85n176.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n176'(suite) -> [];
+'ibm-not-wf-P85-ibm85n176'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n176.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n177.xml
+%% ID: ibm-not-wf-P85-ibm85n177.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n177'(suite) -> [];
+'ibm-not-wf-P85-ibm85n177'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n177.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n178.xml
+%% ID: ibm-not-wf-P85-ibm85n178.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n178'(suite) -> [];
+'ibm-not-wf-P85-ibm85n178'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n178.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n179.xml
+%% ID: ibm-not-wf-P85-ibm85n179.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n179'(suite) -> [];
+'ibm-not-wf-P85-ibm85n179'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n179.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n18.xml
+%% ID: ibm-not-wf-P85-ibm85n18.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n18'(suite) -> [];
+'ibm-not-wf-P85-ibm85n18'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n18.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n180.xml
+%% ID: ibm-not-wf-P85-ibm85n180.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n180'(suite) -> [];
+'ibm-not-wf-P85-ibm85n180'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n180.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n181.xml
+%% ID: ibm-not-wf-P85-ibm85n181.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n181'(suite) -> [];
+'ibm-not-wf-P85-ibm85n181'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n181.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n182.xml
+%% ID: ibm-not-wf-P85-ibm85n182.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n182'(suite) -> [];
+'ibm-not-wf-P85-ibm85n182'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n182.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n183.xml
+%% ID: ibm-not-wf-P85-ibm85n183.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n183'(suite) -> [];
+'ibm-not-wf-P85-ibm85n183'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n183.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n184.xml
+%% ID: ibm-not-wf-P85-ibm85n184.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n184'(suite) -> [];
+'ibm-not-wf-P85-ibm85n184'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n184.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n185.xml
+%% ID: ibm-not-wf-P85-ibm85n185.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n185'(suite) -> [];
+'ibm-not-wf-P85-ibm85n185'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n185.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n186.xml
+%% ID: ibm-not-wf-P85-ibm85n186.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n186'(suite) -> [];
+'ibm-not-wf-P85-ibm85n186'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n186.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n187.xml
+%% ID: ibm-not-wf-P85-ibm85n187.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n187'(suite) -> [];
+'ibm-not-wf-P85-ibm85n187'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n187.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n188.xml
+%% ID: ibm-not-wf-P85-ibm85n188.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n188'(suite) -> [];
+'ibm-not-wf-P85-ibm85n188'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n188.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n189.xml
+%% ID: ibm-not-wf-P85-ibm85n189.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n189'(suite) -> [];
+'ibm-not-wf-P85-ibm85n189'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n189.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n19.xml
+%% ID: ibm-not-wf-P85-ibm85n19.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n19'(suite) -> [];
+'ibm-not-wf-P85-ibm85n19'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n19.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n190.xml
+%% ID: ibm-not-wf-P85-ibm85n190.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n190'(suite) -> [];
+'ibm-not-wf-P85-ibm85n190'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n190.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n191.xml
+%% ID: ibm-not-wf-P85-ibm85n191.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n191'(suite) -> [];
+'ibm-not-wf-P85-ibm85n191'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n191.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n192.xml
+%% ID: ibm-not-wf-P85-ibm85n192.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n192'(suite) -> [];
+'ibm-not-wf-P85-ibm85n192'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n192.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n193.xml
+%% ID: ibm-not-wf-P85-ibm85n193.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n193'(suite) -> [];
+'ibm-not-wf-P85-ibm85n193'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n193.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n194.xml
+%% ID: ibm-not-wf-P85-ibm85n194.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n194'(suite) -> [];
+'ibm-not-wf-P85-ibm85n194'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n194.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n195.xml
+%% ID: ibm-not-wf-P85-ibm85n195.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n195'(suite) -> [];
+'ibm-not-wf-P85-ibm85n195'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n195.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n196.xml
+%% ID: ibm-not-wf-P85-ibm85n196.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n196'(suite) -> [];
+'ibm-not-wf-P85-ibm85n196'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n196.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n197.xml
+%% ID: ibm-not-wf-P85-ibm85n197.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n197'(suite) -> [];
+'ibm-not-wf-P85-ibm85n197'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n197.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n198.xml
+%% ID: ibm-not-wf-P85-ibm85n198.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n198'(suite) -> [];
+'ibm-not-wf-P85-ibm85n198'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n198.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n20.xml
+%% ID: ibm-not-wf-P85-ibm85n20.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n20'(suite) -> [];
+'ibm-not-wf-P85-ibm85n20'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n20.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n21.xml
+%% ID: ibm-not-wf-P85-ibm85n21.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n21'(suite) -> [];
+'ibm-not-wf-P85-ibm85n21'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n21.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n22.xml
+%% ID: ibm-not-wf-P85-ibm85n22.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n22'(suite) -> [];
+'ibm-not-wf-P85-ibm85n22'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n22.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n23.xml
+%% ID: ibm-not-wf-P85-ibm85n23.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n23'(suite) -> [];
+'ibm-not-wf-P85-ibm85n23'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n23.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n24.xml
+%% ID: ibm-not-wf-P85-ibm85n24.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n24'(suite) -> [];
+'ibm-not-wf-P85-ibm85n24'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n24.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n25.xml
+%% ID: ibm-not-wf-P85-ibm85n25.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n25'(suite) -> [];
+'ibm-not-wf-P85-ibm85n25'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n25.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n26.xml
+%% ID: ibm-not-wf-P85-ibm85n26.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n26'(suite) -> [];
+'ibm-not-wf-P85-ibm85n26'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n26.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n27.xml
+%% ID: ibm-not-wf-P85-ibm85n27.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n27'(suite) -> [];
+'ibm-not-wf-P85-ibm85n27'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n27.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n28.xml
+%% ID: ibm-not-wf-P85-ibm85n28.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n28'(suite) -> [];
+'ibm-not-wf-P85-ibm85n28'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n28.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n29.xml
+%% ID: ibm-not-wf-P85-ibm85n29.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n29'(suite) -> [];
+'ibm-not-wf-P85-ibm85n29'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n29.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n30.xml
+%% ID: ibm-not-wf-P85-ibm85n30.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n30'(suite) -> [];
+'ibm-not-wf-P85-ibm85n30'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n30.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n31.xml
+%% ID: ibm-not-wf-P85-ibm85n31.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n31'(suite) -> [];
+'ibm-not-wf-P85-ibm85n31'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n31.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n32.xml
+%% ID: ibm-not-wf-P85-ibm85n32.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n32'(suite) -> [];
+'ibm-not-wf-P85-ibm85n32'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n32.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n33.xml
+%% ID: ibm-not-wf-P85-ibm85n33.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n33'(suite) -> [];
+'ibm-not-wf-P85-ibm85n33'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n33.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n34.xml
+%% ID: ibm-not-wf-P85-ibm85n34.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n34'(suite) -> [];
+'ibm-not-wf-P85-ibm85n34'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n34.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n35.xml
+%% ID: ibm-not-wf-P85-ibm85n35.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n35'(suite) -> [];
+'ibm-not-wf-P85-ibm85n35'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n35.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n36.xml
+%% ID: ibm-not-wf-P85-ibm85n36.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n36'(suite) -> [];
+'ibm-not-wf-P85-ibm85n36'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n36.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n37.xml
+%% ID: ibm-not-wf-P85-ibm85n37.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n37'(suite) -> [];
+'ibm-not-wf-P85-ibm85n37'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n37.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n38.xml
+%% ID: ibm-not-wf-P85-ibm85n38.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n38'(suite) -> [];
+'ibm-not-wf-P85-ibm85n38'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n38.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n39.xml
+%% ID: ibm-not-wf-P85-ibm85n39.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n39'(suite) -> [];
+'ibm-not-wf-P85-ibm85n39'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n39.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n40.xml
+%% ID: ibm-not-wf-P85-ibm85n40.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n40'(suite) -> [];
+'ibm-not-wf-P85-ibm85n40'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n40.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n41.xml
+%% ID: ibm-not-wf-P85-ibm85n41.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n41'(suite) -> [];
+'ibm-not-wf-P85-ibm85n41'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n41.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n42.xml
+%% ID: ibm-not-wf-P85-ibm85n42.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n42'(suite) -> [];
+'ibm-not-wf-P85-ibm85n42'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n42.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n43.xml
+%% ID: ibm-not-wf-P85-ibm85n43.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n43'(suite) -> [];
+'ibm-not-wf-P85-ibm85n43'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n43.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n44.xml
+%% ID: ibm-not-wf-P85-ibm85n44.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n44'(suite) -> [];
+'ibm-not-wf-P85-ibm85n44'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n44.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n45.xml
+%% ID: ibm-not-wf-P85-ibm85n45.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n45'(suite) -> [];
+'ibm-not-wf-P85-ibm85n45'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n45.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n46.xml
+%% ID: ibm-not-wf-P85-ibm85n46.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n46'(suite) -> [];
+'ibm-not-wf-P85-ibm85n46'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n46.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n47.xml
+%% ID: ibm-not-wf-P85-ibm85n47.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n47'(suite) -> [];
+'ibm-not-wf-P85-ibm85n47'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n47.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n48.xml
+%% ID: ibm-not-wf-P85-ibm85n48.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n48'(suite) -> [];
+'ibm-not-wf-P85-ibm85n48'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n48.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n49.xml
+%% ID: ibm-not-wf-P85-ibm85n49.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n49'(suite) -> [];
+'ibm-not-wf-P85-ibm85n49'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n49.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n50.xml
+%% ID: ibm-not-wf-P85-ibm85n50.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n50'(suite) -> [];
+'ibm-not-wf-P85-ibm85n50'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n50.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n51.xml
+%% ID: ibm-not-wf-P85-ibm85n51.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n51'(suite) -> [];
+'ibm-not-wf-P85-ibm85n51'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n51.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n52.xml
+%% ID: ibm-not-wf-P85-ibm85n52.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n52'(suite) -> [];
+'ibm-not-wf-P85-ibm85n52'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n52.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n53.xml
+%% ID: ibm-not-wf-P85-ibm85n53.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n53'(suite) -> [];
+'ibm-not-wf-P85-ibm85n53'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n53.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n54.xml
+%% ID: ibm-not-wf-P85-ibm85n54.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n54'(suite) -> [];
+'ibm-not-wf-P85-ibm85n54'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n54.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n55.xml
+%% ID: ibm-not-wf-P85-ibm85n55.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n55'(suite) -> [];
+'ibm-not-wf-P85-ibm85n55'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n55.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n56.xml
+%% ID: ibm-not-wf-P85-ibm85n56.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n56'(suite) -> [];
+'ibm-not-wf-P85-ibm85n56'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n56.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n57.xml
+%% ID: ibm-not-wf-P85-ibm85n57.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n57'(suite) -> [];
+'ibm-not-wf-P85-ibm85n57'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n57.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n58.xml
+%% ID: ibm-not-wf-P85-ibm85n58.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n58'(suite) -> [];
+'ibm-not-wf-P85-ibm85n58'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n58.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n59.xml
+%% ID: ibm-not-wf-P85-ibm85n59.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n59'(suite) -> [];
+'ibm-not-wf-P85-ibm85n59'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n59.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n60.xml
+%% ID: ibm-not-wf-P85-ibm85n60.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n60'(suite) -> [];
+'ibm-not-wf-P85-ibm85n60'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n60.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n61.xml
+%% ID: ibm-not-wf-P85-ibm85n61.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n61'(suite) -> [];
+'ibm-not-wf-P85-ibm85n61'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n61.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n62.xml
+%% ID: ibm-not-wf-P85-ibm85n62.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n62'(suite) -> [];
+'ibm-not-wf-P85-ibm85n62'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n62.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n63.xml
+%% ID: ibm-not-wf-P85-ibm85n63.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n63'(suite) -> [];
+'ibm-not-wf-P85-ibm85n63'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n63.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n64.xml
+%% ID: ibm-not-wf-P85-ibm85n64.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n64'(suite) -> [];
+'ibm-not-wf-P85-ibm85n64'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n64.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n65.xml
+%% ID: ibm-not-wf-P85-ibm85n65.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n65'(suite) -> [];
+'ibm-not-wf-P85-ibm85n65'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n65.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n66.xml
+%% ID: ibm-not-wf-P85-ibm85n66.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n66'(suite) -> [];
+'ibm-not-wf-P85-ibm85n66'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n66.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n67.xml
+%% ID: ibm-not-wf-P85-ibm85n67.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n67'(suite) -> [];
+'ibm-not-wf-P85-ibm85n67'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n67.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n68.xml
+%% ID: ibm-not-wf-P85-ibm85n68.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n68'(suite) -> [];
+'ibm-not-wf-P85-ibm85n68'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n68.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n69.xml
+%% ID: ibm-not-wf-P85-ibm85n69.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n69'(suite) -> [];
+'ibm-not-wf-P85-ibm85n69'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n69.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n70.xml
+%% ID: ibm-not-wf-P85-ibm85n70.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n70'(suite) -> [];
+'ibm-not-wf-P85-ibm85n70'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n70.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n71.xml
+%% ID: ibm-not-wf-P85-ibm85n71.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n71'(suite) -> [];
+'ibm-not-wf-P85-ibm85n71'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n71.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n72.xml
+%% ID: ibm-not-wf-P85-ibm85n72.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n72'(suite) -> [];
+'ibm-not-wf-P85-ibm85n72'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n72.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n73.xml
+%% ID: ibm-not-wf-P85-ibm85n73.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n73'(suite) -> [];
+'ibm-not-wf-P85-ibm85n73'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n73.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n74.xml
+%% ID: ibm-not-wf-P85-ibm85n74.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n74'(suite) -> [];
+'ibm-not-wf-P85-ibm85n74'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n74.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n75.xml
+%% ID: ibm-not-wf-P85-ibm85n75.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n75'(suite) -> [];
+'ibm-not-wf-P85-ibm85n75'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n75.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n76.xml
+%% ID: ibm-not-wf-P85-ibm85n76.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n76'(suite) -> [];
+'ibm-not-wf-P85-ibm85n76'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n76.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n77.xml
+%% ID: ibm-not-wf-P85-ibm85n77.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n77'(suite) -> [];
+'ibm-not-wf-P85-ibm85n77'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n77.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n78.xml
+%% ID: ibm-not-wf-P85-ibm85n78.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n78'(suite) -> [];
+'ibm-not-wf-P85-ibm85n78'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n78.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n79.xml
+%% ID: ibm-not-wf-P85-ibm85n79.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n79'(suite) -> [];
+'ibm-not-wf-P85-ibm85n79'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n79.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n80.xml
+%% ID: ibm-not-wf-P85-ibm85n80.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n80'(suite) -> [];
+'ibm-not-wf-P85-ibm85n80'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n80.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n81.xml
+%% ID: ibm-not-wf-P85-ibm85n81.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n81'(suite) -> [];
+'ibm-not-wf-P85-ibm85n81'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n81.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n82.xml
+%% ID: ibm-not-wf-P85-ibm85n82.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n82'(suite) -> [];
+'ibm-not-wf-P85-ibm85n82'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n82.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n83.xml
+%% ID: ibm-not-wf-P85-ibm85n83.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n83'(suite) -> [];
+'ibm-not-wf-P85-ibm85n83'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n83.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n84.xml
+%% ID: ibm-not-wf-P85-ibm85n84.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n84'(suite) -> [];
+'ibm-not-wf-P85-ibm85n84'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n84.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n85.xml
+%% ID: ibm-not-wf-P85-ibm85n85.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n85'(suite) -> [];
+'ibm-not-wf-P85-ibm85n85'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n85.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n86.xml
+%% ID: ibm-not-wf-P85-ibm85n86.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n86'(suite) -> [];
+'ibm-not-wf-P85-ibm85n86'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n86.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n87.xml
+%% ID: ibm-not-wf-P85-ibm85n87.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n87'(suite) -> [];
+'ibm-not-wf-P85-ibm85n87'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n87.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n88.xml
+%% ID: ibm-not-wf-P85-ibm85n88.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n88'(suite) -> [];
+'ibm-not-wf-P85-ibm85n88'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n88.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n89.xml
+%% ID: ibm-not-wf-P85-ibm85n89.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n89'(suite) -> [];
+'ibm-not-wf-P85-ibm85n89'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n89.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n90.xml
+%% ID: ibm-not-wf-P85-ibm85n90.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n90'(suite) -> [];
+'ibm-not-wf-P85-ibm85n90'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n90.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n91.xml
+%% ID: ibm-not-wf-P85-ibm85n91.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n91'(suite) -> [];
+'ibm-not-wf-P85-ibm85n91'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n91.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n92.xml
+%% ID: ibm-not-wf-P85-ibm85n92.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n92'(suite) -> [];
+'ibm-not-wf-P85-ibm85n92'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n92.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n93.xml
+%% ID: ibm-not-wf-P85-ibm85n93.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n93'(suite) -> [];
+'ibm-not-wf-P85-ibm85n93'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n93.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n94.xml
+%% ID: ibm-not-wf-P85-ibm85n94.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n94'(suite) -> [];
+'ibm-not-wf-P85-ibm85n94'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n94.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n95.xml
+%% ID: ibm-not-wf-P85-ibm85n95.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n95'(suite) -> [];
+'ibm-not-wf-P85-ibm85n95'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n95.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n96.xml
+%% ID: ibm-not-wf-P85-ibm85n96.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n96'(suite) -> [];
+'ibm-not-wf-P85-ibm85n96'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n96.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n97.xml
+%% ID: ibm-not-wf-P85-ibm85n97.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n97'(suite) -> [];
+'ibm-not-wf-P85-ibm85n97'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n97.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n98.xml
+%% ID: ibm-not-wf-P85-ibm85n98.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n98'(suite) -> [];
+'ibm-not-wf-P85-ibm85n98'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n98.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P85/ibm85n99.xml
+%% ID: ibm-not-wf-P85-ibm85n99.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P85-ibm85n99'(suite) -> [];
+'ibm-not-wf-P85-ibm85n99'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P85/ibm85n99.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 85
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P86/ibm86n01.xml
+%% ID: ibm-not-wf-P86-ibm86n01.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P86-ibm86n01'(suite) -> [];
+'ibm-not-wf-P86-ibm86n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P86/ibm86n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P86/ibm86n02.xml
+%% ID: ibm-not-wf-P86-ibm86n02.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P86-ibm86n02'(suite) -> [];
+'ibm-not-wf-P86-ibm86n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P86/ibm86n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P86/ibm86n03.xml
+%% ID: ibm-not-wf-P86-ibm86n03.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P86-ibm86n03'(suite) -> [];
+'ibm-not-wf-P86-ibm86n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P86/ibm86n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P86/ibm86n04.xml
+%% ID: ibm-not-wf-P86-ibm86n04.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P86-ibm86n04'(suite) -> [];
+'ibm-not-wf-P86-ibm86n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P86/ibm86n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 86
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n01.xml
+%% ID: ibm-not-wf-P87-ibm87n01.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n01'(suite) -> [];
+'ibm-not-wf-P87-ibm87n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n02.xml
+%% ID: ibm-not-wf-P87-ibm87n02.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n02'(suite) -> [];
+'ibm-not-wf-P87-ibm87n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n03.xml
+%% ID: ibm-not-wf-P87-ibm87n03.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n03'(suite) -> [];
+'ibm-not-wf-P87-ibm87n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n04.xml
+%% ID: ibm-not-wf-P87-ibm87n04.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n04'(suite) -> [];
+'ibm-not-wf-P87-ibm87n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n05.xml
+%% ID: ibm-not-wf-P87-ibm87n05.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n05'(suite) -> [];
+'ibm-not-wf-P87-ibm87n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n06.xml
+%% ID: ibm-not-wf-P87-ibm87n06.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n06'(suite) -> [];
+'ibm-not-wf-P87-ibm87n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n07.xml
+%% ID: ibm-not-wf-P87-ibm87n07.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n07'(suite) -> [];
+'ibm-not-wf-P87-ibm87n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n08.xml
+%% ID: ibm-not-wf-P87-ibm87n08.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n08'(suite) -> [];
+'ibm-not-wf-P87-ibm87n08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n09.xml
+%% ID: ibm-not-wf-P87-ibm87n09.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n09'(suite) -> [];
+'ibm-not-wf-P87-ibm87n09'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n09.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n10.xml
+%% ID: ibm-not-wf-P87-ibm87n10.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n10'(suite) -> [];
+'ibm-not-wf-P87-ibm87n10'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n10.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n11.xml
+%% ID: ibm-not-wf-P87-ibm87n11.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n11'(suite) -> [];
+'ibm-not-wf-P87-ibm87n11'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n11.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n12.xml
+%% ID: ibm-not-wf-P87-ibm87n12.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n12'(suite) -> [];
+'ibm-not-wf-P87-ibm87n12'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n12.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n13.xml
+%% ID: ibm-not-wf-P87-ibm87n13.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n13'(suite) -> [];
+'ibm-not-wf-P87-ibm87n13'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n13.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n14.xml
+%% ID: ibm-not-wf-P87-ibm87n14.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n14'(suite) -> [];
+'ibm-not-wf-P87-ibm87n14'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n14.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n15.xml
+%% ID: ibm-not-wf-P87-ibm87n15.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n15'(suite) -> [];
+'ibm-not-wf-P87-ibm87n15'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n15.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n16.xml
+%% ID: ibm-not-wf-P87-ibm87n16.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n16'(suite) -> [];
+'ibm-not-wf-P87-ibm87n16'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n16.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n17.xml
+%% ID: ibm-not-wf-P87-ibm87n17.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n17'(suite) -> [];
+'ibm-not-wf-P87-ibm87n17'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n17.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n18.xml
+%% ID: ibm-not-wf-P87-ibm87n18.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n18'(suite) -> [];
+'ibm-not-wf-P87-ibm87n18'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n18.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n19.xml
+%% ID: ibm-not-wf-P87-ibm87n19.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n19'(suite) -> [];
+'ibm-not-wf-P87-ibm87n19'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n19.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n20.xml
+%% ID: ibm-not-wf-P87-ibm87n20.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n20'(suite) -> [];
+'ibm-not-wf-P87-ibm87n20'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n20.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n21.xml
+%% ID: ibm-not-wf-P87-ibm87n21.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n21'(suite) -> [];
+'ibm-not-wf-P87-ibm87n21'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n21.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n22.xml
+%% ID: ibm-not-wf-P87-ibm87n22.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n22'(suite) -> [];
+'ibm-not-wf-P87-ibm87n22'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n22.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n23.xml
+%% ID: ibm-not-wf-P87-ibm87n23.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n23'(suite) -> [];
+'ibm-not-wf-P87-ibm87n23'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n23.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n24.xml
+%% ID: ibm-not-wf-P87-ibm87n24.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n24'(suite) -> [];
+'ibm-not-wf-P87-ibm87n24'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n24.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n25.xml
+%% ID: ibm-not-wf-P87-ibm87n25.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n25'(suite) -> [];
+'ibm-not-wf-P87-ibm87n25'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n25.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n26.xml
+%% ID: ibm-not-wf-P87-ibm87n26.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n26'(suite) -> [];
+'ibm-not-wf-P87-ibm87n26'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n26.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n27.xml
+%% ID: ibm-not-wf-P87-ibm87n27.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n27'(suite) -> [];
+'ibm-not-wf-P87-ibm87n27'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n27.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n28.xml
+%% ID: ibm-not-wf-P87-ibm87n28.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n28'(suite) -> [];
+'ibm-not-wf-P87-ibm87n28'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n28.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n29.xml
+%% ID: ibm-not-wf-P87-ibm87n29.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n29'(suite) -> [];
+'ibm-not-wf-P87-ibm87n29'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n29.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n30.xml
+%% ID: ibm-not-wf-P87-ibm87n30.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n30'(suite) -> [];
+'ibm-not-wf-P87-ibm87n30'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n30.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n31.xml
+%% ID: ibm-not-wf-P87-ibm87n31.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n31'(suite) -> [];
+'ibm-not-wf-P87-ibm87n31'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n31.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n32.xml
+%% ID: ibm-not-wf-P87-ibm87n32.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n32'(suite) -> [];
+'ibm-not-wf-P87-ibm87n32'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n32.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n33.xml
+%% ID: ibm-not-wf-P87-ibm87n33.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n33'(suite) -> [];
+'ibm-not-wf-P87-ibm87n33'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n33.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n34.xml
+%% ID: ibm-not-wf-P87-ibm87n34.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n34'(suite) -> [];
+'ibm-not-wf-P87-ibm87n34'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n34.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n35.xml
+%% ID: ibm-not-wf-P87-ibm87n35.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n35'(suite) -> [];
+'ibm-not-wf-P87-ibm87n35'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n35.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n36.xml
+%% ID: ibm-not-wf-P87-ibm87n36.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n36'(suite) -> [];
+'ibm-not-wf-P87-ibm87n36'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n36.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n37.xml
+%% ID: ibm-not-wf-P87-ibm87n37.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n37'(suite) -> [];
+'ibm-not-wf-P87-ibm87n37'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n37.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n38.xml
+%% ID: ibm-not-wf-P87-ibm87n38.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n38'(suite) -> [];
+'ibm-not-wf-P87-ibm87n38'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n38.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n39.xml
+%% ID: ibm-not-wf-P87-ibm87n39.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n39'(suite) -> [];
+'ibm-not-wf-P87-ibm87n39'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n39.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n40.xml
+%% ID: ibm-not-wf-P87-ibm87n40.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n40'(suite) -> [];
+'ibm-not-wf-P87-ibm87n40'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n40.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n41.xml
+%% ID: ibm-not-wf-P87-ibm87n41.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n41'(suite) -> [];
+'ibm-not-wf-P87-ibm87n41'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n41.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n42.xml
+%% ID: ibm-not-wf-P87-ibm87n42.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n42'(suite) -> [];
+'ibm-not-wf-P87-ibm87n42'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n42.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n43.xml
+%% ID: ibm-not-wf-P87-ibm87n43.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n43'(suite) -> [];
+'ibm-not-wf-P87-ibm87n43'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n43.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n44.xml
+%% ID: ibm-not-wf-P87-ibm87n44.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n44'(suite) -> [];
+'ibm-not-wf-P87-ibm87n44'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n44.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n45.xml
+%% ID: ibm-not-wf-P87-ibm87n45.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n45'(suite) -> [];
+'ibm-not-wf-P87-ibm87n45'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n45.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n46.xml
+%% ID: ibm-not-wf-P87-ibm87n46.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n46'(suite) -> [];
+'ibm-not-wf-P87-ibm87n46'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n46.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n47.xml
+%% ID: ibm-not-wf-P87-ibm87n47.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n47'(suite) -> [];
+'ibm-not-wf-P87-ibm87n47'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n47.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n48.xml
+%% ID: ibm-not-wf-P87-ibm87n48.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n48'(suite) -> [];
+'ibm-not-wf-P87-ibm87n48'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n48.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n49.xml
+%% ID: ibm-not-wf-P87-ibm87n49.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n49'(suite) -> [];
+'ibm-not-wf-P87-ibm87n49'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n49.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n50.xml
+%% ID: ibm-not-wf-P87-ibm87n50.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n50'(suite) -> [];
+'ibm-not-wf-P87-ibm87n50'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n50.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n51.xml
+%% ID: ibm-not-wf-P87-ibm87n51.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n51'(suite) -> [];
+'ibm-not-wf-P87-ibm87n51'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n51.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n52.xml
+%% ID: ibm-not-wf-P87-ibm87n52.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n52'(suite) -> [];
+'ibm-not-wf-P87-ibm87n52'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n52.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n53.xml
+%% ID: ibm-not-wf-P87-ibm87n53.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n53'(suite) -> [];
+'ibm-not-wf-P87-ibm87n53'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n53.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n54.xml
+%% ID: ibm-not-wf-P87-ibm87n54.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n54'(suite) -> [];
+'ibm-not-wf-P87-ibm87n54'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n54.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n55.xml
+%% ID: ibm-not-wf-P87-ibm87n55.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n55'(suite) -> [];
+'ibm-not-wf-P87-ibm87n55'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n55.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n56.xml
+%% ID: ibm-not-wf-P87-ibm87n56.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n56'(suite) -> [];
+'ibm-not-wf-P87-ibm87n56'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n56.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n57.xml
+%% ID: ibm-not-wf-P87-ibm87n57.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n57'(suite) -> [];
+'ibm-not-wf-P87-ibm87n57'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n57.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n58.xml
+%% ID: ibm-not-wf-P87-ibm87n58.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n58'(suite) -> [];
+'ibm-not-wf-P87-ibm87n58'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n58.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n59.xml
+%% ID: ibm-not-wf-P87-ibm87n59.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n59'(suite) -> [];
+'ibm-not-wf-P87-ibm87n59'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n59.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n60.xml
+%% ID: ibm-not-wf-P87-ibm87n60.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n60'(suite) -> [];
+'ibm-not-wf-P87-ibm87n60'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n60.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n61.xml
+%% ID: ibm-not-wf-P87-ibm87n61.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n61'(suite) -> [];
+'ibm-not-wf-P87-ibm87n61'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n61.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n62.xml
+%% ID: ibm-not-wf-P87-ibm87n62.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n62'(suite) -> [];
+'ibm-not-wf-P87-ibm87n62'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n62.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n63.xml
+%% ID: ibm-not-wf-P87-ibm87n63.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n63'(suite) -> [];
+'ibm-not-wf-P87-ibm87n63'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n63.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n64.xml
+%% ID: ibm-not-wf-P87-ibm87n64.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n64'(suite) -> [];
+'ibm-not-wf-P87-ibm87n64'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n64.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n66.xml
+%% ID: ibm-not-wf-P87-ibm87n66.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n66'(suite) -> [];
+'ibm-not-wf-P87-ibm87n66'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n66.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n67.xml
+%% ID: ibm-not-wf-P87-ibm87n67.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n67'(suite) -> [];
+'ibm-not-wf-P87-ibm87n67'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n67.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n68.xml
+%% ID: ibm-not-wf-P87-ibm87n68.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n68'(suite) -> [];
+'ibm-not-wf-P87-ibm87n68'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n68.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n69.xml
+%% ID: ibm-not-wf-P87-ibm87n69.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n69'(suite) -> [];
+'ibm-not-wf-P87-ibm87n69'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n69.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n70.xml
+%% ID: ibm-not-wf-P87-ibm87n70.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n70'(suite) -> [];
+'ibm-not-wf-P87-ibm87n70'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n70.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n71.xml
+%% ID: ibm-not-wf-P87-ibm87n71.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n71'(suite) -> [];
+'ibm-not-wf-P87-ibm87n71'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n71.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n72.xml
+%% ID: ibm-not-wf-P87-ibm87n72.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n72'(suite) -> [];
+'ibm-not-wf-P87-ibm87n72'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n72.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n73.xml
+%% ID: ibm-not-wf-P87-ibm87n73.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n73'(suite) -> [];
+'ibm-not-wf-P87-ibm87n73'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n73.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n74.xml
+%% ID: ibm-not-wf-P87-ibm87n74.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n74'(suite) -> [];
+'ibm-not-wf-P87-ibm87n74'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n74.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n75.xml
+%% ID: ibm-not-wf-P87-ibm87n75.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n75'(suite) -> [];
+'ibm-not-wf-P87-ibm87n75'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n75.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n76.xml
+%% ID: ibm-not-wf-P87-ibm87n76.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n76'(suite) -> [];
+'ibm-not-wf-P87-ibm87n76'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n76.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n77.xml
+%% ID: ibm-not-wf-P87-ibm87n77.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n77'(suite) -> [];
+'ibm-not-wf-P87-ibm87n77'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n77.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n78.xml
+%% ID: ibm-not-wf-P87-ibm87n78.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n78'(suite) -> [];
+'ibm-not-wf-P87-ibm87n78'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n78.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n79.xml
+%% ID: ibm-not-wf-P87-ibm87n79.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n79'(suite) -> [];
+'ibm-not-wf-P87-ibm87n79'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n79.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n80.xml
+%% ID: ibm-not-wf-P87-ibm87n80.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n80'(suite) -> [];
+'ibm-not-wf-P87-ibm87n80'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n80.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n81.xml
+%% ID: ibm-not-wf-P87-ibm87n81.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n81'(suite) -> [];
+'ibm-not-wf-P87-ibm87n81'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n81.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n82.xml
+%% ID: ibm-not-wf-P87-ibm87n82.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n82'(suite) -> [];
+'ibm-not-wf-P87-ibm87n82'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n82.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n83.xml
+%% ID: ibm-not-wf-P87-ibm87n83.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n83'(suite) -> [];
+'ibm-not-wf-P87-ibm87n83'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n83.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n84.xml
+%% ID: ibm-not-wf-P87-ibm87n84.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n84'(suite) -> [];
+'ibm-not-wf-P87-ibm87n84'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n84.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P87/ibm87n85.xml
+%% ID: ibm-not-wf-P87-ibm87n85.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P87-ibm87n85'(suite) -> [];
+'ibm-not-wf-P87-ibm87n85'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P87/ibm87n85.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 87
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P88/ibm88n01.xml
+%% ID: ibm-not-wf-P88-ibm88n01.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P88-ibm88n01'(suite) -> [];
+'ibm-not-wf-P88-ibm88n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P88/ibm88n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P88/ibm88n02.xml
+%% ID: ibm-not-wf-P88-ibm88n02.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P88-ibm88n02'(suite) -> [];
+'ibm-not-wf-P88-ibm88n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P88/ibm88n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P88/ibm88n03.xml
+%% ID: ibm-not-wf-P88-ibm88n03.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P88-ibm88n03'(suite) -> [];
+'ibm-not-wf-P88-ibm88n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P88/ibm88n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P88/ibm88n04.xml
+%% ID: ibm-not-wf-P88-ibm88n04.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P88-ibm88n04'(suite) -> [];
+'ibm-not-wf-P88-ibm88n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P88/ibm88n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P88/ibm88n05.xml
+%% ID: ibm-not-wf-P88-ibm88n05.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P88-ibm88n05'(suite) -> [];
+'ibm-not-wf-P88-ibm88n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P88/ibm88n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P88/ibm88n06.xml
+%% ID: ibm-not-wf-P88-ibm88n06.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P88-ibm88n06'(suite) -> [];
+'ibm-not-wf-P88-ibm88n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P88/ibm88n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P88/ibm88n08.xml
+%% ID: ibm-not-wf-P88-ibm88n08.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P88-ibm88n08'(suite) -> [];
+'ibm-not-wf-P88-ibm88n08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P88/ibm88n08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P88/ibm88n09.xml
+%% ID: ibm-not-wf-P88-ibm88n09.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P88-ibm88n09'(suite) -> [];
+'ibm-not-wf-P88-ibm88n09'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P88/ibm88n09.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P88/ibm88n10.xml
+%% ID: ibm-not-wf-P88-ibm88n10.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P88-ibm88n10'(suite) -> [];
+'ibm-not-wf-P88-ibm88n10'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P88/ibm88n10.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P88/ibm88n11.xml
+%% ID: ibm-not-wf-P88-ibm88n11.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P88-ibm88n11'(suite) -> [];
+'ibm-not-wf-P88-ibm88n11'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P88/ibm88n11.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P88/ibm88n12.xml
+%% ID: ibm-not-wf-P88-ibm88n12.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P88-ibm88n12'(suite) -> [];
+'ibm-not-wf-P88-ibm88n12'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P88/ibm88n12.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P88/ibm88n13.xml
+%% ID: ibm-not-wf-P88-ibm88n13.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P88-ibm88n13'(suite) -> [];
+'ibm-not-wf-P88-ibm88n13'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P88/ibm88n13.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P88/ibm88n14.xml
+%% ID: ibm-not-wf-P88-ibm88n14.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P88-ibm88n14'(suite) -> [];
+'ibm-not-wf-P88-ibm88n14'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P88/ibm88n14.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P88/ibm88n15.xml
+%% ID: ibm-not-wf-P88-ibm88n15.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P88-ibm88n15'(suite) -> [];
+'ibm-not-wf-P88-ibm88n15'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P88/ibm88n15.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P88/ibm88n16.xml
+%% ID: ibm-not-wf-P88-ibm88n16.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P88-ibm88n16'(suite) -> [];
+'ibm-not-wf-P88-ibm88n16'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P88/ibm88n16.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 88
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P89/ibm89n01.xml
+%% ID: ibm-not-wf-P89-ibm89n01.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P89-ibm89n01'(suite) -> [];
+'ibm-not-wf-P89-ibm89n01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P89/ibm89n01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P89/ibm89n02.xml
+%% ID: ibm-not-wf-P89-ibm89n02.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P89-ibm89n02'(suite) -> [];
+'ibm-not-wf-P89-ibm89n02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P89/ibm89n02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P89/ibm89n03.xml
+%% ID: ibm-not-wf-P89-ibm89n03.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P89-ibm89n03'(suite) -> [];
+'ibm-not-wf-P89-ibm89n03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P89/ibm89n03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P89/ibm89n04.xml
+%% ID: ibm-not-wf-P89-ibm89n04.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P89-ibm89n04'(suite) -> [];
+'ibm-not-wf-P89-ibm89n04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P89/ibm89n04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P89/ibm89n05.xml
+%% ID: ibm-not-wf-P89-ibm89n05.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P89-ibm89n05'(suite) -> [];
+'ibm-not-wf-P89-ibm89n05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P89/ibm89n05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P89/ibm89n06.xml
+%% ID: ibm-not-wf-P89-ibm89n06.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P89-ibm89n06'(suite) -> [];
+'ibm-not-wf-P89-ibm89n06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P89/ibm89n06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P89/ibm89n07.xml
+%% ID: ibm-not-wf-P89-ibm89n07.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P89-ibm89n07'(suite) -> [];
+'ibm-not-wf-P89-ibm89n07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P89/ibm89n07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P89/ibm89n08.xml
+%% ID: ibm-not-wf-P89-ibm89n08.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P89-ibm89n08'(suite) -> [];
+'ibm-not-wf-P89-ibm89n08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P89/ibm89n08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P89/ibm89n09.xml
+%% ID: ibm-not-wf-P89-ibm89n09.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P89-ibm89n09'(suite) -> [];
+'ibm-not-wf-P89-ibm89n09'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P89/ibm89n09.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P89/ibm89n10.xml
+%% ID: ibm-not-wf-P89-ibm89n10.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P89-ibm89n10'(suite) -> [];
+'ibm-not-wf-P89-ibm89n10'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P89/ibm89n10.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P89/ibm89n11.xml
+%% ID: ibm-not-wf-P89-ibm89n11.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P89-ibm89n11'(suite) -> [];
+'ibm-not-wf-P89-ibm89n11'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P89/ibm89n11.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: not-wf/P89/ibm89n12.xml
+%% ID: ibm-not-wf-P89-ibm89n12.xml
+%% Type: not-wf
+%% Sections: B.
+'ibm-not-wf-P89-ibm89n12'(suite) -> [];
+'ibm-not-wf-P89-ibm89n12'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","not-wf/P89/ibm89n12.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "not-wf").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 89
+
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - not-wf tests
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P01/ibm01v01.xml
+%% ID: ibm-valid-P01-ibm01v01.xml
+%% Type: valid
+%% Sections: 2.1
+'ibm-valid-P01-ibm01v01'(suite) -> [];
+'ibm-valid-P01-ibm01v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P01/ibm01v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 1
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P02/ibm02v01.xml
+%% ID: ibm-valid-P02-ibm02v01.xml
+%% Type: valid
+%% Sections: 2.2
+'ibm-valid-P02-ibm02v01'(suite) -> [];
+'ibm-valid-P02-ibm02v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P02/ibm02v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 2
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P03/ibm03v01.xml
+%% ID: ibm-valid-P03-ibm03v01.xml
+%% Type: valid
+%% Sections: 2.3
+'ibm-valid-P03-ibm03v01'(suite) -> [];
+'ibm-valid-P03-ibm03v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P03/ibm03v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 3
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P09/ibm09v01.xml
+%% ID: ibm-valid-P09-ibm09v01.xml
+%% Type: valid
+%% Sections: 2.3
+'ibm-valid-P09-ibm09v01'(suite) -> [];
+'ibm-valid-P09-ibm09v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P09/ibm09v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P09/ibm09v02.xml
+%% ID: ibm-valid-P09-ibm09v02.xml
+%% Type: valid
+%% Sections: 2.3
+'ibm-valid-P09-ibm09v02'(suite) -> [];
+'ibm-valid-P09-ibm09v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P09/ibm09v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P09/ibm09v03.xml
+%% ID: ibm-valid-P09-ibm09v03.xml
+%% Type: valid
+%% Sections: 2.3
+'ibm-valid-P09-ibm09v03'(suite) -> [];
+'ibm-valid-P09-ibm09v03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P09/ibm09v03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P09/ibm09v04.xml
+%% ID: ibm-valid-P09-ibm09v04.xml
+%% Type: valid
+%% Sections: 2.3
+'ibm-valid-P09-ibm09v04'(suite) -> [];
+'ibm-valid-P09-ibm09v04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P09/ibm09v04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P09/ibm09v05.xml
+%% ID: ibm-valid-P09-ibm09v05.xml
+%% Type: valid
+%% Sections: 2.3
+'ibm-valid-P09-ibm09v05'(suite) -> [];
+'ibm-valid-P09-ibm09v05'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P09/ibm09v05.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 9
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P10/ibm10v01.xml
+%% ID: ibm-valid-P10-ibm10v01.xml
+%% Type: valid
+%% Sections: 2.3
+'ibm-valid-P10-ibm10v01'(suite) -> [];
+'ibm-valid-P10-ibm10v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P10/ibm10v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P10/ibm10v02.xml
+%% ID: ibm-valid-P10-ibm10v02.xml
+%% Type: valid
+%% Sections: 2.3
+'ibm-valid-P10-ibm10v02'(suite) -> [];
+'ibm-valid-P10-ibm10v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P10/ibm10v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P10/ibm10v03.xml
+%% ID: ibm-valid-P10-ibm10v03.xml
+%% Type: valid
+%% Sections: 2.3
+'ibm-valid-P10-ibm10v03'(suite) -> [];
+'ibm-valid-P10-ibm10v03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P10/ibm10v03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P10/ibm10v04.xml
+%% ID: ibm-valid-P10-ibm10v04.xml
+%% Type: valid
+%% Sections: 2.3
+'ibm-valid-P10-ibm10v04'(suite) -> [];
+'ibm-valid-P10-ibm10v04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P10/ibm10v04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P10/ibm10v05.xml
+%% ID: ibm-valid-P10-ibm10v05.xml
+%% Type: valid
+%% Sections: 2.3
+'ibm-valid-P10-ibm10v05'(suite) -> [];
+'ibm-valid-P10-ibm10v05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P10/ibm10v05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P10/ibm10v06.xml
+%% ID: ibm-valid-P10-ibm10v06.xml
+%% Type: valid
+%% Sections: 2.3
+'ibm-valid-P10-ibm10v06'(suite) -> [];
+'ibm-valid-P10-ibm10v06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P10/ibm10v06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P10/ibm10v07.xml
+%% ID: ibm-valid-P10-ibm10v07.xml
+%% Type: valid
+%% Sections: 2.3
+'ibm-valid-P10-ibm10v07'(suite) -> [];
+'ibm-valid-P10-ibm10v07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P10/ibm10v07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P10/ibm10v08.xml
+%% ID: ibm-valid-P10-ibm10v08.xml
+%% Type: valid
+%% Sections: 2.3
+'ibm-valid-P10-ibm10v08'(suite) -> [];
+'ibm-valid-P10-ibm10v08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P10/ibm10v08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 10
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P11/ibm11v01.xml
+%% ID: ibm-valid-P11-ibm11v01.xml
+%% Type: valid
+%% Sections: 2.3
+'ibm-valid-P11-ibm11v01'(suite) -> [];
+'ibm-valid-P11-ibm11v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P11/ibm11v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P11/ibm11v02.xml
+%% ID: ibm-valid-P11-ibm11v02.xml
+%% Type: valid
+%% Sections: 2.3
+'ibm-valid-P11-ibm11v02'(suite) -> [];
+'ibm-valid-P11-ibm11v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P11/ibm11v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P11/ibm11v03.xml
+%% ID: ibm-valid-P11-ibm11v03.xml
+%% Type: valid
+%% Sections: 2.3
+'ibm-valid-P11-ibm11v03'(suite) -> [];
+'ibm-valid-P11-ibm11v03'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P11/ibm11v03.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P11/ibm11v04.xml
+%% ID: ibm-valid-P11-ibm11v04.xml
+%% Type: valid
+%% Sections: 2.3
+'ibm-valid-P11-ibm11v04'(suite) -> [];
+'ibm-valid-P11-ibm11v04'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P11/ibm11v04.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 11
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P12/ibm12v01.xml
+%% ID: ibm-valid-P12-ibm12v01.xml
+%% Type: valid
+%% Sections: 2.3
+'ibm-valid-P12-ibm12v01'(suite) -> [];
+'ibm-valid-P12-ibm12v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P12/ibm12v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P12/ibm12v02.xml
+%% ID: ibm-valid-P12-ibm12v02.xml
+%% Type: valid
+%% Sections: 2.3
+'ibm-valid-P12-ibm12v02'(suite) -> [];
+'ibm-valid-P12-ibm12v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P12/ibm12v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P12/ibm12v03.xml
+%% ID: ibm-valid-P12-ibm12v03.xml
+%% Type: valid
+%% Sections: 2.3
+'ibm-valid-P12-ibm12v03'(suite) -> [];
+'ibm-valid-P12-ibm12v03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P12/ibm12v03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P12/ibm12v04.xml
+%% ID: ibm-valid-P12-ibm12v04.xml
+%% Type: valid
+%% Sections: 2.3
+'ibm-valid-P12-ibm12v04'(suite) -> [];
+'ibm-valid-P12-ibm12v04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P12/ibm12v04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 12
+
+testcases111(suite) -> [].
+%% ['ibm-valid-P12-ibm12v01','ibm-valid-P12-ibm12v02','ibm-valid-P12-ibm12v03','ibm-valid-P12-ibm12v04'].
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P13/ibm13v01.xml
+%% ID: ibm-valid-P13-ibm13v01.xml
+%% Type: valid
+%% Sections: 2.3
+'ibm-valid-P13-ibm13v01'(suite) -> [];
+'ibm-valid-P13-ibm13v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P13/ibm13v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 13
+
+testcases112(suite) -> [].
+%% ['ibm-valid-P13-ibm13v01'].
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P14/ibm14v01.xml
+%% ID: ibm-valid-P14-ibm14v01.xml
+%% Type: valid
+%% Sections: 2.4
+'ibm-valid-P14-ibm14v01'(suite) -> [];
+'ibm-valid-P14-ibm14v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P14/ibm14v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P14/ibm14v02.xml
+%% ID: ibm-valid-P14-ibm14v02.xml
+%% Type: valid
+%% Sections: 2.4
+'ibm-valid-P14-ibm14v02'(suite) -> [];
+'ibm-valid-P14-ibm14v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P14/ibm14v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P14/ibm14v03.xml
+%% ID: ibm-valid-P14-ibm14v03.xml
+%% Type: valid
+%% Sections: 2.4
+'ibm-valid-P14-ibm14v03'(suite) -> [];
+'ibm-valid-P14-ibm14v03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P14/ibm14v03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 14
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P15/ibm15v01.xml
+%% ID: ibm-valid-P15-ibm15v01.xml
+%% Type: valid
+%% Sections: 2.5
+'ibm-valid-P15-ibm15v01'(suite) -> [];
+'ibm-valid-P15-ibm15v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P15/ibm15v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P15/ibm15v02.xml
+%% ID: ibm-valid-P15-ibm15v02.xml
+%% Type: valid
+%% Sections: 2.5
+'ibm-valid-P15-ibm15v02'(suite) -> [];
+'ibm-valid-P15-ibm15v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P15/ibm15v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P15/ibm15v03.xml
+%% ID: ibm-valid-P15-ibm15v03.xml
+%% Type: valid
+%% Sections: 2.5
+'ibm-valid-P15-ibm15v03'(suite) -> [];
+'ibm-valid-P15-ibm15v03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P15/ibm15v03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P15/ibm15v04.xml
+%% ID: ibm-valid-P15-ibm15v04.xml
+%% Type: valid
+%% Sections: 2.5
+'ibm-valid-P15-ibm15v04'(suite) -> [];
+'ibm-valid-P15-ibm15v04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P15/ibm15v04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 15
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P16/ibm16v01.xml
+%% ID: ibm-valid-P16-ibm16v01.xml
+%% Type: valid
+%% Sections: 2.6
+'ibm-valid-P16-ibm16v01'(suite) -> [];
+'ibm-valid-P16-ibm16v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P16/ibm16v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P16/ibm16v02.xml
+%% ID: ibm-valid-P16-ibm16v02.xml
+%% Type: valid
+%% Sections: 2.6
+'ibm-valid-P16-ibm16v02'(suite) -> [];
+'ibm-valid-P16-ibm16v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P16/ibm16v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P16/ibm16v03.xml
+%% ID: ibm-valid-P16-ibm16v03.xml
+%% Type: valid
+%% Sections: 2.6
+'ibm-valid-P16-ibm16v03'(suite) -> [];
+'ibm-valid-P16-ibm16v03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P16/ibm16v03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 16
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P17/ibm17v01.xml
+%% ID: ibm-valid-P17-ibm17v01.xml
+%% Type: valid
+%% Sections: 2.6
+'ibm-valid-P17-ibm17v01'(suite) -> [];
+'ibm-valid-P17-ibm17v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P17/ibm17v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 17
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P18/ibm18v01.xml
+%% ID: ibm-valid-P18-ibm18v01.xml
+%% Type: valid
+%% Sections: 2.7
+'ibm-valid-P18-ibm18v01'(suite) -> [];
+'ibm-valid-P18-ibm18v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P18/ibm18v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 18
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P19/ibm19v01.xml
+%% ID: ibm-valid-P19-ibm19v01.xml
+%% Type: valid
+%% Sections: 2.7
+'ibm-valid-P19-ibm19v01'(suite) -> [];
+'ibm-valid-P19-ibm19v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P19/ibm19v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 19
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P20/ibm20v01.xml
+%% ID: ibm-valid-P20-ibm20v01.xml
+%% Type: valid
+%% Sections: 2.7
+'ibm-valid-P20-ibm20v01'(suite) -> [];
+'ibm-valid-P20-ibm20v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P20/ibm20v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P20/ibm20v02.xml
+%% ID: ibm-valid-P20-ibm20v02.xml
+%% Type: valid
+%% Sections: 2.7
+'ibm-valid-P20-ibm20v02'(suite) -> [];
+'ibm-valid-P20-ibm20v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P20/ibm20v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 20
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P21/ibm21v01.xml
+%% ID: ibm-valid-P21-ibm21v01.xml
+%% Type: valid
+%% Sections: 2.7
+'ibm-valid-P21-ibm21v01'(suite) -> [];
+'ibm-valid-P21-ibm21v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P21/ibm21v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 21
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P22/ibm22v01.xml
+%% ID: ibm-valid-P22-ibm22v01.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P22-ibm22v01'(suite) -> [];
+'ibm-valid-P22-ibm22v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P22/ibm22v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P22/ibm22v02.xml
+%% ID: ibm-valid-P22-ibm22v02.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P22-ibm22v02'(suite) -> [];
+'ibm-valid-P22-ibm22v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P22/ibm22v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P22/ibm22v03.xml
+%% ID: ibm-valid-P22-ibm22v03.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P22-ibm22v03'(suite) -> [];
+'ibm-valid-P22-ibm22v03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P22/ibm22v03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P22/ibm22v04.xml
+%% ID: ibm-valid-P22-ibm22v04.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P22-ibm22v04'(suite) -> [];
+'ibm-valid-P22-ibm22v04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P22/ibm22v04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P22/ibm22v05.xml
+%% ID: ibm-valid-P22-ibm22v05.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P22-ibm22v05'(suite) -> [];
+'ibm-valid-P22-ibm22v05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P22/ibm22v05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P22/ibm22v06.xml
+%% ID: ibm-valid-P22-ibm22v06.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P22-ibm22v06'(suite) -> [];
+'ibm-valid-P22-ibm22v06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P22/ibm22v06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P22/ibm22v07.xml
+%% ID: ibm-valid-P22-ibm22v07.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P22-ibm22v07'(suite) -> [];
+'ibm-valid-P22-ibm22v07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P22/ibm22v07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 22
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P23/ibm23v01.xml
+%% ID: ibm-valid-P23-ibm23v01.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P23-ibm23v01'(suite) -> [];
+'ibm-valid-P23-ibm23v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P23/ibm23v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P23/ibm23v02.xml
+%% ID: ibm-valid-P23-ibm23v02.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P23-ibm23v02'(suite) -> [];
+'ibm-valid-P23-ibm23v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P23/ibm23v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P23/ibm23v03.xml
+%% ID: ibm-valid-P23-ibm23v03.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P23-ibm23v03'(suite) -> [];
+'ibm-valid-P23-ibm23v03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P23/ibm23v03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P23/ibm23v04.xml
+%% ID: ibm-valid-P23-ibm23v04.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P23-ibm23v04'(suite) -> [];
+'ibm-valid-P23-ibm23v04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P23/ibm23v04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P23/ibm23v05.xml
+%% ID: ibm-valid-P23-ibm23v05.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P23-ibm23v05'(suite) -> [];
+'ibm-valid-P23-ibm23v05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P23/ibm23v05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P23/ibm23v06.xml
+%% ID: ibm-valid-P23-ibm23v06.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P23-ibm23v06'(suite) -> [];
+'ibm-valid-P23-ibm23v06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P23/ibm23v06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 23
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P24/ibm24v01.xml
+%% ID: ibm-valid-P24-ibm24v01.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P24-ibm24v01'(suite) -> [];
+'ibm-valid-P24-ibm24v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P24/ibm24v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P24/ibm24v02.xml
+%% ID: ibm-valid-P24-ibm24v02.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P24-ibm24v02'(suite) -> [];
+'ibm-valid-P24-ibm24v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P24/ibm24v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 24
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P25/ibm25v01.xml
+%% ID: ibm-valid-P25-ibm25v01.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P25-ibm25v01'(suite) -> [];
+'ibm-valid-P25-ibm25v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P25/ibm25v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P25/ibm25v02.xml
+%% ID: ibm-valid-P25-ibm25v02.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P25-ibm25v02'(suite) -> [];
+'ibm-valid-P25-ibm25v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P25/ibm25v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P25/ibm25v03.xml
+%% ID: ibm-valid-P25-ibm25v03.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P25-ibm25v03'(suite) -> [];
+'ibm-valid-P25-ibm25v03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P25/ibm25v03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P25/ibm25v04.xml
+%% ID: ibm-valid-P25-ibm25v04.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P25-ibm25v04'(suite) -> [];
+'ibm-valid-P25-ibm25v04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P25/ibm25v04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 25
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P26/ibm26v01.xml
+%% ID: ibm-valid-P26-ibm26v01.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P26-ibm26v01'(suite) -> [];
+'ibm-valid-P26-ibm26v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P26/ibm26v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 26
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P27/ibm27v01.xml
+%% ID: ibm-valid-P27-ibm27v01.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P27-ibm27v01'(suite) -> [];
+'ibm-valid-P27-ibm27v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P27/ibm27v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P27/ibm27v02.xml
+%% ID: ibm-valid-P27-ibm27v02.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P27-ibm27v02'(suite) -> [];
+'ibm-valid-P27-ibm27v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P27/ibm27v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P27/ibm27v03.xml
+%% ID: ibm-valid-P27-ibm27v03.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P27-ibm27v03'(suite) -> [];
+'ibm-valid-P27-ibm27v03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P27/ibm27v03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 27
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P28/ibm28v01.xml
+%% ID: ibm-valid-P28-ibm28v01.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P28-ibm28v01'(suite) -> [];
+'ibm-valid-P28-ibm28v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P28/ibm28v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P28/ibm28v02.xml
+%% ID: ibm-valid-P28-ibm28v02.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P28-ibm28v02'(suite) -> [];
+'ibm-valid-P28-ibm28v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P28/ibm28v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 28
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P29/ibm29v01.xml
+%% ID: ibm-valid-P29-ibm29v01.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P29-ibm29v01'(suite) -> [];
+'ibm-valid-P29-ibm29v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P29/ibm29v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P29/ibm29v02.xml
+%% ID: ibm-valid-P29-ibm29v02.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P29-ibm29v02'(suite) -> [];
+'ibm-valid-P29-ibm29v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P29/ibm29v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 29
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P30/ibm30v01.xml
+%% ID: ibm-valid-P30-ibm30v01.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P30-ibm30v01'(suite) -> [];
+'ibm-valid-P30-ibm30v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P30/ibm30v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P30/ibm30v02.xml
+%% ID: ibm-valid-P30-ibm30v02.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P30-ibm30v02'(suite) -> [];
+'ibm-valid-P30-ibm30v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P30/ibm30v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 30
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P31/ibm31v01.xml
+%% ID: ibm-valid-P31-ibm31v01.xml
+%% Type: valid
+%% Sections: 2.8
+'ibm-valid-P31-ibm31v01'(suite) -> [];
+'ibm-valid-P31-ibm31v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P31/ibm31v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 31
+
+testcases130(suite) -> [].
+%% ['ibm-valid-P31-ibm31v01'].
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P32/ibm32v01.xml
+%% ID: ibm-valid-P32-ibm32v01.xml
+%% Type: valid
+%% Sections: 2.9
+'ibm-valid-P32-ibm32v01'(suite) -> [];
+'ibm-valid-P32-ibm32v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P32/ibm32v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P32/ibm32v02.xml
+%% ID: ibm-valid-P32-ibm32v02.xml
+%% Type: valid
+%% Sections: 2.9
+'ibm-valid-P32-ibm32v02'(suite) -> [];
+'ibm-valid-P32-ibm32v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P32/ibm32v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P32/ibm32v03.xml
+%% ID: ibm-valid-P32-ibm32v03.xml
+%% Type: valid
+%% Sections: 2.9
+'ibm-valid-P32-ibm32v03'(suite) -> [];
+'ibm-valid-P32-ibm32v03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P32/ibm32v03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P32/ibm32v04.xml
+%% ID: ibm-valid-P32-ibm32v04.xml
+%% Type: valid
+%% Sections: 2.9
+'ibm-valid-P32-ibm32v04'(suite) -> [];
+'ibm-valid-P32-ibm32v04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P32/ibm32v04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 32
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P33/ibm33v01.xml
+%% ID: ibm-valid-P33-ibm33v01.xml
+%% Type: valid
+%% Sections: 2.12
+'ibm-valid-P33-ibm33v01'(suite) -> [];
+'ibm-valid-P33-ibm33v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P33/ibm33v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 33
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P34/ibm34v01.xml
+%% ID: ibm-valid-P34-ibm34v01.xml
+%% Type: valid
+%% Sections: 2.12
+'ibm-valid-P34-ibm34v01'(suite) -> [];
+'ibm-valid-P34-ibm34v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P34/ibm34v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 34
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P35/ibm35v01.xml
+%% ID: ibm-valid-P35-ibm35v01.xml
+%% Type: valid
+%% Sections: 2.12
+'ibm-valid-P35-ibm35v01'(suite) -> [];
+'ibm-valid-P35-ibm35v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P35/ibm35v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 35
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P36/ibm36v01.xml
+%% ID: ibm-valid-P36-ibm36v01.xml
+%% Type: valid
+%% Sections: 2.12
+'ibm-valid-P36-ibm36v01'(suite) -> [];
+'ibm-valid-P36-ibm36v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P36/ibm36v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 36
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P37/ibm37v01.xml
+%% ID: ibm-valid-P37-ibm37v01.xml
+%% Type: valid
+%% Sections: 2.12
+'ibm-valid-P37-ibm37v01'(suite) -> [];
+'ibm-valid-P37-ibm37v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P37/ibm37v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 37
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P38/ibm38v01.xml
+%% ID: ibm-valid-P38-ibm38v01.xml
+%% Type: valid
+%% Sections: 2.12
+'ibm-valid-P38-ibm38v01'(suite) -> [];
+'ibm-valid-P38-ibm38v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P38/ibm38v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 38
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P39/ibm39v01.xml
+%% ID: ibm-valid-P39-ibm39v01.xml
+%% Type: valid
+%% Sections: 3
+'ibm-valid-P39-ibm39v01'(suite) -> [];
+'ibm-valid-P39-ibm39v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P39/ibm39v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 39
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P40/ibm40v01.xml
+%% ID: ibm-valid-P40-ibm40v01.xml
+%% Type: valid
+%% Sections: 3.1
+'ibm-valid-P40-ibm40v01'(suite) -> [];
+'ibm-valid-P40-ibm40v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P40/ibm40v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 40
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P41/ibm41v01.xml
+%% ID: ibm-valid-P41-ibm41v01.xml
+%% Type: valid
+%% Sections: 3.1
+'ibm-valid-P41-ibm41v01'(suite) -> [];
+'ibm-valid-P41-ibm41v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P41/ibm41v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 41
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P42/ibm42v01.xml
+%% ID: ibm-valid-P42-ibm42v01.xml
+%% Type: valid
+%% Sections: 3.1
+'ibm-valid-P42-ibm42v01'(suite) -> [];
+'ibm-valid-P42-ibm42v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P42/ibm42v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 42
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P43/ibm43v01.xml
+%% ID: ibm-valid-P43-ibm43v01.xml
+%% Type: valid
+%% Sections: 3.1
+'ibm-valid-P43-ibm43v01'(suite) -> [];
+'ibm-valid-P43-ibm43v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P43/ibm43v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 43
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P44/ibm44v01.xml
+%% ID: ibm-valid-P44-ibm44v01.xml
+%% Type: valid
+%% Sections: 3.1
+'ibm-valid-P44-ibm44v01'(suite) -> [];
+'ibm-valid-P44-ibm44v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P44/ibm44v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 44
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P45/ibm45v01.xml
+%% ID: ibm-valid-P45-ibm45v01.xml
+%% Type: valid
+%% Sections: 3.2
+'ibm-valid-P45-ibm45v01'(suite) -> [];
+'ibm-valid-P45-ibm45v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P45/ibm45v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 45
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P47/ibm47v01.xml
+%% ID: ibm-valid-P47-ibm47v01.xml
+%% Type: valid
+%% Sections: 3.2.1
+'ibm-valid-P47-ibm47v01'(suite) -> [];
+'ibm-valid-P47-ibm47v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P47/ibm47v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 47
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P49/ibm49v01.xml
+%% ID: ibm-valid-P49-ibm49v01.xml
+%% Type: valid
+%% Sections: 3.2.1
+'ibm-valid-P49-ibm49v01'(suite) -> [];
+'ibm-valid-P49-ibm49v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P49/ibm49v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 49
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P50/ibm50v01.xml
+%% ID: ibm-valid-P50-ibm50v01.xml
+%% Type: valid
+%% Sections: 3.2.1
+'ibm-valid-P50-ibm50v01'(suite) -> [];
+'ibm-valid-P50-ibm50v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P50/ibm50v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 50
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P51/ibm51v01.xml
+%% ID: ibm-valid-P51-ibm51v01.xml
+%% Type: valid
+%% Sections: 3.2.2
+'ibm-valid-P51-ibm51v01'(suite) -> [];
+'ibm-valid-P51-ibm51v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P51/ibm51v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P51/ibm51v02.xml
+%% ID: ibm-valid-P51-ibm51v02.xml
+%% Type: valid
+%% Sections: 3.2.2
+'ibm-valid-P51-ibm51v02'(suite) -> [];
+'ibm-valid-P51-ibm51v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P51/ibm51v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 51
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P52/ibm52v01.xml
+%% ID: ibm-valid-P52-ibm52v01.xml
+%% Type: valid
+%% Sections: 3.3
+'ibm-valid-P52-ibm52v01'(suite) -> [];
+'ibm-valid-P52-ibm52v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P52/ibm52v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 52
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P54/ibm54v01.xml
+%% ID: ibm-valid-P54-ibm54v01.xml
+%% Type: valid
+%% Sections: 3.3.1
+'ibm-valid-P54-ibm54v01'(suite) -> [];
+'ibm-valid-P54-ibm54v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P54/ibm54v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P54/ibm54v02.xml
+%% ID: ibm-valid-P54-ibm54v02.xml
+%% Type: valid
+%% Sections: 3.3.1
+'ibm-valid-P54-ibm54v02'(suite) -> [];
+'ibm-valid-P54-ibm54v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P54/ibm54v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P54/ibm54v03.xml
+%% ID: ibm-valid-P54-ibm54v03.xml
+%% Type: valid
+%% Sections: 3.3.1
+'ibm-valid-P54-ibm54v03'(suite) -> [];
+'ibm-valid-P54-ibm54v03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P54/ibm54v03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 54
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P55/ibm55v01.xml
+%% ID: ibm-valid-P55-ibm55v01.xml
+%% Type: valid
+%% Sections: 3.3.1
+'ibm-valid-P55-ibm55v01'(suite) -> [];
+'ibm-valid-P55-ibm55v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P55/ibm55v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 55
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P56/ibm56v01.xml
+%% ID: ibm-valid-P56-ibm56v01.xml
+%% Type: valid
+%% Sections: 3.3.1
+'ibm-valid-P56-ibm56v01'(suite) -> [];
+'ibm-valid-P56-ibm56v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P56/ibm56v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P56/ibm56v02.xml
+%% ID: ibm-valid-P56-ibm56v02.xml
+%% Type: valid
+%% Sections: 3.3.1
+'ibm-valid-P56-ibm56v02'(suite) -> [];
+'ibm-valid-P56-ibm56v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P56/ibm56v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P56/ibm56v03.xml
+%% ID: ibm-valid-P56-ibm56v03.xml
+%% Type: valid
+%% Sections: 3.3.1
+'ibm-valid-P56-ibm56v03'(suite) -> [];
+'ibm-valid-P56-ibm56v03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P56/ibm56v03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P56/ibm56v04.xml
+%% ID: ibm-valid-P56-ibm56v04.xml
+%% Type: valid
+%% Sections: 3.3.1
+'ibm-valid-P56-ibm56v04'(suite) -> [];
+'ibm-valid-P56-ibm56v04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P56/ibm56v04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P56/ibm56v05.xml
+%% ID: ibm-valid-P56-ibm56v05.xml
+%% Type: valid
+%% Sections: 3.3.1
+'ibm-valid-P56-ibm56v05'(suite) -> [];
+'ibm-valid-P56-ibm56v05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P56/ibm56v05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P56/ibm56v06.xml
+%% ID: ibm-valid-P56-ibm56v06.xml
+%% Type: valid
+%% Sections: 3.3.1
+'ibm-valid-P56-ibm56v06'(suite) -> [];
+'ibm-valid-P56-ibm56v06'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P56/ibm56v06.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P56/ibm56v07.xml
+%% ID: ibm-valid-P56-ibm56v07.xml
+%% Type: valid
+%% Sections: 3.3.1
+'ibm-valid-P56-ibm56v07'(suite) -> [];
+'ibm-valid-P56-ibm56v07'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P56/ibm56v07.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P56/ibm56v08.xml
+%% ID: ibm-valid-P56-ibm56v08.xml
+%% Type: valid
+%% Sections: 3.3.1
+'ibm-valid-P56-ibm56v08'(suite) -> [];
+'ibm-valid-P56-ibm56v08'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P56/ibm56v08.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P56/ibm56v09.xml
+%% ID: ibm-valid-P56-ibm56v09.xml
+%% Type: valid
+%% Sections: 3.3.1
+'ibm-valid-P56-ibm56v09'(suite) -> [];
+'ibm-valid-P56-ibm56v09'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P56/ibm56v09.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P56/ibm56v10.xml
+%% ID: ibm-valid-P56-ibm56v10.xml
+%% Type: valid
+%% Sections: 3.3.1
+'ibm-valid-P56-ibm56v10'(suite) -> [];
+'ibm-valid-P56-ibm56v10'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P56/ibm56v10.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 56
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P57/ibm57v01.xml
+%% ID: ibm-valid-P57-ibm57v01.xml
+%% Type: valid
+%% Sections: 3.3.1
+'ibm-valid-P57-ibm57v01'(suite) -> [];
+'ibm-valid-P57-ibm57v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P57/ibm57v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 57
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P58/ibm58v01.xml
+%% ID: ibm-valid-P58-ibm58v01.xml
+%% Type: valid
+%% Sections: 3.3.1
+'ibm-valid-P58-ibm58v01'(suite) -> [];
+'ibm-valid-P58-ibm58v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P58/ibm58v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P58/ibm58v02.xml
+%% ID: ibm-valid-P58-ibm58v02.xml
+%% Type: valid
+%% Sections: 3.3.1
+'ibm-valid-P58-ibm58v02'(suite) -> [];
+'ibm-valid-P58-ibm58v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P58/ibm58v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 58
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P59/ibm59v01.xml
+%% ID: ibm-valid-P59-ibm59v01.xml
+%% Type: valid
+%% Sections: 3.3.1
+'ibm-valid-P59-ibm59v01'(suite) -> [];
+'ibm-valid-P59-ibm59v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P59/ibm59v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P59/ibm59v02.xml
+%% ID: ibm-valid-P59-ibm59v02.xml
+%% Type: valid
+%% Sections: 3.3.1
+'ibm-valid-P59-ibm59v02'(suite) -> [];
+'ibm-valid-P59-ibm59v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P59/ibm59v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 59
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P60/ibm60v01.xml
+%% ID: ibm-valid-P60-ibm60v01.xml
+%% Type: valid
+%% Sections: 3.3.2
+'ibm-valid-P60-ibm60v01'(suite) -> [];
+'ibm-valid-P60-ibm60v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P60/ibm60v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P60/ibm60v02.xml
+%% ID: ibm-valid-P60-ibm60v02.xml
+%% Type: valid
+%% Sections: 3.3.2
+'ibm-valid-P60-ibm60v02'(suite) -> [];
+'ibm-valid-P60-ibm60v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P60/ibm60v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P60/ibm60v03.xml
+%% ID: ibm-valid-P60-ibm60v03.xml
+%% Type: valid
+%% Sections: 3.3.2
+'ibm-valid-P60-ibm60v03'(suite) -> [];
+'ibm-valid-P60-ibm60v03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P60/ibm60v03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P60/ibm60v04.xml
+%% ID: ibm-valid-P60-ibm60v04.xml
+%% Type: valid
+%% Sections: 3.3.2
+'ibm-valid-P60-ibm60v04'(suite) -> [];
+'ibm-valid-P60-ibm60v04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P60/ibm60v04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 60
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P61/ibm61v01.xml
+%% ID: ibm-valid-P61-ibm61v01.xml
+%% Type: valid
+%% Sections: 3.4
+'ibm-valid-P61-ibm61v01'(suite) -> [];
+'ibm-valid-P61-ibm61v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P61/ibm61v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P61/ibm61v02.xml
+%% ID: ibm-valid-P61-ibm61v02.xml
+%% Type: valid
+%% Sections: 3.4
+'ibm-valid-P61-ibm61v02'(suite) -> [];
+'ibm-valid-P61-ibm61v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P61/ibm61v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 61
+
+testcases157(suite) -> [].
+%% ['ibm-valid-P61-ibm61v01','ibm-valid-P61-ibm61v02'].
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P62/ibm62v01.xml
+%% ID: ibm-valid-P62-ibm62v01.xml
+%% Type: valid
+%% Sections: 3.4
+'ibm-valid-P62-ibm62v01'(suite) -> [];
+'ibm-valid-P62-ibm62v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P62/ibm62v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P62/ibm62v02.xml
+%% ID: ibm-valid-P62-ibm62v02.xml
+%% Type: valid
+%% Sections: 3.4
+'ibm-valid-P62-ibm62v02'(suite) -> [];
+'ibm-valid-P62-ibm62v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P62/ibm62v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P62/ibm62v03.xml
+%% ID: ibm-valid-P62-ibm62v03.xml
+%% Type: valid
+%% Sections: 3.4
+'ibm-valid-P62-ibm62v03'(suite) -> [];
+'ibm-valid-P62-ibm62v03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P62/ibm62v03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P62/ibm62v04.xml
+%% ID: ibm-valid-P62-ibm62v04.xml
+%% Type: valid
+%% Sections: 3.4
+'ibm-valid-P62-ibm62v04'(suite) -> [];
+'ibm-valid-P62-ibm62v04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P62/ibm62v04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P62/ibm62v05.xml
+%% ID: ibm-valid-P62-ibm62v05.xml
+%% Type: valid
+%% Sections: 3.4
+'ibm-valid-P62-ibm62v05'(suite) -> [];
+'ibm-valid-P62-ibm62v05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P62/ibm62v05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 62
+
+testcases158(suite) -> [].
+%% ['ibm-valid-P62-ibm62v01','ibm-valid-P62-ibm62v02','ibm-valid-P62-ibm62v03','ibm-valid-P62-ibm62v04','ibm-valid-P62-ibm62v05'].
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P63/ibm63v01.xml
+%% ID: ibm-valid-P63-ibm63v01.xml
+%% Type: valid
+%% Sections: 3.4
+'ibm-valid-P63-ibm63v01'(suite) -> [];
+'ibm-valid-P63-ibm63v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P63/ibm63v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P63/ibm63v02.xml
+%% ID: ibm-valid-P63-ibm63v02.xml
+%% Type: valid
+%% Sections: 3.4
+'ibm-valid-P63-ibm63v02'(suite) -> [];
+'ibm-valid-P63-ibm63v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P63/ibm63v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P63/ibm63v03.xml
+%% ID: ibm-valid-P63-ibm63v03.xml
+%% Type: valid
+%% Sections: 3.4
+'ibm-valid-P63-ibm63v03'(suite) -> [];
+'ibm-valid-P63-ibm63v03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P63/ibm63v03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P63/ibm63v04.xml
+%% ID: ibm-valid-P63-ibm63v04.xml
+%% Type: valid
+%% Sections: 3.4
+'ibm-valid-P63-ibm63v04'(suite) -> [];
+'ibm-valid-P63-ibm63v04'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P63/ibm63v04.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P63/ibm63v05.xml
+%% ID: ibm-valid-P63-ibm63v05.xml
+%% Type: valid
+%% Sections: 3.4
+'ibm-valid-P63-ibm63v05'(suite) -> [];
+'ibm-valid-P63-ibm63v05'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P63/ibm63v05.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 63
+
+testcases159(suite) -> [].
+%% ['ibm-valid-P63-ibm63v01','ibm-valid-P63-ibm63v02','ibm-valid-P63-ibm63v03','ibm-valid-P63-ibm63v04','ibm-valid-P63-ibm63v05'].
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P64/ibm64v01.xml
+%% ID: ibm-valid-P64-ibm64v01.xml
+%% Type: valid
+%% Sections: 3.4
+'ibm-valid-P64-ibm64v01'(suite) -> [];
+'ibm-valid-P64-ibm64v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P64/ibm64v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P64/ibm64v02.xml
+%% ID: ibm-valid-P64-ibm64v02.xml
+%% Type: valid
+%% Sections: 3.4
+'ibm-valid-P64-ibm64v02'(suite) -> [];
+'ibm-valid-P64-ibm64v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P64/ibm64v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P64/ibm64v03.xml
+%% ID: ibm-valid-P64-ibm64v03.xml
+%% Type: valid
+%% Sections: 3.4
+'ibm-valid-P64-ibm64v03'(suite) -> [];
+'ibm-valid-P64-ibm64v03'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P64/ibm64v03.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 64
+
+testcases160(suite) -> [].
+%% ['ibm-valid-P64-ibm64v01','ibm-valid-P64-ibm64v02','ibm-valid-P64-ibm64v03'].
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P65/ibm65v01.xml
+%% ID: ibm-valid-P65-ibm65v01.xml
+%% Type: valid
+%% Sections: 3.4
+'ibm-valid-P65-ibm65v01'(suite) -> [];
+'ibm-valid-P65-ibm65v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P65/ibm65v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P65/ibm65v02.xml
+%% ID: ibm-valid-P65-ibm65v02.xml
+%% Type: valid
+%% Sections: 3.4
+'ibm-valid-P65-ibm65v02'(suite) -> [];
+'ibm-valid-P65-ibm65v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P65/ibm65v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 65
+
+testcases161(suite) -> [].
+%% ['ibm-valid-P65-ibm65v01','ibm-valid-P65-ibm65v02'].
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P66/ibm66v01.xml
+%% ID: ibm-valid-P66-ibm66v01.xml
+%% Type: valid
+%% Sections: 4.1
+'ibm-valid-P66-ibm66v01'(suite) -> [];
+'ibm-valid-P66-ibm66v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P66/ibm66v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 66
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P67/ibm67v01.xml
+%% ID: ibm-valid-P67-ibm67v01.xml
+%% Type: valid
+%% Sections: 4.1
+'ibm-valid-P67-ibm67v01'(suite) -> [];
+'ibm-valid-P67-ibm67v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P67/ibm67v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 67
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P68/ibm68v01.xml
+%% ID: ibm-valid-P68-ibm68v01.xml
+%% Type: valid
+%% Sections: 4.1
+'ibm-valid-P68-ibm68v01'(suite) -> [];
+'ibm-valid-P68-ibm68v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P68/ibm68v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P68/ibm68v02.xml
+%% ID: ibm-valid-P68-ibm68v02.xml
+%% Type: valid
+%% Sections: 4.1
+'ibm-valid-P68-ibm68v02'(suite) -> [];
+'ibm-valid-P68-ibm68v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P68/ibm68v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 68
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P69/ibm69v01.xml
+%% ID: ibm-valid-P69-ibm69v01.xml
+%% Type: valid
+%% Sections: 4.1
+'ibm-valid-P69-ibm69v01'(suite) -> [];
+'ibm-valid-P69-ibm69v01'(_Config) -> {skip, "NYI"}.
+%% ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+%% ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P69/ibm69v01.xml"]),
+%% ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+%% ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P69/ibm69v02.xml
+%% ID: ibm-valid-P69-ibm69v02.xml
+%% Type: valid
+%% Sections: 4.1
+'ibm-valid-P69-ibm69v02'(suite) -> [];
+'ibm-valid-P69-ibm69v02'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P69/ibm69v02.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 69
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P70/ibm70v01.xml
+%% ID: ibm-valid-P70-ibm70v01.xml
+%% Type: valid
+%% Sections: 4.2
+'ibm-valid-P70-ibm70v01'(suite) -> [];
+'ibm-valid-P70-ibm70v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P70/ibm70v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 70
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P78/ibm78v01.xml
+%% ID: ibm-valid-P78-ibm78v01.xml
+%% Type: valid
+%% Sections: 4.3.2
+'ibm-valid-P78-ibm78v01'(suite) -> [];
+'ibm-valid-P78-ibm78v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P78/ibm78v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 78
+
+testcases167(suite) -> [].
+%% ['ibm-valid-P78-ibm78v01'].
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P79/ibm79v01.xml
+%% ID: ibm-valid-P79-ibm79v01.xml
+%% Type: valid
+%% Sections: 4.3.2
+'ibm-valid-P79-ibm79v01'(suite) -> [];
+'ibm-valid-P79-ibm79v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P79/ibm79v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 79
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P82/ibm82v01.xml
+%% ID: ibm-valid-P82-ibm82v01.xml
+%% Type: valid
+%% Sections: 4.7
+'ibm-valid-P82-ibm82v01'(suite) -> [];
+'ibm-valid-P82-ibm82v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P82/ibm82v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 82
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P85/ibm85v01.xml
+%% ID: ibm-valid-P85-ibm85v01.xml
+%% Type: valid
+%% Sections: B.
+'ibm-valid-P85-ibm85v01'(suite) -> [];
+'ibm-valid-P85-ibm85v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P85/ibm85v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 85
+
+testcases170(suite) -> [].
+%% ['ibm-valid-P85-ibm85v01'].
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P86/ibm86v01.xml
+%% ID: ibm-valid-P86-ibm86v01.xml
+%% Type: valid
+%% Sections: B.
+'ibm-valid-P86-ibm86v01'(suite) -> [];
+'ibm-valid-P86-ibm86v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P86/ibm86v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 86
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P87/ibm87v01.xml
+%% ID: ibm-valid-P87-ibm87v01.xml
+%% Type: valid
+%% Sections: B.
+'ibm-valid-P87-ibm87v01'(suite) -> [];
+'ibm-valid-P87-ibm87v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P87/ibm87v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 87
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P88/ibm88v01.xml
+%% ID: ibm-valid-P88-ibm88v01.xml
+%% Type: valid
+%% Sections: B.
+'ibm-valid-P88-ibm88v01'(suite) -> [];
+'ibm-valid-P88-ibm88v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P88/ibm88v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 88
+
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% Uri: valid/P89/ibm89v01.xml
+%% ID: ibm-valid-P89-ibm89v01.xml
+%% Type: valid
+%% Sections: B.
+'ibm-valid-P89-ibm89v01'(suite) -> [];
+'ibm-valid-P89-ibm89v01'(Config) ->
+ ?line file:set_cwd(xmerl_test_lib:get_data_dir(Config)),
+ ?line Path = filename:join([xmerl_test_lib:get_data_dir(Config),"ibm","valid/P89/ibm89v01.xml"]),
+ ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ ?line check_result(R, "valid").
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - Production 89
+
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML Conformance Test Suite - valid tests
+
+
+%%----------------------------------------------------------------------
+%% Test Cases
+%% Profile: IBM XML 1.0 Tests
+
+
+%%----------------------------------------------------------------------
+%% Test Suite
+%% Profile: XML 1.0 (2nd edition) W3C Conformance Test Suite, 6 October 2000
+
+all() ->
+ [{group, testcases1}, {group, testcases3},
+ {group, testcases5}, {group, testcases6},
+ {group, testcases8}].
+
+groups() ->
+ [{testcases2, [],
+ ['not-wf-sa-001', 'not-wf-sa-002', 'not-wf-sa-003',
+ 'not-wf-sa-004', 'not-wf-sa-005', 'not-wf-sa-006',
+ 'not-wf-sa-007', 'not-wf-sa-008', 'not-wf-sa-009',
+ 'not-wf-sa-010', 'not-wf-sa-011', 'not-wf-sa-012',
+ 'not-wf-sa-013', 'not-wf-sa-014', 'not-wf-sa-015',
+ 'not-wf-sa-016', 'not-wf-sa-017', 'not-wf-sa-018',
+ 'not-wf-sa-019', 'not-wf-sa-020', 'not-wf-sa-021',
+ 'not-wf-sa-022', 'not-wf-sa-023', 'not-wf-sa-024',
+ 'not-wf-sa-025', 'not-wf-sa-026', 'not-wf-sa-027',
+ 'not-wf-sa-028', 'not-wf-sa-029', 'not-wf-sa-030',
+ 'not-wf-sa-031', 'not-wf-sa-032', 'not-wf-sa-033',
+ 'not-wf-sa-034', 'not-wf-sa-035', 'not-wf-sa-036',
+ 'not-wf-sa-037', 'not-wf-sa-038', 'not-wf-sa-039',
+ 'not-wf-sa-040', 'not-wf-sa-041', 'not-wf-sa-042',
+ 'not-wf-sa-043', 'not-wf-sa-044', 'not-wf-sa-045',
+ 'not-wf-sa-046', 'not-wf-sa-047', 'not-wf-sa-048',
+ 'not-wf-sa-049', 'not-wf-sa-050', 'not-wf-sa-051',
+ 'not-wf-sa-052', 'not-wf-sa-053', 'not-wf-sa-054',
+ 'not-wf-sa-055', 'not-wf-sa-056', 'not-wf-sa-057',
+ 'not-wf-sa-058', 'not-wf-sa-059', 'not-wf-sa-060',
+ 'not-wf-sa-061', 'not-wf-sa-062', 'not-wf-sa-063',
+ 'not-wf-sa-064', 'not-wf-sa-065', 'not-wf-sa-066',
+ 'not-wf-sa-067', 'not-wf-sa-068', 'not-wf-sa-069',
+ 'not-wf-sa-070', 'not-wf-sa-071', 'not-wf-sa-072',
+ 'not-wf-sa-073', 'not-wf-sa-074', 'not-wf-sa-075',
+ 'not-wf-sa-076', 'not-wf-sa-077', 'not-wf-sa-078',
+ 'not-wf-sa-079', 'not-wf-sa-080', 'not-wf-sa-081',
+ 'not-wf-sa-082', 'not-wf-sa-083', 'not-wf-sa-084',
+ 'not-wf-sa-085', 'not-wf-sa-086', 'not-wf-sa-087',
+ 'not-wf-sa-088', 'not-wf-sa-089', 'not-wf-sa-090',
+ 'not-wf-sa-091', 'not-wf-sa-092', 'not-wf-sa-093',
+ 'not-wf-sa-094', 'not-wf-sa-095', 'not-wf-sa-096',
+ 'not-wf-sa-097', 'not-wf-sa-098', 'not-wf-sa-099',
+ 'not-wf-sa-100', 'not-wf-sa-101', 'not-wf-sa-102',
+ 'not-wf-sa-103', 'not-wf-sa-104', 'not-wf-sa-105',
+ 'not-wf-sa-106', 'not-wf-sa-107', 'not-wf-sa-108',
+ 'not-wf-sa-109', 'not-wf-sa-110', 'not-wf-sa-111',
+ 'not-wf-sa-112', 'not-wf-sa-113', 'not-wf-sa-114',
+ 'not-wf-sa-115', 'not-wf-sa-116', 'not-wf-sa-117',
+ 'not-wf-sa-118', 'not-wf-sa-119', 'not-wf-sa-120',
+ 'not-wf-sa-121', 'not-wf-sa-122', 'not-wf-sa-123',
+ 'not-wf-sa-124', 'not-wf-sa-125', 'not-wf-sa-126',
+ 'not-wf-sa-127', 'not-wf-sa-128', 'not-wf-sa-129',
+ 'not-wf-sa-130', 'not-wf-sa-131', 'not-wf-sa-132',
+ 'not-wf-sa-133', 'not-wf-sa-134', 'not-wf-sa-135',
+ 'not-wf-sa-136', 'not-wf-sa-137', 'not-wf-sa-138',
+ 'not-wf-sa-139', 'not-wf-sa-140', 'not-wf-sa-141',
+ 'not-wf-sa-142', 'not-wf-sa-143', 'not-wf-sa-144',
+ 'not-wf-sa-145', 'not-wf-sa-146', 'not-wf-sa-147',
+ 'not-wf-sa-148', 'not-wf-sa-149', 'not-wf-sa-150',
+ 'not-wf-sa-151', 'not-wf-sa-152', 'not-wf-sa-153',
+ 'not-wf-sa-154', 'not-wf-sa-155', 'not-wf-sa-156',
+ 'not-wf-sa-157', 'not-wf-sa-158', 'not-wf-sa-159',
+ 'not-wf-sa-160', 'not-wf-sa-161', 'not-wf-sa-162',
+ 'not-wf-sa-163', 'not-wf-sa-164', 'not-wf-sa-165',
+ 'not-wf-sa-166', 'not-wf-sa-167', 'not-wf-sa-168',
+ 'not-wf-sa-169', 'not-wf-sa-170', 'not-wf-sa-171',
+ 'not-wf-sa-172', 'not-wf-sa-173', 'not-wf-sa-174',
+ 'not-wf-sa-175', 'not-wf-sa-176', 'not-wf-sa-177',
+ 'not-wf-sa-178', 'not-wf-sa-179', 'not-wf-sa-180',
+ 'not-wf-sa-181', 'not-wf-sa-182', 'not-wf-sa-183',
+ 'not-wf-sa-184', 'not-wf-sa-185', 'not-wf-sa-186',
+ 'not-wf-not-sa-001', 'not-wf-not-sa-002',
+ 'not-wf-not-sa-003', 'not-wf-not-sa-004',
+ 'not-wf-not-sa-005', 'not-wf-not-sa-006',
+ 'not-wf-not-sa-007', 'not-wf-not-sa-008',
+ 'not-wf-not-sa-009', 'not-wf-ext-sa-001',
+ 'not-wf-ext-sa-002', 'not-wf-ext-sa-003',
+ 'invalid--002', 'invalid--005', 'invalid--006',
+ 'invalid-not-sa-022', 'valid-sa-001', 'valid-sa-002',
+ 'valid-sa-003', 'valid-sa-004', 'valid-sa-005',
+ 'valid-sa-006', 'valid-sa-007', 'valid-sa-008',
+ 'valid-sa-009', 'valid-sa-010', 'valid-sa-011',
+ 'valid-sa-012', 'valid-sa-013', 'valid-sa-014',
+ 'valid-sa-015', 'valid-sa-016', 'valid-sa-017',
+ 'valid-sa-018', 'valid-sa-019', 'valid-sa-020',
+ 'valid-sa-021', 'valid-sa-022', 'valid-sa-023',
+ 'valid-sa-024', 'valid-sa-025', 'valid-sa-026',
+ 'valid-sa-027', 'valid-sa-028', 'valid-sa-029',
+ 'valid-sa-030', 'valid-sa-031', 'valid-sa-032',
+ 'valid-sa-033', 'valid-sa-034', 'valid-sa-035',
+ 'valid-sa-036', 'valid-sa-037', 'valid-sa-038',
+ 'valid-sa-039', 'valid-sa-040', 'valid-sa-041',
+ 'valid-sa-042', 'valid-sa-043', 'valid-sa-044',
+ 'valid-sa-045', 'valid-sa-046', 'valid-sa-047',
+ 'valid-sa-048', 'valid-sa-049', 'valid-sa-050',
+ 'valid-sa-051', 'valid-sa-052', 'valid-sa-053',
+ 'valid-sa-054', 'valid-sa-055', 'valid-sa-056',
+ 'valid-sa-057', 'valid-sa-058', 'valid-sa-059',
+ 'valid-sa-060', 'valid-sa-061', 'valid-sa-062',
+ 'valid-sa-063', 'valid-sa-064', 'valid-sa-065',
+ 'valid-sa-066', 'valid-sa-067', 'valid-sa-068',
+ 'valid-sa-069', 'valid-sa-070', 'valid-sa-071',
+ 'valid-sa-072', 'valid-sa-073', 'valid-sa-074',
+ 'valid-sa-075', 'valid-sa-076', 'valid-sa-077',
+ 'valid-sa-078', 'valid-sa-079', 'valid-sa-080',
+ 'valid-sa-081', 'valid-sa-082', 'valid-sa-083',
+ 'valid-sa-084', 'valid-sa-085', 'valid-sa-086',
+ 'valid-sa-087', 'valid-sa-088', 'valid-sa-089',
+ 'valid-sa-090', 'valid-sa-091', 'valid-sa-092',
+ 'valid-sa-093', 'valid-sa-094', 'valid-sa-095',
+ 'valid-sa-096', 'valid-sa-097', 'valid-sa-098',
+ 'valid-sa-099', 'valid-sa-100', 'valid-sa-101',
+ 'valid-sa-102', 'valid-sa-103', 'valid-sa-104',
+ 'valid-sa-105', 'valid-sa-106', 'valid-sa-107',
+ 'valid-sa-108', 'valid-sa-109', 'valid-sa-110',
+ 'valid-sa-111', 'valid-sa-112', 'valid-sa-113',
+ 'valid-sa-114', 'valid-sa-115', 'valid-sa-116',
+ 'valid-sa-117', 'valid-sa-118', 'valid-sa-119',
+ 'valid-not-sa-001', 'valid-not-sa-002',
+ 'valid-not-sa-003', 'valid-not-sa-004',
+ 'valid-not-sa-005', 'valid-not-sa-006',
+ 'valid-not-sa-007', 'valid-not-sa-008',
+ 'valid-not-sa-009', 'valid-not-sa-010',
+ 'valid-not-sa-011', 'valid-not-sa-012',
+ 'valid-not-sa-013', 'valid-not-sa-014',
+ 'valid-not-sa-015', 'valid-not-sa-016',
+ 'valid-not-sa-017', 'valid-not-sa-018',
+ 'valid-not-sa-019', 'valid-not-sa-020',
+ 'valid-not-sa-021', 'valid-not-sa-023',
+ 'valid-not-sa-024', 'valid-not-sa-025',
+ 'valid-not-sa-026', 'valid-not-sa-027',
+ 'valid-not-sa-028', 'valid-not-sa-029',
+ 'valid-not-sa-030', 'valid-not-sa-031',
+ 'valid-ext-sa-001', 'valid-ext-sa-002',
+ 'valid-ext-sa-003', 'valid-ext-sa-004',
+ 'valid-ext-sa-005', 'valid-ext-sa-006',
+ 'valid-ext-sa-007', 'valid-ext-sa-008',
+ 'valid-ext-sa-009', 'valid-ext-sa-011',
+ 'valid-ext-sa-012', 'valid-ext-sa-013',
+ 'valid-ext-sa-014']},
+ {testcases1, [], [{group, testcases2}]},
+ {testcases4, [],
+ ['pr-xml-euc-jp', 'pr-xml-iso-2022-jp', 'pr-xml-little',
+ 'pr-xml-shift_jis', 'pr-xml-utf-16', 'pr-xml-utf-8',
+ 'weekly-euc-jp', 'weekly-iso-2022-jp', 'weekly-little',
+ 'weekly-shift_jis', 'weekly-utf-16', 'weekly-utf-8']},
+ {testcases3, [], [{group, testcases4}]},
+ {testcases5, [],
+ [pe01, dtd00, dtd01, element, ext01, ext02, 'not-sa01',
+ 'not-sa02', 'not-sa03', 'not-sa04', notation01,
+ optional, required00, sa01, sa02, sa03, sa04, sa05,
+ 'v-sgml01', 'v-lang01', 'v-lang02', 'v-lang03',
+ 'v-lang04', 'v-lang05', 'v-lang06', 'v-pe00', 'v-pe03',
+ 'v-pe02', 'inv-dtd01', 'inv-dtd02', 'inv-dtd03', el01,
+ el02, el03, el04, el05, el06, id01, id02, id03, id04,
+ id05, id06, id07, id08, id09, 'inv-not-sa01',
+ 'inv-not-sa02', 'inv-not-sa04', 'inv-not-sa05',
+ 'inv-not-sa06', 'inv-not-sa07', 'inv-not-sa08',
+ 'inv-not-sa09', 'inv-not-sa10', 'inv-not-sa11',
+ 'inv-not-sa12', 'inv-not-sa13', 'inv-not-sa14',
+ optional01, optional02, optional03, optional04,
+ optional05, optional06, optional07, optional08,
+ optional09, optional10, optional11, optional12,
+ optional13, optional14, optional20, optional21,
+ optional22, optional23, optional24, optional25,
+ 'inv-required00', 'inv-required01', 'inv-required02',
+ root, attr01, attr02, attr03, attr04, attr05, attr06,
+ attr07, attr08, attr09, attr10, attr11, attr12, attr13,
+ attr14, attr15, attr16, utf16b, utf16l, empty,
+ 'not-wf-sa03', attlist01, attlist02, attlist03,
+ attlist04, attlist05, attlist06, attlist07, attlist08,
+ attlist09, attlist10, attlist11, cond01, cond02,
+ content01, content02, content03, decl01, 'nwf-dtd00',
+ 'nwf-dtd01', dtd02, dtd03, dtd04, dtd05, dtd07,
+ element00, element01, element02, element03, element04,
+ encoding01, encoding02, encoding03, encoding04,
+ encoding05, encoding06, encoding07, pi, pubid01,
+ pubid02, pubid03, pubid04, pubid05, sgml01, sgml02,
+ sgml03, sgml04, sgml05, sgml06, sgml07, sgml08, sgml09,
+ sgml10, sgml11, sgml12, sgml13, uri01]},
+ {testcases7, [],
+ ['o-p01pass2', 'o-p06pass1', 'o-p07pass1', 'o-p08pass1',
+ 'o-p09pass1', 'o-p12pass1', 'o-p22pass4', 'o-p22pass5',
+ 'o-p22pass6', 'o-p28pass1', 'o-p28pass3', 'o-p28pass4',
+ 'o-p28pass5', 'o-p29pass1', 'o-p30pass1', 'o-p30pass2',
+ 'o-p31pass1', 'o-p31pass2', 'o-p43pass1', 'o-p45pass1',
+ 'o-p46pass1', 'o-p47pass1', 'o-p48pass1', 'o-p49pass1',
+ 'o-p50pass1', 'o-p51pass1', 'o-p52pass1', 'o-p53pass1',
+ 'o-p54pass1', 'o-p55pass1', 'o-p56pass1', 'o-p57pass1',
+ 'o-p58pass1', 'o-p59pass1', 'o-p60pass1', 'o-p61pass1',
+ 'o-p62pass1', 'o-p63pass1', 'o-p64pass1', 'o-p68pass1',
+ 'o-p69pass1', 'o-p70pass1', 'o-p71pass1', 'o-p72pass1',
+ 'o-p73pass1', 'o-p76pass1', 'o-p01pass1', 'o-p01pass3',
+ 'o-p03pass1', 'o-p04pass1', 'o-p05pass1', 'o-p06fail1',
+ 'o-p08fail1', 'o-p08fail2', 'o-p10pass1', 'o-p14pass1',
+ 'o-p15pass1', 'o-p16pass1', 'o-p16pass2', 'o-p16pass3',
+ 'o-p18pass1', 'o-p22pass1', 'o-p22pass2', 'o-p22pass3',
+ 'o-p23pass1', 'o-p23pass2', 'o-p23pass3', 'o-p23pass4',
+ 'o-p24pass1', 'o-p24pass2', 'o-p24pass3', 'o-p24pass4',
+ 'o-p25pass1', 'o-p25pass2', 'o-p26pass1', 'o-p27pass1',
+ 'o-p27pass2', 'o-p27pass3', 'o-p27pass4', 'o-p32pass1',
+ 'o-p32pass2', 'o-p39pass1', 'o-p39pass2', 'o-p40pass1',
+ 'o-p40pass2', 'o-p40pass3', 'o-p40pass4', 'o-p41pass1',
+ 'o-p41pass2', 'o-p42pass1', 'o-p42pass2', 'o-p44pass1',
+ 'o-p44pass2', 'o-p44pass3', 'o-p44pass4', 'o-p44pass5',
+ 'o-p66pass1', 'o-p74pass1', 'o-p75pass1', 'o-e2',
+ 'o-p01fail1', 'o-p01fail2', 'o-p01fail3', 'o-p01fail4',
+ 'o-p02fail1', 'o-p02fail10', 'o-p02fail11',
+ 'o-p02fail12', 'o-p02fail13', 'o-p02fail14',
+ 'o-p02fail15', 'o-p02fail16', 'o-p02fail17',
+ 'o-p02fail18', 'o-p02fail19', 'o-p02fail2',
+ 'o-p02fail20', 'o-p02fail21', 'o-p02fail22',
+ 'o-p02fail23', 'o-p02fail24', 'o-p02fail25',
+ 'o-p02fail26', 'o-p02fail27', 'o-p02fail28',
+ 'o-p02fail29', 'o-p02fail3', 'o-p02fail30',
+ 'o-p02fail31', 'o-p02fail4', 'o-p02fail5', 'o-p02fail6',
+ 'o-p02fail7', 'o-p02fail8', 'o-p02fail9', 'o-p03fail1',
+ 'o-p03fail10', 'o-p03fail11', 'o-p03fail12',
+ 'o-p03fail13', 'o-p03fail14', 'o-p03fail15',
+ 'o-p03fail16', 'o-p03fail17', 'o-p03fail18',
+ 'o-p03fail19', 'o-p03fail2', 'o-p03fail20',
+ 'o-p03fail21', 'o-p03fail22', 'o-p03fail23',
+ 'o-p03fail24', 'o-p03fail25', 'o-p03fail26',
+ 'o-p03fail27', 'o-p03fail28', 'o-p03fail29',
+ 'o-p03fail3', 'o-p03fail4', 'o-p03fail5', 'o-p03fail7',
+ 'o-p03fail8', 'o-p03fail9', 'o-p04fail1', 'o-p04fail2',
+ 'o-p04fail3', 'o-p05fail1', 'o-p05fail2', 'o-p05fail3',
+ 'o-p05fail4', 'o-p05fail5', 'o-p09fail1', 'o-p09fail2',
+ 'o-p09fail3', 'o-p09fail4', 'o-p09fail5', 'o-p10fail1',
+ 'o-p10fail2', 'o-p10fail3', 'o-p11fail1', 'o-p11fail2',
+ 'o-p12fail1', 'o-p12fail2', 'o-p12fail3', 'o-p12fail4',
+ 'o-p12fail5', 'o-p12fail6', 'o-p12fail7', 'o-p14fail1',
+ 'o-p14fail2', 'o-p14fail3', 'o-p15fail1', 'o-p15fail2',
+ 'o-p15fail3', 'o-p16fail1', 'o-p16fail2', 'o-p16fail3',
+ 'o-p18fail1', 'o-p18fail2', 'o-p18fail3', 'o-p22fail1',
+ 'o-p22fail2', 'o-p23fail1', 'o-p23fail2', 'o-p23fail3',
+ 'o-p23fail4', 'o-p23fail5', 'o-p24fail1', 'o-p24fail2',
+ 'o-p25fail1', 'o-p26fail1', 'o-p26fail2', 'o-p27fail1',
+ 'o-p28fail1', 'o-p29fail1', 'o-p30fail1', 'o-p31fail1',
+ 'o-p32fail1', 'o-p32fail2', 'o-p32fail3', 'o-p32fail4',
+ 'o-p32fail5', 'o-p39fail1', 'o-p39fail2', 'o-p39fail3',
+ 'o-p39fail4', 'o-p39fail5', 'o-p40fail1', 'o-p40fail2',
+ 'o-p40fail3', 'o-p40fail4', 'o-p41fail1', 'o-p41fail2',
+ 'o-p41fail3', 'o-p42fail1', 'o-p42fail2', 'o-p42fail3',
+ 'o-p43fail1', 'o-p43fail2', 'o-p43fail3', 'o-p44fail1',
+ 'o-p44fail2', 'o-p44fail3', 'o-p44fail4', 'o-p44fail5',
+ 'o-p45fail1', 'o-p45fail2', 'o-p45fail3', 'o-p45fail4',
+ 'o-p46fail1', 'o-p46fail2', 'o-p46fail3', 'o-p46fail4',
+ 'o-p46fail5', 'o-p46fail6', 'o-p47fail1', 'o-p47fail2',
+ 'o-p47fail3', 'o-p47fail4', 'o-p48fail1', 'o-p48fail2',
+ 'o-p49fail1', 'o-p50fail1', 'o-p51fail1', 'o-p51fail2',
+ 'o-p51fail3', 'o-p51fail4', 'o-p51fail5', 'o-p51fail6',
+ 'o-p51fail7', 'o-p52fail1', 'o-p52fail2', 'o-p53fail1',
+ 'o-p53fail2', 'o-p53fail3', 'o-p53fail4', 'o-p53fail5',
+ 'o-p54fail1', 'o-p55fail1', 'o-p56fail1', 'o-p56fail2',
+ 'o-p56fail3', 'o-p56fail4', 'o-p56fail5', 'o-p57fail1',
+ 'o-p58fail1', 'o-p58fail2', 'o-p58fail3', 'o-p58fail4',
+ 'o-p58fail5', 'o-p58fail6', 'o-p58fail7', 'o-p58fail8',
+ 'o-p59fail1', 'o-p59fail2', 'o-p59fail3', 'o-p60fail1',
+ 'o-p60fail2', 'o-p60fail3', 'o-p60fail4', 'o-p60fail5',
+ 'o-p61fail1', 'o-p62fail1', 'o-p62fail2', 'o-p63fail1',
+ 'o-p63fail2', 'o-p64fail1', 'o-p64fail2', 'o-p66fail1',
+ 'o-p66fail2', 'o-p66fail3', 'o-p66fail4', 'o-p66fail5',
+ 'o-p66fail6', 'o-p68fail1', 'o-p68fail2', 'o-p68fail3',
+ 'o-p69fail1', 'o-p69fail2', 'o-p69fail3', 'o-p70fail1',
+ 'o-p71fail1', 'o-p71fail2', 'o-p71fail3', 'o-p71fail4',
+ 'o-p72fail1', 'o-p72fail2', 'o-p72fail3', 'o-p72fail4',
+ 'o-p73fail1', 'o-p73fail2', 'o-p73fail3', 'o-p73fail4',
+ 'o-p73fail5', 'o-p74fail1', 'o-p74fail2', 'o-p74fail3',
+ 'o-p75fail1', 'o-p75fail2', 'o-p75fail3', 'o-p75fail4',
+ 'o-p75fail5', 'o-p75fail6', 'o-p76fail1', 'o-p76fail2',
+ 'o-p76fail3', 'o-p76fail4', 'o-p11pass1']},
+ {testcases6, [], [{group, testcases7}]},
+ {testcases10, [], ['ibm-invalid-P28-ibm28i01']},
+ {testcases11, [],
+ ['ibm-invalid-P32-ibm32i01', 'ibm-invalid-P32-ibm32i03',
+ 'ibm-invalid-P32-ibm32i04']},
+ {testcases12, [],
+ ['ibm-invalid-P39-ibm39i01', 'ibm-invalid-P39-ibm39i02',
+ 'ibm-invalid-P39-ibm39i03',
+ 'ibm-invalid-P39-ibm39i04']},
+ {testcases13, [],
+ ['ibm-invalid-P41-ibm41i01',
+ 'ibm-invalid-P41-ibm41i02']},
+ {testcases14, [], ['ibm-invalid-P45-ibm45i01']},
+ {testcases15, [], ['ibm-invalid-P49-ibm49i01']},
+ {testcases16, [], ['ibm-invalid-P50-ibm50i01']},
+ {testcases17, [],
+ ['ibm-invalid-P51-ibm51i01',
+ 'ibm-invalid-P51-ibm51i03']},
+ {testcases18, [],
+ ['ibm-invalid-P56-ibm56i01', 'ibm-invalid-P56-ibm56i02',
+ 'ibm-invalid-P56-ibm56i03', 'ibm-invalid-P56-ibm56i05',
+ 'ibm-invalid-P56-ibm56i06', 'ibm-invalid-P56-ibm56i07',
+ 'ibm-invalid-P56-ibm56i08', 'ibm-invalid-P56-ibm56i09',
+ 'ibm-invalid-P56-ibm56i10', 'ibm-invalid-P56-ibm56i11',
+ 'ibm-invalid-P56-ibm56i12', 'ibm-invalid-P56-ibm56i13',
+ 'ibm-invalid-P56-ibm56i14', 'ibm-invalid-P56-ibm56i15',
+ 'ibm-invalid-P56-ibm56i16', 'ibm-invalid-P56-ibm56i17',
+ 'ibm-invalid-P56-ibm56i18']},
+ {testcases19, [],
+ ['ibm-invalid-P58-ibm58i01',
+ 'ibm-invalid-P58-ibm58i02']},
+ {testcases20, [], ['ibm-invalid-P59-ibm59i01']},
+ {testcases21, [],
+ ['ibm-invalid-P60-ibm60i01', 'ibm-invalid-P60-ibm60i02',
+ 'ibm-invalid-P60-ibm60i03',
+ 'ibm-invalid-P60-ibm60i04']},
+ {testcases22, [],
+ ['ibm-invalid-P68-ibm68i01', 'ibm-invalid-P68-ibm68i02',
+ 'ibm-invalid-P68-ibm68i03',
+ 'ibm-invalid-P68-ibm68i04']},
+ {testcases23, [],
+ ['ibm-invalid-P69-ibm69i01', 'ibm-invalid-P69-ibm69i02',
+ 'ibm-invalid-P69-ibm69i03',
+ 'ibm-invalid-P69-ibm69i04']},
+ {testcases24, [], ['ibm-invalid-P76-ibm76i01']},
+ {testcases9, [],
+ [{group, testcases10}, {group, testcases11},
+ {group, testcases12}, {group, testcases13},
+ {group, testcases14}, {group, testcases15},
+ {group, testcases16}, {group, testcases17},
+ {group, testcases18}, {group, testcases19},
+ {group, testcases20}, {group, testcases21},
+ {group, testcases22}, {group, testcases23},
+ {group, testcases24}]},
+ {testcases26, [],
+ ['ibm-not-wf-P01-ibm01n01', 'ibm-not-wf-P01-ibm01n02',
+ 'ibm-not-wf-P01-ibm01n03']},
+ {testcases27, [],
+ ['ibm-not-wf-P02-ibm02n01', 'ibm-not-wf-P02-ibm02n02',
+ 'ibm-not-wf-P02-ibm02n03', 'ibm-not-wf-P02-ibm02n04',
+ 'ibm-not-wf-P02-ibm02n05', 'ibm-not-wf-P02-ibm02n06',
+ 'ibm-not-wf-P02-ibm02n07', 'ibm-not-wf-P02-ibm02n08',
+ 'ibm-not-wf-P02-ibm02n09', 'ibm-not-wf-P02-ibm02n10',
+ 'ibm-not-wf-P02-ibm02n11', 'ibm-not-wf-P02-ibm02n12',
+ 'ibm-not-wf-P02-ibm02n13', 'ibm-not-wf-P02-ibm02n14',
+ 'ibm-not-wf-P02-ibm02n15', 'ibm-not-wf-P02-ibm02n16',
+ 'ibm-not-wf-P02-ibm02n17', 'ibm-not-wf-P02-ibm02n18',
+ 'ibm-not-wf-P02-ibm02n19', 'ibm-not-wf-P02-ibm02n20',
+ 'ibm-not-wf-P02-ibm02n21', 'ibm-not-wf-P02-ibm02n22',
+ 'ibm-not-wf-P02-ibm02n23', 'ibm-not-wf-P02-ibm02n24',
+ 'ibm-not-wf-P02-ibm02n25', 'ibm-not-wf-P02-ibm02n26',
+ 'ibm-not-wf-P02-ibm02n27', 'ibm-not-wf-P02-ibm02n28',
+ 'ibm-not-wf-P02-ibm02n29', 'ibm-not-wf-P02-ibm02n30',
+ 'ibm-not-wf-P02-ibm02n31', 'ibm-not-wf-P02-ibm02n32',
+ 'ibm-not-wf-P02-ibm02n33']},
+ {testcases28, [], ['ibm-not-wf-P03-ibm03n01']},
+ {testcases29, [],
+ ['ibm-not-wf-P04-ibm04n01', 'ibm-not-wf-P04-ibm04n02',
+ 'ibm-not-wf-P04-ibm04n03', 'ibm-not-wf-P04-ibm04n04',
+ 'ibm-not-wf-P04-ibm04n05', 'ibm-not-wf-P04-ibm04n06',
+ 'ibm-not-wf-P04-ibm04n07', 'ibm-not-wf-P04-ibm04n08',
+ 'ibm-not-wf-P04-ibm04n09', 'ibm-not-wf-P04-ibm04n10',
+ 'ibm-not-wf-P04-ibm04n11', 'ibm-not-wf-P04-ibm04n12',
+ 'ibm-not-wf-P04-ibm04n13', 'ibm-not-wf-P04-ibm04n14',
+ 'ibm-not-wf-P04-ibm04n15', 'ibm-not-wf-P04-ibm04n16',
+ 'ibm-not-wf-P04-ibm04n17', 'ibm-not-wf-P04-ibm04n18']},
+ {testcases30, [],
+ ['ibm-not-wf-P05-ibm05n01', 'ibm-not-wf-P05-ibm05n02',
+ 'ibm-not-wf-P05-ibm05n03']},
+ {testcases31, [],
+ ['ibm-not-wf-P09-ibm09n01', 'ibm-not-wf-P09-ibm09n02',
+ 'ibm-not-wf-P09-ibm09n03', 'ibm-not-wf-P09-ibm09n04']},
+ {testcases32, [],
+ ['ibm-not-wf-P10-ibm10n01', 'ibm-not-wf-P10-ibm10n02',
+ 'ibm-not-wf-P10-ibm10n03', 'ibm-not-wf-P10-ibm10n04',
+ 'ibm-not-wf-P10-ibm10n05', 'ibm-not-wf-P10-ibm10n06',
+ 'ibm-not-wf-P10-ibm10n07', 'ibm-not-wf-P10-ibm10n08']},
+ {testcases33, [],
+ ['ibm-not-wf-P11-ibm11n01', 'ibm-not-wf-P11-ibm11n02',
+ 'ibm-not-wf-P11-ibm11n03', 'ibm-not-wf-P11-ibm11n04']},
+ {testcases34, [],
+ ['ibm-not-wf-P12-ibm12n01', 'ibm-not-wf-P12-ibm12n02',
+ 'ibm-not-wf-P12-ibm12n03']},
+ {testcases35, [],
+ ['ibm-not-wf-P13-ibm13n01', 'ibm-not-wf-P13-ibm13n02',
+ 'ibm-not-wf-P13-ibm13n03']},
+ {testcases36, [],
+ ['ibm-not-wf-P14-ibm14n01', 'ibm-not-wf-P14-ibm14n02',
+ 'ibm-not-wf-P14-ibm14n03']},
+ {testcases37, [],
+ ['ibm-not-wf-P15-ibm15n01', 'ibm-not-wf-P15-ibm15n02',
+ 'ibm-not-wf-P15-ibm15n03', 'ibm-not-wf-P15-ibm15n04']},
+ {testcases38, [],
+ ['ibm-not-wf-P16-ibm16n01', 'ibm-not-wf-P16-ibm16n02',
+ 'ibm-not-wf-P16-ibm16n03', 'ibm-not-wf-P16-ibm16n04']},
+ {testcases39, [],
+ ['ibm-not-wf-P17-ibm17n01', 'ibm-not-wf-P17-ibm17n02',
+ 'ibm-not-wf-P17-ibm17n03', 'ibm-not-wf-P17-ibm17n04']},
+ {testcases40, [],
+ ['ibm-not-wf-P18-ibm18n01', 'ibm-not-wf-P18-ibm18n02']},
+ {testcases41, [],
+ ['ibm-not-wf-P19-ibm19n01', 'ibm-not-wf-P19-ibm19n02',
+ 'ibm-not-wf-P19-ibm19n03']},
+ {testcases42, [], ['ibm-not-wf-P20-ibm20n01']},
+ {testcases43, [],
+ ['ibm-not-wf-P21-ibm21n01', 'ibm-not-wf-P21-ibm21n02',
+ 'ibm-not-wf-P21-ibm21n03']},
+ {testcases44, [],
+ ['ibm-not-wf-P22-ibm22n01', 'ibm-not-wf-P22-ibm22n02',
+ 'ibm-not-wf-P22-ibm22n03']},
+ {testcases45, [],
+ ['ibm-not-wf-P23-ibm23n01', 'ibm-not-wf-P23-ibm23n02',
+ 'ibm-not-wf-P23-ibm23n03', 'ibm-not-wf-P23-ibm23n04',
+ 'ibm-not-wf-P23-ibm23n05', 'ibm-not-wf-P23-ibm23n06']},
+ {testcases46, [],
+ ['ibm-not-wf-P24-ibm24n01', 'ibm-not-wf-P24-ibm24n02',
+ 'ibm-not-wf-P24-ibm24n03', 'ibm-not-wf-P24-ibm24n04',
+ 'ibm-not-wf-P24-ibm24n05', 'ibm-not-wf-P24-ibm24n06',
+ 'ibm-not-wf-P24-ibm24n07', 'ibm-not-wf-P24-ibm24n08',
+ 'ibm-not-wf-P24-ibm24n09']},
+ {testcases47, [],
+ ['ibm-not-wf-P25-ibm25n01', 'ibm-not-wf-P25-ibm25n02']},
+ {testcases48, [], ['ibm-not-wf-P26-ibm26n01']},
+ {testcases49, [], ['ibm-not-wf-P27-ibm27n01']},
+ {testcases50, [],
+ ['ibm-not-wf-P28-ibm28n01', 'ibm-not-wf-P28-ibm28n02',
+ 'ibm-not-wf-P28-ibm28n03', 'ibm-not-wf-P28-ibm28n04',
+ 'ibm-not-wf-P28-ibm28n05', 'ibm-not-wf-P28-ibm28n06',
+ 'ibm-not-wf-P28-ibm28n07', 'ibm-not-wf-P28-ibm28n08']},
+ {testcases51, [], ['ibm-not-wf-p28a-ibm28an01']},
+ {testcases52, [],
+ ['ibm-not-wf-P29-ibm29n01', 'ibm-not-wf-P29-ibm29n02',
+ 'ibm-not-wf-P29-ibm29n03', 'ibm-not-wf-P29-ibm29n04',
+ 'ibm-not-wf-P29-ibm29n05', 'ibm-not-wf-P29-ibm29n06',
+ 'ibm-not-wf-P29-ibm29n07']},
+ {testcases53, [], ['ibm-not-wf-P30-ibm30n01']},
+ {testcases54, [], ['ibm-not-wf-P31-ibm31n01']},
+ {testcases55, [],
+ ['ibm-not-wf-P32-ibm32n01', 'ibm-not-wf-P32-ibm32n02',
+ 'ibm-not-wf-P32-ibm32n03', 'ibm-not-wf-P32-ibm32n04',
+ 'ibm-not-wf-P32-ibm32n05', 'ibm-not-wf-P32-ibm32n06',
+ 'ibm-not-wf-P32-ibm32n07', 'ibm-not-wf-P32-ibm32n08',
+ 'ibm-not-wf-P32-ibm32n09']},
+ {testcases56, [],
+ ['ibm-not-wf-P39-ibm39n01', 'ibm-not-wf-P39-ibm39n02',
+ 'ibm-not-wf-P39-ibm39n03', 'ibm-not-wf-P39-ibm39n04',
+ 'ibm-not-wf-P39-ibm39n05', 'ibm-not-wf-P39-ibm39n06']},
+ {testcases57, [],
+ ['ibm-not-wf-P40-ibm40n01', 'ibm-not-wf-P40-ibm40n02',
+ 'ibm-not-wf-P40-ibm40n03', 'ibm-not-wf-P40-ibm40n04',
+ 'ibm-not-wf-P40-ibm40n05']},
+ {testcases58, [],
+ ['ibm-not-wf-P41-ibm41n01', 'ibm-not-wf-P41-ibm41n02',
+ 'ibm-not-wf-P41-ibm41n03', 'ibm-not-wf-P41-ibm41n04',
+ 'ibm-not-wf-P41-ibm41n05', 'ibm-not-wf-P41-ibm41n06',
+ 'ibm-not-wf-P41-ibm41n07', 'ibm-not-wf-P41-ibm41n08',
+ 'ibm-not-wf-P41-ibm41n09', 'ibm-not-wf-P41-ibm41n10',
+ 'ibm-not-wf-P41-ibm41n11', 'ibm-not-wf-P41-ibm41n12',
+ 'ibm-not-wf-P41-ibm41n13', 'ibm-not-wf-P41-ibm41n14']},
+ {testcases59, [],
+ ['ibm-not-wf-P42-ibm42n01', 'ibm-not-wf-P42-ibm42n02',
+ 'ibm-not-wf-P42-ibm42n03', 'ibm-not-wf-P42-ibm42n04',
+ 'ibm-not-wf-P42-ibm42n05']},
+ {testcases60, [],
+ ['ibm-not-wf-P43-ibm43n01', 'ibm-not-wf-P43-ibm43n02',
+ 'ibm-not-wf-P43-ibm43n04', 'ibm-not-wf-P43-ibm43n05']},
+ {testcases61, [],
+ ['ibm-not-wf-P44-ibm44n01', 'ibm-not-wf-P44-ibm44n02',
+ 'ibm-not-wf-P44-ibm44n03', 'ibm-not-wf-P44-ibm44n04']},
+ {testcases62, [],
+ ['ibm-not-wf-P45-ibm45n01', 'ibm-not-wf-P45-ibm45n02',
+ 'ibm-not-wf-P45-ibm45n03', 'ibm-not-wf-P45-ibm45n04',
+ 'ibm-not-wf-P45-ibm45n05', 'ibm-not-wf-P45-ibm45n06',
+ 'ibm-not-wf-P45-ibm45n07', 'ibm-not-wf-P45-ibm45n08',
+ 'ibm-not-wf-P45-ibm45n09']},
+ {testcases63, [],
+ ['ibm-not-wf-P46-ibm46n01', 'ibm-not-wf-P46-ibm46n02',
+ 'ibm-not-wf-P46-ibm46n03', 'ibm-not-wf-P46-ibm46n04',
+ 'ibm-not-wf-P46-ibm46n05']},
+ {testcases64, [],
+ ['ibm-not-wf-P47-ibm47n01', 'ibm-not-wf-P47-ibm47n02',
+ 'ibm-not-wf-P47-ibm47n03', 'ibm-not-wf-P47-ibm47n04',
+ 'ibm-not-wf-P47-ibm47n05', 'ibm-not-wf-P47-ibm47n06']},
+ {testcases65, [],
+ ['ibm-not-wf-P48-ibm48n01', 'ibm-not-wf-P48-ibm48n02',
+ 'ibm-not-wf-P48-ibm48n03', 'ibm-not-wf-P48-ibm48n04',
+ 'ibm-not-wf-P48-ibm48n05', 'ibm-not-wf-P48-ibm48n06',
+ 'ibm-not-wf-P48-ibm48n07']},
+ {testcases66, [],
+ ['ibm-not-wf-P49-ibm49n01', 'ibm-not-wf-P49-ibm49n02',
+ 'ibm-not-wf-P49-ibm49n03', 'ibm-not-wf-P49-ibm49n04',
+ 'ibm-not-wf-P49-ibm49n05', 'ibm-not-wf-P49-ibm49n06']},
+ {testcases67, [],
+ ['ibm-not-wf-P50-ibm50n01','ibm-not-wf-P50-ibm50n02',
+ 'ibm-not-wf-P50-ibm50n03','ibm-not-wf-P50-ibm50n04',
+ 'ibm-not-wf-P50-ibm50n05','ibm-not-wf-P50-ibm50n06',
+ 'ibm-not-wf-P50-ibm50n07']},
+ {testcases68, [],
+ ['ibm-not-wf-P51-ibm51n01','ibm-not-wf-P51-ibm51n02',
+ 'ibm-not-wf-P51-ibm51n03','ibm-not-wf-P51-ibm51n04',
+ 'ibm-not-wf-P51-ibm51n05','ibm-not-wf-P51-ibm51n06',
+ 'ibm-not-wf-P51-ibm51n07']},
+ {testcases69, [],
+ ['ibm-not-wf-P52-ibm52n01', 'ibm-not-wf-P52-ibm52n02',
+ 'ibm-not-wf-P52-ibm52n03', 'ibm-not-wf-P52-ibm52n04',
+ 'ibm-not-wf-P52-ibm52n05', 'ibm-not-wf-P52-ibm52n06']},
+ {testcases70, [],
+ ['ibm-not-wf-P53-ibm53n01', 'ibm-not-wf-P53-ibm53n02',
+ 'ibm-not-wf-P53-ibm53n03', 'ibm-not-wf-P53-ibm53n04',
+ 'ibm-not-wf-P53-ibm53n05', 'ibm-not-wf-P53-ibm53n06',
+ 'ibm-not-wf-P53-ibm53n07', 'ibm-not-wf-P53-ibm53n08']},
+ {testcases71, [],
+ ['ibm-not-wf-P54-ibm54n01', 'ibm-not-wf-P54-ibm54n02']},
+ {testcases72, [],
+ ['ibm-not-wf-P55-ibm55n01', 'ibm-not-wf-P55-ibm55n02',
+ 'ibm-not-wf-P55-ibm55n03']},
+ {testcases73, [],
+ ['ibm-not-wf-P56-ibm56n01', 'ibm-not-wf-P56-ibm56n02',
+ 'ibm-not-wf-P56-ibm56n03', 'ibm-not-wf-P56-ibm56n04',
+ 'ibm-not-wf-P56-ibm56n05', 'ibm-not-wf-P56-ibm56n06',
+ 'ibm-not-wf-P56-ibm56n07']},
+ {testcases74, [], ['ibm-not-wf-P57-ibm57n01']},
+ {testcases75, [],
+ ['ibm-not-wf-P58-ibm58n01', 'ibm-not-wf-P58-ibm58n02',
+ 'ibm-not-wf-P58-ibm58n03', 'ibm-not-wf-P58-ibm58n04',
+ 'ibm-not-wf-P58-ibm58n05', 'ibm-not-wf-P58-ibm58n06',
+ 'ibm-not-wf-P58-ibm58n07', 'ibm-not-wf-P58-ibm58n08']},
+ {testcases76, [],
+ ['ibm-not-wf-P59-ibm59n01', 'ibm-not-wf-P59-ibm59n02',
+ 'ibm-not-wf-P59-ibm59n03', 'ibm-not-wf-P59-ibm59n04',
+ 'ibm-not-wf-P59-ibm59n05', 'ibm-not-wf-P59-ibm59n06']},
+ {testcases77, [],
+ ['ibm-not-wf-P60-ibm60n01', 'ibm-not-wf-P60-ibm60n02',
+ 'ibm-not-wf-P60-ibm60n03', 'ibm-not-wf-P60-ibm60n04',
+ 'ibm-not-wf-P60-ibm60n05', 'ibm-not-wf-P60-ibm60n06',
+ 'ibm-not-wf-P60-ibm60n07', 'ibm-not-wf-P60-ibm60n08']},
+ {testcases78, [], ['ibm-not-wf-P61-ibm61n01']},
+ {testcases79, [],
+ ['ibm-not-wf-P62-ibm62n01', 'ibm-not-wf-P62-ibm62n02',
+ 'ibm-not-wf-P62-ibm62n03', 'ibm-not-wf-P62-ibm62n04',
+ 'ibm-not-wf-P62-ibm62n05', 'ibm-not-wf-P62-ibm62n06',
+ 'ibm-not-wf-P62-ibm62n07', 'ibm-not-wf-P62-ibm62n08']},
+ {testcases80, [],
+ ['ibm-not-wf-P63-ibm63n01', 'ibm-not-wf-P63-ibm63n02',
+ 'ibm-not-wf-P63-ibm63n03', 'ibm-not-wf-P63-ibm63n04',
+ 'ibm-not-wf-P63-ibm63n05', 'ibm-not-wf-P63-ibm63n06',
+ 'ibm-not-wf-P63-ibm63n07']},
+ {testcases81, [],
+ ['ibm-not-wf-P64-ibm64n01', 'ibm-not-wf-P64-ibm64n02',
+ 'ibm-not-wf-P64-ibm64n03']},
+ {testcases82, [],
+ ['ibm-not-wf-P65-ibm65n01', 'ibm-not-wf-P65-ibm65n02']},
+ {testcases83, [],
+ ['ibm-not-wf-P66-ibm66n01', 'ibm-not-wf-P66-ibm66n02',
+ 'ibm-not-wf-P66-ibm66n03', 'ibm-not-wf-P66-ibm66n04',
+ 'ibm-not-wf-P66-ibm66n05', 'ibm-not-wf-P66-ibm66n06',
+ 'ibm-not-wf-P66-ibm66n07', 'ibm-not-wf-P66-ibm66n08',
+ 'ibm-not-wf-P66-ibm66n09', 'ibm-not-wf-P66-ibm66n10',
+ 'ibm-not-wf-P66-ibm66n11', 'ibm-not-wf-P66-ibm66n12',
+ 'ibm-not-wf-P66-ibm66n13', 'ibm-not-wf-P66-ibm66n14',
+ 'ibm-not-wf-P66-ibm66n15']},
+ {testcases84, [],
+ ['ibm-not-wf-P68-ibm68n01', 'ibm-not-wf-P68-ibm68n02',
+ 'ibm-not-wf-P68-ibm68n03', 'ibm-not-wf-P68-ibm68n04',
+ 'ibm-not-wf-P68-ibm68n05', 'ibm-not-wf-P68-ibm68n06',
+ 'ibm-not-wf-P68-ibm68n07', 'ibm-not-wf-P68-ibm68n08',
+ 'ibm-not-wf-P68-ibm68n09', 'ibm-not-wf-P68-ibm68n10']},
+ {testcases85, [],
+ ['ibm-not-wf-P69-ibm69n01', 'ibm-not-wf-P69-ibm69n02',
+ 'ibm-not-wf-P69-ibm69n03', 'ibm-not-wf-P69-ibm69n04',
+ 'ibm-not-wf-P69-ibm69n05', 'ibm-not-wf-P69-ibm69n06',
+ 'ibm-not-wf-P69-ibm69n07']},
+ {testcases86, [],
+ ['ibm-not-wf-P71-ibm70n01', 'ibm-not-wf-P71-ibm71n01',
+ 'ibm-not-wf-P71-ibm71n02', 'ibm-not-wf-P71-ibm71n03',
+ 'ibm-not-wf-P71-ibm71n04', 'ibm-not-wf-P71-ibm71n05',
+ 'ibm-not-wf-P71-ibm71n06', 'ibm-not-wf-P71-ibm71n07',
+ 'ibm-not-wf-P71-ibm71n08']},
+ {testcases87, [],
+ ['ibm-not-wf-P72-ibm72n01', 'ibm-not-wf-P72-ibm72n02',
+ 'ibm-not-wf-P72-ibm72n03', 'ibm-not-wf-P72-ibm72n04',
+ 'ibm-not-wf-P72-ibm72n05', 'ibm-not-wf-P72-ibm72n06',
+ 'ibm-not-wf-P72-ibm72n07', 'ibm-not-wf-P72-ibm72n08',
+ 'ibm-not-wf-P72-ibm72n09']},
+ {testcases88, [],
+ ['ibm-not-wf-P73-ibm73n01', 'ibm-not-wf-P73-ibm73n03']},
+ {testcases89, [], ['ibm-not-wf-P74-ibm74n01']},
+ {testcases90, [],
+ ['ibm-not-wf-P75-ibm75n01', 'ibm-not-wf-P75-ibm75n02',
+ 'ibm-not-wf-P75-ibm75n03', 'ibm-not-wf-P75-ibm75n04',
+ 'ibm-not-wf-P75-ibm75n05', 'ibm-not-wf-P75-ibm75n06',
+ 'ibm-not-wf-P75-ibm75n07', 'ibm-not-wf-P75-ibm75n08',
+ 'ibm-not-wf-P75-ibm75n09', 'ibm-not-wf-P75-ibm75n10',
+ 'ibm-not-wf-P75-ibm75n11', 'ibm-not-wf-P75-ibm75n12',
+ 'ibm-not-wf-P75-ibm75n13']},
+ {testcases91, [],
+ ['ibm-not-wf-P76-ibm76n01', 'ibm-not-wf-P76-ibm76n02',
+ 'ibm-not-wf-P76-ibm76n03', 'ibm-not-wf-P76-ibm76n04',
+ 'ibm-not-wf-P76-ibm76n05', 'ibm-not-wf-P76-ibm76n06',
+ 'ibm-not-wf-P76-ibm76n07']},
+ {testcases92, [],
+ ['ibm-not-wf-P77-ibm77n01', 'ibm-not-wf-P77-ibm77n02',
+ 'ibm-not-wf-P77-ibm77n03', 'ibm-not-wf-P77-ibm77n04']},
+ {testcases93, [],
+ ['ibm-not-wf-P78-ibm78n01', 'ibm-not-wf-P78-ibm78n02']},
+ {testcases94, [],
+ ['ibm-not-wf-P79-ibm79n01', 'ibm-not-wf-P79-ibm79n02']},
+ {testcases95, [],
+ ['ibm-not-wf-P80-ibm80n01', 'ibm-not-wf-P80-ibm80n02',
+ 'ibm-not-wf-P80-ibm80n03', 'ibm-not-wf-P80-ibm80n04',
+ 'ibm-not-wf-P80-ibm80n05', 'ibm-not-wf-P80-ibm80n06']},
+ {testcases96, [],
+ ['ibm-not-wf-P81-ibm81n01', 'ibm-not-wf-P81-ibm81n02',
+ 'ibm-not-wf-P81-ibm81n03', 'ibm-not-wf-P81-ibm81n04',
+ 'ibm-not-wf-P81-ibm81n05', 'ibm-not-wf-P81-ibm81n06',
+ 'ibm-not-wf-P81-ibm81n07', 'ibm-not-wf-P81-ibm81n08',
+ 'ibm-not-wf-P81-ibm81n09']},
+ {testcases97, [],
+ ['ibm-not-wf-P82-ibm82n01', 'ibm-not-wf-P82-ibm82n02',
+ 'ibm-not-wf-P82-ibm82n03', 'ibm-not-wf-P82-ibm82n04',
+ 'ibm-not-wf-P82-ibm82n05', 'ibm-not-wf-P82-ibm82n06',
+ 'ibm-not-wf-P82-ibm82n07', 'ibm-not-wf-P82-ibm82n08']},
+ {testcases98, [],
+ ['ibm-not-wf-P83-ibm83n01', 'ibm-not-wf-P83-ibm83n02',
+ 'ibm-not-wf-P83-ibm83n03', 'ibm-not-wf-P83-ibm83n04',
+ 'ibm-not-wf-P83-ibm83n05', 'ibm-not-wf-P83-ibm83n06']},
+ {testcases99, [],
+ ['ibm-not-wf-P85-ibm85n01', 'ibm-not-wf-P85-ibm85n02',
+ 'ibm-not-wf-P85-ibm85n03', 'ibm-not-wf-P85-ibm85n04',
+ 'ibm-not-wf-P85-ibm85n05', 'ibm-not-wf-P85-ibm85n06',
+ 'ibm-not-wf-P85-ibm85n07', 'ibm-not-wf-P85-ibm85n08',
+ 'ibm-not-wf-P85-ibm85n09', 'ibm-not-wf-P85-ibm85n10',
+ 'ibm-not-wf-P85-ibm85n100', 'ibm-not-wf-P85-ibm85n101',
+ 'ibm-not-wf-P85-ibm85n102', 'ibm-not-wf-P85-ibm85n103',
+ 'ibm-not-wf-P85-ibm85n104', 'ibm-not-wf-P85-ibm85n105',
+ 'ibm-not-wf-P85-ibm85n106', 'ibm-not-wf-P85-ibm85n107',
+ 'ibm-not-wf-P85-ibm85n108', 'ibm-not-wf-P85-ibm85n109',
+ 'ibm-not-wf-P85-ibm85n11', 'ibm-not-wf-P85-ibm85n110',
+ 'ibm-not-wf-P85-ibm85n111', 'ibm-not-wf-P85-ibm85n112',
+ 'ibm-not-wf-P85-ibm85n113', 'ibm-not-wf-P85-ibm85n114',
+ 'ibm-not-wf-P85-ibm85n115', 'ibm-not-wf-P85-ibm85n116',
+ 'ibm-not-wf-P85-ibm85n117', 'ibm-not-wf-P85-ibm85n118',
+ 'ibm-not-wf-P85-ibm85n119', 'ibm-not-wf-P85-ibm85n12',
+ 'ibm-not-wf-P85-ibm85n120', 'ibm-not-wf-P85-ibm85n121',
+ 'ibm-not-wf-P85-ibm85n122', 'ibm-not-wf-P85-ibm85n123',
+ 'ibm-not-wf-P85-ibm85n124', 'ibm-not-wf-P85-ibm85n125',
+ 'ibm-not-wf-P85-ibm85n126', 'ibm-not-wf-P85-ibm85n127',
+ 'ibm-not-wf-P85-ibm85n128', 'ibm-not-wf-P85-ibm85n129',
+ 'ibm-not-wf-P85-ibm85n13', 'ibm-not-wf-P85-ibm85n130',
+ 'ibm-not-wf-P85-ibm85n131', 'ibm-not-wf-P85-ibm85n132',
+ 'ibm-not-wf-P85-ibm85n133', 'ibm-not-wf-P85-ibm85n134',
+ 'ibm-not-wf-P85-ibm85n135', 'ibm-not-wf-P85-ibm85n136',
+ 'ibm-not-wf-P85-ibm85n137', 'ibm-not-wf-P85-ibm85n138',
+ 'ibm-not-wf-P85-ibm85n139', 'ibm-not-wf-P85-ibm85n14',
+ 'ibm-not-wf-P85-ibm85n140', 'ibm-not-wf-P85-ibm85n141',
+ 'ibm-not-wf-P85-ibm85n142', 'ibm-not-wf-P85-ibm85n143',
+ 'ibm-not-wf-P85-ibm85n144', 'ibm-not-wf-P85-ibm85n145',
+ 'ibm-not-wf-P85-ibm85n146', 'ibm-not-wf-P85-ibm85n147',
+ 'ibm-not-wf-P85-ibm85n148', 'ibm-not-wf-P85-ibm85n149',
+ 'ibm-not-wf-P85-ibm85n15', 'ibm-not-wf-P85-ibm85n150',
+ 'ibm-not-wf-P85-ibm85n151', 'ibm-not-wf-P85-ibm85n152',
+ 'ibm-not-wf-P85-ibm85n153', 'ibm-not-wf-P85-ibm85n154',
+ 'ibm-not-wf-P85-ibm85n155', 'ibm-not-wf-P85-ibm85n156',
+ 'ibm-not-wf-P85-ibm85n157', 'ibm-not-wf-P85-ibm85n158',
+ 'ibm-not-wf-P85-ibm85n159', 'ibm-not-wf-P85-ibm85n16',
+ 'ibm-not-wf-P85-ibm85n160', 'ibm-not-wf-P85-ibm85n161',
+ 'ibm-not-wf-P85-ibm85n162', 'ibm-not-wf-P85-ibm85n163',
+ 'ibm-not-wf-P85-ibm85n164', 'ibm-not-wf-P85-ibm85n165',
+ 'ibm-not-wf-P85-ibm85n166', 'ibm-not-wf-P85-ibm85n167',
+ 'ibm-not-wf-P85-ibm85n168', 'ibm-not-wf-P85-ibm85n169',
+ 'ibm-not-wf-P85-ibm85n17', 'ibm-not-wf-P85-ibm85n170',
+ 'ibm-not-wf-P85-ibm85n171', 'ibm-not-wf-P85-ibm85n172',
+ 'ibm-not-wf-P85-ibm85n173', 'ibm-not-wf-P85-ibm85n174',
+ 'ibm-not-wf-P85-ibm85n175', 'ibm-not-wf-P85-ibm85n176',
+ 'ibm-not-wf-P85-ibm85n177', 'ibm-not-wf-P85-ibm85n178',
+ 'ibm-not-wf-P85-ibm85n179', 'ibm-not-wf-P85-ibm85n18',
+ 'ibm-not-wf-P85-ibm85n180', 'ibm-not-wf-P85-ibm85n181',
+ 'ibm-not-wf-P85-ibm85n182', 'ibm-not-wf-P85-ibm85n183',
+ 'ibm-not-wf-P85-ibm85n184', 'ibm-not-wf-P85-ibm85n185',
+ 'ibm-not-wf-P85-ibm85n186', 'ibm-not-wf-P85-ibm85n187',
+ 'ibm-not-wf-P85-ibm85n188', 'ibm-not-wf-P85-ibm85n189',
+ 'ibm-not-wf-P85-ibm85n19', 'ibm-not-wf-P85-ibm85n190',
+ 'ibm-not-wf-P85-ibm85n191', 'ibm-not-wf-P85-ibm85n192',
+ 'ibm-not-wf-P85-ibm85n193', 'ibm-not-wf-P85-ibm85n194',
+ 'ibm-not-wf-P85-ibm85n195', 'ibm-not-wf-P85-ibm85n196',
+ 'ibm-not-wf-P85-ibm85n197', 'ibm-not-wf-P85-ibm85n198',
+ 'ibm-not-wf-P85-ibm85n20', 'ibm-not-wf-P85-ibm85n21',
+ 'ibm-not-wf-P85-ibm85n22', 'ibm-not-wf-P85-ibm85n23',
+ 'ibm-not-wf-P85-ibm85n24', 'ibm-not-wf-P85-ibm85n25',
+ 'ibm-not-wf-P85-ibm85n26', 'ibm-not-wf-P85-ibm85n27',
+ 'ibm-not-wf-P85-ibm85n28', 'ibm-not-wf-P85-ibm85n29',
+ 'ibm-not-wf-P85-ibm85n30', 'ibm-not-wf-P85-ibm85n31',
+ 'ibm-not-wf-P85-ibm85n32', 'ibm-not-wf-P85-ibm85n33',
+ 'ibm-not-wf-P85-ibm85n34', 'ibm-not-wf-P85-ibm85n35',
+ 'ibm-not-wf-P85-ibm85n36', 'ibm-not-wf-P85-ibm85n37',
+ 'ibm-not-wf-P85-ibm85n38', 'ibm-not-wf-P85-ibm85n39',
+ 'ibm-not-wf-P85-ibm85n40', 'ibm-not-wf-P85-ibm85n41',
+ 'ibm-not-wf-P85-ibm85n42', 'ibm-not-wf-P85-ibm85n43',
+ 'ibm-not-wf-P85-ibm85n44', 'ibm-not-wf-P85-ibm85n45',
+ 'ibm-not-wf-P85-ibm85n46', 'ibm-not-wf-P85-ibm85n47',
+ 'ibm-not-wf-P85-ibm85n48', 'ibm-not-wf-P85-ibm85n49',
+ 'ibm-not-wf-P85-ibm85n50', 'ibm-not-wf-P85-ibm85n51',
+ 'ibm-not-wf-P85-ibm85n52', 'ibm-not-wf-P85-ibm85n53',
+ 'ibm-not-wf-P85-ibm85n54', 'ibm-not-wf-P85-ibm85n55',
+ 'ibm-not-wf-P85-ibm85n56', 'ibm-not-wf-P85-ibm85n57',
+ 'ibm-not-wf-P85-ibm85n58', 'ibm-not-wf-P85-ibm85n59',
+ 'ibm-not-wf-P85-ibm85n60', 'ibm-not-wf-P85-ibm85n61',
+ 'ibm-not-wf-P85-ibm85n62', 'ibm-not-wf-P85-ibm85n63',
+ 'ibm-not-wf-P85-ibm85n64', 'ibm-not-wf-P85-ibm85n65',
+ 'ibm-not-wf-P85-ibm85n66', 'ibm-not-wf-P85-ibm85n67',
+ 'ibm-not-wf-P85-ibm85n68', 'ibm-not-wf-P85-ibm85n69',
+ 'ibm-not-wf-P85-ibm85n70', 'ibm-not-wf-P85-ibm85n71',
+ 'ibm-not-wf-P85-ibm85n72', 'ibm-not-wf-P85-ibm85n73',
+ 'ibm-not-wf-P85-ibm85n74', 'ibm-not-wf-P85-ibm85n75',
+ 'ibm-not-wf-P85-ibm85n76', 'ibm-not-wf-P85-ibm85n77',
+ 'ibm-not-wf-P85-ibm85n78', 'ibm-not-wf-P85-ibm85n79',
+ 'ibm-not-wf-P85-ibm85n80', 'ibm-not-wf-P85-ibm85n81',
+ 'ibm-not-wf-P85-ibm85n82', 'ibm-not-wf-P85-ibm85n83',
+ 'ibm-not-wf-P85-ibm85n84', 'ibm-not-wf-P85-ibm85n85',
+ 'ibm-not-wf-P85-ibm85n86', 'ibm-not-wf-P85-ibm85n87',
+ 'ibm-not-wf-P85-ibm85n88', 'ibm-not-wf-P85-ibm85n89',
+ 'ibm-not-wf-P85-ibm85n90', 'ibm-not-wf-P85-ibm85n91',
+ 'ibm-not-wf-P85-ibm85n92', 'ibm-not-wf-P85-ibm85n93',
+ 'ibm-not-wf-P85-ibm85n94', 'ibm-not-wf-P85-ibm85n95',
+ 'ibm-not-wf-P85-ibm85n96', 'ibm-not-wf-P85-ibm85n97',
+ 'ibm-not-wf-P85-ibm85n98', 'ibm-not-wf-P85-ibm85n99']},
+ {testcases100, [],
+ ['ibm-not-wf-P86-ibm86n01', 'ibm-not-wf-P86-ibm86n02',
+ 'ibm-not-wf-P86-ibm86n03', 'ibm-not-wf-P86-ibm86n04']},
+ {testcases101, [],
+ ['ibm-not-wf-P87-ibm87n01', 'ibm-not-wf-P87-ibm87n02',
+ 'ibm-not-wf-P87-ibm87n03', 'ibm-not-wf-P87-ibm87n04',
+ 'ibm-not-wf-P87-ibm87n05', 'ibm-not-wf-P87-ibm87n06',
+ 'ibm-not-wf-P87-ibm87n07', 'ibm-not-wf-P87-ibm87n08',
+ 'ibm-not-wf-P87-ibm87n09', 'ibm-not-wf-P87-ibm87n10',
+ 'ibm-not-wf-P87-ibm87n11', 'ibm-not-wf-P87-ibm87n12',
+ 'ibm-not-wf-P87-ibm87n13', 'ibm-not-wf-P87-ibm87n14',
+ 'ibm-not-wf-P87-ibm87n15', 'ibm-not-wf-P87-ibm87n16',
+ 'ibm-not-wf-P87-ibm87n17', 'ibm-not-wf-P87-ibm87n18',
+ 'ibm-not-wf-P87-ibm87n19', 'ibm-not-wf-P87-ibm87n20',
+ 'ibm-not-wf-P87-ibm87n21', 'ibm-not-wf-P87-ibm87n22',
+ 'ibm-not-wf-P87-ibm87n23', 'ibm-not-wf-P87-ibm87n24',
+ 'ibm-not-wf-P87-ibm87n25', 'ibm-not-wf-P87-ibm87n26',
+ 'ibm-not-wf-P87-ibm87n27', 'ibm-not-wf-P87-ibm87n28',
+ 'ibm-not-wf-P87-ibm87n29', 'ibm-not-wf-P87-ibm87n30',
+ 'ibm-not-wf-P87-ibm87n31', 'ibm-not-wf-P87-ibm87n32',
+ 'ibm-not-wf-P87-ibm87n33', 'ibm-not-wf-P87-ibm87n34',
+ 'ibm-not-wf-P87-ibm87n35', 'ibm-not-wf-P87-ibm87n36',
+ 'ibm-not-wf-P87-ibm87n37', 'ibm-not-wf-P87-ibm87n38',
+ 'ibm-not-wf-P87-ibm87n39', 'ibm-not-wf-P87-ibm87n40',
+ 'ibm-not-wf-P87-ibm87n41', 'ibm-not-wf-P87-ibm87n42',
+ 'ibm-not-wf-P87-ibm87n43', 'ibm-not-wf-P87-ibm87n44',
+ 'ibm-not-wf-P87-ibm87n45', 'ibm-not-wf-P87-ibm87n46',
+ 'ibm-not-wf-P87-ibm87n47', 'ibm-not-wf-P87-ibm87n48',
+ 'ibm-not-wf-P87-ibm87n49', 'ibm-not-wf-P87-ibm87n50',
+ 'ibm-not-wf-P87-ibm87n51', 'ibm-not-wf-P87-ibm87n52',
+ 'ibm-not-wf-P87-ibm87n53', 'ibm-not-wf-P87-ibm87n54',
+ 'ibm-not-wf-P87-ibm87n55', 'ibm-not-wf-P87-ibm87n56',
+ 'ibm-not-wf-P87-ibm87n57', 'ibm-not-wf-P87-ibm87n58',
+ 'ibm-not-wf-P87-ibm87n59', 'ibm-not-wf-P87-ibm87n60',
+ 'ibm-not-wf-P87-ibm87n61', 'ibm-not-wf-P87-ibm87n62',
+ 'ibm-not-wf-P87-ibm87n63', 'ibm-not-wf-P87-ibm87n64',
+ 'ibm-not-wf-P87-ibm87n66', 'ibm-not-wf-P87-ibm87n67',
+ 'ibm-not-wf-P87-ibm87n68', 'ibm-not-wf-P87-ibm87n69',
+ 'ibm-not-wf-P87-ibm87n70', 'ibm-not-wf-P87-ibm87n71',
+ 'ibm-not-wf-P87-ibm87n72', 'ibm-not-wf-P87-ibm87n73',
+ 'ibm-not-wf-P87-ibm87n74', 'ibm-not-wf-P87-ibm87n75',
+ 'ibm-not-wf-P87-ibm87n76', 'ibm-not-wf-P87-ibm87n77',
+ 'ibm-not-wf-P87-ibm87n78', 'ibm-not-wf-P87-ibm87n79',
+ 'ibm-not-wf-P87-ibm87n80', 'ibm-not-wf-P87-ibm87n81',
+ 'ibm-not-wf-P87-ibm87n82', 'ibm-not-wf-P87-ibm87n83',
+ 'ibm-not-wf-P87-ibm87n84', 'ibm-not-wf-P87-ibm87n85']},
+ {testcases102, [],
+ ['ibm-not-wf-P88-ibm88n01', 'ibm-not-wf-P88-ibm88n02',
+ 'ibm-not-wf-P88-ibm88n03', 'ibm-not-wf-P88-ibm88n04',
+ 'ibm-not-wf-P88-ibm88n05', 'ibm-not-wf-P88-ibm88n06',
+ 'ibm-not-wf-P88-ibm88n08', 'ibm-not-wf-P88-ibm88n09',
+ 'ibm-not-wf-P88-ibm88n10', 'ibm-not-wf-P88-ibm88n11',
+ 'ibm-not-wf-P88-ibm88n12', 'ibm-not-wf-P88-ibm88n13',
+ 'ibm-not-wf-P88-ibm88n14', 'ibm-not-wf-P88-ibm88n15',
+ 'ibm-not-wf-P88-ibm88n16']},
+ {testcases103, [],
+ ['ibm-not-wf-P89-ibm89n01', 'ibm-not-wf-P89-ibm89n02',
+ 'ibm-not-wf-P89-ibm89n03', 'ibm-not-wf-P89-ibm89n04',
+ 'ibm-not-wf-P89-ibm89n05', 'ibm-not-wf-P89-ibm89n06',
+ 'ibm-not-wf-P89-ibm89n07', 'ibm-not-wf-P89-ibm89n08',
+ 'ibm-not-wf-P89-ibm89n09', 'ibm-not-wf-P89-ibm89n10',
+ 'ibm-not-wf-P89-ibm89n11', 'ibm-not-wf-P89-ibm89n12']},
+ {testcases25, [],
+ [{group, testcases26}, {group, testcases27},
+ {group, testcases28}, {group, testcases29},
+ {group, testcases30}, {group, testcases31},
+ {group, testcases32}, {group, testcases33},
+ {group, testcases34}, {group, testcases35},
+ {group, testcases36}, {group, testcases37},
+ {group, testcases38}, {group, testcases39},
+ {group, testcases40}, {group, testcases41},
+ {group, testcases42}, {group, testcases43},
+ {group, testcases44}, {group, testcases45},
+ {group, testcases46}, {group, testcases47},
+ {group, testcases48}, {group, testcases49},
+ {group, testcases50}, {group, testcases51},
+ {group, testcases52}, {group, testcases53},
+ {group, testcases54}, {group, testcases55},
+ {group, testcases56}, {group, testcases57},
+ {group, testcases58}, {group, testcases59},
+ {group, testcases60}, {group, testcases61},
+ {group, testcases62}, {group, testcases63},
+ {group, testcases64}, {group, testcases65},
+ {group, testcases66},
+% {group, testcases67}, {group, testcases68},
+ {group, testcases69}, {group, testcases70},
+ {group, testcases71}, {group, testcases72},
+ {group, testcases73}, {group, testcases74},
+ {group, testcases75}, {group, testcases76},
+ {group, testcases77}, {group, testcases78},
+ {group, testcases79}, {group, testcases80},
+ {group, testcases81}, {group, testcases82},
+ {group, testcases83}, {group, testcases84},
+ {group, testcases85}, {group, testcases86},
+ {group, testcases87}, {group, testcases88},
+ {group, testcases89}, {group, testcases90},
+ {group, testcases91}, {group, testcases92},
+ {group, testcases93}, {group, testcases94},
+ {group, testcases95}, {group, testcases96},
+ {group, testcases97}, {group, testcases98},
+ {group, testcases99}, {group, testcases100},
+ {group, testcases101}, {group, testcases102},
+ {group, testcases103}]},
+ {testcases105, [], ['ibm-valid-P01-ibm01v01']},
+ {testcases106, [], ['ibm-valid-P02-ibm02v01']},
+ {testcases107, [], ['ibm-valid-P03-ibm03v01']},
+ {testcases108, [],
+ ['ibm-valid-P09-ibm09v01', 'ibm-valid-P09-ibm09v02',
+ 'ibm-valid-P09-ibm09v03', 'ibm-valid-P09-ibm09v04',
+ 'ibm-valid-P09-ibm09v05']},
+ {testcases109, [],
+ ['ibm-valid-P10-ibm10v01', 'ibm-valid-P10-ibm10v02',
+ 'ibm-valid-P10-ibm10v03', 'ibm-valid-P10-ibm10v04',
+ 'ibm-valid-P10-ibm10v05', 'ibm-valid-P10-ibm10v06',
+ 'ibm-valid-P10-ibm10v07', 'ibm-valid-P10-ibm10v08']},
+ {testcases110, [],
+ ['ibm-valid-P11-ibm11v01', 'ibm-valid-P11-ibm11v02',
+ 'ibm-valid-P11-ibm11v03', 'ibm-valid-P11-ibm11v04']},
+ {testcases111, [],
+ ['ibm-valid-P12-ibm12v01','ibm-valid-P12-ibm12v02',
+ 'ibm-valid-P12-ibm12v03','ibm-valid-P12-ibm12v04']},
+ {testcases112, [], ['ibm-valid-P13-ibm13v01']},
+ {testcases113, [],
+ ['ibm-valid-P14-ibm14v01', 'ibm-valid-P14-ibm14v02',
+ 'ibm-valid-P14-ibm14v03']},
+ {testcases114, [],
+ ['ibm-valid-P15-ibm15v01', 'ibm-valid-P15-ibm15v02',
+ 'ibm-valid-P15-ibm15v03', 'ibm-valid-P15-ibm15v04']},
+ {testcases115, [],
+ ['ibm-valid-P16-ibm16v01', 'ibm-valid-P16-ibm16v02',
+ 'ibm-valid-P16-ibm16v03']},
+ {testcases116, [], ['ibm-valid-P17-ibm17v01']},
+ {testcases117, [], ['ibm-valid-P18-ibm18v01']},
+ {testcases118, [], ['ibm-valid-P19-ibm19v01']},
+ {testcases119, [],
+ ['ibm-valid-P20-ibm20v01', 'ibm-valid-P20-ibm20v02']},
+ {testcases120, [], ['ibm-valid-P21-ibm21v01']},
+ {testcases121, [],
+ ['ibm-valid-P22-ibm22v01', 'ibm-valid-P22-ibm22v02',
+ 'ibm-valid-P22-ibm22v03', 'ibm-valid-P22-ibm22v04',
+ 'ibm-valid-P22-ibm22v05', 'ibm-valid-P22-ibm22v06',
+ 'ibm-valid-P22-ibm22v07']},
+ {testcases122, [],
+ ['ibm-valid-P23-ibm23v01', 'ibm-valid-P23-ibm23v02',
+ 'ibm-valid-P23-ibm23v03', 'ibm-valid-P23-ibm23v04',
+ 'ibm-valid-P23-ibm23v05', 'ibm-valid-P23-ibm23v06']},
+ {testcases123, [],
+ ['ibm-valid-P24-ibm24v01', 'ibm-valid-P24-ibm24v02']},
+ {testcases124, [],
+ ['ibm-valid-P25-ibm25v01', 'ibm-valid-P25-ibm25v02',
+ 'ibm-valid-P25-ibm25v03', 'ibm-valid-P25-ibm25v04']},
+ {testcases125, [], ['ibm-valid-P26-ibm26v01']},
+ {testcases126, [],
+ ['ibm-valid-P27-ibm27v01', 'ibm-valid-P27-ibm27v02',
+ 'ibm-valid-P27-ibm27v03']},
+ {testcases127, [],
+ ['ibm-valid-P28-ibm28v01', 'ibm-valid-P28-ibm28v02']},
+ {testcases128, [],
+ ['ibm-valid-P29-ibm29v01', 'ibm-valid-P29-ibm29v02']},
+ {testcases129, [],
+ ['ibm-valid-P30-ibm30v01', 'ibm-valid-P30-ibm30v02']},
+ {testcases130, [],
+ ['ibm-valid-P31-ibm31v01']},
+ {testcases131, [],
+ ['ibm-valid-P32-ibm32v01', 'ibm-valid-P32-ibm32v02',
+ 'ibm-valid-P32-ibm32v03', 'ibm-valid-P32-ibm32v04']},
+ {testcases132, [], ['ibm-valid-P33-ibm33v01']},
+ {testcases133, [], ['ibm-valid-P34-ibm34v01']},
+ {testcases134, [], ['ibm-valid-P35-ibm35v01']},
+ {testcases135, [], ['ibm-valid-P36-ibm36v01']},
+ {testcases136, [], ['ibm-valid-P37-ibm37v01']},
+ {testcases137, [], ['ibm-valid-P38-ibm38v01']},
+ {testcases138, [], ['ibm-valid-P39-ibm39v01']},
+ {testcases139, [], ['ibm-valid-P40-ibm40v01']},
+ {testcases140, [], ['ibm-valid-P41-ibm41v01']},
+ {testcases141, [], ['ibm-valid-P42-ibm42v01']},
+ {testcases142, [], ['ibm-valid-P43-ibm43v01']},
+ {testcases143, [], ['ibm-valid-P44-ibm44v01']},
+ {testcases144, [], ['ibm-valid-P45-ibm45v01']},
+ {testcases145, [], ['ibm-valid-P47-ibm47v01']},
+ {testcases146, [], ['ibm-valid-P49-ibm49v01']},
+ {testcases147, [], ['ibm-valid-P50-ibm50v01']},
+ {testcases148, [],
+ ['ibm-valid-P51-ibm51v01', 'ibm-valid-P51-ibm51v02']},
+ {testcases149, [], ['ibm-valid-P52-ibm52v01']},
+ {testcases150, [],
+ ['ibm-valid-P54-ibm54v01', 'ibm-valid-P54-ibm54v02',
+ 'ibm-valid-P54-ibm54v03']},
+ {testcases151, [], ['ibm-valid-P55-ibm55v01']},
+ {testcases152, [],
+ ['ibm-valid-P56-ibm56v01', 'ibm-valid-P56-ibm56v02',
+ 'ibm-valid-P56-ibm56v03', 'ibm-valid-P56-ibm56v04',
+ 'ibm-valid-P56-ibm56v05', 'ibm-valid-P56-ibm56v06',
+ 'ibm-valid-P56-ibm56v07', 'ibm-valid-P56-ibm56v08',
+ 'ibm-valid-P56-ibm56v09', 'ibm-valid-P56-ibm56v10']},
+ {testcases153, [], ['ibm-valid-P57-ibm57v01']},
+ {testcases154, [],
+ ['ibm-valid-P58-ibm58v01', 'ibm-valid-P58-ibm58v02']},
+ {testcases155, [],
+ ['ibm-valid-P59-ibm59v01', 'ibm-valid-P59-ibm59v02']},
+ {testcases156, [],
+ ['ibm-valid-P60-ibm60v01', 'ibm-valid-P60-ibm60v02',
+ 'ibm-valid-P60-ibm60v03', 'ibm-valid-P60-ibm60v04']},
+ {testcases157, [],
+ ['ibm-valid-P61-ibm61v01','ibm-valid-P61-ibm61v02']},
+ {testcases158, [],
+ ['ibm-valid-P62-ibm62v01','ibm-valid-P62-ibm62v02',
+ 'ibm-valid-P62-ibm62v03','ibm-valid-P62-ibm62v04',
+ 'ibm-valid-P62-ibm62v05']},
+ {testcases159, [],
+ ['ibm-valid-P63-ibm63v01','ibm-valid-P63-ibm63v02',
+ 'ibm-valid-P63-ibm63v03','ibm-valid-P63-ibm63v04',
+ 'ibm-valid-P63-ibm63v05']},
+ {testcases160, [],
+ ['ibm-valid-P64-ibm64v01','ibm-valid-P64-ibm64v02',
+ 'ibm-valid-P64-ibm64v03']},
+ {testcases161, [], ['ibm-valid-P65-ibm65v01','ibm-valid-P65-ibm65v02']},
+ {testcases162, [], ['ibm-valid-P66-ibm66v01']},
+ {testcases163, [], ['ibm-valid-P67-ibm67v01']},
+ {testcases164, [],
+ ['ibm-valid-P68-ibm68v01', 'ibm-valid-P68-ibm68v02']},
+ {testcases165, [],
+ ['ibm-valid-P69-ibm69v01', 'ibm-valid-P69-ibm69v02']},
+ {testcases166, [], ['ibm-valid-P70-ibm70v01']},
+ {testcases167, [], ['ibm-valid-P78-ibm78v01']},
+ {testcases168, [], ['ibm-valid-P79-ibm79v01']},
+ {testcases169, [], ['ibm-valid-P82-ibm82v01']},
+ {testcases170, [], ['ibm-valid-P85-ibm85v01']},
+ {testcases171, [], ['ibm-valid-P86-ibm86v01']},
+ {testcases172, [], ['ibm-valid-P87-ibm87v01']},
+ {testcases173, [], ['ibm-valid-P88-ibm88v01']},
+ {testcases174, [], ['ibm-valid-P89-ibm89v01']},
+ {testcases104, [],
+ [{group, testcases105}, {group, testcases106},
+ {group, testcases107}, {group, testcases108},
+ {group, testcases109}, {group, testcases110},
+% {group, testcases111}, {group,testcases112},
+ {group, testcases113},
+ {group, testcases114}, {group, testcases115},
+ {group, testcases116}, {group, testcases117},
+ {group, testcases118}, {group, testcases119},
+ {group, testcases120}, {group, testcases121},
+ {group, testcases122}, {group, testcases123},
+ {group, testcases124}, {group, testcases125},
+ {group, testcases126}, {group, testcases127},
+ {group, testcases128}, {group, testcases129},
+% {group, testcases130},
+ {group, testcases131},
+ {group, testcases132}, {group, testcases133},
+ {group, testcases134}, {group, testcases135},
+ {group, testcases136}, {group, testcases137},
+ {group, testcases138}, {group, testcases139},
+ {group, testcases140}, {group, testcases141},
+ {group, testcases142}, {group, testcases143},
+ {group, testcases144}, {group, testcases145},
+ {group, testcases146}, {group, testcases147},
+ {group, testcases148}, {group, testcases149},
+ {group, testcases150}, {group, testcases151},
+ {group, testcases152}, {group, testcases153},
+ {group, testcases154}, {group, testcases155},
+ {group, testcases156}, % {group, testcases157},
+% {group, testcases158}, {group, testcases159},
+% {group, testcases160}, {group, testcases161},
+ {group, testcases162}, {group, testcases163},
+ {group, testcases164}, {group, testcases165},
+ {group, testcases166}, %{group, testcases167},
+ {group, testcases168}, {group, testcases169},
+% {group, testcases170},
+ {group, testcases171},
+ {group, testcases172}, {group, testcases173},
+ {group, testcases174}]},
+ {testcases8, [],
+ [{group, testcases9}, {group, testcases25},
+ {group, testcases104}]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+%%======================================================================
+%% Support Functions
+%%======================================================================
+
+%% Dir is a directory
+rm_f_(Dir) ->
+ ?line {ok,CWD} = file:get_cwd(),
+ ?line {ok,FileList} = file:list_dir(Dir),
+ ?line file:set_cwd(filename:join([CWD,Dir])),
+ rm_files(FileList),
+ ?line file:set_cwd(CWD),
+ ? line ok = file:del_dir(Dir).
+
+rm_files([])->
+ ok;
+rm_files([F|Fs]) ->
+ case filelib:is_dir(F) of
+ true ->
+ rm_f_(F);
+ _ ->
+ ?line ok = file:delete(F)
+ end,
+ rm_files(Fs).
+
+
+change_mode(Files) ->
+ change_mode3(Files).
+change_mode2(Dir)->
+ ?line {ok,CWD} = file:get_cwd(),
+ ?line {ok,FileList} = file:list_dir(Dir),
+ ?line file:set_cwd(filename:join([CWD,Dir])),
+ change_mode3(FileList),
+ ?line file:set_cwd(CWD).
+change_mode3([]) ->
+ ok;
+change_mode3([F|Fs]) ->
+ case filelib:is_dir(F) of
+ true ->
+ chmod(F),
+ change_mode2(F);
+ _ ->
+ chmod(F)
+ end,
+ change_mode3(Fs).
+
+chmod(F) ->
+ case file:read_file_info(F) of
+ {ok,FileInfo} ->
+ Mode= FileInfo#file_info.mode,
+ file:write_file_info(F,FileInfo#file_info{mode=8#00777 bor Mode});
+ _ ->
+ ok
+ end.
+
+%%----------------------------------------------------------------------
+%% check_result
+check_result({fatal_error,_,_,_,_}, "error") ->
+ ok;
+check_result({ok, _, _}, "invalid") ->
+ ok;
+check_result({fatal_error,_,_,_,_}, "not-wf") ->
+ ok;
+check_result({ok, _, _}, "valid") ->
+ ok.
+
diff --git a/lib/xmerl/test/xmerl_std_SUITE.erl b/lib/xmerl/test/xmerl_std_SUITE.erl
new file mode 100644
index 0000000000..c3cc9007d3
--- /dev/null
+++ b/lib/xmerl/test/xmerl_std_SUITE.erl
@@ -0,0 +1,11799 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2004-2011. 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(xmerl_std_SUITE).
+
+-compile(export_all).
+
+%%----------------------------------------------------------------------
+%% Include files
+%%----------------------------------------------------------------------
+-include_lib("test_server/include/test_server.hrl").
+%%-include("xmerl.hrl").
+-include_lib("xmerl/include/xmerl.hrl").
+
+-define(ibm_dir,"ibm").
+-define(sun_dir,"sun").
+-define(japanese_dir,"japanese").
+-define(oasis_dir,"oasis").
+-define(xmltest_dir,"xmltest").
+
+%%======================================================================
+%% Tests
+%%======================================================================
+
+%%----------------------------------------------------------------------
+%% Test groups
+%%----------------------------------------------------------------------
+%% totally 1788 test cases
+all() ->
+ ['sun-valid'(suite), 'sun-invalid'(suite),
+ 'sun-not-wf'(suite), 'sun-error'(suite),
+ 'jclark-xmltest'(suite), 'xerox-japanese'(suite),
+ 'nist-oasis'(suite), 'ibm-invalid'(suite),
+ 'ibm-not-wf'(suite), 'ibm-valid'(suite)].
+
+groups() ->
+ [{sun_test_cases, [],
+ 'sun-valid'(suite) ++
+ 'sun-invalid'(suite) ++
+ 'sun-not-wf'(suite) ++ 'sun-error'(suite)},
+ {ibm_test_cases, [],
+ 'ibm-invalid'(suite) ++
+ 'ibm-not-wf'(suite) ++ 'ibm-valid'(suite)},
+ {xmltest_test_cases, [], 'jclark-xmltest'(suite)},
+ {japanese_test_cases, [], 'xerox-japanese'(suite)},
+ {oasis_test_cases, [], 'nist-oasis'(suite)}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+
+'sun-valid'(suite) -> %% 28 test cases
+ ['v-pe02','v-pe03','v-pe00','v-lang06','v-lang05','v-lang04',
+ 'v-lang03','v-lang02','v-lang01','v-sgml01',sa05,sa04,sa03,sa02,
+ sa01,required00,optional,notation01,'not-sa04','not-sa03',
+ 'not-sa02','not-sa01',ext02,ext01,element,dtd01,dtd00,pe01].
+'sun-invalid'(suite) -> %% 74 test cases
+ [empty,utf16l,utf16b,attr16,attr15,attr14,attr13,attr12,attr11,
+ attr10,attr09,attr08,attr07,attr06,attr05,attr04,attr03,attr02,
+ attr01,root,'inv-required02','inv-required01','inv-required00',
+ optional25,optional24,optional23,optional22,optional21,optional20,
+ optional14,optional13,optional12,optional11,optional10,optional09,
+ optional08,optional07,optional06,optional05,optional04,optional03,
+ optional02,optional01,'inv-not-sa14','inv-not-sa13','inv-not-sa12',
+ 'inv-not-sa11','inv-not-sa10','inv-not-sa09','inv-not-sa08',
+ 'inv-not-sa07','inv-not-sa06','inv-not-sa05','inv-not-sa04',
+ 'inv-not-sa02','inv-not-sa01',id09,id08,id07,id06,id05,id04,id03,
+ id02,id01,el06,el05,el04,el03,el02,el01,'inv-dtd03','inv-dtd02',
+ 'inv-dtd01'].
+'sun-not-wf'(suite)-> %% 56 test cases
+ [sgml13,sgml12,sgml11,sgml10,sgml09,sgml08,sgml07,sgml06,sgml05,
+ sgml04,sgml03,sgml02,sgml01,pubid05,pubid04,pubid03,pubid02,pubid01,
+ pi,encoding07,encoding06,encoding05,encoding04,encoding03,encoding02,
+ encoding01,element04,element03,element02,element01,element00,dtd07,
+ dtd05,dtd04,dtd03,dtd02,'nwf-dtd01','nwf-dtd00',decl01,content03,
+ content02,content01,cond02,cond01,attlist11,attlist10,attlist09,
+ attlist08,attlist07,attlist06,attlist05,attlist04,attlist03,
+ attlist02,attlist01,'not-wf-sa03'].
+'sun-error'(suite)->
+ %% 1 test case
+ [uri01].
+'jclark-xmltest'(suite) ->
+ %% 364 test cases
+ ['valid-ext-sa-014','valid-ext-sa-013','valid-ext-sa-012',
+ 'valid-ext-sa-011','valid-ext-sa-009','valid-ext-sa-008',
+ 'valid-ext-sa-007','valid-ext-sa-006','valid-ext-sa-005',
+ 'valid-ext-sa-004','valid-ext-sa-003','valid-ext-sa-002',
+ 'valid-ext-sa-001','valid-not-sa-031','valid-not-sa-030',
+ 'valid-not-sa-029','valid-not-sa-028','valid-not-sa-027',
+ 'valid-not-sa-026','valid-not-sa-025','valid-not-sa-024',
+ 'valid-not-sa-023','valid-not-sa-021','valid-not-sa-020',
+ 'valid-not-sa-019','valid-not-sa-018','valid-not-sa-017',
+ 'valid-not-sa-016','valid-not-sa-015','valid-not-sa-014',
+ 'valid-not-sa-013','valid-not-sa-012','valid-not-sa-011',
+ 'valid-not-sa-010','valid-not-sa-009','valid-not-sa-008',
+ 'valid-not-sa-007','valid-not-sa-006','valid-not-sa-005',
+ 'valid-not-sa-004','valid-not-sa-003','valid-not-sa-002',
+ 'valid-not-sa-001','valid-sa-119','valid-sa-118','valid-sa-117',
+ 'valid-sa-116','valid-sa-115','valid-sa-114','valid-sa-113',
+ 'valid-sa-112','valid-sa-111','valid-sa-110','valid-sa-109',
+ 'valid-sa-108','valid-sa-107','valid-sa-106','valid-sa-105',
+ 'valid-sa-104','valid-sa-103','valid-sa-102','valid-sa-101',
+ 'valid-sa-100','valid-sa-099','valid-sa-098','valid-sa-097',
+ 'valid-sa-096','valid-sa-095','valid-sa-094','valid-sa-093',
+ 'valid-sa-092','valid-sa-091','valid-sa-090','valid-sa-089',
+ 'valid-sa-088','valid-sa-087','valid-sa-086','valid-sa-085',
+ 'valid-sa-084','valid-sa-083','valid-sa-082','valid-sa-081',
+ 'valid-sa-080','valid-sa-079','valid-sa-078','valid-sa-077',
+ 'valid-sa-076','valid-sa-075','valid-sa-074','valid-sa-073',
+ 'valid-sa-072','valid-sa-071','valid-sa-070','valid-sa-069',
+ 'valid-sa-068','valid-sa-067','valid-sa-066','valid-sa-065',
+ 'valid-sa-064','valid-sa-063','valid-sa-062','valid-sa-061',
+ 'valid-sa-060','valid-sa-059','valid-sa-058','valid-sa-057',
+ 'valid-sa-056','valid-sa-055','valid-sa-054','valid-sa-053',
+ 'valid-sa-052','valid-sa-051','valid-sa-050','valid-sa-049',
+ 'valid-sa-048','valid-sa-047','valid-sa-046','valid-sa-045',
+ 'valid-sa-044','valid-sa-043','valid-sa-042','valid-sa-041',
+ 'valid-sa-040','valid-sa-039','valid-sa-038','valid-sa-037',
+ 'valid-sa-036','valid-sa-035','valid-sa-034','valid-sa-033',
+ 'valid-sa-032','valid-sa-031','valid-sa-030','valid-sa-029',
+ 'valid-sa-028','valid-sa-027','valid-sa-026','valid-sa-025',
+ 'valid-sa-024','valid-sa-023','valid-sa-022','valid-sa-021',
+ 'valid-sa-020','valid-sa-019','valid-sa-018','valid-sa-017',
+ 'valid-sa-016','valid-sa-015','valid-sa-014','valid-sa-013',
+ 'valid-sa-012','valid-sa-011','valid-sa-010','valid-sa-009',
+ 'valid-sa-008','valid-sa-007','valid-sa-006','valid-sa-005',
+ 'valid-sa-004','valid-sa-003','valid-sa-002','valid-sa-001',
+ 'invalid-not-sa-022','invalid--006','invalid--005','invalid--002',
+ 'not-wf-ext-sa-003','not-wf-ext-sa-002','not-wf-ext-sa-001',
+ 'not-wf-not-sa-009','not-wf-not-sa-008','not-wf-not-sa-007',
+ 'not-wf-not-sa-006','not-wf-not-sa-005','not-wf-not-sa-004',
+ 'not-wf-not-sa-003','not-wf-not-sa-002','not-wf-not-sa-001',
+ 'not-wf-sa-186','not-wf-sa-185','not-wf-sa-184','not-wf-sa-183',
+ 'not-wf-sa-182','not-wf-sa-181','not-wf-sa-180','not-wf-sa-179',
+ 'not-wf-sa-178','not-wf-sa-177','not-wf-sa-176','not-wf-sa-175',
+ 'not-wf-sa-174','not-wf-sa-173','not-wf-sa-172','not-wf-sa-171',
+ 'not-wf-sa-170','not-wf-sa-169','not-wf-sa-168','not-wf-sa-167',
+ 'not-wf-sa-166','not-wf-sa-165','not-wf-sa-164','not-wf-sa-163',
+ 'not-wf-sa-162','not-wf-sa-161','not-wf-sa-160','not-wf-sa-159',
+ 'not-wf-sa-158','not-wf-sa-157','not-wf-sa-156','not-wf-sa-155',
+ 'not-wf-sa-154','not-wf-sa-153','not-wf-sa-152','not-wf-sa-151',
+ 'not-wf-sa-150','not-wf-sa-149','not-wf-sa-148','not-wf-sa-147',
+ 'not-wf-sa-146','not-wf-sa-145','not-wf-sa-144','not-wf-sa-143',
+ 'not-wf-sa-142','not-wf-sa-141','not-wf-sa-140','not-wf-sa-139',
+ 'not-wf-sa-138','not-wf-sa-137','not-wf-sa-136','not-wf-sa-135',
+ 'not-wf-sa-134','not-wf-sa-133','not-wf-sa-132','not-wf-sa-131',
+ 'not-wf-sa-130','not-wf-sa-129','not-wf-sa-128','not-wf-sa-127',
+ 'not-wf-sa-126','not-wf-sa-125','not-wf-sa-124','not-wf-sa-123',
+ 'not-wf-sa-122','not-wf-sa-121','not-wf-sa-120','not-wf-sa-119',
+ 'not-wf-sa-118','not-wf-sa-117','not-wf-sa-116','not-wf-sa-115',
+ 'not-wf-sa-114','not-wf-sa-113','not-wf-sa-112','not-wf-sa-111',
+ 'not-wf-sa-110','not-wf-sa-109','not-wf-sa-108','not-wf-sa-107',
+ 'not-wf-sa-106','not-wf-sa-105','not-wf-sa-104','not-wf-sa-103',
+ 'not-wf-sa-102','not-wf-sa-101','not-wf-sa-100','not-wf-sa-099',
+ 'not-wf-sa-098','not-wf-sa-097','not-wf-sa-096','not-wf-sa-095',
+ 'not-wf-sa-094','not-wf-sa-093','not-wf-sa-092','not-wf-sa-091',
+ 'not-wf-sa-090','not-wf-sa-089','not-wf-sa-088','not-wf-sa-087',
+ 'not-wf-sa-086','not-wf-sa-085','not-wf-sa-084','not-wf-sa-083',
+ 'not-wf-sa-082','not-wf-sa-081','not-wf-sa-080','not-wf-sa-079',
+ 'not-wf-sa-078','not-wf-sa-077','not-wf-sa-076','not-wf-sa-075',
+ 'not-wf-sa-074','not-wf-sa-073','not-wf-sa-072','not-wf-sa-071',
+ 'not-wf-sa-070','not-wf-sa-069','not-wf-sa-068','not-wf-sa-067',
+ 'not-wf-sa-066','not-wf-sa-065','not-wf-sa-064','not-wf-sa-063',
+ 'not-wf-sa-062','not-wf-sa-061','not-wf-sa-060','not-wf-sa-059',
+ 'not-wf-sa-058','not-wf-sa-057','not-wf-sa-056','not-wf-sa-055',
+ 'not-wf-sa-054','not-wf-sa-053','not-wf-sa-052','not-wf-sa-051',
+ 'not-wf-sa-050','not-wf-sa-049','not-wf-sa-048','not-wf-sa-047',
+ 'not-wf-sa-046','not-wf-sa-045','not-wf-sa-044','not-wf-sa-043',
+ 'not-wf-sa-042','not-wf-sa-041','not-wf-sa-040','not-wf-sa-039',
+ 'not-wf-sa-038','not-wf-sa-037','not-wf-sa-036','not-wf-sa-035',
+ 'not-wf-sa-034','not-wf-sa-033','not-wf-sa-032','not-wf-sa-031',
+ 'not-wf-sa-030','not-wf-sa-029','not-wf-sa-028','not-wf-sa-027',
+ 'not-wf-sa-026','not-wf-sa-025','not-wf-sa-024','not-wf-sa-023',
+ 'not-wf-sa-022','not-wf-sa-021','not-wf-sa-020','not-wf-sa-019',
+ 'not-wf-sa-018','not-wf-sa-017','not-wf-sa-016','not-wf-sa-015',
+ 'not-wf-sa-014','not-wf-sa-013','not-wf-sa-012','not-wf-sa-011',
+ 'not-wf-sa-010','not-wf-sa-009','not-wf-sa-008','not-wf-sa-007',
+ 'not-wf-sa-006','not-wf-sa-005','not-wf-sa-004','not-wf-sa-003',
+ 'not-wf-sa-002','not-wf-sa-001'].
+'xerox-japanese'(suite) ->
+ %% 12 test cases
+ ['japanese-weekly-utf-8','japanese-weekly-utf-16',
+ 'japanese-weekly-shift_jis','japanese-weekly-little',
+ 'japanese-weekly-iso-2022-jp','japanese-weekly-euc-jp',
+ 'japanese-pr-xml-utf-8','japanese-pr-xml-utf-16',
+ 'japanese-pr-xml-shift_jis','japanese-pr-xml-little',
+ 'japanese-pr-xml-iso-2022-jp','japanese-pr-xml-euc-jp'].
+'nist-oasis'(suite) ->
+ %% 348 test cases
+ ['o-p11pass1','o-p76fail4','o-p76fail3','o-p76fail2','o-p76fail1',
+ 'o-p75fail6','o-p75fail5','o-p75fail4','o-p75fail3','o-p75fail2',
+ 'o-p75fail1','o-p74fail3','o-p74fail2','o-p74fail1','o-p73fail5',
+ 'o-p73fail4','o-p73fail3','o-p73fail2','o-p73fail1','o-p72fail4',
+ 'o-p72fail3','o-p72fail2','o-p72fail1','o-p71fail4','o-p71fail3',
+ 'o-p71fail2','o-p71fail1','o-p70fail1','o-p69fail3','o-p69fail2',
+ 'o-p69fail1','o-p68fail3','o-p68fail2','o-p68fail1','o-p66fail6',
+ 'o-p66fail5','o-p66fail4','o-p66fail3','o-p66fail2','o-p66fail1',
+ 'o-p64fail2','o-p64fail1','o-p63fail2','o-p63fail1','o-p62fail2',
+ 'o-p62fail1','o-p61fail1','o-p60fail5','o-p60fail4','o-p60fail3',
+ 'o-p60fail2','o-p60fail1','o-p59fail3','o-p59fail2','o-p59fail1',
+ 'o-p58fail8','o-p58fail7','o-p58fail6','o-p58fail5','o-p58fail4',
+ 'o-p58fail3','o-p58fail2','o-p58fail1','o-p57fail1','o-p56fail5',
+ 'o-p56fail4','o-p56fail3','o-p56fail2','o-p56fail1','o-p55fail1',
+ 'o-p54fail1','o-p53fail5','o-p53fail4','o-p53fail3','o-p53fail2',
+ 'o-p53fail1','o-p52fail2','o-p52fail1','o-p51fail7','o-p51fail6',
+ 'o-p51fail5','o-p51fail4','o-p51fail3','o-p51fail2','o-p51fail1',
+ 'o-p50fail1','o-p49fail1','o-p48fail2','o-p48fail1','o-p47fail4',
+ 'o-p47fail3','o-p47fail2','o-p47fail1','o-p46fail6','o-p46fail5',
+ 'o-p46fail4','o-p46fail3','o-p46fail2','o-p46fail1','o-p45fail4',
+ 'o-p45fail3','o-p45fail2','o-p45fail1','o-p44fail5','o-p44fail4',
+ 'o-p44fail3','o-p44fail2','o-p44fail1','o-p43fail3','o-p43fail2',
+ 'o-p43fail1','o-p42fail3','o-p42fail2','o-p42fail1','o-p41fail3',
+ 'o-p41fail2','o-p41fail1','o-p40fail4','o-p40fail3','o-p40fail2',
+ 'o-p40fail1','o-p39fail5','o-p39fail4','o-p39fail3','o-p39fail2',
+ 'o-p39fail1','o-p32fail5','o-p32fail4','o-p32fail3','o-p32fail2',
+ 'o-p32fail1','o-p31fail1','o-p30fail1','o-p29fail1','o-p28fail1',
+ 'o-p27fail1','o-p26fail2','o-p26fail1','o-p25fail1','o-p24fail2',
+ 'o-p24fail1','o-p23fail5','o-p23fail4','o-p23fail3','o-p23fail2',
+ 'o-p23fail1','o-p22fail2','o-p22fail1','o-p18fail3','o-p18fail2',
+ 'o-p18fail1','o-p16fail3','o-p16fail2','o-p16fail1','o-p15fail3',
+ 'o-p15fail2','o-p15fail1','o-p14fail3','o-p14fail2','o-p14fail1',
+ 'o-p12fail7','o-p12fail6','o-p12fail5','o-p12fail4','o-p12fail3',
+ 'o-p12fail2','o-p12fail1','o-p11fail2','o-p11fail1','o-p10fail3',
+ 'o-p10fail2','o-p10fail1','o-p09fail5','o-p09fail4','o-p09fail3',
+ 'o-p09fail2','o-p09fail1','o-p05fail5','o-p05fail4','o-p05fail3',
+ 'o-p05fail2','o-p05fail1','o-p04fail3','o-p04fail2','o-p04fail1',
+ 'o-p03fail9','o-p03fail8','o-p03fail7','o-p03fail5','o-p03fail4',
+ 'o-p03fail3','o-p03fail29','o-p03fail28','o-p03fail27','o-p03fail26',
+ 'o-p03fail25','o-p03fail24','o-p03fail23','o-p03fail22','o-p03fail21',
+ 'o-p03fail20','o-p03fail2','o-p03fail19','o-p03fail18','o-p03fail17',
+ 'o-p03fail16','o-p03fail15','o-p03fail14','o-p03fail13','o-p03fail12',
+ 'o-p03fail11','o-p03fail10','o-p03fail1','o-p02fail9','o-p02fail8',
+ 'o-p02fail7','o-p02fail6','o-p02fail5','o-p02fail4','o-p02fail31',
+ 'o-p02fail30','o-p02fail3','o-p02fail29','o-p02fail28','o-p02fail27',
+ 'o-p02fail26','o-p02fail25','o-p02fail24','o-p02fail23','o-p02fail22',
+ 'o-p02fail21','o-p02fail20','o-p02fail2','o-p02fail19','o-p02fail18',
+ 'o-p02fail17','o-p02fail16','o-p02fail15','o-p02fail14','o-p02fail13',
+ 'o-p02fail12','o-p02fail11','o-p02fail10','o-p02fail1','o-p01fail4',
+ 'o-p01fail3','o-p01fail2','o-p01fail1','o-e2','o-p75pass1',
+ 'o-p74pass1','o-p66pass1','o-p44pass5','o-p44pass4','o-p44pass3',
+ 'o-p44pass2','o-p44pass1','o-p42pass2','o-p42pass1','o-p41pass2',
+ 'o-p41pass1','o-p40pass4','o-p40pass3','o-p40pass2','o-p40pass1',
+ 'o-p39pass2','o-p39pass1','o-p32pass2','o-p32pass1','o-p27pass4',
+ 'o-p27pass3','o-p27pass2','o-p27pass1','o-p26pass1','o-p25pass2',
+ 'o-p25pass1','o-p24pass4','o-p24pass3','o-p24pass2','o-p24pass1',
+ 'o-p23pass4','o-p23pass3','o-p23pass2','o-p23pass1','o-p22pass3',
+ 'o-p22pass2','o-p22pass1','o-p18pass1','o-p16pass3','o-p16pass2',
+ 'o-p16pass1','o-p15pass1','o-p14pass1','o-p10pass1','o-p08fail2',
+ 'o-p08fail1','o-p06fail1','o-p05pass1','o-p04pass1','o-p03pass1',
+ 'o-p01pass3','o-p01pass1','o-p76pass1','o-p73pass1','o-p72pass1',
+ 'o-p71pass1','o-p70pass1','o-p69pass1','o-p68pass1','o-p64pass1',
+ 'o-p63pass1','o-p62pass1','o-p61pass1','o-p60pass1','o-p59pass1',
+ 'o-p58pass1','o-p57pass1','o-p56pass1','o-p55pass1','o-p54pass1',
+ 'o-p53pass1','o-p52pass1','o-p51pass1','o-p50pass1','o-p49pass1',
+ 'o-p48pass1','o-p47pass1','o-p46pass1','o-p45pass1','o-p43pass1',
+ 'o-p31pass2','o-p31pass1','o-p30pass2','o-p30pass1','o-p29pass1',
+ 'o-p28pass5','o-p28pass4','o-p28pass3','o-p28pass1','o-p22pass6',
+ 'o-p22pass5','o-p22pass4','o-p12pass1','o-p09pass1','o-p08pass1',
+ 'o-p07pass1','o-p06pass1','o-p01pass2'].
+'ibm-invalid'(suite) ->
+ %% 48 test cases
+ ['ibm-invalid-P76-ibm76i01','ibm-invalid-P69-ibm69i04',
+ 'ibm-invalid-P69-ibm69i03','ibm-invalid-P69-ibm69i02',
+ 'ibm-invalid-P69-ibm69i01','ibm-invalid-P68-ibm68i04',
+ 'ibm-invalid-P68-ibm68i03','ibm-invalid-P68-ibm68i02',
+ 'ibm-invalid-P68-ibm68i01','ibm-invalid-P60-ibm60i04',
+ 'ibm-invalid-P60-ibm60i03','ibm-invalid-P60-ibm60i02',
+ 'ibm-invalid-P60-ibm60i01','ibm-invalid-P59-ibm59i01',
+ 'ibm-invalid-P58-ibm58i02','ibm-invalid-P58-ibm58i01',
+ 'ibm-invalid-P56-ibm56i18','ibm-invalid-P56-ibm56i17',
+ 'ibm-invalid-P56-ibm56i16','ibm-invalid-P56-ibm56i15',
+ 'ibm-invalid-P56-ibm56i14','ibm-invalid-P56-ibm56i13',
+ 'ibm-invalid-P56-ibm56i12','ibm-invalid-P56-ibm56i11',
+ 'ibm-invalid-P56-ibm56i10','ibm-invalid-P56-ibm56i09',
+ 'ibm-invalid-P56-ibm56i08','ibm-invalid-P56-ibm56i07',
+ 'ibm-invalid-P56-ibm56i06','ibm-invalid-P56-ibm56i05',
+ 'ibm-invalid-P56-ibm56i03','ibm-invalid-P56-ibm56i02',
+ 'ibm-invalid-P56-ibm56i01','ibm-invalid-P51-ibm51i03',
+ 'ibm-invalid-P51-ibm51i01','ibm-invalid-P50-ibm50i01',
+ 'ibm-invalid-P49-ibm49i01','ibm-invalid-P45-ibm45i01',
+ 'ibm-invalid-P41-ibm41i02','ibm-invalid-P41-ibm41i01',
+ 'ibm-invalid-P39-ibm39i04','ibm-invalid-P39-ibm39i03',
+ 'ibm-invalid-P39-ibm39i02','ibm-invalid-P39-ibm39i01',
+ 'ibm-invalid-P32-ibm32i04','ibm-invalid-P32-ibm32i03',
+ 'ibm-invalid-P32-ibm32i01','ibm-invalid-P28-ibm28i01'].
+'ibm-not-wf'(suite) ->
+ %% 731 test cases
+ ['ibm-not-wf-P89-ibm89n12','ibm-not-wf-P89-ibm89n11',
+ 'ibm-not-wf-P89-ibm89n10','ibm-not-wf-P89-ibm89n09',
+ 'ibm-not-wf-P89-ibm89n08','ibm-not-wf-P89-ibm89n07',
+ 'ibm-not-wf-P89-ibm89n06','ibm-not-wf-P89-ibm89n05',
+ 'ibm-not-wf-P89-ibm89n04','ibm-not-wf-P89-ibm89n03',
+ 'ibm-not-wf-P89-ibm89n02','ibm-not-wf-P89-ibm89n01',
+ 'ibm-not-wf-P88-ibm88n16','ibm-not-wf-P88-ibm88n15',
+ 'ibm-not-wf-P88-ibm88n14','ibm-not-wf-P88-ibm88n13',
+ 'ibm-not-wf-P88-ibm88n12','ibm-not-wf-P88-ibm88n11',
+ 'ibm-not-wf-P88-ibm88n10','ibm-not-wf-P88-ibm88n09',
+ 'ibm-not-wf-P88-ibm88n08','ibm-not-wf-P88-ibm88n06',
+ 'ibm-not-wf-P88-ibm88n05','ibm-not-wf-P88-ibm88n04',
+ 'ibm-not-wf-P88-ibm88n03','ibm-not-wf-P88-ibm88n02',
+ 'ibm-not-wf-P88-ibm88n01','ibm-not-wf-P87-ibm87n85',
+ 'ibm-not-wf-P87-ibm87n84','ibm-not-wf-P87-ibm87n83',
+ 'ibm-not-wf-P87-ibm87n82','ibm-not-wf-P87-ibm87n81',
+ 'ibm-not-wf-P87-ibm87n80','ibm-not-wf-P87-ibm87n79',
+ 'ibm-not-wf-P87-ibm87n78','ibm-not-wf-P87-ibm87n77',
+ 'ibm-not-wf-P87-ibm87n76','ibm-not-wf-P87-ibm87n75',
+ 'ibm-not-wf-P87-ibm87n74','ibm-not-wf-P87-ibm87n73',
+ 'ibm-not-wf-P87-ibm87n72','ibm-not-wf-P87-ibm87n71',
+ 'ibm-not-wf-P87-ibm87n70','ibm-not-wf-P87-ibm87n69',
+ 'ibm-not-wf-P87-ibm87n68','ibm-not-wf-P87-ibm87n67',
+ 'ibm-not-wf-P87-ibm87n66','ibm-not-wf-P87-ibm87n64',
+ 'ibm-not-wf-P87-ibm87n63','ibm-not-wf-P87-ibm87n62',
+ 'ibm-not-wf-P87-ibm87n61','ibm-not-wf-P87-ibm87n60',
+ 'ibm-not-wf-P87-ibm87n59','ibm-not-wf-P87-ibm87n58',
+ 'ibm-not-wf-P87-ibm87n57','ibm-not-wf-P87-ibm87n56',
+ 'ibm-not-wf-P87-ibm87n55','ibm-not-wf-P87-ibm87n54',
+ 'ibm-not-wf-P87-ibm87n53','ibm-not-wf-P87-ibm87n52',
+ 'ibm-not-wf-P87-ibm87n51','ibm-not-wf-P87-ibm87n50',
+ 'ibm-not-wf-P87-ibm87n49','ibm-not-wf-P87-ibm87n48',
+ 'ibm-not-wf-P87-ibm87n47','ibm-not-wf-P87-ibm87n46',
+ 'ibm-not-wf-P87-ibm87n45','ibm-not-wf-P87-ibm87n44',
+ 'ibm-not-wf-P87-ibm87n43','ibm-not-wf-P87-ibm87n42',
+ 'ibm-not-wf-P87-ibm87n41','ibm-not-wf-P87-ibm87n40',
+ 'ibm-not-wf-P87-ibm87n39','ibm-not-wf-P87-ibm87n38',
+ 'ibm-not-wf-P87-ibm87n37','ibm-not-wf-P87-ibm87n36',
+ 'ibm-not-wf-P87-ibm87n35','ibm-not-wf-P87-ibm87n34',
+ 'ibm-not-wf-P87-ibm87n33','ibm-not-wf-P87-ibm87n32',
+ 'ibm-not-wf-P87-ibm87n31','ibm-not-wf-P87-ibm87n30',
+ 'ibm-not-wf-P87-ibm87n29','ibm-not-wf-P87-ibm87n28',
+ 'ibm-not-wf-P87-ibm87n27','ibm-not-wf-P87-ibm87n26',
+ 'ibm-not-wf-P87-ibm87n25','ibm-not-wf-P87-ibm87n24',
+ 'ibm-not-wf-P87-ibm87n23','ibm-not-wf-P87-ibm87n22',
+ 'ibm-not-wf-P87-ibm87n21','ibm-not-wf-P87-ibm87n20',
+ 'ibm-not-wf-P87-ibm87n19','ibm-not-wf-P87-ibm87n18',
+ 'ibm-not-wf-P87-ibm87n17','ibm-not-wf-P87-ibm87n16',
+ 'ibm-not-wf-P87-ibm87n15','ibm-not-wf-P87-ibm87n14',
+ 'ibm-not-wf-P87-ibm87n13','ibm-not-wf-P87-ibm87n12',
+ 'ibm-not-wf-P87-ibm87n11','ibm-not-wf-P87-ibm87n10',
+ 'ibm-not-wf-P87-ibm87n09','ibm-not-wf-P87-ibm87n08',
+ 'ibm-not-wf-P87-ibm87n07','ibm-not-wf-P87-ibm87n06',
+ 'ibm-not-wf-P87-ibm87n05','ibm-not-wf-P87-ibm87n04',
+ 'ibm-not-wf-P87-ibm87n03','ibm-not-wf-P87-ibm87n02',
+ 'ibm-not-wf-P87-ibm87n01','ibm-not-wf-P86-ibm86n04',
+ 'ibm-not-wf-P86-ibm86n03','ibm-not-wf-P86-ibm86n02',
+ 'ibm-not-wf-P86-ibm86n01','ibm-not-wf-P85-ibm85n99',
+ 'ibm-not-wf-P85-ibm85n98','ibm-not-wf-P85-ibm85n97',
+ 'ibm-not-wf-P85-ibm85n96','ibm-not-wf-P85-ibm85n95',
+ 'ibm-not-wf-P85-ibm85n94','ibm-not-wf-P85-ibm85n93',
+ 'ibm-not-wf-P85-ibm85n92','ibm-not-wf-P85-ibm85n91',
+ 'ibm-not-wf-P85-ibm85n90','ibm-not-wf-P85-ibm85n89',
+ 'ibm-not-wf-P85-ibm85n88','ibm-not-wf-P85-ibm85n87',
+ 'ibm-not-wf-P85-ibm85n86','ibm-not-wf-P85-ibm85n85',
+ 'ibm-not-wf-P85-ibm85n84','ibm-not-wf-P85-ibm85n83',
+ 'ibm-not-wf-P85-ibm85n82','ibm-not-wf-P85-ibm85n81',
+ 'ibm-not-wf-P85-ibm85n80','ibm-not-wf-P85-ibm85n79',
+ 'ibm-not-wf-P85-ibm85n78','ibm-not-wf-P85-ibm85n77',
+ 'ibm-not-wf-P85-ibm85n76','ibm-not-wf-P85-ibm85n75',
+ 'ibm-not-wf-P85-ibm85n74','ibm-not-wf-P85-ibm85n73',
+ 'ibm-not-wf-P85-ibm85n72','ibm-not-wf-P85-ibm85n71',
+ 'ibm-not-wf-P85-ibm85n70','ibm-not-wf-P85-ibm85n69',
+ 'ibm-not-wf-P85-ibm85n68','ibm-not-wf-P85-ibm85n67',
+ 'ibm-not-wf-P85-ibm85n66','ibm-not-wf-P85-ibm85n65',
+ 'ibm-not-wf-P85-ibm85n64','ibm-not-wf-P85-ibm85n63',
+ 'ibm-not-wf-P85-ibm85n62','ibm-not-wf-P85-ibm85n61',
+ 'ibm-not-wf-P85-ibm85n60','ibm-not-wf-P85-ibm85n59',
+ 'ibm-not-wf-P85-ibm85n58','ibm-not-wf-P85-ibm85n57',
+ 'ibm-not-wf-P85-ibm85n56','ibm-not-wf-P85-ibm85n55',
+ 'ibm-not-wf-P85-ibm85n54','ibm-not-wf-P85-ibm85n53',
+ 'ibm-not-wf-P85-ibm85n52','ibm-not-wf-P85-ibm85n51',
+ 'ibm-not-wf-P85-ibm85n50','ibm-not-wf-P85-ibm85n49',
+ 'ibm-not-wf-P85-ibm85n48','ibm-not-wf-P85-ibm85n47',
+ 'ibm-not-wf-P85-ibm85n46','ibm-not-wf-P85-ibm85n45',
+ 'ibm-not-wf-P85-ibm85n44','ibm-not-wf-P85-ibm85n43',
+ 'ibm-not-wf-P85-ibm85n42','ibm-not-wf-P85-ibm85n41',
+ 'ibm-not-wf-P85-ibm85n40','ibm-not-wf-P85-ibm85n39',
+ 'ibm-not-wf-P85-ibm85n38','ibm-not-wf-P85-ibm85n37',
+ 'ibm-not-wf-P85-ibm85n36','ibm-not-wf-P85-ibm85n35',
+ 'ibm-not-wf-P85-ibm85n34','ibm-not-wf-P85-ibm85n33',
+ 'ibm-not-wf-P85-ibm85n32','ibm-not-wf-P85-ibm85n31',
+ 'ibm-not-wf-P85-ibm85n30','ibm-not-wf-P85-ibm85n29',
+ 'ibm-not-wf-P85-ibm85n28','ibm-not-wf-P85-ibm85n27',
+ 'ibm-not-wf-P85-ibm85n26','ibm-not-wf-P85-ibm85n25',
+ 'ibm-not-wf-P85-ibm85n24','ibm-not-wf-P85-ibm85n23',
+ 'ibm-not-wf-P85-ibm85n22','ibm-not-wf-P85-ibm85n21',
+ 'ibm-not-wf-P85-ibm85n20','ibm-not-wf-P85-ibm85n198',
+ 'ibm-not-wf-P85-ibm85n197','ibm-not-wf-P85-ibm85n196',
+ 'ibm-not-wf-P85-ibm85n195','ibm-not-wf-P85-ibm85n194',
+ 'ibm-not-wf-P85-ibm85n193','ibm-not-wf-P85-ibm85n192',
+ 'ibm-not-wf-P85-ibm85n191','ibm-not-wf-P85-ibm85n190',
+ 'ibm-not-wf-P85-ibm85n19','ibm-not-wf-P85-ibm85n189',
+ 'ibm-not-wf-P85-ibm85n188','ibm-not-wf-P85-ibm85n187',
+ 'ibm-not-wf-P85-ibm85n186','ibm-not-wf-P85-ibm85n185',
+ 'ibm-not-wf-P85-ibm85n184','ibm-not-wf-P85-ibm85n183',
+ 'ibm-not-wf-P85-ibm85n182','ibm-not-wf-P85-ibm85n181',
+ 'ibm-not-wf-P85-ibm85n180','ibm-not-wf-P85-ibm85n18',
+ 'ibm-not-wf-P85-ibm85n179','ibm-not-wf-P85-ibm85n178',
+ 'ibm-not-wf-P85-ibm85n177','ibm-not-wf-P85-ibm85n176',
+ 'ibm-not-wf-P85-ibm85n175','ibm-not-wf-P85-ibm85n174',
+ 'ibm-not-wf-P85-ibm85n173','ibm-not-wf-P85-ibm85n172',
+ 'ibm-not-wf-P85-ibm85n171','ibm-not-wf-P85-ibm85n170',
+ 'ibm-not-wf-P85-ibm85n17','ibm-not-wf-P85-ibm85n169',
+ 'ibm-not-wf-P85-ibm85n168','ibm-not-wf-P85-ibm85n167',
+ 'ibm-not-wf-P85-ibm85n166','ibm-not-wf-P85-ibm85n165',
+ 'ibm-not-wf-P85-ibm85n164','ibm-not-wf-P85-ibm85n163',
+ 'ibm-not-wf-P85-ibm85n162','ibm-not-wf-P85-ibm85n161',
+ 'ibm-not-wf-P85-ibm85n160','ibm-not-wf-P85-ibm85n16',
+ 'ibm-not-wf-P85-ibm85n159','ibm-not-wf-P85-ibm85n158',
+ 'ibm-not-wf-P85-ibm85n157','ibm-not-wf-P85-ibm85n156',
+ 'ibm-not-wf-P85-ibm85n155','ibm-not-wf-P85-ibm85n154',
+ 'ibm-not-wf-P85-ibm85n153','ibm-not-wf-P85-ibm85n152',
+ 'ibm-not-wf-P85-ibm85n151','ibm-not-wf-P85-ibm85n150',
+ 'ibm-not-wf-P85-ibm85n15','ibm-not-wf-P85-ibm85n149',
+ 'ibm-not-wf-P85-ibm85n148','ibm-not-wf-P85-ibm85n147',
+ 'ibm-not-wf-P85-ibm85n146','ibm-not-wf-P85-ibm85n145',
+ 'ibm-not-wf-P85-ibm85n144','ibm-not-wf-P85-ibm85n143',
+ 'ibm-not-wf-P85-ibm85n142','ibm-not-wf-P85-ibm85n141',
+ 'ibm-not-wf-P85-ibm85n140','ibm-not-wf-P85-ibm85n14',
+ 'ibm-not-wf-P85-ibm85n139','ibm-not-wf-P85-ibm85n138',
+ 'ibm-not-wf-P85-ibm85n137','ibm-not-wf-P85-ibm85n136',
+ 'ibm-not-wf-P85-ibm85n135','ibm-not-wf-P85-ibm85n134',
+ 'ibm-not-wf-P85-ibm85n133','ibm-not-wf-P85-ibm85n132',
+ 'ibm-not-wf-P85-ibm85n131','ibm-not-wf-P85-ibm85n130',
+ 'ibm-not-wf-P85-ibm85n13','ibm-not-wf-P85-ibm85n129',
+ 'ibm-not-wf-P85-ibm85n128','ibm-not-wf-P85-ibm85n127',
+ 'ibm-not-wf-P85-ibm85n126','ibm-not-wf-P85-ibm85n125',
+ 'ibm-not-wf-P85-ibm85n124','ibm-not-wf-P85-ibm85n123',
+ 'ibm-not-wf-P85-ibm85n122','ibm-not-wf-P85-ibm85n121',
+ 'ibm-not-wf-P85-ibm85n120','ibm-not-wf-P85-ibm85n12',
+ 'ibm-not-wf-P85-ibm85n119','ibm-not-wf-P85-ibm85n118',
+ 'ibm-not-wf-P85-ibm85n117','ibm-not-wf-P85-ibm85n116',
+ 'ibm-not-wf-P85-ibm85n115','ibm-not-wf-P85-ibm85n114',
+ 'ibm-not-wf-P85-ibm85n113','ibm-not-wf-P85-ibm85n112',
+ 'ibm-not-wf-P85-ibm85n111','ibm-not-wf-P85-ibm85n110',
+ 'ibm-not-wf-P85-ibm85n11','ibm-not-wf-P85-ibm85n109',
+ 'ibm-not-wf-P85-ibm85n108','ibm-not-wf-P85-ibm85n107',
+ 'ibm-not-wf-P85-ibm85n106','ibm-not-wf-P85-ibm85n105',
+ 'ibm-not-wf-P85-ibm85n104','ibm-not-wf-P85-ibm85n103',
+ 'ibm-not-wf-P85-ibm85n102','ibm-not-wf-P85-ibm85n101',
+ 'ibm-not-wf-P85-ibm85n100','ibm-not-wf-P85-ibm85n10',
+ 'ibm-not-wf-P85-ibm85n09','ibm-not-wf-P85-ibm85n08',
+ 'ibm-not-wf-P85-ibm85n07','ibm-not-wf-P85-ibm85n06',
+ 'ibm-not-wf-P85-ibm85n05','ibm-not-wf-P85-ibm85n04',
+ 'ibm-not-wf-P85-ibm85n03','ibm-not-wf-P85-ibm85n02',
+ 'ibm-not-wf-P85-ibm85n01','ibm-not-wf-P83-ibm83n06',
+ 'ibm-not-wf-P83-ibm83n05','ibm-not-wf-P83-ibm83n04',
+ 'ibm-not-wf-P83-ibm83n03','ibm-not-wf-P83-ibm83n02',
+ 'ibm-not-wf-P83-ibm83n01','ibm-not-wf-P82-ibm82n08',
+ 'ibm-not-wf-P82-ibm82n07','ibm-not-wf-P82-ibm82n06',
+ 'ibm-not-wf-P82-ibm82n05','ibm-not-wf-P82-ibm82n04',
+ 'ibm-not-wf-P82-ibm82n03','ibm-not-wf-P82-ibm82n02',
+ 'ibm-not-wf-P82-ibm82n01','ibm-not-wf-P81-ibm81n09',
+ 'ibm-not-wf-P81-ibm81n08','ibm-not-wf-P81-ibm81n07',
+ 'ibm-not-wf-P81-ibm81n06','ibm-not-wf-P81-ibm81n05',
+ 'ibm-not-wf-P81-ibm81n04','ibm-not-wf-P81-ibm81n03',
+ 'ibm-not-wf-P81-ibm81n02','ibm-not-wf-P81-ibm81n01',
+ 'ibm-not-wf-P80-ibm80n06','ibm-not-wf-P80-ibm80n05',
+ 'ibm-not-wf-P80-ibm80n04','ibm-not-wf-P80-ibm80n03',
+ 'ibm-not-wf-P80-ibm80n02','ibm-not-wf-P80-ibm80n01',
+ 'ibm-not-wf-P79-ibm79n02','ibm-not-wf-P79-ibm79n01',
+ 'ibm-not-wf-P78-ibm78n02','ibm-not-wf-P78-ibm78n01',
+ 'ibm-not-wf-P77-ibm77n04','ibm-not-wf-P77-ibm77n03',
+ 'ibm-not-wf-P77-ibm77n02','ibm-not-wf-P77-ibm77n01',
+ 'ibm-not-wf-P76-ibm76n07','ibm-not-wf-P76-ibm76n06',
+ 'ibm-not-wf-P76-ibm76n05','ibm-not-wf-P76-ibm76n04',
+ 'ibm-not-wf-P76-ibm76n03','ibm-not-wf-P76-ibm76n02',
+ 'ibm-not-wf-P76-ibm76n01','ibm-not-wf-P75-ibm75n13',
+ 'ibm-not-wf-P75-ibm75n12','ibm-not-wf-P75-ibm75n11',
+ 'ibm-not-wf-P75-ibm75n10','ibm-not-wf-P75-ibm75n09',
+ 'ibm-not-wf-P75-ibm75n08','ibm-not-wf-P75-ibm75n07',
+ 'ibm-not-wf-P75-ibm75n06','ibm-not-wf-P75-ibm75n05',
+ 'ibm-not-wf-P75-ibm75n04','ibm-not-wf-P75-ibm75n03',
+ 'ibm-not-wf-P75-ibm75n02','ibm-not-wf-P75-ibm75n01',
+ 'ibm-not-wf-P74-ibm74n01','ibm-not-wf-P73-ibm73n03',
+ 'ibm-not-wf-P73-ibm73n01','ibm-not-wf-P72-ibm72n09',
+ 'ibm-not-wf-P72-ibm72n08','ibm-not-wf-P72-ibm72n07',
+ 'ibm-not-wf-P72-ibm72n06','ibm-not-wf-P72-ibm72n05',
+ 'ibm-not-wf-P72-ibm72n04','ibm-not-wf-P72-ibm72n03',
+ 'ibm-not-wf-P72-ibm72n02','ibm-not-wf-P72-ibm72n01',
+ 'ibm-not-wf-P71-ibm71n08','ibm-not-wf-P71-ibm71n07',
+ 'ibm-not-wf-P71-ibm71n06','ibm-not-wf-P71-ibm71n05',
+ 'ibm-not-wf-P71-ibm71n04','ibm-not-wf-P71-ibm71n03',
+ 'ibm-not-wf-P71-ibm71n02','ibm-not-wf-P71-ibm71n01',
+ 'ibm-not-wf-P71-ibm70n01','ibm-not-wf-P69-ibm69n07',
+ 'ibm-not-wf-P69-ibm69n06','ibm-not-wf-P69-ibm69n05',
+ 'ibm-not-wf-P69-ibm69n04','ibm-not-wf-P69-ibm69n03',
+ 'ibm-not-wf-P69-ibm69n02','ibm-not-wf-P69-ibm69n01',
+ 'ibm-not-wf-P68-ibm68n10','ibm-not-wf-P68-ibm68n09',
+ 'ibm-not-wf-P68-ibm68n08','ibm-not-wf-P68-ibm68n07',
+ 'ibm-not-wf-P68-ibm68n06','ibm-not-wf-P68-ibm68n05',
+ 'ibm-not-wf-P68-ibm68n04','ibm-not-wf-P68-ibm68n03',
+ 'ibm-not-wf-P68-ibm68n02','ibm-not-wf-P68-ibm68n01',
+ 'ibm-not-wf-P66-ibm66n15','ibm-not-wf-P66-ibm66n14',
+ 'ibm-not-wf-P66-ibm66n13','ibm-not-wf-P66-ibm66n12',
+ 'ibm-not-wf-P66-ibm66n11','ibm-not-wf-P66-ibm66n10',
+ 'ibm-not-wf-P66-ibm66n09','ibm-not-wf-P66-ibm66n08',
+ 'ibm-not-wf-P66-ibm66n07','ibm-not-wf-P66-ibm66n06',
+ 'ibm-not-wf-P66-ibm66n05','ibm-not-wf-P66-ibm66n04',
+ 'ibm-not-wf-P66-ibm66n03','ibm-not-wf-P66-ibm66n02',
+ 'ibm-not-wf-P66-ibm66n01','ibm-not-wf-P65-ibm65n02',
+ 'ibm-not-wf-P65-ibm65n01','ibm-not-wf-P64-ibm64n03',
+ 'ibm-not-wf-P64-ibm64n02','ibm-not-wf-P64-ibm64n01',
+ 'ibm-not-wf-P63-ibm63n07','ibm-not-wf-P63-ibm63n06',
+ 'ibm-not-wf-P63-ibm63n05','ibm-not-wf-P63-ibm63n04',
+ 'ibm-not-wf-P63-ibm63n03','ibm-not-wf-P63-ibm63n02',
+ 'ibm-not-wf-P63-ibm63n01','ibm-not-wf-P62-ibm62n08',
+ 'ibm-not-wf-P62-ibm62n07','ibm-not-wf-P62-ibm62n06',
+ 'ibm-not-wf-P62-ibm62n05','ibm-not-wf-P62-ibm62n04',
+ 'ibm-not-wf-P62-ibm62n03','ibm-not-wf-P62-ibm62n02',
+ 'ibm-not-wf-P62-ibm62n01','ibm-not-wf-P61-ibm61n01',
+ 'ibm-not-wf-P60-ibm60n08','ibm-not-wf-P60-ibm60n07',
+ 'ibm-not-wf-P60-ibm60n06','ibm-not-wf-P60-ibm60n05',
+ 'ibm-not-wf-P60-ibm60n04','ibm-not-wf-P60-ibm60n03',
+ 'ibm-not-wf-P60-ibm60n02','ibm-not-wf-P60-ibm60n01',
+ 'ibm-not-wf-P59-ibm59n06','ibm-not-wf-P59-ibm59n05',
+ 'ibm-not-wf-P59-ibm59n04','ibm-not-wf-P59-ibm59n03',
+ 'ibm-not-wf-P59-ibm59n02','ibm-not-wf-P59-ibm59n01',
+ 'ibm-not-wf-P58-ibm58n08','ibm-not-wf-P58-ibm58n07',
+ 'ibm-not-wf-P58-ibm58n06','ibm-not-wf-P58-ibm58n05',
+ 'ibm-not-wf-P58-ibm58n04','ibm-not-wf-P58-ibm58n03',
+ 'ibm-not-wf-P58-ibm58n02','ibm-not-wf-P58-ibm58n01',
+ 'ibm-not-wf-P57-ibm57n01','ibm-not-wf-P56-ibm56n07',
+ 'ibm-not-wf-P56-ibm56n06','ibm-not-wf-P56-ibm56n05',
+ 'ibm-not-wf-P56-ibm56n04','ibm-not-wf-P56-ibm56n03',
+ 'ibm-not-wf-P56-ibm56n02','ibm-not-wf-P56-ibm56n01',
+ 'ibm-not-wf-P55-ibm55n03','ibm-not-wf-P55-ibm55n02',
+ 'ibm-not-wf-P55-ibm55n01','ibm-not-wf-P54-ibm54n02',
+ 'ibm-not-wf-P54-ibm54n01','ibm-not-wf-P53-ibm53n08',
+ 'ibm-not-wf-P53-ibm53n07','ibm-not-wf-P53-ibm53n06',
+ 'ibm-not-wf-P53-ibm53n05','ibm-not-wf-P53-ibm53n04',
+ 'ibm-not-wf-P53-ibm53n03','ibm-not-wf-P53-ibm53n02',
+ 'ibm-not-wf-P53-ibm53n01','ibm-not-wf-P52-ibm52n06',
+ 'ibm-not-wf-P52-ibm52n05','ibm-not-wf-P52-ibm52n04',
+ 'ibm-not-wf-P52-ibm52n03','ibm-not-wf-P52-ibm52n02',
+ 'ibm-not-wf-P52-ibm52n01','ibm-not-wf-P51-ibm51n07',
+ 'ibm-not-wf-P51-ibm51n06','ibm-not-wf-P51-ibm51n05',
+ 'ibm-not-wf-P51-ibm51n04','ibm-not-wf-P51-ibm51n03',
+ 'ibm-not-wf-P51-ibm51n02','ibm-not-wf-P51-ibm51n01',
+ 'ibm-not-wf-P50-ibm50n07','ibm-not-wf-P50-ibm50n06',
+ 'ibm-not-wf-P50-ibm50n05','ibm-not-wf-P50-ibm50n04',
+ 'ibm-not-wf-P50-ibm50n03','ibm-not-wf-P50-ibm50n02',
+ 'ibm-not-wf-P50-ibm50n01','ibm-not-wf-P49-ibm49n06',
+ 'ibm-not-wf-P49-ibm49n05','ibm-not-wf-P49-ibm49n04',
+ 'ibm-not-wf-P49-ibm49n03','ibm-not-wf-P49-ibm49n02',
+ 'ibm-not-wf-P49-ibm49n01','ibm-not-wf-P48-ibm48n07',
+ 'ibm-not-wf-P48-ibm48n06','ibm-not-wf-P48-ibm48n05',
+ 'ibm-not-wf-P48-ibm48n04','ibm-not-wf-P48-ibm48n03',
+ 'ibm-not-wf-P48-ibm48n02','ibm-not-wf-P48-ibm48n01',
+ 'ibm-not-wf-P47-ibm47n06','ibm-not-wf-P47-ibm47n05',
+ 'ibm-not-wf-P47-ibm47n04','ibm-not-wf-P47-ibm47n03',
+ 'ibm-not-wf-P47-ibm47n02','ibm-not-wf-P47-ibm47n01',
+ 'ibm-not-wf-P46-ibm46n05','ibm-not-wf-P46-ibm46n04',
+ 'ibm-not-wf-P46-ibm46n03','ibm-not-wf-P46-ibm46n02',
+ 'ibm-not-wf-P46-ibm46n01','ibm-not-wf-P45-ibm45n09',
+ 'ibm-not-wf-P45-ibm45n08','ibm-not-wf-P45-ibm45n07',
+ 'ibm-not-wf-P45-ibm45n06','ibm-not-wf-P45-ibm45n05',
+ 'ibm-not-wf-P45-ibm45n04','ibm-not-wf-P45-ibm45n03',
+ 'ibm-not-wf-P45-ibm45n02','ibm-not-wf-P45-ibm45n01',
+ 'ibm-not-wf-P44-ibm44n04','ibm-not-wf-P44-ibm44n03',
+ 'ibm-not-wf-P44-ibm44n02','ibm-not-wf-P44-ibm44n01',
+ 'ibm-not-wf-P43-ibm43n05','ibm-not-wf-P43-ibm43n04',
+ 'ibm-not-wf-P43-ibm43n02','ibm-not-wf-P43-ibm43n01',
+ 'ibm-not-wf-P42-ibm42n05','ibm-not-wf-P42-ibm42n04',
+ 'ibm-not-wf-P42-ibm42n03','ibm-not-wf-P42-ibm42n02',
+ 'ibm-not-wf-P42-ibm42n01','ibm-not-wf-P41-ibm41n14',
+ 'ibm-not-wf-P41-ibm41n13','ibm-not-wf-P41-ibm41n12',
+ 'ibm-not-wf-P41-ibm41n11','ibm-not-wf-P41-ibm41n10',
+ 'ibm-not-wf-P41-ibm41n09','ibm-not-wf-P41-ibm41n08',
+ 'ibm-not-wf-P41-ibm41n07','ibm-not-wf-P41-ibm41n06',
+ 'ibm-not-wf-P41-ibm41n05','ibm-not-wf-P41-ibm41n04',
+ 'ibm-not-wf-P41-ibm41n03','ibm-not-wf-P41-ibm41n02',
+ 'ibm-not-wf-P41-ibm41n01','ibm-not-wf-P40-ibm40n05',
+ 'ibm-not-wf-P40-ibm40n04','ibm-not-wf-P40-ibm40n03',
+ 'ibm-not-wf-P40-ibm40n02','ibm-not-wf-P40-ibm40n01',
+ 'ibm-not-wf-P39-ibm39n06','ibm-not-wf-P39-ibm39n05',
+ 'ibm-not-wf-P39-ibm39n04','ibm-not-wf-P39-ibm39n03',
+ 'ibm-not-wf-P39-ibm39n02','ibm-not-wf-P39-ibm39n01',
+ 'ibm-not-wf-P32-ibm32n09','ibm-not-wf-P32-ibm32n08',
+ 'ibm-not-wf-P32-ibm32n07','ibm-not-wf-P32-ibm32n06',
+ 'ibm-not-wf-P32-ibm32n05','ibm-not-wf-P32-ibm32n04',
+ 'ibm-not-wf-P32-ibm32n03','ibm-not-wf-P32-ibm32n02',
+ 'ibm-not-wf-P32-ibm32n01','ibm-not-wf-P31-ibm31n01',
+ 'ibm-not-wf-P30-ibm30n01','ibm-not-wf-P29-ibm29n07',
+ 'ibm-not-wf-P29-ibm29n06','ibm-not-wf-P29-ibm29n05',
+ 'ibm-not-wf-P29-ibm29n04','ibm-not-wf-P29-ibm29n03',
+ 'ibm-not-wf-P29-ibm29n02','ibm-not-wf-P29-ibm29n01',
+ 'ibm-not-wf-P28a-ibm28an01','ibm-not-wf-P28-ibm28n08',
+ 'ibm-not-wf-P28-ibm28n07','ibm-not-wf-P28-ibm28n06',
+ 'ibm-not-wf-P28-ibm28n05','ibm-not-wf-P28-ibm28n04',
+ 'ibm-not-wf-P28-ibm28n03','ibm-not-wf-P28-ibm28n02',
+ 'ibm-not-wf-P28-ibm28n01','ibm-not-wf-P27-ibm27n01',
+ 'ibm-not-wf-P26-ibm26n01','ibm-not-wf-P25-ibm25n02',
+ 'ibm-not-wf-P25-ibm25n01','ibm-not-wf-P24-ibm24n09',
+ 'ibm-not-wf-P24-ibm24n08','ibm-not-wf-P24-ibm24n07',
+ 'ibm-not-wf-P24-ibm24n06','ibm-not-wf-P24-ibm24n05',
+ 'ibm-not-wf-P24-ibm24n04','ibm-not-wf-P24-ibm24n03',
+ 'ibm-not-wf-P24-ibm24n02','ibm-not-wf-P24-ibm24n01',
+ 'ibm-not-wf-P23-ibm23n06','ibm-not-wf-P23-ibm23n05',
+ 'ibm-not-wf-P23-ibm23n04','ibm-not-wf-P23-ibm23n03',
+ 'ibm-not-wf-P23-ibm23n02','ibm-not-wf-P23-ibm23n01',
+ 'ibm-not-wf-P22-ibm22n03','ibm-not-wf-P22-ibm22n02',
+ 'ibm-not-wf-P22-ibm22n01','ibm-not-wf-P21-ibm21n03',
+ 'ibm-not-wf-P21-ibm21n02','ibm-not-wf-P21-ibm21n01',
+ 'ibm-not-wf-P20-ibm20n01','ibm-not-wf-P19-ibm19n03',
+ 'ibm-not-wf-P19-ibm19n02','ibm-not-wf-P19-ibm19n01',
+ 'ibm-not-wf-P18-ibm18n02','ibm-not-wf-P18-ibm18n01',
+ 'ibm-not-wf-P17-ibm17n04','ibm-not-wf-P17-ibm17n03',
+ 'ibm-not-wf-P17-ibm17n02','ibm-not-wf-P17-ibm17n01',
+ 'ibm-not-wf-P16-ibm16n04','ibm-not-wf-P16-ibm16n03',
+ 'ibm-not-wf-P16-ibm16n02','ibm-not-wf-P16-ibm16n01',
+ 'ibm-not-wf-P15-ibm15n04','ibm-not-wf-P15-ibm15n03',
+ 'ibm-not-wf-P15-ibm15n02','ibm-not-wf-P15-ibm15n01',
+ 'ibm-not-wf-P14-ibm14n03','ibm-not-wf-P14-ibm14n02',
+ 'ibm-not-wf-P14-ibm14n01','ibm-not-wf-P13-ibm13n03',
+ 'ibm-not-wf-P13-ibm13n02','ibm-not-wf-P13-ibm13n01',
+ 'ibm-not-wf-P12-ibm12n03','ibm-not-wf-P12-ibm12n02',
+ 'ibm-not-wf-P12-ibm12n01','ibm-not-wf-P11-ibm11n04',
+ 'ibm-not-wf-P11-ibm11n03','ibm-not-wf-P11-ibm11n02',
+ 'ibm-not-wf-P11-ibm11n01','ibm-not-wf-P10-ibm10n08',
+ 'ibm-not-wf-P10-ibm10n07','ibm-not-wf-P10-ibm10n06',
+ 'ibm-not-wf-P10-ibm10n05','ibm-not-wf-P10-ibm10n04',
+ 'ibm-not-wf-P10-ibm10n03','ibm-not-wf-P10-ibm10n02',
+ 'ibm-not-wf-P10-ibm10n01','ibm-not-wf-P09-ibm09n04',
+ 'ibm-not-wf-P09-ibm09n03','ibm-not-wf-P09-ibm09n02',
+ 'ibm-not-wf-P09-ibm09n01','ibm-not-wf-P05-ibm05n03',
+ 'ibm-not-wf-P05-ibm05n02','ibm-not-wf-P05-ibm05n01',
+ 'ibm-not-wf-P04-ibm04n18','ibm-not-wf-P04-ibm04n17',
+ 'ibm-not-wf-P04-ibm04n16','ibm-not-wf-P04-ibm04n15',
+ 'ibm-not-wf-P04-ibm04n14','ibm-not-wf-P04-ibm04n13',
+ 'ibm-not-wf-P04-ibm04n12','ibm-not-wf-P04-ibm04n11',
+ 'ibm-not-wf-P04-ibm04n10','ibm-not-wf-P04-ibm04n09',
+ 'ibm-not-wf-P04-ibm04n08','ibm-not-wf-P04-ibm04n07',
+ 'ibm-not-wf-P04-ibm04n06','ibm-not-wf-P04-ibm04n05',
+ 'ibm-not-wf-P04-ibm04n04','ibm-not-wf-P04-ibm04n03',
+ 'ibm-not-wf-P04-ibm04n02','ibm-not-wf-P04-ibm04n01',
+ 'ibm-not-wf-P03-ibm03n01','ibm-not-wf-P02-ibm02n33',
+ 'ibm-not-wf-P02-ibm02n32','ibm-not-wf-P02-ibm02n31',
+ 'ibm-not-wf-P02-ibm02n30','ibm-not-wf-P02-ibm02n29',
+ 'ibm-not-wf-P02-ibm02n28','ibm-not-wf-P02-ibm02n27',
+ 'ibm-not-wf-P02-ibm02n26','ibm-not-wf-P02-ibm02n25',
+ 'ibm-not-wf-P02-ibm02n24','ibm-not-wf-P02-ibm02n23',
+ 'ibm-not-wf-P02-ibm02n22','ibm-not-wf-P02-ibm02n21',
+ 'ibm-not-wf-P02-ibm02n20','ibm-not-wf-P02-ibm02n19',
+ 'ibm-not-wf-P02-ibm02n18','ibm-not-wf-P02-ibm02n17',
+ 'ibm-not-wf-P02-ibm02n16','ibm-not-wf-P02-ibm02n15',
+ 'ibm-not-wf-P02-ibm02n14','ibm-not-wf-P02-ibm02n13',
+ 'ibm-not-wf-P02-ibm02n12','ibm-not-wf-P02-ibm02n11',
+ 'ibm-not-wf-P02-ibm02n10','ibm-not-wf-P02-ibm02n09',
+ 'ibm-not-wf-P02-ibm02n08','ibm-not-wf-P02-ibm02n07',
+ 'ibm-not-wf-P02-ibm02n06','ibm-not-wf-P02-ibm02n05',
+ 'ibm-not-wf-P02-ibm02n04','ibm-not-wf-P02-ibm02n03',
+ 'ibm-not-wf-P02-ibm02n02','ibm-not-wf-P02-ibm02n01',
+ 'ibm-not-wf-P01-ibm01n03','ibm-not-wf-P01-ibm01n02',
+ 'ibm-not-wf-P01-ibm01n01'].
+
+'ibm-valid'(suite) ->
+ %% 149 test cases
+ ['ibm-valid-P89-ibm89v01','ibm-valid-P88-ibm88v01',
+ 'ibm-valid-P87-ibm87v01','ibm-valid-P86-ibm86v01',
+ 'ibm-valid-P85-ibm85v01','ibm-valid-P82-ibm82v01',
+ 'ibm-valid-P79-ibm79v01','ibm-valid-P78-ibm78v01',
+ 'ibm-valid-P70-ibm70v01','ibm-valid-P69-ibm69v02',
+ 'ibm-valid-P69-ibm69v01','ibm-valid-P68-ibm68v02',
+ 'ibm-valid-P68-ibm68v01','ibm-valid-P67-ibm67v01',
+ 'ibm-valid-P66-ibm66v01','ibm-valid-P65-ibm65v02',
+ 'ibm-valid-P65-ibm65v01','ibm-valid-P64-ibm64v03',
+ 'ibm-valid-P64-ibm64v02','ibm-valid-P64-ibm64v01',
+ 'ibm-valid-P63-ibm63v05','ibm-valid-P63-ibm63v04',
+ 'ibm-valid-P63-ibm63v03','ibm-valid-P63-ibm63v02',
+ 'ibm-valid-P63-ibm63v01','ibm-valid-P62-ibm62v05',
+ 'ibm-valid-P62-ibm62v04','ibm-valid-P62-ibm62v03',
+ 'ibm-valid-P62-ibm62v02','ibm-valid-P62-ibm62v01',
+ 'ibm-valid-P61-ibm61v02','ibm-valid-P61-ibm61v01',
+ 'ibm-valid-P60-ibm60v04','ibm-valid-P60-ibm60v03',
+ 'ibm-valid-P60-ibm60v02','ibm-valid-P60-ibm60v01',
+ 'ibm-valid-P59-ibm59v02','ibm-valid-P59-ibm59v01',
+ 'ibm-valid-P58-ibm58v02','ibm-valid-P58-ibm58v01',
+ 'ibm-valid-P57-ibm57v01','ibm-valid-P56-ibm56v10',
+ 'ibm-valid-P56-ibm56v09','ibm-valid-P56-ibm56v08',
+ 'ibm-valid-P56-ibm56v07','ibm-valid-P56-ibm56v06',
+ 'ibm-valid-P56-ibm56v05','ibm-valid-P56-ibm56v04',
+ 'ibm-valid-P56-ibm56v03','ibm-valid-P56-ibm56v02',
+ 'ibm-valid-P56-ibm56v01','ibm-valid-P55-ibm55v01',
+ 'ibm-valid-P54-ibm54v03','ibm-valid-P54-ibm54v02',
+ 'ibm-valid-P54-ibm54v01','ibm-valid-P52-ibm52v01',
+ 'ibm-valid-P51-ibm51v02','ibm-valid-P51-ibm51v01',
+ 'ibm-valid-P50-ibm50v01','ibm-valid-P49-ibm49v01',
+ 'ibm-valid-P47-ibm47v01','ibm-valid-P45-ibm45v01',
+ 'ibm-valid-P44-ibm44v01','ibm-valid-P43-ibm43v01',
+ 'ibm-valid-P42-ibm42v01','ibm-valid-P41-ibm41v01',
+ 'ibm-valid-P40-ibm40v01','ibm-valid-P39-ibm39v01',
+ 'ibm-valid-P38-ibm38v01','ibm-valid-P37-ibm37v01',
+ 'ibm-valid-P36-ibm36v01','ibm-valid-P35-ibm35v01',
+ 'ibm-valid-P34-ibm34v01','ibm-valid-P33-ibm33v01',
+ 'ibm-valid-P32-ibm32v04','ibm-valid-P32-ibm32v03',
+ 'ibm-valid-P32-ibm32v02','ibm-valid-P32-ibm32v01',
+ 'ibm-valid-P31-ibm31v01','ibm-valid-P30-ibm30v02',
+ 'ibm-valid-P30-ibm30v01','ibm-valid-P29-ibm29v02',
+ 'ibm-valid-P29-ibm29v01','ibm-valid-P28-ibm28v02',
+ 'ibm-valid-P28-ibm28v01','ibm-valid-P27-ibm27v03',
+ 'ibm-valid-P27-ibm27v02','ibm-valid-P27-ibm27v01',
+ 'ibm-valid-P26-ibm26v01','ibm-valid-P25-ibm25v04',
+ 'ibm-valid-P25-ibm25v03','ibm-valid-P25-ibm25v02',
+ 'ibm-valid-P25-ibm25v01','ibm-valid-P24-ibm24v02',
+ 'ibm-valid-P24-ibm24v01','ibm-valid-P23-ibm23v06',
+ 'ibm-valid-P23-ibm23v05','ibm-valid-P23-ibm23v04',
+ 'ibm-valid-P23-ibm23v03','ibm-valid-P23-ibm23v02',
+ 'ibm-valid-P23-ibm23v01','ibm-valid-P22-ibm22v07',
+ 'ibm-valid-P22-ibm22v06','ibm-valid-P22-ibm22v05',
+ 'ibm-valid-P22-ibm22v04','ibm-valid-P22-ibm22v03',
+ 'ibm-valid-P22-ibm22v02','ibm-valid-P22-ibm22v01',
+ 'ibm-valid-P21-ibm21v01','ibm-valid-P20-ibm20v02',
+ 'ibm-valid-P20-ibm20v01','ibm-valid-P19-ibm19v01',
+ 'ibm-valid-P18-ibm18v01','ibm-valid-P17-ibm17v01',
+ 'ibm-valid-P16-ibm16v03','ibm-valid-P16-ibm16v02',
+ 'ibm-valid-P16-ibm16v01','ibm-valid-P15-ibm15v04',
+ 'ibm-valid-P15-ibm15v03','ibm-valid-P15-ibm15v02',
+ 'ibm-valid-P15-ibm15v01','ibm-valid-P14-ibm14v03',
+ 'ibm-valid-P14-ibm14v02','ibm-valid-P14-ibm14v01',
+ 'ibm-valid-P13-ibm13v01','ibm-valid-P12-ibm12v04',
+ 'ibm-valid-P12-ibm12v03','ibm-valid-P12-ibm12v02',
+ 'ibm-valid-P12-ibm12v01','ibm-valid-P11-ibm11v04',
+ 'ibm-valid-P11-ibm11v03','ibm-valid-P11-ibm11v02',
+ 'ibm-valid-P11-ibm11v01','ibm-valid-P10-ibm10v08',
+ 'ibm-valid-P10-ibm10v07','ibm-valid-P10-ibm10v06',
+ 'ibm-valid-P10-ibm10v05','ibm-valid-P10-ibm10v04',
+ 'ibm-valid-P10-ibm10v03','ibm-valid-P10-ibm10v02',
+ 'ibm-valid-P10-ibm10v01','ibm-valid-P09-ibm09v05',
+ 'ibm-valid-P09-ibm09v04','ibm-valid-P09-ibm09v03',
+ 'ibm-valid-P09-ibm09v02','ibm-valid-P09-ibm09v01',
+ 'ibm-valid-P03-ibm03v01','ibm-valid-P02-ibm02v01',
+ 'ibm-valid-P01-ibm01v01'].
+
+%%----------------------------------------------------------------------
+%% Initializations
+%%----------------------------------------------------------------------
+
+init_per_suite(doc) ->
+ ["Starts the test suite"];
+init_per_suite(Config) ->
+ Dog=test_server:timetrap({minutes,10}),
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line ok=erl_tar:extract("ibm.tgz",[compressed]),
+ ?line ok=erl_tar:extract("japanese.tgz",[compressed]),
+ ?line ok=erl_tar:extract("oasis.tgz",[compressed]),
+ ?line ok=erl_tar:extract("sun.tgz",[compressed]),
+ ?line ok=erl_tar:extract("xmltest.tgz",[compressed]),
+ ?line ok = change_mode(["ibm","japanese","oasis",
+ "sun","xmltest"]),
+ [{watchdog, Dog}|Config].
+
+
+-ifndef(dont_rm_test_dirs).
+end_per_suite(doc) ->
+ ["Stops the test suite"];
+end_per_suite(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line ok=rm_files(["ibm","japanese","oasis","sun","xmltest"]),
+ Dog=?config(watchdog, Config),
+ test_server:timetrap_cancel(Dog),
+ lists:keydelete(watchdog,1,Config).
+
+-else.
+end_per_suite(doc) ->
+ ["Stops the test suite"];
+end_per_suite(Config) ->
+ Dog=?config(watchdog, Config),
+ test_server:timetrap_cancel(Dog),
+ lists:keydelete(watchdog,1,Config).
+-endif.
+
+%% initialization before each testcase
+init_per_testcase(_TestCase,Config) ->
+ io:format("Config:~n~p",[Config]),
+ ?line {ok, _} = file:read_file_info(filename:join([?config(priv_dir,Config)])),
+ ?line code:add_patha(?config(priv_dir,Config)),
+ Dog=test_server:timetrap({minutes,10}),
+ [{watchdog, Dog}|Config].
+
+
+%% clean up after each testcase
+end_per_testcase(_Func,Config) ->
+ Dog=?config(watchdog, Config),
+ test_server:timetrap_cancel(Dog),
+ ok.
+
+
+%%----------------------------------------------------------------------
+%% Test cases
+%%----------------------------------------------------------------------
+'v-pe02'(suite) -> [];
+'v-pe02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"v-pe02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'v-pe03'(suite) -> [];
+'v-pe03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"v-pe03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'v-pe00'(suite) -> [];
+'v-pe00'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"v-pe00.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'v-lang06'(suite) -> [];
+'v-lang06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"v-lang06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'v-lang05'(suite) -> [];
+'v-lang05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"v-lang05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'v-lang04'(suite) -> [];
+'v-lang04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"v-lang04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'v-lang03'(suite) -> [];
+'v-lang03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"v-lang03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'v-lang02'(suite) -> [];
+'v-lang02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"v-lang02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'v-lang01'(suite) -> [];
+'v-lang01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"v-lang01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'v-sgml01'(suite) -> [];
+'v-sgml01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"v-sgml01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'sa05'(suite) -> [];
+'sa05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"sa05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'sa04'(suite) -> [];
+'sa04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"sa04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'sa03'(suite) -> [];
+'sa03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"sa03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'sa02'(suite) -> [];
+'sa02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"sa02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'sa01'(suite) -> [];
+'sa01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"sa01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'required00'(suite) -> [];
+'required00'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"required00.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'optional'(suite) -> [];
+'optional'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"optional.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'notation01'(suite) -> [];
+'notation01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"notation01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-sa04'(suite) -> [];
+'not-sa04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"not-sa04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-sa03'(suite) -> [];
+'not-sa03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"not-sa03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-sa02'(suite) -> [];
+'not-sa02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"not-sa02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-sa01'(suite) -> [];
+'not-sa01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"not-sa01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ext02'(suite) -> [];
+'ext02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"ext02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ext01'(suite) -> [];
+'ext01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"ext01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'element'(suite) -> [];
+'element'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"element.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'dtd01'(suite) -> [];
+'dtd01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"dtd01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'dtd00'(suite) -> [];
+'dtd00'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"dtd00.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'pe01'(suite) -> [];
+'pe01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"pe01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+%%----------------------------------------------------------------------
+
+'empty'(suite) -> [];
+'empty'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"empty.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'utf16l'(suite) -> [];
+'utf16l'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"utf16l.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'utf16b'(suite) -> [];
+'utf16b'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"utf16b.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attr16'(suite) -> [];
+'attr16'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attr16.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attr15'(suite) -> [];
+'attr15'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attr15.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attr14'(suite) -> [];
+'attr14'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attr14.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attr13'(suite) -> [];
+'attr13'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attr13.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attr12'(suite) -> [];
+'attr12'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attr12.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attr11'(suite) -> [];
+'attr11'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attr11.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attr10'(suite) -> [];
+'attr10'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attr10.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attr09'(suite) -> [];
+'attr09'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attr09.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attr08'(suite) -> [];
+'attr08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attr08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attr07'(suite) -> [];
+'attr07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attr07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attr06'(suite) -> [];
+'attr06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attr06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attr05'(suite) -> [];
+'attr05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attr05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attr04'(suite) -> [];
+'attr04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attr04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attr03'(suite) -> [];
+'attr03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attr03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attr02'(suite) -> [];
+'attr02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attr02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attr01'(suite) -> [];
+'attr01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attr01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'root'(suite) -> [];
+'root'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"root.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'inv-required02'(suite) -> [];
+'inv-required02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"inv-required02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'inv-required01'(suite) -> [];
+'inv-required01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"inv-required01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'inv-required00'(suite) -> [];
+'inv-required00'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"inv-required00.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'optional25'(suite) -> [];
+'optional25'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"optional25.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'optional24'(suite) -> [];
+'optional24'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"optional24.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'optional23'(suite) -> [];
+'optional23'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"optional23.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'optional22'(suite) -> [];
+'optional22'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"optional22.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'optional21'(suite) -> [];
+'optional21'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"optional21.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'optional20'(suite) -> [];
+'optional20'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"optional20.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'optional14'(suite) -> [];
+'optional14'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"optional14.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'optional13'(suite) -> [];
+'optional13'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"optional13.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'optional12'(suite) -> [];
+'optional12'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"optional12.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'optional11'(suite) -> [];
+'optional11'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"optional11.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'optional10'(suite) -> [];
+'optional10'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"optional10.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'optional09'(suite) -> [];
+'optional09'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"optional09.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'optional08'(suite) -> [];
+'optional08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"optional08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'optional07'(suite) -> [];
+'optional07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"optional07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'optional06'(suite) -> [];
+'optional06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"optional06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'optional05'(suite) -> [];
+'optional05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"optional05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'optional04'(suite) -> [];
+'optional04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"optional04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'optional03'(suite) -> [];
+'optional03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"optional03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'optional02'(suite) -> [];
+'optional02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"optional02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'optional01'(suite) -> [];
+'optional01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"optional01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'inv-not-sa14'(suite) -> [];
+'inv-not-sa14'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"inv-not-sa14.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'inv-not-sa13'(suite) -> [];
+'inv-not-sa13'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"inv-not-sa13.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'inv-not-sa12'(suite) -> [];
+'inv-not-sa12'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"inv-not-sa12.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'inv-not-sa11'(suite) -> [];
+'inv-not-sa11'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"inv-not-sa11.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'inv-not-sa10'(suite) -> [];
+'inv-not-sa10'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"inv-not-sa10.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'inv-not-sa09'(suite) -> [];
+'inv-not-sa09'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"inv-not-sa09.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'inv-not-sa08'(suite) -> [];
+'inv-not-sa08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"inv-not-sa08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'inv-not-sa07'(suite) -> [];
+'inv-not-sa07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"inv-not-sa07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'inv-not-sa06'(suite) -> [];
+'inv-not-sa06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"inv-not-sa06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'inv-not-sa05'(suite) -> [];
+'inv-not-sa05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"inv-not-sa05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'inv-not-sa04'(suite) -> [];
+'inv-not-sa04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"inv-not-sa04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'inv-not-sa02'(suite) -> [];
+'inv-not-sa02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"inv-not-sa02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'inv-not-sa01'(suite) -> [];
+'inv-not-sa01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"inv-not-sa01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'id09'(suite) -> [];
+'id09'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"id09.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'id08'(suite) -> [];
+'id08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"id08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'id07'(suite) -> [];
+'id07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"id07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'id06'(suite) -> [];
+'id06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"id06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'id05'(suite) -> [];
+'id05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"id05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'id04'(suite) -> [];
+'id04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"id04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'id03'(suite) -> [];
+'id03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"id03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'id02'(suite) -> [];
+'id02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"id02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'id01'(suite) -> [];
+'id01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"id01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'el06'(suite) -> [];
+'el06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"el06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'el05'(suite) -> [];
+'el05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"el05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'el04'(suite) -> [];
+'el04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"el04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'el03'(suite) -> [];
+'el03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"el03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'el02'(suite) -> [];
+'el02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"el02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'el01'(suite) -> [];
+'el01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"el01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'inv-dtd03'(suite) -> [];
+'inv-dtd03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"inv-dtd03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'inv-dtd02'(suite) -> [];
+'inv-dtd02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"inv-dtd02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'inv-dtd01'(suite) -> [];
+'inv-dtd01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"inv-dtd01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+%%----------------------------------------------------------------------
+
+'sgml13'(suite) -> [];
+'sgml13'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"sgml13.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'sgml12'(suite) -> [];
+'sgml12'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"sgml12.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'sgml11'(suite) -> [];
+'sgml11'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"sgml11.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'sgml10'(suite) -> [];
+'sgml10'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"sgml10.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'sgml09'(suite) -> [];
+'sgml09'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"sgml09.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'sgml08'(suite) -> [];
+'sgml08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"sgml08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'sgml07'(suite) -> [];
+'sgml07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"sgml07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'sgml06'(suite) -> [];
+'sgml06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"sgml06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'sgml05'(suite) -> [];
+'sgml05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"sgml05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'sgml04'(suite) -> [];
+'sgml04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"sgml04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'sgml03'(suite) -> [];
+'sgml03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"sgml03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'sgml02'(suite) -> [];
+'sgml02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"sgml02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'sgml01'(suite) -> [];
+'sgml01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"sgml01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'pubid05'(suite) -> [];
+'pubid05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"pubid05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'pubid04'(suite) -> [];
+'pubid04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"pubid04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'pubid03'(suite) -> [];
+'pubid03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"pubid03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'pubid02'(suite) -> [];
+'pubid02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"pubid02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'pubid01'(suite) -> [];
+'pubid01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"pubid01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'pi'(suite) -> [];
+'pi'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"pi.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'encoding07'(suite) -> [];
+'encoding07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"encoding07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'encoding06'(suite) -> [];
+'encoding06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"encoding06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'encoding05'(suite) -> [];
+'encoding05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"encoding05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'encoding04'(suite) -> [];
+'encoding04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"encoding04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'encoding03'(suite) -> [];
+'encoding03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"encoding03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'encoding02'(suite) -> [];
+'encoding02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"encoding02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'encoding01'(suite) -> [];
+'encoding01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"encoding01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'element04'(suite) -> [];
+'element04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"element04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'element03'(suite) -> [];
+'element03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"element03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'element02'(suite) -> [];
+'element02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"element02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'element01'(suite) -> [];
+'element01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"element01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'element00'(suite) -> [];
+'element00'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"element00.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'dtd07'(suite) -> [];
+'dtd07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"dtd07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'dtd05'(suite) -> [];
+'dtd05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"dtd05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'dtd04'(suite) -> [];
+'dtd04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"dtd04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'dtd03'(suite) -> [];
+'dtd03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"dtd03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'dtd02'(suite) -> [];
+'dtd02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"dtd02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'nwf-dtd01'(suite) -> [];
+'nwf-dtd01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"nwf-dtd01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'nwf-dtd00'(suite) -> [];
+'nwf-dtd00'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"nwf-dtd00.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'decl01'(suite) -> [];
+'decl01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"decl01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'content03'(suite) -> [];
+'content03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"content03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'content02'(suite) -> [];
+'content02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"content02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'content01'(suite) -> [];
+'content01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"content01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'cond02'(suite) -> [];
+'cond02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"cond02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'cond01'(suite) -> [];
+'cond01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"cond01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attlist11'(suite) -> [];
+'attlist11'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attlist11.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attlist10'(suite) -> [];
+'attlist10'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attlist10.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attlist09'(suite) -> [];
+'attlist09'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attlist09.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attlist08'(suite) -> [];
+'attlist08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attlist08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attlist07'(suite) -> [];
+'attlist07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attlist07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attlist06'(suite) -> [];
+'attlist06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attlist06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attlist05'(suite) -> [];
+'attlist05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attlist05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attlist04'(suite) -> [];
+'attlist04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attlist04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attlist03'(suite) -> [];
+'attlist03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attlist03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attlist02'(suite) -> [];
+'attlist02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attlist02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'attlist01'(suite) -> [];
+'attlist01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"attlist01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa03'(suite) -> [];
+'not-wf-sa03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"not-wf-sa03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+%%----------------------------------------------------------------------
+
+'uri01'(suite) -> [];
+'uri01'(doc) ->
+ ["URI fragments disallowed"];
+'uri01'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),sun,"uri01.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["URI fragments disallowed"]}.
+
+%%----------------------------------------------------------------------
+
+'valid-ext-sa-014'(suite) -> [];
+'valid-ext-sa-014'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-ext-sa-014.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-ext-sa-013'(suite) -> [];
+'valid-ext-sa-013'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-ext-sa-013.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-ext-sa-012'(suite) -> [];
+'valid-ext-sa-012'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-ext-sa-012.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-ext-sa-011'(suite) -> [];
+'valid-ext-sa-011'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-ext-sa-011.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-ext-sa-009'(suite) -> [];
+'valid-ext-sa-009'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-ext-sa-009.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-ext-sa-008'(suite) -> [];
+'valid-ext-sa-008'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-ext-sa-008.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-ext-sa-007'(suite) -> [];
+'valid-ext-sa-007'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-ext-sa-007.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-ext-sa-006'(suite) -> [];
+'valid-ext-sa-006'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-ext-sa-006.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-ext-sa-005'(suite) -> [];
+'valid-ext-sa-005'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-ext-sa-005.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-ext-sa-004'(suite) -> [];
+'valid-ext-sa-004'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-ext-sa-004.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-ext-sa-003'(suite) -> [];
+'valid-ext-sa-003'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-ext-sa-003.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-ext-sa-002'(suite) -> [];
+'valid-ext-sa-002'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-ext-sa-002.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-ext-sa-001'(suite) -> [];
+'valid-ext-sa-001'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-ext-sa-001.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-031'(suite) -> [];
+'valid-not-sa-031'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-031.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-030'(suite) -> [];
+'valid-not-sa-030'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-030.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-029'(suite) -> [];
+'valid-not-sa-029'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-029.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-028'(suite) -> [];
+'valid-not-sa-028'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-028.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-027'(suite) -> [];
+'valid-not-sa-027'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-027.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-026'(suite) -> [];
+'valid-not-sa-026'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-026.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-025'(suite) -> [];
+'valid-not-sa-025'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-025.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-024'(suite) -> [];
+'valid-not-sa-024'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-024.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-023'(suite) -> [];
+'valid-not-sa-023'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-023.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-021'(suite) -> [];
+'valid-not-sa-021'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-021.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-020'(suite) -> [];
+'valid-not-sa-020'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-020.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-019'(suite) -> [];
+'valid-not-sa-019'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-019.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-018'(suite) -> [];
+'valid-not-sa-018'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-018.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-017'(suite) -> [];
+'valid-not-sa-017'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-017.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-016'(suite) -> [];
+'valid-not-sa-016'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-016.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-015'(suite) -> [];
+'valid-not-sa-015'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-015.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-014'(suite) -> [];
+'valid-not-sa-014'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-014.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-013'(suite) -> [];
+'valid-not-sa-013'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-013.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-012'(suite) -> [];
+'valid-not-sa-012'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-012.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-011'(suite) -> [];
+'valid-not-sa-011'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-011.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-010'(suite) -> [];
+'valid-not-sa-010'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-010.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-009'(suite) -> [];
+'valid-not-sa-009'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-009.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-008'(suite) -> [];
+'valid-not-sa-008'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-008.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-007'(suite) -> [];
+'valid-not-sa-007'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-007.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-006'(suite) -> [];
+'valid-not-sa-006'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-006.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-005'(suite) -> [];
+'valid-not-sa-005'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-005.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-004'(suite) -> [];
+'valid-not-sa-004'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-004.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-003'(suite) -> [];
+'valid-not-sa-003'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-003.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-002'(suite) -> [];
+'valid-not-sa-002'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-002.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-not-sa-001'(suite) -> [];
+'valid-not-sa-001'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-not-sa-001.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-119'(suite) -> [];
+'valid-sa-119'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-119.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-118'(suite) -> [];
+'valid-sa-118'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-118.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-117'(suite) -> [];
+'valid-sa-117'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-117.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-116'(suite) -> [];
+'valid-sa-116'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-116.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-115'(suite) -> [];
+'valid-sa-115'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-115.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-114'(suite) -> [];
+'valid-sa-114'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-114.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-113'(suite) -> [];
+'valid-sa-113'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-113.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-112'(suite) -> [];
+'valid-sa-112'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-112.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-111'(suite) -> [];
+'valid-sa-111'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-111.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-110'(suite) -> [];
+'valid-sa-110'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-110.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-109'(suite) -> [];
+'valid-sa-109'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-109.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-108'(suite) -> [];
+'valid-sa-108'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-108.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-107'(suite) -> [];
+'valid-sa-107'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-107.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-106'(suite) -> [];
+'valid-sa-106'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-106.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-105'(suite) -> [];
+'valid-sa-105'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-105.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-104'(suite) -> [];
+'valid-sa-104'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-104.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-103'(suite) -> [];
+'valid-sa-103'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-103.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-102'(suite) -> [];
+'valid-sa-102'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-102.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-101'(suite) -> [];
+'valid-sa-101'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-101.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-100'(suite) -> [];
+'valid-sa-100'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-100.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["recursive xml spec"]}.
+
+'valid-sa-099'(suite) -> [];
+'valid-sa-099'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-099.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-098'(suite) -> [];
+'valid-sa-098'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-098.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-097'(suite) -> [];
+'valid-sa-097'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-097.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-096'(suite) -> [];
+'valid-sa-096'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-096.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-095'(suite) -> [];
+'valid-sa-095'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-095.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-094'(suite) -> [];
+'valid-sa-094'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-094.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-093'(suite) -> [];
+'valid-sa-093'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-093.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-092'(suite) -> [];
+'valid-sa-092'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-092.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-091'(suite) -> [];
+'valid-sa-091'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-091.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-090'(suite) -> [];
+'valid-sa-090'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-090.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-089'(suite) -> [];
+'valid-sa-089'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-089.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-088'(suite) -> [];
+'valid-sa-088'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-088.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-087'(suite) -> [];
+'valid-sa-087'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-087.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-086'(suite) -> [];
+'valid-sa-086'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-086.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-085'(suite) -> [];
+'valid-sa-085'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-085.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-084'(suite) -> [];
+'valid-sa-084'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-084.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-083'(suite) -> [];
+'valid-sa-083'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-083.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-082'(suite) -> [];
+'valid-sa-082'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-082.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-081'(suite) -> [];
+'valid-sa-081'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-081.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-080'(suite) -> [];
+'valid-sa-080'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-080.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-079'(suite) -> [];
+'valid-sa-079'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-079.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-078'(suite) -> [];
+'valid-sa-078'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-078.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-077'(suite) -> [];
+'valid-sa-077'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-077.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-076'(suite) -> [];
+'valid-sa-076'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-076.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-075'(suite) -> [];
+'valid-sa-075'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-075.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-074'(suite) -> [];
+'valid-sa-074'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-074.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-073'(suite) -> [];
+'valid-sa-073'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-073.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-072'(suite) -> [];
+'valid-sa-072'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-072.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-071'(suite) -> [];
+'valid-sa-071'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-071.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-070'(suite) -> [];
+'valid-sa-070'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-070.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-069'(suite) -> [];
+'valid-sa-069'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-069.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-068'(suite) -> [];
+'valid-sa-068'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-068.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-067'(suite) -> [];
+'valid-sa-067'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-067.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-066'(suite) -> [];
+'valid-sa-066'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-066.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-065'(suite) -> [];
+'valid-sa-065'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-065.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-064'(suite) -> [];
+'valid-sa-064'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-064.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["Fails to handle UTF-8 encoded names, when they are converted to atoms"]}.
+
+'valid-sa-063'(suite) -> [];
+'valid-sa-063'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-063.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["Fails to handle Unicode integer (UTF-8) encoded names, when they are converted to atoms"]}.
+
+'valid-sa-062'(suite) -> [];
+'valid-sa-062'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-062.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-061'(suite) -> [];
+'valid-sa-061'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-061.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-060'(suite) -> [];
+'valid-sa-060'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-060.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-059'(suite) -> [];
+'valid-sa-059'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-059.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-058'(suite) -> [];
+'valid-sa-058'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-058.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-057'(suite) -> [];
+'valid-sa-057'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-057.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-056'(suite) -> [];
+'valid-sa-056'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-056.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-055'(suite) -> [];
+'valid-sa-055'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-055.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-054'(suite) -> [];
+'valid-sa-054'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-054.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-053'(suite) -> [];
+'valid-sa-053'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-053.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-052'(suite) -> [];
+'valid-sa-052'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-052.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-051'(suite) -> [];
+'valid-sa-051'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-051.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["Fails to handle Unicode integer (UTF-16) encoded names, when they are converted to atoms"]}.
+'valid-sa-050'(suite) -> [];
+'valid-sa-050'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-050.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-049'(suite) -> [];
+'valid-sa-049'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-049.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-048'(suite) -> [];
+'valid-sa-048'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-048.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-047'(suite) -> [];
+'valid-sa-047'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-047.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-046'(suite) -> [];
+'valid-sa-046'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-046.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-045'(suite) -> [];
+'valid-sa-045'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-045.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-044'(suite) -> [];
+'valid-sa-044'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-044.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-043'(suite) -> [];
+'valid-sa-043'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-043.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-042'(suite) -> [];
+'valid-sa-042'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-042.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-041'(suite) -> [];
+'valid-sa-041'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-041.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-040'(suite) -> [];
+'valid-sa-040'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-040.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-039'(suite) -> [];
+'valid-sa-039'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-039.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-038'(suite) -> [];
+'valid-sa-038'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-038.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-037'(suite) -> [];
+'valid-sa-037'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-037.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-036'(suite) -> [];
+'valid-sa-036'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-036.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-035'(suite) -> [];
+'valid-sa-035'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-035.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-034'(suite) -> [];
+'valid-sa-034'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-034.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-033'(suite) -> [];
+'valid-sa-033'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-033.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-032'(suite) -> [];
+'valid-sa-032'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-032.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-031'(suite) -> [];
+'valid-sa-031'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-031.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-030'(suite) -> [];
+'valid-sa-030'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-030.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-029'(suite) -> [];
+'valid-sa-029'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-029.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-028'(suite) -> [];
+'valid-sa-028'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-028.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-027'(suite) -> [];
+'valid-sa-027'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-027.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-026'(suite) -> [];
+'valid-sa-026'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-026.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-025'(suite) -> [];
+'valid-sa-025'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-025.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-024'(suite) -> [];
+'valid-sa-024'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-024.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-023'(suite) -> [];
+'valid-sa-023'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-023.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-022'(suite) -> [];
+'valid-sa-022'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-022.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-021'(suite) -> [];
+'valid-sa-021'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-021.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-020'(suite) -> [];
+'valid-sa-020'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-020.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-019'(suite) -> [];
+'valid-sa-019'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-019.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-018'(suite) -> [];
+'valid-sa-018'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-018.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-017'(suite) -> [];
+'valid-sa-017'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-017.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-016'(suite) -> [];
+'valid-sa-016'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-016.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-015'(suite) -> [];
+'valid-sa-015'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-015.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-014'(suite) -> [];
+'valid-sa-014'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-014.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-013'(suite) -> [];
+'valid-sa-013'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-013.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-012'(suite) -> [];
+'valid-sa-012'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-012.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-011'(suite) -> [];
+'valid-sa-011'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-011.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-010'(suite) -> [];
+'valid-sa-010'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-010.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-009'(suite) -> [];
+'valid-sa-009'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-009.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-008'(suite) -> [];
+'valid-sa-008'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-008.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-007'(suite) -> [];
+'valid-sa-007'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-007.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-006'(suite) -> [];
+'valid-sa-006'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-006.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-005'(suite) -> [];
+'valid-sa-005'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-005.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-004'(suite) -> [];
+'valid-sa-004'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-004.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-003'(suite) -> [];
+'valid-sa-003'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-003.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-002'(suite) -> [];
+'valid-sa-002'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-002.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'valid-sa-001'(suite) -> [];
+'valid-sa-001'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"valid-sa-001.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'invalid-not-sa-022'(suite) -> [];
+'invalid-not-sa-022'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"invalid-not-sa-022.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'invalid--006'(suite) -> [];
+'invalid--006'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"invalid--006.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'invalid--005'(suite) -> [];
+'invalid--005'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"invalid--005.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'invalid--002'(suite) -> [];
+'invalid--002'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"invalid--002.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-ext-sa-003'(suite) -> [];
+'not-wf-ext-sa-003'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-ext-sa-003.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-ext-sa-002'(suite) -> [];
+'not-wf-ext-sa-002'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-ext-sa-002.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-ext-sa-001'(suite) -> [];
+'not-wf-ext-sa-001'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-ext-sa-001.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-not-sa-009'(suite) -> [];
+'not-wf-not-sa-009'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-not-sa-009.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-not-sa-008'(suite) -> [];
+'not-wf-not-sa-008'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-not-sa-008.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-not-sa-007'(suite) -> [];
+'not-wf-not-sa-007'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-not-sa-007.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-not-sa-006'(suite) -> [];
+'not-wf-not-sa-006'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-not-sa-006.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-not-sa-005'(suite) -> [];
+'not-wf-not-sa-005'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-not-sa-005.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-not-sa-004'(suite) -> [];
+'not-wf-not-sa-004'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-not-sa-004.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-not-sa-003'(suite) -> [];
+'not-wf-not-sa-003'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-not-sa-003.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-not-sa-002'(suite) -> [];
+'not-wf-not-sa-002'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-not-sa-002.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-not-sa-001'(suite) -> [];
+'not-wf-not-sa-001'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-not-sa-001.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-186'(suite) -> [];
+'not-wf-sa-186'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-186.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-185'(suite) -> [];
+'not-wf-sa-185'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-185.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-184'(suite) -> [];
+'not-wf-sa-184'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-184.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-183'(suite) -> [];
+'not-wf-sa-183'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-183.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-182'(suite) -> [];
+'not-wf-sa-182'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-182.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-181'(suite) -> [];
+'not-wf-sa-181'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-181.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-180'(suite) -> [];
+'not-wf-sa-180'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-180.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-179'(suite) -> [];
+'not-wf-sa-179'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-179.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-178'(suite) -> [];
+'not-wf-sa-178'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-178.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-177'(suite) -> [];
+'not-wf-sa-177'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-177.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["do not support UTF-8 (only Latin-1), therefore not ","able to check the illegal FFFF/FFFE (Unicode) characters"]}.
+
+'not-wf-sa-176'(suite) -> [];
+'not-wf-sa-176'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-176.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-175'(suite) -> [];
+'not-wf-sa-175'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-175.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["do not support UTF-8 (only Latin-1), therefore not ","able to check the illegal FFFF/FFFE (Unicode) characters"]}.
+
+'not-wf-sa-174'(suite) -> [];
+'not-wf-sa-174'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-174.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["do not support UTF-8 (only Latin-1), therefore not ","able to check the illegal FFFF/FFFE (Unicode) characters"]}.
+
+'not-wf-sa-173'(suite) -> [];
+'not-wf-sa-173'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-173.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["do not support UTF-8 (only Latin-1), therefore not ","able to check the illegal FFFF/FFFE (Unicode) characters"]}.
+
+'not-wf-sa-172'(suite) -> [];
+'not-wf-sa-172'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-172.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["do not support UTF-8 (only Latin-1), therefore not ","able to check the illegal FFFF/FFFE (Unicode) characters"]}.
+
+'not-wf-sa-171'(suite) -> [];
+'not-wf-sa-171'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-171.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["do not support UTF-8 (only Latin-1), therefore not ","able to check the illegal FFFF/FFFE (Unicode) characters"]}.
+
+'not-wf-sa-170'(suite) -> [];
+'not-wf-sa-170'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-170.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["UTF-8 encoding of UCS-4 characters"]}.
+
+'not-wf-sa-169'(suite) -> [];
+'not-wf-sa-169'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-169.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["UTF-8 encoding of an illegal unpaired surrogate (DC00)"]}.
+
+'not-wf-sa-168'(suite) -> [];
+'not-wf-sa-168'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-168.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["UTF-8 encoding of an illegal unpaired surrogate (D800)"]}.
+
+'not-wf-sa-167'(suite) -> [];
+'not-wf-sa-167'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-167.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["UTF-8 encoding of an illegal FFFE"]}.
+
+'not-wf-sa-166'(suite) -> [];
+'not-wf-sa-166'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-166.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["UTF-8 encoding of an illegal FFFE"]}.
+
+'not-wf-sa-165'(suite) -> [];
+'not-wf-sa-165'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-165.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-164'(suite) -> [];
+'not-wf-sa-164'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-164.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-163'(suite) -> [];
+'not-wf-sa-163'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-163.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-162'(suite) -> [];
+'not-wf-sa-162'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-162.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-161'(suite) -> [];
+'not-wf-sa-161'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-161.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-160'(suite) -> [];
+'not-wf-sa-160'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-160.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-159'(suite) -> [];
+'not-wf-sa-159'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-159.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-158'(suite) -> [];
+'not-wf-sa-158'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-158.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-157'(suite) -> [];
+'not-wf-sa-157'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-157.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-156'(suite) -> [];
+'not-wf-sa-156'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-156.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-155'(suite) -> [];
+'not-wf-sa-155'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-155.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-154'(suite) -> [];
+'not-wf-sa-154'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-154.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-153'(suite) -> [];
+'not-wf-sa-153'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-153.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-152'(suite) -> [];
+'not-wf-sa-152'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-152.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-151'(suite) -> [];
+'not-wf-sa-151'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-151.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["don't bother wath's in the Misc production"]}.
+
+'not-wf-sa-150'(suite) -> [];
+'not-wf-sa-150'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-150.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-149'(suite) -> [];
+'not-wf-sa-149'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-149.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-148'(suite) -> [];
+'not-wf-sa-148'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-148.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-147'(suite) -> [];
+'not-wf-sa-147'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-147.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-146'(suite) -> [];
+'not-wf-sa-146'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-146.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-145'(suite) -> [];
+'not-wf-sa-145'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-145.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-144'(suite) -> [];
+'not-wf-sa-144'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-144.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-143'(suite) -> [];
+'not-wf-sa-143'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-143.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-142'(suite) -> [];
+'not-wf-sa-142'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-142.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-141'(suite) -> [];
+'not-wf-sa-141'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-141.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-140'(suite) -> [];
+'not-wf-sa-140'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-140.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-139'(suite) -> [];
+'not-wf-sa-139'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-139.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-138'(suite) -> [];
+'not-wf-sa-138'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-138.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-137'(suite) -> [];
+'not-wf-sa-137'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-137.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-136'(suite) -> [];
+'not-wf-sa-136'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-136.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-135'(suite) -> [];
+'not-wf-sa-135'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-135.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-134'(suite) -> [];
+'not-wf-sa-134'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-134.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-133'(suite) -> [];
+'not-wf-sa-133'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-133.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-132'(suite) -> [];
+'not-wf-sa-132'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-132.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-131'(suite) -> [];
+'not-wf-sa-131'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-131.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-130'(suite) -> [];
+'not-wf-sa-130'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-130.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-129'(suite) -> [];
+'not-wf-sa-129'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-129.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-128'(suite) -> [];
+'not-wf-sa-128'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-128.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-127'(suite) -> [];
+'not-wf-sa-127'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-127.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-126'(suite) -> [];
+'not-wf-sa-126'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-126.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-125'(suite) -> [];
+'not-wf-sa-125'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-125.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-124'(suite) -> [];
+'not-wf-sa-124'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-124.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-123'(suite) -> [];
+'not-wf-sa-123'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-123.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-122'(suite) -> [];
+'not-wf-sa-122'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-122.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-121'(suite) -> [];
+'not-wf-sa-121'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-121.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-120'(suite) -> [];
+'not-wf-sa-120'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-120.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-119'(suite) -> [];
+'not-wf-sa-119'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-119.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-118'(suite) -> [];
+'not-wf-sa-118'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-118.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-117'(suite) -> [];
+'not-wf-sa-117'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-117.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-116'(suite) -> [];
+'not-wf-sa-116'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-116.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-115'(suite) -> [];
+'not-wf-sa-115'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-115.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-114'(suite) -> [];
+'not-wf-sa-114'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-114.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-113'(suite) -> [];
+'not-wf-sa-113'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-113.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-112'(suite) -> [];
+'not-wf-sa-112'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-112.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-111'(suite) -> [];
+'not-wf-sa-111'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-111.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-110'(suite) -> [];
+'not-wf-sa-110'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-110.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-109'(suite) -> [];
+'not-wf-sa-109'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-109.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-108'(suite) -> [];
+'not-wf-sa-108'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-108.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-107'(suite) -> [];
+'not-wf-sa-107'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-107.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-106'(suite) -> [];
+'not-wf-sa-106'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-106.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-105'(suite) -> [];
+'not-wf-sa-105'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-105.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-104'(suite) -> [];
+'not-wf-sa-104'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-104.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-103'(suite) -> [];
+'not-wf-sa-103'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-103.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-102'(suite) -> [];
+'not-wf-sa-102'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-102.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-101'(suite) -> [];
+'not-wf-sa-101'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-101.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-100'(suite) -> [];
+'not-wf-sa-100'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-100.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-099'(suite) -> [];
+'not-wf-sa-099'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-099.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-098'(suite) -> [];
+'not-wf-sa-098'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-098.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-097'(suite) -> [];
+'not-wf-sa-097'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-097.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-096'(suite) -> [];
+'not-wf-sa-096'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-096.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-095'(suite) -> [];
+'not-wf-sa-095'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-095.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-094'(suite) -> [];
+'not-wf-sa-094'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-094.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-093'(suite) -> [];
+'not-wf-sa-093'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-093.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-092'(suite) -> [];
+'not-wf-sa-092'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-092.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-091'(suite) -> [];
+'not-wf-sa-091'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-091.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-090'(suite) -> [];
+'not-wf-sa-090'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-090.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-089'(suite) -> [];
+'not-wf-sa-089'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-089.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-088'(suite) -> [];
+'not-wf-sa-088'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-088.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-087'(suite) -> [];
+'not-wf-sa-087'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-087.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-086'(suite) -> [];
+'not-wf-sa-086'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-086.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-085'(suite) -> [];
+'not-wf-sa-085'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-085.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-084'(suite) -> [];
+'not-wf-sa-084'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-084.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-083'(suite) -> [];
+'not-wf-sa-083'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-083.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-082'(suite) -> [];
+'not-wf-sa-082'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-082.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-081'(suite) -> [];
+'not-wf-sa-081'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-081.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-080'(suite) -> [];
+'not-wf-sa-080'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-080.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-079'(suite) -> [];
+'not-wf-sa-079'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-079.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-078'(suite) -> [];
+'not-wf-sa-078'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-078.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-077'(suite) -> [];
+'not-wf-sa-077'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-077.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-076'(suite) -> [];
+'not-wf-sa-076'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-076.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-075'(suite) -> [];
+'not-wf-sa-075'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-075.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-074'(suite) -> [];
+'not-wf-sa-074'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-074.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-073'(suite) -> [];
+'not-wf-sa-073'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-073.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-072'(suite) -> [];
+'not-wf-sa-072'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-072.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-071'(suite) -> [];
+'not-wf-sa-071'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-071.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-070'(suite) -> [];
+'not-wf-sa-070'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-070.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-069'(suite) -> [];
+'not-wf-sa-069'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-069.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-068'(suite) -> [];
+'not-wf-sa-068'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-068.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-067'(suite) -> [];
+'not-wf-sa-067'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-067.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-066'(suite) -> [];
+'not-wf-sa-066'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-066.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-065'(suite) -> [];
+'not-wf-sa-065'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-065.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-064'(suite) -> [];
+'not-wf-sa-064'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-064.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-063'(suite) -> [];
+'not-wf-sa-063'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-063.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-062'(suite) -> [];
+'not-wf-sa-062'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-062.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-061'(suite) -> [];
+'not-wf-sa-061'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-061.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-060'(suite) -> [];
+'not-wf-sa-060'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-060.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-059'(suite) -> [];
+'not-wf-sa-059'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-059.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-058'(suite) -> [];
+'not-wf-sa-058'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-058.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-057'(suite) -> [];
+'not-wf-sa-057'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-057.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-056'(suite) -> [];
+'not-wf-sa-056'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-056.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-055'(suite) -> [];
+'not-wf-sa-055'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-055.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-054'(suite) -> [];
+'not-wf-sa-054'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-054.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-053'(suite) -> [];
+'not-wf-sa-053'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-053.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-052'(suite) -> [];
+'not-wf-sa-052'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-052.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-051'(suite) -> [];
+'not-wf-sa-051'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-051.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-050'(suite) -> [];
+'not-wf-sa-050'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-050.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-049'(suite) -> [];
+'not-wf-sa-049'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-049.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-048'(suite) -> [];
+'not-wf-sa-048'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-048.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-047'(suite) -> [];
+'not-wf-sa-047'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-047.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-046'(suite) -> [];
+'not-wf-sa-046'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-046.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-045'(suite) -> [];
+'not-wf-sa-045'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-045.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-044'(suite) -> [];
+'not-wf-sa-044'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-044.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-043'(suite) -> [];
+'not-wf-sa-043'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-043.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-042'(suite) -> [];
+'not-wf-sa-042'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-042.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-041'(suite) -> [];
+'not-wf-sa-041'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-041.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-040'(suite) -> [];
+'not-wf-sa-040'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-040.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-039'(suite) -> [];
+'not-wf-sa-039'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-039.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-038'(suite) -> [];
+'not-wf-sa-038'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-038.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-037'(suite) -> [];
+'not-wf-sa-037'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-037.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-036'(suite) -> [];
+'not-wf-sa-036'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-036.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-035'(suite) -> [];
+'not-wf-sa-035'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-035.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-034'(suite) -> [];
+'not-wf-sa-034'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-034.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-033'(suite) -> [];
+'not-wf-sa-033'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-033.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-032'(suite) -> [];
+'not-wf-sa-032'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-032.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-031'(suite) -> [];
+'not-wf-sa-031'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-031.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-030'(suite) -> [];
+'not-wf-sa-030'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-030.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-029'(suite) -> [];
+'not-wf-sa-029'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-029.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-028'(suite) -> [];
+'not-wf-sa-028'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-028.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-027'(suite) -> [];
+'not-wf-sa-027'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-027.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-026'(suite) -> [];
+'not-wf-sa-026'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-026.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-025'(suite) -> [];
+'not-wf-sa-025'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-025.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-024'(suite) -> [];
+'not-wf-sa-024'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-024.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-023'(suite) -> [];
+'not-wf-sa-023'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-023.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-022'(suite) -> [];
+'not-wf-sa-022'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-022.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-021'(suite) -> [];
+'not-wf-sa-021'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-021.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-020'(suite) -> [];
+'not-wf-sa-020'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-020.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-019'(suite) -> [];
+'not-wf-sa-019'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-019.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-018'(suite) -> [];
+'not-wf-sa-018'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-018.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-017'(suite) -> [];
+'not-wf-sa-017'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-017.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-016'(suite) -> [];
+'not-wf-sa-016'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-016.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-015'(suite) -> [];
+'not-wf-sa-015'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-015.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-014'(suite) -> [];
+'not-wf-sa-014'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-014.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-013'(suite) -> [];
+'not-wf-sa-013'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-013.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-012'(suite) -> [];
+'not-wf-sa-012'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-012.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-011'(suite) -> [];
+'not-wf-sa-011'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-011.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-010'(suite) -> [];
+'not-wf-sa-010'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-010.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-009'(suite) -> [];
+'not-wf-sa-009'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-009.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-008'(suite) -> [];
+'not-wf-sa-008'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-008.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-007'(suite) -> [];
+'not-wf-sa-007'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-007.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-006'(suite) -> [];
+'not-wf-sa-006'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-006.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-005'(suite) -> [];
+'not-wf-sa-005'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-005.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-004'(suite) -> [];
+'not-wf-sa-004'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-004.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-003'(suite) -> [];
+'not-wf-sa-003'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-003.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-002'(suite) -> [];
+'not-wf-sa-002'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-002.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'not-wf-sa-001'(suite) -> [];
+'not-wf-sa-001'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),xmltest,"not-wf-sa-001.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+%%----------------------------------------------------------------------
+
+'japanese-weekly-utf-8'(suite) -> [];
+'japanese-weekly-utf-8'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),japanese,"japanese-weekly-utf-8.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["UTF-8 encoding of japanese characters"]}.
+
+'japanese-weekly-utf-16'(suite) -> [];
+'japanese-weekly-utf-16'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),japanese,"japanese-weekly-utf-16.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["Test support for UTF-16 encoding, and XML names which contain Japanese characters."]}.
+
+'japanese-weekly-shift_jis'(suite) -> [];
+'japanese-weekly-shift_jis'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),japanese,"japanese-weekly-shift_jis.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'japanese-weekly-little'(suite) -> [];
+'japanese-weekly-little'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),japanese,"japanese-weekly-little.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["Test support for little-endian UTF-16 encoding, and XML names which contain Japanese characters."]}.
+
+'japanese-weekly-iso-2022-jp'(suite) -> [];
+'japanese-weekly-iso-2022-jp'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),japanese,"japanese-weekly-iso-2022-jp.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'japanese-weekly-euc-jp'(suite) -> [];
+'japanese-weekly-euc-jp'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),japanese,"japanese-weekly-euc-jp.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'japanese-pr-xml-utf-8'(suite) -> [];
+'japanese-pr-xml-utf-8'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),japanese,"japanese-pr-xml-utf-8.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["Test support for UTF-8 text which relies on Japanese characters"]}.
+
+'japanese-pr-xml-utf-16'(suite) -> [];
+'japanese-pr-xml-utf-16'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),japanese,"japanese-pr-xml-utf-16.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["Test support UTF-16 text which relies on Japanese characters."]}.
+
+'japanese-pr-xml-shift_jis'(suite) -> [];
+'japanese-pr-xml-shift_jis'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),japanese,"japanese-pr-xml-shift_jis.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'japanese-pr-xml-little'(suite) -> [];
+'japanese-pr-xml-little'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),japanese,"japanese-pr-xml-little.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["Test support for little-endian UTF-16 text which relies on Japanese characters."]}.
+
+'japanese-pr-xml-iso-2022-jp'(suite) -> [];
+'japanese-pr-xml-iso-2022-jp'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),japanese,"japanese-pr-xml-iso-2022-jp.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'japanese-pr-xml-euc-jp'(suite) -> [];
+'japanese-pr-xml-euc-jp'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),japanese,"japanese-pr-xml-euc-jp.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+%%----------------------------------------------------------------------
+
+'o-p11pass1'(suite) -> [];
+'o-p11pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p11pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p76fail4'(suite) -> [];
+'o-p76fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p76fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p76fail3'(suite) -> [];
+'o-p76fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p76fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p76fail2'(suite) -> [];
+'o-p76fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p76fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p76fail1'(suite) -> [];
+'o-p76fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p76fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p75fail6'(suite) -> [];
+'o-p75fail6'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p75fail6.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p75fail5'(suite) -> [];
+'o-p75fail5'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p75fail5.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p75fail4'(suite) -> [];
+'o-p75fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p75fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p75fail3'(suite) -> [];
+'o-p75fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p75fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p75fail2'(suite) -> [];
+'o-p75fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p75fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p75fail1'(suite) -> [];
+'o-p75fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p75fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p74fail3'(suite) -> [];
+'o-p74fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p74fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p74fail2'(suite) -> [];
+'o-p74fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p74fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p74fail1'(suite) -> [];
+'o-p74fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p74fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p73fail5'(suite) -> [];
+'o-p73fail5'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p73fail5.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p73fail4'(suite) -> [];
+'o-p73fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p73fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p73fail3'(suite) -> [];
+'o-p73fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p73fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p73fail2'(suite) -> [];
+'o-p73fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p73fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p73fail1'(suite) -> [];
+'o-p73fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p73fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p72fail4'(suite) -> [];
+'o-p72fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p72fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p72fail3'(suite) -> [];
+'o-p72fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p72fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p72fail2'(suite) -> [];
+'o-p72fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p72fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p72fail1'(suite) -> [];
+'o-p72fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p72fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p71fail4'(suite) -> [];
+'o-p71fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p71fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p71fail3'(suite) -> [];
+'o-p71fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p71fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p71fail2'(suite) -> [];
+'o-p71fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p71fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p71fail1'(suite) -> [];
+'o-p71fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p71fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p70fail1'(suite) -> [];
+'o-p70fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p70fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p69fail3'(suite) -> [];
+'o-p69fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p69fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p69fail2'(suite) -> [];
+'o-p69fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p69fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p69fail1'(suite) -> [];
+'o-p69fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p69fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p68fail3'(suite) -> [];
+'o-p68fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p68fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p68fail2'(suite) -> [];
+'o-p68fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p68fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p68fail1'(suite) -> [];
+'o-p68fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p68fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p66fail6'(suite) -> [];
+'o-p66fail6'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p66fail6.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p66fail5'(suite) -> [];
+'o-p66fail5'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p66fail5.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p66fail4'(suite) -> [];
+'o-p66fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p66fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p66fail3'(suite) -> [];
+'o-p66fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p66fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p66fail2'(suite) -> [];
+'o-p66fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p66fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p66fail1'(suite) -> [];
+'o-p66fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p66fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p64fail2'(suite) -> [];
+'o-p64fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p64fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p64fail1'(suite) -> [];
+'o-p64fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p64fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p63fail2'(suite) -> [];
+'o-p63fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p63fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p63fail1'(suite) -> [];
+'o-p63fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p63fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p62fail2'(suite) -> [];
+'o-p62fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p62fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p62fail1'(suite) -> [];
+'o-p62fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p62fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p61fail1'(suite) -> [];
+'o-p61fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p61fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p60fail5'(suite) -> [];
+'o-p60fail5'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p60fail5.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p60fail4'(suite) -> [];
+'o-p60fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p60fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p60fail3'(suite) -> [];
+'o-p60fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p60fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p60fail2'(suite) -> [];
+'o-p60fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p60fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p60fail1'(suite) -> [];
+'o-p60fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p60fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p59fail3'(suite) -> [];
+'o-p59fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p59fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p59fail2'(suite) -> [];
+'o-p59fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p59fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p59fail1'(suite) -> [];
+'o-p59fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p59fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p58fail8'(suite) -> [];
+'o-p58fail8'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p58fail8.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p58fail7'(suite) -> [];
+'o-p58fail7'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p58fail7.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p58fail6'(suite) -> [];
+'o-p58fail6'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p58fail6.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p58fail5'(suite) -> [];
+'o-p58fail5'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p58fail5.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p58fail4'(suite) -> [];
+'o-p58fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p58fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p58fail3'(suite) -> [];
+'o-p58fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p58fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p58fail2'(suite) -> [];
+'o-p58fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p58fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p58fail1'(suite) -> [];
+'o-p58fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p58fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p57fail1'(suite) -> [];
+'o-p57fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p57fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p56fail5'(suite) -> [];
+'o-p56fail5'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p56fail5.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p56fail4'(suite) -> [];
+'o-p56fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p56fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p56fail3'(suite) -> [];
+'o-p56fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p56fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p56fail2'(suite) -> [];
+'o-p56fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p56fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p56fail1'(suite) -> [];
+'o-p56fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p56fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p55fail1'(suite) -> [];
+'o-p55fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p55fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p54fail1'(suite) -> [];
+'o-p54fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p54fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p53fail5'(suite) -> [];
+'o-p53fail5'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p53fail5.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p53fail4'(suite) -> [];
+'o-p53fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p53fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p53fail3'(suite) -> [];
+'o-p53fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p53fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p53fail2'(suite) -> [];
+'o-p53fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p53fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p53fail1'(suite) -> [];
+'o-p53fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p53fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p52fail2'(suite) -> [];
+'o-p52fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p52fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p52fail1'(suite) -> [];
+'o-p52fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p52fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p51fail7'(suite) -> [];
+'o-p51fail7'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p51fail7.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p51fail6'(suite) -> [];
+'o-p51fail6'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p51fail6.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p51fail5'(suite) -> [];
+'o-p51fail5'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p51fail5.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p51fail4'(suite) -> [];
+'o-p51fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p51fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p51fail3'(suite) -> [];
+'o-p51fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p51fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p51fail2'(suite) -> [];
+'o-p51fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p51fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p51fail1'(suite) -> [];
+'o-p51fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p51fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p50fail1'(suite) -> [];
+'o-p50fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p50fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p49fail1'(suite) -> [];
+'o-p49fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p49fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p48fail2'(suite) -> [];
+'o-p48fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p48fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p48fail1'(suite) -> [];
+'o-p48fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p48fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p47fail4'(suite) -> [];
+'o-p47fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p47fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p47fail3'(suite) -> [];
+'o-p47fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p47fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p47fail2'(suite) -> [];
+'o-p47fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p47fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p47fail1'(suite) -> [];
+'o-p47fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p47fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p46fail6'(suite) -> [];
+'o-p46fail6'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p46fail6.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p46fail5'(suite) -> [];
+'o-p46fail5'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p46fail5.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p46fail4'(suite) -> [];
+'o-p46fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p46fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p46fail3'(suite) -> [];
+'o-p46fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p46fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p46fail2'(suite) -> [];
+'o-p46fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p46fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p46fail1'(suite) -> [];
+'o-p46fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p46fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p45fail4'(suite) -> [];
+'o-p45fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p45fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p45fail3'(suite) -> [];
+'o-p45fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p45fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p45fail2'(suite) -> [];
+'o-p45fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p45fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p45fail1'(suite) -> [];
+'o-p45fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p45fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p44fail5'(suite) -> [];
+'o-p44fail5'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p44fail5.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p44fail4'(suite) -> [];
+'o-p44fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p44fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p44fail3'(suite) -> [];
+'o-p44fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p44fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p44fail2'(suite) -> [];
+'o-p44fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p44fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p44fail1'(suite) -> [];
+'o-p44fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p44fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p43fail3'(suite) -> [];
+'o-p43fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p43fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p43fail2'(suite) -> [];
+'o-p43fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p43fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p43fail1'(suite) -> [];
+'o-p43fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p43fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p42fail3'(suite) -> [];
+'o-p42fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p42fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p42fail2'(suite) -> [];
+'o-p42fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p42fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p42fail1'(suite) -> [];
+'o-p42fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p42fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p41fail3'(suite) -> [];
+'o-p41fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p41fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p41fail2'(suite) -> [];
+'o-p41fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p41fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p41fail1'(suite) -> [];
+'o-p41fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p41fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p40fail4'(suite) -> [];
+'o-p40fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p40fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p40fail3'(suite) -> [];
+'o-p40fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p40fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p40fail2'(suite) -> [];
+'o-p40fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p40fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p40fail1'(suite) -> [];
+'o-p40fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p40fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p39fail5'(suite) -> [];
+'o-p39fail5'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p39fail5.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p39fail4'(suite) -> [];
+'o-p39fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p39fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p39fail3'(suite) -> [];
+'o-p39fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p39fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p39fail2'(suite) -> [];
+'o-p39fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p39fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p39fail1'(suite) -> [];
+'o-p39fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p39fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p32fail5'(suite) -> [];
+'o-p32fail5'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p32fail5.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p32fail4'(suite) -> [];
+'o-p32fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p32fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p32fail3'(suite) -> [];
+'o-p32fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p32fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p32fail2'(suite) -> [];
+'o-p32fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p32fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p32fail1'(suite) -> [];
+'o-p32fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p32fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p31fail1'(suite) -> [];
+'o-p31fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p31fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p30fail1'(suite) -> [];
+'o-p30fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p30fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p29fail1'(suite) -> [];
+'o-p29fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p29fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p28fail1'(suite) -> [];
+'o-p28fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p28fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p27fail1'(suite) -> [];
+'o-p27fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p27fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p26fail2'(suite) -> [];
+'o-p26fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p26fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p26fail1'(suite) -> [];
+'o-p26fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p26fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p25fail1'(suite) -> [];
+'o-p25fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p25fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p24fail2'(suite) -> [];
+'o-p24fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p24fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p24fail1'(suite) -> [];
+'o-p24fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p24fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p23fail5'(suite) -> [];
+'o-p23fail5'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p23fail5.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p23fail4'(suite) -> [];
+'o-p23fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p23fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p23fail3'(suite) -> [];
+'o-p23fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p23fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p23fail2'(suite) -> [];
+'o-p23fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p23fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p23fail1'(suite) -> [];
+'o-p23fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p23fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p22fail2'(suite) -> [];
+'o-p22fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p22fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p22fail1'(suite) -> [];
+'o-p22fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p22fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p18fail3'(suite) -> [];
+'o-p18fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p18fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p18fail2'(suite) -> [];
+'o-p18fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p18fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p18fail1'(suite) -> [];
+'o-p18fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p18fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p16fail3'(suite) -> [];
+'o-p16fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p16fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p16fail2'(suite) -> [];
+'o-p16fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p16fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p16fail1'(suite) -> [];
+'o-p16fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p16fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p15fail3'(suite) -> [];
+'o-p15fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p15fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p15fail2'(suite) -> [];
+'o-p15fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p15fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p15fail1'(suite) -> [];
+'o-p15fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p15fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p14fail3'(suite) -> [];
+'o-p14fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p14fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p14fail2'(suite) -> [];
+'o-p14fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p14fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p14fail1'(suite) -> [];
+'o-p14fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p14fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p12fail7'(suite) -> [];
+'o-p12fail7'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p12fail7.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p12fail6'(suite) -> [];
+'o-p12fail6'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p12fail6.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p12fail5'(suite) -> [];
+'o-p12fail5'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p12fail5.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p12fail4'(suite) -> [];
+'o-p12fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p12fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p12fail3'(suite) -> [];
+'o-p12fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p12fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p12fail2'(suite) -> [];
+'o-p12fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p12fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p12fail1'(suite) -> [];
+'o-p12fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p12fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p11fail2'(suite) -> [];
+'o-p11fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p11fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p11fail1'(suite) -> [];
+'o-p11fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p11fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p10fail3'(suite) -> [];
+'o-p10fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p10fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p10fail2'(suite) -> [];
+'o-p10fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p10fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p10fail1'(suite) -> [];
+'o-p10fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p10fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p09fail5'(suite) -> [];
+'o-p09fail5'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p09fail5.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p09fail4'(suite) -> [];
+'o-p09fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p09fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p09fail3'(suite) -> [];
+'o-p09fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p09fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p09fail2'(suite) -> [];
+'o-p09fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p09fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p09fail1'(suite) -> [];
+'o-p09fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p09fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p05fail5'(suite) -> [];
+'o-p05fail5'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p05fail5.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p05fail4'(suite) -> [];
+'o-p05fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p05fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p05fail3'(suite) -> [];
+'o-p05fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p05fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p05fail2'(suite) -> [];
+'o-p05fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p05fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p05fail1'(suite) -> [];
+'o-p05fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p05fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p04fail3'(suite) -> [];
+'o-p04fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p04fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p04fail2'(suite) -> [];
+'o-p04fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p04fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p04fail1'(suite) -> [];
+'o-p04fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p04fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail9'(suite) -> [];
+'o-p03fail9'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail9.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail8'(suite) -> [];
+'o-p03fail8'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail8.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail7'(suite) -> [];
+'o-p03fail7'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail7.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail5'(suite) -> [];
+'o-p03fail5'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail5.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail4'(suite) -> [];
+'o-p03fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail3'(suite) -> [];
+'o-p03fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail29'(suite) -> [];
+'o-p03fail29'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail29.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail28'(suite) -> [];
+'o-p03fail28'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail28.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail27'(suite) -> [];
+'o-p03fail27'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail27.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail26'(suite) -> [];
+'o-p03fail26'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail26.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail25'(suite) -> [];
+'o-p03fail25'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail25.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail24'(suite) -> [];
+'o-p03fail24'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail24.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail23'(suite) -> [];
+'o-p03fail23'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail23.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail22'(suite) -> [];
+'o-p03fail22'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail22.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail21'(suite) -> [];
+'o-p03fail21'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail21.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail20'(suite) -> [];
+'o-p03fail20'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail20.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail2'(suite) -> [];
+'o-p03fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail19'(suite) -> [];
+'o-p03fail19'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail19.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail18'(suite) -> [];
+'o-p03fail18'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail18.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail17'(suite) -> [];
+'o-p03fail17'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail17.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail16'(suite) -> [];
+'o-p03fail16'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail16.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail15'(suite) -> [];
+'o-p03fail15'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail15.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail14'(suite) -> [];
+'o-p03fail14'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail14.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail13'(suite) -> [];
+'o-p03fail13'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail13.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail12'(suite) -> [];
+'o-p03fail12'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail12.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail11'(suite) -> [];
+'o-p03fail11'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail11.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail10'(suite) -> [];
+'o-p03fail10'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail10.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p03fail1'(suite) -> [];
+'o-p03fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail9'(suite) -> [];
+'o-p02fail9'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail9.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail8'(suite) -> [];
+'o-p02fail8'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail8.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail7'(suite) -> [];
+'o-p02fail7'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail7.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail6'(suite) -> [];
+'o-p02fail6'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail6.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail5'(suite) -> [];
+'o-p02fail5'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail5.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail4'(suite) -> [];
+'o-p02fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail31'(suite) -> [];
+'o-p02fail31'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail31.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail30'(suite) -> [];
+'o-p02fail30'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail30.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail3'(suite) -> [];
+'o-p02fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail29'(suite) -> [];
+'o-p02fail29'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail29.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail28'(suite) -> [];
+'o-p02fail28'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail28.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail27'(suite) -> [];
+'o-p02fail27'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail27.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail26'(suite) -> [];
+'o-p02fail26'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail26.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail25'(suite) -> [];
+'o-p02fail25'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail25.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail24'(suite) -> [];
+'o-p02fail24'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail24.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail23'(suite) -> [];
+'o-p02fail23'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail23.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail22'(suite) -> [];
+'o-p02fail22'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail22.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail21'(suite) -> [];
+'o-p02fail21'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail21.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail20'(suite) -> [];
+'o-p02fail20'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail20.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail2'(suite) -> [];
+'o-p02fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail19'(suite) -> [];
+'o-p02fail19'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail19.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail18'(suite) -> [];
+'o-p02fail18'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail18.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail17'(suite) -> [];
+'o-p02fail17'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail17.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail16'(suite) -> [];
+'o-p02fail16'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail16.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail15'(suite) -> [];
+'o-p02fail15'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail15.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail14'(suite) -> [];
+'o-p02fail14'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail14.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail13'(suite) -> [];
+'o-p02fail13'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail13.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail12'(suite) -> [];
+'o-p02fail12'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail12.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail11'(suite) -> [];
+'o-p02fail11'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail11.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail10'(suite) -> [];
+'o-p02fail10'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail10.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p02fail1'(suite) -> [];
+'o-p02fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p02fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p01fail4'(suite) -> [];
+'o-p01fail4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p01fail4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p01fail3'(suite) -> [];
+'o-p01fail3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p01fail3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p01fail2'(suite) -> [];
+'o-p01fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p01fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p01fail1'(suite) -> [];
+'o-p01fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p01fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-e2'(suite) -> [];
+'o-e2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-e2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p75pass1'(suite) -> [];
+'o-p75pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p75pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p74pass1'(suite) -> [];
+'o-p74pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p74pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p66pass1'(suite) -> [];
+'o-p66pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p66pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p44pass5'(suite) -> [];
+'o-p44pass5'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p44pass5.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p44pass4'(suite) -> [];
+'o-p44pass4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p44pass4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p44pass3'(suite) -> [];
+'o-p44pass3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p44pass3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p44pass2'(suite) -> [];
+'o-p44pass2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p44pass2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p44pass1'(suite) -> [];
+'o-p44pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p44pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p42pass2'(suite) -> [];
+'o-p42pass2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p42pass2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p42pass1'(suite) -> [];
+'o-p42pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p42pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p41pass2'(suite) -> [];
+'o-p41pass2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p41pass2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p41pass1'(suite) -> [];
+'o-p41pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p41pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p40pass4'(suite) -> [];
+'o-p40pass4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p40pass4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p40pass3'(suite) -> [];
+'o-p40pass3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p40pass3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p40pass2'(suite) -> [];
+'o-p40pass2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p40pass2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p40pass1'(suite) -> [];
+'o-p40pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p40pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p39pass2'(suite) -> [];
+'o-p39pass2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p39pass2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p39pass1'(suite) -> [];
+'o-p39pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p39pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p32pass2'(suite) -> [];
+'o-p32pass2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p32pass2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p32pass1'(suite) -> [];
+'o-p32pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p32pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p27pass4'(suite) -> [];
+'o-p27pass4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p27pass4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p27pass3'(suite) -> [];
+'o-p27pass3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p27pass3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p27pass2'(suite) -> [];
+'o-p27pass2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p27pass2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p27pass1'(suite) -> [];
+'o-p27pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p27pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p26pass1'(suite) -> [];
+'o-p26pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p26pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p25pass2'(suite) -> [];
+'o-p25pass2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p25pass2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p25pass1'(suite) -> [];
+'o-p25pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p25pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p24pass4'(suite) -> [];
+'o-p24pass4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p24pass4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p24pass3'(suite) -> [];
+'o-p24pass3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p24pass3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p24pass2'(suite) -> [];
+'o-p24pass2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p24pass2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p24pass1'(suite) -> [];
+'o-p24pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p24pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p23pass4'(suite) -> [];
+'o-p23pass4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p23pass4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p23pass3'(suite) -> [];
+'o-p23pass3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p23pass3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p23pass2'(suite) -> [];
+'o-p23pass2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p23pass2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p23pass1'(suite) -> [];
+'o-p23pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p23pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p22pass3'(suite) -> [];
+'o-p22pass3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p22pass3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p22pass2'(suite) -> [];
+'o-p22pass2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p22pass2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p22pass1'(suite) -> [];
+'o-p22pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p22pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p18pass1'(suite) -> [];
+'o-p18pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p18pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p16pass3'(suite) -> [];
+'o-p16pass3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p16pass3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p16pass2'(suite) -> [];
+'o-p16pass2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p16pass2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p16pass1'(suite) -> [];
+'o-p16pass1'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p16pass1.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["Hard to interpret the meaning of the XML1.0 spec. See section 2.6 and 2.3."]}.
+
+'o-p15pass1'(suite) -> [];
+'o-p15pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p15pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p14pass1'(suite) -> [];
+'o-p14pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p14pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p10pass1'(suite) -> [];
+'o-p10pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p10pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p08fail2'(suite) -> [];
+'o-p08fail2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p08fail2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p08fail1'(suite) -> [];
+'o-p08fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p08fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p06fail1'(suite) -> [];
+'o-p06fail1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p06fail1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p05pass1'(suite) -> [];
+'o-p05pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p05pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p04pass1'(suite) -> [];
+'o-p04pass1'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p04pass1.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["Fails to handle name containing characters > x#ff, since they are converted to atoms"]}.
+'o-p03pass1'(suite) -> [];
+'o-p03pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p03pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p01pass3'(suite) -> [];
+'o-p01pass3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p01pass3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p01pass1'(suite) -> [];
+'o-p01pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p01pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p76pass1'(suite) -> [];
+'o-p76pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p76pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p73pass1'(suite) -> [];
+'o-p73pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p73pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p72pass1'(suite) -> [];
+'o-p72pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p72pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p71pass1'(suite) -> [];
+'o-p71pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p71pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p70pass1'(suite) -> [];
+'o-p70pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p70pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p69pass1'(suite) -> [];
+'o-p69pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p69pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p68pass1'(suite) -> [];
+'o-p68pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p68pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p64pass1'(suite) -> [];
+'o-p64pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p64pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p63pass1'(suite) -> [];
+'o-p63pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p63pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p62pass1'(suite) -> [];
+'o-p62pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p62pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p61pass1'(suite) -> [];
+'o-p61pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p61pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p60pass1'(suite) -> [];
+'o-p60pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p60pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p59pass1'(suite) -> [];
+'o-p59pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p59pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p58pass1'(suite) -> [];
+'o-p58pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p58pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p57pass1'(suite) -> [];
+'o-p57pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p57pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p56pass1'(suite) -> [];
+'o-p56pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p56pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p55pass1'(suite) -> [];
+'o-p55pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p55pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p54pass1'(suite) -> [];
+'o-p54pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p54pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p53pass1'(suite) -> [];
+'o-p53pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p53pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p52pass1'(suite) -> [];
+'o-p52pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p52pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p51pass1'(suite) -> [];
+'o-p51pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p51pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p50pass1'(suite) -> [];
+'o-p50pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p50pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p49pass1'(suite) -> [];
+'o-p49pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p49pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p48pass1'(suite) -> [];
+'o-p48pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p48pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p47pass1'(suite) -> [];
+'o-p47pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p47pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p46pass1'(suite) -> [];
+'o-p46pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p46pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p45pass1'(suite) -> [];
+'o-p45pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p45pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p43pass1'(suite) -> [];
+'o-p43pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p43pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p31pass2'(suite) -> [];
+'o-p31pass2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p31pass2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p31pass1'(suite) -> [];
+'o-p31pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p31pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p30pass2'(suite) -> [];
+'o-p30pass2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p30pass2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p30pass1'(suite) -> [];
+'o-p30pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p30pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p29pass1'(suite) -> [];
+'o-p29pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p29pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p28pass5'(suite) -> [];
+'o-p28pass5'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p28pass5.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p28pass4'(suite) -> [];
+'o-p28pass4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p28pass4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p28pass3'(suite) -> [];
+'o-p28pass3'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p28pass3.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p28pass1'(suite) -> [];
+'o-p28pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p28pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p22pass6'(suite) -> [];
+'o-p22pass6'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p22pass6.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p22pass5'(suite) -> [];
+'o-p22pass5'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p22pass5.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p22pass4'(suite) -> [];
+'o-p22pass4'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p22pass4.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p12pass1'(suite) -> [];
+'o-p12pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p12pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p09pass1'(suite) -> [];
+'o-p09pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p09pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p08pass1'(suite) -> [];
+'o-p08pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p08pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p07pass1'(suite) -> [];
+'o-p07pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p07pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p06pass1'(suite) -> [];
+'o-p06pass1'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p06pass1.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'o-p01pass2'(suite) -> [];
+'o-p01pass2'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),oasis,"o-p01pass2.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+%%----------------------------------------------------------------------
+
+'ibm-invalid-P76-ibm76i01'(suite) -> [];
+'ibm-invalid-P76-ibm76i01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P76-ibm76i01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P69-ibm69i04'(suite) -> [];
+'ibm-invalid-P69-ibm69i04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P69-ibm69i04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P69-ibm69i03'(suite) -> [];
+'ibm-invalid-P69-ibm69i03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P69-ibm69i03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P69-ibm69i02'(suite) -> [];
+'ibm-invalid-P69-ibm69i02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P69-ibm69i02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P69-ibm69i01'(suite) -> [];
+'ibm-invalid-P69-ibm69i01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P69-ibm69i01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P68-ibm68i04'(suite) -> [];
+'ibm-invalid-P68-ibm68i04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P68-ibm68i04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P68-ibm68i03'(suite) -> [];
+'ibm-invalid-P68-ibm68i03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P68-ibm68i03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P68-ibm68i02'(suite) -> [];
+'ibm-invalid-P68-ibm68i02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P68-ibm68i02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P68-ibm68i01'(suite) -> [];
+'ibm-invalid-P68-ibm68i01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P68-ibm68i01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P60-ibm60i04'(suite) -> [];
+'ibm-invalid-P60-ibm60i04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P60-ibm60i04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P60-ibm60i03'(suite) -> [];
+'ibm-invalid-P60-ibm60i03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P60-ibm60i03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P60-ibm60i02'(suite) -> [];
+'ibm-invalid-P60-ibm60i02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P60-ibm60i02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P60-ibm60i01'(suite) -> [];
+'ibm-invalid-P60-ibm60i01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P60-ibm60i01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P59-ibm59i01'(suite) -> [];
+'ibm-invalid-P59-ibm59i01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P59-ibm59i01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P58-ibm58i02'(suite) -> [];
+'ibm-invalid-P58-ibm58i02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P58-ibm58i02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P58-ibm58i01'(suite) -> [];
+'ibm-invalid-P58-ibm58i01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P58-ibm58i01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P56-ibm56i18'(suite) -> [];
+'ibm-invalid-P56-ibm56i18'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P56-ibm56i18.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P56-ibm56i17'(suite) -> [];
+'ibm-invalid-P56-ibm56i17'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P56-ibm56i17.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P56-ibm56i16'(suite) -> [];
+'ibm-invalid-P56-ibm56i16'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P56-ibm56i16.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P56-ibm56i15'(suite) -> [];
+'ibm-invalid-P56-ibm56i15'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P56-ibm56i15.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P56-ibm56i14'(suite) -> [];
+'ibm-invalid-P56-ibm56i14'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P56-ibm56i14.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P56-ibm56i13'(suite) -> [];
+'ibm-invalid-P56-ibm56i13'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P56-ibm56i13.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P56-ibm56i12'(suite) -> [];
+'ibm-invalid-P56-ibm56i12'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P56-ibm56i12.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P56-ibm56i11'(suite) -> [];
+'ibm-invalid-P56-ibm56i11'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P56-ibm56i11.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P56-ibm56i10'(suite) -> [];
+'ibm-invalid-P56-ibm56i10'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P56-ibm56i10.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P56-ibm56i09'(suite) -> [];
+'ibm-invalid-P56-ibm56i09'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P56-ibm56i09.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P56-ibm56i08'(suite) -> [];
+'ibm-invalid-P56-ibm56i08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P56-ibm56i08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P56-ibm56i07'(suite) -> [];
+'ibm-invalid-P56-ibm56i07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P56-ibm56i07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P56-ibm56i06'(suite) -> [];
+'ibm-invalid-P56-ibm56i06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P56-ibm56i06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P56-ibm56i05'(suite) -> [];
+'ibm-invalid-P56-ibm56i05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P56-ibm56i05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P56-ibm56i03'(suite) -> [];
+'ibm-invalid-P56-ibm56i03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P56-ibm56i03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P56-ibm56i02'(suite) -> [];
+'ibm-invalid-P56-ibm56i02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P56-ibm56i02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P56-ibm56i01'(suite) -> [];
+'ibm-invalid-P56-ibm56i01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P56-ibm56i01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P51-ibm51i03'(suite) -> [];
+'ibm-invalid-P51-ibm51i03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P51-ibm51i03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P51-ibm51i01'(suite) -> [];
+'ibm-invalid-P51-ibm51i01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P51-ibm51i01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P50-ibm50i01'(suite) -> [];
+'ibm-invalid-P50-ibm50i01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P50-ibm50i01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P49-ibm49i01'(suite) -> [];
+'ibm-invalid-P49-ibm49i01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P49-ibm49i01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P45-ibm45i01'(suite) -> [];
+'ibm-invalid-P45-ibm45i01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P45-ibm45i01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P41-ibm41i02'(suite) -> [];
+'ibm-invalid-P41-ibm41i02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P41-ibm41i02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P41-ibm41i01'(suite) -> [];
+'ibm-invalid-P41-ibm41i01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P41-ibm41i01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P39-ibm39i04'(suite) -> [];
+'ibm-invalid-P39-ibm39i04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P39-ibm39i04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P39-ibm39i03'(suite) -> [];
+'ibm-invalid-P39-ibm39i03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P39-ibm39i03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P39-ibm39i02'(suite) -> [];
+'ibm-invalid-P39-ibm39i02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P39-ibm39i02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P39-ibm39i01'(suite) -> [];
+'ibm-invalid-P39-ibm39i01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P39-ibm39i01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P32-ibm32i04'(suite) -> [];
+'ibm-invalid-P32-ibm32i04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P32-ibm32i04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P32-ibm32i03'(suite) -> [];
+'ibm-invalid-P32-ibm32i03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P32-ibm32i03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P32-ibm32i01'(suite) -> [];
+'ibm-invalid-P32-ibm32i01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P32-ibm32i01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-invalid-P28-ibm28i01'(suite) -> [];
+'ibm-invalid-P28-ibm28i01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-invalid-P28-ibm28i01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+%%----------------------------------------------------------------------
+
+'ibm-not-wf-P89-ibm89n12'(suite) -> [];
+'ibm-not-wf-P89-ibm89n12'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P89-ibm89n12.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P89-ibm89n11'(suite) -> [];
+'ibm-not-wf-P89-ibm89n11'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P89-ibm89n11.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P89-ibm89n10'(suite) -> [];
+'ibm-not-wf-P89-ibm89n10'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P89-ibm89n10.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P89-ibm89n09'(suite) -> [];
+'ibm-not-wf-P89-ibm89n09'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P89-ibm89n09.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P89-ibm89n08'(suite) -> [];
+'ibm-not-wf-P89-ibm89n08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P89-ibm89n08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P89-ibm89n07'(suite) -> [];
+'ibm-not-wf-P89-ibm89n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P89-ibm89n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P89-ibm89n06'(suite) -> [];
+'ibm-not-wf-P89-ibm89n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P89-ibm89n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P89-ibm89n05'(suite) -> [];
+'ibm-not-wf-P89-ibm89n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P89-ibm89n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P89-ibm89n04'(suite) -> [];
+'ibm-not-wf-P89-ibm89n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P89-ibm89n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P89-ibm89n03'(suite) -> [];
+'ibm-not-wf-P89-ibm89n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P89-ibm89n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P89-ibm89n02'(suite) -> [];
+'ibm-not-wf-P89-ibm89n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P89-ibm89n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P89-ibm89n01'(suite) -> [];
+'ibm-not-wf-P89-ibm89n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P89-ibm89n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P88-ibm88n16'(suite) -> [];
+'ibm-not-wf-P88-ibm88n16'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P88-ibm88n16.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P88-ibm88n15'(suite) -> [];
+'ibm-not-wf-P88-ibm88n15'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P88-ibm88n15.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P88-ibm88n14'(suite) -> [];
+'ibm-not-wf-P88-ibm88n14'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P88-ibm88n14.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P88-ibm88n13'(suite) -> [];
+'ibm-not-wf-P88-ibm88n13'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P88-ibm88n13.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P88-ibm88n12'(suite) -> [];
+'ibm-not-wf-P88-ibm88n12'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P88-ibm88n12.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P88-ibm88n11'(suite) -> [];
+'ibm-not-wf-P88-ibm88n11'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P88-ibm88n11.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P88-ibm88n10'(suite) -> [];
+'ibm-not-wf-P88-ibm88n10'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P88-ibm88n10.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P88-ibm88n09'(suite) -> [];
+'ibm-not-wf-P88-ibm88n09'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P88-ibm88n09.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P88-ibm88n08'(suite) -> [];
+'ibm-not-wf-P88-ibm88n08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P88-ibm88n08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P88-ibm88n06'(suite) -> [];
+'ibm-not-wf-P88-ibm88n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P88-ibm88n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P88-ibm88n05'(suite) -> [];
+'ibm-not-wf-P88-ibm88n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P88-ibm88n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P88-ibm88n04'(suite) -> [];
+'ibm-not-wf-P88-ibm88n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P88-ibm88n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P88-ibm88n03'(suite) -> [];
+'ibm-not-wf-P88-ibm88n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P88-ibm88n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P88-ibm88n02'(suite) -> [];
+'ibm-not-wf-P88-ibm88n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P88-ibm88n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P88-ibm88n01'(suite) -> [];
+'ibm-not-wf-P88-ibm88n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P88-ibm88n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n85'(suite) -> [];
+'ibm-not-wf-P87-ibm87n85'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n85.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n84'(suite) -> [];
+'ibm-not-wf-P87-ibm87n84'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n84.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n83'(suite) -> [];
+'ibm-not-wf-P87-ibm87n83'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n83.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n82'(suite) -> [];
+'ibm-not-wf-P87-ibm87n82'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n82.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n81'(suite) -> [];
+'ibm-not-wf-P87-ibm87n81'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n81.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n80'(suite) -> [];
+'ibm-not-wf-P87-ibm87n80'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n80.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n79'(suite) -> [];
+'ibm-not-wf-P87-ibm87n79'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n79.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n78'(suite) -> [];
+'ibm-not-wf-P87-ibm87n78'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n78.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n77'(suite) -> [];
+'ibm-not-wf-P87-ibm87n77'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n77.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n76'(suite) -> [];
+'ibm-not-wf-P87-ibm87n76'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n76.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n75'(suite) -> [];
+'ibm-not-wf-P87-ibm87n75'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n75.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n74'(suite) -> [];
+'ibm-not-wf-P87-ibm87n74'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n74.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n73'(suite) -> [];
+'ibm-not-wf-P87-ibm87n73'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n73.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n72'(suite) -> [];
+'ibm-not-wf-P87-ibm87n72'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n72.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n71'(suite) -> [];
+'ibm-not-wf-P87-ibm87n71'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n71.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n70'(suite) -> [];
+'ibm-not-wf-P87-ibm87n70'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n70.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n69'(suite) -> [];
+'ibm-not-wf-P87-ibm87n69'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n69.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n68'(suite) -> [];
+'ibm-not-wf-P87-ibm87n68'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n68.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n67'(suite) -> [];
+'ibm-not-wf-P87-ibm87n67'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n67.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n66'(suite) -> [];
+'ibm-not-wf-P87-ibm87n66'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n66.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n64'(suite) -> [];
+'ibm-not-wf-P87-ibm87n64'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n64.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n63'(suite) -> [];
+'ibm-not-wf-P87-ibm87n63'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n63.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n62'(suite) -> [];
+'ibm-not-wf-P87-ibm87n62'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n62.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n61'(suite) -> [];
+'ibm-not-wf-P87-ibm87n61'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n61.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n60'(suite) -> [];
+'ibm-not-wf-P87-ibm87n60'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n60.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n59'(suite) -> [];
+'ibm-not-wf-P87-ibm87n59'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n59.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n58'(suite) -> [];
+'ibm-not-wf-P87-ibm87n58'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n58.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n57'(suite) -> [];
+'ibm-not-wf-P87-ibm87n57'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n57.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n56'(suite) -> [];
+'ibm-not-wf-P87-ibm87n56'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n56.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n55'(suite) -> [];
+'ibm-not-wf-P87-ibm87n55'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n55.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n54'(suite) -> [];
+'ibm-not-wf-P87-ibm87n54'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n54.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n53'(suite) -> [];
+'ibm-not-wf-P87-ibm87n53'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n53.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n52'(suite) -> [];
+'ibm-not-wf-P87-ibm87n52'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n52.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n51'(suite) -> [];
+'ibm-not-wf-P87-ibm87n51'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n51.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n50'(suite) -> [];
+'ibm-not-wf-P87-ibm87n50'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n50.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n49'(suite) -> [];
+'ibm-not-wf-P87-ibm87n49'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n49.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n48'(suite) -> [];
+'ibm-not-wf-P87-ibm87n48'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n48.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n47'(suite) -> [];
+'ibm-not-wf-P87-ibm87n47'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n47.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n46'(suite) -> [];
+'ibm-not-wf-P87-ibm87n46'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n46.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n45'(suite) -> [];
+'ibm-not-wf-P87-ibm87n45'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n45.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n44'(suite) -> [];
+'ibm-not-wf-P87-ibm87n44'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n44.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n43'(suite) -> [];
+'ibm-not-wf-P87-ibm87n43'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n43.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n42'(suite) -> [];
+'ibm-not-wf-P87-ibm87n42'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n42.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n41'(suite) -> [];
+'ibm-not-wf-P87-ibm87n41'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n41.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n40'(suite) -> [];
+'ibm-not-wf-P87-ibm87n40'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n40.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n39'(suite) -> [];
+'ibm-not-wf-P87-ibm87n39'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n39.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n38'(suite) -> [];
+'ibm-not-wf-P87-ibm87n38'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n38.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n37'(suite) -> [];
+'ibm-not-wf-P87-ibm87n37'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n37.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n36'(suite) -> [];
+'ibm-not-wf-P87-ibm87n36'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n36.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n35'(suite) -> [];
+'ibm-not-wf-P87-ibm87n35'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n35.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n34'(suite) -> [];
+'ibm-not-wf-P87-ibm87n34'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n34.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n33'(suite) -> [];
+'ibm-not-wf-P87-ibm87n33'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n33.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n32'(suite) -> [];
+'ibm-not-wf-P87-ibm87n32'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n32.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n31'(suite) -> [];
+'ibm-not-wf-P87-ibm87n31'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n31.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n30'(suite) -> [];
+'ibm-not-wf-P87-ibm87n30'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n30.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n29'(suite) -> [];
+'ibm-not-wf-P87-ibm87n29'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n29.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n28'(suite) -> [];
+'ibm-not-wf-P87-ibm87n28'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n28.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n27'(suite) -> [];
+'ibm-not-wf-P87-ibm87n27'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n27.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n26'(suite) -> [];
+'ibm-not-wf-P87-ibm87n26'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n26.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n25'(suite) -> [];
+'ibm-not-wf-P87-ibm87n25'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n25.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n24'(suite) -> [];
+'ibm-not-wf-P87-ibm87n24'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n24.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n23'(suite) -> [];
+'ibm-not-wf-P87-ibm87n23'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n23.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n22'(suite) -> [];
+'ibm-not-wf-P87-ibm87n22'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n22.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n21'(suite) -> [];
+'ibm-not-wf-P87-ibm87n21'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n21.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n20'(suite) -> [];
+'ibm-not-wf-P87-ibm87n20'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n20.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n19'(suite) -> [];
+'ibm-not-wf-P87-ibm87n19'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n19.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n18'(suite) -> [];
+'ibm-not-wf-P87-ibm87n18'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n18.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n17'(suite) -> [];
+'ibm-not-wf-P87-ibm87n17'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n17.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n16'(suite) -> [];
+'ibm-not-wf-P87-ibm87n16'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n16.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n15'(suite) -> [];
+'ibm-not-wf-P87-ibm87n15'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n15.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n14'(suite) -> [];
+'ibm-not-wf-P87-ibm87n14'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n14.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n13'(suite) -> [];
+'ibm-not-wf-P87-ibm87n13'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n13.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n12'(suite) -> [];
+'ibm-not-wf-P87-ibm87n12'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n12.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n11'(suite) -> [];
+'ibm-not-wf-P87-ibm87n11'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n11.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n10'(suite) -> [];
+'ibm-not-wf-P87-ibm87n10'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n10.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n09'(suite) -> [];
+'ibm-not-wf-P87-ibm87n09'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n09.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n08'(suite) -> [];
+'ibm-not-wf-P87-ibm87n08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n07'(suite) -> [];
+'ibm-not-wf-P87-ibm87n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n06'(suite) -> [];
+'ibm-not-wf-P87-ibm87n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n05'(suite) -> [];
+'ibm-not-wf-P87-ibm87n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n04'(suite) -> [];
+'ibm-not-wf-P87-ibm87n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n03'(suite) -> [];
+'ibm-not-wf-P87-ibm87n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n02'(suite) -> [];
+'ibm-not-wf-P87-ibm87n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P87-ibm87n01'(suite) -> [];
+'ibm-not-wf-P87-ibm87n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P87-ibm87n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P86-ibm86n04'(suite) -> [];
+'ibm-not-wf-P86-ibm86n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P86-ibm86n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P86-ibm86n03'(suite) -> [];
+'ibm-not-wf-P86-ibm86n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P86-ibm86n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P86-ibm86n02'(suite) -> [];
+'ibm-not-wf-P86-ibm86n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P86-ibm86n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P86-ibm86n01'(suite) -> [];
+'ibm-not-wf-P86-ibm86n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P86-ibm86n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n99'(suite) -> [];
+'ibm-not-wf-P85-ibm85n99'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n99.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n98'(suite) -> [];
+'ibm-not-wf-P85-ibm85n98'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n98.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n97'(suite) -> [];
+'ibm-not-wf-P85-ibm85n97'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n97.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n96'(suite) -> [];
+'ibm-not-wf-P85-ibm85n96'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n96.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n95'(suite) -> [];
+'ibm-not-wf-P85-ibm85n95'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n95.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n94'(suite) -> [];
+'ibm-not-wf-P85-ibm85n94'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n94.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n93'(suite) -> [];
+'ibm-not-wf-P85-ibm85n93'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n93.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n92'(suite) -> [];
+'ibm-not-wf-P85-ibm85n92'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n92.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n91'(suite) -> [];
+'ibm-not-wf-P85-ibm85n91'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n91.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n90'(suite) -> [];
+'ibm-not-wf-P85-ibm85n90'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n90.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n89'(suite) -> [];
+'ibm-not-wf-P85-ibm85n89'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n89.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n88'(suite) -> [];
+'ibm-not-wf-P85-ibm85n88'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n88.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n87'(suite) -> [];
+'ibm-not-wf-P85-ibm85n87'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n87.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n86'(suite) -> [];
+'ibm-not-wf-P85-ibm85n86'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n86.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n85'(suite) -> [];
+'ibm-not-wf-P85-ibm85n85'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n85.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n84'(suite) -> [];
+'ibm-not-wf-P85-ibm85n84'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n84.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n83'(suite) -> [];
+'ibm-not-wf-P85-ibm85n83'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n83.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n82'(suite) -> [];
+'ibm-not-wf-P85-ibm85n82'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n82.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n81'(suite) -> [];
+'ibm-not-wf-P85-ibm85n81'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n81.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n80'(suite) -> [];
+'ibm-not-wf-P85-ibm85n80'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n80.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n79'(suite) -> [];
+'ibm-not-wf-P85-ibm85n79'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n79.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n78'(suite) -> [];
+'ibm-not-wf-P85-ibm85n78'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n78.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n77'(suite) -> [];
+'ibm-not-wf-P85-ibm85n77'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n77.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n76'(suite) -> [];
+'ibm-not-wf-P85-ibm85n76'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n76.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n75'(suite) -> [];
+'ibm-not-wf-P85-ibm85n75'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n75.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n74'(suite) -> [];
+'ibm-not-wf-P85-ibm85n74'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n74.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n73'(suite) -> [];
+'ibm-not-wf-P85-ibm85n73'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n73.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n72'(suite) -> [];
+'ibm-not-wf-P85-ibm85n72'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n72.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n71'(suite) -> [];
+'ibm-not-wf-P85-ibm85n71'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n71.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n70'(suite) -> [];
+'ibm-not-wf-P85-ibm85n70'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n70.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n69'(suite) -> [];
+'ibm-not-wf-P85-ibm85n69'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n69.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n68'(suite) -> [];
+'ibm-not-wf-P85-ibm85n68'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n68.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n67'(suite) -> [];
+'ibm-not-wf-P85-ibm85n67'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n67.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n66'(suite) -> [];
+'ibm-not-wf-P85-ibm85n66'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n66.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n65'(suite) -> [];
+'ibm-not-wf-P85-ibm85n65'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n65.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n64'(suite) -> [];
+'ibm-not-wf-P85-ibm85n64'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n64.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n63'(suite) -> [];
+'ibm-not-wf-P85-ibm85n63'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n63.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n62'(suite) -> [];
+'ibm-not-wf-P85-ibm85n62'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n62.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n61'(suite) -> [];
+'ibm-not-wf-P85-ibm85n61'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n61.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n60'(suite) -> [];
+'ibm-not-wf-P85-ibm85n60'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n60.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n59'(suite) -> [];
+'ibm-not-wf-P85-ibm85n59'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n59.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n58'(suite) -> [];
+'ibm-not-wf-P85-ibm85n58'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n58.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n57'(suite) -> [];
+'ibm-not-wf-P85-ibm85n57'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n57.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n56'(suite) -> [];
+'ibm-not-wf-P85-ibm85n56'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n56.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n55'(suite) -> [];
+'ibm-not-wf-P85-ibm85n55'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n55.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n54'(suite) -> [];
+'ibm-not-wf-P85-ibm85n54'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n54.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n53'(suite) -> [];
+'ibm-not-wf-P85-ibm85n53'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n53.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n52'(suite) -> [];
+'ibm-not-wf-P85-ibm85n52'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n52.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n51'(suite) -> [];
+'ibm-not-wf-P85-ibm85n51'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n51.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n50'(suite) -> [];
+'ibm-not-wf-P85-ibm85n50'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n50.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n49'(suite) -> [];
+'ibm-not-wf-P85-ibm85n49'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n49.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n48'(suite) -> [];
+'ibm-not-wf-P85-ibm85n48'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n48.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n47'(suite) -> [];
+'ibm-not-wf-P85-ibm85n47'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n47.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n46'(suite) -> [];
+'ibm-not-wf-P85-ibm85n46'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n46.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n45'(suite) -> [];
+'ibm-not-wf-P85-ibm85n45'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n45.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n44'(suite) -> [];
+'ibm-not-wf-P85-ibm85n44'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n44.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n43'(suite) -> [];
+'ibm-not-wf-P85-ibm85n43'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n43.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n42'(suite) -> [];
+'ibm-not-wf-P85-ibm85n42'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n42.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n41'(suite) -> [];
+'ibm-not-wf-P85-ibm85n41'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n41.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n40'(suite) -> [];
+'ibm-not-wf-P85-ibm85n40'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n40.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n39'(suite) -> [];
+'ibm-not-wf-P85-ibm85n39'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n39.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n38'(suite) -> [];
+'ibm-not-wf-P85-ibm85n38'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n38.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n37'(suite) -> [];
+'ibm-not-wf-P85-ibm85n37'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n37.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n36'(suite) -> [];
+'ibm-not-wf-P85-ibm85n36'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n36.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n35'(suite) -> [];
+'ibm-not-wf-P85-ibm85n35'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n35.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n34'(suite) -> [];
+'ibm-not-wf-P85-ibm85n34'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n34.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n33'(suite) -> [];
+'ibm-not-wf-P85-ibm85n33'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n33.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n32'(suite) -> [];
+'ibm-not-wf-P85-ibm85n32'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n32.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n31'(suite) -> [];
+'ibm-not-wf-P85-ibm85n31'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n31.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n30'(suite) -> [];
+'ibm-not-wf-P85-ibm85n30'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n30.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n29'(suite) -> [];
+'ibm-not-wf-P85-ibm85n29'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n29.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n28'(suite) -> [];
+'ibm-not-wf-P85-ibm85n28'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n28.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n27'(suite) -> [];
+'ibm-not-wf-P85-ibm85n27'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n27.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n26'(suite) -> [];
+'ibm-not-wf-P85-ibm85n26'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n26.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n25'(suite) -> [];
+'ibm-not-wf-P85-ibm85n25'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n25.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n24'(suite) -> [];
+'ibm-not-wf-P85-ibm85n24'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n24.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n23'(suite) -> [];
+'ibm-not-wf-P85-ibm85n23'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n23.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n22'(suite) -> [];
+'ibm-not-wf-P85-ibm85n22'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n22.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n21'(suite) -> [];
+'ibm-not-wf-P85-ibm85n21'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n21.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n20'(suite) -> [];
+'ibm-not-wf-P85-ibm85n20'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n20.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n198'(suite) -> [];
+'ibm-not-wf-P85-ibm85n198'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n198.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n197'(suite) -> [];
+'ibm-not-wf-P85-ibm85n197'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n197.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n196'(suite) -> [];
+'ibm-not-wf-P85-ibm85n196'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n196.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n195'(suite) -> [];
+'ibm-not-wf-P85-ibm85n195'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n195.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n194'(suite) -> [];
+'ibm-not-wf-P85-ibm85n194'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n194.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n193'(suite) -> [];
+'ibm-not-wf-P85-ibm85n193'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n193.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n192'(suite) -> [];
+'ibm-not-wf-P85-ibm85n192'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n192.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n191'(suite) -> [];
+'ibm-not-wf-P85-ibm85n191'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n191.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n190'(suite) -> [];
+'ibm-not-wf-P85-ibm85n190'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n190.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n19'(suite) -> [];
+'ibm-not-wf-P85-ibm85n19'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n19.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n189'(suite) -> [];
+'ibm-not-wf-P85-ibm85n189'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n189.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n188'(suite) -> [];
+'ibm-not-wf-P85-ibm85n188'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n188.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n187'(suite) -> [];
+'ibm-not-wf-P85-ibm85n187'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n187.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n186'(suite) -> [];
+'ibm-not-wf-P85-ibm85n186'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n186.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n185'(suite) -> [];
+'ibm-not-wf-P85-ibm85n185'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n185.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n184'(suite) -> [];
+'ibm-not-wf-P85-ibm85n184'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n184.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n183'(suite) -> [];
+'ibm-not-wf-P85-ibm85n183'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n183.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n182'(suite) -> [];
+'ibm-not-wf-P85-ibm85n182'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n182.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n181'(suite) -> [];
+'ibm-not-wf-P85-ibm85n181'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n181.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n180'(suite) -> [];
+'ibm-not-wf-P85-ibm85n180'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n180.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n18'(suite) -> [];
+'ibm-not-wf-P85-ibm85n18'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n18.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n179'(suite) -> [];
+'ibm-not-wf-P85-ibm85n179'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n179.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n178'(suite) -> [];
+'ibm-not-wf-P85-ibm85n178'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n178.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n177'(suite) -> [];
+'ibm-not-wf-P85-ibm85n177'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n177.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n176'(suite) -> [];
+'ibm-not-wf-P85-ibm85n176'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n176.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n175'(suite) -> [];
+'ibm-not-wf-P85-ibm85n175'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n175.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n174'(suite) -> [];
+'ibm-not-wf-P85-ibm85n174'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n174.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n173'(suite) -> [];
+'ibm-not-wf-P85-ibm85n173'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n173.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n172'(suite) -> [];
+'ibm-not-wf-P85-ibm85n172'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n172.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n171'(suite) -> [];
+'ibm-not-wf-P85-ibm85n171'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n171.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n170'(suite) -> [];
+'ibm-not-wf-P85-ibm85n170'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n170.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n17'(suite) -> [];
+'ibm-not-wf-P85-ibm85n17'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n17.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n169'(suite) -> [];
+'ibm-not-wf-P85-ibm85n169'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n169.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n168'(suite) -> [];
+'ibm-not-wf-P85-ibm85n168'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n168.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n167'(suite) -> [];
+'ibm-not-wf-P85-ibm85n167'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n167.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n166'(suite) -> [];
+'ibm-not-wf-P85-ibm85n166'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n166.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n165'(suite) -> [];
+'ibm-not-wf-P85-ibm85n165'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n165.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n164'(suite) -> [];
+'ibm-not-wf-P85-ibm85n164'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n164.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n163'(suite) -> [];
+'ibm-not-wf-P85-ibm85n163'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n163.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n162'(suite) -> [];
+'ibm-not-wf-P85-ibm85n162'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n162.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n161'(suite) -> [];
+'ibm-not-wf-P85-ibm85n161'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n161.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n160'(suite) -> [];
+'ibm-not-wf-P85-ibm85n160'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n160.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n16'(suite) -> [];
+'ibm-not-wf-P85-ibm85n16'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n16.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n159'(suite) -> [];
+'ibm-not-wf-P85-ibm85n159'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n159.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n158'(suite) -> [];
+'ibm-not-wf-P85-ibm85n158'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n158.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n157'(suite) -> [];
+'ibm-not-wf-P85-ibm85n157'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n157.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n156'(suite) -> [];
+'ibm-not-wf-P85-ibm85n156'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n156.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n155'(suite) -> [];
+'ibm-not-wf-P85-ibm85n155'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n155.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n154'(suite) -> [];
+'ibm-not-wf-P85-ibm85n154'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n154.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n153'(suite) -> [];
+'ibm-not-wf-P85-ibm85n153'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n153.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n152'(suite) -> [];
+'ibm-not-wf-P85-ibm85n152'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n152.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n151'(suite) -> [];
+'ibm-not-wf-P85-ibm85n151'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n151.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n150'(suite) -> [];
+'ibm-not-wf-P85-ibm85n150'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n150.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n15'(suite) -> [];
+'ibm-not-wf-P85-ibm85n15'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n15.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n149'(suite) -> [];
+'ibm-not-wf-P85-ibm85n149'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n149.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n148'(suite) -> [];
+'ibm-not-wf-P85-ibm85n148'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n148.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n147'(suite) -> [];
+'ibm-not-wf-P85-ibm85n147'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n147.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n146'(suite) -> [];
+'ibm-not-wf-P85-ibm85n146'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n146.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n145'(suite) -> [];
+'ibm-not-wf-P85-ibm85n145'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n145.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n144'(suite) -> [];
+'ibm-not-wf-P85-ibm85n144'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n144.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n143'(suite) -> [];
+'ibm-not-wf-P85-ibm85n143'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n143.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n142'(suite) -> [];
+'ibm-not-wf-P85-ibm85n142'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n142.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n141'(suite) -> [];
+'ibm-not-wf-P85-ibm85n141'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n141.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n140'(suite) -> [];
+'ibm-not-wf-P85-ibm85n140'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n140.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n14'(suite) -> [];
+'ibm-not-wf-P85-ibm85n14'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n14.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n139'(suite) -> [];
+'ibm-not-wf-P85-ibm85n139'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n139.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n138'(suite) -> [];
+'ibm-not-wf-P85-ibm85n138'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n138.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n137'(suite) -> [];
+'ibm-not-wf-P85-ibm85n137'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n137.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n136'(suite) -> [];
+'ibm-not-wf-P85-ibm85n136'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n136.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n135'(suite) -> [];
+'ibm-not-wf-P85-ibm85n135'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n135.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n134'(suite) -> [];
+'ibm-not-wf-P85-ibm85n134'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n134.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n133'(suite) -> [];
+'ibm-not-wf-P85-ibm85n133'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n133.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n132'(suite) -> [];
+'ibm-not-wf-P85-ibm85n132'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n132.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n131'(suite) -> [];
+'ibm-not-wf-P85-ibm85n131'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n131.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n130'(suite) -> [];
+'ibm-not-wf-P85-ibm85n130'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n130.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n13'(suite) -> [];
+'ibm-not-wf-P85-ibm85n13'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n13.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n129'(suite) -> [];
+'ibm-not-wf-P85-ibm85n129'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n129.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n128'(suite) -> [];
+'ibm-not-wf-P85-ibm85n128'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n128.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n127'(suite) -> [];
+'ibm-not-wf-P85-ibm85n127'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n127.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n126'(suite) -> [];
+'ibm-not-wf-P85-ibm85n126'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n126.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n125'(suite) -> [];
+'ibm-not-wf-P85-ibm85n125'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n125.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n124'(suite) -> [];
+'ibm-not-wf-P85-ibm85n124'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n124.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n123'(suite) -> [];
+'ibm-not-wf-P85-ibm85n123'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n123.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n122'(suite) -> [];
+'ibm-not-wf-P85-ibm85n122'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n122.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n121'(suite) -> [];
+'ibm-not-wf-P85-ibm85n121'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n121.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n120'(suite) -> [];
+'ibm-not-wf-P85-ibm85n120'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n120.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n12'(suite) -> [];
+'ibm-not-wf-P85-ibm85n12'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n12.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n119'(suite) -> [];
+'ibm-not-wf-P85-ibm85n119'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n119.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n118'(suite) -> [];
+'ibm-not-wf-P85-ibm85n118'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n118.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n117'(suite) -> [];
+'ibm-not-wf-P85-ibm85n117'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n117.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n116'(suite) -> [];
+'ibm-not-wf-P85-ibm85n116'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n116.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n115'(suite) -> [];
+'ibm-not-wf-P85-ibm85n115'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n115.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n114'(suite) -> [];
+'ibm-not-wf-P85-ibm85n114'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n114.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n113'(suite) -> [];
+'ibm-not-wf-P85-ibm85n113'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n113.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n112'(suite) -> [];
+'ibm-not-wf-P85-ibm85n112'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n112.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n111'(suite) -> [];
+'ibm-not-wf-P85-ibm85n111'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n111.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n110'(suite) -> [];
+'ibm-not-wf-P85-ibm85n110'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n110.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n11'(suite) -> [];
+'ibm-not-wf-P85-ibm85n11'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n11.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n109'(suite) -> [];
+'ibm-not-wf-P85-ibm85n109'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n109.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n108'(suite) -> [];
+'ibm-not-wf-P85-ibm85n108'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n108.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n107'(suite) -> [];
+'ibm-not-wf-P85-ibm85n107'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n107.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n106'(suite) -> [];
+'ibm-not-wf-P85-ibm85n106'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n106.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n105'(suite) -> [];
+'ibm-not-wf-P85-ibm85n105'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n105.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n104'(suite) -> [];
+'ibm-not-wf-P85-ibm85n104'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n104.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n103'(suite) -> [];
+'ibm-not-wf-P85-ibm85n103'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n103.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n102'(suite) -> [];
+'ibm-not-wf-P85-ibm85n102'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n102.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n101'(suite) -> [];
+'ibm-not-wf-P85-ibm85n101'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n101.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n100'(suite) -> [];
+'ibm-not-wf-P85-ibm85n100'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n100.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n10'(suite) -> [];
+'ibm-not-wf-P85-ibm85n10'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n10.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n09'(suite) -> [];
+'ibm-not-wf-P85-ibm85n09'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n09.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n08'(suite) -> [];
+'ibm-not-wf-P85-ibm85n08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n07'(suite) -> [];
+'ibm-not-wf-P85-ibm85n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n06'(suite) -> [];
+'ibm-not-wf-P85-ibm85n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n05'(suite) -> [];
+'ibm-not-wf-P85-ibm85n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n04'(suite) -> [];
+'ibm-not-wf-P85-ibm85n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n03'(suite) -> [];
+'ibm-not-wf-P85-ibm85n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n02'(suite) -> [];
+'ibm-not-wf-P85-ibm85n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P85-ibm85n01'(suite) -> [];
+'ibm-not-wf-P85-ibm85n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P85-ibm85n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P83-ibm83n06'(suite) -> [];
+'ibm-not-wf-P83-ibm83n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P83-ibm83n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P83-ibm83n05'(suite) -> [];
+'ibm-not-wf-P83-ibm83n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P83-ibm83n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P83-ibm83n04'(suite) -> [];
+'ibm-not-wf-P83-ibm83n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P83-ibm83n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P83-ibm83n03'(suite) -> [];
+'ibm-not-wf-P83-ibm83n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P83-ibm83n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P83-ibm83n02'(suite) -> [];
+'ibm-not-wf-P83-ibm83n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P83-ibm83n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P83-ibm83n01'(suite) -> [];
+'ibm-not-wf-P83-ibm83n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P83-ibm83n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P82-ibm82n08'(suite) -> [];
+'ibm-not-wf-P82-ibm82n08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P82-ibm82n08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P82-ibm82n07'(suite) -> [];
+'ibm-not-wf-P82-ibm82n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P82-ibm82n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P82-ibm82n06'(suite) -> [];
+'ibm-not-wf-P82-ibm82n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P82-ibm82n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P82-ibm82n05'(suite) -> [];
+'ibm-not-wf-P82-ibm82n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P82-ibm82n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P82-ibm82n04'(suite) -> [];
+'ibm-not-wf-P82-ibm82n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P82-ibm82n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P82-ibm82n03'(suite) -> [];
+'ibm-not-wf-P82-ibm82n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P82-ibm82n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P82-ibm82n02'(suite) -> [];
+'ibm-not-wf-P82-ibm82n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P82-ibm82n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P82-ibm82n01'(suite) -> [];
+'ibm-not-wf-P82-ibm82n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P82-ibm82n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P81-ibm81n09'(suite) -> [];
+'ibm-not-wf-P81-ibm81n09'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P81-ibm81n09.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P81-ibm81n08'(suite) -> [];
+'ibm-not-wf-P81-ibm81n08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P81-ibm81n08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P81-ibm81n07'(suite) -> [];
+'ibm-not-wf-P81-ibm81n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P81-ibm81n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P81-ibm81n06'(suite) -> [];
+'ibm-not-wf-P81-ibm81n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P81-ibm81n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P81-ibm81n05'(suite) -> [];
+'ibm-not-wf-P81-ibm81n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P81-ibm81n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P81-ibm81n04'(suite) -> [];
+'ibm-not-wf-P81-ibm81n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P81-ibm81n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P81-ibm81n03'(suite) -> [];
+'ibm-not-wf-P81-ibm81n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P81-ibm81n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P81-ibm81n02'(suite) -> [];
+'ibm-not-wf-P81-ibm81n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P81-ibm81n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P81-ibm81n01'(suite) -> [];
+'ibm-not-wf-P81-ibm81n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P81-ibm81n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P80-ibm80n06'(suite) -> [];
+'ibm-not-wf-P80-ibm80n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P80-ibm80n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P80-ibm80n05'(suite) -> [];
+'ibm-not-wf-P80-ibm80n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P80-ibm80n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P80-ibm80n04'(suite) -> [];
+'ibm-not-wf-P80-ibm80n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P80-ibm80n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P80-ibm80n03'(suite) -> [];
+'ibm-not-wf-P80-ibm80n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P80-ibm80n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P80-ibm80n02'(suite) -> [];
+'ibm-not-wf-P80-ibm80n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P80-ibm80n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P80-ibm80n01'(suite) -> [];
+'ibm-not-wf-P80-ibm80n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P80-ibm80n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P79-ibm79n02'(suite) -> [];
+'ibm-not-wf-P79-ibm79n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P79-ibm79n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P79-ibm79n01'(suite) -> [];
+'ibm-not-wf-P79-ibm79n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P79-ibm79n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P78-ibm78n02'(suite) -> [];
+'ibm-not-wf-P78-ibm78n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P78-ibm78n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P78-ibm78n01'(suite) -> [];
+'ibm-not-wf-P78-ibm78n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P78-ibm78n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P77-ibm77n04'(suite) -> [];
+'ibm-not-wf-P77-ibm77n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P77-ibm77n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P77-ibm77n03'(suite) -> [];
+'ibm-not-wf-P77-ibm77n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P77-ibm77n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P77-ibm77n02'(suite) -> [];
+'ibm-not-wf-P77-ibm77n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P77-ibm77n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P77-ibm77n01'(suite) -> [];
+'ibm-not-wf-P77-ibm77n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P77-ibm77n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P76-ibm76n07'(suite) -> [];
+'ibm-not-wf-P76-ibm76n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P76-ibm76n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P76-ibm76n06'(suite) -> [];
+'ibm-not-wf-P76-ibm76n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P76-ibm76n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P76-ibm76n05'(suite) -> [];
+'ibm-not-wf-P76-ibm76n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P76-ibm76n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P76-ibm76n04'(suite) -> [];
+'ibm-not-wf-P76-ibm76n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P76-ibm76n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P76-ibm76n03'(suite) -> [];
+'ibm-not-wf-P76-ibm76n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P76-ibm76n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P76-ibm76n02'(suite) -> [];
+'ibm-not-wf-P76-ibm76n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P76-ibm76n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P76-ibm76n01'(suite) -> [];
+'ibm-not-wf-P76-ibm76n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P76-ibm76n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P75-ibm75n13'(suite) -> [];
+'ibm-not-wf-P75-ibm75n13'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P75-ibm75n13.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P75-ibm75n12'(suite) -> [];
+'ibm-not-wf-P75-ibm75n12'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P75-ibm75n12.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P75-ibm75n11'(suite) -> [];
+'ibm-not-wf-P75-ibm75n11'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P75-ibm75n11.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P75-ibm75n10'(suite) -> [];
+'ibm-not-wf-P75-ibm75n10'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P75-ibm75n10.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P75-ibm75n09'(suite) -> [];
+'ibm-not-wf-P75-ibm75n09'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P75-ibm75n09.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P75-ibm75n08'(suite) -> [];
+'ibm-not-wf-P75-ibm75n08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P75-ibm75n08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P75-ibm75n07'(suite) -> [];
+'ibm-not-wf-P75-ibm75n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P75-ibm75n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P75-ibm75n06'(suite) -> [];
+'ibm-not-wf-P75-ibm75n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P75-ibm75n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P75-ibm75n05'(suite) -> [];
+'ibm-not-wf-P75-ibm75n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P75-ibm75n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P75-ibm75n04'(suite) -> [];
+'ibm-not-wf-P75-ibm75n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P75-ibm75n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P75-ibm75n03'(suite) -> [];
+'ibm-not-wf-P75-ibm75n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P75-ibm75n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P75-ibm75n02'(suite) -> [];
+'ibm-not-wf-P75-ibm75n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P75-ibm75n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P75-ibm75n01'(suite) -> [];
+'ibm-not-wf-P75-ibm75n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P75-ibm75n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P74-ibm74n01'(suite) -> [];
+'ibm-not-wf-P74-ibm74n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P74-ibm74n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P73-ibm73n03'(suite) -> [];
+'ibm-not-wf-P73-ibm73n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P73-ibm73n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P73-ibm73n01'(suite) -> [];
+'ibm-not-wf-P73-ibm73n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P73-ibm73n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P72-ibm72n09'(suite) -> [];
+'ibm-not-wf-P72-ibm72n09'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P72-ibm72n09.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P72-ibm72n08'(suite) -> [];
+'ibm-not-wf-P72-ibm72n08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P72-ibm72n08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P72-ibm72n07'(suite) -> [];
+'ibm-not-wf-P72-ibm72n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P72-ibm72n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P72-ibm72n06'(suite) -> [];
+'ibm-not-wf-P72-ibm72n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P72-ibm72n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P72-ibm72n05'(suite) -> [];
+'ibm-not-wf-P72-ibm72n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P72-ibm72n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P72-ibm72n04'(suite) -> [];
+'ibm-not-wf-P72-ibm72n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P72-ibm72n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P72-ibm72n03'(suite) -> [];
+'ibm-not-wf-P72-ibm72n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P72-ibm72n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P72-ibm72n02'(suite) -> [];
+'ibm-not-wf-P72-ibm72n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P72-ibm72n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P72-ibm72n01'(suite) -> [];
+'ibm-not-wf-P72-ibm72n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P72-ibm72n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P71-ibm71n08'(suite) -> [];
+'ibm-not-wf-P71-ibm71n08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P71-ibm71n08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P71-ibm71n07'(suite) -> [];
+'ibm-not-wf-P71-ibm71n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P71-ibm71n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P71-ibm71n06'(suite) -> [];
+'ibm-not-wf-P71-ibm71n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P71-ibm71n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P71-ibm71n05'(suite) -> [];
+'ibm-not-wf-P71-ibm71n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P71-ibm71n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P71-ibm71n04'(suite) -> [];
+'ibm-not-wf-P71-ibm71n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P71-ibm71n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P71-ibm71n03'(suite) -> [];
+'ibm-not-wf-P71-ibm71n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P71-ibm71n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P71-ibm71n02'(suite) -> [];
+'ibm-not-wf-P71-ibm71n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P71-ibm71n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P71-ibm71n01'(suite) -> [];
+'ibm-not-wf-P71-ibm71n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P71-ibm71n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P71-ibm70n01'(suite) -> [];
+'ibm-not-wf-P71-ibm70n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P71-ibm70n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P69-ibm69n07'(suite) -> [];
+'ibm-not-wf-P69-ibm69n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P69-ibm69n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P69-ibm69n06'(suite) -> [];
+'ibm-not-wf-P69-ibm69n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P69-ibm69n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P69-ibm69n05'(suite) -> [];
+'ibm-not-wf-P69-ibm69n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P69-ibm69n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P69-ibm69n04'(suite) -> [];
+'ibm-not-wf-P69-ibm69n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P69-ibm69n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P69-ibm69n03'(suite) -> [];
+'ibm-not-wf-P69-ibm69n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P69-ibm69n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P69-ibm69n02'(suite) -> [];
+'ibm-not-wf-P69-ibm69n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P69-ibm69n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P69-ibm69n01'(suite) -> [];
+'ibm-not-wf-P69-ibm69n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P69-ibm69n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P68-ibm68n10'(suite) -> [];
+'ibm-not-wf-P68-ibm68n10'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P68-ibm68n10.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P68-ibm68n09'(suite) -> [];
+'ibm-not-wf-P68-ibm68n09'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P68-ibm68n09.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P68-ibm68n08'(suite) -> [];
+'ibm-not-wf-P68-ibm68n08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P68-ibm68n08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P68-ibm68n07'(suite) -> [];
+'ibm-not-wf-P68-ibm68n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P68-ibm68n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P68-ibm68n06'(suite) -> [];
+'ibm-not-wf-P68-ibm68n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P68-ibm68n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P68-ibm68n05'(suite) -> [];
+'ibm-not-wf-P68-ibm68n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P68-ibm68n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P68-ibm68n04'(suite) -> [];
+'ibm-not-wf-P68-ibm68n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P68-ibm68n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P68-ibm68n03'(suite) -> [];
+'ibm-not-wf-P68-ibm68n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P68-ibm68n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P68-ibm68n02'(suite) -> [];
+'ibm-not-wf-P68-ibm68n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P68-ibm68n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P68-ibm68n01'(suite) -> [];
+'ibm-not-wf-P68-ibm68n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P68-ibm68n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P66-ibm66n15'(suite) -> [];
+'ibm-not-wf-P66-ibm66n15'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P66-ibm66n15.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P66-ibm66n14'(suite) -> [];
+'ibm-not-wf-P66-ibm66n14'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P66-ibm66n14.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P66-ibm66n13'(suite) -> [];
+'ibm-not-wf-P66-ibm66n13'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P66-ibm66n13.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P66-ibm66n12'(suite) -> [];
+'ibm-not-wf-P66-ibm66n12'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P66-ibm66n12.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P66-ibm66n11'(suite) -> [];
+'ibm-not-wf-P66-ibm66n11'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P66-ibm66n11.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P66-ibm66n10'(suite) -> [];
+'ibm-not-wf-P66-ibm66n10'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P66-ibm66n10.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P66-ibm66n09'(suite) -> [];
+'ibm-not-wf-P66-ibm66n09'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P66-ibm66n09.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P66-ibm66n08'(suite) -> [];
+'ibm-not-wf-P66-ibm66n08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P66-ibm66n08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P66-ibm66n07'(suite) -> [];
+'ibm-not-wf-P66-ibm66n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P66-ibm66n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P66-ibm66n06'(suite) -> [];
+'ibm-not-wf-P66-ibm66n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P66-ibm66n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P66-ibm66n05'(suite) -> [];
+'ibm-not-wf-P66-ibm66n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P66-ibm66n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P66-ibm66n04'(suite) -> [];
+'ibm-not-wf-P66-ibm66n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P66-ibm66n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P66-ibm66n03'(suite) -> [];
+'ibm-not-wf-P66-ibm66n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P66-ibm66n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P66-ibm66n02'(suite) -> [];
+'ibm-not-wf-P66-ibm66n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P66-ibm66n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P66-ibm66n01'(suite) -> [];
+'ibm-not-wf-P66-ibm66n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P66-ibm66n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P65-ibm65n02'(suite) -> [];
+'ibm-not-wf-P65-ibm65n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P65-ibm65n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P65-ibm65n01'(suite) -> [];
+'ibm-not-wf-P65-ibm65n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P65-ibm65n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P64-ibm64n03'(suite) -> [];
+'ibm-not-wf-P64-ibm64n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P64-ibm64n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P64-ibm64n02'(suite) -> [];
+'ibm-not-wf-P64-ibm64n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P64-ibm64n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P64-ibm64n01'(suite) -> [];
+'ibm-not-wf-P64-ibm64n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P64-ibm64n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P63-ibm63n07'(suite) -> [];
+'ibm-not-wf-P63-ibm63n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P63-ibm63n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P63-ibm63n06'(suite) -> [];
+'ibm-not-wf-P63-ibm63n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P63-ibm63n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P63-ibm63n05'(suite) -> [];
+'ibm-not-wf-P63-ibm63n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P63-ibm63n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P63-ibm63n04'(suite) -> [];
+'ibm-not-wf-P63-ibm63n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P63-ibm63n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P63-ibm63n03'(suite) -> [];
+'ibm-not-wf-P63-ibm63n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P63-ibm63n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P63-ibm63n02'(suite) -> [];
+'ibm-not-wf-P63-ibm63n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P63-ibm63n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P63-ibm63n01'(suite) -> [];
+'ibm-not-wf-P63-ibm63n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P63-ibm63n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P62-ibm62n08'(suite) -> [];
+'ibm-not-wf-P62-ibm62n08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P62-ibm62n08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P62-ibm62n07'(suite) -> [];
+'ibm-not-wf-P62-ibm62n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P62-ibm62n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P62-ibm62n06'(suite) -> [];
+'ibm-not-wf-P62-ibm62n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P62-ibm62n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P62-ibm62n05'(suite) -> [];
+'ibm-not-wf-P62-ibm62n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P62-ibm62n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P62-ibm62n04'(suite) -> [];
+'ibm-not-wf-P62-ibm62n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P62-ibm62n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P62-ibm62n03'(suite) -> [];
+'ibm-not-wf-P62-ibm62n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P62-ibm62n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P62-ibm62n02'(suite) -> [];
+'ibm-not-wf-P62-ibm62n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P62-ibm62n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P62-ibm62n01'(suite) -> [];
+'ibm-not-wf-P62-ibm62n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P62-ibm62n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P61-ibm61n01'(suite) -> [];
+'ibm-not-wf-P61-ibm61n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P61-ibm61n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P60-ibm60n08'(suite) -> [];
+'ibm-not-wf-P60-ibm60n08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P60-ibm60n08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P60-ibm60n07'(suite) -> [];
+'ibm-not-wf-P60-ibm60n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P60-ibm60n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P60-ibm60n06'(suite) -> [];
+'ibm-not-wf-P60-ibm60n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P60-ibm60n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P60-ibm60n05'(suite) -> [];
+'ibm-not-wf-P60-ibm60n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P60-ibm60n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P60-ibm60n04'(suite) -> [];
+'ibm-not-wf-P60-ibm60n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P60-ibm60n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P60-ibm60n03'(suite) -> [];
+'ibm-not-wf-P60-ibm60n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P60-ibm60n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P60-ibm60n02'(suite) -> [];
+'ibm-not-wf-P60-ibm60n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P60-ibm60n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P60-ibm60n01'(suite) -> [];
+'ibm-not-wf-P60-ibm60n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P60-ibm60n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P59-ibm59n06'(suite) -> [];
+'ibm-not-wf-P59-ibm59n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P59-ibm59n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P59-ibm59n05'(suite) -> [];
+'ibm-not-wf-P59-ibm59n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P59-ibm59n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P59-ibm59n04'(suite) -> [];
+'ibm-not-wf-P59-ibm59n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P59-ibm59n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P59-ibm59n03'(suite) -> [];
+'ibm-not-wf-P59-ibm59n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P59-ibm59n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P59-ibm59n02'(suite) -> [];
+'ibm-not-wf-P59-ibm59n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P59-ibm59n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P59-ibm59n01'(suite) -> [];
+'ibm-not-wf-P59-ibm59n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P59-ibm59n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P58-ibm58n08'(suite) -> [];
+'ibm-not-wf-P58-ibm58n08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P58-ibm58n08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P58-ibm58n07'(suite) -> [];
+'ibm-not-wf-P58-ibm58n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P58-ibm58n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P58-ibm58n06'(suite) -> [];
+'ibm-not-wf-P58-ibm58n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P58-ibm58n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P58-ibm58n05'(suite) -> [];
+'ibm-not-wf-P58-ibm58n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P58-ibm58n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P58-ibm58n04'(suite) -> [];
+'ibm-not-wf-P58-ibm58n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P58-ibm58n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P58-ibm58n03'(suite) -> [];
+'ibm-not-wf-P58-ibm58n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P58-ibm58n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P58-ibm58n02'(suite) -> [];
+'ibm-not-wf-P58-ibm58n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P58-ibm58n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P58-ibm58n01'(suite) -> [];
+'ibm-not-wf-P58-ibm58n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P58-ibm58n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P57-ibm57n01'(suite) -> [];
+'ibm-not-wf-P57-ibm57n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P57-ibm57n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P56-ibm56n07'(suite) -> [];
+'ibm-not-wf-P56-ibm56n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P56-ibm56n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P56-ibm56n06'(suite) -> [];
+'ibm-not-wf-P56-ibm56n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P56-ibm56n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P56-ibm56n05'(suite) -> [];
+'ibm-not-wf-P56-ibm56n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P56-ibm56n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P56-ibm56n04'(suite) -> [];
+'ibm-not-wf-P56-ibm56n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P56-ibm56n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P56-ibm56n03'(suite) -> [];
+'ibm-not-wf-P56-ibm56n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P56-ibm56n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P56-ibm56n02'(suite) -> [];
+'ibm-not-wf-P56-ibm56n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P56-ibm56n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P56-ibm56n01'(suite) -> [];
+'ibm-not-wf-P56-ibm56n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P56-ibm56n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P55-ibm55n03'(suite) -> [];
+'ibm-not-wf-P55-ibm55n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P55-ibm55n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P55-ibm55n02'(suite) -> [];
+'ibm-not-wf-P55-ibm55n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P55-ibm55n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P55-ibm55n01'(suite) -> [];
+'ibm-not-wf-P55-ibm55n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P55-ibm55n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P54-ibm54n02'(suite) -> [];
+'ibm-not-wf-P54-ibm54n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P54-ibm54n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P54-ibm54n01'(suite) -> [];
+'ibm-not-wf-P54-ibm54n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P54-ibm54n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P53-ibm53n08'(suite) -> [];
+'ibm-not-wf-P53-ibm53n08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P53-ibm53n08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P53-ibm53n07'(suite) -> [];
+'ibm-not-wf-P53-ibm53n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P53-ibm53n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P53-ibm53n06'(suite) -> [];
+'ibm-not-wf-P53-ibm53n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P53-ibm53n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P53-ibm53n05'(suite) -> [];
+'ibm-not-wf-P53-ibm53n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P53-ibm53n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P53-ibm53n04'(suite) -> [];
+'ibm-not-wf-P53-ibm53n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P53-ibm53n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P53-ibm53n03'(suite) -> [];
+'ibm-not-wf-P53-ibm53n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P53-ibm53n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P53-ibm53n02'(suite) -> [];
+'ibm-not-wf-P53-ibm53n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P53-ibm53n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P53-ibm53n01'(suite) -> [];
+'ibm-not-wf-P53-ibm53n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P53-ibm53n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P52-ibm52n06'(suite) -> [];
+'ibm-not-wf-P52-ibm52n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P52-ibm52n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P52-ibm52n05'(suite) -> [];
+'ibm-not-wf-P52-ibm52n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P52-ibm52n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P52-ibm52n04'(suite) -> [];
+'ibm-not-wf-P52-ibm52n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P52-ibm52n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P52-ibm52n03'(suite) -> [];
+'ibm-not-wf-P52-ibm52n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P52-ibm52n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P52-ibm52n02'(suite) -> [];
+'ibm-not-wf-P52-ibm52n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P52-ibm52n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P52-ibm52n01'(suite) -> [];
+'ibm-not-wf-P52-ibm52n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P52-ibm52n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P51-ibm51n07'(suite) -> [];
+'ibm-not-wf-P51-ibm51n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P51-ibm51n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P51-ibm51n06'(suite) -> [];
+'ibm-not-wf-P51-ibm51n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P51-ibm51n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P51-ibm51n05'(suite) -> [];
+'ibm-not-wf-P51-ibm51n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P51-ibm51n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P51-ibm51n04'(suite) -> [];
+'ibm-not-wf-P51-ibm51n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P51-ibm51n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P51-ibm51n03'(suite) -> [];
+'ibm-not-wf-P51-ibm51n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P51-ibm51n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P51-ibm51n02'(suite) -> [];
+'ibm-not-wf-P51-ibm51n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P51-ibm51n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P51-ibm51n01'(suite) -> [];
+'ibm-not-wf-P51-ibm51n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P51-ibm51n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P50-ibm50n07'(suite) -> [];
+'ibm-not-wf-P50-ibm50n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P50-ibm50n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P50-ibm50n06'(suite) -> [];
+'ibm-not-wf-P50-ibm50n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P50-ibm50n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P50-ibm50n05'(suite) -> [];
+'ibm-not-wf-P50-ibm50n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P50-ibm50n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P50-ibm50n04'(suite) -> [];
+'ibm-not-wf-P50-ibm50n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P50-ibm50n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P50-ibm50n03'(suite) -> [];
+'ibm-not-wf-P50-ibm50n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P50-ibm50n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P50-ibm50n02'(suite) -> [];
+'ibm-not-wf-P50-ibm50n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P50-ibm50n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P50-ibm50n01'(suite) -> [];
+'ibm-not-wf-P50-ibm50n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P50-ibm50n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P49-ibm49n06'(suite) -> [];
+'ibm-not-wf-P49-ibm49n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P49-ibm49n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P49-ibm49n05'(suite) -> [];
+'ibm-not-wf-P49-ibm49n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P49-ibm49n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P49-ibm49n04'(suite) -> [];
+'ibm-not-wf-P49-ibm49n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P49-ibm49n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P49-ibm49n03'(suite) -> [];
+'ibm-not-wf-P49-ibm49n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P49-ibm49n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P49-ibm49n02'(suite) -> [];
+'ibm-not-wf-P49-ibm49n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P49-ibm49n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P49-ibm49n01'(suite) -> [];
+'ibm-not-wf-P49-ibm49n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P49-ibm49n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P48-ibm48n07'(suite) -> [];
+'ibm-not-wf-P48-ibm48n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P48-ibm48n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P48-ibm48n06'(suite) -> [];
+'ibm-not-wf-P48-ibm48n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P48-ibm48n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P48-ibm48n05'(suite) -> [];
+'ibm-not-wf-P48-ibm48n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P48-ibm48n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P48-ibm48n04'(suite) -> [];
+'ibm-not-wf-P48-ibm48n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P48-ibm48n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P48-ibm48n03'(suite) -> [];
+'ibm-not-wf-P48-ibm48n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P48-ibm48n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P48-ibm48n02'(suite) -> [];
+'ibm-not-wf-P48-ibm48n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P48-ibm48n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P48-ibm48n01'(suite) -> [];
+'ibm-not-wf-P48-ibm48n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P48-ibm48n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P47-ibm47n06'(suite) -> [];
+'ibm-not-wf-P47-ibm47n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P47-ibm47n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P47-ibm47n05'(suite) -> [];
+'ibm-not-wf-P47-ibm47n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P47-ibm47n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P47-ibm47n04'(suite) -> [];
+'ibm-not-wf-P47-ibm47n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P47-ibm47n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P47-ibm47n03'(suite) -> [];
+'ibm-not-wf-P47-ibm47n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P47-ibm47n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P47-ibm47n02'(suite) -> [];
+'ibm-not-wf-P47-ibm47n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P47-ibm47n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P47-ibm47n01'(suite) -> [];
+'ibm-not-wf-P47-ibm47n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P47-ibm47n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P46-ibm46n05'(suite) -> [];
+'ibm-not-wf-P46-ibm46n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P46-ibm46n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P46-ibm46n04'(suite) -> [];
+'ibm-not-wf-P46-ibm46n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P46-ibm46n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P46-ibm46n03'(suite) -> [];
+'ibm-not-wf-P46-ibm46n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P46-ibm46n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P46-ibm46n02'(suite) -> [];
+'ibm-not-wf-P46-ibm46n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P46-ibm46n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P46-ibm46n01'(suite) -> [];
+'ibm-not-wf-P46-ibm46n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P46-ibm46n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P45-ibm45n09'(suite) -> [];
+'ibm-not-wf-P45-ibm45n09'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P45-ibm45n09.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P45-ibm45n08'(suite) -> [];
+'ibm-not-wf-P45-ibm45n08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P45-ibm45n08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P45-ibm45n07'(suite) -> [];
+'ibm-not-wf-P45-ibm45n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P45-ibm45n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P45-ibm45n06'(suite) -> [];
+'ibm-not-wf-P45-ibm45n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P45-ibm45n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P45-ibm45n05'(suite) -> [];
+'ibm-not-wf-P45-ibm45n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P45-ibm45n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P45-ibm45n04'(suite) -> [];
+'ibm-not-wf-P45-ibm45n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P45-ibm45n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P45-ibm45n03'(suite) -> [];
+'ibm-not-wf-P45-ibm45n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P45-ibm45n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P45-ibm45n02'(suite) -> [];
+'ibm-not-wf-P45-ibm45n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P45-ibm45n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P45-ibm45n01'(suite) -> [];
+'ibm-not-wf-P45-ibm45n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P45-ibm45n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P44-ibm44n04'(suite) -> [];
+'ibm-not-wf-P44-ibm44n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P44-ibm44n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P44-ibm44n03'(suite) -> [];
+'ibm-not-wf-P44-ibm44n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P44-ibm44n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P44-ibm44n02'(suite) -> [];
+'ibm-not-wf-P44-ibm44n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P44-ibm44n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P44-ibm44n01'(suite) -> [];
+'ibm-not-wf-P44-ibm44n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P44-ibm44n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P43-ibm43n05'(suite) -> [];
+'ibm-not-wf-P43-ibm43n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P43-ibm43n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P43-ibm43n04'(suite) -> [];
+'ibm-not-wf-P43-ibm43n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P43-ibm43n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P43-ibm43n02'(suite) -> [];
+'ibm-not-wf-P43-ibm43n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P43-ibm43n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P43-ibm43n01'(suite) -> [];
+'ibm-not-wf-P43-ibm43n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P43-ibm43n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P42-ibm42n05'(suite) -> [];
+'ibm-not-wf-P42-ibm42n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P42-ibm42n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P42-ibm42n04'(suite) -> [];
+'ibm-not-wf-P42-ibm42n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P42-ibm42n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P42-ibm42n03'(suite) -> [];
+'ibm-not-wf-P42-ibm42n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P42-ibm42n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P42-ibm42n02'(suite) -> [];
+'ibm-not-wf-P42-ibm42n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P42-ibm42n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P42-ibm42n01'(suite) -> [];
+'ibm-not-wf-P42-ibm42n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P42-ibm42n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P41-ibm41n14'(suite) -> [];
+'ibm-not-wf-P41-ibm41n14'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P41-ibm41n14.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P41-ibm41n13'(suite) -> [];
+'ibm-not-wf-P41-ibm41n13'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P41-ibm41n13.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P41-ibm41n12'(suite) -> [];
+'ibm-not-wf-P41-ibm41n12'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P41-ibm41n12.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P41-ibm41n11'(suite) -> [];
+'ibm-not-wf-P41-ibm41n11'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P41-ibm41n11.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P41-ibm41n10'(suite) -> [];
+'ibm-not-wf-P41-ibm41n10'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P41-ibm41n10.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P41-ibm41n09'(suite) -> [];
+'ibm-not-wf-P41-ibm41n09'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P41-ibm41n09.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P41-ibm41n08'(suite) -> [];
+'ibm-not-wf-P41-ibm41n08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P41-ibm41n08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P41-ibm41n07'(suite) -> [];
+'ibm-not-wf-P41-ibm41n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P41-ibm41n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P41-ibm41n06'(suite) -> [];
+'ibm-not-wf-P41-ibm41n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P41-ibm41n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P41-ibm41n05'(suite) -> [];
+'ibm-not-wf-P41-ibm41n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P41-ibm41n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P41-ibm41n04'(suite) -> [];
+'ibm-not-wf-P41-ibm41n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P41-ibm41n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P41-ibm41n03'(suite) -> [];
+'ibm-not-wf-P41-ibm41n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P41-ibm41n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P41-ibm41n02'(suite) -> [];
+'ibm-not-wf-P41-ibm41n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P41-ibm41n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P41-ibm41n01'(suite) -> [];
+'ibm-not-wf-P41-ibm41n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P41-ibm41n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P40-ibm40n05'(suite) -> [];
+'ibm-not-wf-P40-ibm40n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P40-ibm40n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P40-ibm40n04'(suite) -> [];
+'ibm-not-wf-P40-ibm40n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P40-ibm40n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P40-ibm40n03'(suite) -> [];
+'ibm-not-wf-P40-ibm40n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P40-ibm40n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P40-ibm40n02'(suite) -> [];
+'ibm-not-wf-P40-ibm40n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P40-ibm40n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P40-ibm40n01'(suite) -> [];
+'ibm-not-wf-P40-ibm40n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P40-ibm40n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P39-ibm39n06'(suite) -> [];
+'ibm-not-wf-P39-ibm39n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P39-ibm39n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P39-ibm39n05'(suite) -> [];
+'ibm-not-wf-P39-ibm39n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P39-ibm39n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P39-ibm39n04'(suite) -> [];
+'ibm-not-wf-P39-ibm39n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P39-ibm39n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P39-ibm39n03'(suite) -> [];
+'ibm-not-wf-P39-ibm39n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P39-ibm39n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P39-ibm39n02'(suite) -> [];
+'ibm-not-wf-P39-ibm39n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P39-ibm39n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P39-ibm39n01'(suite) -> [];
+'ibm-not-wf-P39-ibm39n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P39-ibm39n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P32-ibm32n09'(suite) -> [];
+'ibm-not-wf-P32-ibm32n09'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P32-ibm32n09.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P32-ibm32n08'(suite) -> [];
+'ibm-not-wf-P32-ibm32n08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P32-ibm32n08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P32-ibm32n07'(suite) -> [];
+'ibm-not-wf-P32-ibm32n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P32-ibm32n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P32-ibm32n06'(suite) -> [];
+'ibm-not-wf-P32-ibm32n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P32-ibm32n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P32-ibm32n05'(suite) -> [];
+'ibm-not-wf-P32-ibm32n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P32-ibm32n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P32-ibm32n04'(suite) -> [];
+'ibm-not-wf-P32-ibm32n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P32-ibm32n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P32-ibm32n03'(suite) -> [];
+'ibm-not-wf-P32-ibm32n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P32-ibm32n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P32-ibm32n02'(suite) -> [];
+'ibm-not-wf-P32-ibm32n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P32-ibm32n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P32-ibm32n01'(suite) -> [];
+'ibm-not-wf-P32-ibm32n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P32-ibm32n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P31-ibm31n01'(suite) -> [];
+'ibm-not-wf-P31-ibm31n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P31-ibm31n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P30-ibm30n01'(suite) -> [];
+'ibm-not-wf-P30-ibm30n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P30-ibm30n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P29-ibm29n07'(suite) -> [];
+'ibm-not-wf-P29-ibm29n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P29-ibm29n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P29-ibm29n06'(suite) -> [];
+'ibm-not-wf-P29-ibm29n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P29-ibm29n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P29-ibm29n05'(suite) -> [];
+'ibm-not-wf-P29-ibm29n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P29-ibm29n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P29-ibm29n04'(suite) -> [];
+'ibm-not-wf-P29-ibm29n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P29-ibm29n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P29-ibm29n03'(suite) -> [];
+'ibm-not-wf-P29-ibm29n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P29-ibm29n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P29-ibm29n02'(suite) -> [];
+'ibm-not-wf-P29-ibm29n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P29-ibm29n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P29-ibm29n01'(suite) -> [];
+'ibm-not-wf-P29-ibm29n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P29-ibm29n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P28a-ibm28an01'(suite) -> [];
+'ibm-not-wf-P28a-ibm28an01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P28a-ibm28an01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P28-ibm28n08'(suite) -> [];
+'ibm-not-wf-P28-ibm28n08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P28-ibm28n08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P28-ibm28n07'(suite) -> [];
+'ibm-not-wf-P28-ibm28n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P28-ibm28n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P28-ibm28n06'(suite) -> [];
+'ibm-not-wf-P28-ibm28n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P28-ibm28n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P28-ibm28n05'(suite) -> [];
+'ibm-not-wf-P28-ibm28n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P28-ibm28n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P28-ibm28n04'(suite) -> [];
+'ibm-not-wf-P28-ibm28n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P28-ibm28n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P28-ibm28n03'(suite) -> [];
+'ibm-not-wf-P28-ibm28n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P28-ibm28n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P28-ibm28n02'(suite) -> [];
+'ibm-not-wf-P28-ibm28n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P28-ibm28n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P28-ibm28n01'(suite) -> [];
+'ibm-not-wf-P28-ibm28n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P28-ibm28n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P27-ibm27n01'(suite) -> [];
+'ibm-not-wf-P27-ibm27n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P27-ibm27n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P26-ibm26n01'(suite) -> [];
+'ibm-not-wf-P26-ibm26n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P26-ibm26n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P25-ibm25n02'(suite) -> [];
+'ibm-not-wf-P25-ibm25n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P25-ibm25n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P25-ibm25n01'(suite) -> [];
+'ibm-not-wf-P25-ibm25n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P25-ibm25n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P24-ibm24n09'(suite) -> [];
+'ibm-not-wf-P24-ibm24n09'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P24-ibm24n09.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P24-ibm24n08'(suite) -> [];
+'ibm-not-wf-P24-ibm24n08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P24-ibm24n08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P24-ibm24n07'(suite) -> [];
+'ibm-not-wf-P24-ibm24n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P24-ibm24n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P24-ibm24n06'(suite) -> [];
+'ibm-not-wf-P24-ibm24n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P24-ibm24n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P24-ibm24n05'(suite) -> [];
+'ibm-not-wf-P24-ibm24n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P24-ibm24n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P24-ibm24n04'(suite) -> [];
+'ibm-not-wf-P24-ibm24n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P24-ibm24n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P24-ibm24n03'(suite) -> [];
+'ibm-not-wf-P24-ibm24n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P24-ibm24n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P24-ibm24n02'(suite) -> [];
+'ibm-not-wf-P24-ibm24n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P24-ibm24n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P24-ibm24n01'(suite) -> [];
+'ibm-not-wf-P24-ibm24n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P24-ibm24n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P23-ibm23n06'(suite) -> [];
+'ibm-not-wf-P23-ibm23n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P23-ibm23n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P23-ibm23n05'(suite) -> [];
+'ibm-not-wf-P23-ibm23n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P23-ibm23n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P23-ibm23n04'(suite) -> [];
+'ibm-not-wf-P23-ibm23n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P23-ibm23n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P23-ibm23n03'(suite) -> [];
+'ibm-not-wf-P23-ibm23n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P23-ibm23n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P23-ibm23n02'(suite) -> [];
+'ibm-not-wf-P23-ibm23n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P23-ibm23n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P23-ibm23n01'(suite) -> [];
+'ibm-not-wf-P23-ibm23n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P23-ibm23n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P22-ibm22n03'(suite) -> [];
+'ibm-not-wf-P22-ibm22n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P22-ibm22n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P22-ibm22n02'(suite) -> [];
+'ibm-not-wf-P22-ibm22n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P22-ibm22n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P22-ibm22n01'(suite) -> [];
+'ibm-not-wf-P22-ibm22n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P22-ibm22n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P21-ibm21n03'(suite) -> [];
+'ibm-not-wf-P21-ibm21n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P21-ibm21n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P21-ibm21n02'(suite) -> [];
+'ibm-not-wf-P21-ibm21n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P21-ibm21n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P21-ibm21n01'(suite) -> [];
+'ibm-not-wf-P21-ibm21n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P21-ibm21n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P20-ibm20n01'(suite) -> [];
+'ibm-not-wf-P20-ibm20n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P20-ibm20n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P19-ibm19n03'(suite) -> [];
+'ibm-not-wf-P19-ibm19n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P19-ibm19n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P19-ibm19n02'(suite) -> [];
+'ibm-not-wf-P19-ibm19n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P19-ibm19n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P19-ibm19n01'(suite) -> [];
+'ibm-not-wf-P19-ibm19n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P19-ibm19n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P18-ibm18n02'(suite) -> [];
+'ibm-not-wf-P18-ibm18n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P18-ibm18n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P18-ibm18n01'(suite) -> [];
+'ibm-not-wf-P18-ibm18n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P18-ibm18n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P17-ibm17n04'(suite) -> [];
+'ibm-not-wf-P17-ibm17n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P17-ibm17n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P17-ibm17n03'(suite) -> [];
+'ibm-not-wf-P17-ibm17n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P17-ibm17n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P17-ibm17n02'(suite) -> [];
+'ibm-not-wf-P17-ibm17n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P17-ibm17n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P17-ibm17n01'(suite) -> [];
+'ibm-not-wf-P17-ibm17n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P17-ibm17n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P16-ibm16n04'(suite) -> [];
+'ibm-not-wf-P16-ibm16n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P16-ibm16n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P16-ibm16n03'(suite) -> [];
+'ibm-not-wf-P16-ibm16n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P16-ibm16n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P16-ibm16n02'(suite) -> [];
+'ibm-not-wf-P16-ibm16n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P16-ibm16n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P16-ibm16n01'(suite) -> [];
+'ibm-not-wf-P16-ibm16n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P16-ibm16n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P15-ibm15n04'(suite) -> [];
+'ibm-not-wf-P15-ibm15n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P15-ibm15n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P15-ibm15n03'(suite) -> [];
+'ibm-not-wf-P15-ibm15n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P15-ibm15n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P15-ibm15n02'(suite) -> [];
+'ibm-not-wf-P15-ibm15n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P15-ibm15n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P15-ibm15n01'(suite) -> [];
+'ibm-not-wf-P15-ibm15n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P15-ibm15n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P14-ibm14n03'(suite) -> [];
+'ibm-not-wf-P14-ibm14n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P14-ibm14n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P14-ibm14n02'(suite) -> [];
+'ibm-not-wf-P14-ibm14n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P14-ibm14n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P14-ibm14n01'(suite) -> [];
+'ibm-not-wf-P14-ibm14n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P14-ibm14n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P13-ibm13n03'(suite) -> [];
+'ibm-not-wf-P13-ibm13n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P13-ibm13n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P13-ibm13n02'(suite) -> [];
+'ibm-not-wf-P13-ibm13n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P13-ibm13n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P13-ibm13n01'(suite) -> [];
+'ibm-not-wf-P13-ibm13n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P13-ibm13n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P12-ibm12n03'(suite) -> [];
+'ibm-not-wf-P12-ibm12n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P12-ibm12n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P12-ibm12n02'(suite) -> [];
+'ibm-not-wf-P12-ibm12n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P12-ibm12n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P12-ibm12n01'(suite) -> [];
+'ibm-not-wf-P12-ibm12n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P12-ibm12n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P11-ibm11n04'(suite) -> [];
+'ibm-not-wf-P11-ibm11n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P11-ibm11n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P11-ibm11n03'(suite) -> [];
+'ibm-not-wf-P11-ibm11n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P11-ibm11n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P11-ibm11n02'(suite) -> [];
+'ibm-not-wf-P11-ibm11n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P11-ibm11n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P11-ibm11n01'(suite) -> [];
+'ibm-not-wf-P11-ibm11n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P11-ibm11n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P10-ibm10n08'(suite) -> [];
+'ibm-not-wf-P10-ibm10n08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P10-ibm10n08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P10-ibm10n07'(suite) -> [];
+'ibm-not-wf-P10-ibm10n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P10-ibm10n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P10-ibm10n06'(suite) -> [];
+'ibm-not-wf-P10-ibm10n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P10-ibm10n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P10-ibm10n05'(suite) -> [];
+'ibm-not-wf-P10-ibm10n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P10-ibm10n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P10-ibm10n04'(suite) -> [];
+'ibm-not-wf-P10-ibm10n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P10-ibm10n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P10-ibm10n03'(suite) -> [];
+'ibm-not-wf-P10-ibm10n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P10-ibm10n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P10-ibm10n02'(suite) -> [];
+'ibm-not-wf-P10-ibm10n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P10-ibm10n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P10-ibm10n01'(suite) -> [];
+'ibm-not-wf-P10-ibm10n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P10-ibm10n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P09-ibm09n04'(suite) -> [];
+'ibm-not-wf-P09-ibm09n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P09-ibm09n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P09-ibm09n03'(suite) -> [];
+'ibm-not-wf-P09-ibm09n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P09-ibm09n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P09-ibm09n02'(suite) -> [];
+'ibm-not-wf-P09-ibm09n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P09-ibm09n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P09-ibm09n01'(suite) -> [];
+'ibm-not-wf-P09-ibm09n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P09-ibm09n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P05-ibm05n03'(suite) -> [];
+'ibm-not-wf-P05-ibm05n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P05-ibm05n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P05-ibm05n02'(suite) -> [];
+'ibm-not-wf-P05-ibm05n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P05-ibm05n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P05-ibm05n01'(suite) -> [];
+'ibm-not-wf-P05-ibm05n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P05-ibm05n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P04-ibm04n18'(suite) -> [];
+'ibm-not-wf-P04-ibm04n18'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P04-ibm04n18.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P04-ibm04n17'(suite) -> [];
+'ibm-not-wf-P04-ibm04n17'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P04-ibm04n17.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P04-ibm04n16'(suite) -> [];
+'ibm-not-wf-P04-ibm04n16'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P04-ibm04n16.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P04-ibm04n15'(suite) -> [];
+'ibm-not-wf-P04-ibm04n15'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P04-ibm04n15.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P04-ibm04n14'(suite) -> [];
+'ibm-not-wf-P04-ibm04n14'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P04-ibm04n14.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P04-ibm04n13'(suite) -> [];
+'ibm-not-wf-P04-ibm04n13'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P04-ibm04n13.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P04-ibm04n12'(suite) -> [];
+'ibm-not-wf-P04-ibm04n12'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P04-ibm04n12.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P04-ibm04n11'(suite) -> [];
+'ibm-not-wf-P04-ibm04n11'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P04-ibm04n11.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P04-ibm04n10'(suite) -> [];
+'ibm-not-wf-P04-ibm04n10'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P04-ibm04n10.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P04-ibm04n09'(suite) -> [];
+'ibm-not-wf-P04-ibm04n09'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P04-ibm04n09.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P04-ibm04n08'(suite) -> [];
+'ibm-not-wf-P04-ibm04n08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P04-ibm04n08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P04-ibm04n07'(suite) -> [];
+'ibm-not-wf-P04-ibm04n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P04-ibm04n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P04-ibm04n06'(suite) -> [];
+'ibm-not-wf-P04-ibm04n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P04-ibm04n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P04-ibm04n05'(suite) -> [];
+'ibm-not-wf-P04-ibm04n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P04-ibm04n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P04-ibm04n04'(suite) -> [];
+'ibm-not-wf-P04-ibm04n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P04-ibm04n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P04-ibm04n03'(suite) -> [];
+'ibm-not-wf-P04-ibm04n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P04-ibm04n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P04-ibm04n02'(suite) -> [];
+'ibm-not-wf-P04-ibm04n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P04-ibm04n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P04-ibm04n01'(suite) -> [];
+'ibm-not-wf-P04-ibm04n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P04-ibm04n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P03-ibm03n01'(suite) -> [];
+'ibm-not-wf-P03-ibm03n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P03-ibm03n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n33'(suite) -> [];
+'ibm-not-wf-P02-ibm02n33'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n33.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n32'(suite) -> [];
+'ibm-not-wf-P02-ibm02n32'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n32.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n31'(suite) -> [];
+'ibm-not-wf-P02-ibm02n31'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n31.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n30'(suite) -> [];
+'ibm-not-wf-P02-ibm02n30'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n30.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n29'(suite) -> [];
+'ibm-not-wf-P02-ibm02n29'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n29.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n28'(suite) -> [];
+'ibm-not-wf-P02-ibm02n28'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n28.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n27'(suite) -> [];
+'ibm-not-wf-P02-ibm02n27'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n27.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n26'(suite) -> [];
+'ibm-not-wf-P02-ibm02n26'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n26.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n25'(suite) -> [];
+'ibm-not-wf-P02-ibm02n25'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n25.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n24'(suite) -> [];
+'ibm-not-wf-P02-ibm02n24'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n24.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n23'(suite) -> [];
+'ibm-not-wf-P02-ibm02n23'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n23.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n22'(suite) -> [];
+'ibm-not-wf-P02-ibm02n22'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n22.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n21'(suite) -> [];
+'ibm-not-wf-P02-ibm02n21'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n21.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n20'(suite) -> [];
+'ibm-not-wf-P02-ibm02n20'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n20.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n19'(suite) -> [];
+'ibm-not-wf-P02-ibm02n19'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n19.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n18'(suite) -> [];
+'ibm-not-wf-P02-ibm02n18'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n18.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n17'(suite) -> [];
+'ibm-not-wf-P02-ibm02n17'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n17.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n16'(suite) -> [];
+'ibm-not-wf-P02-ibm02n16'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n16.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n15'(suite) -> [];
+'ibm-not-wf-P02-ibm02n15'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n15.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n14'(suite) -> [];
+'ibm-not-wf-P02-ibm02n14'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n14.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n13'(suite) -> [];
+'ibm-not-wf-P02-ibm02n13'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n13.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n12'(suite) -> [];
+'ibm-not-wf-P02-ibm02n12'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n12.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n11'(suite) -> [];
+'ibm-not-wf-P02-ibm02n11'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n11.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n10'(suite) -> [];
+'ibm-not-wf-P02-ibm02n10'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n10.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n09'(suite) -> [];
+'ibm-not-wf-P02-ibm02n09'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n09.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n08'(suite) -> [];
+'ibm-not-wf-P02-ibm02n08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n07'(suite) -> [];
+'ibm-not-wf-P02-ibm02n07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n06'(suite) -> [];
+'ibm-not-wf-P02-ibm02n06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n05'(suite) -> [];
+'ibm-not-wf-P02-ibm02n05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n04'(suite) -> [];
+'ibm-not-wf-P02-ibm02n04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n03'(suite) -> [];
+'ibm-not-wf-P02-ibm02n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n02'(suite) -> [];
+'ibm-not-wf-P02-ibm02n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P02-ibm02n01'(suite) -> [];
+'ibm-not-wf-P02-ibm02n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P02-ibm02n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P01-ibm01n03'(suite) -> [];
+'ibm-not-wf-P01-ibm01n03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P01-ibm01n03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P01-ibm01n02'(suite) -> [];
+'ibm-not-wf-P01-ibm01n02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P01-ibm01n02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-not-wf-P01-ibm01n01'(suite) -> [];
+'ibm-not-wf-P01-ibm01n01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-not-wf-P01-ibm01n01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+%%----------------------------------------------------------------------
+
+'ibm-valid-P89-ibm89v01'(suite) -> [];
+'ibm-valid-P89-ibm89v01'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P89-ibm89v01.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["Fails to handle name containing characters > x#ff, since they are converted to atoms"]}.
+
+'ibm-valid-P88-ibm88v01'(suite) -> [];
+'ibm-valid-P88-ibm88v01'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P88-ibm88v01.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["Fails to handle name containing characters > x#ff, since they are converted to atoms"]}.
+
+'ibm-valid-P87-ibm87v01'(suite) -> [];
+'ibm-valid-P87-ibm87v01'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P87-ibm87v01.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["Fails to handle name containing characters > x#ff, since they are converted to atoms"]}.
+
+'ibm-valid-P86-ibm86v01'(suite) -> [];
+'ibm-valid-P86-ibm86v01'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P86-ibm86v01.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["Fails to handle name containing characters > x#ff, since they are converted to atoms"]}.
+
+'ibm-valid-P85-ibm85v01'(suite) -> [];
+'ibm-valid-P85-ibm85v01'(_Config) ->
+% ?line file:set_cwd(?config(data_dir,Config)),
+% ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P85-ibm85v01.xml"]),[]),
+% ?line xmerl:export([A],xmerl_test).
+ {skip,["Fails to handle name containing characters > x#ff, since they are converted to atoms"]}.
+
+'ibm-valid-P82-ibm82v01'(suite) -> [];
+'ibm-valid-P82-ibm82v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P82-ibm82v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P79-ibm79v01'(suite) -> [];
+'ibm-valid-P79-ibm79v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P79-ibm79v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P78-ibm78v01'(suite) -> [];
+'ibm-valid-P78-ibm78v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P78-ibm78v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P70-ibm70v01'(suite) -> [];
+'ibm-valid-P70-ibm70v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P70-ibm70v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P69-ibm69v02'(suite) -> [];
+'ibm-valid-P69-ibm69v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P69-ibm69v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P69-ibm69v01'(suite) -> [];
+'ibm-valid-P69-ibm69v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P69-ibm69v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P68-ibm68v02'(suite) -> [];
+'ibm-valid-P68-ibm68v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P68-ibm68v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P68-ibm68v01'(suite) -> [];
+'ibm-valid-P68-ibm68v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P68-ibm68v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P67-ibm67v01'(suite) -> [];
+'ibm-valid-P67-ibm67v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P67-ibm67v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P66-ibm66v01'(suite) -> [];
+'ibm-valid-P66-ibm66v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P66-ibm66v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P65-ibm65v02'(suite) -> [];
+'ibm-valid-P65-ibm65v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P65-ibm65v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P65-ibm65v01'(suite) -> [];
+'ibm-valid-P65-ibm65v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P65-ibm65v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P64-ibm64v03'(suite) -> [];
+'ibm-valid-P64-ibm64v03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P64-ibm64v03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P64-ibm64v02'(suite) -> [];
+'ibm-valid-P64-ibm64v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P64-ibm64v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P64-ibm64v01'(suite) -> [];
+'ibm-valid-P64-ibm64v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P64-ibm64v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P63-ibm63v05'(suite) -> [];
+'ibm-valid-P63-ibm63v05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P63-ibm63v05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P63-ibm63v04'(suite) -> [];
+'ibm-valid-P63-ibm63v04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P63-ibm63v04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P63-ibm63v03'(suite) -> [];
+'ibm-valid-P63-ibm63v03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P63-ibm63v03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P63-ibm63v02'(suite) -> [];
+'ibm-valid-P63-ibm63v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P63-ibm63v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P63-ibm63v01'(suite) -> [];
+'ibm-valid-P63-ibm63v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P63-ibm63v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P62-ibm62v05'(suite) -> [];
+'ibm-valid-P62-ibm62v05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P62-ibm62v05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P62-ibm62v04'(suite) -> [];
+'ibm-valid-P62-ibm62v04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P62-ibm62v04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P62-ibm62v03'(suite) -> [];
+'ibm-valid-P62-ibm62v03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P62-ibm62v03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P62-ibm62v02'(suite) -> [];
+'ibm-valid-P62-ibm62v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P62-ibm62v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P62-ibm62v01'(suite) -> [];
+'ibm-valid-P62-ibm62v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P62-ibm62v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P61-ibm61v02'(suite) -> [];
+'ibm-valid-P61-ibm61v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P61-ibm61v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P61-ibm61v01'(suite) -> [];
+'ibm-valid-P61-ibm61v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P61-ibm61v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P60-ibm60v04'(suite) -> [];
+'ibm-valid-P60-ibm60v04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P60-ibm60v04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P60-ibm60v03'(suite) -> [];
+'ibm-valid-P60-ibm60v03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P60-ibm60v03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P60-ibm60v02'(suite) -> [];
+'ibm-valid-P60-ibm60v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P60-ibm60v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P60-ibm60v01'(suite) -> [];
+'ibm-valid-P60-ibm60v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P60-ibm60v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P59-ibm59v02'(suite) -> [];
+'ibm-valid-P59-ibm59v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P59-ibm59v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P59-ibm59v01'(suite) -> [];
+'ibm-valid-P59-ibm59v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P59-ibm59v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P58-ibm58v02'(suite) -> [];
+'ibm-valid-P58-ibm58v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P58-ibm58v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P58-ibm58v01'(suite) -> [];
+'ibm-valid-P58-ibm58v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P58-ibm58v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P57-ibm57v01'(suite) -> [];
+'ibm-valid-P57-ibm57v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P57-ibm57v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P56-ibm56v10'(suite) -> [];
+'ibm-valid-P56-ibm56v10'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P56-ibm56v10.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P56-ibm56v09'(suite) -> [];
+'ibm-valid-P56-ibm56v09'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P56-ibm56v09.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P56-ibm56v08'(suite) -> [];
+'ibm-valid-P56-ibm56v08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P56-ibm56v08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P56-ibm56v07'(suite) -> [];
+'ibm-valid-P56-ibm56v07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P56-ibm56v07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P56-ibm56v06'(suite) -> [];
+'ibm-valid-P56-ibm56v06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P56-ibm56v06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P56-ibm56v05'(suite) -> [];
+'ibm-valid-P56-ibm56v05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P56-ibm56v05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P56-ibm56v04'(suite) -> [];
+'ibm-valid-P56-ibm56v04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P56-ibm56v04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P56-ibm56v03'(suite) -> [];
+'ibm-valid-P56-ibm56v03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P56-ibm56v03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P56-ibm56v02'(suite) -> [];
+'ibm-valid-P56-ibm56v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P56-ibm56v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P56-ibm56v01'(suite) -> [];
+'ibm-valid-P56-ibm56v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P56-ibm56v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P55-ibm55v01'(suite) -> [];
+'ibm-valid-P55-ibm55v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P55-ibm55v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P54-ibm54v03'(suite) -> [];
+'ibm-valid-P54-ibm54v03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P54-ibm54v03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P54-ibm54v02'(suite) -> [];
+'ibm-valid-P54-ibm54v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P54-ibm54v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P54-ibm54v01'(suite) -> [];
+'ibm-valid-P54-ibm54v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P54-ibm54v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P52-ibm52v01'(suite) -> [];
+'ibm-valid-P52-ibm52v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P52-ibm52v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P51-ibm51v02'(suite) -> [];
+'ibm-valid-P51-ibm51v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P51-ibm51v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P51-ibm51v01'(suite) -> [];
+'ibm-valid-P51-ibm51v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P51-ibm51v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P50-ibm50v01'(suite) -> [];
+'ibm-valid-P50-ibm50v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P50-ibm50v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P49-ibm49v01'(suite) -> [];
+'ibm-valid-P49-ibm49v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P49-ibm49v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P47-ibm47v01'(suite) -> [];
+'ibm-valid-P47-ibm47v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P47-ibm47v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P45-ibm45v01'(suite) -> [];
+'ibm-valid-P45-ibm45v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P45-ibm45v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P44-ibm44v01'(suite) -> [];
+'ibm-valid-P44-ibm44v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P44-ibm44v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P43-ibm43v01'(suite) -> [];
+'ibm-valid-P43-ibm43v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P43-ibm43v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P42-ibm42v01'(suite) -> [];
+'ibm-valid-P42-ibm42v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P42-ibm42v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P41-ibm41v01'(suite) -> [];
+'ibm-valid-P41-ibm41v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P41-ibm41v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P40-ibm40v01'(suite) -> [];
+'ibm-valid-P40-ibm40v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P40-ibm40v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P39-ibm39v01'(suite) -> [];
+'ibm-valid-P39-ibm39v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P39-ibm39v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P38-ibm38v01'(suite) -> [];
+'ibm-valid-P38-ibm38v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P38-ibm38v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P37-ibm37v01'(suite) -> [];
+'ibm-valid-P37-ibm37v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P37-ibm37v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P36-ibm36v01'(suite) -> [];
+'ibm-valid-P36-ibm36v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P36-ibm36v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P35-ibm35v01'(suite) -> [];
+'ibm-valid-P35-ibm35v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P35-ibm35v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P34-ibm34v01'(suite) -> [];
+'ibm-valid-P34-ibm34v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P34-ibm34v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P33-ibm33v01'(suite) -> [];
+'ibm-valid-P33-ibm33v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P33-ibm33v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P32-ibm32v04'(suite) -> [];
+'ibm-valid-P32-ibm32v04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P32-ibm32v04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P32-ibm32v03'(suite) -> [];
+'ibm-valid-P32-ibm32v03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P32-ibm32v03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P32-ibm32v02'(suite) -> [];
+'ibm-valid-P32-ibm32v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P32-ibm32v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P32-ibm32v01'(suite) -> [];
+'ibm-valid-P32-ibm32v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P32-ibm32v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P31-ibm31v01'(suite) -> [];
+'ibm-valid-P31-ibm31v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P31-ibm31v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P30-ibm30v02'(suite) -> [];
+'ibm-valid-P30-ibm30v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P30-ibm30v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P30-ibm30v01'(suite) -> [];
+'ibm-valid-P30-ibm30v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P30-ibm30v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P29-ibm29v02'(suite) -> [];
+'ibm-valid-P29-ibm29v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P29-ibm29v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P29-ibm29v01'(suite) -> [];
+'ibm-valid-P29-ibm29v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P29-ibm29v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P28-ibm28v02'(suite) -> [];
+'ibm-valid-P28-ibm28v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P28-ibm28v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P28-ibm28v01'(suite) -> [];
+'ibm-valid-P28-ibm28v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P28-ibm28v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P27-ibm27v03'(suite) -> [];
+'ibm-valid-P27-ibm27v03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P27-ibm27v03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P27-ibm27v02'(suite) -> [];
+'ibm-valid-P27-ibm27v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P27-ibm27v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P27-ibm27v01'(suite) -> [];
+'ibm-valid-P27-ibm27v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P27-ibm27v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P26-ibm26v01'(suite) -> [];
+'ibm-valid-P26-ibm26v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P26-ibm26v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P25-ibm25v04'(suite) -> [];
+'ibm-valid-P25-ibm25v04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P25-ibm25v04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P25-ibm25v03'(suite) -> [];
+'ibm-valid-P25-ibm25v03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P25-ibm25v03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P25-ibm25v02'(suite) -> [];
+'ibm-valid-P25-ibm25v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P25-ibm25v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P25-ibm25v01'(suite) -> [];
+'ibm-valid-P25-ibm25v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P25-ibm25v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P24-ibm24v02'(suite) -> [];
+'ibm-valid-P24-ibm24v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P24-ibm24v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P24-ibm24v01'(suite) -> [];
+'ibm-valid-P24-ibm24v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P24-ibm24v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P23-ibm23v06'(suite) -> [];
+'ibm-valid-P23-ibm23v06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P23-ibm23v06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P23-ibm23v05'(suite) -> [];
+'ibm-valid-P23-ibm23v05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P23-ibm23v05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P23-ibm23v04'(suite) -> [];
+'ibm-valid-P23-ibm23v04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P23-ibm23v04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P23-ibm23v03'(suite) -> [];
+'ibm-valid-P23-ibm23v03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P23-ibm23v03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P23-ibm23v02'(suite) -> [];
+'ibm-valid-P23-ibm23v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P23-ibm23v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P23-ibm23v01'(suite) -> [];
+'ibm-valid-P23-ibm23v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P23-ibm23v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P22-ibm22v07'(suite) -> [];
+'ibm-valid-P22-ibm22v07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P22-ibm22v07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P22-ibm22v06'(suite) -> [];
+'ibm-valid-P22-ibm22v06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P22-ibm22v06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P22-ibm22v05'(suite) -> [];
+'ibm-valid-P22-ibm22v05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P22-ibm22v05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P22-ibm22v04'(suite) -> [];
+'ibm-valid-P22-ibm22v04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P22-ibm22v04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P22-ibm22v03'(suite) -> [];
+'ibm-valid-P22-ibm22v03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P22-ibm22v03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P22-ibm22v02'(suite) -> [];
+'ibm-valid-P22-ibm22v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P22-ibm22v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P22-ibm22v01'(suite) -> [];
+'ibm-valid-P22-ibm22v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P22-ibm22v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P21-ibm21v01'(suite) -> [];
+'ibm-valid-P21-ibm21v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P21-ibm21v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P20-ibm20v02'(suite) -> [];
+'ibm-valid-P20-ibm20v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P20-ibm20v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P20-ibm20v01'(suite) -> [];
+'ibm-valid-P20-ibm20v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P20-ibm20v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P19-ibm19v01'(suite) -> [];
+'ibm-valid-P19-ibm19v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P19-ibm19v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P18-ibm18v01'(suite) -> [];
+'ibm-valid-P18-ibm18v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P18-ibm18v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P17-ibm17v01'(suite) -> [];
+'ibm-valid-P17-ibm17v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P17-ibm17v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P16-ibm16v03'(suite) -> [];
+'ibm-valid-P16-ibm16v03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P16-ibm16v03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P16-ibm16v02'(suite) -> [];
+'ibm-valid-P16-ibm16v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P16-ibm16v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P16-ibm16v01'(suite) -> [];
+'ibm-valid-P16-ibm16v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P16-ibm16v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P15-ibm15v04'(suite) -> [];
+'ibm-valid-P15-ibm15v04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P15-ibm15v04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P15-ibm15v03'(suite) -> [];
+'ibm-valid-P15-ibm15v03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P15-ibm15v03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P15-ibm15v02'(suite) -> [];
+'ibm-valid-P15-ibm15v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P15-ibm15v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P15-ibm15v01'(suite) -> [];
+'ibm-valid-P15-ibm15v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P15-ibm15v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P14-ibm14v03'(suite) -> [];
+'ibm-valid-P14-ibm14v03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P14-ibm14v03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P14-ibm14v02'(suite) -> [];
+'ibm-valid-P14-ibm14v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P14-ibm14v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P14-ibm14v01'(suite) -> [];
+'ibm-valid-P14-ibm14v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P14-ibm14v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P13-ibm13v01'(suite) -> [];
+'ibm-valid-P13-ibm13v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P13-ibm13v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P12-ibm12v04'(suite) -> [];
+'ibm-valid-P12-ibm12v04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P12-ibm12v04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P12-ibm12v03'(suite) -> [];
+'ibm-valid-P12-ibm12v03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P12-ibm12v03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P12-ibm12v02'(suite) -> [];
+'ibm-valid-P12-ibm12v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P12-ibm12v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P12-ibm12v01'(suite) -> [];
+'ibm-valid-P12-ibm12v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P12-ibm12v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P11-ibm11v04'(suite) -> [];
+'ibm-valid-P11-ibm11v04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P11-ibm11v04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P11-ibm11v03'(suite) -> [];
+'ibm-valid-P11-ibm11v03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P11-ibm11v03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P11-ibm11v02'(suite) -> [];
+'ibm-valid-P11-ibm11v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P11-ibm11v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P11-ibm11v01'(suite) -> [];
+'ibm-valid-P11-ibm11v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P11-ibm11v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P10-ibm10v08'(suite) -> [];
+'ibm-valid-P10-ibm10v08'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P10-ibm10v08.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P10-ibm10v07'(suite) -> [];
+'ibm-valid-P10-ibm10v07'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P10-ibm10v07.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P10-ibm10v06'(suite) -> [];
+'ibm-valid-P10-ibm10v06'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P10-ibm10v06.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P10-ibm10v05'(suite) -> [];
+'ibm-valid-P10-ibm10v05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P10-ibm10v05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P10-ibm10v04'(suite) -> [];
+'ibm-valid-P10-ibm10v04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P10-ibm10v04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P10-ibm10v03'(suite) -> [];
+'ibm-valid-P10-ibm10v03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P10-ibm10v03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P10-ibm10v02'(suite) -> [];
+'ibm-valid-P10-ibm10v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P10-ibm10v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P10-ibm10v01'(suite) -> [];
+'ibm-valid-P10-ibm10v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P10-ibm10v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P09-ibm09v05'(suite) -> [];
+'ibm-valid-P09-ibm09v05'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P09-ibm09v05.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P09-ibm09v04'(suite) -> [];
+'ibm-valid-P09-ibm09v04'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P09-ibm09v04.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P09-ibm09v03'(suite) -> [];
+'ibm-valid-P09-ibm09v03'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P09-ibm09v03.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P09-ibm09v02'(suite) -> [];
+'ibm-valid-P09-ibm09v02'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P09-ibm09v02.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P09-ibm09v01'(suite) -> [];
+'ibm-valid-P09-ibm09v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P09-ibm09v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P03-ibm03v01'(suite) -> [];
+'ibm-valid-P03-ibm03v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P03-ibm03v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P02-ibm02v01'(suite) -> [];
+'ibm-valid-P02-ibm02v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P02-ibm02v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+'ibm-valid-P01-ibm01v01'(suite) -> [];
+'ibm-valid-P01-ibm01v01'(Config) ->
+ ?line file:set_cwd(?config(data_dir,Config)),
+ ?line {A,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),ibm,"ibm-valid-P01-ibm01v01.xml"]),[]),
+ ?line xmerl:export([A],xmerl_test).
+
+
+
+%%======================================================================
+%% Support Functions
+%%======================================================================
+
+%% Dir is a directory
+rm_f_(Dir) ->
+ ?line {ok,CWD} = file:get_cwd(),
+ ?line {ok,FileList} = file:list_dir(Dir),
+ ?line file:set_cwd(filename:join([CWD,Dir])),
+ rm_files(FileList),
+ ?line file:set_cwd(CWD),
+ ? line ok = file:del_dir(Dir).
+
+rm_files([])->
+ ok;
+rm_files([F|Fs]) ->
+ case filelib:is_dir(F) of
+ true ->
+ rm_f_(F);
+ _ ->
+ ?line ok = file:delete(F)
+ end,
+ rm_files(Fs).
+
+-include_lib("kernel/include/file.hrl").
+change_mode(Files) ->
+ change_mode3(Files).
+change_mode2(Dir)->
+ ?line {ok,CWD} = file:get_cwd(),
+ ?line {ok,FileList} = file:list_dir(Dir),
+ ?line file:set_cwd(filename:join([CWD,Dir])),
+ change_mode3(FileList),
+ ?line file:set_cwd(CWD).
+change_mode3([]) ->
+ ok;
+change_mode3([F|Fs]) ->
+ case filelib:is_dir(F) of
+ true ->
+ chmod(F),
+ change_mode2(F);
+ _ ->
+ chmod(F)
+ end,
+ change_mode3(Fs).
+
+chmod(F) ->
+ case file:read_file_info(F) of
+ {ok,FileInfo} ->
+ Mode= FileInfo#file_info.mode,
+ file:write_file_info(F,FileInfo#file_info{mode=8#00777 bor Mode});
+ _ ->
+ ok
+ end.
+
+
+
+
+
+%%add_xml_path(TestCase) ->
+%testcase_dir(TestCase) ->
+% add_xml_path(lists:member(TestCase,ibm_test_cases(suite)),?ibm_dir,TestCase,
+% [{fun japanese_test_cases/1,?japanese_dir},
+% {fun oasis_test_cases/1,?oasis_dir},
+% {fun sun_test_cases/1,?sun_dir},
+% {fun xmltest_test_cases/1,?xmltest_dir}]).
+%add_xml_path(true,Dir,_,_) ->
+% io:format("directory in path:~p~n",[Dir]),
+%% ?line code:add_patha(Dir);
+% Dir;
+%add_xml_path(_,_,TestCase,[{NextTCs,NextDir}|Rest]) ->
+% add_xml_path(lists:member(TestCase,NextTCs(suite)),NextDir,TestCase,Rest);
+%add_xml_path(false,_,TC,[]) ->
+% exit({error,{xmltests,uncovered_test_case,TC}}).
+
diff --git a/lib/xmerl/test/xmerl_std_SUITE_data/ibm.tgz b/lib/xmerl/test/xmerl_std_SUITE_data/ibm.tgz
new file mode 100644
index 0000000000..c36bcb5bd3
--- /dev/null
+++ b/lib/xmerl/test/xmerl_std_SUITE_data/ibm.tgz
Binary files differ
diff --git a/lib/xmerl/test/xmerl_std_SUITE_data/japanese.tgz b/lib/xmerl/test/xmerl_std_SUITE_data/japanese.tgz
new file mode 100644
index 0000000000..cf1d71a2fd
--- /dev/null
+++ b/lib/xmerl/test/xmerl_std_SUITE_data/japanese.tgz
Binary files differ
diff --git a/lib/xmerl/test/xmerl_std_SUITE_data/oasis.tgz b/lib/xmerl/test/xmerl_std_SUITE_data/oasis.tgz
new file mode 100644
index 0000000000..ab809a63e7
--- /dev/null
+++ b/lib/xmerl/test/xmerl_std_SUITE_data/oasis.tgz
Binary files differ
diff --git a/lib/xmerl/test/xmerl_std_SUITE_data/sun.tgz b/lib/xmerl/test/xmerl_std_SUITE_data/sun.tgz
new file mode 100644
index 0000000000..022e64ab9e
--- /dev/null
+++ b/lib/xmerl/test/xmerl_std_SUITE_data/sun.tgz
Binary files differ
diff --git a/lib/xmerl/test/xmerl_std_SUITE_data/w3c-copyright-19980720.html b/lib/xmerl/test/xmerl_std_SUITE_data/w3c-copyright-19980720.html
new file mode 100644
index 0000000000..bc5c62fdbc
--- /dev/null
+++ b/lib/xmerl/test/xmerl_std_SUITE_data/w3c-copyright-19980720.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+
+
+<meta name="generator" content="HTML Tidy, see www.w3.org">
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<link rel="stylesheet" type="text/css" href="copyright-software-19980720_files/base.css"><title>W3C IPR SOFTWARE NOTICE</title></head><body bgcolor="#ffffff" text="#000000">
+<h1>W3C<sup>�</sup> SOFTWARE NOTICE AND LICENSE</h1>
+
+<h3>Copyright � 1994-2002 <a href="http://www.w3.org/">World
+Wide Web Consortium</a>, (<a href="http://www.lcs.mit.edu/">Massachusetts Institute of
+Technology</a>, <a href="http://www.inria.fr/">Institut National de
+Recherche en Informatique et en Automatique</a>, <a href="http://www.keio.ac.jp/">Keio University</a>). All Rights
+Reserved. http://www.w3.org/Consortium/Legal/</h3>
+
+<p>This W3C work (including software, documents, or other related
+items) is being provided by the copyright holders under the
+following license. By obtaining, using and/or copying this work,
+you (the licensee) agree that you have read, understood, and will
+comply with the following terms and conditions:</p>
+
+<p>Permission to use, copy, modify, and distribute this software
+and its documentation, with or without modification,&nbsp; for any
+purpose and without fee or royalty is hereby granted, provided that
+you include the following on ALL copies of the software and
+documentation or portions thereof, including modifications, that
+you make:</p>
+
+<ol>
+<li>The full text of this NOTICE in a location viewable to users of
+the redistributed or derivative work.</li>
+
+<li>Any pre-existing intellectual property disclaimers, notices, or
+terms and conditions. If none exist, a short notice of the
+following form (hypertext is preferred, text is permitted) should
+be used within the body of any redistributed or derivative code:
+"Copyright � [$date-of-software] <a href="http://www.w3.org/">World Wide Web Consortium</a>, (<a href="http://www.lcs.mit.edu/">Massachusetts Institute of
+Technology</a>, <a href="http://www.inria.fr/">Institut National de
+Recherche en Informatique et en Automatique</a>, <a href="http://www.keio.ac.jp/">Keio University</a>). All Rights
+Reserved. http://www.w3.org/Consortium/Legal/"</li>
+
+<li>Notice of any changes or modifications to the W3C files,
+including the date changes were made. (We recommend you provide
+URIs to the location from which the code is derived.)</li>
+</ol>
+
+<p>THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND
+COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF
+MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE
+USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD
+PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.</p>
+
+<p>COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT,
+SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE
+SOFTWARE OR DOCUMENTATION.</p>
+
+<p>The name and trademarks of copyright holders may NOT be used in
+advertising or publicity pertaining to the software without
+specific, written prior permission. Title to copyright in this
+software and any associated documentation will at all times remain
+with copyright holders.</p>
+
+<p>____________________________________</p>
+
+<p>This formulation of W3C's notice and license became active on
+August 14 1998 so as to improve compatibility with GPL. This
+version ensures that W3C software licensing terms are no more
+restrictive than GPL and consequently W3C software may be
+distributed in GPL packages. See the <a href="http://www.w3.org/Consortium/Legal/copyright-software-19980519.html">older formulation</a> for
+the policy prior to this date. Please see our <a href="http://www.w3.org/Consortium/Legal/IPR-FAQ.html">Copyright FAQ</a> for common questions about
+using materials from our site, including specific terms and
+conditions for packages like libwww, Amaya, and Jigsaw. Other
+questions about this notice can be directed to <a href="mailto:[email protected]">[email protected]</a>.<br>
+&nbsp;</p>
+
+<p>&nbsp;</p>
+
+<address><a href="http://www.w3.org/Help/Webmaster.html">webmaster</a><br>
+ (last updated $Date: 2002/02/13 14:08:32 $)</address>
+</body></html> \ No newline at end of file
diff --git a/lib/xmerl/test/xmerl_std_SUITE_data/xmltest.tgz b/lib/xmerl/test/xmerl_std_SUITE_data/xmltest.tgz
new file mode 100644
index 0000000000..d49fe26ff0
--- /dev/null
+++ b/lib/xmerl/test/xmerl_std_SUITE_data/xmltest.tgz
Binary files differ
diff --git a/lib/xmerl/test/xmerl_test_lib.erl b/lib/xmerl/test/xmerl_test_lib.erl
new file mode 100644
index 0000000000..16f438ca84
--- /dev/null
+++ b/lib/xmerl/test/xmerl_test_lib.erl
@@ -0,0 +1,92 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2006-2010. 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%
+%%
+%%%-------------------------------------------------------------------
+%%% File : xmerl_test_lib.erl
+%%% Author : Bertil Karlsson <bertil@finrod>
+%%% Description :
+%%%
+%%% Created : 28 Apr 2006 by Bertil Karlsson <bertil@finrod>
+%%%-------------------------------------------------------------------
+-module(xmerl_test_lib).
+
+-compile(export_all).
+
+-include_lib("test_server/include/test_server.hrl").
+-include_lib("xmerl/include/xmerl.hrl").
+
+%% cmp_element/2
+%% First argument result after parsing
+%% Second argument result after validation
+cmp_element(E,E) ->
+ ok;
+cmp_element(#xmlElement{name=N,attributes=A1,content=C1},
+ #xmlElement{name=N,attributes=A2,content=C2}) ->
+ case cmp_attributes(A1,A2) of
+ ok ->
+ cmp_elements(C1,C2);
+ Err -> Err
+ end;
+cmp_element(#xmlText{},#xmlText{}) ->
+ ok;
+cmp_element(A,B) ->
+ {error,{A,does_not_match,B}}.
+
+cmp_elements([H1|T1],[H2|T2]) ->
+ case cmp_element(H1,H2) of
+ ok ->
+ cmp_elements(T1,T2);
+ Err ->
+ Err
+ end;
+cmp_elements([],[]) ->
+ ok.
+
+%% All attributes in argument 1 must be present in 2
+cmp_attributes([A1|T1],Atts2) ->
+ case keysearch_delete(A1#xmlAttribute.name,#xmlAttribute.name,Atts2) of
+ {A2,NewAtts2} ->
+ case A1#xmlAttribute.value == A2#xmlAttribute.value of
+ true ->
+ cmp_attributes(T1,NewAtts2);
+ _ ->
+ {error,{mismatching_values_in_attsibutes,A1,A2}}
+ end;
+ _ ->
+ {error,{no_matching_attsibute,A1,in,Atts2}}
+ end;
+cmp_attributes([],_) ->
+ ok.
+
+keysearch_delete(Key,N,List) ->
+ case lists:keysearch(Key,N,List) of
+ {value,Res} ->
+ {Res,lists:keydelete(Key,N,List)};
+ _ ->
+ false
+ end.
+
+
+%% Some test suites use the same testdata ("xmerl_sax_std_SUITE" and "xmerl_std_SUITE"),
+%% so the data directory is not cloned. This function retrieves the path to
+%% the original data directory.
+
+get_data_dir(Config) ->
+ Data0 = ?config(data_dir, Config),
+ {ok,Data,_} = regexp:sub(Data0, "xmerl_sax_std_SUITE", "xmerl_std_SUITE"),
+ Data.
diff --git a/lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE.erl b/lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE.erl
new file mode 100644
index 0000000000..44ec4b592d
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE.erl
@@ -0,0 +1,24131 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2006-2010. 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%
+%%
+%%
+%%% Purpose : Test suite for the xmerl application
+
+%% Do NOT edit this file. It is generated by the generate_xsd_suite module
+%% For more info read the comments in the header of that file.
+
+-module('xmerl_xsd_MS2002-01-16_SUITE').
+
+-compile(export_all).
+
+-include_lib("test_server/include/test_server.hrl").
+-include_lib("xmerl/include/xmerl.hrl").
+-include_lib("xmerl/include/xmerl_xsd.hrl").
+
+
+all() ->
+ [att, ct, elem, group, idc_, id, mgABCD, mgEFG, mgHIJ,
+ mgK, mgLM, mgN, mgOP, mgQR, mgS, particlesAB,
+ particlesCDE, particlesFHI, particlesJ,
+ particlesKOSRTQUVW, stABCDE, stFGH, stIJK, stZ,
+ wildABCDEF, wildGHI, wildJKLMNQOP, wildZ].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+
+%% initialization before the test suite
+init_per_suite(Config) ->
+ Dog=test_server:timetrap({minutes,10}),
+ xmerl_xsd_lib:unpack(Config,msx),
+ {ok,LogFile} = xmerl_xsd_lib:create_error_log_file(Config,msx),
+ test_server:timetrap_cancel(Dog),
+ [{suite,msx},{xmerl_error_log,LogFile}|Config].
+
+end_per_suite(Config) ->
+ xmerl_xsd_lib:rmdir(Config,msx),
+ xmerl_xsd_lib:close_error_log_file(Config),
+ ok.
+
+%% initialization before each testcase
+init_per_testcase(TestCase,Config) ->
+ Dog=test_server:timetrap({minutes,3}),
+ [{testcase,TestCase},{watchdog, Dog}|Config].
+
+%% clean up after each testcase
+end_per_testcase(_Func,Config) ->
+ Dog=?config(watchdog, Config),
+ test_server:timetrap_cancel(Dog),
+ ok.
+
+%% Syntax Checking for Attribute Declaration
+
+att(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attA001.xsd','./msxsdtest/attribute',invalid),
+ STResList1 = [STRes0|STResList0],
+
+
+ ?line {STRes1,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attA002.xsd','./msxsdtest/attribute',invalid),
+ STResList2 = [STRes1|STResList1],
+
+
+ ?line {STRes2,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attA003.xsd','./msxsdtest/attribute',invalid),
+ STResList3 = [STRes2|STResList2],
+
+
+ ?line {STRes3,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attA004.xsd','./msxsdtest/attribute',invalid),
+ STResList4 = [STRes3|STResList3],
+
+
+ ?line {STRes4,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attA005.xsd','./msxsdtest/attribute',invalid),
+ STResList5 = [STRes4|STResList4],
+
+
+ ?line {STRes5,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attA006.xsd','./msxsdtest/attribute',invalid),
+ STResList6 = [STRes5|STResList5],
+
+
+ ?line {STRes6,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attA007.xsd','./msxsdtest/attribute',valid),
+ STResList7 = [STRes6|STResList6],
+
+
+ ?line {STRes7,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attA008.xsd','./msxsdtest/attribute',valid),
+ STResList8 = [STRes7|STResList7],
+
+
+ ?line {STRes8,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attB001.xsd','./msxsdtest/attribute',valid),
+ STResList9 = [STRes8|STResList8],
+
+
+ ?line {STRes9,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attB002.xsd','./msxsdtest/attribute',valid),
+ STResList10 = [STRes9|STResList9],
+
+
+ ?line {STRes10,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attB003.xsd','./msxsdtest/attribute',valid),
+ STResList11 = [STRes10|STResList10],
+
+
+ ?line {STRes11,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attB004.xsd','./msxsdtest/attribute',valid),
+ STResList12 = [STRes11|STResList11],
+
+
+ ?line {STRes12,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attB005.xsd','./msxsdtest/attribute',invalid),
+ STResList13 = [STRes12|STResList12],
+
+
+ ?line {STRes13,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attB006.xsd','./msxsdtest/attribute',invalid),
+ STResList14 = [STRes13|STResList13],
+
+
+ ?line {STRes14,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attC001.xsd','./msxsdtest/attribute',valid),
+ STResList15 = [STRes14|STResList14],
+
+
+
+
+ ?line {STRes15,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attC003.xsd','./msxsdtest/attribute',valid),
+ STResList16 = [STRes15|STResList15],
+
+
+ ?line {STRes16,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attC004.xsd','./msxsdtest/attribute',invalid),
+ STResList17 = [STRes16|STResList16],
+
+
+ ?line {STRes17,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attC005.xsd','./msxsdtest/attribute',invalid),
+ STResList18 = [STRes17|STResList17],
+
+
+ ?line {STRes18,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attC006.xsd','./msxsdtest/attribute',invalid),
+ STResList19 = [STRes18|STResList18],
+
+
+ ?line {STRes19,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attC007.xsd','./msxsdtest/attribute',invalid),
+ STResList20 = [STRes19|STResList19],
+
+
+ ?line {STRes20,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attC008.xsd','./msxsdtest/attribute',invalid),
+ STResList21 = [STRes20|STResList20],
+
+
+ ?line {STRes21,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attC009.xsd','./msxsdtest/attribute',invalid),
+ STResList22 = [STRes21|STResList21],
+
+
+ ?line {STRes22,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attC010.xsd','./msxsdtest/attribute',invalid),
+ STResList23 = [STRes22|STResList22],
+
+
+ ?line {STRes23,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attD001.xsd','./msxsdtest/attribute',valid),
+ STResList24 = [STRes23|STResList23],
+
+
+ ?line {STRes24,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attD002.xsd','./msxsdtest/attribute',invalid),
+ STResList25 = [STRes24|STResList24],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attD003.xsd','./msxsdtest/attribute',valid),
+ STResList26 = [STRes25|STResList25],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attD003.xml','./msxsdtest/attribute',valid,S25),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attD004.xsd','./msxsdtest/attribute',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attD004.xml','./msxsdtest/attribute',valid,S26),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ ?line {STRes27,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attD005.xsd','./msxsdtest/attribute',invalid),
+ STResList28 = [STRes27|STResList27],
+
+
+ ?line {STRes28,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attD006.xsd','./msxsdtest/attribute',invalid),
+ STResList29 = [STRes28|STResList28],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attD007.xsd','./msxsdtest/attribute',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attD007.xml','./msxsdtest/attribute',valid,S29),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attE001.xsd','./msxsdtest/attribute',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attE001.xml','./msxsdtest/attribute',valid,S30),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ ?line {STRes31,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attE002.xsd','./msxsdtest/attribute',invalid),
+ STResList32 = [STRes31|STResList31],
+
+
+ ?line {STRes32,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attE003.xsd','./msxsdtest/attribute',invalid),
+ STResList33 = [STRes32|STResList32],
+
+
+ ?line {STRes33,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attE004.xsd','./msxsdtest/attribute',invalid),
+ STResList34 = [STRes33|STResList33],
+
+
+ ?line {STRes34,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attE005.xsd','./msxsdtest/attribute',invalid),
+ STResList35 = [STRes34|STResList34],
+
+
+ ?line {STRes35,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attE006.xsd','./msxsdtest/attribute',invalid),
+ STResList36 = [STRes35|STResList35],
+
+
+ ?line {STRes36,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attE007.xsd','./msxsdtest/attribute',invalid),
+ STResList37 = [STRes36|STResList36],
+
+
+ ?line {STRes37,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attE008.xsd','./msxsdtest/attribute',valid),
+ STResList38 = [STRes37|STResList37],
+
+
+ ?line {STRes38,S38} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attF001.xsd','./msxsdtest/attribute',valid),
+ STResList39 = [STRes38|STResList38],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attF001.xml','./msxsdtest/attribute',invalid,S38),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes39,S39} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attF002.xsd','./msxsdtest/attribute',valid),
+ STResList40 = [STRes39|STResList39],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attF002.xml','./msxsdtest/attribute',valid,S39),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes40,S40} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attF003.xsd','./msxsdtest/attribute',valid),
+ STResList41 = [STRes40|STResList40],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attF003.xml','./msxsdtest/attribute',valid,S40),
+ ITResList7 = [ITRes6|ITResList6],
+
+
+ ?line {STRes41,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attF004.xsd','./msxsdtest/attribute',invalid),
+ STResList42 = [STRes41|STResList41],
+
+
+ ?line {STRes42,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attF005.xsd','./msxsdtest/attribute',invalid),
+ STResList43 = [STRes42|STResList42],
+
+
+ ?line {STRes43,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attF006.xsd','./msxsdtest/attribute',invalid),
+ STResList44 = [STRes43|STResList43],
+
+
+ ?line {STRes44,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attF007.xsd','./msxsdtest/attribute',invalid),
+ STResList45 = [STRes44|STResList44],
+
+
+ ?line {STRes45,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attF008.xsd','./msxsdtest/attribute',invalid),
+ STResList46 = [STRes45|STResList45],
+
+
+ ?line {STRes46,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attF009.xsd','./msxsdtest/attribute',invalid),
+ STResList47 = [STRes46|STResList46],
+
+
+ ?line {STRes47,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attF010.xsd','./msxsdtest/attribute',invalid),
+ STResList48 = [STRes47|STResList47],
+
+
+ ?line {STRes48,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attF011.xsd','./msxsdtest/attribute',invalid),
+ STResList49 = [STRes48|STResList48],
+
+
+ ?line {STRes49,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attG001.xsd','./msxsdtest/attribute',valid),
+ STResList50 = [STRes49|STResList49],
+
+
+ ?line {STRes50,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attG002.xsd','./msxsdtest/attribute',valid),
+ STResList51 = [STRes50|STResList50],
+
+
+ ?line {STRes51,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attG003.xsd','./msxsdtest/attribute',valid),
+ STResList52 = [STRes51|STResList51],
+
+
+ ?line {STRes52,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attH001.xsd','./msxsdtest/attribute',invalid),
+ STResList53 = [STRes52|STResList52],
+
+
+ ?line {STRes53,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attI001.xsd','./msxsdtest/attribute',valid),
+ STResList54 = [STRes53|STResList53],
+
+
+ ?line {STRes54,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attI002.xsd','./msxsdtest/attribute',valid),
+ STResList55 = [STRes54|STResList54],
+
+
+ ?line {STRes55,S55} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attI003.xsd','./msxsdtest/attribute',valid),
+ STResList56 = [STRes55|STResList55],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attI003.xml','./msxsdtest/attribute',valid,S55),
+ ITResList8 = [ITRes7|ITResList7],
+
+
+ ?line {STRes56,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attI004.xsd','./msxsdtest/attribute',invalid),
+ STResList57 = [STRes56|STResList56],
+
+
+ ?line {STRes57,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attI005.xsd','./msxsdtest/attribute',invalid),
+ STResList58 = [STRes57|STResList57],
+
+
+ ?line {STRes58,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attI006.xsd','./msxsdtest/attribute',invalid),
+ STResList59 = [STRes58|STResList58],
+
+
+ ?line {STRes59,S59} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attJ001.xsd','./msxsdtest/attribute',valid),
+ STResList60 = [STRes59|STResList59],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attJ001.xml','./msxsdtest/attribute',valid,S59),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ ?line {STRes60,S60} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attJ002.xsd','./msxsdtest/attribute',valid),
+ STResList61 = [STRes60|STResList60],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attJ002.xml','./msxsdtest/attribute',invalid,S60),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes61,S61} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attJ003.xsd','./msxsdtest/attribute',valid),
+ STResList62 = [STRes61|STResList61],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attJ003.xml','./msxsdtest/attribute',invalid,S61),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes62,S62} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attJ004.xsd','./msxsdtest/attribute',valid),
+ STResList63 = [STRes62|STResList62],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attJ004.xml','./msxsdtest/attribute',valid,S62),
+ ITResList12 = [ITRes11|ITResList11],
+
+
+ ?line {STRes63,S63} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attJ005.xsd','./msxsdtest/attribute',valid),
+ STResList64 = [STRes63|STResList63],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attJ005.xml','./msxsdtest/attribute',valid,S63),
+ ITResList13 = [ITRes12|ITResList12],
+
+
+ ?line {STRes64,S64} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attJ006.xsd','./msxsdtest/attribute',valid),
+ STResList65 = [STRes64|STResList64],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attJ006.xml','./msxsdtest/attribute',valid,S64),
+ ITResList14 = [ITRes13|ITResList13],
+
+
+ ?line {STRes65,S65} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attJ007.xsd','./msxsdtest/attribute',valid),
+ STResList66 = [STRes65|STResList65],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attJ007.xml','./msxsdtest/attribute',valid,S65),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes66,S66} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attJ008.xsd','./msxsdtest/attribute',valid),
+ STResList67 = [STRes66|STResList66],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attJ008.xml','./msxsdtest/attribute',invalid,S66),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ ?line {STRes67,S67} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attJ009.xsd','./msxsdtest/attribute',valid),
+ STResList68 = [STRes67|STResList67],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attJ009.xml','./msxsdtest/attribute',invalid,S67),
+ ITResList17 = [ITRes16|ITResList16],
+
+
+ ?line {STRes68,S68} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attJ010.xsd','./msxsdtest/attribute',valid),
+ STResList69 = [STRes68|STResList68],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attJ010.xml','./msxsdtest/attribute',invalid,S68),
+ ITResList18 = [ITRes17|ITResList17],
+
+
+ ?line {STRes69,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attJ011.xsd','./msxsdtest/attribute',invalid),
+ STResList70 = [STRes69|STResList69],
+
+
+ ?line {STRes70,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attJ012.xsd','./msxsdtest/attribute',invalid),
+ STResList71 = [STRes70|STResList70],
+
+
+ ?line {STRes71,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attJ013.xsd','./msxsdtest/attribute',invalid),
+ STResList72 = [STRes71|STResList71],
+
+
+ ?line {STRes72,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attJ014.xsd','./msxsdtest/attribute',invalid),
+ STResList73 = [STRes72|STResList72],
+
+
+ ?line {STRes73,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attJ015.xsd','./msxsdtest/attribute',invalid),
+ STResList74 = [STRes73|STResList73],
+
+
+ ?line {STRes74,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attJ016.xsd','./msxsdtest/attribute',invalid),
+ STResList75 = [STRes74|STResList74],
+
+
+ ?line {STRes75,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attJ017.xsd','./msxsdtest/attribute',invalid),
+ STResList76 = [STRes75|STResList75],
+
+
+ ?line {STRes76,S76} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attJ018.xsd','./msxsdtest/attribute',valid),
+ STResList77 = [STRes76|STResList76],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attJ018.xml','./msxsdtest/attribute',valid,S76),
+ ITResList19 = [ITRes18|ITResList18],
+
+
+ ?line {STRes77,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKa001.xsd','./msxsdtest/attribute',invalid),
+ STResList78 = [STRes77|STResList77],
+
+
+ ?line {STRes78,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKa002.xsd','./msxsdtest/attribute',valid),
+ STResList79 = [STRes78|STResList78],
+
+
+ ?line {STRes79,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKa003.xsd','./msxsdtest/attribute',invalid),
+ STResList80 = [STRes79|STResList79],
+
+
+ ?line {STRes80,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKa004.xsd','./msxsdtest/attribute',invalid),
+ STResList81 = [STRes80|STResList80],
+
+
+ ?line {STRes81,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKa005.xsd','./msxsdtest/attribute',invalid),
+ STResList82 = [STRes81|STResList81],
+
+
+ ?line {STRes82,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKa006.xsd','./msxsdtest/attribute',valid),
+ STResList83 = [STRes82|STResList82],
+
+
+ ?line {STRes83,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKa007.xsd','./msxsdtest/attribute',invalid),
+ STResList84 = [STRes83|STResList83],
+
+
+ ?line {STRes84,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKa008.xsd','./msxsdtest/attribute',invalid),
+ STResList85 = [STRes84|STResList84],
+
+
+ ?line {STRes85,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKa009.xsd','./msxsdtest/attribute',invalid),
+ STResList86 = [STRes85|STResList85],
+
+
+ ?line {STRes86,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKa010.xsd','./msxsdtest/attribute',invalid),
+ STResList87 = [STRes86|STResList86],
+
+
+ ?line {STRes87,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKa011.xsd','./msxsdtest/attribute',invalid),
+ STResList88 = [STRes87|STResList87],
+
+
+ ?line {STRes88,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKa012.xsd','./msxsdtest/attribute',invalid),
+ STResList89 = [STRes88|STResList88],
+
+
+ ?line {STRes89,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKa013.xsd','./msxsdtest/attribute',invalid),
+ STResList90 = [STRes89|STResList89],
+
+
+ ?line {STRes90,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKa014.xsd','./msxsdtest/attribute',invalid),
+ STResList91 = [STRes90|STResList90],
+
+
+ ?line {STRes91,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKa015.xsd','./msxsdtest/attribute',invalid),
+ STResList92 = [STRes91|STResList91],
+
+
+ ?line {STRes92,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKb001.xsd','./msxsdtest/attribute',invalid),
+ STResList93 = [STRes92|STResList92],
+
+
+ ?line {STRes93,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKb002.xsd','./msxsdtest/attribute',valid),
+ STResList94 = [STRes93|STResList93],
+
+
+ ?line {STRes94,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKb003.xsd','./msxsdtest/attribute',valid),
+ STResList95 = [STRes94|STResList94],
+
+
+ ?line {STRes95,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKb004.xsd','./msxsdtest/attribute',invalid),
+ STResList96 = [STRes95|STResList95],
+
+
+ ?line {STRes96,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKb005.xsd','./msxsdtest/attribute',invalid),
+ STResList97 = [STRes96|STResList96],
+
+
+ ?line {STRes97,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKb006.xsd','./msxsdtest/attribute',valid),
+ STResList98 = [STRes97|STResList97],
+
+
+ ?line {STRes98,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKb007.xsd','./msxsdtest/attribute',valid),
+ STResList99 = [STRes98|STResList98],
+
+
+ ?line {STRes99,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKb008.xsd','./msxsdtest/attribute',valid),
+ STResList100 = [STRes99|STResList99],
+
+
+ ?line {STRes100,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKb009.xsd','./msxsdtest/attribute',valid),
+ STResList101 = [STRes100|STResList100],
+
+
+ ?line {STRes101,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKb010.xsd','./msxsdtest/attribute',invalid),
+ STResList102 = [STRes101|STResList101],
+
+
+ ?line {STRes102,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKb011.xsd','./msxsdtest/attribute',invalid),
+ STResList103 = [STRes102|STResList102],
+
+
+ ?line {STRes103,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKb012.xsd','./msxsdtest/attribute',invalid),
+ STResList104 = [STRes103|STResList103],
+
+
+ ?line {STRes104,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKb013.xsd','./msxsdtest/attribute',invalid),
+ STResList105 = [STRes104|STResList104],
+
+
+ ?line {STRes105,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKb014.xsd','./msxsdtest/attribute',invalid),
+ STResList106 = [STRes105|STResList105],
+
+
+ ?line {STRes106,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKb015.xsd','./msxsdtest/attribute',invalid),
+ STResList107 = [STRes106|STResList106],
+
+
+ ?line {STRes107,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKb016.xsd','./msxsdtest/attribute',invalid),
+ STResList108 = [STRes107|STResList107],
+
+
+ ?line {STRes108,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKb017.xsd','./msxsdtest/attribute',invalid),
+ STResList109 = [STRes108|STResList108],
+
+
+ ?line {STRes109,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKb018.xsd','./msxsdtest/attribute',invalid),
+ STResList110 = [STRes109|STResList109],
+
+
+ ?line {STRes110,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKc001.xsd','./msxsdtest/attribute',invalid),
+ STResList111 = [STRes110|STResList110],
+
+
+ ?line {STRes111,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKc002.xsd','./msxsdtest/attribute',valid),
+ STResList112 = [STRes111|STResList111],
+
+
+ ?line {STRes112,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKc003.xsd','./msxsdtest/attribute',valid),
+ STResList113 = [STRes112|STResList112],
+
+
+ ?line {STRes113,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKc004.xsd','./msxsdtest/attribute',invalid),
+ STResList114 = [STRes113|STResList113],
+
+
+ ?line {STRes114,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKc005.xsd','./msxsdtest/attribute',invalid),
+ STResList115 = [STRes114|STResList114],
+
+
+ ?line {STRes115,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKc006.xsd','./msxsdtest/attribute',valid),
+ STResList116 = [STRes115|STResList115],
+
+
+ ?line {STRes116,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKc007.xsd','./msxsdtest/attribute',valid),
+ STResList117 = [STRes116|STResList116],
+
+
+ ?line {STRes117,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKc008.xsd','./msxsdtest/attribute',valid),
+ STResList118 = [STRes117|STResList117],
+
+
+ ?line {STRes118,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKc009.xsd','./msxsdtest/attribute',valid),
+ STResList119 = [STRes118|STResList118],
+
+
+ ?line {STRes119,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKc010.xsd','./msxsdtest/attribute',invalid),
+ STResList120 = [STRes119|STResList119],
+
+
+ ?line {STRes120,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKc011.xsd','./msxsdtest/attribute',invalid),
+ STResList121 = [STRes120|STResList120],
+
+
+ ?line {STRes121,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKc012.xsd','./msxsdtest/attribute',invalid),
+ STResList122 = [STRes121|STResList121],
+
+
+ ?line {STRes122,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKc013.xsd','./msxsdtest/attribute',invalid),
+ STResList123 = [STRes122|STResList122],
+
+
+ ?line {STRes123,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKc014.xsd','./msxsdtest/attribute',invalid),
+ STResList124 = [STRes123|STResList123],
+
+
+ ?line {STRes124,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKc015.xsd','./msxsdtest/attribute',invalid),
+ STResList125 = [STRes124|STResList124],
+
+
+ ?line {STRes125,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKc016.xsd','./msxsdtest/attribute',invalid),
+ STResList126 = [STRes125|STResList125],
+
+
+ ?line {STRes126,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKc017.xsd','./msxsdtest/attribute',invalid),
+ STResList127 = [STRes126|STResList126],
+
+
+ ?line {STRes127,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attKc018.xsd','./msxsdtest/attribute',invalid),
+ STResList128 = [STRes127|STResList127],
+
+
+ ?line {STRes128,S128} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attLa001.xsd','./msxsdtest/attribute',valid),
+ STResList129 = [STRes128|STResList128],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attLa001.xml','./msxsdtest/attribute',valid,S128),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes129,S129} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attLa002.xsd','./msxsdtest/attribute',valid),
+ STResList130 = [STRes129|STResList129],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attLa002.xml','./msxsdtest/attribute',valid,S129),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes130,S130} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attLa003.xsd','./msxsdtest/attribute',valid),
+ STResList131 = [STRes130|STResList130],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attLa003.xml','./msxsdtest/attribute',valid,S130),
+ ITResList22 = [ITRes21|ITResList21],
+
+
+ ?line {STRes131,S131} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attLa004.xsd','./msxsdtest/attribute',valid),
+ STResList132 = [STRes131|STResList131],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attLa004.xml','./msxsdtest/attribute',valid,S131),
+ ITResList23 = [ITRes22|ITResList22],
+
+
+ ?line {STRes132,S132} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attLa005.xsd','./msxsdtest/attribute',valid),
+ STResList133 = [STRes132|STResList132],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attLa005.xml','./msxsdtest/attribute',invalid,S132),
+ ITResList24 = [ITRes23|ITResList23],
+
+
+ ?line {STRes133,S133} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attLa006.xsd','./msxsdtest/attribute',valid),
+ STResList134 = [STRes133|STResList133],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attLa006.xml','./msxsdtest/attribute',valid,S133),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ ?line {STRes134,S134} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attLb001.xsd','./msxsdtest/attribute',valid),
+ STResList135 = [STRes134|STResList134],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attLb001.xml','./msxsdtest/attribute',valid,S134),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes135,S135} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attLb002.xsd','./msxsdtest/attribute',valid),
+ STResList136 = [STRes135|STResList135],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attLb002.xml','./msxsdtest/attribute',valid,S135),
+ ITResList27 = [ITRes26|ITResList26],
+
+
+ ?line {STRes136,S136} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attLb003.xsd','./msxsdtest/attribute',valid),
+ STResList137 = [STRes136|STResList136],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attLb003.xml','./msxsdtest/attribute',valid,S136),
+ ITResList28 = [ITRes27|ITResList27],
+
+
+ ?line {STRes137,S137} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attLb004.xsd','./msxsdtest/attribute',valid),
+ STResList138 = [STRes137|STResList137],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attLb004.xml','./msxsdtest/attribute',valid,S137),
+ ITResList29 = [ITRes28|ITResList28],
+
+
+ ?line {STRes138,S138} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attLb005.xsd','./msxsdtest/attribute',valid),
+ STResList139 = [STRes138|STResList138],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attLb005.xml','./msxsdtest/attribute',invalid,S138),
+ ITResList30 = [ITRes29|ITResList29],
+
+
+ ?line {STRes139,S139} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attLb006.xsd','./msxsdtest/attribute',valid),
+ STResList140 = [STRes139|STResList139],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attLb006.xml','./msxsdtest/attribute',valid,S139),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes140,S140} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attLc001.xsd','./msxsdtest/attribute',valid),
+ STResList141 = [STRes140|STResList140],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attLc001.xml','./msxsdtest/attribute',valid,S140),
+ ITResList32 = [ITRes31|ITResList31],
+
+
+ ?line {STRes141,S141} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attLc002.xsd','./msxsdtest/attribute',valid),
+ STResList142 = [STRes141|STResList141],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attLc002.xml','./msxsdtest/attribute',valid,S141),
+ ITResList33 = [ITRes32|ITResList32],
+
+
+ ?line {STRes142,S142} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attLc003.xsd','./msxsdtest/attribute',valid),
+ STResList143 = [STRes142|STResList142],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attLc003.xml','./msxsdtest/attribute',valid,S142),
+ ITResList34 = [ITRes33|ITResList33],
+
+
+ ?line {STRes143,S143} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attLc004.xsd','./msxsdtest/attribute',valid),
+ STResList144 = [STRes143|STResList143],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attLc004.xml','./msxsdtest/attribute',valid,S143),
+ ITResList35 = [ITRes34|ITResList34],
+
+
+ ?line {STRes144,S144} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attLc005.xsd','./msxsdtest/attribute',valid),
+ STResList145 = [STRes144|STResList144],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attLc005.xml','./msxsdtest/attribute',invalid,S144),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes145,S145} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attLc006.xsd','./msxsdtest/attribute',valid),
+ STResList146 = [STRes145|STResList145],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attLc006.xml','./msxsdtest/attribute',valid,S145),
+ ITResList37 = [ITRes36|ITResList36],
+
+
+ ?line {STRes146,S146} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMa001.xsd','./msxsdtest/attribute',valid),
+ STResList147 = [STRes146|STResList146],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMa001.xml','./msxsdtest/attribute',invalid,S146),
+ ITResList38 = [ITRes37|ITResList37],
+
+
+ ?line {STRes147,S147} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMa002.xsd','./msxsdtest/attribute',valid),
+ STResList148 = [STRes147|STResList147],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMa002.xml','./msxsdtest/attribute',invalid,S147),
+ ITResList39 = [ITRes38|ITResList38],
+
+
+ ?line {STRes148,S148} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMa003.xsd','./msxsdtest/attribute',valid),
+ STResList149 = [STRes148|STResList148],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMa003.xml','./msxsdtest/attribute',valid,S148),
+ ITResList40 = [ITRes39|ITResList39],
+
+
+ ?line {STRes149,S149} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMa004.xsd','./msxsdtest/attribute',valid),
+ STResList150 = [STRes149|STResList149],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMa004.xml','./msxsdtest/attribute',valid,S149),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes150,S150} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMb001.xsd','./msxsdtest/attribute',valid),
+ STResList151 = [STRes150|STResList150],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMb001.xml','./msxsdtest/attribute',invalid,S150),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes151,S151} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMb002.xsd','./msxsdtest/attribute',valid),
+ STResList152 = [STRes151|STResList151],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMb002.xml','./msxsdtest/attribute',invalid,S151),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes152,S152} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMb003.xsd','./msxsdtest/attribute',valid),
+ STResList153 = [STRes152|STResList152],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMb003.xml','./msxsdtest/attribute',invalid,S152),
+ ITResList44 = [ITRes43|ITResList43],
+
+
+ ?line {STRes153,S153} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMb004.xsd','./msxsdtest/attribute',valid),
+ STResList154 = [STRes153|STResList153],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMb004.xml','./msxsdtest/attribute',valid,S153),
+ ITResList45 = [ITRes44|ITResList44],
+
+
+ ?line {STRes154,S154} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMb005.xsd','./msxsdtest/attribute',valid),
+ STResList155 = [STRes154|STResList154],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMb005.xml','./msxsdtest/attribute',valid,S154),
+ ITResList46 = [ITRes45|ITResList45],
+
+
+ ?line {STRes155,S155} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMb006.xsd','./msxsdtest/attribute',valid),
+ STResList156 = [STRes155|STResList155],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMb006.xml','./msxsdtest/attribute',valid,S155),
+ ITResList47 = [ITRes46|ITResList46],
+
+
+ ?line {STRes156,S156} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMb007.xsd','./msxsdtest/attribute',valid),
+ STResList157 = [STRes156|STResList156],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMb007.xml','./msxsdtest/attribute',valid,S156),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes157,S157} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMb008.xsd','./msxsdtest/attribute',valid),
+ STResList158 = [STRes157|STResList157],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMb008.xml','./msxsdtest/attribute',valid,S157),
+ ITResList49 = [ITRes48|ITResList48],
+
+
+ ?line {STRes158,S158} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMb009.xsd','./msxsdtest/attribute',valid),
+ STResList159 = [STRes158|STResList158],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMb009.xml','./msxsdtest/attribute',valid,S158),
+ ITResList50 = [ITRes49|ITResList49],
+
+
+ ?line {STRes159,S159} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMb010.xsd','./msxsdtest/attribute',valid),
+ STResList160 = [STRes159|STResList159],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMb010.xml','./msxsdtest/attribute',invalid,S159),
+ ITResList51 = [ITRes50|ITResList50],
+
+
+ ?line {STRes160,S160} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMb011.xsd','./msxsdtest/attribute',valid),
+ STResList161 = [STRes160|STResList160],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMb011.xml','./msxsdtest/attribute',invalid,S160),
+ ITResList52 = [ITRes51|ITResList51],
+
+
+ ?line {STRes161,S161} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMb012.xsd','./msxsdtest/attribute',valid),
+ STResList162 = [STRes161|STResList161],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMb012.xml','./msxsdtest/attribute',invalid,S161),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes162,S162} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMc001.xsd','./msxsdtest/attribute',valid),
+ STResList163 = [STRes162|STResList162],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMc001.xml','./msxsdtest/attribute',invalid,S162),
+ ITResList54 = [ITRes53|ITResList53],
+
+
+ ?line {STRes163,S163} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMc002.xsd','./msxsdtest/attribute',valid),
+ STResList164 = [STRes163|STResList163],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMc002.xml','./msxsdtest/attribute',invalid,S163),
+ ITResList55 = [ITRes54|ITResList54],
+
+
+ ?line {STRes164,S164} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMc003.xsd','./msxsdtest/attribute',valid),
+ STResList165 = [STRes164|STResList164],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMc003.xml','./msxsdtest/attribute',invalid,S164),
+ ITResList56 = [ITRes55|ITResList55],
+
+
+ ?line {STRes165,S165} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMc004.xsd','./msxsdtest/attribute',valid),
+ STResList166 = [STRes165|STResList165],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMc004.xml','./msxsdtest/attribute',valid,S165),
+ ITResList57 = [ITRes56|ITResList56],
+
+
+ ?line {STRes166,S166} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMc005.xsd','./msxsdtest/attribute',valid),
+ STResList167 = [STRes166|STResList166],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMc005.xml','./msxsdtest/attribute',valid,S166),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes167,S167} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMc006.xsd','./msxsdtest/attribute',valid),
+ STResList168 = [STRes167|STResList167],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMc006.xml','./msxsdtest/attribute',valid,S167),
+ ITResList59 = [ITRes58|ITResList58],
+
+
+ ?line {STRes168,S168} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMc007.xsd','./msxsdtest/attribute',valid),
+ STResList169 = [STRes168|STResList168],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMc007.xml','./msxsdtest/attribute',valid,S168),
+ ITResList60 = [ITRes59|ITResList59],
+
+
+ ?line {STRes169,S169} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMc008.xsd','./msxsdtest/attribute',valid),
+ STResList170 = [STRes169|STResList169],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMc008.xml','./msxsdtest/attribute',valid,S169),
+ ITResList61 = [ITRes60|ITResList60],
+
+
+ ?line {STRes170,S170} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMc009.xsd','./msxsdtest/attribute',valid),
+ STResList171 = [STRes170|STResList170],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMc009.xml','./msxsdtest/attribute',valid,S170),
+ ITResList62 = [ITRes61|ITResList61],
+
+
+ ?line {STRes171,S171} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMc010.xsd','./msxsdtest/attribute',valid),
+ STResList172 = [STRes171|STResList171],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMc010.xml','./msxsdtest/attribute',invalid,S171),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes172,S172} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMc011.xsd','./msxsdtest/attribute',valid),
+ STResList173 = [STRes172|STResList172],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMc011.xml','./msxsdtest/attribute',invalid,S172),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes173,S173} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attMc012.xsd','./msxsdtest/attribute',valid),
+ STResList174 = [STRes173|STResList173],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attMc012.xml','./msxsdtest/attribute',invalid,S173),
+ ITResList65 = [ITRes64|ITResList64],
+
+
+ ?line {STRes174,S174} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO001.xsd','./msxsdtest/attribute',valid),
+ STResList175 = [STRes174|STResList174],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attO001.xml','./msxsdtest/attribute',invalid,S174),
+ ITResList66 = [ITRes65|ITResList65],
+
+
+ ?line {STRes175,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO002.xsd','./msxsdtest/attribute',invalid),
+ STResList176 = [STRes175|STResList175],
+
+
+ ?line {STRes176,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO003.xsd','./msxsdtest/attribute',invalid),
+ STResList177 = [STRes176|STResList176],
+
+
+ ?line {STRes177,S177} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO004.xsd','./msxsdtest/attribute',valid),
+ STResList178 = [STRes177|STResList177],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attO004.xml','./msxsdtest/attribute',invalid,S177),
+ ITResList67 = [ITRes66|ITResList66],
+
+
+ ?line {STRes178,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO005.xsd','./msxsdtest/attribute',invalid),
+ STResList179 = [STRes178|STResList178],
+
+
+ ?line {STRes179,S179} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO006.xsd','./msxsdtest/attribute',valid),
+ STResList180 = [STRes179|STResList179],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attO006.xml','./msxsdtest/attribute',valid,S179),
+ ITResList68 = [ITRes67|ITResList67],
+
+
+ ?line {STRes180,S180} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO007.xsd','./msxsdtest/attribute',valid),
+ STResList181 = [STRes180|STResList180],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attO007.xml','./msxsdtest/attribute',valid,S180),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes181,S181} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO008.xsd','./msxsdtest/attribute',valid),
+ STResList182 = [STRes181|STResList181],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attO008.xml','./msxsdtest/attribute',invalid,S181),
+ ITResList70 = [ITRes69|ITResList69],
+
+
+ ?line {STRes182,S182} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO009.xsd','./msxsdtest/attribute',valid),
+ STResList183 = [STRes182|STResList182],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attO009.xml','./msxsdtest/attribute',valid,S182),
+ ITResList71 = [ITRes70|ITResList70],
+
+
+ ?line {STRes183,S183} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO010.xsd','./msxsdtest/attribute',valid),
+ STResList184 = [STRes183|STResList183],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attO010.xml','./msxsdtest/attribute',valid,S183),
+ ITResList72 = [ITRes71|ITResList71],
+
+
+ ?line {STRes184,S184} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO011.xsd','./msxsdtest/attribute',valid),
+ STResList185 = [STRes184|STResList184],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attO011.xml','./msxsdtest/attribute',valid,S184),
+ ITResList73 = [ITRes72|ITResList72],
+
+
+ ?line {STRes185,S185} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO012.xsd','./msxsdtest/attribute',valid),
+ STResList186 = [STRes185|STResList185],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attO012.xml','./msxsdtest/attribute',invalid,S185),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes186,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO013.xsd','./msxsdtest/attribute',invalid),
+ STResList187 = [STRes186|STResList186],
+
+
+ ?line {STRes187,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO014.xsd','./msxsdtest/attribute',invalid),
+ STResList188 = [STRes187|STResList187],
+
+
+ ?line {STRes188,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO015.xsd','./msxsdtest/attribute',invalid),
+ STResList189 = [STRes188|STResList188],
+
+
+ ?line {STRes189,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO016.xsd','./msxsdtest/attribute',invalid),
+ STResList190 = [STRes189|STResList189],
+
+
+ ?line {STRes190,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO017.xsd','./msxsdtest/attribute',invalid),
+ STResList191 = [STRes190|STResList190],
+
+
+ ?line {STRes191,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO018.xsd','./msxsdtest/attribute',valid),
+ STResList192 = [STRes191|STResList191],
+
+
+ ?line {STRes192,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO019.xsd','./msxsdtest/attribute',invalid),
+ STResList193 = [STRes192|STResList192],
+
+
+ ?line {STRes193,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO020.xsd','./msxsdtest/attribute',invalid),
+ STResList194 = [STRes193|STResList193],
+
+
+ ?line {STRes194,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO021.xsd','./msxsdtest/attribute',invalid),
+ STResList195 = [STRes194|STResList194],
+
+
+ ?line {STRes195,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO022.xsd','./msxsdtest/attribute',invalid),
+ STResList196 = [STRes195|STResList195],
+
+
+ ?line {STRes196,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO023.xsd','./msxsdtest/attribute',invalid),
+ STResList197 = [STRes196|STResList196],
+
+
+ ?line {STRes197,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO024.xsd','./msxsdtest/attribute',invalid),
+ STResList198 = [STRes197|STResList197],
+
+
+ ?line {STRes198,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attO025.xsd','./msxsdtest/attribute',valid),
+ STResList199 = [STRes198|STResList198],
+
+
+ ?line {STRes199,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP001.xsd','./msxsdtest/attribute',invalid),
+ STResList200 = [STRes199|STResList199],
+
+
+ ?line {STRes200,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP002.xsd','./msxsdtest/attribute',invalid),
+ STResList201 = [STRes200|STResList200],
+
+
+ ?line {STRes201,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP003.xsd','./msxsdtest/attribute',invalid),
+ STResList202 = [STRes201|STResList201],
+
+
+ ?line {STRes202,S202} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP004.xsd','./msxsdtest/attribute',valid),
+ STResList203 = [STRes202|STResList202],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP004.xml','./msxsdtest/attribute',valid,S202),
+ ITResList75 = [ITRes74|ITResList74],
+
+
+ ?line {STRes203,S203} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP005.xsd','./msxsdtest/attribute',valid),
+ STResList204 = [STRes203|STResList203],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP005.xml','./msxsdtest/attribute',invalid,S203),
+ ITResList76 = [ITRes75|ITResList75],
+
+
+ ?line {STRes204,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP006.xsd','./msxsdtest/attribute',invalid),
+ STResList205 = [STRes204|STResList204],
+
+
+ ?line {STRes205,S205} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP007.xsd','./msxsdtest/attribute',valid),
+ STResList206 = [STRes205|STResList205],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP007.xml','./msxsdtest/attribute',valid,S205),
+ ITResList77 = [ITRes76|ITResList76],
+
+
+ ?line {STRes206,S206} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP008.xsd','./msxsdtest/attribute',valid),
+ STResList207 = [STRes206|STResList206],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP008.xml','./msxsdtest/attribute',invalid,S206),
+ ITResList78 = [ITRes77|ITResList77],
+
+
+ ?line {STRes207,S207} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP009.xsd','./msxsdtest/attribute',valid),
+ STResList208 = [STRes207|STResList207],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP009.xml','./msxsdtest/attribute',valid,S207),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes208,S208} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP010.xsd','./msxsdtest/attribute',valid),
+ STResList209 = [STRes208|STResList208],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP010.xml','./msxsdtest/attribute',invalid,S208),
+ ITResList80 = [ITRes79|ITResList79],
+
+
+ ?line {STRes209,S209} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP011.xsd','./msxsdtest/attribute',valid),
+ STResList210 = [STRes209|STResList209],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP011.xml','./msxsdtest/attribute',valid,S209),
+ ITResList81 = [ITRes80|ITResList80],
+
+
+ ?line {STRes210,S210} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP012.xsd','./msxsdtest/attribute',valid),
+ STResList211 = [STRes210|STResList210],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP012.xml','./msxsdtest/attribute',invalid,S210),
+ ITResList82 = [ITRes81|ITResList81],
+
+
+ ?line {STRes211,S211} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP013.xsd','./msxsdtest/attribute',valid),
+ STResList212 = [STRes211|STResList211],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP013.xml','./msxsdtest/attribute',valid,S211),
+ ITResList83 = [ITRes82|ITResList82],
+
+
+ ?line {STRes212,S212} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP014.xsd','./msxsdtest/attribute',valid),
+ STResList213 = [STRes212|STResList212],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP014.xml','./msxsdtest/attribute',invalid,S212),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes213,S213} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP015.xsd','./msxsdtest/attribute',valid),
+ STResList214 = [STRes213|STResList213],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP015.xml','./msxsdtest/attribute',valid,S213),
+ ITResList85 = [ITRes84|ITResList84],
+
+
+ ?line {STRes214,S214} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP016.xsd','./msxsdtest/attribute',valid),
+ STResList215 = [STRes214|STResList214],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP016.xml','./msxsdtest/attribute',invalid,S214),
+ ITResList86 = [ITRes85|ITResList85],
+
+
+ ?line {STRes215,S215} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP017.xsd','./msxsdtest/attribute',valid),
+ STResList216 = [STRes215|STResList215],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP017.xml','./msxsdtest/attribute',valid,S215),
+ ITResList87 = [ITRes86|ITResList86],
+
+
+ ?line {STRes216,S216} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP018.xsd','./msxsdtest/attribute',valid),
+ STResList217 = [STRes216|STResList216],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP018.xml','./msxsdtest/attribute',invalid,S216),
+ ITResList88 = [ITRes87|ITResList87],
+
+
+ ?line {STRes217,S217} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP019.xsd','./msxsdtest/attribute',valid),
+ STResList218 = [STRes217|STResList217],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP019.xml','./msxsdtest/attribute',valid,S217),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes218,S218} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP020.xsd','./msxsdtest/attribute',valid),
+ STResList219 = [STRes218|STResList218],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP020.xml','./msxsdtest/attribute',invalid,S218),
+ ITResList90 = [ITRes89|ITResList89],
+
+
+ ?line {STRes219,S219} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP021.xsd','./msxsdtest/attribute',valid),
+ STResList220 = [STRes219|STResList219],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP021.xml','./msxsdtest/attribute',valid,S219),
+ ITResList91 = [ITRes90|ITResList90],
+
+
+ ?line {STRes220,S220} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP022.xsd','./msxsdtest/attribute',valid),
+ STResList221 = [STRes220|STResList220],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP022.xml','./msxsdtest/attribute',valid,S220),
+ ITResList92 = [ITRes91|ITResList91],
+
+
+ ?line {STRes221,S221} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP023.xsd','./msxsdtest/attribute',valid),
+ STResList222 = [STRes221|STResList221],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP023.xml','./msxsdtest/attribute',valid,S221),
+ ITResList93 = [ITRes92|ITResList92],
+
+
+ ?line {STRes222,S222} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP024.xsd','./msxsdtest/attribute',valid),
+ STResList223 = [STRes222|STResList222],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP024.xml','./msxsdtest/attribute',valid,S222),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes223,S223} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP025.xsd','./msxsdtest/attribute',valid),
+ STResList224 = [STRes223|STResList223],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP025.xml','./msxsdtest/attribute',valid,S223),
+ ITResList95 = [ITRes94|ITResList94],
+
+
+ ?line {STRes224,S224} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP026.xsd','./msxsdtest/attribute',valid),
+ STResList225 = [STRes224|STResList224],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP026.xml','./msxsdtest/attribute',valid,S224),
+ ITResList96 = [ITRes95|ITResList95],
+
+
+ ?line {STRes225,S225} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP027.xsd','./msxsdtest/attribute',valid),
+ STResList226 = [STRes225|STResList225],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP027.xml','./msxsdtest/attribute',invalid,S225),
+ ITResList97 = [ITRes96|ITResList96],
+
+
+ ?line {STRes226,S226} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP028.xsd','./msxsdtest/attribute',valid),
+ STResList227 = [STRes226|STResList226],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP028.xml','./msxsdtest/attribute',valid,S226),
+ ITResList98 = [ITRes97|ITResList97],
+
+
+ ?line {STRes227,S227} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP029.xsd','./msxsdtest/attribute',valid),
+ STResList228 = [STRes227|STResList227],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP029.xml','./msxsdtest/attribute',valid,S227),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes228,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP030.xsd','./msxsdtest/attribute',invalid),
+ STResList229 = [STRes228|STResList228],
+
+
+ ?line {STRes229,S229} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP031.xsd','./msxsdtest/attribute',valid),
+ STResList230 = [STRes229|STResList229],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP031.xml','./msxsdtest/attribute',invalid,S229),
+ ITResList100 = [ITRes99|ITResList99],
+
+
+ ?line {STRes230,S230} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attP032.xsd','./msxsdtest/attribute',valid),
+ STResList231 = [STRes230|STResList230],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attP032.xml','./msxsdtest/attribute',valid,S230),
+ ITResList101 = [ITRes100|ITResList100],
+
+
+ ?line {STRes231,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attQ001.xsd','./msxsdtest/attribute',invalid),
+ STResList232 = [STRes231|STResList231],
+
+
+ ?line {STRes232,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attQ002.xsd','./msxsdtest/attribute',invalid),
+ STResList233 = [STRes232|STResList232],
+
+
+ ?line {STRes233,S233} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attQ003.xsd','./msxsdtest/attribute',valid),
+ STResList234 = [STRes233|STResList233],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attQ003.xml','./msxsdtest/attribute',valid,S233),
+ ITResList102 = [ITRes101|ITResList101],
+
+
+ ?line {STRes234,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attQ004.xsd','./msxsdtest/attribute',invalid),
+ STResList235 = [STRes234|STResList234],
+
+
+ ?line {STRes235,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attQ005.xsd','./msxsdtest/attribute',invalid),
+ STResList236 = [STRes235|STResList235],
+
+
+ ?line {STRes236,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attQ006.xsd','./msxsdtest/attribute',invalid),
+ STResList237 = [STRes236|STResList236],
+
+
+ ?line {STRes237,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attQ007.xsd','./msxsdtest/attribute',invalid),
+ STResList238 = [STRes237|STResList237],
+
+
+ ?line {STRes238,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attQ008.xsd','./msxsdtest/attribute',invalid),
+ STResList239 = [STRes238|STResList238],
+
+
+ ?line {STRes239,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attQ009.xsd','./msxsdtest/attribute',invalid),
+ STResList240 = [STRes239|STResList239],
+
+
+ ?line {STRes240,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attQ010.xsd','./msxsdtest/attribute',valid),
+ STResList241 = [STRes240|STResList240],
+
+
+ ?line {STRes241,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attQ011.xsd','./msxsdtest/attribute',invalid),
+ STResList242 = [STRes241|STResList241],
+
+
+ ?line {STRes242,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attQ012.xsd','./msxsdtest/attribute',invalid),
+ STResList243 = [STRes242|STResList242],
+
+
+ ?line {STRes243,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attQ013.xsd','./msxsdtest/attribute',invalid),
+ STResList244 = [STRes243|STResList243],
+
+
+ ?line {STRes244,S244} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attQ014.xsd','./msxsdtest/attribute',valid),
+ STResList245 = [STRes244|STResList244],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attQ014.xml','./msxsdtest/attribute',valid,S244),
+ ITResList103 = [ITRes102|ITResList102],
+
+
+ ?line {STRes245,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attQ015.xsd','./msxsdtest/attribute',invalid),
+ STResList246 = [STRes245|STResList245],
+
+
+ ?line {STRes246,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attQ016.xsd','./msxsdtest/attribute',invalid),
+ STResList247 = [STRes246|STResList246],
+
+
+ ?line {STRes247,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attQ017.xsd','./msxsdtest/attribute',invalid),
+ STResList248 = [STRes247|STResList247],
+
+
+ ?line {STRes248,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attQ018.xsd','./msxsdtest/attribute',invalid),
+ STResList249 = [STRes248|STResList248],
+
+
+ ?line {STRes249,S249} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attQ019.xsd','./msxsdtest/attribute',valid),
+ STResList250 = [STRes249|STResList249],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attQ019.xml','./msxsdtest/attribute',valid,S249),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes250,S250} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attZ001.xsd','./msxsdtest/attribute',valid),
+ STResList251 = [STRes250|STResList250],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attZ001.xml','./msxsdtest/attribute',invalid,S250),
+ ITResList105 = [ITRes104|ITResList104],
+
+
+ ?line {STRes251,S251} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attZ002.xsd','./msxsdtest/attribute',valid),
+ STResList252 = [STRes251|STResList251],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attZ002.xml','./msxsdtest/attribute',invalid,S251),
+ ITResList106 = [ITRes105|ITResList105],
+
+
+ ?line {STRes252,S252} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attribute/attZ003.xsd','./msxsdtest/attribute',valid),
+ STResList253 = [STRes252|STResList252],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attribute/attZ003.xml','./msxsdtest/attribute',invalid,S252),
+ ITResList107 = [ITRes106|ITResList106],
+
+
+ ?line {STRes253,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgA001.xsd','./msxsdtest/attributeGroup',valid),
+ STResList254 = [STRes253|STResList253],
+
+
+ ?line {STRes254,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgA002.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList255 = [STRes254|STResList254],
+
+
+ ?line {STRes255,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgA003.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList256 = [STRes255|STResList255],
+
+
+ ?line {STRes256,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgA004.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList257 = [STRes256|STResList256],
+
+
+ ?line {STRes257,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgA005.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList258 = [STRes257|STResList257],
+
+
+ ?line {STRes258,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgA006.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList259 = [STRes258|STResList258],
+
+
+ ?line {STRes259,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgA007.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList260 = [STRes259|STResList259],
+
+
+ ?line {STRes260,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgA008.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList261 = [STRes260|STResList260],
+
+
+ ?line {STRes261,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgA009.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList262 = [STRes261|STResList261],
+
+
+ ?line {STRes262,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgB001.xsd','./msxsdtest/attributeGroup',valid),
+ STResList263 = [STRes262|STResList262],
+
+
+ ?line {STRes263,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgB002.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList264 = [STRes263|STResList263],
+
+
+ ?line {STRes264,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgB003.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList265 = [STRes264|STResList264],
+
+
+ ?line {STRes265,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgB004.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList266 = [STRes265|STResList265],
+
+
+ ?line {STRes266,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgB005.xsd','./msxsdtest/attributeGroup',valid),
+ STResList267 = [STRes266|STResList266],
+
+
+ ?line {STRes267,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgB006.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList268 = [STRes267|STResList267],
+
+
+ ?line {STRes268,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgB007.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList269 = [STRes268|STResList268],
+
+
+ ?line {STRes269,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgB008.xsd','./msxsdtest/attributeGroup',valid),
+ STResList270 = [STRes269|STResList269],
+
+
+ ?line {STRes270,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgB009.xsd','./msxsdtest/attributeGroup',valid),
+ STResList271 = [STRes270|STResList270],
+
+
+ ?line {STRes271,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgB010.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList272 = [STRes271|STResList271],
+
+
+ ?line {STRes272,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgB011.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList273 = [STRes272|STResList272],
+
+
+ ?line {STRes273,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgB012.xsd','./msxsdtest/attributeGroup',valid),
+ STResList274 = [STRes273|STResList273],
+
+
+ ?line {STRes274,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgB013.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList275 = [STRes274|STResList274],
+
+
+ ?line {STRes275,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgB014.xsd','./msxsdtest/attributeGroup',valid),
+ STResList276 = [STRes275|STResList275],
+
+
+ ?line {STRes276,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgB015.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList277 = [STRes276|STResList276],
+
+
+ ?line {STRes277,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC001.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList278 = [STRes277|STResList277],
+
+
+ ?line {STRes278,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC002.xsd','./msxsdtest/attributeGroup',valid),
+ STResList279 = [STRes278|STResList278],
+
+
+ ?line {STRes279,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC003.xsd','./msxsdtest/attributeGroup',valid),
+ STResList280 = [STRes279|STResList279],
+
+
+ ?line {STRes280,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC004.xsd','./msxsdtest/attributeGroup',valid),
+ STResList281 = [STRes280|STResList280],
+
+
+ ?line {STRes281,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC005.xsd','./msxsdtest/attributeGroup',valid),
+ STResList282 = [STRes281|STResList281],
+
+
+ ?line {STRes282,S282} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC006.xsd','./msxsdtest/attributeGroup',valid),
+ STResList283 = [STRes282|STResList282],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgC006.xml','./msxsdtest/attributeGroup',invalid,S282),
+ ITResList108 = [ITRes107|ITResList107],
+
+
+ ?line {STRes283,S283} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC007.xsd','./msxsdtest/attributeGroup',valid),
+ STResList284 = [STRes283|STResList283],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgC007.xml','./msxsdtest/attributeGroup',valid,S283),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes284,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC008.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList285 = [STRes284|STResList284],
+
+
+ ?line {STRes285,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC009.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList286 = [STRes285|STResList285],
+
+
+ ?line {STRes286,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC010.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList287 = [STRes286|STResList286],
+
+
+ ?line {STRes287,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC011.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList288 = [STRes287|STResList287],
+
+
+ ?line {STRes288,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC012.xsd','./msxsdtest/attributeGroup',valid),
+ STResList289 = [STRes288|STResList288],
+
+
+ ?line {STRes289,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC013.xsd','./msxsdtest/attributeGroup',valid),
+ STResList290 = [STRes289|STResList289],
+
+
+ ?line {STRes290,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC014.xsd','./msxsdtest/attributeGroup',valid),
+ STResList291 = [STRes290|STResList290],
+
+
+ ?line {STRes291,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC015.xsd','./msxsdtest/attributeGroup',valid),
+ STResList292 = [STRes291|STResList291],
+
+
+ ?line {STRes292,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC016.xsd','./msxsdtest/attributeGroup',valid),
+ STResList293 = [STRes292|STResList292],
+
+
+ ?line {STRes293,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC017.xsd','./msxsdtest/attributeGroup',valid),
+ STResList294 = [STRes293|STResList293],
+
+
+ ?line {STRes294,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC018.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList295 = [STRes294|STResList294],
+
+
+ ?line {STRes295,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC019.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList296 = [STRes295|STResList295],
+
+
+ ?line {STRes296,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC020.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList297 = [STRes296|STResList296],
+
+
+ ?line {STRes297,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC021.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList298 = [STRes297|STResList297],
+
+
+ ?line {STRes298,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC022.xsd','./msxsdtest/attributeGroup',valid),
+ STResList299 = [STRes298|STResList298],
+
+
+ ?line {STRes299,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC023.xsd','./msxsdtest/attributeGroup',valid),
+ STResList300 = [STRes299|STResList299],
+
+
+ ?line {STRes300,S300} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC024.xsd','./msxsdtest/attributeGroup',valid),
+ STResList301 = [STRes300|STResList300],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgC024.xml','./msxsdtest/attributeGroup',valid,S300),
+ ITResList110 = [ITRes109|ITResList109],
+
+
+ ?line {STRes301,S301} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC025.xsd','./msxsdtest/attributeGroup',valid),
+ STResList302 = [STRes301|STResList301],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgC025.xml','./msxsdtest/attributeGroup',invalid,S301),
+ ITResList111 = [ITRes110|ITResList110],
+
+
+ ?line {STRes302,S302} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC026.xsd','./msxsdtest/attributeGroup',valid),
+ STResList303 = [STRes302|STResList302],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgC026.xml','./msxsdtest/attributeGroup',valid,S302),
+ ITResList112 = [ITRes111|ITResList111],
+
+
+ ?line {STRes303,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC027.xsd','./msxsdtest/attributeGroup',valid),
+ STResList304 = [STRes303|STResList303],
+
+
+ ?line {STRes304,S304} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC028.xsd','./msxsdtest/attributeGroup',valid),
+ STResList305 = [STRes304|STResList304],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgC028.xml','./msxsdtest/attributeGroup',invalid,S304),
+ ITResList113 = [ITRes112|ITResList112],
+
+
+ ?line {STRes305,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC029.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList306 = [STRes305|STResList305],
+
+
+ ?line {STRes306,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC030.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList307 = [STRes306|STResList306],
+
+
+ ?line {STRes307,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC031.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList308 = [STRes307|STResList307],
+
+
+ ?line {STRes308,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC032.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList309 = [STRes308|STResList308],
+
+
+ ?line {STRes309,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC033.xsd','./msxsdtest/attributeGroup',valid),
+ STResList310 = [STRes309|STResList309],
+
+
+ ?line {STRes310,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC034.xsd','./msxsdtest/attributeGroup',valid),
+ STResList311 = [STRes310|STResList310],
+
+
+ ?line {STRes311,S311} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC035.xsd','./msxsdtest/attributeGroup',valid),
+ STResList312 = [STRes311|STResList311],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgC035.xml','./msxsdtest/attributeGroup',valid,S311),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes312,S312} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC036.xsd','./msxsdtest/attributeGroup',valid),
+ STResList313 = [STRes312|STResList312],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgC036.xml','./msxsdtest/attributeGroup',valid,S312),
+ ITResList115 = [ITRes114|ITResList114],
+
+
+ ?line {STRes313,S313} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC037.xsd','./msxsdtest/attributeGroup',valid),
+ STResList314 = [STRes313|STResList313],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgC037.xml','./msxsdtest/attributeGroup',valid,S313),
+ ITResList116 = [ITRes115|ITResList115],
+
+
+ ?line {STRes314,S314} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC038.xsd','./msxsdtest/attributeGroup',valid),
+ STResList315 = [STRes314|STResList314],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgC038.xml','./msxsdtest/attributeGroup',valid,S314),
+ ITResList117 = [ITRes116|ITResList116],
+
+
+ ?line {STRes315,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC039.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList316 = [STRes315|STResList315],
+
+
+ ?line {STRes316,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC040.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList317 = [STRes316|STResList316],
+
+
+ ?line {STRes317,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC041.xsd','./msxsdtest/attributeGroup',valid),
+ STResList318 = [STRes317|STResList317],
+
+
+ ?line {STRes318,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC042.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList319 = [STRes318|STResList318],
+
+
+ ?line {STRes319,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC043.xsd','./msxsdtest/attributeGroup',valid),
+ STResList320 = [STRes319|STResList319],
+
+
+ ?line {STRes320,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC044.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList321 = [STRes320|STResList320],
+
+
+ ?line {STRes321,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgC045.xsd','./msxsdtest/attributeGroup',valid),
+ STResList322 = [STRes321|STResList321],
+
+
+ ?line {STRes322,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD001.xsd','./msxsdtest/attributeGroup',valid),
+ STResList323 = [STRes322|STResList322],
+
+
+ ?line {STRes323,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD002.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList324 = [STRes323|STResList323],
+
+
+ ?line {STRes324,S324} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD003.xsd','./msxsdtest/attributeGroup',valid),
+ STResList325 = [STRes324|STResList324],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgD003.xml','./msxsdtest/attributeGroup',valid,S324),
+ ITResList118 = [ITRes117|ITResList117],
+
+
+ ?line {STRes325,S325} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD004.xsd','./msxsdtest/attributeGroup',valid),
+ STResList326 = [STRes325|STResList325],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgD004.xml','./msxsdtest/attributeGroup',valid,S325),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes326,S326} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD005.xsd','./msxsdtest/attributeGroup',valid),
+ STResList327 = [STRes326|STResList326],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgD005.xml','./msxsdtest/attributeGroup',valid,S326),
+ ITResList120 = [ITRes119|ITResList119],
+
+
+ ?line {STRes327,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD006.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList328 = [STRes327|STResList327],
+
+
+ ?line {STRes328,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD007.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList329 = [STRes328|STResList328],
+
+
+ ?line {STRes329,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD008.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList330 = [STRes329|STResList329],
+
+
+ ?line {STRes330,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD009.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList331 = [STRes330|STResList330],
+
+
+ ?line {STRes331,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD010.xsd','./msxsdtest/attributeGroup',valid),
+ STResList332 = [STRes331|STResList331],
+
+
+ ?line {STRes332,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD011.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList333 = [STRes332|STResList332],
+
+
+ ?line {STRes333,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD012.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList334 = [STRes333|STResList333],
+
+
+ ?line {STRes334,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD013.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList335 = [STRes334|STResList334],
+
+
+ ?line {STRes335,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD014.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList336 = [STRes335|STResList335],
+
+
+ ?line {STRes336,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD015.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList337 = [STRes336|STResList336],
+
+
+ ?line {STRes337,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD016.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList338 = [STRes337|STResList337],
+
+
+ ?line {STRes338,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD017.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList339 = [STRes338|STResList338],
+
+
+ ?line {STRes339,S339} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD018.xsd','./msxsdtest/attributeGroup',valid),
+ STResList340 = [STRes339|STResList339],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgD018.xml','./msxsdtest/attributeGroup',valid,S339),
+ ITResList121 = [ITRes120|ITResList120],
+
+
+ ?line {STRes340,S340} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD019.xsd','./msxsdtest/attributeGroup',valid),
+ STResList341 = [STRes340|STResList340],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgD019.xml','./msxsdtest/attributeGroup',valid,S340),
+ ITResList122 = [ITRes121|ITResList121],
+
+
+ ?line {STRes341,S341} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD020.xsd','./msxsdtest/attributeGroup',valid),
+ STResList342 = [STRes341|STResList341],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgD020.xml','./msxsdtest/attributeGroup',valid,S341),
+ ITResList123 = [ITRes122|ITResList122],
+
+
+ ?line {STRes342,S342} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD021.xsd','./msxsdtest/attributeGroup',valid),
+ STResList343 = [STRes342|STResList342],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgD021.xml','./msxsdtest/attributeGroup',valid,S342),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes343,S343} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD022.xsd','./msxsdtest/attributeGroup',valid),
+ STResList344 = [STRes343|STResList343],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgD022.xml','./msxsdtest/attributeGroup',valid,S343),
+ ITResList125 = [ITRes124|ITResList124],
+
+
+ ?line {STRes344,S344} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD023.xsd','./msxsdtest/attributeGroup',valid),
+ STResList345 = [STRes344|STResList344],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgD023.xml','./msxsdtest/attributeGroup',invalid,S344),
+ ITResList126 = [ITRes125|ITResList125],
+
+
+ ?line {STRes345,S345} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD024.xsd','./msxsdtest/attributeGroup',valid),
+ STResList346 = [STRes345|STResList345],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgD024.xml','./msxsdtest/attributeGroup',invalid,S345),
+ ITResList127 = [ITRes126|ITResList126],
+
+
+ ?line {STRes346,S346} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD025.xsd','./msxsdtest/attributeGroup',valid),
+ STResList347 = [STRes346|STResList346],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgD025.xml','./msxsdtest/attributeGroup',valid,S346),
+ ITResList128 = [ITRes127|ITResList127],
+
+
+ ?line {STRes347,S347} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD026.xsd','./msxsdtest/attributeGroup',valid),
+ STResList348 = [STRes347|STResList347],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgD026.xml','./msxsdtest/attributeGroup',invalid,S347),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes348,S348} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD027.xsd','./msxsdtest/attributeGroup',valid),
+ STResList349 = [STRes348|STResList348],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgD027.xml','./msxsdtest/attributeGroup',valid,S348),
+ ITResList130 = [ITRes129|ITResList129],
+
+
+ ?line {STRes349,S349} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD028.xsd','./msxsdtest/attributeGroup',valid),
+ STResList350 = [STRes349|STResList349],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgD028.xml','./msxsdtest/attributeGroup',invalid,S349),
+ ITResList131 = [ITRes130|ITResList130],
+
+
+ ?line {STRes350,S350} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD029.xsd','./msxsdtest/attributeGroup',valid),
+ STResList351 = [STRes350|STResList350],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgD029.xml','./msxsdtest/attributeGroup',valid,S350),
+ ITResList132 = [ITRes131|ITResList131],
+
+
+ ?line {STRes351,S351} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD030.xsd','./msxsdtest/attributeGroup',valid),
+ STResList352 = [STRes351|STResList351],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgD030.xml','./msxsdtest/attributeGroup',invalid,S351),
+ ITResList133 = [ITRes132|ITResList132],
+
+
+ ?line {STRes352,S352} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD031.xsd','./msxsdtest/attributeGroup',valid),
+ STResList353 = [STRes352|STResList352],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgD031.xml','./msxsdtest/attributeGroup',valid,S352),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes353,S353} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD032.xsd','./msxsdtest/attributeGroup',valid),
+ STResList354 = [STRes353|STResList353],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgD032.xml','./msxsdtest/attributeGroup',valid,S353),
+ ITResList135 = [ITRes134|ITResList134],
+
+
+ ?line {STRes354,S354} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD033.xsd','./msxsdtest/attributeGroup',valid),
+ STResList355 = [STRes354|STResList354],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgD033.xml','./msxsdtest/attributeGroup',valid,S354),
+ ITResList136 = [ITRes135|ITResList135],
+
+
+ ?line {STRes355,S355} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD034.xsd','./msxsdtest/attributeGroup',valid),
+ STResList356 = [STRes355|STResList355],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgD034.xml','./msxsdtest/attributeGroup',valid,S355),
+ ITResList137 = [ITRes136|ITResList136],
+
+
+ ?line {STRes356,S356} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD035.xsd','./msxsdtest/attributeGroup',valid),
+ STResList357 = [STRes356|STResList356],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgD035.xml','./msxsdtest/attributeGroup',invalid,S356),
+ ITResList138 = [ITRes137|ITResList137],
+
+
+ ?line {STRes357,S357} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD036.xsd','./msxsdtest/attributeGroup',valid),
+ STResList358 = [STRes357|STResList357],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgD036.xml','./msxsdtest/attributeGroup',valid,S357),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ ?line {STRes358,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD037.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList359 = [STRes358|STResList358],
+
+
+ ?line {STRes359,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD038.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList360 = [STRes359|STResList359],
+
+
+ ?line {STRes360,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD039.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList361 = [STRes360|STResList360],
+
+
+ ?line {STRes361,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD040.xsd','./msxsdtest/attributeGroup',valid),
+ STResList362 = [STRes361|STResList361],
+
+
+ ?line {STRes362,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD041.xsd','./msxsdtest/attributeGroup',invalid),
+ STResList363 = [STRes362|STResList362],
+
+
+ ?line {STRes363,S363} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/attributeGroup/attgD042.xsd','./msxsdtest/attributeGroup',valid),
+ STResList364 = [STRes363|STResList363],
+ ?line ITRes139 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/attributeGroup/attgD042.xml','./msxsdtest/attributeGroup',invalid,S363),
+ ITResList140 = [ITRes139|ITResList139],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList364,ITResList140).
+
+%% Syntax Checking for top level complexType Declaration.
+%% Syntax Checking for simpleContent complexType Declaration.
+%% Syntax Checking for comlexContent complexType Declaration
+%% complexType Validation checking
+%% complexType Schema Component Constraints
+
+ct(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA001.xsd','./msxsdtest/complexType',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA001.xml','./msxsdtest/complexType',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA002.xsd','./msxsdtest/complexType',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA002.xml','./msxsdtest/complexType',valid,S1),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA003.xsd','./msxsdtest/complexType',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA003.xml','./msxsdtest/complexType',valid,S2),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ ?line {STRes3,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA004.xsd','./msxsdtest/complexType',invalid),
+ STResList4 = [STRes3|STResList3],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA005.xsd','./msxsdtest/complexType',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA005.xml','./msxsdtest/complexType',valid,S4),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ ?line {STRes5,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA006.xsd','./msxsdtest/complexType',invalid),
+ STResList6 = [STRes5|STResList5],
+
+
+ ?line {STRes6,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA007.xsd','./msxsdtest/complexType',invalid),
+ STResList7 = [STRes6|STResList6],
+
+
+ ?line {STRes7,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA008.xsd','./msxsdtest/complexType',invalid),
+ STResList8 = [STRes7|STResList7],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA009.xsd','./msxsdtest/complexType',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA009.xml','./msxsdtest/complexType',valid,S8),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA010.xsd','./msxsdtest/complexType',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA010.xml','./msxsdtest/complexType',valid,S9),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA011.xsd','./msxsdtest/complexType',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA011.xml','./msxsdtest/complexType',valid,S10),
+ ITResList7 = [ITRes6|ITResList6],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA012.xsd','./msxsdtest/complexType',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA012.xml','./msxsdtest/complexType',valid,S11),
+ ITResList8 = [ITRes7|ITResList7],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA013.xsd','./msxsdtest/complexType',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA013.xml','./msxsdtest/complexType',valid,S12),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ ?line {STRes13,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA014.xsd','./msxsdtest/complexType',invalid),
+ STResList14 = [STRes13|STResList13],
+
+
+ ?line {STRes14,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA015.xsd','./msxsdtest/complexType',invalid),
+ STResList15 = [STRes14|STResList14],
+
+
+ ?line {STRes15,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA016.xsd','./msxsdtest/complexType',invalid),
+ STResList16 = [STRes15|STResList15],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA017.xsd','./msxsdtest/complexType',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA017.xml','./msxsdtest/complexType',valid,S16),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA018.xsd','./msxsdtest/complexType',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA018.xml','./msxsdtest/complexType',valid,S17),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA019.xsd','./msxsdtest/complexType',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA019.xml','./msxsdtest/complexType',valid,S18),
+ ITResList12 = [ITRes11|ITResList11],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA020.xsd','./msxsdtest/complexType',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA020.xml','./msxsdtest/complexType',valid,S19),
+ ITResList13 = [ITRes12|ITResList12],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA021.xsd','./msxsdtest/complexType',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA021.xml','./msxsdtest/complexType',valid,S20),
+ ITResList14 = [ITRes13|ITResList13],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA022.xsd','./msxsdtest/complexType',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA022.xml','./msxsdtest/complexType',valid,S21),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes22,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA023.xsd','./msxsdtest/complexType',invalid),
+ STResList23 = [STRes22|STResList22],
+
+
+ ?line {STRes23,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA024.xsd','./msxsdtest/complexType',invalid),
+ STResList24 = [STRes23|STResList23],
+
+
+ ?line {STRes24,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA025.xsd','./msxsdtest/complexType',invalid),
+ STResList25 = [STRes24|STResList24],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA026.xsd','./msxsdtest/complexType',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA026.xml','./msxsdtest/complexType',valid,S25),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA027.xsd','./msxsdtest/complexType',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA027.xml','./msxsdtest/complexType',valid,S26),
+ ITResList17 = [ITRes16|ITResList16],
+
+
+ ?line {STRes27,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA028.xsd','./msxsdtest/complexType',invalid),
+ STResList28 = [STRes27|STResList27],
+
+
+ ?line {STRes28,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA029.xsd','./msxsdtest/complexType',invalid),
+ STResList29 = [STRes28|STResList28],
+
+
+ ?line {STRes29,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA030.xsd','./msxsdtest/complexType',invalid),
+ STResList30 = [STRes29|STResList29],
+
+
+ ?line {STRes30,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA031.xsd','./msxsdtest/complexType',invalid),
+ STResList31 = [STRes30|STResList30],
+
+
+ ?line {STRes31,S31} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA032.xsd','./msxsdtest/complexType',valid),
+ STResList32 = [STRes31|STResList31],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA032.xml','./msxsdtest/complexType',valid,S31),
+ ITResList18 = [ITRes17|ITResList17],
+
+
+ ?line {STRes32,S32} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA033.xsd','./msxsdtest/complexType',valid),
+ STResList33 = [STRes32|STResList32],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA033.xml','./msxsdtest/complexType',valid,S32),
+ ITResList19 = [ITRes18|ITResList18],
+
+
+ ?line {STRes33,S33} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA034.xsd','./msxsdtest/complexType',valid),
+ STResList34 = [STRes33|STResList33],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA034.xml','./msxsdtest/complexType',valid,S33),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes34,S34} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA035.xsd','./msxsdtest/complexType',valid),
+ STResList35 = [STRes34|STResList34],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA035.xml','./msxsdtest/complexType',valid,S34),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes35,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA036.xsd','./msxsdtest/complexType',invalid),
+ STResList36 = [STRes35|STResList35],
+
+
+ ?line {STRes36,S36} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA037.xsd','./msxsdtest/complexType',valid),
+ STResList37 = [STRes36|STResList36],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA037.xml','./msxsdtest/complexType',valid,S36),
+ ITResList22 = [ITRes21|ITResList21],
+
+
+ ?line {STRes37,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA038.xsd','./msxsdtest/complexType',invalid),
+ STResList38 = [STRes37|STResList37],
+
+
+ ?line {STRes38,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA039.xsd','./msxsdtest/complexType',invalid),
+ STResList39 = [STRes38|STResList38],
+
+
+ ?line {STRes39,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA040.xsd','./msxsdtest/complexType',invalid),
+ STResList40 = [STRes39|STResList39],
+
+
+ ?line {STRes40,S40} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA041.xsd','./msxsdtest/complexType',valid),
+ STResList41 = [STRes40|STResList40],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA041.xml','./msxsdtest/complexType',valid,S40),
+ ITResList23 = [ITRes22|ITResList22],
+
+
+ ?line {STRes41,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA042.xsd','./msxsdtest/complexType',invalid),
+ STResList42 = [STRes41|STResList41],
+
+
+ ?line {STRes42,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA043.xsd','./msxsdtest/complexType',invalid),
+ STResList43 = [STRes42|STResList42],
+
+
+ ?line {STRes43,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA044.xsd','./msxsdtest/complexType',invalid),
+ STResList44 = [STRes43|STResList43],
+
+
+ ?line {STRes44,S44} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA045.xsd','./msxsdtest/complexType',valid),
+ STResList45 = [STRes44|STResList44],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA045.xml','./msxsdtest/complexType',valid,S44),
+ ITResList24 = [ITRes23|ITResList23],
+
+
+ ?line {STRes45,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA046.xsd','./msxsdtest/complexType',invalid),
+ STResList46 = [STRes45|STResList45],
+
+
+ ?line {STRes46,S46} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA047.xsd','./msxsdtest/complexType',valid),
+ STResList47 = [STRes46|STResList46],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA047.xml','./msxsdtest/complexType',valid,S46),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ ?line {STRes47,S47} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA048.xsd','./msxsdtest/complexType',valid),
+ STResList48 = [STRes47|STResList47],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA048.xml','./msxsdtest/complexType',valid,S47),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes48,S48} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctA049.xsd','./msxsdtest/complexType',valid),
+ STResList49 = [STRes48|STResList48],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctA049.xml','./msxsdtest/complexType',valid,S48),
+ ITResList27 = [ITRes26|ITResList26],
+
+
+ ?line {STRes49,S49} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB001.xsd','./msxsdtest/complexType',valid),
+ STResList50 = [STRes49|STResList49],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB001.xml','./msxsdtest/complexType',valid,S49),
+ ITResList28 = [ITRes27|ITResList27],
+
+
+ ?line {STRes50,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB002.xsd','./msxsdtest/complexType',invalid),
+ STResList51 = [STRes50|STResList50],
+
+
+ ?line {STRes51,S51} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB003.xsd','./msxsdtest/complexType',valid),
+ STResList52 = [STRes51|STResList51],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB003.xml','./msxsdtest/complexType',valid,S51),
+ ITResList29 = [ITRes28|ITResList28],
+
+
+ ?line {STRes52,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB004.xsd','./msxsdtest/complexType',invalid),
+ STResList53 = [STRes52|STResList52],
+
+
+ ?line {STRes53,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB005.xsd','./msxsdtest/complexType',invalid),
+ STResList54 = [STRes53|STResList53],
+
+
+ ?line {STRes54,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB006.xsd','./msxsdtest/complexType',invalid),
+ STResList55 = [STRes54|STResList54],
+
+
+ ?line {STRes55,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB007.xsd','./msxsdtest/complexType',invalid),
+ STResList56 = [STRes55|STResList55],
+
+
+ ?line {STRes56,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB008.xsd','./msxsdtest/complexType',invalid),
+ STResList57 = [STRes56|STResList56],
+
+
+ ?line {STRes57,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB009.xsd','./msxsdtest/complexType',invalid),
+ STResList58 = [STRes57|STResList57],
+
+
+ ?line {STRes58,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB010.xsd','./msxsdtest/complexType',invalid),
+ STResList59 = [STRes58|STResList58],
+
+
+ ?line {STRes59,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB011.xsd','./msxsdtest/complexType',invalid),
+ STResList60 = [STRes59|STResList59],
+
+
+ ?line {STRes60,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB012.xsd','./msxsdtest/complexType',invalid),
+ STResList61 = [STRes60|STResList60],
+
+
+ ?line {STRes61,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB013.xsd','./msxsdtest/complexType',invalid),
+ STResList62 = [STRes61|STResList61],
+
+
+ ?line {STRes62,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB014.xsd','./msxsdtest/complexType',invalid),
+ STResList63 = [STRes62|STResList62],
+
+
+ ?line {STRes63,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB015.xsd','./msxsdtest/complexType',invalid),
+ STResList64 = [STRes63|STResList63],
+
+
+ ?line {STRes64,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB016.xsd','./msxsdtest/complexType',invalid),
+ STResList65 = [STRes64|STResList64],
+
+
+ ?line {STRes65,S65} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB017.xsd','./msxsdtest/complexType',valid),
+ STResList66 = [STRes65|STResList65],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB017.xml','./msxsdtest/complexType',valid,S65),
+ ITResList30 = [ITRes29|ITResList29],
+
+
+ ?line {STRes66,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB018.xsd','./msxsdtest/complexType',invalid),
+ STResList67 = [STRes66|STResList66],
+
+
+ ?line {STRes67,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB019.xsd','./msxsdtest/complexType',invalid),
+ STResList68 = [STRes67|STResList67],
+
+
+ ?line {STRes68,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB020.xsd','./msxsdtest/complexType',invalid),
+ STResList69 = [STRes68|STResList68],
+
+
+ ?line {STRes69,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB021.xsd','./msxsdtest/complexType',invalid),
+ STResList70 = [STRes69|STResList69],
+
+
+ ?line {STRes70,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB022.xsd','./msxsdtest/complexType',invalid),
+ STResList71 = [STRes70|STResList70],
+
+
+ ?line {STRes71,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB023.xsd','./msxsdtest/complexType',invalid),
+ STResList72 = [STRes71|STResList71],
+
+
+ ?line {STRes72,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB024.xsd','./msxsdtest/complexType',invalid),
+ STResList73 = [STRes72|STResList72],
+
+
+ ?line {STRes73,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB025.xsd','./msxsdtest/complexType',invalid),
+ STResList74 = [STRes73|STResList73],
+
+
+ ?line {STRes74,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB026.xsd','./msxsdtest/complexType',invalid),
+ STResList75 = [STRes74|STResList74],
+
+
+ ?line {STRes75,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB027.xsd','./msxsdtest/complexType',invalid),
+ STResList76 = [STRes75|STResList75],
+
+
+ ?line {STRes76,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB028.xsd','./msxsdtest/complexType',invalid),
+ STResList77 = [STRes76|STResList76],
+
+
+ ?line {STRes77,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB029.xsd','./msxsdtest/complexType',invalid),
+ STResList78 = [STRes77|STResList77],
+
+
+ ?line {STRes78,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB030.xsd','./msxsdtest/complexType',invalid),
+ STResList79 = [STRes78|STResList78],
+
+
+ ?line {STRes79,S79} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB031.xsd','./msxsdtest/complexType',valid),
+ STResList80 = [STRes79|STResList79],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB031.xml','./msxsdtest/complexType',valid,S79),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes80,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB032.xsd','./msxsdtest/complexType',invalid),
+ STResList81 = [STRes80|STResList80],
+
+
+ ?line {STRes81,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB033.xsd','./msxsdtest/complexType',invalid),
+ STResList82 = [STRes81|STResList81],
+
+
+ ?line {STRes82,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB034.xsd','./msxsdtest/complexType',invalid),
+ STResList83 = [STRes82|STResList82],
+
+
+ ?line {STRes83,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB035.xsd','./msxsdtest/complexType',invalid),
+ STResList84 = [STRes83|STResList83],
+
+
+ ?line {STRes84,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB036.xsd','./msxsdtest/complexType',invalid),
+ STResList85 = [STRes84|STResList84],
+
+
+ ?line {STRes85,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB037.xsd','./msxsdtest/complexType',invalid),
+ STResList86 = [STRes85|STResList85],
+
+
+ ?line {STRes86,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB038.xsd','./msxsdtest/complexType',invalid),
+ STResList87 = [STRes86|STResList86],
+
+
+ ?line {STRes87,S87} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB039.xsd','./msxsdtest/complexType',valid),
+ STResList88 = [STRes87|STResList87],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB039.xml','./msxsdtest/complexType',valid,S87),
+ ITResList32 = [ITRes31|ITResList31],
+
+
+ ?line {STRes88,S88} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB040.xsd','./msxsdtest/complexType',valid),
+ STResList89 = [STRes88|STResList88],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB040.xml','./msxsdtest/complexType',valid,S88),
+ ITResList33 = [ITRes32|ITResList32],
+
+
+ ?line {STRes89,S89} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB041.xsd','./msxsdtest/complexType',valid),
+ STResList90 = [STRes89|STResList89],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB041.xml','./msxsdtest/complexType',valid,S89),
+ ITResList34 = [ITRes33|ITResList33],
+
+
+ ?line {STRes90,S90} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB042.xsd','./msxsdtest/complexType',valid),
+ STResList91 = [STRes90|STResList90],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB042.xml','./msxsdtest/complexType',valid,S90),
+ ITResList35 = [ITRes34|ITResList34],
+
+
+ ?line {STRes91,S91} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB043.xsd','./msxsdtest/complexType',valid),
+ STResList92 = [STRes91|STResList91],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB043.xml','./msxsdtest/complexType',valid,S91),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes92,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB044.xsd','./msxsdtest/complexType',invalid),
+ STResList93 = [STRes92|STResList92],
+
+
+ ?line {STRes93,S93} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB045.xsd','./msxsdtest/complexType',valid),
+ STResList94 = [STRes93|STResList93],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB045.xml','./msxsdtest/complexType',valid,S93),
+ ITResList37 = [ITRes36|ITResList36],
+
+
+ ?line {STRes94,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB046.xsd','./msxsdtest/complexType',invalid),
+ STResList95 = [STRes94|STResList94],
+
+
+ ?line {STRes95,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB047.xsd','./msxsdtest/complexType',invalid),
+ STResList96 = [STRes95|STResList95],
+
+
+ ?line {STRes96,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB048.xsd','./msxsdtest/complexType',invalid),
+ STResList97 = [STRes96|STResList96],
+
+
+ ?line {STRes97,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB049.xsd','./msxsdtest/complexType',invalid),
+ STResList98 = [STRes97|STResList97],
+
+
+ ?line {STRes98,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB050.xsd','./msxsdtest/complexType',invalid),
+ STResList99 = [STRes98|STResList98],
+
+
+ ?line {STRes99,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB051.xsd','./msxsdtest/complexType',invalid),
+ STResList100 = [STRes99|STResList99],
+
+
+ ?line {STRes100,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB052.xsd','./msxsdtest/complexType',invalid),
+ STResList101 = [STRes100|STResList100],
+
+
+ ?line {STRes101,S101} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB053.xsd','./msxsdtest/complexType',valid),
+ STResList102 = [STRes101|STResList101],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB053.xml','./msxsdtest/complexType',valid,S101),
+ ITResList38 = [ITRes37|ITResList37],
+
+
+ ?line {STRes102,S102} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB054.xsd','./msxsdtest/complexType',valid),
+ STResList103 = [STRes102|STResList102],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB054.xml','./msxsdtest/complexType',valid,S102),
+ ITResList39 = [ITRes38|ITResList38],
+
+
+ ?line {STRes103,S103} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB055.xsd','./msxsdtest/complexType',valid),
+ STResList104 = [STRes103|STResList103],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB055.xml','./msxsdtest/complexType',valid,S103),
+ ITResList40 = [ITRes39|ITResList39],
+
+
+ ?line {STRes104,S104} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB056.xsd','./msxsdtest/complexType',valid),
+ STResList105 = [STRes104|STResList104],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB056.xml','./msxsdtest/complexType',valid,S104),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes105,S105} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB057.xsd','./msxsdtest/complexType',valid),
+ STResList106 = [STRes105|STResList105],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB057.xml','./msxsdtest/complexType',valid,S105),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes106,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB058.xsd','./msxsdtest/complexType',invalid),
+ STResList107 = [STRes106|STResList106],
+
+
+ ?line {STRes107,S107} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB059.xsd','./msxsdtest/complexType',valid),
+ STResList108 = [STRes107|STResList107],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB059.xml','./msxsdtest/complexType',valid,S107),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes108,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB060.xsd','./msxsdtest/complexType',invalid),
+ STResList109 = [STRes108|STResList108],
+
+
+ ?line {STRes109,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB061.xsd','./msxsdtest/complexType',invalid),
+ STResList110 = [STRes109|STResList109],
+
+
+ ?line {STRes110,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB062.xsd','./msxsdtest/complexType',invalid),
+ STResList111 = [STRes110|STResList110],
+
+
+ ?line {STRes111,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB063.xsd','./msxsdtest/complexType',invalid),
+ STResList112 = [STRes111|STResList111],
+
+
+ ?line {STRes112,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB064.xsd','./msxsdtest/complexType',invalid),
+ STResList113 = [STRes112|STResList112],
+
+
+ ?line {STRes113,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB065.xsd','./msxsdtest/complexType',invalid),
+ STResList114 = [STRes113|STResList113],
+
+
+ ?line {STRes114,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB066.xsd','./msxsdtest/complexType',invalid),
+ STResList115 = [STRes114|STResList114],
+
+
+ ?line {STRes115,S115} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB067.xsd','./msxsdtest/complexType',valid),
+ STResList116 = [STRes115|STResList115],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB067.xml','./msxsdtest/complexType',valid,S115),
+ ITResList44 = [ITRes43|ITResList43],
+
+
+ ?line {STRes116,S116} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB068.xsd','./msxsdtest/complexType',valid),
+ STResList117 = [STRes116|STResList116],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB068.xml','./msxsdtest/complexType',valid,S116),
+ ITResList45 = [ITRes44|ITResList44],
+
+
+ ?line {STRes117,S117} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB069.xsd','./msxsdtest/complexType',valid),
+ STResList118 = [STRes117|STResList117],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB069.xml','./msxsdtest/complexType',valid,S117),
+ ITResList46 = [ITRes45|ITResList45],
+
+
+ ?line {STRes118,S118} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB070.xsd','./msxsdtest/complexType',valid),
+ STResList119 = [STRes118|STResList118],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB070.xml','./msxsdtest/complexType',valid,S118),
+ ITResList47 = [ITRes46|ITResList46],
+
+
+ ?line {STRes119,S119} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB071.xsd','./msxsdtest/complexType',valid),
+ STResList120 = [STRes119|STResList119],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB071.xml','./msxsdtest/complexType',valid,S119),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes120,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB072.xsd','./msxsdtest/complexType',invalid),
+ STResList121 = [STRes120|STResList120],
+
+
+ ?line {STRes121,S121} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB073.xsd','./msxsdtest/complexType',valid),
+ STResList122 = [STRes121|STResList121],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB073.xml','./msxsdtest/complexType',valid,S121),
+ ITResList49 = [ITRes48|ITResList48],
+
+
+ ?line {STRes122,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB074.xsd','./msxsdtest/complexType',invalid),
+ STResList123 = [STRes122|STResList122],
+
+
+ ?line {STRes123,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB075.xsd','./msxsdtest/complexType',invalid),
+ STResList124 = [STRes123|STResList123],
+
+
+ ?line {STRes124,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB076.xsd','./msxsdtest/complexType',invalid),
+ STResList125 = [STRes124|STResList124],
+
+
+ ?line {STRes125,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB077.xsd','./msxsdtest/complexType',invalid),
+ STResList126 = [STRes125|STResList125],
+
+
+ ?line {STRes126,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB078.xsd','./msxsdtest/complexType',invalid),
+ STResList127 = [STRes126|STResList126],
+
+
+ ?line {STRes127,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB079.xsd','./msxsdtest/complexType',invalid),
+ STResList128 = [STRes127|STResList127],
+
+
+ ?line {STRes128,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB080.xsd','./msxsdtest/complexType',invalid),
+ STResList129 = [STRes128|STResList128],
+
+
+ ?line {STRes129,S129} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB081.xsd','./msxsdtest/complexType',valid),
+ STResList130 = [STRes129|STResList129],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB081.xml','./msxsdtest/complexType',valid,S129),
+ ITResList50 = [ITRes49|ITResList49],
+
+
+ ?line {STRes130,S130} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB082.xsd','./msxsdtest/complexType',valid),
+ STResList131 = [STRes130|STResList130],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB082.xml','./msxsdtest/complexType',valid,S130),
+ ITResList51 = [ITRes50|ITResList50],
+
+
+ ?line {STRes131,S131} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB083.xsd','./msxsdtest/complexType',valid),
+ STResList132 = [STRes131|STResList131],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB083.xml','./msxsdtest/complexType',valid,S131),
+ ITResList52 = [ITRes51|ITResList51],
+
+
+ ?line {STRes132,S132} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB084.xsd','./msxsdtest/complexType',valid),
+ STResList133 = [STRes132|STResList132],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB084.xml','./msxsdtest/complexType',valid,S132),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes133,S133} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB085.xsd','./msxsdtest/complexType',valid),
+ STResList134 = [STRes133|STResList133],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB085.xml','./msxsdtest/complexType',valid,S133),
+ ITResList54 = [ITRes53|ITResList53],
+
+
+ ?line {STRes134,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB086.xsd','./msxsdtest/complexType',invalid),
+ STResList135 = [STRes134|STResList134],
+
+
+ ?line {STRes135,S135} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB087.xsd','./msxsdtest/complexType',valid),
+ STResList136 = [STRes135|STResList135],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB087.xml','./msxsdtest/complexType',valid,S135),
+ ITResList55 = [ITRes54|ITResList54],
+
+
+ ?line {STRes136,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB088.xsd','./msxsdtest/complexType',invalid),
+ STResList137 = [STRes136|STResList136],
+
+
+ ?line {STRes137,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB089.xsd','./msxsdtest/complexType',invalid),
+ STResList138 = [STRes137|STResList137],
+
+
+ ?line {STRes138,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB090.xsd','./msxsdtest/complexType',invalid),
+ STResList139 = [STRes138|STResList138],
+
+
+ ?line {STRes139,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB091.xsd','./msxsdtest/complexType',invalid),
+ STResList140 = [STRes139|STResList139],
+
+
+ ?line {STRes140,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB092.xsd','./msxsdtest/complexType',invalid),
+ STResList141 = [STRes140|STResList140],
+
+
+ ?line {STRes141,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB093.xsd','./msxsdtest/complexType',invalid),
+ STResList142 = [STRes141|STResList141],
+
+
+ ?line {STRes142,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB094.xsd','./msxsdtest/complexType',invalid),
+ STResList143 = [STRes142|STResList142],
+
+
+ ?line {STRes143,S143} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB095.xsd','./msxsdtest/complexType',valid),
+ STResList144 = [STRes143|STResList143],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB095.xml','./msxsdtest/complexType',valid,S143),
+ ITResList56 = [ITRes55|ITResList55],
+
+
+ ?line {STRes144,S144} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB096.xsd','./msxsdtest/complexType',valid),
+ STResList145 = [STRes144|STResList144],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB096.xml','./msxsdtest/complexType',valid,S144),
+ ITResList57 = [ITRes56|ITResList56],
+
+
+ ?line {STRes145,S145} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB097.xsd','./msxsdtest/complexType',valid),
+ STResList146 = [STRes145|STResList145],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB097.xml','./msxsdtest/complexType',valid,S145),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes146,S146} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB098.xsd','./msxsdtest/complexType',valid),
+ STResList147 = [STRes146|STResList146],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB098.xml','./msxsdtest/complexType',valid,S146),
+ ITResList59 = [ITRes58|ITResList58],
+
+
+ ?line {STRes147,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB099.xsd','./msxsdtest/complexType',invalid),
+ STResList148 = [STRes147|STResList147],
+
+
+ ?line {STRes148,S148} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB100.xsd','./msxsdtest/complexType',valid),
+ STResList149 = [STRes148|STResList148],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB100.xml','./msxsdtest/complexType',valid,S148),
+ ITResList60 = [ITRes59|ITResList59],
+
+
+ ?line {STRes149,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB101.xsd','./msxsdtest/complexType',invalid),
+ STResList150 = [STRes149|STResList149],
+
+
+ ?line {STRes150,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB102.xsd','./msxsdtest/complexType',invalid),
+ STResList151 = [STRes150|STResList150],
+
+
+ ?line {STRes151,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB103.xsd','./msxsdtest/complexType',invalid),
+ STResList152 = [STRes151|STResList151],
+
+
+ ?line {STRes152,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB104.xsd','./msxsdtest/complexType',invalid),
+ STResList153 = [STRes152|STResList152],
+
+
+ ?line {STRes153,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB105.xsd','./msxsdtest/complexType',invalid),
+ STResList154 = [STRes153|STResList153],
+
+
+ ?line {STRes154,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB106.xsd','./msxsdtest/complexType',invalid),
+ STResList155 = [STRes154|STResList154],
+
+
+ ?line {STRes155,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB107.xsd','./msxsdtest/complexType',invalid),
+ STResList156 = [STRes155|STResList155],
+
+
+ ?line {STRes156,S156} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB108.xsd','./msxsdtest/complexType',valid),
+ STResList157 = [STRes156|STResList156],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB108.xml','./msxsdtest/complexType',valid,S156),
+ ITResList61 = [ITRes60|ITResList60],
+
+
+ ?line {STRes157,S157} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB109.xsd','./msxsdtest/complexType',valid),
+ STResList158 = [STRes157|STResList157],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB109.xml','./msxsdtest/complexType',valid,S157),
+ ITResList62 = [ITRes61|ITResList61],
+
+
+ ?line {STRes158,S158} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB110.xsd','./msxsdtest/complexType',valid),
+ STResList159 = [STRes158|STResList158],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB110.xml','./msxsdtest/complexType',valid,S158),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes159,S159} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB111.xsd','./msxsdtest/complexType',valid),
+ STResList160 = [STRes159|STResList159],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB111.xml','./msxsdtest/complexType',valid,S159),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes160,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB112.xsd','./msxsdtest/complexType',invalid),
+ STResList161 = [STRes160|STResList160],
+
+
+ ?line {STRes161,S161} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB113.xsd','./msxsdtest/complexType',valid),
+ STResList162 = [STRes161|STResList161],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctB113.xml','./msxsdtest/complexType',valid,S161),
+ ITResList65 = [ITRes64|ITResList64],
+
+
+ ?line {STRes162,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB114.xsd','./msxsdtest/complexType',invalid),
+ STResList163 = [STRes162|STResList162],
+
+
+ ?line {STRes163,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB115.xsd','./msxsdtest/complexType',invalid),
+ STResList164 = [STRes163|STResList163],
+
+
+ ?line {STRes164,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB116.xsd','./msxsdtest/complexType',invalid),
+ STResList165 = [STRes164|STResList164],
+
+
+ ?line {STRes165,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB117.xsd','./msxsdtest/complexType',invalid),
+ STResList166 = [STRes165|STResList165],
+
+
+ ?line {STRes166,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB118.xsd','./msxsdtest/complexType',invalid),
+ STResList167 = [STRes166|STResList166],
+
+
+ ?line {STRes167,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB119.xsd','./msxsdtest/complexType',invalid),
+ STResList168 = [STRes167|STResList167],
+
+
+ ?line {STRes168,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB120.xsd','./msxsdtest/complexType',invalid),
+ STResList169 = [STRes168|STResList168],
+
+
+ ?line {STRes169,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB121.xsd','./msxsdtest/complexType',invalid),
+ STResList170 = [STRes169|STResList169],
+
+
+ ?line {STRes170,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB122.xsd','./msxsdtest/complexType',invalid),
+ STResList171 = [STRes170|STResList170],
+
+
+ ?line {STRes171,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB123.xsd','./msxsdtest/complexType',invalid),
+ STResList172 = [STRes171|STResList171],
+
+
+ ?line {STRes172,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB124.xsd','./msxsdtest/complexType',invalid),
+ STResList173 = [STRes172|STResList172],
+
+
+ ?line {STRes173,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctB125.xsd','./msxsdtest/complexType',invalid),
+ STResList174 = [STRes173|STResList173],
+
+
+ ?line {STRes174,S174} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctC001.xsd','./msxsdtest/complexType',valid),
+ STResList175 = [STRes174|STResList174],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctC001.xml','./msxsdtest/complexType',valid,S174),
+ ITResList66 = [ITRes65|ITResList65],
+
+
+ ?line {STRes175,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctC002.xsd','./msxsdtest/complexType',invalid),
+ STResList176 = [STRes175|STResList175],
+
+
+ ?line {STRes176,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctC003.xsd','./msxsdtest/complexType',invalid),
+ STResList177 = [STRes176|STResList176],
+
+
+ ?line {STRes177,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctC004.xsd','./msxsdtest/complexType',invalid),
+ STResList178 = [STRes177|STResList177],
+
+
+ ?line {STRes178,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctC005.xsd','./msxsdtest/complexType',invalid),
+ STResList179 = [STRes178|STResList178],
+
+
+ ?line {STRes179,S179} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctC006.xsd','./msxsdtest/complexType',valid),
+ STResList180 = [STRes179|STResList179],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctC006.xml','./msxsdtest/complexType',valid,S179),
+ ITResList67 = [ITRes66|ITResList66],
+
+
+ ?line {STRes180,S180} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctC007.xsd','./msxsdtest/complexType',valid),
+ STResList181 = [STRes180|STResList180],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctC007.xml','./msxsdtest/complexType',valid,S180),
+ ITResList68 = [ITRes67|ITResList67],
+
+
+ ?line {STRes181,S181} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctC008.xsd','./msxsdtest/complexType',valid),
+ STResList182 = [STRes181|STResList181],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctC008.xml','./msxsdtest/complexType',valid,S181),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes182,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctC009.xsd','./msxsdtest/complexType',invalid),
+ STResList183 = [STRes182|STResList182],
+
+
+ ?line {STRes183,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctC010.xsd','./msxsdtest/complexType',invalid),
+ STResList184 = [STRes183|STResList183],
+
+
+ ?line {STRes184,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctC011.xsd','./msxsdtest/complexType',invalid),
+ STResList185 = [STRes184|STResList184],
+
+
+ ?line {STRes185,S185} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctC012.xsd','./msxsdtest/complexType',valid),
+ STResList186 = [STRes185|STResList185],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctC012.xml','./msxsdtest/complexType',valid,S185),
+ ITResList70 = [ITRes69|ITResList69],
+
+
+ ?line {STRes186,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD001.xsd','./msxsdtest/complexType',invalid),
+ STResList187 = [STRes186|STResList186],
+
+
+ ?line {STRes187,S187} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD002.xsd','./msxsdtest/complexType',valid),
+ STResList188 = [STRes187|STResList187],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD002.xml','./msxsdtest/complexType',valid,S187),
+ ITResList71 = [ITRes70|ITResList70],
+
+
+ ?line {STRes188,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD003.xsd','./msxsdtest/complexType',invalid),
+ STResList189 = [STRes188|STResList188],
+
+
+ ?line {STRes189,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD004.xsd','./msxsdtest/complexType',invalid),
+ STResList190 = [STRes189|STResList189],
+
+
+ ?line {STRes190,S190} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD005.xsd','./msxsdtest/complexType',valid),
+ STResList191 = [STRes190|STResList190],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD005.xml','./msxsdtest/complexType',valid,S190),
+ ITResList72 = [ITRes71|ITResList71],
+
+
+ ?line {STRes191,S191} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD006.xsd','./msxsdtest/complexType',valid),
+ STResList192 = [STRes191|STResList191],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD006.xml','./msxsdtest/complexType',valid,S191),
+ ITResList73 = [ITRes72|ITResList72],
+
+
+ ?line {STRes192,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD007.xsd','./msxsdtest/complexType',invalid),
+ STResList193 = [STRes192|STResList192],
+
+
+ ?line {STRes193,S193} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD008.xsd','./msxsdtest/complexType',valid),
+ STResList194 = [STRes193|STResList193],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD008.xml','./msxsdtest/complexType',valid,S193),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes194,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD009.xsd','./msxsdtest/complexType',invalid),
+ STResList195 = [STRes194|STResList194],
+
+
+ ?line {STRes195,S195} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD010.xsd','./msxsdtest/complexType',valid),
+ STResList196 = [STRes195|STResList195],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD010.xml','./msxsdtest/complexType',valid,S195),
+ ITResList75 = [ITRes74|ITResList74],
+
+
+ ?line {STRes196,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD011.xsd','./msxsdtest/complexType',invalid),
+ STResList197 = [STRes196|STResList196],
+
+
+ ?line {STRes197,S197} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD012.xsd','./msxsdtest/complexType',valid),
+ STResList198 = [STRes197|STResList197],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD012.xml','./msxsdtest/complexType',valid,S197),
+ ITResList76 = [ITRes75|ITResList75],
+
+
+ ?line {STRes198,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD013.xsd','./msxsdtest/complexType',invalid),
+ STResList199 = [STRes198|STResList198],
+
+
+ ?line {STRes199,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD014.xsd','./msxsdtest/complexType',invalid),
+ STResList200 = [STRes199|STResList199],
+
+
+ ?line {STRes200,S200} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD015.xsd','./msxsdtest/complexType',valid),
+ STResList201 = [STRes200|STResList200],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD015.xml','./msxsdtest/complexType',valid,S200),
+ ITResList77 = [ITRes76|ITResList76],
+
+
+ ?line {STRes201,S201} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD016.xsd','./msxsdtest/complexType',valid),
+ STResList202 = [STRes201|STResList201],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD016.xml','./msxsdtest/complexType',valid,S201),
+ ITResList78 = [ITRes77|ITResList77],
+
+
+ ?line {STRes202,S202} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD017.xsd','./msxsdtest/complexType',valid),
+ STResList203 = [STRes202|STResList202],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD017.xml','./msxsdtest/complexType',valid,S202),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes203,S203} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD018.xsd','./msxsdtest/complexType',valid),
+ STResList204 = [STRes203|STResList203],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD018.xml','./msxsdtest/complexType',valid,S203),
+ ITResList80 = [ITRes79|ITResList79],
+
+
+ ?line {STRes204,S204} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD019.xsd','./msxsdtest/complexType',valid),
+ STResList205 = [STRes204|STResList204],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD019.xml','./msxsdtest/complexType',valid,S204),
+ ITResList81 = [ITRes80|ITResList80],
+
+
+ ?line {STRes205,S205} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD020.xsd','./msxsdtest/complexType',valid),
+ STResList206 = [STRes205|STResList205],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD020.xml','./msxsdtest/complexType',valid,S205),
+ ITResList82 = [ITRes81|ITResList81],
+
+
+ ?line {STRes206,S206} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD021.xsd','./msxsdtest/complexType',valid),
+ STResList207 = [STRes206|STResList206],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD021.xml','./msxsdtest/complexType',valid,S206),
+ ITResList83 = [ITRes82|ITResList82],
+
+
+ ?line {STRes207,S207} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD022.xsd','./msxsdtest/complexType',valid),
+ STResList208 = [STRes207|STResList207],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD022.xml','./msxsdtest/complexType',valid,S207),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes208,S208} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD023.xsd','./msxsdtest/complexType',valid),
+ STResList209 = [STRes208|STResList208],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD023.xml','./msxsdtest/complexType',valid,S208),
+ ITResList85 = [ITRes84|ITResList84],
+
+
+ ?line {STRes209,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD024.xsd','./msxsdtest/complexType',invalid),
+ STResList210 = [STRes209|STResList209],
+
+
+ ?line {STRes210,S210} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD025.xsd','./msxsdtest/complexType',valid),
+ STResList211 = [STRes210|STResList210],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD025.xml','./msxsdtest/complexType',valid,S210),
+ ITResList86 = [ITRes85|ITResList85],
+
+
+ ?line {STRes211,S211} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD026.xsd','./msxsdtest/complexType',valid),
+ STResList212 = [STRes211|STResList211],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD026.xml','./msxsdtest/complexType',valid,S211),
+ ITResList87 = [ITRes86|ITResList86],
+
+
+ ?line {STRes212,S212} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD027.xsd','./msxsdtest/complexType',valid),
+ STResList213 = [STRes212|STResList212],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD027.xml','./msxsdtest/complexType',valid,S212),
+ ITResList88 = [ITRes87|ITResList87],
+
+
+ ?line {STRes213,S213} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD028.xsd','./msxsdtest/complexType',valid),
+ STResList214 = [STRes213|STResList213],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD028.xml','./msxsdtest/complexType',valid,S213),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes214,S214} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD029.xsd','./msxsdtest/complexType',valid),
+ STResList215 = [STRes214|STResList214],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD029.xml','./msxsdtest/complexType',valid,S214),
+ ITResList90 = [ITRes89|ITResList89],
+
+
+ ?line {STRes215,S215} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD030.xsd','./msxsdtest/complexType',valid),
+ STResList216 = [STRes215|STResList215],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD030.xml','./msxsdtest/complexType',valid,S215),
+ ITResList91 = [ITRes90|ITResList90],
+
+
+ ?line {STRes216,S216} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD031.xsd','./msxsdtest/complexType',valid),
+ STResList217 = [STRes216|STResList216],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD031.xml','./msxsdtest/complexType',valid,S216),
+ ITResList92 = [ITRes91|ITResList91],
+
+
+ ?line {STRes217,S217} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD032.xsd','./msxsdtest/complexType',valid),
+ STResList218 = [STRes217|STResList217],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD032.xml','./msxsdtest/complexType',valid,S217),
+ ITResList93 = [ITRes92|ITResList92],
+
+
+ ?line {STRes218,S218} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD033.xsd','./msxsdtest/complexType',valid),
+ STResList219 = [STRes218|STResList218],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD033.xml','./msxsdtest/complexType',valid,S218),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes219,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD034.xsd','./msxsdtest/complexType',invalid),
+ STResList220 = [STRes219|STResList219],
+
+
+ ?line {STRes220,S220} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD035.xsd','./msxsdtest/complexType',valid),
+ STResList221 = [STRes220|STResList220],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctD035.xml','./msxsdtest/complexType',valid,S220),
+ ITResList95 = [ITRes94|ITResList94],
+
+
+ ?line {STRes221,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD036.xsd','./msxsdtest/complexType',invalid),
+ STResList222 = [STRes221|STResList221],
+
+
+ ?line {STRes222,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD037.xsd','./msxsdtest/complexType',invalid),
+ STResList223 = [STRes222|STResList222],
+
+
+ ?line {STRes223,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD038.xsd','./msxsdtest/complexType',invalid),
+ STResList224 = [STRes223|STResList223],
+
+
+ ?line {STRes224,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD039.xsd','./msxsdtest/complexType',invalid),
+ STResList225 = [STRes224|STResList224],
+
+
+ ?line {STRes225,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD040.xsd','./msxsdtest/complexType',invalid),
+ STResList226 = [STRes225|STResList225],
+
+
+ ?line {STRes226,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD041.xsd','./msxsdtest/complexType',invalid),
+ STResList227 = [STRes226|STResList226],
+
+
+ ?line {STRes227,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD042.xsd','./msxsdtest/complexType',invalid),
+ STResList228 = [STRes227|STResList227],
+
+
+ ?line {STRes228,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctD043.xsd','./msxsdtest/complexType',invalid),
+ STResList229 = [STRes228|STResList228],
+
+
+ ?line {STRes229,S229} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctE001.xsd','./msxsdtest/complexType',valid),
+ STResList230 = [STRes229|STResList229],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctE001.xml','./msxsdtest/complexType',valid,S229),
+ ITResList96 = [ITRes95|ITResList95],
+
+
+ ?line {STRes230,S230} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctE002.xsd','./msxsdtest/complexType',valid),
+ STResList231 = [STRes230|STResList230],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctE002.xml','./msxsdtest/complexType',valid,S230),
+ ITResList97 = [ITRes96|ITResList96],
+
+
+ ?line {STRes231,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctE003.xsd','./msxsdtest/complexType',invalid),
+ STResList232 = [STRes231|STResList231],
+
+
+ ?line {STRes232,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctE004.xsd','./msxsdtest/complexType',invalid),
+ STResList233 = [STRes232|STResList232],
+
+
+ ?line {STRes233,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctE005.xsd','./msxsdtest/complexType',invalid),
+ STResList234 = [STRes233|STResList233],
+
+
+ ?line {STRes234,S234} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctE006.xsd','./msxsdtest/complexType',valid),
+ STResList235 = [STRes234|STResList234],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctE006.xml','./msxsdtest/complexType',valid,S234),
+ ITResList98 = [ITRes97|ITResList97],
+
+
+ ?line {STRes235,S235} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctE007.xsd','./msxsdtest/complexType',valid),
+ STResList236 = [STRes235|STResList235],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctE007.xml','./msxsdtest/complexType',valid,S235),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes236,S236} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctE008.xsd','./msxsdtest/complexType',valid),
+ STResList237 = [STRes236|STResList236],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctE008.xml','./msxsdtest/complexType',valid,S236),
+ ITResList100 = [ITRes99|ITResList99],
+
+
+ ?line {STRes237,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctE009.xsd','./msxsdtest/complexType',invalid),
+ STResList238 = [STRes237|STResList237],
+
+
+ ?line {STRes238,S238} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctE010.xsd','./msxsdtest/complexType',valid),
+ STResList239 = [STRes238|STResList238],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctE010.xml','./msxsdtest/complexType',valid,S238),
+ ITResList101 = [ITRes100|ITResList100],
+
+
+ ?line {STRes239,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctE011.xsd','./msxsdtest/complexType',invalid),
+ STResList240 = [STRes239|STResList239],
+
+
+ ?line {STRes240,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctE012.xsd','./msxsdtest/complexType',invalid),
+ STResList241 = [STRes240|STResList240],
+
+
+ ?line {STRes241,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctE013.xsd','./msxsdtest/complexType',invalid),
+ STResList242 = [STRes241|STResList241],
+
+
+ ?line {STRes242,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctE014.xsd','./msxsdtest/complexType',invalid),
+ STResList243 = [STRes242|STResList242],
+
+
+ ?line {STRes243,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctE015.xsd','./msxsdtest/complexType',invalid),
+ STResList244 = [STRes243|STResList243],
+
+
+ ?line {STRes244,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctE016.xsd','./msxsdtest/complexType',invalid),
+ STResList245 = [STRes244|STResList244],
+
+
+ ?line {STRes245,S245} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctE017.xsd','./msxsdtest/complexType',valid),
+ STResList246 = [STRes245|STResList245],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctE017.xml','./msxsdtest/complexType',valid,S245),
+ ITResList102 = [ITRes101|ITResList101],
+
+
+ ?line {STRes246,S246} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctF001.xsd','./msxsdtest/complexType',valid),
+ STResList247 = [STRes246|STResList246],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctF001.xml','./msxsdtest/complexType',valid,S246),
+ ITResList103 = [ITRes102|ITResList102],
+
+
+ ?line {STRes247,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctF002.xsd','./msxsdtest/complexType',invalid),
+ STResList248 = [STRes247|STResList247],
+
+
+ ?line {STRes248,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctF003.xsd','./msxsdtest/complexType',invalid),
+ STResList249 = [STRes248|STResList248],
+
+
+ ?line {STRes249,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctF004.xsd','./msxsdtest/complexType',invalid),
+ STResList250 = [STRes249|STResList249],
+
+
+ ?line {STRes250,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctF005.xsd','./msxsdtest/complexType',invalid),
+ STResList251 = [STRes250|STResList250],
+
+
+ ?line {STRes251,S251} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctF006.xsd','./msxsdtest/complexType',valid),
+ STResList252 = [STRes251|STResList251],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctF006.xml','./msxsdtest/complexType',valid,S251),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes252,S252} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctF007.xsd','./msxsdtest/complexType',valid),
+ STResList253 = [STRes252|STResList252],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctF007.xml','./msxsdtest/complexType',valid,S252),
+ ITResList105 = [ITRes104|ITResList104],
+
+
+ ?line {STRes253,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctF008.xsd','./msxsdtest/complexType',invalid),
+ STResList254 = [STRes253|STResList253],
+
+
+ ?line {STRes254,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctF009.xsd','./msxsdtest/complexType',invalid),
+ STResList255 = [STRes254|STResList254],
+
+
+ ?line {STRes255,S255} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctF010.xsd','./msxsdtest/complexType',valid),
+ STResList256 = [STRes255|STResList255],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctF010.xml','./msxsdtest/complexType',valid,S255),
+ ITResList106 = [ITRes105|ITResList105],
+
+
+ ?line {STRes256,S256} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctF011.xsd','./msxsdtest/complexType',valid),
+ STResList257 = [STRes256|STResList256],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctF011.xml','./msxsdtest/complexType',valid,S256),
+ ITResList107 = [ITRes106|ITResList106],
+
+
+ ?line {STRes257,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctF012.xsd','./msxsdtest/complexType',invalid),
+ STResList258 = [STRes257|STResList257],
+
+
+ ?line {STRes258,S258} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctF013.xsd','./msxsdtest/complexType',valid),
+ STResList259 = [STRes258|STResList258],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctF013.xml','./msxsdtest/complexType',valid,S258),
+ ITResList108 = [ITRes107|ITResList107],
+
+
+ ?line {STRes259,S259} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctF014.xsd','./msxsdtest/complexType',valid),
+ STResList260 = [STRes259|STResList259],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctF014.xml','./msxsdtest/complexType',valid,S259),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes260,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctF015.xsd','./msxsdtest/complexType',invalid),
+ STResList261 = [STRes260|STResList260],
+
+
+ ?line {STRes261,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctF016.xsd','./msxsdtest/complexType',invalid),
+ STResList262 = [STRes261|STResList261],
+
+
+ ?line {STRes262,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctF017.xsd','./msxsdtest/complexType',invalid),
+ STResList263 = [STRes262|STResList262],
+
+
+ ?line {STRes263,S263} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG001.xsd','./msxsdtest/complexType',valid),
+ STResList264 = [STRes263|STResList263],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG001.xml','./msxsdtest/complexType',valid,S263),
+ ITResList110 = [ITRes109|ITResList109],
+
+
+ ?line {STRes264,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG002.xsd','./msxsdtest/complexType',invalid),
+ STResList265 = [STRes264|STResList264],
+
+
+ ?line {STRes265,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG003.xsd','./msxsdtest/complexType',invalid),
+ STResList266 = [STRes265|STResList265],
+
+
+ ?line {STRes266,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG004.xsd','./msxsdtest/complexType',invalid),
+ STResList267 = [STRes266|STResList266],
+
+
+ ?line {STRes267,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG005.xsd','./msxsdtest/complexType',invalid),
+ STResList268 = [STRes267|STResList267],
+
+
+ ?line {STRes268,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG006.xsd','./msxsdtest/complexType',invalid),
+ STResList269 = [STRes268|STResList268],
+
+
+ ?line {STRes269,S269} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG007.xsd','./msxsdtest/complexType',valid),
+ STResList270 = [STRes269|STResList269],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG007.xml','./msxsdtest/complexType',valid,S269),
+ ITResList111 = [ITRes110|ITResList110],
+
+
+ ?line {STRes270,S270} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG008.xsd','./msxsdtest/complexType',valid),
+ STResList271 = [STRes270|STResList270],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG008.xml','./msxsdtest/complexType',valid,S270),
+ ITResList112 = [ITRes111|ITResList111],
+
+
+ ?line {STRes271,S271} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG009.xsd','./msxsdtest/complexType',valid),
+ STResList272 = [STRes271|STResList271],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG009.xml','./msxsdtest/complexType',valid,S271),
+ ITResList113 = [ITRes112|ITResList112],
+
+
+ ?line {STRes272,S272} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG010.xsd','./msxsdtest/complexType',valid),
+ STResList273 = [STRes272|STResList272],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG010.xml','./msxsdtest/complexType',valid,S272),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes273,S273} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG011.xsd','./msxsdtest/complexType',valid),
+ STResList274 = [STRes273|STResList273],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG011.xml','./msxsdtest/complexType',valid,S273),
+ ITResList115 = [ITRes114|ITResList114],
+
+
+ ?line {STRes274,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG012.xsd','./msxsdtest/complexType',invalid),
+ STResList275 = [STRes274|STResList274],
+
+
+ ?line {STRes275,S275} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG013.xsd','./msxsdtest/complexType',valid),
+ STResList276 = [STRes275|STResList275],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG013.xml','./msxsdtest/complexType',valid,S275),
+ ITResList116 = [ITRes115|ITResList115],
+
+
+ ?line {STRes276,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG014.xsd','./msxsdtest/complexType',invalid),
+ STResList277 = [STRes276|STResList276],
+
+
+ ?line {STRes277,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG015.xsd','./msxsdtest/complexType',invalid),
+ STResList278 = [STRes277|STResList277],
+
+
+ ?line {STRes278,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG016.xsd','./msxsdtest/complexType',invalid),
+ STResList279 = [STRes278|STResList278],
+
+
+ ?line {STRes279,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG017.xsd','./msxsdtest/complexType',invalid),
+ STResList280 = [STRes279|STResList279],
+
+
+ ?line {STRes280,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG018.xsd','./msxsdtest/complexType',invalid),
+ STResList281 = [STRes280|STResList280],
+
+
+ ?line {STRes281,S281} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG019.xsd','./msxsdtest/complexType',valid),
+ STResList282 = [STRes281|STResList281],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG019.xml','./msxsdtest/complexType',valid,S281),
+ ITResList117 = [ITRes116|ITResList116],
+
+
+ ?line {STRes282,S282} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG020.xsd','./msxsdtest/complexType',valid),
+ STResList283 = [STRes282|STResList282],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG020.xml','./msxsdtest/complexType',valid,S282),
+ ITResList118 = [ITRes117|ITResList117],
+
+
+ ?line {STRes283,S283} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG021.xsd','./msxsdtest/complexType',valid),
+ STResList284 = [STRes283|STResList283],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG021.xml','./msxsdtest/complexType',valid,S283),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes284,S284} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG022.xsd','./msxsdtest/complexType',valid),
+ STResList285 = [STRes284|STResList284],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG022.xml','./msxsdtest/complexType',valid,S284),
+ ITResList120 = [ITRes119|ITResList119],
+
+
+ ?line {STRes285,S285} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG023.xsd','./msxsdtest/complexType',valid),
+ STResList286 = [STRes285|STResList285],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG023.xml','./msxsdtest/complexType',valid,S285),
+ ITResList121 = [ITRes120|ITResList120],
+
+
+ ?line {STRes286,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG024.xsd','./msxsdtest/complexType',invalid),
+ STResList287 = [STRes286|STResList286],
+
+
+ ?line {STRes287,S287} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG025.xsd','./msxsdtest/complexType',valid),
+ STResList288 = [STRes287|STResList287],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG025.xml','./msxsdtest/complexType',valid,S287),
+ ITResList122 = [ITRes121|ITResList121],
+
+
+ ?line {STRes288,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG026.xsd','./msxsdtest/complexType',invalid),
+ STResList289 = [STRes288|STResList288],
+
+
+ ?line {STRes289,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG027.xsd','./msxsdtest/complexType',invalid),
+ STResList290 = [STRes289|STResList289],
+
+
+ ?line {STRes290,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG028.xsd','./msxsdtest/complexType',invalid),
+ STResList291 = [STRes290|STResList290],
+
+
+ ?line {STRes291,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG029.xsd','./msxsdtest/complexType',invalid),
+ STResList292 = [STRes291|STResList291],
+
+
+ ?line {STRes292,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG030.xsd','./msxsdtest/complexType',invalid),
+ STResList293 = [STRes292|STResList292],
+
+
+ ?line {STRes293,S293} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG031.xsd','./msxsdtest/complexType',valid),
+ STResList294 = [STRes293|STResList293],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG031.xml','./msxsdtest/complexType',valid,S293),
+ ITResList123 = [ITRes122|ITResList122],
+
+
+ ?line {STRes294,S294} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG032.xsd','./msxsdtest/complexType',valid),
+ STResList295 = [STRes294|STResList294],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG032.xml','./msxsdtest/complexType',valid,S294),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes295,S295} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG033.xsd','./msxsdtest/complexType',valid),
+ STResList296 = [STRes295|STResList295],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG033.xml','./msxsdtest/complexType',valid,S295),
+ ITResList125 = [ITRes124|ITResList124],
+
+
+ ?line {STRes296,S296} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG034.xsd','./msxsdtest/complexType',valid),
+ STResList297 = [STRes296|STResList296],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG034.xml','./msxsdtest/complexType',valid,S296),
+ ITResList126 = [ITRes125|ITResList125],
+
+
+ ?line {STRes297,S297} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG035.xsd','./msxsdtest/complexType',valid),
+ STResList298 = [STRes297|STResList297],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG035.xml','./msxsdtest/complexType',valid,S297),
+ ITResList127 = [ITRes126|ITResList126],
+
+
+ ?line {STRes298,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG036.xsd','./msxsdtest/complexType',invalid),
+ STResList299 = [STRes298|STResList298],
+
+
+ ?line {STRes299,S299} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG037.xsd','./msxsdtest/complexType',valid),
+ STResList300 = [STRes299|STResList299],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG037.xml','./msxsdtest/complexType',valid,S299),
+ ITResList128 = [ITRes127|ITResList127],
+
+
+ ?line {STRes300,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG038.xsd','./msxsdtest/complexType',invalid),
+ STResList301 = [STRes300|STResList300],
+
+
+ ?line {STRes301,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG039.xsd','./msxsdtest/complexType',invalid),
+ STResList302 = [STRes301|STResList301],
+
+
+ ?line {STRes302,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG040.xsd','./msxsdtest/complexType',invalid),
+ STResList303 = [STRes302|STResList302],
+
+
+ ?line {STRes303,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG041.xsd','./msxsdtest/complexType',invalid),
+ STResList304 = [STRes303|STResList303],
+
+
+ ?line {STRes304,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG042.xsd','./msxsdtest/complexType',invalid),
+ STResList305 = [STRes304|STResList304],
+
+
+ ?line {STRes305,S305} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG043.xsd','./msxsdtest/complexType',valid),
+ STResList306 = [STRes305|STResList305],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG043.xml','./msxsdtest/complexType',valid,S305),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes306,S306} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG044.xsd','./msxsdtest/complexType',valid),
+ STResList307 = [STRes306|STResList306],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG044.xml','./msxsdtest/complexType',valid,S306),
+ ITResList130 = [ITRes129|ITResList129],
+
+
+ ?line {STRes307,S307} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG045.xsd','./msxsdtest/complexType',valid),
+ STResList308 = [STRes307|STResList307],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG045.xml','./msxsdtest/complexType',valid,S307),
+ ITResList131 = [ITRes130|ITResList130],
+
+
+ ?line {STRes308,S308} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG046.xsd','./msxsdtest/complexType',valid),
+ STResList309 = [STRes308|STResList308],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG046.xml','./msxsdtest/complexType',valid,S308),
+ ITResList132 = [ITRes131|ITResList131],
+
+
+ ?line {STRes309,S309} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG047.xsd','./msxsdtest/complexType',valid),
+ STResList310 = [STRes309|STResList309],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG047.xml','./msxsdtest/complexType',valid,S309),
+ ITResList133 = [ITRes132|ITResList132],
+
+
+ ?line {STRes310,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG048.xsd','./msxsdtest/complexType',invalid),
+ STResList311 = [STRes310|STResList310],
+
+
+ ?line {STRes311,S311} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG049.xsd','./msxsdtest/complexType',valid),
+ STResList312 = [STRes311|STResList311],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG049.xml','./msxsdtest/complexType',valid,S311),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes312,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG050.xsd','./msxsdtest/complexType',invalid),
+ STResList313 = [STRes312|STResList312],
+
+
+ ?line {STRes313,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG051.xsd','./msxsdtest/complexType',invalid),
+ STResList314 = [STRes313|STResList313],
+
+
+ ?line {STRes314,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG052.xsd','./msxsdtest/complexType',invalid),
+ STResList315 = [STRes314|STResList314],
+
+
+ ?line {STRes315,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG053.xsd','./msxsdtest/complexType',invalid),
+ STResList316 = [STRes315|STResList315],
+
+
+ ?line {STRes316,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG054.xsd','./msxsdtest/complexType',invalid),
+ STResList317 = [STRes316|STResList316],
+
+
+ ?line {STRes317,S317} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG055.xsd','./msxsdtest/complexType',valid),
+ STResList318 = [STRes317|STResList317],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG055.xml','./msxsdtest/complexType',valid,S317),
+ ITResList135 = [ITRes134|ITResList134],
+
+
+ ?line {STRes318,S318} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG056.xsd','./msxsdtest/complexType',valid),
+ STResList319 = [STRes318|STResList318],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG056.xml','./msxsdtest/complexType',valid,S318),
+ ITResList136 = [ITRes135|ITResList135],
+
+
+ ?line {STRes319,S319} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG057.xsd','./msxsdtest/complexType',valid),
+ STResList320 = [STRes319|STResList319],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG057.xml','./msxsdtest/complexType',valid,S319),
+ ITResList137 = [ITRes136|ITResList136],
+
+
+ ?line {STRes320,S320} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG058.xsd','./msxsdtest/complexType',valid),
+ STResList321 = [STRes320|STResList320],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG058.xml','./msxsdtest/complexType',valid,S320),
+ ITResList138 = [ITRes137|ITResList137],
+
+
+ ?line {STRes321,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG059.xsd','./msxsdtest/complexType',invalid),
+ STResList322 = [STRes321|STResList321],
+
+
+ ?line {STRes322,S322} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG060.xsd','./msxsdtest/complexType',valid),
+ STResList323 = [STRes322|STResList322],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG060.xml','./msxsdtest/complexType',valid,S322),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ ?line {STRes323,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG061.xsd','./msxsdtest/complexType',invalid),
+ STResList324 = [STRes323|STResList323],
+
+
+ ?line {STRes324,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG062.xsd','./msxsdtest/complexType',invalid),
+ STResList325 = [STRes324|STResList324],
+
+
+ ?line {STRes325,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG063.xsd','./msxsdtest/complexType',invalid),
+ STResList326 = [STRes325|STResList325],
+
+
+ ?line {STRes326,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG064.xsd','./msxsdtest/complexType',invalid),
+ STResList327 = [STRes326|STResList326],
+
+
+ ?line {STRes327,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG065.xsd','./msxsdtest/complexType',invalid),
+ STResList328 = [STRes327|STResList327],
+
+
+ ?line {STRes328,S328} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG066.xsd','./msxsdtest/complexType',valid),
+ STResList329 = [STRes328|STResList328],
+ ?line ITRes139 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG066.xml','./msxsdtest/complexType',valid,S328),
+ ITResList140 = [ITRes139|ITResList139],
+
+
+ ?line {STRes329,S329} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG067.xsd','./msxsdtest/complexType',valid),
+ STResList330 = [STRes329|STResList329],
+ ?line ITRes140 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG067.xml','./msxsdtest/complexType',valid,S329),
+ ITResList141 = [ITRes140|ITResList140],
+
+
+ ?line {STRes330,S330} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG068.xsd','./msxsdtest/complexType',valid),
+ STResList331 = [STRes330|STResList330],
+ ?line ITRes141 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG068.xml','./msxsdtest/complexType',valid,S330),
+ ITResList142 = [ITRes141|ITResList141],
+
+
+ ?line {STRes331,S331} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG069.xsd','./msxsdtest/complexType',valid),
+ STResList332 = [STRes331|STResList331],
+ ?line ITRes142 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG069.xml','./msxsdtest/complexType',valid,S331),
+ ITResList143 = [ITRes142|ITResList142],
+
+
+ ?line {STRes332,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG070.xsd','./msxsdtest/complexType',invalid),
+ STResList333 = [STRes332|STResList332],
+
+
+ ?line {STRes333,S333} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG071.xsd','./msxsdtest/complexType',valid),
+ STResList334 = [STRes333|STResList333],
+ ?line ITRes143 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctG071.xml','./msxsdtest/complexType',valid,S333),
+ ITResList144 = [ITRes143|ITResList143],
+
+
+ ?line {STRes334,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG072.xsd','./msxsdtest/complexType',invalid),
+ STResList335 = [STRes334|STResList334],
+
+
+ ?line {STRes335,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG073.xsd','./msxsdtest/complexType',invalid),
+ STResList336 = [STRes335|STResList335],
+
+
+ ?line {STRes336,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG074.xsd','./msxsdtest/complexType',invalid),
+ STResList337 = [STRes336|STResList336],
+
+
+ ?line {STRes337,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG075.xsd','./msxsdtest/complexType',invalid),
+ STResList338 = [STRes337|STResList337],
+
+
+ ?line {STRes338,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG076.xsd','./msxsdtest/complexType',invalid),
+ STResList339 = [STRes338|STResList338],
+
+
+ ?line {STRes339,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG077.xsd','./msxsdtest/complexType',invalid),
+ STResList340 = [STRes339|STResList339],
+
+
+ ?line {STRes340,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG078.xsd','./msxsdtest/complexType',invalid),
+ STResList341 = [STRes340|STResList340],
+
+
+ ?line {STRes341,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG079.xsd','./msxsdtest/complexType',invalid),
+ STResList342 = [STRes341|STResList341],
+
+
+ ?line {STRes342,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG080.xsd','./msxsdtest/complexType',invalid),
+ STResList343 = [STRes342|STResList342],
+
+
+ ?line {STRes343,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctG081.xsd','./msxsdtest/complexType',invalid),
+ STResList344 = [STRes343|STResList343],
+
+
+ ?line {STRes344,S344} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH001.xsd','./msxsdtest/complexType',valid),
+ STResList345 = [STRes344|STResList344],
+ ?line ITRes144 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH001.xml','./msxsdtest/complexType',valid,S344),
+ ITResList145 = [ITRes144|ITResList144],
+
+
+ ?line {STRes345,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH002.xsd','./msxsdtest/complexType',invalid),
+ STResList346 = [STRes345|STResList345],
+
+
+ ?line {STRes346,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH003.xsd','./msxsdtest/complexType',invalid),
+ STResList347 = [STRes346|STResList346],
+
+
+ ?line {STRes347,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH004.xsd','./msxsdtest/complexType',invalid),
+ STResList348 = [STRes347|STResList347],
+
+
+ ?line {STRes348,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH005.xsd','./msxsdtest/complexType',invalid),
+ STResList349 = [STRes348|STResList348],
+
+
+ ?line {STRes349,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH006.xsd','./msxsdtest/complexType',invalid),
+ STResList350 = [STRes349|STResList349],
+
+
+ ?line {STRes350,S350} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH007.xsd','./msxsdtest/complexType',valid),
+ STResList351 = [STRes350|STResList350],
+ ?line ITRes145 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH007.xml','./msxsdtest/complexType',valid,S350),
+ ITResList146 = [ITRes145|ITResList145],
+
+
+ ?line {STRes351,S351} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH008.xsd','./msxsdtest/complexType',valid),
+ STResList352 = [STRes351|STResList351],
+ ?line ITRes146 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH008.xml','./msxsdtest/complexType',valid,S351),
+ ITResList147 = [ITRes146|ITResList146],
+
+
+ ?line {STRes352,S352} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH009.xsd','./msxsdtest/complexType',valid),
+ STResList353 = [STRes352|STResList352],
+ ?line ITRes147 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH009.xml','./msxsdtest/complexType',valid,S352),
+ ITResList148 = [ITRes147|ITResList147],
+
+
+ ?line {STRes353,S353} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH010.xsd','./msxsdtest/complexType',valid),
+ STResList354 = [STRes353|STResList353],
+ ?line ITRes148 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH010.xml','./msxsdtest/complexType',valid,S353),
+ ITResList149 = [ITRes148|ITResList148],
+
+
+ ?line {STRes354,S354} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH011.xsd','./msxsdtest/complexType',valid),
+ STResList355 = [STRes354|STResList354],
+ ?line ITRes149 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH011.xml','./msxsdtest/complexType',valid,S354),
+ ITResList150 = [ITRes149|ITResList149],
+
+
+ ?line {STRes355,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH012.xsd','./msxsdtest/complexType',invalid),
+ STResList356 = [STRes355|STResList355],
+
+
+ ?line {STRes356,S356} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH013.xsd','./msxsdtest/complexType',valid),
+ STResList357 = [STRes356|STResList356],
+ ?line ITRes150 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH013.xml','./msxsdtest/complexType',valid,S356),
+ ITResList151 = [ITRes150|ITResList150],
+
+
+ ?line {STRes357,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH014.xsd','./msxsdtest/complexType',invalid),
+ STResList358 = [STRes357|STResList357],
+
+
+ ?line {STRes358,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH015.xsd','./msxsdtest/complexType',invalid),
+ STResList359 = [STRes358|STResList358],
+
+
+ ?line {STRes359,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH016.xsd','./msxsdtest/complexType',invalid),
+ STResList360 = [STRes359|STResList359],
+
+
+ ?line {STRes360,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH017.xsd','./msxsdtest/complexType',invalid),
+ STResList361 = [STRes360|STResList360],
+
+
+ ?line {STRes361,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH018.xsd','./msxsdtest/complexType',invalid),
+ STResList362 = [STRes361|STResList361],
+
+
+ ?line {STRes362,S362} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH019.xsd','./msxsdtest/complexType',valid),
+ STResList363 = [STRes362|STResList362],
+ ?line ITRes151 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH019.xml','./msxsdtest/complexType',valid,S362),
+ ITResList152 = [ITRes151|ITResList151],
+
+
+ ?line {STRes363,S363} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH020.xsd','./msxsdtest/complexType',valid),
+ STResList364 = [STRes363|STResList363],
+ ?line ITRes152 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH020.xml','./msxsdtest/complexType',valid,S363),
+ ITResList153 = [ITRes152|ITResList152],
+
+
+ ?line {STRes364,S364} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH021.xsd','./msxsdtest/complexType',valid),
+ STResList365 = [STRes364|STResList364],
+ ?line ITRes153 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH021.xml','./msxsdtest/complexType',valid,S364),
+ ITResList154 = [ITRes153|ITResList153],
+
+
+ ?line {STRes365,S365} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH022.xsd','./msxsdtest/complexType',valid),
+ STResList366 = [STRes365|STResList365],
+ ?line ITRes154 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH022.xml','./msxsdtest/complexType',valid,S365),
+ ITResList155 = [ITRes154|ITResList154],
+
+
+ ?line {STRes366,S366} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH023.xsd','./msxsdtest/complexType',valid),
+ STResList367 = [STRes366|STResList366],
+ ?line ITRes155 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH023.xml','./msxsdtest/complexType',valid,S366),
+ ITResList156 = [ITRes155|ITResList155],
+
+
+ ?line {STRes367,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH024.xsd','./msxsdtest/complexType',invalid),
+ STResList368 = [STRes367|STResList367],
+
+
+ ?line {STRes368,S368} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH025.xsd','./msxsdtest/complexType',valid),
+ STResList369 = [STRes368|STResList368],
+ ?line ITRes156 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH025.xml','./msxsdtest/complexType',valid,S368),
+ ITResList157 = [ITRes156|ITResList156],
+
+
+ ?line {STRes369,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH026.xsd','./msxsdtest/complexType',invalid),
+ STResList370 = [STRes369|STResList369],
+
+
+ ?line {STRes370,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH027.xsd','./msxsdtest/complexType',invalid),
+ STResList371 = [STRes370|STResList370],
+
+
+ ?line {STRes371,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH028.xsd','./msxsdtest/complexType',invalid),
+ STResList372 = [STRes371|STResList371],
+
+
+ ?line {STRes372,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH029.xsd','./msxsdtest/complexType',invalid),
+ STResList373 = [STRes372|STResList372],
+
+
+ ?line {STRes373,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH030.xsd','./msxsdtest/complexType',invalid),
+ STResList374 = [STRes373|STResList373],
+
+
+ ?line {STRes374,S374} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH031.xsd','./msxsdtest/complexType',valid),
+ STResList375 = [STRes374|STResList374],
+ ?line ITRes157 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH031.xml','./msxsdtest/complexType',valid,S374),
+ ITResList158 = [ITRes157|ITResList157],
+
+
+ ?line {STRes375,S375} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH032.xsd','./msxsdtest/complexType',valid),
+ STResList376 = [STRes375|STResList375],
+ ?line ITRes158 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH032.xml','./msxsdtest/complexType',valid,S375),
+ ITResList159 = [ITRes158|ITResList158],
+
+
+ ?line {STRes376,S376} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH033.xsd','./msxsdtest/complexType',valid),
+ STResList377 = [STRes376|STResList376],
+ ?line ITRes159 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH033.xml','./msxsdtest/complexType',valid,S376),
+ ITResList160 = [ITRes159|ITResList159],
+
+
+ ?line {STRes377,S377} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH034.xsd','./msxsdtest/complexType',valid),
+ STResList378 = [STRes377|STResList377],
+ ?line ITRes160 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH034.xml','./msxsdtest/complexType',valid,S377),
+ ITResList161 = [ITRes160|ITResList160],
+
+
+ ?line {STRes378,S378} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH035.xsd','./msxsdtest/complexType',valid),
+ STResList379 = [STRes378|STResList378],
+ ?line ITRes161 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH035.xml','./msxsdtest/complexType',valid,S378),
+ ITResList162 = [ITRes161|ITResList161],
+
+
+ ?line {STRes379,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH036.xsd','./msxsdtest/complexType',invalid),
+ STResList380 = [STRes379|STResList379],
+
+
+ ?line {STRes380,S380} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH037.xsd','./msxsdtest/complexType',valid),
+ STResList381 = [STRes380|STResList380],
+ ?line ITRes162 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH037.xml','./msxsdtest/complexType',valid,S380),
+ ITResList163 = [ITRes162|ITResList162],
+
+
+ ?line {STRes381,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH038.xsd','./msxsdtest/complexType',invalid),
+ STResList382 = [STRes381|STResList381],
+
+
+ ?line {STRes382,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH039.xsd','./msxsdtest/complexType',invalid),
+ STResList383 = [STRes382|STResList382],
+
+
+ ?line {STRes383,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH040.xsd','./msxsdtest/complexType',invalid),
+ STResList384 = [STRes383|STResList383],
+
+
+ ?line {STRes384,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH041.xsd','./msxsdtest/complexType',invalid),
+ STResList385 = [STRes384|STResList384],
+
+
+ ?line {STRes385,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH042.xsd','./msxsdtest/complexType',invalid),
+ STResList386 = [STRes385|STResList385],
+
+
+ ?line {STRes386,S386} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH043.xsd','./msxsdtest/complexType',valid),
+ STResList387 = [STRes386|STResList386],
+ ?line ITRes163 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH043.xml','./msxsdtest/complexType',valid,S386),
+ ITResList164 = [ITRes163|ITResList163],
+
+
+ ?line {STRes387,S387} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH044.xsd','./msxsdtest/complexType',valid),
+ STResList388 = [STRes387|STResList387],
+ ?line ITRes164 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH044.xml','./msxsdtest/complexType',valid,S387),
+ ITResList165 = [ITRes164|ITResList164],
+
+
+ ?line {STRes388,S388} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH045.xsd','./msxsdtest/complexType',valid),
+ STResList389 = [STRes388|STResList388],
+ ?line ITRes165 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH045.xml','./msxsdtest/complexType',valid,S388),
+ ITResList166 = [ITRes165|ITResList165],
+
+
+ ?line {STRes389,S389} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH046.xsd','./msxsdtest/complexType',valid),
+ STResList390 = [STRes389|STResList389],
+ ?line ITRes166 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH046.xml','./msxsdtest/complexType',valid,S389),
+ ITResList167 = [ITRes166|ITResList166],
+
+
+ ?line {STRes390,S390} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH047.xsd','./msxsdtest/complexType',valid),
+ STResList391 = [STRes390|STResList390],
+ ?line ITRes167 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH047.xml','./msxsdtest/complexType',valid,S390),
+ ITResList168 = [ITRes167|ITResList167],
+
+
+ ?line {STRes391,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH048.xsd','./msxsdtest/complexType',invalid),
+ STResList392 = [STRes391|STResList391],
+
+
+ ?line {STRes392,S392} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH049.xsd','./msxsdtest/complexType',valid),
+ STResList393 = [STRes392|STResList392],
+ ?line ITRes168 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH049.xml','./msxsdtest/complexType',valid,S392),
+ ITResList169 = [ITRes168|ITResList168],
+
+
+ ?line {STRes393,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH050.xsd','./msxsdtest/complexType',invalid),
+ STResList394 = [STRes393|STResList393],
+
+
+ ?line {STRes394,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH051.xsd','./msxsdtest/complexType',invalid),
+ STResList395 = [STRes394|STResList394],
+
+
+ ?line {STRes395,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH052.xsd','./msxsdtest/complexType',invalid),
+ STResList396 = [STRes395|STResList395],
+
+
+ ?line {STRes396,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH053.xsd','./msxsdtest/complexType',invalid),
+ STResList397 = [STRes396|STResList396],
+
+
+ ?line {STRes397,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH054.xsd','./msxsdtest/complexType',invalid),
+ STResList398 = [STRes397|STResList397],
+
+
+ ?line {STRes398,S398} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH055.xsd','./msxsdtest/complexType',valid),
+ STResList399 = [STRes398|STResList398],
+ ?line ITRes169 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH055.xml','./msxsdtest/complexType',valid,S398),
+ ITResList170 = [ITRes169|ITResList169],
+
+
+ ?line {STRes399,S399} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH056.xsd','./msxsdtest/complexType',valid),
+ STResList400 = [STRes399|STResList399],
+ ?line ITRes170 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH056.xml','./msxsdtest/complexType',valid,S399),
+ ITResList171 = [ITRes170|ITResList170],
+
+
+ ?line {STRes400,S400} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH057.xsd','./msxsdtest/complexType',valid),
+ STResList401 = [STRes400|STResList400],
+ ?line ITRes171 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH057.xml','./msxsdtest/complexType',valid,S400),
+ ITResList172 = [ITRes171|ITResList171],
+
+
+ ?line {STRes401,S401} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH058.xsd','./msxsdtest/complexType',valid),
+ STResList402 = [STRes401|STResList401],
+ ?line ITRes172 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH058.xml','./msxsdtest/complexType',valid,S401),
+ ITResList173 = [ITRes172|ITResList172],
+
+
+ ?line {STRes402,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH059.xsd','./msxsdtest/complexType',invalid),
+ STResList403 = [STRes402|STResList402],
+
+
+ ?line {STRes403,S403} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH060.xsd','./msxsdtest/complexType',valid),
+ STResList404 = [STRes403|STResList403],
+ ?line ITRes173 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH060.xml','./msxsdtest/complexType',valid,S403),
+ ITResList174 = [ITRes173|ITResList173],
+
+
+ ?line {STRes404,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH061.xsd','./msxsdtest/complexType',invalid),
+ STResList405 = [STRes404|STResList404],
+
+
+ ?line {STRes405,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH062.xsd','./msxsdtest/complexType',invalid),
+ STResList406 = [STRes405|STResList405],
+
+
+ ?line {STRes406,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH063.xsd','./msxsdtest/complexType',invalid),
+ STResList407 = [STRes406|STResList406],
+
+
+ ?line {STRes407,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH064.xsd','./msxsdtest/complexType',invalid),
+ STResList408 = [STRes407|STResList407],
+
+
+ ?line {STRes408,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH065.xsd','./msxsdtest/complexType',invalid),
+ STResList409 = [STRes408|STResList408],
+
+
+ ?line {STRes409,S409} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH066.xsd','./msxsdtest/complexType',valid),
+ STResList410 = [STRes409|STResList409],
+ ?line ITRes174 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH066.xml','./msxsdtest/complexType',valid,S409),
+ ITResList175 = [ITRes174|ITResList174],
+
+
+ ?line {STRes410,S410} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH067.xsd','./msxsdtest/complexType',valid),
+ STResList411 = [STRes410|STResList410],
+ ?line ITRes175 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH067.xml','./msxsdtest/complexType',valid,S410),
+ ITResList176 = [ITRes175|ITResList175],
+
+
+ ?line {STRes411,S411} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH068.xsd','./msxsdtest/complexType',valid),
+ STResList412 = [STRes411|STResList411],
+ ?line ITRes176 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH068.xml','./msxsdtest/complexType',valid,S411),
+ ITResList177 = [ITRes176|ITResList176],
+
+
+ ?line {STRes412,S412} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH069.xsd','./msxsdtest/complexType',valid),
+ STResList413 = [STRes412|STResList412],
+ ?line ITRes177 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH069.xml','./msxsdtest/complexType',valid,S412),
+ ITResList178 = [ITRes177|ITResList177],
+
+
+ ?line {STRes413,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH070.xsd','./msxsdtest/complexType',invalid),
+ STResList414 = [STRes413|STResList413],
+
+
+ ?line {STRes414,S414} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH071.xsd','./msxsdtest/complexType',valid),
+ STResList415 = [STRes414|STResList414],
+ ?line ITRes178 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH071.xml','./msxsdtest/complexType',valid,S414),
+ ITResList179 = [ITRes178|ITResList178],
+
+
+ ?line {STRes415,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH072.xsd','./msxsdtest/complexType',invalid),
+ STResList416 = [STRes415|STResList415],
+
+
+ ?line {STRes416,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH073.xsd','./msxsdtest/complexType',invalid),
+ STResList417 = [STRes416|STResList416],
+
+
+ ?line {STRes417,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH074.xsd','./msxsdtest/complexType',invalid),
+ STResList418 = [STRes417|STResList417],
+
+
+ ?line {STRes418,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH075.xsd','./msxsdtest/complexType',invalid),
+ STResList419 = [STRes418|STResList418],
+
+
+ ?line {STRes419,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH076.xsd','./msxsdtest/complexType',invalid),
+ STResList420 = [STRes419|STResList419],
+
+
+ ?line {STRes420,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH077.xsd','./msxsdtest/complexType',invalid),
+ STResList421 = [STRes420|STResList420],
+
+
+ ?line {STRes421,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH078.xsd','./msxsdtest/complexType',invalid),
+ STResList422 = [STRes421|STResList421],
+
+
+ ?line {STRes422,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH079.xsd','./msxsdtest/complexType',invalid),
+ STResList423 = [STRes422|STResList422],
+
+
+ ?line {STRes423,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH080.xsd','./msxsdtest/complexType',invalid),
+ STResList424 = [STRes423|STResList423],
+
+
+ ?line {STRes424,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH081.xsd','./msxsdtest/complexType',invalid),
+ STResList425 = [STRes424|STResList424],
+
+
+ ?line {STRes425,S425} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctH082.xsd','./msxsdtest/complexType',valid),
+ STResList426 = [STRes425|STResList425],
+ ?line ITRes179 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctH082.xml','./msxsdtest/complexType',valid,S425),
+ ITResList180 = [ITRes179|ITResList179],
+
+
+ ?line {STRes426,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI001.xsd','./msxsdtest/complexType',invalid),
+ STResList427 = [STRes426|STResList426],
+
+
+ ?line {STRes427,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI002.xsd','./msxsdtest/complexType',invalid),
+ STResList428 = [STRes427|STResList427],
+
+
+ ?line {STRes428,S428} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI003.xsd','./msxsdtest/complexType',valid),
+ STResList429 = [STRes428|STResList428],
+ ?line ITRes180 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI003.xml','./msxsdtest/complexType',valid,S428),
+ ITResList181 = [ITRes180|ITResList180],
+
+
+ ?line {STRes429,S429} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI004.xsd','./msxsdtest/complexType',valid),
+ STResList430 = [STRes429|STResList429],
+ ?line ITRes181 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI004.xml','./msxsdtest/complexType',valid,S429),
+ ITResList182 = [ITRes181|ITResList181],
+
+
+ ?line {STRes430,S430} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI005.xsd','./msxsdtest/complexType',valid),
+ STResList431 = [STRes430|STResList430],
+ ?line ITRes182 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI005.xml','./msxsdtest/complexType',valid,S430),
+ ITResList183 = [ITRes182|ITResList182],
+
+
+ ?line {STRes431,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI006.xsd','./msxsdtest/complexType',invalid),
+ STResList432 = [STRes431|STResList431],
+
+
+ ?line {STRes432,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI007.xsd','./msxsdtest/complexType',invalid),
+ STResList433 = [STRes432|STResList432],
+
+
+ ?line {STRes433,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI008.xsd','./msxsdtest/complexType',invalid),
+ STResList434 = [STRes433|STResList433],
+
+
+ ?line {STRes434,S434} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI009.xsd','./msxsdtest/complexType',valid),
+ STResList435 = [STRes434|STResList434],
+ ?line ITRes183 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI009.xml','./msxsdtest/complexType',valid,S434),
+ ITResList184 = [ITRes183|ITResList183],
+
+
+ ?line {STRes435,S435} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI010.xsd','./msxsdtest/complexType',valid),
+ STResList436 = [STRes435|STResList435],
+ ?line ITRes184 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI010.xml','./msxsdtest/complexType',valid,S435),
+ ITResList185 = [ITRes184|ITResList184],
+
+
+ ?line {STRes436,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI011.xsd','./msxsdtest/complexType',invalid),
+ STResList437 = [STRes436|STResList436],
+
+
+ ?line {STRes437,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI012.xsd','./msxsdtest/complexType',invalid),
+ STResList438 = [STRes437|STResList437],
+
+
+ ?line {STRes438,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI013.xsd','./msxsdtest/complexType',invalid),
+ STResList439 = [STRes438|STResList438],
+
+
+ ?line {STRes439,S439} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI014.xsd','./msxsdtest/complexType',valid),
+ STResList440 = [STRes439|STResList439],
+ ?line ITRes185 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI014.xml','./msxsdtest/complexType',valid,S439),
+ ITResList186 = [ITRes185|ITResList185],
+
+
+ ?line {STRes440,S440} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI015.xsd','./msxsdtest/complexType',valid),
+ STResList441 = [STRes440|STResList440],
+ ?line ITRes186 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI015.xml','./msxsdtest/complexType',valid,S440),
+ ITResList187 = [ITRes186|ITResList186],
+
+
+ ?line {STRes441,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI016.xsd','./msxsdtest/complexType',invalid),
+ STResList442 = [STRes441|STResList441],
+
+
+ ?line {STRes442,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI017.xsd','./msxsdtest/complexType',invalid),
+ STResList443 = [STRes442|STResList442],
+
+
+ ?line {STRes443,S443} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI018.xsd','./msxsdtest/complexType',valid),
+ STResList444 = [STRes443|STResList443],
+ ?line ITRes187 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI018.xml','./msxsdtest/complexType',valid,S443),
+ ITResList188 = [ITRes187|ITResList187],
+
+
+ ?line {STRes444,S444} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI019.xsd','./msxsdtest/complexType',valid),
+ STResList445 = [STRes444|STResList444],
+ ?line ITRes188 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI019.xml','./msxsdtest/complexType',valid,S444),
+ ITResList189 = [ITRes188|ITResList188],
+
+
+ ?line {STRes445,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI020.xsd','./msxsdtest/complexType',invalid),
+ STResList446 = [STRes445|STResList445],
+
+
+ ?line {STRes446,S446} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI021.xsd','./msxsdtest/complexType',valid),
+ STResList447 = [STRes446|STResList446],
+ ?line ITRes189 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI021.xml','./msxsdtest/complexType',valid,S446),
+ ITResList190 = [ITRes189|ITResList189],
+
+
+ ?line {STRes447,S447} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI022.xsd','./msxsdtest/complexType',valid),
+ STResList448 = [STRes447|STResList447],
+ ?line ITRes190 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI022.xml','./msxsdtest/complexType',valid,S447),
+ ITResList191 = [ITRes190|ITResList190],
+
+
+ ?line {STRes448,S448} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI023.xsd','./msxsdtest/complexType',valid),
+ STResList449 = [STRes448|STResList448],
+ ?line ITRes191 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI023.xml','./msxsdtest/complexType',valid,S448),
+ ITResList192 = [ITRes191|ITResList191],
+
+
+ ?line {STRes449,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI024.xsd','./msxsdtest/complexType',invalid),
+ STResList450 = [STRes449|STResList449],
+
+
+ ?line {STRes450,S450} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI025.xsd','./msxsdtest/complexType',valid),
+ STResList451 = [STRes450|STResList450],
+ ?line ITRes192 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI025.xml','./msxsdtest/complexType',valid,S450),
+ ITResList193 = [ITRes192|ITResList192],
+
+
+ ?line {STRes451,S451} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI026.xsd','./msxsdtest/complexType',valid),
+ STResList452 = [STRes451|STResList451],
+ ?line ITRes193 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI026.xml','./msxsdtest/complexType',valid,S451),
+ ITResList194 = [ITRes193|ITResList193],
+
+
+ ?line {STRes452,S452} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI027.xsd','./msxsdtest/complexType',valid),
+ STResList453 = [STRes452|STResList452],
+ ?line ITRes194 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI027.xml','./msxsdtest/complexType',valid,S452),
+ ITResList195 = [ITRes194|ITResList194],
+
+
+ ?line {STRes453,S453} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI028.xsd','./msxsdtest/complexType',valid),
+ STResList454 = [STRes453|STResList453],
+ ?line ITRes195 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI028.xml','./msxsdtest/complexType',valid,S453),
+ ITResList196 = [ITRes195|ITResList195],
+
+
+ ?line {STRes454,S454} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI029.xsd','./msxsdtest/complexType',valid),
+ STResList455 = [STRes454|STResList454],
+ ?line ITRes196 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI029.xml','./msxsdtest/complexType',valid,S454),
+ ITResList197 = [ITRes196|ITResList196],
+
+
+ ?line {STRes455,S455} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI030.xsd','./msxsdtest/complexType',valid),
+ STResList456 = [STRes455|STResList455],
+ ?line ITRes197 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI030.xml','./msxsdtest/complexType',invalid,S455),
+ ITResList198 = [ITRes197|ITResList197],
+
+
+ ?line {STRes456,S456} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI031.xsd','./msxsdtest/complexType',valid),
+ STResList457 = [STRes456|STResList456],
+ ?line ITRes198 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI031.xml','./msxsdtest/complexType',invalid,S456),
+ ITResList199 = [ITRes198|ITResList198],
+
+
+ ?line {STRes457,S457} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI032.xsd','./msxsdtest/complexType',valid),
+ STResList458 = [STRes457|STResList457],
+ ?line ITRes199 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI032.xml','./msxsdtest/complexType',invalid,S457),
+ ITResList200 = [ITRes199|ITResList199],
+
+
+ ?line {STRes458,S458} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI033.xsd','./msxsdtest/complexType',valid),
+ STResList459 = [STRes458|STResList458],
+ ?line ITRes200 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI033.xml','./msxsdtest/complexType',valid,S458),
+ ITResList201 = [ITRes200|ITResList200],
+
+
+ ?line {STRes459,S459} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI034.xsd','./msxsdtest/complexType',valid),
+ STResList460 = [STRes459|STResList459],
+ ?line ITRes201 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI034.xml','./msxsdtest/complexType',valid,S459),
+ ITResList202 = [ITRes201|ITResList201],
+
+
+ ?line {STRes460,S460} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI035.xsd','./msxsdtest/complexType',valid),
+ STResList461 = [STRes460|STResList460],
+ ?line ITRes202 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI035.xml','./msxsdtest/complexType',invalid,S460),
+ ITResList203 = [ITRes202|ITResList202],
+
+
+ ?line {STRes461,S461} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI036.xsd','./msxsdtest/complexType',valid),
+ STResList462 = [STRes461|STResList461],
+ ?line ITRes203 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI036.xml','./msxsdtest/complexType',valid,S461),
+ ITResList204 = [ITRes203|ITResList203],
+
+
+ ?line {STRes462,S462} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI037.xsd','./msxsdtest/complexType',valid),
+ STResList463 = [STRes462|STResList462],
+ ?line ITRes204 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI037.xml','./msxsdtest/complexType',valid,S462),
+ ITResList205 = [ITRes204|ITResList204],
+
+
+ ?line {STRes463,S463} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI038.xsd','./msxsdtest/complexType',valid),
+ STResList464 = [STRes463|STResList463],
+ ?line ITRes205 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI038.xml','./msxsdtest/complexType',invalid,S463),
+ ITResList206 = [ITRes205|ITResList205],
+
+
+ ?line {STRes464,S464} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI039.xsd','./msxsdtest/complexType',valid),
+ STResList465 = [STRes464|STResList464],
+ ?line ITRes206 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI039.xml','./msxsdtest/complexType',invalid,S464),
+ ITResList207 = [ITRes206|ITResList206],
+
+
+ ?line {STRes465,S465} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI040.xsd','./msxsdtest/complexType',valid),
+ STResList466 = [STRes465|STResList465],
+ ?line ITRes207 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI040.xml','./msxsdtest/complexType',valid,S465),
+ ITResList208 = [ITRes207|ITResList207],
+
+
+ ?line {STRes466,S466} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI041.xsd','./msxsdtest/complexType',valid),
+ STResList467 = [STRes466|STResList466],
+ ?line ITRes208 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI041.xml','./msxsdtest/complexType',valid,S466),
+ ITResList209 = [ITRes208|ITResList208],
+
+
+ ?line {STRes467,S467} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI042.xsd','./msxsdtest/complexType',valid),
+ STResList468 = [STRes467|STResList467],
+ ?line ITRes209 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI042.xml','./msxsdtest/complexType',invalid,S467),
+ ITResList210 = [ITRes209|ITResList209],
+
+
+ ?line {STRes468,S468} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI043.xsd','./msxsdtest/complexType',valid),
+ STResList469 = [STRes468|STResList468],
+ ?line ITRes210 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI043.xml','./msxsdtest/complexType',valid,S468),
+ ITResList211 = [ITRes210|ITResList210],
+
+
+ ?line {STRes469,S469} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI044.xsd','./msxsdtest/complexType',valid),
+ STResList470 = [STRes469|STResList469],
+ ?line ITRes211 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI044.xml','./msxsdtest/complexType',valid,S469),
+ ITResList212 = [ITRes211|ITResList211],
+
+
+ ?line {STRes470,S470} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI045.xsd','./msxsdtest/complexType',valid),
+ STResList471 = [STRes470|STResList470],
+ ?line ITRes212 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI045.xml','./msxsdtest/complexType',invalid,S470),
+ ITResList213 = [ITRes212|ITResList212],
+
+
+ ?line {STRes471,S471} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI046.xsd','./msxsdtest/complexType',valid),
+ STResList472 = [STRes471|STResList471],
+ ?line ITRes213 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI046.xml','./msxsdtest/complexType',valid,S471),
+ ITResList214 = [ITRes213|ITResList213],
+
+
+ ?line {STRes472,S472} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI047.xsd','./msxsdtest/complexType',valid),
+ STResList473 = [STRes472|STResList472],
+ ?line ITRes214 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI047.xml','./msxsdtest/complexType',valid,S472),
+ ITResList215 = [ITRes214|ITResList214],
+
+
+ ?line {STRes473,S473} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI048.xsd','./msxsdtest/complexType',valid),
+ STResList474 = [STRes473|STResList473],
+ ?line ITRes215 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI048.xml','./msxsdtest/complexType',invalid,S473),
+ ITResList216 = [ITRes215|ITResList215],
+
+
+ ?line {STRes474,S474} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI049.xsd','./msxsdtest/complexType',valid),
+ STResList475 = [STRes474|STResList474],
+ ?line ITRes216 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI049.xml','./msxsdtest/complexType',invalid,S474),
+ ITResList217 = [ITRes216|ITResList216],
+
+
+ ?line {STRes475,S475} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctI050.xsd','./msxsdtest/complexType',valid),
+ STResList476 = [STRes475|STResList475],
+ ?line ITRes217 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctI050.xml','./msxsdtest/complexType',valid,S475),
+ ITResList218 = [ITRes217|ITResList217],
+
+
+ ?line {STRes476,S476} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctJ001.xsd','./msxsdtest/complexType',valid),
+ STResList477 = [STRes476|STResList476],
+ ?line ITRes218 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctJ001.xml','./msxsdtest/complexType',valid,S476),
+ ITResList219 = [ITRes218|ITResList218],
+
+
+ ?line {STRes477,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctJ002.xsd','./msxsdtest/complexType',invalid),
+ STResList478 = [STRes477|STResList477],
+
+
+ ?line {STRes478,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctJ003.xsd','./msxsdtest/complexType',invalid),
+ STResList479 = [STRes478|STResList478],
+
+
+ ?line {STRes479,S479} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctK001.xsd','./msxsdtest/complexType',valid),
+ STResList480 = [STRes479|STResList479],
+ ?line ITRes219 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctK001.xml','./msxsdtest/complexType',valid,S479),
+ ITResList220 = [ITRes219|ITResList219],
+
+
+ ?line {STRes480,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctK002.xsd','./msxsdtest/complexType',invalid),
+ STResList481 = [STRes480|STResList480],
+
+
+ ?line {STRes481,S481} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctL001.xsd','./msxsdtest/complexType',valid),
+ STResList482 = [STRes481|STResList481],
+ ?line ITRes220 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctL001.xml','./msxsdtest/complexType',invalid,S481),
+ ITResList221 = [ITRes220|ITResList220],
+
+
+ ?line {STRes482,S482} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctL002.xsd','./msxsdtest/complexType',valid),
+ STResList483 = [STRes482|STResList482],
+ ?line ITRes221 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctL002.xml','./msxsdtest/complexType',invalid,S482),
+ ITResList222 = [ITRes221|ITResList221],
+
+
+ ?line {STRes483,S483} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctL003.xsd','./msxsdtest/complexType',valid),
+ STResList484 = [STRes483|STResList483],
+ ?line ITRes222 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctL003.xml','./msxsdtest/complexType',valid,S483),
+ ITResList223 = [ITRes222|ITResList222],
+
+
+ ?line {STRes484,S484} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctL004.xsd','./msxsdtest/complexType',valid),
+ STResList485 = [STRes484|STResList484],
+ ?line ITRes223 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctL004.xml','./msxsdtest/complexType',invalid,S484),
+ ITResList224 = [ITRes223|ITResList223],
+
+
+ ?line {STRes485,S485} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctL005.xsd','./msxsdtest/complexType',valid),
+ STResList486 = [STRes485|STResList485],
+ ?line ITRes224 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctL005.xml','./msxsdtest/complexType',valid,S485),
+ ITResList225 = [ITRes224|ITResList224],
+
+
+ ?line {STRes486,S486} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctL006.xsd','./msxsdtest/complexType',valid),
+ STResList487 = [STRes486|STResList486],
+ ?line ITRes225 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctL006.xml','./msxsdtest/complexType',invalid,S486),
+ ITResList226 = [ITRes225|ITResList225],
+
+
+ ?line {STRes487,S487} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctL007.xsd','./msxsdtest/complexType',valid),
+ STResList488 = [STRes487|STResList487],
+ ?line ITRes226 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctL007.xml','./msxsdtest/complexType',valid,S487),
+ ITResList227 = [ITRes226|ITResList226],
+
+
+ ?line {STRes488,S488} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctL008.xsd','./msxsdtest/complexType',valid),
+ STResList489 = [STRes488|STResList488],
+ ?line ITRes227 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctL008.xml','./msxsdtest/complexType',valid,S488),
+ ITResList228 = [ITRes227|ITResList227],
+
+
+ ?line {STRes489,S489} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctL009.xsd','./msxsdtest/complexType',valid),
+ STResList490 = [STRes489|STResList489],
+ ?line ITRes228 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctL009.xml','./msxsdtest/complexType',invalid,S489),
+ ITResList229 = [ITRes228|ITResList228],
+
+
+ ?line {STRes490,S490} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctL010.xsd','./msxsdtest/complexType',valid),
+ STResList491 = [STRes490|STResList490],
+ ?line ITRes229 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctL010.xml','./msxsdtest/complexType',invalid,S490),
+ ITResList230 = [ITRes229|ITResList229],
+
+
+ ?line {STRes491,S491} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctL011.xsd','./msxsdtest/complexType',valid),
+ STResList492 = [STRes491|STResList491],
+ ?line ITRes230 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctL011.xml','./msxsdtest/complexType',valid,S491),
+ ITResList231 = [ITRes230|ITResList230],
+
+
+ ?line {STRes492,S492} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctL012.xsd','./msxsdtest/complexType',valid),
+ STResList493 = [STRes492|STResList492],
+ ?line ITRes231 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctL012.xml','./msxsdtest/complexType',invalid,S492),
+ ITResList232 = [ITRes231|ITResList231],
+
+
+ ?line {STRes493,S493} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctL013.xsd','./msxsdtest/complexType',valid),
+ STResList494 = [STRes493|STResList493],
+ ?line ITRes232 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctL013.xml','./msxsdtest/complexType',invalid,S493),
+ ITResList233 = [ITRes232|ITResList232],
+
+
+ ?line {STRes494,S494} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctL014.xsd','./msxsdtest/complexType',valid),
+ STResList495 = [STRes494|STResList494],
+ ?line ITRes233 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctL014.xml','./msxsdtest/complexType',valid,S494),
+ ITResList234 = [ITRes233|ITResList233],
+
+
+ ?line {STRes495,S495} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctL015.xsd','./msxsdtest/complexType',valid),
+ STResList496 = [STRes495|STResList495],
+ ?line ITRes234 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctL015.xml','./msxsdtest/complexType',valid,S495),
+ ITResList235 = [ITRes234|ITResList234],
+
+
+ ?line {STRes496,S496} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctL016.xsd','./msxsdtest/complexType',valid),
+ STResList497 = [STRes496|STResList496],
+ ?line ITRes235 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctL016.xml','./msxsdtest/complexType',valid,S496),
+ ITResList236 = [ITRes235|ITResList235],
+
+
+ ?line {STRes497,S497} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctL017.xsd','./msxsdtest/complexType',valid),
+ STResList498 = [STRes497|STResList497],
+ ?line ITRes236 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctL017.xml','./msxsdtest/complexType',valid,S497),
+ ITResList237 = [ITRes236|ITResList236],
+
+
+ ?line {STRes498,S498} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctL018.xsd','./msxsdtest/complexType',valid),
+ STResList499 = [STRes498|STResList498],
+ ?line ITRes237 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctL018.xml','./msxsdtest/complexType',valid,S498),
+ ITResList238 = [ITRes237|ITResList237],
+
+
+ ?line {STRes499,S499} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctL019.xsd','./msxsdtest/complexType',valid),
+ STResList500 = [STRes499|STResList499],
+ ?line ITRes238 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctL019.xml','./msxsdtest/complexType',valid,S499),
+ ITResList239 = [ITRes238|ITResList238],
+
+
+ ?line {STRes500,S500} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctL020.xsd','./msxsdtest/complexType',valid),
+ STResList501 = [STRes500|STResList500],
+ ?line ITRes239 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctL020.xml','./msxsdtest/complexType',invalid,S500),
+ ITResList240 = [ITRes239|ITResList239],
+
+
+ ?line {STRes501,S501} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctL021.xsd','./msxsdtest/complexType',valid),
+ STResList502 = [STRes501|STResList501],
+ ?line ITRes240 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctL021.xml','./msxsdtest/complexType',valid,S501),
+ ITResList241 = [ITRes240|ITResList240],
+
+
+ ?line {STRes502,S502} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/bug67200.xsd','./msxsdtest/complexType',valid),
+ STResList503 = [STRes502|STResList502],
+ ?line ITRes241 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/bug67200.xml','./msxsdtest/complexType',valid,S502),
+ ITResList242 = [ITRes241|ITResList241],
+
+
+ ?line {STRes503,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctM001.xsd','./msxsdtest/complexType',invalid),
+ STResList504 = [STRes503|STResList503],
+
+
+ ?line {STRes504,S504} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctM002.xsd','./msxsdtest/complexType',valid),
+ STResList505 = [STRes504|STResList504],
+ ?line ITRes242 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctM002.xml','./msxsdtest/complexType',valid,S504),
+ ITResList243 = [ITRes242|ITResList242],
+
+
+ ?line {STRes505,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctM003.xsd','./msxsdtest/complexType',invalid),
+ STResList506 = [STRes505|STResList505],
+
+
+ ?line {STRes506,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctM004.xsd','./msxsdtest/complexType',invalid),
+ STResList507 = [STRes506|STResList506],
+
+
+ ?line {STRes507,S507} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctN001.xsd','./msxsdtest/complexType',valid),
+ STResList508 = [STRes507|STResList507],
+ ?line ITRes243 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctN001.xml','./msxsdtest/complexType',valid,S507),
+ ITResList244 = [ITRes243|ITResList243],
+
+
+ ?line {STRes508,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctN002.xsd','./msxsdtest/complexType',invalid),
+ STResList509 = [STRes508|STResList508],
+
+
+ ?line {STRes509,S509} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctN003.xsd','./msxsdtest/complexType',valid),
+ STResList510 = [STRes509|STResList509],
+ ?line ITRes244 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctN003.xml','./msxsdtest/complexType',valid,S509),
+ ITResList245 = [ITRes244|ITResList244],
+
+
+ ?line {STRes510,S510} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctN004.xsd','./msxsdtest/complexType',valid),
+ STResList511 = [STRes510|STResList510],
+ ?line ITRes245 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctN004.xml','./msxsdtest/complexType',valid,S510),
+ ITResList246 = [ITRes245|ITResList245],
+
+
+ ?line {STRes511,S511} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctO001.xsd','./msxsdtest/complexType',valid),
+ STResList512 = [STRes511|STResList511],
+ ?line ITRes246 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctO001.xml','./msxsdtest/complexType',valid,S511),
+ ITResList247 = [ITRes246|ITResList246],
+
+
+ ?line {STRes512,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctO002.xsd','./msxsdtest/complexType',invalid),
+ STResList513 = [STRes512|STResList512],
+
+
+ ?line {STRes513,S513} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctO003.xsd','./msxsdtest/complexType',valid),
+ STResList514 = [STRes513|STResList513],
+ ?line ITRes247 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctO003.xml','./msxsdtest/complexType',valid,S513),
+ ITResList248 = [ITRes247|ITResList247],
+
+
+ ?line {STRes514,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctO004.xsd','./msxsdtest/complexType',invalid),
+ STResList515 = [STRes514|STResList514],
+
+
+ ?line {STRes515,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctO005.xsd','./msxsdtest/complexType',invalid),
+ STResList516 = [STRes515|STResList515],
+
+
+ ?line {STRes516,S516} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctO006.xsd','./msxsdtest/complexType',valid),
+ STResList517 = [STRes516|STResList516],
+ ?line ITRes248 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/complexType/ctO006.xml','./msxsdtest/complexType',valid,S516),
+ ITResList249 = [ITRes248|ITResList248],
+
+
+ ?line {STRes517,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/complexType/ctO007.xsd','./msxsdtest/complexType',invalid),
+ STResList518 = [STRes517|STResList517],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList518,ITResList249).
+
+%% 3.3.2 XML Representation of Element Declaration.
+%% 3.3.4 Element Declaration Validation Rules.
+%% element Validation checking.
+%% Regular Expression Validation checking.
+%% Bug Regressions Specs section: 3.3.4
+
+elem(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemA001.xsd','./msxsdtest/element',invalid),
+ STResList1 = [STRes0|STResList0],
+
+
+ ?line {STRes1,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemA002.xsd','./msxsdtest/element',valid),
+ STResList2 = [STRes1|STResList1],
+
+
+ ?line {STRes2,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemA003.xsd','./msxsdtest/element',valid),
+ STResList3 = [STRes2|STResList2],
+
+
+ ?line {STRes3,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemA004.xsd','./msxsdtest/element',valid),
+ STResList4 = [STRes3|STResList3],
+
+
+ ?line {STRes4,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemA005.xsd','./msxsdtest/element',valid),
+ STResList5 = [STRes4|STResList4],
+
+
+ ?line {STRes5,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemA006.xsd','./msxsdtest/element',invalid),
+ STResList6 = [STRes5|STResList5],
+
+
+ ?line {STRes6,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemA007.xsd','./msxsdtest/element',valid),
+ STResList7 = [STRes6|STResList6],
+
+
+ ?line {STRes7,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemA009.xsd','./msxsdtest/element',invalid),
+ STResList8 = [STRes7|STResList7],
+
+
+ ?line {STRes8,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemA010.xsd','./msxsdtest/element',invalid),
+ STResList9 = [STRes8|STResList8],
+
+
+ ?line {STRes9,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemA011.xsd','./msxsdtest/element',invalid),
+ STResList10 = [STRes9|STResList9],
+
+
+ ?line {STRes10,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemA012.xsd','./msxsdtest/element',invalid),
+ STResList11 = [STRes10|STResList10],
+
+
+ ?line {STRes11,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemA013.xsd','./msxsdtest/element',invalid),
+ STResList12 = [STRes11|STResList11],
+
+
+ ?line {STRes12,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemA014.xsd','./msxsdtest/element',invalid),
+ STResList13 = [STRes12|STResList12],
+
+
+ ?line {STRes13,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemA015.xsd','./msxsdtest/element',valid),
+ STResList14 = [STRes13|STResList13],
+
+
+ ?line {STRes14,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemA016.xsd','./msxsdtest/element',valid),
+ STResList15 = [STRes14|STResList14],
+
+
+ ?line {STRes15,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemA017.xsd','./msxsdtest/element',valid),
+ STResList16 = [STRes15|STResList15],
+
+
+ ?line {STRes16,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemB001.xsd','./msxsdtest/element',valid),
+ STResList17 = [STRes16|STResList16],
+
+
+ ?line {STRes17,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemB002.xsd','./msxsdtest/element',valid),
+ STResList18 = [STRes17|STResList17],
+
+
+ ?line {STRes18,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemB003.xsd','./msxsdtest/element',invalid),
+ STResList19 = [STRes18|STResList18],
+
+
+ ?line {STRes19,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemB004.xsd','./msxsdtest/element',invalid),
+ STResList20 = [STRes19|STResList19],
+
+
+ ?line {STRes20,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemB005.xsd','./msxsdtest/element',invalid),
+ STResList21 = [STRes20|STResList20],
+
+
+ ?line {STRes21,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemB006.xsd','./msxsdtest/element',invalid),
+ STResList22 = [STRes21|STResList21],
+
+
+ ?line {STRes22,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemB007.xsd','./msxsdtest/element',valid),
+ STResList23 = [STRes22|STResList22],
+
+
+ ?line {STRes23,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemB008.xsd','./msxsdtest/element',valid),
+ STResList24 = [STRes23|STResList23],
+
+
+ ?line {STRes24,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemB009.xsd','./msxsdtest/element',invalid),
+ STResList25 = [STRes24|STResList24],
+
+
+ ?line {STRes25,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemB010.xsd','./msxsdtest/element',invalid),
+ STResList26 = [STRes25|STResList25],
+
+
+ ?line {STRes26,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemC001.xsd','./msxsdtest/element',valid),
+ STResList27 = [STRes26|STResList26],
+
+
+ ?line {STRes27,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemC002.xsd','./msxsdtest/element',valid),
+ STResList28 = [STRes27|STResList27],
+
+
+ ?line {STRes28,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemC003.xsd','./msxsdtest/element',valid),
+ STResList29 = [STRes28|STResList28],
+
+
+ ?line {STRes29,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemC004.xsd','./msxsdtest/element',valid),
+ STResList30 = [STRes29|STResList29],
+
+
+ ?line {STRes30,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemC005.xsd','./msxsdtest/element',valid),
+ STResList31 = [STRes30|STResList30],
+
+
+ ?line {STRes31,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemC006.xsd','./msxsdtest/element',valid),
+ STResList32 = [STRes31|STResList31],
+
+
+ ?line {STRes32,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemC007.xsd','./msxsdtest/element',valid),
+ STResList33 = [STRes32|STResList32],
+
+
+ ?line {STRes33,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemC008.xsd','./msxsdtest/element',valid),
+ STResList34 = [STRes33|STResList33],
+
+
+ ?line {STRes34,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemC009.xsd','./msxsdtest/element',invalid),
+ STResList35 = [STRes34|STResList34],
+
+
+ ?line {STRes35,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemC010.xsd','./msxsdtest/element',invalid),
+ STResList36 = [STRes35|STResList35],
+
+
+ ?line {STRes36,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemC011.xsd','./msxsdtest/element',invalid),
+ STResList37 = [STRes36|STResList36],
+
+
+ ?line {STRes37,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemC012.xsd','./msxsdtest/element',invalid),
+ STResList38 = [STRes37|STResList37],
+
+
+ ?line {STRes38,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemC013.xsd','./msxsdtest/element',invalid),
+ STResList39 = [STRes38|STResList38],
+
+
+ ?line {STRes39,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemC014.xsd','./msxsdtest/element',invalid),
+ STResList40 = [STRes39|STResList39],
+
+
+ ?line {STRes40,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemC015.xsd','./msxsdtest/element',invalid),
+ STResList41 = [STRes40|STResList40],
+
+
+ ?line {STRes41,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemC016.xsd','./msxsdtest/element',invalid),
+ STResList42 = [STRes41|STResList41],
+
+
+ ?line {STRes42,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemC017.xsd','./msxsdtest/element',invalid),
+ STResList43 = [STRes42|STResList42],
+
+
+ ?line {STRes43,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemC018.xsd','./msxsdtest/element',valid),
+ STResList44 = [STRes43|STResList43],
+
+
+ ?line {STRes44,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemC020.xsd','./msxsdtest/element',valid),
+ STResList45 = [STRes44|STResList44],
+
+
+ ?line {STRes45,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemD001.xsd','./msxsdtest/element',valid),
+ STResList46 = [STRes45|STResList45],
+
+
+ ?line {STRes46,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemD002.xsd','./msxsdtest/element',valid),
+ STResList47 = [STRes46|STResList46],
+
+
+ ?line {STRes47,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemD003.xsd','./msxsdtest/element',invalid),
+ STResList48 = [STRes47|STResList47],
+
+
+ ?line {STRes48,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemD004.xsd','./msxsdtest/element',invalid),
+ STResList49 = [STRes48|STResList48],
+
+
+ ?line {STRes49,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemD005.xsd','./msxsdtest/element',invalid),
+ STResList50 = [STRes49|STResList49],
+
+
+ ?line {STRes50,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemD006.xsd','./msxsdtest/element',valid),
+ STResList51 = [STRes50|STResList50],
+
+
+ ?line {STRes51,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemE001.xsd','./msxsdtest/element',valid),
+ STResList52 = [STRes51|STResList51],
+
+
+ ?line {STRes52,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemE002.xsd','./msxsdtest/element',valid),
+ STResList53 = [STRes52|STResList52],
+
+
+ ?line {STRes53,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemE003.xsd','./msxsdtest/element',valid),
+ STResList54 = [STRes53|STResList53],
+
+
+ ?line {STRes54,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemE004.xsd','./msxsdtest/element',valid),
+ STResList55 = [STRes54|STResList54],
+
+
+ ?line {STRes55,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemE005.xsd','./msxsdtest/element',valid),
+ STResList56 = [STRes55|STResList55],
+
+
+ ?line {STRes56,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemE006.xsd','./msxsdtest/element',invalid),
+ STResList57 = [STRes56|STResList56],
+
+
+ ?line {STRes57,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemE007.xsd','./msxsdtest/element',invalid),
+ STResList58 = [STRes57|STResList57],
+
+
+ ?line {STRes58,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemE008.xsd','./msxsdtest/element',invalid),
+ STResList59 = [STRes58|STResList58],
+
+
+ ?line {STRes59,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemE009.xsd','./msxsdtest/element',invalid),
+ STResList60 = [STRes59|STResList59],
+
+
+ ?line {STRes60,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemF001.xsd','./msxsdtest/element',valid),
+ STResList61 = [STRes60|STResList60],
+
+
+ ?line {STRes61,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemF002.xsd','./msxsdtest/element',valid),
+ STResList62 = [STRes61|STResList61],
+
+
+ ?line {STRes62,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemF003.xsd','./msxsdtest/element',valid),
+ STResList63 = [STRes62|STResList62],
+
+
+ ?line {STRes63,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemF004.xsd','./msxsdtest/element',invalid),
+ STResList64 = [STRes63|STResList63],
+
+
+ ?line {STRes64,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemF005.xsd','./msxsdtest/element',valid),
+ STResList65 = [STRes64|STResList64],
+
+
+ ?line {STRes65,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemF006.xsd','./msxsdtest/element',invalid),
+ STResList66 = [STRes65|STResList65],
+
+
+ ?line {STRes66,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemF007.xsd','./msxsdtest/element',invalid),
+ STResList67 = [STRes66|STResList66],
+
+
+ ?line {STRes67,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemF008.xsd','./msxsdtest/element',invalid),
+ STResList68 = [STRes67|STResList67],
+
+
+ ?line {STRes68,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemF009.xsd','./msxsdtest/element',invalid),
+ STResList69 = [STRes68|STResList68],
+
+
+ ?line {STRes69,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemF010.xsd','./msxsdtest/element',invalid),
+ STResList70 = [STRes69|STResList69],
+
+
+ ?line {STRes70,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemF011.xsd','./msxsdtest/element',invalid),
+ STResList71 = [STRes70|STResList70],
+
+
+ ?line {STRes71,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemF012.xsd','./msxsdtest/element',invalid),
+ STResList72 = [STRes71|STResList71],
+
+
+ ?line {STRes72,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemF013.xsd','./msxsdtest/element',invalid),
+ STResList73 = [STRes72|STResList72],
+
+
+ ?line {STRes73,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemF014.xsd','./msxsdtest/element',invalid),
+ STResList74 = [STRes73|STResList73],
+
+
+ ?line {STRes74,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemF015.xsd','./msxsdtest/element',invalid),
+ STResList75 = [STRes74|STResList74],
+
+
+ ?line {STRes75,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemF016.xsd','./msxsdtest/element',invalid),
+ STResList76 = [STRes75|STResList75],
+
+
+ ?line {STRes76,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemF017.xsd','./msxsdtest/element',invalid),
+ STResList77 = [STRes76|STResList76],
+
+
+ ?line {STRes77,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemF018.xsd','./msxsdtest/element',valid),
+ STResList78 = [STRes77|STResList77],
+
+
+ ?line {STRes78,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemG001.xsd','./msxsdtest/element',valid),
+ STResList79 = [STRes78|STResList78],
+
+
+ ?line {STRes79,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemG002.xsd','./msxsdtest/element',valid),
+ STResList80 = [STRes79|STResList79],
+
+
+ ?line {STRes80,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemG003.xsd','./msxsdtest/element',invalid),
+ STResList81 = [STRes80|STResList80],
+
+
+ ?line {STRes81,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemG004.xsd','./msxsdtest/element',invalid),
+ STResList82 = [STRes81|STResList81],
+
+
+ ?line {STRes82,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemG005.xsd','./msxsdtest/element',valid),
+ STResList83 = [STRes82|STResList82],
+
+
+ ?line {STRes83,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemH001.xsd','./msxsdtest/element',valid),
+ STResList84 = [STRes83|STResList83],
+
+
+ ?line {STRes84,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemH002.xsd','./msxsdtest/element',valid),
+ STResList85 = [STRes84|STResList84],
+
+
+ ?line {STRes85,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemH003.xsd','./msxsdtest/element',invalid),
+ STResList86 = [STRes85|STResList85],
+
+
+ ?line {STRes86,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemH004.xsd','./msxsdtest/element',invalid),
+ STResList87 = [STRes86|STResList86],
+
+
+ ?line {STRes87,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemH005.xsd','./msxsdtest/element',invalid),
+ STResList88 = [STRes87|STResList87],
+
+
+ ?line {STRes88,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemH006.xsd','./msxsdtest/element',invalid),
+ STResList89 = [STRes88|STResList88],
+
+
+ ?line {STRes89,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemI001.xsd','./msxsdtest/element',valid),
+ STResList90 = [STRes89|STResList89],
+
+
+ ?line {STRes90,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemI002.xsd','./msxsdtest/element',valid),
+ STResList91 = [STRes90|STResList90],
+
+
+ ?line {STRes91,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemI003.xsd','./msxsdtest/element',invalid),
+ STResList92 = [STRes91|STResList91],
+
+
+ ?line {STRes92,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemI004.xsd','./msxsdtest/element',invalid),
+ STResList93 = [STRes92|STResList92],
+
+
+ ?line {STRes93,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemI005.xsd','./msxsdtest/element',invalid),
+ STResList94 = [STRes93|STResList93],
+
+
+ ?line {STRes94,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemJ001.xsd','./msxsdtest/element',valid),
+ STResList95 = [STRes94|STResList94],
+
+
+ ?line {STRes95,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemJ002.xsd','./msxsdtest/element',valid),
+ STResList96 = [STRes95|STResList95],
+
+
+ ?line {STRes96,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemJ003.xsd','./msxsdtest/element',valid),
+ STResList97 = [STRes96|STResList96],
+
+
+ ?line {STRes97,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemJ004.xsd','./msxsdtest/element',valid),
+ STResList98 = [STRes97|STResList97],
+
+
+ ?line {STRes98,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemJ005.xsd','./msxsdtest/element',valid),
+ STResList99 = [STRes98|STResList98],
+
+
+ ?line {STRes99,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemJ006.xsd','./msxsdtest/element',invalid),
+ STResList100 = [STRes99|STResList99],
+
+
+ ?line {STRes100,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemJ007.xsd','./msxsdtest/element',invalid),
+ STResList101 = [STRes100|STResList100],
+
+
+ ?line {STRes101,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemJ008.xsd','./msxsdtest/element',invalid),
+ STResList102 = [STRes101|STResList101],
+
+
+ ?line {STRes102,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemJ009.xsd','./msxsdtest/element',valid),
+ STResList103 = [STRes102|STResList102],
+
+
+ ?line {STRes103,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemJ010.xsd','./msxsdtest/element',valid),
+ STResList104 = [STRes103|STResList103],
+
+
+ ?line {STRes104,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemJ011.xsd','./msxsdtest/element',valid),
+ STResList105 = [STRes104|STResList104],
+
+
+ ?line {STRes105,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemJ012.xsd','./msxsdtest/element',invalid),
+ STResList106 = [STRes105|STResList105],
+
+
+ ?line {STRes106,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemJ013.xsd','./msxsdtest/element',valid),
+ STResList107 = [STRes106|STResList106],
+
+
+ ?line {STRes107,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemJ014.xsd','./msxsdtest/element',invalid),
+ STResList108 = [STRes107|STResList107],
+
+
+ ?line {STRes108,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemJ015.xsd','./msxsdtest/element',invalid),
+ STResList109 = [STRes108|STResList108],
+
+
+ ?line {STRes109,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemJ016.xsd','./msxsdtest/element',invalid),
+ STResList110 = [STRes109|STResList109],
+
+
+ ?line {STRes110,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemJ017.xsd','./msxsdtest/element',valid),
+ STResList111 = [STRes110|STResList110],
+
+
+ ?line {STRes111,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemJ018.xsd','./msxsdtest/element',valid),
+ STResList112 = [STRes111|STResList111],
+
+
+ ?line {STRes112,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemJ019.xsd','./msxsdtest/element',invalid),
+ STResList113 = [STRes112|STResList112],
+
+
+ ?line {STRes113,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemJ020.xsd','./msxsdtest/element',invalid),
+ STResList114 = [STRes113|STResList113],
+
+
+ ?line {STRes114,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemJ021.xsd','./msxsdtest/element',valid),
+ STResList115 = [STRes114|STResList114],
+
+
+ ?line {STRes115,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemK001.xsd','./msxsdtest/element',valid),
+ STResList116 = [STRes115|STResList115],
+
+
+ ?line {STRes116,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemK002.xsd','./msxsdtest/element',valid),
+ STResList117 = [STRes116|STResList116],
+
+
+ ?line {STRes117,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemK003.xsd','./msxsdtest/element',invalid),
+ STResList118 = [STRes117|STResList117],
+
+
+ ?line {STRes118,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemK004.xsd','./msxsdtest/element',invalid),
+ STResList119 = [STRes118|STResList118],
+
+
+ ?line {STRes119,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemK005.xsd','./msxsdtest/element',invalid),
+ STResList120 = [STRes119|STResList119],
+
+
+ ?line {STRes120,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemK006.xsd','./msxsdtest/element',invalid),
+ STResList121 = [STRes120|STResList120],
+
+
+ ?line {STRes121,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemK007.xsd','./msxsdtest/element',invalid),
+ STResList122 = [STRes121|STResList121],
+
+
+ ?line {STRes122,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemL001.xsd','./msxsdtest/element',valid),
+ STResList123 = [STRes122|STResList122],
+
+
+ ?line {STRes123,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemL002.xsd','./msxsdtest/element',invalid),
+ STResList124 = [STRes123|STResList123],
+
+
+ ?line {STRes124,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemL003.xsd','./msxsdtest/element',invalid),
+ STResList125 = [STRes124|STResList124],
+
+
+ ?line {STRes125,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemL004.xsd','./msxsdtest/element',valid),
+ STResList126 = [STRes125|STResList125],
+
+
+ ?line {STRes126,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemL005.xsd','./msxsdtest/element',valid),
+ STResList127 = [STRes126|STResList126],
+
+
+ ?line {STRes127,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemM001.xsd','./msxsdtest/element',valid),
+ STResList128 = [STRes127|STResList127],
+
+
+ ?line {STRes128,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemM002.xsd','./msxsdtest/element',invalid),
+ STResList129 = [STRes128|STResList128],
+
+
+ ?line {STRes129,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemM003.xsd','./msxsdtest/element',invalid),
+ STResList130 = [STRes129|STResList129],
+
+
+ ?line {STRes130,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemM004.xsd','./msxsdtest/element',valid),
+ STResList131 = [STRes130|STResList130],
+
+
+ ?line {STRes131,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemM005.xsd','./msxsdtest/element',invalid),
+ STResList132 = [STRes131|STResList131],
+
+
+ ?line {STRes132,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemN001.xsd','./msxsdtest/element',valid),
+ STResList133 = [STRes132|STResList132],
+
+
+ ?line {STRes133,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemN002.xsd','./msxsdtest/element',valid),
+ STResList134 = [STRes133|STResList133],
+
+
+ ?line {STRes134,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemN003.xsd','./msxsdtest/element',valid),
+ STResList135 = [STRes134|STResList134],
+
+
+ ?line {STRes135,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemN004.xsd','./msxsdtest/element',valid),
+ STResList136 = [STRes135|STResList135],
+
+
+ ?line {STRes136,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemN005.xsd','./msxsdtest/element',valid),
+ STResList137 = [STRes136|STResList136],
+
+
+ ?line {STRes137,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemN006.xsd','./msxsdtest/element',invalid),
+ STResList138 = [STRes137|STResList137],
+
+
+ ?line {STRes138,S138} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemO001.xsd','./msxsdtest/element',valid),
+ STResList139 = [STRes138|STResList138],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemO001.xml','./msxsdtest/element',invalid,S138),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes139,S139} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemO002.xsd','./msxsdtest/element',valid),
+ STResList140 = [STRes139|STResList139],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemO002.xml','./msxsdtest/element',valid,S139),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ ?line {STRes140,S140} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemO003.xsd','./msxsdtest/element',valid),
+ STResList141 = [STRes140|STResList140],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemO003.xml','./msxsdtest/element',valid,S140),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ ?line {STRes141,S141} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemO004.xsd','./msxsdtest/element',valid),
+ STResList142 = [STRes141|STResList141],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemO004.xml','./msxsdtest/element',valid,S141),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ ?line {STRes142,S142} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemO005.xsd','./msxsdtest/element',valid),
+ STResList143 = [STRes142|STResList142],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemO005.xml','./msxsdtest/element',valid,S142),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes143,S143} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemO006.xsd','./msxsdtest/element',valid),
+ STResList144 = [STRes143|STResList143],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemO006.xml','./msxsdtest/element',valid,S143),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes144,S144} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemO007.xsd','./msxsdtest/element',valid),
+ STResList145 = [STRes144|STResList144],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemO007.xml','./msxsdtest/element',invalid,S144),
+ ITResList7 = [ITRes6|ITResList6],
+
+
+ ?line {STRes145,S145} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemO008.xsd','./msxsdtest/element',valid),
+ STResList146 = [STRes145|STResList145],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemO008.xml','./msxsdtest/element',valid,S145),
+ ITResList8 = [ITRes7|ITResList7],
+
+
+ ?line {STRes146,S146} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemO009.xsd','./msxsdtest/element',valid),
+ STResList147 = [STRes146|STResList146],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemO009.xml','./msxsdtest/element',valid,S146),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ ?line {STRes147,S147} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemO010.xsd','./msxsdtest/element',valid),
+ STResList148 = [STRes147|STResList147],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemO010.xml','./msxsdtest/element',invalid,S147),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes148,S148} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemO011.xsd','./msxsdtest/element',valid),
+ STResList149 = [STRes148|STResList148],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemO011.xml','./msxsdtest/element',invalid,S148),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes149,S149} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemO012.xsd','./msxsdtest/element',valid),
+ STResList150 = [STRes149|STResList149],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemO012.xml','./msxsdtest/element',valid,S149),
+ ITResList12 = [ITRes11|ITResList11],
+
+
+ ?line {STRes150,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemP001.xsd','./msxsdtest/element',invalid),
+ STResList151 = [STRes150|STResList150],
+
+
+ ?line {STRes151,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemP002.xsd','./msxsdtest/element',invalid),
+ STResList152 = [STRes151|STResList151],
+
+
+ ?line {STRes152,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemP003.xsd','./msxsdtest/element',valid),
+ STResList153 = [STRes152|STResList152],
+
+
+ ?line {STRes153,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemP004.xsd','./msxsdtest/element',valid),
+ STResList154 = [STRes153|STResList153],
+
+
+ ?line {STRes154,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemP005.xsd','./msxsdtest/element',invalid),
+ STResList155 = [STRes154|STResList154],
+
+
+ ?line {STRes155,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemP006.xsd','./msxsdtest/element',invalid),
+ STResList156 = [STRes155|STResList155],
+
+
+ ?line {STRes156,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemP007.xsd','./msxsdtest/element',invalid),
+ STResList157 = [STRes156|STResList156],
+
+
+ ?line {STRes157,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemP008.xsd','./msxsdtest/element',invalid),
+ STResList158 = [STRes157|STResList157],
+
+
+ ?line {STRes158,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemP009.xsd','./msxsdtest/element',invalid),
+ STResList159 = [STRes158|STResList158],
+
+
+ ?line {STRes159,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemQ001.xsd','./msxsdtest/element',valid),
+ STResList160 = [STRes159|STResList159],
+
+
+ ?line {STRes160,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemQ002.xsd','./msxsdtest/element',valid),
+ STResList161 = [STRes160|STResList160],
+
+
+ ?line {STRes161,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemQ003.xsd','./msxsdtest/element',valid),
+ STResList162 = [STRes161|STResList161],
+
+
+ ?line {STRes162,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemQ004.xsd','./msxsdtest/element',invalid),
+ STResList163 = [STRes162|STResList162],
+
+
+ ?line {STRes163,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemQ005.xsd','./msxsdtest/element',valid),
+ STResList164 = [STRes163|STResList163],
+
+
+ ?line {STRes164,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemQ006.xsd','./msxsdtest/element',invalid),
+ STResList165 = [STRes164|STResList164],
+
+
+ ?line {STRes165,S165} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemQ007.xsd','./msxsdtest/element',valid),
+ STResList166 = [STRes165|STResList165],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemQ007.xml','./msxsdtest/element',invalid,S165),
+ ITResList13 = [ITRes12|ITResList12],
+
+
+ ?line {STRes166,S166} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemQ008.xsd','./msxsdtest/element',valid),
+ STResList167 = [STRes166|STResList166],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemQ008.xml','./msxsdtest/element',valid,S166),
+ ITResList14 = [ITRes13|ITResList13],
+
+
+ ?line {STRes167,S167} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemQ009.xsd','./msxsdtest/element',valid),
+ STResList168 = [STRes167|STResList167],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemQ009.xml','./msxsdtest/element',invalid,S167),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes168,S168} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemQ010.xsd','./msxsdtest/element',valid),
+ STResList169 = [STRes168|STResList168],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemQ010.xml','./msxsdtest/element',invalid,S168),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ ?line {STRes169,S169} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemQ011.xsd','./msxsdtest/element',valid),
+ STResList170 = [STRes169|STResList169],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemQ011.xml','./msxsdtest/element',valid,S169),
+ ITResList17 = [ITRes16|ITResList16],
+
+
+ ?line {STRes170,S170} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemQ012.xsd','./msxsdtest/element',valid),
+ STResList171 = [STRes170|STResList170],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemQ012.xml','./msxsdtest/element',invalid,S170),
+ ITResList18 = [ITRes17|ITResList17],
+
+
+ ?line {STRes171,S171} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemQ013.xsd','./msxsdtest/element',valid),
+ STResList172 = [STRes171|STResList171],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemQ013.xml','./msxsdtest/element',valid,S171),
+ ITResList19 = [ITRes18|ITResList18],
+
+
+ ?line {STRes172,S172} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemQ014.xsd','./msxsdtest/element',valid),
+ STResList173 = [STRes172|STResList172],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemQ014.xml','./msxsdtest/element',invalid,S172),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes173,S173} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemQ015.xsd','./msxsdtest/element',valid),
+ STResList174 = [STRes173|STResList173],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemQ015.xml','./msxsdtest/element',valid,S173),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes174,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemQ016.xsd','./msxsdtest/element',valid),
+ STResList175 = [STRes174|STResList174],
+
+
+ ?line {STRes175,S175} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemQ017.xsd','./msxsdtest/element',valid),
+ STResList176 = [STRes175|STResList175],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemQ017.xml','./msxsdtest/element',valid,S175),
+ ITResList22 = [ITRes21|ITResList21],
+
+
+ ?line {STRes176,S176} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemQ018.xsd','./msxsdtest/element',valid),
+ STResList177 = [STRes176|STResList176],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemQ018.xml','./msxsdtest/element',invalid,S176),
+ ITResList23 = [ITRes22|ITResList22],
+
+
+ ?line {STRes177,S177} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemQ019.xsd','./msxsdtest/element',valid),
+ STResList178 = [STRes177|STResList177],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemQ019.xml','./msxsdtest/element',invalid,S177),
+ ITResList24 = [ITRes23|ITResList23],
+
+
+ ?line {STRes178,S178} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemQ020.xsd','./msxsdtest/element',valid),
+ STResList179 = [STRes178|STResList178],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemQ020.xml','./msxsdtest/element',valid,S178),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ ?line {STRes179,S179} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemQ021.xsd','./msxsdtest/element',valid),
+ STResList180 = [STRes179|STResList179],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemQ021.xml','./msxsdtest/element',valid,S179),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes180,S180} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemQ022.xsd','./msxsdtest/element',valid),
+ STResList181 = [STRes180|STResList180],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemQ022.xml','./msxsdtest/element',valid,S180),
+ ITResList27 = [ITRes26|ITResList26],
+
+
+ ?line {STRes181,S181} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemR001.xsd','./msxsdtest/element',valid),
+ STResList182 = [STRes181|STResList181],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemR001.xml','./msxsdtest/element',valid,S181),
+ ITResList28 = [ITRes27|ITResList27],
+
+
+ ?line {STRes182,S182} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemR002.xsd','./msxsdtest/element',valid),
+ STResList183 = [STRes182|STResList182],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemR002.xml','./msxsdtest/element',valid,S182),
+ ITResList29 = [ITRes28|ITResList28],
+
+
+ ?line {STRes183,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemR003.xsd','./msxsdtest/element',invalid),
+ STResList184 = [STRes183|STResList183],
+
+
+ ?line {STRes184,S184} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemR004.xsd','./msxsdtest/element',valid),
+ STResList185 = [STRes184|STResList184],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemR004.xml','./msxsdtest/element',valid,S184),
+ ITResList30 = [ITRes29|ITResList29],
+
+
+ ?line {STRes185,S185} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemR005.xsd','./msxsdtest/element',valid),
+ STResList186 = [STRes185|STResList185],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemR005.xml','./msxsdtest/element',valid,S185),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes186,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemR006.xsd','./msxsdtest/element',invalid),
+ STResList187 = [STRes186|STResList186],
+
+
+ ?line {STRes187,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemS001.xsd','./msxsdtest/element',invalid),
+ STResList188 = [STRes187|STResList187],
+
+
+ ?line {STRes188,S188} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemS002.xsd','./msxsdtest/element',valid),
+ STResList189 = [STRes188|STResList188],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemS002.xml','./msxsdtest/element',valid,S188),
+ ITResList32 = [ITRes31|ITResList31],
+
+
+ ?line {STRes189,S189} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemS003.xsd','./msxsdtest/element',valid),
+ STResList190 = [STRes189|STResList189],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemS003.xml','./msxsdtest/element',valid,S189),
+ ITResList33 = [ITRes32|ITResList32],
+
+
+ ?line {STRes190,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemS004.xsd','./msxsdtest/element',invalid),
+ STResList191 = [STRes190|STResList190],
+
+
+ ?line {STRes191,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemS005.xsd','./msxsdtest/element',invalid),
+ STResList192 = [STRes191|STResList191],
+
+
+ ?line {STRes192,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemS006.xsd','./msxsdtest/element',invalid),
+ STResList193 = [STRes192|STResList192],
+
+
+ ?line {STRes193,S193} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemS007.xsd','./msxsdtest/element',valid),
+ STResList194 = [STRes193|STResList193],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemS007.xml','./msxsdtest/element',valid,S193),
+ ITResList34 = [ITRes33|ITResList33],
+
+
+ ?line {STRes194,S194} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemS008.xsd','./msxsdtest/element',valid),
+ STResList195 = [STRes194|STResList194],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemS008.xml','./msxsdtest/element',valid,S194),
+ ITResList35 = [ITRes34|ITResList34],
+
+
+ ?line {STRes195,S195} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT001.xsd','./msxsdtest/element',valid),
+ STResList196 = [STRes195|STResList195],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT001.xml','./msxsdtest/element',invalid,S195),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes196,S196} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT002.xsd','./msxsdtest/element',valid),
+ STResList197 = [STRes196|STResList196],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT002.xml','./msxsdtest/element',valid,S196),
+ ITResList37 = [ITRes36|ITResList36],
+
+
+ ?line {STRes197,S197} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT003.xsd','./msxsdtest/element',valid),
+ STResList198 = [STRes197|STResList197],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT003.xml','./msxsdtest/element',valid,S197),
+ ITResList38 = [ITRes37|ITResList37],
+
+
+ ?line {STRes198,S198} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT004.xsd','./msxsdtest/element',valid),
+ STResList199 = [STRes198|STResList198],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT004.xml','./msxsdtest/element',invalid,S198),
+ ITResList39 = [ITRes38|ITResList38],
+
+
+ ?line {STRes199,S199} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT005.xsd','./msxsdtest/element',valid),
+ STResList200 = [STRes199|STResList199],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT005.xml','./msxsdtest/element',invalid,S199),
+ ITResList40 = [ITRes39|ITResList39],
+
+
+ ?line {STRes200,S200} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT006.xsd','./msxsdtest/element',valid),
+ STResList201 = [STRes200|STResList200],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT006.xml','./msxsdtest/element',invalid,S200),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes201,S201} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT007.xsd','./msxsdtest/element',valid),
+ STResList202 = [STRes201|STResList201],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT007.xml','./msxsdtest/element',valid,S201),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes202,S202} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT008.xsd','./msxsdtest/element',valid),
+ STResList203 = [STRes202|STResList202],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT008.xml','./msxsdtest/element',valid,S202),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes203,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT009.xsd','./msxsdtest/element',invalid),
+ STResList204 = [STRes203|STResList203],
+
+
+ ?line {STRes204,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT010.xsd','./msxsdtest/element',invalid),
+ STResList205 = [STRes204|STResList204],
+
+
+ ?line {STRes205,S205} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT011.xsd','./msxsdtest/element',valid),
+ STResList206 = [STRes205|STResList205],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT011.xml','./msxsdtest/element',invalid,S205),
+ ITResList44 = [ITRes43|ITResList43],
+
+
+ ?line {STRes206,S206} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT012.xsd','./msxsdtest/element',valid),
+ STResList207 = [STRes206|STResList206],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT012.xml','./msxsdtest/element',invalid,S206),
+ ITResList45 = [ITRes44|ITResList44],
+
+
+ ?line {STRes207,S207} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT013.xsd','./msxsdtest/element',valid),
+ STResList208 = [STRes207|STResList207],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT013.xml','./msxsdtest/element',invalid,S207),
+ ITResList46 = [ITRes45|ITResList45],
+
+
+ ?line {STRes208,S208} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT014.xsd','./msxsdtest/element',valid),
+ STResList209 = [STRes208|STResList208],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT014.xml','./msxsdtest/element',valid,S208),
+ ITResList47 = [ITRes46|ITResList46],
+
+
+ ?line {STRes209,S209} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT015.xsd','./msxsdtest/element',valid),
+ STResList210 = [STRes209|STResList209],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT015.xml','./msxsdtest/element',valid,S209),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes210,S210} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT016.xsd','./msxsdtest/element',valid),
+ STResList211 = [STRes210|STResList210],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT016.xml','./msxsdtest/element',valid,S210),
+ ITResList49 = [ITRes48|ITResList48],
+
+
+ ?line {STRes211,S211} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT017.xsd','./msxsdtest/element',valid),
+ STResList212 = [STRes211|STResList211],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT017.xml','./msxsdtest/element',invalid,S211),
+ ITResList50 = [ITRes49|ITResList49],
+
+
+ ?line {STRes212,S212} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT018.xsd','./msxsdtest/element',valid),
+ STResList213 = [STRes212|STResList212],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT018.xml','./msxsdtest/element',invalid,S212),
+ ITResList51 = [ITRes50|ITResList50],
+
+
+ ?line {STRes213,S213} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT019.xsd','./msxsdtest/element',valid),
+ STResList214 = [STRes213|STResList213],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT019.xml','./msxsdtest/element',invalid,S213),
+ ITResList52 = [ITRes51|ITResList51],
+
+
+ ?line {STRes214,S214} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT022.xsd','./msxsdtest/element',valid),
+ STResList215 = [STRes214|STResList214],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT022.xml','./msxsdtest/element',valid,S214),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes215,S215} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT024.xsd','./msxsdtest/element',valid),
+ STResList216 = [STRes215|STResList215],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT024.xml','./msxsdtest/element',invalid,S215),
+ ITResList54 = [ITRes53|ITResList53],
+
+
+ ?line {STRes216,S216} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT025.xsd','./msxsdtest/element',valid),
+ STResList217 = [STRes216|STResList216],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT025.xml','./msxsdtest/element',valid,S216),
+ ITResList55 = [ITRes54|ITResList54],
+
+
+ ?line {STRes217,S217} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT026.xsd','./msxsdtest/element',valid),
+ STResList218 = [STRes217|STResList217],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT026.xml','./msxsdtest/element',valid,S217),
+ ITResList56 = [ITRes55|ITResList55],
+
+
+ ?line {STRes218,S218} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT027.xsd','./msxsdtest/element',valid),
+ STResList219 = [STRes218|STResList218],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT027.xml','./msxsdtest/element',valid,S218),
+ ITResList57 = [ITRes56|ITResList56],
+
+
+ ?line {STRes219,S219} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT028.xsd','./msxsdtest/element',valid),
+ STResList220 = [STRes219|STResList219],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT028.xml','./msxsdtest/element',valid,S219),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes220,S220} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT029.xsd','./msxsdtest/element',valid),
+ STResList221 = [STRes220|STResList220],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT029.xml','./msxsdtest/element',valid,S220),
+ ITResList59 = [ITRes58|ITResList58],
+
+
+ ?line {STRes221,S221} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT030.xsd','./msxsdtest/element',valid),
+ STResList222 = [STRes221|STResList221],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT030.xml','./msxsdtest/element',valid,S221),
+ ITResList60 = [ITRes59|ITResList59],
+
+
+ ?line {STRes222,S222} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT031.xsd','./msxsdtest/element',valid),
+ STResList223 = [STRes222|STResList222],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT031.xml','./msxsdtest/element',invalid,S222),
+ ITResList61 = [ITRes60|ITResList60],
+
+
+ ?line {STRes223,S223} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT032.xsd','./msxsdtest/element',valid),
+ STResList224 = [STRes223|STResList223],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT032.xml','./msxsdtest/element',valid,S223),
+ ITResList62 = [ITRes61|ITResList61],
+
+
+ ?line {STRes224,S224} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT033.xsd','./msxsdtest/element',valid),
+ STResList225 = [STRes224|STResList224],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT033.xml','./msxsdtest/element',invalid,S224),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes225,S225} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT038.xsd','./msxsdtest/element',valid),
+ STResList226 = [STRes225|STResList225],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT038.xml','./msxsdtest/element',valid,S225),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes226,S226} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT039.xsd','./msxsdtest/element',valid),
+ STResList227 = [STRes226|STResList226],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT039.xml','./msxsdtest/element',invalid,S226),
+ ITResList65 = [ITRes64|ITResList64],
+
+
+ ?line {STRes227,S227} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT040.xsd','./msxsdtest/element',valid),
+ STResList228 = [STRes227|STResList227],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT040.xml','./msxsdtest/element',valid,S227),
+ ITResList66 = [ITRes65|ITResList65],
+
+
+ ?line {STRes228,S228} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT041.xsd','./msxsdtest/element',valid),
+ STResList229 = [STRes228|STResList228],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT041.xml','./msxsdtest/element',valid,S228),
+ ITResList67 = [ITRes66|ITResList66],
+
+
+ ?line {STRes229,S229} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT042.xsd','./msxsdtest/element',valid),
+ STResList230 = [STRes229|STResList229],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT042.xml','./msxsdtest/element',valid,S229),
+ ITResList68 = [ITRes67|ITResList67],
+
+
+ ?line {STRes230,S230} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT043.xsd','./msxsdtest/element',valid),
+ STResList231 = [STRes230|STResList230],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT043.xml','./msxsdtest/element',valid,S230),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes231,S231} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT044.xsd','./msxsdtest/element',valid),
+ STResList232 = [STRes231|STResList231],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT044.xml','./msxsdtest/element',valid,S231),
+ ITResList70 = [ITRes69|ITResList69],
+
+
+ ?line {STRes232,S232} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT045.xsd','./msxsdtest/element',valid),
+ STResList233 = [STRes232|STResList232],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT045.xml','./msxsdtest/element',invalid,S232),
+ ITResList71 = [ITRes70|ITResList70],
+
+
+ ?line {STRes233,S233} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT046.xsd','./msxsdtest/element',valid),
+ STResList234 = [STRes233|STResList233],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT046.xml','./msxsdtest/element',invalid,S233),
+ ITResList72 = [ITRes71|ITResList71],
+
+
+ ?line {STRes234,S234} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT047.xsd','./msxsdtest/element',valid),
+ STResList235 = [STRes234|STResList234],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT047.xml','./msxsdtest/element',invalid,S234),
+ ITResList73 = [ITRes72|ITResList72],
+
+
+ ?line {STRes235,S235} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT048.xsd','./msxsdtest/element',valid),
+ STResList236 = [STRes235|STResList235],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT048.xml','./msxsdtest/element',invalid,S235),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes236,S236} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT049.xsd','./msxsdtest/element',valid),
+ STResList237 = [STRes236|STResList236],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT049.xml','./msxsdtest/element',invalid,S236),
+ ITResList75 = [ITRes74|ITResList74],
+
+
+ ?line {STRes237,S237} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT050.xsd','./msxsdtest/element',valid),
+ STResList238 = [STRes237|STResList237],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT050.xml','./msxsdtest/element',invalid,S237),
+ ITResList76 = [ITRes75|ITResList75],
+
+
+ ?line {STRes238,S238} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT051.xsd','./msxsdtest/element',valid),
+ STResList239 = [STRes238|STResList238],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT051.xml','./msxsdtest/element',invalid,S238),
+ ITResList77 = [ITRes76|ITResList76],
+
+
+ ?line {STRes239,S239} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT052.xsd','./msxsdtest/element',valid),
+ STResList240 = [STRes239|STResList239],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT052.xml','./msxsdtest/element',invalid,S239),
+ ITResList78 = [ITRes77|ITResList77],
+
+
+ ?line {STRes240,S240} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT053.xsd','./msxsdtest/element',valid),
+ STResList241 = [STRes240|STResList240],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT053.xml','./msxsdtest/element',invalid,S240),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes241,S241} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT054.xsd','./msxsdtest/element',valid),
+ STResList242 = [STRes241|STResList241],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT054.xml','./msxsdtest/element',invalid,S241),
+ ITResList80 = [ITRes79|ITResList79],
+
+
+ ?line {STRes242,S242} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT055.xsd','./msxsdtest/element',valid),
+ STResList243 = [STRes242|STResList242],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT055.xml','./msxsdtest/element',invalid,S242),
+ ITResList81 = [ITRes80|ITResList80],
+
+
+ ?line {STRes243,S243} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT056.xsd','./msxsdtest/element',valid),
+ STResList244 = [STRes243|STResList243],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT056.xml','./msxsdtest/element',invalid,S243),
+ ITResList82 = [ITRes81|ITResList81],
+
+
+ ?line {STRes244,S244} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT057.xsd','./msxsdtest/element',valid),
+ STResList245 = [STRes244|STResList244],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT057.xml','./msxsdtest/element',invalid,S244),
+ ITResList83 = [ITRes82|ITResList82],
+
+
+ ?line {STRes245,S245} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT058.xsd','./msxsdtest/element',valid),
+ STResList246 = [STRes245|STResList245],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT058.xml','./msxsdtest/element',valid,S245),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes246,S246} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemT074.xsd','./msxsdtest/element',valid),
+ STResList247 = [STRes246|STResList246],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemT074.xml','./msxsdtest/element',invalid,S246),
+ ITResList85 = [ITRes84|ITResList84],
+
+
+ ?line {STRes247,S247} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU001.xsd','./msxsdtest/element',valid),
+ STResList248 = [STRes247|STResList247],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU001.xml','./msxsdtest/element',valid,S247),
+ ITResList86 = [ITRes85|ITResList85],
+
+
+ ?line {STRes248,S248} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU002.xsd','./msxsdtest/element',valid),
+ STResList249 = [STRes248|STResList248],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU002.xml','./msxsdtest/element',valid,S248),
+ ITResList87 = [ITRes86|ITResList86],
+
+
+ ?line {STRes249,S249} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU003.xsd','./msxsdtest/element',valid),
+ STResList250 = [STRes249|STResList249],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU003.xml','./msxsdtest/element',valid,S249),
+ ITResList88 = [ITRes87|ITResList87],
+
+
+ ?line {STRes250,S250} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU004.xsd','./msxsdtest/element',valid),
+ STResList251 = [STRes250|STResList250],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU004.xml','./msxsdtest/element',valid,S250),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes251,S251} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU005.xsd','./msxsdtest/element',valid),
+ STResList252 = [STRes251|STResList251],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU005.xml','./msxsdtest/element',valid,S251),
+ ITResList90 = [ITRes89|ITResList89],
+
+
+ ?line {STRes252,S252} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU006.xsd','./msxsdtest/element',valid),
+ STResList253 = [STRes252|STResList252],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU006.xml','./msxsdtest/element',valid,S252),
+ ITResList91 = [ITRes90|ITResList90],
+
+
+ ?line {STRes253,S253} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU007.xsd','./msxsdtest/element',valid),
+ STResList254 = [STRes253|STResList253],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU007.xml','./msxsdtest/element',valid,S253),
+ ITResList92 = [ITRes91|ITResList91],
+
+
+ ?line {STRes254,S254} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU008.xsd','./msxsdtest/element',valid),
+ STResList255 = [STRes254|STResList254],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU008.xml','./msxsdtest/element',valid,S254),
+ ITResList93 = [ITRes92|ITResList92],
+
+
+ ?line {STRes255,S255} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU009.xsd','./msxsdtest/element',valid),
+ STResList256 = [STRes255|STResList255],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU009.xml','./msxsdtest/element',valid,S255),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes256,S256} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU010.xsd','./msxsdtest/element',valid),
+ STResList257 = [STRes256|STResList256],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU010.xml','./msxsdtest/element',valid,S256),
+ ITResList95 = [ITRes94|ITResList94],
+
+
+ ?line {STRes257,S257} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU011.xsd','./msxsdtest/element',valid),
+ STResList258 = [STRes257|STResList257],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU011.xml','./msxsdtest/element',valid,S257),
+ ITResList96 = [ITRes95|ITResList95],
+
+
+ ?line {STRes258,S258} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU012.xsd','./msxsdtest/element',valid),
+ STResList259 = [STRes258|STResList258],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU012.xml','./msxsdtest/element',valid,S258),
+ ITResList97 = [ITRes96|ITResList96],
+
+
+ ?line {STRes259,S259} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU013.xsd','./msxsdtest/element',valid),
+ STResList260 = [STRes259|STResList259],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU013.xml','./msxsdtest/element',valid,S259),
+ ITResList98 = [ITRes97|ITResList97],
+
+
+ ?line {STRes260,S260} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU014.xsd','./msxsdtest/element',valid),
+ STResList261 = [STRes260|STResList260],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU014.xml','./msxsdtest/element',valid,S260),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes261,S261} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU015.xsd','./msxsdtest/element',valid),
+ STResList262 = [STRes261|STResList261],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU015.xml','./msxsdtest/element',valid,S261),
+ ITResList100 = [ITRes99|ITResList99],
+
+
+ ?line {STRes262,S262} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU017.xsd','./msxsdtest/element',valid),
+ STResList263 = [STRes262|STResList262],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU017.xml','./msxsdtest/element',valid,S262),
+ ITResList101 = [ITRes100|ITResList100],
+
+
+ ?line {STRes263,S263} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU018.xsd','./msxsdtest/element',valid),
+ STResList264 = [STRes263|STResList263],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU018.xml','./msxsdtest/element',valid,S263),
+ ITResList102 = [ITRes101|ITResList101],
+
+
+ ?line {STRes264,S264} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU019.xsd','./msxsdtest/element',valid),
+ STResList265 = [STRes264|STResList264],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU019.xml','./msxsdtest/element',valid,S264),
+ ITResList103 = [ITRes102|ITResList102],
+
+
+ ?line {STRes265,S265} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU020.xsd','./msxsdtest/element',valid),
+ STResList266 = [STRes265|STResList265],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU020.xml','./msxsdtest/element',valid,S265),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes266,S266} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU021.xsd','./msxsdtest/element',valid),
+ STResList267 = [STRes266|STResList266],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU021.xml','./msxsdtest/element',valid,S266),
+ ITResList105 = [ITRes104|ITResList104],
+
+
+ ?line {STRes267,S267} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU022.xsd','./msxsdtest/element',valid),
+ STResList268 = [STRes267|STResList267],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU022.xml','./msxsdtest/element',valid,S267),
+ ITResList106 = [ITRes105|ITResList105],
+
+
+ ?line {STRes268,S268} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU023.xsd','./msxsdtest/element',valid),
+ STResList269 = [STRes268|STResList268],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU023.xml','./msxsdtest/element',valid,S268),
+ ITResList107 = [ITRes106|ITResList106],
+
+
+ ?line {STRes269,S269} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU024.xsd','./msxsdtest/element',valid),
+ STResList270 = [STRes269|STResList269],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU024.xml','./msxsdtest/element',valid,S269),
+ ITResList108 = [ITRes107|ITResList107],
+
+
+ ?line {STRes270,S270} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemU025.xsd','./msxsdtest/element',valid),
+ STResList271 = [STRes270|STResList270],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemU025.xml','./msxsdtest/element',invalid,S270),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes271,S271} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemZ001.xsd','./msxsdtest/element',valid),
+ STResList272 = [STRes271|STResList271],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemZ001.xml','./msxsdtest/element',invalid,S271),
+ ITResList110 = [ITRes109|ITResList109],
+
+
+ ?line {STRes272,S272} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemZ002.xsd','./msxsdtest/element',valid),
+ STResList273 = [STRes272|STResList272],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemZ002.xml','./msxsdtest/element',valid,S272),
+ ITResList111 = [ITRes110|ITResList110],
+
+
+ ?line {STRes273,S273} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemZ003.xsd','./msxsdtest/element',valid),
+ STResList274 = [STRes273|STResList273],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/element/elemZ003.xml','./msxsdtest/element',valid,S273),
+ ITResList112 = [ITRes111|ITResList111],
+
+
+ ?line {STRes274,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemZ004.xsd','./msxsdtest/element',valid),
+ STResList275 = [STRes274|STResList274],
+
+
+ ?line {STRes275,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/element/elemZ005.xsd','./msxsdtest/element',valid),
+ STResList276 = [STRes275|STResList275],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList276,ITResList112).
+
+%% Syntax Checking Model Group Tests.
+%% Content Checking Model Group Tests.
+
+group(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupA001.xsd','./msxsdtest/Group',valid),
+ STResList1 = [STRes0|STResList0],
+
+
+ ?line {STRes1,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupA002.xsd','./msxsdtest/Group',valid),
+ STResList2 = [STRes1|STResList1],
+
+
+ ?line {STRes2,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupA003.xsd','./msxsdtest/Group',invalid),
+ STResList3 = [STRes2|STResList2],
+
+
+ ?line {STRes3,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupA004.xsd','./msxsdtest/Group',invalid),
+ STResList4 = [STRes3|STResList3],
+
+
+ ?line {STRes4,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupA005.xsd','./msxsdtest/Group',invalid),
+ STResList5 = [STRes4|STResList4],
+
+
+ ?line {STRes5,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupA006.xsd','./msxsdtest/Group',invalid),
+ STResList6 = [STRes5|STResList5],
+
+
+ ?line {STRes6,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupA007.xsd','./msxsdtest/Group',invalid),
+ STResList7 = [STRes6|STResList6],
+
+
+ ?line {STRes7,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupA008.xsd','./msxsdtest/Group',invalid),
+ STResList8 = [STRes7|STResList7],
+
+
+ ?line {STRes8,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupA009.xsd','./msxsdtest/Group',invalid),
+ STResList9 = [STRes8|STResList8],
+
+
+ ?line {STRes9,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupA010.xsd','./msxsdtest/Group',invalid),
+ STResList10 = [STRes9|STResList9],
+
+
+ ?line {STRes10,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupA011.xsd','./msxsdtest/Group',valid),
+ STResList11 = [STRes10|STResList10],
+
+
+ ?line {STRes11,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupA012.xsd','./msxsdtest/Group',invalid),
+ STResList12 = [STRes11|STResList11],
+
+
+ ?line {STRes12,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupB001.xsd','./msxsdtest/Group',invalid),
+ STResList13 = [STRes12|STResList12],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupB002.xsd','./msxsdtest/Group',valid),
+ STResList14 = [STRes13|STResList13],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupB002.xml','./msxsdtest/Group',valid,S13),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupB003.xsd','./msxsdtest/Group',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupB003.xml','./msxsdtest/Group',valid,S14),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupB004.xsd','./msxsdtest/Group',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupB004.xml','./msxsdtest/Group',valid,S15),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupB005.xsd','./msxsdtest/Group',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupB005.xml','./msxsdtest/Group',valid,S16),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupB006.xsd','./msxsdtest/Group',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupB006.xml','./msxsdtest/Group',valid,S17),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes18,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupB007.xsd','./msxsdtest/Group',invalid),
+ STResList19 = [STRes18|STResList18],
+
+
+ ?line {STRes19,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupB008.xsd','./msxsdtest/Group',invalid),
+ STResList20 = [STRes19|STResList19],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupB009.xsd','./msxsdtest/Group',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupB009.xml','./msxsdtest/Group',valid,S20),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupB010.xsd','./msxsdtest/Group',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupB010.xml','./msxsdtest/Group',valid,S21),
+ ITResList7 = [ITRes6|ITResList6],
+
+
+ ?line {STRes22,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupB011.xsd','./msxsdtest/Group',invalid),
+ STResList23 = [STRes22|STResList22],
+
+
+ ?line {STRes23,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupB012.xsd','./msxsdtest/Group',invalid),
+ STResList24 = [STRes23|STResList23],
+
+
+ ?line {STRes24,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupB013.xsd','./msxsdtest/Group',invalid),
+ STResList25 = [STRes24|STResList24],
+
+
+ ?line {STRes25,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupB014.xsd','./msxsdtest/Group',invalid),
+ STResList26 = [STRes25|STResList25],
+
+
+ ?line {STRes26,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupB015.xsd','./msxsdtest/Group',invalid),
+ STResList27 = [STRes26|STResList26],
+
+
+ ?line {STRes27,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupB016.xsd','./msxsdtest/Group',invalid),
+ STResList28 = [STRes27|STResList27],
+
+
+ ?line {STRes28,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupB017.xsd','./msxsdtest/Group',valid),
+ STResList29 = [STRes28|STResList28],
+
+
+ ?line {STRes29,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupC001.xsd','./msxsdtest/Group',invalid),
+ STResList30 = [STRes29|STResList29],
+
+
+ ?line {STRes30,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupC002.xsd','./msxsdtest/Group',invalid),
+ STResList31 = [STRes30|STResList30],
+
+
+ ?line {STRes31,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupC003.xsd','./msxsdtest/Group',invalid),
+ STResList32 = [STRes31|STResList31],
+
+
+ ?line {STRes32,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupC004.xsd','./msxsdtest/Group',invalid),
+ STResList33 = [STRes32|STResList32],
+
+
+ ?line {STRes33,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupC005.xsd','./msxsdtest/Group',invalid),
+ STResList34 = [STRes33|STResList33],
+
+
+ ?line {STRes34,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupC006.xsd','./msxsdtest/Group',invalid),
+ STResList35 = [STRes34|STResList34],
+
+
+ ?line {STRes35,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupC007.xsd','./msxsdtest/Group',invalid),
+ STResList36 = [STRes35|STResList35],
+
+
+ ?line {STRes36,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupC008.xsd','./msxsdtest/Group',invalid),
+ STResList37 = [STRes36|STResList36],
+
+
+ ?line {STRes37,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupC009.xsd','./msxsdtest/Group',invalid),
+ STResList38 = [STRes37|STResList37],
+
+
+ ?line {STRes38,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupC010.xsd','./msxsdtest/Group',invalid),
+ STResList39 = [STRes38|STResList38],
+
+
+ ?line {STRes39,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupC011.xsd','./msxsdtest/Group',valid),
+ STResList40 = [STRes39|STResList39],
+
+
+ ?line {STRes40,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupC012.xsd','./msxsdtest/Group',invalid),
+ STResList41 = [STRes40|STResList40],
+
+
+ ?line {STRes41,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupD001.xsd','./msxsdtest/Group',invalid),
+ STResList42 = [STRes41|STResList41],
+
+
+ ?line {STRes42,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupD002.xsd','./msxsdtest/Group',invalid),
+ STResList43 = [STRes42|STResList42],
+
+
+ ?line {STRes43,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupD003.xsd','./msxsdtest/Group',invalid),
+ STResList44 = [STRes43|STResList43],
+
+
+ ?line {STRes44,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupD004.xsd','./msxsdtest/Group',invalid),
+ STResList45 = [STRes44|STResList44],
+
+
+ ?line {STRes45,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupE001.xsd','./msxsdtest/Group',valid),
+ STResList46 = [STRes45|STResList45],
+
+
+ ?line {STRes46,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupE002.xsd','./msxsdtest/Group',invalid),
+ STResList47 = [STRes46|STResList46],
+
+
+ ?line {STRes47,S47} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupE003.xsd','./msxsdtest/Group',valid),
+ STResList48 = [STRes47|STResList47],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupE003.xml','./msxsdtest/Group',invalid,S47),
+ ITResList8 = [ITRes7|ITResList7],
+
+
+ ?line {STRes48,S48} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupE004.xsd','./msxsdtest/Group',valid),
+ STResList49 = [STRes48|STResList48],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupE004.xml','./msxsdtest/Group',valid,S48),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ ?line {STRes49,S49} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupE005.xsd','./msxsdtest/Group',valid),
+ STResList50 = [STRes49|STResList49],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupE005.xml','./msxsdtest/Group',invalid,S49),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes50,S50} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF001.xsd','./msxsdtest/Group',valid),
+ STResList51 = [STRes50|STResList50],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupF001.xml','./msxsdtest/Group',valid,S50),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes51,S51} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF002.xsd','./msxsdtest/Group',valid),
+ STResList52 = [STRes51|STResList51],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupF002.xml','./msxsdtest/Group',valid,S51),
+ ITResList12 = [ITRes11|ITResList11],
+
+
+ ?line {STRes52,S52} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF003.xsd','./msxsdtest/Group',valid),
+ STResList53 = [STRes52|STResList52],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupF003.xml','./msxsdtest/Group',invalid,S52),
+ ITResList13 = [ITRes12|ITResList12],
+
+
+ ?line {STRes53,S53} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF004.xsd','./msxsdtest/Group',valid),
+ STResList54 = [STRes53|STResList53],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupF004.xml','./msxsdtest/Group',valid,S53),
+ ITResList14 = [ITRes13|ITResList13],
+
+
+ ?line {STRes54,S54} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF005.xsd','./msxsdtest/Group',valid),
+ STResList55 = [STRes54|STResList54],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupF005.xml','./msxsdtest/Group',valid,S54),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes55,S55} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF006.xsd','./msxsdtest/Group',valid),
+ STResList56 = [STRes55|STResList55],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupF006.xml','./msxsdtest/Group',invalid,S55),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ ?line {STRes56,S56} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF007.xsd','./msxsdtest/Group',valid),
+ STResList57 = [STRes56|STResList56],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupF007.xml','./msxsdtest/Group',valid,S56),
+ ITResList17 = [ITRes16|ITResList16],
+
+
+ ?line {STRes57,S57} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF008.xsd','./msxsdtest/Group',valid),
+ STResList58 = [STRes57|STResList57],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupF008.xml','./msxsdtest/Group',invalid,S57),
+ ITResList18 = [ITRes17|ITResList17],
+
+
+ ?line {STRes58,S58} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF009.xsd','./msxsdtest/Group',valid),
+ STResList59 = [STRes58|STResList58],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupF009.xml','./msxsdtest/Group',valid,S58),
+ ITResList19 = [ITRes18|ITResList18],
+
+
+ ?line {STRes59,S59} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF010.xsd','./msxsdtest/Group',valid),
+ STResList60 = [STRes59|STResList59],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupF010.xml','./msxsdtest/Group',invalid,S59),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes60,S60} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF011.xsd','./msxsdtest/Group',valid),
+ STResList61 = [STRes60|STResList60],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupF011.xml','./msxsdtest/Group',valid,S60),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes61,S61} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF012.xsd','./msxsdtest/Group',valid),
+ STResList62 = [STRes61|STResList61],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupF012.xml','./msxsdtest/Group',invalid,S61),
+ ITResList22 = [ITRes21|ITResList21],
+
+
+ ?line {STRes62,S62} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF013.xsd','./msxsdtest/Group',valid),
+ STResList63 = [STRes62|STResList62],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupF013.xml','./msxsdtest/Group',invalid,S62),
+ ITResList23 = [ITRes22|ITResList22],
+
+
+ ?line {STRes63,S63} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF014.xsd','./msxsdtest/Group',valid),
+ STResList64 = [STRes63|STResList63],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupF014.xml','./msxsdtest/Group',valid,S63),
+ ITResList24 = [ITRes23|ITResList23],
+
+
+ ?line {STRes64,S64} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF015.xsd','./msxsdtest/Group',valid),
+ STResList65 = [STRes64|STResList64],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupF015.xml','./msxsdtest/Group',invalid,S64),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ ?line {STRes65,S65} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF016.xsd','./msxsdtest/Group',valid),
+ STResList66 = [STRes65|STResList65],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupF016.xml','./msxsdtest/Group',invalid,S65),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes66,S66} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF017.xsd','./msxsdtest/Group',valid),
+ STResList67 = [STRes66|STResList66],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupF017.xml','./msxsdtest/Group',valid,S66),
+ ITResList27 = [ITRes26|ITResList26],
+
+
+ ?line {STRes67,S67} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF018.xsd','./msxsdtest/Group',valid),
+ STResList68 = [STRes67|STResList67],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupF018.xml','./msxsdtest/Group',valid,S67),
+ ITResList28 = [ITRes27|ITResList27],
+
+
+ ?line {STRes68,S68} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF019.xsd','./msxsdtest/Group',valid),
+ STResList69 = [STRes68|STResList68],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupF019.xml','./msxsdtest/Group',invalid,S68),
+ ITResList29 = [ITRes28|ITResList28],
+
+
+ ?line {STRes69,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF020.xsd','./msxsdtest/Group',invalid),
+ STResList70 = [STRes69|STResList69],
+
+
+ ?line {STRes70,S70} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF021.xsd','./msxsdtest/Group',valid),
+ STResList71 = [STRes70|STResList70],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupF021.xml','./msxsdtest/Group',valid,S70),
+ ITResList30 = [ITRes29|ITResList29],
+
+
+ ?line {STRes71,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF022.xsd','./msxsdtest/Group',invalid),
+ STResList72 = [STRes71|STResList71],
+
+
+ ?line {STRes72,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF023.xsd','./msxsdtest/Group',invalid),
+ STResList73 = [STRes72|STResList72],
+
+
+ ?line {STRes73,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF024.xsd','./msxsdtest/Group',invalid),
+ STResList74 = [STRes73|STResList73],
+
+
+ ?line {STRes74,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupF025.xsd','./msxsdtest/Group',invalid),
+ STResList75 = [STRes74|STResList74],
+
+
+ ?line {STRes75,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupG001.xsd','./msxsdtest/Group',valid),
+ STResList76 = [STRes75|STResList75],
+
+
+ ?line {STRes76,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupG002.xsd','./msxsdtest/Group',invalid),
+ STResList77 = [STRes76|STResList76],
+
+
+ ?line {STRes77,S77} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupG003.xsd','./msxsdtest/Group',valid),
+ STResList78 = [STRes77|STResList77],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupG003.xml','./msxsdtest/Group',invalid,S77),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes78,S78} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupG004.xsd','./msxsdtest/Group',valid),
+ STResList79 = [STRes78|STResList78],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupG004.xml','./msxsdtest/Group',valid,S78),
+ ITResList32 = [ITRes31|ITResList31],
+
+
+ ?line {STRes79,S79} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupG005.xsd','./msxsdtest/Group',valid),
+ STResList80 = [STRes79|STResList79],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupG005.xml','./msxsdtest/Group',invalid,S79),
+ ITResList33 = [ITRes32|ITResList32],
+
+
+ ?line {STRes80,S80} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH001.xsd','./msxsdtest/Group',valid),
+ STResList81 = [STRes80|STResList80],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupH001.xml','./msxsdtest/Group',valid,S80),
+ ITResList34 = [ITRes33|ITResList33],
+
+
+ ?line {STRes81,S81} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH002.xsd','./msxsdtest/Group',valid),
+ STResList82 = [STRes81|STResList81],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupH002.xml','./msxsdtest/Group',valid,S81),
+ ITResList35 = [ITRes34|ITResList34],
+
+
+ ?line {STRes82,S82} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH003.xsd','./msxsdtest/Group',valid),
+ STResList83 = [STRes82|STResList82],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupH003.xml','./msxsdtest/Group',invalid,S82),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes83,S83} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH004.xsd','./msxsdtest/Group',valid),
+ STResList84 = [STRes83|STResList83],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupH004.xml','./msxsdtest/Group',valid,S83),
+ ITResList37 = [ITRes36|ITResList36],
+
+
+ ?line {STRes84,S84} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH005.xsd','./msxsdtest/Group',valid),
+ STResList85 = [STRes84|STResList84],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupH005.xml','./msxsdtest/Group',valid,S84),
+ ITResList38 = [ITRes37|ITResList37],
+
+
+ ?line {STRes85,S85} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH006.xsd','./msxsdtest/Group',valid),
+ STResList86 = [STRes85|STResList85],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupH006.xml','./msxsdtest/Group',invalid,S85),
+ ITResList39 = [ITRes38|ITResList38],
+
+
+ ?line {STRes86,S86} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH007.xsd','./msxsdtest/Group',valid),
+ STResList87 = [STRes86|STResList86],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupH007.xml','./msxsdtest/Group',valid,S86),
+ ITResList40 = [ITRes39|ITResList39],
+
+
+ ?line {STRes87,S87} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH008.xsd','./msxsdtest/Group',valid),
+ STResList88 = [STRes87|STResList87],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupH008.xml','./msxsdtest/Group',invalid,S87),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes88,S88} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH009.xsd','./msxsdtest/Group',valid),
+ STResList89 = [STRes88|STResList88],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupH009.xml','./msxsdtest/Group',valid,S88),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes89,S89} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH010.xsd','./msxsdtest/Group',valid),
+ STResList90 = [STRes89|STResList89],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupH010.xml','./msxsdtest/Group',invalid,S89),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes90,S90} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH011.xsd','./msxsdtest/Group',valid),
+ STResList91 = [STRes90|STResList90],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupH011.xml','./msxsdtest/Group',valid,S90),
+ ITResList44 = [ITRes43|ITResList43],
+
+
+ ?line {STRes91,S91} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH012.xsd','./msxsdtest/Group',valid),
+ STResList92 = [STRes91|STResList91],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupH012.xml','./msxsdtest/Group',invalid,S91),
+ ITResList45 = [ITRes44|ITResList44],
+
+
+ ?line {STRes92,S92} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH013.xsd','./msxsdtest/Group',valid),
+ STResList93 = [STRes92|STResList92],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupH013.xml','./msxsdtest/Group',invalid,S92),
+ ITResList46 = [ITRes45|ITResList45],
+
+
+ ?line {STRes93,S93} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH014.xsd','./msxsdtest/Group',valid),
+ STResList94 = [STRes93|STResList93],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupH014.xml','./msxsdtest/Group',valid,S93),
+ ITResList47 = [ITRes46|ITResList46],
+
+
+ ?line {STRes94,S94} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH015.xsd','./msxsdtest/Group',valid),
+ STResList95 = [STRes94|STResList94],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupH015.xml','./msxsdtest/Group',invalid,S94),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes95,S95} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH016.xsd','./msxsdtest/Group',valid),
+ STResList96 = [STRes95|STResList95],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupH016.xml','./msxsdtest/Group',invalid,S95),
+ ITResList49 = [ITRes48|ITResList48],
+
+
+ ?line {STRes96,S96} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH017.xsd','./msxsdtest/Group',valid),
+ STResList97 = [STRes96|STResList96],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupH017.xml','./msxsdtest/Group',valid,S96),
+ ITResList50 = [ITRes49|ITResList49],
+
+
+ ?line {STRes97,S97} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH018.xsd','./msxsdtest/Group',valid),
+ STResList98 = [STRes97|STResList97],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupH018.xml','./msxsdtest/Group',valid,S97),
+ ITResList51 = [ITRes50|ITResList50],
+
+
+ ?line {STRes98,S98} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH019.xsd','./msxsdtest/Group',valid),
+ STResList99 = [STRes98|STResList98],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupH019.xml','./msxsdtest/Group',invalid,S98),
+ ITResList52 = [ITRes51|ITResList51],
+
+
+ ?line {STRes99,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH020.xsd','./msxsdtest/Group',invalid),
+ STResList100 = [STRes99|STResList99],
+
+
+ ?line {STRes100,S100} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH021.xsd','./msxsdtest/Group',valid),
+ STResList101 = [STRes100|STResList100],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupH021.xml','./msxsdtest/Group',valid,S100),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes101,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH022.xsd','./msxsdtest/Group',invalid),
+ STResList102 = [STRes101|STResList101],
+
+
+ ?line {STRes102,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH023.xsd','./msxsdtest/Group',invalid),
+ STResList103 = [STRes102|STResList102],
+
+
+ ?line {STRes103,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH024.xsd','./msxsdtest/Group',invalid),
+ STResList104 = [STRes103|STResList103],
+
+
+ ?line {STRes104,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupH025.xsd','./msxsdtest/Group',invalid),
+ STResList105 = [STRes104|STResList104],
+
+
+ ?line {STRes105,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupI001.xsd','./msxsdtest/Group',valid),
+ STResList106 = [STRes105|STResList105],
+
+
+ ?line {STRes106,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupI002.xsd','./msxsdtest/Group',invalid),
+ STResList107 = [STRes106|STResList106],
+
+
+ ?line {STRes107,S107} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupI003.xsd','./msxsdtest/Group',valid),
+ STResList108 = [STRes107|STResList107],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupI003.xml','./msxsdtest/Group',invalid,S107),
+ ITResList54 = [ITRes53|ITResList53],
+
+
+ ?line {STRes108,S108} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupI004.xsd','./msxsdtest/Group',valid),
+ STResList109 = [STRes108|STResList108],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupI004.xml','./msxsdtest/Group',valid,S108),
+ ITResList55 = [ITRes54|ITResList54],
+
+
+ ?line {STRes109,S109} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupI005.xsd','./msxsdtest/Group',valid),
+ STResList110 = [STRes109|STResList109],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupI005.xml','./msxsdtest/Group',invalid,S109),
+ ITResList56 = [ITRes55|ITResList55],
+
+
+ ?line {STRes110,S110} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ001.xsd','./msxsdtest/Group',valid),
+ STResList111 = [STRes110|STResList110],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupJ001.xml','./msxsdtest/Group',valid,S110),
+ ITResList57 = [ITRes56|ITResList56],
+
+
+ ?line {STRes111,S111} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ002.xsd','./msxsdtest/Group',valid),
+ STResList112 = [STRes111|STResList111],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupJ002.xml','./msxsdtest/Group',valid,S111),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes112,S112} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ003.xsd','./msxsdtest/Group',valid),
+ STResList113 = [STRes112|STResList112],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupJ003.xml','./msxsdtest/Group',invalid,S112),
+ ITResList59 = [ITRes58|ITResList58],
+
+
+ ?line {STRes113,S113} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ004.xsd','./msxsdtest/Group',valid),
+ STResList114 = [STRes113|STResList113],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupJ004.xml','./msxsdtest/Group',valid,S113),
+ ITResList60 = [ITRes59|ITResList59],
+
+
+ ?line {STRes114,S114} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ005.xsd','./msxsdtest/Group',valid),
+ STResList115 = [STRes114|STResList114],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupJ005.xml','./msxsdtest/Group',valid,S114),
+ ITResList61 = [ITRes60|ITResList60],
+
+
+ ?line {STRes115,S115} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ006.xsd','./msxsdtest/Group',valid),
+ STResList116 = [STRes115|STResList115],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupJ006.xml','./msxsdtest/Group',invalid,S115),
+ ITResList62 = [ITRes61|ITResList61],
+
+
+ ?line {STRes116,S116} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ007.xsd','./msxsdtest/Group',valid),
+ STResList117 = [STRes116|STResList116],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupJ007.xml','./msxsdtest/Group',valid,S116),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes117,S117} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ008.xsd','./msxsdtest/Group',valid),
+ STResList118 = [STRes117|STResList117],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupJ008.xml','./msxsdtest/Group',invalid,S117),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes118,S118} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ009.xsd','./msxsdtest/Group',valid),
+ STResList119 = [STRes118|STResList118],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupJ009.xml','./msxsdtest/Group',valid,S118),
+ ITResList65 = [ITRes64|ITResList64],
+
+
+ ?line {STRes119,S119} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ010.xsd','./msxsdtest/Group',valid),
+ STResList120 = [STRes119|STResList119],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupJ010.xml','./msxsdtest/Group',invalid,S119),
+ ITResList66 = [ITRes65|ITResList65],
+
+
+ ?line {STRes120,S120} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ011.xsd','./msxsdtest/Group',valid),
+ STResList121 = [STRes120|STResList120],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupJ011.xml','./msxsdtest/Group',valid,S120),
+ ITResList67 = [ITRes66|ITResList66],
+
+
+ ?line {STRes121,S121} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ012.xsd','./msxsdtest/Group',valid),
+ STResList122 = [STRes121|STResList121],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupJ012.xml','./msxsdtest/Group',invalid,S121),
+ ITResList68 = [ITRes67|ITResList67],
+
+
+ ?line {STRes122,S122} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ013.xsd','./msxsdtest/Group',valid),
+ STResList123 = [STRes122|STResList122],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupJ013.xml','./msxsdtest/Group',invalid,S122),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes123,S123} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ014.xsd','./msxsdtest/Group',valid),
+ STResList124 = [STRes123|STResList123],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupJ014.xml','./msxsdtest/Group',valid,S123),
+ ITResList70 = [ITRes69|ITResList69],
+
+
+ ?line {STRes124,S124} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ015.xsd','./msxsdtest/Group',valid),
+ STResList125 = [STRes124|STResList124],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupJ015.xml','./msxsdtest/Group',invalid,S124),
+ ITResList71 = [ITRes70|ITResList70],
+
+
+ ?line {STRes125,S125} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ016.xsd','./msxsdtest/Group',valid),
+ STResList126 = [STRes125|STResList125],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupJ016.xml','./msxsdtest/Group',invalid,S125),
+ ITResList72 = [ITRes71|ITResList71],
+
+
+ ?line {STRes126,S126} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ017.xsd','./msxsdtest/Group',valid),
+ STResList127 = [STRes126|STResList126],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupJ017.xml','./msxsdtest/Group',valid,S126),
+ ITResList73 = [ITRes72|ITResList72],
+
+
+ ?line {STRes127,S127} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ018.xsd','./msxsdtest/Group',valid),
+ STResList128 = [STRes127|STResList127],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupJ018.xml','./msxsdtest/Group',valid,S127),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes128,S128} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ019.xsd','./msxsdtest/Group',valid),
+ STResList129 = [STRes128|STResList128],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupJ019.xml','./msxsdtest/Group',invalid,S128),
+ ITResList75 = [ITRes74|ITResList74],
+
+
+ ?line {STRes129,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ020.xsd','./msxsdtest/Group',invalid),
+ STResList130 = [STRes129|STResList129],
+
+
+ ?line {STRes130,S130} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ021.xsd','./msxsdtest/Group',valid),
+ STResList131 = [STRes130|STResList130],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupJ021.xml','./msxsdtest/Group',valid,S130),
+ ITResList76 = [ITRes75|ITResList75],
+
+
+ ?line {STRes131,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ022.xsd','./msxsdtest/Group',invalid),
+ STResList132 = [STRes131|STResList131],
+
+
+ ?line {STRes132,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ023.xsd','./msxsdtest/Group',invalid),
+ STResList133 = [STRes132|STResList132],
+
+
+ ?line {STRes133,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ024.xsd','./msxsdtest/Group',invalid),
+ STResList134 = [STRes133|STResList133],
+
+
+ ?line {STRes134,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupJ025.xsd','./msxsdtest/Group',invalid),
+ STResList135 = [STRes134|STResList134],
+
+
+ ?line {STRes135,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupK001.xsd','./msxsdtest/Group',valid),
+ STResList136 = [STRes135|STResList135],
+
+
+ ?line {STRes136,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupK002.xsd','./msxsdtest/Group',invalid),
+ STResList137 = [STRes136|STResList136],
+
+
+ ?line {STRes137,S137} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupK003.xsd','./msxsdtest/Group',valid),
+ STResList138 = [STRes137|STResList137],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupK003.xml','./msxsdtest/Group',invalid,S137),
+ ITResList77 = [ITRes76|ITResList76],
+
+
+ ?line {STRes138,S138} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupK004.xsd','./msxsdtest/Group',valid),
+ STResList139 = [STRes138|STResList138],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupK004.xml','./msxsdtest/Group',valid,S138),
+ ITResList78 = [ITRes77|ITResList77],
+
+
+ ?line {STRes139,S139} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupK005.xsd','./msxsdtest/Group',valid),
+ STResList140 = [STRes139|STResList139],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupK005.xml','./msxsdtest/Group',invalid,S139),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes140,S140} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL001.xsd','./msxsdtest/Group',valid),
+ STResList141 = [STRes140|STResList140],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupL001.xml','./msxsdtest/Group',valid,S140),
+ ITResList80 = [ITRes79|ITResList79],
+
+
+ ?line {STRes141,S141} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL002.xsd','./msxsdtest/Group',valid),
+ STResList142 = [STRes141|STResList141],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupL002.xml','./msxsdtest/Group',valid,S141),
+ ITResList81 = [ITRes80|ITResList80],
+
+
+ ?line {STRes142,S142} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL003.xsd','./msxsdtest/Group',valid),
+ STResList143 = [STRes142|STResList142],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupL003.xml','./msxsdtest/Group',invalid,S142),
+ ITResList82 = [ITRes81|ITResList81],
+
+
+ ?line {STRes143,S143} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL004.xsd','./msxsdtest/Group',valid),
+ STResList144 = [STRes143|STResList143],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupL004.xml','./msxsdtest/Group',valid,S143),
+ ITResList83 = [ITRes82|ITResList82],
+
+
+ ?line {STRes144,S144} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL005.xsd','./msxsdtest/Group',valid),
+ STResList145 = [STRes144|STResList144],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupL005.xml','./msxsdtest/Group',valid,S144),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes145,S145} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL006.xsd','./msxsdtest/Group',valid),
+ STResList146 = [STRes145|STResList145],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupL006.xml','./msxsdtest/Group',invalid,S145),
+ ITResList85 = [ITRes84|ITResList84],
+
+
+ ?line {STRes146,S146} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL007.xsd','./msxsdtest/Group',valid),
+ STResList147 = [STRes146|STResList146],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupL007.xml','./msxsdtest/Group',valid,S146),
+ ITResList86 = [ITRes85|ITResList85],
+
+
+ ?line {STRes147,S147} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL008.xsd','./msxsdtest/Group',valid),
+ STResList148 = [STRes147|STResList147],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupL008.xml','./msxsdtest/Group',invalid,S147),
+ ITResList87 = [ITRes86|ITResList86],
+
+
+ ?line {STRes148,S148} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL009.xsd','./msxsdtest/Group',valid),
+ STResList149 = [STRes148|STResList148],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupL009.xml','./msxsdtest/Group',valid,S148),
+ ITResList88 = [ITRes87|ITResList87],
+
+
+ ?line {STRes149,S149} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL010.xsd','./msxsdtest/Group',valid),
+ STResList150 = [STRes149|STResList149],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupL010.xml','./msxsdtest/Group',invalid,S149),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes150,S150} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL011.xsd','./msxsdtest/Group',valid),
+ STResList151 = [STRes150|STResList150],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupL011.xml','./msxsdtest/Group',valid,S150),
+ ITResList90 = [ITRes89|ITResList89],
+
+
+ ?line {STRes151,S151} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL012.xsd','./msxsdtest/Group',valid),
+ STResList152 = [STRes151|STResList151],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupL012.xml','./msxsdtest/Group',invalid,S151),
+ ITResList91 = [ITRes90|ITResList90],
+
+
+ ?line {STRes152,S152} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL013.xsd','./msxsdtest/Group',valid),
+ STResList153 = [STRes152|STResList152],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupL013.xml','./msxsdtest/Group',invalid,S152),
+ ITResList92 = [ITRes91|ITResList91],
+
+
+ ?line {STRes153,S153} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL014.xsd','./msxsdtest/Group',valid),
+ STResList154 = [STRes153|STResList153],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupL014.xml','./msxsdtest/Group',valid,S153),
+ ITResList93 = [ITRes92|ITResList92],
+
+
+ ?line {STRes154,S154} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL015.xsd','./msxsdtest/Group',valid),
+ STResList155 = [STRes154|STResList154],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupL015.xml','./msxsdtest/Group',invalid,S154),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes155,S155} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL016.xsd','./msxsdtest/Group',valid),
+ STResList156 = [STRes155|STResList155],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupL016.xml','./msxsdtest/Group',invalid,S155),
+ ITResList95 = [ITRes94|ITResList94],
+
+
+ ?line {STRes156,S156} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL017.xsd','./msxsdtest/Group',valid),
+ STResList157 = [STRes156|STResList156],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupL017.xml','./msxsdtest/Group',valid,S156),
+ ITResList96 = [ITRes95|ITResList95],
+
+
+ ?line {STRes157,S157} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL018.xsd','./msxsdtest/Group',valid),
+ STResList158 = [STRes157|STResList157],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupL018.xml','./msxsdtest/Group',valid,S157),
+ ITResList97 = [ITRes96|ITResList96],
+
+
+ ?line {STRes158,S158} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL019.xsd','./msxsdtest/Group',valid),
+ STResList159 = [STRes158|STResList158],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupL019.xml','./msxsdtest/Group',invalid,S158),
+ ITResList98 = [ITRes97|ITResList97],
+
+
+ ?line {STRes159,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL020.xsd','./msxsdtest/Group',invalid),
+ STResList160 = [STRes159|STResList159],
+
+
+ ?line {STRes160,S160} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL021.xsd','./msxsdtest/Group',valid),
+ STResList161 = [STRes160|STResList160],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupL021.xml','./msxsdtest/Group',valid,S160),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes161,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL022.xsd','./msxsdtest/Group',invalid),
+ STResList162 = [STRes161|STResList161],
+
+
+ ?line {STRes162,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL023.xsd','./msxsdtest/Group',invalid),
+ STResList163 = [STRes162|STResList162],
+
+
+ ?line {STRes163,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL024.xsd','./msxsdtest/Group',invalid),
+ STResList164 = [STRes163|STResList163],
+
+
+ ?line {STRes164,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupL025.xsd','./msxsdtest/Group',invalid),
+ STResList165 = [STRes164|STResList164],
+
+
+ ?line {STRes165,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupM001.xsd','./msxsdtest/Group',valid),
+ STResList166 = [STRes165|STResList165],
+
+
+ ?line {STRes166,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupM002.xsd','./msxsdtest/Group',invalid),
+ STResList167 = [STRes166|STResList166],
+
+
+ ?line {STRes167,S167} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupM003.xsd','./msxsdtest/Group',valid),
+ STResList168 = [STRes167|STResList167],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupM003.xml','./msxsdtest/Group',invalid,S167),
+ ITResList100 = [ITRes99|ITResList99],
+
+
+ ?line {STRes168,S168} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupM004.xsd','./msxsdtest/Group',valid),
+ STResList169 = [STRes168|STResList168],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupM004.xml','./msxsdtest/Group',valid,S168),
+ ITResList101 = [ITRes100|ITResList100],
+
+
+ ?line {STRes169,S169} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupM005.xsd','./msxsdtest/Group',valid),
+ STResList170 = [STRes169|STResList169],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupM005.xml','./msxsdtest/Group',invalid,S169),
+ ITResList102 = [ITRes101|ITResList101],
+
+
+ ?line {STRes170,S170} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN001.xsd','./msxsdtest/Group',valid),
+ STResList171 = [STRes170|STResList170],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupN001.xml','./msxsdtest/Group',valid,S170),
+ ITResList103 = [ITRes102|ITResList102],
+
+
+ ?line {STRes171,S171} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN002.xsd','./msxsdtest/Group',valid),
+ STResList172 = [STRes171|STResList171],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupN002.xml','./msxsdtest/Group',valid,S171),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes172,S172} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN003.xsd','./msxsdtest/Group',valid),
+ STResList173 = [STRes172|STResList172],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupN003.xml','./msxsdtest/Group',invalid,S172),
+ ITResList105 = [ITRes104|ITResList104],
+
+
+ ?line {STRes173,S173} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN004.xsd','./msxsdtest/Group',valid),
+ STResList174 = [STRes173|STResList173],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupN004.xml','./msxsdtest/Group',valid,S173),
+ ITResList106 = [ITRes105|ITResList105],
+
+
+ ?line {STRes174,S174} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN005.xsd','./msxsdtest/Group',valid),
+ STResList175 = [STRes174|STResList174],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupN005.xml','./msxsdtest/Group',valid,S174),
+ ITResList107 = [ITRes106|ITResList106],
+
+
+ ?line {STRes175,S175} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN006.xsd','./msxsdtest/Group',valid),
+ STResList176 = [STRes175|STResList175],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupN006.xml','./msxsdtest/Group',invalid,S175),
+ ITResList108 = [ITRes107|ITResList107],
+
+
+ ?line {STRes176,S176} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN007.xsd','./msxsdtest/Group',valid),
+ STResList177 = [STRes176|STResList176],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupN007.xml','./msxsdtest/Group',valid,S176),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes177,S177} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN008.xsd','./msxsdtest/Group',valid),
+ STResList178 = [STRes177|STResList177],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupN008.xml','./msxsdtest/Group',invalid,S177),
+ ITResList110 = [ITRes109|ITResList109],
+
+
+ ?line {STRes178,S178} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN009.xsd','./msxsdtest/Group',valid),
+ STResList179 = [STRes178|STResList178],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupN009.xml','./msxsdtest/Group',valid,S178),
+ ITResList111 = [ITRes110|ITResList110],
+
+
+ ?line {STRes179,S179} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN010.xsd','./msxsdtest/Group',valid),
+ STResList180 = [STRes179|STResList179],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupN010.xml','./msxsdtest/Group',invalid,S179),
+ ITResList112 = [ITRes111|ITResList111],
+
+
+ ?line {STRes180,S180} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN011.xsd','./msxsdtest/Group',valid),
+ STResList181 = [STRes180|STResList180],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupN011.xml','./msxsdtest/Group',valid,S180),
+ ITResList113 = [ITRes112|ITResList112],
+
+
+ ?line {STRes181,S181} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN012.xsd','./msxsdtest/Group',valid),
+ STResList182 = [STRes181|STResList181],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupN012.xml','./msxsdtest/Group',invalid,S181),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes182,S182} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN013.xsd','./msxsdtest/Group',valid),
+ STResList183 = [STRes182|STResList182],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupN013.xml','./msxsdtest/Group',invalid,S182),
+ ITResList115 = [ITRes114|ITResList114],
+
+
+ ?line {STRes183,S183} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN014.xsd','./msxsdtest/Group',valid),
+ STResList184 = [STRes183|STResList183],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupN014.xml','./msxsdtest/Group',valid,S183),
+ ITResList116 = [ITRes115|ITResList115],
+
+
+ ?line {STRes184,S184} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN015.xsd','./msxsdtest/Group',valid),
+ STResList185 = [STRes184|STResList184],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupN015.xml','./msxsdtest/Group',invalid,S184),
+ ITResList117 = [ITRes116|ITResList116],
+
+
+ ?line {STRes185,S185} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN016.xsd','./msxsdtest/Group',valid),
+ STResList186 = [STRes185|STResList185],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupN016.xml','./msxsdtest/Group',invalid,S185),
+ ITResList118 = [ITRes117|ITResList117],
+
+
+ ?line {STRes186,S186} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN017.xsd','./msxsdtest/Group',valid),
+ STResList187 = [STRes186|STResList186],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupN017.xml','./msxsdtest/Group',valid,S186),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes187,S187} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN018.xsd','./msxsdtest/Group',valid),
+ STResList188 = [STRes187|STResList187],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupN018.xml','./msxsdtest/Group',valid,S187),
+ ITResList120 = [ITRes119|ITResList119],
+
+
+ ?line {STRes188,S188} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN019.xsd','./msxsdtest/Group',valid),
+ STResList189 = [STRes188|STResList188],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupN019.xml','./msxsdtest/Group',invalid,S188),
+ ITResList121 = [ITRes120|ITResList120],
+
+
+ ?line {STRes189,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN020.xsd','./msxsdtest/Group',invalid),
+ STResList190 = [STRes189|STResList189],
+
+
+ ?line {STRes190,S190} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN021.xsd','./msxsdtest/Group',valid),
+ STResList191 = [STRes190|STResList190],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupN021.xml','./msxsdtest/Group',valid,S190),
+ ITResList122 = [ITRes121|ITResList121],
+
+
+ ?line {STRes191,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN022.xsd','./msxsdtest/Group',invalid),
+ STResList192 = [STRes191|STResList191],
+
+
+ ?line {STRes192,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN023.xsd','./msxsdtest/Group',invalid),
+ STResList193 = [STRes192|STResList192],
+
+
+ ?line {STRes193,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN024.xsd','./msxsdtest/Group',invalid),
+ STResList194 = [STRes193|STResList193],
+
+
+ ?line {STRes194,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupN025.xsd','./msxsdtest/Group',invalid),
+ STResList195 = [STRes194|STResList194],
+
+
+ ?line {STRes195,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO001.xsd','./msxsdtest/Group',valid),
+ STResList196 = [STRes195|STResList195],
+
+
+ ?line {STRes196,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO002.xsd','./msxsdtest/Group',invalid),
+ STResList197 = [STRes196|STResList196],
+
+
+ ?line {STRes197,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO003.xsd','./msxsdtest/Group',invalid),
+ STResList198 = [STRes197|STResList197],
+
+
+ ?line {STRes198,S198} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO004.xsd','./msxsdtest/Group',valid),
+ STResList199 = [STRes198|STResList198],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupO004.xml','./msxsdtest/Group',valid,S198),
+ ITResList123 = [ITRes122|ITResList122],
+
+
+ ?line {STRes199,S199} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO005.xsd','./msxsdtest/Group',valid),
+ STResList200 = [STRes199|STResList199],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupO005.xml','./msxsdtest/Group',invalid,S199),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes200,S200} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO006.xsd','./msxsdtest/Group',valid),
+ STResList201 = [STRes200|STResList200],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupO006.xml','./msxsdtest/Group',valid,S200),
+ ITResList125 = [ITRes124|ITResList124],
+
+
+ ?line {STRes201,S201} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO007.xsd','./msxsdtest/Group',valid),
+ STResList202 = [STRes201|STResList201],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupO007.xml','./msxsdtest/Group',invalid,S201),
+ ITResList126 = [ITRes125|ITResList125],
+
+
+ ?line {STRes202,S202} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO008.xsd','./msxsdtest/Group',valid),
+ STResList203 = [STRes202|STResList202],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupO008.xml','./msxsdtest/Group',valid,S202),
+ ITResList127 = [ITRes126|ITResList126],
+
+
+ ?line {STRes203,S203} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO009.xsd','./msxsdtest/Group',valid),
+ STResList204 = [STRes203|STResList203],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Group/groupO009.xml','./msxsdtest/Group',invalid,S203),
+ ITResList128 = [ITRes127|ITResList127],
+
+
+ ?line {STRes204,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO010.xsd','./msxsdtest/Group',invalid),
+ STResList205 = [STRes204|STResList204],
+
+
+ ?line {STRes205,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO011.xsd','./msxsdtest/Group',invalid),
+ STResList206 = [STRes205|STResList205],
+
+
+ ?line {STRes206,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO012.xsd','./msxsdtest/Group',invalid),
+ STResList207 = [STRes206|STResList206],
+
+
+ ?line {STRes207,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO013.xsd','./msxsdtest/Group',invalid),
+ STResList208 = [STRes207|STResList207],
+
+
+ ?line {STRes208,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO014.xsd','./msxsdtest/Group',valid),
+ STResList209 = [STRes208|STResList208],
+
+
+ ?line {STRes209,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO015.xsd','./msxsdtest/Group',invalid),
+ STResList210 = [STRes209|STResList209],
+
+
+ ?line {STRes210,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO016.xsd','./msxsdtest/Group',invalid),
+ STResList211 = [STRes210|STResList210],
+
+
+ ?line {STRes211,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO017.xsd','./msxsdtest/Group',invalid),
+ STResList212 = [STRes211|STResList211],
+
+
+ ?line {STRes212,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO018.xsd','./msxsdtest/Group',invalid),
+ STResList213 = [STRes212|STResList212],
+
+
+ ?line {STRes213,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO019.xsd','./msxsdtest/Group',invalid),
+ STResList214 = [STRes213|STResList213],
+
+
+ ?line {STRes214,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO020.xsd','./msxsdtest/Group',invalid),
+ STResList215 = [STRes214|STResList214],
+
+
+ ?line {STRes215,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO021.xsd','./msxsdtest/Group',invalid),
+ STResList216 = [STRes215|STResList215],
+
+
+ ?line {STRes216,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO022.xsd','./msxsdtest/Group',invalid),
+ STResList217 = [STRes216|STResList216],
+
+
+ ?line {STRes217,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO023.xsd','./msxsdtest/Group',invalid),
+ STResList218 = [STRes217|STResList217],
+
+
+ ?line {STRes218,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO024.xsd','./msxsdtest/Group',invalid),
+ STResList219 = [STRes218|STResList218],
+
+
+ ?line {STRes219,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO025.xsd','./msxsdtest/Group',invalid),
+ STResList220 = [STRes219|STResList219],
+
+
+ ?line {STRes220,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO026.xsd','./msxsdtest/Group',invalid),
+ STResList221 = [STRes220|STResList220],
+
+
+ ?line {STRes221,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupO027.xsd','./msxsdtest/Group',invalid),
+ STResList222 = [STRes221|STResList221],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList222,ITResList128).
+
+%% 3.11.1 The Identity-constraint Definition Schema Component.
+
+idc_(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_string.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S1),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_token.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S2),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_language.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_language.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S3),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_Name.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_Name.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S4),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_NCName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_NCName.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S5),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_ID.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_ID.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S6),
+ ITResList7 = [ITRes6|ITResList6],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_IDREF.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_IDREF.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S7),
+ ITResList8 = [ITRes7|ITResList7],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S8),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S9),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_base64Binary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_base64Binary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S10),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_hexBinary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_hexBinary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S11),
+ ITResList12 = [ITRes11|ITResList11],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S12),
+ ITResList13 = [ITRes12|ITResList12],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S13),
+ ITResList14 = [ITRes13|ITResList13],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S14),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_nonPositiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_nonPositiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S15),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_negativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_negativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S16),
+ ITResList17 = [ITRes16|ITResList16],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_long.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S17),
+ ITResList18 = [ITRes17|ITResList17],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_int.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S18),
+ ITResList19 = [ITRes18|ITResList18],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_short.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S19),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S20),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_nonNegativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_nonNegativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S21),
+ ITResList22 = [ITRes21|ITResList21],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_positiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_positiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S22),
+ ITResList23 = [ITRes22|ITResList22],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_unsignedLong.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_unsignedLong.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S23),
+ ITResList24 = [ITRes23|ITResList23],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_unsignedInt.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_unsignedInt.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S24),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_unsignedShort.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_unsignedShort.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S25),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_unsignedByte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_unsignedByte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S26),
+ ITResList27 = [ITRes26|ITResList26],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S27),
+ ITResList28 = [ITRes27|ITResList27],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S28),
+ ITResList29 = [ITRes28|ITResList28],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_QName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_QName.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S29),
+ ITResList30 = [ITRes29|ITResList29],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_NOTATION.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_NOTATION.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S30),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes31,S31} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_duration.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList32 = [STRes31|STResList31],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_duration.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S31),
+ ITResList32 = [ITRes31|ITResList31],
+
+
+ ?line {STRes32,S32} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_dateTime.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList33 = [STRes32|STResList32],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_dateTime.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S32),
+ ITResList33 = [ITRes32|ITResList32],
+
+
+ ?line {STRes33,S33} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_time.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList34 = [STRes33|STResList33],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_time.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S33),
+ ITResList34 = [ITRes33|ITResList33],
+
+
+ ?line {STRes34,S34} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_date.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList35 = [STRes34|STResList34],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_date.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S34),
+ ITResList35 = [ITRes34|ITResList34],
+
+
+ ?line {STRes35,S35} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_gYearMonth.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList36 = [STRes35|STResList35],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_gYearMonth.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S35),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes36,S36} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_gYear.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList37 = [STRes36|STResList36],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_gYear.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S36),
+ ITResList37 = [ITRes36|ITResList36],
+
+
+ ?line {STRes37,S37} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_gMonthDay.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList38 = [STRes37|STResList37],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_gMonthDay.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S37),
+ ITResList38 = [ITRes37|ITResList37],
+
+
+ ?line {STRes38,S38} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_gDay.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList39 = [STRes38|STResList38],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_gDay.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S38),
+ ITResList39 = [ITRes38|ITResList38],
+
+
+ ?line {STRes39,S39} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_gMonth.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList40 = [STRes39|STResList39],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_string_gMonth.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S39),
+ ITResList40 = [ITRes39|ITResList39],
+
+
+ ?line {STRes40,S40} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList41 = [STRes40|STResList40],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_string.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S40),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes41,S41} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList42 = [STRes41|STResList41],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S41),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes42,S42} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList43 = [STRes42|STResList42],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_token.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S42),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes43,S43} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_language.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList44 = [STRes43|STResList43],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_language.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S43),
+ ITResList44 = [ITRes43|ITResList43],
+
+
+ ?line {STRes44,S44} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_Name.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList45 = [STRes44|STResList44],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_Name.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S44),
+ ITResList45 = [ITRes44|ITResList44],
+
+
+ ?line {STRes45,S45} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_NCName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList46 = [STRes45|STResList45],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_NCName.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S45),
+ ITResList46 = [ITRes45|ITResList45],
+
+
+ ?line {STRes46,S46} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_ID.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList47 = [STRes46|STResList46],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_ID.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S46),
+ ITResList47 = [ITRes46|ITResList46],
+
+
+ ?line {STRes47,S47} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_IDREF.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList48 = [STRes47|STResList47],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_IDREF.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S47),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes48,S48} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList49 = [STRes48|STResList48],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S48),
+ ITResList49 = [ITRes48|ITResList48],
+
+
+ ?line {STRes49,S49} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList50 = [STRes49|STResList49],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S49),
+ ITResList50 = [ITRes49|ITResList49],
+
+
+ ?line {STRes50,S50} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_base64Binary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList51 = [STRes50|STResList50],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_base64Binary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S50),
+ ITResList51 = [ITRes50|ITResList50],
+
+
+ ?line {STRes51,S51} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_hexBinary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList52 = [STRes51|STResList51],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_hexBinary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S51),
+ ITResList52 = [ITRes51|ITResList51],
+
+
+ ?line {STRes52,S52} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList53 = [STRes52|STResList52],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S52),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes53,S53} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList54 = [STRes53|STResList53],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S53),
+ ITResList54 = [ITRes53|ITResList53],
+
+
+ ?line {STRes54,S54} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList55 = [STRes54|STResList54],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S54),
+ ITResList55 = [ITRes54|ITResList54],
+
+
+ ?line {STRes55,S55} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_nonPositiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList56 = [STRes55|STResList55],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_nonPositiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S55),
+ ITResList56 = [ITRes55|ITResList55],
+
+
+ ?line {STRes56,S56} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_negativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList57 = [STRes56|STResList56],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_negativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S56),
+ ITResList57 = [ITRes56|ITResList56],
+
+
+ ?line {STRes57,S57} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList58 = [STRes57|STResList57],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_long.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S57),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes58,S58} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList59 = [STRes58|STResList58],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_int.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S58),
+ ITResList59 = [ITRes58|ITResList58],
+
+
+ ?line {STRes59,S59} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList60 = [STRes59|STResList59],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_short.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S59),
+ ITResList60 = [ITRes59|ITResList59],
+
+
+ ?line {STRes60,S60} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList61 = [STRes60|STResList60],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S60),
+ ITResList61 = [ITRes60|ITResList60],
+
+
+ ?line {STRes61,S61} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_nonNegativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList62 = [STRes61|STResList61],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_nonNegativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S61),
+ ITResList62 = [ITRes61|ITResList61],
+
+
+ ?line {STRes62,S62} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_positiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList63 = [STRes62|STResList62],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_positiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S62),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes63,S63} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_unsignedLong.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList64 = [STRes63|STResList63],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_unsignedLong.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S63),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes64,S64} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_unsignedInt.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList65 = [STRes64|STResList64],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_unsignedInt.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S64),
+ ITResList65 = [ITRes64|ITResList64],
+
+
+ ?line {STRes65,S65} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_unsignedShort.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList66 = [STRes65|STResList65],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_unsignedShort.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S65),
+ ITResList66 = [ITRes65|ITResList65],
+
+
+ ?line {STRes66,S66} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_unsignedByte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList67 = [STRes66|STResList66],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_unsignedByte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S66),
+ ITResList67 = [ITRes66|ITResList66],
+
+
+ ?line {STRes67,S67} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList68 = [STRes67|STResList67],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S67),
+ ITResList68 = [ITRes67|ITResList67],
+
+
+ ?line {STRes68,S68} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList69 = [STRes68|STResList68],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S68),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes69,S69} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_QName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList70 = [STRes69|STResList69],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_QName.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S69),
+ ITResList70 = [ITRes69|ITResList69],
+
+
+ ?line {STRes70,S70} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_NOTATION.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList71 = [STRes70|STResList70],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_NOTATION.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S70),
+ ITResList71 = [ITRes70|ITResList70],
+
+
+ ?line {STRes71,S71} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_duration.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList72 = [STRes71|STResList71],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_duration.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S71),
+ ITResList72 = [ITRes71|ITResList71],
+
+
+ ?line {STRes72,S72} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_dateTime.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList73 = [STRes72|STResList72],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_dateTime.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S72),
+ ITResList73 = [ITRes72|ITResList72],
+
+
+ ?line {STRes73,S73} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_time.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList74 = [STRes73|STResList73],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_time.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S73),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes74,S74} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_date.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList75 = [STRes74|STResList74],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_date.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S74),
+ ITResList75 = [ITRes74|ITResList74],
+
+
+ ?line {STRes75,S75} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_gYearMonth.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList76 = [STRes75|STResList75],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_gYearMonth.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S75),
+ ITResList76 = [ITRes75|ITResList75],
+
+
+ ?line {STRes76,S76} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_gYear.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList77 = [STRes76|STResList76],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_gYear.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S76),
+ ITResList77 = [ITRes76|ITResList76],
+
+
+ ?line {STRes77,S77} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_gMonthDay.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList78 = [STRes77|STResList77],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_gMonthDay.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S77),
+ ITResList78 = [ITRes77|ITResList77],
+
+
+ ?line {STRes78,S78} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_gDay.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList79 = [STRes78|STResList78],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_gDay.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S78),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes79,S79} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_gMonth.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList80 = [STRes79|STResList79],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_normalizedString_gMonth.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S79),
+ ITResList80 = [ITRes79|ITResList79],
+
+
+ ?line {STRes80,S80} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList81 = [STRes80|STResList80],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_string.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S80),
+ ITResList81 = [ITRes80|ITResList80],
+
+
+ ?line {STRes81,S81} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList82 = [STRes81|STResList81],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S81),
+ ITResList82 = [ITRes81|ITResList81],
+
+
+ ?line {STRes82,S82} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList83 = [STRes82|STResList82],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_token.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S82),
+ ITResList83 = [ITRes82|ITResList82],
+
+
+ ?line {STRes83,S83} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_language.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList84 = [STRes83|STResList83],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_language.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S83),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes84,S84} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_Name.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList85 = [STRes84|STResList84],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_Name.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S84),
+ ITResList85 = [ITRes84|ITResList84],
+
+
+ ?line {STRes85,S85} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_NCName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList86 = [STRes85|STResList85],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_NCName.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S85),
+ ITResList86 = [ITRes85|ITResList85],
+
+
+ ?line {STRes86,S86} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_ID.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList87 = [STRes86|STResList86],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_ID.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S86),
+ ITResList87 = [ITRes86|ITResList86],
+
+
+ ?line {STRes87,S87} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_IDREF.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList88 = [STRes87|STResList87],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_IDREF.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S87),
+ ITResList88 = [ITRes87|ITResList87],
+
+
+ ?line {STRes88,S88} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList89 = [STRes88|STResList88],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S88),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes89,S89} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList90 = [STRes89|STResList89],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S89),
+ ITResList90 = [ITRes89|ITResList89],
+
+
+ ?line {STRes90,S90} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_base64Binary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList91 = [STRes90|STResList90],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_base64Binary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S90),
+ ITResList91 = [ITRes90|ITResList90],
+
+
+ ?line {STRes91,S91} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_hexBinary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList92 = [STRes91|STResList91],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_hexBinary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S91),
+ ITResList92 = [ITRes91|ITResList91],
+
+
+ ?line {STRes92,S92} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList93 = [STRes92|STResList92],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S92),
+ ITResList93 = [ITRes92|ITResList92],
+
+
+ ?line {STRes93,S93} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList94 = [STRes93|STResList93],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S93),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes94,S94} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList95 = [STRes94|STResList94],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S94),
+ ITResList95 = [ITRes94|ITResList94],
+
+
+ ?line {STRes95,S95} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_nonPositiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList96 = [STRes95|STResList95],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_nonPositiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S95),
+ ITResList96 = [ITRes95|ITResList95],
+
+
+ ?line {STRes96,S96} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_negativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList97 = [STRes96|STResList96],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_negativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S96),
+ ITResList97 = [ITRes96|ITResList96],
+
+
+ ?line {STRes97,S97} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList98 = [STRes97|STResList97],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_long.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S97),
+ ITResList98 = [ITRes97|ITResList97],
+
+
+ ?line {STRes98,S98} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList99 = [STRes98|STResList98],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_int.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S98),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes99,S99} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList100 = [STRes99|STResList99],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_short.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S99),
+ ITResList100 = [ITRes99|ITResList99],
+
+
+ ?line {STRes100,S100} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList101 = [STRes100|STResList100],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S100),
+ ITResList101 = [ITRes100|ITResList100],
+
+
+ ?line {STRes101,S101} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_nonNegativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList102 = [STRes101|STResList101],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_nonNegativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S101),
+ ITResList102 = [ITRes101|ITResList101],
+
+
+ ?line {STRes102,S102} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_positiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList103 = [STRes102|STResList102],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_positiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S102),
+ ITResList103 = [ITRes102|ITResList102],
+
+
+ ?line {STRes103,S103} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_unsignedLong.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList104 = [STRes103|STResList103],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_unsignedLong.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S103),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes104,S104} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_unsignedInt.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList105 = [STRes104|STResList104],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_unsignedInt.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S104),
+ ITResList105 = [ITRes104|ITResList104],
+
+
+ ?line {STRes105,S105} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_unsignedShort.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList106 = [STRes105|STResList105],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_unsignedShort.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S105),
+ ITResList106 = [ITRes105|ITResList105],
+
+
+ ?line {STRes106,S106} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_unsignedByte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList107 = [STRes106|STResList106],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_unsignedByte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S106),
+ ITResList107 = [ITRes106|ITResList106],
+
+
+ ?line {STRes107,S107} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList108 = [STRes107|STResList107],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S107),
+ ITResList108 = [ITRes107|ITResList107],
+
+
+ ?line {STRes108,S108} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList109 = [STRes108|STResList108],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S108),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes109,S109} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_QName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList110 = [STRes109|STResList109],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_QName.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S109),
+ ITResList110 = [ITRes109|ITResList109],
+
+
+ ?line {STRes110,S110} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_NOTATION.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList111 = [STRes110|STResList110],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_NOTATION.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S110),
+ ITResList111 = [ITRes110|ITResList110],
+
+
+ ?line {STRes111,S111} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_duration.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList112 = [STRes111|STResList111],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_duration.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S111),
+ ITResList112 = [ITRes111|ITResList111],
+
+
+ ?line {STRes112,S112} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_dateTime.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList113 = [STRes112|STResList112],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_dateTime.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S112),
+ ITResList113 = [ITRes112|ITResList112],
+
+
+ ?line {STRes113,S113} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_time.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList114 = [STRes113|STResList113],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_time.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S113),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes114,S114} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_date.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList115 = [STRes114|STResList114],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_date.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S114),
+ ITResList115 = [ITRes114|ITResList114],
+
+
+ ?line {STRes115,S115} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_gYearMonth.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList116 = [STRes115|STResList115],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_gYearMonth.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S115),
+ ITResList116 = [ITRes115|ITResList115],
+
+
+ ?line {STRes116,S116} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_gYear.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList117 = [STRes116|STResList116],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_gYear.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S116),
+ ITResList117 = [ITRes116|ITResList116],
+
+
+ ?line {STRes117,S117} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_gMonthDay.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList118 = [STRes117|STResList117],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_gMonthDay.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S117),
+ ITResList118 = [ITRes117|ITResList117],
+
+
+ ?line {STRes118,S118} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_gDay.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList119 = [STRes118|STResList118],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_gDay.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S118),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes119,S119} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_gMonth.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList120 = [STRes119|STResList119],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_token_gMonth.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S119),
+ ITResList120 = [ITRes119|ITResList119],
+
+
+ ?line {STRes120,S120} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList121 = [STRes120|STResList120],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_string.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S120),
+ ITResList121 = [ITRes120|ITResList120],
+
+
+ ?line {STRes121,S121} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList122 = [STRes121|STResList121],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S121),
+ ITResList122 = [ITRes121|ITResList121],
+
+
+ ?line {STRes122,S122} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList123 = [STRes122|STResList122],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_token.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S122),
+ ITResList123 = [ITRes122|ITResList122],
+
+
+ ?line {STRes123,S123} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_language.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList124 = [STRes123|STResList123],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_language.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S123),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes124,S124} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_Name.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList125 = [STRes124|STResList124],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_Name.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S124),
+ ITResList125 = [ITRes124|ITResList124],
+
+
+ ?line {STRes125,S125} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_NCName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList126 = [STRes125|STResList125],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_NCName.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S125),
+ ITResList126 = [ITRes125|ITResList125],
+
+
+ ?line {STRes126,S126} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_ID.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList127 = [STRes126|STResList126],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_ID.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S126),
+ ITResList127 = [ITRes126|ITResList126],
+
+
+ ?line {STRes127,S127} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_IDREF.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList128 = [STRes127|STResList127],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_IDREF.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S127),
+ ITResList128 = [ITRes127|ITResList127],
+
+
+ ?line {STRes128,S128} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_IDREFS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList129 = [STRes128|STResList128],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_IDREFS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S128),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes129,S129} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList130 = [STRes129|STResList129],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S129),
+ ITResList130 = [ITRes129|ITResList129],
+
+
+ ?line {STRes130,S130} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList131 = [STRes130|STResList130],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S130),
+ ITResList131 = [ITRes130|ITResList130],
+
+
+ ?line {STRes131,S131} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList132 = [STRes131|STResList131],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S131),
+ ITResList132 = [ITRes131|ITResList131],
+
+
+ ?line {STRes132,S132} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_QName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList133 = [STRes132|STResList132],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_QName.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S132),
+ ITResList133 = [ITRes132|ITResList132],
+
+
+ ?line {STRes133,S133} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_NOTATION.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList134 = [STRes133|STResList133],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_language_NOTATION.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S133),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes134,S134} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList135 = [STRes134|STResList134],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_string.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S134),
+ ITResList135 = [ITRes134|ITResList134],
+
+
+ ?line {STRes135,S135} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList136 = [STRes135|STResList135],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S135),
+ ITResList136 = [ITRes135|ITResList135],
+
+
+ ?line {STRes136,S136} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList137 = [STRes136|STResList136],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_token.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S136),
+ ITResList137 = [ITRes136|ITResList136],
+
+
+ ?line {STRes137,S137} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_language.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList138 = [STRes137|STResList137],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_language.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S137),
+ ITResList138 = [ITRes137|ITResList137],
+
+
+ ?line {STRes138,S138} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_Name.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList139 = [STRes138|STResList138],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_Name.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S138),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ ?line {STRes139,S139} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_NCName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList140 = [STRes139|STResList139],
+ ?line ITRes139 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_NCName.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S139),
+ ITResList140 = [ITRes139|ITResList139],
+
+
+ ?line {STRes140,S140} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_ID.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList141 = [STRes140|STResList140],
+ ?line ITRes140 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_ID.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S140),
+ ITResList141 = [ITRes140|ITResList140],
+
+
+ ?line {STRes141,S141} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_IDREF.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList142 = [STRes141|STResList141],
+ ?line ITRes141 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_IDREF.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S141),
+ ITResList142 = [ITRes141|ITResList141],
+
+
+ ?line {STRes142,S142} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList143 = [STRes142|STResList142],
+ ?line ITRes142 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S142),
+ ITResList143 = [ITRes142|ITResList142],
+
+
+ ?line {STRes143,S143} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList144 = [STRes143|STResList143],
+ ?line ITRes143 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S143),
+ ITResList144 = [ITRes143|ITResList143],
+
+
+ ?line {STRes144,S144} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList145 = [STRes144|STResList144],
+ ?line ITRes144 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S144),
+ ITResList145 = [ITRes144|ITResList144],
+
+
+ ?line {STRes145,S145} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList146 = [STRes145|STResList145],
+ ?line ITRes145 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S145),
+ ITResList146 = [ITRes145|ITResList145],
+
+
+ ?line {STRes146,S146} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_QName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList147 = [STRes146|STResList146],
+ ?line ITRes146 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_QName.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S146),
+ ITResList147 = [ITRes146|ITResList146],
+
+
+ ?line {STRes147,S147} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_NOTATION.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList148 = [STRes147|STResList147],
+ ?line ITRes147 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_NOTATION.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S147),
+ ITResList148 = [ITRes147|ITResList147],
+
+
+ ?line {STRes148,S148} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_duration.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList149 = [STRes148|STResList148],
+ ?line ITRes148 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_Name_duration.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S148),
+ ITResList149 = [ITRes148|ITResList148],
+
+
+ ?line {STRes149,S149} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList150 = [STRes149|STResList149],
+ ?line ITRes149 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_string.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S149),
+ ITResList150 = [ITRes149|ITResList149],
+
+
+ ?line {STRes150,S150} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList151 = [STRes150|STResList150],
+ ?line ITRes150 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S150),
+ ITResList151 = [ITRes150|ITResList150],
+
+
+ ?line {STRes151,S151} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList152 = [STRes151|STResList151],
+ ?line ITRes151 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_token.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S151),
+ ITResList152 = [ITRes151|ITResList151],
+
+
+ ?line {STRes152,S152} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_language.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList153 = [STRes152|STResList152],
+ ?line ITRes152 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_language.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S152),
+ ITResList153 = [ITRes152|ITResList152],
+
+
+ ?line {STRes153,S153} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_Name.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList154 = [STRes153|STResList153],
+ ?line ITRes153 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_Name.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S153),
+ ITResList154 = [ITRes153|ITResList153],
+
+
+ ?line {STRes154,S154} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_NCName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList155 = [STRes154|STResList154],
+ ?line ITRes154 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_NCName.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S154),
+ ITResList155 = [ITRes154|ITResList154],
+
+
+ ?line {STRes155,S155} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_ID.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList156 = [STRes155|STResList155],
+ ?line ITRes155 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_ID.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S155),
+ ITResList156 = [ITRes155|ITResList155],
+
+
+ ?line {STRes156,S156} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_IDREF.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList157 = [STRes156|STResList156],
+ ?line ITRes156 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_IDREF.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S156),
+ ITResList157 = [ITRes156|ITResList156],
+
+
+ ?line {STRes157,S157} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList158 = [STRes157|STResList157],
+ ?line ITRes157 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S157),
+ ITResList158 = [ITRes157|ITResList157],
+
+
+ ?line {STRes158,S158} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList159 = [STRes158|STResList158],
+ ?line ITRes158 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S158),
+ ITResList159 = [ITRes158|ITResList158],
+
+
+ ?line {STRes159,S159} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList160 = [STRes159|STResList159],
+ ?line ITRes159 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S159),
+ ITResList160 = [ITRes159|ITResList159],
+
+
+ ?line {STRes160,S160} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList161 = [STRes160|STResList160],
+ ?line ITRes160 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S160),
+ ITResList161 = [ITRes160|ITResList160],
+
+
+ ?line {STRes161,S161} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_QName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList162 = [STRes161|STResList161],
+ ?line ITRes161 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_QName.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S161),
+ ITResList162 = [ITRes161|ITResList161],
+
+
+ ?line {STRes162,S162} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_NOTATION.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList163 = [STRes162|STResList162],
+ ?line ITRes162 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_NOTATION.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S162),
+ ITResList163 = [ITRes162|ITResList162],
+
+
+ ?line {STRes163,S163} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_duration.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList164 = [STRes163|STResList163],
+ ?line ITRes163 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NCName_duration.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S163),
+ ITResList164 = [ITRes163|ITResList163],
+
+
+ ?line {STRes164,S164} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList165 = [STRes164|STResList164],
+ ?line ITRes164 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_string.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S164),
+ ITResList165 = [ITRes164|ITResList164],
+
+
+ ?line {STRes165,S165} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList166 = [STRes165|STResList165],
+ ?line ITRes165 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S165),
+ ITResList166 = [ITRes165|ITResList165],
+
+
+ ?line {STRes166,S166} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList167 = [STRes166|STResList166],
+ ?line ITRes166 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_token.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S166),
+ ITResList167 = [ITRes166|ITResList166],
+
+
+ ?line {STRes167,S167} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_language.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList168 = [STRes167|STResList167],
+ ?line ITRes167 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_language.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S167),
+ ITResList168 = [ITRes167|ITResList167],
+
+
+ ?line {STRes168,S168} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_Name.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList169 = [STRes168|STResList168],
+ ?line ITRes168 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_Name.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S168),
+ ITResList169 = [ITRes168|ITResList168],
+
+
+ ?line {STRes169,S169} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_NCName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList170 = [STRes169|STResList169],
+ ?line ITRes169 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_NCName.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S169),
+ ITResList170 = [ITRes169|ITResList169],
+
+
+ ?line {STRes170,S170} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_ID.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList171 = [STRes170|STResList170],
+ ?line ITRes170 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_ID.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S170),
+ ITResList171 = [ITRes170|ITResList170],
+
+
+ ?line {STRes171,S171} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_IDREF.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList172 = [STRes171|STResList171],
+ ?line ITRes171 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_IDREF.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S171),
+ ITResList172 = [ITRes171|ITResList171],
+
+
+ ?line {STRes172,S172} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_IDREFS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList173 = [STRes172|STResList172],
+ ?line ITRes172 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_IDREFS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S172),
+ ITResList173 = [ITRes172|ITResList172],
+
+
+ ?line {STRes173,S173} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList174 = [STRes173|STResList173],
+ ?line ITRes173 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S173),
+ ITResList174 = [ITRes173|ITResList173],
+
+
+ ?line {STRes174,S174} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList175 = [STRes174|STResList174],
+ ?line ITRes174 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S174),
+ ITResList175 = [ITRes174|ITResList174],
+
+
+ ?line {STRes175,S175} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList176 = [STRes175|STResList175],
+ ?line ITRes175 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S175),
+ ITResList176 = [ITRes175|ITResList175],
+
+
+ ?line {STRes176,S176} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList177 = [STRes176|STResList176],
+ ?line ITRes176 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S176),
+ ITResList177 = [ITRes176|ITResList176],
+
+
+ ?line {STRes177,S177} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_QName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList178 = [STRes177|STResList177],
+ ?line ITRes177 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_QName.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S177),
+ ITResList178 = [ITRes177|ITResList177],
+
+
+ ?line {STRes178,S178} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_NOTATION.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList179 = [STRes178|STResList178],
+ ?line ITRes178 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_NOTATION.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S178),
+ ITResList179 = [ITRes178|ITResList178],
+
+
+ ?line {STRes179,S179} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_duration.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList180 = [STRes179|STResList179],
+ ?line ITRes179 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_ID_duration.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S179),
+ ITResList180 = [ITRes179|ITResList179],
+
+
+ ?line {STRes180,S180} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList181 = [STRes180|STResList180],
+ ?line ITRes180 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_string.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S180),
+ ITResList181 = [ITRes180|ITResList180],
+
+
+ ?line {STRes181,S181} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList182 = [STRes181|STResList181],
+ ?line ITRes181 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S181),
+ ITResList182 = [ITRes181|ITResList181],
+
+
+ ?line {STRes182,S182} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList183 = [STRes182|STResList182],
+ ?line ITRes182 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_token.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S182),
+ ITResList183 = [ITRes182|ITResList182],
+
+
+ ?line {STRes183,S183} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_language.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList184 = [STRes183|STResList183],
+ ?line ITRes183 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_language.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S183),
+ ITResList184 = [ITRes183|ITResList183],
+
+
+ ?line {STRes184,S184} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_Name.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList185 = [STRes184|STResList184],
+ ?line ITRes184 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_Name.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S184),
+ ITResList185 = [ITRes184|ITResList184],
+
+
+ ?line {STRes185,S185} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_NCName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList186 = [STRes185|STResList185],
+ ?line ITRes185 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_NCName.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S185),
+ ITResList186 = [ITRes185|ITResList185],
+
+
+ ?line {STRes186,S186} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_ID.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList187 = [STRes186|STResList186],
+ ?line ITRes186 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_ID.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S186),
+ ITResList187 = [ITRes186|ITResList186],
+
+
+ ?line {STRes187,S187} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_IDREF.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList188 = [STRes187|STResList187],
+ ?line ITRes187 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_IDREF.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S187),
+ ITResList188 = [ITRes187|ITResList187],
+
+
+ ?line {STRes188,S188} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList189 = [STRes188|STResList188],
+ ?line ITRes188 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S188),
+ ITResList189 = [ITRes188|ITResList188],
+
+
+ ?line {STRes189,S189} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList190 = [STRes189|STResList189],
+ ?line ITRes189 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S189),
+ ITResList190 = [ITRes189|ITResList189],
+
+
+ ?line {STRes190,S190} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList191 = [STRes190|STResList190],
+ ?line ITRes190 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S190),
+ ITResList191 = [ITRes190|ITResList190],
+
+
+ ?line {STRes191,S191} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList192 = [STRes191|STResList191],
+ ?line ITRes191 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S191),
+ ITResList192 = [ITRes191|ITResList191],
+
+
+ ?line {STRes192,S192} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_QName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList193 = [STRes192|STResList192],
+ ?line ITRes192 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_QName.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S192),
+ ITResList193 = [ITRes192|ITResList192],
+
+
+ ?line {STRes193,S193} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_NOTATION.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList194 = [STRes193|STResList193],
+ ?line ITRes193 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_NOTATION.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S193),
+ ITResList194 = [ITRes193|ITResList193],
+
+
+ ?line {STRes194,S194} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_duration.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList195 = [STRes194|STResList194],
+ ?line ITRes194 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREF_duration.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S194),
+ ITResList195 = [ITRes194|ITResList194],
+
+
+ ?line {STRes195,S195} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREFS_language.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList196 = [STRes195|STResList195],
+ ?line ITRes195 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREFS_language.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S195),
+ ITResList196 = [ITRes195|ITResList195],
+
+
+ ?line {STRes196,S196} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREFS_ID.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList197 = [STRes196|STResList196],
+ ?line ITRes196 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREFS_ID.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S196),
+ ITResList197 = [ITRes196|ITResList196],
+
+
+ ?line {STRes197,S197} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREFS_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList198 = [STRes197|STResList197],
+ ?line ITRes197 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREFS_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S197),
+ ITResList198 = [ITRes197|ITResList197],
+
+
+ ?line {STRes198,S198} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREFS_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList199 = [STRes198|STResList198],
+ ?line ITRes198 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREFS_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S198),
+ ITResList199 = [ITRes198|ITResList198],
+
+
+ ?line {STRes199,S199} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREFS_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList200 = [STRes199|STResList199],
+ ?line ITRes199 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREFS_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S199),
+ ITResList200 = [ITRes199|ITResList199],
+
+
+ ?line {STRes200,S200} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREFS_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList201 = [STRes200|STResList200],
+ ?line ITRes200 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREFS_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S200),
+ ITResList201 = [ITRes200|ITResList200],
+
+
+ ?line {STRes201,S201} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREFS_QName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList202 = [STRes201|STResList201],
+ ?line ITRes201 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREFS_QName.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S201),
+ ITResList202 = [ITRes201|ITResList201],
+
+
+ ?line {STRes202,S202} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREFS_NOTATION.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList203 = [STRes202|STResList202],
+ ?line ITRes202 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREFS_NOTATION.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S202),
+ ITResList203 = [ITRes202|ITResList202],
+
+
+ ?line {STRes203,S203} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREFS_duration.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList204 = [STRes203|STResList203],
+ ?line ITRes203 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_IDREFS_duration.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S203),
+ ITResList204 = [ITRes203|ITResList203],
+
+
+ ?line {STRes204,S204} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList205 = [STRes204|STResList204],
+ ?line ITRes204 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_string.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S204),
+ ITResList205 = [ITRes204|ITResList204],
+
+
+ ?line {STRes205,S205} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList206 = [STRes205|STResList205],
+ ?line ITRes205 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S205),
+ ITResList206 = [ITRes205|ITResList205],
+
+
+ ?line {STRes206,S206} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList207 = [STRes206|STResList206],
+ ?line ITRes206 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_token.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S206),
+ ITResList207 = [ITRes206|ITResList206],
+
+
+ ?line {STRes207,S207} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_language.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList208 = [STRes207|STResList207],
+ ?line ITRes207 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_language.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S207),
+ ITResList208 = [ITRes207|ITResList207],
+
+
+ ?line {STRes208,S208} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_Name.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList209 = [STRes208|STResList208],
+ ?line ITRes208 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_Name.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S208),
+ ITResList209 = [ITRes208|ITResList208],
+
+
+ ?line {STRes209,S209} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_NCName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList210 = [STRes209|STResList209],
+ ?line ITRes209 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_NCName.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S209),
+ ITResList210 = [ITRes209|ITResList209],
+
+
+ ?line {STRes210,S210} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_ID.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList211 = [STRes210|STResList210],
+ ?line ITRes210 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_ID.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S210),
+ ITResList211 = [ITRes210|ITResList210],
+
+
+ ?line {STRes211,S211} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_IDREF.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList212 = [STRes211|STResList211],
+ ?line ITRes211 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_IDREF.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S211),
+ ITResList212 = [ITRes211|ITResList211],
+
+
+ ?line {STRes212,S212} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_IDREFS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList213 = [STRes212|STResList212],
+ ?line ITRes212 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_IDREFS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S212),
+ ITResList213 = [ITRes212|ITResList212],
+
+
+ ?line {STRes213,S213} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList214 = [STRes213|STResList213],
+ ?line ITRes213 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S213),
+ ITResList214 = [ITRes213|ITResList213],
+
+
+ ?line {STRes214,S214} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList215 = [STRes214|STResList214],
+ ?line ITRes214 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S214),
+ ITResList215 = [ITRes214|ITResList214],
+
+
+ ?line {STRes215,S215} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_base64Binary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList216 = [STRes215|STResList215],
+ ?line ITRes215 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_base64Binary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S215),
+ ITResList216 = [ITRes215|ITResList215],
+
+
+ ?line {STRes216,S216} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_hexBinary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList217 = [STRes216|STResList216],
+ ?line ITRes216 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_hexBinary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S216),
+ ITResList217 = [ITRes216|ITResList216],
+
+
+ ?line {STRes217,S217} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList218 = [STRes217|STResList217],
+ ?line ITRes217 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S217),
+ ITResList218 = [ITRes217|ITResList217],
+
+
+ ?line {STRes218,S218} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList219 = [STRes218|STResList218],
+ ?line ITRes218 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S218),
+ ITResList219 = [ITRes218|ITResList218],
+
+
+ ?line {STRes219,S219} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList220 = [STRes219|STResList219],
+ ?line ITRes219 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S219),
+ ITResList220 = [ITRes219|ITResList219],
+
+
+ ?line {STRes220,S220} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_nonPositiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList221 = [STRes220|STResList220],
+ ?line ITRes220 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_nonPositiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S220),
+ ITResList221 = [ITRes220|ITResList220],
+
+
+ ?line {STRes221,S221} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_negativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList222 = [STRes221|STResList221],
+ ?line ITRes221 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_negativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S221),
+ ITResList222 = [ITRes221|ITResList221],
+
+
+ ?line {STRes222,S222} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList223 = [STRes222|STResList222],
+ ?line ITRes222 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_long.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S222),
+ ITResList223 = [ITRes222|ITResList222],
+
+
+ ?line {STRes223,S223} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList224 = [STRes223|STResList223],
+ ?line ITRes223 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_int.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S223),
+ ITResList224 = [ITRes223|ITResList223],
+
+
+ ?line {STRes224,S224} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList225 = [STRes224|STResList224],
+ ?line ITRes224 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_short.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S224),
+ ITResList225 = [ITRes224|ITResList224],
+
+
+ ?line {STRes225,S225} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList226 = [STRes225|STResList225],
+ ?line ITRes225 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S225),
+ ITResList226 = [ITRes225|ITResList225],
+
+
+ ?line {STRes226,S226} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_nonNegativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList227 = [STRes226|STResList226],
+ ?line ITRes226 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_nonNegativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S226),
+ ITResList227 = [ITRes226|ITResList226],
+
+
+ ?line {STRes227,S227} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_positiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList228 = [STRes227|STResList227],
+ ?line ITRes227 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_positiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S227),
+ ITResList228 = [ITRes227|ITResList227],
+
+
+ ?line {STRes228,S228} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_unsignedLong.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList229 = [STRes228|STResList228],
+ ?line ITRes228 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_unsignedLong.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S228),
+ ITResList229 = [ITRes228|ITResList228],
+
+
+ ?line {STRes229,S229} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_unsignedInt.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList230 = [STRes229|STResList229],
+ ?line ITRes229 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_unsignedInt.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S229),
+ ITResList230 = [ITRes229|ITResList229],
+
+
+ ?line {STRes230,S230} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_unsignedShort.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList231 = [STRes230|STResList230],
+ ?line ITRes230 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_unsignedShort.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S230),
+ ITResList231 = [ITRes230|ITResList230],
+
+
+ ?line {STRes231,S231} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_unsignedByte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList232 = [STRes231|STResList231],
+ ?line ITRes231 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_unsignedByte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S231),
+ ITResList232 = [ITRes231|ITResList231],
+
+
+ ?line {STRes232,S232} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList233 = [STRes232|STResList232],
+ ?line ITRes232 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S232),
+ ITResList233 = [ITRes232|ITResList232],
+
+
+ ?line {STRes233,S233} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList234 = [STRes233|STResList233],
+ ?line ITRes233 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S233),
+ ITResList234 = [ITRes233|ITResList233],
+
+
+ ?line {STRes234,S234} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_QName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList235 = [STRes234|STResList234],
+ ?line ITRes234 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_QName.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S234),
+ ITResList235 = [ITRes234|ITResList234],
+
+
+ ?line {STRes235,S235} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_NOTATION.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList236 = [STRes235|STResList235],
+ ?line ITRes235 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_NOTATION.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S235),
+ ITResList236 = [ITRes235|ITResList235],
+
+
+ ?line {STRes236,S236} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_duration.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList237 = [STRes236|STResList236],
+ ?line ITRes236 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_duration.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S236),
+ ITResList237 = [ITRes236|ITResList236],
+
+
+ ?line {STRes237,S237} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_dateTime.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList238 = [STRes237|STResList237],
+ ?line ITRes237 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_dateTime.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S237),
+ ITResList238 = [ITRes237|ITResList237],
+
+
+ ?line {STRes238,S238} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_time.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList239 = [STRes238|STResList238],
+ ?line ITRes238 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_time.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S238),
+ ITResList239 = [ITRes238|ITResList238],
+
+
+ ?line {STRes239,S239} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_date.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList240 = [STRes239|STResList239],
+ ?line ITRes239 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_date.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S239),
+ ITResList240 = [ITRes239|ITResList239],
+
+
+ ?line {STRes240,S240} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_gYearMonth.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList241 = [STRes240|STResList240],
+ ?line ITRes240 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_gYearMonth.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S240),
+ ITResList241 = [ITRes240|ITResList240],
+
+
+ ?line {STRes241,S241} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_gYear.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList242 = [STRes241|STResList241],
+ ?line ITRes241 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_gYear.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S241),
+ ITResList242 = [ITRes241|ITResList241],
+
+
+ ?line {STRes242,S242} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_gMonthDay.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList243 = [STRes242|STResList242],
+ ?line ITRes242 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_gMonthDay.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S242),
+ ITResList243 = [ITRes242|ITResList242],
+
+
+ ?line {STRes243,S243} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_gDay.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList244 = [STRes243|STResList243],
+ ?line ITRes243 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_gDay.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S243),
+ ITResList244 = [ITRes243|ITResList243],
+
+
+ ?line {STRes244,S244} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_gMonth.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList245 = [STRes244|STResList244],
+ ?line ITRes244 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKEN_gMonth.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S244),
+ ITResList245 = [ITRes244|ITResList244],
+
+
+ ?line {STRes245,S245} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_language.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList246 = [STRes245|STResList245],
+ ?line ITRes245 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_language.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S245),
+ ITResList246 = [ITRes245|ITResList245],
+
+
+ ?line {STRes246,S246} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_Name.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList247 = [STRes246|STResList246],
+ ?line ITRes246 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_Name.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S246),
+ ITResList247 = [ITRes246|ITResList246],
+
+
+ ?line {STRes247,S247} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_NCName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList248 = [STRes247|STResList247],
+ ?line ITRes247 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_NCName.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S247),
+ ITResList248 = [ITRes247|ITResList247],
+
+
+ ?line {STRes248,S248} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_ID.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList249 = [STRes248|STResList248],
+ ?line ITRes248 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_ID.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S248),
+ ITResList249 = [ITRes248|ITResList248],
+
+
+ ?line {STRes249,S249} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_IDREF.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList250 = [STRes249|STResList249],
+ ?line ITRes249 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_IDREF.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S249),
+ ITResList250 = [ITRes249|ITResList249],
+
+
+ ?line {STRes250,S250} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_IDREFS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList251 = [STRes250|STResList250],
+ ?line ITRes250 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_IDREFS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S250),
+ ITResList251 = [ITRes250|ITResList250],
+
+
+ ?line {STRes251,S251} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList252 = [STRes251|STResList251],
+ ?line ITRes251 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S251),
+ ITResList252 = [ITRes251|ITResList251],
+
+
+ ?line {STRes252,S252} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_base64Binary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList253 = [STRes252|STResList252],
+ ?line ITRes252 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_base64Binary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S252),
+ ITResList253 = [ITRes252|ITResList252],
+
+
+ ?line {STRes253,S253} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_hexBinary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList254 = [STRes253|STResList253],
+ ?line ITRes253 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_hexBinary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S253),
+ ITResList254 = [ITRes253|ITResList253],
+
+
+ ?line {STRes254,S254} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList255 = [STRes254|STResList254],
+ ?line ITRes254 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S254),
+ ITResList255 = [ITRes254|ITResList254],
+
+
+ ?line {STRes255,S255} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList256 = [STRes255|STResList255],
+ ?line ITRes255 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S255),
+ ITResList256 = [ITRes255|ITResList255],
+
+
+ ?line {STRes256,S256} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList257 = [STRes256|STResList256],
+ ?line ITRes256 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S256),
+ ITResList257 = [ITRes256|ITResList256],
+
+
+ ?line {STRes257,S257} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_nonPositiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList258 = [STRes257|STResList257],
+ ?line ITRes257 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_nonPositiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S257),
+ ITResList258 = [ITRes257|ITResList257],
+
+
+ ?line {STRes258,S258} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_negativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList259 = [STRes258|STResList258],
+ ?line ITRes258 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_negativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S258),
+ ITResList259 = [ITRes258|ITResList258],
+
+
+ ?line {STRes259,S259} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList260 = [STRes259|STResList259],
+ ?line ITRes259 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_long.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S259),
+ ITResList260 = [ITRes259|ITResList259],
+
+
+ ?line {STRes260,S260} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList261 = [STRes260|STResList260],
+ ?line ITRes260 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_int.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S260),
+ ITResList261 = [ITRes260|ITResList260],
+
+
+ ?line {STRes261,S261} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList262 = [STRes261|STResList261],
+ ?line ITRes261 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_short.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S261),
+ ITResList262 = [ITRes261|ITResList261],
+
+
+ ?line {STRes262,S262} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList263 = [STRes262|STResList262],
+ ?line ITRes262 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S262),
+ ITResList263 = [ITRes262|ITResList262],
+
+
+ ?line {STRes263,S263} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_nonNegativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList264 = [STRes263|STResList263],
+ ?line ITRes263 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_nonNegativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S263),
+ ITResList264 = [ITRes263|ITResList263],
+
+
+ ?line {STRes264,S264} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_positiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList265 = [STRes264|STResList264],
+ ?line ITRes264 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_positiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S264),
+ ITResList265 = [ITRes264|ITResList264],
+
+
+ ?line {STRes265,S265} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_unsignedLong.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList266 = [STRes265|STResList265],
+ ?line ITRes265 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_unsignedLong.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S265),
+ ITResList266 = [ITRes265|ITResList265],
+
+
+ ?line {STRes266,S266} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_unsignedInt.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList267 = [STRes266|STResList266],
+ ?line ITRes266 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_unsignedInt.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S266),
+ ITResList267 = [ITRes266|ITResList266],
+
+
+ ?line {STRes267,S267} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_unsignedShort.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList268 = [STRes267|STResList267],
+ ?line ITRes267 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_unsignedShort.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S267),
+ ITResList268 = [ITRes267|ITResList267],
+
+
+ ?line {STRes268,S268} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_unsignedByte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList269 = [STRes268|STResList268],
+ ?line ITRes268 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_unsignedByte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S268),
+ ITResList269 = [ITRes268|ITResList268],
+
+
+ ?line {STRes269,S269} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList270 = [STRes269|STResList269],
+ ?line ITRes269 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S269),
+ ITResList270 = [ITRes269|ITResList269],
+
+
+ ?line {STRes270,S270} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList271 = [STRes270|STResList270],
+ ?line ITRes270 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S270),
+ ITResList271 = [ITRes270|ITResList270],
+
+
+ ?line {STRes271,S271} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_QName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList272 = [STRes271|STResList271],
+ ?line ITRes271 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_QName.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S271),
+ ITResList272 = [ITRes271|ITResList271],
+
+
+ ?line {STRes272,S272} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_NOTATION.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList273 = [STRes272|STResList272],
+ ?line ITRes272 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_NOTATION.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S272),
+ ITResList273 = [ITRes272|ITResList272],
+
+
+ ?line {STRes273,S273} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_duration.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList274 = [STRes273|STResList273],
+ ?line ITRes273 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_duration.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S273),
+ ITResList274 = [ITRes273|ITResList273],
+
+
+ ?line {STRes274,S274} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_dateTime.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList275 = [STRes274|STResList274],
+ ?line ITRes274 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_dateTime.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S274),
+ ITResList275 = [ITRes274|ITResList274],
+
+
+ ?line {STRes275,S275} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_time.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList276 = [STRes275|STResList275],
+ ?line ITRes275 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_time.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S275),
+ ITResList276 = [ITRes275|ITResList275],
+
+
+ ?line {STRes276,S276} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_date.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList277 = [STRes276|STResList276],
+ ?line ITRes276 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_date.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S276),
+ ITResList277 = [ITRes276|ITResList276],
+
+
+ ?line {STRes277,S277} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_gYearMonth.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList278 = [STRes277|STResList277],
+ ?line ITRes277 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_gYearMonth.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S277),
+ ITResList278 = [ITRes277|ITResList277],
+
+
+ ?line {STRes278,S278} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_gYear.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList279 = [STRes278|STResList278],
+ ?line ITRes278 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_gYear.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S278),
+ ITResList279 = [ITRes278|ITResList278],
+
+
+ ?line {STRes279,S279} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_gMonthDay.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList280 = [STRes279|STResList279],
+ ?line ITRes279 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_gMonthDay.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S279),
+ ITResList280 = [ITRes279|ITResList279],
+
+
+ ?line {STRes280,S280} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_gDay.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList281 = [STRes280|STResList280],
+ ?line ITRes280 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_gDay.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S280),
+ ITResList281 = [ITRes280|ITResList280],
+
+
+ ?line {STRes281,S281} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_gMonth.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList282 = [STRes281|STResList281],
+ ?line ITRes281 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NMTOKENS_gMonth.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S281),
+ ITResList282 = [ITRes281|ITResList281],
+
+
+ ?line {STRes282,S282} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList283 = [STRes282|STResList282],
+ ?line ITRes282 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S282),
+ ITResList283 = [ITRes282|ITResList282],
+
+
+ ?line {STRes283,S283} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList284 = [STRes283|STResList283],
+ ?line ITRes283 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S283),
+ ITResList284 = [ITRes283|ITResList283],
+
+
+ ?line {STRes284,S284} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList285 = [STRes284|STResList284],
+ ?line ITRes284 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S284),
+ ITResList285 = [ITRes284|ITResList284],
+
+
+ ?line {STRes285,S285} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_Name.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList286 = [STRes285|STResList285],
+ ?line ITRes285 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_Name.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S285),
+ ITResList286 = [ITRes285|ITResList285],
+
+
+ ?line {STRes286,S286} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_NCName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList287 = [STRes286|STResList286],
+ ?line ITRes286 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_NCName.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S286),
+ ITResList287 = [ITRes286|ITResList286],
+
+
+ ?line {STRes287,S287} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_ID.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList288 = [STRes287|STResList287],
+ ?line ITRes287 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_ID.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S287),
+ ITResList288 = [ITRes287|ITResList287],
+
+
+ ?line {STRes288,S288} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_IDREF.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList289 = [STRes288|STResList288],
+ ?line ITRes288 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_IDREF.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S288),
+ ITResList289 = [ITRes288|ITResList288],
+
+
+ ?line {STRes289,S289} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_IDREFS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList290 = [STRes289|STResList289],
+ ?line ITRes289 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_IDREFS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S289),
+ ITResList290 = [ITRes289|ITResList289],
+
+
+ ?line {STRes290,S290} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList291 = [STRes290|STResList290],
+ ?line ITRes290 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S290),
+ ITResList291 = [ITRes290|ITResList290],
+
+
+ ?line {STRes291,S291} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList292 = [STRes291|STResList291],
+ ?line ITRes291 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S291),
+ ITResList292 = [ITRes291|ITResList291],
+
+
+ ?line {STRes292,S292} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList293 = [STRes292|STResList292],
+ ?line ITRes292 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S292),
+ ITResList293 = [ITRes292|ITResList292],
+
+
+ ?line {STRes293,S293} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_base64Binary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList294 = [STRes293|STResList293],
+ ?line ITRes293 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_base64Binary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S293),
+ ITResList294 = [ITRes293|ITResList293],
+
+
+ ?line {STRes294,S294} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_hexBinary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList295 = [STRes294|STResList294],
+ ?line ITRes294 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_hexBinary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S294),
+ ITResList295 = [ITRes294|ITResList294],
+
+
+ ?line {STRes295,S295} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList296 = [STRes295|STResList295],
+ ?line ITRes295 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S295),
+ ITResList296 = [ITRes295|ITResList295],
+
+
+ ?line {STRes296,S296} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList297 = [STRes296|STResList296],
+ ?line ITRes296 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S296),
+ ITResList297 = [ITRes296|ITResList296],
+
+
+ ?line {STRes297,S297} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList298 = [STRes297|STResList297],
+ ?line ITRes297 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S297),
+ ITResList298 = [ITRes297|ITResList297],
+
+
+ ?line {STRes298,S298} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_nonPositiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList299 = [STRes298|STResList298],
+ ?line ITRes298 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_nonPositiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S298),
+ ITResList299 = [ITRes298|ITResList298],
+
+
+ ?line {STRes299,S299} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList300 = [STRes299|STResList299],
+ ?line ITRes299 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_long.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S299),
+ ITResList300 = [ITRes299|ITResList299],
+
+
+ ?line {STRes300,S300} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList301 = [STRes300|STResList300],
+ ?line ITRes300 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_int.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S300),
+ ITResList301 = [ITRes300|ITResList300],
+
+
+ ?line {STRes301,S301} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList302 = [STRes301|STResList301],
+ ?line ITRes301 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_short.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S301),
+ ITResList302 = [ITRes301|ITResList301],
+
+
+ ?line {STRes302,S302} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList303 = [STRes302|STResList302],
+ ?line ITRes302 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S302),
+ ITResList303 = [ITRes302|ITResList302],
+
+
+ ?line {STRes303,S303} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_nonNegativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList304 = [STRes303|STResList303],
+ ?line ITRes303 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_nonNegativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S303),
+ ITResList304 = [ITRes303|ITResList303],
+
+
+ ?line {STRes304,S304} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_positiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList305 = [STRes304|STResList304],
+ ?line ITRes304 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_positiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S304),
+ ITResList305 = [ITRes304|ITResList304],
+
+
+ ?line {STRes305,S305} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_unsignedLong.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList306 = [STRes305|STResList305],
+ ?line ITRes305 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_unsignedLong.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S305),
+ ITResList306 = [ITRes305|ITResList305],
+
+
+ ?line {STRes306,S306} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_unsignedInt.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList307 = [STRes306|STResList306],
+ ?line ITRes306 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_unsignedInt.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S306),
+ ITResList307 = [ITRes306|ITResList306],
+
+
+ ?line {STRes307,S307} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_unsignedShort.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList308 = [STRes307|STResList307],
+ ?line ITRes307 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_unsignedShort.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S307),
+ ITResList308 = [ITRes307|ITResList307],
+
+
+ ?line {STRes308,S308} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_unsignedByte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList309 = [STRes308|STResList308],
+ ?line ITRes308 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_unsignedByte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S308),
+ ITResList309 = [ITRes308|ITResList308],
+
+
+ ?line {STRes309,S309} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList310 = [STRes309|STResList309],
+ ?line ITRes309 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S309),
+ ITResList310 = [ITRes309|ITResList309],
+
+
+ ?line {STRes310,S310} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList311 = [STRes310|STResList310],
+ ?line ITRes310 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S310),
+ ITResList311 = [ITRes310|ITResList310],
+
+
+ ?line {STRes311,S311} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_QName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList312 = [STRes311|STResList311],
+ ?line ITRes311 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_QName.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S311),
+ ITResList312 = [ITRes311|ITResList311],
+
+
+ ?line {STRes312,S312} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_NOTATION.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList313 = [STRes312|STResList312],
+ ?line ITRes312 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_boolean_NOTATION.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S312),
+ ITResList313 = [ITRes312|ITResList312],
+
+
+ ?line {STRes313,S313} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList314 = [STRes313|STResList313],
+ ?line ITRes313 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S313),
+ ITResList314 = [ITRes313|ITResList313],
+
+
+ ?line {STRes314,S314} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList315 = [STRes314|STResList314],
+ ?line ITRes314 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S314),
+ ITResList315 = [ITRes314|ITResList314],
+
+
+ ?line {STRes315,S315} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList316 = [STRes315|STResList315],
+ ?line ITRes315 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S315),
+ ITResList316 = [ITRes315|ITResList315],
+
+
+ ?line {STRes316,S316} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList317 = [STRes316|STResList316],
+ ?line ITRes316 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S316),
+ ITResList317 = [ITRes316|ITResList316],
+
+
+ ?line {STRes317,S317} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList318 = [STRes317|STResList317],
+ ?line ITRes317 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S317),
+ ITResList318 = [ITRes317|ITResList317],
+
+
+ ?line {STRes318,S318} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList319 = [STRes318|STResList318],
+ ?line ITRes318 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S318),
+ ITResList319 = [ITRes318|ITResList318],
+
+
+ ?line {STRes319,S319} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_hexBinary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList320 = [STRes319|STResList319],
+ ?line ITRes319 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_hexBinary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S319),
+ ITResList320 = [ITRes319|ITResList319],
+
+
+ ?line {STRes320,S320} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList321 = [STRes320|STResList320],
+ ?line ITRes320 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S320),
+ ITResList321 = [ITRes320|ITResList320],
+
+
+ ?line {STRes321,S321} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList322 = [STRes321|STResList321],
+ ?line ITRes321 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S321),
+ ITResList322 = [ITRes321|ITResList321],
+
+
+ ?line {STRes322,S322} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList323 = [STRes322|STResList322],
+ ?line ITRes322 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S322),
+ ITResList323 = [ITRes322|ITResList322],
+
+
+ ?line {STRes323,S323} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList324 = [STRes323|STResList323],
+ ?line ITRes323 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_long.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S323),
+ ITResList324 = [ITRes323|ITResList323],
+
+
+ ?line {STRes324,S324} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList325 = [STRes324|STResList324],
+ ?line ITRes324 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_int.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S324),
+ ITResList325 = [ITRes324|ITResList324],
+
+
+ ?line {STRes325,S325} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList326 = [STRes325|STResList325],
+ ?line ITRes325 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_short.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S325),
+ ITResList326 = [ITRes325|ITResList325],
+
+
+ ?line {STRes326,S326} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList327 = [STRes326|STResList326],
+ ?line ITRes326 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S326),
+ ITResList327 = [ITRes326|ITResList326],
+
+
+ ?line {STRes327,S327} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_nonNegativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList328 = [STRes327|STResList327],
+ ?line ITRes327 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_nonNegativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S327),
+ ITResList328 = [ITRes327|ITResList327],
+
+
+ ?line {STRes328,S328} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_positiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList329 = [STRes328|STResList328],
+ ?line ITRes328 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_positiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S328),
+ ITResList329 = [ITRes328|ITResList328],
+
+
+ ?line {STRes329,S329} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_unsignedLong.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList330 = [STRes329|STResList329],
+ ?line ITRes329 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_unsignedLong.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S329),
+ ITResList330 = [ITRes329|ITResList329],
+
+
+ ?line {STRes330,S330} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_unsignedInt.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList331 = [STRes330|STResList330],
+ ?line ITRes330 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_unsignedInt.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S330),
+ ITResList331 = [ITRes330|ITResList330],
+
+
+ ?line {STRes331,S331} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_unsignedShort.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList332 = [STRes331|STResList331],
+ ?line ITRes331 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_unsignedShort.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S331),
+ ITResList332 = [ITRes331|ITResList331],
+
+
+ ?line {STRes332,S332} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_unsignedByte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList333 = [STRes332|STResList332],
+ ?line ITRes332 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_unsignedByte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S332),
+ ITResList333 = [ITRes332|ITResList332],
+
+
+ ?line {STRes333,S333} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList334 = [STRes333|STResList333],
+ ?line ITRes333 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S333),
+ ITResList334 = [ITRes333|ITResList333],
+
+
+ ?line {STRes334,S334} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList335 = [STRes334|STResList334],
+ ?line ITRes334 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_base64Binary_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S334),
+ ITResList335 = [ITRes334|ITResList334],
+
+
+ ?line {STRes335,S335} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList336 = [STRes335|STResList335],
+ ?line ITRes335 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S335),
+ ITResList336 = [ITRes335|ITResList335],
+
+
+ ?line {STRes336,S336} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList337 = [STRes336|STResList336],
+ ?line ITRes336 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S336),
+ ITResList337 = [ITRes336|ITResList336],
+
+
+ ?line {STRes337,S337} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList338 = [STRes337|STResList337],
+ ?line ITRes337 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S337),
+ ITResList338 = [ITRes337|ITResList337],
+
+
+ ?line {STRes338,S338} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList339 = [STRes338|STResList338],
+ ?line ITRes338 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S338),
+ ITResList339 = [ITRes338|ITResList338],
+
+
+ ?line {STRes339,S339} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList340 = [STRes339|STResList339],
+ ?line ITRes339 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S339),
+ ITResList340 = [ITRes339|ITResList339],
+
+
+ ?line {STRes340,S340} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList341 = [STRes340|STResList340],
+ ?line ITRes340 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S340),
+ ITResList341 = [ITRes340|ITResList340],
+
+
+ ?line {STRes341,S341} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_base64Binary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList342 = [STRes341|STResList341],
+ ?line ITRes341 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_base64Binary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S341),
+ ITResList342 = [ITRes341|ITResList341],
+
+
+ ?line {STRes342,S342} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList343 = [STRes342|STResList342],
+ ?line ITRes342 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S342),
+ ITResList343 = [ITRes342|ITResList342],
+
+
+ ?line {STRes343,S343} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList344 = [STRes343|STResList343],
+ ?line ITRes343 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S343),
+ ITResList344 = [ITRes343|ITResList343],
+
+
+ ?line {STRes344,S344} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList345 = [STRes344|STResList344],
+ ?line ITRes344 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S344),
+ ITResList345 = [ITRes344|ITResList344],
+
+
+ ?line {STRes345,S345} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList346 = [STRes345|STResList345],
+ ?line ITRes345 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_long.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S345),
+ ITResList346 = [ITRes345|ITResList345],
+
+
+ ?line {STRes346,S346} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList347 = [STRes346|STResList346],
+ ?line ITRes346 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_int.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S346),
+ ITResList347 = [ITRes346|ITResList346],
+
+
+ ?line {STRes347,S347} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList348 = [STRes347|STResList347],
+ ?line ITRes347 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_short.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S347),
+ ITResList348 = [ITRes347|ITResList347],
+
+
+ ?line {STRes348,S348} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList349 = [STRes348|STResList348],
+ ?line ITRes348 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S348),
+ ITResList349 = [ITRes348|ITResList348],
+
+
+ ?line {STRes349,S349} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_nonNegativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList350 = [STRes349|STResList349],
+ ?line ITRes349 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_nonNegativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S349),
+ ITResList350 = [ITRes349|ITResList349],
+
+
+ ?line {STRes350,S350} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_positiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList351 = [STRes350|STResList350],
+ ?line ITRes350 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_positiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S350),
+ ITResList351 = [ITRes350|ITResList350],
+
+
+ ?line {STRes351,S351} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_unsignedLong.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList352 = [STRes351|STResList351],
+ ?line ITRes351 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_unsignedLong.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S351),
+ ITResList352 = [ITRes351|ITResList351],
+
+
+ ?line {STRes352,S352} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_unsignedInt.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList353 = [STRes352|STResList352],
+ ?line ITRes352 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_unsignedInt.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S352),
+ ITResList353 = [ITRes352|ITResList352],
+
+
+ ?line {STRes353,S353} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_unsignedShort.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList354 = [STRes353|STResList353],
+ ?line ITRes353 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_unsignedShort.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S353),
+ ITResList354 = [ITRes353|ITResList353],
+
+
+ ?line {STRes354,S354} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_unsignedByte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList355 = [STRes354|STResList354],
+ ?line ITRes354 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_unsignedByte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S354),
+ ITResList355 = [ITRes354|ITResList354],
+
+
+ ?line {STRes355,S355} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList356 = [STRes355|STResList355],
+ ?line ITRes355 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S355),
+ ITResList356 = [ITRes355|ITResList355],
+
+
+ ?line {STRes356,S356} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList357 = [STRes356|STResList356],
+ ?line ITRes356 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_hexBinary_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S356),
+ ITResList357 = [ITRes356|ITResList356],
+
+
+ ?line {STRes357,S357} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList358 = [STRes357|STResList357],
+ ?line ITRes357 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S357),
+ ITResList358 = [ITRes357|ITResList357],
+
+
+ ?line {STRes358,S358} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList359 = [STRes358|STResList358],
+ ?line ITRes358 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S358),
+ ITResList359 = [ITRes358|ITResList358],
+
+
+ ?line {STRes359,S359} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList360 = [STRes359|STResList359],
+ ?line ITRes359 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S359),
+ ITResList360 = [ITRes359|ITResList359],
+
+
+ ?line {STRes360,S360} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList361 = [STRes360|STResList360],
+ ?line ITRes360 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S360),
+ ITResList361 = [ITRes360|ITResList360],
+
+
+ ?line {STRes361,S361} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList362 = [STRes361|STResList361],
+ ?line ITRes361 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S361),
+ ITResList362 = [ITRes361|ITResList361],
+
+
+ ?line {STRes362,S362} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList363 = [STRes362|STResList362],
+ ?line ITRes362 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S362),
+ ITResList363 = [ITRes362|ITResList362],
+
+
+ ?line {STRes363,S363} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_base64Binary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList364 = [STRes363|STResList363],
+ ?line ITRes363 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_base64Binary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S363),
+ ITResList364 = [ITRes363|ITResList363],
+
+
+ ?line {STRes364,S364} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_hexBinary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList365 = [STRes364|STResList364],
+ ?line ITRes364 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_hexBinary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S364),
+ ITResList365 = [ITRes364|ITResList364],
+
+
+ ?line {STRes365,S365} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList366 = [STRes365|STResList365],
+ ?line ITRes365 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_float.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S365),
+ ITResList366 = [ITRes365|ITResList365],
+
+
+ ?line {STRes366,S366} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList367 = [STRes366|STResList366],
+ ?line ITRes366 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S366),
+ ITResList367 = [ITRes366|ITResList366],
+
+
+ ?line {STRes367,S367} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList368 = [STRes367|STResList367],
+ ?line ITRes367 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S367),
+ ITResList368 = [ITRes367|ITResList367],
+
+
+ ?line {STRes368,S368} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_nonPositiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList369 = [STRes368|STResList368],
+ ?line ITRes368 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_nonPositiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S368),
+ ITResList369 = [ITRes368|ITResList368],
+
+
+ ?line {STRes369,S369} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_negativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList370 = [STRes369|STResList369],
+ ?line ITRes369 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_negativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S369),
+ ITResList370 = [ITRes369|ITResList369],
+
+
+ ?line {STRes370,S370} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList371 = [STRes370|STResList370],
+ ?line ITRes370 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_long.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S370),
+ ITResList371 = [ITRes370|ITResList370],
+
+
+ ?line {STRes371,S371} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList372 = [STRes371|STResList371],
+ ?line ITRes371 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_int.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S371),
+ ITResList372 = [ITRes371|ITResList371],
+
+
+ ?line {STRes372,S372} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList373 = [STRes372|STResList372],
+ ?line ITRes372 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_short.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S372),
+ ITResList373 = [ITRes372|ITResList372],
+
+
+ ?line {STRes373,S373} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList374 = [STRes373|STResList373],
+ ?line ITRes373 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S373),
+ ITResList374 = [ITRes373|ITResList373],
+
+
+ ?line {STRes374,S374} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_nonNegativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList375 = [STRes374|STResList374],
+ ?line ITRes374 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_nonNegativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S374),
+ ITResList375 = [ITRes374|ITResList374],
+
+
+ ?line {STRes375,S375} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_positiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList376 = [STRes375|STResList375],
+ ?line ITRes375 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_positiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S375),
+ ITResList376 = [ITRes375|ITResList375],
+
+
+ ?line {STRes376,S376} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_unsignedLong.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList377 = [STRes376|STResList376],
+ ?line ITRes376 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_unsignedLong.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S376),
+ ITResList377 = [ITRes376|ITResList376],
+
+
+ ?line {STRes377,S377} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_unsignedInt.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList378 = [STRes377|STResList377],
+ ?line ITRes377 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_unsignedInt.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S377),
+ ITResList378 = [ITRes377|ITResList377],
+
+
+ ?line {STRes378,S378} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_unsignedShort.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList379 = [STRes378|STResList378],
+ ?line ITRes378 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_unsignedShort.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S378),
+ ITResList379 = [ITRes378|ITResList378],
+
+
+ ?line {STRes379,S379} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_unsignedByte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList380 = [STRes379|STResList379],
+ ?line ITRes379 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_unsignedByte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S379),
+ ITResList380 = [ITRes379|ITResList379],
+
+
+ ?line {STRes380,S380} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList381 = [STRes380|STResList380],
+ ?line ITRes380 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S380),
+ ITResList381 = [ITRes380|ITResList380],
+
+
+ ?line {STRes381,S381} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList382 = [STRes381|STResList381],
+ ?line ITRes381 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_float_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S381),
+ ITResList382 = [ITRes381|ITResList381],
+
+
+ ?line {STRes382,S382} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList383 = [STRes382|STResList382],
+ ?line ITRes382 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S382),
+ ITResList383 = [ITRes382|ITResList382],
+
+
+ ?line {STRes383,S383} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList384 = [STRes383|STResList383],
+ ?line ITRes383 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S383),
+ ITResList384 = [ITRes383|ITResList383],
+
+
+ ?line {STRes384,S384} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList385 = [STRes384|STResList384],
+ ?line ITRes384 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S384),
+ ITResList385 = [ITRes384|ITResList384],
+
+
+ ?line {STRes385,S385} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList386 = [STRes385|STResList385],
+ ?line ITRes385 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S385),
+ ITResList386 = [ITRes385|ITResList385],
+
+
+ ?line {STRes386,S386} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList387 = [STRes386|STResList386],
+ ?line ITRes386 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S386),
+ ITResList387 = [ITRes386|ITResList386],
+
+
+ ?line {STRes387,S387} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList388 = [STRes387|STResList387],
+ ?line ITRes387 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S387),
+ ITResList388 = [ITRes387|ITResList387],
+
+
+ ?line {STRes388,S388} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_base64Binary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList389 = [STRes388|STResList388],
+ ?line ITRes388 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_base64Binary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S388),
+ ITResList389 = [ITRes388|ITResList388],
+
+
+ ?line {STRes389,S389} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_hexBinary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList390 = [STRes389|STResList389],
+ ?line ITRes389 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_hexBinary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S389),
+ ITResList390 = [ITRes389|ITResList389],
+
+
+ ?line {STRes390,S390} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList391 = [STRes390|STResList390],
+ ?line ITRes390 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S390),
+ ITResList391 = [ITRes390|ITResList390],
+
+
+ ?line {STRes391,S391} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList392 = [STRes391|STResList391],
+ ?line ITRes391 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S391),
+ ITResList392 = [ITRes391|ITResList391],
+
+
+ ?line {STRes392,S392} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList393 = [STRes392|STResList392],
+ ?line ITRes392 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S392),
+ ITResList393 = [ITRes392|ITResList392],
+
+
+ ?line {STRes393,S393} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_nonPositiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList394 = [STRes393|STResList393],
+ ?line ITRes393 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_nonPositiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S393),
+ ITResList394 = [ITRes393|ITResList393],
+
+
+ ?line {STRes394,S394} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_negativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList395 = [STRes394|STResList394],
+ ?line ITRes394 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_negativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S394),
+ ITResList395 = [ITRes394|ITResList394],
+
+
+ ?line {STRes395,S395} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList396 = [STRes395|STResList395],
+ ?line ITRes395 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_long.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S395),
+ ITResList396 = [ITRes395|ITResList395],
+
+
+ ?line {STRes396,S396} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList397 = [STRes396|STResList396],
+ ?line ITRes396 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_int.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S396),
+ ITResList397 = [ITRes396|ITResList396],
+
+
+ ?line {STRes397,S397} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList398 = [STRes397|STResList397],
+ ?line ITRes397 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_short.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S397),
+ ITResList398 = [ITRes397|ITResList397],
+
+
+ ?line {STRes398,S398} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList399 = [STRes398|STResList398],
+ ?line ITRes398 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S398),
+ ITResList399 = [ITRes398|ITResList398],
+
+
+ ?line {STRes399,S399} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_nonNegativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList400 = [STRes399|STResList399],
+ ?line ITRes399 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_nonNegativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S399),
+ ITResList400 = [ITRes399|ITResList399],
+
+
+ ?line {STRes400,S400} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_positiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList401 = [STRes400|STResList400],
+ ?line ITRes400 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_positiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S400),
+ ITResList401 = [ITRes400|ITResList400],
+
+
+ ?line {STRes401,S401} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_unsignedLong.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList402 = [STRes401|STResList401],
+ ?line ITRes401 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_unsignedLong.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S401),
+ ITResList402 = [ITRes401|ITResList401],
+
+
+ ?line {STRes402,S402} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_unsignedInt.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList403 = [STRes402|STResList402],
+ ?line ITRes402 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_unsignedInt.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S402),
+ ITResList403 = [ITRes402|ITResList402],
+
+
+ ?line {STRes403,S403} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_unsignedShort.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList404 = [STRes403|STResList403],
+ ?line ITRes403 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_unsignedShort.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S403),
+ ITResList404 = [ITRes403|ITResList403],
+
+
+ ?line {STRes404,S404} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_unsignedByte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList405 = [STRes404|STResList404],
+ ?line ITRes404 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_unsignedByte.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S404),
+ ITResList405 = [ITRes404|ITResList404],
+
+
+ ?line {STRes405,S405} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList406 = [STRes405|STResList405],
+ ?line ITRes405 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S405),
+ ITResList406 = [ITRes405|ITResList405],
+
+
+ ?line {STRes406,S406} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList407 = [STRes406|STResList406],
+ ?line ITRes406 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_decimal_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S406),
+ ITResList407 = [ITRes406|ITResList406],
+
+
+ ?line {STRes407,S407} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList408 = [STRes407|STResList407],
+ ?line ITRes407 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S407),
+ ITResList408 = [ITRes407|ITResList407],
+
+
+ ?line {STRes408,S408} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList409 = [STRes408|STResList408],
+ ?line ITRes408 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S408),
+ ITResList409 = [ITRes408|ITResList408],
+
+
+ ?line {STRes409,S409} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList410 = [STRes409|STResList409],
+ ?line ITRes409 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S409),
+ ITResList410 = [ITRes409|ITResList409],
+
+
+ ?line {STRes410,S410} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList411 = [STRes410|STResList410],
+ ?line ITRes410 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S410),
+ ITResList411 = [ITRes410|ITResList410],
+
+
+ ?line {STRes411,S411} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList412 = [STRes411|STResList411],
+ ?line ITRes411 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S411),
+ ITResList412 = [ITRes411|ITResList411],
+
+
+ ?line {STRes412,S412} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList413 = [STRes412|STResList412],
+ ?line ITRes412 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S412),
+ ITResList413 = [ITRes412|ITResList412],
+
+
+ ?line {STRes413,S413} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_base64Binary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList414 = [STRes413|STResList413],
+ ?line ITRes413 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_base64Binary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S413),
+ ITResList414 = [ITRes413|ITResList413],
+
+
+ ?line {STRes414,S414} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_hexBinary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList415 = [STRes414|STResList414],
+ ?line ITRes414 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_hexBinary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S414),
+ ITResList415 = [ITRes414|ITResList414],
+
+
+ ?line {STRes415,S415} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList416 = [STRes415|STResList415],
+ ?line ITRes415 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S415),
+ ITResList416 = [ITRes415|ITResList415],
+
+
+ ?line {STRes416,S416} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList417 = [STRes416|STResList416],
+ ?line ITRes416 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S416),
+ ITResList417 = [ITRes416|ITResList416],
+
+
+ ?line {STRes417,S417} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList418 = [STRes417|STResList417],
+ ?line ITRes417 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S417),
+ ITResList418 = [ITRes417|ITResList417],
+
+
+ ?line {STRes418,S418} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_nonPositiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList419 = [STRes418|STResList418],
+ ?line ITRes418 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_nonPositiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S418),
+ ITResList419 = [ITRes418|ITResList418],
+
+
+ ?line {STRes419,S419} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_negativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList420 = [STRes419|STResList419],
+ ?line ITRes419 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_negativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S419),
+ ITResList420 = [ITRes419|ITResList419],
+
+
+ ?line {STRes420,S420} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList421 = [STRes420|STResList420],
+ ?line ITRes420 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_long.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S420),
+ ITResList421 = [ITRes420|ITResList420],
+
+
+ ?line {STRes421,S421} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList422 = [STRes421|STResList421],
+ ?line ITRes421 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_int.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S421),
+ ITResList422 = [ITRes421|ITResList421],
+
+
+ ?line {STRes422,S422} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList423 = [STRes422|STResList422],
+ ?line ITRes422 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_short.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S422),
+ ITResList423 = [ITRes422|ITResList422],
+
+
+ ?line {STRes423,S423} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList424 = [STRes423|STResList423],
+ ?line ITRes423 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S423),
+ ITResList424 = [ITRes423|ITResList423],
+
+
+ ?line {STRes424,S424} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_nonNegativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList425 = [STRes424|STResList424],
+ ?line ITRes424 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_nonNegativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S424),
+ ITResList425 = [ITRes424|ITResList424],
+
+
+ ?line {STRes425,S425} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_positiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList426 = [STRes425|STResList425],
+ ?line ITRes425 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_positiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S425),
+ ITResList426 = [ITRes425|ITResList425],
+
+
+ ?line {STRes426,S426} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_unsignedLong.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList427 = [STRes426|STResList426],
+ ?line ITRes426 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_unsignedLong.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S426),
+ ITResList427 = [ITRes426|ITResList426],
+
+
+ ?line {STRes427,S427} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_unsignedInt.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList428 = [STRes427|STResList427],
+ ?line ITRes427 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_unsignedInt.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S427),
+ ITResList428 = [ITRes427|ITResList427],
+
+
+ ?line {STRes428,S428} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_unsignedShort.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList429 = [STRes428|STResList428],
+ ?line ITRes428 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_unsignedShort.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S428),
+ ITResList429 = [ITRes428|ITResList428],
+
+
+ ?line {STRes429,S429} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_unsignedByte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList430 = [STRes429|STResList429],
+ ?line ITRes429 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_unsignedByte.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S429),
+ ITResList430 = [ITRes429|ITResList429],
+
+
+ ?line {STRes430,S430} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList431 = [STRes430|STResList430],
+ ?line ITRes430 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S430),
+ ITResList431 = [ITRes430|ITResList430],
+
+
+ ?line {STRes431,S431} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList432 = [STRes431|STResList431],
+ ?line ITRes431 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_integer_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S431),
+ ITResList432 = [ITRes431|ITResList431],
+
+
+ ?line {STRes432,S432} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList433 = [STRes432|STResList432],
+ ?line ITRes432 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S432),
+ ITResList433 = [ITRes432|ITResList432],
+
+
+ ?line {STRes433,S433} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList434 = [STRes433|STResList433],
+ ?line ITRes433 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S433),
+ ITResList434 = [ITRes433|ITResList433],
+
+
+ ?line {STRes434,S434} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList435 = [STRes434|STResList434],
+ ?line ITRes434 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S434),
+ ITResList435 = [ITRes434|ITResList434],
+
+
+ ?line {STRes435,S435} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList436 = [STRes435|STResList435],
+ ?line ITRes435 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S435),
+ ITResList436 = [ITRes435|ITResList435],
+
+
+ ?line {STRes436,S436} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList437 = [STRes436|STResList436],
+ ?line ITRes436 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S436),
+ ITResList437 = [ITRes436|ITResList436],
+
+
+ ?line {STRes437,S437} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList438 = [STRes437|STResList437],
+ ?line ITRes437 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S437),
+ ITResList438 = [ITRes437|ITResList437],
+
+
+ ?line {STRes438,S438} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList439 = [STRes438|STResList438],
+ ?line ITRes438 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S438),
+ ITResList439 = [ITRes438|ITResList438],
+
+
+ ?line {STRes439,S439} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList440 = [STRes439|STResList439],
+ ?line ITRes439 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S439),
+ ITResList440 = [ITRes439|ITResList439],
+
+
+ ?line {STRes440,S440} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList441 = [STRes440|STResList440],
+ ?line ITRes440 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S440),
+ ITResList441 = [ITRes440|ITResList440],
+
+
+ ?line {STRes441,S441} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_nonPositiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList442 = [STRes441|STResList441],
+ ?line ITRes441 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_nonPositiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S441),
+ ITResList442 = [ITRes441|ITResList441],
+
+
+ ?line {STRes442,S442} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_negativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList443 = [STRes442|STResList442],
+ ?line ITRes442 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_negativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S442),
+ ITResList443 = [ITRes442|ITResList442],
+
+
+ ?line {STRes443,S443} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList444 = [STRes443|STResList443],
+ ?line ITRes443 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_long.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S443),
+ ITResList444 = [ITRes443|ITResList443],
+
+
+ ?line {STRes444,S444} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList445 = [STRes444|STResList444],
+ ?line ITRes444 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_int.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S444),
+ ITResList445 = [ITRes444|ITResList444],
+
+
+ ?line {STRes445,S445} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList446 = [STRes445|STResList445],
+ ?line ITRes445 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_short.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S445),
+ ITResList446 = [ITRes445|ITResList445],
+
+
+ ?line {STRes446,S446} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList447 = [STRes446|STResList446],
+ ?line ITRes446 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S446),
+ ITResList447 = [ITRes446|ITResList446],
+
+
+ ?line {STRes447,S447} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList448 = [STRes447|STResList447],
+ ?line ITRes447 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S447),
+ ITResList448 = [ITRes447|ITResList447],
+
+
+ ?line {STRes448,S448} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList449 = [STRes448|STResList448],
+ ?line ITRes448 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonPositiveInteger_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S448),
+ ITResList449 = [ITRes448|ITResList448],
+
+
+ ?line {STRes449,S449} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList450 = [STRes449|STResList449],
+ ?line ITRes449 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S449),
+ ITResList450 = [ITRes449|ITResList449],
+
+
+ ?line {STRes450,S450} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList451 = [STRes450|STResList450],
+ ?line ITRes450 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S450),
+ ITResList451 = [ITRes450|ITResList450],
+
+
+ ?line {STRes451,S451} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList452 = [STRes451|STResList451],
+ ?line ITRes451 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S451),
+ ITResList452 = [ITRes451|ITResList451],
+
+
+ ?line {STRes452,S452} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList453 = [STRes452|STResList452],
+ ?line ITRes452 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S452),
+ ITResList453 = [ITRes452|ITResList452],
+
+
+ ?line {STRes453,S453} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList454 = [STRes453|STResList453],
+ ?line ITRes453 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S453),
+ ITResList454 = [ITRes453|ITResList453],
+
+
+ ?line {STRes454,S454} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList455 = [STRes454|STResList454],
+ ?line ITRes454 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S454),
+ ITResList455 = [ITRes454|ITResList454],
+
+
+ ?line {STRes455,S455} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList456 = [STRes455|STResList455],
+ ?line ITRes455 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S455),
+ ITResList456 = [ITRes455|ITResList455],
+
+
+ ?line {STRes456,S456} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList457 = [STRes456|STResList456],
+ ?line ITRes456 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S456),
+ ITResList457 = [ITRes456|ITResList456],
+
+
+ ?line {STRes457,S457} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_nonPositiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList458 = [STRes457|STResList457],
+ ?line ITRes457 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_nonPositiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S457),
+ ITResList458 = [ITRes457|ITResList457],
+
+
+ ?line {STRes458,S458} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_negativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList459 = [STRes458|STResList458],
+ ?line ITRes458 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_negativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S458),
+ ITResList459 = [ITRes458|ITResList458],
+
+
+ ?line {STRes459,S459} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList460 = [STRes459|STResList459],
+ ?line ITRes459 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_long.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S459),
+ ITResList460 = [ITRes459|ITResList459],
+
+
+ ?line {STRes460,S460} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList461 = [STRes460|STResList460],
+ ?line ITRes460 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_int.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S460),
+ ITResList461 = [ITRes460|ITResList460],
+
+
+ ?line {STRes461,S461} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList462 = [STRes461|STResList461],
+ ?line ITRes461 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_short.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S461),
+ ITResList462 = [ITRes461|ITResList461],
+
+
+ ?line {STRes462,S462} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList463 = [STRes462|STResList462],
+ ?line ITRes462 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S462),
+ ITResList463 = [ITRes462|ITResList462],
+
+
+ ?line {STRes463,S463} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList464 = [STRes463|STResList463],
+ ?line ITRes463 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S463),
+ ITResList464 = [ITRes463|ITResList463],
+
+
+ ?line {STRes464,S464} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList465 = [STRes464|STResList464],
+ ?line ITRes464 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_negativeInteger_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S464),
+ ITResList465 = [ITRes464|ITResList464],
+
+
+ ?line {STRes465,S465} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList466 = [STRes465|STResList465],
+ ?line ITRes465 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S465),
+ ITResList466 = [ITRes465|ITResList465],
+
+
+ ?line {STRes466,S466} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList467 = [STRes466|STResList466],
+ ?line ITRes466 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S466),
+ ITResList467 = [ITRes466|ITResList466],
+
+
+ ?line {STRes467,S467} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList468 = [STRes467|STResList467],
+ ?line ITRes467 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S467),
+ ITResList468 = [ITRes467|ITResList467],
+
+
+ ?line {STRes468,S468} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList469 = [STRes468|STResList468],
+ ?line ITRes468 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S468),
+ ITResList469 = [ITRes468|ITResList468],
+
+
+ ?line {STRes469,S469} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList470 = [STRes469|STResList469],
+ ?line ITRes469 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S469),
+ ITResList470 = [ITRes469|ITResList469],
+
+
+ ?line {STRes470,S470} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList471 = [STRes470|STResList470],
+ ?line ITRes470 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S470),
+ ITResList471 = [ITRes470|ITResList470],
+
+
+ ?line {STRes471,S471} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_base64Binary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList472 = [STRes471|STResList471],
+ ?line ITRes471 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_base64Binary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S471),
+ ITResList472 = [ITRes471|ITResList471],
+
+
+ ?line {STRes472,S472} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_hexBinary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList473 = [STRes472|STResList472],
+ ?line ITRes472 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_hexBinary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S472),
+ ITResList473 = [ITRes472|ITResList472],
+
+
+ ?line {STRes473,S473} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList474 = [STRes473|STResList473],
+ ?line ITRes473 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S473),
+ ITResList474 = [ITRes473|ITResList473],
+
+
+ ?line {STRes474,S474} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList475 = [STRes474|STResList474],
+ ?line ITRes474 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S474),
+ ITResList475 = [ITRes474|ITResList474],
+
+
+ ?line {STRes475,S475} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList476 = [STRes475|STResList475],
+ ?line ITRes475 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S475),
+ ITResList476 = [ITRes475|ITResList475],
+
+
+ ?line {STRes476,S476} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_nonPositiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList477 = [STRes476|STResList476],
+ ?line ITRes476 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_nonPositiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S476),
+ ITResList477 = [ITRes476|ITResList476],
+
+
+ ?line {STRes477,S477} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_negativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList478 = [STRes477|STResList477],
+ ?line ITRes477 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_negativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S477),
+ ITResList478 = [ITRes477|ITResList477],
+
+
+ ?line {STRes478,S478} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList479 = [STRes478|STResList478],
+ ?line ITRes478 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_long.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S478),
+ ITResList479 = [ITRes478|ITResList478],
+
+
+ ?line {STRes479,S479} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList480 = [STRes479|STResList479],
+ ?line ITRes479 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_int.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S479),
+ ITResList480 = [ITRes479|ITResList479],
+
+
+ ?line {STRes480,S480} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList481 = [STRes480|STResList480],
+ ?line ITRes480 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_short.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S480),
+ ITResList481 = [ITRes480|ITResList480],
+
+
+ ?line {STRes481,S481} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList482 = [STRes481|STResList481],
+ ?line ITRes481 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S481),
+ ITResList482 = [ITRes481|ITResList481],
+
+
+ ?line {STRes482,S482} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_nonNegativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList483 = [STRes482|STResList482],
+ ?line ITRes482 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_nonNegativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S482),
+ ITResList483 = [ITRes482|ITResList482],
+
+
+ ?line {STRes483,S483} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_positiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList484 = [STRes483|STResList483],
+ ?line ITRes483 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_positiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S483),
+ ITResList484 = [ITRes483|ITResList483],
+
+
+ ?line {STRes484,S484} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_unsignedLong.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList485 = [STRes484|STResList484],
+ ?line ITRes484 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_unsignedLong.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S484),
+ ITResList485 = [ITRes484|ITResList484],
+
+
+ ?line {STRes485,S485} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_unsignedInt.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList486 = [STRes485|STResList485],
+ ?line ITRes485 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_unsignedInt.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S485),
+ ITResList486 = [ITRes485|ITResList485],
+
+
+ ?line {STRes486,S486} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_unsignedShort.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList487 = [STRes486|STResList486],
+ ?line ITRes486 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_unsignedShort.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S486),
+ ITResList487 = [ITRes486|ITResList486],
+
+
+ ?line {STRes487,S487} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_unsignedByte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList488 = [STRes487|STResList487],
+ ?line ITRes487 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_unsignedByte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S487),
+ ITResList488 = [ITRes487|ITResList487],
+
+
+ ?line {STRes488,S488} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList489 = [STRes488|STResList488],
+ ?line ITRes488 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S488),
+ ITResList489 = [ITRes488|ITResList488],
+
+
+ ?line {STRes489,S489} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList490 = [STRes489|STResList489],
+ ?line ITRes489 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_long_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S489),
+ ITResList490 = [ITRes489|ITResList489],
+
+
+ ?line {STRes490,S490} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList491 = [STRes490|STResList490],
+ ?line ITRes490 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S490),
+ ITResList491 = [ITRes490|ITResList490],
+
+
+ ?line {STRes491,S491} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList492 = [STRes491|STResList491],
+ ?line ITRes491 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S491),
+ ITResList492 = [ITRes491|ITResList491],
+
+
+ ?line {STRes492,S492} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList493 = [STRes492|STResList492],
+ ?line ITRes492 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S492),
+ ITResList493 = [ITRes492|ITResList492],
+
+
+ ?line {STRes493,S493} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList494 = [STRes493|STResList493],
+ ?line ITRes493 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S493),
+ ITResList494 = [ITRes493|ITResList493],
+
+
+ ?line {STRes494,S494} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList495 = [STRes494|STResList494],
+ ?line ITRes494 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S494),
+ ITResList495 = [ITRes494|ITResList494],
+
+
+ ?line {STRes495,S495} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList496 = [STRes495|STResList495],
+ ?line ITRes495 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S495),
+ ITResList496 = [ITRes495|ITResList495],
+
+
+ ?line {STRes496,S496} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_base64Binary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList497 = [STRes496|STResList496],
+ ?line ITRes496 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_base64Binary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S496),
+ ITResList497 = [ITRes496|ITResList496],
+
+
+ ?line {STRes497,S497} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_hexBinary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList498 = [STRes497|STResList497],
+ ?line ITRes497 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_hexBinary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S497),
+ ITResList498 = [ITRes497|ITResList497],
+
+
+ ?line {STRes498,S498} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList499 = [STRes498|STResList498],
+ ?line ITRes498 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S498),
+ ITResList499 = [ITRes498|ITResList498],
+
+
+ ?line {STRes499,S499} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList500 = [STRes499|STResList499],
+ ?line ITRes499 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S499),
+ ITResList500 = [ITRes499|ITResList499],
+
+
+ ?line {STRes500,S500} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList501 = [STRes500|STResList500],
+ ?line ITRes500 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S500),
+ ITResList501 = [ITRes500|ITResList500],
+
+
+ ?line {STRes501,S501} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_nonPositiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList502 = [STRes501|STResList501],
+ ?line ITRes501 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_nonPositiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S501),
+ ITResList502 = [ITRes501|ITResList501],
+
+
+ ?line {STRes502,S502} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_negativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList503 = [STRes502|STResList502],
+ ?line ITRes502 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_negativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S502),
+ ITResList503 = [ITRes502|ITResList502],
+
+
+ ?line {STRes503,S503} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList504 = [STRes503|STResList503],
+ ?line ITRes503 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_long.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S503),
+ ITResList504 = [ITRes503|ITResList503],
+
+
+ ?line {STRes504,S504} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList505 = [STRes504|STResList504],
+ ?line ITRes504 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_int.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S504),
+ ITResList505 = [ITRes504|ITResList504],
+
+
+ ?line {STRes505,S505} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList506 = [STRes505|STResList505],
+ ?line ITRes505 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_short.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S505),
+ ITResList506 = [ITRes505|ITResList505],
+
+
+ ?line {STRes506,S506} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList507 = [STRes506|STResList506],
+ ?line ITRes506 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S506),
+ ITResList507 = [ITRes506|ITResList506],
+
+
+ ?line {STRes507,S507} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_nonNegativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList508 = [STRes507|STResList507],
+ ?line ITRes507 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_nonNegativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S507),
+ ITResList508 = [ITRes507|ITResList507],
+
+
+ ?line {STRes508,S508} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_positiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList509 = [STRes508|STResList508],
+ ?line ITRes508 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_positiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S508),
+ ITResList509 = [ITRes508|ITResList508],
+
+
+ ?line {STRes509,S509} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_unsignedLong.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList510 = [STRes509|STResList509],
+ ?line ITRes509 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_unsignedLong.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S509),
+ ITResList510 = [ITRes509|ITResList509],
+
+
+ ?line {STRes510,S510} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_unsignedInt.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList511 = [STRes510|STResList510],
+ ?line ITRes510 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_unsignedInt.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S510),
+ ITResList511 = [ITRes510|ITResList510],
+
+
+ ?line {STRes511,S511} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_unsignedShort.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList512 = [STRes511|STResList511],
+ ?line ITRes511 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_unsignedShort.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S511),
+ ITResList512 = [ITRes511|ITResList511],
+
+
+ ?line {STRes512,S512} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_unsignedByte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList513 = [STRes512|STResList512],
+ ?line ITRes512 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_unsignedByte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S512),
+ ITResList513 = [ITRes512|ITResList512],
+
+
+ ?line {STRes513,S513} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList514 = [STRes513|STResList513],
+ ?line ITRes513 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S513),
+ ITResList514 = [ITRes513|ITResList513],
+
+
+ ?line {STRes514,S514} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList515 = [STRes514|STResList514],
+ ?line ITRes514 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_int_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S514),
+ ITResList515 = [ITRes514|ITResList514],
+
+
+ ?line {STRes515,S515} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList516 = [STRes515|STResList515],
+ ?line ITRes515 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S515),
+ ITResList516 = [ITRes515|ITResList515],
+
+
+ ?line {STRes516,S516} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList517 = [STRes516|STResList516],
+ ?line ITRes516 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S516),
+ ITResList517 = [ITRes516|ITResList516],
+
+
+ ?line {STRes517,S517} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList518 = [STRes517|STResList517],
+ ?line ITRes517 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S517),
+ ITResList518 = [ITRes517|ITResList517],
+
+
+ ?line {STRes518,S518} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList519 = [STRes518|STResList518],
+ ?line ITRes518 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S518),
+ ITResList519 = [ITRes518|ITResList518],
+
+
+ ?line {STRes519,S519} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList520 = [STRes519|STResList519],
+ ?line ITRes519 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S519),
+ ITResList520 = [ITRes519|ITResList519],
+
+
+ ?line {STRes520,S520} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList521 = [STRes520|STResList520],
+ ?line ITRes520 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S520),
+ ITResList521 = [ITRes520|ITResList520],
+
+
+ ?line {STRes521,S521} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_base64Binary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList522 = [STRes521|STResList521],
+ ?line ITRes521 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_base64Binary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S521),
+ ITResList522 = [ITRes521|ITResList521],
+
+
+ ?line {STRes522,S522} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_hexBinary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList523 = [STRes522|STResList522],
+ ?line ITRes522 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_hexBinary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S522),
+ ITResList523 = [ITRes522|ITResList522],
+
+
+ ?line {STRes523,S523} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList524 = [STRes523|STResList523],
+ ?line ITRes523 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S523),
+ ITResList524 = [ITRes523|ITResList523],
+
+
+ ?line {STRes524,S524} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList525 = [STRes524|STResList524],
+ ?line ITRes524 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S524),
+ ITResList525 = [ITRes524|ITResList524],
+
+
+ ?line {STRes525,S525} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList526 = [STRes525|STResList525],
+ ?line ITRes525 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S525),
+ ITResList526 = [ITRes525|ITResList525],
+
+
+ ?line {STRes526,S526} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_nonPositiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList527 = [STRes526|STResList526],
+ ?line ITRes526 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_nonPositiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S526),
+ ITResList527 = [ITRes526|ITResList526],
+
+
+ ?line {STRes527,S527} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_negativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList528 = [STRes527|STResList527],
+ ?line ITRes527 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_negativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S527),
+ ITResList528 = [ITRes527|ITResList527],
+
+
+ ?line {STRes528,S528} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList529 = [STRes528|STResList528],
+ ?line ITRes528 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_long.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S528),
+ ITResList529 = [ITRes528|ITResList528],
+
+
+ ?line {STRes529,S529} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList530 = [STRes529|STResList529],
+ ?line ITRes529 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_int.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S529),
+ ITResList530 = [ITRes529|ITResList529],
+
+
+ ?line {STRes530,S530} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList531 = [STRes530|STResList530],
+ ?line ITRes530 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_short.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S530),
+ ITResList531 = [ITRes530|ITResList530],
+
+
+ ?line {STRes531,S531} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList532 = [STRes531|STResList531],
+ ?line ITRes531 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S531),
+ ITResList532 = [ITRes531|ITResList531],
+
+
+ ?line {STRes532,S532} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_nonNegativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList533 = [STRes532|STResList532],
+ ?line ITRes532 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_nonNegativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S532),
+ ITResList533 = [ITRes532|ITResList532],
+
+
+ ?line {STRes533,S533} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_positiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList534 = [STRes533|STResList533],
+ ?line ITRes533 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_positiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S533),
+ ITResList534 = [ITRes533|ITResList533],
+
+
+ ?line {STRes534,S534} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_unsignedLong.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList535 = [STRes534|STResList534],
+ ?line ITRes534 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_unsignedLong.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S534),
+ ITResList535 = [ITRes534|ITResList534],
+
+
+ ?line {STRes535,S535} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_unsignedInt.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList536 = [STRes535|STResList535],
+ ?line ITRes535 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_unsignedInt.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S535),
+ ITResList536 = [ITRes535|ITResList535],
+
+
+ ?line {STRes536,S536} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_unsignedShort.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList537 = [STRes536|STResList536],
+ ?line ITRes536 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_unsignedShort.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S536),
+ ITResList537 = [ITRes536|ITResList536],
+
+
+ ?line {STRes537,S537} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_unsignedByte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList538 = [STRes537|STResList537],
+ ?line ITRes537 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_unsignedByte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S537),
+ ITResList538 = [ITRes537|ITResList537],
+
+
+ ?line {STRes538,S538} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList539 = [STRes538|STResList538],
+ ?line ITRes538 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S538),
+ ITResList539 = [ITRes538|ITResList538],
+
+
+ ?line {STRes539,S539} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList540 = [STRes539|STResList539],
+ ?line ITRes539 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_short_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S539),
+ ITResList540 = [ITRes539|ITResList539],
+
+
+ ?line {STRes540,S540} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList541 = [STRes540|STResList540],
+ ?line ITRes540 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S540),
+ ITResList541 = [ITRes540|ITResList540],
+
+
+ ?line {STRes541,S541} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList542 = [STRes541|STResList541],
+ ?line ITRes541 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S541),
+ ITResList542 = [ITRes541|ITResList541],
+
+
+ ?line {STRes542,S542} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList543 = [STRes542|STResList542],
+ ?line ITRes542 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S542),
+ ITResList543 = [ITRes542|ITResList542],
+
+
+ ?line {STRes543,S543} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList544 = [STRes543|STResList543],
+ ?line ITRes543 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S543),
+ ITResList544 = [ITRes543|ITResList543],
+
+
+ ?line {STRes544,S544} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList545 = [STRes544|STResList544],
+ ?line ITRes544 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S544),
+ ITResList545 = [ITRes544|ITResList544],
+
+
+ ?line {STRes545,S545} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList546 = [STRes545|STResList545],
+ ?line ITRes545 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S545),
+ ITResList546 = [ITRes545|ITResList545],
+
+
+ ?line {STRes546,S546} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_base64Binary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList547 = [STRes546|STResList546],
+ ?line ITRes546 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_base64Binary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S546),
+ ITResList547 = [ITRes546|ITResList546],
+
+
+ ?line {STRes547,S547} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_hexBinary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList548 = [STRes547|STResList547],
+ ?line ITRes547 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_hexBinary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S547),
+ ITResList548 = [ITRes547|ITResList547],
+
+
+ ?line {STRes548,S548} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList549 = [STRes548|STResList548],
+ ?line ITRes548 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S548),
+ ITResList549 = [ITRes548|ITResList548],
+
+
+ ?line {STRes549,S549} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList550 = [STRes549|STResList549],
+ ?line ITRes549 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S549),
+ ITResList550 = [ITRes549|ITResList549],
+
+
+ ?line {STRes550,S550} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList551 = [STRes550|STResList550],
+ ?line ITRes550 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S550),
+ ITResList551 = [ITRes550|ITResList550],
+
+
+ ?line {STRes551,S551} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_nonPositiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList552 = [STRes551|STResList551],
+ ?line ITRes551 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_nonPositiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S551),
+ ITResList552 = [ITRes551|ITResList551],
+
+
+ ?line {STRes552,S552} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_negativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList553 = [STRes552|STResList552],
+ ?line ITRes552 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_negativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S552),
+ ITResList553 = [ITRes552|ITResList552],
+
+
+ ?line {STRes553,S553} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList554 = [STRes553|STResList553],
+ ?line ITRes553 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_long.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S553),
+ ITResList554 = [ITRes553|ITResList553],
+
+
+ ?line {STRes554,S554} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList555 = [STRes554|STResList554],
+ ?line ITRes554 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_int.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S554),
+ ITResList555 = [ITRes554|ITResList554],
+
+
+ ?line {STRes555,S555} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList556 = [STRes555|STResList555],
+ ?line ITRes555 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_short.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S555),
+ ITResList556 = [ITRes555|ITResList555],
+
+
+ ?line {STRes556,S556} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList557 = [STRes556|STResList556],
+ ?line ITRes556 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S556),
+ ITResList557 = [ITRes556|ITResList556],
+
+
+ ?line {STRes557,S557} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_nonNegativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList558 = [STRes557|STResList557],
+ ?line ITRes557 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_nonNegativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S557),
+ ITResList558 = [ITRes557|ITResList557],
+
+
+ ?line {STRes558,S558} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_positiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList559 = [STRes558|STResList558],
+ ?line ITRes558 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_positiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S558),
+ ITResList559 = [ITRes558|ITResList558],
+
+
+ ?line {STRes559,S559} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_unsignedLong.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList560 = [STRes559|STResList559],
+ ?line ITRes559 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_unsignedLong.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S559),
+ ITResList560 = [ITRes559|ITResList559],
+
+
+ ?line {STRes560,S560} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_unsignedInt.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList561 = [STRes560|STResList560],
+ ?line ITRes560 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_unsignedInt.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S560),
+ ITResList561 = [ITRes560|ITResList560],
+
+
+ ?line {STRes561,S561} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_unsignedShort.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList562 = [STRes561|STResList561],
+ ?line ITRes561 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_unsignedShort.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S561),
+ ITResList562 = [ITRes561|ITResList561],
+
+
+ ?line {STRes562,S562} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_unsignedByte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList563 = [STRes562|STResList562],
+ ?line ITRes562 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_unsignedByte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S562),
+ ITResList563 = [ITRes562|ITResList562],
+
+
+ ?line {STRes563,S563} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList564 = [STRes563|STResList563],
+ ?line ITRes563 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S563),
+ ITResList564 = [ITRes563|ITResList563],
+
+
+ ?line {STRes564,S564} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList565 = [STRes564|STResList564],
+ ?line ITRes564 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_byte_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S564),
+ ITResList565 = [ITRes564|ITResList564],
+
+
+ ?line {STRes565,S565} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList566 = [STRes565|STResList565],
+ ?line ITRes565 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S565),
+ ITResList566 = [ITRes565|ITResList565],
+
+
+ ?line {STRes566,S566} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList567 = [STRes566|STResList566],
+ ?line ITRes566 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S566),
+ ITResList567 = [ITRes566|ITResList566],
+
+
+ ?line {STRes567,S567} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList568 = [STRes567|STResList567],
+ ?line ITRes567 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S567),
+ ITResList568 = [ITRes567|ITResList567],
+
+
+ ?line {STRes568,S568} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList569 = [STRes568|STResList568],
+ ?line ITRes568 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S568),
+ ITResList569 = [ITRes568|ITResList568],
+
+
+ ?line {STRes569,S569} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList570 = [STRes569|STResList569],
+ ?line ITRes569 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S569),
+ ITResList570 = [ITRes569|ITResList569],
+
+
+ ?line {STRes570,S570} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList571 = [STRes570|STResList570],
+ ?line ITRes570 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S570),
+ ITResList571 = [ITRes570|ITResList570],
+
+
+ ?line {STRes571,S571} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_base64Binary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList572 = [STRes571|STResList571],
+ ?line ITRes571 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_base64Binary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S571),
+ ITResList572 = [ITRes571|ITResList571],
+
+
+ ?line {STRes572,S572} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_hexBinary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList573 = [STRes572|STResList572],
+ ?line ITRes572 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_hexBinary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S572),
+ ITResList573 = [ITRes572|ITResList572],
+
+
+ ?line {STRes573,S573} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList574 = [STRes573|STResList573],
+ ?line ITRes573 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S573),
+ ITResList574 = [ITRes573|ITResList573],
+
+
+ ?line {STRes574,S574} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList575 = [STRes574|STResList574],
+ ?line ITRes574 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S574),
+ ITResList575 = [ITRes574|ITResList574],
+
+
+ ?line {STRes575,S575} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList576 = [STRes575|STResList575],
+ ?line ITRes575 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S575),
+ ITResList576 = [ITRes575|ITResList575],
+
+
+ ?line {STRes576,S576} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList577 = [STRes576|STResList576],
+ ?line ITRes576 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_long.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S576),
+ ITResList577 = [ITRes576|ITResList576],
+
+
+ ?line {STRes577,S577} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList578 = [STRes577|STResList577],
+ ?line ITRes577 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_int.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S577),
+ ITResList578 = [ITRes577|ITResList577],
+
+
+ ?line {STRes578,S578} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList579 = [STRes578|STResList578],
+ ?line ITRes578 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_short.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S578),
+ ITResList579 = [ITRes578|ITResList578],
+
+
+ ?line {STRes579,S579} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList580 = [STRes579|STResList579],
+ ?line ITRes579 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S579),
+ ITResList580 = [ITRes579|ITResList579],
+
+
+ ?line {STRes580,S580} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_nonNegativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList581 = [STRes580|STResList580],
+ ?line ITRes580 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_nonNegativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S580),
+ ITResList581 = [ITRes580|ITResList580],
+
+
+ ?line {STRes581,S581} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_positiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList582 = [STRes581|STResList581],
+ ?line ITRes581 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_positiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S581),
+ ITResList582 = [ITRes581|ITResList581],
+
+
+ ?line {STRes582,S582} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_unsignedLong.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList583 = [STRes582|STResList582],
+ ?line ITRes582 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_unsignedLong.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S582),
+ ITResList583 = [ITRes582|ITResList582],
+
+
+ ?line {STRes583,S583} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_unsignedInt.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList584 = [STRes583|STResList583],
+ ?line ITRes583 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_unsignedInt.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S583),
+ ITResList584 = [ITRes583|ITResList583],
+
+
+ ?line {STRes584,S584} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_unsignedShort.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList585 = [STRes584|STResList584],
+ ?line ITRes584 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_unsignedShort.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S584),
+ ITResList585 = [ITRes584|ITResList584],
+
+
+ ?line {STRes585,S585} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_unsignedByte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList586 = [STRes585|STResList585],
+ ?line ITRes585 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_unsignedByte.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S585),
+ ITResList586 = [ITRes585|ITResList585],
+
+
+ ?line {STRes586,S586} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList587 = [STRes586|STResList586],
+ ?line ITRes586 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S586),
+ ITResList587 = [ITRes586|ITResList586],
+
+
+ ?line {STRes587,S587} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList588 = [STRes587|STResList587],
+ ?line ITRes587 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_nonNegativeInteger_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S587),
+ ITResList588 = [ITRes587|ITResList587],
+
+
+ ?line {STRes588,S588} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList589 = [STRes588|STResList588],
+ ?line ITRes588 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S588),
+ ITResList589 = [ITRes588|ITResList588],
+
+
+ ?line {STRes589,S589} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList590 = [STRes589|STResList589],
+ ?line ITRes589 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S589),
+ ITResList590 = [ITRes589|ITResList589],
+
+
+ ?line {STRes590,S590} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList591 = [STRes590|STResList590],
+ ?line ITRes590 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S590),
+ ITResList591 = [ITRes590|ITResList590],
+
+
+ ?line {STRes591,S591} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList592 = [STRes591|STResList591],
+ ?line ITRes591 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S591),
+ ITResList592 = [ITRes591|ITResList591],
+
+
+ ?line {STRes592,S592} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList593 = [STRes592|STResList592],
+ ?line ITRes592 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S592),
+ ITResList593 = [ITRes592|ITResList592],
+
+
+ ?line {STRes593,S593} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList594 = [STRes593|STResList593],
+ ?line ITRes593 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S593),
+ ITResList594 = [ITRes593|ITResList593],
+
+
+ ?line {STRes594,S594} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_base64Binary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList595 = [STRes594|STResList594],
+ ?line ITRes594 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_base64Binary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S594),
+ ITResList595 = [ITRes594|ITResList594],
+
+
+ ?line {STRes595,S595} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_hexBinary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList596 = [STRes595|STResList595],
+ ?line ITRes595 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_hexBinary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S595),
+ ITResList596 = [ITRes595|ITResList595],
+
+
+ ?line {STRes596,S596} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList597 = [STRes596|STResList596],
+ ?line ITRes596 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S596),
+ ITResList597 = [ITRes596|ITResList596],
+
+
+ ?line {STRes597,S597} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList598 = [STRes597|STResList597],
+ ?line ITRes597 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S597),
+ ITResList598 = [ITRes597|ITResList597],
+
+
+ ?line {STRes598,S598} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList599 = [STRes598|STResList598],
+ ?line ITRes598 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S598),
+ ITResList599 = [ITRes598|ITResList598],
+
+
+ ?line {STRes599,S599} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList600 = [STRes599|STResList599],
+ ?line ITRes599 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_long.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S599),
+ ITResList600 = [ITRes599|ITResList599],
+
+
+ ?line {STRes600,S600} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList601 = [STRes600|STResList600],
+ ?line ITRes600 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_int.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S600),
+ ITResList601 = [ITRes600|ITResList600],
+
+
+ ?line {STRes601,S601} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList602 = [STRes601|STResList601],
+ ?line ITRes601 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_short.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S601),
+ ITResList602 = [ITRes601|ITResList601],
+
+
+ ?line {STRes602,S602} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList603 = [STRes602|STResList602],
+ ?line ITRes602 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S602),
+ ITResList603 = [ITRes602|ITResList602],
+
+
+ ?line {STRes603,S603} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_nonNegativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList604 = [STRes603|STResList603],
+ ?line ITRes603 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_nonNegativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S603),
+ ITResList604 = [ITRes603|ITResList603],
+
+
+ ?line {STRes604,S604} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_positiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList605 = [STRes604|STResList604],
+ ?line ITRes604 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_positiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S604),
+ ITResList605 = [ITRes604|ITResList604],
+
+
+ ?line {STRes605,S605} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_unsignedLong.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList606 = [STRes605|STResList605],
+ ?line ITRes605 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_unsignedLong.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S605),
+ ITResList606 = [ITRes605|ITResList605],
+
+
+ ?line {STRes606,S606} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_unsignedInt.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList607 = [STRes606|STResList606],
+ ?line ITRes606 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_unsignedInt.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S606),
+ ITResList607 = [ITRes606|ITResList606],
+
+
+ ?line {STRes607,S607} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_unsignedShort.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList608 = [STRes607|STResList607],
+ ?line ITRes607 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_unsignedShort.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S607),
+ ITResList608 = [ITRes607|ITResList607],
+
+
+ ?line {STRes608,S608} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_unsignedByte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList609 = [STRes608|STResList608],
+ ?line ITRes608 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_unsignedByte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S608),
+ ITResList609 = [ITRes608|ITResList608],
+
+
+ ?line {STRes609,S609} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList610 = [STRes609|STResList609],
+ ?line ITRes609 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S609),
+ ITResList610 = [ITRes609|ITResList609],
+
+
+ ?line {STRes610,S610} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList611 = [STRes610|STResList610],
+ ?line ITRes610 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_positiveInteger_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S610),
+ ITResList611 = [ITRes610|ITResList610],
+
+
+ ?line {STRes611,S611} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList612 = [STRes611|STResList611],
+ ?line ITRes611 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S611),
+ ITResList612 = [ITRes611|ITResList611],
+
+
+ ?line {STRes612,S612} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList613 = [STRes612|STResList612],
+ ?line ITRes612 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S612),
+ ITResList613 = [ITRes612|ITResList612],
+
+
+ ?line {STRes613,S613} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList614 = [STRes613|STResList613],
+ ?line ITRes613 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S613),
+ ITResList614 = [ITRes613|ITResList613],
+
+
+ ?line {STRes614,S614} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList615 = [STRes614|STResList614],
+ ?line ITRes614 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S614),
+ ITResList615 = [ITRes614|ITResList614],
+
+
+ ?line {STRes615,S615} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList616 = [STRes615|STResList615],
+ ?line ITRes615 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S615),
+ ITResList616 = [ITRes615|ITResList615],
+
+
+ ?line {STRes616,S616} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList617 = [STRes616|STResList616],
+ ?line ITRes616 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S616),
+ ITResList617 = [ITRes616|ITResList616],
+
+
+ ?line {STRes617,S617} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_base64Binary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList618 = [STRes617|STResList617],
+ ?line ITRes617 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_base64Binary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S617),
+ ITResList618 = [ITRes617|ITResList617],
+
+
+ ?line {STRes618,S618} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_hexBinary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList619 = [STRes618|STResList618],
+ ?line ITRes618 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_hexBinary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S618),
+ ITResList619 = [ITRes618|ITResList618],
+
+
+ ?line {STRes619,S619} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList620 = [STRes619|STResList619],
+ ?line ITRes619 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S619),
+ ITResList620 = [ITRes619|ITResList619],
+
+
+ ?line {STRes620,S620} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList621 = [STRes620|STResList620],
+ ?line ITRes620 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S620),
+ ITResList621 = [ITRes620|ITResList620],
+
+
+ ?line {STRes621,S621} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList622 = [STRes621|STResList621],
+ ?line ITRes621 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S621),
+ ITResList622 = [ITRes621|ITResList621],
+
+
+ ?line {STRes622,S622} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList623 = [STRes622|STResList622],
+ ?line ITRes622 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_long.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S622),
+ ITResList623 = [ITRes622|ITResList622],
+
+
+ ?line {STRes623,S623} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList624 = [STRes623|STResList623],
+ ?line ITRes623 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_int.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S623),
+ ITResList624 = [ITRes623|ITResList623],
+
+
+ ?line {STRes624,S624} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList625 = [STRes624|STResList624],
+ ?line ITRes624 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_short.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S624),
+ ITResList625 = [ITRes624|ITResList624],
+
+
+ ?line {STRes625,S625} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList626 = [STRes625|STResList625],
+ ?line ITRes625 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S625),
+ ITResList626 = [ITRes625|ITResList625],
+
+
+ ?line {STRes626,S626} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_nonNegativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList627 = [STRes626|STResList626],
+ ?line ITRes626 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_nonNegativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S626),
+ ITResList627 = [ITRes626|ITResList626],
+
+
+ ?line {STRes627,S627} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_positiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList628 = [STRes627|STResList627],
+ ?line ITRes627 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_positiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S627),
+ ITResList628 = [ITRes627|ITResList627],
+
+
+ ?line {STRes628,S628} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_unsignedLong.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList629 = [STRes628|STResList628],
+ ?line ITRes628 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_unsignedLong.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S628),
+ ITResList629 = [ITRes628|ITResList628],
+
+
+ ?line {STRes629,S629} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_unsignedInt.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList630 = [STRes629|STResList629],
+ ?line ITRes629 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_unsignedInt.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S629),
+ ITResList630 = [ITRes629|ITResList629],
+
+
+ ?line {STRes630,S630} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_unsignedShort.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList631 = [STRes630|STResList630],
+ ?line ITRes630 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_unsignedShort.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S630),
+ ITResList631 = [ITRes630|ITResList630],
+
+
+ ?line {STRes631,S631} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_unsignedByte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList632 = [STRes631|STResList631],
+ ?line ITRes631 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_unsignedByte.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S631),
+ ITResList632 = [ITRes631|ITResList631],
+
+
+ ?line {STRes632,S632} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList633 = [STRes632|STResList632],
+ ?line ITRes632 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S632),
+ ITResList633 = [ITRes632|ITResList632],
+
+
+ ?line {STRes633,S633} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList634 = [STRes633|STResList633],
+ ?line ITRes633 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedLong_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S633),
+ ITResList634 = [ITRes633|ITResList633],
+
+
+ ?line {STRes634,S634} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList635 = [STRes634|STResList634],
+ ?line ITRes634 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S634),
+ ITResList635 = [ITRes634|ITResList634],
+
+
+ ?line {STRes635,S635} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList636 = [STRes635|STResList635],
+ ?line ITRes635 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S635),
+ ITResList636 = [ITRes635|ITResList635],
+
+
+ ?line {STRes636,S636} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList637 = [STRes636|STResList636],
+ ?line ITRes636 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S636),
+ ITResList637 = [ITRes636|ITResList636],
+
+
+ ?line {STRes637,S637} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList638 = [STRes637|STResList637],
+ ?line ITRes637 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S637),
+ ITResList638 = [ITRes637|ITResList637],
+
+
+ ?line {STRes638,S638} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList639 = [STRes638|STResList638],
+ ?line ITRes638 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S638),
+ ITResList639 = [ITRes638|ITResList638],
+
+
+ ?line {STRes639,S639} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList640 = [STRes639|STResList639],
+ ?line ITRes639 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S639),
+ ITResList640 = [ITRes639|ITResList639],
+
+
+ ?line {STRes640,S640} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_base64Binary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList641 = [STRes640|STResList640],
+ ?line ITRes640 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_base64Binary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S640),
+ ITResList641 = [ITRes640|ITResList640],
+
+
+ ?line {STRes641,S641} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_hexBinary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList642 = [STRes641|STResList641],
+ ?line ITRes641 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_hexBinary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S641),
+ ITResList642 = [ITRes641|ITResList641],
+
+
+ ?line {STRes642,S642} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList643 = [STRes642|STResList642],
+ ?line ITRes642 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S642),
+ ITResList643 = [ITRes642|ITResList642],
+
+
+ ?line {STRes643,S643} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList644 = [STRes643|STResList643],
+ ?line ITRes643 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S643),
+ ITResList644 = [ITRes643|ITResList643],
+
+
+ ?line {STRes644,S644} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList645 = [STRes644|STResList644],
+ ?line ITRes644 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S644),
+ ITResList645 = [ITRes644|ITResList644],
+
+
+ ?line {STRes645,S645} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList646 = [STRes645|STResList645],
+ ?line ITRes645 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_long.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S645),
+ ITResList646 = [ITRes645|ITResList645],
+
+
+ ?line {STRes646,S646} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList647 = [STRes646|STResList646],
+ ?line ITRes646 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_int.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S646),
+ ITResList647 = [ITRes646|ITResList646],
+
+
+ ?line {STRes647,S647} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList648 = [STRes647|STResList647],
+ ?line ITRes647 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_short.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S647),
+ ITResList648 = [ITRes647|ITResList647],
+
+
+ ?line {STRes648,S648} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList649 = [STRes648|STResList648],
+ ?line ITRes648 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S648),
+ ITResList649 = [ITRes648|ITResList648],
+
+
+ ?line {STRes649,S649} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_nonNegativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList650 = [STRes649|STResList649],
+ ?line ITRes649 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_nonNegativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S649),
+ ITResList650 = [ITRes649|ITResList649],
+
+
+ ?line {STRes650,S650} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_positiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList651 = [STRes650|STResList650],
+ ?line ITRes650 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_positiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S650),
+ ITResList651 = [ITRes650|ITResList650],
+
+
+ ?line {STRes651,S651} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_unsignedLong.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList652 = [STRes651|STResList651],
+ ?line ITRes651 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_unsignedLong.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S651),
+ ITResList652 = [ITRes651|ITResList651],
+
+
+ ?line {STRes652,S652} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_unsignedInt.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList653 = [STRes652|STResList652],
+ ?line ITRes652 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_unsignedInt.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S652),
+ ITResList653 = [ITRes652|ITResList652],
+
+
+ ?line {STRes653,S653} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_unsignedShort.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList654 = [STRes653|STResList653],
+ ?line ITRes653 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_unsignedShort.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S653),
+ ITResList654 = [ITRes653|ITResList653],
+
+
+ ?line {STRes654,S654} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_unsignedByte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList655 = [STRes654|STResList654],
+ ?line ITRes654 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_unsignedByte.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S654),
+ ITResList655 = [ITRes654|ITResList654],
+
+
+ ?line {STRes655,S655} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList656 = [STRes655|STResList655],
+ ?line ITRes655 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S655),
+ ITResList656 = [ITRes655|ITResList655],
+
+
+ ?line {STRes656,S656} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList657 = [STRes656|STResList656],
+ ?line ITRes656 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedInt_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S656),
+ ITResList657 = [ITRes656|ITResList656],
+
+
+ ?line {STRes657,S657} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList658 = [STRes657|STResList657],
+ ?line ITRes657 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S657),
+ ITResList658 = [ITRes657|ITResList657],
+
+
+ ?line {STRes658,S658} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList659 = [STRes658|STResList658],
+ ?line ITRes658 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S658),
+ ITResList659 = [ITRes658|ITResList658],
+
+
+ ?line {STRes659,S659} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList660 = [STRes659|STResList659],
+ ?line ITRes659 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S659),
+ ITResList660 = [ITRes659|ITResList659],
+
+
+ ?line {STRes660,S660} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList661 = [STRes660|STResList660],
+ ?line ITRes660 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S660),
+ ITResList661 = [ITRes660|ITResList660],
+
+
+ ?line {STRes661,S661} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList662 = [STRes661|STResList661],
+ ?line ITRes661 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S661),
+ ITResList662 = [ITRes661|ITResList661],
+
+
+ ?line {STRes662,S662} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList663 = [STRes662|STResList662],
+ ?line ITRes662 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S662),
+ ITResList663 = [ITRes662|ITResList662],
+
+
+ ?line {STRes663,S663} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_base64Binary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList664 = [STRes663|STResList663],
+ ?line ITRes663 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_base64Binary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S663),
+ ITResList664 = [ITRes663|ITResList663],
+
+
+ ?line {STRes664,S664} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_hexBinary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList665 = [STRes664|STResList664],
+ ?line ITRes664 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_hexBinary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S664),
+ ITResList665 = [ITRes664|ITResList664],
+
+
+ ?line {STRes665,S665} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList666 = [STRes665|STResList665],
+ ?line ITRes665 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S665),
+ ITResList666 = [ITRes665|ITResList665],
+
+
+ ?line {STRes666,S666} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList667 = [STRes666|STResList666],
+ ?line ITRes666 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S666),
+ ITResList667 = [ITRes666|ITResList666],
+
+
+ ?line {STRes667,S667} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList668 = [STRes667|STResList667],
+ ?line ITRes667 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S667),
+ ITResList668 = [ITRes667|ITResList667],
+
+
+ ?line {STRes668,S668} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList669 = [STRes668|STResList668],
+ ?line ITRes668 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_long.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S668),
+ ITResList669 = [ITRes668|ITResList668],
+
+
+ ?line {STRes669,S669} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList670 = [STRes669|STResList669],
+ ?line ITRes669 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_int.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S669),
+ ITResList670 = [ITRes669|ITResList669],
+
+
+ ?line {STRes670,S670} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList671 = [STRes670|STResList670],
+ ?line ITRes670 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_short.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S670),
+ ITResList671 = [ITRes670|ITResList670],
+
+
+ ?line {STRes671,S671} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList672 = [STRes671|STResList671],
+ ?line ITRes671 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S671),
+ ITResList672 = [ITRes671|ITResList671],
+
+
+ ?line {STRes672,S672} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_nonNegativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList673 = [STRes672|STResList672],
+ ?line ITRes672 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_nonNegativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S672),
+ ITResList673 = [ITRes672|ITResList672],
+
+
+ ?line {STRes673,S673} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_positiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList674 = [STRes673|STResList673],
+ ?line ITRes673 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_positiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S673),
+ ITResList674 = [ITRes673|ITResList673],
+
+
+ ?line {STRes674,S674} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_unsignedLong.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList675 = [STRes674|STResList674],
+ ?line ITRes674 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_unsignedLong.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S674),
+ ITResList675 = [ITRes674|ITResList674],
+
+
+ ?line {STRes675,S675} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_unsignedInt.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList676 = [STRes675|STResList675],
+ ?line ITRes675 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_unsignedInt.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S675),
+ ITResList676 = [ITRes675|ITResList675],
+
+
+ ?line {STRes676,S676} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_unsignedShort.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList677 = [STRes676|STResList676],
+ ?line ITRes676 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_unsignedShort.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S676),
+ ITResList677 = [ITRes676|ITResList676],
+
+
+ ?line {STRes677,S677} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_unsignedByte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList678 = [STRes677|STResList677],
+ ?line ITRes677 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_unsignedByte.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S677),
+ ITResList678 = [ITRes677|ITResList677],
+
+
+ ?line {STRes678,S678} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList679 = [STRes678|STResList678],
+ ?line ITRes678 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S678),
+ ITResList679 = [ITRes678|ITResList678],
+
+
+ ?line {STRes679,S679} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList680 = [STRes679|STResList679],
+ ?line ITRes679 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedShort_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S679),
+ ITResList680 = [ITRes679|ITResList679],
+
+
+ ?line {STRes680,S680} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList681 = [STRes680|STResList680],
+ ?line ITRes680 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S680),
+ ITResList681 = [ITRes680|ITResList680],
+
+
+ ?line {STRes681,S681} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList682 = [STRes681|STResList681],
+ ?line ITRes681 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S681),
+ ITResList682 = [ITRes681|ITResList681],
+
+
+ ?line {STRes682,S682} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList683 = [STRes682|STResList682],
+ ?line ITRes682 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S682),
+ ITResList683 = [ITRes682|ITResList682],
+
+
+ ?line {STRes683,S683} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList684 = [STRes683|STResList683],
+ ?line ITRes683 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S683),
+ ITResList684 = [ITRes683|ITResList683],
+
+
+ ?line {STRes684,S684} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList685 = [STRes684|STResList684],
+ ?line ITRes684 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S684),
+ ITResList685 = [ITRes684|ITResList684],
+
+
+ ?line {STRes685,S685} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList686 = [STRes685|STResList685],
+ ?line ITRes685 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S685),
+ ITResList686 = [ITRes685|ITResList685],
+
+
+ ?line {STRes686,S686} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_base64Binary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList687 = [STRes686|STResList686],
+ ?line ITRes686 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_base64Binary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S686),
+ ITResList687 = [ITRes686|ITResList686],
+
+
+ ?line {STRes687,S687} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_hexBinary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList688 = [STRes687|STResList687],
+ ?line ITRes687 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_hexBinary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S687),
+ ITResList688 = [ITRes687|ITResList687],
+
+
+ ?line {STRes688,S688} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList689 = [STRes688|STResList688],
+ ?line ITRes688 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S688),
+ ITResList689 = [ITRes688|ITResList688],
+
+
+ ?line {STRes689,S689} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList690 = [STRes689|STResList689],
+ ?line ITRes689 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S689),
+ ITResList690 = [ITRes689|ITResList689],
+
+
+ ?line {STRes690,S690} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList691 = [STRes690|STResList690],
+ ?line ITRes690 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S690),
+ ITResList691 = [ITRes690|ITResList690],
+
+
+ ?line {STRes691,S691} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList692 = [STRes691|STResList691],
+ ?line ITRes691 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_long.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S691),
+ ITResList692 = [ITRes691|ITResList691],
+
+
+ ?line {STRes692,S692} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList693 = [STRes692|STResList692],
+ ?line ITRes692 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_int.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S692),
+ ITResList693 = [ITRes692|ITResList692],
+
+
+ ?line {STRes693,S693} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList694 = [STRes693|STResList693],
+ ?line ITRes693 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_short.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S693),
+ ITResList694 = [ITRes693|ITResList693],
+
+
+ ?line {STRes694,S694} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList695 = [STRes694|STResList694],
+ ?line ITRes694 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S694),
+ ITResList695 = [ITRes694|ITResList694],
+
+
+ ?line {STRes695,S695} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_nonNegativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList696 = [STRes695|STResList695],
+ ?line ITRes695 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_nonNegativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S695),
+ ITResList696 = [ITRes695|ITResList695],
+
+
+ ?line {STRes696,S696} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_positiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList697 = [STRes696|STResList696],
+ ?line ITRes696 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_positiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S696),
+ ITResList697 = [ITRes696|ITResList696],
+
+
+ ?line {STRes697,S697} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_unsignedLong.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList698 = [STRes697|STResList697],
+ ?line ITRes697 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_unsignedLong.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S697),
+ ITResList698 = [ITRes697|ITResList697],
+
+
+ ?line {STRes698,S698} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_unsignedInt.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList699 = [STRes698|STResList698],
+ ?line ITRes698 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_unsignedInt.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S698),
+ ITResList699 = [ITRes698|ITResList698],
+
+
+ ?line {STRes699,S699} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_unsignedShort.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList700 = [STRes699|STResList699],
+ ?line ITRes699 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_unsignedShort.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S699),
+ ITResList700 = [ITRes699|ITResList699],
+
+
+ ?line {STRes700,S700} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_unsignedByte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList701 = [STRes700|STResList700],
+ ?line ITRes700 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_unsignedByte.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S700),
+ ITResList701 = [ITRes700|ITResList700],
+
+
+ ?line {STRes701,S701} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList702 = [STRes701|STResList701],
+ ?line ITRes701 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S701),
+ ITResList702 = [ITRes701|ITResList701],
+
+
+ ?line {STRes702,S702} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList703 = [STRes702|STResList702],
+ ?line ITRes702 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_unsignedByte_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S702),
+ ITResList703 = [ITRes702|ITResList702],
+
+
+ ?line {STRes703,S703} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList704 = [STRes703|STResList703],
+ ?line ITRes703 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S703),
+ ITResList704 = [ITRes703|ITResList703],
+
+
+ ?line {STRes704,S704} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList705 = [STRes704|STResList704],
+ ?line ITRes704 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S704),
+ ITResList705 = [ITRes704|ITResList704],
+
+
+ ?line {STRes705,S705} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList706 = [STRes705|STResList705],
+ ?line ITRes705 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S705),
+ ITResList706 = [ITRes705|ITResList705],
+
+
+ ?line {STRes706,S706} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList707 = [STRes706|STResList706],
+ ?line ITRes706 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S706),
+ ITResList707 = [ITRes706|ITResList706],
+
+
+ ?line {STRes707,S707} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList708 = [STRes707|STResList707],
+ ?line ITRes707 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S707),
+ ITResList708 = [ITRes707|ITResList707],
+
+
+ ?line {STRes708,S708} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList709 = [STRes708|STResList708],
+ ?line ITRes708 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S708),
+ ITResList709 = [ITRes708|ITResList708],
+
+
+ ?line {STRes709,S709} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_base64Binary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList710 = [STRes709|STResList709],
+ ?line ITRes709 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_base64Binary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S709),
+ ITResList710 = [ITRes709|ITResList709],
+
+
+ ?line {STRes710,S710} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_hexBinary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList711 = [STRes710|STResList710],
+ ?line ITRes710 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_hexBinary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S710),
+ ITResList711 = [ITRes710|ITResList710],
+
+
+ ?line {STRes711,S711} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList712 = [STRes711|STResList711],
+ ?line ITRes711 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S711),
+ ITResList712 = [ITRes711|ITResList711],
+
+
+ ?line {STRes712,S712} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList713 = [STRes712|STResList712],
+ ?line ITRes712 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S712),
+ ITResList713 = [ITRes712|ITResList712],
+
+
+ ?line {STRes713,S713} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList714 = [STRes713|STResList713],
+ ?line ITRes713 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S713),
+ ITResList714 = [ITRes713|ITResList713],
+
+
+ ?line {STRes714,S714} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_nonPositiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList715 = [STRes714|STResList714],
+ ?line ITRes714 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_nonPositiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S714),
+ ITResList715 = [ITRes714|ITResList714],
+
+
+ ?line {STRes715,S715} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_negativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList716 = [STRes715|STResList715],
+ ?line ITRes715 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_negativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S715),
+ ITResList716 = [ITRes715|ITResList715],
+
+
+ ?line {STRes716,S716} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList717 = [STRes716|STResList716],
+ ?line ITRes716 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_long.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S716),
+ ITResList717 = [ITRes716|ITResList716],
+
+
+ ?line {STRes717,S717} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList718 = [STRes717|STResList717],
+ ?line ITRes717 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_int.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S717),
+ ITResList718 = [ITRes717|ITResList717],
+
+
+ ?line {STRes718,S718} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList719 = [STRes718|STResList718],
+ ?line ITRes718 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_short.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S718),
+ ITResList719 = [ITRes718|ITResList718],
+
+
+ ?line {STRes719,S719} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList720 = [STRes719|STResList719],
+ ?line ITRes719 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S719),
+ ITResList720 = [ITRes719|ITResList719],
+
+
+ ?line {STRes720,S720} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_nonNegativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList721 = [STRes720|STResList720],
+ ?line ITRes720 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_nonNegativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S720),
+ ITResList721 = [ITRes720|ITResList720],
+
+
+ ?line {STRes721,S721} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_positiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList722 = [STRes721|STResList721],
+ ?line ITRes721 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_positiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S721),
+ ITResList722 = [ITRes721|ITResList721],
+
+
+ ?line {STRes722,S722} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_unsignedLong.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList723 = [STRes722|STResList722],
+ ?line ITRes722 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_unsignedLong.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S722),
+ ITResList723 = [ITRes722|ITResList722],
+
+
+ ?line {STRes723,S723} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_unsignedInt.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList724 = [STRes723|STResList723],
+ ?line ITRes723 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_unsignedInt.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S723),
+ ITResList724 = [ITRes723|ITResList723],
+
+
+ ?line {STRes724,S724} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_unsignedShort.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList725 = [STRes724|STResList724],
+ ?line ITRes724 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_unsignedShort.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S724),
+ ITResList725 = [ITRes724|ITResList724],
+
+
+ ?line {STRes725,S725} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_unsignedByte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList726 = [STRes725|STResList725],
+ ?line ITRes725 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_unsignedByte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S725),
+ ITResList726 = [ITRes725|ITResList725],
+
+
+ ?line {STRes726,S726} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList727 = [STRes726|STResList726],
+ ?line ITRes726 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_double.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S726),
+ ITResList727 = [ITRes726|ITResList726],
+
+
+ ?line {STRes727,S727} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList728 = [STRes727|STResList727],
+ ?line ITRes727 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_double_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S727),
+ ITResList728 = [ITRes727|ITResList727],
+
+
+ ?line {STRes728,S728} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList729 = [STRes728|STResList728],
+ ?line ITRes728 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S728),
+ ITResList729 = [ITRes728|ITResList728],
+
+
+ ?line {STRes729,S729} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList730 = [STRes729|STResList729],
+ ?line ITRes729 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S729),
+ ITResList730 = [ITRes729|ITResList729],
+
+
+ ?line {STRes730,S730} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList731 = [STRes730|STResList730],
+ ?line ITRes730 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S730),
+ ITResList731 = [ITRes730|ITResList730],
+
+
+ ?line {STRes731,S731} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_language.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList732 = [STRes731|STResList731],
+ ?line ITRes731 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_language.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S731),
+ ITResList732 = [ITRes731|ITResList731],
+
+
+ ?line {STRes732,S732} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_Name.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList733 = [STRes732|STResList732],
+ ?line ITRes732 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_Name.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S732),
+ ITResList733 = [ITRes732|ITResList732],
+
+
+ ?line {STRes733,S733} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_NCName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList734 = [STRes733|STResList733],
+ ?line ITRes733 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_NCName.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S733),
+ ITResList734 = [ITRes733|ITResList733],
+
+
+ ?line {STRes734,S734} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_ID.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList735 = [STRes734|STResList734],
+ ?line ITRes734 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_ID.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S734),
+ ITResList735 = [ITRes734|ITResList734],
+
+
+ ?line {STRes735,S735} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_IDREF.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList736 = [STRes735|STResList735],
+ ?line ITRes735 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_IDREF.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S735),
+ ITResList736 = [ITRes735|ITResList735],
+
+
+ ?line {STRes736,S736} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_IDREFS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList737 = [STRes736|STResList736],
+ ?line ITRes736 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_IDREFS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S736),
+ ITResList737 = [ITRes736|ITResList736],
+
+
+ ?line {STRes737,S737} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList738 = [STRes737|STResList737],
+ ?line ITRes737 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S737),
+ ITResList738 = [ITRes737|ITResList737],
+
+
+ ?line {STRes738,S738} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList739 = [STRes738|STResList738],
+ ?line ITRes738 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S738),
+ ITResList739 = [ITRes738|ITResList738],
+
+
+ ?line {STRes739,S739} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList740 = [STRes739|STResList739],
+ ?line ITRes739 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S739),
+ ITResList740 = [ITRes739|ITResList739],
+
+
+ ?line {STRes740,S740} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_base64Binary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList741 = [STRes740|STResList740],
+ ?line ITRes740 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_base64Binary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S740),
+ ITResList741 = [ITRes740|ITResList740],
+
+
+ ?line {STRes741,S741} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_hexBinary.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList742 = [STRes741|STResList741],
+ ?line ITRes741 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_hexBinary.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S741),
+ ITResList742 = [ITRes741|ITResList741],
+
+
+ ?line {STRes742,S742} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_float.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList743 = [STRes742|STResList742],
+ ?line ITRes742 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_float.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S742),
+ ITResList743 = [ITRes742|ITResList742],
+
+
+ ?line {STRes743,S743} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_decimal.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList744 = [STRes743|STResList743],
+ ?line ITRes743 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_decimal.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S743),
+ ITResList744 = [ITRes743|ITResList743],
+
+
+ ?line {STRes744,S744} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_integer.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList745 = [STRes744|STResList744],
+ ?line ITRes744 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_integer.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S744),
+ ITResList745 = [ITRes744|ITResList744],
+
+
+ ?line {STRes745,S745} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_nonPositiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList746 = [STRes745|STResList745],
+ ?line ITRes745 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_nonPositiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S745),
+ ITResList746 = [ITRes745|ITResList745],
+
+
+ ?line {STRes746,S746} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_negativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList747 = [STRes746|STResList746],
+ ?line ITRes746 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_negativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S746),
+ ITResList747 = [ITRes746|ITResList746],
+
+
+ ?line {STRes747,S747} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_long.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList748 = [STRes747|STResList747],
+ ?line ITRes747 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_long.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S747),
+ ITResList748 = [ITRes747|ITResList747],
+
+
+ ?line {STRes748,S748} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_int.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList749 = [STRes748|STResList748],
+ ?line ITRes748 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_int.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S748),
+ ITResList749 = [ITRes748|ITResList748],
+
+
+ ?line {STRes749,S749} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_short.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList750 = [STRes749|STResList749],
+ ?line ITRes749 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_short.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S749),
+ ITResList750 = [ITRes749|ITResList749],
+
+
+ ?line {STRes750,S750} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_byte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList751 = [STRes750|STResList750],
+ ?line ITRes750 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_byte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S750),
+ ITResList751 = [ITRes750|ITResList750],
+
+
+ ?line {STRes751,S751} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_nonNegativeInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList752 = [STRes751|STResList751],
+ ?line ITRes751 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_nonNegativeInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S751),
+ ITResList752 = [ITRes751|ITResList751],
+
+
+ ?line {STRes752,S752} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_positiveInteger.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList753 = [STRes752|STResList752],
+ ?line ITRes752 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_positiveInteger.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S752),
+ ITResList753 = [ITRes752|ITResList752],
+
+
+ ?line {STRes753,S753} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_unsignedLong.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList754 = [STRes753|STResList753],
+ ?line ITRes753 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_unsignedLong.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S753),
+ ITResList754 = [ITRes753|ITResList753],
+
+
+ ?line {STRes754,S754} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_unsignedInt.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList755 = [STRes754|STResList754],
+ ?line ITRes754 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_unsignedInt.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S754),
+ ITResList755 = [ITRes754|ITResList754],
+
+
+ ?line {STRes755,S755} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_unsignedShort.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList756 = [STRes755|STResList755],
+ ?line ITRes755 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_unsignedShort.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S755),
+ ITResList756 = [ITRes755|ITResList755],
+
+
+ ?line {STRes756,S756} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_unsignedByte.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList757 = [STRes756|STResList756],
+ ?line ITRes756 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_unsignedByte.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S756),
+ ITResList757 = [ITRes756|ITResList756],
+
+
+ ?line {STRes757,S757} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_double.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList758 = [STRes757|STResList757],
+ ?line ITRes757 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_double.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S757),
+ ITResList758 = [ITRes757|ITResList757],
+
+
+ ?line {STRes758,S758} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList759 = [STRes758|STResList758],
+ ?line ITRes758 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S758),
+ ITResList759 = [ITRes758|ITResList758],
+
+
+ ?line {STRes759,S759} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_QName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList760 = [STRes759|STResList759],
+ ?line ITRes759 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_QName.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S759),
+ ITResList760 = [ITRes759|ITResList759],
+
+
+ ?line {STRes760,S760} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_NOTATION.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList761 = [STRes760|STResList760],
+ ?line ITRes760 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_NOTATION.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S760),
+ ITResList761 = [ITRes760|ITResList760],
+
+
+ ?line {STRes761,S761} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_duration.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList762 = [STRes761|STResList761],
+ ?line ITRes761 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_duration.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S761),
+ ITResList762 = [ITRes761|ITResList761],
+
+
+ ?line {STRes762,S762} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_dateTime.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList763 = [STRes762|STResList762],
+ ?line ITRes762 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_dateTime.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S762),
+ ITResList763 = [ITRes762|ITResList762],
+
+
+ ?line {STRes763,S763} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_time.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList764 = [STRes763|STResList763],
+ ?line ITRes763 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_time.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S763),
+ ITResList764 = [ITRes763|ITResList763],
+
+
+ ?line {STRes764,S764} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_date.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList765 = [STRes764|STResList764],
+ ?line ITRes764 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_date.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S764),
+ ITResList765 = [ITRes764|ITResList764],
+
+
+ ?line {STRes765,S765} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_gYearMonth.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList766 = [STRes765|STResList765],
+ ?line ITRes765 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_gYearMonth.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S765),
+ ITResList766 = [ITRes765|ITResList765],
+
+
+ ?line {STRes766,S766} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_gYear.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList767 = [STRes766|STResList766],
+ ?line ITRes766 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_gYear.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S766),
+ ITResList767 = [ITRes766|ITResList766],
+
+
+ ?line {STRes767,S767} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_gMonthDay.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList768 = [STRes767|STResList767],
+ ?line ITRes767 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_gMonthDay.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S767),
+ ITResList768 = [ITRes767|ITResList767],
+
+
+ ?line {STRes768,S768} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_gDay.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList769 = [STRes768|STResList768],
+ ?line ITRes768 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_gDay.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S768),
+ ITResList769 = [ITRes768|ITResList768],
+
+
+ ?line {STRes769,S769} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_gMonth.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList770 = [STRes769|STResList769],
+ ?line ITRes769 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_anyURI_gMonth.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S769),
+ ITResList770 = [ITRes769|ITResList769],
+
+
+ ?line {STRes770,S770} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList771 = [STRes770|STResList770],
+ ?line ITRes770 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S770),
+ ITResList771 = [ITRes770|ITResList770],
+
+
+ ?line {STRes771,S771} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList772 = [STRes771|STResList771],
+ ?line ITRes771 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S771),
+ ITResList772 = [ITRes771|ITResList771],
+
+
+ ?line {STRes772,S772} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList773 = [STRes772|STResList772],
+ ?line ITRes772 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S772),
+ ITResList773 = [ITRes772|ITResList772],
+
+
+ ?line {STRes773,S773} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_language.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList774 = [STRes773|STResList773],
+ ?line ITRes773 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_language.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S773),
+ ITResList774 = [ITRes773|ITResList773],
+
+
+ ?line {STRes774,S774} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_Name.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList775 = [STRes774|STResList774],
+ ?line ITRes774 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_Name.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S774),
+ ITResList775 = [ITRes774|ITResList774],
+
+
+ ?line {STRes775,S775} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_NCName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList776 = [STRes775|STResList775],
+ ?line ITRes775 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_NCName.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S775),
+ ITResList776 = [ITRes775|ITResList775],
+
+
+ ?line {STRes776,S776} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_ID.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList777 = [STRes776|STResList776],
+ ?line ITRes776 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_ID.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S776),
+ ITResList777 = [ITRes776|ITResList776],
+
+
+ ?line {STRes777,S777} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_IDREF.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList778 = [STRes777|STResList777],
+ ?line ITRes777 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_IDREF.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S777),
+ ITResList778 = [ITRes777|ITResList777],
+
+
+ ?line {STRes778,S778} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_IDREFS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList779 = [STRes778|STResList778],
+ ?line ITRes778 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_IDREFS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S778),
+ ITResList779 = [ITRes778|ITResList778],
+
+
+ ?line {STRes779,S779} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList780 = [STRes779|STResList779],
+ ?line ITRes779 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S779),
+ ITResList780 = [ITRes779|ITResList779],
+
+
+ ?line {STRes780,S780} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList781 = [STRes780|STResList780],
+ ?line ITRes780 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S780),
+ ITResList781 = [ITRes780|ITResList780],
+
+
+ ?line {STRes781,S781} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList782 = [STRes781|STResList781],
+ ?line ITRes781 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S781),
+ ITResList782 = [ITRes781|ITResList781],
+
+
+ ?line {STRes782,S782} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList783 = [STRes782|STResList782],
+ ?line ITRes782 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S782),
+ ITResList783 = [ITRes782|ITResList782],
+
+
+ ?line {STRes783,S783} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_QName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList784 = [STRes783|STResList783],
+ ?line ITRes783 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_QName.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S783),
+ ITResList784 = [ITRes783|ITResList783],
+
+
+ ?line {STRes784,S784} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_duration.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList785 = [STRes784|STResList784],
+ ?line ITRes784 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_QName_duration.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S784),
+ ITResList785 = [ITRes784|ITResList784],
+
+
+ ?line {STRes785,S785} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList786 = [STRes785|STResList785],
+ ?line ITRes785 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S785),
+ ITResList786 = [ITRes785|ITResList785],
+
+
+ ?line {STRes786,S786} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList787 = [STRes786|STResList786],
+ ?line ITRes786 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S786),
+ ITResList787 = [ITRes786|ITResList786],
+
+
+ ?line {STRes787,S787} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList788 = [STRes787|STResList787],
+ ?line ITRes787 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S787),
+ ITResList788 = [ITRes787|ITResList787],
+
+
+ ?line {STRes788,S788} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_language.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList789 = [STRes788|STResList788],
+ ?line ITRes788 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_language.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S788),
+ ITResList789 = [ITRes788|ITResList788],
+
+
+ ?line {STRes789,S789} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_Name.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList790 = [STRes789|STResList789],
+ ?line ITRes789 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_Name.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S789),
+ ITResList790 = [ITRes789|ITResList789],
+
+
+ ?line {STRes790,S790} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_NCName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList791 = [STRes790|STResList790],
+ ?line ITRes790 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_NCName.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S790),
+ ITResList791 = [ITRes790|ITResList790],
+
+
+ ?line {STRes791,S791} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_ID.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList792 = [STRes791|STResList791],
+ ?line ITRes791 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_ID.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S791),
+ ITResList792 = [ITRes791|ITResList791],
+
+
+ ?line {STRes792,S792} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_IDREF.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList793 = [STRes792|STResList792],
+ ?line ITRes792 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_IDREF.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S792),
+ ITResList793 = [ITRes792|ITResList792],
+
+
+ ?line {STRes793,S793} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_IDREFS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList794 = [STRes793|STResList793],
+ ?line ITRes793 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_IDREFS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S793),
+ ITResList794 = [ITRes793|ITResList793],
+
+
+ ?line {STRes794,S794} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList795 = [STRes794|STResList794],
+ ?line ITRes794 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S794),
+ ITResList795 = [ITRes794|ITResList794],
+
+
+ ?line {STRes795,S795} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList796 = [STRes795|STResList795],
+ ?line ITRes795 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S795),
+ ITResList796 = [ITRes795|ITResList795],
+
+
+ ?line {STRes796,S796} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_boolean.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList797 = [STRes796|STResList796],
+ ?line ITRes796 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_boolean.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S796),
+ ITResList797 = [ITRes796|ITResList796],
+
+
+ ?line {STRes797,S797} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList798 = [STRes797|STResList797],
+ ?line ITRes797 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S797),
+ ITResList798 = [ITRes797|ITResList797],
+
+
+ ?line {STRes798,S798} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_NOTATION.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList799 = [STRes798|STResList798],
+ ?line ITRes798 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_NOTATION.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S798),
+ ITResList799 = [ITRes798|ITResList798],
+
+
+ ?line {STRes799,S799} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_duration.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList800 = [STRes799|STResList799],
+ ?line ITRes799 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_NOTATION_duration.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S799),
+ ITResList800 = [ITRes799|ITResList799],
+
+
+ ?line {STRes800,S800} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList801 = [STRes800|STResList800],
+ ?line ITRes800 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S800),
+ ITResList801 = [ITRes800|ITResList800],
+
+
+ ?line {STRes801,S801} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList802 = [STRes801|STResList801],
+ ?line ITRes801 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S801),
+ ITResList802 = [ITRes801|ITResList801],
+
+
+ ?line {STRes802,S802} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList803 = [STRes802|STResList802],
+ ?line ITRes802 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S802),
+ ITResList803 = [ITRes802|ITResList802],
+
+
+ ?line {STRes803,S803} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_Name.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList804 = [STRes803|STResList803],
+ ?line ITRes803 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_Name.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S803),
+ ITResList804 = [ITRes803|ITResList803],
+
+
+ ?line {STRes804,S804} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_NCName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList805 = [STRes804|STResList804],
+ ?line ITRes804 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_NCName.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S804),
+ ITResList805 = [ITRes804|ITResList804],
+
+
+ ?line {STRes805,S805} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_ID.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList806 = [STRes805|STResList805],
+ ?line ITRes805 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_ID.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S805),
+ ITResList806 = [ITRes805|ITResList805],
+
+
+ ?line {STRes806,S806} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_IDREF.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList807 = [STRes806|STResList806],
+ ?line ITRes806 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_IDREF.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S806),
+ ITResList807 = [ITRes806|ITResList806],
+
+
+ ?line {STRes807,S807} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_IDREFS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList808 = [STRes807|STResList807],
+ ?line ITRes807 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_IDREFS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S807),
+ ITResList808 = [ITRes807|ITResList807],
+
+
+ ?line {STRes808,S808} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList809 = [STRes808|STResList808],
+ ?line ITRes808 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S808),
+ ITResList809 = [ITRes808|ITResList808],
+
+
+ ?line {STRes809,S809} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList810 = [STRes809|STResList809],
+ ?line ITRes809 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S809),
+ ITResList810 = [ITRes809|ITResList809],
+
+
+ ?line {STRes810,S810} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList811 = [STRes810|STResList810],
+ ?line ITRes810 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S810),
+ ITResList811 = [ITRes810|ITResList810],
+
+
+ ?line {STRes811,S811} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_QName.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList812 = [STRes811|STResList811],
+ ?line ITRes811 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_QName.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S811),
+ ITResList812 = [ITRes811|ITResList811],
+
+
+ ?line {STRes812,S812} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_NOTATION.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList813 = [STRes812|STResList812],
+ ?line ITRes812 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_NOTATION.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S812),
+ ITResList813 = [ITRes812|ITResList812],
+
+
+ ?line {STRes813,S813} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_duration.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList814 = [STRes813|STResList813],
+ ?line ITRes813 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_duration.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S813),
+ ITResList814 = [ITRes813|ITResList813],
+
+
+ ?line {STRes814,S814} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_dateTime.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList815 = [STRes814|STResList814],
+ ?line ITRes814 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_dateTime.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S814),
+ ITResList815 = [ITRes814|ITResList814],
+
+
+ ?line {STRes815,S815} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_time.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList816 = [STRes815|STResList815],
+ ?line ITRes815 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_time.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S815),
+ ITResList816 = [ITRes815|ITResList815],
+
+
+ ?line {STRes816,S816} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_date.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList817 = [STRes816|STResList816],
+ ?line ITRes816 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_date.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S816),
+ ITResList817 = [ITRes816|ITResList816],
+
+
+ ?line {STRes817,S817} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_gYearMonth.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList818 = [STRes817|STResList817],
+ ?line ITRes817 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_gYearMonth.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S817),
+ ITResList818 = [ITRes817|ITResList817],
+
+
+ ?line {STRes818,S818} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_gYear.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList819 = [STRes818|STResList818],
+ ?line ITRes818 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_gYear.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S818),
+ ITResList819 = [ITRes818|ITResList818],
+
+
+ ?line {STRes819,S819} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_gMonthDay.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList820 = [STRes819|STResList819],
+ ?line ITRes819 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_gMonthDay.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S819),
+ ITResList820 = [ITRes819|ITResList819],
+
+
+ ?line {STRes820,S820} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_gDay.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList821 = [STRes820|STResList820],
+ ?line ITRes820 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_gDay.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S820),
+ ITResList821 = [ITRes820|ITResList820],
+
+
+ ?line {STRes821,S821} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_gMonth.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList822 = [STRes821|STResList821],
+ ?line ITRes821 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_duration_gMonth.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S821),
+ ITResList822 = [ITRes821|ITResList821],
+
+
+ ?line {STRes822,S822} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_dateTime_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList823 = [STRes822|STResList822],
+ ?line ITRes822 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_dateTime_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S822),
+ ITResList823 = [ITRes822|ITResList822],
+
+
+ ?line {STRes823,S823} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_dateTime_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList824 = [STRes823|STResList823],
+ ?line ITRes823 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_dateTime_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S823),
+ ITResList824 = [ITRes823|ITResList823],
+
+
+ ?line {STRes824,S824} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_dateTime_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList825 = [STRes824|STResList824],
+ ?line ITRes824 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_dateTime_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S824),
+ ITResList825 = [ITRes824|ITResList824],
+
+
+ ?line {STRes825,S825} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_dateTime_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList826 = [STRes825|STResList825],
+ ?line ITRes825 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_dateTime_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S825),
+ ITResList826 = [ITRes825|ITResList825],
+
+
+ ?line {STRes826,S826} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_dateTime_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList827 = [STRes826|STResList826],
+ ?line ITRes826 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_dateTime_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S826),
+ ITResList827 = [ITRes826|ITResList826],
+
+
+ ?line {STRes827,S827} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_dateTime_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList828 = [STRes827|STResList827],
+ ?line ITRes827 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_dateTime_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S827),
+ ITResList828 = [ITRes827|ITResList827],
+
+
+ ?line {STRes828,S828} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_dateTime_duration.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList829 = [STRes828|STResList828],
+ ?line ITRes828 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_dateTime_duration.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S828),
+ ITResList829 = [ITRes828|ITResList828],
+
+
+ ?line {STRes829,S829} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_dateTime_dateTime.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList830 = [STRes829|STResList829],
+ ?line ITRes829 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_dateTime_dateTime.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S829),
+ ITResList830 = [ITRes829|ITResList829],
+
+
+ ?line {STRes830,S830} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_dateTime_date.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList831 = [STRes830|STResList830],
+ ?line ITRes830 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_dateTime_date.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S830),
+ ITResList831 = [ITRes830|ITResList830],
+
+
+ ?line {STRes831,S831} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_time_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList832 = [STRes831|STResList831],
+ ?line ITRes831 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_time_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S831),
+ ITResList832 = [ITRes831|ITResList831],
+
+
+ ?line {STRes832,S832} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_time_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList833 = [STRes832|STResList832],
+ ?line ITRes832 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_time_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S832),
+ ITResList833 = [ITRes832|ITResList832],
+
+
+ ?line {STRes833,S833} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_time_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList834 = [STRes833|STResList833],
+ ?line ITRes833 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_time_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S833),
+ ITResList834 = [ITRes833|ITResList833],
+
+
+ ?line {STRes834,S834} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_time_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList835 = [STRes834|STResList834],
+ ?line ITRes834 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_time_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S834),
+ ITResList835 = [ITRes834|ITResList834],
+
+
+ ?line {STRes835,S835} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_time_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList836 = [STRes835|STResList835],
+ ?line ITRes835 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_time_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S835),
+ ITResList836 = [ITRes835|ITResList835],
+
+
+ ?line {STRes836,S836} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_time_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList837 = [STRes836|STResList836],
+ ?line ITRes836 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_time_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S836),
+ ITResList837 = [ITRes836|ITResList836],
+
+
+ ?line {STRes837,S837} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_time_duration.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList838 = [STRes837|STResList837],
+ ?line ITRes837 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_time_duration.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S837),
+ ITResList838 = [ITRes837|ITResList837],
+
+
+ ?line {STRes838,S838} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_time_time.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList839 = [STRes838|STResList838],
+ ?line ITRes838 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_time_time.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S838),
+ ITResList839 = [ITRes838|ITResList838],
+
+
+ ?line {STRes839,S839} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_date_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList840 = [STRes839|STResList839],
+ ?line ITRes839 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_date_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S839),
+ ITResList840 = [ITRes839|ITResList839],
+
+
+ ?line {STRes840,S840} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_date_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList841 = [STRes840|STResList840],
+ ?line ITRes840 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_date_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S840),
+ ITResList841 = [ITRes840|ITResList840],
+
+
+ ?line {STRes841,S841} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_date_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList842 = [STRes841|STResList841],
+ ?line ITRes841 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_date_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S841),
+ ITResList842 = [ITRes841|ITResList841],
+
+
+ ?line {STRes842,S842} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_date_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList843 = [STRes842|STResList842],
+ ?line ITRes842 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_date_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S842),
+ ITResList843 = [ITRes842|ITResList842],
+
+
+ ?line {STRes843,S843} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_date_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList844 = [STRes843|STResList843],
+ ?line ITRes843 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_date_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S843),
+ ITResList844 = [ITRes843|ITResList843],
+
+
+ ?line {STRes844,S844} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_date_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList845 = [STRes844|STResList844],
+ ?line ITRes844 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_date_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S844),
+ ITResList845 = [ITRes844|ITResList844],
+
+
+ ?line {STRes845,S845} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_date_duration.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList846 = [STRes845|STResList845],
+ ?line ITRes845 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_date_duration.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S845),
+ ITResList846 = [ITRes845|ITResList845],
+
+
+ ?line {STRes846,S846} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_date_dateTime.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList847 = [STRes846|STResList846],
+ ?line ITRes846 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_date_dateTime.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S846),
+ ITResList847 = [ITRes846|ITResList846],
+
+
+ ?line {STRes847,S847} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_date_date.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList848 = [STRes847|STResList847],
+ ?line ITRes847 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_date_date.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S847),
+ ITResList848 = [ITRes847|ITResList847],
+
+
+ ?line {STRes848,S848} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYearMonth_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList849 = [STRes848|STResList848],
+ ?line ITRes848 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYearMonth_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S848),
+ ITResList849 = [ITRes848|ITResList848],
+
+
+ ?line {STRes849,S849} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYearMonth_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList850 = [STRes849|STResList849],
+ ?line ITRes849 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYearMonth_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S849),
+ ITResList850 = [ITRes849|ITResList849],
+
+
+ ?line {STRes850,S850} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYearMonth_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList851 = [STRes850|STResList850],
+ ?line ITRes850 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYearMonth_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S850),
+ ITResList851 = [ITRes850|ITResList850],
+
+
+ ?line {STRes851,S851} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYearMonth_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList852 = [STRes851|STResList851],
+ ?line ITRes851 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYearMonth_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S851),
+ ITResList852 = [ITRes851|ITResList851],
+
+
+ ?line {STRes852,S852} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYearMonth_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList853 = [STRes852|STResList852],
+ ?line ITRes852 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYearMonth_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S852),
+ ITResList853 = [ITRes852|ITResList852],
+
+
+ ?line {STRes853,S853} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYearMonth_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList854 = [STRes853|STResList853],
+ ?line ITRes853 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYearMonth_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S853),
+ ITResList854 = [ITRes853|ITResList853],
+
+
+ ?line {STRes854,S854} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYearMonth_duration.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList855 = [STRes854|STResList854],
+ ?line ITRes854 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYearMonth_duration.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S854),
+ ITResList855 = [ITRes854|ITResList854],
+
+
+ ?line {STRes855,S855} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYearMonth_gYearMonth.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList856 = [STRes855|STResList855],
+ ?line ITRes855 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYearMonth_gYearMonth.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S855),
+ ITResList856 = [ITRes855|ITResList855],
+
+
+ ?line {STRes856,S856} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYear_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList857 = [STRes856|STResList856],
+ ?line ITRes856 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYear_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S856),
+ ITResList857 = [ITRes856|ITResList856],
+
+
+ ?line {STRes857,S857} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYear_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList858 = [STRes857|STResList857],
+ ?line ITRes857 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYear_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S857),
+ ITResList858 = [ITRes857|ITResList857],
+
+
+ ?line {STRes858,S858} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYear_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList859 = [STRes858|STResList858],
+ ?line ITRes858 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYear_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S858),
+ ITResList859 = [ITRes858|ITResList858],
+
+
+ ?line {STRes859,S859} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYear_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList860 = [STRes859|STResList859],
+ ?line ITRes859 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYear_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S859),
+ ITResList860 = [ITRes859|ITResList859],
+
+
+ ?line {STRes860,S860} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYear_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList861 = [STRes860|STResList860],
+ ?line ITRes860 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYear_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S860),
+ ITResList861 = [ITRes860|ITResList860],
+
+
+ ?line {STRes861,S861} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYear_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList862 = [STRes861|STResList861],
+ ?line ITRes861 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYear_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S861),
+ ITResList862 = [ITRes861|ITResList861],
+
+
+ ?line {STRes862,S862} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYear_duration.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList863 = [STRes862|STResList862],
+ ?line ITRes862 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYear_duration.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S862),
+ ITResList863 = [ITRes862|ITResList862],
+
+
+ ?line {STRes863,S863} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYear_gYear.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList864 = [STRes863|STResList863],
+ ?line ITRes863 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gYear_gYear.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S863),
+ ITResList864 = [ITRes863|ITResList863],
+
+
+ ?line {STRes864,S864} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonthDay_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList865 = [STRes864|STResList864],
+ ?line ITRes864 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonthDay_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S864),
+ ITResList865 = [ITRes864|ITResList864],
+
+
+ ?line {STRes865,S865} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonthDay_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList866 = [STRes865|STResList865],
+ ?line ITRes865 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonthDay_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S865),
+ ITResList866 = [ITRes865|ITResList865],
+
+
+ ?line {STRes866,S866} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonthDay_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList867 = [STRes866|STResList866],
+ ?line ITRes866 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonthDay_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S866),
+ ITResList867 = [ITRes866|ITResList866],
+
+
+ ?line {STRes867,S867} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonthDay_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList868 = [STRes867|STResList867],
+ ?line ITRes867 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonthDay_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S867),
+ ITResList868 = [ITRes867|ITResList867],
+
+
+ ?line {STRes868,S868} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonthDay_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList869 = [STRes868|STResList868],
+ ?line ITRes868 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonthDay_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S868),
+ ITResList869 = [ITRes868|ITResList868],
+
+
+ ?line {STRes869,S869} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonthDay_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList870 = [STRes869|STResList869],
+ ?line ITRes869 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonthDay_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S869),
+ ITResList870 = [ITRes869|ITResList869],
+
+
+ ?line {STRes870,S870} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonthDay_duration.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList871 = [STRes870|STResList870],
+ ?line ITRes870 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonthDay_duration.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S870),
+ ITResList871 = [ITRes870|ITResList870],
+
+
+ ?line {STRes871,S871} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonthDay_gMonthDay.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList872 = [STRes871|STResList871],
+ ?line ITRes871 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonthDay_gMonthDay.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S871),
+ ITResList872 = [ITRes871|ITResList871],
+
+
+ ?line {STRes872,S872} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gDay_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList873 = [STRes872|STResList872],
+ ?line ITRes872 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gDay_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S872),
+ ITResList873 = [ITRes872|ITResList872],
+
+
+ ?line {STRes873,S873} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gDay_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList874 = [STRes873|STResList873],
+ ?line ITRes873 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gDay_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S873),
+ ITResList874 = [ITRes873|ITResList873],
+
+
+ ?line {STRes874,S874} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gDay_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList875 = [STRes874|STResList874],
+ ?line ITRes874 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gDay_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S874),
+ ITResList875 = [ITRes874|ITResList874],
+
+
+ ?line {STRes875,S875} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gDay_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList876 = [STRes875|STResList875],
+ ?line ITRes875 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gDay_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S875),
+ ITResList876 = [ITRes875|ITResList875],
+
+
+ ?line {STRes876,S876} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gDay_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList877 = [STRes876|STResList876],
+ ?line ITRes876 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gDay_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S876),
+ ITResList877 = [ITRes876|ITResList876],
+
+
+ ?line {STRes877,S877} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gDay_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList878 = [STRes877|STResList877],
+ ?line ITRes877 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gDay_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S877),
+ ITResList878 = [ITRes877|ITResList877],
+
+
+ ?line {STRes878,S878} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gDay_duration.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList879 = [STRes878|STResList878],
+ ?line ITRes878 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gDay_duration.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S878),
+ ITResList879 = [ITRes878|ITResList878],
+
+
+ ?line {STRes879,S879} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gDay_gDay.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList880 = [STRes879|STResList879],
+ ?line ITRes879 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gDay_gDay.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S879),
+ ITResList880 = [ITRes879|ITResList879],
+
+
+ ?line {STRes880,S880} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonth_string.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList881 = [STRes880|STResList880],
+ ?line ITRes880 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonth_string.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S880),
+ ITResList881 = [ITRes880|ITResList880],
+
+
+ ?line {STRes881,S881} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonth_normalizedString.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList882 = [STRes881|STResList881],
+ ?line ITRes881 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonth_normalizedString.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S881),
+ ITResList882 = [ITRes881|ITResList881],
+
+
+ ?line {STRes882,S882} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonth_token.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList883 = [STRes882|STResList882],
+ ?line ITRes882 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonth_token.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S882),
+ ITResList883 = [ITRes882|ITResList882],
+
+
+ ?line {STRes883,S883} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonth_NMTOKEN.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList884 = [STRes883|STResList883],
+ ?line ITRes883 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonth_NMTOKEN.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S883),
+ ITResList884 = [ITRes883|ITResList883],
+
+
+ ?line {STRes884,S884} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonth_NMTOKENS.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList885 = [STRes884|STResList884],
+ ?line ITRes884 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonth_NMTOKENS.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S884),
+ ITResList885 = [ITRes884|ITResList884],
+
+
+ ?line {STRes885,S885} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonth_anyURI.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList886 = [STRes885|STResList885],
+ ?line ITRes885 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonth_anyURI.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S885),
+ ITResList886 = [ITRes885|ITResList885],
+
+
+ ?line {STRes886,S886} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonth_duration.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList887 = [STRes886|STResList886],
+ ?line ITRes886 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonth_duration.xml','./msxsdtest/identityConstraint/idc_datatypes',invalid,S886),
+ ITResList887 = [ITRes886|ITResList886],
+
+
+ ?line {STRes887,S887} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonth_gMonth.xsd','./msxsdtest/identityConstraint/idc_datatypes',valid),
+ STResList888 = [STRes887|STResList887],
+ ?line ITRes887 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idc_datatypes/idc_gMonth_gMonth.xml','./msxsdtest/identityConstraint/idc_datatypes',valid,S887),
+ ITResList888 = [ITRes887|ITResList887],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList888,ITResList888).
+
+%% Identity-constraint Definition Schema Component.
+%% Identity-constraint Validation Rules.
+%% Selector identity-constraint xpath bnf.
+%% Field identity-constraint xpath bnf.
+%% XPath validation.
+%% Bug Regressions
+
+id(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA001.xsd','./msxsdtest/identityConstraint',valid),
+ STResList1 = [STRes0|STResList0],
+
+
+ ?line {STRes1,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA002.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList2 = [STRes1|STResList1],
+
+
+ ?line {STRes2,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA003.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList3 = [STRes2|STResList2],
+
+
+ ?line {STRes3,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA004.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList4 = [STRes3|STResList3],
+
+
+ ?line {STRes4,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA005.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList5 = [STRes4|STResList4],
+
+
+ ?line {STRes5,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA006.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList6 = [STRes5|STResList5],
+
+
+ ?line {STRes6,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA007.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList7 = [STRes6|STResList6],
+
+
+ ?line {STRes7,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA008.xsd','./msxsdtest/identityConstraint',valid),
+ STResList8 = [STRes7|STResList7],
+
+
+ ?line {STRes8,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA009.xsd','./msxsdtest/identityConstraint',valid),
+ STResList9 = [STRes8|STResList8],
+
+
+ ?line {STRes9,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA010.xsd','./msxsdtest/identityConstraint',valid),
+ STResList10 = [STRes9|STResList9],
+
+
+ ?line {STRes10,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA011.xsd','./msxsdtest/identityConstraint',valid),
+ STResList11 = [STRes10|STResList10],
+
+
+ ?line {STRes11,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA012.xsd','./msxsdtest/identityConstraint',valid),
+ STResList12 = [STRes11|STResList11],
+
+
+ ?line {STRes12,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA013.xsd','./msxsdtest/identityConstraint',valid),
+ STResList13 = [STRes12|STResList12],
+
+
+ ?line {STRes13,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA014.xsd','./msxsdtest/identityConstraint',valid),
+ STResList14 = [STRes13|STResList13],
+
+
+ ?line {STRes14,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA015.xsd','./msxsdtest/identityConstraint',valid),
+ STResList15 = [STRes14|STResList14],
+
+
+ ?line {STRes15,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA016.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList16 = [STRes15|STResList15],
+
+
+ ?line {STRes16,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA017.xsd','./msxsdtest/identityConstraint',valid),
+ STResList17 = [STRes16|STResList16],
+
+
+ ?line {STRes17,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA018.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList18 = [STRes17|STResList17],
+
+
+ ?line {STRes18,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA019.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList19 = [STRes18|STResList18],
+
+
+ ?line {STRes19,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA020.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList20 = [STRes19|STResList19],
+
+
+ ?line {STRes20,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA021.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList21 = [STRes20|STResList20],
+
+
+ ?line {STRes21,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA022.xsd','./msxsdtest/identityConstraint',valid),
+ STResList22 = [STRes21|STResList21],
+
+
+ ?line {STRes22,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA023.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList23 = [STRes22|STResList22],
+
+
+ ?line {STRes23,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA024.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList24 = [STRes23|STResList23],
+
+
+ ?line {STRes24,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA025.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList25 = [STRes24|STResList24],
+
+
+ ?line {STRes25,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA026.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList26 = [STRes25|STResList25],
+
+
+ ?line {STRes26,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA027.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList27 = [STRes26|STResList26],
+
+
+ ?line {STRes27,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA028.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList28 = [STRes27|STResList27],
+
+
+ ?line {STRes28,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA029.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList29 = [STRes28|STResList28],
+
+
+ ?line {STRes29,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA030.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList30 = [STRes29|STResList29],
+
+
+ ?line {STRes30,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA031.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList31 = [STRes30|STResList30],
+
+
+ ?line {STRes31,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA032.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList32 = [STRes31|STResList31],
+
+
+ ?line {STRes32,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA033.xsd','./msxsdtest/identityConstraint',valid),
+ STResList33 = [STRes32|STResList32],
+
+
+ ?line {STRes33,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA034.xsd','./msxsdtest/identityConstraint',valid),
+ STResList34 = [STRes33|STResList33],
+
+
+ ?line {STRes34,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA035.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList35 = [STRes34|STResList34],
+
+
+ ?line {STRes35,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA036.xsd','./msxsdtest/identityConstraint',valid),
+ STResList36 = [STRes35|STResList35],
+
+
+ ?line {STRes36,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA037.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList37 = [STRes36|STResList36],
+
+
+ ?line {STRes37,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA038.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList38 = [STRes37|STResList37],
+
+
+ ?line {STRes38,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA039.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList39 = [STRes38|STResList38],
+
+
+ ?line {STRes39,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA040.xsd','./msxsdtest/identityConstraint',valid),
+ STResList40 = [STRes39|STResList39],
+
+
+ ?line {STRes40,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA041.xsd','./msxsdtest/identityConstraint',valid),
+ STResList41 = [STRes40|STResList40],
+
+
+ ?line {STRes41,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA042.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList42 = [STRes41|STResList41],
+
+
+ ?line {STRes42,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA043.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList43 = [STRes42|STResList42],
+
+
+ ?line {STRes43,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA044.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList44 = [STRes43|STResList43],
+
+
+ ?line {STRes44,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA045.xsd','./msxsdtest/identityConstraint',valid),
+ STResList45 = [STRes44|STResList44],
+
+
+ ?line {STRes45,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA046.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList46 = [STRes45|STResList45],
+
+
+ ?line {STRes46,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA047.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList47 = [STRes46|STResList46],
+
+
+ ?line {STRes47,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA048.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList48 = [STRes47|STResList47],
+
+
+ ?line {STRes48,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA049.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList49 = [STRes48|STResList48],
+
+
+ ?line {STRes49,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA050.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList50 = [STRes49|STResList49],
+
+
+ ?line {STRes50,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA051.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList51 = [STRes50|STResList50],
+
+
+ ?line {STRes51,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA052.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList52 = [STRes51|STResList51],
+
+
+ ?line {STRes52,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA053.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList53 = [STRes52|STResList52],
+
+
+ ?line {STRes53,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA054.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList54 = [STRes53|STResList53],
+
+
+ ?line {STRes54,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA055.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList55 = [STRes54|STResList54],
+
+
+ ?line {STRes55,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA056.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList56 = [STRes55|STResList55],
+
+
+ ?line {STRes56,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA057.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList57 = [STRes56|STResList56],
+
+
+ ?line {STRes57,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA058.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList58 = [STRes57|STResList57],
+
+
+ ?line {STRes58,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA059.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList59 = [STRes58|STResList58],
+
+
+ ?line {STRes59,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idA060.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList60 = [STRes59|STResList59],
+
+
+ ?line {STRes60,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB001.xsd','./msxsdtest/identityConstraint',valid),
+ STResList61 = [STRes60|STResList60],
+
+
+ ?line {STRes61,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB002.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList62 = [STRes61|STResList61],
+
+
+ ?line {STRes62,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB003.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList63 = [STRes62|STResList62],
+
+
+ ?line {STRes63,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB004.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList64 = [STRes63|STResList63],
+
+
+ ?line {STRes64,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB005.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList65 = [STRes64|STResList64],
+
+
+ ?line {STRes65,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB006.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList66 = [STRes65|STResList65],
+
+
+ ?line {STRes66,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB007.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList67 = [STRes66|STResList66],
+
+
+ ?line {STRes67,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB008.xsd','./msxsdtest/identityConstraint',valid),
+ STResList68 = [STRes67|STResList67],
+
+
+ ?line {STRes68,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB009.xsd','./msxsdtest/identityConstraint',valid),
+ STResList69 = [STRes68|STResList68],
+
+
+ ?line {STRes69,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB010.xsd','./msxsdtest/identityConstraint',valid),
+ STResList70 = [STRes69|STResList69],
+
+
+ ?line {STRes70,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB011.xsd','./msxsdtest/identityConstraint',valid),
+ STResList71 = [STRes70|STResList70],
+
+
+ ?line {STRes71,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB012.xsd','./msxsdtest/identityConstraint',valid),
+ STResList72 = [STRes71|STResList71],
+
+
+ ?line {STRes72,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB013.xsd','./msxsdtest/identityConstraint',valid),
+ STResList73 = [STRes72|STResList72],
+
+
+ ?line {STRes73,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB014.xsd','./msxsdtest/identityConstraint',valid),
+ STResList74 = [STRes73|STResList73],
+
+
+ ?line {STRes74,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB015.xsd','./msxsdtest/identityConstraint',valid),
+ STResList75 = [STRes74|STResList74],
+
+
+ ?line {STRes75,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB016.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList76 = [STRes75|STResList75],
+
+
+ ?line {STRes76,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB017.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList77 = [STRes76|STResList76],
+
+
+ ?line {STRes77,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB018.xsd','./msxsdtest/identityConstraint',valid),
+ STResList78 = [STRes77|STResList77],
+
+
+ ?line {STRes78,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB019.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList79 = [STRes78|STResList78],
+
+
+ ?line {STRes79,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB020.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList80 = [STRes79|STResList79],
+
+
+ ?line {STRes80,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB021.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList81 = [STRes80|STResList80],
+
+
+ ?line {STRes81,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB022.xsd','./msxsdtest/identityConstraint',valid),
+ STResList82 = [STRes81|STResList81],
+
+
+ ?line {STRes82,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB023.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList83 = [STRes82|STResList82],
+
+
+ ?line {STRes83,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB024.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList84 = [STRes83|STResList83],
+
+
+ ?line {STRes84,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB025.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList85 = [STRes84|STResList84],
+
+
+ ?line {STRes85,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB026.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList86 = [STRes85|STResList85],
+
+
+ ?line {STRes86,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB027.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList87 = [STRes86|STResList86],
+
+
+ ?line {STRes87,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB028.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList88 = [STRes87|STResList87],
+
+
+ ?line {STRes88,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB029.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList89 = [STRes88|STResList88],
+
+
+ ?line {STRes89,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB030.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList90 = [STRes89|STResList89],
+
+
+ ?line {STRes90,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB031.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList91 = [STRes90|STResList90],
+
+
+ ?line {STRes91,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB032.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList92 = [STRes91|STResList91],
+
+
+ ?line {STRes92,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB033.xsd','./msxsdtest/identityConstraint',valid),
+ STResList93 = [STRes92|STResList92],
+
+
+ ?line {STRes93,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB034.xsd','./msxsdtest/identityConstraint',valid),
+ STResList94 = [STRes93|STResList93],
+
+
+ ?line {STRes94,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB035.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList95 = [STRes94|STResList94],
+
+
+ ?line {STRes95,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB036.xsd','./msxsdtest/identityConstraint',valid),
+ STResList96 = [STRes95|STResList95],
+
+
+ ?line {STRes96,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB037.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList97 = [STRes96|STResList96],
+
+
+ ?line {STRes97,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB038.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList98 = [STRes97|STResList97],
+
+
+ ?line {STRes98,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB039.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList99 = [STRes98|STResList98],
+
+
+ ?line {STRes99,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB040.xsd','./msxsdtest/identityConstraint',valid),
+ STResList100 = [STRes99|STResList99],
+
+
+ ?line {STRes100,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB041.xsd','./msxsdtest/identityConstraint',valid),
+ STResList101 = [STRes100|STResList100],
+
+
+ ?line {STRes101,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB042.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList102 = [STRes101|STResList101],
+
+
+ ?line {STRes102,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB043.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList103 = [STRes102|STResList102],
+
+
+ ?line {STRes103,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB044.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList104 = [STRes103|STResList103],
+
+
+ ?line {STRes104,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB045.xsd','./msxsdtest/identityConstraint',valid),
+ STResList105 = [STRes104|STResList104],
+
+
+ ?line {STRes105,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB046.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList106 = [STRes105|STResList105],
+
+
+ ?line {STRes106,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB047.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList107 = [STRes106|STResList106],
+
+
+ ?line {STRes107,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB048.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList108 = [STRes107|STResList107],
+
+
+ ?line {STRes108,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB049.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList109 = [STRes108|STResList108],
+
+
+ ?line {STRes109,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB050.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList110 = [STRes109|STResList109],
+
+
+ ?line {STRes110,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB051.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList111 = [STRes110|STResList110],
+
+
+ ?line {STRes111,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB052.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList112 = [STRes111|STResList111],
+
+
+ ?line {STRes112,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB053.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList113 = [STRes112|STResList112],
+
+
+ ?line {STRes113,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB054.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList114 = [STRes113|STResList113],
+
+
+ ?line {STRes114,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB055.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList115 = [STRes114|STResList114],
+
+
+ ?line {STRes115,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB056.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList116 = [STRes115|STResList115],
+
+
+ ?line {STRes116,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB057.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList117 = [STRes116|STResList116],
+
+
+ ?line {STRes117,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB058.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList118 = [STRes117|STResList117],
+
+
+ ?line {STRes118,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB059.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList119 = [STRes118|STResList118],
+
+
+ ?line {STRes119,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idB060.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList120 = [STRes119|STResList119],
+
+
+ ?line {STRes120,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC001.xsd','./msxsdtest/identityConstraint',valid),
+ STResList121 = [STRes120|STResList120],
+
+
+ ?line {STRes121,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC002.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList122 = [STRes121|STResList121],
+
+
+ ?line {STRes122,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC003.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList123 = [STRes122|STResList122],
+
+
+ ?line {STRes123,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC004.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList124 = [STRes123|STResList123],
+
+
+ ?line {STRes124,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC005.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList125 = [STRes124|STResList124],
+
+
+ ?line {STRes125,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC006.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList126 = [STRes125|STResList125],
+
+
+ ?line {STRes126,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC007.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList127 = [STRes126|STResList126],
+
+
+ ?line {STRes127,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC008.xsd','./msxsdtest/identityConstraint',valid),
+ STResList128 = [STRes127|STResList127],
+
+
+ ?line {STRes128,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC009.xsd','./msxsdtest/identityConstraint',valid),
+ STResList129 = [STRes128|STResList128],
+
+
+ ?line {STRes129,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC010.xsd','./msxsdtest/identityConstraint',valid),
+ STResList130 = [STRes129|STResList129],
+
+
+ ?line {STRes130,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC011.xsd','./msxsdtest/identityConstraint',valid),
+ STResList131 = [STRes130|STResList130],
+
+
+ ?line {STRes131,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC012.xsd','./msxsdtest/identityConstraint',valid),
+ STResList132 = [STRes131|STResList131],
+
+
+ ?line {STRes132,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC013.xsd','./msxsdtest/identityConstraint',valid),
+ STResList133 = [STRes132|STResList132],
+
+
+ ?line {STRes133,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC014.xsd','./msxsdtest/identityConstraint',valid),
+ STResList134 = [STRes133|STResList133],
+
+
+ ?line {STRes134,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC015.xsd','./msxsdtest/identityConstraint',valid),
+ STResList135 = [STRes134|STResList134],
+
+
+ ?line {STRes135,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC016.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList136 = [STRes135|STResList135],
+
+
+ ?line {STRes136,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC017.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList137 = [STRes136|STResList136],
+
+
+ ?line {STRes137,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC018.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList138 = [STRes137|STResList137],
+
+
+ ?line {STRes138,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC019.xsd','./msxsdtest/identityConstraint',valid),
+ STResList139 = [STRes138|STResList138],
+
+
+ ?line {STRes139,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC020.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList140 = [STRes139|STResList139],
+
+
+ ?line {STRes140,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC021.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList141 = [STRes140|STResList140],
+
+
+ ?line {STRes141,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC022.xsd','./msxsdtest/identityConstraint',valid),
+ STResList142 = [STRes141|STResList141],
+
+
+ ?line {STRes142,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC023.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList143 = [STRes142|STResList142],
+
+
+ ?line {STRes143,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC024.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList144 = [STRes143|STResList143],
+
+
+ ?line {STRes144,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC025.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList145 = [STRes144|STResList144],
+
+
+ ?line {STRes145,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC026.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList146 = [STRes145|STResList145],
+
+
+ ?line {STRes146,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC027.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList147 = [STRes146|STResList146],
+
+
+ ?line {STRes147,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC028.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList148 = [STRes147|STResList147],
+
+
+ ?line {STRes148,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC029.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList149 = [STRes148|STResList148],
+
+
+ ?line {STRes149,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC030.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList150 = [STRes149|STResList149],
+
+
+ ?line {STRes150,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC031.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList151 = [STRes150|STResList150],
+
+
+ ?line {STRes151,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC032.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList152 = [STRes151|STResList151],
+
+
+ ?line {STRes152,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC033.xsd','./msxsdtest/identityConstraint',valid),
+ STResList153 = [STRes152|STResList152],
+
+
+ ?line {STRes153,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC034.xsd','./msxsdtest/identityConstraint',valid),
+ STResList154 = [STRes153|STResList153],
+
+
+ ?line {STRes154,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC035.xsd','./msxsdtest/identityConstraint',valid),
+ STResList155 = [STRes154|STResList154],
+
+
+ ?line {STRes155,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC036.xsd','./msxsdtest/identityConstraint',valid),
+ STResList156 = [STRes155|STResList155],
+
+
+ ?line {STRes156,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC038.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList157 = [STRes156|STResList156],
+
+
+ ?line {STRes157,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC039.xsd','./msxsdtest/identityConstraint',valid),
+ STResList158 = [STRes157|STResList157],
+
+
+ ?line {STRes158,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC040.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList159 = [STRes158|STResList158],
+
+
+ ?line {STRes159,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC041.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList160 = [STRes159|STResList159],
+
+
+ ?line {STRes160,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC042.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList161 = [STRes160|STResList160],
+
+
+ ?line {STRes161,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC043.xsd','./msxsdtest/identityConstraint',valid),
+ STResList162 = [STRes161|STResList161],
+
+
+ ?line {STRes162,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC044.xsd','./msxsdtest/identityConstraint',valid),
+ STResList163 = [STRes162|STResList162],
+
+
+ ?line {STRes163,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC045.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList164 = [STRes163|STResList163],
+
+
+ ?line {STRes164,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC046.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList165 = [STRes164|STResList164],
+
+
+ ?line {STRes165,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC047.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList166 = [STRes165|STResList165],
+
+
+ ?line {STRes166,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC048.xsd','./msxsdtest/identityConstraint',valid),
+ STResList167 = [STRes166|STResList166],
+
+
+ ?line {STRes167,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC049.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList168 = [STRes167|STResList167],
+
+
+ ?line {STRes168,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC050.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList169 = [STRes168|STResList168],
+
+
+ ?line {STRes169,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC051.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList170 = [STRes169|STResList169],
+
+
+ ?line {STRes170,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC052.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList171 = [STRes170|STResList170],
+
+
+ ?line {STRes171,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC053.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList172 = [STRes171|STResList171],
+
+
+ ?line {STRes172,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC054.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList173 = [STRes172|STResList172],
+
+
+ ?line {STRes173,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC055.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList174 = [STRes173|STResList173],
+
+
+ ?line {STRes174,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC056.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList175 = [STRes174|STResList174],
+
+
+ ?line {STRes175,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC057.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList176 = [STRes175|STResList175],
+
+
+ ?line {STRes176,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC058.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList177 = [STRes176|STResList176],
+
+
+ ?line {STRes177,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC059.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList178 = [STRes177|STResList177],
+
+
+ ?line {STRes178,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC060.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList179 = [STRes178|STResList178],
+
+
+ ?line {STRes179,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC061.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList180 = [STRes179|STResList179],
+
+
+ ?line {STRes180,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC062.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList181 = [STRes180|STResList180],
+
+
+ ?line {STRes181,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idC063.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList182 = [STRes181|STResList181],
+
+
+ ?line {STRes182,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD001.xsd','./msxsdtest/identityConstraint',valid),
+ STResList183 = [STRes182|STResList182],
+
+
+ ?line {STRes183,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD002.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList184 = [STRes183|STResList183],
+
+
+ ?line {STRes184,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD003.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList185 = [STRes184|STResList184],
+
+
+ ?line {STRes185,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD004.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList186 = [STRes185|STResList185],
+
+
+ ?line {STRes186,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD005.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList187 = [STRes186|STResList186],
+
+
+ ?line {STRes187,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD006.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList188 = [STRes187|STResList187],
+
+
+ ?line {STRes188,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD007.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList189 = [STRes188|STResList188],
+
+
+ ?line {STRes189,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD008.xsd','./msxsdtest/identityConstraint',valid),
+ STResList190 = [STRes189|STResList189],
+
+
+ ?line {STRes190,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD009.xsd','./msxsdtest/identityConstraint',valid),
+ STResList191 = [STRes190|STResList190],
+
+
+ ?line {STRes191,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD010.xsd','./msxsdtest/identityConstraint',valid),
+ STResList192 = [STRes191|STResList191],
+
+
+ ?line {STRes192,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD011.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList193 = [STRes192|STResList192],
+
+
+ ?line {STRes193,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD012.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList194 = [STRes193|STResList193],
+
+
+ ?line {STRes194,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD013.xsd','./msxsdtest/identityConstraint',valid),
+ STResList195 = [STRes194|STResList194],
+
+
+ ?line {STRes195,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD014.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList196 = [STRes195|STResList195],
+
+
+ ?line {STRes196,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD015.xsd','./msxsdtest/identityConstraint',valid),
+ STResList197 = [STRes196|STResList196],
+
+
+ ?line {STRes197,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD016.xsd','./msxsdtest/identityConstraint',valid),
+ STResList198 = [STRes197|STResList197],
+
+
+ ?line {STRes198,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD017.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList199 = [STRes198|STResList198],
+
+
+ ?line {STRes199,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD018.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList200 = [STRes199|STResList199],
+
+
+ ?line {STRes200,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD019.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList201 = [STRes200|STResList200],
+
+
+ ?line {STRes201,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD020.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList202 = [STRes201|STResList201],
+
+
+ ?line {STRes202,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD021.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList203 = [STRes202|STResList202],
+
+
+ ?line {STRes203,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD022.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList204 = [STRes203|STResList203],
+
+
+ ?line {STRes204,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD023.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList205 = [STRes204|STResList204],
+
+
+ ?line {STRes205,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD024.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList206 = [STRes205|STResList205],
+
+
+ ?line {STRes206,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD025.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList207 = [STRes206|STResList206],
+
+
+ ?line {STRes207,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD026.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList208 = [STRes207|STResList207],
+
+
+ ?line {STRes208,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD027.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList209 = [STRes208|STResList208],
+
+
+ ?line {STRes209,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD028.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList210 = [STRes209|STResList209],
+
+
+ ?line {STRes210,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD029.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList211 = [STRes210|STResList210],
+
+
+ ?line {STRes211,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD030.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList212 = [STRes211|STResList211],
+
+
+ ?line {STRes212,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD031.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList213 = [STRes212|STResList212],
+
+
+ ?line {STRes213,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD032.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList214 = [STRes213|STResList213],
+
+
+ ?line {STRes214,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idD033.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList215 = [STRes214|STResList214],
+
+
+ ?line {STRes215,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE001.xsd','./msxsdtest/identityConstraint',valid),
+ STResList216 = [STRes215|STResList215],
+
+
+ ?line {STRes216,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE002.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList217 = [STRes216|STResList216],
+
+
+ ?line {STRes217,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE003.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList218 = [STRes217|STResList217],
+
+
+ ?line {STRes218,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE004.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList219 = [STRes218|STResList218],
+
+
+ ?line {STRes219,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE005.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList220 = [STRes219|STResList219],
+
+
+ ?line {STRes220,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE006.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList221 = [STRes220|STResList220],
+
+
+ ?line {STRes221,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE007.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList222 = [STRes221|STResList221],
+
+
+ ?line {STRes222,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE008.xsd','./msxsdtest/identityConstraint',valid),
+ STResList223 = [STRes222|STResList222],
+
+
+ ?line {STRes223,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE009.xsd','./msxsdtest/identityConstraint',valid),
+ STResList224 = [STRes223|STResList223],
+
+
+ ?line {STRes224,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE010.xsd','./msxsdtest/identityConstraint',valid),
+ STResList225 = [STRes224|STResList224],
+
+
+ ?line {STRes225,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE011.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList226 = [STRes225|STResList225],
+
+
+ ?line {STRes226,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE012.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList227 = [STRes226|STResList226],
+
+
+ ?line {STRes227,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE013.xsd','./msxsdtest/identityConstraint',valid),
+ STResList228 = [STRes227|STResList227],
+
+
+ ?line {STRes228,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE014.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList229 = [STRes228|STResList228],
+
+
+ ?line {STRes229,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE015.xsd','./msxsdtest/identityConstraint',valid),
+ STResList230 = [STRes229|STResList229],
+
+
+ ?line {STRes230,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE016.xsd','./msxsdtest/identityConstraint',valid),
+ STResList231 = [STRes230|STResList230],
+
+
+ ?line {STRes231,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE017.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList232 = [STRes231|STResList231],
+
+
+ ?line {STRes232,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE018.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList233 = [STRes232|STResList232],
+
+
+ ?line {STRes233,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE019.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList234 = [STRes233|STResList233],
+
+
+ ?line {STRes234,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE020.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList235 = [STRes234|STResList234],
+
+
+ ?line {STRes235,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE021.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList236 = [STRes235|STResList235],
+
+
+ ?line {STRes236,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE022.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList237 = [STRes236|STResList236],
+
+
+ ?line {STRes237,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE023.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList238 = [STRes237|STResList237],
+
+
+ ?line {STRes238,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE024.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList239 = [STRes238|STResList238],
+
+
+ ?line {STRes239,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE025.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList240 = [STRes239|STResList239],
+
+
+ ?line {STRes240,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE026.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList241 = [STRes240|STResList240],
+
+
+ ?line {STRes241,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE027.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList242 = [STRes241|STResList241],
+
+
+ ?line {STRes242,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE028.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList243 = [STRes242|STResList242],
+
+
+ ?line {STRes243,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE029.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList244 = [STRes243|STResList243],
+
+
+ ?line {STRes244,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE030.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList245 = [STRes244|STResList244],
+
+
+ ?line {STRes245,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE031.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList246 = [STRes245|STResList245],
+
+
+ ?line {STRes246,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE032.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList247 = [STRes246|STResList246],
+
+
+ ?line {STRes247,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idE033.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList248 = [STRes247|STResList247],
+
+
+ ?line {STRes248,S248} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF001.xsd','./msxsdtest/identityConstraint',valid),
+ STResList249 = [STRes248|STResList248],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF001.xml','./msxsdtest/identityConstraint',valid,S248),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes249,S249} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF003.xsd','./msxsdtest/identityConstraint',valid),
+ STResList250 = [STRes249|STResList249],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF003.xml','./msxsdtest/identityConstraint',valid,S249),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ ?line {STRes250,S250} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF004.xsd','./msxsdtest/identityConstraint',valid),
+ STResList251 = [STRes250|STResList250],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF004.xml','./msxsdtest/identityConstraint',valid,S250),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ ?line {STRes251,S251} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF005.xsd','./msxsdtest/identityConstraint',valid),
+ STResList252 = [STRes251|STResList251],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF005.xml','./msxsdtest/identityConstraint',invalid,S251),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ ?line {STRes252,S252} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF006.xsd','./msxsdtest/identityConstraint',valid),
+ STResList253 = [STRes252|STResList252],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF006.xml','./msxsdtest/identityConstraint',invalid,S252),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes253,S253} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF007.xsd','./msxsdtest/identityConstraint',valid),
+ STResList254 = [STRes253|STResList253],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF007.xml','./msxsdtest/identityConstraint',valid,S253),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes254,S254} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF008.xsd','./msxsdtest/identityConstraint',valid),
+ STResList255 = [STRes254|STResList254],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF008.xml','./msxsdtest/identityConstraint',invalid,S254),
+ ITResList7 = [ITRes6|ITResList6],
+
+
+ ?line {STRes255,S255} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF009.xsd','./msxsdtest/identityConstraint',valid),
+ STResList256 = [STRes255|STResList255],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF009.xml','./msxsdtest/identityConstraint',valid,S255),
+ ITResList8 = [ITRes7|ITResList7],
+
+
+ ?line {STRes256,S256} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF010.xsd','./msxsdtest/identityConstraint',valid),
+ STResList257 = [STRes256|STResList256],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF010.xml','./msxsdtest/identityConstraint',invalid,S256),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ ?line {STRes257,S257} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF011.xsd','./msxsdtest/identityConstraint',valid),
+ STResList258 = [STRes257|STResList257],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF011.xml','./msxsdtest/identityConstraint',valid,S257),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes258,S258} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF012.xsd','./msxsdtest/identityConstraint',valid),
+ STResList259 = [STRes258|STResList258],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF012.xml','./msxsdtest/identityConstraint',valid,S258),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes259,S259} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF013.xsd','./msxsdtest/identityConstraint',valid),
+ STResList260 = [STRes259|STResList259],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF013.xml','./msxsdtest/identityConstraint',valid,S259),
+ ITResList12 = [ITRes11|ITResList11],
+
+
+ ?line {STRes260,S260} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF014.xsd','./msxsdtest/identityConstraint',valid),
+ STResList261 = [STRes260|STResList260],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF014.xml','./msxsdtest/identityConstraint',valid,S260),
+ ITResList13 = [ITRes12|ITResList12],
+
+
+ ?line {STRes261,S261} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF015.xsd','./msxsdtest/identityConstraint',valid),
+ STResList262 = [STRes261|STResList261],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF015.xml','./msxsdtest/identityConstraint',invalid,S261),
+ ITResList14 = [ITRes13|ITResList13],
+
+
+ ?line {STRes262,S262} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF016.xsd','./msxsdtest/identityConstraint',valid),
+ STResList263 = [STRes262|STResList262],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF016.xml','./msxsdtest/identityConstraint',invalid,S262),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes263,S263} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF017.xsd','./msxsdtest/identityConstraint',valid),
+ STResList264 = [STRes263|STResList263],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF017.xml','./msxsdtest/identityConstraint',invalid,S263),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ ?line {STRes264,S264} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF018.xsd','./msxsdtest/identityConstraint',valid),
+ STResList265 = [STRes264|STResList264],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF018.xml','./msxsdtest/identityConstraint',invalid,S264),
+ ITResList17 = [ITRes16|ITResList16],
+
+
+ ?line {STRes265,S265} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF019.xsd','./msxsdtest/identityConstraint',valid),
+ STResList266 = [STRes265|STResList265],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF019.xml','./msxsdtest/identityConstraint',valid,S265),
+ ITResList18 = [ITRes17|ITResList17],
+
+
+ ?line {STRes266,S266} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF020.xsd','./msxsdtest/identityConstraint',valid),
+ STResList267 = [STRes266|STResList266],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF020.xml','./msxsdtest/identityConstraint',valid,S266),
+ ITResList19 = [ITRes18|ITResList18],
+
+
+ ?line {STRes267,S267} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF021.xsd','./msxsdtest/identityConstraint',valid),
+ STResList268 = [STRes267|STResList267],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF021.xml','./msxsdtest/identityConstraint',valid,S267),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes268,S268} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF022.xsd','./msxsdtest/identityConstraint',valid),
+ STResList269 = [STRes268|STResList268],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF022.xml','./msxsdtest/identityConstraint',valid,S268),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes269,S269} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF023.xsd','./msxsdtest/identityConstraint',valid),
+ STResList270 = [STRes269|STResList269],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF023.xml','./msxsdtest/identityConstraint',valid,S269),
+ ITResList22 = [ITRes21|ITResList21],
+
+
+ ?line {STRes270,S270} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF024.xsd','./msxsdtest/identityConstraint',valid),
+ STResList271 = [STRes270|STResList270],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF024.xml','./msxsdtest/identityConstraint',valid,S270),
+ ITResList23 = [ITRes22|ITResList22],
+
+
+ ?line {STRes271,S271} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF025.xsd','./msxsdtest/identityConstraint',valid),
+ STResList272 = [STRes271|STResList271],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF025.xml','./msxsdtest/identityConstraint',valid,S271),
+ ITResList24 = [ITRes23|ITResList23],
+
+
+ ?line {STRes272,S272} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF026.xsd','./msxsdtest/identityConstraint',valid),
+ STResList273 = [STRes272|STResList272],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF026.xml','./msxsdtest/identityConstraint',valid,S272),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ ?line {STRes273,S273} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF027.xsd','./msxsdtest/identityConstraint',valid),
+ STResList274 = [STRes273|STResList273],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF027.xml','./msxsdtest/identityConstraint',valid,S273),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes274,S274} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF028.xsd','./msxsdtest/identityConstraint',valid),
+ STResList275 = [STRes274|STResList274],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF028.xml','./msxsdtest/identityConstraint',valid,S274),
+ ITResList27 = [ITRes26|ITResList26],
+
+
+ ?line {STRes275,S275} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF029.xsd','./msxsdtest/identityConstraint',valid),
+ STResList276 = [STRes275|STResList275],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF029.xml','./msxsdtest/identityConstraint',valid,S275),
+ ITResList28 = [ITRes27|ITResList27],
+
+
+ ?line {STRes276,S276} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF030.xsd','./msxsdtest/identityConstraint',valid),
+ STResList277 = [STRes276|STResList276],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF030.xml','./msxsdtest/identityConstraint',valid,S276),
+ ITResList29 = [ITRes28|ITResList28],
+
+
+ ?line {STRes277,S277} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF031.xsd','./msxsdtest/identityConstraint',valid),
+ STResList278 = [STRes277|STResList277],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF031.xml','./msxsdtest/identityConstraint',valid,S277),
+ ITResList30 = [ITRes29|ITResList29],
+
+
+ ?line {STRes278,S278} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF032.xsd','./msxsdtest/identityConstraint',valid),
+ STResList279 = [STRes278|STResList278],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF032.xml','./msxsdtest/identityConstraint',valid,S278),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes279,S279} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF033.xsd','./msxsdtest/identityConstraint',valid),
+ STResList280 = [STRes279|STResList279],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF033.xml','./msxsdtest/identityConstraint',valid,S279),
+ ITResList32 = [ITRes31|ITResList31],
+
+
+ ?line {STRes280,S280} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF034.xsd','./msxsdtest/identityConstraint',valid),
+ STResList281 = [STRes280|STResList280],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF034.xml','./msxsdtest/identityConstraint',valid,S280),
+ ITResList33 = [ITRes32|ITResList32],
+
+
+ ?line {STRes281,S281} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF035.xsd','./msxsdtest/identityConstraint',valid),
+ STResList282 = [STRes281|STResList281],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF035.xml','./msxsdtest/identityConstraint',valid,S281),
+ ITResList34 = [ITRes33|ITResList33],
+
+
+ ?line {STRes282,S282} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idF036.xsd','./msxsdtest/identityConstraint',valid),
+ STResList283 = [STRes282|STResList282],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idF036.xml','./msxsdtest/identityConstraint',valid,S282),
+ ITResList35 = [ITRes34|ITResList34],
+
+
+ ?line {STRes283,S283} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG001.xsd','./msxsdtest/identityConstraint',valid),
+ STResList284 = [STRes283|STResList283],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG001.xml','./msxsdtest/identityConstraint',valid,S283),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes284,S284} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG003.xsd','./msxsdtest/identityConstraint',valid),
+ STResList285 = [STRes284|STResList284],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG003.xml','./msxsdtest/identityConstraint',invalid,S284),
+ ITResList37 = [ITRes36|ITResList36],
+
+
+ ?line {STRes285,S285} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG004.xsd','./msxsdtest/identityConstraint',valid),
+ STResList286 = [STRes285|STResList285],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG004.xml','./msxsdtest/identityConstraint',valid,S285),
+ ITResList38 = [ITRes37|ITResList37],
+
+
+ ?line {STRes286,S286} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG005.xsd','./msxsdtest/identityConstraint',valid),
+ STResList287 = [STRes286|STResList286],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG005.xml','./msxsdtest/identityConstraint',invalid,S286),
+ ITResList39 = [ITRes38|ITResList38],
+
+
+ ?line {STRes287,S287} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG006.xsd','./msxsdtest/identityConstraint',valid),
+ STResList288 = [STRes287|STResList287],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG006.xml','./msxsdtest/identityConstraint',invalid,S287),
+ ITResList40 = [ITRes39|ITResList39],
+
+
+ ?line {STRes288,S288} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG007.xsd','./msxsdtest/identityConstraint',valid),
+ STResList289 = [STRes288|STResList288],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG007.xml','./msxsdtest/identityConstraint',valid,S288),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes289,S289} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG008.xsd','./msxsdtest/identityConstraint',valid),
+ STResList290 = [STRes289|STResList289],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG008.xml','./msxsdtest/identityConstraint',invalid,S289),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes290,S290} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG009.xsd','./msxsdtest/identityConstraint',valid),
+ STResList291 = [STRes290|STResList290],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG009.xml','./msxsdtest/identityConstraint',invalid,S290),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes291,S291} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG010.xsd','./msxsdtest/identityConstraint',valid),
+ STResList292 = [STRes291|STResList291],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG010.xml','./msxsdtest/identityConstraint',invalid,S291),
+ ITResList44 = [ITRes43|ITResList43],
+
+
+ ?line {STRes292,S292} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG011.xsd','./msxsdtest/identityConstraint',valid),
+ STResList293 = [STRes292|STResList292],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG011.xml','./msxsdtest/identityConstraint',invalid,S292),
+ ITResList45 = [ITRes44|ITResList44],
+
+
+ ?line {STRes293,S293} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG012.xsd','./msxsdtest/identityConstraint',valid),
+ STResList294 = [STRes293|STResList293],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG012.xml','./msxsdtest/identityConstraint',invalid,S293),
+ ITResList46 = [ITRes45|ITResList45],
+
+
+ ?line {STRes294,S294} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG013.xsd','./msxsdtest/identityConstraint',valid),
+ STResList295 = [STRes294|STResList294],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG013.xml','./msxsdtest/identityConstraint',valid,S294),
+ ITResList47 = [ITRes46|ITResList46],
+
+
+ ?line {STRes295,S295} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG014.xsd','./msxsdtest/identityConstraint',valid),
+ STResList296 = [STRes295|STResList295],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG014.xml','./msxsdtest/identityConstraint',valid,S295),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes296,S296} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG015.xsd','./msxsdtest/identityConstraint',valid),
+ STResList297 = [STRes296|STResList296],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG015.xml','./msxsdtest/identityConstraint',valid,S296),
+ ITResList49 = [ITRes48|ITResList48],
+
+
+ ?line {STRes297,S297} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG016.xsd','./msxsdtest/identityConstraint',valid),
+ STResList298 = [STRes297|STResList297],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG016.xml','./msxsdtest/identityConstraint',valid,S297),
+ ITResList50 = [ITRes49|ITResList49],
+
+
+ ?line {STRes298,S298} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG017.xsd','./msxsdtest/identityConstraint',valid),
+ STResList299 = [STRes298|STResList298],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG017.xml','./msxsdtest/identityConstraint',valid,S298),
+ ITResList51 = [ITRes50|ITResList50],
+
+
+ ?line {STRes299,S299} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG018.xsd','./msxsdtest/identityConstraint',valid),
+ STResList300 = [STRes299|STResList299],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG018.xml','./msxsdtest/identityConstraint',valid,S299),
+ ITResList52 = [ITRes51|ITResList51],
+
+
+ ?line {STRes300,S300} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG019.xsd','./msxsdtest/identityConstraint',valid),
+ STResList301 = [STRes300|STResList300],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG019.xml','./msxsdtest/identityConstraint',valid,S300),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes301,S301} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG020.xsd','./msxsdtest/identityConstraint',valid),
+ STResList302 = [STRes301|STResList301],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG020.xml','./msxsdtest/identityConstraint',invalid,S301),
+ ITResList54 = [ITRes53|ITResList53],
+
+
+ ?line {STRes302,S302} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG021.xsd','./msxsdtest/identityConstraint',valid),
+ STResList303 = [STRes302|STResList302],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG021.xml','./msxsdtest/identityConstraint',valid,S302),
+ ITResList55 = [ITRes54|ITResList54],
+
+
+ ?line {STRes303,S303} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG022.xsd','./msxsdtest/identityConstraint',valid),
+ STResList304 = [STRes303|STResList303],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG022.xml','./msxsdtest/identityConstraint',valid,S303),
+ ITResList56 = [ITRes55|ITResList55],
+
+
+ ?line {STRes304,S304} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG023.xsd','./msxsdtest/identityConstraint',valid),
+ STResList305 = [STRes304|STResList304],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG023.xml','./msxsdtest/identityConstraint',valid,S304),
+ ITResList57 = [ITRes56|ITResList56],
+
+
+ ?line {STRes305,S305} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG024.xsd','./msxsdtest/identityConstraint',valid),
+ STResList306 = [STRes305|STResList305],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG024.xml','./msxsdtest/identityConstraint',valid,S305),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes306,S306} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG025.xsd','./msxsdtest/identityConstraint',valid),
+ STResList307 = [STRes306|STResList306],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG025.xml','./msxsdtest/identityConstraint',invalid,S306),
+ ITResList59 = [ITRes58|ITResList58],
+
+
+ ?line {STRes307,S307} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG026.xsd','./msxsdtest/identityConstraint',valid),
+ STResList308 = [STRes307|STResList307],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG026.xml','./msxsdtest/identityConstraint',valid,S307),
+ ITResList60 = [ITRes59|ITResList59],
+
+
+ ?line {STRes308,S308} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG027.xsd','./msxsdtest/identityConstraint',valid),
+ STResList309 = [STRes308|STResList308],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG027.xml','./msxsdtest/identityConstraint',valid,S308),
+ ITResList61 = [ITRes60|ITResList60],
+
+
+ ?line {STRes309,S309} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG028.xsd','./msxsdtest/identityConstraint',valid),
+ STResList310 = [STRes309|STResList309],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG028.xml','./msxsdtest/identityConstraint',valid,S309),
+ ITResList62 = [ITRes61|ITResList61],
+
+
+ ?line {STRes310,S310} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG029.xsd','./msxsdtest/identityConstraint',valid),
+ STResList311 = [STRes310|STResList310],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG029.xml','./msxsdtest/identityConstraint',valid,S310),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes311,S311} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idG030.xsd','./msxsdtest/identityConstraint',valid),
+ STResList312 = [STRes311|STResList311],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idG030.xml','./msxsdtest/identityConstraint',valid,S311),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes312,S312} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH001.xsd','./msxsdtest/identityConstraint',valid),
+ STResList313 = [STRes312|STResList312],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH001.xml','./msxsdtest/identityConstraint',valid,S312),
+ ITResList65 = [ITRes64|ITResList64],
+
+
+ ?line {STRes313,S313} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH003.xsd','./msxsdtest/identityConstraint',valid),
+ STResList314 = [STRes313|STResList313],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH003.xml','./msxsdtest/identityConstraint',valid,S313),
+ ITResList66 = [ITRes65|ITResList65],
+
+
+ ?line {STRes314,S314} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH004.xsd','./msxsdtest/identityConstraint',valid),
+ STResList315 = [STRes314|STResList314],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH004.xml','./msxsdtest/identityConstraint',valid,S314),
+ ITResList67 = [ITRes66|ITResList66],
+
+
+ ?line {STRes315,S315} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH005.xsd','./msxsdtest/identityConstraint',valid),
+ STResList316 = [STRes315|STResList315],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH005.xml','./msxsdtest/identityConstraint',invalid,S315),
+ ITResList68 = [ITRes67|ITResList67],
+
+
+ ?line {STRes316,S316} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH006.xsd','./msxsdtest/identityConstraint',valid),
+ STResList317 = [STRes316|STResList316],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH006.xml','./msxsdtest/identityConstraint',invalid,S316),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes317,S317} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH007.xsd','./msxsdtest/identityConstraint',valid),
+ STResList318 = [STRes317|STResList317],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH007.xml','./msxsdtest/identityConstraint',valid,S317),
+ ITResList70 = [ITRes69|ITResList69],
+
+
+ ?line {STRes318,S318} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH008.xsd','./msxsdtest/identityConstraint',valid),
+ STResList319 = [STRes318|STResList318],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH008.xml','./msxsdtest/identityConstraint',valid,S318),
+ ITResList71 = [ITRes70|ITResList70],
+
+
+ ?line {STRes319,S319} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH009.xsd','./msxsdtest/identityConstraint',valid),
+ STResList320 = [STRes319|STResList319],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH009.xml','./msxsdtest/identityConstraint',valid,S319),
+ ITResList72 = [ITRes71|ITResList71],
+
+
+ ?line {STRes320,S320} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH010.xsd','./msxsdtest/identityConstraint',valid),
+ STResList321 = [STRes320|STResList320],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH010.xml','./msxsdtest/identityConstraint',invalid,S320),
+ ITResList73 = [ITRes72|ITResList72],
+
+
+ ?line {STRes321,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH011.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList322 = [STRes321|STResList321],
+
+
+ ?line {STRes322,S322} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH012.xsd','./msxsdtest/identityConstraint',valid),
+ STResList323 = [STRes322|STResList322],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH012.xml','./msxsdtest/identityConstraint',invalid,S322),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes323,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH013.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList324 = [STRes323|STResList323],
+
+
+ ?line {STRes324,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH014.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList325 = [STRes324|STResList324],
+
+
+ ?line {STRes325,S325} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH015.xsd','./msxsdtest/identityConstraint',valid),
+ STResList326 = [STRes325|STResList325],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH015.xml','./msxsdtest/identityConstraint',valid,S325),
+ ITResList75 = [ITRes74|ITResList74],
+
+
+ ?line {STRes326,S326} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH016.xsd','./msxsdtest/identityConstraint',valid),
+ STResList327 = [STRes326|STResList326],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH016.xml','./msxsdtest/identityConstraint',valid,S326),
+ ITResList76 = [ITRes75|ITResList75],
+
+
+ ?line {STRes327,S327} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH017.xsd','./msxsdtest/identityConstraint',valid),
+ STResList328 = [STRes327|STResList327],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH017.xml','./msxsdtest/identityConstraint',valid,S327),
+ ITResList77 = [ITRes76|ITResList76],
+
+
+ ?line {STRes328,S328} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH018.xsd','./msxsdtest/identityConstraint',valid),
+ STResList329 = [STRes328|STResList328],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH018.xml','./msxsdtest/identityConstraint',valid,S328),
+ ITResList78 = [ITRes77|ITResList77],
+
+
+ ?line {STRes329,S329} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH019.xsd','./msxsdtest/identityConstraint',valid),
+ STResList330 = [STRes329|STResList329],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH019.xml','./msxsdtest/identityConstraint',valid,S329),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes330,S330} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH020.xsd','./msxsdtest/identityConstraint',valid),
+ STResList331 = [STRes330|STResList330],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH020.xml','./msxsdtest/identityConstraint',valid,S330),
+ ITResList80 = [ITRes79|ITResList79],
+
+
+ ?line {STRes331,S331} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH021.xsd','./msxsdtest/identityConstraint',valid),
+ STResList332 = [STRes331|STResList331],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH021.xml','./msxsdtest/identityConstraint',valid,S331),
+ ITResList81 = [ITRes80|ITResList80],
+
+
+ ?line {STRes332,S332} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH022.xsd','./msxsdtest/identityConstraint',valid),
+ STResList333 = [STRes332|STResList332],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH022.xml','./msxsdtest/identityConstraint',valid,S332),
+ ITResList82 = [ITRes81|ITResList81],
+
+
+ ?line {STRes333,S333} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH023.xsd','./msxsdtest/identityConstraint',valid),
+ STResList334 = [STRes333|STResList333],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH023.xml','./msxsdtest/identityConstraint',valid,S333),
+ ITResList83 = [ITRes82|ITResList82],
+
+
+ ?line {STRes334,S334} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH024.xsd','./msxsdtest/identityConstraint',valid),
+ STResList335 = [STRes334|STResList334],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH024.xml','./msxsdtest/identityConstraint',valid,S334),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes335,S335} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH025.xsd','./msxsdtest/identityConstraint',valid),
+ STResList336 = [STRes335|STResList335],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH025.xml','./msxsdtest/identityConstraint',valid,S335),
+ ITResList85 = [ITRes84|ITResList84],
+
+
+ ?line {STRes336,S336} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH026.xsd','./msxsdtest/identityConstraint',valid),
+ STResList337 = [STRes336|STResList336],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH026.xml','./msxsdtest/identityConstraint',valid,S336),
+ ITResList86 = [ITRes85|ITResList85],
+
+
+ ?line {STRes337,S337} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH027.xsd','./msxsdtest/identityConstraint',valid),
+ STResList338 = [STRes337|STResList337],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH027.xml','./msxsdtest/identityConstraint',valid,S337),
+ ITResList87 = [ITRes86|ITResList86],
+
+
+ ?line {STRes338,S338} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH028.xsd','./msxsdtest/identityConstraint',valid),
+ STResList339 = [STRes338|STResList338],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH028.xml','./msxsdtest/identityConstraint',valid,S338),
+ ITResList88 = [ITRes87|ITResList87],
+
+
+ ?line {STRes339,S339} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH029.xsd','./msxsdtest/identityConstraint',valid),
+ STResList340 = [STRes339|STResList339],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH029.xml','./msxsdtest/identityConstraint',valid,S339),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes340,S340} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH030.xsd','./msxsdtest/identityConstraint',valid),
+ STResList341 = [STRes340|STResList340],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH030.xml','./msxsdtest/identityConstraint',valid,S340),
+ ITResList90 = [ITRes89|ITResList89],
+
+
+ ?line {STRes341,S341} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH031.xsd','./msxsdtest/identityConstraint',valid),
+ STResList342 = [STRes341|STResList341],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH031.xml','./msxsdtest/identityConstraint',valid,S341),
+ ITResList91 = [ITRes90|ITResList90],
+
+
+ ?line {STRes342,S342} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH032.xsd','./msxsdtest/identityConstraint',valid),
+ STResList343 = [STRes342|STResList342],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH032.xml','./msxsdtest/identityConstraint',valid,S342),
+ ITResList92 = [ITRes91|ITResList91],
+
+
+ ?line {STRes343,S343} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH034.xsd','./msxsdtest/identityConstraint',valid),
+ STResList344 = [STRes343|STResList343],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idH034.xml','./msxsdtest/identityConstraint',valid,S343),
+ ITResList93 = [ITRes92|ITResList92],
+
+
+ ?line {STRes344,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idH035.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList345 = [STRes344|STResList344],
+
+
+ ?line {STRes345,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI001.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList346 = [STRes345|STResList345],
+
+
+ ?line {STRes346,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI002.xsd','./msxsdtest/identityConstraint',valid),
+ STResList347 = [STRes346|STResList346],
+
+
+ ?line {STRes347,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI003.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList348 = [STRes347|STResList347],
+
+
+ ?line {STRes348,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI004.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList349 = [STRes348|STResList348],
+
+
+ ?line {STRes349,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI005.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList350 = [STRes349|STResList349],
+
+
+ ?line {STRes350,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI006.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList351 = [STRes350|STResList350],
+
+
+ ?line {STRes351,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI007.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList352 = [STRes351|STResList351],
+
+
+ ?line {STRes352,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI008.xsd','./msxsdtest/identityConstraint',valid),
+ STResList353 = [STRes352|STResList352],
+
+
+ ?line {STRes353,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI009.xsd','./msxsdtest/identityConstraint',valid),
+ STResList354 = [STRes353|STResList353],
+
+
+ ?line {STRes354,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI010.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList355 = [STRes354|STResList354],
+
+
+ ?line {STRes355,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI011.xsd','./msxsdtest/identityConstraint',valid),
+ STResList356 = [STRes355|STResList355],
+
+
+ ?line {STRes356,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI012.xsd','./msxsdtest/identityConstraint',valid),
+ STResList357 = [STRes356|STResList356],
+
+
+ ?line {STRes357,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI013.xsd','./msxsdtest/identityConstraint',valid),
+ STResList358 = [STRes357|STResList357],
+
+
+ ?line {STRes358,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI014.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList359 = [STRes358|STResList358],
+
+
+ ?line {STRes359,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI015.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList360 = [STRes359|STResList359],
+
+
+ ?line {STRes360,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI016.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList361 = [STRes360|STResList360],
+
+
+ ?line {STRes361,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI017.xsd','./msxsdtest/identityConstraint',valid),
+ STResList362 = [STRes361|STResList361],
+
+
+ ?line {STRes362,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI018.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList363 = [STRes362|STResList362],
+
+
+ ?line {STRes363,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI019.xsd','./msxsdtest/identityConstraint',valid),
+ STResList364 = [STRes363|STResList363],
+
+
+ ?line {STRes364,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI020.xsd','./msxsdtest/identityConstraint',valid),
+ STResList365 = [STRes364|STResList364],
+
+
+ ?line {STRes365,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI021.xsd','./msxsdtest/identityConstraint',valid),
+ STResList366 = [STRes365|STResList365],
+
+
+ ?line {STRes366,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI022.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList367 = [STRes366|STResList366],
+
+
+ ?line {STRes367,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI023.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList368 = [STRes367|STResList367],
+
+
+ ?line {STRes368,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI024.xsd','./msxsdtest/identityConstraint',valid),
+ STResList369 = [STRes368|STResList368],
+
+
+ ?line {STRes369,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI025.xsd','./msxsdtest/identityConstraint',valid),
+ STResList370 = [STRes369|STResList369],
+
+
+ ?line {STRes370,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI026.xsd','./msxsdtest/identityConstraint',valid),
+ STResList371 = [STRes370|STResList370],
+
+
+ ?line {STRes371,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI027.xsd','./msxsdtest/identityConstraint',valid),
+ STResList372 = [STRes371|STResList371],
+
+
+ ?line {STRes372,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI028.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList373 = [STRes372|STResList372],
+
+
+ ?line {STRes373,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI029.xsd','./msxsdtest/identityConstraint',valid),
+ STResList374 = [STRes373|STResList373],
+
+
+ ?line {STRes374,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI030.xsd','./msxsdtest/identityConstraint',valid),
+ STResList375 = [STRes374|STResList374],
+
+
+ ?line {STRes375,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI031.xsd','./msxsdtest/identityConstraint',valid),
+ STResList376 = [STRes375|STResList375],
+
+
+ ?line {STRes376,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI032.xsd','./msxsdtest/identityConstraint',valid),
+ STResList377 = [STRes376|STResList376],
+
+
+ ?line {STRes377,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI033.xsd','./msxsdtest/identityConstraint',valid),
+ STResList378 = [STRes377|STResList377],
+
+
+ ?line {STRes378,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI034.xsd','./msxsdtest/identityConstraint',valid),
+ STResList379 = [STRes378|STResList378],
+
+
+ ?line {STRes379,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI035.xsd','./msxsdtest/identityConstraint',valid),
+ STResList380 = [STRes379|STResList379],
+
+
+ ?line {STRes380,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI036.xsd','./msxsdtest/identityConstraint',valid),
+ STResList381 = [STRes380|STResList380],
+
+
+ ?line {STRes381,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI037.xsd','./msxsdtest/identityConstraint',valid),
+ STResList382 = [STRes381|STResList381],
+
+
+ ?line {STRes382,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI038.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList383 = [STRes382|STResList382],
+
+
+ ?line {STRes383,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI039.xsd','./msxsdtest/identityConstraint',valid),
+ STResList384 = [STRes383|STResList383],
+
+
+ ?line {STRes384,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI040.xsd','./msxsdtest/identityConstraint',valid),
+ STResList385 = [STRes384|STResList384],
+
+
+ ?line {STRes385,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI041.xsd','./msxsdtest/identityConstraint',valid),
+ STResList386 = [STRes385|STResList385],
+
+
+ ?line {STRes386,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI042.xsd','./msxsdtest/identityConstraint',valid),
+ STResList387 = [STRes386|STResList386],
+
+
+ ?line {STRes387,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI043.xsd','./msxsdtest/identityConstraint',valid),
+ STResList388 = [STRes387|STResList387],
+
+
+ ?line {STRes388,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI044.xsd','./msxsdtest/identityConstraint',valid),
+ STResList389 = [STRes388|STResList388],
+
+
+ ?line {STRes389,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI045.xsd','./msxsdtest/identityConstraint',valid),
+ STResList390 = [STRes389|STResList389],
+
+
+ ?line {STRes390,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI046.xsd','./msxsdtest/identityConstraint',valid),
+ STResList391 = [STRes390|STResList390],
+
+
+ ?line {STRes391,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI047.xsd','./msxsdtest/identityConstraint',valid),
+ STResList392 = [STRes391|STResList391],
+
+
+ ?line {STRes392,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI048.xsd','./msxsdtest/identityConstraint',valid),
+ STResList393 = [STRes392|STResList392],
+
+
+ ?line {STRes393,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI049.xsd','./msxsdtest/identityConstraint',valid),
+ STResList394 = [STRes393|STResList393],
+
+
+ ?line {STRes394,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI050.xsd','./msxsdtest/identityConstraint',valid),
+ STResList395 = [STRes394|STResList394],
+
+
+ ?line {STRes395,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI051.xsd','./msxsdtest/identityConstraint',valid),
+ STResList396 = [STRes395|STResList395],
+
+
+ ?line {STRes396,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI052.xsd','./msxsdtest/identityConstraint',valid),
+ STResList397 = [STRes396|STResList396],
+
+
+ ?line {STRes397,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI053.xsd','./msxsdtest/identityConstraint',valid),
+ STResList398 = [STRes397|STResList397],
+
+
+ ?line {STRes398,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI054.xsd','./msxsdtest/identityConstraint',valid),
+ STResList399 = [STRes398|STResList398],
+
+
+ ?line {STRes399,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI055.xsd','./msxsdtest/identityConstraint',valid),
+ STResList400 = [STRes399|STResList399],
+
+
+ ?line {STRes400,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI056.xsd','./msxsdtest/identityConstraint',valid),
+ STResList401 = [STRes400|STResList400],
+
+
+ ?line {STRes401,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI057.xsd','./msxsdtest/identityConstraint',valid),
+ STResList402 = [STRes401|STResList401],
+
+
+ ?line {STRes402,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI058.xsd','./msxsdtest/identityConstraint',valid),
+ STResList403 = [STRes402|STResList402],
+
+
+ ?line {STRes403,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI059.xsd','./msxsdtest/identityConstraint',valid),
+ STResList404 = [STRes403|STResList403],
+
+
+ ?line {STRes404,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI060.xsd','./msxsdtest/identityConstraint',valid),
+ STResList405 = [STRes404|STResList404],
+
+
+ ?line {STRes405,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI061.xsd','./msxsdtest/identityConstraint',valid),
+ STResList406 = [STRes405|STResList405],
+
+
+ ?line {STRes406,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI062.xsd','./msxsdtest/identityConstraint',valid),
+ STResList407 = [STRes406|STResList406],
+
+
+ ?line {STRes407,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI063.xsd','./msxsdtest/identityConstraint',valid),
+ STResList408 = [STRes407|STResList407],
+
+
+ ?line {STRes408,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI064.xsd','./msxsdtest/identityConstraint',valid),
+ STResList409 = [STRes408|STResList408],
+
+
+ ?line {STRes409,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI065.xsd','./msxsdtest/identityConstraint',valid),
+ STResList410 = [STRes409|STResList409],
+
+
+ ?line {STRes410,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI066.xsd','./msxsdtest/identityConstraint',valid),
+ STResList411 = [STRes410|STResList410],
+
+
+ ?line {STRes411,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI067.xsd','./msxsdtest/identityConstraint',valid),
+ STResList412 = [STRes411|STResList411],
+
+
+ ?line {STRes412,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI068.xsd','./msxsdtest/identityConstraint',valid),
+ STResList413 = [STRes412|STResList412],
+
+
+ ?line {STRes413,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI069.xsd','./msxsdtest/identityConstraint',valid),
+ STResList414 = [STRes413|STResList413],
+
+
+ ?line {STRes414,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI070.xsd','./msxsdtest/identityConstraint',valid),
+ STResList415 = [STRes414|STResList414],
+
+
+ ?line {STRes415,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI071.xsd','./msxsdtest/identityConstraint',valid),
+ STResList416 = [STRes415|STResList415],
+
+
+ ?line {STRes416,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI072.xsd','./msxsdtest/identityConstraint',valid),
+ STResList417 = [STRes416|STResList416],
+
+
+ ?line {STRes417,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI073.xsd','./msxsdtest/identityConstraint',valid),
+ STResList418 = [STRes417|STResList417],
+
+
+ ?line {STRes418,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI074.xsd','./msxsdtest/identityConstraint',valid),
+ STResList419 = [STRes418|STResList418],
+
+
+ ?line {STRes419,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI075.xsd','./msxsdtest/identityConstraint',valid),
+ STResList420 = [STRes419|STResList419],
+
+
+ ?line {STRes420,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI076.xsd','./msxsdtest/identityConstraint',valid),
+ STResList421 = [STRes420|STResList420],
+
+
+ ?line {STRes421,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI077.xsd','./msxsdtest/identityConstraint',valid),
+ STResList422 = [STRes421|STResList421],
+
+
+ ?line {STRes422,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI078.xsd','./msxsdtest/identityConstraint',valid),
+ STResList423 = [STRes422|STResList422],
+
+
+ ?line {STRes423,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI079.xsd','./msxsdtest/identityConstraint',valid),
+ STResList424 = [STRes423|STResList423],
+
+
+ ?line {STRes424,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI080.xsd','./msxsdtest/identityConstraint',valid),
+ STResList425 = [STRes424|STResList424],
+
+
+ ?line {STRes425,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI081.xsd','./msxsdtest/identityConstraint',valid),
+ STResList426 = [STRes425|STResList425],
+
+
+ ?line {STRes426,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI082.xsd','./msxsdtest/identityConstraint',valid),
+ STResList427 = [STRes426|STResList426],
+
+
+ ?line {STRes427,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI083.xsd','./msxsdtest/identityConstraint',valid),
+ STResList428 = [STRes427|STResList427],
+
+
+ ?line {STRes428,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI084.xsd','./msxsdtest/identityConstraint',valid),
+ STResList429 = [STRes428|STResList428],
+
+
+ ?line {STRes429,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI085.xsd','./msxsdtest/identityConstraint',valid),
+ STResList430 = [STRes429|STResList429],
+
+
+ ?line {STRes430,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI086.xsd','./msxsdtest/identityConstraint',valid),
+ STResList431 = [STRes430|STResList430],
+
+
+ ?line {STRes431,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI087.xsd','./msxsdtest/identityConstraint',valid),
+ STResList432 = [STRes431|STResList431],
+
+
+ ?line {STRes432,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI088.xsd','./msxsdtest/identityConstraint',valid),
+ STResList433 = [STRes432|STResList432],
+
+
+ ?line {STRes433,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI089.xsd','./msxsdtest/identityConstraint',valid),
+ STResList434 = [STRes433|STResList433],
+
+
+ ?line {STRes434,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI090.xsd','./msxsdtest/identityConstraint',valid),
+ STResList435 = [STRes434|STResList434],
+
+
+ ?line {STRes435,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI091.xsd','./msxsdtest/identityConstraint',valid),
+ STResList436 = [STRes435|STResList435],
+
+
+ ?line {STRes436,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI092.xsd','./msxsdtest/identityConstraint',valid),
+ STResList437 = [STRes436|STResList436],
+
+
+ ?line {STRes437,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI093.xsd','./msxsdtest/identityConstraint',valid),
+ STResList438 = [STRes437|STResList437],
+
+
+ ?line {STRes438,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI094.xsd','./msxsdtest/identityConstraint',valid),
+ STResList439 = [STRes438|STResList438],
+
+
+ ?line {STRes439,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI095.xsd','./msxsdtest/identityConstraint',valid),
+ STResList440 = [STRes439|STResList439],
+
+
+ ?line {STRes440,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI096.xsd','./msxsdtest/identityConstraint',valid),
+ STResList441 = [STRes440|STResList440],
+
+
+ ?line {STRes441,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI097.xsd','./msxsdtest/identityConstraint',valid),
+ STResList442 = [STRes441|STResList441],
+
+
+ ?line {STRes442,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI098.xsd','./msxsdtest/identityConstraint',valid),
+ STResList443 = [STRes442|STResList442],
+
+
+ ?line {STRes443,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI099.xsd','./msxsdtest/identityConstraint',valid),
+ STResList444 = [STRes443|STResList443],
+
+
+ ?line {STRes444,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI100.xsd','./msxsdtest/identityConstraint',valid),
+ STResList445 = [STRes444|STResList444],
+
+
+ ?line {STRes445,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI101.xsd','./msxsdtest/identityConstraint',valid),
+ STResList446 = [STRes445|STResList445],
+
+
+ ?line {STRes446,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI102.xsd','./msxsdtest/identityConstraint',valid),
+ STResList447 = [STRes446|STResList446],
+
+
+ ?line {STRes447,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI103.xsd','./msxsdtest/identityConstraint',valid),
+ STResList448 = [STRes447|STResList447],
+
+
+ ?line {STRes448,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI104.xsd','./msxsdtest/identityConstraint',valid),
+ STResList449 = [STRes448|STResList448],
+
+
+ ?line {STRes449,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI105.xsd','./msxsdtest/identityConstraint',valid),
+ STResList450 = [STRes449|STResList449],
+
+
+ ?line {STRes450,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI106.xsd','./msxsdtest/identityConstraint',valid),
+ STResList451 = [STRes450|STResList450],
+
+
+ ?line {STRes451,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI107.xsd','./msxsdtest/identityConstraint',valid),
+ STResList452 = [STRes451|STResList451],
+
+
+ ?line {STRes452,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI108.xsd','./msxsdtest/identityConstraint',valid),
+ STResList453 = [STRes452|STResList452],
+
+
+ ?line {STRes453,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI109.xsd','./msxsdtest/identityConstraint',valid),
+ STResList454 = [STRes453|STResList453],
+
+
+ ?line {STRes454,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI110.xsd','./msxsdtest/identityConstraint',valid),
+ STResList455 = [STRes454|STResList454],
+
+
+ ?line {STRes455,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI111.xsd','./msxsdtest/identityConstraint',valid),
+ STResList456 = [STRes455|STResList455],
+
+
+ ?line {STRes456,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI112.xsd','./msxsdtest/identityConstraint',valid),
+ STResList457 = [STRes456|STResList456],
+
+
+ ?line {STRes457,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI113.xsd','./msxsdtest/identityConstraint',valid),
+ STResList458 = [STRes457|STResList457],
+
+
+ ?line {STRes458,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI114.xsd','./msxsdtest/identityConstraint',valid),
+ STResList459 = [STRes458|STResList458],
+
+
+ ?line {STRes459,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI115.xsd','./msxsdtest/identityConstraint',valid),
+ STResList460 = [STRes459|STResList459],
+
+
+ ?line {STRes460,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI116.xsd','./msxsdtest/identityConstraint',valid),
+ STResList461 = [STRes460|STResList460],
+
+
+ ?line {STRes461,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI117.xsd','./msxsdtest/identityConstraint',valid),
+ STResList462 = [STRes461|STResList461],
+
+
+ ?line {STRes462,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI118.xsd','./msxsdtest/identityConstraint',valid),
+ STResList463 = [STRes462|STResList462],
+
+
+ ?line {STRes463,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI119.xsd','./msxsdtest/identityConstraint',valid),
+ STResList464 = [STRes463|STResList463],
+
+
+ ?line {STRes464,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI120.xsd','./msxsdtest/identityConstraint',valid),
+ STResList465 = [STRes464|STResList464],
+
+
+ ?line {STRes465,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI121.xsd','./msxsdtest/identityConstraint',valid),
+ STResList466 = [STRes465|STResList465],
+
+
+ ?line {STRes466,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI122.xsd','./msxsdtest/identityConstraint',valid),
+ STResList467 = [STRes466|STResList466],
+
+
+ ?line {STRes467,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI123.xsd','./msxsdtest/identityConstraint',valid),
+ STResList468 = [STRes467|STResList467],
+
+
+ ?line {STRes468,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI124.xsd','./msxsdtest/identityConstraint',valid),
+ STResList469 = [STRes468|STResList468],
+
+
+ ?line {STRes469,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI125.xsd','./msxsdtest/identityConstraint',valid),
+ STResList470 = [STRes469|STResList469],
+
+
+ ?line {STRes470,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI126.xsd','./msxsdtest/identityConstraint',valid),
+ STResList471 = [STRes470|STResList470],
+
+
+ ?line {STRes471,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI127.xsd','./msxsdtest/identityConstraint',valid),
+ STResList472 = [STRes471|STResList471],
+
+
+ ?line {STRes472,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI128.xsd','./msxsdtest/identityConstraint',valid),
+ STResList473 = [STRes472|STResList472],
+
+
+ ?line {STRes473,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI129.xsd','./msxsdtest/identityConstraint',valid),
+ STResList474 = [STRes473|STResList473],
+
+
+ ?line {STRes474,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI130.xsd','./msxsdtest/identityConstraint',valid),
+ STResList475 = [STRes474|STResList474],
+
+
+ ?line {STRes475,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI131.xsd','./msxsdtest/identityConstraint',valid),
+ STResList476 = [STRes475|STResList475],
+
+
+ ?line {STRes476,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI132.xsd','./msxsdtest/identityConstraint',valid),
+ STResList477 = [STRes476|STResList476],
+
+
+ ?line {STRes477,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI133.xsd','./msxsdtest/identityConstraint',valid),
+ STResList478 = [STRes477|STResList477],
+
+
+ ?line {STRes478,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI134.xsd','./msxsdtest/identityConstraint',valid),
+ STResList479 = [STRes478|STResList478],
+
+
+ ?line {STRes479,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI135.xsd','./msxsdtest/identityConstraint',valid),
+ STResList480 = [STRes479|STResList479],
+
+
+ ?line {STRes480,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI136.xsd','./msxsdtest/identityConstraint',valid),
+ STResList481 = [STRes480|STResList480],
+
+
+ ?line {STRes481,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI137.xsd','./msxsdtest/identityConstraint',valid),
+ STResList482 = [STRes481|STResList481],
+
+
+ ?line {STRes482,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI138.xsd','./msxsdtest/identityConstraint',valid),
+ STResList483 = [STRes482|STResList482],
+
+
+ ?line {STRes483,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI139.xsd','./msxsdtest/identityConstraint',valid),
+ STResList484 = [STRes483|STResList483],
+
+
+ ?line {STRes484,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI140.xsd','./msxsdtest/identityConstraint',valid),
+ STResList485 = [STRes484|STResList484],
+
+
+ ?line {STRes485,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI141.xsd','./msxsdtest/identityConstraint',valid),
+ STResList486 = [STRes485|STResList485],
+
+
+ ?line {STRes486,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI142.xsd','./msxsdtest/identityConstraint',valid),
+ STResList487 = [STRes486|STResList486],
+
+
+ ?line {STRes487,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI143.xsd','./msxsdtest/identityConstraint',valid),
+ STResList488 = [STRes487|STResList487],
+
+
+ ?line {STRes488,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI144.xsd','./msxsdtest/identityConstraint',valid),
+ STResList489 = [STRes488|STResList488],
+
+
+ ?line {STRes489,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI145.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList490 = [STRes489|STResList489],
+
+
+ ?line {STRes490,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI146.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList491 = [STRes490|STResList490],
+
+
+ ?line {STRes491,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI147.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList492 = [STRes491|STResList491],
+
+
+ ?line {STRes492,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI148.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList493 = [STRes492|STResList492],
+
+
+ ?line {STRes493,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI149.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList494 = [STRes493|STResList493],
+
+
+ ?line {STRes494,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI150.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList495 = [STRes494|STResList494],
+
+
+ ?line {STRes495,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI151.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList496 = [STRes495|STResList495],
+
+
+ ?line {STRes496,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idI152.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList497 = [STRes496|STResList496],
+
+
+ ?line {STRes497,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ001.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList498 = [STRes497|STResList497],
+
+
+ ?line {STRes498,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ002.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList499 = [STRes498|STResList498],
+
+
+ ?line {STRes499,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ003.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList500 = [STRes499|STResList499],
+
+
+ ?line {STRes500,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ004.xsd','./msxsdtest/identityConstraint',valid),
+ STResList501 = [STRes500|STResList500],
+
+
+ ?line {STRes501,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ005.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList502 = [STRes501|STResList501],
+
+
+ ?line {STRes502,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ006.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList503 = [STRes502|STResList502],
+
+
+ ?line {STRes503,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ007.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList504 = [STRes503|STResList503],
+
+
+ ?line {STRes504,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ008.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList505 = [STRes504|STResList504],
+
+
+ ?line {STRes505,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ009.xsd','./msxsdtest/identityConstraint',valid),
+ STResList506 = [STRes505|STResList505],
+
+
+ ?line {STRes506,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ010.xsd','./msxsdtest/identityConstraint',valid),
+ STResList507 = [STRes506|STResList506],
+
+
+ ?line {STRes507,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ011.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList508 = [STRes507|STResList507],
+
+
+ ?line {STRes508,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ012.xsd','./msxsdtest/identityConstraint',valid),
+ STResList509 = [STRes508|STResList508],
+
+
+ ?line {STRes509,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ013.xsd','./msxsdtest/identityConstraint',valid),
+ STResList510 = [STRes509|STResList509],
+
+
+ ?line {STRes510,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ014.xsd','./msxsdtest/identityConstraint',valid),
+ STResList511 = [STRes510|STResList510],
+
+
+ ?line {STRes511,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ015.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList512 = [STRes511|STResList511],
+
+
+ ?line {STRes512,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ016.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList513 = [STRes512|STResList512],
+
+
+ ?line {STRes513,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ017.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList514 = [STRes513|STResList513],
+
+
+ ?line {STRes514,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ018.xsd','./msxsdtest/identityConstraint',valid),
+ STResList515 = [STRes514|STResList514],
+
+
+ ?line {STRes515,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ019.xsd','./msxsdtest/identityConstraint',valid),
+ STResList516 = [STRes515|STResList515],
+
+
+ ?line {STRes516,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ020.xsd','./msxsdtest/identityConstraint',valid),
+ STResList517 = [STRes516|STResList516],
+
+
+ ?line {STRes517,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ021.xsd','./msxsdtest/identityConstraint',valid),
+ STResList518 = [STRes517|STResList517],
+
+
+ ?line {STRes518,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ022.xsd','./msxsdtest/identityConstraint',valid),
+ STResList519 = [STRes518|STResList518],
+
+
+ ?line {STRes519,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ023.xsd','./msxsdtest/identityConstraint',valid),
+ STResList520 = [STRes519|STResList519],
+
+
+ ?line {STRes520,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ024.xsd','./msxsdtest/identityConstraint',valid),
+ STResList521 = [STRes520|STResList520],
+
+
+ ?line {STRes521,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ025.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList522 = [STRes521|STResList521],
+
+
+ ?line {STRes522,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ026.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList523 = [STRes522|STResList522],
+
+
+ ?line {STRes523,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ027.xsd','./msxsdtest/identityConstraint',valid),
+ STResList524 = [STRes523|STResList523],
+
+
+ ?line {STRes524,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ028.xsd','./msxsdtest/identityConstraint',valid),
+ STResList525 = [STRes524|STResList524],
+
+
+ ?line {STRes525,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ029.xsd','./msxsdtest/identityConstraint',valid),
+ STResList526 = [STRes525|STResList525],
+
+
+ ?line {STRes526,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ030.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList527 = [STRes526|STResList526],
+
+
+ ?line {STRes527,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ031.xsd','./msxsdtest/identityConstraint',valid),
+ STResList528 = [STRes527|STResList527],
+
+
+ ?line {STRes528,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ032.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList529 = [STRes528|STResList528],
+
+
+ ?line {STRes529,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ033.xsd','./msxsdtest/identityConstraint',valid),
+ STResList530 = [STRes529|STResList529],
+
+
+ ?line {STRes530,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ034.xsd','./msxsdtest/identityConstraint',valid),
+ STResList531 = [STRes530|STResList530],
+
+
+ ?line {STRes531,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ035.xsd','./msxsdtest/identityConstraint',valid),
+ STResList532 = [STRes531|STResList531],
+
+
+ ?line {STRes532,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ036.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList533 = [STRes532|STResList532],
+
+
+ ?line {STRes533,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ037.xsd','./msxsdtest/identityConstraint',valid),
+ STResList534 = [STRes533|STResList533],
+
+
+ ?line {STRes534,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ038.xsd','./msxsdtest/identityConstraint',valid),
+ STResList535 = [STRes534|STResList534],
+
+
+ ?line {STRes535,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ039.xsd','./msxsdtest/identityConstraint',valid),
+ STResList536 = [STRes535|STResList535],
+
+
+ ?line {STRes536,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ040.xsd','./msxsdtest/identityConstraint',valid),
+ STResList537 = [STRes536|STResList536],
+
+
+ ?line {STRes537,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ041.xsd','./msxsdtest/identityConstraint',valid),
+ STResList538 = [STRes537|STResList537],
+
+
+ ?line {STRes538,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ042.xsd','./msxsdtest/identityConstraint',valid),
+ STResList539 = [STRes538|STResList538],
+
+
+ ?line {STRes539,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ043.xsd','./msxsdtest/identityConstraint',valid),
+ STResList540 = [STRes539|STResList539],
+
+
+ ?line {STRes540,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ044.xsd','./msxsdtest/identityConstraint',valid),
+ STResList541 = [STRes540|STResList540],
+
+
+ ?line {STRes541,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ045.xsd','./msxsdtest/identityConstraint',valid),
+ STResList542 = [STRes541|STResList541],
+
+
+ ?line {STRes542,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ046.xsd','./msxsdtest/identityConstraint',valid),
+ STResList543 = [STRes542|STResList542],
+
+
+ ?line {STRes543,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ047.xsd','./msxsdtest/identityConstraint',valid),
+ STResList544 = [STRes543|STResList543],
+
+
+ ?line {STRes544,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ048.xsd','./msxsdtest/identityConstraint',valid),
+ STResList545 = [STRes544|STResList544],
+
+
+ ?line {STRes545,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ049.xsd','./msxsdtest/identityConstraint',valid),
+ STResList546 = [STRes545|STResList545],
+
+
+ ?line {STRes546,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ050.xsd','./msxsdtest/identityConstraint',valid),
+ STResList547 = [STRes546|STResList546],
+
+
+ ?line {STRes547,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ051.xsd','./msxsdtest/identityConstraint',valid),
+ STResList548 = [STRes547|STResList547],
+
+
+ ?line {STRes548,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ052.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList549 = [STRes548|STResList548],
+
+
+ ?line {STRes549,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ053.xsd','./msxsdtest/identityConstraint',valid),
+ STResList550 = [STRes549|STResList549],
+
+
+ ?line {STRes550,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ054.xsd','./msxsdtest/identityConstraint',valid),
+ STResList551 = [STRes550|STResList550],
+
+
+ ?line {STRes551,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ055.xsd','./msxsdtest/identityConstraint',valid),
+ STResList552 = [STRes551|STResList551],
+
+
+ ?line {STRes552,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ056.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList553 = [STRes552|STResList552],
+
+
+ ?line {STRes553,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ057.xsd','./msxsdtest/identityConstraint',valid),
+ STResList554 = [STRes553|STResList553],
+
+
+ ?line {STRes554,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ058.xsd','./msxsdtest/identityConstraint',valid),
+ STResList555 = [STRes554|STResList554],
+
+
+ ?line {STRes555,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ059.xsd','./msxsdtest/identityConstraint',valid),
+ STResList556 = [STRes555|STResList555],
+
+
+ ?line {STRes556,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ060.xsd','./msxsdtest/identityConstraint',valid),
+ STResList557 = [STRes556|STResList556],
+
+
+ ?line {STRes557,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ061.xsd','./msxsdtest/identityConstraint',valid),
+ STResList558 = [STRes557|STResList557],
+
+
+ ?line {STRes558,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ062.xsd','./msxsdtest/identityConstraint',valid),
+ STResList559 = [STRes558|STResList558],
+
+
+ ?line {STRes559,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ063.xsd','./msxsdtest/identityConstraint',valid),
+ STResList560 = [STRes559|STResList559],
+
+
+ ?line {STRes560,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ064.xsd','./msxsdtest/identityConstraint',valid),
+ STResList561 = [STRes560|STResList560],
+
+
+ ?line {STRes561,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ065.xsd','./msxsdtest/identityConstraint',valid),
+ STResList562 = [STRes561|STResList561],
+
+
+ ?line {STRes562,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ066.xsd','./msxsdtest/identityConstraint',valid),
+ STResList563 = [STRes562|STResList562],
+
+
+ ?line {STRes563,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ067.xsd','./msxsdtest/identityConstraint',valid),
+ STResList564 = [STRes563|STResList563],
+
+
+ ?line {STRes564,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ068.xsd','./msxsdtest/identityConstraint',valid),
+ STResList565 = [STRes564|STResList564],
+
+
+ ?line {STRes565,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ069.xsd','./msxsdtest/identityConstraint',valid),
+ STResList566 = [STRes565|STResList565],
+
+
+ ?line {STRes566,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ070.xsd','./msxsdtest/identityConstraint',valid),
+ STResList567 = [STRes566|STResList566],
+
+
+ ?line {STRes567,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ071.xsd','./msxsdtest/identityConstraint',valid),
+ STResList568 = [STRes567|STResList567],
+
+
+ ?line {STRes568,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ072.xsd','./msxsdtest/identityConstraint',valid),
+ STResList569 = [STRes568|STResList568],
+
+
+ ?line {STRes569,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ073.xsd','./msxsdtest/identityConstraint',valid),
+ STResList570 = [STRes569|STResList569],
+
+
+ ?line {STRes570,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ074.xsd','./msxsdtest/identityConstraint',valid),
+ STResList571 = [STRes570|STResList570],
+
+
+ ?line {STRes571,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ075.xsd','./msxsdtest/identityConstraint',valid),
+ STResList572 = [STRes571|STResList571],
+
+
+ ?line {STRes572,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ076.xsd','./msxsdtest/identityConstraint',valid),
+ STResList573 = [STRes572|STResList572],
+
+
+ ?line {STRes573,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ077.xsd','./msxsdtest/identityConstraint',valid),
+ STResList574 = [STRes573|STResList573],
+
+
+ ?line {STRes574,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ078.xsd','./msxsdtest/identityConstraint',valid),
+ STResList575 = [STRes574|STResList574],
+
+
+ ?line {STRes575,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ079.xsd','./msxsdtest/identityConstraint',valid),
+ STResList576 = [STRes575|STResList575],
+
+
+ ?line {STRes576,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ080.xsd','./msxsdtest/identityConstraint',valid),
+ STResList577 = [STRes576|STResList576],
+
+
+ ?line {STRes577,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ081.xsd','./msxsdtest/identityConstraint',valid),
+ STResList578 = [STRes577|STResList577],
+
+
+ ?line {STRes578,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ082.xsd','./msxsdtest/identityConstraint',valid),
+ STResList579 = [STRes578|STResList578],
+
+
+ ?line {STRes579,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ083.xsd','./msxsdtest/identityConstraint',valid),
+ STResList580 = [STRes579|STResList579],
+
+
+ ?line {STRes580,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ084.xsd','./msxsdtest/identityConstraint',valid),
+ STResList581 = [STRes580|STResList580],
+
+
+ ?line {STRes581,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ085.xsd','./msxsdtest/identityConstraint',valid),
+ STResList582 = [STRes581|STResList581],
+
+
+ ?line {STRes582,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ086.xsd','./msxsdtest/identityConstraint',valid),
+ STResList583 = [STRes582|STResList582],
+
+
+ ?line {STRes583,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ087.xsd','./msxsdtest/identityConstraint',valid),
+ STResList584 = [STRes583|STResList583],
+
+
+ ?line {STRes584,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ088.xsd','./msxsdtest/identityConstraint',valid),
+ STResList585 = [STRes584|STResList584],
+
+
+ ?line {STRes585,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ089.xsd','./msxsdtest/identityConstraint',valid),
+ STResList586 = [STRes585|STResList585],
+
+
+ ?line {STRes586,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ090.xsd','./msxsdtest/identityConstraint',valid),
+ STResList587 = [STRes586|STResList586],
+
+
+ ?line {STRes587,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ091.xsd','./msxsdtest/identityConstraint',valid),
+ STResList588 = [STRes587|STResList587],
+
+
+ ?line {STRes588,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ092.xsd','./msxsdtest/identityConstraint',valid),
+ STResList589 = [STRes588|STResList588],
+
+
+ ?line {STRes589,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ093.xsd','./msxsdtest/identityConstraint',valid),
+ STResList590 = [STRes589|STResList589],
+
+
+ ?line {STRes590,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ094.xsd','./msxsdtest/identityConstraint',valid),
+ STResList591 = [STRes590|STResList590],
+
+
+ ?line {STRes591,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ095.xsd','./msxsdtest/identityConstraint',valid),
+ STResList592 = [STRes591|STResList591],
+
+
+ ?line {STRes592,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ096.xsd','./msxsdtest/identityConstraint',valid),
+ STResList593 = [STRes592|STResList592],
+
+
+ ?line {STRes593,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ097.xsd','./msxsdtest/identityConstraint',valid),
+ STResList594 = [STRes593|STResList593],
+
+
+ ?line {STRes594,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ098.xsd','./msxsdtest/identityConstraint',valid),
+ STResList595 = [STRes594|STResList594],
+
+
+ ?line {STRes595,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ099.xsd','./msxsdtest/identityConstraint',valid),
+ STResList596 = [STRes595|STResList595],
+
+
+ ?line {STRes596,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ100.xsd','./msxsdtest/identityConstraint',valid),
+ STResList597 = [STRes596|STResList596],
+
+
+ ?line {STRes597,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ101.xsd','./msxsdtest/identityConstraint',valid),
+ STResList598 = [STRes597|STResList597],
+
+
+ ?line {STRes598,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ102.xsd','./msxsdtest/identityConstraint',valid),
+ STResList599 = [STRes598|STResList598],
+
+
+ ?line {STRes599,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ103.xsd','./msxsdtest/identityConstraint',valid),
+ STResList600 = [STRes599|STResList599],
+
+
+ ?line {STRes600,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ104.xsd','./msxsdtest/identityConstraint',valid),
+ STResList601 = [STRes600|STResList600],
+
+
+ ?line {STRes601,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ105.xsd','./msxsdtest/identityConstraint',valid),
+ STResList602 = [STRes601|STResList601],
+
+
+ ?line {STRes602,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ106.xsd','./msxsdtest/identityConstraint',valid),
+ STResList603 = [STRes602|STResList602],
+
+
+ ?line {STRes603,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ107.xsd','./msxsdtest/identityConstraint',valid),
+ STResList604 = [STRes603|STResList603],
+
+
+ ?line {STRes604,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ108.xsd','./msxsdtest/identityConstraint',valid),
+ STResList605 = [STRes604|STResList604],
+
+
+ ?line {STRes605,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ109.xsd','./msxsdtest/identityConstraint',valid),
+ STResList606 = [STRes605|STResList605],
+
+
+ ?line {STRes606,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ110.xsd','./msxsdtest/identityConstraint',valid),
+ STResList607 = [STRes606|STResList606],
+
+
+ ?line {STRes607,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ111.xsd','./msxsdtest/identityConstraint',valid),
+ STResList608 = [STRes607|STResList607],
+
+
+ ?line {STRes608,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ112.xsd','./msxsdtest/identityConstraint',valid),
+ STResList609 = [STRes608|STResList608],
+
+
+ ?line {STRes609,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ113.xsd','./msxsdtest/identityConstraint',valid),
+ STResList610 = [STRes609|STResList609],
+
+
+ ?line {STRes610,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ114.xsd','./msxsdtest/identityConstraint',valid),
+ STResList611 = [STRes610|STResList610],
+
+
+ ?line {STRes611,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ115.xsd','./msxsdtest/identityConstraint',valid),
+ STResList612 = [STRes611|STResList611],
+
+
+ ?line {STRes612,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ116.xsd','./msxsdtest/identityConstraint',valid),
+ STResList613 = [STRes612|STResList612],
+
+
+ ?line {STRes613,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ117.xsd','./msxsdtest/identityConstraint',valid),
+ STResList614 = [STRes613|STResList613],
+
+
+ ?line {STRes614,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ118.xsd','./msxsdtest/identityConstraint',valid),
+ STResList615 = [STRes614|STResList614],
+
+
+ ?line {STRes615,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ119.xsd','./msxsdtest/identityConstraint',valid),
+ STResList616 = [STRes615|STResList615],
+
+
+ ?line {STRes616,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ120.xsd','./msxsdtest/identityConstraint',valid),
+ STResList617 = [STRes616|STResList616],
+
+
+ ?line {STRes617,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ121.xsd','./msxsdtest/identityConstraint',valid),
+ STResList618 = [STRes617|STResList617],
+
+
+ ?line {STRes618,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ122.xsd','./msxsdtest/identityConstraint',valid),
+ STResList619 = [STRes618|STResList618],
+
+
+ ?line {STRes619,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ123.xsd','./msxsdtest/identityConstraint',valid),
+ STResList620 = [STRes619|STResList619],
+
+
+ ?line {STRes620,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ124.xsd','./msxsdtest/identityConstraint',valid),
+ STResList621 = [STRes620|STResList620],
+
+
+ ?line {STRes621,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ125.xsd','./msxsdtest/identityConstraint',valid),
+ STResList622 = [STRes621|STResList621],
+
+
+ ?line {STRes622,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ126.xsd','./msxsdtest/identityConstraint',valid),
+ STResList623 = [STRes622|STResList622],
+
+
+ ?line {STRes623,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ127.xsd','./msxsdtest/identityConstraint',valid),
+ STResList624 = [STRes623|STResList623],
+
+
+ ?line {STRes624,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ128.xsd','./msxsdtest/identityConstraint',valid),
+ STResList625 = [STRes624|STResList624],
+
+
+ ?line {STRes625,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ129.xsd','./msxsdtest/identityConstraint',valid),
+ STResList626 = [STRes625|STResList625],
+
+
+ ?line {STRes626,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ130.xsd','./msxsdtest/identityConstraint',valid),
+ STResList627 = [STRes626|STResList626],
+
+
+ ?line {STRes627,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ131.xsd','./msxsdtest/identityConstraint',valid),
+ STResList628 = [STRes627|STResList627],
+
+
+ ?line {STRes628,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ132.xsd','./msxsdtest/identityConstraint',valid),
+ STResList629 = [STRes628|STResList628],
+
+
+ ?line {STRes629,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ133.xsd','./msxsdtest/identityConstraint',valid),
+ STResList630 = [STRes629|STResList629],
+
+
+ ?line {STRes630,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ134.xsd','./msxsdtest/identityConstraint',valid),
+ STResList631 = [STRes630|STResList630],
+
+
+ ?line {STRes631,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ135.xsd','./msxsdtest/identityConstraint',valid),
+ STResList632 = [STRes631|STResList631],
+
+
+ ?line {STRes632,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ136.xsd','./msxsdtest/identityConstraint',valid),
+ STResList633 = [STRes632|STResList632],
+
+
+ ?line {STRes633,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ137.xsd','./msxsdtest/identityConstraint',valid),
+ STResList634 = [STRes633|STResList633],
+
+
+ ?line {STRes634,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ138.xsd','./msxsdtest/identityConstraint',valid),
+ STResList635 = [STRes634|STResList634],
+
+
+ ?line {STRes635,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ139.xsd','./msxsdtest/identityConstraint',valid),
+ STResList636 = [STRes635|STResList635],
+
+
+ ?line {STRes636,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ140.xsd','./msxsdtest/identityConstraint',valid),
+ STResList637 = [STRes636|STResList636],
+
+
+ ?line {STRes637,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ141.xsd','./msxsdtest/identityConstraint',valid),
+ STResList638 = [STRes637|STResList637],
+
+
+ ?line {STRes638,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ142.xsd','./msxsdtest/identityConstraint',valid),
+ STResList639 = [STRes638|STResList638],
+
+
+ ?line {STRes639,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ143.xsd','./msxsdtest/identityConstraint',valid),
+ STResList640 = [STRes639|STResList639],
+
+
+ ?line {STRes640,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ144.xsd','./msxsdtest/identityConstraint',valid),
+ STResList641 = [STRes640|STResList640],
+
+
+ ?line {STRes641,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ145.xsd','./msxsdtest/identityConstraint',valid),
+ STResList642 = [STRes641|STResList641],
+
+
+ ?line {STRes642,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ146.xsd','./msxsdtest/identityConstraint',valid),
+ STResList643 = [STRes642|STResList642],
+
+
+ ?line {STRes643,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ147.xsd','./msxsdtest/identityConstraint',valid),
+ STResList644 = [STRes643|STResList643],
+
+
+ ?line {STRes644,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ148.xsd','./msxsdtest/identityConstraint',valid),
+ STResList645 = [STRes644|STResList644],
+
+
+ ?line {STRes645,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ149.xsd','./msxsdtest/identityConstraint',valid),
+ STResList646 = [STRes645|STResList645],
+
+
+ ?line {STRes646,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ150.xsd','./msxsdtest/identityConstraint',valid),
+ STResList647 = [STRes646|STResList646],
+
+
+ ?line {STRes647,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ151.xsd','./msxsdtest/identityConstraint',valid),
+ STResList648 = [STRes647|STResList647],
+
+
+ ?line {STRes648,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ152.xsd','./msxsdtest/identityConstraint',valid),
+ STResList649 = [STRes648|STResList648],
+
+
+ ?line {STRes649,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ153.xsd','./msxsdtest/identityConstraint',valid),
+ STResList650 = [STRes649|STResList649],
+
+
+ ?line {STRes650,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ154.xsd','./msxsdtest/identityConstraint',valid),
+ STResList651 = [STRes650|STResList650],
+
+
+ ?line {STRes651,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ155.xsd','./msxsdtest/identityConstraint',valid),
+ STResList652 = [STRes651|STResList651],
+
+
+ ?line {STRes652,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ156.xsd','./msxsdtest/identityConstraint',valid),
+ STResList653 = [STRes652|STResList652],
+
+
+ ?line {STRes653,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ157.xsd','./msxsdtest/identityConstraint',valid),
+ STResList654 = [STRes653|STResList653],
+
+
+ ?line {STRes654,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ158.xsd','./msxsdtest/identityConstraint',valid),
+ STResList655 = [STRes654|STResList654],
+
+
+ ?line {STRes655,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ159.xsd','./msxsdtest/identityConstraint',valid),
+ STResList656 = [STRes655|STResList655],
+
+
+ ?line {STRes656,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ160.xsd','./msxsdtest/identityConstraint',valid),
+ STResList657 = [STRes656|STResList656],
+
+
+ ?line {STRes657,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ161.xsd','./msxsdtest/identityConstraint',valid),
+ STResList658 = [STRes657|STResList657],
+
+
+ ?line {STRes658,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ162.xsd','./msxsdtest/identityConstraint',valid),
+ STResList659 = [STRes658|STResList658],
+
+
+ ?line {STRes659,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ163.xsd','./msxsdtest/identityConstraint',valid),
+ STResList660 = [STRes659|STResList659],
+
+
+ ?line {STRes660,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ164.xsd','./msxsdtest/identityConstraint',valid),
+ STResList661 = [STRes660|STResList660],
+
+
+ ?line {STRes661,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ165.xsd','./msxsdtest/identityConstraint',valid),
+ STResList662 = [STRes661|STResList661],
+
+
+ ?line {STRes662,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ166.xsd','./msxsdtest/identityConstraint',valid),
+ STResList663 = [STRes662|STResList662],
+
+
+ ?line {STRes663,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ167.xsd','./msxsdtest/identityConstraint',valid),
+ STResList664 = [STRes663|STResList663],
+
+
+ ?line {STRes664,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ168.xsd','./msxsdtest/identityConstraint',valid),
+ STResList665 = [STRes664|STResList664],
+
+
+ ?line {STRes665,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ169.xsd','./msxsdtest/identityConstraint',valid),
+ STResList666 = [STRes665|STResList665],
+
+
+ ?line {STRes666,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ170.xsd','./msxsdtest/identityConstraint',valid),
+ STResList667 = [STRes666|STResList666],
+
+
+ ?line {STRes667,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ171.xsd','./msxsdtest/identityConstraint',valid),
+ STResList668 = [STRes667|STResList667],
+
+
+ ?line {STRes668,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ172.xsd','./msxsdtest/identityConstraint',valid),
+ STResList669 = [STRes668|STResList668],
+
+
+ ?line {STRes669,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ173.xsd','./msxsdtest/identityConstraint',valid),
+ STResList670 = [STRes669|STResList669],
+
+
+ ?line {STRes670,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ174.xsd','./msxsdtest/identityConstraint',valid),
+ STResList671 = [STRes670|STResList670],
+
+
+ ?line {STRes671,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ175.xsd','./msxsdtest/identityConstraint',valid),
+ STResList672 = [STRes671|STResList671],
+
+
+ ?line {STRes672,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ176.xsd','./msxsdtest/identityConstraint',valid),
+ STResList673 = [STRes672|STResList672],
+
+
+ ?line {STRes673,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ177.xsd','./msxsdtest/identityConstraint',valid),
+ STResList674 = [STRes673|STResList673],
+
+
+ ?line {STRes674,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ178.xsd','./msxsdtest/identityConstraint',valid),
+ STResList675 = [STRes674|STResList674],
+
+
+ ?line {STRes675,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ179.xsd','./msxsdtest/identityConstraint',valid),
+ STResList676 = [STRes675|STResList675],
+
+
+ ?line {STRes676,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ180.xsd','./msxsdtest/identityConstraint',valid),
+ STResList677 = [STRes676|STResList676],
+
+
+ ?line {STRes677,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ181.xsd','./msxsdtest/identityConstraint',valid),
+ STResList678 = [STRes677|STResList677],
+
+
+ ?line {STRes678,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ182.xsd','./msxsdtest/identityConstraint',valid),
+ STResList679 = [STRes678|STResList678],
+
+
+ ?line {STRes679,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ183.xsd','./msxsdtest/identityConstraint',valid),
+ STResList680 = [STRes679|STResList679],
+
+
+ ?line {STRes680,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ184.xsd','./msxsdtest/identityConstraint',valid),
+ STResList681 = [STRes680|STResList680],
+
+
+ ?line {STRes681,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ185.xsd','./msxsdtest/identityConstraint',valid),
+ STResList682 = [STRes681|STResList681],
+
+
+ ?line {STRes682,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ186.xsd','./msxsdtest/identityConstraint',valid),
+ STResList683 = [STRes682|STResList682],
+
+
+ ?line {STRes683,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ187.xsd','./msxsdtest/identityConstraint',valid),
+ STResList684 = [STRes683|STResList683],
+
+
+ ?line {STRes684,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ188.xsd','./msxsdtest/identityConstraint',valid),
+ STResList685 = [STRes684|STResList684],
+
+
+ ?line {STRes685,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ189.xsd','./msxsdtest/identityConstraint',valid),
+ STResList686 = [STRes685|STResList685],
+
+
+ ?line {STRes686,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ190.xsd','./msxsdtest/identityConstraint',valid),
+ STResList687 = [STRes686|STResList686],
+
+
+ ?line {STRes687,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ191.xsd','./msxsdtest/identityConstraint',valid),
+ STResList688 = [STRes687|STResList687],
+
+
+ ?line {STRes688,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ192.xsd','./msxsdtest/identityConstraint',valid),
+ STResList689 = [STRes688|STResList688],
+
+
+ ?line {STRes689,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ193.xsd','./msxsdtest/identityConstraint',valid),
+ STResList690 = [STRes689|STResList689],
+
+
+ ?line {STRes690,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ194.xsd','./msxsdtest/identityConstraint',valid),
+ STResList691 = [STRes690|STResList690],
+
+
+ ?line {STRes691,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ195.xsd','./msxsdtest/identityConstraint',valid),
+ STResList692 = [STRes691|STResList691],
+
+
+ ?line {STRes692,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ196.xsd','./msxsdtest/identityConstraint',valid),
+ STResList693 = [STRes692|STResList692],
+
+
+ ?line {STRes693,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ197.xsd','./msxsdtest/identityConstraint',valid),
+ STResList694 = [STRes693|STResList693],
+
+
+ ?line {STRes694,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ198.xsd','./msxsdtest/identityConstraint',valid),
+ STResList695 = [STRes694|STResList694],
+
+
+ ?line {STRes695,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ199.xsd','./msxsdtest/identityConstraint',valid),
+ STResList696 = [STRes695|STResList695],
+
+
+ ?line {STRes696,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ200.xsd','./msxsdtest/identityConstraint',valid),
+ STResList697 = [STRes696|STResList696],
+
+
+ ?line {STRes697,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ201.xsd','./msxsdtest/identityConstraint',valid),
+ STResList698 = [STRes697|STResList697],
+
+
+ ?line {STRes698,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ202.xsd','./msxsdtest/identityConstraint',valid),
+ STResList699 = [STRes698|STResList698],
+
+
+ ?line {STRes699,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ203.xsd','./msxsdtest/identityConstraint',valid),
+ STResList700 = [STRes699|STResList699],
+
+
+ ?line {STRes700,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ204.xsd','./msxsdtest/identityConstraint',valid),
+ STResList701 = [STRes700|STResList700],
+
+
+ ?line {STRes701,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ205.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList702 = [STRes701|STResList701],
+
+
+ ?line {STRes702,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ206.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList703 = [STRes702|STResList702],
+
+
+ ?line {STRes703,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ207.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList704 = [STRes703|STResList703],
+
+
+ ?line {STRes704,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ208.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList705 = [STRes704|STResList704],
+
+
+ ?line {STRes705,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ209.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList706 = [STRes705|STResList705],
+
+
+ ?line {STRes706,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idJ210.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList707 = [STRes706|STResList706],
+
+
+ ?line {STRes707,S707} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idK001.xsd','./msxsdtest/identityConstraint',valid),
+ STResList708 = [STRes707|STResList707],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idK001.xml','./msxsdtest/identityConstraint',valid,S707),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes708,S708} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idK002.xsd','./msxsdtest/identityConstraint',valid),
+ STResList709 = [STRes708|STResList708],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idK002.xml','./msxsdtest/identityConstraint',valid,S708),
+ ITResList95 = [ITRes94|ITResList94],
+
+
+ ?line {STRes709,S709} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idK003.xsd','./msxsdtest/identityConstraint',valid),
+ STResList710 = [STRes709|STResList709],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idK003.xml','./msxsdtest/identityConstraint',invalid,S709),
+ ITResList96 = [ITRes95|ITResList95],
+
+
+ ?line {STRes710,S710} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idK004.xsd','./msxsdtest/identityConstraint',valid),
+ STResList711 = [STRes710|STResList710],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idK004.xml','./msxsdtest/identityConstraint',valid,S710),
+ ITResList97 = [ITRes96|ITResList96],
+
+
+ ?line {STRes711,S711} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idK005.xsd','./msxsdtest/identityConstraint',valid),
+ STResList712 = [STRes711|STResList711],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idK005.xml','./msxsdtest/identityConstraint',valid,S711),
+ ITResList98 = [ITRes97|ITResList97],
+
+
+ ?line {STRes712,S712} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idK006.xsd','./msxsdtest/identityConstraint',valid),
+ STResList713 = [STRes712|STResList712],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idK006.xml','./msxsdtest/identityConstraint',valid,S712),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes713,S713} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idK007.xsd','./msxsdtest/identityConstraint',valid),
+ STResList714 = [STRes713|STResList713],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idK007.xml','./msxsdtest/identityConstraint',valid,S713),
+ ITResList100 = [ITRes99|ITResList99],
+
+
+ ?line {STRes714,S714} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idK008.xsd','./msxsdtest/identityConstraint',valid),
+ STResList715 = [STRes714|STResList714],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idK008.xml','./msxsdtest/identityConstraint',valid,S714),
+ ITResList101 = [ITRes100|ITResList100],
+
+
+ ?line {STRes715,S715} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idK009.xsd','./msxsdtest/identityConstraint',valid),
+ STResList716 = [STRes715|STResList715],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idK009.xml','./msxsdtest/identityConstraint',valid,S715),
+ ITResList102 = [ITRes101|ITResList101],
+
+
+ ?line {STRes716,S716} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idK010.xsd','./msxsdtest/identityConstraint',valid),
+ STResList717 = [STRes716|STResList716],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idK010.xml','./msxsdtest/identityConstraint',valid,S716),
+ ITResList103 = [ITRes102|ITResList102],
+
+
+ ?line {STRes717,S717} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idK011.xsd','./msxsdtest/identityConstraint',valid),
+ STResList718 = [STRes717|STResList717],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idK011.xml','./msxsdtest/identityConstraint',valid,S717),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes718,S718} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idK012.xsd','./msxsdtest/identityConstraint',valid),
+ STResList719 = [STRes718|STResList718],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idK012.xml','./msxsdtest/identityConstraint',invalid,S718),
+ ITResList105 = [ITRes104|ITResList104],
+
+
+ ?line {STRes719,S719} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idK013.xsd','./msxsdtest/identityConstraint',valid),
+ STResList720 = [STRes719|STResList719],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idK013.xml','./msxsdtest/identityConstraint',valid,S719),
+ ITResList106 = [ITRes105|ITResList105],
+
+
+ ?line {STRes720,S720} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idK014.xsd','./msxsdtest/identityConstraint',valid),
+ STResList721 = [STRes720|STResList720],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idK014.xml','./msxsdtest/identityConstraint',valid,S720),
+ ITResList107 = [ITRes106|ITResList106],
+
+
+ ?line {STRes721,S721} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idK015.xsd','./msxsdtest/identityConstraint',valid),
+ STResList722 = [STRes721|STResList721],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idK015.xml','./msxsdtest/identityConstraint',valid,S721),
+ ITResList108 = [ITRes107|ITResList107],
+
+
+ ?line {STRes722,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idK016.xsd','./msxsdtest/identityConstraint',invalid),
+ STResList723 = [STRes722|STResList722],
+
+
+ ?line {STRes723,S723} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idK017.xsd','./msxsdtest/identityConstraint',valid),
+ STResList724 = [STRes723|STResList723],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idK017.xml','./msxsdtest/identityConstraint',valid,S723),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes724,S724} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL001.xsd','./msxsdtest/identityConstraint',valid),
+ STResList725 = [STRes724|STResList724],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL001.xml','./msxsdtest/identityConstraint',valid,S724),
+ ITResList110 = [ITRes109|ITResList109],
+
+
+ ?line {STRes725,S725} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL002.xsd','./msxsdtest/identityConstraint',valid),
+ STResList726 = [STRes725|STResList725],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL002.xml','./msxsdtest/identityConstraint',invalid,S725),
+ ITResList111 = [ITRes110|ITResList110],
+
+
+ ?line {STRes726,S726} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL003.xsd','./msxsdtest/identityConstraint',valid),
+ STResList727 = [STRes726|STResList726],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL003.xml','./msxsdtest/identityConstraint',valid,S726),
+ ITResList112 = [ITRes111|ITResList111],
+
+
+ ?line {STRes727,S727} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL004.xsd','./msxsdtest/identityConstraint',valid),
+ STResList728 = [STRes727|STResList727],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL004.xml','./msxsdtest/identityConstraint',valid,S727),
+ ITResList113 = [ITRes112|ITResList112],
+
+
+ ?line {STRes728,S728} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL005.xsd','./msxsdtest/identityConstraint',valid),
+ STResList729 = [STRes728|STResList728],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL005.xml','./msxsdtest/identityConstraint',valid,S728),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes729,S729} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL006.xsd','./msxsdtest/identityConstraint',valid),
+ STResList730 = [STRes729|STResList729],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL006.xml','./msxsdtest/identityConstraint',invalid,S729),
+ ITResList115 = [ITRes114|ITResList114],
+
+
+ ?line {STRes730,S730} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL007.xsd','./msxsdtest/identityConstraint',valid),
+ STResList731 = [STRes730|STResList730],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL007.xml','./msxsdtest/identityConstraint',invalid,S730),
+ ITResList116 = [ITRes115|ITResList115],
+
+
+ ?line {STRes731,S731} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL008.xsd','./msxsdtest/identityConstraint',valid),
+ STResList732 = [STRes731|STResList731],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL008.xml','./msxsdtest/identityConstraint',valid,S731),
+ ITResList117 = [ITRes116|ITResList116],
+
+
+ ?line {STRes732,S732} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL009.xsd','./msxsdtest/identityConstraint',valid),
+ STResList733 = [STRes732|STResList732],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL009.xml','./msxsdtest/identityConstraint',valid,S732),
+ ITResList118 = [ITRes117|ITResList117],
+
+
+ ?line {STRes733,S733} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL010.xsd','./msxsdtest/identityConstraint',valid),
+ STResList734 = [STRes733|STResList733],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL010.xml','./msxsdtest/identityConstraint',valid,S733),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes734,S734} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL011.xsd','./msxsdtest/identityConstraint',valid),
+ STResList735 = [STRes734|STResList734],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL011.xml','./msxsdtest/identityConstraint',invalid,S734),
+ ITResList120 = [ITRes119|ITResList119],
+
+
+ ?line {STRes735,S735} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL012.xsd','./msxsdtest/identityConstraint',valid),
+ STResList736 = [STRes735|STResList735],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL012.xml','./msxsdtest/identityConstraint',invalid,S735),
+ ITResList121 = [ITRes120|ITResList120],
+
+
+ ?line {STRes736,S736} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL013.xsd','./msxsdtest/identityConstraint',valid),
+ STResList737 = [STRes736|STResList736],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL013.xml','./msxsdtest/identityConstraint',valid,S736),
+ ITResList122 = [ITRes121|ITResList121],
+
+
+ ?line {STRes737,S737} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL014.xsd','./msxsdtest/identityConstraint',valid),
+ STResList738 = [STRes737|STResList737],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL014.xml','./msxsdtest/identityConstraint',valid,S737),
+ ITResList123 = [ITRes122|ITResList122],
+
+
+ ?line {STRes738,S738} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL015.xsd','./msxsdtest/identityConstraint',valid),
+ STResList739 = [STRes738|STResList738],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL015.xml','./msxsdtest/identityConstraint',invalid,S738),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes739,S739} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL016.xsd','./msxsdtest/identityConstraint',valid),
+ STResList740 = [STRes739|STResList739],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL016.xml','./msxsdtest/identityConstraint',valid,S739),
+ ITResList125 = [ITRes124|ITResList124],
+
+
+ ?line {STRes740,S740} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL017.xsd','./msxsdtest/identityConstraint',valid),
+ STResList741 = [STRes740|STResList740],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL017.xml','./msxsdtest/identityConstraint',valid,S740),
+ ITResList126 = [ITRes125|ITResList125],
+
+
+ ?line {STRes741,S741} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL018.xsd','./msxsdtest/identityConstraint',valid),
+ STResList742 = [STRes741|STResList741],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL018.xml','./msxsdtest/identityConstraint',valid,S741),
+ ITResList127 = [ITRes126|ITResList126],
+
+
+ ?line {STRes742,S742} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL019.xsd','./msxsdtest/identityConstraint',valid),
+ STResList743 = [STRes742|STResList742],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL019.xml','./msxsdtest/identityConstraint',invalid,S742),
+ ITResList128 = [ITRes127|ITResList127],
+
+
+ ?line {STRes743,S743} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL020.xsd','./msxsdtest/identityConstraint',valid),
+ STResList744 = [STRes743|STResList743],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL020.xml','./msxsdtest/identityConstraint',valid,S743),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes744,S744} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL021.xsd','./msxsdtest/identityConstraint',valid),
+ STResList745 = [STRes744|STResList744],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL021.xml','./msxsdtest/identityConstraint',valid,S744),
+ ITResList130 = [ITRes129|ITResList129],
+
+
+ ?line {STRes745,S745} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL022.xsd','./msxsdtest/identityConstraint',valid),
+ STResList746 = [STRes745|STResList745],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL022.xml','./msxsdtest/identityConstraint',invalid,S745),
+ ITResList131 = [ITRes130|ITResList130],
+
+
+ ?line {STRes746,S746} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL023.xsd','./msxsdtest/identityConstraint',valid),
+ STResList747 = [STRes746|STResList746],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL023.xml','./msxsdtest/identityConstraint',valid,S746),
+ ITResList132 = [ITRes131|ITResList131],
+
+
+ ?line {STRes747,S747} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL024.xsd','./msxsdtest/identityConstraint',valid),
+ STResList748 = [STRes747|STResList747],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL024.xml','./msxsdtest/identityConstraint',valid,S747),
+ ITResList133 = [ITRes132|ITResList132],
+
+
+ ?line {STRes748,S748} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL025.xsd','./msxsdtest/identityConstraint',valid),
+ STResList749 = [STRes748|STResList748],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL025.xml','./msxsdtest/identityConstraint',invalid,S748),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes749,S749} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL026.xsd','./msxsdtest/identityConstraint',valid),
+ STResList750 = [STRes749|STResList749],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL026.xml','./msxsdtest/identityConstraint',valid,S749),
+ ITResList135 = [ITRes134|ITResList134],
+
+
+ ?line {STRes750,S750} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL027.xsd','./msxsdtest/identityConstraint',valid),
+ STResList751 = [STRes750|STResList750],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL027.xml','./msxsdtest/identityConstraint',invalid,S750),
+ ITResList136 = [ITRes135|ITResList135],
+
+
+ ?line {STRes751,S751} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL028.xsd','./msxsdtest/identityConstraint',valid),
+ STResList752 = [STRes751|STResList751],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL028.xml','./msxsdtest/identityConstraint',valid,S751),
+ ITResList137 = [ITRes136|ITResList136],
+
+
+ ?line {STRes752,S752} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL029.xsd','./msxsdtest/identityConstraint',valid),
+ STResList753 = [STRes752|STResList752],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL029.xml','./msxsdtest/identityConstraint',valid,S752),
+ ITResList138 = [ITRes137|ITResList137],
+
+
+ ?line {STRes753,S753} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL030.xsd','./msxsdtest/identityConstraint',valid),
+ STResList754 = [STRes753|STResList753],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL030.xml','./msxsdtest/identityConstraint',valid,S753),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ ?line {STRes754,S754} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL031.xsd','./msxsdtest/identityConstraint',valid),
+ STResList755 = [STRes754|STResList754],
+ ?line ITRes139 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL031.xml','./msxsdtest/identityConstraint',invalid,S754),
+ ITResList140 = [ITRes139|ITResList139],
+
+
+ ?line {STRes755,S755} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL032.xsd','./msxsdtest/identityConstraint',valid),
+ STResList756 = [STRes755|STResList755],
+ ?line ITRes140 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL032.xml','./msxsdtest/identityConstraint',invalid,S755),
+ ITResList141 = [ITRes140|ITResList140],
+
+
+ ?line {STRes756,S756} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL033.xsd','./msxsdtest/identityConstraint',valid),
+ STResList757 = [STRes756|STResList756],
+ ?line ITRes141 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL033.xml','./msxsdtest/identityConstraint',valid,S756),
+ ITResList142 = [ITRes141|ITResList141],
+
+
+ ?line {STRes757,S757} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL034.xsd','./msxsdtest/identityConstraint',valid),
+ STResList758 = [STRes757|STResList757],
+ ?line ITRes142 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL034.xml','./msxsdtest/identityConstraint',valid,S757),
+ ITResList143 = [ITRes142|ITResList142],
+
+
+ ?line {STRes758,S758} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL035.xsd','./msxsdtest/identityConstraint',valid),
+ STResList759 = [STRes758|STResList758],
+ ?line ITRes143 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL035.xml','./msxsdtest/identityConstraint',valid,S758),
+ ITResList144 = [ITRes143|ITResList143],
+
+
+ ?line {STRes759,S759} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL036.xsd','./msxsdtest/identityConstraint',valid),
+ STResList760 = [STRes759|STResList759],
+ ?line ITRes144 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL036.xml','./msxsdtest/identityConstraint',invalid,S759),
+ ITResList145 = [ITRes144|ITResList144],
+
+
+ ?line {STRes760,S760} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL037.xsd','./msxsdtest/identityConstraint',valid),
+ STResList761 = [STRes760|STResList760],
+ ?line ITRes145 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL037.xml','./msxsdtest/identityConstraint',invalid,S760),
+ ITResList146 = [ITRes145|ITResList145],
+
+
+ ?line {STRes761,S761} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL038.xsd','./msxsdtest/identityConstraint',valid),
+ STResList762 = [STRes761|STResList761],
+ ?line ITRes146 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL038.xml','./msxsdtest/identityConstraint',valid,S761),
+ ITResList147 = [ITRes146|ITResList146],
+
+
+ ?line {STRes762,S762} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL039.xsd','./msxsdtest/identityConstraint',valid),
+ STResList763 = [STRes762|STResList762],
+ ?line ITRes147 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL039.xml','./msxsdtest/identityConstraint',valid,S762),
+ ITResList148 = [ITRes147|ITResList147],
+
+
+ ?line {STRes763,S763} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL040.xsd','./msxsdtest/identityConstraint',valid),
+ STResList764 = [STRes763|STResList763],
+ ?line ITRes148 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL040.xml','./msxsdtest/identityConstraint',invalid,S763),
+ ITResList149 = [ITRes148|ITResList148],
+
+
+ ?line {STRes764,S764} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL041.xsd','./msxsdtest/identityConstraint',valid),
+ STResList765 = [STRes764|STResList764],
+ ?line ITRes149 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL041.xml','./msxsdtest/identityConstraint',valid,S764),
+ ITResList150 = [ITRes149|ITResList149],
+
+
+ ?line {STRes765,S765} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL042.xsd','./msxsdtest/identityConstraint',valid),
+ STResList766 = [STRes765|STResList765],
+ ?line ITRes150 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL042.xml','./msxsdtest/identityConstraint',valid,S765),
+ ITResList151 = [ITRes150|ITResList150],
+
+
+ ?line {STRes766,S766} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL043.xsd','./msxsdtest/identityConstraint',valid),
+ STResList767 = [STRes766|STResList766],
+ ?line ITRes151 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL043.xml','./msxsdtest/identityConstraint',valid,S766),
+ ITResList152 = [ITRes151|ITResList151],
+
+
+ ?line {STRes767,S767} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL044.xsd','./msxsdtest/identityConstraint',valid),
+ STResList768 = [STRes767|STResList767],
+ ?line ITRes152 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL044.xml','./msxsdtest/identityConstraint',invalid,S767),
+ ITResList153 = [ITRes152|ITResList152],
+
+
+ ?line {STRes768,S768} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL045.xsd','./msxsdtest/identityConstraint',valid),
+ STResList769 = [STRes768|STResList768],
+ ?line ITRes153 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL045.xml','./msxsdtest/identityConstraint',valid,S768),
+ ITResList154 = [ITRes153|ITResList153],
+
+
+ ?line {STRes769,S769} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL046.xsd','./msxsdtest/identityConstraint',valid),
+ STResList770 = [STRes769|STResList769],
+ ?line ITRes154 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL046.xml','./msxsdtest/identityConstraint',valid,S769),
+ ITResList155 = [ITRes154|ITResList154],
+
+
+ ?line {STRes770,S770} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL047.xsd','./msxsdtest/identityConstraint',valid),
+ STResList771 = [STRes770|STResList770],
+ ?line ITRes155 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL047.xml','./msxsdtest/identityConstraint',invalid,S770),
+ ITResList156 = [ITRes155|ITResList155],
+
+
+ ?line {STRes771,S771} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL048.xsd','./msxsdtest/identityConstraint',valid),
+ STResList772 = [STRes771|STResList771],
+ ?line ITRes156 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL048.xml','./msxsdtest/identityConstraint',valid,S771),
+ ITResList157 = [ITRes156|ITResList156],
+
+
+ ?line {STRes772,S772} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL049.xsd','./msxsdtest/identityConstraint',valid),
+ STResList773 = [STRes772|STResList772],
+ ?line ITRes157 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL049.xml','./msxsdtest/identityConstraint',valid,S772),
+ ITResList158 = [ITRes157|ITResList157],
+
+
+ ?line {STRes773,S773} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL050.xsd','./msxsdtest/identityConstraint',valid),
+ STResList774 = [STRes773|STResList773],
+ ?line ITRes158 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL050.xml','./msxsdtest/identityConstraint',invalid,S773),
+ ITResList159 = [ITRes158|ITResList158],
+
+
+ ?line {STRes774,S774} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL051.xsd','./msxsdtest/identityConstraint',valid),
+ STResList775 = [STRes774|STResList774],
+ ?line ITRes159 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL051.xml','./msxsdtest/identityConstraint',valid,S774),
+ ITResList160 = [ITRes159|ITResList159],
+
+
+ ?line {STRes775,S775} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL052.xsd','./msxsdtest/identityConstraint',valid),
+ STResList776 = [STRes775|STResList775],
+ ?line ITRes160 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL052.xml','./msxsdtest/identityConstraint',invalid,S775),
+ ITResList161 = [ITRes160|ITResList160],
+
+
+ ?line {STRes776,S776} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL053.xsd','./msxsdtest/identityConstraint',valid),
+ STResList777 = [STRes776|STResList776],
+ ?line ITRes161 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL053.xml','./msxsdtest/identityConstraint',valid,S776),
+ ITResList162 = [ITRes161|ITResList161],
+
+
+ ?line {STRes777,S777} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL054.xsd','./msxsdtest/identityConstraint',valid),
+ STResList778 = [STRes777|STResList777],
+ ?line ITRes162 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL054.xml','./msxsdtest/identityConstraint',valid,S777),
+ ITResList163 = [ITRes162|ITResList162],
+
+
+ ?line {STRes778,S778} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL055.xsd','./msxsdtest/identityConstraint',valid),
+ STResList779 = [STRes778|STResList778],
+ ?line ITRes163 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL055.xml','./msxsdtest/identityConstraint',valid,S778),
+ ITResList164 = [ITRes163|ITResList163],
+
+
+ ?line {STRes779,S779} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL056.xsd','./msxsdtest/identityConstraint',valid),
+ STResList780 = [STRes779|STResList779],
+ ?line ITRes164 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL056.xml','./msxsdtest/identityConstraint',invalid,S779),
+ ITResList165 = [ITRes164|ITResList164],
+
+
+ ?line {STRes780,S780} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL057.xsd','./msxsdtest/identityConstraint',valid),
+ STResList781 = [STRes780|STResList780],
+ ?line ITRes165 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL057.xml','./msxsdtest/identityConstraint',invalid,S780),
+ ITResList166 = [ITRes165|ITResList165],
+
+
+ ?line {STRes781,S781} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL058.xsd','./msxsdtest/identityConstraint',valid),
+ STResList782 = [STRes781|STResList781],
+ ?line ITRes166 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL058.xml','./msxsdtest/identityConstraint',valid,S781),
+ ITResList167 = [ITRes166|ITResList166],
+
+
+ ?line {STRes782,S782} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL059.xsd','./msxsdtest/identityConstraint',valid),
+ STResList783 = [STRes782|STResList782],
+ ?line ITRes167 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL059.xml','./msxsdtest/identityConstraint',valid,S782),
+ ITResList168 = [ITRes167|ITResList167],
+
+
+ ?line {STRes783,S783} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL060.xsd','./msxsdtest/identityConstraint',valid),
+ STResList784 = [STRes783|STResList783],
+ ?line ITRes168 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL060.xml','./msxsdtest/identityConstraint',valid,S783),
+ ITResList169 = [ITRes168|ITResList168],
+
+
+ ?line {STRes784,S784} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL061.xsd','./msxsdtest/identityConstraint',valid),
+ STResList785 = [STRes784|STResList784],
+ ?line ITRes169 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL061.xml','./msxsdtest/identityConstraint',invalid,S784),
+ ITResList170 = [ITRes169|ITResList169],
+
+
+ ?line {STRes785,S785} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL062.xsd','./msxsdtest/identityConstraint',valid),
+ STResList786 = [STRes785|STResList785],
+ ?line ITRes170 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL062.xml','./msxsdtest/identityConstraint',invalid,S785),
+ ITResList171 = [ITRes170|ITResList170],
+
+
+ ?line {STRes786,S786} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL063.xsd','./msxsdtest/identityConstraint',valid),
+ STResList787 = [STRes786|STResList786],
+ ?line ITRes171 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL063.xml','./msxsdtest/identityConstraint',valid,S786),
+ ITResList172 = [ITRes171|ITResList171],
+
+
+ ?line {STRes787,S787} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL064.xsd','./msxsdtest/identityConstraint',valid),
+ STResList788 = [STRes787|STResList787],
+ ?line ITRes172 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL064.xml','./msxsdtest/identityConstraint',valid,S787),
+ ITResList173 = [ITRes172|ITResList172],
+
+
+ ?line {STRes788,S788} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL065.xsd','./msxsdtest/identityConstraint',valid),
+ STResList789 = [STRes788|STResList788],
+ ?line ITRes173 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL065.xml','./msxsdtest/identityConstraint',invalid,S788),
+ ITResList174 = [ITRes173|ITResList173],
+
+
+ ?line {STRes789,S789} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL066.xsd','./msxsdtest/identityConstraint',valid),
+ STResList790 = [STRes789|STResList789],
+ ?line ITRes174 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL066.xml','./msxsdtest/identityConstraint',valid,S789),
+ ITResList175 = [ITRes174|ITResList174],
+
+
+ ?line {STRes790,S790} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL067.xsd','./msxsdtest/identityConstraint',valid),
+ STResList791 = [STRes790|STResList790],
+ ?line ITRes175 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL067.xml','./msxsdtest/identityConstraint',valid,S790),
+ ITResList176 = [ITRes175|ITResList175],
+
+
+ ?line {STRes791,S791} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL068.xsd','./msxsdtest/identityConstraint',valid),
+ STResList792 = [STRes791|STResList791],
+ ?line ITRes176 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL068.xml','./msxsdtest/identityConstraint',valid,S791),
+ ITResList177 = [ITRes176|ITResList176],
+
+
+ ?line {STRes792,S792} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL069.xsd','./msxsdtest/identityConstraint',valid),
+ STResList793 = [STRes792|STResList792],
+ ?line ITRes177 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL069.xml','./msxsdtest/identityConstraint',invalid,S792),
+ ITResList178 = [ITRes177|ITResList177],
+
+
+ ?line {STRes793,S793} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL070.xsd','./msxsdtest/identityConstraint',valid),
+ STResList794 = [STRes793|STResList793],
+ ?line ITRes178 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL070.xml','./msxsdtest/identityConstraint',valid,S793),
+ ITResList179 = [ITRes178|ITResList178],
+
+
+ ?line {STRes794,S794} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL071.xsd','./msxsdtest/identityConstraint',valid),
+ STResList795 = [STRes794|STResList794],
+ ?line ITRes179 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL071.xml','./msxsdtest/identityConstraint',valid,S794),
+ ITResList180 = [ITRes179|ITResList179],
+
+
+ ?line {STRes795,S795} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL072.xsd','./msxsdtest/identityConstraint',valid),
+ STResList796 = [STRes795|STResList795],
+ ?line ITRes180 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL072.xml','./msxsdtest/identityConstraint',invalid,S795),
+ ITResList181 = [ITRes180|ITResList180],
+
+
+ ?line {STRes796,S796} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL073.xsd','./msxsdtest/identityConstraint',valid),
+ STResList797 = [STRes796|STResList796],
+ ?line ITRes181 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL073.xml','./msxsdtest/identityConstraint',valid,S796),
+ ITResList182 = [ITRes181|ITResList181],
+
+
+ ?line {STRes797,S797} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL074.xsd','./msxsdtest/identityConstraint',valid),
+ STResList798 = [STRes797|STResList797],
+ ?line ITRes182 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL074.xml','./msxsdtest/identityConstraint',valid,S797),
+ ITResList183 = [ITRes182|ITResList182],
+
+
+ ?line {STRes798,S798} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL075.xsd','./msxsdtest/identityConstraint',valid),
+ STResList799 = [STRes798|STResList798],
+ ?line ITRes183 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL075.xml','./msxsdtest/identityConstraint',invalid,S798),
+ ITResList184 = [ITRes183|ITResList183],
+
+
+ ?line {STRes799,S799} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL076.xsd','./msxsdtest/identityConstraint',valid),
+ STResList800 = [STRes799|STResList799],
+ ?line ITRes184 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL076.xml','./msxsdtest/identityConstraint',valid,S799),
+ ITResList185 = [ITRes184|ITResList184],
+
+
+ ?line {STRes800,S800} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL077.xsd','./msxsdtest/identityConstraint',valid),
+ STResList801 = [STRes800|STResList800],
+ ?line ITRes185 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL077.xml','./msxsdtest/identityConstraint',valid,S800),
+ ITResList186 = [ITRes185|ITResList185],
+
+
+ ?line {STRes801,S801} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL078.xsd','./msxsdtest/identityConstraint',valid),
+ STResList802 = [STRes801|STResList801],
+ ?line ITRes186 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL078.xml','./msxsdtest/identityConstraint',valid,S801),
+ ITResList187 = [ITRes186|ITResList186],
+
+
+ ?line {STRes802,S802} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL079.xsd','./msxsdtest/identityConstraint',valid),
+ STResList803 = [STRes802|STResList802],
+ ?line ITRes187 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL079.xml','./msxsdtest/identityConstraint',invalid,S802),
+ ITResList188 = [ITRes187|ITResList187],
+
+
+ ?line {STRes803,S803} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL080.xsd','./msxsdtest/identityConstraint',valid),
+ STResList804 = [STRes803|STResList803],
+ ?line ITRes188 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL080.xml','./msxsdtest/identityConstraint',invalid,S803),
+ ITResList189 = [ITRes188|ITResList188],
+
+
+ ?line {STRes804,S804} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL081.xsd','./msxsdtest/identityConstraint',valid),
+ STResList805 = [STRes804|STResList804],
+ ?line ITRes189 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL081.xml','./msxsdtest/identityConstraint',invalid,S804),
+ ITResList190 = [ITRes189|ITResList189],
+
+
+ ?line {STRes805,S805} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL082.xsd','./msxsdtest/identityConstraint',valid),
+ STResList806 = [STRes805|STResList805],
+ ?line ITRes190 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL082.xml','./msxsdtest/identityConstraint',valid,S805),
+ ITResList191 = [ITRes190|ITResList190],
+
+
+ ?line {STRes806,S806} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL083.xsd','./msxsdtest/identityConstraint',valid),
+ STResList807 = [STRes806|STResList806],
+ ?line ITRes191 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL083.xml','./msxsdtest/identityConstraint',invalid,S806),
+ ITResList192 = [ITRes191|ITResList191],
+
+
+ ?line {STRes807,S807} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL084.xsd','./msxsdtest/identityConstraint',valid),
+ STResList808 = [STRes807|STResList807],
+ ?line ITRes192 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL084.xml','./msxsdtest/identityConstraint',valid,S807),
+ ITResList193 = [ITRes192|ITResList192],
+
+
+ ?line {STRes808,S808} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL085.xsd','./msxsdtest/identityConstraint',valid),
+ STResList809 = [STRes808|STResList808],
+ ?line ITRes193 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL085.xml','./msxsdtest/identityConstraint',invalid,S808),
+ ITResList194 = [ITRes193|ITResList193],
+
+
+ ?line {STRes809,S809} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL086.xsd','./msxsdtest/identityConstraint',valid),
+ STResList810 = [STRes809|STResList809],
+ ?line ITRes194 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL086.xml','./msxsdtest/identityConstraint',valid,S809),
+ ITResList195 = [ITRes194|ITResList194],
+
+
+ ?line {STRes810,S810} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL087.xsd','./msxsdtest/identityConstraint',valid),
+ STResList811 = [STRes810|STResList810],
+ ?line ITRes195 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL087.xml','./msxsdtest/identityConstraint',invalid,S810),
+ ITResList196 = [ITRes195|ITResList195],
+
+
+ ?line {STRes811,S811} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL088.xsd','./msxsdtest/identityConstraint',valid),
+ STResList812 = [STRes811|STResList811],
+ ?line ITRes196 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL088.xml','./msxsdtest/identityConstraint',valid,S811),
+ ITResList197 = [ITRes196|ITResList196],
+
+
+ ?line {STRes812,S812} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL089.xsd','./msxsdtest/identityConstraint',valid),
+ STResList813 = [STRes812|STResList812],
+ ?line ITRes197 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL089.xml','./msxsdtest/identityConstraint',invalid,S812),
+ ITResList198 = [ITRes197|ITResList197],
+
+
+ ?line {STRes813,S813} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL090.xsd','./msxsdtest/identityConstraint',valid),
+ STResList814 = [STRes813|STResList813],
+ ?line ITRes198 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL090.xml','./msxsdtest/identityConstraint',valid,S813),
+ ITResList199 = [ITRes198|ITResList198],
+
+
+ ?line {STRes814,S814} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL091.xsd','./msxsdtest/identityConstraint',valid),
+ STResList815 = [STRes814|STResList814],
+ ?line ITRes199 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL091.xml','./msxsdtest/identityConstraint',invalid,S814),
+ ITResList200 = [ITRes199|ITResList199],
+
+
+ ?line {STRes815,S815} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL092.xsd','./msxsdtest/identityConstraint',valid),
+ STResList816 = [STRes815|STResList815],
+ ?line ITRes200 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL092.xml','./msxsdtest/identityConstraint',valid,S815),
+ ITResList201 = [ITRes200|ITResList200],
+
+
+ ?line {STRes816,S816} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL093.xsd','./msxsdtest/identityConstraint',valid),
+ STResList817 = [STRes816|STResList816],
+ ?line ITRes201 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL093.xml','./msxsdtest/identityConstraint',invalid,S816),
+ ITResList202 = [ITRes201|ITResList201],
+
+
+ ?line {STRes817,S817} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL094.xsd','./msxsdtest/identityConstraint',valid),
+ STResList818 = [STRes817|STResList817],
+ ?line ITRes202 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL094.xml','./msxsdtest/identityConstraint',valid,S817),
+ ITResList203 = [ITRes202|ITResList202],
+
+
+ ?line {STRes818,S818} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL095.xsd','./msxsdtest/identityConstraint',valid),
+ STResList819 = [STRes818|STResList818],
+ ?line ITRes203 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL095.xml','./msxsdtest/identityConstraint',invalid,S818),
+ ITResList204 = [ITRes203|ITResList203],
+
+
+ ?line {STRes819,S819} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL096.xsd','./msxsdtest/identityConstraint',valid),
+ STResList820 = [STRes819|STResList819],
+ ?line ITRes204 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL096.xml','./msxsdtest/identityConstraint',valid,S819),
+ ITResList205 = [ITRes204|ITResList204],
+
+
+ ?line {STRes820,S820} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL097.xsd','./msxsdtest/identityConstraint',valid),
+ STResList821 = [STRes820|STResList820],
+ ?line ITRes205 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL097.xml','./msxsdtest/identityConstraint',invalid,S820),
+ ITResList206 = [ITRes205|ITResList205],
+
+
+ ?line {STRes821,S821} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL098.xsd','./msxsdtest/identityConstraint',valid),
+ STResList822 = [STRes821|STResList821],
+ ?line ITRes206 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL098.xml','./msxsdtest/identityConstraint',valid,S821),
+ ITResList207 = [ITRes206|ITResList206],
+
+
+ ?line {STRes822,S822} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL099.xsd','./msxsdtest/identityConstraint',valid),
+ STResList823 = [STRes822|STResList822],
+ ?line ITRes207 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL099.xml','./msxsdtest/identityConstraint',invalid,S822),
+ ITResList208 = [ITRes207|ITResList207],
+
+
+ ?line {STRes823,S823} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL100.xsd','./msxsdtest/identityConstraint',valid),
+ STResList824 = [STRes823|STResList823],
+ ?line ITRes208 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL100.xml','./msxsdtest/identityConstraint',valid,S823),
+ ITResList209 = [ITRes208|ITResList208],
+
+
+ ?line {STRes824,S824} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL101.xsd','./msxsdtest/identityConstraint',valid),
+ STResList825 = [STRes824|STResList824],
+ ?line ITRes209 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL101.xml','./msxsdtest/identityConstraint',invalid,S824),
+ ITResList210 = [ITRes209|ITResList209],
+
+
+ ?line {STRes825,S825} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL102.xsd','./msxsdtest/identityConstraint',valid),
+ STResList826 = [STRes825|STResList825],
+ ?line ITRes210 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL102.xml','./msxsdtest/identityConstraint',valid,S825),
+ ITResList211 = [ITRes210|ITResList210],
+
+
+ ?line {STRes826,S826} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idL103.xsd','./msxsdtest/identityConstraint',valid),
+ STResList827 = [STRes826|STResList826],
+ ?line ITRes211 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idL103.xml','./msxsdtest/identityConstraint',invalid,S826),
+ ITResList212 = [ITRes211|ITResList211],
+
+
+ ?line {STRes827,S827} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idZ001.xsd','./msxsdtest/identityConstraint',valid),
+ STResList828 = [STRes827|STResList827],
+ ?line ITRes212 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idZ001.xml','./msxsdtest/identityConstraint',invalid,S827),
+ ITResList213 = [ITRes212|ITResList212],
+
+
+ ?line {STRes828,S828} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idZ002.xsd','./msxsdtest/identityConstraint',valid),
+ STResList829 = [STRes828|STResList828],
+ ?line ITRes213 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idZ002.xml','./msxsdtest/identityConstraint',invalid,S828),
+ ITResList214 = [ITRes213|ITResList213],
+
+
+
+
+ ?line {STRes829,S829} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/identityConstraint/idZ004.xsd','./msxsdtest/identityConstraint',valid),
+ STResList830 = [STRes829|STResList829],
+ ?line ITRes214 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/identityConstraint/idZ004.xml','./msxsdtest/identityConstraint',invalid,S829),
+ ITResList215 = [ITRes214|ITResList214],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList830,ITResList215).
+
+%% model groups (ALL).
+
+mgABCD(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgA001.xsd','./msxsdtest/ModelGroups',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgA001.xml','./msxsdtest/ModelGroups',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes1,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgA002.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList2 = [STRes1|STResList1],
+
+
+ ?line {STRes2,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgA003.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList3 = [STRes2|STResList2],
+
+
+ ?line {STRes3,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgA004.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList4 = [STRes3|STResList3],
+
+
+ ?line {STRes4,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgA005.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList5 = [STRes4|STResList4],
+
+
+ ?line {STRes5,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgA006.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList6 = [STRes5|STResList5],
+
+
+ ?line {STRes6,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgA007.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList7 = [STRes6|STResList6],
+
+
+ ?line {STRes7,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgA008.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList8 = [STRes7|STResList7],
+
+
+ ?line {STRes8,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgA009.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList9 = [STRes8|STResList8],
+
+
+ ?line {STRes9,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgA010.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList10 = [STRes9|STResList9],
+
+
+ ?line {STRes10,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgA011.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList11 = [STRes10|STResList10],
+
+
+ ?line {STRes11,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgA012.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList12 = [STRes11|STResList11],
+
+
+ ?line {STRes12,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgA013.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList13 = [STRes12|STResList12],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgA014.xsd','./msxsdtest/ModelGroups',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgA014.xml','./msxsdtest/ModelGroups',valid,S13),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgA015.xsd','./msxsdtest/ModelGroups',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgA015.xml','./msxsdtest/ModelGroups',valid,S14),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgA016.xsd','./msxsdtest/ModelGroups',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgA016.xml','./msxsdtest/ModelGroups',valid,S15),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgA017.xsd','./msxsdtest/ModelGroups',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgA017.xml','./msxsdtest/ModelGroups',valid,S16),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes17,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgA018.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList18 = [STRes17|STResList17],
+
+
+ ?line {STRes18,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgA019.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList19 = [STRes18|STResList18],
+
+
+ ?line {STRes19,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgAa001.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList20 = [STRes19|STResList19],
+
+
+ ?line {STRes20,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgAa002.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList21 = [STRes20|STResList20],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgAa003.xsd','./msxsdtest/ModelGroups',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgAa003.xml','./msxsdtest/ModelGroups',valid,S21),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes22,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgAa004.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList23 = [STRes22|STResList22],
+
+
+ ?line {STRes23,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgAa005.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList24 = [STRes23|STResList23],
+
+
+ ?line {STRes24,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgAa006.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList25 = [STRes24|STResList24],
+
+
+ ?line {STRes25,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgAa007.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList26 = [STRes25|STResList25],
+
+
+ ?line {STRes26,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgAa008.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList27 = [STRes26|STResList26],
+
+
+ ?line {STRes27,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgAa009.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList28 = [STRes27|STResList27],
+
+
+ ?line {STRes28,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgAa010.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList29 = [STRes28|STResList28],
+
+
+ ?line {STRes29,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgAb001.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList30 = [STRes29|STResList29],
+
+
+ ?line {STRes30,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgAb002.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList31 = [STRes30|STResList30],
+
+
+ ?line {STRes31,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgAb003.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList32 = [STRes31|STResList31],
+
+
+ ?line {STRes32,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgAb004.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList33 = [STRes32|STResList32],
+
+
+ ?line {STRes33,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgAb005.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList34 = [STRes33|STResList33],
+
+
+ ?line {STRes34,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgAb006.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList35 = [STRes34|STResList34],
+
+
+ ?line {STRes35,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgAb007.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList36 = [STRes35|STResList35],
+
+
+ ?line {STRes36,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgAb008.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList37 = [STRes36|STResList36],
+
+
+ ?line {STRes37,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgAb009.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList38 = [STRes37|STResList37],
+
+
+ ?line {STRes38,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgAb010.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList39 = [STRes38|STResList38],
+
+
+ ?line {STRes39,S39} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgB001.xsd','./msxsdtest/ModelGroups',valid),
+ STResList40 = [STRes39|STResList39],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgB001.xml','./msxsdtest/ModelGroups',valid,S39),
+ ITResList7 = [ITRes6|ITResList6],
+
+
+ ?line {STRes40,S40} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgB002.xsd','./msxsdtest/ModelGroups',valid),
+ STResList41 = [STRes40|STResList40],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgB002.xml','./msxsdtest/ModelGroups',valid,S40),
+ ITResList8 = [ITRes7|ITResList7],
+
+
+ ?line {STRes41,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgB003.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList42 = [STRes41|STResList41],
+
+
+ ?line {STRes42,S42} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgB004.xsd','./msxsdtest/ModelGroups',valid),
+ STResList43 = [STRes42|STResList42],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgB004.xml','./msxsdtest/ModelGroups',valid,S42),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ ?line {STRes43,S43} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgB006.xsd','./msxsdtest/ModelGroups',valid),
+ STResList44 = [STRes43|STResList43],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgB006.xml','./msxsdtest/ModelGroups',valid,S43),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes44,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgB007.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList45 = [STRes44|STResList44],
+
+
+ ?line {STRes45,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgB008.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList46 = [STRes45|STResList45],
+
+
+ ?line {STRes46,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgB009.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList47 = [STRes46|STResList46],
+
+
+ ?line {STRes47,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgB010.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList48 = [STRes47|STResList47],
+
+
+ ?line {STRes48,S48} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgC001.xsd','./msxsdtest/ModelGroups',valid),
+ STResList49 = [STRes48|STResList48],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgC001.xml','./msxsdtest/ModelGroups',invalid,S48),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes49,S49} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgC002.xsd','./msxsdtest/ModelGroups',valid),
+ STResList50 = [STRes49|STResList49],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgC002.xml','./msxsdtest/ModelGroups',valid,S49),
+ ITResList12 = [ITRes11|ITResList11],
+
+
+ ?line {STRes50,S50} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgC003.xsd','./msxsdtest/ModelGroups',valid),
+ STResList51 = [STRes50|STResList50],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgC003.xml','./msxsdtest/ModelGroups',invalid,S50),
+ ITResList13 = [ITRes12|ITResList12],
+
+
+ ?line {STRes51,S51} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgC004.xsd','./msxsdtest/ModelGroups',valid),
+ STResList52 = [STRes51|STResList51],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgC004.xml','./msxsdtest/ModelGroups',valid,S51),
+ ITResList14 = [ITRes13|ITResList13],
+
+
+ ?line {STRes52,S52} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgC005.xsd','./msxsdtest/ModelGroups',valid),
+ STResList53 = [STRes52|STResList52],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgC005.xml','./msxsdtest/ModelGroups',invalid,S52),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes53,S53} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgC006.xsd','./msxsdtest/ModelGroups',valid),
+ STResList54 = [STRes53|STResList53],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgC006.xml','./msxsdtest/ModelGroups',valid,S53),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ ?line {STRes54,S54} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgC007.xsd','./msxsdtest/ModelGroups',valid),
+ STResList55 = [STRes54|STResList54],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgC007.xml','./msxsdtest/ModelGroups',invalid,S54),
+ ITResList17 = [ITRes16|ITResList16],
+
+
+ ?line {STRes55,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgC008.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList56 = [STRes55|STResList55],
+
+
+ ?line {STRes56,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgC009.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList57 = [STRes56|STResList56],
+
+
+ ?line {STRes57,S57} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgC010.xsd','./msxsdtest/ModelGroups',valid),
+ STResList58 = [STRes57|STResList57],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgC010.xml','./msxsdtest/ModelGroups',invalid,S57),
+ ITResList18 = [ITRes17|ITResList17],
+
+
+ ?line {STRes58,S58} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgC011.xsd','./msxsdtest/ModelGroups',valid),
+ STResList59 = [STRes58|STResList58],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgC011.xml','./msxsdtest/ModelGroups',valid,S58),
+ ITResList19 = [ITRes18|ITResList18],
+
+
+ ?line {STRes59,S59} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgC012.xsd','./msxsdtest/ModelGroups',valid),
+ STResList60 = [STRes59|STResList59],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgC012.xml','./msxsdtest/ModelGroups',invalid,S59),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes60,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgC013.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList61 = [STRes60|STResList60],
+
+
+ ?line {STRes61,S61} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgC014.xsd','./msxsdtest/ModelGroups',valid),
+ STResList62 = [STRes61|STResList61],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgC014.xml','./msxsdtest/ModelGroups',valid,S61),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes62,S62} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgD001.xsd','./msxsdtest/ModelGroups',valid),
+ STResList63 = [STRes62|STResList62],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgD001.xml','./msxsdtest/ModelGroups',valid,S62),
+ ITResList22 = [ITRes21|ITResList21],
+
+
+ ?line {STRes63,S63} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgD005.xsd','./msxsdtest/ModelGroups',valid),
+ STResList64 = [STRes63|STResList63],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgD005.xml','./msxsdtest/ModelGroups',valid,S63),
+ ITResList23 = [ITRes22|ITResList22],
+
+
+ ?line {STRes64,S64} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgD009.xsd','./msxsdtest/ModelGroups',valid),
+ STResList65 = [STRes64|STResList64],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgD009.xml','./msxsdtest/ModelGroups',valid,S64),
+ ITResList24 = [ITRes23|ITResList23],
+
+
+ ?line {STRes65,S65} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgD013.xsd','./msxsdtest/ModelGroups',valid),
+ STResList66 = [STRes65|STResList65],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgD013.xml','./msxsdtest/ModelGroups',valid,S65),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList66,ITResList25).
+
+%% model groups ( sequence ).
+
+mgEFG(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgE001.xsd','./msxsdtest/ModelGroups',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgE001.xml','./msxsdtest/ModelGroups',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes1,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgE002.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList2 = [STRes1|STResList1],
+
+
+ ?line {STRes2,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgE003.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList3 = [STRes2|STResList2],
+
+
+ ?line {STRes3,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgE004.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList4 = [STRes3|STResList3],
+
+
+ ?line {STRes4,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgE005.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList5 = [STRes4|STResList4],
+
+
+ ?line {STRes5,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgE006.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList6 = [STRes5|STResList5],
+
+
+ ?line {STRes6,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgE007.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList7 = [STRes6|STResList6],
+
+
+ ?line {STRes7,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgE008.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList8 = [STRes7|STResList7],
+
+
+ ?line {STRes8,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgE009.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList9 = [STRes8|STResList8],
+
+
+ ?line {STRes9,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgE010.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList10 = [STRes9|STResList9],
+
+
+ ?line {STRes10,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgE011.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList11 = [STRes10|STResList10],
+
+
+ ?line {STRes11,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgE012.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList12 = [STRes11|STResList11],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgE013.xsd','./msxsdtest/ModelGroups',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgE013.xml','./msxsdtest/ModelGroups',valid,S12),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgE014.xsd','./msxsdtest/ModelGroups',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgE014.xml','./msxsdtest/ModelGroups',valid,S13),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgE015.xsd','./msxsdtest/ModelGroups',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgE015.xml','./msxsdtest/ModelGroups',valid,S14),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgE016.xsd','./msxsdtest/ModelGroups',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgE016.xml','./msxsdtest/ModelGroups',valid,S15),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgE017.xsd','./msxsdtest/ModelGroups',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgE017.xml','./msxsdtest/ModelGroups',valid,S16),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgE018.xsd','./msxsdtest/ModelGroups',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgE018.xml','./msxsdtest/ModelGroups',valid,S17),
+ ITResList7 = [ITRes6|ITResList6],
+
+
+ ?line {STRes18,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgEa001.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList19 = [STRes18|STResList18],
+
+
+ ?line {STRes19,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgEa002.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList20 = [STRes19|STResList19],
+
+
+ ?line {STRes20,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgEa003.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList21 = [STRes20|STResList20],
+
+
+ ?line {STRes21,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgEa004.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList22 = [STRes21|STResList21],
+
+
+ ?line {STRes22,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgEa005.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList23 = [STRes22|STResList22],
+
+
+ ?line {STRes23,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgEa006.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList24 = [STRes23|STResList23],
+
+
+ ?line {STRes24,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgEa007.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList25 = [STRes24|STResList24],
+
+
+ ?line {STRes25,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgEa008.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList26 = [STRes25|STResList25],
+
+
+ ?line {STRes26,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgEb001.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList27 = [STRes26|STResList26],
+
+
+ ?line {STRes27,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgEb002.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList28 = [STRes27|STResList27],
+
+
+ ?line {STRes28,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgEb003.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList29 = [STRes28|STResList28],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgEb004.xsd','./msxsdtest/ModelGroups',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgEb004.xml','./msxsdtest/ModelGroups',valid,S29),
+ ITResList8 = [ITRes7|ITResList7],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgEb005.xsd','./msxsdtest/ModelGroups',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgEb005.xml','./msxsdtest/ModelGroups',valid,S30),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ ?line {STRes31,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgEb006.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList32 = [STRes31|STResList31],
+
+
+ ?line {STRes32,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgEb007.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList33 = [STRes32|STResList32],
+
+
+ ?line {STRes33,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgEb008.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList34 = [STRes33|STResList33],
+
+
+ ?line {STRes34,S34} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgF001.xsd','./msxsdtest/ModelGroups',valid),
+ STResList35 = [STRes34|STResList34],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgF001.xml','./msxsdtest/ModelGroups',valid,S34),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes35,S35} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgF002.xsd','./msxsdtest/ModelGroups',valid),
+ STResList36 = [STRes35|STResList35],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgF002.xml','./msxsdtest/ModelGroups',valid,S35),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes36,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgF003.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList37 = [STRes36|STResList36],
+
+
+ ?line {STRes37,S37} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgF004.xsd','./msxsdtest/ModelGroups',valid),
+ STResList38 = [STRes37|STResList37],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgF004.xml','./msxsdtest/ModelGroups',valid,S37),
+ ITResList12 = [ITRes11|ITResList11],
+
+
+ ?line {STRes38,S38} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgF005.xsd','./msxsdtest/ModelGroups',valid),
+ STResList39 = [STRes38|STResList38],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgF005.xml','./msxsdtest/ModelGroups',valid,S38),
+ ITResList13 = [ITRes12|ITResList12],
+
+
+ ?line {STRes39,S39} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgF006.xsd','./msxsdtest/ModelGroups',valid),
+ STResList40 = [STRes39|STResList39],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgF006.xml','./msxsdtest/ModelGroups',valid,S39),
+ ITResList14 = [ITRes13|ITResList13],
+
+
+ ?line {STRes40,S40} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgF007.xsd','./msxsdtest/ModelGroups',valid),
+ STResList41 = [STRes40|STResList40],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgF007.xml','./msxsdtest/ModelGroups',valid,S40),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes41,S41} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgF008.xsd','./msxsdtest/ModelGroups',valid),
+ STResList42 = [STRes41|STResList41],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgF008.xml','./msxsdtest/ModelGroups',valid,S41),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ ?line {STRes42,S42} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgF009.xsd','./msxsdtest/ModelGroups',valid),
+ STResList43 = [STRes42|STResList42],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgF009.xml','./msxsdtest/ModelGroups',valid,S42),
+ ITResList17 = [ITRes16|ITResList16],
+
+
+ ?line {STRes43,S43} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgF010.xsd','./msxsdtest/ModelGroups',valid),
+ STResList44 = [STRes43|STResList43],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgF010.xml','./msxsdtest/ModelGroups',valid,S43),
+ ITResList18 = [ITRes17|ITResList17],
+
+
+ ?line {STRes44,S44} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgF011.xsd','./msxsdtest/ModelGroups',valid),
+ STResList45 = [STRes44|STResList44],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgF011.xml','./msxsdtest/ModelGroups',valid,S44),
+ ITResList19 = [ITRes18|ITResList18],
+
+
+ ?line {STRes45,S45} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgF012.xsd','./msxsdtest/ModelGroups',valid),
+ STResList46 = [STRes45|STResList45],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgF012.xml','./msxsdtest/ModelGroups',valid,S45),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes46,S46} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgF013.xsd','./msxsdtest/ModelGroups',valid),
+ STResList47 = [STRes46|STResList46],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgF013.xml','./msxsdtest/ModelGroups',valid,S46),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes47,S47} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgF014.xsd','./msxsdtest/ModelGroups',valid),
+ STResList48 = [STRes47|STResList47],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgF014.xml','./msxsdtest/ModelGroups',valid,S47),
+ ITResList22 = [ITRes21|ITResList21],
+
+
+ ?line {STRes48,S48} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgF015.xsd','./msxsdtest/ModelGroups',valid),
+ STResList49 = [STRes48|STResList48],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgF015.xml','./msxsdtest/ModelGroups',valid,S48),
+ ITResList23 = [ITRes22|ITResList22],
+
+
+ ?line {STRes49,S49} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgF016.xsd','./msxsdtest/ModelGroups',valid),
+ STResList50 = [STRes49|STResList49],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgF016.xml','./msxsdtest/ModelGroups',valid,S49),
+ ITResList24 = [ITRes23|ITResList23],
+
+
+ ?line {STRes50,S50} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgF017.xsd','./msxsdtest/ModelGroups',valid),
+ STResList51 = [STRes50|STResList50],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgF017.xml','./msxsdtest/ModelGroups',valid,S50),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ ?line {STRes51,S51} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgF018.xsd','./msxsdtest/ModelGroups',valid),
+ STResList52 = [STRes51|STResList51],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgF018.xml','./msxsdtest/ModelGroups',valid,S51),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes52,S52} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgF019.xsd','./msxsdtest/ModelGroups',valid),
+ STResList53 = [STRes52|STResList52],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgF019.xml','./msxsdtest/ModelGroups',valid,S52),
+ ITResList27 = [ITRes26|ITResList26],
+
+
+ ?line {STRes53,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgF020.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList54 = [STRes53|STResList53],
+
+
+ ?line {STRes54,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgF021.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList55 = [STRes54|STResList54],
+
+
+ ?line {STRes55,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgF022.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList56 = [STRes55|STResList55],
+
+
+ ?line {STRes56,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgF023.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList57 = [STRes56|STResList56],
+
+
+ ?line {STRes57,S57} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG001.xsd','./msxsdtest/ModelGroups',valid),
+ STResList58 = [STRes57|STResList57],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG001.xml','./msxsdtest/ModelGroups',valid,S57),
+ ITResList28 = [ITRes27|ITResList27],
+
+
+ ?line {STRes58,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG002.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList59 = [STRes58|STResList58],
+
+
+ ?line {STRes59,S59} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG003.xsd','./msxsdtest/ModelGroups',valid),
+ STResList60 = [STRes59|STResList59],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG003.xml','./msxsdtest/ModelGroups',invalid,S59),
+ ITResList29 = [ITRes28|ITResList28],
+
+
+ ?line {STRes60,S60} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG004.xsd','./msxsdtest/ModelGroups',valid),
+ STResList61 = [STRes60|STResList60],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG004.xml','./msxsdtest/ModelGroups',valid,S60),
+ ITResList30 = [ITRes29|ITResList29],
+
+
+ ?line {STRes61,S61} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG005.xsd','./msxsdtest/ModelGroups',valid),
+ STResList62 = [STRes61|STResList61],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG005.xml','./msxsdtest/ModelGroups',invalid,S61),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes62,S62} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG006.xsd','./msxsdtest/ModelGroups',valid),
+ STResList63 = [STRes62|STResList62],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG006.xml','./msxsdtest/ModelGroups',valid,S62),
+ ITResList32 = [ITRes31|ITResList31],
+
+
+ ?line {STRes63,S63} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG007.xsd','./msxsdtest/ModelGroups',valid),
+ STResList64 = [STRes63|STResList63],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG007.xml','./msxsdtest/ModelGroups',valid,S63),
+ ITResList33 = [ITRes32|ITResList32],
+
+
+ ?line {STRes64,S64} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG008.xsd','./msxsdtest/ModelGroups',valid),
+ STResList65 = [STRes64|STResList64],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG008.xml','./msxsdtest/ModelGroups',invalid,S64),
+ ITResList34 = [ITRes33|ITResList33],
+
+
+ ?line {STRes65,S65} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG009.xsd','./msxsdtest/ModelGroups',valid),
+ STResList66 = [STRes65|STResList65],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG009.xml','./msxsdtest/ModelGroups',valid,S65),
+ ITResList35 = [ITRes34|ITResList34],
+
+
+ ?line {STRes66,S66} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG010.xsd','./msxsdtest/ModelGroups',valid),
+ STResList67 = [STRes66|STResList66],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG010.xml','./msxsdtest/ModelGroups',valid,S66),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes67,S67} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG011.xsd','./msxsdtest/ModelGroups',valid),
+ STResList68 = [STRes67|STResList67],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG011.xml','./msxsdtest/ModelGroups',invalid,S67),
+ ITResList37 = [ITRes36|ITResList36],
+
+
+ ?line {STRes68,S68} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG012.xsd','./msxsdtest/ModelGroups',valid),
+ STResList69 = [STRes68|STResList68],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG012.xml','./msxsdtest/ModelGroups',valid,S68),
+ ITResList38 = [ITRes37|ITResList37],
+
+
+ ?line {STRes69,S69} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG013.xsd','./msxsdtest/ModelGroups',valid),
+ STResList70 = [STRes69|STResList69],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG013.xml','./msxsdtest/ModelGroups',invalid,S69),
+ ITResList39 = [ITRes38|ITResList38],
+
+
+ ?line {STRes70,S70} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG014.xsd','./msxsdtest/ModelGroups',valid),
+ STResList71 = [STRes70|STResList70],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG014.xml','./msxsdtest/ModelGroups',valid,S70),
+ ITResList40 = [ITRes39|ITResList39],
+
+
+ ?line {STRes71,S71} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG015.xsd','./msxsdtest/ModelGroups',valid),
+ STResList72 = [STRes71|STResList71],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG015.xml','./msxsdtest/ModelGroups',invalid,S71),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes72,S72} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG016.xsd','./msxsdtest/ModelGroups',valid),
+ STResList73 = [STRes72|STResList72],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG016.xml','./msxsdtest/ModelGroups',valid,S72),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes73,S73} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG017.xsd','./msxsdtest/ModelGroups',valid),
+ STResList74 = [STRes73|STResList73],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG017.xml','./msxsdtest/ModelGroups',invalid,S73),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes74,S74} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG018.xsd','./msxsdtest/ModelGroups',valid),
+ STResList75 = [STRes74|STResList74],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG018.xml','./msxsdtest/ModelGroups',invalid,S74),
+ ITResList44 = [ITRes43|ITResList43],
+
+
+ ?line {STRes75,S75} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG019.xsd','./msxsdtest/ModelGroups',valid),
+ STResList76 = [STRes75|STResList75],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG019.xml','./msxsdtest/ModelGroups',valid,S75),
+ ITResList45 = [ITRes44|ITResList44],
+
+
+ ?line {STRes76,S76} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG020.xsd','./msxsdtest/ModelGroups',valid),
+ STResList77 = [STRes76|STResList76],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG020.xml','./msxsdtest/ModelGroups',invalid,S76),
+ ITResList46 = [ITRes45|ITResList45],
+
+
+ ?line {STRes77,S77} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG021.xsd','./msxsdtest/ModelGroups',valid),
+ STResList78 = [STRes77|STResList77],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG021.xml','./msxsdtest/ModelGroups',invalid,S77),
+ ITResList47 = [ITRes46|ITResList46],
+
+
+ ?line {STRes78,S78} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG022.xsd','./msxsdtest/ModelGroups',valid),
+ STResList79 = [STRes78|STResList78],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG022.xml','./msxsdtest/ModelGroups',valid,S78),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes79,S79} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG023.xsd','./msxsdtest/ModelGroups',valid),
+ STResList80 = [STRes79|STResList79],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG023.xml','./msxsdtest/ModelGroups',valid,S79),
+ ITResList49 = [ITRes48|ITResList48],
+
+
+ ?line {STRes80,S80} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG024.xsd','./msxsdtest/ModelGroups',valid),
+ STResList81 = [STRes80|STResList80],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG024.xml','./msxsdtest/ModelGroups',invalid,S80),
+ ITResList50 = [ITRes49|ITResList49],
+
+
+ ?line {STRes81,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG025.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList82 = [STRes81|STResList81],
+
+
+ ?line {STRes82,S82} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG026.xsd','./msxsdtest/ModelGroups',valid),
+ STResList83 = [STRes82|STResList82],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgG026.xml','./msxsdtest/ModelGroups',valid,S82),
+ ITResList51 = [ITRes50|ITResList50],
+
+
+ ?line {STRes83,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG027.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList84 = [STRes83|STResList83],
+
+
+ ?line {STRes84,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG028.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList85 = [STRes84|STResList84],
+
+
+ ?line {STRes85,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG029.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList86 = [STRes85|STResList85],
+
+
+ ?line {STRes86,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgG030.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList87 = [STRes86|STResList86],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList87,ITResList51).
+
+%% model groups ( choice ).
+
+mgHIJ(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgH001.xsd','./msxsdtest/ModelGroups',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgH001.xml','./msxsdtest/ModelGroups',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes1,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgH002.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList2 = [STRes1|STResList1],
+
+
+ ?line {STRes2,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgH003.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList3 = [STRes2|STResList2],
+
+
+ ?line {STRes3,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgH004.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList4 = [STRes3|STResList3],
+
+
+ ?line {STRes4,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgH005.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList5 = [STRes4|STResList4],
+
+
+ ?line {STRes5,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgH006.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList6 = [STRes5|STResList5],
+
+
+ ?line {STRes6,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgH007.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList7 = [STRes6|STResList6],
+
+
+ ?line {STRes7,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgH008.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList8 = [STRes7|STResList7],
+
+
+ ?line {STRes8,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgH009.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList9 = [STRes8|STResList8],
+
+
+ ?line {STRes9,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgH010.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList10 = [STRes9|STResList9],
+
+
+ ?line {STRes10,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgH011.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList11 = [STRes10|STResList10],
+
+
+ ?line {STRes11,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgH012.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList12 = [STRes11|STResList11],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgH013.xsd','./msxsdtest/ModelGroups',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgH013.xml','./msxsdtest/ModelGroups',valid,S12),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgH014.xsd','./msxsdtest/ModelGroups',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgH014.xml','./msxsdtest/ModelGroups',valid,S13),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgH015.xsd','./msxsdtest/ModelGroups',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgH015.xml','./msxsdtest/ModelGroups',valid,S14),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgH016.xsd','./msxsdtest/ModelGroups',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgH016.xml','./msxsdtest/ModelGroups',valid,S15),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgH017.xsd','./msxsdtest/ModelGroups',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgH017.xml','./msxsdtest/ModelGroups',valid,S16),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgH018.xsd','./msxsdtest/ModelGroups',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgH018.xml','./msxsdtest/ModelGroups',valid,S17),
+ ITResList7 = [ITRes6|ITResList6],
+
+
+ ?line {STRes18,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgHa001.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList19 = [STRes18|STResList18],
+
+
+ ?line {STRes19,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgHa002.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList20 = [STRes19|STResList19],
+
+
+ ?line {STRes20,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgHa003.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList21 = [STRes20|STResList20],
+
+
+ ?line {STRes21,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgHa004.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList22 = [STRes21|STResList21],
+
+
+ ?line {STRes22,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgHa005.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList23 = [STRes22|STResList22],
+
+
+ ?line {STRes23,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgHa006.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList24 = [STRes23|STResList23],
+
+
+ ?line {STRes24,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgHa007.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList25 = [STRes24|STResList24],
+
+
+ ?line {STRes25,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgHa008.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList26 = [STRes25|STResList25],
+
+
+ ?line {STRes26,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgHb001.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList27 = [STRes26|STResList26],
+
+
+ ?line {STRes27,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgHb002.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList28 = [STRes27|STResList27],
+
+
+ ?line {STRes28,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgHb003.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList29 = [STRes28|STResList28],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgHb004.xsd','./msxsdtest/ModelGroups',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgHb004.xml','./msxsdtest/ModelGroups',valid,S29),
+ ITResList8 = [ITRes7|ITResList7],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgHb005.xsd','./msxsdtest/ModelGroups',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgHb005.xml','./msxsdtest/ModelGroups',valid,S30),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ ?line {STRes31,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgHb006.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList32 = [STRes31|STResList31],
+
+
+ ?line {STRes32,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgHb007.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList33 = [STRes32|STResList32],
+
+
+ ?line {STRes33,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgHb008.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList34 = [STRes33|STResList33],
+
+
+ ?line {STRes34,S34} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgI001.xsd','./msxsdtest/ModelGroups',valid),
+ STResList35 = [STRes34|STResList34],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgI001.xml','./msxsdtest/ModelGroups',valid,S34),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes35,S35} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgI002.xsd','./msxsdtest/ModelGroups',valid),
+ STResList36 = [STRes35|STResList35],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgI002.xml','./msxsdtest/ModelGroups',valid,S35),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes36,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgI003.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList37 = [STRes36|STResList36],
+
+
+ ?line {STRes37,S37} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgI004.xsd','./msxsdtest/ModelGroups',valid),
+ STResList38 = [STRes37|STResList37],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgI004.xml','./msxsdtest/ModelGroups',valid,S37),
+ ITResList12 = [ITRes11|ITResList11],
+
+
+ ?line {STRes38,S38} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgI005.xsd','./msxsdtest/ModelGroups',valid),
+ STResList39 = [STRes38|STResList38],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgI005.xml','./msxsdtest/ModelGroups',valid,S38),
+ ITResList13 = [ITRes12|ITResList12],
+
+
+ ?line {STRes39,S39} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgI006.xsd','./msxsdtest/ModelGroups',valid),
+ STResList40 = [STRes39|STResList39],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgI006.xml','./msxsdtest/ModelGroups',valid,S39),
+ ITResList14 = [ITRes13|ITResList13],
+
+
+ ?line {STRes40,S40} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgI007.xsd','./msxsdtest/ModelGroups',valid),
+ STResList41 = [STRes40|STResList40],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgI007.xml','./msxsdtest/ModelGroups',valid,S40),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes41,S41} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgI008.xsd','./msxsdtest/ModelGroups',valid),
+ STResList42 = [STRes41|STResList41],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgI008.xml','./msxsdtest/ModelGroups',valid,S41),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ ?line {STRes42,S42} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgI009.xsd','./msxsdtest/ModelGroups',valid),
+ STResList43 = [STRes42|STResList42],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgI009.xml','./msxsdtest/ModelGroups',valid,S42),
+ ITResList17 = [ITRes16|ITResList16],
+
+
+ ?line {STRes43,S43} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgI010.xsd','./msxsdtest/ModelGroups',valid),
+ STResList44 = [STRes43|STResList43],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgI010.xml','./msxsdtest/ModelGroups',valid,S43),
+ ITResList18 = [ITRes17|ITResList17],
+
+
+ ?line {STRes44,S44} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgI011.xsd','./msxsdtest/ModelGroups',valid),
+ STResList45 = [STRes44|STResList44],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgI011.xml','./msxsdtest/ModelGroups',valid,S44),
+ ITResList19 = [ITRes18|ITResList18],
+
+
+ ?line {STRes45,S45} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgI012.xsd','./msxsdtest/ModelGroups',valid),
+ STResList46 = [STRes45|STResList45],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgI012.xml','./msxsdtest/ModelGroups',valid,S45),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes46,S46} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgI013.xsd','./msxsdtest/ModelGroups',valid),
+ STResList47 = [STRes46|STResList46],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgI013.xml','./msxsdtest/ModelGroups',valid,S46),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes47,S47} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgI014.xsd','./msxsdtest/ModelGroups',valid),
+ STResList48 = [STRes47|STResList47],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgI014.xml','./msxsdtest/ModelGroups',valid,S47),
+ ITResList22 = [ITRes21|ITResList21],
+
+
+ ?line {STRes48,S48} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgI015.xsd','./msxsdtest/ModelGroups',valid),
+ STResList49 = [STRes48|STResList48],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgI015.xml','./msxsdtest/ModelGroups',valid,S48),
+ ITResList23 = [ITRes22|ITResList22],
+
+
+ ?line {STRes49,S49} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgI016.xsd','./msxsdtest/ModelGroups',valid),
+ STResList50 = [STRes49|STResList49],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgI016.xml','./msxsdtest/ModelGroups',valid,S49),
+ ITResList24 = [ITRes23|ITResList23],
+
+
+ ?line {STRes50,S50} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgI017.xsd','./msxsdtest/ModelGroups',valid),
+ STResList51 = [STRes50|STResList50],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgI017.xml','./msxsdtest/ModelGroups',valid,S50),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ ?line {STRes51,S51} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgI018.xsd','./msxsdtest/ModelGroups',valid),
+ STResList52 = [STRes51|STResList51],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgI018.xml','./msxsdtest/ModelGroups',valid,S51),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes52,S52} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgI019.xsd','./msxsdtest/ModelGroups',valid),
+ STResList53 = [STRes52|STResList52],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgI019.xml','./msxsdtest/ModelGroups',valid,S52),
+ ITResList27 = [ITRes26|ITResList26],
+
+
+ ?line {STRes53,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgI020.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList54 = [STRes53|STResList53],
+
+
+ ?line {STRes54,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgI021.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList55 = [STRes54|STResList54],
+
+
+ ?line {STRes55,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgI022.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList56 = [STRes55|STResList55],
+
+
+ ?line {STRes56,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgI023.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList57 = [STRes56|STResList56],
+
+
+ ?line {STRes57,S57} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ001.xsd','./msxsdtest/ModelGroups',valid),
+ STResList58 = [STRes57|STResList57],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ001.xml','./msxsdtest/ModelGroups',valid,S57),
+ ITResList28 = [ITRes27|ITResList27],
+
+
+ ?line {STRes58,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ002.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList59 = [STRes58|STResList58],
+
+
+ ?line {STRes59,S59} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ003.xsd','./msxsdtest/ModelGroups',valid),
+ STResList60 = [STRes59|STResList59],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ003.xml','./msxsdtest/ModelGroups',invalid,S59),
+ ITResList29 = [ITRes28|ITResList28],
+
+
+ ?line {STRes60,S60} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ004.xsd','./msxsdtest/ModelGroups',valid),
+ STResList61 = [STRes60|STResList60],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ004.xml','./msxsdtest/ModelGroups',valid,S60),
+ ITResList30 = [ITRes29|ITResList29],
+
+
+ ?line {STRes61,S61} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ005.xsd','./msxsdtest/ModelGroups',valid),
+ STResList62 = [STRes61|STResList61],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ005.xml','./msxsdtest/ModelGroups',invalid,S61),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes62,S62} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ006.xsd','./msxsdtest/ModelGroups',valid),
+ STResList63 = [STRes62|STResList62],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ006.xml','./msxsdtest/ModelGroups',valid,S62),
+ ITResList32 = [ITRes31|ITResList31],
+
+
+ ?line {STRes63,S63} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ007.xsd','./msxsdtest/ModelGroups',valid),
+ STResList64 = [STRes63|STResList63],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ007.xml','./msxsdtest/ModelGroups',valid,S63),
+ ITResList33 = [ITRes32|ITResList32],
+
+
+ ?line {STRes64,S64} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ008.xsd','./msxsdtest/ModelGroups',valid),
+ STResList65 = [STRes64|STResList64],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ008.xml','./msxsdtest/ModelGroups',invalid,S64),
+ ITResList34 = [ITRes33|ITResList33],
+
+
+ ?line {STRes65,S65} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ009.xsd','./msxsdtest/ModelGroups',valid),
+ STResList66 = [STRes65|STResList65],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ009.xml','./msxsdtest/ModelGroups',valid,S65),
+ ITResList35 = [ITRes34|ITResList34],
+
+
+ ?line {STRes66,S66} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ010.xsd','./msxsdtest/ModelGroups',valid),
+ STResList67 = [STRes66|STResList66],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ010.xml','./msxsdtest/ModelGroups',valid,S66),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes67,S67} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ011.xsd','./msxsdtest/ModelGroups',valid),
+ STResList68 = [STRes67|STResList67],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ011.xml','./msxsdtest/ModelGroups',invalid,S67),
+ ITResList37 = [ITRes36|ITResList36],
+
+
+ ?line {STRes68,S68} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ012.xsd','./msxsdtest/ModelGroups',valid),
+ STResList69 = [STRes68|STResList68],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ012.xml','./msxsdtest/ModelGroups',valid,S68),
+ ITResList38 = [ITRes37|ITResList37],
+
+
+ ?line {STRes69,S69} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ013.xsd','./msxsdtest/ModelGroups',valid),
+ STResList70 = [STRes69|STResList69],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ013.xml','./msxsdtest/ModelGroups',invalid,S69),
+ ITResList39 = [ITRes38|ITResList38],
+
+
+ ?line {STRes70,S70} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ014.xsd','./msxsdtest/ModelGroups',valid),
+ STResList71 = [STRes70|STResList70],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ014.xml','./msxsdtest/ModelGroups',valid,S70),
+ ITResList40 = [ITRes39|ITResList39],
+
+
+ ?line {STRes71,S71} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ015.xsd','./msxsdtest/ModelGroups',valid),
+ STResList72 = [STRes71|STResList71],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ015.xml','./msxsdtest/ModelGroups',invalid,S71),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes72,S72} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ016.xsd','./msxsdtest/ModelGroups',valid),
+ STResList73 = [STRes72|STResList72],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ016.xml','./msxsdtest/ModelGroups',valid,S72),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes73,S73} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ017.xsd','./msxsdtest/ModelGroups',valid),
+ STResList74 = [STRes73|STResList73],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ017.xml','./msxsdtest/ModelGroups',invalid,S73),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes74,S74} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ018.xsd','./msxsdtest/ModelGroups',valid),
+ STResList75 = [STRes74|STResList74],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ018.xml','./msxsdtest/ModelGroups',invalid,S74),
+ ITResList44 = [ITRes43|ITResList43],
+
+
+ ?line {STRes75,S75} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ019.xsd','./msxsdtest/ModelGroups',valid),
+ STResList76 = [STRes75|STResList75],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ019.xml','./msxsdtest/ModelGroups',valid,S75),
+ ITResList45 = [ITRes44|ITResList44],
+
+
+ ?line {STRes76,S76} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ020.xsd','./msxsdtest/ModelGroups',valid),
+ STResList77 = [STRes76|STResList76],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ020.xml','./msxsdtest/ModelGroups',invalid,S76),
+ ITResList46 = [ITRes45|ITResList45],
+
+
+ ?line {STRes77,S77} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ021.xsd','./msxsdtest/ModelGroups',valid),
+ STResList78 = [STRes77|STResList77],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ021.xml','./msxsdtest/ModelGroups',invalid,S77),
+ ITResList47 = [ITRes46|ITResList46],
+
+
+ ?line {STRes78,S78} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ022.xsd','./msxsdtest/ModelGroups',valid),
+ STResList79 = [STRes78|STResList78],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ022.xml','./msxsdtest/ModelGroups',valid,S78),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes79,S79} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ023.xsd','./msxsdtest/ModelGroups',valid),
+ STResList80 = [STRes79|STResList79],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ023.xml','./msxsdtest/ModelGroups',valid,S79),
+ ITResList49 = [ITRes48|ITResList48],
+
+
+ ?line {STRes80,S80} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ024.xsd','./msxsdtest/ModelGroups',valid),
+ STResList81 = [STRes80|STResList80],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ024.xml','./msxsdtest/ModelGroups',invalid,S80),
+ ITResList50 = [ITRes49|ITResList49],
+
+
+ ?line {STRes81,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ025.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList82 = [STRes81|STResList81],
+
+
+ ?line {STRes82,S82} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ026.xsd','./msxsdtest/ModelGroups',valid),
+ STResList83 = [STRes82|STResList82],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgJ026.xml','./msxsdtest/ModelGroups',valid,S82),
+ ITResList51 = [ITRes50|ITResList50],
+
+
+ ?line {STRes83,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ027.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList84 = [STRes83|STResList83],
+
+
+ ?line {STRes84,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ028.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList85 = [STRes84|STResList84],
+
+
+ ?line {STRes85,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ029.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList86 = [STRes85|STResList85],
+
+
+ ?line {STRes86,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgJ030.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList87 = [STRes86|STResList86],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList87,ITResList51).
+
+%% model group validation checking (sequence).
+
+mgK(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgK001.xsd','./msxsdtest/ModelGroups',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgK001.xml','./msxsdtest/ModelGroups',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgK002.xsd','./msxsdtest/ModelGroups',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgK002.xml','./msxsdtest/ModelGroups',invalid,S1),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgK003.xsd','./msxsdtest/ModelGroups',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgK003.xml','./msxsdtest/ModelGroups',invalid,S2),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgK004.xsd','./msxsdtest/ModelGroups',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgK004.xml','./msxsdtest/ModelGroups',valid,S3),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgK005.xsd','./msxsdtest/ModelGroups',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgK005.xml','./msxsdtest/ModelGroups',invalid,S4),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgK006.xsd','./msxsdtest/ModelGroups',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgK006.xml','./msxsdtest/ModelGroups',invalid,S5),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgK007.xsd','./msxsdtest/ModelGroups',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgK007.xml','./msxsdtest/ModelGroups',invalid,S6),
+ ITResList7 = [ITRes6|ITResList6],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgK008.xsd','./msxsdtest/ModelGroups',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgK008.xml','./msxsdtest/ModelGroups',invalid,S7),
+ ITResList8 = [ITRes7|ITResList7],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgK009.xsd','./msxsdtest/ModelGroups',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgK009.xml','./msxsdtest/ModelGroups',valid,S8),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgK010.xsd','./msxsdtest/ModelGroups',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgK010.xml','./msxsdtest/ModelGroups',invalid,S9),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList10,ITResList10).
+
+%% model group validation checking (choice, all).
+
+mgLM(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgL001.xsd','./msxsdtest/ModelGroups',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgL001.xml','./msxsdtest/ModelGroups',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgL002.xsd','./msxsdtest/ModelGroups',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgL002.xml','./msxsdtest/ModelGroups',invalid,S1),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgL003.xsd','./msxsdtest/ModelGroups',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgL003.xml','./msxsdtest/ModelGroups',invalid,S2),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgL004.xsd','./msxsdtest/ModelGroups',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgL004.xml','./msxsdtest/ModelGroups',valid,S3),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgL005.xsd','./msxsdtest/ModelGroups',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgL005.xml','./msxsdtest/ModelGroups',invalid,S4),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgL006.xsd','./msxsdtest/ModelGroups',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgL006.xml','./msxsdtest/ModelGroups',valid,S5),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgL007.xsd','./msxsdtest/ModelGroups',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgL007.xml','./msxsdtest/ModelGroups',invalid,S6),
+ ITResList7 = [ITRes6|ITResList6],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgL008.xsd','./msxsdtest/ModelGroups',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgL008.xml','./msxsdtest/ModelGroups',valid,S7),
+ ITResList8 = [ITRes7|ITResList7],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgL009.xsd','./msxsdtest/ModelGroups',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgL009.xml','./msxsdtest/ModelGroups',valid,S8),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgL010.xsd','./msxsdtest/ModelGroups',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgL010.xml','./msxsdtest/ModelGroups',invalid,S9),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgM002.xsd','./msxsdtest/ModelGroups',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgM002.xml','./msxsdtest/ModelGroups',invalid,S10),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgM003.xsd','./msxsdtest/ModelGroups',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgM003.xml','./msxsdtest/ModelGroups',invalid,S11),
+ ITResList12 = [ITRes11|ITResList11],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgM004.xsd','./msxsdtest/ModelGroups',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgM004.xml','./msxsdtest/ModelGroups',valid,S12),
+ ITResList13 = [ITRes12|ITResList12],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgM005.xsd','./msxsdtest/ModelGroups',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgM005.xml','./msxsdtest/ModelGroups',invalid,S13),
+ ITResList14 = [ITRes13|ITResList13],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgM006.xsd','./msxsdtest/ModelGroups',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgM006.xml','./msxsdtest/ModelGroups',invalid,S14),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgM007.xsd','./msxsdtest/ModelGroups',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgM007.xml','./msxsdtest/ModelGroups',invalid,S15),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgM008.xsd','./msxsdtest/ModelGroups',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgM008.xml','./msxsdtest/ModelGroups',valid,S16),
+ ITResList17 = [ITRes16|ITResList16],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgM009.xsd','./msxsdtest/ModelGroups',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgM009.xml','./msxsdtest/ModelGroups',valid,S17),
+ ITResList18 = [ITRes17|ITResList17],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgM010.xsd','./msxsdtest/ModelGroups',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgM010.xml','./msxsdtest/ModelGroups',invalid,S18),
+ ITResList19 = [ITRes18|ITResList18],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgM011.xsd','./msxsdtest/ModelGroups',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgM011.xml','./msxsdtest/ModelGroups',valid,S19),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgM012.xsd','./msxsdtest/ModelGroups',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgM012.xml','./msxsdtest/ModelGroups',invalid,S20),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgM013.xsd','./msxsdtest/ModelGroups',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgM013.xml','./msxsdtest/ModelGroups',valid,S21),
+ ITResList22 = [ITRes21|ITResList21],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgM014.xsd','./msxsdtest/ModelGroups',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgM014.xml','./msxsdtest/ModelGroups',invalid,S22),
+ ITResList23 = [ITRes22|ITResList22],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList23,ITResList23).
+
+%% Element Sequence Valid.
+
+mgN(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgN001.xsd','./msxsdtest/ModelGroups',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgN001.xml','./msxsdtest/ModelGroups',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgN002.xsd','./msxsdtest/ModelGroups',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgN002.xml','./msxsdtest/ModelGroups',invalid,S1),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgN003.xsd','./msxsdtest/ModelGroups',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgN003.xml','./msxsdtest/ModelGroups',invalid,S2),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgN004.xsd','./msxsdtest/ModelGroups',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgN004.xml','./msxsdtest/ModelGroups',invalid,S3),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgN005.xsd','./msxsdtest/ModelGroups',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgN005.xml','./msxsdtest/ModelGroups',valid,S4),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgN006.xsd','./msxsdtest/ModelGroups',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgN006.xml','./msxsdtest/ModelGroups',invalid,S5),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgN007.xsd','./msxsdtest/ModelGroups',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgN007.xml','./msxsdtest/ModelGroups',invalid,S6),
+ ITResList7 = [ITRes6|ITResList6],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgN008.xsd','./msxsdtest/ModelGroups',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgN008.xml','./msxsdtest/ModelGroups',invalid,S7),
+ ITResList8 = [ITRes7|ITResList7],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgN009.xsd','./msxsdtest/ModelGroups',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgN009.xml','./msxsdtest/ModelGroups',invalid,S8),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgN010.xsd','./msxsdtest/ModelGroups',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgN010.xml','./msxsdtest/ModelGroups',invalid,S9),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgN011.xsd','./msxsdtest/ModelGroups',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgN011.xml','./msxsdtest/ModelGroups',invalid,S10),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgN012.xsd','./msxsdtest/ModelGroups',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgN012.xml','./msxsdtest/ModelGroups',valid,S11),
+ ITResList12 = [ITRes11|ITResList11],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgN013.xsd','./msxsdtest/ModelGroups',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgN013.xml','./msxsdtest/ModelGroups',invalid,S12),
+ ITResList13 = [ITRes12|ITResList12],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgN014.xsd','./msxsdtest/ModelGroups',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgN014.xml','./msxsdtest/ModelGroups',invalid,S13),
+ ITResList14 = [ITRes13|ITResList13],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgN015.xsd','./msxsdtest/ModelGroups',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgN015.xml','./msxsdtest/ModelGroups',invalid,S14),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgN016.xsd','./msxsdtest/ModelGroups',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgN016.xml','./msxsdtest/ModelGroups',invalid,S15),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList16,ITResList16).
+
+%% All Group Limited.
+
+mgOP(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO001.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList1 = [STRes0|STResList0],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO002.xsd','./msxsdtest/ModelGroups',valid),
+ STResList2 = [STRes1|STResList1],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgO002.xml','./msxsdtest/ModelGroups',valid,S1),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes2,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO003.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList3 = [STRes2|STResList2],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO004.xsd','./msxsdtest/ModelGroups',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgO004.xml','./msxsdtest/ModelGroups',valid,S3),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO005.xsd','./msxsdtest/ModelGroups',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgO005.xml','./msxsdtest/ModelGroups',valid,S4),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO006.xsd','./msxsdtest/ModelGroups',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgO006.xml','./msxsdtest/ModelGroups',valid,S5),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO007.xsd','./msxsdtest/ModelGroups',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgO007.xml','./msxsdtest/ModelGroups',valid,S6),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO008.xsd','./msxsdtest/ModelGroups',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgO008.xml','./msxsdtest/ModelGroups',valid,S7),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO009.xsd','./msxsdtest/ModelGroups',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgO009.xml','./msxsdtest/ModelGroups',valid,S8),
+ ITResList7 = [ITRes6|ITResList6],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO010.xsd','./msxsdtest/ModelGroups',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgO010.xml','./msxsdtest/ModelGroups',valid,S9),
+ ITResList8 = [ITRes7|ITResList7],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO011.xsd','./msxsdtest/ModelGroups',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgO011.xml','./msxsdtest/ModelGroups',valid,S10),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ ?line {STRes11,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO012.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList12 = [STRes11|STResList11],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO013.xsd','./msxsdtest/ModelGroups',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgO013.xml','./msxsdtest/ModelGroups',valid,S12),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO014.xsd','./msxsdtest/ModelGroups',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgO014.xml','./msxsdtest/ModelGroups',valid,S13),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO015.xsd','./msxsdtest/ModelGroups',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgO015.xml','./msxsdtest/ModelGroups',valid,S14),
+ ITResList12 = [ITRes11|ITResList11],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO016.xsd','./msxsdtest/ModelGroups',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgO016.xml','./msxsdtest/ModelGroups',valid,S15),
+ ITResList13 = [ITRes12|ITResList12],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO017.xsd','./msxsdtest/ModelGroups',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgO017.xml','./msxsdtest/ModelGroups',valid,S16),
+ ITResList14 = [ITRes13|ITResList13],
+
+
+ ?line {STRes17,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO018.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList18 = [STRes17|STResList17],
+
+
+ ?line {STRes18,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO019.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList19 = [STRes18|STResList18],
+
+
+ ?line {STRes19,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO020.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList20 = [STRes19|STResList19],
+
+
+ ?line {STRes20,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO021.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList21 = [STRes20|STResList20],
+
+
+ ?line {STRes21,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO022.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList22 = [STRes21|STResList21],
+
+
+ ?line {STRes22,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO023.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList23 = [STRes22|STResList22],
+
+
+ ?line {STRes23,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO024.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList24 = [STRes23|STResList23],
+
+
+ ?line {STRes24,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO025.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList25 = [STRes24|STResList24],
+
+
+ ?line {STRes25,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO026.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList26 = [STRes25|STResList25],
+
+
+ ?line {STRes26,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO027.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList27 = [STRes26|STResList26],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO028.xsd','./msxsdtest/ModelGroups',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgO028.xml','./msxsdtest/ModelGroups',valid,S27),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO029.xsd','./msxsdtest/ModelGroups',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgO029.xml','./msxsdtest/ModelGroups',valid,S28),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO030.xsd','./msxsdtest/ModelGroups',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgO030.xml','./msxsdtest/ModelGroups',valid,S29),
+ ITResList17 = [ITRes16|ITResList16],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO031.xsd','./msxsdtest/ModelGroups',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgO031.xml','./msxsdtest/ModelGroups',valid,S30),
+ ITResList18 = [ITRes17|ITResList17],
+
+
+ ?line {STRes31,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO032.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList32 = [STRes31|STResList31],
+
+
+ ?line {STRes32,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO033.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList33 = [STRes32|STResList32],
+
+
+ ?line {STRes33,S33} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO034.xsd','./msxsdtest/ModelGroups',valid),
+ STResList34 = [STRes33|STResList33],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgO034.xml','./msxsdtest/ModelGroups',valid,S33),
+ ITResList19 = [ITRes18|ITResList18],
+
+
+ ?line {STRes34,S34} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO035.xsd','./msxsdtest/ModelGroups',valid),
+ STResList35 = [STRes34|STResList34],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgO035.xml','./msxsdtest/ModelGroups',valid,S34),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes35,S35} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO036.xsd','./msxsdtest/ModelGroups',valid),
+ STResList36 = [STRes35|STResList35],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgO036.xml','./msxsdtest/ModelGroups',valid,S35),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes36,S36} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO037.xsd','./msxsdtest/ModelGroups',valid),
+ STResList37 = [STRes36|STResList36],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgO037.xml','./msxsdtest/ModelGroups',valid,S36),
+ ITResList22 = [ITRes21|ITResList21],
+
+
+ ?line {STRes37,S37} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgO038.xsd','./msxsdtest/ModelGroups',valid),
+ STResList38 = [STRes37|STResList37],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgO038.xml','./msxsdtest/ModelGroups',valid,S37),
+ ITResList23 = [ITRes22|ITResList22],
+
+
+ ?line {STRes38,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgP039.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList39 = [STRes38|STResList38],
+
+
+ ?line {STRes39,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgP040.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList40 = [STRes39|STResList39],
+
+
+ ?line {STRes40,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgP041.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList41 = [STRes40|STResList40],
+
+
+ ?line {STRes41,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgP042.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList42 = [STRes41|STResList41],
+
+
+ ?line {STRes42,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgP043.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList43 = [STRes42|STResList42],
+
+
+ ?line {STRes43,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgP049.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList44 = [STRes43|STResList43],
+
+
+ ?line {STRes44,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgP050.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList45 = [STRes44|STResList44],
+
+
+ ?line {STRes45,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgP055.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList46 = [STRes45|STResList45],
+
+
+ ?line {STRes46,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgP056.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList47 = [STRes46|STResList46],
+
+
+ ?line {STRes47,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgP057.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList48 = [STRes47|STResList47],
+
+
+ ?line {STRes48,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgP058.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList49 = [STRes48|STResList48],
+
+
+ ?line {STRes49,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgP059.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList50 = [STRes49|STResList49],
+
+
+ ?line {STRes50,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgP060.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList51 = [STRes50|STResList50],
+
+
+ ?line {STRes51,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgP061.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList52 = [STRes51|STResList51],
+
+
+ ?line {STRes52,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgP062.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList53 = [STRes52|STResList52],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList53,ITResList23).
+
+%% Element Declarations Consistent, 3.8.6
+
+mgQR(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgQ001.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList1 = [STRes0|STResList0],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgQ002.xsd','./msxsdtest/ModelGroups',valid),
+ STResList2 = [STRes1|STResList1],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgQ002.xml','./msxsdtest/ModelGroups',valid,S1),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgQ003.xsd','./msxsdtest/ModelGroups',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgQ003.xml','./msxsdtest/ModelGroups',valid,S2),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ ?line {STRes3,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgQ004.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList4 = [STRes3|STResList3],
+
+
+ ?line {STRes4,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgQ005.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList5 = [STRes4|STResList4],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgQ006.xsd','./msxsdtest/ModelGroups',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgQ006.xml','./msxsdtest/ModelGroups',valid,S5),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgQ007.xsd','./msxsdtest/ModelGroups',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgQ007.xml','./msxsdtest/ModelGroups',valid,S6),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgQ008.xsd','./msxsdtest/ModelGroups',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgQ008.xml','./msxsdtest/ModelGroups',valid,S7),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgQ009.xsd','./msxsdtest/ModelGroups',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgQ009.xml','./msxsdtest/ModelGroups',valid,S8),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes9,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgQ010.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList10 = [STRes9|STResList9],
+
+
+ ?line {STRes10,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgQ011.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList11 = [STRes10|STResList10],
+
+
+ ?line {STRes11,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgQ012.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList12 = [STRes11|STResList11],
+
+
+ ?line {STRes12,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgQ013.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList13 = [STRes12|STResList12],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgQ014.xsd','./msxsdtest/ModelGroups',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgQ014.xml','./msxsdtest/ModelGroups',valid,S13),
+ ITResList7 = [ITRes6|ITResList6],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgQ015.xsd','./msxsdtest/ModelGroups',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgQ015.xml','./msxsdtest/ModelGroups',valid,S14),
+ ITResList8 = [ITRes7|ITResList7],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgQ016.xsd','./msxsdtest/ModelGroups',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgQ016.xml','./msxsdtest/ModelGroups',valid,S15),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgQ017.xsd','./msxsdtest/ModelGroups',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgQ017.xml','./msxsdtest/ModelGroups',valid,S16),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgQ018.xsd','./msxsdtest/ModelGroups',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgQ018.xml','./msxsdtest/ModelGroups',valid,S17),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgQ019.xsd','./msxsdtest/ModelGroups',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgQ019.xml','./msxsdtest/ModelGroups',valid,S18),
+ ITResList12 = [ITRes11|ITResList11],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgQ020.xsd','./msxsdtest/ModelGroups',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/ModelGroups/mgQ020.xml','./msxsdtest/ModelGroups',valid,S19),
+ ITResList13 = [ITRes12|ITResList12],
+
+
+ ?line {STRes20,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgQ021.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList21 = [STRes20|STResList20],
+
+
+ ?line {STRes21,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgR001.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList22 = [STRes21|STResList21],
+
+
+ ?line {STRes22,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgR002.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList23 = [STRes22|STResList22],
+
+
+ ?line {STRes23,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgR003.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList24 = [STRes23|STResList23],
+
+
+ ?line {STRes24,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgR004.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList25 = [STRes24|STResList24],
+
+
+ ?line {STRes25,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgR005.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList26 = [STRes25|STResList25],
+
+
+ ?line {STRes26,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgR006.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList27 = [STRes26|STResList26],
+
+
+ ?line {STRes27,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgR007.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList28 = [STRes27|STResList27],
+
+
+ ?line {STRes28,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgR008.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList29 = [STRes28|STResList28],
+
+
+ ?line {STRes29,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgR009.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList30 = [STRes29|STResList29],
+
+
+ ?line {STRes30,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgR010.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList31 = [STRes30|STResList30],
+
+
+ ?line {STRes31,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgR011.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList32 = [STRes31|STResList31],
+
+
+ ?line {STRes32,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgR012.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList33 = [STRes32|STResList32],
+
+
+ ?line {STRes33,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgR013.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList34 = [STRes33|STResList33],
+
+
+ ?line {STRes34,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgR014.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList35 = [STRes34|STResList34],
+
+
+ ?line {STRes35,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgR015.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList36 = [STRes35|STResList35],
+
+
+ ?line {STRes36,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgR016.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList37 = [STRes36|STResList36],
+
+
+ ?line {STRes37,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgR017.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList38 = [STRes37|STResList37],
+
+
+ ?line {STRes38,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgR018.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList39 = [STRes38|STResList38],
+
+
+ ?line {STRes39,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgR019.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList40 = [STRes39|STResList39],
+
+
+ ?line {STRes40,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgR020.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList41 = [STRes40|STResList40],
+
+
+ ?line {STRes41,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgR021.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList42 = [STRes41|STResList41],
+
+
+ ?line {STRes42,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/ModelGroups/mgR022.xsd','./msxsdtest/ModelGroups',invalid),
+ STResList43 = [STRes42|STResList42],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList43,ITResList13).
+
+%% Deterministic Sequences.
+
+mgS(Config) when is_list(Config) ->
+
+
+
+
+
+
+
+
+ xmerl_xsd_lib:compare_test_results(Config,[],[]).
+
+%% 3.9.1 The Particle Schema Component.
+
+particlesAB(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesA001.xsd','./msxsdtest/Particles',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesA001.xml','./msxsdtest/Particles',invalid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesA002.xsd','./msxsdtest/Particles',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesA002.xml','./msxsdtest/Particles',valid,S1),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesA003.xsd','./msxsdtest/Particles',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesA003.xml','./msxsdtest/Particles',invalid,S2),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesA004.xsd','./msxsdtest/Particles',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesA004.xml','./msxsdtest/Particles',invalid,S3),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesA005.xsd','./msxsdtest/Particles',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesA005.xml','./msxsdtest/Particles',invalid,S4),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesA006.xsd','./msxsdtest/Particles',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesA006.xml','./msxsdtest/Particles',valid,S5),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesA007.xsd','./msxsdtest/Particles',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesA007.xml','./msxsdtest/Particles',valid,S6),
+ ITResList7 = [ITRes6|ITResList6],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesA008.xsd','./msxsdtest/Particles',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesA008.xml','./msxsdtest/Particles',invalid,S7),
+ ITResList8 = [ITRes7|ITResList7],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesA009.xsd','./msxsdtest/Particles',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesA009.xml','./msxsdtest/Particles',invalid,S8),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesA010.xsd','./msxsdtest/Particles',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesA010.xml','./msxsdtest/Particles',valid,S9),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesA011.xsd','./msxsdtest/Particles',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesA011.xml','./msxsdtest/Particles',valid,S10),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesA012.xsd','./msxsdtest/Particles',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesA012.xml','./msxsdtest/Particles',invalid,S11),
+ ITResList12 = [ITRes11|ITResList11],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesA013.xsd','./msxsdtest/Particles',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesA013.xml','./msxsdtest/Particles',invalid,S12),
+ ITResList13 = [ITRes12|ITResList12],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesA014.xsd','./msxsdtest/Particles',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesA014.xml','./msxsdtest/Particles',valid,S13),
+ ITResList14 = [ITRes13|ITResList13],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesA015.xsd','./msxsdtest/Particles',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesA015.xml','./msxsdtest/Particles',valid,S14),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesB001.xsd','./msxsdtest/Particles',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesB001.xml','./msxsdtest/Particles',invalid,S15),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesB002.xsd','./msxsdtest/Particles',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesB002.xml','./msxsdtest/Particles',valid,S16),
+ ITResList17 = [ITRes16|ITResList16],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesB003.xsd','./msxsdtest/Particles',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesB003.xml','./msxsdtest/Particles',invalid,S17),
+ ITResList18 = [ITRes17|ITResList17],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesB004.xsd','./msxsdtest/Particles',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesB004.xml','./msxsdtest/Particles',invalid,S18),
+ ITResList19 = [ITRes18|ITResList18],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesB005.xsd','./msxsdtest/Particles',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesB005.xml','./msxsdtest/Particles',valid,S19),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesB006.xsd','./msxsdtest/Particles',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesB006.xml','./msxsdtest/Particles',valid,S20),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesB007.xsd','./msxsdtest/Particles',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesB007.xml','./msxsdtest/Particles',invalid,S21),
+ ITResList22 = [ITRes21|ITResList21],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesB008.xsd','./msxsdtest/Particles',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesB008.xml','./msxsdtest/Particles',invalid,S22),
+ ITResList23 = [ITRes22|ITResList22],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesB009.xsd','./msxsdtest/Particles',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesB009.xml','./msxsdtest/Particles',valid,S23),
+ ITResList24 = [ITRes23|ITResList23],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesB010.xsd','./msxsdtest/Particles',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesB010.xml','./msxsdtest/Particles',valid,S24),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesB011.xsd','./msxsdtest/Particles',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesB011.xml','./msxsdtest/Particles',invalid,S25),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesB012.xsd','./msxsdtest/Particles',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesB012.xml','./msxsdtest/Particles',invalid,S26),
+ ITResList27 = [ITRes26|ITResList26],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesB013.xsd','./msxsdtest/Particles',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesB013.xml','./msxsdtest/Particles',valid,S27),
+ ITResList28 = [ITRes27|ITResList27],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesB014.xsd','./msxsdtest/Particles',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesB014.xml','./msxsdtest/Particles',valid,S28),
+ ITResList29 = [ITRes28|ITResList28],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesB015.xsd','./msxsdtest/Particles',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesB015.xml','./msxsdtest/Particles',invalid,S29),
+ ITResList30 = [ITRes29|ITResList29],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList30,ITResList30).
+
+%% 3.9.4 Particle Validation Rules: Element Sequence Locally Valid.
+
+particlesCDE(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC001.xsd','./msxsdtest/Particles',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC001.xml','./msxsdtest/Particles',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC002.xsd','./msxsdtest/Particles',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC002.xml','./msxsdtest/Particles',valid,S1),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC003.xsd','./msxsdtest/Particles',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC003.xml','./msxsdtest/Particles',valid,S2),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC004.xsd','./msxsdtest/Particles',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC004.xml','./msxsdtest/Particles',valid,S3),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC005.xsd','./msxsdtest/Particles',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC005.xml','./msxsdtest/Particles',valid,S4),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC006.xsd','./msxsdtest/Particles',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC006.xml','./msxsdtest/Particles',valid,S5),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC007.xsd','./msxsdtest/Particles',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC007.xml','./msxsdtest/Particles',invalid,S6),
+ ITResList7 = [ITRes6|ITResList6],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC008.xsd','./msxsdtest/Particles',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC008.xml','./msxsdtest/Particles',valid,S7),
+ ITResList8 = [ITRes7|ITResList7],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC009.xsd','./msxsdtest/Particles',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC009.xml','./msxsdtest/Particles',valid,S8),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC010.xsd','./msxsdtest/Particles',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC010.xml','./msxsdtest/Particles',valid,S9),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC011.xsd','./msxsdtest/Particles',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC011.xml','./msxsdtest/Particles',valid,S10),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC012.xsd','./msxsdtest/Particles',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC012.xml','./msxsdtest/Particles',invalid,S11),
+ ITResList12 = [ITRes11|ITResList11],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC013.xsd','./msxsdtest/Particles',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC013.xml','./msxsdtest/Particles',invalid,S12),
+ ITResList13 = [ITRes12|ITResList12],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC014.xsd','./msxsdtest/Particles',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC014.xml','./msxsdtest/Particles',invalid,S13),
+ ITResList14 = [ITRes13|ITResList13],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC015.xsd','./msxsdtest/Particles',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC015.xml','./msxsdtest/Particles',valid,S14),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC016.xsd','./msxsdtest/Particles',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC016.xml','./msxsdtest/Particles',valid,S15),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC017.xsd','./msxsdtest/Particles',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC017.xml','./msxsdtest/Particles',invalid,S16),
+ ITResList17 = [ITRes16|ITResList16],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC018.xsd','./msxsdtest/Particles',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC018.xml','./msxsdtest/Particles',invalid,S17),
+ ITResList18 = [ITRes17|ITResList17],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC019.xsd','./msxsdtest/Particles',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC019.xml','./msxsdtest/Particles',invalid,S18),
+ ITResList19 = [ITRes18|ITResList18],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC020.xsd','./msxsdtest/Particles',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC020.xml','./msxsdtest/Particles',invalid,S19),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC021.xsd','./msxsdtest/Particles',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC021.xml','./msxsdtest/Particles',valid,S20),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC022.xsd','./msxsdtest/Particles',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC022.xml','./msxsdtest/Particles',invalid,S21),
+ ITResList22 = [ITRes21|ITResList21],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC023.xsd','./msxsdtest/Particles',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC023.xml','./msxsdtest/Particles',invalid,S22),
+ ITResList23 = [ITRes22|ITResList22],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC024.xsd','./msxsdtest/Particles',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC024.xml','./msxsdtest/Particles',invalid,S23),
+ ITResList24 = [ITRes23|ITResList23],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC025.xsd','./msxsdtest/Particles',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC025.xml','./msxsdtest/Particles',invalid,S24),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC026.xsd','./msxsdtest/Particles',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC026.xml','./msxsdtest/Particles',invalid,S25),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC027.xsd','./msxsdtest/Particles',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC027.xml','./msxsdtest/Particles',valid,S26),
+ ITResList27 = [ITRes26|ITResList26],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC028.xsd','./msxsdtest/Particles',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC028.xml','./msxsdtest/Particles',valid,S27),
+ ITResList28 = [ITRes27|ITResList27],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC029.xsd','./msxsdtest/Particles',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC029.xml','./msxsdtest/Particles',valid,S28),
+ ITResList29 = [ITRes28|ITResList28],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC030.xsd','./msxsdtest/Particles',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC030.xml','./msxsdtest/Particles',valid,S29),
+ ITResList30 = [ITRes29|ITResList29],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC031.xsd','./msxsdtest/Particles',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC031.xml','./msxsdtest/Particles',invalid,S30),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes31,S31} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC032.xsd','./msxsdtest/Particles',valid),
+ STResList32 = [STRes31|STResList31],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC032.xml','./msxsdtest/Particles',invalid,S31),
+ ITResList32 = [ITRes31|ITResList31],
+
+
+ ?line {STRes32,S32} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC033.xsd','./msxsdtest/Particles',valid),
+ STResList33 = [STRes32|STResList32],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC033.xml','./msxsdtest/Particles',invalid,S32),
+ ITResList33 = [ITRes32|ITResList32],
+
+
+ ?line {STRes33,S33} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC034.xsd','./msxsdtest/Particles',valid),
+ STResList34 = [STRes33|STResList33],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC034.xml','./msxsdtest/Particles',valid,S33),
+ ITResList34 = [ITRes33|ITResList33],
+
+
+ ?line {STRes34,S34} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC035.xsd','./msxsdtest/Particles',valid),
+ STResList35 = [STRes34|STResList34],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC035.xml','./msxsdtest/Particles',invalid,S34),
+ ITResList35 = [ITRes34|ITResList34],
+
+
+ ?line {STRes35,S35} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC036.xsd','./msxsdtest/Particles',valid),
+ STResList36 = [STRes35|STResList35],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC036.xml','./msxsdtest/Particles',invalid,S35),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes36,S36} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC037.xsd','./msxsdtest/Particles',valid),
+ STResList37 = [STRes36|STResList36],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC037.xml','./msxsdtest/Particles',valid,S36),
+ ITResList37 = [ITRes36|ITResList36],
+
+
+ ?line {STRes37,S37} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC038.xsd','./msxsdtest/Particles',valid),
+ STResList38 = [STRes37|STResList37],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC038.xml','./msxsdtest/Particles',invalid,S37),
+ ITResList38 = [ITRes37|ITResList37],
+
+
+ ?line {STRes38,S38} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC039.xsd','./msxsdtest/Particles',valid),
+ STResList39 = [STRes38|STResList38],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC039.xml','./msxsdtest/Particles',invalid,S38),
+ ITResList39 = [ITRes38|ITResList38],
+
+
+ ?line {STRes39,S39} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC040.xsd','./msxsdtest/Particles',valid),
+ STResList40 = [STRes39|STResList39],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC040.xml','./msxsdtest/Particles',valid,S39),
+ ITResList40 = [ITRes39|ITResList39],
+
+
+ ?line {STRes40,S40} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC041.xsd','./msxsdtest/Particles',valid),
+ STResList41 = [STRes40|STResList40],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC041.xml','./msxsdtest/Particles',valid,S40),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes41,S41} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC042.xsd','./msxsdtest/Particles',valid),
+ STResList42 = [STRes41|STResList41],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC042.xml','./msxsdtest/Particles',invalid,S41),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes42,S42} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC043.xsd','./msxsdtest/Particles',valid),
+ STResList43 = [STRes42|STResList42],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC043.xml','./msxsdtest/Particles',valid,S42),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes43,S43} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC044.xsd','./msxsdtest/Particles',valid),
+ STResList44 = [STRes43|STResList43],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC044.xml','./msxsdtest/Particles',valid,S43),
+ ITResList44 = [ITRes43|ITResList43],
+
+
+ ?line {STRes44,S44} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC045.xsd','./msxsdtest/Particles',valid),
+ STResList45 = [STRes44|STResList44],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC045.xml','./msxsdtest/Particles',valid,S44),
+ ITResList45 = [ITRes44|ITResList44],
+
+
+ ?line {STRes45,S45} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC046.xsd','./msxsdtest/Particles',valid),
+ STResList46 = [STRes45|STResList45],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC046.xml','./msxsdtest/Particles',valid,S45),
+ ITResList46 = [ITRes45|ITResList45],
+
+
+ ?line {STRes46,S46} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC047.xsd','./msxsdtest/Particles',valid),
+ STResList47 = [STRes46|STResList46],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC047.xml','./msxsdtest/Particles',invalid,S46),
+ ITResList47 = [ITRes46|ITResList46],
+
+
+ ?line {STRes47,S47} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesC048.xsd','./msxsdtest/Particles',valid),
+ STResList48 = [STRes47|STResList47],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesC048.xml','./msxsdtest/Particles',invalid,S47),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes48,S48} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDa001.xsd','./msxsdtest/Particles',valid),
+ STResList49 = [STRes48|STResList48],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDa001.xml','./msxsdtest/Particles',invalid,S48),
+ ITResList49 = [ITRes48|ITResList48],
+
+
+ ?line {STRes49,S49} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDa002.xsd','./msxsdtest/Particles',valid),
+ STResList50 = [STRes49|STResList49],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDa002.xml','./msxsdtest/Particles',valid,S49),
+ ITResList50 = [ITRes49|ITResList49],
+
+
+ ?line {STRes50,S50} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDa003.xsd','./msxsdtest/Particles',valid),
+ STResList51 = [STRes50|STResList50],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDa003.xml','./msxsdtest/Particles',invalid,S50),
+ ITResList51 = [ITRes50|ITResList50],
+
+
+ ?line {STRes51,S51} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDa004.xsd','./msxsdtest/Particles',valid),
+ STResList52 = [STRes51|STResList51],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDa004.xml','./msxsdtest/Particles',invalid,S51),
+ ITResList52 = [ITRes51|ITResList51],
+
+
+ ?line {STRes52,S52} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDa005.xsd','./msxsdtest/Particles',valid),
+ STResList53 = [STRes52|STResList52],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDa005.xml','./msxsdtest/Particles',invalid,S52),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes53,S53} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDa006.xsd','./msxsdtest/Particles',valid),
+ STResList54 = [STRes53|STResList53],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDa006.xml','./msxsdtest/Particles',invalid,S53),
+ ITResList54 = [ITRes53|ITResList53],
+
+
+ ?line {STRes54,S54} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDa007.xsd','./msxsdtest/Particles',valid),
+ STResList55 = [STRes54|STResList54],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDa007.xml','./msxsdtest/Particles',valid,S54),
+ ITResList55 = [ITRes54|ITResList54],
+
+
+ ?line {STRes55,S55} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDa008.xsd','./msxsdtest/Particles',valid),
+ STResList56 = [STRes55|STResList55],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDa008.xml','./msxsdtest/Particles',invalid,S55),
+ ITResList56 = [ITRes55|ITResList55],
+
+
+ ?line {STRes56,S56} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDa009.xsd','./msxsdtest/Particles',valid),
+ STResList57 = [STRes56|STResList56],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDa009.xml','./msxsdtest/Particles',invalid,S56),
+ ITResList57 = [ITRes56|ITResList56],
+
+
+ ?line {STRes57,S57} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDa010.xsd','./msxsdtest/Particles',valid),
+ STResList58 = [STRes57|STResList57],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDa010.xml','./msxsdtest/Particles',invalid,S57),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes58,S58} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDa011.xsd','./msxsdtest/Particles',valid),
+ STResList59 = [STRes58|STResList58],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDa011.xml','./msxsdtest/Particles',invalid,S58),
+ ITResList59 = [ITRes58|ITResList58],
+
+
+ ?line {STRes59,S59} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDb001.xsd','./msxsdtest/Particles',valid),
+ STResList60 = [STRes59|STResList59],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDb001.xml','./msxsdtest/Particles',invalid,S59),
+ ITResList60 = [ITRes59|ITResList59],
+
+
+ ?line {STRes60,S60} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDb002.xsd','./msxsdtest/Particles',valid),
+ STResList61 = [STRes60|STResList60],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDb002.xml','./msxsdtest/Particles',valid,S60),
+ ITResList61 = [ITRes60|ITResList60],
+
+
+ ?line {STRes61,S61} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDb003.xsd','./msxsdtest/Particles',valid),
+ STResList62 = [STRes61|STResList61],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDb003.xml','./msxsdtest/Particles',invalid,S61),
+ ITResList62 = [ITRes61|ITResList61],
+
+
+ ?line {STRes62,S62} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDb004.xsd','./msxsdtest/Particles',valid),
+ STResList63 = [STRes62|STResList62],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDb004.xml','./msxsdtest/Particles',invalid,S62),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes63,S63} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDb005.xsd','./msxsdtest/Particles',valid),
+ STResList64 = [STRes63|STResList63],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDb005.xml','./msxsdtest/Particles',invalid,S63),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes64,S64} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDb006.xsd','./msxsdtest/Particles',valid),
+ STResList65 = [STRes64|STResList64],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDb006.xml','./msxsdtest/Particles',invalid,S64),
+ ITResList65 = [ITRes64|ITResList64],
+
+
+ ?line {STRes65,S65} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDb007.xsd','./msxsdtest/Particles',valid),
+ STResList66 = [STRes65|STResList65],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDb007.xml','./msxsdtest/Particles',valid,S65),
+ ITResList66 = [ITRes65|ITResList65],
+
+
+ ?line {STRes66,S66} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDb008.xsd','./msxsdtest/Particles',valid),
+ STResList67 = [STRes66|STResList66],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDb008.xml','./msxsdtest/Particles',invalid,S66),
+ ITResList67 = [ITRes66|ITResList66],
+
+
+ ?line {STRes67,S67} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDb009.xsd','./msxsdtest/Particles',valid),
+ STResList68 = [STRes67|STResList67],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDb009.xml','./msxsdtest/Particles',invalid,S67),
+ ITResList68 = [ITRes67|ITResList67],
+
+
+ ?line {STRes68,S68} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDb010.xsd','./msxsdtest/Particles',valid),
+ STResList69 = [STRes68|STResList68],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDb010.xml','./msxsdtest/Particles',invalid,S68),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes69,S69} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDb011.xsd','./msxsdtest/Particles',valid),
+ STResList70 = [STRes69|STResList69],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDb011.xml','./msxsdtest/Particles',invalid,S69),
+ ITResList70 = [ITRes69|ITResList69],
+
+
+ ?line {STRes70,S70} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDc001.xsd','./msxsdtest/Particles',valid),
+ STResList71 = [STRes70|STResList70],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDc001.xml','./msxsdtest/Particles',valid,S70),
+ ITResList71 = [ITRes70|ITResList70],
+
+
+ ?line {STRes71,S71} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDc002.xsd','./msxsdtest/Particles',valid),
+ STResList72 = [STRes71|STResList71],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDc002.xml','./msxsdtest/Particles',valid,S71),
+ ITResList72 = [ITRes71|ITResList71],
+
+
+ ?line {STRes72,S72} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDc003.xsd','./msxsdtest/Particles',valid),
+ STResList73 = [STRes72|STResList72],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDc003.xml','./msxsdtest/Particles',valid,S72),
+ ITResList73 = [ITRes72|ITResList72],
+
+
+ ?line {STRes73,S73} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDc004.xsd','./msxsdtest/Particles',valid),
+ STResList74 = [STRes73|STResList73],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDc004.xml','./msxsdtest/Particles',valid,S73),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes74,S74} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDc005.xsd','./msxsdtest/Particles',valid),
+ STResList75 = [STRes74|STResList74],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDc005.xml','./msxsdtest/Particles',valid,S74),
+ ITResList75 = [ITRes74|ITResList74],
+
+
+ ?line {STRes75,S75} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDc006.xsd','./msxsdtest/Particles',valid),
+ STResList76 = [STRes75|STResList75],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDc006.xml','./msxsdtest/Particles',valid,S75),
+ ITResList76 = [ITRes75|ITResList75],
+
+
+ ?line {STRes76,S76} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDc007.xsd','./msxsdtest/Particles',valid),
+ STResList77 = [STRes76|STResList76],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDc007.xml','./msxsdtest/Particles',valid,S76),
+ ITResList77 = [ITRes76|ITResList76],
+
+
+ ?line {STRes77,S77} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDc008.xsd','./msxsdtest/Particles',valid),
+ STResList78 = [STRes77|STResList77],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDc008.xml','./msxsdtest/Particles',valid,S77),
+ ITResList78 = [ITRes77|ITResList77],
+
+
+ ?line {STRes78,S78} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesDc009.xsd','./msxsdtest/Particles',valid),
+ STResList79 = [STRes78|STResList78],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesDc009.xml','./msxsdtest/Particles',valid,S78),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes79,S79} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa001.xsd','./msxsdtest/Particles',valid),
+ STResList80 = [STRes79|STResList79],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEa001.xml','./msxsdtest/Particles',valid,S79),
+ ITResList80 = [ITRes79|ITResList79],
+
+
+ ?line {STRes80,S80} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa002.xsd','./msxsdtest/Particles',valid),
+ STResList81 = [STRes80|STResList80],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEa002.xml','./msxsdtest/Particles',invalid,S80),
+ ITResList81 = [ITRes80|ITResList80],
+
+
+ ?line {STRes81,S81} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa003.xsd','./msxsdtest/Particles',valid),
+ STResList82 = [STRes81|STResList81],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEa003.xml','./msxsdtest/Particles',valid,S81),
+ ITResList82 = [ITRes81|ITResList81],
+
+
+ ?line {STRes82,S82} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa004.xsd','./msxsdtest/Particles',valid),
+ STResList83 = [STRes82|STResList82],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEa004.xml','./msxsdtest/Particles',valid,S82),
+ ITResList83 = [ITRes82|ITResList82],
+
+
+ ?line {STRes83,S83} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa005.xsd','./msxsdtest/Particles',valid),
+ STResList84 = [STRes83|STResList83],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEa005.xml','./msxsdtest/Particles',invalid,S83),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes84,S84} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa006.xsd','./msxsdtest/Particles',valid),
+ STResList85 = [STRes84|STResList84],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEa006.xml','./msxsdtest/Particles',invalid,S84),
+ ITResList85 = [ITRes84|ITResList84],
+
+
+ ?line {STRes85,S85} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa007.xsd','./msxsdtest/Particles',valid),
+ STResList86 = [STRes85|STResList85],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEa007.xml','./msxsdtest/Particles',invalid,S85),
+ ITResList86 = [ITRes85|ITResList85],
+
+
+ ?line {STRes86,S86} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa008.xsd','./msxsdtest/Particles',valid),
+ STResList87 = [STRes86|STResList86],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEa008.xml','./msxsdtest/Particles',valid,S86),
+ ITResList87 = [ITRes86|ITResList86],
+
+
+ ?line {STRes87,S87} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa009.xsd','./msxsdtest/Particles',valid),
+ STResList88 = [STRes87|STResList87],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEa009.xml','./msxsdtest/Particles',invalid,S87),
+ ITResList88 = [ITRes87|ITResList87],
+
+
+ ?line {STRes88,S88} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa010.xsd','./msxsdtest/Particles',valid),
+ STResList89 = [STRes88|STResList88],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEa010.xml','./msxsdtest/Particles',valid,S88),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes89,S89} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa011.xsd','./msxsdtest/Particles',valid),
+ STResList90 = [STRes89|STResList89],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEa011.xml','./msxsdtest/Particles',valid,S89),
+ ITResList90 = [ITRes89|ITResList89],
+
+
+ ?line {STRes90,S90} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa012.xsd','./msxsdtest/Particles',valid),
+ STResList91 = [STRes90|STResList90],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEa012.xml','./msxsdtest/Particles',invalid,S90),
+ ITResList91 = [ITRes90|ITResList90],
+
+
+ ?line {STRes91,S91} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa013.xsd','./msxsdtest/Particles',valid),
+ STResList92 = [STRes91|STResList91],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEa013.xml','./msxsdtest/Particles',invalid,S91),
+ ITResList92 = [ITRes91|ITResList91],
+
+
+ ?line {STRes92,S92} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa014.xsd','./msxsdtest/Particles',valid),
+ STResList93 = [STRes92|STResList92],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEa014.xml','./msxsdtest/Particles',invalid,S92),
+ ITResList93 = [ITRes92|ITResList92],
+
+
+ ?line {STRes93,S93} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa015.xsd','./msxsdtest/Particles',valid),
+ STResList94 = [STRes93|STResList93],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEa015.xml','./msxsdtest/Particles',valid,S93),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes94,S94} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa016.xsd','./msxsdtest/Particles',valid),
+ STResList95 = [STRes94|STResList94],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEa016.xml','./msxsdtest/Particles',invalid,S94),
+ ITResList95 = [ITRes94|ITResList94],
+
+
+ ?line {STRes95,S95} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa017.xsd','./msxsdtest/Particles',valid),
+ STResList96 = [STRes95|STResList95],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEa017.xml','./msxsdtest/Particles',valid,S95),
+ ITResList96 = [ITRes95|ITResList95],
+
+
+ ?line {STRes96,S96} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa018.xsd','./msxsdtest/Particles',valid),
+ STResList97 = [STRes96|STResList96],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEa018.xml','./msxsdtest/Particles',valid,S96),
+ ITResList97 = [ITRes96|ITResList96],
+
+
+ ?line {STRes97,S97} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa019.xsd','./msxsdtest/Particles',valid),
+ STResList98 = [STRes97|STResList97],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEa019.xml','./msxsdtest/Particles',invalid,S97),
+ ITResList98 = [ITRes97|ITResList97],
+
+
+ ?line {STRes98,S98} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa020.xsd','./msxsdtest/Particles',valid),
+ STResList99 = [STRes98|STResList98],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEa020.xml','./msxsdtest/Particles',invalid,S98),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes99,S99} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa021.xsd','./msxsdtest/Particles',valid),
+ STResList100 = [STRes99|STResList99],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEa021.xml','./msxsdtest/Particles',invalid,S99),
+ ITResList100 = [ITRes99|ITResList99],
+
+
+ ?line {STRes100,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa022.xsd','./msxsdtest/Particles',invalid),
+ STResList101 = [STRes100|STResList100],
+
+
+ ?line {STRes101,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa023.xsd','./msxsdtest/Particles',invalid),
+ STResList102 = [STRes101|STResList101],
+
+
+ ?line {STRes102,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa024.xsd','./msxsdtest/Particles',invalid),
+ STResList103 = [STRes102|STResList102],
+
+
+ ?line {STRes103,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEa025.xsd','./msxsdtest/Particles',invalid),
+ STResList104 = [STRes103|STResList103],
+
+
+ ?line {STRes104,S104} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb001.xsd','./msxsdtest/Particles',valid),
+ STResList105 = [STRes104|STResList104],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb001.xml','./msxsdtest/Particles',valid,S104),
+ ITResList101 = [ITRes100|ITResList100],
+
+
+ ?line {STRes105,S105} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb002.xsd','./msxsdtest/Particles',valid),
+ STResList106 = [STRes105|STResList105],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb002.xml','./msxsdtest/Particles',invalid,S105),
+ ITResList102 = [ITRes101|ITResList101],
+
+
+ ?line {STRes106,S106} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb003.xsd','./msxsdtest/Particles',valid),
+ STResList107 = [STRes106|STResList106],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb003.xml','./msxsdtest/Particles',valid,S106),
+ ITResList103 = [ITRes102|ITResList102],
+
+
+ ?line {STRes107,S107} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb004.xsd','./msxsdtest/Particles',valid),
+ STResList108 = [STRes107|STResList107],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb004.xml','./msxsdtest/Particles',invalid,S107),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes108,S108} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb005.xsd','./msxsdtest/Particles',valid),
+ STResList109 = [STRes108|STResList108],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb005.xml','./msxsdtest/Particles',invalid,S108),
+ ITResList105 = [ITRes104|ITResList104],
+
+
+ ?line {STRes109,S109} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb006.xsd','./msxsdtest/Particles',valid),
+ STResList110 = [STRes109|STResList109],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb006.xml','./msxsdtest/Particles',invalid,S109),
+ ITResList106 = [ITRes105|ITResList105],
+
+
+ ?line {STRes110,S110} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb007.xsd','./msxsdtest/Particles',valid),
+ STResList111 = [STRes110|STResList110],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb007.xml','./msxsdtest/Particles',invalid,S110),
+ ITResList107 = [ITRes106|ITResList106],
+
+
+ ?line {STRes111,S111} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb008.xsd','./msxsdtest/Particles',valid),
+ STResList112 = [STRes111|STResList111],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb008.xml','./msxsdtest/Particles',invalid,S111),
+ ITResList108 = [ITRes107|ITResList107],
+
+
+ ?line {STRes112,S112} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb009.xsd','./msxsdtest/Particles',valid),
+ STResList113 = [STRes112|STResList112],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb009.xml','./msxsdtest/Particles',invalid,S112),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes113,S113} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb010.xsd','./msxsdtest/Particles',valid),
+ STResList114 = [STRes113|STResList113],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb010.xml','./msxsdtest/Particles',valid,S113),
+ ITResList110 = [ITRes109|ITResList109],
+
+
+ ?line {STRes114,S114} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb011.xsd','./msxsdtest/Particles',valid),
+ STResList115 = [STRes114|STResList114],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb011.xml','./msxsdtest/Particles',invalid,S114),
+ ITResList111 = [ITRes110|ITResList110],
+
+
+ ?line {STRes115,S115} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb012.xsd','./msxsdtest/Particles',valid),
+ STResList116 = [STRes115|STResList115],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb012.xml','./msxsdtest/Particles',invalid,S115),
+ ITResList112 = [ITRes111|ITResList111],
+
+
+ ?line {STRes116,S116} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb013.xsd','./msxsdtest/Particles',valid),
+ STResList117 = [STRes116|STResList116],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb013.xml','./msxsdtest/Particles',invalid,S116),
+ ITResList113 = [ITRes112|ITResList112],
+
+
+ ?line {STRes117,S117} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb014.xsd','./msxsdtest/Particles',valid),
+ STResList118 = [STRes117|STResList117],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb014.xml','./msxsdtest/Particles',invalid,S117),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes118,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb015.xsd','./msxsdtest/Particles',invalid),
+ STResList119 = [STRes118|STResList118],
+
+
+ ?line {STRes119,S119} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb016.xsd','./msxsdtest/Particles',valid),
+ STResList120 = [STRes119|STResList119],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb016.xml','./msxsdtest/Particles',valid,S119),
+ ITResList115 = [ITRes114|ITResList114],
+
+
+ ?line {STRes120,S120} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb017.xsd','./msxsdtest/Particles',valid),
+ STResList121 = [STRes120|STResList120],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb017.xml','./msxsdtest/Particles',invalid,S120),
+ ITResList116 = [ITRes115|ITResList115],
+
+
+ ?line {STRes121,S121} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb018.xsd','./msxsdtest/Particles',valid),
+ STResList122 = [STRes121|STResList121],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb018.xml','./msxsdtest/Particles',invalid,S121),
+ ITResList117 = [ITRes116|ITResList116],
+
+
+ ?line {STRes122,S122} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb019.xsd','./msxsdtest/Particles',valid),
+ STResList123 = [STRes122|STResList122],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb019.xml','./msxsdtest/Particles',valid,S122),
+ ITResList118 = [ITRes117|ITResList117],
+
+
+ ?line {STRes123,S123} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb020.xsd','./msxsdtest/Particles',valid),
+ STResList124 = [STRes123|STResList123],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb020.xml','./msxsdtest/Particles',invalid,S123),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes124,S124} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb021.xsd','./msxsdtest/Particles',valid),
+ STResList125 = [STRes124|STResList124],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb021.xml','./msxsdtest/Particles',invalid,S124),
+ ITResList120 = [ITRes119|ITResList119],
+
+
+ ?line {STRes125,S125} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb022.xsd','./msxsdtest/Particles',valid),
+ STResList126 = [STRes125|STResList125],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb022.xml','./msxsdtest/Particles',invalid,S125),
+ ITResList121 = [ITRes120|ITResList120],
+
+
+ ?line {STRes126,S126} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb023.xsd','./msxsdtest/Particles',valid),
+ STResList127 = [STRes126|STResList126],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb023.xml','./msxsdtest/Particles',invalid,S126),
+ ITResList122 = [ITRes121|ITResList121],
+
+
+ ?line {STRes127,S127} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb024.xsd','./msxsdtest/Particles',valid),
+ STResList128 = [STRes127|STResList127],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb024.xml','./msxsdtest/Particles',invalid,S127),
+ ITResList123 = [ITRes122|ITResList122],
+
+
+ ?line {STRes128,S128} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb025.xsd','./msxsdtest/Particles',valid),
+ STResList129 = [STRes128|STResList128],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb025.xml','./msxsdtest/Particles',invalid,S128),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes129,S129} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb026.xsd','./msxsdtest/Particles',valid),
+ STResList130 = [STRes129|STResList129],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb026.xml','./msxsdtest/Particles',valid,S129),
+ ITResList125 = [ITRes124|ITResList124],
+
+
+ ?line {STRes130,S130} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb027.xsd','./msxsdtest/Particles',valid),
+ STResList131 = [STRes130|STResList130],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb027.xml','./msxsdtest/Particles',valid,S130),
+ ITResList126 = [ITRes125|ITResList125],
+
+
+ ?line {STRes131,S131} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb028.xsd','./msxsdtest/Particles',valid),
+ STResList132 = [STRes131|STResList131],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb028.xml','./msxsdtest/Particles',invalid,S131),
+ ITResList127 = [ITRes126|ITResList126],
+
+
+ ?line {STRes132,S132} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb029.xsd','./msxsdtest/Particles',valid),
+ STResList133 = [STRes132|STResList132],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb029.xml','./msxsdtest/Particles',invalid,S132),
+ ITResList128 = [ITRes127|ITResList127],
+
+
+ ?line {STRes133,S133} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb030.xsd','./msxsdtest/Particles',valid),
+ STResList134 = [STRes133|STResList133],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb030.xml','./msxsdtest/Particles',invalid,S133),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes134,S134} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb031.xsd','./msxsdtest/Particles',valid),
+ STResList135 = [STRes134|STResList134],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb031.xml','./msxsdtest/Particles',invalid,S134),
+ ITResList130 = [ITRes129|ITResList129],
+
+
+ ?line {STRes135,S135} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb032.xsd','./msxsdtest/Particles',valid),
+ STResList136 = [STRes135|STResList135],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb032.xml','./msxsdtest/Particles',invalid,S135),
+ ITResList131 = [ITRes130|ITResList130],
+
+
+ ?line {STRes136,S136} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb033.xsd','./msxsdtest/Particles',valid),
+ STResList137 = [STRes136|STResList136],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb033.xml','./msxsdtest/Particles',invalid,S136),
+ ITResList132 = [ITRes131|ITResList131],
+
+
+ ?line {STRes137,S137} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb034.xsd','./msxsdtest/Particles',valid),
+ STResList138 = [STRes137|STResList137],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb034.xml','./msxsdtest/Particles',invalid,S137),
+ ITResList133 = [ITRes132|ITResList132],
+
+
+ ?line {STRes138,S138} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb035.xsd','./msxsdtest/Particles',valid),
+ STResList139 = [STRes138|STResList138],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb035.xml','./msxsdtest/Particles',invalid,S138),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes139,S139} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb036.xsd','./msxsdtest/Particles',valid),
+ STResList140 = [STRes139|STResList139],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb036.xml','./msxsdtest/Particles',valid,S139),
+ ITResList135 = [ITRes134|ITResList134],
+
+
+ ?line {STRes140,S140} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb037.xsd','./msxsdtest/Particles',valid),
+ STResList141 = [STRes140|STResList140],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb037.xml','./msxsdtest/Particles',invalid,S140),
+ ITResList136 = [ITRes135|ITResList135],
+
+
+ ?line {STRes141,S141} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb038.xsd','./msxsdtest/Particles',valid),
+ STResList142 = [STRes141|STResList141],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb038.xml','./msxsdtest/Particles',valid,S141),
+ ITResList137 = [ITRes136|ITResList136],
+
+
+ ?line {STRes142,S142} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEb039.xsd','./msxsdtest/Particles',valid),
+ STResList143 = [STRes142|STResList142],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEb039.xml','./msxsdtest/Particles',invalid,S142),
+ ITResList138 = [ITRes137|ITResList137],
+
+
+ ?line {STRes143,S143} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc001.xsd','./msxsdtest/Particles',valid),
+ STResList144 = [STRes143|STResList143],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc001.xml','./msxsdtest/Particles',valid,S143),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ ?line {STRes144,S144} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc002.xsd','./msxsdtest/Particles',valid),
+ STResList145 = [STRes144|STResList144],
+ ?line ITRes139 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc002.xml','./msxsdtest/Particles',valid,S144),
+ ITResList140 = [ITRes139|ITResList139],
+
+
+ ?line {STRes145,S145} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc003.xsd','./msxsdtest/Particles',valid),
+ STResList146 = [STRes145|STResList145],
+ ?line ITRes140 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc003.xml','./msxsdtest/Particles',invalid,S145),
+ ITResList141 = [ITRes140|ITResList140],
+
+
+ ?line {STRes146,S146} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc004.xsd','./msxsdtest/Particles',valid),
+ STResList147 = [STRes146|STResList146],
+ ?line ITRes141 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc004.xml','./msxsdtest/Particles',invalid,S146),
+ ITResList142 = [ITRes141|ITResList141],
+
+
+ ?line {STRes147,S147} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc005.xsd','./msxsdtest/Particles',valid),
+ STResList148 = [STRes147|STResList147],
+ ?line ITRes142 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc005.xml','./msxsdtest/Particles',invalid,S147),
+ ITResList143 = [ITRes142|ITResList142],
+
+
+ ?line {STRes148,S148} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc006.xsd','./msxsdtest/Particles',valid),
+ STResList149 = [STRes148|STResList148],
+ ?line ITRes143 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc006.xml','./msxsdtest/Particles',valid,S148),
+ ITResList144 = [ITRes143|ITResList143],
+
+
+ ?line {STRes149,S149} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc007.xsd','./msxsdtest/Particles',valid),
+ STResList150 = [STRes149|STResList149],
+ ?line ITRes144 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc007.xml','./msxsdtest/Particles',invalid,S149),
+ ITResList145 = [ITRes144|ITResList144],
+
+
+ ?line {STRes150,S150} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc008.xsd','./msxsdtest/Particles',valid),
+ STResList151 = [STRes150|STResList150],
+ ?line ITRes145 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc008.xml','./msxsdtest/Particles',invalid,S150),
+ ITResList146 = [ITRes145|ITResList145],
+
+
+ ?line {STRes151,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc009.xsd','./msxsdtest/Particles',invalid),
+ STResList152 = [STRes151|STResList151],
+
+
+ ?line {STRes152,S152} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc010.xsd','./msxsdtest/Particles',valid),
+ STResList153 = [STRes152|STResList152],
+ ?line ITRes146 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc010.xml','./msxsdtest/Particles',valid,S152),
+ ITResList147 = [ITRes146|ITResList146],
+
+
+ ?line {STRes153,S153} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc011.xsd','./msxsdtest/Particles',valid),
+ STResList154 = [STRes153|STResList153],
+ ?line ITRes147 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc011.xml','./msxsdtest/Particles',invalid,S153),
+ ITResList148 = [ITRes147|ITResList147],
+
+
+ ?line {STRes154,S154} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc012.xsd','./msxsdtest/Particles',valid),
+ STResList155 = [STRes154|STResList154],
+ ?line ITRes148 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc012.xml','./msxsdtest/Particles',valid,S154),
+ ITResList149 = [ITRes148|ITResList148],
+
+
+ ?line {STRes155,S155} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc013.xsd','./msxsdtest/Particles',valid),
+ STResList156 = [STRes155|STResList155],
+ ?line ITRes149 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc013.xml','./msxsdtest/Particles',invalid,S155),
+ ITResList150 = [ITRes149|ITResList149],
+
+
+ ?line {STRes156,S156} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc014.xsd','./msxsdtest/Particles',valid),
+ STResList157 = [STRes156|STResList156],
+ ?line ITRes150 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc014.xml','./msxsdtest/Particles',invalid,S156),
+ ITResList151 = [ITRes150|ITResList150],
+
+
+ ?line {STRes157,S157} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc015.xsd','./msxsdtest/Particles',valid),
+ STResList158 = [STRes157|STResList157],
+ ?line ITRes151 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc015.xml','./msxsdtest/Particles',invalid,S157),
+ ITResList152 = [ITRes151|ITResList151],
+
+
+ ?line {STRes158,S158} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc016.xsd','./msxsdtest/Particles',valid),
+ STResList159 = [STRes158|STResList158],
+ ?line ITRes152 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc016.xml','./msxsdtest/Particles',valid,S158),
+ ITResList153 = [ITRes152|ITResList152],
+
+
+ ?line {STRes159,S159} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc017.xsd','./msxsdtest/Particles',valid),
+ STResList160 = [STRes159|STResList159],
+ ?line ITRes153 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc017.xml','./msxsdtest/Particles',valid,S159),
+ ITResList154 = [ITRes153|ITResList153],
+
+
+ ?line {STRes160,S160} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc018.xsd','./msxsdtest/Particles',valid),
+ STResList161 = [STRes160|STResList160],
+ ?line ITRes154 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc018.xml','./msxsdtest/Particles',valid,S160),
+ ITResList155 = [ITRes154|ITResList154],
+
+
+ ?line {STRes161,S161} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc019.xsd','./msxsdtest/Particles',valid),
+ STResList162 = [STRes161|STResList161],
+ ?line ITRes155 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc019.xml','./msxsdtest/Particles',valid,S161),
+ ITResList156 = [ITRes155|ITResList155],
+
+
+ ?line {STRes162,S162} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc020.xsd','./msxsdtest/Particles',valid),
+ STResList163 = [STRes162|STResList162],
+ ?line ITRes156 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc020.xml','./msxsdtest/Particles',valid,S162),
+ ITResList157 = [ITRes156|ITResList156],
+
+
+ ?line {STRes163,S163} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc021.xsd','./msxsdtest/Particles',valid),
+ STResList164 = [STRes163|STResList163],
+ ?line ITRes157 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc021.xml','./msxsdtest/Particles',valid,S163),
+ ITResList158 = [ITRes157|ITResList157],
+
+
+ ?line {STRes164,S164} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc022.xsd','./msxsdtest/Particles',valid),
+ STResList165 = [STRes164|STResList164],
+ ?line ITRes158 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc022.xml','./msxsdtest/Particles',invalid,S164),
+ ITResList159 = [ITRes158|ITResList158],
+
+
+ ?line {STRes165,S165} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc023.xsd','./msxsdtest/Particles',valid),
+ STResList166 = [STRes165|STResList165],
+ ?line ITRes159 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc023.xml','./msxsdtest/Particles',invalid,S165),
+ ITResList160 = [ITRes159|ITResList159],
+
+
+ ?line {STRes166,S166} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc024.xsd','./msxsdtest/Particles',valid),
+ STResList167 = [STRes166|STResList166],
+ ?line ITRes160 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc024.xml','./msxsdtest/Particles',invalid,S166),
+ ITResList161 = [ITRes160|ITResList160],
+
+
+ ?line {STRes167,S167} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc025.xsd','./msxsdtest/Particles',valid),
+ STResList168 = [STRes167|STResList167],
+ ?line ITRes161 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc025.xml','./msxsdtest/Particles',invalid,S167),
+ ITResList162 = [ITRes161|ITResList161],
+
+
+ ?line {STRes168,S168} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc026.xsd','./msxsdtest/Particles',valid),
+ STResList169 = [STRes168|STResList168],
+ ?line ITRes162 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc026.xml','./msxsdtest/Particles',invalid,S168),
+ ITResList163 = [ITRes162|ITResList162],
+
+
+ ?line {STRes169,S169} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc027.xsd','./msxsdtest/Particles',valid),
+ STResList170 = [STRes169|STResList169],
+ ?line ITRes163 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc027.xml','./msxsdtest/Particles',invalid,S169),
+ ITResList164 = [ITRes163|ITResList163],
+
+
+ ?line {STRes170,S170} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc028.xsd','./msxsdtest/Particles',valid),
+ STResList171 = [STRes170|STResList170],
+ ?line ITRes164 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc028.xml','./msxsdtest/Particles',invalid,S170),
+ ITResList165 = [ITRes164|ITResList164],
+
+
+ ?line {STRes171,S171} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc029.xsd','./msxsdtest/Particles',valid),
+ STResList172 = [STRes171|STResList171],
+ ?line ITRes165 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc029.xml','./msxsdtest/Particles',valid,S171),
+ ITResList166 = [ITRes165|ITResList165],
+
+
+ ?line {STRes172,S172} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc030.xsd','./msxsdtest/Particles',valid),
+ STResList173 = [STRes172|STResList172],
+ ?line ITRes166 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc030.xml','./msxsdtest/Particles',valid,S172),
+ ITResList167 = [ITRes166|ITResList166],
+
+
+ ?line {STRes173,S173} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc031.xsd','./msxsdtest/Particles',valid),
+ STResList174 = [STRes173|STResList173],
+ ?line ITRes167 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc031.xml','./msxsdtest/Particles',valid,S173),
+ ITResList168 = [ITRes167|ITResList167],
+
+
+ ?line {STRes174,S174} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc032.xsd','./msxsdtest/Particles',valid),
+ STResList175 = [STRes174|STResList174],
+ ?line ITRes168 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc032.xml','./msxsdtest/Particles',valid,S174),
+ ITResList169 = [ITRes168|ITResList168],
+
+
+ ?line {STRes175,S175} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc033.xsd','./msxsdtest/Particles',valid),
+ STResList176 = [STRes175|STResList175],
+ ?line ITRes169 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc033.xml','./msxsdtest/Particles',valid,S175),
+ ITResList170 = [ITRes169|ITResList169],
+
+
+ ?line {STRes176,S176} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc034.xsd','./msxsdtest/Particles',valid),
+ STResList177 = [STRes176|STResList176],
+ ?line ITRes170 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc034.xml','./msxsdtest/Particles',valid,S176),
+ ITResList171 = [ITRes170|ITResList170],
+
+
+ ?line {STRes177,S177} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc035.xsd','./msxsdtest/Particles',valid),
+ STResList178 = [STRes177|STResList177],
+ ?line ITRes171 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc035.xml','./msxsdtest/Particles',valid,S177),
+ ITResList172 = [ITRes171|ITResList171],
+
+
+ ?line {STRes178,S178} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc036.xsd','./msxsdtest/Particles',valid),
+ STResList179 = [STRes178|STResList178],
+ ?line ITRes172 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc036.xml','./msxsdtest/Particles',valid,S178),
+ ITResList173 = [ITRes172|ITResList172],
+
+
+ ?line {STRes179,S179} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc037.xsd','./msxsdtest/Particles',valid),
+ STResList180 = [STRes179|STResList179],
+ ?line ITRes173 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc037.xml','./msxsdtest/Particles',valid,S179),
+ ITResList174 = [ITRes173|ITResList173],
+
+
+ ?line {STRes180,S180} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc038.xsd','./msxsdtest/Particles',valid),
+ STResList181 = [STRes180|STResList180],
+ ?line ITRes174 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc038.xml','./msxsdtest/Particles',invalid,S180),
+ ITResList175 = [ITRes174|ITResList174],
+
+
+ ?line {STRes181,S181} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc039.xsd','./msxsdtest/Particles',valid),
+ STResList182 = [STRes181|STResList181],
+ ?line ITRes175 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc039.xml','./msxsdtest/Particles',invalid,S181),
+ ITResList176 = [ITRes175|ITResList175],
+
+
+ ?line {STRes182,S182} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc040.xsd','./msxsdtest/Particles',valid),
+ STResList183 = [STRes182|STResList182],
+ ?line ITRes176 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc040.xml','./msxsdtest/Particles',invalid,S182),
+ ITResList177 = [ITRes176|ITResList176],
+
+
+ ?line {STRes183,S183} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEc041.xsd','./msxsdtest/Particles',valid),
+ STResList184 = [STRes183|STResList183],
+ ?line ITRes177 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesEc041.xml','./msxsdtest/Particles',invalid,S183),
+ ITResList178 = [ITRes177|ITResList177],
+
+
+ ?line {STRes184,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesEd001.xsd','./msxsdtest/Particles',invalid),
+ STResList185 = [STRes184|STResList184],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList185,ITResList178).
+
+%% 3.9.6 Schema Component Constraint: Particle ....
+
+particlesFHI(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesFa001.xsd','./msxsdtest/Particles',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesFa001.xml','./msxsdtest/Particles',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesFa002.xsd','./msxsdtest/Particles',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesFa002.xml','./msxsdtest/Particles',valid,S1),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesFa003.xsd','./msxsdtest/Particles',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesFa003.xml','./msxsdtest/Particles',valid,S2),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesFa004.xsd','./msxsdtest/Particles',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesFa004.xml','./msxsdtest/Particles',valid,S3),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesFa005.xsd','./msxsdtest/Particles',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesFa005.xml','./msxsdtest/Particles',valid,S4),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesFb001.xsd','./msxsdtest/Particles',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesFb001.xml','./msxsdtest/Particles',valid,S5),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes6,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesFb002.xsd','./msxsdtest/Particles',invalid),
+ STResList7 = [STRes6|STResList6],
+
+
+ ?line {STRes7,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesFb003.xsd','./msxsdtest/Particles',invalid),
+ STResList8 = [STRes7|STResList7],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesFb004.xsd','./msxsdtest/Particles',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesFb004.xml','./msxsdtest/Particles',valid,S8),
+ ITResList7 = [ITRes6|ITResList6],
+
+
+ ?line {STRes9,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesFb005.xsd','./msxsdtest/Particles',invalid),
+ STResList10 = [STRes9|STResList9],
+
+
+ ?line {STRes10,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesFb006.xsd','./msxsdtest/Particles',invalid),
+ STResList11 = [STRes10|STResList10],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHa001.xsd','./msxsdtest/Particles',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesHa001.xml','./msxsdtest/Particles',valid,S11),
+ ITResList8 = [ITRes7|ITResList7],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHa002.xsd','./msxsdtest/Particles',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesHa002.xml','./msxsdtest/Particles',valid,S12),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHa003.xsd','./msxsdtest/Particles',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesHa003.xml','./msxsdtest/Particles',valid,S13),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHa004.xsd','./msxsdtest/Particles',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesHa004.xml','./msxsdtest/Particles',valid,S14),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHa005.xsd','./msxsdtest/Particles',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesHa005.xml','./msxsdtest/Particles',valid,S15),
+ ITResList12 = [ITRes11|ITResList11],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHa006.xsd','./msxsdtest/Particles',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesHa006.xml','./msxsdtest/Particles',valid,S16),
+ ITResList13 = [ITRes12|ITResList12],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHa007.xsd','./msxsdtest/Particles',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesHa007.xml','./msxsdtest/Particles',valid,S17),
+ ITResList14 = [ITRes13|ITResList13],
+
+
+ ?line {STRes18,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHa008.xsd','./msxsdtest/Particles',invalid),
+ STResList19 = [STRes18|STResList18],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHa009.xsd','./msxsdtest/Particles',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesHa009.xml','./msxsdtest/Particles',valid,S19),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHa010.xsd','./msxsdtest/Particles',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesHa010.xml','./msxsdtest/Particles',valid,S20),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHa011.xsd','./msxsdtest/Particles',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesHa011.xml','./msxsdtest/Particles',valid,S21),
+ ITResList17 = [ITRes16|ITResList16],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHa012.xsd','./msxsdtest/Particles',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesHa012.xml','./msxsdtest/Particles',valid,S22),
+ ITResList18 = [ITRes17|ITResList17],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHa013.xsd','./msxsdtest/Particles',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesHa013.xml','./msxsdtest/Particles',valid,S23),
+ ITResList19 = [ITRes18|ITResList18],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHa014.xsd','./msxsdtest/Particles',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesHa014.xml','./msxsdtest/Particles',valid,S24),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHa015.xsd','./msxsdtest/Particles',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesHa015.xml','./msxsdtest/Particles',valid,S25),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHa016.xsd','./msxsdtest/Particles',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesHa016.xml','./msxsdtest/Particles',valid,S26),
+ ITResList22 = [ITRes21|ITResList21],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHa017.xsd','./msxsdtest/Particles',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesHa017.xml','./msxsdtest/Particles',valid,S27),
+ ITResList23 = [ITRes22|ITResList22],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHa018.xsd','./msxsdtest/Particles',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesHa018.xml','./msxsdtest/Particles',valid,S28),
+ ITResList24 = [ITRes23|ITResList23],
+
+
+ ?line {STRes29,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHb001.xsd','./msxsdtest/Particles',invalid),
+ STResList30 = [STRes29|STResList29],
+
+
+ ?line {STRes30,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHb002.xsd','./msxsdtest/Particles',invalid),
+ STResList31 = [STRes30|STResList30],
+
+
+ ?line {STRes31,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHb003.xsd','./msxsdtest/Particles',invalid),
+ STResList32 = [STRes31|STResList31],
+
+
+ ?line {STRes32,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHb004.xsd','./msxsdtest/Particles',invalid),
+ STResList33 = [STRes32|STResList32],
+
+
+ ?line {STRes33,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHb006.xsd','./msxsdtest/Particles',invalid),
+ STResList34 = [STRes33|STResList33],
+
+
+ ?line {STRes34,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHb007.xsd','./msxsdtest/Particles',invalid),
+ STResList35 = [STRes34|STResList34],
+
+
+ ?line {STRes35,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHb008.xsd','./msxsdtest/Particles',invalid),
+ STResList36 = [STRes35|STResList35],
+
+
+ ?line {STRes36,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHb009.xsd','./msxsdtest/Particles',invalid),
+ STResList37 = [STRes36|STResList36],
+
+
+ ?line {STRes37,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHb010.xsd','./msxsdtest/Particles',invalid),
+ STResList38 = [STRes37|STResList37],
+
+
+ ?line {STRes38,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesHb011.xsd','./msxsdtest/Particles',invalid),
+ STResList39 = [STRes38|STResList38],
+
+
+ ?line {STRes39,S39} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIa001.xsd','./msxsdtest/Particles',valid),
+ STResList40 = [STRes39|STResList39],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIa001.xml','./msxsdtest/Particles',valid,S39),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ ?line {STRes40,S40} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIa003.xsd','./msxsdtest/Particles',valid),
+ STResList41 = [STRes40|STResList40],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIa003.xml','./msxsdtest/Particles',valid,S40),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes41,S41} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIa004.xsd','./msxsdtest/Particles',valid),
+ STResList42 = [STRes41|STResList41],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIa004.xml','./msxsdtest/Particles',valid,S41),
+ ITResList27 = [ITRes26|ITResList26],
+
+
+ ?line {STRes42,S42} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIa005.xsd','./msxsdtest/Particles',valid),
+ STResList43 = [STRes42|STResList42],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIa005.xml','./msxsdtest/Particles',valid,S42),
+ ITResList28 = [ITRes27|ITResList27],
+
+
+ ?line {STRes43,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIa006.xsd','./msxsdtest/Particles',invalid),
+ STResList44 = [STRes43|STResList43],
+
+
+ ?line {STRes44,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIa008.xsd','./msxsdtest/Particles',invalid),
+ STResList45 = [STRes44|STResList44],
+
+
+ ?line {STRes45,S45} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIb001.xsd','./msxsdtest/Particles',valid),
+ STResList46 = [STRes45|STResList45],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIb001.xml','./msxsdtest/Particles',valid,S45),
+ ITResList29 = [ITRes28|ITResList28],
+
+
+ ?line {STRes46,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIb002.xsd','./msxsdtest/Particles',invalid),
+ STResList47 = [STRes46|STResList46],
+
+
+ ?line {STRes47,S47} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIb003.xsd','./msxsdtest/Particles',valid),
+ STResList48 = [STRes47|STResList47],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIb003.xml','./msxsdtest/Particles',valid,S47),
+ ITResList30 = [ITRes29|ITResList29],
+
+
+ ?line {STRes48,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIb004.xsd','./msxsdtest/Particles',invalid),
+ STResList49 = [STRes48|STResList48],
+
+
+ ?line {STRes49,S49} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIb005.xsd','./msxsdtest/Particles',valid),
+ STResList50 = [STRes49|STResList49],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIb005.xml','./msxsdtest/Particles',valid,S49),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes50,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIb006.xsd','./msxsdtest/Particles',invalid),
+ STResList51 = [STRes50|STResList50],
+
+
+ ?line {STRes51,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIb007.xsd','./msxsdtest/Particles',invalid),
+ STResList52 = [STRes51|STResList51],
+
+
+ ?line {STRes52,S52} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIc001.xsd','./msxsdtest/Particles',valid),
+ STResList53 = [STRes52|STResList52],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIc001.xml','./msxsdtest/Particles',valid,S52),
+ ITResList32 = [ITRes31|ITResList31],
+
+
+ ?line {STRes53,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIc002.xsd','./msxsdtest/Particles',invalid),
+ STResList54 = [STRes53|STResList53],
+
+
+ ?line {STRes54,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIc003.xsd','./msxsdtest/Particles',invalid),
+ STResList55 = [STRes54|STResList54],
+
+
+ ?line {STRes55,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIc004.xsd','./msxsdtest/Particles',invalid),
+ STResList56 = [STRes55|STResList55],
+
+
+ ?line {STRes56,S56} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIc005.xsd','./msxsdtest/Particles',valid),
+ STResList57 = [STRes56|STResList56],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIc005.xml','./msxsdtest/Particles',valid,S56),
+ ITResList33 = [ITRes32|ITResList32],
+
+
+ ?line {STRes57,S57} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIc006.xsd','./msxsdtest/Particles',valid),
+ STResList58 = [STRes57|STResList57],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIc006.xml','./msxsdtest/Particles',valid,S57),
+ ITResList34 = [ITRes33|ITResList33],
+
+
+ ?line {STRes58,S58} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIc007.xsd','./msxsdtest/Particles',valid),
+ STResList59 = [STRes58|STResList58],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIc007.xml','./msxsdtest/Particles',valid,S58),
+ ITResList35 = [ITRes34|ITResList34],
+
+
+ ?line {STRes59,S59} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesId001.xsd','./msxsdtest/Particles',valid),
+ STResList60 = [STRes59|STResList59],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesId001.xml','./msxsdtest/Particles',valid,S59),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes60,S60} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesId002.xsd','./msxsdtest/Particles',valid),
+ STResList61 = [STRes60|STResList60],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesId002.xml','./msxsdtest/Particles',valid,S60),
+ ITResList37 = [ITRes36|ITResList36],
+
+
+ ?line {STRes61,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesId003.xsd','./msxsdtest/Particles',invalid),
+ STResList62 = [STRes61|STResList61],
+
+
+ ?line {STRes62,S62} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesId004.xsd','./msxsdtest/Particles',valid),
+ STResList63 = [STRes62|STResList62],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesId004.xml','./msxsdtest/Particles',valid,S62),
+ ITResList38 = [ITRes37|ITResList37],
+
+
+ ?line {STRes63,S63} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesId005.xsd','./msxsdtest/Particles',valid),
+ STResList64 = [STRes63|STResList63],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesId005.xml','./msxsdtest/Particles',valid,S63),
+ ITResList39 = [ITRes38|ITResList38],
+
+
+ ?line {STRes64,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesId006.xsd','./msxsdtest/Particles',invalid),
+ STResList65 = [STRes64|STResList64],
+
+
+ ?line {STRes65,S65} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesId007.xsd','./msxsdtest/Particles',valid),
+ STResList66 = [STRes65|STResList65],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesId007.xml','./msxsdtest/Particles',valid,S65),
+ ITResList40 = [ITRes39|ITResList39],
+
+
+ ?line {STRes66,S66} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesId008.xsd','./msxsdtest/Particles',valid),
+ STResList67 = [STRes66|STResList66],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesId008.xml','./msxsdtest/Particles',valid,S66),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes67,S67} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesId009.xsd','./msxsdtest/Particles',valid),
+ STResList68 = [STRes67|STResList67],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesId009.xml','./msxsdtest/Particles',valid,S67),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes68,S68} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesId010.xsd','./msxsdtest/Particles',valid),
+ STResList69 = [STRes68|STResList68],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesId010.xml','./msxsdtest/Particles',valid,S68),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes69,S69} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesId011.xsd','./msxsdtest/Particles',valid),
+ STResList70 = [STRes69|STResList69],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesId011.xml','./msxsdtest/Particles',valid,S69),
+ ITResList44 = [ITRes43|ITResList43],
+
+
+ ?line {STRes70,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesId012.xsd','./msxsdtest/Particles',invalid),
+ STResList71 = [STRes70|STResList70],
+
+
+ ?line {STRes71,S71} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIe001.xsd','./msxsdtest/Particles',valid),
+ STResList72 = [STRes71|STResList71],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIe001.xml','./msxsdtest/Particles',valid,S71),
+ ITResList45 = [ITRes44|ITResList44],
+
+
+ ?line {STRes72,S72} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIe002.xsd','./msxsdtest/Particles',valid),
+ STResList73 = [STRes72|STResList72],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIe002.xml','./msxsdtest/Particles',valid,S72),
+ ITResList46 = [ITRes45|ITResList45],
+
+
+ ?line {STRes73,S73} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIe003.xsd','./msxsdtest/Particles',valid),
+ STResList74 = [STRes73|STResList73],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIe003.xml','./msxsdtest/Particles',valid,S73),
+ ITResList47 = [ITRes46|ITResList46],
+
+
+ ?line {STRes74,S74} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIe004.xsd','./msxsdtest/Particles',valid),
+ STResList75 = [STRes74|STResList74],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIe004.xml','./msxsdtest/Particles',valid,S74),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes75,S75} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIe005.xsd','./msxsdtest/Particles',valid),
+ STResList76 = [STRes75|STResList75],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIe005.xml','./msxsdtest/Particles',valid,S75),
+ ITResList49 = [ITRes48|ITResList48],
+
+
+ ?line {STRes76,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIe006.xsd','./msxsdtest/Particles',invalid),
+ STResList77 = [STRes76|STResList76],
+
+
+ ?line {STRes77,S77} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIe007.xsd','./msxsdtest/Particles',valid),
+ STResList78 = [STRes77|STResList77],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIe007.xml','./msxsdtest/Particles',valid,S77),
+ ITResList50 = [ITRes49|ITResList49],
+
+
+ ?line {STRes78,S78} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIe008.xsd','./msxsdtest/Particles',valid),
+ STResList79 = [STRes78|STResList78],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIe008.xml','./msxsdtest/Particles',valid,S78),
+ ITResList51 = [ITRes50|ITResList50],
+
+
+ ?line {STRes79,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIe009.xsd','./msxsdtest/Particles',invalid),
+ STResList80 = [STRes79|STResList79],
+
+
+ ?line {STRes80,S80} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIe010.xsd','./msxsdtest/Particles',valid),
+ STResList81 = [STRes80|STResList80],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIe010.xml','./msxsdtest/Particles',valid,S80),
+ ITResList52 = [ITRes51|ITResList51],
+
+
+ ?line {STRes81,S81} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIe011.xsd','./msxsdtest/Particles',valid),
+ STResList82 = [STRes81|STResList81],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIe011.xml','./msxsdtest/Particles',valid,S81),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes82,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIe012.xsd','./msxsdtest/Particles',invalid),
+ STResList83 = [STRes82|STResList82],
+
+
+ ?line {STRes83,S83} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIe013.xsd','./msxsdtest/Particles',valid),
+ STResList84 = [STRes83|STResList83],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIe013.xml','./msxsdtest/Particles',valid,S83),
+ ITResList54 = [ITRes53|ITResList53],
+
+
+ ?line {STRes84,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIe014.xsd','./msxsdtest/Particles',invalid),
+ STResList85 = [STRes84|STResList84],
+
+
+ ?line {STRes85,S85} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIe015.xsd','./msxsdtest/Particles',valid),
+ STResList86 = [STRes85|STResList85],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIe015.xml','./msxsdtest/Particles',valid,S85),
+ ITResList55 = [ITRes54|ITResList54],
+
+
+ ?line {STRes86,S86} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIe016.xsd','./msxsdtest/Particles',valid),
+ STResList87 = [STRes86|STResList86],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIe016.xml','./msxsdtest/Particles',valid,S86),
+ ITResList56 = [ITRes55|ITResList55],
+
+
+ ?line {STRes87,S87} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIf001.xsd','./msxsdtest/Particles',valid),
+ STResList88 = [STRes87|STResList87],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIf001.xml','./msxsdtest/Particles',valid,S87),
+ ITResList57 = [ITRes56|ITResList56],
+
+
+ ?line {STRes88,S88} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIf002.xsd','./msxsdtest/Particles',valid),
+ STResList89 = [STRes88|STResList88],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIf002.xml','./msxsdtest/Particles',valid,S88),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes89,S89} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIf003.xsd','./msxsdtest/Particles',valid),
+ STResList90 = [STRes89|STResList89],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIf003.xml','./msxsdtest/Particles',valid,S89),
+ ITResList59 = [ITRes58|ITResList58],
+
+
+ ?line {STRes90,S90} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIf004.xsd','./msxsdtest/Particles',valid),
+ STResList91 = [STRes90|STResList90],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIf004.xml','./msxsdtest/Particles',valid,S90),
+ ITResList60 = [ITRes59|ITResList59],
+
+
+ ?line {STRes91,S91} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIf005.xsd','./msxsdtest/Particles',valid),
+ STResList92 = [STRes91|STResList91],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIf005.xml','./msxsdtest/Particles',valid,S91),
+ ITResList61 = [ITRes60|ITResList60],
+
+
+ ?line {STRes92,S92} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIf006.xsd','./msxsdtest/Particles',valid),
+ STResList93 = [STRes92|STResList92],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIf006.xml','./msxsdtest/Particles',valid,S92),
+ ITResList62 = [ITRes61|ITResList61],
+
+
+ ?line {STRes93,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIf007.xsd','./msxsdtest/Particles',invalid),
+ STResList94 = [STRes93|STResList93],
+
+
+ ?line {STRes94,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIf008.xsd','./msxsdtest/Particles',invalid),
+ STResList95 = [STRes94|STResList94],
+
+
+ ?line {STRes95,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIf009.xsd','./msxsdtest/Particles',invalid),
+ STResList96 = [STRes95|STResList95],
+
+
+ ?line {STRes96,S96} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIg001.xsd','./msxsdtest/Particles',valid),
+ STResList97 = [STRes96|STResList96],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIg001.xml','./msxsdtest/Particles',valid,S96),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes97,S97} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIg002.xsd','./msxsdtest/Particles',valid),
+ STResList98 = [STRes97|STResList97],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIg002.xml','./msxsdtest/Particles',valid,S97),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes98,S98} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIg003.xsd','./msxsdtest/Particles',valid),
+ STResList99 = [STRes98|STResList98],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIg003.xml','./msxsdtest/Particles',valid,S98),
+ ITResList65 = [ITRes64|ITResList64],
+
+
+ ?line {STRes99,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIg004.xsd','./msxsdtest/Particles',invalid),
+ STResList100 = [STRes99|STResList99],
+
+
+ ?line {STRes100,S100} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIg005.xsd','./msxsdtest/Particles',valid),
+ STResList101 = [STRes100|STResList100],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIg005.xml','./msxsdtest/Particles',valid,S100),
+ ITResList66 = [ITRes65|ITResList65],
+
+
+ ?line {STRes101,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIg006.xsd','./msxsdtest/Particles',invalid),
+ STResList102 = [STRes101|STResList101],
+
+
+ ?line {STRes102,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIg007.xsd','./msxsdtest/Particles',invalid),
+ STResList103 = [STRes102|STResList102],
+
+
+ ?line {STRes103,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIg008.xsd','./msxsdtest/Particles',invalid),
+ STResList104 = [STRes103|STResList103],
+
+
+ ?line {STRes104,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIg009.xsd','./msxsdtest/Particles',invalid),
+ STResList105 = [STRes104|STResList104],
+
+
+ ?line {STRes105,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIg010.xsd','./msxsdtest/Particles',invalid),
+ STResList106 = [STRes105|STResList105],
+
+
+ ?line {STRes106,S106} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIg011.xsd','./msxsdtest/Particles',valid),
+ STResList107 = [STRes106|STResList106],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIg011.xml','./msxsdtest/Particles',valid,S106),
+ ITResList67 = [ITRes66|ITResList66],
+
+
+ ?line {STRes107,S107} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIg012.xsd','./msxsdtest/Particles',valid),
+ STResList108 = [STRes107|STResList107],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIg012.xml','./msxsdtest/Particles',valid,S107),
+ ITResList68 = [ITRes67|ITResList67],
+
+
+ ?line {STRes108,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIg013.xsd','./msxsdtest/Particles',invalid),
+ STResList109 = [STRes108|STResList108],
+
+
+ ?line {STRes109,S109} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIg014.xsd','./msxsdtest/Particles',valid),
+ STResList110 = [STRes109|STResList109],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIg014.xml','./msxsdtest/Particles',valid,S109),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes110,S110} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIg015.xsd','./msxsdtest/Particles',valid),
+ STResList111 = [STRes110|STResList110],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIg015.xml','./msxsdtest/Particles',valid,S110),
+ ITResList70 = [ITRes69|ITResList69],
+
+
+ ?line {STRes111,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIg016.xsd','./msxsdtest/Particles',invalid),
+ STResList112 = [STRes111|STResList111],
+
+
+ ?line {STRes112,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIh001.xsd','./msxsdtest/Particles',invalid),
+ STResList113 = [STRes112|STResList112],
+
+
+ ?line {STRes113,S113} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIj001.xsd','./msxsdtest/Particles',valid),
+ STResList114 = [STRes113|STResList113],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIj001.xml','./msxsdtest/Particles',valid,S113),
+ ITResList71 = [ITRes70|ITResList70],
+
+
+ ?line {STRes114,S114} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIj002.xsd','./msxsdtest/Particles',valid),
+ STResList115 = [STRes114|STResList114],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIj002.xml','./msxsdtest/Particles',valid,S114),
+ ITResList72 = [ITRes71|ITResList71],
+
+
+ ?line {STRes115,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIj003.xsd','./msxsdtest/Particles',invalid),
+ STResList116 = [STRes115|STResList115],
+
+
+ ?line {STRes116,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIj004.xsd','./msxsdtest/Particles',invalid),
+ STResList117 = [STRes116|STResList116],
+
+
+ ?line {STRes117,S117} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIj005.xsd','./msxsdtest/Particles',valid),
+ STResList118 = [STRes117|STResList117],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIj005.xml','./msxsdtest/Particles',valid,S117),
+ ITResList73 = [ITRes72|ITResList72],
+
+
+ ?line {STRes118,S118} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIj006.xsd','./msxsdtest/Particles',valid),
+ STResList119 = [STRes118|STResList118],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIj006.xml','./msxsdtest/Particles',valid,S118),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes119,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIj007.xsd','./msxsdtest/Particles',invalid),
+ STResList120 = [STRes119|STResList119],
+
+
+ ?line {STRes120,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIj008.xsd','./msxsdtest/Particles',invalid),
+ STResList121 = [STRes120|STResList120],
+
+
+ ?line {STRes121,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIj009.xsd','./msxsdtest/Particles',invalid),
+ STResList122 = [STRes121|STResList121],
+
+
+ ?line {STRes122,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIj010.xsd','./msxsdtest/Particles',invalid),
+ STResList123 = [STRes122|STResList122],
+
+
+ ?line {STRes123,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIj011.xsd','./msxsdtest/Particles',invalid),
+ STResList124 = [STRes123|STResList123],
+
+
+ ?line {STRes124,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIj012.xsd','./msxsdtest/Particles',invalid),
+ STResList125 = [STRes124|STResList124],
+
+
+ ?line {STRes125,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIj013.xsd','./msxsdtest/Particles',invalid),
+ STResList126 = [STRes125|STResList125],
+
+
+ ?line {STRes126,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIj015.xsd','./msxsdtest/Particles',invalid),
+ STResList127 = [STRes126|STResList126],
+
+
+ ?line {STRes127,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIj016.xsd','./msxsdtest/Particles',invalid),
+ STResList128 = [STRes127|STResList127],
+
+
+ ?line {STRes128,S128} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIk001.xsd','./msxsdtest/Particles',valid),
+ STResList129 = [STRes128|STResList128],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIk001.xml','./msxsdtest/Particles',valid,S128),
+ ITResList75 = [ITRes74|ITResList74],
+
+
+ ?line {STRes129,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIk002.xsd','./msxsdtest/Particles',invalid),
+ STResList130 = [STRes129|STResList129],
+
+
+ ?line {STRes130,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIk003.xsd','./msxsdtest/Particles',invalid),
+ STResList131 = [STRes130|STResList130],
+
+
+ ?line {STRes131,S131} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIk004.xsd','./msxsdtest/Particles',valid),
+ STResList132 = [STRes131|STResList131],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIk004.xml','./msxsdtest/Particles',valid,S131),
+ ITResList76 = [ITRes75|ITResList75],
+
+
+ ?line {STRes132,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIk005.xsd','./msxsdtest/Particles',invalid),
+ STResList133 = [STRes132|STResList132],
+
+
+ ?line {STRes133,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIk006.xsd','./msxsdtest/Particles',invalid),
+ STResList134 = [STRes133|STResList133],
+
+
+ ?line {STRes134,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIk007.xsd','./msxsdtest/Particles',invalid),
+ STResList135 = [STRes134|STResList134],
+
+
+ ?line {STRes135,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIk008.xsd','./msxsdtest/Particles',invalid),
+ STResList136 = [STRes135|STResList135],
+
+
+ ?line {STRes136,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIk009.xsd','./msxsdtest/Particles',invalid),
+ STResList137 = [STRes136|STResList136],
+
+
+ ?line {STRes137,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIk010.xsd','./msxsdtest/Particles',invalid),
+ STResList138 = [STRes137|STResList137],
+
+
+ ?line {STRes138,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIk011.xsd','./msxsdtest/Particles',invalid),
+ STResList139 = [STRes138|STResList138],
+
+
+ ?line {STRes139,S139} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIk012.xsd','./msxsdtest/Particles',valid),
+ STResList140 = [STRes139|STResList139],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIk012.xml','./msxsdtest/Particles',valid,S139),
+ ITResList77 = [ITRes76|ITResList76],
+
+
+ ?line {STRes140,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIk013.xsd','./msxsdtest/Particles',invalid),
+ STResList141 = [STRes140|STResList140],
+
+
+ ?line {STRes141,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIk015.xsd','./msxsdtest/Particles',invalid),
+ STResList142 = [STRes141|STResList141],
+
+
+ ?line {STRes142,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIk016.xsd','./msxsdtest/Particles',invalid),
+ STResList143 = [STRes142|STResList142],
+
+
+ ?line {STRes143,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIk019.xsd','./msxsdtest/Particles',invalid),
+ STResList144 = [STRes143|STResList143],
+
+
+ ?line {STRes144,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIk020.xsd','./msxsdtest/Particles',invalid),
+ STResList145 = [STRes144|STResList144],
+
+
+ ?line {STRes145,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIk021.xsd','./msxsdtest/Particles',invalid),
+ STResList146 = [STRes145|STResList145],
+
+
+ ?line {STRes146,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIk022.xsd','./msxsdtest/Particles',invalid),
+ STResList147 = [STRes146|STResList146],
+
+
+ ?line {STRes147,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIk024.xsd','./msxsdtest/Particles',invalid),
+ STResList148 = [STRes147|STResList147],
+
+
+ ?line {STRes148,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIk025.xsd','./msxsdtest/Particles',invalid),
+ STResList149 = [STRes148|STResList148],
+
+
+ ?line {STRes149,S149} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIk026.xsd','./msxsdtest/Particles',valid),
+ STResList150 = [STRes149|STResList149],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesIk026.xml','./msxsdtest/Particles',valid,S149),
+ ITResList78 = [ITRes77|ITResList77],
+
+
+ ?line {STRes150,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesIk027.xsd','./msxsdtest/Particles',invalid),
+ STResList151 = [STRes150|STResList150],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList151,ITResList78).
+
+%% 3.9.6 Particle Derivation.
+
+particlesJ(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJa001.xsd','./msxsdtest/Particles',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJa001.xml','./msxsdtest/Particles',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJa002.xsd','./msxsdtest/Particles',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJa002.xml','./msxsdtest/Particles',valid,S1),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ ?line {STRes2,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJa003.xsd','./msxsdtest/Particles',invalid),
+ STResList3 = [STRes2|STResList2],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJa004.xsd','./msxsdtest/Particles',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJa004.xml','./msxsdtest/Particles',valid,S3),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJa005.xsd','./msxsdtest/Particles',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJa005.xml','./msxsdtest/Particles',valid,S4),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ ?line {STRes5,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJa006.xsd','./msxsdtest/Particles',invalid),
+ STResList6 = [STRes5|STResList5],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJa007.xsd','./msxsdtest/Particles',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJa007.xml','./msxsdtest/Particles',valid,S6),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJa008.xsd','./msxsdtest/Particles',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJa008.xml','./msxsdtest/Particles',valid,S7),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJa009.xsd','./msxsdtest/Particles',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJa009.xml','./msxsdtest/Particles',valid,S8),
+ ITResList7 = [ITRes6|ITResList6],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJa010.xsd','./msxsdtest/Particles',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJa010.xml','./msxsdtest/Particles',valid,S9),
+ ITResList8 = [ITRes7|ITResList7],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJa011.xsd','./msxsdtest/Particles',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJa011.xml','./msxsdtest/Particles',valid,S10),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ ?line {STRes11,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJa012.xsd','./msxsdtest/Particles',invalid),
+ STResList12 = [STRes11|STResList11],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJb001.xsd','./msxsdtest/Particles',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJb001.xml','./msxsdtest/Particles',valid,S12),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJb002.xsd','./msxsdtest/Particles',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJb002.xml','./msxsdtest/Particles',valid,S13),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJb003.xsd','./msxsdtest/Particles',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJb003.xml','./msxsdtest/Particles',valid,S14),
+ ITResList12 = [ITRes11|ITResList11],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJb004.xsd','./msxsdtest/Particles',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJb004.xml','./msxsdtest/Particles',valid,S15),
+ ITResList13 = [ITRes12|ITResList12],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJb005.xsd','./msxsdtest/Particles',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJb005.xml','./msxsdtest/Particles',valid,S16),
+ ITResList14 = [ITRes13|ITResList13],
+
+
+ ?line {STRes17,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJb006.xsd','./msxsdtest/Particles',invalid),
+ STResList18 = [STRes17|STResList17],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJb007.xsd','./msxsdtest/Particles',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJb007.xml','./msxsdtest/Particles',valid,S18),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJb008.xsd','./msxsdtest/Particles',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJb008.xml','./msxsdtest/Particles',valid,S19),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ ?line {STRes20,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJb009.xsd','./msxsdtest/Particles',invalid),
+ STResList21 = [STRes20|STResList20],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJb010.xsd','./msxsdtest/Particles',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJb010.xml','./msxsdtest/Particles',valid,S21),
+ ITResList17 = [ITRes16|ITResList16],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJb011.xsd','./msxsdtest/Particles',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJb011.xml','./msxsdtest/Particles',valid,S22),
+ ITResList18 = [ITRes17|ITResList17],
+
+
+ ?line {STRes23,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJb012.xsd','./msxsdtest/Particles',invalid),
+ STResList24 = [STRes23|STResList23],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJb013.xsd','./msxsdtest/Particles',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJb013.xml','./msxsdtest/Particles',valid,S24),
+ ITResList19 = [ITRes18|ITResList18],
+
+
+ ?line {STRes25,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJb014.xsd','./msxsdtest/Particles',invalid),
+ STResList26 = [STRes25|STResList25],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJb015.xsd','./msxsdtest/Particles',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJb015.xml','./msxsdtest/Particles',valid,S26),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJb016.xsd','./msxsdtest/Particles',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJb016.xml','./msxsdtest/Particles',valid,S27),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJc001.xsd','./msxsdtest/Particles',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJc001.xml','./msxsdtest/Particles',valid,S28),
+ ITResList22 = [ITRes21|ITResList21],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJc002.xsd','./msxsdtest/Particles',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJc002.xml','./msxsdtest/Particles',valid,S29),
+ ITResList23 = [ITRes22|ITResList22],
+
+
+ ?line {STRes30,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJc003.xsd','./msxsdtest/Particles',invalid),
+ STResList31 = [STRes30|STResList30],
+
+
+ ?line {STRes31,S31} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJc004.xsd','./msxsdtest/Particles',valid),
+ STResList32 = [STRes31|STResList31],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJc004.xml','./msxsdtest/Particles',valid,S31),
+ ITResList24 = [ITRes23|ITResList23],
+
+
+ ?line {STRes32,S32} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJc005.xsd','./msxsdtest/Particles',valid),
+ STResList33 = [STRes32|STResList32],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJc005.xml','./msxsdtest/Particles',valid,S32),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ ?line {STRes33,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJc006.xsd','./msxsdtest/Particles',invalid),
+ STResList34 = [STRes33|STResList33],
+
+
+ ?line {STRes34,S34} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJc007.xsd','./msxsdtest/Particles',valid),
+ STResList35 = [STRes34|STResList34],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJc007.xml','./msxsdtest/Particles',valid,S34),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes35,S35} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJc008.xsd','./msxsdtest/Particles',valid),
+ STResList36 = [STRes35|STResList35],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJc008.xml','./msxsdtest/Particles',valid,S35),
+ ITResList27 = [ITRes26|ITResList26],
+
+
+ ?line {STRes36,S36} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJc009.xsd','./msxsdtest/Particles',valid),
+ STResList37 = [STRes36|STResList36],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJc009.xml','./msxsdtest/Particles',valid,S36),
+ ITResList28 = [ITRes27|ITResList27],
+
+
+ ?line {STRes37,S37} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJc010.xsd','./msxsdtest/Particles',valid),
+ STResList38 = [STRes37|STResList37],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJc010.xml','./msxsdtest/Particles',valid,S37),
+ ITResList29 = [ITRes28|ITResList28],
+
+
+ ?line {STRes38,S38} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJc011.xsd','./msxsdtest/Particles',valid),
+ STResList39 = [STRes38|STResList38],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJc011.xml','./msxsdtest/Particles',valid,S38),
+ ITResList30 = [ITRes29|ITResList29],
+
+
+ ?line {STRes39,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJc012.xsd','./msxsdtest/Particles',invalid),
+ STResList40 = [STRes39|STResList39],
+
+
+ ?line {STRes40,S40} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJd001.xsd','./msxsdtest/Particles',valid),
+ STResList41 = [STRes40|STResList40],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJd001.xml','./msxsdtest/Particles',valid,S40),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes41,S41} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJd002.xsd','./msxsdtest/Particles',valid),
+ STResList42 = [STRes41|STResList41],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJd002.xml','./msxsdtest/Particles',valid,S41),
+ ITResList32 = [ITRes31|ITResList31],
+
+
+ ?line {STRes42,S42} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJd003.xsd','./msxsdtest/Particles',valid),
+ STResList43 = [STRes42|STResList42],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJd003.xml','./msxsdtest/Particles',valid,S42),
+ ITResList33 = [ITRes32|ITResList32],
+
+
+ ?line {STRes43,S43} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJd004.xsd','./msxsdtest/Particles',valid),
+ STResList44 = [STRes43|STResList43],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJd004.xml','./msxsdtest/Particles',valid,S43),
+ ITResList34 = [ITRes33|ITResList33],
+
+
+ ?line {STRes44,S44} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJd005.xsd','./msxsdtest/Particles',valid),
+ STResList45 = [STRes44|STResList44],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJd005.xml','./msxsdtest/Particles',valid,S44),
+ ITResList35 = [ITRes34|ITResList34],
+
+
+ ?line {STRes45,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJd006.xsd','./msxsdtest/Particles',invalid),
+ STResList46 = [STRes45|STResList45],
+
+
+ ?line {STRes46,S46} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJd007.xsd','./msxsdtest/Particles',valid),
+ STResList47 = [STRes46|STResList46],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJd007.xml','./msxsdtest/Particles',valid,S46),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes47,S47} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJd008.xsd','./msxsdtest/Particles',valid),
+ STResList48 = [STRes47|STResList47],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJd008.xml','./msxsdtest/Particles',valid,S47),
+ ITResList37 = [ITRes36|ITResList36],
+
+
+ ?line {STRes48,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJd009.xsd','./msxsdtest/Particles',invalid),
+ STResList49 = [STRes48|STResList48],
+
+
+ ?line {STRes49,S49} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJd010.xsd','./msxsdtest/Particles',valid),
+ STResList50 = [STRes49|STResList49],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJd010.xml','./msxsdtest/Particles',valid,S49),
+ ITResList38 = [ITRes37|ITResList37],
+
+
+ ?line {STRes50,S50} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJd011.xsd','./msxsdtest/Particles',valid),
+ STResList51 = [STRes50|STResList50],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJd011.xml','./msxsdtest/Particles',valid,S50),
+ ITResList39 = [ITRes38|ITResList38],
+
+
+ ?line {STRes51,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJd012.xsd','./msxsdtest/Particles',invalid),
+ STResList52 = [STRes51|STResList51],
+
+
+ ?line {STRes52,S52} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJd013.xsd','./msxsdtest/Particles',valid),
+ STResList53 = [STRes52|STResList52],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJd013.xml','./msxsdtest/Particles',valid,S52),
+ ITResList40 = [ITRes39|ITResList39],
+
+
+ ?line {STRes53,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJd014.xsd','./msxsdtest/Particles',invalid),
+ STResList54 = [STRes53|STResList53],
+
+
+ ?line {STRes54,S54} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJd015.xsd','./msxsdtest/Particles',valid),
+ STResList55 = [STRes54|STResList54],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJd015.xml','./msxsdtest/Particles',valid,S54),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes55,S55} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJd016.xsd','./msxsdtest/Particles',valid),
+ STResList56 = [STRes55|STResList55],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJd016.xml','./msxsdtest/Particles',valid,S55),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes56,S56} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJe001.xsd','./msxsdtest/Particles',valid),
+ STResList57 = [STRes56|STResList56],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJe001.xml','./msxsdtest/Particles',valid,S56),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes57,S57} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJe002.xsd','./msxsdtest/Particles',valid),
+ STResList58 = [STRes57|STResList57],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJe002.xml','./msxsdtest/Particles',valid,S57),
+ ITResList44 = [ITRes43|ITResList43],
+
+
+ ?line {STRes58,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJe003.xsd','./msxsdtest/Particles',invalid),
+ STResList59 = [STRes58|STResList58],
+
+
+ ?line {STRes59,S59} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJe004.xsd','./msxsdtest/Particles',valid),
+ STResList60 = [STRes59|STResList59],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJe004.xml','./msxsdtest/Particles',valid,S59),
+ ITResList45 = [ITRes44|ITResList44],
+
+
+ ?line {STRes60,S60} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJe005.xsd','./msxsdtest/Particles',valid),
+ STResList61 = [STRes60|STResList60],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJe005.xml','./msxsdtest/Particles',valid,S60),
+ ITResList46 = [ITRes45|ITResList45],
+
+
+ ?line {STRes61,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJe006.xsd','./msxsdtest/Particles',invalid),
+ STResList62 = [STRes61|STResList61],
+
+
+ ?line {STRes62,S62} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJe007.xsd','./msxsdtest/Particles',valid),
+ STResList63 = [STRes62|STResList62],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJe007.xml','./msxsdtest/Particles',valid,S62),
+ ITResList47 = [ITRes46|ITResList46],
+
+
+ ?line {STRes63,S63} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJe008.xsd','./msxsdtest/Particles',valid),
+ STResList64 = [STRes63|STResList63],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJe008.xml','./msxsdtest/Particles',valid,S63),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes64,S64} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJe009.xsd','./msxsdtest/Particles',valid),
+ STResList65 = [STRes64|STResList64],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJe009.xml','./msxsdtest/Particles',valid,S64),
+ ITResList49 = [ITRes48|ITResList48],
+
+
+ ?line {STRes65,S65} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJe010.xsd','./msxsdtest/Particles',valid),
+ STResList66 = [STRes65|STResList65],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJe010.xml','./msxsdtest/Particles',valid,S65),
+ ITResList50 = [ITRes49|ITResList49],
+
+
+ ?line {STRes66,S66} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJe011.xsd','./msxsdtest/Particles',valid),
+ STResList67 = [STRes66|STResList66],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJe011.xml','./msxsdtest/Particles',valid,S66),
+ ITResList51 = [ITRes50|ITResList50],
+
+
+ ?line {STRes67,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJe012.xsd','./msxsdtest/Particles',invalid),
+ STResList68 = [STRes67|STResList67],
+
+
+ ?line {STRes68,S68} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJf001.xsd','./msxsdtest/Particles',valid),
+ STResList69 = [STRes68|STResList68],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJf001.xml','./msxsdtest/Particles',valid,S68),
+ ITResList52 = [ITRes51|ITResList51],
+
+
+ ?line {STRes69,S69} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJf002.xsd','./msxsdtest/Particles',valid),
+ STResList70 = [STRes69|STResList69],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJf002.xml','./msxsdtest/Particles',valid,S69),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes70,S70} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJf003.xsd','./msxsdtest/Particles',valid),
+ STResList71 = [STRes70|STResList70],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJf003.xml','./msxsdtest/Particles',valid,S70),
+ ITResList54 = [ITRes53|ITResList53],
+
+
+ ?line {STRes71,S71} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJf004.xsd','./msxsdtest/Particles',valid),
+ STResList72 = [STRes71|STResList71],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJf004.xml','./msxsdtest/Particles',valid,S71),
+ ITResList55 = [ITRes54|ITResList54],
+
+
+ ?line {STRes72,S72} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJf005.xsd','./msxsdtest/Particles',valid),
+ STResList73 = [STRes72|STResList72],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJf005.xml','./msxsdtest/Particles',valid,S72),
+ ITResList56 = [ITRes55|ITResList55],
+
+
+ ?line {STRes73,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJf006.xsd','./msxsdtest/Particles',invalid),
+ STResList74 = [STRes73|STResList73],
+
+
+ ?line {STRes74,S74} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJf007.xsd','./msxsdtest/Particles',valid),
+ STResList75 = [STRes74|STResList74],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJf007.xml','./msxsdtest/Particles',valid,S74),
+ ITResList57 = [ITRes56|ITResList56],
+
+
+ ?line {STRes75,S75} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJf008.xsd','./msxsdtest/Particles',valid),
+ STResList76 = [STRes75|STResList75],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJf008.xml','./msxsdtest/Particles',valid,S75),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes76,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJf009.xsd','./msxsdtest/Particles',invalid),
+ STResList77 = [STRes76|STResList76],
+
+
+ ?line {STRes77,S77} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJf010.xsd','./msxsdtest/Particles',valid),
+ STResList78 = [STRes77|STResList77],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJf010.xml','./msxsdtest/Particles',valid,S77),
+ ITResList59 = [ITRes58|ITResList58],
+
+
+ ?line {STRes78,S78} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJf011.xsd','./msxsdtest/Particles',valid),
+ STResList79 = [STRes78|STResList78],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJf011.xml','./msxsdtest/Particles',valid,S78),
+ ITResList60 = [ITRes59|ITResList59],
+
+
+ ?line {STRes79,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJf012.xsd','./msxsdtest/Particles',invalid),
+ STResList80 = [STRes79|STResList79],
+
+
+ ?line {STRes80,S80} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJf013.xsd','./msxsdtest/Particles',valid),
+ STResList81 = [STRes80|STResList80],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJf013.xml','./msxsdtest/Particles',valid,S80),
+ ITResList61 = [ITRes60|ITResList60],
+
+
+ ?line {STRes81,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJf014.xsd','./msxsdtest/Particles',invalid),
+ STResList82 = [STRes81|STResList81],
+
+
+ ?line {STRes82,S82} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJf015.xsd','./msxsdtest/Particles',valid),
+ STResList83 = [STRes82|STResList82],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJf015.xml','./msxsdtest/Particles',valid,S82),
+ ITResList62 = [ITRes61|ITResList61],
+
+
+ ?line {STRes83,S83} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJf016.xsd','./msxsdtest/Particles',valid),
+ STResList84 = [STRes83|STResList83],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJf016.xml','./msxsdtest/Particles',valid,S83),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes84,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJg001.xsd','./msxsdtest/Particles',invalid),
+ STResList85 = [STRes84|STResList84],
+
+
+ ?line {STRes85,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJh001.xsd','./msxsdtest/Particles',invalid),
+ STResList86 = [STRes85|STResList85],
+
+
+ ?line {STRes86,S86} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJj001.xsd','./msxsdtest/Particles',valid),
+ STResList87 = [STRes86|STResList86],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJj001.xml','./msxsdtest/Particles',valid,S86),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes87,S87} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJj002.xsd','./msxsdtest/Particles',valid),
+ STResList88 = [STRes87|STResList87],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJj002.xml','./msxsdtest/Particles',valid,S87),
+ ITResList65 = [ITRes64|ITResList64],
+
+
+ ?line {STRes88,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJj003.xsd','./msxsdtest/Particles',invalid),
+ STResList89 = [STRes88|STResList88],
+
+
+ ?line {STRes89,S89} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJj004.xsd','./msxsdtest/Particles',valid),
+ STResList90 = [STRes89|STResList89],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJj004.xml','./msxsdtest/Particles',valid,S89),
+ ITResList66 = [ITRes65|ITResList65],
+
+
+ ?line {STRes90,S90} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJj005.xsd','./msxsdtest/Particles',valid),
+ STResList91 = [STRes90|STResList90],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJj005.xml','./msxsdtest/Particles',valid,S90),
+ ITResList67 = [ITRes66|ITResList66],
+
+
+ ?line {STRes91,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJj006.xsd','./msxsdtest/Particles',invalid),
+ STResList92 = [STRes91|STResList91],
+
+
+ ?line {STRes92,S92} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJj007.xsd','./msxsdtest/Particles',valid),
+ STResList93 = [STRes92|STResList92],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJj007.xml','./msxsdtest/Particles',valid,S92),
+ ITResList68 = [ITRes67|ITResList67],
+
+
+ ?line {STRes93,S93} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJj008.xsd','./msxsdtest/Particles',valid),
+ STResList94 = [STRes93|STResList93],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJj008.xml','./msxsdtest/Particles',valid,S93),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes94,S94} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJj009.xsd','./msxsdtest/Particles',valid),
+ STResList95 = [STRes94|STResList94],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJj009.xml','./msxsdtest/Particles',valid,S94),
+ ITResList70 = [ITRes69|ITResList69],
+
+
+ ?line {STRes95,S95} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJj010.xsd','./msxsdtest/Particles',valid),
+ STResList96 = [STRes95|STResList95],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJj010.xml','./msxsdtest/Particles',valid,S95),
+ ITResList71 = [ITRes70|ITResList70],
+
+
+ ?line {STRes96,S96} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJj011.xsd','./msxsdtest/Particles',valid),
+ STResList97 = [STRes96|STResList96],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJj011.xml','./msxsdtest/Particles',valid,S96),
+ ITResList72 = [ITRes71|ITResList71],
+
+
+ ?line {STRes97,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJj012.xsd','./msxsdtest/Particles',invalid),
+ STResList98 = [STRes97|STResList97],
+
+
+ ?line {STRes98,S98} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJk001.xsd','./msxsdtest/Particles',valid),
+ STResList99 = [STRes98|STResList98],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJk001.xml','./msxsdtest/Particles',valid,S98),
+ ITResList73 = [ITRes72|ITResList72],
+
+
+ ?line {STRes99,S99} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJk002.xsd','./msxsdtest/Particles',valid),
+ STResList100 = [STRes99|STResList99],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJk002.xml','./msxsdtest/Particles',valid,S99),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes100,S100} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJk003.xsd','./msxsdtest/Particles',valid),
+ STResList101 = [STRes100|STResList100],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJk003.xml','./msxsdtest/Particles',valid,S100),
+ ITResList75 = [ITRes74|ITResList74],
+
+
+ ?line {STRes101,S101} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJk004.xsd','./msxsdtest/Particles',valid),
+ STResList102 = [STRes101|STResList101],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJk004.xml','./msxsdtest/Particles',valid,S101),
+ ITResList76 = [ITRes75|ITResList75],
+
+
+ ?line {STRes102,S102} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJk005.xsd','./msxsdtest/Particles',valid),
+ STResList103 = [STRes102|STResList102],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJk005.xml','./msxsdtest/Particles',valid,S102),
+ ITResList77 = [ITRes76|ITResList76],
+
+
+ ?line {STRes103,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJk006.xsd','./msxsdtest/Particles',invalid),
+ STResList104 = [STRes103|STResList103],
+
+
+ ?line {STRes104,S104} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJk007.xsd','./msxsdtest/Particles',valid),
+ STResList105 = [STRes104|STResList104],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJk007.xml','./msxsdtest/Particles',valid,S104),
+ ITResList78 = [ITRes77|ITResList77],
+
+
+ ?line {STRes105,S105} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJk008.xsd','./msxsdtest/Particles',valid),
+ STResList106 = [STRes105|STResList105],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJk008.xml','./msxsdtest/Particles',valid,S105),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes106,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJk009.xsd','./msxsdtest/Particles',invalid),
+ STResList107 = [STRes106|STResList106],
+
+
+ ?line {STRes107,S107} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJk010.xsd','./msxsdtest/Particles',valid),
+ STResList108 = [STRes107|STResList107],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJk010.xml','./msxsdtest/Particles',valid,S107),
+ ITResList80 = [ITRes79|ITResList79],
+
+
+ ?line {STRes108,S108} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJk011.xsd','./msxsdtest/Particles',valid),
+ STResList109 = [STRes108|STResList108],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJk011.xml','./msxsdtest/Particles',valid,S108),
+ ITResList81 = [ITRes80|ITResList80],
+
+
+ ?line {STRes109,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJk012.xsd','./msxsdtest/Particles',invalid),
+ STResList110 = [STRes109|STResList109],
+
+
+ ?line {STRes110,S110} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJk013.xsd','./msxsdtest/Particles',valid),
+ STResList111 = [STRes110|STResList110],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJk013.xml','./msxsdtest/Particles',valid,S110),
+ ITResList82 = [ITRes81|ITResList81],
+
+
+ ?line {STRes111,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJk014.xsd','./msxsdtest/Particles',invalid),
+ STResList112 = [STRes111|STResList111],
+
+
+ ?line {STRes112,S112} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesJk015.xsd','./msxsdtest/Particles',valid),
+ STResList113 = [STRes112|STResList112],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesJk015.xml','./msxsdtest/Particles',valid,S112),
+ ITResList83 = [ITRes82|ITResList82],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList113,ITResList83).
+
+%% 3.9.6 Particle Restriction.
+
+particlesKOSRTQUVW(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesK001.xsd','./msxsdtest/Particles',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesK001.xml','./msxsdtest/Particles',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesK002.xsd','./msxsdtest/Particles',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesK002.xml','./msxsdtest/Particles',valid,S1),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesK003.xsd','./msxsdtest/Particles',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesK003.xml','./msxsdtest/Particles',valid,S2),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ ?line {STRes3,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesK004.xsd','./msxsdtest/Particles',invalid),
+ STResList4 = [STRes3|STResList3],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesK005.xsd','./msxsdtest/Particles',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesK005.xml','./msxsdtest/Particles',valid,S4),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ ?line {STRes5,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesK006.xsd','./msxsdtest/Particles',invalid),
+ STResList6 = [STRes5|STResList5],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesK008.xsd','./msxsdtest/Particles',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesK008.xml','./msxsdtest/Particles',valid,S6),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOa001.xsd','./msxsdtest/Particles',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOa001.xml','./msxsdtest/Particles',valid,S7),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes8,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOa002.xsd','./msxsdtest/Particles',invalid),
+ STResList9 = [STRes8|STResList8],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOa003.xsd','./msxsdtest/Particles',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOa003.xml','./msxsdtest/Particles',valid,S9),
+ ITResList7 = [ITRes6|ITResList6],
+
+
+ ?line {STRes10,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOa004.xsd','./msxsdtest/Particles',invalid),
+ STResList11 = [STRes10|STResList10],
+
+
+ ?line {STRes11,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOa005.xsd','./msxsdtest/Particles',invalid),
+ STResList12 = [STRes11|STResList11],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOa006.xsd','./msxsdtest/Particles',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOa006.xml','./msxsdtest/Particles',valid,S12),
+ ITResList8 = [ITRes7|ITResList7],
+
+
+ ?line {STRes13,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOa007.xsd','./msxsdtest/Particles',invalid),
+ STResList14 = [STRes13|STResList13],
+
+
+ ?line {STRes14,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOa008.xsd','./msxsdtest/Particles',invalid),
+ STResList15 = [STRes14|STResList14],
+
+
+ ?line {STRes15,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOa009.xsd','./msxsdtest/Particles',invalid),
+ STResList16 = [STRes15|STResList15],
+
+
+ ?line {STRes16,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOa010.xsd','./msxsdtest/Particles',invalid),
+ STResList17 = [STRes16|STResList16],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOa011.xsd','./msxsdtest/Particles',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOa011.xml','./msxsdtest/Particles',valid,S17),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOa012.xsd','./msxsdtest/Particles',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOa012.xml','./msxsdtest/Particles',valid,S18),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOa013.xsd','./msxsdtest/Particles',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOa013.xml','./msxsdtest/Particles',valid,S19),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOa014.xsd','./msxsdtest/Particles',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOa014.xml','./msxsdtest/Particles',valid,S20),
+ ITResList12 = [ITRes11|ITResList11],
+
+
+ ?line {STRes21,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOa015.xsd','./msxsdtest/Particles',invalid),
+ STResList22 = [STRes21|STResList21],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb001.xsd','./msxsdtest/Particles',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb001.xml','./msxsdtest/Particles',valid,S22),
+ ITResList13 = [ITRes12|ITResList12],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb002.xsd','./msxsdtest/Particles',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb002.xml','./msxsdtest/Particles',valid,S23),
+ ITResList14 = [ITRes13|ITResList13],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb003.xsd','./msxsdtest/Particles',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb003.xml','./msxsdtest/Particles',valid,S24),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb004.xsd','./msxsdtest/Particles',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb004.xml','./msxsdtest/Particles',valid,S25),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb005.xsd','./msxsdtest/Particles',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb005.xml','./msxsdtest/Particles',valid,S26),
+ ITResList17 = [ITRes16|ITResList16],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb006.xsd','./msxsdtest/Particles',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb006.xml','./msxsdtest/Particles',valid,S27),
+ ITResList18 = [ITRes17|ITResList17],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb007.xsd','./msxsdtest/Particles',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb007.xml','./msxsdtest/Particles',valid,S28),
+ ITResList19 = [ITRes18|ITResList18],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb008.xsd','./msxsdtest/Particles',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb008.xml','./msxsdtest/Particles',valid,S29),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb009.xsd','./msxsdtest/Particles',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb009.xml','./msxsdtest/Particles',valid,S30),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes31,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb010.xsd','./msxsdtest/Particles',invalid),
+ STResList32 = [STRes31|STResList31],
+
+
+ ?line {STRes32,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb011.xsd','./msxsdtest/Particles',invalid),
+ STResList33 = [STRes32|STResList32],
+
+
+ ?line {STRes33,S33} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb012.xsd','./msxsdtest/Particles',valid),
+ STResList34 = [STRes33|STResList33],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb012.xml','./msxsdtest/Particles',valid,S33),
+ ITResList22 = [ITRes21|ITResList21],
+
+
+ ?line {STRes34,S34} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb013.xsd','./msxsdtest/Particles',valid),
+ STResList35 = [STRes34|STResList34],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb013.xml','./msxsdtest/Particles',valid,S34),
+ ITResList23 = [ITRes22|ITResList22],
+
+
+ ?line {STRes35,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb014.xsd','./msxsdtest/Particles',invalid),
+ STResList36 = [STRes35|STResList35],
+
+
+ ?line {STRes36,S36} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb015.xsd','./msxsdtest/Particles',valid),
+ STResList37 = [STRes36|STResList36],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb015.xml','./msxsdtest/Particles',valid,S36),
+ ITResList24 = [ITRes23|ITResList23],
+
+
+ ?line {STRes37,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb016.xsd','./msxsdtest/Particles',invalid),
+ STResList38 = [STRes37|STResList37],
+
+
+ ?line {STRes38,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb017.xsd','./msxsdtest/Particles',invalid),
+ STResList39 = [STRes38|STResList38],
+
+
+ ?line {STRes39,S39} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb018.xsd','./msxsdtest/Particles',valid),
+ STResList40 = [STRes39|STResList39],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb018.xml','./msxsdtest/Particles',valid,S39),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ ?line {STRes40,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb019.xsd','./msxsdtest/Particles',invalid),
+ STResList41 = [STRes40|STResList40],
+
+
+ ?line {STRes41,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb020.xsd','./msxsdtest/Particles',invalid),
+ STResList42 = [STRes41|STResList41],
+
+
+ ?line {STRes42,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb021.xsd','./msxsdtest/Particles',invalid),
+ STResList43 = [STRes42|STResList42],
+
+
+ ?line {STRes43,S43} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb022.xsd','./msxsdtest/Particles',valid),
+ STResList44 = [STRes43|STResList43],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb022.xml','./msxsdtest/Particles',valid,S43),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes44,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb023.xsd','./msxsdtest/Particles',invalid),
+ STResList45 = [STRes44|STResList44],
+
+
+ ?line {STRes45,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb024.xsd','./msxsdtest/Particles',invalid),
+ STResList46 = [STRes45|STResList45],
+
+
+ ?line {STRes46,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb025.xsd','./msxsdtest/Particles',invalid),
+ STResList47 = [STRes46|STResList46],
+
+
+ ?line {STRes47,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb026.xsd','./msxsdtest/Particles',invalid),
+ STResList48 = [STRes47|STResList47],
+
+
+ ?line {STRes48,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb027.xsd','./msxsdtest/Particles',invalid),
+ STResList49 = [STRes48|STResList48],
+
+
+ ?line {STRes49,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb028.xsd','./msxsdtest/Particles',invalid),
+ STResList50 = [STRes49|STResList49],
+
+
+ ?line {STRes50,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb029.xsd','./msxsdtest/Particles',invalid),
+ STResList51 = [STRes50|STResList50],
+
+
+ ?line {STRes51,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb030.xsd','./msxsdtest/Particles',invalid),
+ STResList52 = [STRes51|STResList51],
+
+
+ ?line {STRes52,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb031.xsd','./msxsdtest/Particles',invalid),
+ STResList53 = [STRes52|STResList52],
+
+
+ ?line {STRes53,S53} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb032.xsd','./msxsdtest/Particles',valid),
+ STResList54 = [STRes53|STResList53],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb032.xml','./msxsdtest/Particles',valid,S53),
+ ITResList27 = [ITRes26|ITResList26],
+
+
+ ?line {STRes54,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb033.xsd','./msxsdtest/Particles',invalid),
+ STResList55 = [STRes54|STResList54],
+
+
+ ?line {STRes55,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb034.xsd','./msxsdtest/Particles',invalid),
+ STResList56 = [STRes55|STResList55],
+
+
+ ?line {STRes56,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb035.xsd','./msxsdtest/Particles',invalid),
+ STResList57 = [STRes56|STResList56],
+
+
+ ?line {STRes57,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb036.xsd','./msxsdtest/Particles',invalid),
+ STResList58 = [STRes57|STResList57],
+
+
+ ?line {STRes58,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb037.xsd','./msxsdtest/Particles',invalid),
+ STResList59 = [STRes58|STResList58],
+
+
+ ?line {STRes59,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb038.xsd','./msxsdtest/Particles',invalid),
+ STResList60 = [STRes59|STResList59],
+
+
+ ?line {STRes60,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb039.xsd','./msxsdtest/Particles',invalid),
+ STResList61 = [STRes60|STResList60],
+
+
+ ?line {STRes61,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb040.xsd','./msxsdtest/Particles',invalid),
+ STResList62 = [STRes61|STResList61],
+
+
+ ?line {STRes62,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb041.xsd','./msxsdtest/Particles',invalid),
+ STResList63 = [STRes62|STResList62],
+
+
+ ?line {STRes63,S63} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb042.xsd','./msxsdtest/Particles',valid),
+ STResList64 = [STRes63|STResList63],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb042.xml','./msxsdtest/Particles',valid,S63),
+ ITResList28 = [ITRes27|ITResList27],
+
+
+ ?line {STRes64,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb043.xsd','./msxsdtest/Particles',invalid),
+ STResList65 = [STRes64|STResList64],
+
+
+ ?line {STRes65,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb044.xsd','./msxsdtest/Particles',invalid),
+ STResList66 = [STRes65|STResList65],
+
+
+ ?line {STRes66,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb045.xsd','./msxsdtest/Particles',invalid),
+ STResList67 = [STRes66|STResList66],
+
+
+ ?line {STRes67,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb046.xsd','./msxsdtest/Particles',invalid),
+ STResList68 = [STRes67|STResList67],
+
+
+ ?line {STRes68,S68} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb047.xsd','./msxsdtest/Particles',valid),
+ STResList69 = [STRes68|STResList68],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb047.xml','./msxsdtest/Particles',valid,S68),
+ ITResList29 = [ITRes28|ITResList28],
+
+
+ ?line {STRes69,S69} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb048.xsd','./msxsdtest/Particles',valid),
+ STResList70 = [STRes69|STResList69],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb048.xml','./msxsdtest/Particles',valid,S69),
+ ITResList30 = [ITRes29|ITResList29],
+
+
+ ?line {STRes70,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb049.xsd','./msxsdtest/Particles',invalid),
+ STResList71 = [STRes70|STResList70],
+
+
+ ?line {STRes71,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb050.xsd','./msxsdtest/Particles',invalid),
+ STResList72 = [STRes71|STResList71],
+
+
+ ?line {STRes72,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb051.xsd','./msxsdtest/Particles',invalid),
+ STResList73 = [STRes72|STResList72],
+
+
+ ?line {STRes73,S73} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb052.xsd','./msxsdtest/Particles',valid),
+ STResList74 = [STRes73|STResList73],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb052.xml','./msxsdtest/Particles',valid,S73),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes74,S74} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb053.xsd','./msxsdtest/Particles',valid),
+ STResList75 = [STRes74|STResList74],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb053.xml','./msxsdtest/Particles',valid,S74),
+ ITResList32 = [ITRes31|ITResList31],
+
+
+ ?line {STRes75,S75} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb054.xsd','./msxsdtest/Particles',valid),
+ STResList76 = [STRes75|STResList75],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb054.xml','./msxsdtest/Particles',valid,S75),
+ ITResList33 = [ITRes32|ITResList32],
+
+
+ ?line {STRes76,S76} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb055.xsd','./msxsdtest/Particles',valid),
+ STResList77 = [STRes76|STResList76],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb055.xml','./msxsdtest/Particles',valid,S76),
+ ITResList34 = [ITRes33|ITResList33],
+
+
+ ?line {STRes77,S77} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb056.xsd','./msxsdtest/Particles',valid),
+ STResList78 = [STRes77|STResList77],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb056.xml','./msxsdtest/Particles',valid,S77),
+ ITResList35 = [ITRes34|ITResList34],
+
+
+ ?line {STRes78,S78} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb057.xsd','./msxsdtest/Particles',valid),
+ STResList79 = [STRes78|STResList78],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb057.xml','./msxsdtest/Particles',valid,S78),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes79,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb058.xsd','./msxsdtest/Particles',invalid),
+ STResList80 = [STRes79|STResList79],
+
+
+ ?line {STRes80,S80} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb059.xsd','./msxsdtest/Particles',valid),
+ STResList81 = [STRes80|STResList80],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb059.xml','./msxsdtest/Particles',valid,S80),
+ ITResList37 = [ITRes36|ITResList36],
+
+
+ ?line {STRes81,S81} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesOb060.xsd','./msxsdtest/Particles',valid),
+ STResList82 = [STRes81|STResList81],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesOb060.xml','./msxsdtest/Particles',valid,S81),
+ ITResList38 = [ITRes37|ITResList37],
+
+
+ ?line {STRes82,S82} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesS001.xsd','./msxsdtest/Particles',valid),
+ STResList83 = [STRes82|STResList82],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesS001.xml','./msxsdtest/Particles',valid,S82),
+ ITResList39 = [ITRes38|ITResList38],
+
+
+ ?line {STRes83,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesS002.xsd','./msxsdtest/Particles',invalid),
+ STResList84 = [STRes83|STResList83],
+
+
+ ?line {STRes84,S84} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesS003.xsd','./msxsdtest/Particles',valid),
+ STResList85 = [STRes84|STResList84],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesS003.xml','./msxsdtest/Particles',valid,S84),
+ ITResList40 = [ITRes39|ITResList39],
+
+
+ ?line {STRes85,S85} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesS004.xsd','./msxsdtest/Particles',valid),
+ STResList86 = [STRes85|STResList85],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesS004.xml','./msxsdtest/Particles',valid,S85),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes86,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesS005.xsd','./msxsdtest/Particles',invalid),
+ STResList87 = [STRes86|STResList86],
+
+
+ ?line {STRes87,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesS006.xsd','./msxsdtest/Particles',invalid),
+ STResList88 = [STRes87|STResList87],
+
+
+ ?line {STRes88,S88} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesS007.xsd','./msxsdtest/Particles',valid),
+ STResList89 = [STRes88|STResList88],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesS007.xml','./msxsdtest/Particles',valid,S88),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes89,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesS008.xsd','./msxsdtest/Particles',invalid),
+ STResList90 = [STRes89|STResList89],
+
+
+ ?line {STRes90,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesS009.xsd','./msxsdtest/Particles',invalid),
+ STResList91 = [STRes90|STResList90],
+
+
+ ?line {STRes91,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesS010.xsd','./msxsdtest/Particles',invalid),
+ STResList92 = [STRes91|STResList91],
+
+
+ ?line {STRes92,S92} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesS011.xsd','./msxsdtest/Particles',valid),
+ STResList93 = [STRes92|STResList92],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesS011.xml','./msxsdtest/Particles',valid,S92),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes93,S93} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR001.xsd','./msxsdtest/Particles',valid),
+ STResList94 = [STRes93|STResList93],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesR001.xml','./msxsdtest/Particles',valid,S93),
+ ITResList44 = [ITRes43|ITResList43],
+
+
+ ?line {STRes94,S94} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR002.xsd','./msxsdtest/Particles',valid),
+ STResList95 = [STRes94|STResList94],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesR002.xml','./msxsdtest/Particles',valid,S94),
+ ITResList45 = [ITRes44|ITResList44],
+
+
+ ?line {STRes95,S95} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR003.xsd','./msxsdtest/Particles',valid),
+ STResList96 = [STRes95|STResList95],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesR003.xml','./msxsdtest/Particles',valid,S95),
+ ITResList46 = [ITRes45|ITResList45],
+
+
+ ?line {STRes96,S96} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR004.xsd','./msxsdtest/Particles',valid),
+ STResList97 = [STRes96|STResList96],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesR004.xml','./msxsdtest/Particles',valid,S96),
+ ITResList47 = [ITRes46|ITResList46],
+
+
+ ?line {STRes97,S97} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR005.xsd','./msxsdtest/Particles',valid),
+ STResList98 = [STRes97|STResList97],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesR005.xml','./msxsdtest/Particles',valid,S97),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes98,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR006.xsd','./msxsdtest/Particles',invalid),
+ STResList99 = [STRes98|STResList98],
+
+
+ ?line {STRes99,S99} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR007.xsd','./msxsdtest/Particles',valid),
+ STResList100 = [STRes99|STResList99],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesR007.xml','./msxsdtest/Particles',valid,S99),
+ ITResList49 = [ITRes48|ITResList48],
+
+
+ ?line {STRes100,S100} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR008.xsd','./msxsdtest/Particles',valid),
+ STResList101 = [STRes100|STResList100],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesR008.xml','./msxsdtest/Particles',valid,S100),
+ ITResList50 = [ITRes49|ITResList49],
+
+
+ ?line {STRes101,S101} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR009.xsd','./msxsdtest/Particles',valid),
+ STResList102 = [STRes101|STResList101],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesR009.xml','./msxsdtest/Particles',valid,S101),
+ ITResList51 = [ITRes50|ITResList50],
+
+
+ ?line {STRes102,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR010.xsd','./msxsdtest/Particles',invalid),
+ STResList103 = [STRes102|STResList102],
+
+
+ ?line {STRes103,S103} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR011.xsd','./msxsdtest/Particles',valid),
+ STResList104 = [STRes103|STResList103],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesR011.xml','./msxsdtest/Particles',valid,S103),
+ ITResList52 = [ITRes51|ITResList51],
+
+
+ ?line {STRes104,S104} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR012.xsd','./msxsdtest/Particles',valid),
+ STResList105 = [STRes104|STResList104],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesR012.xml','./msxsdtest/Particles',valid,S104),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes105,S105} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR013.xsd','./msxsdtest/Particles',valid),
+ STResList106 = [STRes105|STResList105],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesR013.xml','./msxsdtest/Particles',valid,S105),
+ ITResList54 = [ITRes53|ITResList53],
+
+
+ ?line {STRes106,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR014.xsd','./msxsdtest/Particles',invalid),
+ STResList107 = [STRes106|STResList106],
+
+
+ ?line {STRes107,S107} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR015.xsd','./msxsdtest/Particles',valid),
+ STResList108 = [STRes107|STResList107],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesR015.xml','./msxsdtest/Particles',valid,S107),
+ ITResList55 = [ITRes54|ITResList54],
+
+
+ ?line {STRes108,S108} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR016.xsd','./msxsdtest/Particles',valid),
+ STResList109 = [STRes108|STResList108],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesR016.xml','./msxsdtest/Particles',valid,S108),
+ ITResList56 = [ITRes55|ITResList55],
+
+
+ ?line {STRes109,S109} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR017.xsd','./msxsdtest/Particles',valid),
+ STResList110 = [STRes109|STResList109],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesR017.xml','./msxsdtest/Particles',valid,S109),
+ ITResList57 = [ITRes56|ITResList56],
+
+
+ ?line {STRes110,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR018.xsd','./msxsdtest/Particles',invalid),
+ STResList111 = [STRes110|STResList110],
+
+
+ ?line {STRes111,S111} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR019.xsd','./msxsdtest/Particles',valid),
+ STResList112 = [STRes111|STResList111],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesR019.xml','./msxsdtest/Particles',valid,S111),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes112,S112} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR020.xsd','./msxsdtest/Particles',valid),
+ STResList113 = [STRes112|STResList112],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesR020.xml','./msxsdtest/Particles',valid,S112),
+ ITResList59 = [ITRes58|ITResList58],
+
+
+ ?line {STRes113,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR021.xsd','./msxsdtest/Particles',invalid),
+ STResList114 = [STRes113|STResList113],
+
+
+ ?line {STRes114,S114} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR022.xsd','./msxsdtest/Particles',valid),
+ STResList115 = [STRes114|STResList114],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesR022.xml','./msxsdtest/Particles',valid,S114),
+ ITResList60 = [ITRes59|ITResList59],
+
+
+ ?line {STRes115,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR023.xsd','./msxsdtest/Particles',invalid),
+ STResList116 = [STRes115|STResList115],
+
+
+ ?line {STRes116,S116} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR024.xsd','./msxsdtest/Particles',valid),
+ STResList117 = [STRes116|STResList116],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesR024.xml','./msxsdtest/Particles',valid,S116),
+ ITResList61 = [ITRes60|ITResList60],
+
+
+ ?line {STRes117,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR025.xsd','./msxsdtest/Particles',invalid),
+ STResList118 = [STRes117|STResList117],
+
+
+ ?line {STRes118,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR026.xsd','./msxsdtest/Particles',invalid),
+ STResList119 = [STRes118|STResList118],
+
+
+ ?line {STRes119,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR027.xsd','./msxsdtest/Particles',invalid),
+ STResList120 = [STRes119|STResList119],
+
+
+ ?line {STRes120,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR028.xsd','./msxsdtest/Particles',invalid),
+ STResList121 = [STRes120|STResList120],
+
+
+ ?line {STRes121,S121} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR029.xsd','./msxsdtest/Particles',valid),
+ STResList122 = [STRes121|STResList121],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesR029.xml','./msxsdtest/Particles',valid,S121),
+ ITResList62 = [ITRes61|ITResList61],
+
+
+ ?line {STRes122,S122} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR030.xsd','./msxsdtest/Particles',valid),
+ STResList123 = [STRes122|STResList122],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesR030.xml','./msxsdtest/Particles',valid,S122),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes123,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesR031.xsd','./msxsdtest/Particles',invalid),
+ STResList124 = [STRes123|STResList123],
+
+
+ ?line {STRes124,S124} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesT001.xsd','./msxsdtest/Particles',valid),
+ STResList125 = [STRes124|STResList124],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesT001.xml','./msxsdtest/Particles',valid,S124),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes125,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesT002.xsd','./msxsdtest/Particles',invalid),
+ STResList126 = [STRes125|STResList125],
+
+
+ ?line {STRes126,S126} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesT003.xsd','./msxsdtest/Particles',valid),
+ STResList127 = [STRes126|STResList126],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesT003.xml','./msxsdtest/Particles',valid,S126),
+ ITResList65 = [ITRes64|ITResList64],
+
+
+ ?line {STRes127,S127} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesT004.xsd','./msxsdtest/Particles',valid),
+ STResList128 = [STRes127|STResList127],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesT004.xml','./msxsdtest/Particles',valid,S127),
+ ITResList66 = [ITRes65|ITResList65],
+
+
+ ?line {STRes128,S128} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesT005.xsd','./msxsdtest/Particles',valid),
+ STResList129 = [STRes128|STResList128],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesT005.xml','./msxsdtest/Particles',valid,S128),
+ ITResList67 = [ITRes66|ITResList66],
+
+
+ ?line {STRes129,S129} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesT006.xsd','./msxsdtest/Particles',valid),
+ STResList130 = [STRes129|STResList129],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesT006.xml','./msxsdtest/Particles',valid,S129),
+ ITResList68 = [ITRes67|ITResList67],
+
+
+ ?line {STRes130,S130} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesT007.xsd','./msxsdtest/Particles',valid),
+ STResList131 = [STRes130|STResList130],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesT007.xml','./msxsdtest/Particles',valid,S130),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes131,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesT008.xsd','./msxsdtest/Particles',invalid),
+ STResList132 = [STRes131|STResList131],
+
+
+ ?line {STRes132,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesT009.xsd','./msxsdtest/Particles',invalid),
+ STResList133 = [STRes132|STResList132],
+
+
+ ?line {STRes133,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesT010.xsd','./msxsdtest/Particles',invalid),
+ STResList134 = [STRes133|STResList133],
+
+
+ ?line {STRes134,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesT011.xsd','./msxsdtest/Particles',invalid),
+ STResList135 = [STRes134|STResList134],
+
+
+ ?line {STRes135,S135} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesT012.xsd','./msxsdtest/Particles',valid),
+ STResList136 = [STRes135|STResList135],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesT012.xml','./msxsdtest/Particles',valid,S135),
+ ITResList70 = [ITRes69|ITResList69],
+
+
+ ?line {STRes136,S136} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesT013.xsd','./msxsdtest/Particles',valid),
+ STResList137 = [STRes136|STResList136],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesT013.xml','./msxsdtest/Particles',valid,S136),
+ ITResList71 = [ITRes70|ITResList70],
+
+
+ ?line {STRes137,S137} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesT014.xsd','./msxsdtest/Particles',valid),
+ STResList138 = [STRes137|STResList137],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesT014.xml','./msxsdtest/Particles',valid,S137),
+ ITResList72 = [ITRes71|ITResList71],
+
+
+ ?line {STRes138,S138} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ001.xsd','./msxsdtest/Particles',valid),
+ STResList139 = [STRes138|STResList138],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesQ001.xml','./msxsdtest/Particles',valid,S138),
+ ITResList73 = [ITRes72|ITResList72],
+
+
+ ?line {STRes139,S139} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ002.xsd','./msxsdtest/Particles',valid),
+ STResList140 = [STRes139|STResList139],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesQ002.xml','./msxsdtest/Particles',valid,S139),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes140,S140} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ003.xsd','./msxsdtest/Particles',valid),
+ STResList141 = [STRes140|STResList140],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesQ003.xml','./msxsdtest/Particles',valid,S140),
+ ITResList75 = [ITRes74|ITResList74],
+
+
+ ?line {STRes141,S141} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ004.xsd','./msxsdtest/Particles',valid),
+ STResList142 = [STRes141|STResList141],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesQ004.xml','./msxsdtest/Particles',valid,S141),
+ ITResList76 = [ITRes75|ITResList75],
+
+
+ ?line {STRes142,S142} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ005.xsd','./msxsdtest/Particles',valid),
+ STResList143 = [STRes142|STResList142],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesQ005.xml','./msxsdtest/Particles',valid,S142),
+ ITResList77 = [ITRes76|ITResList76],
+
+
+ ?line {STRes143,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ006.xsd','./msxsdtest/Particles',invalid),
+ STResList144 = [STRes143|STResList143],
+
+
+ ?line {STRes144,S144} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ007.xsd','./msxsdtest/Particles',valid),
+ STResList145 = [STRes144|STResList144],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesQ007.xml','./msxsdtest/Particles',valid,S144),
+ ITResList78 = [ITRes77|ITResList77],
+
+
+ ?line {STRes145,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ008.xsd','./msxsdtest/Particles',invalid),
+ STResList146 = [STRes145|STResList145],
+
+
+ ?line {STRes146,S146} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ011.xsd','./msxsdtest/Particles',valid),
+ STResList147 = [STRes146|STResList146],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesQ011.xml','./msxsdtest/Particles',valid,S146),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes147,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ012.xsd','./msxsdtest/Particles',invalid),
+ STResList148 = [STRes147|STResList147],
+
+
+ ?line {STRes148,S148} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ013.xsd','./msxsdtest/Particles',valid),
+ STResList149 = [STRes148|STResList148],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesQ013.xml','./msxsdtest/Particles',valid,S148),
+ ITResList80 = [ITRes79|ITResList79],
+
+
+ ?line {STRes149,S149} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ016.xsd','./msxsdtest/Particles',valid),
+ STResList150 = [STRes149|STResList149],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesQ016.xml','./msxsdtest/Particles',valid,S149),
+ ITResList81 = [ITRes80|ITResList80],
+
+
+ ?line {STRes150,S150} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ017.xsd','./msxsdtest/Particles',valid),
+ STResList151 = [STRes150|STResList150],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesQ017.xml','./msxsdtest/Particles',valid,S150),
+ ITResList82 = [ITRes81|ITResList81],
+
+
+ ?line {STRes151,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ018.xsd','./msxsdtest/Particles',invalid),
+ STResList152 = [STRes151|STResList151],
+
+
+ ?line {STRes152,S152} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ019.xsd','./msxsdtest/Particles',valid),
+ STResList153 = [STRes152|STResList152],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesQ019.xml','./msxsdtest/Particles',valid,S152),
+ ITResList83 = [ITRes82|ITResList82],
+
+
+ ?line {STRes153,S153} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ020.xsd','./msxsdtest/Particles',valid),
+ STResList154 = [STRes153|STResList153],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesQ020.xml','./msxsdtest/Particles',valid,S153),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes154,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ021.xsd','./msxsdtest/Particles',invalid),
+ STResList155 = [STRes154|STResList154],
+
+
+ ?line {STRes155,S155} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ022.xsd','./msxsdtest/Particles',valid),
+ STResList156 = [STRes155|STResList155],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesQ022.xml','./msxsdtest/Particles',valid,S155),
+ ITResList85 = [ITRes84|ITResList84],
+
+
+ ?line {STRes156,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ023.xsd','./msxsdtest/Particles',invalid),
+ STResList157 = [STRes156|STResList156],
+
+
+ ?line {STRes157,S157} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ024.xsd','./msxsdtest/Particles',valid),
+ STResList158 = [STRes157|STResList157],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesQ024.xml','./msxsdtest/Particles',valid,S157),
+ ITResList86 = [ITRes85|ITResList85],
+
+
+ ?line {STRes158,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ025.xsd','./msxsdtest/Particles',invalid),
+ STResList159 = [STRes158|STResList158],
+
+
+ ?line {STRes159,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ026.xsd','./msxsdtest/Particles',invalid),
+ STResList160 = [STRes159|STResList159],
+
+
+ ?line {STRes160,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ027.xsd','./msxsdtest/Particles',invalid),
+ STResList161 = [STRes160|STResList160],
+
+
+ ?line {STRes161,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ028.xsd','./msxsdtest/Particles',invalid),
+ STResList162 = [STRes161|STResList161],
+
+
+ ?line {STRes162,S162} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ029.xsd','./msxsdtest/Particles',valid),
+ STResList163 = [STRes162|STResList162],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesQ029.xml','./msxsdtest/Particles',valid,S162),
+ ITResList87 = [ITRes86|ITResList86],
+
+
+ ?line {STRes163,S163} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ030.xsd','./msxsdtest/Particles',valid),
+ STResList164 = [STRes163|STResList163],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesQ030.xml','./msxsdtest/Particles',valid,S163),
+ ITResList88 = [ITRes87|ITResList87],
+
+
+ ?line {STRes164,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesQ031.xsd','./msxsdtest/Particles',invalid),
+ STResList165 = [STRes164|STResList164],
+
+
+ ?line {STRes165,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesU001.xsd','./msxsdtest/Particles',invalid),
+ STResList166 = [STRes165|STResList165],
+
+
+ ?line {STRes166,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesU002.xsd','./msxsdtest/Particles',invalid),
+ STResList167 = [STRes166|STResList166],
+
+
+ ?line {STRes167,S167} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesU003.xsd','./msxsdtest/Particles',valid),
+ STResList168 = [STRes167|STResList167],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesU003.xml','./msxsdtest/Particles',valid,S167),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes168,S168} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesU004.xsd','./msxsdtest/Particles',valid),
+ STResList169 = [STRes168|STResList168],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesU004.xml','./msxsdtest/Particles',valid,S168),
+ ITResList90 = [ITRes89|ITResList89],
+
+
+ ?line {STRes169,S169} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesU005.xsd','./msxsdtest/Particles',valid),
+ STResList170 = [STRes169|STResList169],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesU005.xml','./msxsdtest/Particles',valid,S169),
+ ITResList91 = [ITRes90|ITResList90],
+
+
+ ?line {STRes170,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesU006.xsd','./msxsdtest/Particles',invalid),
+ STResList171 = [STRes170|STResList170],
+
+
+ ?line {STRes171,S171} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesU007.xsd','./msxsdtest/Particles',valid),
+ STResList172 = [STRes171|STResList171],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesU007.xml','./msxsdtest/Particles',valid,S171),
+ ITResList92 = [ITRes91|ITResList91],
+
+
+ ?line {STRes172,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesU008.xsd','./msxsdtest/Particles',invalid),
+ STResList173 = [STRes172|STResList172],
+
+
+ ?line {STRes173,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesU009.xsd','./msxsdtest/Particles',invalid),
+ STResList174 = [STRes173|STResList173],
+
+
+ ?line {STRes174,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesV002.xsd','./msxsdtest/Particles',invalid),
+ STResList175 = [STRes174|STResList174],
+
+
+ ?line {STRes175,S175} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesV003.xsd','./msxsdtest/Particles',valid),
+ STResList176 = [STRes175|STResList175],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesV003.xml','./msxsdtest/Particles',valid,S175),
+ ITResList93 = [ITRes92|ITResList92],
+
+
+ ?line {STRes176,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesV005.xsd','./msxsdtest/Particles',invalid),
+ STResList177 = [STRes176|STResList176],
+
+
+ ?line {STRes177,S177} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesV006.xsd','./msxsdtest/Particles',valid),
+ STResList178 = [STRes177|STResList177],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesV006.xml','./msxsdtest/Particles',valid,S177),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes178,S178} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesV007.xsd','./msxsdtest/Particles',valid),
+ STResList179 = [STRes178|STResList178],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesV007.xml','./msxsdtest/Particles',valid,S178),
+ ITResList95 = [ITRes94|ITResList94],
+
+
+ ?line {STRes179,S179} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesV008.xsd','./msxsdtest/Particles',valid),
+ STResList180 = [STRes179|STResList179],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesV008.xml','./msxsdtest/Particles',valid,S179),
+ ITResList96 = [ITRes95|ITResList95],
+
+
+ ?line {STRes180,S180} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesV009.xsd','./msxsdtest/Particles',valid),
+ STResList181 = [STRes180|STResList180],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesV009.xml','./msxsdtest/Particles',valid,S180),
+ ITResList97 = [ITRes96|ITResList96],
+
+
+ ?line {STRes181,S181} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesV010.xsd','./msxsdtest/Particles',valid),
+ STResList182 = [STRes181|STResList181],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesV010.xml','./msxsdtest/Particles',valid,S181),
+ ITResList98 = [ITRes97|ITResList97],
+
+
+ ?line {STRes182,S182} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesV011.xsd','./msxsdtest/Particles',valid),
+ STResList183 = [STRes182|STResList182],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesV011.xml','./msxsdtest/Particles',valid,S182),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes183,S183} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesV012.xsd','./msxsdtest/Particles',valid),
+ STResList184 = [STRes183|STResList183],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesV012.xml','./msxsdtest/Particles',valid,S183),
+ ITResList100 = [ITRes99|ITResList99],
+
+
+ ?line {STRes184,S184} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesV013.xsd','./msxsdtest/Particles',valid),
+ STResList185 = [STRes184|STResList184],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesV013.xml','./msxsdtest/Particles',valid,S184),
+ ITResList101 = [ITRes100|ITResList100],
+
+
+ ?line {STRes185,S185} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesV014.xsd','./msxsdtest/Particles',valid),
+ STResList186 = [STRes185|STResList185],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesV014.xml','./msxsdtest/Particles',valid,S185),
+ ITResList102 = [ITRes101|ITResList101],
+
+
+ ?line {STRes186,S186} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesV015.xsd','./msxsdtest/Particles',valid),
+ STResList187 = [STRes186|STResList186],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesV015.xml','./msxsdtest/Particles',valid,S186),
+ ITResList103 = [ITRes102|ITResList102],
+
+
+ ?line {STRes187,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesV016.xsd','./msxsdtest/Particles',invalid),
+ STResList188 = [STRes187|STResList187],
+
+
+ ?line {STRes188,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesV017.xsd','./msxsdtest/Particles',invalid),
+ STResList189 = [STRes188|STResList188],
+
+
+ ?line {STRes189,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesV018.xsd','./msxsdtest/Particles',invalid),
+ STResList190 = [STRes189|STResList189],
+
+
+ ?line {STRes190,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesV020.xsd','./msxsdtest/Particles',invalid),
+ STResList191 = [STRes190|STResList190],
+
+
+ ?line {STRes191,S191} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesW001.xsd','./msxsdtest/Particles',valid),
+ STResList192 = [STRes191|STResList191],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesW001.xml','./msxsdtest/Particles',valid,S191),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes192,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesW002.xsd','./msxsdtest/Particles',invalid),
+ STResList193 = [STRes192|STResList192],
+
+
+ ?line {STRes193,S193} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesW003.xsd','./msxsdtest/Particles',valid),
+ STResList194 = [STRes193|STResList193],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesW003.xml','./msxsdtest/Particles',valid,S193),
+ ITResList105 = [ITRes104|ITResList104],
+
+
+ ?line {STRes194,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesW005.xsd','./msxsdtest/Particles',invalid),
+ STResList195 = [STRes194|STResList194],
+
+
+ ?line {STRes195,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesW006.xsd','./msxsdtest/Particles',valid),
+ STResList196 = [STRes195|STResList195],
+
+
+ ?line {STRes196,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesW007.xsd','./msxsdtest/Particles',invalid),
+ STResList197 = [STRes196|STResList196],
+
+
+ ?line {STRes197,S197} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesW008.xsd','./msxsdtest/Particles',valid),
+ STResList198 = [STRes197|STResList197],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesW008.xml','./msxsdtest/Particles',valid,S197),
+ ITResList106 = [ITRes105|ITResList105],
+
+
+ ?line {STRes198,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesW010.xsd','./msxsdtest/Particles',invalid),
+ STResList199 = [STRes198|STResList198],
+
+
+ ?line {STRes199,S199} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesW011.xsd','./msxsdtest/Particles',valid),
+ STResList200 = [STRes199|STResList199],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesW011.xml','./msxsdtest/Particles',valid,S199),
+ ITResList107 = [ITRes106|ITResList106],
+
+
+ ?line {STRes200,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesW012.xsd','./msxsdtest/Particles',invalid),
+ STResList201 = [STRes200|STResList200],
+
+
+ ?line {STRes201,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesW013.xsd','./msxsdtest/Particles',invalid),
+ STResList202 = [STRes201|STResList201],
+
+
+ ?line {STRes202,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesW014.xsd','./msxsdtest/Particles',invalid),
+ STResList203 = [STRes202|STResList202],
+
+
+ ?line {STRes203,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesW015.xsd','./msxsdtest/Particles',invalid),
+ STResList204 = [STRes203|STResList203],
+
+
+ ?line {STRes204,S204} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Particles/particlesW016.xsd','./msxsdtest/Particles',valid),
+ STResList205 = [STRes204|STResList204],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/Particles/particlesW016.xml','./msxsdtest/Particles',valid,S204),
+ ITResList108 = [ITRes107|ITResList107],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList205,ITResList108).
+
+%% Syntax Checking for simpleType Declaration.
+
+stABCDE(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stA001.xsd','./msxsdtest/simpleType',valid),
+ STResList1 = [STRes0|STResList0],
+
+
+ ?line {STRes1,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stA002.xsd','./msxsdtest/simpleType',invalid),
+ STResList2 = [STRes1|STResList1],
+
+
+ ?line {STRes2,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stA003.xsd','./msxsdtest/simpleType',invalid),
+ STResList3 = [STRes2|STResList2],
+
+
+ ?line {STRes3,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stA004.xsd','./msxsdtest/simpleType',invalid),
+ STResList4 = [STRes3|STResList3],
+
+
+ ?line {STRes4,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stA005.xsd','./msxsdtest/simpleType',invalid),
+ STResList5 = [STRes4|STResList4],
+
+
+ ?line {STRes5,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stA006.xsd','./msxsdtest/simpleType',valid),
+ STResList6 = [STRes5|STResList5],
+
+
+ ?line {STRes6,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stA007.xsd','./msxsdtest/simpleType',valid),
+ STResList7 = [STRes6|STResList6],
+
+
+ ?line {STRes7,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stA008.xsd','./msxsdtest/simpleType',invalid),
+ STResList8 = [STRes7|STResList7],
+
+
+ ?line {STRes8,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stA009.xsd','./msxsdtest/simpleType',invalid),
+ STResList9 = [STRes8|STResList8],
+
+
+ ?line {STRes9,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stA010.xsd','./msxsdtest/simpleType',invalid),
+ STResList10 = [STRes9|STResList9],
+
+
+ ?line {STRes10,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stA011.xsd','./msxsdtest/simpleType',invalid),
+ STResList11 = [STRes10|STResList10],
+
+
+ ?line {STRes11,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stA012.xsd','./msxsdtest/simpleType',invalid),
+ STResList12 = [STRes11|STResList11],
+
+
+ ?line {STRes12,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stA013.xsd','./msxsdtest/simpleType',invalid),
+ STResList13 = [STRes12|STResList12],
+
+
+ ?line {STRes13,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stA014.xsd','./msxsdtest/simpleType',invalid),
+ STResList14 = [STRes13|STResList13],
+
+
+ ?line {STRes14,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stA015.xsd','./msxsdtest/simpleType',invalid),
+ STResList15 = [STRes14|STResList14],
+
+
+ ?line {STRes15,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stA016.xsd','./msxsdtest/simpleType',valid),
+ STResList16 = [STRes15|STResList15],
+
+
+ ?line {STRes16,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stA017.xsd','./msxsdtest/simpleType',invalid),
+ STResList17 = [STRes16|STResList16],
+
+
+ ?line {STRes17,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stA018.xsd','./msxsdtest/simpleType',valid),
+ STResList18 = [STRes17|STResList17],
+
+
+ ?line {STRes18,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stA019.xsd','./msxsdtest/simpleType',valid),
+ STResList19 = [STRes18|STResList18],
+
+
+ ?line {STRes19,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stA020.xsd','./msxsdtest/simpleType',valid),
+ STResList20 = [STRes19|STResList19],
+
+
+ ?line {STRes20,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB001.xsd','./msxsdtest/simpleType',invalid),
+ STResList21 = [STRes20|STResList20],
+
+
+ ?line {STRes21,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB002.xsd','./msxsdtest/simpleType',invalid),
+ STResList22 = [STRes21|STResList21],
+
+
+ ?line {STRes22,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB003.xsd','./msxsdtest/simpleType',valid),
+ STResList23 = [STRes22|STResList22],
+
+
+ ?line {STRes23,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB004.xsd','./msxsdtest/simpleType',invalid),
+ STResList24 = [STRes23|STResList23],
+
+
+ ?line {STRes24,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB005.xsd','./msxsdtest/simpleType',invalid),
+ STResList25 = [STRes24|STResList24],
+
+
+ ?line {STRes25,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB006.xsd','./msxsdtest/simpleType',valid),
+ STResList26 = [STRes25|STResList25],
+
+
+ ?line {STRes26,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB007.xsd','./msxsdtest/simpleType',invalid),
+ STResList27 = [STRes26|STResList26],
+
+
+ ?line {STRes27,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB008.xsd','./msxsdtest/simpleType',valid),
+ STResList28 = [STRes27|STResList27],
+
+
+ ?line {STRes28,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB009.xsd','./msxsdtest/simpleType',invalid),
+ STResList29 = [STRes28|STResList28],
+
+
+ ?line {STRes29,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB010.xsd','./msxsdtest/simpleType',invalid),
+ STResList30 = [STRes29|STResList29],
+
+
+ ?line {STRes30,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB011.xsd','./msxsdtest/simpleType',valid),
+ STResList31 = [STRes30|STResList30],
+
+
+ ?line {STRes31,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB012.xsd','./msxsdtest/simpleType',valid),
+ STResList32 = [STRes31|STResList31],
+
+
+ ?line {STRes32,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB013.xsd','./msxsdtest/simpleType',invalid),
+ STResList33 = [STRes32|STResList32],
+
+
+ ?line {STRes33,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB014.xsd','./msxsdtest/simpleType',invalid),
+ STResList34 = [STRes33|STResList33],
+
+
+ ?line {STRes34,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB015.xsd','./msxsdtest/simpleType',valid),
+ STResList35 = [STRes34|STResList34],
+
+
+ ?line {STRes35,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB016.xsd','./msxsdtest/simpleType',invalid),
+ STResList36 = [STRes35|STResList35],
+
+
+ ?line {STRes36,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB017.xsd','./msxsdtest/simpleType',invalid),
+ STResList37 = [STRes36|STResList36],
+
+
+ ?line {STRes37,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB018.xsd','./msxsdtest/simpleType',invalid),
+ STResList38 = [STRes37|STResList37],
+
+
+ ?line {STRes38,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB019.xsd','./msxsdtest/simpleType',invalid),
+ STResList39 = [STRes38|STResList38],
+
+
+ ?line {STRes39,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB020.xsd','./msxsdtest/simpleType',invalid),
+ STResList40 = [STRes39|STResList39],
+
+
+ ?line {STRes40,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB021.xsd','./msxsdtest/simpleType',invalid),
+ STResList41 = [STRes40|STResList40],
+
+
+ ?line {STRes41,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB022.xsd','./msxsdtest/simpleType',invalid),
+ STResList42 = [STRes41|STResList41],
+
+
+ ?line {STRes42,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB023.xsd','./msxsdtest/simpleType',invalid),
+ STResList43 = [STRes42|STResList42],
+
+
+ ?line {STRes43,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stB024.xsd','./msxsdtest/simpleType',invalid),
+ STResList44 = [STRes43|STResList43],
+
+
+ ?line {STRes44,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC001.xsd','./msxsdtest/simpleType',valid),
+ STResList45 = [STRes44|STResList44],
+
+
+ ?line {STRes45,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC002.xsd','./msxsdtest/simpleType',invalid),
+ STResList46 = [STRes45|STResList45],
+
+
+ ?line {STRes46,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC003.xsd','./msxsdtest/simpleType',valid),
+ STResList47 = [STRes46|STResList46],
+
+
+ ?line {STRes47,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC004.xsd','./msxsdtest/simpleType',invalid),
+ STResList48 = [STRes47|STResList47],
+
+
+ ?line {STRes48,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC005.xsd','./msxsdtest/simpleType',valid),
+ STResList49 = [STRes48|STResList48],
+
+
+ ?line {STRes49,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC006.xsd','./msxsdtest/simpleType',invalid),
+ STResList50 = [STRes49|STResList49],
+
+
+ ?line {STRes50,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC007.xsd','./msxsdtest/simpleType',invalid),
+ STResList51 = [STRes50|STResList50],
+
+
+ ?line {STRes51,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC008.xsd','./msxsdtest/simpleType',invalid),
+ STResList52 = [STRes51|STResList51],
+
+
+ ?line {STRes52,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC009.xsd','./msxsdtest/simpleType',invalid),
+ STResList53 = [STRes52|STResList52],
+
+
+ ?line {STRes53,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC010.xsd','./msxsdtest/simpleType',valid),
+ STResList54 = [STRes53|STResList53],
+
+
+ ?line {STRes54,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC011.xsd','./msxsdtest/simpleType',invalid),
+ STResList55 = [STRes54|STResList54],
+
+
+ ?line {STRes55,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC012.xsd','./msxsdtest/simpleType',invalid),
+ STResList56 = [STRes55|STResList55],
+
+
+ ?line {STRes56,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC013.xsd','./msxsdtest/simpleType',invalid),
+ STResList57 = [STRes56|STResList56],
+
+
+ ?line {STRes57,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC014.xsd','./msxsdtest/simpleType',valid),
+ STResList58 = [STRes57|STResList57],
+
+
+ ?line {STRes58,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC015.xsd','./msxsdtest/simpleType',valid),
+ STResList59 = [STRes58|STResList58],
+
+
+ ?line {STRes59,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC016.xsd','./msxsdtest/simpleType',valid),
+ STResList60 = [STRes59|STResList59],
+
+
+ ?line {STRes60,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC017.xsd','./msxsdtest/simpleType',valid),
+ STResList61 = [STRes60|STResList60],
+
+
+ ?line {STRes61,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC018.xsd','./msxsdtest/simpleType',valid),
+ STResList62 = [STRes61|STResList61],
+
+
+ ?line {STRes62,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC019.xsd','./msxsdtest/simpleType',valid),
+ STResList63 = [STRes62|STResList62],
+
+
+ ?line {STRes63,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC020.xsd','./msxsdtest/simpleType',valid),
+ STResList64 = [STRes63|STResList63],
+
+
+ ?line {STRes64,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC021.xsd','./msxsdtest/simpleType',valid),
+ STResList65 = [STRes64|STResList64],
+
+
+ ?line {STRes65,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC022.xsd','./msxsdtest/simpleType',valid),
+ STResList66 = [STRes65|STResList65],
+
+
+ ?line {STRes66,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC023.xsd','./msxsdtest/simpleType',invalid),
+ STResList67 = [STRes66|STResList66],
+
+
+ ?line {STRes67,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC024.xsd','./msxsdtest/simpleType',valid),
+ STResList68 = [STRes67|STResList67],
+
+
+ ?line {STRes68,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC025.xsd','./msxsdtest/simpleType',valid),
+ STResList69 = [STRes68|STResList68],
+
+
+ ?line {STRes69,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC026.xsd','./msxsdtest/simpleType',valid),
+ STResList70 = [STRes69|STResList69],
+
+
+ ?line {STRes70,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC027.xsd','./msxsdtest/simpleType',invalid),
+ STResList71 = [STRes70|STResList70],
+
+
+ ?line {STRes71,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC028.xsd','./msxsdtest/simpleType',invalid),
+ STResList72 = [STRes71|STResList71],
+
+
+ ?line {STRes72,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC029.xsd','./msxsdtest/simpleType',invalid),
+ STResList73 = [STRes72|STResList72],
+
+
+ ?line {STRes73,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC030.xsd','./msxsdtest/simpleType',valid),
+ STResList74 = [STRes73|STResList73],
+
+
+ ?line {STRes74,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC031.xsd','./msxsdtest/simpleType',invalid),
+ STResList75 = [STRes74|STResList74],
+
+
+ ?line {STRes75,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC032.xsd','./msxsdtest/simpleType',invalid),
+ STResList76 = [STRes75|STResList75],
+
+
+ ?line {STRes76,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stC033.xsd','./msxsdtest/simpleType',valid),
+ STResList77 = [STRes76|STResList76],
+
+
+ ?line {STRes77,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stD001.xsd','./msxsdtest/simpleType',valid),
+ STResList78 = [STRes77|STResList77],
+
+
+ ?line {STRes78,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stD002.xsd','./msxsdtest/simpleType',invalid),
+ STResList79 = [STRes78|STResList78],
+
+
+ ?line {STRes79,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stD003.xsd','./msxsdtest/simpleType',invalid),
+ STResList80 = [STRes79|STResList79],
+
+
+ ?line {STRes80,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stD004.xsd','./msxsdtest/simpleType',invalid),
+ STResList81 = [STRes80|STResList80],
+
+
+ ?line {STRes81,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stD005.xsd','./msxsdtest/simpleType',invalid),
+ STResList82 = [STRes81|STResList81],
+
+
+ ?line {STRes82,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stD006.xsd','./msxsdtest/simpleType',valid),
+ STResList83 = [STRes82|STResList82],
+
+
+ ?line {STRes83,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stD007.xsd','./msxsdtest/simpleType',valid),
+ STResList84 = [STRes83|STResList83],
+
+
+ ?line {STRes84,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stD008.xsd','./msxsdtest/simpleType',valid),
+ STResList85 = [STRes84|STResList84],
+
+
+ ?line {STRes85,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stD009.xsd','./msxsdtest/simpleType',invalid),
+ STResList86 = [STRes85|STResList85],
+
+
+ ?line {STRes86,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stD010.xsd','./msxsdtest/simpleType',invalid),
+ STResList87 = [STRes86|STResList86],
+
+
+ ?line {STRes87,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stD011.xsd','./msxsdtest/simpleType',valid),
+ STResList88 = [STRes87|STResList87],
+
+
+ ?line {STRes88,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stD012.xsd','./msxsdtest/simpleType',valid),
+ STResList89 = [STRes88|STResList88],
+
+
+ ?line {STRes89,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stD013.xsd','./msxsdtest/simpleType',valid),
+ STResList90 = [STRes89|STResList89],
+
+
+ ?line {STRes90,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stD014.xsd','./msxsdtest/simpleType',valid),
+ STResList91 = [STRes90|STResList90],
+
+
+ ?line {STRes91,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stD015.xsd','./msxsdtest/simpleType',invalid),
+ STResList92 = [STRes91|STResList91],
+
+
+ ?line {STRes92,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stD016.xsd','./msxsdtest/simpleType',invalid),
+ STResList93 = [STRes92|STResList92],
+
+
+ ?line {STRes93,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stD017.xsd','./msxsdtest/simpleType',invalid),
+ STResList94 = [STRes93|STResList93],
+
+
+ ?line {STRes94,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stD018.xsd','./msxsdtest/simpleType',invalid),
+ STResList95 = [STRes94|STResList94],
+
+
+ ?line {STRes95,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stD019.xsd','./msxsdtest/simpleType',invalid),
+ STResList96 = [STRes95|STResList95],
+
+
+ ?line {STRes96,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stD020.xsd','./msxsdtest/simpleType',valid),
+ STResList97 = [STRes96|STResList96],
+
+
+ ?line {STRes97,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stD021.xsd','./msxsdtest/simpleType',valid),
+ STResList98 = [STRes97|STResList97],
+
+
+ ?line {STRes98,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stE001.xsd','./msxsdtest/simpleType',valid),
+ STResList99 = [STRes98|STResList98],
+
+
+ ?line {STRes99,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stE002.xsd','./msxsdtest/simpleType',invalid),
+ STResList100 = [STRes99|STResList99],
+
+
+ ?line {STRes100,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stE003.xsd','./msxsdtest/simpleType',invalid),
+ STResList101 = [STRes100|STResList100],
+
+
+ ?line {STRes101,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stE004.xsd','./msxsdtest/simpleType',invalid),
+ STResList102 = [STRes101|STResList101],
+
+
+ ?line {STRes102,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stE005.xsd','./msxsdtest/simpleType',invalid),
+ STResList103 = [STRes102|STResList102],
+
+
+ ?line {STRes103,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stE006.xsd','./msxsdtest/simpleType',valid),
+ STResList104 = [STRes103|STResList103],
+
+
+ ?line {STRes104,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stE007.xsd','./msxsdtest/simpleType',valid),
+ STResList105 = [STRes104|STResList104],
+
+
+ ?line {STRes105,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stE008.xsd','./msxsdtest/simpleType',invalid),
+ STResList106 = [STRes105|STResList105],
+
+
+ ?line {STRes106,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stE009.xsd','./msxsdtest/simpleType',valid),
+ STResList107 = [STRes106|STResList106],
+
+
+ ?line {STRes107,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stE010.xsd','./msxsdtest/simpleType',valid),
+ STResList108 = [STRes107|STResList107],
+
+
+ ?line {STRes108,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stE011.xsd','./msxsdtest/simpleType',valid),
+ STResList109 = [STRes108|STResList108],
+
+
+ ?line {STRes109,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stE012.xsd','./msxsdtest/simpleType',invalid),
+ STResList110 = [STRes109|STResList109],
+
+
+ ?line {STRes110,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stE013.xsd','./msxsdtest/simpleType',valid),
+ STResList111 = [STRes110|STResList110],
+
+
+ ?line {STRes111,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stE014.xsd','./msxsdtest/simpleType',valid),
+ STResList112 = [STRes111|STResList111],
+
+
+ ?line {STRes112,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stE015.xsd','./msxsdtest/simpleType',invalid),
+ STResList113 = [STRes112|STResList112],
+
+
+ ?line {STRes113,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stE016.xsd','./msxsdtest/simpleType',invalid),
+ STResList114 = [STRes113|STResList113],
+
+
+ ?line {STRes114,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stE017.xsd','./msxsdtest/simpleType',valid),
+ STResList115 = [STRes114|STResList114],
+
+
+ ?line {STRes115,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stE018.xsd','./msxsdtest/simpleType',invalid),
+ STResList116 = [STRes115|STResList115],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList116,[]).
+
+%% simpleType Validation checking.
+
+stFGH(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF001.xsd','./msxsdtest/simpleType',valid),
+ STResList1 = [STRes0|STResList0],
+
+
+ ?line {STRes1,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF002.xsd','./msxsdtest/simpleType',valid),
+ STResList2 = [STRes1|STResList1],
+
+
+ ?line {STRes2,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF003.xsd','./msxsdtest/simpleType',valid),
+ STResList3 = [STRes2|STResList2],
+
+
+ ?line {STRes3,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF004.xsd','./msxsdtest/simpleType',valid),
+ STResList4 = [STRes3|STResList3],
+
+
+ ?line {STRes4,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF005.xsd','./msxsdtest/simpleType',invalid),
+ STResList5 = [STRes4|STResList4],
+
+
+ ?line {STRes5,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF006.xsd','./msxsdtest/simpleType',valid),
+ STResList6 = [STRes5|STResList5],
+
+
+ ?line {STRes6,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF007.xsd','./msxsdtest/simpleType',invalid),
+ STResList7 = [STRes6|STResList6],
+
+
+ ?line {STRes7,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF008.xsd','./msxsdtest/simpleType',invalid),
+ STResList8 = [STRes7|STResList7],
+
+
+ ?line {STRes8,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF009.xsd','./msxsdtest/simpleType',invalid),
+ STResList9 = [STRes8|STResList8],
+
+
+ ?line {STRes9,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF010.xsd','./msxsdtest/simpleType',invalid),
+ STResList10 = [STRes9|STResList9],
+
+
+ ?line {STRes10,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF011.xsd','./msxsdtest/simpleType',invalid),
+ STResList11 = [STRes10|STResList10],
+
+
+ ?line {STRes11,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF012.xsd','./msxsdtest/simpleType',invalid),
+ STResList12 = [STRes11|STResList11],
+
+
+ ?line {STRes12,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF013.xsd','./msxsdtest/simpleType',invalid),
+ STResList13 = [STRes12|STResList12],
+
+
+ ?line {STRes13,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF014.xsd','./msxsdtest/simpleType',invalid),
+ STResList14 = [STRes13|STResList13],
+
+
+ ?line {STRes14,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF015.xsd','./msxsdtest/simpleType',invalid),
+ STResList15 = [STRes14|STResList14],
+
+
+ ?line {STRes15,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF016.xsd','./msxsdtest/simpleType',valid),
+ STResList16 = [STRes15|STResList15],
+
+
+ ?line {STRes16,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF017.xsd','./msxsdtest/simpleType',valid),
+ STResList17 = [STRes16|STResList16],
+
+
+ ?line {STRes17,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF018.xsd','./msxsdtest/simpleType',invalid),
+ STResList18 = [STRes17|STResList17],
+
+
+ ?line {STRes18,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF019.xsd','./msxsdtest/simpleType',invalid),
+ STResList19 = [STRes18|STResList18],
+
+
+ ?line {STRes19,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF020.xsd','./msxsdtest/simpleType',invalid),
+ STResList20 = [STRes19|STResList19],
+
+
+ ?line {STRes20,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF021.xsd','./msxsdtest/simpleType',invalid),
+ STResList21 = [STRes20|STResList20],
+
+
+ ?line {STRes21,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF022.xsd','./msxsdtest/simpleType',invalid),
+ STResList22 = [STRes21|STResList21],
+
+
+ ?line {STRes22,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF023.xsd','./msxsdtest/simpleType',invalid),
+ STResList23 = [STRes22|STResList22],
+
+
+ ?line {STRes23,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF024.xsd','./msxsdtest/simpleType',invalid),
+ STResList24 = [STRes23|STResList23],
+
+
+ ?line {STRes24,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF025.xsd','./msxsdtest/simpleType',invalid),
+ STResList25 = [STRes24|STResList24],
+
+
+ ?line {STRes25,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF026.xsd','./msxsdtest/simpleType',invalid),
+ STResList26 = [STRes25|STResList25],
+
+
+ ?line {STRes26,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF027.xsd','./msxsdtest/simpleType',invalid),
+ STResList27 = [STRes26|STResList26],
+
+
+ ?line {STRes27,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF028.xsd','./msxsdtest/simpleType',invalid),
+ STResList28 = [STRes27|STResList27],
+
+
+ ?line {STRes28,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF029.xsd','./msxsdtest/simpleType',invalid),
+ STResList29 = [STRes28|STResList28],
+
+
+ ?line {STRes29,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF030.xsd','./msxsdtest/simpleType',invalid),
+ STResList30 = [STRes29|STResList29],
+
+
+ ?line {STRes30,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF031.xsd','./msxsdtest/simpleType',invalid),
+ STResList31 = [STRes30|STResList30],
+
+
+ ?line {STRes31,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF032.xsd','./msxsdtest/simpleType',valid),
+ STResList32 = [STRes31|STResList31],
+
+
+ ?line {STRes32,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF033.xsd','./msxsdtest/simpleType',invalid),
+ STResList33 = [STRes32|STResList32],
+
+
+ ?line {STRes33,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF034.xsd','./msxsdtest/simpleType',valid),
+ STResList34 = [STRes33|STResList33],
+
+
+ ?line {STRes34,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF035.xsd','./msxsdtest/simpleType',invalid),
+ STResList35 = [STRes34|STResList34],
+
+
+ ?line {STRes35,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF036.xsd','./msxsdtest/simpleType',valid),
+ STResList36 = [STRes35|STResList35],
+
+
+ ?line {STRes36,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stF037.xsd','./msxsdtest/simpleType',invalid),
+ STResList37 = [STRes36|STResList36],
+
+
+ ?line {STRes37,S37} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stG001.xsd','./msxsdtest/simpleType',valid),
+ STResList38 = [STRes37|STResList37],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/simpleType/stG001.xml','./msxsdtest/simpleType',valid,S37),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes38,S38} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stG002.xsd','./msxsdtest/simpleType',valid),
+ STResList39 = [STRes38|STResList38],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/simpleType/stG002.xml','./msxsdtest/simpleType',valid,S38),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ ?line {STRes39,S39} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stG003.xsd','./msxsdtest/simpleType',valid),
+ STResList40 = [STRes39|STResList39],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/simpleType/stG003.xml','./msxsdtest/simpleType',invalid,S39),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ ?line {STRes40,S40} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stG004.xsd','./msxsdtest/simpleType',valid),
+ STResList41 = [STRes40|STResList40],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/simpleType/stG004.xml','./msxsdtest/simpleType',valid,S40),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ ?line {STRes41,S41} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stG005.xsd','./msxsdtest/simpleType',valid),
+ STResList42 = [STRes41|STResList41],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/simpleType/stG005.xml','./msxsdtest/simpleType',invalid,S41),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes42,S42} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stG006.xsd','./msxsdtest/simpleType',valid),
+ STResList43 = [STRes42|STResList42],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/simpleType/stG006.xml','./msxsdtest/simpleType',valid,S42),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes43,S43} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stG007.xsd','./msxsdtest/simpleType',valid),
+ STResList44 = [STRes43|STResList43],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/simpleType/stG007.xml','./msxsdtest/simpleType',invalid,S43),
+ ITResList7 = [ITRes6|ITResList6],
+
+
+ ?line {STRes44,S44} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stG008.xsd','./msxsdtest/simpleType',valid),
+ STResList45 = [STRes44|STResList44],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/simpleType/stG008.xml','./msxsdtest/simpleType',valid,S44),
+ ITResList8 = [ITRes7|ITResList7],
+
+
+ ?line {STRes45,S45} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stG009.xsd','./msxsdtest/simpleType',valid),
+ STResList46 = [STRes45|STResList45],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/simpleType/stG009.xml','./msxsdtest/simpleType',invalid,S45),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ ?line {STRes46,S46} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stG010.xsd','./msxsdtest/simpleType',valid),
+ STResList47 = [STRes46|STResList46],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/simpleType/stG010.xml','./msxsdtest/simpleType',valid,S46),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes47,S47} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stG011.xsd','./msxsdtest/simpleType',valid),
+ STResList48 = [STRes47|STResList47],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/simpleType/stG011.xml','./msxsdtest/simpleType',invalid,S47),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes48,S48} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stG012.xsd','./msxsdtest/simpleType',valid),
+ STResList49 = [STRes48|STResList48],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/simpleType/stG012.xml','./msxsdtest/simpleType',valid,S48),
+ ITResList12 = [ITRes11|ITResList11],
+
+
+ ?line {STRes49,S49} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stG013.xsd','./msxsdtest/simpleType',valid),
+ STResList50 = [STRes49|STResList49],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/simpleType/stG013.xml','./msxsdtest/simpleType',invalid,S49),
+ ITResList13 = [ITRes12|ITResList12],
+
+
+ ?line {STRes50,S50} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stH001.xsd','./msxsdtest/simpleType',valid),
+ STResList51 = [STRes50|STResList50],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/simpleType/stH001.xml','./msxsdtest/simpleType',valid,S50),
+ ITResList14 = [ITRes13|ITResList13],
+
+
+ ?line {STRes51,S51} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stH002.xsd','./msxsdtest/simpleType',valid),
+ STResList52 = [STRes51|STResList51],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/simpleType/stH002.xml','./msxsdtest/simpleType',invalid,S51),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes52,S52} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stH003.xsd','./msxsdtest/simpleType',valid),
+ STResList53 = [STRes52|STResList52],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/simpleType/stH003.xml','./msxsdtest/simpleType',valid,S52),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ ?line {STRes53,S53} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stH004.xsd','./msxsdtest/simpleType',valid),
+ STResList54 = [STRes53|STResList53],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/simpleType/stH004.xml','./msxsdtest/simpleType',invalid,S53),
+ ITResList17 = [ITRes16|ITResList16],
+
+
+ ?line {STRes54,S54} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stH005.xsd','./msxsdtest/simpleType',valid),
+ STResList55 = [STRes54|STResList54],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/simpleType/stH005.xml','./msxsdtest/simpleType',valid,S54),
+ ITResList18 = [ITRes17|ITResList17],
+
+
+ ?line {STRes55,S55} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stH006.xsd','./msxsdtest/simpleType',valid),
+ STResList56 = [STRes55|STResList55],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/simpleType/stH006.xml','./msxsdtest/simpleType',invalid,S55),
+ ITResList19 = [ITRes18|ITResList18],
+
+
+ ?line {STRes56,S56} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stH007.xsd','./msxsdtest/simpleType',valid),
+ STResList57 = [STRes56|STResList56],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/simpleType/stH007.xml','./msxsdtest/simpleType',valid,S56),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes57,S57} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stH008.xsd','./msxsdtest/simpleType',valid),
+ STResList58 = [STRes57|STResList57],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/simpleType/stH008.xml','./msxsdtest/simpleType',invalid,S57),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList58,ITResList21).
+
+%% simpleType Schema Component Constraints.
+
+stIJK(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stI001.xsd','./msxsdtest/simpleType',valid),
+ STResList1 = [STRes0|STResList0],
+
+
+ ?line {STRes1,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stI002.xsd','./msxsdtest/simpleType',valid),
+ STResList2 = [STRes1|STResList1],
+
+
+ ?line {STRes2,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stI003.xsd','./msxsdtest/simpleType',valid),
+ STResList3 = [STRes2|STResList2],
+
+
+ ?line {STRes3,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stI004.xsd','./msxsdtest/simpleType',invalid),
+ STResList4 = [STRes3|STResList3],
+
+
+ ?line {STRes4,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stI005.xsd','./msxsdtest/simpleType',invalid),
+ STResList5 = [STRes4|STResList4],
+
+
+ ?line {STRes5,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stJ001.xsd','./msxsdtest/simpleType',valid),
+ STResList6 = [STRes5|STResList5],
+
+
+ ?line {STRes6,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stJ002.xsd','./msxsdtest/simpleType',valid),
+ STResList7 = [STRes6|STResList6],
+
+
+ ?line {STRes7,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stJ003.xsd','./msxsdtest/simpleType',invalid),
+ STResList8 = [STRes7|STResList7],
+
+
+ ?line {STRes8,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stJ004.xsd','./msxsdtest/simpleType',valid),
+ STResList9 = [STRes8|STResList8],
+
+
+ ?line {STRes9,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stJ005.xsd','./msxsdtest/simpleType',valid),
+ STResList10 = [STRes9|STResList9],
+
+
+ ?line {STRes10,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stJ006.xsd','./msxsdtest/simpleType',valid),
+ STResList11 = [STRes10|STResList10],
+
+
+ ?line {STRes11,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stJ007.xsd','./msxsdtest/simpleType',valid),
+ STResList12 = [STRes11|STResList11],
+
+
+ ?line {STRes12,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stJ008.xsd','./msxsdtest/simpleType',valid),
+ STResList13 = [STRes12|STResList12],
+
+
+ ?line {STRes13,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stJ009.xsd','./msxsdtest/simpleType',invalid),
+ STResList14 = [STRes13|STResList13],
+
+
+ ?line {STRes14,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stJ010.xsd','./msxsdtest/simpleType',invalid),
+ STResList15 = [STRes14|STResList14],
+
+
+ ?line {STRes15,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stJ011.xsd','./msxsdtest/simpleType',invalid),
+ STResList16 = [STRes15|STResList15],
+
+
+ ?line {STRes16,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stJ012.xsd','./msxsdtest/simpleType',invalid),
+ STResList17 = [STRes16|STResList16],
+
+
+ ?line {STRes17,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stJ013.xsd','./msxsdtest/simpleType',invalid),
+ STResList18 = [STRes17|STResList17],
+
+
+ ?line {STRes18,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stJ014.xsd','./msxsdtest/simpleType',invalid),
+ STResList19 = [STRes18|STResList18],
+
+
+ ?line {STRes19,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stJ015.xsd','./msxsdtest/simpleType',invalid),
+ STResList20 = [STRes19|STResList19],
+
+
+ ?line {STRes20,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stJ016.xsd','./msxsdtest/simpleType',invalid),
+ STResList21 = [STRes20|STResList20],
+
+
+ ?line {STRes21,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stJ017.xsd','./msxsdtest/simpleType',invalid),
+ STResList22 = [STRes21|STResList21],
+
+
+ ?line {STRes22,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stJ018.xsd','./msxsdtest/simpleType',invalid),
+ STResList23 = [STRes22|STResList22],
+
+
+ ?line {STRes23,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stJ019.xsd','./msxsdtest/simpleType',invalid),
+ STResList24 = [STRes23|STResList23],
+
+
+ ?line {STRes24,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stK001.xsd','./msxsdtest/simpleType',valid),
+ STResList25 = [STRes24|STResList24],
+
+
+ ?line {STRes25,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stK002.xsd','./msxsdtest/simpleType',invalid),
+ STResList26 = [STRes25|STResList25],
+
+
+ ?line {STRes26,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stK003.xsd','./msxsdtest/simpleType',invalid),
+ STResList27 = [STRes26|STResList26],
+
+
+ ?line {STRes27,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stK004.xsd','./msxsdtest/simpleType',valid),
+ STResList28 = [STRes27|STResList27],
+
+
+ ?line {STRes28,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stK005.xsd','./msxsdtest/simpleType',invalid),
+ STResList29 = [STRes28|STResList28],
+
+
+ ?line {STRes29,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stK006.xsd','./msxsdtest/simpleType',invalid),
+ STResList30 = [STRes29|STResList29],
+
+
+ ?line {STRes30,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stK007.xsd','./msxsdtest/simpleType',invalid),
+ STResList31 = [STRes30|STResList30],
+
+
+ ?line {STRes31,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stK008.xsd','./msxsdtest/simpleType',valid),
+ STResList32 = [STRes31|STResList31],
+
+
+ ?line {STRes32,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stK009.xsd','./msxsdtest/simpleType',valid),
+ STResList33 = [STRes32|STResList32],
+
+
+ ?line {STRes33,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stK010.xsd','./msxsdtest/simpleType',invalid),
+ STResList34 = [STRes33|STResList33],
+
+
+ ?line {STRes34,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stK011.xsd','./msxsdtest/simpleType',invalid),
+ STResList35 = [STRes34|STResList34],
+
+
+ ?line {STRes35,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stK012.xsd','./msxsdtest/simpleType',invalid),
+ STResList36 = [STRes35|STResList35],
+
+
+ ?line {STRes36,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stK013.xsd','./msxsdtest/simpleType',invalid),
+ STResList37 = [STRes36|STResList36],
+
+
+ ?line {STRes37,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stK014.xsd','./msxsdtest/simpleType',invalid),
+ STResList38 = [STRes37|STResList37],
+
+
+ ?line {STRes38,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stK015.xsd','./msxsdtest/simpleType',invalid),
+ STResList39 = [STRes38|STResList38],
+
+
+ ?line {STRes39,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stK016.xsd','./msxsdtest/simpleType',invalid),
+ STResList40 = [STRes39|STResList39],
+
+
+ ?line {STRes40,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stK017.xsd','./msxsdtest/simpleType',invalid),
+ STResList41 = [STRes40|STResList40],
+
+
+ ?line {STRes41,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stK018.xsd','./msxsdtest/simpleType',invalid),
+ STResList42 = [STRes41|STResList41],
+
+
+ ?line {STRes42,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stK019.xsd','./msxsdtest/simpleType',invalid),
+ STResList43 = [STRes42|STResList42],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList43,[]).
+
+%% Bug Regressions.
+
+stZ(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stZ001.xsd','./msxsdtest/simpleType',valid),
+ STResList1 = [STRes0|STResList0],
+
+
+ ?line {STRes1,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stZ002.xsd','./msxsdtest/simpleType',invalid),
+ STResList2 = [STRes1|STResList1],
+
+
+ ?line {STRes2,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stZ003.xsd','./msxsdtest/simpleType',invalid),
+ STResList3 = [STRes2|STResList2],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/simpleType/stZ004.xsd','./msxsdtest/simpleType',valid),
+ STResList4 = [STRes3|STResList3],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/simpleType/stZ004.xml','./msxsdtest/simpleType',valid,S3),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList4,ITResList1).
+
+%% Syntax Validation - any.
+
+wildABCDEF(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildA001.xsd','./msxsdtest/wildCards',valid),
+ STResList1 = [STRes0|STResList0],
+
+
+ ?line {STRes1,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildA002.xsd','./msxsdtest/wildCards',valid),
+ STResList2 = [STRes1|STResList1],
+
+
+ ?line {STRes2,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildA003.xsd','./msxsdtest/wildCards',invalid),
+ STResList3 = [STRes2|STResList2],
+
+
+ ?line {STRes3,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildA004.xsd','./msxsdtest/wildCards',invalid),
+ STResList4 = [STRes3|STResList3],
+
+
+ ?line {STRes4,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildA005.xsd','./msxsdtest/wildCards',invalid),
+ STResList5 = [STRes4|STResList4],
+
+
+ ?line {STRes5,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildA006.xsd','./msxsdtest/wildCards',invalid),
+ STResList6 = [STRes5|STResList5],
+
+
+ ?line {STRes6,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildA007.xsd','./msxsdtest/wildCards',invalid),
+ STResList7 = [STRes6|STResList6],
+
+
+ ?line {STRes7,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildA008.xsd','./msxsdtest/wildCards',invalid),
+ STResList8 = [STRes7|STResList7],
+
+
+ ?line {STRes8,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildB009.xsd','./msxsdtest/wildCards',valid),
+ STResList9 = [STRes8|STResList8],
+
+
+ ?line {STRes9,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildB010.xsd','./msxsdtest/wildCards',valid),
+ STResList10 = [STRes9|STResList9],
+
+
+ ?line {STRes10,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildB011.xsd','./msxsdtest/wildCards',valid),
+ STResList11 = [STRes10|STResList10],
+
+
+ ?line {STRes11,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildB012.xsd','./msxsdtest/wildCards',valid),
+ STResList12 = [STRes11|STResList11],
+
+
+ ?line {STRes12,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildB013.xsd','./msxsdtest/wildCards',valid),
+ STResList13 = [STRes12|STResList12],
+
+
+ ?line {STRes13,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildB014.xsd','./msxsdtest/wildCards',invalid),
+ STResList14 = [STRes13|STResList13],
+
+
+ ?line {STRes14,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildB015.xsd','./msxsdtest/wildCards',invalid),
+ STResList15 = [STRes14|STResList14],
+
+
+ ?line {STRes15,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildB016.xsd','./msxsdtest/wildCards',invalid),
+ STResList16 = [STRes15|STResList15],
+
+
+ ?line {STRes16,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildB017.xsd','./msxsdtest/wildCards',valid),
+ STResList17 = [STRes16|STResList16],
+
+
+ ?line {STRes17,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildB018.xsd','./msxsdtest/wildCards',valid),
+ STResList18 = [STRes17|STResList17],
+
+
+ ?line {STRes18,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildB019.xsd','./msxsdtest/wildCards',valid),
+ STResList19 = [STRes18|STResList18],
+
+
+ ?line {STRes19,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildB020.xsd','./msxsdtest/wildCards',invalid),
+ STResList20 = [STRes19|STResList19],
+
+
+ ?line {STRes20,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildB021.xsd','./msxsdtest/wildCards',valid),
+ STResList21 = [STRes20|STResList20],
+
+
+ ?line {STRes21,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildB022.xsd','./msxsdtest/wildCards',invalid),
+ STResList22 = [STRes21|STResList21],
+
+
+ ?line {STRes22,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildB023.xsd','./msxsdtest/wildCards',invalid),
+ STResList23 = [STRes22|STResList22],
+
+
+ ?line {STRes23,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildB024.xsd','./msxsdtest/wildCards',invalid),
+ STResList24 = [STRes23|STResList23],
+
+
+ ?line {STRes24,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildB025.xsd','./msxsdtest/wildCards',valid),
+ STResList25 = [STRes24|STResList24],
+
+
+ ?line {STRes25,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildB026.xsd','./msxsdtest/wildCards',valid),
+ STResList26 = [STRes25|STResList25],
+
+
+ ?line {STRes26,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildB027.xsd','./msxsdtest/wildCards',invalid),
+ STResList27 = [STRes26|STResList26],
+
+
+ ?line {STRes27,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildB028.xsd','./msxsdtest/wildCards',invalid),
+ STResList28 = [STRes27|STResList27],
+
+
+ ?line {STRes28,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildB029.xsd','./msxsdtest/wildCards',valid),
+ STResList29 = [STRes28|STResList28],
+
+
+ ?line {STRes29,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC030.xsd','./msxsdtest/wildCards',valid),
+ STResList30 = [STRes29|STResList29],
+
+
+ ?line {STRes30,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC031.xsd','./msxsdtest/wildCards',valid),
+ STResList31 = [STRes30|STResList30],
+
+
+ ?line {STRes31,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC032.xsd','./msxsdtest/wildCards',valid),
+ STResList32 = [STRes31|STResList31],
+
+
+ ?line {STRes32,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC033.xsd','./msxsdtest/wildCards',valid),
+ STResList33 = [STRes32|STResList32],
+
+
+ ?line {STRes33,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC034.xsd','./msxsdtest/wildCards',valid),
+ STResList34 = [STRes33|STResList33],
+
+
+ ?line {STRes34,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC035.xsd','./msxsdtest/wildCards',invalid),
+ STResList35 = [STRes34|STResList34],
+
+
+ ?line {STRes35,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC036.xsd','./msxsdtest/wildCards',invalid),
+ STResList36 = [STRes35|STResList35],
+
+
+ ?line {STRes36,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC037.xsd','./msxsdtest/wildCards',valid),
+ STResList37 = [STRes36|STResList36],
+
+
+ ?line {STRes37,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC038.xsd','./msxsdtest/wildCards',valid),
+ STResList38 = [STRes37|STResList37],
+
+
+ ?line {STRes38,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC039.xsd','./msxsdtest/wildCards',valid),
+ STResList39 = [STRes38|STResList38],
+
+
+ ?line {STRes39,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC040.xsd','./msxsdtest/wildCards',valid),
+ STResList40 = [STRes39|STResList39],
+
+
+ ?line {STRes40,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC041.xsd','./msxsdtest/wildCards',valid),
+ STResList41 = [STRes40|STResList40],
+
+
+ ?line {STRes41,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC042.xsd','./msxsdtest/wildCards',valid),
+ STResList42 = [STRes41|STResList41],
+
+
+ ?line {STRes42,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC043.xsd','./msxsdtest/wildCards',valid),
+ STResList43 = [STRes42|STResList42],
+
+
+ ?line {STRes43,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC044.xsd','./msxsdtest/wildCards',valid),
+ STResList44 = [STRes43|STResList43],
+
+
+ ?line {STRes44,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC045.xsd','./msxsdtest/wildCards',valid),
+ STResList45 = [STRes44|STResList44],
+
+
+ ?line {STRes45,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC046.xsd','./msxsdtest/wildCards',valid),
+ STResList46 = [STRes45|STResList45],
+
+
+ ?line {STRes46,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC047.xsd','./msxsdtest/wildCards',valid),
+ STResList47 = [STRes46|STResList46],
+
+
+ ?line {STRes47,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC048.xsd','./msxsdtest/wildCards',valid),
+ STResList48 = [STRes47|STResList47],
+
+
+ ?line {STRes48,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC049.xsd','./msxsdtest/wildCards',invalid),
+ STResList49 = [STRes48|STResList48],
+
+
+ ?line {STRes49,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC050.xsd','./msxsdtest/wildCards',invalid),
+ STResList50 = [STRes49|STResList49],
+
+
+ ?line {STRes50,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC051.xsd','./msxsdtest/wildCards',invalid),
+ STResList51 = [STRes50|STResList50],
+
+
+ ?line {STRes51,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC052.xsd','./msxsdtest/wildCards',invalid),
+ STResList52 = [STRes51|STResList51],
+
+
+ ?line {STRes52,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC053.xsd','./msxsdtest/wildCards',invalid),
+ STResList53 = [STRes52|STResList52],
+
+
+ ?line {STRes53,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC054.xsd','./msxsdtest/wildCards',valid),
+ STResList54 = [STRes53|STResList53],
+
+
+ ?line {STRes54,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC055.xsd','./msxsdtest/wildCards',invalid),
+ STResList55 = [STRes54|STResList54],
+
+
+ ?line {STRes55,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC056.xsd','./msxsdtest/wildCards',invalid),
+ STResList56 = [STRes55|STResList55],
+
+
+ ?line {STRes56,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC057.xsd','./msxsdtest/wildCards',invalid),
+ STResList57 = [STRes56|STResList56],
+
+
+ ?line {STRes57,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC058.xsd','./msxsdtest/wildCards',invalid),
+ STResList58 = [STRes57|STResList57],
+
+
+ ?line {STRes58,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC059.xsd','./msxsdtest/wildCards',valid),
+ STResList59 = [STRes58|STResList58],
+
+
+ ?line {STRes59,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC060.xsd','./msxsdtest/wildCards',valid),
+ STResList60 = [STRes59|STResList59],
+
+
+ ?line {STRes60,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC061.xsd','./msxsdtest/wildCards',valid),
+ STResList61 = [STRes60|STResList60],
+
+
+ ?line {STRes61,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC062.xsd','./msxsdtest/wildCards',valid),
+ STResList62 = [STRes61|STResList61],
+
+
+ ?line {STRes62,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC063.xsd','./msxsdtest/wildCards',valid),
+ STResList63 = [STRes62|STResList62],
+
+
+ ?line {STRes63,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC064.xsd','./msxsdtest/wildCards',valid),
+ STResList64 = [STRes63|STResList63],
+
+
+ ?line {STRes64,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC065.xsd','./msxsdtest/wildCards',valid),
+ STResList65 = [STRes64|STResList64],
+
+
+ ?line {STRes65,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC066.xsd','./msxsdtest/wildCards',invalid),
+ STResList66 = [STRes65|STResList65],
+
+
+ ?line {STRes66,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC067.xsd','./msxsdtest/wildCards',invalid),
+ STResList67 = [STRes66|STResList66],
+
+
+ ?line {STRes67,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC068.xsd','./msxsdtest/wildCards',valid),
+ STResList68 = [STRes67|STResList67],
+
+
+ ?line {STRes68,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC069.xsd','./msxsdtest/wildCards',valid),
+ STResList69 = [STRes68|STResList68],
+
+
+ ?line {STRes69,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildC070.xsd','./msxsdtest/wildCards',valid),
+ STResList70 = [STRes69|STResList69],
+
+
+ ?line {STRes70,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildD071.xsd','./msxsdtest/wildCards',invalid),
+ STResList71 = [STRes70|STResList70],
+
+
+ ?line {STRes71,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildD072.xsd','./msxsdtest/wildCards',valid),
+ STResList72 = [STRes71|STResList71],
+
+
+ ?line {STRes72,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildD073.xsd','./msxsdtest/wildCards',valid),
+ STResList73 = [STRes72|STResList72],
+
+
+ ?line {STRes73,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildD074.xsd','./msxsdtest/wildCards',valid),
+ STResList74 = [STRes73|STResList73],
+
+
+ ?line {STRes74,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildD075.xsd','./msxsdtest/wildCards',invalid),
+ STResList75 = [STRes74|STResList74],
+
+
+ ?line {STRes75,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildD076.xsd','./msxsdtest/wildCards',invalid),
+ STResList76 = [STRes75|STResList75],
+
+
+ ?line {STRes76,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildD077.xsd','./msxsdtest/wildCards',invalid),
+ STResList77 = [STRes76|STResList76],
+
+
+ ?line {STRes77,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildD078.xsd','./msxsdtest/wildCards',invalid),
+ STResList78 = [STRes77|STResList77],
+
+
+ ?line {STRes78,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildD079.xsd','./msxsdtest/wildCards',invalid),
+ STResList79 = [STRes78|STResList78],
+
+
+ ?line {STRes79,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildE001.xsd','./msxsdtest/wildCards',valid),
+ STResList80 = [STRes79|STResList79],
+
+
+ ?line {STRes80,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildE002.xsd','./msxsdtest/wildCards',invalid),
+ STResList81 = [STRes80|STResList80],
+
+
+ ?line {STRes81,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildF001.xsd','./msxsdtest/wildCards',valid),
+ STResList82 = [STRes81|STResList81],
+
+
+ ?line {STRes82,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildF002.xsd','./msxsdtest/wildCards',valid),
+ STResList83 = [STRes82|STResList82],
+
+
+ ?line {STRes83,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildF003.xsd','./msxsdtest/wildCards',valid),
+ STResList84 = [STRes83|STResList83],
+
+
+ ?line {STRes84,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildF004.xsd','./msxsdtest/wildCards',valid),
+ STResList85 = [STRes84|STResList84],
+
+
+ ?line {STRes85,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildF005.xsd','./msxsdtest/wildCards',valid),
+ STResList86 = [STRes85|STResList85],
+
+
+ ?line {STRes86,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildF006.xsd','./msxsdtest/wildCards',invalid),
+ STResList87 = [STRes86|STResList86],
+
+
+ ?line {STRes87,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildF007.xsd','./msxsdtest/wildCards',invalid),
+ STResList88 = [STRes87|STResList87],
+
+
+ ?line {STRes88,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildF008.xsd','./msxsdtest/wildCards',invalid),
+ STResList89 = [STRes88|STResList88],
+
+
+ ?line {STRes89,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildF009.xsd','./msxsdtest/wildCards',invalid),
+ STResList90 = [STRes89|STResList89],
+
+
+ ?line {STRes90,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildF010.xsd','./msxsdtest/wildCards',invalid),
+ STResList91 = [STRes90|STResList90],
+
+
+ ?line {STRes91,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildF011.xsd','./msxsdtest/wildCards',valid),
+ STResList92 = [STRes91|STResList91],
+
+
+ ?line {STRes92,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildF012.xsd','./msxsdtest/wildCards',invalid),
+ STResList93 = [STRes92|STResList92],
+
+
+ ?line {STRes93,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildF013.xsd','./msxsdtest/wildCards',invalid),
+ STResList94 = [STRes93|STResList93],
+
+
+ ?line {STRes94,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildF014.xsd','./msxsdtest/wildCards',invalid),
+ STResList95 = [STRes94|STResList94],
+
+
+ ?line {STRes95,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildF015.xsd','./msxsdtest/wildCards',invalid),
+ STResList96 = [STRes95|STResList95],
+
+
+ ?line {STRes96,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildF016.xsd','./msxsdtest/wildCards',invalid),
+ STResList97 = [STRes96|STResList96],
+
+
+ ?line {STRes97,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildF017.xsd','./msxsdtest/wildCards',valid),
+ STResList98 = [STRes97|STResList97],
+
+
+ ?line {STRes98,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildF018.xsd','./msxsdtest/wildCards',invalid),
+ STResList99 = [STRes98|STResList98],
+
+
+ ?line {STRes99,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildF019.xsd','./msxsdtest/wildCards',valid),
+ STResList100 = [STRes99|STResList99],
+
+
+ ?line {STRes100,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildF020.xsd','./msxsdtest/wildCards',valid),
+ STResList101 = [STRes100|STResList100],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList101,[]).
+
+%% 3.10.4 Wildcard Validation Rules - any.
+
+wildGHI(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG001.xsd','./msxsdtest/wildCards',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG001.xml','./msxsdtest/wildCards',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG002.xsd','./msxsdtest/wildCards',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG002.xml','./msxsdtest/wildCards',valid,S1),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG003.xsd','./msxsdtest/wildCards',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG003.xml','./msxsdtest/wildCards',invalid,S2),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG004.xsd','./msxsdtest/wildCards',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG004.xml','./msxsdtest/wildCards',valid,S3),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG005.xsd','./msxsdtest/wildCards',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG005.xml','./msxsdtest/wildCards',invalid,S4),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG006.xsd','./msxsdtest/wildCards',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG006.xml','./msxsdtest/wildCards',valid,S5),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG007.xsd','./msxsdtest/wildCards',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG007.xml','./msxsdtest/wildCards',valid,S6),
+ ITResList7 = [ITRes6|ITResList6],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG008.xsd','./msxsdtest/wildCards',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG008.xml','./msxsdtest/wildCards',invalid,S7),
+ ITResList8 = [ITRes7|ITResList7],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG009.xsd','./msxsdtest/wildCards',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG009.xml','./msxsdtest/wildCards',invalid,S8),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG010.xsd','./msxsdtest/wildCards',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG010.xml','./msxsdtest/wildCards',valid,S9),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG011.xsd','./msxsdtest/wildCards',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG011.xml','./msxsdtest/wildCards',invalid,S10),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG012.xsd','./msxsdtest/wildCards',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG012.xml','./msxsdtest/wildCards',valid,S11),
+ ITResList12 = [ITRes11|ITResList11],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG013.xsd','./msxsdtest/wildCards',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG013.xml','./msxsdtest/wildCards',valid,S12),
+ ITResList13 = [ITRes12|ITResList12],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG014.xsd','./msxsdtest/wildCards',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG014.xml','./msxsdtest/wildCards',invalid,S13),
+ ITResList14 = [ITRes13|ITResList13],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG015.xsd','./msxsdtest/wildCards',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG015.xml','./msxsdtest/wildCards',valid,S14),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG016.xsd','./msxsdtest/wildCards',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG016.xml','./msxsdtest/wildCards',valid,S15),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG017.xsd','./msxsdtest/wildCards',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG017.xml','./msxsdtest/wildCards',invalid,S16),
+ ITResList17 = [ITRes16|ITResList16],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG018.xsd','./msxsdtest/wildCards',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG018.xml','./msxsdtest/wildCards',valid,S17),
+ ITResList18 = [ITRes17|ITResList17],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG019.xsd','./msxsdtest/wildCards',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG019.xml','./msxsdtest/wildCards',invalid,S18),
+ ITResList19 = [ITRes18|ITResList18],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG020.xsd','./msxsdtest/wildCards',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG020.xml','./msxsdtest/wildCards',invalid,S19),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG021.xsd','./msxsdtest/wildCards',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG021.xml','./msxsdtest/wildCards',valid,S20),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG022.xsd','./msxsdtest/wildCards',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG022.xml','./msxsdtest/wildCards',invalid,S21),
+ ITResList22 = [ITRes21|ITResList21],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG023.xsd','./msxsdtest/wildCards',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG023.xml','./msxsdtest/wildCards',valid,S22),
+ ITResList23 = [ITRes22|ITResList22],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG024.xsd','./msxsdtest/wildCards',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG024.xml','./msxsdtest/wildCards',invalid,S23),
+ ITResList24 = [ITRes23|ITResList23],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG025.xsd','./msxsdtest/wildCards',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG025.xml','./msxsdtest/wildCards',invalid,S24),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG026.xsd','./msxsdtest/wildCards',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG026.xml','./msxsdtest/wildCards',valid,S25),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG027.xsd','./msxsdtest/wildCards',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG027.xml','./msxsdtest/wildCards',valid,S26),
+ ITResList27 = [ITRes26|ITResList26],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG028.xsd','./msxsdtest/wildCards',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG028.xml','./msxsdtest/wildCards',invalid,S27),
+ ITResList28 = [ITRes27|ITResList27],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG029.xsd','./msxsdtest/wildCards',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG029.xml','./msxsdtest/wildCards',invalid,S28),
+ ITResList29 = [ITRes28|ITResList28],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG030.xsd','./msxsdtest/wildCards',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG030.xml','./msxsdtest/wildCards',invalid,S29),
+ ITResList30 = [ITRes29|ITResList29],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG031.xsd','./msxsdtest/wildCards',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG031.xml','./msxsdtest/wildCards',valid,S30),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes31,S31} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG032.xsd','./msxsdtest/wildCards',valid),
+ STResList32 = [STRes31|STResList31],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG032.xml','./msxsdtest/wildCards',invalid,S31),
+ ITResList32 = [ITRes31|ITResList31],
+
+
+ ?line {STRes32,S32} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG033.xsd','./msxsdtest/wildCards',valid),
+ STResList33 = [STRes32|STResList32],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG033.xml','./msxsdtest/wildCards',valid,S32),
+ ITResList33 = [ITRes32|ITResList32],
+
+
+ ?line {STRes33,S33} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG034.xsd','./msxsdtest/wildCards',valid),
+ STResList34 = [STRes33|STResList33],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG034.xml','./msxsdtest/wildCards',invalid,S33),
+ ITResList34 = [ITRes33|ITResList33],
+
+
+ ?line {STRes34,S34} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG035.xsd','./msxsdtest/wildCards',valid),
+ STResList35 = [STRes34|STResList34],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG035.xml','./msxsdtest/wildCards',valid,S34),
+ ITResList35 = [ITRes34|ITResList34],
+
+
+ ?line {STRes35,S35} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG036.xsd','./msxsdtest/wildCards',valid),
+ STResList36 = [STRes35|STResList35],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG036.xml','./msxsdtest/wildCards',invalid,S35),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes36,S36} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG037.xsd','./msxsdtest/wildCards',valid),
+ STResList37 = [STRes36|STResList36],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG037.xml','./msxsdtest/wildCards',valid,S36),
+ ITResList37 = [ITRes36|ITResList36],
+
+
+ ?line {STRes37,S37} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG038.xsd','./msxsdtest/wildCards',valid),
+ STResList38 = [STRes37|STResList37],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG038.xml','./msxsdtest/wildCards',valid,S37),
+ ITResList38 = [ITRes37|ITResList37],
+
+
+ ?line {STRes38,S38} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG039.xsd','./msxsdtest/wildCards',valid),
+ STResList39 = [STRes38|STResList38],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG039.xml','./msxsdtest/wildCards',invalid,S38),
+ ITResList39 = [ITRes38|ITResList38],
+
+
+ ?line {STRes39,S39} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildG040.xsd','./msxsdtest/wildCards',valid),
+ STResList40 = [STRes39|STResList39],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildG040.xml','./msxsdtest/wildCards',valid,S39),
+ ITResList40 = [ITRes39|ITResList39],
+
+
+ ?line {STRes40,S40} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildH001.xsd','./msxsdtest/wildCards',valid),
+ STResList41 = [STRes40|STResList40],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildH001.xml','./msxsdtest/wildCards',invalid,S40),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes41,S41} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildH002.xsd','./msxsdtest/wildCards',valid),
+ STResList42 = [STRes41|STResList41],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildH002.xml','./msxsdtest/wildCards',invalid,S41),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes42,S42} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildH003.xsd','./msxsdtest/wildCards',valid),
+ STResList43 = [STRes42|STResList42],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildH003.xml','./msxsdtest/wildCards',valid,S42),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes43,S43} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildH004.xsd','./msxsdtest/wildCards',valid),
+ STResList44 = [STRes43|STResList43],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildH004.xml','./msxsdtest/wildCards',valid,S43),
+ ITResList44 = [ITRes43|ITResList43],
+
+
+ ?line {STRes44,S44} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildH006.xsd','./msxsdtest/wildCards',valid),
+ STResList45 = [STRes44|STResList44],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildH006.xml','./msxsdtest/wildCards',invalid,S44),
+ ITResList45 = [ITRes44|ITResList44],
+
+
+ ?line {STRes45,S45} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildH007.xsd','./msxsdtest/wildCards',valid),
+ STResList46 = [STRes45|STResList45],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildH007.xml','./msxsdtest/wildCards',valid,S45),
+ ITResList46 = [ITRes45|ITResList45],
+
+
+ ?line {STRes46,S46} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildH008.xsd','./msxsdtest/wildCards',valid),
+ STResList47 = [STRes46|STResList46],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildH008.xml','./msxsdtest/wildCards',invalid,S46),
+ ITResList47 = [ITRes46|ITResList46],
+
+
+ ?line {STRes47,S47} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildH009.xsd','./msxsdtest/wildCards',valid),
+ STResList48 = [STRes47|STResList47],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildH009.xml','./msxsdtest/wildCards',valid,S47),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes48,S48} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildH010.xsd','./msxsdtest/wildCards',valid),
+ STResList49 = [STRes48|STResList48],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildH010.xml','./msxsdtest/wildCards',valid,S48),
+ ITResList49 = [ITRes48|ITResList48],
+
+
+ ?line {STRes49,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildI001.xsd','./msxsdtest/wildCards',valid),
+ STResList50 = [STRes49|STResList49],
+
+
+ ?line {STRes50,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildI002.xsd','./msxsdtest/wildCards',invalid),
+ STResList51 = [STRes50|STResList50],
+
+
+ ?line {STRes51,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildI003.xsd','./msxsdtest/wildCards',invalid),
+ STResList52 = [STRes51|STResList51],
+
+
+ ?line {STRes52,S52} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildI004.xsd','./msxsdtest/wildCards',valid),
+ STResList53 = [STRes52|STResList52],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildI004.xml','./msxsdtest/wildCards',valid,S52),
+ ITResList50 = [ITRes49|ITResList49],
+
+
+ ?line {STRes53,S53} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildI005.xsd','./msxsdtest/wildCards',valid),
+ STResList54 = [STRes53|STResList53],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildI005.xml','./msxsdtest/wildCards',valid,S53),
+ ITResList51 = [ITRes50|ITResList50],
+
+
+ ?line {STRes54,S54} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildI006.xsd','./msxsdtest/wildCards',valid),
+ STResList55 = [STRes54|STResList54],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildI006.xml','./msxsdtest/wildCards',valid,S54),
+ ITResList52 = [ITRes51|ITResList51],
+
+
+ ?line {STRes55,S55} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildI007.xsd','./msxsdtest/wildCards',valid),
+ STResList56 = [STRes55|STResList55],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildI007.xml','./msxsdtest/wildCards',valid,S55),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes56,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildI008.xsd','./msxsdtest/wildCards',invalid),
+ STResList57 = [STRes56|STResList56],
+
+
+ ?line {STRes57,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildI009.xsd','./msxsdtest/wildCards',invalid),
+ STResList58 = [STRes57|STResList57],
+
+
+ ?line {STRes58,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildI010.xsd','./msxsdtest/wildCards',invalid),
+ STResList59 = [STRes58|STResList58],
+
+
+ ?line {STRes59,S59} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildI011.xsd','./msxsdtest/wildCards',valid),
+ STResList60 = [STRes59|STResList59],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildI011.xml','./msxsdtest/wildCards',valid,S59),
+ ITResList54 = [ITRes53|ITResList53],
+
+
+ ?line {STRes60,S60} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildI012.xsd','./msxsdtest/wildCards',valid),
+ STResList61 = [STRes60|STResList60],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildI012.xml','./msxsdtest/wildCards',valid,S60),
+ ITResList55 = [ITRes54|ITResList54],
+
+
+ ?line {STRes61,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildI013.xsd','./msxsdtest/wildCards',invalid),
+ STResList62 = [STRes61|STResList61],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList62,ITResList55).
+
+%% Syntax Validation - anyAttribute.
+
+wildJKLMNQOP(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildJ001.xsd','./msxsdtest/wildCards',valid),
+ STResList1 = [STRes0|STResList0],
+
+
+ ?line {STRes1,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildJ002.xsd','./msxsdtest/wildCards',valid),
+ STResList2 = [STRes1|STResList1],
+
+
+ ?line {STRes2,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildJ003.xsd','./msxsdtest/wildCards',invalid),
+ STResList3 = [STRes2|STResList2],
+
+
+ ?line {STRes3,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildJ004.xsd','./msxsdtest/wildCards',invalid),
+ STResList4 = [STRes3|STResList3],
+
+
+ ?line {STRes4,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildJ005.xsd','./msxsdtest/wildCards',invalid),
+ STResList5 = [STRes4|STResList4],
+
+
+ ?line {STRes5,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildJ006.xsd','./msxsdtest/wildCards',invalid),
+ STResList6 = [STRes5|STResList5],
+
+
+ ?line {STRes6,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildJ007.xsd','./msxsdtest/wildCards',invalid),
+ STResList7 = [STRes6|STResList6],
+
+
+ ?line {STRes7,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildJ008.xsd','./msxsdtest/wildCards',invalid),
+ STResList8 = [STRes7|STResList7],
+
+
+ ?line {STRes8,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK001.xsd','./msxsdtest/wildCards',valid),
+ STResList9 = [STRes8|STResList8],
+
+
+ ?line {STRes9,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK002.xsd','./msxsdtest/wildCards',invalid),
+ STResList10 = [STRes9|STResList9],
+
+
+ ?line {STRes10,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK003.xsd','./msxsdtest/wildCards',valid),
+ STResList11 = [STRes10|STResList10],
+
+
+ ?line {STRes11,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK004.xsd','./msxsdtest/wildCards',valid),
+ STResList12 = [STRes11|STResList11],
+
+
+ ?line {STRes12,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK005.xsd','./msxsdtest/wildCards',valid),
+ STResList13 = [STRes12|STResList12],
+
+
+ ?line {STRes13,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK006.xsd','./msxsdtest/wildCards',invalid),
+ STResList14 = [STRes13|STResList13],
+
+
+ ?line {STRes14,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK007.xsd','./msxsdtest/wildCards',invalid),
+ STResList15 = [STRes14|STResList14],
+
+
+ ?line {STRes15,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK008.xsd','./msxsdtest/wildCards',valid),
+ STResList16 = [STRes15|STResList15],
+
+
+ ?line {STRes16,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK009.xsd','./msxsdtest/wildCards',valid),
+ STResList17 = [STRes16|STResList16],
+
+
+ ?line {STRes17,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK010.xsd','./msxsdtest/wildCards',valid),
+ STResList18 = [STRes17|STResList17],
+
+
+ ?line {STRes18,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK011.xsd','./msxsdtest/wildCards',valid),
+ STResList19 = [STRes18|STResList18],
+
+
+ ?line {STRes19,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK012.xsd','./msxsdtest/wildCards',valid),
+ STResList20 = [STRes19|STResList19],
+
+
+ ?line {STRes20,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK013.xsd','./msxsdtest/wildCards',valid),
+ STResList21 = [STRes20|STResList20],
+
+
+ ?line {STRes21,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK014.xsd','./msxsdtest/wildCards',valid),
+ STResList22 = [STRes21|STResList21],
+
+
+ ?line {STRes22,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK015.xsd','./msxsdtest/wildCards',valid),
+ STResList23 = [STRes22|STResList22],
+
+
+ ?line {STRes23,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK016.xsd','./msxsdtest/wildCards',valid),
+ STResList24 = [STRes23|STResList23],
+
+
+ ?line {STRes24,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK017.xsd','./msxsdtest/wildCards',valid),
+ STResList25 = [STRes24|STResList24],
+
+
+ ?line {STRes25,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK018.xsd','./msxsdtest/wildCards',valid),
+ STResList26 = [STRes25|STResList25],
+
+
+ ?line {STRes26,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK019.xsd','./msxsdtest/wildCards',valid),
+ STResList27 = [STRes26|STResList26],
+
+
+ ?line {STRes27,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK020.xsd','./msxsdtest/wildCards',invalid),
+ STResList28 = [STRes27|STResList27],
+
+
+ ?line {STRes28,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK021.xsd','./msxsdtest/wildCards',invalid),
+ STResList29 = [STRes28|STResList28],
+
+
+ ?line {STRes29,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK022.xsd','./msxsdtest/wildCards',invalid),
+ STResList30 = [STRes29|STResList29],
+
+
+ ?line {STRes30,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK023.xsd','./msxsdtest/wildCards',invalid),
+ STResList31 = [STRes30|STResList30],
+
+
+ ?line {STRes31,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK024.xsd','./msxsdtest/wildCards',invalid),
+ STResList32 = [STRes31|STResList31],
+
+
+ ?line {STRes32,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK025.xsd','./msxsdtest/wildCards',valid),
+ STResList33 = [STRes32|STResList32],
+
+
+ ?line {STRes33,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK026.xsd','./msxsdtest/wildCards',invalid),
+ STResList34 = [STRes33|STResList33],
+
+
+ ?line {STRes34,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK027.xsd','./msxsdtest/wildCards',invalid),
+ STResList35 = [STRes34|STResList34],
+
+
+ ?line {STRes35,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK028.xsd','./msxsdtest/wildCards',invalid),
+ STResList36 = [STRes35|STResList35],
+
+
+ ?line {STRes36,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK029.xsd','./msxsdtest/wildCards',invalid),
+ STResList37 = [STRes36|STResList36],
+
+
+ ?line {STRes37,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK030.xsd','./msxsdtest/wildCards',valid),
+ STResList38 = [STRes37|STResList37],
+
+
+ ?line {STRes38,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK031.xsd','./msxsdtest/wildCards',valid),
+ STResList39 = [STRes38|STResList38],
+
+
+ ?line {STRes39,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK032.xsd','./msxsdtest/wildCards',valid),
+ STResList40 = [STRes39|STResList39],
+
+
+ ?line {STRes40,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK033.xsd','./msxsdtest/wildCards',valid),
+ STResList41 = [STRes40|STResList40],
+
+
+ ?line {STRes41,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK034.xsd','./msxsdtest/wildCards',valid),
+ STResList42 = [STRes41|STResList41],
+
+
+ ?line {STRes42,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK035.xsd','./msxsdtest/wildCards',valid),
+ STResList43 = [STRes42|STResList42],
+
+
+ ?line {STRes43,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK036.xsd','./msxsdtest/wildCards',valid),
+ STResList44 = [STRes43|STResList43],
+
+
+ ?line {STRes44,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK037.xsd','./msxsdtest/wildCards',valid),
+ STResList45 = [STRes44|STResList44],
+
+
+ ?line {STRes45,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK038.xsd','./msxsdtest/wildCards',invalid),
+ STResList46 = [STRes45|STResList45],
+
+
+ ?line {STRes46,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK039.xsd','./msxsdtest/wildCards',valid),
+ STResList47 = [STRes46|STResList46],
+
+
+ ?line {STRes47,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK040.xsd','./msxsdtest/wildCards',valid),
+ STResList48 = [STRes47|STResList47],
+
+
+ ?line {STRes48,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildK041.xsd','./msxsdtest/wildCards',valid),
+ STResList49 = [STRes48|STResList48],
+
+
+ ?line {STRes49,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildL001.xsd','./msxsdtest/wildCards',invalid),
+ STResList50 = [STRes49|STResList49],
+
+
+ ?line {STRes50,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildL002.xsd','./msxsdtest/wildCards',valid),
+ STResList51 = [STRes50|STResList50],
+
+
+ ?line {STRes51,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildL003.xsd','./msxsdtest/wildCards',valid),
+ STResList52 = [STRes51|STResList51],
+
+
+ ?line {STRes52,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildL004.xsd','./msxsdtest/wildCards',valid),
+ STResList53 = [STRes52|STResList52],
+
+
+ ?line {STRes53,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildL005.xsd','./msxsdtest/wildCards',invalid),
+ STResList54 = [STRes53|STResList53],
+
+
+ ?line {STRes54,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildL006.xsd','./msxsdtest/wildCards',invalid),
+ STResList55 = [STRes54|STResList54],
+
+
+ ?line {STRes55,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildL007.xsd','./msxsdtest/wildCards',invalid),
+ STResList56 = [STRes55|STResList55],
+
+
+ ?line {STRes56,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildL008.xsd','./msxsdtest/wildCards',invalid),
+ STResList57 = [STRes56|STResList56],
+
+
+ ?line {STRes57,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildL009.xsd','./msxsdtest/wildCards',invalid),
+ STResList58 = [STRes57|STResList57],
+
+
+ ?line {STRes58,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildM001.xsd','./msxsdtest/wildCards',valid),
+ STResList59 = [STRes58|STResList58],
+
+
+ ?line {STRes59,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildM002.xsd','./msxsdtest/wildCards',invalid),
+ STResList60 = [STRes59|STResList59],
+
+
+ ?line {STRes60,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildN001.xsd','./msxsdtest/wildCards',invalid),
+ STResList61 = [STRes60|STResList60],
+
+
+ ?line {STRes61,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildN002.xsd','./msxsdtest/wildCards',valid),
+ STResList62 = [STRes61|STResList61],
+
+
+ ?line {STRes62,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildN003.xsd','./msxsdtest/wildCards',valid),
+ STResList63 = [STRes62|STResList62],
+
+
+ ?line {STRes63,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildN004.xsd','./msxsdtest/wildCards',valid),
+ STResList64 = [STRes63|STResList63],
+
+
+ ?line {STRes64,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildN005.xsd','./msxsdtest/wildCards',valid),
+ STResList65 = [STRes64|STResList64],
+
+
+ ?line {STRes65,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildN006.xsd','./msxsdtest/wildCards',invalid),
+ STResList66 = [STRes65|STResList65],
+
+
+ ?line {STRes66,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildN007.xsd','./msxsdtest/wildCards',invalid),
+ STResList67 = [STRes66|STResList66],
+
+
+ ?line {STRes67,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildN008.xsd','./msxsdtest/wildCards',invalid),
+ STResList68 = [STRes67|STResList67],
+
+
+ ?line {STRes68,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildN009.xsd','./msxsdtest/wildCards',invalid),
+ STResList69 = [STRes68|STResList68],
+
+
+ ?line {STRes69,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildN010.xsd','./msxsdtest/wildCards',invalid),
+ STResList70 = [STRes69|STResList69],
+
+
+ ?line {STRes70,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildN011.xsd','./msxsdtest/wildCards',valid),
+ STResList71 = [STRes70|STResList70],
+
+
+ ?line {STRes71,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildN012.xsd','./msxsdtest/wildCards',invalid),
+ STResList72 = [STRes71|STResList71],
+
+
+ ?line {STRes72,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildN013.xsd','./msxsdtest/wildCards',invalid),
+ STResList73 = [STRes72|STResList72],
+
+
+ ?line {STRes73,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildN014.xsd','./msxsdtest/wildCards',invalid),
+ STResList74 = [STRes73|STResList73],
+
+
+ ?line {STRes74,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildN015.xsd','./msxsdtest/wildCards',invalid),
+ STResList75 = [STRes74|STResList74],
+
+
+ ?line {STRes75,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildN016.xsd','./msxsdtest/wildCards',invalid),
+ STResList76 = [STRes75|STResList75],
+
+
+ ?line {STRes76,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildN017.xsd','./msxsdtest/wildCards',valid),
+ STResList77 = [STRes76|STResList76],
+
+
+ ?line {STRes77,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildN018.xsd','./msxsdtest/wildCards',invalid),
+ STResList78 = [STRes77|STResList77],
+
+
+ ?line {STRes78,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildN019.xsd','./msxsdtest/wildCards',valid),
+ STResList79 = [STRes78|STResList78],
+
+
+ ?line {STRes79,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildN020.xsd','./msxsdtest/wildCards',valid),
+ STResList80 = [STRes79|STResList79],
+
+
+ ?line {STRes80,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildQ001.xsd','./msxsdtest/wildCards',invalid),
+ STResList81 = [STRes80|STResList80],
+
+
+ ?line {STRes81,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildQ002.xsd','./msxsdtest/wildCards',invalid),
+ STResList82 = [STRes81|STResList81],
+
+
+ ?line {STRes82,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildQ003.xsd','./msxsdtest/wildCards',invalid),
+ STResList83 = [STRes82|STResList82],
+
+
+ ?line {STRes83,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildQ004.xsd','./msxsdtest/wildCards',invalid),
+ STResList84 = [STRes83|STResList83],
+
+
+ ?line {STRes84,S84} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO001.xsd','./msxsdtest/wildCards',valid),
+ STResList85 = [STRes84|STResList84],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO001.xml','./msxsdtest/wildCards',valid,S84),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes85,S85} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO002.xsd','./msxsdtest/wildCards',valid),
+ STResList86 = [STRes85|STResList85],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO002.xml','./msxsdtest/wildCards',valid,S85),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ ?line {STRes86,S86} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO003.xsd','./msxsdtest/wildCards',valid),
+ STResList87 = [STRes86|STResList86],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO003.xml','./msxsdtest/wildCards',invalid,S86),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ ?line {STRes87,S87} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO004.xsd','./msxsdtest/wildCards',valid),
+ STResList88 = [STRes87|STResList87],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO004.xml','./msxsdtest/wildCards',valid,S87),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ ?line {STRes88,S88} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO005.xsd','./msxsdtest/wildCards',valid),
+ STResList89 = [STRes88|STResList88],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO005.xml','./msxsdtest/wildCards',valid,S88),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes89,S89} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO006.xsd','./msxsdtest/wildCards',valid),
+ STResList90 = [STRes89|STResList89],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO006.xml','./msxsdtest/wildCards',invalid,S89),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes90,S90} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO007.xsd','./msxsdtest/wildCards',valid),
+ STResList91 = [STRes90|STResList90],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO007.xml','./msxsdtest/wildCards',valid,S90),
+ ITResList7 = [ITRes6|ITResList6],
+
+
+ ?line {STRes91,S91} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO008.xsd','./msxsdtest/wildCards',valid),
+ STResList92 = [STRes91|STResList91],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO008.xml','./msxsdtest/wildCards',invalid,S91),
+ ITResList8 = [ITRes7|ITResList7],
+
+
+ ?line {STRes92,S92} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO009.xsd','./msxsdtest/wildCards',valid),
+ STResList93 = [STRes92|STResList92],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO009.xml','./msxsdtest/wildCards',invalid,S92),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ ?line {STRes93,S93} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO010.xsd','./msxsdtest/wildCards',valid),
+ STResList94 = [STRes93|STResList93],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO010.xml','./msxsdtest/wildCards',valid,S93),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes94,S94} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO011.xsd','./msxsdtest/wildCards',valid),
+ STResList95 = [STRes94|STResList94],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO011.xml','./msxsdtest/wildCards',invalid,S94),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes95,S95} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO012.xsd','./msxsdtest/wildCards',valid),
+ STResList96 = [STRes95|STResList95],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO012.xml','./msxsdtest/wildCards',valid,S95),
+ ITResList12 = [ITRes11|ITResList11],
+
+
+ ?line {STRes96,S96} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO013.xsd','./msxsdtest/wildCards',valid),
+ STResList97 = [STRes96|STResList96],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO013.xml','./msxsdtest/wildCards',valid,S96),
+ ITResList13 = [ITRes12|ITResList12],
+
+
+ ?line {STRes97,S97} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO014.xsd','./msxsdtest/wildCards',valid),
+ STResList98 = [STRes97|STResList97],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO014.xml','./msxsdtest/wildCards',invalid,S97),
+ ITResList14 = [ITRes13|ITResList13],
+
+
+ ?line {STRes98,S98} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO015.xsd','./msxsdtest/wildCards',valid),
+ STResList99 = [STRes98|STResList98],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO015.xml','./msxsdtest/wildCards',valid,S98),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes99,S99} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO016.xsd','./msxsdtest/wildCards',valid),
+ STResList100 = [STRes99|STResList99],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO016.xml','./msxsdtest/wildCards',valid,S99),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ ?line {STRes100,S100} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO017.xsd','./msxsdtest/wildCards',valid),
+ STResList101 = [STRes100|STResList100],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO017.xml','./msxsdtest/wildCards',invalid,S100),
+ ITResList17 = [ITRes16|ITResList16],
+
+
+ ?line {STRes101,S101} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO018.xsd','./msxsdtest/wildCards',valid),
+ STResList102 = [STRes101|STResList101],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO018.xml','./msxsdtest/wildCards',valid,S101),
+ ITResList18 = [ITRes17|ITResList17],
+
+
+ ?line {STRes102,S102} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO019.xsd','./msxsdtest/wildCards',valid),
+ STResList103 = [STRes102|STResList102],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO019.xml','./msxsdtest/wildCards',valid,S102),
+ ITResList19 = [ITRes18|ITResList18],
+
+
+ ?line {STRes103,S103} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO020.xsd','./msxsdtest/wildCards',valid),
+ STResList104 = [STRes103|STResList103],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO020.xml','./msxsdtest/wildCards',invalid,S103),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes104,S104} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO021.xsd','./msxsdtest/wildCards',valid),
+ STResList105 = [STRes104|STResList104],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO021.xml','./msxsdtest/wildCards',valid,S104),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes105,S105} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO022.xsd','./msxsdtest/wildCards',valid),
+ STResList106 = [STRes105|STResList105],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO022.xml','./msxsdtest/wildCards',invalid,S105),
+ ITResList22 = [ITRes21|ITResList21],
+
+
+ ?line {STRes106,S106} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO023.xsd','./msxsdtest/wildCards',valid),
+ STResList107 = [STRes106|STResList106],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO023.xml','./msxsdtest/wildCards',valid,S106),
+ ITResList23 = [ITRes22|ITResList22],
+
+
+ ?line {STRes107,S107} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO024.xsd','./msxsdtest/wildCards',valid),
+ STResList108 = [STRes107|STResList107],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO024.xml','./msxsdtest/wildCards',invalid,S107),
+ ITResList24 = [ITRes23|ITResList23],
+
+
+ ?line {STRes108,S108} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO025.xsd','./msxsdtest/wildCards',valid),
+ STResList109 = [STRes108|STResList108],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO025.xml','./msxsdtest/wildCards',invalid,S108),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ ?line {STRes109,S109} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO026.xsd','./msxsdtest/wildCards',valid),
+ STResList110 = [STRes109|STResList109],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO026.xml','./msxsdtest/wildCards',valid,S109),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes110,S110} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO027.xsd','./msxsdtest/wildCards',valid),
+ STResList111 = [STRes110|STResList110],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO027.xml','./msxsdtest/wildCards',valid,S110),
+ ITResList27 = [ITRes26|ITResList26],
+
+
+ ?line {STRes111,S111} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO028.xsd','./msxsdtest/wildCards',valid),
+ STResList112 = [STRes111|STResList111],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO028.xml','./msxsdtest/wildCards',invalid,S111),
+ ITResList28 = [ITRes27|ITResList27],
+
+
+ ?line {STRes112,S112} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO029.xsd','./msxsdtest/wildCards',valid),
+ STResList113 = [STRes112|STResList112],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO029.xml','./msxsdtest/wildCards',valid,S112),
+ ITResList29 = [ITRes28|ITResList28],
+
+
+ ?line {STRes113,S113} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO030.xsd','./msxsdtest/wildCards',valid),
+ STResList114 = [STRes113|STResList113],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO030.xml','./msxsdtest/wildCards',invalid,S113),
+ ITResList30 = [ITRes29|ITResList29],
+
+
+ ?line {STRes114,S114} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO031.xsd','./msxsdtest/wildCards',valid),
+ STResList115 = [STRes114|STResList114],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO031.xml','./msxsdtest/wildCards',valid,S114),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes115,S115} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO032.xsd','./msxsdtest/wildCards',valid),
+ STResList116 = [STRes115|STResList115],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO032.xml','./msxsdtest/wildCards',invalid,S115),
+ ITResList32 = [ITRes31|ITResList31],
+
+
+ ?line {STRes116,S116} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO033.xsd','./msxsdtest/wildCards',valid),
+ STResList117 = [STRes116|STResList116],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO033.xml','./msxsdtest/wildCards',valid,S116),
+ ITResList33 = [ITRes32|ITResList32],
+
+
+ ?line {STRes117,S117} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO034.xsd','./msxsdtest/wildCards',valid),
+ STResList118 = [STRes117|STResList117],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO034.xml','./msxsdtest/wildCards',invalid,S117),
+ ITResList34 = [ITRes33|ITResList33],
+
+
+ ?line {STRes118,S118} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO035.xsd','./msxsdtest/wildCards',valid),
+ STResList119 = [STRes118|STResList118],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO035.xml','./msxsdtest/wildCards',invalid,S118),
+ ITResList35 = [ITRes34|ITResList34],
+
+
+ ?line {STRes119,S119} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO037.xsd','./msxsdtest/wildCards',valid),
+ STResList120 = [STRes119|STResList119],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO037.xml','./msxsdtest/wildCards',valid,S119),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes120,S120} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO038.xsd','./msxsdtest/wildCards',valid),
+ STResList121 = [STRes120|STResList120],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO038.xml','./msxsdtest/wildCards',valid,S120),
+ ITResList37 = [ITRes36|ITResList36],
+
+
+ ?line {STRes121,S121} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO039.xsd','./msxsdtest/wildCards',valid),
+ STResList122 = [STRes121|STResList121],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO039.xml','./msxsdtest/wildCards',invalid,S121),
+ ITResList38 = [ITRes37|ITResList37],
+
+
+ ?line {STRes122,S122} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildO040.xsd','./msxsdtest/wildCards',valid),
+ STResList123 = [STRes122|STResList122],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildO040.xml','./msxsdtest/wildCards',valid,S122),
+ ITResList39 = [ITRes38|ITResList38],
+
+
+ ?line {STRes123,S123} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildP001.xsd','./msxsdtest/wildCards',valid),
+ STResList124 = [STRes123|STResList123],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildP001.xml','./msxsdtest/wildCards',valid,S123),
+ ITResList40 = [ITRes39|ITResList39],
+
+
+ ?line {STRes124,S124} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildP002.xsd','./msxsdtest/wildCards',valid),
+ STResList125 = [STRes124|STResList124],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildP002.xml','./msxsdtest/wildCards',invalid,S124),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes125,S125} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildP003.xsd','./msxsdtest/wildCards',valid),
+ STResList126 = [STRes125|STResList125],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildP003.xml','./msxsdtest/wildCards',valid,S125),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes126,S126} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildP004.xsd','./msxsdtest/wildCards',valid),
+ STResList127 = [STRes126|STResList126],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildP004.xml','./msxsdtest/wildCards',valid,S126),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes127,S127} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildP005.xsd','./msxsdtest/wildCards',valid),
+ STResList128 = [STRes127|STResList127],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildP005.xml','./msxsdtest/wildCards',valid,S127),
+ ITResList44 = [ITRes43|ITResList43],
+
+
+ ?line {STRes128,S128} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildP006.xsd','./msxsdtest/wildCards',valid),
+ STResList129 = [STRes128|STResList128],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildP006.xml','./msxsdtest/wildCards',valid,S128),
+ ITResList45 = [ITRes44|ITResList44],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList129,ITResList45).
+
+%% Bugs - Wildcards.
+
+wildZ(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/wildCards/wildZ001.xsd','./msxsdtest/wildCards',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./msxsdtest/wildCards/wildZ001.xml','./msxsdtest/wildCards',invalid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList1).
+
diff --git a/lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE_data/msx_failed_cases.log b/lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE_data/msx_failed_cases.log
new file mode 100644
index 0000000000..a89a9a798c
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE_data/msx_failed_cases.log
@@ -0,0 +1,2234 @@
+{att,{["attgD041.xsd",
+ "attgD039.xsd",
+ "attgD038.xsd",
+ "attgD037.xsd",
+ "attgD017.xsd",
+ "attgD015.xsd",
+ "attgD012.xsd",
+ "attgD009.xsd",
+ "attgD008.xsd",
+ "attgD007.xsd",
+ "attgD006.xsd",
+ "attgD002.xsd",
+ "attgC044.xsd",
+ "attgC033.xsd",
+ "attgC028.xsd",
+ "attgC027.xsd",
+ "attgC026.xsd",
+ "attgC025.xsd",
+ "attgC024.xsd",
+ "attgC023.xsd",
+ "attgC020.xsd",
+ "attgC010.xsd",
+ "attgC001.xsd",
+ "attgB006.xsd",
+ "attgB003.xsd",
+ "attgB002.xsd",
+ "attgA009.xsd",
+ "attgA008.xsd",
+ "attgA007.xsd",
+ "attgA006.xsd",
+ "attgA005.xsd",
+ "attgA004.xsd",
+ "attgA003.xsd",
+ "attgA002.xsd",
+ "attZ003.xsd",
+ "attQ013.xsd",
+ "attQ012.xsd",
+ "attQ011.xsd",
+ "attQ009.xsd",
+ "attQ008.xsd",
+ "attQ007.xsd",
+ "attQ006.xsd",
+ "attQ004.xsd",
+ "attQ002.xsd",
+ "attQ001.xsd",
+ "attP030.xsd",
+ "attP006.xsd",
+ "attP002.xsd",
+ "attP001.xsd",
+ "attO024.xsd",
+ "attO023.xsd",
+ "attO022.xsd",
+ "attO021.xsd",
+ "attO020.xsd",
+ "attO019.xsd",
+ "attO017.xsd",
+ "attO016.xsd",
+ "attO015.xsd",
+ "attO014.xsd",
+ "attO013.xsd",
+ "attO005.xsd",
+ "attO003.xsd",
+ "attO002.xsd",
+ "attKc018.xsd",
+ "attKc017.xsd",
+ "attKc016.xsd",
+ "attKc015.xsd",
+ "attKc014.xsd",
+ "attKc013.xsd",
+ "attKc012.xsd",
+ "attKc011.xsd",
+ "attKc010.xsd",
+ "attKc005.xsd",
+ "attKc004.xsd",
+ "attKc001.xsd",
+ "attKb018.xsd",
+ "attKb017.xsd",
+ "attKb016.xsd",
+ "attKb015.xsd",
+ "attKb014.xsd",
+ "attKb013.xsd",
+ "attKb012.xsd",
+ "attKb011.xsd",
+ "attKb010.xsd",
+ "attKb005.xsd",
+ "attKb004.xsd",
+ "attKb001.xsd",
+ "attKa015.xsd",
+ "attKa011.xsd",
+ "attKa009.xsd",
+ "attKa008.xsd",
+ "attKa007.xsd",
+ "attKa005.xsd",
+ "attKa004.xsd",
+ "attKa003.xsd",
+ "attI005.xsd",
+ "attI004.xsd",
+ "attH001.xsd",
+ "attE006.xsd",
+ "attC010.xsd",
+ "attC009.xsd",
+ "attC008.xsd",
+ "attC007.xsd",
+ "attC006.xsd",
+ "attC005.xsd",
+ "attA002.xsd",
+ "attA001.xsd",
+ "attgD036.xml",
+ "attgD034.xml",
+ "attgD033.xml",
+ "attgD031.xml",
+ "attgD029.xml",
+ "attgD027.xml",
+ "attgD026.xml",
+ "attgD024.xml",
+ "attgD022.xml",
+ "attgC038.xml",
+ "attgC037.xml",
+ "attgC036.xml",
+ "attgC035.xml",
+ "attgC026.xml",
+ "attgC024.xml",
+ "attgC007.xml",
+ "attZ002.xml",
+ "attZ001.xml",
+ "attP031.xml",
+ "attP020.xml",
+ "attP018.xml",
+ "attP016.xml",
+ "attP014.xml",
+ "attP012.xml",
+ "attP010.xml",
+ "attP009.xml",
+ "attP005.xml",
+ "attO012.xml",
+ "attO008.xml",
+ "attO006.xml",
+ "attMc012.xml",
+ "attMc011.xml",
+ "attMc010.xml",
+ "attMc003.xml",
+ "attMc002.xml",
+ "attMc001.xml",
+ "attMb012.xml",
+ "attMb011.xml",
+ "attMb010.xml",
+ "attMb003.xml",
+ "attMb002.xml",
+ "attMb001.xml",
+ "attMa002.xml",
+ "attMa001.xml",
+ "attLc005.xml",
+ "attLb005.xml",
+ "attLa005.xml",
+ "attJ008.xml",
+ "attJ003.xml",
+ "attJ002.xml",
+ "attF001.xml",
+ "attD007.xml",
+ "attD004.xml"],[]}}.
+{ct,{["ctO004.xsd",
+ "ctO002.xsd",
+ "ctN002.xsd",
+ "ctM004.xsd",
+ "ctM003.xsd",
+ "ctM001.xsd",
+ "ctJ003.xsd",
+ "ctJ002.xsd",
+ "ctI024.xsd",
+ "ctI020.xsd",
+ "ctI017.xsd",
+ "ctI016.xsd",
+ "ctI013.xsd",
+ "ctI012.xsd",
+ "ctI011.xsd",
+ "ctI008.xsd",
+ "ctI007.xsd",
+ "ctI006.xsd",
+ "ctH081.xsd",
+ "ctH078.xsd",
+ "ctH077.xsd",
+ "ctH076.xsd",
+ "ctH075.xsd",
+ "ctH074.xsd",
+ "ctH073.xsd",
+ "ctH072.xsd",
+ "ctH069.xsd",
+ "ctH068.xsd",
+ "ctH067.xsd",
+ "ctH066.xsd",
+ "ctH060.xsd",
+ "ctH059.xsd",
+ "ctH057.xsd",
+ "ctH056.xsd",
+ "ctH054.xsd",
+ "ctH053.xsd",
+ "ctH052.xsd",
+ "ctH051.xsd",
+ "ctH050.xsd",
+ "ctH048.xsd",
+ "ctH046.xsd",
+ "ctH045.xsd",
+ "ctH042.xsd",
+ "ctH041.xsd",
+ "ctH040.xsd",
+ "ctH039.xsd",
+ "ctH038.xsd",
+ "ctH036.xsd",
+ "ctH034.xsd",
+ "ctH033.xsd",
+ "ctH030.xsd",
+ "ctH029.xsd",
+ "ctH028.xsd",
+ "ctH027.xsd",
+ "ctH026.xsd",
+ "ctH024.xsd",
+ "ctH022.xsd",
+ "ctH021.xsd",
+ "ctH018.xsd",
+ "ctH017.xsd",
+ "ctH016.xsd",
+ "ctH015.xsd",
+ "ctH014.xsd",
+ "ctH012.xsd",
+ "ctH010.xsd",
+ "ctH009.xsd",
+ "ctH006.xsd",
+ "ctH005.xsd",
+ "ctH004.xsd",
+ "ctH003.xsd",
+ "ctH002.xsd",
+ "ctG076.xsd",
+ "ctG075.xsd",
+ "ctG071.xsd",
+ "ctG069.xsd",
+ "ctG068.xsd",
+ "ctG067.xsd",
+ "ctG066.xsd",
+ "ctG060.xsd",
+ "ctG058.xsd",
+ "ctG057.xsd",
+ "ctG056.xsd",
+ "ctG055.xsd",
+ "ctG054.xsd",
+ "ctG053.xsd",
+ "ctG049.xsd",
+ "ctG046.xsd",
+ "ctG045.xsd",
+ "ctG038.xsd",
+ "ctG034.xsd",
+ "ctG033.xsd",
+ "ctG026.xsd",
+ "ctG023.xsd",
+ "ctG022.xsd",
+ "ctG021.xsd",
+ "ctG020.xsd",
+ "ctG019.xsd",
+ "ctG013.xsd",
+ "ctG011.xsd",
+ "ctG010.xsd",
+ "ctG009.xsd",
+ "ctG008.xsd",
+ "ctG007.xsd",
+ "ctG001.xsd",
+ "ctF013.xsd",
+ "ctF009.xsd",
+ "ctF008.xsd",
+ "ctF007.xsd",
+ "ctF005.xsd",
+ "ctF004.xsd",
+ "ctF003.xsd",
+ "ctF002.xsd",
+ "ctE016.xsd",
+ "ctE015.xsd",
+ "ctE014.xsd",
+ "ctE013.xsd",
+ "ctE012.xsd",
+ "ctE011.xsd",
+ "ctE009.xsd",
+ "ctE005.xsd",
+ "ctE003.xsd",
+ "ctD043.xsd",
+ "ctD042.xsd",
+ "ctD041.xsd",
+ "ctD040.xsd",
+ "ctD032.xsd",
+ "ctD031.xsd",
+ "ctD011.xsd",
+ "ctD007.xsd",
+ "ctD004.xsd",
+ "ctD001.xsd",
+ "ctC005.xsd",
+ "ctC004.xsd",
+ "ctC003.xsd",
+ "ctC002.xsd",
+ "ctB125.xsd",
+ "ctB124.xsd",
+ "ctB123.xsd",
+ "ctB122.xsd",
+ "ctB121.xsd",
+ "ctB120.xsd",
+ "ctB119.xsd",
+ "ctB118.xsd",
+ "ctB117.xsd",
+ "ctB116.xsd",
+ "ctB115.xsd",
+ "ctB114.xsd",
+ "ctB112.xsd",
+ "ctB107.xsd",
+ "ctB106.xsd",
+ "ctB105.xsd",
+ "ctB104.xsd",
+ "ctB102.xsd",
+ "ctB101.xsd",
+ "ctB099.xsd",
+ "ctB094.xsd",
+ "ctB093.xsd",
+ "ctB092.xsd",
+ "ctB091.xsd",
+ "ctB090.xsd",
+ "ctB089.xsd",
+ "ctB088.xsd",
+ "ctB086.xsd",
+ "ctB080.xsd",
+ "ctB079.xsd",
+ "ctB078.xsd",
+ "ctB077.xsd",
+ "ctB076.xsd",
+ "ctB075.xsd",
+ "ctB074.xsd",
+ "ctB072.xsd",
+ "ctB066.xsd",
+ "ctB065.xsd",
+ "ctB064.xsd",
+ "ctB063.xsd",
+ "ctB062.xsd",
+ "ctB061.xsd",
+ "ctB060.xsd",
+ "ctB058.xsd",
+ "ctB052.xsd",
+ "ctB051.xsd",
+ "ctB050.xsd",
+ "ctB049.xsd",
+ "ctB048.xsd",
+ "ctB047.xsd",
+ "ctB046.xsd",
+ "ctB044.xsd",
+ "ctB038.xsd",
+ "ctB037.xsd",
+ "ctB036.xsd",
+ "ctB035.xsd",
+ "ctB034.xsd",
+ "ctB033.xsd",
+ "ctB032.xsd",
+ "ctB030.xsd",
+ "ctB029.xsd",
+ "ctB026.xsd",
+ "ctB025.xsd",
+ "ctB024.xsd",
+ "ctB023.xsd",
+ "ctB022.xsd",
+ "ctB021.xsd",
+ "ctB020.xsd",
+ "ctB019.xsd",
+ "ctB018.xsd",
+ "ctB016.xsd",
+ "ctB015.xsd",
+ "ctB014.xsd",
+ "ctB013.xsd",
+ "ctB012.xsd",
+ "ctB011.xsd",
+ "ctB010.xsd",
+ "ctB009.xsd",
+ "ctB008.xsd",
+ "ctB007.xsd",
+ "ctB005.xsd",
+ "ctB004.xsd",
+ "ctB002.xsd",
+ "ctA046.xsd",
+ "ctA044.xsd",
+ "ctA043.xsd",
+ "ctA042.xsd",
+ "ctA031.xsd",
+ "ctA030.xsd",
+ "ctA029.xsd",
+ "ctA028.xsd",
+ "ctA024.xsd",
+ "ctA023.xsd",
+ "ctA015.xsd",
+ "ctA014.xsd",
+ "ctO006.xml",
+ "ctL021.xml",
+ "ctL018.xml",
+ "ctL016.xml",
+ "ctL005.xml",
+ "ctJ001.xml",
+ "ctI049.xml",
+ "ctI048.xml",
+ "ctI045.xml",
+ "ctI042.xml",
+ "ctI041.xml",
+ "ctI040.xml",
+ "ctI035.xml",
+ "ctI032.xml",
+ "ctI031.xml",
+ "ctI030.xml",
+ "ctH082.xml",
+ "ctH069.xml",
+ "ctH068.xml",
+ "ctH067.xml",
+ "ctH066.xml",
+ "ctH060.xml",
+ "ctH057.xml",
+ "ctH056.xml",
+ "ctH046.xml",
+ "ctH045.xml",
+ "ctH035.xml",
+ "ctH034.xml",
+ "ctH033.xml",
+ "ctH032.xml",
+ "ctH031.xml",
+ "ctH025.xml",
+ "ctH023.xml",
+ "ctH022.xml",
+ "ctH021.xml",
+ "ctH020.xml",
+ "ctH019.xml",
+ "ctH013.xml",
+ "ctH011.xml",
+ "ctH010.xml",
+ "ctH009.xml",
+ "ctH008.xml",
+ "ctH007.xml",
+ "ctH001.xml",
+ "ctG071.xml",
+ "ctG069.xml",
+ "ctG068.xml",
+ "ctG067.xml",
+ "ctG066.xml",
+ "ctG060.xml",
+ "ctG058.xml",
+ "ctG057.xml",
+ "ctG056.xml",
+ "ctG055.xml",
+ "ctG049.xml",
+ "ctG047.xml",
+ "ctG046.xml",
+ "ctG045.xml",
+ "ctG035.xml",
+ "ctG034.xml",
+ "ctG033.xml",
+ "ctG023.xml",
+ "ctG022.xml",
+ "ctG021.xml",
+ "ctG020.xml",
+ "ctG019.xml",
+ "ctG013.xml",
+ "ctG011.xml",
+ "ctG010.xml",
+ "ctG009.xml",
+ "ctG008.xml",
+ "ctG007.xml",
+ "ctG001.xml",
+ "ctF014.xml",
+ "ctF013.xml",
+ "ctF011.xml",
+ "ctF007.xml",
+ "ctF006.xml",
+ "ctD032.xml",
+ "ctD031.xml"],[]}}.
+{elem,{["elemT015.xsd",
+ "elemT014.xsd",
+ "elemT013.xsd",
+ "elemT012.xsd",
+ "elemT011.xsd",
+ "elemS006.xsd",
+ "elemS005.xsd",
+ "elemS004.xsd",
+ "elemS001.xsd",
+ "elemQ006.xsd",
+ "elemQ004.xsd",
+ "elemP006.xsd",
+ "elemN006.xsd",
+ "elemL003.xsd",
+ "elemK007.xsd",
+ "elemJ020.xsd",
+ "elemJ019.xsd",
+ "elemJ015.xsd",
+ "elemJ012.xsd",
+ "elemJ007.xsd",
+ "elemH006.xsd",
+ "elemH005.xsd",
+ "elemH004.xsd",
+ "elemH003.xsd",
+ "elemG004.xsd",
+ "elemG003.xsd",
+ "elemE006.xsd",
+ "elemD005.xsd",
+ "elemD004.xsd",
+ "elemA014.xsd",
+ "elemA013.xsd",
+ "elemA011.xsd",
+ "elemA010.xsd",
+ "elemA009.xsd",
+ "elemA006.xsd",
+ "elemZ001.xml",
+ "elemZ002.xml",
+ "elemU007.xml",
+ "elemU006.xml",
+ "elemU005.xml",
+ "elemU003.xml",
+ "elemT058.xml",
+ "elemT044.xml",
+ "elemT043.xml",
+ "elemT042.xml",
+ "elemT041.xml",
+ "elemT040.xml",
+ "elemT039.xml",
+ "elemT029.xml",
+ "elemT028.xml",
+ "elemT027.xml",
+ "elemT026.xml",
+ "elemT024.xml",
+ "elemT022.xml",
+ "elemT018.xml",
+ "elemT015.xml",
+ "elemT014.xml",
+ "elemT004.xml",
+ "elemT001.xml",
+ "elemQ022.xml",
+ "elemQ019.xml",
+ "elemQ018.xml",
+ "elemO011.xml",
+ "elemO006.xml"],[]}}.
+{group,{["groupO027.xsd",
+ "groupO025.xsd",
+ "groupO024.xsd",
+ "groupO023.xsd",
+ "groupO022.xsd",
+ "groupO021.xsd",
+ "groupO020.xsd",
+ "groupO019.xsd",
+ "groupO018.xsd",
+ "groupO017.xsd",
+ "groupO016.xsd",
+ "groupO015.xsd",
+ "groupO013.xsd",
+ "groupO012.xsd",
+ "groupO011.xsd",
+ "groupO010.xsd",
+ "groupO003.xsd",
+ "groupO002.xsd",
+ "groupN025.xsd",
+ "groupN024.xsd",
+ "groupN023.xsd",
+ "groupN022.xsd",
+ "groupM002.xsd",
+ "groupL025.xsd",
+ "groupL024.xsd",
+ "groupL023.xsd",
+ "groupL022.xsd",
+ "groupK002.xsd",
+ "groupJ025.xsd",
+ "groupJ024.xsd",
+ "groupJ023.xsd",
+ "groupJ022.xsd",
+ "groupI003.xsd",
+ "groupI002.xsd",
+ "groupH019.xsd",
+ "groupH018.xsd",
+ "groupH016.xsd",
+ "groupH015.xsd",
+ "groupH014.xsd",
+ "groupH013.xsd",
+ "groupH012.xsd",
+ "groupH011.xsd",
+ "groupH010.xsd",
+ "groupH009.xsd",
+ "groupH008.xsd",
+ "groupH006.xsd",
+ "groupH005.xsd",
+ "groupH004.xsd",
+ "groupH003.xsd",
+ "groupH002.xsd",
+ "groupH001.xsd",
+ "groupG005.xsd",
+ "groupG004.xsd",
+ "groupG003.xsd",
+ "groupG001.xsd",
+ "groupF025.xsd",
+ "groupF024.xsd",
+ "groupF023.xsd",
+ "groupF022.xsd",
+ "groupE002.xsd",
+ "groupD003.xsd",
+ "groupD001.xsd",
+ "groupC010.xsd",
+ "groupC008.xsd",
+ "groupC007.xsd",
+ "groupC006.xsd",
+ "groupC004.xsd",
+ "groupB017.xsd",
+ "groupB015.xsd",
+ "groupB014.xsd",
+ "groupB013.xsd",
+ "groupB012.xsd",
+ "groupB002.xsd",
+ "groupB001.xsd",
+ "groupA012.xsd",
+ "groupA010.xsd",
+ "groupA009.xsd",
+ "groupA007.xsd",
+ "groupA006.xsd",
+ "groupA005.xsd",
+ "groupA004.xsd",
+ "groupA003.xsd",
+ "groupO009.xml",
+ "groupO007.xml",
+ "groupO004.xml",
+ "groupN019.xml",
+ "groupN015.xml",
+ "groupN012.xml",
+ "groupN008.xml",
+ "groupN007.xml",
+ "groupN006.xml",
+ "groupN003.xml",
+ "groupM005.xml",
+ "groupL019.xml",
+ "groupL015.xml",
+ "groupL012.xml",
+ "groupL008.xml",
+ "groupL007.xml",
+ "groupL006.xml",
+ "groupL003.xml",
+ "groupK005.xml",
+ "groupJ019.xml",
+ "groupJ015.xml",
+ "groupJ012.xml",
+ "groupJ008.xml",
+ "groupJ007.xml",
+ "groupJ006.xml",
+ "groupJ003.xml",
+ "groupI005.xml",
+ "groupH018.xml",
+ "groupH014.xml",
+ "groupH011.xml",
+ "groupH009.xml",
+ "groupH007.xml",
+ "groupH005.xml",
+ "groupH004.xml",
+ "groupH002.xml",
+ "groupH001.xml",
+ "groupG004.xml",
+ "groupF021.xml",
+ "groupF018.xml",
+ "groupF017.xml",
+ "groupF016.xml",
+ "groupF014.xml",
+ "groupF013.xml",
+ "groupF011.xml",
+ "groupF010.xml",
+ "groupF009.xml",
+ "groupF005.xml",
+ "groupF002.xml",
+ "groupE004.xml",
+ "groupE003.xml",
+ "groupB010.xml",
+ "groupB009.xml",
+ "groupB002.xml"],[]}}.
+{idc_,{["idc_gMonth_gMonth.xml",
+ "idc_gDay_gDay.xml",
+ "idc_gMonthDay_gMonthDay.xml",
+ "idc_gYear_gYear.xml",
+ "idc_gYearMonth_gYearMonth.xml",
+ "idc_date_date.xml",
+ "idc_time_time.xml",
+ "idc_dateTime_dateTime.xml",
+ "idc_duration_duration.xml",
+ "idc_NOTATION_NOTATION.xml",
+ "idc_QName_QName.xml",
+ "idc_anyURI_anyURI.xml",
+ "idc_double_double.xml",
+ "idc_unsignedByte_unsignedByte.xml",
+ "idc_unsignedByte_unsignedShort.xml",
+ "idc_unsignedByte_unsignedInt.xml",
+ "idc_unsignedByte_unsignedLong.xml",
+ "idc_unsignedByte_integer.xml",
+ "idc_unsignedByte_decimal.xml",
+ "idc_unsignedShort_unsignedByte.xml",
+ "idc_unsignedShort_unsignedShort.xml",
+ "idc_unsignedShort_unsignedInt.xml",
+ "idc_unsignedShort_unsignedLong.xml",
+ "idc_unsignedShort_integer.xml",
+ "idc_unsignedShort_decimal.xml",
+ "idc_unsignedInt_unsignedByte.xml",
+ "idc_unsignedInt_unsignedShort.xml",
+ "idc_unsignedInt_unsignedInt.xml",
+ "idc_unsignedInt_unsignedLong.xml",
+ "idc_unsignedInt_integer.xml",
+ "idc_unsignedInt_decimal.xml",
+ "idc_unsignedLong_unsignedByte.xml",
+ "idc_unsignedLong_unsignedShort.xml",
+ "idc_unsignedLong_unsignedInt.xml",
+ "idc_unsignedLong_unsignedLong.xml",
+ "idc_unsignedLong_integer.xml",
+ "idc_unsignedLong_decimal.xml",
+ "idc_positiveInteger_integer.xml",
+ "idc_positiveInteger_decimal.xml",
+ "idc_nonNegativeInteger_integer.xml",
+ "idc_nonNegativeInteger_decimal.xml",
+ "idc_byte_byte.xml",
+ "idc_byte_short.xml",
+ "idc_byte_int.xml",
+ "idc_byte_long.xml",
+ "idc_byte_integer.xml",
+ "idc_byte_decimal.xml",
+ "idc_short_byte.xml",
+ "idc_short_short.xml",
+ "idc_short_int.xml",
+ "idc_short_long.xml",
+ "idc_short_integer.xml",
+ "idc_short_decimal.xml",
+ "idc_int_byte.xml",
+ "idc_int_short.xml",
+ "idc_int_int.xml",
+ "idc_int_long.xml",
+ "idc_int_integer.xml",
+ "idc_int_decimal.xml",
+ "idc_long_byte.xml",
+ "idc_long_short.xml",
+ "idc_long_int.xml",
+ "idc_long_long.xml",
+ "idc_long_integer.xml",
+ "idc_long_decimal.xml",
+ "idc_negativeInteger_integer.xml",
+ "idc_negativeInteger_decimal.xml",
+ "idc_nonPositiveInteger_integer.xml",
+ "idc_nonPositiveInteger_decimal.xml",
+ "idc_integer_unsignedByte.xml",
+ "idc_integer_unsignedShort.xml",
+ "idc_integer_unsignedInt.xml",
+ "idc_integer_unsignedLong.xml",
+ "idc_integer_positiveInteger.xml",
+ "idc_integer_nonNegativeInteger.xml",
+ "idc_integer_byte.xml",
+ "idc_integer_short.xml",
+ "idc_integer_int.xml",
+ "idc_integer_long.xml",
+ "idc_integer_negativeInteger.xml",
+ "idc_integer_nonPositiveInteger.xml",
+ "idc_integer_integer.xml",
+ "idc_integer_decimal.xml",
+ "idc_decimal_unsignedByte.xml",
+ "idc_decimal_unsignedShort.xml",
+ "idc_decimal_unsignedInt.xml",
+ "idc_decimal_unsignedLong.xml",
+ "idc_decimal_positiveInteger.xml",
+ "idc_decimal_nonNegativeInteger.xml",
+ "idc_decimal_byte.xml",
+ "idc_decimal_short.xml",
+ "idc_decimal_int.xml",
+ "idc_decimal_long.xml",
+ "idc_decimal_negativeInteger.xml",
+ "idc_decimal_nonPositiveInteger.xml",
+ "idc_decimal_integer.xml",
+ "idc_decimal_decimal.xml",
+ "idc_float_float.xml",
+ "idc_boolean_boolean.xml",
+ "idc_NMTOKEN_NMTOKEN.xml",
+ "idc_NMTOKEN_token.xml",
+ "idc_NMTOKEN_normalizedString.xml",
+ "idc_NMTOKEN_string.xml",
+ "idc_IDREF_IDREF.xml",
+ "idc_IDREF_NCName.xml",
+ "idc_IDREF_Name.xml",
+ "idc_IDREF_token.xml",
+ "idc_IDREF_normalizedString.xml",
+ "idc_IDREF_string.xml",
+ "idc_ID_NCName.xml",
+ "idc_ID_Name.xml",
+ "idc_ID_token.xml",
+ "idc_ID_normalizedString.xml",
+ "idc_ID_string.xml",
+ "idc_NCName_IDREF.xml",
+ "idc_NCName_ID.xml",
+ "idc_NCName_NCName.xml",
+ "idc_NCName_Name.xml",
+ "idc_NCName_token.xml",
+ "idc_NCName_normalizedString.xml",
+ "idc_NCName_string.xml",
+ "idc_Name_IDREF.xml",
+ "idc_Name_ID.xml",
+ "idc_Name_NCName.xml",
+ "idc_Name_Name.xml",
+ "idc_Name_token.xml",
+ "idc_Name_normalizedString.xml",
+ "idc_Name_string.xml",
+ "idc_language_language.xml",
+ "idc_language_token.xml",
+ "idc_language_normalizedString.xml",
+ "idc_language_string.xml",
+ "idc_token_NMTOKEN.xml",
+ "idc_token_IDREF.xml",
+ "idc_token_ID.xml",
+ "idc_token_NCName.xml",
+ "idc_token_Name.xml",
+ "idc_token_language.xml",
+ "idc_token_token.xml",
+ "idc_token_normalizedString.xml",
+ "idc_token_string.xml",
+ "idc_normalizedString_NMTOKEN.xml",
+ "idc_normalizedString_IDREF.xml",
+ "idc_normalizedString_ID.xml",
+ "idc_normalizedString_NCName.xml",
+ "idc_normalizedString_Name.xml",
+ "idc_normalizedString_language.xml",
+ "idc_normalizedString_token.xml",
+ "idc_normalizedString_string.xml",
+ "idc_string_NMTOKEN.xml",
+ "idc_string_IDREF.xml",
+ "idc_string_ID.xml",
+ "idc_string_NCName.xml",
+ "idc_string_Name.xml",
+ "idc_string_language.xml",
+ "idc_string_token.xml",
+ "idc_string_normalizedString.xml",
+ "idc_string_string.xml"],["idc_unsignedByte_nonNegativeInteger.xsd",
+ "idc_unsignedByte_normalizedString.xsd",
+ "idc_unsignedShort_positiveInteger.xsd",
+ "idc_unsignedShort_nonNegativeInteger.xsd",
+ "idc_unsignedShort_normalizedString.xsd",
+ "idc_unsignedInt_nonNegativeInteger.xsd",
+ "idc_unsignedLong_nonNegativeInteger.xsd",
+ "idc_unsignedLong_normalizedString.xsd",
+ "idc_positiveInteger_unsignedShort.xsd",
+ "idc_positiveInteger_positiveInteger.xsd",
+ "idc_positiveInteger_nonNegativeInteger.xsd",
+ "idc_positiveInteger_normalizedString.xsd",
+ "idc_nonNegativeInteger_unsignedByte.xsd",
+ "idc_nonNegativeInteger_unsignedShort.xsd",
+ "idc_nonNegativeInteger_unsignedInt.xsd",
+ "idc_nonNegativeInteger_unsignedLong.xsd",
+ "idc_nonNegativeInteger_positiveInteger.xsd",
+ "idc_nonNegativeInteger_nonNegativeInteger.xsd",
+ "idc_nonNegativeInteger_base64Binary.xsd",
+ "idc_nonNegativeInteger_normalizedString.xsd",
+ "idc_negativeInteger_negativeInteger.xsd",
+ "idc_negativeInteger_nonPositiveInteger.xsd",
+ "idc_negativeInteger_normalizedString.xsd",
+ "idc_nonPositiveInteger_negativeInteger.xsd",
+ "idc_nonPositiveInteger_nonPositiveInteger.xsd",
+ "idc_nonPositiveInteger_normalizedString.xsd",
+ "idc_base64Binary_nonNegativeInteger.xsd",
+ "idc_base64Binary_normalizedString.xsd",
+ "idc_normalizedString_unsignedByte.xsd",
+ "idc_normalizedString_unsignedShort.xsd",
+ "idc_normalizedString_unsignedLong.xsd",
+ "idc_normalizedString_positiveInteger.xsd",
+ "idc_normalizedString_nonNegativeInteger.xsd",
+ "idc_normalizedString_negativeInteger.xsd",
+ "idc_normalizedString_nonPositiveInteger.xsd",
+ "idc_normalizedString_base64Binary.xsd",
+ "idc_normalizedString_normalizedString.xsd",
+ "idc_unsignedByte_nonNegativeInteger.xml",
+ "idc_unsignedByte_normalizedString.xml",
+ "idc_unsignedShort_positiveInteger.xml",
+ "idc_unsignedShort_nonNegativeInteger.xml",
+ "idc_unsignedShort_normalizedString.xml",
+ "idc_unsignedInt_nonNegativeInteger.xml",
+ "idc_unsignedLong_nonNegativeInteger.xml",
+ "idc_unsignedLong_normalizedString.xml",
+ "idc_positiveInteger_unsignedShort.xml",
+ "idc_positiveInteger_positiveInteger.xml",
+ "idc_positiveInteger_nonNegativeInteger.xml",
+ "idc_positiveInteger_normalizedString.xml",
+ "idc_nonNegativeInteger_unsignedByte.xml",
+ "idc_nonNegativeInteger_unsignedShort.xml",
+ "idc_nonNegativeInteger_unsignedInt.xml",
+ "idc_nonNegativeInteger_unsignedLong.xml",
+ "idc_nonNegativeInteger_positiveInteger.xml",
+ "idc_nonNegativeInteger_nonNegativeInteger.xml",
+ "idc_nonNegativeInteger_base64Binary.xml",
+ "idc_nonNegativeInteger_normalizedString.xml",
+ "idc_negativeInteger_negativeInteger.xml",
+ "idc_negativeInteger_nonPositiveInteger.xml",
+ "idc_negativeInteger_normalizedString.xml",
+ "idc_nonPositiveInteger_negativeInteger.xml",
+ "idc_nonPositiveInteger_nonPositiveInteger.xml",
+ "idc_nonPositiveInteger_normalizedString.xml",
+ "idc_base64Binary_nonNegativeInteger.xml",
+ "idc_base64Binary_normalizedString.xml",
+ "idc_normalizedString_unsignedByte.xml",
+ "idc_normalizedString_unsignedShort.xml",
+ "idc_normalizedString_unsignedLong.xml",
+ "idc_normalizedString_positiveInteger.xml",
+ "idc_normalizedString_nonNegativeInteger.xml",
+ "idc_normalizedString_negativeInteger.xml",
+ "idc_normalizedString_nonPositiveInteger.xml",
+ "idc_normalizedString_base64Binary.xml",
+ "idc_normalizedString_normalizedString.xml"]}}.
+{id,{["idK016.xsd",
+ "idK015.xsd",
+ "idJ204.xsd",
+ "idJ203.xsd",
+ "idJ202.xsd",
+ "idJ201.xsd",
+ "idJ200.xsd",
+ "idJ199.xsd",
+ "idJ198.xsd",
+ "idJ197.xsd",
+ "idJ196.xsd",
+ "idJ195.xsd",
+ "idJ194.xsd",
+ "idJ193.xsd",
+ "idJ192.xsd",
+ "idJ191.xsd",
+ "idJ190.xsd",
+ "idJ189.xsd",
+ "idJ188.xsd",
+ "idJ187.xsd",
+ "idJ186.xsd",
+ "idJ185.xsd",
+ "idJ184.xsd",
+ "idJ183.xsd",
+ "idJ182.xsd",
+ "idJ181.xsd",
+ "idJ180.xsd",
+ "idJ179.xsd",
+ "idJ178.xsd",
+ "idJ177.xsd",
+ "idJ176.xsd",
+ "idJ175.xsd",
+ "idJ174.xsd",
+ "idJ173.xsd",
+ "idJ172.xsd",
+ "idJ171.xsd",
+ "idJ170.xsd",
+ "idJ169.xsd",
+ "idJ168.xsd",
+ "idJ167.xsd",
+ "idJ166.xsd",
+ "idJ165.xsd",
+ "idJ164.xsd",
+ "idJ163.xsd",
+ "idJ162.xsd",
+ "idJ161.xsd",
+ "idJ160.xsd",
+ "idJ159.xsd",
+ "idJ158.xsd",
+ "idJ157.xsd",
+ "idJ156.xsd",
+ "idJ155.xsd",
+ "idJ154.xsd",
+ "idJ153.xsd",
+ "idJ152.xsd",
+ "idJ151.xsd",
+ "idJ150.xsd",
+ "idJ149.xsd",
+ "idJ148.xsd",
+ "idJ147.xsd",
+ "idJ146.xsd",
+ "idJ145.xsd",
+ "idJ144.xsd",
+ "idJ143.xsd",
+ "idJ142.xsd",
+ "idJ141.xsd",
+ "idJ140.xsd",
+ "idJ139.xsd",
+ "idJ138.xsd",
+ "idJ137.xsd",
+ "idJ136.xsd",
+ "idJ135.xsd",
+ "idJ134.xsd",
+ "idJ133.xsd",
+ "idJ132.xsd",
+ "idJ131.xsd",
+ "idJ130.xsd",
+ "idJ129.xsd",
+ "idJ128.xsd",
+ "idJ127.xsd",
+ "idJ126.xsd",
+ "idJ125.xsd",
+ "idJ124.xsd",
+ "idJ123.xsd",
+ "idJ122.xsd",
+ "idJ121.xsd",
+ "idJ120.xsd",
+ "idJ119.xsd",
+ "idJ118.xsd",
+ "idJ117.xsd",
+ "idJ116.xsd",
+ "idJ115.xsd",
+ "idJ114.xsd",
+ "idJ113.xsd",
+ "idJ112.xsd",
+ "idJ111.xsd",
+ "idJ110.xsd",
+ "idJ109.xsd",
+ "idJ108.xsd",
+ "idJ107.xsd",
+ "idJ106.xsd",
+ "idJ105.xsd",
+ "idJ104.xsd",
+ "idJ103.xsd",
+ "idJ102.xsd",
+ "idJ101.xsd",
+ "idJ100.xsd",
+ "idJ099.xsd",
+ "idJ098.xsd",
+ "idJ097.xsd",
+ "idJ096.xsd",
+ "idJ095.xsd",
+ "idJ094.xsd",
+ "idJ093.xsd",
+ "idJ092.xsd",
+ "idJ091.xsd",
+ "idJ090.xsd",
+ "idJ089.xsd",
+ "idJ088.xsd",
+ "idJ087.xsd",
+ "idJ086.xsd",
+ "idJ085.xsd",
+ "idJ084.xsd",
+ "idJ083.xsd",
+ "idJ082.xsd",
+ "idJ081.xsd",
+ "idJ080.xsd",
+ "idJ079.xsd",
+ "idJ078.xsd",
+ "idJ077.xsd",
+ "idJ076.xsd",
+ "idJ075.xsd",
+ "idJ074.xsd",
+ "idJ073.xsd",
+ "idJ072.xsd",
+ "idJ071.xsd",
+ "idJ070.xsd",
+ "idJ069.xsd",
+ "idJ068.xsd",
+ "idJ067.xsd",
+ "idJ066.xsd",
+ "idJ065.xsd",
+ "idJ064.xsd",
+ "idJ063.xsd",
+ "idJ062.xsd",
+ "idJ061.xsd",
+ "idJ060.xsd",
+ "idJ059.xsd",
+ "idJ058.xsd",
+ "idJ057.xsd",
+ "idJ055.xsd",
+ "idJ054.xsd",
+ "idJ053.xsd",
+ "idJ051.xsd",
+ "idJ050.xsd",
+ "idJ049.xsd",
+ "idJ048.xsd",
+ "idJ047.xsd",
+ "idJ046.xsd",
+ "idJ045.xsd",
+ "idJ044.xsd",
+ "idJ043.xsd",
+ "idJ042.xsd",
+ "idJ041.xsd",
+ "idJ040.xsd",
+ "idJ039.xsd",
+ "idJ038.xsd",
+ "idJ037.xsd",
+ "idJ035.xsd",
+ "idJ034.xsd",
+ "idJ033.xsd",
+ "idJ031.xsd",
+ "idJ029.xsd",
+ "idJ028.xsd",
+ "idJ027.xsd",
+ "idJ024.xsd",
+ "idJ023.xsd",
+ "idJ022.xsd",
+ "idJ021.xsd",
+ "idJ020.xsd",
+ "idJ019.xsd",
+ "idJ018.xsd",
+ "idJ014.xsd",
+ "idJ013.xsd",
+ "idJ012.xsd",
+ "idJ011.xsd",
+ "idJ010.xsd",
+ "idJ009.xsd",
+ "idJ004.xsd",
+ "idI144.xsd",
+ "idI143.xsd",
+ "idI142.xsd",
+ "idI141.xsd",
+ "idI140.xsd",
+ "idI139.xsd",
+ "idI138.xsd",
+ "idI137.xsd",
+ "idI136.xsd",
+ "idI135.xsd",
+ "idI134.xsd",
+ "idI133.xsd",
+ "idI132.xsd",
+ "idI131.xsd",
+ "idI130.xsd",
+ "idI129.xsd",
+ "idI128.xsd",
+ "idI127.xsd",
+ "idI126.xsd",
+ "idI125.xsd",
+ "idI124.xsd",
+ "idI123.xsd",
+ "idI122.xsd",
+ "idI121.xsd",
+ "idI120.xsd",
+ "idI119.xsd",
+ "idI118.xsd",
+ "idI117.xsd",
+ "idI116.xsd",
+ "idI115.xsd",
+ "idI114.xsd",
+ "idI113.xsd",
+ "idI112.xsd",
+ "idI111.xsd",
+ "idI110.xsd",
+ "idI109.xsd",
+ "idI108.xsd",
+ "idI107.xsd",
+ "idI106.xsd",
+ "idI105.xsd",
+ "idI104.xsd",
+ "idI103.xsd",
+ "idI102.xsd",
+ "idI101.xsd",
+ "idI100.xsd",
+ "idI099.xsd",
+ "idI098.xsd",
+ "idI097.xsd",
+ "idI096.xsd",
+ "idI095.xsd",
+ "idI094.xsd",
+ "idI093.xsd",
+ "idI092.xsd",
+ "idI091.xsd",
+ "idI090.xsd",
+ "idI089.xsd",
+ "idI088.xsd",
+ "idI087.xsd",
+ "idI086.xsd",
+ "idI085.xsd",
+ "idI084.xsd",
+ "idI083.xsd",
+ "idI082.xsd",
+ "idI081.xsd",
+ "idI080.xsd",
+ "idI079.xsd",
+ "idI078.xsd",
+ "idI077.xsd",
+ "idI076.xsd",
+ "idI075.xsd",
+ "idI074.xsd",
+ "idI073.xsd",
+ "idI072.xsd",
+ "idI071.xsd",
+ "idI070.xsd",
+ "idI069.xsd",
+ "idI068.xsd",
+ "idI067.xsd",
+ "idI066.xsd",
+ "idI065.xsd",
+ "idI064.xsd",
+ "idI063.xsd",
+ "idI062.xsd",
+ "idI061.xsd",
+ "idI060.xsd",
+ "idI059.xsd",
+ "idI058.xsd",
+ "idI057.xsd",
+ "idI056.xsd",
+ "idI055.xsd",
+ "idI054.xsd",
+ "idI053.xsd",
+ "idI052.xsd",
+ "idI051.xsd",
+ "idI050.xsd",
+ "idI049.xsd",
+ "idI048.xsd",
+ "idI047.xsd",
+ "idI046.xsd",
+ "idI045.xsd",
+ "idI044.xsd",
+ "idI043.xsd",
+ "idI042.xsd",
+ "idI041.xsd",
+ "idI040.xsd",
+ "idI039.xsd",
+ "idI037.xsd",
+ "idI036.xsd",
+ "idI035.xsd",
+ "idI034.xsd",
+ "idI033.xsd",
+ "idI032.xsd",
+ "idI031.xsd",
+ "idI030.xsd",
+ "idI029.xsd",
+ "idI027.xsd",
+ "idI026.xsd",
+ "idI025.xsd",
+ "idI024.xsd",
+ "idI021.xsd",
+ "idI020.xsd",
+ "idI019.xsd",
+ "idI017.xsd",
+ "idI013.xsd",
+ "idI012.xsd",
+ "idI011.xsd",
+ "idI010.xsd",
+ "idI009.xsd",
+ "idI008.xsd",
+ "idI002.xsd",
+ "idE033.xsd",
+ "idE032.xsd",
+ "idE031.xsd",
+ "idE030.xsd",
+ "idE029.xsd",
+ "idE028.xsd",
+ "idE027.xsd",
+ "idE026.xsd",
+ "idE025.xsd",
+ "idE024.xsd",
+ "idE023.xsd",
+ "idE022.xsd",
+ "idE021.xsd",
+ "idE020.xsd",
+ "idE019.xsd",
+ "idE018.xsd",
+ "idE017.xsd",
+ "idE014.xsd",
+ "idE012.xsd",
+ "idE011.xsd",
+ "idE007.xsd",
+ "idE006.xsd",
+ "idE005.xsd",
+ "idE004.xsd",
+ "idE003.xsd",
+ "idE002.xsd",
+ "idD033.xsd",
+ "idD032.xsd",
+ "idD031.xsd",
+ "idD030.xsd",
+ "idD029.xsd",
+ "idD028.xsd",
+ "idD027.xsd",
+ "idD026.xsd",
+ "idD025.xsd",
+ "idD024.xsd",
+ "idD023.xsd",
+ "idD022.xsd",
+ "idD021.xsd",
+ "idD020.xsd",
+ "idD019.xsd",
+ "idD018.xsd",
+ "idD017.xsd",
+ "idD014.xsd",
+ "idD012.xsd",
+ "idD011.xsd",
+ "idD006.xsd",
+ "idD005.xsd",
+ "idD004.xsd",
+ "idD003.xsd",
+ "idD002.xsd",
+ "idC047.xsd",
+ "idC046.xsd",
+ "idC045.xsd",
+ "idC032.xsd",
+ "idC031.xsd",
+ "idC030.xsd",
+ "idC029.xsd",
+ "idC028.xsd",
+ "idC027.xsd",
+ "idC026.xsd",
+ "idC025.xsd",
+ "idC024.xsd",
+ "idC023.xsd",
+ "idC021.xsd",
+ "idC020.xsd",
+ "idC018.xsd",
+ "idC017.xsd",
+ "idC016.xsd",
+ "idC007.xsd",
+ "idC006.xsd",
+ "idC005.xsd",
+ "idC004.xsd",
+ "idC003.xsd",
+ "idC002.xsd",
+ "idB044.xsd",
+ "idB043.xsd",
+ "idB042.xsd",
+ "idB035.xsd",
+ "idB032.xsd",
+ "idB031.xsd",
+ "idB030.xsd",
+ "idB029.xsd",
+ "idB028.xsd",
+ "idB027.xsd",
+ "idB026.xsd",
+ "idB025.xsd",
+ "idB024.xsd",
+ "idB023.xsd",
+ "idB021.xsd",
+ "idB020.xsd",
+ "idB019.xsd",
+ "idB017.xsd",
+ "idB016.xsd",
+ "idB007.xsd",
+ "idB006.xsd",
+ "idB004.xsd",
+ "idB003.xsd",
+ "idB002.xsd",
+ "idA044.xsd",
+ "idA043.xsd",
+ "idA042.xsd",
+ "idA035.xsd",
+ "idA032.xsd",
+ "idA031.xsd",
+ "idA030.xsd",
+ "idA029.xsd",
+ "idA028.xsd",
+ "idA027.xsd",
+ "idA026.xsd",
+ "idA025.xsd",
+ "idA024.xsd",
+ "idA023.xsd",
+ "idA021.xsd",
+ "idA020.xsd",
+ "idA019.xsd",
+ "idA018.xsd",
+ "idA016.xsd",
+ "idA007.xsd",
+ "idA006.xsd",
+ "idA005.xsd",
+ "idA004.xsd",
+ "idA003.xsd",
+ "idA002.xsd",
+ "idL102.xml",
+ "idL100.xml",
+ "idL098.xml",
+ "idL096.xml",
+ "idL094.xml",
+ "idL092.xml",
+ "idL090.xml",
+ "idL075.xml",
+ "idL072.xml",
+ "idL069.xml",
+ "idL065.xml",
+ "idL062.xml",
+ "idL061.xml",
+ "idL057.xml",
+ "idL056.xml",
+ "idL052.xml",
+ "idL049.xml",
+ "idL048.xml",
+ "idL025.xml",
+ "idL024.xml",
+ "idL023.xml",
+ "idK015.xml",
+ "idK014.xml",
+ "idK012.xml",
+ "idK003.xml",
+ "idH034.xml",
+ "idH032.xml",
+ "idH023.xml",
+ "idH012.xml",
+ "idH010.xml",
+ "idH006.xml",
+ "idG030.xml",
+ "idG028.xml",
+ "idG019.xml",
+ "idG012.xml",
+ "idG011.xml",
+ "idG006.xml",
+ "idF036.xml",
+ "idF034.xml",
+ "idF033.xml",
+ "idF031.xml",
+ "idF026.xml",
+ "idF025.xml",
+ "idF017.xml",
+ "idF016.xml",
+ "idF014.xml",
+ "idF013.xml",
+ "idF012.xml",
+ "idF010.xml",
+ "idF009.xml",
+ "idF004.xml",
+ "idF003.xml"],[]}}.
+{mgABCD,{["mgC013.xsd",
+ "mgC009.xsd",
+ "mgC008.xsd",
+ "mgB010.xsd",
+ "mgB009.xsd",
+ "mgB008.xsd",
+ "mgB007.xsd",
+ "mgB003.xsd",
+ "mgAb007.xsd",
+ "mgAb006.xsd",
+ "mgAb004.xsd",
+ "mgAb003.xsd",
+ "mgAb002.xsd",
+ "mgAa007.xsd",
+ "mgAa006.xsd",
+ "mgAa004.xsd",
+ "mgAa002.xsd",
+ "mgA019.xsd",
+ "mgA018.xsd",
+ "mgA013.xsd",
+ "mgA012.xsd",
+ "mgA011.xsd",
+ "mgA008.xsd",
+ "mgA007.xsd",
+ "mgA005.xsd",
+ "mgA004.xsd",
+ "mgA003.xsd",
+ "mgA002.xsd",
+ "mgA015.xml"],[]}}.
+{mgEFG,{["mgG030.xsd",
+ "mgG029.xsd",
+ "mgG028.xsd",
+ "mgG027.xsd",
+ "mgG025.xsd",
+ "mgG002.xsd",
+ "mgF023.xsd",
+ "mgF022.xsd",
+ "mgF021.xsd",
+ "mgF020.xsd",
+ "mgF003.xsd",
+ "mgEb002.xsd",
+ "mgEa005.xsd",
+ "mgEa004.xsd",
+ "mgEa002.xsd",
+ "mgE012.xsd",
+ "mgE011.xsd",
+ "mgE010.xsd",
+ "mgE008.xsd",
+ "mgE007.xsd",
+ "mgE006.xsd",
+ "mgE005.xsd",
+ "mgE004.xsd",
+ "mgE003.xsd",
+ "mgE002.xsd",
+ "mgG026.xml",
+ "mgG023.xml",
+ "mgG013.xml",
+ "mgF019.xml",
+ "mgF016.xml",
+ "mgF015.xml",
+ "mgF014.xml",
+ "mgF013.xml",
+ "mgF012.xml",
+ "mgF011.xml",
+ "mgF010.xml",
+ "mgF009.xml",
+ "mgEb005.xml",
+ "mgEb004.xml",
+ "mgE014.xml"],[]}}.
+{mgHIJ,{["mgJ030.xsd",
+ "mgJ029.xsd",
+ "mgJ028.xsd",
+ "mgJ027.xsd",
+ "mgJ025.xsd",
+ "mgJ002.xsd",
+ "mgI023.xsd",
+ "mgI022.xsd",
+ "mgI021.xsd",
+ "mgI020.xsd",
+ "mgI003.xsd",
+ "mgHb002.xsd",
+ "mgHa005.xsd",
+ "mgHa004.xsd",
+ "mgHa002.xsd",
+ "mgH012.xsd",
+ "mgH011.xsd",
+ "mgH008.xsd",
+ "mgH007.xsd",
+ "mgH006.xsd",
+ "mgH005.xsd",
+ "mgH004.xsd",
+ "mgH003.xsd",
+ "mgH002.xsd",
+ "mgJ026.xml",
+ "mgJ023.xml",
+ "mgJ013.xml",
+ "mgJ001.xml",
+ "mgHb005.xml",
+ "mgHb004.xml",
+ "mgH015.xml"],[]}}.
+{mgOP,{["mgP056.xsd",
+ "mgP055.xsd",
+ "mgP049.xsd",
+ "mgP042.xsd",
+ "mgP040.xsd",
+ "mgP039.xsd",
+ "mgO036.xsd",
+ "mgO029.xsd",
+ "mgO027.xsd",
+ "mgO019.xsd",
+ "mgO018.xsd",
+ "mgO015.xsd",
+ "mgO008.xsd",
+ "mgO003.xsd",
+ "mgO001.xsd",
+ "mgO038.xml",
+ "mgO037.xml",
+ "mgO036.xml",
+ "mgO035.xml",
+ "mgO034.xml",
+ "mgO031.xml",
+ "mgO029.xml",
+ "mgO017.xml",
+ "mgO016.xml",
+ "mgO015.xml",
+ "mgO014.xml",
+ "mgO013.xml",
+ "mgO011.xml",
+ "mgO010.xml",
+ "mgO009.xml",
+ "mgO008.xml",
+ "mgO007.xml",
+ "mgO006.xml",
+ "mgO005.xml"],[]}}.
+{mgQR,{["mgR022.xsd",
+ "mgR021.xsd",
+ "mgR020.xsd",
+ "mgR019.xsd",
+ "mgR018.xsd",
+ "mgR017.xsd",
+ "mgR016.xsd",
+ "mgR015.xsd",
+ "mgR014.xsd",
+ "mgR013.xsd",
+ "mgR012.xsd",
+ "mgR011.xsd",
+ "mgR010.xsd",
+ "mgR009.xsd",
+ "mgR008.xsd",
+ "mgR007.xsd",
+ "mgR006.xsd",
+ "mgR005.xsd",
+ "mgR004.xsd",
+ "mgR003.xsd",
+ "mgR002.xsd",
+ "mgR001.xsd",
+ "mgQ021.xsd",
+ "mgQ013.xsd",
+ "mgQ012.xsd",
+ "mgQ011.xsd",
+ "mgQ010.xsd",
+ "mgQ005.xsd",
+ "mgQ004.xsd",
+ "mgQ001.xsd",
+ "mgQ017.xml",
+ "mgQ016.xml",
+ "mgQ015.xml",
+ "mgQ014.xml",
+ "mgQ002.xml"],[]}}.
+{particlesAB,{["particlesB015.xml",
+ "particlesB010.xml",
+ "particlesA013.xml",
+ "particlesA011.xml",
+ "particlesA010.xml",
+ "particlesA009.xml",
+ "particlesA007.xml",
+ "particlesA006.xml",
+ "particlesA005.xml"],[]}}.
+{particlesCDE,{["particlesEd001.xsd",
+ "particlesEc009.xsd",
+ "particlesEb015.xsd",
+ "particlesEa025.xsd",
+ "particlesEa024.xsd",
+ "particlesEa023.xsd",
+ "particlesEa022.xsd",
+ "particlesEc039.xml",
+ "particlesEc038.xml",
+ "particlesEc023.xml",
+ "particlesEc022.xml",
+ "particlesEc013.xml",
+ "particlesEc010.xml",
+ "particlesEc007.xml",
+ "particlesEc003.xml",
+ "particlesEb030.xml",
+ "particlesEb022.xml",
+ "particlesEb016.xml",
+ "particlesEb013.xml",
+ "particlesEb006.xml",
+ "particlesEa018.xml",
+ "particlesEa017.xml",
+ "particlesEa011.xml",
+ "particlesEa010.xml",
+ "particlesEa004.xml",
+ "particlesEa003.xml",
+ "particlesC039.xml",
+ "particlesC036.xml",
+ "particlesC035.xml",
+ "particlesC032.xml",
+ "particlesC031.xml",
+ "particlesC025.xml",
+ "particlesC024.xml",
+ "particlesC023.xml",
+ "particlesC022.xml",
+ "particlesC020.xml",
+ "particlesC019.xml",
+ "particlesC018.xml",
+ "particlesC017.xml",
+ "particlesC014.xml",
+ "particlesC013.xml",
+ "particlesC012.xml",
+ "particlesC010.xml",
+ "particlesC009.xml"],[]}}.
+{particlesFHI,{["particlesIk026.xsd",
+ "particlesIk024.xsd",
+ "particlesIk021.xsd",
+ "particlesIk019.xsd",
+ "particlesIk012.xsd",
+ "particlesIk007.xsd",
+ "particlesIk006.xsd",
+ "particlesIk005.xsd",
+ "particlesIk003.xsd",
+ "particlesIk002.xsd",
+ "particlesIj016.xsd",
+ "particlesIj015.xsd",
+ "particlesIj013.xsd",
+ "particlesIj011.xsd",
+ "particlesIj010.xsd",
+ "particlesIj009.xsd",
+ "particlesIj008.xsd",
+ "particlesIj007.xsd",
+ "particlesIj004.xsd",
+ "particlesIj003.xsd",
+ "particlesIh001.xsd",
+ "particlesIg016.xsd",
+ "particlesIg013.xsd",
+ "particlesIg010.xsd",
+ "particlesIg009.xsd",
+ "particlesIg008.xsd",
+ "particlesIg007.xsd",
+ "particlesIg004.xsd",
+ "particlesIf009.xsd",
+ "particlesIf008.xsd",
+ "particlesIf007.xsd",
+ "particlesIe014.xsd",
+ "particlesIe012.xsd",
+ "particlesIe009.xsd",
+ "particlesIe006.xsd",
+ "particlesId012.xsd",
+ "particlesId006.xsd",
+ "particlesId003.xsd",
+ "particlesIb007.xsd",
+ "particlesIb006.xsd",
+ "particlesIa008.xsd",
+ "particlesIa006.xsd",
+ "particlesHb011.xsd",
+ "particlesHb008.xsd",
+ "particlesHb004.xsd",
+ "particlesHb003.xsd",
+ "particlesHb001.xsd",
+ "particlesHa008.xsd",
+ "particlesHa007.xsd",
+ "particlesHa006.xsd",
+ "particlesHa005.xsd",
+ "particlesHa004.xsd",
+ "particlesHa003.xsd",
+ "particlesHa002.xsd",
+ "particlesFb006.xsd",
+ "particlesFb005.xsd",
+ "particlesFb004.xsd",
+ "particlesFb003.xsd",
+ "particlesFb002.xsd",
+ "particlesIk026.xml",
+ "particlesIk012.xml",
+ "particlesIf006.xml",
+ "particlesIf001.xml",
+ "particlesIe004.xml",
+ "particlesHa007.xml",
+ "particlesHa006.xml",
+ "particlesHa005.xml",
+ "particlesHa004.xml",
+ "particlesHa003.xml",
+ "particlesHa002.xml",
+ "particlesFb004.xml",
+ "particlesFb001.xml",
+ "particlesFa001.xml"],[]}}.
+{particlesJ,{["particlesJk015.xsd",
+ "particlesJk013.xsd",
+ "particlesJk011.xsd",
+ "particlesJk010.xsd",
+ "particlesJk008.xsd",
+ "particlesJk007.xsd",
+ "particlesJk005.xsd",
+ "particlesJk004.xsd",
+ "particlesJk003.xsd",
+ "particlesJk002.xsd",
+ "particlesJk001.xsd",
+ "particlesJj011.xsd",
+ "particlesJj010.xsd",
+ "particlesJj009.xsd",
+ "particlesJj008.xsd",
+ "particlesJj007.xsd",
+ "particlesJj005.xsd",
+ "particlesJj004.xsd",
+ "particlesJj002.xsd",
+ "particlesJj001.xsd",
+ "particlesJf016.xsd",
+ "particlesJf015.xsd",
+ "particlesJf013.xsd",
+ "particlesJf011.xsd",
+ "particlesJf010.xsd",
+ "particlesJf008.xsd",
+ "particlesJf007.xsd",
+ "particlesJf005.xsd",
+ "particlesJf004.xsd",
+ "particlesJf003.xsd",
+ "particlesJf002.xsd",
+ "particlesJf001.xsd",
+ "particlesJe011.xsd",
+ "particlesJe010.xsd",
+ "particlesJe009.xsd",
+ "particlesJe008.xsd",
+ "particlesJe007.xsd",
+ "particlesJe005.xsd",
+ "particlesJe004.xsd",
+ "particlesJe002.xsd",
+ "particlesJe001.xsd",
+ "particlesJd016.xsd",
+ "particlesJd015.xsd",
+ "particlesJd013.xsd",
+ "particlesJd011.xsd",
+ "particlesJd010.xsd",
+ "particlesJd008.xsd",
+ "particlesJd007.xsd",
+ "particlesJd005.xsd",
+ "particlesJd004.xsd",
+ "particlesJd003.xsd",
+ "particlesJd002.xsd",
+ "particlesJd001.xsd",
+ "particlesJc011.xsd",
+ "particlesJc010.xsd",
+ "particlesJc009.xsd",
+ "particlesJc008.xsd",
+ "particlesJc007.xsd",
+ "particlesJc005.xsd",
+ "particlesJc004.xsd",
+ "particlesJc002.xsd",
+ "particlesJc001.xsd",
+ "particlesJb016.xsd",
+ "particlesJb015.xsd",
+ "particlesJb013.xsd",
+ "particlesJb011.xsd",
+ "particlesJb010.xsd",
+ "particlesJb008.xsd",
+ "particlesJb007.xsd",
+ "particlesJb005.xsd",
+ "particlesJb004.xsd",
+ "particlesJb003.xsd",
+ "particlesJb002.xsd",
+ "particlesJb001.xsd",
+ "particlesJa011.xsd",
+ "particlesJa010.xsd",
+ "particlesJa009.xsd",
+ "particlesJa008.xsd",
+ "particlesJa007.xsd",
+ "particlesJa005.xsd",
+ "particlesJa004.xsd",
+ "particlesJa002.xsd",
+ "particlesJa001.xsd",
+ "particlesJk015.xml",
+ "particlesJk013.xml",
+ "particlesJk011.xml",
+ "particlesJk010.xml",
+ "particlesJk008.xml",
+ "particlesJk007.xml",
+ "particlesJk005.xml",
+ "particlesJk004.xml",
+ "particlesJk003.xml",
+ "particlesJk002.xml",
+ "particlesJk001.xml",
+ "particlesJj011.xml",
+ "particlesJj010.xml",
+ "particlesJj009.xml",
+ "particlesJj008.xml",
+ "particlesJj007.xml",
+ "particlesJj005.xml",
+ "particlesJj004.xml",
+ "particlesJj002.xml",
+ "particlesJj001.xml",
+ "particlesJf016.xml",
+ "particlesJf015.xml",
+ "particlesJf013.xml",
+ "particlesJf011.xml",
+ "particlesJf010.xml",
+ "particlesJf008.xml",
+ "particlesJf007.xml",
+ "particlesJf005.xml",
+ "particlesJf004.xml",
+ "particlesJf003.xml",
+ "particlesJf002.xml",
+ "particlesJf001.xml",
+ "particlesJe011.xml",
+ "particlesJe010.xml",
+ "particlesJe009.xml",
+ "particlesJe008.xml",
+ "particlesJe007.xml",
+ "particlesJe005.xml",
+ "particlesJe004.xml",
+ "particlesJe002.xml",
+ "particlesJe001.xml",
+ "particlesJd016.xml",
+ "particlesJd015.xml",
+ "particlesJd013.xml",
+ "particlesJd011.xml",
+ "particlesJd010.xml",
+ "particlesJd008.xml",
+ "particlesJd007.xml",
+ "particlesJd005.xml",
+ "particlesJd004.xml",
+ "particlesJd003.xml",
+ "particlesJd002.xml",
+ "particlesJd001.xml",
+ "particlesJc011.xml",
+ "particlesJc010.xml",
+ "particlesJc009.xml",
+ "particlesJc008.xml",
+ "particlesJc007.xml",
+ "particlesJc005.xml",
+ "particlesJc004.xml",
+ "particlesJc002.xml",
+ "particlesJc001.xml",
+ "particlesJb016.xml",
+ "particlesJb015.xml",
+ "particlesJb013.xml",
+ "particlesJb011.xml",
+ "particlesJb010.xml",
+ "particlesJb008.xml",
+ "particlesJb007.xml",
+ "particlesJb005.xml",
+ "particlesJb004.xml",
+ "particlesJb003.xml",
+ "particlesJb002.xml",
+ "particlesJb001.xml",
+ "particlesJa011.xml",
+ "particlesJa010.xml",
+ "particlesJa009.xml",
+ "particlesJa008.xml",
+ "particlesJa007.xml",
+ "particlesJa005.xml",
+ "particlesJa004.xml",
+ "particlesJa002.xml",
+ "particlesJa001.xml"],[]}}.
+{particlesKOSRTQUVW,{["particlesW015.xsd",
+ "particlesW013.xsd",
+ "particlesW010.xsd",
+ "particlesW007.xsd",
+ "particlesW005.xsd",
+ "particlesW002.xsd",
+ "particlesV015.xsd",
+ "particlesV014.xsd",
+ "particlesV013.xsd",
+ "particlesV012.xsd",
+ "particlesV011.xsd",
+ "particlesV010.xsd",
+ "particlesV009.xsd",
+ "particlesV008.xsd",
+ "particlesV007.xsd",
+ "particlesV006.xsd",
+ "particlesV003.xsd",
+ "particlesU007.xsd",
+ "particlesU005.xsd",
+ "particlesU004.xsd",
+ "particlesU003.xsd",
+ "particlesQ031.xsd",
+ "particlesQ028.xsd",
+ "particlesQ027.xsd",
+ "particlesQ026.xsd",
+ "particlesQ025.xsd",
+ "particlesQ023.xsd",
+ "particlesQ021.xsd",
+ "particlesQ018.xsd",
+ "particlesQ012.xsd",
+ "particlesQ008.xsd",
+ "particlesQ006.xsd",
+ "particlesT011.xsd",
+ "particlesT010.xsd",
+ "particlesT009.xsd",
+ "particlesT008.xsd",
+ "particlesT002.xsd",
+ "particlesR031.xsd",
+ "particlesR028.xsd",
+ "particlesR027.xsd",
+ "particlesR026.xsd",
+ "particlesR025.xsd",
+ "particlesR023.xsd",
+ "particlesR021.xsd",
+ "particlesR018.xsd",
+ "particlesR014.xsd",
+ "particlesR010.xsd",
+ "particlesR006.xsd",
+ "particlesS011.xsd",
+ "particlesS007.xsd",
+ "particlesS004.xsd",
+ "particlesS003.xsd",
+ "particlesS001.xsd",
+ "particlesOb058.xsd",
+ "particlesOb051.xsd",
+ "particlesOb050.xsd",
+ "particlesOb049.xsd",
+ "particlesOb046.xsd",
+ "particlesOb045.xsd",
+ "particlesOb044.xsd",
+ "particlesOb043.xsd",
+ "particlesOb041.xsd",
+ "particlesOb040.xsd",
+ "particlesOb039.xsd",
+ "particlesOb038.xsd",
+ "particlesOb037.xsd",
+ "particlesOb036.xsd",
+ "particlesOb035.xsd",
+ "particlesOb034.xsd",
+ "particlesOb033.xsd",
+ "particlesOb031.xsd",
+ "particlesOb030.xsd",
+ "particlesOb029.xsd",
+ "particlesOb028.xsd",
+ "particlesOb027.xsd",
+ "particlesOb026.xsd",
+ "particlesOb025.xsd",
+ "particlesOb024.xsd",
+ "particlesOb023.xsd",
+ "particlesOb021.xsd",
+ "particlesOb020.xsd",
+ "particlesOb019.xsd",
+ "particlesOb017.xsd",
+ "particlesOb016.xsd",
+ "particlesOb014.xsd",
+ "particlesOb011.xsd",
+ "particlesOb010.xsd",
+ "particlesOa015.xsd",
+ "particlesOa010.xsd",
+ "particlesOa009.xsd",
+ "particlesOa008.xsd",
+ "particlesOa007.xsd",
+ "particlesOa005.xsd",
+ "particlesOa004.xsd",
+ "particlesOa002.xsd",
+ "particlesK008.xsd",
+ "particlesK005.xsd",
+ "particlesK003.xsd",
+ "particlesK002.xsd",
+ "particlesK001.xsd",
+ "particlesV015.xml",
+ "particlesV014.xml",
+ "particlesV013.xml",
+ "particlesV012.xml",
+ "particlesV011.xml",
+ "particlesV010.xml",
+ "particlesV009.xml",
+ "particlesV008.xml",
+ "particlesV007.xml",
+ "particlesV006.xml",
+ "particlesV003.xml",
+ "particlesU007.xml",
+ "particlesU005.xml",
+ "particlesU004.xml",
+ "particlesU003.xml",
+ "particlesQ022.xml",
+ "particlesQ020.xml",
+ "particlesQ019.xml",
+ "particlesQ017.xml",
+ "particlesQ016.xml",
+ "particlesT003.xml",
+ "particlesR022.xml",
+ "particlesR019.xml",
+ "particlesR016.xml",
+ "particlesR011.xml",
+ "particlesS011.xml",
+ "particlesS007.xml",
+ "particlesS004.xml",
+ "particlesS003.xml",
+ "particlesS001.xml",
+ "particlesOb055.xml",
+ "particlesOb042.xml",
+ "particlesOb007.xml",
+ "particlesOb003.xml",
+ "particlesOa014.xml",
+ "particlesOa013.xml",
+ "particlesOa012.xml",
+ "particlesOa011.xml",
+ "particlesK008.xml",
+ "particlesK005.xml",
+ "particlesK003.xml",
+ "particlesK002.xml",
+ "particlesK001.xml"],[]}}.
+{stABCDE,{["stE016.xsd",
+ "stE015.xsd",
+ "stE014.xsd",
+ "stE012.xsd",
+ "stE008.xsd",
+ "stE005.xsd",
+ "stE004.xsd",
+ "stE003.xsd",
+ "stE002.xsd",
+ "stD020.xsd",
+ "stD018.xsd",
+ "stD017.xsd",
+ "stD016.xsd",
+ "stD010.xsd",
+ "stD009.xsd",
+ "stD005.xsd",
+ "stD004.xsd",
+ "stD003.xsd",
+ "stD002.xsd",
+ "stC032.xsd",
+ "stC029.xsd",
+ "stC009.xsd",
+ "stC008.xsd",
+ "stC007.xsd",
+ "stC006.xsd",
+ "stC003.xsd",
+ "stB024.xsd",
+ "stB023.xsd",
+ "stB022.xsd",
+ "stB021.xsd",
+ "stB020.xsd",
+ "stB019.xsd",
+ "stB018.xsd",
+ "stB017.xsd",
+ "stB016.xsd",
+ "stB014.xsd",
+ "stB013.xsd",
+ "stB010.xsd",
+ "stB009.xsd",
+ "stB004.xsd",
+ "stB002.xsd",
+ "stB001.xsd",
+ "stA017.xsd",
+ "stA015.xsd",
+ "stA014.xsd",
+ "stA013.xsd",
+ "stA012.xsd",
+ "stA011.xsd",
+ "stA010.xsd",
+ "stA009.xsd",
+ "stA008.xsd",
+ "stA005.xsd",
+ "stA004.xsd",
+ "stA003.xsd",
+ "stA002.xsd"],[]}}.
+{stFGH,{["stH002.xsd",
+ "stH001.xsd",
+ "stG005.xsd",
+ "stG004.xsd",
+ "stF037.xsd",
+ "stF035.xsd",
+ "stF033.xsd",
+ "stF031.xsd",
+ "stF027.xsd",
+ "stF026.xsd",
+ "stF025.xsd",
+ "stF024.xsd",
+ "stF020.xsd",
+ "stF019.xsd",
+ "stF018.xsd",
+ "stF012.xsd",
+ "stF011.xsd",
+ "stF010.xsd",
+ "stF009.xsd",
+ "stH007.xml",
+ "stH005.xml",
+ "stH003.xml",
+ "stH001.xml",
+ "stG012.xml",
+ "stG010.xml",
+ "stG008.xml",
+ "stG006.xml",
+ "stG004.xml",
+ "stG002.xml",
+ "stG001.xml"],[]}}.
+{stIJK,{["stK014.xsd",
+ "stK013.xsd",
+ "stK012.xsd",
+ "stK011.xsd",
+ "stK007.xsd",
+ "stK006.xsd",
+ "stK005.xsd",
+ "stJ019.xsd",
+ "stJ013.xsd",
+ "stJ012.xsd",
+ "stJ011.xsd",
+ "stJ010.xsd",
+ "stJ002.xsd",
+ "stI005.xsd"],[]}}.
+{stZ,{["stZ003.xsd","stZ002.xsd"],[]}}.
+{wildABCDEF,{["wildF018.xsd",
+ "wildF016.xsd",
+ "wildF015.xsd",
+ "wildF014.xsd",
+ "wildF013.xsd",
+ "wildF012.xsd",
+ "wildF010.xsd",
+ "wildF009.xsd",
+ "wildF008.xsd",
+ "wildF007.xsd",
+ "wildF006.xsd",
+ "wildE002.xsd",
+ "wildD079.xsd",
+ "wildD078.xsd",
+ "wildD077.xsd",
+ "wildD076.xsd",
+ "wildD075.xsd",
+ "wildD071.xsd",
+ "wildC067.xsd",
+ "wildC066.xsd",
+ "wildC058.xsd",
+ "wildC057.xsd",
+ "wildC056.xsd",
+ "wildC055.xsd",
+ "wildC053.xsd",
+ "wildC052.xsd",
+ "wildC051.xsd",
+ "wildC050.xsd",
+ "wildC049.xsd",
+ "wildC036.xsd",
+ "wildC035.xsd",
+ "wildB028.xsd",
+ "wildB027.xsd",
+ "wildB023.xsd",
+ "wildB020.xsd",
+ "wildB015.xsd",
+ "wildA008.xsd",
+ "wildA007.xsd",
+ "wildA006.xsd",
+ "wildA005.xsd",
+ "wildA004.xsd",
+ "wildA003.xsd"],[]}}.
+{wildGHI,{["wildI013.xsd",
+ "wildI010.xsd",
+ "wildI009.xsd",
+ "wildI008.xsd",
+ "wildI003.xsd",
+ "wildI002.xsd",
+ "wildI007.xml",
+ "wildH006.xml",
+ "wildH002.xml",
+ "wildG039.xml",
+ "wildG037.xml",
+ "wildG036.xml",
+ "wildG032.xml",
+ "wildG029.xml",
+ "wildG028.xml",
+ "wildG024.xml",
+ "wildG022.xml",
+ "wildG020.xml",
+ "wildG019.xml",
+ "wildG014.xml",
+ "wildG013.xml",
+ "wildG011.xml",
+ "wildG010.xml",
+ "wildG009.xml",
+ "wildG008.xml",
+ "wildG005.xml",
+ "wildG004.xml",
+ "wildG002.xml"],[]}}.
+{wildJKLMNQOP,{["wildQ004.xsd",
+ "wildQ003.xsd",
+ "wildQ002.xsd",
+ "wildQ001.xsd",
+ "wildN018.xsd",
+ "wildN016.xsd",
+ "wildN015.xsd",
+ "wildN014.xsd",
+ "wildN013.xsd",
+ "wildN012.xsd",
+ "wildN010.xsd",
+ "wildN009.xsd",
+ "wildN008.xsd",
+ "wildN007.xsd",
+ "wildN006.xsd",
+ "wildN001.xsd",
+ "wildM002.xsd",
+ "wildL009.xsd",
+ "wildL008.xsd",
+ "wildL007.xsd",
+ "wildL006.xsd",
+ "wildL005.xsd",
+ "wildL001.xsd",
+ "wildK038.xsd",
+ "wildK029.xsd",
+ "wildK028.xsd",
+ "wildK027.xsd",
+ "wildK026.xsd",
+ "wildK024.xsd",
+ "wildK023.xsd",
+ "wildK022.xsd",
+ "wildK021.xsd",
+ "wildK020.xsd",
+ "wildK007.xsd",
+ "wildK006.xsd",
+ "wildK002.xsd",
+ "wildJ008.xsd",
+ "wildJ007.xsd",
+ "wildJ006.xsd",
+ "wildJ005.xsd",
+ "wildJ004.xsd",
+ "wildJ003.xsd",
+ "wildP006.xml",
+ "wildP005.xml",
+ "wildP004.xml",
+ "wildP003.xml",
+ "wildP001.xml",
+ "wildO040.xml",
+ "wildO038.xml",
+ "wildO037.xml",
+ "wildO033.xml",
+ "wildO031.xml",
+ "wildO030.xml",
+ "wildO027.xml",
+ "wildO026.xml",
+ "wildO023.xml",
+ "wildO021.xml",
+ "wildO020.xml",
+ "wildO018.xml",
+ "wildO013.xml",
+ "wildO012.xml",
+ "wildO010.xml",
+ "wildO007.xml",
+ "wildO006.xml",
+ "wildO004.xml"],[]}}.
diff --git a/lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE_data/msxsdtest.tar.gz b/lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE_data/msxsdtest.tar.gz
new file mode 100644
index 0000000000..05f9dfe08f
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE_data/msxsdtest.tar.gz
Binary files differ
diff --git a/lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE_data/w3c-copyright-19990405.html b/lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE_data/w3c-copyright-19990405.html
new file mode 100644
index 0000000000..5c89ffd95e
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE_data/w3c-copyright-19990405.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head>
+
+
+ <meta http-equiv="Content-Type" content="text/html"><title>DOCUMENT NOTICE</title>
+
+ <link rel="stylesheet" type="text/css" href="copyright-documents-19990405_files/base.css"></head><body bgcolor="#ffffff" text="#000000">
+<h1>W3C<sup>�</sup> DOCUMENT NOTICE AND LICENSE</h1>
+
+<h3>Copyright � 1994-2002 <a href="http://www.w3.org/">World Wide Web
+Consortium</a>, (<a href="http://www.lcs.mit.edu/">Massachusetts Institute of
+Technology</a>, <a href="http://www.inria.fr/">Institut National de Recherche
+en Informatique et en Automatique</a>, <a href="http://www.keio.ac.jp/">Keio
+University</a>). All Rights Reserved.<br>
+http://www.w3.org/Consortium/Legal/</h3>
+
+<p>Public documents on the W3C site are provided by the copyright holders
+under the following license. The software or Document Type Definitions (DTDs)
+associated with W3C specifications are governed by the <a href="http://www.w3.org/Consortium/Legal/copyright-software.html"> Software
+Notice</a>. By using and/or copying this document, or the W3C document from
+which this statement is linked, you (the licensee) agree that you have read,
+understood, and will comply with the following terms and conditions:</p>
+
+<p>Permission to use, copy, and distribute the contents of this document, or
+the W3C document from which this statement is linked, in any medium for any
+purpose and without fee or royalty is hereby granted, provided that you
+include the following on <i>ALL</i> copies of the document, or portions
+thereof, that you use:</p>
+<ol>
+ <li>A link or URL to the original W3C document.</li>
+ <li>The pre-existing copyright notice of the original author, or if it
+ doesn't exist, a notice of the form: "Copyright � [$date-of-document] <a href="http://www.w3.org/">World Wide Web Consortium</a>, (<a href="http://www.lcs.mit.edu/">Massachusetts Institute of Technology</a>,
+ <a href="http://www.inria.fr/"> Institut National de Recherche en
+ Informatique et en Automatique</a>, <a href="http://www.keio.ac.jp/">Keio
+ University</a>). All Rights Reserved.
+ http://www.w3.org/Consortium/Legal/" (Hypertext is preferred, but a
+ textual representation is permitted.)</li>
+ <li><em>If it exists</em>, the STATUS of the W3C document.</li>
+</ol>
+
+<p>When space permits, inclusion of the full text of this <b> NOTICE</b>
+should be provided. We request that authorship attribution be provided in any
+software, documents, or other items or products that you create pursuant to
+the implementation of the contents of this document, or any portion
+thereof.</p>
+
+<p>No right to create modifications or derivatives of W3C documents is
+granted pursuant to this license. However, if additional requirements
+(documented in the <a href="http://www.w3.org/Consortium/Legal/IPR-FAQ.html">Copyright FAQ</a>) are satisfied,
+the right to create modifications or derivatives is&nbsp;sometimes granted by the
+W3C to individuals complying with those requirements.</p>
+
+<p>THIS DOCUMENT IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO
+REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED
+TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+NON-INFRINGEMENT, OR TITLE; THAT THE CONTENTS OF THE DOCUMENT ARE SUITABLE
+FOR ANY PURPOSE; NOR THAT THE IMPLEMENTATION OF SUCH CONTENTS WILL NOT
+INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.</p>
+
+<p>COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE DOCUMENT OR THE
+PERFORMANCE OR IMPLEMENTATION OF THE CONTENTS THEREOF.</p>
+
+<p>The name and trademarks of copyright holders may NOT be used in
+advertising or publicity pertaining to this document or its contents without
+specific, written prior permission. Title to copyright in this document will
+at all times remain with copyright holders.</p>
+
+<p>----------------------------------------------------------------------------</p>
+
+<p>This formulation of W3C's notice and license became active on April 05
+1999 so as to account for the treatment of DTDs, schema's and bindings. See
+the <a href="http://www.w3.org/Consortium/Legal/copyright-documents-19990218.html"> older formulation</a> for
+the policy prior to this date. Please see our <a href="http://www.w3.org/Consortium/Legal/IPR-FAQ.html">Copyright FAQ</a> for common questions about using
+materials from our site, including specific terms and conditions for packages
+like libwww, Amaya, and Jigsaw. Other questions about this notice can be
+directed to <a href="mailto:[email protected]">[email protected]</a>.</p>
+<address>
+ <a href="http://w3.org/Help/Webmaster.html">webmaster</a><br>
+ (last updated by reagle on 1999/04/99.)
+</address>
+</body></html> \ No newline at end of file
diff --git a/lib/xmerl/test/xmerl_xsd_NIST2002-01-16_SUITE.erl b/lib/xmerl/test/xmerl_xsd_NIST2002-01-16_SUITE.erl
new file mode 100644
index 0000000000..daebf1393d
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_NIST2002-01-16_SUITE.erl
@@ -0,0 +1,15962 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2006-2010. 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%
+%%
+%%
+%%% Purpose : Test suite for the xmerl application
+
+%% Do NOT edit this file. It is generated by the generate_xsd_suite module
+%% For more info read the comments in the header of that file.
+
+-module('xmerl_xsd_NIST2002-01-16_SUITE').
+
+-compile(export_all).
+
+-include_lib("test_server/include/test_server.hrl").
+-include_lib("xmerl/include/xmerl.hrl").
+-include_lib("xmerl/include/xmerl_xsd.hrl").
+
+
+all() ->
+ ['NISTSchema-anyURI', 'NISTSchema-base64Binary',
+ 'NISTSchema-boolean', 'NISTSchema-byte',
+ 'NISTSchema-date-', 'NISTSchema-dateTime',
+ 'NISTSchema-decimal', 'NISTSchema-double',
+ 'NISTSchema-duration', 'NISTSchema-float',
+ 'NISTSchema-gDay', 'NISTSchema-gMonth-',
+ 'NISTSchema-gMonthDay', 'NISTSchema-gYear-',
+ 'NISTSchema-gYearMonth', 'NISTSchema-hexBinary',
+ 'NISTSchema-ID', 'NISTSchema-int-',
+ 'NISTSchema-integer', 'NISTSchema-language',
+ 'NISTSchema-long', 'NISTSchema-Name',
+ 'NISTSchema-NCName', 'NISTSchema-negativeInteger',
+ 'NISTSchema-NMTOKEN', 'NISTSchema-nonNegativeInteger',
+ 'NISTSchema-nonPositiveInteger',
+ 'NISTSchema-normalizedString',
+ 'NISTSchema-positiveInteger', 'NISTSchema-QName',
+ 'NISTSchema-short', 'NISTSchema-string',
+ 'NISTSchema-time', 'NISTSchema-token',
+ 'NISTSchema-unsignedByte', 'NISTSchema-unsignedInt',
+ 'NISTSchema-unsignedLong', 'NISTSchema-unsignedShort'].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+
+%% initialization before the test suite
+init_per_suite(Config) ->
+ Dog=test_server:timetrap({minutes,10}),
+ xmerl_xsd_lib:unpack(Config,nist),
+ {ok,LogFile} = xmerl_xsd_lib:create_error_log_file(Config,nist),
+ test_server:timetrap_cancel(Dog),
+ [{suite,nist},{xmerl_error_log,LogFile}|Config].
+
+end_per_suite(Config) ->
+ xmerl_xsd_lib:rmdir(Config,nist),
+ xmerl_xsd_lib:close_error_log_file(Config),
+ ok.
+
+%% initialization before each testcase
+init_per_testcase(TestCase,Config) ->
+ Dog=test_server:timetrap({minutes,3}),
+ [{testcase,TestCase},{watchdog, Dog}|Config].
+
+%% clean up after each testcase
+end_per_testcase(_Func,Config) ->
+ Dog=?config(watchdog, Config),
+ test_server:timetrap_cancel(Dog),
+ ok.
+
+%% Data type derived by restriction of anyURI by facets
+
+'NISTSchema-anyURI'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./NISTTestsAll/NISTSchema-anyURI-maxLength-1.xsd','./NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-maxLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-maxLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-maxLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-maxLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-5-2.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-5-3.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-5-4.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-maxLength-5-5.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-minLength-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList30 = [ITRes29|ITResList29],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-minLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList35 = [ITRes34|ITResList34],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-minLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList40 = [ITRes39|ITResList39],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-minLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList42 = [ITRes41|ITResList41],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList43 = [ITRes42|ITResList42],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList44 = [ITRes43|ITResList43],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-minLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-5-2.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-5-3.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-5-4.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList48 = [ITRes47|ITResList47],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-minLength-5-5.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList49 = [ITRes48|ITResList48],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-length-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-1-2.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-1-3.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-1-4.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList53 = [ITRes52|ITResList52],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-1-5.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList54 = [ITRes53|ITResList53],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-length-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList58 = [ITRes57|ITResList57],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList59 = [ITRes58|ITResList58],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-length-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList63 = [ITRes62|ITResList62],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-length-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-length-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-length-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-anyURI-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-anyURI-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList26,ITResList129).
+
+%% Data type derived by restriction of base64binary by facets
+
+'NISTSchema-base64Binary'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-maxLength-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-maxLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-maxLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-maxLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-maxLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-5-2.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-5-3.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-5-4.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-maxLength-5-5.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-minLength-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList30 = [ITRes29|ITResList29],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-minLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList35 = [ITRes34|ITResList34],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-minLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList40 = [ITRes39|ITResList39],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-minLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList42 = [ITRes41|ITResList41],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList43 = [ITRes42|ITResList42],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList45 = [ITRes44|ITResList44],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-minLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-5-2.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-5-3.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList48 = [ITRes47|ITResList47],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-5-4.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-minLength-5-5.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList50 = [ITRes49|ITResList49],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-length-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-1-2.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-1-3.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList53 = [ITRes52|ITResList52],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-1-4.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-1-5.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList55 = [ITRes54|ITResList54],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-length-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList58 = [ITRes57|ITResList57],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList60 = [ITRes59|ITResList59],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-length-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList63 = [ITRes62|ITResList62],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList64 = [ITRes63|ITResList63],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList65 = [ITRes64|ITResList64],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-length-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList69 = [ITRes68|ITResList68],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList70 = [ITRes69|ITResList69],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-length-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList74 = [ITRes73|ITResList73],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-length-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList75 = [ITRes74|ITResList74],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList79 = [ITRes78|ITResList78],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList80 = [ITRes79|ITResList79],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList84 = [ITRes83|ITResList83],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList85 = [ITRes84|ITResList84],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList89 = [ITRes88|ITResList88],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList90 = [ITRes89|ITResList89],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList94 = [ITRes93|ITResList93],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList95 = [ITRes94|ITResList94],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList99 = [ITRes98|ITResList98],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList100 = [ITRes99|ITResList99],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList104 = [ITRes103|ITResList103],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList105 = [ITRes104|ITResList104],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList109 = [ITRes108|ITResList108],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList110 = [ITRes109|ITResList109],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList114 = [ITRes113|ITResList113],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList115 = [ITRes114|ITResList114],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList119 = [ITRes118|ITResList118],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList120 = [ITRes119|ITResList119],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList124 = [ITRes123|ITResList123],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList125 = [ITRes124|ITResList124],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-base64Binary-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList129 = [ITRes128|ITResList128],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-base64Binary-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList130 = [ITRes129|ITResList129],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList26,ITResList130).
+
+%% Data type derived by restriction of boolean by facets
+
+'NISTSchema-boolean'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-boolean-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-boolean-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-boolean-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-boolean-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-boolean-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-boolean-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-boolean-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-boolean-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-boolean-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-boolean-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList5 = [ITRes4|ITResList4],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-boolean-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-boolean-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-boolean-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-boolean-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList5,ITResList9).
+
+%% Data type derived by restriction of byte by facets
+
+'NISTSchema-byte'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-fractionDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-fractionDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-fractionDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-fractionDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-fractionDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-fractionDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-totalDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-totalDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-totalDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-totalDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-totalDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-totalDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-totalDigits-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-totalDigits-2-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-totalDigits-2-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-totalDigits-2-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-totalDigits-2-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-totalDigits-2-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-totalDigits-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-totalDigits-3-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-totalDigits-3-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-totalDigits-3-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-totalDigits-3-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-totalDigits-3-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList136 = [ITRes135|ITResList135],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList137 = [ITRes136|ITResList136],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList138 = [ITRes137|ITResList137],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ ?line {STRes31,S31} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList32 = [STRes31|STResList31],
+ ?line ITRes139 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList140 = [ITRes139|ITResList139],
+ ?line ITRes140 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList141 = [ITRes140|ITResList140],
+ ?line ITRes141 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList142 = [ITRes141|ITResList141],
+ ?line ITRes142 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList143 = [ITRes142|ITResList142],
+ ?line ITRes143 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList144 = [ITRes143|ITResList143],
+
+
+ ?line {STRes32,S32} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList33 = [STRes32|STResList32],
+ ?line ITRes144 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList145 = [ITRes144|ITResList144],
+ ?line ITRes145 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList146 = [ITRes145|ITResList145],
+ ?line ITRes146 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList147 = [ITRes146|ITResList146],
+ ?line ITRes147 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList148 = [ITRes147|ITResList147],
+ ?line ITRes148 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList149 = [ITRes148|ITResList148],
+
+
+ ?line {STRes33,S33} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList34 = [STRes33|STResList33],
+ ?line ITRes149 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList150 = [ITRes149|ITResList149],
+ ?line ITRes150 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList151 = [ITRes150|ITResList150],
+ ?line ITRes151 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList152 = [ITRes151|ITResList151],
+ ?line ITRes152 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList153 = [ITRes152|ITResList152],
+ ?line ITRes153 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList154 = [ITRes153|ITResList153],
+
+
+ ?line {STRes34,S34} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-byte-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList35 = [STRes34|STResList34],
+ ?line ITRes154 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList155 = [ITRes154|ITResList154],
+ ?line ITRes155 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList156 = [ITRes155|ITResList155],
+ ?line ITRes156 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList157 = [ITRes156|ITResList156],
+ ?line ITRes157 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList158 = [ITRes157|ITResList157],
+ ?line ITRes158 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-byte-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList159 = [ITRes158|ITResList158],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList35,ITResList159).
+
+%% Data type derived by restriction of date by facets
+
+'NISTSchema-date-'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-date-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList136 = [ITRes135|ITResList135],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList137 = [ITRes136|ITResList136],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList138 = [ITRes137|ITResList137],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-date-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList31,ITResList139).
+
+%% Data type derived by restriction of dateTime by facets
+
+'NISTSchema-dateTime'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-dateTime-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList136 = [ITRes135|ITResList135],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList137 = [ITRes136|ITResList136],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList138 = [ITRes137|ITResList137],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-dateTime-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList31,ITResList139).
+
+%% Data type derived by restriction of decimal by facets
+
+'NISTSchema-decimal'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-fractionDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-fractionDigits-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-fractionDigits-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-fractionDigits-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-4-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-4-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-fractionDigits-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-fractionDigits-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-totalDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-totalDigits-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-2-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-2-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-2-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-2-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-2-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-totalDigits-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-3-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-3-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-3-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-3-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-3-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-totalDigits-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-4-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-4-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-4-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-4-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-4-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-totalDigits-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-5-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-5-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-5-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-5-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-totalDigits-5-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList136 = [ITRes135|ITResList135],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList137 = [ITRes136|ITResList136],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList138 = [ITRes137|ITResList137],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ ?line {STRes31,S31} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList32 = [STRes31|STResList31],
+ ?line ITRes139 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList140 = [ITRes139|ITResList139],
+ ?line ITRes140 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList141 = [ITRes140|ITResList140],
+ ?line ITRes141 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList142 = [ITRes141|ITResList141],
+ ?line ITRes142 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList143 = [ITRes142|ITResList142],
+ ?line ITRes143 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList144 = [ITRes143|ITResList143],
+
+
+ ?line {STRes32,S32} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList33 = [STRes32|STResList32],
+ ?line ITRes144 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList145 = [ITRes144|ITResList144],
+ ?line ITRes145 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList146 = [ITRes145|ITResList145],
+ ?line ITRes146 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList147 = [ITRes146|ITResList146],
+ ?line ITRes147 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList148 = [ITRes147|ITResList147],
+ ?line ITRes148 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList149 = [ITRes148|ITResList148],
+
+
+ ?line {STRes33,S33} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList34 = [STRes33|STResList33],
+ ?line ITRes149 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList150 = [ITRes149|ITResList149],
+ ?line ITRes150 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList151 = [ITRes150|ITResList150],
+ ?line ITRes151 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList152 = [ITRes151|ITResList151],
+ ?line ITRes152 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList153 = [ITRes152|ITResList152],
+ ?line ITRes153 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList154 = [ITRes153|ITResList153],
+
+
+ ?line {STRes34,S34} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList35 = [STRes34|STResList34],
+ ?line ITRes154 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList155 = [ITRes154|ITResList154],
+ ?line ITRes155 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList156 = [ITRes155|ITResList155],
+ ?line ITRes156 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList157 = [ITRes156|ITResList156],
+ ?line ITRes157 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList158 = [ITRes157|ITResList157],
+ ?line ITRes158 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList159 = [ITRes158|ITResList158],
+
+
+ ?line {STRes35,S35} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList36 = [STRes35|STResList35],
+ ?line ITRes159 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList160 = [ITRes159|ITResList159],
+ ?line ITRes160 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList161 = [ITRes160|ITResList160],
+ ?line ITRes161 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList162 = [ITRes161|ITResList161],
+ ?line ITRes162 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList163 = [ITRes162|ITResList162],
+ ?line ITRes163 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList164 = [ITRes163|ITResList163],
+
+
+ ?line {STRes36,S36} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList37 = [STRes36|STResList36],
+ ?line ITRes164 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList165 = [ITRes164|ITResList164],
+ ?line ITRes165 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList166 = [ITRes165|ITResList165],
+ ?line ITRes166 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList167 = [ITRes166|ITResList166],
+ ?line ITRes167 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList168 = [ITRes167|ITResList167],
+ ?line ITRes168 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList169 = [ITRes168|ITResList168],
+
+
+ ?line {STRes37,S37} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList38 = [STRes37|STResList37],
+ ?line ITRes169 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S37),
+ ITResList170 = [ITRes169|ITResList169],
+ ?line ITRes170 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S37),
+ ITResList171 = [ITRes170|ITResList170],
+ ?line ITRes171 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S37),
+ ITResList172 = [ITRes171|ITResList171],
+ ?line ITRes172 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S37),
+ ITResList173 = [ITRes172|ITResList172],
+ ?line ITRes173 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S37),
+ ITResList174 = [ITRes173|ITResList173],
+
+
+ ?line {STRes38,S38} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList39 = [STRes38|STResList38],
+ ?line ITRes174 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S38),
+ ITResList175 = [ITRes174|ITResList174],
+ ?line ITRes175 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S38),
+ ITResList176 = [ITRes175|ITResList175],
+ ?line ITRes176 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S38),
+ ITResList177 = [ITRes176|ITResList176],
+ ?line ITRes177 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S38),
+ ITResList178 = [ITRes177|ITResList177],
+ ?line ITRes178 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S38),
+ ITResList179 = [ITRes178|ITResList178],
+
+
+ ?line {STRes39,S39} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList40 = [STRes39|STResList39],
+ ?line ITRes179 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S39),
+ ITResList180 = [ITRes179|ITResList179],
+ ?line ITRes180 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S39),
+ ITResList181 = [ITRes180|ITResList180],
+ ?line ITRes181 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S39),
+ ITResList182 = [ITRes181|ITResList181],
+ ?line ITRes182 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S39),
+ ITResList183 = [ITRes182|ITResList182],
+ ?line ITRes183 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S39),
+ ITResList184 = [ITRes183|ITResList183],
+
+
+ ?line {STRes40,S40} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-decimal-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList41 = [STRes40|STResList40],
+ ?line ITRes184 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S40),
+ ITResList185 = [ITRes184|ITResList184],
+ ?line ITRes185 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S40),
+ ITResList186 = [ITRes185|ITResList185],
+ ?line ITRes186 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S40),
+ ITResList187 = [ITRes186|ITResList186],
+ ?line ITRes187 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S40),
+ ITResList188 = [ITRes187|ITResList187],
+ ?line ITRes188 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-decimal-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S40),
+ ITResList189 = [ITRes188|ITResList188],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList41,ITResList189).
+
+%% Data type derived by restriction of double by facets
+
+'NISTSchema-double'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-double-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList136 = [ITRes135|ITResList135],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList137 = [ITRes136|ITResList136],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList138 = [ITRes137|ITResList137],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-double-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList31,ITResList139).
+
+%% Data type derived by restriction of duration by facets
+
+'NISTSchema-duration'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-duration-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList136 = [ITRes135|ITResList135],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList137 = [ITRes136|ITResList136],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList138 = [ITRes137|ITResList137],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-duration-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList31,ITResList139).
+
+%% Data type derived by restriction of float by facets
+
+'NISTSchema-float'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-float-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList136 = [ITRes135|ITResList135],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList137 = [ITRes136|ITResList136],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList138 = [ITRes137|ITResList137],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-float-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList31,ITResList139).
+
+%% Data type derived by restriction of gDay by facets
+
+'NISTSchema-gDay'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList79 = [ITRes78|ITResList78],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList84 = [ITRes83|ITResList83],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList89 = [ITRes88|ITResList88],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList94 = [ITRes93|ITResList93],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList99 = [ITRes98|ITResList98],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList104 = [ITRes103|ITResList103],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList109 = [ITRes108|ITResList108],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList114 = [ITRes113|ITResList113],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList119 = [ITRes118|ITResList118],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList124 = [ITRes123|ITResList123],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList129 = [ITRes128|ITResList128],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gDay-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList134 = [ITRes133|ITResList133],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gDay-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList31,ITResList135).
+
+%% Data type derived by restriction of gMonth by facets
+
+'NISTSchema-gMonth-'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonth-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList136 = [ITRes135|ITResList135],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList137 = [ITRes136|ITResList136],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList138 = [ITRes137|ITResList137],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonth-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList31,ITResList139).
+
+%% Data type derived by restriction of gMonthDay by facets
+
+'NISTSchema-gMonthDay'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gMonthDay-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList136 = [ITRes135|ITResList135],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList137 = [ITRes136|ITResList136],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList138 = [ITRes137|ITResList137],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gMonthDay-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList31,ITResList139).
+
+%% Data type derived by restriction of gYear by facets
+
+'NISTSchema-gYear-'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList69 = [ITRes68|ITResList68],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList74 = [ITRes73|ITResList73],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList79 = [ITRes78|ITResList78],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList84 = [ITRes83|ITResList83],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList89 = [ITRes88|ITResList88],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList94 = [ITRes93|ITResList93],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList99 = [ITRes98|ITResList98],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList104 = [ITRes103|ITResList103],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList109 = [ITRes108|ITResList108],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList114 = [ITRes113|ITResList113],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList119 = [ITRes118|ITResList118],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList124 = [ITRes123|ITResList123],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList129 = [ITRes128|ITResList128],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYear-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList134 = [ITRes133|ITResList133],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYear-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList31,ITResList135).
+
+%% Data type derived by restriction of gYearMonth by facets
+
+'NISTSchema-gYearMonth'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-gYearMonth-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList136 = [ITRes135|ITResList135],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList137 = [ITRes136|ITResList136],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList138 = [ITRes137|ITResList137],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-gYearMonth-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList31,ITResList139).
+
+%% Data type derived by restriction of hexBinary by facets
+
+'NISTSchema-hexBinary'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-maxLength-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-maxLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-maxLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-maxLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-maxLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-5-2.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-5-3.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-5-4.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-maxLength-5-5.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-minLength-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList30 = [ITRes29|ITResList29],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-minLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList35 = [ITRes34|ITResList34],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-minLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList40 = [ITRes39|ITResList39],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-minLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList42 = [ITRes41|ITResList41],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList43 = [ITRes42|ITResList42],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList45 = [ITRes44|ITResList44],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-minLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-5-2.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-5-3.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList48 = [ITRes47|ITResList47],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-5-4.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-minLength-5-5.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList50 = [ITRes49|ITResList49],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-length-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-1-2.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-1-3.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList53 = [ITRes52|ITResList52],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-1-4.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-1-5.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList55 = [ITRes54|ITResList54],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-length-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList58 = [ITRes57|ITResList57],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList60 = [ITRes59|ITResList59],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-length-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList63 = [ITRes62|ITResList62],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList64 = [ITRes63|ITResList63],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList65 = [ITRes64|ITResList64],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-length-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList69 = [ITRes68|ITResList68],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList70 = [ITRes69|ITResList69],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-length-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList74 = [ITRes73|ITResList73],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-length-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList75 = [ITRes74|ITResList74],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList79 = [ITRes78|ITResList78],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList80 = [ITRes79|ITResList79],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList84 = [ITRes83|ITResList83],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList85 = [ITRes84|ITResList84],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList89 = [ITRes88|ITResList88],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList90 = [ITRes89|ITResList89],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList94 = [ITRes93|ITResList93],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList95 = [ITRes94|ITResList94],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList99 = [ITRes98|ITResList98],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList100 = [ITRes99|ITResList99],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList104 = [ITRes103|ITResList103],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList105 = [ITRes104|ITResList104],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList109 = [ITRes108|ITResList108],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList110 = [ITRes109|ITResList109],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList114 = [ITRes113|ITResList113],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList115 = [ITRes114|ITResList114],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList119 = [ITRes118|ITResList118],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList120 = [ITRes119|ITResList119],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList124 = [ITRes123|ITResList123],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList125 = [ITRes124|ITResList124],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-hexBinary-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList129 = [ITRes128|ITResList128],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-hexBinary-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList130 = [ITRes129|ITResList129],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList26,ITResList130).
+
+%% Data type derived by restriction of ID by facets
+
+'NISTSchema-ID'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-maxLength-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-maxLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-maxLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-maxLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-maxLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-5-2.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-5-3.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-5-4.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-maxLength-5-5.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-minLength-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList30 = [ITRes29|ITResList29],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-minLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList35 = [ITRes34|ITResList34],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-minLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList40 = [ITRes39|ITResList39],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-minLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList42 = [ITRes41|ITResList41],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList43 = [ITRes42|ITResList42],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList45 = [ITRes44|ITResList44],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-minLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-5-2.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-5-3.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList48 = [ITRes47|ITResList47],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-5-4.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-minLength-5-5.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList50 = [ITRes49|ITResList49],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-length-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-1-2.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-1-3.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList53 = [ITRes52|ITResList52],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-1-4.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-1-5.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList55 = [ITRes54|ITResList54],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-length-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList58 = [ITRes57|ITResList57],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList60 = [ITRes59|ITResList59],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-length-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList63 = [ITRes62|ITResList62],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList64 = [ITRes63|ITResList63],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList65 = [ITRes64|ITResList64],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-length-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList69 = [ITRes68|ITResList68],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList70 = [ITRes69|ITResList69],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-length-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList74 = [ITRes73|ITResList73],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-length-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList75 = [ITRes74|ITResList74],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList79 = [ITRes78|ITResList78],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList80 = [ITRes79|ITResList79],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList84 = [ITRes83|ITResList83],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList85 = [ITRes84|ITResList84],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList89 = [ITRes88|ITResList88],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList90 = [ITRes89|ITResList89],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList94 = [ITRes93|ITResList93],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList95 = [ITRes94|ITResList94],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList99 = [ITRes98|ITResList98],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList100 = [ITRes99|ITResList99],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList104 = [ITRes103|ITResList103],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList105 = [ITRes104|ITResList104],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList109 = [ITRes108|ITResList108],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList110 = [ITRes109|ITResList109],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList114 = [ITRes113|ITResList113],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList115 = [ITRes114|ITResList114],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList119 = [ITRes118|ITResList118],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList120 = [ITRes119|ITResList119],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList124 = [ITRes123|ITResList123],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList125 = [ITRes124|ITResList124],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-ID-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList129 = [ITRes128|ITResList128],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-ID-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList130 = [ITRes129|ITResList129],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList26,ITResList130).
+
+%% Data type derived by restriction of int by facets
+
+'NISTSchema-int-'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-fractionDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-fractionDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-fractionDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-fractionDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-fractionDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-fractionDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-totalDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-totalDigits-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-2-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-2-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-2-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-2-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-2-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-totalDigits-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-3-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-3-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-3-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-3-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-3-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-totalDigits-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-4-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-4-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-4-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-4-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-4-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-totalDigits-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-5-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-5-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-5-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-5-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-totalDigits-5-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList136 = [ITRes135|ITResList135],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList137 = [ITRes136|ITResList136],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList138 = [ITRes137|ITResList137],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ ?line {STRes31,S31} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList32 = [STRes31|STResList31],
+ ?line ITRes139 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList140 = [ITRes139|ITResList139],
+ ?line ITRes140 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList141 = [ITRes140|ITResList140],
+ ?line ITRes141 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList142 = [ITRes141|ITResList141],
+ ?line ITRes142 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList143 = [ITRes142|ITResList142],
+ ?line ITRes143 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList144 = [ITRes143|ITResList143],
+
+
+ ?line {STRes32,S32} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList33 = [STRes32|STResList32],
+ ?line ITRes144 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList145 = [ITRes144|ITResList144],
+ ?line ITRes145 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList146 = [ITRes145|ITResList145],
+ ?line ITRes146 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList147 = [ITRes146|ITResList146],
+ ?line ITRes147 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList148 = [ITRes147|ITResList147],
+ ?line ITRes148 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList149 = [ITRes148|ITResList148],
+
+
+ ?line {STRes33,S33} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList34 = [STRes33|STResList33],
+ ?line ITRes149 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList150 = [ITRes149|ITResList149],
+ ?line ITRes150 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList151 = [ITRes150|ITResList150],
+ ?line ITRes151 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList152 = [ITRes151|ITResList151],
+ ?line ITRes152 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList153 = [ITRes152|ITResList152],
+ ?line ITRes153 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList154 = [ITRes153|ITResList153],
+
+
+ ?line {STRes34,S34} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList35 = [STRes34|STResList34],
+ ?line ITRes154 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList155 = [ITRes154|ITResList154],
+ ?line ITRes155 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList156 = [ITRes155|ITResList155],
+ ?line ITRes156 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList157 = [ITRes156|ITResList156],
+ ?line ITRes157 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList158 = [ITRes157|ITResList157],
+ ?line ITRes158 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList159 = [ITRes158|ITResList158],
+
+
+ ?line {STRes35,S35} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList36 = [STRes35|STResList35],
+ ?line ITRes159 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList160 = [ITRes159|ITResList159],
+ ?line ITRes160 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList161 = [ITRes160|ITResList160],
+ ?line ITRes161 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList162 = [ITRes161|ITResList161],
+ ?line ITRes162 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList163 = [ITRes162|ITResList162],
+ ?line ITRes163 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList164 = [ITRes163|ITResList163],
+
+
+ ?line {STRes36,S36} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-int-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList37 = [STRes36|STResList36],
+ ?line ITRes164 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList165 = [ITRes164|ITResList164],
+ ?line ITRes165 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList166 = [ITRes165|ITResList165],
+ ?line ITRes166 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList167 = [ITRes166|ITResList166],
+ ?line ITRes167 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList168 = [ITRes167|ITResList167],
+ ?line ITRes168 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-int-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList169 = [ITRes168|ITResList168],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList37,ITResList169).
+
+%% Data type derived by restriction of integer by facets
+
+'NISTSchema-integer'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-fractionDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-fractionDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-fractionDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-fractionDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-fractionDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-fractionDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-totalDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-totalDigits-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-2-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-2-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-2-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-2-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-2-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-totalDigits-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-3-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-3-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-3-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-3-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-3-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-totalDigits-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-4-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-4-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-4-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-4-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-4-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-totalDigits-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-5-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-5-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-5-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-5-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-totalDigits-5-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList136 = [ITRes135|ITResList135],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList137 = [ITRes136|ITResList136],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList138 = [ITRes137|ITResList137],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ ?line {STRes31,S31} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList32 = [STRes31|STResList31],
+ ?line ITRes139 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList140 = [ITRes139|ITResList139],
+ ?line ITRes140 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList141 = [ITRes140|ITResList140],
+ ?line ITRes141 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList142 = [ITRes141|ITResList141],
+ ?line ITRes142 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList143 = [ITRes142|ITResList142],
+ ?line ITRes143 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList144 = [ITRes143|ITResList143],
+
+
+ ?line {STRes32,S32} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList33 = [STRes32|STResList32],
+ ?line ITRes144 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList145 = [ITRes144|ITResList144],
+ ?line ITRes145 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList146 = [ITRes145|ITResList145],
+ ?line ITRes146 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList147 = [ITRes146|ITResList146],
+ ?line ITRes147 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList148 = [ITRes147|ITResList147],
+ ?line ITRes148 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList149 = [ITRes148|ITResList148],
+
+
+ ?line {STRes33,S33} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList34 = [STRes33|STResList33],
+ ?line ITRes149 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList150 = [ITRes149|ITResList149],
+ ?line ITRes150 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList151 = [ITRes150|ITResList150],
+ ?line ITRes151 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList152 = [ITRes151|ITResList151],
+ ?line ITRes152 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList153 = [ITRes152|ITResList152],
+ ?line ITRes153 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList154 = [ITRes153|ITResList153],
+
+
+ ?line {STRes34,S34} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList35 = [STRes34|STResList34],
+ ?line ITRes154 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList155 = [ITRes154|ITResList154],
+ ?line ITRes155 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList156 = [ITRes155|ITResList155],
+ ?line ITRes156 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList157 = [ITRes156|ITResList156],
+ ?line ITRes157 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList158 = [ITRes157|ITResList157],
+ ?line ITRes158 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList159 = [ITRes158|ITResList158],
+
+
+ ?line {STRes35,S35} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList36 = [STRes35|STResList35],
+ ?line ITRes159 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList160 = [ITRes159|ITResList159],
+ ?line ITRes160 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList161 = [ITRes160|ITResList160],
+ ?line ITRes161 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList162 = [ITRes161|ITResList161],
+ ?line ITRes162 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList163 = [ITRes162|ITResList162],
+ ?line ITRes163 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList164 = [ITRes163|ITResList163],
+
+
+ ?line {STRes36,S36} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-integer-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList37 = [STRes36|STResList36],
+ ?line ITRes164 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList165 = [ITRes164|ITResList164],
+ ?line ITRes165 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList166 = [ITRes165|ITResList165],
+ ?line ITRes166 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList167 = [ITRes166|ITResList166],
+ ?line ITRes167 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList168 = [ITRes167|ITResList167],
+ ?line ITRes168 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-integer-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList169 = [ITRes168|ITResList168],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList37,ITResList169).
+
+%% Data type derived by restriction of language by facets
+
+'NISTSchema-language'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-maxLength-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-maxLength-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-maxLength-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-maxLength-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-maxLength-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-maxLength-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-maxLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-maxLength-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-maxLength-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-maxLength-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-maxLength-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-maxLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-maxLength-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList10 = [ITRes9|ITResList9],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-maxLength-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-maxLength-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-maxLength-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-maxLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-maxLength-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-maxLength-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList15 = [ITRes14|ITResList14],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-maxLength-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-maxLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-maxLength-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-maxLength-5-2.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-maxLength-5-3.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-maxLength-5-4.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList20 = [ITRes19|ITResList19],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-maxLength-5-5.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-minLength-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-minLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-minLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-minLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-minLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-5-2.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList43 = [ITRes42|ITResList42],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-5-3.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-5-4.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-minLength-5-5.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList46 = [ITRes45|ITResList45],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-length-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-1-2.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList48 = [ITRes47|ITResList47],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-1-3.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-1-4.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-1-5.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList51 = [ITRes50|ITResList50],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-length-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList53 = [ITRes52|ITResList52],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList56 = [ITRes55|ITResList55],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-length-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList58 = [ITRes57|ITResList57],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList61 = [ITRes60|ITResList60],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-length-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList63 = [ITRes62|ITResList62],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList64 = [ITRes63|ITResList63],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList66 = [ITRes65|ITResList65],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-length-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList69 = [ITRes68|ITResList68],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-length-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList71 = [ITRes70|ITResList70],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList74 = [ITRes73|ITResList73],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList76 = [ITRes75|ITResList75],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList79 = [ITRes78|ITResList78],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList81 = [ITRes80|ITResList80],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList84 = [ITRes83|ITResList83],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList86 = [ITRes85|ITResList85],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList89 = [ITRes88|ITResList88],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList91 = [ITRes90|ITResList90],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList94 = [ITRes93|ITResList93],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList96 = [ITRes95|ITResList95],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList99 = [ITRes98|ITResList98],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList101 = [ITRes100|ITResList100],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList104 = [ITRes103|ITResList103],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList106 = [ITRes105|ITResList105],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList109 = [ITRes108|ITResList108],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList111 = [ITRes110|ITResList110],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList114 = [ITRes113|ITResList113],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList116 = [ITRes115|ITResList115],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList119 = [ITRes118|ITResList118],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList121 = [ITRes120|ITResList120],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-language-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList124 = [ITRes123|ITResList123],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-language-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList126 = [ITRes125|ITResList125],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList26,ITResList126).
+
+%% Data type derived by restriction of long by facets
+
+'NISTSchema-long'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-fractionDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-fractionDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-fractionDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-fractionDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-fractionDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-fractionDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-totalDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-totalDigits-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-2-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-2-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-2-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-2-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-2-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-totalDigits-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-3-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-3-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-3-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-3-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-3-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-totalDigits-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-4-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-4-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-4-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-4-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-4-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-totalDigits-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-5-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-5-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-5-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-5-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-totalDigits-5-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList136 = [ITRes135|ITResList135],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList137 = [ITRes136|ITResList136],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList138 = [ITRes137|ITResList137],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ ?line {STRes31,S31} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList32 = [STRes31|STResList31],
+ ?line ITRes139 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList140 = [ITRes139|ITResList139],
+ ?line ITRes140 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList141 = [ITRes140|ITResList140],
+ ?line ITRes141 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList142 = [ITRes141|ITResList141],
+ ?line ITRes142 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList143 = [ITRes142|ITResList142],
+ ?line ITRes143 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList144 = [ITRes143|ITResList143],
+
+
+ ?line {STRes32,S32} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList33 = [STRes32|STResList32],
+ ?line ITRes144 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList145 = [ITRes144|ITResList144],
+ ?line ITRes145 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList146 = [ITRes145|ITResList145],
+ ?line ITRes146 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList147 = [ITRes146|ITResList146],
+ ?line ITRes147 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList148 = [ITRes147|ITResList147],
+ ?line ITRes148 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList149 = [ITRes148|ITResList148],
+
+
+ ?line {STRes33,S33} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList34 = [STRes33|STResList33],
+ ?line ITRes149 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList150 = [ITRes149|ITResList149],
+ ?line ITRes150 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList151 = [ITRes150|ITResList150],
+ ?line ITRes151 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList152 = [ITRes151|ITResList151],
+ ?line ITRes152 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList153 = [ITRes152|ITResList152],
+ ?line ITRes153 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList154 = [ITRes153|ITResList153],
+
+
+ ?line {STRes34,S34} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList35 = [STRes34|STResList34],
+ ?line ITRes154 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList155 = [ITRes154|ITResList154],
+ ?line ITRes155 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList156 = [ITRes155|ITResList155],
+ ?line ITRes156 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList157 = [ITRes156|ITResList156],
+ ?line ITRes157 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList158 = [ITRes157|ITResList157],
+ ?line ITRes158 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList159 = [ITRes158|ITResList158],
+
+
+ ?line {STRes35,S35} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList36 = [STRes35|STResList35],
+ ?line ITRes159 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList160 = [ITRes159|ITResList159],
+ ?line ITRes160 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList161 = [ITRes160|ITResList160],
+ ?line ITRes161 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList162 = [ITRes161|ITResList161],
+ ?line ITRes162 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList163 = [ITRes162|ITResList162],
+ ?line ITRes163 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList164 = [ITRes163|ITResList163],
+
+
+ ?line {STRes36,S36} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-long-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList37 = [STRes36|STResList36],
+ ?line ITRes164 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList165 = [ITRes164|ITResList164],
+ ?line ITRes165 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList166 = [ITRes165|ITResList165],
+ ?line ITRes166 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList167 = [ITRes166|ITResList166],
+ ?line ITRes167 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList168 = [ITRes167|ITResList167],
+ ?line ITRes168 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-long-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList169 = [ITRes168|ITResList168],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList37,ITResList169).
+
+%% Data type derived by restriction of Name by facets
+
+'NISTSchema-Name'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-maxLength-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-maxLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-maxLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-maxLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-maxLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-5-2.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-5-3.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-5-4.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-maxLength-5-5.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-minLength-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList30 = [ITRes29|ITResList29],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-minLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList35 = [ITRes34|ITResList34],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-minLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList40 = [ITRes39|ITResList39],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-minLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList42 = [ITRes41|ITResList41],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList43 = [ITRes42|ITResList42],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList45 = [ITRes44|ITResList44],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-minLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-5-2.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-5-3.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList48 = [ITRes47|ITResList47],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-5-4.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-minLength-5-5.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList50 = [ITRes49|ITResList49],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-length-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-1-2.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-1-3.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList53 = [ITRes52|ITResList52],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-1-4.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-1-5.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList55 = [ITRes54|ITResList54],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-length-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList58 = [ITRes57|ITResList57],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList60 = [ITRes59|ITResList59],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-length-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList63 = [ITRes62|ITResList62],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList64 = [ITRes63|ITResList63],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList65 = [ITRes64|ITResList64],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-length-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList69 = [ITRes68|ITResList68],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList70 = [ITRes69|ITResList69],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-length-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList74 = [ITRes73|ITResList73],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-length-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList75 = [ITRes74|ITResList74],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList79 = [ITRes78|ITResList78],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList80 = [ITRes79|ITResList79],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList84 = [ITRes83|ITResList83],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList85 = [ITRes84|ITResList84],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList89 = [ITRes88|ITResList88],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList90 = [ITRes89|ITResList89],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList94 = [ITRes93|ITResList93],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList95 = [ITRes94|ITResList94],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList99 = [ITRes98|ITResList98],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList100 = [ITRes99|ITResList99],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList104 = [ITRes103|ITResList103],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList105 = [ITRes104|ITResList104],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList109 = [ITRes108|ITResList108],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList110 = [ITRes109|ITResList109],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList114 = [ITRes113|ITResList113],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList115 = [ITRes114|ITResList114],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList119 = [ITRes118|ITResList118],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList120 = [ITRes119|ITResList119],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList124 = [ITRes123|ITResList123],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList125 = [ITRes124|ITResList124],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-Name-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList129 = [ITRes128|ITResList128],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-Name-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList130 = [ITRes129|ITResList129],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList26,ITResList130).
+
+%% Data type derived by restriction of NCName by facets
+
+'NISTSchema-NCName'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-maxLength-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-maxLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-maxLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-maxLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-maxLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-5-2.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-5-3.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-5-4.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-maxLength-5-5.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-minLength-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList30 = [ITRes29|ITResList29],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-minLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList35 = [ITRes34|ITResList34],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-minLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList40 = [ITRes39|ITResList39],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-minLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList42 = [ITRes41|ITResList41],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList43 = [ITRes42|ITResList42],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList45 = [ITRes44|ITResList44],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-minLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-5-2.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-5-3.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList48 = [ITRes47|ITResList47],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-5-4.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-minLength-5-5.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList50 = [ITRes49|ITResList49],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-length-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-1-2.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-1-3.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList53 = [ITRes52|ITResList52],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-1-4.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-1-5.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList55 = [ITRes54|ITResList54],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-length-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList58 = [ITRes57|ITResList57],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList60 = [ITRes59|ITResList59],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-length-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList63 = [ITRes62|ITResList62],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList64 = [ITRes63|ITResList63],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList65 = [ITRes64|ITResList64],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-length-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList69 = [ITRes68|ITResList68],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList70 = [ITRes69|ITResList69],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-length-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList74 = [ITRes73|ITResList73],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-length-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList75 = [ITRes74|ITResList74],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList79 = [ITRes78|ITResList78],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList80 = [ITRes79|ITResList79],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList84 = [ITRes83|ITResList83],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList85 = [ITRes84|ITResList84],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList89 = [ITRes88|ITResList88],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList90 = [ITRes89|ITResList89],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList94 = [ITRes93|ITResList93],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList95 = [ITRes94|ITResList94],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList99 = [ITRes98|ITResList98],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList100 = [ITRes99|ITResList99],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList104 = [ITRes103|ITResList103],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList105 = [ITRes104|ITResList104],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList109 = [ITRes108|ITResList108],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList110 = [ITRes109|ITResList109],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList114 = [ITRes113|ITResList113],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList115 = [ITRes114|ITResList114],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList119 = [ITRes118|ITResList118],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList120 = [ITRes119|ITResList119],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList124 = [ITRes123|ITResList123],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList125 = [ITRes124|ITResList124],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NCName-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList129 = [ITRes128|ITResList128],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NCName-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList130 = [ITRes129|ITResList129],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList26,ITResList130).
+
+%% Data type derived by restriction of negativeInteger by facets
+
+'NISTSchema-negativeInteger'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-fractionDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-fractionDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-fractionDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-fractionDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-fractionDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-fractionDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-totalDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-totalDigits-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-2-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-2-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-2-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-2-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-2-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-totalDigits-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-3-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-3-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-3-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-3-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-3-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-totalDigits-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-4-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-4-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-4-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-4-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-4-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-totalDigits-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-5-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-5-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-5-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-5-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-totalDigits-5-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList136 = [ITRes135|ITResList135],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList137 = [ITRes136|ITResList136],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList138 = [ITRes137|ITResList137],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ ?line {STRes31,S31} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList32 = [STRes31|STResList31],
+ ?line ITRes139 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList140 = [ITRes139|ITResList139],
+ ?line ITRes140 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList141 = [ITRes140|ITResList140],
+ ?line ITRes141 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList142 = [ITRes141|ITResList141],
+ ?line ITRes142 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList143 = [ITRes142|ITResList142],
+ ?line ITRes143 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList144 = [ITRes143|ITResList143],
+
+
+ ?line {STRes32,S32} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList33 = [STRes32|STResList32],
+ ?line ITRes144 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList145 = [ITRes144|ITResList144],
+ ?line ITRes145 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList146 = [ITRes145|ITResList145],
+ ?line ITRes146 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList147 = [ITRes146|ITResList146],
+ ?line ITRes147 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList148 = [ITRes147|ITResList147],
+ ?line ITRes148 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList149 = [ITRes148|ITResList148],
+
+
+ ?line {STRes33,S33} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList34 = [STRes33|STResList33],
+ ?line ITRes149 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList150 = [ITRes149|ITResList149],
+ ?line ITRes150 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList151 = [ITRes150|ITResList150],
+ ?line ITRes151 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList152 = [ITRes151|ITResList151],
+ ?line ITRes152 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList153 = [ITRes152|ITResList152],
+ ?line ITRes153 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList154 = [ITRes153|ITResList153],
+
+
+ ?line {STRes34,S34} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList35 = [STRes34|STResList34],
+ ?line ITRes154 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList155 = [ITRes154|ITResList154],
+ ?line ITRes155 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList156 = [ITRes155|ITResList155],
+ ?line ITRes156 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList157 = [ITRes156|ITResList156],
+ ?line ITRes157 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList158 = [ITRes157|ITResList157],
+ ?line ITRes158 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList159 = [ITRes158|ITResList158],
+
+
+ ?line {STRes35,S35} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList36 = [STRes35|STResList35],
+ ?line ITRes159 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList160 = [ITRes159|ITResList159],
+ ?line ITRes160 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList161 = [ITRes160|ITResList160],
+ ?line ITRes161 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList162 = [ITRes161|ITResList161],
+ ?line ITRes162 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList163 = [ITRes162|ITResList162],
+ ?line ITRes163 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList164 = [ITRes163|ITResList163],
+
+
+ ?line {STRes36,S36} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-negativeInteger-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList37 = [STRes36|STResList36],
+ ?line ITRes164 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList165 = [ITRes164|ITResList164],
+ ?line ITRes165 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList166 = [ITRes165|ITResList165],
+ ?line ITRes166 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList167 = [ITRes166|ITResList166],
+ ?line ITRes167 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList168 = [ITRes167|ITResList167],
+ ?line ITRes168 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-negativeInteger-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList169 = [ITRes168|ITResList168],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList37,ITResList169).
+
+%% Data type derived by restriction of NMTOKEN by facets
+
+'NISTSchema-NMTOKEN'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-maxLength-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-maxLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-maxLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-maxLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-maxLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-5-2.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-5-3.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-5-4.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-maxLength-5-5.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-minLength-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList30 = [ITRes29|ITResList29],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-minLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList35 = [ITRes34|ITResList34],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-minLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList40 = [ITRes39|ITResList39],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-minLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList42 = [ITRes41|ITResList41],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList43 = [ITRes42|ITResList42],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList45 = [ITRes44|ITResList44],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-minLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-5-2.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-5-3.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList48 = [ITRes47|ITResList47],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-5-4.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-minLength-5-5.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList50 = [ITRes49|ITResList49],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-length-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-1-2.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-1-3.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList53 = [ITRes52|ITResList52],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-1-4.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-1-5.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList55 = [ITRes54|ITResList54],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-length-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList58 = [ITRes57|ITResList57],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList60 = [ITRes59|ITResList59],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-length-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList63 = [ITRes62|ITResList62],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList64 = [ITRes63|ITResList63],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList65 = [ITRes64|ITResList64],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-length-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList69 = [ITRes68|ITResList68],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList70 = [ITRes69|ITResList69],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-length-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList74 = [ITRes73|ITResList73],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-length-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList75 = [ITRes74|ITResList74],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList79 = [ITRes78|ITResList78],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList80 = [ITRes79|ITResList79],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList84 = [ITRes83|ITResList83],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList85 = [ITRes84|ITResList84],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList89 = [ITRes88|ITResList88],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList90 = [ITRes89|ITResList89],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList94 = [ITRes93|ITResList93],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList95 = [ITRes94|ITResList94],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList99 = [ITRes98|ITResList98],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList100 = [ITRes99|ITResList99],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList104 = [ITRes103|ITResList103],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList105 = [ITRes104|ITResList104],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList109 = [ITRes108|ITResList108],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList110 = [ITRes109|ITResList109],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList114 = [ITRes113|ITResList113],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList115 = [ITRes114|ITResList114],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList118 = [ITRes117|ITResList117],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList119 = [ITRes118|ITResList118],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList123 = [ITRes122|ITResList122],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-NMTOKEN-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList124 = [ITRes123|ITResList123],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-NMTOKEN-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList128 = [ITRes127|ITResList127],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList26,ITResList128).
+
+%% Data type derived by restriction of nonNegativeInteger by facets
+
+'NISTSchema-nonNegativeInteger'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-fractionDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-fractionDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-fractionDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-fractionDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-fractionDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-fractionDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-totalDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-totalDigits-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-2-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-2-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-2-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-2-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-2-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-totalDigits-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-3-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-3-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-3-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-3-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-3-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-totalDigits-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-4-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-4-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-4-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-4-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-4-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-totalDigits-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-5-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-5-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-5-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-5-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-totalDigits-5-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList136 = [ITRes135|ITResList135],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList137 = [ITRes136|ITResList136],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList138 = [ITRes137|ITResList137],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ ?line {STRes31,S31} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList32 = [STRes31|STResList31],
+ ?line ITRes139 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList140 = [ITRes139|ITResList139],
+ ?line ITRes140 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList141 = [ITRes140|ITResList140],
+ ?line ITRes141 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList142 = [ITRes141|ITResList141],
+ ?line ITRes142 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList143 = [ITRes142|ITResList142],
+ ?line ITRes143 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList144 = [ITRes143|ITResList143],
+
+
+ ?line {STRes32,S32} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList33 = [STRes32|STResList32],
+ ?line ITRes144 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList145 = [ITRes144|ITResList144],
+ ?line ITRes145 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList146 = [ITRes145|ITResList145],
+ ?line ITRes146 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList147 = [ITRes146|ITResList146],
+ ?line ITRes147 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList148 = [ITRes147|ITResList147],
+ ?line ITRes148 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList149 = [ITRes148|ITResList148],
+
+
+ ?line {STRes33,S33} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList34 = [STRes33|STResList33],
+ ?line ITRes149 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList150 = [ITRes149|ITResList149],
+ ?line ITRes150 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList151 = [ITRes150|ITResList150],
+ ?line ITRes151 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList152 = [ITRes151|ITResList151],
+ ?line ITRes152 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList153 = [ITRes152|ITResList152],
+ ?line ITRes153 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList154 = [ITRes153|ITResList153],
+
+
+ ?line {STRes34,S34} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList35 = [STRes34|STResList34],
+ ?line ITRes154 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList155 = [ITRes154|ITResList154],
+ ?line ITRes155 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList156 = [ITRes155|ITResList155],
+ ?line ITRes156 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList157 = [ITRes156|ITResList156],
+ ?line ITRes157 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList158 = [ITRes157|ITResList157],
+ ?line ITRes158 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList159 = [ITRes158|ITResList158],
+
+
+ ?line {STRes35,S35} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList36 = [STRes35|STResList35],
+ ?line ITRes159 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList160 = [ITRes159|ITResList159],
+ ?line ITRes160 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList161 = [ITRes160|ITResList160],
+ ?line ITRes161 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList162 = [ITRes161|ITResList161],
+ ?line ITRes162 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList163 = [ITRes162|ITResList162],
+ ?line ITRes163 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList164 = [ITRes163|ITResList163],
+
+
+ ?line {STRes36,S36} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonNegativeInteger-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList37 = [STRes36|STResList36],
+ ?line ITRes164 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList165 = [ITRes164|ITResList164],
+ ?line ITRes165 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList166 = [ITRes165|ITResList165],
+ ?line ITRes166 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList167 = [ITRes166|ITResList166],
+ ?line ITRes167 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList168 = [ITRes167|ITResList167],
+ ?line ITRes168 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonNegativeInteger-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList169 = [ITRes168|ITResList168],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList37,ITResList169).
+
+%% Data type derived by restriction of nonPositiveInteger by facets
+
+'NISTSchema-nonPositiveInteger'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-fractionDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-fractionDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-fractionDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-fractionDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-fractionDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-fractionDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-totalDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-totalDigits-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-2-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-2-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-2-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-2-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-2-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-totalDigits-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-3-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-3-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-3-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-3-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-3-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-totalDigits-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-4-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-4-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-4-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-4-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-4-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-totalDigits-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-5-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-5-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-5-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-5-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-totalDigits-5-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList136 = [ITRes135|ITResList135],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList137 = [ITRes136|ITResList136],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList138 = [ITRes137|ITResList137],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ ?line {STRes31,S31} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList32 = [STRes31|STResList31],
+ ?line ITRes139 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList140 = [ITRes139|ITResList139],
+ ?line ITRes140 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList141 = [ITRes140|ITResList140],
+ ?line ITRes141 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList142 = [ITRes141|ITResList141],
+ ?line ITRes142 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList143 = [ITRes142|ITResList142],
+ ?line ITRes143 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList144 = [ITRes143|ITResList143],
+
+
+ ?line {STRes32,S32} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList33 = [STRes32|STResList32],
+ ?line ITRes144 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList145 = [ITRes144|ITResList144],
+ ?line ITRes145 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList146 = [ITRes145|ITResList145],
+ ?line ITRes146 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList147 = [ITRes146|ITResList146],
+ ?line ITRes147 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList148 = [ITRes147|ITResList147],
+ ?line ITRes148 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList149 = [ITRes148|ITResList148],
+
+
+ ?line {STRes33,S33} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList34 = [STRes33|STResList33],
+ ?line ITRes149 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList150 = [ITRes149|ITResList149],
+ ?line ITRes150 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList151 = [ITRes150|ITResList150],
+ ?line ITRes151 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList152 = [ITRes151|ITResList151],
+ ?line ITRes152 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList153 = [ITRes152|ITResList152],
+ ?line ITRes153 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList154 = [ITRes153|ITResList153],
+
+
+ ?line {STRes34,S34} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList35 = [STRes34|STResList34],
+ ?line ITRes154 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList155 = [ITRes154|ITResList154],
+ ?line ITRes155 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList156 = [ITRes155|ITResList155],
+ ?line ITRes156 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList157 = [ITRes156|ITResList156],
+ ?line ITRes157 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList158 = [ITRes157|ITResList157],
+ ?line ITRes158 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList159 = [ITRes158|ITResList158],
+
+
+ ?line {STRes35,S35} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList36 = [STRes35|STResList35],
+ ?line ITRes159 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList160 = [ITRes159|ITResList159],
+ ?line ITRes160 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList161 = [ITRes160|ITResList160],
+ ?line ITRes161 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList162 = [ITRes161|ITResList161],
+ ?line ITRes162 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList163 = [ITRes162|ITResList162],
+ ?line ITRes163 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList164 = [ITRes163|ITResList163],
+
+
+ ?line {STRes36,S36} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-nonPositiveInteger-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList37 = [STRes36|STResList36],
+ ?line ITRes164 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList165 = [ITRes164|ITResList164],
+ ?line ITRes165 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList166 = [ITRes165|ITResList165],
+ ?line ITRes166 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList167 = [ITRes166|ITResList166],
+ ?line ITRes167 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList168 = [ITRes167|ITResList167],
+ ?line ITRes168 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-nonPositiveInteger-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList169 = [ITRes168|ITResList168],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList37,ITResList169).
+
+%% Data type derived by restriction of normalizedString by facets
+
+'NISTSchema-normalizedString'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-maxLength-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-maxLength-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-maxLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-maxLength-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-maxLength-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-maxLength-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-maxLength-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList5 = [ITRes4|ITResList4],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-maxLength-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-maxLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-maxLength-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-maxLength-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-maxLength-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-maxLength-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList10 = [ITRes9|ITResList9],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-maxLength-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-maxLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-maxLength-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-maxLength-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-maxLength-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-maxLength-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList15 = [ITRes14|ITResList14],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-maxLength-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-maxLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-maxLength-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-maxLength-5-2.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-maxLength-5-3.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-maxLength-5-4.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList20 = [ITRes19|ITResList19],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-maxLength-5-5.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-minLength-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-minLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-minLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-minLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-minLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-5-2.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList43 = [ITRes42|ITResList42],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-5-3.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-5-4.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-minLength-5-5.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList46 = [ITRes45|ITResList45],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-length-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-length-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList47 = [ITRes46|ITResList46],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-length-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-length-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-length-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-length-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-length-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-length-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList52 = [ITRes51|ITResList51],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-length-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-length-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-length-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-length-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-length-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-length-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList57 = [ITRes56|ITResList56],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-length-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-length-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-length-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-length-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-length-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-length-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList62 = [ITRes61|ITResList61],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-length-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-length-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-length-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList64 = [ITRes63|ITResList63],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-length-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-length-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-length-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList67 = [ITRes66|ITResList66],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList69 = [ITRes68|ITResList68],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList72 = [ITRes71|ITResList71],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList74 = [ITRes73|ITResList73],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList77 = [ITRes76|ITResList76],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList79 = [ITRes78|ITResList78],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList82 = [ITRes81|ITResList81],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList84 = [ITRes83|ITResList83],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList87 = [ITRes86|ITResList86],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList89 = [ITRes88|ITResList88],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList92 = [ITRes91|ITResList91],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList94 = [ITRes93|ITResList93],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList97 = [ITRes96|ITResList96],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList99 = [ITRes98|ITResList98],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList102 = [ITRes101|ITResList101],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList104 = [ITRes103|ITResList103],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList107 = [ITRes106|ITResList106],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList109 = [ITRes108|ITResList108],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList112 = [ITRes111|ITResList111],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList114 = [ITRes113|ITResList113],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList117 = [ITRes116|ITResList116],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList119 = [ITRes118|ITResList118],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList122 = [ITRes121|ITResList121],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-normalizedString-whiteSpace-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-whiteSpace-2-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-whiteSpace-2-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList124 = [ITRes123|ITResList123],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-whiteSpace-2-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-whiteSpace-2-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-normalizedString-whiteSpace-2-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList127 = [ITRes126|ITResList126],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList27,ITResList127).
+
+%% Data type derived by restriction of positiveInteger by facets
+
+'NISTSchema-positiveInteger'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-fractionDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-fractionDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-fractionDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-fractionDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-fractionDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-fractionDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-totalDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-totalDigits-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-2-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-2-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-2-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-2-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-2-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-totalDigits-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-3-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-3-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-3-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-3-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-3-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-totalDigits-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-4-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-4-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-4-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-4-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-4-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-totalDigits-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-5-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-5-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-5-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-5-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-totalDigits-5-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList136 = [ITRes135|ITResList135],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList137 = [ITRes136|ITResList136],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList138 = [ITRes137|ITResList137],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ ?line {STRes31,S31} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList32 = [STRes31|STResList31],
+ ?line ITRes139 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList140 = [ITRes139|ITResList139],
+ ?line ITRes140 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList141 = [ITRes140|ITResList140],
+ ?line ITRes141 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList142 = [ITRes141|ITResList141],
+ ?line ITRes142 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList143 = [ITRes142|ITResList142],
+ ?line ITRes143 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList144 = [ITRes143|ITResList143],
+
+
+ ?line {STRes32,S32} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList33 = [STRes32|STResList32],
+ ?line ITRes144 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList145 = [ITRes144|ITResList144],
+ ?line ITRes145 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList146 = [ITRes145|ITResList145],
+ ?line ITRes146 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList147 = [ITRes146|ITResList146],
+ ?line ITRes147 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList148 = [ITRes147|ITResList147],
+ ?line ITRes148 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList149 = [ITRes148|ITResList148],
+
+
+ ?line {STRes33,S33} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList34 = [STRes33|STResList33],
+ ?line ITRes149 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList150 = [ITRes149|ITResList149],
+ ?line ITRes150 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList151 = [ITRes150|ITResList150],
+ ?line ITRes151 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList152 = [ITRes151|ITResList151],
+ ?line ITRes152 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList153 = [ITRes152|ITResList152],
+ ?line ITRes153 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList154 = [ITRes153|ITResList153],
+
+
+ ?line {STRes34,S34} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList35 = [STRes34|STResList34],
+ ?line ITRes154 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList155 = [ITRes154|ITResList154],
+ ?line ITRes155 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList156 = [ITRes155|ITResList155],
+ ?line ITRes156 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList157 = [ITRes156|ITResList156],
+ ?line ITRes157 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList158 = [ITRes157|ITResList157],
+ ?line ITRes158 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList159 = [ITRes158|ITResList158],
+
+
+ ?line {STRes35,S35} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList36 = [STRes35|STResList35],
+ ?line ITRes159 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList160 = [ITRes159|ITResList159],
+ ?line ITRes160 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList161 = [ITRes160|ITResList160],
+ ?line ITRes161 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList162 = [ITRes161|ITResList161],
+ ?line ITRes162 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList163 = [ITRes162|ITResList162],
+ ?line ITRes163 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList164 = [ITRes163|ITResList163],
+
+
+ ?line {STRes36,S36} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-positiveInteger-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList37 = [STRes36|STResList36],
+ ?line ITRes164 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList165 = [ITRes164|ITResList164],
+ ?line ITRes165 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList166 = [ITRes165|ITResList165],
+ ?line ITRes166 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList167 = [ITRes166|ITResList166],
+ ?line ITRes167 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList168 = [ITRes167|ITResList167],
+ ?line ITRes168 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-positiveInteger-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList169 = [ITRes168|ITResList168],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList37,ITResList169).
+
+%% Data type derived by restriction of QName by facets
+
+'NISTSchema-QName'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-maxLength-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-maxLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-maxLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-maxLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-maxLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-5-2.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-5-3.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-5-4.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-maxLength-5-5.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList25 = [ITRes24|ITResList24],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-minLength-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList30 = [ITRes29|ITResList29],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-minLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList35 = [ITRes34|ITResList34],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-minLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList40 = [ITRes39|ITResList39],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-minLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList42 = [ITRes41|ITResList41],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList43 = [ITRes42|ITResList42],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList45 = [ITRes44|ITResList44],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-minLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-5-2.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-5-3.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList48 = [ITRes47|ITResList47],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-5-4.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-minLength-5-5.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList50 = [ITRes49|ITResList49],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-length-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-1-2.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-1-3.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList53 = [ITRes52|ITResList52],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-1-4.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-1-5.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList55 = [ITRes54|ITResList54],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-length-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList58 = [ITRes57|ITResList57],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList60 = [ITRes59|ITResList59],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-length-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList63 = [ITRes62|ITResList62],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList64 = [ITRes63|ITResList63],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList65 = [ITRes64|ITResList64],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-length-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList69 = [ITRes68|ITResList68],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList70 = [ITRes69|ITResList69],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-length-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList74 = [ITRes73|ITResList73],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-length-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList75 = [ITRes74|ITResList74],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList79 = [ITRes78|ITResList78],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList80 = [ITRes79|ITResList79],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList84 = [ITRes83|ITResList83],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList85 = [ITRes84|ITResList84],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList89 = [ITRes88|ITResList88],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList90 = [ITRes89|ITResList89],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList94 = [ITRes93|ITResList93],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList95 = [ITRes94|ITResList94],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList99 = [ITRes98|ITResList98],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList100 = [ITRes99|ITResList99],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList104 = [ITRes103|ITResList103],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList105 = [ITRes104|ITResList104],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList109 = [ITRes108|ITResList108],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList110 = [ITRes109|ITResList109],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList114 = [ITRes113|ITResList113],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList115 = [ITRes114|ITResList114],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList119 = [ITRes118|ITResList118],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList120 = [ITRes119|ITResList119],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList124 = [ITRes123|ITResList123],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList125 = [ITRes124|ITResList124],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-QName-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList129 = [ITRes128|ITResList128],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-QName-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList130 = [ITRes129|ITResList129],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList26,ITResList130).
+
+%% Data type derived by restriction of short by facets
+
+'NISTSchema-short'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-fractionDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-fractionDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-fractionDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-fractionDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-fractionDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-fractionDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-totalDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-totalDigits-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-2-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-2-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-2-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-2-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-2-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-totalDigits-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-3-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-3-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-3-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-3-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-3-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-totalDigits-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-4-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-4-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-4-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-4-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-4-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-totalDigits-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-5-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-5-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-5-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-5-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-totalDigits-5-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList136 = [ITRes135|ITResList135],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList137 = [ITRes136|ITResList136],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList138 = [ITRes137|ITResList137],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ ?line {STRes31,S31} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList32 = [STRes31|STResList31],
+ ?line ITRes139 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList140 = [ITRes139|ITResList139],
+ ?line ITRes140 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList141 = [ITRes140|ITResList140],
+ ?line ITRes141 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList142 = [ITRes141|ITResList141],
+ ?line ITRes142 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList143 = [ITRes142|ITResList142],
+ ?line ITRes143 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList144 = [ITRes143|ITResList143],
+
+
+ ?line {STRes32,S32} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList33 = [STRes32|STResList32],
+ ?line ITRes144 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList145 = [ITRes144|ITResList144],
+ ?line ITRes145 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList146 = [ITRes145|ITResList145],
+ ?line ITRes146 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList147 = [ITRes146|ITResList146],
+ ?line ITRes147 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList148 = [ITRes147|ITResList147],
+ ?line ITRes148 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList149 = [ITRes148|ITResList148],
+
+
+ ?line {STRes33,S33} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList34 = [STRes33|STResList33],
+ ?line ITRes149 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList150 = [ITRes149|ITResList149],
+ ?line ITRes150 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList151 = [ITRes150|ITResList150],
+ ?line ITRes151 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList152 = [ITRes151|ITResList151],
+ ?line ITRes152 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList153 = [ITRes152|ITResList152],
+ ?line ITRes153 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList154 = [ITRes153|ITResList153],
+
+
+ ?line {STRes34,S34} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList35 = [STRes34|STResList34],
+ ?line ITRes154 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList155 = [ITRes154|ITResList154],
+ ?line ITRes155 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList156 = [ITRes155|ITResList155],
+ ?line ITRes156 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList157 = [ITRes156|ITResList156],
+ ?line ITRes157 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList158 = [ITRes157|ITResList157],
+ ?line ITRes158 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList159 = [ITRes158|ITResList158],
+
+
+ ?line {STRes35,S35} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList36 = [STRes35|STResList35],
+ ?line ITRes159 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList160 = [ITRes159|ITResList159],
+ ?line ITRes160 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList161 = [ITRes160|ITResList160],
+ ?line ITRes161 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList162 = [ITRes161|ITResList161],
+ ?line ITRes162 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList163 = [ITRes162|ITResList162],
+ ?line ITRes163 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList164 = [ITRes163|ITResList163],
+
+
+ ?line {STRes36,S36} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-short-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList37 = [STRes36|STResList36],
+ ?line ITRes164 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList165 = [ITRes164|ITResList164],
+ ?line ITRes165 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList166 = [ITRes165|ITResList165],
+ ?line ITRes166 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList167 = [ITRes166|ITResList166],
+ ?line ITRes167 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList168 = [ITRes167|ITResList167],
+ ?line ITRes168 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-short-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList169 = [ITRes168|ITResList168],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList37,ITResList169).
+
+%% Data type derived by restriction of string by facets
+
+'NISTSchema-string'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-maxLength-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-maxLength-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-maxLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-maxLength-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-maxLength-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-maxLength-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-maxLength-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList5 = [ITRes4|ITResList4],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-maxLength-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-maxLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-maxLength-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-maxLength-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-maxLength-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-maxLength-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList10 = [ITRes9|ITResList9],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-maxLength-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-maxLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-maxLength-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-maxLength-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-maxLength-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-maxLength-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList15 = [ITRes14|ITResList14],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-maxLength-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-maxLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-maxLength-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-maxLength-5-2.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-maxLength-5-3.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-maxLength-5-4.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList20 = [ITRes19|ITResList19],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-maxLength-5-5.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-minLength-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-minLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-minLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-minLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-minLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-5-2.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList43 = [ITRes42|ITResList42],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-5-3.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-5-4.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-minLength-5-5.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList46 = [ITRes45|ITResList45],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-length-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-length-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList47 = [ITRes46|ITResList46],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-length-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-length-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-length-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-length-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-length-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-length-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList52 = [ITRes51|ITResList51],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-length-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-length-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-length-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-length-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-length-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-length-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList57 = [ITRes56|ITResList56],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-length-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-length-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-length-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-length-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-length-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-length-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList62 = [ITRes61|ITResList61],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-length-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-length-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-length-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList64 = [ITRes63|ITResList63],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-length-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-length-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-length-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList67 = [ITRes66|ITResList66],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList69 = [ITRes68|ITResList68],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList72 = [ITRes71|ITResList71],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList74 = [ITRes73|ITResList73],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList77 = [ITRes76|ITResList76],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList79 = [ITRes78|ITResList78],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList82 = [ITRes81|ITResList81],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList84 = [ITRes83|ITResList83],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList87 = [ITRes86|ITResList86],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList89 = [ITRes88|ITResList88],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList92 = [ITRes91|ITResList91],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList94 = [ITRes93|ITResList93],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList97 = [ITRes96|ITResList96],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList99 = [ITRes98|ITResList98],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList102 = [ITRes101|ITResList101],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList104 = [ITRes103|ITResList103],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList107 = [ITRes106|ITResList106],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList109 = [ITRes108|ITResList108],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList112 = [ITRes111|ITResList111],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList114 = [ITRes113|ITResList113],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList117 = [ITRes116|ITResList116],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList119 = [ITRes118|ITResList118],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList122 = [ITRes121|ITResList121],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-whiteSpace-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-whiteSpace-2-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-whiteSpace-2-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList124 = [ITRes123|ITResList123],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-whiteSpace-2-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-whiteSpace-2-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-whiteSpace-2-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList127 = [ITRes126|ITResList126],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-string-whiteSpace-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-whiteSpace-3-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-whiteSpace-3-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList129 = [ITRes128|ITResList128],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-whiteSpace-3-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-whiteSpace-3-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-string-whiteSpace-3-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList132 = [ITRes131|ITResList131],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList28,ITResList132).
+
+%% Data type derived by restriction of time by facets
+
+'NISTSchema-time'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-time-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList136 = [ITRes135|ITResList135],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList137 = [ITRes136|ITResList136],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList138 = [ITRes137|ITResList137],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-time-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList31,ITResList139).
+
+%% Data type derived by restriction of token by facets
+
+'NISTSchema-token'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-maxLength-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-maxLength-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-maxLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-maxLength-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-maxLength-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-maxLength-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-maxLength-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList5 = [ITRes4|ITResList4],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-maxLength-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-maxLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-maxLength-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-maxLength-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-maxLength-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-maxLength-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList10 = [ITRes9|ITResList9],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-maxLength-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-maxLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-maxLength-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-maxLength-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-maxLength-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-maxLength-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList15 = [ITRes14|ITResList14],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-maxLength-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-maxLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-maxLength-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-maxLength-5-2.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-maxLength-5-3.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-maxLength-5-4.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList20 = [ITRes19|ITResList19],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-maxLength-5-5.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-minLength-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-minLength-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-minLength-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-minLength-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-minLength-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-5-2.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList43 = [ITRes42|ITResList42],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-5-3.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-5-4.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-minLength-5-5.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList46 = [ITRes45|ITResList45],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-length-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-length-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList47 = [ITRes46|ITResList46],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-length-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-length-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-length-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-length-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-length-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-length-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList52 = [ITRes51|ITResList51],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-length-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-length-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-length-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-length-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-length-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-length-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList57 = [ITRes56|ITResList56],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-length-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-length-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-length-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-length-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-length-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-length-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList62 = [ITRes61|ITResList61],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-length-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-length-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-length-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList64 = [ITRes63|ITResList63],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-length-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-length-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-length-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList67 = [ITRes66|ITResList66],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList69 = [ITRes68|ITResList68],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList72 = [ITRes71|ITResList71],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList74 = [ITRes73|ITResList73],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList77 = [ITRes76|ITResList76],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList79 = [ITRes78|ITResList78],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList82 = [ITRes81|ITResList81],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList84 = [ITRes83|ITResList83],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList87 = [ITRes86|ITResList86],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList89 = [ITRes88|ITResList88],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList92 = [ITRes91|ITResList91],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList94 = [ITRes93|ITResList93],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList97 = [ITRes96|ITResList96],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList99 = [ITRes98|ITResList98],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList102 = [ITRes101|ITResList101],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList104 = [ITRes103|ITResList103],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList107 = [ITRes106|ITResList106],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList109 = [ITRes108|ITResList108],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList112 = [ITRes111|ITResList111],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList114 = [ITRes113|ITResList113],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList117 = [ITRes116|ITResList116],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-token-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList119 = [ITRes118|ITResList118],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-token-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList122 = [ITRes121|ITResList121],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList26,ITResList122).
+
+%% Data type derived by restriction of unsignedByte by facets
+
+'NISTSchema-unsignedByte'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-fractionDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-fractionDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-fractionDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-fractionDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-fractionDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-fractionDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-totalDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-totalDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-totalDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-totalDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-totalDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-totalDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-totalDigits-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-totalDigits-2-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-totalDigits-2-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-totalDigits-2-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-totalDigits-2-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-totalDigits-2-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-totalDigits-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-totalDigits-3-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-totalDigits-3-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-totalDigits-3-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-totalDigits-3-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-totalDigits-3-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList136 = [ITRes135|ITResList135],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList137 = [ITRes136|ITResList136],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList138 = [ITRes137|ITResList137],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ ?line {STRes31,S31} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList32 = [STRes31|STResList31],
+ ?line ITRes139 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList140 = [ITRes139|ITResList139],
+ ?line ITRes140 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList141 = [ITRes140|ITResList140],
+ ?line ITRes141 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList142 = [ITRes141|ITResList141],
+ ?line ITRes142 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList143 = [ITRes142|ITResList142],
+ ?line ITRes143 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList144 = [ITRes143|ITResList143],
+
+
+ ?line {STRes32,S32} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedByte-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList33 = [STRes32|STResList32],
+ ?line ITRes144 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList145 = [ITRes144|ITResList144],
+ ?line ITRes145 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList146 = [ITRes145|ITResList145],
+ ?line ITRes146 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList147 = [ITRes146|ITResList146],
+ ?line ITRes147 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList148 = [ITRes147|ITResList147],
+ ?line ITRes148 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedByte-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList149 = [ITRes148|ITResList148],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList33,ITResList149).
+
+%% Data type derived by restriction of unsignedInt by facets
+
+'NISTSchema-unsignedInt'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-fractionDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-fractionDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-fractionDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-fractionDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-fractionDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-fractionDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-totalDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-totalDigits-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-2-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-2-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-2-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-2-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-2-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-totalDigits-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-3-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-3-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-3-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-3-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-3-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-totalDigits-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-4-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-4-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-4-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-4-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-4-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-totalDigits-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-5-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-5-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-5-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-5-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-totalDigits-5-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList136 = [ITRes135|ITResList135],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList137 = [ITRes136|ITResList136],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList138 = [ITRes137|ITResList137],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ ?line {STRes31,S31} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList32 = [STRes31|STResList31],
+ ?line ITRes139 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList140 = [ITRes139|ITResList139],
+ ?line ITRes140 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList141 = [ITRes140|ITResList140],
+ ?line ITRes141 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList142 = [ITRes141|ITResList141],
+ ?line ITRes142 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList143 = [ITRes142|ITResList142],
+ ?line ITRes143 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList144 = [ITRes143|ITResList143],
+
+
+ ?line {STRes32,S32} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList33 = [STRes32|STResList32],
+ ?line ITRes144 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList145 = [ITRes144|ITResList144],
+ ?line ITRes145 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList146 = [ITRes145|ITResList145],
+ ?line ITRes146 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList147 = [ITRes146|ITResList146],
+ ?line ITRes147 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList148 = [ITRes147|ITResList147],
+ ?line ITRes148 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList149 = [ITRes148|ITResList148],
+
+
+ ?line {STRes33,S33} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList34 = [STRes33|STResList33],
+ ?line ITRes149 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList150 = [ITRes149|ITResList149],
+ ?line ITRes150 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList151 = [ITRes150|ITResList150],
+ ?line ITRes151 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList152 = [ITRes151|ITResList151],
+ ?line ITRes152 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList153 = [ITRes152|ITResList152],
+ ?line ITRes153 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList154 = [ITRes153|ITResList153],
+
+
+ ?line {STRes34,S34} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList35 = [STRes34|STResList34],
+ ?line ITRes154 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList155 = [ITRes154|ITResList154],
+ ?line ITRes155 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList156 = [ITRes155|ITResList155],
+ ?line ITRes156 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList157 = [ITRes156|ITResList156],
+ ?line ITRes157 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList158 = [ITRes157|ITResList157],
+ ?line ITRes158 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList159 = [ITRes158|ITResList158],
+
+
+ ?line {STRes35,S35} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList36 = [STRes35|STResList35],
+ ?line ITRes159 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList160 = [ITRes159|ITResList159],
+ ?line ITRes160 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList161 = [ITRes160|ITResList160],
+ ?line ITRes161 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList162 = [ITRes161|ITResList161],
+ ?line ITRes162 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList163 = [ITRes162|ITResList162],
+ ?line ITRes163 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList164 = [ITRes163|ITResList163],
+
+
+ ?line {STRes36,S36} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedInt-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList37 = [STRes36|STResList36],
+ ?line ITRes164 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList165 = [ITRes164|ITResList164],
+ ?line ITRes165 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList166 = [ITRes165|ITResList165],
+ ?line ITRes166 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList167 = [ITRes166|ITResList166],
+ ?line ITRes167 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList168 = [ITRes167|ITResList167],
+ ?line ITRes168 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedInt-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList169 = [ITRes168|ITResList168],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList37,ITResList169).
+
+%% Data type derived by restriction of unsignedLong by facets
+
+'NISTSchema-unsignedLong'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-fractionDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-fractionDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-fractionDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-fractionDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-fractionDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-fractionDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-totalDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-totalDigits-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-2-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-2-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-2-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-2-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-2-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-totalDigits-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-3-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-3-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-3-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-3-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-3-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-totalDigits-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-4-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-4-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-4-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-4-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-4-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-totalDigits-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-5-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-5-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-5-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-5-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-totalDigits-5-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList136 = [ITRes135|ITResList135],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList137 = [ITRes136|ITResList136],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList138 = [ITRes137|ITResList137],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ ?line {STRes31,S31} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList32 = [STRes31|STResList31],
+ ?line ITRes139 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList140 = [ITRes139|ITResList139],
+ ?line ITRes140 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList141 = [ITRes140|ITResList140],
+ ?line ITRes141 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList142 = [ITRes141|ITResList141],
+ ?line ITRes142 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList143 = [ITRes142|ITResList142],
+ ?line ITRes143 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList144 = [ITRes143|ITResList143],
+
+
+ ?line {STRes32,S32} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList33 = [STRes32|STResList32],
+ ?line ITRes144 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList145 = [ITRes144|ITResList144],
+ ?line ITRes145 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList146 = [ITRes145|ITResList145],
+ ?line ITRes146 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList147 = [ITRes146|ITResList146],
+ ?line ITRes147 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList148 = [ITRes147|ITResList147],
+ ?line ITRes148 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList149 = [ITRes148|ITResList148],
+
+
+ ?line {STRes33,S33} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList34 = [STRes33|STResList33],
+ ?line ITRes149 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList150 = [ITRes149|ITResList149],
+ ?line ITRes150 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList151 = [ITRes150|ITResList150],
+ ?line ITRes151 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList152 = [ITRes151|ITResList151],
+ ?line ITRes152 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList153 = [ITRes152|ITResList152],
+ ?line ITRes153 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList154 = [ITRes153|ITResList153],
+
+
+ ?line {STRes34,S34} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList35 = [STRes34|STResList34],
+ ?line ITRes154 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList155 = [ITRes154|ITResList154],
+ ?line ITRes155 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList156 = [ITRes155|ITResList155],
+ ?line ITRes156 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList157 = [ITRes156|ITResList156],
+ ?line ITRes157 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList158 = [ITRes157|ITResList157],
+ ?line ITRes158 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList159 = [ITRes158|ITResList158],
+
+
+ ?line {STRes35,S35} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList36 = [STRes35|STResList35],
+ ?line ITRes159 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList160 = [ITRes159|ITResList159],
+ ?line ITRes160 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList161 = [ITRes160|ITResList160],
+ ?line ITRes161 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList162 = [ITRes161|ITResList161],
+ ?line ITRes162 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList163 = [ITRes162|ITResList162],
+ ?line ITRes163 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList164 = [ITRes163|ITResList163],
+
+
+ ?line {STRes36,S36} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedLong-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList37 = [STRes36|STResList36],
+ ?line ITRes164 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList165 = [ITRes164|ITResList164],
+ ?line ITRes165 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList166 = [ITRes165|ITResList165],
+ ?line ITRes166 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList167 = [ITRes166|ITResList166],
+ ?line ITRes167 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList168 = [ITRes167|ITResList167],
+ ?line ITRes168 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedLong-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList169 = [ITRes168|ITResList168],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList37,ITResList169).
+
+%% Data type derived by restriction of unsignedShort by facets
+
+'NISTSchema-unsignedShort'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-minExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minExclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minExclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minExclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minExclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ ?line {STRes1,S1} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-minExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList2 = [STRes1|STResList1],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S1),
+ ITResList10 = [ITRes9|ITResList9],
+
+
+ ?line {STRes2,S2} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-minExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList3 = [STRes2|STResList2],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S2),
+ ITResList15 = [ITRes14|ITResList14],
+
+
+ ?line {STRes3,S3} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-minExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList4 = [STRes3|STResList3],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S3),
+ ITResList20 = [ITRes19|ITResList19],
+
+
+ ?line {STRes4,S4} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-minExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList5 = [STRes4|STResList4],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S4),
+ ITResList21 = [ITRes20|ITResList20],
+
+
+ ?line {STRes5,S5} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-minInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList6 = [STRes5|STResList5],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minInclusive-1-2.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minInclusive-1-3.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minInclusive-1-4.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minInclusive-1-5.xml','./nisttest/NISTTestsAll',valid,S5),
+ ITResList26 = [ITRes25|ITResList25],
+
+
+ ?line {STRes6,S6} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-minInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList7 = [STRes6|STResList6],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S6),
+ ITResList31 = [ITRes30|ITResList30],
+
+
+ ?line {STRes7,S7} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-minInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList8 = [STRes7|STResList7],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList34 = [ITRes33|ITResList33],
+ ?line ITRes34 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList35 = [ITRes34|ITResList34],
+ ?line ITRes35 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S7),
+ ITResList36 = [ITRes35|ITResList35],
+
+
+ ?line {STRes8,S8} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-minInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList9 = [STRes8|STResList8],
+ ?line ITRes36 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList37 = [ITRes36|ITResList36],
+ ?line ITRes37 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList38 = [ITRes37|ITResList37],
+ ?line ITRes38 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList39 = [ITRes38|ITResList38],
+ ?line ITRes39 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList40 = [ITRes39|ITResList39],
+ ?line ITRes40 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S8),
+ ITResList41 = [ITRes40|ITResList40],
+
+
+ ?line {STRes9,S9} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-minInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList10 = [STRes9|STResList9],
+ ?line ITRes41 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-minInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S9),
+ ITResList42 = [ITRes41|ITResList41],
+
+
+ ?line {STRes10,S10} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-maxExclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList11 = [STRes10|STResList10],
+ ?line ITRes42 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxExclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S10),
+ ITResList43 = [ITRes42|ITResList42],
+
+
+ ?line {STRes11,S11} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-maxExclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList12 = [STRes11|STResList11],
+ ?line ITRes43 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxExclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList44 = [ITRes43|ITResList43],
+ ?line ITRes44 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxExclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList45 = [ITRes44|ITResList44],
+ ?line ITRes45 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxExclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList46 = [ITRes45|ITResList45],
+ ?line ITRes46 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxExclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList47 = [ITRes46|ITResList46],
+ ?line ITRes47 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxExclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S11),
+ ITResList48 = [ITRes47|ITResList47],
+
+
+ ?line {STRes12,S12} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-maxExclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList13 = [STRes12|STResList12],
+ ?line ITRes48 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxExclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList49 = [ITRes48|ITResList48],
+ ?line ITRes49 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxExclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList50 = [ITRes49|ITResList49],
+ ?line ITRes50 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxExclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList51 = [ITRes50|ITResList50],
+ ?line ITRes51 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxExclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList52 = [ITRes51|ITResList51],
+ ?line ITRes52 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxExclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S12),
+ ITResList53 = [ITRes52|ITResList52],
+
+
+ ?line {STRes13,S13} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-maxExclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList14 = [STRes13|STResList13],
+ ?line ITRes53 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxExclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList54 = [ITRes53|ITResList53],
+ ?line ITRes54 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxExclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList55 = [ITRes54|ITResList54],
+ ?line ITRes55 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxExclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList56 = [ITRes55|ITResList55],
+ ?line ITRes56 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxExclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList57 = [ITRes56|ITResList56],
+ ?line ITRes57 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxExclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S13),
+ ITResList58 = [ITRes57|ITResList57],
+
+
+ ?line {STRes14,S14} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-maxExclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList15 = [STRes14|STResList14],
+ ?line ITRes58 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxExclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList59 = [ITRes58|ITResList58],
+ ?line ITRes59 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxExclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList60 = [ITRes59|ITResList59],
+ ?line ITRes60 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxExclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList61 = [ITRes60|ITResList60],
+ ?line ITRes61 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxExclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList62 = [ITRes61|ITResList61],
+ ?line ITRes62 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxExclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S14),
+ ITResList63 = [ITRes62|ITResList62],
+
+
+ ?line {STRes15,S15} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-maxInclusive-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList16 = [STRes15|STResList15],
+ ?line ITRes63 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxInclusive-1-1.xml','./nisttest/NISTTestsAll',valid,S15),
+ ITResList64 = [ITRes63|ITResList63],
+
+
+ ?line {STRes16,S16} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-maxInclusive-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList17 = [STRes16|STResList16],
+ ?line ITRes64 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxInclusive-2-1.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList65 = [ITRes64|ITResList64],
+ ?line ITRes65 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxInclusive-2-2.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList66 = [ITRes65|ITResList65],
+ ?line ITRes66 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxInclusive-2-3.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList67 = [ITRes66|ITResList66],
+ ?line ITRes67 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxInclusive-2-4.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList68 = [ITRes67|ITResList67],
+ ?line ITRes68 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxInclusive-2-5.xml','./nisttest/NISTTestsAll',valid,S16),
+ ITResList69 = [ITRes68|ITResList68],
+
+
+ ?line {STRes17,S17} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-maxInclusive-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList18 = [STRes17|STResList17],
+ ?line ITRes69 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxInclusive-3-1.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList70 = [ITRes69|ITResList69],
+ ?line ITRes70 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxInclusive-3-2.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList71 = [ITRes70|ITResList70],
+ ?line ITRes71 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxInclusive-3-3.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList72 = [ITRes71|ITResList71],
+ ?line ITRes72 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxInclusive-3-4.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList73 = [ITRes72|ITResList72],
+ ?line ITRes73 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxInclusive-3-5.xml','./nisttest/NISTTestsAll',valid,S17),
+ ITResList74 = [ITRes73|ITResList73],
+
+
+ ?line {STRes18,S18} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-maxInclusive-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList19 = [STRes18|STResList18],
+ ?line ITRes74 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxInclusive-4-1.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList75 = [ITRes74|ITResList74],
+ ?line ITRes75 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxInclusive-4-2.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList76 = [ITRes75|ITResList75],
+ ?line ITRes76 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxInclusive-4-3.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList77 = [ITRes76|ITResList76],
+ ?line ITRes77 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxInclusive-4-4.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList78 = [ITRes77|ITResList77],
+ ?line ITRes78 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxInclusive-4-5.xml','./nisttest/NISTTestsAll',valid,S18),
+ ITResList79 = [ITRes78|ITResList78],
+
+
+ ?line {STRes19,S19} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-maxInclusive-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList20 = [STRes19|STResList19],
+ ?line ITRes79 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxInclusive-5-1.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList80 = [ITRes79|ITResList79],
+ ?line ITRes80 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxInclusive-5-2.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList81 = [ITRes80|ITResList80],
+ ?line ITRes81 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxInclusive-5-3.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList82 = [ITRes81|ITResList81],
+ ?line ITRes82 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxInclusive-5-4.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList83 = [ITRes82|ITResList82],
+ ?line ITRes83 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-maxInclusive-5-5.xml','./nisttest/NISTTestsAll',valid,S19),
+ ITResList84 = [ITRes83|ITResList83],
+
+
+ ?line {STRes20,S20} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-fractionDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList21 = [STRes20|STResList20],
+ ?line ITRes84 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-fractionDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList85 = [ITRes84|ITResList84],
+ ?line ITRes85 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-fractionDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList86 = [ITRes85|ITResList85],
+ ?line ITRes86 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-fractionDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList87 = [ITRes86|ITResList86],
+ ?line ITRes87 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-fractionDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList88 = [ITRes87|ITResList87],
+ ?line ITRes88 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-fractionDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S20),
+ ITResList89 = [ITRes88|ITResList88],
+
+
+ ?line {STRes21,S21} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-totalDigits-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList22 = [STRes21|STResList21],
+ ?line ITRes89 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-1-1.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList90 = [ITRes89|ITResList89],
+ ?line ITRes90 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-1-2.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList91 = [ITRes90|ITResList90],
+ ?line ITRes91 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-1-3.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList92 = [ITRes91|ITResList91],
+ ?line ITRes92 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-1-4.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList93 = [ITRes92|ITResList92],
+ ?line ITRes93 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-1-5.xml','./nisttest/NISTTestsAll',valid,S21),
+ ITResList94 = [ITRes93|ITResList93],
+
+
+ ?line {STRes22,S22} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-totalDigits-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList23 = [STRes22|STResList22],
+ ?line ITRes94 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-2-1.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList95 = [ITRes94|ITResList94],
+ ?line ITRes95 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-2-2.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList96 = [ITRes95|ITResList95],
+ ?line ITRes96 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-2-3.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList97 = [ITRes96|ITResList96],
+ ?line ITRes97 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-2-4.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList98 = [ITRes97|ITResList97],
+ ?line ITRes98 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-2-5.xml','./nisttest/NISTTestsAll',valid,S22),
+ ITResList99 = [ITRes98|ITResList98],
+
+
+ ?line {STRes23,S23} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-totalDigits-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList24 = [STRes23|STResList23],
+ ?line ITRes99 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-3-1.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList100 = [ITRes99|ITResList99],
+ ?line ITRes100 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-3-2.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList101 = [ITRes100|ITResList100],
+ ?line ITRes101 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-3-3.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList102 = [ITRes101|ITResList101],
+ ?line ITRes102 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-3-4.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList103 = [ITRes102|ITResList102],
+ ?line ITRes103 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-3-5.xml','./nisttest/NISTTestsAll',valid,S23),
+ ITResList104 = [ITRes103|ITResList103],
+
+
+ ?line {STRes24,S24} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-totalDigits-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList25 = [STRes24|STResList24],
+ ?line ITRes104 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-4-1.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList105 = [ITRes104|ITResList104],
+ ?line ITRes105 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-4-2.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList106 = [ITRes105|ITResList105],
+ ?line ITRes106 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-4-3.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList107 = [ITRes106|ITResList106],
+ ?line ITRes107 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-4-4.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList108 = [ITRes107|ITResList107],
+ ?line ITRes108 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-4-5.xml','./nisttest/NISTTestsAll',valid,S24),
+ ITResList109 = [ITRes108|ITResList108],
+
+
+ ?line {STRes25,S25} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-totalDigits-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList26 = [STRes25|STResList25],
+ ?line ITRes109 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-5-1.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList110 = [ITRes109|ITResList109],
+ ?line ITRes110 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-5-2.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList111 = [ITRes110|ITResList110],
+ ?line ITRes111 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-5-3.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList112 = [ITRes111|ITResList111],
+ ?line ITRes112 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-5-4.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList113 = [ITRes112|ITResList112],
+ ?line ITRes113 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-totalDigits-5-5.xml','./nisttest/NISTTestsAll',valid,S25),
+ ITResList114 = [ITRes113|ITResList113],
+
+
+ ?line {STRes26,S26} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-pattern-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList27 = [STRes26|STResList26],
+ ?line ITRes114 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-1-1.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList115 = [ITRes114|ITResList114],
+ ?line ITRes115 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-1-2.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList116 = [ITRes115|ITResList115],
+ ?line ITRes116 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-1-3.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList117 = [ITRes116|ITResList116],
+ ?line ITRes117 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-1-4.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList118 = [ITRes117|ITResList117],
+ ?line ITRes118 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-1-5.xml','./nisttest/NISTTestsAll',valid,S26),
+ ITResList119 = [ITRes118|ITResList118],
+
+
+ ?line {STRes27,S27} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-pattern-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList28 = [STRes27|STResList27],
+ ?line ITRes119 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-2-1.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList120 = [ITRes119|ITResList119],
+ ?line ITRes120 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-2-2.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList121 = [ITRes120|ITResList120],
+ ?line ITRes121 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-2-3.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList122 = [ITRes121|ITResList121],
+ ?line ITRes122 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-2-4.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList123 = [ITRes122|ITResList122],
+ ?line ITRes123 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-2-5.xml','./nisttest/NISTTestsAll',valid,S27),
+ ITResList124 = [ITRes123|ITResList123],
+
+
+ ?line {STRes28,S28} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-pattern-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList29 = [STRes28|STResList28],
+ ?line ITRes124 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-3-1.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList125 = [ITRes124|ITResList124],
+ ?line ITRes125 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-3-2.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList126 = [ITRes125|ITResList125],
+ ?line ITRes126 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-3-3.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList127 = [ITRes126|ITResList126],
+ ?line ITRes127 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-3-4.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList128 = [ITRes127|ITResList127],
+ ?line ITRes128 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-3-5.xml','./nisttest/NISTTestsAll',valid,S28),
+ ITResList129 = [ITRes128|ITResList128],
+
+
+ ?line {STRes29,S29} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-pattern-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList30 = [STRes29|STResList29],
+ ?line ITRes129 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-4-1.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList130 = [ITRes129|ITResList129],
+ ?line ITRes130 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-4-2.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList131 = [ITRes130|ITResList130],
+ ?line ITRes131 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-4-3.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList132 = [ITRes131|ITResList131],
+ ?line ITRes132 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-4-4.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList133 = [ITRes132|ITResList132],
+ ?line ITRes133 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-4-5.xml','./nisttest/NISTTestsAll',valid,S29),
+ ITResList134 = [ITRes133|ITResList133],
+
+
+ ?line {STRes30,S30} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-pattern-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList31 = [STRes30|STResList30],
+ ?line ITRes134 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-5-1.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList135 = [ITRes134|ITResList134],
+ ?line ITRes135 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-5-2.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList136 = [ITRes135|ITResList135],
+ ?line ITRes136 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-5-3.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList137 = [ITRes136|ITResList136],
+ ?line ITRes137 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-5-4.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList138 = [ITRes137|ITResList137],
+ ?line ITRes138 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-pattern-5-5.xml','./nisttest/NISTTestsAll',valid,S30),
+ ITResList139 = [ITRes138|ITResList138],
+
+
+ ?line {STRes31,S31} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-enumeration-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList32 = [STRes31|STResList31],
+ ?line ITRes139 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-1-1.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList140 = [ITRes139|ITResList139],
+ ?line ITRes140 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-1-2.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList141 = [ITRes140|ITResList140],
+ ?line ITRes141 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-1-3.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList142 = [ITRes141|ITResList141],
+ ?line ITRes142 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-1-4.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList143 = [ITRes142|ITResList142],
+ ?line ITRes143 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-1-5.xml','./nisttest/NISTTestsAll',valid,S31),
+ ITResList144 = [ITRes143|ITResList143],
+
+
+ ?line {STRes32,S32} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-enumeration-2.xsd','./nisttest/NISTTestsAll',valid),
+ STResList33 = [STRes32|STResList32],
+ ?line ITRes144 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-2-1.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList145 = [ITRes144|ITResList144],
+ ?line ITRes145 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-2-2.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList146 = [ITRes145|ITResList145],
+ ?line ITRes146 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-2-3.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList147 = [ITRes146|ITResList146],
+ ?line ITRes147 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-2-4.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList148 = [ITRes147|ITResList147],
+ ?line ITRes148 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-2-5.xml','./nisttest/NISTTestsAll',valid,S32),
+ ITResList149 = [ITRes148|ITResList148],
+
+
+ ?line {STRes33,S33} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-enumeration-3.xsd','./nisttest/NISTTestsAll',valid),
+ STResList34 = [STRes33|STResList33],
+ ?line ITRes149 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-3-1.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList150 = [ITRes149|ITResList149],
+ ?line ITRes150 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-3-2.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList151 = [ITRes150|ITResList150],
+ ?line ITRes151 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-3-3.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList152 = [ITRes151|ITResList151],
+ ?line ITRes152 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-3-4.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList153 = [ITRes152|ITResList152],
+ ?line ITRes153 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-3-5.xml','./nisttest/NISTTestsAll',valid,S33),
+ ITResList154 = [ITRes153|ITResList153],
+
+
+ ?line {STRes34,S34} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-enumeration-4.xsd','./nisttest/NISTTestsAll',valid),
+ STResList35 = [STRes34|STResList34],
+ ?line ITRes154 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-4-1.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList155 = [ITRes154|ITResList154],
+ ?line ITRes155 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-4-2.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList156 = [ITRes155|ITResList155],
+ ?line ITRes156 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-4-3.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList157 = [ITRes156|ITResList156],
+ ?line ITRes157 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-4-4.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList158 = [ITRes157|ITResList157],
+ ?line ITRes158 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-4-5.xml','./nisttest/NISTTestsAll',valid,S34),
+ ITResList159 = [ITRes158|ITResList158],
+
+
+ ?line {STRes35,S35} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-enumeration-5.xsd','./nisttest/NISTTestsAll',valid),
+ STResList36 = [STRes35|STResList35],
+ ?line ITRes159 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-5-1.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList160 = [ITRes159|ITResList159],
+ ?line ITRes160 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-5-2.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList161 = [ITRes160|ITResList160],
+ ?line ITRes161 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-5-3.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList162 = [ITRes161|ITResList161],
+ ?line ITRes162 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-5-4.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList163 = [ITRes162|ITResList162],
+ ?line ITRes163 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-enumeration-5-5.xml','./nisttest/NISTTestsAll',valid,S35),
+ ITResList164 = [ITRes163|ITResList163],
+
+
+ ?line {STRes36,S36} = xmerl_xsd_lib:schema_test(Config,'./nisttest/NISTTestsAll/NISTSchema-unsignedShort-whiteSpace-1.xsd','./nisttest/NISTTestsAll',valid),
+ STResList37 = [STRes36|STResList36],
+ ?line ITRes164 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-whiteSpace-1-1.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList165 = [ITRes164|ITResList164],
+ ?line ITRes165 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-whiteSpace-1-2.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList166 = [ITRes165|ITResList165],
+ ?line ITRes166 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-whiteSpace-1-3.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList167 = [ITRes166|ITResList166],
+ ?line ITRes167 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-whiteSpace-1-4.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList168 = [ITRes167|ITResList167],
+ ?line ITRes168 = xmerl_xsd_lib:instance_test(Config,'./nisttest/NISTTestsAll/NISTXML-unsignedShort-whiteSpace-1-5.xml','./nisttest/NISTTestsAll',valid,S36),
+ ITResList169 = [ITRes168|ITResList168],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList37,ITResList169).
+
diff --git a/lib/xmerl/test/xmerl_xsd_NIST2002-01-16_SUITE_data/nist_failed_cases.log b/lib/xmerl/test/xmerl_xsd_NIST2002-01-16_SUITE_data/nist_failed_cases.log
new file mode 100644
index 0000000000..e10b6463fe
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_NIST2002-01-16_SUITE_data/nist_failed_cases.log
@@ -0,0 +1,894 @@
+{'NISTSchema-anyURI',{["NISTXML-anyURI-maxLength-1-5.xml",
+ "NISTXML-anyURI-maxLength-1-4.xml",
+ "NISTXML-anyURI-maxLength-1-3.xml",
+ "NISTXML-anyURI-maxLength-1-2.xml",
+ "NISTXML-anyURI-maxLength-1-1.xml"],["NISTSchema-anyURI-maxLength-1.xsd"]}}.
+{'NISTSchema-base64Binary',{["NISTXML-base64Binary-length-5-5.xml",
+ "NISTXML-base64Binary-length-5-4.xml",
+ "NISTXML-base64Binary-length-5-3.xml",
+ "NISTXML-base64Binary-length-5-2.xml",
+ "NISTXML-base64Binary-length-5-1.xml",
+ "NISTXML-base64Binary-length-4-5.xml",
+ "NISTXML-base64Binary-length-4-4.xml",
+ "NISTXML-base64Binary-length-4-3.xml",
+ "NISTXML-base64Binary-length-4-2.xml",
+ "NISTXML-base64Binary-length-4-1.xml",
+ "NISTXML-base64Binary-length-3-5.xml",
+ "NISTXML-base64Binary-length-3-4.xml",
+ "NISTXML-base64Binary-length-3-3.xml",
+ "NISTXML-base64Binary-length-3-2.xml",
+ "NISTXML-base64Binary-length-3-1.xml",
+ "NISTXML-base64Binary-length-2-5.xml",
+ "NISTXML-base64Binary-length-2-4.xml",
+ "NISTXML-base64Binary-length-2-3.xml",
+ "NISTXML-base64Binary-length-2-2.xml",
+ "NISTXML-base64Binary-length-2-1.xml",
+ "NISTXML-base64Binary-length-1-5.xml",
+ "NISTXML-base64Binary-length-1-4.xml",
+ "NISTXML-base64Binary-length-1-3.xml",
+ "NISTXML-base64Binary-length-1-2.xml",
+ "NISTXML-base64Binary-length-1-1.xml",
+ "NISTXML-base64Binary-maxLength-5-5.xml",
+ "NISTXML-base64Binary-maxLength-5-4.xml",
+ "NISTXML-base64Binary-maxLength-4-5.xml",
+ "NISTXML-base64Binary-maxLength-4-4.xml",
+ "NISTXML-base64Binary-maxLength-3-5.xml",
+ "NISTXML-base64Binary-maxLength-3-4.xml",
+ "NISTXML-base64Binary-maxLength-2-5.xml",
+ "NISTXML-base64Binary-maxLength-2-4.xml",
+ "NISTXML-base64Binary-maxLength-1-5.xml",
+ "NISTXML-base64Binary-maxLength-1-4.xml",
+ "NISTXML-base64Binary-maxLength-1-3.xml",
+ "NISTXML-base64Binary-maxLength-1-2.xml",
+ "NISTXML-base64Binary-maxLength-1-1.xml"],[]}}.
+{'NISTSchema-date-',{["NISTXML-date-maxInclusive-5-5.xml",
+ "NISTXML-date-maxInclusive-5-4.xml",
+ "NISTXML-date-maxInclusive-5-3.xml",
+ "NISTXML-date-maxInclusive-5-2.xml",
+ "NISTXML-date-maxInclusive-5-1.xml",
+ "NISTXML-date-maxInclusive-4-5.xml",
+ "NISTXML-date-maxInclusive-4-4.xml",
+ "NISTXML-date-maxInclusive-4-3.xml",
+ "NISTXML-date-maxInclusive-4-2.xml",
+ "NISTXML-date-maxInclusive-4-1.xml",
+ "NISTXML-date-maxInclusive-3-5.xml",
+ "NISTXML-date-maxInclusive-3-4.xml",
+ "NISTXML-date-maxInclusive-3-3.xml",
+ "NISTXML-date-maxInclusive-3-2.xml",
+ "NISTXML-date-maxInclusive-3-1.xml",
+ "NISTXML-date-maxInclusive-2-5.xml",
+ "NISTXML-date-maxInclusive-2-4.xml",
+ "NISTXML-date-maxInclusive-2-3.xml",
+ "NISTXML-date-maxInclusive-2-2.xml",
+ "NISTXML-date-maxInclusive-2-1.xml",
+ "NISTXML-date-maxInclusive-1-1.xml",
+ "NISTXML-date-maxExclusive-5-5.xml",
+ "NISTXML-date-maxExclusive-5-4.xml",
+ "NISTXML-date-maxExclusive-5-3.xml",
+ "NISTXML-date-maxExclusive-5-2.xml",
+ "NISTXML-date-maxExclusive-5-1.xml",
+ "NISTXML-date-maxExclusive-4-5.xml",
+ "NISTXML-date-maxExclusive-4-4.xml",
+ "NISTXML-date-maxExclusive-4-3.xml",
+ "NISTXML-date-maxExclusive-4-2.xml",
+ "NISTXML-date-maxExclusive-4-1.xml",
+ "NISTXML-date-maxExclusive-3-5.xml",
+ "NISTXML-date-maxExclusive-3-4.xml",
+ "NISTXML-date-maxExclusive-3-3.xml",
+ "NISTXML-date-maxExclusive-3-2.xml",
+ "NISTXML-date-maxExclusive-3-1.xml",
+ "NISTXML-date-maxExclusive-2-5.xml",
+ "NISTXML-date-maxExclusive-2-4.xml",
+ "NISTXML-date-maxExclusive-2-3.xml",
+ "NISTXML-date-maxExclusive-2-2.xml",
+ "NISTXML-date-maxExclusive-2-1.xml",
+ "NISTXML-date-maxExclusive-1-1.xml",
+ "NISTXML-date-minInclusive-5-1.xml",
+ "NISTXML-date-minInclusive-4-5.xml",
+ "NISTXML-date-minInclusive-4-4.xml",
+ "NISTXML-date-minInclusive-4-3.xml",
+ "NISTXML-date-minInclusive-4-2.xml",
+ "NISTXML-date-minInclusive-4-1.xml",
+ "NISTXML-date-minInclusive-3-5.xml",
+ "NISTXML-date-minInclusive-3-4.xml",
+ "NISTXML-date-minInclusive-3-3.xml",
+ "NISTXML-date-minInclusive-3-2.xml",
+ "NISTXML-date-minInclusive-3-1.xml",
+ "NISTXML-date-minInclusive-2-5.xml",
+ "NISTXML-date-minInclusive-2-4.xml",
+ "NISTXML-date-minInclusive-2-3.xml",
+ "NISTXML-date-minInclusive-2-2.xml",
+ "NISTXML-date-minInclusive-2-1.xml",
+ "NISTXML-date-minInclusive-1-5.xml",
+ "NISTXML-date-minInclusive-1-4.xml",
+ "NISTXML-date-minInclusive-1-3.xml",
+ "NISTXML-date-minInclusive-1-2.xml",
+ "NISTXML-date-minInclusive-1-1.xml",
+ "NISTXML-date-minExclusive-5-1.xml",
+ "NISTXML-date-minExclusive-4-5.xml",
+ "NISTXML-date-minExclusive-4-4.xml",
+ "NISTXML-date-minExclusive-4-3.xml",
+ "NISTXML-date-minExclusive-4-2.xml",
+ "NISTXML-date-minExclusive-4-1.xml",
+ "NISTXML-date-minExclusive-3-5.xml",
+ "NISTXML-date-minExclusive-3-4.xml",
+ "NISTXML-date-minExclusive-3-3.xml",
+ "NISTXML-date-minExclusive-3-2.xml",
+ "NISTXML-date-minExclusive-3-1.xml",
+ "NISTXML-date-minExclusive-2-5.xml",
+ "NISTXML-date-minExclusive-2-4.xml",
+ "NISTXML-date-minExclusive-2-3.xml",
+ "NISTXML-date-minExclusive-2-2.xml",
+ "NISTXML-date-minExclusive-2-1.xml",
+ "NISTXML-date-minExclusive-1-5.xml",
+ "NISTXML-date-minExclusive-1-4.xml",
+ "NISTXML-date-minExclusive-1-3.xml",
+ "NISTXML-date-minExclusive-1-2.xml",
+ "NISTXML-date-minExclusive-1-1.xml"],[]}}.
+{'NISTSchema-decimal',{["NISTXML-decimal-maxExclusive-5-5.xml",
+ "NISTXML-decimal-maxExclusive-4-5.xml",
+ "NISTXML-decimal-maxExclusive-3-5.xml",
+ "NISTXML-decimal-maxExclusive-2-5.xml",
+ "NISTXML-decimal-maxExclusive-1-1.xml",
+ "NISTXML-decimal-minExclusive-5-1.xml",
+ "NISTXML-decimal-minExclusive-4-5.xml",
+ "NISTXML-decimal-minExclusive-4-4.xml",
+ "NISTXML-decimal-minExclusive-4-1.xml",
+ "NISTXML-decimal-minExclusive-3-1.xml",
+ "NISTXML-decimal-minExclusive-2-1.xml",
+ "NISTXML-decimal-minExclusive-1-1.xml"],[]}}.
+{'NISTSchema-double',{["NISTXML-double-maxInclusive-5-5.xml",
+ "NISTXML-double-maxInclusive-5-4.xml",
+ "NISTXML-double-maxInclusive-5-3.xml",
+ "NISTXML-double-maxInclusive-5-2.xml",
+ "NISTXML-double-maxInclusive-5-1.xml",
+ "NISTXML-double-maxInclusive-4-5.xml",
+ "NISTXML-double-maxInclusive-4-4.xml",
+ "NISTXML-double-maxInclusive-4-3.xml",
+ "NISTXML-double-maxInclusive-4-2.xml",
+ "NISTXML-double-maxInclusive-4-1.xml",
+ "NISTXML-double-maxInclusive-3-5.xml",
+ "NISTXML-double-maxInclusive-3-4.xml",
+ "NISTXML-double-maxInclusive-3-3.xml",
+ "NISTXML-double-maxInclusive-3-2.xml",
+ "NISTXML-double-maxInclusive-3-1.xml",
+ "NISTXML-double-maxInclusive-2-5.xml",
+ "NISTXML-double-maxInclusive-2-4.xml",
+ "NISTXML-double-maxInclusive-2-3.xml",
+ "NISTXML-double-maxInclusive-2-2.xml",
+ "NISTXML-double-maxInclusive-2-1.xml",
+ "NISTXML-double-maxExclusive-5-5.xml",
+ "NISTXML-double-maxExclusive-5-4.xml",
+ "NISTXML-double-maxExclusive-5-3.xml",
+ "NISTXML-double-maxExclusive-5-2.xml",
+ "NISTXML-double-maxExclusive-5-1.xml",
+ "NISTXML-double-maxExclusive-4-5.xml",
+ "NISTXML-double-maxExclusive-4-4.xml",
+ "NISTXML-double-maxExclusive-4-3.xml",
+ "NISTXML-double-maxExclusive-4-2.xml",
+ "NISTXML-double-maxExclusive-4-1.xml",
+ "NISTXML-double-maxExclusive-3-5.xml",
+ "NISTXML-double-maxExclusive-3-4.xml",
+ "NISTXML-double-maxExclusive-3-3.xml",
+ "NISTXML-double-maxExclusive-3-2.xml",
+ "NISTXML-double-maxExclusive-3-1.xml",
+ "NISTXML-double-maxExclusive-2-5.xml",
+ "NISTXML-double-maxExclusive-2-4.xml",
+ "NISTXML-double-maxExclusive-2-3.xml",
+ "NISTXML-double-maxExclusive-2-2.xml",
+ "NISTXML-double-maxExclusive-2-1.xml",
+ "NISTXML-double-maxExclusive-1-1.xml",
+ "NISTXML-double-minInclusive-4-5.xml",
+ "NISTXML-double-minInclusive-4-4.xml",
+ "NISTXML-double-minInclusive-4-3.xml",
+ "NISTXML-double-minInclusive-4-2.xml",
+ "NISTXML-double-minInclusive-3-5.xml",
+ "NISTXML-double-minInclusive-3-4.xml",
+ "NISTXML-double-minInclusive-3-3.xml",
+ "NISTXML-double-minInclusive-3-2.xml",
+ "NISTXML-double-minInclusive-2-5.xml",
+ "NISTXML-double-minInclusive-2-4.xml",
+ "NISTXML-double-minInclusive-2-3.xml",
+ "NISTXML-double-minInclusive-2-2.xml",
+ "NISTXML-double-minInclusive-1-5.xml",
+ "NISTXML-double-minInclusive-1-4.xml",
+ "NISTXML-double-minInclusive-1-3.xml",
+ "NISTXML-double-minInclusive-1-2.xml",
+ "NISTXML-double-minExclusive-5-1.xml",
+ "NISTXML-double-minExclusive-4-5.xml",
+ "NISTXML-double-minExclusive-4-4.xml",
+ "NISTXML-double-minExclusive-4-3.xml",
+ "NISTXML-double-minExclusive-3-5.xml",
+ "NISTXML-double-minExclusive-3-4.xml",
+ "NISTXML-double-minExclusive-3-3.xml",
+ "NISTXML-double-minExclusive-3-2.xml",
+ "NISTXML-double-minExclusive-3-1.xml",
+ "NISTXML-double-minExclusive-2-5.xml",
+ "NISTXML-double-minExclusive-2-4.xml",
+ "NISTXML-double-minExclusive-2-3.xml",
+ "NISTXML-double-minExclusive-2-2.xml",
+ "NISTXML-double-minExclusive-2-1.xml",
+ "NISTXML-double-minExclusive-1-5.xml",
+ "NISTXML-double-minExclusive-1-4.xml",
+ "NISTXML-double-minExclusive-1-3.xml",
+ "NISTXML-double-minExclusive-1-2.xml",
+ "NISTXML-double-minExclusive-1-1.xml"],[]}}.
+{'NISTSchema-gDay',{["NISTXML-gDay-maxInclusive-5-5.xml",
+ "NISTXML-gDay-maxInclusive-5-4.xml",
+ "NISTXML-gDay-maxInclusive-5-3.xml",
+ "NISTXML-gDay-maxInclusive-5-2.xml",
+ "NISTXML-gDay-maxInclusive-5-1.xml",
+ "NISTXML-gDay-maxInclusive-4-1.xml",
+ "NISTXML-gDay-maxInclusive-3-5.xml",
+ "NISTXML-gDay-maxInclusive-3-4.xml",
+ "NISTXML-gDay-maxInclusive-3-3.xml",
+ "NISTXML-gDay-maxInclusive-3-2.xml",
+ "NISTXML-gDay-maxInclusive-3-1.xml",
+ "NISTXML-gDay-maxInclusive-2-5.xml",
+ "NISTXML-gDay-maxInclusive-2-4.xml",
+ "NISTXML-gDay-maxInclusive-2-3.xml",
+ "NISTXML-gDay-maxInclusive-2-2.xml",
+ "NISTXML-gDay-maxInclusive-2-1.xml",
+ "NISTXML-gDay-maxInclusive-1-1.xml",
+ "NISTXML-gDay-maxExclusive-5-5.xml",
+ "NISTXML-gDay-maxExclusive-5-4.xml",
+ "NISTXML-gDay-maxExclusive-5-3.xml",
+ "NISTXML-gDay-maxExclusive-5-2.xml",
+ "NISTXML-gDay-maxExclusive-5-1.xml",
+ "NISTXML-gDay-maxExclusive-4-5.xml",
+ "NISTXML-gDay-maxExclusive-4-4.xml",
+ "NISTXML-gDay-maxExclusive-4-3.xml",
+ "NISTXML-gDay-maxExclusive-4-2.xml",
+ "NISTXML-gDay-maxExclusive-4-1.xml",
+ "NISTXML-gDay-maxExclusive-3-5.xml",
+ "NISTXML-gDay-maxExclusive-3-4.xml",
+ "NISTXML-gDay-maxExclusive-3-3.xml",
+ "NISTXML-gDay-maxExclusive-3-2.xml",
+ "NISTXML-gDay-maxExclusive-3-1.xml",
+ "NISTXML-gDay-maxExclusive-2-5.xml",
+ "NISTXML-gDay-maxExclusive-2-4.xml",
+ "NISTXML-gDay-maxExclusive-2-3.xml",
+ "NISTXML-gDay-maxExclusive-2-2.xml",
+ "NISTXML-gDay-maxExclusive-2-1.xml",
+ "NISTXML-gDay-maxExclusive-1-1.xml",
+ "NISTXML-gDay-minInclusive-5-1.xml",
+ "NISTXML-gDay-minInclusive-4-5.xml",
+ "NISTXML-gDay-minInclusive-4-4.xml",
+ "NISTXML-gDay-minInclusive-4-3.xml",
+ "NISTXML-gDay-minInclusive-4-2.xml",
+ "NISTXML-gDay-minInclusive-4-1.xml",
+ "NISTXML-gDay-minInclusive-3-5.xml",
+ "NISTXML-gDay-minInclusive-3-4.xml",
+ "NISTXML-gDay-minInclusive-3-3.xml",
+ "NISTXML-gDay-minInclusive-3-2.xml",
+ "NISTXML-gDay-minInclusive-3-1.xml",
+ "NISTXML-gDay-minInclusive-2-5.xml",
+ "NISTXML-gDay-minInclusive-2-4.xml",
+ "NISTXML-gDay-minInclusive-2-3.xml",
+ "NISTXML-gDay-minInclusive-2-2.xml",
+ "NISTXML-gDay-minInclusive-2-1.xml",
+ "NISTXML-gDay-minInclusive-1-5.xml",
+ "NISTXML-gDay-minInclusive-1-4.xml",
+ "NISTXML-gDay-minInclusive-1-3.xml",
+ "NISTXML-gDay-minInclusive-1-2.xml",
+ "NISTXML-gDay-minInclusive-1-1.xml",
+ "NISTXML-gDay-minExclusive-5-1.xml",
+ "NISTXML-gDay-minExclusive-4-5.xml",
+ "NISTXML-gDay-minExclusive-4-4.xml",
+ "NISTXML-gDay-minExclusive-4-3.xml",
+ "NISTXML-gDay-minExclusive-4-2.xml",
+ "NISTXML-gDay-minExclusive-4-1.xml",
+ "NISTXML-gDay-minExclusive-3-5.xml",
+ "NISTXML-gDay-minExclusive-3-4.xml",
+ "NISTXML-gDay-minExclusive-3-3.xml",
+ "NISTXML-gDay-minExclusive-3-2.xml",
+ "NISTXML-gDay-minExclusive-3-1.xml",
+ "NISTXML-gDay-minExclusive-2-5.xml",
+ "NISTXML-gDay-minExclusive-2-4.xml",
+ "NISTXML-gDay-minExclusive-2-3.xml",
+ "NISTXML-gDay-minExclusive-2-2.xml",
+ "NISTXML-gDay-minExclusive-2-1.xml",
+ "NISTXML-gDay-minExclusive-1-5.xml",
+ "NISTXML-gDay-minExclusive-1-4.xml",
+ "NISTXML-gDay-minExclusive-1-3.xml",
+ "NISTXML-gDay-minExclusive-1-2.xml",
+ "NISTXML-gDay-minExclusive-1-1.xml"],[]}}.
+{'NISTSchema-gMonth-',{["NISTXML-gMonth-whiteSpace-1-5.xml",
+ "NISTXML-gMonth-whiteSpace-1-4.xml",
+ "NISTXML-gMonth-whiteSpace-1-3.xml",
+ "NISTXML-gMonth-whiteSpace-1-2.xml",
+ "NISTXML-gMonth-whiteSpace-1-1.xml",
+ "NISTXML-gMonth-enumeration-5-5.xml",
+ "NISTXML-gMonth-enumeration-5-4.xml",
+ "NISTXML-gMonth-enumeration-5-3.xml",
+ "NISTXML-gMonth-enumeration-5-2.xml",
+ "NISTXML-gMonth-enumeration-5-1.xml",
+ "NISTXML-gMonth-enumeration-4-5.xml",
+ "NISTXML-gMonth-enumeration-4-4.xml",
+ "NISTXML-gMonth-enumeration-4-3.xml",
+ "NISTXML-gMonth-enumeration-4-2.xml",
+ "NISTXML-gMonth-enumeration-4-1.xml",
+ "NISTXML-gMonth-enumeration-3-5.xml",
+ "NISTXML-gMonth-enumeration-3-4.xml",
+ "NISTXML-gMonth-enumeration-3-3.xml",
+ "NISTXML-gMonth-enumeration-3-2.xml",
+ "NISTXML-gMonth-enumeration-3-1.xml",
+ "NISTXML-gMonth-enumeration-2-5.xml",
+ "NISTXML-gMonth-enumeration-2-4.xml",
+ "NISTXML-gMonth-enumeration-2-3.xml",
+ "NISTXML-gMonth-enumeration-2-2.xml",
+ "NISTXML-gMonth-enumeration-2-1.xml",
+ "NISTXML-gMonth-enumeration-1-5.xml",
+ "NISTXML-gMonth-enumeration-1-4.xml",
+ "NISTXML-gMonth-enumeration-1-3.xml",
+ "NISTXML-gMonth-enumeration-1-2.xml",
+ "NISTXML-gMonth-enumeration-1-1.xml",
+ "NISTXML-gMonth-pattern-5-5.xml",
+ "NISTXML-gMonth-pattern-5-4.xml",
+ "NISTXML-gMonth-pattern-5-3.xml",
+ "NISTXML-gMonth-pattern-5-2.xml",
+ "NISTXML-gMonth-pattern-5-1.xml",
+ "NISTXML-gMonth-pattern-4-5.xml",
+ "NISTXML-gMonth-pattern-4-4.xml",
+ "NISTXML-gMonth-pattern-4-3.xml",
+ "NISTXML-gMonth-pattern-4-2.xml",
+ "NISTXML-gMonth-pattern-4-1.xml",
+ "NISTXML-gMonth-pattern-3-5.xml",
+ "NISTXML-gMonth-pattern-3-4.xml",
+ "NISTXML-gMonth-pattern-3-3.xml",
+ "NISTXML-gMonth-pattern-3-2.xml",
+ "NISTXML-gMonth-pattern-3-1.xml",
+ "NISTXML-gMonth-pattern-2-5.xml",
+ "NISTXML-gMonth-pattern-2-4.xml",
+ "NISTXML-gMonth-pattern-2-3.xml",
+ "NISTXML-gMonth-pattern-2-2.xml",
+ "NISTXML-gMonth-pattern-2-1.xml",
+ "NISTXML-gMonth-pattern-1-5.xml",
+ "NISTXML-gMonth-pattern-1-4.xml",
+ "NISTXML-gMonth-pattern-1-3.xml",
+ "NISTXML-gMonth-pattern-1-2.xml",
+ "NISTXML-gMonth-pattern-1-1.xml",
+ "NISTXML-gMonth-maxInclusive-5-5.xml",
+ "NISTXML-gMonth-maxInclusive-5-4.xml",
+ "NISTXML-gMonth-maxInclusive-5-3.xml",
+ "NISTXML-gMonth-maxInclusive-5-2.xml",
+ "NISTXML-gMonth-maxInclusive-5-1.xml",
+ "NISTXML-gMonth-maxInclusive-4-5.xml",
+ "NISTXML-gMonth-maxInclusive-4-4.xml",
+ "NISTXML-gMonth-maxInclusive-4-3.xml",
+ "NISTXML-gMonth-maxInclusive-4-2.xml",
+ "NISTXML-gMonth-maxInclusive-4-1.xml",
+ "NISTXML-gMonth-maxInclusive-3-5.xml",
+ "NISTXML-gMonth-maxInclusive-3-4.xml",
+ "NISTXML-gMonth-maxInclusive-3-3.xml",
+ "NISTXML-gMonth-maxInclusive-3-2.xml",
+ "NISTXML-gMonth-maxInclusive-3-1.xml",
+ "NISTXML-gMonth-maxInclusive-2-5.xml",
+ "NISTXML-gMonth-maxInclusive-2-4.xml",
+ "NISTXML-gMonth-maxInclusive-2-3.xml",
+ "NISTXML-gMonth-maxInclusive-2-2.xml",
+ "NISTXML-gMonth-maxInclusive-2-1.xml",
+ "NISTXML-gMonth-maxInclusive-1-1.xml",
+ "NISTXML-gMonth-maxExclusive-5-5.xml",
+ "NISTXML-gMonth-maxExclusive-5-4.xml",
+ "NISTXML-gMonth-maxExclusive-5-3.xml",
+ "NISTXML-gMonth-maxExclusive-5-2.xml",
+ "NISTXML-gMonth-maxExclusive-5-1.xml",
+ "NISTXML-gMonth-maxExclusive-4-5.xml",
+ "NISTXML-gMonth-maxExclusive-4-4.xml",
+ "NISTXML-gMonth-maxExclusive-4-3.xml",
+ "NISTXML-gMonth-maxExclusive-4-2.xml",
+ "NISTXML-gMonth-maxExclusive-4-1.xml",
+ "NISTXML-gMonth-maxExclusive-3-5.xml",
+ "NISTXML-gMonth-maxExclusive-3-4.xml",
+ "NISTXML-gMonth-maxExclusive-3-3.xml",
+ "NISTXML-gMonth-maxExclusive-3-2.xml",
+ "NISTXML-gMonth-maxExclusive-3-1.xml",
+ "NISTXML-gMonth-maxExclusive-2-5.xml",
+ "NISTXML-gMonth-maxExclusive-2-4.xml",
+ "NISTXML-gMonth-maxExclusive-2-3.xml",
+ "NISTXML-gMonth-maxExclusive-2-2.xml",
+ "NISTXML-gMonth-maxExclusive-2-1.xml",
+ "NISTXML-gMonth-maxExclusive-1-1.xml",
+ "NISTXML-gMonth-minInclusive-5-1.xml",
+ "NISTXML-gMonth-minInclusive-4-5.xml",
+ "NISTXML-gMonth-minInclusive-4-4.xml",
+ "NISTXML-gMonth-minInclusive-4-3.xml",
+ "NISTXML-gMonth-minInclusive-4-2.xml",
+ "NISTXML-gMonth-minInclusive-4-1.xml",
+ "NISTXML-gMonth-minInclusive-3-5.xml",
+ "NISTXML-gMonth-minInclusive-3-4.xml",
+ "NISTXML-gMonth-minInclusive-3-3.xml",
+ "NISTXML-gMonth-minInclusive-3-2.xml",
+ "NISTXML-gMonth-minInclusive-3-1.xml",
+ "NISTXML-gMonth-minInclusive-2-5.xml",
+ "NISTXML-gMonth-minInclusive-2-4.xml",
+ "NISTXML-gMonth-minInclusive-2-3.xml",
+ "NISTXML-gMonth-minInclusive-2-2.xml",
+ "NISTXML-gMonth-minInclusive-2-1.xml",
+ "NISTXML-gMonth-minInclusive-1-5.xml",
+ "NISTXML-gMonth-minInclusive-1-4.xml",
+ "NISTXML-gMonth-minInclusive-1-3.xml",
+ "NISTXML-gMonth-minInclusive-1-2.xml",
+ "NISTXML-gMonth-minInclusive-1-1.xml",
+ "NISTXML-gMonth-minExclusive-5-1.xml",
+ "NISTXML-gMonth-minExclusive-4-5.xml",
+ "NISTXML-gMonth-minExclusive-4-4.xml",
+ "NISTXML-gMonth-minExclusive-4-3.xml",
+ "NISTXML-gMonth-minExclusive-4-2.xml",
+ "NISTXML-gMonth-minExclusive-4-1.xml",
+ "NISTXML-gMonth-minExclusive-3-5.xml",
+ "NISTXML-gMonth-minExclusive-3-4.xml",
+ "NISTXML-gMonth-minExclusive-3-3.xml",
+ "NISTXML-gMonth-minExclusive-3-2.xml",
+ "NISTXML-gMonth-minExclusive-3-1.xml",
+ "NISTXML-gMonth-minExclusive-2-5.xml",
+ "NISTXML-gMonth-minExclusive-2-4.xml",
+ "NISTXML-gMonth-minExclusive-2-3.xml",
+ "NISTXML-gMonth-minExclusive-2-2.xml",
+ "NISTXML-gMonth-minExclusive-2-1.xml",
+ "NISTXML-gMonth-minExclusive-1-5.xml",
+ "NISTXML-gMonth-minExclusive-1-4.xml",
+ "NISTXML-gMonth-minExclusive-1-3.xml",
+ "NISTXML-gMonth-minExclusive-1-2.xml",
+ "NISTXML-gMonth-minExclusive-1-1.xml"],[]}}.
+{'NISTSchema-gMonthDay',{["NISTXML-gMonthDay-maxInclusive-5-5.xml",
+ "NISTXML-gMonthDay-maxInclusive-5-4.xml",
+ "NISTXML-gMonthDay-maxInclusive-5-3.xml",
+ "NISTXML-gMonthDay-maxInclusive-5-2.xml",
+ "NISTXML-gMonthDay-maxInclusive-5-1.xml",
+ "NISTXML-gMonthDay-maxInclusive-4-5.xml",
+ "NISTXML-gMonthDay-maxInclusive-4-4.xml",
+ "NISTXML-gMonthDay-maxInclusive-4-3.xml",
+ "NISTXML-gMonthDay-maxInclusive-4-2.xml",
+ "NISTXML-gMonthDay-maxInclusive-4-1.xml",
+ "NISTXML-gMonthDay-maxInclusive-3-5.xml",
+ "NISTXML-gMonthDay-maxInclusive-3-4.xml",
+ "NISTXML-gMonthDay-maxInclusive-3-3.xml",
+ "NISTXML-gMonthDay-maxInclusive-3-2.xml",
+ "NISTXML-gMonthDay-maxInclusive-3-1.xml",
+ "NISTXML-gMonthDay-maxInclusive-2-5.xml",
+ "NISTXML-gMonthDay-maxInclusive-2-4.xml",
+ "NISTXML-gMonthDay-maxInclusive-2-3.xml",
+ "NISTXML-gMonthDay-maxInclusive-2-2.xml",
+ "NISTXML-gMonthDay-maxInclusive-2-1.xml",
+ "NISTXML-gMonthDay-maxInclusive-1-1.xml",
+ "NISTXML-gMonthDay-maxExclusive-5-5.xml",
+ "NISTXML-gMonthDay-maxExclusive-5-4.xml",
+ "NISTXML-gMonthDay-maxExclusive-5-3.xml",
+ "NISTXML-gMonthDay-maxExclusive-5-2.xml",
+ "NISTXML-gMonthDay-maxExclusive-5-1.xml",
+ "NISTXML-gMonthDay-maxExclusive-4-5.xml",
+ "NISTXML-gMonthDay-maxExclusive-4-4.xml",
+ "NISTXML-gMonthDay-maxExclusive-4-3.xml",
+ "NISTXML-gMonthDay-maxExclusive-4-2.xml",
+ "NISTXML-gMonthDay-maxExclusive-4-1.xml",
+ "NISTXML-gMonthDay-maxExclusive-3-5.xml",
+ "NISTXML-gMonthDay-maxExclusive-3-4.xml",
+ "NISTXML-gMonthDay-maxExclusive-3-3.xml",
+ "NISTXML-gMonthDay-maxExclusive-3-2.xml",
+ "NISTXML-gMonthDay-maxExclusive-3-1.xml",
+ "NISTXML-gMonthDay-maxExclusive-2-5.xml",
+ "NISTXML-gMonthDay-maxExclusive-2-4.xml",
+ "NISTXML-gMonthDay-maxExclusive-2-3.xml",
+ "NISTXML-gMonthDay-maxExclusive-2-2.xml",
+ "NISTXML-gMonthDay-maxExclusive-2-1.xml",
+ "NISTXML-gMonthDay-maxExclusive-1-1.xml",
+ "NISTXML-gMonthDay-minInclusive-5-1.xml",
+ "NISTXML-gMonthDay-minInclusive-4-5.xml",
+ "NISTXML-gMonthDay-minInclusive-4-4.xml",
+ "NISTXML-gMonthDay-minInclusive-4-3.xml",
+ "NISTXML-gMonthDay-minInclusive-4-2.xml",
+ "NISTXML-gMonthDay-minInclusive-4-1.xml",
+ "NISTXML-gMonthDay-minInclusive-3-5.xml",
+ "NISTXML-gMonthDay-minInclusive-3-4.xml",
+ "NISTXML-gMonthDay-minInclusive-3-3.xml",
+ "NISTXML-gMonthDay-minInclusive-3-2.xml",
+ "NISTXML-gMonthDay-minInclusive-3-1.xml",
+ "NISTXML-gMonthDay-minInclusive-2-5.xml",
+ "NISTXML-gMonthDay-minInclusive-2-4.xml",
+ "NISTXML-gMonthDay-minInclusive-2-3.xml",
+ "NISTXML-gMonthDay-minInclusive-2-2.xml",
+ "NISTXML-gMonthDay-minInclusive-2-1.xml",
+ "NISTXML-gMonthDay-minInclusive-1-5.xml",
+ "NISTXML-gMonthDay-minInclusive-1-4.xml",
+ "NISTXML-gMonthDay-minInclusive-1-3.xml",
+ "NISTXML-gMonthDay-minInclusive-1-2.xml",
+ "NISTXML-gMonthDay-minInclusive-1-1.xml",
+ "NISTXML-gMonthDay-minExclusive-5-1.xml",
+ "NISTXML-gMonthDay-minExclusive-4-5.xml",
+ "NISTXML-gMonthDay-minExclusive-4-4.xml",
+ "NISTXML-gMonthDay-minExclusive-4-3.xml",
+ "NISTXML-gMonthDay-minExclusive-4-2.xml",
+ "NISTXML-gMonthDay-minExclusive-4-1.xml",
+ "NISTXML-gMonthDay-minExclusive-3-5.xml",
+ "NISTXML-gMonthDay-minExclusive-3-4.xml",
+ "NISTXML-gMonthDay-minExclusive-3-3.xml",
+ "NISTXML-gMonthDay-minExclusive-3-2.xml",
+ "NISTXML-gMonthDay-minExclusive-3-1.xml",
+ "NISTXML-gMonthDay-minExclusive-2-5.xml",
+ "NISTXML-gMonthDay-minExclusive-2-4.xml",
+ "NISTXML-gMonthDay-minExclusive-2-3.xml",
+ "NISTXML-gMonthDay-minExclusive-2-2.xml",
+ "NISTXML-gMonthDay-minExclusive-2-1.xml",
+ "NISTXML-gMonthDay-minExclusive-1-5.xml",
+ "NISTXML-gMonthDay-minExclusive-1-4.xml",
+ "NISTXML-gMonthDay-minExclusive-1-3.xml",
+ "NISTXML-gMonthDay-minExclusive-1-2.xml",
+ "NISTXML-gMonthDay-minExclusive-1-1.xml"],[]}}.
+{'NISTSchema-gYear-',{["NISTXML-gYear-maxInclusive-5-5.xml",
+ "NISTXML-gYear-maxInclusive-5-4.xml",
+ "NISTXML-gYear-maxInclusive-5-3.xml",
+ "NISTXML-gYear-maxInclusive-5-2.xml",
+ "NISTXML-gYear-maxInclusive-5-1.xml",
+ "NISTXML-gYear-maxInclusive-4-5.xml",
+ "NISTXML-gYear-maxInclusive-4-4.xml",
+ "NISTXML-gYear-maxInclusive-4-3.xml",
+ "NISTXML-gYear-maxInclusive-4-2.xml",
+ "NISTXML-gYear-maxInclusive-4-1.xml",
+ "NISTXML-gYear-maxInclusive-3-5.xml",
+ "NISTXML-gYear-maxInclusive-3-4.xml",
+ "NISTXML-gYear-maxInclusive-3-3.xml",
+ "NISTXML-gYear-maxInclusive-3-2.xml",
+ "NISTXML-gYear-maxInclusive-3-1.xml",
+ "NISTXML-gYear-maxInclusive-2-1.xml",
+ "NISTXML-gYear-maxInclusive-1-1.xml",
+ "NISTXML-gYear-maxExclusive-5-5.xml",
+ "NISTXML-gYear-maxExclusive-5-4.xml",
+ "NISTXML-gYear-maxExclusive-5-3.xml",
+ "NISTXML-gYear-maxExclusive-5-2.xml",
+ "NISTXML-gYear-maxExclusive-5-1.xml",
+ "NISTXML-gYear-maxExclusive-4-5.xml",
+ "NISTXML-gYear-maxExclusive-4-4.xml",
+ "NISTXML-gYear-maxExclusive-4-3.xml",
+ "NISTXML-gYear-maxExclusive-4-2.xml",
+ "NISTXML-gYear-maxExclusive-4-1.xml",
+ "NISTXML-gYear-maxExclusive-3-5.xml",
+ "NISTXML-gYear-maxExclusive-3-4.xml",
+ "NISTXML-gYear-maxExclusive-3-3.xml",
+ "NISTXML-gYear-maxExclusive-3-2.xml",
+ "NISTXML-gYear-maxExclusive-3-1.xml",
+ "NISTXML-gYear-maxExclusive-2-5.xml",
+ "NISTXML-gYear-maxExclusive-2-4.xml",
+ "NISTXML-gYear-maxExclusive-2-3.xml",
+ "NISTXML-gYear-maxExclusive-2-2.xml",
+ "NISTXML-gYear-maxExclusive-2-1.xml",
+ "NISTXML-gYear-maxExclusive-1-1.xml",
+ "NISTXML-gYear-minInclusive-5-1.xml",
+ "NISTXML-gYear-minInclusive-4-5.xml",
+ "NISTXML-gYear-minInclusive-4-4.xml",
+ "NISTXML-gYear-minInclusive-4-3.xml",
+ "NISTXML-gYear-minInclusive-4-2.xml",
+ "NISTXML-gYear-minInclusive-4-1.xml",
+ "NISTXML-gYear-minInclusive-3-5.xml",
+ "NISTXML-gYear-minInclusive-3-4.xml",
+ "NISTXML-gYear-minInclusive-3-3.xml",
+ "NISTXML-gYear-minInclusive-3-2.xml",
+ "NISTXML-gYear-minInclusive-3-1.xml",
+ "NISTXML-gYear-minInclusive-2-5.xml",
+ "NISTXML-gYear-minInclusive-2-4.xml",
+ "NISTXML-gYear-minInclusive-2-3.xml",
+ "NISTXML-gYear-minInclusive-2-2.xml",
+ "NISTXML-gYear-minInclusive-2-1.xml",
+ "NISTXML-gYear-minInclusive-1-5.xml",
+ "NISTXML-gYear-minInclusive-1-4.xml",
+ "NISTXML-gYear-minInclusive-1-3.xml",
+ "NISTXML-gYear-minInclusive-1-2.xml",
+ "NISTXML-gYear-minInclusive-1-1.xml",
+ "NISTXML-gYear-minExclusive-5-1.xml",
+ "NISTXML-gYear-minExclusive-4-5.xml",
+ "NISTXML-gYear-minExclusive-4-4.xml",
+ "NISTXML-gYear-minExclusive-4-3.xml",
+ "NISTXML-gYear-minExclusive-4-2.xml",
+ "NISTXML-gYear-minExclusive-4-1.xml",
+ "NISTXML-gYear-minExclusive-3-5.xml",
+ "NISTXML-gYear-minExclusive-3-4.xml",
+ "NISTXML-gYear-minExclusive-3-3.xml",
+ "NISTXML-gYear-minExclusive-3-2.xml",
+ "NISTXML-gYear-minExclusive-3-1.xml",
+ "NISTXML-gYear-minExclusive-2-5.xml",
+ "NISTXML-gYear-minExclusive-2-4.xml",
+ "NISTXML-gYear-minExclusive-2-3.xml",
+ "NISTXML-gYear-minExclusive-2-2.xml",
+ "NISTXML-gYear-minExclusive-2-1.xml",
+ "NISTXML-gYear-minExclusive-1-5.xml",
+ "NISTXML-gYear-minExclusive-1-4.xml",
+ "NISTXML-gYear-minExclusive-1-3.xml",
+ "NISTXML-gYear-minExclusive-1-2.xml",
+ "NISTXML-gYear-minExclusive-1-1.xml"],[]}}.
+{'NISTSchema-gYearMonth',{["NISTXML-gYearMonth-maxInclusive-5-5.xml",
+ "NISTXML-gYearMonth-maxInclusive-5-4.xml",
+ "NISTXML-gYearMonth-maxInclusive-5-3.xml",
+ "NISTXML-gYearMonth-maxInclusive-5-2.xml",
+ "NISTXML-gYearMonth-maxInclusive-5-1.xml",
+ "NISTXML-gYearMonth-maxInclusive-4-5.xml",
+ "NISTXML-gYearMonth-maxInclusive-4-4.xml",
+ "NISTXML-gYearMonth-maxInclusive-4-3.xml",
+ "NISTXML-gYearMonth-maxInclusive-4-2.xml",
+ "NISTXML-gYearMonth-maxInclusive-4-1.xml",
+ "NISTXML-gYearMonth-maxInclusive-3-5.xml",
+ "NISTXML-gYearMonth-maxInclusive-3-4.xml",
+ "NISTXML-gYearMonth-maxInclusive-3-3.xml",
+ "NISTXML-gYearMonth-maxInclusive-3-2.xml",
+ "NISTXML-gYearMonth-maxInclusive-3-1.xml",
+ "NISTXML-gYearMonth-maxInclusive-2-5.xml",
+ "NISTXML-gYearMonth-maxInclusive-2-4.xml",
+ "NISTXML-gYearMonth-maxInclusive-2-3.xml",
+ "NISTXML-gYearMonth-maxInclusive-2-2.xml",
+ "NISTXML-gYearMonth-maxInclusive-2-1.xml",
+ "NISTXML-gYearMonth-maxInclusive-1-1.xml",
+ "NISTXML-gYearMonth-maxExclusive-5-5.xml",
+ "NISTXML-gYearMonth-maxExclusive-5-4.xml",
+ "NISTXML-gYearMonth-maxExclusive-5-3.xml",
+ "NISTXML-gYearMonth-maxExclusive-5-2.xml",
+ "NISTXML-gYearMonth-maxExclusive-5-1.xml",
+ "NISTXML-gYearMonth-maxExclusive-4-5.xml",
+ "NISTXML-gYearMonth-maxExclusive-4-4.xml",
+ "NISTXML-gYearMonth-maxExclusive-4-3.xml",
+ "NISTXML-gYearMonth-maxExclusive-4-2.xml",
+ "NISTXML-gYearMonth-maxExclusive-4-1.xml",
+ "NISTXML-gYearMonth-maxExclusive-3-5.xml",
+ "NISTXML-gYearMonth-maxExclusive-3-4.xml",
+ "NISTXML-gYearMonth-maxExclusive-3-3.xml",
+ "NISTXML-gYearMonth-maxExclusive-3-2.xml",
+ "NISTXML-gYearMonth-maxExclusive-3-1.xml",
+ "NISTXML-gYearMonth-maxExclusive-2-5.xml",
+ "NISTXML-gYearMonth-maxExclusive-2-4.xml",
+ "NISTXML-gYearMonth-maxExclusive-2-3.xml",
+ "NISTXML-gYearMonth-maxExclusive-2-2.xml",
+ "NISTXML-gYearMonth-maxExclusive-2-1.xml",
+ "NISTXML-gYearMonth-maxExclusive-1-1.xml",
+ "NISTXML-gYearMonth-minInclusive-5-1.xml",
+ "NISTXML-gYearMonth-minInclusive-4-5.xml",
+ "NISTXML-gYearMonth-minInclusive-4-4.xml",
+ "NISTXML-gYearMonth-minInclusive-4-3.xml",
+ "NISTXML-gYearMonth-minInclusive-4-2.xml",
+ "NISTXML-gYearMonth-minInclusive-4-1.xml",
+ "NISTXML-gYearMonth-minInclusive-3-5.xml",
+ "NISTXML-gYearMonth-minInclusive-3-4.xml",
+ "NISTXML-gYearMonth-minInclusive-3-3.xml",
+ "NISTXML-gYearMonth-minInclusive-3-2.xml",
+ "NISTXML-gYearMonth-minInclusive-3-1.xml",
+ "NISTXML-gYearMonth-minInclusive-2-5.xml",
+ "NISTXML-gYearMonth-minInclusive-2-4.xml",
+ "NISTXML-gYearMonth-minInclusive-2-3.xml",
+ "NISTXML-gYearMonth-minInclusive-2-2.xml",
+ "NISTXML-gYearMonth-minInclusive-2-1.xml",
+ "NISTXML-gYearMonth-minInclusive-1-5.xml",
+ "NISTXML-gYearMonth-minInclusive-1-4.xml",
+ "NISTXML-gYearMonth-minInclusive-1-3.xml",
+ "NISTXML-gYearMonth-minInclusive-1-2.xml",
+ "NISTXML-gYearMonth-minInclusive-1-1.xml",
+ "NISTXML-gYearMonth-minExclusive-5-1.xml",
+ "NISTXML-gYearMonth-minExclusive-4-5.xml",
+ "NISTXML-gYearMonth-minExclusive-4-4.xml",
+ "NISTXML-gYearMonth-minExclusive-4-3.xml",
+ "NISTXML-gYearMonth-minExclusive-4-2.xml",
+ "NISTXML-gYearMonth-minExclusive-4-1.xml",
+ "NISTXML-gYearMonth-minExclusive-3-5.xml",
+ "NISTXML-gYearMonth-minExclusive-3-4.xml",
+ "NISTXML-gYearMonth-minExclusive-3-3.xml",
+ "NISTXML-gYearMonth-minExclusive-3-2.xml",
+ "NISTXML-gYearMonth-minExclusive-3-1.xml",
+ "NISTXML-gYearMonth-minExclusive-2-5.xml",
+ "NISTXML-gYearMonth-minExclusive-2-4.xml",
+ "NISTXML-gYearMonth-minExclusive-2-3.xml",
+ "NISTXML-gYearMonth-minExclusive-2-2.xml",
+ "NISTXML-gYearMonth-minExclusive-2-1.xml",
+ "NISTXML-gYearMonth-minExclusive-1-5.xml",
+ "NISTXML-gYearMonth-minExclusive-1-4.xml",
+ "NISTXML-gYearMonth-minExclusive-1-3.xml",
+ "NISTXML-gYearMonth-minExclusive-1-2.xml",
+ "NISTXML-gYearMonth-minExclusive-1-1.xml"],[]}}.
+{'NISTSchema-hexBinary',{["NISTXML-hexBinary-length-5-5.xml",
+ "NISTXML-hexBinary-length-5-4.xml",
+ "NISTXML-hexBinary-length-5-3.xml",
+ "NISTXML-hexBinary-length-5-2.xml",
+ "NISTXML-hexBinary-length-5-1.xml",
+ "NISTXML-hexBinary-length-4-5.xml",
+ "NISTXML-hexBinary-length-4-4.xml",
+ "NISTXML-hexBinary-length-4-3.xml",
+ "NISTXML-hexBinary-length-4-2.xml",
+ "NISTXML-hexBinary-length-4-1.xml",
+ "NISTXML-hexBinary-length-3-5.xml",
+ "NISTXML-hexBinary-length-3-4.xml",
+ "NISTXML-hexBinary-length-3-3.xml",
+ "NISTXML-hexBinary-length-3-2.xml",
+ "NISTXML-hexBinary-length-3-1.xml",
+ "NISTXML-hexBinary-length-2-5.xml",
+ "NISTXML-hexBinary-length-2-4.xml",
+ "NISTXML-hexBinary-length-2-3.xml",
+ "NISTXML-hexBinary-length-2-2.xml",
+ "NISTXML-hexBinary-length-2-1.xml",
+ "NISTXML-hexBinary-length-1-5.xml",
+ "NISTXML-hexBinary-length-1-4.xml",
+ "NISTXML-hexBinary-length-1-3.xml",
+ "NISTXML-hexBinary-length-1-2.xml",
+ "NISTXML-hexBinary-length-1-1.xml",
+ "NISTXML-hexBinary-maxLength-5-5.xml",
+ "NISTXML-hexBinary-maxLength-5-4.xml",
+ "NISTXML-hexBinary-maxLength-4-5.xml",
+ "NISTXML-hexBinary-maxLength-4-4.xml",
+ "NISTXML-hexBinary-maxLength-3-5.xml",
+ "NISTXML-hexBinary-maxLength-3-4.xml",
+ "NISTXML-hexBinary-maxLength-2-5.xml",
+ "NISTXML-hexBinary-maxLength-2-4.xml",
+ "NISTXML-hexBinary-maxLength-2-3.xml",
+ "NISTXML-hexBinary-maxLength-1-5.xml",
+ "NISTXML-hexBinary-maxLength-1-4.xml",
+ "NISTXML-hexBinary-maxLength-1-3.xml",
+ "NISTXML-hexBinary-maxLength-1-2.xml",
+ "NISTXML-hexBinary-maxLength-1-1.xml"],[]}}.
+{'NISTSchema-negativeInteger',{["NISTXML-negativeInteger-totalDigits-5-5.xml",
+ "NISTXML-negativeInteger-totalDigits-4-5.xml",
+ "NISTXML-negativeInteger-totalDigits-3-5.xml",
+ "NISTXML-negativeInteger-totalDigits-2-5.xml",
+ "NISTXML-negativeInteger-totalDigits-1-5.xml",
+ "NISTXML-negativeInteger-totalDigits-1-4.xml",
+ "NISTXML-negativeInteger-totalDigits-1-3.xml",
+ "NISTXML-negativeInteger-totalDigits-1-2.xml",
+ "NISTXML-negativeInteger-totalDigits-1-1.xml"],[]}}.
+{'NISTSchema-nonPositiveInteger',{["NISTXML-nonPositiveInteger-totalDigits-5-5.xml",
+ "NISTXML-nonPositiveInteger-totalDigits-4-5.xml",
+ "NISTXML-nonPositiveInteger-totalDigits-3-5.xml",
+ "NISTXML-nonPositiveInteger-totalDigits-2-5.xml",
+ "NISTXML-nonPositiveInteger-totalDigits-1-5.xml",
+ "NISTXML-nonPositiveInteger-totalDigits-1-4.xml",
+ "NISTXML-nonPositiveInteger-totalDigits-1-3.xml",
+ "NISTXML-nonPositiveInteger-totalDigits-1-2.xml",
+ "NISTXML-nonPositiveInteger-totalDigits-1-1.xml"],[]}}.
+{'NISTSchema-normalizedString',{["NISTXML-normalizedString-length-1-1.xml",
+ "NISTXML-normalizedString-maxLength-5-5.xml",
+ "NISTXML-normalizedString-maxLength-5-4.xml",
+ "NISTXML-normalizedString-maxLength-5-3.xml",
+ "NISTXML-normalizedString-maxLength-5-2.xml",
+ "NISTXML-normalizedString-maxLength-5-1.xml",
+ "NISTXML-normalizedString-maxLength-4-5.xml",
+ "NISTXML-normalizedString-maxLength-4-4.xml",
+ "NISTXML-normalizedString-maxLength-4-3.xml",
+ "NISTXML-normalizedString-maxLength-4-2.xml",
+ "NISTXML-normalizedString-maxLength-4-1.xml",
+ "NISTXML-normalizedString-maxLength-3-5.xml",
+ "NISTXML-normalizedString-maxLength-3-4.xml",
+ "NISTXML-normalizedString-maxLength-3-3.xml",
+ "NISTXML-normalizedString-maxLength-3-2.xml",
+ "NISTXML-normalizedString-maxLength-3-1.xml",
+ "NISTXML-normalizedString-maxLength-2-5.xml",
+ "NISTXML-normalizedString-maxLength-2-4.xml",
+ "NISTXML-normalizedString-maxLength-2-3.xml",
+ "NISTXML-normalizedString-maxLength-2-2.xml",
+ "NISTXML-normalizedString-maxLength-2-1.xml",
+ "NISTXML-normalizedString-maxLength-1-1.xml"],[]}}.
+{'NISTSchema-string',{["NISTXML-string-length-1-1.xml",
+ "NISTXML-string-maxLength-5-5.xml",
+ "NISTXML-string-maxLength-5-4.xml",
+ "NISTXML-string-maxLength-5-3.xml",
+ "NISTXML-string-maxLength-5-2.xml",
+ "NISTXML-string-maxLength-5-1.xml",
+ "NISTXML-string-maxLength-4-5.xml",
+ "NISTXML-string-maxLength-4-4.xml",
+ "NISTXML-string-maxLength-4-3.xml",
+ "NISTXML-string-maxLength-4-2.xml",
+ "NISTXML-string-maxLength-4-1.xml",
+ "NISTXML-string-maxLength-3-5.xml",
+ "NISTXML-string-maxLength-3-4.xml",
+ "NISTXML-string-maxLength-3-3.xml",
+ "NISTXML-string-maxLength-3-2.xml",
+ "NISTXML-string-maxLength-3-1.xml",
+ "NISTXML-string-maxLength-2-5.xml",
+ "NISTXML-string-maxLength-2-4.xml",
+ "NISTXML-string-maxLength-2-3.xml",
+ "NISTXML-string-maxLength-2-2.xml",
+ "NISTXML-string-maxLength-2-1.xml",
+ "NISTXML-string-maxLength-1-1.xml"],[]}}.
+{'NISTSchema-time',{["NISTXML-time-maxInclusive-5-5.xml",
+ "NISTXML-time-maxInclusive-5-4.xml",
+ "NISTXML-time-maxInclusive-5-3.xml",
+ "NISTXML-time-maxInclusive-5-2.xml",
+ "NISTXML-time-maxInclusive-5-1.xml",
+ "NISTXML-time-maxInclusive-4-5.xml",
+ "NISTXML-time-maxInclusive-4-4.xml",
+ "NISTXML-time-maxInclusive-4-3.xml",
+ "NISTXML-time-maxInclusive-4-2.xml",
+ "NISTXML-time-maxInclusive-4-1.xml",
+ "NISTXML-time-maxInclusive-3-5.xml",
+ "NISTXML-time-maxInclusive-3-4.xml",
+ "NISTXML-time-maxInclusive-3-3.xml",
+ "NISTXML-time-maxInclusive-3-2.xml",
+ "NISTXML-time-maxInclusive-3-1.xml",
+ "NISTXML-time-maxInclusive-2-5.xml",
+ "NISTXML-time-maxInclusive-2-4.xml",
+ "NISTXML-time-maxInclusive-2-3.xml",
+ "NISTXML-time-maxInclusive-2-2.xml",
+ "NISTXML-time-maxInclusive-2-1.xml",
+ "NISTXML-time-maxInclusive-1-1.xml",
+ "NISTXML-time-maxExclusive-5-5.xml",
+ "NISTXML-time-maxExclusive-5-4.xml",
+ "NISTXML-time-maxExclusive-5-3.xml",
+ "NISTXML-time-maxExclusive-5-2.xml",
+ "NISTXML-time-maxExclusive-5-1.xml",
+ "NISTXML-time-maxExclusive-4-5.xml",
+ "NISTXML-time-maxExclusive-4-4.xml",
+ "NISTXML-time-maxExclusive-4-3.xml",
+ "NISTXML-time-maxExclusive-4-2.xml",
+ "NISTXML-time-maxExclusive-4-1.xml",
+ "NISTXML-time-maxExclusive-3-5.xml",
+ "NISTXML-time-maxExclusive-3-4.xml",
+ "NISTXML-time-maxExclusive-3-3.xml",
+ "NISTXML-time-maxExclusive-3-2.xml",
+ "NISTXML-time-maxExclusive-3-1.xml",
+ "NISTXML-time-maxExclusive-2-5.xml",
+ "NISTXML-time-maxExclusive-2-4.xml",
+ "NISTXML-time-maxExclusive-2-3.xml",
+ "NISTXML-time-maxExclusive-2-2.xml",
+ "NISTXML-time-maxExclusive-2-1.xml",
+ "NISTXML-time-maxExclusive-1-1.xml",
+ "NISTXML-time-minInclusive-5-1.xml",
+ "NISTXML-time-minInclusive-4-5.xml",
+ "NISTXML-time-minInclusive-4-4.xml",
+ "NISTXML-time-minInclusive-4-3.xml",
+ "NISTXML-time-minInclusive-4-2.xml",
+ "NISTXML-time-minInclusive-4-1.xml",
+ "NISTXML-time-minInclusive-3-5.xml",
+ "NISTXML-time-minInclusive-3-4.xml",
+ "NISTXML-time-minInclusive-3-3.xml",
+ "NISTXML-time-minInclusive-3-2.xml",
+ "NISTXML-time-minInclusive-3-1.xml",
+ "NISTXML-time-minInclusive-2-5.xml",
+ "NISTXML-time-minInclusive-2-4.xml",
+ "NISTXML-time-minInclusive-2-3.xml",
+ "NISTXML-time-minInclusive-2-2.xml",
+ "NISTXML-time-minInclusive-2-1.xml",
+ "NISTXML-time-minInclusive-1-5.xml",
+ "NISTXML-time-minInclusive-1-4.xml",
+ "NISTXML-time-minInclusive-1-3.xml",
+ "NISTXML-time-minInclusive-1-2.xml",
+ "NISTXML-time-minInclusive-1-1.xml",
+ "NISTXML-time-minExclusive-5-1.xml",
+ "NISTXML-time-minExclusive-4-5.xml",
+ "NISTXML-time-minExclusive-4-4.xml",
+ "NISTXML-time-minExclusive-4-3.xml",
+ "NISTXML-time-minExclusive-4-2.xml",
+ "NISTXML-time-minExclusive-4-1.xml",
+ "NISTXML-time-minExclusive-3-5.xml",
+ "NISTXML-time-minExclusive-3-4.xml",
+ "NISTXML-time-minExclusive-3-3.xml",
+ "NISTXML-time-minExclusive-3-2.xml",
+ "NISTXML-time-minExclusive-3-1.xml",
+ "NISTXML-time-minExclusive-2-5.xml",
+ "NISTXML-time-minExclusive-2-4.xml",
+ "NISTXML-time-minExclusive-2-3.xml",
+ "NISTXML-time-minExclusive-2-2.xml",
+ "NISTXML-time-minExclusive-2-1.xml",
+ "NISTXML-time-minExclusive-1-5.xml",
+ "NISTXML-time-minExclusive-1-4.xml",
+ "NISTXML-time-minExclusive-1-3.xml",
+ "NISTXML-time-minExclusive-1-2.xml",
+ "NISTXML-time-minExclusive-1-1.xml"],[]}}.
+{'NISTSchema-token',{["NISTXML-token-length-1-1.xml",
+ "NISTXML-token-minLength-1-5.xml",
+ "NISTXML-token-minLength-1-4.xml",
+ "NISTXML-token-minLength-1-3.xml",
+ "NISTXML-token-minLength-1-2.xml",
+ "NISTXML-token-minLength-1-1.xml",
+ "NISTXML-token-maxLength-5-5.xml",
+ "NISTXML-token-maxLength-5-4.xml",
+ "NISTXML-token-maxLength-5-3.xml",
+ "NISTXML-token-maxLength-5-2.xml",
+ "NISTXML-token-maxLength-5-1.xml",
+ "NISTXML-token-maxLength-4-5.xml",
+ "NISTXML-token-maxLength-4-4.xml",
+ "NISTXML-token-maxLength-4-3.xml",
+ "NISTXML-token-maxLength-4-2.xml",
+ "NISTXML-token-maxLength-4-1.xml",
+ "NISTXML-token-maxLength-3-5.xml",
+ "NISTXML-token-maxLength-3-4.xml",
+ "NISTXML-token-maxLength-3-3.xml",
+ "NISTXML-token-maxLength-3-2.xml",
+ "NISTXML-token-maxLength-3-1.xml",
+ "NISTXML-token-maxLength-2-5.xml",
+ "NISTXML-token-maxLength-2-4.xml",
+ "NISTXML-token-maxLength-2-3.xml",
+ "NISTXML-token-maxLength-2-2.xml",
+ "NISTXML-token-maxLength-2-1.xml",
+ "NISTXML-token-maxLength-1-1.xml"],[]}}.
diff --git a/lib/xmerl/test/xmerl_xsd_NIST2002-01-16_SUITE_data/nisttest.tar.gz b/lib/xmerl/test/xmerl_xsd_NIST2002-01-16_SUITE_data/nisttest.tar.gz
new file mode 100644
index 0000000000..03d575c268
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_NIST2002-01-16_SUITE_data/nisttest.tar.gz
Binary files differ
diff --git a/lib/xmerl/test/xmerl_xsd_NIST2002-01-16_SUITE_data/w3c-copyright-19990405.html b/lib/xmerl/test/xmerl_xsd_NIST2002-01-16_SUITE_data/w3c-copyright-19990405.html
new file mode 100644
index 0000000000..5c89ffd95e
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_NIST2002-01-16_SUITE_data/w3c-copyright-19990405.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head>
+
+
+ <meta http-equiv="Content-Type" content="text/html"><title>DOCUMENT NOTICE</title>
+
+ <link rel="stylesheet" type="text/css" href="copyright-documents-19990405_files/base.css"></head><body bgcolor="#ffffff" text="#000000">
+<h1>W3C<sup>�</sup> DOCUMENT NOTICE AND LICENSE</h1>
+
+<h3>Copyright � 1994-2002 <a href="http://www.w3.org/">World Wide Web
+Consortium</a>, (<a href="http://www.lcs.mit.edu/">Massachusetts Institute of
+Technology</a>, <a href="http://www.inria.fr/">Institut National de Recherche
+en Informatique et en Automatique</a>, <a href="http://www.keio.ac.jp/">Keio
+University</a>). All Rights Reserved.<br>
+http://www.w3.org/Consortium/Legal/</h3>
+
+<p>Public documents on the W3C site are provided by the copyright holders
+under the following license. The software or Document Type Definitions (DTDs)
+associated with W3C specifications are governed by the <a href="http://www.w3.org/Consortium/Legal/copyright-software.html"> Software
+Notice</a>. By using and/or copying this document, or the W3C document from
+which this statement is linked, you (the licensee) agree that you have read,
+understood, and will comply with the following terms and conditions:</p>
+
+<p>Permission to use, copy, and distribute the contents of this document, or
+the W3C document from which this statement is linked, in any medium for any
+purpose and without fee or royalty is hereby granted, provided that you
+include the following on <i>ALL</i> copies of the document, or portions
+thereof, that you use:</p>
+<ol>
+ <li>A link or URL to the original W3C document.</li>
+ <li>The pre-existing copyright notice of the original author, or if it
+ doesn't exist, a notice of the form: "Copyright � [$date-of-document] <a href="http://www.w3.org/">World Wide Web Consortium</a>, (<a href="http://www.lcs.mit.edu/">Massachusetts Institute of Technology</a>,
+ <a href="http://www.inria.fr/"> Institut National de Recherche en
+ Informatique et en Automatique</a>, <a href="http://www.keio.ac.jp/">Keio
+ University</a>). All Rights Reserved.
+ http://www.w3.org/Consortium/Legal/" (Hypertext is preferred, but a
+ textual representation is permitted.)</li>
+ <li><em>If it exists</em>, the STATUS of the W3C document.</li>
+</ol>
+
+<p>When space permits, inclusion of the full text of this <b> NOTICE</b>
+should be provided. We request that authorship attribution be provided in any
+software, documents, or other items or products that you create pursuant to
+the implementation of the contents of this document, or any portion
+thereof.</p>
+
+<p>No right to create modifications or derivatives of W3C documents is
+granted pursuant to this license. However, if additional requirements
+(documented in the <a href="http://www.w3.org/Consortium/Legal/IPR-FAQ.html">Copyright FAQ</a>) are satisfied,
+the right to create modifications or derivatives is&nbsp;sometimes granted by the
+W3C to individuals complying with those requirements.</p>
+
+<p>THIS DOCUMENT IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO
+REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED
+TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+NON-INFRINGEMENT, OR TITLE; THAT THE CONTENTS OF THE DOCUMENT ARE SUITABLE
+FOR ANY PURPOSE; NOR THAT THE IMPLEMENTATION OF SUCH CONTENTS WILL NOT
+INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.</p>
+
+<p>COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE DOCUMENT OR THE
+PERFORMANCE OR IMPLEMENTATION OF THE CONTENTS THEREOF.</p>
+
+<p>The name and trademarks of copyright holders may NOT be used in
+advertising or publicity pertaining to this document or its contents without
+specific, written prior permission. Title to copyright in this document will
+at all times remain with copyright holders.</p>
+
+<p>----------------------------------------------------------------------------</p>
+
+<p>This formulation of W3C's notice and license became active on April 05
+1999 so as to account for the treatment of DTDs, schema's and bindings. See
+the <a href="http://www.w3.org/Consortium/Legal/copyright-documents-19990218.html"> older formulation</a> for
+the policy prior to this date. Please see our <a href="http://www.w3.org/Consortium/Legal/IPR-FAQ.html">Copyright FAQ</a> for common questions about using
+materials from our site, including specific terms and conditions for packages
+like libwww, Amaya, and Jigsaw. Other questions about this notice can be
+directed to <a href="mailto:[email protected]">[email protected]</a>.</p>
+<address>
+ <a href="http://w3.org/Help/Webmaster.html">webmaster</a><br>
+ (last updated by reagle on 1999/04/99.)
+</address>
+</body></html> \ No newline at end of file
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE.erl b/lib/xmerl/test/xmerl_xsd_SUITE.erl
new file mode 100644
index 0000000000..74de42aee5
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE.erl
@@ -0,0 +1,1148 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2006-2010. 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%
+%%
+%%
+%%% Purpose : Test suite for the ASN.1 application
+
+-module(xmerl_xsd_SUITE).
+
+-compile(export_all).
+%%-export([Function/Arity, ...]).
+
+-include_lib("test_server/include/test_server.hrl").
+%%-include("xmerl.hrl").
+-include_lib("xmerl/include/xmerl.hrl").
+
+-import(xmerl_xsd_type,[check_simpleType/3]).
+
+all() ->
+ [{group, type_tests}, {group, facets},
+ {group, misc_block_tests}, {group, validation_tests},
+ {group, ticket_tests}].
+
+groups() ->
+ [{type_tests, [],
+ [{group, primitive_datatypes},
+ {group, derived_datatypes}]},
+ {validation_tests, [],
+ [{group, xmlSchemaPrimerExamples},
+ {group, miscXMLexamples}]},
+ {primitive_datatypes, [],
+ [string, boolean, decimal, float, double, duration,
+ dateTime, time, date, gYearMonth, gYear, gMonthDay,
+ gDay, gMonth, hexBinary, base64Binary, anyURI, 'QName',
+ 'NOTATION']},
+ {derived_datatypes, [],
+ [normalizedString, token, language, 'NMTOKEN',
+ 'NMTOKENS', 'Name', 'NCName', 'ID', 'IDREF', 'IDREFS',
+ 'ENTITY', 'ENTITIES', integer, nonPositiveInteger,
+ negativeInteger, long, int, short, byte,
+ nonNegativeInteger, unsignedLong, unsignedInt,
+ unsignedShort, unsignedByte, positiveInteger]},
+ {xmlSchemaPrimerExamples, [],
+ [po, po1, po2, ipo, ipo_redefine, '4Q99']},
+ {miscXMLexamples, [],
+ [small, complexType1, model_group_all,
+ substitutionGroup, attributeGroup, test_key1, sis1,
+ sis2, state2file_file2state, union]},
+ {ticket_tests, [],
+ [ticket_6910, ticket_7165, ticket_7190, ticket_7288,
+ ticket_7736, ticket_8599]},
+ {facets, [],
+ [length, minLength, maxLength, pattern, enumeration,
+ whiteSpace, maxInclusive, maxExclusive, minExclusive,
+ minInclusive, totalDigits, fractionDigits]},
+ {misc_block_tests, [],
+ [compare_dateTime, compare_duration]}].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+init_per_testcase(_TestCase,Config) ->
+ {ok, _} =
+ file:read_file_info(filename:join([?config(priv_dir,Config)])),
+ code:add_patha(?config(priv_dir,Config)),
+ Dog=test_server:timetrap({minutes,10}),
+ [{watchdog, Dog}|Config].
+
+end_per_testcase(_Func,Config) ->
+ Dog=?config(watchdog, Config),
+ test_server:timetrap_cancel(Dog),
+ ok.
+
+
+string(suite) -> [];
+string(_Config) ->
+ %% #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
+ Str = [16#9,16#A,16#D,16#20,16#D7FF,16#E000,16#FFFD,16#10000,
+ 16#10FFFF],
+ ?line {ok,_} = check_simpleType(string,Str,dummy).
+
+boolean(suite) -> [];
+boolean(_Config) ->
+ ?line {ok,_} = check_simpleType(boolean,"1",dummy),
+ ?line {ok,_} = check_simpleType(boolean,"0",dummy),
+ ?line {ok,_} = check_simpleType(boolean,"true",dummy),
+ ?line {ok,_} = check_simpleType(boolean,"false",dummy),
+ ?line {error,_Reason} = check_simpleType(boolean,"gurka",dummy).
+
+decimal(suite) -> [];
+decimal(_Config) ->
+ ?line {ok,_} = check_simpleType(decimal,"-1.23",dummy),
+ ?line {ok,_} = check_simpleType(decimal,"12678967.543233",dummy),
+ ?line {ok,_} = check_simpleType(decimal,"+100000.00",dummy),
+ ?line {ok,_} = check_simpleType(decimal,"210",dummy).
+
+float(suite) -> [];
+float(_Config) ->
+ %% -1E4, 1267.43233E12, 12.78e-2, 12 , -0, 0 , INF, -INF, NaN
+ ?line {ok,_} = check_simpleType(float,"-1E4",dummy),
+ ?line {ok,_} = check_simpleType(float,"1267.43233E12",dummy),
+ ?line {ok,_} = check_simpleType(float,"12.78e-2",dummy),
+ ?line {ok,_} = check_simpleType(float,"12",dummy),
+ ?line {ok,_} = check_simpleType(float,"-0",dummy),
+ ?line {ok,_} = check_simpleType(float,"0",dummy),
+ ?line {ok,_} = check_simpleType(float,"INF",dummy),
+ ?line {ok,_} = check_simpleType(float,"-INF",dummy),
+ ?line {ok,_} = check_simpleType(float,"NaN",dummy).
+
+
+double(suite) -> [];
+double(_Config) ->
+ %% -1E4, 1267.43233E12, 12.78e-2, 12 , -0, 0 , INF, -INF, NaN
+ ?line {ok,_} = check_simpleType(double,"-1E4",dummy),
+ ?line {ok,_} = check_simpleType(double,"1267.43233E12",dummy),
+ ?line {ok,_} = check_simpleType(double,"12.78e-2",dummy),
+ ?line {ok,_} = check_simpleType(double,"12",dummy),
+ ?line {ok,_} = check_simpleType(double,"-0",dummy),
+ ?line {ok,_} = check_simpleType(double,"0",dummy),
+ ?line {ok,_} = check_simpleType(double,"INF",dummy),
+ ?line {ok,_} = check_simpleType(double,"-INF",dummy),
+ ?line {ok,_} = check_simpleType(double,"NaN",dummy).
+
+
+duration(suite) -> [];
+duration(_Config) ->
+ %% allowed: P1Y2M3DT10H30M -P120D P1347Y P1347M P1Y2MT2H
+ %% P0Y1347M P0Y1347M0D -P1347M
+ %% not allowed: P-1347M P1Y2MT
+ ?line {ok,_} = check_simpleType(duration,"P1Y2M3DT10H30M",dummy),
+ ?line {ok,_} = check_simpleType(duration,"-P120D",dummy),
+ ?line {ok,_} = check_simpleType(duration,"P1347Y",dummy),
+ ?line {ok,_} = check_simpleType(duration,"P1347M",dummy),
+ ?line {ok,_} = check_simpleType(duration,"P1Y2MT2H",dummy),
+ ?line {ok,_} = check_simpleType(duration,"P0Y1347M",dummy),
+ ?line {ok,_} = check_simpleType(duration,"P0Y1347M0D",dummy),
+ ?line {ok,_} = check_simpleType(duration,"-P1347M",dummy),
+
+ ?line {error,_} = check_simpleType(duration,"P-1347M",dummy),
+ ?line {error,_} = check_simpleType(duration,"P1Y2MT",dummy).
+
+%% '-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)?
+dateTime(suite) -> [];
+dateTime(_Config) ->
+ %% 2002-10-10T12:00:00-05:00
+ DT1 = "2002-10-10T12:00:00-05:00",
+ ?line {ok,_} = check_simpleType(dateTime,DT1,dummy),
+ DT2 = "2002-10-10T17:00:00Z",
+ ?line {ok,_} = check_simpleType(dateTime,DT2,dummy),
+ %% plus sign prohibited
+ DT3 = "+2002-10-10T17:00:00Z",
+ ?line {error,_Reason3} = check_simpleType(dateTime,DT3,dummy),
+ %% leading zeros when year are more than four digits prohibited
+ DT4 = "002002-10-10T17:00:00Z",
+ ?line {error,_Reason4} = check_simpleType(dateTime,DT4,dummy),
+ DT5 = "1953-12-31T12:10:10.10+12:00",
+ ?line {ok,_} = check_simpleType(dateTime,DT5,dummy).
+
+time(suite) -> [];
+time(_Config) ->
+ %% hh:mm:ss.sss with optional following time zone indicator.
+ T1 = "13:20:00-05:00",
+ ?line {ok,_} = check_simpleType(time,T1,dummy),
+ %% canonical repr. of midnight
+ T2 = "00:00:00",
+ ?line {ok,_} = check_simpleType(time,T2,dummy),
+ T3 = "12:34:56",
+ ?line {ok,_} = check_simpleType(time,T3,dummy),
+ T4 = "12:34:56.552",
+ ?line {ok,_} = check_simpleType(time,T4,dummy),
+ T5 = "12:34:56.552Z",
+ ?line {ok,_} = check_simpleType(time,T5,dummy).
+
+date(suite) -> [];
+date(_Config) ->
+ %% '-'? yyyy '-' mm '-' dd zzzzzz?
+ %% is
+ D1 = "2002-10-10+13:00",
+ ?line {ok,_} = check_simpleType(date,D1,dummy),
+ D2 = "2002-10-09-11:00",
+ ?line {ok,_} = check_simpleType(date,D2,dummy),
+
+ D12 = "+2002-13-09-11:00",
+ ?line {error,_Reason12} = check_simpleType(date,D12,dummy),
+ D13 = "2002-13-09-11:00",
+ ?line {error,_Reason13} = check_simpleType(date,D13,dummy),
+ D14 = "2002-12-39-11:00",
+ ?line {error,_Reason14} = check_simpleType(date,D14,dummy).
+
+gYearMonth(suite) -> [];
+gYearMonth(_Config) ->
+ %% '-'? yyyy '-' mm zzzzzz?
+ GYM1 = "1955-10",
+ ?line {ok,_} = check_simpleType(gYearMonth,GYM1,dummy),
+ GYM2 = "-1955-10",
+ ?line {ok,_} = check_simpleType(gYearMonth,GYM2,dummy),
+ GYM3 = "1955-10Z",
+ ?line {ok,_} = check_simpleType(gYearMonth,GYM3,dummy),
+ GYM4 = "0055-10+10:00",
+ ?line {ok,_} = check_simpleType(gYearMonth,GYM4,dummy),
+ GYM5 = "0955-10Z",
+ ?line {ok,_} = check_simpleType(gYearMonth,GYM5,dummy),
+ GYM6 = "-11955-01",
+ ?line {ok,_} = check_simpleType(gYearMonth,GYM6,dummy),
+
+ ?line {error,_} = check_simpleType(gYearMonth,"+2000-10",dummy),
+ ?line {error,_} = check_simpleType(gYearMonth,"2000-00",dummy),
+ ?line {error,_} = check_simpleType(gYearMonth,"2000-10+10:70",dummy).
+
+gYear(suite) -> [];
+gYear(_Config) ->
+ %% '-'? yyyy zzzzzz?
+ ?line {ok,_} = check_simpleType(gYear,"2000",dummy),
+ ?line {ok,_} = check_simpleType(gYear,"2000-11:30",dummy),
+ ?line {ok,_} = check_simpleType(gYear,"-2000",dummy),
+ ?line {error,_} = check_simpleType(gYear,"0000",dummy).
+
+gMonthDay(suite) -> [];
+gMonthDay(_Config) ->
+ %% mm '-' dd zzzzzz?
+ ?line {ok,_} = check_simpleType(gMonthDay,"--05-03",dummy),
+ ?line {ok,_} = check_simpleType(gMonthDay,"--05-03Z",dummy),
+ ?line {error,_} = check_simpleType(gMonthDay,"05-00",dummy),
+ ?line {error,_} = check_simpleType(gMonthDay,"00-03",dummy),
+ ?line {error,_} = check_simpleType(gMonthDay,"-05-03",dummy).
+
+gDay(suite) -> [];
+gDay(_Config) ->
+ %% dd zzzzzz?
+ ?line {ok,_} = check_simpleType(gDay,"---05",dummy),
+ ?line {ok,_} = check_simpleType(gDay,"---30+03:00",dummy),
+ ?line {error,_} = check_simpleType(gDay,"-30+03:00",dummy),
+ ?line {error,_} = check_simpleType(gDay,"---00+03:00",dummy),
+ ?line {error,_} = check_simpleType(gDay,"---40+03:00",dummy),
+ ?line {error,_} = check_simpleType(gDay,"05",dummy).
+
+gMonth(suite) -> [];
+gMonth(_Config) ->
+ %% mm zzzzzz?
+ ?line {ok,_} = check_simpleType(gMonth,"--05",dummy),
+ ?line {ok,_} = check_simpleType(gMonth,"--10+03:00",dummy),
+ ?line {error,_} = check_simpleType(gMonth,"-10+03:00",dummy),
+ ?line {error,_} = check_simpleType(gMonth,"00+03:00",dummy),
+ ?line {error,_} = check_simpleType(gMonth,"14",dummy),
+ ?line {error,_} = check_simpleType(gMonth,"05",dummy).
+
+
+hexBinary(suite) -> [];
+hexBinary(_Config) ->
+ %% an even number of hexadecimal digits ([0-9a-fA-F]).
+ ?line {ok,_} = check_simpleType(hexBinary,"05",dummy),
+ ?line {ok,_} = check_simpleType(hexBinary,"aF",dummy),
+ ?line {ok,_} = check_simpleType(hexBinary,
+ "0123456789abcdefABCDEF",dummy),
+ ?line {error,_} = check_simpleType(hexBinary,
+ "0123456789absdefABCDEF",dummy),
+ ?line {error,_} = check_simpleType(hexBinary,"aF5",dummy),
+ ?line {error,_} = check_simpleType(hexBinary,"aFG",dummy).
+
+base64Binary(suite) -> [];
+base64Binary(_Config) ->
+ %% a-z, A-Z, 0-9, the plus sign (+), the forward slash (/) and the
+ %% equal sign (=), together with the characters defined in [XML
+ %% 1.0 (Second Edition)] as white space.(16#9, 16#A, 16#D, 16#20)
+ ?line {ok,_} = check_simpleType(base64Binary,"05+/AA==",dummy),
+ ?line {ok,_} = check_simpleType(base64Binary,"05+/AA= =",dummy),
+ ?line {ok,_} = check_simpleType(base64Binary,"05+/A A= =",dummy),
+ ?line {ok,_} = check_simpleType(base64Binary,"05+/ AA= =",dummy),
+ ?line {error,_} = check_simpleType(base64Binary,"05+/AA== ",dummy),
+ B64B1 = "AbCd GhZz 09w=",
+ ?line {ok,_} = check_simpleType(base64Binary,B64B1,dummy),
+ B64B2 = "AbCd GhZ9 0z8 =",
+ ?line {ok,_} = check_simpleType(base64Binary,B64B2,dummy),
+ ?line {ok,_} = check_simpleType(base64Binary,"0z8 =",dummy),
+ ErrB641 = "AbCd GZ9 0z8 =",
+ ?line {error,_} = check_simpleType(base64Binary,ErrB641,dummy).
+
+anyURI(suite) -> [];
+anyURI(_Config) ->
+ URI1 = "ftp://ftp.is.co.za/rfc/rfc1808.txt",
+ URI2 = "gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles",
+ URI3 = "http://www.math.uio.no/faq/compression-faq/part1.html",
+ URI4 = "mailto:[email protected]",
+ URI5 = "news:comp.infosystems.www.servers.unix",
+ URI6 = "telnet://melvyl.ucop.edu/",
+ ?line ok=ok_loop(anyURI,[URI1,URI2,URI3,URI4,URI5,URI6]).
+
+
+'QName'(suite) -> [];
+'QName'(_Config) ->
+ %% QName ::= (Prefix ':')? LocalPart
+ %% Prefix ::= NCName
+ %% LocalPart ::= NCName
+ ?line {ok,_} = check_simpleType('QName',"abc:def",dummy),
+ ?line {ok,_} = check_simpleType('QName',"abc",dummy),
+ ?line {ok,_} = check_simpleType('QName',"abc:def:ijk",dummy).
+
+'NOTATION'(suite) -> [];
+'NOTATION'(_Config) ->
+ ?line {ok,_} = check_simpleType('NOTATION',"abc:def",dummy),
+ ?line {ok,_} = check_simpleType('NOTATION',"abc",dummy),
+ ?line {ok,_} = check_simpleType('NOTATION',"abc:def:ijk",dummy).
+
+normalizedString(suite) -> [];
+normalizedString(_Config) ->
+ %% not contain the carriage return (#xD), line feed (#xA) nor tab
+ %% (#x9) characters.
+ NStr1 = "this string is ok with extra space between characters",
+ NotNStr1 = "this string is not normalized \t",
+ NotNStr2 = "neither is this \n string",
+ NotNStr3 = "or this \r string",
+ ?line {ok,_} = check_simpleType(normalizedString,NStr1,dummy),
+ ?line ok=error_loop(normalizedString,[NotNStr1,NotNStr2,NotNStr3]).
+
+token(suite) -> [];
+token(_Config) ->
+ %% not contain the carriage return (#xD), line feed (#xA) nor tab
+ %% (#x9) characters, that have no leading or trailing spaces
+ %% (#x20) and that have no internal sequences of two or more
+ %% spaces.
+ T1 = "this string is tokenized with only single space between characters",
+ NotT1 = "this string is not ok with extra space between characters",
+ NotT2 = " neither leading space",
+ NotT3 = "nor trailing space ",
+ NotT4 = "tabs not \t allowed",
+ NotT5 = "newlines not allowed\n",
+ NotT6 = "or \r (carriage return)",
+ ?line {ok,_} = check_simpleType(token,T1,dummy),
+ ?line ok=error_loop(token,[NotT1,NotT2,NotT3,NotT4,NotT5,NotT6]).
+
+language(suite) -> [];
+language(_Config) ->
+ %% strings that conform to the pattern
+ %% [a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*
+ L = "Abra-cadabra-123",
+ NotL1 = "Abra123-cadabra!",
+ NotL2 = "Abra-",
+ NotL3 = "Abracadabra",
+ NotL4 = "Abra-cadabrrra",
+ ?line {ok,_} = check_simpleType(language,L,dummy),
+ ?line ok=error_loop(language,[NotL1,NotL2,NotL3,NotL4]).
+
+'NMTOKEN'(suite) -> [];
+'NMTOKEN'(_Config) ->
+ N = "name:withoutspace",
+ NotN1 = "name with space",
+ NotN2 = "namewith#strang/chars)",
+ ?line {ok,_} = check_simpleType('NMTOKEN',N,dummy),
+ ?line {error,_} = check_simpleType('NMTOKEN',NotN1,dummy),
+ ?line {error,_} = check_simpleType('NMTOKEN',NotN2,dummy).
+
+'NMTOKENS'(suite) -> [];
+'NMTOKENS'(_Config) ->
+ N1 = "name1 name:2 name:three",
+ NotN1 = "name na%me",
+ ?line {ok,_} = check_simpleType('NMTOKENS',N1,dummy),
+ ?line {error,_} = check_simpleType('NMTOKENS',NotN1,dummy).
+
+'Name'(suite) -> [];
+'Name'(_Config) ->
+ ?line {ok,_} = check_simpleType('Name',"_valid_Name",dummy).
+
+'NCName'(suite) -> [];
+'NCName'(_Config) ->
+ ?line {ok,_} = check_simpleType('NCName',"_valid_Name",dummy).
+
+'ID'(suite) -> [];
+'ID'(_Config) ->
+ ?line {ok,_} = check_simpleType('ID',"_valid_Name",dummy).
+
+'IDREF'(suite) -> [];
+'IDREF'(_Config) ->
+ ?line {ok,_} = check_simpleType('IDREF',"_valid_Name",dummy).
+
+'IDREFS'(suite) -> [];
+'IDREFS'(_Config) ->
+ ?line {ok,_} = check_simpleType('IDREFS',"_valid_Name Name2",dummy).
+
+'ENTITY'(suite) -> [];
+'ENTITY'(_Config) ->
+ ?line {ok,_} = check_simpleType('ENTITY',"_valid_Name",dummy).
+
+'ENTITIES'(suite) -> [];
+'ENTITIES'(_Config) ->
+ ?line {ok,_} = check_simpleType('ENTITIES',"name name3",dummy).
+
+integer(suite) -> [];
+integer(_Config) ->
+ IntList = ["-1", "0", "12678967543233", "+100000"],
+ ?line ok = ok_loop(integer,IntList),
+ ?line {error,_} = check_simpleType(integer,"1.3",dummy).
+
+nonPositiveInteger(suite) -> [];
+nonPositiveInteger(_Config) ->
+ NPIList = ["0", "-12678967543233", "-100000"],
+ ?line ok = ok_loop(nonPositiveInteger,NPIList),
+ ?line {error,_} = check_simpleType(nonPositiveInteger,"1",dummy).
+
+negativeInteger(suite) -> [];
+negativeInteger(_Config) ->
+ NIList = ["-1", "-12678967543233", "-100000"],
+ ?line ok = ok_loop(negativeInteger,NIList),
+ ?line {error,_} = check_simpleType(negativeInteger,"1",dummy),
+ ?line {error,_} = check_simpleType(negativeInteger,"0",dummy).
+
+long(suite) -> [];
+long(_Config) ->
+ L = ["9223372036854775807","-9223372036854775808","-1", "0",
+ "12678967543233", "+100000"],
+ ?line ok = ok_loop(long,L),
+ Err = ["9223372036854775808","-9223372036854775809"],
+ ?line ok = error_loop(long,Err).
+
+int(suite) -> [];
+int(_Config) ->
+ L = ["2147483647", "-2147483648", "-1", "0", "126789675", "+100000"],
+ ?line ok = ok_loop(int,L),
+ Err = ["2147483648", "-2147483649"],
+ ?line ok = error_loop(int,Err).
+
+short(suite) -> [];
+short(_Config) ->
+ L = ["32767", "-32768", "-1", "0", "12678", "+10000"],
+ ?line ok = ok_loop(short,L),
+ Err = ["32768", "-32769"],
+ ?line ok = error_loop(short,Err).
+
+byte(suite) -> [];
+byte(_Config) ->
+ L = ["-1", "0", "126", "+100", "127", "-128"],
+ ?line ok = ok_loop(byte,L),
+ Err = ["128", "-129"],
+ ?line ok = error_loop(byte,Err).
+
+nonNegativeInteger(suite) -> [];
+nonNegativeInteger(_Config) ->
+ L = ["1", "0", "12678967543233", "+100000"],
+ ?line ok = ok_loop(nonNegativeInteger,L),
+ ?line {error,_} = check_simpleType(nonNegativeInteger,"-1",dummy).
+
+unsignedLong(suite) -> [];
+unsignedLong(_Config) ->
+ L = ["0", "12678967543233", "100000", "18446744073709551615"],
+ ?line ok = ok_loop(unsignedLong,L),
+ Err = ["-1","18446744073709551616"],
+ ?line ok = error_loop(unsignedLong,Err).
+
+unsignedInt(suite) -> [];
+unsignedInt(_Config) ->
+ L = ["4294967295", "0", "1267896754", "100000"],
+ ?line ok = ok_loop(unsignedInt,L),
+ Err = ["-1","4294967296"],
+ ?line ok = error_loop(unsignedInt,Err).
+
+unsignedShort(suite) -> [];
+unsignedShort(_Config) ->
+ L = ["65535", "0", "12678", "10000"],
+ ?line ok = ok_loop(unsignedShort,L),
+ Err = ["-1","65536"],
+ ?line ok = error_loop(unsignedShort,Err).
+
+unsignedByte(suite) -> [];
+unsignedByte(_Config) ->
+ L = ["255", "0", "126", "100"],
+ ?line ok = ok_loop(unsignedByte,L),
+ Err = ["-1","256"],
+ ?line ok = error_loop(unsignedByte,Err).
+
+positiveInteger(suite) -> [];
+positiveInteger(_Config) ->
+ L = ["1", "12678967543233", "+100000"],
+ ?line ok = ok_loop(positiveInteger,L),
+ Err = ["-1","0"],
+ ?line ok = error_loop(positiveInteger,Err).
+
+
+
+ok_loop(_Type,[]) ->
+ ok;
+ok_loop(Type,[H|T]) ->
+ ?line {ok,_} = check_simpleType(Type,H,dummy),
+ ok_loop(Type,T).
+
+error_loop(_T,[]) ->
+ ok;
+error_loop(Type,[H|T]) ->
+ ?line {error,_} = check_simpleType(Type,H,dummy),
+ error_loop(Type,T).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Testing facets
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+length(suite) -> [];
+length(_Config) ->
+ ?line {ok,"string"} =
+ (xmerl_xsd_type:facet_fun(string,{length,"6"}))("string"),
+ ?line {error,{length,12,should_be,6}} =
+ (xmerl_xsd_type:facet_fun(string,{length,"6"}))("stringstring"),
+ ok.
+
+minLength(suite) -> [];
+minLength(_Config) ->
+ ?line {ok,"string"} =
+ (xmerl_xsd_type:facet_fun(string,{minLength,"6"}))("string"),
+ ?line {error,{minLength,3,should_at_least_be,6}} =
+ (xmerl_xsd_type:facet_fun(string,{minLength,"6"}))("str"),
+ ok.
+
+maxLength(suite) -> [];
+maxLength(_Config) ->
+ ?line {ok,"string"} =
+ (xmerl_xsd_type:facet_fun(string,{maxLength,"6"}))("string"),
+ ?line {error,{maxLength,12,should_not_be_more_than,6}} =
+ (xmerl_xsd_type:facet_fun(string,{maxLength,"6"}))("stringstring"),
+ ok.
+
+pattern(suite) -> [];
+pattern(_Config) ->
+ RE1 = "[a-z]{5}",
+ ?line {ok,"calle"} =
+ (xmerl_xsd_type:facet_fun(string,{pattern,RE1}))
+ ("calle"),
+ ?line {error,{pattern_mismatch,"cal",RE1}} =
+ (xmerl_xsd_type:facet_fun(string,{pattern,RE1}))
+ ("cal"),
+ RE2 = "[A-Z]{2}\\d\\s\\d[A-Z]{2}",
+ ?line {ok,"AY2 3BC"} =
+ (xmerl_xsd_type:facet_fun(string,{pattern,RE2}))
+ ("AY2 3BC"),
+ ?line {error,{pattern_mismatch,"AY23BC",RE2}} =
+ (xmerl_xsd_type:facet_fun(string,{pattern,RE2}))
+ ("AY23BC").
+
+enumeration(suite) -> [];
+enumeration(_Config) ->
+ ?line {ok,"tomat"} =
+ (xmerl_xsd_type:facet_fun(string,{enumeration,["gurka","tomat","sallad"]}))("tomat"),
+ ?line {error,{enumeration,"morot",should_be_one_of,["gurka","tomat","sallad"]}} =
+ (xmerl_xsd_type:facet_fun(string,{enumeration,["gurka","tomat","sallad"]}))("morot"),
+ ok.
+
+whiteSpace(suite) -> [];
+whiteSpace(_Config) ->
+ ?line {ok,"gur ka"} = (xmerl_xsd_type:facet_fun(string,{whiteSpace,"collapse"}))(" gur\tka "),
+ ?line {ok," gur ka "} = (xmerl_xsd_type:facet_fun(string,{whiteSpace,"replace"}))(" gur\nka\t"),
+ ?line {ok," gurk\na\t"} = (xmerl_xsd_type:facet_fun(string,{whiteSpace,"preserve"}))(" gurk\na\t"),
+ ok.
+
+maxInclusive(suite) -> [];
+maxInclusive(_Config) ->
+ ?line {error,{maxInclusive,"3",should_be_less_than_or_equal_with,"2"}} =
+ (xmerl_xsd_type:facet_fun(integer,{maxInclusive,"2"}))("3"),
+
+ ?line {error,{maxInclusive,"3",should_be_less_than_or_equal_with,"2"}} =
+ (xmerl_xsd_type:facet_fun(decimal,{maxInclusive,"2"}))("3"),
+ ?line {error,{maxInclusive,_,should_be_less_than_or_equal_with,_}} =
+ (xmerl_xsd_type:facet_fun(decimal,{maxInclusive,"2.234"}))("2.235"),
+ ?line {error,{maxInclusive,_,should_be_less_than_or_equal_with,_}} =
+ (xmerl_xsd_type:facet_fun(decimal,{maxInclusive,"-2.222"}))("-2.221"),
+
+ ?line {error,{maxInclusive,_,should_be_less_than_or_equal_with,_}} =
+ (xmerl_xsd_type:facet_fun(double,{maxInclusive,"2.333"}))("INF"),
+ ?line {error,{maxInclusive,_,should_be_less_than_or_equal_with,_}} =
+ (xmerl_xsd_type:facet_fun(double,{maxInclusive,"1E3"}))("1001"),
+
+ ?line {error,{maxInclusive,_,should_be_less_than_or_equal_with,_}} =
+ (xmerl_xsd_type:facet_fun(float,{maxInclusive,"-0.1"}))("-0"),
+ ?line {error,{maxInclusive,_,should_be_less_than_or_equal_with,_}} =
+ (xmerl_xsd_type:facet_fun(float,{maxInclusive,"0"}))("0.01"),
+
+ ?line {ok,"3"} = (xmerl_xsd_type:facet_fun(integer,{maxInclusive,"3"}))("3"),
+
+ ?line {ok,"+100000.00"} =
+ (xmerl_xsd_type:facet_fun(decimal,{maxInclusive,"1E6"}))("+100000.00"),
+ ?line {ok,"12678967.543222"} =
+ (xmerl_xsd_type:facet_fun(decimal,{maxInclusive,"12678967.543233"}))("12678967.543222"),
+
+ ?line {ok,"3.2E-11"} =
+ (xmerl_xsd_type:facet_fun(double,{maxInclusive,"2E-10"}))("3.2E-11"),
+ ?line {ok,"10E20"} =
+ (xmerl_xsd_type:facet_fun(double,{maxInclusive,"INF"}))("10E20"),
+ ?line {ok,"0.127"} =
+ (xmerl_xsd_type:facet_fun(double,{maxInclusive,"12.78e-2"}))("0.127"),
+
+ ?line {ok,"1267.43233E12"} = (xmerl_xsd_type:facet_fun(float,{maxInclusive,"1267.43233E12"}))("1267.43233E12"),
+ ?line {ok,"34E-26"} = (xmerl_xsd_type:facet_fun(float,{maxInclusive,"33E-25"}))("34E-26"),
+
+ ?line {ok,"2007-10-26T12:00:00+03:00"} =
+ (xmerl_xsd_type:facet_fun(dateTime,{maxInclusive,"2007-10-26T12:00:00+03:00"}))("2007-10-26T12:00:00+03:00"),
+ ?line {ok,"2007-10-26T11:00:00+03:00"} =
+ (xmerl_xsd_type:facet_fun(dateTime,{maxInclusive,"2007-10-26T12:00:00+03:00"}))("2007-10-26T11:00:00+03:00"),
+ ?line {error,{maxInclusive,_,should_be_less_than_or_equal_with,_}} =
+ (xmerl_xsd_type:facet_fun(dateTime,{maxInclusive,"2007-10-26T12:00:00+03:00"}))("2007-10-26T12:00:00"),
+
+ ?line {ok,"P1Y2M3DT10H30M"} =
+ (xmerl_xsd_type:facet_fun(duration,{maxInclusive,"P1Y2M4D"}))("P1Y2M3DT10H30M"),
+ ?line {error,{maxInclusive,_,should_be_less_than_or_equal_with,_}} =
+ (xmerl_xsd_type:facet_fun(duration,{maxInclusive,"P1Y2M3DT10H"}))("P1Y2M3DT10H30M"),
+ ok.
+
+maxExclusive(suite) -> [];
+maxExclusive(_Config) ->
+ ?line {error,{maxExclusive,"2",not_less_than,"2"}} =
+ (xmerl_xsd_type:facet_fun(integer,{maxExclusive,"2"}))("2"),
+ ?line {error,{maxExclusive,"-19999",not_less_than,"-20000"}} =
+ (xmerl_xsd_type:facet_fun(integer,{maxExclusive,"-20000"}))("-19999"),
+
+ ?line {error,{maxExclusive,"3.0000",not_less_than,"2.9999"}} =
+ (xmerl_xsd_type:facet_fun(decimal,{maxExclusive,"2.9999"}))("3.0000"),
+ ?line {error,{maxExclusive,_,not_less_than,_}} =
+ (xmerl_xsd_type:facet_fun(decimal,{maxExclusive,"2.234"}))("2.234"),
+ ?line {error,{maxExclusive,_,not_less_than,_}} =
+ (xmerl_xsd_type:facet_fun(decimal,{maxExclusive,"-2.22222222"}))("-2.22222222"),
+
+ ?line {error,{maxExclusive,_,not_less_than,_}} =
+ (xmerl_xsd_type:facet_fun(double,{maxExclusive,"2.333E23"}))("INF"),
+ ?line {error,{maxExclusive,_,not_less_than,_}} =
+ (xmerl_xsd_type:facet_fun(double,{maxExclusive,"1E3"}))("1000"),
+ ?line {error,{maxExclusive,_,not_less_than,_}} =
+ (xmerl_xsd_type:facet_fun(double,{maxExclusive,"1E-13"}))("0.999E-12"),
+
+ ?line {error,{maxExclusive,_,not_less_than,_}} =
+ (xmerl_xsd_type:facet_fun(float,{maxExclusive,"-0.1"}))("-0.01E1"),
+ ?line {error,{maxExclusive,_,not_less_than,_}} =
+ (xmerl_xsd_type:facet_fun(float,{maxExclusive,"-1E-1"}))("-0"),
+
+ ?line {ok,"-4"} = (xmerl_xsd_type:facet_fun(integer,{maxExclusive,"3"}))("-4"),
+
+ ?line {ok,"+100000.00"} =
+ (xmerl_xsd_type:facet_fun(decimal,{maxExclusive,"1E6"}))("+100000.00"),
+ %% must support 18 digits
+ ?line {ok,"12678967.5432323456"} =
+ (xmerl_xsd_type:facet_fun(decimal,{maxExclusive,"12678967.5432323457"}))("12678967.5432323456"),
+
+ ?line {ok,"3.2E-11"} =
+ (xmerl_xsd_type:facet_fun(double,{maxExclusive,"2E-10"}))("3.2E-11"),
+ ?line {ok,"10E20"} =
+ (xmerl_xsd_type:facet_fun(double,{maxExclusive,"INF"}))("10E20"),
+ ?line {ok,"0.127"} =
+ (xmerl_xsd_type:facet_fun(double,{maxExclusive,"12.78e-2"}))("0.127"),
+
+ ?line {ok,"1267.43233E11"} = (xmerl_xsd_type:facet_fun(float,{maxExclusive,"1267.43233E12"}))("1267.43233E11"),
+ ?line {ok,"34E-26"} = (xmerl_xsd_type:facet_fun(float,{maxExclusive,"33E-25"}))("34E-26"),
+
+ ?line {ok,"P1Y2M3DT10H30M"} = (xmerl_xsd_type:facet_fun(duration,{maxExclusive,"P1Y2M4D"}))("P1Y2M3DT10H30M"),
+
+ ?line {ok,"2006-09-06T19:17:45Z"} = (xmerl_xsd_type:facet_fun(dateTime,{maxExclusive,"2006-09-06T19:17:46Z"}))("2006-09-06T19:17:45Z"),
+ ok.
+
+minExclusive(suite) -> [];
+minExclusive(_Config) ->
+ ?line {error,{minExclusive,"2",not_greater_than,"2"}} =
+ (xmerl_xsd_type:facet_fun(integer,{minExclusive,"2"}))("2"),
+ ?line {error,{minExclusive,"-20001",not_greater_than,"-20000"}} =
+ (xmerl_xsd_type:facet_fun(integer,{minExclusive,"-20000"}))("-20001"),
+
+ ?line {error,{minExclusive,"2.9999",not_greater_than,"2.9999"}} =
+ (xmerl_xsd_type:facet_fun(decimal,{minExclusive,"2.9999"}))("2.9999"),
+ ?line {error,{minExclusive,_,not_greater_than,_}} =
+ (xmerl_xsd_type:facet_fun(decimal,{minExclusive,"-123456789.123456788"}))("-123456789.123456789"),
+ ?line {error,{minExclusive,_,not_greater_than,_}} =
+ (xmerl_xsd_type:facet_fun(decimal,{minExclusive,"-2.222222000"}))("-2.22222222"),
+
+ ?line {error,{minExclusive,_,not_greater_than,_}} =
+ (xmerl_xsd_type:facet_fun(double,{minExclusive,"INF"}))("2.333E23"),
+ ?line {error,{minExclusive,_,not_greater_than,_}} =
+ (xmerl_xsd_type:facet_fun(double,{minExclusive,"1E3"}))("1000"),
+ ?line {error,{minExclusive,_,not_greater_than,_}} =
+ (xmerl_xsd_type:facet_fun(double,{minExclusive,"1E-13"}))("0.999E-14"),
+
+ ?line {error,{minExclusive,_,not_greater_than,_}} =
+ (xmerl_xsd_type:facet_fun(float,{minExclusive,"-0.1"}))("-0.01E1"),
+ ?line {error,{minExclusive,_,not_greater_than,_}} =
+ (xmerl_xsd_type:facet_fun(float,{minExclusive,"-0"}))("-1E-1"),
+
+ ?line {ok,"4"} = (xmerl_xsd_type:facet_fun(integer,{minExclusive,"-3"}))("4"),
+
+ ?line {ok,"+1000001.00"} =
+ (xmerl_xsd_type:facet_fun(decimal,{minExclusive,"1E6"}))("+1000001.00"),
+ %% must support 18 digits
+ ?line {ok,"12678967.5432323456"} =
+ (xmerl_xsd_type:facet_fun(decimal,{minExclusive,"12678967.54323234555"}))("12678967.5432323456"),
+
+ ?line {ok,"3.2E-11"} =
+ (xmerl_xsd_type:facet_fun(double,{minExclusive,"2E-12"}))("3.2E-11"),
+ ?line {ok,"10E20"} =
+ (xmerl_xsd_type:facet_fun(double,{minExclusive,"-INF"}))("10E20"),
+ ?line {ok,"0.1279"} =
+ (xmerl_xsd_type:facet_fun(double,{minExclusive,"12.78e-2"}))("0.1279"),
+
+ ?line {ok,"126743.233E11"} = (xmerl_xsd_type:facet_fun(float,{minExclusive,"1267.43233E12"}))("126743.233E11"),
+ ?line {ok,"34E-26"} = (xmerl_xsd_type:facet_fun(float,{minExclusive,"33E-27"}))("34E-26"),
+
+ ?line {ok,"P1Y2M3DT10H30M"} = (xmerl_xsd_type:facet_fun(duration,{minExclusive,"P1Y2M3D"}))("P1Y2M3DT10H30M"),
+
+ ?line {ok,"2006-09-06T19:17:45Z"} = (xmerl_xsd_type:facet_fun(dateTime,{minExclusive,"2006-09-06T19:17:44Z"}))("2006-09-06T19:17:45Z"),
+ ok.
+
+minInclusive(suite) -> [];
+minInclusive(_Config) ->
+ ?line {error,{minInclusive,"1",not_greater_than_or_equal_with,"2"}} =
+ (xmerl_xsd_type:facet_fun(integer,{minInclusive,"2"}))("1"),
+ ?line {error,{minInclusive,"-20001",not_greater_than_or_equal_with,
+ "-20000"}} =
+ (xmerl_xsd_type:facet_fun(integer,{minInclusive,"-20000"}))("-20001"),
+
+ ?line {error,{minInclusive,"2.9999",not_greater_than_or_equal_with,
+ "2.99999"}} =
+ (xmerl_xsd_type:facet_fun(decimal,{minInclusive,"2.99999"}))("2.9999"),
+ ?line {error,{minInclusive,_,not_greater_than_or_equal_with,_}} =
+ (xmerl_xsd_type:facet_fun(decimal,{minInclusive,"-123456789.123456788"}))("-123456789.123456789"),
+ ?line {error,{minInclusive,_,not_greater_than_or_equal_with,_}} =
+ (xmerl_xsd_type:facet_fun(decimal,{minInclusive,"-2.222222000"}))("-2.22222222"),
+
+ ?line {error,{minInclusive,_,not_greater_than_or_equal_with,_}} =
+ (xmerl_xsd_type:facet_fun(double,{minInclusive,"2.333E23"}))("-INF"),
+ ?line {error,{minInclusive,_,not_greater_than_or_equal_with,_}} =
+ (xmerl_xsd_type:facet_fun(double,{minInclusive,"1E3"}))("100"),
+ ?line {error,{minInclusive,_,not_greater_than_or_equal_with,_}} =
+ (xmerl_xsd_type:facet_fun(double,{minInclusive,"1E-13"}))("0.999E-14"),
+
+ ?line {error,{minInclusive,_,not_greater_than_or_equal_with,_}} =
+ (xmerl_xsd_type:facet_fun(float,{minInclusive,"-0.1"}))("-0.1E1"),
+ ?line {error,{minInclusive,_,not_greater_than_or_equal_with,_}} =
+ (xmerl_xsd_type:facet_fun(float,{minInclusive,"-0"}))("-1E-1"),
+ ?line {error,_}=(xmerl_xsd_type:facet_fun(float,{minInclusive,"10E-10"}))("10E-11"),
+
+ ?line {ok,"4"} = (xmerl_xsd_type:facet_fun(integer,{minInclusive,"-3"}))("4"),
+
+ ?line {ok,"+1000000.00"} =
+ (xmerl_xsd_type:facet_fun(decimal,{minInclusive,"1E6"}))("+1000000.00"),
+ %% must support 18 digits
+ ?line {ok,"12678967.5432323456"} =
+ (xmerl_xsd_type:facet_fun(decimal,{minInclusive,"12678967.54323234555"}))("12678967.5432323456"),
+
+ ?line {ok,"3.2E-11"} =
+ (xmerl_xsd_type:facet_fun(double,{minInclusive,"2E-12"}))("3.2E-11"),
+ ?line {ok,"10E20"} =
+ (xmerl_xsd_type:facet_fun(double,{minInclusive,"-INF"}))("10E20"),
+ ?line {ok,"0.1279"} =
+ (xmerl_xsd_type:facet_fun(double,{minInclusive,"12.78e-2"}))("0.1279"),
+
+ ?line {ok,"126743.233E11"} = (xmerl_xsd_type:facet_fun(float,{minInclusive,"1267.43233E12"}))("126743.233E11"),
+ ?line {ok,"34E-26"} = (xmerl_xsd_type:facet_fun(float,{minInclusive,"33E-27"}))("34E-26"),
+ ?line {ok,"34E-26"} = (xmerl_xsd_type:facet_fun(float,{minInclusive,"340E-27"}))("34E-26"),
+
+ ?line {ok,"P1Y2M3DT10H30M"} = (xmerl_xsd_type:facet_fun(duration,{minInclusive,"P1Y2M3D"}))("P1Y2M3DT10H30M"),
+
+ ?line {ok,"2006-09-06T19:17:45Z"} = (xmerl_xsd_type:facet_fun(dateTime,{minInclusive,"2006-09-06T19:17:45Z"}))("2006-09-06T19:17:45Z"),
+ ok.
+
+totalDigits(suite) -> [];
+totalDigits(_Config) ->
+ ?line {error,{totalDigits,4,to_many_digits}} =
+ (xmerl_xsd_type:facet_fun(integer,{totalDigits,"3"}))("3456"),
+ ?line {error,{totalDigits,4,to_many_digits}} =
+ (xmerl_xsd_type:facet_fun(decimal,{totalDigits,"3"}))("00345.600"),
+
+ ?line {ok,"555"} =
+ (xmerl_xsd_type:facet_fun(integer,{totalDigits,"3"}))("555"),
+ ?line {ok,"555"} =
+ (xmerl_xsd_type:facet_fun(integer,{totalDigits,"7"}))("555"),
+ ?line {ok,"555.555"} =
+ (xmerl_xsd_type:facet_fun(decimal,{totalDigits,"7"}))("555.555"),
+ ?line {ok,"555.555000000"} =
+ (xmerl_xsd_type:facet_fun(decimal,{totalDigits,"7"}))("555.555000000"),
+ ok.
+
+fractionDigits(suite) -> [];
+fractionDigits(_Config) ->
+ ?line {error,{fractionDigits,3,to_many_digits_in,"555.555000000"}} =
+ (xmerl_xsd_type:facet_fun(decimal,{fractionDigits,"2"}))("555.555000000"),
+ ?line {error,{fractionDigits,6,to_many_digits_in,"555.555001"}} =
+ (xmerl_xsd_type:facet_fun(decimal,{fractionDigits,"5"}))("555.555001"),
+
+ ?line {ok,"555.55500"} =
+ (xmerl_xsd_type:facet_fun(decimal,{fractionDigits,"5"}))("555.55500"),
+ ?line {ok,"555"} =
+ (xmerl_xsd_type:facet_fun(decimal,{fractionDigits,"5"}))("555"),
+ ?line {ok,"555.000"} =
+ (xmerl_xsd_type:facet_fun(decimal,{fractionDigits,"0"}))("555.000"),
+
+ ?line {ok,"555"} =
+ (xmerl_xsd_type:facet_fun(integer,{fractionDigits,"0"}))("555"),
+ ok.
+
+%% some block testing of dateTime and duration comparisons
+compare_dateTime(suite) -> [];
+compare_dateTime(_Config) ->
+ %% comparison results according to table in section 3.2.7.4 of XML
+ %% Schema part 2
+ ?line lt = xmerl_xsd_type:compare_dateTime("2000-01-15T00:00:00",
+ "2000-02-15T00:00:00"),
+ ?line gt = xmerl_xsd_type:compare_dateTime("2000-02-15T00:00:00",
+ "2000-01-15T00:00:00"),
+
+ ?line lt = xmerl_xsd_type:compare_dateTime("2000-01-15T12:00:00",
+ "2000-01-16T12:00:00Z"),
+ ?line gt = xmerl_xsd_type:compare_dateTime("2000-01-16T12:00:00Z",
+ "2000-01-15T12:00:00"),
+
+ ?line indefinite = xmerl_xsd_type:compare_dateTime("2000-01-01T12:00:00",
+ "1999-12-31T23:00:00Z"),
+ ?line indefinite = xmerl_xsd_type:compare_dateTime("1999-12-31T23:00:00Z",
+ "2000-01-01T12:00:00"),
+
+ ?line indefinite = xmerl_xsd_type:compare_dateTime("2000-01-16T12:00:00",
+ "2000-01-16T12:00:00Z"),
+ ?line indefinite = xmerl_xsd_type:compare_dateTime("2000-01-16T12:00:00Z",
+ "2000-01-16T12:00:00"),
+
+ ?line indefinite = xmerl_xsd_type:compare_dateTime("2000-01-16T00:00:00",
+ "2000-01-16T12:00:00Z"),
+ ?line indefinite = xmerl_xsd_type:compare_dateTime("2000-01-16T12:00:00Z",
+ "2000-01-16T00:00:00"),
+
+ %% example in appendix E.1 in XML Schema part 2.
+ ?line {2001,4,17,19,23,17.3000,{pos,0,0}} =
+ xmerl_xsd_type:add_duration2dateTime("2000-01-12T12:13:14Z",
+ "P1Y3M5DT7H10M3.3S").
+
+compare_duration(suite) -> [];
+compare_duration(_Config) ->
+ %% order relations according to section 3.2.6.2 in XML Schema
+ %% part2.
+ ?line gt = xmerl_xsd_type:compare_durations("P1Y","P364D"),
+ ?line indefinite = xmerl_xsd_type:compare_durations("P1Y","P365D"),
+ ?line indefinite = xmerl_xsd_type:compare_durations("P1Y","P366D"),
+ ?line lt = xmerl_xsd_type:compare_durations("P1Y","P367D"),
+
+ ?line gt = xmerl_xsd_type:compare_durations("P1M","P27D"),
+ ?line indefinite = xmerl_xsd_type:compare_durations("P1M","P28D"),
+ ?line indefinite = xmerl_xsd_type:compare_durations("P1M","P29D"),
+ ?line indefinite = xmerl_xsd_type:compare_durations("P1M","P30D"),
+ ?line indefinite = xmerl_xsd_type:compare_durations("P1M","P31D"),
+ ?line lt = xmerl_xsd_type:compare_durations("P1M","P32D"),
+
+ ?line gt = xmerl_xsd_type:compare_durations("P5M","P149D"),
+ ?line indefinite = xmerl_xsd_type:compare_durations("P5M","P150D"),
+ ?line indefinite = xmerl_xsd_type:compare_durations("P5M","P151D"),
+ ?line indefinite = xmerl_xsd_type:compare_durations("P5M","P152D"),
+ ?line indefinite = xmerl_xsd_type:compare_durations("P5M","P153D"),
+ ?line lt = xmerl_xsd_type:compare_durations("P5M","P154D").
+
+
+po(suite) -> [];
+po(Config) ->
+ ?line {E,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "po.xml"]),[]),
+ ?line {E,_} = xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),
+ "po.xsd"]),E,[]).
+
+po1(suite) -> [];
+po1(Config) ->
+ ?line {E,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "po1.xml"]),[]),
+ ?line {E2,_} = xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),
+ "po1.xsd"]),E,[]),
+ ?line ok = xmerl_test_lib:cmp_element(E,E2).
+
+po2(suite) -> [];
+po2(Config) ->
+ ?line {E,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "po2.xml"]),[]),
+ ?line {E2,_} = xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),
+ "po1.xsd"]),E,[]),
+ ?line ok = xmerl_test_lib:cmp_element(E,E2).
+
+ipo(suite) -> [];
+ipo(Config) ->
+ ?line {E,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "ipo.xml"]),[]),
+ ?line {VE,_} = xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),
+ "ipo.xsd"]),E,[]),
+ ?line ok = xmerl_test_lib:cmp_element(E,VE).
+
+ipo_redefine(suite) -> [];
+ipo_redefine(Config) ->
+ ?line {E,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "ipo_redefine.xml"]),[]),
+ ?line {VE,_} = xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),
+ "ipo_redefine.xsd"]),E,[]),
+ ?line ok = xmerl_test_lib:cmp_element(E,VE).
+
+'4Q99'(suite) -> [];
+'4Q99'(Config) ->
+ ?line {E,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "4Q99.xml"]),[]),
+ %% the import in report.xsd lacks schemaLocation, so the imported
+ %% namespace definitions have to be loaded separately.
+ ?line {ok,S} =
+ xmerl_xsd:process_schema(filename:join([?config(data_dir,Config),
+ "ipo.xsd"])),
+ ?line {VE,_} = xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),
+ "report.xsd"]),E,[{state,S}]),
+ ?line ok = xmerl_test_lib:cmp_element(E,VE),
+
+ %% report2.xsd has an import element with a schemaLocation attribute
+ ?line {VE,_} = xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),
+ "report2.xsd"]),E,[]).
+
+small(suite) -> [];
+small(Config) ->
+ ?line {E=#xmlElement{},_} =
+ xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "small.xml"]),[]),
+ ?line {VE=#xmlElement{},_} =
+ xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),
+ "small.xsd"]),E,[]),
+ ?line #xmlElement{attributes=Atts,content=C} = VE,
+ ?line C = E#xmlElement.content,
+ %% The attribute orderStatus with default value was absent in small.xml
+
+ %% Test of validation "on the fly" when parsing XML.
+ ?line {VE,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "small.xml"]),
+ [{validation,schema},
+ {schemaLocation,[{"small",filename:join(?config(data_dir,Config),"small.xsd")}]}]),
+ ?line {VE,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "small.xml"]),
+ [{validation,schema}]),
+ ?line true = lists:keymember(orderStatus,#xmlAttribute.name,Atts).
+
+complexType1(suite) -> [];
+complexType1(Config) ->
+ ?line {E1=#xmlElement{},_} =
+ xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "complexTypes1.xml"]),[]),
+ ?line {VE1=#xmlElement{},_} =
+ xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),
+ "complexTypes.xsd"]),E1,[]),
+ ?line ok = xmerl_test_lib:cmp_element(E1,VE1),
+
+ ?line {E2=#xmlElement{},_} =
+ xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "complexTypes2.xml"]),[]),
+ ?line {VE2=#xmlElement{},_} =
+ xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),
+ "complexTypes.xsd"]),E2,[]),
+ ?line ok = xmerl_test_lib:cmp_element(E2,VE2).
+
+model_group_all(suite) -> [];
+model_group_all(Config) ->
+ ?line {E=#xmlElement{},_} =
+ xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "po1.xml"]),[]),
+ ?line {E,_} =
+ xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),
+ "po1_all.xsd"]),E,[]),
+
+ ?line {E1=#xmlElement{},_} =
+ xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "po1_all1.xml"]),[]),
+ ?line {E1,_} =
+ xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),
+ "po1_all.xsd"]),E1,[]),
+
+ ?line {E2=#xmlElement{},_} =
+ xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "po1_all2.xml"]),[]),
+ ?line {E2,_} =
+ xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),
+ "po1_all.xsd"]),E2,[]),
+
+ ?line {E3=#xmlElement{},_} =
+ xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "po1_all_err1.xml"]),[]),
+ ?line {error,_Reason1} =
+ xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),
+ "po1_all.xsd"]),E3,[]),
+
+
+ ?line {E4=#xmlElement{},_} =
+ xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "po1_all_err2.xml"]),[]),
+ ?line {error,_Reason2} =
+ xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),
+ "po1_all.xsd"]),E4,[]).
+
+substitutionGroup(suite) -> [];
+substitutionGroup(Config) ->
+ ?line {E,_} =
+ xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "ipo_substGroup.xml"]),[]),
+ ?line {E,_} =
+ xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),
+ "ipo_substGroup.xsd"]),E,[]).
+attributeGroup(suite) -> [];
+attributeGroup(Config) ->
+ ?line {E,_} =
+ xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "po_attrGroup.xml"]),[]),
+ ?line {E,_} =
+ xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),
+ "po_attrGroup.xsd"]),E,[]).
+test_key1(suite) -> [];
+test_key1(Config) ->
+ ?line {E,_} =
+ xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "vehicle2.xml"]),[]),
+ ?line {E,_} =
+ xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),
+ "vehicle.xsd"]),E,[]),
+
+ ?line {E2,_} =
+ xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "vehicle.xml"]),[]),
+ ?line {error,L2} =
+ xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),
+ "vehicle.xsd"]),E2,[]),
+ ?line 10 = erlang:length(L2),
+
+ ?line {E3 = #xmlElement{},_} =
+ xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "vehicle3.xml"]),[]),
+ ?line {E3 = #xmlElement{},_} =
+ xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),
+ "vehicle.xsd"]),E3,[]).
+
+sis1(suite) -> [];
+sis1(Config) ->
+ ?line {E,_} =
+ xmerl_scan:file(filename:join([?config(data_dir,Config),sis,
+ "instance.xml"]),[]),
+ ?line {#xmlElement{},_} =
+ xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),sis,
+ "IntegratedSite.xsd"]),E,[]).
+sis2(suite) -> [];
+sis2(Config) ->
+ ?line {BS_E,_} =
+ xmerl_scan:file(filename:join([?config(data_dir,Config),sis,
+ "bs_mim.xml"]),[]),
+ ?line {SW_E,_} =
+ xmerl_scan:file(filename:join([?config(data_dir,Config),sis,
+ "swm_mim.xml"]),[]),
+ ?line {HW_E,_} =
+ xmerl_scan:file(filename:join([?config(data_dir,Config),sis,
+ "hwm_mim.xml"]),[]),
+
+ ?line {#xmlElement{},_} =
+ xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),sis,
+ "mim.xsd"]),BS_E,[]),
+ ?line {#xmlElement{},_} =
+ xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),sis,
+ "mim.xsd"]),SW_E,[]),
+ ?line {#xmlElement{},_} =
+ xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),sis,
+ "mim.xsd"]),HW_E,[]).
+
+state2file_file2state(suite) -> [];
+state2file_file2state(Config) ->
+ ?line {E,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "po.xml"]),[]),
+ ?line {ok,S} = xmerl_xsd:process_schema(filename:join([?config(data_dir,Config),"po.xsd"])),
+ ?line {E,_} = xmerl_xsd:validate(E,S),
+ ?line ok = xmerl_xsd:state2file(S),
+ ?line {ok,S} = xmerl_xsd:file2state(filename:join([?config(data_dir,Config),"po.xss"])),
+ ?line {E,_} = xmerl_xsd:validate(E,S),
+
+ ?line ok = xmerl_xsd:state2file(S,filename:join([?config(data_dir,Config),"po_state"])),
+ ?line {ok,S} = xmerl_xsd:file2state(filename:join([?config(data_dir,Config),"po_state.xss"])),
+
+ ?line {E,_} = xmerl_xsd:validate(E,S).
+
+
+union(suite) -> [];
+union(Config) ->
+ ?line {E,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "instance.xml"])),
+
+ ?line {_E2 = #xmlElement{},_} = xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),"measCollec.xsd"]),E).
+
+
+ticket_6910(suite) -> [];
+ticket_6910(Config) ->
+ ?line {E,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),
+ sis,"dummy_action_mim.xml"])),
+ ?line {_E2 = #xmlElement{},_} =
+ xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),
+ sis,"mim2.xsd"]),E).
+ticket_7165(suite) -> [];
+ticket_7165(Config) ->
+ %% The validation option seems not to work
+ ?line {E,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "ticket_7288.xml"]),
+ [{validation, schema}]),
+ %% The option xsdbase gave {error, enoent}.
+ ?line {ok,_} = xmerl_xsd:process_schema("CxDataType_Rel5.xsd", [{xsdbase, ?config(data_dir,Config)}]).
+
+
+
+ticket_7190(suite) -> [];
+ticket_7190(Config) ->
+ ?line {E,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),
+ "int.xml"])),
+ ?line {_E2 = #xmlElement{},_} =
+ xmerl_xsd:process_validate(filename:join([?config(data_dir,Config),
+ "simple_int.xsd"]),E).
+ticket_7288(suite) -> [];
+ticket_7288(Config) ->
+ %% The schema table in the state where deleted by xmerl_xsd:validate if there was an error.
+ ?line {E,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),"ticket_7288.xml"])),
+
+ ?line {ok,S} = xmerl_xsd:process_schema(filename:join([?config(data_dir,Config),"CxDataType_Rel5.xsd"])),
+
+ ?line {error, EL} = xmerl_xsd:validate(E, S),
+
+ ?line {error, EL} = xmerl_xsd:validate(E, S).
+
+ticket_7736(suite) -> [];
+ticket_7736(Config) ->
+ DataDir = ?config(data_dir,Config),
+ ?line {ok, State } =
+ xmerl_xsd:process_schema(filename:join([DataDir,"enum_bug.xsd"])),
+
+ ?line {Entity ,_} =
+ xmerl_scan:file(filename:join([DataDir,"enum_bug.xml"])),
+
+ ?line {#xmlElement{},_} = xmerl_xsd:validate(Entity, State).
+
+ticket_8599(suite) -> [];
+ticket_8599(Config) ->
+ ?line {E,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),"ticket_8599.xml"])),
+
+ ?line {ok, S} = xmerl_xsd:process_schema(filename:join([?config(data_dir,Config),"ticket_8599.xsd"])),
+
+ ?line {{xmlElement,persons,persons,_,_,_,_,_,_,_,_,_},_GlobalState} = xmerl_xsd:validate(E, S).
+
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/4Q99.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/4Q99.xml
new file mode 100644
index 0000000000..a0c4df72bd
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/4Q99.xml
@@ -0,0 +1,25 @@
+<purchaseReport
+ xmlns="http://www.example.com/Report"
+ period="P3M" periodEnding="1999-12-31">
+
+ <regions>
+ <zip code="95819">
+ <part number="872-AA" quantity="1"/>
+ <part number="926-AA" quantity="1"/>
+ <part number="833-AA" quantity="1"/>
+ <part number="455-BX" quantity="1"/>
+ </zip>
+ <zip code="63143">
+ <part number="455-BX" quantity="4"/>
+ </zip>
+ </regions>
+
+ <parts>
+ <part number="872-AA">Lawnmower</part>
+ <part number="926-AA">Baby Monitor</part>
+ <part number="833-AA">Lapis Necklace</part>
+ <part number="455-BX">Sturdy Shelves</part>
+ </parts>
+
+</purchaseReport>
+
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/CxDataType_Rel5.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/CxDataType_Rel5.xsd
new file mode 100644
index 0000000000..8a26fd1492
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/CxDataType_Rel5.xsd
@@ -0,0 +1,211 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+ <xs:simpleType name="tPriority" final="list restriction">
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="tProfilePartIndicator" final="list restriction">
+ <xs:restriction base="xs:unsignedByte">
+ <xs:maxInclusive value="1"/>
+ <xs:enumeration value="0">
+ <xs:annotation>
+ <xs:documentation>
+ <label xml:lang="en">REGISTERED</label>
+ <definition xml:lang="en">iFC is part of the registered profile</definition>
+ </xs:documentation>
+ </xs:annotation>
+ </xs:enumeration>
+ <xs:enumeration value="1">
+ <xs:annotation>
+ <xs:documentation>
+ <label xml:lang="en">UNREGISTERED</label>
+ <definition xml:lang="en">iFC is part of the unregistered profile</definition>
+ </xs:documentation>
+ </xs:annotation>
+ </xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="tGroupID" final="list restriction">
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="tDefaultHandling" final="list restriction">
+ <xs:restriction base="xs:unsignedByte">
+ <xs:maxInclusive value="1"/>
+ <xs:enumeration value="0">
+ <xs:annotation>
+ <xs:documentation>
+ <label xml:lang="en">SESSION_CONTINUED</label>
+ <definition xml:lang="en">Session Continued</definition>
+ </xs:documentation>
+ </xs:annotation>
+ </xs:enumeration>
+ <xs:enumeration value="1">
+ <xs:annotation>
+ <xs:documentation>
+ <label xml:lang="en">SESSION_TERMINATED</label>
+ <definition xml:lang="en">Session Terminated</definition>
+ </xs:documentation>
+ </xs:annotation>
+ </xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="tDirectionOfRequest" final="list restriction">
+ <xs:restriction base="xs:unsignedByte">
+ <xs:maxInclusive value="3"/>
+ <xs:enumeration value="0">
+ <xs:annotation>
+ <xs:documentation>
+ <label xml:lang="en">ORIGINATING_SESSION</label>
+ <definition xml:lang="en">Originating Session</definition>
+ </xs:documentation>
+ </xs:annotation>
+ </xs:enumeration>
+ <xs:enumeration value="1">
+ <xs:annotation>
+ <xs:documentation>
+ <label xml:lang="en">TERMINATING_REGISTERED</label>
+ <definition xml:lang="en">Terminating Session for registered user</definition>
+ </xs:documentation>
+ </xs:annotation>
+ </xs:enumeration>
+ <xs:enumeration value="2">
+ <xs:annotation>
+ <xs:documentation>
+ <label xml:lang="en">TERMINATING_UNREGISTERED</label>
+ <definition xml:lang="en">Terminating Session for unregistered user</definition>
+ </xs:documentation>
+ </xs:annotation>
+ </xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="tPrivateID" final="list restriction">
+ <xs:restriction base="xs:anyURI"/>
+ </xs:simpleType>
+ <xs:simpleType name="tSIP_URL" final="list restriction">
+ <xs:restriction base="xs:anyURI"/>
+ </xs:simpleType>
+ <xs:simpleType name="tTEL_URL" final="list restriction">
+ <xs:restriction base="xs:anyURI"/>
+ </xs:simpleType>
+ <xs:simpleType name="tIdentity" final="list restriction">
+ <xs:union memberTypes="tSIP_URL tTEL_URL"/>
+ </xs:simpleType>
+ <xs:simpleType name="tServiceInfo" final="list restriction">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="tString" final="list restriction">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="tBool">
+ <xs:restriction base="xs:boolean"/>
+ </xs:simpleType>
+ <xs:simpleType name="tSubscribedMediaProfileId" final="list restriction">
+ <xs:restriction base="xs:int">
+ <xs:minInclusive value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="tExtension">
+ <xs:sequence>
+ <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="tIMSSubscription">
+ <xs:sequence>
+ <xs:element name="PrivateID" type="tPrivateID"/>
+ <xs:element name="ServiceProfile" type="tServiceProfile" maxOccurs="unbounded"/>
+ <xs:element name="Extension" type="tExtension" minOccurs="0"/>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="tServiceProfile">
+ <xs:sequence>
+ <xs:element name="PublicIdentity" type="tPublicIdentity" maxOccurs="unbounded"/>
+ <xs:element name="CoreNetworkServicesAuthorization" type="tCoreNetworkServicesAuthorization" minOccurs="0"/>
+ <xs:element name="InitialFilterCriteria" type="tInitialFilterCriteria" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="Extension" type="tExtension" minOccurs="0"/>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="tCoreNetworkServicesAuthorization">
+ <xs:sequence>
+ <xs:element name="SubscribedMediaProfileId" type="tSubscribedMediaProfileId" minOccurs="0"/>
+ <xs:element name="Extension" type="tExtension" minOccurs="0"/>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="tInitialFilterCriteria">
+ <xs:sequence>
+ <xs:element name="Priority" type="tPriority"/>
+ <xs:element name="TriggerPoint" type="tTrigger" minOccurs="0"/>
+ <xs:element name="ApplicationServer" type="tApplicationServer"/>
+ <xs:element name="ProfilePartIndicator" type="tProfilePartIndicator" minOccurs="0"/>
+ <xs:element name="Extension" type="tExtension" minOccurs="0"/>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="tTrigger">
+ <xs:sequence>
+ <xs:element name="ConditionTypeCNF" type="tBool"/>
+ <xs:element name="SPT" type="tSePoTri" maxOccurs="unbounded"/>
+ <xs:element name="Extension" type="tExtension" minOccurs="0"/>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="tSePoTri">
+ <xs:sequence>
+ <xs:element name="ConditionNegated" type="tBool" default="0" minOccurs="0"/>
+ <xs:element name="Group" type="tGroupID" maxOccurs="unbounded"/>
+ <xs:choice>
+ <xs:element name="RequestURI" type="tString"/>
+ <xs:element name="Method" type="tString"/>
+ <xs:element name="SIPHeader" type="tHeader"/>
+ <xs:element name="SessionCase" type="tDirectionOfRequest"/>
+ <xs:element name="SessionDescription" type="tSessionDescription"/>
+ </xs:choice>
+ <xs:element name="Extension" type="tExtension" minOccurs="0"/>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="tHeader">
+ <xs:sequence>
+ <xs:element name="Header" type="tString"/>
+ <xs:element name="Content" type="tString" minOccurs="0"/>
+ <xs:element name="Extension" type="tExtension" minOccurs="0"/>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="tSessionDescription">
+ <xs:sequence>
+ <xs:element name="Line" type="tString"/>
+ <xs:element name="Content" type="tString" minOccurs="0"/>
+ <xs:element name="Extension" type="tExtension" minOccurs="0"/>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="tApplicationServer">
+ <xs:sequence>
+ <xs:element name="ServerName" type="tSIP_URL"/>
+ <xs:element name="DefaultHandling" type="tDefaultHandling" minOccurs="0"/> <!-- the DefaultHandling element should not be sent by a Rel-5 HSS -->
+ <xs:element name="ServiceInfo" type="tServiceInfo" minOccurs="0"/>
+ <xs:element name="Extension" type="tExtension" minOccurs="0"/>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="tPublicIdentity">
+ <xs:sequence>
+ <xs:element name="BarringIndication" type="tBool" default="0" minOccurs="0"/>
+ <xs:element name="Identity" type="tIdentity"/>
+ <xs:element name="Extension" type="tExtension" minOccurs="0"/>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="IMSSubscription" type="tIMSSubscription"/>
+</xs:schema>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/address.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/address.xsd
new file mode 100644
index 0000000000..147d1fe01e
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/address.xsd
@@ -0,0 +1,69 @@
+<schema targetNamespace="http://www.example.com/IPO"
+ xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:ipo="http://www.example.com/IPO">
+
+ <annotation>
+ <documentation xml:lang="en">
+ Addresses for International Purchase order schema
+ Copyright 2000 Example.com. All rights reserved.
+ </documentation>
+ </annotation>
+
+ <complexType name="Address">
+ <sequence>
+ <element name="name" type="string"/>
+ <element name="street" type="string"/>
+ <element name="city" type="string"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="USAddress">
+ <complexContent>
+ <extension base="ipo:Address">
+ <sequence>
+ <element name="state" type="ipo:USState"/>
+ <element name="zip" type="positiveInteger"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="UKAddress">
+ <complexContent>
+ <extension base="ipo:Address">
+ <sequence>
+ <element name="postcode" type="ipo:UKPostcode"/>
+ </sequence>
+ <attribute name="exportCode" type="positiveInteger" fixed="1"/>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <!-- other Address derivations for more countries -->
+
+ <simpleType name="USState">
+ <restriction base="string">
+ <enumeration value="AK"/>
+ <enumeration value="AL"/>
+ <enumeration value="AR"/>
+ <enumeration value="PA"/>
+ <!-- and so on ... -->
+ </restriction>
+ </simpleType>
+
+ <!-- simple type definition for UKPostcode -->
+ <simpleType name="UKPostcode">
+ <restriction base="ipo:Postcode">
+ <pattern value="[A-Z]{2}\d\s\d[A-Z]{2}"/>
+ </restriction>
+ </simpleType>
+
+ <simpleType name="Postcode">
+ <restriction base="string">
+ <length value="7" fixed="true"/>
+ </restriction>
+ </simpleType>
+
+
+</schema>
+
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/complexTypes.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/complexTypes.xsd
new file mode 100644
index 0000000000..78140cda9b
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/complexTypes.xsd
@@ -0,0 +1,112 @@
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:po="http://www.example.com/ComplexTypes"
+ targetNamespace="http://www.example.com/ComplexTypes"
+ elementFormDefault="unqualified"
+ attributeFormDefault="unqualified">
+
+ <element name="purchaseOrder" type="po:PurchaseOrderType"/>
+
+ <element name="purchaseOrder2" type="po:PurchaseOrderType2"/>
+
+ <element name="comment" type="string"/>
+
+
+<complexType name="PurchaseOrderType2">
+ <sequence>
+ <choice>
+ <group ref="po:shipAndBill"/>
+ <element name="singleUSAddress" type="po:USAddress"/>
+ </choice>
+ <element ref="po:comment" minOccurs="0"/>
+ <element name="items" type="po:Items"/>
+ </sequence>
+ <attribute name="orderDate" type="date"/>
+</complexType>
+
+<group name="shipAndBill">
+ <sequence>
+ <element name="shipTo" type="po:USAddress"/>
+ <element name="billTo" type="po:USAddress"/>
+ </sequence>
+</group>
+
+
+
+ <complexType name="PurchaseOrderType">
+ <sequence>
+ <element name="shipTo" type="po:USAddress"/>
+ <element name="billTo" type="po:USAddress"/>
+ <element ref="po:comment" minOccurs="0"/>
+ <element name="items" type="po:Items"/>
+ </sequence>
+ <attribute name="orderDate" type="date"/>
+ </complexType>
+
+ <complexType name="USAddress">
+ <sequence>
+ <element name="name" type="string"/>
+ <element name="street" type="string"/>
+ <element name="city" type="string"/>
+ <element name="state" type="string"/>
+ <element name="zip" type="decimal"/>
+ <element name="contact" type="po:Contact" minOccurs="0"/>
+ </sequence>
+ <attribute name="country" type="NMTOKEN"
+ fixed="US"/>
+ </complexType>
+
+ <complexType name="Items">
+ <sequence>
+ <element name="item" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="productName" type="string"/>
+ <element name="quantity">
+ <simpleType>
+ <restriction base="positiveInteger">
+ <maxExclusive value="100"/>
+ </restriction>
+ </simpleType>
+ </element>
+ <element name="USPrice" type="decimal"/>
+ <element ref="po:comment" minOccurs="0"/>
+ <element name="shipDate" type="date" minOccurs="0"/>
+ </sequence>
+ <attribute name="partNum" type="po:SKU" use="required"/>
+ </complexType>
+ </element>
+ </sequence>
+ </complexType>
+
+ <complexType name="Contact">
+ <sequence>
+ <element name="phone" type="decimal"/>
+ <element name="mail" type="string" minOccurs="0"/>
+ <element name="e-mail" type="string"/>
+ <element name="cell-phone" type="decimal" minOccurs="0"/>
+ <element name="other" type="string" minOccurs="0"/>
+ <element name="prefCont" type="po:PreferredContact" minOccurs="0" maxOccurs="2"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="PreferredContact">
+ <choice>
+ <element name="phone" type="string"/>
+ <element name="mail" type="string"/>
+ <element name="e-mail" type="string"/>
+ <element name="cell-phone" type="string"/>
+ <element name="other" type="string"/>
+ </choice>
+ <attribute name="priority" type="NMTOKEN"
+ fixed="medium"/>
+ </complexType>
+
+ <!-- Stock Keeping Unit, a code for identifying products -->
+ <simpleType name="SKU">
+ <restriction base="string">
+ <pattern value="\d{3}-[A-Z]{2}"/>
+ </restriction>
+ </simpleType>
+
+</schema>
+
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/complexTypes1.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/complexTypes1.xml
new file mode 100644
index 0000000000..a46a562c37
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/complexTypes1.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0"?>
+<apo:purchaseOrder xmlns:apo="http://www.example.com/ComplexTypes"
+ orderDate="1999-10-20">
+ <shipTo country="US">
+ <name>Alice Smith</name>
+ <street>123 Maple Street</street>
+ <!-- etc. -->
+ <city>Mill Valley</city>
+ <state>CA</state>
+ <zip>90952</zip>
+ <contact>
+ <phone>081234567</phone>
+ <e-mail>[email protected]</e-mail>
+ <cell-phone>070122345</cell-phone>
+ <prefCont>
+ <cell-phone>070122345</cell-phone>
+ </prefCont>
+ </contact>
+ </shipTo>
+ <billTo country="US">
+ <name>Robert Smith</name>
+ <street>8 Oak Avenue</street>
+ <!-- etc. -->
+ <city>Old Town</city>
+ <state>PA</state>
+ <zip>95819</zip>
+ </billTo>
+ <apo:comment>Hurry, my lawn is going wild!</apo:comment>
+ <!-- etc. -->
+ <items>
+ <item partNum="872-AA">
+ <productName>Lawnmower</productName>
+ <quantity>1</quantity>
+ <USPrice>148.95</USPrice>
+ <comment>Confirm this is electric</comment>
+ </item>
+ <item partNum="926-AA">
+ <productName>Baby Monitor</productName>
+ <quantity>1</quantity>
+ <USPrice>39.98</USPrice>
+ <shipDate>1999-05-21</shipDate>
+ </item>
+ </items>
+</apo:purchaseOrder>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/complexTypes2.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/complexTypes2.xml
new file mode 100644
index 0000000000..80687b9c1c
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/complexTypes2.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0"?>
+<apo:purchaseOrder2 xmlns:apo="http://www.example.com/ComplexTypes"
+ orderDate="1999-10-20">
+ <shipTo country="US">
+ <name>Alice Smith</name>
+ <street>123 Maple Street</street>
+ <!-- etc. -->
+ <city>Mill Valley</city>
+ <state>CA</state>
+ <zip>90952</zip>
+ <contact>
+ <phone>081234567</phone>
+ <e-mail>[email protected]</e-mail>
+ <cell-phone>070122345</cell-phone>
+ <prefCont>
+ <cell-phone>070122345</cell-phone>
+ </prefCont>
+ </contact>
+ </shipTo>
+ <billTo country="US">
+ <name>Robert Smith</name>
+ <street>8 Oak Avenue</street>
+ <!-- etc. -->
+ <city>Old Town</city>
+ <state>PA</state>
+ <zip>95819</zip>
+ </billTo>
+ <apo:comment>Hurry, my lawn is going wild!</apo:comment>
+ <!-- etc. -->
+ <items>
+ <item partNum="872-AA">
+ <productName>Lawnmower</productName>
+ <quantity>1</quantity>
+ <USPrice>148.95</USPrice>
+ <comment>Confirm this is electric</comment>
+ </item>
+ <item partNum="926-AA">
+ <productName>Baby Monitor</productName>
+ <quantity>1</quantity>
+ <USPrice>39.98</USPrice>
+ <shipDate>1999-05-21</shipDate>
+ </item>
+ </items>
+</apo:purchaseOrder2>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/enum_bug.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/enum_bug.xml
new file mode 100644
index 0000000000..1a4b601c32
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/enum_bug.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<status/>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/enum_bug.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/enum_bug.xsd
new file mode 100644
index 0000000000..996e0d5b4d
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/enum_bug.xsd
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified">
+
+ <xs:element name="status">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="status-type"/>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:simpleType name="status-type">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Valid" />
+ <xs:enumeration value="Invalid" />
+ <xs:enumeration value="" />
+ </xs:restriction>
+ </xs:simpleType>
+</xs:schema> \ No newline at end of file
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/gpx/clementine_loop.gpx b/lib/xmerl/test/xmerl_xsd_SUITE_data/gpx/clementine_loop.gpx
new file mode 100644
index 0000000000..f4e3185c56
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/gpx/clementine_loop.gpx
@@ -0,0 +1,3594 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
+<gpx
+ version="1.0"
+ creator="ExpertGPS 1.2 - http://www.topografix.com"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="http://www.topografix.com/GPX/1/0"
+ xmlns:topografix="http://www.topografix.com/GPX/Private/TopoGrafix/0/2"
+ xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd http://www.topografix.com/GPX/Private/TopoGrafix/0/2 http://www.topografix.com/GPX/Private/TopoGrafix/0/2/topografix.xsd">
+<time>2003-02-05T19:17:02Z</time>
+<bounds minlat="38.625526" minlon="-121.516943" maxlat="38.937285" maxlon="-121.011830"/>
+<wpt lat="38.916370006" lon="-121.035340039">
+ <ele>182.775024</ele>
+ <time>2003-02-05T18:19:15Z</time>
+ <name>CLEMEN TR</name>
+ <desc>CLEMEN TR</desc>
+ <sym>Trail Head</sym>
+ <type>Trail Head</type>
+</wpt>
+<wpt lat="38.920639999" lon="-121.012300031">
+ <ele>313.993896</ele>
+ <time>2003-02-05T18:19:15Z</time>
+ <name>CONFL TR</name>
+ <desc>CONFL TR</desc>
+ <sym>Trail Head</sym>
+ <type>Trail Head</type>
+</wpt>
+<wpt lat="38.932889983" lon="-121.011829974">
+ <ele>437.041748</ele>
+ <time>2003-02-05T18:19:15Z</time>
+ <name>CULVERT TR</name>
+ <desc>CULVERT TR</desc>
+ <sym>Trail Head</sym>
+ <type>Trail Head</type>
+</wpt>
+<wpt lat="38.905900003" lon="-121.055939991">
+ <ele>371.912964</ele>
+ <time>2003-02-04T21:14:35Z</time>
+ <name>MANZANITA</name>
+ <desc>MANZANITA</desc>
+ <sym>Trail Head</sym>
+ <type>Trail Head</type>
+</wpt>
+<wpt lat="38.911470029" lon="-121.054369977">
+ <ele>405.318481</ele>
+ <time>2003-02-04T21:14:35Z</time>
+ <name>STAGECOACH</name>
+ <desc>STAGECOACH</desc>
+ <sym>Trail Head</sym>
+ <type>Trail Head</type>
+</wpt>
+<rte>
+ <name>SAC-CLEM</name>
+ <desc>Auto route from Sacramento to Clementine Loop trail head.</desc>
+ <number>1</number>
+ <topografix:color>ff0000</topografix:color>
+<rtept lat="38.625526432" lon="-121.516942989">
+ <time>2003-02-05T18:08:15Z</time>
+ <name>I-5</name>
+ <desc>I-5</desc>
+ <sym>Waypoint</sym>
+ <type>Waypoint</type>
+</rtept>
+<rtept lat="38.646984104" lon="-121.374807369">
+ <time>2003-02-05T18:08:15Z</time>
+ <name>I-80BUSRTE</name>
+ <desc>I-80BUSRTE</desc>
+ <sym>Waypoint</sym>
+ <type>Waypoint</type>
+</rtept>
+<rtept lat="38.917007450" lon="-121.062297832">
+ <time>2003-02-05T18:08:15Z</time>
+ <name>I-801</name>
+ <desc>I-801</desc>
+ <sym>Waypoint</sym>
+ <type>Waypoint</type>
+</rtept>
+<rtept lat="38.917522434" lon="-121.060409557">
+ <time>2003-02-05T18:08:15Z</time>
+ <name>LINCOLNWAY</name>
+ <desc>LINCOLNWAY</desc>
+ <sym>Waypoint</sym>
+ <type>Waypoint</type>
+</rtept>
+<rtept lat="38.915805820" lon="-121.061010372">
+ <time>2003-02-05T18:08:15Z</time>
+ <name>LINCOLNWY1</name>
+ <desc>LINCOLNWY1</desc>
+ <sym>Waypoint</sym>
+ <type>Waypoint</type>
+</rtept>
+<rtept lat="38.916149143" lon="-121.057147991">
+ <time>2003-02-05T18:08:15Z</time>
+ <name>RUSSELL RD</name>
+ <desc>RUSSELL RD</desc>
+ <sym>Waypoint</sym>
+ <type>Waypoint</type>
+</rtept>
+<rtept lat="38.911467012" lon="-121.054374419">
+ <time>2003-02-05T18:08:15Z</time>
+ <name>STAGECOACH</name>
+ <desc>STAGECOACH</desc>
+ <sym>Trail Head</sym>
+ <type>Trail Head</type>
+</rtept>
+</rte>
+<trk>
+ <name>CLEMENTINE</name>
+ <desc>Clementine Loop</desc>
+ <number>1</number>
+ <topografix:color>ff0000</topografix:color>
+<trkseg>
+<trkpt lat="38.919839863" lon="-121.020112049">
+ <ele>265.447754</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919796947" lon="-121.020240795">
+ <ele>264.967041</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919861320" lon="-121.020498287">
+ <ele>263.044434</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919990066" lon="-121.020798694">
+ <ele>263.525146</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919925693" lon="-121.021056187">
+ <ele>260.160522</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919904236" lon="-121.021163475">
+ <ele>260.160522</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919818405" lon="-121.021292221">
+ <ele>259.679932</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919646744" lon="-121.021614086">
+ <ele>259.199219</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919539455" lon="-121.021764290">
+ <ele>256.795898</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919432167" lon="-121.022086155">
+ <ele>255.834717</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919281963" lon="-121.022450935">
+ <ele>252.950684</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919281963" lon="-121.022515308">
+ <ele>253.431396</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919196132" lon="-121.022665512">
+ <ele>251.989380</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919131759" lon="-121.022837173">
+ <ele>251.027954</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918981556" lon="-121.023073208">
+ <ele>248.624756</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918895725" lon="-121.023223411">
+ <ele>248.624756</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918745521" lon="-121.023609649">
+ <ele>246.702148</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918681148" lon="-121.023845684">
+ <ele>244.298950</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918681148" lon="-121.024081718">
+ <ele>243.337524</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918681148" lon="-121.024210464">
+ <ele>242.856934</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918724064" lon="-121.024403583">
+ <ele>241.895630</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918745521" lon="-121.024703991">
+ <ele>239.492310</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918595318" lon="-121.024854194">
+ <ele>238.050415</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918337826" lon="-121.025025856">
+ <ele>236.608521</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918187622" lon="-121.025090229">
+ <ele>235.646973</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917994503" lon="-121.025326263">
+ <ele>234.205078</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917951587" lon="-121.025519382">
+ <ele>233.243774</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917908672" lon="-121.025691044">
+ <ele>232.282471</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917887214" lon="-121.025927078">
+ <ele>231.801758</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917651180" lon="-121.025991451">
+ <ele>230.840576</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917415146" lon="-121.025884163">
+ <ele>228.437256</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917114738" lon="-121.025691044">
+ <ele>226.514648</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.916792873" lon="-121.025648128">
+ <ele>223.630737</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.916192058" lon="-121.025819790">
+ <ele>219.785400</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915848736" lon="-121.025884163">
+ <ele>217.382202</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915677074" lon="-121.026034366">
+ <ele>215.459595</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915634159" lon="-121.026227485">
+ <ele>214.017578</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915634159" lon="-121.026356232">
+ <ele>214.017578</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915569786" lon="-121.026806843">
+ <ele>212.094971</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915462498" lon="-121.026914131">
+ <ele>210.172363</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915376667" lon="-121.027021419">
+ <ele>209.691772</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915140632" lon="-121.027686607">
+ <ele>206.807739</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915119175" lon="-121.027858269">
+ <ele>206.327148</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915054802" lon="-121.028094303">
+ <ele>204.404541</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915054802" lon="-121.028137218">
+ <ele>204.404541</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914990429" lon="-121.028373253">
+ <ele>201.520508</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914947513" lon="-121.028738033">
+ <ele>200.559204</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914861683" lon="-121.028931152">
+ <ele>199.597900</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914840225" lon="-121.029145729">
+ <ele>200.559204</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914797310" lon="-121.029253017">
+ <ele>201.039795</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914647106" lon="-121.029489052">
+ <ele>196.713989</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914625648" lon="-121.029531967">
+ <ele>196.713989</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914539818" lon="-121.029832374">
+ <ele>194.310791</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914518360" lon="-121.030004036">
+ <ele>192.868774</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914496902" lon="-121.030519020">
+ <ele>191.426758</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914368156" lon="-121.030626308">
+ <ele>189.984863</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914217953" lon="-121.030733597">
+ <ele>189.023560</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914024833" lon="-121.031162750">
+ <ele>184.697632</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913981918" lon="-121.031377327">
+ <ele>183.736206</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913939003" lon="-121.031699192">
+ <ele>183.255615</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913939003" lon="-121.031785023">
+ <ele>183.255615</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913831714" lon="-121.032021057">
+ <ele>182.775024</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913831714" lon="-121.032278549">
+ <ele>180.852417</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913788799" lon="-121.032471668">
+ <ele>178.929810</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913788799" lon="-121.032536041">
+ <ele>179.410400</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913681511" lon="-121.032857906">
+ <ele>177.487793</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913660053" lon="-121.033115398">
+ <ele>175.084595</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913660053" lon="-121.033244144">
+ <ele>174.603882</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913660053" lon="-121.033458721">
+ <ele>174.123169</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913702968" lon="-121.034145366">
+ <ele>172.200562</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913660053" lon="-121.034231197">
+ <ele>171.239258</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913767341" lon="-121.034510147">
+ <ele>173.642578</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913767341" lon="-121.034767639">
+ <ele>172.200562</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913831714" lon="-121.035046589">
+ <ele>168.835938</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913896087" lon="-121.035218250">
+ <ele>167.874634</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913960460" lon="-121.035454284">
+ <ele>167.394043</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914024833" lon="-121.035625946">
+ <ele>166.913330</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914260868" lon="-121.035776150">
+ <ele>165.952026</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914518360" lon="-121.035904896">
+ <ele>166.913330</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914818767" lon="-121.036012184">
+ <ele>166.913330</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914947513" lon="-121.036119472">
+ <ele>166.913330</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915119175" lon="-121.036248218">
+ <ele>167.874634</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915290836" lon="-121.036291134">
+ <ele>168.835938</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915441040" lon="-121.036076557">
+ <ele>170.758545</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915634159" lon="-121.035883438">
+ <ele>174.123169</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915784363" lon="-121.035690319">
+ <ele>174.123169</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.916020397" lon="-121.035625946">
+ <ele>173.161987</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.916256431" lon="-121.035647404">
+ <ele>172.200562</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.916385177" lon="-121.035690319">
+ <ele>171.239258</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.916814331" lon="-121.036269676">
+ <ele>169.316650</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.916878704" lon="-121.036484253">
+ <ele>167.394043</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.916964535" lon="-121.036548626">
+ <ele>166.913330</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917050365" lon="-121.036527168">
+ <ele>166.432617</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917458061" lon="-121.036398422">
+ <ele>166.432617</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917887214" lon="-121.036570083">
+ <ele>168.835938</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918037418" lon="-121.036698829">
+ <ele>171.719849</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918058876" lon="-121.036698829">
+ <ele>172.681274</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918144707" lon="-121.036720287">
+ <ele>174.603882</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918187622" lon="-121.036827576">
+ <ele>176.526489</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918316368" lon="-121.036977779">
+ <ele>180.371704</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918466572" lon="-121.037127983">
+ <ele>183.255615</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918530945" lon="-121.037299644">
+ <ele>186.620239</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918659691" lon="-121.037514221">
+ <ele>189.023560</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918766979" lon="-121.037707340">
+ <ele>191.907471</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918852810" lon="-121.037836086">
+ <ele>195.271973</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919067386" lon="-121.038050663">
+ <ele>197.194580</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919239048" lon="-121.038222324">
+ <ele>200.078613</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919346336" lon="-121.038393986">
+ <ele>202.481812</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919517998" lon="-121.038587105">
+ <ele>205.846558</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919539455" lon="-121.038630020">
+ <ele>206.327148</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919496540" lon="-121.038672935">
+ <ele>206.807739</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919260505" lon="-121.038544189">
+ <ele>210.652954</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918960098" lon="-121.038351070">
+ <ele>214.017578</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918402199" lon="-121.037986290">
+ <ele>217.382202</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918037418" lon="-121.037728798">
+ <ele>220.266113</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917565349" lon="-121.037685882">
+ <ele>223.630737</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917350773" lon="-121.038050663">
+ <ele>226.514648</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917329315" lon="-121.038329613">
+ <ele>228.917969</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917222027" lon="-121.038887512">
+ <ele>231.801758</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917243484" lon="-121.039402496">
+ <ele>235.166382</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917350773" lon="-121.039831650">
+ <ele>238.050415</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917651180" lon="-121.040067684">
+ <ele>241.414917</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917887214" lon="-121.040282261">
+ <ele>244.298950</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918294910" lon="-121.040647041">
+ <ele>245.260132</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918423656" lon="-121.041119110">
+ <ele>248.144165</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918659691" lon="-121.041462433">
+ <ele>251.508667</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918852810" lon="-121.041655552">
+ <ele>254.392700</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918809894" lon="-121.042191994">
+ <ele>256.795898</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918809894" lon="-121.042814266">
+ <ele>259.199219</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918509487" lon="-121.042964470">
+ <ele>261.602539</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918488029" lon="-121.042964470">
+ <ele>261.602539</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918101791" lon="-121.042792808">
+ <ele>264.486328</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917586807" lon="-121.042621147">
+ <ele>268.331665</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917329315" lon="-121.042792808">
+ <ele>270.254272</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917157654" lon="-121.043200504">
+ <ele>273.138306</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.916878704" lon="-121.043479454">
+ <ele>276.022095</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.916471008" lon="-121.043629658">
+ <ele>278.906128</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.916428093" lon="-121.043608200">
+ <ele>279.867310</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.916020397" lon="-121.043457996">
+ <ele>283.231934</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915805820" lon="-121.043694031">
+ <ele>286.115967</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915655617" lon="-121.044209015">
+ <ele>288.038574</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915419582" lon="-121.044316303">
+ <ele>290.922485</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915140632" lon="-121.044466507">
+ <ele>293.325684</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914818767" lon="-121.044230472">
+ <ele>294.287109</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914496902" lon="-121.044101726">
+ <ele>297.651611</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914217953" lon="-121.044230472">
+ <ele>301.016235</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913939003" lon="-121.044445049">
+ <ele>303.419556</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913810257" lon="-121.044552337">
+ <ele>304.861450</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913488392" lon="-121.044681084">
+ <ele>307.745483</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913187984" lon="-121.044681084">
+ <ele>308.706665</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.912887577" lon="-121.044681084">
+ <ele>311.109985</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.912565712" lon="-121.044788372">
+ <ele>313.513306</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.912372593" lon="-121.045110237">
+ <ele>316.877930</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.912265304" lon="-121.045281898">
+ <ele>316.877930</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.912072185" lon="-121.045582306">
+ <ele>320.242432</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.912007812" lon="-121.045925628">
+ <ele>322.165039</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.912007812" lon="-121.046075832">
+ <ele>323.126465</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.912072185" lon="-121.046547901">
+ <ele>325.529663</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.912243847" lon="-121.046998512">
+ <ele>327.452271</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.912158016" lon="-121.047277462">
+ <ele>330.816895</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911964897" lon="-121.047577869">
+ <ele>333.220215</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911771778" lon="-121.047964107">
+ <ele>335.623413</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911471371" lon="-121.048307430">
+ <ele>338.988037</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911235336" lon="-121.048650753">
+ <ele>342.352661</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911042217" lon="-121.049079906">
+ <ele>344.275269</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.910634521" lon="-121.049187195">
+ <ele>346.678467</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.910248283" lon="-121.049444687">
+ <ele>350.043213</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.910119537" lon="-121.049659263">
+ <ele>353.407715</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.910183910" lon="-121.050109875">
+ <ele>354.849609</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.910462860" lon="-121.050453197">
+ <ele>357.733643</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.910849098" lon="-121.050710689">
+ <ele>360.617432</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911213878" lon="-121.050882351">
+ <ele>363.501465</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911406997" lon="-121.051311504">
+ <ele>366.866089</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911664490" lon="-121.051590454">
+ <ele>370.230591</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.912007812" lon="-121.051719200">
+ <ele>371.672607</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.912007812" lon="-121.052105438">
+ <ele>373.595215</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.912050728" lon="-121.052491676">
+ <ele>376.959839</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.912351135" lon="-121.052856457">
+ <ele>379.363037</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.912758831" lon="-121.052985203">
+ <ele>382.727783</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913059238" lon="-121.053135406">
+ <ele>385.130981</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913273815" lon="-121.053628933">
+ <ele>388.014893</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913273815" lon="-121.053843510">
+ <ele>388.976196</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913187984" lon="-121.053843510">
+ <ele>389.456787</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913037781" lon="-121.053822052">
+ <ele>390.418213</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.912673000" lon="-121.053864967">
+ <ele>393.302002</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.912308220" lon="-121.053972256">
+ <ele>396.186157</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911921982" lon="-121.054122459">
+ <ele>399.069946</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911664490" lon="-121.054143917">
+ <ele>400.031372</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911492828" lon="-121.054101002">
+ <ele>400.992554</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911342624" lon="-121.054251205">
+ <ele>403.876587</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911385540" lon="-121.054358494">
+ <ele>403.876587</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911385540" lon="-121.054379951">
+ <ele>403.395874</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911406997" lon="-121.054379951">
+ <ele>402.915161</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911492828" lon="-121.054487240">
+ <ele>402.915161</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911492828" lon="-121.054487240">
+ <ele>403.395874</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911492828" lon="-121.054508697">
+ <ele>403.395874</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911492828" lon="-121.054337036">
+ <ele>413.489746</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911514286" lon="-121.054379951">
+ <ele>413.489746</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911557201" lon="-121.055088054">
+ <ele>410.605591</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911535744" lon="-121.055431377">
+ <ele>408.202393</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911364082" lon="-121.055989277">
+ <ele>404.357178</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911256794" lon="-121.056354057">
+ <ele>400.511963</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911213878" lon="-121.056482803">
+ <ele>399.550659</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911085132" lon="-121.056633007">
+ <ele>397.147339</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.910484318" lon="-121.056268226">
+ <ele>394.744019</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.909926418" lon="-121.056118023">
+ <ele>391.379395</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.909754757" lon="-121.056096565">
+ <ele>390.418213</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.909540180" lon="-121.056182396">
+ <ele>389.937500</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.908746246" lon="-121.056311142">
+ <ele>386.572998</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.908681873" lon="-121.056311142">
+ <ele>386.572998</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.908295635" lon="-121.056311142">
+ <ele>386.092285</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.907995228" lon="-121.056418430">
+ <ele>387.534180</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.907845024" lon="-121.056461346">
+ <ele>386.572998</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.907630447" lon="-121.056418430">
+ <ele>387.053589</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.907480243" lon="-121.056289684">
+ <ele>387.053589</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.907458786" lon="-121.056203853">
+ <ele>386.092285</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.907394413" lon="-121.056182396">
+ <ele>386.092285</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.907115463" lon="-121.056096565">
+ <ele>383.208374</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.906836513" lon="-121.056182396">
+ <ele>381.285767</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.906729225" lon="-121.056289684">
+ <ele>379.843628</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.906536106" lon="-121.056504261">
+ <ele>377.921021</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.906321529" lon="-121.056504261">
+ <ele>376.479126</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.906064037" lon="-121.056203853">
+ <ele>375.037231</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.905892376" lon="-121.055967819">
+ <ele>371.672607</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.905892376" lon="-121.055946361">
+ <ele>370.711304</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.906021122" lon="-121.055667412">
+ <ele>366.866089</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.906085495" lon="-121.055452835">
+ <ele>363.982056</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.906128410" lon="-121.055152428">
+ <ele>360.617432</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.906149868" lon="-121.055088054">
+ <ele>359.656250</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.906214241" lon="-121.054852020">
+ <ele>358.214233</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.906300072" lon="-121.054744732">
+ <ele>356.291626</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.906364445" lon="-121.054658901">
+ <ele>354.849609</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.906407360" lon="-121.054508697">
+ <ele>351.965820</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.906385902" lon="-121.054465782">
+ <ele>351.485107</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.906021122" lon="-121.054551613">
+ <ele>348.120605</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.905677799" lon="-121.054744732">
+ <ele>344.755859</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.905591968" lon="-121.054809105">
+ <ele>342.352661</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.905441765" lon="-121.054937851">
+ <ele>340.430054</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.905441765" lon="-121.054852020">
+ <ele>339.949341</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.905463222" lon="-121.054744732">
+ <ele>338.988037</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.905549053" lon="-121.054508697">
+ <ele>335.142822</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.905570511" lon="-121.054465782">
+ <ele>335.142822</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.905785087" lon="-121.054058086">
+ <ele>333.700806</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.905978206" lon="-121.053800594">
+ <ele>330.816895</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.906149868" lon="-121.053628933">
+ <ele>330.336182</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.906257156" lon="-121.053586017">
+ <ele>329.855469</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.906385902" lon="-121.053521644">
+ <ele>329.855469</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.906514648" lon="-121.053457271">
+ <ele>328.413574</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.906879429" lon="-121.053543102">
+ <ele>325.529663</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.906900886" lon="-121.053586017">
+ <ele>324.087646</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.906965259" lon="-121.053714763">
+ <ele>322.165039</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.906965259" lon="-121.053714763">
+ <ele>322.165039</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.907008175" lon="-121.053671848">
+ <ele>322.645752</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.907158378" lon="-121.053435814">
+ <ele>326.490967</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.907244209" lon="-121.053199779">
+ <ele>329.855469</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.907544617" lon="-121.053071033">
+ <ele>327.932861</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.907630447" lon="-121.053071033">
+ <ele>327.452271</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.907673363" lon="-121.053028118">
+ <ele>326.010254</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.907802109" lon="-121.052920830">
+ <ele>324.087646</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.907887939" lon="-121.052792084">
+ <ele>322.645752</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.907930855" lon="-121.052598965">
+ <ele>322.645752</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.908317093" lon="-121.052105438">
+ <ele>322.165039</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.908445839" lon="-121.051869404">
+ <ele>322.645752</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.908252720" lon="-121.051461708">
+ <ele>323.607056</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.908274177" lon="-121.050968181">
+ <ele>321.684448</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.908381466" lon="-121.050839435">
+ <ele>320.242432</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.908424381" lon="-121.050817978">
+ <ele>319.761841</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.908531669" lon="-121.050710689">
+ <ele>315.916504</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.908574585" lon="-121.050689232">
+ <ele>315.916504</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.908638958" lon="-121.050646316">
+ <ele>313.513306</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.908789161" lon="-121.050581943">
+ <ele>313.513306</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.908917908" lon="-121.050496113">
+ <ele>315.435913</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.909025196" lon="-121.050453197">
+ <ele>316.397217</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.909432892" lon="-121.050367367">
+ <ele>317.358643</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.909540180" lon="-121.050324451">
+ <ele>317.358643</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.909540180" lon="-121.050260078">
+ <ele>320.242432</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.909175400" lon="-121.049852382">
+ <ele>321.203857</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.908746246" lon="-121.049251568">
+ <ele>323.126465</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.908531669" lon="-121.048629295">
+ <ele>323.126465</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.908660415" lon="-121.048393261">
+ <ele>321.684448</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.909196857" lon="-121.048264515">
+ <ele>318.800537</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.909239773" lon="-121.048264515">
+ <ele>318.800537</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.909325603" lon="-121.048157226">
+ <ele>317.358643</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.909304146" lon="-121.048028480">
+ <ele>319.281250</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.909218315" lon="-121.047513496">
+ <ele>320.242432</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.909282688" lon="-121.047449123">
+ <ele>321.684448</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.909497265" lon="-121.047427666">
+ <ele>321.684448</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.909733299" lon="-121.047492039">
+ <ele>321.203857</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.909883503" lon="-121.047427666">
+ <ele>321.684448</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.910076622" lon="-121.047492039">
+ <ele>321.684448</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.910441402" lon="-121.047942650">
+ <ele>320.242432</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.910548691" lon="-121.048092853">
+ <ele>321.203857</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.910784725" lon="-121.048221599">
+ <ele>320.723145</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.910870556" lon="-121.048264515">
+ <ele>319.281250</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.910956386" lon="-121.048049938">
+ <ele>319.761841</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911192421" lon="-121.047620785">
+ <ele>319.761841</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911535744" lon="-121.047556412">
+ <ele>320.242432</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911964897" lon="-121.047041427">
+ <ele>318.800537</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911921982" lon="-121.046805393">
+ <ele>319.761841</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911879066" lon="-121.046526443">
+ <ele>322.645752</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911879066" lon="-121.046226036">
+ <ele>322.645752</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911836151" lon="-121.045990002">
+ <ele>320.242432</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.911900524" lon="-121.045582306">
+ <ele>319.761841</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.912179474" lon="-121.045217525">
+ <ele>319.761841</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.912522796" lon="-121.044766914">
+ <ele>319.281250</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.912694458" lon="-121.044616710">
+ <ele>318.319824</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.912780289" lon="-121.044595253">
+ <ele>319.761841</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.912801746" lon="-121.044616710">
+ <ele>319.761841</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.912844662" lon="-121.044616710">
+ <ele>319.761841</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913037781" lon="-121.044659626">
+ <ele>321.684448</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913209442" lon="-121.044638168">
+ <ele>320.723145</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913402561" lon="-121.044638168">
+ <ele>318.319824</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913681511" lon="-121.044638168">
+ <ele>316.877930</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.913810257" lon="-121.044573795">
+ <ele>316.397217</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914217953" lon="-121.044230472">
+ <ele>312.551880</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914282326" lon="-121.044187557">
+ <ele>312.551880</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.914561275" lon="-121.044101726">
+ <ele>309.668091</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915033344" lon="-121.044337761">
+ <ele>305.342163</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915076259" lon="-121.044380676">
+ <ele>305.342163</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915376667" lon="-121.044316303">
+ <ele>303.419556</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915634159" lon="-121.044187557">
+ <ele>301.496948</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915762905" lon="-121.043972980">
+ <ele>298.132324</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.915805820" lon="-121.043715488">
+ <ele>297.651611</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.916277889" lon="-121.043415081">
+ <ele>293.806396</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.916556839" lon="-121.043543827">
+ <ele>290.441895</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.916728500" lon="-121.043608200">
+ <ele>288.038574</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.916835789" lon="-121.043608200">
+ <ele>288.038574</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917093281" lon="-121.043457996">
+ <ele>286.115967</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917307857" lon="-121.042985927">
+ <ele>283.231934</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917350773" lon="-121.042921554">
+ <ele>282.751343</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917436603" lon="-121.042792808">
+ <ele>280.828735</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917694095" lon="-121.042685520">
+ <ele>278.425415</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917758468" lon="-121.042685520">
+ <ele>277.944702</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918402199" lon="-121.042814266">
+ <ele>273.138306</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918530945" lon="-121.042835724">
+ <ele>271.696289</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918724064" lon="-121.042900097">
+ <ele>270.254272</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918917183" lon="-121.042835724">
+ <ele>269.773682</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918981556" lon="-121.042449486">
+ <ele>268.331665</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918938640" lon="-121.041784298">
+ <ele>265.447754</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918766979" lon="-121.041526806">
+ <ele>262.563721</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918488029" lon="-121.041183483">
+ <ele>260.641113</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918359283" lon="-121.040732872">
+ <ele>257.757324</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918230537" lon="-121.040561210">
+ <ele>255.834717</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918015961" lon="-121.040346634">
+ <ele>255.834717</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917801384" lon="-121.040132057">
+ <ele>255.354004</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917522434" lon="-121.039938938">
+ <ele>251.027954</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917415146" lon="-121.039767277">
+ <ele>250.066772</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917372230" lon="-121.039574158">
+ <ele>248.624756</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917329315" lon="-121.038780224">
+ <ele>243.818237</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917393688" lon="-121.038479816">
+ <ele>242.376343</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917436603" lon="-121.038007747">
+ <ele>239.973022</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917586807" lon="-121.037685882">
+ <ele>237.089111</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917887214" lon="-121.037535679">
+ <ele>234.205078</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918037418" lon="-121.037535679">
+ <ele>233.724365</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918380741" lon="-121.037621509">
+ <ele>230.359863</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918809894" lon="-121.037879001">
+ <ele>226.995361</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918917183" lon="-121.037964832">
+ <ele>226.033936</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919045929" lon="-121.038050663">
+ <ele>224.592041</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919260505" lon="-121.038222324">
+ <ele>223.150146</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919367794" lon="-121.038308155">
+ <ele>221.708130</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919689659" lon="-121.038565647">
+ <ele>217.862793</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919732574" lon="-121.038608562">
+ <ele>217.862793</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919754032" lon="-121.038608562">
+ <ele>216.901489</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919668201" lon="-121.038479816">
+ <ele>215.459595</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919389252" lon="-121.038136494">
+ <ele>211.614380</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919346336" lon="-121.038093578">
+ <ele>211.614380</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919239048" lon="-121.037986290">
+ <ele>208.730347</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919003013" lon="-121.037707340">
+ <ele>204.885132</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918960098" lon="-121.037664425">
+ <ele>204.885132</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918766979" lon="-121.037428390">
+ <ele>200.559204</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918638233" lon="-121.037213814">
+ <ele>197.194580</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918509487" lon="-121.037020695">
+ <ele>192.868774</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918294910" lon="-121.036784660">
+ <ele>189.023560</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918230537" lon="-121.036741745">
+ <ele>187.581421</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917951587" lon="-121.036570083">
+ <ele>181.813599</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917887214" lon="-121.036527168">
+ <ele>181.813599</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917608265" lon="-121.036419880">
+ <ele>178.929810</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917415146" lon="-121.036376964">
+ <ele>178.449097</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917007450" lon="-121.036548626">
+ <ele>178.449097</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.916857246" lon="-121.036398422">
+ <ele>178.929810</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.916621212" lon="-121.035840523">
+ <ele>180.371704</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.916363720" lon="-121.035647404">
+ <ele>181.333008</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.916363720" lon="-121.035346996">
+ <ele>181.813599</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.916578296" lon="-121.035218250">
+ <ele>181.333008</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.916943077" lon="-121.035089504">
+ <ele>180.371704</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.917222027" lon="-121.035068046">
+ <ele>179.410400</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918209080" lon="-121.035454284">
+ <ele>178.449097</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918488029" lon="-121.035625946">
+ <ele>177.968384</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.918745521" lon="-121.035969269">
+ <ele>177.968384</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919045929" lon="-121.036248218">
+ <ele>177.968384</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919346336" lon="-121.036655914">
+ <ele>178.449097</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920183185" lon="-121.037406933">
+ <ele>181.333008</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920912746" lon="-121.037750255">
+ <ele>183.255615</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.921277527" lon="-121.037836086">
+ <ele>185.178223</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.921492103" lon="-121.037921917">
+ <ele>184.216919</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.921599392" lon="-121.037964832">
+ <ele>185.658813</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.921685222" lon="-121.037964832">
+ <ele>184.216919</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.921921257" lon="-121.038007747">
+ <ele>187.581421</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.922092918" lon="-121.038072120">
+ <ele>187.100830</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.922178749" lon="-121.038115036">
+ <ele>187.100830</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.922264580" lon="-121.038157951">
+ <ele>186.620239</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.922607902" lon="-121.038222324">
+ <ele>186.620239</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923058513" lon="-121.038243782">
+ <ele>187.100830</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923144344" lon="-121.038243782">
+ <ele>187.100830</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923230175" lon="-121.038265240">
+ <ele>187.100830</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923444752" lon="-121.038372528">
+ <ele>184.216919</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923809532" lon="-121.038479816">
+ <ele>185.178223</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.924024109" lon="-121.038651478">
+ <ele>185.658813</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.924303058" lon="-121.038844597">
+ <ele>186.620239</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.924496177" lon="-121.038930427">
+ <ele>187.100830</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.924560551" lon="-121.038994800">
+ <ele>186.620239</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.924903873" lon="-121.039359581">
+ <ele>184.697632</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.925139908" lon="-121.039681446">
+ <ele>184.216919</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.925569061" lon="-121.040325176">
+ <ele>183.255615</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.925783638" lon="-121.040625583">
+ <ele>182.775024</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.925912384" lon="-121.040647041">
+ <ele>182.294312</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.926019672" lon="-121.040689956">
+ <ele>181.813599</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.926298622" lon="-121.040668499">
+ <ele>180.852417</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.926427368" lon="-121.040625583">
+ <ele>180.371704</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.927049640" lon="-121.040260803">
+ <ele>183.736206</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.927328590" lon="-121.039917480">
+ <ele>186.139526</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.927929405" lon="-121.039445412">
+ <ele>189.023560</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.928380016" lon="-121.039080631">
+ <ele>192.388184</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.928701881" lon="-121.038994800">
+ <ele>195.752686</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.928895000" lon="-121.038973343">
+ <ele>197.675293</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.929195408" lon="-121.038780224">
+ <ele>200.078613</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.929367069" lon="-121.038351070">
+ <ele>202.481812</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.929431442" lon="-121.038179409">
+ <ele>204.404541</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.929796222" lon="-121.038136494">
+ <ele>207.769165</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930096630" lon="-121.037943374">
+ <ele>210.652954</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930397037" lon="-121.037836086">
+ <ele>213.536987</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930675987" lon="-121.037836086">
+ <ele>214.978882</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931126598" lon="-121.037428390">
+ <ele>216.420776</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931362633" lon="-121.037170898">
+ <ele>219.785400</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931534294" lon="-121.036913406">
+ <ele>222.669434</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931877617" lon="-121.036441337">
+ <ele>226.033936</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932156566" lon="-121.036055099">
+ <ele>228.917969</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932392601" lon="-121.035690319">
+ <ele>231.801758</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932564262" lon="-121.035304081">
+ <ele>235.166382</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932650093" lon="-121.034939300">
+ <ele>237.569702</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932349685" lon="-121.034510147">
+ <ele>240.453735</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932178024" lon="-121.034166824">
+ <ele>243.337524</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931963447" lon="-121.033694755">
+ <ele>246.702148</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931727413" lon="-121.033265602">
+ <ele>249.586060</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931491379" lon="-121.032986652">
+ <ele>252.470093</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931405548" lon="-121.032664787">
+ <ele>255.354004</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931212429" lon="-121.032257091">
+ <ele>258.718506</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930976394" lon="-121.031892311">
+ <ele>262.563721</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931019310" lon="-121.031634819">
+ <ele>264.967041</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931405548" lon="-121.031270038">
+ <ele>265.928345</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931620125" lon="-121.030840885">
+ <ele>267.370361</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931598667" lon="-121.030218612">
+ <ele>269.773682</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931577209" lon="-121.029725086">
+ <ele>272.657593</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931427006" lon="-121.029338848">
+ <ele>275.541504</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931298260" lon="-121.028888237">
+ <ele>277.944702</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931233887" lon="-121.028695118">
+ <ele>279.867310</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931276802" lon="-121.028630745">
+ <ele>280.348022</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931598667" lon="-121.028373253">
+ <ele>283.231934</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931856159" lon="-121.028201591">
+ <ele>286.596680</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931984905" lon="-121.027858269">
+ <ele>288.999878</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932220939" lon="-121.027793896">
+ <ele>292.845093</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932414058" lon="-121.027643692">
+ <ele>296.209717</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932435516" lon="-121.027235996">
+ <ele>299.093506</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932456974" lon="-121.027064335">
+ <ele>299.093506</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932456974" lon="-121.026892673">
+ <ele>301.016235</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932671551" lon="-121.026592266">
+ <ele>301.496948</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932971958" lon="-121.026463520">
+ <ele>304.380859</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933186535" lon="-121.026098739">
+ <ele>306.784058</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933444027" lon="-121.025691044">
+ <ele>309.668091</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933658603" lon="-121.025347721">
+ <ele>313.032593</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933830265" lon="-121.024832737">
+ <ele>316.397217</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933701519" lon="-121.024210464">
+ <ele>319.281250</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933529857" lon="-121.024124634">
+ <ele>322.165039</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933293823" lon="-121.023824226">
+ <ele>323.607056</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933379654" lon="-121.023373615">
+ <ele>326.010254</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933551315" lon="-121.023008835">
+ <ele>328.894287</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933594230" lon="-121.022579681">
+ <ele>330.336182</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933765892" lon="-121.022322189">
+ <ele>333.700806</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933851723" lon="-121.021893036">
+ <ele>336.584839</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933701519" lon="-121.021549713">
+ <ele>338.507446</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933594230" lon="-121.021120560">
+ <ele>341.391235</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933615688" lon="-121.020584118">
+ <ele>344.755859</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933637146" lon="-121.020519745">
+ <ele>344.275269</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.934109215" lon="-121.020262253">
+ <ele>348.120605</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.934366707" lon="-121.020069134">
+ <ele>351.004395</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.934388164" lon="-121.020069134">
+ <ele>351.485107</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.934817318" lon="-121.019918930">
+ <ele>352.446411</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.935139183" lon="-121.019833099">
+ <ele>352.927002</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.935546879" lon="-121.019811642">
+ <ele>355.811035</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.935825828" lon="-121.019639980">
+ <ele>359.175537</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.935868744" lon="-121.019446861">
+ <ele>360.617432</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.935546879" lon="-121.018974792">
+ <ele>363.982056</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.935375217" lon="-121.018695843">
+ <ele>366.866089</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.935289387" lon="-121.018266689">
+ <ele>370.230591</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.935611252" lon="-121.018052112">
+ <ele>373.114624</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.936040405" lon="-121.017901909">
+ <ele>376.959839</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.936448101" lon="-121.017665874">
+ <ele>379.843628</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.936812881" lon="-121.017494213">
+ <ele>383.208374</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.937134746" lon="-121.017344009">
+ <ele>386.572998</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.937284950" lon="-121.016914856">
+ <ele>388.495605</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.937048916" lon="-121.016507160">
+ <ele>391.860107</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.936769966" lon="-121.016249668">
+ <ele>393.302002</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.936426643" lon="-121.016013634">
+ <ele>396.666748</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.936212066" lon="-121.015906345">
+ <ele>399.550659</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.935954574" lon="-121.015863430">
+ <ele>401.473267</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.935611252" lon="-121.015884888">
+ <ele>404.357178</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.935267929" lon="-121.015906345">
+ <ele>407.721802</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.935160641" lon="-121.015520107">
+ <ele>410.125000</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.935139183" lon="-121.015155327">
+ <ele>410.605591</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.934946064" lon="-121.014683258">
+ <ele>413.489746</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.934624199" lon="-121.014318477">
+ <ele>416.854248</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.934237961" lon="-121.013975155">
+ <ele>419.738159</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.934023384" lon="-121.013674747">
+ <ele>423.102783</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933744434" lon="-121.013417255">
+ <ele>425.986572</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933529857" lon="-121.013052475">
+ <ele>429.351318</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933358196" lon="-121.012730610">
+ <ele>432.235229</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933315281" lon="-121.012516033">
+ <ele>433.196533</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933079246" lon="-121.012172710">
+ <ele>435.599731</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932929043" lon="-121.011958134">
+ <ele>436.561157</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932843212" lon="-121.011893761">
+ <ele>437.041748</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932778839" lon="-121.011915218">
+ <ele>438.003052</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932821754" lon="-121.012279999">
+ <ele>440.886963</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932800297" lon="-121.012387287">
+ <ele>442.809570</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932886127" lon="-121.012709152">
+ <ele>446.174316</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933057789" lon="-121.012945186">
+ <ele>449.058105</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933165077" lon="-121.013181221">
+ <ele>452.903320</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933272365" lon="-121.013503086">
+ <ele>456.267944</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933336738" lon="-121.013782036">
+ <ele>457.229248</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933401111" lon="-121.014060985">
+ <ele>460.593872</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933529857" lon="-121.014511597">
+ <ele>463.958496</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933722976" lon="-121.014812004">
+ <ele>463.958496</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933787350" lon="-121.015348446">
+ <ele>460.113281</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933830265" lon="-121.015605938">
+ <ele>456.748535</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933830265" lon="-121.015648853">
+ <ele>456.267944</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933680061" lon="-121.015906345">
+ <ele>454.825928</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.933293823" lon="-121.016185295">
+ <ele>454.345337</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932864670" lon="-121.016292583">
+ <ele>456.267944</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932693008" lon="-121.016271126">
+ <ele>459.151855</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932456974" lon="-121.016249668">
+ <ele>462.516479</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932242397" lon="-121.016271126">
+ <ele>464.439087</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.932049278" lon="-121.016335499">
+ <ele>466.361694</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931705955" lon="-121.016421329">
+ <ele>469.245728</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931341175" lon="-121.016528618">
+ <ele>472.129517</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.931148056" lon="-121.016614448">
+ <ele>475.494141</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930869106" lon="-121.016807567">
+ <ele>478.378174</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930633072" lon="-121.017022144">
+ <ele>480.781494</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930482868" lon="-121.017236721">
+ <ele>482.704102</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930418495" lon="-121.017365467">
+ <ele>483.665283</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930397037" lon="-121.017386925">
+ <ele>483.184692</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930354122" lon="-121.017408382">
+ <ele>483.665283</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930461410" lon="-121.017322552">
+ <ele>484.626709</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930482868" lon="-121.017322552">
+ <ele>484.626709</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930439953" lon="-121.017365467">
+ <ele>485.587891</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930461410" lon="-121.017386925">
+ <ele>485.107300</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930439953" lon="-121.017344009">
+ <ele>486.068604</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930418495" lon="-121.017344009">
+ <ele>486.068604</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930439953" lon="-121.017344009">
+ <ele>487.029907</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930439953" lon="-121.017816078">
+ <ele>484.145996</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930439953" lon="-121.017966282">
+ <ele>482.704102</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930547241" lon="-121.018438351">
+ <ele>480.781494</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930547241" lon="-121.018738758">
+ <ele>478.858887</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930568699" lon="-121.018888962">
+ <ele>477.416870</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930611614" lon="-121.019232284">
+ <ele>474.052124</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930611614" lon="-121.019382488">
+ <ele>472.610229</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930418495" lon="-121.019489776">
+ <ele>471.648926</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930225376" lon="-121.019468319">
+ <ele>467.323120</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930053715" lon="-121.019425403">
+ <ele>463.958496</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.930010799" lon="-121.019403946">
+ <ele>463.477905</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.929882053" lon="-121.019232284">
+ <ele>461.074585</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.929839138" lon="-121.019039165">
+ <ele>458.190552</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.929817680" lon="-121.018974792">
+ <ele>458.190552</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.929517273" lon="-121.018867504">
+ <ele>454.825928</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.929216865" lon="-121.018846046">
+ <ele>451.942139</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.929066662" lon="-121.018824589">
+ <ele>450.500122</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.928852085" lon="-121.018888962">
+ <ele>447.616211</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.928530220" lon="-121.018888962">
+ <ele>443.290161</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.928251270" lon="-121.019017708">
+ <ele>440.886963</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.928229812" lon="-121.019039165">
+ <ele>439.925659</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.928143982" lon="-121.019039165">
+ <ele>439.444946</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.927843574" lon="-121.018781673">
+ <ele>435.599731</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.927800659" lon="-121.018695843">
+ <ele>434.638550</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.927457336" lon="-121.018266689">
+ <ele>435.119141</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.927307133" lon="-121.018159401">
+ <ele>432.235229</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.927221302" lon="-121.018095028">
+ <ele>429.831909</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.927071098" lon="-121.017944824">
+ <ele>427.428589</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.927028183" lon="-121.017515671">
+ <ele>426.467285</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.926877979" lon="-121.017236721">
+ <ele>423.102783</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.926856521" lon="-121.017193806">
+ <ele>423.102783</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.926835064" lon="-121.017150890">
+ <ele>422.622070</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.926770691" lon="-121.017065059">
+ <ele>422.141357</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.926577572" lon="-121.017000686">
+ <ele>418.776855</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.926448826" lon="-121.016936313">
+ <ele>416.854248</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.926405910" lon="-121.016936313">
+ <ele>415.412354</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.926277164" lon="-121.016893398">
+ <ele>413.970337</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.926212791" lon="-121.016850483">
+ <ele>413.009033</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.926062588" lon="-121.016657364">
+ <ele>411.086304</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.925912384" lon="-121.016464245">
+ <ele>408.202393</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.925526146" lon="-121.015841972">
+ <ele>404.837769</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.925354484" lon="-121.015670311">
+ <ele>404.357178</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.925182823" lon="-121.015734684">
+ <ele>401.953979</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.925075535" lon="-121.015670311">
+ <ele>400.031372</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.925032619" lon="-121.015584480">
+ <ele>399.550659</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.925011162" lon="-121.015455734">
+ <ele>400.992554</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.925011162" lon="-121.015434276">
+ <ele>401.473267</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.924946789" lon="-121.015219700">
+ <ele>401.473267</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.924689297" lon="-121.014940750">
+ <ele>401.473267</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.924582008" lon="-121.014661800">
+ <ele>401.473267</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.924496177" lon="-121.014297020">
+ <ele>400.992554</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.924367431" lon="-121.013889324">
+ <ele>398.589355</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.924367431" lon="-121.013610374">
+ <ele>394.263428</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.924345974" lon="-121.013481628">
+ <ele>393.782715</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.924367431" lon="-121.012837898">
+ <ele>395.224609</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.924303058" lon="-121.012601864">
+ <ele>395.224609</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.924152855" lon="-121.012709152">
+ <ele>390.898804</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.924131397" lon="-121.012730610">
+ <ele>390.418213</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.924024109" lon="-121.012902271">
+ <ele>386.572998</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923981193" lon="-121.012988102">
+ <ele>385.611572</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923916820" lon="-121.013138305">
+ <ele>383.208374</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923873905" lon="-121.013224136">
+ <ele>382.247070</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923788074" lon="-121.013438713">
+ <ele>379.363037</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923680786" lon="-121.013460171">
+ <ele>378.882446</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923380379" lon="-121.013395798">
+ <ele>376.959839</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923122886" lon="-121.013395798">
+ <ele>374.075806</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923079971" lon="-121.013438713">
+ <ele>375.517822</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923058513" lon="-121.013481628">
+ <ele>375.037231</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923015598" lon="-121.013546001">
+ <ele>375.517822</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.922908310" lon="-121.013760578">
+ <ele>371.672607</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.922886852" lon="-121.013760578">
+ <ele>371.192017</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.922865394" lon="-121.013803493">
+ <ele>369.750000</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.922865394" lon="-121.013867866">
+ <ele>368.788696</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.922886852" lon="-121.014146816">
+ <ele>367.346802</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.922886852" lon="-121.014211189">
+ <ele>366.385376</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.922843937" lon="-121.014254104">
+ <ele>365.904785</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.922822479" lon="-121.014382850">
+ <ele>363.501465</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.922843937" lon="-121.014447223">
+ <ele>362.540039</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923015598" lon="-121.014812004">
+ <ele>362.059448</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923165802" lon="-121.015005123">
+ <ele>364.462769</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923251633" lon="-121.015176784">
+ <ele>363.982056</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923337463" lon="-121.015369903">
+ <ele>360.617432</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923358921" lon="-121.015434276">
+ <ele>360.136841</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923401836" lon="-121.015498649">
+ <ele>358.694824</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923316006" lon="-121.015584480">
+ <ele>354.369019</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923294548" lon="-121.015563022">
+ <ele>353.888428</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923273090" lon="-121.015541565">
+ <ele>353.888428</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.923079971" lon="-121.015455734">
+ <ele>350.523804</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.922843937" lon="-121.015348446">
+ <ele>347.639771</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.922822479" lon="-121.015326988">
+ <ele>347.639771</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.922650818" lon="-121.015262615">
+ <ele>344.275269</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.922371868" lon="-121.015133869">
+ <ele>340.910645</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.922092918" lon="-121.015241157">
+ <ele>337.546021</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.922071461" lon="-121.015241157">
+ <ele>337.546021</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.922028545" lon="-121.015241157">
+ <ele>336.584839</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.921985630" lon="-121.015241157">
+ <ele>335.623413</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.921985630" lon="-121.015241157">
+ <ele>336.104126</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.921878341" lon="-121.015090954">
+ <ele>335.142822</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.922007088" lon="-121.014704716">
+ <ele>333.700806</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.922050003" lon="-121.014361393">
+ <ele>335.142822</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.921985630" lon="-121.014254104">
+ <ele>335.142822</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.921449188" lon="-121.013653290">
+ <ele>331.778076</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.921363357" lon="-121.013481628">
+ <ele>330.816895</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.921213154" lon="-121.013073932">
+ <ele>326.490967</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920912746" lon="-121.012644779">
+ <ele>321.203857</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920762543" lon="-121.012473118">
+ <ele>317.358643</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920676712" lon="-121.012344372">
+ <ele>314.474487</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920633797" lon="-121.012301456">
+ <ele>313.513306</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920483593" lon="-121.012473118">
+ <ele>311.590698</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920204643" lon="-121.012923729">
+ <ele>307.745483</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920075897" lon="-121.013309967">
+ <ele>305.342163</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920183185" lon="-121.013739120">
+ <ele>301.496948</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920440677" lon="-121.014060985">
+ <ele>298.612915</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920483593" lon="-121.014125358">
+ <ele>298.132324</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920676712" lon="-121.014533054">
+ <ele>296.209717</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920762543" lon="-121.014640343">
+ <ele>294.767700</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920848373" lon="-121.014726173">
+ <ele>294.287109</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920869831" lon="-121.015069496">
+ <ele>292.364502</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920912746" lon="-121.015219700">
+ <ele>292.364502</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.921062950" lon="-121.015648853">
+ <ele>290.922485</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920977119" lon="-121.015713226">
+ <ele>290.922485</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920633797" lon="-121.015992176">
+ <ele>286.596680</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920612339" lon="-121.016013634">
+ <ele>286.596680</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920440677" lon="-121.016056549">
+ <ele>285.154663</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920183185" lon="-121.016421329">
+ <ele>283.712524</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920140270" lon="-121.016700279">
+ <ele>282.751343</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920140270" lon="-121.016871940">
+ <ele>281.309326</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920118812" lon="-121.017086517">
+ <ele>281.309326</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920204643" lon="-121.017301094">
+ <ele>280.348022</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920311931" lon="-121.017451298">
+ <ele>278.906128</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920376304" lon="-121.017580044">
+ <ele>278.906128</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920419220" lon="-121.017730247">
+ <ele>277.464111</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920311931" lon="-121.018116485">
+ <ele>276.022095</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920269016" lon="-121.018245231">
+ <ele>275.060913</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920226101" lon="-121.018502724">
+ <ele>274.580200</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.920011524" lon="-121.018824589">
+ <ele>271.696289</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919947151" lon="-121.019103538">
+ <ele>270.734985</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919882778" lon="-121.019639980">
+ <ele>267.850952</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+<trkpt lat="38.919925693" lon="-121.019876015">
+ <ele>267.370361</ele>
+ <time>2003-02-05T18:19:20Z</time>
+ <sym>Waypoint</sym>
+</trkpt>
+</trkseg>
+</trk>
+</gpx> \ No newline at end of file
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/gpx/gpx.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/gpx/gpx.xsd
new file mode 100644
index 0000000000..63d4640159
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/gpx/gpx.xsd
@@ -0,0 +1,227 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- GPX.xsd version 1.0 - For more information on GPX and this schema, visit http://www.topografix.com/gpx.asp -->
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:gpx="http://www.topografix.com/GPX/1/0" targetNamespace="http://www.topografix.com/GPX/1/0" elementFormDefault="qualified">
+
+<!-- Main GPX definition -->
+
+ <xsd:element name="gpx">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name" type="xsd:string" minOccurs="0"/> <!-- GPX file name -->
+ <xsd:element name="desc" type="xsd:string" minOccurs="0"/> <!-- GPX file description -->
+ <xsd:element name="author" type="xsd:string" minOccurs="0"/> <!-- GPX file author -->
+ <xsd:element name="email" type="gpx:emailType" minOccurs="0"/> <!-- GPX file author email -->
+ <xsd:element name="url" type="xsd:anyURI" minOccurs="0"/> <!-- GPX file URL -->
+ <xsd:element name="urlname" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="time" type="xsd:dateTime" minOccurs="0"/> <!-- GPX file creation time -->
+ <xsd:element name="keywords" type="xsd:string" minOccurs="0"/> <!-- GPX file keywords -->
+ <xsd:element name="bounds" type="gpx:boundsType" minOccurs="0"/> <!-- GPX file bounding rect -->
+ <xsd:element name="wpt" minOccurs="0" maxOccurs="unbounded">
+ <xsd:complexType>
+ <xsd:sequence> <!-- elements must appear in this order -->
+ <!-- Position info -->
+ <xsd:element name="ele" type="xsd:decimal" minOccurs="0"/>
+ <xsd:element name="time" type="xsd:dateTime" minOccurs="0"/>
+ <xsd:element name="magvar" type="gpx:degreesType" minOccurs="0"/>
+ <xsd:element name="geoidheight" type="xsd:decimal" minOccurs="0"/>
+
+ <!-- Description info -->
+ <xsd:element name="name" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="cmt" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="desc" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="src" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="url" type="xsd:anyURI" minOccurs="0"/>
+ <xsd:element name="urlname" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="sym" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="type" type="xsd:string" minOccurs="0"/>
+
+ <!-- Accuracy info -->
+ <xsd:element name="fix" type="gpx:fixType" minOccurs="0"/>
+ <xsd:element name="sat" type="xsd:nonNegativeInteger" minOccurs="0"/>
+ <xsd:element name="hdop" type="xsd:decimal" minOccurs="0"/>
+ <xsd:element name="vdop" type="xsd:decimal" minOccurs="0"/>
+ <xsd:element name="pdop" type="xsd:decimal" minOccurs="0"/>
+ <xsd:element name="ageofdgpsdata" type="xsd:decimal" minOccurs="0"/>
+ <xsd:element name="dgpsid" type="gpx:dgpsStationType" minOccurs="0"/>
+
+ <!-- you can add your own privately defined wpt elements at the end of the wpt -->
+ <xsd:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="lat" type="gpx:latitudeType" use="required"/>
+ <xsd:attribute name="lon" type="gpx:longitudeType" use="required"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="rte" minOccurs="0" maxOccurs="unbounded">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="cmt" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="desc" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="src" type="xsd:string" minOccurs="0"/> <!-- the source of this data: "Garmin eTrex", "Map", etc -->
+ <xsd:element name="url" type="xsd:anyURI" minOccurs="0"/>
+ <xsd:element name="urlname" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="number" type="xsd:nonNegativeInteger" minOccurs="0"/> <!-- GPS track number -->
+ <!-- <xsd:element name="type" type="xsd:string" minOccurs="0"/> PROPOSED -->
+ <!-- you can add your own privately defined rte elements at the end of the rte -->
+ <xsd:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="rtept" minOccurs="0" maxOccurs="unbounded">
+ <xsd:complexType>
+ <xsd:sequence> <!-- elements must appear in this order -->
+
+ <!-- Position info -->
+ <xsd:element name="ele" type="xsd:decimal" minOccurs="0"/>
+ <xsd:element name="time" type="xsd:dateTime" minOccurs="0"/>
+ <xsd:element name="magvar" type="gpx:degreesType" minOccurs="0"/>
+ <xsd:element name="geoidheight" type="xsd:decimal" minOccurs="0"/>
+
+ <!-- Description info -->
+ <xsd:element name="name" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="cmt" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="desc" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="src" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="url" type="xsd:anyURI" minOccurs="0"/>
+ <xsd:element name="urlname" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="sym" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="type" type="xsd:string" minOccurs="0"/>
+
+ <!-- Accuracy info -->
+ <xsd:element name="fix" type="gpx:fixType" minOccurs="0"/>
+ <xsd:element name="sat" type="xsd:nonNegativeInteger" minOccurs="0"/>
+ <xsd:element name="hdop" type="xsd:decimal" minOccurs="0"/>
+ <xsd:element name="vdop" type="xsd:decimal" minOccurs="0"/>
+ <xsd:element name="pdop" type="xsd:decimal" minOccurs="0"/>
+ <xsd:element name="ageofdgpsdata" type="xsd:decimal" minOccurs="0"/>
+ <xsd:element name="dgpsid" type="gpx:dgpsStationType" minOccurs="0"/>
+
+ <!-- you can add your own privately defined rtept elements at the end of the rtept -->
+ <xsd:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="lat" type="gpx:latitudeType" use="required"/>
+ <xsd:attribute name="lon" type="gpx:longitudeType" use="required"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="trk" minOccurs="0" maxOccurs="unbounded">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="cmt" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="desc" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="src" type="xsd:string" minOccurs="0"/> <!-- the source of this data: "Garmin eTrex", "Map", etc -->
+ <xsd:element name="url" type="xsd:anyURI" minOccurs="0"/>
+ <xsd:element name="urlname" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="number" type="xsd:nonNegativeInteger" minOccurs="0"/> <!-- GPS track number -->
+ <!-- <xsd:element name="type" type="xsd:string" minOccurs="0"/> PROPOSED -->
+ <!-- you can add your own privately defined trk elements at the end of the trk -->
+ <xsd:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="trkseg" minOccurs="0" maxOccurs="unbounded">
+ <xsd:complexType>
+ <xsd:sequence> <!-- elements must appear in this order -->
+ <xsd:element name="trkpt" minOccurs="0" maxOccurs="unbounded">
+ <xsd:complexType>
+ <xsd:sequence> <!-- elements must appear in this order -->
+
+ <!-- Position info -->
+ <xsd:element name="ele" type="xsd:decimal" minOccurs="0"/>
+ <xsd:element name="time" type="xsd:dateTime" minOccurs="0"/>
+ <xsd:element name="course" type="gpx:degreesType" minOccurs="0"/>
+ <xsd:element name="speed" type="xsd:decimal" minOccurs="0"/>
+ <xsd:element name="magvar" type="gpx:degreesType" minOccurs="0"/>
+ <xsd:element name="geoidheight" type="xsd:decimal" minOccurs="0"/>
+
+ <!-- Description info -->
+ <xsd:element name="name" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="cmt" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="desc" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="src" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="url" type="xsd:anyURI" minOccurs="0"/>
+ <xsd:element name="urlname" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="sym" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="type" type="xsd:string" minOccurs="0"/>
+
+ <!-- Accuracy info -->
+ <xsd:element name="fix" type="gpx:fixType" minOccurs="0"/>
+ <xsd:element name="sat" type="xsd:nonNegativeInteger" minOccurs="0"/>
+ <xsd:element name="hdop" type="xsd:decimal" minOccurs="0"/>
+ <xsd:element name="vdop" type="xsd:decimal" minOccurs="0"/>
+ <xsd:element name="pdop" type="xsd:decimal" minOccurs="0"/>
+ <xsd:element name="ageofdgpsdata" type="xsd:decimal" minOccurs="0"/>
+ <xsd:element name="dgpsid" type="gpx:dgpsStationType" minOccurs="0"/>
+
+ <!-- you can add your own privately defined trkpt elements at the end of the trkpt -->
+ <xsd:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="lat" type="gpx:latitudeType" use="required"/>
+ <xsd:attribute name="lon" type="gpx:longitudeType" use="required"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <!-- you can add your own privately defined elements at the end of the GPX file -->
+ <xsd:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="version" type="xsd:string" use="required" fixed="1.0"/> <!-- version 1.0 -->
+ <xsd:attribute name="creator" type="xsd:string" use="required"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <!-- Other types used by GPX -->
+
+ <xsd:simpleType name="latitudeType">
+ <xsd:restriction base="xsd:decimal">
+ <xsd:minInclusive value="-90.0"/>
+ <xsd:maxInclusive value="90.0"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="longitudeType">
+ <xsd:restriction base="xsd:decimal">
+ <xsd:minInclusive value="-180.0"/>
+ <xsd:maxInclusive value="180.0"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="degreesType"> <!-- for bearing, heading, course. Units are degrees, true -->
+ <xsd:restriction base="xsd:decimal">
+ <xsd:minInclusive value="0.0"/>
+ <xsd:maxInclusive value="360.0"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="fixType">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="none"/> <!-- none means GPS had no fix. To signify "the fix info is unknown, leave out the <fix> tag entirely -->
+ <xsd:enumeration value="2d"/>
+ <xsd:enumeration value="3d"/>
+ <xsd:enumeration value="dgps"/>
+ <xsd:enumeration value="pps"/> <!-- military signal used -->
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="dgpsStationType">
+ <xsd:restriction base="xsd:integer">
+ <xsd:minInclusive value="0"/>
+ <xsd:maxInclusive value="1023"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:complexType name="boundsType"> <!-- bounding rect for data in file -->
+ <xsd:attribute name="minlat" type="gpx:latitudeType" use="required"/>
+ <xsd:attribute name="minlon" type="gpx:longitudeType" use="required"/>
+ <xsd:attribute name="maxlat" type="gpx:latitudeType" use="required"/>
+ <xsd:attribute name="maxlon" type="gpx:longitudeType" use="required"/>
+ </xsd:complexType>
+
+ <xsd:simpleType name="emailType">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[\p{L}_]+(\.[\p{L}_]+)*@[\p{L}_]+(\.[\p{L}_]+)+"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+</xsd:schema> \ No newline at end of file
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/instance.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/instance.xml
new file mode 100644
index 0000000000..5bf398dd0d
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/instance.xml
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="MeasDataCollection.xsl"?>
+<measCollecFile xmlns="http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec">
+ <fileHeader fileFormatVersion="32.435 V7.2.0"
+ vendorName="Ericsson AB"
+ dnPrefix="STP43">
+ <fileSender localDn="bs=18"
+ elementType="SBG"/>
+ <measCollec beginTime="2007-09-20T14:05:00+00:00"/>
+ </fileHeader>
+ <measData>
+ <managedElement localDn="bs=18"
+ userLabel="OMMP"
+ swVersion="R6A"/>
+ <measInfo measInfoId="l">
+ <job jobId="1"/>
+ <granPeriod duration="PT300S" endTime="2007-09-20T14:10:00+00:00"/>
+ <repPeriod duration="PT300S"/>
+ <measType p="1">ethernetStatsTxFrames</measType>
+ <measType p="2">ethernetStatsTxOctets</measType>
+ <measType p="3">ethernetStatsRxFrames</measType>
+ <measType p="4">ethernetStatsRxOctets</measType>
+ <measType p="5">ethernetStatsBroadcastTx</measType>
+ <measType p="6">ethernetStatsBroadcastRx</measType>
+ <measType p="7">ethernetStatsTxPauseFrames</measType>
+ <measType p="8">ethernetStatsRxMacFrames</measType>
+ <measType p="9">ethernetStatsMulticastRx</measType>
+ <measType p="10">ethernetStatsRxDiscarded</measType>
+ <measType p="11">ethernetStatsRxErrors</measType>
+ <measType p="12">ethernetStatsTxDiscarded</measType>
+ <measValue measObjLdn="Mp.bsNo=18,MpBlade.subrack=0+slot=7,EthernetInterface.port=1">
+ <r p="1">139197852</r>
+ <r p="2">19584465702</r>
+ <r p="3">144651440</r>
+ <r p="4">20348020750</r>
+ <r p="5">30</r>
+ <r p="6">27509</r>
+ <r p="7">0</r>
+ <r p="8">0</r>
+ <r p="9">114575</r>
+ <r p="10">0</r>
+ <r p="11">8590076673</r>
+ <r p="12">0</r>
+ </measValue>
+ <measValue measObjLdn="Mp.bsNo=18,MpBlade.subrack=0+slot=7,EthernetInterface.port=2">
+ <r p="1">0</r>
+ <r p="2">0</r>
+ <r p="3">0</r>
+ <r p="4">0</r>
+ <r p="5">0</r>
+ <r p="6">0</r>
+ <r p="7">0</r>
+ <r p="8">0</r>
+ <r p="9">0</r>
+ <r p="10">0</r>
+ <r p="11">0</r>
+ <r p="12">0</r>
+ </measValue>
+ <measValue measObjLdn="Mp.bsNo=18,MpBlade.subrack=0+slot=9,EthernetInterface.port=1">
+ <r p="1">2282798</r>
+ <r p="2">146099072</r>
+ <r p="3">2424888</r>
+ <r p="4">155302856</r>
+ <r p="5">3</r>
+ <r p="6">27515</r>
+ <r p="7">0</r>
+ <r p="8">0</r>
+ <r p="9">114575</r>
+ <r p="10">0</r>
+ <r p="11">142081</r>
+ <r p="12">0</r>
+ </measValue>
+ <measValue measObjLdn="Mp.bsNo=18,MpBlade.subrack=0+slot=7,EthernetInterface.port=3">
+ <r p="1">0</r>
+ <r p="2">0</r>
+ <r p="3">0</r>
+ <r p="4">0</r>
+ <r p="5">0</r>
+ <r p="6">0</r>
+ <r p="7">0</r>
+ <r p="8">0</r>
+ <r p="9">0</r>
+ <r p="10">0</r>
+ <r p="11">0</r>
+ <r p="12">0</r>
+ </measValue>
+ <measValue measObjLdn="Mp.bsNo=18,MpBlade.subrack=0+slot=9,EthernetInterface.port=2">
+ <r p="1">0</r>
+ <r p="2">0</r>
+ <r p="3">0</r>
+ <r p="4">0</r>
+ <r p="5">0</r>
+ <r p="6">0</r>
+ <r p="7">0</r>
+ <r p="8">0</r>
+ <r p="9">0</r>
+ <r p="10">0</r>
+ <r p="11">0</r>
+ <r p="12">0</r>
+ </measValue>
+ <measValue measObjLdn="Mp.bsNo=18,MpBlade.subrack=0+slot=9,EthernetInterface.port=3">
+ <r p="1">0</r>
+ <r p="2">0</r>
+ <r p="3">0</r>
+ <r p="4">0</r>
+ <r p="5">0</r>
+ <r p="6">0</r>
+ <r p="7">0</r>
+ <r p="8">0</r>
+ <r p="9">0</r>
+ <r p="10">0</r>
+ <r p="11">0</r>
+ <r p="12">0</r>
+ </measValue>
+ <measValue measObjLdn="Mp.bsNo=18,MpBlade.subrack=0+slot=7,EthernetInterface.port=0">
+ <r p="1">139211625</r>
+ <r p="2">19586502972</r>
+ <r p="3">153860245</r>
+ <r p="4">21661061980</r>
+ <r p="5">30</r>
+ <r p="6">3</r>
+ <r p="7">0</r>
+ <r p="8">0</r>
+ <r p="9">68745</r>
+ <r p="10">0</r>
+ <r p="11">68745</r>
+ <r p="12">0</r>
+ </measValue>
+ <measValue measObjLdn="Mp.bsNo=18,MpBlade.subrack=0+slot=9,EthernetInterface.port=0">
+ <r p="1">2282798</r>
+ <r p="2">146099072</r>
+ <r p="3">2351552</r>
+ <r p="4">150499328</r>
+ <r p="5">3</r>
+ <r p="6">9</r>
+ <r p="7">0</r>
+ <r p="8">0</r>
+ <r p="9">68745</r>
+ <r p="10">0</r>
+ <r p="11">68745</r>
+ <r p="12">0</r>
+ </measValue>
+ </measInfo>
+ </measData>
+ <fileFooter>
+ <measCollec endTime="2007-09-20T14:10:00+00:00"/>
+ </fileFooter>
+</measCollecFile>
+
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/int.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/int.xml
new file mode 100644
index 0000000000..9654bc56ce
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/int.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<purchaseOrder>
+4
+</purchaseOrder>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/ipo.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/ipo.xml
new file mode 100644
index 0000000000..3771926dd2
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/ipo.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<ipo:purchaseOrder
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:ipo="http://www.example.com/IPO"
+ orderDate="1999-12-01">
+
+ <shipTo exportCode="1" xsi:type="ipo:UKAddress">
+ <name>Helen Zoe</name>
+ <street>47 Eden Street</street>
+ <city>Cambridge</city>
+ <postcode>CB1 1JR</postcode>
+ </shipTo>
+
+ <billTo xsi:type="ipo:USAddress">
+ <name>Robert Smith</name>
+ <street>8 Oak Avenue</street>
+ <city>Old Town</city>
+ <state>PA</state>
+ <zip>95819</zip>
+ </billTo>
+
+ <items>
+ <item partNum="833-AA">
+ <productName>Lapis necklace</productName>
+ <quantity>1</quantity>
+ <USPrice>99.95</USPrice>
+ <ipo:comment>Want this for the holidays!</ipo:comment>
+ <shipDate>1999-12-05</shipDate>
+ </item>
+ </items>
+</ipo:purchaseOrder>
+
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/ipo.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/ipo.xsd
new file mode 100644
index 0000000000..856c712e5a
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/ipo.xsd
@@ -0,0 +1,60 @@
+<schema targetNamespace="http://www.example.com/IPO"
+ xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:ipo="http://www.example.com/IPO">
+
+ <annotation>
+ <documentation xml:lang="en">
+ International Purchase order schema for Example.com
+ Copyright 2000 Example.com. All rights reserved.
+ </documentation>
+ </annotation>
+
+ <!-- include address constructs -->
+ <include
+ schemaLocation="address.xsd"/>
+
+ <element name="purchaseOrder" type="ipo:PurchaseOrderType"/>
+
+ <element name="comment" type="string"/>
+
+ <complexType name="PurchaseOrderType">
+ <sequence>
+ <element name="shipTo" type="ipo:Address"/>
+ <element name="billTo" type="ipo:Address"/>
+ <element ref="ipo:comment" minOccurs="0"/>
+ <element name="items" type="ipo:Items"/>
+ </sequence>
+ <attribute name="orderDate" type="date"/>
+ </complexType>
+
+ <complexType name="Items">
+ <sequence>
+ <element name="item" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="productName" type="string"/>
+ <element name="quantity">
+ <simpleType>
+ <restriction base="positiveInteger">
+ <maxExclusive value="100"/>
+ </restriction>
+ </simpleType>
+ </element>
+ <element name="USPrice" type="decimal"/>
+ <element ref="ipo:comment" minOccurs="0"/>
+ <element name="shipDate" type="date" minOccurs="0"/>
+ </sequence>
+ <attribute name="partNum" type="ipo:SKU" use="required"/>
+ </complexType>
+ </element>
+ </sequence>
+ </complexType>
+
+ <simpleType name="SKU">
+ <restriction base="string">
+ <pattern value="\d{3}-[A-Z]{2}"/>
+ </restriction>
+ </simpleType>
+
+</schema>
+
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/ipo_redefine.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/ipo_redefine.xml
new file mode 100644
index 0000000000..3f39febc03
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/ipo_redefine.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<ipo:purchaseOrder
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:ipo="http://www.example.com/IPO"
+ orderDate="1999-12-01">
+
+ <shipTo exportCode="1" xsi:type="ipo:UKAddress">
+ <name>Helen Zoe</name>
+ <street>47 Eden Street</street>
+ <city>Cambridge</city>
+ <country>United Kingdom</country>
+ <postcode>CB1 1JR</postcode>
+ </shipTo>
+
+ <billTo xsi:type="ipo:USAddress">
+ <name>Robert Smith</name>
+ <street>8 Oak Avenue</street>
+ <city>Old Town</city>
+ <country>USA</country>
+ <state>PA</state>
+ <zip>95819</zip>
+ </billTo>
+
+ <items>
+ <item partNum="833-AA">
+ <productName>Lapis necklace</productName>
+ <quantity>1</quantity>
+ <USPrice>99.95</USPrice>
+ <ipo:comment>Want this for the holidays!</ipo:comment>
+ <shipDate>1999-12-05</shipDate>
+ </item>
+ </items>
+</ipo:purchaseOrder>
+
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/ipo_redefine.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/ipo_redefine.xsd
new file mode 100644
index 0000000000..ad5e4884fd
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/ipo_redefine.xsd
@@ -0,0 +1,73 @@
+<schema targetNamespace="http://www.example.com/IPO"
+ xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:ipo="http://www.example.com/IPO">
+
+ <annotation>
+ <documentation xml:lang="en">
+ International Purchase order schema for Example.com
+ Copyright 2000 Example.com. All rights reserved.
+ </documentation>
+ </annotation>
+
+<!-- bring in address constructs -->
+ <redefine
+ schemaLocation="address.xsd">
+
+ <!-- redefinition of Address -->
+ <complexType name="Address">
+ <complexContent>
+ <extension base="ipo:Address">
+ <sequence>
+ <element name="country" type="string"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ </redefine>
+
+ <element name="purchaseOrder" type="ipo:PurchaseOrderType"/>
+
+ <element name="comment" type="string"/>
+
+ <complexType name="PurchaseOrderType">
+ <sequence>
+ <element name="shipTo" type="ipo:Address"/>
+ <element name="billTo" type="ipo:Address"/>
+ <element ref="ipo:comment" minOccurs="0"/>
+ <element name="items" type="ipo:Items"/>
+ </sequence>
+ <attribute name="orderDate" type="date"/>
+ </complexType>
+
+ <complexType name="Items">
+ <sequence>
+ <element name="item" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="productName" type="string"/>
+ <element name="quantity">
+ <simpleType>
+ <restriction base="positiveInteger">
+ <maxExclusive value="100"/>
+ </restriction>
+ </simpleType>
+ </element>
+ <element name="USPrice" type="decimal"/>
+ <element ref="ipo:comment" minOccurs="0"/>
+ <element name="shipDate" type="date" minOccurs="0"/>
+ </sequence>
+ <attribute name="partNum" type="ipo:SKU" use="required"/>
+ </complexType>
+ </element>
+ </sequence>
+ </complexType>
+
+ <simpleType name="SKU">
+ <restriction base="string">
+ <pattern value="\d{3}-[A-Z]{2}"/>
+ </restriction>
+ </simpleType>
+
+</schema>
+
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/ipo_substGroup.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/ipo_substGroup.xml
new file mode 100644
index 0000000000..a889153dae
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/ipo_substGroup.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<ipo:purchaseOrder
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:ipo="http://www.example.com/IPO"
+ orderDate="1999-12-01">
+
+ <shipTo exportCode="1" xsi:type="ipo:UKAddress">
+ <name>Helen Zoe</name>
+ <street>47 Eden Street</street>
+ <city>Cambridge</city>
+ <postcode>CB1 1JR</postcode>
+ </shipTo>
+
+ <billTo xsi:type="ipo:USAddress">
+ <name>Robert Smith</name>
+ <street>8 Oak Avenue</street>
+ <city>Old Town</city>
+ <state>PA</state>
+ <zip>95819</zip>
+ </billTo>
+
+ <items>
+ <item partNum="833-AA">
+ <productName>Lapis necklace</productName>
+ <quantity>1</quantity>
+ <USPrice>99.95</USPrice>
+ <ipo:shipComment>
+ Use gold wrap if possible
+ </ipo:shipComment>
+ <ipo:customerComment>
+ Want this for the holidays!
+ </ipo:customerComment>
+ <shipDate>1999-12-05</shipDate>
+ </item>
+ </items>
+</ipo:purchaseOrder>
+
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/ipo_substGroup.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/ipo_substGroup.xsd
new file mode 100644
index 0000000000..3899d0f5de
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/ipo_substGroup.xsd
@@ -0,0 +1,65 @@
+<schema targetNamespace="http://www.example.com/IPO"
+ xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:ipo="http://www.example.com/IPO">
+
+ <annotation>
+ <documentation xml:lang="en">
+ International Purchase order schema for Example.com
+ Copyright 2000 Example.com. All rights reserved.
+ </documentation>
+ </annotation>
+
+ <!-- include address constructs -->
+ <include
+ schemaLocation="address.xsd"/>
+
+ <element name="purchaseOrder" type="ipo:PurchaseOrderType"/>
+
+ <element name="comment" type="string"/>
+
+ <element name="shipComment" type="string"
+ substitutionGroup="ipo:comment"/>
+ <element name="customerComment" type="string"
+ substitutionGroup="ipo:comment"/>
+
+ <complexType name="PurchaseOrderType">
+ <sequence>
+ <element name="shipTo" type="ipo:Address"/>
+ <element name="billTo" type="ipo:Address"/>
+ <element ref="ipo:comment" minOccurs="0"/>
+ <element name="items" type="ipo:Items"/>
+ </sequence>
+ <attribute name="orderDate" type="date"/>
+ </complexType>
+
+ <complexType name="Items">
+ <sequence>
+ <element name="item" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="productName" type="string"/>
+ <element name="quantity">
+ <simpleType>
+ <restriction base="positiveInteger">
+ <maxExclusive value="100"/>
+ </restriction>
+ </simpleType>
+ </element>
+ <element name="USPrice" type="decimal"/>
+ <element ref="ipo:comment" minOccurs="0" maxOccurs="unbounded"/>
+ <element name="shipDate" type="date" minOccurs="0"/>
+ </sequence>
+ <attribute name="partNum" type="ipo:SKU" use="required"/>
+ </complexType>
+ </element>
+ </sequence>
+ </complexType>
+
+ <simpleType name="SKU">
+ <restriction base="string">
+ <pattern value="\d{3}-[A-Z]{2}"/>
+ </restriction>
+ </simpleType>
+
+</schema>
+
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/measCollec.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/measCollec.xsd
new file mode 100644
index 0000000000..3e6614effd
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/measCollec.xsd
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ 3GPP TS 32.435 Performance Measurement XML file format definition
+ data file XML schema
+ measCollec.xsd
+-->
+
+<schema
+ targetNamespace=
+"http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec"
+ elementFormDefault="qualified"
+ xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:mc=
+"http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec"
+>
+
+ <!-- Measurement collection data file root XML element -->
+
+ <element name="measCollecFile">
+ <complexType>
+ <sequence>
+ <element name="fileHeader">
+ <complexType>
+ <sequence>
+ <element name="fileSender">
+ <complexType>
+ <attribute name="localDn" type="string" use="optional"/>
+ <attribute name="elementType" type="string" use="optional"/>
+ </complexType>
+ </element>
+ <element name="measCollec">
+ <complexType>
+ <attribute name="beginTime" type="dateTime" use="required"/>
+ </complexType>
+ </element>
+ </sequence>
+ <attribute name="fileFormatVersion" type="string" use="required"/>
+ <attribute name="vendorName" type="string" use="optional"/>
+ <attribute name="dnPrefix" type="string" use="optional"/>
+ </complexType>
+ </element>
+ <element name="measData" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="managedElement">
+ <complexType>
+ <attribute name="localDn" type="string" use="optional"/>
+ <attribute name="userLabel" type="string" use="optional"/>
+ <attribute name="swVersion" type="string" use="optional"/>
+ </complexType>
+ </element>
+ <element name="measInfo" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="job" minOccurs="0">
+ <complexType>
+ <attribute name="jobId" type="string" use="required"/>
+ </complexType>
+ </element>
+ <element name="granPeriod">
+ <complexType>
+ <attribute
+ name="duration"
+ type="duration"
+ use="required"
+ />
+ <attribute
+ name="endTime"
+ type="dateTime"
+ use="required"
+ />
+ </complexType>
+ </element>
+ <element name="repPeriod" minOccurs="0">
+ <complexType>
+ <attribute name="duration"
+ type="duration" use="required"/>
+ </complexType>
+ </element>
+ <choice>
+ <element name="measTypes">
+ <simpleType>
+ <list itemType="Name"/>
+ </simpleType>
+ </element>
+ <element name="measType"
+ minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <simpleContent>
+ <extension base="Name">
+ <attribute name="p"
+ type="positiveInteger" use="required"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+ </element>
+ </choice>
+ <element name="measValue"
+ minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <choice>
+ <element name="measResults">
+ <simpleType>
+ <list itemType="mc:measResultType"/>
+ </simpleType>
+ </element>
+ <element name="r"
+ minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <simpleContent>
+ <extension base="mc:measResultType">
+ <attribute name="p" type="positiveInteger"
+ use="required"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+ </element>
+ </choice>
+ <element name="suspect" type="boolean" minOccurs="0"/>
+ </sequence>
+ <attribute name="measObjLdn"
+ type="string" use="required"/>
+ </complexType>
+ </element>
+ </sequence>
+ <attribute name="measInfoId"
+ type="string" use="required"/>
+ </complexType>
+ </element>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="fileFooter">
+ <complexType>
+ <sequence>
+ <element name="measCollec">
+ <complexType>
+ <attribute name="endTime" type="dateTime" use="required"/>
+ </complexType>
+ </element>
+ </sequence>
+ </complexType>
+ </element>
+ </sequence>
+ </complexType>
+ </element>
+
+ <simpleType name="measResultType">
+ <union memberTypes="float">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="NIL"/>
+ </restriction>
+ </simpleType>
+ </union>
+ </simpleType>
+
+</schema>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/mim.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/mim.xsd
new file mode 100755
index 0000000000..057344cde8
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/mim.xsd
@@ -0,0 +1,511 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <!--
+
+ Copyright (c) Ericsson AB 2006 All rights reserved.
+
+ The information in this document is the property of Ericsson.
+
+ Except as specifically authorized in writing by Ericsson, the
+ receiver of this document shall keep the information contained
+ herein confidential and shall protect the same in whole or in
+ part from disclosure and dissemination to third parties.
+
+ Disclosure and disseminations to the receivers employees shall
+ only be made on a strict need to know basis.
+ -->
+ <!-- Common -->
+ <xs:element name="description" type="xs:string"/>
+ <xs:element name="applicationTag">
+ <xs:complexType>
+ <xs:group minOccurs="0" maxOccurs="unbounded" ref="anyElement"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:attributeGroup name="anyAttribute">
+ <xs:anyAttribute processContents="skip"/>
+ </xs:attributeGroup>
+ <xs:group name="anyElement">
+ <xs:sequence>
+ <xs:any processContents="skip"/>
+ </xs:sequence>
+ </xs:group>
+ <!-- Mim definition -->
+ <xs:element name="mim">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:group ref="namedStruct"/>
+ <xs:element ref="enum"/>
+ <xs:group ref="dataTypeDef"/>
+ <xs:element ref="exception"/>
+ </xs:choice>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="class"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="relationship"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <!-- MO class definition -->
+ <xs:element name="class">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="applicationTag"/>
+ <xs:choice>
+ <xs:sequence>
+ <xs:element ref="singleton"/>
+ <xs:element minOccurs="0" ref="systemCreated"/>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:group ref="namedStruct"/>
+ <xs:element ref="enum"/>
+ <xs:group ref="dataTypeDef"/>
+ </xs:choice>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="attribute"/>
+ </xs:sequence>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="systemCreated"/>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:group ref="namedStruct"/>
+ <xs:element ref="enum"/>
+ <xs:group ref="dataTypeDef"/>
+ </xs:choice>
+ <xs:element maxOccurs="unbounded" ref="attribute"/>
+ </xs:sequence>
+ </xs:choice>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="action"/>
+ <xs:element minOccurs="0" ref="notificationTypes"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[A-Z][A-Za-z0-9]*"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="singleton">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="systemCreated">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="notificationTypes" type="xs:string"/>
+ <!-- Relations -->
+ <xs:element name="relationship">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="applicationTag"/>
+ <xs:element ref="containment"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="containment">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="parent"/>
+ <xs:element ref="child"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="parent" type="hasClass"/>
+ <xs:element name="child">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="hasClass">
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="cardinality"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="cardinality">
+ <xs:complexType>
+ <xs:choice>
+ <xs:element ref="min"/>
+ <xs:element ref="max"/>
+ <xs:sequence>
+ <xs:element ref="min"/>
+ <xs:element ref="max"/>
+ </xs:sequence>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="hasClass">
+ <xs:sequence>
+ <xs:element ref="hasClass"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="hasClass">
+ <xs:complexType>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- Data types -->
+ <xs:group name="type">
+ <xs:choice>
+ <xs:element ref="boolean"/>
+ <xs:element ref="float"/>
+ <xs:element ref="integer"/>
+ <xs:element ref="string"/>
+ <xs:group ref="struct"/>
+ <xs:element ref="enumRef"/>
+ <xs:element ref="structRef"/>
+ <xs:element ref="moRef"/>
+ </xs:choice>
+ </xs:group>
+ <!-- For attributes, parameters and exceptions -->
+ <xs:group name="dataType">
+ <xs:sequence>
+ <xs:element name="dataType">
+ <xs:complexType>
+ <xs:choice>
+ <xs:group ref="type"/>
+ <xs:element ref="sequence"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:group>
+ <xs:group name="dataTypeDef">
+ <xs:sequence>
+ <xs:element name="dataType">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="applicationTag"/>
+ <xs:choice>
+ <xs:group ref="type"/>
+ <xs:element ref="sequence"/>
+ </xs:choice>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:group>
+ <xs:group name="dataTypeRef">
+ <xs:sequence>
+ <xs:element name="dataType">
+ <xs:complexType>
+ <xs:attribute name="name.ref" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:group>
+ <!-- For actions -->
+ <xs:element name="returnType">
+ <xs:complexType>
+ <xs:choice>
+ <xs:element ref="void"/>
+ <xs:group ref="type"/>
+ <xs:element ref="sequence"/>
+ <xs:group ref="dataTypeRef"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ <!-- Return data types -->
+ <xs:element name="void">
+ <xs:complexType/>
+ </xs:element>
+ <!-- Primitive data types -->
+ <xs:element name="boolean">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="defaultValue"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="float">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="range"/>
+ <xs:element minOccurs="0" ref="defaultValue"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="integer">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="range"/>
+ <xs:element minOccurs="0" ref="defaultValue"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="string">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="lengthRange"/>
+ <xs:element minOccurs="0" ref="validValues"/>
+ <xs:element minOccurs="0" ref="pattern"/>
+ <xs:element minOccurs="0" ref="defaultValue"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="pattern" type="xs:string"/>
+ <xs:element name="validValues" type="xs:string"/>
+ <xs:element name="lengthRange">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="min"/>
+ <xs:sequence minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="min"/>
+ <xs:element ref="max"/>
+ </xs:sequence>
+ <xs:element minOccurs="0" ref="max"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="range">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="min"/>
+ <xs:sequence minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="min"/>
+ <xs:element ref="max"/>
+ </xs:sequence>
+ <xs:element minOccurs="0" ref="max"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="max" type="xs:string"/>
+ <xs:element name="min" type="xs:string"/>
+ <xs:element name="defaultValue" type="xs:string"/>
+ <!-- Enum data type -->
+ <xs:element name="enum">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="applicationTag"/>
+ <xs:element maxOccurs="unbounded" ref="enumMember"/>
+ <xs:element minOccurs="0" ref="defaultValue"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="enumMember">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="applicationTag"/>
+ <xs:element minOccurs="0" ref="value"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="enumRef">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="defaultValue"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="value" type="xs:string"/>
+ <!-- Struct data type -->
+ <xs:group name="namedStruct">
+ <xs:sequence>
+ <xs:element name="struct">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="applicationTag"/>
+ <xs:element maxOccurs="unbounded" ref="structMember"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:group>
+ <xs:group name="struct">
+ <xs:sequence>
+ <xs:element name="struct">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" ref="structMember"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:group>
+ <xs:element name="structMember">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="applicationTag"/>
+ <xs:choice>
+ <xs:group ref="type"/>
+ <xs:element ref="sequence"/>
+ <xs:group ref="dataTypeRef"/>
+ </xs:choice>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="structRef">
+ <xs:complexType>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- Sequence data type -->
+ <xs:element name="sequence">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:choice>
+ <xs:group ref="type"/>
+ <xs:group ref="dataTypeRef"/>
+ </xs:choice>
+ <xs:element minOccurs="0" ref="minLength"/>
+ <xs:element minOccurs="0" ref="maxLength"/>
+ <xs:element minOccurs="0" ref="nonUnique"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="minLength" type="xs:string"/>
+ <xs:element name="maxLength" type="xs:string"/>
+ <xs:element name="nonUnique">
+ <xs:complexType/>
+ </xs:element>
+ <!-- MoRef data type -->
+ <xs:element name="moRef">
+ <xs:complexType>
+ <xs:attribute name="name" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:pattern value="(/[A-Z][A-Za-z0-9]*)*"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ <!-- Attribute -->
+ <xs:element name="attribute">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="applicationTag">
+ <xs:annotation>
+ <xs:documentation>Currently not used in IS.</xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ <xs:choice>
+ <xs:group ref="dataType"/>
+ <xs:group ref="dataTypeRef"/>
+ </xs:choice>
+ <xs:element minOccurs="0" ref="initialValue"/>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="noNotification"/>
+ <xs:element ref="restricted"/>
+ <xs:element ref="readOnly"/>
+ <xs:choice>
+ <xs:element ref="key"/>
+ <xs:choice>
+ <xs:element ref="local"/>
+ <xs:element ref="mandatory"/>
+ <xs:element ref="nonPersistent"/>
+ <xs:element ref="static"/>
+ <xs:element ref="undefined"/>
+ </xs:choice>
+ </xs:choice>
+ </xs:choice>
+ </xs:sequence>
+ <xs:attribute name="name" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[a-z][a-zA-Z0-9]*"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="initialValue" type="xs:string"/>
+ <xs:element name="key">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="local">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="mandatory">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="noNotification">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="nonPersistent">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="readOnly">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="restricted">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="static">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="undefined">
+ <xs:complexType/>
+ </xs:element>
+ <!-- Action -->
+ <xs:element name="action">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="applicationTag"/>
+ <xs:element ref="returnType"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="parameter"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="raisesException"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[a-z][a-zA-Z0-9]*"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="parameter">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="applicationTag"/>
+ <xs:choice>
+ <xs:group ref="dataType"/>
+ <xs:group ref="dataTypeRef"/>
+ </xs:choice>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="exception">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="applicationTag"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="exceptionParameter"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="exceptionParameter">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="applicationTag"/>
+ <xs:choice>
+ <xs:group ref="dataType"/>
+ <xs:group ref="dataTypeRef"/>
+ </xs:choice>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="raisesException">
+ <xs:complexType>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/EricssonSpecificAttributes.5.1.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/EricssonSpecificAttributes.5.1.xsd
new file mode 100644
index 0000000000..3509d13da7
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/EricssonSpecificAttributes.5.1.xsd
@@ -0,0 +1,1531 @@
+<!--
+ Configuration data file vendor-specific XML schema
+ EricssonSpecificAttributes.5.1.xsd
+ Includes Transport.
+ -->
+<schema xmlns:es="EricssonSpecificAttributes.5.1.xsd" xmlns:xn="genericNrm.xsd" xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="EricssonSpecificAttributes.5.1.xsd" elementFormDefault="qualified" attributeFormDefault="unqualified">
+ <!-- EricssonSpecificAttributes version 5.0 vendor-specific data -->
+ <import namespace="genericNrm.xsd" schemaLocation="genericNrm.xsd"/>
+ <include schemaLocation="EricssonSpecificAttributes.5.1Tran.xsd"/>
+ <element name="vsDataAntennaBranch" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="branchName" minOccurs="0"/>
+ <element name="antennaType" minOccurs="0"/>
+ <element name="verticalAntennaTilt" minOccurs="0"/>
+ <element name="mechanicalAntennaTilt" minOccurs="0"/>
+ <element name="antennaSupervisionThreshold" minOccurs="0"/>
+ <element name="fqBandHighEdge" minOccurs="0"/>
+ <element name="fqBandLowEdge" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataAntFeederCable" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="ulAttenuation" minOccurs="0" maxOccurs="unbounded"/>
+ <element name="dlAttenuation" minOccurs="0" maxOccurs="unbounded"/>
+ <element name="objectBConnector" minOccurs="0"/>
+ <element name="connectedToObjectBRef" minOccurs="0"/>
+ <element name="electricalUlDelay" minOccurs="0"/>
+ <element name="electricalDlDelay" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataAreas" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData"/>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataCchFrameSynch" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="dto" minOccurs="0"/>
+ <element name="doStep" minOccurs="0"/>
+ <element name="toAWS" minOccurs="0"/>
+ <element name="toAWE" minOccurs="0"/>
+ <element name="toAE" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataChannelSwitching" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="dlRlcBufUpswitch" minOccurs="0"/>
+ <element name="ulRlcBufUpswitch" minOccurs="0"/>
+ <element name="downswitchThreshold" minOccurs="0"/>
+ <element name="downswitchTimerThreshold" minOccurs="0"/>
+ <element name="downswitchTimer" minOccurs="0"/>
+ <element name="dlRlcBufUpswitchMrab" minOccurs="0"/>
+ <element name="ulRlcBufUpswitchMrab" minOccurs="0"/>
+ <element name="upswitchTimer" minOccurs="0"/>
+ <element name="coverageTimer" minOccurs="0"/>
+ <element name="inactivityTimer" minOccurs="0"/>
+ <element name="downswitchPwrMargin" minOccurs="0"/>
+ <element name="reportHysteresis" minOccurs="0"/>
+ <element name="upswitchPwrMargin" minOccurs="0"/>
+ <element name="downswitchTimerUp" minOccurs="0"/>
+ <element name="downswitchTimerSp" minOccurs="0"/>
+ <element name="hsdschInactivityTimer" minOccurs="0"/>
+ <element name="bandwidthMarginUl" minOccurs="0"/>
+ <element name="upswitchTimerUl" minOccurs="0"/>
+ <element name="bandwidthMargin" minOccurs="0"/>
+ <element name="dlDownswitchBandwidthMargin" minOccurs="0"/>
+ <element name="dlThroughputAllowUpswitchThreshold" minOccurs="0"/>
+ <element name="dlThroughputDownswitchTimer" minOccurs="0"/>
+ <element name="inactivityTimerPch" minOccurs="0"/>
+ <element name="multiRabSp0Available" minOccurs="0"/>
+ <element name="multiRabUdi8Available" minOccurs="0"/>
+ <element name="ulThroughputAllowUpswitchThreshold" minOccurs="0"/>
+ <element name="ulThroughputDownswitchTimer" minOccurs="0"/>
+ <element name="ulDownswitchBandwidthMargin" minOccurs="0"/>
+ <element name="inactivityTimeMultiPsInteractive" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataDchFrameSynch" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="dto" minOccurs="0"/>
+ <element name="doStep" minOccurs="0"/>
+ <element name="toAWS" minOccurs="0"/>
+ <element name="toAWE" minOccurs="0"/>
+ <element name="toAE" minOccurs="0"/>
+ <element name="uto" minOccurs="0"/>
+ <element name="uoStep" minOccurs="0"/>
+ <element name="toAWEUl" minOccurs="0"/>
+ <element name="toAEUl" minOccurs="0"/>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="toAWSUl" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataAuxPlugInUnit" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData"/>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataEquipment" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData"/>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataPlmn" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="mcc" minOccurs="0"/>
+ <element name="mnc" minOccurs="0"/>
+ <element name="mncLength" minOccurs="0"/>
+ <element name="aliasPlmnIdentities" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="mcc" minOccurs="0"/>
+ <element name="mnc" minOccurs="0"/>
+ <element name="mncLength" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataExternalGsmCell" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="maxTxPowerUl" minOccurs="0"/>
+ <element name="qRxLevMin" minOccurs="0"/>
+ <element name="individualOffset" minOccurs="0"/>
+ <element name="parentSystem" minOccurs="0"/>
+ <element name="mncLength" minOccurs="0"/>
+ <element name="bandIndicator" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataExternalGsmPlmn" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="mcc" minOccurs="0"/>
+ <element name="mnc" minOccurs="0"/>
+ <element name="mncLength" minOccurs="0"/>
+ <element name="aliasPlmnIdentities" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="mcc" minOccurs="0"/>
+ <element name="mnc" minOccurs="0"/>
+ <element name="mncLength" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataExternalTma" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="dlAttenuation" minOccurs="0"/>
+ <element name="ulGain" minOccurs="0"/>
+ <element name="dlTrafficDelayA" minOccurs="0"/>
+ <element name="dlTrafficDelayB" minOccurs="0"/>
+ <element name="internalPower" minOccurs="0"/>
+ <element name="ulTrafficDelayA" minOccurs="0"/>
+ <element name="ulTrafficDelayB" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataExternalUtranCell" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="qQualMin" minOccurs="0"/>
+ <element name="qRxLevMin" minOccurs="0"/>
+ <element name="maxTxPowerUl" minOccurs="0"/>
+ <element name="individualOffset" minOccurs="0"/>
+ <element name="parentSystem" minOccurs="0"/>
+ <element name="mncLength" minOccurs="0"/>
+ <element name="agpsEnabled" minOccurs="0"/>
+ <element name="cellCapability" minOccurs="0">
+ <complexType>
+ <sequence>
+ <element name="hsdschSupport" minOccurs="0"/>
+ <element name="edchSupport" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataExternalUtranPlmn" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="mcc" minOccurs="0"/>
+ <element name="mnc" minOccurs="0"/>
+ <element name="mncLength" minOccurs="0"/>
+ <element name="reservedBy" minOccurs="0"/>
+ <element name="aliasPlmnIdentities" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="mcc" minOccurs="0"/>
+ <element name="mnc" minOccurs="0"/>
+ <element name="mncLength" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataFach" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="maxFach1Power" minOccurs="0"/>
+ <element name="maxFach2Power" minOccurs="0"/>
+ <element name="sccpchOffset" minOccurs="0"/>
+ <element name="pOffset1Fach" minOccurs="0"/>
+ <element name="pOffset3Fach" minOccurs="0"/>
+ <element name="administrativeState" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataGsmRelation" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="qOffset1sn" minOccurs="0"/>
+ <element name="mobilityRelationType" minOccurs="0"/>
+ <element name="selectionPriority" minOccurs="0"/>
+ <element name="externalGsmCellRef" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataHandover" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="maxActiveSet" minOccurs="0"/>
+ <element name="fddGsmHOSupp" minOccurs="0"/>
+ <element name="selHoSup" minOccurs="0"/>
+ <element name="timeReleaseIuPs" minOccurs="0"/>
+ <element name="gsmAmountPropRepeat" minOccurs="0"/>
+ <element name="gsmPropRepeatInterval" minOccurs="0"/>
+ <element name="ifhoPropRepeatInterval" minOccurs="0"/>
+ <element name="ifhoAmountPropRepeat" minOccurs="0"/>
+ <element name="fddIfhoSupp" minOccurs="0"/>
+ <element name="hoTypeDrncBand1" minOccurs="0"/>
+ <element name="hoTypeDrncBand2" minOccurs="0"/>
+ <element name="hoTypeDrncBand3" minOccurs="0"/>
+ <element name="hoTypeDrncBand4" minOccurs="0"/>
+ <element name="hoTypeDrncBand5" minOccurs="0"/>
+ <element name="hoTypeDrncBand6" minOccurs="0"/>
+ <element name="hoTypeDrncBand7" minOccurs="0"/>
+ <element name="hoTypeDrncBand8" minOccurs="0"/>
+ <element name="hoTypeDrncBand9" minOccurs="0"/>
+ <element name="hoTypeDrncBand10" minOccurs="0"/>
+ <element name="hoTypeDrncBand11" minOccurs="0"/>
+ <element name="hoTypeDrncBand12" minOccurs="0"/>
+ <element name="releaseConnOffset" minOccurs="0"/>
+ <element name="hoTypeDrncBand13" minOccurs="0"/>
+ <element name="hoTypeDrncBand14" minOccurs="0"/>
+ <element name="hoTypeDrncBand15" minOccurs="0"/>
+ <element name="hoTypeDrncBand16" minOccurs="0"/>
+ <element name="hoTypeDrncBand17" minOccurs="0"/>
+ <element name="maxGsmMonSubset" minOccurs="0"/>
+ <element name="maxIefMonSubset" minOccurs="0"/>
+ <element name="cnhhoSupp" minOccurs="0"/>
+ <element name="interFreqCnhhoPenaltyEcno" minOccurs="0"/>
+ <element name="interFreqCnhhoPenaltyRscp" minOccurs="0"/>
+ <element name="intraFreqCnhhoPenalty" minOccurs="0"/>
+ <element name="intraFreqCnhhoWeight" minOccurs="0"/>
+ <element name="serviceBasedHoSupport" minOccurs="0"/>
+ <element name="tmStopGsmMeas" minOccurs="0"/>
+ <element name="eulReservedHwBandwidthSchedDataNonServCell" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataIubLink" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="rbsId" minOccurs="0"/>
+ <element name="beMarginDlHw" minOccurs="0"/>
+ <element name="dlHwAdm" minOccurs="0"/>
+ <element name="ulHwAdm" minOccurs="0"/>
+ <element name="beMarginUlHw" minOccurs="0"/>
+ <element name="rncModuleRef" minOccurs="0"/>
+ <element name="preferredSubrackRef" minOccurs="0"/>
+ <element name="edchIubDynDelayLimit" minOccurs="0"/>
+ <element name="userPlaneTransportOption" minOccurs="0">
+ <complexType>
+ <sequence>
+ <element name="atm" minOccurs="0"/>
+ <element name="ipv4" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataIurLink" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="mcc" minOccurs="0"/>
+ <element name="mnc" minOccurs="0"/>
+ <element name="mncLength" minOccurs="0"/>
+ <element name="rncId" minOccurs="0"/>
+ <element name="aliasPlmnIdentities" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="mcc" minOccurs="0"/>
+ <element name="mnc" minOccurs="0"/>
+ <element name="mncLength" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="utranNetworkRef" minOccurs="0"/>
+ <element name="cellCapabilityControl" minOccurs="0">
+ <complexType>
+ <sequence>
+ <element name="hsdschSupport" minOccurs="0"/>
+ <element name="edchSupport" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="hspaPathlossThreshold" minOccurs="0"/>
+ <element name="userPlaneTransportOption" minOccurs="0">
+ <complexType>
+ <sequence>
+ <element name="atm" minOccurs="0"/>
+ <element name="ipv4" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataLocationArea" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="lac" minOccurs="0"/>
+ <element name="t3212" minOccurs="0"/>
+ <element name="att" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataMeContext" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="ipAddress" minOccurs="0"/>
+ <element name="neMIMversion" minOccurs="0"/>
+ <element name="rbsIubId" minOccurs="0"/>
+ <element name="bcrLastChange" minOccurs="0"/>
+ <element name="bctLastChange" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataNodeBFunction" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="toaeDch" minOccurs="0"/>
+ <element name="toaeCch" minOccurs="0"/>
+ <element name="fwdGuardPeriod" minOccurs="0"/>
+ <element name="bwdGuardPeriod" minOccurs="0"/>
+ <element name="tpcFilterLength" minOccurs="0"/>
+ <element name="branchDiffAbsTime" minOccurs="0"/>
+ <element name="branchDiffMeasTime" minOccurs="0"/>
+ <element name="countersAlarmThreshold" minOccurs="0"/>
+ <element name="maxNumberOfCounters" minOccurs="0"/>
+ <element name="steeredHsAllocation" minOccurs="0"/>
+ <element name="eulNoReschUsers" minOccurs="0"/>
+ <element name="eulTargetRate" minOccurs="0"/>
+ <element name="eulMaxShoRate" minOccurs="0"/>
+ <element name="supportOf16qam" minOccurs="0"/>
+ <element name="flexibleSchedulerOn" minOccurs="0"/>
+ <element name="eulReservedHwBandwidthSchedDataNonServCell" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataPaging" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="cnDrxCycleLengthCs" minOccurs="0"/>
+ <element name="cnDrxCycleLengthPs" minOccurs="0"/>
+ <element name="noOfPagingRecordTransm" minOccurs="0"/>
+ <element name="utranDrxCycleLength" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataPch" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="pchPower" minOccurs="0"/>
+ <element name="pichPower" minOccurs="0"/>
+ <element name="sccpchOffset" minOccurs="0"/>
+ <element name="administrativeState" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataPowerControl" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="cBackOff" minOccurs="0"/>
+ <element name="ulOuterLoopRegulator" minOccurs="0"/>
+ <element name="ulSirStep" minOccurs="0"/>
+ <element name="sirMin" minOccurs="0"/>
+ <element name="sirMax" minOccurs="0"/>
+ <element name="dlPcMethod" minOccurs="0"/>
+ <element name="cPO" minOccurs="0"/>
+ <element name="pO1" minOccurs="0"/>
+ <element name="pO2" minOccurs="0"/>
+ <element name="pO3" minOccurs="0"/>
+ <element name="ecNoPcpichDefault" minOccurs="0"/>
+ <element name="pcpichPowerDefault" minOccurs="0"/>
+ <element name="fixedPowerDl" minOccurs="0"/>
+ <element name="cNbifho" minOccurs="0"/>
+ <element name="fixedRefPower" minOccurs="0"/>
+ <element name="initShoPowerParam" minOccurs="0"/>
+ <element name="dlInitSirTarget" minOccurs="0"/>
+ <element name="ulInitSirTargetExtraHigh" minOccurs="0"/>
+ <element name="ulInitSirTargetHigh" minOccurs="0"/>
+ <element name="ulInitSirTargetLow" minOccurs="0"/>
+ <element name="ulInitSirTargetSrb" minOccurs="0"/>
+ <element name="transmissionTargetError" minOccurs="0"/>
+ <element name="ulInitSirTargetEdch" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataRach" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="scramblingCodeWordNo" minOccurs="0"/>
+ <element name="preambleSignatures" minOccurs="0"/>
+ <element name="subChannelNo" minOccurs="0"/>
+ <element name="aichTransmissionTiming" minOccurs="0"/>
+ <element name="aichPower" minOccurs="0"/>
+ <element name="powerOffsetP0" minOccurs="0"/>
+ <element name="powerOffsetPpm" minOccurs="0"/>
+ <element name="preambleRetransMax" minOccurs="0"/>
+ <element name="maxPreambleCycle" minOccurs="0"/>
+ <element name="constantValueCprach" minOccurs="0"/>
+ <element name="spreadingFactor" minOccurs="0"/>
+ <element name="administrativeState" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataRbsLocalCell" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="localCellId" minOccurs="0"/>
+ <element name="cellRange" minOccurs="0"/>
+ <element name="carrierRef" minOccurs="0"/>
+ <element name="dynamicHsPdschCodeAdditionOn" minOccurs="0"/>
+ <element name="hsCodeResourceId" minOccurs="0"/>
+ <element name="maxNumHsPdschCodes" minOccurs="0"/>
+ <element name="eulMaxRotCoverage" minOccurs="0"/>
+ <element name="eulMaxOwnUuLoad" minOccurs="0"/>
+ <element name="maxUserEHichERgchPowerDl" minOccurs="0"/>
+ <element name="eulMaxNoSchEDch" minOccurs="0"/>
+ <element name="eulMinMarginCoverage" minOccurs="0"/>
+ <element name="eulOptimalNoiseFloorLock" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="eulNoiseFloorLock" minOccurs="0"/>
+ <element name="eulOptimalNoiseFloorEstimate" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="eulSlidingWindowTime" minOccurs="0"/>
+ <element name="eulThermalLevelPrior" minOccurs="0"/>
+ <element name="eulNoERgchGroups" minOccurs="0"/>
+ <element name="maxEAgchPowerDl" minOccurs="0"/>
+ <element name="maxNumHsdpaUsers" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataRcs" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="dchRcLostT" minOccurs="0"/>
+ <element name="cchWaitCuT" minOccurs="0"/>
+ <element name="hsDschRcLostT" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataRetDevice" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="electricalAntennaTilt" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataRetDeviceSet" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="retType" minOccurs="0"/>
+ <element name="productNumber" minOccurs="0"/>
+ <element name="revState" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <!--element name="vsDataRetProfile" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element-->
+ <element name="vsDataRetuDeviceGroup" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData"/>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataRoutingArea" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="rac" minOccurs="0"/>
+ <element name="nmo" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataRrc" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="t305" minOccurs="0"/>
+ <element name="packetEstMode" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataSector" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="numberOfCarriers" minOccurs="0"/>
+ <element name="numberOfTxBranches" minOccurs="0"/>
+ <element name="outputPower" minOccurs="0"/>
+ <element name="latitude" minOccurs="0"/>
+ <element name="latHemisphere" minOccurs="0"/>
+ <element name="longitude" minOccurs="0"/>
+ <element name="longHemisphere" minOccurs="0"/>
+ <element name="geoDatum" minOccurs="0"/>
+ <element name="beamDirection" minOccurs="0"/>
+ <element name="height" minOccurs="0"/>
+ <element name="sectorAntennaRef" minOccurs="0"/>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="retDeviceRef" minOccurs="0"/>
+ <element name="maxInternalUlGainOn" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataSectorAntenna" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="antennaType" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataCarrier" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="cqiAdjustmentOn" minOccurs="0"/>
+ <element name="cqiErrors" minOccurs="0"/>
+ <element name="cqiErrorsAbsent" minOccurs="0"/>
+ <element name="hsPowerMargin" minOccurs="0"/>
+ <element name="hsScchMaxCodePower" minOccurs="0"/>
+ <element name="queueSelectAlgorithm" minOccurs="0"/>
+ <element name="frequencyPlane" minOccurs="0"/>
+ <element name="hsScchMinCodePower" minOccurs="0"/>
+ <element name="qualityCheckPower" minOccurs="0"/>
+ <element name="supportOf16qam" minOccurs="0"/>
+ <element name="airRateTypeSelector" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataServiceArea" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="sac" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataSid" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="updateCellReattsNo" minOccurs="0"/>
+ <element name="noOfMaxDrxCycles" minOccurs="0"/>
+ <element name="noOfMibValueTagRetrans" minOccurs="0"/>
+ <element name="sib1" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="sib1RepPeriod" minOccurs="0"/>
+ <element name="sib1StartPos" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="sib11" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="sib11RepPeriod" minOccurs="0"/>
+ <element name="sib11StartPos" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="sib12" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="sib12RepPeriod" minOccurs="0"/>
+ <element name="sib12StartPos" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="sib3" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="sib3RepPeriod" minOccurs="0"/>
+ <element name="sib3StartPos" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="sib5" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="sib5RepPeriod" minOccurs="0"/>
+ <element name="sib5StartPos" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="sib7" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="sib7RepPeriod" minOccurs="0"/>
+ <element name="sib7StartPos" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="sib7ExpirationTimeFactor" minOccurs="0"/>
+ <element name="sib2" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="sib2RepPeriod" minOccurs="0"/>
+ <element name="sib2StartPos" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataUeMeasControl" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="reportingRange1a" minOccurs="0"/>
+ <element name="reportingRange1b" minOccurs="0"/>
+ <element name="hysteresis1c" minOccurs="0"/>
+ <element name="hysteresis1d" minOccurs="0"/>
+ <element name="hysteresis2d" minOccurs="0"/>
+ <element name="hysteresis2f" minOccurs="0"/>
+ <element name="gsmThresh3a" minOccurs="0"/>
+ <element name="hysteresis3a" minOccurs="0"/>
+ <element name="measQuantity1" minOccurs="0"/>
+ <element name="ueTxPowerThresh6a" minOccurs="0"/>
+ <element name="ueTxPowerThresh6b" minOccurs="0"/>
+ <element name="usedFreqThresh2dEcnoDrnc" minOccurs="0"/>
+ <element name="usedFreqThresh2dRscpDrnc" minOccurs="0"/>
+ <element name="usedFreqRelThresh2fEcno" minOccurs="0"/>
+ <element name="usedFreqRelThresh2fRscp" minOccurs="0"/>
+ <element name="hyst4_2b" minOccurs="0"/>
+ <element name="nonUsedFreqThresh4_2bEcno" minOccurs="0"/>
+ <element name="nonUsedFreqThresh4_2bRscp" minOccurs="0"/>
+ <element name="timeToTrigger1a" minOccurs="0"/>
+ <element name="hysteresis1a" minOccurs="0"/>
+ <element name="timeToTrigger1b" minOccurs="0"/>
+ <element name="hysteresis1b" minOccurs="0"/>
+ <element name="timeToTrigger1c" minOccurs="0"/>
+ <element name="timeToTrigger1d" minOccurs="0"/>
+ <element name="timeToTrigger3a" minOccurs="0"/>
+ <element name="reportingInterval1a" minOccurs="0"/>
+ <element name="reportingInterval1c" minOccurs="0"/>
+ <element name="timeTrigg6a" minOccurs="0"/>
+ <element name="timeTrigg6b" minOccurs="0"/>
+ <element name="timeTrigg4_2b" minOccurs="0"/>
+ <element name="hsHysteresis1d" minOccurs="0"/>
+ <element name="hsQualityEstimate" minOccurs="0"/>
+ <element name="hsTimeToTrigger1d" minOccurs="0"/>
+ <element name="filterCoefficient1" minOccurs="0"/>
+ <element name="filterCoefficient2" minOccurs="0"/>
+ <element name="utranFilterCoefficient3" minOccurs="0"/>
+ <element name="gsmFilterCoefficient3" minOccurs="0"/>
+ <element name="filterCoeff6" minOccurs="0"/>
+ <element name="filterCoeff4_2b" minOccurs="0"/>
+ <element name="w1a" minOccurs="0"/>
+ <element name="w1b" minOccurs="0"/>
+ <element name="usedFreqW2d" minOccurs="0"/>
+ <element name="usedFreqW2f" minOccurs="0"/>
+ <element name="usedFreqW4_2b" minOccurs="0"/>
+ <element name="utranW3a" minOccurs="0"/>
+ <element name="nonUsedFreqW4_2b" minOccurs="0"/>
+ <element name="timeToTrigger2dEcno" minOccurs="0"/>
+ <element name="timeToTrigger2fEcno" minOccurs="0"/>
+ <element name="utranRelThresh3aEcno" minOccurs="0"/>
+ <element name="utranRelThresh3aRscp" minOccurs="0"/>
+ <element name="usedFreqRelThresh4_2bEcno" minOccurs="0"/>
+ <element name="usedFreqRelThresh4_2bRscp" minOccurs="0"/>
+ <element name="timeToTrigger2dRscp" minOccurs="0"/>
+ <element name="timeToTrigger2fRscp" minOccurs="0"/>
+ <element name="utranRelThreshRscp" minOccurs="0"/>
+ <element name="event1dRncThreshold" minOccurs="0"/>
+ <element name="event1dRncOffset" minOccurs="0"/>
+ <element name="timeToTrigger6d" minOccurs="0"/>
+ <element name="txPowerConnQualMonEnabled" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataUeRc" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="serviceOffset2dEcno" minOccurs="0"/>
+ <element name="serviceOffset2dRscp" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataUeRcTrCh" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="blerQualityTargetDl" minOccurs="0"/>
+ <element name="blerQualityTargetUl" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataUtranCell" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="tCell" minOccurs="0"/>
+ <element name="cellReserved" minOccurs="0"/>
+ <element name="treSelection" minOccurs="0"/>
+ <element name="qualMeasQuantity" minOccurs="0"/>
+ <element name="qHyst1" minOccurs="0"/>
+ <element name="qHyst2" minOccurs="0"/>
+ <element name="qQualMin" minOccurs="0"/>
+ <element name="qRxLevMin" minOccurs="0"/>
+ <element name="individualOffset" minOccurs="0"/>
+ <element name="pwrAdm" minOccurs="0"/>
+ <element name="pwrAdmOffset" minOccurs="0"/>
+ <element name="pwrOffset" minOccurs="0"/>
+ <element name="pwrHyst" minOccurs="0"/>
+ <element name="tmCongAction" minOccurs="0"/>
+ <element name="releaseAseDl" minOccurs="0"/>
+ <element name="aseDlAdm" minOccurs="0"/>
+ <element name="dlCodeAdm" minOccurs="0"/>
+ <element name="aseUlAdm" minOccurs="0"/>
+ <element name="sf8Adm" minOccurs="0"/>
+ <element name="sf32Adm" minOccurs="0"/>
+ <element name="aseUlAdmOffset" minOccurs="0"/>
+ <element name="minPwrRl" minOccurs="0"/>
+ <element name="maxRate" minOccurs="0"/>
+ <element name="interRate" minOccurs="0"/>
+ <element name="minimumRate" minOccurs="0"/>
+ <element name="maxPwrMax" minOccurs="0"/>
+ <element name="interPwrMax" minOccurs="0"/>
+ <element name="minPwrMax" minOccurs="0"/>
+ <element name="compModeAdm" minOccurs="0"/>
+ <element name="iFOffset" minOccurs="0"/>
+ <element name="iFHyst" minOccurs="0"/>
+ <element name="iFCong" minOccurs="0"/>
+ <element name="interFreqFddMeasIndicator" minOccurs="0"/>
+ <element name="sRatSearch" minOccurs="0"/>
+ <element name="sIntraSearch" minOccurs="0"/>
+ <element name="sInterSearch" minOccurs="0"/>
+ <element name="fachMeasOccaCycLenCoeff" minOccurs="0"/>
+ <element name="accessClassNBarred" minOccurs="0" maxOccurs="unbounded"/>
+ <element name="utranCellPosition" minOccurs="0" maxOccurs="unbounded"/>
+ <element name="maxTxPowerUl" minOccurs="0"/>
+ <element name="beMarginAseUl" minOccurs="0"/>
+ <element name="beMarginAseDl" minOccurs="0"/>
+ <element name="reservedBy" minOccurs="0" maxOccurs="unbounded"/>
+ <element name="sib1PlmnScopeValueTag" minOccurs="0"/>
+ <element name="sf16Adm" minOccurs="0"/>
+ <element name="beMarginDlPwr" minOccurs="0"/>
+ <element name="beMarginDlCode" minOccurs="0"/>
+ <element name="hoType" minOccurs="0"/>
+ <element name="usedFreqThresh2dEcno" minOccurs="0"/>
+ <element name="usedFreqThresh2dRscp" minOccurs="0"/>
+ <element name="administrativeState" minOccurs="0"/>
+ <element name="loadSharingGsmThreshold" minOccurs="0"/>
+ <element name="loadSharingGsmFraction" minOccurs="0"/>
+ <element name="snDirectedRetryTarget" minOccurs="0"/>
+ <element name="nInSyncInd" minOccurs="0"/>
+ <element name="rlFailureT" minOccurs="0"/>
+ <element name="nOutSyncInd" minOccurs="0"/>
+ <element name="sf4AdmUl" minOccurs="0"/>
+ <element name="hardIfhoCorr" minOccurs="0"/>
+ <element name="hsdpaUsersAdm" minOccurs="0"/>
+ <element name="loadSharingMargin" minOccurs="0"/>
+ <element name="releaseAseDlGhs" minOccurs="0"/>
+ <element name="tmCongActionGhs" minOccurs="0"/>
+ <element name="tmInitialGhs" minOccurs="0"/>
+ <element name="sf4UlPathlossThreshold" minOccurs="0"/>
+ <element name="ulPathlossCheckEnabled" minOccurs="0"/>
+ <element name="sHcsRat" minOccurs="0"/>
+ <element name="sf16gAdm" minOccurs="0"/>
+ <element name="releaseAseDlNg" minOccurs="0"/>
+ <element name="tmCongActionNg" minOccurs="0"/>
+ <element name="tmInitialG" minOccurs="0"/>
+ <element name="sf16AdmUl" minOccurs="0"/>
+ <element name="sf8AdmUl" minOccurs="0"/>
+ <element name="sf8gAdmUl" minOccurs="0"/>
+ <element name="iubLinkRef" minOccurs="0"/>
+ <element name="eulNonServingCellUsersAdm" minOccurs="0"/>
+ <element name="eulServingCellUsersAdm" minOccurs="0"/>
+ <element name="agpsEnabled" minOccurs="0"/>
+ <element name="codeLoadThresholdDlSf128" minOccurs="0"/>
+ <element name="pwrLoadThresholdDlSpeech" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="amr12200" minOccurs="0"/>
+ <element name="amr7950" minOccurs="0"/>
+ <element name="amr5900" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="aseLoadThresholdUlSpeech" minOccurs="0">
+ <complexType>
+ <sequence>
+ <element name="amr12200" minOccurs="0"/>
+ <element name="amr7950" minOccurs="0"/>
+ <element name="amr5900" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="accessClassesBarredCs" minOccurs="0" maxOccurs="unbounded"/>
+ <element name="accessClassesBarredPs" minOccurs="0" maxOccurs="unbounded"/>
+ <element name="rateSelectionPsInteractive" minOccurs="0">
+ <complexType>
+ <sequence>
+ <element name="channelType" minOccurs="0"/>
+ <element name="ulPrefRate" minOccurs="0"/>
+ <element name="dlPrefRate" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="hcsUsage" minOccurs="0">
+ <complexType>
+ <sequence>
+ <element name="idleMode" minOccurs="0"/>
+ <element name="connectedMode" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="hcsSib3Config" minOccurs="0">
+ <complexType>
+ <sequence>
+ <element name="sSearchHcs" minOccurs="0"/>
+ <element name="hcsPrio" minOccurs="0"/>
+ <element name="qHcs" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataUtranRelation" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="qOffset1sn" minOccurs="0"/>
+ <element name="qOffset2sn" minOccurs="0"/>
+ <element name="loadSharingCandidate" minOccurs="0"/>
+ <element name="selectionPriority" minOccurs="0"/>
+ <element name="frequencyRelationType" minOccurs="0"/>
+ <element name="hcsSib11Config" minOccurs="0">
+ <complexType>
+ <sequence>
+ <element name="hcsPrio" minOccurs="0"/>
+ <element name="qHcs" minOccurs="0"/>
+ <element name="penaltyTime" minOccurs="0"/>
+ <element name="temporaryOffset1" minOccurs="0"/>
+ <element name="temporaryOffset2" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataRncFunction" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="mncLength" minOccurs="0"/>
+ <element name="emergencyCallRedirect" minOccurs="0"/>
+ <element name="loadSharingDirRetryEnabled" minOccurs="0"/>
+ <element name="hsCellChangeAllowed" minOccurs="0"/>
+ <element name="hsOnlyBestCell" minOccurs="0"/>
+ <element name="aliasPlmnIdentities" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="mcc" minOccurs="0"/>
+ <element name="mnc" minOccurs="0"/>
+ <element name="mncLength" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="counterAlarmCeaseLimit" minOccurs="0"/>
+ <element name="counterAlarmThreshold" minOccurs="0"/>
+ <element name="counterWarningAlarmCeaseLimit" minOccurs="0"/>
+ <element name="ctrFileSize" minOccurs="0"/>
+ <element name="gpehDataLevel" minOccurs="0"/>
+ <element name="gpehFileSize" minOccurs="0"/>
+ <element name="loadSharingRrcEnabled" minOccurs="0"/>
+ <element name="uetrFileSize" minOccurs="0"/>
+ <element name="networkResourceIdentifierLengthCs" minOccurs="0"/>
+ <element name="networkResourceIdentifierLengthPs" minOccurs="0"/>
+ <element name="hsToDchTrigger" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="servHsChangeInterRnc" minOccurs="0"/>
+ <element name="servHsChangeIntraRnc" minOccurs="0"/>
+ <element name="changeOfBestCellIntraRnc" minOccurs="0"/>
+ <element name="poorQualityDetected" minOccurs="0"/>
+ <element name="changeOfBestCellInterRnc" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="harqTransmUlTti10Max" minOccurs="0" maxOccurs="unbounded"/>
+ <element name="ecLocationAttemptUmts" minOccurs="0"/>
+ <element name="ecCnSbhoRequestIgnore" minOccurs="0"/>
+ <element name="ecCnPriorityLevel" minOccurs="0"/>
+ <element name="ecSbhoTimer" minOccurs="0"/>
+ <element name="primaryCnOperatorRef" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataUeRcEdchFlow" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="harqTransmUlMax" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataSecurityHandling" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="ciphering" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataRabHandling" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="psStreamingInactivityTimer" minOccurs="0"/>
+ <element name="activeQueueMgmt" minOccurs="0"/>
+ <element name="dscpValuePsStreaming" minOccurs="0"/>
+ <element name="psStreaming128" minOccurs="0"/>
+ <element name="state128_128Supported" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataSubrack" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData"/>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataSlot" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData"/>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataPlugInUnit" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="administrativeState" minOccurs="0"/>
+ <element name="allowedSeqRestarts" minOccurs="0"/>
+ <element name="piuGroupNumber" minOccurs="0"/>
+ <element name="piuType" minOccurs="0"/>
+ <element name="productType" minOccurs="0"/>
+ <element name="userLabel" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <!--element name="vsDataGigaBitEthernet" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element-->
+ <element name="vsDataUePositioning" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="enabledPositioningFeatures" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataGpsReceiver" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="administrativeState" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataAgpsPositioning" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="altitudeDirection" minOccurs="0"/>
+ <element name="altitude" minOccurs="0"/>
+ <element name="uncertaintyAltitude" minOccurs="0"/>
+ <element name="confidence" minOccurs="0"/>
+ <element name="polygonRadiusFactor" minOccurs="0"/>
+ <element name="utranRnsPosition" minOccurs="0">
+ <complexType>
+ <sequence>
+ <element name="latitudeSign" minOccurs="0"/>
+ <element name="latitude" minOccurs="0"/>
+ <element name="longitude" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="utranRnsUncertaintyRadius" minOccurs="0"/>
+ <element name="utranRnsConfidence" minOccurs="0"/>
+ <element name="elevationThreshold" minOccurs="0"/>
+ <element name="ueMeasurementReportCriteria" minOccurs="0">
+ <complexType>
+ <sequence>
+ <element name="reportingAmount" minOccurs="0"/>
+ <element name="reportingInterval" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataIubDataStreams" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="maxHsRate" minOccurs="0"/>
+ <element name="maxEDchRate" minOccurs="0"/>
+ <element name="hsDataFrameDelayThreshold" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataTxDeviceGroup" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="loadHs" minOccurs="0"/>
+ <element name="numHsCodeResources" minOccurs="0"/>
+ <element name="numEulResources" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataHsdsch" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="administrativeState" minOccurs="0"/>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="numHsPdschCodes" minOccurs="0"/>
+ <element name="deltaAck1" minOccurs="0"/>
+ <element name="deltaNack1" minOccurs="0"/>
+ <element name="deltaAck2" minOccurs="0"/>
+ <element name="deltaNack2" minOccurs="0"/>
+ <element name="deltaCqi1" minOccurs="0"/>
+ <element name="deltaCqi2" minOccurs="0"/>
+ <element name="initialCqiRepetitionFactor" minOccurs="0"/>
+ <element name="initialAckNackRepetitionFactor" minOccurs="0"/>
+ <element name="cqiFeedbackCycle" minOccurs="0"/>
+ <element name="hsMeasurementPowerOffset" minOccurs="0"/>
+ <element name="codeThresholdPdu656" minOccurs="0"/>
+ <element name="numHsScchCodes" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataCoverageRelation" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="utranCellRef" minOccurs="0"/>
+ <element name="coverageIndicator" minOccurs="0"/>
+ <element name="hsPathlossThreshold" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataUeRcRab" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="fcState" minOccurs="0"/>
+ <element name="trBearerQosClass" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataUeRcRrc" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="trBearerQosClass" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataUeRabType" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="trBearerQosClass" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataUra" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="uraIdentity" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataLicensing" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData"/>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataRncFeature" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="featureState" minOccurs="0"/>
+ <element name="licenseState" minOccurs="0"/>
+ <element name="serviceState" minOccurs="0"/>
+ <element name="keyId" minOccurs="0"/>
+ <element name="isLicenseControlled" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataEul" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="administrativeState" minOccurs="0"/>
+ <element name="numEagchCodes" minOccurs="0"/>
+ <element name="numEhichErgchCodes" minOccurs="0"/>
+ <element name="eulMaxTargetRtwp" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataSystemFunctions" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData"/>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataIubEdch" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="edchDataFrameDelayThreshold" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataWcdmaCarrier" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="defaultHoType" minOccurs="0"/>
+ <element name="freqBand" minOccurs="0"/>
+ <element name="sib5bisEnabled" minOccurs="0"/>
+ <element name="uarfcnDl" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataUtranNetwork" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="aliasPlmnIdentities" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="mcc" minOccurs="0"/>
+ <element name="mnc" minOccurs="0"/>
+ <element name="mncLength" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="plmnIdentity" minOccurs="0">
+ <complexType>
+ <sequence>
+ <element name="mcc" minOccurs="0"/>
+ <element name="mnc" minOccurs="0"/>
+ <element name="mncLength" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataCnOperator" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="plmnIdentity" minOccurs="0">
+ <complexType>
+ <sequence>
+ <element name="mcc" minOccurs="0"/>
+ <element name="mnc" minOccurs="0"/>
+ <element name="mncLength" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ <element name="iphoNetworkRefsUtran" minOccurs="0"/>
+ <element name="iphoNetworkRefsGsm" minOccurs="0"/>
+ <element name="equivalentPlmnIdentities" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="mcc" minOccurs="0"/>
+ <element name="mnc" minOccurs="0"/>
+ <element name="mncLength" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataRbsSynchronization" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="plugInUnitRef1" minOccurs="0"/>
+ <element name="plugInUnitRef2" minOccurs="0"/>
+ <element name="timDeviceRef1" minOccurs="0"/>
+ <element name="timDeviceRef2" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataUeRcPhyChEdch" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="eulHarqRv" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="vsDataPmService" substitutionGroup="xn:vsData">
+ <complexType>
+ <complexContent>
+ <extension base="xn:vsData">
+ <sequence>
+ <element name="minorAlarmCeasingDelta" minOccurs="0"/>
+ <element name="warningAlarmLimitPercent" minOccurs="0"/>
+ <element name="warningAlarmCeasingDelta" minOccurs="0"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+</schema>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/EricssonSpecificAttributes.5.1Tran.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/EricssonSpecificAttributes.5.1Tran.xsd
new file mode 100644
index 0000000000..33e00bab48
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/EricssonSpecificAttributes.5.1Tran.xsd
@@ -0,0 +1,2164 @@
+<!--
+ Configuration data file vendor-specific XML schema
+ EricssonSpecificAttributes.5.1Tran.xsd Implementation of BCT I/face.Requires BCR/Bulk CM General installed
+ For use with ONLY with EricssonSpecificAttributes.5.1.xsd
+ NB!! See EricssonSpecificAttributes.5.1.xsd
+ Use Namespace for EricssonSpecificAttributes.5.1.xsd in all files which conform to this schema
+-->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xn="genericNrm.xsd" elementFormDefault="qualified" attributeFormDefault="unqualified">
+ <!-- EricssonSpecificAttributes version 5.1 vendor-specific data -->
+ <xs:import namespace="genericNrm.xsd" schemaLocation="genericNrm.xsd"/>
+ <xs:element name="vsDataAal0TpVccTp" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="alarmReport" minOccurs="0"/>
+ <xs:element name="continuityCheck" minOccurs="0"/>
+ <xs:element name="nomPmBlkSize" minOccurs="0"/>
+ <xs:element name="processorId" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="vclTpId" minOccurs="0"/>
+ <xs:element name="counterMode" minOccurs="0"/>
+ <xs:element name="counterActivation" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataAal1TpVccTp" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="nomPmBlockSize" minOccurs="0"/>
+ <xs:element name="ds0BundleId" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="vclTpId" minOccurs="0"/>
+ <xs:element name="counterMode" minOccurs="0"/>
+ <xs:element name="partialFill" minOccurs="0"/>
+ <xs:element name="alarmReport" minOccurs="0"/>
+ <xs:element name="cdvt" minOccurs="0"/>
+ <xs:element name="continuityCheck" minOccurs="0"/>
+ <xs:element name="counterActivation" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataAal2Ap" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="aal2QoSCodePointProfileId" minOccurs="0"/>
+ <xs:element name="rpuId" minOccurs="0"/>
+ <xs:element name="secondarySigLinkId" minOccurs="0"/>
+ <xs:element name="sigLinkId" minOccurs="0"/>
+ <xs:element name="timerErq" minOccurs="0"/>
+ <xs:element name="timerRel" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="allocationMode" minOccurs="0"/>
+ <xs:element name="reallocate" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataAtmConfService" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="reallocateAllAal2Aps" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataAal2PathDistributionUnit" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="rpuId" minOccurs="0"/>
+ <xs:element name="aal2PathVccTpList" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="addPath" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="aal2PathVccTpId" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="removePath" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="aal2PathList" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataAal2PathVccTp" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="aal2PathOwner" minOccurs="0"/>
+ <xs:element name="alarmReport" minOccurs="0"/>
+ <xs:element name="nomPmBlocksize" minOccurs="0"/>
+ <xs:element name="timerCu" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="administrativeState" minOccurs="0"/>
+ <xs:element name="continuityCheck" minOccurs="0"/>
+ <xs:element name="aal2PathId" minOccurs="0"/>
+ <xs:element name="vclTpId" minOccurs="0"/>
+ <xs:element name="aal2QoSAvailableProfiles" minOccurs="0"/>
+ <xs:element name="aal2QoSProfileId" minOccurs="0"/>
+ <xs:element name="counterMode" minOccurs="0"/>
+ <xs:element name="counterActivation" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataAal2RoutingCase" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="numberDirection" minOccurs="0"/>
+ <xs:element name="routeList" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="routePriorityList" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="addAal2ApToRc" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="priority" minOccurs="0"/>
+ <xs:element name="route" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="removeAal2ApFromRc" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="route" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataAal2Sp" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="a2ea" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataAal5TpVccTp" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="alarmReport" minOccurs="0"/>
+ <xs:element name="continuityCheck" minOccurs="0"/>
+ <xs:element name="fromUserMaxSduSize" minOccurs="0"/>
+ <xs:element name="nomPmBlkSize" minOccurs="0"/>
+ <xs:element name="processorId" minOccurs="0"/>
+ <xs:element name="toUserMaxSduSize" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="vclTpId" minOccurs="0"/>
+ <xs:element name="counterMode" minOccurs="0"/>
+ <xs:element name="counterActivation" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataAtmCrossConnection" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="vclTpAId" minOccurs="0"/>
+ <xs:element name="vclTpBId" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataAtmTrafficDescriptor" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="egressAtmMcr" minOccurs="0"/>
+ <xs:element name="egressAtmPcr" minOccurs="0"/>
+ <xs:element name="egressAtmQos" minOccurs="0"/>
+ <xs:element name="ingressAtmMcr" minOccurs="0"/>
+ <xs:element name="ingressAtmPcr" minOccurs="0"/>
+ <xs:element name="ingressAtmQos" minOccurs="0"/>
+ <xs:element name="serviceCategory" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="packetDiscard" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataAtmPort" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="uses" minOccurs="0"/>
+ <xs:element name="hecCorrectionMode" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataTransportNetwork" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataUniSaalProfile" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="profileData" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="congestionAbatement" minOccurs="0"/>
+ <xs:element name="congestionOnSet" minOccurs="0"/>
+ <xs:element name="initialCredit" minOccurs="0"/>
+ <xs:element name="maxCC" minOccurs="0"/>
+ <xs:element name="maxPD" minOccurs="0"/>
+ <xs:element name="maxStat" minOccurs="0"/>
+ <xs:element name="timerCC" minOccurs="0"/>
+ <xs:element name="timerIdle" minOccurs="0"/>
+ <xs:element name="timerKeepAlive" minOccurs="0"/>
+ <xs:element name="timerNoResponse" minOccurs="0"/>
+ <xs:element name="timerPoll" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataUniSaalTp" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="aal5TpVccTpId" minOccurs="0"/>
+ <xs:element name="maxSduSize" minOccurs="0"/>
+ <xs:element name="uniSaalProfileId" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataVclTp" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="atmTrafficDescriptorId" minOccurs="0"/>
+ <xs:element name="externalVci" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataVpcTp" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="alarmReport" minOccurs="0"/>
+ <xs:element name="continuityCheck" minOccurs="0"/>
+ <xs:element name="nomPmBlkSize" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="counterMode" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataVplTp" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="atmTrafficDescriptor" minOccurs="0"/>
+ <xs:element name="externalVpi" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataIub" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="rbsId" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataNbapCommon" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="l2EstablishReqRetryT" minOccurs="0"/>
+ <xs:element name="activeUniSaalTpRef" minOccurs="0"/>
+ <xs:element name="standbyUniSaalTpRef" minOccurs="0"/>
+ <xs:element name="auditRetransmissionT" minOccurs="0"/>
+ <xs:element name="l2EstablishSupervisionT" minOccurs="0"/>
+ <xs:element name="l3EstablishSupervisionT" minOccurs="0"/>
+ <xs:element name="uniSaalTpRef1" minOccurs="0"/>
+ <xs:element name="uniSaalTpRef2" minOccurs="0"/>
+ <xs:element name="administrativeState" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataNbapDedicated" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="l2EstablishReqRetryT" minOccurs="0"/>
+ <xs:element name="activeUniSaalTpRef" minOccurs="0"/>
+ <xs:element name="standbyUniSaalTpRef" minOccurs="0"/>
+ <xs:element name="l2EstablishSupervisionT" minOccurs="0"/>
+ <xs:element name="uniSaalTpRef1" minOccurs="0"/>
+ <xs:element name="uniSaalTpRef2" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="administrativeState" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataNodeSynch" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="noOfSamples" minOccurs="0"/>
+ <xs:element name="supervisionIntervalT" minOccurs="0"/>
+ <xs:element name="phaseDiffThreshold" minOccurs="0"/>
+ <xs:element name="phaseMeasurement" minOccurs="0"/>
+ <xs:element name="accuracy" minOccurs="0"/>
+ <xs:element name="timeStamp" minOccurs="0"/>
+ <xs:element name="sampleIntervalInt" minOccurs="0"/>
+ <xs:element name="fixedWindowSizeInt" minOccurs="0"/>
+ <xs:element name="sampleIntervalSup" minOccurs="0"/>
+ <xs:element name="fixedWindowSizeSup" minOccurs="0"/>
+ <xs:element name="slidingWindowSize" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataNodeSynchTp" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="nodeSynchRef" minOccurs="0"/>
+ <xs:element name="aal0TpRef1" minOccurs="0"/>
+ <xs:element name="aal0TpRef2" minOccurs="0"/>
+ <xs:element name="aal0TpRef3" minOccurs="0"/>
+ <xs:element name="aal0TpRef4" minOccurs="0"/>
+ <xs:element name="timDeviceRef" minOccurs="0"/>
+ <xs:element name="aal0TpRefs" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="administrativeState" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataAal2QosCodePointProfile" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="qualityOfServiceCodePointA" minOccurs="0"/>
+ <xs:element name="qualityOfServiceCodePointB" minOccurs="0"/>
+ <xs:element name="qualityOfServiceCodePointC" minOccurs="0"/>
+ <xs:element name="qualityOfServiceCodePointD" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataAal2QosProfile" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="profileClassA" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="boundOnProbOfDelay" minOccurs="0"/>
+ <xs:element name="boundOnProbOfLoss" minOccurs="0"/>
+ <xs:element name="boundOnNodeDelay" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="profileClassB" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="boundOnProbOfDelay" minOccurs="0"/>
+ <xs:element name="boundOnProbOfLoss" minOccurs="0"/>
+ <xs:element name="boundOnNodeDelay" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="profileClassC" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="boundOnProbOfDelay" minOccurs="0"/>
+ <xs:element name="boundOnProbOfLoss" minOccurs="0"/>
+ <xs:element name="boundOnNodeDelay" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="profileClassD" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="boundOnProbOfDelay" minOccurs="0"/>
+ <xs:element name="boundOnProbOfLoss" minOccurs="0"/>
+ <xs:element name="boundOnNodeDelay" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataMtp3bAp" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="routeSetId" minOccurs="0"/>
+ <xs:element name="serviceInd" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataMtp3bSlItu" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="autoStartLink" minOccurs="0"/>
+ <xs:element name="linkCongestLevel" minOccurs="0"/>
+ <xs:element name="linkState" minOccurs="0"/>
+ <xs:element name="prioBeforeSio" minOccurs="0"/>
+ <xs:element name="signLinkCode" minOccurs="0"/>
+ <xs:element name="tpId" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="deactivate" minOccurs="0"/>
+ <xs:element name="activate" minOccurs="0"/>
+ <xs:element name="emergencyActivate" minOccurs="0"/>
+ <xs:element name="localInhibit" minOccurs="0"/>
+ <xs:element name="localUninhibit" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataMtp3bSls" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="cLinkAnsi" minOccurs="0"/>
+ <xs:element name="mtp3bSrsId" minOccurs="0"/>
+ <xs:element name="periodicLinkTestFlag" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="deactivateLinkSet" minOccurs="0"/>
+ <xs:element name="activateLinkSet" minOccurs="0"/>
+ <xs:element name="emergencyActivateLinkSet" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataMtp3bSlTtc" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="autoStartLink" minOccurs="0"/>
+ <xs:element name="linkCongestLevel" minOccurs="0"/>
+ <xs:element name="linkState" minOccurs="0"/>
+ <xs:element name="signLinkCode" minOccurs="0"/>
+ <xs:element name="tpId" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="prioBeforeSio" minOccurs="0"/>
+ <xs:element name="deactivate" minOccurs="0"/>
+ <xs:element name="activate" minOccurs="0"/>
+ <xs:element name="emergencyActivate" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataMtp3bSpItu" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="m3uaNoOfAttempsOfDauds" minOccurs="0"/>
+ <xs:element name="sendSltmBefLink" minOccurs="0"/>
+ <xs:element name="signallingPointCode" minOccurs="0"/>
+ <xs:element name="maxSizeChangeBuf" minOccurs="0"/>
+ <xs:element name="maxSizeReroutBuf" minOccurs="0"/>
+ <xs:element name="sioSpare" minOccurs="0"/>
+ <xs:element name="spPriority" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="prioCb" minOccurs="0"/>
+ <xs:element name="prioCo" minOccurs="0"/>
+ <xs:element name="prioEc" minOccurs="0"/>
+ <xs:element name="prioLink" minOccurs="0"/>
+ <xs:element name="prioRst" minOccurs="0"/>
+ <xs:element name="prioSlt" minOccurs="0"/>
+ <xs:element name="prioTfc" minOccurs="0"/>
+ <xs:element name="prioTra" minOccurs="0"/>
+ <xs:element name="prioUpu" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="networkInd" minOccurs="0"/>
+ <xs:element name="transFrHandler" minOccurs="0"/>
+ <xs:element name="nodeBehaviour" minOccurs="0"/>
+ <xs:element name="spTimer" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="timerT1" minOccurs="0"/>
+ <xs:element name="timerT2" minOccurs="0"/>
+ <xs:element name="timerT3" minOccurs="0"/>
+ <xs:element name="timerTBsnt" minOccurs="0"/>
+ <xs:element name="timerT4" minOccurs="0"/>
+ <xs:element name="timerT5" minOccurs="0"/>
+ <xs:element name="timerTRetrieval" minOccurs="0"/>
+ <xs:element name="timerT6" minOccurs="0"/>
+ <xs:element name="timerT8" minOccurs="0"/>
+ <xs:element name="timerT10" minOccurs="0"/>
+ <xs:element name="timerT12" minOccurs="0"/>
+ <xs:element name="timerT13" minOccurs="0"/>
+ <xs:element name="timerT14" minOccurs="0"/>
+ <xs:element name="timerTStart" minOccurs="0"/>
+ <xs:element name="timerT17" minOccurs="0"/>
+ <xs:element name="timerT18" minOccurs="0"/>
+ <xs:element name="timerT19" minOccurs="0"/>
+ <xs:element name="timerSltm" minOccurs="0"/>
+ <xs:element name="timerSlta" minOccurs="0"/>
+ <xs:element name="timerT20" minOccurs="0"/>
+ <xs:element name="timerT21" minOccurs="0"/>
+ <xs:element name="timerT22" minOccurs="0"/>
+ <xs:element name="timerT23" minOccurs="0"/>
+ <xs:element name="timerTc" minOccurs="0"/>
+ <xs:element name="timerM3uaTack" minOccurs="0"/>
+ <xs:element name="timerM3uaPeriodicAudit" minOccurs="0"/>
+ <xs:element name="timerM3uaT1" minOccurs="0"/>
+ <xs:element name="timerM3uaT3" minOccurs="0"/>
+ <xs:element name="timerM3uaT42" minOccurs="0"/>
+ <xs:element name="timerT15" minOccurs="0"/>
+ <xs:element name="timerM3uaT6" minOccurs="0"/>
+ <xs:element name="timerM3uaT41" minOccurs="0"/>
+ <xs:element name="timerM3uaTc" minOccurs="0"/>
+ <xs:element name="timerM3uaT8" minOccurs="0"/>
+ <xs:element name="timerM3uaT40" minOccurs="0"/>
+ <xs:element name="timerT16" minOccurs="0"/>
+ <xs:element name="timerTDlack" minOccurs="0"/>
+ <xs:element name="timerM3uaTassocack" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="noOfAttempsOfAssociationEstablishment" minOccurs="0"/>
+ <xs:element name="resendTfcInterval" minOccurs="0"/>
+ <xs:element name="statusIndInterval" minOccurs="0"/>
+ <xs:element name="testPatternSltm" minOccurs="0"/>
+ <xs:element name="version" minOccurs="0"/>
+ <xs:element name="noOfCongestLevelForNI" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="routeSetCongestTestFlag" minOccurs="0"/>
+ <xs:element name="rpuId" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataMtp3bSpTtc" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="maxSizeChangeBuf" minOccurs="0"/>
+ <xs:element name="maxSizeReroutBuf" minOccurs="0"/>
+ <xs:element name="signallingPointCode" minOccurs="0"/>
+ <xs:element name="spPriority" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="prioCo" minOccurs="0"/>
+ <xs:element name="prioCb" minOccurs="0"/>
+ <xs:element name="prioEc" minOccurs="0"/>
+ <xs:element name="prioRst" minOccurs="0"/>
+ <xs:element name="prioTfa" minOccurs="0"/>
+ <xs:element name="prioRt" minOccurs="0"/>
+ <xs:element name="prioTfc" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="networkInd" minOccurs="0"/>
+ <xs:element name="spTimer" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="timerT1" minOccurs="0"/>
+ <xs:element name="timerT2" minOccurs="0"/>
+ <xs:element name="timerT3" minOccurs="0"/>
+ <xs:element name="timerT4" minOccurs="0"/>
+ <xs:element name="timerT6" minOccurs="0"/>
+ <xs:element name="timerT8" minOccurs="0"/>
+ <xs:element name="timerT10" minOccurs="0"/>
+ <xs:element name="timerT17" minOccurs="0"/>
+ <xs:element name="timerSrt" minOccurs="0"/>
+ <xs:element name="timerTBsnt" minOccurs="0"/>
+ <xs:element name="timerTRetrieval" minOccurs="0"/>
+ <xs:element name="timerTStart" minOccurs="0"/>
+ <xs:element name="timerTc" minOccurs="0"/>
+ <xs:element name="timerT15" minOccurs="0"/>
+ <xs:element name="timerT16" minOccurs="0"/>
+ <xs:element name="timerTDlack" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="statusIndInterval" minOccurs="0"/>
+ <xs:element name="nodeBehaviour" minOccurs="0"/>
+ <xs:element name="noOfCongestLevelForNI" minOccurs="0"/>
+ <xs:element name="testPatternSltm" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="resendTfcInterval" minOccurs="0"/>
+ <xs:element name="routeSetCongestTestFlag" minOccurs="0"/>
+ <xs:element name="rpuId" minOccurs="0"/>
+ <xs:element name="m3uaNoOfAttempsOfDauds" minOccurs="0"/>
+ <xs:element name="noOfAttempsOfAssociationEstablishment" minOccurs="0"/>
+ <xs:element name="spTimerM3ua" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="timerM3uaPeriodicAudit" minOccurs="0"/>
+ <xs:element name="timerM3uaT1" minOccurs="0"/>
+ <xs:element name="timerM3uaT3" minOccurs="0"/>
+ <xs:element name="timerM3uaT40" minOccurs="0"/>
+ <xs:element name="timerM3uaT41" minOccurs="0"/>
+ <xs:element name="timerM3uaT42" minOccurs="0"/>
+ <xs:element name="timerM3uaT6" minOccurs="0"/>
+ <xs:element name="timerM3uaT8" minOccurs="0"/>
+ <xs:element name="timerM3uaTack" minOccurs="0"/>
+ <xs:element name="timerM3uaTassocack" minOccurs="0"/>
+ <xs:element name="timerM3uaTc" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataMtp3bSr" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="linkSetM3uId" minOccurs="0"/>
+ <xs:element name="priority" minOccurs="0"/>
+ <xs:element name="routeType" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="linkSetId" minOccurs="0"/>
+ <xs:element name="blockSignalingRoute" minOccurs="0"/>
+ <xs:element name="deBlockSignalingRoute" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataMtp3bSrs" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="autoReroute" minOccurs="0"/>
+ <xs:element name="destPointCode" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataNniSaalProfile" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="profileData" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="congestionLevel1Abatement" minOccurs="0"/>
+ <xs:element name="maxStat" minOccurs="0"/>
+ <xs:element name="timerPoll" minOccurs="0"/>
+ <xs:element name="timerRepeatSrec" minOccurs="0"/>
+ <xs:element name="mps" minOccurs="0"/>
+ <xs:element name="congestionLevel1OnSet" minOccurs="0"/>
+ <xs:element name="congestionLevel2OnSet" minOccurs="0"/>
+ <xs:element name="nrOfPDUsDuringProving" minOccurs="0"/>
+ <xs:element name="timerT1" minOccurs="0"/>
+ <xs:element name="timerT2" minOccurs="0"/>
+ <xs:element name="timerT3" minOccurs="0"/>
+ <xs:element name="timerCC" minOccurs="0"/>
+ <xs:element name="congestionLevel3OnSet" minOccurs="0"/>
+ <xs:element name="initialCredit" minOccurs="0"/>
+ <xs:element name="timerIdle" minOccurs="0"/>
+ <xs:element name="timerKeepAlive" minOccurs="0"/>
+ <xs:element name="maxCC" minOccurs="0"/>
+ <xs:element name="maxNRP" minOccurs="0"/>
+ <xs:element name="timerNoCredit" minOccurs="0"/>
+ <xs:element name="maxPD" minOccurs="0"/>
+ <xs:element name="timerNoResponse" minOccurs="0"/>
+ <xs:element name="congestionLevel2Abatement" minOccurs="0"/>
+ <xs:element name="congestionLevel3Abatement" minOccurs="0"/>
+ <xs:element name="discardMessagesLevel1" minOccurs="0"/>
+ <xs:element name="discardMessagesLevel2" minOccurs="0"/>
+ <xs:element name="discardMessagesLevel3" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataNniSaalTp" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="aal5TpVccTpId" minOccurs="0"/>
+ <xs:element name="maxSduSize" minOccurs="0"/>
+ <xs:element name="nniSaalProfileId" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataSccpApLocal" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="maxConn" minOccurs="0"/>
+ <xs:element name="ssN" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="useS1" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataSccpApRemote" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="mtp3bApId" minOccurs="0"/>
+ <xs:element name="ssN" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataSccpEntitySet" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="routeIds" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="newSubSystemNumber" minOccurs="0"/>
+ <xs:element name="sharingMode" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="newGlobalTitle" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="indicator" minOccurs="0"/>
+ <xs:element name="natureOfAddress" minOccurs="0"/>
+ <xs:element name="numberingPlan" minOccurs="0"/>
+ <xs:element name="translationType" minOccurs="0"/>
+ <xs:element name="addressInformation" minOccurs="0"/>
+ <xs:element name="encodingScheme" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataSccpGlobalTitle" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="addressInformation" minOccurs="0"/>
+ <xs:element name="encodingScheme" minOccurs="0"/>
+ <xs:element name="gtIndicator" minOccurs="0"/>
+ <xs:element name="natureOfAddress" minOccurs="0"/>
+ <xs:element name="numberingPlan" minOccurs="0"/>
+ <xs:element name="sccpEntitySetId" minOccurs="0"/>
+ <xs:element name="translationType" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataSccpScrc" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataSccpSp" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="accountDateFileOutput" minOccurs="0"/>
+ <xs:element name="accountPeriodFileOutput" minOccurs="0"/>
+ <xs:element name="accountTimeFileOutput" minOccurs="0"/>
+ <xs:element name="hopCounterSclc" minOccurs="0"/>
+ <xs:element name="hopCounterScoc" minOccurs="0"/>
+ <xs:element name="lowerConnThres" minOccurs="0"/>
+ <xs:element name="maxRelayedConn" minOccurs="0"/>
+ <xs:element name="mtp3bSpId" minOccurs="0"/>
+ <xs:element name="prioGeneral" minOccurs="0"/>
+ <xs:element name="prioIT" minOccurs="0"/>
+ <xs:element name="prioRLSD" minOccurs="0"/>
+ <xs:element name="prioSST" minOccurs="0"/>
+ <xs:element name="smiValue" minOccurs="0"/>
+ <xs:element name="swapUDTPointer" minOccurs="0"/>
+ <xs:element name="tCong" minOccurs="0"/>
+ <xs:element name="tGuard" minOccurs="0"/>
+ <xs:element name="tIar" minOccurs="0"/>
+ <xs:element name="tIas" minOccurs="0"/>
+ <xs:element name="tReass" minOccurs="0"/>
+ <xs:element name="tRel" minOccurs="0"/>
+ <xs:element name="tStatInfo" minOccurs="0"/>
+ <xs:element name="tconnEst" minOccurs="0"/>
+ <xs:element name="tconnResp" minOccurs="0"/>
+ <xs:element name="upperConnThres" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="useSCMG" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="sendSST" minOccurs="0"/>
+ <xs:element name="sendSSA" minOccurs="0"/>
+ <xs:element name="sendSSP" minOccurs="0"/>
+ <xs:element name="useSST" minOccurs="0"/>
+ <xs:element name="allowRemoteBroadcast" minOccurs="0"/>
+ <xs:element name="initiateTimerTcon" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataRnsap" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="preferredAddressing" minOccurs="0"/>
+ <xs:element name="sccpDisabledT" minOccurs="0"/>
+ <xs:element name="userOutOfServiceT" minOccurs="0"/>
+ <xs:element name="localSccpApRef" minOccurs="0"/>
+ <xs:element name="sccpGlobalTitleRef" minOccurs="0"/>
+ <xs:element name="remoteSccpApRef" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataMtp3bSlChina" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="autoStartLink" minOccurs="0"/>
+ <xs:element name="linkCongestLevel" minOccurs="0"/>
+ <xs:element name="linkState" minOccurs="0"/>
+ <xs:element name="prioBeforeSio" minOccurs="0"/>
+ <xs:element name="signLinkCode" minOccurs="0"/>
+ <xs:element name="tpId" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="deactivate" minOccurs="0"/>
+ <xs:element name="activate" minOccurs="0"/>
+ <xs:element name="emergencyActivate" minOccurs="0"/>
+ <xs:element name="localInhibit" minOccurs="0"/>
+ <xs:element name="localUninhibit" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataMtp3bSpChina" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="m3uaNoOfAttempsOfDauds" minOccurs="0"/>
+ <xs:element name="routeSetCongestTestFlag" minOccurs="0"/>
+ <xs:element name="maxSizeChangeBuf" minOccurs="0"/>
+ <xs:element name="rpuId" minOccurs="0"/>
+ <xs:element name="sendSltmBefLink" minOccurs="0"/>
+ <xs:element name="maxSizeReroutBuf" minOccurs="0"/>
+ <xs:element name="networkInd" minOccurs="0"/>
+ <xs:element name="signallingPointCode" minOccurs="0"/>
+ <xs:element name="sioSpare" minOccurs="0"/>
+ <xs:element name="nodeBehaviour" minOccurs="0"/>
+ <xs:element name="noOfAttempsOfAssociationEstablishment" minOccurs="0"/>
+ <xs:element name="spPriority" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="prioCb" minOccurs="0"/>
+ <xs:element name="prioCo" minOccurs="0"/>
+ <xs:element name="prioEc" minOccurs="0"/>
+ <xs:element name="prioLink" minOccurs="0"/>
+ <xs:element name="prioRst" minOccurs="0"/>
+ <xs:element name="prioSlt" minOccurs="0"/>
+ <xs:element name="prioTfc" minOccurs="0"/>
+ <xs:element name="prioTra" minOccurs="0"/>
+ <xs:element name="prioUpu" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="statusIndInterval" minOccurs="0"/>
+ <xs:element name="noOfCongestLevelForNI" minOccurs="0"/>
+ <xs:element name="resendTfcInterval" minOccurs="0"/>
+ <xs:element name="testPatternSltm" minOccurs="0"/>
+ <xs:element name="transFrHandler" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="version" minOccurs="0"/>
+ <xs:element name="spTimer" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="timerM3uaPeriodicAudit" minOccurs="0"/>
+ <xs:element name="timerM3uaT1" minOccurs="0"/>
+ <xs:element name="timerM3uaT3" minOccurs="0"/>
+ <xs:element name="timerM3uaT40" minOccurs="0"/>
+ <xs:element name="timerM3uaT41" minOccurs="0"/>
+ <xs:element name="timerM3uaT42" minOccurs="0"/>
+ <xs:element name="timerM3uaT6" minOccurs="0"/>
+ <xs:element name="timerM3uaT8" minOccurs="0"/>
+ <xs:element name="timerM3uaTack" minOccurs="0"/>
+ <xs:element name="timerM3uaTassocack" minOccurs="0"/>
+ <xs:element name="timerM3uaTc" minOccurs="0"/>
+ <xs:element name="timerSlta" minOccurs="0"/>
+ <xs:element name="timerSltm" minOccurs="0"/>
+ <xs:element name="timerT1" minOccurs="0"/>
+ <xs:element name="timerT10" minOccurs="0"/>
+ <xs:element name="timerT12" minOccurs="0"/>
+ <xs:element name="timerT13" minOccurs="0"/>
+ <xs:element name="timerT14" minOccurs="0"/>
+ <xs:element name="timerT15" minOccurs="0"/>
+ <xs:element name="timerT16" minOccurs="0"/>
+ <xs:element name="timerT17" minOccurs="0"/>
+ <xs:element name="timerT18" minOccurs="0"/>
+ <xs:element name="timerT19" minOccurs="0"/>
+ <xs:element name="timerT2" minOccurs="0"/>
+ <xs:element name="timerT20" minOccurs="0"/>
+ <xs:element name="timerT21" minOccurs="0"/>
+ <xs:element name="timerT22" minOccurs="0"/>
+ <xs:element name="timerT23" minOccurs="0"/>
+ <xs:element name="timerT3" minOccurs="0"/>
+ <xs:element name="timerT4" minOccurs="0"/>
+ <xs:element name="timerT5" minOccurs="0"/>
+ <xs:element name="timerT6" minOccurs="0"/>
+ <xs:element name="timerT8" minOccurs="0"/>
+ <xs:element name="timerTBsnt" minOccurs="0"/>
+ <xs:element name="timerTDlack" minOccurs="0"/>
+ <xs:element name="timerTRetrieval" minOccurs="0"/>
+ <xs:element name="timerTStart" minOccurs="0"/>
+ <xs:element name="timerTc" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataRanap" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="preferredAddressing" minOccurs="0"/>
+ <xs:element name="sccpDisabledT" minOccurs="0"/>
+ <xs:element name="cnDomainInd" minOccurs="0"/>
+ <xs:element name="noOfResetSendings" minOccurs="0"/>
+ <xs:element name="userOutOfServiceT" minOccurs="0"/>
+ <xs:element name="localSccpApRef" minOccurs="0"/>
+ <xs:element name="sccpGlobalTitleRef" minOccurs="0"/>
+ <xs:element name="remoteSccpApRef" minOccurs="0"/>
+ <xs:element name="resetResendT" minOccurs="0"/>
+ <xs:element name="resetAckGuardT" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="cnId" minOccurs="0"/>
+ <xs:element name="cnPlmnIdentity" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="mcc" minOccurs="0"/>
+ <xs:element name="mnc" minOccurs="0"/>
+ <xs:element name="mncLength" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="networkResourceIdentifier" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="relativeCapacity" minOccurs="0"/>
+ <xs:element name="packetDataRouterRef" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="cnOperatorRef" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataMtp3bSlAnsi" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="autoStartLink" minOccurs="0"/>
+ <xs:element name="linkCongestLevel" minOccurs="0"/>
+ <xs:element name="linkState" minOccurs="0"/>
+ <xs:element name="signLinkCode" minOccurs="0"/>
+ <xs:element name="tpId" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="deactivate" minOccurs="0"/>
+ <xs:element name="activate" minOccurs="0"/>
+ <xs:element name="emergencyActivate" minOccurs="0"/>
+ <xs:element name="localInhibit" minOccurs="0"/>
+ <xs:element name="localUninhibit" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataMtp3bSpAnsi" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="m3uaNoOfAttempsOfDauds" minOccurs="0"/>
+ <xs:element name="maxSizeChangeBuf" minOccurs="0"/>
+ <xs:element name="maxSizeReroutBuf" minOccurs="0"/>
+ <xs:element name="networkInd" minOccurs="0"/>
+ <xs:element name="noOfAttempsOfAssociationEstablishment" minOccurs="0"/>
+ <xs:element name="noOfCongestLevelForNI" minOccurs="0"/>
+ <xs:element name="nodeBehaviour" minOccurs="0"/>
+ <xs:element name="resendTfcInterval" minOccurs="0"/>
+ <xs:element name="routeSetCongestTestFlag" minOccurs="0"/>
+ <xs:element name="rpuId" minOccurs="0"/>
+ <xs:element name="sendSltmBefLink" minOccurs="0"/>
+ <xs:element name="signallingPointCode" minOccurs="0"/>
+ <xs:element name="statusIndInterval" minOccurs="0"/>
+ <xs:element name="sioSpare" minOccurs="0"/>
+ <xs:element name="testPatternSltm" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="spPriority" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="prioCb" minOccurs="0"/>
+ <xs:element name="prioCo" minOccurs="0"/>
+ <xs:element name="prioEc" minOccurs="0"/>
+ <xs:element name="prioLink" minOccurs="0"/>
+ <xs:element name="prioRst" minOccurs="0"/>
+ <xs:element name="prioSlt" minOccurs="0"/>
+ <xs:element name="prioTfc" minOccurs="0"/>
+ <xs:element name="prioTra" minOccurs="0"/>
+ <xs:element name="prioUpu" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="spTimer" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="timerM3uaPeriodicAudit" minOccurs="0"/>
+ <xs:element name="timerM3uaT1" minOccurs="0"/>
+ <xs:element name="timerM3uaT3" minOccurs="0"/>
+ <xs:element name="timerM3uaT40" minOccurs="0"/>
+ <xs:element name="timerM3uaT41" minOccurs="0"/>
+ <xs:element name="timerM3uaT42" minOccurs="0"/>
+ <xs:element name="timerM3uaT6" minOccurs="0"/>
+ <xs:element name="timerM3uaT8" minOccurs="0"/>
+ <xs:element name="timerM3uaTack" minOccurs="0"/>
+ <xs:element name="timerM3uaTassocack" minOccurs="0"/>
+ <xs:element name="timerM3uaTc" minOccurs="0"/>
+ <xs:element name="timerSlta" minOccurs="0"/>
+ <xs:element name="timerSltm" minOccurs="0"/>
+ <xs:element name="timerT1" minOccurs="0"/>
+ <xs:element name="timerT10" minOccurs="0"/>
+ <xs:element name="timerT12" minOccurs="0"/>
+ <xs:element name="timerT13" minOccurs="0"/>
+ <xs:element name="timerT14" minOccurs="0"/>
+ <xs:element name="timerT15" minOccurs="0"/>
+ <xs:element name="timerT16" minOccurs="0"/>
+ <xs:element name="timerT17" minOccurs="0"/>
+ <xs:element name="timerT2" minOccurs="0"/>
+ <xs:element name="timerT20" minOccurs="0"/>
+ <xs:element name="timerT21" minOccurs="0"/>
+ <xs:element name="timerT22" minOccurs="0"/>
+ <xs:element name="timerT23" minOccurs="0"/>
+ <xs:element name="timerT25" minOccurs="0"/>
+ <xs:element name="timerT26" minOccurs="0"/>
+ <xs:element name="timerT27" minOccurs="0"/>
+ <xs:element name="timerT28" minOccurs="0"/>
+ <xs:element name="timerT29" minOccurs="0"/>
+ <xs:element name="timerT3" minOccurs="0"/>
+ <xs:element name="timerT30" minOccurs="0"/>
+ <xs:element name="timerT31" minOccurs="0"/>
+ <xs:element name="timerT4" minOccurs="0"/>
+ <xs:element name="timerT5" minOccurs="0"/>
+ <xs:element name="timerT6" minOccurs="0"/>
+ <xs:element name="timerT8" minOccurs="0"/>
+ <xs:element name="timerTBsnt" minOccurs="0"/>
+ <xs:element name="timerTDlack" minOccurs="0"/>
+ <xs:element name="timerTRetrieval" minOccurs="0"/>
+ <xs:element name="timerTStart" minOccurs="0"/>
+ <xs:element name="timerTc" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="transFrHandler" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataPacketDataRouter" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="rncIpAddress" minOccurs="0"/>
+ <xs:element name="cnIuLinkIpAddress" minOccurs="0"/>
+ <xs:element name="timeToLive" minOccurs="0"/>
+ <xs:element name="pdrDeviceRef" minOccurs="0"/>
+ <xs:element name="aal5TpRef" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="administrativeState" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataIpAtmLink" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="interfaceName" minOccurs="0"/>
+ <xs:element name="ipAddress" minOccurs="0"/>
+ <xs:element name="metric" minOccurs="0"/>
+ <xs:element name="monitor" minOccurs="0"/>
+ <xs:element name="monitorInterval" minOccurs="0"/>
+ <xs:element name="monitorRetries" minOccurs="0"/>
+ <xs:element name="mtuSize" minOccurs="0"/>
+ <xs:element name="subnetMask" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="Aal5TpVccTpIdList" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="aal5TpVccTpSelectionMode" minOccurs="0"/>
+ <xs:element name="aal5TpVccTpId" minOccurs="0"/>
+ <xs:element name="assignIpAddress" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="ipAddress" minOccurs="0"/>
+ <xs:element name="subnetMask" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataIpRoutingTable" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="indexOfDeletableStaticRoutes" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="addStaticRoute" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="ipAddress" minOccurs="0"/>
+ <xs:element name="subnetMask" minOccurs="0"/>
+ <xs:element name="hopIpAddress" minOccurs="0"/>
+ <xs:element name="routeMetric" minOccurs="0"/>
+ <xs:element name="redistribute" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="deleteStaticRoute" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="routingTableEntry" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="active" minOccurs="0"/>
+ <xs:element name="destinationIpAddr" minOccurs="0"/>
+ <xs:element name="destinationNetworkMask" minOccurs="0"/>
+ <xs:element name="interfaceName" minOccurs="0"/>
+ <xs:element name="nextHopIpAddr" minOccurs="0"/>
+ <xs:element name="redistribute" minOccurs="0"/>
+ <xs:element name="routeMetric" minOccurs="0"/>
+ <xs:element name="routeType" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataIp" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="dnsServer" minOccurs="0"/>
+ <xs:element name="isRecursiveSearch" minOccurs="0"/>
+ <xs:element name="isSubDomainName" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="retransInterval" minOccurs="0"/>
+ <xs:element name="noOfRetrans" minOccurs="0"/>
+ <xs:element name="isDefDomainName" minOccurs="0"/>
+ <xs:element name="defDomainName" minOccurs="0"/>
+ <xs:element name="useHostFile" minOccurs="0"/>
+ <xs:element name="dscp" minOccurs="0"/>
+ <xs:element name="icmpRedirect" minOccurs="0"/>
+ <xs:element name="udpChecksumState" minOccurs="0"/>
+ <xs:element name="connectionAttemptTimer" minOccurs="0"/>
+ <xs:element name="maxRetransmissionAttempts" minOccurs="0"/>
+ <xs:element name="workingMode" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataIpSystem" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataIpOam" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataOspf" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="ipMo" minOccurs="0"/>
+ <xs:element name="ospfASBdrRtrStatus" minOccurs="0"/>
+ <xs:element name="ospfAreaBdrRtrStatus" minOccurs="0"/>
+ <xs:element name="ospfRouterId" minOccurs="0"/>
+ <xs:element name="recoverTopoDb" minOccurs="0"/>
+ <xs:element name="topoDbStoreInterv" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="administrativeState" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataOspfArea" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="areaId" minOccurs="0"/>
+ <xs:element name="areaLsaChecksum" minOccurs="0"/>
+ <xs:element name="importExternalLsa" minOccurs="0"/>
+ <xs:element name="sendAreaSummary" minOccurs="0"/>
+ <xs:element name="stubArea" minOccurs="0"/>
+ <xs:element name="stubAreaMetric" minOccurs="0"/>
+ <xs:element name="stubAreaMetricType" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="range0" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="ipAddress" minOccurs="0"/>
+ <xs:element name="subnetMask" minOccurs="0"/>
+ <xs:element name="advertise" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="range1" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="ipAddress" minOccurs="0"/>
+ <xs:element name="subnetMask" minOccurs="0"/>
+ <xs:element name="advertise" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="range2" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="ipAddress" minOccurs="0"/>
+ <xs:element name="subnetMask" minOccurs="0"/>
+ <xs:element name="advertise" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="addAreaRange" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="rangeIndex" minOccurs="0"/>
+ <xs:element name="range" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="ipAddress" minOccurs="0"/>
+ <xs:element name="subnetMask" minOccurs="0"/>
+ <xs:element name="advertise" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="deleteAreaRange" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="rangeIndex" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataOspfInterface" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="helloInterval" minOccurs="0"/>
+ <xs:element name="interfacePriority" minOccurs="0"/>
+ <xs:element name="interfaceTransitDelay" minOccurs="0"/>
+ <xs:element name="lsaTransmissionInterval" minOccurs="0"/>
+ <xs:element name="ospfAreaRelated" minOccurs="0"/>
+ <xs:element name="relatedLink" minOccurs="0"/>
+ <xs:element name="routerDeadInterval" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataRncModule" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataTnApplication" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData"/>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataVirtualPath" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="vplTpARef" minOccurs="0"/>
+ <xs:element name="vplTpBRef" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataM3uAssociation" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="mtp3bSrsId" minOccurs="0"/>
+ <xs:element name="sctpId" minOccurs="0"/>
+ <xs:element name="dscp" minOccurs="0"/>
+ <xs:element name="associationState" minOccurs="0"/>
+ <xs:element name="localIpMask" minOccurs="0"/>
+ <xs:element name="autoStartAssociation" minOccurs="0"/>
+ <xs:element name="remotePortNumber" minOccurs="0"/>
+ <xs:element name="remoteIpAddress1" minOccurs="0"/>
+ <xs:element name="remoteIpAddress2" minOccurs="0"/>
+ <xs:element name="localPortNumber" minOccurs="0"/>
+ <xs:element name="role" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataSccpAccountingCriteria" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="usageType" minOccurs="0"/>
+ <xs:element name="ssN" minOccurs="0"/>
+ <xs:element name="countType" minOccurs="0"/>
+ <xs:element name="globalTitleId" minOccurs="0"/>
+ <xs:element name="pointerId" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataSccpPolicing" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="originatingMtp3bSpc" minOccurs="0"/>
+ <xs:element name="destinationMtp3bSpc" minOccurs="0"/>
+ <xs:element name="originatingSccpSpId" minOccurs="0"/>
+ <xs:element name="originatingSccpSsn" minOccurs="0"/>
+ <xs:element name="destinationSccpSpId" minOccurs="0"/>
+ <xs:element name="destinationSccpSsn" minOccurs="0"/>
+ <xs:element name="policingGlobalTitle" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="indicator" minOccurs="0"/>
+ <xs:element name="natureOfAddress" minOccurs="0"/>
+ <xs:element name="numberingPlan" minOccurs="0"/>
+ <xs:element name="translationType" minOccurs="0"/>
+ <xs:element name="addressInformation" minOccurs="0"/>
+ <xs:element name="encodingScheme" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="discardOrReturnServiceMsg" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataSctp" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="numberOfAssociations" minOccurs="0"/>
+ <xs:element name="ipAccessHostGpbId" minOccurs="0"/>
+ <xs:element name="minimumRto" minOccurs="0"/>
+ <xs:element name="maximumRto" minOccurs="0"/>
+ <xs:element name="initialRto" minOccurs="0"/>
+ <xs:element name="rtoAlphaIndex" minOccurs="0"/>
+ <xs:element name="rtoBetaIndex" minOccurs="0"/>
+ <xs:element name="validCookieLife" minOccurs="0"/>
+ <xs:element name="allowedIncrementCookieLife" minOccurs="0"/>
+ <xs:element name="keyChangePeriod" minOccurs="0"/>
+ <xs:element name="associationMaxRtx" minOccurs="0"/>
+ <xs:element name="pathMaxRtx" minOccurs="0"/>
+ <xs:element name="maxInitialRtrAtt" minOccurs="0"/>
+ <xs:element name="maxShutDownRtrAtt" minOccurs="0"/>
+ <xs:element name="heartbeatInterval" minOccurs="0"/>
+ <xs:element name="heartbeatStatus" minOccurs="0"/>
+ <xs:element name="maxIncomingStream" minOccurs="0"/>
+ <xs:element name="maxOutgoingStream" minOccurs="0"/>
+ <xs:element name="maxUserDataSize" minOccurs="0"/>
+ <xs:element name="mBuffer" minOccurs="0"/>
+ <xs:element name="nThreshold" minOccurs="0"/>
+ <xs:element name="tSack" minOccurs="0"/>
+ <xs:element name="maxDataSizeIp" minOccurs="0"/>
+ <xs:element name="initialAdRecWin" minOccurs="0"/>
+ <xs:element name="intervalOobPkts" minOccurs="0"/>
+ <xs:element name="intervalLostUser" minOccurs="0"/>
+ <xs:element name="maxBurst" minOccurs="0"/>
+ <xs:element name="nPercentage" minOccurs="0"/>
+ <xs:element name="bundlingActivated" minOccurs="0"/>
+ <xs:element name="bundlingTimer" minOccurs="0"/>
+ <xs:element name="rpuId" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataEthernetLink" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="ipAddress" minOccurs="0"/>
+ <xs:element name="subnetMask" minOccurs="0"/>
+ <xs:element name="broadcastAddress" minOccurs="0"/>
+ <xs:element name="macAddress" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="mtuSize" minOccurs="0"/>
+ <xs:element name="metric" minOccurs="0"/>
+ <xs:element name="interfaceName" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="assignIpAddress" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="ipAddress" minOccurs="0"/>
+ <xs:element name="subnetMask" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataImaGroup" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="physicalPortList" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="requiredNumberOfLinks" minOccurs="0"/>
+ <xs:element name="activeLinks" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataImaLink" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="uses" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataIpAccessHostGpb" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="administrativeState" minOccurs="0"/>
+ <xs:element name="generalProcessorUnitId" minOccurs="0"/>
+ <xs:element name="autoConfig" minOccurs="0"/>
+ <xs:element name="autoConfigIdentity" minOccurs="0"/>
+ <xs:element name="autoConfigIdentity2" minOccurs="0"/>
+ <xs:element name="ipAddress1" minOccurs="0"/>
+ <xs:element name="ipAddress2" minOccurs="0"/>
+ <xs:element name="ipDefaultTtl" minOccurs="0"/>
+ <xs:element name="ipReasmTimeout" minOccurs="0"/>
+ <xs:element name="interface1" minOccurs="0"/>
+ <xs:element name="interface2" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataIpAccessAutoConfig" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="networkPrefixLength" minOccurs="0"/>
+ <xs:element name="nrOfUnusedAdresses" minOccurs="0"/>
+ <xs:element name="totalNrOfAddresses" minOccurs="0"/>
+ <xs:element name="minIpAddress" minOccurs="0"/>
+ <xs:element name="maxIpAddress" minOccurs="0"/>
+ <xs:element name="subnet" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataIpInterface" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="vid" minOccurs="0"/>
+ <xs:element name="vLan" minOccurs="0"/>
+ <xs:element name="rps" minOccurs="0"/>
+ <xs:element name="mtu" minOccurs="0"/>
+ <xs:element name="networkPrefixLength" minOccurs="0"/>
+ <xs:element name="defaultRouter0" minOccurs="0"/>
+ <xs:element name="defaultRouter1" minOccurs="0"/>
+ <xs:element name="defaultRouter2" minOccurs="0"/>
+ <xs:element name="defaultRouterPingInterval" minOccurs="0"/>
+ <xs:element name="maxWaitForPingReply" minOccurs="0"/>
+ <xs:element name="maxNoOfFailedPings" minOccurs="0"/>
+ <xs:element name="noOfPingsBeforeOk" minOccurs="0"/>
+ <xs:element name="switchBackTimer" minOccurs="0"/>
+ <xs:element name="ownIpAddressActive" minOccurs="0"/>
+ <xs:element name="ownIpAddressPassive" minOccurs="0"/>
+ <xs:element name="subnet" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataIpAccessHostSpb" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="administrativeState" minOccurs="0"/>
+ <xs:element name="autoConfig" minOccurs="0"/>
+ <xs:element name="autoConfigIdentity" minOccurs="0"/>
+ <xs:element name="autoConfigIdentity2" minOccurs="0"/>
+ <xs:element name="interface2" minOccurs="0"/>
+ <xs:element name="spmId" minOccurs="0"/>
+ <xs:element name="ipAddress" minOccurs="0"/>
+ <xs:element name="ipAddress2" minOccurs="0"/>
+ <xs:element name="ipDefaultTtl" minOccurs="0"/>
+ <xs:element name="ipInterface" minOccurs="0"/>
+ <xs:element name="ipReasmTimeout" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataIpEthPacketDataRouter" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="administrativeState" minOccurs="0"/>
+ <xs:element name="pdrDeviceRef" minOccurs="0"/>
+ <xs:element name="ipAccessHostSpbRef" minOccurs="0"/>
+ <xs:element name="ipAddressSelection" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataSwManagement" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData"/>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataReliableProgramUniter" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataSpDevicePool" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData"/>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataPdrDevice" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataExchangeTerminal" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="description" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="aal2LayerDescription" minOccurs="0"/>
+ <xs:element name="atmLayerDescription" minOccurs="0"/>
+ <xs:element name="etType" minOccurs="0"/>
+ <xs:element name="physicalLayerDescription" minOccurs="0"/>
+ <xs:element name="tdmSupport" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataCbu" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataGeneralProcessorUnit" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataVc4Ttp" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="pathTraceFormat" minOccurs="0"/>
+ <xs:element name="transmittedPathTrace" minOccurs="0"/>
+ <xs:element name="expectedPathTrace" minOccurs="0"/>
+ <xs:element name="timConsequentAction" minOccurs="0"/>
+ <xs:element name="vcDegThreshold" minOccurs="0"/>
+ <xs:element name="vcDegM" minOccurs="0"/>
+ <xs:element name="auAisReporting" minOccurs="0"/>
+ <xs:element name="vcRdiReporting" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataVc12Ttp" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="transmittedPathTrace" minOccurs="0"/>
+ <xs:element name="expectedPathTrace" minOccurs="0"/>
+ <xs:element name="timConsequentAction" minOccurs="0"/>
+ <xs:element name="vcDegThreshold" minOccurs="0"/>
+ <xs:element name="vcDegM" minOccurs="0"/>
+ <xs:element name="tuAisReporting" minOccurs="0"/>
+ <xs:element name="vcRdiReporting" minOccurs="0"/>
+ <xs:element name="administrativeState" minOccurs="0"/>
+ <xs:element name="shutDownTimeout" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataE1Ttp" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="degDegThr" minOccurs="0"/>
+ <xs:element name="degDegM" minOccurs="0"/>
+ <xs:element name="aisReporting" minOccurs="0"/>
+ <xs:element name="rdiReporting" minOccurs="0"/>
+ <xs:element name="crc4Mode" minOccurs="0"/>
+ <xs:element name="idlePattern" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataSts1SpeTtp" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="aisPReporting" minOccurs="0"/>
+ <xs:element name="rdiPReporting" minOccurs="0"/>
+ <xs:element name="timConsequentAction" minOccurs="0"/>
+ <xs:element name="expectedPathTrace" minOccurs="0"/>
+ <xs:element name="transmittedPathTrace" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataVt15Ttp" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="administrativeState" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="aisVreporting" minOccurs="0"/>
+ <xs:element name="rdiVreporting" minOccurs="0"/>
+ <xs:element name="shutDownTimer" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataSts3CspeTtp" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="aisPReporting" minOccurs="0"/>
+ <xs:element name="rdiPReporting" minOccurs="0"/>
+ <xs:element name="timConsequentAction" minOccurs="0"/>
+ <xs:element name="expectedPathTrace" minOccurs="0"/>
+ <xs:element name="transmittedPathTrace" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataT1Ttp" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="aisReporting" minOccurs="0"/>
+ <xs:element name="rdiReporting" minOccurs="0"/>
+ <xs:element name="idlePattern" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataIuLink" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="packetDataRouterRef" minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataE1PhysPathTerm" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="administrativeState" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="lineNo" minOccurs="0"/>
+ <xs:element name="loopback" minOccurs="0"/>
+ <xs:element name="crc4Mode" minOccurs="0"/>
+ <xs:element name="idlePattern" minOccurs="0"/>
+ <xs:element name="degDegThr" minOccurs="0"/>
+ <xs:element name="degDegM" minOccurs="0"/>
+ <xs:element name="rdiReporting" minOccurs="0"/>
+ <xs:element name="aisReporting" minOccurs="0"/>
+ <xs:element name="shutDownTimeout" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataJ1PhysPathTerm" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="administrativeState" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="lineNo" minOccurs="0"/>
+ <xs:element name="loopback" minOccurs="0"/>
+ <xs:element name="idlePattern" minOccurs="0"/>
+ <xs:element name="physicalLineType" minOccurs="0"/>
+ <xs:element name="degThreshold" minOccurs="0"/>
+ <xs:element name="rdiReporting" minOccurs="0"/>
+ <xs:element name="aisReporting" minOccurs="0"/>
+ <xs:element name="shutDownTimeout" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataT1PhysPathTerm" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="administrativeState" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="lineNo" minOccurs="0"/>
+ <xs:element name="loopback" minOccurs="0"/>
+ <xs:element name="rdiReporting" minOccurs="0"/>
+ <xs:element name="aisReporting" minOccurs="0"/>
+ <xs:element name="shutDownTimeout" minOccurs="0"/>
+ <xs:element name="idlePattern" minOccurs="0"/>
+ <xs:element name="transmissionMode" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataDs0Bundle" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="listOfTimeSlots" minOccurs="0"/>
+ <xs:element name="tdmMode" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataT3PhysPathTerm" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="administrativeState" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="shutDownTimeout" minOccurs="0"/>
+ <xs:element name="lineNo" minOccurs="0"/>
+ <xs:element name="loopback" minOccurs="0"/>
+ <xs:element name="rdiReporting" minOccurs="0"/>
+ <xs:element name="aisReporting" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataE3PhysPathTerm" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="administrativeState" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="shutDownTimeout" minOccurs="0"/>
+ <xs:element name="lineNo" minOccurs="0"/>
+ <xs:element name="loopback" minOccurs="0"/>
+ <xs:element name="idlePattern" minOccurs="0"/>
+ <xs:element name="degDegThr" minOccurs="0"/>
+ <xs:element name="degDegM" minOccurs="0"/>
+ <xs:element name="rdiReporting" minOccurs="0"/>
+ <xs:element name="aisReporting" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataOs155SpiTtp" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="administrativeState" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="lineNo" minOccurs="0"/>
+ <xs:element name="standardMode" minOccurs="0"/>
+ <xs:element name="shutDownTimeout" minOccurs="0"/>
+ <xs:element name="muxMode" minOccurs="0"/>
+ <xs:element name="msDegThreshold" minOccurs="0"/>
+ <xs:element name="msDegM" minOccurs="0"/>
+ <xs:element name="msRdiReporting" minOccurs="0"/>
+ <xs:element name="msAisReporting" minOccurs="0"/>
+ <xs:element name="loopBack" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataEtMfg" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataGigaBitEthernet" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="administrativeState" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="dscpPbitMap" minOccurs="0"/>
+ <xs:element name="autoNegotiation" minOccurs="0"/>
+ <xs:element name="frameFormat" minOccurs="0"/>
+ <xs:element name="primaryLink" minOccurs="0"/>
+ <xs:element name="protectiveMode" minOccurs="0"/>
+ <xs:element name="msDegM" minOccurs="0"/>
+ <xs:element name="shutDownTimeout" minOccurs="0"/>
+ <xs:element name="statePropagationDelay" minOccurs="0"/>
+ <xs:element name="switchBackTimer" minOccurs="0"/>
+ <xs:element name="setDscpPbit" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="dscp" minOccurs="0"/>
+ <xs:element name="pbit" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataFastEthernet" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="administrativeState" minOccurs="0"/>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="defaultRouter" minOccurs="0"/>
+ <xs:element name="mtu" minOccurs="0"/>
+ <xs:element name="networkPrefixLength" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataMediumAccessUnit" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="connectorLabel" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vsDataMspg" substitutionGroup="xn:vsData">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="xn:vsData">
+ <xs:sequence>
+ <xs:element name="userLabel" minOccurs="0"/>
+ <xs:element name="degCauseMsp" minOccurs="0"/>
+ <xs:element name="os155SpiStandbyId" minOccurs="0"/>
+ <xs:element name="os155SpiWorkingId" minOccurs="0"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/ImportExportMap.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/ImportExportMap.xsd
new file mode 100644
index 0000000000..acbafd42e6
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/ImportExportMap.xsd
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- edited with XML Spy v4.1 U (http://www.xmlspy.com) by Graham Coster (Ericsson Expertise Ireland) -->
+<!--W3C Schema generated by XML Spy v4.1 U (http://www.xmlspy.com)-->
+<xs:schema xmlns="ImportExportMap.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="ImportExportMap.xsd" elementFormDefault="qualified">
+ <xs:element name="AttributeMap">
+ <xs:complexType>
+ <xs:attribute name="internalName" type="xs:string" use="required"/>
+ <xs:attribute name="externalName" type="xs:string" use="required"/>
+ <xs:attribute name="structAttributeType" type="xs:string" use="optional"/>
+ <xs:attribute name="mapRequired" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="restricted" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="actionUpdated" type="xs:boolean" use="optional" default="false"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ActionMap">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="ActionAttribute" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="actionName" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ActionAttribute">
+ <xs:complexType>
+ <xs:attribute name="name" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ChildMoTypes">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="MoType" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="FileMimMap">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="MoMap" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="fileType" type="xs:string" use="required"/>
+ <xs:attribute name="fileVersion" type="xs:string" use="required"/>
+ <xs:attribute name="ranosMOMType" type="xs:string" use="required"/>
+ <xs:attribute name="ranosMOMVersion" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="MoMap">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="ValidCommands"/>
+ <xs:element ref="AttributeMap" maxOccurs="unbounded"/>
+ <xs:element ref="ActionMap" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="ChildMoTypes" minOccurs="0"/>
+ </xs:sequence>
+ <xs:attribute name="fileRoot" type="xs:boolean" use="required"/>
+ <xs:attribute name="externalType" type="xs:string" use="required"/>
+ <xs:attribute name="internalType" type="xs:string" use="required"/>
+ <xs:attribute name="nameSpace" type="xs:string" use="required"/>
+ <xs:attribute name="rt" type="xs:string" use="required"/>
+ <xs:attribute name="overrideFBKDelete" type="xs:boolean" use="optional" default="false"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="MoType">
+ <xs:complexType>
+ <xs:attribute name="name" type="xs:string" use="required"/>
+ <xs:attribute name="rt" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ValidCommands">
+ <xs:complexType>
+ <xs:attribute name="create" type="xs:boolean" use="required"/>
+ <xs:attribute name="update" type="xs:boolean" use="required"/>
+ <xs:attribute name="delete" type="xs:boolean" use="required"/>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/configData.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/configData.xsd
new file mode 100644
index 0000000000..f07e7c8d3d
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/configData.xsd
@@ -0,0 +1,41 @@
+<!--
+ 3GPP TS 32.615 v4.5 Bulk CM IRP
+ Configuration data file base XML schema
+ configData.xsd
+ -->
+<schema targetNamespace="configData.xsd" xmlns:bc="configData.xsd" xmlns:xn="genericNrm.xsd" xmlns:es="EricssonSpecificAttributes.5.1.xsd" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+ <!-- Configuration data file root XML element -->
+ <import namespace="genericNrm.xsd" schemaLocation="genericNrm.xsd"/>
+ <import namespace="EricssonSpecificAttributes.5.1.xsd" schemaLocation="EricssonSpecificAttributes.5.1.xsd"/>
+ <element name="bulkCmConfigDataFile">
+ <complexType>
+ <sequence>
+ <element name="fileHeader">
+ <complexType>
+ <attribute name="fileFormatVersion" type="string" use="required"/>
+ <attribute name="senderName" type="string" use="optional"/>
+ <attribute name="vendorName" type="string" use="optional"/>
+ </complexType>
+ </element>
+ <element name="configData" maxOccurs="unbounded">
+ <complexType>
+ <choice>
+ <element ref="xn:SubNetwork"/>
+ <element ref="xn:MeContext"/>
+ <!--
+ <element ref="xn:ManagedElement"/>
+ Not Possible at this level in Ericsson Model
+ -->
+ </choice>
+ <attribute name="dnPrefix" type="string" use="optional"/>
+ </complexType>
+ </element>
+ <element name="fileFooter">
+ <complexType>
+ <attribute name="dateTime" type="dateTime" use="required"/>
+ </complexType>
+ </element>
+ </sequence>
+ </complexType>
+ </element>
+</schema>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/genericNrm.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/genericNrm.xsd
new file mode 100644
index 0000000000..9c672cda8c
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/genericNrm.xsd
@@ -0,0 +1,230 @@
+<!--
+ 3GPP TS 32.615 v4.5 Bulk CM IRP
+ Configuration data file Generic Network Resources IRP NRM XML schema
+ -->
+<schema targetNamespace="genericNrm.xsd" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:un="utranNrm.xsd" xmlns:gn="geranNrm.xsd" xmlns:xn="genericNrm.xsd" elementFormDefault="qualified" attributeFormDefault="unqualified">
+
+ <import namespace="geranNrm.xsd" schemaLocation="geranNrm.xsd"/>
+ <import namespace="utranNrm.xsd" schemaLocation="utranNrm.xsd"/>
+
+ <!-- Abstract base type for all NRM class associated XML elements -->
+ <complexType name="NrmClassXmlType" abstract="true">
+ <attribute name="id" type="string" use="required"/>
+ <attribute name="modifier" use="optional">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="create"/>
+ <enumeration value="delete"/>
+ <enumeration value="update"/>
+ </restriction>
+ </simpleType>
+ </attribute>
+ </complexType>
+
+ <!-- Generic Network Resources IRP NRM class associated XML elements -->
+ <element name="SubNetwork">
+ <complexType>
+ <complexContent>
+ <extension base="xn:NrmClassXmlType">
+ <sequence>
+ <element name="attributes" minOccurs="0">
+ <complexType>
+ <all>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="userDefinedNetworkType" minOccurs="0"/>
+ </all>
+ </complexType>
+ </element>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element ref="xn:SubNetwork"/>
+ <element ref="xn:ManagedElement"/>
+ <element ref="xn:MeContext"/>
+ <element ref="xn:ManagementNode"/>
+ <element ref="xn:IRPAgent"/>
+ <element ref="un:ExternalUtranCell"/>
+ <element ref="gn:ExternalGsmCell"/>
+ <element ref="xn:VsDataContainer"/>
+ </choice>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <element name="ManagedElement">
+ <complexType>
+ <complexContent>
+ <extension base="xn:NrmClassXmlType">
+ <sequence>
+ <element name="attributes" minOccurs="0">
+ <complexType>
+ <all>
+ <element name="managedElementType" minOccurs="0"/>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="vendorName" minOccurs="0"/>
+ <element name="userDefinedState" minOccurs="0"/>
+ <element name="locationName" minOccurs="0"/>
+ <element name="swVersion" minOccurs="0"/>
+ <element name="managedBy" minOccurs="0"/>
+ </all>
+ </complexType>
+ </element>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element ref="un:RncFunction"/>
+ <element ref="un:NodeBFunction"/>
+ <element ref="xn:VsDataContainer"/>
+ </choice>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <element name="MeContext">
+ <complexType>
+ <complexContent>
+ <extension base="xn:NrmClassXmlType">
+ <sequence>
+ <element name="attributes" minOccurs="0">
+ <complexType>
+ </complexType>
+ </element>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element ref="xn:ManagedElement"/>
+ <element ref="xn:VsDataContainer"/>
+ </choice>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <element name="ManagementNode">
+ <complexType>
+ <complexContent>
+ <extension base="xn:NrmClassXmlType">
+ <sequence>
+ <element name="attributes" minOccurs="0">
+ <complexType>
+ <all>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="vendorName" minOccurs="0"/>
+ <element name="userDefinedState" minOccurs="0"/>
+ <element name="locationName" minOccurs="0"/>
+ <element name="manages" minOccurs="0"/>
+ <element name="swVersion" minOccurs="0"/>
+ </all>
+ </complexType>
+ </element>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element ref="xn:IRPAgent"/>
+ </choice>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <element name="IRPAgent">
+ <complexType>
+ <complexContent>
+ <extension base="xn:NrmClassXmlType">
+ <sequence>
+ <element name="attributes" minOccurs="0">
+ <complexType>
+ <all>
+ <element name="systemDN" minOccurs="0"/>
+ </all>
+ </complexType>
+ </element>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element ref="xn:NotificationIRP"/>
+ <element ref="xn:AlarmIRP"/>
+ <element ref="xn:BulkCmIRP"/>
+ </choice>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <element name="NotificationIRP">
+ <complexType>
+ <complexContent>
+ <extension base="xn:NrmClassXmlType">
+ <sequence>
+ <element name="attributes" minOccurs="0">
+ <complexType>
+ <all>
+ <element name="irpVersion" minOccurs="0"/>
+ </all>
+ </complexType>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <element name="AlarmIRP">
+ <complexType>
+ <complexContent>
+ <extension base="xn:NrmClassXmlType">
+ <sequence>
+ <element name="attributes" minOccurs="0">
+ <complexType>
+ <all>
+ <element name="irpVersion" minOccurs="0"/>
+ </all>
+ </complexType>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <element name="BulkCmIRP">
+ <complexType>
+ <complexContent>
+ <extension base="xn:NrmClassXmlType">
+ <sequence>
+ <element name="attributes" minOccurs="0">
+ <complexType>
+ <all>
+ <element name="irpVersion" minOccurs="0"/>
+ </all>
+ </complexType>
+ </element>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <element name="VsDataContainer">
+ <complexType>
+ <complexContent>
+ <extension base="xn:NrmClassXmlType">
+ <sequence>
+ <element name="attributes" minOccurs="0">
+ <complexType>
+ <all>
+ <element name="vsDataType" minOccurs="0"/>
+ <element name="vsDataFormatVersion" minOccurs="0"/>
+ <element ref="xn:vsData" minOccurs="0"/>
+ </all>
+ </complexType>
+ </element>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element ref="xn:VsDataContainer"/>
+ </choice>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <complexType name="vsData" abstract="true"/>
+ <!-- VsDataContainer NRM class vsData attribute associated empty XML element -->
+ <element name="vsData" type="xn:vsData" abstract="true"/>
+</schema>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/geranNrm.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/geranNrm.xsd
new file mode 100644
index 0000000000..b226eb2f4b
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/geranNrm.xsd
@@ -0,0 +1,63 @@
+<!--
+ 3GPP TS 32.615 v4.5 Bulk CM IRP
+ Configuration data file UTRAN Network Resources IRP NRM XML schema
+ To be used with WEGA Bucket 2.1 onwards
+-->
+<schema targetNamespace="geranNrm.xsd" xmlns:gn="geranNrm.xsd" xmlns:un="utranNrm.xsd" xmlns:xn="genericNrm.xsd" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+ <!-- GERAN Network Resources IRP NRM class associated XML elements -->
+ <import namespace="genericNrm.xsd" schemaLocation="genericNrm.xsd"/>
+ <import namespace="utranNrm.xsd" schemaLocation="utranNrm.xsd"/>
+ <element name="GsmRelation">
+ <complexType>
+ <complexContent>
+ <extension base="xn:NrmClassXmlType">
+ <sequence>
+ <element name="attributes" minOccurs="0">
+ <complexType>
+ <all><!--
+ <element name="relationType" minOccurs="0"/>
+ -->
+ <element name="adjacentCell" minOccurs="0"/>
+ </all>
+ </complexType>
+ </element>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element ref="xn:VsDataContainer"/>
+ </choice>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="ExternalGsmCell">
+ <complexType>
+ <complexContent>
+ <extension base="xn:NrmClassXmlType">
+ <sequence>
+ <element name="attributes" minOccurs="0">
+ <complexType>
+ <all>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="cellIdentity" minOccurs="0"/>
+ <element name="bcchFrequency" minOccurs="0"/>
+ <element name="ncc" minOccurs="0"/>
+ <element name="bcc" minOccurs="0"/>
+ <element name="lac" minOccurs="0"/>
+ <element name="mcc" minOccurs="0"/>
+ <element name="mnc" minOccurs="0"/>
+ <!--
+ <element name="rac" minOccurs="0"/>
+ <element name="racc" minOccurs="0"/>
+ -->
+ </all>
+ </complexType>
+ </element>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element ref="xn:VsDataContainer"/>
+ </choice>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+</schema>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/rnc.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/rnc.xml
new file mode 100644
index 0000000000..b6ca8b4fb1
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/rnc.xml
@@ -0,0 +1,23763 @@
+<?xml version="1.0" encoding="utf-8"?>
+<bulkCmConfigDataFile xmlns="configData.xsd" xmlns:xn="genericNrm.xsd" xmlns:gn="geranNrm.xsd" xmlns:un="utranNrm.xsd" xmlns:es="EricssonSpecificAttributes.5.1.xsd">
+ <fileHeader fileFormatVersion="32.615 V4.5" senderName="DC=a1.companyNN.com,SubNetwork=1,IRPAgent=1" vendorName="Company NN"/>
+ <configData dnPrefix="DC=a0.companyNN.com">
+<xn:SubNetwork id="WEOSSRC1_ROOT_MO_R">
+<xn:SubNetwork id="RNC33">
+<xn:MeContext id="SRNC001">
+
+
+<xn:ManagedElement id="1">
+<xn:attributes>
+
+<xn:userLabel>/proj/netsimproj/public/ftp/simulations/WRAN/R5/Standard/E/V2</xn:userLabel>
+</xn:attributes>
+
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSwManagement</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSwManagement />
+</xn:attributes>
+<xn:VsDataContainer id="scc_adm" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="scc_server" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="aal2ap13" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="sw_inst" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="spas_res" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="inet" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="ospf" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="aal05_ncc" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="aal_cc" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="phy_e1_mp" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="phy_stm1_mp" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="atmmp" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="aal2mp" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="aal2_adm" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="aal2ncc" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="aal0d_adm" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="aal0s_adm" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="aal5d_adm" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="aal5s_adm" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="usaal_adm" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="nsaal_adm" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="equip_mp" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="nss_mp" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="ip_util" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="spp_mp" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="http" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="jvm" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="ans_aal2rh_1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="ans_aal2disncc_12_1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="ans_aal2cpsrc_12_1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="ans_aal2ap_12_1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="RncRpuCenDh" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="RncRpuCenRh" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="RncRpuDh" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="RncRpuFro" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="RncRpuCenOm" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="RncRpuUe" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="RncRpuModOm" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="RncRpuRanap" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="RncRpuRnsap" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="RncRpuCenRnh" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="RncRpuCell" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataReliableProgramUniter</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataReliableProgramUniter>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataReliableProgramUniter>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataTransportNetwork</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataTransportNetwork>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataTransportNetwork>
+</xn:attributes><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal2Sp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataAal2Sp>
+
+<es:a2ea> </es:a2ea>
+<es:userLabel> </es:userLabel>
+</es:vsDataAal2Sp></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataAal2Sp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal2Sp>
+
+<es:a2ea> </es:a2ea>
+<es:userLabel> </es:userLabel>
+</es:vsDataAal2Sp>
+</xn:attributes><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal2Ap</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataAal2Ap>
+
+<es:aal2QoSCodePointProfileId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal2QosCodePointProfile=1</es:aal2QoSCodePointProfileId>
+<es:rpuId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataSwManagement=1,vsDataReliableProgramUniter=ans_aal2ap_12_1</es:rpuId>
+<es:secondarySigLinkId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalTp=b4qb</es:secondarySigLinkId>
+<es:sigLinkId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalTp=b4qa</es:sigLinkId>
+<es:timerErq>5000</es:timerErq>
+<es:timerRel>2000</es:timerRel>
+<es:userLabel> </es:userLabel>
+<es:allocationMode>0</es:allocationMode>
+</es:vsDataAal2Ap></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataAal2Ap</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal2Ap>
+
+<es:aal2QoSCodePointProfileId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal2QosCodePointProfile=1</es:aal2QoSCodePointProfileId>
+<es:rpuId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataSwManagement=1,vsDataReliableProgramUniter=ans_aal2ap_12_1</es:rpuId>
+<es:secondarySigLinkId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalTp=b4qb</es:secondarySigLinkId>
+<es:sigLinkId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalTp=b4qa</es:sigLinkId>
+<es:timerErq>5000</es:timerErq>
+<es:timerRel>2000</es:timerRel>
+<es:userLabel> </es:userLabel>
+<es:allocationMode>0</es:allocationMode>
+</es:vsDataAal2Ap>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal2PathDistributionUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal2PathDistributionUnit>
+
+<es:userLabel> </es:userLabel>
+<es:rpuId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataSwManagement=1,vsDataReliableProgramUniter=ans_aal2cpsrc_12_1</es:rpuId>
+
+<es:aal2PathVccTpList>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal2PathVccTp=b1a1</es:aal2PathVccTpList>
+</es:vsDataAal2PathDistributionUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer><xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal2Ap</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataAal2Ap>
+
+<es:aal2QoSCodePointProfileId>0</es:aal2QoSCodePointProfileId>
+<es:rpuId>0</es:rpuId>
+<es:secondarySigLinkId>0</es:secondarySigLinkId>
+<es:sigLinkId>0</es:sigLinkId>
+<es:timerErq>5000</es:timerErq>
+<es:timerRel>2000</es:timerRel>
+<es:userLabel> </es:userLabel>
+<es:allocationMode>0</es:allocationMode>
+</es:vsDataAal2Ap></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataAal2Ap</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal2Ap>
+
+<es:aal2QoSCodePointProfileId>0</es:aal2QoSCodePointProfileId>
+<es:rpuId>0</es:rpuId>
+<es:secondarySigLinkId>0</es:secondarySigLinkId>
+<es:sigLinkId>0</es:sigLinkId>
+<es:timerErq>5000</es:timerErq>
+<es:timerRel>2000</es:timerRel>
+<es:userLabel> </es:userLabel>
+<es:allocationMode>0</es:allocationMode>
+</es:vsDataAal2Ap>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal2PathDistributionUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal2PathDistributionUnit>
+
+<es:userLabel> </es:userLabel>
+<es:rpuId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataSwManagement=1,vsDataReliableProgramUniter=ans_aal2cpsrc_12_1</es:rpuId>
+
+<es:aal2PathVccTpList>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal2PathVccTp=b2a1</es:aal2PathVccTpList>
+</es:vsDataAal2PathDistributionUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer><xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal2Ap</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataAal2Ap>
+
+<es:aal2QoSCodePointProfileId>0</es:aal2QoSCodePointProfileId>
+<es:rpuId>0</es:rpuId>
+<es:secondarySigLinkId>0</es:secondarySigLinkId>
+<es:sigLinkId>0</es:sigLinkId>
+<es:timerErq>5000</es:timerErq>
+<es:timerRel>2000</es:timerRel>
+<es:userLabel> </es:userLabel>
+<es:allocationMode>0</es:allocationMode>
+</es:vsDataAal2Ap></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataAal2Ap</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal2Ap>
+
+<es:aal2QoSCodePointProfileId>0</es:aal2QoSCodePointProfileId>
+<es:rpuId>0</es:rpuId>
+<es:secondarySigLinkId>0</es:secondarySigLinkId>
+<es:sigLinkId>0</es:sigLinkId>
+<es:timerErq>5000</es:timerErq>
+<es:timerRel>2000</es:timerRel>
+<es:userLabel> </es:userLabel>
+<es:allocationMode>0</es:allocationMode>
+</es:vsDataAal2Ap>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal2PathDistributionUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal2PathDistributionUnit>
+
+<es:userLabel> </es:userLabel>
+<es:rpuId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataSwManagement=1,vsDataReliableProgramUniter=ans_aal2cpsrc_12_1</es:rpuId>
+
+<es:aal2PathVccTpList>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal2PathVccTp=b3a1</es:aal2PathVccTpList>
+</es:vsDataAal2PathDistributionUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer><xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal2Ap</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataAal2Ap>
+
+<es:aal2QoSCodePointProfileId>0</es:aal2QoSCodePointProfileId>
+<es:rpuId>0</es:rpuId>
+<es:secondarySigLinkId>0</es:secondarySigLinkId>
+<es:sigLinkId>0</es:sigLinkId>
+<es:timerErq>5000</es:timerErq>
+<es:timerRel>2000</es:timerRel>
+<es:userLabel> </es:userLabel>
+<es:allocationMode>0</es:allocationMode>
+</es:vsDataAal2Ap></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataAal2Ap</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal2Ap>
+
+<es:aal2QoSCodePointProfileId>0</es:aal2QoSCodePointProfileId>
+<es:rpuId>0</es:rpuId>
+<es:secondarySigLinkId>0</es:secondarySigLinkId>
+<es:sigLinkId>0</es:sigLinkId>
+<es:timerErq>5000</es:timerErq>
+<es:timerRel>2000</es:timerRel>
+<es:userLabel> </es:userLabel>
+<es:allocationMode>0</es:allocationMode>
+</es:vsDataAal2Ap>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal2PathDistributionUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal2PathDistributionUnit>
+
+<es:userLabel> </es:userLabel>
+<es:rpuId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataSwManagement=1,vsDataReliableProgramUniter=ans_aal2cpsrc_12_1</es:rpuId>
+
+<es:aal2PathVccTpList>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal2PathVccTp=b4a1</es:aal2PathVccTpList>
+</es:vsDataAal2PathDistributionUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+</xn:VsDataContainer><xn:VsDataContainer id="MS-24-1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=1,vsDataPlugInUnit=1,vsDataExchangeTerminal=ET-M4,vsDataOs155SpiTtp=1,vsDataSts3CspeTtp=1</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-24-1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=1,vsDataPlugInUnit=1,vsDataExchangeTerminal=ET-M4,vsDataOs155SpiTtp=1,vsDataSts3CspeTtp=1</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes><xn:VsDataContainer id="Vp1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVplTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataVplTp>
+
+<es:atmTrafficDescriptor>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptor>
+<es:externalVpi>1</es:externalVpi>
+<es:userLabel> </es:userLabel>
+</es:vsDataVplTp></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="Vp1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVplTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVplTp>
+
+<es:atmTrafficDescriptor>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptor>
+<es:externalVpi>1</es:externalVpi>
+<es:userLabel> </es:userLabel>
+</es:vsDataVplTp>
+</xn:attributes><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVpcTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataVpcTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:userLabel> </es:userLabel>
+<es:counterMode>0</es:counterMode>
+</es:vsDataVpcTp></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVpcTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVpcTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:userLabel> </es:userLabel>
+<es:counterMode>0</es:counterMode>
+</es:vsDataVpcTp>
+</xn:attributes>
+<xn:VsDataContainer id="vc34" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptorId>
+<es:externalVci>34</es:externalVci>
+<es:userLabel>used by Aal0 b1sa (NodeSynchTp1)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc35" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptorId>
+<es:externalVci>35</es:externalVci>
+<es:userLabel>used by Aal0 b1sb (NodeSynchTp2)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc36" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>36</es:externalVci>
+<es:userLabel>used by Aal5 b1ca (Nbap Common)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc37" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>37</es:externalVci>
+<es:userLabel>used by Aal5 b1da (Nbap Dedicated)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc38" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>38</es:externalVci>
+<es:userLabel>used by Aal5 b1qa (Aal2 signalling)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc39" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>39</es:externalVci>
+<es:userLabel>used by Aal2 b1a1 (Aal2Path)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc43" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C2P4000</es:atmTrafficDescriptorId>
+<es:externalVci>43</es:externalVci>
+<es:userLabel>used by Aal5 b1cb (Nbap Common)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc44" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>44</es:externalVci>
+<es:userLabel>used by Aal5 b1db (Nbap Dedicated)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc45" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>45</es:externalVci>
+<es:userLabel>used by Aal5 b1qb (Aal2 signalling)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc32-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>45</es:externalVci>
+<es:userLabel>used by Aal5 b1-x1 (IpAtmLink)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc33-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>33</es:externalVci>
+<es:userLabel>used by Aal5 b1-x2 (IpAtmLink)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc34-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptorId>
+<es:externalVci>340</es:externalVci>
+<es:userLabel>used by Aal0 b1sa-x (NodeSynchTp1)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc35-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptorId>
+<es:externalVci>350</es:externalVci>
+<es:userLabel>used by Aal0 b1sb-x (NodeSyncT2p)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+</xn:VsDataContainer><xn:VsDataContainer id="Vp2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVplTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataVplTp>
+
+<es:atmTrafficDescriptor>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptor>
+<es:externalVpi>2</es:externalVpi>
+<es:userLabel> </es:userLabel>
+</es:vsDataVplTp></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="Vp2" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVplTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVplTp>
+
+<es:atmTrafficDescriptor>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptor>
+<es:externalVpi>2</es:externalVpi>
+<es:userLabel> </es:userLabel>
+</es:vsDataVplTp>
+</xn:attributes><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVpcTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataVpcTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:userLabel> </es:userLabel>
+<es:counterMode>0</es:counterMode>
+</es:vsDataVpcTp></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVpcTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVpcTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:userLabel> </es:userLabel>
+<es:counterMode>0</es:counterMode>
+</es:vsDataVpcTp>
+</xn:attributes>
+<xn:VsDataContainer id="vc34" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptorId>
+<es:externalVci>34</es:externalVci>
+<es:userLabel>used by Aal0 b2sa (NodeSynchTp1)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc35" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptorId>
+<es:externalVci>35</es:externalVci>
+<es:userLabel>used by Aal0 b2sb (NodeSynchTp2)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc36" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>36</es:externalVci>
+<es:userLabel>used by Aal5 b2ca (Nbap Common)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc37" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>37</es:externalVci>
+<es:userLabel>used by Aal5 b2da (Nbap Dedicated)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc38" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>38</es:externalVci>
+<es:userLabel>used by Aal5 b2qa (Aal2 signalling)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc39" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>39</es:externalVci>
+<es:userLabel>used by Aal2 b2a1 (Aal2Path)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc43" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C2P4000</es:atmTrafficDescriptorId>
+<es:externalVci>43</es:externalVci>
+<es:userLabel>used by Aal5 b2cb (Nbap Common)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc44" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>44</es:externalVci>
+<es:userLabel>used by Aal5 b2db (Nbap Dedicated)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc45" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>45</es:externalVci>
+<es:userLabel>used by Aal5 b2qb (Aal2 signalling)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc32-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>45</es:externalVci>
+<es:userLabel>used by Aal5 b2-x1 (IpAtmLink)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc33-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>33</es:externalVci>
+<es:userLabel>used by Aal5 b2-x2 (IpAtmLink)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc34-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptorId>
+<es:externalVci>340</es:externalVci>
+<es:userLabel>used by Aal0 b2sa-x (NodeSynchTp1)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc35-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptorId>
+<es:externalVci>350</es:externalVci>
+<es:userLabel>used by Aal0 b2sb-x (NodeSyncT2p)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+</xn:VsDataContainer><xn:VsDataContainer id="Vp3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVplTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataVplTp>
+
+<es:atmTrafficDescriptor>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptor>
+<es:externalVpi>3</es:externalVpi>
+<es:userLabel> </es:userLabel>
+</es:vsDataVplTp></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="Vp3" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVplTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVplTp>
+
+<es:atmTrafficDescriptor>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptor>
+<es:externalVpi>3</es:externalVpi>
+<es:userLabel> </es:userLabel>
+</es:vsDataVplTp>
+</xn:attributes><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVpcTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataVpcTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:userLabel> </es:userLabel>
+<es:counterMode>0</es:counterMode>
+</es:vsDataVpcTp></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVpcTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVpcTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:userLabel> </es:userLabel>
+<es:counterMode>0</es:counterMode>
+</es:vsDataVpcTp>
+</xn:attributes>
+<xn:VsDataContainer id="vc34" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptorId>
+<es:externalVci>34</es:externalVci>
+<es:userLabel>used by Aal0 b3sa (NodeSynchTp1)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc35" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptorId>
+<es:externalVci>35</es:externalVci>
+<es:userLabel>used by Aal0 b3sb (NodeSynchTp2)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc36" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>36</es:externalVci>
+<es:userLabel>used by Aal5 b3ca (Nbap Common)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc37" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>37</es:externalVci>
+<es:userLabel>used by Aal5 b3da (Nbap Dedicated)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc38" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>38</es:externalVci>
+<es:userLabel>used by Aal5 b3qa (Aal2 signalling)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc39" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>39</es:externalVci>
+<es:userLabel>used by Aal2 b3a1 (Aal2Path)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc43" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C2P4000</es:atmTrafficDescriptorId>
+<es:externalVci>43</es:externalVci>
+<es:userLabel>used by Aal5 b3cb (Nbap Common)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc44" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>44</es:externalVci>
+<es:userLabel>used by Aal5 b3db (Nbap Dedicated)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc45" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>45</es:externalVci>
+<es:userLabel>used by Aal5 b3qb (Aal2 signalling)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc32-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>45</es:externalVci>
+<es:userLabel>used by Aal5 b3-x1 (IpAtmLink)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc33-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>33</es:externalVci>
+<es:userLabel>used by Aal5 b3-x2 (IpAtmLink)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc34-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptorId>
+<es:externalVci>340</es:externalVci>
+<es:userLabel>used by Aal0 b3sa-x (NodeSynchTp1)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc35-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptorId>
+<es:externalVci>350</es:externalVci>
+<es:userLabel>used by Aal0 b3sb-x (NodeSyncT2p)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+</xn:VsDataContainer><xn:VsDataContainer id="Vp4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVplTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataVplTp>
+
+<es:atmTrafficDescriptor>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptor>
+<es:externalVpi>4</es:externalVpi>
+<es:userLabel> </es:userLabel>
+</es:vsDataVplTp></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="Vp4" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVplTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVplTp>
+
+<es:atmTrafficDescriptor>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptor>
+<es:externalVpi>4</es:externalVpi>
+<es:userLabel> </es:userLabel>
+</es:vsDataVplTp>
+</xn:attributes><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVpcTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataVpcTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:userLabel> </es:userLabel>
+<es:counterMode>0</es:counterMode>
+</es:vsDataVpcTp></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVpcTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVpcTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:userLabel> </es:userLabel>
+<es:counterMode>0</es:counterMode>
+</es:vsDataVpcTp>
+</xn:attributes>
+<xn:VsDataContainer id="vc34" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptorId>
+<es:externalVci>34</es:externalVci>
+<es:userLabel>used by Aal0 b4sa (NodeSynchTp1)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc35" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptorId>
+<es:externalVci>35</es:externalVci>
+<es:userLabel>used by Aal0 b4sb (NodeSynchTp2)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc36" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>36</es:externalVci>
+<es:userLabel>used by Aal5 b4ca (Nbap Common)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc37" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>37</es:externalVci>
+<es:userLabel>used by Aal5 b4da (Nbap Dedicated)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc38" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>38</es:externalVci>
+<es:userLabel>used by Aal5 b4qa (Aal2 signalling)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc39" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>39</es:externalVci>
+<es:userLabel>used by Aal2 b4a1 (Aal2Path)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc43" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C2P4000</es:atmTrafficDescriptorId>
+<es:externalVci>43</es:externalVci>
+<es:userLabel>used by Aal5 b4cb (Nbap Common)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc44" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>44</es:externalVci>
+<es:userLabel>used by Aal5 b4db (Nbap Dedicated)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc45" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>45</es:externalVci>
+<es:userLabel>used by Aal5 b4qb (Aal2 signalling)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc32-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>45</es:externalVci>
+<es:userLabel>used by Aal5 b4-x1 (IpAtmLink)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc33-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=U3P1000M80</es:atmTrafficDescriptorId>
+<es:externalVci>33</es:externalVci>
+<es:userLabel>used by Aal5 b4-x2 (IpAtmLink)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc34-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptorId>
+<es:externalVci>340</es:externalVci>
+<es:userLabel>used by Aal0 b4sa-x (NodeSynchTp1)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="vc35-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataVclTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVclTp>
+
+<es:atmTrafficDescriptorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmTrafficDescriptor=C1P4528</es:atmTrafficDescriptorId>
+<es:externalVci>350</es:externalVci>
+<es:userLabel>used by Aal0 b4sb-x (NodeSyncT2p)</es:userLabel>
+</es:vsDataVclTp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-24-2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-24-3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-24-4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-24-5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-24-6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-24-7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-24-8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-25-1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-25-2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-25-3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-25-4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-25-5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-25-6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-25-7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-25-8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-26-1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-26-2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-26-3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-26-4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-26-5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-26-6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-26-7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-26-8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-27-1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-27-2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-27-3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-27-4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-27-5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-27-6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-27-7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS-27-8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmPort</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmPort>
+
+<es:userLabel> </es:userLabel>
+<es:uses>0</es:uses>
+<es:hecCorrectionMode>true</es:hecCorrectionMode>
+</es:vsDataAtmPort>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="ta1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataMspg</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataMspg>
+
+<es:userLabel> </es:userLabel>
+<es:degCauseMsp>false</es:degCauseMsp>
+<es:os155SpiStandbyId>0</es:os155SpiStandbyId>
+<es:os155SpiWorkingId>0</es:os155SpiWorkingId>
+</es:vsDataMspg>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="C1P4528" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmTrafficDescriptor</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmTrafficDescriptor>
+
+<es:egressAtmMcr>0</es:egressAtmMcr>
+<es:egressAtmPcr>0</es:egressAtmPcr>
+<es:egressAtmQos>1</es:egressAtmQos>
+<es:ingressAtmMcr>0</es:ingressAtmMcr>
+<es:ingressAtmPcr>0</es:ingressAtmPcr>
+<es:ingressAtmQos>1</es:ingressAtmQos>
+<es:serviceCategory>1</es:serviceCategory>
+<es:userLabel> </es:userLabel>
+<es:packetDiscard>false</es:packetDiscard>
+</es:vsDataAtmTrafficDescriptor>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="C1P5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmTrafficDescriptor</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmTrafficDescriptor>
+
+<es:egressAtmMcr>0</es:egressAtmMcr>
+<es:egressAtmPcr>0</es:egressAtmPcr>
+<es:egressAtmQos>1</es:egressAtmQos>
+<es:ingressAtmMcr>0</es:ingressAtmMcr>
+<es:ingressAtmPcr>0</es:ingressAtmPcr>
+<es:ingressAtmQos>1</es:ingressAtmQos>
+<es:serviceCategory>1</es:serviceCategory>
+<es:userLabel> </es:userLabel>
+<es:packetDiscard>false</es:packetDiscard>
+</es:vsDataAtmTrafficDescriptor>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="C2P4000" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmTrafficDescriptor</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmTrafficDescriptor>
+
+<es:egressAtmMcr>0</es:egressAtmMcr>
+<es:egressAtmPcr>0</es:egressAtmPcr>
+<es:egressAtmQos>1</es:egressAtmQos>
+<es:ingressAtmMcr>0</es:ingressAtmMcr>
+<es:ingressAtmPcr>0</es:ingressAtmPcr>
+<es:ingressAtmQos>1</es:ingressAtmQos>
+<es:serviceCategory>1</es:serviceCategory>
+<es:userLabel> </es:userLabel>
+<es:packetDiscard>false</es:packetDiscard>
+</es:vsDataAtmTrafficDescriptor>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="U3P1000M80" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAtmTrafficDescriptor</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAtmTrafficDescriptor>
+
+<es:egressAtmMcr>0</es:egressAtmMcr>
+<es:egressAtmPcr>0</es:egressAtmPcr>
+<es:egressAtmQos>1</es:egressAtmQos>
+<es:ingressAtmMcr>0</es:ingressAtmMcr>
+<es:ingressAtmPcr>0</es:ingressAtmPcr>
+<es:ingressAtmQos>1</es:ingressAtmQos>
+<es:serviceCategory>1</es:serviceCategory>
+<es:userLabel> </es:userLabel>
+<es:packetDiscard>false</es:packetDiscard>
+</es:vsDataAtmTrafficDescriptor>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b1da" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp1,vsDataVpcTp=1,vsDataVclTp=vc37</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b1ca" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp1,vsDataVpcTp=1,vsDataVclTp=vc36</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b1db" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp1,vsDataVpcTp=1,vsDataVclTp=vc44</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b1cb" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp1,vsDataVpcTp=1,vsDataVclTp=vc43</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b1-x1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp1,vsDataVpcTp=1,vsDataVclTp=vc32-x</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b1-x2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp1,vsDataVpcTp=1,vsDataVclTp=vc33-x</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b2da" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp2,vsDataVpcTp=1,vsDataVclTp=vc37</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b2ca" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp2,vsDataVpcTp=1,vsDataVclTp=vc36</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b2db" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp2,vsDataVpcTp=1,vsDataVclTp=vc44</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b2cb" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp2,vsDataVpcTp=1,vsDataVclTp=vc43</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b2-x1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp2,vsDataVpcTp=1,vsDataVclTp=vc32-x</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b2-x2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp2,vsDataVpcTp=1,vsDataVclTp=vc33-x</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b3da" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp3,vsDataVpcTp=1,vsDataVclTp=vc37</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b3ca" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp3,vsDataVpcTp=1,vsDataVclTp=vc36</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b3db" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp3,vsDataVpcTp=1,vsDataVclTp=vc44</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b3cb" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp3,vsDataVpcTp=1,vsDataVclTp=vc43</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b3-x1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp3,vsDataVpcTp=1,vsDataVclTp=vc32-x</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b3-x2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp3,vsDataVpcTp=1,vsDataVclTp=vc33-x</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b4da" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp4,vsDataVpcTp=1,vsDataVclTp=vc37</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b4ca" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp4,vsDataVpcTp=1,vsDataVclTp=vc36</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b4db" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp4,vsDataVpcTp=1,vsDataVclTp=vc44</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b4cb" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp4,vsDataVpcTp=1,vsDataVclTp=vc43</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b4-x1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp4,vsDataVpcTp=1,vsDataVclTp=vc32-x</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b4-x2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal5TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal5TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:fromUserMaxSduSize>1</es:fromUserMaxSduSize>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=24,vsDataPlugInUnit=1</es:processorId>
+<es:toUserMaxSduSize>1</es:toUserMaxSduSize>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp4,vsDataVpcTp=1,vsDataVclTp=vc33-x</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal5TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalProfile</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalProfile>
+
+<es:userLabel> </es:userLabel>
+<es:profileData>
+<es:congestionAbatement>60</es:congestionAbatement>
+<es:congestionOnSet>70</es:congestionOnSet>
+<es:initialCredit>250</es:initialCredit>
+<es:maxCC>4</es:maxCC>
+<es:maxPD>25</es:maxPD>
+<es:maxStat>67</es:maxStat>
+<es:timerCC>1000</es:timerCC>
+<es:timerIdle>15000</es:timerIdle>
+<es:timerKeepAlive>2000</es:timerKeepAlive>
+<es:timerNoResponse>7000</es:timerNoResponse>
+<es:timerPoll>750</es:timerPoll></es:profileData>
+</es:vsDataUniSaalProfile>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalProfile</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalProfile>
+
+<es:userLabel> </es:userLabel>
+<es:profileData>
+<es:congestionAbatement>60</es:congestionAbatement>
+<es:congestionOnSet>70</es:congestionOnSet>
+<es:initialCredit>250</es:initialCredit>
+<es:maxCC>4</es:maxCC>
+<es:maxPD>25</es:maxPD>
+<es:maxStat>67</es:maxStat>
+<es:timerCC>1000</es:timerCC>
+<es:timerIdle>15000</es:timerIdle>
+<es:timerKeepAlive>2000</es:timerKeepAlive>
+<es:timerNoResponse>7000</es:timerNoResponse>
+<es:timerPoll>750</es:timerPoll></es:profileData>
+</es:vsDataUniSaalProfile>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalProfile</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalProfile>
+
+<es:userLabel> </es:userLabel>
+<es:profileData>
+<es:congestionAbatement>60</es:congestionAbatement>
+<es:congestionOnSet>70</es:congestionOnSet>
+<es:initialCredit>250</es:initialCredit>
+<es:maxCC>4</es:maxCC>
+<es:maxPD>25</es:maxPD>
+<es:maxStat>67</es:maxStat>
+<es:timerCC>1000</es:timerCC>
+<es:timerIdle>15000</es:timerIdle>
+<es:timerKeepAlive>2000</es:timerKeepAlive>
+<es:timerNoResponse>7000</es:timerNoResponse>
+<es:timerPoll>750</es:timerPoll></es:profileData>
+</es:vsDataUniSaalProfile>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b1da" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b1da</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalProfile=1</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b1ca" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b1ca</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalProfile=1</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b1db" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b1db</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalProfile=1</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b1cb" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b1cb</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalProfile=1</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b1qa" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>0</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>0</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b1qb" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>0</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>0</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b2da" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b2da</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalProfile=1</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b2ca" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b2ca</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalProfile=1</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b2db" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b2db</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalProfile=1</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b2cb" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b2cb</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalProfile=1</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b2qa" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>0</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>0</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b2qb" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>0</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>0</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b3da" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b3da</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalProfile=1</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b3ca" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b3ca</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalProfile=1</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b3db" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b3db</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalProfile=1</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b3cb" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b3cb</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalProfile=1</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b3qa" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>0</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>0</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b3qb" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>0</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>0</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b4da" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b4da</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalProfile=1</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b4ca" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b4ca</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalProfile=1</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b4db" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b4db</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalProfile=1</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b4cb" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b4cb</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalProfile=1</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b4qa" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>0</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>0</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b4qb" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUniSaalTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUniSaalTp>
+
+<es:aal5TpVccTpId>0</es:aal5TpVccTpId>
+<es:maxSduSize>128</es:maxSduSize>
+<es:uniSaalProfileId>0</es:uniSaalProfileId>
+<es:userLabel> </es:userLabel>
+</es:vsDataUniSaalTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b1sa" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal0TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal0TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=4,vsDataPlugInUnit=1</es:processorId>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp1,vsDataVpcTp=1,vsDataVclTp=vc34</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal0TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b1sb" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal0TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal0TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=4,vsDataPlugInUnit=1</es:processorId>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp1,vsDataVpcTp=1,vsDataVclTp=vc35</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal0TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b1sa-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal0TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal0TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=4,vsDataPlugInUnit=1</es:processorId>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp1,vsDataVpcTp=1,vsDataVclTp=vc34-x</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal0TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b1sb-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal0TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal0TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=4,vsDataPlugInUnit=1</es:processorId>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp1,vsDataVpcTp=1,vsDataVclTp=vc35-x</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal0TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b2sa" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal0TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal0TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=4,vsDataPlugInUnit=1</es:processorId>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp2,vsDataVpcTp=1,vsDataVclTp=vc34</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal0TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b2sb" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal0TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal0TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=4,vsDataPlugInUnit=1</es:processorId>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp2,vsDataVpcTp=1,vsDataVclTp=vc35</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal0TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b2sa-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal0TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal0TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=4,vsDataPlugInUnit=1</es:processorId>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp2,vsDataVpcTp=1,vsDataVclTp=vc34-x</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal0TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b2sb-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal0TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal0TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=4,vsDataPlugInUnit=1</es:processorId>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp2,vsDataVpcTp=1,vsDataVclTp=vc35-x</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal0TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b3sa" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal0TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal0TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=4,vsDataPlugInUnit=1</es:processorId>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp3,vsDataVpcTp=1,vsDataVclTp=vc34</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal0TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b3sb" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal0TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal0TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=4,vsDataPlugInUnit=1</es:processorId>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp3,vsDataVpcTp=1,vsDataVclTp=vc35</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal0TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b3sa-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal0TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal0TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=4,vsDataPlugInUnit=1</es:processorId>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp3,vsDataVpcTp=1,vsDataVclTp=vc34-x</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal0TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b3sb-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal0TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal0TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=4,vsDataPlugInUnit=1</es:processorId>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp3,vsDataVpcTp=1,vsDataVclTp=vc35-x</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal0TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b4sa" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal0TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal0TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=4,vsDataPlugInUnit=1</es:processorId>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp4,vsDataVpcTp=1,vsDataVclTp=vc34</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal0TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b4sb" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal0TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal0TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=4,vsDataPlugInUnit=1</es:processorId>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp4,vsDataVpcTp=1,vsDataVclTp=vc35</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal0TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b4sa-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal0TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal0TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=4,vsDataPlugInUnit=1</es:processorId>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp4,vsDataVpcTp=1,vsDataVclTp=vc34-x</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal0TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b4sb-x" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal0TpVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal0TpVccTp>
+
+<es:alarmReport>2</es:alarmReport>
+<es:continuityCheck>false</es:continuityCheck>
+<es:nomPmBlkSize>1024</es:nomPmBlkSize>
+<es:processorId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataEquipment=1,vsDataSubrack=MS,vsDataSlot=4,vsDataPlugInUnit=1</es:processorId>
+<es:userLabel> </es:userLabel>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp4,vsDataVpcTp=1,vsDataVclTp=vc35-x</es:vclTpId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal0TpVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b1a1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal2PathVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal2PathVccTp>
+
+<es:aal2PathOwner>true</es:aal2PathOwner>
+<es:alarmReport>2</es:alarmReport>
+<es:nomPmBlocksize>1024</es:nomPmBlocksize>
+<es:timerCu>10</es:timerCu>
+<es:userLabel> </es:userLabel>
+<es:administrativeState>1</es:administrativeState>
+<es:continuityCheck>false</es:continuityCheck>
+<es:aal2PathId>1</es:aal2PathId>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp1,vsDataVpcTp=1,vsDataVclTp=vc39</es:vclTpId>
+<es:aal2QoSAvailableProfiles>15</es:aal2QoSAvailableProfiles>
+<es:aal2QoSProfileId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal2QosProfile=1</es:aal2QoSProfileId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal2PathVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b2a1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal2PathVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal2PathVccTp>
+
+<es:aal2PathOwner>true</es:aal2PathOwner>
+<es:alarmReport>2</es:alarmReport>
+<es:nomPmBlocksize>1024</es:nomPmBlocksize>
+<es:timerCu>10</es:timerCu>
+<es:userLabel> </es:userLabel>
+<es:administrativeState>1</es:administrativeState>
+<es:continuityCheck>false</es:continuityCheck>
+<es:aal2PathId>1</es:aal2PathId>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp2,vsDataVpcTp=1,vsDataVclTp=vc39</es:vclTpId>
+<es:aal2QoSAvailableProfiles>15</es:aal2QoSAvailableProfiles>
+<es:aal2QoSProfileId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal2QosProfile=1</es:aal2QoSProfileId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal2PathVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b3a1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal2PathVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal2PathVccTp>
+
+<es:aal2PathOwner>true</es:aal2PathOwner>
+<es:alarmReport>2</es:alarmReport>
+<es:nomPmBlocksize>1024</es:nomPmBlocksize>
+<es:timerCu>10</es:timerCu>
+<es:userLabel> </es:userLabel>
+<es:administrativeState>1</es:administrativeState>
+<es:continuityCheck>false</es:continuityCheck>
+<es:aal2PathId>1</es:aal2PathId>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp3,vsDataVpcTp=1,vsDataVclTp=vc39</es:vclTpId>
+<es:aal2QoSAvailableProfiles>15</es:aal2QoSAvailableProfiles>
+<es:aal2QoSProfileId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal2QosProfile=1</es:aal2QoSProfileId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal2PathVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="b4a1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal2PathVccTp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal2PathVccTp>
+
+<es:aal2PathOwner>true</es:aal2PathOwner>
+<es:alarmReport>2</es:alarmReport>
+<es:nomPmBlocksize>1024</es:nomPmBlocksize>
+<es:timerCu>10</es:timerCu>
+<es:userLabel> </es:userLabel>
+<es:administrativeState>1</es:administrativeState>
+<es:continuityCheck>false</es:continuityCheck>
+<es:aal2PathId>1</es:aal2PathId>
+<es:vclTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAtmPort=MS-24-1,vsDataVplTp=Vp4,vsDataVpcTp=1,vsDataVclTp=vc39</es:vclTpId>
+<es:aal2QoSAvailableProfiles>15</es:aal2QoSAvailableProfiles>
+<es:aal2QoSProfileId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal2QosProfile=1</es:aal2QoSProfileId>
+<es:counterMode>6</es:counterMode>
+<es:counterActivation>false</es:counterActivation>
+</es:vsDataAal2PathVccTp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal2QosProfile</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal2QosProfile>
+
+<es:profileClassA>
+<es:boundOnProbOfDelay>500000</es:boundOnProbOfDelay>
+<es:boundOnProbOfLoss>500000</es:boundOnProbOfLoss>
+<es:boundOnNodeDelay>5000</es:boundOnNodeDelay></es:profileClassA>
+<es:profileClassB>
+<es:boundOnProbOfDelay>500000</es:boundOnProbOfDelay>
+<es:boundOnProbOfLoss>500000</es:boundOnProbOfLoss>
+<es:boundOnNodeDelay>15000</es:boundOnNodeDelay></es:profileClassB>
+<es:profileClassC>
+<es:boundOnProbOfDelay>1000000000</es:boundOnProbOfDelay>
+<es:boundOnProbOfLoss>1000000000</es:boundOnProbOfLoss>
+<es:boundOnNodeDelay>25000</es:boundOnNodeDelay></es:profileClassC>
+<es:profileClassD>
+<es:boundOnProbOfDelay>1000000000</es:boundOnProbOfDelay>
+<es:boundOnProbOfLoss>1000000000</es:boundOnProbOfLoss>
+<es:boundOnNodeDelay>50000</es:boundOnNodeDelay></es:profileClassD>
+<es:userLabel> </es:userLabel>
+</es:vsDataAal2QosProfile>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal2QosCodePointProfile</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal2QosCodePointProfile>
+
+<es:userLabel> </es:userLabel>
+<es:qualityOfServiceCodePointA>0</es:qualityOfServiceCodePointA>
+<es:qualityOfServiceCodePointB>0</es:qualityOfServiceCodePointB>
+<es:qualityOfServiceCodePointC>0</es:qualityOfServiceCodePointC>
+<es:qualityOfServiceCodePointD>0</es:qualityOfServiceCodePointD>
+</es:vsDataAal2QosCodePointProfile>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataAal2RoutingCase</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataAal2RoutingCase>
+
+<es:userLabel> </es:userLabel>
+<es:numberDirection> </es:numberDirection>
+<es:routeList></es:routeList>
+<es:routePriorityList></es:routePriorityList>
+</es:vsDataAal2RoutingCase>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataIpSystem</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIpSystem>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataIpSystem>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataEquipment</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataEquipment />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSpDevicePool</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSpDevicePool />
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSpDevicePool</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSpDevicePool />
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSpDevicePool</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSpDevicePool />
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="MS" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSubrack</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSubrack />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes><xn:VsDataContainer id="ET-M4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataExchangeTerminal</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataExchangeTerminal>
+
+
+<es:userLabel> </es:userLabel>
+</es:vsDataExchangeTerminal></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="ET-M4" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataExchangeTerminal</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataExchangeTerminal>
+
+
+<es:userLabel> </es:userLabel>
+</es:vsDataExchangeTerminal>
+</xn:attributes><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataOs155SpiTtp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataOs155SpiTtp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:lineNo>1</es:lineNo>
+<es:standardMode>0</es:standardMode>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+<es:muxMode>0</es:muxMode>
+<es:msDegThreshold>30</es:msDegThreshold>
+<es:msDegM>7</es:msDegM>
+<es:msRdiReporting>false</es:msRdiReporting>
+<es:msAisReporting>false</es:msAisReporting>
+<es:loopBack>0</es:loopBack>
+</es:vsDataOs155SpiTtp></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataOs155SpiTtp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataOs155SpiTtp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:lineNo>1</es:lineNo>
+<es:standardMode>0</es:standardMode>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+<es:muxMode>0</es:muxMode>
+<es:msDegThreshold>30</es:msDegThreshold>
+<es:msDegM>7</es:msDegM>
+<es:msRdiReporting>false</es:msRdiReporting>
+<es:msAisReporting>false</es:msAisReporting>
+<es:loopBack>0</es:loopBack>
+</es:vsDataOs155SpiTtp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc4Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc4Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:pathTraceFormat>16</es:pathTraceFormat>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:auAisReporting>false</es:auAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+</es:vsDataVc4Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="11" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="12" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="13" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="14" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="15" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="16" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="17" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="18" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="19" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="20" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="21" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="22" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="23" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="24" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="25" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="26" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="27" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="28" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="29" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="30" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="31" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="32" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="33" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="34" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="35" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="36" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="37" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="38" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="39" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="40" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="41" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="42" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="43" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="44" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="45" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="46" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="47" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="48" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="49" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="50" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="51" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="52" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="53" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="54" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="55" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="56" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="57" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="58" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="59" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="60" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="61" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="62" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="63" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVc12Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVc12Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:vcDegThreshold>30</es:vcDegThreshold>
+<es:vcDegM>7</es:vcDegM>
+<es:tuAisReporting>false</es:tuAisReporting>
+<es:vcRdiReporting>false</es:vcRdiReporting>
+<es:administrativeState>0</es:administrativeState>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataVc12Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataE1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSts3CspeTtp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataSts3CspeTtp>
+
+<es:userLabel> </es:userLabel>
+<es:aisPReporting>false</es:aisPReporting>
+<es:rdiPReporting>false</es:rdiPReporting>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+</es:vsDataSts3CspeTtp>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSts1SpeTtp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataSts1SpeTtp>
+
+<es:userLabel> </es:userLabel>
+<es:aisPReporting>false</es:aisPReporting>
+<es:rdiPReporting>false</es:rdiPReporting>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+</es:vsDataSts1SpeTtp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="11" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="12" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="13" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="14" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="15" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="16" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="17" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="18" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="19" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="20" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="21" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="22" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="23" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="24" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="25" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="26" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="27" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="28" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSts1SpeTtp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataSts1SpeTtp>
+
+<es:userLabel> </es:userLabel>
+<es:aisPReporting>false</es:aisPReporting>
+<es:rdiPReporting>false</es:rdiPReporting>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+</es:vsDataSts1SpeTtp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="11" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="12" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="13" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="14" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="15" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="16" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="17" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="18" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="19" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="20" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="21" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="22" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="23" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="24" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="25" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="26" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="27" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="28" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSts1SpeTtp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataSts1SpeTtp>
+
+<es:userLabel> </es:userLabel>
+<es:aisPReporting>false</es:aisPReporting>
+<es:rdiPReporting>false</es:rdiPReporting>
+<es:timConsequentAction>false</es:timConsequentAction>
+<es:expectedPathTrace> </es:expectedPathTrace>
+<es:transmittedPathTrace> </es:transmittedPathTrace>
+</es:vsDataSts1SpeTtp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="11" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="12" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="13" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="14" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="15" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="16" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="17" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="18" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="19" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="20" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="21" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="22" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="23" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="24" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="25" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="26" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="27" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="28" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataVt15Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataVt15Ttp>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:aisVreporting>false</es:aisVreporting>
+<es:rdiVreporting>false</es:rdiVreporting>
+<es:shutDownTimer>1800</es:shutDownTimer>
+</es:vsDataVt15Ttp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataT1Ttp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1Ttp>
+
+<es:userLabel> </es:userLabel>
+<es:aisReporting>false</es:aisReporting>
+<es:rdiReporting>false</es:rdiReporting>
+<es:idlePattern>0</es:idlePattern>
+</es:vsDataT1Ttp>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="ta1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataE3PhysPathTerm</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE3PhysPathTerm>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+<es:lineNo>1</es:lineNo>
+<es:loopback>0</es:loopback>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:rdiReporting>false</es:rdiReporting>
+<es:aisReporting>false</es:aisReporting>
+</es:vsDataE3PhysPathTerm>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="ta1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataT3PhysPathTerm</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT3PhysPathTerm>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+<es:lineNo>1</es:lineNo>
+<es:loopback>0</es:loopback>
+<es:rdiReporting>false</es:rdiReporting>
+<es:aisReporting>false</es:aisReporting>
+</es:vsDataT3PhysPathTerm>
+</xn:attributes>
+</xn:VsDataContainer><xn:VsDataContainer id="ta1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataE1PhysPathTerm</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataE1PhysPathTerm>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:lineNo>1</es:lineNo>
+<es:loopback>0</es:loopback>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:rdiReporting>false</es:rdiReporting>
+<es:aisReporting>false</es:aisReporting>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataE1PhysPathTerm></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="ta1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataE1PhysPathTerm</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataE1PhysPathTerm>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:lineNo>1</es:lineNo>
+<es:loopback>0</es:loopback>
+<es:crc4Mode>1</es:crc4Mode>
+<es:idlePattern>0</es:idlePattern>
+<es:degDegThr>30</es:degDegThr>
+<es:degDegM>7</es:degDegM>
+<es:rdiReporting>false</es:rdiReporting>
+<es:aisReporting>false</es:aisReporting>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataE1PhysPathTerm>
+</xn:attributes>
+<xn:VsDataContainer id="ta1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataDs0Bundle</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataDs0Bundle>
+
+<es:userLabel> </es:userLabel>
+<es:listOfTimeSlots></es:listOfTimeSlots>
+<es:tdmMode>true</es:tdmMode>
+</es:vsDataDs0Bundle>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="ta1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataJ1PhysPathTerm</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataJ1PhysPathTerm>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:lineNo>1</es:lineNo>
+<es:loopback>0</es:loopback>
+<es:idlePattern>0</es:idlePattern>
+<es:physicalLineType>0</es:physicalLineType>
+<es:degThreshold>6</es:degThreshold>
+<es:rdiReporting>false</es:rdiReporting>
+<es:aisReporting>false</es:aisReporting>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+</es:vsDataJ1PhysPathTerm>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="ta1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataT1PhysPathTerm</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataT1PhysPathTerm>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:lineNo>1</es:lineNo>
+<es:loopback>0</es:loopback>
+<es:rdiReporting>false</es:rdiReporting>
+<es:aisReporting>false</es:aisReporting>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+<es:idlePattern>0</es:idlePattern>
+<es:transmissionMode>0</es:transmissionMode>
+</es:vsDataT1PhysPathTerm>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer><xn:VsDataContainer id="ta1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataEtMfg</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataEtMfg>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataEtMfg></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="ta1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataEtMfg</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataEtMfg>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataEtMfg>
+</xn:attributes>
+<xn:VsDataContainer id="ta1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGigaBitEthernet</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGigaBitEthernet>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:dscpPbitMap></es:dscpPbitMap>
+<es:autoNegotiation>true</es:autoNegotiation>
+<es:frameFormat>0</es:frameFormat>
+<es:primaryLink>0</es:primaryLink>
+<es:protectiveMode>true</es:protectiveMode>
+<es:shutDownTimeout>1800</es:shutDownTimeout>
+<es:statePropagationDelay>25</es:statePropagationDelay>
+<es:switchBackTimer>30</es:switchBackTimer>
+</es:vsDataGigaBitEthernet>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer><xn:VsDataContainer id="ta1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGeneralProcessorUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataGeneralProcessorUnit>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataGeneralProcessorUnit></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="ta1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataGeneralProcessorUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGeneralProcessorUnit>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataGeneralProcessorUnit>
+</xn:attributes>
+<xn:VsDataContainer id="ta1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataFastEthernet</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataFastEthernet>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel> </es:userLabel>
+<es:defaultRouter> </es:defaultRouter>
+<es:mtu>1500</es:mtu>
+<es:networkPrefixLength>0</es:networkPrefixLength>
+</es:vsDataFastEthernet>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="ta1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataMediumAccessUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataMediumAccessUnit>
+
+<es:userLabel> </es:userLabel>
+<es:connectorLabel>Eth</es:connectorLabel>
+</es:vsDataMediumAccessUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="11" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="12" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="13" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="14" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="15" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="16" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="17" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="18" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="19" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="20" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="21" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="22" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="23" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="24" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="25" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="26" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="27" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="28" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSlot</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSlot />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPlugInUnit</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPlugInUnit>
+
+<es:administrativeState>0</es:administrativeState>
+<es:allowedSeqRestarts>3</es:allowedSeqRestarts>
+<es:piuGroupNumber>0</es:piuGroupNumber>
+<es:piuType>0</es:piuType>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataPlugInUnit>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSystemFunctions</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataSystemFunctions />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataPmService</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPmService>
+
+<es:minorAlarmCeasingDelta>5</es:minorAlarmCeasingDelta>
+<es:warningAlarmLimitPercent>80</es:warningAlarmLimitPercent>
+<es:warningAlarmCeasingDelta>5</es:warningAlarmCeasingDelta>
+</es:vsDataPmService>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataLicensing</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataLicensing />
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataRncFeature</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataRncFeature>
+
+<es:featureState>0</es:featureState>
+
+
+
+
+</es:vsDataRncFeature>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataIpOam</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIpOam>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataIpOam>
+</xn:attributes><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataIp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataIp>
+
+<es:dnsServer>127.0.0.1</es:dnsServer>
+<es:isRecursiveSearch>true</es:isRecursiveSearch>
+<es:isSubDomainName>true</es:isSubDomainName>
+<es:userLabel> </es:userLabel>
+<es:retransInterval>4</es:retransInterval>
+<es:noOfRetrans>5</es:noOfRetrans>
+<es:isDefDomainName>false</es:isDefDomainName>
+<es:defDomainName> </es:defDomainName>
+<es:useHostFile>true</es:useHostFile>
+<es:dscp>0</es:dscp>
+<es:icmpRedirect>true</es:icmpRedirect>
+<es:udpChecksumState>1</es:udpChecksumState>
+<es:connectionAttemptTimer>75</es:connectionAttemptTimer>
+<es:maxRetransmissionAttempts>10</es:maxRetransmissionAttempts>
+<es:workingMode>0</es:workingMode>
+</es:vsDataIp></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataIp</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIp>
+
+<es:dnsServer>127.0.0.1</es:dnsServer>
+<es:isRecursiveSearch>true</es:isRecursiveSearch>
+<es:isSubDomainName>true</es:isSubDomainName>
+<es:userLabel> </es:userLabel>
+<es:retransInterval>4</es:retransInterval>
+<es:noOfRetrans>5</es:noOfRetrans>
+<es:isDefDomainName>false</es:isDefDomainName>
+<es:defDomainName> </es:defDomainName>
+<es:useHostFile>true</es:useHostFile>
+<es:dscp>0</es:dscp>
+<es:icmpRedirect>true</es:icmpRedirect>
+<es:udpChecksumState>1</es:udpChecksumState>
+<es:connectionAttemptTimer>75</es:connectionAttemptTimer>
+<es:maxRetransmissionAttempts>10</es:maxRetransmissionAttempts>
+<es:workingMode>0</es:workingMode>
+</es:vsDataIp>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataIpRoutingTable</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIpRoutingTable>
+
+
+<es:userLabel> </es:userLabel>
+</es:vsDataIpRoutingTable>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataEthernetLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataEthernetLink>
+
+<es:ipAddress> </es:ipAddress>
+<es:subnetMask> </es:subnetMask>
+<es:broadcastAddress> </es:broadcastAddress>
+
+
+<es:metric>1</es:metric>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataEthernetLink>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataIpAtmLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIpAtmLink>
+
+
+<es:ipAddress> </es:ipAddress>
+<es:metric>1</es:metric>
+<es:monitor>true</es:monitor>
+<es:monitorInterval>10</es:monitorInterval>
+<es:monitorRetries>10</es:monitorRetries>
+<es:mtuSize>1500</es:mtuSize>
+<es:subnetMask> </es:subnetMask>
+<es:userLabel> </es:userLabel>
+<es:aal5TpVccTpId>0</es:aal5TpVccTpId>
+</es:vsDataIpAtmLink>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1-1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataIpAtmLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIpAtmLink>
+
+
+<es:ipAddress> </es:ipAddress>
+<es:metric>1</es:metric>
+<es:monitor>true</es:monitor>
+<es:monitorInterval>10</es:monitorInterval>
+<es:monitorRetries>10</es:monitorRetries>
+<es:mtuSize>1500</es:mtuSize>
+<es:subnetMask> </es:subnetMask>
+<es:userLabel> </es:userLabel>
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b1-x1</es:aal5TpVccTpId>
+</es:vsDataIpAtmLink>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1-2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataIpAtmLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIpAtmLink>
+
+
+<es:ipAddress> </es:ipAddress>
+<es:metric>1</es:metric>
+<es:monitor>true</es:monitor>
+<es:monitorInterval>10</es:monitorInterval>
+<es:monitorRetries>10</es:monitorRetries>
+<es:mtuSize>1500</es:mtuSize>
+<es:subnetMask> </es:subnetMask>
+<es:userLabel> </es:userLabel>
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b1-x2</es:aal5TpVccTpId>
+</es:vsDataIpAtmLink>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2-1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataIpAtmLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIpAtmLink>
+
+
+<es:ipAddress> </es:ipAddress>
+<es:metric>1</es:metric>
+<es:monitor>true</es:monitor>
+<es:monitorInterval>10</es:monitorInterval>
+<es:monitorRetries>10</es:monitorRetries>
+<es:mtuSize>1500</es:mtuSize>
+<es:subnetMask> </es:subnetMask>
+<es:userLabel> </es:userLabel>
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b2-x1</es:aal5TpVccTpId>
+</es:vsDataIpAtmLink>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2-2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataIpAtmLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIpAtmLink>
+
+
+<es:ipAddress> </es:ipAddress>
+<es:metric>1</es:metric>
+<es:monitor>true</es:monitor>
+<es:monitorInterval>10</es:monitorInterval>
+<es:monitorRetries>10</es:monitorRetries>
+<es:mtuSize>1500</es:mtuSize>
+<es:subnetMask> </es:subnetMask>
+<es:userLabel> </es:userLabel>
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b2-x2</es:aal5TpVccTpId>
+</es:vsDataIpAtmLink>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3-1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataIpAtmLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIpAtmLink>
+
+
+<es:ipAddress> </es:ipAddress>
+<es:metric>1</es:metric>
+<es:monitor>true</es:monitor>
+<es:monitorInterval>10</es:monitorInterval>
+<es:monitorRetries>10</es:monitorRetries>
+<es:mtuSize>1500</es:mtuSize>
+<es:subnetMask> </es:subnetMask>
+<es:userLabel> </es:userLabel>
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b3-x1</es:aal5TpVccTpId>
+</es:vsDataIpAtmLink>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3-2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataIpAtmLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIpAtmLink>
+
+
+<es:ipAddress> </es:ipAddress>
+<es:metric>1</es:metric>
+<es:monitor>true</es:monitor>
+<es:monitorInterval>10</es:monitorInterval>
+<es:monitorRetries>10</es:monitorRetries>
+<es:mtuSize>1500</es:mtuSize>
+<es:subnetMask> </es:subnetMask>
+<es:userLabel> </es:userLabel>
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b3-x2</es:aal5TpVccTpId>
+</es:vsDataIpAtmLink>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4-1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataIpAtmLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIpAtmLink>
+
+
+<es:ipAddress> </es:ipAddress>
+<es:metric>1</es:metric>
+<es:monitor>true</es:monitor>
+<es:monitorInterval>10</es:monitorInterval>
+<es:monitorRetries>10</es:monitorRetries>
+<es:mtuSize>1500</es:mtuSize>
+<es:subnetMask> </es:subnetMask>
+<es:userLabel> </es:userLabel>
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b4-x1</es:aal5TpVccTpId>
+</es:vsDataIpAtmLink>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4-2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataIpAtmLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIpAtmLink>
+
+
+<es:ipAddress> </es:ipAddress>
+<es:metric>1</es:metric>
+<es:monitor>true</es:monitor>
+<es:monitorInterval>10</es:monitorInterval>
+<es:monitorRetries>10</es:monitorRetries>
+<es:mtuSize>1500</es:mtuSize>
+<es:subnetMask> </es:subnetMask>
+<es:userLabel> </es:userLabel>
+<es:aal5TpVccTpId>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataAal5TpVccTp=b4-x2</es:aal5TpVccTpId>
+</es:vsDataIpAtmLink>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataOspf</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataOspf>
+
+<es:ipMo>0</es:ipMo>
+<es:ospfASBdrRtrStatus>false</es:ospfASBdrRtrStatus>
+
+<es:ospfRouterId> </es:ospfRouterId>
+<es:recoverTopoDb>true</es:recoverTopoDb>
+<es:topoDbStoreInterv>60</es:topoDbStoreInterv>
+<es:userLabel> </es:userLabel>
+<es:administrativeState>0</es:administrativeState>
+</es:vsDataOspf></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataOspf</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataOspf>
+
+<es:ipMo>0</es:ipMo>
+<es:ospfASBdrRtrStatus>false</es:ospfASBdrRtrStatus>
+
+<es:ospfRouterId> </es:ospfRouterId>
+<es:recoverTopoDb>true</es:recoverTopoDb>
+<es:topoDbStoreInterv>60</es:topoDbStoreInterv>
+<es:userLabel> </es:userLabel>
+<es:administrativeState>0</es:administrativeState>
+</es:vsDataOspf>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataOspfInterface</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataOspfInterface>
+
+<es:helloInterval>10</es:helloInterval>
+<es:interfacePriority>1</es:interfacePriority>
+<es:interfaceTransitDelay>1</es:interfaceTransitDelay>
+<es:lsaTransmissionInterval>5</es:lsaTransmissionInterval>
+<es:ospfAreaRelated>0</es:ospfAreaRelated>
+<es:relatedLink>0</es:relatedLink>
+<es:routerDeadInterval>40</es:routerDeadInterval>
+<es:userLabel> </es:userLabel>
+</es:vsDataOspfInterface>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataOspfArea</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataOspfArea>
+
+<es:areaId> </es:areaId>
+
+<es:importExternalLsa>true</es:importExternalLsa>
+<es:sendAreaSummary>false</es:sendAreaSummary>
+<es:stubArea>false</es:stubArea>
+<es:stubAreaMetric>1</es:stubAreaMetric>
+<es:stubAreaMetricType>0</es:stubAreaMetricType>
+<es:userLabel> </es:userLabel>
+<es:range0>
+<es:ipAddress></es:ipAddress>
+<es:subnetMask></es:subnetMask>
+<es:advertise>true</es:advertise></es:range0>
+
+
+</es:vsDataOspfArea>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<un:RncFunction id="1" modifier="update">
+<un:attributes>
+
+<un:userLabel>/proj/netsimproj/public/ftp/simulations/WRAN/R5/Standard/E/V2</un:userLabel>
+<un:mcc>353</un:mcc>
+<un:mnc>77</un:mnc>
+<un:rncId>1</un:rncId>
+</un:attributes>
+
+<un:IubLink id="1" modifier="create">
+<un:attributes>
+
+</un:attributes>
+</un:IubLink>
+
+<un:IubLink id="1" modifier="update">
+
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataIubLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIubLink>
+
+<es:rbsId>1</es:rbsId>
+<es:dlHwAdm>100</es:dlHwAdm>
+<es:ulHwAdm>100</es:ulHwAdm>
+
+<es:preferredSubrackRef>0</es:preferredSubrackRef>
+<es:userPlaneTransportOption>
+<es:atm>0</es:atm>
+<es:ipv4>0</es:ipv4></es:userPlaneTransportOption>
+</es:vsDataIubLink>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataNodeSynch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataNodeSynch>
+
+<es:userLabel> </es:userLabel>
+<es:phaseDiffThreshold>100</es:phaseDiffThreshold>
+
+
+<es:sampleIntervalSup>10</es:sampleIntervalSup>
+<es:fixedWindowSizeSup>10</es:fixedWindowSizeSup>
+<es:slidingWindowSize>100</es:slidingWindowSize>
+</es:vsDataNodeSynch>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataNbapCommon</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataNbapCommon>
+
+<es:userLabel> </es:userLabel>
+<es:l2EstablishReqRetryT>5</es:l2EstablishReqRetryT>
+<es:activeUniSaalTpRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalTp=b1ca</es:activeUniSaalTpRef>
+<es:standbyUniSaalTpRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalTp=b1cb</es:standbyUniSaalTpRef>
+<es:administrativeState>0</es:administrativeState>
+</es:vsDataNbapCommon>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataNbapDedicated</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataNbapDedicated>
+
+<es:l2EstablishReqRetryT>5</es:l2EstablishReqRetryT>
+<es:activeUniSaalTpRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalTp=b1da</es:activeUniSaalTpRef>
+<es:standbyUniSaalTpRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalTp=b1db</es:standbyUniSaalTpRef>
+<es:userLabel> </es:userLabel>
+<es:administrativeState>0</es:administrativeState>
+</es:vsDataNbapDedicated>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataIubEdch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIubEdch>
+
+<es:edchDataFrameDelayThreshold>60</es:edchDataFrameDelayThreshold>
+</es:vsDataIubEdch>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer></un:IubLink>
+<un:IubLink id="2" modifier="create">
+<un:attributes>
+
+</un:attributes>
+</un:IubLink>
+
+<un:IubLink id="2" modifier="update">
+
+<xn:VsDataContainer id="2" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataIubLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIubLink>
+
+<es:rbsId>2</es:rbsId>
+<es:dlHwAdm>100</es:dlHwAdm>
+<es:ulHwAdm>100</es:ulHwAdm>
+
+<es:preferredSubrackRef>0</es:preferredSubrackRef>
+<es:userPlaneTransportOption>
+<es:atm>0</es:atm>
+<es:ipv4>0</es:ipv4></es:userPlaneTransportOption>
+</es:vsDataIubLink>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataNodeSynch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataNodeSynch>
+
+<es:userLabel> </es:userLabel>
+<es:phaseDiffThreshold>100</es:phaseDiffThreshold>
+
+
+<es:sampleIntervalSup>10</es:sampleIntervalSup>
+<es:fixedWindowSizeSup>10</es:fixedWindowSizeSup>
+<es:slidingWindowSize>100</es:slidingWindowSize>
+</es:vsDataNodeSynch>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataNbapCommon</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataNbapCommon>
+
+<es:userLabel> </es:userLabel>
+<es:l2EstablishReqRetryT>5</es:l2EstablishReqRetryT>
+<es:activeUniSaalTpRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalTp=b2ca</es:activeUniSaalTpRef>
+<es:standbyUniSaalTpRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalTp=b2cb</es:standbyUniSaalTpRef>
+<es:administrativeState>0</es:administrativeState>
+</es:vsDataNbapCommon>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataNbapDedicated</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataNbapDedicated>
+
+<es:l2EstablishReqRetryT>5</es:l2EstablishReqRetryT>
+<es:activeUniSaalTpRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalTp=b2da</es:activeUniSaalTpRef>
+<es:standbyUniSaalTpRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalTp=b2db</es:standbyUniSaalTpRef>
+<es:userLabel> </es:userLabel>
+<es:administrativeState>0</es:administrativeState>
+</es:vsDataNbapDedicated>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataIubEdch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIubEdch>
+
+<es:edchDataFrameDelayThreshold>60</es:edchDataFrameDelayThreshold>
+</es:vsDataIubEdch>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer></un:IubLink>
+<un:IubLink id="3" modifier="create">
+<un:attributes>
+
+</un:attributes>
+</un:IubLink>
+
+<un:IubLink id="3" modifier="update">
+
+<xn:VsDataContainer id="3" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataIubLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIubLink>
+
+<es:rbsId>3</es:rbsId>
+<es:dlHwAdm>100</es:dlHwAdm>
+<es:ulHwAdm>100</es:ulHwAdm>
+
+<es:preferredSubrackRef>0</es:preferredSubrackRef>
+<es:userPlaneTransportOption>
+<es:atm>0</es:atm>
+<es:ipv4>0</es:ipv4></es:userPlaneTransportOption>
+</es:vsDataIubLink>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataNodeSynch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataNodeSynch>
+
+<es:userLabel> </es:userLabel>
+<es:phaseDiffThreshold>100</es:phaseDiffThreshold>
+
+
+<es:sampleIntervalSup>10</es:sampleIntervalSup>
+<es:fixedWindowSizeSup>10</es:fixedWindowSizeSup>
+<es:slidingWindowSize>100</es:slidingWindowSize>
+</es:vsDataNodeSynch>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataNbapCommon</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataNbapCommon>
+
+<es:userLabel> </es:userLabel>
+<es:l2EstablishReqRetryT>5</es:l2EstablishReqRetryT>
+<es:activeUniSaalTpRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalTp=b3ca</es:activeUniSaalTpRef>
+<es:standbyUniSaalTpRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalTp=b3cb</es:standbyUniSaalTpRef>
+<es:administrativeState>0</es:administrativeState>
+</es:vsDataNbapCommon>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataNbapDedicated</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataNbapDedicated>
+
+<es:l2EstablishReqRetryT>5</es:l2EstablishReqRetryT>
+<es:activeUniSaalTpRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalTp=b3da</es:activeUniSaalTpRef>
+<es:standbyUniSaalTpRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalTp=b3db</es:standbyUniSaalTpRef>
+<es:userLabel> </es:userLabel>
+<es:administrativeState>0</es:administrativeState>
+</es:vsDataNbapDedicated>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataIubEdch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIubEdch>
+
+<es:edchDataFrameDelayThreshold>60</es:edchDataFrameDelayThreshold>
+</es:vsDataIubEdch>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer></un:IubLink>
+<un:IubLink id="4" modifier="create">
+<un:attributes>
+
+</un:attributes>
+</un:IubLink>
+
+<un:IubLink id="4" modifier="update">
+
+<xn:VsDataContainer id="4" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataIubLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIubLink>
+
+<es:rbsId>4</es:rbsId>
+<es:dlHwAdm>100</es:dlHwAdm>
+<es:ulHwAdm>100</es:ulHwAdm>
+
+<es:preferredSubrackRef>0</es:preferredSubrackRef>
+<es:userPlaneTransportOption>
+<es:atm>0</es:atm>
+<es:ipv4>0</es:ipv4></es:userPlaneTransportOption>
+</es:vsDataIubLink>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataNodeSynch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataNodeSynch>
+
+<es:userLabel> </es:userLabel>
+<es:phaseDiffThreshold>100</es:phaseDiffThreshold>
+
+
+<es:sampleIntervalSup>10</es:sampleIntervalSup>
+<es:fixedWindowSizeSup>10</es:fixedWindowSizeSup>
+<es:slidingWindowSize>100</es:slidingWindowSize>
+</es:vsDataNodeSynch>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataNbapCommon</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataNbapCommon>
+
+<es:userLabel> </es:userLabel>
+<es:l2EstablishReqRetryT>5</es:l2EstablishReqRetryT>
+<es:activeUniSaalTpRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalTp=b4ca</es:activeUniSaalTpRef>
+<es:standbyUniSaalTpRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalTp=b4cb</es:standbyUniSaalTpRef>
+<es:administrativeState>0</es:administrativeState>
+</es:vsDataNbapCommon>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataNbapDedicated</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataNbapDedicated>
+
+<es:l2EstablishReqRetryT>5</es:l2EstablishReqRetryT>
+<es:activeUniSaalTpRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalTp=b4da</es:activeUniSaalTpRef>
+<es:standbyUniSaalTpRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,vsDataTransportNetwork=1,vsDataUniSaalTp=b4db</es:standbyUniSaalTpRef>
+<es:userLabel> </es:userLabel>
+<es:administrativeState>0</es:administrativeState>
+</es:vsDataNbapDedicated>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataIubEdch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIubEdch>
+
+<es:edchDataFrameDelayThreshold>60</es:edchDataFrameDelayThreshold>
+</es:vsDataIubEdch>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer></un:IubLink>
+<un:UtranCell id="RNC01-1-1" modifier="create">
+<un:attributes>
+
+<un:userLabel>RNC01-1-1</un:userLabel>
+<un:cId>1</un:cId>
+<un:localCellId>1</un:localCellId>
+<un:uarfcnUl>12</un:uarfcnUl>
+<un:uarfcnDl>5</un:uarfcnDl>
+<un:primaryScramblingCode>1</un:primaryScramblingCode>
+<un:primaryCpichPower>300</un:primaryCpichPower>
+<un:maximumTransmissionPower>400</un:maximumTransmissionPower>
+<un:primarySchPower>-18</un:primarySchPower>
+<un:secondarySchPower>-35</un:secondarySchPower>
+<un:bchPower>-31</un:bchPower>
+<un:utranCellIubLink>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=1</un:utranCellIubLink>
+<un:lac>3417</un:lac>
+<un:rac>3418</un:rac>
+<un:sac>3419</un:sac>
+</un:attributes>
+</un:UtranCell>
+
+<un:UtranCell id="RNC01-1-1" modifier="update">
+
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>1</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>2</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>3</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>4</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>5</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>6</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>7</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>8</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>9</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>10</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="11" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>11</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="12" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>12</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="13" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>13</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="14" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>14</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="15" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>15</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="16" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>16</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="17" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>17</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="18" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>18</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="19" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>19</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="20" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>20</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="21" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>21</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="22" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>22</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="23" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>23</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="24" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>24</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="25" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>25</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="26" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>26</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="27" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>27</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="28" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>28</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="29" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>29</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="30" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>30</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>31</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=1</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>32</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=2</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>33</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=3</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>34</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=4</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>35</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=5</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>36</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=6</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>37</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=7</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>38</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=8</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>39</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=9</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>40</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50101</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="RNC01-1-1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranCell</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranCell>
+
+<es:tCell>1</es:tCell>
+<es:cellReserved>1</es:cellReserved>
+<es:treSelection>2</es:treSelection>
+<es:qualMeasQuantity>2</es:qualMeasQuantity>
+<es:qHyst1>4</es:qHyst1>
+<es:qHyst2>4</es:qHyst2>
+<es:qQualMin>-24</es:qQualMin>
+<es:qRxLevMin>-115</es:qRxLevMin>
+<es:individualOffset>0</es:individualOffset>
+<es:pwrAdm>75</es:pwrAdm>
+<es:pwrOffset>5</es:pwrOffset>
+<es:pwrHyst>300</es:pwrHyst>
+<es:tmCongAction>2000</es:tmCongAction>
+<es:releaseAseDl>1</es:releaseAseDl>
+<es:aseDlAdm>240</es:aseDlAdm>
+<es:dlCodeAdm>80</es:dlCodeAdm>
+<es:aseUlAdm>160</es:aseUlAdm>
+<es:sf8Adm>8</es:sf8Adm>
+<es:sf32Adm>32</es:sf32Adm>
+<es:minPwrRl>-150</es:minPwrRl>
+<es:maxRate>40690</es:maxRate>
+<es:interRate>7760</es:interRate>
+<es:minimumRate>1590</es:minimumRate>
+<es:maxPwrMax>48</es:maxPwrMax>
+<es:interPwrMax>38</es:interPwrMax>
+<es:minPwrMax>0</es:minPwrMax>
+<es:compModeAdm>15</es:compModeAdm>
+<es:iFHyst>6000</es:iFHyst>
+<es:iFCong>621</es:iFCong>
+<es:interFreqFddMeasIndicator>0</es:interFreqFddMeasIndicator>
+<es:sRatSearch>4</es:sRatSearch>
+<es:sIntraSearch>0</es:sIntraSearch>
+<es:sInterSearch>0</es:sInterSearch>
+<es:fachMeasOccaCycLenCoeff>0</es:fachMeasOccaCycLenCoeff>
+
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:utranCellPosition></es:utranCellPosition>
+<es:maxTxPowerUl>24</es:maxTxPowerUl>
+
+<es:sib1PlmnScopeValueTag>0</es:sib1PlmnScopeValueTag>
+<es:sf16Adm>16</es:sf16Adm>
+<es:hoType>1</es:hoType>
+<es:usedFreqThresh2dEcno>-12</es:usedFreqThresh2dEcno>
+<es:usedFreqThresh2dRscp>-97</es:usedFreqThresh2dRscp>
+<es:administrativeState>0</es:administrativeState>
+<es:loadSharingGsmThreshold>75</es:loadSharingGsmThreshold>
+<es:loadSharingGsmFraction>100</es:loadSharingGsmFraction>
+<es:nInSyncInd>3</es:nInSyncInd>
+<es:rlFailureT>10</es:rlFailureT>
+<es:nOutSyncInd>10</es:nOutSyncInd>
+<es:sf4AdmUl>0</es:sf4AdmUl>
+<es:hardIfhoCorr>3</es:hardIfhoCorr>
+<es:hsdpaUsersAdm>10</es:hsdpaUsersAdm>
+<es:loadSharingMargin>0</es:loadSharingMargin>
+<es:sHcsRat>-105</es:sHcsRat>
+<es:sf16gAdm>16</es:sf16gAdm>
+<es:releaseAseDlNg>3</es:releaseAseDlNg>
+<es:tmCongActionNg>800</es:tmCongActionNg>
+<es:tmInitialG>3000</es:tmInitialG>
+<es:sf16AdmUl>16</es:sf16AdmUl>
+<es:sf8AdmUl>8</es:sf8AdmUl>
+<es:sf8gAdmUl>0</es:sf8gAdmUl>
+<es:iubLinkRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=1</es:iubLinkRef>
+<es:eulNonServingCellUsersAdm>100</es:eulNonServingCellUsersAdm>
+<es:eulServingCellUsersAdm>32</es:eulServingCellUsersAdm>
+<es:agpsEnabled>1</es:agpsEnabled>
+<es:codeLoadThresholdDlSf128>100</es:codeLoadThresholdDlSf128>
+<es:pwrLoadThresholdDlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:pwrLoadThresholdDlSpeech>
+<es:aseLoadThresholdUlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:aseLoadThresholdUlSpeech>
+
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:rateSelectionPsInteractive>
+<es:channelType>0</es:channelType>
+<es:ulPrefRate>64</es:ulPrefRate>
+<es:dlPrefRate>64</es:dlPrefRate></es:rateSelectionPsInteractive>
+<es:hcsUsage>
+<es:idleMode>0</es:idleMode>
+<es:connectedMode>0</es:connectedMode></es:hcsUsage>
+<es:hcsSib3Config>
+<es:sSearchHcs>-105</es:sSearchHcs>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs></es:hcsSib3Config>
+</es:vsDataUtranCell>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataFach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataFach>
+
+<es:userLabel>Fach-1-1</es:userLabel>
+<es:maxFach1Power>18</es:maxFach1Power>
+<es:maxFach2Power>15</es:maxFach2Power>
+<es:sccpchOffset>0</es:sccpchOffset>
+<es:pOffset1Fach>0</es:pOffset1Fach>
+<es:pOffset3Fach>0</es:pOffset3Fach>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataFach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataRach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataRach>
+
+<es:userLabel>Rach-1-1</es:userLabel>
+<es:scramblingCodeWordNo>0</es:scramblingCodeWordNo>
+<es:preambleSignatures>65535</es:preambleSignatures>
+<es:subChannelNo>4095</es:subChannelNo>
+<es:aichTransmissionTiming>4</es:aichTransmissionTiming>
+<es:aichPower>-6</es:aichPower>
+<es:powerOffsetP0>3</es:powerOffsetP0>
+<es:powerOffsetPpm>-4</es:powerOffsetPpm>
+<es:preambleRetransMax>5</es:preambleRetransMax>
+<es:maxPreambleCycle>4</es:maxPreambleCycle>
+<es:constantValueCprach>-27</es:constantValueCprach>
+<es:spreadingFactor>64</es:spreadingFactor>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataRach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPch>
+
+<es:userLabel>Pch-1-1</es:userLabel>
+<es:pchPower>-4</es:pchPower>
+<es:pichPower>-7</es:pichPower>
+<es:sccpchOffset>20</es:sccpchOffset>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataPch>
+</xn:attributes>
+</xn:VsDataContainer><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-1-1</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-1-1</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataEul</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataEul>
+
+<es:userLabel>Eul-1-1</es:userLabel>
+<es:administrativeState>0</es:administrativeState>
+<es:numEagchCodes>1</es:numEagchCodes>
+<es:numEhichErgchCodes>1</es:numEhichErgchCodes>
+<es:eulMaxTargetRtwp>-499</es:eulMaxTargetRtwp>
+</es:vsDataEul>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataCoverageRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataCoverageRelation>
+
+<es:utranCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,UtranCell=RNC01-1-2</es:utranCellRef>
+<es:coverageIndicator>1</es:coverageIndicator>
+<es:hsPathlossThreshold>170</es:hsPathlossThreshold>
+</es:vsDataCoverageRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer></un:UtranCell>
+<un:UtranCell id="RNC01-1-2" modifier="create">
+<un:attributes>
+
+<un:userLabel>RNC01-1-2</un:userLabel>
+<un:cId>2</un:cId>
+<un:localCellId>2</un:localCellId>
+<un:uarfcnUl>12</un:uarfcnUl>
+<un:uarfcnDl>5</un:uarfcnDl>
+<un:primaryScramblingCode>2</un:primaryScramblingCode>
+<un:primaryCpichPower>300</un:primaryCpichPower>
+<un:maximumTransmissionPower>400</un:maximumTransmissionPower>
+<un:primarySchPower>-18</un:primarySchPower>
+<un:secondarySchPower>-35</un:secondarySchPower>
+<un:bchPower>-31</un:bchPower>
+<un:utranCellIubLink>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=1</un:utranCellIubLink>
+<un:lac>3417</un:lac>
+<un:rac>3418</un:rac>
+<un:sac>3420</un:sac>
+</un:attributes>
+</un:UtranCell>
+
+<un:UtranCell id="RNC01-1-2" modifier="update">
+
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>1</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>2</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>3</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>4</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>5</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>6</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>7</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>8</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>9</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>10</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="11" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>11</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="12" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>12</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="13" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>13</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="14" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>14</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="15" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>15</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="16" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>16</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="17" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>17</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="18" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>18</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="19" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>19</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="20" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>20</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="21" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>21</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="22" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>22</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="23" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>23</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="24" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>24</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="25" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>25</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="26" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>26</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="27" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>27</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="28" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>28</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="29" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>29</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="30" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>30</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>31</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50102</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>32</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50103</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>33</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=1</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>34</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=2</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>35</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=3</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>36</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=4</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>37</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=5</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>38</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=6</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>39</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=7</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>40</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=8</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="RNC01-1-2" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranCell</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranCell>
+
+<es:tCell>2</es:tCell>
+<es:cellReserved>1</es:cellReserved>
+<es:treSelection>2</es:treSelection>
+<es:qualMeasQuantity>2</es:qualMeasQuantity>
+<es:qHyst1>4</es:qHyst1>
+<es:qHyst2>4</es:qHyst2>
+<es:qQualMin>-24</es:qQualMin>
+<es:qRxLevMin>-115</es:qRxLevMin>
+<es:individualOffset>0</es:individualOffset>
+<es:pwrAdm>75</es:pwrAdm>
+<es:pwrOffset>5</es:pwrOffset>
+<es:pwrHyst>300</es:pwrHyst>
+<es:tmCongAction>2000</es:tmCongAction>
+<es:releaseAseDl>1</es:releaseAseDl>
+<es:aseDlAdm>240</es:aseDlAdm>
+<es:dlCodeAdm>80</es:dlCodeAdm>
+<es:aseUlAdm>160</es:aseUlAdm>
+<es:sf8Adm>8</es:sf8Adm>
+<es:sf32Adm>32</es:sf32Adm>
+<es:minPwrRl>-150</es:minPwrRl>
+<es:maxRate>40690</es:maxRate>
+<es:interRate>7760</es:interRate>
+<es:minimumRate>1590</es:minimumRate>
+<es:maxPwrMax>48</es:maxPwrMax>
+<es:interPwrMax>38</es:interPwrMax>
+<es:minPwrMax>0</es:minPwrMax>
+<es:compModeAdm>15</es:compModeAdm>
+<es:iFHyst>6000</es:iFHyst>
+<es:iFCong>621</es:iFCong>
+<es:interFreqFddMeasIndicator>0</es:interFreqFddMeasIndicator>
+<es:sRatSearch>4</es:sRatSearch>
+<es:sIntraSearch>0</es:sIntraSearch>
+<es:sInterSearch>0</es:sInterSearch>
+<es:fachMeasOccaCycLenCoeff>0</es:fachMeasOccaCycLenCoeff>
+
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:utranCellPosition></es:utranCellPosition>
+<es:maxTxPowerUl>24</es:maxTxPowerUl>
+
+<es:sib1PlmnScopeValueTag>0</es:sib1PlmnScopeValueTag>
+<es:sf16Adm>16</es:sf16Adm>
+<es:hoType>1</es:hoType>
+<es:usedFreqThresh2dEcno>-12</es:usedFreqThresh2dEcno>
+<es:usedFreqThresh2dRscp>-97</es:usedFreqThresh2dRscp>
+<es:administrativeState>0</es:administrativeState>
+<es:loadSharingGsmThreshold>75</es:loadSharingGsmThreshold>
+<es:loadSharingGsmFraction>100</es:loadSharingGsmFraction>
+<es:nInSyncInd>3</es:nInSyncInd>
+<es:rlFailureT>10</es:rlFailureT>
+<es:nOutSyncInd>10</es:nOutSyncInd>
+<es:sf4AdmUl>0</es:sf4AdmUl>
+<es:hardIfhoCorr>3</es:hardIfhoCorr>
+<es:hsdpaUsersAdm>10</es:hsdpaUsersAdm>
+<es:loadSharingMargin>0</es:loadSharingMargin>
+<es:sHcsRat>-105</es:sHcsRat>
+<es:sf16gAdm>16</es:sf16gAdm>
+<es:releaseAseDlNg>3</es:releaseAseDlNg>
+<es:tmCongActionNg>800</es:tmCongActionNg>
+<es:tmInitialG>3000</es:tmInitialG>
+<es:sf16AdmUl>16</es:sf16AdmUl>
+<es:sf8AdmUl>8</es:sf8AdmUl>
+<es:sf8gAdmUl>0</es:sf8gAdmUl>
+<es:iubLinkRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=1</es:iubLinkRef>
+<es:eulNonServingCellUsersAdm>100</es:eulNonServingCellUsersAdm>
+<es:eulServingCellUsersAdm>32</es:eulServingCellUsersAdm>
+<es:agpsEnabled>1</es:agpsEnabled>
+<es:codeLoadThresholdDlSf128>100</es:codeLoadThresholdDlSf128>
+<es:pwrLoadThresholdDlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:pwrLoadThresholdDlSpeech>
+<es:aseLoadThresholdUlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:aseLoadThresholdUlSpeech>
+
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:rateSelectionPsInteractive>
+<es:channelType>0</es:channelType>
+<es:ulPrefRate>64</es:ulPrefRate>
+<es:dlPrefRate>64</es:dlPrefRate></es:rateSelectionPsInteractive>
+<es:hcsUsage>
+<es:idleMode>0</es:idleMode>
+<es:connectedMode>0</es:connectedMode></es:hcsUsage>
+<es:hcsSib3Config>
+<es:sSearchHcs>-105</es:sSearchHcs>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs></es:hcsSib3Config>
+</es:vsDataUtranCell>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataFach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataFach>
+
+<es:userLabel>Fach-1-2</es:userLabel>
+<es:maxFach1Power>18</es:maxFach1Power>
+<es:maxFach2Power>15</es:maxFach2Power>
+<es:sccpchOffset>0</es:sccpchOffset>
+<es:pOffset1Fach>0</es:pOffset1Fach>
+<es:pOffset3Fach>0</es:pOffset3Fach>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataFach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataRach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataRach>
+
+<es:userLabel>Rach-1-2</es:userLabel>
+<es:scramblingCodeWordNo>0</es:scramblingCodeWordNo>
+<es:preambleSignatures>65535</es:preambleSignatures>
+<es:subChannelNo>4095</es:subChannelNo>
+<es:aichTransmissionTiming>4</es:aichTransmissionTiming>
+<es:aichPower>-6</es:aichPower>
+<es:powerOffsetP0>3</es:powerOffsetP0>
+<es:powerOffsetPpm>-4</es:powerOffsetPpm>
+<es:preambleRetransMax>5</es:preambleRetransMax>
+<es:maxPreambleCycle>4</es:maxPreambleCycle>
+<es:constantValueCprach>-27</es:constantValueCprach>
+<es:spreadingFactor>64</es:spreadingFactor>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataRach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPch>
+
+<es:userLabel>Pch-1-2</es:userLabel>
+<es:pchPower>-4</es:pchPower>
+<es:pichPower>-7</es:pichPower>
+<es:sccpchOffset>20</es:sccpchOffset>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataPch>
+</xn:attributes>
+</xn:VsDataContainer><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-1-2</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-1-2</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataEul</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataEul>
+
+<es:userLabel>Eul-1-2</es:userLabel>
+<es:administrativeState>0</es:administrativeState>
+<es:numEagchCodes>1</es:numEagchCodes>
+<es:numEhichErgchCodes>1</es:numEhichErgchCodes>
+<es:eulMaxTargetRtwp>-499</es:eulMaxTargetRtwp>
+</es:vsDataEul>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataCoverageRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataCoverageRelation>
+
+<es:utranCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,UtranCell=RNC01-1-3</es:utranCellRef>
+<es:coverageIndicator>1</es:coverageIndicator>
+<es:hsPathlossThreshold>170</es:hsPathlossThreshold>
+</es:vsDataCoverageRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer></un:UtranCell>
+<un:UtranCell id="RNC01-1-3" modifier="create">
+<un:attributes>
+
+<un:userLabel>RNC01-1-3</un:userLabel>
+<un:cId>3</un:cId>
+<un:localCellId>3</un:localCellId>
+<un:uarfcnUl>12</un:uarfcnUl>
+<un:uarfcnDl>5</un:uarfcnDl>
+<un:primaryScramblingCode>3</un:primaryScramblingCode>
+<un:primaryCpichPower>300</un:primaryCpichPower>
+<un:maximumTransmissionPower>400</un:maximumTransmissionPower>
+<un:primarySchPower>-18</un:primarySchPower>
+<un:secondarySchPower>-35</un:secondarySchPower>
+<un:bchPower>-31</un:bchPower>
+<un:utranCellIubLink>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=1</un:utranCellIubLink>
+<un:lac>3417</un:lac>
+<un:rac>3418</un:rac>
+<un:sac>3421</un:sac>
+</un:attributes>
+</un:UtranCell>
+
+<un:UtranCell id="RNC01-1-3" modifier="update">
+
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>1</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>2</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>3</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>4</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>5</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>6</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>7</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>8</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>9</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>10</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="11" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>11</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="12" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>12</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="13" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>13</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="14" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>14</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="15" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>15</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="16" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>16</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="17" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>17</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="18" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>18</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="19" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>19</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="20" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>20</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="21" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>21</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="22" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>22</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="23" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>23</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="24" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>24</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="25" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>25</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="26" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>26</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="27" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>27</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="28" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>28</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="29" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>29</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="30" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>30</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>31</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=9</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>32</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50101</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>33</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50102</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>34</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50103</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>35</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=1</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>36</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=2</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>37</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=3</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>38</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=4</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>39</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=5</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>40</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=6</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="RNC01-1-3" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranCell</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranCell>
+
+<es:tCell>3</es:tCell>
+<es:cellReserved>1</es:cellReserved>
+<es:treSelection>2</es:treSelection>
+<es:qualMeasQuantity>2</es:qualMeasQuantity>
+<es:qHyst1>4</es:qHyst1>
+<es:qHyst2>4</es:qHyst2>
+<es:qQualMin>-24</es:qQualMin>
+<es:qRxLevMin>-115</es:qRxLevMin>
+<es:individualOffset>0</es:individualOffset>
+<es:pwrAdm>75</es:pwrAdm>
+<es:pwrOffset>5</es:pwrOffset>
+<es:pwrHyst>300</es:pwrHyst>
+<es:tmCongAction>2000</es:tmCongAction>
+<es:releaseAseDl>1</es:releaseAseDl>
+<es:aseDlAdm>240</es:aseDlAdm>
+<es:dlCodeAdm>80</es:dlCodeAdm>
+<es:aseUlAdm>160</es:aseUlAdm>
+<es:sf8Adm>8</es:sf8Adm>
+<es:sf32Adm>32</es:sf32Adm>
+<es:minPwrRl>-150</es:minPwrRl>
+<es:maxRate>40690</es:maxRate>
+<es:interRate>7760</es:interRate>
+<es:minimumRate>1590</es:minimumRate>
+<es:maxPwrMax>48</es:maxPwrMax>
+<es:interPwrMax>38</es:interPwrMax>
+<es:minPwrMax>0</es:minPwrMax>
+<es:compModeAdm>15</es:compModeAdm>
+<es:iFHyst>6000</es:iFHyst>
+<es:iFCong>621</es:iFCong>
+<es:interFreqFddMeasIndicator>0</es:interFreqFddMeasIndicator>
+<es:sRatSearch>4</es:sRatSearch>
+<es:sIntraSearch>0</es:sIntraSearch>
+<es:sInterSearch>0</es:sInterSearch>
+<es:fachMeasOccaCycLenCoeff>0</es:fachMeasOccaCycLenCoeff>
+
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:utranCellPosition></es:utranCellPosition>
+<es:maxTxPowerUl>24</es:maxTxPowerUl>
+
+<es:sib1PlmnScopeValueTag>0</es:sib1PlmnScopeValueTag>
+<es:sf16Adm>16</es:sf16Adm>
+<es:hoType>1</es:hoType>
+<es:usedFreqThresh2dEcno>-12</es:usedFreqThresh2dEcno>
+<es:usedFreqThresh2dRscp>-97</es:usedFreqThresh2dRscp>
+<es:administrativeState>0</es:administrativeState>
+<es:loadSharingGsmThreshold>75</es:loadSharingGsmThreshold>
+<es:loadSharingGsmFraction>100</es:loadSharingGsmFraction>
+<es:nInSyncInd>3</es:nInSyncInd>
+<es:rlFailureT>10</es:rlFailureT>
+<es:nOutSyncInd>10</es:nOutSyncInd>
+<es:sf4AdmUl>0</es:sf4AdmUl>
+<es:hardIfhoCorr>3</es:hardIfhoCorr>
+<es:hsdpaUsersAdm>10</es:hsdpaUsersAdm>
+<es:loadSharingMargin>0</es:loadSharingMargin>
+<es:sHcsRat>-105</es:sHcsRat>
+<es:sf16gAdm>16</es:sf16gAdm>
+<es:releaseAseDlNg>3</es:releaseAseDlNg>
+<es:tmCongActionNg>800</es:tmCongActionNg>
+<es:tmInitialG>3000</es:tmInitialG>
+<es:sf16AdmUl>16</es:sf16AdmUl>
+<es:sf8AdmUl>8</es:sf8AdmUl>
+<es:sf8gAdmUl>0</es:sf8gAdmUl>
+<es:iubLinkRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=1</es:iubLinkRef>
+<es:eulNonServingCellUsersAdm>100</es:eulNonServingCellUsersAdm>
+<es:eulServingCellUsersAdm>32</es:eulServingCellUsersAdm>
+<es:agpsEnabled>1</es:agpsEnabled>
+<es:codeLoadThresholdDlSf128>100</es:codeLoadThresholdDlSf128>
+<es:pwrLoadThresholdDlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:pwrLoadThresholdDlSpeech>
+<es:aseLoadThresholdUlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:aseLoadThresholdUlSpeech>
+
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:rateSelectionPsInteractive>
+<es:channelType>0</es:channelType>
+<es:ulPrefRate>64</es:ulPrefRate>
+<es:dlPrefRate>64</es:dlPrefRate></es:rateSelectionPsInteractive>
+<es:hcsUsage>
+<es:idleMode>0</es:idleMode>
+<es:connectedMode>0</es:connectedMode></es:hcsUsage>
+<es:hcsSib3Config>
+<es:sSearchHcs>-105</es:sSearchHcs>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs></es:hcsSib3Config>
+</es:vsDataUtranCell>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataFach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataFach>
+
+<es:userLabel>Fach-1-3</es:userLabel>
+<es:maxFach1Power>18</es:maxFach1Power>
+<es:maxFach2Power>15</es:maxFach2Power>
+<es:sccpchOffset>0</es:sccpchOffset>
+<es:pOffset1Fach>0</es:pOffset1Fach>
+<es:pOffset3Fach>0</es:pOffset3Fach>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataFach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataRach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataRach>
+
+<es:userLabel>Rach-1-3</es:userLabel>
+<es:scramblingCodeWordNo>0</es:scramblingCodeWordNo>
+<es:preambleSignatures>65535</es:preambleSignatures>
+<es:subChannelNo>4095</es:subChannelNo>
+<es:aichTransmissionTiming>4</es:aichTransmissionTiming>
+<es:aichPower>-6</es:aichPower>
+<es:powerOffsetP0>3</es:powerOffsetP0>
+<es:powerOffsetPpm>-4</es:powerOffsetPpm>
+<es:preambleRetransMax>5</es:preambleRetransMax>
+<es:maxPreambleCycle>4</es:maxPreambleCycle>
+<es:constantValueCprach>-27</es:constantValueCprach>
+<es:spreadingFactor>64</es:spreadingFactor>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataRach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPch>
+
+<es:userLabel>Pch-1-3</es:userLabel>
+<es:pchPower>-4</es:pchPower>
+<es:pichPower>-7</es:pichPower>
+<es:sccpchOffset>20</es:sccpchOffset>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataPch>
+</xn:attributes>
+</xn:VsDataContainer><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-1-3</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-1-3</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataEul</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataEul>
+
+<es:userLabel>Eul-1-3</es:userLabel>
+<es:administrativeState>0</es:administrativeState>
+<es:numEagchCodes>1</es:numEagchCodes>
+<es:numEhichErgchCodes>1</es:numEhichErgchCodes>
+<es:eulMaxTargetRtwp>-499</es:eulMaxTargetRtwp>
+</es:vsDataEul>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataCoverageRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataCoverageRelation>
+
+<es:utranCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,UtranCell=RNC01-1-1</es:utranCellRef>
+<es:coverageIndicator>1</es:coverageIndicator>
+<es:hsPathlossThreshold>170</es:hsPathlossThreshold>
+</es:vsDataCoverageRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer></un:UtranCell>
+<un:UtranCell id="RNC01-2-1" modifier="create">
+<un:attributes>
+
+<un:userLabel>RNC01-2-1</un:userLabel>
+<un:cId>4</un:cId>
+<un:localCellId>1</un:localCellId>
+<un:uarfcnUl>12</un:uarfcnUl>
+<un:uarfcnDl>6</un:uarfcnDl>
+<un:primaryScramblingCode>4</un:primaryScramblingCode>
+<un:primaryCpichPower>300</un:primaryCpichPower>
+<un:maximumTransmissionPower>400</un:maximumTransmissionPower>
+<un:primarySchPower>-18</un:primarySchPower>
+<un:secondarySchPower>-35</un:secondarySchPower>
+<un:bchPower>-31</un:bchPower>
+<un:utranCellIubLink>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=2</un:utranCellIubLink>
+<un:lac>3422</un:lac>
+<un:rac>3423</un:rac>
+<un:sac>3424</un:sac>
+</un:attributes>
+</un:UtranCell>
+
+<un:UtranCell id="RNC01-2-1" modifier="update">
+
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>1</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>2</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>3</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>4</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>5</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>6</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>7</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>8</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>9</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>10</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="11" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>11</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="12" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>12</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="13" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>13</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="14" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>14</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="15" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>15</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="16" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>16</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="17" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>17</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="18" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>18</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="19" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>19</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="20" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>20</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="21" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>21</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="22" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>22</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="23" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>23</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="24" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>24</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="25" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>25</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="26" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>26</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="27" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>27</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="28" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>28</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="29" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>29</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="30" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>30</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>31</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=7</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>32</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=8</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>33</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=9</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>34</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50101</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>35</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50102</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>36</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50103</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>37</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=1</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>38</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=2</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>39</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=3</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>40</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=4</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="RNC01-2-1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranCell</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranCell>
+
+<es:tCell>1</es:tCell>
+<es:cellReserved>1</es:cellReserved>
+<es:treSelection>2</es:treSelection>
+<es:qualMeasQuantity>2</es:qualMeasQuantity>
+<es:qHyst1>4</es:qHyst1>
+<es:qHyst2>4</es:qHyst2>
+<es:qQualMin>-24</es:qQualMin>
+<es:qRxLevMin>-115</es:qRxLevMin>
+<es:individualOffset>0</es:individualOffset>
+<es:pwrAdm>75</es:pwrAdm>
+<es:pwrOffset>5</es:pwrOffset>
+<es:pwrHyst>300</es:pwrHyst>
+<es:tmCongAction>2000</es:tmCongAction>
+<es:releaseAseDl>1</es:releaseAseDl>
+<es:aseDlAdm>240</es:aseDlAdm>
+<es:dlCodeAdm>80</es:dlCodeAdm>
+<es:aseUlAdm>160</es:aseUlAdm>
+<es:sf8Adm>8</es:sf8Adm>
+<es:sf32Adm>32</es:sf32Adm>
+<es:minPwrRl>-150</es:minPwrRl>
+<es:maxRate>40690</es:maxRate>
+<es:interRate>7760</es:interRate>
+<es:minimumRate>1590</es:minimumRate>
+<es:maxPwrMax>48</es:maxPwrMax>
+<es:interPwrMax>38</es:interPwrMax>
+<es:minPwrMax>0</es:minPwrMax>
+<es:compModeAdm>15</es:compModeAdm>
+<es:iFHyst>6000</es:iFHyst>
+<es:iFCong>621</es:iFCong>
+<es:interFreqFddMeasIndicator>0</es:interFreqFddMeasIndicator>
+<es:sRatSearch>4</es:sRatSearch>
+<es:sIntraSearch>0</es:sIntraSearch>
+<es:sInterSearch>0</es:sInterSearch>
+<es:fachMeasOccaCycLenCoeff>0</es:fachMeasOccaCycLenCoeff>
+
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:utranCellPosition></es:utranCellPosition>
+<es:maxTxPowerUl>24</es:maxTxPowerUl>
+
+<es:sib1PlmnScopeValueTag>0</es:sib1PlmnScopeValueTag>
+<es:sf16Adm>16</es:sf16Adm>
+<es:hoType>1</es:hoType>
+<es:usedFreqThresh2dEcno>-12</es:usedFreqThresh2dEcno>
+<es:usedFreqThresh2dRscp>-97</es:usedFreqThresh2dRscp>
+<es:administrativeState>0</es:administrativeState>
+<es:loadSharingGsmThreshold>75</es:loadSharingGsmThreshold>
+<es:loadSharingGsmFraction>100</es:loadSharingGsmFraction>
+<es:nInSyncInd>3</es:nInSyncInd>
+<es:rlFailureT>10</es:rlFailureT>
+<es:nOutSyncInd>10</es:nOutSyncInd>
+<es:sf4AdmUl>0</es:sf4AdmUl>
+<es:hardIfhoCorr>3</es:hardIfhoCorr>
+<es:hsdpaUsersAdm>10</es:hsdpaUsersAdm>
+<es:loadSharingMargin>0</es:loadSharingMargin>
+<es:sHcsRat>-105</es:sHcsRat>
+<es:sf16gAdm>16</es:sf16gAdm>
+<es:releaseAseDlNg>3</es:releaseAseDlNg>
+<es:tmCongActionNg>800</es:tmCongActionNg>
+<es:tmInitialG>3000</es:tmInitialG>
+<es:sf16AdmUl>16</es:sf16AdmUl>
+<es:sf8AdmUl>8</es:sf8AdmUl>
+<es:sf8gAdmUl>0</es:sf8gAdmUl>
+<es:iubLinkRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=2</es:iubLinkRef>
+<es:eulNonServingCellUsersAdm>100</es:eulNonServingCellUsersAdm>
+<es:eulServingCellUsersAdm>32</es:eulServingCellUsersAdm>
+<es:agpsEnabled>1</es:agpsEnabled>
+<es:codeLoadThresholdDlSf128>100</es:codeLoadThresholdDlSf128>
+<es:pwrLoadThresholdDlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:pwrLoadThresholdDlSpeech>
+<es:aseLoadThresholdUlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:aseLoadThresholdUlSpeech>
+
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:rateSelectionPsInteractive>
+<es:channelType>0</es:channelType>
+<es:ulPrefRate>64</es:ulPrefRate>
+<es:dlPrefRate>64</es:dlPrefRate></es:rateSelectionPsInteractive>
+<es:hcsUsage>
+<es:idleMode>0</es:idleMode>
+<es:connectedMode>0</es:connectedMode></es:hcsUsage>
+<es:hcsSib3Config>
+<es:sSearchHcs>-105</es:sSearchHcs>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs></es:hcsSib3Config>
+</es:vsDataUtranCell>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataFach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataFach>
+
+<es:userLabel>Fach-2-1</es:userLabel>
+<es:maxFach1Power>18</es:maxFach1Power>
+<es:maxFach2Power>15</es:maxFach2Power>
+<es:sccpchOffset>0</es:sccpchOffset>
+<es:pOffset1Fach>0</es:pOffset1Fach>
+<es:pOffset3Fach>0</es:pOffset3Fach>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataFach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataRach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataRach>
+
+<es:userLabel>Rach-2-1</es:userLabel>
+<es:scramblingCodeWordNo>0</es:scramblingCodeWordNo>
+<es:preambleSignatures>65535</es:preambleSignatures>
+<es:subChannelNo>4095</es:subChannelNo>
+<es:aichTransmissionTiming>4</es:aichTransmissionTiming>
+<es:aichPower>-6</es:aichPower>
+<es:powerOffsetP0>3</es:powerOffsetP0>
+<es:powerOffsetPpm>-4</es:powerOffsetPpm>
+<es:preambleRetransMax>5</es:preambleRetransMax>
+<es:maxPreambleCycle>4</es:maxPreambleCycle>
+<es:constantValueCprach>-27</es:constantValueCprach>
+<es:spreadingFactor>64</es:spreadingFactor>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataRach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPch>
+
+<es:userLabel>Pch-2-1</es:userLabel>
+<es:pchPower>-4</es:pchPower>
+<es:pichPower>-7</es:pichPower>
+<es:sccpchOffset>20</es:sccpchOffset>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataPch>
+</xn:attributes>
+</xn:VsDataContainer><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-2-1</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-2-1</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataEul</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataEul>
+
+<es:userLabel>Eul-2-1</es:userLabel>
+<es:administrativeState>0</es:administrativeState>
+<es:numEagchCodes>1</es:numEagchCodes>
+<es:numEhichErgchCodes>1</es:numEhichErgchCodes>
+<es:eulMaxTargetRtwp>-499</es:eulMaxTargetRtwp>
+</es:vsDataEul>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataCoverageRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataCoverageRelation>
+
+<es:utranCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,UtranCell=RNC01-2-2</es:utranCellRef>
+<es:coverageIndicator>1</es:coverageIndicator>
+<es:hsPathlossThreshold>170</es:hsPathlossThreshold>
+</es:vsDataCoverageRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer></un:UtranCell>
+<un:UtranCell id="RNC01-2-2" modifier="create">
+<un:attributes>
+
+<un:userLabel>RNC01-2-2</un:userLabel>
+<un:cId>5</un:cId>
+<un:localCellId>2</un:localCellId>
+<un:uarfcnUl>12</un:uarfcnUl>
+<un:uarfcnDl>6</un:uarfcnDl>
+<un:primaryScramblingCode>5</un:primaryScramblingCode>
+<un:primaryCpichPower>300</un:primaryCpichPower>
+<un:maximumTransmissionPower>400</un:maximumTransmissionPower>
+<un:primarySchPower>-18</un:primarySchPower>
+<un:secondarySchPower>-35</un:secondarySchPower>
+<un:bchPower>-31</un:bchPower>
+<un:utranCellIubLink>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=2</un:utranCellIubLink>
+<un:lac>3422</un:lac>
+<un:rac>3423</un:rac>
+<un:sac>3425</un:sac>
+</un:attributes>
+</un:UtranCell>
+
+<un:UtranCell id="RNC01-2-2" modifier="update">
+
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>1</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>2</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>3</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>4</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>5</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>6</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>7</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>8</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>9</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>10</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="11" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>11</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="12" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>12</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="13" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>13</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="14" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>14</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="15" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>15</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="16" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>16</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="17" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>17</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="18" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>18</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="19" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>19</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="20" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>20</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="21" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>21</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="22" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>22</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="23" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>23</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="24" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>24</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="25" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>25</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="26" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>26</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="27" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>27</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="28" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>28</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="29" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>29</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="30" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>30</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>31</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=5</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>32</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=6</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>33</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=7</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>34</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=8</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>35</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=9</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>36</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50101</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>37</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50102</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>38</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50103</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>39</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=1</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>40</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=2</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="RNC01-2-2" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranCell</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranCell>
+
+<es:tCell>2</es:tCell>
+<es:cellReserved>1</es:cellReserved>
+<es:treSelection>2</es:treSelection>
+<es:qualMeasQuantity>2</es:qualMeasQuantity>
+<es:qHyst1>4</es:qHyst1>
+<es:qHyst2>4</es:qHyst2>
+<es:qQualMin>-24</es:qQualMin>
+<es:qRxLevMin>-115</es:qRxLevMin>
+<es:individualOffset>0</es:individualOffset>
+<es:pwrAdm>75</es:pwrAdm>
+<es:pwrOffset>5</es:pwrOffset>
+<es:pwrHyst>300</es:pwrHyst>
+<es:tmCongAction>2000</es:tmCongAction>
+<es:releaseAseDl>1</es:releaseAseDl>
+<es:aseDlAdm>240</es:aseDlAdm>
+<es:dlCodeAdm>80</es:dlCodeAdm>
+<es:aseUlAdm>160</es:aseUlAdm>
+<es:sf8Adm>8</es:sf8Adm>
+<es:sf32Adm>32</es:sf32Adm>
+<es:minPwrRl>-150</es:minPwrRl>
+<es:maxRate>40690</es:maxRate>
+<es:interRate>7760</es:interRate>
+<es:minimumRate>1590</es:minimumRate>
+<es:maxPwrMax>48</es:maxPwrMax>
+<es:interPwrMax>38</es:interPwrMax>
+<es:minPwrMax>0</es:minPwrMax>
+<es:compModeAdm>15</es:compModeAdm>
+<es:iFHyst>6000</es:iFHyst>
+<es:iFCong>621</es:iFCong>
+<es:interFreqFddMeasIndicator>0</es:interFreqFddMeasIndicator>
+<es:sRatSearch>4</es:sRatSearch>
+<es:sIntraSearch>0</es:sIntraSearch>
+<es:sInterSearch>0</es:sInterSearch>
+<es:fachMeasOccaCycLenCoeff>0</es:fachMeasOccaCycLenCoeff>
+
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:utranCellPosition></es:utranCellPosition>
+<es:maxTxPowerUl>24</es:maxTxPowerUl>
+
+<es:sib1PlmnScopeValueTag>0</es:sib1PlmnScopeValueTag>
+<es:sf16Adm>16</es:sf16Adm>
+<es:hoType>1</es:hoType>
+<es:usedFreqThresh2dEcno>-12</es:usedFreqThresh2dEcno>
+<es:usedFreqThresh2dRscp>-97</es:usedFreqThresh2dRscp>
+<es:administrativeState>0</es:administrativeState>
+<es:loadSharingGsmThreshold>75</es:loadSharingGsmThreshold>
+<es:loadSharingGsmFraction>100</es:loadSharingGsmFraction>
+<es:nInSyncInd>3</es:nInSyncInd>
+<es:rlFailureT>10</es:rlFailureT>
+<es:nOutSyncInd>10</es:nOutSyncInd>
+<es:sf4AdmUl>0</es:sf4AdmUl>
+<es:hardIfhoCorr>3</es:hardIfhoCorr>
+<es:hsdpaUsersAdm>10</es:hsdpaUsersAdm>
+<es:loadSharingMargin>0</es:loadSharingMargin>
+<es:sHcsRat>-105</es:sHcsRat>
+<es:sf16gAdm>16</es:sf16gAdm>
+<es:releaseAseDlNg>3</es:releaseAseDlNg>
+<es:tmCongActionNg>800</es:tmCongActionNg>
+<es:tmInitialG>3000</es:tmInitialG>
+<es:sf16AdmUl>16</es:sf16AdmUl>
+<es:sf8AdmUl>8</es:sf8AdmUl>
+<es:sf8gAdmUl>0</es:sf8gAdmUl>
+<es:iubLinkRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=2</es:iubLinkRef>
+<es:eulNonServingCellUsersAdm>100</es:eulNonServingCellUsersAdm>
+<es:eulServingCellUsersAdm>32</es:eulServingCellUsersAdm>
+<es:agpsEnabled>1</es:agpsEnabled>
+<es:codeLoadThresholdDlSf128>100</es:codeLoadThresholdDlSf128>
+<es:pwrLoadThresholdDlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:pwrLoadThresholdDlSpeech>
+<es:aseLoadThresholdUlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:aseLoadThresholdUlSpeech>
+
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:rateSelectionPsInteractive>
+<es:channelType>0</es:channelType>
+<es:ulPrefRate>64</es:ulPrefRate>
+<es:dlPrefRate>64</es:dlPrefRate></es:rateSelectionPsInteractive>
+<es:hcsUsage>
+<es:idleMode>0</es:idleMode>
+<es:connectedMode>0</es:connectedMode></es:hcsUsage>
+<es:hcsSib3Config>
+<es:sSearchHcs>-105</es:sSearchHcs>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs></es:hcsSib3Config>
+</es:vsDataUtranCell>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataFach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataFach>
+
+<es:userLabel>Fach-2-2</es:userLabel>
+<es:maxFach1Power>18</es:maxFach1Power>
+<es:maxFach2Power>15</es:maxFach2Power>
+<es:sccpchOffset>0</es:sccpchOffset>
+<es:pOffset1Fach>0</es:pOffset1Fach>
+<es:pOffset3Fach>0</es:pOffset3Fach>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataFach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataRach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataRach>
+
+<es:userLabel>Rach-2-2</es:userLabel>
+<es:scramblingCodeWordNo>0</es:scramblingCodeWordNo>
+<es:preambleSignatures>65535</es:preambleSignatures>
+<es:subChannelNo>4095</es:subChannelNo>
+<es:aichTransmissionTiming>4</es:aichTransmissionTiming>
+<es:aichPower>-6</es:aichPower>
+<es:powerOffsetP0>3</es:powerOffsetP0>
+<es:powerOffsetPpm>-4</es:powerOffsetPpm>
+<es:preambleRetransMax>5</es:preambleRetransMax>
+<es:maxPreambleCycle>4</es:maxPreambleCycle>
+<es:constantValueCprach>-27</es:constantValueCprach>
+<es:spreadingFactor>64</es:spreadingFactor>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataRach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPch>
+
+<es:userLabel>Pch-2-2</es:userLabel>
+<es:pchPower>-4</es:pchPower>
+<es:pichPower>-7</es:pichPower>
+<es:sccpchOffset>20</es:sccpchOffset>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataPch>
+</xn:attributes>
+</xn:VsDataContainer><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-2-2</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-2-2</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataEul</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataEul>
+
+<es:userLabel>Eul-2-2</es:userLabel>
+<es:administrativeState>0</es:administrativeState>
+<es:numEagchCodes>1</es:numEagchCodes>
+<es:numEhichErgchCodes>1</es:numEhichErgchCodes>
+<es:eulMaxTargetRtwp>-499</es:eulMaxTargetRtwp>
+</es:vsDataEul>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataCoverageRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataCoverageRelation>
+
+<es:utranCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,UtranCell=RNC01-2-3</es:utranCellRef>
+<es:coverageIndicator>1</es:coverageIndicator>
+<es:hsPathlossThreshold>170</es:hsPathlossThreshold>
+</es:vsDataCoverageRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer></un:UtranCell>
+<un:UtranCell id="RNC01-2-3" modifier="create">
+<un:attributes>
+
+<un:userLabel>RNC01-2-3</un:userLabel>
+<un:cId>6</un:cId>
+<un:localCellId>3</un:localCellId>
+<un:uarfcnUl>12</un:uarfcnUl>
+<un:uarfcnDl>6</un:uarfcnDl>
+<un:primaryScramblingCode>6</un:primaryScramblingCode>
+<un:primaryCpichPower>300</un:primaryCpichPower>
+<un:maximumTransmissionPower>400</un:maximumTransmissionPower>
+<un:primarySchPower>-18</un:primarySchPower>
+<un:secondarySchPower>-35</un:secondarySchPower>
+<un:bchPower>-31</un:bchPower>
+<un:utranCellIubLink>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=2</un:utranCellIubLink>
+<un:lac>3422</un:lac>
+<un:rac>3423</un:rac>
+<un:sac>3426</un:sac>
+</un:attributes>
+</un:UtranCell>
+
+<un:UtranCell id="RNC01-2-3" modifier="update">
+
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>1</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>2</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>3</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>4</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>5</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>6</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>7</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>8</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>9</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>10</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="11" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>11</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="12" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>12</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="13" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>13</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="14" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>14</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="15" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>15</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="16" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>16</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="17" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>17</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="18" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>18</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="19" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>19</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="20" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>20</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="21" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>21</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="22" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>22</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="23" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>23</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="24" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>24</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="25" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>25</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="26" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>26</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="27" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>27</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="28" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>28</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="29" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>29</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="30" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>30</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>31</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=3</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>32</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=4</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>33</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=5</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>34</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=6</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>35</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=7</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>36</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=8</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>37</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=9</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>38</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50101</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>39</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50102</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>40</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50103</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="RNC01-2-3" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranCell</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranCell>
+
+<es:tCell>3</es:tCell>
+<es:cellReserved>1</es:cellReserved>
+<es:treSelection>2</es:treSelection>
+<es:qualMeasQuantity>2</es:qualMeasQuantity>
+<es:qHyst1>4</es:qHyst1>
+<es:qHyst2>4</es:qHyst2>
+<es:qQualMin>-24</es:qQualMin>
+<es:qRxLevMin>-115</es:qRxLevMin>
+<es:individualOffset>0</es:individualOffset>
+<es:pwrAdm>75</es:pwrAdm>
+<es:pwrOffset>5</es:pwrOffset>
+<es:pwrHyst>300</es:pwrHyst>
+<es:tmCongAction>2000</es:tmCongAction>
+<es:releaseAseDl>1</es:releaseAseDl>
+<es:aseDlAdm>240</es:aseDlAdm>
+<es:dlCodeAdm>80</es:dlCodeAdm>
+<es:aseUlAdm>160</es:aseUlAdm>
+<es:sf8Adm>8</es:sf8Adm>
+<es:sf32Adm>32</es:sf32Adm>
+<es:minPwrRl>-150</es:minPwrRl>
+<es:maxRate>40690</es:maxRate>
+<es:interRate>7760</es:interRate>
+<es:minimumRate>1590</es:minimumRate>
+<es:maxPwrMax>48</es:maxPwrMax>
+<es:interPwrMax>38</es:interPwrMax>
+<es:minPwrMax>0</es:minPwrMax>
+<es:compModeAdm>15</es:compModeAdm>
+<es:iFHyst>6000</es:iFHyst>
+<es:iFCong>621</es:iFCong>
+<es:interFreqFddMeasIndicator>0</es:interFreqFddMeasIndicator>
+<es:sRatSearch>4</es:sRatSearch>
+<es:sIntraSearch>0</es:sIntraSearch>
+<es:sInterSearch>0</es:sInterSearch>
+<es:fachMeasOccaCycLenCoeff>0</es:fachMeasOccaCycLenCoeff>
+
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:utranCellPosition></es:utranCellPosition>
+<es:maxTxPowerUl>24</es:maxTxPowerUl>
+
+<es:sib1PlmnScopeValueTag>0</es:sib1PlmnScopeValueTag>
+<es:sf16Adm>16</es:sf16Adm>
+<es:hoType>1</es:hoType>
+<es:usedFreqThresh2dEcno>-12</es:usedFreqThresh2dEcno>
+<es:usedFreqThresh2dRscp>-97</es:usedFreqThresh2dRscp>
+<es:administrativeState>0</es:administrativeState>
+<es:loadSharingGsmThreshold>75</es:loadSharingGsmThreshold>
+<es:loadSharingGsmFraction>100</es:loadSharingGsmFraction>
+<es:nInSyncInd>3</es:nInSyncInd>
+<es:rlFailureT>10</es:rlFailureT>
+<es:nOutSyncInd>10</es:nOutSyncInd>
+<es:sf4AdmUl>0</es:sf4AdmUl>
+<es:hardIfhoCorr>3</es:hardIfhoCorr>
+<es:hsdpaUsersAdm>10</es:hsdpaUsersAdm>
+<es:loadSharingMargin>0</es:loadSharingMargin>
+<es:sHcsRat>-105</es:sHcsRat>
+<es:sf16gAdm>16</es:sf16gAdm>
+<es:releaseAseDlNg>3</es:releaseAseDlNg>
+<es:tmCongActionNg>800</es:tmCongActionNg>
+<es:tmInitialG>3000</es:tmInitialG>
+<es:sf16AdmUl>16</es:sf16AdmUl>
+<es:sf8AdmUl>8</es:sf8AdmUl>
+<es:sf8gAdmUl>0</es:sf8gAdmUl>
+<es:iubLinkRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=2</es:iubLinkRef>
+<es:eulNonServingCellUsersAdm>100</es:eulNonServingCellUsersAdm>
+<es:eulServingCellUsersAdm>32</es:eulServingCellUsersAdm>
+<es:agpsEnabled>1</es:agpsEnabled>
+<es:codeLoadThresholdDlSf128>100</es:codeLoadThresholdDlSf128>
+<es:pwrLoadThresholdDlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:pwrLoadThresholdDlSpeech>
+<es:aseLoadThresholdUlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:aseLoadThresholdUlSpeech>
+
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:rateSelectionPsInteractive>
+<es:channelType>0</es:channelType>
+<es:ulPrefRate>64</es:ulPrefRate>
+<es:dlPrefRate>64</es:dlPrefRate></es:rateSelectionPsInteractive>
+<es:hcsUsage>
+<es:idleMode>0</es:idleMode>
+<es:connectedMode>0</es:connectedMode></es:hcsUsage>
+<es:hcsSib3Config>
+<es:sSearchHcs>-105</es:sSearchHcs>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs></es:hcsSib3Config>
+</es:vsDataUtranCell>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataFach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataFach>
+
+<es:userLabel>Fach-2-3</es:userLabel>
+<es:maxFach1Power>18</es:maxFach1Power>
+<es:maxFach2Power>15</es:maxFach2Power>
+<es:sccpchOffset>0</es:sccpchOffset>
+<es:pOffset1Fach>0</es:pOffset1Fach>
+<es:pOffset3Fach>0</es:pOffset3Fach>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataFach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataRach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataRach>
+
+<es:userLabel>Rach-2-3</es:userLabel>
+<es:scramblingCodeWordNo>0</es:scramblingCodeWordNo>
+<es:preambleSignatures>65535</es:preambleSignatures>
+<es:subChannelNo>4095</es:subChannelNo>
+<es:aichTransmissionTiming>4</es:aichTransmissionTiming>
+<es:aichPower>-6</es:aichPower>
+<es:powerOffsetP0>3</es:powerOffsetP0>
+<es:powerOffsetPpm>-4</es:powerOffsetPpm>
+<es:preambleRetransMax>5</es:preambleRetransMax>
+<es:maxPreambleCycle>4</es:maxPreambleCycle>
+<es:constantValueCprach>-27</es:constantValueCprach>
+<es:spreadingFactor>64</es:spreadingFactor>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataRach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPch>
+
+<es:userLabel>Pch-2-3</es:userLabel>
+<es:pchPower>-4</es:pchPower>
+<es:pichPower>-7</es:pichPower>
+<es:sccpchOffset>20</es:sccpchOffset>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataPch>
+</xn:attributes>
+</xn:VsDataContainer><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-2-3</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-2-3</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataEul</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataEul>
+
+<es:userLabel>Eul-2-3</es:userLabel>
+<es:administrativeState>0</es:administrativeState>
+<es:numEagchCodes>1</es:numEagchCodes>
+<es:numEhichErgchCodes>1</es:numEhichErgchCodes>
+<es:eulMaxTargetRtwp>-499</es:eulMaxTargetRtwp>
+</es:vsDataEul>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataCoverageRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataCoverageRelation>
+
+<es:utranCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,UtranCell=RNC01-2-1</es:utranCellRef>
+<es:coverageIndicator>1</es:coverageIndicator>
+<es:hsPathlossThreshold>170</es:hsPathlossThreshold>
+</es:vsDataCoverageRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer></un:UtranCell>
+<un:UtranCell id="RNC01-3-1" modifier="create">
+<un:attributes>
+
+<un:userLabel>RNC01-3-1</un:userLabel>
+<un:cId>7</un:cId>
+<un:localCellId>1</un:localCellId>
+<un:uarfcnUl>12</un:uarfcnUl>
+<un:uarfcnDl>7</un:uarfcnDl>
+<un:primaryScramblingCode>7</un:primaryScramblingCode>
+<un:primaryCpichPower>300</un:primaryCpichPower>
+<un:maximumTransmissionPower>400</un:maximumTransmissionPower>
+<un:primarySchPower>-18</un:primarySchPower>
+<un:secondarySchPower>-35</un:secondarySchPower>
+<un:bchPower>-31</un:bchPower>
+<un:utranCellIubLink>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=3</un:utranCellIubLink>
+<un:lac>3427</un:lac>
+<un:rac>3428</un:rac>
+<un:sac>3429</un:sac>
+</un:attributes>
+</un:UtranCell>
+
+<un:UtranCell id="RNC01-3-1" modifier="update">
+
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>1</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>2</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>3</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>4</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>5</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>6</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>7</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>8</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>9</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>10</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="11" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>11</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="12" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>12</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="13" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>13</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="14" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>14</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="15" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>15</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="16" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>16</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="17" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>17</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="18" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>18</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="19" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>19</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="20" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>20</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="21" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>21</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="22" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>22</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="23" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>23</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="24" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>24</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="25" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>25</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="26" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>26</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="27" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>27</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="28" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>28</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="29" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>29</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="30" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>30</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>31</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=1</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>32</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=2</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>33</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=3</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>34</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=4</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>35</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=5</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>36</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=6</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>37</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=7</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>38</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=8</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>39</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=9</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>40</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50101</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="RNC01-3-1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranCell</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranCell>
+
+<es:tCell>1</es:tCell>
+<es:cellReserved>1</es:cellReserved>
+<es:treSelection>2</es:treSelection>
+<es:qualMeasQuantity>2</es:qualMeasQuantity>
+<es:qHyst1>4</es:qHyst1>
+<es:qHyst2>4</es:qHyst2>
+<es:qQualMin>-24</es:qQualMin>
+<es:qRxLevMin>-115</es:qRxLevMin>
+<es:individualOffset>0</es:individualOffset>
+<es:pwrAdm>75</es:pwrAdm>
+<es:pwrOffset>5</es:pwrOffset>
+<es:pwrHyst>300</es:pwrHyst>
+<es:tmCongAction>2000</es:tmCongAction>
+<es:releaseAseDl>1</es:releaseAseDl>
+<es:aseDlAdm>240</es:aseDlAdm>
+<es:dlCodeAdm>80</es:dlCodeAdm>
+<es:aseUlAdm>160</es:aseUlAdm>
+<es:sf8Adm>8</es:sf8Adm>
+<es:sf32Adm>32</es:sf32Adm>
+<es:minPwrRl>-150</es:minPwrRl>
+<es:maxRate>40690</es:maxRate>
+<es:interRate>7760</es:interRate>
+<es:minimumRate>1590</es:minimumRate>
+<es:maxPwrMax>48</es:maxPwrMax>
+<es:interPwrMax>38</es:interPwrMax>
+<es:minPwrMax>0</es:minPwrMax>
+<es:compModeAdm>15</es:compModeAdm>
+<es:iFHyst>6000</es:iFHyst>
+<es:iFCong>621</es:iFCong>
+<es:interFreqFddMeasIndicator>0</es:interFreqFddMeasIndicator>
+<es:sRatSearch>4</es:sRatSearch>
+<es:sIntraSearch>0</es:sIntraSearch>
+<es:sInterSearch>0</es:sInterSearch>
+<es:fachMeasOccaCycLenCoeff>0</es:fachMeasOccaCycLenCoeff>
+
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:utranCellPosition></es:utranCellPosition>
+<es:maxTxPowerUl>24</es:maxTxPowerUl>
+
+<es:sib1PlmnScopeValueTag>0</es:sib1PlmnScopeValueTag>
+<es:sf16Adm>16</es:sf16Adm>
+<es:hoType>1</es:hoType>
+<es:usedFreqThresh2dEcno>-12</es:usedFreqThresh2dEcno>
+<es:usedFreqThresh2dRscp>-97</es:usedFreqThresh2dRscp>
+<es:administrativeState>0</es:administrativeState>
+<es:loadSharingGsmThreshold>75</es:loadSharingGsmThreshold>
+<es:loadSharingGsmFraction>100</es:loadSharingGsmFraction>
+<es:nInSyncInd>3</es:nInSyncInd>
+<es:rlFailureT>10</es:rlFailureT>
+<es:nOutSyncInd>10</es:nOutSyncInd>
+<es:sf4AdmUl>0</es:sf4AdmUl>
+<es:hardIfhoCorr>3</es:hardIfhoCorr>
+<es:hsdpaUsersAdm>10</es:hsdpaUsersAdm>
+<es:loadSharingMargin>0</es:loadSharingMargin>
+<es:sHcsRat>-105</es:sHcsRat>
+<es:sf16gAdm>16</es:sf16gAdm>
+<es:releaseAseDlNg>3</es:releaseAseDlNg>
+<es:tmCongActionNg>800</es:tmCongActionNg>
+<es:tmInitialG>3000</es:tmInitialG>
+<es:sf16AdmUl>16</es:sf16AdmUl>
+<es:sf8AdmUl>8</es:sf8AdmUl>
+<es:sf8gAdmUl>0</es:sf8gAdmUl>
+<es:iubLinkRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=3</es:iubLinkRef>
+<es:eulNonServingCellUsersAdm>100</es:eulNonServingCellUsersAdm>
+<es:eulServingCellUsersAdm>32</es:eulServingCellUsersAdm>
+<es:agpsEnabled>1</es:agpsEnabled>
+<es:codeLoadThresholdDlSf128>100</es:codeLoadThresholdDlSf128>
+<es:pwrLoadThresholdDlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:pwrLoadThresholdDlSpeech>
+<es:aseLoadThresholdUlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:aseLoadThresholdUlSpeech>
+
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:rateSelectionPsInteractive>
+<es:channelType>0</es:channelType>
+<es:ulPrefRate>64</es:ulPrefRate>
+<es:dlPrefRate>64</es:dlPrefRate></es:rateSelectionPsInteractive>
+<es:hcsUsage>
+<es:idleMode>0</es:idleMode>
+<es:connectedMode>0</es:connectedMode></es:hcsUsage>
+<es:hcsSib3Config>
+<es:sSearchHcs>-105</es:sSearchHcs>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs></es:hcsSib3Config>
+</es:vsDataUtranCell>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataFach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataFach>
+
+<es:userLabel>Fach-3-1</es:userLabel>
+<es:maxFach1Power>18</es:maxFach1Power>
+<es:maxFach2Power>15</es:maxFach2Power>
+<es:sccpchOffset>0</es:sccpchOffset>
+<es:pOffset1Fach>0</es:pOffset1Fach>
+<es:pOffset3Fach>0</es:pOffset3Fach>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataFach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataRach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataRach>
+
+<es:userLabel>Rach-3-1</es:userLabel>
+<es:scramblingCodeWordNo>0</es:scramblingCodeWordNo>
+<es:preambleSignatures>65535</es:preambleSignatures>
+<es:subChannelNo>4095</es:subChannelNo>
+<es:aichTransmissionTiming>4</es:aichTransmissionTiming>
+<es:aichPower>-6</es:aichPower>
+<es:powerOffsetP0>3</es:powerOffsetP0>
+<es:powerOffsetPpm>-4</es:powerOffsetPpm>
+<es:preambleRetransMax>5</es:preambleRetransMax>
+<es:maxPreambleCycle>4</es:maxPreambleCycle>
+<es:constantValueCprach>-27</es:constantValueCprach>
+<es:spreadingFactor>64</es:spreadingFactor>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataRach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPch>
+
+<es:userLabel>Pch-3-1</es:userLabel>
+<es:pchPower>-4</es:pchPower>
+<es:pichPower>-7</es:pichPower>
+<es:sccpchOffset>20</es:sccpchOffset>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataPch>
+</xn:attributes>
+</xn:VsDataContainer><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-3-1</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-3-1</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataEul</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataEul>
+
+<es:userLabel>Eul-3-1</es:userLabel>
+<es:administrativeState>0</es:administrativeState>
+<es:numEagchCodes>1</es:numEagchCodes>
+<es:numEhichErgchCodes>1</es:numEhichErgchCodes>
+<es:eulMaxTargetRtwp>-499</es:eulMaxTargetRtwp>
+</es:vsDataEul>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataCoverageRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataCoverageRelation>
+
+<es:utranCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,UtranCell=RNC01-3-2</es:utranCellRef>
+<es:coverageIndicator>1</es:coverageIndicator>
+<es:hsPathlossThreshold>170</es:hsPathlossThreshold>
+</es:vsDataCoverageRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer></un:UtranCell>
+<un:UtranCell id="RNC01-3-2" modifier="create">
+<un:attributes>
+
+<un:userLabel>RNC01-3-2</un:userLabel>
+<un:cId>8</un:cId>
+<un:localCellId>2</un:localCellId>
+<un:uarfcnUl>12</un:uarfcnUl>
+<un:uarfcnDl>7</un:uarfcnDl>
+<un:primaryScramblingCode>8</un:primaryScramblingCode>
+<un:primaryCpichPower>300</un:primaryCpichPower>
+<un:maximumTransmissionPower>400</un:maximumTransmissionPower>
+<un:primarySchPower>-18</un:primarySchPower>
+<un:secondarySchPower>-35</un:secondarySchPower>
+<un:bchPower>-31</un:bchPower>
+<un:utranCellIubLink>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=3</un:utranCellIubLink>
+<un:lac>3427</un:lac>
+<un:rac>3428</un:rac>
+<un:sac>3430</un:sac>
+</un:attributes>
+</un:UtranCell>
+
+<un:UtranCell id="RNC01-3-2" modifier="update">
+
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>1</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>2</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>3</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>4</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>5</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>6</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>7</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>8</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>9</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>10</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="11" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>11</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="12" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>12</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="13" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>13</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="14" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>14</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="15" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>15</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="16" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>16</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="17" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>17</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="18" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>18</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="19" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>19</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="20" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>20</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="21" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>21</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="22" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>22</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="23" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>23</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="24" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>24</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="25" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>25</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="26" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>26</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="27" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>27</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="28" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>28</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="29" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>29</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="30" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>30</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>31</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50102</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>32</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50103</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>33</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=1</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>34</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=2</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>35</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=3</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>36</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=4</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>37</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=5</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>38</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=6</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>39</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=7</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>40</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=8</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="RNC01-3-2" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranCell</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranCell>
+
+<es:tCell>2</es:tCell>
+<es:cellReserved>1</es:cellReserved>
+<es:treSelection>2</es:treSelection>
+<es:qualMeasQuantity>2</es:qualMeasQuantity>
+<es:qHyst1>4</es:qHyst1>
+<es:qHyst2>4</es:qHyst2>
+<es:qQualMin>-24</es:qQualMin>
+<es:qRxLevMin>-115</es:qRxLevMin>
+<es:individualOffset>0</es:individualOffset>
+<es:pwrAdm>75</es:pwrAdm>
+<es:pwrOffset>5</es:pwrOffset>
+<es:pwrHyst>300</es:pwrHyst>
+<es:tmCongAction>2000</es:tmCongAction>
+<es:releaseAseDl>1</es:releaseAseDl>
+<es:aseDlAdm>240</es:aseDlAdm>
+<es:dlCodeAdm>80</es:dlCodeAdm>
+<es:aseUlAdm>160</es:aseUlAdm>
+<es:sf8Adm>8</es:sf8Adm>
+<es:sf32Adm>32</es:sf32Adm>
+<es:minPwrRl>-150</es:minPwrRl>
+<es:maxRate>40690</es:maxRate>
+<es:interRate>7760</es:interRate>
+<es:minimumRate>1590</es:minimumRate>
+<es:maxPwrMax>48</es:maxPwrMax>
+<es:interPwrMax>38</es:interPwrMax>
+<es:minPwrMax>0</es:minPwrMax>
+<es:compModeAdm>15</es:compModeAdm>
+<es:iFHyst>6000</es:iFHyst>
+<es:iFCong>621</es:iFCong>
+<es:interFreqFddMeasIndicator>0</es:interFreqFddMeasIndicator>
+<es:sRatSearch>4</es:sRatSearch>
+<es:sIntraSearch>0</es:sIntraSearch>
+<es:sInterSearch>0</es:sInterSearch>
+<es:fachMeasOccaCycLenCoeff>0</es:fachMeasOccaCycLenCoeff>
+
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:utranCellPosition></es:utranCellPosition>
+<es:maxTxPowerUl>24</es:maxTxPowerUl>
+
+<es:sib1PlmnScopeValueTag>0</es:sib1PlmnScopeValueTag>
+<es:sf16Adm>16</es:sf16Adm>
+<es:hoType>1</es:hoType>
+<es:usedFreqThresh2dEcno>-12</es:usedFreqThresh2dEcno>
+<es:usedFreqThresh2dRscp>-97</es:usedFreqThresh2dRscp>
+<es:administrativeState>0</es:administrativeState>
+<es:loadSharingGsmThreshold>75</es:loadSharingGsmThreshold>
+<es:loadSharingGsmFraction>100</es:loadSharingGsmFraction>
+<es:nInSyncInd>3</es:nInSyncInd>
+<es:rlFailureT>10</es:rlFailureT>
+<es:nOutSyncInd>10</es:nOutSyncInd>
+<es:sf4AdmUl>0</es:sf4AdmUl>
+<es:hardIfhoCorr>3</es:hardIfhoCorr>
+<es:hsdpaUsersAdm>10</es:hsdpaUsersAdm>
+<es:loadSharingMargin>0</es:loadSharingMargin>
+<es:sHcsRat>-105</es:sHcsRat>
+<es:sf16gAdm>16</es:sf16gAdm>
+<es:releaseAseDlNg>3</es:releaseAseDlNg>
+<es:tmCongActionNg>800</es:tmCongActionNg>
+<es:tmInitialG>3000</es:tmInitialG>
+<es:sf16AdmUl>16</es:sf16AdmUl>
+<es:sf8AdmUl>8</es:sf8AdmUl>
+<es:sf8gAdmUl>0</es:sf8gAdmUl>
+<es:iubLinkRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=3</es:iubLinkRef>
+<es:eulNonServingCellUsersAdm>100</es:eulNonServingCellUsersAdm>
+<es:eulServingCellUsersAdm>32</es:eulServingCellUsersAdm>
+<es:agpsEnabled>1</es:agpsEnabled>
+<es:codeLoadThresholdDlSf128>100</es:codeLoadThresholdDlSf128>
+<es:pwrLoadThresholdDlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:pwrLoadThresholdDlSpeech>
+<es:aseLoadThresholdUlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:aseLoadThresholdUlSpeech>
+
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:rateSelectionPsInteractive>
+<es:channelType>0</es:channelType>
+<es:ulPrefRate>64</es:ulPrefRate>
+<es:dlPrefRate>64</es:dlPrefRate></es:rateSelectionPsInteractive>
+<es:hcsUsage>
+<es:idleMode>0</es:idleMode>
+<es:connectedMode>0</es:connectedMode></es:hcsUsage>
+<es:hcsSib3Config>
+<es:sSearchHcs>-105</es:sSearchHcs>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs></es:hcsSib3Config>
+</es:vsDataUtranCell>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataFach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataFach>
+
+<es:userLabel>Fach-3-2</es:userLabel>
+<es:maxFach1Power>18</es:maxFach1Power>
+<es:maxFach2Power>15</es:maxFach2Power>
+<es:sccpchOffset>0</es:sccpchOffset>
+<es:pOffset1Fach>0</es:pOffset1Fach>
+<es:pOffset3Fach>0</es:pOffset3Fach>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataFach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataRach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataRach>
+
+<es:userLabel>Rach-3-2</es:userLabel>
+<es:scramblingCodeWordNo>0</es:scramblingCodeWordNo>
+<es:preambleSignatures>65535</es:preambleSignatures>
+<es:subChannelNo>4095</es:subChannelNo>
+<es:aichTransmissionTiming>4</es:aichTransmissionTiming>
+<es:aichPower>-6</es:aichPower>
+<es:powerOffsetP0>3</es:powerOffsetP0>
+<es:powerOffsetPpm>-4</es:powerOffsetPpm>
+<es:preambleRetransMax>5</es:preambleRetransMax>
+<es:maxPreambleCycle>4</es:maxPreambleCycle>
+<es:constantValueCprach>-27</es:constantValueCprach>
+<es:spreadingFactor>64</es:spreadingFactor>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataRach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPch>
+
+<es:userLabel>Pch-3-2</es:userLabel>
+<es:pchPower>-4</es:pchPower>
+<es:pichPower>-7</es:pichPower>
+<es:sccpchOffset>20</es:sccpchOffset>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataPch>
+</xn:attributes>
+</xn:VsDataContainer><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-3-2</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-3-2</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataEul</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataEul>
+
+<es:userLabel>Eul-3-2</es:userLabel>
+<es:administrativeState>0</es:administrativeState>
+<es:numEagchCodes>1</es:numEagchCodes>
+<es:numEhichErgchCodes>1</es:numEhichErgchCodes>
+<es:eulMaxTargetRtwp>-499</es:eulMaxTargetRtwp>
+</es:vsDataEul>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataCoverageRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataCoverageRelation>
+
+<es:utranCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,UtranCell=RNC01-3-3</es:utranCellRef>
+<es:coverageIndicator>1</es:coverageIndicator>
+<es:hsPathlossThreshold>170</es:hsPathlossThreshold>
+</es:vsDataCoverageRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer></un:UtranCell>
+<un:UtranCell id="RNC01-3-3" modifier="create">
+<un:attributes>
+
+<un:userLabel>RNC01-3-3</un:userLabel>
+<un:cId>9</un:cId>
+<un:localCellId>3</un:localCellId>
+<un:uarfcnUl>12</un:uarfcnUl>
+<un:uarfcnDl>7</un:uarfcnDl>
+<un:primaryScramblingCode>9</un:primaryScramblingCode>
+<un:primaryCpichPower>300</un:primaryCpichPower>
+<un:maximumTransmissionPower>400</un:maximumTransmissionPower>
+<un:primarySchPower>-18</un:primarySchPower>
+<un:secondarySchPower>-35</un:secondarySchPower>
+<un:bchPower>-31</un:bchPower>
+<un:utranCellIubLink>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=3</un:utranCellIubLink>
+<un:lac>3427</un:lac>
+<un:rac>3428</un:rac>
+<un:sac>3431</un:sac>
+</un:attributes>
+</un:UtranCell>
+
+<un:UtranCell id="RNC01-3-3" modifier="update">
+
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>1</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>2</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>3</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>4</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>5</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>6</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>7</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>8</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>9</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>10</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="11" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>11</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="12" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>12</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="13" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>13</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="14" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>14</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="15" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>15</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="16" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>16</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="17" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>17</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="18" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>18</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="19" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>19</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="20" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>20</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="21" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>21</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="22" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>22</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="23" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>23</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="24" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>24</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="25" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>25</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="26" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>26</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="27" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>27</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="28" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>28</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="29" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>29</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="30" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>30</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>31</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=9</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>32</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50101</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>33</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50102</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>34</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50103</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>35</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=1</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>36</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=2</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>37</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=3</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>38</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=4</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>39</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=5</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>40</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=6</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="RNC01-3-3" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranCell</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranCell>
+
+<es:tCell>3</es:tCell>
+<es:cellReserved>1</es:cellReserved>
+<es:treSelection>2</es:treSelection>
+<es:qualMeasQuantity>2</es:qualMeasQuantity>
+<es:qHyst1>4</es:qHyst1>
+<es:qHyst2>4</es:qHyst2>
+<es:qQualMin>-24</es:qQualMin>
+<es:qRxLevMin>-115</es:qRxLevMin>
+<es:individualOffset>0</es:individualOffset>
+<es:pwrAdm>75</es:pwrAdm>
+<es:pwrOffset>5</es:pwrOffset>
+<es:pwrHyst>300</es:pwrHyst>
+<es:tmCongAction>2000</es:tmCongAction>
+<es:releaseAseDl>1</es:releaseAseDl>
+<es:aseDlAdm>240</es:aseDlAdm>
+<es:dlCodeAdm>80</es:dlCodeAdm>
+<es:aseUlAdm>160</es:aseUlAdm>
+<es:sf8Adm>8</es:sf8Adm>
+<es:sf32Adm>32</es:sf32Adm>
+<es:minPwrRl>-150</es:minPwrRl>
+<es:maxRate>40690</es:maxRate>
+<es:interRate>7760</es:interRate>
+<es:minimumRate>1590</es:minimumRate>
+<es:maxPwrMax>48</es:maxPwrMax>
+<es:interPwrMax>38</es:interPwrMax>
+<es:minPwrMax>0</es:minPwrMax>
+<es:compModeAdm>15</es:compModeAdm>
+<es:iFHyst>6000</es:iFHyst>
+<es:iFCong>621</es:iFCong>
+<es:interFreqFddMeasIndicator>0</es:interFreqFddMeasIndicator>
+<es:sRatSearch>4</es:sRatSearch>
+<es:sIntraSearch>0</es:sIntraSearch>
+<es:sInterSearch>0</es:sInterSearch>
+<es:fachMeasOccaCycLenCoeff>0</es:fachMeasOccaCycLenCoeff>
+
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:utranCellPosition></es:utranCellPosition>
+<es:maxTxPowerUl>24</es:maxTxPowerUl>
+
+<es:sib1PlmnScopeValueTag>0</es:sib1PlmnScopeValueTag>
+<es:sf16Adm>16</es:sf16Adm>
+<es:hoType>1</es:hoType>
+<es:usedFreqThresh2dEcno>-12</es:usedFreqThresh2dEcno>
+<es:usedFreqThresh2dRscp>-97</es:usedFreqThresh2dRscp>
+<es:administrativeState>0</es:administrativeState>
+<es:loadSharingGsmThreshold>75</es:loadSharingGsmThreshold>
+<es:loadSharingGsmFraction>100</es:loadSharingGsmFraction>
+<es:nInSyncInd>3</es:nInSyncInd>
+<es:rlFailureT>10</es:rlFailureT>
+<es:nOutSyncInd>10</es:nOutSyncInd>
+<es:sf4AdmUl>0</es:sf4AdmUl>
+<es:hardIfhoCorr>3</es:hardIfhoCorr>
+<es:hsdpaUsersAdm>10</es:hsdpaUsersAdm>
+<es:loadSharingMargin>0</es:loadSharingMargin>
+<es:sHcsRat>-105</es:sHcsRat>
+<es:sf16gAdm>16</es:sf16gAdm>
+<es:releaseAseDlNg>3</es:releaseAseDlNg>
+<es:tmCongActionNg>800</es:tmCongActionNg>
+<es:tmInitialG>3000</es:tmInitialG>
+<es:sf16AdmUl>16</es:sf16AdmUl>
+<es:sf8AdmUl>8</es:sf8AdmUl>
+<es:sf8gAdmUl>0</es:sf8gAdmUl>
+<es:iubLinkRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=3</es:iubLinkRef>
+<es:eulNonServingCellUsersAdm>100</es:eulNonServingCellUsersAdm>
+<es:eulServingCellUsersAdm>32</es:eulServingCellUsersAdm>
+<es:agpsEnabled>1</es:agpsEnabled>
+<es:codeLoadThresholdDlSf128>100</es:codeLoadThresholdDlSf128>
+<es:pwrLoadThresholdDlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:pwrLoadThresholdDlSpeech>
+<es:aseLoadThresholdUlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:aseLoadThresholdUlSpeech>
+
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:rateSelectionPsInteractive>
+<es:channelType>0</es:channelType>
+<es:ulPrefRate>64</es:ulPrefRate>
+<es:dlPrefRate>64</es:dlPrefRate></es:rateSelectionPsInteractive>
+<es:hcsUsage>
+<es:idleMode>0</es:idleMode>
+<es:connectedMode>0</es:connectedMode></es:hcsUsage>
+<es:hcsSib3Config>
+<es:sSearchHcs>-105</es:sSearchHcs>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs></es:hcsSib3Config>
+</es:vsDataUtranCell>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataFach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataFach>
+
+<es:userLabel>Fach-3-3</es:userLabel>
+<es:maxFach1Power>18</es:maxFach1Power>
+<es:maxFach2Power>15</es:maxFach2Power>
+<es:sccpchOffset>0</es:sccpchOffset>
+<es:pOffset1Fach>0</es:pOffset1Fach>
+<es:pOffset3Fach>0</es:pOffset3Fach>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataFach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataRach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataRach>
+
+<es:userLabel>Rach-3-3</es:userLabel>
+<es:scramblingCodeWordNo>0</es:scramblingCodeWordNo>
+<es:preambleSignatures>65535</es:preambleSignatures>
+<es:subChannelNo>4095</es:subChannelNo>
+<es:aichTransmissionTiming>4</es:aichTransmissionTiming>
+<es:aichPower>-6</es:aichPower>
+<es:powerOffsetP0>3</es:powerOffsetP0>
+<es:powerOffsetPpm>-4</es:powerOffsetPpm>
+<es:preambleRetransMax>5</es:preambleRetransMax>
+<es:maxPreambleCycle>4</es:maxPreambleCycle>
+<es:constantValueCprach>-27</es:constantValueCprach>
+<es:spreadingFactor>64</es:spreadingFactor>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataRach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPch>
+
+<es:userLabel>Pch-3-3</es:userLabel>
+<es:pchPower>-4</es:pchPower>
+<es:pichPower>-7</es:pichPower>
+<es:sccpchOffset>20</es:sccpchOffset>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataPch>
+</xn:attributes>
+</xn:VsDataContainer><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-3-3</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-3-3</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataEul</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataEul>
+
+<es:userLabel>Eul-3-3</es:userLabel>
+<es:administrativeState>0</es:administrativeState>
+<es:numEagchCodes>1</es:numEagchCodes>
+<es:numEhichErgchCodes>1</es:numEhichErgchCodes>
+<es:eulMaxTargetRtwp>-499</es:eulMaxTargetRtwp>
+</es:vsDataEul>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataCoverageRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataCoverageRelation>
+
+<es:utranCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,UtranCell=RNC01-3-1</es:utranCellRef>
+<es:coverageIndicator>1</es:coverageIndicator>
+<es:hsPathlossThreshold>170</es:hsPathlossThreshold>
+</es:vsDataCoverageRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer></un:UtranCell>
+<un:UtranCell id="RNC01-4-1" modifier="create">
+<un:attributes>
+
+<un:userLabel>RNC01-4-1</un:userLabel>
+<un:cId>10</un:cId>
+<un:localCellId>1</un:localCellId>
+<un:uarfcnUl>12</un:uarfcnUl>
+<un:uarfcnDl>8</un:uarfcnDl>
+<un:primaryScramblingCode>10</un:primaryScramblingCode>
+<un:primaryCpichPower>300</un:primaryCpichPower>
+<un:maximumTransmissionPower>400</un:maximumTransmissionPower>
+<un:primarySchPower>-18</un:primarySchPower>
+<un:secondarySchPower>-35</un:secondarySchPower>
+<un:bchPower>-31</un:bchPower>
+<un:utranCellIubLink>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=4</un:utranCellIubLink>
+<un:lac>3432</un:lac>
+<un:rac>3433</un:rac>
+<un:sac>3434</un:sac>
+</un:attributes>
+</un:UtranCell>
+
+<un:UtranCell id="RNC01-4-1" modifier="update">
+
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>1</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>2</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>3</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>4</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>5</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>6</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>7</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>8</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>9</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>10</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="11" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>11</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="12" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>12</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="13" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>13</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="14" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>14</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="15" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>15</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="16" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>16</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="17" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>17</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="18" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>18</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="19" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>19</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="20" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>20</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="21" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>21</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="22" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>22</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="23" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>23</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="24" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>24</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="25" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>25</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="26" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>26</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="27" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>27</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="28" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>28</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="29" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>29</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="30" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>30</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>31</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=7</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>32</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=8</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>33</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=9</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>34</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50101</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>35</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50102</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>36</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50103</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>37</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=1</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>38</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=2</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>39</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=3</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>40</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=4</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="RNC01-4-1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranCell</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranCell>
+
+<es:tCell>1</es:tCell>
+<es:cellReserved>1</es:cellReserved>
+<es:treSelection>2</es:treSelection>
+<es:qualMeasQuantity>2</es:qualMeasQuantity>
+<es:qHyst1>4</es:qHyst1>
+<es:qHyst2>4</es:qHyst2>
+<es:qQualMin>-24</es:qQualMin>
+<es:qRxLevMin>-115</es:qRxLevMin>
+<es:individualOffset>0</es:individualOffset>
+<es:pwrAdm>75</es:pwrAdm>
+<es:pwrOffset>5</es:pwrOffset>
+<es:pwrHyst>300</es:pwrHyst>
+<es:tmCongAction>2000</es:tmCongAction>
+<es:releaseAseDl>1</es:releaseAseDl>
+<es:aseDlAdm>240</es:aseDlAdm>
+<es:dlCodeAdm>80</es:dlCodeAdm>
+<es:aseUlAdm>160</es:aseUlAdm>
+<es:sf8Adm>8</es:sf8Adm>
+<es:sf32Adm>32</es:sf32Adm>
+<es:minPwrRl>-150</es:minPwrRl>
+<es:maxRate>40690</es:maxRate>
+<es:interRate>7760</es:interRate>
+<es:minimumRate>1590</es:minimumRate>
+<es:maxPwrMax>48</es:maxPwrMax>
+<es:interPwrMax>38</es:interPwrMax>
+<es:minPwrMax>0</es:minPwrMax>
+<es:compModeAdm>15</es:compModeAdm>
+<es:iFHyst>6000</es:iFHyst>
+<es:iFCong>621</es:iFCong>
+<es:interFreqFddMeasIndicator>0</es:interFreqFddMeasIndicator>
+<es:sRatSearch>4</es:sRatSearch>
+<es:sIntraSearch>0</es:sIntraSearch>
+<es:sInterSearch>0</es:sInterSearch>
+<es:fachMeasOccaCycLenCoeff>0</es:fachMeasOccaCycLenCoeff>
+
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:utranCellPosition></es:utranCellPosition>
+<es:maxTxPowerUl>24</es:maxTxPowerUl>
+
+<es:sib1PlmnScopeValueTag>0</es:sib1PlmnScopeValueTag>
+<es:sf16Adm>16</es:sf16Adm>
+<es:hoType>1</es:hoType>
+<es:usedFreqThresh2dEcno>-12</es:usedFreqThresh2dEcno>
+<es:usedFreqThresh2dRscp>-97</es:usedFreqThresh2dRscp>
+<es:administrativeState>0</es:administrativeState>
+<es:loadSharingGsmThreshold>75</es:loadSharingGsmThreshold>
+<es:loadSharingGsmFraction>100</es:loadSharingGsmFraction>
+<es:nInSyncInd>3</es:nInSyncInd>
+<es:rlFailureT>10</es:rlFailureT>
+<es:nOutSyncInd>10</es:nOutSyncInd>
+<es:sf4AdmUl>0</es:sf4AdmUl>
+<es:hardIfhoCorr>3</es:hardIfhoCorr>
+<es:hsdpaUsersAdm>10</es:hsdpaUsersAdm>
+<es:loadSharingMargin>0</es:loadSharingMargin>
+<es:sHcsRat>-105</es:sHcsRat>
+<es:sf16gAdm>16</es:sf16gAdm>
+<es:releaseAseDlNg>3</es:releaseAseDlNg>
+<es:tmCongActionNg>800</es:tmCongActionNg>
+<es:tmInitialG>3000</es:tmInitialG>
+<es:sf16AdmUl>16</es:sf16AdmUl>
+<es:sf8AdmUl>8</es:sf8AdmUl>
+<es:sf8gAdmUl>0</es:sf8gAdmUl>
+<es:iubLinkRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=4</es:iubLinkRef>
+<es:eulNonServingCellUsersAdm>100</es:eulNonServingCellUsersAdm>
+<es:eulServingCellUsersAdm>32</es:eulServingCellUsersAdm>
+<es:agpsEnabled>1</es:agpsEnabled>
+<es:codeLoadThresholdDlSf128>100</es:codeLoadThresholdDlSf128>
+<es:pwrLoadThresholdDlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:pwrLoadThresholdDlSpeech>
+<es:aseLoadThresholdUlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:aseLoadThresholdUlSpeech>
+
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:rateSelectionPsInteractive>
+<es:channelType>0</es:channelType>
+<es:ulPrefRate>64</es:ulPrefRate>
+<es:dlPrefRate>64</es:dlPrefRate></es:rateSelectionPsInteractive>
+<es:hcsUsage>
+<es:idleMode>0</es:idleMode>
+<es:connectedMode>0</es:connectedMode></es:hcsUsage>
+<es:hcsSib3Config>
+<es:sSearchHcs>-105</es:sSearchHcs>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs></es:hcsSib3Config>
+</es:vsDataUtranCell>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataFach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataFach>
+
+<es:userLabel>Fach-4-1</es:userLabel>
+<es:maxFach1Power>18</es:maxFach1Power>
+<es:maxFach2Power>15</es:maxFach2Power>
+<es:sccpchOffset>0</es:sccpchOffset>
+<es:pOffset1Fach>0</es:pOffset1Fach>
+<es:pOffset3Fach>0</es:pOffset3Fach>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataFach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataRach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataRach>
+
+<es:userLabel>Rach-4-1</es:userLabel>
+<es:scramblingCodeWordNo>0</es:scramblingCodeWordNo>
+<es:preambleSignatures>65535</es:preambleSignatures>
+<es:subChannelNo>4095</es:subChannelNo>
+<es:aichTransmissionTiming>4</es:aichTransmissionTiming>
+<es:aichPower>-6</es:aichPower>
+<es:powerOffsetP0>3</es:powerOffsetP0>
+<es:powerOffsetPpm>-4</es:powerOffsetPpm>
+<es:preambleRetransMax>5</es:preambleRetransMax>
+<es:maxPreambleCycle>4</es:maxPreambleCycle>
+<es:constantValueCprach>-27</es:constantValueCprach>
+<es:spreadingFactor>64</es:spreadingFactor>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataRach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPch>
+
+<es:userLabel>Pch-4-1</es:userLabel>
+<es:pchPower>-4</es:pchPower>
+<es:pichPower>-7</es:pichPower>
+<es:sccpchOffset>20</es:sccpchOffset>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataPch>
+</xn:attributes>
+</xn:VsDataContainer><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-4-1</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-4-1</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataEul</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataEul>
+
+<es:userLabel>Eul-4-1</es:userLabel>
+<es:administrativeState>0</es:administrativeState>
+<es:numEagchCodes>1</es:numEagchCodes>
+<es:numEhichErgchCodes>1</es:numEhichErgchCodes>
+<es:eulMaxTargetRtwp>-499</es:eulMaxTargetRtwp>
+</es:vsDataEul>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataCoverageRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataCoverageRelation>
+
+<es:utranCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,UtranCell=RNC01-4-2</es:utranCellRef>
+<es:coverageIndicator>1</es:coverageIndicator>
+<es:hsPathlossThreshold>170</es:hsPathlossThreshold>
+</es:vsDataCoverageRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer></un:UtranCell>
+<un:UtranCell id="RNC01-4-2" modifier="create">
+<un:attributes>
+
+<un:userLabel>RNC01-4-2</un:userLabel>
+<un:cId>11</un:cId>
+<un:localCellId>2</un:localCellId>
+<un:uarfcnUl>12</un:uarfcnUl>
+<un:uarfcnDl>8</un:uarfcnDl>
+<un:primaryScramblingCode>11</un:primaryScramblingCode>
+<un:primaryCpichPower>300</un:primaryCpichPower>
+<un:maximumTransmissionPower>400</un:maximumTransmissionPower>
+<un:primarySchPower>-18</un:primarySchPower>
+<un:secondarySchPower>-35</un:secondarySchPower>
+<un:bchPower>-31</un:bchPower>
+<un:utranCellIubLink>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=4</un:utranCellIubLink>
+<un:lac>3432</un:lac>
+<un:rac>3433</un:rac>
+<un:sac>3435</un:sac>
+</un:attributes>
+</un:UtranCell>
+
+<un:UtranCell id="RNC01-4-2" modifier="update">
+
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>1</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>2</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>3</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>4</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>5</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>6</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>7</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>8</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>9</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>10</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="11" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>11</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="12" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>12</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="13" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>13</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="14" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>14</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="15" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>15</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="16" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>16</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="17" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>17</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="18" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>18</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="19" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>19</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="20" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>20</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="21" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>21</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="22" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>22</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="23" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>23</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="24" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>24</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="25" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>25</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="26" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>26</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="27" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>27</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="28" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>28</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="29" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>29</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="30" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>30</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>31</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=5</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>32</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=6</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>33</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=7</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>34</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=8</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>35</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=9</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>36</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50101</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>37</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50102</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>38</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50103</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>39</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=1</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>40</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=2</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="RNC01-4-2" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranCell</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranCell>
+
+<es:tCell>2</es:tCell>
+<es:cellReserved>1</es:cellReserved>
+<es:treSelection>2</es:treSelection>
+<es:qualMeasQuantity>2</es:qualMeasQuantity>
+<es:qHyst1>4</es:qHyst1>
+<es:qHyst2>4</es:qHyst2>
+<es:qQualMin>-24</es:qQualMin>
+<es:qRxLevMin>-115</es:qRxLevMin>
+<es:individualOffset>0</es:individualOffset>
+<es:pwrAdm>75</es:pwrAdm>
+<es:pwrOffset>5</es:pwrOffset>
+<es:pwrHyst>300</es:pwrHyst>
+<es:tmCongAction>2000</es:tmCongAction>
+<es:releaseAseDl>1</es:releaseAseDl>
+<es:aseDlAdm>240</es:aseDlAdm>
+<es:dlCodeAdm>80</es:dlCodeAdm>
+<es:aseUlAdm>160</es:aseUlAdm>
+<es:sf8Adm>8</es:sf8Adm>
+<es:sf32Adm>32</es:sf32Adm>
+<es:minPwrRl>-150</es:minPwrRl>
+<es:maxRate>40690</es:maxRate>
+<es:interRate>7760</es:interRate>
+<es:minimumRate>1590</es:minimumRate>
+<es:maxPwrMax>48</es:maxPwrMax>
+<es:interPwrMax>38</es:interPwrMax>
+<es:minPwrMax>0</es:minPwrMax>
+<es:compModeAdm>15</es:compModeAdm>
+<es:iFHyst>6000</es:iFHyst>
+<es:iFCong>621</es:iFCong>
+<es:interFreqFddMeasIndicator>0</es:interFreqFddMeasIndicator>
+<es:sRatSearch>4</es:sRatSearch>
+<es:sIntraSearch>0</es:sIntraSearch>
+<es:sInterSearch>0</es:sInterSearch>
+<es:fachMeasOccaCycLenCoeff>0</es:fachMeasOccaCycLenCoeff>
+
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:utranCellPosition></es:utranCellPosition>
+<es:maxTxPowerUl>24</es:maxTxPowerUl>
+
+<es:sib1PlmnScopeValueTag>0</es:sib1PlmnScopeValueTag>
+<es:sf16Adm>16</es:sf16Adm>
+<es:hoType>1</es:hoType>
+<es:usedFreqThresh2dEcno>-12</es:usedFreqThresh2dEcno>
+<es:usedFreqThresh2dRscp>-97</es:usedFreqThresh2dRscp>
+<es:administrativeState>0</es:administrativeState>
+<es:loadSharingGsmThreshold>75</es:loadSharingGsmThreshold>
+<es:loadSharingGsmFraction>100</es:loadSharingGsmFraction>
+<es:nInSyncInd>3</es:nInSyncInd>
+<es:rlFailureT>10</es:rlFailureT>
+<es:nOutSyncInd>10</es:nOutSyncInd>
+<es:sf4AdmUl>0</es:sf4AdmUl>
+<es:hardIfhoCorr>3</es:hardIfhoCorr>
+<es:hsdpaUsersAdm>10</es:hsdpaUsersAdm>
+<es:loadSharingMargin>0</es:loadSharingMargin>
+<es:sHcsRat>-105</es:sHcsRat>
+<es:sf16gAdm>16</es:sf16gAdm>
+<es:releaseAseDlNg>3</es:releaseAseDlNg>
+<es:tmCongActionNg>800</es:tmCongActionNg>
+<es:tmInitialG>3000</es:tmInitialG>
+<es:sf16AdmUl>16</es:sf16AdmUl>
+<es:sf8AdmUl>8</es:sf8AdmUl>
+<es:sf8gAdmUl>0</es:sf8gAdmUl>
+<es:iubLinkRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=4</es:iubLinkRef>
+<es:eulNonServingCellUsersAdm>100</es:eulNonServingCellUsersAdm>
+<es:eulServingCellUsersAdm>32</es:eulServingCellUsersAdm>
+<es:agpsEnabled>1</es:agpsEnabled>
+<es:codeLoadThresholdDlSf128>100</es:codeLoadThresholdDlSf128>
+<es:pwrLoadThresholdDlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:pwrLoadThresholdDlSpeech>
+<es:aseLoadThresholdUlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:aseLoadThresholdUlSpeech>
+
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:rateSelectionPsInteractive>
+<es:channelType>0</es:channelType>
+<es:ulPrefRate>64</es:ulPrefRate>
+<es:dlPrefRate>64</es:dlPrefRate></es:rateSelectionPsInteractive>
+<es:hcsUsage>
+<es:idleMode>0</es:idleMode>
+<es:connectedMode>0</es:connectedMode></es:hcsUsage>
+<es:hcsSib3Config>
+<es:sSearchHcs>-105</es:sSearchHcs>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs></es:hcsSib3Config>
+</es:vsDataUtranCell>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataFach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataFach>
+
+<es:userLabel>Fach-4-2</es:userLabel>
+<es:maxFach1Power>18</es:maxFach1Power>
+<es:maxFach2Power>15</es:maxFach2Power>
+<es:sccpchOffset>0</es:sccpchOffset>
+<es:pOffset1Fach>0</es:pOffset1Fach>
+<es:pOffset3Fach>0</es:pOffset3Fach>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataFach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataRach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataRach>
+
+<es:userLabel>Rach-4-2</es:userLabel>
+<es:scramblingCodeWordNo>0</es:scramblingCodeWordNo>
+<es:preambleSignatures>65535</es:preambleSignatures>
+<es:subChannelNo>4095</es:subChannelNo>
+<es:aichTransmissionTiming>4</es:aichTransmissionTiming>
+<es:aichPower>-6</es:aichPower>
+<es:powerOffsetP0>3</es:powerOffsetP0>
+<es:powerOffsetPpm>-4</es:powerOffsetPpm>
+<es:preambleRetransMax>5</es:preambleRetransMax>
+<es:maxPreambleCycle>4</es:maxPreambleCycle>
+<es:constantValueCprach>-27</es:constantValueCprach>
+<es:spreadingFactor>64</es:spreadingFactor>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataRach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPch>
+
+<es:userLabel>Pch-4-2</es:userLabel>
+<es:pchPower>-4</es:pchPower>
+<es:pichPower>-7</es:pichPower>
+<es:sccpchOffset>20</es:sccpchOffset>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataPch>
+</xn:attributes>
+</xn:VsDataContainer><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-4-2</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-4-2</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataEul</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataEul>
+
+<es:userLabel>Eul-4-2</es:userLabel>
+<es:administrativeState>0</es:administrativeState>
+<es:numEagchCodes>1</es:numEagchCodes>
+<es:numEhichErgchCodes>1</es:numEhichErgchCodes>
+<es:eulMaxTargetRtwp>-499</es:eulMaxTargetRtwp>
+</es:vsDataEul>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataCoverageRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataCoverageRelation>
+
+<es:utranCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,UtranCell=RNC01-4-3</es:utranCellRef>
+<es:coverageIndicator>1</es:coverageIndicator>
+<es:hsPathlossThreshold>170</es:hsPathlossThreshold>
+</es:vsDataCoverageRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer></un:UtranCell>
+<un:UtranCell id="RNC01-4-3" modifier="create">
+<un:attributes>
+
+<un:userLabel>RNC01-4-3</un:userLabel>
+<un:cId>12</un:cId>
+<un:localCellId>3</un:localCellId>
+<un:uarfcnUl>12</un:uarfcnUl>
+<un:uarfcnDl>8</un:uarfcnDl>
+<un:primaryScramblingCode>12</un:primaryScramblingCode>
+<un:primaryCpichPower>300</un:primaryCpichPower>
+<un:maximumTransmissionPower>400</un:maximumTransmissionPower>
+<un:primarySchPower>-18</un:primarySchPower>
+<un:secondarySchPower>-35</un:secondarySchPower>
+<un:bchPower>-31</un:bchPower>
+<un:utranCellIubLink>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=4</un:utranCellIubLink>
+<un:lac>3432</un:lac>
+<un:rac>3433</un:rac>
+<un:sac>3436</un:sac>
+</un:attributes>
+</un:UtranCell>
+
+<un:UtranCell id="RNC01-4-3" modifier="update">
+
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>1</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>2</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>3</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>4</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>5</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>6</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>7</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>8</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>9</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>10</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="11" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>11</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="12" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>12</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="13" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>13</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="14" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>14</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="15" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>15</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="16" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>16</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="17" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>17</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="18" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>18</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="19" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>19</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="20" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>20</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="21" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>21</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="22" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>22</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="23" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>23</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="24" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>24</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="25" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>25</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="26" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>26</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="27" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>27</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="28" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>28</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="29" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>29</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="30" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranRelation>
+
+<es:qOffset1sn>0</es:qOffset1sn>
+<es:qOffset2sn>0</es:qOffset2sn>
+<es:loadSharingCandidate>0</es:loadSharingCandidate>
+<es:selectionPriority>30</es:selectionPriority>
+
+<es:hcsSib11Config>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs>
+<es:penaltyTime>0</es:penaltyTime>
+<es:temporaryOffset1>0</es:temporaryOffset1>
+<es:temporaryOffset2>0</es:temporaryOffset2></es:hcsSib11Config>
+</es:vsDataUtranRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>31</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=3</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>32</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=4</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>33</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=5</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>34</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=6</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>35</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=7</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>36</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=8</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>37</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=9</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>38</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50101</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>39</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50102</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataGsmRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataGsmRelation>
+
+<es:qOffset1sn>7</es:qOffset1sn>
+<es:mobilityRelationType>0</es:mobilityRelationType>
+<es:selectionPriority>40</es:selectionPriority>
+<es:externalGsmCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,ExternalGsmNetwork=84,ExternalGsmCell=50103</es:externalGsmCellRef>
+</es:vsDataGsmRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="RNC01-4-3" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranCell</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranCell>
+
+<es:tCell>3</es:tCell>
+<es:cellReserved>1</es:cellReserved>
+<es:treSelection>2</es:treSelection>
+<es:qualMeasQuantity>2</es:qualMeasQuantity>
+<es:qHyst1>4</es:qHyst1>
+<es:qHyst2>4</es:qHyst2>
+<es:qQualMin>-24</es:qQualMin>
+<es:qRxLevMin>-115</es:qRxLevMin>
+<es:individualOffset>0</es:individualOffset>
+<es:pwrAdm>75</es:pwrAdm>
+<es:pwrOffset>5</es:pwrOffset>
+<es:pwrHyst>300</es:pwrHyst>
+<es:tmCongAction>2000</es:tmCongAction>
+<es:releaseAseDl>1</es:releaseAseDl>
+<es:aseDlAdm>240</es:aseDlAdm>
+<es:dlCodeAdm>80</es:dlCodeAdm>
+<es:aseUlAdm>160</es:aseUlAdm>
+<es:sf8Adm>8</es:sf8Adm>
+<es:sf32Adm>32</es:sf32Adm>
+<es:minPwrRl>-150</es:minPwrRl>
+<es:maxRate>40690</es:maxRate>
+<es:interRate>7760</es:interRate>
+<es:minimumRate>1590</es:minimumRate>
+<es:maxPwrMax>48</es:maxPwrMax>
+<es:interPwrMax>38</es:interPwrMax>
+<es:minPwrMax>0</es:minPwrMax>
+<es:compModeAdm>15</es:compModeAdm>
+<es:iFHyst>6000</es:iFHyst>
+<es:iFCong>621</es:iFCong>
+<es:interFreqFddMeasIndicator>0</es:interFreqFddMeasIndicator>
+<es:sRatSearch>4</es:sRatSearch>
+<es:sIntraSearch>0</es:sIntraSearch>
+<es:sInterSearch>0</es:sInterSearch>
+<es:fachMeasOccaCycLenCoeff>0</es:fachMeasOccaCycLenCoeff>
+
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:accessClassNBarred>0</es:accessClassNBarred>
+<es:accessClassNBarred>1</es:accessClassNBarred>
+<es:utranCellPosition></es:utranCellPosition>
+<es:maxTxPowerUl>24</es:maxTxPowerUl>
+
+<es:sib1PlmnScopeValueTag>0</es:sib1PlmnScopeValueTag>
+<es:sf16Adm>16</es:sf16Adm>
+<es:hoType>1</es:hoType>
+<es:usedFreqThresh2dEcno>-12</es:usedFreqThresh2dEcno>
+<es:usedFreqThresh2dRscp>-97</es:usedFreqThresh2dRscp>
+<es:administrativeState>0</es:administrativeState>
+<es:loadSharingGsmThreshold>75</es:loadSharingGsmThreshold>
+<es:loadSharingGsmFraction>100</es:loadSharingGsmFraction>
+<es:nInSyncInd>3</es:nInSyncInd>
+<es:rlFailureT>10</es:rlFailureT>
+<es:nOutSyncInd>10</es:nOutSyncInd>
+<es:sf4AdmUl>0</es:sf4AdmUl>
+<es:hardIfhoCorr>3</es:hardIfhoCorr>
+<es:hsdpaUsersAdm>10</es:hsdpaUsersAdm>
+<es:loadSharingMargin>0</es:loadSharingMargin>
+<es:sHcsRat>-105</es:sHcsRat>
+<es:sf16gAdm>16</es:sf16gAdm>
+<es:releaseAseDlNg>3</es:releaseAseDlNg>
+<es:tmCongActionNg>800</es:tmCongActionNg>
+<es:tmInitialG>3000</es:tmInitialG>
+<es:sf16AdmUl>16</es:sf16AdmUl>
+<es:sf8AdmUl>8</es:sf8AdmUl>
+<es:sf8gAdmUl>0</es:sf8gAdmUl>
+<es:iubLinkRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,IubLink=4</es:iubLinkRef>
+<es:eulNonServingCellUsersAdm>100</es:eulNonServingCellUsersAdm>
+<es:eulServingCellUsersAdm>32</es:eulServingCellUsersAdm>
+<es:agpsEnabled>1</es:agpsEnabled>
+<es:codeLoadThresholdDlSf128>100</es:codeLoadThresholdDlSf128>
+<es:pwrLoadThresholdDlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:pwrLoadThresholdDlSpeech>
+<es:aseLoadThresholdUlSpeech>
+<es:amr12200>100</es:amr12200>
+<es:amr7950>100</es:amr7950>
+<es:amr5900>100</es:amr5900></es:aseLoadThresholdUlSpeech>
+
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>0</es:accessClassesBarredCs>
+<es:accessClassesBarredCs>1</es:accessClassesBarredCs>
+
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>0</es:accessClassesBarredPs>
+<es:accessClassesBarredPs>1</es:accessClassesBarredPs>
+<es:rateSelectionPsInteractive>
+<es:channelType>0</es:channelType>
+<es:ulPrefRate>64</es:ulPrefRate>
+<es:dlPrefRate>64</es:dlPrefRate></es:rateSelectionPsInteractive>
+<es:hcsUsage>
+<es:idleMode>0</es:idleMode>
+<es:connectedMode>0</es:connectedMode></es:hcsUsage>
+<es:hcsSib3Config>
+<es:sSearchHcs>-105</es:sSearchHcs>
+<es:hcsPrio>0</es:hcsPrio>
+<es:qHcs>0</es:qHcs></es:hcsSib3Config>
+</es:vsDataUtranCell>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataFach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataFach>
+
+<es:userLabel>Fach-4-3</es:userLabel>
+<es:maxFach1Power>18</es:maxFach1Power>
+<es:maxFach2Power>15</es:maxFach2Power>
+<es:sccpchOffset>0</es:sccpchOffset>
+<es:pOffset1Fach>0</es:pOffset1Fach>
+<es:pOffset3Fach>0</es:pOffset3Fach>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataFach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataRach</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataRach>
+
+<es:userLabel>Rach-4-3</es:userLabel>
+<es:scramblingCodeWordNo>0</es:scramblingCodeWordNo>
+<es:preambleSignatures>65535</es:preambleSignatures>
+<es:subChannelNo>4095</es:subChannelNo>
+<es:aichTransmissionTiming>4</es:aichTransmissionTiming>
+<es:aichPower>-6</es:aichPower>
+<es:powerOffsetP0>3</es:powerOffsetP0>
+<es:powerOffsetPpm>-4</es:powerOffsetPpm>
+<es:preambleRetransMax>5</es:preambleRetransMax>
+<es:maxPreambleCycle>4</es:maxPreambleCycle>
+<es:constantValueCprach>-27</es:constantValueCprach>
+<es:spreadingFactor>64</es:spreadingFactor>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataRach>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataPch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPch>
+
+<es:userLabel>Pch-4-3</es:userLabel>
+<es:pchPower>-4</es:pchPower>
+<es:pichPower>-7</es:pichPower>
+<es:sccpchOffset>20</es:sccpchOffset>
+<es:administrativeState>1</es:administrativeState>
+</es:vsDataPch>
+</xn:attributes>
+</xn:VsDataContainer><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-4-3</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataHsdsch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataHsdsch>
+
+<es:administrativeState>0</es:administrativeState>
+<es:userLabel>Hsdsch-4-3</es:userLabel>
+<es:numHsPdschCodes>5</es:numHsPdschCodes>
+<es:deltaAck1>4</es:deltaAck1>
+<es:deltaNack1>4</es:deltaNack1>
+<es:deltaAck2>8</es:deltaAck2>
+<es:deltaNack2>8</es:deltaNack2>
+<es:deltaCqi1>4</es:deltaCqi1>
+<es:deltaCqi2>8</es:deltaCqi2>
+<es:initialCqiRepetitionFactor>1</es:initialCqiRepetitionFactor>
+<es:initialAckNackRepetitionFactor>1</es:initialAckNackRepetitionFactor>
+<es:cqiFeedbackCycle>8</es:cqiFeedbackCycle>
+<es:hsMeasurementPowerOffset>0</es:hsMeasurementPowerOffset>
+<es:codeThresholdPdu656>6</es:codeThresholdPdu656>
+<es:numHsScchCodes>1</es:numHsScchCodes>
+</es:vsDataHsdsch>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataEul</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataEul>
+
+<es:userLabel>Eul-4-3</es:userLabel>
+<es:administrativeState>0</es:administrativeState>
+<es:numEagchCodes>1</es:numEagchCodes>
+<es:numEhichErgchCodes>1</es:numEhichErgchCodes>
+<es:eulMaxTargetRtwp>-499</es:eulMaxTargetRtwp>
+</es:vsDataEul>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataCoverageRelation</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataCoverageRelation>
+
+<es:utranCellRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,UtranCell=RNC01-4-1</es:utranCellRef>
+<es:coverageIndicator>1</es:coverageIndicator>
+<es:hsPathlossThreshold>170</es:hsPathlossThreshold>
+</es:vsDataCoverageRelation>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer></un:UtranCell>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataRncFunction</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataRncFunction>
+
+<es:mncLength>2</es:mncLength>
+<es:emergencyCallRedirect>0</es:emergencyCallRedirect>
+<es:loadSharingDirRetryEnabled>0</es:loadSharingDirRetryEnabled>
+<es:hsCellChangeAllowed>0</es:hsCellChangeAllowed>
+<es:hsOnlyBestCell>1</es:hsOnlyBestCell>
+
+<es:aliasPlmnIdentities>
+<es:mcc>353</es:mcc>
+<es:mnc>77</es:mnc>
+<es:mncLength>2</es:mncLength></es:aliasPlmnIdentities>
+<es:counterAlarmCeaseLimit>95</es:counterAlarmCeaseLimit>
+<es:counterAlarmThreshold>80</es:counterAlarmThreshold>
+<es:counterWarningAlarmCeaseLimit>5</es:counterWarningAlarmCeaseLimit>
+<es:ctrFileSize>5000</es:ctrFileSize>
+<es:gpehDataLevel>0</es:gpehDataLevel>
+<es:gpehFileSize>15000</es:gpehFileSize>
+<es:loadSharingRrcEnabled>0</es:loadSharingRrcEnabled>
+<es:uetrFileSize>275</es:uetrFileSize>
+<es:networkResourceIdentifierLengthCs>0</es:networkResourceIdentifierLengthCs>
+<es:networkResourceIdentifierLengthPs>0</es:networkResourceIdentifierLengthPs>
+<es:hsToDchTrigger>
+<es:servHsChangeInterRnc>0</es:servHsChangeInterRnc>
+<es:servHsChangeIntraRnc>0</es:servHsChangeIntraRnc>
+<es:changeOfBestCellIntraRnc>0</es:changeOfBestCellIntraRnc>
+<es:poorQualityDetected>0</es:poorQualityDetected>
+<es:changeOfBestCellInterRnc>0</es:changeOfBestCellInterRnc></es:hsToDchTrigger>
+<es:ecLocationAttemptUmts>0</es:ecLocationAttemptUmts>
+<es:ecCnSbhoRequestIgnore>0</es:ecCnSbhoRequestIgnore>
+<es:ecCnPriorityLevel>7</es:ecCnPriorityLevel>
+<es:ecSbhoTimer>6</es:ecSbhoTimer>
+<es:primaryCnOperatorRef>0</es:primaryCnOperatorRef>
+</es:vsDataRncFunction>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataUePositioning</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUePositioning>
+
+<es:enabledPositioningFeatures>0</es:enabledPositioningFeatures>
+</es:vsDataUePositioning>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataUeMeasControl</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUeMeasControl>
+
+<es:userLabel> </es:userLabel>
+<es:reportingRange1a>6</es:reportingRange1a>
+<es:reportingRange1b>10</es:reportingRange1b>
+<es:hysteresis1c>2</es:hysteresis1c>
+<es:hysteresis1d>15</es:hysteresis1d>
+<es:hysteresis2d>0</es:hysteresis2d>
+<es:hysteresis2f>0</es:hysteresis2f>
+<es:gsmThresh3a>-102</es:gsmThresh3a>
+<es:hysteresis3a>0</es:hysteresis3a>
+<es:measQuantity1>2</es:measQuantity1>
+<es:ueTxPowerThresh6a>21</es:ueTxPowerThresh6a>
+<es:ueTxPowerThresh6b>18</es:ueTxPowerThresh6b>
+<es:usedFreqThresh2dEcnoDrnc>-12</es:usedFreqThresh2dEcnoDrnc>
+<es:usedFreqThresh2dRscpDrnc>-97</es:usedFreqThresh2dRscpDrnc>
+<es:usedFreqRelThresh2fEcno>1</es:usedFreqRelThresh2fEcno>
+<es:usedFreqRelThresh2fRscp>3</es:usedFreqRelThresh2fRscp>
+<es:hyst4_2b>10</es:hyst4_2b>
+<es:nonUsedFreqThresh4_2bEcno>-11</es:nonUsedFreqThresh4_2bEcno>
+<es:nonUsedFreqThresh4_2bRscp>-94</es:nonUsedFreqThresh4_2bRscp>
+<es:timeToTrigger1a>11</es:timeToTrigger1a>
+<es:hysteresis1a>0</es:hysteresis1a>
+<es:timeToTrigger1b>12</es:timeToTrigger1b>
+<es:hysteresis1b>0</es:hysteresis1b>
+<es:timeToTrigger1c>11</es:timeToTrigger1c>
+<es:timeToTrigger1d>14</es:timeToTrigger1d>
+<es:timeToTrigger3a>6</es:timeToTrigger3a>
+<es:reportingInterval1a>3</es:reportingInterval1a>
+<es:reportingInterval1c>3</es:reportingInterval1c>
+<es:timeTrigg6a>320</es:timeTrigg6a>
+<es:timeTrigg6b>1280</es:timeTrigg6b>
+<es:timeTrigg4_2b>100</es:timeTrigg4_2b>
+<es:hsHysteresis1d>10</es:hsHysteresis1d>
+<es:hsQualityEstimate>1</es:hsQualityEstimate>
+<es:hsTimeToTrigger1d>640</es:hsTimeToTrigger1d>
+<es:filterCoefficient1>2</es:filterCoefficient1>
+<es:filterCoefficient2>2</es:filterCoefficient2>
+<es:utranFilterCoefficient3>2</es:utranFilterCoefficient3>
+<es:gsmFilterCoefficient3>1</es:gsmFilterCoefficient3>
+<es:filterCoeff6>19</es:filterCoeff6>
+<es:filterCoeff4_2b>2</es:filterCoeff4_2b>
+<es:w1a>0</es:w1a>
+<es:w1b>0</es:w1b>
+<es:usedFreqW2d>0</es:usedFreqW2d>
+<es:usedFreqW2f>0</es:usedFreqW2f>
+<es:usedFreqW4_2b>0</es:usedFreqW4_2b>
+<es:utranW3a>0</es:utranW3a>
+<es:nonUsedFreqW4_2b>0</es:nonUsedFreqW4_2b>
+<es:timeToTrigger2dEcno>320</es:timeToTrigger2dEcno>
+<es:timeToTrigger2fEcno>1280</es:timeToTrigger2fEcno>
+<es:utranRelThresh3aEcno>-1</es:utranRelThresh3aEcno>
+<es:utranRelThresh3aRscp>-3</es:utranRelThresh3aRscp>
+<es:usedFreqRelThresh4_2bEcno>-1</es:usedFreqRelThresh4_2bEcno>
+<es:usedFreqRelThresh4_2bRscp>-3</es:usedFreqRelThresh4_2bRscp>
+<es:timeToTrigger2dRscp>320</es:timeToTrigger2dRscp>
+<es:timeToTrigger2fRscp>1280</es:timeToTrigger2fRscp>
+<es:utranRelThreshRscp>5</es:utranRelThreshRscp>
+<es:event1dRncThreshold>4</es:event1dRncThreshold>
+<es:event1dRncOffset>0</es:event1dRncOffset>
+<es:timeToTrigger6d>320</es:timeToTrigger6d>
+<es:txPowerConnQualMonEnabled>1</es:txPowerConnQualMonEnabled>
+</es:vsDataUeMeasControl>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSid</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataSid>
+
+<es:updateCellReattsNo>5</es:updateCellReattsNo>
+<es:noOfMaxDrxCycles>1</es:noOfMaxDrxCycles>
+<es:noOfMibValueTagRetrans>0</es:noOfMibValueTagRetrans>
+<es:sib1>
+<es:sib1RepPeriod>32</es:sib1RepPeriod>
+<es:sib1StartPos>4</es:sib1StartPos></es:sib1>
+<es:sib11>
+<es:sib11RepPeriod>128</es:sib11RepPeriod>
+<es:sib11StartPos>20</es:sib11StartPos></es:sib11>
+<es:sib12>
+<es:sib12RepPeriod>32</es:sib12RepPeriod>
+<es:sib12StartPos>14</es:sib12StartPos></es:sib12>
+<es:sib3>
+<es:sib3RepPeriod>16</es:sib3RepPeriod>
+<es:sib3StartPos>2</es:sib3StartPos></es:sib3>
+<es:sib5>
+<es:sib5RepPeriod>32</es:sib5RepPeriod>
+<es:sib5StartPos>6</es:sib5StartPos></es:sib5>
+<es:sib7>
+<es:sib7RepPeriod>16</es:sib7RepPeriod>
+<es:sib7StartPos>2</es:sib7StartPos></es:sib7>
+<es:sib7ExpirationTimeFactor>1</es:sib7ExpirationTimeFactor>
+<es:sib2>
+<es:sib2RepPeriod>128</es:sib2RepPeriod>
+<es:sib2StartPos>118</es:sib2StartPos></es:sib2>
+</es:vsDataSid>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataSecurityHandling</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataSecurityHandling>
+
+<es:ciphering>1</es:ciphering>
+</es:vsDataSecurityHandling>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataRrc</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataRrc>
+
+<es:t305>3</es:t305>
+</es:vsDataRrc>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataRcs</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataRcs>
+
+<es:dchRcLostT>50</es:dchRcLostT>
+<es:cchWaitCuT>9</es:cchWaitCuT>
+<es:hsDschRcLostT>100</es:hsDschRcLostT>
+</es:vsDataRcs>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataRabHandling</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataRabHandling>
+
+<es:psStreamingInactivityTimer>30</es:psStreamingInactivityTimer>
+<es:activeQueueMgmt>0</es:activeQueueMgmt>
+<es:dscpValuePsStreaming>18</es:dscpValuePsStreaming>
+<es:state128_128Supported>0</es:state128_128Supported>
+</es:vsDataRabHandling>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataPowerControl</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPowerControl>
+
+<es:cBackOff>0</es:cBackOff>
+<es:ulOuterLoopRegulator>1</es:ulOuterLoopRegulator>
+<es:ulSirStep>10</es:ulSirStep>
+<es:sirMin>-82</es:sirMin>
+<es:sirMax>100</es:sirMax>
+<es:dlPcMethod>3</es:dlPcMethod>
+<es:cPO>0</es:cPO>
+<es:pO1>0</es:pO1>
+<es:pO2>12</es:pO2>
+<es:pO3>12</es:pO3>
+<es:ecNoPcpichDefault>-16</es:ecNoPcpichDefault>
+<es:pcpichPowerDefault>33</es:pcpichPowerDefault>
+<es:fixedPowerDl>65</es:fixedPowerDl>
+<es:cNbifho>10</es:cNbifho>
+<es:fixedRefPower>65</es:fixedRefPower>
+<es:initShoPowerParam>-2</es:initShoPowerParam>
+<es:dlInitSirTarget>41</es:dlInitSirTarget>
+<es:ulInitSirTargetExtraHigh>92</es:ulInitSirTargetExtraHigh>
+<es:ulInitSirTargetHigh>82</es:ulInitSirTargetHigh>
+<es:ulInitSirTargetLow>49</es:ulInitSirTargetLow>
+<es:ulInitSirTargetSrb>57</es:ulInitSirTargetSrb>
+<es:transmissionTargetError>10</es:transmissionTargetError>
+<es:ulInitSirTargetEdch>70</es:ulInitSirTargetEdch>
+</es:vsDataPowerControl>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataPaging</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataPaging>
+
+<es:cnDrxCycleLengthCs>6</es:cnDrxCycleLengthCs>
+<es:cnDrxCycleLengthPs>7</es:cnDrxCycleLengthPs>
+<es:noOfPagingRecordTransm>2</es:noOfPagingRecordTransm>
+<es:utranDrxCycleLength>5</es:utranDrxCycleLength>
+</es:vsDataPaging>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataHandover</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataHandover>
+
+<es:maxActiveSet>3</es:maxActiveSet>
+<es:fddGsmHOSupp>0</es:fddGsmHOSupp>
+<es:selHoSup>0</es:selHoSup>
+<es:timeReleaseIuPs>10</es:timeReleaseIuPs>
+<es:gsmAmountPropRepeat>4</es:gsmAmountPropRepeat>
+<es:gsmPropRepeatInterval>5</es:gsmPropRepeatInterval>
+<es:ifhoPropRepeatInterval>5</es:ifhoPropRepeatInterval>
+<es:ifhoAmountPropRepeat>4</es:ifhoAmountPropRepeat>
+<es:fddIfhoSupp>0</es:fddIfhoSupp>
+<es:releaseConnOffset>120</es:releaseConnOffset>
+<es:maxGsmMonSubset>32</es:maxGsmMonSubset>
+<es:maxIefMonSubset>32</es:maxIefMonSubset>
+<es:cnhhoSupp>0</es:cnhhoSupp>
+<es:interFreqCnhhoPenaltyEcno>30</es:interFreqCnhhoPenaltyEcno>
+<es:interFreqCnhhoPenaltyRscp>30</es:interFreqCnhhoPenaltyRscp>
+<es:intraFreqCnhhoPenalty>30</es:intraFreqCnhhoPenalty>
+<es:intraFreqCnhhoWeight>0</es:intraFreqCnhhoWeight>
+<es:tmStopGsmMeas>20</es:tmStopGsmMeas>
+<es:eulReservedHwBandwidthSchedDataNonServCell>128</es:eulReservedHwBandwidthSchedDataNonServCell>
+</es:vsDataHandover>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataChannelSwitching</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataChannelSwitching>
+
+<es:dlRlcBufUpswitch>500</es:dlRlcBufUpswitch>
+<es:ulRlcBufUpswitch>256</es:ulRlcBufUpswitch>
+<es:downswitchThreshold>0</es:downswitchThreshold>
+<es:downswitchTimerThreshold>0</es:downswitchTimerThreshold>
+<es:downswitchTimer>10</es:downswitchTimer>
+<es:dlRlcBufUpswitchMrab>0</es:dlRlcBufUpswitchMrab>
+<es:ulRlcBufUpswitchMrab>8</es:ulRlcBufUpswitchMrab>
+<es:upswitchTimer>5</es:upswitchTimer>
+<es:coverageTimer>10</es:coverageTimer>
+<es:inactivityTimer>120</es:inactivityTimer>
+<es:downswitchPwrMargin>2</es:downswitchPwrMargin>
+<es:reportHysteresis>6</es:reportHysteresis>
+<es:upswitchPwrMargin>6</es:upswitchPwrMargin>
+<es:downswitchTimerUp>60</es:downswitchTimerUp>
+<es:downswitchTimerSp>2</es:downswitchTimerSp>
+<es:hsdschInactivityTimer>2</es:hsdschInactivityTimer>
+<es:bandwidthMarginUl>0</es:bandwidthMarginUl>
+<es:upswitchTimerUl>5</es:upswitchTimerUl>
+<es:bandwidthMargin>90</es:bandwidthMargin>
+<es:dlDownswitchBandwidthMargin>0</es:dlDownswitchBandwidthMargin>
+<es:dlThroughputAllowUpswitchThreshold>0</es:dlThroughputAllowUpswitchThreshold>
+<es:dlThroughputDownswitchTimer>20</es:dlThroughputDownswitchTimer>
+<es:inactivityTimerPch>30</es:inactivityTimerPch>
+<es:ulThroughputAllowUpswitchThreshold>0</es:ulThroughputAllowUpswitchThreshold>
+<es:ulThroughputDownswitchTimer>20</es:ulThroughputDownswitchTimer>
+<es:ulDownswitchBandwidthMargin>0</es:ulDownswitchBandwidthMargin>
+<es:inactivityTimeMultiPsInteractive>50</es:inactivityTimeMultiPsInteractive>
+</es:vsDataChannelSwitching>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataCchFrameSynch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataCchFrameSynch>
+
+<es:dto>10</es:dto>
+<es:doStep>1</es:doStep>
+<es:toAWS>30</es:toAWS>
+<es:toAWE>2</es:toAWE>
+<es:toAE>195</es:toAE>
+</es:vsDataCchFrameSynch>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataDchFrameSynch</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataDchFrameSynch>
+
+<es:dto>10</es:dto>
+<es:doStep>1</es:doStep>
+<es:toAWS>30</es:toAWS>
+<es:toAWE>2</es:toAWE>
+<es:toAE>195</es:toAE>
+<es:uto>10</es:uto>
+<es:uoStep>1</es:uoStep>
+<es:toAWEUl>2</es:toAWEUl>
+<es:toAEUl>95</es:toAEUl>
+<es:userLabel> </es:userLabel>
+<es:toAWSUl>40</es:toAWSUl>
+</es:vsDataDchFrameSynch>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataRncModule</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataRncModule>
+
+<es:userLabel> </es:userLabel>
+</es:vsDataRncModule>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUtranNetwork</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUtranNetwork>
+
+<es:userLabel> </es:userLabel>
+<es:aliasPlmnIdentities></es:aliasPlmnIdentities>
+<es:plmnIdentity>
+<es:mcc>353</es:mcc>
+<es:mnc>77</es:mnc>
+<es:mncLength>2</es:mncLength></es:plmnIdentity>
+</es:vsDataUtranNetwork>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataIurLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIurLink>
+
+<es:userLabel> </es:userLabel>
+<es:mcc>353</es:mcc>
+<es:mnc>77</es:mnc>
+<es:mncLength>2</es:mncLength>
+<es:rncId>2</es:rncId>
+<es:aliasPlmnIdentities></es:aliasPlmnIdentities>
+<es:utranNetworkRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,vsDataUtranNetwork=1</es:utranNetworkRef>
+<es:cellCapabilityControl>
+<es:hsdschSupport>0</es:hsdschSupport>
+<es:edchSupport>0</es:edchSupport></es:cellCapabilityControl>
+<es:hspaPathlossThreshold>170</es:hspaPathlossThreshold>
+<es:userPlaneTransportOption>
+<es:atm>0</es:atm>
+<es:ipv4>0</es:ipv4></es:userPlaneTransportOption>
+</es:vsDataIurLink>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataIurLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIurLink>
+
+<es:userLabel> </es:userLabel>
+<es:mcc>353</es:mcc>
+<es:mnc>77</es:mnc>
+<es:mncLength>2</es:mncLength>
+<es:rncId>3</es:rncId>
+<es:aliasPlmnIdentities></es:aliasPlmnIdentities>
+<es:utranNetworkRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,vsDataUtranNetwork=1</es:utranNetworkRef>
+<es:cellCapabilityControl>
+<es:hsdschSupport>0</es:hsdschSupport>
+<es:edchSupport>0</es:edchSupport></es:cellCapabilityControl>
+<es:hspaPathlossThreshold>170</es:hspaPathlossThreshold>
+<es:userPlaneTransportOption>
+<es:atm>0</es:atm>
+<es:ipv4>0</es:ipv4></es:userPlaneTransportOption>
+</es:vsDataIurLink>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataIurLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIurLink>
+
+<es:userLabel> </es:userLabel>
+<es:mcc>353</es:mcc>
+<es:mnc>77</es:mnc>
+<es:mncLength>2</es:mncLength>
+<es:rncId>4</es:rncId>
+<es:aliasPlmnIdentities></es:aliasPlmnIdentities>
+<es:utranNetworkRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,vsDataUtranNetwork=1</es:utranNetworkRef>
+<es:cellCapabilityControl>
+<es:hsdschSupport>0</es:hsdschSupport>
+<es:edchSupport>0</es:edchSupport></es:cellCapabilityControl>
+<es:hspaPathlossThreshold>170</es:hspaPathlossThreshold>
+<es:userPlaneTransportOption>
+<es:atm>0</es:atm>
+<es:ipv4>0</es:ipv4></es:userPlaneTransportOption>
+</es:vsDataIurLink>
+</xn:attributes>
+</xn:VsDataContainer><xn:VsDataContainer id="96" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataIurLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataIurLink>
+
+<es:userLabel> </es:userLabel>
+<es:mcc>353</es:mcc>
+<es:mnc>96</es:mnc>
+<es:mncLength>2</es:mncLength>
+<es:rncId>96</es:rncId>
+<es:aliasPlmnIdentities></es:aliasPlmnIdentities>
+<es:utranNetworkRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,vsDataUtranNetwork=1</es:utranNetworkRef>
+<es:cellCapabilityControl>
+<es:hsdschSupport>0</es:hsdschSupport>
+<es:edchSupport>0</es:edchSupport></es:cellCapabilityControl>
+<es:hspaPathlossThreshold>170</es:hspaPathlossThreshold>
+<es:userPlaneTransportOption>
+<es:atm>0</es:atm>
+<es:ipv4>0</es:ipv4></es:userPlaneTransportOption>
+</es:vsDataIurLink></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="96" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataIurLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIurLink>
+
+<es:userLabel> </es:userLabel>
+<es:mcc>353</es:mcc>
+<es:mnc>96</es:mnc>
+<es:mncLength>2</es:mncLength>
+<es:rncId>96</es:rncId>
+<es:aliasPlmnIdentities></es:aliasPlmnIdentities>
+<es:utranNetworkRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,vsDataUtranNetwork=1</es:utranNetworkRef>
+<es:cellCapabilityControl>
+<es:hsdschSupport>0</es:hsdschSupport>
+<es:edchSupport>0</es:edchSupport></es:cellCapabilityControl>
+<es:hspaPathlossThreshold>170</es:hspaPathlossThreshold>
+<es:userPlaneTransportOption>
+<es:atm>0</es:atm>
+<es:ipv4>0</es:ipv4></es:userPlaneTransportOption>
+</es:vsDataIurLink>
+</xn:attributes>
+</xn:VsDataContainer><xn:VsDataContainer id="97" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataIurLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataIurLink>
+
+<es:userLabel> </es:userLabel>
+<es:mcc>353</es:mcc>
+<es:mnc>97</es:mnc>
+<es:mncLength>2</es:mncLength>
+<es:rncId>97</es:rncId>
+<es:aliasPlmnIdentities></es:aliasPlmnIdentities>
+<es:utranNetworkRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,vsDataUtranNetwork=1</es:utranNetworkRef>
+<es:cellCapabilityControl>
+<es:hsdschSupport>0</es:hsdschSupport>
+<es:edchSupport>0</es:edchSupport></es:cellCapabilityControl>
+<es:hspaPathlossThreshold>170</es:hspaPathlossThreshold>
+<es:userPlaneTransportOption>
+<es:atm>0</es:atm>
+<es:ipv4>0</es:ipv4></es:userPlaneTransportOption>
+</es:vsDataIurLink></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="97" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataIurLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIurLink>
+
+<es:userLabel> </es:userLabel>
+<es:mcc>353</es:mcc>
+<es:mnc>97</es:mnc>
+<es:mncLength>2</es:mncLength>
+<es:rncId>97</es:rncId>
+<es:aliasPlmnIdentities></es:aliasPlmnIdentities>
+<es:utranNetworkRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,vsDataUtranNetwork=1</es:utranNetworkRef>
+<es:cellCapabilityControl>
+<es:hsdschSupport>0</es:hsdschSupport>
+<es:edchSupport>0</es:edchSupport></es:cellCapabilityControl>
+<es:hspaPathlossThreshold>170</es:hspaPathlossThreshold>
+<es:userPlaneTransportOption>
+<es:atm>0</es:atm>
+<es:ipv4>0</es:ipv4></es:userPlaneTransportOption>
+</es:vsDataIurLink>
+</xn:attributes>
+</xn:VsDataContainer><xn:VsDataContainer id="98" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataIurLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataIurLink>
+
+<es:userLabel> </es:userLabel>
+<es:mcc>353</es:mcc>
+<es:mnc>98</es:mnc>
+<es:mncLength>2</es:mncLength>
+<es:rncId>98</es:rncId>
+<es:aliasPlmnIdentities></es:aliasPlmnIdentities>
+<es:utranNetworkRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,vsDataUtranNetwork=1</es:utranNetworkRef>
+<es:cellCapabilityControl>
+<es:hsdschSupport>0</es:hsdschSupport>
+<es:edchSupport>0</es:edchSupport></es:cellCapabilityControl>
+<es:hspaPathlossThreshold>170</es:hspaPathlossThreshold>
+<es:userPlaneTransportOption>
+<es:atm>0</es:atm>
+<es:ipv4>0</es:ipv4></es:userPlaneTransportOption>
+</es:vsDataIurLink></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="98" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataIurLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIurLink>
+
+<es:userLabel> </es:userLabel>
+<es:mcc>353</es:mcc>
+<es:mnc>98</es:mnc>
+<es:mncLength>2</es:mncLength>
+<es:rncId>98</es:rncId>
+<es:aliasPlmnIdentities></es:aliasPlmnIdentities>
+<es:utranNetworkRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,vsDataUtranNetwork=1</es:utranNetworkRef>
+<es:cellCapabilityControl>
+<es:hsdschSupport>0</es:hsdschSupport>
+<es:edchSupport>0</es:edchSupport></es:cellCapabilityControl>
+<es:hspaPathlossThreshold>170</es:hspaPathlossThreshold>
+<es:userPlaneTransportOption>
+<es:atm>0</es:atm>
+<es:ipv4>0</es:ipv4></es:userPlaneTransportOption>
+</es:vsDataIurLink>
+</xn:attributes>
+</xn:VsDataContainer><xn:VsDataContainer id="99" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataIurLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataIurLink>
+
+<es:userLabel> </es:userLabel>
+<es:mcc>353</es:mcc>
+<es:mnc>99</es:mnc>
+<es:mncLength>2</es:mncLength>
+<es:rncId>99</es:rncId>
+<es:aliasPlmnIdentities></es:aliasPlmnIdentities>
+<es:utranNetworkRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,vsDataUtranNetwork=1</es:utranNetworkRef>
+<es:cellCapabilityControl>
+<es:hsdschSupport>0</es:hsdschSupport>
+<es:edchSupport>0</es:edchSupport></es:cellCapabilityControl>
+<es:hspaPathlossThreshold>170</es:hspaPathlossThreshold>
+<es:userPlaneTransportOption>
+<es:atm>0</es:atm>
+<es:ipv4>0</es:ipv4></es:userPlaneTransportOption>
+</es:vsDataIurLink></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="99" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataIurLink</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataIurLink>
+
+<es:userLabel> </es:userLabel>
+<es:mcc>353</es:mcc>
+<es:mnc>99</es:mnc>
+<es:mncLength>2</es:mncLength>
+<es:rncId>99</es:rncId>
+<es:aliasPlmnIdentities></es:aliasPlmnIdentities>
+<es:utranNetworkRef>SubNetwork=WEOSSRC1_ROOT_MO_R,SubNetwork=RNC33,MeContext=SRNC001,ManagedElement=1,RncFunction=1,vsDataUtranNetwork=1</es:utranNetworkRef>
+<es:cellCapabilityControl>
+<es:hsdschSupport>0</es:hsdschSupport>
+<es:edchSupport>0</es:edchSupport></es:cellCapabilityControl>
+<es:hspaPathlossThreshold>170</es:hspaPathlossThreshold>
+<es:userPlaneTransportOption>
+<es:atm>0</es:atm>
+<es:ipv4>0</es:ipv4></es:userPlaneTransportOption>
+</es:vsDataIurLink>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUra</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUra>
+
+<es:userLabel>Ura1</es:userLabel>
+<es:uraIdentity>1</es:uraIdentity>
+</es:vsDataUra>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUra</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUra>
+
+<es:userLabel>Ura2</es:userLabel>
+<es:uraIdentity>2</es:uraIdentity>
+</es:vsDataUra>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUra</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUra>
+
+<es:userLabel>Ura3</es:userLabel>
+<es:uraIdentity>3</es:uraIdentity>
+</es:vsDataUra>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUra</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUra>
+
+<es:userLabel>Ura4</es:userLabel>
+<es:uraIdentity>4</es:uraIdentity>
+</es:vsDataUra>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="5" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUra</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUra>
+
+<es:userLabel>Ura5</es:userLabel>
+<es:uraIdentity>5</es:uraIdentity>
+</es:vsDataUra>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="6" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUra</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUra>
+
+<es:userLabel>Ura6</es:userLabel>
+<es:uraIdentity>6</es:uraIdentity>
+</es:vsDataUra>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="7" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUra</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUra>
+
+<es:userLabel>Ura7</es:userLabel>
+<es:uraIdentity>7</es:uraIdentity>
+</es:vsDataUra>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="8" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUra</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUra>
+
+<es:userLabel>Ura8</es:userLabel>
+<es:uraIdentity>8</es:uraIdentity>
+</es:vsDataUra>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="9" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUra</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUra>
+
+<es:userLabel>Ura9</es:userLabel>
+<es:uraIdentity>9</es:uraIdentity>
+</es:vsDataUra>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="10" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUra</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUra>
+
+<es:userLabel>Ura10</es:userLabel>
+<es:uraIdentity>10</es:uraIdentity>
+</es:vsDataUra>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataCnOperator</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataCnOperator>
+
+<es:userLabel> </es:userLabel>
+<es:plmnIdentity>
+<es:mcc>1</es:mcc>
+<es:mnc>1</es:mnc>
+<es:mncLength>2</es:mncLength></es:plmnIdentity>
+<es:iphoNetworkRefsUtran></es:iphoNetworkRefsUtran>
+<es:iphoNetworkRefsGsm></es:iphoNetworkRefsGsm>
+<es:equivalentPlmnIdentities></es:equivalentPlmnIdentities>
+</es:vsDataCnOperator>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataWcdmaCarrier</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataWcdmaCarrier>
+
+<es:userLabel> </es:userLabel>
+<es:defaultHoType>1</es:defaultHoType>
+<es:freqBand>0</es:freqBand>
+<es:sib5bisEnabled>0</es:sib5bisEnabled>
+<es:uarfcnDl>0</es:uarfcnDl>
+</es:vsDataWcdmaCarrier>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataCnOperator</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataCnOperator>
+
+<es:userLabel> </es:userLabel>
+<es:plmnIdentity>
+<es:mcc>1</es:mcc>
+<es:mnc>1</es:mnc>
+<es:mncLength>2</es:mncLength></es:plmnIdentity>
+<es:iphoNetworkRefsUtran></es:iphoNetworkRefsUtran>
+<es:iphoNetworkRefsGsm></es:iphoNetworkRefsGsm>
+<es:equivalentPlmnIdentities></es:equivalentPlmnIdentities>
+</es:vsDataCnOperator>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="2" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataWcdmaCarrier</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataWcdmaCarrier>
+
+<es:userLabel> </es:userLabel>
+<es:defaultHoType>1</es:defaultHoType>
+<es:freqBand>0</es:freqBand>
+<es:sib5bisEnabled>0</es:sib5bisEnabled>
+<es:uarfcnDl>0</es:uarfcnDl>
+</es:vsDataWcdmaCarrier>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataCnOperator</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataCnOperator>
+
+<es:userLabel> </es:userLabel>
+<es:plmnIdentity>
+<es:mcc>1</es:mcc>
+<es:mnc>1</es:mnc>
+<es:mncLength>2</es:mncLength></es:plmnIdentity>
+<es:iphoNetworkRefsUtran></es:iphoNetworkRefsUtran>
+<es:iphoNetworkRefsGsm></es:iphoNetworkRefsGsm>
+<es:equivalentPlmnIdentities></es:equivalentPlmnIdentities>
+</es:vsDataCnOperator>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="3" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataWcdmaCarrier</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataWcdmaCarrier>
+
+<es:userLabel> </es:userLabel>
+<es:defaultHoType>1</es:defaultHoType>
+<es:freqBand>0</es:freqBand>
+<es:sib5bisEnabled>0</es:sib5bisEnabled>
+<es:uarfcnDl>0</es:uarfcnDl>
+</es:vsDataWcdmaCarrier>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataCnOperator</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataCnOperator>
+
+<es:userLabel> </es:userLabel>
+<es:plmnIdentity>
+<es:mcc>1</es:mcc>
+<es:mnc>1</es:mnc>
+<es:mncLength>2</es:mncLength></es:plmnIdentity>
+<es:iphoNetworkRefsUtran></es:iphoNetworkRefsUtran>
+<es:iphoNetworkRefsGsm></es:iphoNetworkRefsGsm>
+<es:equivalentPlmnIdentities></es:equivalentPlmnIdentities>
+</es:vsDataCnOperator>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="4" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataWcdmaCarrier</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataWcdmaCarrier>
+
+<es:userLabel> </es:userLabel>
+<es:defaultHoType>1</es:defaultHoType>
+<es:freqBand>0</es:freqBand>
+<es:sib5bisEnabled>0</es:sib5bisEnabled>
+<es:uarfcnDl>0</es:uarfcnDl>
+</es:vsDataWcdmaCarrier>
+</xn:attributes>
+</xn:VsDataContainer><xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUeRc</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+<es:vsDataUeRc>
+
+<es:userLabel> </es:userLabel>
+<es:serviceOffset2dEcno>0</es:serviceOffset2dEcno>
+<es:serviceOffset2dRscp>0</es:serviceOffset2dRscp>
+</es:vsDataUeRc></xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="update">
+<xn:attributes>
+<xn:vsDataType>vsDataUeRc</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUeRc>
+
+<es:userLabel> </es:userLabel>
+<es:serviceOffset2dEcno>0</es:serviceOffset2dEcno>
+<es:serviceOffset2dRscp>0</es:serviceOffset2dRscp>
+</es:vsDataUeRc>
+</xn:attributes>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUeRcTrCh</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUeRcTrCh>
+
+<es:blerQualityTargetDl>-63</es:blerQualityTargetDl>
+<es:blerQualityTargetUl>-63</es:blerQualityTargetUl>
+</es:vsDataUeRcTrCh>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUeRcRab</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUeRcRab>
+
+<es:fcState>0</es:fcState>
+<es:trBearerQosClass>0</es:trBearerQosClass>
+</es:vsDataUeRcRab>
+</xn:attributes>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUeRcRrc</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUeRcRrc>
+
+<es:trBearerQosClass>0</es:trBearerQosClass>
+</es:vsDataUeRcRrc>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+<xn:VsDataContainer id="1" modifier="create">
+<xn:attributes>
+<xn:vsDataType>vsDataUeRabType</xn:vsDataType>
+<xn:vsDataFormatVersion>EricssonSpecificAttributes.5.1</xn:vsDataFormatVersion>
+
+<es:vsDataUeRabType>
+
+<es:trBearerQosClass>0</es:trBearerQosClass>
+</es:vsDataUeRabType>
+</xn:attributes>
+</xn:VsDataContainer>
+</xn:VsDataContainer>
+</un:RncFunction>
+</xn:ManagedElement></xn:MeContext>
+</xn:SubNetwork>
+</xn:SubNetwork>
+</configData>
+ <fileFooter dateTime="2001-05-07T12:00:00+02:00"></fileFooter>
+</bulkCmConfigDataFile> \ No newline at end of file
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/utranNrm.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/utranNrm.xsd
new file mode 100644
index 0000000000..1d411b31dd
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/netsim/utranNrm.xsd
@@ -0,0 +1,174 @@
+<!--
+ 3GPP TS 32.615 v4.5 Bulk CM IRP
+ Configuration data file UTRAN Network Resources IRP NRM XML schema
+ To be used with WEGA Bucket 2.1 onwards
+-->
+<schema xmlns:gn="geranNrm.xsd" xmlns:un="utranNrm.xsd" xmlns:xn="genericNrm.xsd" xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="utranNrm.xsd" elementFormDefault="qualified" attributeFormDefault="unqualified">
+ <!-- UTRAN Network Resources IRP NRM class associated XML elements -->
+ <import namespace="genericNrm.xsd" schemaLocation="genericNrm.xsd"/>
+ <import namespace="geranNrm.xsd" schemaLocation="geranNrm.xsd"/>
+ <element name="RncFunction">
+ <complexType>
+ <complexContent>
+ <extension base="xn:NrmClassXmlType">
+ <sequence>
+ <element name="attributes" minOccurs="0">
+ <complexType>
+ <all>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="mcc" minOccurs="0"/>
+ <element name="mnc" minOccurs="0"/>
+ <element name="rncId" minOccurs="0"/>
+ <!--
+ <element name="mncLength" minOccurs="0"/>
+ -->
+ </all>
+ </complexType>
+ </element>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element ref="un:UtranCell"/>
+ <element ref="un:IubLink"/>
+ <element ref="xn:VsDataContainer"/>
+ </choice>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="NodeBFunction">
+ <complexType>
+ <complexContent>
+ <extension base="xn:NrmClassXmlType">
+ <sequence>
+ <element name="attributes" minOccurs="0">
+ <complexType>
+ <all>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="nodeBFunctionIubLink" minOccurs="0"/>
+ </all>
+ </complexType>
+ </element>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element ref="xn:VsDataContainer"/>
+ </choice>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="UtranCell">
+ <complexType>
+ <complexContent>
+ <extension base="xn:NrmClassXmlType">
+ <sequence>
+ <element name="attributes" minOccurs="0">
+ <complexType>
+ <all>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="cId" minOccurs="0"/>
+ <element name="localCellId" minOccurs="0"/>
+ <element name="uarfcnUl" minOccurs="0"/>
+ <element name="uarfcnDl" minOccurs="0"/>
+ <element name="primaryScramblingCode" minOccurs="0"/>
+ <element name="primaryCpichPower" minOccurs="0"/>
+ <element name="maximumTransmissionPower" minOccurs="0"/>
+ <element name="primarySchPower" minOccurs="0"/>
+ <element name="secondarySchPower" minOccurs="0"/>
+ <element name="bchPower" minOccurs="0"/>
+ <element name="lac" minOccurs="0"/>
+ <element name="rac" minOccurs="0"/>
+ <element name="sac" minOccurs="0"/>
+ <element name="utranCellIubLink" minOccurs="0"/>
+ <element name="uraList" minOccurs="0"/>
+ <!-- 3.1
+ <element name="ura" minOccurs="0"/>
+ -->
+ </all>
+ </complexType>
+ </element>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element ref="un:UtranRelation"/>
+ <element ref="gn:GsmRelation"/>
+ <element ref="xn:VsDataContainer"/>
+ </choice>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="IubLink">
+ <complexType>
+ <complexContent>
+ <extension base="xn:NrmClassXmlType">
+ <sequence>
+ <element name="attributes" minOccurs="0">
+ <complexType>
+ <all>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="iubLinkUtranCell" minOccurs="0"/>
+ <element name="iubLinkNodeBFunction" minOccurs="0"/>
+ </all>
+ </complexType>
+ </element>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element ref="xn:VsDataContainer"/>
+ </choice>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="UtranRelation">
+ <complexType>
+ <complexContent>
+ <extension base="xn:NrmClassXmlType">
+ <sequence>
+ <element name="attributes" minOccurs="0">
+ <complexType>
+ <all>
+ <element name="adjacentCell" minOccurs="0"/>
+ <!--
+ <element name="relationType" minOccurs="0"/>
+ -->
+ </all>
+ </complexType>
+ </element>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element ref="xn:VsDataContainer"/>
+ </choice>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+ <element name="ExternalUtranCell">
+ <complexType>
+ <complexContent>
+ <extension base="xn:NrmClassXmlType">
+ <sequence>
+ <element name="attributes" minOccurs="0">
+ <complexType>
+ <all>
+ <element name="userLabel" minOccurs="0"/>
+ <element name="cId" minOccurs="0"/>
+ <element name="mcc" minOccurs="0"/>
+ <element name="mnc" minOccurs="0"/>
+ <element name="rncId" minOccurs="0"/>
+ <element name="uarfcnUl" minOccurs="0"/>
+ <element name="uarfcnDl" minOccurs="0"/>
+ <element name="primaryScramblingCode" minOccurs="0"/>
+ <element name="primaryCpichPower" minOccurs="0"/>
+ <element name="lac" minOccurs="0"/>
+ <element name="rac" minOccurs="0"/>
+ </all>
+ </complexType>
+ </element>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element ref="xn:VsDataContainer"/>
+ </choice>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+</schema>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/po.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/po.xml
new file mode 100644
index 0000000000..28a44c410d
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/po.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<purchaseOrder orderDate="1999-10-20">
+ <shipTo country="US">
+ <name>Alice Smith</name>
+ <street>123 Maple Street</street>
+ <city>Mill Valley</city>
+ <state>CA</state>
+ <zip>90952</zip>
+ </shipTo>
+ <billTo country="US">
+ <name>Robert Smith</name>
+ <street>8 Oak Avenue</street>
+ <city>Old Town</city>
+ <state>PA</state>
+ <zip>95819</zip>
+ </billTo>
+ <comment>Hurry, my lawn is going wild!</comment>
+ <items>
+ <item partNum="872-AA">
+ <productName>Lawnmower</productName>
+ <quantity>1</quantity>
+ <USPrice>148.95</USPrice>
+ <comment>Confirm this is electric</comment>
+ </item>
+ <item partNum="926-AA">
+ <productName>Baby Monitor</productName>
+ <quantity>1</quantity>
+ <USPrice>39.98</USPrice>
+ <shipDate>1999-05-21</shipDate>
+ </item>
+ </items>
+</purchaseOrder>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/po.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/po.xsd
new file mode 100644
index 0000000000..995dd00152
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/po.xsd
@@ -0,0 +1,67 @@
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+ <xsd:annotation>
+ <xsd:documentation xml:lang="en">
+ Purchase order schema for Example.com.
+ Copyright 2000 Example.com. All rights reserved.
+ </xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:element name="purchaseOrder" type="PurchaseOrderType"/>
+
+ <xsd:element name="comment" type="xsd:string"/>
+
+ <xsd:complexType name="PurchaseOrderType">
+ <xsd:sequence>
+ <xsd:element name="shipTo" type="USAddress"/>
+ <xsd:element name="billTo" type="USAddress"/>
+ <xsd:element ref="comment" minOccurs="0"/>
+ <xsd:element name="items" type="Items"/>
+ </xsd:sequence>
+ <xsd:attribute name="orderDate" type="xsd:date"/>
+ </xsd:complexType>
+
+ <xsd:complexType name="USAddress">
+ <xsd:sequence>
+ <xsd:element name="name" type="xsd:string"/>
+ <xsd:element name="street" type="xsd:string"/>
+ <xsd:element name="city" type="xsd:string"/>
+ <xsd:element name="state" type="xsd:string"/>
+ <xsd:element name="zip" type="xsd:decimal"/>
+ </xsd:sequence>
+ <xsd:attribute name="country" type="xsd:NMTOKEN"
+ fixed="US"/>
+ </xsd:complexType>
+
+ <xsd:complexType name="Items">
+ <xsd:sequence>
+ <xsd:element name="item" minOccurs="0" maxOccurs="unbounded">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="productName" type="xsd:string"/>
+ <xsd:element name="quantity">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:positiveInteger">
+ <xsd:maxExclusive value="100"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="USPrice" type="xsd:decimal"/>
+ <xsd:element ref="comment" minOccurs="0"/>
+ <xsd:element name="shipDate" type="xsd:date" minOccurs="0"/>
+ </xsd:sequence>
+ <xsd:attribute name="partNum" type="SKU" use="required"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <!-- Stock Keeping Unit, a code for identifying products -->
+ <xsd:simpleType name="SKU">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="\d{3}-[A-Z]{2}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+</xsd:schema>
+
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/po1.tab b/lib/xmerl/test/xmerl_xsd_SUITE_data/po1.tab
new file mode 100644
index 0000000000..fa3fcdaa09
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/po1.tab
@@ -0,0 +1,424 @@
+[{{element,{name,['USAddress'],'http://www.example.com/PO1'}},
+ {schema_element,{name,['USAddress'],'http://www.example.com/PO1'},
+ [{simpleType,{string,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['USAddress'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{productName,[anonymous,item,'Items'],'http://www.example.com/PO1'}},
+ {schema_element,{productName,[anonymous,item,'Items'],
+ 'http://www.example.com/PO1'},
+ [{simpleType,{string,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ [anonymous,item,'Items'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{schema,"po1.xsd"},
+ {schema,unqualified,
+ unqualified,
+ 'http://www.example.com/PO1',
+ [],
+ [],
+ [{element,{{purchaseOrder,[],'http://www.example.com/PO1'},{1,1}}},
+ {element,{{comment,[],'http://www.example.com/PO1'},{1,1}}}]}},
+ {{simpleType,{'_xmerl_no_name_',[quantity,anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'}},
+ {schema_simple_type,{'_xmerl_no_name_',
+ [quantity,anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'},
+ [quantity,anonymous,item,'Items'],
+ {positiveInteger,[],'http://www.w3.org/2001/XMLSchema'},
+ false,
+ [],
+ [{maxExclusive,"100"}],
+ atomic,
+ [{restriction,{{positiveInteger,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'},
+ [{maxExclusive,"100"}]}}]}},
+ {{element,{street,['USAddress'],'http://www.example.com/PO1'}},
+ {schema_element,{street,['USAddress'],'http://www.example.com/PO1'},
+ [{simpleType,{string,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['USAddress'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{shipTo,['PurchaseOrderType'],'http://www.example.com/PO1'}},
+ {schema_element,{shipTo,['PurchaseOrderType'],'http://www.example.com/PO1'},
+ [{simple_or_complex_Type,
+ {'USAddress',[],'http://www.example.com/PO1'}}],
+ false,
+ undefined,
+ [],
+ ['PurchaseOrderType'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{complexType,{'PurchaseOrderType',[],'http://www.example.com/PO1'}},
+ {schema_complex_type,{'PurchaseOrderType',[],'http://www.example.com/PO1'},
+ undefined,
+ false,
+ ['PurchaseOrderType'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [{attribute,{orderDate,
+ ['PurchaseOrderType'],
+ 'http://www.example.com/PO1'}}],
+ [{sequence,{[{element,
+ {{shipTo,
+ ['PurchaseOrderType'],
+ 'http://www.example.com/PO1'},
+ {1,1}}},
+ {element,
+ {{billTo,
+ ['PurchaseOrderType'],
+ 'http://www.example.com/PO1'},
+ {1,1}}},
+ {element,
+ {{comment,
+ [],
+ 'http://www.example.com/PO1'},
+ {0,1}}},
+ {element,
+ {{items,
+ ['PurchaseOrderType'],
+ 'http://www.example.com/PO1'},
+ {1,1}}}],
+ {1,1}}}],
+ undefined}},
+ {{simpleType,{'SKU',[],'http://www.example.com/PO1'}},
+ {schema_simple_type,{'SKU',[],'http://www.example.com/PO1'},
+ [],
+ {string,[],'http://www.w3.org/2001/XMLSchema'},
+ false,
+ [],
+ [{pattern,"\\d{3}-[A-Z]{2}"}],
+ atomic,
+ [{restriction,{{string,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'},
+ [{pattern,"\\d{3}-[A-Z]{2}"}]}}]}},
+ {{element,{city,['USAddress'],'http://www.example.com/PO1'}},
+ {schema_element,{city,['USAddress'],'http://www.example.com/PO1'},
+ [{simpleType,{string,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['USAddress'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{quantity,[anonymous,item,'Items'],'http://www.example.com/PO1'}},
+ {schema_element,{quantity,[anonymous,item,'Items'],
+ 'http://www.example.com/PO1'},
+ [{simpleType,{'_xmerl_no_name_',
+ [quantity,anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ [anonymous,item,'Items'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{attribute,{orderDate,['PurchaseOrderType'],'http://www.example.com/PO1'}},
+ {schema_attribute,{orderDate,['PurchaseOrderType'],
+ 'http://www.example.com/PO1'},
+ [{simpleType,{date,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ ['PurchaseOrderType'],
+ optional,
+ undefined,
+ undefined,
+ undefined}},
+ {{element,{state,['USAddress'],'http://www.example.com/PO1'}},
+ {schema_element,{state,['USAddress'],'http://www.example.com/PO1'},
+ [{simpleType,{string,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['USAddress'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{comment,[],'http://www.example.com/PO1'}},
+ {schema_element,{comment,[],'http://www.example.com/PO1'},
+ [{simpleType,{string,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ [],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{complexType,{'USAddress',[],'http://www.example.com/PO1'}},
+ {schema_complex_type,{'USAddress',[],'http://www.example.com/PO1'},
+ undefined,
+ false,
+ ['USAddress'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [{attribute,{country,
+ ['USAddress'],
+ 'http://www.example.com/PO1'}}],
+ [{sequence,{[{element,
+ {{name,
+ ['USAddress'],
+ 'http://www.example.com/PO1'},
+ {1,1}}},
+ {element,
+ {{street,
+ ['USAddress'],
+ 'http://www.example.com/PO1'},
+ {1,1}}},
+ {element,
+ {{city,
+ ['USAddress'],
+ 'http://www.example.com/PO1'},
+ {1,1}}},
+ {element,
+ {{state,
+ ['USAddress'],
+ 'http://www.example.com/PO1'},
+ {1,1}}},
+ {element,
+ {{zip,
+ ['USAddress'],
+ 'http://www.example.com/PO1'},
+ {1,1}}}],
+ {1,1}}}],
+ undefined}},
+ {{element,{purchaseOrder,[],'http://www.example.com/PO1'}},
+ {schema_element,{purchaseOrder,[],'http://www.example.com/PO1'},
+ [{simple_or_complex_Type,
+ {'PurchaseOrderType',[],'http://www.example.com/PO1'}}],
+ false,
+ undefined,
+ [],
+ [],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{billTo,['PurchaseOrderType'],'http://www.example.com/PO1'}},
+ {schema_element,{billTo,['PurchaseOrderType'],'http://www.example.com/PO1'},
+ [{simple_or_complex_Type,
+ {'USAddress',[],'http://www.example.com/PO1'}}],
+ false,
+ undefined,
+ [],
+ ['PurchaseOrderType'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{items,['PurchaseOrderType'],'http://www.example.com/PO1'}},
+ {schema_element,{items,['PurchaseOrderType'],'http://www.example.com/PO1'},
+ [{simple_or_complex_Type,
+ {'Items',[],'http://www.example.com/PO1'}}],
+ false,
+ undefined,
+ [],
+ ['PurchaseOrderType'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{complexType,{'Items',[],'http://www.example.com/PO1'}},
+ {schema_complex_type,{'Items',[],'http://www.example.com/PO1'},
+ undefined,
+ false,
+ ['Items'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [],
+ [{sequence,{[{element,
+ {{item,
+ ['Items'],
+ 'http://www.example.com/PO1'},
+ {0,unbounded}}}],
+ {1,1}}}],
+ undefined}},
+ {{element,{item,['Items'],'http://www.example.com/PO1'}},
+ {schema_element,{item,['Items'],'http://www.example.com/PO1'},
+ [{complexType,{'_xmerl_no_name_',
+ [anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['Items'],
+ undefined,
+ {0,unbounded},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{attribute,{partNum,[anonymous,item,'Items'],'http://www.example.com/PO1'}},
+ {schema_attribute,{partNum,[anonymous,item,'Items'],
+ 'http://www.example.com/PO1'},
+ [{simpleType,{'SKU',[],'http://www.example.com/PO1'}}],
+ false,
+ [anonymous,item,'Items'],
+ required,
+ undefined,
+ undefined,
+ undefined}},
+ {{complexType,{'_xmerl_no_name_',[anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'}},
+ {schema_complex_type,{'_xmerl_no_name_',
+ [anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'},
+ undefined,
+ false,
+ [anonymous,item,'Items'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [{attribute,{partNum,
+ [anonymous,item,'Items'],
+ 'http://www.example.com/PO1'}}],
+ [{sequence,{[{element,
+ {{productName,
+ [anonymous,item,'Items'],
+ 'http://www.example.com/PO1'},
+ {1,1}}},
+ {element,
+ {{quantity,
+ [anonymous,item,'Items'],
+ 'http://www.example.com/PO1'},
+ {1,1}}},
+ {element,
+ {{'USPrice',
+ [anonymous,item,'Items'],
+ 'http://www.example.com/PO1'},
+ {1,1}}},
+ {element,
+ {{comment,
+ [],
+ 'http://www.example.com/PO1'},
+ {0,1}}},
+ {element,
+ {{shipDate,
+ [anonymous,item,'Items'],
+ 'http://www.example.com/PO1'},
+ {0,1}}}],
+ {1,1}}}],
+ undefined}},
+ {{attribute,{country,['USAddress'],'http://www.example.com/PO1'}},
+ {schema_attribute,{country,['USAddress'],'http://www.example.com/PO1'},
+ [{simpleType,{'NMTOKEN',
+ [],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ ['USAddress'],
+ optional,
+ undefined,
+ "US",
+ undefined}},
+ {{element,{'USPrice',[anonymous,item,'Items'],'http://www.example.com/PO1'}},
+ {schema_element,{'USPrice',[anonymous,item,'Items'],
+ 'http://www.example.com/PO1'},
+ [{simpleType,{decimal,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ [anonymous,item,'Items'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{shipDate,[anonymous,item,'Items'],'http://www.example.com/PO1'}},
+ {schema_element,{shipDate,[anonymous,item,'Items'],
+ 'http://www.example.com/PO1'},
+ [{simpleType,{date,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ [anonymous,item,'Items'],
+ undefined,
+ {0,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{zip,['USAddress'],'http://www.example.com/PO1'}},
+ {schema_element,{zip,['USAddress'],'http://www.example.com/PO1'},
+ [{simpleType,{decimal,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['USAddress'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}}]
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/po1.tab2 b/lib/xmerl/test/xmerl_xsd_SUITE_data/po1.tab2
new file mode 100644
index 0000000000..fa3fcdaa09
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/po1.tab2
@@ -0,0 +1,424 @@
+[{{element,{name,['USAddress'],'http://www.example.com/PO1'}},
+ {schema_element,{name,['USAddress'],'http://www.example.com/PO1'},
+ [{simpleType,{string,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['USAddress'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{productName,[anonymous,item,'Items'],'http://www.example.com/PO1'}},
+ {schema_element,{productName,[anonymous,item,'Items'],
+ 'http://www.example.com/PO1'},
+ [{simpleType,{string,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ [anonymous,item,'Items'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{schema,"po1.xsd"},
+ {schema,unqualified,
+ unqualified,
+ 'http://www.example.com/PO1',
+ [],
+ [],
+ [{element,{{purchaseOrder,[],'http://www.example.com/PO1'},{1,1}}},
+ {element,{{comment,[],'http://www.example.com/PO1'},{1,1}}}]}},
+ {{simpleType,{'_xmerl_no_name_',[quantity,anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'}},
+ {schema_simple_type,{'_xmerl_no_name_',
+ [quantity,anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'},
+ [quantity,anonymous,item,'Items'],
+ {positiveInteger,[],'http://www.w3.org/2001/XMLSchema'},
+ false,
+ [],
+ [{maxExclusive,"100"}],
+ atomic,
+ [{restriction,{{positiveInteger,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'},
+ [{maxExclusive,"100"}]}}]}},
+ {{element,{street,['USAddress'],'http://www.example.com/PO1'}},
+ {schema_element,{street,['USAddress'],'http://www.example.com/PO1'},
+ [{simpleType,{string,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['USAddress'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{shipTo,['PurchaseOrderType'],'http://www.example.com/PO1'}},
+ {schema_element,{shipTo,['PurchaseOrderType'],'http://www.example.com/PO1'},
+ [{simple_or_complex_Type,
+ {'USAddress',[],'http://www.example.com/PO1'}}],
+ false,
+ undefined,
+ [],
+ ['PurchaseOrderType'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{complexType,{'PurchaseOrderType',[],'http://www.example.com/PO1'}},
+ {schema_complex_type,{'PurchaseOrderType',[],'http://www.example.com/PO1'},
+ undefined,
+ false,
+ ['PurchaseOrderType'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [{attribute,{orderDate,
+ ['PurchaseOrderType'],
+ 'http://www.example.com/PO1'}}],
+ [{sequence,{[{element,
+ {{shipTo,
+ ['PurchaseOrderType'],
+ 'http://www.example.com/PO1'},
+ {1,1}}},
+ {element,
+ {{billTo,
+ ['PurchaseOrderType'],
+ 'http://www.example.com/PO1'},
+ {1,1}}},
+ {element,
+ {{comment,
+ [],
+ 'http://www.example.com/PO1'},
+ {0,1}}},
+ {element,
+ {{items,
+ ['PurchaseOrderType'],
+ 'http://www.example.com/PO1'},
+ {1,1}}}],
+ {1,1}}}],
+ undefined}},
+ {{simpleType,{'SKU',[],'http://www.example.com/PO1'}},
+ {schema_simple_type,{'SKU',[],'http://www.example.com/PO1'},
+ [],
+ {string,[],'http://www.w3.org/2001/XMLSchema'},
+ false,
+ [],
+ [{pattern,"\\d{3}-[A-Z]{2}"}],
+ atomic,
+ [{restriction,{{string,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'},
+ [{pattern,"\\d{3}-[A-Z]{2}"}]}}]}},
+ {{element,{city,['USAddress'],'http://www.example.com/PO1'}},
+ {schema_element,{city,['USAddress'],'http://www.example.com/PO1'},
+ [{simpleType,{string,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['USAddress'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{quantity,[anonymous,item,'Items'],'http://www.example.com/PO1'}},
+ {schema_element,{quantity,[anonymous,item,'Items'],
+ 'http://www.example.com/PO1'},
+ [{simpleType,{'_xmerl_no_name_',
+ [quantity,anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ [anonymous,item,'Items'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{attribute,{orderDate,['PurchaseOrderType'],'http://www.example.com/PO1'}},
+ {schema_attribute,{orderDate,['PurchaseOrderType'],
+ 'http://www.example.com/PO1'},
+ [{simpleType,{date,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ ['PurchaseOrderType'],
+ optional,
+ undefined,
+ undefined,
+ undefined}},
+ {{element,{state,['USAddress'],'http://www.example.com/PO1'}},
+ {schema_element,{state,['USAddress'],'http://www.example.com/PO1'},
+ [{simpleType,{string,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['USAddress'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{comment,[],'http://www.example.com/PO1'}},
+ {schema_element,{comment,[],'http://www.example.com/PO1'},
+ [{simpleType,{string,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ [],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{complexType,{'USAddress',[],'http://www.example.com/PO1'}},
+ {schema_complex_type,{'USAddress',[],'http://www.example.com/PO1'},
+ undefined,
+ false,
+ ['USAddress'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [{attribute,{country,
+ ['USAddress'],
+ 'http://www.example.com/PO1'}}],
+ [{sequence,{[{element,
+ {{name,
+ ['USAddress'],
+ 'http://www.example.com/PO1'},
+ {1,1}}},
+ {element,
+ {{street,
+ ['USAddress'],
+ 'http://www.example.com/PO1'},
+ {1,1}}},
+ {element,
+ {{city,
+ ['USAddress'],
+ 'http://www.example.com/PO1'},
+ {1,1}}},
+ {element,
+ {{state,
+ ['USAddress'],
+ 'http://www.example.com/PO1'},
+ {1,1}}},
+ {element,
+ {{zip,
+ ['USAddress'],
+ 'http://www.example.com/PO1'},
+ {1,1}}}],
+ {1,1}}}],
+ undefined}},
+ {{element,{purchaseOrder,[],'http://www.example.com/PO1'}},
+ {schema_element,{purchaseOrder,[],'http://www.example.com/PO1'},
+ [{simple_or_complex_Type,
+ {'PurchaseOrderType',[],'http://www.example.com/PO1'}}],
+ false,
+ undefined,
+ [],
+ [],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{billTo,['PurchaseOrderType'],'http://www.example.com/PO1'}},
+ {schema_element,{billTo,['PurchaseOrderType'],'http://www.example.com/PO1'},
+ [{simple_or_complex_Type,
+ {'USAddress',[],'http://www.example.com/PO1'}}],
+ false,
+ undefined,
+ [],
+ ['PurchaseOrderType'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{items,['PurchaseOrderType'],'http://www.example.com/PO1'}},
+ {schema_element,{items,['PurchaseOrderType'],'http://www.example.com/PO1'},
+ [{simple_or_complex_Type,
+ {'Items',[],'http://www.example.com/PO1'}}],
+ false,
+ undefined,
+ [],
+ ['PurchaseOrderType'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{complexType,{'Items',[],'http://www.example.com/PO1'}},
+ {schema_complex_type,{'Items',[],'http://www.example.com/PO1'},
+ undefined,
+ false,
+ ['Items'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [],
+ [{sequence,{[{element,
+ {{item,
+ ['Items'],
+ 'http://www.example.com/PO1'},
+ {0,unbounded}}}],
+ {1,1}}}],
+ undefined}},
+ {{element,{item,['Items'],'http://www.example.com/PO1'}},
+ {schema_element,{item,['Items'],'http://www.example.com/PO1'},
+ [{complexType,{'_xmerl_no_name_',
+ [anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['Items'],
+ undefined,
+ {0,unbounded},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{attribute,{partNum,[anonymous,item,'Items'],'http://www.example.com/PO1'}},
+ {schema_attribute,{partNum,[anonymous,item,'Items'],
+ 'http://www.example.com/PO1'},
+ [{simpleType,{'SKU',[],'http://www.example.com/PO1'}}],
+ false,
+ [anonymous,item,'Items'],
+ required,
+ undefined,
+ undefined,
+ undefined}},
+ {{complexType,{'_xmerl_no_name_',[anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'}},
+ {schema_complex_type,{'_xmerl_no_name_',
+ [anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'},
+ undefined,
+ false,
+ [anonymous,item,'Items'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [{attribute,{partNum,
+ [anonymous,item,'Items'],
+ 'http://www.example.com/PO1'}}],
+ [{sequence,{[{element,
+ {{productName,
+ [anonymous,item,'Items'],
+ 'http://www.example.com/PO1'},
+ {1,1}}},
+ {element,
+ {{quantity,
+ [anonymous,item,'Items'],
+ 'http://www.example.com/PO1'},
+ {1,1}}},
+ {element,
+ {{'USPrice',
+ [anonymous,item,'Items'],
+ 'http://www.example.com/PO1'},
+ {1,1}}},
+ {element,
+ {{comment,
+ [],
+ 'http://www.example.com/PO1'},
+ {0,1}}},
+ {element,
+ {{shipDate,
+ [anonymous,item,'Items'],
+ 'http://www.example.com/PO1'},
+ {0,1}}}],
+ {1,1}}}],
+ undefined}},
+ {{attribute,{country,['USAddress'],'http://www.example.com/PO1'}},
+ {schema_attribute,{country,['USAddress'],'http://www.example.com/PO1'},
+ [{simpleType,{'NMTOKEN',
+ [],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ ['USAddress'],
+ optional,
+ undefined,
+ "US",
+ undefined}},
+ {{element,{'USPrice',[anonymous,item,'Items'],'http://www.example.com/PO1'}},
+ {schema_element,{'USPrice',[anonymous,item,'Items'],
+ 'http://www.example.com/PO1'},
+ [{simpleType,{decimal,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ [anonymous,item,'Items'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{shipDate,[anonymous,item,'Items'],'http://www.example.com/PO1'}},
+ {schema_element,{shipDate,[anonymous,item,'Items'],
+ 'http://www.example.com/PO1'},
+ [{simpleType,{date,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ [anonymous,item,'Items'],
+ undefined,
+ {0,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{zip,['USAddress'],'http://www.example.com/PO1'}},
+ {schema_element,{zip,['USAddress'],'http://www.example.com/PO1'},
+ [{simpleType,{decimal,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['USAddress'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}}]
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/po1.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/po1.xml
new file mode 100644
index 0000000000..c77701b5a2
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/po1.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<apo:purchaseOrder xmlns:apo="http://www.example.com/PO1"
+ orderDate="1999-10-20">
+ <shipTo country="US">
+ <name>Alice Smith</name>
+ <street>123 Maple Street</street>
+ <!-- etc. -->
+ <city>Mill Valley</city>
+ <state>CA</state>
+ <zip>90952</zip>
+ </shipTo>
+ <billTo country="US">
+ <name>Robert Smith</name>
+ <street>8 Oak Avenue</street>
+ <!-- etc. -->
+ <city>Old Town</city>
+ <state>PA</state>
+ <zip>95819</zip>
+ </billTo>
+ <apo:comment>Hurry, my lawn is going wild!</apo:comment>
+ <!-- etc. -->
+ <items>
+ <item partNum="872-AA">
+ <productName>Lawnmower</productName>
+ <quantity>1</quantity>
+ <USPrice>148.95</USPrice>
+ <comment>Confirm this is electric</comment>
+ </item>
+ <item partNum="926-AA">
+ <productName>Baby Monitor</productName>
+ <quantity>1</quantity>
+ <USPrice>39.98</USPrice>
+ <shipDate>1999-05-21</shipDate>
+ </item>
+ </items>
+</apo:purchaseOrder>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/po1.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/po1.xsd
new file mode 100644
index 0000000000..bc4dae27b5
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/po1.xsd
@@ -0,0 +1,64 @@
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:po="http://www.example.com/PO1"
+ targetNamespace="http://www.example.com/PO1"
+ elementFormDefault="unqualified"
+ attributeFormDefault="unqualified">
+
+ <element name="purchaseOrder" type="po:PurchaseOrderType"/>
+
+ <element name="comment" type="string"/>
+
+ <complexType name="PurchaseOrderType">
+ <sequence>
+ <element name="shipTo" type="po:USAddress"/>
+ <element name="billTo" type="po:USAddress"/>
+ <element ref="po:comment" minOccurs="0"/>
+ <element name="items" type="po:Items"/>
+ </sequence>
+ <attribute name="orderDate" type="date"/>
+ </complexType>
+
+ <complexType name="USAddress">
+ <sequence>
+ <element name="name" type="string"/>
+ <element name="street" type="string"/>
+ <element name="city" type="string"/>
+ <element name="state" type="string"/>
+ <element name="zip" type="decimal"/>
+ </sequence>
+ <attribute name="country" type="NMTOKEN"
+ fixed="US"/>
+ </complexType>
+
+ <complexType name="Items">
+ <sequence>
+ <element name="item" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="productName" type="string"/>
+ <element name="quantity">
+ <simpleType>
+ <restriction base="positiveInteger">
+ <maxExclusive value="100"/>
+ </restriction>
+ </simpleType>
+ </element>
+ <element name="USPrice" type="decimal"/>
+ <element ref="po:comment" minOccurs="0"/>
+ <element name="shipDate" type="date" minOccurs="0"/>
+ </sequence>
+ <attribute name="partNum" type="po:SKU" use="required"/>
+ </complexType>
+ </element>
+ </sequence>
+ </complexType>
+
+ <!-- Stock Keeping Unit, a code for identifying products -->
+ <simpleType name="SKU">
+ <restriction base="string">
+ <pattern value="\d{3}-[A-Z]{2}"/>
+ </restriction>
+ </simpleType>
+
+</schema>
+
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/po1_all.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/po1_all.xsd
new file mode 100644
index 0000000000..7383c7f8f6
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/po1_all.xsd
@@ -0,0 +1,65 @@
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:po="http://www.example.com/PO1"
+ targetNamespace="http://www.example.com/PO1"
+ elementFormDefault="unqualified"
+ attributeFormDefault="unqualified">
+
+ <element name="purchaseOrder" type="po:PurchaseOrderType"/>
+
+ <element name="comment" type="string"/>
+
+
+ <complexType name="PurchaseOrderType">
+ <all>
+ <element name="shipTo" type="po:USAddress"/>
+ <element name="billTo" type="po:USAddress"/>
+ <element ref="po:comment" minOccurs="0"/>
+ <element name="items" type="po:Items"/>
+ </all>
+ <attribute name="orderDate" type="date"/>
+ </complexType>
+
+ <complexType name="USAddress">
+ <sequence>
+ <element name="name" type="string"/>
+ <element name="street" type="string"/>
+ <element name="city" type="string"/>
+ <element name="state" type="string"/>
+ <element name="zip" type="decimal"/>
+ </sequence>
+ <attribute name="country" type="NMTOKEN"
+ fixed="US"/>
+ </complexType>
+
+ <complexType name="Items">
+ <sequence>
+ <element name="item" minOccurs="0" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="productName" type="string"/>
+ <element name="quantity">
+ <simpleType>
+ <restriction base="positiveInteger">
+ <maxExclusive value="100"/>
+ </restriction>
+ </simpleType>
+ </element>
+ <element name="USPrice" type="decimal"/>
+ <element ref="po:comment" minOccurs="0"/>
+ <element name="shipDate" type="date" minOccurs="0"/>
+ </sequence>
+ <attribute name="partNum" type="po:SKU" use="required"/>
+ </complexType>
+ </element>
+ </sequence>
+ </complexType>
+
+ <!-- Stock Keeping Unit, a code for identifying products -->
+ <simpleType name="SKU">
+ <restriction base="string">
+ <pattern value="\d{3}-[A-Z]{2}"/>
+ </restriction>
+ </simpleType>
+
+</schema>
+
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/po1_all1.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/po1_all1.xml
new file mode 100644
index 0000000000..a5ae223d65
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/po1_all1.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<apo:purchaseOrder xmlns:apo="http://www.example.com/PO1"
+ orderDate="1999-10-20">
+ <billTo country="US">
+ <name>Robert Smith</name>
+ <street>8 Oak Avenue</street>
+ <!-- etc. -->
+ <city>Old Town</city>
+ <state>PA</state>
+ <zip>95819</zip>
+ </billTo>
+ <apo:comment>Hurry, my lawn is going wild!</apo:comment>
+ <shipTo country="US">
+ <name>Alice Smith</name>
+ <street>123 Maple Street</street>
+ <!-- etc. -->
+ <city>Mill Valley</city>
+ <state>CA</state>
+ <zip>90952</zip>
+ </shipTo>
+ <!-- etc. -->
+ <items>
+ <item partNum="872-AA">
+ <productName>Lawnmower</productName>
+ <quantity>1</quantity>
+ <USPrice>148.95</USPrice>
+ <comment>Confirm this is electric</comment>
+ </item>
+ <item partNum="926-AA">
+ <productName>Baby Monitor</productName>
+ <quantity>1</quantity>
+ <USPrice>39.98</USPrice>
+ <shipDate>1999-05-21</shipDate>
+ </item>
+ </items>
+</apo:purchaseOrder>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/po1_all2.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/po1_all2.xml
new file mode 100644
index 0000000000..2c40c8c686
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/po1_all2.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<apo:purchaseOrder xmlns:apo="http://www.example.com/PO1"
+ orderDate="1999-10-20">
+ <billTo country="US">
+ <name>Robert Smith</name>
+ <street>8 Oak Avenue</street>
+ <!-- etc. -->
+ <city>Old Town</city>
+ <state>PA</state>
+ <zip>95819</zip>
+ </billTo>
+ <shipTo country="US">
+ <name>Alice Smith</name>
+ <street>123 Maple Street</street>
+ <!-- etc. -->
+ <city>Mill Valley</city>
+ <state>CA</state>
+ <zip>90952</zip>
+ </shipTo>
+ <!-- etc. -->
+ <items>
+ <item partNum="872-AA">
+ <productName>Lawnmower</productName>
+ <quantity>1</quantity>
+ <USPrice>148.95</USPrice>
+ <comment>Confirm this is electric</comment>
+ </item>
+ <item partNum="926-AA">
+ <productName>Baby Monitor</productName>
+ <quantity>1</quantity>
+ <USPrice>39.98</USPrice>
+ <shipDate>1999-05-21</shipDate>
+ </item>
+ </items>
+</apo:purchaseOrder>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/po1_all_err1.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/po1_all_err1.xml
new file mode 100644
index 0000000000..98d82e4642
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/po1_all_err1.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<apo:purchaseOrder xmlns:apo="http://www.example.com/PO1"
+ orderDate="1999-10-20">
+ <billTo country="US">
+ <name>Robert Smith</name>
+ <street>8 Oak Avenue</street>
+ <!-- etc. -->
+ <city>Old Town</city>
+ <state>PA</state>
+ <zip>95819</zip>
+ </billTo>
+ <apo:comment>Hurry, my lawn is going wild!</apo:comment>
+ <shipTo country="US">
+ <name>Alice Smith</name>
+ <street>123 Maple Street</street>
+ <!-- etc. -->
+ <city>Mill Valley</city>
+ <state>CA</state>
+ <zip>90952</zip>
+ </shipTo>
+ <apo:comment>Hurry, my lawn is going wild!</apo:comment>
+ <!-- etc. -->
+ <items>
+ <item partNum="872-AA">
+ <productName>Lawnmower</productName>
+ <quantity>1</quantity>
+ <USPrice>148.95</USPrice>
+ <comment>Confirm this is electric</comment>
+ </item>
+ <item partNum="926-AA">
+ <productName>Baby Monitor</productName>
+ <quantity>1</quantity>
+ <USPrice>39.98</USPrice>
+ <shipDate>1999-05-21</shipDate>
+ </item>
+ </items>
+</apo:purchaseOrder>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/po1_all_err2.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/po1_all_err2.xml
new file mode 100644
index 0000000000..e4cc3f362e
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/po1_all_err2.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<apo:purchaseOrder xmlns:apo="http://www.example.com/PO1"
+ orderDate="1999-10-20">
+ <billTo country="US">
+ <name>Robert Smith</name>
+ <street>8 Oak Avenue</street>
+ <!-- etc. -->
+ <city>Old Town</city>
+ <state>PA</state>
+ <zip>95819</zip>
+ </billTo>
+ <apo:comment>Hurry, my lawn is going wild!</apo:comment>
+ <!-- etc. -->
+ <items>
+ <item partNum="872-AA">
+ <productName>Lawnmower</productName>
+ <quantity>1</quantity>
+ <USPrice>148.95</USPrice>
+ <comment>Confirm this is electric</comment>
+ </item>
+ <item partNum="926-AA">
+ <productName>Baby Monitor</productName>
+ <quantity>1</quantity>
+ <USPrice>39.98</USPrice>
+ <shipDate>1999-05-21</shipDate>
+ </item>
+ </items>
+</apo:purchaseOrder>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/po1_global.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/po1_global.xsd
new file mode 100644
index 0000000000..04a4baa0d2
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/po1_global.xsd
@@ -0,0 +1,86 @@
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:po="http://www.example.com/PO1"
+ targetNamespace="http://www.example.com/PO1">
+
+<!-- validates po2.xml -->
+
+ <element name="purchaseOrder" type="po:PurchaseOrderType"/>
+
+ <element name="shipTo" type="po:USAddress"/>
+ <element name="billTo" type="po:USAddress"/>
+ <element name="comment" type="string"/>
+
+ <element name="name" type="string"/>
+ <element name="street" type="string"/>
+
+ <element name="items" type="po:Items"/>
+
+ <attribute name="orderDate" type="date"/>
+
+ <element name="city" type="string"/>
+ <element name="state" type="string"/>
+ <element name="zip" type="decimal"/>
+
+ <attribute name="country" type="NMTOKEN" fixed="US"/>
+
+ <element name="item" type="po:Item"/>
+
+ <element name="productName" type="string"/>
+ <element name="quantity" type="ps:Quantity"/>
+ <element name="USPrice" type="decimal"/>
+ <element name="shipDate" type="date"/>
+
+ <attribute name="partNum" type="po:SKU" use="required"/>
+
+ <complexType name="PurchaseOrderType">
+ <sequence>
+ <element ref="po:shipTo"/>
+ <element ref="po:billTo"/>
+ <element ref="po:comment" minOccurs="0"/>
+ <element ref="po:items"/>
+ </sequence>
+ <attribute ref="po:orderDate"/>
+ </complexType>
+
+ <complexType name="USAddress">
+ <sequence>
+ <element ref="po:name"/>
+ <element ref="po:street"/>
+ <element ref="po:city"/>
+ <element ref="po:state"/>
+ <element ref="po:zip"/>
+ </sequence>
+ <attribute ref="po:country"/>
+ </complexType>
+
+ <complexType name="Items">
+ <sequence>
+ <element ref="po:item" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ </complexType>
+
+ <complexType name="Item">
+ <sequence>
+ <element ref="po:productName"/>
+ <element ref="po:quantity"/>
+ <element ref="po:USPrice"/>
+ <element ref="po:comment" minOccurs="0"/>
+ <element ref="po:shipDate" minOccurs="0"/>
+ </sequence>
+ <attribute ref="po:partNum"/>
+ </complexType>
+
+ <simpleType name="Quantity">
+ <restriction base="positiveInteger">
+ <maxExclusive value="100"/>
+ </restriction>
+ </simpleType>
+
+ <!-- Stock Keeping Unit, a code for identifying products -->
+ <simpleType name="SKU">
+ <restriction base="string">
+ <pattern value="\d{3}-[A-Z]{2}"/>
+ </restriction>
+ </simpleType>
+
+</schema>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/po2.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/po2.xml
new file mode 100644
index 0000000000..c1077b7572
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/po2.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<purchaseOrder xmlns="http://www.example.com/PO1"
+ orderDate="1999-10-20">
+ <shipTo country="US">
+ <name>Alice Smith</name>
+ <street>123 Maple Street</street>
+ <!-- etc. -->
+ <city>Mill Valley</city>
+ <state>CA</state>
+ <zip>90952</zip>
+ </shipTo>
+ <billTo country="US">
+ <name>Robert Smith</name>
+ <street>8 Oak Avenue</street>
+ <!-- etc. -->
+ <city>Old Town</city>
+ <state>PA</state>
+ <zip>95819</zip>
+ </billTo>
+ <comment>Hurry, my lawn is going wild!</comment>
+ <!-- etc. -->
+ <items>
+ <item partNum="872-AA">
+ <productName>Lawnmower</productName>
+ <quantity>1</quantity>
+ <USPrice>148.95</USPrice>
+ <comment>Confirm this is electric</comment>
+ </item>
+ <item partNum="926-AA">
+ <productName>Baby Monitor</productName>
+ <quantity>1</quantity>
+ <USPrice>39.98</USPrice>
+ <shipDate>1999-05-21</shipDate>
+ </item>
+ </items>
+</purchaseOrder>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/po_attrGroup.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/po_attrGroup.xml
new file mode 100644
index 0000000000..5e49a4a889
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/po_attrGroup.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<purchaseOrder orderDate="1999-10-20">
+ <shipTo country="US">
+ <name>Alice Smith</name>
+ <street>123 Maple Street</street>
+ <city>Mill Valley</city>
+ <state>CA</state>
+ <zip>90952</zip>
+ </shipTo>
+ <billTo country="US">
+ <name>Robert Smith</name>
+ <street>8 Oak Avenue</street>
+ <city>Old Town</city>
+ <state>PA</state>
+ <zip>95819</zip>
+ </billTo>
+ <comment>Hurry, my lawn is going wild!</comment>
+ <items>
+ <item partNum="872-AA" weightKg="25.5" shipBy="any">
+ <productName>Lawnmower</productName>
+ <quantity>1</quantity>
+ <USPrice>148.95</USPrice>
+ <comment>Confirm this is electric</comment>
+ </item>
+ <item partNum="926-AA" weightKg="0.5" shipBy="air">
+ <productName>Baby Monitor</productName>
+ <quantity>1</quantity>
+ <USPrice>39.98</USPrice>
+ <shipDate>1999-05-21</shipDate>
+ </item>
+ </items>
+</purchaseOrder>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/po_attrGroup.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/po_attrGroup.xsd
new file mode 100644
index 0000000000..734f65e0e0
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/po_attrGroup.xsd
@@ -0,0 +1,81 @@
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+ <xsd:annotation>
+ <xsd:documentation xml:lang="en">
+ Purchase order schema for Example.com.
+ Copyright 2000 Example.com. All rights reserved.
+ </xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:element name="purchaseOrder" type="PurchaseOrderType"/>
+
+ <xsd:element name="comment" type="xsd:string"/>
+
+ <xsd:complexType name="PurchaseOrderType">
+ <xsd:sequence>
+ <xsd:element name="shipTo" type="USAddress"/>
+ <xsd:element name="billTo" type="USAddress"/>
+ <xsd:element ref="comment" minOccurs="0"/>
+ <xsd:element name="items" type="Items"/>
+ </xsd:sequence>
+ <xsd:attribute name="orderDate" type="xsd:date"/>
+ </xsd:complexType>
+
+ <xsd:complexType name="USAddress">
+ <xsd:sequence>
+ <xsd:element name="name" type="xsd:string"/>
+ <xsd:element name="street" type="xsd:string"/>
+ <xsd:element name="city" type="xsd:string"/>
+ <xsd:element name="state" type="xsd:string"/>
+ <xsd:element name="zip" type="xsd:decimal"/>
+ </xsd:sequence>
+ <xsd:attribute name="country" type="xsd:NMTOKEN"
+ fixed="US"/>
+ </xsd:complexType>
+
+ <xsd:complexType name="Items">
+ <xsd:sequence>
+ <xsd:element name="item" minOccurs="0" maxOccurs="unbounded">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="productName" type="xsd:string"/>
+ <xsd:element name="quantity">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:positiveInteger">
+ <xsd:maxExclusive value="100"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="USPrice" type="xsd:decimal"/>
+ <xsd:element ref="comment" minOccurs="0"/>
+ <xsd:element name="shipDate" type="xsd:date" minOccurs="0"/>
+ </xsd:sequence>
+ <xsd:attributeGroup ref="ItemDelivery"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <!-- Stock Keeping Unit, a code for identifying products -->
+ <xsd:simpleType name="SKU">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="\d{3}-[A-Z]{2}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:attributeGroup name="ItemDelivery">
+ <xsd:attribute name="partNum" type="SKU" use="required"/>
+ <xsd:attribute name="weightKg" type="xsd:decimal"/>
+ <xsd:attribute name="shipBy">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="air"/>
+ <xsd:enumeration value="land"/>
+ <xsd:enumeration value="any"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:attribute>
+ </xsd:attributeGroup>
+
+</xsd:schema>
+
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/report.tab b/lib/xmerl/test/xmerl_xsd_SUITE_data/report.tab
new file mode 100644
index 0000000000..f5c10e2683
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/report.tab
@@ -0,0 +1,850 @@
+[{{complexType,{'RegionsType',[],'http://www.example.com/Report'}},
+ {schema_complex_type,{'RegionsType',[],'http://www.example.com/Report'},
+ undefined,
+ false,
+ ['RegionsType'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [],
+ [{sequence,{[{element,
+ {{zip,
+ ['RegionsType'],
+ 'http://www.example.com/Report'},
+ {1,unbounded}}}],
+ {1,1}}}],
+ undefined}},
+ {{complexType,{'PurchaseOrderType',[],'http://www.example.com/IPO'}},
+ {schema_complex_type,{'PurchaseOrderType',[],'http://www.example.com/IPO'},
+ undefined,
+ false,
+ ['PurchaseOrderType'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [{attribute,{orderDate,
+ ['PurchaseOrderType'],
+ 'http://www.example.com/IPO'}}],
+ [{sequence,{[{element,
+ {{shipTo,
+ ['PurchaseOrderType'],
+ 'http://www.example.com/IPO'},
+ {1,1}}},
+ {element,
+ {{billTo,
+ ['PurchaseOrderType'],
+ 'http://www.example.com/IPO'},
+ {1,1}}},
+ {element,
+ {{comment,
+ [],
+ 'http://www.example.com/IPO'},
+ {0,1}}},
+ {element,
+ {{items,
+ ['PurchaseOrderType'],
+ 'http://www.example.com/IPO'},
+ {1,1}}}],
+ {1,1}}}],
+ undefined}},
+ {{element,{parts,[anonymous,purchaseReport],'http://www.example.com/Report'}},
+ {schema_element,{parts,[anonymous,purchaseReport],
+ 'http://www.example.com/Report'},
+ [{simple_or_complex_Type,
+ {'PartsType',[],'http://www.example.com/Report'}}],
+ false,
+ undefined,
+ [],
+ [anonymous,purchaseReport],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{item,['Items'],'http://www.example.com/IPO'}},
+ {schema_element,{item,['Items'],'http://www.example.com/IPO'},
+ [{complexType,{'_xmerl_no_name_',
+ [anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['Items'],
+ undefined,
+ {0,unbounded},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{part,[anonymous,zip,'RegionsType'],
+ 'http://www.example.com/Report'}},
+ {schema_element,{part,[anonymous,zip,'RegionsType'],
+ 'http://www.example.com/Report'},
+ [{complexType,{'_xmerl_no_name_',
+ [anonymous,
+ part,
+ anonymous,
+ zip,
+ 'RegionsType'],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ [anonymous,zip,'RegionsType'],
+ undefined,
+ {1,unbounded},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{attribute,{orderDate,['PurchaseOrderType'],'http://www.example.com/IPO'}},
+ {schema_attribute,{orderDate,['PurchaseOrderType'],
+ 'http://www.example.com/IPO'},
+ [{simpleType,{date,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ ['PurchaseOrderType'],
+ optional,
+ undefined,
+ undefined,
+ undefined}},
+ {{attribute,{number,[anonymous,part,anonymous,zip,'RegionsType'],
+ 'http://www.example.com/Report'}},
+ {schema_attribute,{number,[anonymous,part,anonymous,zip,'RegionsType'],
+ 'http://www.example.com/Report'},
+ [{simpleType,{'SKU',[],'http://www.example.com/IPO'}}],
+ false,
+ [anonymous,part,anonymous,zip,'RegionsType'],
+ optional,
+ undefined,
+ undefined,
+ undefined}},
+ {{simpleType,{'USState',[],'http://www.example.com/IPO'}},
+ {schema_simple_type,{'USState',[],'http://www.example.com/IPO'},
+ [],
+ {string,[],'http://www.w3.org/2001/XMLSchema'},
+ false,
+ [],
+ [{enumeration,["AK","AL","AR","PA"]}],
+ atomic,
+ [{restriction,{{string,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'},
+ [{enumeration,"AK"},
+ {enumeration,"AL"},
+ {enumeration,"AR"},
+ {enumeration,"PA"}]}}]}},
+ {{complexType,{'PartsType',[],'http://www.example.com/Report'}},
+ {schema_complex_type,{'PartsType',[],'http://www.example.com/Report'},
+ undefined,
+ false,
+ ['PartsType'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [],
+ [{sequence,{[{element,
+ {{part,
+ ['PartsType'],
+ 'http://www.example.com/Report'},
+ {1,unbounded}}}],
+ {1,1}}}],
+ undefined}},
+ {{attribute,{partNum,[anonymous,item,'Items'],'http://www.example.com/IPO'}},
+ {schema_attribute,{partNum,[anonymous,item,'Items'],
+ 'http://www.example.com/IPO'},
+ [{simpleType,{'SKU',[],'http://www.example.com/IPO'}}],
+ false,
+ [anonymous,item,'Items'],
+ required,
+ undefined,
+ undefined,
+ undefined}},
+ {{element,{shipTo,['PurchaseOrderType'],'http://www.example.com/IPO'}},
+ {schema_element,{shipTo,['PurchaseOrderType'],'http://www.example.com/IPO'},
+ [{simple_or_complex_Type,
+ {'Address',[],'http://www.example.com/IPO'}}],
+ false,
+ undefined,
+ [],
+ ['PurchaseOrderType'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{complexType,{'_xmerl_no_name_',[anonymous,purchaseReport],
+ 'http://www.w3.org/2001/XMLSchema'}},
+ {schema_complex_type,{'_xmerl_no_name_',
+ [anonymous,purchaseReport],
+ 'http://www.w3.org/2001/XMLSchema'},
+ undefined,
+ false,
+ [anonymous,purchaseReport],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [{attribute,{period,
+ [anonymous,purchaseReport],
+ 'http://www.example.com/Report'}},
+ {attribute,{periodEnding,
+ [anonymous,purchaseReport],
+ 'http://www.example.com/Report'}}],
+ [{sequence,{[{element,
+ {{regions,
+ [anonymous,purchaseReport],
+ 'http://www.example.com/Report'},
+ {1,1}}},
+ {element,
+ {{parts,
+ [anonymous,purchaseReport],
+ 'http://www.example.com/Report'},
+ {1,1}}}],
+ {1,1}}}],
+ undefined}},
+ {{simpleType,{'SKU',[],'http://www.example.com/IPO'}},
+ {schema_simple_type,{'SKU',[],'http://www.example.com/IPO'},
+ [],
+ {string,[],'http://www.w3.org/2001/XMLSchema'},
+ false,
+ [],
+ [{pattern,"\\d{3}-[A-Z]{2}"}],
+ atomic,
+ [{restriction,{{string,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'},
+ [{pattern,"\\d{3}-[A-Z]{2}"}]}}]}},
+ {{attribute,{number,[anonymous,part,'PartsType'],
+ 'http://www.example.com/Report'}},
+ {schema_attribute,{number,[anonymous,part,'PartsType'],
+ 'http://www.example.com/Report'},
+ [{simpleType,{'SKU',[],'http://www.example.com/IPO'}}],
+ false,
+ [anonymous,part,'PartsType'],
+ optional,
+ undefined,
+ undefined,
+ undefined}},
+ {{attribute,{period,[anonymous,purchaseReport],
+ 'http://www.example.com/Report'}},
+ {schema_attribute,{period,[anonymous,purchaseReport],
+ 'http://www.example.com/Report'},
+ [{simpleType,{duration,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ [anonymous,purchaseReport],
+ optional,
+ undefined,
+ undefined,
+ undefined}},
+ {{simpleType,{'_xmerl_no_name_',[quantity,anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'}},
+ {schema_simple_type,{'_xmerl_no_name_',
+ [quantity,anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'},
+ [quantity,anonymous,item,'Items'],
+ {positiveInteger,[],'http://www.w3.org/2001/XMLSchema'},
+ false,
+ [],
+ [{maxExclusive,"100"}],
+ atomic,
+ [{restriction,{{positiveInteger,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'},
+ [{maxExclusive,"100"}]}}]}},
+ {{element,{productName,[anonymous,item,'Items'],'http://www.example.com/IPO'}},
+ {schema_element,{productName,[anonymous,item,'Items'],
+ 'http://www.example.com/IPO'},
+ [{simpleType,{string,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ [anonymous,item,'Items'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{comment,[],'http://www.example.com/IPO'}},
+ {schema_element,{comment,[],'http://www.example.com/IPO'},
+ [{simpleType,{string,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ [],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{attribute,{periodEnding,[anonymous,purchaseReport],
+ 'http://www.example.com/Report'}},
+ {schema_attribute,{periodEnding,[anonymous,purchaseReport],
+ 'http://www.example.com/Report'},
+ [{simpleType,{date,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ [anonymous,purchaseReport],
+ optional,
+ undefined,
+ undefined,
+ undefined}},
+ {{complexType,{'Address',[],'http://www.example.com/IPO'}},
+ {schema_complex_type,{'Address',[],'http://www.example.com/IPO'},
+ undefined,
+ false,
+ ['Address'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [],
+ [{sequence,{[{element,
+ {{name,
+ ['Address'],
+ 'http://www.example.com/IPO'},
+ {1,1}}},
+ {element,
+ {{street,
+ ['Address'],
+ 'http://www.example.com/IPO'},
+ {1,1}}},
+ {element,
+ {{city,
+ ['Address'],
+ 'http://www.example.com/IPO'},
+ {1,1}}}],
+ {1,1}}}],
+ undefined}},
+ {{element,{purchaseOrder,[],'http://www.example.com/IPO'}},
+ {schema_element,{purchaseOrder,[],'http://www.example.com/IPO'},
+ [{simple_or_complex_Type,
+ {'PurchaseOrderType',[],'http://www.example.com/IPO'}}],
+ false,
+ undefined,
+ [],
+ [],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{complexType,{'_xmerl_no_name_',[anonymous,part,'PartsType'],
+ 'http://www.w3.org/2001/XMLSchema'}},
+ {schema_complex_type,{'_xmerl_no_name_',
+ [anonymous,part,'PartsType'],
+ 'http://www.w3.org/2001/XMLSchema'},
+ undefined,
+ false,
+ [anonymous,part,'PartsType'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [{attribute,{number,
+ [anonymous,part,'PartsType'],
+ 'http://www.example.com/Report'}}],
+ [{extension,{{string,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'},
+ []}}],
+ undefined}},
+ {{element,{zip,['RegionsType'],'http://www.example.com/Report'}},
+ {schema_element,{zip,['RegionsType'],'http://www.example.com/Report'},
+ [{complexType,{'_xmerl_no_name_',
+ [anonymous,zip,'RegionsType'],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['RegionsType'],
+ undefined,
+ {1,unbounded},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{state,['USAddress'],'http://www.example.com/IPO'}},
+ {schema_element,{state,['USAddress'],'http://www.example.com/IPO'},
+ [{simple_or_complex_Type,
+ {'USState',[],'http://www.example.com/IPO'}}],
+ false,
+ undefined,
+ [],
+ ['USAddress'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{items,['PurchaseOrderType'],'http://www.example.com/IPO'}},
+ {schema_element,{items,['PurchaseOrderType'],'http://www.example.com/IPO'},
+ [{simple_or_complex_Type,
+ {'Items',[],'http://www.example.com/IPO'}}],
+ false,
+ undefined,
+ [],
+ ['PurchaseOrderType'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{simpleType,{'UKPostcode',[],'http://www.example.com/IPO'}},
+ {schema_simple_type,{'UKPostcode',[],'http://www.example.com/IPO'},
+ [],
+ {'Postcode',[],'http://www.example.com/IPO'},
+ false,
+ [],
+ [{pattern,"[A-Z]{2}\\d\\s\\d[A-Z]{2}"}],
+ atomic,
+ [{restriction,{{'Postcode',
+ [],
+ 'http://www.example.com/IPO'},
+ [{pattern,"[A-Z]{2}\\d\\s\\d[A-Z]{2}"}]}}]}},
+ {{complexType,{'Items',[],'http://www.example.com/IPO'}},
+ {schema_complex_type,{'Items',[],'http://www.example.com/IPO'},
+ undefined,
+ false,
+ ['Items'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [],
+ [{sequence,{[{element,
+ {{item,
+ ['Items'],
+ 'http://www.example.com/IPO'},
+ {0,unbounded}}}],
+ {1,1}}}],
+ undefined}},
+ {{element,{quantity,[anonymous,item,'Items'],'http://www.example.com/IPO'}},
+ {schema_element,{quantity,[anonymous,item,'Items'],
+ 'http://www.example.com/IPO'},
+ [{simpleType,{'_xmerl_no_name_',
+ [quantity,anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ [anonymous,item,'Items'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{attribute,{code,[anonymous,zip,'RegionsType'],
+ 'http://www.example.com/Report'}},
+ {schema_attribute,{code,[anonymous,zip,'RegionsType'],
+ 'http://www.example.com/Report'},
+ [{simpleType,{positiveInteger,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ [anonymous,zip,'RegionsType'],
+ optional,
+ undefined,
+ undefined,
+ undefined}},
+ {{element,{purchaseReport,[],'http://www.example.com/Report'}},
+ {schema_element,{purchaseReport,[],'http://www.example.com/Report'},
+ [{complexType,{'_xmerl_no_name_',
+ [anonymous,purchaseReport],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [{unique,{unique,{dummy1,
+ [purchaseReport],
+ 'http://www.example.com/Report'},
+ {selector,"r:regions/r:zip"},
+ [{field,"@code"}]}}],
+ [],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{street,['Address'],'http://www.example.com/IPO'}},
+ {schema_element,{street,['Address'],'http://www.example.com/IPO'},
+ [{simpleType,{string,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['Address'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{zip,['USAddress'],'http://www.example.com/IPO'}},
+ {schema_element,{zip,['USAddress'],'http://www.example.com/IPO'},
+ [{simpleType,{positiveInteger,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['USAddress'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{regions,[anonymous,purchaseReport],
+ 'http://www.example.com/Report'}},
+ {schema_element,{regions,[anonymous,purchaseReport],
+ 'http://www.example.com/Report'},
+ [{simple_or_complex_Type,
+ {'RegionsType',[],'http://www.example.com/Report'}}],
+ false,
+ undefined,
+ [],
+ [anonymous,purchaseReport],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{part,['PartsType'],'http://www.example.com/Report'}},
+ {schema_element,{part,['PartsType'],'http://www.example.com/Report'},
+ [{complexType,{'_xmerl_no_name_',
+ [anonymous,part,'PartsType'],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['PartsType'],
+ undefined,
+ {1,unbounded},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{city,['Address'],'http://www.example.com/IPO'}},
+ {schema_element,{city,['Address'],'http://www.example.com/IPO'},
+ [{simpleType,{string,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['Address'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{complexType,{'USAddress',[],'http://www.example.com/IPO'}},
+ {schema_complex_type,{'USAddress',[],'http://www.example.com/IPO'},
+ undefined,
+ false,
+ ['USAddress'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [],
+ [{extension,{{'Address',
+ [],
+ 'http://www.example.com/IPO'},
+ [{sequence,
+ {[{element,
+ {{state,
+ ['USAddress'],
+ 'http://www.example.com/IPO'},
+ {1,1}}},
+ {element,
+ {{zip,
+ ['USAddress'],
+ 'http://www.example.com/IPO'},
+ {1,1}}}],
+ {1,1}}}]}}],
+ undefined}},
+ {{complexType,{'_xmerl_no_name_',[anonymous,part,anonymous,zip,'RegionsType'],
+ 'http://www.w3.org/2001/XMLSchema'}},
+ {schema_complex_type,{'_xmerl_no_name_',
+ [anonymous,part,anonymous,zip,'RegionsType'],
+ 'http://www.w3.org/2001/XMLSchema'},
+ undefined,
+ false,
+ [anonymous,part,anonymous,zip,'RegionsType'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [{attribute,{number,
+ [anonymous,
+ part,
+ anonymous,
+ zip,
+ 'RegionsType'],
+ 'http://www.example.com/Report'}},
+ {attribute,{quantity,
+ [anonymous,
+ part,
+ anonymous,
+ zip,
+ 'RegionsType'],
+ 'http://www.example.com/Report'}}],
+ [{restriction,{{anyType,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'},
+ []}}],
+ undefined}},
+ {{element,{billTo,['PurchaseOrderType'],'http://www.example.com/IPO'}},
+ {schema_element,{billTo,['PurchaseOrderType'],'http://www.example.com/IPO'},
+ [{simple_or_complex_Type,
+ {'Address',[],'http://www.example.com/IPO'}}],
+ false,
+ undefined,
+ [],
+ ['PurchaseOrderType'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{postcode,['UKAddress'],'http://www.example.com/IPO'}},
+ {schema_element,{postcode,['UKAddress'],'http://www.example.com/IPO'},
+ [{simple_or_complex_Type,
+ {'UKPostcode',[],'http://www.example.com/IPO'}}],
+ false,
+ undefined,
+ [],
+ ['UKAddress'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{schema,"report.xsd"},
+ {schema,qualified,
+ unqualified,
+ 'http://www.example.com/Report',
+ [],
+ [],
+ [{element,{{purchaseReport,[],'http://www.example.com/Report'},
+ {1,1}}}]}},
+ {{complexType,{'_xmerl_no_name_',[anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'}},
+ {schema_complex_type,{'_xmerl_no_name_',
+ [anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'},
+ undefined,
+ false,
+ [anonymous,item,'Items'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [{attribute,{partNum,
+ [anonymous,item,'Items'],
+ 'http://www.example.com/IPO'}}],
+ [{sequence,{[{element,
+ {{productName,
+ [anonymous,item,'Items'],
+ 'http://www.example.com/IPO'},
+ {1,1}}},
+ {element,
+ {{quantity,
+ [anonymous,item,'Items'],
+ 'http://www.example.com/IPO'},
+ {1,1}}},
+ {element,
+ {{'USPrice',
+ [anonymous,item,'Items'],
+ 'http://www.example.com/IPO'},
+ {1,1}}},
+ {element,
+ {{comment,
+ [],
+ 'http://www.example.com/IPO'},
+ {0,1}}},
+ {element,
+ {{shipDate,
+ [anonymous,item,'Items'],
+ 'http://www.example.com/IPO'},
+ {0,1}}}],
+ {1,1}}}],
+ undefined}},
+ {{simpleType,{'Postcode',[],'http://www.example.com/IPO'}},
+ {schema_simple_type,{'Postcode',[],'http://www.example.com/IPO'},
+ [],
+ {string,[],'http://www.w3.org/2001/XMLSchema'},
+ false,
+ [],
+ [{length,"7"}],
+ atomic,
+ [{restriction,{{string,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'},
+ [{length,"7"}]}}]}},
+ {{element,{'USPrice',[anonymous,item,'Items'],'http://www.example.com/IPO'}},
+ {schema_element,{'USPrice',[anonymous,item,'Items'],
+ 'http://www.example.com/IPO'},
+ [{simpleType,{decimal,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ [anonymous,item,'Items'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{schema,"ipo.xsd"},
+ {schema,unqualified,
+ unqualified,
+ 'http://www.example.com/IPO',
+ [],
+ [],
+ [{element,{{purchaseOrder,[],'http://www.example.com/IPO'},{1,1}}},
+ {element,{{comment,[],'http://www.example.com/IPO'},{1,1}}}]}},
+ {{attribute,{quantity,[anonymous,part,anonymous,zip,'RegionsType'],
+ 'http://www.example.com/Report'}},
+ {schema_attribute,{quantity,[anonymous,part,anonymous,zip,'RegionsType'],
+ 'http://www.example.com/Report'},
+ [{simpleType,{positiveInteger,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ [anonymous,part,anonymous,zip,'RegionsType'],
+ optional,
+ undefined,
+ undefined,
+ undefined}},
+ {{element,{shipDate,[anonymous,item,'Items'],'http://www.example.com/IPO'}},
+ {schema_element,{shipDate,[anonymous,item,'Items'],
+ 'http://www.example.com/IPO'},
+ [{simpleType,{date,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ [anonymous,item,'Items'],
+ undefined,
+ {0,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{attribute,{exportCode,['UKAddress'],'http://www.example.com/IPO'}},
+ {schema_attribute,{exportCode,['UKAddress'],'http://www.example.com/IPO'},
+ [{simpleType,{positiveInteger,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ ['UKAddress'],
+ optional,
+ undefined,
+ "1",
+ undefined}},
+ {{element,{name,['Address'],'http://www.example.com/IPO'}},
+ {schema_element,{name,['Address'],'http://www.example.com/IPO'},
+ [{simpleType,{string,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['Address'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{complexType,{'_xmerl_no_name_',[anonymous,zip,'RegionsType'],
+ 'http://www.w3.org/2001/XMLSchema'}},
+ {schema_complex_type,{'_xmerl_no_name_',
+ [anonymous,zip,'RegionsType'],
+ 'http://www.w3.org/2001/XMLSchema'},
+ undefined,
+ false,
+ [anonymous,zip,'RegionsType'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [{attribute,{code,
+ [anonymous,zip,'RegionsType'],
+ 'http://www.example.com/Report'}}],
+ [{sequence,{[{element,
+ {{part,
+ [anonymous,zip,'RegionsType'],
+ 'http://www.example.com/Report'},
+ {1,unbounded}}}],
+ {1,1}}}],
+ undefined}},
+ {{complexType,{'UKAddress',[],'http://www.example.com/IPO'}},
+ {schema_complex_type,{'UKAddress',[],'http://www.example.com/IPO'},
+ undefined,
+ false,
+ ['UKAddress'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [{attribute,{exportCode,
+ ['UKAddress'],
+ 'http://www.example.com/IPO'}}],
+ [{extension,{{'Address',
+ [],
+ 'http://www.example.com/IPO'},
+ [{sequence,
+ {[{element,
+ {{postcode,
+ ['UKAddress'],
+ 'http://www.example.com/IPO'},
+ {1,1}}}],
+ {1,1}}}]}}],
+ undefined}}]
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/report.tab2 b/lib/xmerl/test/xmerl_xsd_SUITE_data/report.tab2
new file mode 100644
index 0000000000..f5c10e2683
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/report.tab2
@@ -0,0 +1,850 @@
+[{{complexType,{'RegionsType',[],'http://www.example.com/Report'}},
+ {schema_complex_type,{'RegionsType',[],'http://www.example.com/Report'},
+ undefined,
+ false,
+ ['RegionsType'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [],
+ [{sequence,{[{element,
+ {{zip,
+ ['RegionsType'],
+ 'http://www.example.com/Report'},
+ {1,unbounded}}}],
+ {1,1}}}],
+ undefined}},
+ {{complexType,{'PurchaseOrderType',[],'http://www.example.com/IPO'}},
+ {schema_complex_type,{'PurchaseOrderType',[],'http://www.example.com/IPO'},
+ undefined,
+ false,
+ ['PurchaseOrderType'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [{attribute,{orderDate,
+ ['PurchaseOrderType'],
+ 'http://www.example.com/IPO'}}],
+ [{sequence,{[{element,
+ {{shipTo,
+ ['PurchaseOrderType'],
+ 'http://www.example.com/IPO'},
+ {1,1}}},
+ {element,
+ {{billTo,
+ ['PurchaseOrderType'],
+ 'http://www.example.com/IPO'},
+ {1,1}}},
+ {element,
+ {{comment,
+ [],
+ 'http://www.example.com/IPO'},
+ {0,1}}},
+ {element,
+ {{items,
+ ['PurchaseOrderType'],
+ 'http://www.example.com/IPO'},
+ {1,1}}}],
+ {1,1}}}],
+ undefined}},
+ {{element,{parts,[anonymous,purchaseReport],'http://www.example.com/Report'}},
+ {schema_element,{parts,[anonymous,purchaseReport],
+ 'http://www.example.com/Report'},
+ [{simple_or_complex_Type,
+ {'PartsType',[],'http://www.example.com/Report'}}],
+ false,
+ undefined,
+ [],
+ [anonymous,purchaseReport],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{item,['Items'],'http://www.example.com/IPO'}},
+ {schema_element,{item,['Items'],'http://www.example.com/IPO'},
+ [{complexType,{'_xmerl_no_name_',
+ [anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['Items'],
+ undefined,
+ {0,unbounded},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{part,[anonymous,zip,'RegionsType'],
+ 'http://www.example.com/Report'}},
+ {schema_element,{part,[anonymous,zip,'RegionsType'],
+ 'http://www.example.com/Report'},
+ [{complexType,{'_xmerl_no_name_',
+ [anonymous,
+ part,
+ anonymous,
+ zip,
+ 'RegionsType'],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ [anonymous,zip,'RegionsType'],
+ undefined,
+ {1,unbounded},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{attribute,{orderDate,['PurchaseOrderType'],'http://www.example.com/IPO'}},
+ {schema_attribute,{orderDate,['PurchaseOrderType'],
+ 'http://www.example.com/IPO'},
+ [{simpleType,{date,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ ['PurchaseOrderType'],
+ optional,
+ undefined,
+ undefined,
+ undefined}},
+ {{attribute,{number,[anonymous,part,anonymous,zip,'RegionsType'],
+ 'http://www.example.com/Report'}},
+ {schema_attribute,{number,[anonymous,part,anonymous,zip,'RegionsType'],
+ 'http://www.example.com/Report'},
+ [{simpleType,{'SKU',[],'http://www.example.com/IPO'}}],
+ false,
+ [anonymous,part,anonymous,zip,'RegionsType'],
+ optional,
+ undefined,
+ undefined,
+ undefined}},
+ {{simpleType,{'USState',[],'http://www.example.com/IPO'}},
+ {schema_simple_type,{'USState',[],'http://www.example.com/IPO'},
+ [],
+ {string,[],'http://www.w3.org/2001/XMLSchema'},
+ false,
+ [],
+ [{enumeration,["AK","AL","AR","PA"]}],
+ atomic,
+ [{restriction,{{string,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'},
+ [{enumeration,"AK"},
+ {enumeration,"AL"},
+ {enumeration,"AR"},
+ {enumeration,"PA"}]}}]}},
+ {{complexType,{'PartsType',[],'http://www.example.com/Report'}},
+ {schema_complex_type,{'PartsType',[],'http://www.example.com/Report'},
+ undefined,
+ false,
+ ['PartsType'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [],
+ [{sequence,{[{element,
+ {{part,
+ ['PartsType'],
+ 'http://www.example.com/Report'},
+ {1,unbounded}}}],
+ {1,1}}}],
+ undefined}},
+ {{attribute,{partNum,[anonymous,item,'Items'],'http://www.example.com/IPO'}},
+ {schema_attribute,{partNum,[anonymous,item,'Items'],
+ 'http://www.example.com/IPO'},
+ [{simpleType,{'SKU',[],'http://www.example.com/IPO'}}],
+ false,
+ [anonymous,item,'Items'],
+ required,
+ undefined,
+ undefined,
+ undefined}},
+ {{element,{shipTo,['PurchaseOrderType'],'http://www.example.com/IPO'}},
+ {schema_element,{shipTo,['PurchaseOrderType'],'http://www.example.com/IPO'},
+ [{simple_or_complex_Type,
+ {'Address',[],'http://www.example.com/IPO'}}],
+ false,
+ undefined,
+ [],
+ ['PurchaseOrderType'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{complexType,{'_xmerl_no_name_',[anonymous,purchaseReport],
+ 'http://www.w3.org/2001/XMLSchema'}},
+ {schema_complex_type,{'_xmerl_no_name_',
+ [anonymous,purchaseReport],
+ 'http://www.w3.org/2001/XMLSchema'},
+ undefined,
+ false,
+ [anonymous,purchaseReport],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [{attribute,{period,
+ [anonymous,purchaseReport],
+ 'http://www.example.com/Report'}},
+ {attribute,{periodEnding,
+ [anonymous,purchaseReport],
+ 'http://www.example.com/Report'}}],
+ [{sequence,{[{element,
+ {{regions,
+ [anonymous,purchaseReport],
+ 'http://www.example.com/Report'},
+ {1,1}}},
+ {element,
+ {{parts,
+ [anonymous,purchaseReport],
+ 'http://www.example.com/Report'},
+ {1,1}}}],
+ {1,1}}}],
+ undefined}},
+ {{simpleType,{'SKU',[],'http://www.example.com/IPO'}},
+ {schema_simple_type,{'SKU',[],'http://www.example.com/IPO'},
+ [],
+ {string,[],'http://www.w3.org/2001/XMLSchema'},
+ false,
+ [],
+ [{pattern,"\\d{3}-[A-Z]{2}"}],
+ atomic,
+ [{restriction,{{string,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'},
+ [{pattern,"\\d{3}-[A-Z]{2}"}]}}]}},
+ {{attribute,{number,[anonymous,part,'PartsType'],
+ 'http://www.example.com/Report'}},
+ {schema_attribute,{number,[anonymous,part,'PartsType'],
+ 'http://www.example.com/Report'},
+ [{simpleType,{'SKU',[],'http://www.example.com/IPO'}}],
+ false,
+ [anonymous,part,'PartsType'],
+ optional,
+ undefined,
+ undefined,
+ undefined}},
+ {{attribute,{period,[anonymous,purchaseReport],
+ 'http://www.example.com/Report'}},
+ {schema_attribute,{period,[anonymous,purchaseReport],
+ 'http://www.example.com/Report'},
+ [{simpleType,{duration,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ [anonymous,purchaseReport],
+ optional,
+ undefined,
+ undefined,
+ undefined}},
+ {{simpleType,{'_xmerl_no_name_',[quantity,anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'}},
+ {schema_simple_type,{'_xmerl_no_name_',
+ [quantity,anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'},
+ [quantity,anonymous,item,'Items'],
+ {positiveInteger,[],'http://www.w3.org/2001/XMLSchema'},
+ false,
+ [],
+ [{maxExclusive,"100"}],
+ atomic,
+ [{restriction,{{positiveInteger,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'},
+ [{maxExclusive,"100"}]}}]}},
+ {{element,{productName,[anonymous,item,'Items'],'http://www.example.com/IPO'}},
+ {schema_element,{productName,[anonymous,item,'Items'],
+ 'http://www.example.com/IPO'},
+ [{simpleType,{string,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ [anonymous,item,'Items'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{comment,[],'http://www.example.com/IPO'}},
+ {schema_element,{comment,[],'http://www.example.com/IPO'},
+ [{simpleType,{string,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ [],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{attribute,{periodEnding,[anonymous,purchaseReport],
+ 'http://www.example.com/Report'}},
+ {schema_attribute,{periodEnding,[anonymous,purchaseReport],
+ 'http://www.example.com/Report'},
+ [{simpleType,{date,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ [anonymous,purchaseReport],
+ optional,
+ undefined,
+ undefined,
+ undefined}},
+ {{complexType,{'Address',[],'http://www.example.com/IPO'}},
+ {schema_complex_type,{'Address',[],'http://www.example.com/IPO'},
+ undefined,
+ false,
+ ['Address'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [],
+ [{sequence,{[{element,
+ {{name,
+ ['Address'],
+ 'http://www.example.com/IPO'},
+ {1,1}}},
+ {element,
+ {{street,
+ ['Address'],
+ 'http://www.example.com/IPO'},
+ {1,1}}},
+ {element,
+ {{city,
+ ['Address'],
+ 'http://www.example.com/IPO'},
+ {1,1}}}],
+ {1,1}}}],
+ undefined}},
+ {{element,{purchaseOrder,[],'http://www.example.com/IPO'}},
+ {schema_element,{purchaseOrder,[],'http://www.example.com/IPO'},
+ [{simple_or_complex_Type,
+ {'PurchaseOrderType',[],'http://www.example.com/IPO'}}],
+ false,
+ undefined,
+ [],
+ [],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{complexType,{'_xmerl_no_name_',[anonymous,part,'PartsType'],
+ 'http://www.w3.org/2001/XMLSchema'}},
+ {schema_complex_type,{'_xmerl_no_name_',
+ [anonymous,part,'PartsType'],
+ 'http://www.w3.org/2001/XMLSchema'},
+ undefined,
+ false,
+ [anonymous,part,'PartsType'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [{attribute,{number,
+ [anonymous,part,'PartsType'],
+ 'http://www.example.com/Report'}}],
+ [{extension,{{string,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'},
+ []}}],
+ undefined}},
+ {{element,{zip,['RegionsType'],'http://www.example.com/Report'}},
+ {schema_element,{zip,['RegionsType'],'http://www.example.com/Report'},
+ [{complexType,{'_xmerl_no_name_',
+ [anonymous,zip,'RegionsType'],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['RegionsType'],
+ undefined,
+ {1,unbounded},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{state,['USAddress'],'http://www.example.com/IPO'}},
+ {schema_element,{state,['USAddress'],'http://www.example.com/IPO'},
+ [{simple_or_complex_Type,
+ {'USState',[],'http://www.example.com/IPO'}}],
+ false,
+ undefined,
+ [],
+ ['USAddress'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{items,['PurchaseOrderType'],'http://www.example.com/IPO'}},
+ {schema_element,{items,['PurchaseOrderType'],'http://www.example.com/IPO'},
+ [{simple_or_complex_Type,
+ {'Items',[],'http://www.example.com/IPO'}}],
+ false,
+ undefined,
+ [],
+ ['PurchaseOrderType'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{simpleType,{'UKPostcode',[],'http://www.example.com/IPO'}},
+ {schema_simple_type,{'UKPostcode',[],'http://www.example.com/IPO'},
+ [],
+ {'Postcode',[],'http://www.example.com/IPO'},
+ false,
+ [],
+ [{pattern,"[A-Z]{2}\\d\\s\\d[A-Z]{2}"}],
+ atomic,
+ [{restriction,{{'Postcode',
+ [],
+ 'http://www.example.com/IPO'},
+ [{pattern,"[A-Z]{2}\\d\\s\\d[A-Z]{2}"}]}}]}},
+ {{complexType,{'Items',[],'http://www.example.com/IPO'}},
+ {schema_complex_type,{'Items',[],'http://www.example.com/IPO'},
+ undefined,
+ false,
+ ['Items'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [],
+ [{sequence,{[{element,
+ {{item,
+ ['Items'],
+ 'http://www.example.com/IPO'},
+ {0,unbounded}}}],
+ {1,1}}}],
+ undefined}},
+ {{element,{quantity,[anonymous,item,'Items'],'http://www.example.com/IPO'}},
+ {schema_element,{quantity,[anonymous,item,'Items'],
+ 'http://www.example.com/IPO'},
+ [{simpleType,{'_xmerl_no_name_',
+ [quantity,anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ [anonymous,item,'Items'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{attribute,{code,[anonymous,zip,'RegionsType'],
+ 'http://www.example.com/Report'}},
+ {schema_attribute,{code,[anonymous,zip,'RegionsType'],
+ 'http://www.example.com/Report'},
+ [{simpleType,{positiveInteger,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ [anonymous,zip,'RegionsType'],
+ optional,
+ undefined,
+ undefined,
+ undefined}},
+ {{element,{purchaseReport,[],'http://www.example.com/Report'}},
+ {schema_element,{purchaseReport,[],'http://www.example.com/Report'},
+ [{complexType,{'_xmerl_no_name_',
+ [anonymous,purchaseReport],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [{unique,{unique,{dummy1,
+ [purchaseReport],
+ 'http://www.example.com/Report'},
+ {selector,"r:regions/r:zip"},
+ [{field,"@code"}]}}],
+ [],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{street,['Address'],'http://www.example.com/IPO'}},
+ {schema_element,{street,['Address'],'http://www.example.com/IPO'},
+ [{simpleType,{string,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['Address'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{zip,['USAddress'],'http://www.example.com/IPO'}},
+ {schema_element,{zip,['USAddress'],'http://www.example.com/IPO'},
+ [{simpleType,{positiveInteger,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['USAddress'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{regions,[anonymous,purchaseReport],
+ 'http://www.example.com/Report'}},
+ {schema_element,{regions,[anonymous,purchaseReport],
+ 'http://www.example.com/Report'},
+ [{simple_or_complex_Type,
+ {'RegionsType',[],'http://www.example.com/Report'}}],
+ false,
+ undefined,
+ [],
+ [anonymous,purchaseReport],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{part,['PartsType'],'http://www.example.com/Report'}},
+ {schema_element,{part,['PartsType'],'http://www.example.com/Report'},
+ [{complexType,{'_xmerl_no_name_',
+ [anonymous,part,'PartsType'],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['PartsType'],
+ undefined,
+ {1,unbounded},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{city,['Address'],'http://www.example.com/IPO'}},
+ {schema_element,{city,['Address'],'http://www.example.com/IPO'},
+ [{simpleType,{string,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['Address'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{complexType,{'USAddress',[],'http://www.example.com/IPO'}},
+ {schema_complex_type,{'USAddress',[],'http://www.example.com/IPO'},
+ undefined,
+ false,
+ ['USAddress'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [],
+ [{extension,{{'Address',
+ [],
+ 'http://www.example.com/IPO'},
+ [{sequence,
+ {[{element,
+ {{state,
+ ['USAddress'],
+ 'http://www.example.com/IPO'},
+ {1,1}}},
+ {element,
+ {{zip,
+ ['USAddress'],
+ 'http://www.example.com/IPO'},
+ {1,1}}}],
+ {1,1}}}]}}],
+ undefined}},
+ {{complexType,{'_xmerl_no_name_',[anonymous,part,anonymous,zip,'RegionsType'],
+ 'http://www.w3.org/2001/XMLSchema'}},
+ {schema_complex_type,{'_xmerl_no_name_',
+ [anonymous,part,anonymous,zip,'RegionsType'],
+ 'http://www.w3.org/2001/XMLSchema'},
+ undefined,
+ false,
+ [anonymous,part,anonymous,zip,'RegionsType'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [{attribute,{number,
+ [anonymous,
+ part,
+ anonymous,
+ zip,
+ 'RegionsType'],
+ 'http://www.example.com/Report'}},
+ {attribute,{quantity,
+ [anonymous,
+ part,
+ anonymous,
+ zip,
+ 'RegionsType'],
+ 'http://www.example.com/Report'}}],
+ [{restriction,{{anyType,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'},
+ []}}],
+ undefined}},
+ {{element,{billTo,['PurchaseOrderType'],'http://www.example.com/IPO'}},
+ {schema_element,{billTo,['PurchaseOrderType'],'http://www.example.com/IPO'},
+ [{simple_or_complex_Type,
+ {'Address',[],'http://www.example.com/IPO'}}],
+ false,
+ undefined,
+ [],
+ ['PurchaseOrderType'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{element,{postcode,['UKAddress'],'http://www.example.com/IPO'}},
+ {schema_element,{postcode,['UKAddress'],'http://www.example.com/IPO'},
+ [{simple_or_complex_Type,
+ {'UKPostcode',[],'http://www.example.com/IPO'}}],
+ false,
+ undefined,
+ [],
+ ['UKAddress'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{schema,"report.xsd"},
+ {schema,qualified,
+ unqualified,
+ 'http://www.example.com/Report',
+ [],
+ [],
+ [{element,{{purchaseReport,[],'http://www.example.com/Report'},
+ {1,1}}}]}},
+ {{complexType,{'_xmerl_no_name_',[anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'}},
+ {schema_complex_type,{'_xmerl_no_name_',
+ [anonymous,item,'Items'],
+ 'http://www.w3.org/2001/XMLSchema'},
+ undefined,
+ false,
+ [anonymous,item,'Items'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [{attribute,{partNum,
+ [anonymous,item,'Items'],
+ 'http://www.example.com/IPO'}}],
+ [{sequence,{[{element,
+ {{productName,
+ [anonymous,item,'Items'],
+ 'http://www.example.com/IPO'},
+ {1,1}}},
+ {element,
+ {{quantity,
+ [anonymous,item,'Items'],
+ 'http://www.example.com/IPO'},
+ {1,1}}},
+ {element,
+ {{'USPrice',
+ [anonymous,item,'Items'],
+ 'http://www.example.com/IPO'},
+ {1,1}}},
+ {element,
+ {{comment,
+ [],
+ 'http://www.example.com/IPO'},
+ {0,1}}},
+ {element,
+ {{shipDate,
+ [anonymous,item,'Items'],
+ 'http://www.example.com/IPO'},
+ {0,1}}}],
+ {1,1}}}],
+ undefined}},
+ {{simpleType,{'Postcode',[],'http://www.example.com/IPO'}},
+ {schema_simple_type,{'Postcode',[],'http://www.example.com/IPO'},
+ [],
+ {string,[],'http://www.w3.org/2001/XMLSchema'},
+ false,
+ [],
+ [{length,"7"}],
+ atomic,
+ [{restriction,{{string,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'},
+ [{length,"7"}]}}]}},
+ {{element,{'USPrice',[anonymous,item,'Items'],'http://www.example.com/IPO'}},
+ {schema_element,{'USPrice',[anonymous,item,'Items'],
+ 'http://www.example.com/IPO'},
+ [{simpleType,{decimal,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ [anonymous,item,'Items'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{schema,"ipo.xsd"},
+ {schema,unqualified,
+ unqualified,
+ 'http://www.example.com/IPO',
+ [],
+ [],
+ [{element,{{purchaseOrder,[],'http://www.example.com/IPO'},{1,1}}},
+ {element,{{comment,[],'http://www.example.com/IPO'},{1,1}}}]}},
+ {{attribute,{quantity,[anonymous,part,anonymous,zip,'RegionsType'],
+ 'http://www.example.com/Report'}},
+ {schema_attribute,{quantity,[anonymous,part,anonymous,zip,'RegionsType'],
+ 'http://www.example.com/Report'},
+ [{simpleType,{positiveInteger,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ [anonymous,part,anonymous,zip,'RegionsType'],
+ optional,
+ undefined,
+ undefined,
+ undefined}},
+ {{element,{shipDate,[anonymous,item,'Items'],'http://www.example.com/IPO'}},
+ {schema_element,{shipDate,[anonymous,item,'Items'],
+ 'http://www.example.com/IPO'},
+ [{simpleType,{date,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ [anonymous,item,'Items'],
+ undefined,
+ {0,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{attribute,{exportCode,['UKAddress'],'http://www.example.com/IPO'}},
+ {schema_attribute,{exportCode,['UKAddress'],'http://www.example.com/IPO'},
+ [{simpleType,{positiveInteger,
+ [],
+ 'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ ['UKAddress'],
+ optional,
+ undefined,
+ "1",
+ undefined}},
+ {{element,{name,['Address'],'http://www.example.com/IPO'}},
+ {schema_element,{name,['Address'],'http://www.example.com/IPO'},
+ [{simpleType,{string,[],'http://www.w3.org/2001/XMLSchema'}}],
+ false,
+ undefined,
+ [],
+ ['Address'],
+ undefined,
+ {1,1},
+ undefined,
+ undefined,
+ false,
+ [],
+ []}},
+ {{complexType,{'_xmerl_no_name_',[anonymous,zip,'RegionsType'],
+ 'http://www.w3.org/2001/XMLSchema'}},
+ {schema_complex_type,{'_xmerl_no_name_',
+ [anonymous,zip,'RegionsType'],
+ 'http://www.w3.org/2001/XMLSchema'},
+ undefined,
+ false,
+ [anonymous,zip,'RegionsType'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [{attribute,{code,
+ [anonymous,zip,'RegionsType'],
+ 'http://www.example.com/Report'}}],
+ [{sequence,{[{element,
+ {{part,
+ [anonymous,zip,'RegionsType'],
+ 'http://www.example.com/Report'},
+ {1,unbounded}}}],
+ {1,1}}}],
+ undefined}},
+ {{complexType,{'UKAddress',[],'http://www.example.com/IPO'}},
+ {schema_complex_type,{'UKAddress',[],'http://www.example.com/IPO'},
+ undefined,
+ false,
+ ['UKAddress'],
+ undefined,
+ [],
+ [],
+ false,
+ 'element-only',
+ [{attribute,{exportCode,
+ ['UKAddress'],
+ 'http://www.example.com/IPO'}}],
+ [{extension,{{'Address',
+ [],
+ 'http://www.example.com/IPO'},
+ [{sequence,
+ {[{element,
+ {{postcode,
+ ['UKAddress'],
+ 'http://www.example.com/IPO'},
+ {1,1}}}],
+ {1,1}}}]}}],
+ undefined}}]
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/report.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/report.xsd
new file mode 100644
index 0000000000..8db7b8219f
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/report.xsd
@@ -0,0 +1,82 @@
+<schema targetNamespace="http://www.example.com/Report"
+ xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:r="http://www.example.com/Report"
+ xmlns:xipo="http://www.example.com/IPO"
+ elementFormDefault="qualified">
+
+ <!-- for SKU -->
+ <import namespace="http://www.example.com/IPO"/>
+
+ <annotation>
+ <documentation xml:lang="en">
+ Report schema for Example.com
+ Copyright 2000 Example.com. All rights reserved.
+ </documentation>
+ </annotation>
+
+ <element name="purchaseReport">
+ <complexType>
+ <sequence>
+ <element name="regions" type="r:RegionsType"/>
+
+ <element name="parts" type="r:PartsType"/>
+ </sequence>
+ <attribute name="period" type="duration"/>
+ <attribute name="periodEnding" type="date"/>
+ </complexType>
+
+ <unique name="dummy1">
+ <selector xpath="r:regions/r:zip"/>
+ <field xpath="@code"/>
+ </unique>
+
+ <key name="pNumKey">
+ <selector xpath="r:parts/r:part"/>
+ <field xpath="@number"/>
+ </key>
+
+ <keyref name="dummy2" refer="r:pNumKey">
+ <selector xpath="r:regions/r:zip/r:part"/>
+ <field xpath="@number"/>
+ </keyref>
+
+ </element>
+
+ <complexType name="RegionsType">
+ <sequence>
+ <element name="zip" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="part" maxOccurs="unbounded">
+ <complexType>
+ <complexContent>
+ <restriction base="anyType">
+ <attribute name="number" type="xipo:SKU"/>
+ <attribute name="quantity" type="positiveInteger"/>
+ </restriction>
+ </complexContent>
+ </complexType>
+ </element>
+ </sequence>
+ <attribute name="code" type="positiveInteger"/>
+ </complexType>
+ </element>
+ </sequence>
+ </complexType>
+
+ <complexType name="PartsType">
+ <sequence>
+ <element name="part" maxOccurs="unbounded">
+ <complexType>
+ <simpleContent>
+ <extension base="string">
+ <attribute name="number" type="xipo:SKU"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+ </element>
+ </sequence>
+ </complexType>
+
+</schema>
+
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/report2.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/report2.xsd
new file mode 100644
index 0000000000..a114cad4f2
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/report2.xsd
@@ -0,0 +1,82 @@
+<schema targetNamespace="http://www.example.com/Report"
+ xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:r="http://www.example.com/Report"
+ xmlns:xipo="http://www.example.com/IPO"
+ elementFormDefault="qualified">
+
+ <!-- for SKU -->
+ <import namespace="http://www.example.com/IPO" schemaLocation="ipo.xsd"/>
+
+ <annotation>
+ <documentation xml:lang="en">
+ Report schema for Example.com
+ Copyright 2000 Example.com. All rights reserved.
+ </documentation>
+ </annotation>
+
+ <element name="purchaseReport">
+ <complexType>
+ <sequence>
+ <element name="regions" type="r:RegionsType"/>
+
+ <element name="parts" type="r:PartsType"/>
+ </sequence>
+ <attribute name="period" type="duration"/>
+ <attribute name="periodEnding" type="date"/>
+ </complexType>
+
+ <unique name="dummy1">
+ <selector xpath="r:regions/r:zip"/>
+ <field xpath="@code"/>
+ </unique>
+
+ <key name="pNumKey">
+ <selector xpath="r:parts/r:part"/>
+ <field xpath="@number"/>
+ </key>
+
+ <keyref name="dummy2" refer="r:pNumKey">
+ <selector xpath="r:regions/r:zip/r:part"/>
+ <field xpath="@number"/>
+ </keyref>
+
+ </element>
+
+ <complexType name="RegionsType">
+ <sequence>
+ <element name="zip" maxOccurs="unbounded">
+ <complexType>
+ <sequence>
+ <element name="part" maxOccurs="unbounded">
+ <complexType>
+ <complexContent>
+ <restriction base="anyType">
+ <attribute name="number" type="xipo:SKU"/>
+ <attribute name="quantity" type="positiveInteger"/>
+ </restriction>
+ </complexContent>
+ </complexType>
+ </element>
+ </sequence>
+ <attribute name="code" type="positiveInteger"/>
+ </complexType>
+ </element>
+ </sequence>
+ </complexType>
+
+ <complexType name="PartsType">
+ <sequence>
+ <element name="part" maxOccurs="unbounded">
+ <complexType>
+ <simpleContent>
+ <extension base="string">
+ <attribute name="number" type="xipo:SKU"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+ </element>
+ </sequence>
+ </complexType>
+
+</schema>
+
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/simple_int.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/simple_int.xsd
new file mode 100644
index 0000000000..12f98421dc
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/simple_int.xsd
@@ -0,0 +1,13 @@
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+ <xsd:annotation>
+ <xsd:documentation xml:lang="en">
+ Purchase order schema for Example.com.
+ Copyright 2000 Example.com. All rights reserved.
+ </xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:element name="purchaseOrder" type="xsd:int"/>
+
+ <xsd:element name="comment" type="xsd:string"/>
+</xsd:schema>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/IntegratedSite.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/IntegratedSite.xsd
new file mode 100644
index 0000000000..e211b313c2
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/IntegratedSite.xsd
@@ -0,0 +1,5238 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ericsson.com/is/isco/IntegratedSite" xmlns="http://www.ericsson.com/is/isco/IntegratedSite" xmlns:nc="http://www.ericsson.com/is/isco/nc" xmlns:IsTypes="http://www.ericsson.com/is/isco/IsTypes" xmlns:MainSwitch="http://www.ericsson.com/is/isco/MainSwitch_1" xmlns:MyBsModel="http://www.ericsson.com/is/isco/MyBsModel_1">
+ <xsd:annotation>
+ <xsd:appinfo>
+ <mim file="bs_mim.xml" version=""/>
+ <mim file="cpd_mim.xml" version=""/>
+ <mim file="hwm_mim.xml" version=""/>
+ <mim file="swm_mim.xml" version=""/>
+ <mim file="top_mim.xml" version=""/>
+ </xsd:appinfo>
+ </xsd:annotation>
+ <xsd:import schemaLocation="nc.xsd" namespace="http://www.ericsson.com/is/isco/nc"/>
+ <xsd:import schemaLocation="IsTypes.xsd" namespace="http://www.ericsson.com/is/isco/IsTypes"/>
+ <xsd:import schemaLocation="MainSwitch_1.xsd" namespace="http://www.ericsson.com/is/isco/MainSwitch_1"/>
+ <xsd:import schemaLocation="MyBsModel_1.xsd" namespace="http://www.ericsson.com/is/isco/MyBsModel_1"/>
+ <xsd:complexType name="JobData">
+ <xsd:annotation>
+ <xsd:documentation>
+ Data to specify a jobs progress, status etc during its execution.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="jobDateOrdered">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType0">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="jobStatus" type="JobStatus"/>
+ <xsd:element name="jobResult" type="JobResult"/>
+ <xsd:element name="jobInfo">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="jobProgress" type="Unsigned32"/>
+ <xsd:element name="jobLaststep" type="Unsigned32"/>
+ <xsd:element name="jobProgressReport">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ <xsd:complexType name="BladeUgSpecification">
+ <xsd:annotation>
+ <xsd:documentation>
+ Specification of a blade when an upgrade job is ordered for a
+ specific blade. This data always belongs to and is included in
+ an upgrade job for a blade system.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="ixBladeSubrack" type="Unsigned32"/>
+ <xsd:element name="ixBladeSlot" type="Unsigned32"/>
+ <xsd:element name="bladeSwgProdnr">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="bladeSwgVersion">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ <xsd:complexType name="FTPData">
+ <xsd:annotation>
+ <xsd:documentation>
+ Data to specify FTP server info, such as host, user,
+ password and path, to locate correct files or destination
+ for files.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="host">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="user">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="password">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="path">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ <xsd:complexType name="HwmKnockOutType">
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType3">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="HwmOperationalStateType">
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType4">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="SwgStatus">
+ <xsd:annotation>
+ <xsd:documentation>
+ Indicates status of software groups. A software group is
+ complete if all included load module containers have been
+ downloaded and unpacked correctly. A software group is inconsistent
+ if the checksums of the load module containers do not match the
+ information in the system information CXP, or if the XML
+ data could not be registered.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType5">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="HwmBusTypeType">
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType6">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="Unsigned32">
+ <xsd:annotation>
+ <xsd:documentation>
+ Datatype for an integer according to SNMPv2 definition of
+ unsigned32.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType7">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="JobResult">
+ <xsd:annotation>
+ <xsd:documentation>
+ Possible results of an action for a job.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType8">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="HwmAdministrativeStateType">
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType9">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="ContainerType">
+ <xsd:annotation>
+ <xsd:documentation>
+ Type of a load module container.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType10">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="MatchStrategy">
+ <xsd:annotation>
+ <xsd:documentation>
+ Interpretation of given filename and path.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType11">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="DownloadStrategy">
+ <xsd:annotation>
+ <xsd:documentation>
+ Interpretation according to existing files.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType12">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="JobStatus">
+ <xsd:annotation>
+ <xsd:documentation>
+ Indicator of job status.
+ A job should be started immediately, but could be postponed
+ if the total load on the system would become too high.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType13">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="HwmAvailabilityStatusType">
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType14">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="HwmSlotStateType">
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType15">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:element name="model">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Is" minOccurs="0" maxOccurs="1">
+ <xsd:annotation>
+ <xsd:documentation>
+ The top class - the forefather of all classes.
+
+ Key attributes: []
+
+ Possible children:
+ Hardware
+ Software
+ NetworkConfiguration
+ BladeSystems
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Hardware" minOccurs="0" maxOccurs="1">
+ <xsd:annotation>
+ <xsd:documentation>
+ Functional area Hardware Management
+
+ Key attributes: []
+
+ Possible children:
+ BladeType
+ Subrack
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="BladeType" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ This class describes a Blade.
+
+ Key attributes: [key]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="key">
+ <xsd:annotation>
+ <xsd:documentation>
+ The blade type number like CNA12801
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ The name of the Blade Type.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="width">
+ <xsd:annotation>
+ <xsd:documentation>
+ The width of the blade in number of slots.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="oneGLinks">
+ <xsd:annotation>
+ <xsd:documentation>
+ The 1G links used by the blade type , like 0,1, counted from
+ the leftmost backplane position.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="linkAggregates">
+ <xsd:annotation>
+ <xsd:documentation>
+ The 1G links used for link aggregation by the blade type , like 0-1,
+ counted from the leftmost backplane position.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="hasHwData">
+ <xsd:annotation>
+ <xsd:documentation>
+ True if possible to read product info via the maintenance bus.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isMxb">
+ <xsd:annotation>
+ <xsd:documentation>
+ True if this is a Main Switch blade type.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="availOneGSlots">
+ <xsd:annotation>
+ <xsd:documentation>
+ Only valid for main switch blades. A list of slots that have 1G link.
+ Could be a single slot or a range or a combination thereof.
+ E.g. 1-24, or 1,3-13,15-24.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="aggregateRanges">
+ <xsd:annotation>
+ <xsd:documentation>
+ Only valid for main switch blades. Specifies which slots can be used
+ for link aggregation. Ranges are specified in the form 1-12,13-24.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Subrack" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ This class describes the subrack.
+
+ Key attributes: [id]
+
+ Possible children:
+ Slot
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="id">
+ <xsd:annotation>
+ <xsd:documentation>
+ Identifies a certain subrack.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType16">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="type">
+ <xsd:annotation>
+ <xsd:documentation>
+ The type of subrack.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="userLabel">
+ <xsd:annotation>
+ <xsd:documentation>
+ A user friendly Subrack name.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="position">
+ <xsd:annotation>
+ <xsd:documentation>
+ The subrack position in the cabinet.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="cabinetPosition">
+ <xsd:annotation>
+ <xsd:documentation>
+ The cabinet position in the site.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="location">
+ <xsd:annotation>
+ <xsd:documentation>
+ The site location, e.g. the visiting address.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="availableOneGSlots">
+ <xsd:annotation>
+ <xsd:documentation>
+ Available slots for 1G switch links. Information taken from the type
+ of main switch blade that is created in the subrack.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="availableTenGSlots">
+ <xsd:annotation>
+ <xsd:documentation>
+ Available slots for 10G switch links. Information taken from the type
+ of main switch blade that is created in the subrack.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="aggregateSlots">
+ <xsd:annotation>
+ <xsd:documentation>
+ Links ranges for (1G) link aggregation. Information taken from the
+ type of main switch blade that is created in the subrack.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Slot" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ This table corresponds to slots, there is one row in the table
+ for each slot. The slots are grouped per subrack. A slot is
+ identified by subrack Id and slot number). The subrack Id for a slot
+ identifies in the subrackTable the subrack that the slot belongs
+ to.
+
+ Key attributes: [number]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="number">
+ <xsd:annotation>
+ <xsd:documentation>
+ The value of this object identifies the
+ slot position within the subrack.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType17">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="state" type="HwmSlotStateType">
+ <xsd:annotation>
+ <xsd:documentation>
+ See HwmSlotStateType description.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="bladeSystem">
+ <xsd:annotation>
+ <xsd:documentation>
+ The value of this object identifies the Blade System that uses this
+ slot. An instances of this object will only have meaning in a
+ conceptual row if the value of hemSlotState instance is either
+ usedOccupied or usedEmpty in the same conceptual row,
+ i.e. there is an Blade System created using this slot. (If
+ no Blade System is using the slot, the value will be -1.)
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Software" minOccurs="0" maxOccurs="1">
+ <xsd:annotation>
+ <xsd:documentation>
+ Top class of structure for SWM MOM.
+
+ Key attributes: []
+
+ Possible children:
+ Inventory
+ Jobs
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Inventory" minOccurs="0" maxOccurs="1">
+ <xsd:annotation>
+ <xsd:documentation>
+ Subclass to top class Software. Parent of
+ Inventory classes:
+ SoftwareDeliveryPackage,
+ SoftwareGroup,
+ LocalBackup,
+ Alarm.
+ Inventory actions:
+ DownloadFile
+ ImportBackup
+ Only system created data for info and overview,
+ sometimes as a result of an action called by the
+ operator.
+
+ Key attributes: []
+
+ Possible children:
+ Alarm
+ LocalBackup
+ SoftwareDeliveryPackage
+ SoftwareGroup
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Alarm" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ MO of all alarms logged in the system that has not been
+ taken care of in a satisfactory way.
+
+ Key attributes: [alarmId]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="alarmId" type="Unsigned32"/>
+ <xsd:element minOccurs="0" name="faultyBladeSystem">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="faultCause">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="faultInfo">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="LocalBackup" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ All available backups locally stored.
+
+ Key attributes: [localBackupId]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="localBackupId" type="Unsigned32"/>
+ <xsd:element minOccurs="0" name="name">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="bladeSystem">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="date">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType0">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="size" type="Unsigned32"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="SoftwareDeliveryPackage" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ MO for info about LoadModuleContainers, ie CXPs.
+
+ Key attributes: [ixProdNr,ixVersion]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="ixProdNr">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="ixVersion">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="name">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="type" type="ContainerType"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="SoftwareGroup" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ This class reference to multiple MOs of class
+ SoftwareDeliveryPackage, ie the relationship between
+ CXPs and CXS.
+
+ Key attributes: [ixProdnr,ixVersion]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="ixProdnr">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="ixVersion">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="name">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="systemProdNr">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="systemVersion">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="systemName">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="integratedSystemProdNr">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="integratedSystemVersion">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="integratedSystemName">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="relatedCXPs">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="item" minOccurs="0" maxOccurs="unbounded">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType18">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="status" type="SwgStatus"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Jobs" minOccurs="0" maxOccurs="1">
+ <xsd:annotation>
+ <xsd:documentation>
+ Subclass to top class Software. Parent of
+ Jobs classes:
+ DownloadFile,
+ Upgrade,
+ Backup.
+ System created data through ordered job actions.
+
+ Key attributes: []
+
+ Possible children:
+ Backup
+ DownloadFile
+ Upgrade
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Backup" minOccurs="0" maxOccurs="1">
+ <xsd:annotation>
+ <xsd:documentation>
+ Subclass to class Jobs. Parent of
+ Jobs classes:
+ Create,
+ Restore
+ Import,
+ Export.System created data through ordered backup job actions.
+
+ Key attributes: []
+
+ Possible children:
+ Create
+ Export
+ Import
+ Restore
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Create" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ This MO handles creation of backups of the system.
+
+ Key attributes: [backupJobId]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="backupJobId">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="jobData" type="JobData"/>
+ <xsd:element minOccurs="0" name="backupId" type="Unsigned32"/>
+ <xsd:element minOccurs="0" name="targetBladeSystem">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="backupName">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Export" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ This MO handles export of locally stored backup files to
+ the FTP server.
+
+ Key attributes: [exportJobId]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="exportJobId">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="jobData" type="JobData"/>
+ <xsd:element minOccurs="0" name="ftpData" type="FTPData"/>
+ <xsd:element minOccurs="0" name="backupId" type="Unsigned32"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Import" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ This MO handles import of backup files from the FTP server.
+ The backup file is stored locally, but not loaded into the system.
+
+ Key attributes: [importJobId]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="importJobId">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="jobData" type="JobData"/>
+ <xsd:element minOccurs="0" name="ftpData" type="FTPData"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Restore" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ This MO handles restore of backups of the system.
+
+ Key attributes: [restoreJobId]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="restoreJobId">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="jobData" type="JobData"/>
+ <xsd:element minOccurs="0" name="backupId" type="Unsigned32"/>
+ <xsd:element minOccurs="0" name="targetBladeSystem">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="backupName">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="DownloadFile" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ This MO contains information about requested, ongoing,
+ and completed software file download jobs. To start a
+ download job the operator calls an action Inventory class,
+ and a new instance of this MO is created.
+ For load regulating reasons a requested job may not start
+ immediately.
+
+ Key attributes: [downloadFileJobId]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="downloadFileJobId">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="jobData" type="JobData"/>
+ <xsd:element minOccurs="0" name="ftpData" type="FTPData"/>
+ <xsd:element minOccurs="0" name="matchStrategy" type="MatchStrategy"/>
+ <xsd:element minOccurs="0" name="downloadStrategy" type="DownloadStrategy"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Upgrade" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ This MO handles upgrade jobs towards the system. The operator
+ may specify a specific blade to run the upgrade on, instead of
+ running an upgrade on the entire blade system.
+
+ Key attributes: [upgradeJobId]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="upgradeJobId">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="jobData" type="JobData"/>
+ <xsd:element minOccurs="0" name="bladeSystem">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="selectedSwgProdNr">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="selectedSwgVersion">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="selectedCxrProdNr">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="selectedCxrVersion">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="MaxTime" type="Unsigned32">
+ <xsd:annotation>
+ <xsd:documentation>
+ The maximum time allowed for the SW Upgrade
+ job to finish. After this time, the job will be interrupted.
+ The value 0 means that MaxTime will be given the
+ timer value registered with the Blade System Software Group
+ Version. If no such value has been registered,
+ MaxTime will be given a system default timer value.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="bladeUgSpecification" type="BladeUgSpecification"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="NetworkConfiguration" minOccurs="0" maxOccurs="1">
+ <xsd:annotation>
+ <xsd:documentation>
+ The MO branch where the common Network resources are configured.
+
+ Key attributes: []
+
+ Possible children:
+ IsIpTrafficClass
+ IsLanTrafficClass
+ IsLogicalNetwork
+ IsVariables
+ IsVlan
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="IsIpTrafficClass" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ Key attributes: [name]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ Name if the IS IP Traffic Class.
+ Unique within the entire Integrated Site.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the IS IP Traffic Class.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="dscp">
+ <xsd:annotation>
+ <xsd:documentation>
+ DiffServ Code Point setting for this IS IP Traffic Class.
+ If there are two IS Ip Traffic Classes with the same DSCP, they
+ both must refer to an IS Lan Traffic Class with identical P-bit setting.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isLanTrafficClass">
+ <xsd:annotation>
+ <xsd:documentation>
+ Reference to a Managed Object of type ISLanTrafficClass.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType19">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="IsLanTrafficClass" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ An IS Lan Traffic Class may be shared between several Blade Systems.
+
+ Key attributes: [name]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ Name of the IS Lan Traffic Class.
+ Unique within the entire Integrated Site.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the IS Lan Traffic Class.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="pbits">
+ <xsd:annotation>
+ <xsd:documentation>
+ P-bit setting for this IS Lan Traffic Class.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType20">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="IsLogicalNetwork" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ An IS Logical Network contains one or more IS Subnets.
+ It may be shared between several Blade Systems.
+
+ Key attributes: [name]
+
+ Possible children:
+ IsSubnet
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ Name of the IS Logical Network.
+ Unique within the entire Integrated Site.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the IS logical network.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="IsSubnet" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ An IS Subnet contains one or more IS Subnet Segments.
+ It may be shared between several Blade Systems.
+
+ Key attributes: [name]
+
+ Possible children:
+ IsSubnetSegment
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ Name of the IS Subnet. Unique within the IS Logical Network.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the IS Subnet.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="address" type="IsTypes:IpAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ IP network address of the IS Subnet.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="mask">
+ <xsd:annotation>
+ <xsd:documentation>
+ Prefix length of the IP network address.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType21">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="broadcastAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ Broadcast address of the IS Subnet.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isVlanId">
+ <xsd:annotation>
+ <xsd:documentation>
+ Identity of an IS VLAN.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="IsSubnetSegment" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ An IS Subnet Segment may be shared between several Blade Systems.
+
+ Key attributes: [name]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ Name of the IS Subnet Segment. Unique within the IS Subnet.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the IS Subnet Segment.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="address" type="IsTypes:IpAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ IP network address of the IS Subnet Segment.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="mask">
+ <xsd:annotation>
+ <xsd:documentation>
+ Prefix length of the IP network address.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType21">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="routerAddress" type="IsTypes:IpAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ Router address for the IS Subnet.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="dhcpEnabled">
+ <xsd:annotation>
+ <xsd:documentation>
+ Flag that controls wheter DHCP should be enabled or not for this
+ IS Subnet Segment.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="IsVariables" minOccurs="0" maxOccurs="1">
+ <xsd:annotation>
+ <xsd:documentation>
+ Key attributes: []
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element minOccurs="0" name="updateMode">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType22">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="dataModelVersion">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="major">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="minor">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="rlspMarkerGenerateInterval">
+ <xsd:annotation>
+ <xsd:documentation>
+ The RLSP marker generate interval in microseconds.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType7">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="timezoneDstRule">
+ <xsd:annotation>
+ <xsd:documentation>
+ Daylight savings rule in posix standard format.
+ Better description to be supplied later........and a regular expression
+ which describes the valid string format.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="dnsDomain">
+ <xsd:annotation>
+ <xsd:documentation>
+ The dns domain used by IS in the DNS-server.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType23">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="notifyAfter">
+ <xsd:annotation>
+ <xsd:documentation>
+ Number of seconds from that a new network configuration has been
+ published until the Blade Systems will apply the changes.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="defaultDhcpLeaseTime">
+ <xsd:annotation>
+ <xsd:documentation>
+ The default DHCP Lease time in seconds.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="lifeTimeDhcpLeaseTime">
+ <xsd:annotation>
+ <xsd:documentation>
+ The lifetime of a DHCP lease in seconds.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="IsVlan" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ An IS Vlan may be shared between several Blade Systems.
+
+ Key attributes: [identity]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="identity">
+ <xsd:annotation>
+ <xsd:documentation>
+ Identity of the IS Vlan. Unique within the entire Integrated Site.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType24">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the IS Vlan.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BladeSystems" minOccurs="0" maxOccurs="1">
+ <xsd:annotation>
+ <xsd:documentation>
+ The BladeSystems mountpoint - parent of all blade systems.
+
+ Key attributes: []
+
+ Possible children:
+ BladeSystemTemplate
+ Mxb
+ MyBsModel
+ Sis
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Mxb" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ This class describes a Blade System. It will be cloned for each
+ new blade system type registered in the system. The new clone
+ will serve as a mountpoint for the blade system specific model.
+
+ Key attributes: [name]
+
+ Possible children:
+ Blade
+ BsIpTrafficClass
+ BsLanTrafficClass
+ BsLogicalNetwork
+ BsVlan
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ A user friendly Blade System name, must be set at creation and can be
+ changed when BS is locked.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="no">
+ <xsd:annotation>
+ <xsd:documentation>
+ An identifier for the BS. A new integer has to be used every time a new
+ BS is created. ??? Kvar ???
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="softwareGroupId">
+ <xsd:annotation>
+ <xsd:documentation>
+ The identity of the Software Group (SWG) that the BS implements.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="softwareGroupRevision">
+ <xsd:annotation>
+ <xsd:documentation>
+ The revision of the Software Group (SWG) that the BS implements.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="admState" type="HwmAdministrativeStateType">
+ <xsd:annotation>
+ <xsd:documentation>
+ The administrative state of the Blade System.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="opState" type="HwmOperationalStateType">
+ <xsd:annotation>
+ <xsd:documentation>
+ The operational state of the Blade System.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="availStatus" type="HwmAvailabilityStatusType">
+ <xsd:annotation>
+ <xsd:documentation>
+ The availability status of the Blade System.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="locked">
+ <xsd:annotation>
+ <xsd:documentation>
+ eller s�tta admState ????????????
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the Blade System.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="bsomAddress" type="IsTypes:IpAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ IP address of the Blade System OaM Master.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="Blade" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ This class describes a Blade.
+ A Blade is identified by the subrack and slot number.
+
+ Key attributes: [subrackId,slotNo]
+
+ Possible children:
+ LinkSap
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="subrackId">
+ <xsd:annotation>
+ <xsd:documentation>
+ A reference to the associated subrack (i.e. the value of 'subrackId'
+ for the associated subrack)
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType16">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="slotNo">
+ <xsd:annotation>
+ <xsd:documentation>
+ The slot number for this Blade within the subrack.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType17">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="slotLabel">
+ <xsd:annotation>
+ <xsd:documentation>
+ The slot label of the blade. Will only be set at creation of table row.
+ This should be used in alarms related to the slot to inform the
+ operator of what position in the subrack the blade is located in.
+ E.g. for GEM subracks it will be a string like X02 for slot 0
+ up to X80 for slot 25.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="bsNo">
+ <xsd:annotation>
+ <xsd:documentation>
+ An identifier for the BS to which the blade belongs.
+ A value of 0 means that the blade is inserted in the subrack but it
+ has not been configured to any BS yet.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="type">
+ <xsd:annotation>
+ <xsd:documentation>
+ The type of the Blade defined by a string BladTypeIdAndRev.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="swgLowestId">
+ <xsd:annotation>
+ <xsd:documentation>
+ The SW group of the Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="swgLowestRev">
+ <xsd:annotation>
+ <xsd:documentation>
+ The SW group of the Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="swgActualId">
+ <xsd:annotation>
+ <xsd:documentation>
+ The SW group of the Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="swgActualRev">
+ <xsd:annotation>
+ <xsd:documentation>
+ The SW group of the Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="bsom">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="knockOutType" type="HwmKnockOutType">
+ <xsd:annotation>
+ <xsd:documentation>
+ Set to protected if blade sholud no be knocked out before the
+ switch blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="userLabel">
+ <xsd:annotation>
+ <xsd:documentation>
+ A user friendly Blade name, always possible to set.
+ Default value indicates HwmBladeType and used slot.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="admState" type="HwmAdministrativeStateType">
+ <xsd:annotation>
+ <xsd:documentation>
+ The administrative state of the Blade. The Blade is
+ unblocked by setting this object to unlocked and blocked
+ by setting it to locked. If the object already has the
+ desired value or the hwmBladeOpState has a transient OpState value
+ the set operation will be rejected. The set operation may be
+ rejected due to other reasons as well.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="opState" type="HwmOperationalStateType">
+ <xsd:annotation>
+ <xsd:documentation>
+ The operational state of the Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="availState" type="HwmAvailabilityStatusType">
+ <xsd:annotation>
+ <xsd:documentation>
+ The availability status of the Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="busType" type="HwmBusTypeType">
+ <xsd:annotation>
+ <xsd:documentation>
+ The type of maintenance bus on the found Blade
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="prodNo">
+ <xsd:annotation>
+ <xsd:documentation>
+ The Product Number of the found Blade
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="prodRev">
+ <xsd:annotation>
+ <xsd:documentation>
+ The Product Revision of the found Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="serialNo">
+ <xsd:annotation>
+ <xsd:documentation>
+ The Serial Number of the found Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="prodName">
+ <xsd:annotation>
+ <xsd:documentation>
+ The Product Name of the found Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="vendor">
+ <xsd:annotation>
+ <xsd:documentation>
+ The Vendor name of the found Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="mfgDate">
+ <xsd:annotation>
+ <xsd:documentation>
+ The manufacturing date of the found Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="macAddressAggregate" type="IsTypes:MacAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ The aggregated MAC address of the found Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="macAddressLeft" type="IsTypes:MacAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ The left link MAC address of the found Blade. Only used by some blades
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="macAddressRight" type="IsTypes:MacAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ The right link MAC address of the found Blade. Only used by some blades
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="changeDate">
+ <xsd:annotation>
+ <xsd:documentation>
+ The date when the blade was last changed.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="lock">
+ <xsd:annotation>
+ <xsd:documentation>
+ Borde kanske varfa en �ndring av admstate.????
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ The name of the Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isbsAddress" type="IsTypes:IpAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ IP address on the ISBS subnet.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isobAddress" type="IsTypes:IpAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ IP address on the ISOB subnet.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="islctAddress" type="IsTypes:IpAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ IP address on the ISLCT subnet.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="LinkSap" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ A Blade may have one or more resilient interfaces to the backplane. Such
+ interface is called Link Service Access Point and are automatically
+ created and deleted along with the hosting blade.
+
+ Key attributes: [id]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="id">
+ <xsd:annotation>
+ <xsd:documentation>
+ The id of a LinkSap is a number from 0 to X within the slot.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the Link Service Access Point.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BsIpTrafficClass" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ Key attributes: [id]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="id">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isIpTrafficClassRef">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType25">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BsLanTrafficClass" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ Key attributes: [id]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="id">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isLanTrafficClassRef">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType19">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BsLogicalNetwork" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ Key attributes: [name]
+
+ Possible children:
+ BsSubnet
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ Name of the BS logical network. Unique within the Blade System.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the BS Logical Network.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="private">
+ <xsd:annotation>
+ <xsd:documentation>
+ Flag that shows whether the BS Logical Network is private for this
+ Blade System or if it may be shared among several Blade Systems.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isLogicalNetworkRef">
+ <xsd:annotation>
+ <xsd:documentation>
+ Reference to the corresponding IS Logical Network.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType26">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BsSubnet" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ BS Subnets can either be created manually by the operator or they
+ can be automatically created from pre-registered network requirements
+ bundled with the Blade System software.
+ Regardless of how they are created,
+ each one needs to be mapped to both a BS VLan and an
+ IS Subnet before blades can be unlocked via the Hardware service.
+ Each BS Subnet contains one or more BS Subnet Segments.
+
+ Key attributes: [name]
+
+ Possible children:
+ BsSubnetSegment
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ Name of the BS Subnet. Unique within the BS Logical Network.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the BS Subnet.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="bsVlanRef">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType27">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isSubnetRef">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType28">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BsSubnetSegment" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ BS Subnet Segments can either be created manually by you or they can
+ be automatically created from pre-registered network requirements
+ bundled with the Blade System software. Regardless of how they are created,
+ each one needs to be mapped to an IS Subnet Segment before the blades
+ can be unlocked via the Hardware service.
+ The mapping is done with the 'isSubnetSegmentRef' attribute.
+
+ Key attributes: [name]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ Name of the BS Subnet Segment. Unique within the BS Subnet.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the BS Subnet Segment.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="numOfIpaddresses">
+ <xsd:annotation>
+ <xsd:documentation>
+ Number of required IP addresses in the IS Subnet Segment.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="dhcpEnabled">
+ <xsd:annotation>
+ <xsd:documentation>
+ Flag that controls whether the corresponding IS Subnet Segment is
+ required to have DHCP enabled or not.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="routerRequired">
+ <xsd:annotation>
+ <xsd:documentation>
+ Flag that controls whether the corresponding IS Subnet Segment is
+ required to have a router configured or not.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isSubnetSegmentRef">
+ <xsd:annotation>
+ <xsd:documentation>
+ The mapping to a corresponding IS Subnet Segment. The mapping here must
+ be done before the blades of the blade system can be unlocked.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType29">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BsVlan" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ BS VLANs can either be created manually by the
+ operator or they can be automatically created from pre-registered
+ network requirements bundled with the Blade System software.
+ Regardless of how they are created, each one needs to be mapped to
+ an IS VLAN before the blades can be unlocked.
+
+ Key attributes: [name]
+
+ Possible children:
+ BsVlanSap
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ Name of the BS Vlan. Unique within the Blade System.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the BS Vlan.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isVlanRef">
+ <xsd:annotation>
+ <xsd:documentation>
+ The mapping to a corresponding IS Vlan. This mapping must be done before
+ the blades of the Blade System can be unlocked.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType30">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BsVlanSap" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ BS VLAN Service Access Points can either be created manually by the
+ operator or they can be automatically created from pre-registered
+ network requirements bundled with the Blade System software.
+ Regardless of how they are created, each one needs to be mapped to
+ an Link SAP before the blades can be unlocked.
+
+ Key attributes: [name]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ Name of the BS VLAN SAP. Uniqie within the BS VLAN.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the BS VLAN SAP.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="static">
+ <xsd:annotation>
+ <xsd:documentation>
+ Flag which controls whether this BS VLAN SAP makes static or dynamic
+ use of the corresponding IS VLAN.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="protected">
+ <xsd:annotation>
+ <xsd:documentation>
+ Flag which controls whether this BS VLAN SAP should be
+ isolation protected or not.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="linkSapRef">
+ <xsd:annotation>
+ <xsd:documentation>
+ A mapping to the corresponding Link Service Access Point.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType31">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="MyBsModel" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ This class describes a Blade System. It will be cloned for each
+ new blade system type registered in the system. The new clone
+ will serve as a mountpoint for the blade system specific model.
+
+ Key attributes: [name]
+
+ Possible children:
+ Blade
+ BsIpTrafficClass
+ BsLanTrafficClass
+ BsLogicalNetwork
+ BsVlan
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ A user friendly Blade System name, must be set at creation and can be
+ changed when BS is locked.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="no">
+ <xsd:annotation>
+ <xsd:documentation>
+ An identifier for the BS. A new integer has to be used every time a new
+ BS is created. ??? Kvar ???
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="softwareGroupId">
+ <xsd:annotation>
+ <xsd:documentation>
+ The identity of the Software Group (SWG) that the BS implements.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="softwareGroupRevision">
+ <xsd:annotation>
+ <xsd:documentation>
+ The revision of the Software Group (SWG) that the BS implements.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="admState" type="HwmAdministrativeStateType">
+ <xsd:annotation>
+ <xsd:documentation>
+ The administrative state of the Blade System.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="opState" type="HwmOperationalStateType">
+ <xsd:annotation>
+ <xsd:documentation>
+ The operational state of the Blade System.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="availStatus" type="HwmAvailabilityStatusType">
+ <xsd:annotation>
+ <xsd:documentation>
+ The availability status of the Blade System.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="locked">
+ <xsd:annotation>
+ <xsd:documentation>
+ eller s�tta admState ????????????
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the Blade System.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="bsomAddress" type="IsTypes:IpAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ IP address of the Blade System OaM Master.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="Blade" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ This class describes a Blade.
+ A Blade is identified by the subrack and slot number.
+
+ Key attributes: [subrackId,slotNo]
+
+ Possible children:
+ LinkSap
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="subrackId">
+ <xsd:annotation>
+ <xsd:documentation>
+ A reference to the associated subrack (i.e. the value of 'subrackId'
+ for the associated subrack)
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType16">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="slotNo">
+ <xsd:annotation>
+ <xsd:documentation>
+ The slot number for this Blade within the subrack.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType17">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="slotLabel">
+ <xsd:annotation>
+ <xsd:documentation>
+ The slot label of the blade. Will only be set at creation of table row.
+ This should be used in alarms related to the slot to inform the
+ operator of what position in the subrack the blade is located in.
+ E.g. for GEM subracks it will be a string like X02 for slot 0
+ up to X80 for slot 25.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="bsNo">
+ <xsd:annotation>
+ <xsd:documentation>
+ An identifier for the BS to which the blade belongs.
+ A value of 0 means that the blade is inserted in the subrack but it
+ has not been configured to any BS yet.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="type">
+ <xsd:annotation>
+ <xsd:documentation>
+ The type of the Blade defined by a string BladTypeIdAndRev.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="swgLowestId">
+ <xsd:annotation>
+ <xsd:documentation>
+ The SW group of the Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="swgLowestRev">
+ <xsd:annotation>
+ <xsd:documentation>
+ The SW group of the Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="swgActualId">
+ <xsd:annotation>
+ <xsd:documentation>
+ The SW group of the Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="swgActualRev">
+ <xsd:annotation>
+ <xsd:documentation>
+ The SW group of the Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="bsom">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="knockOutType" type="HwmKnockOutType">
+ <xsd:annotation>
+ <xsd:documentation>
+ Set to protected if blade sholud no be knocked out before the
+ switch blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="userLabel">
+ <xsd:annotation>
+ <xsd:documentation>
+ A user friendly Blade name, always possible to set.
+ Default value indicates HwmBladeType and used slot.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="admState" type="HwmAdministrativeStateType">
+ <xsd:annotation>
+ <xsd:documentation>
+ The administrative state of the Blade. The Blade is
+ unblocked by setting this object to unlocked and blocked
+ by setting it to locked. If the object already has the
+ desired value or the hwmBladeOpState has a transient OpState value
+ the set operation will be rejected. The set operation may be
+ rejected due to other reasons as well.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="opState" type="HwmOperationalStateType">
+ <xsd:annotation>
+ <xsd:documentation>
+ The operational state of the Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="availState" type="HwmAvailabilityStatusType">
+ <xsd:annotation>
+ <xsd:documentation>
+ The availability status of the Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="busType" type="HwmBusTypeType">
+ <xsd:annotation>
+ <xsd:documentation>
+ The type of maintenance bus on the found Blade
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="prodNo">
+ <xsd:annotation>
+ <xsd:documentation>
+ The Product Number of the found Blade
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="prodRev">
+ <xsd:annotation>
+ <xsd:documentation>
+ The Product Revision of the found Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="serialNo">
+ <xsd:annotation>
+ <xsd:documentation>
+ The Serial Number of the found Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="prodName">
+ <xsd:annotation>
+ <xsd:documentation>
+ The Product Name of the found Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="vendor">
+ <xsd:annotation>
+ <xsd:documentation>
+ The Vendor name of the found Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="mfgDate">
+ <xsd:annotation>
+ <xsd:documentation>
+ The manufacturing date of the found Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="macAddressAggregate" type="IsTypes:MacAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ The aggregated MAC address of the found Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="macAddressLeft" type="IsTypes:MacAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ The left link MAC address of the found Blade. Only used by some blades
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="macAddressRight" type="IsTypes:MacAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ The right link MAC address of the found Blade. Only used by some blades
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="changeDate">
+ <xsd:annotation>
+ <xsd:documentation>
+ The date when the blade was last changed.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="lock">
+ <xsd:annotation>
+ <xsd:documentation>
+ Borde kanske varfa en �ndring av admstate.????
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ The name of the Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isbsAddress" type="IsTypes:IpAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ IP address on the ISBS subnet.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isobAddress" type="IsTypes:IpAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ IP address on the ISOB subnet.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="islctAddress" type="IsTypes:IpAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ IP address on the ISLCT subnet.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="LinkSap" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ A Blade may have one or more resilient interfaces to the backplane. Such
+ interface is called Link Service Access Point and are automatically
+ created and deleted along with the hosting blade.
+
+ Key attributes: [id]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="id">
+ <xsd:annotation>
+ <xsd:documentation>
+ The id of a LinkSap is a number from 0 to X within the slot.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the Link Service Access Point.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BsIpTrafficClass" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ Key attributes: [id]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="id">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isIpTrafficClassRef">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType25">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BsLanTrafficClass" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ Key attributes: [id]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="id">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isLanTrafficClassRef">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType19">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BsLogicalNetwork" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ Key attributes: [name]
+
+ Possible children:
+ BsSubnet
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ Name of the BS logical network. Unique within the Blade System.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the BS Logical Network.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="private">
+ <xsd:annotation>
+ <xsd:documentation>
+ Flag that shows whether the BS Logical Network is private for this
+ Blade System or if it may be shared among several Blade Systems.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isLogicalNetworkRef">
+ <xsd:annotation>
+ <xsd:documentation>
+ Reference to the corresponding IS Logical Network.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType26">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BsSubnet" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ BS Subnets can either be created manually by the operator or they
+ can be automatically created from pre-registered network requirements
+ bundled with the Blade System software.
+ Regardless of how they are created,
+ each one needs to be mapped to both a BS VLan and an
+ IS Subnet before blades can be unlocked via the Hardware service.
+ Each BS Subnet contains one or more BS Subnet Segments.
+
+ Key attributes: [name]
+
+ Possible children:
+ BsSubnetSegment
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ Name of the BS Subnet. Unique within the BS Logical Network.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the BS Subnet.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="bsVlanRef">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType27">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isSubnetRef">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType28">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BsSubnetSegment" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ BS Subnet Segments can either be created manually by you or they can
+ be automatically created from pre-registered network requirements
+ bundled with the Blade System software. Regardless of how they are created,
+ each one needs to be mapped to an IS Subnet Segment before the blades
+ can be unlocked via the Hardware service.
+ The mapping is done with the 'isSubnetSegmentRef' attribute.
+
+ Key attributes: [name]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ Name of the BS Subnet Segment. Unique within the BS Subnet.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the BS Subnet Segment.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="numOfIpaddresses">
+ <xsd:annotation>
+ <xsd:documentation>
+ Number of required IP addresses in the IS Subnet Segment.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="dhcpEnabled">
+ <xsd:annotation>
+ <xsd:documentation>
+ Flag that controls whether the corresponding IS Subnet Segment is
+ required to have DHCP enabled or not.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="routerRequired">
+ <xsd:annotation>
+ <xsd:documentation>
+ Flag that controls whether the corresponding IS Subnet Segment is
+ required to have a router configured or not.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isSubnetSegmentRef">
+ <xsd:annotation>
+ <xsd:documentation>
+ The mapping to a corresponding IS Subnet Segment. The mapping here must
+ be done before the blades of the blade system can be unlocked.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType29">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BsVlan" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ BS VLANs can either be created manually by the
+ operator or they can be automatically created from pre-registered
+ network requirements bundled with the Blade System software.
+ Regardless of how they are created, each one needs to be mapped to
+ an IS VLAN before the blades can be unlocked.
+
+ Key attributes: [name]
+
+ Possible children:
+ BsVlanSap
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ Name of the BS Vlan. Unique within the Blade System.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the BS Vlan.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isVlanRef">
+ <xsd:annotation>
+ <xsd:documentation>
+ The mapping to a corresponding IS Vlan. This mapping must be done before
+ the blades of the Blade System can be unlocked.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType30">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BsVlanSap" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ BS VLAN Service Access Points can either be created manually by the
+ operator or they can be automatically created from pre-registered
+ network requirements bundled with the Blade System software.
+ Regardless of how they are created, each one needs to be mapped to
+ an Link SAP before the blades can be unlocked.
+
+ Key attributes: [name]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ Name of the BS VLAN SAP. Uniqie within the BS VLAN.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the BS VLAN SAP.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="static">
+ <xsd:annotation>
+ <xsd:documentation>
+ Flag which controls whether this BS VLAN SAP makes static or dynamic
+ use of the corresponding IS VLAN.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="protected">
+ <xsd:annotation>
+ <xsd:documentation>
+ Flag which controls whether this BS VLAN SAP should be
+ isolation protected or not.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="linkSapRef">
+ <xsd:annotation>
+ <xsd:documentation>
+ A mapping to the corresponding Link Service Access Point.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType31">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element ref="MyBsModel:model" minOccurs="0" maxOccurs="1"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Sis" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ This class describes a Blade System. It will be cloned for each
+ new blade system type registered in the system. The new clone
+ will serve as a mountpoint for the blade system specific model.
+
+ Key attributes: [name]
+
+ Possible children:
+ Blade
+ BsIpTrafficClass
+ BsLanTrafficClass
+ BsLogicalNetwork
+ BsVlan
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ A user friendly Blade System name, must be set at creation and can be
+ changed when BS is locked.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="no">
+ <xsd:annotation>
+ <xsd:documentation>
+ An identifier for the BS. A new integer has to be used every time a new
+ BS is created. ??? Kvar ???
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="softwareGroupId">
+ <xsd:annotation>
+ <xsd:documentation>
+ The identity of the Software Group (SWG) that the BS implements.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="softwareGroupRevision">
+ <xsd:annotation>
+ <xsd:documentation>
+ The revision of the Software Group (SWG) that the BS implements.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="admState" type="HwmAdministrativeStateType">
+ <xsd:annotation>
+ <xsd:documentation>
+ The administrative state of the Blade System.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="opState" type="HwmOperationalStateType">
+ <xsd:annotation>
+ <xsd:documentation>
+ The operational state of the Blade System.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="availStatus" type="HwmAvailabilityStatusType">
+ <xsd:annotation>
+ <xsd:documentation>
+ The availability status of the Blade System.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="locked">
+ <xsd:annotation>
+ <xsd:documentation>
+ eller s�tta admState ????????????
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the Blade System.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="bsomAddress" type="IsTypes:IpAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ IP address of the Blade System OaM Master.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="Blade" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ This class describes a Blade.
+ A Blade is identified by the subrack and slot number.
+
+ Key attributes: [subrackId,slotNo]
+
+ Possible children:
+ LinkSap
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="subrackId">
+ <xsd:annotation>
+ <xsd:documentation>
+ A reference to the associated subrack (i.e. the value of 'subrackId'
+ for the associated subrack)
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType16">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="slotNo">
+ <xsd:annotation>
+ <xsd:documentation>
+ The slot number for this Blade within the subrack.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType17">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="slotLabel">
+ <xsd:annotation>
+ <xsd:documentation>
+ The slot label of the blade. Will only be set at creation of table row.
+ This should be used in alarms related to the slot to inform the
+ operator of what position in the subrack the blade is located in.
+ E.g. for GEM subracks it will be a string like X02 for slot 0
+ up to X80 for slot 25.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="bsNo">
+ <xsd:annotation>
+ <xsd:documentation>
+ An identifier for the BS to which the blade belongs.
+ A value of 0 means that the blade is inserted in the subrack but it
+ has not been configured to any BS yet.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="type">
+ <xsd:annotation>
+ <xsd:documentation>
+ The type of the Blade defined by a string BladTypeIdAndRev.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="swgLowestId">
+ <xsd:annotation>
+ <xsd:documentation>
+ The SW group of the Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="swgLowestRev">
+ <xsd:annotation>
+ <xsd:documentation>
+ The SW group of the Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="swgActualId">
+ <xsd:annotation>
+ <xsd:documentation>
+ The SW group of the Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="swgActualRev">
+ <xsd:annotation>
+ <xsd:documentation>
+ The SW group of the Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="bsom">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="knockOutType" type="HwmKnockOutType">
+ <xsd:annotation>
+ <xsd:documentation>
+ Set to protected if blade sholud no be knocked out before the
+ switch blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="userLabel">
+ <xsd:annotation>
+ <xsd:documentation>
+ A user friendly Blade name, always possible to set.
+ Default value indicates HwmBladeType and used slot.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="admState" type="HwmAdministrativeStateType">
+ <xsd:annotation>
+ <xsd:documentation>
+ The administrative state of the Blade. The Blade is
+ unblocked by setting this object to unlocked and blocked
+ by setting it to locked. If the object already has the
+ desired value or the hwmBladeOpState has a transient OpState value
+ the set operation will be rejected. The set operation may be
+ rejected due to other reasons as well.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="opState" type="HwmOperationalStateType">
+ <xsd:annotation>
+ <xsd:documentation>
+ The operational state of the Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="availState" type="HwmAvailabilityStatusType">
+ <xsd:annotation>
+ <xsd:documentation>
+ The availability status of the Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="busType" type="HwmBusTypeType">
+ <xsd:annotation>
+ <xsd:documentation>
+ The type of maintenance bus on the found Blade
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="prodNo">
+ <xsd:annotation>
+ <xsd:documentation>
+ The Product Number of the found Blade
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="prodRev">
+ <xsd:annotation>
+ <xsd:documentation>
+ The Product Revision of the found Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="serialNo">
+ <xsd:annotation>
+ <xsd:documentation>
+ The Serial Number of the found Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="prodName">
+ <xsd:annotation>
+ <xsd:documentation>
+ The Product Name of the found Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="vendor">
+ <xsd:annotation>
+ <xsd:documentation>
+ The Vendor name of the found Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="mfgDate">
+ <xsd:annotation>
+ <xsd:documentation>
+ The manufacturing date of the found Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="macAddressAggregate" type="IsTypes:MacAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ The aggregated MAC address of the found Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="macAddressLeft" type="IsTypes:MacAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ The left link MAC address of the found Blade. Only used by some blades
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="macAddressRight" type="IsTypes:MacAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ The right link MAC address of the found Blade. Only used by some blades
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="changeDate">
+ <xsd:annotation>
+ <xsd:documentation>
+ The date when the blade was last changed.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="lock">
+ <xsd:annotation>
+ <xsd:documentation>
+ Borde kanske varfa en �ndring av admstate.????
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ The name of the Blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the blade.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isbsAddress" type="IsTypes:IpAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ IP address on the ISBS subnet.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isobAddress" type="IsTypes:IpAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ IP address on the ISOB subnet.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="islctAddress" type="IsTypes:IpAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ IP address on the ISLCT subnet.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="LinkSap" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ A Blade may have one or more resilient interfaces to the backplane. Such
+ interface is called Link Service Access Point and are automatically
+ created and deleted along with the hosting blade.
+
+ Key attributes: [id]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="id">
+ <xsd:annotation>
+ <xsd:documentation>
+ The id of a LinkSap is a number from 0 to X within the slot.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the Link Service Access Point.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BsIpTrafficClass" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ Key attributes: [id]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="id">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isIpTrafficClassRef">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType25">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BsLanTrafficClass" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ Key attributes: [id]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="id">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isLanTrafficClassRef">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType19">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BsLogicalNetwork" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ Key attributes: [name]
+
+ Possible children:
+ BsSubnet
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ Name of the BS logical network. Unique within the Blade System.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the BS Logical Network.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="private">
+ <xsd:annotation>
+ <xsd:documentation>
+ Flag that shows whether the BS Logical Network is private for this
+ Blade System or if it may be shared among several Blade Systems.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isLogicalNetworkRef">
+ <xsd:annotation>
+ <xsd:documentation>
+ Reference to the corresponding IS Logical Network.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType26">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BsSubnet" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ BS Subnets can either be created manually by the operator or they
+ can be automatically created from pre-registered network requirements
+ bundled with the Blade System software.
+ Regardless of how they are created,
+ each one needs to be mapped to both a BS VLan and an
+ IS Subnet before blades can be unlocked via the Hardware service.
+ Each BS Subnet contains one or more BS Subnet Segments.
+
+ Key attributes: [name]
+
+ Possible children:
+ BsSubnetSegment
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ Name of the BS Subnet. Unique within the BS Logical Network.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the BS Subnet.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="bsVlanRef">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType27">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isSubnetRef">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType28">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BsSubnetSegment" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ BS Subnet Segments can either be created manually by you or they can
+ be automatically created from pre-registered network requirements
+ bundled with the Blade System software. Regardless of how they are created,
+ each one needs to be mapped to an IS Subnet Segment before the blades
+ can be unlocked via the Hardware service.
+ The mapping is done with the 'isSubnetSegmentRef' attribute.
+
+ Key attributes: [name]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ Name of the BS Subnet Segment. Unique within the BS Subnet.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the BS Subnet Segment.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="numOfIpaddresses">
+ <xsd:annotation>
+ <xsd:documentation>
+ Number of required IP addresses in the IS Subnet Segment.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="dhcpEnabled">
+ <xsd:annotation>
+ <xsd:documentation>
+ Flag that controls whether the corresponding IS Subnet Segment is
+ required to have DHCP enabled or not.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="routerRequired">
+ <xsd:annotation>
+ <xsd:documentation>
+ Flag that controls whether the corresponding IS Subnet Segment is
+ required to have a router configured or not.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isSubnetSegmentRef">
+ <xsd:annotation>
+ <xsd:documentation>
+ The mapping to a corresponding IS Subnet Segment. The mapping here must
+ be done before the blades of the blade system can be unlocked.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType29">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BsVlan" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ BS VLANs can either be created manually by the
+ operator or they can be automatically created from pre-registered
+ network requirements bundled with the Blade System software.
+ Regardless of how they are created, each one needs to be mapped to
+ an IS VLAN before the blades can be unlocked.
+
+ Key attributes: [name]
+
+ Possible children:
+ BsVlanSap
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ Name of the BS Vlan. Unique within the Blade System.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the BS Vlan.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="isVlanRef">
+ <xsd:annotation>
+ <xsd:documentation>
+ The mapping to a corresponding IS Vlan. This mapping must be done before
+ the blades of the Blade System can be unlocked.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType30">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BsVlanSap" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ BS VLAN Service Access Points can either be created manually by the
+ operator or they can be automatically created from pre-registered
+ network requirements bundled with the Blade System software.
+ Regardless of how they are created, each one needs to be mapped to
+ an Link SAP before the blades can be unlocked.
+
+ Key attributes: [name]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="name">
+ <xsd:annotation>
+ <xsd:documentation>
+ Name of the BS VLAN SAP. Uniqie within the BS VLAN.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Short description of the BS VLAN SAP.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="static">
+ <xsd:annotation>
+ <xsd:documentation>
+ Flag which controls whether this BS VLAN SAP makes static or dynamic
+ use of the corresponding IS VLAN.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="protected">
+ <xsd:annotation>
+ <xsd:documentation>
+ Flag which controls whether this BS VLAN SAP should be
+ isolation protected or not.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="linkSapRef">
+ <xsd:annotation>
+ <xsd:documentation>
+ A mapping to the corresponding Link Service Access Point.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType31">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element ref="MainSwitch:model" minOccurs="0" maxOccurs="1"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:simpleType name="ccsHelperType31">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:pattern value="((/IntegratedSite:model/)|((\.\./)+)|((\./)(\.\./)*)|())((([A-Z][a-zA-Z0-9]+:model)|([A-Z][a-zA-Z0-9]+(\[[a-z][a-zA-Z0-9]*='[^\]]+'\])*))/)*LinkSap\[id='[^\]]+'\]"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType30">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:pattern value="((/IntegratedSite:model/)|((\.\./)+)|((\./)(\.\./)*)|())((([A-Z][a-zA-Z0-9]+:model)|([A-Z][a-zA-Z0-9]+(\[[a-z][a-zA-Z0-9]*='[^\]]+'\])*))/)*IsVlan\[identity='[^\]]+'\]"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType29">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:pattern value="((/IntegratedSite:model/)|((\.\./)+)|((\./)(\.\./)*)|())((([A-Z][a-zA-Z0-9]+:model)|([A-Z][a-zA-Z0-9]+(\[[a-z][a-zA-Z0-9]*='[^\]]+'\])*))/)*IsSubnetSegment\[name='[^\]]+'\]"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType28">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:pattern value="((/IntegratedSite:model/)|((\.\./)+)|((\./)(\.\./)*)|())((([A-Z][a-zA-Z0-9]+:model)|([A-Z][a-zA-Z0-9]+(\[[a-z][a-zA-Z0-9]*='[^\]]+'\])*))/)*IsSubnet\[name='[^\]]+'\]"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType27">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:pattern value="((/IntegratedSite:model/)|((\.\./)+)|((\./)(\.\./)*)|())((([A-Z][a-zA-Z0-9]+:model)|([A-Z][a-zA-Z0-9]+(\[[a-z][a-zA-Z0-9]*='[^\]]+'\])*))/)*BsVlan\[name='[^\]]+'\]"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType26">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:pattern value="((/IntegratedSite:model/)|((\.\./)+)|((\./)(\.\./)*)|())((([A-Z][a-zA-Z0-9]+:model)|([A-Z][a-zA-Z0-9]+(\[[a-z][a-zA-Z0-9]*='[^\]]+'\])*))/)*IsLogicalNetwork\[name='[^\]]+'\]"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType25">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:pattern value="((/IntegratedSite:model/)|((\.\./)+)|((\./)(\.\./)*)|())((([A-Z][a-zA-Z0-9]+:model)|([A-Z][a-zA-Z0-9]+(\[[a-z][a-zA-Z0-9]*='[^\]]+'\])*))/)*IsIpTrafficClass\[name='[^\]]+'\]"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType24">
+ <xsd:restriction base="xsd:integer">
+ <xsd:minInclusive value="0"/>
+ <xsd:maxInclusive value="4096"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType23">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:pattern value="[a-zA-Z]+(.[a-zA-Z])*"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType22">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="unsafe"/>
+ <xsd:enumeration value="readOnly"/>
+ <xsd:enumeration value="safe"/>
+ <xsd:enumeration value="preliminary"/>
+ <xsd:enumeration value="prepare"/>
+ <xsd:enumeration value="publish"/>
+ <xsd:enumeration value="accept"/>
+ <xsd:enumeration value="reject"/>
+ <xsd:enumeration value="purge"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType21">
+ <xsd:restriction base="xsd:integer">
+ <xsd:minInclusive value="0"/>
+ <xsd:maxInclusive value="32"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType20">
+ <xsd:restriction base="xsd:integer">
+ <xsd:minInclusive value="0"/>
+ <xsd:maxInclusive value="7"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType19">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:pattern value="((/IntegratedSite:model/)|((\.\./)+)|((\./)(\.\./)*)|())((([A-Z][a-zA-Z0-9]+:model)|([A-Z][a-zA-Z0-9]+(\[[a-z][a-zA-Z0-9]*='[^\]]+'\])*))/)*IsLanTrafficClass\[name='[^\]]+'\]"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType18">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:pattern value="((/IntegratedSite:model/)|((\.\./)+)|((\./)(\.\./)*)|())((([A-Z][a-zA-Z0-9]+:model)|([A-Z][a-zA-Z0-9]+(\[[a-z][a-zA-Z0-9]*='[^\]]+'\])*))/)*SoftwareDeliveryPackage\[ixProdNr='[^\]]+'\]\[ixVersion='[^\]]+'\]"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType17">
+ <xsd:restriction base="xsd:integer">
+ <xsd:minInclusive value="0"/>
+ <xsd:maxInclusive value="25"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType16">
+ <xsd:restriction base="xsd:integer">
+ <xsd:minInclusive value="0"/>
+ <xsd:maxInclusive value="31"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType15">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="unsuedEmpty"/>
+ <xsd:enumeration value="usedEmpty"/>
+ <xsd:enumeration value="unusedOccupied"/>
+ <xsd:enumeration value="usedOccupied"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType14">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="available"/>
+ <xsd:enumeration value="failed"/>
+ <xsd:enumeration value="offLine"/>
+ <xsd:enumeration value="dependency"/>
+ <xsd:enumeration value="degraded"/>
+ <xsd:enumeration value="upgrading"/>
+ <xsd:enumeration value="startingUp"/>
+ <xsd:enumeration value="goingOffLine"/>
+ <xsd:enumeration value="notInstalled"/>
+ <xsd:enumeration value="powerOff"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType13">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="notStarted"/>
+ <xsd:enumeration value="ongoing"/>
+ <xsd:enumeration value="complete"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType12">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="onlyIfMissing"/>
+ <xsd:enumeration value="always"/>
+ <xsd:enumeration value="unknown"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType11">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="exact"/>
+ <xsd:enumeration value="prefix"/>
+ <xsd:enumeration value="unknown"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType10">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="bladeSystemInformation"/>
+ <xsd:enumeration value="bladeInformation"/>
+ <xsd:enumeration value="application"/>
+ <xsd:enumeration value="rootFileSystem"/>
+ <xsd:enumeration value="kernel"/>
+ <xsd:enumeration value="correction"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType9">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="locked"/>
+ <xsd:enumeration value="shuttingdown"/>
+ <xsd:enumeration value="unlocked"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType8">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="ok"/>
+ <xsd:enumeration value="inputError"/>
+ <xsd:enumeration value="executionError"/>
+ <xsd:enumeration value="unknown"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType7">
+ <xsd:restriction base="xsd:integer">
+ <xsd:minInclusive value="0"/>
+ <xsd:maxInclusive value="4294967295"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType6">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="ipmi"/>
+ <xsd:enumeration value="mbus"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType5">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="complete"/>
+ <xsd:enumeration value="incomplete"/>
+ <xsd:enumeration value="inconsistent"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType4">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="disabled"/>
+ <xsd:enumeration value="enabled"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType3">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="normal"/>
+ <xsd:enumeration value="protected"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType2">
+ <xsd:restriction base="xsd:boolean">
+ <xsd:pattern value="(true|false)"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType1">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType0">
+ <xsd:restriction base="xsd:dateTime">
+ <xsd:whiteSpace value="collapse"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+</xsd:schema>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/IsTypes.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/IsTypes.xsd
new file mode 100644
index 0000000000..a9607e4253
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/IsTypes.xsd
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ericsson.com/is/isco/IsTypes" xmlns="http://www.ericsson.com/is/isco/IsTypes" xmlns:nc="http://www.ericsson.com/is/isco/nc">
+ <xsd:annotation>
+ <xsd:appinfo>
+ <mim file="types_mim.xml" version=""/>
+ </xsd:appinfo>
+ </xsd:annotation>
+ <xsd:import schemaLocation="nc.xsd" namespace="http://www.ericsson.com/is/isco/nc"/>
+ <xsd:complexType name="IpAddress">
+ <xsd:annotation>
+ <xsd:documentation>
+ An IPv4 address
+ in the form v1.v2.v3.v4 where v1 ... v4 is a
+ decimal number in the range 0 to 255.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType0">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="MacAddress">
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:simpleType name="ccsHelperType1">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:pattern value="[A-F0-9][A-F0-9]?:[A-F0-9][A-F0-9]?:[A-F0-9][A-F0-9]?:[A-F0-9][A-F0-9]?:[A-F0-9][A-F0-9]?:[A-F0-9][A-F0-9]?"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType0">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:pattern value="(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+</xsd:schema>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/MainSwitch_1.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/MainSwitch_1.xsd
new file mode 100644
index 0000000000..9c91d6efd6
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/MainSwitch_1.xsd
@@ -0,0 +1,1496 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ericsson.com/is/isco/MainSwitch_1" xmlns="http://www.ericsson.com/is/isco/MainSwitch_1" xmlns:nc="http://www.ericsson.com/is/isco/nc">
+ <xsd:annotation>
+ <xsd:appinfo>
+ <mim file="mx_mim.xml" version=""/>
+ </xsd:appinfo>
+ </xsd:annotation>
+ <xsd:import schemaLocation="nc.xsd" namespace="http://www.ericsson.com/is/isco/nc"/>
+ <xsd:complexType name="SubrackNum">
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType0">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="LinkAggregationData">
+ <xsd:annotation>
+ <xsd:documentation>
+ Description of Link Aggregation Data
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="aggrPortActorPort">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="aggrPortOperState">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="item" type="LinkAggregationOperStateData" minOccurs="8" maxOccurs="8"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="ifIndex">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="mode">
+ <xsd:annotation>
+ <xsd:documentation>
+ Port Channel Mode
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="configuredPorts">
+ <xsd:annotation>
+ <xsd:documentation>
+ Number of configured ports for this interface.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="activePorts">
+ <xsd:annotation>
+ <xsd:documentation>
+ Number of active ports for this interface.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="macSelectionPolicy">
+ <xsd:annotation>
+ <xsd:documentation>
+ MAC Selection Policy
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="linkSelectionPolicy">
+ <xsd:annotation>
+ <xsd:documentation>
+ Link Selection Policy
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType3">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="aggregatorMac">
+ <xsd:annotation>
+ <xsd:documentation>
+ MAC address of Aggregator
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType4">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="actorId">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType4">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="actorPrio">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="actorAdminKey">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="actorOperKey">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="partnerId">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType4">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="partnerPrio">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="partnerOperKey">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ <xsd:complexType name="PercentUsage">
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType5">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="BladeSlotLink">
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType6">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="CosQueueConfigurationData">
+ <xsd:annotation>
+ <xsd:documentation>
+ Description of COS configuration data
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="queue">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType7">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="buffer" type="PercentUsage">
+ <xsd:annotation>
+ <xsd:documentation>
+ Indicates allocated buffer in percent
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="scheduling">
+ <xsd:annotation>
+ <xsd:documentation>
+ Indicates if Sceduling is Weighted Round Robin (WRR) or Strict Priority
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType8">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="weight">
+ <xsd:annotation>
+ <xsd:documentation>
+ Indicates if Weight in case of WRR is High, Medium or Low
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType9">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ <xsd:complexType name="VlanData">
+ <xsd:annotation>
+ <xsd:documentation>
+ This struct describes Vlan data
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="vlanId">
+ <xsd:annotation>
+ <xsd:documentation>
+ Vlan Id
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType10">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="vlanType">
+ <xsd:annotation>
+ <xsd:documentation>
+ Type of Vlan
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType11">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="isolationStatus">
+ <xsd:annotation>
+ <xsd:documentation>
+ Isolation status
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType12">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ <xsd:complexType name="StatisticCounter">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="PbitQueue">
+ <xsd:sequence>
+ <xsd:element name="pbitKey">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType7">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="queueValue">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType7">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ <xsd:complexType name="LinkAggregationOperStateData">
+ <xsd:annotation>
+ <xsd:documentation>
+ Description of Link Aggregation Oper State Data
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="lacpActivity">
+ <xsd:annotation>
+ <xsd:documentation>
+ Indicates LACP activity
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType13">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="lacpTimeout">
+ <xsd:annotation>
+ <xsd:documentation>
+ Indicates if LACP timeout is long or short
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType14">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="aggregation">
+ <xsd:annotation>
+ <xsd:documentation>
+ Indicates if Individual or Aggregatable
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType15">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="syncronization">
+ <xsd:annotation>
+ <xsd:documentation>
+ Indicates if Syncronized or not
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType16">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="collecting">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType17">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="distributing">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType17">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="defaulted">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType17">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="expired">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType17">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ <xsd:complexType name="MxbSlot">
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType18">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="TresholdPercent">
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType19">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="PbitToQueueMapping">
+ <xsd:annotation>
+ <xsd:documentation>
+ Description of Pbit to queue mapping
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="bladeSlotLink" type="BladeSlotLink"/>
+ <xsd:element name="interface">
+ <xsd:annotation>
+ <xsd:documentation>
+ Interface number
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="pbitQueue">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="item" type="PbitQueue" minOccurs="8" maxOccurs="8"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ <xsd:complexType name="VlanIds">
+ <xsd:sequence>
+ <xsd:element name="vlanId">
+ <xsd:annotation>
+ <xsd:documentation>
+ Vlan Id
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType10">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ <xsd:element name="model">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Vlan" minOccurs="0" maxOccurs="1">
+ <xsd:annotation>
+ <xsd:documentation>
+ Administrative and Operative Vlans
+
+ Key attributes: []
+
+ Possible children:
+ VlanAdmin
+ VlanOper
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="VlanAdmin" minOccurs="0" maxOccurs="31">
+ <xsd:annotation>
+ <xsd:documentation>
+ This class shows the Administrative configured Vlans
+
+ Key attributes: [subrackNum]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="subrackNum" type="SubrackNum"/>
+ <xsd:element minOccurs="0" name="numberOfDefinedVlans">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="vlanIds">
+ <xsd:annotation>
+ <xsd:documentation>
+ Information about defined Vlan Ids
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="item" type="VlanIds" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="VlanOper" minOccurs="0" maxOccurs="31">
+ <xsd:annotation>
+ <xsd:documentation>
+ This class shows the Operative Vlans
+
+ Key attributes: [subrackNum]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="subrackNum" type="SubrackNum"/>
+ <xsd:element minOccurs="0" name="numberOfActiveVlans">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="vlanIds">
+ <xsd:annotation>
+ <xsd:documentation>
+ Information about operative Vlan Ids
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="item" type="VlanIds" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Cos" minOccurs="0" maxOccurs="1">
+ <xsd:annotation>
+ <xsd:documentation>
+ This class describes the Class of Service function.
+
+ Key attributes: []
+
+ Possible children:
+ Pbit
+ Queue
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element minOccurs="0" name="administrativeQueueConfiguration">
+ <xsd:annotation>
+ <xsd:documentation>
+ Description of administrative Queue Configuration Data
+ to be applied for each subrack (or whole system?)
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="item" type="CosQueueConfigurationData" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="administrativePbitToQueueMapping">
+ <xsd:annotation>
+ <xsd:documentation>
+ Description of administrative Pbit to Queue mapping.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="item" type="PbitToQueueMapping" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="operationalQueueConfiguration">
+ <xsd:annotation>
+ <xsd:documentation>
+ Description operational Queue Configuration Data
+ to be applied for actual subrack and Mxb.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="item" type="CosQueueConfigurationData" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="operationalPbitToQueueMapping">
+ <xsd:annotation>
+ <xsd:documentation>
+ Description of operational Pbit to Queue mapping.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="item" type="PbitToQueueMapping" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Pbit" minOccurs="0" maxOccurs="8">
+ <xsd:annotation>
+ <xsd:documentation>
+ This class is used to set the Pbit to queue table.
+
+ Key attributes: [bladeSlotLink]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="bladeSlotLink" type="BladeSlotLink"/>
+ <xsd:element minOccurs="0" name="pbitQueue">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="item" type="PbitQueue" minOccurs="8" maxOccurs="8"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Queue" minOccurs="0" maxOccurs="8">
+ <xsd:annotation>
+ <xsd:documentation>
+ This class is used to set the Queue Data table.
+
+ Key attributes: [queueKey]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="queueKey">
+ <xsd:annotation>
+ <xsd:documentation>
+ Queue value 0 to 7.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType7">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="queueData">
+ <xsd:annotation>
+ <xsd:documentation>
+ Queue Configuration Data to be applied for the whole system.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="item" type="CosQueueConfigurationData" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="State" minOccurs="0" maxOccurs="1">
+ <xsd:annotation>
+ <xsd:documentation>
+ This class describes data to be read for a Mxb.
+
+ Key attributes: []
+
+ Possible children:
+ StateBlade
+ StateLink
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="StateBlade" minOccurs="0" maxOccurs="64">
+ <xsd:annotation>
+ <xsd:documentation>
+ This class describes data related to a specific Mxb.
+
+ Key attributes: [subrackNum,mxbSlot]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="subrackNum" type="SubrackNum"/>
+ <xsd:element name="mxbSlot" type="MxbSlot"/>
+ <xsd:element minOccurs="0" name="description">
+ <xsd:annotation>
+ <xsd:documentation>
+ Description of type of Mxb.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType4">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="ipAddress">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType4">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="upTime">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType4">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="remoteMxbHost">
+ <xsd:annotation>
+ <xsd:documentation>
+ Indicates if the other Mxb in the subrack is present or absent.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType4">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="executingSoftwareVersion">
+ <xsd:annotation>
+ <xsd:documentation>
+ Software version executing.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType4">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="flashLoadedSoftwareVersion">
+ <xsd:annotation>
+ <xsd:documentation>
+ Software version in flash memory.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType4">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="fallbackSoftwareVersion">
+ <xsd:annotation>
+ <xsd:documentation>
+ Fallback software version.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType4">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="ipmiFirmwareVersion">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType4">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="bootLoaderVersion">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType4">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="hwVersion">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType4">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="StateLink" minOccurs="0" maxOccurs="1">
+ <xsd:annotation>
+ <xsd:documentation>
+ This class describes actual state data for a specific link
+ related to the Mxb.
+
+ Key attributes: []
+
+ Possible children:
+ StateLa
+ StateVlan
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="StateLa" minOccurs="0" maxOccurs="1536">
+ <xsd:annotation>
+ <xsd:documentation>
+ This class describes the state of the Blade Slot Links with
+ regards to Link Aggregation info.
+
+ Key attributes: [subrackNum,bladeSlotLink,mxbSlot]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="subrackNum" type="SubrackNum"/>
+ <xsd:element name="bladeSlotLink" type="BladeSlotLink"/>
+ <xsd:element name="mxbSlot" type="MxbSlot"/>
+ <xsd:element minOccurs="0" name="linkAggregationData">
+ <xsd:annotation>
+ <xsd:documentation>
+ Description of Link Aggregation info for
+ actual subrack, Mxb and Blade Slot Link.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="item" type="LinkAggregationData" minOccurs="16" maxOccurs="16"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="StateVlan" minOccurs="0" maxOccurs="768">
+ <xsd:annotation>
+ <xsd:documentation>
+ This class describes the state of the Blade Slot Links with
+ regards to Vlan info.
+
+ Key attributes: [subrackNum,bladeSlotLink]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="subrackNum" type="SubrackNum"/>
+ <xsd:element name="bladeSlotLink" type="BladeSlotLink"/>
+ <xsd:element minOccurs="0" name="vlanData">
+ <xsd:annotation>
+ <xsd:documentation>
+ Description of Vlans for actual subrack and Blade Slot Link
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="item" type="VlanData" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Pm" minOccurs="0" maxOccurs="1">
+ <xsd:annotation>
+ <xsd:documentation>
+ This class describes the Performance Monitoring function.
+
+ Key attributes: []
+
+ Possible children:
+ PmBladeMeasure
+ PmLink
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element minOccurs="0" name="cpuUpperTreshold" type="TresholdPercent">
+ <xsd:annotation>
+ <xsd:documentation>
+ Configuration of CPU upper treshold, i.e. when the CPU load
+ is rising and crosses this treshold then the PMON function
+ in ISS will raise a CPU alarm.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="cpuLowerTreshold" type="TresholdPercent">
+ <xsd:annotation>
+ <xsd:documentation>
+ CPU lower treshold, i.e. when the CPU load
+ is falling and crosses this treshold then the
+ PM function in ISS will cease the CPU alarm.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="cpuUsageSamplingPeriod">
+ <xsd:annotation>
+ <xsd:documentation>
+ The sampling period during which CPU usage is measured.
+ This period is given in seconds.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="memoryUpperTreshold">
+ <xsd:annotation>
+ <xsd:documentation>
+ Memory upper treshold, i.e. when the Memory usage
+ is rising and crosses this treshold then the PM
+ function in ISS will raise a Memory alarm.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="memoryLowerTreshold" type="TresholdPercent">
+ <xsd:annotation>
+ <xsd:documentation>
+ Memory lower treshold, i.e. when the Memory usage
+ is falling and crosses this treshold then the PM
+ function in ISS will cease the Memory alarm.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="bandwidthUpperTreshold" type="TresholdPercent">
+ <xsd:annotation>
+ <xsd:documentation>
+ Bandwidth upper treshold, i.e. when the Bandwidth
+ usage is rising and crosses this treshold then the PM
+ function in ISS will raise a Bandwidth alarm.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="bandwidthLowerTreshold" type="TresholdPercent">
+ <xsd:annotation>
+ <xsd:documentation>
+ Bandwidth lower treshold, i.e. when the Bandwidth usage
+ is falling and crosses this treshold then the PM function
+ in ISS will cease the Bandwidth alarm.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="bandwidthUsageSamplingPeriod">
+ <xsd:annotation>
+ <xsd:documentation>
+ The sampling period during which Bandwidth usage is measured.
+ This period is given in minutes.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="PmBladeMeasure" minOccurs="0" maxOccurs="64">
+ <xsd:annotation>
+ <xsd:documentation>
+ Enabling monitoring of CPU and memory usage and reading
+ the corresponding values of utilisation in percent.
+
+ Key attributes: [subrackNum,mxbSlot]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="subrackNum" type="SubrackNum"/>
+ <xsd:element name="mxbSlot" type="MxbSlot"/>
+ <xsd:element name="typeOfMeasurement">
+ <xsd:annotation>
+ <xsd:documentation>
+ Type of measurement to be performed, i.e. CPU or Memory.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType20">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="status">
+ <xsd:annotation>
+ <xsd:documentation>
+ Start or stop performance measurement of a specific type
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType21">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="usage" type="PercentUsage">
+ <xsd:annotation>
+ <xsd:documentation>
+ This is the value of the usage in percent when
+ performing the measurement.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="memoryUsageBytes">
+ <xsd:annotation>
+ <xsd:documentation>
+ This is the value of Memory usage in bytes when
+ performing a Memory usage measurement.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="PmLink" minOccurs="0" maxOccurs="1">
+ <xsd:annotation>
+ <xsd:documentation>
+ Performance Management Link related data.
+
+ Key attributes: []
+
+ Possible children:
+ PmBwMeasure
+ PmStatistics
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="PmBwMeasure" minOccurs="0" maxOccurs="1536">
+ <xsd:annotation>
+ <xsd:documentation>
+ Enabling monitoring Bandwidth usage and reading the
+ corresponding values of utilisation in percent.
+
+ Key attributes: [subrackNum,bladeSlotLink,mxbSlot]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="subrackNum" type="SubrackNum"/>
+ <xsd:element name="bladeSlotLink" type="BladeSlotLink"/>
+ <xsd:element name="mxbSlot" type="MxbSlot"/>
+ <xsd:element name="status">
+ <xsd:annotation>
+ <xsd:documentation>
+ Start or stop measuring of bandwidth utilisation.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType21">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="bandwidthUsage" type="PercentUsage">
+ <xsd:annotation>
+ <xsd:documentation>
+ This is the value of the average Bandwidth usage in percent
+ during the configured sampling period.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="PmStatistics" minOccurs="0" maxOccurs="1536">
+ <xsd:annotation>
+ <xsd:documentation>
+ This class describes the Performance
+ Monitoring Statistics; i.e. counters
+ for each backplane port on the Mxb,
+ the actual speed used on the port and
+ if the port operates in full or half duplex mode.
+
+ Key attributes: [subrackNum,bladeSlotLink,mxbSlot]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="subrackNum" type="SubrackNum"/>
+ <xsd:element name="bladeSlotLink" type="BladeSlotLink"/>
+ <xsd:element name="mxbSlot" type="MxbSlot"/>
+ <xsd:element minOccurs="0" name="inOctets" type="StatisticCounter">
+ <xsd:annotation>
+ <xsd:documentation>
+ Performance Monitoring counter for
+ received octets.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="inUnicastPackets" type="StatisticCounter">
+ <xsd:annotation>
+ <xsd:documentation>
+ Performance Monitoring counter for
+ received Unicast Packets
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="inMulticastPackets" type="StatisticCounter">
+ <xsd:annotation>
+ <xsd:documentation>
+ Performance Monitoring counter for
+ received Multicast Packets
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="inBroadcastPackets" type="StatisticCounter">
+ <xsd:annotation>
+ <xsd:documentation>
+ Performance Monitoring counter for
+ received Broadcast Packets
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="inOctetsDiscarded" type="StatisticCounter">
+ <xsd:annotation>
+ <xsd:documentation>
+ Performance Monitoring counter
+ for number of received discarded octets.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="inOctetsFaulty" type="StatisticCounter">
+ <xsd:annotation>
+ <xsd:documentation>
+ Performance Monitoring counter
+ for number of received faulty octets.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="inUnknownProtocol" type="StatisticCounter">
+ <xsd:annotation>
+ <xsd:documentation>
+ Performance Monitoring counter
+ for number of received Unknown Protocol packets.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="outOctets" type="StatisticCounter">
+ <xsd:annotation>
+ <xsd:documentation>
+ Performance Monitoring counter for
+ octets in send buffer.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="outUnicastPackets" type="StatisticCounter">
+ <xsd:annotation>
+ <xsd:documentation>
+ Performance Monitoring counter for
+ Unicast Packets in send buffer.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="outMulticastPackets" type="StatisticCounter">
+ <xsd:annotation>
+ <xsd:documentation>
+ Performance Monitoring counter for
+ Multicast Packets in send buffer.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="outBroadcastPackets" type="StatisticCounter">
+ <xsd:annotation>
+ <xsd:documentation>
+ Performance Monitoring counter for
+ Broadcast Packets in send buffer.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="framesOpcodePause" type="StatisticCounter">
+ <xsd:annotation>
+ <xsd:documentation>
+ Performance Monitoring counter for
+ Frames with Op code Pause
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="framesExceedingMaxFramesize" type="StatisticCounter">
+ <xsd:annotation>
+ <xsd:documentation>
+ Performance Monitoring counter for
+ Frames exceeding maximum frame size.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:simpleType name="ccsHelperType21">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="on"/>
+ <xsd:enumeration value="off"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType20">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="cpu"/>
+ <xsd:enumeration value="memory"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType19">
+ <xsd:restriction base="xsd:integer">
+ <xsd:minInclusive value="50"/>
+ <xsd:maxInclusive value="100"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType18">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="left"/>
+ <xsd:enumeration value="right"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType17">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="yes"/>
+ <xsd:enumeration value="no"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType16">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="inSync"/>
+ <xsd:enumeration value="outOfSync"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType15">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="individual"/>
+ <xsd:enumeration value="aggregatable"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType14">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="long"/>
+ <xsd:enumeration value="short"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType13">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="passive"/>
+ <xsd:enumeration value="active"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType12">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="protected"/>
+ <xsd:enumeration value="isolatable"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType11">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="static"/>
+ <xsd:enumeration value="dynamic"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType10">
+ <xsd:restriction base="xsd:integer">
+ <xsd:minInclusive value="1"/>
+ <xsd:maxInclusive value="4094"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType9">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="notUsed"/>
+ <xsd:enumeration value="high"/>
+ <xsd:enumeration value="medium"/>
+ <xsd:enumeration value="low"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType8">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="notUsed"/>
+ <xsd:enumeration value="wrr"/>
+ <xsd:enumeration value="strictpriority"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType7">
+ <xsd:restriction base="xsd:integer">
+ <xsd:minInclusive value="0"/>
+ <xsd:maxInclusive value="7"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType6">
+ <xsd:restriction base="xsd:integer">
+ <xsd:minInclusive value="1"/>
+ <xsd:maxInclusive value="24"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType5">
+ <xsd:restriction base="xsd:integer">
+ <xsd:minInclusive value="0"/>
+ <xsd:maxInclusive value="100"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType4">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType3">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="srcMAC"/>
+ <xsd:enumeration value="dstMAC"/>
+ <xsd:enumeration value="srcAndDstMAC"/>
+ <xsd:enumeration value="srcIP"/>
+ <xsd:enumeration value="dstIP"/>
+ <xsd:enumeration value="srcAndDstIP"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType2">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="dynamic"/>
+ <xsd:enumeration value="force"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType1">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="lacp"/>
+ <xsd:enumeration value="manual"/>
+ <xsd:enumeration value="disable"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType0">
+ <xsd:restriction base="xsd:integer">
+ <xsd:minInclusive value="0"/>
+ <xsd:maxInclusive value="31"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+</xsd:schema>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/MyBsModel_1.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/MyBsModel_1.xsd
new file mode 100644
index 0000000000..5ec3434a65
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/MyBsModel_1.xsd
@@ -0,0 +1,502 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ericsson.com/is/isco/MyBsModel_1" xmlns="http://www.ericsson.com/is/isco/MyBsModel_1" xmlns:nc="http://www.ericsson.com/is/isco/nc" xmlns:IsTypes="http://www.ericsson.com/is/isco/IsTypes">
+ <xsd:annotation>
+ <xsd:appinfo>
+ <mim file="myTest_mim.xml" version="/main/R2A/10"/>
+ <mim file="other_mim.xml" version=""/>
+ </xsd:appinfo>
+ </xsd:annotation>
+ <xsd:import schemaLocation="nc.xsd" namespace="http://www.ericsson.com/is/isco/nc"/>
+ <xsd:import schemaLocation="IsTypes.xsd" namespace="http://www.ericsson.com/is/isco/IsTypes"/>
+ <xsd:complexType name="uselessStruct">
+ <xsd:sequence>
+ <xsd:element name="field1">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType4">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="field2" type="myInteger"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ <xsd:complexType name="myNamedStruct">
+ <xsd:annotation>
+ <xsd:documentation>
+ Struct description
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="counter">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType5">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="state" type="stateType"/>
+ <xsd:element name="dummyStructRef" type="uselessStruct"/>
+ <xsd:element name="dummySequence">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="item" type="uselessStruct" minOccurs="3" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="inlineStruct">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="a" type="InternalImport"/>
+ <xsd:element name="b">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType6">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="c">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType7">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ <xsd:complexType name="myInteger">
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType8">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="namedMoRefType">
+ <xsd:annotation>
+ <xsd:documentation>
+ A named type which is an MO Reference pointing to
+ * MyClass
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType9">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="stateType">
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType10">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="blippName">
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType11">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="yesNoEnum">
+ <xsd:annotation>
+ <xsd:documentation>
+ Enum which can be yes or no
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType12">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="uselessEnum">
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType13">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="InternalImport">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:integer">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="MyClass_SeqType3">
+ <xsd:sequence>
+ <xsd:element name="item" type="MyClass_InternalType" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ <xsd:complexType name="MyClass_myDateAndTimeType">
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType0">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="MyClass_SeqType2">
+ <xsd:sequence>
+ <xsd:element name="item" type="uselessStruct" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ <xsd:complexType name="MyClass_InternalType">
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType1">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="MyClass_classInternalEnum">
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType2">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ <xsd:complexType name="MyClass_SeqType1">
+ <xsd:sequence>
+ <xsd:element name="item" minOccurs="3" maxOccurs="3">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType3">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ <xsd:element name="model">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Blipp" minOccurs="0" maxOccurs="2">
+ <xsd:annotation>
+ <xsd:documentation>
+ This is a class which can be assigned as an attribute of ChildClass.
+ Key attribute is 'id'.
+
+ Key attributes: [id]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="id" type="blippName"/>
+ <xsd:element minOccurs="0" name="truefalse" type="uselessEnum"/>
+ <xsd:element minOccurs="0" name="ipAddress" type="IsTypes:IpAddress"/>
+ <xsd:element minOccurs="0" name="macAddress" type="IsTypes:MacAddress"/>
+ <xsd:element minOccurs="0" name="moAttributeDeep">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType14">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="MyClass" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ My Test Class
+ The class hierarky looks like this:
+
+ +==========+
+ |MountPoint|
+ +==========+
+ / \
+ / \
+ +=======+ +=======+
+ | Blipp | |MyClass|
+ +=======+ +=======+
+ |
+ |
+ +==========+
+ |ChildClass|
+ +==========+
+
+ Key attributes: [id1,id2]
+
+ Possible children:
+ ChildClass:
+ Definition of children under MyClass
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="id1">
+ <xsd:annotation>
+ <xsd:documentation>
+ Test class identifyer - part1
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType15">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="id2">
+ <xsd:annotation>
+ <xsd:documentation>
+ Test class identifyer - part2
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType16">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="date">
+ <xsd:annotation>
+ <xsd:documentation>
+ Date
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType17">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="date2" type="MyClass_myDateAndTimeType">
+ <xsd:annotation>
+ <xsd:documentation>
+ Date2 - named type
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="list">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="item" minOccurs="3" maxOccurs="3">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType3">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="list2" type="MyClass_SeqType2"/>
+ <xsd:element minOccurs="0" name="list3" type="MyClass_SeqType3"/>
+ <xsd:element minOccurs="0" name="yesNo" type="yesNoEnum"/>
+ <xsd:element minOccurs="0" name="commonStruct" type="myNamedStruct">
+ <xsd:annotation>
+ <xsd:documentation>
+ Attribute description.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="dummyInternal" type="MyClass_InternalType"/>
+ <xsd:element minOccurs="0" name="trueOrFalse">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType7">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="ChildClass" minOccurs="0" maxOccurs="2">
+ <xsd:annotation>
+ <xsd:documentation>
+ Child of MyClass
+
+ Key attributes: [id]
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="id">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType18">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="moAttribute">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="ccsHelperType19">
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element minOccurs="0" name="moAttributeNamed" type="namedMoRefType"/>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute ref="nc:operation"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:simpleType name="ccsHelperType19">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:pattern value="((/IntegratedSite:model/)|((\.\./)+)|((\./)(\.\./)*)|())((([A-Z][a-zA-Z0-9]+:model)|([A-Z][a-zA-Z0-9]+(\[[a-z][a-zA-Z0-9]*='[^\]]+'\])*))/)*Blipp\[id='[^\]]+'\]"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType18">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="20"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType17">
+ <xsd:restriction base="xsd:dateTime">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minInclusive value="2006-03-08T00:00:00.567Z"/>
+ <xsd:maxInclusive value="2006-03-08T23:59:59Z"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType16">
+ <xsd:restriction base="xsd:integer">
+ <xsd:minInclusive value="1"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType15">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="Obj"/>
+ <xsd:enumeration value="MO"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType14">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:pattern value="((/IntegratedSite:model/)|((\.\./)+)|((\./)(\.\./)*)|())((([A-Z][a-zA-Z0-9]+:model)|([A-Z][a-zA-Z0-9]+(\[[a-z][a-zA-Z0-9]*='[^\]]+'\])*))/)*ChildClass\[id='[^\]]+'\]"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType13">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="true"/>
+ <xsd:enumeration value="false"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType12">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="yes"/>
+ <xsd:enumeration value="no"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType11">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="name1"/>
+ <xsd:enumeration value="name2"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType10">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="locked"/>
+ <xsd:enumeration value="active"/>
+ <xsd:enumeration value="idle"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType9">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:pattern value="((/IntegratedSite:model/)|((\.\./)+)|((\./)(\.\./)*)|())((([A-Z][a-zA-Z0-9]+:model)|([A-Z][a-zA-Z0-9]+(\[[a-z][a-zA-Z0-9]*='[^\]]+'\])*))/)*MyClass\[id1='[^\]]+'\]\[id2='[^\]]+'\]"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType8">
+ <xsd:restriction base="xsd:integer">
+ <xsd:minInclusive value="1"/>
+ <xsd:maxInclusive value="100"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType7">
+ <xsd:restriction base="xsd:boolean">
+ <xsd:pattern value="(true|false)"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType6">
+ <xsd:restriction base="xsd:float">
+ <xsd:minInclusive value="0.00"/>
+ <xsd:maxInclusive value="1.00"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType5">
+ <xsd:restriction base="xsd:integer">
+ <xsd:minInclusive value="0"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType4">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:maxLength value="20"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType3">
+ <xsd:restriction base="xsd:integer">
+ <xsd:minInclusive value="0"/>
+ <xsd:maxInclusive value="3"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType2">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="a"/>
+ <xsd:enumeration value="b"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType1">
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="hei"/>
+ <xsd:enumeration value="hopp"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ccsHelperType0">
+ <xsd:restriction base="xsd:dateTime">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minInclusive value="2006-03-15T00:00:00.567Z"/>
+ <xsd:maxInclusive value="2006-03-15T23:59:59Z"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+</xsd:schema>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/bs_mim.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/bs_mim.xml
new file mode 100644
index 0000000000..8846c05878
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/bs_mim.xml
@@ -0,0 +1,1187 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+
+<!--
+
+Copyright (C) Ericsson AB 2006-2007 All rights reserved.
+
+The information in this document is the property of Ericsson.
+
+Except as specifically authorized in writing by Ericsson, the
+receiver of this document shall keep the information contained
+herein confidential and shall protext the same in whole or in part
+from disclosure and dissemination to third parties.
+
+Disclosure and disseminations to the receivers employees shall
+only be made on a strict need to know basis.
+
+-->
+
+
+<mim xmlns="http://www.ericsson.com/is/isco/mim/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ericsson.com/is/isco/mim/2.0 /vobs/isac/sis/OAM_CRA1190047_1/CCS_CNA113082/doc/15519/mim.xsd ">
+
+ <!--
+ DataType Definitions
+ -->
+ <dataType name="HwmAdministrativeState">
+ <description>
+ The administrative state of blades/blade systems.
+ Reflects what the administrator has done.
+ </description>
+ <string>
+ <validValues>
+ <value name="locked"/>
+ <value name="shuttingdown"/>
+ <value name="unlocked"/>
+ </validValues>
+ </string>
+ </dataType>
+
+ <dataType name="HwmOperationalState">
+ <description>
+ The operational state of blades/blade systems.
+ Reflects if the entity is on/off.
+ </description>
+ <string>
+ <validValues>
+ <value name="disabled"/>
+ <value name="enabled"/>
+ </validValues>
+ </string>
+ </dataType>
+
+ <dataType name="HwmAvailabilityStatus">
+ <description>
+ The availability state of blades/blade systems.
+ Reflects if the entity is useable or not.
+ </description>
+ <string>
+ <validValues>
+ <value name="available"/>
+ <value name="failed"/>
+ <value name="offLine"/>
+ <value name="dependency"/>
+ <value name="degraded"/>
+ <value name="upgrading"/>
+ <value name="startingUp"/>
+ <value name="goingOffLine"/>
+ <value name="notInstalled"/>
+ <value name="powerOff"/>
+ </validValues>
+ </string>
+ </dataType>
+
+ <dataType name="HwmKnockOutPreference">
+ <description>
+ </description>
+ <string>
+ <validValues>
+ <value name="normal"/>
+ <value name="protected"/>
+ </validValues>
+ </string>
+ </dataType>
+
+ <dataType name="HwmBusType">
+ <description>
+ The bus type used by a blade.
+ </description>
+ <string>
+ <validValues>
+ <value name="ipmi"/>
+ <value name="mbus"/>
+ </validValues>
+ </string>
+ </dataType>
+
+ <!--
+ Class Definitions
+ -->
+
+ <class name="BladeSystems">
+ <description>
+ Parent of all blade systems.
+ </description>
+ <singleton/>
+ <systemCreated/>
+ </class>
+
+ <class name="BladeSystem">
+ <description>
+ This class describes a Blade System.
+ It serves as a mountpoint for the blade system specific model.
+ </description>
+
+ <!-- Attributes from HWM -->
+
+ <attribute name="name">
+ <description>
+ A user friendly Blade System name, must be set at creation and can be
+ changed when BS is locked.
+ </description>
+ <dataType><string/></dataType>
+ <key/>
+ </attribute>
+
+ <attribute name="no">
+ <description>
+ An identifier for the BS. A new integer has to be used every time a new
+ BS is created.
+ </description>
+ <dataType><integer/></dataType>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="type">
+ <description>
+ </description>
+ <dataType><string/></dataType>
+ <mandatory/>
+ <restricted/>
+ </attribute>
+
+ <attribute name="softwareGroupId">
+ <description>
+ The identity of the Software Group (SWG) that the BS implements.
+ </description>
+ <dataType><string/></dataType>
+ <restricted/>
+ <mandatory/>
+ </attribute>
+
+ <attribute name="softwareGroupRevision">
+ <description>
+ The revision of the Software Group (SWG) that the BS implements.
+ </description>
+ <dataType><string/></dataType>
+ <restricted/>
+ <mandatory/>
+ </attribute>
+
+ <attribute name="softwareCorrectionPackageId">
+ <description>
+ The identity of the correction package (CXR) applied to the SWG.
+ </description>
+ <dataType><string/></dataType>
+ </attribute>
+
+ <attribute name="softwareCorrectionPackageRevision">
+ <description>
+ The revision of the correction package (CXR) applied to the SWG
+ </description>
+ <dataType><string/></dataType>
+ </attribute>
+
+ <attribute name="admState">
+ <description>The administrative state of the Blade System.</description>
+ <dataType name.ref="HwmAdministrativeState"/>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="opState">
+ <description>The operational state of the Blade System.</description>
+ <dataType name.ref="HwmOperationalState"/>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="availStatus">
+ <description>The availability status of the Blade System.</description>
+ <dataType name.ref="HwmAvailabilityStatus"/>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="bsdName">
+ <description>
+ The identity of the Blade System domain the Blade system belongs to.
+ </description>
+ <dataType><string/></dataType>
+ </attribute>
+
+ <!-- Attributes from CPD -->
+
+ <attribute name="bsomAddress">
+ <description>
+ IP address of the Blade System OaM Master.
+ </description>
+ <dataType name.ref="IsTypes:IpAddress"/>
+ <readOnly/>
+ </attribute>
+
+ <action name="lock">
+ <description>
+ Locks the blade system. If the system already is locked the
+ action does nothing.
+ </description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+
+ <action name="unlock">
+ <description>
+ Unlocks the blade system. If the system already is unlocked the
+ action does nothing. This operation orders the blade system to be unlocked.
+ However the blade system may not be unlocked even if this order works.
+ See the operational state to figure out if the unlock succeded.
+ </description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+
+ <action name="shutdown">
+ <description>
+ Shuts down the blade system. If the system already is locked the
+ action does nothing.
+ </description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+
+ <action name="createBackup">
+ <description>
+ Action to create a backup file from the current
+ Blade System. It is stored locally on disk.
+ An instance of the MO class
+ Software/Jobs/Backup/Create is created as a log of this
+ action.
+ </description>
+ <returnType>
+ <dataType><string/></dataType><!-- return ok | {fault,Reason} ? -->
+ </returnType>
+ <parameter name="backupJobName">
+ <description>
+ A user specified backup creation job name
+ </description>
+ <dataType><string/></dataType>
+ <isOptional/>
+ </parameter>
+ </action>
+
+ <action name="restoreBackup">
+ <description>
+ Action to restore a backup into the current
+ Blade System. It is fetched from the local disk.
+ An instance of the MO class
+ Software/Jobs/Backup/Restore is created as a log of this
+ action.
+ </description>
+ <returnType>
+ <dataType><string/></dataType><!-- return ok | {fault,Reason} ? -->
+ </returnType>
+ <parameter name="backupId">
+ <description>
+ The IS site local backup identity
+ </description>
+ <dataType name.ref="IsTypes:Unsigned32">
+ </dataType>
+ </parameter>
+ <parameter name="restoreJobName">
+ <description>
+ A user specified backup restore job name
+ </description>
+ <dataType><string/></dataType>
+ <isOptional/>
+ </parameter>
+ </action>
+
+ <action name="upgrade">
+ <description>
+ Action to upgrade the current Blade System. Files
+ are fetched from the local disk storage.
+ An instance of the MO class
+ Software/Jobs/Upgrade is created as a log of this
+ action.
+ </description>
+ <returnType>
+ <dataType><string/></dataType><!-- return ok | {fault,Reason} ? -->
+ </returnType>
+ <parameter name="upgradeJobName">
+ <description>
+ A user specified ugrade job name
+ </description>
+ <dataType><string/></dataType>
+ <isOptional/>
+ </parameter>
+ <parameter name="swgProdNr">
+ <description>
+ The Ericsson product number of blade system software group
+ </description>
+ <dataType><string/></dataType>
+ <isOptional/>
+ </parameter>
+ <parameter name="swgRevision">
+ <description>
+ The Ericsson revision of blade system software group
+ </description>
+ <dataType><string/></dataType>
+ <isOptional/>
+ </parameter>
+ <parameter name="cxrProdNr">
+ <description>
+ The Ericsson product number of software correction package
+ </description>
+ <dataType><string/></dataType>
+ <isOptional/>
+ </parameter>
+ <parameter name="cxrProdRevision">
+ <description>
+ The Ericsson revision of software correction package
+ </description>
+ <dataType><string/></dataType>
+ <isOptional/>
+ </parameter>
+ <parameter name="bladeSwgProdNr">
+ <description>
+ The Ericsson product number of blade software group
+ </description>
+ <dataType><string/></dataType>
+ <isOptional/>
+ </parameter>
+ <parameter name="bladeSwgProdRevison">
+ <description>
+ The Ericsson revision of blade software group
+ </description>
+ <dataType><string/></dataType>
+ <isOptional/>
+ </parameter>
+ <parameter name="maxTime">
+ <description>
+ The maximum time allowed to finish the entire
+ software change procedure (minutes).
+ Default value depends on blade system software.
+ </description>
+ <dataType name.ref="IsTypes:Unsigned32">
+ </dataType>
+ <isOptional/>
+ </parameter>
+ </action>
+ </class>
+
+
+ <class name="Blade">
+ <description>
+ This class describes a Blade.
+ A Blade is identified by the subrack and slot number.
+ </description>
+
+ <!-- Attributes from HWM -->
+
+ <attribute name="subrackId">
+ <description>
+ A reference to the associated subrack (i.e. the value of 'subrackId'
+ for the associated subrack)
+ </description>
+ <dataType>
+ <integer><range><min>0</min><max>31</max></range></integer>
+ </dataType>
+ <key/>
+ </attribute>
+
+ <attribute name="slotNo">
+ <description>The slot number for this Blade within the subrack.</description>
+ <dataType>
+ <integer><range><min>0</min><max>25</max></range></integer>
+ </dataType>
+ <key/>
+ </attribute>
+
+ <attribute name="slotLabel">
+ <description>
+ The slot label of the blade. Will only be set at creation.
+ This should be used in alarms related to the slot to inform the
+ operator of what position in the subrack the blade is located in.
+ E.g. for GEM subracks it will be a string like X02 for slot 0
+ up to X80 for slot 25.
+ </description>
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="bsNo">
+ <description>
+ An identifier for the BS to which the blade belongs.
+ A value of 0 means that the blade is inserted in the subrack but it
+ has not been configured to any BS yet.
+ </description>
+ <dataType><integer/></dataType>
+ </attribute>
+
+ <attribute name="type">
+ <description>
+ The type of the Blade defined by a string BladeTypeId.
+ </description>
+ <dataType><string/></dataType>
+ <restricted/>
+ <mandatory/>
+ </attribute>
+
+ <attribute name="swgLowestId">
+ <description>The expectedregistered SW group id of the Blade.</description>
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="swgLowestRev">
+ <description>The registered SW group revision state of the Blade.</description>
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="swgActualId">
+ <description>The installed SW group id of the Blade.</description>
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="swgActualRev">
+ <description>The installed SW group revision state of the Blade.</description>
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="bsom">
+ <description>
+ Indicates if this blade is a BSOM candidate.
+ </description>
+ <dataType><boolean/></dataType>
+ </attribute>
+
+ <attribute name="knockOutPreference">
+ <description>
+ Set to protected if blade sholud no be knocked out before the
+ switch blade.
+ </description>
+ <dataType name.ref="HwmKnockOutPreference"/>
+ </attribute>
+
+ <attribute name="userLabel">
+ <description>
+ A user friendly Blade name, always possible to set.
+ Default value indicates HwmBladeType and used slot.
+ </description>
+ <dataType><string/></dataType>
+ </attribute>
+
+ <attribute name="admState">
+ <description>
+ The administrative state of the Blade.
+ </description>
+ <dataType name.ref="HwmAdministrativeState"/>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="opState">
+ <description>The operational state of the Blade.</description>
+ <dataType name.ref="HwmOperationalState"/>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="availStatus">
+ <description>The availability status of the Blade.</description>
+ <dataType name.ref="HwmAvailabilityStatus"/>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="busType">
+ <description>The type of maintenance bus on the found Blade</description>
+ <dataType name.ref="HwmBusType"/>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="prodNo">
+ <description>The Product Number of the found Blade</description>
+ <dataType><string/></dataType>
+ </attribute>
+
+ <attribute name="prodRev">
+ <description>The Product Revision of the found Blade.</description>
+ <dataType><string/></dataType>
+ </attribute>
+
+ <attribute name="serialNo">
+ <description>The Serial Number of the found Blade.</description>
+ <dataType><string/></dataType>
+ </attribute>
+
+ <attribute name="prodName">
+ <description>The Product Name of the found Blade.</description>
+ <dataType><string/></dataType>
+ </attribute>
+
+ <attribute name="vendor">
+ <description>The Vendor name of the found Blade.</description>
+ <dataType><string/></dataType>
+ </attribute>
+
+ <attribute name="mfgDate">
+ <description>The manufacturing date of the found Blade.</description>
+ <dataType><string/></dataType>
+ </attribute>
+
+ <attribute name="macAddressAggregate">
+ <description>The aggregated MAC address of the found Blade.</description>
+ <dataType name.ref="IsTypes:MacAddress"/>
+ </attribute>
+
+ <attribute name="macAddressLeft">
+ <description>
+ The left link MAC address of the found Blade. Only used by some blades
+ </description>
+ <dataType name.ref="IsTypes:MacAddress"/>
+ </attribute>
+
+ <attribute name="macAddressRight">
+ <description>
+ The right link MAC address of the found Blade. Only used by some blades
+ </description>
+ <dataType name.ref="IsTypes:MacAddress"/>
+ </attribute>
+
+ <attribute name="changeDate">
+ <description>The date when the blade was last changed.</description>
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+
+ <!-- Attributes from CPD -->
+
+ <attribute name="isbsAddress">
+ <description>
+ IP address on the ISBS subnet.
+ </description>
+ <dataType name.ref="IsTypes:IpAddress"/>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="isobAddress">
+ <description>
+ IP address on the ISOB subnet.
+ </description>
+ <dataType name.ref="IsTypes:IpAddress"/>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="islctAddress">
+ <description>
+ IP address on the ISLCT subnet.
+ </description>
+ <dataType name.ref="IsTypes:IpAddress"/>
+ <readOnly/>
+ </attribute>
+
+ <action name="lock">
+ <description>
+ Locks the blade. If the blade already is locked the
+ action does nothing. This operation orders the blade to be locked.
+ It may however take long time before it happens.
+ </description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+
+ <action name="unlock">
+ <description>
+ Unlocks the blade. If the blade already is unlocked the
+ action does nothing. This operation orders the blade to be unlocked.
+ However the blade may not be unlocked even if this order works.
+ See the operational state to figure out if the unlock succeded.
+ </description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+
+ <action name="shutdown">
+ <description>
+ Shuts down the blade. If the blade already is locked the
+ action does nothing.
+ </description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ <action name="upgrade">
+ <description>
+ Action to upgrade the current blade. Files
+ are fetched from the local disk storage.
+ An instance of the MO class
+ Software/Jobs/Upgrade is created as a log of this
+ action.
+ </description>
+ <returnType>
+ <dataType><string/></dataType><!-- return ok | {fault,Reason} ? -->
+ </returnType>
+ <parameter name="swgProdNr">
+ <dataType><string/></dataType>
+ </parameter>
+ <parameter name="swgRevision">
+ <dataType><string/></dataType>
+ </parameter>
+ <parameter name="maxTime">
+ <dataType name.ref="IsTypes:Unsigned32">
+ </dataType>
+ <isOptional/>
+ </parameter>
+ </action>
+ </class>
+
+ <class name="LinkSap">
+ <description>
+ A Blade may have one or more resilient interfaces
+ to the backplane. Such an interface is called a
+ Link Service Access Point (LSAP), which is the
+ point where you access layer 2. LSAPs are
+ automatically created and deleted along with the
+ hosting blade.
+ </description>
+ <systemCreated/>
+ <attribute name="id">
+ <description>
+ The id of a LinkSap is a number from 0 to X within the slot.
+ </description>
+ <dataType><integer/></dataType>
+ <key/><readOnly/>
+ </attribute>
+ </class>
+
+ <class name="BsNetworkConfiguration">
+ <description>
+ The MO branch where the Blade System specific
+ Network resources are mapped to blade system
+ network requirements to common Integrated Site
+ resources. This activity must be performed before
+ a new blade or blade system successfully can be
+ unlocked via the Hardware service. Some blade
+ system designers have partly pre-registered their
+ network requirements, while others demand that
+ you read the corresponding information from
+ separate Operation Procedure Instructions and
+ manually register the blade system network
+ requirements. The pre-registered network
+ requirements automates parts of the blade
+ system-specific configuration activity.
+
+ In an Integrated Site, the blade systems obtain
+ their actual network configuration dynamically in
+ runtime. When you change the network
+ configuration it will affect blade systems. In
+ order to minimize the disturbance of active blade
+ systems, the changes are normally applied in a
+ separate storage which not is visible to the
+ blade systems. In order to make use of the new
+ unpublished configuration, it must explicitly be
+ published by altering the updateMode. If the new
+ settings introduces severe problems the
+ configuration can be reverted to the old settings
+ by altering the updateMode.
+
+ The common Network configuration including
+ updateMode and its publish mechanism is specified
+ in a separate MIM called CPD MIM.
+ </description>
+ <singleton/>
+ <systemCreated/>
+ </class>
+
+ <class name="BsVlan">
+ <description>
+ A BS VLAN is mapped to one IS VLAN. A BS VLAN is
+ the requirement a Blade System have of an IS
+ VLAN. Different instances of a Blade System type
+ may call their BS VLANs the same thing but in the
+ end the IS Site Designer can choose to map them
+ to the same or different IS VLAN.
+
+ BS VLANs can either be created manually by the
+ operator or they can be automatically created
+ from pre-registered network requirements bundled
+ with the Blade System software. Regardless of
+ how they are created, each one needs to be
+ mapped to an IS VLAN before the blades can be
+ unlocked. The mapping is done with the
+ 'isVlanRef' attribute.
+
+ Different instances of a Blade System type may call
+ their BS VLANs the same thing but in the end the IS
+ Site Designer can choose to map them to the same or
+ different IS VLAN.
+ </description>
+ <attribute name="name">
+ <description>
+ Name of the BS VLAN. It is unique within the Blade System.
+ </description>
+ <dataType><string/></dataType>
+ <key/>
+ </attribute>
+ <attribute name="description">
+ <description>
+ Short description of the BS VLAN.
+ </description>
+ <dataType><string/></dataType>
+ </attribute>
+ <attribute name="private">
+ <description>
+ Setting the private attribute to true, means
+ that the corresponding IS VLAN not can be
+ used by other Blade Systems. The IS VLAN is
+ private for this particular Blade System.
+ </description>
+ <dataType><boolean/></dataType>
+ </attribute>
+ <attribute name="isVlanRef">
+ <description>
+ The mapping to a corresponding IS VLAN. This
+ mapping must be done before the blades of the
+ Blade System can be unlocked.
+ </description>
+ <dataType><moRef name="IsVlan"/></dataType>
+ </attribute>
+ </class>
+
+ <class name="BsLogicalNetwork">
+ <description>
+ A BS Logical Network (BSLN) is associated to
+ one IS Logical Network. A BS Logical Network
+ is the requirement a Blade Systems have of an
+ IS Logical Network.
+
+ BS Logical Networks can either be created
+ manually by the operator or they can be
+ automatically created from pre-registered
+ network requirements bundled with the Blade
+ System software. Regardless of how they are
+ created, each one needs to be mapped to an IS
+ Logical Network before the blades can be
+ unlocked. The mapping is done with the
+ 'isLogicalNetworkRef' attribute.
+
+ Different instances of a Blade System type may call
+ their BS Logical Networks the same thing but in
+ the end the IS Site Designer can choose to map
+ them to the same or different IS Logical
+ Network.
+ </description>
+ <attribute name="name">
+ <description>
+ Name of the BS logical network. It is unique within the Blade System.
+ </description>
+ <dataType><string/></dataType>
+ <key/>
+ </attribute>
+ <attribute name="description">
+ <description>
+ Short description of the BS Logical Network.
+ </description>
+ <dataType><string/></dataType>
+ </attribute>
+ <attribute name="private">
+ <description>
+ Flag that shows whether the BS Logical Network
+ is private for this Blade System or if it may
+ be shared among several Blade Systems.
+ </description>
+ <dataType><boolean/></dataType>
+ </attribute>
+ <attribute name="isLogicalNetworkRef">
+ <description>
+ Reference to the corresponding IS Logical Network.
+ </description>
+ <dataType><moRef name="IsLogicalNetwork"/></dataType>
+ </attribute>
+ </class>
+
+ <class name="BsSubnet">
+ <description>
+ A BS Subnet (BSSN) is associated to one IS
+ Subnet. A BS Subnet Network is the requirement a
+ Blade Systems have of an IS Subnet.
+
+ BS Subnets can either be created manually by the
+ operator or they can be automatically created
+ from pre-registered network requirements bundled
+ with the Blade System software. Regardless of
+ how they are created, each one needs to be
+ mapped to both a BS VLan and an IS Subnet before
+ blades can be unlocked via the Hardware service.
+ Each BS Subnet contains one or more BS Subnet
+ Segments. The mappings are done with the
+ 'bsVlanRef' and 'isSubnetRef' attributes.
+
+ Different instances of a Blade System type may
+ call their BS Subnets the same thing but in the
+ end the IS Site Designer can choose to map them
+ to the same or different IS Subnet.
+ </description>
+ <attribute name="name">
+ <description>
+ Name of the BS Subnet. It is unique within the BS Logical Network.
+ </description>
+ <dataType><string/></dataType>
+ <key/>
+ </attribute>
+ <attribute name="description">
+ <description>
+ Short description of the BS Subnet.
+ </description>
+ <dataType><string><defaultValue>default</defaultValue></string></dataType>
+ </attribute>
+ <attribute name="bsVlanRef">
+ <description>
+ The mapping to a corresponding BS Vlan. This
+ mapping must be done before the blades of the
+ Blade System can be unlocked.
+ </description>
+ <dataType><moRef name="BsVlan"/></dataType>
+ </attribute>
+ <attribute name="isSubnetRef">
+ <description>
+ The mapping to a corresponding IS Subnet. This
+ mapping must be done before the blades of the
+ Blade System can be unlocked.
+ </description>
+ <dataType><moRef name="IsSubnet"/></dataType>
+ </attribute>
+ </class>
+
+ <class name="BsSubnetSegment">
+ <description>
+ A BS Subnet Segment (BSSNS) is associated to one
+ IS Subnet Segment. A BS Subnet Segment is the
+ requirement a Blade Systems have of an IS Subnet
+ Segment.
+
+ BS Subnet Segments can either be created manually
+ by you or they can be automatically created from
+ pre-registered network requirements bundled with
+ the Blade System software. Regardless of how they
+ are created, each one needs to be mapped to an IS
+ Subnet Segment before the blades can be unlocked
+ via the Hardware service. The mapping is done
+ with the 'isSubnetSegmentRef' attribute.
+
+ Different instances of a Blade System type may
+ call their BS Subnet Segments the same thing but
+ in the end the IS Site Designer can choose to
+ map them to the same or different IS Subnet
+ Segment.
+ </description>
+ <attribute name="name">
+ <description>
+ Name of the BS Subnet Segment. It is unique within the BS Subnet.
+ </description>
+ <dataType><string/></dataType>
+ <key/>
+ </attribute>
+ <attribute name="description">
+ <description>
+ Short description of the BS Subnet Segment.
+ </description>
+ <dataType><string/></dataType>
+ </attribute>
+ <attribute name="numOfIpaddresses">
+ <description>
+ Number of required IP addresses in the IS Subnet Segment.
+ </description>
+ <dataType><integer/></dataType>
+ </attribute>
+ <attribute name="dhcpEnabled">
+ <description>
+ Flag that controls whether the corresponding IS
+ Subnet Segment is required to have DHCP enabled
+ or not.
+ </description>
+ <dataType><boolean/></dataType>
+ </attribute>
+ <attribute name="routerRequired">
+ <description>
+ Flag that controls whether the corresponding IS
+ Subnet Segment is required to have a router
+ configured or not.
+ </description>
+ <dataType><boolean/></dataType>
+ </attribute>
+ <attribute name="isSubnetSegmentRef">
+ <description>
+ The mapping to a corresponding IS Subnet
+ Segment. The mapping here must be done before
+ the blades of the blade system can be unlocked.
+ </description>
+ <dataType>
+ <moRef name="IsSubnetSegment"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="BsVlanSap">
+ <description>
+ There is a BS VLAN Service Access Point (BSVSAP)
+ for each Link Service Access Point that an IS
+ VLAN straddles. It is per BS VLAN Service Access
+ Point that certain VLAN properties, such as if it
+ is mandatory to enable isolation protection.
+
+ BS VLAN Service Access Points can either be
+ created manually by the operator or they can be
+ automatically created from pre-registered network
+ requirements bundled with the Blade System
+ software. Regardless of how they are created,
+ each one needs to be mapped to an Link SAP before
+ the blades can be unlocked. The mapping is done
+ with the 'linkSapRef' attribute.
+ </description>
+ <attribute name="name">
+ <description>
+ Name of the BS VLAN SAP. It is unique within the BS VLAN.
+ </description>
+ <dataType>
+ <string/>
+ </dataType>
+ <key/>
+ </attribute>
+ <attribute name="description">
+ <description>
+ Short description of the BS VLAN SAP.
+ </description>
+ <dataType>
+ <string/>
+ </dataType>
+ </attribute>
+ <attribute name="static">
+ <description>
+ Flag which controls whether this BS VLAN SAP
+ makes static or dynamic use of the
+ corresponding IS VLAN.
+ </description>
+ <dataType>
+ <boolean/>
+ </dataType>
+ </attribute>
+ <attribute name="protected">
+ <description>
+ Flag which controls whether this BS VLAN SAP should be
+ isolation protected or not.
+ </description>
+ <dataType>
+ <boolean/>
+ </dataType>
+ </attribute>
+ <attribute name="linkSapRef">
+ <description>
+ A mapping to the corresponding Link Service Access Point.
+ </description>
+ <dataType>
+ <moRef name="LinkSap"/>
+ </dataType>
+ </attribute>
+ </class>
+
+ <class name="BsIpTrafficClass">
+ <description>
+ A BS IP Traffic Class (BSIPTC) is the
+ requirement a Blade System have of an IS IP
+ Traffic Class.
+
+ BS IP Traffic Classes can either be created
+ manually by you or they can be automatically
+ created from pre-registered network requirements
+ bundled with the Blade System software. Regardless
+ of how they are created, each one needs to be
+ mapped to an IS IP Traffic Class before the blades
+ can be unlocked via the Hardware service. The
+ mapping is done with the 'isIpTrafficClassRef'
+ attribute.
+
+ Different instances of a Blade System type may
+ call their BS IP Traffic Classes the same thing but
+ in the end the IS Site Designer may choose to
+ map them to the same or different IS IP Traffic
+ Classes.
+ </description>
+ <attribute name="name">
+ <description>
+ The name of the BS IP Traffic Class. It is
+ unique within the Blade System.
+ </description>
+ <dataType><string/></dataType>
+ <key/>
+ </attribute>
+ <attribute name="description">
+ <description>
+ A short description of The BS IP Traffic Class.
+ </description>
+ <dataType><string/></dataType>
+ </attribute>
+ <attribute name="isIpTrafficClassRef">
+ <description>
+ The mapping to a corresponding IS IP Traffic
+ Class. This mapping must be done before the
+ blades of the Blade System can be unlocked.
+ </description>
+ <dataType><moRef name="IsIpTrafficClass"/></dataType>
+ </attribute>
+ </class>
+
+ <class name="BsLanTrafficClass">
+ <description>
+ A BS LAN Traffic Class (BSLANTC) is the
+ requirement a Blade System have of an IS LAN
+ Traffic Class. Different instances of a Blade
+ System type may call their BS Traffic Classes
+ the same thing but in the end the IS Site
+ Designer may choose to map them to the same or
+ different IS LAN Traffic Classes.
+
+ BS LAN Traffic Classes can either be created
+ manually by you or they can be automatically
+ created from pre-registered network requirements
+ bundled with the Blade System software. Regardless
+ of how they are created, each one needs to be
+ mapped to an IS LAN Traffic Class before the blades
+ can be unlocked via the Hardware service. The
+ mapping is done with the 'isLanTrafficClassRef'
+ attribute.
+
+ Different instances of a Blade System type may
+ call their BS LAN Traffic Classes the same
+ thing but in the end the IS Site Designer may
+ choose to map them to the same or different IS
+ LAN Traffic Classes.
+ </description>
+ <attribute name="name">
+ <description>
+ Name of the BS IP Traffic Class. It is unique within the Blade System.
+ </description>
+ <dataType><string/></dataType>
+ <key/>
+ </attribute>
+ <attribute name="description">
+ <description>
+ Short description of the BS IP Traffic Class.
+ </description>
+ <dataType><string/></dataType>
+ </attribute>
+ <attribute name="isLanTrafficClassRef">
+ <description>
+ The mapping to a corresponding IS LAN Traffic
+ Class. This mapping must be done before the
+ blades of the Blade System can be unlocked.
+ </description>
+ <dataType><moRef name="IsLanTrafficClass"/></dataType>
+ </attribute>
+ </class>
+
+
+ <!--
+ Relatonship Definitions
+ -->
+
+ <relationship name="BladeSystemsTop">
+ <containment>
+ <parent>
+ <hasClass name="top_mim:Is"/>
+ </parent>
+ <child>
+ <hasClass name="BladeSystems"/>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="BsMount">
+ <containment>
+ <parent>
+ <hasClass name="BladeSystems"/>
+ </parent>
+ <child>
+ <hasClass name="BladeSystem"/>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Blades">
+ <containment>
+ <parent>
+ <hasClass name="BladeSystem"/>
+ </parent>
+ <child>
+ <hasClass name="Blade"/>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="LinkSaps">
+ <containment>
+ <parent><hasClass name="Blade"/></parent>
+ <child><hasClass name="LinkSap"/></child>
+ </containment>
+ </relationship>
+
+ <relationship name="NcMount">
+ <containment>
+ <parent><hasClass name="BladeSystem"/></parent>
+ <child><hasClass name="BsNetworkConfiguration"/></child>
+ </containment>
+ </relationship>
+
+ <relationship name="BsVlans">
+ <containment>
+ <parent><hasClass name="BsNetworkConfiguration"/></parent>
+ <child>
+ <hasClass name="BsVlan"/>
+ <cardinality><min>1</min></cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="BsVlanSaps">
+ <containment>
+ <parent><hasClass name="BsVlan"/></parent>
+ <child>
+ <hasClass name="BsVlanSap"/>
+ <cardinality><min>1</min></cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="BsLogicalNetworks">
+ <containment>
+ <parent><hasClass name="BsNetworkConfiguration"/></parent>
+ <child><hasClass name="BsLogicalNetwork"/></child>
+ </containment>
+ </relationship>
+
+ <relationship name="BsSubnets">
+ <containment>
+ <parent><hasClass name="BsLogicalNetwork"/></parent>
+ <child>
+ <hasClass name="BsSubnet"/>
+ <cardinality><min>1</min></cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="BsSubnetSegments">
+ <containment>
+ <parent><hasClass name="BsSubnet"/></parent>
+ <child><hasClass name="BsSubnetSegment"/></child>
+ </containment>
+ </relationship>
+
+ <relationship name="BsIpTrafficClasses">
+ <containment>
+ <parent><hasClass name="BsNetworkConfiguration"/></parent>
+ <child><hasClass name="BsIpTrafficClass"/></child>
+ </containment>
+ </relationship>
+
+ <relationship name="BsLanTrafficClasses">
+ <containment>
+ <parent><hasClass name="BsNetworkConfiguration"/></parent>
+ <child><hasClass name="BsLanTrafficClass"/></child>
+ </containment>
+ </relationship>
+
+
+
+</mim>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/dummy_action_mim.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/dummy_action_mim.xml
new file mode 100644
index 0000000000..d691fe0b3f
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/dummy_action_mim.xml
@@ -0,0 +1,186 @@
+<mim xmlns="http://www.ericsson.com/is/isco/mim/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ericsson.com/is/isco/mim/2.0 /vobs/isac/sis/OAM_CRA1190047_1/CCS_CNA113082/doc/15519/mim.xsd ">
+ <exception name="dummyException">
+ <description>
+ Exception description
+ </description>
+ <exceptionParameter name="dummyExcPar1">
+ <description>
+ Exception parameter description
+ </description>
+ <dataType><integer/></dataType>
+ </exceptionParameter>
+ <exceptionParameter name="dummyExcPar2">
+ <description>
+ Exception parameter description
+ </description>
+ <dataType>
+ <integer/>
+ </dataType>
+ </exceptionParameter>
+ </exception>
+
+
+ <class name="DummyActions">
+ <singleton/>
+ <attribute name="dummy">
+ <dataType><integer/></dataType>
+ </attribute>
+ <action name="actNoParams">
+ <description>
+ Action with no parameters
+ </description>
+ <returnType>
+ <description>
+ Maybe strange to describe void, but here is a description anyway.
+ </description>
+ <void/>
+ </returnType>
+ </action>
+ <action name="actOneParam">
+ <description>
+ Action with one parameter
+ </description>
+ <returnType>
+ <dataType>
+ <string>
+ <validValues>
+ <value name="ok"/>
+ <value name="error"/>
+ </validValues>
+ </string>
+ </dataType>
+ </returnType>
+ <parameter name="a">
+ <dataType>
+ <integer>
+ <range>
+ <min>0</min>
+ <max>3</max>
+ </range>
+ </integer>
+ </dataType>
+ </parameter>
+ </action>
+ <action name="actManyParams">
+ <description>
+ Action with many parameters, even some optional
+ </description>
+ <returnType>
+ <dataType>
+ <integer>
+ <range>
+ <min>0</min>
+ <max>100</max>
+ </range>
+ </integer>
+ </dataType>
+ </returnType>
+ <parameter name="a">
+ <dataType>
+ <integer>
+ <range>
+ <min>0</min>
+ <max>3</max>
+ </range>
+ </integer>
+ </dataType>
+ </parameter>
+ <parameter name="b">
+ <dataType>
+ <integer>
+ <range>
+ <min>0</min>
+ <max>3</max>
+ </range>
+ </integer>
+ </dataType>
+ </parameter>
+ <parameter name="c">
+ <dataType>
+ <integer>
+ <range>
+ <min>0</min>
+ <max>3</max>
+ </range>
+ </integer>
+ </dataType>
+ <initialValue>0</initialValue>
+ <isOptional/>
+ </parameter>
+ <parameter name="d">
+ <description>parameterdescription</description>
+ <dataType>
+ <integer/>
+ </dataType>
+ <isOptional/>
+ </parameter>
+ </action>
+ <action name="actComplexParams">
+ <description>
+ Action with parameters with complex datatypes
+ </description>
+ <returnType>
+ <description>
+ Here is a description of the return value for this action.
+ </description>
+ <dataType>
+ <string>
+ <validValues>
+ <value name="siri"/>
+ <value name="sara"/>
+ </validValues>
+ </string>
+ </dataType>
+ </returnType>
+ <parameter name="dummyParameter">
+ <dataType><integer/></dataType>
+ </parameter>
+ <parameter name="structParameter">
+ <dataType>
+ <struct>
+ <structMember name="a">
+ <dataType><integer/></dataType>
+ </structMember>
+ <structMember name="b">
+ <dataType><integer/></dataType>
+ </structMember>
+ </struct>
+ </dataType>
+ </parameter>
+ <raisesException name="dummyException"/>
+ </action>
+ <action name="actComplexReturn">
+ <returnType>
+ <dataType>
+ <struct>
+ <structMember name="a">
+ <dataType><integer/></dataType>
+ </structMember>
+ <structMember name="b">
+ <dataType><integer/></dataType>
+ </structMember>
+ </struct>
+ </dataType>
+ </returnType>
+ </action>
+ <action name="actException">
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="dummyException"/>
+ </action>
+ </class>
+
+
+ <relationship name="Top">
+ <containment>
+ <parent>
+ <hasClass name="top_mim:Is"/>
+ </parent>
+ <child>
+ <hasClass name="DummyActions"/>
+ </child>
+ </containment>
+ </relationship>
+
+</mim> \ No newline at end of file
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/hwm_mim.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/hwm_mim.xml
new file mode 100644
index 0000000000..a7a18b0070
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/hwm_mim.xml
@@ -0,0 +1,631 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+
+<!--
+
+Copyright (C) Ericsson AB 2006-2007 All rights reserved.
+
+The information in this document is the property of Ericsson.
+
+Except as specifically authorized in writing by Ericsson, the
+receiver of this document shall keep the information contained
+herein confidential and shall protext the same in whole or in part
+from disclosure and dissemination to third parties.
+
+Disclosure and disseminations to the receivers employees shall
+only be made on a strict need to know basis.
+
+-->
+
+
+<mim xmlns="http://www.ericsson.com/is/isco/mim/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ericsson.com/is/isco/mim/2.0 /vobs/isac/sis/OAM_CRA1190047_1/CCS_CNA113082/doc/15519/mim.xsd ">
+
+ <!--
+ DataType Definitions
+ -->
+
+ <dataType name="HwmSlotState">
+ <description>
+ Information of how the slot is used.
+ </description>
+ <string>
+ <validValues>
+ <value name="unusedEmpty"/>
+ <value name="usedEmpty"/>
+ <value name="unusedOccupied"/>
+ <value name="usedOccupied"/>
+ </validValues>
+ </string>
+ </dataType>
+
+
+ <!--
+ Class Definitions
+ -->
+
+ <exception name="dummyException">
+ <exceptionParameter name="dummyExcPar1">
+ <dataType><integer/></dataType>
+ </exceptionParameter>
+ <exceptionParameter name="dummyExcPar2">
+ <dataType><integer/></dataType>
+ </exceptionParameter>
+ </exception>
+
+
+ <class name="Hardware">
+ <description>
+ The purpose of the Hardware Management function is to make it possible to maintain
+ the Hardware Inventory (HWI) for the Integrated Site and to present its content via ISM
+ or to a management system. And also to maintain the subracks usage.
+ </description>
+ <singleton/>
+ <systemCreated/>
+
+ <attribute name="activeSis">
+ <description>
+ The subrack,slot of the active om SIS. The format is "subrack.slot".
+ </description>
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+
+ <action name="actComplexParams">
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="structParameter">
+ <dataType>
+ <struct>
+ <structMember name="a">
+ <dataType><integer/></dataType>
+ </structMember>
+ <structMember name="b">
+ <dataType><integer/></dataType>
+ </structMember>
+ </struct>
+ </dataType>
+ </parameter>
+ </action>
+
+ <action name="actComplexReturn">
+ <returnType>
+ <dataType>
+ <struct>
+ <structMember name="a">
+ <dataType><integer/></dataType>
+ </structMember>
+ <structMember name="b">
+ <dataType><integer/></dataType>
+ </structMember>
+ </struct>
+ </dataType>
+ </returnType>
+ </action>
+
+ <action name="actException">
+ <returnType>
+ <void/>
+ </returnType>
+ <raisesException name="dummyException"/>
+ </action>
+
+ <action name="createInfraStructure">
+ <description>
+ Creates the base IS infrastructure.
+ This is noramlly done at factory.
+ </description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+
+ <action name="exportInventory">
+ <description>
+ Exports the Hardware Inventory via FTP.
+ This is an asyncrounous operation. The file exported
+ will have the following name format:
+ &lt;node&gt;.&lt;timestamp&gt;.HWI.xml.tar.gz
+ </description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="host">
+ <description>
+ The host to which the data should be sent to
+ </description>
+ <dataType><string/></dataType>
+ </parameter>
+ <parameter name="user">
+ <description>
+ The username on the host to be used during the FTP transfer.
+ </description>
+ <dataType><string/></dataType>
+ </parameter>
+ <parameter name="password">
+ <description>
+ The pasword of the user
+ </description>
+ <dataType><string/></dataType>
+ </parameter>
+ <parameter name="path">
+ <description>
+ The path were to put the file
+ </description>
+ <dataType><string/></dataType>
+ </parameter>
+ </action>
+
+ </class>
+
+ <class name="BladeType">
+ <description>
+ This class describes a Blade type.
+ </description>
+ <systemCreated/>
+
+ <attribute name="type">
+ <description>The blade type number like CNA12801</description>
+ <dataType><string/></dataType>
+ <key/>
+ </attribute>
+
+ <attribute name="swgId">
+ <description>The blade software group index link CSX10138</description>
+ <dataType><string/></dataType>
+ <key/>
+ </attribute>
+
+ <attribute name="swgRev">
+ <description>The blade software group revision</description>
+ <dataType><string/></dataType>
+ <key/>
+ </attribute>
+
+ <attribute name="name">
+ <description>The name of the Blade Type.</description>
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="width">
+ <description>The width of the blade in number of slots.</description>
+ <dataType>
+ <integer/>
+ </dataType>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="oneGLinks">
+ <description>
+ The 1G links used by the blade type , like 0,1, counted from
+ the leftmost backplane position.
+ </description>
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="linkAggregates">
+ <description>
+ The 1G links used for link aggregation by the blade type , like 0-1,
+ counted from the leftmost backplane position.
+ </description>
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="hasHwData">
+ <description>
+ True if possible to read product info via the maintenance bus.
+ </description>
+ <dataType><boolean/></dataType>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="isMxb">
+ <description>True if this is a Main Switch blade type.</description>
+ <dataType><boolean/></dataType>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="availOneGSlots">
+ <description>
+ Only valid for main switch blades. A list of slots that have 1G link.
+ Could be a single slot or a range or a combination thereof.
+ E.g. 1-24, or 1,3-13,15-24.
+ </description>
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="aggregateRanges">
+ <description>
+ Only valid for main switch blades. Specifies which slots can be used
+ for link aggregation. Ranges are specified in the form 1-12,13-24.
+ </description>
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+
+ </class>
+
+
+ <class name="BladeSystemDomain">
+ <description>
+ This class describes a Blade system domain.
+ </description>
+ <systemCreated/>
+
+ <attribute name="name">
+ <description>The blade system domain name.</description>
+ <dataType><string/></dataType>
+ <key/>
+ </attribute>
+
+ <attribute name="description">
+ <description>The description of the blade system domain.</description>
+ <dataType><string/></dataType>
+<!-- <key/> -->
+ </attribute>
+
+ </class>
+
+
+ <class name="Subrack">
+ <description>
+ This class describes the subrack.
+ </description>
+ <extension>
+ <callpoint id="Is_Hardware_Subrack" type="external"/>
+<!-- <validate id="Is_Hardware_Subrack" type="external" callOnce="true"/>-->
+ </extension>
+
+ <attribute name="id">
+ <description>Identifies a certain subrack.</description>
+ <dataType>
+ <integer><range><min>0</min><max>31</max></range></integer>
+ </dataType>
+ <key/>
+ </attribute>
+
+ <attribute name="type">
+ <description>The type of subrack.</description>
+ <dataType><string/></dataType>
+ </attribute>
+
+ <attribute name="userLabel">
+ <description>A user friendly Subrack name.</description>
+ <dataType><string/></dataType>
+ </attribute>
+
+ <attribute name="position">
+ <description>The subrack position in the cabinet.</description>
+ <dataType><string/></dataType>
+ </attribute>
+
+ <attribute name="cabinetPosition">
+ <description>The cabinet position in the site.</description>
+ <dataType><string/></dataType>
+ </attribute>
+
+ <attribute name="location">
+ <description>The site location, e.g. the visiting address.</description>
+ <dataType><string/></dataType>
+ </attribute>
+
+ <attribute name="availableOneGSlots">
+ <description>
+ Available slots for 1G switch links. Information taken from the type
+ of main switch blade that is created in the subrack.
+ </description>
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="availableTenGSlots">
+ <description>
+ Available slots for 10G switch links. Information taken from the type
+ of main switch blade that is created in the subrack.
+ </description>
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="aggregateSlots">
+ <description>
+ Links ranges for (1G) link aggregation. Information taken from the
+ type of main switch blade that is created in the subrack.
+ </description>
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="physicalAddrPlug0">
+ <description>
+ The value of the physical plug 0.
+ </description>
+ <dataType><integer/></dataType>
+ <mandatory/>
+ </attribute>
+
+ <attribute name="physicalAddrPlug1">
+ <description>
+ The value of the physical plug 1.
+ </description>
+ <dataType><integer/></dataType>
+ <mandatory/>
+ </attribute>
+
+ <attribute name="physicalAddrPlug3">
+ <description>
+ The value of the physical plug 3.
+ </description>
+ <dataType><integer/></dataType>
+ <mandatory/>
+ </attribute>
+
+ <attribute name="leftMxbBsSwgId">
+ <description>
+ The BS SWG Id of the left MXB in the subrack.
+ If not given the system will use the same as the
+ MXB in subrack 0. This might not be corect however.
+ </description>
+ <dataType><string/></dataType>
+ <restricted/>
+ </attribute>
+
+ <attribute name="leftMxbBsSwgRev">
+ <description>
+ The BS SWG Revision of the left MXB in the subrack.
+ If not given the system will use the same as the
+ MXB in subrack 0. This might not be corect however.
+ </description>
+ <dataType><string/></dataType>
+ <restricted/>
+ </attribute>
+
+ <attribute name="leftMxbBsCxrId">
+ <description>
+ The BS CXR Id (if any) of the left MXB in the subrack.
+ If not given the system will use the same as the
+ MXB in subrack 0. This might not be corect however.
+ </description>
+ <dataType><string/></dataType>
+ <restricted/>
+ </attribute>
+
+ <attribute name="leftMxbBsCxrRev">
+ <description>
+ The BS CXR Revision (if any) of the left MXB in the subrack.
+ If not given the system will use the same as the
+ MXB in subrack 0. This might not be corect however.
+ </description>
+ <dataType><string/></dataType>
+ <restricted/>
+ </attribute>
+
+ <attribute name="leftMxbBlSwgId">
+ <description>
+ The BL SWG Id of the left MXB in the subrack.
+ If not given the system will use the same as the
+ MXB in subrack 0. This might not be corect however.
+ </description>
+ <dataType><string/></dataType>
+ <restricted/>
+ </attribute>
+
+ <attribute name="leftMxbBlSwgRev">
+ <description>
+ The BL SWG Revision of the left MXB in the subrack.
+ If not given the system will use the same as the
+ MXB in subrack 0. This might not be corect however.
+ </description>
+ <dataType><string/></dataType>
+ <restricted/>
+ </attribute>
+
+ <attribute name="leftMxbBlCxrId">
+ <description>
+ The BL CXR Id (if any) of the left MXB in the subrack.
+ If not given the system will use the same as the
+ MXB in subrack 0. This might not be corect however.
+ </description>
+ <dataType><string/></dataType>
+ <restricted/>
+ </attribute>
+
+ <attribute name="leftMxbBlCxrRev">
+ <description>
+ The BL CXR Revision (if any) of the left MXB in the subrack.
+ If not given the system will use the same as the
+ MXB in subrack 0. This might not be corect however.
+ </description>
+ <dataType><string/></dataType>
+ <restricted/>
+ </attribute>
+
+ <attribute name="rightMxbBsSwgId">
+ <description>
+ The BS SWG Id of the right MXB in the subrack.
+ If not given the system will use the same as the
+ MXB in subrack 0. This might not be corect however.
+ </description>
+ <dataType><string/></dataType>
+ <restricted/>
+ </attribute>
+
+ <attribute name="rightMxbBsSwgRev">
+ <description>
+ The BS SWG Revision of the right MXB in the subrack.
+ If not given the system will use the same as the
+ MXB in subrack 0. This might not be corect however.
+ </description>
+ <dataType><string/></dataType>
+ <restricted/>
+ </attribute>
+
+ <attribute name="rightMxbBsCxrId">
+ <description>
+ The BS CXR Id (if any) of the right MXB in the subrack.
+ If not given the system will use the same as the
+ MXB in subrack 0. This might not be corect however.
+ </description>
+ <dataType><string/></dataType>
+ <restricted/>
+ </attribute>
+
+ <attribute name="rightMxbBsCxrRev">
+ <description>
+ The BS CXR Revision (if any) of the right MXB in the subrack.
+ If not given the system will use the same as the
+ MXB in subrack 0. This might not be corect however.
+ </description>
+ <dataType><string/></dataType>
+ <restricted/>
+ </attribute>
+
+ <attribute name="rightMxbBlSwgId">
+ <description>
+ The BL SWG Id of the right MXB in the subrack.
+ If not given the system will use the same as the
+ MXB in subrack 0. This might not be corect however.
+ </description>
+ <dataType><string/></dataType>
+ <restricted/>
+ </attribute>
+
+ <attribute name="rightMxbBlSwgRev">
+ <description>
+ The BL SWG Revision of the right MXB in the subrack.
+ If not given the system will use the same as the
+ MXB in subrack 0. This might not be corect however.
+ </description>
+ <dataType><string/></dataType>
+ <restricted/>
+ </attribute>
+
+ <attribute name="rightMxbBlCxrId">
+ <description>
+ The BL CXR Id (if any) of the right MXB in the subrack.
+ If not given the system will use the same as the
+ MXB in subrack 0. This might not be corect however.
+ </description>
+ <dataType><string/></dataType>
+ <restricted/>
+ </attribute>
+
+ <attribute name="rightMxbBlCxrRev">
+ <description>
+ The BL CXR Revision (if any) of the right MXB in the subrack.
+ If not given the system will use the same as the
+ MXB in subrack 0. This might not be corect however.
+ </description>
+ <dataType><string/></dataType>
+ <restricted/>
+ </attribute>
+ </class>
+
+ <class name="Slot">
+ <description>
+ This class corresponds to slots, there is one instance
+ for each slot. The slots are grouped per subrack. A slot is
+ identified by subrack Id and slot number). The subrack Id for a slot
+ identifies in the subrackTable the subrack that the slot belongs
+ to.
+ </description>
+ <systemCreated/>
+
+ <attribute name="number">
+ <description>
+ The value of this object identifies the
+ slot position within the subrack.
+ </description>
+ <dataType>
+ <integer><range><min>0</min><max>25</max></range></integer>
+ </dataType>
+ <key/>
+ </attribute>
+
+ <attribute name="state">
+ <description>
+ See HwmSlotState description.
+ </description>
+ <dataType name.ref="HwmSlotState"/>
+ <readOnly/>
+ </attribute>
+
+ <attribute name="bladeSystem">
+ <description>
+ The value of this object identifies the Blade System that uses this
+ slot. An instances of this object will only have meaning in a
+ conceptual row if the value of hwmSlotState instance is either
+ usedOccupied or usedEmpty in the same conceptual row,
+ i.e. there is an Blade System created using this slot. (If
+ no Blade System is using the slot, the value will be "-".)
+ </description>
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+
+ </class>
+
+
+ <!--
+ Relatonship Definitions
+ -->
+
+ <relationship name="HwmTop">
+ <containment>
+ <parent>
+ <hasClass name="top_mim:Is"/>
+ </parent>
+ <child>
+ <hasClass name="Hardware"/>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="BladeTypes">
+ <containment>
+ <parent>
+ <hasClass name="Hardware"/>
+ </parent>
+ <child>
+ <hasClass name="BladeType"/>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="BladeSystemDomains">
+ <containment>
+ <parent>
+ <hasClass name="Hardware"/>
+ </parent>
+ <child>
+ <hasClass name="BladeSystemDomain"/>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Subracks">
+ <containment>
+ <parent>
+ <hasClass name="Hardware"/>
+ </parent>
+ <child>
+ <hasClass name="Subrack"/>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Slots">
+ <containment>
+ <parent>
+ <hasClass name="Subrack"/>
+ </parent>
+ <child>
+ <hasClass name="Slot"/>
+ </child>
+ </containment>
+ </relationship>
+</mim>
+
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/instance.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/instance.xml
new file mode 100644
index 0000000000..e39152cada
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/instance.xml
@@ -0,0 +1,240 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<!-- Copyright (C) Ericsson AB 2006 All rights reserved. -->
+
+<!-- Integrated Site Managed Object Model. -->
+
+<!--
+ This is a template for the IntegratedSite model version 1,
+ which consists of the following mim files:
+ /vobs/isac/sis/OAM_CRA1190047_1/CPD_CNA11381/doc/19062/cpd_mim.xml
+ /vobs/isac/sis/OAM_CRA1190047_1/HWM_CNA11309/doc/19062/hwm_mim.xml
+ /vobs/isac/sis/OAM_CRA1190047_1/SCA_CNA113119/doc/19062/bs_mim.xml
+ /vobs/isac/sis/OAM_CRA1190047_1/SWM_CNA11315/doc/19062/swm_mim.xml
+ /vobs/isac/sis/OAM_CRA1190047_1/doc/19062/top_mim.xml
+
+-->
+<IntegratedSite:model xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:nc="http://www.ericsson.com/is/isco/nc" xmlns:IntegratedSite="http://www.ericsson.com/is/isco/IntegratedSite" xmlns:IsTypes="http://www.ericsson.com/is/isco/IsTypes" xmlns:MainSwitch="http://www.ericsson.com/is/isco/MainSwitch_1" xmlns:MyBsModel="http://www.ericsson.com/is/isco/MyBsModel_1" xsi:schemaLocation="http://www.ericsson.com/is/isco/IntegratedSite IntegratedSite.xsd">
+
+ <!--
+ The top class - the forefather of all classes.
+
+ Key attributes: []
+
+ Possible children:
+ BladeSystems
+ Hardware
+ NetworkConfiguration
+ Software
+ -->
+ <Is>
+
+
+ <!-- These three are just for verifying that the xml schema allows
+ the correct order of the child elements of the Is class -->
+<!--
+ <Hardware/>
+ <Software/>
+ <NetworkConfiguration/>
+-->
+
+ <!--
+ The BladeSystems mountpoint - parent of all blade systems.
+
+ Key attributes: []
+
+ Possible children:
+ BladeSystemTemplate
+ Mxb
+ MyBsModel
+ Sis
+ -->
+ <BladeSystems>
+
+ <!--
+ This class describes a Blade System. It will be cloned for each
+ new blade system type registered in the system. The new clone
+ will serve as a mountpoint for the blade system specific model.
+
+ Key attributes: [name]
+
+ Possible children:
+ Blade
+ BsIpTrafficClass
+ BsLanTrafficClass
+ BsLogicalNetwork
+ BsVlan
+ -->
+ <MyBsModel>
+ <!--
+ A user friendly Blade System name, must be set at creation and can be
+ changed when BS is locked.
+ -->
+ <name>bs_localhost_101</name>
+ <!--
+ An identifier for the BS. A new integer has to be used every time a new
+ BS is created. ??? Kvar ???
+ -->
+ <!--
+ The model for a blade system. Includes som mim files, which also uses
+ stuff from a sis model.
+ -->
+
+ <!--
+ This is a template for the MyBsModel model version 1,
+ which consists of the following mim files:
+ /vobs/isac/sis/OAM_CRA1190047_1/CCS_CNA113082/test/local_test/ccs_parser_SUITE_data/myTest_mim.xml, Version: /main/R2A/10
+ /vobs/isac/sis/OAM_CRA1190047_1/CCS_CNA113082/test/local_test/ccs_parser_SUITE_data/other_mim.xml
+
+ -->
+ <MyBsModel:model>
+
+ <!--
+ This is a class which can be assigned as an attribute of ChildClass.
+ Key attribute is 'id'.
+
+ Key attributes: [id]
+ -->
+ <Blipp nc:operation="replace">
+ <id>name1</id>
+ <truefalse>true</truefalse>
+ <ipAddress>
+ 10.11.12.13
+ </ipAddress>
+ <macAddress>AA:BB:CC:DD:EE:FF</macAddress>
+ <moAttributeDeep nc:operation="replace">
+ /IntegratedSite:model/Is/BladeSystems/MyBsModel[name='bs_localhost_101']/MyBsModel:model/MyClass[id1='Obj'][id2='1']/ChildClass[id='Obj2']
+ </moAttributeDeep>
+ </Blipp>
+
+ <Blipp>
+ <id>name2</id>
+ <truefalse>false</truefalse>
+ <ipAddress>20.21.22.23</ipAddress>
+ <macAddress>01:02:03:04:5:6</macAddress>
+ <moAttributeDeep>
+ MyClass[id1='Obj'][id2='1']/ChildClass[id='Obj3']
+ </moAttributeDeep>
+ </Blipp>
+
+ <!--
+ My Test Class
+ The class hierarky looks like this:
+
+ +==========+
+ |MountPoint|
+ +==========+
+ / \
+ / \
+ +=======+ +=======+
+ | Blipp | |MyClass|
+ +=======+ +=======+
+ |
+ |
+ +==========+
+ |ChildClass|
+ +==========+
+
+ Key attributes: [id1,id2]
+
+ Possible children:
+ ChildClass:
+ Definition of children under MyClass
+ -->
+ <MyClass>
+ <!-- Test class identifyer - part1 -->
+ <id1>Obj</id1>
+ <!-- Test class identifyer - part2 -->
+ <id2>1</id2>
+ <date>2006-03-08T03:00:00.9+03:00</date>
+ <date2>2006-03-15T22:59:58.99-01:00</date2>
+ <list>
+ <item>0</item>
+ <item>1</item>
+ <item nc:operation="delete">3</item>
+ </list>
+ <list2>
+ <item>
+ <!-- Struct: sis_model:uselessStruct -->
+ <field1>hei</field1>
+ <field2 nc:operation="replace">1</field2>
+ </item>
+ <item nc:operation="replace">
+ <!-- Struct: sis_model:uselessStruct -->
+ <field1>
+ hopp
+ </field1>
+ <field2>2</field2>
+ </item>
+ </list2>
+ <list3>
+ <item>hei</item>
+ <item>hopp</item>
+ </list3>
+ <yesNo>
+ yes
+ </yesNo>
+ <!-- Attribute description. -->
+ <commonStruct>
+ <!--
+ Struct: myNamedStruct
+ Struct description
+ -->
+ <counter>0</counter>
+ <state>locked</state>
+ <dummyStructRef>
+ <!-- Struct: sis_model:uselessStruct -->
+ <field1>hei</field1>
+ <field2>1</field2>
+ </dummyStructRef>
+ <dummySequence>
+ <item>
+ <field1>hopp</field1>
+ <field2>2</field2>
+ </item>
+ <item>
+ <field1>sa</field1>
+ <field2>3</field2>
+ </item>
+ <item>
+ <field1>sa</field1>
+ <field2>4</field2>
+ </item>
+ </dummySequence>
+ <inlineStruct>
+ <a>1</a>
+ <b>1.0</b>
+ <c>true</c>
+ </inlineStruct>
+ </commonStruct>
+ <dummyInternal>hei</dummyInternal>
+ <trueOrFalse>false</trueOrFalse>
+ <!--
+ Child of MyClass
+
+ Key attributes: [id]
+ -->
+ <ChildClass>
+ <id>Obj2</id>
+ <moAttribute>/IntegratedSite:model/Is/BladeSystems/MyBsModel[name='bs_localhost_101']/MyBsModel:model/Blipp[id='name1']</moAttribute>
+ <moAttributeNamed>
+ /IntegratedSite:model/Is/BladeSystems/MyBsModel[name='bs_localhost_101']/MyBsModel:model/MyClass[id1='Obj'][id2='1']
+ </moAttributeNamed>
+ </ChildClass>
+ <ChildClass>
+ <id>Obj3</id>
+ <moAttribute>../../Blipp[id='name2']</moAttribute>
+<!-- <moAttributeNamed>../MyClass[id1='Obj'][id2='1']</moAttributeNamed> -->
+ <moAttributeNamed>Dummy/MyClass[id1='Obj'][id2='1']</moAttributeNamed>
+ </ChildClass>
+ </MyClass>
+
+ </MyBsModel:model>
+ </MyBsModel>
+
+ </BladeSystems>
+<!--
+ <MainSwitch:model/>
+-->
+ </Is>
+</IntegratedSite:model>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/mim.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/mim.xsd
new file mode 100644
index 0000000000..e0534e8e14
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/mim.xsd
@@ -0,0 +1,486 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="http://www.ericsson.com/is/isco/mim/2.0" xmlns="http://www.ericsson.com/is/isco/mim/2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <!--
+ ============================================================================
+ %CCaseFile: mim.xsd %
+ %CCaseRev: /main/P4B/1 %
+ %CCaseDate: 2007-05-29 %
+ %CCaseDocNo: 22/155 19-CNA 113 082 Ux %
+ %Rev: Error in Revision! %
+ Author: EAB/AUL/IS Siri Hansen
+
+ ============================================================================
+
+ Copyright (c) Ericsson AB 2006-2007 All rights reserved.
+
+ The information in this document is the property of Ericsson.
+
+ Except as specifically authorized in writing by Ericsson, the
+ receiver of this document shall keep the information contained
+ herein confidential and shall protect the same in whole or in
+ part from disclosure and dissemination to third parties.
+
+ Disclosure and disseminations to the receivers employees shall
+ only be made on a strict need to know basis.
+ -->
+ <!-- Common -->
+ <xs:element name="description" type="xs:string"/>
+ <xs:element name="extension">
+ <xs:complexType>
+ <xs:group minOccurs="0" maxOccurs="unbounded" ref="anyElement"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:attributeGroup name="anyAttribute">
+ <xs:anyAttribute processContents="skip"/>
+ </xs:attributeGroup>
+ <xs:group name="anyElement">
+ <xs:sequence>
+ <xs:any processContents="skip"/>
+ </xs:sequence>
+ </xs:group>
+ <!-- Mim definition -->
+ <xs:element name="mim">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="extension"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="topClass"/>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:group ref="dataTypeDef"/>
+ <xs:element ref="exception"/>
+ </xs:choice>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="class"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="relationship"/>
+ </xs:sequence>
+ <xs:attribute name="version"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="topClass">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="sortPriority"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ <xs:attribute name="minOccurs"/>
+ <xs:attribute name="maxOccurs"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- MO class definition -->
+ <xs:element name="class">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="extension"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="default_access"/>
+ <xs:choice>
+ <xs:sequence>
+ <xs:element ref="singleton"/>
+ <xs:element minOccurs="0" ref="systemCreated"/>
+ <xs:element minOccurs="0" ref="readOnly"/>
+ <xs:group minOccurs="0" maxOccurs="unbounded" ref="dataTypeDef"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="attribute"/>
+ </xs:sequence>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="systemCreated"/>
+ <xs:element minOccurs="0" ref="readOnly"/>
+ <xs:group minOccurs="0" maxOccurs="unbounded" ref="dataTypeDef"/>
+ <xs:element maxOccurs="unbounded" ref="attribute"/>
+ </xs:sequence>
+ </xs:choice>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="action"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[A-Z][A-Za-z0-9]*"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="singleton">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="systemCreated">
+ <xs:complexType/>
+ </xs:element>
+ <!-- Relations -->
+ <xs:element name="relationship">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="extension"/>
+ <xs:element ref="containment"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="containment">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="parent"/>
+ <xs:element ref="child"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="parent" type="hasClass"/>
+ <xs:element name="child">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="hasClass">
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="cardinality"/>
+ <xs:element minOccurs="0" ref="sortPriority"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="sortPriority" type="xs:int"/>
+ <xs:element name="cardinality" type="rangeType"/>
+ <xs:complexType name="hasClass">
+ <xs:sequence>
+ <xs:element ref="hasClass"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="hasClass">
+ <xs:complexType>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- Data types -->
+ <xs:element name="simple_type" abstract="true" substitutionGroup="type"/>
+ <xs:element name="type" abstract="true"/>
+ <!-- For attributes, parameters and exceptions -->
+ <xs:group name="dataType">
+ <xs:sequence>
+ <xs:element name="dataType" nillable="true">
+ <xs:complexType>
+ <xs:choice>
+ <xs:element ref="type" minOccurs="0"/>
+ <xs:element ref="xs_list" minOccurs="0"/>
+ </xs:choice>
+ <xs:attribute name="name.ref" use="optional"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:group>
+ <xs:group name="simpleDataType">
+ <xs:sequence>
+ <xs:element name="dataType" nillable="true">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="simple_type" minOccurs="0"/>
+ </xs:sequence>
+ <xs:attribute name="name.ref" use="optional"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:group>
+ <xs:group name="dataTypeDef">
+ <xs:sequence>
+ <xs:element name="dataType">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="extension"/>
+ <xs:choice>
+ <xs:element ref="type"/>
+ <xs:element ref="xs_list"/>
+ </xs:choice>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:group>
+ <!-- For actions -->
+ <xs:element name="returnType">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:choice>
+ <xs:element ref="void"/>
+ <xs:group ref="dataType"/>
+ </xs:choice>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <!-- Return data types -->
+ <xs:element name="void">
+ <xs:complexType/>
+ </xs:element>
+ <!-- Primitive data types -->
+ <xs:complexType name="stringRestrictionType">
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="lengthRange"/>
+ <xs:element minOccurs="0" ref="validValues"/>
+ <xs:element minOccurs="0" ref="pattern"/>
+ <xs:element minOccurs="0" ref="defaultValue"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="dateTimeRestrictionType">
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="range"/>
+ <xs:element minOccurs="0" ref="validValues"/>
+ <xs:element minOccurs="0" ref="pattern"/>
+ <xs:element minOccurs="0" ref="defaultValue"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="numRestrictionType">
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="range"/>
+ <xs:element minOccurs="0" ref="defaultValue"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="boolean" substitutionGroup="simple_type">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="defaultValue"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="dateTime" type="dateTimeRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="float" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="integer" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="string" type="stringRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="pattern" type="xs:string"/>
+ <xs:element name="validValues">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" ref="value"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="value">
+ <xs:complexType>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="lengthRange" type="rangeType"/>
+ <xs:element name="range" type="rangeType"/>
+ <xs:complexType name="rangeType">
+ <xs:sequence>
+ <xs:element name="min" type="xs:string" minOccurs="0"/>
+ <xs:element name="max" type="xs:string" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="defaultValue" type="xs:string"/>
+ <!-- Struct data type -->
+ <xs:element name="struct" substitutionGroup="type">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" ref="structMember"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="structMember">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="extension"/>
+ <xs:group ref="dataType"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- List data type -->
+ <xs:element name="xs_list">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:group ref="simpleDataType"/>
+ <xs:element minOccurs="0" ref="lengthRange"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <!-- MoRef data type -->
+ <xs:element name="moRef" substitutionGroup="simple_type">
+ <xs:complexType>
+ <xs:attribute name="name" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[A-Z][A-Za-z0-9]*"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ <!-- Attribute -->
+ <xs:element name="attribute">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="extension"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="default_access"/>
+ <xs:group ref="dataType"/>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="initialValue"/>
+ <xs:element ref="pmData"/>
+ <xs:choice>
+ <xs:choice>
+ <xs:element ref="key"/>
+ <xs:element ref="readOnly"/>
+ </xs:choice>
+ <xs:choice>
+ <xs:choice>
+ <xs:element ref="readOnly"/>
+ <xs:choice>
+ <xs:element ref="mandatory"/>
+ <xs:element ref="restricted"/>
+ </xs:choice>
+ </xs:choice>
+ <xs:element ref="nonPersistent"/>
+ </xs:choice>
+ </xs:choice>
+ </xs:choice>
+ </xs:sequence>
+ <xs:attribute name="name" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[a-z][a-zA-Z0-9]*"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="initialValue" type="xs:string"/>
+ <xs:element name="key">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="mandatory">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="nonPersistent">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="pmData">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="extension"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="readOnly">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="restricted">
+ <xs:complexType/>
+ </xs:element>
+ <!-- Action -->
+ <xs:element name="action">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="extension"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="default_access"/>
+ <xs:element ref="returnType"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="parameter"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="raisesException"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[a-z][a-zA-Z0-9]*"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="parameter">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="extension"/>
+ <xs:group ref="dataType"/>
+ <xs:element minOccurs="0" ref="initialValue"/>
+ <xs:element minOccurs="0" ref="isOptional"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="isOptional">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="exception">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="extension"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="exceptionParameter"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="exceptionParameter">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="extension"/>
+ <xs:group ref="dataType"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="raisesException">
+ <xs:complexType>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- xs types, introduced in IS 2.0 -->
+ <xs:element name="xs_normalizedString" type="stringRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_token" type="stringRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_string" type="stringRestrictionType" substitutionGroup="simple_type"/>
+
+ <xs:element name="xs_base64Binary" type="stringRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_hexBinary" type="stringRestrictionType" substitutionGroup="simple_type"/>
+
+ <xs:element name="xs_integer" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_positiveInteger" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_negativeInteger" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_nonNegativeInteger" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_nonPositiveInteger" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_long" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_unsignedLong" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_int" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_unsignedInt" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_short" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_unsignedShort" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_byte" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_unsignedByte" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_decimal" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_float" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_double" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_boolean" type="numRestrictionType" substitutionGroup="simple_type"/>
+
+ <xs:element name="xs_duration" type="dateTimeRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_dateTime" type="dateTimeRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_date" type="dateTimeRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_time" type="dateTimeRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_gYear" type="dateTimeRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_gYearMonth" type="dateTimeRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_gMonth" type="dateTimeRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_gMonthDay" type="dateTimeRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_gDay" type="dateTimeRestrictionType" substitutionGroup="simple_type"/>
+
+ <xs:element name="xs_QName" type="stringRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_Name" type="stringRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_NCName" type="stringRestrictionType" substitutionGroup="simple_type"/>
+
+ <xs:element name="xs_anyURI" type="stringRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_language" type="stringRestrictionType" substitutionGroup="simple_type"/>
+
+ <!-- Authorization information -->
+ <xs:element name="default_access">
+ <xs:complexType>
+ <xs:attribute name="role" type="xs:token" use="required"/>
+ <xs:attribute name="permissions" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:token">
+ <xs:pattern value="[rwx]{3}"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/mim2.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/mim2.xsd
new file mode 100644
index 0000000000..da6ff6bd7d
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/mim2.xsd
@@ -0,0 +1,506 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="http://www.ericsson.com/is/isco/mim/2.0" xmlns="http://www.ericsson.com/is/isco/mim/2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <!--
+ ============================================================================
+ %CCaseFile: mim.xsd %
+ %CCaseRev: /main/P4B/3 %
+ %CCaseDate: 2007-06-07 %
+ %CCaseDocNo: 22/155 19-CNA 113 082 Ux %
+ %Rev: Error in Revision! %
+ Author: EAB/AUL/IS Siri Hansen
+
+ ============================================================================
+
+ Copyright (c) Ericsson AB 2006-2007 All rights reserved.
+
+ The information in this document is the property of Ericsson.
+
+ Except as specifically authorized in writing by Ericsson, the
+ receiver of this document shall keep the information contained
+ herein confidential and shall protect the same in whole or in
+ part from disclosure and dissemination to third parties.
+
+ Disclosure and disseminations to the receivers employees shall
+ only be made on a strict need to know basis.
+ -->
+ <!-- Common -->
+ <xs:element name="description" type="xs:string"/>
+ <xs:element name="extension">
+ <xs:complexType>
+ <xs:group minOccurs="0" maxOccurs="unbounded" ref="anyElement"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:attributeGroup name="anyAttribute">
+ <xs:anyAttribute processContents="skip"/>
+ </xs:attributeGroup>
+ <xs:group name="anyElement">
+ <xs:sequence>
+ <xs:any processContents="skip"/>
+ </xs:sequence>
+ </xs:group>
+ <!-- Mim definition -->
+ <xs:element name="mim">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="extension"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="topClass"/>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:group ref="dataTypeDef"/>
+ <xs:element ref="exception"/>
+ </xs:choice>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="class"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="relationship"/>
+ </xs:sequence>
+ <xs:attribute name="version"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="topClass">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="sortPriority"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ <xs:attribute name="minOccurs"/>
+ <xs:attribute name="maxOccurs"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- MO class definition -->
+ <xs:element name="class">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="extension"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="default_access"/>
+ <xs:choice>
+ <xs:sequence>
+ <xs:element ref="singleton"/>
+ <xs:element minOccurs="0" ref="systemCreated"/>
+ <xs:element minOccurs="0" ref="readOnly"/>
+ <xs:group minOccurs="0" maxOccurs="unbounded" ref="dataTypeDef"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="attribute"/>
+ </xs:sequence>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="systemCreated"/>
+ <xs:element minOccurs="0" ref="readOnly"/>
+ <xs:group minOccurs="0" maxOccurs="unbounded" ref="dataTypeDef"/>
+ <xs:element maxOccurs="unbounded" ref="attribute"/>
+ </xs:sequence>
+ </xs:choice>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="action"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[A-Z][A-Za-z0-9]*"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="singleton">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="systemCreated">
+ <xs:complexType/>
+ </xs:element>
+ <!-- Relations -->
+ <xs:element name="relationship">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="extension"/>
+ <xs:element ref="containment"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="containment">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="parent"/>
+ <xs:element ref="child"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="parent" type="hasClass"/>
+ <xs:element name="child">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="hasClass">
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="cardinality"/>
+ <xs:element minOccurs="0" ref="sortPriority"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="sortPriority" type="xs:int"/>
+ <xs:element name="cardinality" type="rangeType"/>
+ <xs:complexType name="hasClass">
+ <xs:sequence>
+ <xs:element ref="hasClass"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="hasClass">
+ <xs:complexType>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- Data types -->
+ <xs:element name="simple_type" abstract="true" substitutionGroup="type"/>
+ <xs:element name="type" abstract="true"/>
+ <!-- For attributes, parameters and exceptions -->
+ <xs:group name="dataType">
+ <xs:sequence>
+ <xs:element name="dataType" nillable="true">
+ <xs:complexType>
+ <xs:choice>
+ <xs:element ref="type" minOccurs="0"/>
+ <xs:element ref="xs_list" minOccurs="0"/>
+ </xs:choice>
+ <xs:attribute name="name.ref" use="optional"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:group>
+ <xs:group name="simpleDataType">
+ <xs:sequence>
+ <xs:element name="dataType" nillable="true">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="simple_type" minOccurs="0"/>
+ </xs:sequence>
+ <xs:attribute name="name.ref" use="optional"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:group>
+ <xs:group name="dataTypeDef">
+ <xs:sequence>
+ <xs:element name="dataType">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="extension"/>
+ <xs:choice>
+ <xs:element ref="type"/>
+ <xs:element ref="xs_list"/>
+ </xs:choice>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:group>
+ <!-- For actions -->
+ <xs:element name="returnType">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:choice>
+ <xs:element ref="void"/>
+ <xs:group ref="dataType"/>
+ </xs:choice>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <!-- Return data types -->
+ <xs:element name="void">
+ <xs:complexType/>
+ </xs:element>
+ <!-- Primitive data types -->
+ <xs:complexType name="stringRestrictionType">
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="lengthRange"/>
+ <xs:element minOccurs="0" ref="validValues"/>
+ <xs:element minOccurs="0" ref="pattern"/>
+ <xs:element minOccurs="0" ref="defaultValue"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="dateTimeRestrictionType">
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="range"/>
+ <xs:element minOccurs="0" ref="validValues"/>
+ <xs:element minOccurs="0" ref="pattern"/>
+ <xs:element minOccurs="0" ref="defaultValue"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="numRestrictionType">
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="range"/>
+ <xs:element minOccurs="0" ref="defaultValue"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="boolean" substitutionGroup="simple_type">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="defaultValue"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="dateTime" type="dateTimeRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="float" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="integer" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="string" type="stringRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="pattern" type="xs:string"/>
+ <xs:element name="validValues">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" ref="value"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="value">
+ <xs:complexType>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="lengthRange" type="rangeType"/>
+ <xs:element name="range" type="rangeType"/>
+ <xs:complexType name="rangeType">
+ <xs:sequence>
+ <xs:element name="min" type="xs:string" minOccurs="0"/>
+ <xs:element name="max" type="xs:string" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="defaultValue" type="xs:string"/>
+ <!-- Struct data type -->
+ <xs:element name="struct" substitutionGroup="type">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" ref="structMember"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="structMember">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="extension"/>
+ <xs:group ref="dataType"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- List data type -->
+ <xs:element name="xs_list">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:group ref="simpleDataType"/>
+ <xs:element minOccurs="0" ref="lengthRange"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <!-- MoRef data type -->
+ <xs:element name="moRef" substitutionGroup="simple_type">
+ <xs:complexType>
+ <xs:attribute name="name" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[A-Z][A-Za-z0-9]*"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ <!-- Attribute -->
+ <xs:element name="attribute">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="extension"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="default_access"/>
+ <xs:group ref="dataType"/>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="initialValue"/>
+ <xs:element ref="pmData"/>
+ <xs:choice>
+ <xs:choice>
+ <xs:element ref="key"/>
+ <xs:element ref="readOnly"/>
+ </xs:choice>
+ <xs:choice>
+ <xs:choice>
+ <xs:element ref="readOnly"/>
+ <xs:choice>
+ <xs:element ref="mandatory"/>
+ <xs:element ref="restricted"/>
+ </xs:choice>
+ </xs:choice>
+ <xs:element ref="nonPersistent"/>
+ </xs:choice>
+ </xs:choice>
+ </xs:choice>
+ </xs:sequence>
+ <xs:attribute name="name" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[a-z][a-zA-Z0-9]*"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="initialValue" type="xs:string"/>
+ <xs:element name="key">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="mandatory">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="nonPersistent">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="pmData">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="extension"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="readOnly">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="restricted">
+ <xs:complexType/>
+ </xs:element>
+ <!-- Action -->
+ <xs:element name="action">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="extension"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="default_access"/>
+ <xs:element ref="returnType"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="parameter"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="raisesException"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[a-z][a-zA-Z0-9]*"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="parameter">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="extension"/>
+ <xs:group ref="dataType"/>
+ <xs:element minOccurs="0" ref="initialValue"/>
+ <xs:element minOccurs="0" ref="isOptional"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="isOptional">
+ <xs:complexType/>
+ </xs:element>
+ <xs:element name="exception">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="extension"/>
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="exceptionParameter"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="exceptionParameter">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="description"/>
+ <xs:element minOccurs="0" ref="extension"/>
+ <xs:group ref="dataType"/>
+ </xs:sequence>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="raisesException">
+ <xs:complexType>
+ <xs:attribute name="name" use="required"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- xs types, introduced in IS 2.0 -->
+ <xs:element name="xs_normalizedString" type="stringRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_token" type="stringRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_string" type="stringRestrictionType" substitutionGroup="simple_type"/>
+
+ <xs:element name="xs_base64Binary" type="stringRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_hexBinary" type="stringRestrictionType" substitutionGroup="simple_type"/>
+
+ <xs:element name="xs_integer" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_positiveInteger" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_negativeInteger" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_nonNegativeInteger" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_nonPositiveInteger" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_long" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_unsignedLong" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_int" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_unsignedInt" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_short" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_unsignedShort" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_byte" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_unsignedByte" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_decimal" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_float" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_double" type="numRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_boolean" substitutionGroup="simple_type">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="defaultValue"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="xs_duration" type="dateTimeRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_dateTime" type="dateTimeRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_date" type="dateTimeRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_time" type="dateTimeRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_gYear" type="dateTimeRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_gYearMonth" type="dateTimeRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_gMonth" type="dateTimeRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_gMonthDay" type="dateTimeRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_gDay" type="dateTimeRestrictionType" substitutionGroup="simple_type"/>
+
+ <xs:element name="xs_QName" type="stringRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_Name" type="stringRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_NCName" type="stringRestrictionType" substitutionGroup="simple_type"/>
+
+ <xs:element name="xs_anyURI" type="stringRestrictionType" substitutionGroup="simple_type"/>
+ <xs:element name="xs_language" type="stringRestrictionType" substitutionGroup="simple_type"/>
+
+ <!-- Password type -->
+ <!-- This is a string, which will not be visible in the CLI or in any logs. -->
+ <!-- The 'encrypt' attribute indicates if the string shall be sent encrypted -->
+ <!-- or in clear text to the blade system -->
+ <xs:element name="password" substitutionGroup="simple_type">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" ref="lengthRange"/>
+ </xs:sequence>
+ <xs:attribute name="enrypt" type="xs:boolean" use="optional"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- Authorization information -->
+ <xs:element name="default_access">
+ <xs:complexType>
+ <xs:attribute name="role" type="xs:token" use="required"/>
+ <xs:attribute name="permissions" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:token">
+ <xs:pattern value="[rwx]{3}"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/nc.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/nc.xsd
new file mode 100644
index 0000000000..60a320a61e
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/nc.xsd
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ericsson.com/is/isco/nc" xmlns="http://www.ericsson.com/is/isco/nc">
+ <xsd:attribute name="operation">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:normalizedString">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:enumeration value="merge"/>
+ <xsd:enumeration value="create"/>
+ <xsd:enumeration value="replace"/>
+ <xsd:enumeration value="delete"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:attribute>
+</xsd:schema>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/swm_mim.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/swm_mim.xml
new file mode 100644
index 0000000000..90afcb2b68
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/sis/swm_mim.xml
@@ -0,0 +1,881 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+
+<!--
+
+Copyright (C) Ericsson AB 2006 All rights reserved.
+
+The information in this document is the property of Ericsson.
+
+Except as specifically authorized in writing by Ericsson, the
+receiver of this document shall keep the information contained
+herein confidential and shall protext the same in whole or in part
+from disclosure and dissemination to third parties.
+
+Disclosure and disseminations to the receivers employees shall
+only be made on a strict need to know basis.
+
+-->
+
+
+<!-- MIM file for SWM -->
+
+
+ <mim xmlns="http://www.ericsson.com/is/isco/mim/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ericsson.com/is/isco/mim/2.0 /vobs/isac/sis/OAM_CRA1190047_1/CCS_CNA113082/doc/15519/mim.xsd ">
+
+ <!--___ Data types ________________________________ -->
+
+ <dataType name="SwmMatchStrategy">
+ <description>
+ Interpretation of given filename and path .
+ </description>
+ <string>
+ <validValues>
+ <value name="exact"/>
+ <value name="prefix"/>
+ <value name="unknown"/>
+ </validValues>
+ <!--defaultValue>exact</defaultValue-->
+ </string>
+ </dataType>
+
+ <dataType name="SwmDownloadStrategy">
+ <description>
+ Interpretation according to existing files.
+ </description>
+ <string>
+ <validValues>
+ <value name="onlyIfMissing"/>
+ <value name="always"/>
+ <value name="unknown"/>
+ </validValues>
+ <!--defaultValue>onlyIfMissing</defaultValue-->
+ </string>
+ </dataType>
+
+ <dataType name="ContainerType">
+ <description>
+ Type of a load module container.
+ </description>
+ <string>
+ <validValues>
+ <value name="bladeSystemInformation"/>
+ <value name="bladeInformation"/>
+ <value name="application"/>
+ <value name="rootFileSystem"/>
+ <value name="kernel"/>
+ <value name="correction"/>
+ </validValues>
+ <!--defaultValue>bladeSystemInformation</defaultValue-->
+ </string>
+ </dataType>
+
+
+ <dataType name="SwgStatus">
+ <description>
+ Indicates status of software groups. A software group is
+ complete if all included load module containers have been
+ downloaded and unpacked correctly. A software group is inconsistent
+ if the checksums of the load module containers do not match the
+ information in the system information CXP, or if the XML
+ data could not be registered.
+ </description>
+ <string>
+ <validValues>
+ <value name="complete"/>
+ <value name="incomplete"/>
+ <value name="inconsistent"/>
+ </validValues>
+ <!--defaultValue>incomplete</defaultValue-->
+ </string>
+ </dataType>
+
+ <dataType name="JobData">
+ <description>
+ Data to specify job progress, during its execution.
+ </description>
+ <struct>
+ <structMember name="jobDateOrdered">
+ <dataType><dateTime/></dataType>
+ </structMember>
+ <structMember name="jobStatus">
+ <description>
+ Indicator of job status.
+ A job should be started immediately, but could be postponed
+ if the total load on the system would become too high.
+ </description>
+ <dataType>
+ <string>
+ <validValues>
+ <value name="notStarted"/>
+ <value name="ongoing"/>
+ <value name="complete"/>
+ </validValues>
+ <!--defaultValue>notStarted</defaultValue-->
+ </string>
+ </dataType>
+ </structMember>
+ <structMember name="jobResult">
+ <description>
+ Possible results of a job action.
+ </description>
+ <dataType>
+ <string>
+ <validValues>
+ <value name="ok"/>
+ <value name="inputError"/>
+ <value name="executionError"/>
+ <value name="unknown"/>
+ </validValues>
+ <!--defaultValue>ok</defaultValue-->
+ </string>
+ </dataType>
+ </structMember>
+ <structMember name="jobInfo">
+ <dataType><string/></dataType>
+ </structMember>
+ <structMember name="jobProgress">
+ <dataType name.ref="IsTypes:Unsigned32"/>
+ </structMember>
+ <structMember name="jobLastStep">
+ <dataType name.ref="IsTypes:Unsigned32"/>
+ </structMember>
+ <structMember name="jobProgressReport">
+ <dataType><boolean/></dataType>
+ </structMember>
+ </struct>
+ </dataType><!-- JobData -->
+
+ <dataType name="FTPData">
+ <description>
+ Data to specify FTP server info, such as host, user,
+ password and path, to locate correct files or destination
+ for files.
+ </description>
+ <struct>
+ <structMember name="host">
+ <dataType><string/></dataType>
+ </structMember>
+ <structMember name="user">
+ <dataType><string/></dataType>
+ </structMember>
+ <structMember name="password">
+ <dataType><string/></dataType>
+ </structMember>
+ <structMember name="path">
+ <description>
+ Absolute path including filename.
+ </description>
+ <dataType><string/></dataType>
+ </structMember>
+ </struct>
+ </dataType><!-- FTPData -->
+
+ <dataType name="BladeUgSpecification">
+ <description>
+ Specification of a blade when an upgrade job is ordered for a
+ specific blade. This data always belongs to and is included in
+ an upgrade job for a blade system.
+ </description>
+ <struct>
+ <structMember name="bladeSubrack">
+ <dataType name.ref="IsTypes:Unsigned32"/>
+ </structMember>
+ <structMember name="bladeSlot">
+ <dataType name.ref="IsTypes:Unsigned32"/>
+ </structMember>
+ <structMember name="bladeSwgProdNr">
+ <dataType><string/></dataType>
+ </structMember>
+ <structMember name="bladeSwgVersion">
+ <dataType><string/></dataType>
+ </structMember>
+ </struct>
+ </dataType> <!-- BladeUgSpecification -->
+
+ <!--___ CLASSes for tables (no STRUCTs) ________________ -->
+
+ <!-- Inventory Classes -->
+
+ <class name="SoftwareDeliveryPackage">
+ <description>
+ Container of files of data, or binary executables, needed to run the system.
+ </description>
+ <systemCreated/>
+ <readOnly/>
+ <attribute name="prodNr">
+ <dataType><string/></dataType>
+ <key/>
+ </attribute>
+ <attribute name="version"> <dataType><string/></dataType>
+ <key/>
+ </attribute>
+ <attribute name="name">
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="type">
+ <dataType name.ref="ContainerType">
+ </dataType>
+ <readOnly/>
+ </attribute>
+ <action name="delete">
+ <description>
+ Action to delete SoftwareDeliveryPackage.
+ </description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ </class> <!-- SoftwareDeliveryPackage -->
+
+ <class name="SoftwareGroup">
+ <description>
+ Contains one or more SoftwareDeliveryPackage.
+ </description>
+ <systemCreated/>
+ <readOnly/>
+ <attribute name="prodNr">
+ <dataType><string/></dataType>
+ <key/>
+ </attribute>
+ <attribute name="version">
+ <dataType><string/></dataType>
+ <key/>
+ </attribute>
+ <attribute name="name">
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="systemProdNr">
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="systemVersion">
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="systemName">
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="integratedSystemProdNr">
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="integratedSystemVersion">
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="integratedSystemName">
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="relatedCXPs">
+ <dataType>
+ <xs_list>
+ <dataType>
+ <moRef name="SoftwareDeliveryPackage"/>
+ </dataType>
+ </xs_list>
+ </dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="status">
+ <dataType name.ref="SwgStatus">
+ </dataType>
+ <readOnly/>
+ </attribute>
+ <action name="delete">
+ <description>
+ Action to delete Software Group.
+ </description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ </class> <!-- SoftwareGroup -->
+
+ <class name="LocalBackup">
+ <description>
+ All available backups locally stored.
+ </description>
+ <systemCreated/>
+ <readOnly/>
+ <attribute name="backupId">
+ <dataType name.ref="IsTypes:Unsigned32">
+ </dataType>
+ <key/>
+ </attribute>
+ <attribute name="name">
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="bladeSystem">
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="date">
+ <dataType>
+ <dateTime/>
+ </dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="size">
+ <dataType name.ref="IsTypes:Unsigned32">
+ </dataType>
+ <readOnly/>
+ </attribute>
+ <action name="exportBackup">
+ <description>
+ Action to export backup file to FTP server from
+ local disk storage. An instance of the class
+ Software/Jobs/Backup/Export is created as a log of this
+ action.
+ </description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="jobId">
+ <dataType><string/></dataType>
+ </parameter>
+ <parameter name="host">
+ <dataType><string/></dataType>
+ </parameter>
+ <parameter name="user">
+ <dataType><string/></dataType>
+ </parameter>
+ <parameter name="password">
+ <dataType><string/></dataType>
+ </parameter>
+ <parameter name="path">
+ <description>
+ Absolute path including filename.
+ </description>
+ <dataType><string/></dataType>
+ </parameter>
+ </action>
+ <action name="delete">
+ <description>
+ Action to delete backup.
+ </description>
+ <returnType>
+ <void/>
+ </returnType>
+ </action>
+ </class> <!-- LocalBackup -->
+
+ <class name="Alarm">
+ <description>
+ Information and cause of all currently active software configuration alarms.
+ </description>
+ <systemCreated/>
+ <readOnly/>
+ <attribute name="id">
+ <dataType name.ref="IsTypes:Unsigned32"/>
+ <key/>
+ </attribute>
+ <attribute name="bladeSystem">
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="cause">
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="info">
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+ </class> <!-- Alarm -->
+
+
+ <!-- Jobs Classes -->
+
+ <class name="DownloadFile">
+ <description>
+ This MO contains information about requested, ongoing,
+ and completed software file download jobs. To start a
+ download job the operator calls an action Inventory class,
+ and a new instance of this MO is created.
+ For load regulating reasons a requested job may not start
+ immediately.
+ </description>
+ <systemCreated/>
+ <readOnly/>
+ <attribute name="jobId">
+ <dataType><string/></dataType>
+ <key/>
+ </attribute>
+ <attribute name="jobData">
+ <dataType name.ref="JobData"/>
+ <readOnly/>
+ </attribute>
+ <attribute name="ftpData">
+ <dataType name.ref="FTPData"/>
+ <readOnly/>
+ </attribute>
+ <attribute name="matchStrategy">
+ <dataType name.ref="SwmMatchStrategy">
+ </dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="downloadStrategy">
+ <dataType name.ref="SwmDownloadStrategy">
+ </dataType>
+ <readOnly/>
+ </attribute>
+ </class><!-- DownloadFile -->
+
+ <class name="Upgrade">
+ <description>
+ This MO handles upgrade jobs towards the system. The operator
+ may specify a specific blade to run the upgrade on, instead of
+ running an upgrade on the entire blade system.
+ </description>
+ <systemCreated/>
+ <readOnly/>
+ <attribute name="jobId">
+ <dataType><string/></dataType>
+ <key/>
+ </attribute>
+ <attribute name="jobData">
+ <dataType name.ref="JobData"/>
+ <readOnly/>
+ </attribute>
+ <attribute name="bladeSystem">
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="swgProdNr">
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="swgVersion">
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="cxrProdNr">
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="cxrVersion">
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="maxTime">
+ <description>
+ The maximum time allowed for the SW Upgrade
+ job to finish. After this time, the job will be interrupted.
+ The value 0 means that MaxTime will be given the
+ timer value registered with the Blade System Software Group
+ Version. If no such value has been registered,
+ MaxTime will be given a system default timer value.
+ </description>
+ <dataType name.ref="IsTypes:Unsigned32">
+ </dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="bladeUgSpecification">
+ <dataType name.ref="BladeUgSpecification"/>
+ <readOnly/>
+ </attribute>
+ </class><!-- Upgrade -->
+
+
+
+ <!-- Backup Classes -->
+
+ <class name="Create">
+ <description>
+ This MO handles creation of backups of the system.
+ </description>
+ <systemCreated/>
+ <readOnly/>
+ <attribute name="jobId">
+ <dataType><string/></dataType>
+ <key/>
+ </attribute>
+ <attribute name="jobData">
+ <dataType name.ref="JobData"/>
+ <readOnly/>
+ </attribute>
+ <attribute name="backupId">
+ <dataType name.ref="IsTypes:Unsigned32">
+ </dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="targetBladeSystem">
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="backupName">
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+ </class><!-- Create -->
+
+ <class name="Restore">
+ <description>
+ This MO handles restore of backups of the system.
+ </description>
+ <systemCreated/>
+ <readOnly/>
+ <attribute name="jobId">
+ <dataType><string/></dataType>
+ <key/>
+ </attribute>
+ <attribute name="jobData">
+ <dataType name.ref="JobData"/>
+ <readOnly/>
+ </attribute>
+ <attribute name="backupId">
+ <dataType name.ref="IsTypes:Unsigned32">
+ </dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="targetBladeSystem">
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="backupName">
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+ </class><!-- Restore -->
+
+ <class name="Import">
+ <description>
+ This MO handles import of backup files from the FTP server.
+ The backup file is stored locally, but not loaded into the system.
+ </description>
+ <systemCreated/>
+ <readOnly/>
+ <attribute name="jobId">
+ <dataType><string/></dataType>
+ <key/>
+ </attribute>
+ <attribute name="jobData">
+ <dataType name.ref="JobData"/>
+ <readOnly/>
+ </attribute>
+ <attribute name="ftpData">
+ <dataType name.ref="FTPData"/>
+ <readOnly/>
+ </attribute>
+ </class><!-- Import -->
+
+ <class name="Export">
+ <description>
+ This MO handles export of locally stored backup files to
+ the FTP server.
+ </description>
+ <systemCreated/>
+ <readOnly/>
+ <attribute name="jobId">
+ <dataType><string/></dataType>
+ <key/>
+ </attribute>
+ <attribute name="jobData">
+ <dataType name.ref="JobData"/>
+ <readOnly/>
+ </attribute>
+ <attribute name="ftpData">
+ <dataType name.ref="FTPData"/>
+ <readOnly/>
+ </attribute>
+ <attribute name="backupId">
+ <dataType name.ref="IsTypes:Unsigned32">
+ </dataType>
+ <readOnly/>
+ </attribute>
+ <attribute name="backupName">
+ <dataType><string/></dataType>
+ <readOnly/>
+ </attribute>
+ </class><!-- Export -->
+
+
+ <!--____ CLASSes for hierarchic relations __________________ -->
+
+ <class name="Software">
+ <description>
+ Describes the Software management service
+ in the Integrated Site services management functional area (MFA).
+ </description>
+ <singleton/>
+ </class> <!-- software -->
+
+ <class name="Inventory">
+ <description>
+ System created data for information and overview.
+ Some data is created as a result of an action called by the
+ operator.
+ </description>
+ <singleton/>
+ <action name="downloadFile">
+ <description>
+ Action to download file/s from FTP server to
+ local disk storage. An instance of the MO class
+ Software/Jobs/DownloadFile is created as a log of this
+ action.
+ </description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="jobId">
+ <dataType><string/></dataType>
+ </parameter>
+ <parameter name="host">
+ <dataType><string/></dataType>
+ </parameter>
+ <parameter name="user">
+ <dataType><string/></dataType>
+ </parameter>
+ <parameter name="password">
+ <dataType><string/></dataType>
+ </parameter>
+ <parameter name="path">
+ <description>
+ Absolute path including filename.
+ </description>
+ <dataType><string/></dataType>
+ </parameter>
+ <parameter name="matchStrategy">
+ <dataType name.ref="SwmMatchStrategy"></dataType>
+ </parameter>
+ <parameter name="downloadStrategy">
+ <dataType name.ref="SwmDownloadStrategy"></dataType>
+ </parameter>
+ </action>
+ <action name="importBackup">
+ <description>
+ Action to import backup file from FTP server to
+ to local disk storage. An instance of the MO class
+ Software/Jobs/Backup/Import is created as a log of this
+ action.
+ </description>
+ <returnType>
+ <void/>
+ </returnType>
+ <parameter name="jobId">
+ <dataType><string/></dataType>
+ </parameter>
+ <parameter name="host">
+ <dataType><string/></dataType>
+ </parameter>
+ <parameter name="user">
+ <dataType><string/></dataType>
+ </parameter>
+ <parameter name="password">
+ <dataType><string/></dataType>
+ </parameter>
+ <parameter name="path">
+ <description>
+ Absolute path including filename.
+ </description>
+ <dataType><string/></dataType>
+ </parameter>
+ </action>
+ </class> <!-- Inventory -->
+
+ <class name="Jobs">
+ <description>
+ Subclass to top class Software. Parent of
+ Jobs classes:
+ DownloadFile,
+ Upgrade,
+ Backup.
+ Contains system created data through ordered job actions.
+ </description>
+ <singleton/>
+ </class> <!-- Jobs -->
+
+ <class name="Backup">
+ <description>
+ Subclass to class Jobs. Parent of
+ Jobs classes:
+ Create,
+ Restore
+ Import,
+ Export.
+<!-- CreateAndExport,
+ ImportAndRestore.-->
+ Contains system created data through ordered backup job actions.
+ </description>
+ <singleton/>
+ </class> <!-- Backup -->
+
+
+ <!--____ RELATIONSHIPs ______________________________-->
+
+ <!-- Top Class Relations -->
+ <relationship name="SwmTop">
+ <containment>
+ <parent>
+ <hasClass name="top_mim:Is"/>
+ </parent>
+ <child>
+ <hasClass name="Software"/>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Software_to_Inventory">
+ <containment>
+ <parent>
+ <hasClass name="Software"/>
+ </parent>
+ <child>
+ <hasClass name="Inventory"/>
+ <cardinality>
+ <min>1</min>
+ <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Software_to_Jobs">
+ <containment>
+ <parent>
+ <hasClass name="Software"/>
+ </parent>
+ <child>
+ <hasClass name="Jobs"/>
+ <cardinality>
+ <min>1</min>
+ <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <!-- Inventory Class Relations -->
+ <relationship name="Inventory_to_SoftwareDeliveryPackage">
+ <containment>
+ <parent>
+ <hasClass name="Inventory"/>
+ </parent>
+ <child>
+ <hasClass name="SoftwareDeliveryPackage"/>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Inventory_to_SoftwareGroup">
+ <containment>
+ <parent>
+ <hasClass name="Inventory"/>
+ </parent>
+ <child>
+ <hasClass name="SoftwareGroup"/>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Inventory_to_LocalBackup">
+ <containment>
+ <parent>
+ <hasClass name="Inventory"/>
+ </parent>
+ <child>
+ <hasClass name="LocalBackup"/>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Inventory_to_Alarm">
+ <containment>
+ <parent>
+ <hasClass name="Inventory"/>
+ </parent>
+ <child>
+ <hasClass name="Alarm"/>
+ </child>
+ </containment>
+ </relationship>
+
+ <!-- Jobs Class Relations -->
+ <relationship name="Jobs_to_DownloadFile">
+ <containment>
+ <parent>
+ <hasClass name="Jobs"/>
+ </parent>
+ <child>
+ <hasClass name="DownloadFile"/>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Jobs_to_Upgrade">
+ <containment>
+ <parent>
+ <hasClass name="Jobs"/>
+ </parent>
+ <child>
+ <hasClass name="Upgrade"/>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Jobs_to_Backup">
+ <containment>
+ <parent>
+ <hasClass name="Jobs"/>
+ </parent>
+ <child>
+ <hasClass name="Backup"/>
+ <cardinality>
+ <min>1</min>
+ <max>1</max>
+ </cardinality>
+ </child>
+ </containment>
+ </relationship>
+
+ <!-- Backup Class Relations -->
+ <relationship name="Backup_to_Create">
+ <containment>
+ <parent>
+ <hasClass name="Backup"/>
+ </parent>
+ <child>
+ <hasClass name="Create"/>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Backup_to_Restore">
+ <containment>
+ <parent>
+ <hasClass name="Backup"/>
+ </parent>
+ <child>
+ <hasClass name="Restore"/>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Backup_to_Import">
+ <containment>
+ <parent>
+ <hasClass name="Backup"/>
+ </parent>
+ <child>
+ <hasClass name="Import"/>
+ </child>
+ </containment>
+ </relationship>
+
+ <relationship name="Backup_to_Export">
+ <containment>
+ <parent>
+ <hasClass name="Backup"/>
+ </parent>
+ <child>
+ <hasClass name="Export"/>
+ </child>
+ </containment>
+ </relationship>
+ </mim>
+
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/small.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/small.xml
new file mode 100644
index 0000000000..b0358f467d
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/small.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<purchaseOrder
+ xmlns="small"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="small small.xsd"
+ orderDate="1999-10-20">
+This is the content of the element
+</purchaseOrder>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/small.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/small.xsd
new file mode 100644
index 0000000000..00d49db22d
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/small.xsd
@@ -0,0 +1,60 @@
+<xsd:schema
+ targetNamespace="small"
+ xmlns:sm="small"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+ <xsd:annotation>
+ <xsd:documentation xml:lang="en">
+ Purchase order schema for Example.com.
+ Copyright 2000 Example.com. All rights reserved.
+ </xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:element name="purchaseOrder" type="sm:PurchaseOrderType"/>
+
+ <xsd:element name="comment" type="xsd:string"/>
+
+ <xsd:complexType name="PurchaseOrderType" mixed="true">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="orderDate" type="xsd:date"/>
+ <xsd:attribute name="orderStatus" type="xsd:string" default="new"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+
+ <complexType name="own1">
+ <complexContent>
+ <restriction base="xsd:anyType">
+ <attribute name="number" type="xsd:integer"/>
+ <attribute name="quantity" type="xsd:positiveInteger"/>
+ </restriction>
+ </complexContent>
+ </complexType>
+
+ <complexType name="PartsType">
+ <sequence>
+ <element name="part" maxOccurs="unbounded">
+ <complexType>
+ <simpleContent>
+ <extension base="xsd:string">
+ <attribute name="number" type="xsd:integer"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+ </element>
+ </sequence>
+ </complexType>
+
+<simpleType name="listOfMyIntType">
+ <list itemType="xsd:integer"/>
+</simpleType>
+
+<simpleType name="SixUSStates">
+ <restriction base="sm:listOfMyIntType">
+ <length value="6"/>
+ </restriction>
+</simpleType>
+
+</xsd:schema>
+
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_7288.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_7288.xml
new file mode 100644
index 0000000000..9108e96bed
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_7288.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+ <IMSSubscription>
+ <PrivateID>[email protected]</PrivateID>
+ <ServiceProfile>
+ <PublicIdentity>
+ <BarringIndication>1</BarringIndication>
+ <Identity>sip:[email protected]</Identity>
+ </PublicIdentity>
+ <PublicIdentity>
+ <Identity>sip:[email protected]</Identity>
+ </PublicIdentity>
+ <InitialFilterCriteria>
+ <Priority>0</Priority>
+ <TriggerPoint>
+ <ConditionTypeCNF>1</ConditionTypeCNF>
+ <SPT>
+ <ConditionNegated>0</ConditionNegated>
+ <Group>0</Group>
+ <Method>INVITE</Method>
+ </SPT>
+ <SPT>
+ <ConditionNegated>0</ConditionNegated>
+ <Group>0</Group>
+ <Method>MESSAGE</Method>
+ </SPT>
+ <SPT>
+ <ConditionNegated>0</ConditionNegated>
+ <Group>0</Group>
+ <Method>SUBSCRIBE</Method>
+ </SPT>
+ <SPT>
+ <ConditionNegated>0</ConditionNegated>
+ <Group>1</Group>
+ <Method>INVITE</Method>
+ </SPT>
+ <SPT>
+ <ConditionNegated>0</ConditionNegated>
+ <Group>1</Group>
+ <Method>MESSAGE</Method>
+ </SPT>
+
+ <SPT>
+ <ConditionNegated>1</ConditionNegated>
+ <Group>1</Group>
+ <SIPHeader>
+ <Header>From</Header>
+ <Content>"joe"</Content>
+ </SIPHeader>
+ </SPT>
+ </TriggerPoint>
+ <ApplicationServer>
+ <ServerName>sip:[email protected]</ServerName>
+ </ApplicationServer>
+ </InitialFilterCriteria>
+ </ServiceProfile>
+ </IMSSubscription>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_8599.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_8599.xml
new file mode 100644
index 0000000000..1eacfc756e
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_8599.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+
+<persons>
+<person>lars thorsen</person>
+<person></person>
+</persons>
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_8599.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_8599.xsd
new file mode 100644
index 0000000000..977f043bb7
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/ticket_8599.xsd
@@ -0,0 +1,17 @@
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:element name="persons" type="p"/>
+
+ <xs:complexType name="p">
+ <xs:sequence>
+ <xs:element name="person" type="string" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+
+ <xs:simpleType name="string">
+ <xs:restriction base="xs:string">
+ </xs:restriction>
+ </xs:simpleType>
+
+</xs:schema> \ No newline at end of file
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/vehicle.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/vehicle.xml
new file mode 100644
index 0000000000..61aacbc8d0
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/vehicle.xml
@@ -0,0 +1,117 @@
+<?xml version="1.0"?>
+<root>
+ <state>
+ <code>AL</code>
+ <vehicle plateNumber="1123" state="AL"/>
+ <vehicle plateNumber="1125" state="AK"/>
+ <vehicle plateNumber="1124" state="AL"/>
+ <vehicle plateNumber="1223" state="AL"/>
+ <vehicle plateNumber="1323" state="AL"/>
+ <vehicle plateNumber="1225" state="AS"/>
+ <vehicle plateNumber="1126" state="AZ"/>
+ <vehicle plateNumber="1127" state="AR"/>
+ <vehicle plateNumber="1128" state="FL"/>
+ <vehicle plateNumber="2341" state="FL"/>
+ <vehicle plateNumber="1129" state="FL"/>
+ <vehicle plateNumber="1133" state="FL"/>
+ <vehicle plateNumber="22123" state="MO"/>
+ <vehicle plateNumber="22124" state="MI"/>
+ <person>
+ <car regState="AL" regPlate="1123"/>
+ </person>
+ <person>
+ <car regState="AK" regPlate="1125"/>
+ </person>
+ <person>
+ <car regState="AL" regPlate="1124"/>
+ <car regState="AL" regPlate="1223"/>
+ </person>
+ <person>
+ <car regState="AL" regPlate="1323"/>
+ </person>
+ <person>
+ <car regState="AS" regPlate="1225"/>
+ </person>
+ <person>
+ <car regState="AZ" regPlate="1126"/>
+ </person>
+ <person>
+ <car regState="AR" regPlate="1127"/>
+ </person>
+ <person>
+ <car regState="FL" regPlate="2341"/>
+ </person>
+ <person>
+ <car regState="FL" regPlate="1128"/>
+ </person>
+ <person>
+ <car regState="FL" regPlate="1133"/>
+ </person>
+ <person>
+ <car regState="FL" regPlate="1129"/>
+ </person>
+ <person>
+ <car regState="MO" regPlate="22123"/>
+ </person>
+ <person>
+ <car regState="MI" regPlate="22124"/>
+ </person>
+ </state>
+ <state>
+ <code>CO</code>
+ <vehicle plateNumber="1123" state="AL"/>
+ <vehicle plateNumber="1120" state="AK"/>
+ <vehicle plateNumber="1124" state="AL"/>
+ <vehicle plateNumber="1221" state="AL"/>
+ <vehicle plateNumber="1323" state="AL"/>
+ <vehicle plateNumber="1223" state="AS"/>
+ <vehicle plateNumber="1126" state="AZ"/>
+ <vehicle plateNumber="1127" state="AR"/>
+ <vehicle plateNumber="1128" state="FL"/>
+ <vehicle plateNumber="2341" state="FL"/>
+ <vehicle plateNumber="1125" state="FL"/>
+ <vehicle plateNumber="1133" state="FL"/>
+ <vehicle plateNumber="22123" state="MO"/>
+ <vehicle plateNumber="22124" state="MI"/>
+ <person>
+ <car regState="AL" regPlate="1123"/>
+ </person>
+ <person>
+ <car regState="AK" regPlate="1120"/>
+ </person>
+ <person>
+ <car regState="AL" regPlate="1124"/>
+ </person>
+ <person>
+ <car regState="AL" regPlate="1221"/>
+ </person>
+ <person>
+ <car regState="AL" regPlate="1323"/>
+ </person>
+ <person>
+ <car regState="AS" regPlate="1223"/>
+ </person>
+ <person>
+ <car regState="AZ" regPlate="1126"/>
+ </person>
+ <person>
+ <car regState="AR" regPlate="1127"/>
+ </person>
+ <person>
+ <car regState="FL" regPlate="2341"/>
+ </person>
+ <person>
+ <car regState="FL" regPlate="1128"/>
+ </person>
+ <person>
+ <car regState="FL" regPlate="1133"/>
+ <car regState="FL" regPlate="1125"/>
+ </person>
+ <person>
+ <car regState="MO" regPlate="22123"/>
+ </person>
+ <person>
+ <car regState="MI" regPlate="22124"/>
+ </person>
+ </state>
+</root> \ No newline at end of file
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/vehicle.xsd b/lib/xmerl/test/xmerl_xsd_SUITE_data/vehicle.xsd
new file mode 100644
index 0000000000..2e7c053497
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/vehicle.xsd
@@ -0,0 +1,82 @@
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:element name="vehicle">
+ <xs:complexType>
+ <xs:attribute name="plateNumber" type="xs:integer"/>
+ <xs:attribute name="state" type="twoLetterCode"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="state">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="code" type="twoLetterCode"/>
+ <xs:element ref="vehicle" maxOccurs="unbounded"/>
+ <xs:element ref="person" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:key name="reg"> <!-- vehicles are keyed by their plate within states -->
+ <xs:selector xpath=".//vehicle"/>
+ <xs:field xpath="@plateNumber"/>
+ </xs:key>
+ </xs:element>
+
+ <xs:element name="root">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="state" maxOccurs="51"/>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:key name="state"> <!-- states are keyed by their code -->
+ <xs:selector xpath=".//state"/>
+ <xs:field xpath="code"/>
+ </xs:key>
+
+ <xs:keyref name="vehicleState" refer="state">
+ <!-- every vehicle refers to its state -->
+ <xs:selector xpath=".//vehicle"/>
+ <xs:field xpath="@state"/>
+ </xs:keyref>
+
+ <xs:key name="regKey"> <!-- vehicles are keyed by a pair of state and plate -->
+ <xs:selector xpath=".//vehicle"/>
+ <xs:field xpath="@state"/>
+ <xs:field xpath="@plateNumber"/>
+ </xs:key>
+
+ <xs:keyref name="carRef" refer="regKey"> <!-- people's cars are a reference -->
+ <xs:selector xpath=".//car"/>
+ <xs:field xpath="@regState"/>
+ <xs:field xpath="@regPlate"/>
+ </xs:keyref>
+
+ </xs:element>
+
+ <xs:element name="person">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="car" maxOccurs="2">
+ <xs:complexType>
+ <xs:attribute name="regState" type="twoLetterCode"/>
+ <xs:attribute name="regPlate" type="xs:integer"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:simpleType name="twoLetterCode">
+ <xs:restriction base="xs:string">
+ <xs:maxLength value="2"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="threeLetterCode">
+ <xs:restriction base="xs:string">
+ <xs:maxLength value="3"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+</xs:schema> \ No newline at end of file
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/vehicle2.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/vehicle2.xml
new file mode 100644
index 0000000000..6b60c83e6a
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/vehicle2.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0"?>
+<root>
+ <state>
+ <code>AL</code>
+ <vehicle plateNumber="1123" state="AL"/>
+ <vehicle plateNumber="1121" state="AK"/>
+ <vehicle plateNumber="1124" state="AL"/>
+ <vehicle plateNumber="1221" state="AL"/>
+ <vehicle plateNumber="1122" state="AL"/>
+ <vehicle plateNumber="1225" state="AS"/>
+ <vehicle plateNumber="1126" state="AZ"/>
+ <vehicle plateNumber="1127" state="AR"/>
+ <vehicle plateNumber="1128" state="FL"/>
+ <vehicle plateNumber="2341" state="FL"/>
+ <vehicle plateNumber="1125" state="FL"/>
+ <vehicle plateNumber="1133" state="FL"/>
+ <vehicle plateNumber="22123" state="MO"/>
+ <vehicle plateNumber="22124" state="MI"/>
+ <person>
+ <car regState="AL" regPlate="1122"/>
+ </person>
+ <person>
+ <car regState="AK" regPlate="1121"/>
+ </person>
+ <person>
+ <car regState="AL" regPlate="1124"/>
+ <car regState="AL" regPlate="1221"/>
+ </person>
+ <person>
+ <car regState="AL" regPlate="1123"/>
+ </person>
+ <person>
+ <car regState="AS" regPlate="1225"/>
+ </person>
+ <person>
+ <car regState="AZ" regPlate="1126"/>
+ </person>
+ <person>
+ <car regState="AR" regPlate="1127"/>
+ </person>
+ <person>
+ <car regState="FL" regPlate="2341"/>
+ </person>
+ <person>
+ <car regState="FL" regPlate="1128"/>
+ </person>
+ <person>
+ <car regState="FL" regPlate="1133"/>
+ </person>
+ <person>
+ <car regState="FL" regPlate="1125"/>
+ </person>
+ <person>
+ <car regState="MO" regPlate="22123"/>
+ </person>
+ <person>
+ <car regState="MI" regPlate="22124"/>
+ </person>
+ </state>
+
+</root> \ No newline at end of file
diff --git a/lib/xmerl/test/xmerl_xsd_SUITE_data/vehicle3.xml b/lib/xmerl/test/xmerl_xsd_SUITE_data/vehicle3.xml
new file mode 100644
index 0000000000..37536c7335
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_SUITE_data/vehicle3.xml
@@ -0,0 +1,117 @@
+<?xml version="1.0"?>
+<root>
+ <state>
+ <code>AL</code>
+ <vehicle plateNumber="1123" state="AL"/>
+ <vehicle plateNumber="1125" state="AK"/>
+ <vehicle plateNumber="1124" state="AL"/>
+ <vehicle plateNumber="1223" state="AL"/>
+ <vehicle plateNumber="1323" state="AL"/>
+ <vehicle plateNumber="1225" state="AS"/>
+ <vehicle plateNumber="1126" state="AZ"/>
+ <vehicle plateNumber="1127" state="AR"/>
+ <vehicle plateNumber="1128" state="FL"/>
+ <vehicle plateNumber="2341" state="FL"/>
+ <vehicle plateNumber="1129" state="FL"/>
+ <vehicle plateNumber="1133" state="FL"/>
+ <vehicle plateNumber="22123" state="MO"/>
+ <vehicle plateNumber="22124" state="MI"/>
+ <person>
+ <car regState="AL" regPlate="1123"/>
+ </person>
+ <person>
+ <car regState="AK" regPlate="1125"/>
+ </person>
+ <person>
+ <car regState="AL" regPlate="1124"/>
+ <car regState="AL" regPlate="1223"/>
+ </person>
+ <person>
+ <car regState="AL" regPlate="1323"/>
+ </person>
+ <person>
+ <car regState="AS" regPlate="1225"/>
+ </person>
+ <person>
+ <car regState="AZ" regPlate="1126"/>
+ </person>
+ <person>
+ <car regState="AR" regPlate="1127"/>
+ </person>
+ <person>
+ <car regState="FL" regPlate="2341"/>
+ </person>
+ <person>
+ <car regState="FL" regPlate="1128"/>
+ </person>
+ <person>
+ <car regState="FL" regPlate="1133"/>
+ </person>
+ <person>
+ <car regState="FL" regPlate="1129"/>
+ </person>
+ <person>
+ <car regState="MO" regPlate="22123"/>
+ </person>
+ <person>
+ <car regState="MI" regPlate="22124"/>
+ </person>
+ </state>
+ <state>
+ <code>CO</code>
+ <vehicle plateNumber="1123" state="CO"/>
+ <vehicle plateNumber="1120" state="AK"/>
+ <vehicle plateNumber="1124" state="CO"/>
+ <vehicle plateNumber="1221" state="AL"/>
+ <vehicle plateNumber="1323" state="CO"/>
+ <vehicle plateNumber="1223" state="AS"/>
+ <vehicle plateNumber="1126" state="CO"/>
+ <vehicle plateNumber="1127" state="CA"/>
+ <vehicle plateNumber="1128" state="DE"/>
+ <vehicle plateNumber="2341" state="DC"/>
+ <vehicle plateNumber="1125" state="FL"/>
+ <vehicle plateNumber="1133" state="GA"/>
+ <vehicle plateNumber="22123" state="GU"/>
+ <vehicle plateNumber="22124" state="HI"/>
+ <person>
+ <car regState="CO" regPlate="1123"/>
+ </person>
+ <person>
+ <car regState="AK" regPlate="1120"/>
+ </person>
+ <person>
+ <car regState="CO" regPlate="1124"/>
+ </person>
+ <person>
+ <car regState="AL" regPlate="1221"/>
+ </person>
+ <person>
+ <car regState="CO" regPlate="1323"/>
+ </person>
+ <person>
+ <car regState="AS" regPlate="1223"/>
+ </person>
+ <person>
+ <car regState="CO" regPlate="1126"/>
+ </person>
+ <person>
+ <car regState="CA" regPlate="1127"/>
+ </person>
+ <person>
+ <car regState="DC" regPlate="2341"/>
+ </person>
+ <person>
+ <car regState="DE" regPlate="1128"/>
+ </person>
+ <person>
+ <car regState="GA" regPlate="1133"/>
+ <car regState="FL" regPlate="1125"/>
+ </person>
+ <person>
+ <car regState="GU" regPlate="22123"/>
+ </person>
+ <person>
+ <car regState="HI" regPlate="22124"/>
+ </person>
+ </state>
+</root> \ No newline at end of file
diff --git a/lib/xmerl/test/xmerl_xsd_Sun2002-01-16_SUITE.erl b/lib/xmerl/test/xmerl_xsd_Sun2002-01-16_SUITE.erl
new file mode 100644
index 0000000000..e619390f65
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_Sun2002-01-16_SUITE.erl
@@ -0,0 +1,812 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2006-2010. 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%
+%%
+%%
+%%% Purpose : Test suite for the xmerl application
+
+%% Do NOT edit this file. It is generated by the generate_xsd_suite module
+%% For more info read the comments in the header of that file.
+
+-module('xmerl_xsd_Sun2002-01-16_SUITE').
+
+-compile(export_all).
+
+-include_lib("test_server/include/test_server.hrl").
+-include_lib("xmerl/include/xmerl.hrl").
+-include_lib("xmerl/include/xmerl_xsd.hrl").
+
+
+all() ->
+ ['Sun-idc001.nogen', 'Sun-idc002.e', 'Sun-idc002b.e',
+ 'Sun-idc003.e', 'Sun-idc004.nogen', 'Sun-idc004a.e',
+ 'Sun-idc005.nogen', 'Sun-idc006.nogen', 'Sun-xsd001',
+ 'Sun-xsd002', 'Sun-xsd003-1.e', 'Sun-xsd003-2.e',
+ 'Sun-xsd003a', 'Sun-xsd003b', 'Sun-xsd004',
+ 'Sun-xsd005', 'Sun-xsd006', 'Sun-xsd008', 'Sun-xsd011',
+ 'Sun-xsd012', 'Sun-xsd013.e', 'Sun-xsd014.e',
+ 'Sun-xsd015.e', 'Sun-xsd016.e', 'Sun-xsd017.e',
+ 'Sun-xsd018.e', 'Sun-xsd019.e', 'Sun-xsd020.e',
+ 'Sun-xsd020-2.e', 'Sun-xsd020-3.e', 'Sun-xsd020-4.e',
+ 'Sun-xsd021', 'Sun-xsd022', 'Sun-xsd023.e',
+ 'Sun-xsiType1', 'Sun-xsiType-block-1',
+ 'Sun-xsiType-block-2', 'Sun-xsiType-block-3',
+ 'Sun-xsiType-block-4', 'Sun-type-and-subst-1'].
+
+groups() ->
+ [].
+
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+
+%% initialization before the test suite
+init_per_suite(Config) ->
+ Dog=test_server:timetrap({minutes,10}),
+ xmerl_xsd_lib:unpack(Config,sun),
+ {ok,LogFile} = xmerl_xsd_lib:create_error_log_file(Config,sun),
+ test_server:timetrap_cancel(Dog),
+ [{suite,sun},{xmerl_error_log,LogFile}|Config].
+
+end_per_suite(Config) ->
+ xmerl_xsd_lib:rmdir(Config,sun),
+ xmerl_xsd_lib:close_error_log_file(Config),
+ ok.
+
+%% initialization before each testcase
+init_per_testcase(TestCase,Config) ->
+ Dog=test_server:timetrap({minutes,3}),
+ [{testcase,TestCase},{watchdog, Dog}|Config].
+
+%% clean up after each testcase
+end_per_testcase(_Func,Config) ->
+ Dog=?config(watchdog, Config),
+ test_server:timetrap_cancel(Dog),
+ ok.
+
+%% ID Constranints. Very naive test of identity constraint
+'Sun-idc001.nogen'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/idc001.nogen.xsd','./suntest/SunTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/idc001.nogen.n00.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/idc001.nogen.v00.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/idc001.nogen.v01.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList3).
+
+%% ID Constranints. Reference to an undeclared key
+'Sun-idc002.e'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/idc002.e.xsd','./suntest/SunTestsAll',invalid),
+ STResList1 = [STRes0|STResList0],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,[]).
+
+%% ID Constranints. Reference to an undeclared key in an undeclared namespace
+'Sun-idc002b.e'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/idc002b.e.xsd','./suntest/SunTestsAll',invalid),
+ STResList1 = [STRes0|STResList0],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,[]).
+
+%% ID Constranints. Reference to non-key constraint.
+'Sun-idc003.e'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/idc003.e.xsd','./suntest/SunTestsAll',invalid),
+ STResList1 = [STRes0|STResList0],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,[]).
+
+%% ID Constranints.
+'Sun-idc004.nogen'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/idc004.nogen.xsd','./suntest/SunTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/idc004.nogen.n00.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/idc004.nogen.n01.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/idc004.nogen.n02.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/idc004.nogen.n03.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/idc004.nogen.v00.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList5).
+
+%% ID Constraints. Key/keyref field size mismatch.
+'Sun-idc004a.e'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/idc004a.e.xsd','./suntest/SunTestsAll',invalid),
+ STResList1 = [STRes0|STResList0],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,[]).
+
+%% ID Constraints. Very naive test of identity constraint.
+'Sun-idc005.nogen'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/idc005.nogen.xsd','./suntest/SunTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/idc005.nogen.n00.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/idc005.nogen.n01.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/idc005.nogen.v00.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList3).
+
+%% ID Constraints. XPath engine test: ".//a/*/b" and use of "." for both selector and field.
+'Sun-idc006.nogen'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/idc006.nogen.xsd','./suntest/SunTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/idc006.nogen.n00.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/idc006.nogen.n01.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/idc006.nogen.v00.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList3).
+
+%% - use of elementFormDefault="unqualified" - unusual minOccurs/maxOccurs (3 and 7 respectively) - complexType with simpleContent, and restriction. - simpleType within restriction.
+'Sun-xsd001'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd001.xsd','./suntest/SunTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd001.n00.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd001.n01.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd001.n02.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd001.n03.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd001.n04.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd001.n05.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd001.n06.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd001.n07.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd001.v00.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd001.v01.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList10 = [ITRes9|ITResList9],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd001.v02.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd001.v03.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList12 = [ITRes11|ITResList11],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList12).
+
+%% - use of elementFormDefault="unqualified" - use of elementFormDefault and form attribute. - implicit use of "ur-type" as the content model of element.
+'Sun-xsd002'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd002.xsd','./suntest/SunTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd002.n00.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd002.n01.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd002.n02.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd002.v00.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd002.v01.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList5).
+
+%% Element redefinition. Unable to redefine element.
+'Sun-xsd003-1.e'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd003-1.e.xsd','./suntest/SunTestsAll',invalid),
+ STResList1 = [STRes0|STResList0],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,[]).
+
+%% Element redefinition. Unable to redefine element.
+'Sun-xsd003-2.e'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd003-2.e.xsd','./suntest/SunTestsAll',invalid),
+ STResList1 = [STRes0|STResList0],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,[]).
+
+%% Element redefinition. Test without redefinition.
+'Sun-xsd003a'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd003a.xsd','./suntest/SunTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd003a.v00.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList1).
+
+%% Element redefinition. Test with redefinition with self-reference.
+'Sun-xsd003b'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd003b.xsd','./suntest/SunTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd003b.n00.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd003b.n01.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd003b.v00.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd003b.v01.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList4).
+
+%% Use of three different type of any element with different @namespace.
+'Sun-xsd004'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd004.xsd','./suntest/SunTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd004.n00.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd004.n01.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd004.n02.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd004.n03.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd004.n04.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd004.n05.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd004.n06.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd004.n07.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd004.n08.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd004.n09.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList10 = [ITRes9|ITResList9],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd004.n10.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd004.n11.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd004.n12.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd004.v00.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList14 = [ITRes13|ITResList13],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList14).
+
+%% Complex type derivation.
+'Sun-xsd005'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd005.xsd','./suntest/SunTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd005.n00.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd005.n01.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd005.n02.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd005.n03.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd005.n04.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd005.n05.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd005.n06.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd005.v00.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList8 = [ITRes7|ITResList7],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList8).
+
+%% minOccurs/maxOccurs. Various combinations.
+'Sun-xsd006'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd006.xsd','./suntest/SunTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd006.n00.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd006.n01.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd006.n02.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd006.n03.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd006.n04.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd006.n05.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd006.n06.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd006.n07.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd006.n08.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd006.n09.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList10 = [ITRes9|ITResList9],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd006.n10.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd006.v00.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList12 = [ITRes11|ITResList11],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList12).
+
+%% Abstract element and element substitution group.
+'Sun-xsd008'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd008.xsd','./suntest/SunTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd008.n00.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd008.n01.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd008.n02.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd008.v00.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList4).
+
+%% Nillable.
+'Sun-xsd011'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd011.xsd','./suntest/SunTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd011.n00.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd011.n01.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd011.n02.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd011.n03.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd011.n04.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd011.v00.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList6 = [ITRes5|ITResList5],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList6).
+
+%% Mixed content model.
+'Sun-xsd012'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd012.xsd','./suntest/SunTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd012.n00.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd012.v00.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList2).
+
+%% Reference to undeclared element.
+'Sun-xsd013.e'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd013.e.xsd','./suntest/SunTestsAll',invalid),
+ STResList1 = [STRes0|STResList0],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,[]).
+
+%% Reference to undeclared element.
+'Sun-xsd014.e'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd014.e.xsd','./suntest/SunTestsAll',invalid),
+ STResList1 = [STRes0|STResList0],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,[]).
+
+%% Reference to undeclared type (it may be simple or complex).
+'Sun-xsd015.e'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd015.e.xsd','./suntest/SunTestsAll',invalid),
+ STResList1 = [STRes0|STResList0],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,[]).
+
+%% Reference to undeclared type (it may be simple or complex).
+'Sun-xsd016.e'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd016.e.xsd','./suntest/SunTestsAll',invalid),
+ STResList1 = [STRes0|STResList0],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,[]).
+
+%% Reference to undeclared complex type.
+'Sun-xsd017.e'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd017.e.xsd','./suntest/SunTestsAll',invalid),
+ STResList1 = [STRes0|STResList0],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,[]).
+
+%% Reference to undeclared complex type.
+'Sun-xsd018.e'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd018.e.xsd','./suntest/SunTestsAll',invalid),
+ STResList1 = [STRes0|STResList0],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,[]).
+
+%% Reference to undeclared simple type.
+'Sun-xsd019.e'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd019.e.xsd','./suntest/SunTestsAll',invalid),
+ STResList1 = [STRes0|STResList0],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,[]).
+
+%% Reference to undeclared simple type.
+'Sun-xsd020.e'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd020.e.xsd','./suntest/SunTestsAll',invalid),
+ STResList1 = [STRes0|STResList0],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,[]).
+
+%% Reference to undeclared attribute.
+'Sun-xsd020-2.e'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd020-2.e.xsd','./suntest/SunTestsAll',invalid),
+ STResList1 = [STRes0|STResList0],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,[]).
+
+%% Reference to undeclared model group.
+'Sun-xsd020-3.e'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd020-3.e.xsd','./suntest/SunTestsAll',invalid),
+ STResList1 = [STRes0|STResList0],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,[]).
+
+%% Reference to undeclared attribute group.
+'Sun-xsd020-4.e'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd020-4.e.xsd','./suntest/SunTestsAll',invalid),
+ STResList1 = [STRes0|STResList0],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,[]).
+
+%% anyOtherAttribute.
+'Sun-xsd021'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd021.xsd','./suntest/SunTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd021.n00.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd021.n01.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd021.n02.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd021.n03.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd021.n04.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd021.n05.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd021.n06.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd021.n07.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd021.n08.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd021.n09.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList10 = [ITRes9|ITResList9],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd021.n10.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd021.n11.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd021.v00.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList13 = [ITRes12|ITResList12],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList13).
+
+%% Simple type. Various forms of forward reference to the simple type.
+'Sun-xsd022'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd022.xsd','./suntest/SunTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd022.n00.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsd022.v00.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList2).
+
+%% Simple type. Recursive definition.
+'Sun-xsd023.e'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsd023.e.xsd','./suntest/SunTestsAll',invalid),
+ STResList1 = [STRes0|STResList0],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,[]).
+
+%% Simple type.
+'Sun-xsiType1'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsiType1.xsd','./suntest/SunTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsiType1.v1.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsiType1.n1.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList2).
+
+%% Test block attribute (1) - use block="extension" at the B type. This should exclude all types that uses extension.
+'Sun-xsiType-block-1'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsiType-block-1.xsd','./suntest/SunTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsiType-block-1.v1.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsiType-block-1.n1.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsiType-block-1.n2.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsiType-block-1.n3.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsiType-block-1.n4.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList5).
+
+%% Test block attribute (2) - use block="extension" as the blockDefault attribute. This should achieve the same result as the previous test case.
+'Sun-xsiType-block-2'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsiType-block-2.xsd','./suntest/SunTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsiType-block-2.v1.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsiType-block-2.n1.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsiType-block-2.n2.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsiType-block-2.n3.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsiType-block-2.n4.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList5).
+
+%% Test block attribute (3) - use block="extension" for the child2 element. child2 has no block constraint. - see if @block for element is working as expected.
+'Sun-xsiType-block-3'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsiType-block-3.xsd','./suntest/SunTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsiType-block-3.v1.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsiType-block-3.n1.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsiType-block-3.n2.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsiType-block-3.n3.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsiType-block-3.n4.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList5).
+
+%% Test block attribute (4) - use block="extension" for the child2 element. child2 has no block constraint. - use block="restriction" for the Dr type. - see if @block for element and @block for types interacts as expected.
+'Sun-xsiType-block-4'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/xsiType-block-4.xsd','./suntest/SunTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsiType-block-4.v1.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsiType-block-4.n1.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsiType-block-4.n2.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsiType-block-4.n3.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/xsiType-block-4.n4.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList5).
+
+%% No block attribute is specified. Just test that the substitution group and the type hierarchy is OK. The substitution group hierarchy mirrors the complex type hierarchy.
+'Sun-type-and-subst-1'(Config) when is_list(Config) ->
+ STResList0 = [],
+
+ ?line {STRes0,S0} = xmerl_xsd_lib:schema_test(Config,'./suntest/SunTestsAll/type-and-subst-1.xsd','./suntest/SunTestsAll',valid),
+ STResList1 = [STRes0|STResList0],
+ ITResList0 = [],
+ ?line ITRes0 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.v1.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList1 = [ITRes0|ITResList0],
+ ?line ITRes1 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.v2.xml','./suntest/SunTestsAll',valid,S0),
+ ITResList2 = [ITRes1|ITResList1],
+ ?line ITRes2 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n1.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList3 = [ITRes2|ITResList2],
+ ?line ITRes3 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n2.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList4 = [ITRes3|ITResList3],
+ ?line ITRes4 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n3.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList5 = [ITRes4|ITResList4],
+ ?line ITRes5 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n4.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList6 = [ITRes5|ITResList5],
+ ?line ITRes6 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n5.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList7 = [ITRes6|ITResList6],
+ ?line ITRes7 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n6.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList8 = [ITRes7|ITResList7],
+ ?line ITRes8 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n7.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList9 = [ITRes8|ITResList8],
+ ?line ITRes9 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n8.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList10 = [ITRes9|ITResList9],
+ ?line ITRes10 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n9.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList11 = [ITRes10|ITResList10],
+ ?line ITRes11 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n10.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList12 = [ITRes11|ITResList11],
+ ?line ITRes12 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n11.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList13 = [ITRes12|ITResList12],
+ ?line ITRes13 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n12.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList14 = [ITRes13|ITResList13],
+ ?line ITRes14 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n13.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList15 = [ITRes14|ITResList14],
+ ?line ITRes15 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n14.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList16 = [ITRes15|ITResList15],
+ ?line ITRes16 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n15.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList17 = [ITRes16|ITResList16],
+ ?line ITRes17 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n16.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList18 = [ITRes17|ITResList17],
+ ?line ITRes18 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n17.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList19 = [ITRes18|ITResList18],
+ ?line ITRes19 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n18.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList20 = [ITRes19|ITResList19],
+ ?line ITRes20 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n19.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList21 = [ITRes20|ITResList20],
+ ?line ITRes21 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n20.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList22 = [ITRes21|ITResList21],
+ ?line ITRes22 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n21.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList23 = [ITRes22|ITResList22],
+ ?line ITRes23 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n22.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList24 = [ITRes23|ITResList23],
+ ?line ITRes24 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n23.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList25 = [ITRes24|ITResList24],
+ ?line ITRes25 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n24.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList26 = [ITRes25|ITResList25],
+ ?line ITRes26 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n25.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList27 = [ITRes26|ITResList26],
+ ?line ITRes27 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n26.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList28 = [ITRes27|ITResList27],
+ ?line ITRes28 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n27.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList29 = [ITRes28|ITResList28],
+ ?line ITRes29 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n28.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList30 = [ITRes29|ITResList29],
+ ?line ITRes30 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n29.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList31 = [ITRes30|ITResList30],
+ ?line ITRes31 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n30.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList32 = [ITRes31|ITResList31],
+ ?line ITRes32 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n31.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList33 = [ITRes32|ITResList32],
+ ?line ITRes33 = xmerl_xsd_lib:instance_test(Config,'./suntest/SunTestsAll/type-and-subst-1.n32.xml','./suntest/SunTestsAll',invalid,S0),
+ ITResList34 = [ITRes33|ITResList33],
+
+
+ xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList34).
+
diff --git a/lib/xmerl/test/xmerl_xsd_Sun2002-01-16_SUITE_data/sun_failed_cases.log b/lib/xmerl/test/xmerl_xsd_Sun2002-01-16_SUITE_data/sun_failed_cases.log
new file mode 100644
index 0000000000..cf0403bdeb
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_Sun2002-01-16_SUITE_data/sun_failed_cases.log
@@ -0,0 +1,33 @@
+{'Sun-idc004.nogen',{["idc004.nogen.n02.xml", "idc004.nogen.n03.xml"],[]}}.
+{'Sun-idc006.nogen',{["idc006.nogen.n00.xml"],[]}}.
+{'Sun-xsd001',{["xsd001.n04.xml",
+ "xsd001.n05.xml",
+ "xsd001.n06.xml"],[]}}.
+{'Sun-xsd002',{["xsd002.v01.xml","xsd002.v00.xml"],[]}}.
+{'Sun-xsd003a',{["xsd003a.v00.xml"],[]}}.
+{'Sun-xsd003b',{["xsd003b.v01.xml"],[]}}.
+{'Sun-xsd004',{["xsd004.v00.xml",
+ "xsd004.n00.xml",
+ "xsd004.n05.xml",
+ "xsd004.n06.xml",
+ "xsd004.n07.xml",
+ "xsd004.n11.xml",
+ "xsd004.n12.xml"
+ ],[]}}.
+{'Sun-xsd005',{["xsd005.n05.xml"],[]}}.
+{'Sun-xsd008',{[],[]}}.
+{'Sun-xsd012',{["xsd012.v00.xml"],[]}}.
+{'Sun-xsd021',{["xsd021.v00.xml",
+ "xsd021.n03.xml",
+ "xsd021.n02.xml",
+ "xsd021.n06.xml",
+ "xsd021.n07.xml",
+ "xsd021.n01.xml",
+ "xsd021.n00.xml"],[]}}.
+{'Sun-xsd022',{["xsd022.v00.xml"],[]}}.
+{'Sun-xsiType1',{["xsiType1.v1.xml"],[]}}.
+{'Sun-xsiType-block-1',{["xsiType-block-1.n1.xml", "xsiType-block-1.v1.xml"],[]}}.
+{'Sun-xsiType-block-2',{["xsiType-block-2.n1.xml", "xsiType-block-2.v1.xml"],[]}}.
+{'Sun-xsiType-block-3',{["xsiType-block-3.n1.xml", "xsiType-block-3.v1.xml"],[]}}.
+{'Sun-xsiType-block-4',{["xsiType-block-4.n2.xml", "xsiType-block-4.v1.xml"],[]}}.
+{'Sun-type-and-subst-1',{["type-and-subst-1.v2.xml"],[]}}.
diff --git a/lib/xmerl/test/xmerl_xsd_Sun2002-01-16_SUITE_data/suntest.tar.gz b/lib/xmerl/test/xmerl_xsd_Sun2002-01-16_SUITE_data/suntest.tar.gz
new file mode 100644
index 0000000000..bb0de7848b
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_Sun2002-01-16_SUITE_data/suntest.tar.gz
Binary files differ
diff --git a/lib/xmerl/test/xmerl_xsd_Sun2002-01-16_SUITE_data/w3c-copyright-19990405.html b/lib/xmerl/test/xmerl_xsd_Sun2002-01-16_SUITE_data/w3c-copyright-19990405.html
new file mode 100644
index 0000000000..5c89ffd95e
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_Sun2002-01-16_SUITE_data/w3c-copyright-19990405.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html><head>
+
+
+ <meta http-equiv="Content-Type" content="text/html"><title>DOCUMENT NOTICE</title>
+
+ <link rel="stylesheet" type="text/css" href="copyright-documents-19990405_files/base.css"></head><body bgcolor="#ffffff" text="#000000">
+<h1>W3C<sup>�</sup> DOCUMENT NOTICE AND LICENSE</h1>
+
+<h3>Copyright � 1994-2002 <a href="http://www.w3.org/">World Wide Web
+Consortium</a>, (<a href="http://www.lcs.mit.edu/">Massachusetts Institute of
+Technology</a>, <a href="http://www.inria.fr/">Institut National de Recherche
+en Informatique et en Automatique</a>, <a href="http://www.keio.ac.jp/">Keio
+University</a>). All Rights Reserved.<br>
+http://www.w3.org/Consortium/Legal/</h3>
+
+<p>Public documents on the W3C site are provided by the copyright holders
+under the following license. The software or Document Type Definitions (DTDs)
+associated with W3C specifications are governed by the <a href="http://www.w3.org/Consortium/Legal/copyright-software.html"> Software
+Notice</a>. By using and/or copying this document, or the W3C document from
+which this statement is linked, you (the licensee) agree that you have read,
+understood, and will comply with the following terms and conditions:</p>
+
+<p>Permission to use, copy, and distribute the contents of this document, or
+the W3C document from which this statement is linked, in any medium for any
+purpose and without fee or royalty is hereby granted, provided that you
+include the following on <i>ALL</i> copies of the document, or portions
+thereof, that you use:</p>
+<ol>
+ <li>A link or URL to the original W3C document.</li>
+ <li>The pre-existing copyright notice of the original author, or if it
+ doesn't exist, a notice of the form: "Copyright � [$date-of-document] <a href="http://www.w3.org/">World Wide Web Consortium</a>, (<a href="http://www.lcs.mit.edu/">Massachusetts Institute of Technology</a>,
+ <a href="http://www.inria.fr/"> Institut National de Recherche en
+ Informatique et en Automatique</a>, <a href="http://www.keio.ac.jp/">Keio
+ University</a>). All Rights Reserved.
+ http://www.w3.org/Consortium/Legal/" (Hypertext is preferred, but a
+ textual representation is permitted.)</li>
+ <li><em>If it exists</em>, the STATUS of the W3C document.</li>
+</ol>
+
+<p>When space permits, inclusion of the full text of this <b> NOTICE</b>
+should be provided. We request that authorship attribution be provided in any
+software, documents, or other items or products that you create pursuant to
+the implementation of the contents of this document, or any portion
+thereof.</p>
+
+<p>No right to create modifications or derivatives of W3C documents is
+granted pursuant to this license. However, if additional requirements
+(documented in the <a href="http://www.w3.org/Consortium/Legal/IPR-FAQ.html">Copyright FAQ</a>) are satisfied,
+the right to create modifications or derivatives is&nbsp;sometimes granted by the
+W3C to individuals complying with those requirements.</p>
+
+<p>THIS DOCUMENT IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO
+REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED
+TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+NON-INFRINGEMENT, OR TITLE; THAT THE CONTENTS OF THE DOCUMENT ARE SUITABLE
+FOR ANY PURPOSE; NOR THAT THE IMPLEMENTATION OF SUCH CONTENTS WILL NOT
+INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.</p>
+
+<p>COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE DOCUMENT OR THE
+PERFORMANCE OR IMPLEMENTATION OF THE CONTENTS THEREOF.</p>
+
+<p>The name and trademarks of copyright holders may NOT be used in
+advertising or publicity pertaining to this document or its contents without
+specific, written prior permission. Title to copyright in this document will
+at all times remain with copyright holders.</p>
+
+<p>----------------------------------------------------------------------------</p>
+
+<p>This formulation of W3C's notice and license became active on April 05
+1999 so as to account for the treatment of DTDs, schema's and bindings. See
+the <a href="http://www.w3.org/Consortium/Legal/copyright-documents-19990218.html"> older formulation</a> for
+the policy prior to this date. Please see our <a href="http://www.w3.org/Consortium/Legal/IPR-FAQ.html">Copyright FAQ</a> for common questions about using
+materials from our site, including specific terms and conditions for packages
+like libwww, Amaya, and Jigsaw. Other questions about this notice can be
+directed to <a href="mailto:[email protected]">[email protected]</a>.</p>
+<address>
+ <a href="http://w3.org/Help/Webmaster.html">webmaster</a><br>
+ (last updated by reagle on 1999/04/99.)
+</address>
+</body></html> \ No newline at end of file
diff --git a/lib/xmerl/test/xmerl_xsd_lib.erl b/lib/xmerl/test/xmerl_xsd_lib.erl
new file mode 100644
index 0000000000..0b6b1ebc84
--- /dev/null
+++ b/lib/xmerl/test/xmerl_xsd_lib.erl
@@ -0,0 +1,321 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2006-2010. 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%
+%%
+%%
+%%% Purpose : Sub routines for test suite for the xmerl application,
+%%% xmerl_xsd module.
+%%%-------------------------------------------------------------------
+%%% @private
+%%% File : xmerl_xsd_lib.erl
+%%% Author : Bertil Karlsson <bertil@finrod>
+%%% Description :
+%%%
+%%% Created : 28 Apr 2006 by Bertil Karlsson <bertil@finrod>
+%%%-------------------------------------------------------------------
+-module(xmerl_xsd_lib).
+
+-compile(export_all).
+
+-include("test_server.hrl").
+-include("xmerl.hrl").
+-include("xmerl_xsd.hrl").
+-include_lib("kernel/include/file.hrl").
+
+
+compare_test_results(Config, ST, IT) ->
+ ResST=compare_schema_test_results(ST),
+ ResIT=compare_instance_test_results(IT),
+ io:format("compare_test_results:~n ST = ~p~n IT = ~p~n ResST = ~p~n ResIT = ~p~n",[ST, IT, ResST, ResIT]),
+ case process_reference_results(Config, ResST, ResIT) of
+ error ->
+ error;
+ Diff ->
+ return_results(Diff, ResST, ResIT, length(ST)+length(IT))
+ end.
+
+compare_schema_test_results(ST) ->
+ {[N||{N, false}<-ST], [N||{N, enoent}<-ST]}.
+compare_instance_test_results(IT) ->
+ {[N||{N, false}<-IT], [N||{N, enoent}<-IT]}.
+
+return_results({SkippedN, Diff},{STErrs, _},{ITErrs, _}, TotN) ->
+ NumErrs = length(STErrs ++ ITErrs),
+ case NumErrs == TotN of
+ true when TotN > 0 ->
+ ?line exit(all_tests_cases_failed);
+ _ ->
+ return_results2(Diff, TotN - NumErrs, SkippedN, TotN)
+ end.
+
+%% return_results2(Diff,{[],[]},{[],[]},TotN) ->
+%% {comment,io_lib:format("~p successful test cases.~n"++Diff,[TotN])};
+%% return_results2(Diff,{STErrs,[]},{ITErrs,[]},TotN) ->
+%% {comment,io_lib:format("Total number of test cases: ~p~nThe following ~p test cases failed: ~p~n"++Diff,[TotN,length(STErrs++ITErrs),STErrs++ITErrs])};
+%% return_results2(Diff,{STErrs,STOther},{ITErrs,ITOther},TotN) ->
+%% {comment,io_lib:format("Total number of test cases: ~p~nThe following ~p test cases failed: ~p~nThe following ~p test cases was malicious ~p~~n"++Diff,[TotN,length(STErrs++ITErrs),STErrs++ITErrs,length(STOther++ITOther),STOther++ITOther])}.
+
+return_results2(_, 0, 0, 0) ->
+ {comment,io_lib:format("This test case was empty.~n", [])};
+return_results2({[], [], [], []}, NumSucc, SkippedN, TotN) ->
+ {comment,io_lib:format("~p successful tests, ~p skipped tests of totally ~p test cases.~n",
+ [NumSucc, SkippedN, TotN])};
+return_results2({NewFail, NewSuccess, NewMal, NewNotMal}, NumSucc, SkippedN, TotN) ->
+ NFComm =
+ case NewFail of
+ [] -> "";
+ _ -> io_lib:format("These ~p tests are new failures: ~p~n",
+ [length(NewFail), NewFail])
+ end,
+ NSComm =
+ case NewSuccess of
+ [] -> "";
+ _ -> io_lib:format("These ~p skipped tests are new succeeding cases: ~p~n",
+ [length(NewSuccess), NewSuccess])
+ end,
+ NMComm =
+ case NewMal of
+ [] -> "";
+ _ -> io_lib:format("These ~p tests are now malicious: ~p~n",
+ [length(NewMal), NewMal])
+ end,
+ NNMComm =
+ case NewNotMal of
+ [] -> "";
+ _ -> io_lib:format("These ~p skipped tests were malicious, but succeeds now: ~p~n", [length(NewNotMal), NewNotMal])
+ end,
+ ct:comment(io_lib:format("~p successful tests, ~p skipped tests of totally ~p test cases. ~n" ++
+ NFComm ++ NSComm ++ NMComm ++ NNMComm, [NumSucc, SkippedN, TotN])),
+ [] = NewFail.
+
+%% return_results2(Diff,{STErrs,STOther},{ITErrs,ITOther},TotN) ->
+%% {comment,io_lib:format("Total number of test cases: ~p~n The following ~p test cases failed: ~p~nThe following ~p test cases was malicious ~p~~n",[TotN,length(STErrs++ITErrs),STErrs++ITErrs,length(STOther++ITOther),STOther++ITOther])}.
+
+
+process_reference_results(Config, {ErrsST, MalST}, {ErrsIT, MalIT}) ->
+ {RefFailed, RefMalicious} = xsd_reference_log(Config),
+io:format("A: ~p : ~p\n\n",[RefFailed, RefMalicious]),
+ AllErrs = ErrsST ++ ErrsIT,
+ AllMals = MalST ++ MalIT,
+ %% test cases failed now but succeeded in reference results.
+ NewFailures = [X||X<-AllErrs, lists:member(X, RefFailed) == false],
+ %% test cases succeeded now but failed in reference results.
+ NewSucceeds = [X||X<-RefFailed, lists:member(X, AllErrs) == false],
+ %% test cases malicious now but succeeded in reference results.
+ NewMalicious = [X||X<-AllMals, lists:member(X, RefMalicious) == false],
+ %% test cases succeeded now but malicious in reference results.
+ NewNotMal = [X||X<-RefMalicious, lists:member(X, AllMals) == false],
+ write_in_log(Config, AllErrs, AllMals),
+% io:format("process_reference_results:~n AllErrs = ~p~n NewFailures = ~p~n",[AllErrs,NewFailures]),
+ {length(RefFailed) + length(RefMalicious), {NewFailures, NewSucceeds, NewMalicious, NewNotMal}}.
+
+xsd_reference_log(Config) ->
+ DataDir = ?config(data_dir, Config),
+ Suite = ?config(suite, Config),
+ SuiteReferenceLog =
+ filename:join([DataDir, lists:concat([Suite, "_failed_cases.log"])]),
+io:format("B: ~p\n\n",[SuiteReferenceLog]),
+ case file:consult(SuiteReferenceLog) of
+ {ok,List} when is_list(List) ->
+io:format("C: ~p\n\n",[List]),
+ case lists:keysearch(?config(testcase, Config), 1, List) of
+ {value,{_, TCRefFails}} ->
+io:format("D: ~p\n\n",[TCRefFails]),
+ TCRefFails;
+ _ ->
+io:format("D: ~no result\n\n",[]),
+ {[], []}
+ end;
+ _ ->
+ {[], []}
+ end.
+
+write_in_log(_Config, [], []) ->
+ ok;
+write_in_log(Config, AllErrs, AllMals) ->
+ ?line LogFileName = ?config(xmerl_error_log, Config),
+ {ok,IO}=file:open(LogFileName, [append]),
+ ?line TestCase = ?config(testcase, Config),
+ io:format(IO,"{~p,{~p,~p}}.~n", [TestCase, AllErrs, AllMals]),
+ file:close(IO),
+ ok.
+
+schema_test(Config,FileName,XsdBase,Validity) ->
+ ModuleName = filename:basename(FileName),
+ DataDir = ?config(data_dir, Config),
+ case xmerl_xsd:process_schema(filename:join([DataDir, FileName]), [{xsdbase,filename:join([DataDir, XsdBase])}]) of
+ {error, enoent} ->
+ {{ModuleName, enoent},#xsd_state{}};
+ {Ok, S} ->
+ case Validity of
+ valid when Ok == ok ->
+%% io:format("schema_test1: Validity=valid,Ok=ok,S=~p~n",[S]),
+ {{ModuleName, S#xsd_state.errors == []}, S};
+ invalid when Ok == error -> %% S is in this case an error reason
+ {{ModuleName, no_internal_error(S)}, #xsd_state{}};
+ notKnown ->
+ {{ModuleName, true}, #xsd_state{}};
+ valid ->
+ io:format("schema_test2: Validity=valid,Ok=~p,S=~p~n", [Ok, S]),
+%% io:format("FileName: ~p~n",[FileName]),
+ {{ModuleName, false}, #xsd_state{}};
+ _ -> %% invalid Ok == ok
+ io:format("schema_test3: Validity=~p,Ok=~p,S=~p~n", [Validity, Ok, S]),
+ {{ModuleName, false}, S}
+ end
+ end.
+schema_test(Config, FileName, XsdBase, Validity, AccState) ->
+ ModuleName = filename:basename(FileName),
+ DataDir = ?config(data_dir, Config),
+ case xmerl_xsd:process_schema(filename:join([DataDir, FileName]),
+ [{xsdbase, filename:join([DataDir, XsdBase])}, AccState]) of
+ {error, enoent} ->
+ {{ModuleName, enoent}, AccState};
+ {Ok, S} ->
+ case Validity of
+ valid when Ok == ok ->
+ {{ModuleName, S#xsd_state.errors == []}, S};
+ invalid when Ok == error ->
+ {{ModuleName, no_internal_error(S)}, AccState};
+ notKnown ->
+ {{ModuleName, true}, AccState};
+ valid ->
+ {{ModuleName, false}, AccState};
+ _ ->
+ {{ModuleName, false}, S}
+ end
+ end.
+instance_test(Config, FileName, XMLBase, Validity, State) ->
+ ModuleName = filename:basename(FileName),
+ DataDir = ?config(data_dir, Config),
+ case xmerl_scan:file(filename:join([DataDir, FileName]),
+ [{xmlbase, filename:join([DataDir, XMLBase])}]) of
+ {error, enoent} ->
+ {ModuleName, enoent};
+ {E, _} ->
+ {VE, S2} = xmerl_xsd:validate(E, State),
+ case Validity of
+ valid when is_record(VE, xmlElement) ->
+ case S2#xsd_state.errors of
+ [] -> ok;
+ _ -> io:format("test case ~p failed.~nValidity: ~p~nValidation result:~p~n", [FileName, Validity, VE])
+ end,
+ {ModuleName, S2#xsd_state.errors == []};
+ invalid when VE == error ->
+ {ModuleName, no_internal_error(S2)};
+ notKnown ->
+ {ModuleName, true};
+ _ ->
+ io:format("test case ~p failed.~nValidity: ~p~nValidation result:~p~n", [FileName, Validity, VE]),
+ {ModuleName,false}
+ end
+ end.
+
+no_internal_error(R) ->
+ case lists:keymember(internal_error,1,R) of
+ true ->
+ false;
+ _ ->
+ true
+ end.
+
+unpack(Config, Suite) ->
+ TarFile = suite_tar(Suite),
+ ?line file:set_cwd(?config(data_dir, Config)),
+ ?line ok=erl_tar:extract(TarFile, [compressed]),
+ change_mode(filename:rootname(TarFile, ".tar.gz")).
+
+suite_tar(sun) ->
+ "suntest.tar.gz";
+suite_tar(msx) ->
+ "msxsdtest.tar.gz";
+suite_tar(nist) ->
+ "nisttest.tar.gz".
+
+change_mode(Files) ->
+ change_mode3(Files).
+change_mode2(Dir)->
+ ?line {ok, CWD} = file:get_cwd(),
+ ?line {ok, FileList} = file:list_dir(Dir),
+ ?line file:set_cwd(filename:join([CWD, Dir])),
+ change_mode3(FileList),
+ ?line file:set_cwd(CWD).
+change_mode3([]) ->
+ ok;
+change_mode3([F |Fs]) ->
+ case filelib:is_dir(F) of
+ true ->
+ chmod(F),
+ change_mode2(F);
+ _ ->
+ chmod(F)
+ end,
+ change_mode3(Fs).
+
+chmod(F) ->
+ case file:read_file_info(F) of
+ {ok, FileInfo} ->
+ Mode= FileInfo#file_info.mode,
+ file:write_file_info(F, FileInfo#file_info{mode=8#00777 bor Mode});
+ _ ->
+ ok
+ end.
+
+rmdir(Config, Suite) ->
+ ?line file:set_cwd(?config(data_dir, Config)),
+ SuiteDir = filename:rootname(suite_tar(Suite), ".tar.gz"),
+ ?line ok=rm_f_(SuiteDir).
+
+%% Dir is a directory
+rm_f_(Dir) ->
+ ?line {ok, CWD} = file:get_cwd(),
+ ?line {ok, FileList} = file:list_dir(Dir),
+ ?line file:set_cwd(filename:join([CWD, Dir])),
+ rm_files(FileList),
+ ?line file:set_cwd(CWD),
+ ? line ok = file:del_dir(Dir).
+
+rm_files([])->
+ ok;
+rm_files([F |Fs]) ->
+ case filelib:is_dir(F) of
+ true ->
+ rm_f_(F);
+ _ ->
+ io:format("rm_files: ~p~n", [F]),
+ ?line ok = file:delete(F)
+ end,
+ rm_files(Fs).
+
+create_error_log_file(Config, Suite) ->
+ ?line {{Y, M, D}, {H, Min, S}} = calendar:local_time(),
+ DTString=lists:concat([Y, "-", M,"-", D, "_", H, ".", Min, ".", S]),
+ FileName = lists:concat([Suite, "_", DTString, ".errorlog"]),
+%% ?line {ok,_IO} = file:open(filename:join([?config(priv_dir,Config),
+%% FileName]),[append]).
+
+%% ?line {ok,_IO} = file:open(FileName,[append]).
+ io:format("error log file: ~p~n", [filename:join([?config(priv_dir,Config), FileName])]),
+ {ok, filename:join([?config(priv_dir,Config), FileName])}.
+
+close_error_log_file(Config) ->
+ case lists:keysearch(xmerl_error_log, 1, Config) of
+ {value,{_, IO}} ->
+ file:close(IO);
+ _ ->
+ ok
+ end.
diff --git a/lib/xmerl/test/xmlconf.xml b/lib/xmerl/test/xmlconf.xml
new file mode 100644
index 0000000000..c015218e2e
--- /dev/null
+++ b/lib/xmerl/test/xmlconf.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0"?>
+<!--
+ @(#)conformance.xml 1.1 98/12/20
+ Original version copyright 1998 by Sun Microsystems, Inc.
+ All Rights Reserved.
+ Modifications copyright 1999 by OASIS.
+ Modifications copyright 2001 by OASIS.
+-->
+
+<?xml-stylesheet href="xmlconformance.xsl" type="text/xsl"?>
+
+<!DOCTYPE TESTSUITE SYSTEM "testcases.dtd" [
+
+ <!-- Sun-written testcases -->
+ <!ENTITY sun-valid SYSTEM "sun/sun-valid.xml">
+ <!ENTITY sun-invalid SYSTEM "sun/sun-invalid.xml">
+ <!ENTITY sun-not-wf SYSTEM "sun/sun-not-wf.xml">
+ <!ENTITY sun-error SYSTEM "sun/sun-error.xml">
+
+ <!-- James Clark "XMLTEST" -->
+ <!ENTITY jclark-xmltest SYSTEM "xmltest/xmltest.xml">
+
+ <!-- Fuji Xerox "Japanese Documents" -->
+ <!ENTITY xerox-japanese SYSTEM "japanese/japanese.xml">
+
+ <!-- NIST/OASIS test suite -->
+ <!ENTITY nist-oasis SYSTEM "oasis/oasis.xml">
+
+ <!-- IBM tests -->
+ <!ENTITY ibm-invalid SYSTEM "ibm/ibm_oasis_invalid.xml">
+ <!ENTITY ibm-not-wf SYSTEM "ibm/ibm_oasis_not-wf.xml">
+ <!ENTITY ibm-valid SYSTEM "ibm/ibm_oasis_valid.xml">
+]>
+
+<TESTSUITE PROFILE="XML 1.0 (2nd edition) W3C Conformance Test Suite, 6 October 2000">
+
+ &jclark-xmltest;
+ &xerox-japanese;
+
+<TESTCASES PROFILE="Sun Microsystems XML Tests" xml:base="sun/">
+ &sun-valid;
+ &sun-invalid;
+ &sun-not-wf;
+ &sun-error;
+</TESTCASES>
+
+ &nist-oasis;
+<TESTCASES PROFILE="IBM XML Tests" xml:base="ibm/">
+ &ibm-invalid;
+ &ibm-not-wf;
+ &ibm-valid;
+</TESTCASES>
+</TESTSUITE>
diff --git a/lib/xmerl/test/xmlconformance.msxsl b/lib/xmerl/test/xmlconformance.msxsl
new file mode 100644
index 0000000000..f33e647d25
--- /dev/null
+++ b/lib/xmerl/test/xmlconformance.msxsl
@@ -0,0 +1,527 @@
+<?xml version='1.0'?>
+<!--
+<<<<<<< conformance.msxsl
+ Original version copyright 1999 by Sun Microsystems, Inc.
+ All Rights Reserved.
+ Modifications copyright 1999 by OASIS.
+=======
+ XSL IE5 Stylesheet for documenting XML conformance tests.
+ Tested against IE5 5.00.2014.0216
+
+ 1999-06-05 20:10
+
+ XSL 12/16/1998 Stylesheet for documenting XML conformance tests.
+
+ This expects to be run on a document matching the DTD that Sun
+ defined and OASIS modified for merging collections of
+ self-descriptive XML tests.
+
+ Since all those collections will have (by design) the same test
+ architecture, this includes boilerplate describing that design,
+ to be used by all test documentation.
+
+ ISSUES:
+ - Sorting is a bit odd; section numbers can are like "3.3.3"
+ rather than straight numbers, so numeric sort can't work,
+ and yet neither does text sort (2.12 should be after 2.2).
+
+-->
+
+<xsl:stylesheet
+ xmlns:xsl="http://www.w3.org/TR/WD-xsl"
+ xmlns="http://www.w3.org/TR/WD-xhtml"
+ indent-result="yes"
+ >
+
+<!-- default behaviour - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:template><xsl:apply-templates/></xsl:template>
+<xsl:template match="textnode()"><xsl:value-of/></xsl:template>
+
+<!-- selective behaviour - - - - - - - - - - - - - - - - - - - - - - - - -->
+
+
+ <!-- ROOT: write an HTML wrapper -->
+ <xsl:template match="/">
+ <xsl:apply-templates select="TESTSUITE"/>
+ </xsl:template>
+
+ <xsl:template match="TESTSUITE">
+ <!-- XHTML namespace -->
+ <html><head>
+ <xsl:comment>Generated by an XSL stylesheet.</xsl:comment>
+ <title> XML Conformance Tests </title>
+ <meta http-equiv="Content-Type"
+ content="text/html;charset=utf-8"/>
+ <style>
+ <xsl:comment>
+ BODY {
+ font-family: Lucida, Helvetica, Univers, sans-serif;
+ }
+ H1, H2, H3, H4 {
+ text-align: left;
+ color: #0066CC;
+ }
+ </xsl:comment>
+ </style>
+ <style>
+ <xsl:comment>
+ a:hover {
+ color: white;
+ background-color: blue;
+ }
+ </xsl:comment>
+ </style>
+ </head><body bgcolor='#ffffff'>
+ <center>
+ <table border="4" width="90%">
+ <tr >
+ <td>
+ <table>
+ <tr >
+ <td width="40%"><img src="files/a_oasis-logo.gif" width="350" height="125"/></td>
+ <td width="30%"/>
+ <td width="40%" align="right"><img src="files/top3.jpe" width="400" height="125"/></td>
+ </tr>
+ </table>
+ <center>
+ <table>
+ <tr>
+ <td ><b><font size="+2">A Joint Development Effort</font></b></td>
+ </tr>
+ </table>
+ </center>
+ </td>
+ </tr>
+ </table>
+ </center>
+ <p/>
+
+ <p/>
+ <h4>OASIS XML Conformance Subcommittee<br/>XML 1.0 Test Suite, Second Edition<br/>Working Draft<br/>15 March 2001</h4>
+ <dl>
+ <dt><b>This version:</b></dt>
+ <dd><ul>
+ <li><a href="http://www.oasis-open.org/committees/xml-conformance/suite-v1se/xmlconf-20010315.htm">
+ http://www.oasis-open.org/committees/xml-conformance/suite-v1se/xmlconf-20010315.htm</a>
+ (<a href="http://www.oasis-open.org/committees/xml-conformance/suite-v1se/xmlconf-20010315.xml">XML</a>)
+ </li>
+ </ul>
+ </dd>
+ <p/>
+ <dt><b>Current Version:</b></dt>
+ <dd>
+ <ul>
+ <li><a href="http://www.oasis-open.org/committees/xml-conformance/suite-v1se/xmlconf.xml">
+ http://www.oasis-open.org/committees/xml-conformance/suite-v1se/xmlconf.xml</a></li>
+ </ul>
+ </dd>
+ <p/>
+ <dt><b>Previous Version:</b></dt>
+ <dd>
+ <ul>
+ <li><a href="http://www.oasis-open.org/committees/xml-conformance/suite-v1/xmlconf-19990712.xml">
+ http://www.oasis-open.org/committees/xml-conformance/suite-v1/xmlconf-19990712.xml</a></li>
+ </ul>
+ </dd>
+ <p/>
+ <dt><b>Test Archive:</b></dt>
+ <dd><ul>
+ <li><a href="http://www.oasis-open.org/committees/xml-conformance/suite-v1se/xmlconf-20010315.tar.gz">http://www.oasis-open.org/committees/xml-conformance/suite-v1se/xmlconf-20010315.tar.gz</a>
+ </li>
+ </ul></dd>
+ <p/>
+ <dt><b>OASIS XML Conformance Technical Committee:</b></dt>
+ <dd><ul><li><a href="http://www.oasis-open.org/committees/xml-conformance/">http://www.oasis-open.org/committees/xml-conformance/</a>
+ </li></ul></dd>
+ <p/>
+ <dt><b>Comments:</b></dt>
+ <dd><ul><li>Mary Brady, NIST <a href="mailto:[email protected]">&lt;[email protected]&gt;</a>
+ </li></ul></dd>
+ <p/>
+ </dl>
+ <hr/>
+
+ <a name="contents"/>
+ <h2>Table of Contents</h2>
+ <ol >
+ <li><a href="#intro">Introduction</a></li>
+ <li><a href="#matrix">Test Matrix</a></li>
+ <ol >
+ <li ><a href="#binary">Binary Tests</a></li>
+ <li><a href="#output">Output Tests</a></li>
+ </ol>
+ <li><a href="#listings">Test Case Descriptions</a></li>
+ <ol >
+ <li><a href="#valid">Valid Documents</a></li>
+ <li><a href="#invalid">Invalid Documents</a></li>
+ <li><a href="#not-wf">Not-WF Documents</a></li>
+ <li><a href="#error">Optional Errors</a></li>
+ </ol>
+ <li><a href="#contrib">Contributors</a></li>
+ </ol>
+ <a name="intro"/>
+ <h2>1. Introduction </h2>
+ <p> The <i>OASIS</i> XML Conformance Subcommittee is concerned with
+ improving the quality of XML processors. The tests described in this
+ document provide a set of metrics to determine how well a
+ particular implementation conforms to the
+ <a href="http://www.w3.org/TR/REC-xml">W3C XML 1.0 (Second Edition) Recommendation </a>.
+ The XML Conformance Test Suite is intended
+ to complement the W3C XML 1.0 (Second Edition) Recommendation. All interpretations of
+ this Recommendation are subject to confirmation by the
+ <a href="http://www.w3.org/XML/Activity.html">W3C XML Coordination Group</a>.
+ </p>
+ <p>
+ Conformance tests can be used by developers, content creators, and
+ users alike to increase their level of confidence in product quality. In
+ circumstances where interoperability is necessary, these tests can also
+ be used to determine that differing implementations support the same set
+ of features. </p>
+
+ <p>This report provides supporting documentation for all of the tests
+ contributed by members of the <i>OASIS</i> XML Conformance Subcommittee.
+ Sources from which these tests have been collected
+ include: <em>
+ <xsl:for-each select="./TESTCASES">
+ <xsl:value-of select="@PROFILE"/>;
+ </xsl:for-each>
+ </em>. Although the tests came from a variety of sources, the actual test
+ descriptions and references back to the recommendation were in many instances
+ added by members of this subcommittee. It is anticipated that this report
+ will supplement the actual tests, which are available from
+ <a href="http://www.oasis-open.org/committees/xml-conformance/xml-test-suite.html">
+ http://www.oasis-open.org/committees/xml-conformance/xml-test-suite.html</a>.</p>
+
+ <p>Comments/suggestions should be
+ forwarded to the XML Conformance Subcommittee Chair, Mary Brady <a href="mailto:[email protected]">&lt;[email protected]&gt;</a>.</p>
+
+
+ <a name="matrix"/>
+ <h2>2. Test Matrix </h2>
+
+ <p> Two basic types of test are presented here. These are
+ respectively <em><a href="#binary">Binary Tests</a></em>
+ and <em><a href="#output">Output Tests</a></em>. </p>
+
+ <a name="binary"/>
+ <h3>2.1 Binary Tests </h3>
+
+ <p> <em>Binary</em> conformance tests are documents which
+ are grouped into one of four categories. Given a document
+ in a given category, each kind of XML parser must treat it
+ consistently and either accept it (a <em>positive test</em>)
+ or reject it (a <em>negative test</em>). It is in that sense
+ that the tests are termed "binary". The XML 1.0 (Second Edition) Recommendation
+ talks in terms of two types of XML processor:
+ <em>validating</em> ones, and <em>nonvalidating</em> ones.
+ There are two differences between these types of processors: </p>
+
+ <ol>
+ <li> Validating processors check special productions that
+ nonvalidating parsers don't, called <em>validity
+ constraints</em>. (Both must check a basic set of productions,
+ requiring XML documents to be <em>well formed</em>.) </li>
+
+ <li> Nonvalidating processors are permitted to not
+ include <em>external entities</em>, such as files with
+ text. Accordingly, they may not report errors which
+ would have been detected had those entities been read.</li>
+ </ol>
+
+ <p> There are two types of such entity, <em>parameter
+ entities</em> holding definitions which affect validation
+ and other processing; and <em>general entities</em> which
+ hold marked up text. It will be appreciated that there are
+ then five kinds of XML processor: validating processors,
+ and four kinds of nonvalidating processor based on the
+ combinations of external entity which they include.</p>
+
+ <center>
+ <table border="1" bgcolor="#ffffff" cellpadding="4">
+
+ <caption>
+ <b>Basic XML Parsing Test Matrix</b><br/>
+ Test Document Type v. Parser Type
+ </caption>
+
+ <tr bgcolor="#ffffcc">
+ <th widthH="5%" rowspan="2">&#160;</th>
+ <th widthH="20%" colspan="2">Nonvalidating</th>
+ <th widthH="5%" rowspan="2">Validating</th>
+ </tr>
+
+ <tr bgcolor="#ffffcc">
+ <th>External Entities<br/>Ignored (3 cases)</th>
+ <th>External Entities<br/>Read</th>
+ </tr>
+
+ <tr>
+ <th bgcolor="#ffffcc">Valid Documents</th>
+ <td align="center"><b>accept</b></td>
+ <td align="center"><b>accept</b></td>
+ <td align="center"><b>accept</b></td>
+ </tr>
+
+ <tr>
+ <th bgcolor="#ffffcc">Invalid Documents</th>
+ <td align="center"><b>accept</b></td>
+ <td align="center"><b>accept</b></td>
+ <td align="center">reject</td>
+ </tr>
+
+ <tr>
+ <th bgcolor="#ffffcc">Non-WF Documents</th>
+ <td align="center">reject</td>
+ <td align="center">reject</td>
+ <td align="center">reject</td>
+ </tr>
+
+ <tr>
+ <th bgcolor="#ffffcc">WF Errors tied<br/>
+ to External Entity</th>
+ <td align="center"><b>accept</b><br/>(varies)</td>
+ <td align="center">reject</td>
+ <td align="center">reject</td>
+ </tr>
+
+ <tr>
+ <th bgcolor="#ffffcc">Documents with<br/> Optional Errors</th>
+ <td align="center">(not specified)</td>
+ <td align="center">(not specified)</td>
+ <td align="center">(not specified)</td>
+ </tr>
+
+ </table>
+ </center>
+
+ <p> At this time, the XML community primarily uses parsers
+ which are in the rightmost two columns of this table, calling
+ them <em>Well Formed XML Parsers</em> (or "WF Parsers") and
+ <em>Validating XML Parsers</em>. A second test matrix
+ could be defined to address the variations in the types of
+ of XML processor which do not read all external entities.
+ That additional matrix is not provided here at this time. </p>
+
+
+ <a name="output"/>
+ <h3>2.2 Output Tests</h3>
+
+ <p> The XML 1.0 (Second Edition) Recommendation places a number of requirements
+ on XML processors, to ensure that they report information to
+ applications as needed. Such requirements are testable.
+ Validating processors are required to report slightly more
+ information than nonvalidating ones, so some tests will
+ require separate output files. Some of the information that
+ must be reported will not be reportable without reading all
+ the external entities in a particular test. Many of the tests for
+ valid documents are paired with an output file to ensure that
+ the XML processor provides the correct information. </p>
+
+ <p>The output of these tests is provided in two forms, as
+ described in <a href="sun/cxml.html">SUN Microsystems XML
+ Canonical Forms</a>. At present, the <em>James Clark</em>
+ collection provides corresponding output in <em>First XML
+ Canonical Form</em>, and the <em>SUN Microsystems</em>
+ collection provides corresponding output in <em>Second XML
+ Canonical Form</em>. When the <a href="http://www.w3.org/XML/">
+ W3C XML Group </a>finalizes its work on Canonical XML, these
+ output files will be updated.
+ </p>
+
+ <a name="listings"/>
+ <h2>3. Test Case Descriptions</h2>
+
+ <p> This section of this report contains descriptions of test
+ cases, each of which fits into the categories noted above.
+ Each test case includes a document of one of the types in the
+ binary test matrix above (e.g. valid or invalid documents).
+ </p>
+
+ <p> In some cases, an <a href="#output">output file </a>, as
+ described in Section 2.2, will also be associated with
+ a valid document, which is used for output testing. If such
+ a file exists, it will be noted at the end of the description
+ of the input document. </p>
+
+ <p> The description for each test case is presented as a two
+ part table. The right part describes what the test does.
+ This description is intended to have enough detail to evaluate
+ diagnostic messages. The left part includes: <ul>
+
+ <li> An entry describing the <em>Sections and/or Rules</em>
+ from the <a href="http://www.w3.org/TR/2000/REC-xml-20001006">
+ XML 1.0 (Second Edition) Recommendation</a> which this case excercises.</li>
+
+ <li> The unique <em>Test ID</em> within a given <em>Collection</em>
+ for this test. </li>
+
+ <li> The <em>Collection</em> from which this test originated.
+ Given the <em>Test ID</em> and the <em>Collection</em>, each
+ test can be uniquely identified. </li>
+
+ <li> Some tests may have a field identifying the kinds of
+ external <em>Entities</em> a nonvalidating processor must
+ include (parameter, general, or both) to be able to
+ detect any errors in that test case. </li>
+
+ </ul></p>
+
+ <p><em>Note that the output format of this report is subject
+ to change. Also, since XSL does not currently support the
+ type of sorting rule necessary to make section numbers like
+ 2.12 appear after 2.2, the ordering is not quite what is
+ desired.</em></p>
+
+ <a name="valid"/>
+ <h3>3.1 Valid XML Documents</h3>
+
+ <p> All conforming <em> XML 1.0 Processors </em> are
+ <b>required</b> to accept valid documents, reporting no
+ errors. In this section of this test report are found
+ descriptions of test cases which fit into this category. </p>
+
+ <xsl:apply-templates select=".// TEST [ @TYPE = 'valid' ]"
+ order-by="@SECTIONS"/>
+
+ <a name="invalid"/>
+ <h3>3.2 Invalid XML Documents</h3>
+
+ <p> All conforming XML 1.0 <em> Validating Processors </em>
+ are <b>required</b> to report recoverable errors in the case
+ of documents which are <em>Invalid</em>. Such errors are
+ violations of some <em>validity constraint (VC)</em>. </p>
+
+ <p> If a validating processor does not report an error when
+ given one of these test cases, or if the error reported is
+ a fatal error, it is not conformant. If the error reported
+ does not correspond to the problem listed in this test
+ description, that could also be a conformance problem; it
+ might instead be a faulty diagnostic. </p>
+
+ <p> All conforming XML 1.0 <em> Nonvalidating Processors </em>
+ should accept these documents, reporting no errors. </p>
+
+ <xsl:apply-templates select=".//TEST[@TYPE='invalid']"
+ order-by="@SECTIONS"/>
+
+ <a name="not-wf"/>
+ <h3>3.3 Documents that are Not Well Formed</h3>
+
+ <p> All conforming XML 1.0 Processors are <b>required</b> to
+ report fatal errors in the case of documents which are not
+ <em>Well Formed</em>. Such errors are basically of two types:
+ <em>(a)</em> the document violates the XML grammar; or else
+ <em>(b)</em> it violates a <em>well formedness constraint
+ (WFC)</em>. There is a single <em>exception to that
+ requirement</em>: nonvalidating processors which do not read
+ certain types of external entities are not required to detect
+ (and hence report) these errors. </p>
+
+ <p> If a processor does not report a fatal error when given
+ one of these test cases, it is not conformant. If the error
+ reported does not correspond to the problem listed in this
+ test description, that could also be a conformance problem;
+ it might instead be a faulty diagnostic. </p>
+
+ <xsl:apply-templates select=".// TEST [ @TYPE = 'not-wf' ]"
+ order-by="@SECTIONS"/>
+
+ <a name="error"/>
+ <h3>3.4 XML Documents with Optional Errors</h3>
+
+ <p> Conforming XML 1.0 Processors are permitted to ignore
+ certain errors, or to report them at user option. In this
+ section of this test report are found descriptions of
+ test cases which fit into this category. </p>
+
+ <p> Processor behavior on such test cases does not affect
+ conformance to the XML 1.0 (Second Edition) Recommendation, except as noted. </p>
+
+ <xsl:apply-templates select=".//TEST[@TYPE='error']"
+ order-by="@SECTIONS"/>
+
+ <a name="contrib"/>
+ <h3>4. Contributors (Non-normative)</h3>
+
+ <p> A team of volunteer members have participated in the
+ development of this work. Contributions have come from:
+ </p>
+ <ul>
+ <li>Murry Altheim, Sun Microsystems</li>
+ <li>Mary Brady, NIST</li>
+ <li>Tim Boland, NIST</li>
+ <li>David Brownell, Sun Microsystems</li>
+ <li>James Clark</li>
+ <li>Karin Donker, IBM</li>
+ <li>Irina Golfman, Inera Incorporated</li>
+ <li>Tony Graham, Mulberry Technologies</li>
+ <li>G. Ken Holman, Crane Softwrights Ltd</li>
+ <li>Alex Milowski, Veo Systems, Inc</li>
+ <li>Makota Murata, Fuji Xerox</li>
+ <li>Miles O'Reilly, Microstar Software, Ltd</li>
+ <li>Matt Timmermans, Microstar Software, Ltd</li>
+ <li>Richard Rivello, NIST</li>
+ <li>Lynne Rosenthal, NIST</li>
+ <li>Brian Schellar, Chrystal Software</li>
+ <li>Bill Smith, Sun Microsystems</li>
+ <li>Trevor Veary, Software AG</li>
+ <li>Eric Ye, IBM</li>
+ </ul>
+ <p>End</p>
+
+ </body></html>
+ </xsl:template>
+
+ <xsl:template match="TEST">
+ <table width="100%">
+ <tr valign="top">
+ <td width='40%'><table bgcolor='#eeeeff'
+ border='1' width='100%' height="100%">
+ <tr>
+ <td width='50%'><b>Sections [Rules]:</b></td>
+ <td bgcolor='#ffffcc'>
+ <xsl:value-of select="@SECTIONS"/></td>
+ </tr>
+ <tr valign="top">
+ <td width='50%'><b>Test ID:</b></td>
+ <td bgcolor='#ffffcc'>
+ <xsl:value-of select="@ID"/></td>
+ </tr>
+ <xsl:if test=".[not ( @ENTITIES = 'none')
+ and ( @TYPE = 'not-wf' )]">
+ <tr valign="top">
+ <td width='50%'><b>Entities:</b></td>
+ <td bgcolor='#ffffcc'><font color='blue'>
+ <xsl:value-of select="@ENTITIES"/>
+ </font></td>
+ </tr>
+ </xsl:if>
+ <xsl:if test="../@PROFILE">
+ <tr valign="top">
+ <td width='50%'><b>Collection:</b></td>
+ <td bgcolor='#ffffcc'>
+ <xsl:value-of select="../@PROFILE"/>
+ </td>
+ </tr>
+ </xsl:if>
+ </table></td>
+ <td bgcolor='#ccffff'>
+ <p><xsl:apply-templates/></p>
+ <xsl:if test="@OUTPUT | @OUTPUT3">
+ <p>There is an output test associated with this
+ input file.</p>
+ </xsl:if>
+ </td>
+ </tr>
+ </table>
+ </xsl:template>
+
+ <!-- XT takes 'B|EM' and xsl:copy, IE5b2 doesn't -->
+ <xsl:template match="EM">
+ <em><xsl:apply-templates/></em>
+ </xsl:template>
+ <xsl:template match="B">
+ <b><xsl:apply-templates/></b>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/lib/xmerl/test/xmlconformance.xsl b/lib/xmerl/test/xmlconformance.xsl
new file mode 100644
index 0000000000..fd1acb3d82
--- /dev/null
+++ b/lib/xmerl/test/xmlconformance.xsl
@@ -0,0 +1,498 @@
+<?xml version='1.0'?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<!--
+<<<<<<< conformance.xsl
+ Original version copyright 1999 by Sun Microsystems, Inc.
+ All Rights Reserved.
+ Modifications copyright 1999 by OASIS.
+ Modifications copyright 2001 by OASIS.
+ Modifications copyright 2002 by W3C.
+=======
+ XSL Stylesheet for documenting XML conformance tests.
+ Tested against LOTUS Xalan processor.
+>>>>>>> 1.3
+
+ XSL 2001-03-15 Stylesheet for documenting XML conformance tests.
+
+ This expects to be run on a document matching the DTD that Sun
+ defined for merging collections of self-descriptive XML tests.
+
+ Since all those collections will have (by design) the same test
+ architecture, this includes boilerplate describing that design,
+ to be used by all test documentation.
+
+ ISSUES:
+ - Sorting is a bit odd; section numbers can are like "3.3.3"
+ rather than straight numbers, so numeric sort can't work,
+ and yet neither does text sort (2.12 should be after 2.2).
+-->
+
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+ <xsl:output method="html" indent="yes"/>
+
+ <!-- ROOT: write an HTML wrapper -->
+ <xsl:template match="/TESTSUITE">
+ <!-- XHTML namespace -->
+
+ <html xmlns="http://www.w3.org/1999/xhtml"><head>
+ <title> XML Conformance Tests </title>
+ <meta http-equiv="Content-Type"
+ content="text/html;charset=utf-8"/>
+ <style type="text/css">
+
+ tr.premiere { background-color: #BEDCE6; }
+
+ th { text-align: left; vertical-align: top }
+
+ .editor { color: red; }
+
+ .countdown { color: white; background-color: red; }
+
+ blockquote, q { font-family: Arial, Helvetica, sans-serif; }
+
+ .quote { font-family: Arial, Helvetica, sans-serif; }
+
+ pre.quote { margin-left: 2.5em; }
+
+ ol.quote { font-family: Arial, Helvetica, sans-serif; margin-left: 3em; }
+
+ .diff-add { background-color: yellow; }
+
+ .diff-chg { background-color: lime; }
+
+ .diff-del { text-decoration: line-through; }
+
+ </style>
+
+ </head><body bgcolor='#ffffff'>
+ <p><a href="http://www.w3.org/"><img src="http://xw2k.sdct.itl.nist.gov/martinez/xmlts/2001/XML-Test-Suite/xmlconf/files/w3c_home.gif"
+
+ alt="W3C" height="48" width="72" border="0"/></a><a href="http://www.w3.org/Architecture/"
+
+ rel="in-domain"><img src="http://xw2k.sdct.itl.nist.gov/martinez/xmlts/2001/XML-Test-Suite/xmlconf/files/arquitecture.bmp" alt="Architecture Domain" border="0"/></a> <a
+
+ href="../" rel="in-area"> XML</a> | <a href="/Member/#confidential">Member-Confidential!</a></p>
+
+ <h1 align="center">XML 1.0 (Second Edition) errata 20020320,</h1>
+ <h1 align="center">W3C Conformance Test Suite 20020606</h1> <dl>
+
+
+ <dt><b>This version:</b></dt>
+ <dd><ul>
+ <li><p><a href="xmlconf-20020606.htm">
+ http://www.w3.org/XML/Test/xmlconf-20020606.htm</a>
+ (<a href="xmlconf-20020606.xml">XML</a>)</p>
+ </li>
+ </ul>
+ </dd>
+
+ <dt><b>Current Version:</b></dt>
+ <dd>
+ <ul>
+ <li><p><a href="xmlconf-20020606.xml">
+ http://www.w3.org/XML/Test/xmlconf-20020606.xml</a></p></li>
+ </ul>
+ </dd>
+
+ <dt><b>Previous Version:</b></dt>
+ <dd>
+ <ul>
+ <li><p><a href="http://www.oasis-open.org/committees/xml-conformance/suite-v1se/xmlconf-20010315.htm">
+ http://www.oasis-open.org/committees/xml-conformance/suite-v1se/xmlconf-20010315.htm</a>
+ (<a href="http://www.oasis-open.org/committees/xml-conformance/suite-v1se/xmlconf-20010315.xml">XML</a>)</p></li>
+ </ul>
+ </dd>
+
+ <dt><b>Test Archive:</b></dt>
+ <dd><ul>
+ <li><p><a href="xmlts20020606.zip">http://www.w3.org/XML/Test/xmlts20020606.zip</a>
+ </p></li>
+ <li><p><a href="xmlts20020606.tar">http://www.w3.org/XML/Test/xmlts20020606.tar</a>
+ </p></li>
+ </ul></dd>
+
+ <dt><b>W3C XML Core Working Group:</b></dt>
+ <dd><ul><li><p><a href="http://www.w3.org/XML/Group/Core">http://www.w3.org/XML/Group/Core</a>
+ </p></li></ul></dd>
+
+ <dt><b>Comments:</b></dt>
+ <dd><ul><li>Sandra I. Martinez, NIST <a href="mailto:[email protected]"> [email protected]</a>
+ </li></ul></dd>
+
+ </dl>
+
+ <a name="contents"/>
+ <h2>Table of Contents</h2>
+ <ol >
+ <li><a href="#intro">Introduction</a></li>
+ <li><a href="#matrix">Test Matrix</a></li>
+ <ol >
+ <li ><a href="#binary">Binary Tests</a></li>
+ <li><a href="#output">Output Tests</a></li>
+ </ol>
+ <li><a href="#listings">Test Case Descriptions</a></li>
+ <ol >
+ <li><a href="#valid">Valid Documents</a></li>
+ <li><a href="#invalid">Invalid Documents</a></li>
+ <li><a href="#not-wf">Not-WF Documents</a></li>
+ <li><a href="#error">Optional Errors</a></li>
+ </ol>
+ <li><a href="#contrib">Contributors</a></li>
+ </ol>
+ <a name="intro"/>
+ <h2>1. Introduction </h2>
+ <p>
+ The tests described in this document provide an initial set of metrics to determine how well a
+ particular implementation conforms to the
+ <a href="http://www.w3.org/TR/REC-xml">W3C XML 1.0 (Second Edition) Recommendation</a>.
+ The XML Conformance Test Suite is intended
+ to complement the W3C XML 1.0 (Second Edition) Recommendation. All interpretations
+ of this Recommendation are subject to confirmation by the
+ <a href="http://www.w3.org/XML/">
+ W3C XML Group </a>.
+ </p>
+ <p>
+ Conformance tests can be used by developers, content creators, and
+ users alike to increase their level of confidence in product quality. In
+ circumstances where interoperability is necessary, these tests can also
+ be used to determine that differing implementations support the same set
+ of features. </p>
+
+ <p>The XML Test Suite was transferred from OASIS to W3C and is being augmented to reflect the
+ current work of the W3C XML Core Working Group, including
+ <a href="http://www.w3.org/XML/Group/2002/02/xml10-test-suite-issues">resolved issues</a> related to the
+ Recommendation and published Errata. This report provides supporting documentation for all the tests included in
+ the test suite. Sources from which these tests have been collected
+ include: <em>
+ <xsl:for-each select="TESTCASES">
+ <xsl:value-of select="@PROFILE"/>
+ <xsl:text>; </xsl:text>
+ </xsl:for-each>
+ </em>. </p>
+
+ <a name="matrix"/>
+ <h2>2. Test Matrix </h2>
+
+ <p> Two basic types of test are presented here. These are
+ respectively <em><a href="#binary">Binary Tests</a></em>
+ and <em><a href="#output">Output Tests</a></em>. </p>
+
+ <a name="binary"/>
+ <h3>2.1 Binary Tests </h3>
+
+ <p> <em>Binary</em> conformance tests are documents which
+ are grouped into one of four categories. Given a document
+ in a given category, each kind of XML parser must treat it
+ consistently and either accept it (a <em>positive test</em>)
+ or reject it (a <em>negative test</em>). It is in that sense
+ that the tests are termed "binary". The XML 1.0 (Second Edition) Recommendation
+ talks in terms of two types of XML processor:
+ <em>validating</em> ones, and <em>nonvalidating</em> ones.
+ There are two differences between these types of processors: </p>
+
+ <ol>
+ <li> Validating processors check special productions that
+ nonvalidating parsers don't, called <em>validity
+ constraints</em>. (Both must check a basic set of productions,
+ requiring XML documents to be <em>well formed</em>.) </li>
+
+ <li> Nonvalidating processors are permitted to not
+ include <em>external entities</em>, such as files with
+ text. Accordingly, they may not report errors which
+ would have been detected had those entities been read.</li>
+ </ol>
+
+ <p> There are two types of such entity, <em>parameter
+ entities</em> holding definitions which affect validation
+ and other processing; and <em>general entities</em> which
+ hold marked up text. It will be appreciated that there are
+ then five kinds of XML processor: validating processors,
+ and four kinds of nonvalidating processor based on the
+ combinations of external entity which they include.</p>
+
+ <center>
+ <table border="1" bgcolor="#ffffff" cellpadding="4">
+
+ <caption>
+ <b>Basic XML Parsing Test Matrix</b><br/>
+ Test Document Type v. Parser Type
+ </caption>
+
+ <tr bgcolor="#ffffcc">
+ <th widthH="5%" rowspan="2"><xsl:text> </xsl:text></th>
+ <th widthH="20%" colspan="2">Nonvalidating</th>
+ <th widthH="5%" rowspan="2">Validating</th>
+ </tr>
+
+ <tr bgcolor="#ffffcc">
+ <th>External Entities<br/>Ignored (3 cases)</th>
+ <th>External Entities<br/>Read</th>
+ </tr>
+
+ <tr>
+ <th bgcolor="#ffffcc">Valid Documents</th>
+ <td align="center"><b>accept</b></td>
+ <td align="center"><b>accept</b></td>
+ <td align="center"><b>accept</b></td>
+ </tr>
+
+ <tr>
+ <th bgcolor="#ffffcc">Invalid Documents</th>
+ <td align="center"><b>accept</b></td>
+ <td align="center"><b>accept</b></td>
+ <td align="center">reject</td>
+ </tr>
+
+ <tr>
+ <th bgcolor="#ffffcc">Non-WF Documents</th>
+ <td align="center">reject</td>
+ <td align="center">reject</td>
+ <td align="center">reject</td>
+ </tr>
+
+ <tr>
+ <th bgcolor="#ffffcc">WF Errors tied<br/>
+ to External Entity</th>
+ <td align="center"><b>accept</b><br/>(varies)</td>
+ <td align="center">reject</td>
+ <td align="center">reject</td>
+ </tr>
+
+ <tr>
+ <th bgcolor="#ffffcc">Documents with<br/> Optional Errors</th>
+ <td align="center">(not specified)</td>
+ <td align="center">(not specified)</td>
+ <td align="center">(not specified)</td>
+ </tr>
+
+ </table>
+ </center>
+
+ <p> At this time, the XML community primarily uses parsers
+ which are in the rightmost two columns of this table, calling
+ them <em>Well Formed XML Parsers</em> (or "WF Parsers") and
+ <em>Validating XML Parsers</em>. A second test matrix
+ could be defined to address the variations in the types of
+ of XML processor which do not read all external entities.
+ That additional matrix is not provided here at this time. </p>
+
+
+ <a name="output"/>
+ <h3>2.2 Output Tests</h3>
+
+ <p> The XML 1.0 (Second Edition) Recommendation places a number of requirements
+ on XML processors, to ensure that they report information to
+ applications as needed. Such requirements are testable.
+ Validating processors are required to report slightly more
+ information than nonvalidating ones, so some tests will
+ require separate output files. Some of the information that
+ must be reported will not be reportable without reading all
+ the external entities in a particular test. Many of the tests for
+ valid documents are paired with an output file as the canonical
+ representation of the input file, to ensure that the XML
+ processor provides the correct information. </p>
+
+ <a name="listings"/>
+ <h2>3. Test Case Descriptions</h2>
+
+ <p> This section of this report contains descriptions of test
+ cases, each of which fits into the categories noted above.
+ Each test case includes a document of one of the types in the
+ binary test matrix above (e.g. valid or invalid documents).
+ </p>
+
+ <p> In some cases, an <a href="#output">output file </a>, as
+ described in Section 2.2, will also be associated with
+ a valid document, which is used for output testing. If such
+ a file exists, it will be noted at the end of the description
+ of the input document. </p>
+
+ <p> The description for each test case is presented as a two
+ part table. The right part describes what the test does.
+ This description is intended to have enough detail to evaluate
+ diagnostic messages. The left part includes: <ul>
+
+ <li> An entry describing the <em>Sections and/or Rules</em>
+ from the <a href="http://www.w3.org/TR/2000/REC-xml-20001006">
+ XML 1.0 (Second Edition) Recommendation</a> which this case excercises.</li>
+
+ <li> The unique <em>Test ID</em> within a given <em>Collection</em>
+ for this test. </li>
+
+ <li> The <em>Collection</em> from which this test originated.
+ Given the <em>Test ID</em> and the <em>Collection</em>, each
+ test can be uniquely identified.</li>
+
+ <li> Some tests may have a field identifying the kinds of
+ external <em>Entities</em> a nonvalidating processor must
+ include (parameter, general, or both) to be able to
+ detect any errors in that test case. </li>
+
+ </ul></p>
+
+ <a name="valid"/>
+ <h3>3.1 Valid XML Documents</h3>
+
+ <p> All conforming <em> XML 1.0 Processors </em> are
+ <b>required</b> to accept valid documents, reporting no
+ errors. In this section of this test report are found
+ descriptions of test cases which fit into this category. </p>
+
+ <xsl:apply-templates select="//TEST[@TYPE='valid']">
+ <xsl:sort select="@SECTIONS"/>
+ </xsl:apply-templates>
+
+ <a name="invalid"/>
+ <h3>3.2 Invalid XML Documents</h3>
+
+ <p> All conforming XML 1.0 <em> Validating Processors </em>
+ are <b>required</b> to report recoverable errors in the case
+ of documents which are <em>Invalid</em>. Such errors are
+ violations of some <em>validity constraint (VC)</em>. </p>
+
+ <p> If a validating processor does not report an error when
+ given one of these test cases, or if the error reported is
+ a fatal error, it is not conformant. If the error reported
+ does not correspond to the problem listed in this test
+ description, that could also be a conformance problem; it
+ might instead be a faulty diagnostic. </p>
+
+ <p> All conforming XML 1.0 <em> Nonvalidating Processors </em>
+ should accept these documents, reporting no errors. </p>
+
+ <xsl:apply-templates select="//TEST[@TYPE='invalid']">
+ <xsl:sort select="@SECTIONS"/>
+ </xsl:apply-templates>
+
+ <a name="not-wf"/>
+ <h3>3.3 Documents that are Not Well Formed</h3>
+
+ <p> All conforming XML 1.0 Processors are <b>required</b> to
+ report fatal errors in the case of documents which are not
+ <em>Well Formed</em>. Such errors are basically of two types:
+ <em>(a)</em> the document violates the XML grammar; or else
+ <em>(b)</em> it violates a <em>well formedness constraint
+ (WFC)</em>. There is a single <em>exception to that
+ requirement</em>: nonvalidating processors which do not read
+ certain types of external entities are not required to detect
+ (and hence report) these errors. </p>
+
+ <p> If a processor does not report a fatal error when given
+ one of these test cases, it is not conformant. If the error
+ reported does not correspond to the problem listed in this
+ test description, that could also be a conformance problem;
+ it might instead be a faulty diagnostic. </p>
+
+ <xsl:apply-templates select="//TEST[@TYPE='not-wf']">
+ <xsl:sort select="@SECTIONS"/>
+ </xsl:apply-templates>
+
+ <a name="error"/>
+ <h3>3.4 XML Documents with Optional Errors</h3>
+
+ <p> Conforming XML 1.0 Processors are permitted to ignore
+ certain errors, or to report them at user option. In this
+ section of this test report are found descriptions of
+ test cases which fit into this category. </p>
+
+ <p> Processor behavior on such test cases does not affect
+ conformance to the XML 1.0 (Second Edition) Recommendation, except as noted. </p>
+
+ <xsl:apply-templates select="//TEST[@TYPE='error']">
+ <xsl:sort select="@SECTIONS"/>
+ </xsl:apply-templates>
+
+ <a name="contrib"/>
+ <h3>4. Contributors (Non-normative)</h3>
+
+ <p> A team of volunteer members have participated in the
+ development of this work. Contributions have come from:
+ </p>
+ <ul>
+ <li>Murry Altheim, Sun Microsystems</li>
+ <li>Mary Brady, NIST</li>
+ <li>Tim Boland, NIST</li>
+ <li>David Brownell, Sun Microsystems</li>
+ <li>James Clark</li>
+ <li>Karin Donker, IBM</li>
+ <li>Irina Golfman, Inera Incorporated</li>
+ <li>Tony Graham, Mulberry Technologies</li>
+ <li>G. Ken Holman, Crane Softwrights Ltd</li>
+ <li>Alex Milowski, Veo Systems, Inc</li>
+ <li>Makota Murata, Fuji Xerox</li>
+ <li>Miles O'Reilly, Microstar Software, Ltd</li>
+ <li>Matt Timmermans, Microstar Software, Ltd</li>
+ <li>Richard Rivello, NIST</li>
+ <li>Lynne Rosenthal, NIST</li>
+ <li>Brian Schellar, Chrystal Software</li>
+ <li>Bill Smith, Sun Microsystems</li>
+ <li>Trevor Veary, Software AG</li>
+ <li>Richard Tobin, University of Edinburgh</li>
+ <li>Jonathan Marsh, Microsoft </li>
+ <li>Daniel Veillard, Imaq</li>
+ <li>Jonathan Marsh, Microsoft</li>
+ <li>Paul Grosso, Arbortext</li>
+
+ </ul>
+
+ <p>End</p>
+ </body></html>
+ </xsl:template>
+
+ <xsl:template match="TEST">
+ <table width="100%">
+ <tr valign="top">
+ <td width='40%'><table bgcolor='#eeeeff'
+ border='1' width='100%' height="100%">
+ <tr>
+ <td width='50%'><b>Sections [Rules]:</b></td>
+ <td bgcolor='#ffffcc'>
+ <xsl:value-of select="@SECTIONS"/></td>
+ </tr>
+ <tr valign="top">
+ <td width='50%'><b>Test ID:</b></td>
+ <td bgcolor='#ffffcc'>
+ <xsl:value-of select="@ID"/></td>
+ </tr>
+ <xsl:if test="not ( @ENTITIES = 'none')
+ and ( @TYPE = 'not-wf' )">
+ <tr valign="top">
+ <td width='50%'><b>Entities:</b></td>
+ <td bgcolor='#ffffcc'><font color='blue'>
+ <xsl:value-of select="@ENTITIES"/>
+ </font></td>
+ </tr>
+ </xsl:if>
+ <xsl:if test="../@PROFILE">
+ <tr valign="top">
+ <td width='50%'><b>Collection:</b></td>
+ <td bgcolor='#ffffcc'>
+ <xsl:value-of select="../@PROFILE"/>
+ </td>
+ </tr>
+ </xsl:if>
+ </table></td>
+ <td bgcolor='#ccffff'>
+ <p>
+ <xsl:apply-templates/></p>
+ <xsl:if test="@OUTPUT | @OUTPUT3">
+ <p>There is an output test associated with this
+ input file.</p>
+ </xsl:if>
+ </td>
+ </tr>
+ </table>
+ </xsl:template>
+
+ <!-- XT takes 'B|EM' and xsl:copy, IE5b2 doesn't -->
+ <xsl:template match="EM">
+ <em><xsl:apply-templates/></em>
+ </xsl:template>
+ <xsl:template match="B">
+ <b><xsl:apply-templates/></b>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/lib/xmerl/vsn.mk b/lib/xmerl/vsn.mk
index a4d7efaee3..280ff10efa 100644
--- a/lib/xmerl/vsn.mk
+++ b/lib/xmerl/vsn.mk
@@ -1 +1 @@
-XMERL_VSN = 1.2.7
+XMERL_VSN = 1.2.8
diff --git a/system/COPYRIGHT b/system/COPYRIGHT
index 444efcd6f5..94e9795b16 100644
--- a/system/COPYRIGHT
+++ b/system/COPYRIGHT
@@ -5,7 +5,7 @@ This software is subject to the following Copyrights and Licenses:
%CopyrightBegin%
-Copyright Ericsson AB 1997-2010. All Rights Reserved.
+Copyright Ericsson AB 1997-2011. 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
diff --git a/system/README b/system/README
index 317030373c..234fc23dbd 100644
--- a/system/README
+++ b/system/README
@@ -1,7 +1,7 @@
-Erlang/OTP June 11, 2010
+Erlang/OTP March 11, 2011
-LAST MINUTE INFORMATION -- Release of Erlang 5.8/OTP R14A
+LAST MINUTE INFORMATION -- Release of Erlang 5.8.3/OTP R14B02
1. GENERAL
@@ -35,7 +35,7 @@ LAST MINUTE INFORMATION -- Release of Erlang 5.8/OTP R14A
R11B-1). BEAM files from R10B or earlier are not supported.
To get the best performance, you should recompile your
- application code with the R13B04 compiler.
+ application code with the R14B02 compiler.
2. NOTES ABOUT THE SOLARIS VERSION
@@ -61,7 +61,7 @@ LAST MINUTE INFORMATION -- Release of Erlang 5.8/OTP R14A
4.1 The following linux distributions/version combinations are supported
and tested:
- Suse 9.4 x86, Suse 10.1 x86
+ Suse 9.4 x86, Suse 10.1 x86, Suse 10.1 x86_64
5. APPLICATIONS NOTES
------------------
diff --git a/system/doc/design_principles/events.xml b/system/doc/design_principles/events.xml
index 5579f1e459..23a9b8c7bc 100644
--- a/system/doc/design_principles/events.xml
+++ b/system/doc/design_principles/events.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>1997</year><year>2009</year>
+ <year>1997</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -217,5 +217,22 @@ terminate(_Args, Fd) ->
ok</pre>
</section>
</section>
+ <section>
+ <title>Handling Other Messages</title>
+ <p>If the gen_event should be able to receive other messages than
+ events, the callback function <c>handle_info(Info, StateName, StateData)</c>
+ must be implemented to handle them. Examples of
+ other messages are exit messages, if the gen_event is linked to
+ other processes (than the supervisor) and trapping exit signals.</p>
+ <code type="none">
+handle_info({'EXIT', Pid, Reason}, State) ->
+ ..code to handle exits here..
+ {ok, NewState}.</code>
+ <p>The code_change method also has to be implemented.</p>
+ <code type="none">
+code_change(OldVsn, State, Extra) ->
+ ..code to convert state (and more) during code change
+ {ok, NewState}</code>
+ </section>
</chapter>
diff --git a/system/doc/design_principles/fsm.xml b/system/doc/design_principles/fsm.xml
index 7cdd62057b..edb2e20605 100644
--- a/system/doc/design_principles/fsm.xml
+++ b/system/doc/design_principles/fsm.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>1997</year><year>2009</year>
+ <year>1997</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -308,6 +308,11 @@ terminate(normal, _StateName, _StateData) ->
handle_info({'EXIT', Pid, Reason}, StateName, StateData) ->
..code to handle exits here..
{next_state, StateName1, StateData1}.</code>
+ <p>The code_change method also has to be implemented.</p>
+ <code type="none">
+code_change(OldVsn, StateName, StateData, Extra) ->
+ ..code to convert state (and more) during code change
+ {ok, NextStateName, NewStateData}</code>
</section>
</chapter>
diff --git a/system/doc/design_principles/gen_server_concepts.xml b/system/doc/design_principles/gen_server_concepts.xml
index 8131c47a69..a904390999 100644
--- a/system/doc/design_principles/gen_server_concepts.xml
+++ b/system/doc/design_principles/gen_server_concepts.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>1997</year><year>2009</year>
+ <year>1997</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -264,6 +264,11 @@ terminate(normal, State) ->
handle_info({'EXIT', Pid, Reason}, State) ->
..code to handle exits here..
{noreply, State1}.</code>
+ <p>The code_change method also has to be implemented.</p>
+ <code type="none">
+code_change(OldVsn, State, Extra) ->
+ ..code to convert state (and more) during code change
+ {ok, NewState}.</code>
</section>
</chapter>
diff --git a/system/doc/design_principles/sup_princ.xml b/system/doc/design_principles/sup_princ.xml
index 067fd31961..2748f21bbe 100644
--- a/system/doc/design_principles/sup_princ.xml
+++ b/system/doc/design_principles/sup_princ.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>1997</year><year>2009</year>
+ <year>1997</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -335,6 +335,12 @@ supervisor:start_child(Pid, [id1])</code>
<c>apply(call, start_link, []++[id1])</c>, or actually:</p>
<code type="none">
call:start_link(id1)</code>
+ <p>A child under a <c>simple_one_for_one</c> supervisor can be terminated
+ with</p>
+ <code type="none">
+supervisor:terminate_child(Sup, Pid)</code>
+ <p>where <c>Sup</c> is the pid, or name, of the supervisor and
+ <c>Pid</c> is the pid of the child.</p>
</section>
<section>
diff --git a/system/doc/efficiency_guide/advanced.xml b/system/doc/efficiency_guide/advanced.xml
index 2383e3cf3d..821175bb09 100644
--- a/system/doc/efficiency_guide/advanced.xml
+++ b/system/doc/efficiency_guide/advanced.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2001</year><year>2010</year>
+ <year>2001</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -34,7 +34,7 @@
<p>A good start when programming efficiently is to have knowledge about
how much memory different data types and operations require. It is
implementation-dependent how much memory the Erlang data types and
- other items consume, but here are some figures for
+ other items consume, but here are some figures for the
erts-5.2 system (OTP release R9B). (There have been no significant
changes in R13.)</p>
@@ -200,7 +200,7 @@ On 64-bit architectures: 4 words for a reference from the current local node, an
<seealso marker="#ports">the maximum number of Erlang ports</seealso>
available, and operating system specific settings and limits.</item>
<tag><em>Number of arguments to a function or fun</em></tag>
- <item>256</item>
+ <item>255</item>
</taglist>
</section>
</chapter>
diff --git a/system/doc/efficiency_guide/appendix.xml b/system/doc/efficiency_guide/appendix.xml
index 631ef9bee7..6eaaeffbc4 100644
--- a/system/doc/efficiency_guide/appendix.xml
+++ b/system/doc/efficiency_guide/appendix.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2002</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/system/doc/efficiency_guide/binaryhandling.xml b/system/doc/efficiency_guide/binaryhandling.xml
index 8746de4b60..425d6308cf 100644
--- a/system/doc/efficiency_guide/binaryhandling.xml
+++ b/system/doc/efficiency_guide/binaryhandling.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2007</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
@@ -114,7 +114,7 @@ my_binary_to_list(<<>>) -> [].]]></code>
data. For each field that is matched out of a binary, the position in the
match context will be incremented.</p>
- <p>In R11B, a match context was only using during a binary matching
+ <p>In R11B, a match context was only used during a binary matching
operation.</p>
<p>In R12B, the compiler tries to avoid generating code that
@@ -205,7 +205,7 @@ Bin4 = <<Bin1/binary,17>>, %% 5 !!!
ProcBin for the binary. The reason is that the binary object can be
moved (reallocated) during an append operation, and when that happens
the pointer in the ProcBin must be updated. If there would be more than
- on ProcBin pointing to the binary object, it would not be possible to
+ one ProcBin pointing to the binary object, it would not be possible to
find and update all of them.</p>
<p>Therefore, certain operations on a binary will mark it so that
@@ -291,7 +291,7 @@ my_binary_to_list(<<>>) -> [].]]></code>
that initializes the matching operation will basically do nothing
when it sees that it was passed a match context instead of a binary.</p>
- <p>When the end of the binary is reached and second clause matches,
+ <p>When the end of the binary is reached and the second clause matches,
the match context will simply be discarded (removed in the next
garbage collection, since there is no longer any reference to it).</p>
diff --git a/system/doc/efficiency_guide/drivers.xml b/system/doc/efficiency_guide/drivers.xml
index 9fe54fb19a..1967fd7ada 100644
--- a/system/doc/efficiency_guide/drivers.xml
+++ b/system/doc/efficiency_guide/drivers.xml
@@ -40,7 +40,7 @@
any code in a driver.</p>
<p>By default, that lock will be at the driver level, meaning that
- if several ports has been opened to the same driver, only code for
+ if several ports have been opened to the same driver, only code for
one port at the same time can be running.</p>
<p>A driver can be configured to instead have one lock for each port.</p>
diff --git a/system/doc/efficiency_guide/functions.xml b/system/doc/efficiency_guide/functions.xml
index fe14a4f000..6be49dd7c9 100644
--- a/system/doc/efficiency_guide/functions.xml
+++ b/system/doc/efficiency_guide/functions.xml
@@ -127,7 +127,7 @@ map_pairs2(_Map, [_|_]=Xs, [] ) ->
map_pairs2(Map, [X|Xs], [Y|Ys]) ->
[Map(X, Y)|map_pairs2(Map, Xs, Ys)].]]></code>
- <p>the compiler is free rearrange the clauses. It will generate code
+ <p>the compiler is free to rearrange the clauses. It will generate code
similar to this</p>
<p><em>DO NOT (already done by the compiler)</em></p>
diff --git a/system/doc/efficiency_guide/myths.xml b/system/doc/efficiency_guide/myths.xml
index 65113c9372..6fdeb5c4f9 100644
--- a/system/doc/efficiency_guide/myths.xml
+++ b/system/doc/efficiency_guide/myths.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2007</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/system/doc/efficiency_guide/processes.xml b/system/doc/efficiency_guide/processes.xml
index a25ec53370..b75be7d531 100644
--- a/system/doc/efficiency_guide/processes.xml
+++ b/system/doc/efficiency_guide/processes.xml
@@ -105,7 +105,7 @@ loop() ->
<seealso marker="erts:erlang#spawn_opt/4">spawn_opt/4</seealso>.</p>
<p>The gain is twofold: Firstly, although the garbage collector will
- grow the heap, it will it grow it step by step, which will be more
+ grow the heap, it will grow it step by step, which will be more
costly than directly establishing a larger heap when the process
is spawned. Secondly, the garbage collector may also shrink the
heap if it is much larger than the amount of data stored on it;
@@ -172,7 +172,7 @@ days_in_month(M) ->
<p>Shared sub-terms are <em>not</em> preserved when a term is sent
to another process, passed as the initial process arguments in
the <c>spawn</c> call, or stored in an ETS table.
- That is an optimization. Most applications do not send message
+ That is an optimization. Most applications do not send messages
with shared sub-terms.</p>
<p>Here is an example of how a shared sub-term can be created:</p>
@@ -237,8 +237,8 @@ true
<section>
<title>The SMP emulator</title>
- <p>The SMP emulator (introduced in R11B) will take advantage of
- multi-core or multi-CPU computer by running several Erlang schedulers
+ <p>The SMP emulator (introduced in R11B) will take advantage of a
+ multi-core or multi-CPU computer by running several Erlang scheduler
threads (typically, the same as the number of cores). Each scheduler
thread schedules Erlang processes in the same way as the Erlang scheduler
in the non-SMP emulator.</p>
diff --git a/system/doc/efficiency_guide/profiling.xml b/system/doc/efficiency_guide/profiling.xml
index 65d13408bc..8be1c7175d 100644
--- a/system/doc/efficiency_guide/profiling.xml
+++ b/system/doc/efficiency_guide/profiling.xml
@@ -74,7 +74,7 @@
<title>What to look for</title>
<p>When analyzing the result file from the profiling activity
you should look for functions that are called many
- times and have a long "own" execution time (time excluded calls
+ times and have a long "own" execution time (time excluding calls
to other functions). Functions that just are called very
many times can also be interesting, as even small things can add
up to quite a bit if they are repeated often. Then you need to
@@ -87,7 +87,7 @@
<item>Are there redundant tests that can be removed? </item>
<item>Is there some expression calculated giving the same result
each time? </item>
- <item>Is there other ways of doing this that are equivalent and
+ <item>Are there other ways of doing this that are equivalent and
more efficient?</item>
<item>Can I use another internal data representation to make
things more efficient? </item>
@@ -138,7 +138,7 @@
<p><c>cprof</c> is something in between <c>fprof</c> and
<c>cover</c> regarding features. It counts how many times each
function is called when the program is run, on a per module
- basis. <c>cprof</c> has a low performance degradation (versus
+ basis. <c>cprof</c> has a low performance degradation effect (versus
<c>fprof</c> and <c>eprof</c>) and does not need to recompile
any modules to profile (versus <c>cover</c>).</p>
</section>
@@ -231,7 +231,7 @@
consistent from run to run. The disadvantage is that the time
spent in the operating system kernel (such as swapping and I/O)
are not included. Therefore, measuring CPU time is misleading if
- any I/O (file or sockets) are involved.</p>
+ any I/O (file or socket) is involved.</p>
<p>It is probably a good idea to do both wall-clock measurements and
CPU time measurements.</p>
@@ -239,18 +239,18 @@
<p>Some additional advice:</p>
<list type="bulleted">
- <item>The granularity of both types measurement could be quite
+ <item>The granularity of both types of measurement could be quite
high so you should make sure that each individual measurement
lasts for at least several seconds.</item>
<item>To make the test fair, each new test run should run in its own,
- newly created Erlang process. Otherwise, if all tests runs in the
+ newly created Erlang process. Otherwise, if all tests run in the
same process, the later tests would start out with larger heap sizes
- and therefore probably does less garbage collections. You could
+ and therefore probably do less garbage collections. You could
also consider restarting the Erlang emulator between each test.</item>
<item>Do not assume that the fastest implementation of a given algorithm
- on computer architecture X also is the fast on computer architecture Y.</item>
+ on computer architecture X also is the fastest on computer architecture Y.</item>
</list>
</section>
diff --git a/system/doc/efficiency_guide/tablesDatabases.xml b/system/doc/efficiency_guide/tablesDatabases.xml
index 4b53348c4c..2f5103a08b 100644
--- a/system/doc/efficiency_guide/tablesDatabases.xml
+++ b/system/doc/efficiency_guide/tablesDatabases.xml
@@ -280,9 +280,9 @@ lists:filter(fun(X) -> X#person.name == "Bryan" end, TabList),
<p>A simple solution would be to use the <c>name</c> field as
the key instead of the <c>idno</c> field, but that would cause
problems if the names were not unique. A more general solution
- would be create a second table with name as key and idno as
- data, i.e. to index (invert) the table with regards to the
- <c>name</c> field. The second table would of course have to be
+ would be to create a second table with <c>name</c> as key and
+ <c>idno</c> as data, i.e. to index (invert) the table with regards
+ to the <c>name</c> field. The second table would of course have to be
kept consistent with the master table. Mnesia could do this
for you, but a home brew index table could be very efficient
compared to the overhead involved in using Mnesia.</p>
diff --git a/system/doc/embedded/intro.xml b/system/doc/embedded/intro.xml
index 3eafffd6fa..545500c9c9 100644
--- a/system/doc/embedded/intro.xml
+++ b/system/doc/embedded/intro.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1997</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/system/doc/embedded/vme_problems.xml b/system/doc/embedded/vme_problems.xml
index 7f9b929875..03a70bae3b 100644
--- a/system/doc/embedded/vme_problems.xml
+++ b/system/doc/embedded/vme_problems.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1997</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/system/doc/embedded/xntp.xml b/system/doc/embedded/xntp.xml
index 564b63fc7d..270d986cf1 100644
--- a/system/doc/embedded/xntp.xml
+++ b/system/doc/embedded/xntp.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1997</year>
- <year>2007</year>
+ <year>2011</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
diff --git a/system/doc/reference_manual/errors.xml b/system/doc/reference_manual/errors.xml
index 02885a3813..4e207021d3 100644
--- a/system/doc/reference_manual/errors.xml
+++ b/system/doc/reference_manual/errors.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2003</year><year>2009</year>
+ <year>2003</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -48,10 +48,8 @@
The Erlang programming language has built-in features for
handling of run-time errors.</p>
<p>A run-time error can also be emulated by calling
- <c>erlang:error(Reason)</c>, <c>erlang:error(Reason, Args)</c>
- (those appeared in Erlang 5.4/OTP-R10),
- <c>erlang:fault(Reason)</c> or <c>erlang:fault(Reason, Args)</c>
- (old equivalents).</p>
+ <c>erlang:error(Reason)</c> or <c>erlang:error(Reason, Args)</c>
+ (those appeared in Erlang 5.4/OTP-R10).</p>
<p>A run-time error is another name for an exception
of class <c>error</c>.
</p>
@@ -91,7 +89,7 @@
</row>
<row>
<cell align="left" valign="middle"><c>error</c></cell>
- <cell align="left" valign="middle">Run-time error for example <c>1+a</c>, or the process called <c>erlang:error/1,2</c> (appeared in Erlang 5.4/OTP-R10B) or <c>erlang:fault/1,2</c> (old equivalent)</cell>
+ <cell align="left" valign="middle">Run-time error for example <c>1+a</c>, or the process called <c>erlang:error/1,2</c> (appeared in Erlang 5.4/OTP-R10B)</cell>
</row>
<row>
<cell align="left" valign="middle"><c>exit</c></cell>
@@ -108,7 +106,7 @@
and a stack trace (that aids in finding the code location of
the exception).</p>
<p>The stack trace can be retrieved using
- <c>erlang:get_stacktrace/0</c> (new in Erlang 5.4/OTP-R10B
+ <c>erlang:get_stacktrace/0</c> (new in Erlang 5.4/OTP-R10B)
from within a <c>try</c> expression, and is returned for
exceptions of class <c>error</c> from a <c>catch</c> expression.</p>
<p>An exception of class <c>error</c> is also known as a run-time
diff --git a/system/doc/reference_manual/expressions.xml b/system/doc/reference_manual/expressions.xml
index 714ecccaf6..497d7eb464 100644
--- a/system/doc/reference_manual/expressions.xml
+++ b/system/doc/reference_manual/expressions.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2003</year><year>2010</year>
+ <year>2003</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -269,7 +269,7 @@ fun lists:append/2([1,2], [3,4])
set of auto-imported BIFs does not silently change the behavior
of old code.</p>
- <p>However, to avoid that old (pre R14) code changed it's
+ <p>However, to avoid that old (pre R14) code changed its
behavior when compiled with OTP version R14A or later, the
following restriction applies: If you override the name of a BIF
that was auto-imported in OTP versions prior to R14A (ERTS version
diff --git a/system/doc/top/src/erl_html_tools.erl b/system/doc/top/src/erl_html_tools.erl
index 599268804e..bb6a9a9f0a 100644
--- a/system/doc/top/src/erl_html_tools.erl
+++ b/system/doc/top/src/erl_html_tools.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2011. 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
@@ -134,10 +134,10 @@ subst_file(Group, OutFile, Template, Info) ->
file:write(Stream, Text),
file:close(Stream);
Error ->
- error("Can't write to file ~s: ~w", [OutFile,Error])
+ local_error("Can't write to file ~s: ~w", [OutFile,Error])
end;
Error ->
- error("Can't write to file ~s: ~w", [OutFile,Error])
+ local_error("Can't write to file ~s: ~w", [OutFile,Error])
end.
@@ -156,7 +156,7 @@ find_templates([SearchPath | SearchPaths], AllSearchPaths) ->
Result
end;
find_templates([], AllSearchPaths) ->
- error("No templates found in ~p",[AllSearchPaths]).
+ local_error("No templates found in ~p",[AllSearchPaths]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -269,7 +269,7 @@ find_application_infos([{App, Vsn, AppPath, IndexURL} | Paths]) ->
string:substr(G0,N+1)}
end;
false ->
- error("No group given",[])
+ local_error("No group given",[])
end,
Text =
case lists:keysearch("short", 1, Db) of
@@ -427,7 +427,7 @@ subst_applinks_1([{G, Heading}|Gs], Info0, Group) ->
end;
subst_applinks_1([], [], _) -> [];
subst_applinks_1([], Info, _) ->
- error("Info left: ~p\n", [Info]),
+ local_error("Info left: ~p\n", [Info]),
[].
html_applinks([{Name,[{_,_,URL,_}|_]}|AppNames]) ->
@@ -669,7 +669,7 @@ sub_repl([], _Fun, Acc, S, Pos) -> {string:substr(S, Pos+1), Acc}.
% Error and warnings
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-error(Format, Args) ->
+local_error(Format, Args) ->
io:format("ERROR: " ++ Format ++ "\n", Args),
exit(1).
diff --git a/system/doc/tutorial/c_port.xmlsrc b/system/doc/tutorial/c_port.xmlsrc
index b4caa07578..b139fe0678 100644
--- a/system/doc/tutorial/c_port.xmlsrc
+++ b/system/doc/tutorial/c_port.xmlsrc
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2000</year><year>2009</year>
+ <year>2000</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
diff --git a/system/doc/tutorial/nif.xmlsrc b/system/doc/tutorial/nif.xmlsrc
index f9197c69dd..6cb54ff7ff 100644
--- a/system/doc/tutorial/nif.xmlsrc
+++ b/system/doc/tutorial/nif.xmlsrc
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2000</year><year>2009</year>
+ <year>2000</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>